YouTube PiP

Smart Picture-in-Picture mode with all YouTube controls and functions

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         YouTube PiP
// @namespace    https://github.com/dmitroderkach/youtube-pip
// @version      2.2.11
// @description  Smart Picture-in-Picture mode with all YouTube controls and functions
// @author       Dmytro Derkach
// @match        https://www.youtube.com/*
// @grant        none
// @homepageURL  https://github.com/dmitroderkach/youtube-pip
// @supportURL   https://github.com/dmitroderkach/youtube-pip/issues
// @license      MIT
// ==/UserScript==


!function(){"use strict";const e=5e3,t=0,i=500,n=480,r=270,o=600,s=400,a=225,l="https://youtu.be",d="list",c="t",u=-1,h=1,g="yt-action",p="yt-navigate",y="yt-activate-miniplayer",m="yt-activate-miniplayer-from-watch-action",b="LIKE",v="DISLIKE",w="INDIFFERENT",f="WEB_PAGE_TYPE_WATCH",P=2,M=3,E=4,S=5,W=2,k=new WeakMap,x=new WeakSet;function C(e){return(t,i,n)=>{!function(e,t,i){const n=k.get(e)??[];n[t]=i,k.set(e,n)}(t,n,e)}}function O(){return e=>{!function(e){x.add(e)}(e)}}var T=Object.getOwnPropertyDescriptor;const A=new Intl.DateTimeFormat("en-CA",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});const D=class e{constructor(e){this.scope=e}static getInstance(t){e.storageListenerAdded||(e.enabled=e.checkDebugFlag(),window.addEventListener("storage",()=>{e.enabled=e.checkDebugFlag()}),e.storageListenerAdded=!0);let i=e.instances.get(t);return i||(i=new e(t),e.instances.set(t,i)),i}static checkDebugFlag(){try{return"true"===localStorage.getItem("YOUTUBE_PIP_DEBUG")}catch{return!1}}static setGlobalMetadata(t){e.globalMetadata={...t}}styled(t,i,n,r){const o=function(e){const t=String(e.getMilliseconds()).padStart(3,"0");return A.format(e).replace(", ",":")+"."+t}(new Date),s=n.replace(/%/g,"%%");var a;const l=[`%c${o}%c [YouTube PiP]%c${a=this.scope,`[${a}]`}%c ${s}`,"color: #3b82f6; font-weight: 500;","color: #6366f1; font-weight: 600;","color: #f59e0b; font-weight: 500;",i];void 0!==r&&l.push(r),Object.keys(e.globalMetadata).length>0&&l.push(e.globalMetadata),t(...l)}log(t,i){e.enabled&&this.styled(console.log.bind(console),"color: #86efac;",t,i)}warn(t,i){e.enabled&&this.styled(console.warn.bind(console),"color: #fde047;",t,i)}error(e,t){this.styled(console.error.bind(console),"color: #f87171;",e,t)}debug(t,i){e.enabled&&this.styled(console.debug.bind(console),"color: #a1a1aa;",t,i)}};D.instances=new Map,D.enabled=!1,D.storageListenerAdded=!1,D.globalMetadata={};let I=D,$=class{create(e){return I.getInstance(e)}};$=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?T(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O()],$);class z extends Error{constructor(e,t){super(e),this.cause=t,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class F extends z{constructor(e,t){super(e,t),this.name="AppRuntimeError"}}class N{constructor(){this.bindings=new Map}bind(e){return{to:t=>{this.bindings.set(e,{token:e,implementation:t,scope:"singleton"})},toSelf:()=>{if("function"!=typeof e)throw new F("toSelf() requires a class constructor as token");this.bindings.set(e,{token:e,implementation:e,scope:"singleton"})},toTransient:t=>{this.bindings.set(e,{token:e,implementation:t,scope:"transient"})},toInstance:t=>{this.bindings.set(e,{token:e,implementation:()=>t,scope:"singleton",instance:t})}}}get(e,t=new Set){const i=this.tokenName(e),n=this.bindings.get(e);if(!n)throw new F(`No binding for ${i}`);if(void 0!==n.instance)return n.instance;if(t.has(e)){const i=[...t,e].map(e=>this.tokenName(e)).join(" → ");throw new F(`Circular dependency detected: ${i}`)}t.add(e);try{const i=n.implementation;if(r=i,!x.has(r))throw new F(`${this.tokenName(e)} must be decorated with @injectable()`);const o=function(e){return k.get(e)}(i)??[],s=i.length;for(let t=0;t<s;t++)if(void 0===o[t])throw new F(`${this.tokenName(e)}: constructor parameter at index ${t} must be decorated with @inject(token)`);const a=new i(...o.map(e=>this.get(e,t)));return"singleton"===n.scope&&(n.instance=a),a}finally{t.delete(e)}var r}tokenName(e){return"function"==typeof e?e.name||"anonymous":String(e)}unbind(e){this.bindings.delete(e)}}const L=I.getInstance("DOMUtils");class H{static createPlaceholder(e){return document.createComment(e)}static insertPlaceholderBefore(e,t){const i=e.parentNode;return i?(i.insertBefore(t,e),L.debug("Placeholder inserted"),!0):(L.warn("insertPlaceholderBefore: element has no parent"),!1)}static restoreElementFromPlaceholder(e,t){const i=t.parentNode;i?(i.insertBefore(e,t),t.remove(),L.debug("Element restored from placeholder")):L.warn("restoreElementFromPlaceholder: placeholder has no parent")}static copyAttributes(e,t){if(e&&t)try{Array.from(e.attributes).forEach(e=>{try{t.setAttribute(e.nodeName,e.nodeValue||"")}catch(i){L.warn(`Failed to copy attribute ${e.nodeName}:`,i)}}),L.debug("Attributes copied successfully")}catch(i){L.error("Error copying attributes:",i)}else L.warn("copyAttributes: source or target is null")}static copyViaTextarea(e,t){const i=e.createElement("textarea");i.value=t,i.style.cssText="position:fixed;left:-9999px;top:0;opacity:0;pointer-events:none;",e.body.appendChild(i),i.focus(),i.select();let n=!1;try{n=e.execCommand("copy")}catch{}return i.remove(),n}static unwrap(e){if(!e)return void L.warn("unwrap: wrapper is null");const t=e.parentNode;if(t)try{for(;e.firstChild;)t.insertBefore(e.firstChild,e);t.removeChild(e),L.debug("Element unwrapped successfully")}catch(i){L.error("Error unwrapping element:",i)}else L.warn("unwrap: Element has no parent node")}static waitForElementSelector(t,i=document,n=e,r){return new Promise((e,o)=>{const s=i.querySelector(t);if(s)return L.debug(`Element found immediately: ${t}`),e(s);L.debug(`Waiting for element: ${t}`);const a=new MutationObserver((n,r)=>{const o=i.querySelector(t);o&&(L.debug(`Element appeared: ${t}`),r.disconnect(),e(o))}),l=i===document?document.body:i;
/* v8 ignore next -- @preserve */l?(a.observe(l,{childList:!0,subtree:!0}),n>0&&setTimeout(()=>{a.disconnect(),o(new F(`Timeout: ${t} not found`))},n),0===n&&r&&!r.closed&&r.addEventListener("pagehide",()=>{a.disconnect(),o(new F("Wait aborted: target window closed"))},{once:!0})):o(new F(`Target element not found for selector: ${t}`))})}}const B="ytd-miniplayer",V="ytd-miniplayer-player-container",R=".ytdMiniplayerComponentHost.ytdMiniplayerComponentVisible",_="#movie_player",q="video",j="ytd-app",U="yt-draggable",Y=".ytp-popup.ytp-contextmenu",G=".ytp-contextmenu",X=".ytp-menuitem",K=".ytp-panel-menu > .ytp-menuitem",J=".yt-spec-button-shape-next[aria-expanded]",Q=".ytdMiniplayerComponentPlaylistPanel",Z=".ytp-progress-bar",ee="ytd-slim-metadata-toggle-button-renderer",te=".yt-spec-button-shape-next",ie=".yt-simple-endpoint",ne="button",re='style, link[rel="stylesheet"]',oe="ytd-notification-topbar-button-renderer";class se extends z{constructor(e,t){super(e,t),this.name="AppInitializationError"}}var ae=Object.getOwnPropertyDescriptor;let le=class{constructor(e){this.player=null,this.wasPlaying=!1,this.wasMiniPlayerActiveBeforePiP=!1,this.logger=e.create("PlayerManager")}async initialize(){try{const t=await H.waitForElementSelector(_,document,e);this.player=t,this.logger.debug("Player initialized")}catch(t){throw new se(`${_} element not found`,t)}}getPlayer(){return this.player}getPlayerState(e){return"function"!=typeof e.getPlayerState?(this.logger.error("getPlayerState method not found"),u):e.getPlayerState()}isPlaying(e){return this.getPlayerState(e)===h}savePlayingState(e){this.wasPlaying=this.isPlaying(e),this.logger.debug(`Player state saved: wasPlaying = ${this.wasPlaying}`)}setWasMiniPlayerActiveBeforePiP(e){this.wasMiniPlayerActiveBeforePiP=e}getWasMiniPlayerActiveBeforePiP(){return this.wasMiniPlayerActiveBeforePiP}restorePlayingState(e){if(this.wasPlaying)try{"function"==typeof e.playVideo?(e.playVideo(),this.logger.log("Playback restored after return to main window")):this.logger.error("player.playVideo method not found, cannot restore playback")}catch(t){this.logger.error("Error restoring playback:",t)}else this.logger.debug("No need to restore playing state")}getVideoDataFromPlayer(e){return"function"!=typeof e.getVideoData?null:e.getVideoData()||null}getVideoId(){const e=this.getVideoDataFromPlayer(this.getPlayer()),t=null==e?void 0:e.video_id;return t||(this.logger.error("Video ID not found, cannot navigate",{player:this.getPlayer()}),null)}getVideoData(){return this.getVideoDataFromPlayer(this.getPlayer())}getCurrentTime(){const e=this.getPlayer();if("function"!=typeof e.getCurrentTime)return 0;const t=e.getCurrentTime();return"number"!=typeof t||Number.isNaN(t)?0:Math.floor(t)}getPlayerSize(){const e=this.getPlayer();return"function"!=typeof e.getPlayerSize?null:e.getPlayerSize()}getDebugInfo(){const e=this.getPlayer();if("function"!=typeof e.getDebugText)return null;const t=e.getDebugText(!0);return"string"==typeof t&&t.length>0?t:null}async waitForMainPlayer(){try{const t=await H.waitForElementSelector(_,document,e);return this.player=t,this.logger.debug("Main player is ready"),t}catch(t){return this.logger.error("Error waiting for main player:",t),null}}async waitForMiniPlayer(){try{const t=await H.waitForElementSelector(R,document,e);return this.logger.debug("Miniplayer is ready"),t}catch(t){return this.logger.error("Error waiting for miniplayer:",t),null}}resetState(){this.wasPlaying=!1,this.logger.debug("Player state reset")}};var de,ce;le=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ae(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),(de=0,ce=C($),(e,t)=>ce(e,t,de))],le);var ue=Object.getOwnPropertyDescriptor;let he=class{constructor(e){this.app=null,this.notifyRenderer=null,this.logger=e.create("YtdAppProvider")}async initialize(){try{const i=await H.waitForElementSelector(j,document,e);this.app=i;try{this.notifyRenderer=await H.waitForElementSelector(oe,document,e)}catch(t){this.logger.warn(`${oe} not found, notification count will be omitted from title`,t),this.notifyRenderer=null}this.logger.debug("ytd-app initialized")}catch(i){throw new se(`${j} element not found`,i)}}getApp(){return this.app}getNotifyRenderer(){return this.notifyRenderer}};he=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ue(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),((e,t)=>(i,n)=>t(i,n,e))(0,C($))],he);var ge=Object.getOwnPropertyDescriptor;let pe=class{constructor(e){this.pipWindow=null,this.logger=e.create("PipWindowProvider")}setWindow(e){this.pipWindow=e,this.logger.debug("PipWindowProvider.setWindow",{hasWindow:null!==e})}getWindow(){return this.pipWindow}};pe=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ge(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),((e,t)=>(i,n)=>t(i,n,e))(0,C($))],pe);var ye=Object.getOwnPropertyDescriptor,me=(e,t)=>(i,n)=>t(i,n,e);let be=class{constructor(e,t,i){this.playerManager=t,this.ytdAppProvider=i,this.miniplayer=null,this.logger=e.create("MiniPlayerController")}async initialize(){try{const t=await H.waitForElementSelector(B,document,e);this.miniplayer=t,this.logger.debug("Miniplayer initialized")}catch(t){throw new se(`${B} element not found`,t)}}getMiniplayer(){return this.miniplayer}isVisible(){const e=!!document.querySelector(R);return this.logger.debug(`Mini player visible: ${e}`),e}activateMiniPlayer(){this.logger.debug("Activating mini player via YouTube API");const e=this.ytdAppProvider.getApp();if("function"==typeof e.fire)try{e.fire(g,{actionName:y,args:[!1],optionalAction:!1,returnValue:[void 0]}),this.logger.debug("Mini player activation event dispatched")}catch(t){this.logger.error("Error activating mini player:",t)}else this.logger.error("ytd-app fire method not found")}toggleMiniPlayer(){const e=this.ytdAppProvider.getApp();if("function"==typeof e.fire)try{if(e.miniplayerIsActive){this.logger.debug("Returning to full player via YouTube API");const t=this.playerManager.getVideoId();if(!t)return void this.logger.error("Video ID not found, cannot navigate to full player");e.fire(p,{endpoint:{watchEndpoint:{videoId:t}}}),this.logger.debug(`Navigation to full player dispatched for video ${t}`)}else this.logger.debug("Activating miniplayer via YouTube API"),e.fire(g,{actionName:m,args:null,optionalAction:!1,returnValue:[void 0]}),this.logger.debug("Miniplayer activation event dispatched")}catch(t){this.logger.error("Error toggling mini player:",t)}else this.logger.error("ytd-app fire method not found")}};be=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ye(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),me(0,C($)),me(1,C(le)),me(2,C(he))],be);var ve=Object.getOwnPropertyDescriptor,we=(e,t)=>(i,n)=>t(i,n,e);let fe=class{constructor(e,t){this.pipWindowProvider=t,this.pipWindow=null,this.logger=e.create("NavigationHandler")}initialize(){this.pipWindow=this.pipWindowProvider.getWindow(),this.setupClickHandler(),this.logger.debug("Navigation handler initialized")}setupClickHandler(){this.pipWindow?this.pipWindow.document.addEventListener("click",e=>{var t,i;const n=null==(t=e.target)?void 0:t.closest(ie);if((null==(i=e.target)?void 0:i.closest(ne))||!n)return;const r=n.href;if(r){this.logger.log("Navigation click detected");try{const t=new URL(r),i=Object.fromEntries(t.searchParams);e.preventDefault();const n={endpoint:{commandMetadata:{webCommandMetadata:{url:r,webPageType:f,rootVe:3832}},watchEndpoint:{videoId:i.v,playlistId:i.list||null,index:i.index?parseInt(i.index)-1:0,params:"OAE%3D",playerParams:i.pp}},entryTime:performance.now()};this.logger.log(`SPA navigation via ${p}: ${r}`),window.dispatchEvent(new PopStateEvent("popstate",{state:n}))}catch(o){this.logger.error("Error handling navigation:",o)}}else this.logger.warn("Navigation endpoint has no href")},!0):this.logger.error("PiP window not available for navigation handler")}cleanup(){this.pipWindow=null,this.logger.debug("Navigation handler cleaned up")}};fe=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ve(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),we(0,C($)),we(1,C(pe))],fe);var Pe=Object.getOwnPropertyDescriptor,Me=(e,t)=>(i,n)=>t(i,n,e);let Ee=class{constructor(e,t){this.playerManager=t,this.observer=null,this.logger=e.create("ResizeTracker")}start(e){"undefined"!=typeof ResizeObserver?(this.logger.debug("Starting resize tracking"),this.observer=new ResizeObserver(e=>{var t,i;for(const n of e){const e=n.contentRect.width;this.logger.debug(`New size: ${e}px`);const r=this.playerManager.getPlayer();"function"==typeof r.setInternalSize||"function"==typeof r.setSize||this.logger.warn("Player resize methods (setInternalSize, setSize) not found"),null==(t=r.setInternalSize)||t.call(r),null==(i=r.setSize)||i.call(r),r.dispatchEvent(new Event("resize",{bubbles:!0})),this.logger.debug("Player size updated")}}),this.observer.observe(e)):this.logger.error("ResizeObserver not available")}stop(){this.observer&&(this.observer.disconnect(),this.observer=null,this.logger.debug("Resize tracking stopped"))}};Ee=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?Pe(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),Me(0,C($)),Me(1,C(le))],Ee);var Se=Object.getOwnPropertyDescriptor,We=(e,t)=>(i,n)=>t(i,n,e);let ke=class{constructor(e,t){this.pipWindowProvider=t,this.observer=null,this.removalObserver=null,this.logger=e.create("MenuObserver")}async start(){const e=this.pipWindowProvider.getWindow();e&&await this.runObservation(e)}async runObservation(e){if(e.closed)return void this.logger.debug("PiP window already closed, skipping menu observation");let i;try{i=await H.waitForElementSelector(J,e.document,t,e)}catch(n){return void this.logger.warn("Wait for menu button aborted",n)}this.logger.debug("Starting menu observation"),this.observer=new MutationObserver(t=>{for(const n of t)if("aria-expanded"===n.attributeName){const t="true"===i.getAttribute("aria-expanded"),n=e.document.querySelector(Q),r=e.outerHeight;this.logger.debug(`Menu state changed: expanded = ${t}`),t?(r<o&&(e.resizeTo(e.outerWidth,o),this.logger.debug("PiP window expanded")),n&&(n.style.display="block")):n&&(n.style.display="none")}}),this.observer.observe(i,{attributes:!0,attributeFilter:["aria-expanded"]}),this.removalObserver=new MutationObserver(()=>{var t,n;i.isConnected||(null==(t=this.observer)||t.disconnect(),null==(n=this.removalObserver)||n.disconnect(),this.observer=null,this.removalObserver=null,this.logger.debug("Menu button removed from DOM, re-waiting"),this.runObservation(e))}),this.removalObserver.observe(e.document.body,{childList:!0,subtree:!0})}stop(){this.observer&&(this.observer.disconnect(),this.observer=null),this.removalObserver&&(this.removalObserver.disconnect(),this.removalObserver=null),this.logger.debug("Menu observation stopped")}};ke=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?Se(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),We(0,C($)),We(1,C(pe))],ke);var xe=(e=>(e.VIDEO_URL="video_url",e.URL_AT_TIME="url_at_time",e.EMBED="embed",e.DEBUG_INFO="debug_info",e))(xe||{});function Ce(e){const{videoId:t,playlistId:i,currentTime:n,title:r,copyType:o,embedSize:u}=e;switch(o){case xe.VIDEO_URL:return function(e,t){const i=`${l}/${e}`,n=t?`?${d}=${t}`:"";return n?`${i}${n}`:i}(t,i);case xe.URL_AT_TIME:return function(e,t,i){const n=t?`?${d}=${t}`:"";return`${l}/${e}${n}${i>0?n?`&${c}=${i}s`:`?${c}=${i}s`:""}`}(t,i,n);case xe.EMBED:return function(e,t,i,n){return`<iframe width="${(null==n?void 0:n.width)??s}" height="${(null==n?void 0:n.height)??a}" src="https://www.youtube.com/embed/${e}${t?`?${d}=${t}`:""}" title="${i.replace(/"/g,"&quot;")}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>`}(t,i,r,u);default:return""}}var Oe=Object.getOwnPropertyDescriptor,Te=(e,t)=>(i,n)=>t(i,n,e);let Ae=class{constructor(e,t,i,n){this.playerManager=t,this.ytdAppProvider=i,this.pipWindowProvider=n,this.visibilityObserver=null,this.pipWindow=null,this.contextMenu=null,this.contextMenuPlaceholder=null,this.visibilitySubscribers=new Set,this.handleCopyClick=e=>{var t;if(!this.pipWindow)return;const i=this.pipWindow.document,n=null==(t=e.target)?void 0:t.closest(X);if(!(null==n?void 0:n.parentElement))return void this.logger.debug("Copy click: not a menu item or no parent",{item:n});const r=i.querySelectorAll(K),o=Array.prototype.indexOf.call(r,n);if(-1===o)return void this.logger.warn("Copy click: menu item index not found");const s=this.getCopyTypeForIndex(o);if(!s)return void this.logger.debug("Copy click: not a copy action",{index:o});let a;switch(s){case xe.DEBUG_INFO:if(a=this.playerManager.getDebugInfo()??"",!a)return void this.logger.warn("Debug info not available, cannot copy");break;default:{const e=this.playerManager.getVideoData(),t=null==e?void 0:e.video_id;if(!t)return void this.logger.warn("Video ID not found, cannot copy");const i=(null==e?void 0:e.list)??null,n=this.playerManager.getCurrentTime(),r=(null==e?void 0:e.title)??"",o=s===xe.EMBED?this.playerManager.getPlayerSize():null;if(a=this.getCopyPayload({videoId:t,playlistId:i,currentTime:n,title:r,copyType:s,embedSize:o}),!a)return void this.logger.warn("Copy click: empty payload",{copyType:s});break}}H.copyViaTextarea(i,a)&&this.logger.debug(`Copied ${s} to clipboard`)},this.logger=e.create("ContextMenuHandler")}subscribeContextMenu(e){return this.visibilitySubscribers.add(e),()=>{this.visibilitySubscribers.delete(e)}}notifyVisibility(e){this.visibilitySubscribers.forEach(t=>t(e))}async initialize(){this.pipWindow=this.pipWindowProvider.getWindow(),this.contextMenuPlaceholder=H.createPlaceholder("context_menu_placeholder");try{this.contextMenu=await H.waitForElementSelector(Y,document,t,this.pipWindow),this.logger.log("Context menu element found, starting visibility monitoring"),this.startMonitoring(),this.setupDismissalHandler(),this.setupCopyHandler()}catch(e){this.logger.warn("Error initializing context menu handler:",e)}}startMonitoring(){this.contextMenu&&this.pipWindow&&(this.visibilityObserver=new MutationObserver(()=>{var e;if(!this.contextMenu||!this.pipWindow)return;const t="none"!==this.contextMenu.style.display,i=this.contextMenu.parentNode!==this.pipWindow.document.body;t&&i?(this.logger.log("Context menu opened in main window. Intercepting..."),this.contextMenuPlaceholder&&H.insertPlaceholderBefore(this.contextMenu,this.contextMenuPlaceholder),this.pipWindow.document.body.appendChild(this.contextMenu),this.notifyVisibility(!0)):t||this.contextMenu.parentNode!==this.pipWindow.document.body||(this.notifyVisibility(!1),(null==(e=this.contextMenuPlaceholder)?void 0:e.parentNode)&&(this.logger.log("Context menu closed in PiP window. Returning to main..."),H.restoreElementFromPlaceholder(this.contextMenu,this.contextMenuPlaceholder),this.simulateMainContextMenu()))}),this.visibilityObserver.observe(this.contextMenu,{attributes:!0,attributeFilter:["style"]}),"none"!==this.contextMenu.style.display&&(this.contextMenuPlaceholder&&H.insertPlaceholderBefore(this.contextMenu,this.contextMenuPlaceholder),this.pipWindow.document.body.appendChild(this.contextMenu),this.notifyVisibility(!0)))}setupDismissalHandler(){if(!this.pipWindow)return;const e=e=>{var t;const i=this.pipWindow.document.querySelector(Y);i&&"none"!==i.style.display&&!(null==(t=e.target)?void 0:t.closest(G))&&(e.stopPropagation(),i.style.display="none",this.notifyVisibility(!1),this.logger.debug("Context menu dismissed"))};this.pipWindow.document.addEventListener("click",e,!0),this.pipWindow.document.addEventListener("contextmenu",e,!0)}setupCopyHandler(){this.pipWindow&&this.pipWindow.document.addEventListener("click",this.handleCopyClick,!0)}getCopyTypeForIndex(e){return e===P?xe.VIDEO_URL:e===M?xe.URL_AT_TIME:e===E?xe.EMBED:e===S?xe.DEBUG_INFO:null}getCopyPayload(e){return Ce(e)}simulateMainContextMenu(){const e=this.ytdAppProvider.getApp(),t=new MouseEvent("contextmenu",{bubbles:!0,cancelable:!0,clientX:0,clientY:0,button:W});e.dispatchEvent(t),this.logger.debug("Synthetic contextmenu event sent to main window")}stop(){var e;this.visibilityObserver&&(this.visibilityObserver.disconnect(),this.visibilityObserver=null),this.pipWindow&&this.pipWindow.document.removeEventListener("click",this.handleCopyClick,!0),this.contextMenu&&this.pipWindow&&this.contextMenu.parentNode===this.pipWindow.document.body&&(null==(e=this.contextMenuPlaceholder)?void 0:e.parentNode)&&(this.logger.log("Returning context menu to main window"),H.restoreElementFromPlaceholder(this.contextMenu,this.contextMenuPlaceholder),this.simulateMainContextMenu()),this.pipWindow=null,this.logger.debug("Context menu handler stopped")}};Ae=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?Oe(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),Te(0,C($)),Te(1,C(le)),Te(2,C(he)),Te(3,C(pe))],Ae);var De=Object.getOwnPropertyDescriptor,Ie=(e,t)=>(i,n)=>t(i,n,e);let $e=class{constructor(e,t,i){this.playerManager=t,this.pipWindowProvider=i,this.pipWindow=null,this.logger=e.create("SeekHandler")}initialize(){this.pipWindow=this.pipWindowProvider.getWindow(),this.setupSeekHandler(),this.logger.debug("Seek handler initialized")}setupSeekHandler(){if(!this.pipWindow)return;const e=this.pipWindow.document;e.addEventListener("mousedown",t=>{var i;const n=null==(i=t.target)?void 0:i.closest(Z);if(!n)return;const r=this.playerManager.getPlayer();if("function"!=typeof r.getDuration)return void this.logger.error("player.getDuration method not found");if("function"!=typeof r.seekTo)return void this.logger.error("player.seekTo method not found");this.logger.debug("Progress bar clicked, initiating seek"),t.preventDefault(),t.stopPropagation();const o=e=>{var t,i;const o=n.getBoundingClientRect(),s=e.clientX-o.left,a=Math.max(0,Math.min(1,s/o.width)),l=null==(t=r.getDuration)?void 0:t.call(r);if(l){const e=a*l;null==(i=r.seekTo)||i.call(r,e,!0),this.logger.debug(`Seeking to ${e.toFixed(2)}s (${(100*a).toFixed(1)}%)`)}};o(t);const s=e=>o(e),a=()=>{e.removeEventListener("mousemove",s),e.removeEventListener("mouseup",a),this.logger.debug("Seek drag ended")};e.addEventListener("mousemove",s),e.addEventListener("mouseup",a)},!0)}cleanup(){this.pipWindow=null,this.logger.debug("Seek handler cleaned up")}};$e=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?De(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),Ie(0,C($)),Ie(1,C(le)),Ie(2,C(pe))],$e);var ze=Object.getOwnPropertyDescriptor,Fe=(e,t)=>(i,n)=>t(i,n,e);let Ne=class{constructor(e,t,i,n){this.playerManager=t,this.ytdAppProvider=i,this.pipWindowProvider=n,this.logger=e.create("YtActionSender")}sendLikeAction(e){if(!this.pipWindowProvider.getWindow())return;const t=this.playerManager.getVideoId();if(!t)return void this.logger.error("Video ID not found, cannot send like action");const i=this.ytdAppProvider.getApp();if("function"!=typeof i.resolveCommand)return void this.logger.error("Failed to find resolveCommand in main window");const n={likeEndpoint:{status:e,target:{videoId:t}}};try{i.resolveCommand(n),this.logger.log(`Sent ${e} for video ${t}`)}catch(r){this.logger.error("Error sending YouTube action:",r)}}};Ne=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ze(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),Fe(0,C($)),Fe(1,C(le)),Fe(2,C(he)),Fe(3,C(pe))],Ne);var Le=Object.getOwnPropertyDescriptor,He=(e,t)=>(i,n)=>t(i,n,e);let Be=class{constructor(e,t,i){this.pipWindowProvider=t,this.ytActionSender=i,this.pipWindow=null,this.logger=e.create("LikeButtonHandler")}initialize(){this.pipWindow=this.pipWindowProvider.getWindow(),this.setupClickHandler(),this.logger.debug("Like button handler initialized")}setupClickHandler(){this.pipWindow&&this.pipWindow.document.addEventListener("click",e=>{var t,i;const n=null==(t=e.target)?void 0:t.closest(ee);if(!n)return;const r=n.parentElement;if(!r)return;const o=r.childNodes[0]===n,s=r.childNodes[1]===n;if(!o&&!s)return;const a=null==(i=e.target)?void 0:i.closest(te);if(!a)return;const l="true"===a.getAttribute("aria-pressed"),d=l?w:o?b:v;this.logger.log(`${d} button clicked (currently pressed: ${l})`),this.ytActionSender.sendLikeAction(d)},!0)}cleanup(){this.pipWindow=null,this.logger.debug("Like button handler cleaned up")}};Be=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?Le(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),He(0,C($)),He(1,C(pe)),He(2,C(Ne))],Be);var Ve=Object.getOwnPropertyDescriptor,Re=(e,t)=>(i,n)=>t(i,n,e);let _e=class{constructor(e,t,i,n){this.playerManager=t,this.pipWindowProvider=i,this.contextMenuHandler=n,this.pipWindow=null,this.isContextMenuOpen=!1,this.unsubscribeContextMenu=null,this.onBodyClick=()=>this.returnFocusToPlayerIfNeeded(),this.onKeyUp=e=>{"Tab"!==e.key&&this.returnFocusToPlayerIfNeeded()},this.logger=e.create("DocumentFocusHandler")}returnFocusToPlayerIfNeeded(){if(!this.pipWindow||this.isContextMenuOpen)return;const e=this.pipWindow.document.activeElement,t=this.playerManager.getPlayer();e&&e!==t&&"function"==typeof t.focus&&(this.logger.debug("Returning focus to player"),setTimeout(()=>t.focus(),0))}initialize(){this.pipWindow=this.pipWindowProvider.getWindow(),this.pipWindow?(this.unsubscribeContextMenu=this.contextMenuHandler.subscribeContextMenu(e=>{this.isContextMenuOpen=e,e||this.returnFocusToPlayerIfNeeded()}),this.pipWindow.document.body.addEventListener("click",this.onBodyClick,!0),this.pipWindow.document.addEventListener("keyup",this.onKeyUp,!0),this.logger.debug("Document focus handler initialized")):this.logger.error("PiP window not available for document focus handler")}cleanup(){var e,t,i;null==(e=this.unsubscribeContextMenu)||e.call(this),this.unsubscribeContextMenu=null,(null==(i=null==(t=this.pipWindow)?void 0:t.document)?void 0:i.body)&&(this.pipWindow.document.body.removeEventListener("click",this.onBodyClick,!0),this.pipWindow.document.removeEventListener("keyup",this.onKeyUp,!0)),this.pipWindow=null,this.isContextMenuOpen=!1,this.logger.debug("Document focus handler cleaned up")}};_e=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?Ve(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),Re(0,C($)),Re(1,C(le)),Re(2,C(pe)),Re(3,C(Ae))],_e);var qe=Object.getOwnPropertyDescriptor,je=(e,t)=>(i,n)=>t(i,n,e);let Ue=class{constructor(e,t,i,n){this.pipWindowProvider=t,this.ytdAppProvider=i,this.playerManager=n,this.mutationObserver=null,this.logger=e.create("TitleSyncHandler")}initialize(){if(this.playerManager.getWasMiniPlayerActiveBeforePiP())return void this.logger.debug("Title sync skipped (e.g. PiP opened from mini player)");if(!this.pipWindowProvider.getWindow())return void this.logger.debug("PiP not open, skipping title sync init");const e=this.playerManager.getPlayer(),t=e.querySelector(q);if(!t)return void this.logger.warn("Video element not found inside player");const i=()=>{var t;const i=null==(t=e.getVideoData)?void 0:t.call(e);(null==i?void 0:i.title)&&this.setWindowsTitle(i.title)};i(),this.mutationObserver=new MutationObserver(()=>{i()}),this.mutationObserver.observe(t,{attributes:!0,attributeFilter:["src"]});const n=this.ytdAppProvider.getNotifyRenderer();n&&this.mutationObserver.observe(n,{childList:!0,subtree:!0}),this.logger.debug("Title sync observing video src and notify renderer subtree")}setWindowsTitle(e){const t=this.pipWindowProvider.getWindow();if(!t)return;const i=this.ytdAppProvider.getNotifyRenderer(),n=`${(null==i?void 0:i.showNotificationCount)?`(${i.showNotificationCount}) `:""}${e} - YouTube`;document.title=n,t.document.title=n,this.logger.debug(`Title synced: ${e}`)}cleanup(){this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null,this.logger.debug("Title sync observer disconnected"))}};Ue=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?qe(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),je(0,C($)),je(1,C(pe)),je(2,C(he)),je(3,C(le))],Ue);var Ye=Object.getOwnPropertyDescriptor,Ge=(e,t)=>(i,n)=>t(i,n,e);let Xe=class{constructor(e,t,i,n,r,o,s,a){this.resizeTracker=e,this.menuObserver=t,this.contextMenuHandler=i,this.seekHandler=n,this.likeButtonHandler=r,this.navigationHandler=o,this.documentFocusHandler=s,this.titleSyncHandler=a}async initialize(e){return this.navigationHandler.initialize(),this.resizeTracker.start(e),this.menuObserver.start(),this.contextMenuHandler.initialize(),this.seekHandler.initialize(),this.likeButtonHandler.initialize(),this.documentFocusHandler.initialize(),this.titleSyncHandler.initialize(),()=>{this.titleSyncHandler.cleanup(),this.documentFocusHandler.cleanup(),this.seekHandler.cleanup(),this.likeButtonHandler.cleanup(),this.contextMenuHandler.stop(),this.menuObserver.stop(),this.resizeTracker.stop(),this.navigationHandler.cleanup()}}};Xe=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?Ye(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),Ge(0,C(Ee)),Ge(1,C(ke)),Ge(2,C(Ae)),Ge(3,C($e)),Ge(4,C(Be)),Ge(5,C(fe)),Ge(6,C(_e)),Ge(7,C(Ue))],Xe);const Ke=I.getInstance("StyleUtils");class Je{static copyStyles(e,t){try{const i=e.querySelectorAll(re);Ke.debug(`Copying ${i.length} style elements`),i.forEach(e=>{try{t.head.appendChild(e.cloneNode(!0))}catch(i){Ke.warn("Failed to copy style node:",i)}}),Ke.debug("Styles copied successfully")}catch(i){Ke.error("Error copying styles:",i)}}static injectCSSFixes(e){try{const t=e.createElement("style");t.textContent="/**\n * CSS styles for PiP window fixes and customizations\n */\n\nbody {\n  overflow: auto !important;\n}\n\nytd-miniplayer {\n  left: 0 !important;\n  right: 0 !important;\n  top: 0 !important;\n  bottom: 0 !important;\n  width: 100% !important;\n  height: 100% !important;\n  max-height: 100% !important;\n  display: flex !important;\n}\n\nytd-miniplayer-player-container {\n  width: 100% !important;\n  height: 100% !important;\n}\n\n.html5-video-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n\n.html5-video-container .html5-main-video {\n  width: 100% !important;\n  height: 100% !important;\n  object-fit: contain;\n}\n\nvideo {\n  left: 0 !important;\n  top: 0 !important;\n  right: 0 !important;\n  bottom: 0 !important;\n}\n\n.ytDraggableComponentHost.ytdMiniplayerComponentDraggable {\n  pointer-events: auto !important;\n}\n\n.ytp-miniplayer-expand-watch-page-button,\n.ytp-miniplayer-close-button,\n#header-contents,\n.ytdMiniplayerComponentResizers,\n/* TODO: remove when context menu interception is implemented */\n.dropdown-trigger {\n  display: none !important;\n}\n\n/* Stretch progress bar to full width */\n.ytp-progress-bar-container,\n.ytp-progress-bar {\n  width: 100% !important;\n}\n\n.ytp-prev-button,\n.ytp-next-button {\n  display: inline-flex !important;\n}\n",e.head.appendChild(t),Ke.debug("CSS fixes injected successfully")}catch(t){Ke.error("Error injecting CSS fixes:",t)}}}const Qe=I.getInstance("AsyncLock");class Ze{constructor(){this.locked=!1,this.queue=[]}async withLock(e){Qe.debug("withLock: waiting for lock"),await this.acquire(),Qe.debug("withLock: lock acquired, running fn");try{return await e()}finally{this.release(),Qe.debug("withLock: lock released")}}acquire(){return this.locked?(Qe.debug("acquire: lock busy, joining queue",{queueSize:this.queue.length}),new Promise(e=>{this.queue.push(()=>{this.locked=!0,Qe.debug("acquire: woke from queue"),e()})})):(this.locked=!0,Qe.debug("acquire: lock taken immediately"),Promise.resolve())}release(){if(this.queue.length>0){const e=this.queue.shift();Qe.debug("release: passing lock to next in queue",{remaining:this.queue.length}),e()}else this.locked=!1,Qe.debug("release: lock freed")}}class et extends z{constructor(e,t){super(e,t),this.name="PiPError"}}class tt extends z{constructor(e,t){super(e,t),this.name="PiPCriticalError"}}var it=Object.getOwnPropertyDescriptor,nt=(e,t)=>(i,n)=>t(i,n,e);let rt=class{constructor(e,t,i,n,r,o){this.miniPlayerController=t,this.playerManager=i,this.ytdAppProvider=n,this.pipWindowProvider=r,this.pipWindowHandlers=o,this.miniPlayerContainer=null,this.placeholder=null,this.onBeforeReturn=null,this.asyncLock=new Ze,this.close=async()=>this.asyncLock.withLock(()=>this.returnPlayerToMain()).catch(e=>{this.logger.error("Unhandled error in returnPlayerToMain:",e)}),this.logger=e.create("PiPManager")}isOpen(){return null!==this.pipWindowProvider.getWindow()}getWindow(){return this.pipWindowProvider.getWindow()}open(){return this.asyncLock.withLock(async()=>{if(this.isOpen())this.logger.warn("PiP window already open");else{this.logger.log("Opening PiP window");try{await this.movePlayerToPIP();if(this.pipWindowProvider.getWindow()){const e=await this.pipWindowHandlers.initialize(this.miniPlayerController.getMiniplayer());"function"==typeof e&&(this.onBeforeReturn=e)}}catch(e){if(e instanceof tt)throw e;throw new et("Error opening PiP",e)}}})}async movePlayerToPIP(){const e=this.miniPlayerController.getMiniplayer();this.playerManager.setWasMiniPlayerActiveBeforePiP(this.miniPlayerController.isVisible()),this.playerManager.getWasMiniPlayerActiveBeforePiP()||(this.miniPlayerController.toggleMiniPlayer(),await H.waitForElementSelector(V),this.logger.debug("Mini player container ready"));const t=e.offsetWidth||n,o=e.offsetHeight||r;this.logger.debug(`Requesting PiP window: ${t}x${o}`);const s=window.documentPictureInPicture;if(!s)throw new et("Document Picture-in-Picture API not available");const a=this.ytdAppProvider.getApp();if(this.miniPlayerContainer=document.querySelector(V),!this.miniPlayerContainer)throw new et("miniplayer-container element not found");const l=await s.requestWindow({width:t,height:o});this.pipWindowProvider.setWindow(l),setTimeout(()=>{this.asyncLock.withLock(async()=>{const e=this.pipWindowProvider.getWindow();if(null==e?void 0:e.closed)return this.logger.warn("phantom window detected, closing"),this.pipWindowProvider.setWindow(null),void this.close()})},i),l.addEventListener("pagehide",this.close),this.logger.log("PiP window opened");const d=l.document;H.copyAttributes(document.documentElement,d.documentElement),H.copyAttributes(document.body,d.body),Je.copyStyles(document,d),Je.injectCSSFixes(d);const c=d.createElement(j);H.copyAttributes(a,c),d.body.appendChild(c),this.placeholder=H.createPlaceholder("mini_player_placeholder"),H.insertPlaceholderBefore(e,this.placeholder),c.appendChild(e);const u=d.querySelector(U);if(!u)throw new tt("yt-draggable element not found");u.prepend(this.miniPlayerContainer),H.unwrap(u)}async returnPlayerToMain(){if(this.logger.log("Returning player to main window"),this.placeholder&&this.miniPlayerContainer){if(this.onBeforeReturn){try{await this.onBeforeReturn()}catch(e){this.logger.error("Error in onBeforeReturn:",e)}this.onBeforeReturn=null}try{await this.movePlayerToMain()}catch(t){this.logger.error("Error returning player to main window:",t)}this.pipWindowProvider.setWindow(null)}else this.logger.warn("Placeholder or miniPlayerContainer not found",{placeholder:this.placeholder,miniPlayerContainer:this.miniPlayerContainer})}async movePlayerToMain(){const e=this.miniPlayerController.getMiniplayer();if(!this.placeholder||!this.miniPlayerContainer)return;const t=this.playerManager.getPlayer();this.playerManager.savePlayingState(t),H.restoreElementFromPlaceholder(e,this.placeholder),this.placeholder=null;const i=document.querySelector(U);if(!i)throw new tt("yt-draggable element not found");i.prepend(this.miniPlayerContainer),this.playerManager.getWasMiniPlayerActiveBeforePiP()||(this.miniPlayerController.toggleMiniPlayer(),await this.playerManager.waitForMainPlayer());const n=document.querySelector(V);n&&n.remove(),await new Promise(e=>{setTimeout(async()=>{this.playerManager.restorePlayingState(t),this.playerManager.getWasMiniPlayerActiveBeforePiP()&&(this.miniPlayerController.activateMiniPlayer(),await this.playerManager.waitForMiniPlayer().catch(()=>{})),e()})})}};rt=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?it(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),nt(0,C($)),nt(1,C(be)),nt(2,C(le)),nt(3,C(he)),nt(4,C(pe)),nt(5,C(Xe))],rt);var ot=Object.getOwnPropertyDescriptor,st=(e,t)=>(i,n)=>t(i,n,e);let at=class{constructor(e,t){this.pipManager=t,this.logger=e.create("MediaSessionHandler")}initialize(){"mediaSession"in navigator?(this.registerActionHandler(),this.logger.debug("Media session handler initialized")):this.logger.warn("Media Session API not available")}registerActionHandler(){if("mediaSession"in navigator)try{navigator.mediaSession.setActionHandler("enterpictureinpicture",()=>{this.logger.log("Media session enterpictureinpicture action triggered"),this.pipManager.open().catch(e=>{this.logger.error("Error opening PiP from media session:",e)})}),this.logger.debug("Media session action handler registered")}catch(e){throw new se("Error registering media session action handler",e)}}};function lt(){var e,t,i;try{const n=window.ytcfg;if(null==(i=null==(t=null==(e=null==n?void 0:n.data_)?void 0:e.INNERTUBE_CONTEXT)?void 0:t.client)?void 0:i.clientVersion)return n.data_.INNERTUBE_CONTEXT.client.clientVersion}catch{}return"unknown"}function dt(){try{const e=navigator.userAgent;if(!e)return"unknown";const t=e.match(/Chrome\/([\d.]+)/);if(t&&!e.includes("Edg/"))return`Chrome/${t[1]}`;const i=e.match(/Edg\/([\d.]+)/);if(i)return`Edge/${i[1]}`;const n=e.match(/Firefox\/([\d.]+)/);if(n)return`Firefox/${n[1]}`;const r=e.match(/Version\/([\d.]+).*Safari/);return r&&!e.includes("Chrome")?`Safari/${r[1]}`:e}catch{}return"unknown"}function ct(){const e={youtubeVersion:lt(),scriptVersion:"2.2.11",browserVersion:dt()},t=function(){var e;try{const t=window.ytcfg;return(null==(e=null==t?void 0:t.data_)?void 0:e.EXPERIMENT_FLAGS)?t.data_.EXPERIMENT_FLAGS:{}}catch{}return{}}();return Object.keys(t).length>0&&(e.youtubeFeatureFlags=t),e}at=((e,t,i,n)=>{for(var r,o=n>1?void 0:n?ot(t,i):t,s=e.length-1;s>=0;s--)(r=e[s])&&(o=r(o)||o);return o})([O(),st(0,C($)),st(1,C(rt))],at);const ut=I.getInstance("Main");async function ht(){I.setGlobalMetadata(ct());const e=function(){const e=new N;return e.bind($).toSelf(),e.bind(le).toSelf(),e.bind(he).toSelf(),e.bind(pe).toSelf(),e.bind(be).toSelf(),e.bind(fe).toSelf(),e.bind(Ee).toSelf(),e.bind(ke).toSelf(),e.bind(Ae).toSelf(),e.bind($e).toSelf(),e.bind(Ne).toSelf(),e.bind(Be).toSelf(),e.bind(_e).toSelf(),e.bind(Ue).toSelf(),e.bind(Xe).toSelf(),e.bind(rt).toSelf(),e.bind(at).toSelf(),e}();ut.log("Initializing YouTube PiP application");try{const t=e.get(he);await t.initialize();const i=e.get(le);await i.initialize();const n=e.get(be);await n.initialize();e.get(at).initialize(),ut.log("YouTube PiP application initialized")}catch(t){ut.error("YouTube PiP initialization failed",t)}}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{ht()}):ht()}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnNjcmlwdC5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy9hcHAudHMiLCIuLi9zcmMvY29uc3RhbnRzL2NvcHlQYXlsb2FkLnRzIiwiLi4vc3JjL2NvbnN0YW50cy95b3V0dWJlLnRzIiwiLi4vc3JjL2NvbnN0YW50cy91aS50cyIsIi4uL3NyYy9kaS9tZXRhZGF0YS50cyIsIi4uL3NyYy9kaS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9lcnJvcnMvQXBwRXJyb3IudHMiLCIuLi9zcmMvZXJyb3JzL0FwcFJ1bnRpbWVFcnJvci50cyIsIi4uL3NyYy9kaS9jb250YWluZXIudHMiLCIuLi9zcmMvdXRpbHMvRE9NVXRpbHMudHMiLCIuLi9zcmMvc2VsZWN0b3JzLnRzIiwiLi4vc3JjL2Vycm9ycy9BcHBJbml0aWFsaXphdGlvbkVycm9yLnRzIiwiLi4vc3JjL2NvcmUvUGxheWVyTWFuYWdlci50cyIsIi4uL3NyYy9jb3JlL1l0ZEFwcFByb3ZpZGVyLnRzIiwiLi4vc3JjL2NvcmUvUGlwV2luZG93UHJvdmlkZXIudHMiLCIuLi9zcmMvdWkvTWluaVBsYXllckNvbnRyb2xsZXIudHMiLCIuLi9zcmMvY29yZS9OYXZpZ2F0aW9uSGFuZGxlci50cyIsIi4uL3NyYy91aS9SZXNpemVUcmFja2VyLnRzIiwiLi4vc3JjL3VpL01lbnVPYnNlcnZlci50cyIsIi4uL3NyYy90eXBlcy9hcHAudHMiLCIuLi9zcmMvdXRpbHMvY29weVBheWxvYWQudHMiLCIuLi9zcmMvdWkvQ29udGV4dE1lbnVIYW5kbGVyLnRzIiwiLi4vc3JjL2hhbmRsZXJzL1NlZWtIYW5kbGVyLnRzIiwiLi4vc3JjL2NvcmUvWXRBY3Rpb25TZW5kZXIudHMiLCIuLi9zcmMvaGFuZGxlcnMvTGlrZUJ1dHRvbkhhbmRsZXIudHMiLCIuLi9zcmMvaGFuZGxlcnMvRG9jdW1lbnRGb2N1c0hhbmRsZXIudHMiLCIuLi9zcmMvaGFuZGxlcnMvVGl0bGVTeW5jSGFuZGxlci50cyIsIi4uL3NyYy9jb3JlL1BpUFdpbmRvd0hhbmRsZXJzLnRzIiwiLi4vc3JjL3N0eWxlcy5jc3M/cmF3IiwiLi4vc3JjL3V0aWxzL1N0eWxlVXRpbHMudHMiLCIuLi9zcmMvdXRpbHMvQXN5bmNMb2NrLnRzIiwiLi4vc3JjL2Vycm9ycy9QaVBFcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvUGlQQ3JpdGljYWxFcnJvci50cyIsIi4uL3NyYy9jb3JlL1BpUE1hbmFnZXIudHMiLCIuLi9zcmMvaGFuZGxlcnMvTWVkaWFTZXNzaW9uSGFuZGxlci50cyIsIi4uL3NyYy91dGlscy9WZXJzaW9uRGV0ZWN0b3IudHMiLCIuLi9zcmMvbWFpbi50cyIsIi4uL3NyYy9kaS9jb250YWluZXItY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwbGljYXRpb24tbGV2ZWwgY29uc3RhbnRzXG4gKi9cblxuLyoqIExvY2FsU3RvcmFnZSBmbGFnIGZvciBlbmFibGluZyBkZWJ1ZyBsb2dzICovXG5leHBvcnQgY29uc3QgREVCVUdfRkxBRyA9ICdZT1VUVUJFX1BJUF9ERUJVRyc7XG5cbi8qKiBUaW1lb3V0IHZhbHVlcyAoaW4gbWlsbGlzZWNvbmRzKSAqL1xuZXhwb3J0IGNvbnN0IFRJTUVPVVRTID0ge1xuICBBQ1RJVkVfRUxFTUVOVF9QT0xMOiAxMDAsXG4gIEVMRU1FTlRfV0FJVDogNTAwMCxcbiAgRUxFTUVOVF9XQUlUX0lORklOSVRFOiAwLFxuICBNRU5VX1JFVFJZX0RFTEFZOiAxMDAsXG4gIFBIQU5UT01fV0lORE9XX0NIRUNLOiA1MDAsXG59IGFzIGNvbnN0O1xuXG4vKiogUmV0cnkgY291bnRzICovXG5leHBvcnQgY29uc3QgUkVUUllfTElNSVRTID0ge1xuICBNSU5JUExBWUVSX1NXSVRDSDogNSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBEZWZhdWx0IGRpbWVuc2lvbnMgZm9yIFBpUCB3aW5kb3cgKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RJTUVOU0lPTlMgPSB7XG4gIFBJUF9XSURUSDogNDgwLFxuICBQSVBfSEVJR0hUOiAyNzAsXG4gIFBJUF9FWFBBTkRFRF9IRUlHSFQ6IDYwMCxcbn0gYXMgY29uc3Q7XG5cbi8qKiBEZWZhdWx0IGRpbWVuc2lvbnMgZm9yIGVtYmVkIGlmcmFtZSAoZmFsbGJhY2sgd2hlbiBwbGF5ZXIgc2l6ZSB1bmtub3duKSAqL1xuZXhwb3J0IGNvbnN0IEVNQkVEX0lGUkFNRV9ERUZBVUxUUyA9IHtcbiAgV0lEVEg6IDQwMCxcbiAgSEVJR0hUOiAyMjUsXG59IGFzIGNvbnN0O1xuIiwiLyoqXG4gKiBDb25zdGFudHMgZm9yIGNvbnRleHQgbWVudSBcIkNvcHlcIiBwYXlsb2FkcyAoVVJMcywgaWZyYW1lLCBxdWVyeSBwYXJhbXMpLlxuICovXG5cbi8qKiBCYXNlIFVSTCBmb3Igc2hvcnQgWW91VHViZSBsaW5rcyAqL1xuZXhwb3J0IGNvbnN0IFlPVVRVQkVfU0hPUlRfQkFTRSA9ICdodHRwczovL3lvdXR1LmJlJztcblxuLyoqIEJhc2UgVVJMIGZvciBlbWJlZCBwbGF5ZXIgKi9cbmV4cG9ydCBjb25zdCBZT1VUVUJFX0VNQkVEX0JBU0UgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQnO1xuXG4vKiogUXVlcnkgcGFyYW0gbmFtZXMgZm9yIGNvcHkgcGF5bG9hZCBVUkxzICovXG5leHBvcnQgY29uc3QgQ09QWV9QQVlMT0FEX1FVRVJZID0ge1xuICBMSVNUOiAnbGlzdCcsXG4gIFRJTUU6ICd0Jyxcbn0gYXMgY29uc3Q7XG5cbi8qKiBFc2NhcGVkIGRvdWJsZSBxdW90ZSBmb3IgaWZyYW1lIHRpdGxlIGF0dHJpYnV0ZSAqL1xuZXhwb3J0IGNvbnN0IElGUkFNRV9USVRMRV9RVU9UID0gJyZxdW90Oyc7XG5cbi8qKiBpZnJhbWUgYWxsb3cgYXR0cmlidXRlIHZhbHVlICovXG5leHBvcnQgY29uc3QgSUZSQU1FX0FMTE9XID1cbiAgJ2FjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmU7IHdlYi1zaGFyZSc7XG5cbi8qKiBpZnJhbWUgcmVmZXJyZXJwb2xpY3kgdmFsdWUgKi9cbmV4cG9ydCBjb25zdCBJRlJBTUVfUkVGRVJSRVJfUE9MSUNZID0gJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nO1xuIiwiLyoqXG4gKiBZb3VUdWJlIEFQSSBjb25zdGFudHNcbiAqL1xuXG4vKiogWW91VHViZSBwbGF5ZXIgc3RhdGVzICovXG5leHBvcnQgY29uc3QgUExBWUVSX1NUQVRFUyA9IHtcbiAgVU5TVEFSVEVEOiAtMSxcbiAgRU5ERUQ6IDAsXG4gIFBMQVlJTkc6IDEsXG4gIFBBVVNFRDogMixcbiAgQlVGRkVSSU5HOiAzLFxuICBDVUVEOiA1LFxufSBhcyBjb25zdDtcblxuLyoqIFlvdVR1YmUgZXZlbnQgbmFtZXMgKi9cbmV4cG9ydCBjb25zdCBZVF9FVkVOVFMgPSB7XG4gIEFDVElPTjogJ3l0LWFjdGlvbicsXG4gIE5BVklHQVRFOiAneXQtbmF2aWdhdGUnLFxufSBhcyBjb25zdDtcblxuLyoqIFlvdVR1YmUgYWN0aW9uIG5hbWVzIGZvciBmaXJlKCkgKi9cbmV4cG9ydCBjb25zdCBZVF9BQ1RJT05fTkFNRVMgPSB7XG4gIEFDVElWQVRFX01JTklQTEFZRVI6ICd5dC1hY3RpdmF0ZS1taW5pcGxheWVyJyxcbiAgQUNUSVZBVEVfTUlOSVBMQVlFUl9GUk9NX1dBVENIOiAneXQtYWN0aXZhdGUtbWluaXBsYXllci1mcm9tLXdhdGNoLWFjdGlvbicsXG59IGFzIGNvbnN0O1xuXG4vKiogWW91VHViZSBsaWtlL2Rpc2xpa2UgYWN0aW9uIHR5cGVzICovXG5leHBvcnQgY29uc3QgWVRfTElLRV9BQ1RJT05TID0ge1xuICBMSUtFOiAnTElLRScsXG4gIERJU0xJS0U6ICdESVNMSUtFJyxcbiAgUkVNT1ZFOiAnSU5ESUZGRVJFTlQnLFxufSBhcyBjb25zdDtcblxuLyoqIFlvdVR1YmUgYWN0aW9uIHR5cGVzIChnZW5lcmFsLXB1cnBvc2UsIGV4dGVuc2libGUpICovXG5leHBvcnQgY29uc3QgWVRfQUNUSU9OUyA9IHtcbiAgLi4uWVRfTElLRV9BQ1RJT05TLFxufSBhcyBjb25zdDtcblxuLyoqIFlvdVR1YmUgd2ViIHBhZ2UgdHlwZXMgKi9cbmV4cG9ydCBjb25zdCBXRUJfUEFHRV9UWVBFUyA9IHtcbiAgV0FUQ0g6ICdXRUJfUEFHRV9UWVBFX1dBVENIJyxcbn0gYXMgY29uc3Q7XG5cbi8qKiBZb3VUdWJlIHJvb3QgdmlzdWFsIGVsZW1lbnQgSUQgKi9cbmV4cG9ydCBjb25zdCBST09UX1ZFID0gMzgzMjtcbiIsIi8qKlxuICogVUktcmVsYXRlZCBjb25zdGFudHNcbiAqL1xuXG4vKiogUGxheWVyIGNvbnRleHQgbWVudSBjb3B5LWl0ZW0gaW5kaWNlcyAoLnl0cC1wYW5lbC1tZW51IC55dHAtbWVudWl0ZW0pICovXG5leHBvcnQgY29uc3QgQ09QWV9NRU5VX0lORElDRVMgPSB7XG4gIFZJREVPX1VSTDogMixcbiAgVVJMX0FUX1RJTUU6IDMsXG4gIEVNQkVEOiA0LFxuICBERUJVR19JTkZPOiA1LFxufSBhcyBjb25zdDtcblxuLyoqIE1vdXNlIGJ1dHRvbiBjb2RlcyAoTW91c2VFdmVudC5idXR0b24pICovXG5leHBvcnQgY29uc3QgTU9VU0VfQlVUVE9OUyA9IHtcbiAgUFJJTUFSWTogMCwgLy8gTGVmdCBidXR0b25cbiAgQVVYSUxJQVJZOiAxLCAvLyBNaWRkbGUgYnV0dG9uICh3aGVlbClcbiAgU0VDT05EQVJZOiAyLCAvLyBSaWdodCBidXR0b25cbiAgRk9VUlRIOiAzLCAvLyBCcm93c2VyIGJhY2tcbiAgRklGVEg6IDQsIC8vIEJyb3dzZXIgZm9yd2FyZFxufSBhcyBjb25zdDtcbiIsIi8qKlxuICogTWV0YWRhdGEgc3RvcmFnZSBmb3IgREkgZGVjb3JhdG9ycyAobm8gcmVmbGVjdC1tZXRhZGF0YSBkZXBlbmRlbmN5KVxuICovXG5cbmltcG9ydCB0eXBlIHsgU2VydmljZUlkIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IHBhcmFtTWV0YWRhdGEgPSBuZXcgV2Vha01hcDxvYmplY3QsIFNlcnZpY2VJZFtdPigpO1xuY29uc3QgaW5qZWN0YWJsZUNsYXNzZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRQYXJhbU1ldGFkYXRhKHRhcmdldDogb2JqZWN0LCBpbmRleDogbnVtYmVyLCB0b2tlbjogU2VydmljZUlkKTogdm9pZCB7XG4gIGNvbnN0IGV4aXN0aW5nID0gcGFyYW1NZXRhZGF0YS5nZXQodGFyZ2V0KSA/PyBbXTtcbiAgZXhpc3RpbmdbaW5kZXhdID0gdG9rZW47XG4gIHBhcmFtTWV0YWRhdGEuc2V0KHRhcmdldCwgZXhpc3RpbmcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyYW1NZXRhZGF0YSh0YXJnZXQ6IG9iamVjdCk6IFNlcnZpY2VJZFtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBhcmFtTWV0YWRhdGEuZ2V0KHRhcmdldCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbmplY3RhYmxlKHRhcmdldDogb2JqZWN0KTogdm9pZCB7XG4gIGluamVjdGFibGVDbGFzc2VzLmFkZCh0YXJnZXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbmplY3RhYmxlKHRhcmdldDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpbmplY3RhYmxlQ2xhc3Nlcy5oYXModGFyZ2V0KTtcbn1cbiIsImltcG9ydCB7IHNldFBhcmFtTWV0YWRhdGEsIHNldEluamVjdGFibGUgfSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUlkIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogTWFya3MgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZm9yIGluamVjdGlvbi5cbiAqIEFjY2VwdHMgU3ltYm9sL3N0cmluZyB0b2tlbiBvciBjbGFzcyBjb25zdHJ1Y3RvciAoSW52ZXJzaWZ5LXN0eWxlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCh0b2tlbjogU2VydmljZUlkKSB7XG4gIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIF9rZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCwgaW5kZXg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIHNldFBhcmFtTWV0YWRhdGEodGFyZ2V0LCBpbmRleCwgdG9rZW4pO1xuICB9O1xufVxuXG4vKipcbiAqIE1hcmtzIGEgY2xhc3MgYXMgaW5qZWN0YWJsZSAoY2FuIGJlIHJlc29sdmVkIGJ5IGNvbnRhaW5lcilcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKCk6ICh0YXJnZXQ6IGFueSkgPT4gdm9pZCB7XG4gIHJldHVybiAodGFyZ2V0OiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICBzZXRJbmplY3RhYmxlKHRhcmdldCk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBERUJVR19GTEFHIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJy4vZGkvZGVjb3JhdG9ycyc7XG5cbi8qKlxuICogRm9ybWF0IGRhdGUgYXMgWVlZWS1NTS1ERDpISDptbTpzcy5TU1MgdXNpbmcgSW50bC5EYXRlVGltZUZvcm1hdFxuICovXG5jb25zdCB0aW1lc3RhbXBGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tQ0EnLCB7XG4gIHllYXI6ICdudW1lcmljJyxcbiAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgZGF5OiAnMi1kaWdpdCcsXG4gIGhvdXI6ICcyLWRpZ2l0JyxcbiAgbWludXRlOiAnMi1kaWdpdCcsXG4gIHNlY29uZDogJzItZGlnaXQnLFxuICBob3VyMTI6IGZhbHNlLFxufSk7XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWVzdGFtcChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgLy8gSW50bC5EYXRlVGltZUZvcm1hdCBvdXRwdXRzOiBcIjIwMjYtMDEtMjcsIDEyOjM0OjU2XCJcbiAgLy8gQWRkIG1pbGxpc2Vjb25kcyBtYW51YWxseTogXCIyMDI2LTAxLTI3OjEyOjM0OjU2Ljc4OVwiXG4gIGNvbnN0IG1zID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJyk7XG4gIHJldHVybiB0aW1lc3RhbXBGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpLnJlcGxhY2UoJywgJywgJzonKSArICcuJyArIG1zO1xufVxuXG5jb25zdCBQUkVGSVhfQlJBTkQgPSAnW1lvdVR1YmUgUGlQXSc7XG5jb25zdCBQUkVGSVhfU0NPUEUgPSAoc2NvcGU6IHN0cmluZykgPT4gYFske3Njb3BlfV1gIGFzIGNvbnN0O1xuXG4vKiogVGltZXN0YW1wIFlZWVktTU0tREQ6SEg6bW06c3MuU1NTIOKAkyBibHVlICovXG5jb25zdCBTVFlMRV9USU1FU1RBTVAgPSAnY29sb3I6ICMzYjgyZjY7IGZvbnQtd2VpZ2h0OiA1MDA7Jztcbi8qKiBbWW91VHViZSBQaVBdIOKAkyBpbmRpZ28sIGJvbGQgKi9cbmNvbnN0IFNUWUxFX0JSQU5EID0gJ2NvbG9yOiAjNjM2NmYxOyBmb250LXdlaWdodDogNjAwOyc7XG4vKiogW3Njb3BlXSDigJMgYW1iZXIgKi9cbmNvbnN0IFNUWUxFX1NDT1BFID0gJ2NvbG9yOiAjZjU5ZTBiOyBmb250LXdlaWdodDogNTAwOyc7XG4vKiogSW5mbyAobG9nKSBtZXNzYWdlIOKAkyBsaWdodCBncmVlbiAqL1xuY29uc3QgU1RZTEVfTVNHX0lORk8gPSAnY29sb3I6ICM4NmVmYWM7Jztcbi8qKiBXYXJuIG1lc3NhZ2Ug4oCTIGxpZ2h0IHllbGxvdyAqL1xuY29uc3QgU1RZTEVfTVNHX1dBUk4gPSAnY29sb3I6ICNmZGUwNDc7Jztcbi8qKiBFcnJvciBtZXNzYWdlIOKAkyBsaWdodCByZWQgKi9cbmNvbnN0IFNUWUxFX01TR19FUlJPUiA9ICdjb2xvcjogI2Y4NzE3MTsnO1xuLyoqIERlYnVnIG1lc3NhZ2Ug4oCTIG11dGVkIGdyYXkgKi9cbmNvbnN0IFNUWUxFX01TR19ERUJVRyA9ICdjb2xvcjogI2ExYTFhYTsnO1xuXG4vKipcbiAqIExvZ2dlciBjbGFzcyBmb3IgY29uZGl0aW9uYWwgY29uc29sZSBsb2dnaW5nIHdpdGggbW9kdWxlIHNjb3BlLlxuICogT25seSBsb2dzIHdoZW4gREVCVUdfRkxBRyBpcyBzZXQgaW4gbG9jYWxTdG9yYWdlIChleGNlcHQgZXJyb3IsIGFsd2F5cyBsb2dnZWQpLlxuICogVXNlcyAlYyBzdHlsaW5nOiBbWW91VHViZSBQaVBdIC8gW3Njb3BlXSAvIG1lc3NhZ2UgaW4gc2VwYXJhdGUgY29sb3JzLlxuICogTWVzc2FnZSBhbmQgb3B0aW9uYWwgbWV0YWRhdGEgYXJlIHBhc3NlZCB0byBjb25zb2xlIGFzLWlzIChvYmplY3RzIHN0YXkgZXhwYW5kYWJsZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZXMgPSBuZXcgTWFwPHN0cmluZywgTG9nZ2VyPigpO1xuICBwcml2YXRlIHN0YXRpYyBlbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIHN0b3JhZ2VMaXN0ZW5lckFkZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhdGljIGdsb2JhbE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjb3BlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1vZHVsZSBzY29wZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2Uoc2NvcGU6IHN0cmluZyk6IExvZ2dlciB7XG4gICAgaWYgKCFMb2dnZXIuc3RvcmFnZUxpc3RlbmVyQWRkZWQpIHtcbiAgICAgIExvZ2dlci5lbmFibGVkID0gTG9nZ2VyLmNoZWNrRGVidWdGbGFnKCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsICgpID0+IHtcbiAgICAgICAgTG9nZ2VyLmVuYWJsZWQgPSBMb2dnZXIuY2hlY2tEZWJ1Z0ZsYWcoKTtcbiAgICAgIH0pO1xuICAgICAgTG9nZ2VyLnN0b3JhZ2VMaXN0ZW5lckFkZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgaW5zdGFuY2UgPSBMb2dnZXIuaW5zdGFuY2VzLmdldChzY29wZSk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgTG9nZ2VyKHNjb3BlKTtcbiAgICAgIExvZ2dlci5pbnN0YW5jZXMuc2V0KHNjb3BlLCBpbnN0YW5jZSk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNoZWNrRGVidWdGbGFnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oREVCVUdfRkxBRykgPT09ICd0cnVlJztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGdsb2JhbCBtZXRhZGF0YSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGxvZyBtZXNzYWdlcy5cbiAgICogU2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0R2xvYmFsTWV0YWRhdGEobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgTG9nZ2VyLmdsb2JhbE1ldGFkYXRhID0geyAuLi5tZXRhZGF0YSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdHlsZWQoXG4gICAgZm46ICh0ZW1wbGF0ZTogc3RyaW5nLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHZvaWQsXG4gICAgbXNnU3R5bGU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgbWV0YT86IHVua25vd25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdHMgPSBmb3JtYXRUaW1lc3RhbXAobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZXNjYXBlZCA9IG1lc3NhZ2UucmVwbGFjZSgvJS9nLCAnJSUnKTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGAlYyR7dHN9JWMgJHtQUkVGSVhfQlJBTkR9JWMke1BSRUZJWF9TQ09QRSh0aGlzLnNjb3BlKX0lYyAke2VzY2FwZWR9YDtcblxuICAgIC8vIEJ1aWxkIGFyZ3VtZW50czogdGVtcGxhdGUsIHN0eWxlcywgbWV0YSAoaWYgcHJvdmlkZWQpLCBnbG9iYWwgbWV0YWRhdGEgKGlmIGV4aXN0cylcbiAgICBjb25zdCBhcmdzOiBbc3RyaW5nLCAuLi51bmtub3duW11dID0gW1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBTVFlMRV9USU1FU1RBTVAsXG4gICAgICBTVFlMRV9CUkFORCxcbiAgICAgIFNUWUxFX1NDT1BFLFxuICAgICAgbXNnU3R5bGUsXG4gICAgXTtcblxuICAgIC8vIEFkZCB1c2VyLXByb3ZpZGVkIG1ldGFkYXRhIGZpcnN0XG4gICAgaWYgKG1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5wdXNoKG1ldGEpO1xuICAgIH1cblxuICAgIC8vIEFkZCBnbG9iYWwgbWV0YWRhdGEgYWZ0ZXIgdXNlciBtZXRhZGF0YSAoaWYgZXhpc3RzKVxuICAgIGlmIChPYmplY3Qua2V5cyhMb2dnZXIuZ2xvYmFsTWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIGFyZ3MucHVzaChMb2dnZXIuZ2xvYmFsTWV0YWRhdGEpO1xuICAgIH1cblxuICAgIGZuKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyBtZXNzYWdlIGlmIGRlYnVnIGlzIGVuYWJsZWQuIEluZm8gbGV2ZWwg4oCTIGxpZ2h0IGdyZWVuLiBPcHRpb25hbCBtZXRhZGF0YSBhcyBzZWNvbmQgYXJnLlxuICAgKi9cbiAgcHVibGljIGxvZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKExvZ2dlci5lbmFibGVkKSB7XG4gICAgICB0aGlzLnN0eWxlZChjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLCBTVFlMRV9NU0dfSU5GTywgbWVzc2FnZSwgbWV0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyB3YXJuaW5nIGlmIGRlYnVnIGlzIGVuYWJsZWQuIE9wdGlvbmFsIG1ldGFkYXRhIGFzIHNlY29uZCBhcmcuXG4gICAqL1xuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKExvZ2dlci5lbmFibGVkKSB7XG4gICAgICB0aGlzLnN0eWxlZChjb25zb2xlLndhcm4uYmluZChjb25zb2xlKSwgU1RZTEVfTVNHX1dBUk4sIG1lc3NhZ2UsIG1ldGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgZXJyb3IgKGFsd2F5cyBsb2dnZWQsIHJlZ2FyZGxlc3Mgb2YgZGVidWcgZmxhZykuIE9wdGlvbmFsIG1ldGFkYXRhIGFzIHNlY29uZCBhcmcuXG4gICAqL1xuICBwdWJsaWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuc3R5bGVkKGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKSwgU1RZTEVfTVNHX0VSUk9SLCBtZXNzYWdlLCBtZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgZGVidWcgbWVzc2FnZSBpZiBkZWJ1ZyBpcyBlbmFibGVkLiBPcHRpb25hbCBtZXRhZGF0YSBhcyBzZWNvbmQgYXJnLlxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoTG9nZ2VyLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc3R5bGVkKGNvbnNvbGUuZGVidWcuYmluZChjb25zb2xlKSwgU1RZTEVfTVNHX0RFQlVHLCBtZXNzYWdlLCBtZXRhKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBMb2dnZXIgaW5zdGFuY2VzIGJ5IHNjb3BlLiBJbmplY3RlZCB2aWEgREkgKHRyYW5zaWVudCkuXG4gKi9cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2dnZXJGYWN0b3J5IHtcbiAgcHVibGljIGNyZWF0ZShzY29wZTogc3RyaW5nKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gTG9nZ2VyLmdldEluc3RhbmNlKHNjb3BlKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgYXBwbGljYXRpb24gZXJyb3JzLlxuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgbGlrZSBzdGFjayB0cmFjZSBjYXB0dXJlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjYXVzZTogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNhdXNlPzogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcblxuICAgIC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgZm9yIHdoZXJlIG91ciBlcnJvciB3YXMgdGhyb3duIChvbmx5IGF2YWlsYWJsZSBvbiBWOClcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBwRXJyb3IgfSBmcm9tICcuL0FwcEVycm9yJztcblxuLyoqXG4gKiBFcnJvciB0aHJvd24gZm9yIGdlbmVyYWwgcnVudGltZSBlcnJvcnMgKG5vbi1pbml0aWFsaXphdGlvbikuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBSdW50aW1lRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY2F1c2U/OiB1bmtub3duKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICAgIHRoaXMubmFtZSA9ICdBcHBSdW50aW1lRXJyb3InO1xuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRQYXJhbU1ldGFkYXRhLCBpc0luamVjdGFibGUgfSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IsIFNlcnZpY2VJZCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQXBwUnVudGltZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL0FwcFJ1bnRpbWVFcnJvcic7XG5cbnR5cGUgU2NvcGUgPSAnc2luZ2xldG9uJyB8ICd0cmFuc2llbnQnO1xuXG5pbnRlcmZhY2UgQmluZGluZyB7XG4gIHRva2VuOiBTZXJ2aWNlSWQ7XG4gIGltcGxlbWVudGF0aW9uOiBDb25zdHJ1Y3RvcjtcbiAgc2NvcGU6IFNjb3BlO1xuICBpbnN0YW5jZT86IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBDb250YWluZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJpbmRpbmdzID0gbmV3IE1hcDxTZXJ2aWNlSWQsIEJpbmRpbmc+KCk7XG5cbiAgLyoqIEJpbmQgYnkgU3ltYm9sL3N0cmluZyB0b2tlbiBvciBieSBjbGFzcyBjb25zdHJ1Y3RvciAqL1xuICBwdWJsaWMgYmluZDxfVD4odG9rZW46IFNlcnZpY2VJZCk6IEJpbmRpbmdUbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiAoaW1wbGVtZW50YXRpb246IENvbnN0cnVjdG9yKSA9PiB7XG4gICAgICAgIHRoaXMuYmluZGluZ3Muc2V0KHRva2VuLCB7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgaW1wbGVtZW50YXRpb24sXG4gICAgICAgICAgc2NvcGU6ICdzaW5nbGV0b24nLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0b1NlbGY6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBBcHBSdW50aW1lRXJyb3IoJ3RvU2VsZigpIHJlcXVpcmVzIGEgY2xhc3MgY29uc3RydWN0b3IgYXMgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJpbmRpbmdzLnNldCh0b2tlbiwge1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIGltcGxlbWVudGF0aW9uOiB0b2tlbiBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgICBzY29wZTogJ3NpbmdsZXRvbicsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHRvVHJhbnNpZW50OiAoaW1wbGVtZW50YXRpb246IENvbnN0cnVjdG9yKSA9PiB7XG4gICAgICAgIHRoaXMuYmluZGluZ3Muc2V0KHRva2VuLCB7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgaW1wbGVtZW50YXRpb24sXG4gICAgICAgICAgc2NvcGU6ICd0cmFuc2llbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0b0luc3RhbmNlOiAoaW5zdGFuY2U6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhpcy5iaW5kaW5ncy5zZXQodG9rZW4sIHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgbmV4dCAtLSBmYWN0b3J5IG5ldmVyIGNhbGxlZCwgaW5zdGFuY2UgcmV0dXJuZWQgZGlyZWN0bHkgKi9cbiAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogKCgpID0+IGluc3RhbmNlKSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICAgIHNjb3BlOiAnc2luZ2xldG9uJyxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0PFQ+KHRva2VuOiBTZXJ2aWNlSWQsIHJlc29sdXRpb25TdGFjayA9IG5ldyBTZXQ8U2VydmljZUlkPigpKTogVCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMudG9rZW5OYW1lKHRva2VuKTtcbiAgICBjb25zdCBiaW5kaW5nID0gdGhpcy5iaW5kaW5ncy5nZXQodG9rZW4pO1xuXG4gICAgaWYgKCFiaW5kaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgQXBwUnVudGltZUVycm9yKGBObyBiaW5kaW5nIGZvciAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKGJpbmRpbmcuaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGJpbmRpbmcuaW5zdGFuY2UgYXMgVDtcbiAgICB9XG5cbiAgICBpZiAocmVzb2x1dGlvblN0YWNrLmhhcyh0b2tlbikpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gWy4uLnJlc29sdXRpb25TdGFjaywgdG9rZW5dLm1hcCgodCkgPT4gdGhpcy50b2tlbk5hbWUodCkpLmpvaW4oJyDihpIgJyk7XG4gICAgICB0aHJvdyBuZXcgQXBwUnVudGltZUVycm9yKGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAke2NoYWlufWApO1xuICAgIH1cblxuICAgIHJlc29sdXRpb25TdGFjay5hZGQodG9rZW4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBDdG9yID0gYmluZGluZy5pbXBsZW1lbnRhdGlvbjtcbiAgICAgIGlmICghaXNJbmplY3RhYmxlKEN0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBBcHBSdW50aW1lRXJyb3IoYCR7dGhpcy50b2tlbk5hbWUodG9rZW4pfSBtdXN0IGJlIGRlY29yYXRlZCB3aXRoIEBpbmplY3RhYmxlKClgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmFtVG9rZW5zID0gZ2V0UGFyYW1NZXRhZGF0YShDdG9yKSA/PyBbXTtcbiAgICAgIGNvbnN0IHBhcmFtQ291bnQgPSAoQ3RvciBhcyB7IGxlbmd0aDogbnVtYmVyIH0pLmxlbmd0aDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1Db3VudDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXJhbVRva2Vuc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFwcFJ1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGAke3RoaXMudG9rZW5OYW1lKHRva2VuKX06IGNvbnN0cnVjdG9yIHBhcmFtZXRlciBhdCBpbmRleCAke2l9IG11c3QgYmUgZGVjb3JhdGVkIHdpdGggQGluamVjdCh0b2tlbilgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYXJncyA9IHBhcmFtVG9rZW5zLm1hcCgodCkgPT4gdGhpcy5nZXQodCBhcyBTZXJ2aWNlSWQsIHJlc29sdXRpb25TdGFjaykpO1xuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyAoQ3RvciBhcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gVCkoLi4uYXJncyk7XG5cbiAgICAgIGlmIChiaW5kaW5nLnNjb3BlID09PSAnc2luZ2xldG9uJykge1xuICAgICAgICBiaW5kaW5nLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzb2x1dGlvblN0YWNrLmRlbGV0ZSh0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b2tlbk5hbWUodG9rZW46IFNlcnZpY2VJZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0b2tlbiA9PT0gJ2Z1bmN0aW9uJyA/IHRva2VuLm5hbWUgfHwgJ2Fub255bW91cycgOiBTdHJpbmcodG9rZW4pO1xuICB9XG5cbiAgcHVibGljIHVuYmluZCh0b2tlbjogU2VydmljZUlkKTogdm9pZCB7XG4gICAgdGhpcy5iaW5kaW5ncy5kZWxldGUodG9rZW4pO1xuICB9XG59XG5cbmludGVyZmFjZSBCaW5kaW5nVG8ge1xuICB0byhpbXBsZW1lbnRhdGlvbjogQ29uc3RydWN0b3IpOiB2b2lkO1xuICB0b1NlbGYoKTogdm9pZDtcbiAgdG9UcmFuc2llbnQoaW1wbGVtZW50YXRpb246IENvbnN0cnVjdG9yKTogdm9pZDtcbiAgdG9JbnN0YW5jZShpbnN0YW5jZTogdW5rbm93bik6IHZvaWQ7XG59XG4iLCJpbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgVElNRU9VVFMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwUnVudGltZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL0FwcFJ1bnRpbWVFcnJvcic7XG5pbXBvcnQgdHlwZSB7IERvY3VtZW50T3JFbGVtZW50LCBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL2FwcCc7XG5cbmNvbnN0IGxvZ2dlciA9IExvZ2dlci5nZXRJbnN0YW5jZSgnRE9NVXRpbHMnKTtcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBET00gb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgRE9NVXRpbHMge1xuICAvKipcbiAgICogQ3JlYXRlIGEgY29tbWVudCBub2RlIHRvIHVzZSBhcyBhIHBsYWNlaG9sZGVyIChlLmcuIGJlZm9yZSBtb3ZpbmcgYW4gZWxlbWVudCBlbHNld2hlcmUpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQbGFjZWhvbGRlcihjb21tZW50VGV4dDogc3RyaW5nKTogQ29tbWVudCB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY29tbWVudFRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBwbGFjZWhvbGRlciBiZWZvcmUgZWxlbWVudC4gRWxlbWVudCBzdGF5cyBpbiBET007IGNhbGxlciB0eXBpY2FsbHkgbW92ZXMgaXQuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgaW5zZXJ0ZWQsIGZhbHNlIGlmIGVsZW1lbnQgaGFzIG5vIHBhcmVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbnNlcnRQbGFjZWhvbGRlckJlZm9yZShlbGVtZW50OiBOb2RlLCBwbGFjZWhvbGRlcjogQ29tbWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ2luc2VydFBsYWNlaG9sZGVyQmVmb3JlOiBlbGVtZW50IGhhcyBubyBwYXJlbnQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShwbGFjZWhvbGRlciwgZWxlbWVudCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdQbGFjZWhvbGRlciBpbnNlcnRlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgZWxlbWVudCBpbiBwbGFjZSBvZiBwbGFjZWhvbGRlciwgdGhlbiByZW1vdmUgcGxhY2Vob2xkZXIuXG4gICAqIFVzZSBhZnRlciBtb3ZpbmcgZWxlbWVudCBiYWNrIGZyb20gYW5vdGhlciBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc3RvcmVFbGVtZW50RnJvbVBsYWNlaG9sZGVyKGVsZW1lbnQ6IE5vZGUsIHBsYWNlaG9sZGVyOiBDb21tZW50KTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50ID0gcGxhY2Vob2xkZXIucGFyZW50Tm9kZTtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ3Jlc3RvcmVFbGVtZW50RnJvbVBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlciBoYXMgbm8gcGFyZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCwgcGxhY2Vob2xkZXIpO1xuICAgIHBsYWNlaG9sZGVyLnJlbW92ZSgpO1xuICAgIGxvZ2dlci5kZWJ1ZygnRWxlbWVudCByZXN0b3JlZCBmcm9tIHBsYWNlaG9sZGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhbGwgYXR0cmlidXRlcyBmcm9tIHNvdXJjZSBlbGVtZW50IHRvIHRhcmdldCBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvcHlBdHRyaWJ1dGVzKHNvdXJjZTogTnVsbGFibGU8RWxlbWVudD4sIHRhcmdldDogTnVsbGFibGU8RWxlbWVudD4pOiB2b2lkIHtcbiAgICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0KSB7XG4gICAgICBsb2dnZXIud2FybignY29weUF0dHJpYnV0ZXM6IHNvdXJjZSBvciB0YXJnZXQgaXMgbnVsbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBBcnJheS5mcm9tKHNvdXJjZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShhdHRyLm5vZGVOYW1lLCBhdHRyLm5vZGVWYWx1ZSB8fCAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGNvcHkgYXR0cmlidXRlICR7YXR0ci5ub2RlTmFtZX06YCwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdBdHRyaWJ1dGVzIGNvcGllZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNvcHlpbmcgYXR0cmlidXRlczonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29weSB0ZXh0IHRvIGNsaXBib2FyZCB2aWEgdGVtcG9yYXJ5IHRleHRhcmVhIGFuZCBleGVjQ29tbWFuZCgnY29weScpLlxuICAgKiBVc2Ugd2hlbiBDbGlwYm9hcmQgQVBJIGlzIHVuYXZhaWxhYmxlIG9yIGNvcHkgbXVzdCBydW4gaW4gYSBzcGVjaWZpYyBkb2N1bWVudCAoZS5nLiBQaVApLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGV4ZWNDb21tYW5kKCdjb3B5Jykgc3VjY2VlZGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvcHlWaWFUZXh0YXJlYShkb2M6IERvY3VtZW50LCB0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIGVsLnZhbHVlID0gdGV4dDtcbiAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2xlZnQ6LTk5OTlweDt0b3A6MDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTsnO1xuICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICBlbC5mb2N1cygpO1xuICAgIGVsLnNlbGVjdCgpO1xuICAgIGxldCBvayA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBvayA9IGRvYy5leGVjQ29tbWFuZCgnY29weScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICAgIGVsLnJlbW92ZSgpO1xuICAgIHJldHVybiBvaztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbndyYXAgZWxlbWVudCBieSBtb3ZpbmcgYWxsIGNoaWxkcmVuIHRvIHBhcmVudCBhbmQgcmVtb3Zpbmcgd3JhcHBlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bndyYXAod3JhcHBlcjogTnVsbGFibGU8RWxlbWVudD4pOiB2b2lkIHtcbiAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCd1bndyYXA6IHdyYXBwZXIgaXMgbnVsbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IHdyYXBwZXIucGFyZW50Tm9kZTtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ3Vud3JhcDogRWxlbWVudCBoYXMgbm8gcGFyZW50IG5vZGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gTW92ZSBhbGwgY2hpbGQgbm9kZXMgYmVmb3JlIHRoZSB3cmFwcGVyXG4gICAgICB3aGlsZSAod3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUod3JhcHBlci5maXJzdENoaWxkLCB3cmFwcGVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHRoZSBub3ctZW1wdHkgd3JhcHBlclxuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdFbGVtZW50IHVud3JhcHBlZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIHVud3JhcHBpbmcgZWxlbWVudDonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgZWxlbWVudCB0byBhcHBlYXIgaW4gRE9NIHVzaW5nIHNlbGVjdG9yXG4gICAqIEBwYXJhbSBzZWxlY3RvciBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgZWxlbWVudCB0byBzZWFyY2ggaW4gKGRlZmF1bHQ6IGRvY3VtZW50KVxuICAgKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoMCA9IGluZmluaXRlKVxuICAgKiBAcGFyYW0gdGFyZ2V0V2luZG93IFdoZW4gdGltZW91dCBpcyAwLCBkaXNjb25uZWN0IG9ic2VydmVyIG9uIHRoaXMgd2luZG93J3MgcGFnZWhpZGUgKGUuZy4gUGlQIHdpbmRvdylcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGZvdW5kIGVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgd2FpdEZvckVsZW1lbnRTZWxlY3RvcjxUIGV4dGVuZHMgRWxlbWVudD4oXG4gICAgc2VsZWN0b3I6IHN0cmluZyxcbiAgICBwYXJlbnQ6IERvY3VtZW50T3JFbGVtZW50ID0gZG9jdW1lbnQsXG4gICAgdGltZW91dDogbnVtYmVyID0gVElNRU9VVFMuRUxFTUVOVF9XQUlULFxuICAgIHRhcmdldFdpbmRvdz86IFdpbmRvdyB8IG51bGxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIGVsZW1lbnQgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3I8VD4oc2VsZWN0b3IpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudCBmb3VuZCBpbW1lZGlhdGVseTogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXhpc3RpbmcpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZGVidWcoYFdhaXRpbmcgZm9yIGVsZW1lbnQ6ICR7c2VsZWN0b3J9YCk7XG5cbiAgICAgIC8vIENyZWF0ZSBvYnNlcnZlciB0byB3YXRjaCBmb3IgZWxlbWVudFxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoXywgb2JzKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwYXJlbnQucXVlcnlTZWxlY3RvcjxUPihzZWxlY3Rvcik7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFbGVtZW50IGFwcGVhcmVkOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgIG9icy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgcmVzb2x2ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIE9ic2VydmUgdGhlIHBhcmVudCBmb3IgY2hhbmdlc1xuICAgICAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXJlbnQgPT09IGRvY3VtZW50ID8gZG9jdW1lbnQuYm9keSA6IHBhcmVudDtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHJlamVjdChuZXcgQXBwUnVudGltZUVycm9yKGBUYXJnZXQgZWxlbWVudCBub3QgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHRpbWVvdXQgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHJlamVjdChuZXcgQXBwUnVudGltZUVycm9yKGBUaW1lb3V0OiAke3NlbGVjdG9yfSBub3QgZm91bmRgKSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgaW5maW5pdGUgdGltZW91dDogZGlzY29ubmVjdCBhbmQgcmVqZWN0IHdoZW4gdGFyZ2V0V2luZG93IGZpcmVzIHBhZ2VoaWRlIChlLmcuIFBpUCBjbG9zZWQpXG4gICAgICBpZiAodGltZW91dCA9PT0gMCAmJiB0YXJnZXRXaW5kb3cgJiYgIXRhcmdldFdpbmRvdy5jbG9zZWQpIHtcbiAgICAgICAgdGFyZ2V0V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ3BhZ2VoaWRlJyxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICByZWplY3QobmV3IEFwcFJ1bnRpbWVFcnJvcignV2FpdCBhYm9ydGVkOiB0YXJnZXQgd2luZG93IGNsb3NlZCcpKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogRE9NIHNlbGVjdG9ycyDigJMgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICovXG5cbmV4cG9ydCBjb25zdCBTRUxFQ1RPUlMgPSB7XG4gIE1JTklQTEFZRVI6ICd5dGQtbWluaXBsYXllcicsXG4gIE1JTklQTEFZRVJfQ09OVEFJTkVSOiAneXRkLW1pbmlwbGF5ZXItcGxheWVyLWNvbnRhaW5lcicsXG4gIE1JTklQTEFZRVJfSE9TVDogJy55dGRNaW5pcGxheWVyQ29tcG9uZW50SG9zdC55dGRNaW5pcGxheWVyQ29tcG9uZW50VmlzaWJsZScsXG4gIE1PVklFX1BMQVlFUjogJyNtb3ZpZV9wbGF5ZXInLFxuICAvKiogPHZpZGVvPiBlbGVtZW50IGluc2lkZSB0aGUgcGxheWVyIChxdWVyeSByZWxhdGl2ZSB0byBwbGF5ZXIgcm9vdCkgKi9cbiAgUExBWUVSX1ZJREVPOiAndmlkZW8nLFxuICBZVERfQVBQOiAneXRkLWFwcCcsXG4gIFlUX0RSQUdHQUJMRTogJ3l0LWRyYWdnYWJsZScsXG4gIENPTlRFWFRfTUVOVTogJy55dHAtcG9wdXAueXRwLWNvbnRleHRtZW51JyxcbiAgQ09OVEVYVF9NRU5VX0NPTlRBSU5FUjogJy55dHAtY29udGV4dG1lbnUnLFxuICBNRU5VX0lURU06ICcueXRwLW1lbnVpdGVtJyxcbiAgUEFORUxfTUVOVTogJy55dHAtcGFuZWwtbWVudScsXG4gIFBBTkVMX01FTlVfSVRFTVM6ICcueXRwLXBhbmVsLW1lbnUgPiAueXRwLW1lbnVpdGVtJyxcbiAgTUVOVV9CVVRUT046ICcueXQtc3BlYy1idXR0b24tc2hhcGUtbmV4dFthcmlhLWV4cGFuZGVkXScsXG4gIFBMQVlMSVNUX1BBTkVMOiAnLnl0ZE1pbmlwbGF5ZXJDb21wb25lbnRQbGF5bGlzdFBhbmVsJyxcbiAgUFJPR1JFU1NfQkFSOiAnLnl0cC1wcm9ncmVzcy1iYXInLFxuICBMSUtFX0JVVFRPTjogJ3l0ZC1zbGltLW1ldGFkYXRhLXRvZ2dsZS1idXR0b24tcmVuZGVyZXInLFxuICBCVVRUT05fU0hBUEU6ICcueXQtc3BlYy1idXR0b24tc2hhcGUtbmV4dCcsXG4gIFNJTVBMRV9FTkRQT0lOVDogJy55dC1zaW1wbGUtZW5kcG9pbnQnLFxuICBCVVRUT046ICdidXR0b24nLFxuICBTVFlMRVNIRUVUUzogJ3N0eWxlLCBsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nLFxuICBOT1RJRklDQVRJT05fVE9QQkFSX0JVVFRPTl9SRU5ERVJFUjogJ3l0ZC1ub3RpZmljYXRpb24tdG9wYmFyLWJ1dHRvbi1yZW5kZXJlcicsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTZWxlY3RvciA9ICh0eXBlb2YgU0VMRUNUT1JTKVtrZXlvZiB0eXBlb2YgU0VMRUNUT1JTXTtcbiIsImltcG9ydCB7IEFwcEVycm9yIH0gZnJvbSAnLi9BcHBFcnJvcic7XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIGR1cmluZyBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcEluaXRpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY2F1c2U/OiB1bmtub3duKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICAgIHRoaXMubmFtZSA9ICdBcHBJbml0aWFsaXphdGlvbkVycm9yJztcbiAgfVxufVxuIiwiaW1wb3J0IHsgWW91VHViZVBsYXllciwgVmlkZW9EYXRhLCBQbGF5ZXJTdGF0ZSwgUGxheWVyU2l6ZSB9IGZyb20gJy4uL3R5cGVzL3lvdXR1YmUnO1xuaW1wb3J0IHsgUExBWUVSX1NUQVRFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gJy4uL3V0aWxzL0RPTVV0aWxzJztcbmltcG9ydCB7IFRJTUVPVVRTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNFTEVDVE9SUyB9IGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IEFwcEluaXRpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvQXBwSW5pdGlhbGl6YXRpb25FcnJvcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJy4uL2RpJztcblxuLyoqXG4gKiBNYW5hZ2VzIHBsYXllciBzdGF0ZSBhbmQgb3BlcmF0aW9ucy5cbiAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBwbGF5ZXIgRE9NIGVsZW1lbnQsIGluaXRpYWxpemVkIGF0IGFwcCBzdGFydHVwLlxuICogVGhlIHJlZmVyZW5jZSBwZXJzaXN0cyB3aGVuIHRoZSBwbGF5ZXIgbW92ZXMgYmV0d2VlbiBtYWluIHdpbmRvdyBhbmQgUGlQLlxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGxheWVyTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgcGxheWVyOiBOdWxsYWJsZTxZb3VUdWJlUGxheWVyPiA9IG51bGw7XG4gIHByaXZhdGUgd2FzUGxheWluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHdhc01pbmlQbGF5ZXJBY3RpdmVCZWZvcmVQaVA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnkpIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlckZhY3RvcnkuY3JlYXRlKCdQbGF5ZXJNYW5hZ2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBwbGF5ZXIgcmVmZXJlbmNlIGZyb20gbWFpbiBkb2N1bWVudC4gQ2FsbCBhdCBhcHAgc3RhcnR1cC5cbiAgICogV2FpdHMgZm9yIG1vdmllX3BsYXllciB0byBhcHBlYXIgKGUuZy4gb24gd2F0Y2ggcGFnZSkuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbW92aWVfcGxheWVyIGVsZW1lbnQgbm90IGZvdW5kXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IERPTVV0aWxzLndhaXRGb3JFbGVtZW50U2VsZWN0b3I8WW91VHViZVBsYXllcj4oXG4gICAgICAgIFNFTEVDVE9SUy5NT1ZJRV9QTEFZRVIsXG4gICAgICAgIGRvY3VtZW50LFxuICAgICAgICBUSU1FT1VUUy5FTEVNRU5UX1dBSVRcbiAgICAgICk7XG4gICAgICB0aGlzLnBsYXllciA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnUGxheWVyIGluaXRpYWxpemVkJyk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBBcHBJbml0aWFsaXphdGlvbkVycm9yKGAke1NFTEVDVE9SUy5NT1ZJRV9QTEFZRVJ9IGVsZW1lbnQgbm90IGZvdW5kYCwgY2F1c2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBsYXllciBlbGVtZW50LiBBbHdheXMgZGVmaW5lZCBhZnRlciBpbml0aWFsaXplKCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0UGxheWVyKCk6IFlvdVR1YmVQbGF5ZXIge1xuICAgIHJldHVybiB0aGlzLnBsYXllciE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBsYXllciBzdGF0ZSAocGxheWluZy9wYXVzZWQpXG4gICAqL1xuICBwdWJsaWMgZ2V0UGxheWVyU3RhdGUocGxheWVyOiBZb3VUdWJlUGxheWVyKTogUGxheWVyU3RhdGUge1xuICAgIGlmICh0eXBlb2YgcGxheWVyLmdldFBsYXllclN0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignZ2V0UGxheWVyU3RhdGUgbWV0aG9kIG5vdCBmb3VuZCcpO1xuICAgICAgcmV0dXJuIFBMQVlFUl9TVEFURVMuVU5TVEFSVEVEO1xuICAgIH1cbiAgICByZXR1cm4gcGxheWVyLmdldFBsYXllclN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nXG4gICAqL1xuICBwdWJsaWMgaXNQbGF5aW5nKHBsYXllcjogWW91VHViZVBsYXllcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFBsYXllclN0YXRlKHBsYXllcikgPT09IFBMQVlFUl9TVEFURVMuUExBWUlORztcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGN1cnJlbnQgcGxheWluZyBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNhdmVQbGF5aW5nU3RhdGUocGxheWVyOiBZb3VUdWJlUGxheWVyKTogdm9pZCB7XG4gICAgdGhpcy53YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmcocGxheWVyKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUGxheWVyIHN0YXRlIHNhdmVkOiB3YXNQbGF5aW5nID0gJHt0aGlzLndhc1BsYXlpbmd9YCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgbWluaSBwbGF5ZXIgd2FzIGFjdGl2ZSB3aGVuIFBpUCB3YXMgb3BlbmVkLiBVc2VkIGJ5IFRpdGxlU3luY0hhbmRsZXIgdG8gc2tpcCBpbml0aWFsIHRpdGxlIHN5bmMuXG4gICAqL1xuICBwdWJsaWMgc2V0V2FzTWluaVBsYXllckFjdGl2ZUJlZm9yZVBpUCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMud2FzTWluaVBsYXllckFjdGl2ZUJlZm9yZVBpUCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgbWluaSBwbGF5ZXIgd2FzIHZpc2libGUgd2hlbiBQaVAgd2FzIG9wZW5lZC5cbiAgICovXG4gIHB1YmxpYyBnZXRXYXNNaW5pUGxheWVyQWN0aXZlQmVmb3JlUGlQKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndhc01pbmlQbGF5ZXJBY3RpdmVCZWZvcmVQaVA7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBwbGF5aW5nIHN0YXRlIGlmIGl0IHdhcyBwbGF5aW5nIGJlZm9yZVxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVQbGF5aW5nU3RhdGUocGxheWVyOiBZb3VUdWJlUGxheWVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdObyBuZWVkIHRvIHJlc3RvcmUgcGxheWluZyBzdGF0ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHBsYXllci5wbGF5VmlkZW8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coJ1BsYXliYWNrIHJlc3RvcmVkIGFmdGVyIHJldHVybiB0byBtYWluIHdpbmRvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ3BsYXllci5wbGF5VmlkZW8gbWV0aG9kIG5vdCBmb3VuZCwgY2Fubm90IHJlc3RvcmUgcGxheWJhY2snKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgcmVzdG9yaW5nIHBsYXliYWNrOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlkZW9EYXRhRnJvbVBsYXllcihwbGF5ZXI6IFlvdVR1YmVQbGF5ZXIpOiBOdWxsYWJsZTxWaWRlb0RhdGE+IHtcbiAgICBpZiAodHlwZW9mIHBsYXllci5nZXRWaWRlb0RhdGEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcGxheWVyLmdldFZpZGVvRGF0YSgpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpZGVvIElEIGZyb20gcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlkZW9JZCgpOiBOdWxsYWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2aWRlb0RhdGEgPSB0aGlzLmdldFZpZGVvRGF0YUZyb21QbGF5ZXIodGhpcy5nZXRQbGF5ZXIoKSk7XG4gICAgY29uc3QgdmlkZW9JZCA9IHZpZGVvRGF0YT8udmlkZW9faWQ7XG5cbiAgICBpZiAoIXZpZGVvSWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdWaWRlbyBJRCBub3QgZm91bmQsIGNhbm5vdCBuYXZpZ2F0ZScsIHsgcGxheWVyOiB0aGlzLmdldFBsYXllcigpIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpZGVvSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpZGVvIGRhdGEgKHZpZGVvX2lkLCB0aXRsZSwgbGlzdCkgZnJvbSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlkZW9EYXRhKCk6IE51bGxhYmxlPFZpZGVvRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpZGVvRGF0YUZyb21QbGF5ZXIodGhpcy5nZXRQbGF5ZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcGxheWJhY2sgdGltZSBpbiBzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIGdldEN1cnJlbnRUaW1lKCk6IG51bWJlciB7XG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5nZXRQbGF5ZXIoKTtcbiAgICBpZiAodHlwZW9mIHBsYXllci5nZXRDdXJyZW50VGltZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHQgPSBwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICBpZiAodHlwZW9mIHQgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odCkpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHQpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGxheWVyIHNpemUgKHdpZHRoLCBoZWlnaHQpLlxuICAgKi9cbiAgcHVibGljIGdldFBsYXllclNpemUoKTogTnVsbGFibGU8UGxheWVyU2l6ZT4ge1xuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuZ2V0UGxheWVyKCk7XG4gICAgaWYgKHR5cGVvZiBwbGF5ZXIuZ2V0UGxheWVyU2l6ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwbGF5ZXIuZ2V0UGxheWVyU2l6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZWJ1ZyBpbmZvcm1hdGlvbiBzdHJpbmcgZnJvbSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGVidWdJbmZvKCk6IE51bGxhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuZ2V0UGxheWVyKCk7XG4gICAgaWYgKHR5cGVvZiBwbGF5ZXIuZ2V0RGVidWdUZXh0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHBsYXllci5nZXREZWJ1Z1RleHQodHJ1ZSk7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyAmJiB0ZXh0Lmxlbmd0aCA+IDAgPyB0ZXh0IDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBtYWluIHBsYXllciB0byBiZSByZWFkeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdhaXRGb3JNYWluUGxheWVyKCk6IFByb21pc2U8TnVsbGFibGU8RWxlbWVudD4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGxheWVyID0gYXdhaXQgRE9NVXRpbHMud2FpdEZvckVsZW1lbnRTZWxlY3RvcihcbiAgICAgICAgU0VMRUNUT1JTLk1PVklFX1BMQVlFUixcbiAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgIFRJTUVPVVRTLkVMRU1FTlRfV0FJVFxuICAgICAgKTtcbiAgICAgIHRoaXMucGxheWVyID0gcGxheWVyIGFzIFlvdVR1YmVQbGF5ZXI7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTWFpbiBwbGF5ZXIgaXMgcmVhZHknKTtcbiAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIHdhaXRpbmcgZm9yIG1haW4gcGxheWVyOicsIGUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIG1pbmlwbGF5ZXIgdG8gYmUgcmVhZHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3YWl0Rm9yTWluaVBsYXllcigpOiBQcm9taXNlPE51bGxhYmxlPEVsZW1lbnQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1pbmlwbGF5ZXIgPSBhd2FpdCBET01VdGlscy53YWl0Rm9yRWxlbWVudFNlbGVjdG9yKFxuICAgICAgICBTRUxFQ1RPUlMuTUlOSVBMQVlFUl9IT1NULFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgVElNRU9VVFMuRUxFTUVOVF9XQUlUXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ01pbmlwbGF5ZXIgaXMgcmVhZHknKTtcbiAgICAgIHJldHVybiBtaW5pcGxheWVyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciB3YWl0aW5nIGZvciBtaW5pcGxheWVyOicsIGUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHNhdmVkIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgcmVzZXRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnUGxheWVyIHN0YXRlIHJlc2V0Jyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNFTEVDVE9SUyB9IGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgeyBUSU1FT1VUUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gJy4uL3V0aWxzL0RPTVV0aWxzJztcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICcuLi90eXBlcy9hcHAnO1xuaW1wb3J0IHR5cGUgeyBOb3RpZmljYXRpb25Ub3BiYXJCdXR0b25SZW5kZXJlciwgWW91VHViZUFwcEVsZW1lbnQgfSBmcm9tICcuLi90eXBlcy95b3V0dWJlJztcbmltcG9ydCB7IEFwcEluaXRpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvQXBwSW5pdGlhbGl6YXRpb25FcnJvcic7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJy4uL2RpJztcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgbWFpbiBkb2N1bWVudCdzIHl0ZC1hcHAgZWxlbWVudC5cbiAqIEluaXRpYWxpemVkIGF0IGFwcCBzdGFydHVwOyByZWZlcmVuY2UgcGVyc2lzdHMgd2hlbiBtb3ZpbmcgYmV0d2VlbiBtYWluIHdpbmRvdyBhbmQgUGlQLlxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWXRkQXBwUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIGFwcDogTnVsbGFibGU8WW91VHViZUFwcEVsZW1lbnQ+ID0gbnVsbDtcbiAgcHJpdmF0ZSBub3RpZnlSZW5kZXJlcjogTnVsbGFibGU8Tm90aWZpY2F0aW9uVG9wYmFyQnV0dG9uUmVuZGVyZXI+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnkpIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlckZhY3RvcnkuY3JlYXRlKCdZdGRBcHBQcm92aWRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgd2l0aCBtYWluIGRvY3VtZW50LiBDYWxsIGF0IGFwcCBzdGFydHVwLlxuICAgKiBXYWl0cyBmb3IgeXRkLWFwcCBlbGVtZW50IHdpdGggc3RhbmRhcmQgdGltZW91dC5cbiAgICogQHRocm93cyBBcHBJbml0aWFsaXphdGlvbkVycm9yIGlmIHl0ZC1hcHAgZWxlbWVudCBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgRE9NVXRpbHMud2FpdEZvckVsZW1lbnRTZWxlY3RvcjxZb3VUdWJlQXBwRWxlbWVudD4oXG4gICAgICAgIFNFTEVDVE9SUy5ZVERfQVBQLFxuICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgVElNRU9VVFMuRUxFTUVOVF9XQUlUXG4gICAgICApO1xuICAgICAgdGhpcy5hcHAgPSBlbGVtZW50O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5ub3RpZnlSZW5kZXJlciA9XG4gICAgICAgICAgYXdhaXQgRE9NVXRpbHMud2FpdEZvckVsZW1lbnRTZWxlY3RvcjxOb3RpZmljYXRpb25Ub3BiYXJCdXR0b25SZW5kZXJlcj4oXG4gICAgICAgICAgICBTRUxFQ1RPUlMuTk9USUZJQ0FUSU9OX1RPUEJBUl9CVVRUT05fUkVOREVSRVIsXG4gICAgICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgICAgIFRJTUVPVVRTLkVMRU1FTlRfV0FJVFxuICAgICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgJHtTRUxFQ1RPUlMuTk9USUZJQ0FUSU9OX1RPUEJBUl9CVVRUT05fUkVOREVSRVJ9IG5vdCBmb3VuZCwgbm90aWZpY2F0aW9uIGNvdW50IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRpdGxlYCxcbiAgICAgICAgICBlcnJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ub3RpZnlSZW5kZXJlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygneXRkLWFwcCBpbml0aWFsaXplZCcpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXBwSW5pdGlhbGl6YXRpb25FcnJvcihgJHtTRUxFQ1RPUlMuWVREX0FQUH0gZWxlbWVudCBub3QgZm91bmRgLCBjYXVzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeXRkLWFwcCBlbGVtZW50IChtYWluIGRvY3VtZW50KS4gQWx3YXlzIGRlZmluZWQgYWZ0ZXIgaW5pdGlhbGl6ZSgpLlxuICAgKi9cbiAgcHVibGljIGdldEFwcCgpOiBZb3VUdWJlQXBwRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwITtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5vdGlmaWNhdGlvbiB0b3BiYXIgYnV0dG9uIHJlbmRlcmVyLiBNYXkgYmUgbnVsbCBpZiBub3QgeWV0IHJlbmRlcmVkLlxuICAgKi9cbiAgcHVibGljIGdldE5vdGlmeVJlbmRlcmVyKCk6IE51bGxhYmxlPE5vdGlmaWNhdGlvblRvcGJhckJ1dHRvblJlbmRlcmVyPiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5UmVuZGVyZXI7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICcuLi90eXBlcy9hcHAnO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIFBpUCB3aW5kb3cgcmVmZXJlbmNlLlxuICogU2V0IGJ5IFBpUE1hbmFnZXIgd2hlbiBQaVAgb3BlbnMsIGNsZWFyZWQgd2hlbiBQaVAgY2xvc2VzLlxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGlwV2luZG93UHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHBpcFdpbmRvdzogTnVsbGFibGU8V2luZG93PiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoQGluamVjdChMb2dnZXJGYWN0b3J5KSBsb2dnZXJGYWN0b3J5OiBMb2dnZXJGYWN0b3J5KSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnUGlwV2luZG93UHJvdmlkZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIFBpUCB3aW5kb3cgKGNhbGxlZCBieSBQaVBNYW5hZ2VyIHdoZW4gUGlQIG9wZW5zL2Nsb3NlcykuXG4gICAqL1xuICBwdWJsaWMgc2V0V2luZG93KHBpcFdpbmRvdzogTnVsbGFibGU8V2luZG93Pik6IHZvaWQge1xuICAgIHRoaXMucGlwV2luZG93ID0gcGlwV2luZG93O1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdQaXBXaW5kb3dQcm92aWRlci5zZXRXaW5kb3cnLCB7IGhhc1dpbmRvdzogcGlwV2luZG93ICE9PSBudWxsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgUGlQIHdpbmRvdy5cbiAgICovXG4gIHB1YmxpYyBnZXRXaW5kb3coKTogTnVsbGFibGU8V2luZG93PiB7XG4gICAgcmV0dXJuIHRoaXMucGlwV2luZG93O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFNFTEVDVE9SUyB9IGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgeyBUSU1FT1VUUywgWVRfRVZFTlRTLCBZVF9BQ1RJT05fTkFNRVMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tICcuLi91dGlscy9ET01VdGlscyc7XG5pbXBvcnQgeyBQbGF5ZXJNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9QbGF5ZXJNYW5hZ2VyJztcbmltcG9ydCB7IFl0ZEFwcFByb3ZpZGVyIH0gZnJvbSAnLi4vY29yZS9ZdGRBcHBQcm92aWRlcic7XG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcbmltcG9ydCB0eXBlIHsgTWluaVBsYXllckVsZW1lbnQgfSBmcm9tICcuLi90eXBlcy95b3V0dWJlJztcbmltcG9ydCB7IEFwcEluaXRpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvQXBwSW5pdGlhbGl6YXRpb25FcnJvcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogQ29udHJvbHMgbWluaSBwbGF5ZXIgdmlzaWJpbGl0eSBhbmQgc3RhdGUgdXNpbmcgWW91VHViZSBuYXRpdmUgYWN0aW9ucy5cbiAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBtaW5pcGxheWVyIERPTSBlbGVtZW50LCBpbml0aWFsaXplZCBhdCBhcHAgc3RhcnR1cC5cbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1pbmlQbGF5ZXJDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSBtaW5pcGxheWVyOiBOdWxsYWJsZTxNaW5pUGxheWVyRWxlbWVudD4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBpbmplY3QoTG9nZ2VyRmFjdG9yeSkgbG9nZ2VyRmFjdG9yeTogTG9nZ2VyRmFjdG9yeSxcbiAgICBAaW5qZWN0KFBsYXllck1hbmFnZXIpIHByaXZhdGUgcmVhZG9ubHkgcGxheWVyTWFuYWdlcjogUGxheWVyTWFuYWdlcixcbiAgICBAaW5qZWN0KFl0ZEFwcFByb3ZpZGVyKSBwcml2YXRlIHJlYWRvbmx5IHl0ZEFwcFByb3ZpZGVyOiBZdGRBcHBQcm92aWRlclxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlckZhY3RvcnkuY3JlYXRlKCdNaW5pUGxheWVyQ29udHJvbGxlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgd2l0aCBtYWluIGRvY3VtZW50LiBDYWxsIGF0IGFwcCBzdGFydHVwLlxuICAgKiBXYWl0cyBmb3IgeXRkLW1pbmlwbGF5ZXIgZWxlbWVudCB3aXRoIHN0YW5kYXJkIHRpbWVvdXQuXG4gICAqIEB0aHJvd3MgQXBwSW5pdGlhbGl6YXRpb25FcnJvciBpZiBtaW5pcGxheWVyIGVsZW1lbnQgbm90IGZvdW5kXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IERPTVV0aWxzLndhaXRGb3JFbGVtZW50U2VsZWN0b3I8TWluaVBsYXllckVsZW1lbnQ+KFxuICAgICAgICBTRUxFQ1RPUlMuTUlOSVBMQVlFUixcbiAgICAgICAgZG9jdW1lbnQsXG4gICAgICAgIFRJTUVPVVRTLkVMRU1FTlRfV0FJVFxuICAgICAgKTtcbiAgICAgIHRoaXMubWluaXBsYXllciA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTWluaXBsYXllciBpbml0aWFsaXplZCcpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXBwSW5pdGlhbGl6YXRpb25FcnJvcihgJHtTRUxFQ1RPUlMuTUlOSVBMQVlFUn0gZWxlbWVudCBub3QgZm91bmRgLCBjYXVzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWluaXBsYXllciBlbGVtZW50IHJlZmVyZW5jZS4gQWx3YXlzIGRlZmluZWQgYWZ0ZXIgaW5pdGlhbGl6ZSgpLlxuICAgKi9cbiAgcHVibGljIGdldE1pbmlwbGF5ZXIoKTogTWluaVBsYXllckVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLm1pbmlwbGF5ZXIhO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiBtaW5pIHBsYXllciBpcyBjdXJyZW50bHkgdmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc1Zpc2libGUgPSAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLk1JTklQTEFZRVJfSE9TVCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYE1pbmkgcGxheWVyIHZpc2libGU6ICR7aXNWaXNpYmxlfWApO1xuICAgIHJldHVybiBpc1Zpc2libGU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgbWluaSBwbGF5ZXIgdXNpbmcgWW91VHViZSBuYXRpdmUgYWN0aW9uXG4gICAqIFVzZXMgWVRfRVZFTlRTLkFDVElPTiB3aXRoIFlUX0FDVElPTl9OQU1FUy5BQ1RJVkFURV9NSU5JUExBWUVSXG4gICAqL1xuICBwdWJsaWMgYWN0aXZhdGVNaW5pUGxheWVyKCk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdBY3RpdmF0aW5nIG1pbmkgcGxheWVyIHZpYSBZb3VUdWJlIEFQSScpO1xuXG4gICAgY29uc3QgeXRkQXBwID0gdGhpcy55dGRBcHBQcm92aWRlci5nZXRBcHAoKTtcbiAgICBpZiAodHlwZW9mIHl0ZEFwcC5maXJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigneXRkLWFwcCBmaXJlIG1ldGhvZCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgeXRkQXBwLmZpcmUoWVRfRVZFTlRTLkFDVElPTiwge1xuICAgICAgICBhY3Rpb25OYW1lOiBZVF9BQ1RJT05fTkFNRVMuQUNUSVZBVEVfTUlOSVBMQVlFUixcbiAgICAgICAgYXJnczogW2ZhbHNlXSxcbiAgICAgICAgb3B0aW9uYWxBY3Rpb246IGZhbHNlLFxuICAgICAgICByZXR1cm5WYWx1ZTogW3VuZGVmaW5lZF0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdNaW5pIHBsYXllciBhY3RpdmF0aW9uIGV2ZW50IGRpc3BhdGNoZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgYWN0aXZhdGluZyBtaW5pIHBsYXllcjonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIG1pbmkgcGxheWVyIG1vZGUgdXNpbmcgWW91VHViZSBuYXRpdmUgQVBJXG4gICAqXG4gICAqIElmIG1pbmkgcGxheWVyIGlzIGFjdGl2ZSwgbmF2aWdhdGVzIGJhY2sgdG8gZnVsbCBwbGF5ZXIgdXNpbmcgWVRfRVZFTlRTLk5BVklHQVRFLlxuICAgKiBPdGhlcndpc2UsIGFjdGl2YXRlcyBtaW5pIHBsYXllciB1c2luZyBZVF9FVkVOVFMuQUNUSU9OIHdpdGggWVRfQUNUSU9OX05BTUVTLkFDVElWQVRFX01JTklQTEFZRVJfRlJPTV9XQVRDSC5cbiAgICpcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZU1pbmlQbGF5ZXIoKTogdm9pZCB7XG4gICAgY29uc3QgeXRkQXBwID0gdGhpcy55dGRBcHBQcm92aWRlci5nZXRBcHAoKTtcbiAgICBpZiAodHlwZW9mIHl0ZEFwcC5maXJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigneXRkLWFwcCBmaXJlIG1ldGhvZCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHl0ZEFwcC5taW5pcGxheWVySXNBY3RpdmUpIHtcbiAgICAgICAgLy8gUmV0dXJuIHRvIGZ1bGwgcGxheWVyOiB1c2UgWVRfRVZFTlRTLk5BVklHQVRFIHdpdGggd2F0Y2hFbmRwb2ludFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnUmV0dXJuaW5nIHRvIGZ1bGwgcGxheWVyIHZpYSBZb3VUdWJlIEFQSScpO1xuXG4gICAgICAgIC8vIEdldCB2aWRlbyBJRCBmcm9tIHBsYXllciB1c2luZyBQbGF5ZXJNYW5hZ2VyXG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB0aGlzLnBsYXllck1hbmFnZXIuZ2V0VmlkZW9JZCgpO1xuICAgICAgICBpZiAoIXZpZGVvSWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVmlkZW8gSUQgbm90IGZvdW5kLCBjYW5ub3QgbmF2aWdhdGUgdG8gZnVsbCBwbGF5ZXInKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB5dGRBcHAuZmlyZShZVF9FVkVOVFMuTkFWSUdBVEUsIHtcbiAgICAgICAgICBlbmRwb2ludDoge1xuICAgICAgICAgICAgd2F0Y2hFbmRwb2ludDogeyB2aWRlb0lkIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBOYXZpZ2F0aW9uIHRvIGZ1bGwgcGxheWVyIGRpc3BhdGNoZWQgZm9yIHZpZGVvICR7dmlkZW9JZH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIG1pbmlwbGF5ZXI6IHVzZSBZVF9FVkVOVFMuQUNUSU9OIHdpdGggWVRfQUNUSU9OX05BTUVTLkFDVElWQVRFX01JTklQTEFZRVJfRlJPTV9XQVRDSFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQWN0aXZhdGluZyBtaW5pcGxheWVyIHZpYSBZb3VUdWJlIEFQSScpO1xuICAgICAgICB5dGRBcHAuZmlyZShZVF9FVkVOVFMuQUNUSU9OLCB7XG4gICAgICAgICAgYWN0aW9uTmFtZTogWVRfQUNUSU9OX05BTUVTLkFDVElWQVRFX01JTklQTEFZRVJfRlJPTV9XQVRDSCxcbiAgICAgICAgICBhcmdzOiBudWxsLFxuICAgICAgICAgIG9wdGlvbmFsQWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICByZXR1cm5WYWx1ZTogW3VuZGVmaW5lZF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTWluaXBsYXllciBhY3RpdmF0aW9uIGV2ZW50IGRpc3BhdGNoZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgdG9nZ2xpbmcgbWluaSBwbGF5ZXI6JywgZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBOYXZpZ2F0aW9uU3RhdGUgfSBmcm9tICcuLi90eXBlcy95b3V0dWJlJztcbmltcG9ydCB7IFdFQl9QQUdFX1RZUEVTLCBST09UX1ZFLCBZVF9FVkVOVFMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU0VMRUNUT1JTIH0gZnJvbSAnLi4vc2VsZWN0b3JzJztcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICcuLi90eXBlcy9hcHAnO1xuXG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFBpcFdpbmRvd1Byb3ZpZGVyIH0gZnJvbSAnLi9QaXBXaW5kb3dQcm92aWRlcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogSGFuZGxlcyBTUEEgbmF2aWdhdGlvbiBpbiBQaVAgd2luZG93XG4gKi9cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgcGlwV2luZG93OiBOdWxsYWJsZTxXaW5kb3c+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnksXG4gICAgQGluamVjdChQaXBXaW5kb3dQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSBwaXBXaW5kb3dQcm92aWRlcjogUGlwV2luZG93UHJvdmlkZXJcbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnTmF2aWdhdGlvbkhhbmRsZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIG5hdmlnYXRpb24gaGFuZGxlciBmb3IgUGlQIHdpbmRvd1xuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5waXBXaW5kb3cgPSB0aGlzLnBpcFdpbmRvd1Byb3ZpZGVyLmdldFdpbmRvdygpO1xuICAgIHRoaXMuc2V0dXBDbGlja0hhbmRsZXIoKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTmF2aWdhdGlvbiBoYW5kbGVyIGluaXRpYWxpemVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgY2xpY2sgaGFuZGxlciBmb3IgbmF2aWdhdGlvbiBpbiBQaVAgd2luZG93XG4gICAqL1xuICBwcml2YXRlIHNldHVwQ2xpY2tIYW5kbGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waXBXaW5kb3cpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdQaVAgd2luZG93IG5vdCBhdmFpbGFibGUgZm9yIG5hdmlnYXRpb24gaGFuZGxlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGlwV2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnY2xpY2snLFxuICAgICAgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50ID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdDxIVE1MQW5jaG9yRWxlbWVudD4oXG4gICAgICAgICAgU0VMRUNUT1JTLlNJTVBMRV9FTkRQT0lOVFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBidXR0b24gPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0PEhUTUxCdXR0b25FbGVtZW50PihTRUxFQ1RPUlMuQlVUVE9OKTtcblxuICAgICAgICAvLyBTa2lwIGJ1dHRvbiBjbGlja3MgKGhhbmRsZWQgYnkgTGlrZUJ1dHRvbkhhbmRsZXIpXG4gICAgICAgIGlmIChidXR0b24gfHwgIWVuZHBvaW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHJlZiA9IGVuZHBvaW50LmhyZWY7XG4gICAgICAgIGlmICghaHJlZikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ05hdmlnYXRpb24gZW5kcG9pbnQgaGFzIG5vIGhyZWYnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coJ05hdmlnYXRpb24gY2xpY2sgZGV0ZWN0ZWQnKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKHVybC5zZWFyY2hQYXJhbXMpO1xuXG4gICAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IG5hdmlnYXRpb25cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgLy8gQnVpbGQgbmF2aWdhdGlvbiBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHN0YXRlOiBOYXZpZ2F0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICBlbmRwb2ludDoge1xuICAgICAgICAgICAgICBjb21tYW5kTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICB3ZWJDb21tYW5kTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHVybDogaHJlZixcbiAgICAgICAgICAgICAgICAgIHdlYlBhZ2VUeXBlOiBXRUJfUEFHRV9UWVBFUy5XQVRDSCxcbiAgICAgICAgICAgICAgICAgIHJvb3RWZTogUk9PVF9WRSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3YXRjaEVuZHBvaW50OiB7XG4gICAgICAgICAgICAgICAgdmlkZW9JZDogcGFyYW1zLnYsXG4gICAgICAgICAgICAgICAgcGxheWxpc3RJZDogcGFyYW1zLmxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBpbmRleDogcGFyYW1zLmluZGV4ID8gcGFyc2VJbnQocGFyYW1zLmluZGV4KSAtIDEgOiAwLFxuICAgICAgICAgICAgICAgIHBhcmFtczogJ09BRSUzRCcsXG4gICAgICAgICAgICAgICAgcGxheWVyUGFyYW1zOiBwYXJhbXMucHAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50cnlUaW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBTUEEgbmF2aWdhdGlvbiB2aWEgJHtZVF9FVkVOVFMuTkFWSUdBVEV9OiAke2hyZWZ9YCk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIG5hdmlnYXRpb24gKG5vIHB1c2hTdGF0ZSDigJQgWW91VHViZSBkb2VzIG5vdCB1cGRhdGUgVVJMIGluIG1pbmkgcGxheWVyKVxuICAgICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBQb3BTdGF0ZUV2ZW50KCdwb3BzdGF0ZScsIHsgc3RhdGUgfSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGhhbmRsaW5nIG5hdmlnYXRpb246JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTsgLy8gVXNlIGNhcHR1cmUgcGhhc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIG5hdmlnYXRpb24gaGFuZGxlclxuICAgKi9cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5waXBXaW5kb3cgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdOYXZpZ2F0aW9uIGhhbmRsZXIgY2xlYW5lZCB1cCcpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcblxuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBQbGF5ZXJNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9QbGF5ZXJNYW5hZ2VyJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJy4uL2RpJztcblxuLyoqXG4gKiBUcmFja3MgZWxlbWVudCByZXNpemUgZXZlbnRzIGFuZCB1cGRhdGVzIHBsYXllclxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVzaXplVHJhY2tlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE51bGxhYmxlPFJlc2l6ZU9ic2VydmVyPiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQGluamVjdChMb2dnZXJGYWN0b3J5KSBsb2dnZXJGYWN0b3J5OiBMb2dnZXJGYWN0b3J5LFxuICAgIEBpbmplY3QoUGxheWVyTWFuYWdlcikgcHJpdmF0ZSByZWFkb25seSBwbGF5ZXJNYW5hZ2VyOiBQbGF5ZXJNYW5hZ2VyXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyRmFjdG9yeS5jcmVhdGUoJ1Jlc2l6ZVRyYWNrZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0cmFja2luZyByZXNpemUgZXZlbnRzIGZvciBlbGVtZW50IGluIFBpUCB3aW5kb3dcbiAgICovXG4gIHB1YmxpYyBzdGFydCh0YXJnZXRFbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdSZXNpemVPYnNlcnZlciBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHJlc2l6ZSB0cmFja2luZycpO1xuXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllczogUmVzaXplT2JzZXJ2ZXJFbnRyeVtdKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYE5ldyBzaXplOiAke3dpZHRofXB4YCk7XG5cbiAgICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5wbGF5ZXJNYW5hZ2VyLmdldFBsYXllcigpO1xuICAgICAgICAvLyBDaGVjayBpZiByZXNpemUgbWV0aG9kcyBhcmUgYXZhaWxhYmxlXG4gICAgICAgIGNvbnN0IGhhc1Jlc2l6ZU1ldGhvZHMgPVxuICAgICAgICAgIHR5cGVvZiBwbGF5ZXIuc2V0SW50ZXJuYWxTaXplID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwbGF5ZXIuc2V0U2l6ZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgICAgICBpZiAoIWhhc1Jlc2l6ZU1ldGhvZHMpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdQbGF5ZXIgcmVzaXplIG1ldGhvZHMgKHNldEludGVybmFsU2l6ZSwgc2V0U2l6ZSkgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIHJlc2l6ZSBtZXRob2RzIGlmIGF2YWlsYWJsZVxuICAgICAgICBwbGF5ZXIuc2V0SW50ZXJuYWxTaXplPy4oKTtcbiAgICAgICAgcGxheWVyLnNldFNpemU/LigpO1xuXG4gICAgICAgIHBsYXllci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVzaXplJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1BsYXllciBzaXplIHVwZGF0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRyYWNraW5nIHJlc2l6ZSBldmVudHNcbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1Jlc2l6ZSB0cmFja2luZyBzdG9wcGVkJyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBERUZBVUxUX0RJTUVOU0lPTlMsIFRJTUVPVVRTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNFTEVDVE9SUyB9IGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gJy4uL3V0aWxzL0RPTVV0aWxzJztcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICcuLi90eXBlcy9hcHAnO1xuXG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFBpcFdpbmRvd1Byb3ZpZGVyIH0gZnJvbSAnLi4vY29yZS9QaXBXaW5kb3dQcm92aWRlcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogT2JzZXJ2ZXMgbWVudSBidXR0b24gc3RhdGUgYW5kIGFkanVzdHMgUGlQIHdpbmRvdy5cbiAqIFJlLXdhaXRzIGZvciB0aGUgYnV0dG9uIHdoZW4gaXQgaXMgcmVtb3ZlZCBmcm9tIERPTSAoZS5nLiBuYXZpZ2F0ZSB0byB2aWRlbyB3aXRob3V0IHBsYXlsaXN0KS5cbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1lbnVPYnNlcnZlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE51bGxhYmxlPE11dGF0aW9uT2JzZXJ2ZXI+ID0gbnVsbDtcbiAgcHJpdmF0ZSByZW1vdmFsT2JzZXJ2ZXI6IE51bGxhYmxlPE11dGF0aW9uT2JzZXJ2ZXI+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnksXG4gICAgQGluamVjdChQaXBXaW5kb3dQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSBwaXBXaW5kb3dQcm92aWRlcjogUGlwV2luZG93UHJvdmlkZXJcbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnTWVudU9ic2VydmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgb2JzZXJ2aW5nIG1lbnUgYnV0dG9uIGluIFBpUCB3aW5kb3dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwaXBXaW5kb3cgPSB0aGlzLnBpcFdpbmRvd1Byb3ZpZGVyLmdldFdpbmRvdygpO1xuICAgIGlmIChwaXBXaW5kb3cpIHtcbiAgICAgIGF3YWl0IHRoaXMucnVuT2JzZXJ2YXRpb24ocGlwV2luZG93KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgYnV0dG9uLCBvYnNlcnZlIGl0OyB3aGVuIHJlbW92ZWQgZnJvbSBET00sIHJlLXdhaXQgYW5kIHJlLW9ic2VydmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bk9ic2VydmF0aW9uKHBpcFdpbmRvdzogV2luZG93KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBpcFdpbmRvdy5jbG9zZWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdQaVAgd2luZG93IGFscmVhZHkgY2xvc2VkLCBza2lwcGluZyBtZW51IG9ic2VydmF0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGJ1dHRvbjogRWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgYnV0dG9uID0gYXdhaXQgRE9NVXRpbHMud2FpdEZvckVsZW1lbnRTZWxlY3RvcihcbiAgICAgICAgU0VMRUNUT1JTLk1FTlVfQlVUVE9OLFxuICAgICAgICBwaXBXaW5kb3cuZG9jdW1lbnQsXG4gICAgICAgIFRJTUVPVVRTLkVMRU1FTlRfV0FJVF9JTkZJTklURSxcbiAgICAgICAgcGlwV2luZG93XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1dhaXQgZm9yIG1lbnUgYnV0dG9uIGFib3J0ZWQnLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgbWVudSBvYnNlcnZhdGlvbicpO1xuXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnYXJpYS1leHBhbmRlZCcpIHtcbiAgICAgICAgICBjb25zdCBpc0V4cGFuZGVkID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7XG4gICAgICAgICAgY29uc3QgcGxheUxpc3RDb250YWluZXIgPSBwaXBXaW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgICBTRUxFQ1RPUlMuUExBWUxJU1RfUEFORUxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBwaXBXaW5kb3cub3V0ZXJIZWlnaHQ7XG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTWVudSBzdGF0ZSBjaGFuZ2VkOiBleHBhbmRlZCA9ICR7aXNFeHBhbmRlZH1gKTtcblxuICAgICAgICAgIGlmIChpc0V4cGFuZGVkKSB7XG4gICAgICAgICAgICAvLyBFeHBhbmQgd2luZG93IGlmIG5lZWRlZFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgPCBERUZBVUxUX0RJTUVOU0lPTlMuUElQX0VYUEFOREVEX0hFSUdIVCkge1xuICAgICAgICAgICAgICBwaXBXaW5kb3cucmVzaXplVG8ocGlwV2luZG93Lm91dGVyV2lkdGgsIERFRkFVTFRfRElNRU5TSU9OUy5QSVBfRVhQQU5ERURfSEVJR0hUKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1BpUCB3aW5kb3cgZXhwYW5kZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2hvdyBwbGF5bGlzdCBwYW5lbFxuICAgICAgICAgICAgaWYgKHBsYXlMaXN0Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHBsYXlMaXN0Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBIaWRlIHBsYXlsaXN0IHBhbmVsXG4gICAgICAgICAgICBpZiAocGxheUxpc3RDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgcGxheUxpc3RDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2VydmUgb25seSBhcmlhLWV4cGFuZGVkIGF0dHJpYnV0ZVxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShidXR0b24sIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnYXJpYS1leHBhbmRlZCddLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW1vdmFsT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoIWJ1dHRvbi5pc0Nvbm5lY3RlZCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMucmVtb3ZhbE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbW92YWxPYnNlcnZlciA9IG51bGw7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdNZW51IGJ1dHRvbiByZW1vdmVkIGZyb20gRE9NLCByZS13YWl0aW5nJyk7XG4gICAgICAgIHZvaWQgdGhpcy5ydW5PYnNlcnZhdGlvbihwaXBXaW5kb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW1vdmFsT2JzZXJ2ZXIub2JzZXJ2ZShwaXBXaW5kb3cuZG9jdW1lbnQuYm9keSwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIG9ic2VydmluZyBtZW51IGJ1dHRvblxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbW92YWxPYnNlcnZlcikge1xuICAgICAgdGhpcy5yZW1vdmFsT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5yZW1vdmFsT2JzZXJ2ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTWVudSBvYnNlcnZhdGlvbiBzdG9wcGVkJyk7XG4gIH1cbn1cbiIsIi8qKlxuICogQXBwbGljYXRpb24td2lkZSB0eXBlcyAobm9uLVlvdVR1YmUpXG4gKi9cblxuLyoqIFQgfCBudWxsICovXG5leHBvcnQgdHlwZSBOdWxsYWJsZTxUPiA9IFQgfCBudWxsO1xuXG4vKiogQ29weSBtZW51IGFjdGlvbjogdmlkZW8gVVJMLCBVUkwgYXQgY3VycmVudCB0aW1lLCBlbWJlZCBjb2RlLCBvciBkZWJ1ZyBpbmZvICovXG5leHBvcnQgZW51bSBDb3B5VHlwZSB7XG4gIFZJREVPX1VSTCA9ICd2aWRlb191cmwnLFxuICBVUkxfQVRfVElNRSA9ICd1cmxfYXRfdGltZScsXG4gIEVNQkVEID0gJ2VtYmVkJyxcbiAgREVCVUdfSU5GTyA9ICdkZWJ1Z19pbmZvJyxcbn1cblxuLyoqIFQgfCBQcm9taXNlPFQ+IC0gZm9yIHZhbHVlcyB0aGF0IGNhbiBiZSBzeW5jIG9yIGFzeW5jICovXG5leHBvcnQgdHlwZSBNYXliZVByb21pc2U8VD4gPSBUIHwgUHJvbWlzZTxUPjtcblxuLyoqIERvY3VtZW50IG9yIEVsZW1lbnQg4oCTIGUuZy4gZm9yIHF1ZXJ5U2VsZWN0b3Igcm9vdCAqL1xuZXhwb3J0IHR5cGUgRG9jdW1lbnRPckVsZW1lbnQgPSBEb2N1bWVudCB8IEVsZW1lbnQ7XG5cbi8qKiBDbGVhbnVwIGZuIGludm9rZWQgYmVmb3JlIHJldHVybmluZyBwbGF5ZXIgZnJvbSBQaVAgdG8gbWFpbiAqL1xuZXhwb3J0IHR5cGUgUGlQQ2xlYW51cENhbGxiYWNrID0gKCkgPT4gTWF5YmVQcm9taXNlPHZvaWQ+O1xuXG4vKiogQ2FsbGJhY2sgd2hlbiBQaVAgd2luZG93IGlzIHJlYWR5OiBpbml0IGhhbmRsZXJzLCBvcHRpb25hbGx5IHJldHVybiBjbGVhbnVwIGZuICovXG5leHBvcnQgdHlwZSBQaVBXaW5kb3dSZWFkeUNhbGxiYWNrID0gKFxuICBwaXBXaW5kb3c6IFdpbmRvdyxcbiAgbWluaXBsYXllcjogRWxlbWVudFxuKSA9PiBNYXliZVByb21pc2U8dm9pZCB8IFBpUENsZWFudXBDYWxsYmFjaz47XG5cbi8qKiBHZXR0ZXIvc2V0dGVyIGRlc2NyaXB0b3IgKGUuZy4gZm9yIE1lZGlhU2Vzc2lvbiBtZXRhZGF0YSBvdmVycmlkZSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFQcm9wZXJ0eURlc2NyaXB0b3Ige1xuICBnZXQ/KCk6IHVua25vd247XG4gIHNldD8odmFsdWU6IHVua25vd24pOiB2b2lkO1xufVxuIiwiLyoqXG4gKiBTaGFyZWQgVVJML2lmcmFtZSBidWlsZGVycyBmb3IgY29udGV4dCBtZW51IFwiQ29weVwiIGFjdGlvbnMuXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoOiBjb2RlIGFuZCB0ZXN0cyB1c2UgdGhlc2Ugc28gdGVtcGxhdGUgY2hhbmdlcyBkb24ndCBicmVhayB0ZXN0cy5cbiAqL1xuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL2FwcCc7XG5pbXBvcnQgeyBDb3B5VHlwZSB9IGZyb20gJy4uL3R5cGVzL2FwcCc7XG5pbXBvcnQge1xuICBFTUJFRF9JRlJBTUVfREVGQVVMVFMsXG4gIFlPVVRVQkVfU0hPUlRfQkFTRSxcbiAgWU9VVFVCRV9FTUJFRF9CQVNFLFxuICBDT1BZX1BBWUxPQURfUVVFUlksXG4gIElGUkFNRV9USVRMRV9RVU9ULFxuICBJRlJBTUVfQUxMT1csXG4gIElGUkFNRV9SRUZFUlJFUl9QT0xJQ1ksXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVBheWxvYWRQYXJhbXMge1xuICB2aWRlb0lkOiBzdHJpbmc7XG4gIHBsYXlsaXN0SWQ6IE51bGxhYmxlPHN0cmluZz47XG4gIGN1cnJlbnRUaW1lOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNvcHlUeXBlOiBDb3B5VHlwZTtcbiAgZW1iZWRTaXplPzogTnVsbGFibGU8eyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBCdWlsZCBwYXlsb2FkIGZvciBcIkNvcHkgdmlkZW8gVVJMXCIgKHdpdGggb3B0aW9uYWwgcGxheWxpc3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRWaWRlb1VybFBheWxvYWQodmlkZW9JZDogc3RyaW5nLCBwbGF5bGlzdElkOiBOdWxsYWJsZTxzdHJpbmc+KTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGAke1lPVVRVQkVfU0hPUlRfQkFTRX0vJHt2aWRlb0lkfWA7XG4gIGNvbnN0IGxpc3RQYXJ0ID0gcGxheWxpc3RJZCA/IGA/JHtDT1BZX1BBWUxPQURfUVVFUlkuTElTVH09JHtwbGF5bGlzdElkfWAgOiAnJztcbiAgcmV0dXJuIGxpc3RQYXJ0ID8gYCR7YmFzZX0ke2xpc3RQYXJ0fWAgOiBiYXNlO1xufVxuXG4vKipcbiAqIEJ1aWxkIHBheWxvYWQgZm9yIFwiQ29weSBVUkwgYXQgY3VycmVudCB0aW1lXCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVybEF0VGltZVBheWxvYWQoXG4gIHZpZGVvSWQ6IHN0cmluZyxcbiAgcGxheWxpc3RJZDogTnVsbGFibGU8c3RyaW5nPixcbiAgY3VycmVudFRpbWU6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGAke1lPVVRVQkVfU0hPUlRfQkFTRX0vJHt2aWRlb0lkfWA7XG4gIGNvbnN0IGxpc3RQYXJ0ID0gcGxheWxpc3RJZCA/IGA/JHtDT1BZX1BBWUxPQURfUVVFUlkuTElTVH09JHtwbGF5bGlzdElkfWAgOiAnJztcbiAgY29uc3QgdFBhcnQgPVxuICAgIGN1cnJlbnRUaW1lID4gMFxuICAgICAgPyBsaXN0UGFydFxuICAgICAgICA/IGAmJHtDT1BZX1BBWUxPQURfUVVFUlkuVElNRX09JHtjdXJyZW50VGltZX1zYFxuICAgICAgICA6IGA/JHtDT1BZX1BBWUxPQURfUVVFUlkuVElNRX09JHtjdXJyZW50VGltZX1zYFxuICAgICAgOiAnJztcbiAgcmV0dXJuIGAke2Jhc2V9JHtsaXN0UGFydH0ke3RQYXJ0fWA7XG59XG5cbi8qKlxuICogQnVpbGQgZW1iZWQgaWZyYW1lIEhUTUwgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRlbXBsYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW1iZWRQYXlsb2FkKFxuICB2aWRlb0lkOiBzdHJpbmcsXG4gIHBsYXlsaXN0SWQ6IE51bGxhYmxlPHN0cmluZz4sXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGVtYmVkU2l6ZT86IE51bGxhYmxlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT5cbik6IHN0cmluZyB7XG4gIGNvbnN0IHcgPSBlbWJlZFNpemU/LndpZHRoID8/IEVNQkVEX0lGUkFNRV9ERUZBVUxUUy5XSURUSDtcbiAgY29uc3QgaCA9IGVtYmVkU2l6ZT8uaGVpZ2h0ID8/IEVNQkVEX0lGUkFNRV9ERUZBVUxUUy5IRUlHSFQ7XG4gIGNvbnN0IGxpc3RRID0gcGxheWxpc3RJZCA/IGA/JHtDT1BZX1BBWUxPQURfUVVFUlkuTElTVH09JHtwbGF5bGlzdElkfWAgOiAnJztcbiAgY29uc3Qgc3JjID0gYCR7WU9VVFVCRV9FTUJFRF9CQVNFfS8ke3ZpZGVvSWR9JHtsaXN0UX1gO1xuICBjb25zdCBzYWZlVGl0bGUgPSB0aXRsZS5yZXBsYWNlKC9cIi9nLCBJRlJBTUVfVElUTEVfUVVPVCk7XG4gIHJldHVybiBgPGlmcmFtZSB3aWR0aD1cIiR7d31cIiBoZWlnaHQ9XCIke2h9XCIgc3JjPVwiJHtzcmN9XCIgdGl0bGU9XCIke3NhZmVUaXRsZX1cIiBmcmFtZWJvcmRlcj1cIjBcIiBhbGxvdz1cIiR7SUZSQU1FX0FMTE9XfVwiIHJlZmVycmVycG9saWN5PVwiJHtJRlJBTUVfUkVGRVJSRVJfUE9MSUNZfVwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT5gO1xufVxuXG4vKipcbiAqIEJ1aWxkIGNvcHkgcGF5bG9hZCBieSBjb3B5IHR5cGUgKHVzZWQgYnkgQ29udGV4dE1lbnVIYW5kbGVyIGFuZCB0ZXN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvcHlQYXlsb2FkKHBhcmFtczogQ29weVBheWxvYWRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IHZpZGVvSWQsIHBsYXlsaXN0SWQsIGN1cnJlbnRUaW1lLCB0aXRsZSwgY29weVR5cGUsIGVtYmVkU2l6ZSB9ID0gcGFyYW1zO1xuICBzd2l0Y2ggKGNvcHlUeXBlKSB7XG4gICAgY2FzZSBDb3B5VHlwZS5WSURFT19VUkw6XG4gICAgICByZXR1cm4gYnVpbGRWaWRlb1VybFBheWxvYWQodmlkZW9JZCwgcGxheWxpc3RJZCk7XG4gICAgY2FzZSBDb3B5VHlwZS5VUkxfQVRfVElNRTpcbiAgICAgIHJldHVybiBidWlsZFVybEF0VGltZVBheWxvYWQodmlkZW9JZCwgcGxheWxpc3RJZCwgY3VycmVudFRpbWUpO1xuICAgIGNhc2UgQ29weVR5cGUuRU1CRUQ6XG4gICAgICByZXR1cm4gYnVpbGRFbWJlZFBheWxvYWQodmlkZW9JZCwgcGxheWxpc3RJZCwgdGl0bGUsIGVtYmVkU2l6ZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBUSU1FT1VUUywgTU9VU0VfQlVUVE9OUywgQ09QWV9NRU5VX0lORElDRVMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tICcuLi91dGlscy9ET01VdGlscyc7XG5pbXBvcnQgeyBTRUxFQ1RPUlMgfSBmcm9tICcuLi9zZWxlY3RvcnMnO1xuaW1wb3J0IHsgUGxheWVyTWFuYWdlciB9IGZyb20gJy4uL2NvcmUvUGxheWVyTWFuYWdlcic7XG5pbXBvcnQgeyBZdGRBcHBQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvWXRkQXBwUHJvdmlkZXInO1xuaW1wb3J0IHsgUGlwV2luZG93UHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL1BpcFdpbmRvd1Byb3ZpZGVyJztcbmltcG9ydCB7IENvcHlUeXBlLCB0eXBlIE51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcbmltcG9ydCB7IGJ1aWxkQ29weVBheWxvYWQgfSBmcm9tICcuLi91dGlscy9jb3B5UGF5bG9hZCc7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogSGFuZGxlcyBjb250ZXh0IG1lbnUgbW92ZW1lbnQgYmV0d2VlbiB3aW5kb3dzIGFuZCBjb3B5IGNvbW1hbmRzIGluIFBpUC5cbiAqIFlvdVR1YmUgdXNlcyBhIGhpZGRlbiB0ZXh0YXJlYSBpbiB0aGUgbWFpbiB3aW5kb3cgZm9yIGNvcHk7IHdoZW4gdGhlIG1lbnVcbiAqIGlzIG1vdmVkIHRvIHRoZSBQaVAgcG9wdXAgdGhhdCBsaW5rIGJyZWFrcy4gV2UgaW50ZXJjZXB0IGNvcHkgbWVudSBjbGlja3NcbiAqIGFuZCBjb3B5IHZpYSBhIHRlbXBvcmFyeSB0ZXh0YXJlYSBpbiB0aGUgUGlQIGRvY3VtZW50LlxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0TWVudVZpc2liaWxpdHlDYWxsYmFjayA9ICh2aXNpYmxlOiBib29sZWFuKSA9PiB2b2lkO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSB2aXNpYmlsaXR5T2JzZXJ2ZXI6IE51bGxhYmxlPE11dGF0aW9uT2JzZXJ2ZXI+ID0gbnVsbDtcbiAgcHJpdmF0ZSBwaXBXaW5kb3c6IE51bGxhYmxlPFdpbmRvdz4gPSBudWxsO1xuICBwcml2YXRlIGNvbnRleHRNZW51OiBOdWxsYWJsZTxIVE1MRWxlbWVudD4gPSBudWxsO1xuICBwcml2YXRlIGNvbnRleHRNZW51UGxhY2Vob2xkZXI6IE51bGxhYmxlPENvbW1lbnQ+ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB2aXNpYmlsaXR5U3Vic2NyaWJlcnMgPSBuZXcgU2V0PENvbnRleHRNZW51VmlzaWJpbGl0eUNhbGxiYWNrPigpO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gY29udGV4dCBtZW51IHZpc2liaWxpdHkgY2hhbmdlcy5cbiAgICogQHJldHVybnMgVW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmVDb250ZXh0TWVudShjYWxsYmFjazogQ29udGV4dE1lbnVWaXNpYmlsaXR5Q2FsbGJhY2spOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnZpc2liaWxpdHlTdWJzY3JpYmVycy5hZGQoY2FsbGJhY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnZpc2liaWxpdHlTdWJzY3JpYmVycy5kZWxldGUoY2FsbGJhY2spO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVZpc2liaWxpdHkodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlzaWJpbGl0eVN1YnNjcmliZXJzLmZvckVhY2goKGNiKSA9PiBjYih2aXNpYmxlKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnksXG4gICAgQGluamVjdChQbGF5ZXJNYW5hZ2VyKSBwcml2YXRlIHJlYWRvbmx5IHBsYXllck1hbmFnZXI6IFBsYXllck1hbmFnZXIsXG4gICAgQGluamVjdChZdGRBcHBQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSB5dGRBcHBQcm92aWRlcjogWXRkQXBwUHJvdmlkZXIsXG4gICAgQGluamVjdChQaXBXaW5kb3dQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSBwaXBXaW5kb3dQcm92aWRlcjogUGlwV2luZG93UHJvdmlkZXJcbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnQ29udGV4dE1lbnVIYW5kbGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZS1waGFzZSBjbGljayBoYW5kbGVyIGZvciBjb3B5IG1lbnUgaXRlbXMuXG4gICAqIERlZmluZWQgYXMgYXJyb3cgZnVuY3Rpb24gdG8gcHJlc2VydmUgYHRoaXNgIGJpbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUNvcHlDbGljayA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLnBpcFdpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvYyA9IHRoaXMucGlwV2luZG93LmRvY3VtZW50O1xuICAgIGNvbnN0IGl0ZW0gPSAoZS50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoU0VMRUNUT1JTLk1FTlVfSVRFTSk7XG4gICAgaWYgKCFpdGVtPy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ29weSBjbGljazogbm90IGEgbWVudSBpdGVtIG9yIG5vIHBhcmVudCcsIHsgaXRlbSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFNFTEVDVE9SUy5QQU5FTF9NRU5VX0lURU1TKTtcbiAgICBjb25zdCBpbmRleCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoaXRlbXMsIGl0ZW0pO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0NvcHkgY2xpY2s6IG1lbnUgaXRlbSBpbmRleCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb3B5VHlwZSA9IHRoaXMuZ2V0Q29weVR5cGVGb3JJbmRleChpbmRleCk7XG4gICAgaWYgKCFjb3B5VHlwZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NvcHkgY2xpY2s6IG5vdCBhIGNvcHkgYWN0aW9uJywgeyBpbmRleCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHN3aXRjaCAoY29weVR5cGUpIHtcbiAgICAgIGNhc2UgQ29weVR5cGUuREVCVUdfSU5GTzoge1xuICAgICAgICB0ZXh0ID0gdGhpcy5wbGF5ZXJNYW5hZ2VyLmdldERlYnVnSW5mbygpID8/ICcnO1xuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdEZWJ1ZyBpbmZvIG5vdCBhdmFpbGFibGUsIGNhbm5vdCBjb3B5Jyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCB2aWRlb0RhdGEgPSB0aGlzLnBsYXllck1hbmFnZXIuZ2V0VmlkZW9EYXRhKCk7XG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB2aWRlb0RhdGE/LnZpZGVvX2lkO1xuICAgICAgICBpZiAoIXZpZGVvSWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdWaWRlbyBJRCBub3QgZm91bmQsIGNhbm5vdCBjb3B5Jyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB2aWRlb0RhdGE/Lmxpc3QgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnBsYXllck1hbmFnZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSB2aWRlb0RhdGE/LnRpdGxlID8/ICcnO1xuICAgICAgICBjb25zdCBlbWJlZFNpemUgPSBjb3B5VHlwZSA9PT0gQ29weVR5cGUuRU1CRUQgPyB0aGlzLnBsYXllck1hbmFnZXIuZ2V0UGxheWVyU2l6ZSgpIDogbnVsbDtcbiAgICAgICAgdGV4dCA9IHRoaXMuZ2V0Q29weVBheWxvYWQoe1xuICAgICAgICAgIHZpZGVvSWQsXG4gICAgICAgICAgcGxheWxpc3RJZCxcbiAgICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBjb3B5VHlwZSxcbiAgICAgICAgICBlbWJlZFNpemUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdDb3B5IGNsaWNrOiBlbXB0eSBwYXlsb2FkJywgeyBjb3B5VHlwZSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb2sgPSBET01VdGlscy5jb3B5VmlhVGV4dGFyZWEoZG9jLCB0ZXh0KTtcbiAgICBpZiAob2spIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDb3BpZWQgJHtjb3B5VHlwZX0gdG8gY2xpcGJvYXJkYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbnRleHQgbWVudSBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBpcFdpbmRvdyA9IHRoaXMucGlwV2luZG93UHJvdmlkZXIuZ2V0V2luZG93KCk7XG4gICAgdGhpcy5jb250ZXh0TWVudVBsYWNlaG9sZGVyID0gRE9NVXRpbHMuY3JlYXRlUGxhY2Vob2xkZXIoJ2NvbnRleHRfbWVudV9wbGFjZWhvbGRlcicpO1xuXG4gICAgLy8gV2FpdCBmb3IgY29udGV4dCBtZW51IHRvIGFwcGVhclxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51ID0gYXdhaXQgRE9NVXRpbHMud2FpdEZvckVsZW1lbnRTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICAgIFNFTEVDVE9SUy5DT05URVhUX01FTlUsXG4gICAgICAgIGRvY3VtZW50LFxuICAgICAgICBUSU1FT1VUUy5FTEVNRU5UX1dBSVRfSU5GSU5JVEUsXG4gICAgICAgIHRoaXMucGlwV2luZG93XG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ2dlci5sb2coJ0NvbnRleHQgbWVudSBlbGVtZW50IGZvdW5kLCBzdGFydGluZyB2aXNpYmlsaXR5IG1vbml0b3JpbmcnKTtcblxuICAgICAgdGhpcy5zdGFydE1vbml0b3JpbmcoKTtcbiAgICAgIHRoaXMuc2V0dXBEaXNtaXNzYWxIYW5kbGVyKCk7XG4gICAgICB0aGlzLnNldHVwQ29weUhhbmRsZXIoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdFcnJvciBpbml0aWFsaXppbmcgY29udGV4dCBtZW51IGhhbmRsZXI6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IG1vbml0b3JpbmcgY29udGV4dCBtZW51IHZpc2liaWxpdHlcbiAgICovXG4gIHByaXZhdGUgc3RhcnRNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250ZXh0TWVudSB8fCAhdGhpcy5waXBXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5jb250ZXh0TWVudSB8fCAhdGhpcy5waXBXaW5kb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1Zpc2libGUgPSB0aGlzLmNvbnRleHRNZW51LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgICAgIGNvbnN0IGlzSW5NYWluV2luZG93ID0gdGhpcy5jb250ZXh0TWVudS5wYXJlbnROb2RlICE9PSB0aGlzLnBpcFdpbmRvdy5kb2N1bWVudC5ib2R5O1xuXG4gICAgICBpZiAoaXNWaXNpYmxlICYmIGlzSW5NYWluV2luZG93KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZygnQ29udGV4dCBtZW51IG9wZW5lZCBpbiBtYWluIHdpbmRvdy4gSW50ZXJjZXB0aW5nLi4uJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVQbGFjZWhvbGRlcikge1xuICAgICAgICAgIERPTVV0aWxzLmluc2VydFBsYWNlaG9sZGVyQmVmb3JlKHRoaXMuY29udGV4dE1lbnUsIHRoaXMuY29udGV4dE1lbnVQbGFjZWhvbGRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRleHRNZW51KTtcbiAgICAgICAgdGhpcy5ub3RpZnlWaXNpYmlsaXR5KHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghaXNWaXNpYmxlICYmIHRoaXMuY29udGV4dE1lbnUucGFyZW50Tm9kZSA9PT0gdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQuYm9keSkge1xuICAgICAgICB0aGlzLm5vdGlmeVZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudVBsYWNlaG9sZGVyPy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdDb250ZXh0IG1lbnUgY2xvc2VkIGluIFBpUCB3aW5kb3cuIFJldHVybmluZyB0byBtYWluLi4uJyk7XG4gICAgICAgICAgRE9NVXRpbHMucmVzdG9yZUVsZW1lbnRGcm9tUGxhY2Vob2xkZXIodGhpcy5jb250ZXh0TWVudSwgdGhpcy5jb250ZXh0TWVudVBsYWNlaG9sZGVyKTtcbiAgICAgICAgICB0aGlzLnNpbXVsYXRlTWFpbkNvbnRleHRNZW51KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2VydmUgc3R5bGUgYXR0cmlidXRlIGNoYW5nZXNcbiAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGV4dE1lbnUsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXSxcbiAgICB9KTtcblxuICAgIC8vIE1vdmUgbWVudSBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IHZpc2libGVcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51UGxhY2Vob2xkZXIpIHtcbiAgICAgICAgRE9NVXRpbHMuaW5zZXJ0UGxhY2Vob2xkZXJCZWZvcmUodGhpcy5jb250ZXh0TWVudSwgdGhpcy5jb250ZXh0TWVudVBsYWNlaG9sZGVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGlwV2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jb250ZXh0TWVudSk7XG4gICAgICB0aGlzLm5vdGlmeVZpc2liaWxpdHkodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBpcyBkb25lIHZpYSBQaVBNYW5hZ2VyLm9uQmVmb3JlUmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgaGFuZGxlciB0byBkaXNtaXNzIGNvbnRleHQgbWVudSBvbiBjbGljayBvdXRzaWRlXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGlzbWlzc2FsSGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlwV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRXZlbnQgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbWVudUluUGlwID0gdGhpcy5waXBXaW5kb3chLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNFTEVDVE9SUy5DT05URVhUX01FTlUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG1lbnVJblBpcCAmJlxuICAgICAgICBtZW51SW5QaXAuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmXG4gICAgICAgICEoZS50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoU0VMRUNUT1JTLkNPTlRFWFRfTUVOVV9DT05UQUlORVIpXG4gICAgICApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbWVudUluUGlwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMubm90aWZ5VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb250ZXh0IG1lbnUgZGlzbWlzc2VkJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucGlwV2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlRXZlbnQsIHRydWUpO1xuICAgIHRoaXMucGlwV2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgaGFuZGxlRXZlbnQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGNhcHR1cmUtcGhhc2UgY2xpY2sgaGFuZGxlciBmb3IgY29weSBtZW51IGl0ZW1zIGluIFBpUC5cbiAgICogQ29waWVzIHZpYSB0ZW1wb3JhcnkgdGV4dGFyZWEgc2luY2UgbWFpbi13aW5kb3cgdGV4dGFyZWEgaXMgZGlzY29ubmVjdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cENvcHlIYW5kbGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waXBXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBpcFdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ29weUNsaWNrLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29weVR5cGVGb3JJbmRleChpbmRleDogbnVtYmVyKTogQ29weVR5cGUgfCBudWxsIHtcbiAgICBpZiAoaW5kZXggPT09IENPUFlfTUVOVV9JTkRJQ0VTLlZJREVPX1VSTCkgcmV0dXJuIENvcHlUeXBlLlZJREVPX1VSTDtcbiAgICBpZiAoaW5kZXggPT09IENPUFlfTUVOVV9JTkRJQ0VTLlVSTF9BVF9USU1FKSByZXR1cm4gQ29weVR5cGUuVVJMX0FUX1RJTUU7XG4gICAgaWYgKGluZGV4ID09PSBDT1BZX01FTlVfSU5ESUNFUy5FTUJFRCkgcmV0dXJuIENvcHlUeXBlLkVNQkVEO1xuICAgIGlmIChpbmRleCA9PT0gQ09QWV9NRU5VX0lORElDRVMuREVCVUdfSU5GTykgcmV0dXJuIENvcHlUeXBlLkRFQlVHX0lORk87XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldENvcHlQYXlsb2FkKHBhcmFtczoge1xuICAgIHZpZGVvSWQ6IHN0cmluZztcbiAgICBwbGF5bGlzdElkOiBOdWxsYWJsZTxzdHJpbmc+O1xuICAgIGN1cnJlbnRUaW1lOiBudW1iZXI7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBjb3B5VHlwZTogQ29weVR5cGU7XG4gICAgZW1iZWRTaXplPzogTnVsbGFibGU8eyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkQ29weVBheWxvYWQocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSBjb250ZXh0IG1lbnUgZXZlbnQgaW4gbWFpbiB3aW5kb3dcbiAgICovXG4gIHByaXZhdGUgc2ltdWxhdGVNYWluQ29udGV4dE1lbnUoKTogdm9pZCB7XG4gICAgY29uc3QgbWFpbkFwcCA9IHRoaXMueXRkQXBwUHJvdmlkZXIuZ2V0QXBwKCk7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBNb3VzZUV2ZW50KCdjb250ZXh0bWVudScsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgY2xpZW50WDogMCxcbiAgICAgIGNsaWVudFk6IDAsXG4gICAgICBidXR0b246IE1PVVNFX0JVVFRPTlMuU0VDT05EQVJZLFxuICAgIH0pO1xuXG4gICAgbWFpbkFwcC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU3ludGhldGljIGNvbnRleHRtZW51IGV2ZW50IHNlbnQgdG8gbWFpbiB3aW5kb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIG1vbml0b3JpbmcgYW5kIGNsZWFudXBcbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpc2liaWxpdHlPYnNlcnZlcikge1xuICAgICAgdGhpcy52aXNpYmlsaXR5T2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy52aXNpYmlsaXR5T2JzZXJ2ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpcFdpbmRvdykge1xuICAgICAgdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNvcHlDbGljaywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG1lbnUgdG8gbWFpbiB3aW5kb3cgaWYgc3RpbGwgaW4gUGlQXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb250ZXh0TWVudSAmJlxuICAgICAgdGhpcy5waXBXaW5kb3cgJiZcbiAgICAgIHRoaXMuY29udGV4dE1lbnUucGFyZW50Tm9kZSA9PT0gdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQuYm9keSAmJlxuICAgICAgdGhpcy5jb250ZXh0TWVudVBsYWNlaG9sZGVyPy5wYXJlbnROb2RlXG4gICAgKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coJ1JldHVybmluZyBjb250ZXh0IG1lbnUgdG8gbWFpbiB3aW5kb3cnKTtcbiAgICAgIERPTVV0aWxzLnJlc3RvcmVFbGVtZW50RnJvbVBsYWNlaG9sZGVyKHRoaXMuY29udGV4dE1lbnUsIHRoaXMuY29udGV4dE1lbnVQbGFjZWhvbGRlcik7XG4gICAgICB0aGlzLnNpbXVsYXRlTWFpbkNvbnRleHRNZW51KCk7XG4gICAgfVxuXG4gICAgdGhpcy5waXBXaW5kb3cgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDb250ZXh0IG1lbnUgaGFuZGxlciBzdG9wcGVkJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNFTEVDVE9SUyB9IGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcblxuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBQbGF5ZXJNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9QbGF5ZXJNYW5hZ2VyJztcbmltcG9ydCB7IFBpcFdpbmRvd1Byb3ZpZGVyIH0gZnJvbSAnLi4vY29yZS9QaXBXaW5kb3dQcm92aWRlcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogSGFuZGxlcyBtYW51YWwgc2Vla2luZyBvbiBwcm9ncmVzcyBiYXJcbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlZWtIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSBwaXBXaW5kb3c6IE51bGxhYmxlPFdpbmRvdz4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBpbmplY3QoTG9nZ2VyRmFjdG9yeSkgbG9nZ2VyRmFjdG9yeTogTG9nZ2VyRmFjdG9yeSxcbiAgICBAaW5qZWN0KFBsYXllck1hbmFnZXIpIHByaXZhdGUgcmVhZG9ubHkgcGxheWVyTWFuYWdlcjogUGxheWVyTWFuYWdlcixcbiAgICBAaW5qZWN0KFBpcFdpbmRvd1Byb3ZpZGVyKSBwcml2YXRlIHJlYWRvbmx5IHBpcFdpbmRvd1Byb3ZpZGVyOiBQaXBXaW5kb3dQcm92aWRlclxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlckZhY3RvcnkuY3JlYXRlKCdTZWVrSGFuZGxlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgc2VlayBoYW5kbGVyIGZvciBQaVAgd2luZG93XG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBpcFdpbmRvdyA9IHRoaXMucGlwV2luZG93UHJvdmlkZXIuZ2V0V2luZG93KCk7XG4gICAgdGhpcy5zZXR1cFNlZWtIYW5kbGVyKCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NlZWsgaGFuZGxlciBpbml0aWFsaXplZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIG1vdXNlIGhhbmRsZXJzIGZvciBwcm9ncmVzcyBiYXIgc2Vla2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNlZWtIYW5kbGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5waXBXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwaXBEb2MgPSB0aGlzLnBpcFdpbmRvdy5kb2N1bWVudDtcbiAgICBwaXBEb2MuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdtb3VzZWRvd24nLFxuICAgICAgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSAoZS50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoU0VMRUNUT1JTLlBST0dSRVNTX0JBUik7XG4gICAgICAgIGlmICghcHJvZ3Jlc3NCYXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnBsYXllck1hbmFnZXIuZ2V0UGxheWVyKCk7XG4gICAgICAgIGlmICh0eXBlb2YgcGxheWVyLmdldER1cmF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ3BsYXllci5nZXREdXJhdGlvbiBtZXRob2Qgbm90IGZvdW5kJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGxheWVyLnNlZWtUbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdwbGF5ZXIuc2Vla1RvIG1ldGhvZCBub3QgZm91bmQnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnUHJvZ3Jlc3MgYmFyIGNsaWNrZWQsIGluaXRpYXRpbmcgc2VlaycpO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCBwZXJmb3JtU2VlayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlY3QgPSBwcm9ncmVzc0Jhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgICAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgeCAvIHJlY3Qud2lkdGgpKTtcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHBsYXllci5nZXREdXJhdGlvbj8uKCk7XG4gICAgICAgICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBzZWVrVGltZSA9IHBlcmNlbnQgKiBkdXJhdGlvbjtcbiAgICAgICAgICAgIHBsYXllci5zZWVrVG8/LihzZWVrVGltZSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNlZWtpbmcgdG8gJHtzZWVrVGltZS50b0ZpeGVkKDIpfXMgKCR7KHBlcmNlbnQgKiAxMDApLnRvRml4ZWQoMSl9JSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBwZXJmb3JtU2VlayhlKTtcblxuICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IChtb3ZlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHBlcmZvcm1TZWVrKG1vdmVFdmVudCk7XG4gICAgICAgIGNvbnN0IG9uTW91c2VVcCA9ICgpID0+IHtcbiAgICAgICAgICBwaXBEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICAgIHBpcERvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU2VlayBkcmFnIGVuZGVkJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcGlwRG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgcGlwRG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgc2VlayBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICB0aGlzLnBpcFdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NlZWsgaGFuZGxlciBjbGVhbmVkIHVwJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBsYXllck1hbmFnZXIgfSBmcm9tICcuL1BsYXllck1hbmFnZXInO1xuaW1wb3J0IHsgWXRkQXBwUHJvdmlkZXIgfSBmcm9tICcuL1l0ZEFwcFByb3ZpZGVyJztcbmltcG9ydCB7IFBpcFdpbmRvd1Byb3ZpZGVyIH0gZnJvbSAnLi9QaXBXaW5kb3dQcm92aWRlcic7XG5pbXBvcnQgeyBZb3VUdWJlQ29tbWFuZCwgTGlrZUFjdGlvblR5cGUgfSBmcm9tICcuLi90eXBlcy95b3V0dWJlJztcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnLi4vZGknO1xuXG4vKipcbiAqIFNlbmRzIFlvdVR1YmUgbGlrZS9kaXNsaWtlL3JlbW92ZSBjb21tYW5kcyB0byBtYWluIHdpbmRvdyB5dGQtYXBwLlxuICogVXNlZCBieSBMaWtlQnV0dG9uSGFuZGxlciB3aGVuIHVzZXIgY2xpY2tzIGxpa2UvZGlzbGlrZSBpbiBQaVAuXG4gKi9cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBZdEFjdGlvblNlbmRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQGluamVjdChMb2dnZXJGYWN0b3J5KSBsb2dnZXJGYWN0b3J5OiBMb2dnZXJGYWN0b3J5LFxuICAgIEBpbmplY3QoUGxheWVyTWFuYWdlcikgcHJpdmF0ZSByZWFkb25seSBwbGF5ZXJNYW5hZ2VyOiBQbGF5ZXJNYW5hZ2VyLFxuICAgIEBpbmplY3QoWXRkQXBwUHJvdmlkZXIpIHByaXZhdGUgcmVhZG9ubHkgeXRkQXBwUHJvdmlkZXI6IFl0ZEFwcFByb3ZpZGVyLFxuICAgIEBpbmplY3QoUGlwV2luZG93UHJvdmlkZXIpIHByaXZhdGUgcmVhZG9ubHkgcGlwV2luZG93UHJvdmlkZXI6IFBpcFdpbmRvd1Byb3ZpZGVyXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyRmFjdG9yeS5jcmVhdGUoJ1l0QWN0aW9uU2VuZGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBsaWtlL2Rpc2xpa2UgYWN0aW9uIChMSUtFIC8gRElTTElLRSAvIFJFTU9WRSkgZm9yIHRoZSBjdXJyZW50IFBpUCB2aWRlby5cbiAgICogUmVzb2x2ZXMgdmlkZW8gSUQgZnJvbSBQaVAgcGxheWVyIGFuZCBpbnZva2VzIG1haW4gd2luZG93IHJlc29sdmVDb21tYW5kLlxuICAgKi9cbiAgcHVibGljIHNlbmRMaWtlQWN0aW9uKGFjdGlvblR5cGU6IExpa2VBY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgY29uc3QgcGlwV2luZG93ID0gdGhpcy5waXBXaW5kb3dQcm92aWRlci5nZXRXaW5kb3coKTtcbiAgICBpZiAoIXBpcFdpbmRvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvSWQgPSB0aGlzLnBsYXllck1hbmFnZXIuZ2V0VmlkZW9JZCgpO1xuXG4gICAgaWYgKCF2aWRlb0lkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignVmlkZW8gSUQgbm90IGZvdW5kLCBjYW5ub3Qgc2VuZCBsaWtlIGFjdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5BcHAgPSB0aGlzLnl0ZEFwcFByb3ZpZGVyLmdldEFwcCgpO1xuICAgIGlmICh0eXBlb2YgbWFpbkFwcC5yZXNvbHZlQ29tbWFuZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBmaW5kIHJlc29sdmVDb21tYW5kIGluIG1haW4gd2luZG93Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZDogWW91VHViZUNvbW1hbmQgPSB7XG4gICAgICBsaWtlRW5kcG9pbnQ6IHtcbiAgICAgICAgc3RhdHVzOiBhY3Rpb25UeXBlLFxuICAgICAgICB0YXJnZXQ6IHsgdmlkZW9JZCB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIG1haW5BcHAucmVzb2x2ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coYFNlbnQgJHthY3Rpb25UeXBlfSBmb3IgdmlkZW8gJHt2aWRlb0lkfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdFcnJvciBzZW5kaW5nIFlvdVR1YmUgYWN0aW9uOicsIGUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgWVRfTElLRV9BQ1RJT05TIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNFTEVDVE9SUyB9IGZyb20gJy4uL3NlbGVjdG9ycyc7XG5pbXBvcnQgeyBZdEFjdGlvblNlbmRlciB9IGZyb20gJy4uL2NvcmUvWXRBY3Rpb25TZW5kZXInO1xuaW1wb3J0IHsgUGlwV2luZG93UHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL1BpcFdpbmRvd1Byb3ZpZGVyJztcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICcuLi90eXBlcy9hcHAnO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogSGFuZGxlcyBsaWtlL2Rpc2xpa2UgYnV0dG9uIGNsaWNrcyBpbiBQaVAgd2luZG93XG4gKi9cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMaWtlQnV0dG9uSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgcGlwV2luZG93OiBOdWxsYWJsZTxXaW5kb3c+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnksXG4gICAgQGluamVjdChQaXBXaW5kb3dQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSBwaXBXaW5kb3dQcm92aWRlcjogUGlwV2luZG93UHJvdmlkZXIsXG4gICAgQGluamVjdChZdEFjdGlvblNlbmRlcikgcHJpdmF0ZSByZWFkb25seSB5dEFjdGlvblNlbmRlcjogWXRBY3Rpb25TZW5kZXJcbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnTGlrZUJ1dHRvbkhhbmRsZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGxpa2UgYnV0dG9uIGhhbmRsZXIgZm9yIFBpUCB3aW5kb3dcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIHRoaXMucGlwV2luZG93ID0gdGhpcy5waXBXaW5kb3dQcm92aWRlci5nZXRXaW5kb3coKTtcbiAgICB0aGlzLnNldHVwQ2xpY2tIYW5kbGVyKCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xpa2UgYnV0dG9uIGhhbmRsZXIgaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBjbGljayBoYW5kbGVyIGZvciBsaWtlL2Rpc2xpa2UgYnV0dG9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cENsaWNrSGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlwV2luZG93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICdjbGljaycsXG4gICAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdG9nZ2xlQnV0dG9uID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdDxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgICAgICAgU0VMRUNUT1JTLkxJS0VfQlVUVE9OXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdG9nZ2xlQnV0dG9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gdG9nZ2xlQnV0dG9uLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmICghYnV0dG9uQ29udGFpbmVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNMaWtlQnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNoaWxkTm9kZXNbMF0gPT09IHRvZ2dsZUJ1dHRvbjtcbiAgICAgICAgY29uc3QgaXNEaXNsaWtlQnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNoaWxkTm9kZXNbMV0gPT09IHRvZ2dsZUJ1dHRvbjtcblxuICAgICAgICBpZiAoIWlzTGlrZUJ1dHRvbiAmJiAhaXNEaXNsaWtlQnV0dG9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnV0dG9uID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdDxIVE1MQnV0dG9uRWxlbWVudD4oXG4gICAgICAgICAgU0VMRUNUT1JTLkJVVFRPTl9TSEFQRVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWJ1dHRvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJlc3NlZCA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcpID09PSAndHJ1ZSc7XG4gICAgICAgIGNvbnN0IGFjdGlvblR5cGUgPSBpc1ByZXNzZWRcbiAgICAgICAgICA/IFlUX0xJS0VfQUNUSU9OUy5SRU1PVkVcbiAgICAgICAgICA6IGlzTGlrZUJ1dHRvblxuICAgICAgICAgICAgPyBZVF9MSUtFX0FDVElPTlMuTElLRVxuICAgICAgICAgICAgOiBZVF9MSUtFX0FDVElPTlMuRElTTElLRTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYCR7YWN0aW9uVHlwZX0gYnV0dG9uIGNsaWNrZWQgKGN1cnJlbnRseSBwcmVzc2VkOiAke2lzUHJlc3NlZH0pYCk7XG5cbiAgICAgICAgdGhpcy55dEFjdGlvblNlbmRlci5zZW5kTGlrZUFjdGlvbihhY3Rpb25UeXBlKTtcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTsgLy8gQ2FwdHVyZSBwaGFzZVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgbGlrZSBidXR0b24gaGFuZGxlclxuICAgKi9cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5waXBXaW5kb3cgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMaWtlIGJ1dHRvbiBoYW5kbGVyIGNsZWFuZWQgdXAnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL2FwcCc7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFBsYXllck1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL1BsYXllck1hbmFnZXInO1xuaW1wb3J0IHsgUGlwV2luZG93UHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL1BpcFdpbmRvd1Byb3ZpZGVyJztcbmltcG9ydCB7IENvbnRleHRNZW51SGFuZGxlciB9IGZyb20gJy4uL3VpL0NvbnRleHRNZW51SGFuZGxlcic7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICcuLi9kaSc7XG5cbi8qKlxuICogTGlzdGVucyB0byBjYXB0dXJlIGNsaWNrIG9uIGJvZHkgYW5kIGtleXVwIG9uIGRvY3VtZW50IChhbnkga2V5IGV4Y2VwdCBUYWIpLlxuICogUmV0dXJucyBmb2N1cyB0byBwbGF5ZXIgd2hlbiBpdCBtb3ZlcyBvdXRzaWRlIHRoZSBwbGF5ZXIsIGJ1dCBvbmx5IHdoZW4gY29udGV4dFxuICogbWVudSBpcyBjbG9zZWQuIFVzZXMgc2V0VGltZW91dCgwKSBzbyBmb2N1cyBydW5zIGFmdGVyIG90aGVyIGhhbmRsZXJzLlxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRGb2N1c0hhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHBpcFdpbmRvdzogTnVsbGFibGU8V2luZG93PiA9IG51bGw7XG4gIHByaXZhdGUgaXNDb250ZXh0TWVudU9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUNvbnRleHRNZW51OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJldHVybkZvY3VzVG9QbGF5ZXJJZk5lZWRlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGlwV2luZG93IHx8IHRoaXMuaXNDb250ZXh0TWVudU9wZW4pIHJldHVybjtcblxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMucGlwV2luZG93LmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5wbGF5ZXJNYW5hZ2VyLmdldFBsYXllcigpO1xuICAgIGlmICghYWN0aXZlIHx8IGFjdGl2ZSA9PT0gcGxheWVyKSByZXR1cm47XG5cbiAgICBpZiAodHlwZW9mIHBsYXllci5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1JldHVybmluZyBmb2N1cyB0byBwbGF5ZXInKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gcGxheWVyLmZvY3VzKCksIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Cb2R5Q2xpY2sgPSAoKTogdm9pZCA9PiB0aGlzLnJldHVybkZvY3VzVG9QbGF5ZXJJZk5lZWRlZCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25LZXlVcCA9IChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnVGFiJykgcmV0dXJuO1xuICAgIHRoaXMucmV0dXJuRm9jdXNUb1BsYXllcklmTmVlZGVkKCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQGluamVjdChMb2dnZXJGYWN0b3J5KSBsb2dnZXJGYWN0b3J5OiBMb2dnZXJGYWN0b3J5LFxuICAgIEBpbmplY3QoUGxheWVyTWFuYWdlcikgcHJpdmF0ZSByZWFkb25seSBwbGF5ZXJNYW5hZ2VyOiBQbGF5ZXJNYW5hZ2VyLFxuICAgIEBpbmplY3QoUGlwV2luZG93UHJvdmlkZXIpIHByaXZhdGUgcmVhZG9ubHkgcGlwV2luZG93UHJvdmlkZXI6IFBpcFdpbmRvd1Byb3ZpZGVyLFxuICAgIEBpbmplY3QoQ29udGV4dE1lbnVIYW5kbGVyKSBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRNZW51SGFuZGxlcjogQ29udGV4dE1lbnVIYW5kbGVyXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyRmFjdG9yeS5jcmVhdGUoJ0RvY3VtZW50Rm9jdXNIYW5kbGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBmb2N1cyBvYnNlcnZlciBmb3IgUGlQIHdpbmRvd1xuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5waXBXaW5kb3cgPSB0aGlzLnBpcFdpbmRvd1Byb3ZpZGVyLmdldFdpbmRvdygpO1xuICAgIGlmICghdGhpcy5waXBXaW5kb3cpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdQaVAgd2luZG93IG5vdCBhdmFpbGFibGUgZm9yIGRvY3VtZW50IGZvY3VzIGhhbmRsZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29udGV4dE1lbnUgPSB0aGlzLmNvbnRleHRNZW51SGFuZGxlci5zdWJzY3JpYmVDb250ZXh0TWVudSgodmlzaWJsZSkgPT4ge1xuICAgICAgdGhpcy5pc0NvbnRleHRNZW51T3BlbiA9IHZpc2libGU7XG4gICAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgICAgdGhpcy5yZXR1cm5Gb2N1c1RvUGxheWVySWZOZWVkZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucGlwV2luZG93LmRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQm9keUNsaWNrLCB0cnVlKTtcbiAgICB0aGlzLnBpcFdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcCwgdHJ1ZSk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0RvY3VtZW50IGZvY3VzIGhhbmRsZXIgaW5pdGlhbGl6ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29udGV4dE1lbnU/LigpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb250ZXh0TWVudSA9IG51bGw7XG4gICAgaWYgKHRoaXMucGlwV2luZG93Py5kb2N1bWVudD8uYm9keSkge1xuICAgICAgdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Cb2R5Q2xpY2ssIHRydWUpO1xuICAgICAgdGhpcy5waXBXaW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXAsIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnBpcFdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5pc0NvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdEb2N1bWVudCBmb2N1cyBoYW5kbGVyIGNsZWFuZWQgdXAnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBQaXBXaW5kb3dQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvUGlwV2luZG93UHJvdmlkZXInO1xuaW1wb3J0IHsgWXRkQXBwUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL1l0ZEFwcFByb3ZpZGVyJztcbmltcG9ydCB7IFBsYXllck1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL1BsYXllck1hbmFnZXInO1xuaW1wb3J0IHsgU0VMRUNUT1JTIH0gZnJvbSAnLi4vc2VsZWN0b3JzJztcbmltcG9ydCB0eXBlIHsgWW91VHViZVBsYXllciB9IGZyb20gJy4uL3R5cGVzL3lvdXR1YmUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnLi4vZGknO1xuXG4vKipcbiAqIFN5bmNzIFBpUCB3aW5kb3cgdGl0bGUgd2hlbiB0aGUgcGxheWVyJ3MgdmlkZW8gZWxlbWVudCBzcmMgb3IgdGhlIG5vdGlmeSByZW5kZXJlciBET00gY2hhbmdlcy5cbiAqIE9ic2VydmVzIHRoZSB2aWRlbyBlbGVtZW50IChzcmMpIGFuZCB0aGUgbm90aWZ5IHJlbmRlcmVyIGVsZW1lbnQgKGNoaWxkTGlzdCkgYW5kIHVwZGF0ZXMgdGl0bGUgZnJvbSBnZXRWaWRlb0RhdGEoKS5cbiAqIERvZXMgbm90IGRlcGVuZCBvbiBQaVBNYW5hZ2VyIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpdGxlU3luY0hhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIG11dGF0aW9uT2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnksXG4gICAgQGluamVjdChQaXBXaW5kb3dQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSBwaXBXaW5kb3dQcm92aWRlcjogUGlwV2luZG93UHJvdmlkZXIsXG4gICAgQGluamVjdChZdGRBcHBQcm92aWRlcikgcHJpdmF0ZSByZWFkb25seSB5dGRBcHBQcm92aWRlcjogWXRkQXBwUHJvdmlkZXIsXG4gICAgQGluamVjdChQbGF5ZXJNYW5hZ2VyKSBwcml2YXRlIHJlYWRvbmx5IHBsYXllck1hbmFnZXI6IFBsYXllck1hbmFnZXJcbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnVGl0bGVTeW5jSGFuZGxlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IG9ic2VydmluZyB0aGUgcGxheWVyJ3MgdmlkZW8gZWxlbWVudCAoc3JjKSBhbmQgdGhlIG5vdGlmeSByZW5kZXJlciBlbGVtZW50IChET00gY2hhbmdlcykgYW5kIHN5bmMgdGl0bGUuXG4gICAqIENhbGwgd2hlbiBQaVAgd2luZG93IGlzIG9wZW4uIFNraXBzIHN5bmMgd2hlbiBQaVAgd2FzIG9wZW5lZCBmcm9tIG1pbmkgcGxheWVyIChmcm9tIFBsYXllck1hbmFnZXIpLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxheWVyTWFuYWdlci5nZXRXYXNNaW5pUGxheWVyQWN0aXZlQmVmb3JlUGlQKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdUaXRsZSBzeW5jIHNraXBwZWQgKGUuZy4gUGlQIG9wZW5lZCBmcm9tIG1pbmkgcGxheWVyKScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBpcFdpbmRvdyA9IHRoaXMucGlwV2luZG93UHJvdmlkZXIuZ2V0V2luZG93KCk7XG4gICAgaWYgKCFwaXBXaW5kb3cpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdQaVAgbm90IG9wZW4sIHNraXBwaW5nIHRpdGxlIHN5bmMgaW5pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMucGxheWVyTWFuYWdlci5nZXRQbGF5ZXIoKSBhcyBZb3VUdWJlUGxheWVyO1xuICAgIGNvbnN0IHZpZGVvID0gcGxheWVyLnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLlBMQVlFUl9WSURFTyk7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignVmlkZW8gZWxlbWVudCBub3QgZm91bmQgaW5zaWRlIHBsYXllcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN5bmNUaXRsZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBwbGF5ZXIuZ2V0VmlkZW9EYXRhPy4oKTtcbiAgICAgIGlmIChkYXRhPy50aXRsZSkge1xuICAgICAgICB0aGlzLnNldFdpbmRvd3NUaXRsZShkYXRhLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3luY1RpdGxlKCk7XG5cbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBzeW5jVGl0bGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh2aWRlbywge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzcmMnXSxcbiAgICB9KTtcbiAgICBjb25zdCBub3RpZnlSZW5kZXJlciA9IHRoaXMueXRkQXBwUHJvdmlkZXIuZ2V0Tm90aWZ5UmVuZGVyZXIoKTtcbiAgICBpZiAobm90aWZ5UmVuZGVyZXIpIHtcbiAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG5vdGlmeVJlbmRlcmVyLCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVGl0bGUgc3luYyBvYnNlcnZpbmcgdmlkZW8gc3JjIGFuZCBub3RpZnkgcmVuZGVyZXIgc3VidHJlZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRXaW5kb3dzVGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBpcFdpbmRvdyA9IHRoaXMucGlwV2luZG93UHJvdmlkZXIuZ2V0V2luZG93KCk7XG4gICAgaWYgKCFwaXBXaW5kb3cpIHJldHVybjtcbiAgICBjb25zdCBub3RpZnkgPSB0aGlzLnl0ZEFwcFByb3ZpZGVyLmdldE5vdGlmeVJlbmRlcmVyKCk7XG4gICAgY29uc3QgY291bnROb3RpZiA9IG5vdGlmeT8uc2hvd05vdGlmaWNhdGlvbkNvdW50ID8gYCgke25vdGlmeS5zaG93Tm90aWZpY2F0aW9uQ291bnR9KSBgIDogJyc7XG4gICAgY29uc3QgbmV3VGl0bGUgPSBgJHtjb3VudE5vdGlmfSR7dGl0bGV9IC0gWW91VHViZWA7XG4gICAgZG9jdW1lbnQudGl0bGUgPSBuZXdUaXRsZTtcbiAgICBwaXBXaW5kb3cuZG9jdW1lbnQudGl0bGUgPSBuZXdUaXRsZTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgVGl0bGUgc3luY2VkOiAke3RpdGxlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3Agb2JzZXJ2aW5nLiBDYWxsIHdoZW4gUGlQIHdpbmRvdyBpcyBjbG9zaW5nLlxuICAgKi9cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG51bGw7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVGl0bGUgc3luYyBvYnNlcnZlciBkaXNjb25uZWN0ZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlc2l6ZVRyYWNrZXIgfSBmcm9tICcuLi91aS9SZXNpemVUcmFja2VyJztcbmltcG9ydCB7IE1lbnVPYnNlcnZlciB9IGZyb20gJy4uL3VpL01lbnVPYnNlcnZlcic7XG5pbXBvcnQgeyBDb250ZXh0TWVudUhhbmRsZXIgfSBmcm9tICcuLi91aS9Db250ZXh0TWVudUhhbmRsZXInO1xuaW1wb3J0IHsgU2Vla0hhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TZWVrSGFuZGxlcic7XG5pbXBvcnQgeyBMaWtlQnV0dG9uSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0xpa2VCdXR0b25IYW5kbGVyJztcbmltcG9ydCB7IE5hdmlnYXRpb25IYW5kbGVyIH0gZnJvbSAnLi4vY29yZS9OYXZpZ2F0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBEb2N1bWVudEZvY3VzSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0RvY3VtZW50Rm9jdXNIYW5kbGVyJztcbmltcG9ydCB7IFRpdGxlU3luY0hhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9UaXRsZVN5bmNIYW5kbGVyJztcbmltcG9ydCB0eXBlIHsgUGlQQ2xlYW51cENhbGxiYWNrIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJy4uL2RpJztcblxuLyoqXG4gKiBJbml0aWFsaXplcyBQaVAgd2luZG93IGhhbmRsZXJzIGFuZCByZXR1cm5zIGNsZWFudXAgY2FsbGJhY2tcbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBpUFdpbmRvd0hhbmRsZXJzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQGluamVjdChSZXNpemVUcmFja2VyKSBwcml2YXRlIHJlYWRvbmx5IHJlc2l6ZVRyYWNrZXI6IFJlc2l6ZVRyYWNrZXIsXG4gICAgQGluamVjdChNZW51T2JzZXJ2ZXIpIHByaXZhdGUgcmVhZG9ubHkgbWVudU9ic2VydmVyOiBNZW51T2JzZXJ2ZXIsXG4gICAgQGluamVjdChDb250ZXh0TWVudUhhbmRsZXIpIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dE1lbnVIYW5kbGVyOiBDb250ZXh0TWVudUhhbmRsZXIsXG4gICAgQGluamVjdChTZWVrSGFuZGxlcikgcHJpdmF0ZSByZWFkb25seSBzZWVrSGFuZGxlcjogU2Vla0hhbmRsZXIsXG4gICAgQGluamVjdChMaWtlQnV0dG9uSGFuZGxlcikgcHJpdmF0ZSByZWFkb25seSBsaWtlQnV0dG9uSGFuZGxlcjogTGlrZUJ1dHRvbkhhbmRsZXIsXG4gICAgQGluamVjdChOYXZpZ2F0aW9uSGFuZGxlcikgcHJpdmF0ZSByZWFkb25seSBuYXZpZ2F0aW9uSGFuZGxlcjogTmF2aWdhdGlvbkhhbmRsZXIsXG4gICAgQGluamVjdChEb2N1bWVudEZvY3VzSGFuZGxlcikgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudEZvY3VzSGFuZGxlcjogRG9jdW1lbnRGb2N1c0hhbmRsZXIsXG4gICAgQGluamVjdChUaXRsZVN5bmNIYW5kbGVyKSBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU3luY0hhbmRsZXI6IFRpdGxlU3luY0hhbmRsZXJcbiAgKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKG1pbmlwbGF5ZXI6IEVsZW1lbnQpOiBQcm9taXNlPFBpUENsZWFudXBDYWxsYmFjaz4ge1xuICAgIHRoaXMubmF2aWdhdGlvbkhhbmRsZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMucmVzaXplVHJhY2tlci5zdGFydChtaW5pcGxheWVyKTtcbiAgICB2b2lkIHRoaXMubWVudU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgdm9pZCB0aGlzLmNvbnRleHRNZW51SGFuZGxlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zZWVrSGFuZGxlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5saWtlQnV0dG9uSGFuZGxlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5kb2N1bWVudEZvY3VzSGFuZGxlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy50aXRsZVN5bmNIYW5kbGVyLmluaXRpYWxpemUoKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLnRpdGxlU3luY0hhbmRsZXIuY2xlYW51cCgpO1xuICAgICAgdGhpcy5kb2N1bWVudEZvY3VzSGFuZGxlci5jbGVhbnVwKCk7XG4gICAgICB0aGlzLnNlZWtIYW5kbGVyLmNsZWFudXAoKTtcbiAgICAgIHRoaXMubGlrZUJ1dHRvbkhhbmRsZXIuY2xlYW51cCgpO1xuICAgICAgdGhpcy5jb250ZXh0TWVudUhhbmRsZXIuc3RvcCgpO1xuICAgICAgdGhpcy5tZW51T2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5yZXNpemVUcmFja2VyLnN0b3AoKTtcbiAgICAgIHRoaXMubmF2aWdhdGlvbkhhbmRsZXIuY2xlYW51cCgpO1xuICAgIH07XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IFwiLyoqXFxuICogQ1NTIHN0eWxlcyBmb3IgUGlQIHdpbmRvdyBmaXhlcyBhbmQgY3VzdG9taXphdGlvbnNcXG4gKi9cXG5cXG5ib2R5IHtcXG4gIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XFxufVxcblxcbnl0ZC1taW5pcGxheWVyIHtcXG4gIGxlZnQ6IDAgIWltcG9ydGFudDtcXG4gIHJpZ2h0OiAwICFpbXBvcnRhbnQ7XFxuICB0b3A6IDAgIWltcG9ydGFudDtcXG4gIGJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG4gIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xcbiAgbWF4LWhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xcbiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xcbn1cXG5cXG55dGQtbWluaXBsYXllci1wbGF5ZXItY29udGFpbmVyIHtcXG4gIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxuICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLmh0bWw1LXZpZGVvLWNvbnRhaW5lciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgcmlnaHQ6IDA7XFxufVxcblxcbi5odG1sNS12aWRlby1jb250YWluZXIgLmh0bWw1LW1haW4tdmlkZW8ge1xcbiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG4gIGhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcXG59XFxuXFxudmlkZW8ge1xcbiAgbGVmdDogMCAhaW1wb3J0YW50O1xcbiAgdG9wOiAwICFpbXBvcnRhbnQ7XFxuICByaWdodDogMCAhaW1wb3J0YW50O1xcbiAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi55dERyYWdnYWJsZUNvbXBvbmVudEhvc3QueXRkTWluaXBsYXllckNvbXBvbmVudERyYWdnYWJsZSB7XFxuICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50O1xcbn1cXG5cXG4ueXRwLW1pbmlwbGF5ZXItZXhwYW5kLXdhdGNoLXBhZ2UtYnV0dG9uLFxcbi55dHAtbWluaXBsYXllci1jbG9zZS1idXR0b24sXFxuI2hlYWRlci1jb250ZW50cyxcXG4ueXRkTWluaXBsYXllckNvbXBvbmVudFJlc2l6ZXJzLFxcbi8qIFRPRE86IHJlbW92ZSB3aGVuIGNvbnRleHQgbWVudSBpbnRlcmNlcHRpb24gaXMgaW1wbGVtZW50ZWQgKi9cXG4uZHJvcGRvd24tdHJpZ2dlciB7XFxuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XFxufVxcblxcbi8qIFN0cmV0Y2ggcHJvZ3Jlc3MgYmFyIHRvIGZ1bGwgd2lkdGggKi9cXG4ueXRwLXByb2dyZXNzLWJhci1jb250YWluZXIsXFxuLnl0cC1wcm9ncmVzcy1iYXIge1xcbiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLnl0cC1wcmV2LWJ1dHRvbixcXG4ueXRwLW5leHQtYnV0dG9uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XFxufVxcblwiIiwiaW1wb3J0IHsgQ1NTX0ZJWEVTIH0gZnJvbSAnLi4vc3R5bGVzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBTRUxFQ1RPUlMgfSBmcm9tICcuLi9zZWxlY3RvcnMnO1xuXG5jb25zdCBsb2dnZXIgPSBMb2dnZXIuZ2V0SW5zdGFuY2UoJ1N0eWxlVXRpbHMnKTtcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBzdHlsZSBhbmQgQ1NTIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0eWxlVXRpbHMge1xuICAvKipcbiAgICogQ29weSBhbGwgc3R5bGVzaGVldHMgZnJvbSBzb3VyY2UgZG9jdW1lbnQgdG8gdGFyZ2V0IGRvY3VtZW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvcHlTdHlsZXMoc291cmNlRG9jOiBEb2N1bWVudCwgdGFyZ2V0RG9jOiBEb2N1bWVudCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHlsZXMgPSBzb3VyY2VEb2MucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUlMuU1RZTEVTSEVFVFMpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBDb3B5aW5nICR7c3R5bGVzLmxlbmd0aH0gc3R5bGUgZWxlbWVudHNgKTtcblxuICAgICAgc3R5bGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0YXJnZXREb2MuaGVhZC5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGNvcHkgc3R5bGUgbm9kZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZygnU3R5bGVzIGNvcGllZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNvcHlpbmcgc3R5bGVzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmplY3QgQ1NTIGZpeGVzIGludG8gdGFyZ2V0IGRvY3VtZW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGluamVjdENTU0ZpeGVzKHRhcmdldERvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3R5bGVGaXggPSB0YXJnZXREb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlRml4LnRleHRDb250ZW50ID0gQ1NTX0ZJWEVTO1xuICAgICAgdGFyZ2V0RG9jLmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVGaXgpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdDU1MgZml4ZXMgaW5qZWN0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBpbmplY3RpbmcgQ1NTIGZpeGVzOicsIGUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcblxuY29uc3QgbG9nZ2VyID0gTG9nZ2VyLmdldEluc3RhbmNlKCdBc3luY0xvY2snKTtcblxuLyoqXG4gKiBBc3luYyBtdXRleCBmb3IgY3JpdGljYWwgc2VjdGlvbnMuXG4gKiBFbnN1cmVzIG9ubHkgb25lIGFzeW5jIGJsb2NrIHJ1bnMgYXQgYSB0aW1lOyBjb25jdXJyZW50IGNhbGxlcnMgd2FpdCBpbiBxdWV1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jTG9jayB7XG4gIHByaXZhdGUgbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgZm4gd2hpbGUgaG9sZGluZyB0aGUgbG9jay4gV2FpdHMgaWYgYW5vdGhlciBleGVjdXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIExvY2sgaXMgYWx3YXlzIHJlbGVhc2VkIGluIGZpbmFsbHksIGV2ZW4gaWYgZm4gdGhyb3dzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdpdGhMb2NrPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgbG9nZ2VyLmRlYnVnKCd3aXRoTG9jazogd2FpdGluZyBmb3IgbG9jaycpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZSgpO1xuICAgIGxvZ2dlci5kZWJ1Zygnd2l0aExvY2s6IGxvY2sgYWNxdWlyZWQsIHJ1bm5pbmcgZm4nKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVsZWFzZSgpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCd3aXRoTG9jazogbG9jayByZWxlYXNlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWNxdWlyZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubG9ja2VkKSB7XG4gICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgICBsb2dnZXIuZGVidWcoJ2FjcXVpcmU6IGxvY2sgdGFrZW4gaW1tZWRpYXRlbHknKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKCdhY3F1aXJlOiBsb2NrIGJ1c3ksIGpvaW5pbmcgcXVldWUnLCB7IHF1ZXVlU2l6ZTogdGhpcy5xdWV1ZS5sZW5ndGggfSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goKCkgPT4ge1xuICAgICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnYWNxdWlyZTogd29rZSBmcm9tIHF1ZXVlJyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxlYXNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdyZWxlYXNlOiBwYXNzaW5nIGxvY2sgdG8gbmV4dCBpbiBxdWV1ZScsIHsgcmVtYWluaW5nOiB0aGlzLnF1ZXVlLmxlbmd0aCB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygncmVsZWFzZTogbG9jayBmcmVlZCcpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBwRXJyb3IgfSBmcm9tICcuL0FwcEVycm9yJztcblxuLyoqXG4gKiBFcnJvciB0aHJvd24gZHVyaW5nIFBpUCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGlQRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY2F1c2U/OiB1bmtub3duKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICAgIHRoaXMubmFtZSA9ICdQaVBFcnJvcic7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwcEVycm9yIH0gZnJvbSAnLi9BcHBFcnJvcic7XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBQaVAgb3BlcmF0aW9uIGhhcyBsZWZ0IHRoZSBZb3VUdWJlIHBhZ2UgaW4gYSBicm9rZW4gc3RhdGUuXG4gKiBlLmcuIE1pbmkgcGxheWVyIHdhcyBtb3ZlZCB0byBQaVAgd2luZG93IGJ1dCBhIHJlcXVpcmVkIERPTSBlbGVtZW50IGlzIG1pc3NpbmcsXG4gKiBzbyB0aGUgbWFpbiBwYWdlIGNhbm5vdCBiZSByZXN0b3JlZCBjb3JyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaVBDcml0aWNhbEVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNhdXNlPzogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgICB0aGlzLm5hbWUgPSAnUGlQQ3JpdGljYWxFcnJvcic7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tICcuLi91dGlscy9ET01VdGlscyc7XG5pbXBvcnQgeyBTdHlsZVV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvU3R5bGVVdGlscyc7XG5pbXBvcnQgeyBBc3luY0xvY2sgfSBmcm9tICcuLi91dGlscy9Bc3luY0xvY2snO1xuaW1wb3J0IHsgTWluaVBsYXllckNvbnRyb2xsZXIgfSBmcm9tICcuLi91aS9NaW5pUGxheWVyQ29udHJvbGxlcic7XG5pbXBvcnQgeyBQbGF5ZXJNYW5hZ2VyIH0gZnJvbSAnLi9QbGF5ZXJNYW5hZ2VyJztcbmltcG9ydCB7IFl0ZEFwcFByb3ZpZGVyIH0gZnJvbSAnLi9ZdGRBcHBQcm92aWRlcic7XG5pbXBvcnQgeyBQaXBXaW5kb3dQcm92aWRlciB9IGZyb20gJy4vUGlwV2luZG93UHJvdmlkZXInO1xuaW1wb3J0IHsgREVGQVVMVF9ESU1FTlNJT05TLCBUSU1FT1VUUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTRUxFQ1RPUlMgfSBmcm9tICcuLi9zZWxlY3RvcnMnO1xuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgUGlQQ2xlYW51cENhbGxiYWNrIH0gZnJvbSAnLi4vdHlwZXMvYXBwJztcbmltcG9ydCB7IFBpUEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL1BpUEVycm9yJztcbmltcG9ydCB7IFBpUENyaXRpY2FsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvUGlQQ3JpdGljYWxFcnJvcic7XG5pbXBvcnQgeyBQaVBXaW5kb3dIYW5kbGVycyB9IGZyb20gJy4vUGlQV2luZG93SGFuZGxlcnMnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnLi4vZGknO1xuXG4vKipcbiAqIE1hbmFnZXMgUGljdHVyZS1pbi1QaWN0dXJlIHdpbmRvdyBsaWZlY3ljbGVcbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBpUE1hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIG1pbmlQbGF5ZXJDb250YWluZXI6IE51bGxhYmxlPEVsZW1lbnQ+ID0gbnVsbDtcbiAgcHJpdmF0ZSBwbGFjZWhvbGRlcjogTnVsbGFibGU8Q29tbWVudD4gPSBudWxsO1xuXG4gIHByaXZhdGUgb25CZWZvcmVSZXR1cm46IE51bGxhYmxlPFBpUENsZWFudXBDYWxsYmFjaz4gPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXN5bmNMb2NrID0gbmV3IEFzeW5jTG9jaygpO1xuXG4gIHByaXZhdGUgY2xvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NrXG4gICAgICAud2l0aExvY2soKCkgPT4gdGhpcy5yZXR1cm5QbGF5ZXJUb01haW4oKSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5oYW5kbGVkIGVycm9yIGluIHJldHVyblBsYXllclRvTWFpbjonLCBlKTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBpbmplY3QoTG9nZ2VyRmFjdG9yeSkgbG9nZ2VyRmFjdG9yeTogTG9nZ2VyRmFjdG9yeSxcbiAgICBAaW5qZWN0KE1pbmlQbGF5ZXJDb250cm9sbGVyKSBwcml2YXRlIHJlYWRvbmx5IG1pbmlQbGF5ZXJDb250cm9sbGVyOiBNaW5pUGxheWVyQ29udHJvbGxlcixcbiAgICBAaW5qZWN0KFBsYXllck1hbmFnZXIpIHByaXZhdGUgcmVhZG9ubHkgcGxheWVyTWFuYWdlcjogUGxheWVyTWFuYWdlcixcbiAgICBAaW5qZWN0KFl0ZEFwcFByb3ZpZGVyKSBwcml2YXRlIHJlYWRvbmx5IHl0ZEFwcFByb3ZpZGVyOiBZdGRBcHBQcm92aWRlcixcbiAgICBAaW5qZWN0KFBpcFdpbmRvd1Byb3ZpZGVyKSBwcml2YXRlIHJlYWRvbmx5IHBpcFdpbmRvd1Byb3ZpZGVyOiBQaXBXaW5kb3dQcm92aWRlcixcbiAgICBAaW5qZWN0KFBpUFdpbmRvd0hhbmRsZXJzKSBwcml2YXRlIHJlYWRvbmx5IHBpcFdpbmRvd0hhbmRsZXJzOiBQaVBXaW5kb3dIYW5kbGVyc1xuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlckZhY3RvcnkuY3JlYXRlKCdQaVBNYW5hZ2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgUGlQIHdpbmRvdyBpcyBvcGVuXG4gICAqL1xuICBwdWJsaWMgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpcFdpbmRvd1Byb3ZpZGVyLmdldFdpbmRvdygpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBQaVAgd2luZG93IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgZ2V0V2luZG93KCk6IE51bGxhYmxlPFdpbmRvdz4ge1xuICAgIHJldHVybiB0aGlzLnBpcFdpbmRvd1Byb3ZpZGVyLmdldFdpbmRvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gUGljdHVyZS1pbi1QaWN0dXJlIHdpbmRvd1xuICAgKiBDcml0aWNhbCBzZWN0aW9uOiBjb25jdXJyZW50IGNhbGxzIGFyZSBzZXJpYWxpemVkIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgb3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hc3luY0xvY2sud2l0aExvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUGlQIHdpbmRvdyBhbHJlYWR5IG9wZW4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZ2dlci5sb2coJ09wZW5pbmcgUGlQIHdpbmRvdycpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdmVQbGF5ZXJUb1BJUCgpO1xuXG4gICAgICAgIGNvbnN0IHBpcFdpbmRvdyA9IHRoaXMucGlwV2luZG93UHJvdmlkZXIuZ2V0V2luZG93KCk7XG4gICAgICAgIGlmIChwaXBXaW5kb3cpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBpcFdpbmRvd0hhbmRsZXJzLmluaXRpYWxpemUoXG4gICAgICAgICAgICB0aGlzLm1pbmlQbGF5ZXJDb250cm9sbGVyLmdldE1pbmlwbGF5ZXIoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMub25CZWZvcmVSZXR1cm4gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBQaVBDcml0aWNhbEVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFBpUEVycm9yKCdFcnJvciBvcGVuaW5nIFBpUCcsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHBsYXllciB0byBQaVAgd2luZG93XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdmVQbGF5ZXJUb1BJUCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtaW5pcGxheWVyID0gdGhpcy5taW5pUGxheWVyQ29udHJvbGxlci5nZXRNaW5pcGxheWVyKCk7XG5cbiAgICAvLyBTYXZlIG1pbmkgcGxheWVyIHN0YXRlXG4gICAgdGhpcy5wbGF5ZXJNYW5hZ2VyLnNldFdhc01pbmlQbGF5ZXJBY3RpdmVCZWZvcmVQaVAodGhpcy5taW5pUGxheWVyQ29udHJvbGxlci5pc1Zpc2libGUoKSk7XG5cbiAgICBpZiAoIXRoaXMucGxheWVyTWFuYWdlci5nZXRXYXNNaW5pUGxheWVyQWN0aXZlQmVmb3JlUGlQKCkpIHtcbiAgICAgIHRoaXMubWluaVBsYXllckNvbnRyb2xsZXIudG9nZ2xlTWluaVBsYXllcigpO1xuXG4gICAgICAvLyBXYWl0IGZvciBtaW5pIHBsYXllciBjb250YWluZXJcbiAgICAgIGF3YWl0IERPTVV0aWxzLndhaXRGb3JFbGVtZW50U2VsZWN0b3IoU0VMRUNUT1JTLk1JTklQTEFZRVJfQ09OVEFJTkVSKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdNaW5pIHBsYXllciBjb250YWluZXIgcmVhZHknKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGltZW5zaW9uc1xuICAgIGNvbnN0IHdpZHRoID0gbWluaXBsYXllci5vZmZzZXRXaWR0aCB8fCBERUZBVUxUX0RJTUVOU0lPTlMuUElQX1dJRFRIO1xuICAgIGNvbnN0IGhlaWdodCA9IG1pbmlwbGF5ZXIub2Zmc2V0SGVpZ2h0IHx8IERFRkFVTFRfRElNRU5TSU9OUy5QSVBfSEVJR0hUO1xuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlcXVlc3RpbmcgUGlQIHdpbmRvdzogJHt3aWR0aH14JHtoZWlnaHR9YCk7XG5cbiAgICAvLyBSZXF1ZXN0IFBpUCB3aW5kb3dcbiAgICBjb25zdCBkcHAgPSB3aW5kb3cuZG9jdW1lbnRQaWN0dXJlSW5QaWN0dXJlO1xuICAgIGlmICghZHBwKSB7XG4gICAgICB0aHJvdyBuZXcgUGlQRXJyb3IoJ0RvY3VtZW50IFBpY3R1cmUtaW4tUGljdHVyZSBBUEkgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHl0ZEFwcCA9IHRoaXMueXRkQXBwUHJvdmlkZXIuZ2V0QXBwKCk7XG5cbiAgICB0aGlzLm1pbmlQbGF5ZXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFNFTEVDVE9SUy5NSU5JUExBWUVSX0NPTlRBSU5FUik7XG4gICAgaWYgKCF0aGlzLm1pbmlQbGF5ZXJDb250YWluZXIpIHtcbiAgICAgIHRocm93IG5ldyBQaVBFcnJvcignbWluaXBsYXllci1jb250YWluZXIgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaXBXaW5kb3cgPSBhd2FpdCBkcHAucmVxdWVzdFdpbmRvdyh7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgdGhpcy5waXBXaW5kb3dQcm92aWRlci5zZXRXaW5kb3cocGlwV2luZG93KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdm9pZCB0aGlzLmFzeW5jTG9jay53aXRoTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdpbiA9IHRoaXMucGlwV2luZG93UHJvdmlkZXIuZ2V0V2luZG93KCk7XG4gICAgICAgIGlmICh3aW4/LmNsb3NlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ3BoYW50b20gd2luZG93IGRldGVjdGVkLCBjbG9zaW5nJyk7XG4gICAgICAgICAgdGhpcy5waXBXaW5kb3dQcm92aWRlci5zZXRXaW5kb3cobnVsbCk7XG4gICAgICAgICAgdm9pZCB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBUSU1FT1VUUy5QSEFOVE9NX1dJTkRPV19DSEVDSyk7XG4gICAgcGlwV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgdGhpcy5jbG9zZSk7XG4gICAgdGhpcy5sb2dnZXIubG9nKCdQaVAgd2luZG93IG9wZW5lZCcpO1xuXG4gICAgY29uc3QgcGlwRG9jID0gcGlwV2luZG93LmRvY3VtZW50O1xuXG4gICAgLy8gQ29weSBhdHRyaWJ1dGVzIGFuZCBzdHlsZXNcbiAgICBET01VdGlscy5jb3B5QXR0cmlidXRlcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHBpcERvYy5kb2N1bWVudEVsZW1lbnQpO1xuICAgIERPTVV0aWxzLmNvcHlBdHRyaWJ1dGVzKGRvY3VtZW50LmJvZHksIHBpcERvYy5ib2R5KTtcbiAgICBTdHlsZVV0aWxzLmNvcHlTdHlsZXMoZG9jdW1lbnQsIHBpcERvYyk7XG4gICAgU3R5bGVVdGlscy5pbmplY3RDU1NGaXhlcyhwaXBEb2MpO1xuXG4gICAgLy8gQ3JlYXRlIHl0ZC1hcHAgaW4gUGlQIHdpbmRvd1xuICAgIGNvbnN0IHBpcEFwcCA9IHBpcERvYy5jcmVhdGVFbGVtZW50KFNFTEVDVE9SUy5ZVERfQVBQKTtcbiAgICBET01VdGlscy5jb3B5QXR0cmlidXRlcyh5dGRBcHAsIHBpcEFwcCk7XG4gICAgcGlwRG9jLmJvZHkuYXBwZW5kQ2hpbGQocGlwQXBwKTtcblxuICAgIC8vIE1vdmUgbWluaSBwbGF5ZXIgdG8gUGlQXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IERPTVV0aWxzLmNyZWF0ZVBsYWNlaG9sZGVyKCdtaW5pX3BsYXllcl9wbGFjZWhvbGRlcicpO1xuICAgIERPTVV0aWxzLmluc2VydFBsYWNlaG9sZGVyQmVmb3JlKG1pbmlwbGF5ZXIsIHRoaXMucGxhY2Vob2xkZXIpO1xuXG4gICAgcGlwQXBwLmFwcGVuZENoaWxkKG1pbmlwbGF5ZXIpO1xuXG4gICAgLy8gTW92ZSBjb250YWluZXIgdG8gZHJhZ2dhYmxlXG4gICAgY29uc3QgeXREcmFnZ2FibGUgPSBwaXBEb2MucXVlcnlTZWxlY3RvcihTRUxFQ1RPUlMuWVRfRFJBR0dBQkxFKTtcbiAgICBpZiAoIXl0RHJhZ2dhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgUGlQQ3JpdGljYWxFcnJvcigneXQtZHJhZ2dhYmxlIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHl0RHJhZ2dhYmxlLnByZXBlbmQodGhpcy5taW5pUGxheWVyQ29udGFpbmVyKTtcblxuICAgIERPTVV0aWxzLnVud3JhcCh5dERyYWdnYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHBsYXllciB0byBtYWluIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXR1cm5QbGF5ZXJUb01haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIubG9nKCdSZXR1cm5pbmcgcGxheWVyIHRvIG1haW4gd2luZG93Jyk7XG5cbiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIgfHwgIXRoaXMubWluaVBsYXllckNvbnRhaW5lcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignUGxhY2Vob2xkZXIgb3IgbWluaVBsYXllckNvbnRhaW5lciBub3QgZm91bmQnLCB7XG4gICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyLFxuICAgICAgICBtaW5pUGxheWVyQ29udGFpbmVyOiB0aGlzLm1pbmlQbGF5ZXJDb250YWluZXIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSdW4gYmVmb3JlLXJldHVybiBjbGVhbnVwIChlLmcuIG1vdmUgY29udGV4dCBtZW51IGJhY2spXG4gICAgaWYgKHRoaXMub25CZWZvcmVSZXR1cm4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVSZXR1cm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Vycm9yIGluIG9uQmVmb3JlUmV0dXJuOicsIGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5vbkJlZm9yZVJldHVybiA9IG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW92ZVBsYXllclRvTWFpbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3IgcmV0dXJuaW5nIHBsYXllciB0byBtYWluIHdpbmRvdzonLCBlcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5waXBXaW5kb3dQcm92aWRlci5zZXRXaW5kb3cobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBwbGF5ZXIgYmFjayB0byBtYWluIHdpbmRvd1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3ZlUGxheWVyVG9NYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1pbmlwbGF5ZXIgPSB0aGlzLm1pbmlQbGF5ZXJDb250cm9sbGVyLmdldE1pbmlwbGF5ZXIoKTtcbiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIgfHwgIXRoaXMubWluaVBsYXllckNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBwbGF5ZXIgYW5kIHNhdmUgc3RhdGVcbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnBsYXllck1hbmFnZXIuZ2V0UGxheWVyKCk7XG4gICAgdGhpcy5wbGF5ZXJNYW5hZ2VyLnNhdmVQbGF5aW5nU3RhdGUocGxheWVyKTtcblxuICAgIC8vIE1vdmUgbWluaSBwbGF5ZXIgYmFja1xuICAgIERPTVV0aWxzLnJlc3RvcmVFbGVtZW50RnJvbVBsYWNlaG9sZGVyKG1pbmlwbGF5ZXIsIHRoaXMucGxhY2Vob2xkZXIpO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBudWxsO1xuXG4gICAgLy8gTW92ZSBjb250YWluZXIgYmFja1xuICAgIGNvbnN0IHl0RHJhZ2dhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihTRUxFQ1RPUlMuWVRfRFJBR0dBQkxFKTtcbiAgICBpZiAoIXl0RHJhZ2dhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgUGlQQ3JpdGljYWxFcnJvcigneXQtZHJhZ2dhYmxlIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHl0RHJhZ2dhYmxlLnByZXBlbmQodGhpcy5taW5pUGxheWVyQ29udGFpbmVyKTtcblxuICAgIGlmICghdGhpcy5wbGF5ZXJNYW5hZ2VyLmdldFdhc01pbmlQbGF5ZXJBY3RpdmVCZWZvcmVQaVAoKSkge1xuICAgICAgdGhpcy5taW5pUGxheWVyQ29udHJvbGxlci50b2dnbGVNaW5pUGxheWVyKCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIG1haW4gcGxheWVyXG4gICAgICBhd2FpdCB0aGlzLnBsYXllck1hbmFnZXIud2FpdEZvck1haW5QbGF5ZXIoKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbWluaSBwbGF5ZXIgY29udGFpbmVyXG4gICAgY29uc3QgbWluaXBsYXllckNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoU0VMRUNUT1JTLk1JTklQTEFZRVJfQ09OVEFJTkVSKTtcbiAgICBpZiAobWluaXBsYXllckNvbnRhaW5lcikge1xuICAgICAgbWluaXBsYXllckNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHBsYXliYWNrIHN0YXRlXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLnBsYXllck1hbmFnZXIucmVzdG9yZVBsYXlpbmdTdGF0ZShwbGF5ZXIpO1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXJNYW5hZ2VyLmdldFdhc01pbmlQbGF5ZXJBY3RpdmVCZWZvcmVQaVAoKSkge1xuICAgICAgICAgIHRoaXMubWluaVBsYXllckNvbnRyb2xsZXIuYWN0aXZhdGVNaW5pUGxheWVyKCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5ZXJNYW5hZ2VyLndhaXRGb3JNaW5pUGxheWVyKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQaVBNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9QaVBNYW5hZ2VyJztcbmltcG9ydCB7IEFwcEluaXRpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvQXBwSW5pdGlhbGl6YXRpb25FcnJvcic7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJy4uL2RpJztcblxuLyoqXG4gKiBIYW5kbGVzIE1lZGlhIFNlc3Npb24gQVBJIGludGVncmF0aW9uXG4gKi9cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZWRpYVNlc3Npb25IYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAaW5qZWN0KExvZ2dlckZhY3RvcnkpIGxvZ2dlckZhY3Rvcnk6IExvZ2dlckZhY3RvcnksXG4gICAgQGluamVjdChQaVBNYW5hZ2VyKSBwcml2YXRlIHJlYWRvbmx5IHBpcE1hbmFnZXI6IFBpUE1hbmFnZXJcbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJGYWN0b3J5LmNyZWF0ZSgnTWVkaWFTZXNzaW9uSGFuZGxlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgbWVkaWEgc2Vzc2lvbiBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAoISgnbWVkaWFTZXNzaW9uJyBpbiBuYXZpZ2F0b3IpKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdNZWRpYSBTZXNzaW9uIEFQSSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckFjdGlvbkhhbmRsZXIoKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTWVkaWEgc2Vzc2lvbiBoYW5kbGVyIGluaXRpYWxpemVkJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgZW50ZXJwaWN0dXJlaW5waWN0dXJlIGFjdGlvbiBoYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQWN0aW9uSGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAoISgnbWVkaWFTZXNzaW9uJyBpbiBuYXZpZ2F0b3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vICdlbnRlcnBpY3R1cmVpbnBpY3R1cmUnIGlzIGEgQ2hyb21lLXNwZWNpZmljIE1lZGlhIFNlc3Npb24gYWN0aW9uXG4gICAgICBuYXZpZ2F0b3IubWVkaWFTZXNzaW9uLnNldEFjdGlvbkhhbmRsZXIoJ2VudGVycGljdHVyZWlucGljdHVyZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdNZWRpYSBzZXNzaW9uIGVudGVycGljdHVyZWlucGljdHVyZSBhY3Rpb24gdHJpZ2dlcmVkJyk7XG4gICAgICAgIHRoaXMucGlwTWFuYWdlci5vcGVuKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignRXJyb3Igb3BlbmluZyBQaVAgZnJvbSBtZWRpYSBzZXNzaW9uOicsIGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ01lZGlhIHNlc3Npb24gYWN0aW9uIGhhbmRsZXIgcmVnaXN0ZXJlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBBcHBJbml0aWFsaXphdGlvbkVycm9yKCdFcnJvciByZWdpc3RlcmluZyBtZWRpYSBzZXNzaW9uIGFjdGlvbiBoYW5kbGVyJywgZSk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIFV0aWxpdHkgZm9yIGRldGVjdGluZyBZb3VUdWJlIGNsaWVudCB2ZXJzaW9uIGFuZCBzY3JpcHQgdmVyc2lvblxuICovXG5cbi8qKlxuICogR2V0IHNjcmlwdCB2ZXJzaW9uIGZyb20gVml0ZSBkZWZpbmUgKGluamVjdGVkIGF0IGJ1aWxkIHRpbWUpXG4gKi9cbmZ1bmN0aW9uIGdldFNjcmlwdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgLyogdjggaWdub3JlIG5leHQgLS0gQHByZXNlcnZlICovXG4gIHJldHVybiB0eXBlb2YgU0NSSVBUX1ZFUlNJT04gIT09ICd1bmRlZmluZWQnID8gU0NSSVBUX1ZFUlNJT04gOiAndW5rbm93bic7XG59XG5cbi8qKlxuICogR2V0IFlvdVR1YmUgY2xpZW50IHZlcnNpb24gZnJvbSB3aW5kb3cueXRjZmdcbiAqL1xuZnVuY3Rpb24gZ2V0WW91VHViZVZlcnNpb24oKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB5dGNmZyA9IHdpbmRvdy55dGNmZztcbiAgICBpZiAoeXRjZmc/LmRhdGFfPy5JTk5FUlRVQkVfQ09OVEVYVD8uY2xpZW50Py5jbGllbnRWZXJzaW9uKSB7XG4gICAgICByZXR1cm4geXRjZmcuZGF0YV8uSU5ORVJUVUJFX0NPTlRFWFQuY2xpZW50LmNsaWVudFZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBTaWxlbnRseSBmYWlsIGlmIHZlcnNpb24gZGV0ZWN0aW9uIGZhaWxzXG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIEdldCBZb3VUdWJlIGZlYXR1cmUgZmxhZ3MvZXhwZXJpbWVudHMgY29uZmlndXJhdGlvbiBmcm9tIHdpbmRvdy55dGNmZ1xuICovXG5mdW5jdGlvbiBnZXRZb3VUdWJlRmVhdHVyZUZsYWdzKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB5dGNmZyA9IHdpbmRvdy55dGNmZztcblxuICAgIC8vIEVYUEVSSU1FTlRfRkxBR1MgLSBmZWF0dXJlIGZsYWdzIGxvY2F0aW9uXG4gICAgaWYgKHl0Y2ZnPy5kYXRhXz8uRVhQRVJJTUVOVF9GTEFHUykge1xuICAgICAgcmV0dXJuIHl0Y2ZnLmRhdGFfLkVYUEVSSU1FTlRfRkxBR1M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBTaWxlbnRseSBmYWlsIGlmIGZlYXR1cmUgZmxhZ3MgZGV0ZWN0aW9uIGZhaWxzXG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogRXh0cmFjdCBicm93c2VyIG5hbWUgYW5kIHZlcnNpb24gZnJvbSBuYXZpZ2F0b3IgdXNlckFnZW50XG4gKi9cbmZ1bmN0aW9uIGdldEJyb3dzZXJWZXJzaW9uKCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICBpZiAoIXVzZXJBZ2VudCkge1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG5cbiAgICAvLyBDaHJvbWUgKGNoZWNrIGJlZm9yZSBFZGdlIGFzIEVkZ2UgVUEgY29udGFpbnMgXCJDaHJvbWVcIilcbiAgICBjb25zdCBjaHJvbWVNYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFtcXGQuXSspLyk7XG4gICAgaWYgKGNocm9tZU1hdGNoICYmICF1c2VyQWdlbnQuaW5jbHVkZXMoJ0VkZy8nKSkge1xuICAgICAgcmV0dXJuIGBDaHJvbWUvJHtjaHJvbWVNYXRjaFsxXX1gO1xuICAgIH1cblxuICAgIC8vIEVkZ2VcbiAgICBjb25zdCBlZGdlTWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ1xcLyhbXFxkLl0rKS8pO1xuICAgIGlmIChlZGdlTWF0Y2gpIHtcbiAgICAgIHJldHVybiBgRWRnZS8ke2VkZ2VNYXRjaFsxXX1gO1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3hcbiAgICBjb25zdCBmaXJlZm94TWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0ZpcmVmb3hcXC8oW1xcZC5dKykvKTtcbiAgICBpZiAoZmlyZWZveE1hdGNoKSB7XG4gICAgICByZXR1cm4gYEZpcmVmb3gvJHtmaXJlZm94TWF0Y2hbMV19YDtcbiAgICB9XG5cbiAgICAvLyBTYWZhcmkgKGNoZWNrIFZlcnNpb24gZmlyc3QsIHRoZW4gU2FmYXJpKVxuICAgIGNvbnN0IHNhZmFyaVZlcnNpb25NYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblxcLyhbXFxkLl0rKS4qU2FmYXJpLyk7XG4gICAgaWYgKHNhZmFyaVZlcnNpb25NYXRjaCAmJiAhdXNlckFnZW50LmluY2x1ZGVzKCdDaHJvbWUnKSkge1xuICAgICAgcmV0dXJuIGBTYWZhcmkvJHtzYWZhcmlWZXJzaW9uTWF0Y2hbMV19YDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogcmV0dXJuIGZ1bGwgdXNlciBhZ2VudCBpZiBubyBtYXRjaFxuICAgIHJldHVybiB1c2VyQWdlbnQ7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFNpbGVudGx5IGZhaWwgaWYgYnJvd3NlciB2ZXJzaW9uIGRldGVjdGlvbiBmYWlsc1xuICB9XG5cbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuLyoqXG4gKiBHZXQgZ2xvYmFsIG1ldGFkYXRhIG9iamVjdCB3aXRoIFlvdVR1YmUsIHNjcmlwdCwgYnJvd3NlciB2ZXJzaW9ucywgYW5kIGZlYXR1cmUgZmxhZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbE1ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHlvdXR1YmVWZXJzaW9uOiBnZXRZb3VUdWJlVmVyc2lvbigpLFxuICAgIHNjcmlwdFZlcnNpb246IGdldFNjcmlwdFZlcnNpb24oKSxcbiAgICBicm93c2VyVmVyc2lvbjogZ2V0QnJvd3NlclZlcnNpb24oKSxcbiAgfTtcblxuICBjb25zdCBmZWF0dXJlRmxhZ3MgPSBnZXRZb3VUdWJlRmVhdHVyZUZsYWdzKCk7XG4gIGlmIChPYmplY3Qua2V5cyhmZWF0dXJlRmxhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICBtZXRhZGF0YS55b3V0dWJlRmVhdHVyZUZsYWdzID0gZmVhdHVyZUZsYWdzO1xuICB9XG5cbiAgcmV0dXJuIG1ldGFkYXRhO1xufVxuIiwiaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgY3JlYXRlQ29udGFpbmVyIH0gZnJvbSAnLi9kaS9jb250YWluZXItY29uZmlnJztcbmltcG9ydCB7IFBsYXllck1hbmFnZXIgfSBmcm9tICcuL2NvcmUvUGxheWVyTWFuYWdlcic7XG5pbXBvcnQgeyBZdGRBcHBQcm92aWRlciB9IGZyb20gJy4vY29yZS9ZdGRBcHBQcm92aWRlcic7XG5pbXBvcnQgeyBNaW5pUGxheWVyQ29udHJvbGxlciB9IGZyb20gJy4vdWkvTWluaVBsYXllckNvbnRyb2xsZXInO1xuaW1wb3J0IHsgTWVkaWFTZXNzaW9uSGFuZGxlciB9IGZyb20gJy4vaGFuZGxlcnMvTWVkaWFTZXNzaW9uSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxNZXRhZGF0YSB9IGZyb20gJy4vdXRpbHMvVmVyc2lvbkRldGVjdG9yJztcblxuY29uc3QgbG9nZ2VyID0gTG9nZ2VyLmdldEluc3RhbmNlKCdNYWluJyk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgTG9nZ2VyLnNldEdsb2JhbE1ldGFkYXRhKGdldEdsb2JhbE1ldGFkYXRhKCkpO1xuXG4gIGNvbnN0IGNvbnRhaW5lciA9IGNyZWF0ZUNvbnRhaW5lcigpO1xuXG4gIGxvZ2dlci5sb2coJ0luaXRpYWxpemluZyBZb3VUdWJlIFBpUCBhcHBsaWNhdGlvbicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgeXRkQXBwUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0PFl0ZEFwcFByb3ZpZGVyPihZdGRBcHBQcm92aWRlcik7XG4gICAgYXdhaXQgeXRkQXBwUHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgY29uc3QgcGxheWVyTWFuYWdlciA9IGNvbnRhaW5lci5nZXQ8UGxheWVyTWFuYWdlcj4oUGxheWVyTWFuYWdlcik7XG4gICAgYXdhaXQgcGxheWVyTWFuYWdlci5pbml0aWFsaXplKCk7XG5cbiAgICBjb25zdCBtaW5pUGxheWVyQ29udHJvbGxlciA9IGNvbnRhaW5lci5nZXQ8TWluaVBsYXllckNvbnRyb2xsZXI+KE1pbmlQbGF5ZXJDb250cm9sbGVyKTtcbiAgICBhd2FpdCBtaW5pUGxheWVyQ29udHJvbGxlci5pbml0aWFsaXplKCk7XG5cbiAgICBjb25zdCBtZWRpYVNlc3Npb25IYW5kbGVyID0gY29udGFpbmVyLmdldDxNZWRpYVNlc3Npb25IYW5kbGVyPihNZWRpYVNlc3Npb25IYW5kbGVyKTtcbiAgICBtZWRpYVNlc3Npb25IYW5kbGVyLmluaXRpYWxpemUoKTtcblxuICAgIGxvZ2dlci5sb2coJ1lvdVR1YmUgUGlQIGFwcGxpY2F0aW9uIGluaXRpYWxpemVkJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdZb3VUdWJlIFBpUCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnJvcik7XG4gIH1cbn1cblxuLy8gSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbiB3aGVuIERPTSBpcyByZWFkeVxuaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gdm9pZCBpbml0aWFsaXplQXBwKCkpO1xufSBlbHNlIHtcbiAgdm9pZCBpbml0aWFsaXplQXBwKCk7XG59XG4iLCJpbXBvcnQgeyBDb250YWluZXIgfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFBsYXllck1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL1BsYXllck1hbmFnZXInO1xuaW1wb3J0IHsgWXRkQXBwUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL1l0ZEFwcFByb3ZpZGVyJztcbmltcG9ydCB7IFBpcFdpbmRvd1Byb3ZpZGVyIH0gZnJvbSAnLi4vY29yZS9QaXBXaW5kb3dQcm92aWRlcic7XG5pbXBvcnQgeyBNaW5pUGxheWVyQ29udHJvbGxlciB9IGZyb20gJy4uL3VpL01pbmlQbGF5ZXJDb250cm9sbGVyJztcbmltcG9ydCB7IE5hdmlnYXRpb25IYW5kbGVyIH0gZnJvbSAnLi4vY29yZS9OYXZpZ2F0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBSZXNpemVUcmFja2VyIH0gZnJvbSAnLi4vdWkvUmVzaXplVHJhY2tlcic7XG5pbXBvcnQgeyBNZW51T2JzZXJ2ZXIgfSBmcm9tICcuLi91aS9NZW51T2JzZXJ2ZXInO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVIYW5kbGVyIH0gZnJvbSAnLi4vdWkvQ29udGV4dE1lbnVIYW5kbGVyJztcbmltcG9ydCB7IFNlZWtIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2Vla0hhbmRsZXInO1xuaW1wb3J0IHsgTGlrZUJ1dHRvbkhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9MaWtlQnV0dG9uSGFuZGxlcic7XG5pbXBvcnQgeyBEb2N1bWVudEZvY3VzSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0RvY3VtZW50Rm9jdXNIYW5kbGVyJztcbmltcG9ydCB7IFRpdGxlU3luY0hhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9UaXRsZVN5bmNIYW5kbGVyJztcbmltcG9ydCB7IFBpUFdpbmRvd0hhbmRsZXJzIH0gZnJvbSAnLi4vY29yZS9QaVBXaW5kb3dIYW5kbGVycyc7XG5pbXBvcnQgeyBQaVBNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9QaVBNYW5hZ2VyJztcbmltcG9ydCB7IFl0QWN0aW9uU2VuZGVyIH0gZnJvbSAnLi4vY29yZS9ZdEFjdGlvblNlbmRlcic7XG5pbXBvcnQgeyBNZWRpYVNlc3Npb25IYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTWVkaWFTZXNzaW9uSGFuZGxlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250YWluZXIoKTogQ29udGFpbmVyIHtcbiAgY29uc3QgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpO1xuXG4gIGNvbnRhaW5lci5iaW5kKExvZ2dlckZhY3RvcnkpLnRvU2VsZigpO1xuICBjb250YWluZXIuYmluZChQbGF5ZXJNYW5hZ2VyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoWXRkQXBwUHJvdmlkZXIpLnRvU2VsZigpO1xuICBjb250YWluZXIuYmluZChQaXBXaW5kb3dQcm92aWRlcikudG9TZWxmKCk7XG4gIGNvbnRhaW5lci5iaW5kKE1pbmlQbGF5ZXJDb250cm9sbGVyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoTmF2aWdhdGlvbkhhbmRsZXIpLnRvU2VsZigpO1xuICBjb250YWluZXIuYmluZChSZXNpemVUcmFja2VyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoTWVudU9ic2VydmVyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoQ29udGV4dE1lbnVIYW5kbGVyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoU2Vla0hhbmRsZXIpLnRvU2VsZigpO1xuICBjb250YWluZXIuYmluZChZdEFjdGlvblNlbmRlcikudG9TZWxmKCk7XG4gIGNvbnRhaW5lci5iaW5kKExpa2VCdXR0b25IYW5kbGVyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoRG9jdW1lbnRGb2N1c0hhbmRsZXIpLnRvU2VsZigpO1xuICBjb250YWluZXIuYmluZChUaXRsZVN5bmNIYW5kbGVyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoUGlQV2luZG93SGFuZGxlcnMpLnRvU2VsZigpO1xuICBjb250YWluZXIuYmluZChQaVBNYW5hZ2VyKS50b1NlbGYoKTtcbiAgY29udGFpbmVyLmJpbmQoTWVkaWFTZXNzaW9uSGFuZGxlcikudG9TZWxmKCk7XG5cbiAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbiJdLCJuYW1lcyI6WyJUSU1FT1VUUyIsIkRFRkFVTFRfRElNRU5TSU9OUyIsIkVNQkVEX0lGUkFNRV9ERUZBVUxUUyIsIllPVVRVQkVfU0hPUlRfQkFTRSIsIkNPUFlfUEFZTE9BRF9RVUVSWSIsIlBMQVlFUl9TVEFURVMiLCJZVF9FVkVOVFMiLCJZVF9BQ1RJT05fTkFNRVMiLCJZVF9MSUtFX0FDVElPTlMiLCJXRUJfUEFHRV9UWVBFUyIsIkNPUFlfTUVOVV9JTkRJQ0VTIiwiTU9VU0VfQlVUVE9OUyIsInBhcmFtTWV0YWRhdGEiLCJXZWFrTWFwIiwiaW5qZWN0YWJsZUNsYXNzZXMiLCJXZWFrU2V0IiwiaW5qZWN0IiwidG9rZW4iLCJ0YXJnZXQiLCJfa2V5IiwiaW5kZXgiLCJleGlzdGluZyIsImdldCIsInNldCIsInNldFBhcmFtTWV0YWRhdGEiLCJpbmplY3RhYmxlIiwiYWRkIiwic2V0SW5qZWN0YWJsZSIsInRpbWVzdGFtcEZvcm1hdHRlciIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInllYXIiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJob3VyMTIiLCJfTG9nZ2VyIiwiY29uc3RydWN0b3IiLCJzY29wZSIsInRoaXMiLCJnZXRJbnN0YW5jZSIsInN0b3JhZ2VMaXN0ZW5lckFkZGVkIiwiZW5hYmxlZCIsImNoZWNrRGVidWdGbGFnIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImluc3RhbmNlIiwiaW5zdGFuY2VzIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNldEdsb2JhbE1ldGFkYXRhIiwibWV0YWRhdGEiLCJnbG9iYWxNZXRhZGF0YSIsInN0eWxlZCIsImZuIiwibXNnU3R5bGUiLCJtZXNzYWdlIiwibWV0YSIsInRzIiwiZGF0ZSIsIm1zIiwiU3RyaW5nIiwiZ2V0TWlsbGlzZWNvbmRzIiwicGFkU3RhcnQiLCJmb3JtYXQiLCJyZXBsYWNlIiwiZm9ybWF0VGltZXN0YW1wIiwiRGF0ZSIsImVzY2FwZWQiLCJhcmdzIiwicHVzaCIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJsb2ciLCJjb25zb2xlIiwiYmluZCIsIndhcm4iLCJlcnJvciIsImRlYnVnIiwiTWFwIiwiTG9nZ2VyIiwiTG9nZ2VyRmFjdG9yeSIsImNyZWF0ZSIsIl9fZGVjb3JhdGVDbGFzcyIsIkFwcEVycm9yIiwiRXJyb3IiLCJjYXVzZSIsInN1cGVyIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJBcHBSdW50aW1lRXJyb3IiLCJuYW1lIiwiQ29udGFpbmVyIiwiYmluZGluZ3MiLCJ0byIsImltcGxlbWVudGF0aW9uIiwidG9TZWxmIiwidG9UcmFuc2llbnQiLCJ0b0luc3RhbmNlIiwicmVzb2x1dGlvblN0YWNrIiwiU2V0IiwidG9rZW5OYW1lIiwiYmluZGluZyIsImhhcyIsImNoYWluIiwibWFwIiwidCIsImpvaW4iLCJDdG9yIiwicGFyYW1Ub2tlbnMiLCJnZXRQYXJhbU1ldGFkYXRhIiwicGFyYW1Db3VudCIsImkiLCJkZWxldGUiLCJ1bmJpbmQiLCJsb2dnZXIiLCJET01VdGlscyIsImNyZWF0ZVBsYWNlaG9sZGVyIiwiY29tbWVudFRleHQiLCJkb2N1bWVudCIsImNyZWF0ZUNvbW1lbnQiLCJpbnNlcnRQbGFjZWhvbGRlckJlZm9yZSIsImVsZW1lbnQiLCJwbGFjZWhvbGRlciIsInBhcmVudCIsInBhcmVudE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJyZXN0b3JlRWxlbWVudEZyb21QbGFjZWhvbGRlciIsInJlbW92ZSIsImNvcHlBdHRyaWJ1dGVzIiwic291cmNlIiwiQXJyYXkiLCJmcm9tIiwiYXR0cmlidXRlcyIsImZvckVhY2giLCJhdHRyIiwic2V0QXR0cmlidXRlIiwibm9kZU5hbWUiLCJub2RlVmFsdWUiLCJlIiwiY29weVZpYVRleHRhcmVhIiwiZG9jIiwidGV4dCIsImVsIiwiY3JlYXRlRWxlbWVudCIsInZhbHVlIiwic3R5bGUiLCJjc3NUZXh0IiwiYm9keSIsImFwcGVuZENoaWxkIiwiZm9jdXMiLCJzZWxlY3QiLCJvayIsImV4ZWNDb21tYW5kIiwidW53cmFwIiwid3JhcHBlciIsImZpcnN0Q2hpbGQiLCJyZW1vdmVDaGlsZCIsIndhaXRGb3JFbGVtZW50U2VsZWN0b3IiLCJzZWxlY3RvciIsInRpbWVvdXQiLCJ0YXJnZXRXaW5kb3ciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInF1ZXJ5U2VsZWN0b3IiLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJfIiwib2JzIiwiZGlzY29ubmVjdCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic2V0VGltZW91dCIsImNsb3NlZCIsIm9uY2UiLCJTRUxFQ1RPUlMiLCJBcHBJbml0aWFsaXphdGlvbkVycm9yIiwiUGxheWVyTWFuYWdlciIsImxvZ2dlckZhY3RvcnkiLCJwbGF5ZXIiLCJ3YXNQbGF5aW5nIiwid2FzTWluaVBsYXllckFjdGl2ZUJlZm9yZVBpUCIsImluaXRpYWxpemUiLCJnZXRQbGF5ZXIiLCJnZXRQbGF5ZXJTdGF0ZSIsImlzUGxheWluZyIsInNhdmVQbGF5aW5nU3RhdGUiLCJzZXRXYXNNaW5pUGxheWVyQWN0aXZlQmVmb3JlUGlQIiwiZ2V0V2FzTWluaVBsYXllckFjdGl2ZUJlZm9yZVBpUCIsInJlc3RvcmVQbGF5aW5nU3RhdGUiLCJwbGF5VmlkZW8iLCJnZXRWaWRlb0RhdGFGcm9tUGxheWVyIiwiZ2V0VmlkZW9EYXRhIiwiZ2V0VmlkZW9JZCIsInZpZGVvRGF0YSIsInZpZGVvSWQiLCJ2aWRlb19pZCIsImdldEN1cnJlbnRUaW1lIiwiTnVtYmVyIiwiaXNOYU4iLCJNYXRoIiwiZmxvb3IiLCJnZXRQbGF5ZXJTaXplIiwiZ2V0RGVidWdJbmZvIiwiZ2V0RGVidWdUZXh0Iiwid2FpdEZvck1haW5QbGF5ZXIiLCJ3YWl0Rm9yTWluaVBsYXllciIsIm1pbmlwbGF5ZXIiLCJyZXNldFN0YXRlIiwiWXRkQXBwUHJvdmlkZXIiLCJhcHAiLCJub3RpZnlSZW5kZXJlciIsImVyciIsImdldEFwcCIsImdldE5vdGlmeVJlbmRlcmVyIiwiX19kZWNvcmF0ZVBhcmFtIiwiUGlwV2luZG93UHJvdmlkZXIiLCJwaXBXaW5kb3ciLCJzZXRXaW5kb3ciLCJoYXNXaW5kb3ciLCJnZXRXaW5kb3ciLCJNaW5pUGxheWVyQ29udHJvbGxlciIsInBsYXllck1hbmFnZXIiLCJ5dGRBcHBQcm92aWRlciIsImdldE1pbmlwbGF5ZXIiLCJpc1Zpc2libGUiLCJhY3RpdmF0ZU1pbmlQbGF5ZXIiLCJ5dGRBcHAiLCJmaXJlIiwiYWN0aW9uTmFtZSIsIm9wdGlvbmFsQWN0aW9uIiwicmV0dXJuVmFsdWUiLCJ0b2dnbGVNaW5pUGxheWVyIiwibWluaXBsYXllcklzQWN0aXZlIiwiZW5kcG9pbnQiLCJ3YXRjaEVuZHBvaW50IiwiTmF2aWdhdGlvbkhhbmRsZXIiLCJwaXBXaW5kb3dQcm92aWRlciIsInNldHVwQ2xpY2tIYW5kbGVyIiwiZXZlbnQiLCJfYSIsImNsb3Nlc3QiLCJfYiIsImhyZWYiLCJ1cmwiLCJVUkwiLCJwYXJhbXMiLCJmcm9tRW50cmllcyIsInNlYXJjaFBhcmFtcyIsInByZXZlbnREZWZhdWx0Iiwic3RhdGUiLCJjb21tYW5kTWV0YWRhdGEiLCJ3ZWJDb21tYW5kTWV0YWRhdGEiLCJ3ZWJQYWdlVHlwZSIsInJvb3RWZSIsInYiLCJwbGF5bGlzdElkIiwibGlzdCIsInBhcnNlSW50IiwicGxheWVyUGFyYW1zIiwicHAiLCJlbnRyeVRpbWUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsImRpc3BhdGNoRXZlbnQiLCJQb3BTdGF0ZUV2ZW50IiwiY2xlYW51cCIsIlJlc2l6ZVRyYWNrZXIiLCJzdGFydCIsInRhcmdldEVsZW1lbnQiLCJSZXNpemVPYnNlcnZlciIsImVudHJpZXMiLCJlbnRyeSIsIndpZHRoIiwiY29udGVudFJlY3QiLCJzZXRJbnRlcm5hbFNpemUiLCJzZXRTaXplIiwiY2FsbCIsIkV2ZW50IiwiYnViYmxlcyIsInN0b3AiLCJNZW51T2JzZXJ2ZXIiLCJyZW1vdmFsT2JzZXJ2ZXIiLCJydW5PYnNlcnZhdGlvbiIsImJ1dHRvbiIsIm11dGF0aW9ucyIsIm11dGF0aW9uIiwiYXR0cmlidXRlTmFtZSIsImlzRXhwYW5kZWQiLCJnZXRBdHRyaWJ1dGUiLCJwbGF5TGlzdENvbnRhaW5lciIsImN1cnJlbnRIZWlnaHQiLCJvdXRlckhlaWdodCIsInJlc2l6ZVRvIiwib3V0ZXJXaWR0aCIsImRpc3BsYXkiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJpc0Nvbm5lY3RlZCIsIkNvcHlUeXBlIiwiYnVpbGRDb3B5UGF5bG9hZCIsImN1cnJlbnRUaW1lIiwidGl0bGUiLCJjb3B5VHlwZSIsImVtYmVkU2l6ZSIsIlZJREVPX1VSTCIsImJhc2UiLCJsaXN0UGFydCIsImJ1aWxkVmlkZW9VcmxQYXlsb2FkIiwiVVJMX0FUX1RJTUUiLCJidWlsZFVybEF0VGltZVBheWxvYWQiLCJFTUJFRCIsImhlaWdodCIsImJ1aWxkRW1iZWRQYXlsb2FkIiwiQ29udGV4dE1lbnVIYW5kbGVyIiwidmlzaWJpbGl0eU9ic2VydmVyIiwiY29udGV4dE1lbnUiLCJjb250ZXh0TWVudVBsYWNlaG9sZGVyIiwidmlzaWJpbGl0eVN1YnNjcmliZXJzIiwiaGFuZGxlQ29weUNsaWNrIiwiaXRlbSIsInBhcmVudEVsZW1lbnQiLCJpdGVtcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJwcm90b3R5cGUiLCJpbmRleE9mIiwiZ2V0Q29weVR5cGVGb3JJbmRleCIsIkRFQlVHX0lORk8iLCJnZXRDb3B5UGF5bG9hZCIsInN1YnNjcmliZUNvbnRleHRNZW51IiwiY2FsbGJhY2siLCJub3RpZnlWaXNpYmlsaXR5IiwidmlzaWJsZSIsImNiIiwic3RhcnRNb25pdG9yaW5nIiwic2V0dXBEaXNtaXNzYWxIYW5kbGVyIiwic2V0dXBDb3B5SGFuZGxlciIsImlzSW5NYWluV2luZG93Iiwic2ltdWxhdGVNYWluQ29udGV4dE1lbnUiLCJoYW5kbGVFdmVudCIsIm1lbnVJblBpcCIsInN0b3BQcm9wYWdhdGlvbiIsIm1haW5BcHAiLCJNb3VzZUV2ZW50IiwiY2FuY2VsYWJsZSIsImNsaWVudFgiLCJjbGllbnRZIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlNlZWtIYW5kbGVyIiwic2V0dXBTZWVrSGFuZGxlciIsInBpcERvYyIsInByb2dyZXNzQmFyIiwiZ2V0RHVyYXRpb24iLCJzZWVrVG8iLCJwZXJmb3JtU2VlayIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ4IiwibGVmdCIsInBlcmNlbnQiLCJtYXgiLCJtaW4iLCJkdXJhdGlvbiIsInNlZWtUaW1lIiwidG9GaXhlZCIsIm9uTW91c2VNb3ZlIiwibW92ZUV2ZW50Iiwib25Nb3VzZVVwIiwiWXRBY3Rpb25TZW5kZXIiLCJzZW5kTGlrZUFjdGlvbiIsImFjdGlvblR5cGUiLCJyZXNvbHZlQ29tbWFuZCIsImNvbW1hbmQiLCJsaWtlRW5kcG9pbnQiLCJzdGF0dXMiLCJMaWtlQnV0dG9uSGFuZGxlciIsInl0QWN0aW9uU2VuZGVyIiwidG9nZ2xlQnV0dG9uIiwiYnV0dG9uQ29udGFpbmVyIiwiaXNMaWtlQnV0dG9uIiwiY2hpbGROb2RlcyIsImlzRGlzbGlrZUJ1dHRvbiIsImlzUHJlc3NlZCIsIkRvY3VtZW50Rm9jdXNIYW5kbGVyIiwiY29udGV4dE1lbnVIYW5kbGVyIiwiaXNDb250ZXh0TWVudU9wZW4iLCJ1bnN1YnNjcmliZUNvbnRleHRNZW51Iiwib25Cb2R5Q2xpY2siLCJyZXR1cm5Gb2N1c1RvUGxheWVySWZOZWVkZWQiLCJvbktleVVwIiwia2V5IiwiYWN0aXZlIiwiYWN0aXZlRWxlbWVudCIsIl9jIiwiVGl0bGVTeW5jSGFuZGxlciIsIm11dGF0aW9uT2JzZXJ2ZXIiLCJ2aWRlbyIsInN5bmNUaXRsZSIsImRhdGEiLCJzZXRXaW5kb3dzVGl0bGUiLCJub3RpZnkiLCJuZXdUaXRsZSIsInNob3dOb3RpZmljYXRpb25Db3VudCIsIlBpUFdpbmRvd0hhbmRsZXJzIiwicmVzaXplVHJhY2tlciIsIm1lbnVPYnNlcnZlciIsInNlZWtIYW5kbGVyIiwibGlrZUJ1dHRvbkhhbmRsZXIiLCJuYXZpZ2F0aW9uSGFuZGxlciIsImRvY3VtZW50Rm9jdXNIYW5kbGVyIiwidGl0bGVTeW5jSGFuZGxlciIsIlN0eWxlVXRpbHMiLCJjb3B5U3R5bGVzIiwic291cmNlRG9jIiwidGFyZ2V0RG9jIiwic3R5bGVzIiwibm9kZSIsImhlYWQiLCJjbG9uZU5vZGUiLCJpbmplY3RDU1NGaXhlcyIsInN0eWxlRml4IiwidGV4dENvbnRlbnQiLCJBc3luY0xvY2siLCJsb2NrZWQiLCJxdWV1ZSIsIndpdGhMb2NrIiwiYWNxdWlyZSIsInJlbGVhc2UiLCJxdWV1ZVNpemUiLCJuZXh0Iiwic2hpZnQiLCJyZW1haW5pbmciLCJQaVBFcnJvciIsIlBpUENyaXRpY2FsRXJyb3IiLCJQaVBNYW5hZ2VyIiwibWluaVBsYXllckNvbnRyb2xsZXIiLCJwaXBXaW5kb3dIYW5kbGVycyIsIm1pbmlQbGF5ZXJDb250YWluZXIiLCJvbkJlZm9yZVJldHVybiIsImFzeW5jTG9jayIsImNsb3NlIiwiYXN5bmMiLCJyZXR1cm5QbGF5ZXJUb01haW4iLCJjYXRjaCIsImlzT3BlbiIsIm9wZW4iLCJtb3ZlUGxheWVyVG9QSVAiLCJyZXN1bHQiLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImRwcCIsImRvY3VtZW50UGljdHVyZUluUGljdHVyZSIsInJlcXVlc3RXaW5kb3ciLCJ3aW4iLCJkb2N1bWVudEVsZW1lbnQiLCJwaXBBcHAiLCJ5dERyYWdnYWJsZSIsInByZXBlbmQiLCJtb3ZlUGxheWVyVG9NYWluIiwibWluaXBsYXllckNvbnRhaW5lciIsIk1lZGlhU2Vzc2lvbkhhbmRsZXIiLCJwaXBNYW5hZ2VyIiwibmF2aWdhdG9yIiwicmVnaXN0ZXJBY3Rpb25IYW5kbGVyIiwibWVkaWFTZXNzaW9uIiwic2V0QWN0aW9uSGFuZGxlciIsImdldFlvdVR1YmVWZXJzaW9uIiwieXRjZmciLCJkYXRhXyIsIklOTkVSVFVCRV9DT05URVhUIiwiY2xpZW50IiwiY2xpZW50VmVyc2lvbiIsImdldEJyb3dzZXJWZXJzaW9uIiwidXNlckFnZW50IiwiY2hyb21lTWF0Y2giLCJtYXRjaCIsImluY2x1ZGVzIiwiZWRnZU1hdGNoIiwiZmlyZWZveE1hdGNoIiwic2FmYXJpVmVyc2lvbk1hdGNoIiwiZ2V0R2xvYmFsTWV0YWRhdGEiLCJ5b3V0dWJlVmVyc2lvbiIsInNjcmlwdFZlcnNpb24iLCJicm93c2VyVmVyc2lvbiIsImZlYXR1cmVGbGFncyIsIkVYUEVSSU1FTlRfRkxBR1MiLCJnZXRZb3VUdWJlRmVhdHVyZUZsYWdzIiwieW91dHViZUZlYXR1cmVGbGFncyIsImluaXRpYWxpemVBcHAiLCJjb250YWluZXIiLCJjcmVhdGVDb250YWluZXIiLCJyZWFkeVN0YXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozt5QkFLTyxNQUdNQSxFQUVHLElBRkhBLEVBR1ksRUFIWkEsRUFLVyxJQVNYQyxFQUNBLElBREFBLEVBRUMsSUFGREEsRUFHVSxJQUlWQyxFQUNKLElBRElBLEVBRUgsSUMxQkdDLEVBQXFCLG1CQU1yQkMsRUFDTCxPQURLQSxFQUVMLElDUktDLEdBQ0EsRUFEQUEsRUFHRixFQU9FQyxFQUNILFlBREdBLEVBRUQsY0FJQ0MsRUFDVSx5QkFEVkEsRUFFcUIsMkNBSXJCQyxFQUNMLE9BREtBLEVBRUYsVUFGRUEsRUFHSCxjQVNHQyxFQUNKLHNCQ25DSUMsRUFDQSxFQURBQSxFQUVFLEVBRkZBLEVBR0osRUFISUEsRUFJQyxFQUlEQyxFQUdBLEVDVlBDLE1BQW9CQyxRQUNwQkMsTUFBd0JDLFFDQXZCLFNBQVNDLEVBQU9DLEdBQ3JCLE1BQU8sQ0FBQ0MsRUFBZ0JDLEVBQW1DQyxNREN0RCxTQUEwQkYsRUFBZ0JFLEVBQWVILEdBQzlELE1BQU1JLEVBQVdULEVBQWNVLElBQUlKLElBQVcsR0FDOUNHLEVBQVNELEdBQVNILEVBQ2xCTCxFQUFjVyxJQUFJTCxFQUFRRyxFQUM1QixDQ0pJRyxDQUFpQk4sRUFBUUUsRUFBT0gsR0FFcEMsQ0FNTyxTQUFTUSxJQUNkLE9BQVFQLEtEQ0gsU0FBdUJBLEdBQzVCSixFQUFrQlksSUFBSVIsRUFDeEIsQ0NGSVMsQ0FBY1QsR0FFbEIsdUND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