diff --git a/examples/sse-with-state/event/listener.go b/examples/sse-with-state/event/listener.go
index 03b64ad..cd559f0 100644
--- a/examples/sse-with-state/event/listener.go
+++ b/examples/sse-with-state/event/listener.go
@@ -1,15 +1,18 @@
package event
import (
+ "crypto/sha256"
"fmt"
+ "github.com/google/uuid"
"github.com/maddalax/htmgo/framework/h"
"github.com/maddalax/htmgo/framework/service"
"github.com/puzpuzpuz/xsync/v3"
"runtime"
- "sse-with-state/internal"
"sse-with-state/sse"
"sse-with-state/state"
"strings"
+ "sync"
+ "sync/atomic"
"time"
)
@@ -21,207 +24,84 @@ type HandlerData struct {
type Handler func(data HandlerData)
-type handlerWrapper struct {
- handler Handler
- sessionId state.SessionId
-}
-
type ServerSideEvent struct {
Event string
Payload map[string]any
SessionId state.SessionId
}
-type Metrics struct {
- Sessions []MetricPerSession
-}
+type KeyHash = string
-type MetricPerSession struct {
- SessionId state.SessionId
- ClientListeners []MetricListener
- ServerListeners []MetricListener
-}
-
-type MetricListener struct {
- Event string
- HandlerId string
-}
-
-func GetMetrics() *Metrics {
- metrics := &Metrics{
- Sessions: make([]MetricPerSession, 0),
- }
-
- Map.Range(func(key state.SessionId, value *Events) bool {
- clientListeners := make([]MetricListener, 0)
- value.client.Range(func(key string, value handlerWrapper) bool {
- clientListeners = append(clientListeners, MetricListener{
- Event: "",
- HandlerId: key,
- })
- return true
- })
-
- serverListeners := make([]MetricListener, 0)
- value.server.Range(func(event string, value *xsync.MapOf[string, handlerWrapper]) bool {
- value.Range(func(handlerId string, value handlerWrapper) bool {
- serverListeners = append(serverListeners, MetricListener{
- Event: event,
- HandlerId: handlerId,
- })
- return true
- })
- return true
- })
-
- metrics.Sessions = append(metrics.Sessions, MetricPerSession{
- SessionId: key,
- ClientListeners: clientListeners,
- ServerListeners: serverListeners,
- })
- return true
- })
-
- return metrics
-}
-
-type Events struct {
- SessionId state.SessionId
- server *xsync.MapOf[string, *xsync.MapOf[string, handlerWrapper]]
- client *xsync.MapOf[string, handlerWrapper]
-}
-
-func NewEvents(sessionId state.SessionId) *Events {
- return &Events{
- SessionId: sessionId,
- server: xsync.NewMapOf[string, *xsync.MapOf[string, handlerWrapper]](),
- client: xsync.NewMapOf[string, handlerWrapper](),
- }
-}
-
-func (e *Events) AddServerSideHandler(event string, id string, handler Handler) {
- wrapper := handlerWrapper{
- handler: handler,
- sessionId: e.SessionId,
- }
-
- if _, ok := e.server.Load(event); !ok {
- e.server.Store(event, xsync.NewMapOf[string, handlerWrapper]())
- }
-
- handlers, _ := e.server.Load(event)
- handlers.Store(id, wrapper)
- e.server.Store(event, handlers)
-}
-
-func (e *Events) AddClientSideHandler(event string, handler Handler) *h.AttributeMapOrdered {
- handlerId := fmt.Sprintf("event_%s_%s", event, internal.RandSeq(30))
- fmt.Printf("adding client side handler %s\n", handlerId)
- e.client.Store(handlerId, handlerWrapper{
- handler: handler,
- sessionId: e.SessionId,
- })
- return h.AttributePairs(
- "data-handler-id", handlerId,
- "data-handler-event", event,
- )
-}
-
-func (e *Events) OnServerSideEvent(manager *sse.SocketManager, eventName string) {
- handlers, ok := e.server.Load(eventName)
- if ok {
- socket := manager.Get(string(e.SessionId))
- if socket == nil {
- fmt.Printf("socket not found, must be disconnected: %s", e.SessionId)
- e.OnSocketDisconnected()
- Map.Delete(e.SessionId)
- return
- }
- handlers.Range(func(key string, value handlerWrapper) bool {
- go value.handler(HandlerData{
- SessionId: e.SessionId,
- Socket: socket,
- Manager: manager,
- })
- return true
- })
- }
-}
-
-func (e *Events) OnClientSideEvent(manager *sse.SocketManager, handlerId string) {
- handlers, ok := e.client.Load(handlerId)
- if ok {
- go handlers.handler(HandlerData{
- SessionId: e.SessionId,
- Socket: manager.Get(string(e.SessionId)),
- Manager: manager,
- })
- }
-}
-
-func (e *Events) OnDomElementRemoved(id string) {
- e.server.Range(func(key string, value *xsync.MapOf[string, handlerWrapper]) bool {
- value.Delete(id)
- return true
- })
- e.client.Delete(id)
-}
-
-func (e *Events) OnSocketDisconnected() {
- e.client.Clear()
- e.server.Clear()
-}
-
-var Map = xsync.NewMapOf[state.SessionId, *Events]()
+var handlers = xsync.NewMapOf[KeyHash, Handler]()
+var sessionIdToHashes = xsync.NewMapOf[state.SessionId, map[KeyHash]bool]()
+var serverEventNamesToHash = xsync.NewMapOf[string, map[KeyHash]bool]()
var socketMessageListener = make(chan sse.SocketEvent, 100)
var serverSideMessageListener = make(chan ServerSideEvent, 100)
+var lock = sync.Mutex{}
+var callingHandler = atomic.Bool{}
func getCallerHash() string {
- now := time.Now()
pc := make([]uintptr, 1000) // Adjust the size if you need a deeper stack trace
n := runtime.Callers(2, pc) // Skip 2: runtime.Callers() and printCallers()
frames := runtime.CallersFrames(pc[:n])
calls := make([]string, 0)
+ hitBegin := false
for {
frame, more := frames.Next()
calls = append(calls, fmt.Sprintf("%s:%d", frame.Function, frame.Line))
+ if strings.Contains(frame.Function, "runtime.goexit") {
+ hitBegin = true
+ }
if !more {
break
}
}
- took := time.Since(now)
- fmt.Printf("took: %dms\n", took.Milliseconds())
- return strings.Join(calls, ",")
+ if !hitBegin {
+ fmt.Printf("hitBegin: %v\n", hitBegin)
+ panic("unable to add handler, stack trace too deep, maximum 1000, unable to find runtime.goexit")
+ }
+
+ joined := strings.Join(calls, ",")
+ hash := sha256.Sum256([]byte(joined))
+ return fmt.Sprintf("%x", hash)
}
-func AddServerSideHandler(ctx *h.RequestContext, event string, handler Handler) {
- hash := getCallerHash()
+func AddServerSideHandler(ctx *h.RequestContext, event string, handler Handler) *h.AttributeMapOrdered {
+ // If we are already in a handler, we don't want to add another handler
+ // this can happen if the handler renders another element that has a handler
+ if callingHandler.Load() {
+ return h.NewAttributeMap()
+ }
+ sessionId := state.GetSessionId(ctx)
+ hash := uuid.NewString()
fmt.Printf("adding server side handler %s\n", hash)
- sessionId := state.GetSessionId(ctx)
- events, ok := Map.Load(sessionId)
-
- if !ok {
- events = NewEvents(sessionId)
- Map.Store(sessionId, events)
- }
-
- events.AddServerSideHandler(event, "test", handler)
+ handlers.LoadOrStore(hash, handler)
+ m, _ := serverEventNamesToHash.LoadOrCompute(event, func() map[KeyHash]bool {
+ return make(map[KeyHash]bool)
+ })
+ m[hash] = true
+ storeHashForSession(sessionId, hash)
+ return h.AttributePairs("data-handler-id", hash, "data-handler-event", event)
}
-func AddHandler(ctx *h.RequestContext, event string, handler Handler) *h.AttributeMapOrdered {
+func AddClientSideHandler(ctx *h.RequestContext, event string, handler Handler) *h.AttributeMapOrdered {
+ hash := uuid.NewString()
+ fmt.Printf("adding client side handler %s\n", hash)
+ handlers.LoadOrStore(hash, handler)
sessionId := state.GetSessionId(ctx)
- events, ok := Map.Load(sessionId)
+ storeHashForSession(sessionId, hash)
+ return h.AttributePairs("data-handler-id", hash, "data-handler-event", event)
+}
- if !ok {
- events = NewEvents(sessionId)
- Map.Store(sessionId, events)
- }
-
- return events.AddClientSideHandler(event, handler)
+func storeHashForSession(sessionId state.SessionId, hash KeyHash) {
+ m, _ := sessionIdToHashes.LoadOrCompute(sessionId, func() map[KeyHash]bool {
+ return make(map[KeyHash]bool)
+ })
+ m[hash] = true
}
func PushServerSideEvent(sessionId state.SessionId, event string) {
@@ -240,48 +120,71 @@ func StartListener(locator *service.Locator) {
manager := service.Get[sse.SocketManager](locator)
manager.Listen(socketMessageListener)
+ go func() {
+ for {
+ fmt.Printf("total handlers: %d\n", handlers.Size())
+ fmt.Printf("total serverEventNamesToHash: %d\n", serverEventNamesToHash.Size())
+ fmt.Printf("total sessionIdToHashes: %d\n", sessionIdToHashes.Size())
+ time.Sleep(5 * time.Second)
+ }
+ }()
+
go func() {
for {
select {
case sevent := <-serverSideMessageListener:
- Map.Range(func(key state.SessionId, value *Events) bool {
- value.OnServerSideEvent(
- manager,
- sevent.Event,
- )
- return true
- })
+ fmt.Printf("received server side event: %s\n", sevent.Event)
+ hashes, ok := serverEventNamesToHash.Load(sevent.Event)
+ if ok {
+ for hash := range hashes {
+ cb, ok := handlers.Load(hash)
+ if ok {
+ lock.Lock()
+ callingHandler.Store(true)
+ cb(HandlerData{
+ SessionId: sevent.SessionId,
+ Socket: manager.Get(string(sevent.SessionId)),
+ Manager: manager,
+ })
+ callingHandler.Store(false)
+ lock.Unlock()
+ }
+ }
+ }
case event := <-socketMessageListener:
+
if event.Type == sse.DisconnectedEvent {
sessionId := state.SessionId(event.SessionId)
- handler, ok := Map.Load(sessionId)
+ fmt.Printf("disconnected sessionId: %s\n", sessionId)
+ hashes, ok := sessionIdToHashes.Load(sessionId)
if ok {
- handler.OnSocketDisconnected()
- Map.Delete(sessionId)
+ for hash := range hashes {
+ handlers.Delete(hash)
+ }
+ sessionIdToHashes.Delete(sessionId)
}
- continue
}
if event.Type == sse.MessageEvent {
handlerId := event.Payload["id"].(string)
eventName := event.Payload["event"].(string)
sessionId := state.SessionId(event.SessionId)
-
fmt.Printf("received eventName: %s, handlerId: %s, sessionId: %s\n", eventName, handlerId, sessionId)
- handler, ok := Map.Load(sessionId)
-
- if !ok {
- return
- }
-
if eventName == "dom-element-removed" {
- handler.OnDomElementRemoved(handlerId)
+ handlers.Delete(handlerId)
continue
}
- handler.OnClientSideEvent(manager, handlerId)
+ cb, ok := handlers.Load(handlerId)
+ if ok {
+ cb(HandlerData{
+ SessionId: sessionId,
+ Socket: manager.Get(event.SessionId),
+ Manager: manager,
+ })
+ }
}
}
}
diff --git a/examples/sse-with-state/main.go b/examples/sse-with-state/main.go
index 3213f4f..408b40a 100644
--- a/examples/sse-with-state/main.go
+++ b/examples/sse-with-state/main.go
@@ -1,7 +1,6 @@
package main
import (
- "encoding/json"
"github.com/maddalax/htmgo/framework/h"
"github.com/maddalax/htmgo/framework/service"
"io/fs"
@@ -34,13 +33,6 @@ func main() {
app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub)))
app.Router.Handle("/ws/test", sse.HandleWs())
- app.Router.Get("/metrics", func(writer http.ResponseWriter, request *http.Request) {
- writer.Header().Set("Content-Type", "application/json")
- writer.WriteHeader(http.StatusOK)
- metrics := event.GetMetrics()
- serialized, _ := json.Marshal(metrics)
- _, _ = writer.Write(serialized)
- })
__htmgo.Register(app.Router)
},
})
diff --git a/examples/sse-with-state/partials/click.go b/examples/sse-with-state/partials/click.go
index bdc5a2b..9dd2bc7 100644
--- a/examples/sse-with-state/partials/click.go
+++ b/examples/sse-with-state/partials/click.go
@@ -6,7 +6,7 @@ import (
)
func OnClick(ctx *h.RequestContext, handler event.Handler) *h.AttributeMapOrdered {
- return event.AddHandler(ctx, "click", handler)
+ return event.AddClientSideHandler(ctx, "click", handler)
}
func OnServerSideEvent(ctx *h.RequestContext, eventName string, handler event.Handler) h.Ren {
@@ -15,5 +15,5 @@ func OnServerSideEvent(ctx *h.RequestContext, eventName string, handler event.Ha
}
func OnMouseOver(ctx *h.RequestContext, handler event.Handler) *h.AttributeMapOrdered {
- return event.AddHandler(ctx, "mouseover", handler)
+ return event.AddClientSideHandler(ctx, "mouseover", handler)
}
diff --git a/examples/sse-with-state/partials/index.go b/examples/sse-with-state/partials/index.go
index 472e1f0..9e6c33f 100644
--- a/examples/sse-with-state/partials/index.go
+++ b/examples/sse-with-state/partials/index.go
@@ -43,6 +43,7 @@ func CounterForm(ctx *h.RequestContext, props CounterProps) *h.Element {
props.Id = h.GenId(6)
}
counter := UseCounter(state.GetSessionId(ctx), props.Id)
+
return h.Div(
h.Attribute("hx-swap", "none"),
h.Class("flex flex-col gap-3 items-center"),
diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js
index 2d65fe8..2f77254 100644
--- a/framework/assets/dist/htmgo.js
+++ b/framework/assets/dist/htmgo.js
@@ -1,3 +1,3 @@
-var le=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('
'+t+"");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(L){return issueAjaxRequest(e,t,n,r,o,!!L)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},k=getClosestAttributeValue(n,"hx-prompt");if(k){var I=prompt(k);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),P=v.errors,V=v.formData;o.values&&overrideFormData(V,formDataFromObject(o.values));let j=formDataFromObject(getExpressionVars(n)),z=overrideFormData(V,j),q=filterValues(z,n);htmx.config.getCacheBusterParam&&e==="get"&&q.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let J=getValuesForElement(n,"hx-request"),$=getInternalData(n).boosted,B=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:$,useUrlParams:B,formData:q,parameters:formDataProxy(q),unfilteredFormData:z,unfilteredParameters:formDataProxy(z),headers:R,target:c,verb:e,errors:P,withCredentials:o.credentials||J.credentials||htmx.config.withCredentials,timeout:o.timeout||J.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,q=formDataFromObject(w.parameters),P=w.errors,B=w.useUrlParams,P&&P.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Q=t.split("#"),se=Q[0],Y=Q[1],O=t;if(B&&(O=se,!q.keys().next().done&&(O.indexOf("?")<0?O+="?":O+="&",O+=urlEncode(q),Y&&(O+="#"+Y))),!verifyPath(n,O,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),O,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!J.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:$,select:d,pathInfo:{requestPath:t,finalRequestPath:O,responsePath:null,anchor:Y}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(U,_),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let L=g.shift();bodyContains(L)&&(E=L);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(U,_),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(U,_),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(U,_),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var U=addRequestIndicatorClasses(n),_=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(L){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:L.lengthComputable,loaded:L.loaded,total:L.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ae=B?null:encodeParamsForBody(m,n,q);return m.send(ae),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend","");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=le;function ue(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=fe(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=he(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&K(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return K(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,W,ge="hx-target-";function Z(e,t){return e.substring(0,t.length)===t}function me(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Z(n,"4")||Z(n,"5"))&&r.push("error");for(let o=0;o{W=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,G(t),!0;if(!t.detail.requestConfig)return !0;let n=me(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(G(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var X="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;X===""&&(X=r),X!==r&&(X=r,Ee());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function Ee(){window.location.reload();}var pe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&N(t.target),e==="htmx:load"&&t.target&&ee(t.target);}});function ee(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(ee);}function N(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(pe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var F=null,te=new Set;f.defineExtension("sse",{init:function(e){F=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&N(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!te.has(i)&&(xe(o,i),te.add(i));}}}});function xe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=F.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=F.makeFragment(i),l=Array.from(s.children);for(let a of l)F.oobSwap(F.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}var M=null,ne=new Set,D=null;f.defineExtension("ws",{init:function(e){M=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&N(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[ws-connect]");for(let o of Array.from(r)){let i=o.getAttribute("ws-connect");i&&!ne.has(i)&&(re(o,i),ne.add(i));}}}});function ye(e,t=100,n=1e4){let r=Math.random();return Math.min(t*Math.pow(2,e)*r,n)}function re(e,t,n=0){if(t)return !t.startsWith("ws://")&&!t.startsWith("wss://")&&(t=(window.location.protocol==="https:"?"wss://":"ws://")+window.location.host+t),console.info("connecting to ws",t),D=new WebSocket(t),D.addEventListener("close",function(r){f.trigger(e,"htmx:wsClose",{event:r});let o=ye(n);console.info(`ws closed, reconnecting in ${o}ms`),setTimeout(()=>{re(e,t,n+1);},o);}),D.addEventListener("open",function(r){f.trigger(e,"htmx:wsOpen",{event:r});}),D.addEventListener("error",function(r){f.trigger(e,"htmx:wsError",{event:r});}),D.addEventListener("message",function(r){console.debug("ws message:",r.data);let o=M.makeSettleInfo(e);f.trigger(e,"htmx:wsBeforeMessage",{event:r});let i=r.data,s=M.makeFragment(i),l=Array.from(s.children);for(let a of l)M.oobSwap(M.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:wsAfterMessage",{event:r});}),D}window.onload=be;function oe(e){D!=null&&D.readyState===WebSocket.OPEN&&D.send(JSON.stringify(e));}function ie(e,t){t(e);for(let n of Array.from(e.childNodes))ie(n,t);}function be(){console.log("add ws event handlers"),new MutationObserver(n).observe(document.body,{childList:!0,subtree:!0});let t=new Set;function n(r){console.log(r);for(let i of r)for(let s of Array.from(i.removedNodes))ie(s,l=>{if(l instanceof HTMLElement){console.log("removing",l.innerHTML);let a=l.getAttribute("data-handler-id");a&&(t.delete(a),oe({id:a,event:"dom-element-removed"}));}});let o=new Set;document.querySelectorAll("[data-handler-id]").forEach(i=>{let s=i.getAttribute("data-handler-id"),l=i.getAttribute("data-handler-event");s==null||l==null||(o.add(s),!t.has(s)&&(t.add(s),i.addEventListener(l,a=>{oe({id:s,event:l});})));});for(let i of t)o.has(i)||t.delete(i);console.log("size",t.size);}n([]);}window.htmx=f;function ve(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}ve((e,t)=>{we(t);});function we(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});}
+var le=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML(''+t+"");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(L){return issueAjaxRequest(e,t,n,r,o,!!L)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},k=getClosestAttributeValue(n,"hx-prompt");if(k){var I=prompt(k);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),P=v.errors,V=v.formData;o.values&&overrideFormData(V,formDataFromObject(o.values));let j=formDataFromObject(getExpressionVars(n)),z=overrideFormData(V,j),q=filterValues(z,n);htmx.config.getCacheBusterParam&&e==="get"&&q.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let J=getValuesForElement(n,"hx-request"),$=getInternalData(n).boosted,B=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:$,useUrlParams:B,formData:q,parameters:formDataProxy(q),unfilteredFormData:z,unfilteredParameters:formDataProxy(z),headers:R,target:c,verb:e,errors:P,withCredentials:o.credentials||J.credentials||htmx.config.withCredentials,timeout:o.timeout||J.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,q=formDataFromObject(w.parameters),P=w.errors,B=w.useUrlParams,P&&P.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Q=t.split("#"),se=Q[0],Y=Q[1],O=t;if(B&&(O=se,!q.keys().next().done&&(O.indexOf("?")<0?O+="?":O+="&",O+=urlEncode(q),Y&&(O+="#"+Y))),!verifyPath(n,O,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),O,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!J.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:$,select:d,pathInfo:{requestPath:t,finalRequestPath:O,responsePath:null,anchor:Y}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(U,_),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let L=g.shift();bodyContains(L)&&(E=L);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(U,_),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(U,_),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(U,_),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var U=addRequestIndicatorClasses(n),_=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(L){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:L.lengthComputable,loaded:L.loaded,total:L.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ae=B?null:encodeParamsForBody(m,n,q);return m.send(ae),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend","");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=le;function ue(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=fe(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=he(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&K(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return K(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,W,ge="hx-target-";function Z(e,t){return e.substring(0,t.length)===t}function me(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Z(n,"4")||Z(n,"5"))&&r.push("error");for(let o=0;o{W=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,G(t),!0;if(!t.detail.requestConfig)return !0;let n=me(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(G(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var X="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;X===""&&(X=r),X!==r&&(X=r,Ee());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function Ee(){window.location.reload();}var pe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&N(t.target),e==="htmx:load"&&t.target&&ee(t.target);}});function ee(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(ee);}function N(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(pe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var F=null,te=new Set;f.defineExtension("sse",{init:function(e){F=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&N(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!te.has(i)&&(xe(o,i),te.add(i));}}}});function xe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=F.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=F.makeFragment(i),l=Array.from(s.children);for(let a of l)F.oobSwap(F.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}var M=null,ne=new Set,D=null;f.defineExtension("ws",{init:function(e){M=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&N(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[ws-connect]");for(let o of Array.from(r)){let i=o.getAttribute("ws-connect");i&&!ne.has(i)&&(re(o,i),ne.add(i));}}}});function ye(e,t=100,n=1e4){let r=Math.random();return Math.min(t*Math.pow(2,e)*r,n)}function re(e,t,n=0){if(t)return !t.startsWith("ws://")&&!t.startsWith("wss://")&&(t=(window.location.protocol==="https:"?"wss://":"ws://")+window.location.host+t),console.info("connecting to ws",t),D=new WebSocket(t),D.addEventListener("close",function(r){f.trigger(e,"htmx:wsClose",{event:r});let o=ye(n);console.info(`ws closed, reconnecting in ${o}ms`),setTimeout(()=>{re(e,t,n+1);},o);}),D.addEventListener("open",function(r){f.trigger(e,"htmx:wsOpen",{event:r});}),D.addEventListener("error",function(r){f.trigger(e,"htmx:wsError",{event:r});}),D.addEventListener("message",function(r){console.debug("ws message:",r.data);let o=M.makeSettleInfo(e);f.trigger(e,"htmx:wsBeforeMessage",{event:r});let i=r.data,s=M.makeFragment(i),l=Array.from(s.children);for(let a of l)M.oobSwap(M.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:wsAfterMessage",{event:r});}),D}window.onload=be;function oe(e){D!=null&&D.readyState===WebSocket.OPEN&&D.send(JSON.stringify(e));}function ie(e,t){t(e);for(let n of Array.from(e.childNodes))ie(n,t);}function be(){console.log("add ws event handlers"),new MutationObserver(n).observe(document.body,{childList:!0,subtree:!0});let t=new Set;function n(r){console.log(r);for(let i of r)for(let s of Array.from(i.removedNodes))ie(s,l=>{if(l instanceof HTMLElement){console.log("removing",l.innerHTML);let a=l.getAttribute("data-handler-id");a&&(t.delete(a),oe({id:a,event:"dom-element-removed"}));}});let o=new Set;document.querySelectorAll("[data-handler-id]").forEach(i=>{let s=i.getAttribute("data-handler-id"),l=i.getAttribute("data-handler-event");if(!(s==null||l==null)){if(o.add(s),t.has(s)){console.debug("already added, skipping",s);return}t.add(s),console.debug("adding event listener for ws send",s,l),i.addEventListener(l,a=>{oe({id:s,event:l});});}});for(let i of t)o.has(i)||t.delete(i);}n([]);}window.htmx=f;function ve(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}ve((e,t)=>{we(t);});function we(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});}
//# sourceMappingURL=htmgo.js.map
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bXhleHRlbnNpb25zL3dzLWV2ZW50LWhhbmRsZXIudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid3MiLCJjb25uZWN0V3MiLCJleHBvbmVudGlhbEJhY2tvZmYiLCJhdHRlbXB0IiwiYmFzZURlbGF5IiwibWF4RGVsYXkiLCJqaXR0ZXIiLCJhZGRXc0V2ZW50SGFuZGxlcnMiLCJzZW5kV3MiLCJ3YWxrIiwiY2IiLCJyZWdpc3RlciIsImFkZGVkIiwibXV0YXRpb25zIiwibXV0YXRpb24iLCJyZW1vdmVkTm9kZSIsImhhbmRsZXJJZCIsImlkcyIsIndhdGNoVXJsIiwibGFzdFVybCIsIl8iLCJuZXdVcmwiLCJvblVybENoYW5nZSIsImhhc01hdGNoIiwiZGVmYXVsdEtleSJdLCJtYXBwaW5ncyI6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QUN6RCxJQUFJd1csQ0FBQUEsQ0FBVyxDQUNmLENBQUEsQ0FBQSxJQUFBLElBQVN4WSxDQUFRZ0MsSUFBQUEsQ0FBQUEsQ0FBRyxtQkFDbEIsQ0FBQSxHQUFJaEMsRUFBSyxVQUFXLENBQUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsQ0FBUWQsQ0FBQUEsQ0FBQUEsQ0FBSyxPQUFRLENBQUEsc0JBQUEsQ0FBd0IsRUFBRSxDQUVuRCxDQUFBLEdBRFk2QyxFQUFJLFlBQWEsQ0FBQSxHQUFBLENBQUkvQixDQUFLLENBQzNCLENBQUEsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLGFBQWFoQyxDQUFJLENBQUEsRUFBSyxHQUFJLENBQ3pDLFNBQUEsQ0FBVyxZQUNYLFNBQVcsQ0FBQSxDQUFBLENBQ1gsWUFBYSxDQUNmLENBQUMsRUFDRHdZLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQUFBLENBQVUsQ0FDYixJQUFJQyxDQUFhelcsQ0FBQUEsQ0FBQUEsQ0FBRyxhQUFhLHFCQUFxQixDQUFBLENBQ2xEeVcsR0FDRjdELENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnlXLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ldmVudC5kZXRhaWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gQHRzLWlnbm9yZVxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmxvYWRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgaW52b2tlT25Mb2FkKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbi8qKlxuICogQnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgb25sb2FkIGZvciBhbGwgZWxlbWVudHMsIHNvIHdlIG5lZWQgdG8gbWFudWFsbHkgdHJpZ2dlciBpdFxuICogdGhpcyBpcyB1c2VmdWwgZm9yIGxvY2FsaXR5IG9mIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGludm9rZU9uTG9hZChlbGVtZW50IDogRWxlbWVudCkge1xuICAgIGlmKGVsZW1lbnQgPT0gbnVsbCB8fCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGlnbm9yZWQgPSBbJ1NDUklQVCcsICdMSU5LJywgJ1NUWUxFJywgJ01FVEEnLCAnQkFTRScsICdUSVRMRScsICdIRUFEJywgJ0hUTUwnLCAnQk9EWSddO1xuICAgIGlmKCFpZ25vcmVkLmluY2x1ZGVzKGVsZW1lbnQudGFnTmFtZSkpIHtcbiAgICAgICAgaWYoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJvbmxvYWRcIikpIHtcbiAgICAgICAgICAgIGVsZW1lbnQub25sb2FkIShuZXcgRXZlbnQoXCJsb2FkXCIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjaGVjayBpdHMgY2hpbGRyZW5cbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbmxvYWRdJykuZm9yRWFjaChpbnZva2VPbkxvYWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuaW1wb3J0IHthZGRXc0V2ZW50SGFuZGxlcnN9IGZyb20gXCIuL3dzLWV2ZW50LWhhbmRsZXJcIjtcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcbmV4cG9ydCBsZXQgd3M6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIndzXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbd3MtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcIndzLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RXcyhlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsQmFja29mZihhdHRlbXB0OiBudW1iZXIsIGJhc2VEZWxheSA9IDEwMCwgbWF4RGVsYXkgPSAxMDAwMCkge1xuICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IGJhc2VEZWxheSAqICgyIF4gYXR0ZW1wdCkgd2l0aCBqaXR0ZXJcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpOyAvLyBBZGRpbmcgcmFuZG9tbmVzcyB0byBwcmV2ZW50IGNvbGxpc2lvbnNcbiAgICByZXR1cm4gTWF0aC5taW4oYmFzZURlbGF5ICogTWF0aC5wb3coMiwgYXR0ZW1wdCkgKiBqaXR0ZXIsIG1heERlbGF5KTtcbn1cblxuZnVuY3Rpb24gY29ubmVjdFdzKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcsIGF0dGVtcHQ6IG51bWJlciA9IDApIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZighdXJsLnN0YXJ0c1dpdGgoJ3dzOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCd3c3M6Ly8nKSkge1xuICAgICAgICBjb25zdCBpc1NlY3VyZSA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgICAgICAgdXJsID0gKGlzU2VjdXJlID8gJ3dzczovLycgOiAnd3M6Ly8nKSArIHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgdXJsXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnY29ubmVjdGluZyB0byB3cycsIHVybClcblxuICAgIHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuXG4gICAgd3MuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c0Nsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgZGVsYXkgPSBleHBvbmVudGlhbEJhY2tvZmYoYXR0ZW1wdCk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgd3MgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tc2ApXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29ubmVjdFdzKGVsZSwgdXJsLCBhdHRlbXB0ICsgMSlcbiAgICAgICAgfSwgZGVsYXkpXG4gICAgfSlcblxuICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c09wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCd3cyBtZXNzYWdlOicsIGV2ZW50LmRhdGEpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c0FmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIHJldHVybiB3c1xufVxuIiwiaW1wb3J0IHt3c30gZnJvbSBcIi4vd3NcIjtcblxud2luZG93Lm9ubG9hZCA9IGFkZFdzRXZlbnRIYW5kbGVycztcblxuZnVuY3Rpb24gc2VuZFdzKG1lc3NhZ2U6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBpZih3cyAhPSBudWxsICYmIHdzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd2Fsayhub2RlOiBOb2RlLCBjYjogKG5vZGU6IE5vZGUpID0+IHZvaWQpIHtcbiAgICBjYihub2RlKTtcbiAgICBmb3IgKGxldCBjaGlsZCBvZiBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2RlcykpIHtcbiAgICAgICAgd2FsayhjaGlsZCwgY2IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdzRXZlbnRIYW5kbGVycygpIHtcbiAgICBjb25zb2xlLmxvZygnYWRkIHdzIGV2ZW50IGhhbmRsZXJzJylcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHJlZ2lzdGVyKVxuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pXG5cbiAgICBsZXQgYWRkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKG11dGF0aW9uczogTXV0YXRpb25SZWNvcmRbXSkge1xuICAgICAgICBjb25zb2xlLmxvZyhtdXRhdGlvbnMpXG5cbiAgICAgICAgZm9yIChsZXQgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZW1vdmVkTm9kZSBvZiBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2RlcykpIHtcbiAgICAgICAgICAgICAgICB3YWxrKHJlbW92ZWROb2RlLCAobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVtb3ZpbmcnLCBub2RlLmlubmVySFRNTClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJJZCA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1oYW5kbGVyLWlkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihoYW5kbGVySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZC5kZWxldGUoaGFuZGxlcklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRXcyh7aWQ6IGhhbmRsZXJJZCwgZXZlbnQ6ICdkb20tZWxlbWVudC1yZW1vdmVkJ30pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWhhbmRsZXItaWRdXCIpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1oYW5kbGVyLWlkXCIpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtaGFuZGxlci1ldmVudFwiKTtcblxuICAgICAgICAgICAgaWYoaWQgPT0gbnVsbCB8fCBldmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZHMuYWRkKGlkKTtcbiAgICAgICAgICAgIGlmIChhZGRlZC5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkZWQuYWRkKGlkKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBzZW5kV3Moe2lkLCBldmVudH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgZm9yIChsZXQgaWQgb2YgYWRkZWQpIHtcbiAgICAgICAgICAgIGlmICghaWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBhZGRlZC5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdzaXplJywgYWRkZWQuc2l6ZSlcbiAgICB9XG5cbiAgICByZWdpc3RlcihbXSlcbn1cblxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvd3NcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy93cy1ldmVudC1oYW5kbGVyXCJcblxuLy8gQHRzLWlnbm9yZVxud2luZG93Lmh0bXggPSBodG14O1xuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDEpO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bXhleHRlbnNpb25zL3dzLWV2ZW50LWhhbmRsZXIudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid3MiLCJjb25uZWN0V3MiLCJleHBvbmVudGlhbEJhY2tvZmYiLCJhdHRlbXB0IiwiYmFzZURlbGF5IiwibWF4RGVsYXkiLCJqaXR0ZXIiLCJhZGRXc0V2ZW50SGFuZGxlcnMiLCJzZW5kV3MiLCJ3YWxrIiwiY2IiLCJyZWdpc3RlciIsImFkZGVkIiwibXV0YXRpb25zIiwibXV0YXRpb24iLCJyZW1vdmVkTm9kZSIsImhhbmRsZXJJZCIsImlkcyIsIndhdGNoVXJsIiwibGFzdFVybCIsIl8iLCJuZXdVcmwiLCJvblVybENoYW5nZSIsImhhc01hdGNoIiwiZGVmYXVsdEtleSJdLCJtYXBwaW5ncyI6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QUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6bG9hZFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICBpbnZva2VPbkxvYWQoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBvbmxvYWQgZm9yIGFsbCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGl0XG4gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgbG9jYWxpdHkgb2YgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gaW52b2tlT25Mb2FkKGVsZW1lbnQgOiBFbGVtZW50KSB7XG4gICAgaWYoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWdub3JlZCA9IFsnU0NSSVBUJywgJ0xJTksnLCAnU1RZTEUnLCAnTUVUQScsICdCQVNFJywgJ1RJVExFJywgJ0hFQUQnLCAnSFRNTCcsICdCT0RZJ107XG4gICAgaWYoIWlnbm9yZWQuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICBpZihlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm9ubG9hZFwiKSkge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQhKG5ldyBFdmVudChcImxvYWRcIikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGl0cyBjaGlsZHJlblxuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ubG9hZF0nKS5mb3JFYWNoKGludm9rZU9uTG9hZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5pbXBvcnQge2FkZFdzRXZlbnRIYW5kbGVyc30gZnJvbSBcIi4vd3MtZXZlbnQtaGFuZGxlclwiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuZXhwb3J0IGxldCB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwid3NcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3cy1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwid3MtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdzKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gZXhwb25lbnRpYWxCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgYmFzZURlbGF5ID0gMTAwLCBtYXhEZWxheSA9IDEwMDAwKSB7XG4gICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogYmFzZURlbGF5ICogKDIgXiBhdHRlbXB0KSB3aXRoIGppdHRlclxuICAgIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCk7IC8vIEFkZGluZyByYW5kb21uZXNzIHRvIHByZXZlbnQgY29sbGlzaW9uc1xuICAgIHJldHVybiBNYXRoLm1pbihiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSAqIGppdHRlciwgbWF4RGVsYXkpO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0V3MoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZywgYXR0ZW1wdDogbnVtYmVyID0gMCkge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmKCF1cmwuc3RhcnRzV2l0aCgnd3M6Ly8nKSAmJiAhdXJsLnN0YXJ0c1dpdGgoJ3dzczovLycpKSB7XG4gICAgICAgIGNvbnN0IGlzU2VjdXJlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICB1cmwgPSAoaXNTZWN1cmUgPyAnd3NzOi8vJyA6ICd3czovLycpICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyB1cmxcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdjb25uZWN0aW5nIHRvIHdzJywgdXJsKVxuXG4gICAgd3MgPSBuZXcgV2ViU29ja2V0KHVybCk7XG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCBkZWxheSA9IGV4cG9uZW50aWFsQmFja29mZihhdHRlbXB0KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGB3cyBjbG9zZWQsIHJlY29ubmVjdGluZyBpbiAke2RlbGF5fW1zYClcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25uZWN0V3MoZWxlLCB1cmwsIGF0dGVtcHQgKyAxKVxuICAgICAgICB9LCBkZWxheSlcbiAgICB9KVxuXG4gICAgd3MuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6d3NFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ3dzIG1lc3NhZ2U6JywgZXZlbnQuZGF0YSlcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhlbGUpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6d3NCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHdzXG59XG4iLCJpbXBvcnQge3dzfSBmcm9tIFwiLi93c1wiO1xuXG53aW5kb3cub25sb2FkID0gYWRkV3NFdmVudEhhbmRsZXJzO1xuXG5mdW5jdGlvbiBzZW5kV3MobWVzc2FnZTogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGlmKHdzICE9IG51bGwgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3YWxrKG5vZGU6IE5vZGUsIGNiOiAobm9kZTogTm9kZSkgPT4gdm9pZCkge1xuICAgIGNiKG5vZGUpO1xuICAgIGZvciAobGV0IGNoaWxkIG9mIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKSkge1xuICAgICAgICB3YWxrKGNoaWxkLCBjYik7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkV3NFdmVudEhhbmRsZXJzKCkge1xuICAgIGNvbnNvbGUubG9nKCdhZGQgd3MgZXZlbnQgaGFuZGxlcnMnKVxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIocmVnaXN0ZXIpXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSlcblxuICAgIGxldCBhZGRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXIobXV0YXRpb25zOiBNdXRhdGlvblJlY29yZFtdKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG11dGF0aW9ucylcblxuICAgICAgICBmb3IgKGxldCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHJlbW92ZWROb2RlIG9mIEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKSkge1xuICAgICAgICAgICAgICAgIHdhbGsocmVtb3ZlZE5vZGUsIChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZW1vdmluZycsIG5vZGUuaW5uZXJIVE1MKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcklkID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhhbmRsZXItaWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhbmRsZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLmRlbGV0ZShoYW5kbGVySWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFdzKHtpZDogaGFuZGxlcklkLCBldmVudDogJ2RvbS1lbGVtZW50LXJlbW92ZWQnfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtaGFuZGxlci1pZF1cIikuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhhbmRsZXItaWRcIik7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1oYW5kbGVyLWV2ZW50XCIpO1xuXG4gICAgICAgICAgICBpZihpZCA9PSBudWxsIHx8IGV2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlkcy5hZGQoaWQpO1xuICAgICAgICAgICAgaWYgKGFkZGVkLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdhbHJlYWR5IGFkZGVkLCBza2lwcGluZycsIGlkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZGVkLmFkZChpZCk7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdhZGRpbmcgZXZlbnQgbGlzdGVuZXIgZm9yIHdzIHNlbmQnLCBpZCwgZXZlbnQpXG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgc2VuZFdzKHtpZCwgZXZlbnR9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIGZvciAobGV0IGlkIG9mIGFkZGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgYWRkZWQuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKFtdKVxufVxuXG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy93c1wiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3dzLWV2ZW50LWhhbmRsZXJcIlxuXG4vLyBAdHMtaWdub3JlXG53aW5kb3cuaHRteCA9IGh0bXg7XG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMSk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/framework/assets/js/htmxextensions/ws-event-handler.ts b/framework/assets/js/htmxextensions/ws-event-handler.ts
index 0f8eeb6..3602627 100644
--- a/framework/assets/js/htmxextensions/ws-event-handler.ts
+++ b/framework/assets/js/htmxextensions/ws-event-handler.ts
@@ -53,9 +53,11 @@ export function addWsEventHandlers() {
ids.add(id);
if (added.has(id)) {
+ console.debug('already added, skipping', id)
return;
}
added.add(id);
+ console.debug('adding event listener for ws send', id, event)
element.addEventListener(event, (e) => {
sendWs({id, event})
});
@@ -65,7 +67,6 @@ export function addWsEventHandlers() {
added.delete(id);
}
}
- console.log('size', added.size)
}
register([])