@drincs/pixi-vn 1.5.13 → 1.5.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/dist/canvas.cjs +3 -2
- package/dist/canvas.d.cts +46 -105
- package/dist/canvas.d.ts +46 -105
- package/dist/canvas.mjs +3 -2
- package/dist/characters.cjs +2 -1
- package/dist/characters.mjs +2 -1
- package/dist/chunk-46QBDRUK.mjs +2 -0
- package/dist/chunk-52EK6LYW.mjs +2 -0
- package/dist/chunk-INJYRMJ3.mjs +2 -0
- package/dist/{chunk-TTRUPDAB.mjs → chunk-JJFD2BVW.mjs} +2 -1
- package/dist/chunk-JJFD2BVW.mjs.map +1 -0
- package/dist/chunk-OXRIVLY2.mjs +2 -0
- package/dist/chunk-SOFV7YZ5.mjs +2 -0
- package/dist/chunk-XZMYXKAY.mjs +2 -0
- package/dist/core.cjs +1 -0
- package/dist/core.d.cts +399 -0
- package/dist/core.d.ts +399 -0
- package/dist/core.mjs +1 -0
- package/dist/history.cjs +2 -1
- package/dist/history.d.cts +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/history.mjs +2 -1
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +9 -10
- package/dist/index.d.ts +9 -10
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -0
- package/dist/motion.cjs +2 -0
- package/dist/motion.cjs.map +1 -0
- package/dist/motion.d.cts +96 -0
- package/dist/motion.d.ts +96 -0
- package/dist/motion.mjs +2 -0
- package/dist/motion.mjs.map +1 -0
- package/dist/narration.cjs +3 -2
- package/dist/narration.mjs +3 -2
- package/dist/pixi/browser.js +170 -167
- package/dist/sound.cjs +2 -1
- package/dist/sound.mjs +2 -1
- package/dist/storage.cjs +2 -1
- package/dist/storage.mjs +2 -1
- package/dist/vite-listener.cjs +2 -1
- package/dist/vite-listener.cjs.map +1 -0
- package/dist/vite-listener.mjs +2 -1
- package/dist/vite-listener.mjs.map +1 -0
- package/dist/vite.cjs +2 -1
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.mjs +2 -1
- package/dist/vite.mjs.map +1 -0
- package/package.json +27 -10
- package/dist/chunk-6GO4XVS7.mjs +0 -1
- package/dist/chunk-6IVCTY6P.mjs +0 -1
- package/dist/chunk-GNJIUFU2.mjs +0 -1
- package/dist/chunk-HVEJJGVC.mjs +0 -1
- package/dist/chunk-XDBHD3IV.mjs +0 -1
- package/dist/chunk-XSN6P5JL.mjs +0 -0
- package/dist/unifier.cjs +0 -1
- package/dist/unifier.mjs +0 -1
package/dist/narration.mjs
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {a as a$1}from'./chunk-HVEJJGVC.mjs';import'./chunk-XSN6P5JL.mjs';import {a as a$2}from'./chunk-6GO4XVS7.mjs';import {a}from'./chunk-6IVCTY6P.mjs';import {d,c,j,k}from'./chunk-GNJIUFU2.mjs';import {GameUnifier}from'@drincs/pixi-vn/unifier';var T=new a({cacheSize:10}),R;(a=>{function m(s){let u=T.get(s);if(!u){j.error(`Label "${s}" not found`);return}return u}a.get=m;function e(s){if(Array.isArray(s)){s.forEach(u=>e(u));return}T.has(s.id)&&j.info(`Label "${s.id}" already exists, it will be overwritten`),T.set(s.id,s);}a.add=e;function t(){return Array.from(T.values())}a.values=t;function r(s){return T.has(s)}a.has=r;function n(){return Array.from(T.keys())}a.keys=n;})(R||(R={}));var f=R;var i=class i{constructor(){}static get allOpenedLabels(){return GameUnifier.getVariable(a$2.OPENED_LABELS_COUNTER_KEY)||{}}static set allOpenedLabels(e){GameUnifier.setVariable(a$2.OPENED_LABELS_COUNTER_KEY,e);}static getCurrentStepTimesCounterData(e=""){let t=i.currentLabelStepIndex;if(t===null)return j.error("currentLabelStepIndex is null"),null;let r=`${t}${e}`,n=i.currentLabelId,a=i._currentLabel;if(!n||t===null||!a)return j.error("currentLabelId or currentLabelStepIndex is null or currentLabel not found"),null;let s=a.getStepSha(t)||"error",u=GameUnifier.getVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY)||{};return u[n]||(u[n]={}),(!u[n][r]||u[n][r].stepSha1!=s)&&(u[n][r]={stepSha1:s}),u[n][r]}static setCurrentStepTimesCounterData(e="",t){let r=i.currentLabelStepIndex,n=r+e,a=i.currentLabelId;if(!a||r===null){j.error("currentLabelId or currentLabelStepIndex is null");return}let s=GameUnifier.getVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY)||{};s[a]||(s[a]={}),s[a][n]=t,GameUnifier.setVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY,s);}static getCurrentStepTimesCounter(e=""){let t=i._stepCounter,r=i.getCurrentStepTimesCounterData(e);if(!r)return j.error("getCurrentStepTimesCounter obj is null"),0;let n=r.stepCounters||r.lastStepIndexs||[];return n.find(s=>s===t)||(n.push(t),delete r.lastStepIndexs,r.stepCounters=n,i.setCurrentStepTimesCounterData(e,r)),n.length}static getRandomNumber(e,t,r={}){let n=r.nestedId||"";if(r.onceOnly||false){let s=i.getCurrentStepTimesCounterData(n);if(!s)return;let u=s.usedRandomNumbers||{},S=Array.from({length:t-e+1},(E,N)=>N+e).filter(E=>!u[`${e}-${t}`]?.includes(E));if(S.length===0)return;let L=Math.floor(Math.random()*S.length),c=S[L];return u[`${e}-${t}`]||(u[`${e}-${t}`]=[]),u[`${e}-${t}`].push(c),s.usedRandomNumbers=u,i.setCurrentStepTimesCounterData(n,s),c}return Math.floor(Math.random()*(t-e+1))+e}static resetCurrentStepTimesCounter(e=""){let t=i.currentLabelStepIndex,r=t+e,n=i.currentLabelId;if(!n||t===null){j.error("currentLabelId or currentLabelStepIndex is null");return}let a=GameUnifier.getVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY)||{};a[n]||(a[n]={}),a[n][r]={stepCounters:[],stepSha1:""},GameUnifier.setVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY,a);}static get allChoicesMade(){return GameUnifier.getVariable(a$2.ALL_CHOICES_MADE_KEY)||[]}static set allChoicesMade(e){GameUnifier.setVariable(a$2.ALL_CHOICES_MADE_KEY,e);}static increaseStepCounter(){i._stepCounter++;}static get openedLabels(){return k(i._openedLabels)}static set openedLabels(e){i._openedLabels=k(e);}static get originalOpenedLabels(){return k(i._originalOpenedLabels)}static set originalOpenedLabels(e){i._originalOpenedLabels=k(e);}static get _currentLabel(){if(i.currentLabelId)return f.get(i.currentLabelId)}static get currentLabelId(){if(i._openedLabels.length>0)return i._openedLabels[i._openedLabels.length-1].label}static get currentLabelStepIndex(){return i._openedLabels.length>0?i._openedLabels[i._openedLabels.length-1].currentStepIndex:null}static addLabelHistory(e,t){let r=i.allOpenedLabels,n=i.allOpenedLabels[e]?.biggestStep||0,a=i.allOpenedLabels[e]?.openCount||0;(!n||n<t)&&(r[e]={biggestStep:t,openCount:a},i.allOpenedLabels=r);}static addChoicesMade(e,t,r,n){let a=i.allChoicesMade,s=a.findIndex(u=>u.labelId===e&&u.stepIndex===t&&u.choiceIndex===n&&u.stepSha1===r);s<0?a.push({labelId:e,stepIndex:t,choiceIndex:n,stepSha1:r,madeTimes:1}):a[s].madeTimes++,i.allChoicesMade=a;}static pushNewLabel(e){if(!f.get(e))throw new Error(`[Pixi\u2019VN] Label ${e} not found`);i._openedLabels.push({label:e,currentStepIndex:0});let r=i.allOpenedLabels,n=i.allOpenedLabels[e]?.biggestStep||0,a=i.allOpenedLabels[e]?.openCount||0;r[e]={biggestStep:n,openCount:a+1},i.allOpenedLabels=r;}static increaseCurrentStepIndex(){if(i._openedLabels.length>0){let e=i._openedLabels[i._openedLabels.length-1];i._openedLabels[i._openedLabels.length-1]={...e,currentStepIndex:e.currentStepIndex+1};}}static set onStepStart(e){i._onStepStart=e;}static get onStepStart(){return async(e,t)=>{let r=[];return i.onLoadingLabel&&e===0&&r.push(i.onLoadingLabel(e,t)),i._onStepStart&&r.push(i._onStepStart(e,t)),await Promise.all(r)}}};d(i,"choiceMadeTemp"),d(i,"lastHistoryStep",null),d(i,"_stepCounter",0),d(i,"_openedLabels",[]),d(i,"_originalOpenedLabels",[]),d(i,"_onStepStart"),d(i,"onLoadingLabel"),d(i,"onStepEnd");var o=i;var I=class{get currentStepTimesCounter(){return o.getCurrentStepTimesCounter()}set currentStepTimesCounter(e){o.resetCurrentStepTimesCounter();}getRandomNumber(e,t,r={}){return o.getRandomNumber(e,t,r)}get stepCounter(){return o._stepCounter}get openedLabels(){return o.openedLabels}get currentLabel(){return o._currentLabel}addStepHistory(e,t={}){let{choiceMade:r,ignoreSameStep:n}=t,a,s,u,S=GameUnifier.getVariable(a$2.LAST_STEP_GLUED)===this.stepCounter;GameUnifier.getVariable(a$2.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(a=GameUnifier.getVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY)),GameUnifier.getVariable(a$2.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(s=GameUnifier.getVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY)),GameUnifier.getVariable(a$2.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(u=GameUnifier.getVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY));let L=o.openedLabels,c={currentLabel:o.currentLabelId,dialogue:a,choices:s,stepSha1:e,index:this.stepCounter,labelStepIndex:o.currentLabelStepIndex,choiceIndexMade:r,inputValue:u,alreadyMadeChoices:this.alreadyCurrentStepMadeChoices,isGlued:S,openedLabels:L};o.originalOpenedLabels=L,GameUnifier.addHistoryItem(c,{ignoreSameStep:n}),o.lastHistoryStep=c,o.increaseStepCounter();}closeCurrentLabel(){if(!o.currentLabelId){j.warn("No label to close");return}if(!this.currentLabel){j.error("currentLabel not found");return}let e=o.openedLabels;e.pop(),o.openedLabels=e,GameUnifier.onLabelClosing(this.openedLabels.length);}closeAllLabels(){for(;o.openedLabels.length>0;)this.closeCurrentLabel(),GameUnifier.onLabelClosing(this.openedLabels.length);}isLabelAlreadyCompleted(e){let t;typeof e=="string"?t=e:t=e.id;let n=o.allOpenedLabels[t]?.biggestStep||0;if(n){let a=f.get(t);if(a)return a.stepCount<=n}return false}get alreadyCurrentStepMadeChoicesObj(){let e=o.currentLabelStepIndex,t=this.currentLabel;if(e===null||!t)return;let r=t.getStepSha(e);return r||(j.warn("stepSha not found, setting to ERROR"),r="error"),o.allChoicesMade.filter(n=>n.labelId===t?.id&&n.stepIndex===e&&n.stepSha1===r)}get alreadyCurrentStepMadeChoices(){return this.alreadyCurrentStepMadeChoicesObj?.map(e=>e.choiceIndex)}get isCurrentStepAlreadyOpened(){let e=o.currentLabelId;if(e){let t=o.allOpenedLabels[e]?.openCount||0;if(o.currentLabelStepIndex&&t>=o.currentLabelStepIndex)return true}return false}getTimesLabelOpened(e){return o.allOpenedLabels[e]?.openCount||0}getTimesChoiceMade(e){return this.alreadyCurrentStepMadeChoicesObj?.find(t=>t.choiceIndex===e)?.madeTimes||0}addCurrentStepToHistory(){this.addStepHistory("dev",{ignoreSameStep:true});}getCanContinue(e){let t=e?.showWarn||false,r=this.choices;return r&&r.length>0?(t&&j.warn("The player must make a choice"),false):this.isRequiredInput?(t&&j.warn("The player must enter a value"),false):true}get canContinue(){return GameUnifier.runningStepsCount!==0?false:this.getCanContinue()}async onStepStart(e,t){let r=[];return e.onStepStart&&r.push(e.onStepStart(t,e)),o.onStepStart&&r.push(o.onStepStart(t,e)),await Promise.all(r)}async onStepEnd(e,t){let r=[];return e.onStepEnd&&r.push(e.onStepEnd(t,e)),o.onStepEnd&&r.push(o.onStepEnd(t,e)),await Promise.all(r)}async continue(e,t={}){let{runNow:r=false,steps:n=1}=t;if(!Number.isFinite(n)){j.warn(`[continue] The parameter steps must be a valid finite number, received: ${n}`);return}if(n<=0){j.warn(`[continue] The parameter steps must be greater than 0, received: ${n}`);return}if(!r&&!this.getCanContinue({showWarn:true}))return;if(!r&&GameUnifier.runningStepsCount!==0){GameUnifier.increaseContinueRequest(n);return}n>1&&GameUnifier.increaseContinueRequest(n-1),GameUnifier.runningStepsCount++;let a;try{GameUnifier.runningStepsCount===1&&await GameUnifier.onPreContinue(),o.increaseCurrentStepIndex(),a=await this.runCurrentStep(e,t);}catch(s){throw j.error("Error continuing",s),s}finally{GameUnifier.runningStepsCount--,a=await this.afterRunCurrentStep(e)||a;}return a}async afterRunCurrentStep(e){if(GameUnifier.runningStepsCount===0&&GameUnifier.continueRequestsCount!==0)return await GameUnifier.processNavigationRequests(e);if(this.openedLabels.length===0){if(GameUnifier.onEnd)return await GameUnifier.onEnd(e,{labelId:"end"});j.error("The end of the game is not managed, so the game is blocked. Read this documentation to know how to manage the end of the game: https://pixi-vn.web.app/start/other-narrative-features.html#how-manage-the-end-of-the-game");}}async runCurrentStep(e,t={}){let{choiceMade:r}=t;if(o.currentLabelId){let n=o.currentLabelStepIndex;if(n===null){j.error("currentLabelStepIndex is null");return}let a=o._currentLabel;if(!a){j.error("currentLabel not found");return}if(a.stepCount>n){try{await this.onStepStart(a,n);}catch(c){j.error("Error running onStepStart",c),this.onStepError&&await this.onStepError(c,e);return}let s=a.getStepById(n);if(!s){j.error("step not found");return}let u=a.getStepSha(n);u||(j.warn("stepSha not found, setting to ERROR"),u="error");let S,L;try{S=await s(e,{labelId:a.id});}catch(c){j.error("Error running step",c),L=c;}try{let c=this.choices;if(c?.length===1&&c[0].autoSelect){let E=c[0];S=await this.selectChoice(E,e);}}catch(c){j.error("Error auto-selecting choice",c),L===void 0&&(L=c);}try{let c=o.lastHistoryStep;r!==void 0&&c&&(u=c.stepSha1,u||(j.warn("stepSha not found, setting to ERROR"),u="error"),o.addChoicesMade(c.currentLabel||"error",typeof c.labelStepIndex=="number"?c.labelStepIndex:-1,c.stepSha1||"error",r),o.choiceMadeTemp=r);}catch(c){j.warn("Error adding choice made to history",c);}try{GameUnifier.runningStepsCount===1&&(o.addLabelHistory(a.id,n),this.addStepHistory(u,{...t,choiceMade:o.choiceMadeTemp}),o.choiceMadeTemp=void 0);}catch(c){j.warn("Error adding step to history",c);}try{this.currentLabel&&await this.onStepEnd(this.currentLabel,o.currentLabelStepIndex||0);}catch(c){j.warn("Error running onStepEnd",c);}return L&&this.onStepError&&await this.onStepError(L,e),S}else {if(this.openedLabels.length>1)return this.closeCurrentLabel(),await this.continue(e,t);if(this.openedLabels.length===1){o.openedLabels=[];return}}}else {if(this.openedLabels.length===0)return;j.error("currentLabelId not found");}}async call(e,t,r){let{choiceMade:n}=r||{},a;typeof e=="string"?a=e:a=e.id,GameUnifier.runningStepsCount++;let s;try{let u=f.get(a);if(!u)throw new Error(`[Pixi\u2019VN] Label ${a} not found`);o.pushNewLabel(u.id),s=await this.runCurrentStep(t,{choiceMade:n});}catch(u){throw j.error("Error calling label",u),u}finally{GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(t)||s;}return s}async jump(e,t,r){if(this.stepCounter===0)return await this.call(e,t,r);this.openedLabels.length>0&&this.closeCurrentLabel();let{choiceMade:n}=r||{},a;typeof e=="string"?a=e:a=e.id,GameUnifier.runningStepsCount++;let s;try{let u=f.get(a);if(!u)throw new Error(`[Pixi\u2019VN] Label ${a} not found`);o.pushNewLabel(u.id),s=await this.runCurrentStep(t,{choiceMade:n});}catch(u){throw j.error("Error jumping to label",u),u}finally{GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(t)||s;}return s}async selectChoice(e,t){this.choices=void 0;let r=e.type;switch(r){case "call":return await this.call(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "jump":return await this.jump(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "close":return await this.closeChoiceMenu(e,{...e.props,...t});default:throw j.error(`Type ${r} not found`),new Error(`[Pixi\u2019VN] Type ${r} not found`)}}async closeChoiceMenu(e,t){if(e.type!=="close")throw j.error("For closeChoiceMenu, the type must be close"),new Error("[Pixi\u2019VN] For closeChoiceMenu, the type must be close");let r;return typeof e.choiceIndex=="number"&&(r=e.choiceIndex),e.closeCurrentLabel&&this.closeCurrentLabel(),await this.continue(t,{choiceMade:r})}get onStepError(){let e=GameUnifier.onError;if(e)return async(t,r)=>{try{return await e("step",t,r)}catch(n){j.error("Error in onError handler",n);}}}set onStepError(e){GameUnifier.onError=(t,r,n)=>e(r,n);}get dialogue(){let e=GameUnifier.getVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY);if(e)return {...e,character:e.character?GameUnifier.getCharacter(e.character)||e.character:void 0}}set dialogue(e){if(e===void 0){GameUnifier.setVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY,void 0);return}if((typeof e=="string"||Array.isArray(e))&&(e={text:e}),this.dialogGlue){let t=GameUnifier.getVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY);if(t){let r=[];Array.isArray(t.text)?r=[...t.text]:r=[t.text],Array.isArray(e.text)?r=[...r,...e.text]:r=[...r,e.text],e.text=r,e.character=e.character||t.character;}GameUnifier.setVariable(a$2.LAST_STEP_GLUED,this.stepCounter),this.dialogGlue=false;}try{GameUnifier.setVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY,k({...e,character:typeof e.character=="string"?e.character:e.character?.id})),GameUnifier.setVariable(a$2.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch(t){throw j.error("DialogueInterface cannot contain functions or classes"),t}}get choices(){let e=GameUnifier.getVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY);if(e){let t=[],r=e.map((a,s)=>({...a,choiceIndex:s})),n=this.alreadyCurrentStepMadeChoices;if(r=r.filter((a,s)=>a.oneTime&&n&&n.includes(s)?false:a.onlyHaveNoChoice?(t.push(a),false):true),r.length>0)return r;if(t.length>0)return [t[0]]}}set choices(e){if(!e||e.length===0){GameUnifier.setVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY,void 0);return}try{GameUnifier.setVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY,k(e)),GameUnifier.setVariable(a$2.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch(t){throw j.error("ChoiceInterface cannot contain functions or classes"),t}}get dialogGlue(){return GameUnifier.getFlag(a$2.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY)}set dialogGlue(e){GameUnifier.setFlag(a$2.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY,e);}get inputValue(){return GameUnifier.getVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY)}set inputValue(e){this.removeInputRequest(),GameUnifier.setVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY,e),GameUnifier.setVariable(a$2.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}get isRequiredInput(){return GameUnifier.getVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY)?.isRequired||false}get inputType(){return GameUnifier.getVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY)?.type}requestInput(e,t){e.isRequired=true,GameUnifier.setVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY,e),t!==void 0?GameUnifier.setVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY,t):GameUnifier.removeVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY);}removeInputRequest(){GameUnifier.removeVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY),GameUnifier.removeVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY);}clear(){o.openedLabels=[],o._stepCounter=0;}export(){return {openedLabels:k(o.openedLabels),stepCounter:this.stepCounter}}async onLoadingLabel(e){let t=this.openedLabels.map(async r=>{let n=[],a=f.get(r.label);return a&&(a.onLoadingLabel&&n.push(a.onLoadingLabel(e,a)),o.onLoadingLabel&&n.push(o.onLoadingLabel(e,a))),await Promise.all(n)});return await Promise.all(t)}async restore(e,t){this.clear();try{o.lastHistoryStep=t,e.hasOwnProperty("openedLabels")?(o.openedLabels=e.openedLabels,o.originalOpenedLabels=o.openedLabels):j.warn("Could not import openedLabels data, so will be ignored"),e.hasOwnProperty("stepCounter")?o._stepCounter=e.stepCounter:e.hasOwnProperty("lastStepIndex")?o._stepCounter=e.lastStepIndex:j.warn("Could not import stepCounter data, so will be ignored");try{await this.onLoadingLabel(o.currentLabelStepIndex||0);}catch(r){j.error("Error running onLoadingLabel",r);}}catch(r){j.error("Error importing data",r);}}};function D(m,e,t,r){let n=typeof e=="string"?e:e.id;return {...r,label:n,props:t,text:m,type:r?.type||"call"}}var _="close";function v(m,e){return {...e,type:_,text:m}}var M=c(a$1(),1);var C=class{constructor(e,t){d(this,"id");d(this,"_onStepStart");d(this,"_onLoadingLabel");d(this,"_onStepEnd");this.id=e,this._onStepStart=t?.onStepStart,this._onLoadingLabel=t?.onLoadingLabel,this._onStepEnd=t?.onStepEnd;}get onStepStart(){return async(e,t)=>{if(this._onLoadingLabel&&e===0&&await this._onLoadingLabel(e,t),this._onStepStart)return await this._onStepStart(e,t)}}get onLoadingLabel(){return this._onLoadingLabel}get onStepEnd(){return this._onStepEnd}};var g=class extends C{constructor(t,r,n){super(t,n);d(this,"_steps");this._steps=r;}get stepCount(){return this.steps.length}getStepById(t){return this.steps[t]}get steps(){return typeof this._steps=="function"?this._steps():this._steps}getStepSha(t){if(t<0||t>=this.steps.length)return j.warn("stepSha not found, setting to ERROR"),"error";try{let r=this.steps[t];return (0,M.default)(r.toString().toLocaleLowerCase()).toString()}catch(r){return j.warn("stepSha not found, setting to ERROR",r),"error"}}};function x(m,e,t){let r=new g(m,e,t);return f.add(r),r}var Se=new I;
|
|
2
|
-
export{
|
|
1
|
+
import {a as a$1}from'./chunk-SOFV7YZ5.mjs';import'./chunk-52EK6LYW.mjs';import {a as a$2}from'./chunk-OXRIVLY2.mjs';import {a}from'./chunk-INJYRMJ3.mjs';import {d,c,j,k}from'./chunk-46QBDRUK.mjs';import {GameUnifier,PixiError}from'@drincs/pixi-vn/core';var T=new a({cacheSize:10}),R;(a=>{function m(s){let u=T.get(s);if(!u){j.error(`Label "${s}" not found`);return}return u}a.get=m;function e(s){if(Array.isArray(s)){s.forEach(u=>e(u));return}T.has(s.id)&&j.info(`Label "${s.id}" already exists, it will be overwritten`),T.set(s.id,s);}a.add=e;function t(){return Array.from(T.values())}a.values=t;function r(s){return T.has(s)}a.has=r;function n(){return Array.from(T.keys())}a.keys=n;})(R||(R={}));var f=R;var i=class i{constructor(){}static get allOpenedLabels(){return GameUnifier.getVariable(a$2.OPENED_LABELS_COUNTER_KEY)||{}}static set allOpenedLabels(e){GameUnifier.setVariable(a$2.OPENED_LABELS_COUNTER_KEY,e);}static getCurrentStepTimesCounterData(e=""){let t=i.currentLabelStepIndex;if(t===null)return j.error("currentLabelStepIndex is null"),null;let r=`${t}${e}`,n=i.currentLabelId,a=i._currentLabel;if(!n||t===null||!a)return j.error("currentLabelId or currentLabelStepIndex is null or currentLabel not found"),null;let s=a.getStepSha(t)||"error",u=GameUnifier.getVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY)||{};return u[n]||(u[n]={}),(!u[n][r]||u[n][r].stepSha1!=s)&&(u[n][r]={stepSha1:s}),u[n][r]}static setCurrentStepTimesCounterData(e="",t){let r=i.currentLabelStepIndex,n=r+e,a=i.currentLabelId;if(!a||r===null){j.error("currentLabelId or currentLabelStepIndex is null");return}let s=GameUnifier.getVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY)||{};s[a]||(s[a]={}),s[a][n]=t,GameUnifier.setVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY,s);}static getCurrentStepTimesCounter(e=""){let t=i._stepCounter,r=i.getCurrentStepTimesCounterData(e);if(!r)return j.error("getCurrentStepTimesCounter obj is null"),0;let n=r.stepCounters||r.lastStepIndexs||[];return n.find(s=>s===t)||(n.push(t),delete r.lastStepIndexs,r.stepCounters=n,i.setCurrentStepTimesCounterData(e,r)),n.length}static getRandomNumber(e,t,r={}){let n=r.nestedId||"";if(r.onceOnly||false){let s=i.getCurrentStepTimesCounterData(n);if(!s)return;let u=s.usedRandomNumbers||{},S=Array.from({length:t-e+1},(_,w)=>w+e).filter(_=>!u[`${e}-${t}`]?.includes(_));if(S.length===0)return;let L=Math.floor(Math.random()*S.length),c=S[L];return u[`${e}-${t}`]||(u[`${e}-${t}`]=[]),u[`${e}-${t}`].push(c),s.usedRandomNumbers=u,i.setCurrentStepTimesCounterData(n,s),c}return Math.floor(Math.random()*(t-e+1))+e}static resetCurrentStepTimesCounter(e=""){let t=i.currentLabelStepIndex,r=t+e,n=i.currentLabelId;if(!n||t===null){j.error("currentLabelId or currentLabelStepIndex is null");return}let a=GameUnifier.getVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY)||{};a[n]||(a[n]={}),a[n][r]={stepCounters:[],stepSha1:""},GameUnifier.setVariable(a$2.CURRENT_STEP_TIMES_COUNTER_KEY,a);}static get allChoicesMade(){return GameUnifier.getVariable(a$2.ALL_CHOICES_MADE_KEY)||[]}static set allChoicesMade(e){GameUnifier.setVariable(a$2.ALL_CHOICES_MADE_KEY,e);}static increaseStepCounter(){i._stepCounter++;}static get openedLabels(){return k(i._openedLabels)}static set openedLabels(e){i._openedLabels=k(e);}static get originalOpenedLabels(){return k(i._originalOpenedLabels)}static set originalOpenedLabels(e){i._originalOpenedLabels=k(e);}static get _currentLabel(){if(i.currentLabelId)return f.get(i.currentLabelId)}static get currentLabelId(){if(i._openedLabels.length>0)return i._openedLabels[i._openedLabels.length-1].label}static get currentLabelStepIndex(){return i._openedLabels.length>0?i._openedLabels[i._openedLabels.length-1].currentStepIndex:null}static addLabelHistory(e,t){let r=i.allOpenedLabels,n=i.allOpenedLabels[e]?.biggestStep||0,a=i.allOpenedLabels[e]?.openCount||0;(!n||n<t)&&(r[e]={biggestStep:t,openCount:a},i.allOpenedLabels=r);}static addChoicesMade(e,t,r,n){let a=i.allChoicesMade,s=a.findIndex(u=>u.labelId===e&&u.stepIndex===t&&u.choiceIndex===n&&u.stepSha1===r);s<0?a.push({labelId:e,stepIndex:t,choiceIndex:n,stepSha1:r,madeTimes:1}):a[s].madeTimes++,i.allChoicesMade=a;}static pushNewLabel(e){if(!f.get(e))throw new PixiError("unregistered_element",`Label ${e} not found`);i._openedLabels.push({label:e,currentStepIndex:0});let r=i.allOpenedLabels,n=i.allOpenedLabels[e]?.biggestStep||0,a=i.allOpenedLabels[e]?.openCount||0;r[e]={biggestStep:n,openCount:a+1},i.allOpenedLabels=r;}static increaseCurrentStepIndex(){if(i._openedLabels.length>0){let e=i._openedLabels[i._openedLabels.length-1];i._openedLabels[i._openedLabels.length-1]={...e,currentStepIndex:e.currentStepIndex+1};}}static set onStepStart(e){i._onStepStart=e;}static get onStepStart(){return async(e,t)=>{let r=[];return i.onLoadingLabel&&e===0&&r.push(i.onLoadingLabel(e,t)),i._onStepStart&&r.push(i._onStepStart(e,t)),await Promise.all(r)}}};d(i,"choiceMadeTemp"),d(i,"lastHistoryStep",null),d(i,"_stepCounter",0),d(i,"_openedLabels",[]),d(i,"_originalOpenedLabels",[]),d(i,"_onStepStart"),d(i,"onLoadingLabel"),d(i,"onStepEnd");var o=i;var E=class{get currentStepTimesCounter(){return o.getCurrentStepTimesCounter()}set currentStepTimesCounter(e){o.resetCurrentStepTimesCounter();}getRandomNumber(e,t,r={}){return o.getRandomNumber(e,t,r)}get stepCounter(){return o._stepCounter}get openedLabels(){return o.openedLabels}get currentLabel(){return o._currentLabel}addStepHistory(e,t={}){let{choiceMade:r,ignoreSameStep:n}=t,a,s,u,S=GameUnifier.getVariable(a$2.LAST_STEP_GLUED)===this.stepCounter;GameUnifier.getVariable(a$2.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(a=GameUnifier.getVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY)),GameUnifier.getVariable(a$2.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(s=GameUnifier.getVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY)),GameUnifier.getVariable(a$2.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY)===this.stepCounter&&(u=GameUnifier.getVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY));let L=o.openedLabels,c={currentLabel:o.currentLabelId,dialogue:a,choices:s,stepSha1:e,index:this.stepCounter,labelStepIndex:o.currentLabelStepIndex,choiceIndexMade:r,inputValue:u,alreadyMadeChoices:this.alreadyCurrentStepMadeChoices,isGlued:S,openedLabels:L};o.originalOpenedLabels=L,GameUnifier.addHistoryItem(c,{ignoreSameStep:n}),o.lastHistoryStep=c,o.increaseStepCounter();}closeCurrentLabel(){if(!o.currentLabelId){j.warn("No label to close");return}if(!this.currentLabel){j.error("currentLabel not found");return}let e=o.openedLabels;e.pop(),o.openedLabels=e,GameUnifier.onLabelClosing(this.openedLabels.length);}closeAllLabels(){for(;o.openedLabels.length>0;)this.closeCurrentLabel(),GameUnifier.onLabelClosing(this.openedLabels.length);}isLabelAlreadyCompleted(e){let t;typeof e=="string"?t=e:t=e.id;let n=o.allOpenedLabels[t]?.biggestStep||0;if(n){let a=f.get(t);if(a)return a.stepCount<=n}return false}get alreadyCurrentStepMadeChoicesObj(){let e=o.currentLabelStepIndex,t=this.currentLabel;if(e===null||!t)return;let r=t.getStepSha(e);return r||(j.warn("stepSha not found, setting to ERROR"),r="error"),o.allChoicesMade.filter(n=>n.labelId===t?.id&&n.stepIndex===e&&n.stepSha1===r)}get alreadyCurrentStepMadeChoices(){return this.alreadyCurrentStepMadeChoicesObj?.map(e=>e.choiceIndex)}get isCurrentStepAlreadyOpened(){let e=o.currentLabelId;if(e){let t=o.allOpenedLabels[e]?.openCount||0;if(o.currentLabelStepIndex&&t>=o.currentLabelStepIndex)return true}return false}getTimesLabelOpened(e){return o.allOpenedLabels[e]?.openCount||0}getTimesChoiceMade(e){return this.alreadyCurrentStepMadeChoicesObj?.find(t=>t.choiceIndex===e)?.madeTimes||0}addCurrentStepToHistory(){this.addStepHistory("dev",{ignoreSameStep:true});}getCanContinue(e){let t=e?.showWarn||false,r=this.choices;return r&&r.length>0?(t&&j.warn("The player must make a choice"),false):this.isRequiredInput?(t&&j.warn("The player must enter a value"),false):true}get canContinue(){return GameUnifier.runningStepsCount!==0?false:this.getCanContinue()}async onStepStart(e,t){let r=[];return e.onStepStart&&r.push(e.onStepStart(t,e)),o.onStepStart&&r.push(o.onStepStart(t,e)),await Promise.all(r)}async onStepEnd(e,t){let r=[];return e.onStepEnd&&r.push(e.onStepEnd(t,e)),o.onStepEnd&&r.push(o.onStepEnd(t,e)),await Promise.all(r)}async continue(e,t={}){let{runNow:r=false,steps:n=1}=t;if(!Number.isFinite(n)){j.warn(`[continue] The parameter steps must be a valid finite number, received: ${n}`);return}if(n<=0){j.warn(`[continue] The parameter steps must be greater than 0, received: ${n}`);return}if(!r&&!this.getCanContinue({showWarn:true}))return;if(!r&&GameUnifier.runningStepsCount!==0){GameUnifier.increaseContinueRequest(n);return}n>1&&GameUnifier.increaseContinueRequest(n-1),GameUnifier.runningStepsCount++;let a;try{GameUnifier.runningStepsCount===1&&await GameUnifier.onPreContinue(),o.increaseCurrentStepIndex(),a=await this.runCurrentStep(e,t);}catch(s){throw j.error("Error continuing",s),s}finally{GameUnifier.runningStepsCount--,a=await this.afterRunCurrentStep(e)||a;}return a}async afterRunCurrentStep(e){if(GameUnifier.runningStepsCount===0&&GameUnifier.continueRequestsCount!==0)return await GameUnifier.processNavigationRequests(e);if(this.openedLabels.length===0){if(GameUnifier.onEnd)return await GameUnifier.onEnd(e,{labelId:"end"});j.error("The end of the game is not managed, so the game is blocked. Read this documentation to know how to manage the end of the game: https://pixi-vn.web.app/start/other-narrative-features.html#how-manage-the-end-of-the-game");}}async runCurrentStep(e,t={}){let{choiceMade:r}=t;if(o.currentLabelId){let n=o.currentLabelStepIndex;if(n===null){j.error("currentLabelStepIndex is null");return}let a=o._currentLabel;if(!a){j.error("currentLabel not found");return}if(a.stepCount>n){try{await this.onStepStart(a,n);}catch(c){j.error("Error running onStepStart",c),this.onStepError&&await this.onStepError(c,e);return}let s=a.getStepById(n);if(!s){j.error("step not found");return}let u=a.getStepSha(n);u||(j.warn("stepSha not found, setting to ERROR"),u="error");let S,L;try{S=await s(e,{labelId:a.id});}catch(c){j.error("Error running step",c),L=c;}try{let c=this.choices;if(c?.length===1&&c[0].autoSelect){let _=c[0];S=await this.selectChoice(_,e);}}catch(c){j.error("Error auto-selecting choice",c),L===void 0&&(L=c);}try{let c=o.lastHistoryStep;r!==void 0&&c&&(u=c.stepSha1,u||(j.warn("stepSha not found, setting to ERROR"),u="error"),o.addChoicesMade(c.currentLabel||"error",typeof c.labelStepIndex=="number"?c.labelStepIndex:-1,c.stepSha1||"error",r),o.choiceMadeTemp=r);}catch(c){j.warn("Error adding choice made to history",c);}try{GameUnifier.runningStepsCount===1&&(o.addLabelHistory(a.id,n),this.addStepHistory(u,{...t,choiceMade:o.choiceMadeTemp}),o.choiceMadeTemp=void 0);}catch(c){j.warn("Error adding step to history",c);}try{this.currentLabel&&await this.onStepEnd(this.currentLabel,o.currentLabelStepIndex||0);}catch(c){j.warn("Error running onStepEnd",c);}return L&&this.onStepError&&await this.onStepError(L,e),S}else {if(this.openedLabels.length>1)return this.closeCurrentLabel(),await this.continue(e,t);if(this.openedLabels.length===1){o.openedLabels=[];return}}}else {if(this.openedLabels.length===0)return;j.error("currentLabelId not found");}}async call(e,t,r){let{choiceMade:n}=r||{},a;typeof e=="string"?a=e:a=e.id,GameUnifier.runningStepsCount++;let s;try{let u=f.get(a);if(!u)throw new PixiError("unregistered_element",`Label ${a} not found`);o.pushNewLabel(u.id),s=await this.runCurrentStep(t,{choiceMade:n});}catch(u){throw j.error("Error calling label",u),u}finally{GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(t)||s;}return s}async jump(e,t,r){if(this.stepCounter===0)return await this.call(e,t,r);this.openedLabels.length>0&&this.closeCurrentLabel();let{choiceMade:n}=r||{},a;typeof e=="string"?a=e:a=e.id,GameUnifier.runningStepsCount++;let s;try{let u=f.get(a);if(!u)throw new PixiError("unregistered_element",`Label ${a} not found`);o.pushNewLabel(u.id),s=await this.runCurrentStep(t,{choiceMade:n});}catch(u){throw j.error("Error jumping to label",u),u}finally{GameUnifier.runningStepsCount--,s=await this.afterRunCurrentStep(t)||s;}return s}async selectChoice(e,t){this.choices=void 0;let r=e.type;switch(r){case "call":return await this.call(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "jump":return await this.jump(e.label,{...e.props,...t},{choiceMade:e.choiceIndex});case "close":return await this.closeChoiceMenu(e,{...e.props,...t});default:throw j.error(`Type ${r} not found`),new PixiError("invalid_usage",`Type ${r} not found`)}}async closeChoiceMenu(e,t){if(e.type!=="close")throw j.error("For closeChoiceMenu, the type must be close"),new PixiError("invalid_usage","For closeChoiceMenu, the type must be close");let r;return typeof e.choiceIndex=="number"&&(r=e.choiceIndex),e.closeCurrentLabel&&this.closeCurrentLabel(),await this.continue(t,{choiceMade:r})}get onStepError(){let e=GameUnifier.onError;if(e)return async(t,r)=>{try{return await e("step",t,r)}catch(n){j.error("Error in onError handler",n);}}}set onStepError(e){GameUnifier.onError=(t,r,n)=>e(r,n);}get dialogue(){let e=GameUnifier.getVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY);if(e)return {...e,character:e.character?GameUnifier.getCharacter(e.character)||e.character:void 0}}set dialogue(e){if(e===void 0){GameUnifier.setVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY,void 0);return}if((typeof e=="string"||Array.isArray(e))&&(e={text:e}),this.dialogGlue){let t=GameUnifier.getVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY);if(t){let r=[];Array.isArray(t.text)?r=[...t.text]:r=[t.text],Array.isArray(e.text)?r=[...r,...e.text]:r=[...r,e.text],e.text=r,e.character=e.character||t.character;}GameUnifier.setVariable(a$2.LAST_STEP_GLUED,this.stepCounter),this.dialogGlue=false;}try{GameUnifier.setVariable(a$2.CURRENT_DIALOGUE_MEMORY_KEY,k({...e,character:typeof e.character=="string"?e.character:e.character?.id})),GameUnifier.setVariable(a$2.LAST_DIALOGUE_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch{throw j.error("DialogueInterface cannot contain functions or classes"),new PixiError("not_json_serializable","ChoiceInterface cannot contain functions or classes")}}get choices(){let e=GameUnifier.getVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY);if(e){let t=[],r=e.map((a,s)=>({...a,choiceIndex:s})),n=this.alreadyCurrentStepMadeChoices;if(r=r.filter((a,s)=>a.oneTime&&n&&n.includes(s)?false:a.onlyHaveNoChoice?(t.push(a),false):true),r.length>0)return r;if(t.length>0)return [t[0]]}}set choices(e){if(!e||e.length===0){GameUnifier.setVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY,void 0);return}try{GameUnifier.setVariable(a$2.CURRENT_MENU_OPTIONS_MEMORY_KEY,k(e)),GameUnifier.setVariable(a$2.LAST_MENU_OPTIONS_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}catch{throw j.error("ChoiceInterface cannot contain functions or classes"),new PixiError("not_json_serializable","ChoiceInterface cannot contain functions or classes")}}get dialogGlue(){return GameUnifier.getFlag(a$2.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY)}set dialogGlue(e){GameUnifier.setFlag(a$2.ADD_NEXT_DIALOG_TEXT_INTO_THE_CURRENT_DIALOG_FLAG_KEY,e);}get inputValue(){return GameUnifier.getVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY)}set inputValue(e){this.removeInputRequest(),GameUnifier.setVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY,e),GameUnifier.setVariable(a$2.LAST_INPUT_ADDED_IN_STEP_MEMORY_KEY,this.stepCounter);}get isRequiredInput(){return GameUnifier.getVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY)?.isRequired||false}get inputType(){return GameUnifier.getVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY)?.type}requestInput(e,t){e.isRequired=true,GameUnifier.setVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY,e),t!==void 0?GameUnifier.setVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY,t):GameUnifier.removeVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY);}removeInputRequest(){GameUnifier.removeVariable(a$2.CURRENT_INPUT_INFO_MEMORY_KEY),GameUnifier.removeVariable(a$2.CURRENT_INPUT_VALUE_MEMORY_KEY);}clear(){o.openedLabels=[],o._stepCounter=0;}export(){return {openedLabels:k(o.openedLabels),stepCounter:this.stepCounter}}async onLoadingLabel(e){let t=this.openedLabels.map(async r=>{let n=[],a=f.get(r.label);return a&&(a.onLoadingLabel&&n.push(a.onLoadingLabel(e,a)),o.onLoadingLabel&&n.push(o.onLoadingLabel(e,a))),await Promise.all(n)});return await Promise.all(t)}async restore(e,t){this.clear();try{o.lastHistoryStep=t,e.hasOwnProperty("openedLabels")?(o.openedLabels=e.openedLabels,o.originalOpenedLabels=o.openedLabels):j.warn("Could not import openedLabels data, so will be ignored"),e.hasOwnProperty("stepCounter")?o._stepCounter=e.stepCounter:e.hasOwnProperty("lastStepIndex")?o._stepCounter=e.lastStepIndex:j.warn("Could not import stepCounter data, so will be ignored");try{await this.onLoadingLabel(o.currentLabelStepIndex||0);}catch(r){j.error("Error running onLoadingLabel",r);}}catch(r){j.error("Error importing data",r);}}};function U(m,e,t,r){let n=typeof e=="string"?e:e.id;return {...r,label:n,props:t,text:m,type:r?.type||"call"}}var O="close";function Y(m,e){return {...e,type:O,text:m}}var x=c(a$1(),1);var g=class{constructor(e,t){d(this,"id");d(this,"_onStepStart");d(this,"_onLoadingLabel");d(this,"_onStepEnd");this.id=e,this._onStepStart=t?.onStepStart,this._onLoadingLabel=t?.onLoadingLabel,this._onStepEnd=t?.onStepEnd;}get onStepStart(){return async(e,t)=>{if(this._onLoadingLabel&&e===0&&await this._onLoadingLabel(e,t),this._onStepStart)return await this._onStepStart(e,t)}}get onLoadingLabel(){return this._onLoadingLabel}get onStepEnd(){return this._onStepEnd}};var I=class extends g{constructor(t,r,n){super(t,n);d(this,"_steps");this._steps=r;}get stepCount(){return this.steps.length}getStepById(t){return this.steps[t]}get steps(){return typeof this._steps=="function"?this._steps():this._steps}getStepSha(t){if(t<0||t>=this.steps.length)return j.warn("stepSha not found, setting to ERROR"),"error";try{let r=this.steps[t];return (0,x.default)(r.toString().toLocaleLowerCase()).toString()}catch(r){return j.warn("stepSha not found, setting to ERROR",r),"error"}}};function N(m,e,t){let r=new I(m,e,t);return f.add(r),r}var ye=new E;
|
|
2
|
+
export{O as Close,I as Label,g as LabelAbstract,o as NarrationManagerStatic,f as RegisteredLabels,ye as narration,U as newChoiceOption,Y as newCloseChoiceOption,N as newLabel};//# sourceMappingURL=narration.mjs.map
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9uYXJyYXRpb24vZGVjb3JhdG9ycy9SZWdpc3RlcmVkTGFiZWxzLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9OYXJyYXRpb25NYW5hZ2VyU3RhdGljLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9OYXJyYXRpb25NYW5hZ2VyLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9jbGFzc2VzL0Nob2ljZU1lbnVPcHRpb24udHMiLCIuLi9zcmMvbmFycmF0aW9uL3R5cGVzL0Nsb3NlVHlwZS50cyIsIi4uL3NyYy9uYXJyYXRpb24vY2xhc3Nlcy9DbG9zZUNob2ljZU9wdGlvbi50cyIsIi4uL3NyYy9uYXJyYXRpb24vY2xhc3Nlcy9MYWJlbC50cyIsIi4uL3NyYy9uYXJyYXRpb24vY2xhc3Nlcy9MYWJlbEFic3RyYWN0LnRzIiwiLi4vc3JjL25hcnJhdGlvbi9kZWNvcmF0b3JzL25ld0xhYmVsLnRzIiwiLi4vc3JjL25hcnJhdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6WyJyZWdpc3RlcmVkTGFiZWxzIiwiQ2FjaGVkTWFwIiwiUmVnaXN0ZXJlZExhYmVscyIsImdldCIsImlkIiwibGFiZWwiLCJsb2dnZXIiLCJhZGQiLCJsIiwidmFsdWVzIiwiaGFzIiwia2V5cyIsIlJlZ2lzdGVyZWRMYWJlbHNfZGVmYXVsdCIsIl9OYXJyYXRpb25NYW5hZ2VyU3RhdGljIiwiR2FtZVVuaWZpZXIiLCJTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTIiwidmFsdWUiLCJuZXN0ZWRJZCIsImN1cnJlbnRMYWJlbFN0ZXBJbmRleCIsImN1cnJlbnRMYWJlbFN0ZXBJbmRleElkIiwibGFiZWxJZCIsImN1cnJlbnRMYWJlbCIsInN0ZXBTaGExIiwib2JqIiwiZGF0YSIsImxhc3RTdGVwIiwibGlzdCIsIml0ZW0iLCJtaW4iLCJtYXgiLCJvcHRpb25zIiwidXNlZFJhbmRvbU51bWJlcnMiLCJhbGxOdW1iZXJzIiwiaSIsInJhbmRvbUluZGV4IiwicmFuZG9tTnVtYmVyIiwiY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQiLCJzdGVwSW5kZXgiLCJhbGxPcGVuZWRMYWJlbHMiLCJvbGRTdGVwSW5kZXgiLCJvcGVuQ291bnQiLCJzdGVwU2hhIiwiY2hvaWNlTWFkZSIsImFsbENob2ljZXNNYWRlIiwiYWxyZWR5TWFkZSIsIlBpeGlFcnJvciIsImJpZ2dlc3RTdGVwIiwic3RlcElkIiwicmVzIiwiX19wdWJsaWNGaWVsZCIsIk5hcnJhdGlvbk1hbmFnZXJTdGF0aWMiLCJOYXJyYXRpb25NYW5hZ2VyIiwiXyIsImlnbm9yZVNhbWVTdGVwIiwiZGlhbG9ndWUiLCJjaG9pY2VzIiwiaW5wdXRWYWx1ZSIsImlzR2x1ZWQiLCJvcGVuZWRMYWJlbHMiLCJoaXN0b3J5SW5mbyIsImNob2ljZSIsImluZGV4Iiwic2hvd1dhcm4iLCJjaG9pY2VNZW51T3B0aW9ucyIsInByb3BzIiwicnVuTm93Iiwic3RlcHMiLCJyZXN1bHQiLCJlIiwic3RlcCIsImVyciIsImxhc3RIaXN0b3J5U3RlcCIsInRlbXBMYWJlbCIsInR5cGUiLCJvbkVycm9yIiwiZXJyb3IiLCJnbHVlRGlhbG9ndWUiLCJuZXdUZXh0IiwiZCIsIm9ubHlIYXZlTm9DaG9pY2UiLCJvcHRpb24iLCJhbHJlYWR5Q2hvaWNlcyIsImluZm8iLCJkZWZhdWx0VmFsdWUiLCJwcm9taXNlIiwibGFiZWxJbmZvIiwibmV3Q2hvaWNlT3B0aW9uIiwidGV4dCIsIkNsb3NlIiwibmV3Q2xvc2VDaG9pY2VPcHRpb24iLCJpbXBvcnRfc2hhMSIsIlAiLCJBIiwiTGFiZWxBYnN0cmFjdCIsIkxhYmVsIiwic2hhMSIsIm5ld0xhYmVsIiwibmFycmF0aW9uIl0sIm1hcHBpbmdzIjoiOFBBVUEsSUFBTUEsQ0FBQUEsQ0FBbUIsSUFBSUMsQ0FBQUEsQ0FBd0QsQ0FBRSxVQUFXLEVBQUcsQ0FBQyxFQUU1RkMsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsRUFBVixDQU1XLFNBQVNDLENBQUFBLENBQTRCQyxDQUFBQSxDQUFnQyxDQUN4RSxJQUFJQyxDQUFBQSxDQUFRTCxFQUFp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U2lCLEVBQ2xCLENBZEEsSUFBVyxTQUFBLEVBQW9CLENBQzNCLE9BQU8sS0FBSyxLQUFBLENBQU0sTUFDdEIsQ0FDTyxXQUFBLENBQVluQixDQUFBQSxDQUE4QyxDQUM3RCxPQUFPLElBQUEsQ0FBSyxNQUFNQSxDQUFNLENBQzVCLENBZUEsSUFBVyxLQUFBLEVBQTRCLENBQ25DLE9BQUksT0FBTyxLQUFLLE1BQUEsRUFBVyxVQUFBLENBQ2hCLElBQUEsQ0FBSyxNQUFBLEVBQU8sQ0FFaEIsSUFBQSxDQUFLLE1BQ2hCLENBRU8sVUFBQSxDQUFXYyxFQUF1QixDQUNyQyxHQUFJQSxFQUFRLENBQUEsRUFBS0EsQ0FBQUEsRUFBUyxLQUFLLEtBQUEsQ0FBTSxNQUFBLENBQ2pDLE9BQUF2RCxDQUFBQSxDQUFPLElBQUEsQ0FBSyxxQ0FBcUMsQ0FBQSxDQUMxQyxPQUFBLENBRVgsR0FBSSxDQUNBLElBQUkrRCxDQUFBQSxDQUFPLElBQUEsQ0FBSyxLQUFBLENBQU1SLENBQUssRUFFM0IsT0FBQSxDQUFBLENBQUEsQ0FEaUIsQ0FBQSxDQUFBa0MsU0FBSzFCLENBQUFBLENBQUssUUFBQSxHQUFXLGlCQUFBLEVBQW1CLEVBQ3ZDLFFBQUEsRUFDdEIsT0FBU0QsQ0FBQUEsQ0FBRyxDQUNSLE9BQUE5RCxDQUFBQSxDQUFPLElBQUEsQ0FBSyxzQ0FBdUM4RCxDQUFDLENBQUEsQ0FDN0MsT0FDWCxDQUNKLENBQ0osRUU1RGUsU0FBUjRCLENBQUFBLENBQ0g1RixDQUFBQSxDQUNBOEQsRUFDQUYsQ0FBQUEsQ0FDUSxDQUNSLElBQUkzRCxDQUFBQSxDQUFRLElBQUl5RixFQUFTMUYsQ0FBQUEsQ0FBSThELENBQUFBLENBQU9GLENBQUssQ0FBQSxDQUN6QyxPQUFBcEQsRUFBaUIsR0FBQSxDQUFJUCxDQUFLLEVBQ25CQSxDQUNYLENDYUEsSUFBTTRGLEVBQUFBLENBQXVDLElBQUk5QyIsImZpbGUiOiJuYXJyYXRpb24ubWpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVkTWFwIH0gZnJvbSBcIi4uLy4uL2NsYXNzZXNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy9sb2ctdXRpbGl0eVwiO1xuaW1wb3J0IExhYmVsIGZyb20gXCIuLi9jbGFzc2VzL0xhYmVsXCI7XG5pbXBvcnQgTGFiZWxBYnN0cmFjdCBmcm9tIFwiLi4vY2xhc3Nlcy9MYWJlbEFic3RyYWN0XCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9MYWJlbElkVHlwZVwiO1xuXG4vKipcbiAqIEEgTWFwIHRoYXQgY29udGFpbnMgYWxsIGxhYmVscyByZWdpc3RlcmVkIGFuZCBhdmFpbGFibGUgdG8gYmUgdXNlZC5cbiAqIFRoZSBrZXkgaXMgdGhlIGlkIG9mIHRoZSBsYWJlbCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBsYWJlbCBpdHNlbGYuXG4gKi9cbmNvbnN0IHJlZ2lzdGVyZWRMYWJlbHMgPSBuZXcgQ2FjaGVkTWFwPExhYmVsSWRUeXBlLCBMYWJlbEFic3RyYWN0PGFueT4gfCBMYWJlbDxhbnk+Pih7IGNhY2hlU2l6ZTogMTAgfSk7XG5cbm5hbWVzcGFjZSBSZWdpc3RlcmVkTGFiZWxzIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgbGFiZWwgYnkgaXRzIGlkXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbGFiZWxcbiAgICAgKiBAcmV0dXJucyBUaGUgbGFiZWwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldDxUID0gTGFiZWxBYnN0cmFjdDxhbnk+PihpZDogTGFiZWxJZFR5cGUpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGxhYmVsID0gcmVnaXN0ZXJlZExhYmVscy5nZXQoaWQpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYExhYmVsIFwiJHtpZH1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWwgYXMgVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGxhYmVsIGluIHRoZSBzeXN0ZW1cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIGJlIHNhdmVkXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGFkZChsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnksIGFueT4gfCBMYWJlbEFic3RyYWN0PGFueSwgYW55PltdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhYmVsKSkge1xuICAgICAgICAgICAgbGFiZWwuZm9yRWFjaCgobCkgPT4gYWRkKGwpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVnaXN0ZXJlZExhYmVscy5oYXMobGFiZWwuaWQpKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgTGFiZWwgXCIke2xhYmVsLmlkfVwiIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJlZExhYmVscy5zZXQobGFiZWwuaWQsIGxhYmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBsYWJlbHMgcmVnaXN0ZXJlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBsYWJlbHMuXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHZhbHVlcygpOiBMYWJlbEFic3RyYWN0PGFueT5bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHJlZ2lzdGVyZWRMYWJlbHMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgbGFiZWwgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGxhYmVsXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGFiZWwgaXMgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGhhcyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWdpc3RlcmVkTGFiZWxzLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgbGFiZWwgaWRzIHJlZ2lzdGVyZWQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgbGFiZWwgaWRzLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBrZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocmVnaXN0ZXJlZExhYmVscy5rZXlzKCkpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdGVyZWRMYWJlbHM7XG4iLCJpbXBvcnQgeyBHYW1lVW5pZmllciwgUGl4aUVycm9yIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12bi9jb3JlXCI7XG5pbXBvcnQgeyBMYWJlbEFic3RyYWN0IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMgfSBmcm9tIFwiLi4vc3RvcmFnZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nLXV0aWxpdHlcIjtcbmltcG9ydCBMYWJlbCBmcm9tIFwiLi9jbGFzc2VzL0xhYmVsXCI7XG5pbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHNcIjtcbmltcG9ydCBIaXN0b3J5U3RlcCBmcm9tIFwiLi9pbnRlcmZhY2VzL0hpc3RvcnlTdGVwXCI7XG5pbXBvcnQgT3BlbmVkTGFiZWwgZnJvbSBcIi4vaW50ZXJmYWNlcy9PcGVuZWRMYWJlbFwiO1xuaW1wb3J0IENob2ljZXNNYWRlVHlwZSBmcm9tIFwiLi90eXBlcy9DaG9pY2VzTWFkZVR5cGVcIjtcbmltcG9ydCB7IExhYmVsSWRUeXBlIH0gZnJvbSBcIi4vdHlwZXMvTGFiZWxJZFR5cGVcIjtcblxudHlwZSBBbGxPcGVuZWRMYWJlbHNUeXBlID0geyBba2V5OiBMYWJlbElkVHlwZV06IHsgYmlnZ2VzdFN0ZXA6IG51bWJlcjsgb3BlbkNvdW50OiBudW1iZXIgfSB9O1xuXG50eXBlIEN1cnJlbnRTdGVwVGltZXNDb3VudGVyTWVtb3R5RGF0YSA9IHtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc3RlcEluZGV4c1xuICAgICAqL1xuICAgIGxhc3RTdGVwSW5kZXhzPzogbnVtYmVyW107XG4gICAgc3RlcENvdW50ZXJzPzogbnVtYmVyW107XG4gICAgdXNlZFJhbmRvbU51bWJlcnM/OiB7IFttaW5tYXhrZXk6IHN0cmluZ106IG51bWJlcltdIH07XG4gICAgc3RlcFNoYTE6IHN0cmluZztcbn07XG50eXBlIEN1cnJlbnRTdGVwVGltZXNDb3VudGVyTWVtb3R5ID0ge1xuICAgIFtrZXk6IExhYmVsSWRUeXBlXToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBDdXJyZW50U3RlcFRpbWVzQ291bnRlck1lbW90eURhdGE7XG4gICAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHN0YXRpYyBjaG9pY2VNYWRlVGVtcDogdW5kZWZpbmVkIHwgbnVtYmVyID0gdW5kZWZpbmVkO1xuICAgIHN0YXRpYyBsYXN0SGlzdG9yeVN0ZXA6IE9taXQ8SGlzdG9yeVN0ZXAsIFwiZGlmZlwiPiB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIGlzIGEgbGlzdCBvZiBhbGwgbGFiZWxzIHRoYXQgaGF2ZSBiZWVuIG9wZW5lZCBkdXJpbmcgdGhlIHByb2dyZXNzaW9uIG9mIHRoZSBzdGVwcy5cbiAgICAgKiB0aGUga2V5IGlzIHRoZSBsYWJlbCBpZCBhbmQgdGhlIGJpZ2dlc3Qgc3RlcCBvcGVuZWQuXG4gICAgICovXG4gICAgc3RhdGljIGdldCBhbGxPcGVuZWRMYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxBbGxPcGVuZWRMYWJlbHNUeXBlPihTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLk9QRU5FRF9MQUJFTFNfQ09VTlRFUl9LRVkpIHx8IHt9XG4gICAgICAgICk7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgYWxsT3BlbmVkTGFiZWxzKHZhbHVlOiBBbGxPcGVuZWRMYWJlbHNUeXBlKSB7XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuT1BFTkVEX0xBQkVMU19DT1VOVEVSX0tFWSwgdmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXJEYXRhKG5lc3RlZElkOiBzdHJpbmcgPSBcIlwiKTogQ3VycmVudFN0ZXBUaW1lc0NvdW50ZXJNZW1vdHlEYXRhIHwgbnVsbCB7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleDtcbiAgICAgICAgaWYgKGN1cnJlbnRMYWJlbFN0ZXBJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsU3RlcEluZGV4IGlzIG51bGxcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VycmVudExhYmVsU3RlcEluZGV4SWQgPSBgJHtjdXJyZW50TGFiZWxTdGVwSW5kZXh9JHtuZXN0ZWRJZH1gO1xuICAgICAgICBsZXQgbGFiZWxJZCA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQ7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWwgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9jdXJyZW50TGFiZWw7XG4gICAgICAgIGlmICghbGFiZWxJZCB8fCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPT09IG51bGwgfHwgIWN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsSWQgb3IgY3VycmVudExhYmVsU3RlcEluZGV4IGlzIG51bGwgb3IgY3VycmVudExhYmVsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGVwU2hhMSA9IGN1cnJlbnRMYWJlbC5nZXRTdGVwU2hhKGN1cnJlbnRMYWJlbFN0ZXBJbmRleCkgfHwgXCJlcnJvclwiO1xuICAgICAgICBsZXQgb2JqID1cbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPEN1cnJlbnRTdGVwVGltZXNDb3VudGVyTWVtb3R5PihcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfU1RFUF9USU1FU19DT1VOVEVSX0tFWSxcbiAgICAgICAgICAgICkgfHwge307XG4gICAgICAgIGlmICghb2JqW2xhYmVsSWRdKSB7XG4gICAgICAgICAgICBvYmpbbGFiZWxJZF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9ialtsYWJlbElkXVtjdXJyZW50TGFiZWxTdGVwSW5kZXhJZF0gfHwgb2JqW2xhYmVsSWRdW2N1cnJlbnRMYWJlbFN0ZXBJbmRleElkXS5zdGVwU2hhMSAhPSBzdGVwU2hhMSkge1xuICAgICAgICAgICAgb2JqW2xhYmVsSWRdW2N1cnJlbnRMYWJlbFN0ZXBJbmRleElkXSA9IHsgc3RlcFNoYTE6IHN0ZXBTaGExIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialtsYWJlbElkXVtjdXJyZW50TGFiZWxTdGVwSW5kZXhJZF07XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHNldEN1cnJlbnRTdGVwVGltZXNDb3VudGVyRGF0YShuZXN0ZWRJZDogc3RyaW5nID0gXCJcIiwgZGF0YTogQ3VycmVudFN0ZXBUaW1lc0NvdW50ZXJNZW1vdHlEYXRhKSB7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleDtcbiAgICAgICAgbGV0IGN1cnJlbnRMYWJlbFN0ZXBJbmRleElkID0gY3VycmVudExhYmVsU3RlcEluZGV4ICsgbmVzdGVkSWQ7XG4gICAgICAgIGxldCBsYWJlbElkID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxJZDtcbiAgICAgICAgaWYgKCFsYWJlbElkIHx8IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsSWQgb3IgY3VycmVudExhYmVsU3RlcEluZGV4IGlzIG51bGxcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iaiA9XG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxDdXJyZW50U3RlcFRpbWVzQ291bnRlck1lbW90eT4oXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX1NURVBfVElNRVNfQ09VTlRFUl9LRVksXG4gICAgICAgICAgICApIHx8IHt9O1xuICAgICAgICBpZiAoIW9ialtsYWJlbElkXSkge1xuICAgICAgICAgICAgb2JqW2xhYmVsSWRdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgb2JqW2xhYmVsSWRdW2N1cnJlbnRMYWJlbFN0ZXBJbmRleElkXSA9IGRhdGE7XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZLCBvYmopO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXIobmVzdGVkSWQ6IHN0cmluZyA9IFwiXCIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbGFzdFN0ZXAgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9zdGVwQ291bnRlcjtcbiAgICAgICAgbGV0IG9iaiA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuZ2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXJEYXRhKG5lc3RlZElkKTtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImdldEN1cnJlbnRTdGVwVGltZXNDb3VudGVyIG9iaiBpcyBudWxsXCIpO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpc3QgPSBvYmouc3RlcENvdW50ZXJzIHx8IG9iai5sYXN0U3RlcEluZGV4cyB8fCBbXTtcbiAgICAgICAgbGV0IGxpc3RDb250YWluTGFzdFN0ZXAgPSBsaXN0LmZpbmQoKGl0ZW0pID0+IGl0ZW0gPT09IGxhc3RTdGVwKTtcbiAgICAgICAgaWYgKCFsaXN0Q29udGFpbkxhc3RTdGVwKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2gobGFzdFN0ZXApO1xuICAgICAgICAgICAgZGVsZXRlIG9iai5sYXN0U3RlcEluZGV4cztcbiAgICAgICAgICAgIG9iai5zdGVwQ291bnRlcnMgPSBsaXN0O1xuICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5zZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlckRhdGEobmVzdGVkSWQsIG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3QubGVuZ3RoO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UmFuZG9tTnVtYmVyKFxuICAgICAgICBtaW46IG51bWJlcixcbiAgICAgICAgbWF4OiBudW1iZXIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIG9uY2VPbmx5PzogYm9vbGVhbjtcbiAgICAgICAgICAgIG5lc3RlZElkPzogc3RyaW5nO1xuICAgICAgICB9ID0ge30sXG4gICAgKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IG5lc3RlZElkID0gb3B0aW9ucy5uZXN0ZWRJZCB8fCBcIlwiO1xuICAgICAgICBsZXQgb25jZW9ubHkgPSBvcHRpb25zLm9uY2VPbmx5IHx8IGZhbHNlO1xuICAgICAgICBpZiAob25jZW9ubHkpIHtcbiAgICAgICAgICAgIGxldCBvYmogPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmdldEN1cnJlbnRTdGVwVGltZXNDb3VudGVyRGF0YShuZXN0ZWRJZCk7XG4gICAgICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXNlZFJhbmRvbU51bWJlcnMgPSBvYmoudXNlZFJhbmRvbU51bWJlcnMgfHwge307XG4gICAgICAgICAgICAvLyBnZXQgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggYW5kIG5vdCBpbiB0aGUgdXNlZFJhbmRvbU51bWJlcnMsIGlmIGFsbCBudW1iZXJzIGFyZSBpbiB0aGUgdXNlZFJhbmRvbU51bWJlcnMsIHJldHVybiBudWxsXG4gICAgICAgICAgICBsZXQgYWxsTnVtYmVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG1heCAtIG1pbiArIDEgfSwgKF8sIGkpID0+IGkgKyBtaW4pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT4gIXVzZWRSYW5kb21OdW1iZXJzW2Ake21pbn0tJHttYXh9YF0/LmluY2x1ZGVzKGl0ZW0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChhbGxOdW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGxOdW1iZXJzLmxlbmd0aCk7XG4gICAgICAgICAgICBsZXQgcmFuZG9tTnVtYmVyID0gYWxsTnVtYmVyc1tyYW5kb21JbmRleF07XG4gICAgICAgICAgICBpZiAoIXVzZWRSYW5kb21OdW1iZXJzW2Ake21pbn0tJHttYXh9YF0pIHtcbiAgICAgICAgICAgICAgICB1c2VkUmFuZG9tTnVtYmVyc1tgJHttaW59LSR7bWF4fWBdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1c2VkUmFuZG9tTnVtYmVyc1tgJHttaW59LSR7bWF4fWBdLnB1c2gocmFuZG9tTnVtYmVyKTtcbiAgICAgICAgICAgIG9iai51c2VkUmFuZG9tTnVtYmVycyA9IHVzZWRSYW5kb21OdW1iZXJzO1xuICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5zZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlckRhdGEobmVzdGVkSWQsIG9iaik7XG4gICAgICAgICAgICByZXR1cm4gcmFuZG9tTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xuICAgIH1cbiAgICBzdGF0aWMgcmVzZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlcihuZXN0ZWRJZDogc3RyaW5nID0gXCJcIikge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsU3RlcEluZGV4ID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXg7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXhJZCA9IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCArIG5lc3RlZElkO1xuICAgICAgICBsZXQgbGFiZWxJZCA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQ7XG4gICAgICAgIGlmICghbGFiZWxJZCB8fCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcImN1cnJlbnRMYWJlbElkIG9yIGN1cnJlbnRMYWJlbFN0ZXBJbmRleCBpcyBudWxsXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvYmogPVxuICAgICAgICAgICAgR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXJNZW1vdHk+KFxuICAgICAgICAgICAgICAgIFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZLFxuICAgICAgICAgICAgKSB8fCB7fTtcbiAgICAgICAgaWYgKCFvYmpbbGFiZWxJZF0pIHtcbiAgICAgICAgICAgIG9ialtsYWJlbElkXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIG9ialtsYWJlbElkXVtjdXJyZW50TGFiZWxTdGVwSW5kZXhJZF0gPSB7IHN0ZXBDb3VudGVyczogW10sIHN0ZXBTaGExOiBcIlwiIH07XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9TVEVQX1RJTUVTX0NPVU5URVJfS0VZLCBvYmopO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBpcyBhIGxpc3Qgb2YgYWxsIGNob2ljZXMgbWFkZSBieSB0aGUgcGxheWVyIGR1cmluZyB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIHN0ZXBzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgYWxsQ2hvaWNlc01hZGUoKSB7XG4gICAgICAgIHJldHVybiBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxDaG9pY2VzTWFkZVR5cGVbXT4oU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5BTExfQ0hPSUNFU19NQURFX0tFWSkgfHwgW107XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgYWxsQ2hvaWNlc01hZGUodmFsdWU6IENob2ljZXNNYWRlVHlwZVtdKSB7XG4gICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQUxMX0NIT0lDRVNfTUFERV9LRVksIHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIF9zdGVwQ291bnRlcjogbnVtYmVyID0gMDtcbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZSB0aGUgbGFzdCBzdGVwIGluZGV4IHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgc3RlcHMuXG4gICAgICovXG4gICAgc3RhdGljIGluY3JlYXNlU3RlcENvdW50ZXIoKSB7XG4gICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX3N0ZXBDb3VudGVyKys7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9vcGVuZWRMYWJlbHM6IE9wZW5lZExhYmVsW10gPSBbXTtcbiAgICBzdGF0aWMgZ2V0IG9wZW5lZExhYmVscygpOiBPcGVuZWRMYWJlbFtdIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscyk7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgb3BlbmVkTGFiZWxzKHZhbHVlOiBPcGVuZWRMYWJlbFtdKSB7XG4gICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscyA9IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KHZhbHVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgX29yaWdpbmFsT3BlbmVkTGFiZWxzOiBPcGVuZWRMYWJlbFtdID0gW107XG4gICAgc3RhdGljIGdldCBvcmlnaW5hbE9wZW5lZExhYmVscygpOiBPcGVuZWRMYWJlbFtdIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29yaWdpbmFsT3BlbmVkTGFiZWxzKTtcbiAgICB9XG4gICAgc3RhdGljIHNldCBvcmlnaW5hbE9wZW5lZExhYmVscyh2YWx1ZTogT3BlbmVkTGFiZWxbXSkge1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vcmlnaW5hbE9wZW5lZExhYmVscyA9IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBfY3VycmVudExhYmVsKCk6IExhYmVsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWdpc3RlcmVkTGFiZWxzLmdldChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbElkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBjdXJyZW50TGFiZWxJZCBpcyB0aGUgY3VycmVudCBsYWJlbCBpZCB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIHN0ZXBzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgY3VycmVudExhYmVsSWQoKTogTGFiZWxJZFR5cGUgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzW05hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgY3VycmVudExhYmVsU3RlcEluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzW05hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmN1cnJlbnRTdGVwSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyogRWRpdCBIaXN0b3J5IE1ldGhvZHMgKi9cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxhYmVsIHRvIHRoZSBoaXN0b3J5LlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gYWRkIHRvIHRoZSBoaXN0b3J5LlxuICAgICAqIEBwYXJhbSBzdGVwSW5kZXggVGhlIHN0ZXAgaW5kZXggb2YgdGhlIGxhYmVsLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRMYWJlbEhpc3RvcnkobGFiZWw6IExhYmVsSWRUeXBlLCBzdGVwSW5kZXg6IG51bWJlcikge1xuICAgICAgICBsZXQgYWxsT3BlbmVkTGFiZWxzID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxPcGVuZWRMYWJlbHM7XG4gICAgICAgIGxldCBvbGRTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/LmJpZ2dlc3RTdGVwIHx8IDA7XG4gICAgICAgIGxldCBvcGVuQ291bnQgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/Lm9wZW5Db3VudCB8fCAwO1xuICAgICAgICBpZiAoIW9sZFN0ZXBJbmRleCB8fCBvbGRTdGVwSW5kZXggPCBzdGVwSW5kZXgpIHtcbiAgICAgICAgICAgIGFsbE9wZW5lZExhYmVsc1tsYWJlbF0gPSB7IGJpZ2dlc3RTdGVwOiBzdGVwSW5kZXgsIG9wZW5Db3VudDogb3BlbkNvdW50IH07XG4gICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVscyA9IGFsbE9wZW5lZExhYmVscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYWRkQ2hvaWNlc01hZGUobGFiZWw6IExhYmVsSWRUeXBlLCBzdGVwSW5kZXg6IG51bWJlciwgc3RlcFNoYTogc3RyaW5nLCBjaG9pY2VNYWRlOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGFsbENob2ljZXNNYWRlID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxDaG9pY2VzTWFkZTtcbiAgICAgICAgbGV0IGFscmVkeU1hZGUgPSBhbGxDaG9pY2VzTWFkZS5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICBpdGVtLmxhYmVsSWQgPT09IGxhYmVsICYmXG4gICAgICAgICAgICAgICAgaXRlbS5zdGVwSW5kZXggPT09IHN0ZXBJbmRleCAmJlxuICAgICAgICAgICAgICAgIGl0ZW0uY2hvaWNlSW5kZXggPT09IGNob2ljZU1hZGUgJiZcbiAgICAgICAgICAgICAgICBpdGVtLnN0ZXBTaGExID09PSBzdGVwU2hhLFxuICAgICAgICApO1xuICAgICAgICBpZiAoYWxyZWR5TWFkZSA8IDApIHtcbiAgICAgICAgICAgIGFsbENob2ljZXNNYWRlLnB1c2goe1xuICAgICAgICAgICAgICAgIGxhYmVsSWQ6IGxhYmVsLFxuICAgICAgICAgICAgICAgIHN0ZXBJbmRleDogc3RlcEluZGV4LFxuICAgICAgICAgICAgICAgIGNob2ljZUluZGV4OiBjaG9pY2VNYWRlLFxuICAgICAgICAgICAgICAgIHN0ZXBTaGExOiBzdGVwU2hhLFxuICAgICAgICAgICAgICAgIG1hZGVUaW1lczogMSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxsQ2hvaWNlc01hZGVbYWxyZWR5TWFkZV0ubWFkZVRpbWVzKys7XG4gICAgICAgIH1cbiAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxDaG9pY2VzTWFkZSA9IGFsbENob2ljZXNNYWRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYWJlbCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIGFkZCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKi9cbiAgICBzdGF0aWMgcHVzaE5ld0xhYmVsKGxhYmVsOiBMYWJlbElkVHlwZSkge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsID0gUmVnaXN0ZXJlZExhYmVscy5nZXQobGFiZWwpO1xuICAgICAgICBpZiAoIWN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcInVucmVnaXN0ZXJlZF9lbGVtZW50XCIsIGBMYWJlbCAke2xhYmVsfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vcGVuZWRMYWJlbHMucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICBjdXJyZW50U3RlcEluZGV4OiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGFsbE9wZW5lZExhYmVscyA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuYWxsT3BlbmVkTGFiZWxzO1xuICAgICAgICBsZXQgYmlnZ2VzdFN0ZXAgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/LmJpZ2dlc3RTdGVwIHx8IDA7XG4gICAgICAgIGxldCBvcGVuQ291bnQgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVsc1tsYWJlbF0/Lm9wZW5Db3VudCB8fCAwO1xuICAgICAgICBhbGxPcGVuZWRMYWJlbHNbbGFiZWxdID0geyBiaWdnZXN0U3RlcDogYmlnZ2VzdFN0ZXAsIG9wZW5Db3VudDogb3BlbkNvdW50ICsgMSB9O1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmFsbE9wZW5lZExhYmVscyA9IGFsbE9wZW5lZExhYmVscztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5jcmVhc2UgdGhlIGN1cnJlbnQgc3RlcCBpbmRleCBvZiB0aGUgY3VycmVudCBsYWJlbC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW5jcmVhc2VDdXJyZW50U3RlcEluZGV4KCkge1xuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb3BlbmVkTGFiZWxzW05hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVscy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29wZW5lZExhYmVsc1tOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vcGVuZWRMYWJlbHMubGVuZ3RoIC0gMV0gPSB7XG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBjdXJyZW50U3RlcEluZGV4OiBpdGVtLmN1cnJlbnRTdGVwSW5kZXggKyAxLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vblN0ZXBTdGFydD86IChzdGVwSWQ6IG51bWJlciwgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55PikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgc3RhdGljIHNldCBvblN0ZXBTdGFydCh2YWx1ZTogKHN0ZXBJZDogbnVtYmVyLCBsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnk+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikge1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLl9vblN0ZXBTdGFydCA9IHZhbHVlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IG9uU3RlcFN0YXJ0KCk6ICgoc3RlcElkOiBudW1iZXIsIGxhYmVsOiBMYWJlbEFic3RyYWN0PGFueT4pID0+IFByb21pc2U8dm9pZFtdPikgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHN0ZXBJZDogbnVtYmVyLCBsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnk+KSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzOiAoUHJvbWlzZTx2b2lkPiB8IHZvaWQpW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9uTG9hZGluZ0xhYmVsICYmIHN0ZXBJZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub25Mb2FkaW5nTGFiZWwoc3RlcElkLCBsYWJlbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuX29uU3RlcFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fb25TdGVwU3RhcnQoc3RlcElkLCBsYWJlbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHJlcyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXRpYyBvbkxvYWRpbmdMYWJlbD86IChzdGVwSWQ6IG51bWJlciwgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55PikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgc3RhdGljIG9uU3RlcEVuZD86IChzdGVwSWQ6IG51bWJlciwgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55PikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBDaGFyYWN0ZXJJbnRlcmZhY2UsIERpYWxvZ3VlSW50ZXJmYWNlIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12blwiO1xuaW1wb3J0IHsgR2FtZVVuaWZpZXIsIFBpeGlFcnJvciB9IGZyb20gXCJAZHJpbmNzL3BpeGktdm4vY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlRWxlbWVudFR5cGUgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUyB9IGZyb20gXCIuLi9zdG9yYWdlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi91dGlscy9sb2ctdXRpbGl0eVwiO1xuaW1wb3J0IExhYmVsQWJzdHJhY3QgZnJvbSBcIi4vY2xhc3Nlcy9MYWJlbEFic3RyYWN0XCI7XG5pbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHNcIjtcbmltcG9ydCB7IFN0b3JlZERpYWxvZ3VlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9EaWFsb2d1ZUludGVyZmFjZVwiO1xuaW1wb3J0IEhpc3RvcnlTdGVwLCB7IEFkZGl0aW9uYWxTaGFTcGV0c0VudW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0hpc3RvcnlTdGVwXCI7XG5pbXBvcnQgTmFycmF0aW9uR2FtZVN0YXRlIGZyb20gXCIuL2ludGVyZmFjZXMvTmFycmF0aW9uR2FtZVN0YXRlXCI7XG5pbXBvcnQgTmFycmF0aW9uTWFuYWdlckludGVyZmFjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL05hcnJhdGlvbk1hbmFnZXJJbnRlcmZhY2VcIjtcbmltcG9ydCBTdG9yZWRDaG9pY2VJbnRlcmZhY2UsIHsgU3RvcmVkSW5kZXhlZENob2ljZUludGVyZmFjZSB9IGZyb20gXCIuL2ludGVyZmFjZXMvU3RvcmVkQ2hvaWNlSW50ZXJmYWNlXCI7XG5pbXBvcnQgTmFycmF0aW9uTWFuYWdlclN0YXRpYyBmcm9tIFwiLi9OYXJyYXRpb25NYW5hZ2VyU3RhdGljXCI7XG5pbXBvcnQgQ2hvaWNlc01hZGVUeXBlIGZyb20gXCIuL3R5cGVzL0Nob2ljZXNNYWRlVHlwZVwiO1xuaW1wb3J0IHsgSW5wdXRJbmZvIH0gZnJvbSBcIi4vdHlwZXMvSW5wdXRJbmZvXCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuL3R5cGVzL0xhYmVsSWRUeXBlXCI7XG5pbXBvcnQgeyBTdGVwTGFiZWxQcm9wc1R5cGUsIFN0ZXBMYWJlbFJlc3VsdFR5cGUgfSBmcm9tIFwiLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyBhIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgc3RlcHMgYW5kIGxhYmVscyBvZiB0aGUgZ2FtZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmFycmF0aW9uTWFuYWdlciBpbXBsZW1lbnRzIE5hcnJhdGlvbk1hbmFnZXJJbnRlcmZhY2Uge1xuICAgIGdldCBjdXJyZW50U3RlcFRpbWVzQ291bnRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5nZXRDdXJyZW50U3RlcFRpbWVzQ291bnRlcigpO1xuICAgIH1cbiAgICBzZXQgY3VycmVudFN0ZXBUaW1lc0NvdW50ZXIoXzogMCkge1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLnJlc2V0Q3VycmVudFN0ZXBUaW1lc0NvdW50ZXIoKTtcbiAgICB9XG4gICAgZ2V0UmFuZG9tTnVtYmVyKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgb3B0aW9uczogeyBvbmNlT25seT86IGJvb2xlYW4gfSA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuZ2V0UmFuZG9tTnVtYmVyKG1pbiwgbWF4LCBvcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0IHN0ZXBDb3VudGVyKCkge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXI7XG4gICAgfVxuICAgIGdldCBvcGVuZWRMYWJlbHMoKSB7XG4gICAgICAgIHJldHVybiBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRMYWJlbCgpOiBMYWJlbEFic3RyYWN0PGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fY3VycmVudExhYmVsO1xuICAgIH1cblxuICAgIC8qIEVkaXQgSGlzdG9yeSBNZXRob2RzICovXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYWJlbCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKiBAcGFyYW0gc3RlcFNoYSBUaGUgc2hhMSBvZiB0aGUgc3RlcC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZFN0ZXBIaXN0b3J5KFxuICAgICAgICBzdGVwU2hhOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNob2ljZU1hZGU/OiBudW1iZXI7XG4gICAgICAgICAgICBpZ25vcmVTYW1lU3RlcD86IGJvb2xlYW47XG4gICAgICAgIH0gPSB7fSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBjaG9pY2VNYWRlLCBpZ25vcmVTYW1lU3RlcCB9ID0gb3B0aW9ucztcbiAgICAgICAgbGV0IGRpYWxvZ3VlOiBTdG9yZWREaWFsb2d1ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNob2ljZXM6IFN0b3JlZENob2ljZUludGVyZmFjZVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaW5wdXRWYWx1ZTogU3RvcmFnZUVsZW1lbnRUeXBlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaXNHbHVlZCA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuTEFTVF9TVEVQX0dMVUVEKSA9PT0gdGhpcy5zdGVwQ291bnRlcjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8bnVtYmVyPihTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfRElBTE9HVUVfQURERURfSU5fU1RFUF9NRU1PUllfS0VZKSA9PT1cbiAgICAgICAgICAgIHRoaXMuc3RlcENvdW50ZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkaWFsb2d1ZSA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPFN0b3JlZERpYWxvZ3VlPihcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8bnVtYmVyPihTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfTUVOVV9PUFRJT05TX0FEREVEX0lOX1NURVBfTUVNT1JZX0tFWSkgPT09XG4gICAgICAgICAgICB0aGlzLnN0ZXBDb3VudGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgY2hvaWNlcyA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPGFueT4oXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX01FTlVfT1BUSU9OU19NRU1PUllfS0VZLFxuICAgICAgICAgICAgKSBhcyBTdG9yZWRDaG9pY2VJbnRlcmZhY2VbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxTdG9yYWdlRWxlbWVudFR5cGU+KFxuICAgICAgICAgICAgICAgIFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuTEFTVF9JTlBVVF9BRERFRF9JTl9TVEVQX01FTU9SWV9LRVksXG4gICAgICAgICAgICApID09PSB0aGlzLnN0ZXBDb3VudGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9WQUxVRV9NRU1PUllfS0VZKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVuZWRMYWJlbHMgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICAgICAgbGV0IGhpc3RvcnlJbmZvOiBPbWl0PEhpc3RvcnlTdGVwLCBcImRpZmZcIj4gPSB7XG4gICAgICAgICAgICBjdXJyZW50TGFiZWw6IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQsXG4gICAgICAgICAgICBkaWFsb2d1ZTogZGlhbG9ndWUsXG4gICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgc3RlcFNoYTE6IHN0ZXBTaGEsXG4gICAgICAgICAgICBpbmRleDogdGhpcy5zdGVwQ291bnRlcixcbiAgICAgICAgICAgIGxhYmVsU3RlcEluZGV4OiBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleCxcbiAgICAgICAgICAgIGNob2ljZUluZGV4TWFkZTogY2hvaWNlTWFkZSxcbiAgICAgICAgICAgIGlucHV0VmFsdWU6IGlucHV0VmFsdWUsXG4gICAgICAgICAgICBhbHJlYWR5TWFkZUNob2ljZXM6IHRoaXMuYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXMsXG4gICAgICAgICAgICBpc0dsdWVkOiBpc0dsdWVkLFxuICAgICAgICAgICAgb3BlbmVkTGFiZWxzOiBvcGVuZWRMYWJlbHMsXG4gICAgICAgIH07XG4gICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub3JpZ2luYWxPcGVuZWRMYWJlbHMgPSBvcGVuZWRMYWJlbHM7XG4gICAgICAgIEdhbWVVbmlmaWVyLmFkZEhpc3RvcnlJdGVtKGhpc3RvcnlJbmZvLCB7IGlnbm9yZVNhbWVTdGVwIH0pO1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmxhc3RIaXN0b3J5U3RlcCA9IGhpc3RvcnlJbmZvO1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmluY3JlYXNlU3RlcENvdW50ZXIoKTtcbiAgICB9XG4gICAgY2xvc2VDdXJyZW50TGFiZWwoKSB7XG4gICAgICAgIGlmICghTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxJZCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJObyBsYWJlbCB0byBjbG9zZVwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudExhYmVsKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJjdXJyZW50TGFiZWwgbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVuZWRMYWJlbHMgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICAgICAgb3BlbmVkTGFiZWxzLnBvcCgpO1xuICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscyA9IG9wZW5lZExhYmVscztcbiAgICAgICAgR2FtZVVuaWZpZXIub25MYWJlbENsb3NpbmcodGhpcy5vcGVuZWRMYWJlbHMubGVuZ3RoKTtcbiAgICB9XG4gICAgY2xvc2VBbGxMYWJlbHMoKSB7XG4gICAgICAgIHdoaWxlIChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQ3VycmVudExhYmVsKCk7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5vbkxhYmVsQ2xvc2luZyh0aGlzLm9wZW5lZExhYmVscy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBpc0xhYmVsQWxyZWFkeUNvbXBsZXRlZChsYWJlbDogTGFiZWxJZFR5cGUgfCBMYWJlbEFic3RyYWN0PGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGxhYmVsSWQ6IExhYmVsSWRUeXBlO1xuICAgICAgICBpZiAodHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWwuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsbE9wZW5lZExhYmVscyA9IE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuYWxsT3BlbmVkTGFiZWxzO1xuICAgICAgICBsZXQgbGFzdFN0ZXAgPSBhbGxPcGVuZWRMYWJlbHNbbGFiZWxJZF0/LmJpZ2dlc3RTdGVwIHx8IDA7XG4gICAgICAgIGlmIChsYXN0U3RlcCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRMYWJlbCA9IFJlZ2lzdGVyZWRMYWJlbHMuZ2V0KGxhYmVsSWQpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50TGFiZWwuc3RlcENvdW50IDw9IGxhc3RTdGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXQgYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXNPYmooKTogQ2hvaWNlc01hZGVUeXBlW10gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsU3RlcEluZGV4ID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXg7XG4gICAgICAgIGxldCBjdXJyZW50TGFiZWwgPSB0aGlzLmN1cnJlbnRMYWJlbDtcbiAgICAgICAgaWYgKGN1cnJlbnRMYWJlbFN0ZXBJbmRleCA9PT0gbnVsbCB8fCAhY3VycmVudExhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0ZXBTaGEgPSBjdXJyZW50TGFiZWwuZ2V0U3RlcFNoYShjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICBpZiAoIXN0ZXBTaGEpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwic3RlcFNoYSBub3QgZm91bmQsIHNldHRpbmcgdG8gRVJST1JcIik7XG4gICAgICAgICAgICBzdGVwU2hhID0gQWRkaXRpb25hbFNoYVNwZXRzRW51bS5FUlJPUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxDaG9pY2VzTWFkZS5maWx0ZXIoKGNob2ljZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBjaG9pY2UubGFiZWxJZCA9PT0gY3VycmVudExhYmVsPy5pZCAmJlxuICAgICAgICAgICAgICAgIGNob2ljZS5zdGVwSW5kZXggPT09IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCAmJlxuICAgICAgICAgICAgICAgIGNob2ljZS5zdGVwU2hhMSA9PT0gc3RlcFNoYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBhbHJlYWR5Q3VycmVudFN0ZXBNYWRlQ2hvaWNlcygpOiBudW1iZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFscmVhZHlDdXJyZW50U3RlcE1hZGVDaG9pY2VzT2JqPy5tYXAoKGNob2ljZSkgPT4gY2hvaWNlLmNob2ljZUluZGV4KTtcbiAgICB9XG4gICAgZ2V0IGlzQ3VycmVudFN0ZXBBbHJlYWR5T3BlbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudExhYmVsID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxJZDtcbiAgICAgICAgaWYgKGN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgbGV0IGxhc3RTdGVwID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxPcGVuZWRMYWJlbHNbY3VycmVudExhYmVsXT8ub3BlbkNvdW50IHx8IDA7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXggJiZcbiAgICAgICAgICAgICAgICBsYXN0U3RlcCA+PSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VGltZXNMYWJlbE9wZW5lZChsYWJlbDogTGFiZWxJZFR5cGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hbGxPcGVuZWRMYWJlbHNbbGFiZWxdPy5vcGVuQ291bnQgfHwgMDtcbiAgICB9XG4gICAgcHVibGljIGdldFRpbWVzQ2hvaWNlTWFkZShpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXNPYmo/LmZpbmQoKGNob2ljZSkgPT4gY2hvaWNlLmNob2ljZUluZGV4ID09PSBpbmRleCk/Lm1hZGVUaW1lcyB8fCAwO1xuICAgIH1cbiAgICBhZGRDdXJyZW50U3RlcFRvSGlzdG9yeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRTdGVwSGlzdG9yeShBZGRpdGlvbmFsU2hhU3BldHNFbnVtLkRFVkVMT1BFUiwgeyBpZ25vcmVTYW1lU3RlcDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiBSdW4gTWV0aG9kcyAqL1xuXG4gICAgcHJpdmF0ZSBnZXRDYW5Db250aW51ZShvcHRpb25zPzoge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdHJ1ZSwgc2hvdyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUuXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBzaG93V2Fybj86IGJvb2xlYW47XG4gICAgfSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2hvd1dhcm4gPSBvcHRpb25zPy5zaG93V2FybiB8fCBmYWxzZTtcbiAgICAgICAgbGV0IGNob2ljZU1lbnVPcHRpb25zID0gdGhpcy5jaG9pY2VzO1xuICAgICAgICBpZiAoY2hvaWNlTWVudU9wdGlvbnMgJiYgY2hvaWNlTWVudU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2hvd1dhcm4gJiYgbG9nZ2VyLndhcm4oXCJUaGUgcGxheWVyIG11c3QgbWFrZSBhIGNob2ljZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkSW5wdXQpIHtcbiAgICAgICAgICAgIHNob3dXYXJuICYmIGxvZ2dlci53YXJuKFwiVGhlIHBsYXllciBtdXN0IGVudGVyIGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBjYW5Db250aW51ZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEdhbWVVbmlmaWVyLnJ1bm5pbmdTdGVwc0NvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FuQ29udGludWUoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBvblN0ZXBTdGFydChsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnksIGFueT4sIHN0ZXBJZDogbnVtYmVyKSB7XG4gICAgICAgIGxldCByZXM6ICh2b2lkIHwgUHJvbWlzZTx2b2lkPiB8IFByb21pc2U8dm9pZFtdPilbXSA9IFtdO1xuICAgICAgICBpZiAobGFiZWwub25TdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGxhYmVsLm9uU3RlcFN0YXJ0KHN0ZXBJZCwgbGFiZWwpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vblN0ZXBTdGFydCkge1xuICAgICAgICAgICAgcmVzLnB1c2goTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vblN0ZXBTdGFydChzdGVwSWQsIGxhYmVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHJlcyk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgb25TdGVwRW5kKGxhYmVsOiBMYWJlbEFic3RyYWN0PGFueSwgYW55Piwgc3RlcElkOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJlczogKHZvaWQgfCBQcm9taXNlPHZvaWQ+KVtdID0gW107XG4gICAgICAgIGlmIChsYWJlbC5vblN0ZXBFbmQpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGxhYmVsLm9uU3RlcEVuZChzdGVwSWQsIGxhYmVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub25TdGVwRW5kKSB7XG4gICAgICAgICAgICByZXMucHVzaChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9uU3RlcEVuZChzdGVwSWQsIGxhYmVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHJlcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjb250aW51ZShcbiAgICAgICAgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSxcbiAgICAgICAgb3B0aW9uczogeyBzdGVwcz86IG51bWJlcjsgcnVuTm93PzogYm9vbGVhbjsgY2hvaWNlTWFkZT86IG51bWJlciB9ID0ge30sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHsgcnVuTm93ID0gZmFsc2UsIHN0ZXBzID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3RlcHMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW2NvbnRpbnVlXSBUaGUgcGFyYW1ldGVyIHN0ZXBzIG11c3QgYmUgYSB2YWxpZCBmaW5pdGUgbnVtYmVyLCByZWNlaXZlZDogJHtzdGVwc31gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcHMgPD0gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFtjb250aW51ZV0gVGhlIHBhcmFtZXRlciBzdGVwcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLCByZWNlaXZlZDogJHtzdGVwc31gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bk5vdyAmJiAhdGhpcy5nZXRDYW5Db250aW51ZSh7IHNob3dXYXJuOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5Ob3cgJiYgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLmluY3JlYXNlQ29udGludWVSZXF1ZXN0KHN0ZXBzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcHMgPiAxKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5pbmNyZWFzZUNvbnRpbnVlUmVxdWVzdChzdGVwcyAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIEdhbWVVbmlmaWVyLnJ1bm5pbmdTdGVwc0NvdW50Kys7XG4gICAgICAgIGxldCByZXN1bHQ6IFN0ZXBMYWJlbFJlc3VsdFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBHYW1lVW5pZmllci5vblByZUNvbnRpbnVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmluY3JlYXNlQ3VycmVudFN0ZXBJbmRleCgpO1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5DdXJyZW50U3RlcChwcm9wcywgb3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGNvbnRpbnVpbmdcIiwgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQtLTtcbiAgICAgICAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLmFmdGVyUnVuQ3VycmVudFN0ZXAocHJvcHMpKSB8fCByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBhZnRlclJ1bkN1cnJlbnRTdGVwKHByb3BzOiBTdGVwTGFiZWxQcm9wc1R5cGU8YW55Pikge1xuICAgICAgICBpZiAoR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgPT09IDAgJiYgR2FtZVVuaWZpZXIuY29udGludWVSZXF1ZXN0c0NvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgR2FtZVVuaWZpZXIucHJvY2Vzc05hdmlnYXRpb25SZXF1ZXN0cyhwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3BlbmVkTGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKEdhbWVVbmlmaWVyLm9uRW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEdhbWVVbmlmaWVyLm9uRW5kKHByb3BzLCB7IGxhYmVsSWQ6IFwiZW5kXCIgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUaGUgZW5kIG9mIHRoZSBnYW1lIGlzIG5vdCBtYW5hZ2VkLCBzbyB0aGUgZ2FtZSBpcyBibG9ja2VkLiBSZWFkIHRoaXMgZG9jdW1lbnRhdGlvbiB0byBrbm93IGhvdyB0byBtYW5hZ2UgdGhlIGVuZCBvZiB0aGUgZ2FtZTogaHR0cHM6Ly9waXhpLXZuLndlYi5hcHAvc3RhcnQvb3RoZXItbmFycmF0aXZlLWZlYXR1cmVzLmh0bWwjaG93LW1hbmFnZS10aGUtZW5kLW9mLXRoZS1nYW1lXCIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSBjdXJyZW50IHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgaGlzdG9yeS5cbiAgICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIHN0ZXAuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAgICogQHJldHVybnMgU3RlcExhYmVsUmVzdWx0VHlwZSBvciB1bmRlZmluZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBydW5DdXJyZW50U3RlcDxUIGV4dGVuZHMge30+KFxuICAgICAgICBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlPFQ+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIHBsYXllci4gKFRoaXMgcGFyYW1zIGlzIHVzZWQgaW4gdGhlIGNob2ljZSBtZW51KVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjaG9pY2VNYWRlPzogbnVtYmVyO1xuICAgICAgICB9ID0ge30sXG4gICAgKTogUHJvbWlzZTxTdGVwTGFiZWxSZXN1bHRUeXBlPiB7XG4gICAgICAgIGNvbnN0IHsgY2hvaWNlTWFkZSB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMuY3VycmVudExhYmVsSWQpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50TGFiZWxTdGVwSW5kZXggPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGFiZWxTdGVwSW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJjdXJyZW50TGFiZWxTdGVwSW5kZXggaXMgbnVsbFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudExhYmVsID0gTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fY3VycmVudExhYmVsIGFzIExhYmVsQWJzdHJhY3Q8YW55LCBUPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghY3VycmVudExhYmVsKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudExhYmVsLnN0ZXBDb3VudCA+IGN1cnJlbnRMYWJlbFN0ZXBJbmRleCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25TdGVwU3RhcnQoY3VycmVudExhYmVsLCBjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgcnVubmluZyBvblN0ZXBTdGFydFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25TdGVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25TdGVwRXJyb3IoZSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSBjdXJyZW50TGFiZWwuZ2V0U3RlcEJ5SWQoY3VycmVudExhYmVsU3RlcEluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwic3RlcCBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXBTaGEgPSBjdXJyZW50TGFiZWwuZ2V0U3RlcFNoYShjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghc3RlcFNoYSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInN0ZXBTaGEgbm90IGZvdW5kLCBzZXR0aW5nIHRvIEVSUk9SXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdGVwU2hhID0gQWRkaXRpb25hbFNoYVNwZXRzRW51bS5FUlJPUjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgZXJyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHN0ZXAocHJvcHMsIHsgbGFiZWxJZDogY3VycmVudExhYmVsLmlkIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgcnVubmluZyBzdGVwXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICBlcnIgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaG9pY2VNZW51T3B0aW9ucyA9IHRoaXMuY2hvaWNlcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNob2ljZU1lbnVPcHRpb25zPy5sZW5ndGggPT09IDEgJiYgY2hvaWNlTWVudU9wdGlvbnNbMF0uYXV0b1NlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNob2ljZSA9IGNob2ljZU1lbnVPcHRpb25zWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWxlY3RDaG9pY2UoY2hvaWNlLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGF1dG8tc2VsZWN0aW5nIGNob2ljZVwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SGlzdG9yeVN0ZXAgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmxhc3RIaXN0b3J5U3RlcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNob2ljZU1hZGUgIT09IHVuZGVmaW5lZCAmJiBsYXN0SGlzdG9yeVN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBTaGEgPSBsYXN0SGlzdG9yeVN0ZXAuc3RlcFNoYTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBTaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcInN0ZXBTaGEgbm90IGZvdW5kLCBzZXR0aW5nIHRvIEVSUk9SXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBTaGEgPSBBZGRpdGlvbmFsU2hhU3BldHNFbnVtLkVSUk9SO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hZGRDaG9pY2VzTWFkZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SGlzdG9yeVN0ZXAuY3VycmVudExhYmVsIHx8IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgbGFzdEhpc3RvcnlTdGVwLmxhYmVsU3RlcEluZGV4ID09PSBcIm51bWJlclwiID8gbGFzdEhpc3RvcnlTdGVwLmxhYmVsU3RlcEluZGV4IDogLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEhpc3RvcnlTdGVwLnN0ZXBTaGExIHx8IEFkZGl0aW9uYWxTaGFTcGV0c0VudW0uRVJST1IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlTWFkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmNob2ljZU1hZGVUZW1wID0gY2hvaWNlTWFkZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFcnJvciBhZGRpbmcgY2hvaWNlIG1hZGUgdG8gaGlzdG9yeVwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCB0byBoaXN0b3J5IGlmIGlzIHRoZSBtYWluIHN0ZXAgKG5vdCBhIG5lc3RlZCBjYWxsL2p1bXApXG4gICAgICAgICAgICAgICAgICAgIGlmIChHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5hZGRMYWJlbEhpc3RvcnkoY3VycmVudExhYmVsLmlkLCBjdXJyZW50TGFiZWxTdGVwSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTdGVwSGlzdG9yeShzdGVwU2hhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VNYWRlOiBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmNob2ljZU1hZGVUZW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmNob2ljZU1hZGVUZW1wID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIkVycm9yIGFkZGluZyBzdGVwIHRvIGhpc3RvcnlcIiwgZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFiZWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLm9uU3RlcEVuZCh0aGlzLmN1cnJlbnRMYWJlbCwgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5jdXJyZW50TGFiZWxTdGVwSW5kZXggfHwgMCkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFcnJvciBydW5uaW5nIG9uU3RlcEVuZFwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyICYmIHRoaXMub25TdGVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vblN0ZXBFcnJvcihlcnIsIHByb3BzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcGVuZWRMYWJlbHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDdXJyZW50TGFiZWwoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250aW51ZShwcm9wcywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3BlbmVkTGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub3BlbmVkTGFiZWxzID0gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3BlbmVkTGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiY3VycmVudExhYmVsSWQgbm90IGZvdW5kXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYWxsPFQgZXh0ZW5kcyB7fSA9IHt9PihcbiAgICAgICAgbGFiZWw6IExhYmVsQWJzdHJhY3Q8YW55LCBUPiB8IExhYmVsSWRUeXBlLFxuICAgICAgICBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlPFQ+LFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBtYWRlIGJ5IHRoZSBwbGF5ZXIuIChUaGlzIHBhcmFtcyBpcyB1c2VkIGluIHRoZSBjaG9pY2UgbWVudSlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY2hvaWNlTWFkZT86IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICApOiBQcm9taXNlPFN0ZXBMYWJlbFJlc3VsdFR5cGU+IHtcbiAgICAgICAgY29uc3QgeyBjaG9pY2VNYWRlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBsZXQgbGFiZWxJZDogTGFiZWxJZFR5cGU7XG4gICAgICAgIGlmICh0eXBlb2YgbGFiZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxhYmVsSWQgPSBsYWJlbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsSWQgPSBsYWJlbC5pZDtcbiAgICAgICAgfVxuICAgICAgICBHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudCsrO1xuICAgICAgICBsZXQgcmVzdWx0OiBTdGVwTGFiZWxSZXN1bHRUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRlbXBMYWJlbCA9IFJlZ2lzdGVyZWRMYWJlbHMuZ2V0PExhYmVsQWJzdHJhY3Q8YW55LCBUPj4obGFiZWxJZCk7XG4gICAgICAgICAgICBpZiAoIXRlbXBMYWJlbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBQaXhpRXJyb3IoXCJ1bnJlZ2lzdGVyZWRfZWxlbWVudFwiLCBgTGFiZWwgJHtsYWJlbElkfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5wdXNoTmV3TGFiZWwodGVtcExhYmVsLmlkKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ3VycmVudFN0ZXA8VD4ocHJvcHMsIHsgY2hvaWNlTWFkZTogY2hvaWNlTWFkZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgY2FsbGluZyBsYWJlbFwiLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudC0tO1xuICAgICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IHRoaXMuYWZ0ZXJSdW5DdXJyZW50U3RlcChwcm9wcykpIHx8IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMganVtcDxUIGV4dGVuZHMge30+KFxuICAgICAgICBsYWJlbDogTGFiZWxBYnN0cmFjdDxhbnksIFQ+IHwgTGFiZWxJZFR5cGUsXG4gICAgICAgIHByb3BzOiBTdGVwTGFiZWxQcm9wc1R5cGU8VD4sXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIHBsYXllci4gKFRoaXMgcGFyYW1zIGlzIHVzZWQgaW4gdGhlIGNob2ljZSBtZW51KVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjaG9pY2VNYWRlPzogbnVtYmVyO1xuICAgICAgICB9LFxuICAgICk6IFByb21pc2U8U3RlcExhYmVsUmVzdWx0VHlwZT4ge1xuICAgICAgICBpZiAodGhpcy5zdGVwQ291bnRlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbChsYWJlbCwgcHJvcHMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5lZExhYmVscy5sZW5ndGggPiAwKSB0aGlzLmNsb3NlQ3VycmVudExhYmVsKCk7XG4gICAgICAgIGNvbnN0IHsgY2hvaWNlTWFkZSB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGxhYmVsSWQ6IExhYmVsSWRUeXBlO1xuICAgICAgICBpZiAodHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYWJlbElkID0gbGFiZWwuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQrKztcbiAgICAgICAgbGV0IHJlc3VsdDogU3RlcExhYmVsUmVzdWx0VHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB0ZW1wTGFiZWwgPSBSZWdpc3RlcmVkTGFiZWxzLmdldDxMYWJlbEFic3RyYWN0PGFueSwgVD4+KGxhYmVsSWQpO1xuICAgICAgICAgICAgaWYgKCF0ZW1wTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGl4aUVycm9yKFwidW5yZWdpc3RlcmVkX2VsZW1lbnRcIiwgYExhYmVsICR7bGFiZWxJZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMucHVzaE5ld0xhYmVsKHRlbXBMYWJlbC5pZCk7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkN1cnJlbnRTdGVwPFQ+KHByb3BzLCB7IGNob2ljZU1hZGU6IGNob2ljZU1hZGUgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGp1bXBpbmcgdG8gbGFiZWxcIiwgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQtLTtcbiAgICAgICAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLmFmdGVyUnVuQ3VycmVudFN0ZXAocHJvcHMpKSB8fCByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNlbGVjdENob2ljZTxUIGV4dGVuZHMge30+KFxuICAgICAgICBpdGVtOiBTdG9yZWRJbmRleGVkQ2hvaWNlSW50ZXJmYWNlLFxuICAgICAgICBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlPFQ+LFxuICAgICk6IFByb21pc2U8U3RlcExhYmVsUmVzdWx0VHlwZT4ge1xuICAgICAgICB0aGlzLmNob2ljZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImNhbGxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICB7IC4uLml0ZW0ucHJvcHMsIC4uLnByb3BzIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZU1hZGU6IGl0ZW0uY2hvaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuanVtcChcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5pdGVtLnByb3BzLCAuLi5wcm9wcyB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VNYWRlOiBpdGVtLmNob2ljZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIFwiY2xvc2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbG9zZUNob2ljZU1lbnUoaXRlbSwgeyAuLi5pdGVtLnByb3BzLCAuLi5wcm9wcyB9KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBUeXBlICR7dHlwZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcImludmFsaWRfdXNhZ2VcIiwgYFR5cGUgJHt0eXBlfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBwbGF5ZXIgaXMgaW4gYSBjaG9pY2UgbWVudSwgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGV4aXQgdG8gdGhlIGNob2ljZSBtZW51LlxuICAgICAqIEBwYXJhbSBjaG9pY2VcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcmV0dXJucyBTdGVwTGFiZWxSZXN1bHRUeXBlIG9yIHVuZGVmaW5lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBuYXJyYXRpb24uY2xvc2VDaG9pY2VNZW51KHlvdXJQYXJhbXMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAqICAgICBpZiAocmVzdWx0KSB7XG4gICAgICogICAgICAgICAvLyB5b3VyIGNvZGVcbiAgICAgKiAgICAgfVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNsb3NlQ2hvaWNlTWVudTxUIGV4dGVuZHMge30gPSB7fT4oXG4gICAgICAgIGNob2ljZTogU3RvcmVkSW5kZXhlZENob2ljZUludGVyZmFjZSxcbiAgICAgICAgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZTxUPixcbiAgICApOiBQcm9taXNlPFN0ZXBMYWJlbFJlc3VsdFR5cGU+IHtcbiAgICAgICAgaWYgKGNob2ljZS50eXBlICE9PSBcImNsb3NlXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZvciBjbG9zZUNob2ljZU1lbnUsIHRoZSB0eXBlIG11c3QgYmUgY2xvc2VcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGl4aUVycm9yKFwiaW52YWxpZF91c2FnZVwiLCBcIkZvciBjbG9zZUNob2ljZU1lbnUsIHRoZSB0eXBlIG11c3QgYmUgY2xvc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNob2ljZU1hZGU6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjaG9pY2UuY2hvaWNlSW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNob2ljZU1hZGUgPSBjaG9pY2UuY2hvaWNlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNob2ljZS5jbG9zZUN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUN1cnJlbnRMYWJlbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRpbnVlKHByb3BzLCB7IGNob2ljZU1hZGUgfSk7XG4gICAgfVxuXG4gICAgLyogR28gQmFjayAmIFJlZnJlc2ggTWV0aG9kcyAqL1xuXG4gICAgcHJpdmF0ZSBnZXQgb25TdGVwRXJyb3IoKTogKChlcnJvcjogYW55LCBwcm9wczogU3RlcExhYmVsUHJvcHNUeXBlKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gR2FtZVVuaWZpZXIub25FcnJvcjtcbiAgICAgICAgaWYgKCFvbkVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyAoZXJyb3I6IGFueSwgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgb25FcnJvcihcInN0ZXBcIiwgZXJyb3IsIHByb3BzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBpbiBvbkVycm9yIGhhbmRsZXJcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHByaXZhdGUgc2V0IG9uU3RlcEVycm9yKHZhbHVlOiAoZXJyb3I6IGFueSwgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSkgPT4gdm9pZCkge1xuICAgICAgICBHYW1lVW5pZmllci5vbkVycm9yID0gKHR5cGU6IHN0cmluZywgZXJyb3I6IGFueSwgcHJvcHM6IFN0ZXBMYWJlbFByb3BzVHlwZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlKGVycm9yLCBwcm9wcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaWFsb2d1ZSgpOlxuICAgICAgICB8IChQYXJ0aWFsPERpYWxvZ3VlSW50ZXJmYWNlPiAmIHtcbiAgICAgICAgICAgICAgdGV4dDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgICAgICAgIGNoYXJhY3Rlcj86IENoYXJhY3RlckludGVyZmFjZSB8IHN0cmluZztcbiAgICAgICAgICB9KVxuICAgICAgICB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ3VlID0gR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8U3RvcmVkRGlhbG9ndWU+KFxuICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0RJQUxPR1VFX01FTU9SWV9LRVksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZGlhbG9ndWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmRpYWxvZ3VlLFxuICAgICAgICAgICAgY2hhcmFjdGVyOiBkaWFsb2d1ZS5jaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICA/IEdhbWVVbmlmaWVyLmdldENoYXJhY3RlcihkaWFsb2d1ZS5jaGFyYWN0ZXIpIHx8IGRpYWxvZ3VlLmNoYXJhY3RlclxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGRpYWxvZ3VlKGRpYWxvZ3VlOiBEaWFsb2d1ZUludGVyZmFjZSB8IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkaWFsb2d1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGlhbG9ndWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheShkaWFsb2d1ZSkpIHtcbiAgICAgICAgICAgIGRpYWxvZ3VlID0geyB0ZXh0OiBkaWFsb2d1ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlhbG9nR2x1ZSkge1xuICAgICAgICAgICAgbGV0IGdsdWVEaWFsb2d1ZSA9IEdhbWVVbmlmaWVyLmdldFZhcmlhYmxlPFN0b3JlZERpYWxvZ3VlPihcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfRElBTE9HVUVfTUVNT1JZX0tFWSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZ2x1ZURpYWxvZ3VlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1RleHQgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShnbHVlRGlhbG9ndWUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGV4dCA9IFsuLi5nbHVlRGlhbG9ndWUudGV4dF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGV4dCA9IFtnbHVlRGlhbG9ndWUudGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpYWxvZ3VlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RleHQgPSBbLi4ubmV3VGV4dCwgLi4uZGlhbG9ndWUudGV4dF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGV4dCA9IFsuLi5uZXdUZXh0LCBkaWFsb2d1ZS50ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlhbG9ndWUudGV4dCA9IG5ld1RleHQ7XG4gICAgICAgICAgICAgICAgZGlhbG9ndWUuY2hhcmFjdGVyID0gZGlhbG9ndWUuY2hhcmFjdGVyIHx8IGdsdWVEaWFsb2d1ZS5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfU1RFUF9HTFVFRCwgdGhpcy5zdGVwQ291bnRlcik7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ0dsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIuc2V0VmFyaWFibGUoXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0RJQUxPR1VFX01FTU9SWV9LRVksXG4gICAgICAgICAgICAgICAgY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kaWFsb2d1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyOiB0eXBlb2YgZGlhbG9ndWUuY2hhcmFjdGVyID09PSBcInN0cmluZ1wiID8gZGlhbG9ndWUuY2hhcmFjdGVyIDogZGlhbG9ndWUuY2hhcmFjdGVyPy5pZCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfRElBTE9HVUVfQURERURfSU5fU1RFUF9NRU1PUllfS0VZLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RlcENvdW50ZXIsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJEaWFsb2d1ZUludGVyZmFjZSBjYW5ub3QgY29udGFpbiBmdW5jdGlvbnMgb3IgY2xhc3Nlc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBQaXhpRXJyb3IoXCJub3RfanNvbl9zZXJpYWxpemFibGVcIiwgXCJDaG9pY2VJbnRlcmZhY2UgY2Fubm90IGNvbnRhaW4gZnVuY3Rpb25zIG9yIGNsYXNzZXNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGdldCBjaG9pY2VzKCk6IFN0b3JlZEluZGV4ZWRDaG9pY2VJbnRlcmZhY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBkID0gR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGU8YW55PihcbiAgICAgICAgICAgIFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9NRU5VX09QVElPTlNfTUVNT1JZX0tFWSxcbiAgICAgICAgKSBhcyBTdG9yZWRDaG9pY2VJbnRlcmZhY2VbXTtcbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIGxldCBvbmx5SGF2ZU5vQ2hvaWNlOiBTdG9yZWRJbmRleGVkQ2hvaWNlSW50ZXJmYWNlW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBvcHRpb25zOiBTdG9yZWRJbmRleGVkQ2hvaWNlSW50ZXJmYWNlW10gPSBkLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgY2hvaWNlSW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBhbHJlYWR5Q2hvaWNlcyA9IHRoaXMuYWxyZWFkeUN1cnJlbnRTdGVwTWFkZUNob2ljZXM7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLm9uZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFscmVhZHlDaG9pY2VzICYmIGFscmVhZHlDaG9pY2VzLmluY2x1ZGVzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24ub25seUhhdmVOb0Nob2ljZSkge1xuICAgICAgICAgICAgICAgICAgICBvbmx5SGF2ZU5vQ2hvaWNlLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvbmx5SGF2ZU5vQ2hvaWNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RPcHRpb24gPSBvbmx5SGF2ZU5vQ2hvaWNlWzBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlyc3RPcHRpb25dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY2hvaWNlcyhvcHRpb25zOiBTdG9yZWRDaG9pY2VJbnRlcmZhY2VbXSB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLnNldFZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9NRU5VX09QVElPTlNfTUVNT1JZX0tFWSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgR2FtZVVuaWZpZXIuc2V0VmFyaWFibGUoXG4gICAgICAgICAgICAgICAgU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX01FTlVfT1BUSU9OU19NRU1PUllfS0VZLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50KG9wdGlvbnMpIGFzIGFueSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShcbiAgICAgICAgICAgICAgICBTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfTUVOVV9PUFRJT05TX0FEREVEX0lOX1NURVBfTUVNT1JZX0tFWSxcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBDb3VudGVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQ2hvaWNlSW50ZXJmYWNlIGNhbm5vdCBjb250YWluIGZ1bmN0aW9ucyBvciBjbGFzc2VzXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcIm5vdF9qc29uX3NlcmlhbGl6YWJsZVwiLCBcIkNob2ljZUludGVyZmFjZSBjYW5ub3QgY29udGFpbiBmdW5jdGlvbnMgb3IgY2xhc3Nlc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ0dsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBHYW1lVW5pZmllci5nZXRGbGFnKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQUREX05FWFRfRElBTE9HX1RFWFRfSU5UT19USEVfQ1VSUkVOVF9ESUFMT0dfRkxBR19LRVkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGRpYWxvZ0dsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgR2FtZVVuaWZpZXIuc2V0RmxhZyhTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkFERF9ORVhUX0RJQUxPR19URVhUX0lOVE9fVEhFX0NVUlJFTlRfRElBTE9HX0ZMQUdfS0VZLCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaW5wdXRWYWx1ZSgpOiBTdG9yYWdlRWxlbWVudFR5cGUge1xuICAgICAgICByZXR1cm4gR2FtZVVuaWZpZXIuZ2V0VmFyaWFibGUoU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0lOUFVUX1ZBTFVFX01FTU9SWV9LRVkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGlucHV0VmFsdWUodmFsdWU6IFN0b3JhZ2VFbGVtZW50VHlwZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUlucHV0UmVxdWVzdCgpO1xuICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfVkFMVUVfTUVNT1JZX0tFWSwgdmFsdWUpO1xuICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkxBU1RfSU5QVVRfQURERURfSU5fU1RFUF9NRU1PUllfS0VZLCB0aGlzLnN0ZXBDb3VudGVyKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBpc1JlcXVpcmVkSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxJbnB1dEluZm8+KFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9JTkZPX01FTU9SWV9LRVkpXG4gICAgICAgICAgICAgICAgPy5pc1JlcXVpcmVkIHx8IGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBHYW1lVW5pZmllci5nZXRWYXJpYWJsZTxJbnB1dEluZm8+KFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9JTkZPX01FTU9SWV9LRVkpPy50eXBlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVxdWVzdElucHV0KGluZm86IE9taXQ8SW5wdXRJbmZvLCBcImlzUmVxdWlyZWRcIj4sIGRlZmF1bHRWYWx1ZT86IFN0b3JhZ2VFbGVtZW50VHlwZSkge1xuICAgICAgICAoaW5mbyBhcyBJbnB1dEluZm8pLmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfSU5GT19NRU1PUllfS0VZLCBpbmZvKTtcbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5zZXRWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfVkFMVUVfTUVNT1JZX0tFWSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEdhbWVVbmlmaWVyLnJlbW92ZVZhcmlhYmxlKFNZU1RFTV9SRVNFUlZFRF9TVE9SQUdFX0tFWVMuQ1VSUkVOVF9JTlBVVF9WQUxVRV9NRU1PUllfS0VZKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgcmVtb3ZlSW5wdXRSZXF1ZXN0KCkge1xuICAgICAgICBHYW1lVW5pZmllci5yZW1vdmVWYXJpYWJsZShTWVNURU1fUkVTRVJWRURfU1RPUkFHRV9LRVlTLkNVUlJFTlRfSU5QVVRfSU5GT19NRU1PUllfS0VZKTtcbiAgICAgICAgR2FtZVVuaWZpZXIucmVtb3ZlVmFyaWFibGUoU1lTVEVNX1JFU0VSVkVEX1NUT1JBR0VfS0VZUy5DVVJSRU5UX0lOUFVUX1ZBTFVFX01FTU9SWV9LRVkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vcGVuZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXIgPSAwO1xuICAgIH1cblxuICAgIC8qIEV4cG9ydCBhbmQgSW1wb3J0IE1ldGhvZHMgKi9cblxuICAgIHB1YmxpYyBleHBvcnQoKTogTmFycmF0aW9uR2FtZVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wZW5lZExhYmVsczogY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vcGVuZWRMYWJlbHMpLFxuICAgICAgICAgICAgc3RlcENvdW50ZXI6IHRoaXMuc3RlcENvdW50ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvbkxvYWRpbmdMYWJlbChjdXJyZW50TGFiZWxTdGVwSW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5vcGVuZWRMYWJlbHMubWFwKGFzeW5jIChsYWJlbEluZm8pID0+IHtcbiAgICAgICAgICAgIGxldCByZXM6ICh2b2lkIHwgUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gUmVnaXN0ZXJlZExhYmVscy5nZXQobGFiZWxJbmZvLmxhYmVsKTtcbiAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC5vbkxvYWRpbmdMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChsYWJlbC5vbkxvYWRpbmdMYWJlbChjdXJyZW50TGFiZWxTdGVwSW5kZXgsIGxhYmVsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9uTG9hZGluZ0xhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub25Mb2FkaW5nTGFiZWwoY3VycmVudExhYmVsU3RlcEluZGV4LCBsYWJlbCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2UpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVzdG9yZShkYXRhOiBvYmplY3QsIGxhc3RIaXN0b3J5U3RlcDogT21pdDxIaXN0b3J5U3RlcCwgXCJkaWZmXCI+IHwgbnVsbCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmxhc3RIaXN0b3J5U3RlcCA9IGxhc3RIaXN0b3J5U3RlcDtcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwib3BlbmVkTGFiZWxzXCIpKSB7XG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5vcGVuZWRMYWJlbHMgPSAoZGF0YSBhcyBOYXJyYXRpb25HYW1lU3RhdGUpW1wib3BlbmVkTGFiZWxzXCJdO1xuICAgICAgICAgICAgICAgIE5hcnJhdGlvbk1hbmFnZXJTdGF0aWMub3JpZ2luYWxPcGVuZWRMYWJlbHMgPSBOYXJyYXRpb25NYW5hZ2VyU3RhdGljLm9wZW5lZExhYmVscztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDb3VsZCBub3QgaW1wb3J0IG9wZW5lZExhYmVscyBkYXRhLCBzbyB3aWxsIGJlIGlnbm9yZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInN0ZXBDb3VudGVyXCIpKSB7XG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXIgPSAoZGF0YSBhcyBOYXJyYXRpb25HYW1lU3RhdGUpW1wic3RlcENvdW50ZXJcIl07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJsYXN0U3RlcEluZGV4XCIpKSB7XG4gICAgICAgICAgICAgICAgTmFycmF0aW9uTWFuYWdlclN0YXRpYy5fc3RlcENvdW50ZXIgPSAoZGF0YSBhcyBOYXJyYXRpb25HYW1lU3RhdGUpW1wibGFzdFN0ZXBJbmRleFwiXSBhcyBudW1iZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ291bGQgbm90IGltcG9ydCBzdGVwQ291bnRlciBkYXRhLCBzbyB3aWxsIGJlIGlnbm9yZWRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkxvYWRpbmdMYWJlbChOYXJyYXRpb25NYW5hZ2VyU3RhdGljLmN1cnJlbnRMYWJlbFN0ZXBJbmRleCB8fCAwKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBydW5uaW5nIG9uTG9hZGluZ0xhYmVsXCIsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgZGF0YVwiLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gXCJAZHJpbmNzL3BpeGktdm5cIjtcbmltcG9ydCB7IFN0b3JhZ2VPYmplY3RUeXBlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB7IENob2ljZU9wdGlvbkludGVyZmFjZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1N0b3JlZENob2ljZUludGVyZmFjZVwiO1xuaW1wb3J0IHsgTGFiZWxJZFR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvTGFiZWxJZFR5cGVcIjtcbmltcG9ydCBMYWJlbFJ1bk1vZGVUeXBlIGZyb20gXCIuLi90eXBlcy9MYWJlbFJ1bk1vZGVUeXBlXCI7XG5pbXBvcnQgTGFiZWwgZnJvbSBcIi4vTGFiZWxcIjtcbmltcG9ydCBMYWJlbEFic3RyYWN0IGZyb20gXCIuL0xhYmVsQWJzdHJhY3RcIjtcblxuaW50ZXJmYWNlIENob2ljZU1lbnVPcHRpb25PcHRpb25zXG4gICAgZXh0ZW5kcyBPbWl0PENob2ljZUludGVyZmFjZSwgXCJ0ZXh0XCIgfCBcImxhYmVsXCIgfCBcInR5cGVcIiB8IFwicHJvcHNcIiB8IFwiY2xvc2VDdXJyZW50TGFiZWxcIj4ge1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdGhlIGxhYmVsIHRvIGJlIG9wZW5lZC4gQGRlZmF1bHQgXCJjYWxsXCJcbiAgICAgKi9cbiAgICB0eXBlPzogTGFiZWxSdW5Nb2RlVHlwZTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgY2hvaWNlIG1lbnUgb3B0aW9uLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ld0Nob2ljZU9wdGlvbihcIkhlbGxvXCIsIEhlbGxvTGFiZWwsIHt9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdDaG9pY2VPcHRpb248VCBleHRlbmRzIFN0b3JhZ2VPYmplY3RUeXBlPihcbiAgICB0ZXh0OiBDaG9pY2VJbnRlcmZhY2VbXCJ0ZXh0XCJdLFxuICAgIGxhYmVsOiBMYWJlbDxUPiB8IExhYmVsQWJzdHJhY3Q8YW55LCBUPiB8IExhYmVsSWRUeXBlLFxuICAgIHByb3BzOiBULFxuICAgIG9wdGlvbnM/OiBDaG9pY2VNZW51T3B0aW9uT3B0aW9uc1xuKTogQ2hvaWNlT3B0aW9uSW50ZXJmYWNlIHtcbiAgICBjb25zdCBsYWJlbElkID0gdHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiID8gbGFiZWwgOiBsYWJlbC5pZDtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBsYWJlbDogbGFiZWxJZCxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0eXBlOiBvcHRpb25zPy50eXBlIHx8IFwiY2FsbFwiLFxuICAgIH07XG59XG4iLCJleHBvcnQgdHlwZSBDbG9zZVR5cGUgPSBcImNsb3NlXCJcbmV4cG9ydCBjb25zdCBDbG9zZTogQ2xvc2VUeXBlID0gXCJjbG9zZVwiIiwiaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12blwiO1xuaW1wb3J0IHsgQ2xvc2VDaG9pY2VPcHRpb25JbnRlcmZhY2UgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TdG9yZWRDaG9pY2VJbnRlcmZhY2VcIjtcbmltcG9ydCB7IENsb3NlIH0gZnJvbSBcIi4uL3R5cGVzL0Nsb3NlVHlwZVwiO1xuXG5pbnRlcmZhY2UgQ2hvaWNlTWVudU9wdGlvbkNsb3NlT3B0aW9uc1xuICAgIGV4dGVuZHMgT21pdDxDaG9pY2VJbnRlcmZhY2UsIFwidGV4dFwiIHwgXCJsYWJlbFwiIHwgXCJ0eXBlXCIgfCBcInByb3BzXCIgfCBcImNsb3NlQ3VycmVudExhYmVsXCI+IHtcbiAgICAvKipcbiAgICAgKiBJZiB0cnVlLCB0aGUgY3VycmVudCBsYWJlbCB3aWxsIGJlIGNsb3NlZC4gQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBjbG9zZUN1cnJlbnRMYWJlbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGNob2ljZSBtZW51IG9wdGlvbiB0aGF0IHdpbGwgY2xvc2UgdGhlIG1lbnUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbmV3Q2xvc2VDaG9pY2VPcHRpb24oXCJSZXR1cm5cIilcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3Q2xvc2VDaG9pY2VPcHRpb24oXG4gICAgdGV4dDogQ2hvaWNlSW50ZXJmYWNlW1widGV4dFwiXSxcbiAgICBvcHRpb25zPzogQ2hvaWNlTWVudU9wdGlvbkNsb3NlT3B0aW9uc1xuKTogQ2xvc2VDaG9pY2VPcHRpb25JbnRlcmZhY2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHR5cGU6IENsb3NlLFxuICAgICAgICB0ZXh0LFxuICAgIH07XG59XG4iLCJpbXBvcnQgc2hhMSBmcm9tIFwiY3J5cHRvLWpzL3NoYTFcIjtcbmltcG9ydCB7IExhYmVsUHJvcHMgfSBmcm9tIFwiLi4vLi5cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy9sb2ctdXRpbGl0eVwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFNoYVNwZXRzRW51bSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0hpc3RvcnlTdGVwXCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9MYWJlbElkVHlwZVwiO1xuaW1wb3J0IHsgU3RlcExhYmVsVHlwZSB9IGZyb20gXCIuLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5pbXBvcnQgTGFiZWxBYnN0cmFjdCBmcm9tIFwiLi9MYWJlbEFic3RyYWN0XCI7XG5cbi8qKlxuICogTGFiZWwgaXMgYSBjbGFzcyB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBzdGVwcywgd2hpY2ggd2lsbCBiZSBwZXJmb3JtZWQgYXMgdGhlIGdhbWUgY29udGludWVzLlxuICogRm9yIFJlbidweSB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIGEgbGFiZWwuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgU1RBUlRfTEFCRUxfSUQgPSBcIlN0YXJ0TGFiZWxcIlxuICpcbiAqIGV4cG9ydCBjb25zdCBzdGFydExhYmVsID0gbmV3TGFiZWwoU1RBUlRfTEFCRUxfSUQsXG4gKiAgICAgW1xuICogICAgICAgICAocHJvcHMpID0+IHtcbiAqICAgICAgICAgICAgIGNhbnZhcy5jbGVhcigpXG4gKiAgICAgICAgICAgICBuYXJyYXRpb24uZGlhbG9ndWUgPSB7IGNoYXJhY3RlcjogbGlhbSwgdGV4dDogXCJXaGljaCB0ZXN0IGRvIHlvdSB3YW50IHRvIHBlcmZvcm0/XCIgfVxuICogICAgICAgICAgICAgbmFycmF0aW9uLmNob2ljZXMgPSBbXG4gKiAgICAgICAgICAgICAgICAgbmV3Q2hvaWNlT3B0aW9uKFwiRXZlbnRzIFRlc3RcIiwgZXZlbnRzVGVzdExhYmVsKSxcbiAqICAgICAgICAgICAgICAgICBuZXdDaG9pY2VPcHRpb24oXCJTaG93IEltYWdlIFRlc3RcIiwgc2hvd0ltYWdlVGVzdCksXG4gKiAgICAgICAgICAgICBdXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICAgIChwcm9wcykgPT4gbmFycmF0aW9uLmp1bXAoU1RBUlRfTEFCRUxfSUQsIHByb3BzKSxcbiAqICAgICBdXG4gKiApXG4gKlxuICogbmFycmF0aW9uLmNhbGwoU3RhcnRMYWJlbClcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbDxUIGV4dGVuZHMge30gPSB7fT4gZXh0ZW5kcyBMYWJlbEFic3RyYWN0PExhYmVsPFQ+LCBUPiB7XG4gICAgcHVibGljIGdldCBzdGVwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0U3RlcEJ5SWQoc3RlcElkOiBudW1iZXIpOiBTdGVwTGFiZWxUeXBlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHNbc3RlcElkXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGlkIGlzIHRoZSBpZCBvZiB0aGUgbGFiZWxcbiAgICAgKiBAcGFyYW0gc3RlcHMgaXMgdGhlIGxpc3Qgb2Ygc3RlcHMgdGhhdCB0aGUgbGFiZWwgd2lsbCBwZXJmb3JtXG4gICAgICogQHBhcmFtIHByb3BzIGlzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBsYWJlbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBMYWJlbElkVHlwZSwgc3RlcHM6IFN0ZXBMYWJlbFR5cGU8VD5bXSB8ICgoKSA9PiBTdGVwTGFiZWxUeXBlPFQ+W10pLCBwcm9wcz86IExhYmVsUHJvcHM8TGFiZWw8VD4+KSB7XG4gICAgICAgIHN1cGVyKGlkLCBwcm9wcyk7XG4gICAgICAgIHRoaXMuX3N0ZXBzID0gc3RlcHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RlcHM6IFN0ZXBMYWJlbFR5cGU8VD5bXSB8ICgoKSA9PiBTdGVwTGFiZWxUeXBlPFQ+W10pO1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc3RlcHMgb2YgdGhlIGxhYmVsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RlcHMoKTogU3RlcExhYmVsVHlwZTxUPltdIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zdGVwcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RlcHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RlcHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN0ZXBTaGEoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwic3RlcFNoYSBub3QgZm91bmQsIHNldHRpbmcgdG8gRVJST1JcIik7XG4gICAgICAgICAgICByZXR1cm4gQWRkaXRpb25hbFNoYVNwZXRzRW51bS5FUlJPUjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHN0ZXAgPSB0aGlzLnN0ZXBzW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBzaGExU3RyaW5nID0gc2hhMShzdGVwLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgICByZXR1cm4gc2hhMVN0cmluZy50b1N0cmluZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcInN0ZXBTaGEgbm90IGZvdW5kLCBzZXR0aW5nIHRvIEVSUk9SXCIsIGUpO1xuICAgICAgICAgICAgcmV0dXJuIEFkZGl0aW9uYWxTaGFTcGV0c0VudW0uRVJST1I7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi4vZGVjb3JhdG9ycy9SZWdpc3RlcmVkTGFiZWxzXCI7XG5pbXBvcnQgTGFiZWxQcm9wcyBmcm9tIFwiLi4vaW50ZXJmYWNlcy9MYWJlbFByb3BzXCI7XG5pbXBvcnQgeyBMYWJlbElkVHlwZSB9IGZyb20gXCIuLi90eXBlcy9MYWJlbElkVHlwZVwiO1xuaW1wb3J0IHsgU3RlcExhYmVsVHlwZSB9IGZyb20gXCIuLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIExhYmVsQWJzdHJhY3Q8VExhYmVsLCBUUHJvcHMgZXh0ZW5kcyB7fSA9IHt9LCBTdGVwSWRUeXBlID0gbnVtYmVyPlxuICAgIGltcGxlbWVudHMgTGFiZWxQcm9wczxUTGFiZWwsIFN0ZXBJZFR5cGU+XG57XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGlkIGlzIHRoZSBpZCBvZiB0aGUgbGFiZWxcbiAgICAgKiBAcGFyYW0gcHJvcHMgaXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGxhYmVsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IExhYmVsSWRUeXBlLCBwcm9wcz86IExhYmVsUHJvcHM8VExhYmVsLCBTdGVwSWRUeXBlPikge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuX29uU3RlcFN0YXJ0ID0gcHJvcHM/Lm9uU3RlcFN0YXJ0O1xuICAgICAgICB0aGlzLl9vbkxvYWRpbmdMYWJlbCA9IHByb3BzPy5vbkxvYWRpbmdMYWJlbDtcbiAgICAgICAgdGhpcy5fb25TdGVwRW5kID0gcHJvcHM/Lm9uU3RlcEVuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGlkIG9mIHRoZSBsYWJlbC4gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSBzeXN0ZW0gdG8gZ2V0IHRoZSBsYWJlbCBieSBpZCwge0BsaW5rIFJlZ2lzdGVyZWRMYWJlbHMuZ2V0fVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkOiBMYWJlbElkVHlwZTtcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0ZXBzIGluIHRoZSBsYWJlbC4gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGluIHRoZSBzeXN0ZW0gdG8gZ2V0IHRoZSBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIGxhYmVsLlxuICAgICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIGxhYmVsXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBzdGVwQ291bnQoKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaGEgb2YgdGhlIHN0ZXBcbiAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIHN0ZXBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0U3RlcFNoYShzdGVwSWQ6IFN0ZXBJZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHN0ZXAgYnkgaWRcbiAgICAgKiBAcGFyYW0gc3RlcElkIElkIG9mIHRoZSBzdGVwXG4gICAgICogQHJldHVybiBUaGUgc3RlcCBvciB1bmRlZmluZWQgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0U3RlcEJ5SWQoc3RlcElkOiBTdGVwSWRUeXBlKTogU3RlcExhYmVsVHlwZTxUUHJvcHM+IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBfb25TdGVwU3RhcnQ6ICgoc3RlcElkOiBTdGVwSWRUeXBlLCBsYWJlbDogVExhYmVsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIGdldCBvblN0ZXBTdGFydCgpOiAoKHN0ZXBJZDogU3RlcElkVHlwZSwgbGFiZWw6IFRMYWJlbCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChzdGVwSWQ6IFN0ZXBJZFR5cGUsIGxhYmVsOiBUTGFiZWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkxvYWRpbmdMYWJlbCAmJiBzdGVwSWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9vbkxvYWRpbmdMYWJlbChzdGVwSWQsIGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vblN0ZXBTdGFydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9vblN0ZXBTdGFydChzdGVwSWQsIGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkxvYWRpbmdMYWJlbDogKChzdGVwSWQ6IFN0ZXBJZFR5cGUsIGxhYmVsOiBUTGFiZWwpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgZ2V0IG9uTG9hZGluZ0xhYmVsKCk6ICgoc3RlcElkOiBTdGVwSWRUeXBlLCBsYWJlbDogVExhYmVsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25Mb2FkaW5nTGFiZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25TdGVwRW5kOiAoKHN0ZXBJZDogU3RlcElkVHlwZSwgbGFiZWw6IFRMYWJlbCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyBnZXQgb25TdGVwRW5kKCk6ICgoc3RlcElkOiBTdGVwSWRUeXBlLCBsYWJlbDogVExhYmVsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25TdGVwRW5kO1xuICAgIH1cbn1cbiIsImltcG9ydCBMYWJlbCBmcm9tIFwiLi4vY2xhc3Nlcy9MYWJlbFwiO1xuaW1wb3J0IExhYmVsUHJvcHMgZnJvbSBcIi4uL2ludGVyZmFjZXMvTGFiZWxQcm9wc1wiO1xuaW1wb3J0IHsgTGFiZWxJZFR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvTGFiZWxJZFR5cGVcIjtcbmltcG9ydCBMYWJlbFN0ZXBzIGZyb20gXCIuLi90eXBlcy9MYWJlbFN0ZXBzXCI7XG5pbXBvcnQgUmVnaXN0ZXJlZExhYmVscyBmcm9tIFwiLi9SZWdpc3RlcmVkTGFiZWxzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsYWJlbCBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBzeXN0ZW0uXG4gKiAqKlRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBhdCBzeXN0ZW0gc3RhcnR1cCB0byByZWdpc3RlciB0aGUgbGFiZWwsIG90aGVyd2lzZSB0aGUgc3lzdGVtIGNhbm5vdCBiZSB1c2VkLioqXG4gKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBsYWJlbCwgaXQgbXVzdCBiZSB1bmlxdWVcbiAqIEBwYXJhbSBzdGVwcyBUaGUgc3RlcHMgb2YgdGhlIGxhYmVsXG4gKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIGxhYmVsXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBsYWJlbFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBuZXdMYWJlbDxUIGV4dGVuZHMge30gPSB7fT4oXG4gICAgaWQ6IExhYmVsSWRUeXBlLFxuICAgIHN0ZXBzOiBMYWJlbFN0ZXBzPFQ+IHwgKCgpID0+IExhYmVsU3RlcHM8VD4pLFxuICAgIHByb3BzPzogTGFiZWxQcm9wczxMYWJlbDxUPj5cbik6IExhYmVsPFQ+IHtcbiAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWw8VD4oaWQsIHN0ZXBzLCBwcm9wcyk7XG4gICAgUmVnaXN0ZXJlZExhYmVscy5hZGQobGFiZWwpO1xuICAgIHJldHVybiBsYWJlbDtcbn1cbiIsImltcG9ydCB7IE5hcnJhdGlvbk1hbmFnZXJJbnRlcmZhY2UgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCBOYXJyYXRpb25NYW5hZ2VyIGZyb20gXCIuL05hcnJhdGlvbk1hbmFnZXJcIjtcblxuZXhwb3J0IHsgbmV3Q2hvaWNlT3B0aW9uIH0gZnJvbSBcIi4vY2xhc3Nlcy9DaG9pY2VNZW51T3B0aW9uXCI7XG5leHBvcnQgeyBuZXdDbG9zZUNob2ljZU9wdGlvbiB9IGZyb20gXCIuL2NsYXNzZXMvQ2xvc2VDaG9pY2VPcHRpb25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGFiZWwgfSBmcm9tIFwiLi9jbGFzc2VzL0xhYmVsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExhYmVsQWJzdHJhY3QgfSBmcm9tIFwiLi9jbGFzc2VzL0xhYmVsQWJzdHJhY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbmV3TGFiZWwgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL25ld0xhYmVsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJlZ2lzdGVyZWRMYWJlbHMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL1JlZ2lzdGVyZWRMYWJlbHNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDaG9pY2VJbnRlcmZhY2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0Nob2ljZUludGVyZmFjZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIERpYWxvZ3VlSW50ZXJmYWNlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9EaWFsb2d1ZUludGVyZmFjZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEhpc3RvcnlTdGVwIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9IaXN0b3J5U3RlcFwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIExhYmVsUHJvcHMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0xhYmVsUHJvcHNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBOYXJyYXRpb25HYW1lU3RhdGUgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL05hcnJhdGlvbkdhbWVTdGF0ZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE5hcnJhdGlvbkhpc3RvcnkgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL05hcnJhdGlvbkhpc3RvcnlcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBOYXJyYXRpb25NYW5hZ2VySW50ZXJmYWNlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9OYXJyYXRpb25NYW5hZ2VySW50ZXJmYWNlXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT3BlbmVkTGFiZWwgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL09wZW5lZExhYmVsXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgU3RlcExhYmVsUHJvcHMgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL1N0ZXBMYWJlbFByb3BzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgU3RlcExhYmVsUmVzdWx0IH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9TdGVwTGFiZWxSZXN1bHRcIjtcbmV4cG9ydCB0eXBlIHtcbiAgICBDaG9pY2VPcHRpb25JbnRlcmZhY2UsXG4gICAgQ2xvc2VDaG9pY2VPcHRpb25JbnRlcmZhY2UsXG4gICAgZGVmYXVsdCBhcyBTdG9yZWRDaG9pY2VJbnRlcmZhY2UsXG4gICAgU3RvcmVkSW5kZXhlZENob2ljZUludGVyZmFjZSxcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9TdG9yZWRDaG9pY2VJbnRlcmZhY2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTmFycmF0aW9uTWFuYWdlclN0YXRpYyB9IGZyb20gXCIuL05hcnJhdGlvbk1hbmFnZXJTdGF0aWNcIjtcbmV4cG9ydCB7IENsb3NlIH0gZnJvbSBcIi4vdHlwZXMvQ2xvc2VUeXBlXCI7XG5leHBvcnQgdHlwZSB7IENsb3NlVHlwZSB9IGZyb20gXCIuL3R5cGVzL0Nsb3NlVHlwZVwiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEhpc3RvcnlDaG9pY2VNZW51T3B0aW9uIH0gZnJvbSBcIi4vdHlwZXMvSGlzdG9yeUNob2ljZU1lbnVPcHRpb25cIjtcbmV4cG9ydCB0eXBlIHsgSW5wdXRJbmZvIH0gZnJvbSBcIi4vdHlwZXMvSW5wdXRJbmZvXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTGFiZWxSdW5Nb2RlVHlwZSB9IGZyb20gXCIuL3R5cGVzL0xhYmVsUnVuTW9kZVR5cGVcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBMYWJlbFN0ZXBzIH0gZnJvbSBcIi4vdHlwZXMvTGFiZWxTdGVwc1wiO1xuZXhwb3J0IHR5cGUgeyBTdGVwTGFiZWxQcm9wc1R5cGUsIFN0ZXBMYWJlbFJlc3VsdFR5cGUsIFN0ZXBMYWJlbFR5cGUgfSBmcm9tIFwiLi90eXBlcy9TdGVwTGFiZWxUeXBlXCI7XG5leHBvcnQgeyBuYXJyYXRpb24gfTtcblxuY29uc3QgbmFycmF0aW9uOiBOYXJyYXRpb25NYW5hZ2VySW50ZXJmYWNlID0gbmV3IE5hcnJhdGlvbk1hbmFnZXIoKTtcbiJdfQ==
|