@onirix/ar-engine-sdk 1.9.1 → 1.10.0
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/CHANGELOG.md +13 -0
- package/dist/onirix_native_sdk.js +1 -1
- package/dist/ox-sdk.esm.js +2 -2
- package/package.json +4 -5
- package/dist/ort-wasm-simd.wasm +0 -0
package/dist/ox-sdk.esm.js
CHANGED
@@ -38,7 +38,7 @@ class Euler{constructor(t=0,a=0,h=0,s="XYZ"){this.x=t,this.y=a,this.z=h,this.ord
|
|
38
38
|
|
39
39
|
const mat4RotationZ90CCW=(new Matrix4).set(0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1),mat4RotationZ90CW=(new Matrix4).set(0,-1,0,0,1,0,0,0,0,0,1,0,0,0,0,1),mat4RotationX90CW=(new Matrix4).set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),mat3RotationX90CCW=(new Matrix3).set(1,0,0,0,0,1,0,-1,0),mat3RotationZ90CW=(new Matrix3).set(0,-1,0,1,0,0,0,0,1);
|
40
40
|
|
41
|
-
class NativeManager{constructor(t,i,e,a){this.uiManager=t,this.deviceManager=i,this.workerManager=e,this.indexedDBManager=a,this.webXRRelocationListener=null,this.osfStrBuffer=null;}async init(t,i){try{let e=new URL("./onirix_native_sdk.js",import.meta.url),a=await this.indexedDBManager.getFromCacheOrFetch("SDK_1.9.1",e),r=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));const{default:s}=await import(/* webpackIgnore: true, webpackMode: "lazy" */r);let n,o,h;if(this.useVocabulary=i.useVocabulary,this.host=i.host??"https://studio.onirix.com",this.useVocabulary&&(n=await this.indexedDBManager.getFromCacheOrFetch("orb.fbow","https://cdn.onirix.com/onirix-engine-sdk/orb.fbow")),i.mode===TrackingMode.Spatial){if(o=await fetch(`${this.host}/api/projects/self/targets/${i.sceneOid}/osf?token=${t}`),!o.ok)throw new ReconstructionPendingError(`Could not get Onirix Spatial File. Server responded with ${o.status}`);const e=await o.arrayBuffer();h=new Uint8Array(e),await this.workerManager.createWorkers();}this.nativeSDK=await s({preRun:e=>{i.mode==TrackingMode.Spatial?e.FS_createDataFile("/","scene.osf",h,!0,!0,!0):i.mode===TrackingMode.Curved||i.mode===TrackingMode.Image?(this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",n,!0,!0,!0),e.FS_createPreloadedFile("/","classifier.otf",`${this.host}/api/projects/self/targets/otf?token=${t}`,!0,!1)):i.mode===TrackingMode.Surface&&this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",n,!0,!0,!0);}}),this.spatialBufferSize=this.getBufferSize(),this.buffer=this.nativeSDK._malloc(1228800),this.imageBuffer=this.nativeSDK._malloc(1228800),this.imuAccData=this.nativeSDK._malloc(32),this.imuRotData=this.nativeSDK._malloc(72),this.cameraParamsStruct=this.nativeSDK._malloc(40),this.frameLayoutStruct=this.nativeSDK._malloc(28),this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+0]=640,this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+1]=480,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=320,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=240,i.debug&&this.nativeSDK._OX_SetLogCallback(this.nativeSDK.addFunction((t=>{console.log(`[OnirixEngineSDK] ${this.nativeSDK.UTF8ToString(t)}`);}),"vi"));}catch(t){throw console.log(t),t instanceof ReconstructionPendingError?t:new InternalError(t)}await this.checkLicense(t,i);}getBufferSize(){return this.nativeSDK._OX_GetBufferSize()}getIntrinsics(){return [this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]]}setIntrinsics(t,i,e){this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=i,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=e,this.nativeSDK._OX_UpdateIntrinsics(t,i,e);}async checkLicense(t,i){try{const e=this.getStringBuffer(this.host),a=this.getStringBuffer(t),r=this.getStringBuffer(window.location.hostname),s=this.getStringBuffer(this.deviceManager.platform),n=this.getStringBuffer(this.deviceManager.device),o=this.getStringBuffer(JSON.stringify(i)),h=await new Promise(((t,i)=>{this.nativeSDK._OX_SetLicense([e],[a],[r],[s],[n],[o],this.nativeSDK.addFunction(((i,e)=>t({ivl:i,oxError:this.nativeSDK.UTF8ToString(e)})),"vii"));}));if(this.releaseStringBuffer(e),this.releaseStringBuffer(a),this.releaseStringBuffer(r),this.releaseStringBuffer(s),this.releaseStringBuffer(n),this.releaseStringBuffer(o),!h.ivl)throw new LicenseError("Invalid license",h.oxError)}catch(t){throw new LicenseError(t,t.oxError)}}startImageTracking(t,i,e,a,r=!1){if(this.onDetected=t,this.onPose=i,this.onLost=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");let s=this.getStringBuffer("classifier.otf");this.nativeSDK._OX_LoadImageClassifier([s]),this.releaseStringBuffer(s),this.nativeSDK._OX_StartImageDetection(2,r?1:a,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(r?mat4RotationZ90CW:mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startCurvedImageTracking(t,i,e){if(this.onDetected=t,this.onPose=i,this.onLost=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");let a=this.getStringBuffer("classifier.otf");this.nativeSDK._OX_LoadImageClassifier([a]),this.releaseStringBuffer(a),this.nativeSDK._OX_StartCurvedImageDetection(2,1,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startQRCodeTracking(t,i,e){this.onDetected=t,this.onPose=i,this.onLost=e,this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartQRCodeDetection(2,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startSLAM(t,i,e){if(this.onPose=t,this.onKeyFrame=i,this.onStatusChange=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");this.nativeSDK._OX_StartSLAM(this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),null!=this.onKeyFrame?this.nativeSDK.addFunction((()=>this.onKeyFrame()),"v"):null,this.nativeSDK.addFunction(((t,i)=>{this.onStatusChange([this.nativeSDK.UTF8ToString(t),this.nativeSDK.UTF8ToString(i)]);}),"vii"));}startSpatialTracking(t,i,e){if(this.onDetected=t,e||(this.onPose=i),this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartSpatialTracking(this.nativeSDK.addFunction((t=>{e||(this.spatialLocated=!0),this.onDetected("");}),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let a=(new Matrix4).fromArray(i);a.invert(),this.uiManager.isPortrait()&&a.multiply(e?mat4RotationZ90CW:mat4RotationZ90CCW),e?(this.webXRRelocationListener(a),this.onDetected("")):this.onPose(a.toArray());}),"vi"),!e),this.osfStrBuffer=this.getStringBuffer("scene.osf"),this.nativeSDK._OX_LoadOSF(this.osfStrBuffer),!e&&2==this.extractionType())throw new InternalError("Onirix compatibility mode for WorldTracking is not supported for Spatial scenes.")}processFrame(t,i=null,e=480,a=640,r=0,s=0){let n=i||this.buffer;this.nativeSDK.HEAPU8.set(t,n),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=e,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=4*a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=s,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=r,this.nativeSDK._OX_ProcessFrame(n,this.frameLayoutStruct);}getXRFrameBuffer(t,i){return this.xrBuffer||(this.xrBuffer=this.nativeSDK._malloc(t*i*4)),this.xrBuffer}initExtractionBuffers(){this.extractionBuffer=this.nativeSDK._malloc(4*this.spatialBufferSize),this.matchBuffer=this.nativeSDK._malloc(14e3),this.coarseLocationBuffer=this.nativeSDK._malloc(32768);}loadExtractionData(t,i=-1){return this.extractionBuffer&&this.coarseLocationBuffer?(this.nativeSDK.HEAPF32.set(t.extraction,this.extractionBuffer/4),this.nativeSDK.HEAPF32.set(t.descriptor,this.coarseLocationBuffer/4),this.nativeSDK._OX_LoadExtractionData(this.extractionBuffer,this.coarseLocationBuffer,i)):0}coarseLocationCheck(t){return this.coarseLocationBuffer?(this.nativeSDK.HEAPF32.set(t.descriptor,this.coarseLocationBuffer/4),this.nativeSDK._OX_CoarseLocationCheck(this.coarseLocationBuffer)):0}getCandidateData(t){let i=this.nativeSDK._OX_GetCandidateData(t);return new Float32Array(this.nativeSDK.HEAPF32.buffer,i,this.spatialBufferSize)}loadMatch(t){this.matchBuffer&&(this.nativeSDK.HEAPF32.set(t,this.matchBuffer/4),this.nativeSDK._OX_LoadMatch(this.matchBuffer));}spatialLocalize(){return this.nativeSDK._OX_SpatialLocalize()}setSpatialQualityLevel(t){return this.nativeSDK._OX_SetSpatialQualityLevel(t)}loadKeyframePose(t){this.nativeSDK._OX_LoadKfPose(t);}numSLAMKeyframes(){return this.nativeSDK._OX_GetSLAMNumKfs()}getSLAMKeyframe(t){let i=this.nativeSDK._OX_GetSLAMKf(t),e=[];for(let t=0;t<1228800;t++)e.push(this.nativeSDK.HEAPU8[i+t]);return new Uint8Array(e)}stopImageTracking(){this.nativeSDK._OX_StopImageDetection();}stopQRCodeTracking(){this.nativeSDK._OX_StopQRCodeDetection();}stopSLAM(){this.nativeSDK._OX_StopSLAM();}stopSpatialTracking(){this.nativeSDK._OX_StopSpatialTracking();}addImage(t,i){this.nativeSDK.HEAPU8.set(i,this.imageBuffer),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=640,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=480,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=2560,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=0,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=0;const e=this.getStringBuffer(t);this.nativeSDK._OX_AddImage([e],this.imageBuffer,this.frameLayoutStruct),this.releaseStringBuffer(e);}destroy(){this.nativeSDK._OX_Destroy(),this.osfStrBuffer&&this.releaseStringBuffer(this.osfStrBuffer);}extractionType(){return this.nativeSDK._OX_ExtractionType()}getStringBuffer(t){const i=this.nativeSDK.lengthBytesUTF8(t)+1;let e=this.nativeSDK._malloc(i);return this.nativeSDK.stringToUTF8(t,e,i),e}releaseStringBuffer(t){this.nativeSDK._free(t);}parseNativeJSON(t){let i;try{i=JSON.parse(t);}catch(i){console.error(`Could not parse ${t}`);}return i}getSLAMMap(){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMMap()))}getSLAMTrackingPoints(){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMTrackingPoints()))}raycast(t,i,e,a,r,s){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_Raycast(t,i,e,a,r,s)))}getSpatialMap(){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSpatialMap()))}setWebXRRelocationListener(t){this.webXRRelocationListener=t;}}
|
41
|
+
class NativeManager{constructor(t,i,e,a){this.uiManager=t,this.deviceManager=i,this.workerManager=e,this.indexedDBManager=a,this.webXRRelocationListener=null,this.osfStrBuffer=null;}async init(t,i){try{let e=new URL("./onirix_native_sdk.js",import.meta.url),a=await this.indexedDBManager.getFromCacheOrFetch("SDK_1.10.0",e),r=URL.createObjectURL(new Blob([a],{type:"text/javascript"}));const{default:s}=await import(/* webpackIgnore: true, webpackMode: "lazy" */r);let n,o,h;if(this.useVocabulary=i.useVocabulary,this.host=i.host??"https://studio.onirix.com",this.useVocabulary&&(n=await this.indexedDBManager.getFromCacheOrFetch("orb.fbow","https://cdn.onirix.com/onirix-engine-sdk/orb.fbow")),i.mode===TrackingMode.Spatial){if(o=await fetch(`${this.host}/api/projects/self/targets/${i.sceneOid}/osf?token=${t}`),!o.ok)throw new ReconstructionPendingError(`Could not get Onirix Spatial File. Server responded with ${o.status}`);const e=await o.arrayBuffer();h=new Uint8Array(e),await this.workerManager.createWorkers();}this.nativeSDK=await s({preRun:e=>{i.mode==TrackingMode.Spatial?e.FS_createDataFile("/","scene.osf",h,!0,!0,!0):i.mode===TrackingMode.Curved||i.mode===TrackingMode.Image?(this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",n,!0,!0,!0),e.FS_createPreloadedFile("/","classifier.otf",`${this.host}/api/projects/self/targets/otf?token=${t}`,!0,!1)):i.mode===TrackingMode.Surface&&this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",n,!0,!0,!0);}}),this.spatialBufferSize=this.getBufferSize(),this.buffer=this.nativeSDK._malloc(1228800),this.imageBuffer=this.nativeSDK._malloc(1228800),this.imuAccData=this.nativeSDK._malloc(32),this.imuRotData=this.nativeSDK._malloc(72),this.cameraParamsStruct=this.nativeSDK._malloc(40),this.frameLayoutStruct=this.nativeSDK._malloc(28),this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+0]=640,this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+1]=480,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=320,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=240,i.debug&&this.nativeSDK._OX_SetLogCallback(this.nativeSDK.addFunction((t=>{console.log(`[OnirixEngineSDK] ${this.nativeSDK.UTF8ToString(t)}`);}),"vi"));}catch(t){throw console.log(t),t instanceof ReconstructionPendingError?t:new InternalError(t)}await this.checkLicense(t,i);}getBufferSize(){return this.nativeSDK._OX_GetBufferSize()}getIntrinsics(){return [this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]]}setIntrinsics(t,i,e){this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=i,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=e,this.nativeSDK._OX_UpdateIntrinsics(t,i,e);}async checkLicense(t,i){try{const e=this.getStringBuffer(this.host),a=this.getStringBuffer(t),r=this.getStringBuffer(window.location.hostname),s=this.getStringBuffer(this.deviceManager.platform),n=this.getStringBuffer(this.deviceManager.device),o=this.getStringBuffer(JSON.stringify(i)),h=await new Promise(((t,i)=>{this.nativeSDK._OX_SetLicense([e],[a],[r],[s],[n],[o],this.nativeSDK.addFunction(((i,e)=>t({ivl:i,oxError:this.nativeSDK.UTF8ToString(e)})),"vii"));}));if(this.releaseStringBuffer(e),this.releaseStringBuffer(a),this.releaseStringBuffer(r),this.releaseStringBuffer(s),this.releaseStringBuffer(n),this.releaseStringBuffer(o),!h.ivl)throw new LicenseError("Invalid license",h.oxError)}catch(t){throw new LicenseError(t,t.oxError)}}startImageTracking(t,i,e,a,r=!1){if(this.onDetected=t,this.onPose=i,this.onLost=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");let s=this.getStringBuffer("classifier.otf");this.nativeSDK._OX_LoadImageClassifier([s]),this.releaseStringBuffer(s),this.nativeSDK._OX_StartImageDetection(2,r?1:a,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(r?mat4RotationZ90CW:mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startCurvedImageTracking(t,i,e){if(this.onDetected=t,this.onPose=i,this.onLost=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");let a=this.getStringBuffer("classifier.otf");this.nativeSDK._OX_LoadImageClassifier([a]),this.releaseStringBuffer(a),this.nativeSDK._OX_StartCurvedImageDetection(2,1,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startQRCodeTracking(t,i,e){this.onDetected=t,this.onPose=i,this.onLost=e,this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartQRCodeDetection(2,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startSLAM(t,i,e){if(this.onPose=t,this.onKeyFrame=i,this.onStatusChange=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");this.nativeSDK._OX_StartSLAM(this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),null!=this.onKeyFrame?this.nativeSDK.addFunction((()=>this.onKeyFrame()),"v"):null,this.nativeSDK.addFunction(((t,i)=>{this.onStatusChange([this.nativeSDK.UTF8ToString(t),this.nativeSDK.UTF8ToString(i)]);}),"vii"));}startSpatialTracking(t,i,e){if(this.onDetected=t,e||(this.onPose=i),this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartSpatialTracking(this.nativeSDK.addFunction((t=>{e||(this.spatialLocated=!0),this.onDetected("");}),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let a=(new Matrix4).fromArray(i);a.invert(),this.uiManager.isPortrait()&&a.multiply(e?mat4RotationZ90CW:mat4RotationZ90CCW),e?(this.webXRRelocationListener(a),this.onDetected("")):this.onPose(a.toArray());}),"vi"),!e),this.osfStrBuffer=this.getStringBuffer("scene.osf"),this.nativeSDK._OX_LoadOSF(this.osfStrBuffer),!e&&2==this.extractionType())throw new InternalError("Onirix compatibility mode for WorldTracking is not supported for Spatial scenes.")}processFrame(t,i=null,e=480,a=640,r=0,s=0){let n=i||this.buffer;this.nativeSDK.HEAPU8.set(t,n),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=e,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=4*a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=s,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=r,this.nativeSDK._OX_ProcessFrame(n,this.frameLayoutStruct);}getXRFrameBuffer(t,i){return this.xrBuffer||(this.xrBuffer=this.nativeSDK._malloc(t*i*4)),this.xrBuffer}initExtractionBuffers(){this.extractionBuffer=this.nativeSDK._malloc(4*this.spatialBufferSize),this.matchBuffer=this.nativeSDK._malloc(14e3),this.coarseLocationBuffer=this.nativeSDK._malloc(32768);}loadExtractionData(t,i=-1){return this.extractionBuffer&&this.coarseLocationBuffer?(this.nativeSDK.HEAPF32.set(t.extraction,this.extractionBuffer/4),this.nativeSDK.HEAPF32.set(t.descriptor,this.coarseLocationBuffer/4),this.nativeSDK._OX_LoadExtractionData(this.extractionBuffer,this.coarseLocationBuffer,i)):0}coarseLocationCheck(t){return this.coarseLocationBuffer?(this.nativeSDK.HEAPF32.set(t.descriptor,this.coarseLocationBuffer/4),this.nativeSDK._OX_CoarseLocationCheck(this.coarseLocationBuffer)):0}getCandidateData(t){let i=this.nativeSDK._OX_GetCandidateData(t);return new Float32Array(this.nativeSDK.HEAPF32.buffer,i,this.spatialBufferSize)}loadMatch(t){this.matchBuffer&&(this.nativeSDK.HEAPF32.set(t,this.matchBuffer/4),this.nativeSDK._OX_LoadMatch(this.matchBuffer));}spatialLocalize(){return this.nativeSDK._OX_SpatialLocalize()}setSpatialQualityLevel(t){return this.nativeSDK._OX_SetSpatialQualityLevel(t)}loadKeyframePose(t){this.nativeSDK._OX_LoadKfPose(t);}numSLAMKeyframes(){return this.nativeSDK._OX_GetSLAMNumKfs()}getSLAMKeyframe(t){let i=this.nativeSDK._OX_GetSLAMKf(t),e=[];for(let t=0;t<1228800;t++)e.push(this.nativeSDK.HEAPU8[i+t]);return new Uint8Array(e)}stopImageTracking(){this.nativeSDK._OX_StopImageDetection();}stopQRCodeTracking(){this.nativeSDK._OX_StopQRCodeDetection();}stopSLAM(){this.nativeSDK._OX_StopSLAM();}stopSpatialTracking(){this.nativeSDK._OX_StopSpatialTracking();}addImage(t,i){this.nativeSDK.HEAPU8.set(i,this.imageBuffer),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=640,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=480,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=2560,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=0,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=0;const e=this.getStringBuffer(t);this.nativeSDK._OX_AddImage([e],this.imageBuffer,this.frameLayoutStruct),this.releaseStringBuffer(e);}destroy(){this.nativeSDK._OX_Destroy(),this.osfStrBuffer&&this.releaseStringBuffer(this.osfStrBuffer);}extractionType(){return this.nativeSDK._OX_ExtractionType()}getStringBuffer(t){const i=this.nativeSDK.lengthBytesUTF8(t)+1;let e=this.nativeSDK._malloc(i);return this.nativeSDK.stringToUTF8(t,e,i),e}releaseStringBuffer(t){this.nativeSDK._free(t);}parseNativeJSON(t){let i;try{i=JSON.parse(t);}catch(i){console.error(`Could not parse ${t}`);}return i}getSLAMMap(){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMMap()))}getSLAMTrackingPoints(){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMTrackingPoints()))}raycast(t,i,e,a,r,s){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_Raycast(t,i,e,a,r,s)))}getSpatialMap(){return this.parseNativeJSON(this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSpatialMap()))}setWebXRRelocationListener(t){this.webXRRelocationListener=t;}}
|
42
42
|
|
43
43
|
class UIManager{constructor(){this.onFocus=this.onFocus.bind(this);}createRenderCanvas(){this.renderCanvas=document.createElement("canvas"),this.renderCanvas.id="renderer",this.renderCanvas.style.position="absolute",document.body.prepend(this.renderCanvas),this.addTouchListeners();}setRenderCanvas(e){this.renderCanvas=e,this.addTouchListeners();}addTouchListeners(){this.renderCanvas.addEventListener("click",(e=>{this.onCanvasTouch(e);})),this.renderCanvas.addEventListener("touchstart",(e=>{this.onCanvasTouchStart(e);})),this.renderCanvas.addEventListener("touchmove",(e=>{this.onCanvasTouchMove(e);})),this.renderCanvas.addEventListener("touchend",(e=>{this.onCanvasTouchEnd(e);}));}removeRenderCanvas(){this.renderCanvas&&(this.renderCanvas.remove(),this.renderCanvas=null);}createVideoElement(e,t,i){let o=document.createElement("video");o.setAttribute("playsinline","true"),o.setAttribute("autoplay","true"),o.setAttribute("muted",""),this.videoCanvas=document.createElement("canvas"),this.videoCanvas.width=t,this.videoCanvas.height=i,this.videoContext=this.videoCanvas.getContext("2d"),o.srcObject=e,document.body.appendChild(o),this.videoElement=o;const s=this.videoElement.srcObject.getVideoTracks()[0].getSettings();this.videoSizeHorizontal=[Math.max(s.width,s.height),Math.min(s.width,s.height)],this.videoSizeVertical=[Math.min(s.width,s.height),Math.max(s.width,s.height)],window.addEventListener("focus",this.onFocus);}onFocus(){this.videoElement.play();}removeVideoElement(){this.videoElement&&(window.removeEventListener("focus",this.onFocus),this.videoElement.remove(),this.videoElement=null);}fitVideoToScreen(){if(!this.videoSizeHorizontal||!this.videoSizeVertical)return;this.videoSize=window.innerWidth>window.innerHeight?this.videoSizeHorizontal:this.videoSizeVertical;let e=[],t=[];this.videoSize[0]/this.videoSize[1]>window.innerWidth/window.innerHeight?(t=[Math.floor(this.videoSize[0]*(window.innerHeight/this.videoSize[1])),window.innerHeight],e=[-(t[0]-window.innerWidth)/2,0]):(t=[window.innerWidth,Math.floor(this.videoSize[1]*(window.innerWidth/this.videoSize[0]))],e=[0,-(t[1]-window.innerHeight)/2]),document.body.style.setProperty("overflow","hidden"),this.videoElement.width=t[0],this.videoElement.height=t[1],this.videoElement.style.setProperty("position","fixed"),this.videoElement.style.setProperty("z-index","-1"),this.videoElement.style.setProperty("width",`${t[0]}px`),this.videoElement.style.setProperty("height",`${t[1]}px`),this.videoElement.style.setProperty("left",`${e[0]}px`),this.videoElement.style.setProperty("top",`${e[1]}px`),this.videoElement.style.setProperty("touch-action","none"),this.renderCanvas.width=t[0],this.renderCanvas.height=t[1],this.renderCanvas.style.setProperty("position","fixed","important"),this.renderCanvas.style.setProperty("width",`${t[0]}px`,"important"),this.renderCanvas.style.setProperty("height",`${t[1]}px`,"important"),this.renderCanvas.style.setProperty("left",`${e[0]}px`,"important"),this.renderCanvas.style.setProperty("top",`${e[1]}px`,"important"),this.renderCanvas.style.setProperty("touch-action","none","important");}async displayPermissionsDialog(e){return new Promise(((t,i)=>{let o,s,n,r;o=document.createElement("div"),o.id="ox-permissions-dialog",o.style.setProperty("position","fixed"),o.style.setProperty("z-index","999999"),o.style.setProperty("max-width","360px"),o.style.setProperty("width","calc(100% - 140px"),o.style.setProperty("left","50vw"),o.style.setProperty("top","50vh"),o.style.setProperty("transform","translate(-50%, -50%)"),o.style.setProperty("background-color","#FFFFFF"),o.style.setProperty("border-radius","10px"),o.style.setProperty("font-family","'Open Sans', Arial, sans-serif"),o.style.setProperty("text-align","center"),o.style.setProperty("padding","30px"),document.body.appendChild(o),s=document.createElement("h1"),s.id="ox-permissions-dialog-title",s.innerText="Access to motion sensors required",s.style.setProperty("font-size","20px"),o.appendChild(s),n=document.createElement("span"),n.id="ox-permissions-dialog-message",n.innerText="This augmented reality experience requires access to your phone motion sensors. The browser may ask you for permissions.",n.style.setProperty("display","block"),n.style.setProperty("padding","10px 0"),o.appendChild(n),r=document.createElement("button"),r.id="ox-permissions-dialog-ok-button",r.innerText="Okay!",r.style.setProperty("display","block"),r.style.setProperty("margin","auto"),r.style.setProperty("background","#000000"),r.style.setProperty("color","#FFFFFF"),r.style.setProperty("border","none"),r.style.setProperty("border-radius","12px"),r.style.setProperty("padding","20px 0"),r.style.setProperty("width","100%"),r.style.setProperty("font-size","18px"),r.style.setProperty("font-weight","bold"),r.style.setProperty("margin-top","20px"),r.style.setProperty("background-image","linear-gradient(to left, #f6414b, #ee0979)"),o.appendChild(r),r.addEventListener("click",(async s=>{s.stopPropagation(),o.remove();try{await e(),t();}catch(e){i(e);}}));}))}getVideoData(){let e;if(this.videoElement){if(this.isPortrait()){let[e,i]=this.videoSizeVertical;var t=Math.PI/2;this.videoContext.translate(480,0),this.videoContext.rotate(t),this.videoContext.drawImage(this.videoElement,0,0,i,i,0,-160,640,640),this.videoContext.rotate(-t),this.videoContext.translate(-480,0);}else this.videoContext.drawImage(this.videoElement,0,0,640,480);e=this.videoContext.getImageData(0,0,640,480).data;}return e}getVideoElement(){return this.videoElement}getCameraParameters(){let e=640,t=480;return this.isPortrait()||([e,t]=[t,e]),{fov:radToDeg(2*Math.atan(e/936)),aspect:t/e}}isPortrait(){return window.innerWidth<window.innerHeight}setTouchListener(e){this.onTouch=e;}setTouchStartListener(e){this.onTouchStart=e;}setTouchMoveListener(e){this.onTouchMove=e;}setTouchEndListener(e){this.onTouchEnd=e;}getNormalizedTouchCoords(e){const t=new Vector2,i=this.renderCanvas.getBoundingClientRect();return null!=e.clientX?(t.x=(e.clientX-i.left)/i.width*2-1,t.y=-(e.clientY-i.top)/i.height*2+1):e.touches[0]?(t.x=e.touches[0].clientX/window.innerWidth*2-1,t.y=-e.touches[0].clientY/window.innerHeight*2+1):(t.x=e.changedTouches[0].clientX/window.innerWidth*2-1,t.y=-e.changedTouches[0].clientY/window.innerHeight*2+1),t}onCanvasTouch(e){const t=this.getNormalizedTouchCoords(e);this.onTouch&&this.onTouch(t);}onCanvasTouchStart(e){const t=this.getNormalizedTouchCoords(e);this.onTouchStart&&this.onTouchStart(t);}onCanvasTouchMove(e){const t=this.getNormalizedTouchCoords(e);this.onTouchMove&&this.onTouchMove(t);}onCanvasTouchEnd(e){const t=this.getNormalizedTouchCoords(e);this.onTouchEnd&&this.onTouchEnd(t);}}
|
44
44
|
|
@@ -48,7 +48,7 @@ class IMUManager{constructor(e,t){this.uiManager=e,this.deviceManager=t,this.sta
|
|
48
48
|
|
49
49
|
class IndexedDBManager{constructor(e,r){this.dbName=e,this.storeName=r;}async getFromCacheOrFetch(e,r){let t=null;try{t=await this.getFileFromIndexedDB(e);}catch(e){console.log("An error occurred while trying to get element from indexedDB.");}return t||(t=await this.fetchAndCacheFile(r,e)),new Uint8Array(t)}async getFileFromIndexedDB(e){return new Promise(((r,t)=>{const o=indexedDB.open(this.dbName);o.onerror=()=>t(o.error),o.onsuccess=()=>{const s=o.result.transaction(this.storeName,"readonly").objectStore(this.storeName).get(e);s.onsuccess=()=>r(s.result),s.onerror=()=>t(s.error);},o.onupgradeneeded=e=>{e.target.result.createObjectStore(this.storeName);};}))}async saveFileToIndexedDB(e,r){return new Promise(((t,o)=>{const s=indexedDB.open(this.dbName);s.onerror=()=>o(s.error),s.onupgradeneeded=e=>{e.target.result.createObjectStore(this.storeName);},s.onsuccess=()=>{try{const n=s.result.transaction(this.storeName,"readwrite"),a=n.objectStore(this.storeName).put(r,e);a.onsuccess=()=>t(a.result),a.onerror=()=>o(a.error);}catch(e){o(e);}};}))}async fetchAndCacheFile(e,r){const t=await fetch(e),o=await t.arrayBuffer();return await this.saveFileToIndexedDB(r,o),o}}
|
50
50
|
|
51
|
-
class WorkerExtractionData{constructor(l,Z,b,d,G,m,c=5,X=!1){this.data=l,this.width=Z,this.height=b,this.rotate=d,this.flip=G,this.colorSpace=c,this.onlyCoarse=X,this.dtype=m;}}class WorkerMatchingData{constructor(l,Z,b,d){this.idx=l,this.from=Z,this.to=b,this.dtype=d;}}class WorkerManager{constructor(){this.workers={},this.callbacks={};this.indexedDBManager=new IndexedDBManager("onirix-sdk","files");}workerExists(l){return void 0!==this.workers[l]&&void 0!==this.callbacks[l]}createExtractionWorker(l,Z){if(!this.workerExists(l)){let b=atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319Cgp2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7CglyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4Owp9Cgp2YXIgb3J0X21pbiA9IHtleHBvcnRzOiB7fX07CgpvcnRfbWluLmV4cG9ydHM7KGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXt2YXIgdDt0PSgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17NTcxNjooZSx0LG4pPT57dC5SPXZvaWQgMDtjb25zdCByPW4oNjAyNyksbz1uKDE3MjMpO3QuUj1uZXcgY2xhc3N7YXN5bmMgaW5pdCgpe31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHIuU2Vzc2lvbih0KTtyZXR1cm4gYXdhaXQgbi5sb2FkTW9kZWwoZSksbmV3IG8uT25ueGpzU2Vzc2lvbkhhbmRsZXIobil9fTt9LDI4MTg6KGUsdCxuKT0+e3QuYzg9dC5yWD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89big1MzgxKSxpPW4oOTU0NCkscz1uKDY2NDApO3Quclg9KCk9PntpZigoIm51bWJlciIhPXR5cGVvZiByLmVudi53YXNtLmluaXRUaW1lb3V0fHxyLmVudi53YXNtLmluaXRUaW1lb3V0PDApJiYoci5lbnYud2FzbS5pbml0VGltZW91dD0wKSwiYm9vbGVhbiIhPXR5cGVvZiByLmVudi53YXNtLnNpbWQmJihyLmVudi53YXNtLnNpbWQ9ITApLCJib29sZWFuIiE9dHlwZW9mIHIuZW52Lndhc20ucHJveHkmJihyLmVudi53YXNtLnByb3h5PSExKSwibnVtYmVyIiE9dHlwZW9mIHIuZW52Lndhc20ubnVtVGhyZWFkc3x8IU51bWJlci5pc0ludGVnZXIoci5lbnYud2FzbS5udW1UaHJlYWRzKXx8ci5lbnYud2FzbS5udW1UaHJlYWRzPD0wKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yPygwLCBvLmNwdXMpKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O3IuZW52Lndhc20ubnVtVGhyZWFkcz1NYXRoLm1pbig0LE1hdGguY2VpbCgoZXx8MSkvMikpO319LHQuYzg9bmV3IGNsYXNze2FzeW5jIGluaXQoKXsoMCwgdC5yWCkoKSxhd2FpdCgwLCBpLmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlKSgpO31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHMuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyO3JldHVybiBhd2FpdCBuLmxvYWRNb2RlbChlLHQpLFByb21pc2UucmVzb2x2ZShuKX19O30sMTA1NzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oMjIzNSksdCk7Y29uc3QgaT1uKDIyMzUpLHM9big4NDA4KTt7Y29uc3QgZT1uKDU3MTYpLlI7KDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2ViZ2wiLGUsLTEwKTt9e2NvbnN0IGU9bigyODE4KS5jODsoMCwgaS5yZWdpc3RlckJhY2tlbmQpKCJjcHUiLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoIndhc20iLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoInhubnBhY2siLGUsOSksKDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2Vibm4iLGUsOSk7fWkuZW52LnZlcnNpb25zLndlYj1zLnZlcnNpb247fSw0OTEwOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5PXZvaWQgMDtjbGFzcyBue2NvbnN0cnVjdG9yKGUpe09iamVjdC5hc3NpZ24odGhpcyxlKTt9Z2V0IGNhY2hlS2V5KCl7cmV0dXJuIHRoaXMuX2NhY2hlS2V5fHwodGhpcy5fY2FjaGVLZXk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykuc29ydCgpLm1hcCgoZT0+YCR7dGhpc1tlXX1gKSkuam9pbigiOyIpKSx0aGlzLl9jYWNoZUtleX19dC5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXk9ZT0+bmV3IG4oZSk7fSw2ODc0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5BdHRyaWJ1dGU9dm9pZCAwO2NvbnN0IHI9big1MTI3KSxvPW4oMjQ0NiksaT1uKDkyNDApLHM9big3MjczKTt2YXIgYT1yLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7Y2xhc3MgdXtjb25zdHJ1Y3RvcihlKXtpZih0aGlzLl9hdHRyaWJ1dGVzPW5ldyBNYXAsbnVsbCE9ZSl7Zm9yKGNvbnN0IHQgb2YgZSl0IGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvP3RoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSxbdS5nZXRWYWx1ZSh0KSx1LmdldFR5cGUodCldKTp0IGluc3RhbmNlb2YgYS5BdHRyaWJ1dGUmJnRoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSgpLFt1LmdldFZhbHVlKHQpLHUuZ2V0VHlwZSh0KV0pO2lmKHRoaXMuX2F0dHJpYnV0ZXMuc2l6ZTxlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZWQgYXR0cmlidXRlIG5hbWVzIil9fXNldChlLHQsbil7dGhpcy5fYXR0cmlidXRlcy5zZXQoZSxbbix0XSk7fWRlbGV0ZShlKXt0aGlzLl9hdHRyaWJ1dGVzLmRlbGV0ZShlKTt9Z2V0RmxvYXQoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiZmxvYXQiLHQpfWdldEludChlLHQpe3JldHVybiB0aGlzLmdldChlLCJpbnQiLHQpfWdldFN0cmluZyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmciLHQpfWdldFRlbnNvcihlLHQpe3JldHVybiB0aGlzLmdldChlLCJ0ZW5zb3IiLHQpfWdldEZsb2F0cyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJmbG9hdHMiLHQpfWdldEludHMoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiaW50cyIsdCl9Z2V0U3RyaW5ncyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmdzIix0KX1nZXRUZW5zb3JzKGUsdCl7cmV0dXJuIHRoaXMuZ2V0KGUsInRlbnNvcnMiLHQpfWdldChlLHQsbil7Y29uc3Qgcj10aGlzLl9hdHRyaWJ1dGVzLmdldChlKTtpZih2b2lkIDA9PT1yKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO3Rocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgYXR0cmlidXRlIG5vdCBmb3VuZDogJHtlfWApfWlmKHJbMV0hPT10KXRocm93IG5ldyBFcnJvcihgdHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0fSBidXQgZ290ICR7clsxXX1gKTtyZXR1cm4gclswXX1zdGF0aWMgZ2V0VHlwZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO3N3aXRjaCh0KXtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiAiZmxvYXQiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiAiaW50IjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gInN0cmluZyI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1I6cmV0dXJuICJ0ZW5zb3IiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiAiZmxvYXRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVFM6cmV0dXJuICJpbnRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6cmV0dXJuICJzdHJpbmdzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6cmV0dXJuICJ0ZW5zb3JzIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgYXR0cmlidXRlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6ICR7by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbdF19YCl9fXN0YXRpYyBnZXRWYWx1ZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSHx8dD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkdSQVBIUyl0aHJvdyBuZXcgRXJyb3IoImdyYXBoIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0IG49dGhpcy5nZXRWYWx1ZU5vQ2hlY2soZSk7aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVCYmcy5Mb25nVXRpbC5pc0xvbmcobikpcmV0dXJuIHMuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKG4pO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTKXtjb25zdCBlPW4sdD1uZXcgQXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07dFtuXT1zLkxvbmdVdGlsLmxvbmdUb051bWJlcihyKTt9cmV0dXJuIHR9aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUilyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9pLlRlbnNvci5mcm9tUHJvdG8obik6aS5UZW5zb3IuZnJvbU9ydFRlbnNvcihuKTtpZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUyl7aWYoZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21Qcm90byhlKSkpO2lmKGUgaW5zdGFuY2VvZiBhLkF0dHJpYnV0ZSlyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21PcnRUZW5zb3IoZSkpKX1pZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HJiZlIGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvKXtjb25zdCBlPW47cmV0dXJuICgwLCBzLmRlY29kZVV0ZjhTdHJpbmcpKGUpfXJldHVybiB0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HUyYmZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9uLm1hcChzLmRlY29kZVV0ZjhTdHJpbmcpOm59c3RhdGljIGdldFZhbHVlTm9DaGVjayhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz90aGlzLmdldFZhbHVlTm9DaGVja0Zyb21Pbm54Rm9ybWF0KGUpOnRoaXMuZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ubnhGb3JtYXQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVDpyZXR1cm4gZS5mO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiBlLmk7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuIGUucztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUjpyZXR1cm4gZS50O2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEg6cmV0dXJuIGUuZztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUUzpyZXR1cm4gZS5mbG9hdHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTOnJldHVybiBlLmludHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkdTOnJldHVybiBlLnN0cmluZ3M7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1JTOnJldHVybiBlLnRlbnNvcnM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSFM6cmV0dXJuIGUuZ3JhcGhzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZTogJHtvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdfWApfX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKXtzd2l0Y2goZS50eXBlKCkpe2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiBlLmYoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuIGUuaSgpO2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gZS5zKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuVEVOU09SOnJldHVybiBlLnQoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5HUkFQSDpyZXR1cm4gZS5nKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiBlLmZsb2F0c0FycmF5KCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuSU5UUzp7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPGUuaW50c0xlbmd0aCgpO24rKyl0LnB1c2goZS5pbnRzKG4pKTtyZXR1cm4gdH1jYXNlIGEuQXR0cmlidXRlVHlwZS5TVFJJTkdTOntjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5zdHJpbmdzTGVuZ3RoKCk7bisrKXQucHVzaChlLnN0cmluZ3MobikpO3JldHVybiB0fWNhc2UgYS5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6e2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLnRlbnNvcnNMZW5ndGgoKTtuKyspdC5wdXNoKGUudGVuc29ycyhuKSk7cmV0dXJuIHR9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlOiAke2EuQXR0cmlidXRlVHlwZVtlLnR5cGUoKV19YCl9fX10LkF0dHJpYnV0ZT11O30sMTk3NTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVzb2x2ZUJhY2tlbmQ9dC5iYWNrZW5kPXZvaWQgMDtjb25zdCByPW4oNDQxOCksbz1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIGkoZSl7Y29uc3Qgbj10LmJhY2tlbmQ7aWYodm9pZCAwIT09bltlXSYmZnVuY3Rpb24oZSl7Y29uc3QgdD1lO3JldHVybiAiaW5pdGlhbGl6ZSJpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5pbml0aWFsaXplJiYiY3JlYXRlU2Vzc2lvbkhhbmRsZXIiaW4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY3JlYXRlU2Vzc2lvbkhhbmRsZXImJiJkaXNwb3NlImluIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpc3Bvc2V9KG5bZV0pKXtjb25zdCB0PW5bZV07bGV0IHI9dC5pbml0aWFsaXplKCk7aWYoIm9iamVjdCI9PXR5cGVvZiByJiYidGhlbiJpbiByJiYocj1hd2FpdCByKSxyKXJldHVybiBvLnNldChlLHQpLHR9fXQuYmFja2VuZD17d2ViZ2w6bmV3IHIuV2ViR0xCYWNrZW5kfSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGZ1bmN0aW9uIGUodCl7aWYoIXQpcmV0dXJuIGUoWyJ3ZWJnbCJdKTt7Y29uc3QgZT0ic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQ7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT1vLmdldCh0KTtpZihlKXJldHVybiBlO2NvbnN0IG49YXdhaXQgaSh0KTtpZihuKXJldHVybiBufX10aHJvdyBuZXcgRXJyb3IoIm5vIGF2YWlsYWJsZSBiYWNrZW5kIHRvIHVzZSIpfTt9LDQ0MTg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQmFja2VuZD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oMjE3MSkscz1uKDMzODkpO3QuV2ViR0xCYWNrZW5kPWNsYXNze2dldCBjb250ZXh0SWQoKXtyZXR1cm4gci5lbnYud2ViZ2wuY29udGV4dElkfXNldCBjb250ZXh0SWQoZSl7ci5lbnYud2ViZ2wuY29udGV4dElkPWU7fWdldCBtYXRtdWxNYXhCYXRjaFNpemUoKXtyZXR1cm4gci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplfXNldCBtYXRtdWxNYXhCYXRjaFNpemUoZSl7ci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplPWU7fWdldCB0ZXh0dXJlQ2FjaGVNb2RlKCl7cmV0dXJuIHIuZW52LndlYmdsLnRleHR1cmVDYWNoZU1vZGV9c2V0IHRleHR1cmVDYWNoZU1vZGUoZSl7ci5lbnYud2ViZ2wudGV4dHVyZUNhY2hlTW9kZT1lO31nZXQgcGFjaygpe3JldHVybiByLmVudi53ZWJnbC5wYWNrfXNldCBwYWNrKGUpe3IuZW52LndlYmdsLnBhY2s9ZTt9Z2V0IGFzeW5jKCl7cmV0dXJuIHIuZW52LndlYmdsLmFzeW5jfXNldCBhc3luYyhlKXtyLmVudi53ZWJnbC5hc3luYz1lO31pbml0aWFsaXplKCl7dHJ5e3JldHVybiB0aGlzLmdsQ29udGV4dD0oMCxzLmNyZWF0ZVdlYkdMQ29udGV4dCkodGhpcy5jb250ZXh0SWQpLCJudW1iZXIiIT10eXBlb2YgdGhpcy5tYXRtdWxNYXhCYXRjaFNpemUmJih0aGlzLm1hdG11bE1heEJhdGNoU2l6ZT0xNiksInN0cmluZyIhPXR5cGVvZiB0aGlzLnRleHR1cmVDYWNoZU1vZGUmJih0aGlzLnRleHR1cmVDYWNoZU1vZGU9ImZ1bGwiKSwiYm9vbGVhbiIhPXR5cGVvZiB0aGlzLnBhY2smJih0aGlzLnBhY2s9ITEpLCJib29sZWFuIiE9dHlwZW9mIHRoaXMuYXN5bmMmJih0aGlzLmFzeW5jPSExKSxvLkxvZ2dlci5zZXRXaXRoRW52KHIuZW52KSxvLkxvZ2dlci52ZXJib3NlKCJXZWJHTEJhY2tlbmQiLGBDcmVhdGVkIFdlYkdMQ29udGV4dDogJHt0eXBlb2YgdGhpcy5nbENvbnRleHR9IHdpdGggbWF0bXVsTWF4QmF0Y2hTaXplOiAke3RoaXMubWF0bXVsTWF4QmF0Y2hTaXplfTsgdGV4dHVyZUNhY2hlTW9kZTogJHt0aGlzLnRleHR1cmVDYWNoZU1vZGV9OyBwYWNrOiAke3RoaXMucGFja307IGFzeW5jOiAke3RoaXMuYXN5bmN9LmApLCEwfWNhdGNoKGUpe3JldHVybiBvLkxvZ2dlci53YXJuaW5nKCJXZWJHTEJhY2tlbmQiLGBVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTEJhY2tlbmQuICR7ZX1gKSwhMX19Y3JlYXRlU2Vzc2lvbkhhbmRsZXIoZSl7cmV0dXJuIG5ldyBpLldlYkdMU2Vzc2lvbkhhbmRsZXIodGhpcyxlKX1kaXNwb3NlKCl7dGhpcy5nbENvbnRleHQuZGlzcG9zZSgpO319O30sNjg1OTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ29vcmRzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpLG89bigxOTk3KSxpPW4oNjc1Nykscz1uKDc2MTgpLGE9big0MzIpO2NsYXNzIHUgZXh0ZW5kcyBvLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMub2Zmc2V0VG9Db29yZHMoKSksdGhpcy5jb29yZHNUb09mZnNldCgpKSx0aGlzLnRvVmVjKCkpLHRoaXMudmFsdWVGcm9tKCkpLHRoaXMuZ2V0Q29tbW9uVXRpbEZ1bmNzKCkpLHRoaXMuZ2V0SW5wdXRzU2FtcGxpbmdTbmlwcGV0cygpKSx0aGlzLmdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1vZmZzZXRUb0Nvb3Jkcygpe3JldHVybiB7b2Zmc2V0VG9Db29yZHM6bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBvZmZzZXRUb0Nvb3JkcyhpbnQgb2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHtcbiAgICAgICAgaW50IHQgPSBvZmZzZXQgLyB3aWR0aDtcbiAgICAgICAgaW50IHMgPSBvZmZzZXQgLSB0KndpZHRoO1xuICAgICAgICB2ZWMyIGNvb3JkcyA9ICh2ZWMyKHMsdCkgKyB2ZWMyKDAuNSwwLjUpKSAvIHZlYzIod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgICB9XG4gICAgICAiKX19Y29vcmRzVG9PZmZzZXQoKXtyZXR1cm4ge2Nvb3Jkc1RvT2Zmc2V0Om5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIGludCBjb29yZHNUb09mZnNldCh2ZWMyIGNvb3JkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7XG4gICAgICAgIGZsb2F0IHMgPSBjb29yZHMucyAqIGZsb2F0KHdpZHRoKTtcbiAgICAgICAgZmxvYXQgdCA9IGNvb3Jkcy50ICogZmxvYXQoaGVpZ2h0KTtcbiAgICAgICAgaW50IG9mZnNldCA9IGludCh0KSAqIHdpZHRoICsgaW50KHMpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfVxuICAgICAgIil9fWdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQ7cmV0dXJuIGUuaXNQYWNrZWQ/dGhpcy5nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSk6dGhpcy5nZXRVbnBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChlKX1nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSl7Y29uc3QgdD1lLnVucGFja2VkU2hhcGUsbj1bZS53aWR0aCxlLmhlaWdodF0scj17fSxzPSJnZXRPdXRwdXRDb29yZHMiO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJbc109dGhpcy5nZXRPdXRwdXRTY2FsYXJDb29yZHMoKTticmVhaztjYXNlIDE6cltzXT10aGlzLmdldE91dHB1dFBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWQyRENvb3Jkcyh0LG4pO2JyZWFrO2Nhc2UgMzpyW3NdPXRoaXMuZ2V0T3V0cHV0UGFja2VkM0RDb29yZHModCxuKTticmVhaztkZWZhdWx0OnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWRORENvb3Jkcyh0LG4pO31jb25zdCBhPWBcbiAgICAgIHZvaWQgc2V0T3V0cHV0KHZlYzQgdmFsKSB7XG4gICAgICAgICR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmFsO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIHIuZmxvYXRUZXh0dXJlU2V0UkdCQT1uZXcgby5HbHNsTGliUm91dGluZShhKSxyfWdldFVucGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KGUpe2NvbnN0IHQ9ZS51bnBhY2tlZFNoYXBlLG49W2Uud2lkdGgsZS5oZWlnaHRdLHI9e30scz0iZ2V0T3V0cHV0Q29vcmRzIjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyW3NdPXRoaXMuZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7YnJlYWs7Y2FzZSAxOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDJEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAzOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDNEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA0OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA1OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA2OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKHQsbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG91dHB1dCBkaW1lbnNpb25hbGl0eTogJHt0Lmxlbmd0aH1gKX1jb25zdCBhPWBcbiAgICAgICAgdm9pZCBzZXRPdXRwdXQoZmxvYXQgdmFsKSB7XG4gICAgICAgICAgJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICBgO3JldHVybiByLmZsb2F0VGV4dHVyZVNldFI9bmV3IG8uR2xzbExpYlJvdXRpbmUoYSkscn1nZXRPdXRwdXRTY2FsYXJDb29yZHMoKXtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgIil9Z2V0T3V0cHV0UGFja2VkMURDb29yZHMoZSx0KXtjb25zdCBuPXQ7bGV0IHI9IiI7cmV0dXJuIDE9PT1uWzBdPyhyPWBcbiAgICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiBpbnQoVGV4Q29vcmRzLnkgKiAke25bMV19LjApO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSk6MT09PW5bMV0/KHI9YFxuICAgICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gMiAqIGludChUZXhDb29yZHMueCAqICR7blswXX0uMCk7XG4gICAgICAgICAgfVxuICAgICAgICBgLG5ldyBvLkdsc2xMaWJSb3V0aW5lKHIpKToocj1gXG4gICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueSAqICR7blswXX0gKyByZXNUZXhSQy54KTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSl9Z2V0T3V0cHV0UGFja2VkMkRDb29yZHMoZSx0KXtsZXQgbj0iIjtpZihyLkFycmF5VXRpbC5hcnJheXNFcXVhbChlLHQpKXJldHVybiBuPWBcbiAgICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIHJldHVybiAyICogaXZlYzIoVGV4Q29vcmRzLnh5ICogdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgIH1cbiAgICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobik7Y29uc3QgaT10LHM9TWF0aC5jZWlsKGVbMV0vMik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7aVswXX0sICR7aVsxXX0pKTtcblxuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke2lbMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgICBpbnQgciA9IGltb2QoaW5kZXgsICR7c30pICogMjtcbiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke3N9KTtcblxuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVsyXS8yKSxpPXIqTWF0aC5jZWlsKGVbMV0vMikscz1gXG4gICAgICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtuWzBdfSwgJHtuWzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIGludCBiID0gaW5kZXggLyAke2l9O1xuICAgICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZVxuICAgICAgICAgIGludCByID0gaW1vZChpbmRleCwgJHtyfSkgKiAyO1xuICAgICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgICAgcmV0dXJuIGl2ZWMzKGIsIHIsIGMpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzKX1nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVtlLmxlbmd0aC0xXS8yKSxpPXIqTWF0aC5jZWlsKGVbZS5sZW5ndGgtMl0vMik7bGV0IHM9aSxhPSIiLHU9ImIsIHIsIGMiO2ZvcihsZXQgdD0yO3Q8ZS5sZW5ndGgtMTt0Kyspcyo9ZVtlLmxlbmd0aC10LTFdLGE9YFxuICAgICAgaW50IGIke3R9ID0gaW5kZXggLyAke3N9O1xuICAgICAgaW5kZXggLT0gYiR7dH0gKiAke3N9O1xuICAgIGArYSx1PWBiJHt0fSwgYCt1O2NvbnN0IGw9YFxuICAgICAgaXZlYyR7ZS5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAke2F9XG5cbiAgICAgICAgaW50IGIgPSBpbmRleCAvICR7aX07XG4gICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke3J9KSAqIDI7XG4gICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgIHJldHVybiBpdmVjJHtlLmxlbmd0aH0oJHt1fSk7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCl9Z2V0T3V0cHV0VW5wYWNrZWQxRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQyRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgaW50IHIgPSBpbmRleCAvICR7ZVsxXX07XG4gICAgICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiAke2VbMV19O1xuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQzRENvb3JkcyhlLHQpe2xldCBuPSIiO2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bnVsbDtyPDImJihpPVtdKSxpPW5ldyBBcnJheShyLTEpLGlbci0yXT1lW3ItMV07Zm9yKGxldCB0PXItMzt0Pj0wOy0tdClpW3RdPWlbdCsxXSplW3QrMV07Y29uc3Qgcz1bInIiLCJjIiwiZCJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgJHthfVxuICAgICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiXSxhPWkubWFwKCgoZSx0KT0+YGludCAke3NbdF19ID0gaW5kZXggLyAke2V9OyAke3Q9PT1pLmxlbmd0aC0xP2BpbnQgJHtzW3QrMV19ID0gaW5kZXggLSAke3NbdF19ICogJHtlfWA6YGluZGV4IC09ICR7c1t0XX0gKiAke2V9YH07YCkpLmpvaW4oIiIpO3JldHVybiBuPWBcbiAgICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0WzBdfSwgJHt0WzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICAke2F9XG4gICAgICAgICAgcmV0dXJuIGl2ZWM0KHIsIGMsIGQsIGQyKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7dFswXX0gKyByZXNUZXhSQy54O1xuICAgICAgICAgICR7YX1cbiAgICAgICAgICByZXR1cm4gaXZlYzUociwgYywgZCwgZDIsIGQzKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyIsImQ0Il0sYT1pLm1hcCgoKGUsdCk9PmBpbnQgJHtzW3RdfSA9IGluZGV4IC8gJHtlfTsgJHt0PT09aS5sZW5ndGgtMT9gaW50ICR7c1t0KzFdfSA9IGluZGV4IC0gJHtzW3RdfSAqICR7ZX1gOmBpbmRleCAtPSAke3NbdF19ICogJHtlfWB9O2ApKS5qb2luKCIiKTtyZXR1cm4gbj1gXG4gICAgIGl2ZWM2IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICR7YX1cbiAgICAgICAgIHJldHVybiBpdmVjNihyLCBjLCBkLCBkMiwgZDMsIGQ0KTtcbiAgICAgICB9XG4gICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0Q29tbW9uVXRpbEZ1bmNzKCl7Y29uc3QgZT17fTtsZXQgdD0idXZGcm9tRmxhdCI7ZVt0XT1uZXcgby5HbHNsTGliUm91dGluZSgiXG4gICAgdmVjMiB1dkZyb21GbGF0KGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC8gdGV4TnVtUjtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLSB0ZXhDICogdGV4TnVtUjtcbiAgICAgIC8vIFRPRE86IHN3YXAgdGV4UiwgdGV4QyBvcmRlciBpbiBmb2xsb3dpbmcgZnVuY3Rpb24gc28gcm93IGlzIGNvcnJlc3BvbmRpbmcgdG8gdSBhbmQgY29sdW1uIGlzIGNvcnJlc3BvbmRpbmcgdG9cbiAgICAgIC8vICAgICAgIHYuXG4gICAgICByZXR1cm4gKHZlYzIodGV4UiwgdGV4QykgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1SLCB0ZXhOdW1DKTtcbiAgICB9XG4gICAgIiksdD0icGFja2VkVVZmcm9tMUQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20xRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBpbmRleCkge1xuICAgICAgICBpbnQgdGV4ZWxJbmRleCA9IGluZGV4IC8gMjtcbiAgICAgICAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSB0ZXhlbEluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xuICAgICAgfVxuICAgICAgIiksdD0icGFja2VkVVZmcm9tMkQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20yRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgaW50IHRleGVsSW5kZXggPSAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7XG4gICAgICAgIGludCB0ZXhSID0gdGV4ZWxJbmRleCAvIHRleE51bUM7XG4gICAgICAgIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InBhY2tlZFVWZnJvbTNEIixlW3RdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIHZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgICAgICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICAgICAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICAgICAgICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InNhbXBsZVRleHR1cmUiO2NvbnN0IG49KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm4gZVt0XT1uZXcgby5HbHNsTGliUm91dGluZShgXG4gICAgICAgIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XG4gICAgICAgICAgICByZXR1cm4gJHtuLnRleHR1cmUyRH0odGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xuICAgICAgICB9YCksZX1nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCl7Y29uc3QgZT17fSx0PXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgobixyKT0+e2NvbnN0IG89dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbcl0saT0oMCwgYS5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWUpKG4pO28uaXNQYWNrZWQ/ZVtpXT10aGlzLmdldFBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pOmVbaV09dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pO2NvbnN0IHM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHMpKG4pO28udW5wYWNrZWRTaGFwZS5sZW5ndGg8PXQudW5wYWNrZWRTaGFwZS5sZW5ndGgmJihvLmlzUGFja2VkP2Vbc109dGhpcy5nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMocyxvLHQsbik6ZVtzXT10aGlzLmdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKHMsbyx0LG4pKTt9KSksZX1nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz10LnVucGFja2VkU2hhcGUsdT1uLnVucGFja2VkU2hhcGUsbD1pLGM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lKShsKSxwPXMubGVuZ3RoLGQ9dS5sZW5ndGgsZj1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhzLHUpLGg9KDAsIGEuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLGc9ZC1wO2xldCBiO2NvbnN0IG09KDAsIGEuZ2V0R2xDaGFubmVscykoKTtiPTA9PT1wPyIiOmQ8MiYmZi5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpmLm1hcCgoZT0+YGNvb3Jkcy4ke21bZStnXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB5PSIiO3k9ZDwyJiZwPjA/ImNvb3JkcyI6cy5tYXAoKChlLHQpPT5gY29vcmRzLiR7bVt0K2ddfWApKS5qb2luKCIsICIpO2xldCB2PSJyZXR1cm4gb3V0cHV0VmFsdWU7Ijtjb25zdCBfPTE9PT1yLlNoYXBlVXRpbC5zaXplKHMpLHc9MT09PXIuU2hhcGVVdGlsLnNpemUodSk7aWYoMSE9PXB8fF98fHcpe2lmKF8mJiF3KXY9MT09PWQ/IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLngsIDAuLCAwLik7XG4gICAgICAgICI6IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO1xuICAgICAgICAiO2Vsc2UgaWYoZi5sZW5ndGgpe2NvbnN0IGU9cC0yLHQ9cC0xO2YuaW5kZXhPZihlKT4tMSYmZi5pbmRleE9mKHQpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpOyI6Zi5pbmRleE9mKGUpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnksIG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpOyI6Zi5pbmRleE9mKHQpPi0xJiYodj0icmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHgsIG91dHB1dFZhbHVlLnp6KTsiKTt9fWVsc2Ugdj0iXG4gICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh5LCBvdXRwdXRWYWx1ZS54eSk7XG4gICAgICAiO2NvbnN0IFQ9YFxuICAgICAgdmVjNCAke2V9KCkge1xuICAgICAgICAke2h9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBcbiAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHttW2QtMV19O1xuICAgICAgICBjb29yZHMuJHttW2QtMV19ID0gY29vcmRzLiR7bVtkLTJdfTtcbiAgICAgICAgY29vcmRzLiR7bVtkLTJdfSA9IGxhc3REaW07XG4gICAgICBcbiAgICAgICAgJHtifVxuICAgICAgICB2ZWM0IG91dHB1dFZhbHVlID0gJHtjfSgke3l9KTtcbiAgICAgICAgJHt2fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKFQsWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz1bbi53aWR0aCxuLmhlaWdodF0sdT1bdC53aWR0aCx0LmhlaWdodF0sbD10LnVucGFja2VkU2hhcGUubGVuZ3RoLGM9bi51bnBhY2tlZFNoYXBlLmxlbmd0aCxwPXQudW5wYWNrZWRTaGFwZSxkPW4udW5wYWNrZWRTaGFwZSxmPSgwLCBhLmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZSkoaSk7aWYobD09PWMmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKHUscykpe2NvbnN0IHQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2l9LCBUZXhDb29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Y29uc3QgaD0oMCwgYS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhwLGQpLGI9Yy1sO2xldCBtO2NvbnN0IHk9KDAsIGEuZ2V0R2xDaGFubmVscykoKTttPTA9PT1sPyIiOmM8MiYmZy5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpnLm1hcCgoZT0+YGNvb3Jkcy4ke3lbZStiXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB2PSIiO3Y9YzwyJiZsPjA/ImNvb3JkcyI6dC51bnBhY2tlZFNoYXBlLm1hcCgoKGUsdCk9PmBjb29yZHMuJHt5W3QrYl19YCkpLmpvaW4oIiwgIik7Y29uc3QgXz1gXG4gICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgJHtofSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICAke219XG4gICAgICAgICAgcmV0dXJuICR7Zn0oJHt2fSk7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKF8sWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsbil7c3dpdGNoKG4udW5wYWNrZWRTaGFwZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGUsdCk7Y2FzZSAxOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIxRChlLHQsbik7Y2FzZSAyOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIyRChlLHQsbik7Y2FzZSAzOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIzRChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyTkQoZSx0LG4pfX1nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbik7Y2FzZSAxOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjFEKGUsdCxuKTtjYXNlIDI6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pO2Nhc2UgMzpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbik7Y2FzZSA0OnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjREKGUsdCxuKTtjYXNlIDU6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyNUQoZSx0LG4pO2Nhc2UgNjpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXI2RChlLHQsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRpbWVuc2lvbiAke3IubGVuZ3RofS1EYCl9fWdldFBhY2tlZFNhbXBsZXJTY2FsYXIoZSx0KXtjb25zdCBuPWBcbiAgICAgICAgICB2ZWM0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4pfWdldFBhY2tlZFNhbXBsZXIxRChlLHQsbil7Y29uc3Qgcj1bbi53aWR0aCxuLmhlaWdodF0scz1bclsxXSxyWzBdXSxhPSgwLCBpLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbiksdT1gdmVjNCAke2V9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKFxuICAgICAgJHtzWzBdfSwgJHtzWzFdfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICB9YDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodSxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTFEIl0pfWdldFBhY2tlZFNhbXBsZXIyRChlLHQsbil7Y29uc3Qgcz1uLnVucGFja2VkU2hhcGUsYT1bbi53aWR0aCxuLmhlaWdodF0sdT0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLGw9YVswXSxjPWFbMV07aWYobnVsbCE9YSYmci5BcnJheVV0aWwuYXJyYXlzRXF1YWwocyxhKSl7Y29uc3Qgbj1gdmVjNCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7Y30uMCwgJHtsfS4wKTtcbiAgICAgICAgcmV0dXJuICR7dS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICAgIH1gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuKX1jb25zdCBwPWEsZD1NYXRoLmNlaWwoc1sxXS8yKSxmPWB2ZWM0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKCR7cFsxXX0sICR7cFswXX0sICR7ZH0sIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsWyJjb29yZGluYXRlcy5wYWNrZWRVVmZyb20yRCJdKX1nZXRQYWNrZWRTYW1wbGVyM0QoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLHM9W24ud2lkdGgsbi5oZWlnaHRdLHU9W3NbMF0sc1sxXV0sbD0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pO2lmKDE9PT1yWzBdKXtjb25zdCBpPXIuc2xpY2UoMSkscz1bMSwyXSx1PSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGkpLGw9WyJiIiwicm93IiwiY29sIl0sYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtjLnVucGFja2VkU2hhcGU9dTtjb25zdCBwPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsYyksZD1gJHtwLnJvdXRpbmVCb2R5fVxuICAgICAgdmVjNCAke2V9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKGwscyl9KTtcbiAgICAgIH0gYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoZCxwLmRlcGVuZGVuY2llcyl9Y29uc3QgYz11WzBdLHA9dVsxXSxkPU1hdGguY2VpbChyWzJdLzIpLGY9YHZlYzQgJHtlfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICAke3B9LCAke2N9LCAke2QqTWF0aC5jZWlsKHJbMV0vMil9LCAke2R9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtsLnRleHR1cmUyRH0oJHt0fSwgdXYpO31gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMucGFja2VkVVZmcm9tM0QiXSl9Z2V0UGFja2VkU2FtcGxlck5EKGUsdCxuKXtjb25zdCByPW4udW5wYWNrZWRTaGFwZSxzPXIubGVuZ3RoLGE9W24ud2lkdGgsbi5oZWlnaHRdLHU9KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKSxsPVthWzBdLGFbMV1dLGM9bFsxXSxwPWxbMF0sZD1NYXRoLmNlaWwocltzLTFdLzIpO2xldCBmPWQqTWF0aC5jZWlsKHJbcy0yXS8yKSxoPSJpbnQgYiwgaW50IHJvdywgaW50IGNvbCIsZz1gYiAqICR7Zn0gKyAocm93IC8gMikgKiAke2R9ICsgKGNvbCAvIDIpYDtmb3IobGV0IGU9MjtlPHMtMTtlKyspaD1gaW50IGIke2V9LCBgK2gsZio9cltzLWUtMV0sZz1gYiR7ZX0gKiAke2Z9ICsgYCtnO2NvbnN0IGI9YHZlYzQgJHtlfSgke2h9KSB7XG4gICAgICBpbnQgaW5kZXggPSAke2d9O1xuICAgICAgaW50IHRleFIgPSBpbmRleCAvICR7cH07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqICR7cH07XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3B9LCAke2N9KTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGIpfWdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbil7Y29uc3RbcixpXT1bbi53aWR0aCxuLmhlaWdodF07aWYoMT09PXImJjE9PT1pKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0IHM9YFxuICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtyfSwgJHtpfSk7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtyfSwgJHtpfSwgb2Zmc2V0XyR7dH0pO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUocyxbImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiLCJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMUQoZSx0LG4pe2NvbnN0IHI9bi53aWR0aCxpPW4uaGVpZ2h0O2lmKDE9PT1pJiYxPT09cil7Y29uc3Qgbj1gXG4gICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9aWYoMT09PWkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7cn0uMCwgMC41KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWlmKDE9PT1yKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCBpbmRleCkge1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7aX0uMCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBzPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgaW5kZXgpIHtcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3J9LCAke2l9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pe2NvbnN0IGk9bi51bnBhY2tlZFNoYXBlLHU9W24uaGVpZ2h0LG4ud2lkdGhdO2lmKG51bGwhPXUmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKGksdSkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHJvdywgY29sKSArIGhhbGZDUikgLyB2ZWMyKCR7dVsxXX0uMCwgJHt1WzBdfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0e25ld1NoYXBlOmwsa2VwdERpbXM6Y309KDAsIHMuc3F1ZWV6ZVNoYXBlKShpKSxwPWw7aWYocC5sZW5ndGg8aS5sZW5ndGgpe2NvbnN0IHI9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKGkscCkscz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtzLnVucGFja2VkU2hhcGU9cjtjb25zdCB1PVsiY29sIiwicm93Il0sbD1gXG4gICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQscykucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gJHtlfSgkeygwLCBhLmdldFNxdWVlemVkUGFyYW1zKSh1LGMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBkPXVbMV0sZj11WzBdO2lmKDE9PT1mKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtkfSwgJHtmfSk7XG4gICAgICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCBvZmZzZXRfJHt0fSksIHZlYzMoJHtpWzFdfSwgMSwgMSkpO1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHtkfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9aWYoMT09PWQpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgaW50IG9mZnNldF8ke3R9ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2R9LCAke2Z9KTtcbiAgICAgICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsIG9mZnNldF8ke3R9KSwgdmVjMygke2lbMV19LCAxLCAxKSk7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gJHtmfS4wLCAwLjUpO1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1jb25zdCBoPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgaW50IGluZGV4ID0gY29sICogJHtpWzFdfSArIHJvdztcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke2R9LCAke2Z9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzFdKnJbMl0sdT1yWzJdLHtuZXdTaGFwZTpsLGtlcHREaW1zOmN9PSgwLCBzLnNxdWVlemVTaGFwZSkocikscD1sO2lmKHAubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLHApLHM9WyJiYXRjaCIsImNvbCIsInJvdyJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD10aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsdSksZD1jLnJldmVyc2UoKSxmPWBcbiAgICAgICAgICAke2wucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgYmF0Y2gsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZCl9KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsbC5kZXBlbmRlbmNpZXMpfWNvbnN0IGQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGRlcHRoLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICAgICAgICBpbnQgaW5kZXggPSBkZXB0aCAqICR7aX0gKyBjb2wgKiAke3V9ICsgcm93O1xuICAgICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShkLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXI0RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzNdLHM9clsyXSppLGE9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7clsxXSpzfSArIGNvbCAqICR7c30gK1xuICAgICAgICAgICAgICBkZXB0aDIgKiAke2l9ICsgZGVwdGg7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1nZXRVbnBhY2tlZFNhbXBsZXI1RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzRdLHU9clszXSppLGw9clsyXSp1LGM9clsxXSpsLHtuZXdTaGFwZTpwLGtlcHREaW1zOmR9PSgwLCBzLnNxdWVlemVTaGFwZSkocik7aWYocC5sZW5ndGg8ci5sZW5ndGgpe2NvbnN0IGk9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKHIscCkscz1bInJvdyIsImNvbCIsImRlcHRoIiwiZGVwdGgyIiwiZGVwdGgzIl0sdT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTt1LnVucGFja2VkU2hhcGU9aTtjb25zdCBsPWBcbiAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgICAgcmV0dXJuICR7ZX0oJHsoMCwgYS5nZXRTcXVlZXplZFBhcmFtcykocyxkKX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWNvbnN0IGY9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7Y30gKyBjb2wgKiAke2x9ICsgZGVwdGggKiAke3V9ICtcbiAgICAgICAgICBkZXB0aDMgKiAke2l9ICsgZGVwdGgyO1xuICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyNkQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLGk9cls1XSx1PXJbNF0qaSxsPXJbM10qdSxjPXJbMl0qbCxwPXJbMV0qYyx7bmV3U2hhcGU6ZCxrZXB0RGltczpmfT0oMCwgcy5zcXVlZXplU2hhcGUpKHIpO2lmKGQubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGQpLHM9WyJyb3ciLCJjb2wiLCJkZXB0aCIsImRlcHRoMiIsImRlcHRoMyIsImRlcHRoNCJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD1gXG4gICAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZil9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Y29uc3QgaD1gXG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXG4gICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICBpbnQgaW5kZXggPSByb3cgKiAke3B9ICsgY29sICogJHtjfSArIGRlcHRoICogJHtsfSArXG4gICAgICAgICAgICBkZXB0aDIgKiAke3V9ICsgZGVwdGgzICogJHtpfSArIGRlcHRoNDtcbiAgICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX10b1ZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQsdD1lLnNoYXBlLmxlbmd0aCxuPWUuc3RyaWRlcyxyPWUud2lkdGgsaT1lLmhlaWdodCxzPVtdO2ZvcihsZXQgZT0wO2U8dC0xOysrZSlzLnB1c2goYFxuICAgICAgICBjWyR7ZX1dID0gb2Zmc2V0IC8gJHtuW2VdfTtgKSxzLnB1c2goYFxuICAgICAgICBvZmZzZXQgLT0gY1ske2V9XSAqICR7bltlXX07YCk7cy5wdXNoKGBcbiAgICAgICAgY1ske3QtMX1dID0gb2Zmc2V0O2ApO2NvbnN0IGE9YFxuICAgICAgdm9pZCB0b1ZlYyh2ZWMyIHRleENvb3Jkcywgb3V0IGludCBjWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSBjb29yZHNUb09mZnNldCh0ZXhDb29yZHMsICR7cn0sICR7aX0pO1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgICB2b2lkIHRvVmVjKGludCBvZmZzZXQsIG91dCBpbnQgY1ske3R9XSkge1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgYDtyZXR1cm4ge3RvVmVjOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX19dmFsdWVGcm9tKCl7Y29uc3QgZT17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKHQsbik9Pntjb25zdCByPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLGk9KHIudW5wYWNrZWRTaGFwZS5sZW5ndGg+MD9yLnVucGFja2VkU2hhcGU6ci5zaGFwZSkubGVuZ3RoO2xldCBzPWBfJHt0fWA7ZVtzXT1uZXcgby5HbHNsTGliUm91dGluZSh0aGlzLmdldFZhbHVlRnJvbVNpbmdsZSh0LGksci53aWR0aCxyLmhlaWdodCwhMSksW2BzaGFwZVV0aWxzLmluZGljZXNUb09mZnNldCR7c31gLCJjb29yZGluYXRlcy5vZmZzZXRUb0Nvb3JkcyIsImZyYWdjb2xvci5nZXRDb2xvckFzRmxvYXQiXSkscys9Il9UIixlW3NdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKHRoaXMuZ2V0VmFsdWVGcm9tU2luZ2xlKHQsaSxyLndpZHRoLHIuaGVpZ2h0LCEwKSxbYHNoYXBlVXRpbHMuaW5kaWNlc1RvT2Zmc2V0JHtzfWAsImNvb3JkaW5hdGVzLm9mZnNldFRvQ29vcmRzIiwiZnJhZ2NvbG9yLmdldENvbG9yQXNGbG9hdCJdKTt9KSksZX1nZXRWYWx1ZUZyb21TaW5nbGUoZSx0LG4scixvKXtsZXQgcz1gXyR7ZX1gO3JldHVybiBvJiYocys9Il9UIiksYFxuICAgICAgICBmbG9hdCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldCR7c30obSk7XG4gICAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7bn0sICR7cn0pO1xuICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7ZX0sIGNvb3JkcykpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBgfWdldFBhY2tlZFZhbHVlRnJvbShlLHQsbixyLG8pe2xldCBzPWBfJHtlfV9QYWNrYDtyZXR1cm4gbyYmKHMrPSJfVCIpLGBcbiAgICAgICAgdmVjNCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldF8ke2V9KG0pO1xuICAgICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke259LCAke3J9KTtcbiAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHtlfSwgY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgICBgfX10LkNvb3Jkc0dsc2xMaWI9dTt9LDE5OTc6KGUsdCk9Pnt2YXIgbjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXM9dC5HbHNsTGliUm91dGluZU5vZGU9dC5HbHNsTGliUm91dGluZT10Lkdsc2xMaWI9dC5HbHNsQ29udGV4dD10LkZ1bmN0aW9uVHlwZT12b2lkIDAsKG49dC5GdW5jdGlvblR5cGV8fCh0LkZ1bmN0aW9uVHlwZT17fSkpW24uVmFsdWVCYXNlZD0wXT0iVmFsdWVCYXNlZCIsbltuLlBvc2l0aW9uYWw9MV09IlBvc2l0aW9uYWwiLHQuR2xzbENvbnRleHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLnByb2dyYW1JbmZvPXQsdGhpcy5pbnB1dFRleHR1cmVMYXlvdXRzPW4sdGhpcy5vdXRwdXRUZXh0dXJlTGF5b3V0PXI7fX0sdC5HbHNsTGliPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuY29udGV4dD1lO319LHQuR2xzbExpYlJvdXRpbmU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnJvdXRpbmVCb2R5PWUsdGhpcy5kZXBlbmRlbmNpZXM9dDt9fSx0Lkdsc2xMaWJSb3V0aW5lTm9kZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5kZXBlbmRlbmNpZXM9bnx8W10sdCYmKHRoaXMucm91dGluZUJvZHk9dCk7fWFkZERlcGVuZGVuY3koZSl7ZSYmdGhpcy5kZXBlbmRlbmNpZXMucHVzaChlKTt9fSx0LlRvcG9sb2dpY2FsU29ydEdsc2xSb3V0aW5lcz1jbGFzc3tzdGF0aWMgcmV0dXJuT3JkZXJlZE5vZGVzKGUpe2lmKCFlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIFtdO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZTtjb25zdCB0PW5ldyBTZXQsbj1uZXcgU2V0LHI9bmV3IEFycmF5O3JldHVybiB0aGlzLmNyZWF0ZU9yZGVyZWROb2RlcyhlLHQsbixyKSxyfXN0YXRpYyBjcmVhdGVPcmRlcmVkTm9kZXMoZSx0LG4scil7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pdGhpcy5kZnNUcmF2ZXJzZShlW29dLHQsbixyKTt9c3RhdGljIGRmc1RyYXZlcnNlKGUsdCxuLHIpe2lmKCFlfHxuLmhhcyhlLm5hbWUpKXJldHVybjtpZih0LmhhcyhlLm5hbWUpKXRocm93IG5ldyBFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuIENhbid0IHRvcG9sb2dpY2FsbHkgc29ydCByb3V0aW5lcyBuZWVkZWQgZm9yIHNoYWRlci4iKTt0LmFkZChlLm5hbWUpO2NvbnN0IG89ZS5kZXBlbmRlbmNpZXM7aWYobyYmby5sZW5ndGg+MClmb3IobGV0IGU9MDtlPG8ubGVuZ3RoOysrZSl0aGlzLmRmc1RyYXZlcnNlKG9bZV0sdCxuLHIpO3IucHVzaChlKSxuLmFkZChlLm5hbWUpLHQuZGVsZXRlKGUubmFtZSk7fX07fSwxMzcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5FbmNvZGluZ0dsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KTtjbGFzcyBvIGV4dGVuZHMgci5HbHNsTGlie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO31nZXRGdW5jdGlvbnMoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuZW5jb2RlRmxvYXQzMigpKSx0aGlzLmRlY29kZUZsb2F0MzIoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319ZW5jb2RlRmxvYXQzMigpe3JldHVybiB7ZW5jb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCB2ZWM0IGVuY29kZShoaWdocCBmbG9hdCBmKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KGYsIDAuMCwgMC4wLCAwLjApO1xuICAgICAgfVxuICAgICAgICAiKX19ZGVjb2RlRmxvYXQzMigpe3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCBmbG9hdCBkZWNvZGUoaGlnaHAgdmVjNCByZ2JhKSB7XG4gICAgICAgIHJldHVybiByZ2JhLnI7XG4gICAgICB9XG4gICAgICAgICIpfX1lbmNvZGVVaW50OCgpe2NvbnN0IGU9by5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJuIHtlbmNvZGU6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgaGlnaHAgdmVjNCBlbmNvZGUoaGlnaHAgZmxvYXQgZikge1xuICAgICAgICBoaWdocCBmbG9hdCBGID0gYWJzKGYpO1xuICAgICAgICBoaWdocCBmbG9hdCBTaWduID0gc3RlcCgwLjAsLWYpO1xuICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IGZsb29yKGxvZzIoRikpO1xuICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IChleHAyKC0gRXhwb25lbnQpICogRik7XG4gICAgICAgIEV4cG9uZW50ID0gZmxvb3IobG9nMihGKSArIDEyNy4wKSArIGZsb29yKGxvZzIoTWFudGlzc2EpKTtcbiAgICAgICAgaGlnaHAgdmVjNCByZ2JhO1xuICAgICAgICByZ2JhWzBdID0gMTI4LjAgKiBTaWduICArIGZsb29yKEV4cG9uZW50KmV4cDIoLTEuMCkpO1xuICAgICAgICByZ2JhWzFdID0gMTI4LjAgKiBtb2QoRXhwb25lbnQsMi4wKSArIG1vZChmbG9vcihNYW50aXNzYSoxMjguMCksMTI4LjApO1xuICAgICAgICByZ2JhWzJdID0gZmxvb3IobW9kKGZsb29yKE1hbnRpc3NhKmV4cDIoMjMuMCAtOC4wKSksZXhwMig4LjApKSk7XG4gICAgICAgIHJnYmFbM10gPSBmbG9vcihleHAyKDIzLjApKm1vZChNYW50aXNzYSxleHAyKC0xNS4wKSkpO1xuICAgICAgICAke2V9XG4gICAgICAgIHJnYmEgPSByZ2JhIC8gMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIG5vcm1hbGl6ZWQgdG8gWzAsMV1cbiAgICAgICAgcmV0dXJuIHJnYmE7XG4gICAgfVxuICAgICAgICBgKX19ZGVjb2RlVWludDgoKXtjb25zdCBlPW8uaXNMaXR0bGVFbmRpYW4oKT8icmdiYS5yZ2JhPXJnYmEuYWJncjsiOiIiO3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKGBcbiAgICAgICAgaGlnaHAgZmxvYXQgZGVjb2RlKGhpZ2hwIHZlYzQgcmdiYSkge1xuICAgICAgICAgIHJnYmEgPSByZ2JhICogMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIGRlLW5vcm1hbGl6ZWQgZnJvbSBbMCwxXSB0byBbMCwyNTVdXG4gICAgICAgICAgJHtlfVxuICAgICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSAxLjAgLSBzdGVwKDEyOC4wLHJnYmFbMF0pKjIuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IDIuMCAqIG1vZChyZ2JhWzBdLDEyOC4wKSArIHN0ZXAoMTI4LjAscmdiYVsxXSkgLSAxMjcuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IG1vZChyZ2JhWzFdLDEyOC4wKSo2NTUzNi4wICsgcmdiYVsyXSoyNTYuMCArcmdiYVszXSArIGZsb2F0KDB4ODAwMDAwKTtcbiAgICAgICAgICBoaWdocCBmbG9hdCBSZXN1bHQgPSAgU2lnbiAqIGV4cDIoRXhwb25lbnQpICogKE1hbnRpc3NhICogZXhwMigtMjMuMCApKTtcbiAgICAgICAgICByZXR1cm4gUmVzdWx0O1xuICAgICAgfVxuICAgICAgICBgKX19c3RhdGljIGlzTGl0dGxlRW5kaWFuKCl7Y29uc3QgZT1uZXcgQXJyYXlCdWZmZXIoNCksdD1uZXcgVWludDMyQXJyYXkoZSksbj1uZXcgVWludDhBcnJheShlKTtpZih0WzBdPTM3MzU5Mjg1NTksMjM5PT09blswXSlyZXR1cm4gITA7aWYoMjIyPT09blswXSlyZXR1cm4gITE7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGVuZGlhbm5lc3MiKX19dC5FbmNvZGluZ0dsc2xMaWI9bzt9LDI2OTE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZyYWdDb2xvckdsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oNjc1Nyk7Y2xhc3MgaSBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLnNldEZyYWdDb2xvcigpKSx0aGlzLmdldENvbG9yQXNGbG9hdCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1zZXRGcmFnQ29sb3IoKXtjb25zdCBlPSgwLCBvLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbik7cmV0dXJuIHtzZXRGcmFnQ29sb3I6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgICB2b2lkIHNldEZyYWdDb2xvcihmbG9hdCB2YWx1ZSkge1xuICAgICAgICAgICAgJHtlLm91dHB1dH0gPSBlbmNvZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGAsWyJlbmNvZGluZy5lbmNvZGUiXSl9fWdldENvbG9yQXNGbG9hdCgpe3JldHVybiB7Z2V0Q29sb3JBc0Zsb2F0Om5ldyByLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgICAgZmxvYXQgZ2V0Q29sb3JBc0Zsb2F0KHZlYzQgY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgICIsWyJlbmNvZGluZy5kZWNvZGUiXSl9fX10LkZyYWdDb2xvckdsc2xMaWI9aTt9LDM4Nzg6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXBsYWNlSW5saW5lcz12b2lkIDA7Y29uc3Qgbj0vQGlubGluZVtcc1xuXHJdKyhcdyspW1xzXG5ccl0rKFswLTlhLXpBLVpfXSspXHMqXCgoW14pXSopXClccyp7KChbXn1dfFtcblxyXSkqKX0vZ207dC5yZXBsYWNlSW5saW5lcz1mdW5jdGlvbihlKXtjb25zdCB0PXt9O2xldCByO2Zvcig7bnVsbCE9PShyPW4uZXhlYyhlKSk7KXtjb25zdCBlPXJbM10uc3BsaXQoIiwiKS5tYXAoKGU9Pntjb25zdCB0PWUudHJpbSgpLnNwbGl0KCIgIik7cmV0dXJuIHQmJjI9PT10Lmxlbmd0aD97dHlwZTp0WzBdLG5hbWU6dFsxXX06bnVsbH0pKS5maWx0ZXIoKGU9Pm51bGwhPT1lKSk7dFtyWzJdXT17cGFyYW1zOmUsYm9keTpyWzRdfTt9Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz0iKFxcdyspP1xccysoW18wLTlhLXpBLVpdKylcXHMrPVxccytfX0ZVTkNfX1xcKCguKilcXClcXHMqOyIucmVwbGFjZSgiX19GVU5DX18iLG4pLGk9bmV3IFJlZ0V4cChvLCJnbSIpO2Zvcig7bnVsbCE9PShyPWkuZXhlYyhlKSk7KXtjb25zdCBvPXJbMV0saT1yWzJdLHM9clszXS5zcGxpdCgiLCIpLGE9bz9gJHtvfSAke2l9O2A6IiI7bGV0IHU9dFtuXS5ib2R5LGw9IiI7dFtuXS5wYXJhbXMuZm9yRWFjaCgoKGUsdCk9PntlJiYobCs9YCR7ZS50eXBlfSAke2UubmFtZX0gPSAke3NbdF19O1xuYCk7fSkpLHU9YCR7bH1cbiAke3V9YCx1PXUucmVwbGFjZSgicmV0dXJuIixgJHtpfSA9IGApO2NvbnN0IGM9YFxuICAgICAgJHthfVxuICAgICAge1xuICAgICAgICAke3V9XG4gICAgICB9XG4gICAgICBgO2U9ZS5yZXBsYWNlKHJbMF0sYyk7fX1yZXR1cm4gZS5yZXBsYWNlKG4sIiIpfTt9LDg4OTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lkdsc2xQcmVwcm9jZXNzb3I9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oMzg3OCksaT1uKDEyNDgpLHM9big2NzU3KTt0Lkdsc2xQcmVwcm9jZXNzb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4sbyl7dGhpcy5saWJzPXt9LHRoaXMuZ2xzbExpYlJvdXRpbmVEZXBlbmRlbmN5R3JhcGg9e30sdGhpcy5jb250ZXh0PW5ldyByLkdsc2xDb250ZXh0KGUsdCxuLG8pLE9iamVjdC5rZXlzKGkuZ2xzbFJlZ2lzdHJ5KS5mb3JFYWNoKChlPT57Y29uc3QgdD1uZXcgaS5nbHNsUmVnaXN0cnlbZV0odGhpcy5jb250ZXh0KTt0aGlzLmxpYnNbZV09dDt9KSk7Y29uc3Qgcz10aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoO2Zvcihjb25zdCBlIGluIHRoaXMubGlicyl7Y29uc3QgdD10aGlzLmxpYnNbZV0uZ2V0RnVuY3Rpb25zKCk7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz1lKyIuIituO2xldCBpO3Nbb10/KGk9c1tvXSxpLnJvdXRpbmVCb2R5PXRbbl0ucm91dGluZUJvZHkpOihpPW5ldyByLkdsc2xMaWJSb3V0aW5lTm9kZShvLHRbbl0ucm91dGluZUJvZHkpLHNbb109aSk7Y29uc3QgYT10W25dLmRlcGVuZGVuY2llcztpZihhKWZvcihsZXQgZT0wO2U8YS5sZW5ndGg7KytlKWlmKHNbYVtlXV0paS5hZGREZXBlbmRlbmN5KHNbYVtlXV0pO2Vsc2Uge2NvbnN0IHQ9bmV3IHIuR2xzbExpYlJvdXRpbmVOb2RlKGFbZV0pO3NbYVtlXV09dCxpLmFkZERlcGVuZGVuY3kodCk7fX19fXByZXByb2Nlc3MoKXtjb25zdCBlPXRoaXMuY29udGV4dC5wcm9ncmFtSW5mbztsZXQgdD1lLnNoYWRlclNvdXJjZTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmhhc01haW58fCh0PWAke3R9XG4gICAgICAkeygwLCBzLmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbikodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uLHRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCl9YCksdD0oMCwgby5yZXBsYWNlSW5saW5lcykodCksYCR7KDAsIHMuZ2V0RnJhZ1NoYWRlclByZWFtYmxlKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pfVxuICAgICR7dGhpcy5nZXRVbmlmb3JtcyhlLmlucHV0TmFtZXMsZS52YXJpYWJsZXMpfVxuICAgICR7dGhpcy5nZXRJbXBvcnRzKHQpfVxuICAgICR7dH1gfWdldEltcG9ydHMoZSl7Y29uc3QgdD10aGlzLnNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuICIiO2xldCBuPSIiO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXS5yb3V0aW5lQm9keSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYm9keSBmb3IgdGhlIEdsc2wgTGlicmFyeSByb3V0aW5lOiAke3RbZV0ubmFtZX1gKTtuKz10W2VdLnJvdXRpbmVCb2R5KyJcbiI7fXJldHVybiBufXNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKXtjb25zdCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnNwbGl0KCIuIilbMV07LTEhPT1lLmluZGV4T2YocikmJnQucHVzaCh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoW25dKTt9KSksci5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXMucmV0dXJuT3JkZXJlZE5vZGVzKHQpfWdldFVuaWZvcm1zKGUsdCl7Y29uc3Qgbj1bXTtpZihlKWZvcihjb25zdCB0IG9mIGUpbi5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3R9O2ApO2lmKHQpZm9yKGNvbnN0IGUgb2YgdCluLnB1c2goYHVuaWZvcm0gJHtlLnR5cGV9ICR7ZS5uYW1lfSR7ZS5hcnJheUxlbmd0aD9gWyR7ZS5hcnJheUxlbmd0aH1dYDoiIn07YCk7cmV0dXJuIG4uam9pbigiXG4iKX19O30sMTI0ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2xzbFJlZ2lzdHJ5PXZvaWQgMDtjb25zdCByPW4oNjg1OSksbz1uKDEzNzEpLGk9bigyNjkxKSxzPW4oOTE4MyksYT1uKDkzMTQpO3QuZ2xzbFJlZ2lzdHJ5PXtlbmNvZGluZzpvLkVuY29kaW5nR2xzbExpYixmcmFnY29sb3I6aS5GcmFnQ29sb3JHbHNsTGliLHZlYzphLlZlY0dsc2xMaWIsc2hhcGVVdGlsczpzLlNoYXBlVXRpbHNHbHNsTGliLGNvb3JkaW5hdGVzOnIuQ29vcmRzR2xzbExpYn07fSw5MTgzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TaGFwZVV0aWxzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDE5OTcpO2NsYXNzIG8gZXh0ZW5kcyByLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iY2FzdEluZGV4KCkpLHRoaXMuYmNhc3RNYXRtdWxJbmRleCgpKSx0aGlzLm9mZnNldFRvSW5kaWNlcygpKSx0aGlzLmluZGljZXNUb09mZnNldCgpKSx0aGlzLmluY3JlbWVudEluZGljZXMoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319YmNhc3RJbmRleCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLHQ9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKChuLG8pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tvXS51bnBhY2tlZFNoYXBlO2lmKGkubGVuZ3RoPD1lKXtjb25zdCBvPWkubGVuZ3RoLHM9ZS1vLGE9YGJjYXN0SW5kaWNlc18ke259YDtsZXQgdT0iIjtmb3IobGV0IGU9MDtlPG87KytlKXUrPWBcbiAgICAgICAgICByZWFsSW5kaWNlc1ske2V9XSA9IGludCggbW9kKGZsb2F0KGJjYXN0ZWRJbmRpY2VzWyR7cytlfV0pLCAke2lbZV19LjApICk7XG4gICAgICAgICAgYDtjb25zdCBsPWBcbiAgICAgICAgdm9pZCAke2F9IChpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1iY2FzdE1hdG11bEluZGV4KCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKG4sbyk9Pntjb25zdCBpPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW29dLnNoYXBlO2lmKCEoaS5sZW5ndGg8Mnx8aS5sZW5ndGg+ZSkpe2NvbnN0IG89aS5sZW5ndGgscz1lLW8sYT1gYmNhc3RNYXRtdWxJbmRpY2VzXyR7bn1gO2xldCB1PSIiO2ZvcihsZXQgZT0wO2U8by0yOysrZSl1Kz1gXG4gICAgICAgICAgcmVhbEluZGljZXNbJHtlfV0gPSBpbnQoIG1vZChmbG9hdChiY2FzdGVkSW5kaWNlc1ske3MrZX1dKSwgJHtpW2VdfS4wKSApO1xuICAgICAgICAgIGA7Y29uc3QgbD1gXG4gICAgICAgIHZvaWQgJHthfShpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTF9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0xfV07XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTJ9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0yfV07XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1pbmRpY2VzVG9PZmZzZXQoKXtjb25zdCBlPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgodCxuKT0+e2NvbnN0IGk9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbbl0uc2hhcGUscz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zdHJpZGVzLGE9aS5sZW5ndGg7bGV0IHU9YGluZGljZXNUb09mZnNldF8ke3R9YDtlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8uaW5kZXhUb09mZnNldFNpbmdsZSh1LGEscykpLHU9YGluZGljZXNUb09mZnNldF8ke3R9X1RgLGVbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5pbmRleFRvT2Zmc2V0U2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIGluZGV4VG9PZmZzZXRTaW5nbGUoZSx0LG4pe2xldCByPSIiO2ZvcihsZXQgZT10LTE7ZT49MDstLWUpcis9YFxuICAgICAgICBvZmZzZXQgKz0gaW5kaWNlc1ske2V9XSAqICR7bltlXX07XG4gICAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGludCAke2V9KGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSAwO1xuICAgICAgICAke3J9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICB9XG4gICAgICBgfW9mZnNldFRvSW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxzPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLnN0cmlkZXMsYT1pLmxlbmd0aDtsZXQgdT1gb2Zmc2V0VG9JbmRpY2VzXyR7dH1gO2VbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5vZmZzZXRUb0luZGljZXNTaW5nbGUodSxhLHMpKSx1PWBvZmZzZXRUb0luZGljZXNfJHt0fV9UYCxlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8ub2Zmc2V0VG9JbmRpY2VzU2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIG9mZnNldFRvSW5kaWNlc1NpbmdsZShlLHQsbil7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQtMTsrK2Upci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHtlfV0gPSBvZmZzZXQgLyAke25bZV19O2ApLHIucHVzaChgXG4gICAgICAgIG9mZnNldCAtPSBpbmRpY2VzWyR7ZX1dICogJHtuW2VdfTtgKTtyZXR1cm4gci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHt0LTF9XSA9IG9mZnNldDtgKSxgXG4gICAgICB2b2lkICR7ZX0oaW50IG9mZnNldCwgb3V0IGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgICR7ci5qb2luKCIiKX1cbiAgICAgIH1cbiAgICAgIGB9aW5jcmVtZW50SW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3Qgbz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxpPW8ubGVuZ3RoLHM9YGluY3JlbWVudEluZGljZXNfJHt0fWA7bGV0IGE9IiI7Zm9yKGxldCBlPTA7ZTxpOysrZSlhKz1gXG4gICAgICAgIHNoYXBlWyR7ZX1dID0gJHtvW2VdfTtgO2NvbnN0IHU9YFxuICAgICAgICB2b2lkICR7c30oaW50IGF4aXMsIG91dCBpbnQgaW5kaWNlc1ske2l9XSkge1xuICAgICAgICAgIGludCBzaGFwZVske2l9XTtcbiAgICAgICAgICAke2F9O1xuICAgICAgICAgIGZvcihpbnQgaSA9ICR7aX0gLTEgOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgaWYoaSA+IGF4aXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5kaWNlc1tpXSArPSAxO1xuICAgICAgICAgICAgaWYoaW5kaWNlc1tpXSA8IHNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGA7ZVtzXT1uZXcgci5HbHNsTGliUm91dGluZSh1KTt9KSksZX19dC5TaGFwZVV0aWxzR2xzbExpYj1vO30sNjc1NzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbj10LmdldEZyYWdTaGFkZXJQcmVhbWJsZT10LmdldFZlcnRleFNoYWRlclNvdXJjZT10LmdldEdsc2w9dm9pZCAwO2NvbnN0IG49e3ZlcnNpb246IiIsYXR0cmlidXRlOiJhdHRyaWJ1dGUiLHZhcnlpbmdWZXJ0ZXg6InZhcnlpbmciLHZhcnlpbmdGcmFnOiJ2YXJ5aW5nIix0ZXh0dXJlMkQ6InRleHR1cmUyRCIsb3V0cHV0OiJnbF9GcmFnQ29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiIifSxyPXt2ZXJzaW9uOiIjdmVyc2lvbiAzMDAgZXMiLGF0dHJpYnV0ZToiaW4iLHZhcnlpbmdWZXJ0ZXg6Im91dCIsdmFyeWluZ0ZyYWc6ImluIix0ZXh0dXJlMkQ6InRleHR1cmUiLG91dHB1dDoib3V0cHV0Q29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiJvdXQgdmVjNCBvdXRwdXRDb2xvcjsifTtmdW5jdGlvbiBvKGUpe3JldHVybiAxPT09ZT9uOnJ9dC5nZXRHbHNsPW8sdC5nZXRWZXJ0ZXhTaGFkZXJTb3VyY2U9ZnVuY3Rpb24oZSl7Y29uc3QgdD1vKGUpO3JldHVybiBgJHt0LnZlcnNpb259XG4gICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgICAke3QuYXR0cmlidXRlfSB2ZWMzIHBvc2l0aW9uO1xuICAgICAgJHt0LmF0dHJpYnV0ZX0gdmVjMiB0ZXh0dXJlQ29vcmQ7XG5cbiAgICAgICR7dC52YXJ5aW5nVmVydGV4fSB2ZWMyIFRleENvb3JkcztcblxuICAgICAgdm9pZCBtYWluKClcbiAgICAgIHtcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICAgICAgVGV4Q29vcmRzID0gdGV4dHVyZUNvb3JkO1xuICAgICAgfWB9LHQuZ2V0RnJhZ1NoYWRlclByZWFtYmxlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9byhlKTtyZXR1cm4gYCR7dC52ZXJzaW9ufVxuICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICBwcmVjaXNpb24gaGlnaHAgaW50O1xuICAgIHByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7XG4gICAgJHt0LnZhcnlpbmdGcmFnfSB2ZWMyIFRleENvb3JkcztcbiAgICAke3Qub3V0cHV0RGVjbGFyYXRpb259XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIC8vIEN1c3RvbSB2ZWN0b3IgdHlwZXMgdG8gaGFuZGxlIGhpZ2hlciBkaW1lbmFsaXRpZXMuXG4gICAgc3RydWN0IGl2ZWM1XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICB9O1xuXG4gICAgc3RydWN0IGl2ZWM2XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICAgIGludCB2O1xuICAgIH07XG5cbiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHtcbiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7XG4gICAgfVxuXG4gICAgYH0sdC5nZXREZWZhdWx0RnJhZ1NoYWRlck1haW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYFxuICB2b2lkIG1haW4oKSB7XG4gICAgaW50IGluZGljZXNbJHt0fV07XG4gICAgdG9WZWMoVGV4Q29vcmRzLCBpbmRpY2VzKTtcbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQocHJvY2VzcyhpbmRpY2VzKSk7XG4gICAgJHtvKGUpLm91dHB1dH0gPSByZXN1bHQ7XG4gIH1cbiAgYH07fSw5MzE0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5WZWNHbHNsTGliPXZvaWQgMDtjb25zdCByPW4oMTk5Nyk7Y2xhc3MgbyBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iaW5hcnlWZWNGdW5jdGlvbnMoKSksdGhpcy5jb3B5VmVjKCkpLHRoaXMuc2V0VmVjSXRlbSgpKSx0aGlzLmdldFZlY0l0ZW0oKSl9YmluYXJ5VmVjRnVuY3Rpb25zKCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17YWRkOiIrPSIsc3ViOiItPSIsbXVsOiIqPSIsZGl2OiIvPSJ9LG49e307Zm9yKGNvbnN0IG8gaW4gdCl7Y29uc3QgaT1gJHtvfVZlY2A7bGV0IHM9IiI7Zm9yKGxldCBuPTA7bjxlOysrbilzKz1gXG4gICAgICAgICAgZGVzdFske259XSAke3Rbb119IHNyY1ske259XTtcbiAgICAgICAgICBgO2NvbnN0IGE9YFxuICAgICAgICB2b2lkICR7aX0oaW50IHNyY1ske2V9XSwgb3V0IGludCBkZXN0WyR7ZX1dKSB7XG4gICAgICAgICAgJHtzfVxuICAgICAgICB9XG4gICAgICAgIGA7bltpXT1uZXcgci5HbHNsTGliUm91dGluZShhKTt9cmV0dXJuIG59Y29weVZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PSIiO2ZvcihsZXQgbj0wO248ZTsrK24pdCs9YFxuICAgICAgICBkZXN0WyR7bn1dID0gc3JjWyR7bn1dO1xuICAgICAgICBgO2NvbnN0IG49YFxuICAgICAgdm9pZCBjb3B5VmVjKGludCBzcmNbJHtlfV0sIG91dCBpbnQgZGVzdFske2V9XSkge1xuICAgICAgICAke3R9XG4gICAgICB9XG4gICAgICBgO3JldHVybiB7Y29weVZlYzpuZXcgci5HbHNsTGliUm91dGluZShuKX19c2V0VmVjSXRlbSgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PWBcbiAgICAgICAgaWYoaW5kZXggPCAwKVxuICAgICAgICAgICAgaW5kZXggPSR7ZX0gKyBpbmRleDtcbiAgICAgICAgaWYgKGluZGV4ID09IDApXG4gICAgICAgICAgICBtWzBdID0gdmFsdWU7XG4gICAgICAgIGA7Zm9yKGxldCBuPTE7bjxlLTE7KytuKXQrPWBcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT0gJHtufSlcbiAgICAgICAgICAgIG1bJHtufV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGA7dCs9YFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtWyR7ZS0xfV0gPSB2YWx1ZTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIHZvaWQgc2V0VmVjSXRlbShvdXQgaW50IG1bJHtlfV0sIGludCBpbmRleCwgaW50IHZhbHVlKSB7XG4gICAgICAgICR7dH1cbiAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4ge3NldFZlY0l0ZW06bmV3IHIuR2xzbExpYlJvdXRpbmUobil9fWdldFZlY0l0ZW0oKXtjb25zdCBlPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aDtsZXQgdD1gXG4gICAgICAgIGlmKGluZGV4IDwgMClcbiAgICAgICAgICAgIGluZGV4ID0gJHtlfSArIGluZGV4O1xuICAgICAgICBpZiAoaW5kZXggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgYDtmb3IobGV0IG49MTtuPGUtMTsrK24pdCs9YFxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAke259KVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtufV07XG4gICAgICBgO3QrPWBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtlLTF9XTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIGludCBnZXRWZWNJdGVtKGludCBtWyR7ZX1dLCBpbnQgaW5kZXgpIHtcbiAgICAgICAgJHt0fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIHtnZXRWZWNJdGVtOm5ldyByLkdsc2xMaWJSb3V0aW5lKG4pfX19dC5WZWNHbHNsTGliPW87fSw3ODYwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigxMzE1KSxvPW4oOTI0MCksaT1uKDcyNzMpLHM9big5KSxhPW4oNzM3OSksdT1uKDI0ODgpLGw9big1NDApLGM9bigzMzE0KSxwPW4oNTYzOSk7dC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9Y2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGUsdCl7cmV0dXJuICgwLCBjLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUsdCl9ZXhlY3V0ZVByb2dyYW0oZSx0KXtpZih0Lmxlbmd0aDxlLmlucHV0TmFtZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgSW5wdXQgc2l6ZSBtdXN0bid0IGJlIGxlc3MgdGhhbiAke2UuaW5wdXROYW1lcy5sZW5ndGh9LmApO2lmKGUuaW5wdXROYW1lcy5sZW5ndGghPT1lLmlucHV0VHlwZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiaW5wdXQgbmFtZXMgc2l6ZSBkb2VzIG5vdCBtYXRjaCBpbnB1dCB0eXBlcyIpO2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlLmlucHV0TmFtZXMubGVuZ3RoOysrciluW3JdPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0W3JdLGUuaW5wdXRUeXBlc1tyXSk7Y29uc3Qgcj0oKGUsdCk9Pntjb25zdCBuPXQubWFwKChlPT5gJHtlLnVucGFja2VkU2hhcGUuam9pbigiLCIpfTske2Uud2lkdGh9eCR7ZS5oZWlnaHR9YCkpLmpvaW4oIl8iKTtsZXQgcj1lLm5hbWU7cmV0dXJuIGUuY2FjaGVIaW50JiYocis9IlsiK2UuY2FjaGVIaW50KyJdIikscis9IjoiK24scn0pKGUsbik7bGV0IG89dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmdldEFydGlmYWN0KHIpO2NvbnN0IGk9bz9vLnByb2dyYW1JbmZvOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldD9lLmdldCgpOmUscz0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksaS5vdXRwdXQuZGltcyxpLm91dHB1dC50ZXh0dXJlVHlwZSksYT10aGlzLmNyZWF0ZVRleHR1cmVEYXRhKHMsaS5vdXRwdXQudHlwZSk7cmV0dXJuIG98fChvPXRoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5idWlsZChpLG4sYSksdGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLnNldEFydGlmYWN0KHIsbykpLHRoaXMucnVuUHJvZ3JhbShvLG4sYSksYX1ydW4oZSx0KXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbShlLHQpLnRlbnNvcn1ydW5Qcm9ncmFtKGUsdCxuKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoOysrbilpZighIXRbbl0uaXNQYWNrZWQhPShlLnByb2dyYW1JbmZvLmlucHV0VHlwZXNbbl09PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKGBpbnB1dFske259XSBwcm9wZXJ0eSBwYWNrZWQgaW5jb25zaXN0ZW50YCk7aWYoISFuLmlzUGFja2VkIT0oZS5wcm9ncmFtSW5mby5vdXRwdXQudGV4dHVyZVR5cGU9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKCJvdXRwdXQgcHJvcGVydHkgcGFja2VkIGluY29uc2lzdGVudCIpO3RoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5ydW4oZSx0LG4pO31nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUsdCl7bGV0IG49dGhpcy5nZXRUZXh0dXJlRGF0YShlLmRhdGFJZCx0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCFuJiYobj10aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQhPT1wLlRleHR1cmVUeXBlLnBhY2tlZCksbikpcmV0dXJuIHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZD90aGlzLnBhY2sobik6dGhpcy51bnBhY2sobik7aWYoIW4pe2NvbnN0IHI9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUuZGltcyx0KTtpZih0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKXtjb25zdCBuPTEscj00LG89ZS5kaW1zO2lmKDQ9PT1vLmxlbmd0aCl7Y29uc3QgaT1bb1swXSxNYXRoLmNlaWwob1sxXSpvWzJdKm9bM10vcildLHM9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGksdCk7bGV0IGE9ZS5udW1iZXJEYXRhO2lmKG9bMV0qb1syXSpvWzNdJXIhPTApe2NvbnN0IHQ9b1swXSxpPW9bMV0qb1syXSpvWzNdLHM9TWF0aC5jZWlsKGkqbi9yKSpyO2E9bmV3IEZsb2F0MzJBcnJheSh0KnMpO2ZvcihsZXQgcj0wO3I8dDsrK3Ipe2NvbnN0IHQ9cippLG89cipzK3IlbippO2Euc2V0KGUubnVtYmVyRGF0YS5zdWJhcnJheSh0LHQraSksbyk7fX1yZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YShzLGUudHlwZSxhLGUsMSl9fWlmKHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCl7Y29uc3QgdD0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksZS5kaW1zLDEsW10se3JldmVyc2VXSDohMH0pLHI9dGhpcy5jcmVhdGVUZXh0dXJlRGF0YSh0LGUudHlwZSxlLm51bWJlckRhdGEsZSwxKTtuPXRoaXMucGFjayhyKTt9ZWxzZSBuPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEocixlLnR5cGUsZS5udW1iZXJEYXRhLGUsMSk7fXJldHVybiBufWNyZWF0ZVRleHR1cmVEYXRhRnJvbUxheW91dEJpbmRUZW5zb3IoZSx0LG4scil7cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGEoZSx0LG4sciwxKX1jcmVhdGVUZXh0dXJlRGF0YShlLHQsbixvLGkpe3IuTG9nZ2VyLnZlcmJvc2UoIkluZmVyZW5jZUhhbmRsZXIiLGBDcmVhdGluZyBUZXh0dXJlRGF0YTogbGF5b3V0Olske0pTT04uc3RyaW5naWZ5KGUpfV1gKTtjb25zdCBzPXRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5jcmVhdGVUZXh0dXJlRnJvbUxheW91dCh0LGUsbixpKTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKGUsdCxzLG8pfXJlc2hhcGVVbnBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS51bnBhY2tlZCkscj17Y2hhbm5lbHM6bi5jaGFubmVscyxoZWlnaHQ6bi5oZWlnaHQsd2lkdGg6bi53aWR0aCxzaGFwZTowIT09dC5sZW5ndGg/dDpbMV0sc3RyaWRlczppLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0KSx1bnBhY2tlZFNoYXBlOnR9O3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUocixlLnR5cGUsbi50ZXh0dXJlKS50ZW5zb3J9cmVzaGFwZVBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCgwLCBhLmlzUmVzaGFwZUNoZWFwKShlLmRpbXMsdCkpe2NvbnN0IHI9e2NoYW5uZWxzOm4uY2hhbm5lbHMsaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgsc2hhcGU6MCE9PXQubGVuZ3RoP3Q6WzFdLHN0cmlkZXM6aS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModCksdW5wYWNrZWRTaGFwZTp0LGlzUGFja2VkOiEwfTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKHIsZS50eXBlLG4udGV4dHVyZSkudGVuc29yfWNvbnN0IHI9KDAsIGEucHJvY2Vzc0RpbXMzRCkoZS5kaW1zKSxvPSgwLCBhLnByb2Nlc3NEaW1zM0QpKHQpLHM9dGhpcy5yZXNoYXBlUGFja2VkKGUsciksdT10aGlzLnJ1bigoMCwgYS5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcikodGhpcyxzLG8pLFtzXSk7cmV0dXJuIHRoaXMucmVzaGFwZVBhY2tlZCh1LHQpfWNhc3QoZSx0KXtjb25zdCBuPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YShlLHAuVGV4dHVyZVR5cGUudW5wYWNrZWQpO3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUobix0LG4udGV4dHVyZSkudGVuc29yfWNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUoZSx0LG4scixpKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7dGVuc29yOnJ8fG5ldyBvLlRlbnNvcihlLnVucGFja2VkU2hhcGUsdCwoZT0+dGhpcy5yZWFkVGV4dHVyZShzKSksKGFzeW5jIGU9PnRoaXMucmVhZFRleHR1cmVBc3luYyhzKSksdm9pZCAwLGkpLHRleHR1cmU6bn0pO3JldHVybiB0aGlzLnNldFRleHR1cmVEYXRhKHMudGVuc29yLmRhdGFJZCxzLGUuaXNQYWNrZWQpLHN9Z2V0VGV4dHVyZURhdGEoZSx0PSExKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLmdldFRleHR1cmVEYXRhKGUsdCk6dD90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KGUpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKX1zZXRUZXh0dXJlRGF0YShlLHQsbj0hMSl7dGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLnNldFRleHR1cmVEYXRhKGUsdCxuKToobj90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUpLnNldChlLHQpO31pc1RleHR1cmVMYXlvdXRDYWNoZWQoZSx0PSExKXtyZXR1cm4gISF0aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQpfWRpc3Bvc2UoKXt0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIuY2xlYXJBY3RpdmVUZXh0dXJlcygpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwO31yZWFkVGV4dHVyZShlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlKHRoaXMudW5wYWNrKGUpKTp0aGlzLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ/dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlKGUsZS50ZW5zb3IudHlwZSxlLmNoYW5uZWxzKTp0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFVpbnQ4VGV4dHVyZUFzRmxvYXQoKDAsIHUuZW5jb2RlQXNVaW50OCkodGhpcyxlKSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlQXN5bmModGhpcy51bnBhY2soZSkpOnRoaXMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC5pc0Zsb2F0MzJEb3dubG9hZFN1cHBvcnRlZD90aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmVBc3luYyhlLGUudGVuc29yLnR5cGUsZS5jaGFubmVscyk6dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0KCgwLCB1LmVuY29kZUFzVWludDgpKHRoaXMsZSkpfXBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIHMuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyKSh0aGlzLGUudGVuc29yKSxbZS50ZW5zb3JdKX11bnBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIGwuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXIpKHRoaXMsZS50ZW5zb3IpLFtlLnRlbnNvcl0pfX07fSw0MTEwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pO28mJiEoImdldCJpbiBvPyF0Ll9fZXNNb2R1bGU6by53cml0YWJsZXx8by5jb25maWd1cmFibGUpfHwobz17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG8pO306ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9biksZVtyXT10W25dO30pLG89dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KTt9OmZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQ7fSksaT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpImRlZmF1bHQiIT09biYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnIodCxlLG4pO3JldHVybiBvKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuV0VCR0xfT1BfUkVTT0xWRV9SVUxFUz12b2lkIDA7Y29uc3Qgcz1uKDg4MTcpLGE9aShuKDUxOTQpKSx1PW4oNDc1MiksbD1uKDY2NjgpLGM9big5NzU0KSxwPW4oNTA0MiksZD1uKDY3NDIpLGY9big0MTI1KSxoPW4oNjE0OSksZz1uKDUzNzgpLGI9big2OTgxKSxtPW4oNzQxMykseT1uKDcwMDYpLHY9big4Mjc2KSxfPW4oNTU2NSksdz1uKDI4MzQpLFQ9bigxMDEwKSx4PW4oODEyNiksTz1uKDI4MDEpLFM9big1NjUpLEE9bigyNDQ0KSxQPW4oODE1KSxJPW4oNTY0KSxFPW4oNTQxNiksRD1uKDEyNDApLCQ9big1OTQ0KSxrPW4oNTcwNyksRj1pKG4oOTA4NykpLE49big3ODYyKSxqPW4oMzk4MCk7dC5XRUJHTF9PUF9SRVNPTFZFX1JVTEVTPVtbIkFicyIsIiIsIjYrIixGLmFic10sWyJBY29zIiwiIiwiNysiLEYuYWNvc10sWyJBZGQiLCIiLCI3KyIsYS5hZGRdLFsiQW5kIiwiIiwiNysiLGEuYW5kXSxbIkFzaW4iLCIiLCI3KyIsRi5hc2luXSxbIkF0YW4iLCIiLCI3KyIsRi5hdGFuXSxbIkF2ZXJhZ2VQb29sIiwiIiwiNysiLHcuYXZlcmFnZVBvb2wsdy5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJCYXRjaE5vcm1hbGl6YXRpb24iLCIiLCI3KyIscy5iYXRjaE5vcm1hbGl6YXRpb24scy5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiQ2FzdCIsIiIsIjYrIix1LmNhc3QsdS5wYXJzZUNhc3RBdHRyaWJ1dGVzXSxbIkNlaWwiLCIiLCI2KyIsRi5jZWlsXSxbIkNsaXAiLCIiLCI2LTEwIixGLmNsaXAsRi5wYXJzZUNsaXBBdHRyaWJ1dGVzXSxbIkNsaXAiLCIiLCIxMSsiLEYuY2xpcFYxMV0sWyJDb25jYXQiLCIiLCI0KyIsbC5jb25jYXQsbC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXNdLFsiQ29udiIsIiIsIjErIixjLmNvbnYsYy5wYXJzZUNvbnZBdHRyaWJ1dGVzXSxbIkNvbnZUcmFuc3Bvc2UiLCIiLCIxKyIscC5jb252VHJhbnNwb3NlLHAucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlc10sWyJDb3MiLCIiLCI3KyIsRi5jb3NdLFsiRGl2IiwiIiwiNysiLGEuZGl2XSxbIkRyb3BvdXQiLCIiLCI3KyIsRi5pZGVudGl0eV0sWyJEZXB0aFRvU3BhY2UiLCIiLCIxKyIsZC5kZXB0aFRvU3BhY2UsZC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXNdLFsiRXF1YWwiLCIiLCI3KyIsYS5lcXVhbF0sWyJFbHUiLCIiLCI2KyIsRi5lbHUsRi5wYXJzZUVsdUF0dHJpYnV0ZXNdLFsiRXhwIiwiIiwiNisiLEYuZXhwXSxbIkZsYXR0ZW4iLCIiLCIxKyIsZi5mbGF0dGVuLGYucGFyc2VGbGF0dGVuQXR0cmlidXRlc10sWyJGbG9vciIsIiIsIjYrIixGLmZsb29yXSxbIkZ1c2VkQ29udiIsImNvbS5taWNyb3NvZnQiLCIxKyIsYy5jb252LGMucGFyc2VDb252QXR0cmlidXRlc10sWyJHYXRoZXIiLCIiLCIxKyIsaC5nYXRoZXIsaC5wYXJzZUdhdGhlckF0dHJpYnV0ZXNdLFsiR2VtbSIsIiIsIjctMTAiLGcuZ2VtbSxnLnBhcnNlR2VtbUF0dHJpYnV0ZXNWN10sWyJHZW1tIiwiIiwiMTErIixnLmdlbW0sZy5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExXSxbIkdsb2JhbEF2ZXJhZ2VQb29sIiwiIiwiMSsiLHcuZ2xvYmFsQXZlcmFnZVBvb2wsdy5wYXJzZUdsb2JhbEF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJHbG9iYWxNYXhQb29sIiwiIiwiMSsiLHcuZ2xvYmFsTWF4UG9vbF0sWyJHcmVhdGVyIiwiIiwiNysiLGEuZ3JlYXRlcl0sWyJJZGVudGl0eSIsIiIsIjErIixGLmlkZW50aXR5XSxbIkltYWdlU2NhbGVyIiwiIiwiMSsiLGIuaW1hZ2VTY2FsZXIsYi5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlc10sWyJJbnN0YW5jZU5vcm1hbGl6YXRpb24iLCIiLCI2KyIsbS5pbnN0YW5jZU5vcm1hbGl6YXRpb24sbS5wYXJzZUluc3RhbmNlTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiTGVha3lSZWx1IiwiIiwiNisiLEYubGVha3lSZWx1LEYucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzXSxbIkxlc3MiLCIiLCI3KyIsYS5sZXNzXSxbIkxSTiIsIiIsIjErIix5Lmxybix5LnBhcnNlTHJuQXR0cmlidXRlc10sWyJMb2ciLCIiLCI2KyIsRi5sb2ddLFsiTWF0TXVsIiwiIiwiMSsiLHYubWF0TXVsLHYucGFyc2VNYXRNdWxBdHRyaWJ1dGVzXSxbIk1heFBvb2wiLCIiLCIxKyIsdy5tYXhQb29sLHcucGFyc2VNYXhQb29sQXR0cmlidXRlc10sWyJNdWwiLCIiLCI3KyIsYS5tdWxdLFsiTmVnIiwiIiwiNisiLEYubmVnXSxbIk5vdCIsIiIsIjErIixGLm5vdF0sWyJPciIsIiIsIjcrIixhLm9yXSxbIlBhZCIsIiIsIjItMTAiLF8ucGFkVjIsXy5wYXJzZVBhZEF0dHJpYnV0ZXNWMl0sWyJQYWQiLCIiLCIxMSsiLF8ucGFkVjExLF8ucGFyc2VQYWRBdHRyaWJ1dGVzVjExXSxbIlBvdyIsIiIsIjcrIixhLnBvd10sWyJQUmVsdSIsIiIsIjcrIixhLnBSZWx1XSxbIlJlZHVjZUxvZ1N1bSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VNYXgiLCIiLCIxKyIsVC5yZWR1Y2VNYXgsVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWVhbiIsIiIsIjErIixULnJlZHVjZU1lYW4sVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWluIiwiIiwiMSsiLFQucmVkdWNlTWluLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVByb2QiLCIiLCIxKyIsVC5yZWR1Y2VQcm9kLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bSIsIiIsIjEtMTIiLFQucmVkdWNlU3VtLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bVNxdWFyZSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bVNxdWFyZSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWx1IiwiIiwiNisiLEYucmVsdV0sWyJSZXNoYXBlIiwiIiwiNSsiLHgucmVzaGFwZV0sWyJSZXNpemUiLCIiLCIxMCIsTy5yZXNpemUsTy5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTBdLFsiUmVzaXplIiwiIiwiMTErIixPLnJlc2l6ZSxPLnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMV0sWyJTaGFwZSIsIiIsIjErIixTLnNoYXBlXSxbIlNpZ21vaWQiLCIiLCI2KyIsRi5zaWdtb2lkXSxbIlNpbiIsIiIsIjcrIixGLnNpbl0sWyJTbGljZSIsIiIsIjEwKyIsQS5zbGljZVYxMF0sWyJTbGljZSIsIiIsIjEtOSIsQS5zbGljZSxBLnBhcnNlU2xpY2VBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxLTEyIixQLnNvZnRtYXgsUC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxMysiLFAuc29mdG1heFYxMyxQLnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTNdLFsiU3BsaXQiLCIiLCIyLTEyIixJLnNwbGl0LEkucGFyc2VTcGxpdEF0dHJpYnV0ZXNdLFsiU3FydCIsIiIsIjYrIixGLnNxcnRdLFsiU3F1ZWV6ZSIsIiIsIjEtMTIiLEUuc3F1ZWV6ZSxFLnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXNdLFsiU3F1ZWV6ZSIsIiIsIjEzKyIsRS5zcXVlZXplVjEzXSxbIlN1YiIsIiIsIjcrIixhLnN1Yl0sWyJTdW0iLCIiLCI2KyIsRC5zdW1dLFsiVGFuIiwiIiwiNysiLEYudGFuXSxbIlRhbmgiLCIiLCI2KyIsRi50YW5oXSxbIlRpbGUiLCIiLCI2KyIsJC50aWxlXSxbIlRyYW5zcG9zZSIsIiIsIjErIixrLnRyYW5zcG9zZSxrLnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlc10sWyJVcHNhbXBsZSIsIiIsIjctOCIsai51cHNhbXBsZSxqLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjddLFsiVXBzYW1wbGUiLCIiLCI5IixqLnVwc2FtcGxlLGoucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWOV0sWyJVbnNxdWVlemUiLCIiLCIxLTEyIixOLnVuc3F1ZWV6ZSxOLnBhcnNlVW5zcXVlZXplQXR0cmlidXRlc10sWyJVbnNxdWVlemUiLCIiLCIxMysiLE4udW5zcXVlZXplVjEzXSxbIlhvciIsIiIsIjcrIixhLnhvcl1dO30sODgxNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VCYXRjaE5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPXQuYmF0Y2hOb3JtYWxpemF0aW9uPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDY3NTcpLGk9big1NjM5KSxzPXtuYW1lOiJCYXRjaE5vcm1hbGl6YXRpb24iLGlucHV0TmFtZXM6WyJBIiwiU2NhbGUiLCJCIiwiTWVhbiIsIlZhcmlhbmNlIl0saW5wdXRUeXBlczpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5iYXRjaE5vcm1hbGl6YXRpb249KGUsdCxuKT0+KHUodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdCxuKX0pLHQpXSksdC5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJlcHNpbG9uIiwxZS01KSxuPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgibW9tZW50dW0iLC45KSxvPWUuYXR0cmlidXRlcy5nZXRJbnQoInNwYXRpYWwiLDEpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtlcHNpbG9uOnQsbW9tZW50dW06bixzcGF0aWFsOm99KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksYT10WzBdLmRpbXMubGVuZ3RoLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHRbMV0uZGltcyxpLlRleHR1cmVUeXBlLnVucGFja2VkKSxjPWBcbiAgZmxvYXQgcHJvY2VzcyhpbnRbJHthfV0gaW5kaWNlcykge1xuICAgIHZlYzIgcG9zaXRpb24gPSBvZmZzZXRUb0Nvb3JkcyhpbmRpY2VzWzFdLCAke3V9LCAke2x9KTtcbiAgICBmbG9hdCBzY2FsZSA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShTY2FsZSwgcG9zaXRpb24pKTtcbiAgICBmbG9hdCBtZWFuID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KE1lYW4sIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgdmFyaWFuY2UgPSBnZXRDb2xvckFzRmxvYXQoJHtyLnRleHR1cmUyRH0oVmFyaWFuY2UsIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgYiA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShCLCBwb3NpdGlvbikpO1xuXG4gICAgcmV0dXJuIHNjYWxlICogKCAoX0EoaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBmbG9hdCgke24uZXBzaWxvbn0pKSApICsgYjtcbiAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOnRbMF0uZGltcyx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSx1PWU9PntpZighZXx8NSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmF0Y2hOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDUgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdLG89ZVszXSxpPWVbNF07aWYodC5kaW1zLmxlbmd0aDwzfHwxIT09bi5kaW1zLmxlbmd0aHx8MSE9PXIuZGltcy5sZW5ndGh8fDEhPT1vLmRpbXMubGVuZ3RofHwxIT09aS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYobi5kaW1zWzBdIT09dC5kaW1zWzFdfHxyLmRpbXNbMF0hPT10LmRpbXNbMV18fG8uZGltc1swXSE9PXQuZGltc1sxXXx8aS5kaW1zWzBdIT09dC5kaW1zWzFdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlfHwiZmxvYXQzMiIhPT1vLnR5cGUmJiJmbG9hdDY0IiE9PW8udHlwZXx8ImZsb2F0MzIiIT09aS50eXBlJiYiZmxvYXQ2NCIhPT1pLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX07fSw1MTk0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC54b3I9dC5zdWI9dC5wUmVsdT10LnBvdz10Lm9yPXQubXVsPXQubGVzcz10LmdyZWF0ZXI9dC5lcXVhbD10LmRpdj10LmFuZD10LmFkZD10Lmdsc2xQUmVsdT10Lmdsc2xQb3c9dC5nbHNsWG9yPXQuZ2xzbE9yPXQuZ2xzbEFuZD10Lmdsc2xMZXNzPXQuZ2xzbEdyZWF0ZXI9dC5nbHNsRXF1YWw9dC5nbHNsU3ViPXQuZ2xzbE11bD10Lmdsc2xEaXY9dC5nbHNsQWRkPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDE5OTcpLGk9big2NzU3KSxzPW4oNTYzOSk7ZnVuY3Rpb24gYSgpe2NvbnN0IGU9ImFkZF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICsgYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSArIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gdSgpe2NvbnN0IGU9ImRpdl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC8gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAvIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbCgpe2NvbnN0IGU9Im11bF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICogYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAqIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYygpe2NvbnN0IGU9InN1Yl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAtIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gcCgpe2NvbnN0IGU9ImVxdWFsXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPT0gYik7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gdmVjNChlcXVhbCh2MSwgdjIpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGQoKXtjb25zdCBlPSJncmVhdGVyXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPiBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yID4gdjIuciAsXG4gICAgICB2MS5nID4gdjIuZyxcbiAgICAgIHYxLmIgPiB2Mi5iLFxuICAgICAgdjEuYSA+IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGYoKXtjb25zdCBlPSJsZXNzXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPCBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yIDwgdjIuciAsXG4gICAgICAgICAgICAgICAgdjEuZyA8IHYyLmcsXG4gICAgICAgICAgICAgICAgdjEuYiA8IHYyLmIsXG4gICAgICAgICAgICAgICAgdjEuYSA8IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGgoKXtjb25zdCBlPSJhbmRfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gZmxvYXQoIGJvb2woYSkgJiYgYm9vbChiKSApO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgYnZlYzQgYjEgPSBidmVjNCh2MSk7XG4gICAgYnZlYzQgYjIgPSBidmVjNCh2Mik7XG4gICAgcmV0dXJuIHZlYzQoIGIxLnIgJiYgYjIuciAsXG4gICAgICAgICAgICAgICAgYjEuZyAmJiBiMi5nLFxuICAgICAgICAgICAgICAgIGIxLmIgJiYgYjIuYixcbiAgICAgICAgICAgICAgICBiMS5hICYmIGIyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGcoKXtjb25zdCBlPSJvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSB8fCBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciB8fCBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIHx8IGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiB8fCBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgfHwgYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYigpe2NvbnN0IGU9Inhvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSBeXiBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciBeXiBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIF5eIGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiBeXiBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgXl4gYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbSgpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCB0PWAke2V9X2A7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHt0fShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuICR7ZX0oYSwgYik7XG4gIH1cbiAgdmVjNCAke3R9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gJHtlfSh2MSwgdjIpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19KCJwb3ciKX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0icHJlbHVfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBiOiBhO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgcmV0dXJuIHZlYzQoXG4gICAgICB2MS5yIDwgMC4wID8gdjEuciAqIHYyLnI6IHYxLnIsXG4gICAgICB2MS5nIDwgMC4wID8gdjEuZyAqIHYyLmc6IHYxLmcsXG4gICAgICB2MS5iIDwgMC4wID8gdjEuYiAqIHYyLmI6IHYxLmIsXG4gICAgICB2MS5hIDwgMC4wID8gdjEuYSAqIHYyLmE6IHYxLmFcbiAgICAgICk7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTpvLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBZGQ9YSx0Lmdsc2xEaXY9dSx0Lmdsc2xNdWw9bCx0Lmdsc2xTdWI9Yyx0Lmdsc2xFcXVhbD1wLHQuZ2xzbEdyZWF0ZXI9ZCx0Lmdsc2xMZXNzPWYsdC5nbHNsQW5kPWgsdC5nbHNsT3I9Zyx0Lmdsc2xYb3I9Yix0Lmdsc2xQb3c9bSx0Lmdsc2xQUmVsdT15O2NvbnN0IHY9KGUsdCxuLHI9dFswXS50eXBlLG8pPT57Y29uc3QgaT1lLnNlc3Npb24ucGFjaz9zLlRleHR1cmVUeXBlLnBhY2tlZDpzLlRleHR1cmVUeXBlLnVucGFja2VkO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbaSxpXSxjYWNoZUhpbnQ6byxnZXQ6KCk9Pl8oZSx0LG4scil9fSxfPShlLHQsbixvPXRbMF0udHlwZSk9Pntjb25zdCBhPWUuc2Vzc2lvbi5wYWNrP3MuVGV4dHVyZVR5cGUucGFja2VkOnMuVGV4dHVyZVR5cGUudW5wYWNrZWQsdT0hci5TaGFwZVV0aWwuYXJlRXF1YWwodFswXS5kaW1zLHRbMV0uZGltcyk7bGV0IGw9dFswXS5kaW1zO2NvbnN0IGM9ZS5zZXNzaW9uLnBhY2s7aWYodSl7Y29uc3Qgcz1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKHRbMF0uZGltcyx0WzFdLmRpbXMsITEpO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgcGVyZm9ybSBiaW5hcnkgb3Agb24gdGhlIGdpdmVuIHRlbnNvcnMiKTtsPXM7Y29uc3QgdT1sLmxlbmd0aCxwPTAhPT10WzBdLmRpbXMubGVuZ3RoP3RbMF0uZGltcy5sZW5ndGg6MSxkPTAhPT10WzFdLmRpbXMubGVuZ3RoP3RbMV0uZGltcy5sZW5ndGg6MSxmPTAhPT10WzBdLmRpbXMubGVuZ3RoPyJiY2FzdEluZGljZXNfQShpbmRpY2VzLCBhaW5kaWNlcyk7IjoiYWluZGljZXNbMF0gPSAwOyIsaD0wIT09dFsxXS5kaW1zLmxlbmd0aD8iYmNhc3RJbmRpY2VzX0IoaW5kaWNlcywgYmluZGljZXMpOyI6ImJpbmRpY2VzWzBdID0gMDsiLGc9KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGI9Yz9gXG4gICAgICAke24uYm9keX1cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBhID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgYiA9IGdldEJBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9ICR7bi5uYW1lfShhLCBiKTtcbiAgICAgICAgJHtnLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9YDpgXG4gICAgICAke24uYm9keX1cbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHt1fV0pIHtcbiAgICAgICAgaW50IGFpbmRpY2VzWyR7cH1dO1xuICAgICAgICBpbnQgYmluZGljZXNbJHtkfV07XG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtofVxuICAgICAgICByZXR1cm4gJHtuLm5hbWV9KF9BKGFpbmRpY2VzKSwgX0IoYmluZGljZXMpKTtcbiAgICAgIH1gO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6bCx0eXBlOm8sdGV4dHVyZVR5cGU6YX0sc2hhZGVyU291cmNlOmIsaGFzTWFpbjpjfX1jb25zdCBwPSgwLCBpLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxkPWBcbiAgICAke24uYm9keX1cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICB2ZWM0IHYxID0gJHtwLnRleHR1cmUyRH0oQSwgVGV4Q29vcmRzKTtcbiAgICAgIHZlYzQgdjIgPSAke3AudGV4dHVyZTJEfShCLCBUZXhDb29yZHMpO1xuICAgICAgdmVjNCByZXN1bHQgPSAke24ubmFtZX0odjEsIHYyKTtcbiAgICAgICR7cC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgIH1cbiAgICBgO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6dFswXS5kaW1zLHR5cGU6byx0ZXh0dXJlVHlwZTphfSxzaGFkZXJTb3VyY2U6ZCxoYXNNYWluOiEwfX07dC5hZGQ9KGUsdCk9PltlLnJ1bih2KGUsdCxhKCkpLHQpXSx0LmFuZD0oZSx0KT0+W2UucnVuKHYoZSx0LGgoKSwiYm9vbCIpLHQpXSx0LmRpdj0oZSx0KT0+W2UucnVuKHYoZSx0LHUoKSksdCldLHQuZXF1YWw9KGUsdCk9PltlLnJ1bih2KGUsdCxwKCksImJvb2wiKSx0KV0sdC5ncmVhdGVyPShlLHQpPT5bZS5ydW4odihlLHQsZCgpLCJib29sIiksdCldLHQubGVzcz0oZSx0KT0+W2UucnVuKHYoZSx0LGYoKSwiYm9vbCIpLHQpXSx0Lm11bD0oZSx0KT0+W2UucnVuKHYoZSx0LGwoKSksdCldLHQub3I9KGUsdCk9PltlLnJ1bih2KGUsdCxnKCksImJvb2wiKSx0KV0sdC5wb3c9KGUsdCk9PltlLnJ1bih2KGUsdCxtKCkpLHQpXSx0LnBSZWx1PShlLHQpPT5bZS5ydW4odihlLHQseSgpKSx0KV0sdC5zdWI9KGUsdCk9PltlLnJ1bih2KGUsdCxjKCkpLHQpXSx0Lnhvcj0oZSx0KT0+W2UucnVuKHYoZSx0LGIoKSwiYm9vbCIpLHQpXTt9LDQ3NTI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ2FzdEF0dHJpYnV0ZXM9dC5jYXN0PXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5jYXN0PShlLHQsbik9PihvKHQpLFtlLmNhc3QodFswXSxuKV0pLHQucGFyc2VDYXN0QXR0cmlidXRlcz1lPT5yLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0byIpKTtjb25zdCBvPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FzdCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDQ1OTU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KTt0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbik9Pntjb25zdCB1PShsPXQubGVuZ3RoLGM9bi5jYWNoZUtleSx7bmFtZToiQ29uY2F0IChwYWNrZWQpIixpbnB1dE5hbWVzOkFycmF5LmZyb20oe2xlbmd0aDpsfSwoKGUsdCk9PmBYJHt0fWApKSxpbnB1dFR5cGVzOkFycmF5KGwpLmZpbGwoby5UZXh0dXJlVHlwZS5wYWNrZWQpLGNhY2hlSGludDpjfSk7dmFyIGwsYztyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4sdSk9Pntjb25zdCBsPW5bMF0uZGltcy5zbGljZSgpO2lmKHU+PWwubGVuZ3RofHx1PC0xKmwubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYXhpcyBzcGVjaWZpZWQgZm9yIGNvbmNhdCBkb2Vzbid0IG1hdGNoIGlucHV0IGRpbWVuc2lvbmFsaXR5Iik7dTwwJiYodT1sLmxlbmd0aCt1KTtjb25zdCBjPWwuc2xpY2UoMCk7Zm9yKGxldCBlPTE7ZTxuLmxlbmd0aDtlKyspe2NvbnN0IHQ9bltlXS5kaW1zLnNsaWNlKCk7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaWYoZT09PXUpY1t1XSs9dFtlXTtlbHNlIGlmKGxbZV0hPT10W2VdKXRocm93IG5ldyBFcnJvcigibm9uIGNvbmNhdCBkaW1lbnNpb25zIG11c3QgbWF0Y2giKX1jb25zdCBwPWMubGVuZ3RoLGQ9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJjb29yZHMiLHApLGY9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKHApLGg9KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCksZz1uLm1hcCgoZT0+ZS5kaW1zKSksYj0oMCwgaS5nZXRHbENoYW5uZWxzKShwKSxtPW5ldyBBcnJheShnLmxlbmd0aC0xKTttWzBdPWdbMF1bdV07Zm9yKGxldCBlPTE7ZTxtLmxlbmd0aDtlKyspbVtlXT1tW2UtMV0rZ1tlXVt1XTtjb25zdCB5PWJbdV0sdj1iLnNsaWNlKC0yKSxfPWIuam9pbigpO2xldCB3PWBpZiAoJHt5fSA8ICR7bVswXX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRYMCgke199KSwgdmVjMigke3Yuam9pbigpfSkpO1xuICAgICAgICB9YDtmb3IobGV0IGU9MTtlPG0ubGVuZ3RoO2UrKyl7Y29uc3QgdD1tW2UtMV07dys9YFxuICAgICAgICAgICAgaWYgKCR7eX0gPCAke21bZV19ICAmJiAke3l9ID49ICR7bVtlLTFdfSkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICBnZXRYJHtlfSgke2EoYix5LHQpfSksXG4gICAgICAgICAgICAgICAgdmVjMigke2Eodix5LHQpfSkpO1xuICAgICAgICAgICAgfWA7fWNvbnN0IFQ9bS5sZW5ndGgseD1tW20ubGVuZ3RoLTFdO3crPWBcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKFxuICAgICAgICAgICAgICBnZXRYJHtUfSgke2EoYix5LHgpfSksXG4gICAgICAgICAgICAgIHZlYzIoJHthKHYseSx4KX0pKTtgO2NvbnN0IE89KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuICAgICAgICAgICR7aH1cbiAgICAgICAgICBmbG9hdCBnZXRWYWx1ZSgke2IubWFwKChlPT4iaW50ICIrZSkpfSkge1xuICAgICAgICAgICAgJHt3fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICR7Zn0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgICBpbnQgbGFzdERpbSA9IGNvb3Jkcy4ke2JbcC0xXX07XG4gICAgICAgICAgICBjb29yZHMuJHtiW3AtMV19ID0gY29vcmRzLiR7YltwLTJdfTtcbiAgICAgICAgICAgIGNvb3Jkcy4ke2JbcC0yXX0gPSBsYXN0RGltO1xuXG4gICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtkfSksIDAuLCAwLiwgMC4pO1xuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuZyA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0yXX0gPSAke2RbcC0yXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gLSAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSAmJlxuICAgICAgICAgICAgICAgICR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHtPLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpjLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxzaGFkZXJTb3VyY2U6UyxoYXNNYWluOiEwfSl9KShlLHUsdCxuLmF4aXMpfSl9O2NvbnN0IGE9KGUsdCxuKT0+e2NvbnN0IHI9ZS5pbmRleE9mKHQpO3JldHVybiBlLm1hcCgoKGUsdCk9PnQ9PT1yP2Ake2V9IC0gJHtufWA6ZSkpLmpvaW4oKX07fSw2NjY4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXM9dC5jb25jYXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNTYzOSksaT1uKDQ1OTUpO3QuY29uY2F0PShlLHQsbik9PihwKHQpLGUuc2Vzc2lvbi5wYWNrJiZ0WzBdLmRpbXMubGVuZ3RoPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihzKGUsdCxuKSx0KV0pO2NvbnN0IHM9KGUsdCxuKT0+e2NvbnN0IHI9KGk9dC5sZW5ndGgscz1uLmNhY2hlS2V5LHtuYW1lOiJDb25jYXQiLGlucHV0TmFtZXM6QXJyYXkuZnJvbSh7bGVuZ3RoOml9LCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6QXJyYXkoaSkuZmlsbChvLlRleHR1cmVUeXBlLnVucGFja2VkKSxjYWNoZUhpbnQ6c30pO3ZhciBpLHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgaT1uWzBdLmRpbXMuc2xpY2UoKTtpZihyPj1pLmxlbmd0aHx8cjwtMSppLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF4aXMgc3BlY2lmaWVkIGZvciBjb25jYXQgZG9lc24ndCBtYXRjaCBpbnB1dCBkaW1lbnNpb25hbGl0eSIpO3I8MCYmKHI9aS5sZW5ndGgrcik7Y29uc3Qgcz1pLnNsaWNlKDApO2ZvcihsZXQgZT0xO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCB0PW5bZV0uZGltcy5zbGljZSgpO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKWlmKGU9PT1yKXNbcl0rPXRbZV07ZWxzZSBpZihpW2VdIT09dFtlXSl0aHJvdyBuZXcgRXJyb3IoIm5vbiBjb25jYXQgZGltZW5zaW9ucyBtdXN0IG1hdGNoIil9Y29uc3QgcD1zLmxlbmd0aCxkPW5ldyBBcnJheShuLmxlbmd0aCk7bGV0IGY9MDtmb3IobGV0IGU9MDtlPGQubGVuZ3RoOysrZSlmKz1uW2VdLmRpbXNbcl0sZFtlXT1mO2xldCBoPSIiO2g9bi5sZW5ndGg8NT9hKGQpOnUoZCk7Y29uc3QgZz1gXG4gICAgICAgICR7bChuLmxlbmd0aCxwKX1cbiAgICAgICAgJHtjKGQpfVxuICAgICAgICAke2h9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtwfV0pIHtcbiAgICAgICAgICBpbnQgdGV4dHVyZUluZGV4ID0gZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMgKGluZGljZXNbJHtyfV0pO1xuXG4gICAgICAgICAgaWYodGV4dHVyZUluZGV4ICE9IDApIHtcbiAgICAgICAgICAgIGluZGljZXNbJHtyfV0gPSBpbmRpY2VzWyR7cn1dIC0gaW50KGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleCh0ZXh0dXJlSW5kZXgtaW50KDEpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YUZyb21Db3JyZWN0VGV4dHVyZSh0ZXh0dXJlSW5kZXgsIGluZGljZXMpO1xuICAgICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6cyx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Z30pfSkoMCxyLHQsbi5heGlzKX0pfSxhPWU9PmBpbnQgZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMoaW50IGluZGV4KSB7XG4gICAgICAke2UubWFwKCgoZSx0KT0+YGlmKGluZGV4PCR7ZX0pIHtyZXR1cm4gJHt0fTt9XG5gKSkuam9pbigiIil9XG4gICAgfWAsdT1lPT5hKGUpLGw9KGUsdCk9Pntjb25zdCBuPVtgZmxvYXQgZmV0Y2hEYXRhRnJvbUNvcnJlY3RUZXh0dXJlKGludCB0ZXh0dXJlSW5kZXgsIGludCBpbmRpY2VzWyR7dH1dKSB7YF07Zm9yKGxldCB0PTA7dDxlOysrdCkwPT09dD9uLnB1c2goYFx0aWYgKHRleHR1cmVJbmRleCA9PSAke3R9KSB7IHJldHVybiBfWCR7dH0oaW5kaWNlcyk7IH1gKTp0PT09ZS0xP24ucHVzaChgXHRlbHNlIHsgcmV0dXJuIF9YJHt0fShpbmRpY2VzKTsgfWApOm4ucHVzaChgXHRlbHNlIGlmICh0ZXh0dXJlSW5kZXggPT0gJHt0fSkgeyByZXR1cm4gX1gke3R9KGluZGljZXMpOyB9YCk7cmV0dXJuIG4ucHVzaCgiXHR9Iiksbi5qb2luKCJcbiIpfSxjPWU9Pntjb25zdCB0PVsiaW50IGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleChpbnQgaW5kZXgpIHsiXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbikwPT09bj90LnB1c2goYFx0aWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTpuPT09ZS5sZW5ndGgtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiAke2Vbbl19OyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTtyZXR1cm4gdC5wdXNoKCJcdH0iKSx0LmpvaW4oIlxuIil9O3QucGFyc2VDb25jYXRBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIpfSk7Y29uc3QgcD1lPT57aWYoIWV8fGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJ0b28gZmV3IGlucHV0cyIpO2NvbnN0IHQ9ZVswXS50eXBlLG49ZVswXS5kaW1zLmxlbmd0aDtpZigic3RyaW5nIj09PXQpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Zm9yKGNvbnN0IHIgb2YgZSl7aWYoci50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHRlbnNvcnMgc2hvdWxkIGJlIG9uZSB0eXBlIik7aWYoci5kaW1zLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKCJpbnB1dCB0ZW5zb3JzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNoYXBlIil9fTt9LDc4MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big2NzU3KSxpPW4oNTYzOSkscz1uKDk3NTQpLGE9bigyMTUwKTt0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgdT0obD10Lmxlbmd0aD4yLGM9bi5jYWNoZUtleSx7bmFtZToiR3JvdXBlZENvbnYiLGlucHV0TmFtZXM6bD9bIlgiLCJXIiwiQmlhcyJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmw/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6Y30pO3ZhciBsLGM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7Z2V0OigpPT4oKGUsdCxuLHUpPT57Y29uc3QgbD10Lmxlbmd0aD4yPyJ2YWx1ZSArPSBnZXRCaWFzKG91dHB1dF9jaGFubmVsKTsiOiIiLGM9dFswXS5kaW1zLnNsaWNlKCkscD10WzFdLmRpbXMuc2xpY2UoKSxkPXBbMF0vdS5ncm91cDtyLkxvZ2dlci52ZXJib3NlKCJHcm91cGVkQ29udiIsYGF1dHBQYWQ6JHt1LmF1dG9QYWR9LCBkaWxhdGlvbnM6JHt1LmRpbGF0aW9uc30sIGdyb3VwOiR7dS5ncm91cH0sIGtlcm5lbFNoYXBlOiR7dS5rZXJuZWxTaGFwZX0sIHBhZHM6JHt1LnBhZHN9LCBzdHJpZGVzOiR7dS5zdHJpZGVzfWApO2NvbnN0IGY9KDAsIHMuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKGMscCx1LmRpbGF0aW9ucyx1LnBhZHMsdS5zdHJpZGVzKSxoPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmcsYXBwbHlBY3RpdmF0aW9uOmJ9PSgwLCBhLmdldEFjdGl2YXRpb25TbmlwcGV0KSh1KSxtPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7dS5zdHJpZGVzWzBdfSwgJHt1LnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7dS5wYWRzWzBdfSwgJHt1LnBhZHNbMV19KTtcbiAgJHtnfVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG4gICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnp3ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2R9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAwLjA7XG4gICAgZm9yIChpbnQgd0luQ2hhbm5lbCA9IDA7IHdJbkNoYW5uZWwgPCAke3BbMV19OyB3SW5DaGFubmVsKyspIHtcbiAgICAgIGludCBpbnB1dF9jaGFubmVsID0gZ3JvdXBfaWQgKiAke3BbMV19ICsgd0luQ2hhbm5lbDtcbiAgICAgIGZvciAoaW50IHdIZWlnaHQgPSAwOyB3SGVpZ2h0IDwgJHtwWzJdfTsgd0hlaWdodCsrKSB7XG4gICAgICAgIGludCB4SGVpZ2h0ID0geFJDQ29ybmVyLnggKyB3SGVpZ2h0ICogJHt1LmRpbGF0aW9uc1swXX07XG5cbiAgICAgICAgaWYgKHhIZWlnaHQgPCAwIHx8IHhIZWlnaHQgPj0gJHtjWzJdfSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpbnQgd1dpZHRoID0gMDsgd1dpZHRoIDwgJHtwWzNdfTsgd1dpZHRoKyspIHtcbiAgICAgICAgICBpbnQgeFdpZHRoID0geFJDQ29ybmVyLnkgKyB3V2lkdGggKiAke3UuZGlsYXRpb25zWzFdfTtcbiAgICAgICAgICBpZiAoeFdpZHRoIDwgMCB8fCB4V2lkdGggPj0gJHtjWzNdfSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgeFZhbCA9IGdldFgoYmF0Y2gsIGlucHV0X2NoYW5uZWwsIHhXaWR0aCwgeEhlaWdodCk7XG4gICAgICAgICAgZmxvYXQgd1ZhbCA9IGdldFcob3V0cHV0X2NoYW5uZWwsIHdJbkNoYW5uZWwsIHdXaWR0aCwgd0hlaWdodCk7XG4gICAgICAgICAgdmFsdWUgKz0geFZhbCp3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7bH1cbiAgICAke2J9XG4gICAgJHtoLm91dHB1dH0gPSB2ZWM0KHZhbHVlLCAuMCwgLjAsIC4wKTtcbiAgfVxuYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6Zix0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSxoYXNNYWluOiEwfSl9KShlLHQsdSxuKX0pfTt9LDc3MDg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbnYyRFBhY2tlZD10LmNvbnYyRFBhY2tlZFBvaW50d2lzZT12b2lkIDA7Y29uc3Qgcj1uKDk3NTQpLG89big1OTUwKSxpPW4oNTYzMik7dC5jb252MkRQYWNrZWRQb2ludHdpc2U9KGUsdCxuKT0+e2NvbnN0IG89dFswXS5kaW1zLHM9dFsxXS5kaW1zLGE9KDAsIHIuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8scyxuLmRpbGF0aW9ucyxuLnBhZHMsbi5zdHJpZGVzKSx1PWUucmVzaGFwZVBhY2tlZCh0WzBdLFtvWzFdLG9bMl0qb1szXV0pLGw9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW3NbMF0sc1sxXV0pLGM9dC5sZW5ndGg+Mj9bbCx1LHRbMl1dOltsLHVdLHA9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUsYyxuKSxjKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKHAsYSl9LHQuY29udjJEUGFja2VkPShlLHQsbik9Pntjb25zdCBzPXRbMF0uZGltcyxhPXRbMV0uZGltcyx1PSgwLCByLmNhbGN1bGF0ZU91dHB1dFNoYXBlKShzLGEsbi5kaWxhdGlvbnMsbi5wYWRzLG4uc3RyaWRlcyksbD1lLnJ1bigoMCwgby5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcikoZSx0WzBdLHRbMV0sdSxuKSxbdFswXV0pLGM9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW2FbMF0sYVsxXSphWzJdKmFbM11dKSxwPTM9PT10Lmxlbmd0aD9bYyxsLHRbMl1dOltjLGxdLGQ9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUscCxuKSxwKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKGQsdSl9O30sNTA0MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlcz10LmNvbnZUcmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9bigyMTUwKSxhPShlLHQsbixyLG8saSk9PihlLTEpKnQrbisoci0xKSpvKzEtaSx1PShlLHQsbixyLG8pPT57Y29uc3QgaT1NYXRoLmZsb29yKGUvMik7IlNBTUVfVVBQRVIiPT09dD8obltyXT1pLG5bb109ZS1pKToiU0FNRV9MT1dFUiI9PT10JiYobltyXT1lLWksbltvXT1pKTt9O3QuY29udlRyYW5zcG9zZT0oZSx0LG4pPT4oZCh0LG4pLGwoZSx0LG4pKTtjb25zdCBsPShlLHQsbik9Pntjb25zdCByPXAobix0KTtyZXR1cm4gW2MoZSx0LHIpXX0sYz0oZSx0LG4pPT5lLnJ1bigoKGUsdCxuKT0+e2NvbnN0IHI9KGE9dC5sZW5ndGg+Mix1PW4uY2FjaGVLZXkse25hbWU6IkNvbnZUcmFuc3Bvc2UiLGlucHV0TmFtZXM6YT9bIlgiLCJXIiwiQiJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmE/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciBhLHU7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgYT10Lmxlbmd0aD4yPyJnZXRCKG91dHB1dF9jaGFubmVsKSI6IjAuMCIsdT10WzBdLmRpbXMsbD10WzFdLmRpbXMsYz1sWzFdLHA9bFswXS9yLmdyb3VwLGQ9W3RbMF0uZGltc1swXSx0WzFdLmRpbXNbMV0qci5ncm91cCwuLi5yLm91dHB1dFNoYXBlXSxmPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmgsYXBwbHlBY3RpdmF0aW9uOmd9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShyKSxiPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7ci5zdHJpZGVzWzBdfSwgJHtyLnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7ci5wYWRzWzBdfSwgJHtyLnBhZHNbMV19KTtcbiAgJHtofVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG5cbiAgICBpdmVjMiBsb2MgPSBjb29yZHMuencgKyBwYWRzO1xuXG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2N9O1xuICAgIGludCB3T3V0Q2hhbm5lbCA9IG91dHB1dF9jaGFubmVsIC0gZ3JvdXBfaWQgKiAke2N9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAke2F9O1xuICAgIGZvciAoaW50IGluQ2hhbm5lbE9mZnNldCA9IDA7IGluQ2hhbm5lbE9mZnNldCA8ICR7cH07IGluQ2hhbm5lbE9mZnNldCsrKSB7XG4gICAgICBpbnQgaW5wdXRfY2hhbm5lbCA9IGdyb3VwX2lkICogJHtwfSArIGluQ2hhbm5lbE9mZnNldDtcbiAgICAgIGZvciAoaW50IHdXT2ZmID0gMDsgd1dPZmYgPCAke2xbMl19OyB3V09mZisrKSB7XG4gICAgICAgIGZvciAoaW50IHdIT2ZmID0gMDsgd0hPZmYgPCAke2xbM119OyB3SE9mZisrKSB7XG4gICAgICAgICAgaXZlYzIgd09mZiA9IGl2ZWMyKHdXT2ZmICogJHtyLmRpbGF0aW9uc1swXX0sIHdIT2ZmICogJHtyLmRpbGF0aW9uc1sxXX0pO1xuICAgICAgICAgIGl2ZWMyIHdMb2MgPSBsb2MgLSB3T2ZmO1xuICAgICAgICAgIGl2ZWMyIHdMb2NJbiA9IHdMb2MgLyBzdHJpZGVzO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHdMb2NJbiAqIHN0cmlkZXMgPT0gd0xvYyAmJlxuICAgICAgICAgICAgd0xvY0luLnggPj0gMCAmJiB3TG9jSW4ueCA8ICR7dVsyXX0gJiZcbiAgICAgICAgICAgIHdMb2NJbi55ID49IDAgJiYgd0xvY0luLnkgPCAke3VbM119XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaW5wdXRfY2hhbm5lbCwgd0xvY0luLnksIHdMb2NJbi54KTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKGlucHV0X2NoYW5uZWwsIHdPdXRDaGFubmVsLCB3SE9mZiwgd1dPZmYpO1xuICAgICAgICAgICAgdmFsdWUgKz0geFZhbCAqIHdWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7Z31cbiAgICAke2Yub3V0cHV0fSA9IHZlYzQodmFsdWUsIC4wLCAuMCwgLjApO1xuICB9XG5gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpkLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOmkuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpiLGhhc01haW46ITB9KX0pKGUsdCxyLG4pfSl9KShlLHQsbiksdCkscD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCksbz1lLm91dHB1dFNoYXBlLnNsaWNlKCk7KChlLHQsbixyLG8saSxzLGwpPT57Y29uc3QgYz1lLmxlbmd0aC0yLHA9MD09PWwubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8YzsrK2Qpe2NvbnN0IGY9cD9lW2QrMl0qaVtkXTpsW2RdLGg9YShlW2QrMl0saVtkXSxvW2RdLHRbZF0sbltkXSxmKTt1KGgscixvLGQsZCtjKSxwJiZsLnB1c2goaVtkXSooZVtkKzJdLTEpK3NbZF0rKHRbZF0tMSkqbltkXSsxLW9bZF0tb1tkK2NdKTt9fSkodFswXS5kaW1zLG4sZS5kaWxhdGlvbnMsZS5hdXRvUGFkLHIsZS5zdHJpZGVzLGUub3V0cHV0UGFkZGluZyxvKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oaSx7a2VybmVsU2hhcGU6bixwYWRzOnIsb3V0cHV0U2hhcGU6byxjYWNoZUtleTplLmNhY2hlS2V5fSksaX07dC5wYXJzZUNvbnZUcmFuc3Bvc2VBdHRyaWJ1dGVzPWU9Pntjb25zdCB0PWUuYXR0cmlidXRlcyxuPSgwLCBzLnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcykodCksbz10LmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxpPXQuZ2V0SW50cygiZGlsYXRpb25zIixbMSwxXSksYT10LmdldEludCgiZ3JvdXAiLDEpLHU9dC5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiLFtdKSxsPXQuZ2V0SW50cygib3V0cHV0X3BhZGRpbmciLFswLDBdKSxjPXQuZ2V0SW50cygib3V0cHV0X3NoYXBlIixbXSkscD10LmdldEludHMoInBhZHMiLFswLDAsMCwwXSksZD10LmdldEludHMoInN0cmlkZXMiLFsxLDFdKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KShPYmplY3QuYXNzaWduKHthdXRvUGFkOm8sZGlsYXRpb25zOmksZ3JvdXA6YSxrZXJuZWxTaGFwZTp1LG91dHB1dFBhZGRpbmc6bCxvdXRwdXRTaGFwZTpjLHBhZHM6cCxzdHJpZGVzOmR9LG4pKX07Y29uc3QgZD0oZSx0KT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgmJjMhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgcmVxdWlyZXMgMiBvciAzIGlucHV0cyIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RofHw0IT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMi1kaW1lbnNpb25hbCBjb252Iik7aWYoZVswXS5kaW1zWzFdIT09ZVsxXS5kaW1zWzBdKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2NvbnN0IG49ZVsxXS5kaW1zWzFdKnQuZ3JvdXA7aWYoMz09PWUubGVuZ3RoJiYoMSE9PWVbMl0uZGltcy5sZW5ndGh8fGVbMl0uZGltc1swXSE9PW4pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgcj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtyfURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7cn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqcil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipyfURgKTtpZih0Lm91dHB1dFBhZGRpbmcubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYG91dHB1dF9wYWRkaW5nIHNob3VsZCBiZSAke3J9RGApO2lmKDAhPT10Lmtlcm5lbFNoYXBlLmxlbmd0aCYmdC5rZXJuZWxTaGFwZS5sZW5ndGghPT1lWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKDAhPT10Lm91dHB1dFNoYXBlLmxlbmd0aCYmdC5vdXRwdXRTaGFwZS5sZW5ndGghPT1lWzBdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG91dHB1dCBzaGFwZSIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiQ29udlRyYW5zcG9zZSBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZigzPT09ZS5sZW5ndGgmJiJmbG9hdDMyIiE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnZUcmFuc3Bvc2UgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfTt9LDk3NTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ29udkF0dHJpYnV0ZXM9dC5jb252PXQuY2FsY3VsYXRlT3V0cHV0U2hhcGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDc4MjUpLHM9big3NzA4KSxhPW4oMzI4MSksdT1uKDIxNTApLGw9bigxNjI1KSxjPW4oODI3Nik7dC5jYWxjdWxhdGVPdXRwdXRTaGFwZT0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZVswXSxzPWUuc2xpY2UoMiksYT1zLmxlbmd0aCx1PXRbMF0sbD10LnNsaWNlKDIpLm1hcCgoKGUsdCk9PmUrKGUtMSkqKG5bdF0tMSkpKSxjPXMubWFwKCgoZSx0KT0+ZStyW3RdK3JbdCthXSkpLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoKGUtbFt0XStvW3RdKS9vW3RdKSkpO3JldHVybiBbaSx1XS5jb25jYXQoLi4uYyl9LHQuY29udj0oZSx0LG4pPT4oZyh0LG4pLHAoZSx0LG4pKTtjb25zdCBwPShlLHQsbik9Pntjb25zdCByPWgobix0KSxvPWUuc2Vzc2lvbi5wYWNrLGE9MT09PXIua2VybmVsU2hhcGVbMF0mJjE9PT1yLmtlcm5lbFNoYXBlWzFdO3JldHVybiByLmdyb3VwPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcikoZSx0LHIpLHQpXTphJiZvP1tkKGUsdCxyKV06byYmND09PXRbMF0uZGltcy5sZW5ndGgmJjE9PT10WzBdLmRpbXNbMF0mJiFhP1soMCwgcy5jb252MkRQYWNrZWQpKGUsdCxyKV06W2YoZSx0LHIpXX0sZD0oZSxuLHIpPT57Y29uc3Qgbz1uWzBdLmRpbXMsaT1uWzFdLmRpbXMscz0oMCwgdC5jYWxjdWxhdGVPdXRwdXRTaGFwZSkobyxpLHIuZGlsYXRpb25zLHIucGFkcyxyLnN0cmlkZXMpLGE9ZS5yZXNoYXBlVW5wYWNrZWQoblswXSxbb1sxXSxvWzJdKm9bM11dKSx1PWUucmVzaGFwZVVucGFja2VkKG5bMV0sW2lbMF0saVsxXV0pLGw9bi5sZW5ndGg+Mj9bdSxhLG5bMl1dOlt1LGFdLHA9ZS5ydW4oKDAsIGMuY3JlYXRlTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGwsciksbCk7cmV0dXJuIGUucmVzaGFwZVVucGFja2VkKHAscyl9LGY9KGUsbixyKT0+e2NvbnN0IG89blswXS5kaW1zLGk9blsxXS5kaW1zLHM9KDAsIHQuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8saSxyLmRpbGF0aW9ucyxyLnBhZHMsci5zdHJpZGVzKSx1PWUucnVuKCgwLCBsLmNyZWF0ZUltMkNvbFByb2dyYW1JbmZvTG9hZGVyKShlLG5bMF0sblsxXSxzLHIpLFtuWzBdXSksYz0zPT09bi5sZW5ndGg/W3UsblsxXSxuWzJdXTpbdSxuWzFdXTtyZXR1cm4gZS5ydW4oKDAsIGEuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyKShlLG4scyxyKSxjKX0saD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCk7by5Qb29sQ29udlV0aWwuYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKHRbMF0uZGltcyxlLnN0cmlkZXMsZS5kaWxhdGlvbnMsbixyLGUuYXV0b1BhZCk7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBPYmplY3QuYXNzaWduKGkse2tlcm5lbFNoYXBlOm4scGFkczpyLGNhY2hlS2V5OmUuY2FjaGVLZXl9KSxpfTt0LnBhcnNlQ29udkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLG49KDAsIHUucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzKSh0KSxvPXQuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLGk9dC5nZXRJbnRzKCJkaWxhdGlvbnMiLFsxLDFdKSxzPXQuZ2V0SW50KCJncm91cCIsMSksYT10LmdldEludHMoImtlcm5lbF9zaGFwZSIsW10pLGw9dC5nZXRJbnRzKCJwYWRzIixbMCwwLDAsMF0pLGM9dC5nZXRJbnRzKCJzdHJpZGVzIixbMSwxXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoT2JqZWN0LmFzc2lnbih7YXV0b1BhZDpvLGRpbGF0aW9uczppLGdyb3VwOnMsa2VybmVsU2hhcGU6YSxwYWRzOmwsc3RyaWRlczpjfSxuKSl9O2NvbnN0IGc9KGUsdCk9PntpZighZXx8MiE9PWUubGVuZ3RoJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDb252IHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZig0IT09ZVswXS5kaW1zLmxlbmd0aHx8NCE9PWVbMV0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjdXJyZW50bHkgb25seSBzdXBwb3J0IDItZGltZW5zaW9uYWwgY29udiIpO2lmKGVbMF0uZGltc1sxXSE9PWVbMV0uZGltc1sxXSp0Lmdyb3VwKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2lmKDM9PT1lLmxlbmd0aCYmKDEhPT1lWzJdLmRpbXMubGVuZ3RofHxlWzFdLmRpbXNbMF0hPT1lWzJdLmRpbXNbMF0pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgbj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtufURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7bn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqbil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipufURgKTtpZigwIT09dC5rZXJuZWxTaGFwZS5sZW5ndGgmJnQua2VybmVsU2hhcGUubGVuZ3RoIT09ZVsxXS5kaW1zLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBrZXJuZWwgc2hhcGUiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGV8fCJmbG9hdDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgaW5wdXQoWCxXKSBzaG91bGQgYmUgZmxvYXQgdGVuc29yIik7aWYoMz09PWUubGVuZ3RoJiYiZmxvYXQzMiIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJDb252IGlucHV0KGJpYXMpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKX07fSw2NzQyOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9dC5kZXB0aFRvU3BhY2U9dm9pZCAwO2NvbnN0IHI9big1NzA3KTt0LmRlcHRoVG9TcGFjZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPW4uYmxvY2tzaXplLHM9aSppLGE9IkRDUiI9PT1uLm1vZGU/WzAsMyw0LDEsNSwyXTpbMCwxLDQsMiw1LDNdLHU9IkRDUiI9PT1uLm1vZGU/W3RbMF0uZGltc1swXSxpLGksdFswXS5kaW1zWzFdL3MsdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV06W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyxpLGksdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV0sbD1lLnJlc2hhcGVVbnBhY2tlZCh0WzBdLHUpLGM9e3Blcm06YSxjYWNoZUtleTpgJHthfWB9LFtwXT0oMCwgci50cmFuc3Bvc2UpKGUsW2xdLGMpLGQ9W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyx0WzBdLmRpbXNbMl0qaSx0WzBdLmRpbXNbM10qaV07cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZChwLGQpXX0sdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYmxvY2tzaXplIik7aWYodDwxKXRocm93IG5ldyBFcnJvcihgYmxvY2tzaXplIG11c3QgYmUgPj0gMSwgYnV0IGdvdCA6ICR7dH0gZm9yIERlcHRoVG9TcGFjZWApO2NvbnN0IG49ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIkRDUiIpO2lmKCJEQ1IiIT09biYmIkNSRCIhPT1uKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIG1vZGU6ICR7bn0gZm9yIERlcHRoVG9TcGFjZWApO3JldHVybiB7bW9kZTpuLGJsb2Nrc2l6ZTp0fX07Y29uc3Qgbz1lPT57aWYoMSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgRGVwdGhUb1NwYWNlIGV4cGVjdCAxIGlucHV0cywgYnV0IGdvdCAke2UubGVuZ3RofWApO2lmKCJzdHJpbmciPT09ZVswXS50eXBlfHw0IT09ZVswXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXB0aFRvU3BhY2UgaW5wdXQgc2hvdWxkIGJlIGEgNC1EIG51bWVyaWMgdGVuc29yIil9O30sMzI4MTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oMjE1MCksYT1uKDE2MjUpO3QuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbix1KT0+e2NvbnN0IGw9KChlLHQpPT4oe25hbWU6IkNvbnZEb3RQcm9kdWN0IixpbnB1dE5hbWVzOmU/WyJJbTJDb2wiLCJLIiwiQiJdOlsiSW0yQ29sIiwiSyJdLGlucHV0VHlwZXM6ZT9baS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24saS5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uXSxjYWNoZUtleTp0LmFjdGl2YXRpb25DYWNoZUtleX0pKSh0Lmxlbmd0aD4yLHUpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbix1LGwpPT57Y29uc3QgYz1uWzBdLmRpbXMscD1uWzFdLmRpbXMsZD1bcFswXSxNYXRoLmNlaWwoY1sxXSpwWzJdKnBbM10vNCldLGY9KDAsIGEuY2FsY3VsYXRlSW0yQ29sRGltcykoYyxwLHUpLFtoLGddPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxiPXIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGYpLFttLHldPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGYsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSx2PXUubGVuZ3RoLF89bi5sZW5ndGg8Mz8iMC4wIjoiX0IoYikiLHc9TWF0aC5jZWlsKGNbMV0qcFsyXSpwWzNdLzQpLHthY3RpdmF0aW9uRnVuY3Rpb246VCxhcHBseUFjdGl2YXRpb246eH09KDAsIHMuZ2V0QWN0aXZhdGlvblNuaXBwZXQpKGwpLE89KDAsIG8uZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuJHtUfVxuZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske3Z9XSkge1xuICBpbnQgYlsxXTtcbiAgYlswXSA9IGluZGljZXNbMV07XG4gIGludCBpbTJjb2xbNF07XG4gIGltMmNvbFswXSA9IGluZGljZXNbMF07XG4gIGltMmNvbFsxXSA9IGluZGljZXNbMl07XG4gIGltMmNvbFsyXSA9IGluZGljZXNbM107XG4gIGludCBpbTJjb2xPZmZzZXQgPSBpbTJjb2xbMF0gKiAke2JbMF19ICsgaW0yY29sWzFdICogJHtiWzFdfSArIGltMmNvbFsyXSAqICR7YlsyXX07XG4gIGludCBrZXJuZWxPZmZzZXQgPSBpbmRpY2VzWzFdICogJHtkWzFdfTtcbiAgZmxvYXQgdmFsdWUgPSAke199O1xuICBmb3IgKGludCBpID0gMDsgaSA8ICR7d307ICsraSkge1xuICAgIHZlYzIgaW0yY29sQ29vcmRzID0gb2Zmc2V0VG9Db29yZHMoaW0yY29sT2Zmc2V0LCAke219LCAke3l9KTtcbiAgICB2ZWMyIGtlcm5lbENvb3JkcyA9IG9mZnNldFRvQ29vcmRzKGtlcm5lbE9mZnNldCwgJHtofSwgJHtnfSk7XG4gICAgdmFsdWUgKz0gZG90KCR7Ty50ZXh0dXJlMkR9KEltMkNvbCwgaW0yY29sQ29vcmRzKSwgJHtPLnRleHR1cmUyRH0oSywga2VybmVsQ29vcmRzKSk7XG4gICAgKytpbTJjb2xPZmZzZXQ7XG4gICAgKytrZXJuZWxPZmZzZXQ7XG4gIH1cbiAgJHt4fVxuICByZXR1cm4gdmFsdWU7XG59YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6U30pfSkoZSxsLHQsbix1KX0pfTt9LDQxMjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlRmxhdHRlbkF0dHJpYnV0ZXM9dC5mbGF0dGVuPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5mbGF0dGVuPShlLHQsbik9PntvKHQsbik7Y29uc3QgaT1yLlNoYXBlVXRpbC5mbGF0dGVuU2hhcGUodFswXS5kaW1zLG4pO3JldHVybiBbZS5yZXNoYXBlVW5wYWNrZWQodFswXSxpKV19LHQucGFyc2VGbGF0dGVuQXR0cmlidXRlcz1lPT5lLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwxKTtjb25zdCBvPShlLHQpPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkZsYXR0ZW4gcmVxdWlyZXMgMSBpbnB1dC4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJzY2FsYXIgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYodDwtbnx8dD5uKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBheGlzIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIil9O30sMjE1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzPXQuZ2V0QWN0aXZhdGlvblNuaXBwZXQ9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oOTA4Nyk7dC5nZXRBY3RpdmF0aW9uU25pcHBldD1mdW5jdGlvbihlKXtsZXQgdDtzd2l0Y2goZS5hY3RpdmF0aW9uKXtjYXNlIlJlbHUiOnQ9KDAsIG8uZ2xzbFJlbHUpKCk7YnJlYWs7Y2FzZSJTaWdtb2lkIjp0PSgwLCBvLmdsc2xTaWdtb2lkKSgpO2JyZWFrO2Nhc2UiQ2xpcCI6dD0oMCwgby5nbHNsQ2xpcCkoZS5jbGlwTWluLGUuY2xpcE1heCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4ge2FjdGl2YXRpb25GdW5jdGlvbjoiIixhcHBseUFjdGl2YXRpb246IiJ9fWNvbnN0IG49dC5uYW1lO3JldHVybiB7YWN0aXZhdGlvbkZ1bmN0aW9uOnQuYm9keSxhcHBseUFjdGl2YXRpb246YHZhbHVlID0gJHtufV8odmFsdWUpO2B9fSx0LnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmdldFN0cmluZygiYWN0aXZhdGlvbiIsIiIpO2lmKCJDbGlwIj09PXQpe2NvbnN0W24sb109ZS5nZXRGbG9hdHMoImFjdGl2YXRpb25fcGFyYW1zIixbci5NSU5fQ0xJUCxyLk1BWF9DTElQXSk7cmV0dXJuIHthY3RpdmF0aW9uOnQsY2xpcE1heDpvLGNsaXBNaW46bixhY3RpdmF0aW9uQ2FjaGVLZXk6YCR7dH06JHtufSwke299YH19cmV0dXJuIHthY3RpdmF0aW9uOnQsYWN0aXZhdGlvbkNhY2hlS2V5OnR9fTt9LDYxNDk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz10LmdhdGhlcj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpO3QuZ2F0aGVyPShlLHQsbik9PihsKHQsbi5heGlzKSxbZS5ydW4odShlLHQsbiksdCldKSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDApfSk7Y29uc3QgYT17bmFtZToiR2F0aGVyIixpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSx1PShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBvPW5bMF0uZGltcy5zbGljZSgpLGE9blsxXS5kaW1zLnNsaWNlKCksdT1uZXcgQXJyYXkoby5sZW5ndGgrYS5sZW5ndGgtMSk7cj1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKHIsby5sZW5ndGgpO2NvbnN0IGw9W107Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspZTxyPyh1W2VdPW9bZV0sbC5wdXNoKGBpbnB1dElkeFske2V9XSA9IG91dHB1dElkeFske2V9XTtgKSk6ZTxyK2EubGVuZ3RoPyh1W2VdPWFbZS1yXSxsLnB1c2goYGluZGV4RGF0YUlkeFske2Utcn1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKToodVtlXT1vW2UtYS5sZW5ndGgrMV0sbC5wdXNoKGBpbnB1dElkeFske2UtYS5sZW5ndGgrMX1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKTtjb25zdCBjPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske3UubGVuZ3RofHwxfV0pIHtcbiAgICAgICAgaW50IGlucHV0SWR4WyR7by5sZW5ndGh9XTtcbiAgICAgICAgaW50IGluZGV4RGF0YUlkeFske2EubGVuZ3RofHwxfV07XG4gICAgICAgIGluZGV4RGF0YUlkeFswXSA9IDA7XG4gICAgICAgICR7bC5qb2luKCJcbiAgICAgICAgIil9XG4gICAgICAgIGludCBpZHggPSBpbnQoX0IoaW5kZXhEYXRhSWR4KSk7XG4gICAgICAgIGlucHV0SWR4WyR7cn1dID0gaWR4IDwgMCA/IGlkeCArICR7b1tyXX0gOiBpZHg7XG4gICAgICAgIHJldHVybiBfQShpbnB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSkoMCxyLHQsbi5heGlzKX0pfSxsPShlLHQpPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkdhdGhlciByZXF1aXJlcyAyIGlucHV0cy4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYobjwxKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZih0PC1ufHx0Pm4tMSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcy4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGUmJiJpbnQxNiIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhaWQgaW5wdXQgdHlwZS4iKX07fSw1Mzc4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExPXQucGFyc2VHZW1tQXR0cmlidXRlc1Y3PXQuZ2VtbT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNTYzOSk7dC5nZW1tPShlLHQsbik9PihsKHQsbiksW2UucnVuKGEodCxuKSx0KV0pO2NvbnN0IHM9KGUsdCk9Pntjb25zdCBuPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0cmFuc0EiLDApLG89MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoInRyYW5zQiIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwxKSxzPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYmV0YSIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3RyYW5zQTpuLHRyYW5zQjpvLGFscGhhOmksYmV0YTpzLGlzT3B0aW9uYWxDOnR9KX07dC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjc9ZT0+cyhlLCExKSx0LnBhcnNlR2VtbUF0dHJpYnV0ZXNWMTE9ZT0+cyhlLCEwKTtjb25zdCBhPShlLHQpPT57Y29uc3Qgbj17bmFtZToiR2VtbSIsaW5wdXROYW1lczozPT09ZS5sZW5ndGg/WyJBIiwiQiIsIkMiXTpbIkEiLCJCIl0saW5wdXRUeXBlczozPT09ZS5sZW5ndGg/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxrZXk6dC5jYWNoZUtleX07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT51KG4sZSx0KX0pfSx1PShlLHQsbik9Pntjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLHM9dFsxXS5kaW1zLnNsaWNlKCksW2EsdV09by5HZW1tVXRpbC5nZXRTaGFwZU9mR2VtbVJlc3VsdChyLG4udHJhbnNBLHMsbi50cmFuc0IsMz09PXQubGVuZ3RoP3RbMl0uZGltczp2b2lkIDApLGw9W2EsdV07aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgZ2VtbSBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2xldCBjPXJbci5sZW5ndGgtMV0scD0iIjtuLnRyYW5zQSYmKGM9clswXSksbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BX1QoYSkgKiBfQl9UKGIpOyI6bi50cmFuc0EmJiFuLnRyYW5zQj9wPSJ2YWx1ZSArPSBfQV9UKGEpICogX0IoYik7Ijohbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BKGEpICogX0JfVChiKTsiOm4udHJhbnNBfHxuLnRyYW5zQnx8KHA9InZhbHVlICs9IF9BKGEpICogX0IoYik7Iik7Y29uc3QgZD1sLmxlbmd0aCxmPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtkfV0pIHtcbiAgICAgICAgICBpbnQgYVske2R9XTtcbiAgICAgICAgICBpbnQgYlske2R9XTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD9gaW50IGNbJHt0WzJdLmRpbXMubGVuZ3RofV07YDoiIn1cblxuICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgYSk7XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCBiKTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8iYmNhc3RJbmRpY2VzX0MoaW5kaWNlcywgYyk7IjoiIn1cblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gMC4wO1xuICAgICAgICAgIGZvciAoaW50IGs9MDsgazwke2N9OyArK2spIHtcbiAgICAgICAgICAgICAgYVske2QtMX1dID0gaztcbiAgICAgICAgICAgICAgYlske2QtMn1dID0gaztcbiAgICAgICAgICAgICAgJHtwfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiBhbHBoYTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8idmFsdWUgKz0gYmV0YSAqIF9DKGMpOyI6IiJ9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOmwsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sdmFyaWFibGVzOlt7bmFtZToiYWxwaGEiLHR5cGU6ImZsb2F0IixkYXRhOm4uYWxwaGF9LHtuYW1lOiJiZXRhIix0eXBlOiJmbG9hdCIsZGF0YTpuLmJldGF9XSxzaGFkZXJTb3VyY2U6Zn0pfSxsPShlLHQpPT57aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBpcyBtaXNzaW5nIik7aWYodC5pc09wdGlvbmFsQyYmKGUubGVuZ3RoPDJ8fGUubGVuZ3RoPjMpKXRocm93IG5ldyBFcnJvcigiSW52YWlkIGlucHV0IHNoYXBlLiIpO2lmKCF0LmlzT3B0aW9uYWxDJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJHZW1tIHJlcXVpcmVzIDMgaW5wdXRzIik7aWYoMz09PWUubGVuZ3RoJiYxIT09ZVsyXS5kaW1zLmxlbmd0aCYmMiE9PWVbMl0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlIG9mIEMiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGV8fDM9PT1lLmxlbmd0aCYmImZsb2F0MzIiIT09ZVsyXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoZVswXS50eXBlIT09ZVsxXS50eXBlfHwzPT09ZS5sZW5ndGgmJmVbMF0udHlwZSE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHR5cGVzIGFyZSBtaXNtYXRjaGVkIil9O30sNTk1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big2NzU3KSxvPW4oNTYzOSksaT1uKDU2MTQpO3QuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsdCxuLHMsYSk9Pntjb25zdCB1PShsPWEuY2FjaGVLZXkse25hbWU6IkltMkNvbCAocGFja2VkKSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50Omx9KTt2YXIgbDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4scyxhLHUpPT57Y29uc3QgbD1uLmRpbXMsYz1zLmRpbXMscD1hLmxlbmd0aCxkPVtjWzFdKmNbMl0qY1szXSxhWzJdKmFbM11dLGY9Y1syXSpjWzNdLGg9KDAsIGkudW5wYWNrRnJvbUNoYW5uZWwpKCksZz0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbik7bGV0IGI9IiI7Zm9yKGxldCBlPTA7ZTw9MTtlKyspZm9yKGxldCB0PTA7dDw9MTt0KyspYis9YFxuICAgICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnggKyAke3R9O1xuICAgICAgICAgICAgcG9zID0gcmMueSArICR7ZX07XG5cbiAgICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke2RbMV19ICYmIHBvcyA8ICR7ZFswXX0pIHtcbiAgICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gKCR7YVtwLTFdfSkpICogJHt1LnN0cmlkZXNbMF19IC1cbiAgICAgICAgICAgICAgICAke3UucGFkc1swXX07XG4gICAgICAgICAgICAgIGQwID0gb2Zmc2V0WSArICR7dS5kaWxhdGlvbnNbMF19ICogKGltb2QocG9zLCAke2Z9KSAvICR7Y1syXX0pO1xuXG4gICAgICAgICAgICAgIGlmKGQwIDwgJHtsWzJdfSAmJiBkMCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WCA9IGltb2QoYmxvY2tJbmRleCwgJHthW3AtMV19KSAqICR7dS5zdHJpZGVzWzFdfSAtXG4gICAgICAgICAgICAgICAgICAke3UucGFkc1sxXX07XG4gICAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgJHt1LmRpbGF0aW9uc1sxXX0gKiBpbW9kKGltb2QocG9zLCAke2Z9KSwgJHtjWzJdfSk7XG5cbiAgICAgICAgICAgICAgICBpZihkMSA8ICR7bFszXX0gJiYgZDEgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgICBjaCA9IGludChmbG9hdChwb3MpLyAke2Z9Lik7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7MiplK3R9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0QSgwLCBjaCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgICBpbnQoaW5uZXJEaW1zLnkpKSwgaW5uZXJEaW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGA7Y29uc3QgbT1gXG4gICAgICAke2h9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICAgIHZlYzIgaW5uZXJEaW1zO1xuICAgICAgICAgICR7Yn1cbiAgICAgICAgICAke2cub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmQsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTptLGhhc01haW46ITB9KX0pKGUsdSx0LG4scyxhKX0pfTt9LDE2MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNhbGN1bGF0ZUltMkNvbERpbXM9dC5jcmVhdGVJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDU2MzkpO3QuY3JlYXRlSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbixvLGkscyk9Pntjb25zdCBhPSh1PXMuY2FjaGVLZXkse25hbWU6IkltMkNvbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltyLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciB1O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLG4sbyxpLHMsYSk9Pntjb25zdCB1PW8uZGltcyxsPWkuZGltcyxjPXMubGVuZ3RoLHA9KDAsIHQuY2FsY3VsYXRlSW0yQ29sRGltcykodSxsLHMsNCksZD1gXG4gICAgICAgIGNvbnN0IGludCBYQyA9ICR7dVsxXX07XG4gICAgICAgIGNvbnN0IGludCBYSCA9ICR7dVsyXX07XG4gICAgICAgIGNvbnN0IGludCBYVyA9ICR7dVszXX07XG4gICAgICAgIGNvbnN0IGludCBLSCA9ICR7YS5rZXJuZWxTaGFwZVswXX07XG4gICAgICAgIGNvbnN0IGludCBLVyA9ICR7YS5rZXJuZWxTaGFwZVsxXX07XG4gICAgICAgIGNvbnN0IGludCBkaWxhdGlvbkggPSAke2EuZGlsYXRpb25zWzBdfTtcbiAgICAgICAgY29uc3QgaW50IGRpbGF0aW9uVyA9ICR7YS5kaWxhdGlvbnNbMV19O1xuICAgICAgICBjb25zdCBpbnQgc3RyaWRlSCA9ICR7YS5zdHJpZGVzWzBdfTtcbiAgICAgICAgY29uc3QgaW50IHN0cmlkZVcgPSAke2Euc3RyaWRlc1sxXX07XG4gICAgICAgIGNvbnN0IGludCBwYWRIID0gJHthLnBhZHNbMF19O1xuICAgICAgICBjb25zdCBpbnQgcGFkVyA9ICR7YS5wYWRzWzFdfTtcbiAgICAgICAgY29uc3QgaW50IEtIS1cgPSBLSCpLVztcbiAgICAgICAgY29uc3QgaW50IFhDS0hLVyA9IFhDICogS0hLVztcbiAgICAgICAgY29uc3QgaW50IG91dHB1dENoYW5uZWxzID0gNDtcbiAgICAgICAgdmVjNCBwcm9jZXNzKGludCBpbmRpY2VzWyR7Y31dKSB7XG4gICAgICAgICAgaW50IGIgID0gaW5kaWNlc1swXTsgLy8gYmF0Y2ggc2l6ZVxuICAgICAgICAgIGludCBvaCA9IGluZGljZXNbMV0gKiBzdHJpZGVIIC0gcGFkSDsgLy9vdXRwdXQgaGVpZ2h0XG4gICAgICAgICAgaW50IG93ID0gaW5kaWNlc1syXSAqIHN0cmlkZVcgLSBwYWRXOyAvL291dHB1dCB3aWR0aFxuICAgICAgICAgIGludCBwID0gaW5kaWNlc1szXSAqIG91dHB1dENoYW5uZWxzOyAvL3BhdGNoXG4gICAgICAgICAgdmVjNCB2YWx1ZSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaSA8IG91dHB1dENoYW5uZWxzOyArK2kpIHtcbiAgICAgICAgICAgIGlmKHAgPCBYQ0tIS1cpIHtcbiAgICAgICAgICAgICAgaW50IHBhdGNoQyA9IHAgLyBLSEtXO1xuICAgICAgICAgICAgICBpbnQgcGF0Y2hIID0gKHAgLSBwYXRjaEMqS0hLVykgLyBLVztcbiAgICAgICAgICAgICAgaW50IHBhdGNoVyA9IChwIC0gcGF0Y2hDKktIS1cpIC0gcGF0Y2hIICogS1c7XG4gICAgICAgICAgICAgIGludCB4aDIgPSBvaCArIHBhdGNoSCAqIGRpbGF0aW9uSDtcbiAgICAgICAgICAgICAgaW50IHh3MiA9IG93ICsgcGF0Y2hXICogZGlsYXRpb25XO1xuICAgICAgICAgICAgICBpbnQgeFske3UubGVuZ3RofV07XG4gICAgICAgICAgICAgIHhbMF0gPSBiO1xuICAgICAgICAgICAgICB4WzFdID0gcGF0Y2hDO1xuICAgICAgICAgICAgICB4WzJdID0geGgyO1xuICAgICAgICAgICAgICB4WzNdID0geHcyO1xuICAgICAgICAgICAgICBpZih4aDIgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgeGgyIDwgWEggJiZcbiAgICAgICAgICAgICAgICAgIHh3MiA+PSAwICYmXG4gICAgICAgICAgICAgICAgICB4dzIgPCBYVykge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gX1goeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOnAsdHlwZTpvLnR5cGUsdGV4dHVyZVR5cGU6ci5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6ZH0pfSkoMCxhLG4sbyxpLHMpfSl9LHQuY2FsY3VsYXRlSW0yQ29sRGltcz0oZSx0LG4scj00KT0+W25bMF0sblsyXSxuWzNdLE1hdGguY2VpbChlWzFdKnRbMl0qdFszXS9yKV07fSw2OTgxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz10LmltYWdlU2NhbGVyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDU2MzkpO3QuaW1hZ2VTY2FsZXI9KGUsdCxuKT0+KHUodCksW2UucnVuKHMoZSx0LG4pLHQpXSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInNjYWxlIiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXRzKCJiaWFzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3NjYWxlOnQsYmlhczpufSl9O2NvbnN0IGk9e25hbWU6IkltYWdlU2NhbGVyIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxzPShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBpPW5bMF0uZGltcy5zbGljZSgpLHM9aS5sZW5ndGgsdT1gXG4gICAgICAke2Eoci5iaWFzLmxlbmd0aCl9XG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgIHJldHVybiBfWChpbmRpY2VzKSAqIHNjYWxlICsgZ2V0QmlhcyhiaWFzLCBpbmRpY2VzWzFdKTtcbiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczppLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImJpYXMiLHR5cGU6ImZsb2F0IixhcnJheUxlbmd0aDpyLmJpYXMubGVuZ3RoLGRhdGE6ci5iaWFzfSx7bmFtZToic2NhbGUiLHR5cGU6ImZsb2F0IixkYXRhOnIuc2NhbGV9XSxzaGFkZXJTb3VyY2U6dX0pfSkoMCxyLHQsbil9KX0sYT1lPT57Y29uc3QgdD1bYGZsb2F0IGdldEJpYXMoZmxvYXQgYmlhc1ske2V9XSwgaW50IGNoYW5uZWwpIHtgXTtmb3IobGV0IG49MDtuPGU7KytuKTA9PT1uP3QucHVzaChgXHRpZiAoY2hhbm5lbCA9PSAke259KSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6bj09PWUtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGNoYW5uZWwgPT0gJHtufSkgeyByZXR1cm4gYmlhc1ske259XTsgfWApO3JldHVybiB0LnB1c2goIlx0fSIpLHQuam9pbigiXG4iKX0sdT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlU2NhbGVyIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoNCE9PWVbMF0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSYmImZsb2F0NjQiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDc0MTM6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlSW5zdGFuY2VOb3JtYWxpemF0aW9uQXR0cmlidXRlcz10Lmluc3RhbmNlTm9ybWFsaXphdGlvbj12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0Lmluc3RhbmNlTm9ybWFsaXphdGlvbj0oZSx0LG4pPT57bCh0KTtjb25zdCByPWUucnVuKHModFswXSksdCk7cmV0dXJuIFtlLnJ1bih1KGUsdFswXSxuLHIuZGltcyksW3RbMF0scix0WzFdLHRbMl1dKV19LHQucGFyc2VJbnN0YW5jZU5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXBzaWxvbiIsMWUtNSk7Y29uc3QgaT17bmFtZToiSW5zdGFuY2VOb3JtYWxpemF0aW9uX01lYW5BbmRWYXJpYW5jZSIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX0scz1lPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj10LmRpbXMuc2xpY2UoKSxyPW5bMV0saT1uWzJdKm5bM10scz1bblswXSxyXSxhPWBcbiAgICAgIHZlYzQgcHJvY2VzcyhpbnRbMl0gaW5kaWNlcykge1xuICAgICAgICB2ZWM0IHYgPSB2ZWM0KDAuMCk7XG4gICAgICAgIGludCBhWzRdO1xuICAgICAgICBhWzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgYVsxXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHRlbXAgPSAwLjA7XG4gICAgICAgIGZvcihpbnQgYTI9MDsgYTI8JHtuWzJdfTsgYTIrKykge1xuICAgICAgICAgIGFbMl0gPSBhMjtcbiAgICAgICAgICBmb3IoaW50IGEzPTA7IGEzPCR7blszXX07IGEzKyspIHtcbiAgICAgICAgICAgIGFbM10gPSBhMztcbiAgICAgICAgICAgIGZsb2F0IHggPSBfWChhKTtcbiAgICAgICAgICAgIHRlbXAgKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgbWVhbiA9IHRlbXAgLyBmbG9hdCgke2l9KTtcbiAgICAgICAgdGVtcCA9IDAuMDtcbiAgICAgICAgZm9yKGludCBhMj0wOyBhMjwke25bMl19OyBhMisrKSB7XG4gICAgICAgICAgYVsyXSA9IGEyO1xuICAgICAgICAgIGZvcihpbnQgYTM9MDsgYTM8JHtuWzNdfTsgYTMrKykge1xuICAgICAgICAgICAgYVszXSA9IGEzO1xuICAgICAgICAgICAgZmxvYXQgeCA9IF9YKGEpO1xuICAgICAgICAgICAgdGVtcCArPSAoeCAtIG1lYW4pICogKHggLSBtZWFuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdi5yID0gbWVhbjtcbiAgICAgICAgdi5nID0gdGVtcCAvIGZsb2F0KCR7aX0pO1xuXG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOnMsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6YX0pfSkoaSxlKX0pLGE9e25hbWU6Ikluc3RhbmNlTm9ybWFsaXphdGlvbl9Db21wdXRlT3V0cHV0IixpbnB1dE5hbWVzOlsiWCIsIk1lYW5BbmRWYXJpYW5jZSIsIlNjYWxlIiwiQiJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uLG8uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZF19LHU9KGUsdCxuLGkpPT57Y29uc3Qgcz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpgJHtufWB9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtnZXQ6KCk9PigoZSx0LG4saSxzKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHMsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxbYyxwXT1bdS80LGxdLGQ9YFxuICAgICAgdmVjNCBnZXRfTWVhbkFuZFZhcmlhbmNlKGludFsyXSBtdikge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke2N9LCAke3B9KTtcbiAgICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KE1lYW5BbmRWYXJpYW5jZSwgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbNF0gaW5kaWNlcykge1xuICAgICAgICBpbnQgbXZbMl07XG4gICAgICAgIG12WzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgbXZbMV0gPSBpbmRpY2VzWzFdO1xuICAgICAgICB2ZWM0IG1lYW5fYW5kX3ZhcmlhbmNlID0gZ2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIGZsb2F0IG1lYW4gPSBtZWFuX2FuZF92YXJpYW5jZS5yO1xuICAgICAgICBmbG9hdCB2YXJpYW5jZSA9IG1lYW5fYW5kX3ZhcmlhbmNlLmc7XG5cbiAgICAgICAgaW50IHNiWzFdO1xuICAgICAgICBzYlswXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHNjYWxlID0gX1NjYWxlKHNiKTtcbiAgICAgICAgZmxvYXQgYiA9IF9CKHNiKTtcblxuICAgICAgICByZXR1cm4gc2NhbGUgKiAoX1goaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBlcHNpbG9uKSArIGI7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6bi5kaW1zLHR5cGU6bi50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImVwc2lsb24iLHR5cGU6ImZsb2F0IixkYXRhOml9XSxzaGFkZXJTb3VyY2U6ZH0pfSkoZSxzLHQsbixpKX0pfSxsPWU9PntpZighZXx8MyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5zdGFuY2VOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDMgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdO2lmKHQuZGltcy5sZW5ndGg8M3x8MSE9PW4uZGltcy5sZW5ndGh8fDEhPT1yLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihuLmRpbXNbMF0hPT10LmRpbXNbMV18fHIuZGltc1swXSE9PXQuZGltc1sxXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSBzdXBwb3J0IDQtRCBpbnB1dCBzaGFwZS4iKX07fSw3MDA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVMcm5Qcm9ncmFtSW5mb0xvYWRlcj10LnBhcnNlTHJuQXR0cmlidXRlcz10Lmxybj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big1NjM5KTt0Lmxybj0oZSx0LG4pPT4oYSh0KSxbZS5ydW4ocyh0LG4pLHQpXSksdC5wYXJzZUxybkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMWUtNCksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJldGEiLC43NSksbz1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJpYXMiLDEpLGk9ZS5hdHRyaWJ1dGVzLmdldEludCgic2l6ZSIpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTp0LGJldGE6bixiaWFzOm8sc2l6ZTppfSl9O2NvbnN0IGk9e25hbWU6IkxSTiIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX07ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2NhY2hlSGludDp0LmNhY2hlS2V5LGdldDooKT0+ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWVbMF0uZGltc1sxXSxyPWVbMF0uZGltcy5sZW5ndGgscz0tTWF0aC5mbG9vcigodC5zaXplLTEpLzIpLGE9TWF0aC5jZWlsKCh0LnNpemUtMSkvMiksdT1gZmxvYXQoJHt0LmFscGhhfSkgLyBmbG9hdCgke3Quc2l6ZX0pYCxsPWBcbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cn1dKSB7XG4gICAgICAgIGludCBjID0gaW5kaWNlc1sxXTtcbiAgICAgICAgZmxvYXQgeCA9IF9YKGluZGljZXMpO1xuICAgICAgICBmbG9hdCBzcXVhcmVfc3VtID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAke3N9OyBpIDw9ICR7YX07IGkrKykge1xuICAgICAgICAgIGludCBpZHggPSBjICsgaTtcbiAgICAgICAgICBpZiAoYyA+PSAwICYmIGMgPCAke259KSB7XG4gICAgICAgICAgICBpbmRpY2VzWzFdID0gaWR4O1xuICAgICAgICAgICAgZmxvYXQgaiA9IF9YKGluZGljZXMpO1xuICAgICAgICAgICAgc3F1YXJlX3N1bSArPSBqICogajtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggLyBwb3coZmxvYXQoJHt0LmJpYXN9KSArICR7dX0gKiBzcXVhcmVfc3VtLCBmbG9hdCgke3QuYmV0YX0pKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtjYWNoZUhpbnQ6dC5jYWNoZUtleSxvdXRwdXQ6e2RpbXM6ZVswXS5kaW1zLHR5cGU6ZVswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpsfSl9KGUsdCl9KX10LmNyZWF0ZUxyblByb2dyYW1JbmZvTG9hZGVyPXM7Y29uc3QgYT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkxSTiByZXF1aXJlcyAxIGlucHV0LiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcignY3VycmVudGx5IG9ubHkgc3VwcG9ydCBMUk4gZm9yIGlucHV0IHdpdGggIk5DSFciIGZvcm1hdCcpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHNob3VsZCBiZSBmbG9hdCB0eXBlIil9O30sNTYzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9big0MzIpLGE9bigyMTUwKSx1PW4oODI3Nik7dC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgbD0oYz10Lmxlbmd0aD4yLHA9bi5hY3RpdmF0aW9uQ2FjaGVLZXkse25hbWU6Ik1hdE11bCAocGFja2VkKSIsaW5wdXROYW1lczpjP1siQSIsIkIiLCJCaWFzIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6Yz9baS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRdOltpLlRleHR1cmVUeXBlLnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50OnB9KTt2YXIgYyxwO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbixsKT0+e2NvbnN0IGM9bi5sZW5ndGg+MixwPWM/InZhbHVlICs9IGdldEJpYXNGb3JNYXRtdWwoKTsiOiIiLGQ9blswXS5kaW1zLGY9blsxXS5kaW1zLGg9ci5Ccm9hZGNhc3RVdGlsLmNhbGNTaGFwZShkLGYsITApLGc9IXIuU2hhcGVVdGlsLmFyZUVxdWFsKG5bMF0uZGltcyxuWzFdLmRpbXMpO2lmKCFoKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIG1hdG11bCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2NvbnN0IGI9ZFtkLmxlbmd0aC0xXSxtPU1hdGguY2VpbChiLzIpLHk9ZC5sZW5ndGgsdj1mLmxlbmd0aCxfPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx3PSgwLCBzLmdldENvb3Jkc0RhdGFUeXBlKShoLmxlbmd0aCksVD1oLmxlbmd0aCx4PSgwLCBzLmdldEdsQ2hhbm5lbHMpKCkse2FjdGl2YXRpb25GdW5jdGlvbjpPLGFwcGx5QWN0aXZhdGlvbjpTfT0oMCwgYS5nZXRBY3RpdmF0aW9uU25pcHBldCkobCksQT1jP2AkeygwLCB1LmdldEJpYXNGb3JNYXRtdWwpKHcseCxuWzJdLmRpbXMsaCwhMCl9YDoiIixQPWc/YCR7ZnVuY3Rpb24oZSx0LG4sbyl7bGV0IGk9W10scz1bXTtjb25zdCBhPW5bMF0uZGltcyx1PW5bMV0uZGltcyxsPWEubGVuZ3RoLGM9dS5sZW5ndGgscD1vLmxlbmd0aCxkPXAtbCxmPXAtYztpPWEubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitkXX1gKSksaVtsLTFdPSJpKjIiLGkuam9pbigiLCAiKSxzPXUubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitmXX1gKSksc1tjLTJdPSJpKjIiLHMuam9pbigiLCAiKTtjb25zdCBoPXIuQnJvYWRjYXN0VXRpbC5nZXRCcm9hZGNhc3REaW1zKGEsbyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyh1LG8pLGI9aC5tYXAoKGU9PmBjb29yZHMuJHt0W2UrZF19ID0gMDtgKSkuam9pbigiXG4iKSxtPWcubWFwKChlPT5gY29vcmRzLiR7dFtlK2ZdfSA9IDA7YCkpLmpvaW4oIlxuIikseT1gaW50IGxhc3REaW0gPSBjb29yZHMuJHt0W3AtMV19O1xuICBjb29yZHMuJHt0W3AtMV19ID0gY29vcmRzLiR7dFtwLTJdfTtcbiAgY29vcmRzLiR7dFtwLTJdfSA9IGxhc3REaW07YDtyZXR1cm4gYFxudmVjNCBnZXRBQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHt5fVxuICAke2J9XG4gIHZlYzQgb3V0cHV0VmFsdWUgPSBnZXRBKCR7aX0pO1xuICByZXR1cm4gb3V0cHV0VmFsdWU7XG59XG5cbnZlYzQgZ2V0QkF0T3V0Q29vcmRzTWF0bXVsKGludCBpKSB7XG4gICR7ZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICR7eX1cbiAgJHttfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qigke3N9KTtcbiAgcmV0dXJuIG91dHB1dFZhbHVlO1xufWB9KHcseCxuLGgpfWA6IiIsST1nPyJnZXRBQXRPdXRDb29yZHNNYXRtdWwoaSkiOmBnZXRBKCR7ZnVuY3Rpb24oZSx0KXtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPHQtMjtyKyspbis9YHJjLiR7ZVtyXX0sIGA7cmV0dXJuIG4rPWByYy4ke2VbdC0yXX0sIGkqMmAsbn0oeCx5KX0pYCxFPWc/ImdldEJBdE91dENvb3Jkc01hdG11bChpKSI6YGdldEIoJHtmdW5jdGlvbihlLHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dC0yO3IrKyluKz1gcmMuJHtlW3JdfSwgYDtyZXR1cm4gbis9YGkqMiwgcmMuJHtlW3QtMV19YCxufSh4LHYpfSlgLEQ9YFxuICAgICAgICAgICAgJHtQfVxuICAgICAgICAgICAgJHtBfVxuICAgICAgICAgICAgJHtPfVxuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICAke2c/IiI6YCR7d30gcmMgPVxuICAgICAgICAgIGdldE91dHB1dENvb3JkcygpOyBpbnQgbGFzdERpbSA9IHJjLiR7eFtULTFdfTsgcmMuJHt4W1QtMV19ID1cbiAgICAgICAgICByYy4ke3hbVC0yXX07IHJjLiR7eFtULTJdfSA9IGxhc3REaW07XG4gICAgICBgfVxuXG4gICAgICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDApO1xuICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7bX07IGkrKykge1xuICAgICAgICAgICAgICAgIHZlYzQgYSA9ICR7SX07XG4gICAgICAgICAgICAgICAgdmVjNCBiID0gJHtFfTtcblxuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLnJyYmIgKiBiLnJncmcpO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLmdnYWEgKiBiLmJhYmEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICR7cH1cbiAgICAgICAgICAgICAgJHtTfVxuICAgICAgICAgICAgICAke18ub3V0cHV0fSA9IHZhbHVlO1xuICAgICAgICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmgsdHlwZTpuWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTpELGhhc01haW46ITB9KX0pKGUsbCx0LG4pfSl9O30sODI3NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Qmlhc0Zvck1hdG11bD10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPXQucGFyc2VNYXRNdWxBdHRyaWJ1dGVzPXQubWF0TXVsPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpLGk9big0MzIpLHM9bigyMTUwKSxhPW4oNTYzMik7dC5tYXRNdWw9KGUsdCxuKT0+KGModCksZS5zZXNzaW9uLnBhY2s/W2UucnVuKCgwLCBhLmNyZWF0ZVBhY2tlZE1hdG11bFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihsKHQsbiksdCldKSx0LnBhcnNlTWF0TXVsQXR0cmlidXRlcz1lPT4oMCwgcy5wYXJzZUludGVybmFsQWN0aXZhdGlvbkF0dHJpYnV0ZXMpKGUuYXR0cmlidXRlcyk7Y29uc3QgdT0oZSx0KT0+KHtuYW1lOiJNYXRNdWwiLGlucHV0TmFtZXM6ZT9bIkEiLCJCIiwiQmlhcyJdOlsiQSIsIkIiXSxpbnB1dFR5cGVzOmU/W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXTpbby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dH0pO2Z1bmN0aW9uIGwoZSx0KXtjb25zdCBuPXUoZS5sZW5ndGg+Mix0LmFjdGl2YXRpb25DYWNoZUtleSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5mdW5jdGlvbihlLHQsbil7Y29uc3QgYT10WzBdLmRpbXMsdT10WzFdLmRpbXMsbD1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKGEsdSwhMCk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgbWF0bXVsIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7Y29uc3QgYz0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkobC5sZW5ndGgpLGQ9KDAsIGkuZ2V0R2xDaGFubmVscykoKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmYsYXBwbHlBY3RpdmF0aW9uOmh9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShuKSxnPXQubGVuZ3RoPjIsYj1nPyJ2YWx1ZSArPSBnZXRCaWFzRm9yTWF0bXVsKCk7IjoiIixtPWc/YCR7cChjLGQsdFsyXS5kaW1zLGwsITEpfWA6IiIseT1sLmxlbmd0aCx2PWEubGVuZ3RoLF89dS5sZW5ndGgsdz1gXG4gICAgJHtmfVxuICAgICR7bX1cbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7eX1dKSB7XG4gICAgICAgIGludCBhWyR7dn1dO1xuICAgICAgICBpbnQgYlske199XTtcbiAgICAgICAgYmNhc3RNYXRtdWxJbmRpY2VzX0EoaW5kaWNlcywgYSk7XG4gICAgICAgIGJjYXN0TWF0bXVsSW5kaWNlc19CKGluZGljZXMsIGIpO1xuXG4gICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICBmb3IgKGludCBrPTA7IGs8JHthW2EubGVuZ3RoLTFdfTsgKytrKSB7XG4gICAgICAgICAgICBhWyR7di0xfV0gPSBrO1xuICAgICAgICAgICAgYlske18tMn1dID0gaztcbiAgICAgICAgICAgIHZhbHVlICs9IF9BKGEpICogX0IoYik7XG4gICAgICAgIH1cbiAgICAgICAgJHtifVxuICAgICAgICAke2h9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6d30pfShuLGUsdCl9KX10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPWw7Y29uc3QgYz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk1hdE11bCByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihlWzBdLmRpbXNbZVswXS5kaW1zLmxlbmd0aC0xXSE9PWVbMV0uZGltc1tlWzFdLmRpbXMubGVuZ3RoLTJdKXRocm93IG5ldyBFcnJvcigic2hhcmVkIGRpbWVuc2lvbiBkb2VzIG5vdCBtYXRjaC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgc2hvdWxkIGJlIGZsb2F0IHR5cGUiKTtpZihlWzBdLnR5cGUhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgdHlwZXMgc2hvdWxkIG1hdGNoIil9O2Z1bmN0aW9uIHAoZSx0LG4sbyxpKXtsZXQgcz0iIjtjb25zdCBhPW4ubGVuZ3RoLHU9by5sZW5ndGgsbD11LWE7cz11PDImJmE+MD8iY29vcmRzIjpuLm1hcCgoKGUsbik9PmBjb29yZHMuJHt0W24rbF19YCkpLmpvaW4oIiwgIik7Y29uc3QgYz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhuLG8pLm1hcCgoZT0+YGNvb3Jkcy4ke3RbZStsXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCBwPSJ2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS55eSkiO3JldHVybiAxPT09ci5TaGFwZVV0aWwuc2l6ZShuKSYmKHA9InZlYzQob3V0cHV0VmFsdWUueCkiKSxpP2BcbnZlYzQgZ2V0Qmlhc0Zvck1hdG11bCgpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHtjfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qmlhcygke3N9KTtcbiAgcmV0dXJuICR7cH07XG59YDpgXG5mbG9hdCBnZXRCaWFzRm9yTWF0bXVsKCkge1xuICAke2V9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAke2N9XG4gIHJldHVybiBnZXRCaWFzKGNvb3Jkcy54KTtcbn1gfXQuZ2V0Qmlhc0Zvck1hdG11bD1wO30sOTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJwYWNrIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZF19O3QuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPShlLHQpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksdT10LmRpbXMsbD11Lmxlbmd0aCxjPXQuZGltcy5sZW5ndGgscD0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZD0oMCwgcy5nZXRDaGFubmVscykoInJjIixjKSxmPShoPWMsZz1kLGI9dVt1Lmxlbmd0aC0yXSxtPXVbdS5sZW5ndGgtMV0sMD09PWh8fDE9PT1oPyIiOmBcbiAgICBpbnQgciA9ICR7Z1toLTJdfTtcbiAgICBpbnQgYyA9ICR7Z1toLTFdfTtcbiAgICBpbnQgcnAxID0gJHtnW2gtMl19ICsgMTtcbiAgICBpbnQgY3AxID0gJHtnW2gtMV19ICsgMTtcbiAgICBib29sIHJFZGdlID0gcnAxID49ICR7bX07XG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2J9O1xuICAgIGApO3ZhciBoLGcsYixtO2xldCB5O3k9MD09PWw/WzEsMV06MT09PWw/W3VbMF0sMV06W3VbYy0xXSx1W2MtMl1dO2NvbnN0IHY9ZnVuY3Rpb24oZSx0LG4pe2lmKDA9PT1lKXJldHVybiAiZmFsc2UiO2lmKDE9PT1lKXJldHVybiBgcmMgPiAke3RbMF19YDtsZXQgcj0iIjtmb3IobGV0IG89ZS0yO288ZTtvKyspcis9YCR7bltvXX0gPj0gJHt0W28tZSsyXX1gLG88ZS0xJiYocis9Inx8Iik7cmV0dXJuIHJ9KGMseSxkKSxfPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gImdldEEoKSwgMCwgMCwgMCI7aWYoMT09PW4pcmV0dXJuIGBnZXRBKHJjKSxcbiAgICAgICAgICAgIHJjICsgMSA+PSAke2VbMF19ID8gMC4gOiBnZXRBKHJjICsgMSksXG4gICAgICAgICAgICAwLCAwYDtsZXQgcj0iIjtpZihuPjIpZm9yKGxldCBlPTA7ZTxuLTI7KytlKXIrPWAke3RbZV19LGA7cmV0dXJuIGBnZXRBKCR7cn1yLCBjKSxcbiAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjKSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3J9ciwgY3AxKSxcbiAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjcDEpYH0odSxkKSx3PWBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7cH0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICAgIGlmKCR7dn0pIHtcbiAgICAgICAgICAgICR7bi5vdXRwdXR9ID0gdmVjNCgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHtmfVxuXG4gICAgICAgICAgICAke24ub3V0cHV0fSA9IHZlYzQoJHtffSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2hhc01haW46ITAsb3V0cHV0OntkaW1zOnQuZGltcyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOnd9KX0pKGUsdCl9KTt9LDU2MTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnVucGFja0Zyb21DaGFubmVsPXQuZ2V0Q2hhbm5lbHM9dC5nZXRWZWNDaGFubmVscz12b2lkIDA7Y29uc3Qgcj1uKDQzMik7ZnVuY3Rpb24gbyhlLHQpe3JldHVybiAoMCwgci5nZXRHbENoYW5uZWxzKSh0KS5tYXAoKHQ9PmAke2V9LiR7dH1gKSl9dC5nZXRWZWNDaGFubmVscz1vLHQuZ2V0Q2hhbm5lbHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMT09PXQ/W2VdOm8oZSx0KX0sdC51bnBhY2tGcm9tQ2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiAiXG4gICAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICAgIGludCBtb2RDb29yZCA9IGltb2QoZGltLCAyKTtcbiAgICAgIHJldHVybiBtb2RDb29yZCA9PSAwID8gZnJhZy5yIDogZnJhZy5nO1xuICAgIH1cblxuICAgIGZsb2F0IGdldENoYW5uZWwodmVjNCBmcmFnLCB2ZWMyIGlubmVyRGltcykge1xuICAgICAgdmVjMiBtb2RDb29yZCA9IG1vZChpbm5lckRpbXMsIDIuKTtcbiAgICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLnIgOiBmcmFnLmcpIDpcbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLmIgOiBmcmFnLmEpO1xuICAgIH1cbiAgIn07fSw1NTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVBhZEF0dHJpYnV0ZXNWMTE9dC5wYWRWMTE9dC5wYXJzZVBhZEF0dHJpYnV0ZXNWMj10LnBhZFYyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big2NzU3KSxzPW4oNTYzOSksYT17bmFtZToiUGFkIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnBhZFYyPShlLHQsbik9PihjKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+bChlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VQYWRBdHRyaWJ1dGVzVjI9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsImNvbnN0YW50Iiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInZhbHVlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJwYWRzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21vZGU6dCx2YWx1ZTpuLHBhZHM6b30pfSx0LnBhZFYxMT0oZSxuLHIpPT57cChuKTtjb25zdCBvPXUoZSxuLHIpO3JldHVybiAoMCwgdC5wYWRWMikoZSxbblswXV0sbyl9LHQucGFyc2VQYWRBdHRyaWJ1dGVzVjExPWU9PmUuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJjb25zdGFudCIpO2NvbnN0IHU9KGUsdCxuKT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fHQubGVuZ3RoPj0zJiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFsyXS5kYXRhSWQpKXRocm93IG5ldyBFcnJvcigiZHluYW1pYyBwYWQgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBvPUFycmF5LmZyb20odFsxXS5pbnRlZ2VyRGF0YSksaT10Lmxlbmd0aD49Mz90WzJdLmZsb2F0RGF0YVswXTowO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHttb2RlOm4scGFkczpvLHZhbHVlOml9KX0sbD0oZSx0LG4pPT57Y29uc3Qgcj1vLlNoYXBlVXRpbC5wYWRTaGFwZSh0LmRpbXMuc2xpY2UoKSxuLnBhZHMpLGk9ci5sZW5ndGgsYT1gXG4gICAgICAke2QoZSx0LG4pfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbJHtpfV0gaW5kaWNlcykge1xuICAgICAgICAgIHJldHVybiBwYWRBKGluZGljZXMpO1xuICAgICAgfWA7cmV0dXJuIHtuYW1lOiJQYWQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbcy5UZXh0dXJlVHlwZS51bnBhY2tlZF0sb3V0cHV0OntkaW1zOnIsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9fSxjPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDEgaW5wdXQiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0scD1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCYmMyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj0zJiYic3RyaW5nIj09PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModC5kaW1zKTtzd2l0Y2gobi5tb2RlKXtjYXNlImNvbnN0YW50IjpyZXR1cm4gZihyLHQuZGltcyxsLGEsdSxuLnBhZHMsbi52YWx1ZSk7Y2FzZSJyZWZsZWN0IjpyZXR1cm4gaChyLHQuZGltcyxsLGEsdSxuLnBhZHMpO2Nhc2UiZWRnZSI6cmV0dXJuIGcocix0LmRpbXMsbCxhLHUsbi5wYWRzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtb2RlIil9fSxmPShlLHQsbixyLG8saSxzKT0+e2NvbnN0IGE9dC5sZW5ndGg7bGV0IHU9IiI7Zm9yKGxldCBlPWEtMTtlPj0wOy0tZSl1Kz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgcmV0dXJuIGNvbnN0YW50O1xuICAgICAgICBpZiAoayA+PSAke3RbZV19KSByZXR1cm4gY29uc3RhbnQ7XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske2F9XSkge1xuICAgICAgICBjb25zdCBmbG9hdCBjb25zdGFudCA9IGZsb2F0KCR7c30pO1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke3V9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGg9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSB7IGsgPSAtazsgfVxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgaW50IF8ybl8xID0gJHsyKih0W2VdLTEpfTtcbiAgICAgICAgICBrID0gaW50KCBtb2QoIGZsb2F0KGspLCBmbG9hdChfMm5fMSkgKSApIDtcbiAgICAgICAgICBpZihrID49ICR7dFtlXX0pIHsgayA9IF8ybl8xIC0gazsgfVxuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske3N9XSkge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke2F9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGc9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgayA9IDA7XG4gICAgICAgIGlmIChrID49ICR7dFtlXX0pIGsgPSAke3RbZV0tMX07XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGZsb2F0IHBhZEEoaW50IG1bJHtzfV0pIHtcbiAgICAgICAgaW50IG9mZnNldCA9IDA7XG4gICAgICAgIGludCBrID0gMDtcbiAgICAgICAgJHthfVxuICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtyfSwgJHtvfSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KEEsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgfTt9LDI4MzQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lmdsb2JhbE1heFBvb2w9dC5wYXJzZU1heFBvb2xBdHRyaWJ1dGVzPXQubWF4UG9vbD10LnBhcnNlR2xvYmFsQXZlcmFnZVBvb2xBdHRyaWJ1dGVzPXQuZ2xvYmFsQXZlcmFnZVBvb2w9dC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz10LmF2ZXJhZ2VQb29sPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big1NjM5KTt0LmF2ZXJhZ2VQb29sPShlLHQsbik9PntwKHQpO2NvbnN0IHI9e25hbWU6IkF2ZXJhZ2VQb29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpuLmNhY2hlS2V5fTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT5zKHQsciwhMSxuKX0pLHQpXX0sdC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJjb3VudF9pbmNsdWRlX3BhZCIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIikscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKTtpZigwIT09bil0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQXZlcmFnZVBvb2wiKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDp0LGNlaWxNb2RlOm4sY291bnRJbmNsdWRlUGFkOm8sa2VybmVsU2hhcGU6aSxzdHJpZGVzOnMscGFkczphfSl9O2NvbnN0IHM9KGUsdCxuLHIpPT57Y29uc3RbcyxhXT11KGUscixuKSxsPW8uU2hhcGVVdGlsLnNpemUocy5rZXJuZWxTaGFwZSk7bGV0IGM9IiI7cy5jb3VudEluY2x1ZGVQYWQ/Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0pO2A6Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0gLSBwYWQpO2A7Y29uc3QgcD1gXG4gICAgICAgICR7ZChlWzBdLmRpbXMscywidmFsdWUgKz0gX1goeCk7IixjLCIwLjAiKX1cbiAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmEsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX07dC5nbG9iYWxBdmVyYWdlUG9vbD0oZSx0LG4pPT57cCh0KTtjb25zdCByPXtuYW1lOiJHbG9iYWxBdmVyYWdlUG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6YCR7bi5jb3VudEluY2x1ZGVQYWR9YH07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+cyh0LHIsITAsbil9KSx0KV19LHQucGFyc2VHbG9iYWxBdmVyYWdlUG9vbEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDoiIixjZWlsTW9kZTowLGNvdW50SW5jbHVkZVBhZDp0LGtlcm5lbFNoYXBlOltdLHN0cmlkZXM6W10scGFkczpbXX0pfSx0Lm1heFBvb2w9KGUsdCxuKT0+e3AodCk7Y29uc3Qgcj17bmFtZToiTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6bi5jYWNoZUtleX07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+YSh0LHIsITEsbil9KSx0KV19LHQucGFyc2VNYXhQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiKSxpPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJzdHJpZGVzIixbXSkscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygicGFkcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludCgic3RvcmFnZV9vcmRlciIsMCksdT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygiZGlsYXRpb25zIixbXSk7aWYoMCE9PWEpdGhyb3cgbmV3IEVycm9yKCJjb2x1bW4gbWFqb3Igc3RvcmFnZSBvcmRlciBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWF4UG9vbCIpO2lmKDAhPT1uKXRocm93IG5ldyBFcnJvcigidXNpbmcgY2VpbCgpIGluIHNoYXBlIGNvbXB1dGF0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBNYXhQb29sIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F1dG9QYWQ6dCxjZWlsTW9kZTpuLGNvdW50SW5jbHVkZVBhZDohMSxrZXJuZWxTaGFwZTpvLHN0cmlkZXM6aSxwYWRzOnMsc3RvcmFnZU9yZGVyOmEsZGlsYXRpb25zOnV9KX07Y29uc3QgYT0oZSx0LG4scik9Pntjb25zdFtvLHNdPXUoZSxyLG4pLGE9YFxuICAgICAgJHtkKGVbMF0uZGltcyxvLCJcbiAgICAgIHZhbHVlID0gbWF4KF9YKHgpLCB2YWx1ZSk7XG4gICAgIiwiIiwiLTFlNSIpfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOnMsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9KX0sdT0oZSx0LG4pPT57Y29uc3Qgcj1lWzBdLmRpbXMuc2xpY2UoKSxpPU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRpbGF0aW9ucyIpLHM9dC5rZXJuZWxTaGFwZS5zbGljZSgpLGE9dC5zdHJpZGVzLnNsaWNlKCksdT1pP3QuZGlsYXRpb25zLnNsaWNlKCk6W10sbD10LnBhZHMuc2xpY2UoKTtvLlBvb2xDb252VXRpbC5hZGp1c3RQb29sQXR0cmlidXRlcyhuLHIscyxhLHUsbCk7Y29uc3QgYz1vLlBvb2xDb252VXRpbC5jb21wdXRlUG9vbE91dHB1dFNoYXBlKG4scixhLHUscyxsLHQuYXV0b1BhZCkscD1PYmplY3QuYXNzaWduKHt9LHQpO3JldHVybiBpP09iamVjdC5hc3NpZ24ocCx7a2VybmVsU2hhcGU6cyxzdHJpZGVzOmEscGFkczpsLGRpbGF0aW9uczp1LGNhY2hlS2V5OnQuY2FjaGVLZXl9KTpPYmplY3QuYXNzaWduKHAse2tlcm5lbFNoYXBlOnMsc3RyaWRlczphLHBhZHM6bCxjYWNoZUtleTp0LmNhY2hlS2V5fSksW3AsY119LGw9e2F1dG9QYWQ6IiIsY2VpbE1vZGU6MCxjb3VudEluY2x1ZGVQYWQ6ITEsa2VybmVsU2hhcGU6W10sc3RyaWRlczpbXSxwYWRzOltdLHN0b3JhZ2VPcmRlcjowLGRpbGF0aW9uczpbXSxjYWNoZUtleToiIn0sYz17bmFtZToiR2xvYmFsTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5nbG9iYWxNYXhQb29sPShlLHQpPT4ocCh0KSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtnZXQ6KCk9PmEodCxjLCEwLGwpfSksdCldKTtjb25zdCBwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUG9vbCBvcHMgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4scixpKT0+e2NvbnN0IHM9ZS5sZW5ndGg7aWYodC5rZXJuZWxTaGFwZS5sZW5ndGg8PTIpe2NvbnN0IG89dC5rZXJuZWxTaGFwZVt0Lmtlcm5lbFNoYXBlLmxlbmd0aC0xXSxhPXQuc3RyaWRlc1t0LnN0cmlkZXMubGVuZ3RoLTFdLHU9dC5wYWRzW3QucGFkcy5sZW5ndGgvMi0xXSxsPXQucGFkc1t0LnBhZHMubGVuZ3RoLTFdLGM9ZVtzLTFdO2xldCBwPSIiLGQ9IiIsZj0iIjtpZihwPXUrbCE9PTA/YFxuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtvfTsgaSsrKSB7XG4gICAgICAgICAgICB4WyR7c30gLSAxXSA9IGluZGljZXNbJHtzfSAtIDFdICogJHthfSAtICR7dX0gKyBpO1xuICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDFdIDwgMCB8fCB4WyR7c30gLSAxXSA+PSAke2N9KSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7bn1cbiAgICAgICAgICB9YDpgXG4gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke299OyBpKyspIHtcbiAgICAgICAgICAgIHhbJHtzfSAtIDFdID0gaW5kaWNlc1ske3N9IC0gMV0gKiAke2F9IC0gJHt1fSArIGk7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWAsMj09PXQua2VybmVsU2hhcGUubGVuZ3RoKXtjb25zdCBuPXQua2VybmVsU2hhcGVbdC5rZXJuZWxTaGFwZS5sZW5ndGgtMl0scj10LnN0cmlkZXNbdC5zdHJpZGVzLmxlbmd0aC0yXSxpPXQucGFkc1t0LnBhZHMubGVuZ3RoLzItMl0sYT10LnBhZHNbdC5wYWRzLmxlbmd0aC0yXSx1PWVbcy0yXTtkPWkrYSE9PTA/YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDJdIDwgMCB8fCB4WyR7c30gLSAyXSA+PSAke3V9KSB7XG4gICAgICAgICAgICAgICAgcGFkKz0gJHtvfTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGA6YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgIGAsZj0iXG4gICAgICAgICAgfVxuICAgICAgICAiO31yZXR1cm4gYFxuICAgICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgICAgaW50IHhbJHtzfV07XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCB4KTtcblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHtpfTtcbiAgICAgICAgICBpbnQgcGFkID0gMDtcbiAgICAgICAgICAke2R9XG4gICAgICAgICAgJHtwfVxuICAgICAgICAgICR7Zn1cbiAgICAgICAgICAke3J9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfXtjb25zdCBhPW8uU2hhcGVVdGlsLnNpemUodC5rZXJuZWxTaGFwZSksdT1vLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0Lmtlcm5lbFNoYXBlKSxsPXUubGVuZ3RoLGM9dC5wYWRzLmxlbmd0aCxwPWgobCksZD1mKGUsImlucHV0RGltcyIpLGc9Zih0LnBhZHMsInBhZHMiKSxiPWYodSwia2VybmVsU3RyaWRlcyIpLG09Zih0LnN0cmlkZXMsInN0cmlkZXMiKTtsZXQgeT0iIjtyZXR1cm4geT10LnBhZHMucmVkdWNlKCgoZSx0KT0+ZSt0KSk/YFxuICAgICAgICAgICAgaWYgKHhbal0gPj0gaW5wdXREaW1zW2pdIHx8IHhbal0gPCAwKSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBpc1BhZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzUGFkKSB7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWA6YFxuICAgICAgICAgIH1cbiAgICAgICAgICAke259XG4gICAgICAgIGAsYFxuICAgICAgICAke3B9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtzfV0pIHtcbiAgICAgICAgICBpbnQgeFske3N9XTtcbiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIHgpO1xuICAgICAgICAgIGludCBvZmZzZXRbJHtsfV07XG4gICAgICAgICAgaW50IHBhZHNbJHtjfV07XG4gICAgICAgICAgaW50IGlucHV0RGltc1ske3N9XTtcbiAgICAgICAgICBpbnQga2VybmVsU3RyaWRlc1ske2x9XTtcbiAgICAgICAgICBpbnQgc3RyaWRlc1ske2x9XTtcbiAgICAgICAgICAke2d9XG4gICAgICAgICAgJHtkfVxuICAgICAgICAgICR7bX1cbiAgICAgICAgICAke2J9XG5cbiAgICAgICAgICBmbG9hdCB2YWx1ZSA9ICR7aX07XG4gICAgICAgICAgaW50IHBhZCA9IDA7XG4gICAgICAgICAgYm9vbCBpc1BhZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHthfTsgaSsrKSB7XG4gICAgICAgICAgICBvZmZzZXRUb0luZGljZXMoaSwga2VybmVsU3RyaWRlcywgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlzUGFkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGludCBqID0gJHtzfSAtICR7bH07IGogPCAke3N9OyBqKyspIHtcbiAgICAgICAgICAgICAgeFtqXSA9IGluZGljZXNbal0gKiBzdHJpZGVzW2ogLSAke3N9ICsgJHtsfV1cbiAgICAgICAgICAgICAgICArIG9mZnNldFtqIC0gJHtzfSArICR7bH1dIC0gcGFkc1tqIC0gMl07XG4gICAgICAgICAgICAgICR7eX1cbiAgICAgICAgICB9XG4gICAgICAgICAgJHtyfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfX0sZj0oZSx0KT0+e2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4rPWBcbiAgICAgICR7dH1bJHtyfV0gPSAke2Vbcl19O1xuICAgIGA7cmV0dXJuIG59LGg9ZT0+YFxuICB2b2lkIG9mZnNldFRvSW5kaWNlcyhpbnQgb2Zmc2V0LCBpbnRbJHtlfV0gc3RyaWRlcywgb3V0IGludFske2V9XSBpbmRpY2VzKSB7XG4gICAgaWYgKCR7ZX0gPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7ZX0gLSAxOyArK2kpIHtcbiAgICAgIGluZGljZXNbaV0gPSBvZmZzZXQgLyBzdHJpZGVzW2ldO1xuICAgICAgb2Zmc2V0IC09IGluZGljZXNbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBpbmRpY2VzWyR7ZX0gLSAxXSA9IG9mZnNldDtcbiAgfWA7fSwxMDEwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9dC5yZWR1Y2VMb2dTdW09dC5yZWR1Y2VQcm9kPXQucmVkdWNlTWluPXQucmVkdWNlTWF4PXQucmVkdWNlTWVhbj10LnJlZHVjZVN1bT10LnBhcnNlUmVkdWNlQXR0cmlidXRlcz12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9KGUsdCxuLHIsbyk9PntsKHQpO2NvbnN0IGk9e25hbWU6cixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT51KGUsdCxuLHIsbyxpKX0pLHQpXX07dC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiLFtdKSxuPTE9PT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJrZWVwZGltcyIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4ZXM6dCxrZWVwRGltczpufSl9O2NvbnN0IHU9KGUsdCxuLHIsbyxhKT0+e2NvbnN0IHU9W10sbD10WzBdLmRpbXMubGVuZ3RofHwxLGM9W10scD1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGVzKG4uYXhlcyx0WzBdLmRpbXMubGVuZ3RoKSxkPW8odCxwKTtsZXQgZj1kWzFdO2ZvcihsZXQgZT0wO2U8dFswXS5kaW1zLmxlbmd0aDtlKyspcC5pbmRleE9mKGUpPj0wfHwwPT09cC5sZW5ndGg/KG4ua2VlcERpbXMmJnUucHVzaCgxKSxmPWBcbiAgICAgICAgICBmb3IoaW50IGoke2V9ID0gMDsgaiR7ZX0gPCAke3RbMF0uZGltc1tlXX07IGoke2V9KyspIHtcbiAgICAgICAgICAgIGlucHV0SWR4WyR7ZX1dID0gaiR7ZX07XG4gICAgICAgICAgICAke2Z9XG4gICAgICAgICAgfWApOihjLnB1c2goYGlucHV0SWR4WyR7ZX1dID0gb3V0cHV0SWR4WyR7dS5sZW5ndGh9XTtgKSx1LnB1c2godFswXS5kaW1zW2VdKSk7Y29uc3QgaD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHt1Lmxlbmd0aHx8MX1dKSB7XG4gICAgICAgIGZsb2F0IHZhbHVlOyAgICAgICAgICAgICAgICAgLy8gZmluYWwgcmVzdWx0XG4gICAgICAgIGludCBpbnB1dElkeFske2x9XTsgICAgICAvLyBhZGRyZXNzaW5nIGlucHV0IGRhdGFcbiAgICAgICAgJHtjLmpvaW4oIlxuIil9XG4gICAgICAgICR7ZFswXX0gICAgICAgLy8gaW5pdCBvcHMgZm9yIHJlZHVjZSBtYXgvbWluXG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtkWzJdfSAgICAgICAvLyBmaW5hbCBjb21wdXRhdGlvbiBmb3IgcmVkdWNlIG1lYW5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7b3V0cHV0OntkaW1zOnUsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmh9KX0sbD1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlJlZHVjZSBvcCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKC0xPT09by5OVU1CRVJfVFlQRVMuaW5kZXhPZihlWzBdLnR5cGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt0LnJlZHVjZVN1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZU1lYW49KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTWVhbiIsKChlLHQpPT57bGV0IG49MTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJihuKj1lWzBdLmRpbXNbcl0pO3JldHVybiBbInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLGB2YWx1ZSAvPSAke259LjtgXX0pKSx0LnJlZHVjZU1heD0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VNYXgiLCgoZSx0KT0+e2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlWzBdLmRpbXMubGVuZ3RoO3IrKykodC5pbmRleE9mKHIpPj0wfHwwPT09dC5sZW5ndGgpJiZuLnB1c2goYGlucHV0SWR4WyR7cn1dID0gMDtgKTtyZXR1cm4gW2Ake24uam9pbigiXG4iKX1cbnZhbHVlID0gX0EoaW5wdXRJZHgpO2AsInZhbHVlID0gbWF4KHZhbHVlLCBfQShpbnB1dElkeCkpOyIsIiJdfSkpLHQucmVkdWNlTWluPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZU1pbiIsKChlLHQpPT57Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJm4ucHVzaChgaW5wdXRJZHhbJHtyfV0gPSAwO2ApO3JldHVybiBbYCR7bi5qb2luKCJcbiIpfVxudmFsdWUgPSBfQShpbnB1dElkeCk7YCwidmFsdWUgPSBtaW4odmFsdWUsIF9BKGlucHV0SWR4KSk7IiwiIl19KSksdC5yZWR1Y2VQcm9kPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZVByb2QiLCgoKT0+WyJ2YWx1ZSA9IDEuMDsiLCJ2YWx1ZSAqPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZUxvZ1N1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VMb2dTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwidmFsdWUgPSBsb2codmFsdWUpOyJdKSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTG9nU3VtU3F1YXJlIiwoKCk9PlsiZmxvYXQgdDsgdmFsdWUgPSAwLjA7IiwidCA9IF9BKGlucHV0SWR4KTsgdmFsdWUgKz0gdCAqIHQ7IiwiIl0pKTt9LDczNzk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmlzUmVzaGFwZUNoZWFwPXQucHJvY2Vzc0RpbXMzRD10LmNyZWF0ZVBhY2tlZFJlc2hhcGUzRFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oNTYxNCk7dC5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgYT0oZT0+KHtuYW1lOiJSZXNoYXBlIChwYWNrZWQpIixpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnBhY2tlZF0saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6YCR7ZX1gfSkpKG4pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQsbixhKT0+e2NvbnN0IHU9dC5kaW1zLGw9YTtsZXQgYz0iIjtmb3IobGV0IGU9MDtlPDQ7ZSsrKXtsZXQgdD0iIjtzd2l0Y2goZSl7Y2FzZSAwOnQ9Im91dHB1dENvb3JkcyA9IHJjOyI7YnJlYWs7Y2FzZSAxOnQ9Im91dHB1dENvb3JkcyA9IGl2ZWMzKHJjLngsIHJjLnkrMSwgcmMueik7IjticmVhaztjYXNlIDI6dD0ib3V0cHV0Q29vcmRzID0gaXZlYzMocmMueCwgcmMueSwgcmMueisxKTsiO2JyZWFrO2Nhc2UgMzp0PSJvdXRwdXRDb29yZHMgPSBpdmVjMyhyYy54LCByYy55KzEsIHJjLnorMSk7IjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcn1jKz1gXG4gICAgICAgICR7dH1cbiAgICAgICAgJHtlPjA/ImlmKG91dHB1dENvb3Jkcy55IDwgcm93cyAmJiBvdXRwdXRDb29yZHMueiA8IGNvbHMpeyI6IiJ9XG4gICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gZ2V0RmxhdHRlbmVkSW5kZXgob3V0cHV0Q29vcmRzKTtcblxuICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0dGVuZWRJbmRleCk7XG4gICAgICAgICAgdmVjMiBpbm5lckRpbXMgPSB2ZWMyKGZsb2F0KGlucHV0UkMueSksZmxvYXQoaW5wdXRSQy56KSk7XG5cbiAgICAgICAgICByZXN1bHRbJHtlfV0gPSBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlubmVyRGltcyk7XG5cbiAgICAgICAgJHtlPjA/In0iOiIifVxuICAgICAgYDt9Y29uc3QgcD0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICAke2Z1bmN0aW9uKGUpe2NvbnN0IHQ9ci5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMoZSksbj1bImIiLCJyIiwiYyJdLG89ImluZGV4IjtyZXR1cm4gYFxuICAgIGl2ZWMzIGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGludCBpbmRleCkge1xuICAgICAgJHt0Lm1hcCgoKGUscik9PmBpbnQgJHtuW3JdfSA9ICR7b30gLyAke2V9OyAke3I9PT10Lmxlbmd0aC0xP2BpbnQgJHtuW3IrMV19ID0gJHtvfSAtICR7bltyXX0gKiAke2V9YDpgaW5kZXggLT0gJHtuW3JdfSAqICR7ZX1gfTtgKSkuam9pbigiIil9XG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgfSh1KX1cbiAgICAgICR7ZnVuY3Rpb24oZSl7Y29uc3QgdD1yLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyhlKTtyZXR1cm4gYFxuICBpbnQgZ2V0RmxhdHRlbmVkSW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgLy8gcmV2ZXJzZSB5LCB6IG9yZGVyXG4gICAgcmV0dXJuIGNvb3Jkcy54ICogJHt0WzBdfSArIGNvb3Jkcy56ICogJHt0WzFdfSArIGNvb3Jkcy55O1xuICB9XG5gfShsKX1cbiAgICAgICR7KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcblxuICAgICAgICBpdmVjMyBvdXRwdXRDb29yZHM7XG4gICAgICAgIGludCByb3dzID0gJHtsWzJdfTtcbiAgICAgICAgaW50IGNvbHMgPSAke2xbMV19O1xuXG4gICAgICAgICR7Y31cbiAgICAgICAgJHtwLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOmQsaGFzTWFpbjohMH0pfSkoZSx0LGEsbil9KX0sdC5wcm9jZXNzRGltczNEPWZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gWzEsMSwxXTtsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGgtMjsrK24pdCo9ZVtuXTtyZXR1cm4gW3QsZS5sZW5ndGg+MT9lW2UubGVuZ3RoLTJdOjEsZVtlLmxlbmd0aC0xXV19LHQuaXNSZXNoYXBlQ2hlYXA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0hMTtyZXR1cm4gbj0wPT09ZS5sZW5ndGh8fDA9PT10Lmxlbmd0aHx8KGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDI/ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV06ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV0mJmVbZS5sZW5ndGgtMl09PT10W3QubGVuZ3RoLTJdKSxufTt9LDgxMjY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc2hhcGU9dm9pZCAwO2NvbnN0IHI9big3MjczKTt0LnJlc2hhcGU9KGUsdCk9Pntjb25zdCBuPXIuU2hhcGVVdGlsLmNhbGN1bGF0ZVJlc2hhcGVkRGltcyh0WzBdLmRpbXMsdFsxXS5pbnRlZ2VyRGF0YSk7cmV0dXJuIGUuc2Vzc2lvbi5wYWNrP1tlLnJlc2hhcGVQYWNrZWQodFswXSxuKV06W2UucmVzaGFwZVVucGFja2VkKHRbMF0sbildfTt9LDI4MDE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMT10LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD10LnJlc2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KSxpPW4oNDMyKSxzPW4oNTYxNCksYT1uKDM5ODApLHU9e25hbWU6IlJlc2l6ZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF19O3QucmVzaXplPShlLHQsbik9PigoMCwgYS52YWxpZGF0ZUlucHV0cykodCxuKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtjYWNoZUhpbnQ6bi5jYWNoZUtleSxnZXQ6KCk9PmwoZSx0LG4pfSksdCldKSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD1lPT4oMCwgYS5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcykoZSwxMCksdC5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTE9ZT0+KDAsIGEucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsMTEpO2NvbnN0IGw9KGUsdCxuKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFtsLHBdPWModCxuKTtpZihsLmV2ZXJ5KChlPT4xPT09ZSkpJiYidGZfY3JvcF9hbmRfcmVzaXplIiE9PW4uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGUpcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOnAsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzQgdiA9ICR7YS50ZXh0dXJlMkR9KFgsIFRleENvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICR7YS5vdXRwdXR9ID0gdjtcbiAgICAgICAgICAgICAgICB9YH0pO2NvbnN0IGQ9cC5sZW5ndGg7aWYoZDwyKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgYmUgYXQgbGVhc3QgMiwgYnV0IGdvdCAke2R9YCk7Y29uc3QgZj1wW2QtMl0saD1wW2QtMV0sZz10WzBdLmRpbXM7aWYoZCE9PWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgbWF0Y2ggaW5wdXQgJHtnLmxlbmd0aH0sIGJ1dCBnb3QgJHtkfWApO2NvbnN0IGI9Z1tkLTJdLG09Z1tkLTFdLHk9bFtkLTJdLHY9bFtkLTFdO2xldCBfPSIiO2lmKCJsaW5lYXIiIT09bi5tb2RlKXRocm93IG5ldyBFcnJvcihgcmVzaXplIChwYWNrZWQpIGRvZXMgbm90IHN1cHBvcnQgbW9kZTogJyR7bi5tb2RlfSdgKTtzd2l0Y2gobi5jb29yZGluYXRlVHJhbnNmb3JtTW9kZSl7Y2FzZSJhc3ltbWV0cmljIjpfPSJcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjNChjb29yZHMpIC8gc2NhbGVXSFdIO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIjticmVhaztjYXNlImhhbGZfcGl4ZWwiOl89IlxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodmVjNChjb29yZHMpICsgMC41KSAvIHNjYWxlV0hXSCAtIDAuNTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICI7YnJlYWs7Y2FzZSJweXRvcmNoX2hhbGZfcGl4ZWwiOl89YFxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgZmNvb3JkcyA9IHZlYzQoY29vcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aH0uMCA+IDEuMCA/IChmY29vcmRzLnggKyAwLjUpIC8gc2NhbGVXSFdILnggLSAwLjUgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wID4gMS4wID8gKGZjb29yZHMueSArIDAuNSkgLyBzY2FsZVdIV0gueSAtIDAuNSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2h9LjAgPiAxLjAgPyAoZmNvb3Jkcy56ICsgMC41KSAvIHNjYWxlV0hXSC56IC0gMC41IDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Zn0uMCA+IDEuMCA/IChmY29vcmRzLncgKyAwLjUpIC8gc2NhbGVXSFdILncgLSAwLjUgOiAwLjBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7Y2FzZSJhbGlnbl9jb3JuZXJzIjpfPWBcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IHJlc2l6ZWQgPSB2ZWM0KCR7aH0uMCAtIDEuMCwgJHtmfS4wIC0gMS4wLCAke2h9LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgb3JpZ2luYWwgPSB2ZWM0KCR7bX0uMCAtIDEuMCwgJHtifS4wIC0gMS4wLCAke219LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtifS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgbmV3X3NjYWxlID0gb3JpZ2luYWwgLyByZXNpemVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoY29vcmRzKSAqIG5ld19zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHJlc2l6ZSAocGFja2VkKSBkb2VzIG5vdCBzdXBwb3J0IGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcke24uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGV9J2ApfWNvbnN0IHc9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLFQ9YFxuICAgICAgICAgICAgY29uc3QgdmVjMiBpbnB1dFdIID0gdmVjMigke2J9LjAsICR7bX0uMCk7XG4gICAgICAgICAgICBjb25zdCB2ZWM0IHNjYWxlV0hXSCA9IHZlYzQoZmxvYXQoJHt5fSksIGZsb2F0KCR7dn0pLCBmbG9hdCgke3l9KSwgZmxvYXQoJHt2fSkpO1xuICAgICAgICAgICAgJHsoMCwgcy51bnBhY2tGcm9tQ2hhbm5lbCkoKX1cbiAgICAgICAgICAgICR7X31cbiAgICAgICAgICAgIGZsb2F0IGdldEFWYWx1ZShpbnQgeDEwLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QSh4MTAsIHIsIGMsIGQpLCB2ZWMyKGMsIGQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgICAke3d9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgICAgICBpbnQgYmF0Y2ggPSByY1swXTtcbiAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSByY1sxXTtcblxuICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSA0IGNvb3JkaW5hdGVzIHRoYXQgaXMgdXNlZCBpbiB0aGUgNCBwYWNrZWQgb3V0cHV0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpdmVjNCBjb29yZHMgPSBpdmVjNChyYy53eiwgcmMudyArIDEsIHJjLnogKyAxKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgc291cmNlIGluZGV4IGluIGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdmVjNCBzb3VyY2VGcmFjID0gZ2V0U291cmNlRnJhY0luZGV4KGNvb3Jkcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgNCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHBhY2tlZCBpbnRvIG9uZSB0ZXhlbC5cbiAgICAgICAgICAgICAgICBpdmVjNCB4MDAgPSBpdmVjNChtYXgoc291cmNlRnJhYy54eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MDEgPSBpdmVjNChtYXgoc291cmNlRnJhYy54dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54dykpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTAgPSBpdmVjNChtYXgoc291cmNlRnJhYy56eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTEgPSBpdmVjNChtYXgoc291cmNlRnJhYy56dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56dykpKTtcblxuICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IHJjLncgPCAke2YtMX07XG4gICAgICAgICAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gcmMueiA8ICR7aC0xfTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgdG9wLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BMZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLngsIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS54LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueCwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS54LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyB0b3AtcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BSaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC54LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueCwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLngsIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueCwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgYm90dG9tLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLnosIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS56LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueiwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS56LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyBib3R0b20tcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21SaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC56LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueiwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLnosIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueiwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGlvbiBmcmFjdGlvbiBvbiB1IGFuZCB2IGRpcmVjdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgZnJhYyA9IHZlYzQoc291cmNlRnJhYykgLSBmbG9vcihzb3VyY2VGcmFjKTtcbiAgICAgICAgICAgICAgICB2ZWM0IGNsYW1wRnJhYyA9IGNsYW1wKGZyYWMsIHZlYzQoMC4wKSwgdmVjNCgxLjApKTtcblxuICAgICAgICAgICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBjbGFtcEZyYWMueXd5dyk7XG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b20gPSBtaXgoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGNsYW1wRnJhYy55d3l3KTtcbiAgICAgICAgICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBjbGFtcEZyYWMueHh6eik7XG5cbiAgICAgICAgICAgICAgICAke2Eub3V0cHV0fSA9IHZlYzQobmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse291dHB1dDp7ZGltczpwLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpUfSl9LGM9KGUsdCk9Pntjb25zdCBuPWVbMF0uZGltcztsZXQgcixvPXQuc2NhbGVzO2lmKDA9PT1vLmxlbmd0aCl7Y29uc3QgaT1lW3Quc2NhbGVzSW5wdXRJZHhdO2lmKGkmJjAhPT1pLnNpemUpe2lmKGVbdC5zaXplc0lucHV0SWR4XSl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgb25lIG9mIHNjYWxlcyBvciBzaXplcyBtdXN0IGJlIHByb3ZpZGVkIGFzIGlucHV0LiIpO289cChpLHQubW9kZSx0LmlzUmVzaXplKTt9ZWxzZSB7Y29uc3QgaT1lW3Quc2l6ZXNJbnB1dElkeF07aWYoIWl8fDA9PT1pLnNpemUpdGhyb3cgbmV3IEVycm9yKCJFaXRoZXIgc2NhbGVzIG9yIHNpemVzIE1VU1QgYmUgcHJvdmlkZWQgYXMgaW5wdXQuIik7cj1BcnJheS5mcm9tKGkuaW50ZWdlckRhdGEpLG89ZChyLG4sdC5tb2RlLHQuaXNSZXNpemUpO319ZWxzZSBpZihlW3Quc2l6ZXNJbnB1dElkeF0pdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBvZiBzY2FsZXMgb3Igc2l6ZXMgbXVzdCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtjb25zdCBpPXJ8fG4ubWFwKCgoZSx0KT0+TWF0aC5mbG9vcihlKm9bdF0pKSk7cmV0dXJuIFtvLGldfSxwPShlLHQsbik9Pntjb25zdCByPUFycmF5LmZyb20oZS5mbG9hdERhdGEpO3JldHVybiAoMCwgYS5zY2FsZXNWYWxpZGF0aW9uKShyLHQsbikscn0sZD0oZSx0LG4scik9Pntjb25zdCBvPXQubGVuZ3RoLGk9bmV3IEFycmF5KG8pO2ZvcihsZXQgbj0wLHI9bztuPHI7bisrKWlmKDA9PT10W25dKXtpZigwIT09ZVtuXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGRpbSBpcyB6ZXJvIGJ1dCByZXF1aXJlZCBvdXRwdXQgZGltIGlzIG5vbi16ZXJvLiIpO2lbbl09MTt9ZWxzZSBpW25dPWVbbl0vdFtuXTtyZXR1cm4gKDAsIGEuc2NhbGVzVmFsaWRhdGlvbikoaSxuLHIpLGl9O30sNTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDkyNDApO3Quc2hhcGU9KGUsdCk9PihvKHQpLFtuZXcgci5UZW5zb3IoW3RbMF0uZGltcy5sZW5ndGhdLCJpbnQzMiIsdm9pZCAwLHZvaWQgMCxuZXcgSW50MzJBcnJheSh0WzBdLmRpbXMpKV0pO2NvbnN0IG89ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSByZXF1aXJlcyAxIGlucHV0LiIpfTt9LDI0NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNsaWNlVjEwPXQucGFyc2VTbGljZUF0dHJpYnV0ZXM9dC5zbGljZT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9e25hbWU6IlNsaWNlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNsaWNlPShlLHQsbik9PihsKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VTbGljZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoInN0YXJ0cyIpLG49ZS5hdHRyaWJ1dGVzLmdldEludHMoImVuZHMiKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIixbXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3N0YXJ0czp0LGVuZHM6bixheGVzOm99KX07Y29uc3QgdT0oZSx0LG4pPT57Y29uc3Qgcj0wPT09bi5heGVzLmxlbmd0aD90LmRpbXMuc2xpY2UoMCkubWFwKCgoZSx0KT0+dCkpOm4uYXhlcyxvPWkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4ZXMocix0LmRpbXMubGVuZ3RoKSx1PW4uc3RhcnRzLm1hcCgoKGUsbik9PmU+dC5kaW1zW29bbl1dLTE/dC5kaW1zW29bbl1dOmkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4aXMoZSx0LmRpbXNbb1tuXV0pKSksbD1uLmVuZHMubWFwKCgoZSxuKT0+ZT50LmRpbXNbb1tuXV0tMT90LmRpbXNbb1tuXV06aS5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhlLHQuZGltc1tvW25dXSkpKSxjPXQuZGltcy5zbGljZSgpLHA9W107Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspY1tvW2VdXT1sW2VdLXVbZV0sdVtlXT4wJiZwLnB1c2goYG91dHB1dElkeFske29bZV19XSArPSAke3VbZV19O2ApO2NvbnN0IGQ9YFxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgb3V0cHV0SWR4WyR7Yy5sZW5ndGh9XSkge1xuICAgICAgICAke3Auam9pbigiXG4gICAgICAiKX1cbiAgICAgICAgcmV0dXJuIF9BKG91dHB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtvdXRwdXQ6e2RpbXM6Yyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU2xpY2UgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07dC5zbGljZVYxMD0oZSx0KT0+e3AodCk7Y29uc3Qgbj1jKGUsdCk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSxbdFswXV0pXX07Y29uc3QgYz0oZSx0KT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzJdLmRhdGFJZCl8fHQubGVuZ3RoPj00JiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFszXS5kYXRhSWQpfHx0Lmxlbmd0aD49NSYmIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbNF0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgc2xpY2UgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtpZih0Lmxlbmd0aD49NSYmdFs0XS5pbnRlZ2VyRGF0YS5zb21lKChlPT4xIT09ZSkpKXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG5vbi0xIHN0ZXBzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNsaWNlIik7Y29uc3Qgbj1BcnJheS5mcm9tKHRbMV0uaW50ZWdlckRhdGEpLHI9QXJyYXkuZnJvbSh0WzJdLmludGVnZXJEYXRhKSxvPXQubGVuZ3RoPj00P0FycmF5LmZyb20odFszXS5pbnRlZ2VyRGF0YSk6W107cmV0dXJuIHtzdGFydHM6bixlbmRzOnIsYXhlczpvLGNhY2hlS2V5OmAke299OyR7bn07JHtyfWB9fSxwPWU9PntpZighZXx8ZS5sZW5ndGg8M3x8ZS5sZW5ndGg+NSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgbnVtYmVyLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGV8fDEhPT1lWzFdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzJdLnR5cGV8fDEhPT1lWzJdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj00JiYoImludDMyIiE9PWVbM10udHlwZXx8MSE9PWVbM10uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj01JiYoImludDMyIiE9PWVbNF0udHlwZXx8MSE9PWVbNF0uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDgxNTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc29mdG1heFYxMz10LnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTM9dC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzPXQuc29mdG1heD12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNjc1Nykscz1uKDU2MzkpLGE9big1NzA3KSx1PXtuYW1lOiJTb2Z0bWF4Q29tcHV0ZU1heCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkXX0sbD17bmFtZToiU29mdG1heENvbXB1dGVTY2FsZSIsaW5wdXROYW1lczpbIkEiLCJNYXgiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxjPXtuYW1lOiJTb2Z0TWF4IixpbnB1dE5hbWVzOlsiQSIsIk1heCIsIk5vcm0iXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQscy5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3Quc29mdG1heD0oZSx0LG4pPT57Zyh0KTtjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLGk9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsci5sZW5ndGgpLHM9by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKHIsaSksYT1vLlNoYXBlVXRpbC5zaXplRnJvbURpbWVuc2lvbihyLGkpO3JldHVybiBwKGUsdCxuLHMsYSl9LHQucGFyc2VTb2Z0bWF4QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDEpfSksdC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzVjEzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsLTEpfSksdC5zb2Z0bWF4VjEzPShlLHQsbik9PntnKHQpO2NvbnN0IGk9dFswXS5kaW1zLnNsaWNlKCkscz1vLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKG4uYXhpcyxpLmxlbmd0aCksdT1pLmxlbmd0aCxsPXMhPT11LTEsYz1bXTtsZXQgZCxmPVtdLGg9W107bCYmKGY9QXJyYXkuZnJvbSh7bGVuZ3RoOnV9KS5tYXAoKChlLHQpPT50KSksZltzXT11LTEsZlt1LTFdPXMsZi5tYXAoKGU9PmMucHVzaChpW2VdKSkpLGQ9KDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7cGVybTpmfSksaD0oMCwgYS50cmFuc3Bvc2UpKGUsdCxkKSk7Y29uc3QgYj1sP28uU2hhcGVVdGlsLnNpemVUb0RpbWVuc2lvbihjLHUtMSk6by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKGksdS0xKSxtPWw/by5TaGFwZVV0aWwuc2l6ZUZyb21EaW1lbnNpb24oYyx1LTEpOm8uU2hhcGVVdGlsLnNpemVGcm9tRGltZW5zaW9uKGksdS0xKSx5PXAoZSxsP2g6dCxuLGIsbSk7cmV0dXJuIGw/KDAsIGEudHJhbnNwb3NlKShlLHksZCk6eX07Y29uc3QgcD0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZChlLHRbMF0scixvLFtyXSkscz1lLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+aX0pLHQpLGE9ZihlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsW3JdKSxwPWUucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hfSksW3RbMF0sc10pLGc9aChlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsYS5vdXRwdXQuZGltcyk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+Z30pLFt0WzBdLHMscF0pXX0sZD0oZSx0LG4scixvKT0+e2NvbnN0W2EsbF09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGM9by5sZW5ndGg7aWYobjwxfHxyPDEpdGhyb3cgbmV3IEVycm9yKCJMb2dpY2FsIHJvdyBjb3VudCBOIGFuZCBmZWF0dXJlIGNvdW50IEQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpO2lmKDEhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7Y29uc3QgcD0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludFske2N9XSBpbmRpY2VzKSB7XG4gICAgICAgIGludCBsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgPSBpbmRpY2VzWzBdICogJHtyfTtcblxuICAgICAgICBmbG9hdCBtYXggPSBnZXRDb2xvckFzRmxvYXQoJHtwLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0LCAke2F9LFxuICAgICAgICAke2x9ICkpKTtcbiAgICAgICAgZm9yKGludCBpPTE7IGk8JHtyfTsgKytpKVxuICAgICAgICB7XG4gICAgICAgICAgZmxvYXQgY3VycmVudCA9IGdldENvbG9yQXNGbG9hdCgke3AudGV4dHVyZTJEfShBLCBvZmZzZXRUb0Nvb3Jkcyhsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgKyBpLFxuICAgICAgICAgICAgJHthfSwgJHtsfSkpKTtcbiAgICAgICAgICBpZihjdXJyZW50ID4gbWF4KVxuICAgICAgICAgIG1heCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0sZj0oZSx0LG4scixvLGEpPT57Y29uc3RbdSxjXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCkscD1hLmxlbmd0aDtpZihuPDF8fHI8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYoMSE9PWEubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uYWxpdHkgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgMSIpO2lmKGFbMF0hPT1uKXRocm93IG5ldyBFcnJvcigiU2hhcGUgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtpZigxIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBkPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7cH1dIGluZGljZXMpIHtcbiAgICAgICAgaW50IGxvZ2ljYWxfcm93X3N0YXJ0X29mZnNldCA9IGluZGljZXNbMF0gKiAke3J9O1xuXG4gICAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gMC4wO1xuICAgICAgICBmbG9hdCBtYXggPSBfTWF4KGluZGljZXMpO1xuICAgICAgICBmb3IoaW50IGk9MDsgaTwke3J9OyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICBub3JtX2ZhY3RvciArPSBleHAoZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSxcbiAgICAgICAgICAgICR7dX0sICR7Y30pKSkgLSBtYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1fZmFjdG9yO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7b3V0cHV0OntkaW1zOmEsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0saD0oZSx0LG4scixvLGkpPT57Y29uc3RbYSx1XT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCksbD10LmRpbXMubGVuZ3RoO2lmKG48MXx8cjwxKXRocm93IG5ldyBFcnJvcigiTG9naWNhbCByb3cgY291bnQgTiBhbmQgZmVhdHVyZSBjb3VudCBEIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTtpZigxIT09by5sZW5ndGh8fDEhPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgMSIpO2lmKG9bMF0hPT1ufHxpWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBwPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7bH1dIGluZGljZXMpIHtcblxuICAgICAgLy8gZ2V0IG9mZnNldCBvZiBjdXJyZW50IGxvZ2ljYWwgdGVuc29yIGluZGV4IGZyb20gdGhlIDItRCB0ZXh0dXJlIGNvb3JkaW5hdGVzIChUZXhDb29yZHMpXG4gICAgICBpbnQgb2Zmc2V0ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2F9LCAke3V9KTtcblxuICAgICAgLy9kZXRlcm1pbmUgdGhlIGxvZ2ljYWwgcm93IGZvciB0aGlzIGluZGV4XG4gICAgICBpbnQgbG9naWNhbF9yb3dfaW5kZXhbMV07XG4gICAgICBsb2dpY2FsX3Jvd19pbmRleFswXSA9IG9mZnNldCAvICR7cn07XG5cbiAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gX05vcm0obG9naWNhbF9yb3dfaW5kZXgpO1xuXG4gICAgICAvLyBhdm9pZCBwb3NzaWJsZSBkaXZpc2lvbiBieSAwXG4gICAgICAvLyBpZiBub3JtX2ZhY29yIGlzIDAsIGFsbCBlbGVtZW50cyBhcmUgemVyb1xuICAgICAgLy8gaWYgc28sIHJldHVybiAwXG4gICAgICBpZihub3JtX2ZhY3RvciA9PSAwLjApXG4gICAgICAgIHJldHVybiAwLjA7XG5cbiAgICAgIHJldHVybiBleHAoX0EoaW5kaWNlcykgLSBfTWF4KGxvZ2ljYWxfcm93X2luZGV4KSkgLyBub3JtX2ZhY3RvcjtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOnMuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpwfSl9LGc9ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTb2Z0bWF4IHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUiKX07fSw1NjQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3BsaXRBdHRyaWJ1dGVzPXQuc3BsaXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlNwbGl0IixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNwbGl0PShlLHQsbik9PntsKHQpO2NvbnN0IHI9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsdFswXS5kaW1zLmxlbmd0aCksaT1hKGUsdCxyLG4pLGM9W107Zm9yKGxldCBvPTA7bzxpOysrbyljLnB1c2goZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6YCR7bi5jYWNoZUtleX07JHtvfWAsZ2V0OigpPT51KGUsdFswXSxuLHIsbyl9KSx0KSk7cmV0dXJuIGN9LHQucGFyc2VTcGxpdEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsMCksbj1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3BsaXQiLFtdKSxvPWUub3V0cHV0cy5sZW5ndGg7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6dCxzcGxpdDpuLG51bU91dHB1dHM6b30pfTtjb25zdCBhPShlLHQsbixyKT0+e2NvbnN0WyxpXT1vLlNwbGl0VXRpbC5zcGxpdFNoYXBlKHRbMF0uZGltcyxuLHIuc3BsaXQsci5udW1PdXRwdXRzKTtyZXR1cm4gaS5sZW5ndGh9LHU9KGUsdCxuLHIsYSk9Pntjb25zdFt1LGxdPW8uU3BsaXRVdGlsLnNwbGl0U2hhcGUodC5kaW1zLHIsbi5zcGxpdCxuLm51bU91dHB1dHMpLGM9bFthXSxwPXVbYV0sZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cC5sZW5ndGh9XSkge1xuICAgICAgICBpbmRpY2VzWyR7cn1dICs9ICR7Y307XG4gICAgICAgIHJldHVybiBfQShpbmRpY2VzKTtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2NhY2hlSGludDpgJHtuLmNhY2hlS2V5fToke2F9YCxvdXRwdXQ6e2RpbXM6cCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BsaXQgcmVxdWlyZXMgb25lIGlucHV0LiIpO2lmKCJpbnQ4IiE9PWVbMF0udHlwZSYmInVpbnQ4IiE9PWVbMF0udHlwZSYmImludDE2IiE9PWVbMF0udHlwZSYmInVpbnQxNiIhPT1lWzBdLnR5cGUmJiJpbnQzMiIhPT1lWzBdLnR5cGUmJiJ1aW50MzIiIT09ZVswXS50eXBlJiYiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSYmImJvb2wiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDU0MTY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXM9dC5zcXVlZXplVjEzPXQuc3F1ZWV6ZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3Quc3F1ZWV6ZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPXIuU2hhcGVVdGlsLnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC5zcXVlZXplVjEzPShlLG4pPT4oaShuKSwoMCwgdC5zcXVlZXplKShlLFtuWzBdXSxBcnJheS5mcm9tKG5bMV0uaW50ZWdlckRhdGEpKSksdC5wYXJzZVNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigic3RyaW5nIj09PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfSxpPWU9PntpZighZXx8MiE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3F1ZWV6ZSByZXF1aXJlcyAyIGlucHV0cy4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDEyNDA6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnN1bT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LnN1bT0oZSx0KT0+e3ModCk7Y29uc3Qgbj17bmFtZToiU3VtIixpbnB1dE5hbWVzOnQubWFwKCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG8uVGV4dHVyZVR5cGUudW5wYWNrZWQpfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3QgaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz10WzBdLmRpbXMuc2xpY2UoKSxhPWBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSAke3QubWFwKCgoZSx0KT0+YCR7aS50ZXh0dXJlMkR9KFgke3R9LFRleENvb3JkcylgKSkuam9pbigiICsgIil9O1xuICAgICAgICAke2kub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpzLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmF9KX0scz1lPT57aWYoIWV8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlN1bSByZXF1aXJlcyBpbnB1dHMuIik7Y29uc3QgdD1lWzBdLmRpbXMubGVuZ3RoO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtpZih0IT09ZVtuXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtmb3IobGV0IHI9MDtyPHQ7cisrKWlmKGVbMF0uZGltc1tyXSE9PWVbbl0uZGltc1tyXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbm90IG1hdGNoZWQuIil9aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDt0KyspaWYoZVswXS50eXBlIT09ZVt0XS50eXBlKXRocm93IG5ldyBFcnJvcigiSW5wdXQgdHlwZXMgYXJlIG5vdCBtYXRjaGVkLiIpfTt9LDU5NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRpbGU9dm9pZCAwO2NvbnN0IHI9big2MTQ1KSxvPW4oNTYzOSk7dC50aWxlPShlLHQpPT57cyh0KTtjb25zdCBuPXtuYW1lOiJUaWxlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3Qgcj10WzBdLmRpbXMuc2xpY2UoKSxpPW5ldyBBcnJheShyLmxlbmd0aCkscz1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpW2VdPXJbZV0qdFsxXS5udW1iZXJEYXRhW2VdLHMucHVzaChgaW5wdXRJZHhbJHtlfV0gPSBpbnQobW9kKGZsb2F0KG91dHB1dElkeFske2V9XSksICR7cltlXX0uKSk7YCk7Y29uc3QgYT1pLmxlbmd0aCx1PWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske2F9XSkge1xuICAgICAgICBpbnQgaW5wdXRJZHhbJHthfV07XG4gICAgICAgICR7cy5qb2luKCJcbiIpfVxuICAgICAgICByZXR1cm4gX0EoaW5wdXRJZHgpO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOmksdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnV9KX0scz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRpbGUgcmVxdWlyZXMgMiBpbnB1dC4iKTtpZigxIT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzZWNvbmQgaW5wdXQgc2hhcGUgbXVzdCAxIGRpbWVuc2lvbi4iKTtpZihlWzFdLmRpbXNbMF0hPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigtMT09PXIuTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlJiYiaW50MTYiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZXBlYXQgdHlwZS4iKX07fSw1NzA3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVRyYW5zcG9zZUF0dHJpYnV0ZXM9dC50cmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlRyYW5zcG9zZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC50cmFuc3Bvc2U9KGUsdCxuKT0+KHAodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdFswXSxuLnBlcm0pfSksdCldKSx0LnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtwZXJtOmUuYXR0cmlidXRlcy5nZXRJbnRzKCJwZXJtIixbXSl9KTtjb25zdCBhPShlLHQsbik9Pntjb25zdCByPXQuZGltcztuPXUocixuKTtjb25zdCBvPWwocixuKSxhPXIubGVuZ3RoLHA9YFxuICAgICAgJHtjKCJwZXJtIixuLGEpfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2F9XSkge1xuICAgICAgICBpbnQgYVske2F9XTtcbiAgICAgICAgcGVybShhLCBpbmRpY2VzKTtcbiAgICAgICAgcmV0dXJuIF9BKGEpO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX0sdT0oZSx0KT0+KHQmJnQubGVuZ3RoIT09ZS5sZW5ndGgmJih0PVsuLi5lLmtleXMoKV0ucmV2ZXJzZSgpKSx0KSxsPShlLHQpPT4odD11KGUsdCksby5TaGFwZVV0aWwuc29ydEJhc2VkT25QZXJtKGUsdCkpLGM9KGUsdCxuKT0+e2NvbnN0IHI9W107ci5wdXNoKGB2b2lkICR7ZX0ob3V0IGludCBhWyR7bn1dLCBpbnQgc3JjWyR7bn1dKSB7YCk7Zm9yKGxldCBlPTA7ZTxuOysrZSlyLnB1c2goYFx0YVske3RbZV19XT1zcmNbJHtlfV07YCk7cmV0dXJuIHIucHVzaCgiXHR9Iiksci5qb2luKCJcbiIpfSxwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVHJhbnNwb3NlIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaG91bGQgYmUgZmxvYXQgdGVuc29yIil9O30sMjQ4ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZW5jb2RlQXNVaW50OD12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LmVuY29kZUFzVWludDg9KGUsdCk9Pntjb25zdCBuPXQuc2hhcGUsaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz1gXG4gICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODtcbiAgICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcblxuICAgIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7XG4gICAgICByZXR1cm4gKHZhbCA8IDEuMCB8fCAwLjAgPCB2YWwgfHwgdmFsID09IDAuMCkgPyBmYWxzZSA6IHRydWU7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBlbmNvZGVBc1VpbnQ4KGhpZ2hwIGZsb2F0IHYpIHtcbiAgICAgIGlmIChpc05hTih2KSkge1xuICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpO1xuICAgICAgfVxuXG4gICAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgICAgaWYoYXYgPCBGTE9BVF9NSU4pIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAxMjguMCwgMTI3LjApIC8gMjU1LjA7XG4gICAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgICB9XG5cbiAgICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgICBoaWdocCBmbG9hdCBtID0gZXhwMihmcmFjdChsb2cyKGF2KSkpIC0gMS4wO1xuXG4gICAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgICAgY1sxXSA9IGZsb29yKDMyNzY4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7XG4gICAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xuICAgICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcbiAgICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wO1xuXG4gICAgICBjWzNdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAgICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgICB9XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBmbG9hdCB2YWx1ZSA9ICR7aS50ZXh0dXJlMkR9KFgsVGV4Q29vcmRzKS5yO1xuICAgICAgJHtpLm91dHB1dH0gPSBlbmNvZGVBc1VpbnQ4KHZhbHVlKTtcbiAgICB9YCxhPXtuYW1lOiJVaW50OEVuY29kZSIsaW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS51bnBhY2tlZF0saW5wdXROYW1lczpbIlgiXSxvdXRwdXQ6e2RpbXM6bix0eXBlOnQudGVuc29yLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5kb3dubG9hZFVpbnQ4QXNGbG9hdH0sc2hhZGVyU291cmNlOnMsaGFzTWFpbjohMH07cmV0dXJuIGUuZXhlY3V0ZVByb2dyYW0oYSxbdC50ZW5zb3JdKX07fSw5MDg3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50YW5oPXQudGFuPXQuc3FydD10LnNpbj10LnNpZ21vaWQ9dC5yZWx1PXQubm90PXQubmVnPXQubG9nPXQucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzPXQubGVha3lSZWx1PXQuaWRlbnRpdHk9dC5mbG9vcj10LmV4cD10LnBhcnNlRWx1QXR0cmlidXRlcz10LmVsdT10LmNvcz10LmNlaWw9dC5jbGlwVjExPXQucGFyc2VDbGlwQXR0cmlidXRlcz10LmNsaXA9dC5hdGFuPXQuYXNpbj10LmFjb3M9dC5hYnM9dC5nbHNsVGFuaD10Lmdsc2xUYW49dC5nbHNsU3FydD10Lmdsc2xTaWdtb2lkPXQuZ2xzbFJlbHU9dC5nbHNsU2luPXQuZ2xzbE5vdD10Lmdsc2xOZWc9dC5nbHNsTG9nPXQuZ2xzbExlYWt5UmVsdT10Lmdsc2xJZGVudGl0eT10Lmdsc2xDbGlwPXQuZ2xzbEZsb29yPXQuZ2xzbEV4cD10Lmdsc2xFbHU9dC5nbHNsQ29zPXQuZ2xzbENlaWw9dC5nbHNsQXRhbj10Lmdsc2xBc2luPXQuZ2xzbEFjb3M9dC5nbHNsQWJzPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9bigxOTk3KSxzPW4oNjc1NyksYT1uKDU2MzkpO2Z1bmN0aW9uIHUoKXtyZXR1cm4gRSgiYWJzIil9ZnVuY3Rpb24gbCgpe3JldHVybiBFKCJhY29zIil9ZnVuY3Rpb24gYygpe3JldHVybiBFKCJhc2luIil9ZnVuY3Rpb24gcCgpe3JldHVybiBFKCJhdGFuIil9ZnVuY3Rpb24gZCgpe3JldHVybiBFKCJjZWlsIil9ZnVuY3Rpb24gZigpe3JldHVybiBFKCJjb3MiKX1mdW5jdGlvbiBoKGUpe2NvbnN0IHQ9ImVsdSI7cmV0dXJuIHtib2R5OmBcbiAgY29uc3QgZmxvYXQgYWxwaGEgPSBmbG9hdCgke2V9KTtcblxuICBmbG9hdCAke3R9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGEgPj0gMC4wID8gYTogKGV4cChhKSAtIDEuMCkgKiBhbHBoYTtcbiAgfVxuICB2ZWM0ICR7dH1fKHZlYzQgdikge1xuICAgIHJldHVybiB2ZWM0KCR7dH1fKHYueCksICR7dH1fKHYueSksICR7dH1fKHYueiksICR7dH1fKHYudykpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gZygpe3JldHVybiBFKCJleHAiKX1mdW5jdGlvbiBiKCl7cmV0dXJuIEUoImZsb29yIil9ZnVuY3Rpb24gbShlLHQpe2NvbnN0IG49ImNsaXAiO3JldHVybiB7Ym9keTpgXG4gIGNvbnN0IGZsb2F0IG1pbiA9IGZsb2F0KCR7ZX0pO1xuICBjb25zdCBmbG9hdCBtYXggPSBmbG9hdCgke3R9KTtcblxuICBmbG9hdCAke259XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGNsYW1wKGEsIG1pbiwgbWF4KTtcbiAgfVxuICB2ZWM0ICR7bn1fKHZlYzQgdikge1xuICAgIHJldHVybiBjbGFtcCh2LCBtaW4sIG1heCk7XG4gIH1cbiAgYCxuYW1lOm4sdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0iaW5kZW50aXR5IjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGE7XG4gIH1cbiAgdmVjNCAke2V9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHYoZSl7Y29uc3QgdD0ibGVha3lSZWx1IjtyZXR1cm4ge2JvZHk6YFxuICBjb25zdCBmbG9hdCBhbHBoYSA9IGZsb2F0KCR7ZX0pO1xuXG4gIGZsb2F0ICR7dH1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBhbHBoYSA6IGE7XG4gIH1cbiAgdmVjNCAke3R9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdmVjNCgke3R9Xyh2LngpLCAke3R9Xyh2LnkpLCAke3R9Xyh2LnopLCAke3R9Xyh2LncpKTtcbiAgfVxuICBgLG5hbWU6dCx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIF8oKXtyZXR1cm4gRSgibG9nIil9ZnVuY3Rpb24gdygpe2NvbnN0IGU9Im5lZyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAtYTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiAtdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIFQoKXtjb25zdCBlPSJub3QiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gZmxvYXQoICEgYm9vbChhKSApO1xuICB9XG4gIGJvb2wgJHtlfV8oYm9vbCBhKSB7XG4gICAgcmV0dXJuICFhO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIHZlYzQoIWJvb2wodi54KSwgIWJvb2wodi55KSwgIWJvb2wodi56KSwgIWJvb2wodi53KSk7XG4gIH1cbiAgYnZlYzQgJHtlfV8oYnZlYzQgdikge1xuICAgIHJldHVybiBidmVjNCghdi54LCAhdi55LCAhdi56LCAhdi53KTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHgoKXtyZXR1cm4gRSgic2luIil9ZnVuY3Rpb24gTygpe2NvbnN0IGU9InJlbHUiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gbWF4KCBhLCAwLjAgKTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiBtYXgoIHYsIDAuMCApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gUygpe2NvbnN0IGU9InNpZ21vaWQiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtYSkpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLXYpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEEoKXtyZXR1cm4gRSgic3FydCIpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gRSgidGFuIil9ZnVuY3Rpb24gSSgpe2NvbnN0IGU9InRhbmgiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICBhID0gY2xhbXAoYSwgLTEwLiwgMTAuKTtcbiAgICBhID0gZXhwKDIuKmEpO1xuICAgIHJldHVybiAoYSAtIDEuKSAvIChhICsgMS4pO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgdiA9IGNsYW1wKHYsIC0xMC4sIDEwLik7XG4gICAgdiA9IGV4cCgyLip2KTtcbiAgICByZXR1cm4gKHYgLSAxLikgLyAodiArIDEuKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEUoZSl7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAke2V9KGEpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuICR7ZX0odik7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBYnM9dSx0Lmdsc2xBY29zPWwsdC5nbHNsQXNpbj1jLHQuZ2xzbEF0YW49cCx0Lmdsc2xDZWlsPWQsdC5nbHNsQ29zPWYsdC5nbHNsRWx1PWgsdC5nbHNsRXhwPWcsdC5nbHNsRmxvb3I9Yix0Lmdsc2xDbGlwPW0sdC5nbHNsSWRlbnRpdHk9eSx0Lmdsc2xMZWFreVJlbHU9dix0Lmdsc2xMb2c9Xyx0Lmdsc2xOZWc9dyx0Lmdsc2xOb3Q9VCx0Lmdsc2xTaW49eCx0Lmdsc2xSZWx1PU8sdC5nbHNsU2lnbW9pZD1TLHQuZ2xzbFNxcnQ9QSx0Lmdsc2xUYW49UCx0Lmdsc2xUYW5oPUk7Y29uc3QgRD0oZSx0LG4scik9Pntjb25zdCBvPWUuc2Vzc2lvbi5wYWNrP2EuVGV4dHVyZVR5cGUucGFja2VkOmEuVGV4dHVyZVR5cGUudW5wYWNrZWQsaT17bmFtZTpuLm5hbWUsaW5wdXRUeXBlczpbb10saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6cn07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3Qgbz1lLnNlc3Npb24ucGFjaz9hLlRleHR1cmVUeXBlLnBhY2tlZDphLlRleHR1cmVUeXBlLnVucGFja2VkLGk9KDAsIHMuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpuLmRpbXMsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6b30sc2hhZGVyU291cmNlOmBcbiAgICAgJHtyLmJvZHl9XG4gICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICB2ZWM0IHYgPSAke2kudGV4dHVyZTJEfShBLCBUZXhDb29yZHMpO1xuICAgICAgIHYgPSAke3IubmFtZX1fKHYpO1xuICAgICAgICR7aS5vdXRwdXR9ID0gdjtcbiAgICAgfVxuICAgICBgLGhhc01haW46ITB9KX0pKGUsaSx0LG4pfSl9O3QuYWJzPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sdSgpKSx0KV0sdC5hY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sbCgpKSx0KV0sdC5hc2luPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYygpKSx0KV0sdC5hdGFuPShlLHQpPT5bZS5ydW4oRChlLHRbMF0scCgpKSx0KV0sdC5jbGlwPShlLHQsbik9PltlLnJ1bihEKGUsdFswXSxtKG4ubWluLG4ubWF4KSxuLmNhY2hlS2V5KSx0KV0sdC5wYXJzZUNsaXBBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1pbiIsby5NSU5fQ0xJUCksbWF4OmUuYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4IixvLk1BWF9DTElQKX0pLHQuY2xpcFYxMT0oZSxuKT0+e2NvbnN0IHI9JChlLG4pO3JldHVybiAoMCwgdC5jbGlwKShlLFtuWzBdXSxyKX07Y29uc3QgJD0oZSx0KT0+e2lmKHQubGVuZ3RoPj0zJiYoIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMV0uZGF0YUlkKXx8IWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKSkpdGhyb3cgbmV3IEVycm9yKCJkeW5hbWljIGNsaXAgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBuPXQubGVuZ3RoPj0zP3RbMV0ubnVtYmVyRGF0YVswXTpvLk1JTl9DTElQLGk9dC5sZW5ndGg+PTM/dFsyXS5udW1iZXJEYXRhWzBdOm8uTUFYX0NMSVA7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjpuLG1heDppfSl9O3QuY2VpbD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLGQoKSksdCldLHQuY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sZigpKSx0KV0sdC5lbHU9KGUsdCxuKT0+W2UucnVuKEQoZSx0WzBdLGgobi5hbHBoYSksbi5jYWNoZUtleSksdCldLHQucGFyc2VFbHVBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2FscGhhOmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYWxwaGEiLDEpfSksdC5leHA9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxnKCkpLHQpXSx0LmZsb29yPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYigpKSx0KV0sdC5pZGVudGl0eT0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHkoKSksdCldLHQubGVha3lSZWx1PShlLHQsbik9PltlLnJ1bihEKGUsdFswXSx2KG4uYWxwaGEpLG4uY2FjaGVLZXkpLHQpXSx0LnBhcnNlTGVha3lSZWx1QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwuMDEpfSksdC5sb2c9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxfKCkpLHQpXSx0Lm5lZz0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHcoKSksdCldLHQubm90PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sVCgpKSx0KV0sdC5yZWx1PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sTygpKSx0KV0sdC5zaWdtb2lkPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sUygpKSx0KV0sdC5zaW49KGUsdCk9PltlLnJ1bihEKGUsdFswXSx4KCkpLHQpXSx0LnNxcnQ9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxBKCkpLHQpXSx0LnRhbj0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLFAoKSksdCldLHQudGFuaD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLEkoKSksdCldO30sNTQwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mb0xvYWRlcj10LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJ1bnBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS5wYWNrZWRdfTt0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPShlLHQpPT57Y29uc3Qgbj10LmRpbXMubGVuZ3RoLHU9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJyYyIsbiksbD11LnNsaWNlKC0yKSxjPSgwLCBpLmdldENvb3Jkc0RhdGFUeXBlKShuKSxwPSgwLCBzLnVucGFja0Zyb21DaGFubmVsKSgpLGQ9MD09PXQuZGltcy5sZW5ndGg/IiI6ZnVuY3Rpb24oZSx0KXtpZigxPT09ZSlyZXR1cm4gInJjIjtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPGU7cisrKW4rPXRbcl0scjxlLTEmJihuKz0iLCIpO3JldHVybiBufShuLHUpLGY9bjw9MT8icmMiOmB2ZWMyKCR7bC5qb2luKCIsIil9KWAsaD1gXG4gICAgJHtwfVxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7Y30gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgIC8vIFNhbXBsZSB0aGUgdGV4dHVyZSB3aXRoIHRoZSBjb29yZHMgdG8gZ2V0IHRoZSByZ2JhIGNoYW5uZWwgdmFsdWUuXG4gICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHtkfSk7XG5cbiAgICAgICAkeygwLCByLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmVjNChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Z9KSwgMCwgMCwgMCk7XG4gICAgIH1cbiAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aGFzTWFpbjohMCxvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpofSl9LHQuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbik9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Z2V0OigpPT4oMCwgdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mbykoZSxuKX0pO30sNzg2MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPXQudW5zcXVlZXplVjEzPXQudW5zcXVlZXplPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC51bnNxdWVlemU9KGUsdCxuKT0+e28odCk7Y29uc3QgaT1yLlNoYXBlVXRpbC51bnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC51bnNxdWVlemVWMTM9KGUsbik9PihpKG4pLCgwLCB0LnVuc3F1ZWV6ZSkoZSxbblswXV0sQXJyYXkuZnJvbShuWzFdLmludGVnZXJEYXRhKSkpLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlVuc3F1ZWV6ZSByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgdHlwZXMuIil9LGk9ZT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbnNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoImludDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07fSwzOTgwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zY2FsZXNWYWxpZGF0aW9uPXQudmFsaWRhdGVJbnB1dHM9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcz10LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjk9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y3PXQudXBzYW1wbGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9e25hbWU6IlVwc2FtcGxlIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnVwc2FtcGxlPShlLG4scik9PigoMCwgdC52YWxpZGF0ZUlucHV0cykobixyKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6ci5jYWNoZUtleSxnZXQ6KCk9PmEoZSxuLHIpfSksbildKSx0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjc9ZT0+KDAsIHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsNyksdC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y5PWU9PigwLCB0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShlLDkpLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXM9KGUsbik9Pntjb25zdCBvPW4+PTEwLGk9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIm5lYXJlc3QiKTtpZigibmVhcmVzdCIhPT1pJiYibGluZWFyIiE9PWkmJihuPDExfHwiY3ViaWMiIT09aSkpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtpfWApO2xldCBzPVtdO248OSYmKHM9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0cygic2NhbGVzIiksKDAsIHQuc2NhbGVzVmFsaWRhdGlvbikocyxpLG8pKTtjb25zdCBhPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXh0cmFwb2xhdGlvbl92YWx1ZSIsMCksdT1uPjEwP2UuYXR0cmlidXRlcy5nZXRTdHJpbmcoImNvb3JkaW5hdGVfdHJhbnNmb3JtYXRpb25fbW9kZSIsImhhbGZfcGl4ZWwiKToiYXN5bW1ldHJpYyI7aWYoLTE9PT1bImFzeW1tZXRyaWMiLCJweXRvcmNoX2hhbGZfcGl4ZWwiLCJ0Zl9oYWxmX3BpeGVsX2Zvcl9ubiIsImFsaWduX2Nvcm5lcnMiLCJ0Zl9jcm9wX2FuZF9yZXNpemUiLCJoYWxmX3BpeGVsIl0uaW5kZXhPZih1KSl0aHJvdyBuZXcgRXJyb3IoYGNvb3JkaW5hdGVfdHJhbnNmb3JtX21vZGUgJyR7dX0nIGlzIG5vdCBzdXBwb3J0ZWRgKTtjb25zdCBsPSJ0Zl9jcm9wX2FuZF9yZXNpemUiPT09dSxjPWwscD0ibmVhcmVzdCI9PT1pJiZuPj0xMT9lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJuZWFyZXN0X21vZGUiLCJyb3VuZF9wcmVmZXJfZmxvb3IiKToiIjtpZigtMT09PVsicm91bmRfcHJlZmVyX2Zsb29yIiwicm91bmRfcHJlZmVyX2NlaWwiLCJmbG9vciIsImNlaWwiLCIiXS5pbmRleE9mKHApKXRocm93IG5ldyBFcnJvcihgbmVhcmVzdF9tb2RlICcke3B9JyBpcyBub3Qgc3VwcG9ydGVkYCk7Y29uc3QgZD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImN1YmljX2NvZWZmX2EiLC0uNzUpLGY9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImV4Y2x1ZGVfb3V0c2lkZSIsMCk7aWYoZiYmImN1YmljIiE9PWkpdGhyb3cgbmV3IEVycm9yKCJleGNsdWRlX291dHNpZGUgY2FuIGJlIHNldCB0byAxIG9ubHkgd2hlbiBtb2RlIGlzIENVQklDLiIpO2NvbnN0IGg9bjwxMXx8Im5lYXJlc3QiPT09aSYmImFzeW1tZXRyaWMiPT09dSYmImZsb29yIj09PXA7bGV0IGc9MCxiPTAsbT0wO3JldHVybiBuPjEwP2UuaW5wdXRzLmxlbmd0aD4yPyhnPTEsYj0yLG09Myk6KGI9MSxtPTIpOjk9PT1uJiYoYj0xKSwoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtvcHNldDpuLGlzUmVzaXplOm8sbW9kZTppLHNjYWxlczpzLGV4dHJhcG9sYXRpb25WYWx1ZTphLGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOnUsdXNlRXh0cmFwb2xhdGlvbjpjLG5lZWRSb2lJbnB1dDpsLG5lYXJlc3RNb2RlOnAsY3ViaWNDb2VmZmljaWVudEE6ZCxleGNsdWRlT3V0c2lkZTpmLHVzZU5lYXJlc3QyeE9wdGltaXphdGlvbjpoLHJvaUlucHV0SWR4Omcsc2NhbGVzSW5wdXRJZHg6YixzaXplc0lucHV0SWR4Om19KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodFswXS5kaW1zLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9dFswXS5kaW1zLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoZSpuLnNjYWxlc1t0XSkpKSxbYyxwXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChsLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGQ9bC5sZW5ndGgsZj1uZXcgQXJyYXkoZCksaD1uZXcgQXJyYXkoZCk7bGV0IGc9YFxuICAgICAgaW50IG91dHB1dF9waXRjaGVzWyR7ZH1dO1xuICAgICAgaW50IGlucHV0X3BpdGNoZXNbJHtkfV07XG4gICAgICBgO2ZvcihsZXQgZT1kLTE7ZT49MDtlLS0pZltlXT1lPT09ZC0xPzE6ZltlKzFdKmxbZSsxXSxoW2VdPWU9PT1kLTE/MTpoW2UrMV0qdFswXS5kaW1zW2UrMV0sZys9YFxuICAgICAgICBvdXRwdXRfcGl0Y2hlc1ske2V9XSA9ICR7ZltlXX07XG4gICAgICAgIGlucHV0X3BpdGNoZXNbJHtlfV0gPSAke2hbZV19O1xuICAgICAgICBgO2NvbnN0IGI9YFxuICAgICAgZmxvYXQgZ2V0SW5wdXRGbG9hdChpbnQgaW5kZXgpIHtcbiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbmRleCwgJHthfSwgJHt1fSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KFgsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgLG09Im5lYXJlc3QiPT09bi5tb2RlP2BcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2R9XSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBkLCBtO1xuICAgICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgJHtkfTsgKytkaW0pIHtcbiAgICAgICAgZCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzW2RpbV07XG4gICAgICAgIG0gPSBvdXRwdXRfaW5kZXggLSBkICogb3V0cHV0X3BpdGNoZXNbZGltXTtcbiAgICAgICAgb3V0cHV0X2luZGV4ID0gbTtcblxuICAgICAgICBpZiAoc2NhbGVzW2RpbV0gIT0gMSAmJiBkID4gMCkge1xuICAgICAgICAgIGludCBkMiA9IGQgLyBzY2FsZXNbZGltXTtcbiAgICAgICAgICBtID0gZCAtIGQyICogc2NhbGVzW2RpbV07XG4gICAgICAgICAgZCA9IGQyO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0X2luZGV4ICs9IGlucHV0X3BpdGNoZXNbZGltXSAqIGQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICB9YDo0PT09ZD9gXG4gICAgJHtifVxuICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbNF0pIHtcbiAgICAgIGludCBpbnB1dF9pbmRleCA9IDA7XG4gICAgICBpbnQgb3V0cHV0X2luZGV4ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2N9LCAke3B9KTtcblxuICAgICAgJHtnfVxuXG4gICAgICBpbnQgbTtcbiAgICAgIGludCBpbmRleF9vZl9kaW0wLCBpbmRleF9vZl9kaW0xLCBpbmRleF9vZl9kaW0yLCBpbmRleF9vZl9kaW0zO1xuICAgICAgaW5kZXhfb2ZfZGltMCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGluZGV4X29mX2RpbTAgKiBvdXRwdXRfcGl0Y2hlc1swXTtcbiAgICAgIGluZGV4X29mX2RpbTEgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMV07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTEgKiBvdXRwdXRfcGl0Y2hlc1sxXTtcbiAgICAgIGluZGV4X29mX2RpbTIgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMl07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTIgKiBvdXRwdXRfcGl0Y2hlc1syXTtcbiAgICAgIGluZGV4X29mX2RpbTMgPSBtO1xuXG4gICAgICBpbnQgaW5kZXhfb2ZfaW5wdXRfZGltMiwgaW5kZXhfb2ZfaW5wdXRfZGltMywgeF9vZmZzZXQsIHlfb2Zmc2V0O1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMiA9IGluZGV4X29mX2RpbTIgLyBzY2FsZXNbMl07XG4gICAgICB5X29mZnNldCA9IGluZGV4X29mX2RpbTIgLSBpbmRleF9vZl9pbnB1dF9kaW0yICogc2NhbGVzWzJdO1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMyA9IGluZGV4X29mX2RpbTMgLyBzY2FsZXNbM107XG4gICAgICB4X29mZnNldCA9IGluZGV4X29mX2RpbTMgLSBpbmRleF9vZl9pbnB1dF9kaW0zICogc2NhbGVzWzNdO1xuXG4gICAgICBpbnB1dF9pbmRleCA9IGluZGV4X29mX2RpbTAgKiBpbnB1dF9waXRjaGVzWzBdICtcbiAgICAgICAgICAgIGluZGV4X29mX2RpbTEgKiBpbnB1dF9waXRjaGVzWzFdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTIgKiBpbnB1dF9waXRjaGVzWzJdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTM7XG5cbiAgICAgIGZsb2F0IHgwMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXgpO1xuICAgICAgZmxvYXQgeDEwLCB4MDEsIHgxMTtcblxuICAgICAgYm9vbCBlbmRfb2ZfZGltMiA9IGZhbHNlO1xuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTIgPT0gKCR7dFswXS5kaW1zWzJdfSAtIDEpKSB7XG4gICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMlxuICAgICAgICB4MDEgPSB4MDA7XG4gICAgICAgIGVuZF9vZl9kaW0yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHgwMSA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTMgPT0gKGlucHV0X3BpdGNoZXNbMl0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDNcbiAgICAgICAgeDEwID0geDAwO1xuICAgICAgICB4MTEgPSB4MDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgeDEwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIDEpO1xuICAgICAgICB4MTEgPSBlbmRfb2ZfZGltMiA/IHgxMCA6IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGZsb2F0IHkwID0geDAwICsgZmxvYXQoeV9vZmZzZXQpICogKHgwMSAtIHgwMCkgLyBmbG9hdChzY2FsZXNbMl0pO1xuICAgICAgZmxvYXQgeTEgPSB4MTAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDExIC0geDEwKSAvIGZsb2F0KHNjYWxlc1syXSk7XG4gICAgICByZXR1cm4geTAgKyBmbG9hdCh4X29mZnNldCkgKiAoeTEgLSB5MCkgLyBmbG9hdChzY2FsZXNbM10pO1xuICAgIH1gOmBcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1syXSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBtO1xuICAgICAgaW50IGluZGV4X29mX2RpbTAsIGluZGV4X29mX2RpbTE7XG4gICAgICBpbmRleF9vZl9kaW0wID0gb3V0cHV0X2luZGV4IC8gb3V0cHV0X3BpdGNoZXNbMF07XG4gICAgICBtID0gb3V0cHV0X2luZGV4IC0gaW5kZXhfb2ZfZGltMCAqIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgaW5kZXhfb2ZfZGltMSA9IG07XG5cbiAgICAgIGludCBpbmRleF9vZl9pbnB1dF9kaW0wLCBpbmRleF9vZl9pbnB1dF9kaW0xLCB4X29mZnNldCwgeV9vZmZzZXQ7XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0wID0gaW5kZXhfb2ZfZGltMCAvIHNjYWxlc1swXTtcbiAgICAgIHlfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMCAtIGluZGV4X29mX2lucHV0X2RpbTAgKiBzY2FsZXNbMF07XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0xID0gaW5kZXhfb2ZfZGltMSAvIHNjYWxlc1sxXTtcbiAgICAgIHhfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMSAtIGluZGV4X29mX2lucHV0X2RpbTEgKiBzY2FsZXNbMV07XG5cbiAgICAgIGlucHV0X2luZGV4ID0gaW5kZXhfb2ZfaW5wdXRfZGltMCAqIGlucHV0X3BpdGNoZXNbMF0gKyBpbmRleF9vZl9pbnB1dF9kaW0xO1xuXG4gICAgICBmbG9hdCB4MDAgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICAgIGZsb2F0IHgxMCwgeDAxLCB4MTE7XG5cbiAgICAgIGJvb2wgZW5kX29mX2RpbTAgPSBmYWxzZTtcbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0wID09ICgke3RbMF0uZGltc1swXX0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDBcbiAgICAgICAgeDAxID0geDAwO1xuICAgICAgICBlbmRfb2ZfZGltMCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4MDEgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0xID09IChpbnB1dF9waXRjaGVzWzBdIC0gMSkpIHtcbiAgICAgICAgLy8gSXQncyB0aGUgZW5kIGluIGRpbWVuc2lvbiAxXG4gICAgICAgIHgxMCA9IHgwMDtcbiAgICAgICAgeDExID0geDAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHgxMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyAxKTtcbiAgICAgICAgeDExID0gZW5kX29mX2RpbTAgPyB4MTAgOiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSArIDEpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCB5MCA9IHgwMCArIGZsb2F0KHlfb2Zmc2V0KSAqICh4MDEgLSB4MDApIC8gZmxvYXQoc2NhbGVzWzBdKTtcbiAgICAgIGZsb2F0IHkxID0geDEwICsgZmxvYXQoeV9vZmZzZXQpICogKHgxMSAtIHgxMCkgLyBmbG9hdChzY2FsZXNbMF0pO1xuICAgICAgcmV0dXJuIHkwICsgZmxvYXQoeF9vZmZzZXQpICogKHkxIC0geTApIC8gZmxvYXQoc2NhbGVzWzFdKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSx2YXJpYWJsZXM6W3tuYW1lOiJzY2FsZXMiLHR5cGU6ImludCIsYXJyYXlMZW5ndGg6bi5zY2FsZXMubGVuZ3RoLGRhdGE6bi5zY2FsZXMubWFwKChlPT5NYXRoLmNlaWwoZSkpKX1dfSl9O3QudmFsaWRhdGVJbnB1dHM9KGUsdCk9PntpZighZXx8dC5vcHNldDw5JiYxIT09ZS5sZW5ndGh8fHQub3BzZXQ+PTkmJnQub3BzZXQ8MTEmJjIhPT1lLmxlbmd0aHx8dC5vcHNldD49MTEmJmUubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0cy4iKTtpZih0LnNjYWxlcy5sZW5ndGg+MCYmZVswXS5kaW1zLmxlbmd0aCE9PXQuc2NhbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0sdC5zY2FsZXNWYWxpZGF0aW9uPShlLHQsbik9PntpZihuKXtmb3IoY29uc3QgdCBvZiBlKWlmKHQ8PTApdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAuIil9ZWxzZSBmb3IoY29uc3QgdCBvZiBlKWlmKHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNjYWxlIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4iKTtpZighKCJsaW5lYXIiIT09dCYmImN1YmljIiE9PXR8fDI9PT1lLmxlbmd0aHx8ND09PWUubGVuZ3RoJiYxPT09ZVswXSYmMT09PWVbMV0pKXRocm93IG5ldyBFcnJvcihgJ0xpbmVhcicgbW9kZSBhbmQgJ0N1YmljJyBtb2RlIG9ubHkgc3VwcG9ydCAyLUQgaW5wdXRzICgnQmlsaW5lYXInLCAnQmljdWJpYycpICAgICAgICAgb3IgNC1EIGlucHV0cyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG91dGVybW9zdCAyIHNjYWxlIHZhbHVlcyBiZWluZyAxICAgICAgICAgaW4gdGhlICR7bj8iUmVzaXplIjoiVXBzYW1wbGUifSBvcGVhcnRvci5gKX07fSwyNzU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qcm9ncmFtTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oODg5Nykscz1uKDY3NTcpO3QuUHJvZ3JhbU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucHJvZmlsZXI9ZSx0aGlzLmdsQ29udGV4dD10LHRoaXMudGV4dHVyZUxheW91dFN0cmF0ZWd5PW4sdGhpcy5yZXBvPW5ldyBNYXAsdGhpcy5hdHRyaWJ1dGVzQm91bmQ9ITE7fWdldEFydGlmYWN0KGUpe3JldHVybiB0aGlzLnJlcG8uZ2V0KGUpfXNldEFydGlmYWN0KGUsdCl7dGhpcy5yZXBvLnNldChlLHQpO31ydW4oZSx0LG4pe3ZhciByO3RoaXMucHJvZmlsZXIuZXZlbnQoIm9wIixgUHJvZ3JhbU1hbmFnZXIucnVuICR7bnVsbCE9PShyPWUucHJvZ3JhbUluZm8ubmFtZSkmJnZvaWQgMCE9PXI/cjoidW5rbm93biBrZXJuZWwifWAsKCgpPT57dmFyIHI7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5nbCxzPWUucHJvZ3JhbTtpLnVzZVByb2dyYW0ocyk7dHJ5e3RoaXMuYmluZE91dHB1dChuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZHx8dGhpcy5iaW5kQXR0cmlidXRlcyhlLmF0dHJpYkxvY2F0aW9ucyksdGhpcy5iaW5kVW5pZm9ybXMoZS51bmlmb3JtTG9jYXRpb25zLG51bGwhPT0ocj1lLnByb2dyYW1JbmZvLnZhcmlhYmxlcykmJnZvaWQgMCE9PXI/cjpbXSx0KTt9Y2F0Y2godCl7dGhyb3cgby5Mb2dnZXIuZXJyb3IoIlByb2dyYW1NYW5hZ2VyIixlLnByb2dyYW1JbmZvLnNoYWRlclNvdXJjZSksdH10aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiR2xDb250ZXh0LmRyYXcoKSIsKCgpPT57dGhpcy5nbENvbnRleHQuZHJhdygpO30pKTt9KSx0aGlzLmdsQ29udGV4dCk7fWRpc3Bvc2UoKXt0aGlzLnZlcnRleFNoYWRlciYmdGhpcy5nbENvbnRleHQuZGVsZXRlU2hhZGVyKHRoaXMudmVydGV4U2hhZGVyKSx0aGlzLnJlcG8uZm9yRWFjaCgoZT0+dGhpcy5nbENvbnRleHQuZGVsZXRlUHJvZ3JhbShlLnByb2dyYW0pKSk7fWJ1aWxkKGUsdCxuKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlByb2dyYW1NYW5hZ2VyLmJ1aWxkIiwoKCk9Pntjb25zdCByPW5ldyBpLkdsc2xQcmVwcm9jZXNzb3IodGhpcy5nbENvbnRleHQsZSx0LG4pLG89ci5wcmVwcm9jZXNzKCkscz10aGlzLmNvbXBpbGUobyk7cmV0dXJuIHtwcm9ncmFtSW5mbzplLHByb2dyYW06cyx1bmlmb3JtTG9jYXRpb25zOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9ucyhzLHIuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLHIuY29udGV4dC5wcm9ncmFtSW5mby52YXJpYWJsZXMpLGF0dHJpYkxvY2F0aW9uczp0aGlzLmdldEF0dHJpYkxvY2F0aW9ucyhzKX19KSl9Y29tcGlsZShlKXtpZighdGhpcy52ZXJ0ZXhTaGFkZXIpe28uTG9nZ2VyLnZlcmJvc2UoIlByb3JncmFtTWFuYWdlciIsIkNvbXBpbGluZyBhbmQgY2FjaGluZyBWZXJ0ZXggc2hhZGVyIGZvciB0aGUgZmlyc3QgdGltZSIpO2NvbnN0IGU9KDAsIHMuZ2V0VmVydGV4U2hhZGVyU291cmNlKSh0aGlzLmdsQ29udGV4dC52ZXJzaW9uKTt0aGlzLnZlcnRleFNoYWRlcj10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuVkVSVEVYX1NIQURFUik7fXIuZW52LmRlYnVnJiZvLkxvZ2dlci52ZXJib3NlKCJQcm9yZ3JhbU1hbmFnZXIiLGBGcmFnU2hhZGVyOlxuJHtlfVxuYCk7Y29uc3QgdD10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuRlJBR01FTlRfU0hBREVSKSxuPXRoaXMuZ2xDb250ZXh0LmNyZWF0ZVByb2dyYW0odGhpcy52ZXJ0ZXhTaGFkZXIsdCk7cmV0dXJuIHRoaXMuZ2xDb250ZXh0LmRlbGV0ZVNoYWRlcih0KSxufWJpbmRPdXRwdXQoZSl7Y29uc3QgdD1lLndpZHRoLG49ZS5oZWlnaHQ7by5Mb2dnZXIudmVyYm9zZSgiUHJvcmdyYW1NYW5hZ2VyIixgQmluZGluZyBvdXRwdXQgdGV4dHVyZSB0byBGcmFtZWJ1ZmZlcjogdy9oPSR7dH0vJHtufSwgc2hhcGU9JHtlLnNoYXBlfSwgdHlwZT0ke2UudGVuc29yLnR5cGV9YCksdGhpcy5nbENvbnRleHQuYXR0YWNoRnJhbWVidWZmZXIoZS50ZXh0dXJlLHQsbik7fWJpbmRBdHRyaWJ1dGVzKGUpe2NvbnN0IHQ9ZS5wb3NpdGlvbixuPWUudGV4dHVyZUNvb3JkO3RoaXMuZ2xDb250ZXh0LnNldFZlcnRleEF0dHJpYnV0ZXModCxuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZD0hMDt9YmluZFVuaWZvcm1zKGUsdCxuKXt2YXIgcjtjb25zdCBvPXRoaXMuZ2xDb250ZXh0LmdsO2xldCBpPTA7Zm9yKGNvbnN0e25hbWU6cyx0eXBlOmEsbG9jYXRpb246dSxhcnJheUxlbmd0aDpsfW9mIGUpe2NvbnN0IGU9bnVsbD09PShyPXQuZmluZCgoZT0+ZS5uYW1lPT09cykpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5kYXRhO2lmKCJzYW1wbGVyMkQiIT09YSYmIWUpdGhyb3cgbmV3IEVycm9yKGB2YXJpYWJsZSAnJHtzfScgZG9lcyBub3QgaGF2ZSBkYXRhIGRlZmluZWQgaW4gcHJvZ3JhbSBpbmZvYCk7c3dpdGNoKGEpe2Nhc2Uic2FtcGxlcjJEIjp0aGlzLmJpbmRUZXh0dXJlKG5baV0sdSxpKSxpKys7YnJlYWs7Y2FzZSJmbG9hdCI6bD9vLnVuaWZvcm0xZnYodSxlKTpvLnVuaWZvcm0xZih1LGUpO2JyZWFrO2Nhc2UiaW50IjpsP28udW5pZm9ybTFpdih1LGUpOm8udW5pZm9ybTFpKHUsZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gbm90IGltcGxlbWVudGVkOiAke2F9YCl9fX1iaW5kVGV4dHVyZShlLHQsbil7dGhpcy5nbENvbnRleHQuYmluZFRleHR1cmVUb1VuaWZvcm0oZS50ZXh0dXJlLG4sdCk7fWdldEF0dHJpYkxvY2F0aW9ucyhlKXtyZXR1cm4ge3Bvc2l0aW9uOnRoaXMuZ2V0QXR0cmliTG9jYXRpb24oZSwicG9zaXRpb24iKSx0ZXh0dXJlQ29vcmQ6dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihlLCJ0ZXh0dXJlQ29vcmQiKX19Z2V0VW5pZm9ybUxvY2F0aW9ucyhlLHQsbil7Y29uc3Qgcj1bXTtpZih0KWZvcihjb25zdCBuIG9mIHQpci5wdXNoKHtuYW1lOm4sdHlwZToic2FtcGxlcjJEIixsb2NhdGlvbjp0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihlLG4pfSk7aWYobilmb3IoY29uc3QgdCBvZiBuKXIucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xvY2F0aW9uOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdC5uYW1lKX0pKTtyZXR1cm4gcn1nZXRVbmlmb3JtTG9jYXRpb24oZSx0KXtjb25zdCBuPXRoaXMuZ2xDb250ZXh0LmdsLmdldFVuaWZvcm1Mb2NhdGlvbihlLHQpO2lmKG51bGw9PT1uKXRocm93IG5ldyBFcnJvcihgVW5pZm9ybSAke3R9IG5vdCBmb3VuZC5gKTtyZXR1cm4gbn1nZXRBdHRyaWJMb2NhdGlvbihlLHQpe3JldHVybiB0aGlzLmdsQ29udGV4dC5nbC5nZXRBdHRyaWJMb2NhdGlvbihlLHQpfX07fSwyMTcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTFNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMTMxNSksbz1uKDU4ODEpLGk9big3ODYwKSxzPW4oNDExMCksYT1uKDI3NTcpLHU9big3NjE4KSxsPW4oNTI0Myk7dC5XZWJHTFNlc3Npb25IYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5iYWNrZW5kPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5sYXlvdXRTdHJhdGVneT1uZXcgdS5QcmVmZXJMb2dpY2FsU3RyYXRlZ3koZS5nbENvbnRleHQubWF4VGV4dHVyZVNpemUpLHRoaXMucHJvZ3JhbU1hbmFnZXI9bmV3IGEuUHJvZ3JhbU1hbmFnZXIodGhpcy5jb250ZXh0LnByb2ZpbGVyLGUuZ2xDb250ZXh0LHRoaXMubGF5b3V0U3RyYXRlZ3kpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IGwuVGV4dHVyZU1hbmFnZXIoZS5nbENvbnRleHQsdGhpcy5sYXlvdXRTdHJhdGVneSx0aGlzLmNvbnRleHQucHJvZmlsZXIse3JldXNlVGV4dHVyZXM6ImZ1bGwiPT09ZS50ZXh0dXJlQ2FjaGVNb2RlfSksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnBhY2s9ZS5wYWNrLHRoaXMucGFjazJ1bnBhY2tNYXA9bmV3IE1hcCx0aGlzLnVucGFjazJwYWNrTWFwPW5ldyBNYXA7fWNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKXtyZXR1cm4gbmV3IGkuV2ViR0xJbmZlcmVuY2VIYW5kbGVyKHRoaXMpfW9uR3JhcGhJbml0aWFsaXplZChlKXtjb25zdCB0PWUuZ2V0VmFsdWVzKCkuZmlsdGVyKChlPT4tMT09PWUuZnJvbSYmZS50ZW5zb3IpKS5tYXAoKGU9PmUudGVuc29yLmRhdGFJZCkpO3RoaXMuaW5pdGlhbGl6ZXJzPW5ldyBTZXQodCk7fWlzSW5pdGlhbGl6ZXIoZSl7cmV0dXJuICEhdGhpcy5pbml0aWFsaXplcnMmJnRoaXMuaW5pdGlhbGl6ZXJzLmhhcyhlKX1hZGRJbml0aWFsaXplcihlKXt0aGlzLmluaXRpYWxpemVycy5hZGQoZSk7fWdldFRleHR1cmVEYXRhKGUsdCl7cmV0dXJuIHQ/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKTp0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5nZXQoZSl9c2V0VGV4dHVyZURhdGEoZSx0LG49ITEpe3IuTG9nZ2VyLnZlcmJvc2UoIldlYkdMU2Vzc2lvbkhhbmRsZXIiLCJTdG9yaW5nIFRleHR1cmUgZGF0YSBpbiBjYWNoZSIpLG4/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpO31kaXNwb3NlKCl7dGhpcy5wcm9ncmFtTWFuYWdlci5kaXNwb3NlKCksdGhpcy50ZXh0dXJlTWFuYWdlci5jbGVhckFjdGl2ZVRleHR1cmVzKCksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2goKGU9PnRoaXMudGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSwhMCkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKGUsITApKSksdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9cmVzb2x2ZShlLHQsbil7Y29uc3Qgcj0oMCwgby5yZXNvbHZlT3BlcmF0b3IpKGUsdCxzLldFQkdMX09QX1JFU09MVkVfUlVMRVMpO3JldHVybiB7aW1wbDpyLm9wSW1wbCxjb250ZXh0OnIub3BJbml0P3Iub3BJbml0KGUsbik6ZX19fTt9LDk2MjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlVpbnQ4RGF0YUVuY29kZXI9dC5SR0JBRmxvYXREYXRhRW5jb2Rlcj10LlJlZEZsb2F0MzJEYXRhRW5jb2Rlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuUmVkRmxvYXQzMkRhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZigxPT09dCl0aGlzLmludGVybmFsRm9ybWF0PWUuUjMyRix0aGlzLmZvcm1hdD1lLlJFRCx0aGlzLnRleHR1cmVUeXBlPWUuRkxPQVQsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQTMyRix0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLkZMT0FULHRoaXMuY2hhbm5lbFNpemU9dDt9fWVuY29kZShlLHQpe2xldCBuLG87cmV0dXJuIGUuY29uc3RydWN0b3IhPT1GbG9hdDMyQXJyYXkmJihyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiZGF0YSB3YXMgbm90IG9mIHR5cGUgRmxvYXQzMjsgY3JlYXRpbmcgbmV3IEZsb2F0MzJBcnJheSIpLG89bmV3IEZsb2F0MzJBcnJheShlKSksdCp0aGlzLmNoYW5uZWxTaXplPmUubGVuZ3RoPyhyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiU291cmNlIGRhdGEgdG9vIHNtYWxsLiBBbGxvY2F0aW5nIGxhcmdlciBhcnJheSIpLG89ZSxuPXRoaXMuYWxsb2NhdGUodCp0aGlzLmNoYW5uZWxTaXplKSxvLmZvckVhY2goKChlLHQpPT5uW3RdPWUpKSk6KG89ZSxuPW8pLG59YWxsb2NhdGUoZSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoNCplKX1kZWNvZGUoZSx0KXtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemU/ZS5maWx0ZXIoKChlLHQpPT50JTQ9PTApKS5zdWJhcnJheSgwLHQpOmUuc3ViYXJyYXkoMCx0KX19LHQuUkdCQUZsb2F0RGF0YUVuY29kZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PTEsbil7aWYoMSE9PXQmJjQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy5jaGFubmVsU2l6ZT10LHRoaXMudGV4dHVyZVR5cGU9bnx8ZS5GTE9BVDt9ZW5jb2RlKGUsdCl7bGV0IG49ZTtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemUmJihyLkxvZ2dlci52ZXJib3NlKCJFbmNvZGVyIiwiRXhwbG9kaW5nIGludG8gYSBsYXJnZXIgYXJyYXkiKSxuPXRoaXMuYWxsb2NhdGUodCksZS5mb3JFYWNoKCgoZSx0KT0+bls0KnRdPWUpKSksbn1hbGxvY2F0ZShlKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheSg0KmUpfWRlY29kZShlLHQpe3JldHVybiAxPT09dGhpcy5jaGFubmVsU2l6ZT9lLmZpbHRlcigoKGUsdCk9PnQlND09MCkpLnN1YmFycmF5KDAsdCk6ZS5zdWJhcnJheSgwLHQpfX0sdC5VaW50OERhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZih0aGlzLmNoYW5uZWxTaXplPTQsMT09PXQpdGhpcy5pbnRlcm5hbEZvcm1hdD1lLkFMUEhBLHRoaXMuZm9ybWF0PWUuQUxQSEEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O319ZW5jb2RlKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfWFsbG9jYXRlKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKnRoaXMuY2hhbm5lbFNpemUpfWRlY29kZShlLHQpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlLnN1YmFycmF5KDAsdCk7dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFycmF5IHR5cGU6ICR7ZS5jb25zdHJ1Y3Rvcn1gKX19O30sNzYxODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0QmF0Y2hEaW09dC5zaXplVG9TcXVhcmlzaFNoYXBlPXQuZ2V0Um93c0NvbHM9dC5zaXplRnJvbVNoYXBlPXQuaXNJbnQ9dC5wYXJzZUF4aXNQYXJhbT10LnNxdWVlemVTaGFwZT10LlByZWZlckxvZ2ljYWxTdHJhdGVneT10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big3MjczKTtmdW5jdGlvbiBpKGUsdCl7Y29uc3Qgbj1bXSxyPVtdLG89bnVsbCE9dCYmQXJyYXkuaXNBcnJheSh0KSYmMD09PXQubGVuZ3RoLGk9bnVsbD09dHx8bz9udWxsOnModCxlKS5zb3J0KCk7bGV0IGE9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7aWYobnVsbCE9aSl7aWYoaVthXT09PXQmJjEhPT1lW3RdKXRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc3F1ZWV6ZSBheGlzICR7dH0gc2luY2UgaXRzIGRpbSAnJHtlW3RdfScgaXMgbm90IDFgKTsobnVsbD09aVthXXx8aVthXT50KSYmMT09PWVbdF0mJihuLnB1c2goZVt0XSksci5wdXNoKHQpKSxpW2FdPD10JiZhKys7fTEhPT1lW3RdJiYobi5wdXNoKGVbdF0pLHIucHVzaCh0KSk7fXJldHVybiB7bmV3U2hhcGU6bixrZXB0RGltczpyfX1mdW5jdGlvbiBzKGUsdCl7Y29uc3Qgbj10Lmxlbmd0aDtyZXR1cm4gZT1udWxsPT1lP3QubWFwKCgoZSx0KT0+dCkpOltdLmNvbmNhdChlKSwoMCwgby5hc3NlcnQpKGUuZXZlcnkoKGU9PmU+PS1uJiZlPG4pKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbiByYW5nZSBbLSR7bn0sICR7bn0pIGJ1dCBnb3QgYXhpcyAke2V9YCkpLCgwLCBvLmFzc2VydCkoZS5ldmVyeShhKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbnRlZ2VycyBidXQgZ290IGF4aXMgJHtlfWApKSxlLm1hcCgoZT0+ZTwwP24rZTplKSl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSUxPT0wfWZ1bmN0aW9uIHUoZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiAxO2xldCB0PWVbMF07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspdCo9ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBsKGUpe2NvbnN0IHQ9TWF0aC5jZWlsKE1hdGguc3FydChlKSk7cmV0dXJuIFt0LE1hdGguY2VpbChlL3QpXX10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFsxLDFdO2NvbnN0IG49dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbz10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG8+bnx8aT5uKSlyZXR1cm4gW28saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWNvbnN0IG89ZS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtsZXQgaT1NYXRoLmZsb29yKE1hdGguc3FydChvKSk7Zm9yKDtpPG4mJmk8byYmbyVpIT0wO2krKyk7aWYoaT49bnx8byVpIT0wKXRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGRpbWVuc2lvbnMgYXJlIG91dHNpZGUgdGhpcyBHUFUncyBib3VuZGFyaWVzOiAke2V9YCk7cmV0dXJuIFtpLG8vaV19fSx0LlByZWZlckxvZ2ljYWxTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtjb25zdCBuPXRoaXMuY29tcHV0ZVRleHR1cmUoZSx0KTtyZXR1cm4gdCYmdC5pc1BhY2tlZCYmKG5bMF0vPTIsblsxXS89MiksdCYmdC5yZXZlcnNlV0g/W25bMV0sblswXV06bn1jb21wdXRlVGV4dHVyZShlLHQpe2NvbnN0IG49dCYmdC5pc1BhY2tlZDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG4/WzIsMl06WzEsMV07bGV0IG89dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbj10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG4+b3x8aT5vKSlyZXR1cm4gW24saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWxldCBzPWUuc2xpY2UoMCk7aWYobiYmKG8qPTIscz1zLm1hcCgoKGUsdCk9PnQ+PXMubGVuZ3RoLTI/c1t0XSUyPT0wP3NbdF06c1t0XSsxOnNbdF0pKSwxPT09cy5sZW5ndGgmJihzPVsyLHNbMF1dKSksMiE9PXMubGVuZ3RoKXtjb25zdCBlPWkocyk7cz1lLm5ld1NoYXBlO31jb25zdCBhPXUocyk7cmV0dXJuIHMubGVuZ3RoPD0xJiZhPD1vP1sxLGFdOjI9PT1zLmxlbmd0aCYmc1swXTw9byYmc1sxXTw9bz9zOjM9PT1zLmxlbmd0aCYmc1swXSpzWzFdPD1vJiZzWzJdPD1vP1tzWzBdKnNbMV0sc1syXV06Mz09PXMubGVuZ3RoJiZzWzBdPD1vJiZzWzFdKnNbMl08PW8/W3NbMF0sc1sxXSpzWzJdXTo0PT09cy5sZW5ndGgmJnNbMF0qc1sxXSpzWzJdPD1vJiZzWzNdPD1vP1tzWzBdKnNbMV0qc1syXSxzWzNdXTo0PT09cy5sZW5ndGgmJnNbMF08PW8mJnNbMV0qc1syXSpzWzNdPD1vP1tzWzBdLHNbMV0qc1syXSpzWzNdXTpuP2woYS80KS5tYXAoKGU9PjIqZSkpOmwoYSl9fSx0LnNxdWVlemVTaGFwZT1pLHQucGFyc2VBeGlzUGFyYW09cyx0LmlzSW50PWEsdC5zaXplRnJvbVNoYXBlPXUsdC5nZXRSb3dzQ29scz1mdW5jdGlvbihlKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgRXJyb3IoIkNhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4iKTtyZXR1cm4gW2UubGVuZ3RoPjE/ZVtlLmxlbmd0aC0yXToxLGVbZS5sZW5ndGgtMV1dfSx0LnNpemVUb1NxdWFyaXNoU2hhcGU9bCx0LmdldEJhdGNoRGltPWZ1bmN0aW9uKGUsdD0yKXtyZXR1cm4gdShlLnNsaWNlKDAsZS5sZW5ndGgtdCkpfTt9LDMzMTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9dC5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQ9dC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpO3QuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZT0oZSxuLHIpPT57Y29uc3QgaT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZHx8cj09PW8uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZD8xOjQscz1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsYT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZFJldmVyc2VkfHxyPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsdT1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uP24ubGVuZ3RoLTE6dm9pZCAwLGw9cj09PW8uVGV4dHVyZVR5cGUucGFja2VkTGFzdERpbWVuc2lvbj9uLm1hcCgoKGUsdCk9PnQ9PT1uLmxlbmd0aC0xPzQqZTplKSk6dm9pZCAwO3JldHVybiAoMCwgdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKShlLG4saSxsLHtpc1BhY2tlZDpzLHJldmVyc2VXSDphLGJyZWFrQXhpczp1fSl9LHQuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0PShlLG4scik9Pntjb25zdCBvPSgwLCB0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tVGV4dHVyZVR5cGUpKGUsbixyKTtyZXR1cm4gW28ud2lkdGgsby5oZWlnaHRdfSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9KGUsdCxuPTEsbyxpKT0+e2NvbnN0IHM9ISghaXx8IWkuaXNQYWNrZWQpLFthLHVdPWUuY29tcHV0ZVRleHR1cmVXSChzJiZvfHx0LGkpLGw9dC5sZW5ndGg7bGV0IGM9dC5zbGljZSgwKTtpZigwPT09bCYmKGM9WzFdKSwxPT09bilvPXQ7ZWxzZSBpZihzKXtpZig0IT09bil0aHJvdyBuZXcgRXJyb3IoImEgcGFja2VkIHRleHR1cmUgbXVzdCBiZSA0LWNoYW5uZWwiKTtvPXQsbD4wJiYoY1tsLTFdPU1hdGguY2VpbChjW2wtMV0vMikpLGw+MSYmKGNbbC0yXT1NYXRoLmNlaWwoY1tsLTJdLzIpKTt9ZWxzZSBpZighbyl0aHJvdyBuZXcgRXJyb3IoIlVucGFja2VkIHNoYXBlIGlzIG5lZWRlZCB3aGVuIHVzaW5nIGNoYW5uZWxzID4gMSIpO3JldHVybiB7d2lkdGg6YSxoZWlnaHQ6dSxjaGFubmVsczpuLGlzUGFja2VkOnMsc2hhcGU6YyxzdHJpZGVzOnIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGMpLHVucGFja2VkU2hhcGU6byxyZXZlcnNlZFdIOmkmJmkucmV2ZXJzZVdIfX07fSw1MjQzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZXh0dXJlTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuVGV4dHVyZU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLmxheW91dFN0cmF0ZWd5PXQsdGhpcy5wcm9maWxlcj1uLHRoaXMuY29uZmlnPXIsdGhpcy5wZW5kaW5nUmVhZD1uZXcgTWFwLHIucmV1c2VUZXh0dXJlcyYmKHRoaXMuaW5Vc2VUZXh0dXJlcz1uZXcgTWFwLHRoaXMuaWRsZVRleHR1cmVzPW5ldyBNYXAsdGhpcy50ZXh0dXJlTG9va3VwPW5ldyBNYXApO31jcmVhdGVUZXh0dXJlRnJvbUxheW91dChlLHQsbixvKXtjb25zdCBpPXRoaXMudG9FbmNvZGVyVHlwZShlKSxzPXRoaXMuZ2xDb250ZXh0LmdldEVuY29kZXIoaSx0LmNoYW5uZWxzfHwxLG8pO2lmKHQuaXNQYWNrZWQmJjE9PT1vKXRocm93IG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIik7Y29uc3QgYT10LndpZHRoLHU9dC5oZWlnaHQ7bGV0IGwsYztpZih0aGlzLmNvbmZpZy5yZXVzZVRleHR1cmVzKXtsPWAke2F9eCR7dX1fJHtzLmZvcm1hdH1fJHtzLmludGVybmFsRm9ybWF0fV8ke3MudGV4dHVyZVR5cGV9YCxjPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobCksY3x8KGM9W10sdGhpcy5pblVzZVRleHR1cmVzLnNldChsLGMpKTtjb25zdCB0PXRoaXMuaWRsZVRleHR1cmVzLmdldChsKTtpZih0JiZ0Lmxlbmd0aD4wKXtjb25zdCByPXQucG9wKCk7cmV0dXJuIGMucHVzaChyKSwxPT09byYmdGhpcy5nbENvbnRleHQudXBkYXRlVGV4dHVyZShyLGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKSxyfX1yLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTWFuYWdlciIsYENyZWF0aW5nIG5ldyB0ZXh0dXJlIG9mIHNpemUgJHt0LndpZHRofXgke3QuaGVpZ2h0fWApO2NvbnN0IHA9dGhpcy5nbENvbnRleHQuYWxsb2NhdGVUZXh0dXJlKGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKTtyZXR1cm4gdGhpcy5jb25maWcucmV1c2VUZXh0dXJlcyYmKGMucHVzaChwKSx0aGlzLnRleHR1cmVMb29rdXAuc2V0KHAsbCkpLHB9cmVhZFRleHR1cmUoZSx0LG4pe3JldHVybiBufHwobj0xKSx0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiVGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUiLCgoKT0+e2NvbnN0IHI9ZS5zaGFwZS5yZWR1Y2UoKChlLHQpPT5lKnQpKSpuLG89dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUoZS50ZXh0dXJlLGUud2lkdGgsZS5oZWlnaHQscix0aGlzLnRvRW5jb2RlclR5cGUodCksbik7cmV0dXJuIHRoaXMudG9UZW5zb3JEYXRhKHQsbyl9KSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlLHQsbil7Y29uc3Qgcj1lLnRlbnNvci5kYXRhSWQ7aWYobnx8KG49MSksdGhpcy5wZW5kaW5nUmVhZC5oYXMocikpe2NvbnN0IGU9dGhpcy5wZW5kaW5nUmVhZC5nZXQocik7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT5udWxsPT1lP3ZvaWQgMDplLnB1c2godCkpKX1yZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMiLChhc3luYygpPT57dGhpcy5wZW5kaW5nUmVhZC5zZXQocixbXSk7Y29uc3Qgbz1lLnNoYXBlLnJlZHVjZSgoKGUsdCk9PmUqdCkpKm47YXdhaXQgdGhpcy5nbENvbnRleHQuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCxvLHRoaXMudG9FbmNvZGVyVHlwZSh0KSxuKSxzPXRoaXMudG9UZW5zb3JEYXRhKHQsaSksYT10aGlzLnBlbmRpbmdSZWFkLmdldChyKTtyZXR1cm4gdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUociksbnVsbD09YXx8YS5mb3JFYWNoKChlPT5lKHMpKSksc30pKX1yZWFkVWludDhUZXh0dXJlQXNGbG9hdChlKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0IiwoKCk9Pntjb25zdCB0PWUuc2hhcGUucmVkdWNlKCgoZSx0KT0+ZSp0KSksbj10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCw0KnQsImJ5dGUiLDQpO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KG4uYnVmZmVyLG4uYnl0ZU9mZnNldCx0KX0pKX1yZWxlYXNlVGV4dHVyZShlLHQpe2xldCBuO2lmKHRoaXMuY29uZmlnLnJldXNlVGV4dHVyZXMmJihuPXRoaXMudGV4dHVyZUxvb2t1cC5nZXQoZS50ZXh0dXJlKSxuKSl7dCYmdGhpcy50ZXh0dXJlTG9va3VwLmRlbGV0ZShuKTtjb25zdCByPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobik7aWYocil7Y29uc3QgdD1yLmluZGV4T2YoZS50ZXh0dXJlKTtpZigtMSE9PXQpe3Iuc3BsaWNlKHQsMSk7bGV0IG89dGhpcy5pZGxlVGV4dHVyZXMuZ2V0KG4pO298fChvPVtdLHRoaXMuaWRsZVRleHR1cmVzLnNldChuLG8pKSxvLnB1c2goZS50ZXh0dXJlKTt9fX1uJiYhdHx8KHIuTG9nZ2VyLnZlcmJvc2UoIlRleHR1cmVNYW5hZ2VyIixgRGVsZXRpbmcgdGV4dHVyZSBvZiBzaXplICR7ZS53aWR0aH14JHtlLmhlaWdodH1gKSx0aGlzLmdsQ29udGV4dC5kZWxldGVUZXh0dXJlKGUudGV4dHVyZSkpO310b1RlbnNvckRhdGEoZSx0KXtzd2l0Y2goZSl7Y2FzZSJpbnQxNiI6cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5P3Q6SW50MTZBcnJheS5mcm9tKHQpO2Nhc2UiaW50MzIiOnJldHVybiB0IGluc3RhbmNlb2YgSW50MzJBcnJheT90OkludDMyQXJyYXkuZnJvbSh0KTtjYXNlImludDgiOnJldHVybiB0IGluc3RhbmNlb2YgSW50OEFycmF5P3Q6SW50OEFycmF5LmZyb20odCk7Y2FzZSJ1aW50MTYiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDE2QXJyYXk/dDpVaW50MTZBcnJheS5mcm9tKHQpO2Nhc2UidWludDMyIjpyZXR1cm4gdCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Q6VWludDMyQXJyYXkuZnJvbSh0KTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDhBcnJheT90OlVpbnQ4QXJyYXkuZnJvbSh0KTtjYXNlImZsb2F0MzIiOnJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6RmxvYXQzMkFycmF5LmZyb20odCk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gdCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT90OkZsb2F0NjRBcnJheS5mcm9tKHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBUZW5zb3JEYXRhIHR5cGUgJHtlfSBpcyBub3Qgc3VwcG9ydGVkYCl9fXRvVGV4dHVyZURhdGEoZSx0KXtpZih0KXJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6bmV3IEZsb2F0MzJBcnJheSh0KX10b0VuY29kZXJUeXBlKGUpe3JldHVybiAiZmxvYXQifWNsZWFyQWN0aXZlVGV4dHVyZXMoKXt0aGlzLmdsQ29udGV4dC5jbGVhckFjdGl2ZVRleHR1cmVzKCk7fX07fSw1NjM5OihlLHQpPT57dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGV4dHVyZVR5cGU9dm9pZCAwLChuPXQuVGV4dHVyZVR5cGV8fCh0LlRleHR1cmVUeXBlPXt9KSlbbi51bnBhY2tlZD0wXT0idW5wYWNrZWQiLG5bbi51bnBhY2tlZFJldmVyc2VkPTFdPSJ1bnBhY2tlZFJldmVyc2VkIixuW24ucGFja2VkPTJdPSJwYWNrZWQiLG5bbi5kb3dubG9hZFVpbnQ4QXNGbG9hdD0zXT0iZG93bmxvYWRVaW50OEFzRmxvYXQiLG5bbi5wYWNrZWRMYXN0RGltZW5zaW9uPTRdPSJwYWNrZWRMYXN0RGltZW5zaW9uIjt9LDQzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0R2xDaGFubmVscz10LmdldENvb3Jkc0RhdGFUeXBlPXQuZ2V0U3F1ZWV6ZWRQYXJhbXM9dC5zcXVlZXplSW5wdXRTaGFwZT10LmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZUF0T3V0Q29vcmRzPXQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPXQucmVwZWF0ZWRUcnk9dC5nZXRQYWNrZWRTaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3QuZ2V0UGFja2VkU2hhcGU9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmxlbmd0aDtyZXR1cm4gZS5zbGljZSgwLHQtMSkuY29uY2F0KGVbdC0xXS80KX0sdC5yZXBlYXRlZFRyeT1hc3luYyBmdW5jdGlvbihlLHQ9ZT0+MCxuKXtyZXR1cm4gbmV3IFByb21pc2UoKChyLG8pPT57bGV0IGk9MDtjb25zdCBzPSgpPT57aWYoZSgpKXJldHVybiB2b2lkIHIoKTtpKys7Y29uc3QgYT10KGkpO251bGwhPW4mJmk+PW4/bygpOnNldFRpbWVvdXQocyxhKTt9O3MoKTt9KSl9LHQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPWZ1bmN0aW9uKGUpe3JldHVybiAoMCwgci5hc3NlcnQpKHZvaWQgMCE9PWUmJjAhPT1lLmxlbmd0aCwoKCk9PiJlbXB0eSBzdHJpbmcgZm91bmQgZm9yIHNhbXBsZXIgbmFtZSIpKSwiZ2V0IitlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9LHQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHM9ZnVuY3Rpb24oZSl7cmV0dXJuICgwLCByLmFzc2VydCkodm9pZCAwIT09ZSYmMCE9PWUubGVuZ3RoLCgoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIikpLCJnZXQiK2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSsiQXRPdXRDb29yZHMifSx0LnNxdWVlemVJbnB1dFNoYXBlPWZ1bmN0aW9uKGUsdCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIG49dCxufSx0LmdldFNxdWVlemVkUGFyYW1zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKCh0PT5lW3RdKSkuam9pbigiLCAiKX0sdC5nZXRDb29yZHNEYXRhVHlwZT1mdW5jdGlvbihlKXtpZihlPD0xKXJldHVybiAiaW50IjtpZigyPT09ZSlyZXR1cm4gIml2ZWMyIjtpZigzPT09ZSlyZXR1cm4gIml2ZWMzIjtpZig0PT09ZSlyZXR1cm4gIml2ZWM0IjtpZig1PT09ZSlyZXR1cm4gIml2ZWM1IjtpZig2PT09ZSlyZXR1cm4gIml2ZWM2Ijt0aHJvdyBFcnJvcihgR1BVIGZvciByYW5rICR7ZX0gaXMgbm90IHlldCBzdXBwb3J0ZWRgKX0sdC5nZXRHbENoYW5uZWxzPWZ1bmN0aW9uKGU9Nil7cmV0dXJuIFsieCIsInkiLCJ6IiwidyIsInUiLCJ2Il0uc2xpY2UoMCxlKX07fSwzMzg5OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVOZXdXZWJHTENvbnRleHQ9dC5jcmVhdGVXZWJHTENvbnRleHQ9dm9pZCAwO2NvbnN0IHI9bigxMzE1KSxvPW4oMzUyNCksaT17fTtmdW5jdGlvbiBzKGUsdCl7bGV0IG47Y29uc3QgaT17YWxwaGE6ITEsZGVwdGg6ITEsYW50aWFsaWFzOiExLHN0ZW5jaWw6ITEscHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLHByZW11bHRpcGxpZWRBbHBoYTohMSxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExfTtpZigoIXR8fCJ3ZWJnbDIiPT09dCkmJihuPWUuZ2V0Q29udGV4dCgid2ViZ2wyIixpKSxuKSl0cnl7cmV0dXJuIG5ldyBvLldlYkdMQ29udGV4dChuLDIpfWNhdGNoKGUpe3IuTG9nZ2VyLndhcm5pbmcoIkdsQ29udGV4dEZhY3RvcnkiLGBmYWlsZWQgdG8gY3JlYXRlIFdlYkdMQ29udGV4dCB1c2luZyBjb250ZXh0SWQgJ3dlYmdsMicuIEVycm9yOiAke2V9YCk7fWlmKCghdHx8IndlYmdsIj09PXQpJiYobj1lLmdldENvbnRleHQoIndlYmdsIixpKXx8ZS5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiLGkpLG4pKXRyeXtyZXR1cm4gbmV3IG8uV2ViR0xDb250ZXh0KG4sMSl9Y2F0Y2goZSl7ci5Mb2dnZXIud2FybmluZygiR2xDb250ZXh0RmFjdG9yeSIsYGZhaWxlZCB0byBjcmVhdGUgV2ViR0xDb250ZXh0IHVzaW5nIGNvbnRleHRJZCAnd2ViZ2wnIG9yICdleHBlcmltZW50YWwtd2ViZ2wnLiBFcnJvcjogJHtlfWApO310aHJvdyBuZXcgRXJyb3IoIldlYkdMIGlzIG5vdCBzdXBwb3J0ZWQiKX10LmNyZWF0ZVdlYkdMQ29udGV4dD1mdW5jdGlvbiBlKHQpe2xldCBuO2lmKHQmJiJ3ZWJnbDIiIT09dHx8ISgid2ViZ2wyImluIGkpP3QmJiJ3ZWJnbCIhPT10fHwhKCJ3ZWJnbCJpbiBpKXx8KG49aS53ZWJnbCk6bj1pLndlYmdsMiwhbil0cnl7bj1zKGZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBvZmZzY3JlZW4gY2FudmFzOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSl9KCksdCk7fWNhdGNoKGUpe249cyhmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQpdGhyb3cgbmV3IFR5cGVFcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBjYW52YXM6IGRvY3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlfSgpLHQpO310PXR8fDE9PT1uLnZlcnNpb24/IndlYmdsIjoid2ViZ2wyIjtjb25zdCByPW4uZ2w7cmV0dXJuIGlbdF09bixyLmlzQ29udGV4dExvc3QoKT8oZGVsZXRlIGlbdF0sZSh0KSk6KHIuZGlzYWJsZShyLkRFUFRIX1RFU1QpLHIuZGlzYWJsZShyLlNURU5DSUxfVEVTVCksci5kaXNhYmxlKHIuQkxFTkQpLHIuZGlzYWJsZShyLkRJVEhFUiksci5kaXNhYmxlKHIuUE9MWUdPTl9PRkZTRVRfRklMTCksci5kaXNhYmxlKHIuU0FNUExFX0NPVkVSQUdFKSxyLmVuYWJsZShyLlNDSVNTT1JfVEVTVCksci5lbmFibGUoci5DVUxMX0ZBQ0UpLHIuY3VsbEZhY2Uoci5CQUNLKSxuKX0sdC5jcmVhdGVOZXdXZWJHTENvbnRleHQ9czt9LDM1MjQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKTt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7byYmISgiZ2V0ImluIG8/IXQuX19lc01vZHVsZTpvLndyaXRhYmxlfHxvLmNvbmZpZ3VyYWJsZSl8fChvPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbyk7fTpmdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKSxlW3JdPXRbbl07fSksbz10aGlzJiZ0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdHx8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pO306ZnVuY3Rpb24oZSx0KXtlLmRlZmF1bHQ9dDt9KSxpPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbihlKXtpZihlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9e307aWYobnVsbCE9ZSlmb3IodmFyIG4gaW4gZSkiZGVmYXVsdCIhPT1uJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmcih0LGUsbik7cmV0dXJuIG8odCxlKSx0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTENvbnRleHQ9dC5saW5lYXJTZWFyY2hMYXN0VHJ1ZT12b2lkIDA7Y29uc3Qgcz1uKDIyMzUpLGE9aShuKDk2MjIpKSx1PW4oNDMyKTtmdW5jdGlvbiBsKGUpe2xldCB0PTA7Zm9yKDt0PGUubGVuZ3RoJiZlW3RdKCk7Kyt0KTtyZXR1cm4gdC0xfXQubGluZWFyU2VhcmNoTGFzdFRydWU9bCx0LldlYkdMQ29udGV4dD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZnJhbWVCdWZmZXJCb3VuZD0hMSx0aGlzLml0ZW1zVG9Qb2xsPVtdLHRoaXMuZ2w9ZSx0aGlzLnZlcnNpb249dCx0aGlzLmdldEV4dGVuc2lvbnMoKSx0aGlzLnZlcnRleGJ1ZmZlcj10aGlzLmNyZWF0ZVZlcnRleGJ1ZmZlcigpLHRoaXMuZnJhbWVidWZmZXI9dGhpcy5jcmVhdGVGcmFtZWJ1ZmZlcigpLHRoaXMucXVlcnlWaXRhbFBhcmFtZXRlcnMoKTt9YWxsb2NhdGVUZXh0dXJlKGUsdCxuLHIpe2NvbnN0IG89dGhpcy5nbCxpPW8uY3JlYXRlVGV4dHVyZSgpO28uYmluZFRleHR1cmUoby5URVhUVVJFXzJELGkpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01JTl9GSUxURVIsby5ORUFSRVNUKSxvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELG8uVEVYVFVSRV9NQUdfRklMVEVSLG8uTkVBUkVTVCksby50ZXhQYXJhbWV0ZXJpKG8uVEVYVFVSRV8yRCxvLlRFWFRVUkVfV1JBUF9TLG8uQ0xBTVBfVE9fRURHRSksby50ZXhQYXJhbWV0ZXJpKG8uVEVYVFVSRV8yRCxvLlRFWFRVUkVfV1JBUF9ULG8uQ0xBTVBfVE9fRURHRSk7Y29uc3Qgcz1yP24uZW5jb2RlKHIsZSp0KTpudWxsO3JldHVybiBvLnRleEltYWdlMkQoby5URVhUVVJFXzJELDAsbi5pbnRlcm5hbEZvcm1hdCxlLHQsMCxuLmZvcm1hdCxuLnRleHR1cmVUeXBlLHMpLHRoaXMuY2hlY2tFcnJvcigpLGl9dXBkYXRlVGV4dHVyZShlLHQsbixyLG8pe2NvbnN0IGk9dGhpcy5nbDtpLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV8yRCxlKTtjb25zdCBzPXIuZW5jb2RlKG8sdCpuKTtpLnRleFN1YkltYWdlMkQoaS5URVhUVVJFXzJELDAsMCwwLHQsbixyLmZvcm1hdCxyLnRleHR1cmVUeXBlLHMpLHRoaXMuY2hlY2tFcnJvcigpO31hdHRhY2hGcmFtZWJ1ZmZlcihlLHQsbil7Y29uc3Qgcj10aGlzLmdsO3IuYmluZFRleHR1cmUoci5URVhUVVJFXzJELGUpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsdGhpcy5mcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELGUsMCksdGhpcy5jaGVja0Vycm9yKCksci52aWV3cG9ydCgwLDAsdCxuKSxyLnNjaXNzb3IoMCwwLHQsbik7fXJlYWRUZXh0dXJlKGUsdCxuLHIsbyxpKXtjb25zdCBzPXRoaXMuZ2w7aXx8KGk9MSksdGhpcy5mcmFtZUJ1ZmZlckJvdW5kfHx0aGlzLmF0dGFjaEZyYW1lYnVmZmVyKGUsdCxuKTtjb25zdCBhPXRoaXMuZ2V0RW5jb2RlcihvLGkpLHU9YS5hbGxvY2F0ZSh0Km4pO3JldHVybiBzLmJpbmRUZXh0dXJlKHMuVEVYVFVSRV8yRCxlKSxzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHMuRlJBTUVCVUZGRVIscy5DT0xPUl9BVFRBQ0hNRU5UMCxzLlRFWFRVUkVfMkQsZSwwKSxzLnJlYWRQaXhlbHMoMCwwLHQsbixzLlJHQkEsYS50ZXh0dXJlVHlwZSx1KSx0aGlzLmNoZWNrRXJyb3IoKSxhLmRlY29kZSh1LHIpfWlzRnJhbWVidWZmZXJSZWFkeSgpe3JldHVybiAhMH1nZXRBY3RpdmVUZXh0dXJlKCl7Y29uc3QgZT10aGlzLmdsO3JldHVybiAiVEVYVFVSRSIrKGUuZ2V0UGFyYW1ldGVyKHRoaXMuZ2wuQUNUSVZFX1RFWFRVUkUpLWUuVEVYVFVSRTApfWdldFRleHR1cmVCaW5kaW5nKCl7cmV0dXJuIHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKHRoaXMuZ2wuVEVYVFVSRV9CSU5ESU5HXzJEKX1nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKXtyZXR1cm4gdGhpcy5nbC5nZXRQYXJhbWV0ZXIodGhpcy5nbC5GUkFNRUJVRkZFUl9CSU5ESU5HKX1zZXRWZXJ0ZXhBdHRyaWJ1dGVzKGUsdCl7Y29uc3Qgbj10aGlzLmdsO24udmVydGV4QXR0cmliUG9pbnRlcihlLDMsbi5GTE9BVCwhMSwyMCwwKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLC0xIT09dCYmKG4udmVydGV4QXR0cmliUG9pbnRlcih0LDIsbi5GTE9BVCwhMSwyMCwxMiksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KSksdGhpcy5jaGVja0Vycm9yKCk7fWNyZWF0ZVByb2dyYW0oZSx0KXtjb25zdCBuPXRoaXMuZ2wscj1uLmNyZWF0ZVByb2dyYW0oKTtyZXR1cm4gbi5hdHRhY2hTaGFkZXIocixlKSxuLmF0dGFjaFNoYWRlcihyLHQpLG4ubGlua1Byb2dyYW0ocikscn1jb21waWxlU2hhZGVyKGUsdCl7Y29uc3Qgbj10aGlzLmdsLHI9bi5jcmVhdGVTaGFkZXIodCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVTaGFkZXIoKSByZXR1cm5lZCBudWxsIHdpdGggdHlwZSAke3R9YCk7aWYobi5zaGFkZXJTb3VyY2UocixlKSxuLmNvbXBpbGVTaGFkZXIociksITE9PT1uLmdldFNoYWRlclBhcmFtZXRlcihyLG4uQ09NUElMRV9TVEFUVVMpKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbXBpbGUgc2hhZGVyOiAke24uZ2V0U2hhZGVySW5mb0xvZyhyKX1cblNoYWRlciBzb3VyY2U6XG4ke2V9YCk7cmV0dXJuIHJ9ZGVsZXRlU2hhZGVyKGUpe3RoaXMuZ2wuZGVsZXRlU2hhZGVyKGUpO31iaW5kVGV4dHVyZVRvVW5pZm9ybShlLHQsbil7Y29uc3Qgcj10aGlzLmdsO3IuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwK3QpLHRoaXMuY2hlY2tFcnJvcigpLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELGUpLHRoaXMuY2hlY2tFcnJvcigpLHIudW5pZm9ybTFpKG4sdCksdGhpcy5jaGVja0Vycm9yKCk7fWRyYXcoKXt0aGlzLmdsLmRyYXdBcnJheXModGhpcy5nbC5UUklBTkdMRV9TVFJJUCwwLDQpLHRoaXMuY2hlY2tFcnJvcigpO31jaGVja0Vycm9yKCl7aWYocy5lbnYuZGVidWcpe2NvbnN0IGU9dGhpcy5nbCx0PWUuZ2V0RXJyb3IoKTtsZXQgbj0iIjtzd2l0Y2godCl7Y2FzZSBlLk5PX0VSUk9SOnJldHVybjtjYXNlIGUuSU5WQUxJRF9FTlVNOm49IklOVkFMSURfRU5VTSI7YnJlYWs7Y2FzZSBlLklOVkFMSURfVkFMVUU6bj0iSU5WQUxJRF9WQUxVRSI7YnJlYWs7Y2FzZSBlLklOVkFMSURfT1BFUkFUSU9OOm49IklOVkFMSURfT1BFUkFUSU9OIjticmVhaztjYXNlIGUuSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT046bj0iSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04iO2JyZWFrO2Nhc2UgZS5PVVRfT0ZfTUVNT1JZOm49Ik9VVF9PRl9NRU1PUlkiO2JyZWFrO2Nhc2UgZS5DT05URVhUX0xPU1RfV0VCR0w6bj0iQ09OVEVYVF9MT1NUX1dFQkdMIjticmVhaztkZWZhdWx0Om49YFVua25vd24gV2ViR0wgRXJyb3I6ICR7dC50b1N0cmluZygxNil9YDt9dGhyb3cgbmV3IEVycm9yKG4pfX1kZWxldGVUZXh0dXJlKGUpe3RoaXMuZ2wuZGVsZXRlVGV4dHVyZShlKTt9ZGVsZXRlUHJvZ3JhbShlKXt0aGlzLmdsLmRlbGV0ZVByb2dyYW0oZSk7fWdldEVuY29kZXIoZSx0LG49MCl7aWYoMj09PXRoaXMudmVyc2lvbilyZXR1cm4gbmV3IGEuUmVkRmxvYXQzMkRhdGFFbmNvZGVyKHRoaXMuZ2wsdCk7c3dpdGNoKGUpe2Nhc2UiZmxvYXQiOnJldHVybiAxPT09bnx8dGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQ/bmV3IGEuUkdCQUZsb2F0RGF0YUVuY29kZXIodGhpcy5nbCx0KTpuZXcgYS5SR0JBRmxvYXREYXRhRW5jb2Rlcih0aGlzLmdsLHQsdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTKTtjYXNlImludCI6dGhyb3cgbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTtjYXNlImJ5dGUiOnJldHVybiBuZXcgYS5VaW50OERhdGFFbmNvZGVyKHRoaXMuZ2wsdCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YVR5cGU6ICR7ZX1gKX19Y2xlYXJBY3RpdmVUZXh0dXJlcygpe2NvbnN0IGU9dGhpcy5nbDtmb3IobGV0IHQ9MDt0PHRoaXMubWF4VGV4dHVyZUltYWdlVW5pdHM7Kyt0KWUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwK3QpLGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpO31kaXNwb3NlKCl7aWYodGhpcy5kaXNwb3NlZClyZXR1cm47Y29uc3QgZT10aGlzLmdsO2UuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKSxlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsbnVsbCksZS5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhidWZmZXIpLGUuYmluZEJ1ZmZlcihlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLG51bGwpLGUuZmluaXNoKCksdGhpcy5kaXNwb3NlZD0hMDt9Y3JlYXRlRGVmYXVsdEdlb21ldHJ5KCl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoWy0xLDEsMCwwLDEsLTEsLTEsMCwwLDAsMSwxLDAsMSwxLDEsLTEsMCwxLDBdKX1jcmVhdGVWZXJ0ZXhidWZmZXIoKXtjb25zdCBlPXRoaXMuZ2wsdD1lLmNyZWF0ZUJ1ZmZlcigpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiY3JlYXRlQnVmZmVyKCkgcmV0dXJuZWQgbnVsbCIpO2NvbnN0IG49dGhpcy5jcmVhdGVEZWZhdWx0R2VvbWV0cnkoKTtyZXR1cm4gZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHQpLGUuYnVmZmVyRGF0YShlLkFSUkFZX0JVRkZFUixuLGUuU1RBVElDX0RSQVcpLHRoaXMuY2hlY2tFcnJvcigpLHR9Y3JlYXRlRnJhbWVidWZmZXIoKXtjb25zdCBlPXRoaXMuZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZUZyYW1lYnVmZmVyIHJldHVybmVkIG51bGwiKTtyZXR1cm4gZX1xdWVyeVZpdGFsUGFyYW1ldGVycygpe2NvbnN0IGU9dGhpcy5nbDtpZih0aGlzLmlzRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXI9dGhpcy5jaGVja0Zsb2F0VGV4dHVyZUF0dGFjaGFibGVUb0ZyYW1lQnVmZmVyKCksdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQ9dGhpcy5jaGVja1JlbmRlckZsb2F0MzIoKSx0aGlzLmlzRmxvYXQzMkRvd25sb2FkU3VwcG9ydGVkPXRoaXMuY2hlY2tGbG9hdDMyRG93bmxvYWQoKSwxPT09dGhpcy52ZXJzaW9uJiYhdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uJiYhdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQpdGhyb3cgbmV3IEVycm9yKCJib3RoIGZsb2F0MzIgYW5kIGZsb2F0MTYgVGV4dHVyZVR5cGUgYXJlIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLmlzQmxlbmRTdXBwb3J0ZWQ9IXRoaXMuaXNSZW5kZXJGbG9hdDMyU3VwcG9ydGVkfHx0aGlzLmNoZWNrRmxvYXQzMkJsZW5kKCksdGhpcy5tYXhUZXh0dXJlU2l6ZT1lLmdldFBhcmFtZXRlcihlLk1BWF9URVhUVVJFX1NJWkUpLHRoaXMubWF4VGV4dHVyZUltYWdlVW5pdHM9ZS5nZXRQYXJhbWV0ZXIoZS5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyksdGhpcy52ZXJzaW9uO31nZXRFeHRlbnNpb25zKCl7Mj09PXRoaXMudmVyc2lvbj8odGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksdGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDIiKSk6KHRoaXMudGV4dHVyZUZsb2F0RXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9mbG9hdCIpLHRoaXMudGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpKTt9Y2hlY2tGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcigpe2NvbnN0IGU9dGhpcy5nbCx0PWUuY3JlYXRlVGV4dHVyZSgpO2UuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHQpO2NvbnN0IG49Mj09PXRoaXMudmVyc2lvbj9lLlJHQkEzMkY6ZS5SR0JBO2UudGV4SW1hZ2UyRChlLlRFWFRVUkVfMkQsMCxuLDEsMSwwLGUuUkdCQSxlLkZMT0FULG51bGwpO2NvbnN0IHI9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpO2UuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsciksZS5mcmFtZWJ1ZmZlclRleHR1cmUyRChlLkZSQU1FQlVGRkVSLGUuQ09MT1JfQVRUQUNITUVOVDAsZS5URVhUVVJFXzJELHQsMCk7Y29uc3Qgbz1lLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZS5GUkFNRUJVRkZFUik9PT1lLkZSQU1FQlVGRkVSX0NPTVBMRVRFO3JldHVybiBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxudWxsKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuZGVsZXRlVGV4dHVyZSh0KSxlLmRlbGV0ZUZyYW1lYnVmZmVyKHIpLG99Y2hlY2tSZW5kZXJGbG9hdDMyKCl7aWYoMj09PXRoaXMudmVyc2lvbil7aWYoIXRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbilyZXR1cm4gITF9ZWxzZSBpZighdGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb24pcmV0dXJuICExO3JldHVybiB0aGlzLmlzRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXJ9Y2hlY2tGbG9hdDMyRG93bmxvYWQoKXtpZigyPT09dGhpcy52ZXJzaW9uKXtpZighdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uKXJldHVybiAhMX1lbHNlIHtpZighdGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb24pcmV0dXJuICExO2lmKCF0aGlzLmdsLmdldEV4dGVuc2lvbigiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpcmV0dXJuICExfXJldHVybiB0aGlzLmlzRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXJ9Y2hlY2tGbG9hdDMyQmxlbmQoKXtjb25zdCBlPXRoaXMuZ2w7bGV0IHQsbixyLG8saTt0cnl7dD1lLmNyZWF0ZVRleHR1cmUoKSxuPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCx0KTtjb25zdCBzPTI9PT10aGlzLnZlcnNpb24/ZS5SR0JBMzJGOmUuUkdCQTtyZXR1cm4gZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLHMsMSwxLDAsZS5SR0JBLGUuRkxPQVQsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixuKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdCwwKSxlLmVuYWJsZShlLkJMRU5EKSxyPWUuY3JlYXRlU2hhZGVyKGUuVkVSVEVYX1NIQURFUiksISFyJiYoZS5zaGFkZXJTb3VyY2Uociwidm9pZCBtYWluKCl7fSIpLGUuY29tcGlsZVNoYWRlcihyKSxvPWUuY3JlYXRlU2hhZGVyKGUuRlJBR01FTlRfU0hBREVSKSwhIW8mJihlLnNoYWRlclNvdXJjZShvLCJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXZlYzQoMC41KTt9IiksZS5jb21waWxlU2hhZGVyKG8pLGk9ZS5jcmVhdGVQcm9ncmFtKCksISFpJiYoZS5hdHRhY2hTaGFkZXIoaSxyKSxlLmF0dGFjaFNoYWRlcihpLG8pLGUubGlua1Byb2dyYW0oaSksZS51c2VQcm9ncmFtKGkpLGUuZHJhd0FycmF5cyhlLlBPSU5UUywwLDEpLGUuZ2V0RXJyb3IoKT09PWUuTk9fRVJST1IpKSl9ZmluYWxseXtlLmRpc2FibGUoZS5CTEVORCksaSYmZS5kZWxldGVQcm9ncmFtKGkpLHImJmUuZGVsZXRlU2hhZGVyKHIpLG8mJmUuZGVsZXRlU2hhZGVyKG8pLG4mJihlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuZGVsZXRlRnJhbWVidWZmZXIobikpLHQmJihlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxudWxsKSxlLmRlbGV0ZVRleHR1cmUodCkpO319YmVnaW5UaW1lcigpe2lmKDI9PT10aGlzLnZlcnNpb24mJnRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXtjb25zdCBlPXRoaXMuZ2wsdD10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbixuPWUuY3JlYXRlUXVlcnkoKTtyZXR1cm4gZS5iZWdpblF1ZXJ5KHQuVElNRV9FTEFQU0VEX0VYVCxuKSxufXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4iKX1lbmRUaW1lcigpe2lmKDIhPT10aGlzLnZlcnNpb258fCF0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3QgZT10aGlzLmdsLHQ9dGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb247ZS5lbmRRdWVyeSh0LlRJTUVfRUxBUFNFRF9FWFQpO319aXNUaW1lclJlc3VsdEF2YWlsYWJsZShlKXtsZXQgdD0hMSxuPSExO2lmKDIhPT10aGlzLnZlcnNpb258fCF0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3Qgcj10aGlzLmdsLG89dGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb247dD1yLmdldFF1ZXJ5UGFyYW1ldGVyKGUsci5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFKSxuPXIuZ2V0UGFyYW1ldGVyKG8uR1BVX0RJU0pPSU5UX0VYVCk7fXJldHVybiB0JiYhbn1nZXRUaW1lclJlc3VsdChlKXtsZXQgdD0wO2lmKDIhPT10aGlzLnZlcnNpb24pdGhyb3cgbmV3IEVycm9yKCJXZWJHTDEgcHJvZmlsaW5nIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIik7e2NvbnN0IG49dGhpcy5nbDt0PW4uZ2V0UXVlcnlQYXJhbWV0ZXIoZSxuLlFVRVJZX1JFU1VMVCksbi5kZWxldGVRdWVyeShlKTt9cmV0dXJuIHQvMWU2fWFzeW5jIHdhaXRGb3JRdWVyeUFuZEdldFRpbWUoZSl7cmV0dXJuIGF3YWl0KDAsIHUucmVwZWF0ZWRUcnkpKCgoKT0+dGhpcy5pc1RpbWVyUmVzdWx0QXZhaWxhYmxlKGUpKSksdGhpcy5nZXRUaW1lclJlc3VsdChlKX1hc3luYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKXtjb25zdCBlPXRoaXMuY3JlYXRlRmVuY2UodGhpcy5nbCk7cmV0dXJuIHRoaXMucG9sbEZlbmNlKGUpfWNyZWF0ZUZlbmNlKGUpe2xldCB0O2NvbnN0IG49ZSxyPW4uZmVuY2VTeW5jKG4uU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7cmV0dXJuIGUuZmx1c2goKSx0PW51bGw9PT1yPygpPT4hMDooKT0+e2NvbnN0IGU9bi5jbGllbnRXYWl0U3luYyhyLDAsMCk7cmV0dXJuIGU9PT1uLkFMUkVBRFlfU0lHTkFMRUR8fGU9PT1uLkNPTkRJVElPTl9TQVRJU0ZJRUR9LHtxdWVyeTpyLGlzRmVuY2VQYXNzZWQ6dH19YXN5bmMgcG9sbEZlbmNlKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodD0+e3RoaXMuYWRkSXRlbVRvUG9sbCgoKCk9PmUuaXNGZW5jZVBhc3NlZCgpKSwoKCk9PnQoKSkpO30pKX1wb2xsSXRlbXMoKXtjb25zdCBlPWwodGhpcy5pdGVtc1RvUG9sbC5tYXAoKGU9PmUuaXNEb25lRm4pKSk7Zm9yKGxldCB0PTA7dDw9ZTsrK3Qpe2NvbnN0e3Jlc29sdmVGbjplfT10aGlzLml0ZW1zVG9Qb2xsW3RdO2UoKTt9dGhpcy5pdGVtc1RvUG9sbD10aGlzLml0ZW1zVG9Qb2xsLnNsaWNlKGUrMSk7fWFzeW5jIGFkZEl0ZW1Ub1BvbGwoZSx0KXt0aGlzLml0ZW1zVG9Qb2xsLnB1c2goe2lzRG9uZUZuOmUscmVzb2x2ZUZuOnR9KSx0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aD4xfHxhd2FpdCgwLCB1LnJlcGVhdGVkVHJ5KSgoKCk9Pih0aGlzLnBvbGxJdGVtcygpLDA9PT10aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aCkpKTt9fTt9LDY0OTY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkV4ZWN1dGlvblBsYW49dm9pZCAwO2NvbnN0IHI9bigxMzE1KTtjbGFzcyBve2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5vcD1lLHRoaXMubm9kZT10O319dC5FeGVjdXRpb25QbGFuPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmdyYXBoPWUsdGhpcy5wcm9maWxlcj1uLHRoaXMuaW5pdGlhbGl6ZSh0KTt9aW5pdGlhbGl6ZShlKXt0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiRXhlY3V0aW9uUGxhbi5pbml0aWFsaXplIiwoKCk9Pntjb25zdCB0PXRoaXMuZ3JhcGguZ2V0Tm9kZXMoKTtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlIHNpemUgb2Ygbm9kZXMgYW5kIE9QcyBkbyBub3QgbWF0Y2guIik7dGhpcy5fb3BzPWUubWFwKCgoZSxuKT0+bmV3IG8oZSx0W25dKSkpLHRoaXMucmVzZXQoKSx0aGlzLl9zdGFydGVyPVtdLHRoaXMuX29wcy5mb3JFYWNoKCgoZSx0KT0+e2xldCBuPSEwO2Zvcihjb25zdCB0IG9mIGUubm9kZS5pbnB1dHMpaWYoIXRoaXMuX3ZhbHVlc1t0XSYmLTE9PT10aGlzLmdyYXBoLmdldElucHV0SW5kaWNlcygpLmluZGV4T2YodCkpe249ITE7YnJlYWt9biYmdGhpcy5fc3RhcnRlci5wdXNoKHQpO30pKTt9KSk7fXJlc2V0KCl7dGhpcy5fdmFsdWVzPXRoaXMuZ3JhcGguZ2V0VmFsdWVzKCkubWFwKChlPT5lLnRlbnNvcikpO31hc3luYyBleGVjdXRlKGUsdCl7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJFeGVjdXRpb25QbGFuLmV4ZWN1dGUiLChhc3luYygpPT57dGhpcy5yZXNldCgpO2NvbnN0IG49ZS5jcmVhdGVJbmZlcmVuY2VIYW5kbGVyKCksbz10aGlzLmdyYXBoLmdldElucHV0SW5kaWNlcygpO2lmKHQubGVuZ3RoIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBudW1iZXIgb2YgaW5wdXQgdGVuc29ycyBkb24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mIGlucHV0cyB0byB0aGUgbW9kZWw6IGFjdHVhbDogJHt0Lmxlbmd0aH0gZXhwZWN0ZWQ6ICR7by5sZW5ndGh9YCk7dC5mb3JFYWNoKCgoZSx0KT0+e2NvbnN0IG49b1t0XTt0aGlzLl92YWx1ZXNbbl09ZTt9KSk7Y29uc3QgaT10aGlzLl9zdGFydGVyLnNsaWNlKDApLHM9dGhpcy5ncmFwaC5nZXRWYWx1ZXMoKSxhPXRoaXMuZ3JhcGguZ2V0Tm9kZXMoKTtsZXQgdT0wO2Zvcig7dTxpLmxlbmd0aDspe2NvbnN0IGU9aVt1KytdLHQ9dGhpcy5fb3BzW2VdLG89dC5ub2RlLmlucHV0cy5tYXAoKGU9PnRoaXMuX3ZhbHVlc1tlXSkpO2lmKC0xIT09by5pbmRleE9mKHZvaWQgMCkpdGhyb3cgbmV3IEVycm9yKGB1bnJlc29sdmVkIGlucHV0IGRldGVjdGVkOiBvcDogJHt0Lm5vZGV9YCk7Y29uc3QgbD1vO3IuTG9nZ2VyLnZlcmJvc2UoIkV4ZWNQbGFuIixgUnVuaW5nIG9wOiR7dC5ub2RlLm5hbWV9ICgke2wubWFwKCgoZSxuKT0+YCcke3Qubm9kZS5pbnB1dHNbbl19JzogJHtlLnR5cGV9WyR7ZS5kaW1zLmpvaW4oIiwiKX1dYCkpLmpvaW4oIiwgIil9KWApO2NvbnN0IGM9YXdhaXQgdGhpcy5wcm9maWxlci5ldmVudCgibm9kZSIsdC5ub2RlLm5hbWUsKGFzeW5jKCk9PnQub3AuaW1wbChuLGwsdC5vcC5jb250ZXh0KSkpO2lmKGMubGVuZ3RoIT09dC5ub2RlLm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIHNpemUgb2Ygb3V0cHV0IGRvZXMgbm90IG1hdGNoIG1vZGVsIGRlZmluaXRpb24uIik7Yy5mb3JFYWNoKCgoZSxuKT0+e2NvbnN0IHI9dC5ub2RlLm91dHB1dHNbbl07aWYodGhpcy5fdmFsdWVzW3JdKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IFske3J9XSBhbHJlYWR5IGhhcyB2YWx1ZTogb3A6JHt0Lm5vZGUubmFtZX1gKTt0aGlzLl92YWx1ZXNbcl09ZTt9KSk7Y29uc3QgcD1uZXcgU2V0O2MuZm9yRWFjaCgoKGUsbik9Pntjb25zdCByPXQubm9kZS5vdXRwdXRzW25dO2Zvcihjb25zdCBlIG9mIHNbcl0udG8pe2NvbnN0IHQ9YVtlXTtsZXQgbj0hMDtmb3IoY29uc3QgZSBvZiB0LmlucHV0cylpZighdGhpcy5fdmFsdWVzW2VdKXtuPSExO2JyZWFrfW4mJnAuYWRkKGUpO319KSksaS5wdXNoKC4uLnApO31jb25zdCBsPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5ncmFwaC5nZXRPdXRwdXRJbmRpY2VzKCkubGVuZ3RoO2UrKyl7Y29uc3QgdD10aGlzLmdyYXBoLmdldE91dHB1dEluZGljZXMoKVtlXSxuPXRoaXMuX3ZhbHVlc1t0XTtpZih2b2lkIDA9PT1uKXRocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgb3V0cHV0IFske3R9XSBkb2VzIG5vdCBoYXZlIHZhbHVlYCk7MD09PXQ/YXdhaXQgbi5nZXREYXRhKCk6bi5kYXRhLGwucHVzaChuKTt9cmV0dXJuIHIuTG9nZ2VyLnZlcmJvc2UoIkV4ZWNQbGFuIiwiZGlzcG9zaW5nIG9mIGluZmVyZW5jZUhhbmRsZXIiKSxuLmRpc3Bvc2UoKSxsfSkpfX07fSw0NjYyOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5HcmFwaD12b2lkIDA7Y29uc3Qgcj1uKDY4NzQpLG89big1MTI3KSxpPW4oMjQ0Nikscz1uKDkyNDApLGE9big3MjczKTt2YXIgdT1vLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7dC5HcmFwaD17ZnJvbTooZSx0KT0+bmV3IHAoZSx0KX07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9mcm9tPXZvaWQgMCx0aGlzLl90bz1bXSx0aGlzLnRlbnNvcj12b2lkIDAsdGhpcy50eXBlPXZvaWQgMCxlJiYodGhpcy50eXBlPWEuUHJvdG9VdGlsLnRlbnNvclZhbHVlVHlwZUZyb21Qcm90byhlLnR5cGUudGVuc29yVHlwZSkpO31nZXQgZnJvbSgpe3JldHVybiB0aGlzLl9mcm9tfWdldCB0bygpe3JldHVybiB0aGlzLl90b319Y2xhc3MgY3tjb25zdHJ1Y3RvcihlLHQpe2UgaW5zdGFuY2VvZiBpLm9ubnguTm9kZVByb3RvPyh0aGlzLm5hbWU9ZS5uYW1lLHRoaXMub3BUeXBlPWUub3BUeXBlLHRoaXMuYXR0cmlidXRlcz1uZXcgci5BdHRyaWJ1dGUoZS5hdHRyaWJ1dGUpKTplIGluc3RhbmNlb2YgdS5Ob2RlJiYodGhpcy5uYW1lPW51bGwhPXQ/dDplLm5hbWUoKSx0aGlzLm9wVHlwZT1lLm9wVHlwZSgpLHRoaXMuYXR0cmlidXRlcz1uZXcgci5BdHRyaWJ1dGUoYS5Qcm90b1V0aWwudGVuc29yQXR0cmlidXRlc0Zyb21PUlRGb3JtYXQoZSkpKSx0aGlzLmlucHV0cz1bXSx0aGlzLm91dHB1dHM9W10sdGhpcy5leGVjdXRlTm9kZT0hMDt9fWNsYXNzIHB7Y29uc3RydWN0b3IoZSx0KXtpZighZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJncmFwaCBpcyBlbXB0eSIpO3RoaXMuYnVpbGRHcmFwaChlKSx0aGlzLnRyYW5zZm9ybUdyYXBoKHQpLHRoaXMuY2hlY2tJc0FjeWNsaWMoKTt9Z2V0SW5wdXRJbmRpY2VzKCl7cmV0dXJuIHRoaXMuX2FsbElucHV0SW5kaWNlc31nZXRJbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX2FsbElucHV0TmFtZXN9Z2V0T3V0cHV0SW5kaWNlcygpe3JldHVybiB0aGlzLl9hbGxPdXRwdXRJbmRpY2VzfWdldE91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX2FsbE91dHB1dE5hbWVzfWdldFZhbHVlcygpe3JldHVybiB0aGlzLl9hbGxEYXRhfWdldE5vZGVzKCl7cmV0dXJuIHRoaXMuX25vZGVzfWJ1aWxkR3JhcGgoZSl7aWYoZSBpbnN0YW5jZW9mIGkub25ueC5HcmFwaFByb3RvKXRoaXMuYnVpbGRHcmFwaEZyb21Pbm54Rm9ybWF0KGUpO2Vsc2Uge2lmKCEoZSBpbnN0YW5jZW9mIHUuR3JhcGgpKXRocm93IG5ldyBUeXBlRXJyb3IoIkdyYXBoIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4iKTt0aGlzLmJ1aWxkR3JhcGhGcm9tT3J0Rm9ybWF0KGUpO319YnVpbGRHcmFwaEZyb21Pbm54Rm9ybWF0KGUpe2NvbnN0IHQ9bmV3IE1hcDt0aGlzLl9hbGxEYXRhPVtdLHRoaXMuX2FsbElucHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxJbnB1dE5hbWVzPVtdLHRoaXMuX2FsbE91dHB1dEluZGljZXM9W10sdGhpcy5fYWxsT3V0cHV0TmFtZXM9W10sdGhpcy5fbm9kZXM9W107Y29uc3Qgbj1uZXcgTWFwO2lmKCFlLmlucHV0KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogaW5wdXQiKTtjb25zdCByPVtdO2Zvcihjb25zdCBuIG9mIGUuaW5wdXQpe2lmKHQuaGFzKG4ubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIGlucHV0IG5hbWU6ICR7bi5uYW1lfWApO2NvbnN0IGU9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBsKG4pKS0xO3Quc2V0KG4ubmFtZSxlKSxyLnB1c2gobi5uYW1lKTt9aWYoIWUuaW5pdGlhbGl6ZXIpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBpbml0aWFsaXplciIpO2Zvcihjb25zdCBuIG9mIGUuaW5pdGlhbGl6ZXIpe2xldCBlPXQuZ2V0KG4ubmFtZSk7aWYodm9pZCAwPT09ZSl7Y29uc3Qgcj1uZXcgbDtyLnR5cGU9e3NoYXBlOntkaW1zOmEuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tUHJvdG8obi5kaW1zKX0sdGVuc29yVHlwZTphLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhuLmRhdGFUeXBlKX0sZT10aGlzLl9hbGxEYXRhLnB1c2gociktMSx0LnNldChuLm5hbWUsZSk7fXRoaXMuX2FsbERhdGFbZV0uX2Zyb209LTEsdGhpcy5fYWxsRGF0YVtlXS50ZW5zb3I9cy5UZW5zb3IuZnJvbVByb3RvKG4pO31mb3IobGV0IGU9MDtlPHRoaXMuX2FsbERhdGEubGVuZ3RoO2UrKyl0aGlzLl9hbGxEYXRhW2VdLnRlbnNvcnx8KHRoaXMuX2FsbElucHV0SW5kaWNlcy5wdXNoKGUpLHRoaXMuX2FsbElucHV0TmFtZXMucHVzaChyW2VdKSk7aWYoIWUub3V0cHV0KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogb3V0cHV0Iik7Zm9yKGNvbnN0IG4gb2YgZS5vdXRwdXQpe2lmKHQuaGFzKG4ubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG91dHB1dCBuYW1lOiAke24ubmFtZX1gKTtjb25zdCBlPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbChuKSktMTt0LnNldChuLm5hbWUsZSksdGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5wdXNoKGUpLHRoaXMuX2FsbE91dHB1dE5hbWVzLnB1c2gobi5uYW1lKTt9aWYoIWUubm9kZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG5vZGUiKTtmb3IoY29uc3QgdCBvZiBlLm5vZGUpe2lmKCF0Lm5hbWUpZm9yKGxldCBlPTA7O2UrKyl7Y29uc3Qgcj1gdW5uYW1lZF8ke3Qub3BUeXBlfV8ke2V9YDtpZighbi5oYXMocikpe3QubmFtZT1yO2JyZWFrfX1pZihuLmhhcyh0Lm5hbWUpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBub2RlIG5hbWU6ICR7dC5uYW1lfWApO2NvbnN0IGU9dGhpcy5fbm9kZXMucHVzaChuZXcgYyh0KSktMTtuLnNldCh0Lm5hbWUsZSk7fWZvcihsZXQgbj0wO248dGhpcy5fbm9kZXMubGVuZ3RoO24rKyl7Y29uc3Qgcj10aGlzLl9ub2Rlc1tuXSxvPWUubm9kZVtuXTtpZighby5vdXRwdXQpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIG91dHB1dCBmb3Igbm9kZTogJHtvLm5hbWV9YCk7Zm9yKGNvbnN0IGUgb2Ygby5vdXRwdXQpe2xldCBpPXQuZ2V0KGUpO2lmKHZvaWQgMD09PWkmJihpPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbCktMSx0LnNldChlLGkpKSxyLm91dHB1dHMucHVzaChpKSx2b2lkIDAhPT10aGlzLl9hbGxEYXRhW2ldLl9mcm9tKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke2l9YCk7aWYodGhpcy5fYWxsRGF0YVtpXS5fZnJvbT1uLCJDb25zdGFudCI9PT1vLm9wVHlwZSl7aWYoIW8uYXR0cmlidXRlfHwxIT09by5hdHRyaWJ1dGUubGVuZ3RofHwhby5hdHRyaWJ1dGVbMF0udCl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgYXR0cmlidXRlcyBvciBtaXNzaW5nIHRlbnNvciB2YWx1ZSBpbiBhdHRyaWJ1dGVzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7aWYoIW8ub3V0cHV0fHwxIT09by5vdXRwdXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBvdXRwdXQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXRzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7ci5vdXRwdXRzLnBvcCgpLHIuZXhlY3V0ZU5vZGU9ITEsdGhpcy5fYWxsRGF0YVtpXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2ldLnRlbnNvcj1zLlRlbnNvci5mcm9tUHJvdG8oby5hdHRyaWJ1dGVbMF0udCk7fX19Zm9yKGxldCBuPTA7bjx0aGlzLl9ub2Rlcy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuX25vZGVzW25dLG89ZS5ub2RlW25dO2lmKCFvLmlucHV0KXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBpbnB1dCBmb3Igbm9kZTogJHtvLm5hbWV9YCk7Zm9yKGNvbnN0IGUgb2Ygby5pbnB1dCl7Y29uc3QgaT10LmdldChlKTtpZih2b2lkIDA9PT1pKXtpZigiIj09PWUmJigzPT09by5pbnB1dC5sZW5ndGh8fDQ9PT1vLmlucHV0Lmxlbmd0aCkmJiJSZXNpemUiPT09by5vcFR5cGUpY29udGludWU7dGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgaW5wdXQgJyR7ZX0nIGZvciBub2RlOiAke28ubmFtZX1gKX1yLmlucHV0cy5wdXNoKGkpLHRoaXMuX2FsbERhdGFbaV0uX3RvLnB1c2gobik7fX1yZXR1cm4gITB9YnVpbGRHcmFwaEZyb21PcnRGb3JtYXQoZSl7dmFyIHQsbixyO2NvbnN0IG89bmV3IE1hcDt0aGlzLl9hbGxEYXRhPVtdLHRoaXMuX2FsbElucHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxJbnB1dE5hbWVzPVtdLHRoaXMuX2FsbE91dHB1dEluZGljZXM9W10sdGhpcy5fYWxsT3V0cHV0TmFtZXM9W10sdGhpcy5fbm9kZXM9W107Y29uc3QgaT1uZXcgTWFwLHA9W107Zm9yKGxldCBpPTA7aTxlLmlucHV0c0xlbmd0aCgpO2krKyl7Y29uc3Qgcz1lLmlucHV0cyhpKTtpZihvLmhhcyhzKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgaW5wdXQgbmFtZTogJHtzfWApO2ZvcihsZXQgaT0wO2k8ZS5ub2RlQXJnc0xlbmd0aCgpO2krKylpZigobnVsbD09PSh0PWUubm9kZUFyZ3MoaSkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lm5hbWUoKSk9PT1zKXtjb25zdCB0PW5ldyBsO2lmKChudWxsPT09KHI9bnVsbD09PShuPWUubm9kZUFyZ3MoaSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnR5cGUoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIudmFsdWVUeXBlKCkpIT09dS5UeXBlSW5mb1ZhbHVlLnRlbnNvcl90eXBlKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB2YWx1ZSB0eXBlIGZvciB0aGUgbm9kZUFyZy4iKTtjb25zdCBjPWUubm9kZUFyZ3MoaSkudHlwZSgpLnZhbHVlKG5ldyB1LlRlbnNvclR5cGVBbmRTaGFwZSksZD1hLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhjLmVsZW1UeXBlKCkpLGY9Yy5zaGFwZSgpLGg9W107Zm9yKGxldCBlPTA7ZTxmLmRpbUxlbmd0aCgpO2UrKyloLnB1c2goYS5Mb25nVXRpbC5sb25nVG9OdW1iZXIoZi5kaW0oZSkudmFsdWUoKS5kaW1WYWx1ZSgpKSk7dC50eXBlPXtzaGFwZTp7ZGltczpofSx0ZW5zb3JUeXBlOmR9O2NvbnN0IGc9dGhpcy5fYWxsRGF0YS5wdXNoKHQpLTE7by5zZXQocyxnKSxwLnB1c2gocyk7fX1mb3IobGV0IHQ9MDt0PGUuaW5pdGlhbGl6ZXJzTGVuZ3RoKCk7dCsrKXtjb25zdCBuPWUuaW5pdGlhbGl6ZXJzKHQpO2xldCByPW8uZ2V0KG4ubmFtZSgpKTtpZih2b2lkIDA9PT1yKXtjb25zdCBlPW5ldyBsLHQ9YS5Qcm90b1V0aWwudGVuc29yRGltc0Zyb21PUlRGb3JtYXQobiksaT1hLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhuLmRhdGFUeXBlKCkpO2UudHlwZT17c2hhcGU6e2RpbXM6dH0sdGVuc29yVHlwZTppfSxyPXRoaXMuX2FsbERhdGEucHVzaChlKS0xLG8uc2V0KG4ubmFtZSgpLHIpO310aGlzLl9hbGxEYXRhW3JdLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbcl0udGVuc29yPXMuVGVuc29yLmZyb21PcnRUZW5zb3Iobik7fWZvcihsZXQgZT0wO2U8dGhpcy5fYWxsRGF0YS5sZW5ndGg7ZSsrKXRoaXMuX2FsbERhdGFbZV0udGVuc29yfHwodGhpcy5fYWxsSW5wdXRJbmRpY2VzLnB1c2goZSksdGhpcy5fYWxsSW5wdXROYW1lcy5wdXNoKHBbZV0pKTtmb3IobGV0IHQ9MDt0PGUub3V0cHV0c0xlbmd0aCgpO3QrKyl7Y29uc3Qgbj1lLm91dHB1dHModCk7aWYoby5oYXMobikpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG91dHB1dCBuYW1lOiAke259YCk7Y29uc3Qgcj10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGwpLTE7by5zZXQobixyKSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzLnB1c2gociksdGhpcy5fYWxsT3V0cHV0TmFtZXMucHVzaChuKTt9aWYoIWUubm9kZXMpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBub2RlIik7Zm9yKGxldCB0PTA7dDxlLm5vZGVzTGVuZ3RoKCk7dCsrKXtjb25zdCBuPWUubm9kZXModCk7bGV0IHI9bi5uYW1lKCk7aWYoIXIpZm9yKGxldCBlPTA7cj1gdW5uYW1lZF8ke24ub3BUeXBlKCl9XyR7ZX1gLGkuaGFzKHIpO2UrKyk7aWYoaS5oYXMocikpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG5vZGUgbmFtZTogJHtyfWApO2NvbnN0IG89dGhpcy5fbm9kZXMucHVzaChuZXcgYyhuLHIpKS0xO2kuc2V0KHIsbyk7fWZvcihsZXQgdD0wO3Q8dGhpcy5fbm9kZXMubGVuZ3RoO3QrKyl7Y29uc3Qgbj10aGlzLl9ub2Rlc1t0XSxyPWUubm9kZXModCk7aWYobnVsbD09cil0aHJvdyBuZXcgRXJyb3IoYE5vIG5vZGUgZXhpc3RzIGF0IGluZGV4ICR7dH1gKTtpZigwPT09KG51bGw9PXI/dm9pZCAwOnIub3V0cHV0c0xlbmd0aCgpKSl0aHJvdyBuZXcgRXJyb3IoYG1pc3Npbmcgb3V0cHV0IGZvciBub2RlOiAke3IubmFtZX1gKTtmb3IobGV0IGU9MDtlPChudWxsPT1yP3ZvaWQgMDpyLm91dHB1dHNMZW5ndGgoKSk7ZSsrKXtjb25zdCBpPW51bGw9PXI/dm9pZCAwOnIub3V0cHV0cyhlKTtsZXQgYT1vLmdldChpKTtpZih2b2lkIDA9PT1hJiYoYT10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGwpLTEsby5zZXQoaSxhKSksbi5vdXRwdXRzLnB1c2goYSksdm9pZCAwIT09dGhpcy5fYWxsRGF0YVthXS5fZnJvbSl0aHJvdyBuZXcgRXJyb3IoYG11bHRpcGxlIG5vZGVzIG91dHB1dCB0byBvbmUgZGF0YSB2YWx1ZTogJHthfWApO2lmKHRoaXMuX2FsbERhdGFbYV0uX2Zyb209dCwiQ29uc3RhbnQiPT09ci5vcFR5cGUoKSl7aWYoMSE9PXIuYXR0cmlidXRlc0xlbmd0aCgpfHwhci5hdHRyaWJ1dGVzKDApLnQoKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgYXR0cmlidXRlcyBvciBtaXNzaW5nIHRlbnNvciB2YWx1ZSBpbiBhdHRyaWJ1dGVzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7aWYoMSE9PXIub3V0cHV0c0xlbmd0aCgpKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBvdXRwdXQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXRzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7bi5vdXRwdXRzLnBvcCgpLG4uZXhlY3V0ZU5vZGU9ITEsdGhpcy5fYWxsRGF0YVthXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2FdLnRlbnNvcj1zLlRlbnNvci5mcm9tT3J0VGVuc29yKHIuYXR0cmlidXRlcygwKS50KCkpO319fWZvcihsZXQgdD0wO3Q8dGhpcy5fbm9kZXMubGVuZ3RoO3QrKyl7Y29uc3Qgbj10aGlzLl9ub2Rlc1t0XSxyPWUubm9kZXModCk7aWYoMD09PXIuaW5wdXRzTGVuZ3RoKCkpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IGZvciBub2RlOiAke3IubmFtZX1gKTtmb3IobGV0IGU9MDtlPHIuaW5wdXRzTGVuZ3RoKCk7ZSsrKXtjb25zdCBpPXIuaW5wdXRzKGUpLHM9by5nZXQoaSk7aWYodm9pZCAwPT09cyl0aHJvdyBuZXcgRXJyb3IoYHVucmVjb2duaXplZCBpbnB1dCAnJHtpfScgZm9yIG5vZGU6ICR7ci5uYW1lKCl9YCk7bi5pbnB1dHMucHVzaChzKSx0aGlzLl9hbGxEYXRhW3NdLl90by5wdXNoKHQpO319fWNoZWNrSXNBY3ljbGljKCl7Y29uc3QgZT1uZXcgU2V0O3RoaXMuX2FsbElucHV0SW5kaWNlcy5mb3JFYWNoKCh0PT57dGhpcy5fYWxsRGF0YVt0XS5fdG8uZm9yRWFjaCgodD0+e2UuYWRkKHQpO30pKTt9KSk7Y29uc3QgdD1BcnJheS5mcm9tKGUpLG49bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCkuZmlsbCgid2hpdGUiKTtmb3IoO3QubGVuZ3RoPjA7KXtjb25zdCBlPXQucG9wKCk7ImdyYXkiPT09bltlXT9uW2VdPSJibGFjayI6KHQucHVzaChlKSxuW2VdPSJncmF5Iix0aGlzLl9ub2Rlc1tlXS5vdXRwdXRzLmZvckVhY2goKHI9Pntjb25zdCBvPXRoaXMuX2FsbERhdGFbcl07aWYodm9pZCAwIT09by50ZW5zb3IpdGhyb3cgbmV3IEVycm9yKCJub2RlIG91dHB1dHMgc2hvdWxkIG5vdCBiZSBpbml0aWFsaXplZCIpO2lmKG8uX2Zyb20hPT1lKXRocm93IG5ldyBFcnJvcigiZnJvbSBwcm9wZXJ0eSBvZiB0aGUgVmFsdWUgb2JqZWN0IGRvZXNuJ3QgbWF0Y2ggaW5kZXggb2YgTm9kZSBiZWluZyBwcm9jZXNzZWQiKTtvLl90by5mb3JFYWNoKChlPT57aWYoImdyYXkiPT09bltlXSl0aHJvdyBuZXcgRXJyb3IoIm1vZGVsIGdyYXBoIGlzIGN5Y2xpYyIpOyJ3aGl0ZSI9PT1uW2VdJiZ0LnB1c2goZSk7fSkpO30pKSk7fX10cmFuc2Zvcm1HcmFwaChlKXt0aGlzLnJlbW92ZUFsbElkZW50aXR5Tm9kZXMoKSx0aGlzLnJlbW92ZUFsbERyb3BvdXROb2RlcygpLHRoaXMuZnVzZUNvbnZBY3RpdmF0aW9uTm9kZXMoKSxlJiZlLnRyYW5zZm9ybUdyYXBoKHRoaXMpLHRoaXMuZmluYWxpemVHcmFwaCgpO31maW5hbGl6ZUdyYXBoKCl7bGV0IGU9MDtjb25zdCB0PW5ldyBBcnJheSh0aGlzLl9ub2Rlcy5sZW5ndGgsMCk7bGV0IG49MDtmb3IobGV0IGU9MDtlPHRoaXMuX25vZGVzLmxlbmd0aDtlKyspdFtlXT1uLHRoaXMuX25vZGVzW2VdLmV4ZWN1dGVOb2RlPyhuIT09ZSYmKHRoaXMuX25vZGVzW25dPXRoaXMuX25vZGVzW2VdKSxuKyspOnRoaXMuX25vZGVzW2VdLm91dHB1dHMuZm9yRWFjaCgoZT0+e3RoaXMuX2FsbERhdGFbZV0uX2Zyb209LTI7fSkpO3RoaXMuX25vZGVzLnNwbGljZShuLHRoaXMuX25vZGVzLmxlbmd0aC1uKTtmb3IobGV0IGU9MDtlPHRoaXMuX2FsbERhdGEubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLl9hbGxEYXRhW2VdO3ZvaWQgMCE9PW4uX2Zyb20mJi0xIT09bi5fZnJvbSYmLTIhPT1uLl9mcm9tJiYobi5fZnJvbT10W24uX2Zyb21dKTtmb3IobGV0IGU9MDtlPG4uX3RvLmxlbmd0aDtlKyspe2lmKCEobi5fdG9bZV0+PTApKXRocm93IG5ldyBFcnJvcigiVHJ5aW5nIHRvIHVwZGF0ZSBhIHJlbW92ZWQgbm9kZSIpO24uX3RvW2VdPXRbbi5fdG9bZV1dO319ZT0wO2ZvcihsZXQgdD0wO3Q8dGhpcy5fYWxsRGF0YS5sZW5ndGg7dCsrKWlmKC0yIT09dGhpcy5fYWxsRGF0YVt0XS5mcm9tfHwtMSE9PXRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZih0K2UpKXtpZihlPjApe2xldCBuPS0xO3ZvaWQgMCE9PXRoaXMuX2FsbERhdGFbdF0uZnJvbSYmLTEhPT10aGlzLl9hbGxEYXRhW3RdLmZyb20/KG49dGhpcy5fbm9kZXNbdGhpcy5fYWxsRGF0YVt0XS5mcm9tXS5vdXRwdXRzLmluZGV4T2YodCtlKSwtMSE9PW4mJih0aGlzLl9ub2Rlc1t0aGlzLl9hbGxEYXRhW3RdLmZyb21dLm91dHB1dHNbbl09dCkpOihuPXRoaXMuX2FsbElucHV0SW5kaWNlcy5pbmRleE9mKHQrZSksLTEhPT1uJiYodGhpcy5fYWxsSW5wdXRJbmRpY2VzW25dPXQpKSx0aGlzLl9hbGxEYXRhW3RdLnRvLmZvckVhY2goKHI9PntuPXRoaXMuX25vZGVzW3JdLmlucHV0cy5pbmRleE9mKHQrZSksLTEhPT1uJiYodGhpcy5fbm9kZXNbcl0uaW5wdXRzW25dPXQpO30pKSwwPT09dGhpcy5fYWxsRGF0YVt0XS50by5sZW5ndGgmJihuPXRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZih0K2UpLC0xIT09biYmKHRoaXMuX2FsbE91dHB1dEluZGljZXNbbl09dCkpO319ZWxzZSBlKyssdGhpcy5fYWxsRGF0YS5zcGxpY2UodCwxKSx0LS07fWRlbGV0ZU5vZGUoZSl7Y29uc3QgdD10aGlzLl9ub2Rlc1tlXTtpZih0Lm91dHB1dHMubGVuZ3RoPjEpZm9yKGxldCBlPTE7ZTx0Lm91dHB1dHMubGVuZ3RoO2UrKylpZih0aGlzLl9hbGxEYXRhW3Qub3V0cHV0c1tlXV0udG8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCJOb2RlIGRlbGV0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBvdXRwdXQgY29ubmVjdGVkIHRvIG90aGVyIG5vZGVzIGlzIG5vdCBzdXBwb3J0ZWQuICIpO3QuZXhlY3V0ZU5vZGU9ITE7Y29uc3Qgbj10LmlucHV0c1swXSxyPXQub3V0cHV0c1swXSxvPXRoaXMuX2FsbERhdGFbcl0udG87Zm9yKGxldCBuPTA7bjx0LmlucHV0cy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuX2FsbERhdGFbdC5pbnB1dHNbbl1dLnRvLmluZGV4T2YoZSk7aWYoLTE9PT1yKXRocm93IG5ldyBFcnJvcigiVGhlIFZhbHVlIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIGN1cnJlbnQgTm9kZSBpbiBpdCdzICd0bycgcHJvcGVydHkgIik7dGhpcy5fYWxsRGF0YVt0LmlucHV0c1tuXV0udG8uc3BsaWNlKHIsMSk7fXRoaXMuX2FsbERhdGFbcl0uX3RvPVtdO2NvbnN0IGk9dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHIpO2lmKC0xIT09aSYmKHRoaXMuX2FsbE91dHB1dEluZGljZXNbaV09biksbyYmby5sZW5ndGg+MClmb3IoY29uc3QgZSBvZiBvKXtjb25zdCB0PXRoaXMuX25vZGVzW2VdLmlucHV0cy5pbmRleE9mKHIpO2lmKC0xPT09dCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBOb2RlIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIG91dHB1dCBWYWx1ZSBpbiBpdCdzICdpbnB1dHMnIHByb3BlcnR5ICIpO3RoaXMuX25vZGVzW2VdLmlucHV0c1t0XT1uLHRoaXMuX2FsbERhdGFbbl0udG8ucHVzaChlKTt9fXJlbW92ZUFsbERyb3BvdXROb2Rlcygpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fbm9kZXMpe2lmKCJEcm9wb3V0Ij09PXQub3BUeXBlKXtpZigxIT09dC5pbnB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRHJvcG91dCBub2RlcyBzaG91bGQgb25seSBjb250YWluIG9uZSBpbnB1dC4gIik7aWYoMSE9PXQub3V0cHV0cy5sZW5ndGgmJjIhPT10Lm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRHJvcG91dCBub2RlcyBzaG91bGQgY29udGFpbiBlaXRoZXIgMSBvciAyIG91dHB1dChzKSIpO2lmKDI9PT10Lm91dHB1dHMubGVuZ3RoJiYwIT09dGhpcy5fYWxsRGF0YVt0Lm91dHB1dHNbMV1dLl90by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzJ3Mgc2Vjb25kIG91dHB1dCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYnkgb3RoZXIgbm9kZXMiKTt0aGlzLmRlbGV0ZU5vZGUoZSk7fWUrKzt9fXJlbW92ZUFsbElkZW50aXR5Tm9kZXMoKXtsZXQgZT0wO2Zvcihjb25zdCB0IG9mIHRoaXMuX25vZGVzKSJJZGVudGl0eSI9PT10Lm9wVHlwZSYmdGhpcy5kZWxldGVOb2RlKGUpLGUrKzt9aXNBY3RpdmF0aW9uKGUpe3N3aXRjaChlLm9wVHlwZSl7Y2FzZSJSZWx1IjpjYXNlIlNpZ21vaWQiOmNhc2UiQ2xpcCI6cmV0dXJuICEwO2RlZmF1bHQ6cmV0dXJuICExfX1mdXNlQ29udkFjdGl2YXRpb25Ob2Rlcygpe2Zvcihjb25zdCBlIG9mIHRoaXMuX25vZGVzKWlmKCJDb252Ij09PWUub3BUeXBlKXtjb25zdCB0PXRoaXMuX2FsbERhdGFbZS5vdXRwdXRzWzBdXS5fdG87aWYoMT09PXQubGVuZ3RoJiZ0aGlzLmlzQWN0aXZhdGlvbih0aGlzLl9ub2Rlc1t0WzBdXSkpe2NvbnN0IG49dGhpcy5fbm9kZXNbdFswXV07aWYoIkNsaXAiPT09bi5vcFR5cGUpaWYoMT09PW4uaW5wdXRzLmxlbmd0aCl0cnl7ZS5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFtuLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1pbiIpLG4uYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4IildKTt9Y2F0Y2godCl7ZS5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFthLk1JTl9DTElQLGEuTUFYX0NMSVBdKTt9ZWxzZSB7aWYoIShuLmlucHV0cy5sZW5ndGg+PTMmJnZvaWQgMCE9PXRoaXMuX2FsbERhdGFbbi5pbnB1dHNbMV1dLnRlbnNvciYmdm9pZCAwIT09dGhpcy5fYWxsRGF0YVtuLmlucHV0c1syXV0udGVuc29yKSljb250aW51ZTtlLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW3RoaXMuX2FsbERhdGFbbi5pbnB1dHNbMV1dLnRlbnNvci5mbG9hdERhdGFbMF0sdGhpcy5fYWxsRGF0YVtuLmlucHV0c1syXV0udGVuc29yLmZsb2F0RGF0YVswXV0pO31lLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uIiwic3RyaW5nIixuLm9wVHlwZSksdGhpcy5kZWxldGVOb2RlKHRbMF0pO319fX19LDEzMTU6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5ub3c9dC5Qcm9maWxlcj10LkxvZ2dlcj12b2lkIDA7Y29uc3Qgbj17dmVyYm9zZToxZTMsaW5mbzoyZTMsd2FybmluZzo0ZTMsZXJyb3I6NWUzLGZhdGFsOjZlM30scj17bm9uZTpuZXcgY2xhc3N7bG9nKGUsdCxuKXt9fSxjb25zb2xlOm5ldyBjbGFzc3tsb2coZSx0LG4pe2NvbnNvbGUubG9nKGAke3RoaXMuY29sb3IoZSl9ICR7bj8iG1szNW0iK24rIhtbMG0gIjoiIn0ke3R9YCk7fWNvbG9yKGUpe3N3aXRjaChlKXtjYXNlInZlcmJvc2UiOnJldHVybiAiG1szNDs0MG12G1swbSI7Y2FzZSJpbmZvIjpyZXR1cm4gIhtbMzJtaRtbMG0iO2Nhc2Uid2FybmluZyI6cmV0dXJuICIbWzMwOzQzbXcbWzBtIjtjYXNlImVycm9yIjpyZXR1cm4gIhtbMzE7NDBtZRtbMG0iO2Nhc2UiZmF0YWwiOnJldHVybiAiG1sxMDFtZhtbMG0iO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBzZXZlcml0eTogJHtlfWApfX19fSxvPXtwcm92aWRlcjoiY29uc29sZSIsbWluaW1hbFNldmVyaXR5OiJ3YXJuaW5nIixsb2dEYXRlVGltZTohMCxsb2dTb3VyY2VMb2NhdGlvbjohMX07bGV0IGk9eyIiOm99O2Z1bmN0aW9uIHMoZSx0LG4scil7aWYodm9pZCAwPT09dClyZXR1cm4gbz1lLHt2ZXJib3NlOnMudmVyYm9zZS5iaW5kKG51bGwsbyksaW5mbzpzLmluZm8uYmluZChudWxsLG8pLHdhcm5pbmc6cy53YXJuaW5nLmJpbmQobnVsbCxvKSxlcnJvcjpzLmVycm9yLmJpbmQobnVsbCxvKSxmYXRhbDpzLmZhdGFsLmJpbmQobnVsbCxvKX07aWYodm9pZCAwPT09bilhKGUsdCk7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIG4mJnZvaWQgMD09PXIpYShlLHQpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuJiZ2b2lkIDA9PT1yKWEoZSxuLDAsdCk7ZWxzZSB7aWYoInN0cmluZyIhPXR5cGVvZiBufHwibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgaXMgdmFsaWQiKTthKGUsbiwwLHQpO312YXIgbzt9ZnVuY3Rpb24gYShlLHQsbyxzKXtjb25zdCBhPWlbc3x8IiJdfHxpWyIiXTtuW2VdPG5bYS5taW5pbWFsU2V2ZXJpdHldfHwoYS5sb2dEYXRlVGltZSYmKHQ9YCR7KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfXwke3R9YCksYS5sb2dTb3VyY2VMb2NhdGlvbixyW2EucHJvdmlkZXJdLmxvZyhlLHQscykpO30hZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtpPXt9LG4oIiIsZXx8e30pO31mdW5jdGlvbiBuKGUsbil7aWYoIioiPT09ZSl0KG4pO2Vsc2Uge2NvbnN0IHQ9aVtlXXx8bztpW2VdPXtwcm92aWRlcjpuLnByb3ZpZGVyfHx0LnByb3ZpZGVyLG1pbmltYWxTZXZlcml0eTpuLm1pbmltYWxTZXZlcml0eXx8dC5taW5pbWFsU2V2ZXJpdHksbG9nRGF0ZVRpbWU6dm9pZCAwPT09bi5sb2dEYXRlVGltZT90LmxvZ0RhdGVUaW1lOm4ubG9nRGF0ZVRpbWUsbG9nU291cmNlTG9jYXRpb246dm9pZCAwPT09bi5sb2dTb3VyY2VMb2NhdGlvbj90LmxvZ1NvdXJjZUxvY2F0aW9uOm4ubG9nU291cmNlTG9jYXRpb259O319ZS52ZXJib3NlPWZ1bmN0aW9uKHQsbil7ZSgidmVyYm9zZSIsdCxuKTt9LGUuaW5mbz1mdW5jdGlvbih0LG4pe2UoImluZm8iLHQsbik7fSxlLndhcm5pbmc9ZnVuY3Rpb24odCxuKXtlKCJ3YXJuaW5nIix0LG4pO30sZS5lcnJvcj1mdW5jdGlvbih0LG4pe2UoImVycm9yIix0LG4pO30sZS5mYXRhbD1mdW5jdGlvbih0LG4pe2UoImZhdGFsIix0LG4pO30sZS5yZXNldD10LGUuc2V0PW4sZS5zZXRXaXRoRW52PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9e307ZS5sb2dMZXZlbCYmKHQubWluaW1hbFNldmVyaXR5PWUubG9nTGV2ZWwpLG4oIiIsdCk7fTt9KHN8fChzPXt9KSksdC5Mb2dnZXI9cztjbGFzcyB1e2NvbnN0cnVjdG9yKGUsdCxuLHIsbyxpKXt0aGlzLmNhdGVnb3J5PWUsdGhpcy5uYW1lPXQsdGhpcy5zdGFydFRpbWU9bix0aGlzLmVuZENhbGxiYWNrPXIsdGhpcy50aW1lcj1vLHRoaXMuY3R4PWk7fWFzeW5jIGVuZCgpe3JldHVybiB0aGlzLmVuZENhbGxiYWNrKHRoaXMpfWFzeW5jIGNoZWNrVGltZXIoKXtpZih2b2lkIDA9PT10aGlzLmN0eHx8dm9pZCAwPT09dGhpcy50aW1lcil0aHJvdyBuZXcgRXJyb3IoIk5vIHdlYmdsIHRpbWVyIGZvdW5kIik7cmV0dXJuIHRoaXMuY3R4LmVuZFRpbWVyKCksdGhpcy5jdHgud2FpdEZvclF1ZXJ5QW5kR2V0VGltZSh0aGlzLnRpbWVyKX19Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLHQsbixyKXt0aGlzLmNhdGVnb3J5PWUsdGhpcy5uYW1lPXQsdGhpcy5zdGFydFRpbWU9bix0aGlzLmVuZFRpbWU9cjt9fXQuUHJvZmlsZXI9Y2xhc3N7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gdm9pZCAwPT09ZT9uZXcgdGhpczpuZXcgdGhpcyhlLm1heE51bWJlckV2ZW50cyxlLmZsdXNoQmF0Y2hTaXplLGUuZmx1c2hJbnRlcnZhbEluTWlsbGlzZWNvbmRzKX1jb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9mbHVzaFBvaW50ZXI9MCx0aGlzLl9zdGFydGVkPSExLHRoaXMuX21heE51bWJlckV2ZW50cz12b2lkIDA9PT1lPzFlNDplLHRoaXMuX2ZsdXNoQmF0Y2hTaXplPXZvaWQgMD09PXQ/MTA6dCx0aGlzLl9mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHM9dm9pZCAwPT09bj81ZTM6bjt9c3RhcnQoKXt0aGlzLl9zdGFydGVkPSEwLHRoaXMuX3RpbWluZ0V2ZW50cz1bXSx0aGlzLl9mbHVzaFRpbWU9KDAsIHQubm93KSgpLHRoaXMuX2ZsdXNoUG9pbnRlcj0wO31zdG9wKCl7Zm9yKHRoaXMuX3N0YXJ0ZWQ9ITE7dGhpcy5fZmx1c2hQb2ludGVyPHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg7dGhpcy5fZmx1c2hQb2ludGVyKyspdGhpcy5sb2dPbmVFdmVudCh0aGlzLl90aW1pbmdFdmVudHNbdGhpcy5fZmx1c2hQb2ludGVyXSk7fWV2ZW50KGUsdCxuLHIpe2NvbnN0IG89dGhpcy5fc3RhcnRlZD90aGlzLmJlZ2luKGUsdCxyKTp2b2lkIDA7bGV0IGk9ITE7Y29uc3Qgcz1uKCk7aWYocyYmImZ1bmN0aW9uIj09dHlwZW9mIHMudGhlbilyZXR1cm4gaT0hMCxuZXcgUHJvbWlzZSgoKGUsdCk9PntzLnRoZW4oKGFzeW5jIHQ9PntvJiZhd2FpdCBvLmVuZCgpLGUodCk7fSksKGFzeW5jIGU9PntvJiZhd2FpdCBvLmVuZCgpLHQoZSk7fSkpO30pKTtpZighaSYmbyl7Y29uc3QgZT1vLmVuZCgpO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRoZW4pcmV0dXJuIG5ldyBQcm9taXNlKCgodCxuKT0+e2UudGhlbigoKCk9Pnt0KHMpO30pLChlPT57bihlKTt9KSk7fSkpfXJldHVybiBzfWJlZ2luKGUsbixyKXtpZighdGhpcy5fc3RhcnRlZCl0aHJvdyBuZXcgRXJyb3IoInByb2ZpbGVyIGlzIG5vdCBzdGFydGVkIHlldCIpO2lmKHZvaWQgMD09PXIpe2NvbnN0IHI9KDAsIHQubm93KSgpO3JldHVybiB0aGlzLmZsdXNoKHIpLG5ldyB1KGUsbixyLChlPT50aGlzLmVuZFN5bmMoZSkpKX17Y29uc3QgdD1yLmJlZ2luVGltZXIoKTtyZXR1cm4gbmV3IHUoZSxuLDAsKGFzeW5jIGU9PnRoaXMuZW5kKGUpKSx0LHIpfX1hc3luYyBlbmQoZSl7Y29uc3QgdD1hd2FpdCBlLmNoZWNrVGltZXIoKTt0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoPHRoaXMuX21heE51bWJlckV2ZW50cyYmKHRoaXMuX3RpbWluZ0V2ZW50cy5wdXNoKG5ldyBsKGUuY2F0ZWdvcnksZS5uYW1lLGUuc3RhcnRUaW1lLHQpKSx0aGlzLmZsdXNoKHQpKTt9ZW5kU3luYyhlKXtjb25zdCBuPSgwLCB0Lm5vdykoKTt0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoPHRoaXMuX21heE51bWJlckV2ZW50cyYmKHRoaXMuX3RpbWluZ0V2ZW50cy5wdXNoKG5ldyBsKGUuY2F0ZWdvcnksZS5uYW1lLGUuc3RhcnRUaW1lLG4pKSx0aGlzLmZsdXNoKG4pKTt9bG9nT25lRXZlbnQoZSl7dC5Mb2dnZXIudmVyYm9zZShgUHJvZmlsZXIuJHtlLmNhdGVnb3J5fWAsYCR7KGUuZW5kVGltZS1lLnN0YXJ0VGltZSkudG9GaXhlZCgyKX1tcyBvbiBldmVudCAnJHtlLm5hbWV9JyBhdCAke2UuZW5kVGltZS50b0ZpeGVkKDIpfWApO31mbHVzaChlKXtpZih0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoLXRoaXMuX2ZsdXNoUG9pbnRlcj49dGhpcy5fZmx1c2hCYXRjaFNpemV8fGUtdGhpcy5fZmx1c2hUaW1lPj10aGlzLl9mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHMpe2Zvcihjb25zdCBlPXRoaXMuX2ZsdXNoUG9pbnRlcjt0aGlzLl9mbHVzaFBvaW50ZXI8ZSt0aGlzLl9mbHVzaEJhdGNoU2l6ZSYmdGhpcy5fZmx1c2hQb2ludGVyPHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg7dGhpcy5fZmx1c2hQb2ludGVyKyspdGhpcy5sb2dPbmVFdmVudCh0aGlzLl90aW1pbmdFdmVudHNbdGhpcy5fZmx1c2hQb2ludGVyXSk7dGhpcy5fZmx1c2hUaW1lPSgwLCB0Lm5vdykoKTt9fWdldCBzdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9fSx0Lm5vdz0idW5kZWZpbmVkIiE9dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/KCk9PnBlcmZvcm1hbmNlLm5vdygpOkRhdGUubm93O30sMTc0NTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTW9kZWw9dm9pZCAwO2NvbnN0IHI9big1Njg2KSxvPW4oNDY2MiksaT1uKDUxMjcpLHM9bigyNDQ2KSxhPW4oNzI3Myk7dmFyIHU9aS5vbm54cnVudGltZS5leHBlcmltZW50YWwuZmJzO3QuTW9kZWw9Y2xhc3N7Y29uc3RydWN0b3IoKXt9bG9hZChlLHQsbil7aWYoIW4pdHJ5e3JldHVybiB2b2lkIHRoaXMubG9hZEZyb21Pbm54Rm9ybWF0KGUsdCl9Y2F0Y2goZSl7aWYodm9pZCAwIT09bil0aHJvdyBlfXRoaXMubG9hZEZyb21PcnRGb3JtYXQoZSx0KTt9bG9hZEZyb21Pbm54Rm9ybWF0KGUsdCl7Y29uc3Qgbj1zLm9ubnguTW9kZWxQcm90by5kZWNvZGUoZSk7aWYoYS5Mb25nVXRpbC5sb25nVG9OdW1iZXIobi5pclZlcnNpb24pPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9bi5vcHNldEltcG9ydC5tYXAoKGU9Pih7ZG9tYWluOmUuZG9tYWluLHZlcnNpb246YS5Mb25nVXRpbC5sb25nVG9OdW1iZXIoZS52ZXJzaW9uKX0pKSksdGhpcy5fZ3JhcGg9by5HcmFwaC5mcm9tKG4uZ3JhcGgsdCk7fWxvYWRGcm9tT3J0Rm9ybWF0KGUsdCl7Y29uc3Qgbj1uZXcgci5mbGF0YnVmZmVycy5CeXRlQnVmZmVyKGUpLGk9dS5JbmZlcmVuY2VTZXNzaW9uLmdldFJvb3RBc0luZmVyZW5jZVNlc3Npb24obikubW9kZWwoKTtpZihhLkxvbmdVdGlsLmxvbmdUb051bWJlcihpLmlyVmVyc2lvbigpKTwzKXRocm93IG5ldyBFcnJvcigib25seSBzdXBwb3J0IE9OTlggbW9kZWwgd2l0aCBJUl9WRVJTSU9OPj0zIik7dGhpcy5fb3BzZXRzPVtdO2ZvcihsZXQgZT0wO2U8aS5vcHNldEltcG9ydExlbmd0aCgpO2UrKyl7Y29uc3QgdD1pLm9wc2V0SW1wb3J0KGUpO3RoaXMuX29wc2V0cy5wdXNoKHtkb21haW46bnVsbD09dD92b2lkIDA6dC5kb21haW4oKSx2ZXJzaW9uOmEuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKHQudmVyc2lvbigpKX0pO310aGlzLl9ncmFwaD1vLkdyYXBoLmZyb20oaS5ncmFwaCgpLHQpO31nZXQgZ3JhcGgoKXtyZXR1cm4gdGhpcy5fZ3JhcGh9Z2V0IG9wc2V0cygpe3JldHVybiB0aGlzLl9vcHNldHN9fTt9LDYxNDU6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5GTE9BVF9UWVBFUz10LklOVF9UWVBFUz10Lk5VTUJFUl9UWVBFUz12b2lkIDAsdC5OVU1CRVJfVFlQRVM9WyJmbG9hdDMyIiwiZmxvYXQ2NCIsImludDMyIiwiaW50MTYiLCJpbnQ4IiwidWludDE2IiwidWludDMyIiwidWludDgiXSx0LklOVF9UWVBFUz1bImludDMyIiwiaW50MTYiLCJpbnQ4IiwidWludDE2IiwidWludDMyIiwidWludDgiXSx0LkZMT0FUX1RZUEVTPVsiZmxvYXQzMiIsImZsb2F0NjQiXTt9LDU4ODE6KGUsdCk9PntmdW5jdGlvbiBuKGUsdCl7aWYodC5lbmRzV2l0aCgiKyIpKXtjb25zdCBuPU51bWJlci5wYXJzZUludCh0LnN1YnN0cmluZygwLHQubGVuZ3RoLTEpLDEwKTtyZXR1cm4gIWlzTmFOKG4pJiZuPD1lfWlmKDI9PT10LnNwbGl0KCItIikubGVuZ3RoKXtjb25zdCBuPXQuc3BsaXQoIi0iKSxyPU51bWJlci5wYXJzZUludChuWzBdLDEwKSxvPU51bWJlci5wYXJzZUludChuWzFdLDEwKTtyZXR1cm4gIWlzTmFOKHIpJiYhaXNOYU4obykmJnI8PWUmJmU8PW99cmV0dXJuIE51bWJlci5wYXJzZUludCh0LDEwKT09PWV9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVzb2x2ZU9wZXJhdG9yPXZvaWQgMCx0LnJlc29sdmVPcGVyYXRvcj1mdW5jdGlvbihlLHQscil7Zm9yKGNvbnN0IG8gb2Ygcil7Y29uc3Qgcj1vWzBdLGk9b1sxXSxzPW9bMl0sYT1vWzNdLHU9b1s0XTtpZihlLm9wVHlwZT09PXIpZm9yKGNvbnN0IGUgb2YgdClpZigoZS5kb21haW49PT1pfHwiYWkub25ueCI9PT1lLmRvbWFpbiYmIiI9PT1pKSYmbihlLnZlcnNpb24scykpcmV0dXJuIHtvcEltcGw6YSxvcEluaXQ6dX19dGhyb3cgbmV3IFR5cGVFcnJvcihgY2Fubm90IHJlc29sdmUgb3BlcmF0b3IgJyR7ZS5vcFR5cGV9JyB3aXRoIG9wc2V0czogJHt0Lm1hcCgoZT0+YCR7ZS5kb21haW58fCJhaS5vbm54In0gdiR7ZS52ZXJzaW9ufWApKS5qb2luKCIsICIpfWApfTt9LDUxMjc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lm9ubnhydW50aW1lPXZvaWQgMDtjb25zdCByPW4oNTY4Nik7dmFyIG8saTsoKGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuVU5ERUZJTkVEPTBdPSJVTkRFRklORUQiLGVbZS5GTE9BVD0xXT0iRkxPQVQiLGVbZS5JTlQ9Ml09IklOVCIsZVtlLlNUUklORz0zXT0iU1RSSU5HIixlW2UuVEVOU09SPTRdPSJURU5TT1IiLGVbZS5HUkFQSD01XT0iR1JBUEgiLGVbZS5GTE9BVFM9Nl09IkZMT0FUUyIsZVtlLklOVFM9N109IklOVFMiLGVbZS5TVFJJTkdTPThdPSJTVFJJTkdTIixlW2UuVEVOU09SUz05XT0iVEVOU09SUyIsZVtlLkdSQVBIUz0xMF09IkdSQVBIUyIsZVtlLlNQQVJTRV9URU5TT1I9MTFdPSJTUEFSU0VfVEVOU09SIixlW2UuU1BBUlNFX1RFTlNPUlM9MTJdPSJTUEFSU0VfVEVOU09SUyI7fShlLkF0dHJpYnV0ZVR5cGV8fChlLkF0dHJpYnV0ZVR5cGU9e30pKTt9KSkoKGk9KG89dC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKS5leHBlcmltZW50YWx8fChvLmV4cGVyaW1lbnRhbD17fSkpLmZic3x8KGkuZmJzPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZVtlLlVOS05PV049MF09IlVOS05PV04iLGVbZS5WQUxVRT0xXT0iVkFMVUUiLGVbZS5QQVJBTT0yXT0iUEFSQU0iO30oZS5EaW1lbnNpb25WYWx1ZVR5cGV8fChlLkRpbWVuc2lvblZhbHVlVHlwZT17fSkpO30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuVU5ERUZJTkVEPTBdPSJVTkRFRklORUQiLGVbZS5GTE9BVD0xXT0iRkxPQVQiLGVbZS5VSU5UOD0yXT0iVUlOVDgiLGVbZS5JTlQ4PTNdPSJJTlQ4IixlW2UuVUlOVDE2PTRdPSJVSU5UMTYiLGVbZS5JTlQxNj01XT0iSU5UMTYiLGVbZS5JTlQzMj02XT0iSU5UMzIiLGVbZS5JTlQ2ND03XT0iSU5UNjQiLGVbZS5TVFJJTkc9OF09IlNUUklORyIsZVtlLkJPT0w9OV09IkJPT0wiLGVbZS5GTE9BVDE2PTEwXT0iRkxPQVQxNiIsZVtlLkRPVUJMRT0xMV09IkRPVUJMRSIsZVtlLlVJTlQzMj0xMl09IlVJTlQzMiIsZVtlLlVJTlQ2ND0xM109IlVJTlQ2NCIsZVtlLkNPTVBMRVg2ND0xNF09IkNPTVBMRVg2NCIsZVtlLkNPTVBMRVgxMjg9MTVdPSJDT01QTEVYMTI4IixlW2UuQkZMT0FUMTY9MTZdPSJCRkxPQVQxNiIsZVtlLkZMT0FUOEU0TTNGTj0xN109IkZMT0FUOEU0TTNGTiIsZVtlLkZMT0FUOEU0TTNGTlVaPTE4XT0iRkxPQVQ4RTRNM0ZOVVoiLGVbZS5GTE9BVDhFNU0yPTE5XT0iRkxPQVQ4RTVNMiIsZVtlLkZMT0FUOEU1TTJGTlVaPTIwXT0iRkxPQVQ4RTVNMkZOVVoiO30oZS5UZW5zb3JEYXRhVHlwZXx8KGUuVGVuc29yRGF0YVR5cGU9e30pKTt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZVtlLlByaW1pdGl2ZT0wXT0iUHJpbWl0aXZlIixlW2UuRnVzZWQ9MV09IkZ1c2VkIjt9KGUuTm9kZVR5cGV8fChlLk5vZGVUeXBlPXt9KSk7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2VbZS5OT05FPTBdPSJOT05FIixlW2UudGVuc29yX3R5cGU9MV09InRlbnNvcl90eXBlIixlW2Uuc2VxdWVuY2VfdHlwZT0yXT0ic2VxdWVuY2VfdHlwZSIsZVtlLm1hcF90eXBlPTNdPSJtYXBfdHlwZSI7fShlLlR5cGVJbmZvVmFsdWV8fChlLlR5cGVJbmZvVmFsdWU9e30pKTt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNTaGFwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2hhcGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRpbSh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfWRpbUxlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRTaGFwZShlKXtlLnN0YXJ0T2JqZWN0KDEpO31zdGF0aWMgYWRkRGltKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBjcmVhdGVEaW1WZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRTaGFwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2hhcGUoZSx0KXtyZXR1cm4gbi5zdGFydFNoYXBlKGUpLG4uYWRkRGltKGUsdCksbi5lbmRTaGFwZShlKX19dC5TaGFwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc0RpbWVuc2lvbihlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGltZW5zaW9uKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX12YWx1ZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkRpbWVuc2lvblZhbHVlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9ZGVub3RhdGlvbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvbihlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkVmFsdWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZERlbm90YXRpb24oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGVuZERpbWVuc2lvbihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRGltZW5zaW9uKGUsdCxyKXtyZXR1cm4gbi5zdGFydERpbWVuc2lvbihlKSxuLmFkZFZhbHVlKGUsdCksbi5hZGREZW5vdGF0aW9uKGUsciksbi5lbmREaW1lbnNpb24oZSl9fXQuRGltZW5zaW9uPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRGltZW5zaW9uVmFsdWUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RpbWVuc2lvblZhbHVlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1kaW1UeXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb25WYWx1ZVR5cGUuVU5LTk9XTn1kaW1WYWx1ZSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltUGFyYW0oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1zdGF0aWMgc3RhcnREaW1lbnNpb25WYWx1ZShlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkRGltVHlwZSh0LG4pe3QuYWRkRmllbGRJbnQ4KDAsbixlLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uVmFsdWVUeXBlLlVOS05PV04pO31zdGF0aWMgYWRkRGltVmFsdWUoZSx0KXtlLmFkZEZpZWxkSW50NjQoMSx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZERpbVBhcmFtKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBlbmREaW1lbnNpb25WYWx1ZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRGltZW5zaW9uVmFsdWUoZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnREaW1lbnNpb25WYWx1ZShlKSxuLmFkZERpbVR5cGUoZSx0KSxuLmFkZERpbVZhbHVlKGUsciksbi5hZGREaW1QYXJhbShlLG8pLG4uZW5kRGltZW5zaW9uVmFsdWUoZSl9fXQuRGltZW5zaW9uVmFsdWU9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNUZW5zb3JUeXBlQW5kU2hhcGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvclR5cGVBbmRTaGFwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9ZWxlbVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUR9c2hhcGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5TaGFwZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFRlbnNvclR5cGVBbmRTaGFwZShlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkRWxlbVR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMCxuLGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkU2hhcGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGVuZFRlbnNvclR5cGVBbmRTaGFwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGVuc29yVHlwZUFuZFNoYXBlKGUsdCxyKXtyZXR1cm4gbi5zdGFydFRlbnNvclR5cGVBbmRTaGFwZShlKSxuLmFkZEVsZW1UeXBlKGUsdCksbi5hZGRTaGFwZShlLHIpLG4uZW5kVGVuc29yVHlwZUFuZFNoYXBlKGUpfX10LlRlbnNvclR5cGVBbmRTaGFwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc01hcFR5cGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01hcFR5cGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWtleVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUR9dmFsdWVUeXBlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRNYXBUeXBlKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRLZXlUeXBlKHQsbil7dC5hZGRGaWVsZEludDMyKDAsbixlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yRGF0YVR5cGUuVU5ERUZJTkVEKTt9c3RhdGljIGFkZFZhbHVlVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kTWFwVHlwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTWFwVHlwZShlLHQscil7cmV0dXJuIG4uc3RhcnRNYXBUeXBlKGUpLG4uYWRkS2V5VHlwZShlLHQpLG4uYWRkVmFsdWVUeXBlKGUsciksbi5lbmRNYXBUeXBlKGUpfX10Lk1hcFR5cGU9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNTZXF1ZW5jZVR5cGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NlcXVlbmNlVHlwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9ZWxlbVR5cGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFNlcXVlbmNlVHlwZShlKXtlLnN0YXJ0T2JqZWN0KDEpO31zdGF0aWMgYWRkRWxlbVR5cGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGVuZFNlcXVlbmNlVHlwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2VxdWVuY2VUeXBlKGUsdCl7cmV0dXJuIG4uc3RhcnRTZXF1ZW5jZVR5cGUoZSksbi5hZGRFbGVtVHlwZShlLHQpLG4uZW5kU2VxdWVuY2VUeXBlKGUpfX10LlNlcXVlbmNlVHlwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7KGUuZmJzfHwoZS5mYnM9e30pKS5FZGdlRW5kPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfW5vZGVJbmRleCgpe3JldHVybiB0aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MpfXNyY0FyZ0luZGV4KCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKzQpfWRzdEFyZ0luZGV4KCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKzgpfXN0YXRpYyBjcmVhdGVFZGdlRW5kKGUsdCxuLHIpe3JldHVybiBlLnByZXAoNCwxMiksZS53cml0ZUludDMyKHIpLGUud3JpdGVJbnQzMihuKSxlLndyaXRlSW50MzIodCksZS5vZmZzZXQoKX19O30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc05vZGVFZGdlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNOb2RlRWRnZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bm9kZUluZGV4KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MrZSk6MH1pbnB1dEVkZ2VzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5FZGdlRW5kKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSsxMip0LHRoaXMuYmIpOm51bGx9aW5wdXRFZGdlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1vdXRwdXRFZGdlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuRWRnZUVuZCkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrMTIqdCx0aGlzLmJiKTpudWxsfW91dHB1dEVkZ2VzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydE5vZGVFZGdlKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGROb2RlSW5kZXgoZSx0KXtlLmFkZEZpZWxkSW50MzIoMCx0LDApO31zdGF0aWMgYWRkSW5wdXRFZGdlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgc3RhcnRJbnB1dEVkZ2VzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3RvcigxMix0LDQpO31zdGF0aWMgYWRkT3V0cHV0RWRnZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIHN0YXJ0T3V0cHV0RWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDEyLHQsNCk7fXN0YXRpYyBlbmROb2RlRWRnZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTm9kZUVkZ2UoZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnROb2RlRWRnZShlKSxuLmFkZE5vZGVJbmRleChlLHQpLG4uYWRkSW5wdXRFZGdlcyhlLHIpLG4uYWRkT3V0cHV0RWRnZXMoZSxvKSxuLmVuZE5vZGVFZGdlKGUpfX10Lk5vZGVFZGdlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTm9kZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvbWFpbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXNpbmNlVmVyc2lvbigpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBlP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK2UpOjB9aW5kZXgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MrZSk6MH1vcFR5cGUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9dHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5Ob2RlVHlwZS5QcmltaXRpdmV9ZXhlY3V0aW9uUHJvdmlkZXJUeXBlKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWlucHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1pbnB1dHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW91dHB1dHMoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9b3V0cHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9YXR0cmlidXRlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkF0dHJpYnV0ZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1hdHRyaWJ1dGVzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1pbnB1dEFyZ0NvdW50cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzQqZSk6MH1pbnB1dEFyZ0NvdW50c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9aW5wdXRBcmdDb3VudHNBcnJheSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBlP25ldyBJbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1pbXBsaWNpdElucHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1pbXBsaWNpdElucHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0Tm9kZShlKXtlLnN0YXJ0T2JqZWN0KDEzKTt9c3RhdGljIGFkZE5hbWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkRG9tYWluKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBhZGRTaW5jZVZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50MzIoMyx0LDApO31zdGF0aWMgYWRkSW5kZXgoZSx0KXtlLmFkZEZpZWxkSW50MzIoNCx0LDApO31zdGF0aWMgYWRkT3BUeXBlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg1LHQsMCk7fXN0YXRpYyBhZGRUeXBlKHQsbil7dC5hZGRGaWVsZEludDMyKDYsbixlLmV4cGVyaW1lbnRhbC5mYnMuTm9kZVR5cGUuUHJpbWl0aXZlKTt9c3RhdGljIGFkZEV4ZWN1dGlvblByb3ZpZGVyVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoNyx0LDApO31zdGF0aWMgYWRkSW5wdXRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg4LHQsMCk7fXN0YXRpYyBjcmVhdGVJbnB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRPdXRwdXRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg5LHQsMCk7fXN0YXRpYyBjcmVhdGVPdXRwdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE91dHB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEF0dHJpYnV0ZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEwLHQsMCk7fXN0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZElucHV0QXJnQ291bnRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxMSx0LDApO31zdGF0aWMgY3JlYXRlSW5wdXRBcmdDb3VudHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQzMih0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dEFyZ0NvdW50c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkSW1wbGljaXRJbnB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEyLHQsMCk7fXN0YXRpYyBjcmVhdGVJbXBsaWNpdElucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbXBsaWNpdElucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgZW5kTm9kZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTm9kZShlLHQscixvLGkscyxhLHUsbCxjLHAsZCxmLGgpe3JldHVybiBuLnN0YXJ0Tm9kZShlKSxuLmFkZE5hbWUoZSx0KSxuLmFkZERvY1N0cmluZyhlLHIpLG4uYWRkRG9tYWluKGUsbyksbi5hZGRTaW5jZVZlcnNpb24oZSxpKSxuLmFkZEluZGV4KGUscyksbi5hZGRPcFR5cGUoZSxhKSxuLmFkZFR5cGUoZSx1KSxuLmFkZEV4ZWN1dGlvblByb3ZpZGVyVHlwZShlLGwpLG4uYWRkSW5wdXRzKGUsYyksbi5hZGRPdXRwdXRzKGUscCksbi5hZGRBdHRyaWJ1dGVzKGUsZCksbi5hZGRJbnB1dEFyZ0NvdW50cyhlLGYpLG4uYWRkSW1wbGljaXRJbnB1dHMoZSxoKSxuLmVuZE5vZGUoZSl9fXQuTm9kZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1ZhbHVlSW5mbyhlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVmFsdWVJbmZvKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1uYW1lKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9dHlwZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0VmFsdWVJbmZvKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGROYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZFR5cGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGVuZFZhbHVlSW5mbyhlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVmFsdWVJbmZvKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0VmFsdWVJbmZvKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGRUeXBlKGUsbyksbi5lbmRWYWx1ZUluZm8oZSl9fXQuVmFsdWVJbmZvPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVHlwZUluZm8oZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1R5cGVJbmZvKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1kZW5vdGF0aW9uKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9dmFsdWVUeXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3Bvcyt0KTplLmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm9WYWx1ZS5OT05FfXZhbHVlKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3VuaW9uKGUsdGhpcy5iYl9wb3MrdCk6bnVsbH1zdGF0aWMgc3RhcnRUeXBlSW5mbyhlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkRGVub3RhdGlvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkVmFsdWVUeXBlKHQsbil7dC5hZGRGaWVsZEludDgoMSxuLGUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mb1ZhbHVlLk5PTkUpO31zdGF0aWMgYWRkVmFsdWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGVuZFR5cGVJbmZvKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVUeXBlSW5mbyhlLHQscixvKXtyZXR1cm4gbi5zdGFydFR5cGVJbmZvKGUpLG4uYWRkRGVub3RhdGlvbihlLHQpLG4uYWRkVmFsdWVUeXBlKGUsciksbi5hZGRWYWx1ZShlLG8pLG4uZW5kVHlwZUluZm8oZSl9fXQuVHlwZUluZm89bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtjbGFzcyB0e2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNPcGVyYXRvclNldElkKGUsbil7cmV0dXJuIChufHxuZXcgdCkuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNPcGVyYXRvclNldElkKGUsbil7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwobnx8bmV3IHQpLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1kb21haW4oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH12ZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1zdGF0aWMgc3RhcnRPcGVyYXRvclNldElkKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGREb21haW4oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZFZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50NjQoMSx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGVuZE9wZXJhdG9yU2V0SWQoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU9wZXJhdG9yU2V0SWQoZSxuLHIpe3JldHVybiB0LnN0YXJ0T3BlcmF0b3JTZXRJZChlKSx0LmFkZERvbWFpbihlLG4pLHQuYWRkVmVyc2lvbihlLHIpLHQuZW5kT3BlcmF0b3JTZXRJZChlKX19ZS5PcGVyYXRvclNldElkPXQ7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVGVuc29yKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUZW5zb3IoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfW5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kaW1zKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KSs4KmUpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWRpbXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9ZGF0YVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyt0KTplLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yRGF0YVR5cGUuVU5ERUZJTkVEfXJhd0RhdGEoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KStlKTowfXJhd0RhdGFMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXJhd0RhdGFBcnJheSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP25ldyBVaW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1zdHJpbmdEYXRhKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfXN0cmluZ0RhdGFMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFRlbnNvcihlKXtlLnN0YXJ0T2JqZWN0KDYpO31zdGF0aWMgYWRkTmFtZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGREaW1zKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQubGVuZ3RoLDgpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50NjQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0LDgpO31zdGF0aWMgYWRkRGF0YVR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMyxuLGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkUmF3RGF0YShlLHQpe2UuYWRkRmllbGRPZmZzZXQoNCx0LDApO31zdGF0aWMgY3JlYXRlUmF3RGF0YVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoMSx0Lmxlbmd0aCwxKTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDgodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0UmF3RGF0YVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoMSx0LDEpO31zdGF0aWMgYWRkU3RyaW5nRGF0YShlLHQpe2UuYWRkRmllbGRPZmZzZXQoNSx0LDApO31zdGF0aWMgY3JlYXRlU3RyaW5nRGF0YVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTdHJpbmdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRUZW5zb3IoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVRlbnNvcihlLHQscixvLGkscyxhKXtyZXR1cm4gbi5zdGFydFRlbnNvcihlKSxuLmFkZE5hbWUoZSx0KSxuLmFkZERvY1N0cmluZyhlLHIpLG4uYWRkRGltcyhlLG8pLG4uYWRkRGF0YVR5cGUoZSxpKSxuLmFkZFJhd0RhdGEoZSxzKSxuLmFkZFN0cmluZ0RhdGEoZSxhKSxuLmVuZFRlbnNvcihlKX19dC5UZW5zb3I9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNTcGFyc2VUZW5zb3IoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZVRlbnNvcihlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9dmFsdWVzKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9aW5kaWNlcyh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWRpbXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRTcGFyc2VUZW5zb3IoZSl7ZS5zdGFydE9iamVjdCgzKTt9c3RhdGljIGFkZFZhbHVlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkSW5kaWNlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkRGltcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgY3JlYXRlRGltc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0Lmxlbmd0aCw4KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDY0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydERpbXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdCw4KTt9c3RhdGljIGVuZFNwYXJzZVRlbnNvcihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU3BhcnNlVGVuc29yKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0U3BhcnNlVGVuc29yKGUpLG4uYWRkVmFsdWVzKGUsdCksbi5hZGRJbmRpY2VzKGUsciksbi5hZGREaW1zKGUsbyksbi5lbmRTcGFyc2VUZW5zb3IoZSl9fXQuU3BhcnNlVGVuc29yPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzQXR0cmlidXRlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNBdHRyaWJ1dGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfW5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10eXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyt0KTplLmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlVHlwZS5VTkRFRklORUR9Zigpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBlP3RoaXMuYmIucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MrZSk6MH1pKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10KHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWcodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuR3JhcGgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1mbG9hdHMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzQqZSk6MH1mbG9hdHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWZsb2F0c0FycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIGU/bmV3IEZsb2F0MzJBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0K3RoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrZSksdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSkpOm51bGx9aW50cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9aW50c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RyaW5ncyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1zdHJpbmdzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH10ZW5zb3JzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfXRlbnNvcnNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWdyYXBocyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfWdyYXBoc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0QXR0cmlidXRlKGUpe2Uuc3RhcnRPYmplY3QoMTMpO31zdGF0aWMgYWRkTmFtZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGRUeXBlKHQsbil7dC5hZGRGaWVsZEludDMyKDIsbixlLmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkRihlLHQpe2UuYWRkRmllbGRGbG9hdDMyKDMsdCwwKTt9c3RhdGljIGFkZEkoZSx0KXtlLmFkZEZpZWxkSW50NjQoNCx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZFMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDUsdCwwKTt9c3RhdGljIGFkZFQoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDYsdCwwKTt9c3RhdGljIGFkZEcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDcsdCwwKTt9c3RhdGljIGFkZEZsb2F0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoOCx0LDApO31zdGF0aWMgY3JlYXRlRmxvYXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkRmxvYXQzMih0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRGbG9hdHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEludHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDksdCwwKTt9c3RhdGljIGNyZWF0ZUludHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdC5sZW5ndGgsOCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQ2NCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQsOCk7fXN0YXRpYyBhZGRTdHJpbmdzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxMCx0LDApO31zdGF0aWMgY3JlYXRlU3RyaW5nc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTdHJpbmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRUZW5zb3JzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxMSx0LDApO31zdGF0aWMgY3JlYXRlVGVuc29yc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRUZW5zb3JzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRHcmFwaHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEyLHQsMCk7fXN0YXRpYyBjcmVhdGVHcmFwaHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0R3JhcGhzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRBdHRyaWJ1dGUoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZShlLHQscixvLGkscyxhLHUsbCxjLHAsZCxmLGgpe3JldHVybiBuLnN0YXJ0QXR0cmlidXRlKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGRUeXBlKGUsbyksbi5hZGRGKGUsaSksbi5hZGRJKGUscyksbi5hZGRTKGUsYSksbi5hZGRUKGUsdSksbi5hZGRHKGUsbCksbi5hZGRGbG9hdHMoZSxjKSxuLmFkZEludHMoZSxwKSxuLmFkZFN0cmluZ3MoZSxkKSxuLmFkZFRlbnNvcnMoZSxmKSxuLmFkZEdyYXBocyhlLGgpLG4uZW5kQXR0cmlidXRlKGUpfX10LkF0dHJpYnV0ZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc0dyYXBoKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNHcmFwaChlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9aW5pdGlhbGl6ZXJzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9aW5pdGlhbGl6ZXJzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW5vZGVBcmdzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5WYWx1ZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9bm9kZUFyZ3NMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bm9kZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLk5vZGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9bm9kZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bWF4Tm9kZUluZGV4KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zK2UpOjB9bm9kZUVkZ2VzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuTm9kZUVkZ2UpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9bm9kZUVkZ2VzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1pbnB1dHMoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9aW5wdXRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1vdXRwdXRzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfW91dHB1dHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXNwYXJzZUluaXRpYWxpemVycyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlNwYXJzZVRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1zcGFyc2VJbml0aWFsaXplcnNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydEdyYXBoKGUpe2Uuc3RhcnRPYmplY3QoOCk7fXN0YXRpYyBhZGRJbml0aWFsaXplcnMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGNyZWF0ZUluaXRpYWxpemVyc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbml0aWFsaXplcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE5vZGVBcmdzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVOb2RlQXJnc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlQXJnc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkTm9kZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRNYXhOb2RlSW5kZXgoZSx0KXtlLmFkZEZpZWxkSW50MzIoMyx0LDApO31zdGF0aWMgYWRkTm9kZUVkZ2VzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg0LHQsMCk7fXN0YXRpYyBjcmVhdGVOb2RlRWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZUVkZ2VzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRJbnB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDUsdCwwKTt9c3RhdGljIGNyZWF0ZUlucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE91dHB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDYsdCwwKTt9c3RhdGljIGNyZWF0ZU91dHB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3V0cHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkU3BhcnNlSW5pdGlhbGl6ZXJzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg3LHQsMCk7fXN0YXRpYyBjcmVhdGVTcGFyc2VJbml0aWFsaXplcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0U3BhcnNlSW5pdGlhbGl6ZXJzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRHcmFwaChlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlR3JhcGgoZSx0LHIsbyxpLHMsYSx1LGwpe3JldHVybiBuLnN0YXJ0R3JhcGgoZSksbi5hZGRJbml0aWFsaXplcnMoZSx0KSxuLmFkZE5vZGVBcmdzKGUsciksbi5hZGROb2RlcyhlLG8pLG4uYWRkTWF4Tm9kZUluZGV4KGUsaSksbi5hZGROb2RlRWRnZXMoZSxzKSxuLmFkZElucHV0cyhlLGEpLG4uYWRkT3V0cHV0cyhlLHUpLG4uYWRkU3BhcnNlSW5pdGlhbGl6ZXJzKGUsbCksbi5lbmRHcmFwaChlKX19dC5HcmFwaD1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc01vZGVsKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNb2RlbChlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9aXJWZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1vcHNldEltcG9ydCh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuT3BlcmF0b3JTZXRJZCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1vcHNldEltcG9ydExlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1wcm9kdWNlck5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1wcm9kdWNlclZlcnNpb24oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9tYWluKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfW1vZGVsVmVyc2lvbigpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2UpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1ncmFwaCh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5HcmFwaCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWdyYXBoRG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXN0YXRpYyBzdGFydE1vZGVsKGUpe2Uuc3RhcnRPYmplY3QoOSk7fXN0YXRpYyBhZGRJclZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50NjQoMCx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZE9wc2V0SW1wb3J0KGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVPcHNldEltcG9ydFZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRPcHNldEltcG9ydFZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkUHJvZHVjZXJOYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBhZGRQcm9kdWNlclZlcnNpb24oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDMsdCwwKTt9c3RhdGljIGFkZERvbWFpbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoNCx0LDApO31zdGF0aWMgYWRkTW9kZWxWZXJzaW9uKGUsdCl7ZS5hZGRGaWVsZEludDY0KDUsdCxlLmNyZWF0ZUxvbmcoMCwwKSk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDYsdCwwKTt9c3RhdGljIGFkZEdyYXBoKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg3LHQsMCk7fXN0YXRpYyBhZGRHcmFwaERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoOCx0LDApO31zdGF0aWMgZW5kTW9kZWwoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU1vZGVsKGUsdCxyLG8saSxzLGEsdSxsLGMpe3JldHVybiBuLnN0YXJ0TW9kZWwoZSksbi5hZGRJclZlcnNpb24oZSx0KSxuLmFkZE9wc2V0SW1wb3J0KGUsciksbi5hZGRQcm9kdWNlck5hbWUoZSxvKSxuLmFkZFByb2R1Y2VyVmVyc2lvbihlLGkpLG4uYWRkRG9tYWluKGUscyksbi5hZGRNb2RlbFZlcnNpb24oZSxhKSxuLmFkZERvY1N0cmluZyhlLHUpLG4uYWRkR3JhcGgoZSxsKSxuLmFkZEdyYXBoRG9jU3RyaW5nKGUsYyksbi5lbmRNb2RlbChlKX19dC5Nb2RlbD1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2NsYXNzIHR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc0tlcm5lbENyZWF0ZUluZm9zKGUsbil7cmV0dXJuIChufHxuZXcgdCkuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNLZXJuZWxDcmVhdGVJbmZvcyhlLG4pe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKG58fG5ldyB0KS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bm9kZUluZGljZXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KSs0KmUpOjB9bm9kZUluZGljZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bm9kZUluZGljZXNBcnJheSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/bmV3IFVpbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1rZXJuZWxEZWZIYXNoZXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KSs4KmUpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWtlcm5lbERlZkhhc2hlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRLZXJuZWxDcmVhdGVJbmZvcyhlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkTm9kZUluZGljZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVJbmRpY2VzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50MzIodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZUluZGljZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEtlcm5lbERlZkhhc2hlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgY3JlYXRlS2VybmVsRGVmSGFzaGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQubGVuZ3RoLDgpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50NjQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0S2VybmVsRGVmSGFzaGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQsOCk7fXN0YXRpYyBlbmRLZXJuZWxDcmVhdGVJbmZvcyhlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlS2VybmVsQ3JlYXRlSW5mb3MoZSxuLHIpe3JldHVybiB0LnN0YXJ0S2VybmVsQ3JlYXRlSW5mb3MoZSksdC5hZGROb2RlSW5kaWNlcyhlLG4pLHQuYWRkS2VybmVsRGVmSGFzaGVzKGUsciksdC5lbmRLZXJuZWxDcmVhdGVJbmZvcyhlKX19ZS5LZXJuZWxDcmVhdGVJbmZvcz10O30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1N1YkdyYXBoU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTdWJHcmFwaFNlc3Npb25TdGF0ZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9Z3JhcGhJZChlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXNlc3Npb25TdGF0ZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlNlc3Npb25TdGF0ZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRHcmFwaElkKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRTZXNzaW9uU3RhdGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGVuZFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpe2xldCB0PWUuZW5kT2JqZWN0KCk7cmV0dXJuIGUucmVxdWlyZWRGaWVsZCh0LDQpLHR9c3RhdGljIGNyZWF0ZVN1YkdyYXBoU2Vzc2lvblN0YXRlKGUsdCxyKXtyZXR1cm4gbi5zdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpLG4uYWRkR3JhcGhJZChlLHQpLG4uYWRkU2Vzc2lvblN0YXRlKGUsciksbi5lbmRTdWJHcmFwaFNlc3Npb25TdGF0ZShlKX19dC5TdWJHcmFwaFNlc3Npb25TdGF0ZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1Nlc3Npb25TdGF0ZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1rZXJuZWxzKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuS2VybmVsQ3JlYXRlSW5mb3MpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdWJHcmFwaFNlc3Npb25TdGF0ZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlN1YkdyYXBoU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfXN1YkdyYXBoU2Vzc2lvblN0YXRlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRTZXNzaW9uU3RhdGUoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZEtlcm5lbHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZFN1YkdyYXBoU2Vzc2lvblN0YXRlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgY3JlYXRlU3ViR3JhcGhTZXNzaW9uU3RhdGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgZW5kU2Vzc2lvblN0YXRlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTZXNzaW9uU3RhdGUoZSx0LHIpe3JldHVybiBuLnN0YXJ0U2Vzc2lvblN0YXRlKGUpLG4uYWRkS2VybmVscyhlLHQpLG4uYWRkU3ViR3JhcGhTZXNzaW9uU3RhdGVzKGUsciksbi5lbmRTZXNzaW9uU3RhdGUoZSl9fXQuU2Vzc2lvblN0YXRlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzSW5mZXJlbmNlU2Vzc2lvbihlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSW5mZXJlbmNlU2Vzc2lvbihlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGJ1ZmZlckhhc0lkZW50aWZpZXIoZSl7cmV0dXJuIGUuX19oYXNfaWRlbnRpZmllcigiT1JUTSIpfW9ydFZlcnNpb24oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1tb2RlbCh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLk1vZGVsKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c2Vzc2lvblN0YXRlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkT3J0VmVyc2lvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkTW9kZWwoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgZW5kSW5mZXJlbmNlU2Vzc2lvbihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgZmluaXNoSW5mZXJlbmNlU2Vzc2lvbkJ1ZmZlcihlLHQpe2UuZmluaXNoKHQsIk9SVE0iKTt9c3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZEluZmVyZW5jZVNlc3Npb25CdWZmZXIoZSx0KXtlLmZpbmlzaCh0LCJPUlRNIiwhMCk7fXN0YXRpYyBjcmVhdGVJbmZlcmVuY2VTZXNzaW9uKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihlKSxuLmFkZE9ydFZlcnNpb24oZSx0KSxuLmFkZE1vZGVsKGUsciksbi5hZGRTZXNzaW9uU3RhdGUoZSxvKSxuLmVuZEluZmVyZW5jZVNlc3Npb24oZSl9fXQuSW5mZXJlbmNlU2Vzc2lvbj1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKTt9LDE3MjM6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk9ubnhqc1Nlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMjIzNSksbz1uKDkyNDApO3QuT25ueGpzU2Vzc2lvbkhhbmRsZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5pbnB1dE5hbWVzPXRoaXMuc2Vzc2lvbi5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXM9dGhpcy5zZXNzaW9uLm91dHB1dE5hbWVzO31hc3luYyBkaXNwb3NlKCl7fWFzeW5jIHJ1bihlLHQsbil7Y29uc3QgaT1uZXcgTWFwO2Zvcihjb25zdCB0IGluIGUpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSx0KSl7Y29uc3Qgbj1lW3RdO2kuc2V0KHQsbmV3IG8uVGVuc29yKG4uZGltcyxuLnR5cGUsdm9pZCAwLHZvaWQgMCxuLmRhdGEpKTt9Y29uc3Qgcz1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKGkpLGE9e307cmV0dXJuIHMuZm9yRWFjaCgoKGUsdCk9PnthW3RdPW5ldyByLlRlbnNvcihlLnR5cGUsZS5kYXRhLGUuZGltcyk7fSkpLGF9c3RhcnRQcm9maWxpbmcoKXt0aGlzLnNlc3Npb24uc3RhcnRQcm9maWxpbmcoKTt9ZW5kUHJvZmlsaW5nKCl7dGhpcy5zZXNzaW9uLmVuZFByb2ZpbGluZygpO319O30sNjAyNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU2Vzc2lvbj12b2lkIDA7Y29uc3Qgcj1uKDcwNjcpLG89bigxMjk2KSxpPW4oMTk3NSkscz1uKDY0OTYpLGE9bigxMzE1KSx1PW4oMTc0NSk7dC5TZXNzaW9uPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3RoaXMuX2luaXRpYWxpemVkPSExLHRoaXMuYmFja2VuZEhpbnQ9ZS5iYWNrZW5kSGludCx0aGlzLnByb2ZpbGVyPWEuUHJvZmlsZXIuY3JlYXRlKGUucHJvZmlsZXIpLHRoaXMuY29udGV4dD17cHJvZmlsZXI6dGhpcy5wcm9maWxlcixncmFwaElucHV0VHlwZXM6W10sZ3JhcGhJbnB1dERpbXM6W119O31nZXQgaW5wdXROYW1lcygpe3JldHVybiB0aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dE5hbWVzKCl9Z2V0IG91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX21vZGVsLmdyYXBoLmdldE91dHB1dE5hbWVzKCl9c3RhcnRQcm9maWxpbmcoKXt0aGlzLnByb2ZpbGVyLnN0YXJ0KCk7fWVuZFByb2ZpbGluZygpe3RoaXMucHJvZmlsZXIuc3RvcCgpO31hc3luYyBsb2FkTW9kZWwoZSx0LG4pe2F3YWl0IHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJTZXNzaW9uLmxvYWRNb2RlbCIsKGFzeW5jKCk9Pntjb25zdCBzPWF3YWl0KDAsIGkucmVzb2x2ZUJhY2tlbmQpKHRoaXMuYmFja2VuZEhpbnQpO2lmKHRoaXMuc2Vzc2lvbkhhbmRsZXI9cy5jcmVhdGVTZXNzaW9uSGFuZGxlcih0aGlzLmNvbnRleHQpLHRoaXMuX21vZGVsPW5ldyB1Lk1vZGVsLCJzdHJpbmciPT10eXBlb2YgZSl7Y29uc3QgdD1lLmVuZHNXaXRoKCIub3J0Iik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb25zJiZwcm9jZXNzLnZlcnNpb25zLm5vZGUpe2NvbnN0IG49YXdhaXQoMCwgby5wcm9taXNpZnkpKHIucmVhZEZpbGUpKGUpO3RoaXMuaW5pdGlhbGl6ZShuLHQpO31lbHNlIHtjb25zdCBuPWF3YWl0IGZldGNoKGUpLHI9YXdhaXQgbi5hcnJheUJ1ZmZlcigpO3RoaXMuaW5pdGlhbGl6ZShuZXcgVWludDhBcnJheShyKSx0KTt9fWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXRoaXMuaW5pdGlhbGl6ZShlKTtlbHNlIHtjb25zdCByPW5ldyBVaW50OEFycmF5KGUsdHx8MCxufHxlLmJ5dGVMZW5ndGgpO3RoaXMuaW5pdGlhbGl6ZShyKTt9fSkpO31pbml0aWFsaXplKGUsdCl7aWYodGhpcy5faW5pdGlhbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJhbHJlYWR5IGluaXRpYWxpemVkIik7dGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24uaW5pdGlhbGl6ZSIsKCgpPT57Y29uc3Qgbj10aGlzLnNlc3Npb25IYW5kbGVyLnRyYW5zZm9ybUdyYXBoP3RoaXMuc2Vzc2lvbkhhbmRsZXI6dm9pZCAwO3RoaXMuX21vZGVsLmxvYWQoZSxuLHQpLHRoaXMuc2Vzc2lvbkhhbmRsZXIub25HcmFwaEluaXRpYWxpemVkJiZ0aGlzLnNlc3Npb25IYW5kbGVyLm9uR3JhcGhJbml0aWFsaXplZCh0aGlzLl9tb2RlbC5ncmFwaCksdGhpcy5pbml0aWFsaXplT3BzKHRoaXMuX21vZGVsLmdyYXBoKSx0aGlzLl9leGVjdXRpb25QbGFuPW5ldyBzLkV4ZWN1dGlvblBsYW4odGhpcy5fbW9kZWwuZ3JhcGgsdGhpcy5fb3BzLHRoaXMucHJvZmlsZXIpO30pKSx0aGlzLl9pbml0aWFsaXplZD0hMDt9YXN5bmMgcnVuKGUpe2lmKCF0aGlzLl9pbml0aWFsaXplZCl0aHJvdyBuZXcgRXJyb3IoInNlc3Npb24gbm90IGluaXRpYWxpemVkIHlldCIpO3JldHVybiB0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiU2Vzc2lvbi5ydW4iLChhc3luYygpPT57Y29uc3QgdD10aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlSW5wdXRzKGUpLG49YXdhaXQgdGhpcy5fZXhlY3V0aW9uUGxhbi5leGVjdXRlKHRoaXMuc2Vzc2lvbkhhbmRsZXIsdCk7cmV0dXJuIHRoaXMuY3JlYXRlT3V0cHV0KG4pfSkpfW5vcm1hbGl6ZUFuZFZhbGlkYXRlSW5wdXRzKGUpe2NvbnN0IHQ9dGhpcy5fbW9kZWwuZ3JhcGguZ2V0SW5wdXROYW1lcygpO2lmKEFycmF5LmlzQXJyYXkoZSkpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgaW5wdXQgYXJyYXkgbGVuZ3RoOiBleHBlY3RlZCAke3QubGVuZ3RofSBidXQgZ290ICR7ZS5sZW5ndGh9YCl9ZWxzZSB7aWYoZS5zaXplIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgaW5wdXQgbWFwIHNpemU6IGV4cGVjdGVkICR7dC5sZW5ndGh9IGJ1dCBnb3QgJHtlLnNpemV9YCk7Y29uc3Qgbj1uZXcgQXJyYXkoZS5zaXplKTtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtjb25zdCBpPWUuZ2V0KHRbb10pO2lmKCFpKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBpbnB1dCB0ZW5zb3IgZm9yOiAnJHtuYW1lfSdgKTtuW3IrK109aTt9ZT1uO31pZih0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzJiYwIT09dGhpcy5jb250ZXh0LmdyYXBoSW5wdXRUeXBlcy5sZW5ndGgmJnRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcyYmMCE9PXRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcy5sZW5ndGgpdGhpcy52YWxpZGF0ZUlucHV0VGVuc29yRGltcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMsZSwhMSk7ZWxzZSB7Y29uc3QgdD10aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dEluZGljZXMoKSxuPXRoaXMuX21vZGVsLmdyYXBoLmdldFZhbHVlcygpLHI9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoOysrbyl7Y29uc3QgaT1uW3Rbb11dO3Jbb109aS50eXBlLnNoYXBlLmRpbXMsdGhpcy5jb250ZXh0LmdyYXBoSW5wdXRUeXBlcy5wdXNoKGkudHlwZS50ZW5zb3JUeXBlKSx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMucHVzaChlW29dLmRpbXMpO310aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JEaW1zKHIsZSwhMCk7fXJldHVybiB0aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JUeXBlcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLGUpLGV9dmFsaWRhdGVJbnB1dFRlbnNvclR5cGVzKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9ZVtuXSxvPXRbbl0udHlwZTtpZihyIT09byl0aHJvdyBuZXcgRXJyb3IoYGlucHV0IHRlbnNvclske259XSBjaGVjayBmYWlsZWQ6IGV4cGVjdGVkIHR5cGUgJyR7cn0nIGJ1dCBnb3QgJHtvfWApfX12YWxpZGF0ZUlucHV0VGVuc29yRGltcyhlLHQsbil7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IG89ZVtyXSxpPXRbcl0uZGltcztpZighdGhpcy5jb21wYXJlVGVuc29yRGltcyhvLGksbikpdGhyb3cgbmV3IEVycm9yKGBpbnB1dCB0ZW5zb3JbJHtyfV0gY2hlY2sgZmFpbGVkOiBleHBlY3RlZCBzaGFwZSAnWyR7by5qb2luKCIsIil9XScgYnV0IGdvdCBbJHtpLmpvaW4oIiwiKX1dYCl9fWNvbXBhcmVUZW5zb3JEaW1zKGUsdCxuKXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiAhMTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoOysrcilpZihlW3JdIT09dFtyXSYmKCFufHwwIT09ZVtyXSkpcmV0dXJuICExO3JldHVybiAhMH1jcmVhdGVPdXRwdXQoZSl7Y29uc3QgdD10aGlzLl9tb2RlbC5ncmFwaC5nZXRPdXRwdXROYW1lcygpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBudW1iZXIgb2Ygb3V0cHV0cyBkbyBub3QgbWF0Y2ggbnVtYmVyIG9mIGdlbmVyYXRlZCBvdXRwdXRzIik7Y29uc3Qgbj1uZXcgTWFwO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7KytyKW4uc2V0KHRbcl0sZVtyXSk7cmV0dXJuIG59aW5pdGlhbGl6ZU9wcyhlKXtjb25zdCB0PWUuZ2V0Tm9kZXMoKTt0aGlzLl9vcHM9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLl9vcHNbbl09dGhpcy5zZXNzaW9uSGFuZGxlci5yZXNvbHZlKHRbbl0sdGhpcy5fbW9kZWwub3BzZXRzLGUpO319O30sOTI0MDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGVuc29yPXZvaWQgMDtjb25zdCBvPW4oMzQ0MiksaT1yKG4oMTU4MykpLHM9big1MTI3KSxhPW4oMjQ0NiksdT1uKDcyNzMpO3ZhciBsPXMub25ueHJ1bnRpbWUuZXhwZXJpbWVudGFsLmZicztjbGFzcyBje2dldCBkYXRhKCl7aWYodm9pZCAwPT09dGhpcy5jYWNoZSl7Y29uc3QgZT10aGlzLmRhdGFQcm92aWRlcih0aGlzLmRhdGFJZCk7aWYoZS5sZW5ndGghPT10aGlzLnNpemUpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggb2YgZGF0YSBwcm92aWRlZCBieSB0aGUgRGF0YSBQcm92aWRlciBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgZGltcyBvZiB0aGlzIFRlbnNvci4iKTt0aGlzLmNhY2hlPWU7fXJldHVybiB0aGlzLmNhY2hlfWdldCBzdHJpbmdEYXRhKCl7aWYoInN0cmluZyIhPT10aGlzLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSB0eXBlIGlzIG5vdCBzdHJpbmciKTtyZXR1cm4gdGhpcy5kYXRhfWdldCBpbnRlZ2VyRGF0YSgpe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UidWludDgiOmNhc2UiaW50OCI6Y2FzZSJ1aW50MTYiOmNhc2UiaW50MTYiOmNhc2UiaW50MzIiOmNhc2UidWludDMyIjpjYXNlImJvb2wiOnJldHVybiB0aGlzLmRhdGE7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IGludGVnZXIgKHVpbnQ4LCBpbnQ4LCB1aW50MTYsIGludDE2LCBpbnQzMiwgdWludDMyLCBib29sKSIpfX1nZXQgZmxvYXREYXRhKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOnJldHVybiB0aGlzLmRhdGE7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IGZsb2F0IChmbG9hdDMyLCBmbG9hdDY0KSIpfX1nZXQgbnVtYmVyRGF0YSgpe2lmKCJzdHJpbmciIT09dGhpcy50eXBlKXJldHVybiB0aGlzLmRhdGE7dGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZSBjYW5ub3QgYmUgbm9uLW51bWJlciAoc3RyaW5nKSIpfWdldChlKXtyZXR1cm4gdGhpcy5kYXRhW3UuU2hhcGVVdGlsLmluZGljZXNUb09mZnNldChlLHRoaXMuc3RyaWRlcyldfXNldChlLHQpe3RoaXMuZGF0YVt1LlNoYXBlVXRpbC5pbmRpY2VzVG9PZmZzZXQoZSx0aGlzLnN0cmlkZXMpXT10O31hc3luYyBnZXREYXRhKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuY2FjaGUmJih0aGlzLmNhY2hlPWF3YWl0IHRoaXMuYXN5bmNEYXRhUHJvdmlkZXIodGhpcy5kYXRhSWQpKSx0aGlzLmNhY2hlfWdldCBzdHJpZGVzKCl7cmV0dXJuIHRoaXMuX3N0cmlkZXN8fCh0aGlzLl9zdHJpZGVzPXUuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKHRoaXMuZGltcykpLHRoaXMuX3N0cmlkZXN9Y29uc3RydWN0b3IoZSx0LG4scixpLHM9by5HdWlkLmNyZWF0ZSgpKXt0aGlzLmRpbXM9ZSx0aGlzLnR5cGU9dCx0aGlzLmRhdGFQcm92aWRlcj1uLHRoaXMuYXN5bmNEYXRhUHJvdmlkZXI9cix0aGlzLmNhY2hlPWksdGhpcy5kYXRhSWQ9cyx0aGlzLnNpemU9dS5TaGFwZVV0aWwudmFsaWRhdGVEaW1zQW5kQ2FsY1NpemUoZSk7Y29uc3QgYT10aGlzLnNpemUsbD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yJiZ2b2lkIDA9PT1pO2lmKHZvaWQgMCE9PWkmJmkubGVuZ3RoIT09YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5wdXQgZGltcyBkb2Vzbid0IG1hdGNoIGRhdGEgbGVuZ3RoLiIpO2lmKCJzdHJpbmciPT09dCl7aWYoISh2b2lkIDA9PT1pfHxBcnJheS5pc0FycmF5KGkpJiZpLmV2ZXJ5KChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FjaGUgc2hvdWxkIGJlIGEgc3RyaW5nIGFycmF5Iik7bCYmKHRoaXMuY2FjaGU9bmV3IEFycmF5KGEpKTt9ZWxzZSB7aWYodm9pZCAwIT09aSl7Y29uc3QgZT1kKHQpO2lmKCEoaSBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoYGNhY2hlIHNob3VsZCBiZSB0eXBlICR7ZS5uYW1lfWApfWlmKGwpe2NvbnN0IGU9bmV3IEFycmF5QnVmZmVyKGEqZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiYm9vbCI6Y2FzZSJpbnQ4IjpjYXNlInVpbnQ4IjpyZXR1cm4gMTtjYXNlImludDE2IjpjYXNlInVpbnQxNiI6cmV0dXJuIDI7Y2FzZSJpbnQzMiI6Y2FzZSJ1aW50MzIiOmNhc2UiZmxvYXQzMiI6cmV0dXJuIDQ7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gODtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGNhbGN1bGF0ZSBzaXplb2YoKSBvbiB0eXBlICR7ZX1gKX19KHQpKTt0aGlzLmNhY2hlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyhkKHQpKShlKX0oZSx0KTt9fX1zdGF0aWMgZnJvbVByb3RvKGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGNvbnN0cnVjdCBWYWx1ZSBmcm9tIGFuIGVtcHR5IHRlbnNvciIpO2NvbnN0IHQ9dS5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZS5kYXRhVHlwZSksbj11LlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbVByb3RvKGUuZGltcykscj1uZXcgYyhuLHQpO2lmKCJzdHJpbmciPT09dCllLnN0cmluZ0RhdGEuZm9yRWFjaCgoKGUsdCk9PntyLmRhdGFbdF09KDAsIHUuZGVjb2RlVXRmOFN0cmluZykoZSk7fSkpO2Vsc2UgaWYoZS5yYXdEYXRhJiYibnVtYmVyIj09dHlwZW9mIGUucmF3RGF0YS5ieXRlTGVuZ3RoJiZlLnJhd0RhdGEuYnl0ZUxlbmd0aD4wKXtjb25zdCB0PXIuZGF0YSxuPW5ldyBEYXRhVmlldyhlLnJhd0RhdGEuYnVmZmVyLGUucmF3RGF0YS5ieXRlT2Zmc2V0LGUucmF3RGF0YS5ieXRlTGVuZ3RoKSxvPXAoZS5kYXRhVHlwZSksaT1lLnJhd0RhdGEuYnl0ZUxlbmd0aC9vO2lmKGUucmF3RGF0YS5ieXRlTGVuZ3RoJW8hPTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJ1ZmZlciBsZW5ndGgiKTtpZih0Lmxlbmd0aCE9PWkpdGhyb3cgbmV3IEVycm9yKCJidWZmZXIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKGxldCByPTA7cjxpO3IrKyl7Y29uc3QgaT1oKG4sZS5kYXRhVHlwZSxyKm8pO3Rbcl09aTt9fWVsc2Uge2xldCB0O3N3aXRjaChlLmRhdGFUeXBlKXtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDp0PWUuZmxvYXREYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6dD1lLmludDMyRGF0YTticmVhaztjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDp0PWUuaW50NjREYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTp0PWUuZG91YmxlRGF0YTticmVhaztjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnQ9ZS51aW50NjREYXRhO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnNwZWNpZmljIGVycm9yIil9aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImZhaWxlZCB0byBwb3B1bGF0ZSBkYXRhIGZyb20gYSB0ZW5zb3Jwcm90byB2YWx1ZSIpO2NvbnN0IG49ci5kYXRhO2lmKG4ubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhcnJheSBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgbz10W3JdO2kuZGVmYXVsdC5pc0xvbmcobyk/bltyXT1mKG8sZS5kYXRhVHlwZSk6bltyXT1vO319cmV0dXJuIHJ9c3RhdGljIGZyb21EYXRhKGUsdCxuKXtyZXR1cm4gbmV3IGModCxuLHZvaWQgMCx2b2lkIDAsZSl9c3RhdGljIGZyb21PcnRUZW5zb3IoZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgY29uc3RydWN0IFZhbHVlIGZyb20gYW4gZW1wdHkgdGVuc29yIik7Y29uc3QgdD11LlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChlKSxuPXUuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGUuZGF0YVR5cGUoKSkscj1uZXcgYyh0LG4pO2lmKCJzdHJpbmciPT09bilmb3IobGV0IHQ9MDt0PGUuc3RyaW5nRGF0YUxlbmd0aCgpO3QrKylyLmRhdGFbdF09ZS5zdHJpbmdEYXRhKHQpO2Vsc2UgaWYoZS5yYXdEYXRhQXJyYXkoKSYmIm51bWJlciI9PXR5cGVvZiBlLnJhd0RhdGFMZW5ndGgoKSYmZS5yYXdEYXRhTGVuZ3RoKCk+MCl7Y29uc3QgdD1yLmRhdGEsbj1uZXcgRGF0YVZpZXcoZS5yYXdEYXRhQXJyYXkoKS5idWZmZXIsZS5yYXdEYXRhQXJyYXkoKS5ieXRlT2Zmc2V0LGUucmF3RGF0YUxlbmd0aCgpKSxvPXAoZS5kYXRhVHlwZSgpKSxpPWUucmF3RGF0YUxlbmd0aCgpL287aWYoZS5yYXdEYXRhTGVuZ3RoKCklbyE9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYnVmZmVyIGxlbmd0aCIpO2lmKHQubGVuZ3RoIT09aSl0aHJvdyBuZXcgRXJyb3IoImJ1ZmZlciBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHI9MDtyPGk7cisrKXtjb25zdCBpPWgobixlLmRhdGFUeXBlKCkscipvKTt0W3JdPWk7fX1yZXR1cm4gcn19ZnVuY3Rpb24gcChlKXtzd2l0Y2goZSl7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOnJldHVybiAxO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjpyZXR1cm4gMjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuIDQ7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDpyZXR1cm4gODtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGNhbGN1bGF0ZSBzaXplb2YoKSBvbiB0eXBlICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW2VdfWApfX1mdW5jdGlvbiBkKGUpe3N3aXRjaChlKXtjYXNlImJvb2wiOmNhc2UidWludDgiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiaW50OCI6cmV0dXJuIEludDhBcnJheTtjYXNlImludDE2IjpyZXR1cm4gSW50MTZBcnJheTtjYXNlInVpbnQxNiI6cmV0dXJuIFVpbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5zcGVjaWZpZWQgZXJyb3IiKX19ZnVuY3Rpb24gZihlLHQpe2lmKHQ9PT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjR8fHQ9PT1sLlRlbnNvckRhdGFUeXBlLklOVDY0KXtpZihlLmdyZWF0ZXJUaGFuT3JFcXVhbCgyMTQ3NDgzNjQ4KXx8ZS5sZXNzVGhhbigtMjE0NzQ4MzY0OCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW50NjQgaXMgbm90IHN1cHBvcnRlZCIpfWVsc2Uge2lmKHQhPT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyJiZ0IT09bC5UZW5zb3JEYXRhVHlwZS5VSU5UMzImJnQhPT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0JiZ0IT09bC5UZW5zb3JEYXRhVHlwZS5VSU5UNjQpdGhyb3cgbmV3IFR5cGVFcnJvcihgbm90IGEgTE9ORyB0eXBlOiAke2Eub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVt0XX1gKTtpZihlLmdyZWF0ZXJUaGFuT3JFcXVhbCg0Mjk0OTY3Mjk2KXx8ZS5sZXNzVGhhbigwKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ1aW50NjQgaXMgbm90IHN1cHBvcnRlZCIpfXJldHVybiBlLnRvTnVtYmVyKCl9ZnVuY3Rpb24gaChlLHQsbil7c3dpdGNoKHQpe2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuIGUuZ2V0VWludDgobik7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODpyZXR1cm4gZS5nZXRJbnQ4KG4pO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4gZS5nZXRVaW50MTYobiwhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6cmV0dXJuIGUuZ2V0SW50MTYobiwhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRkxPQVQ6cmV0dXJuIGUuZ2V0RmxvYXQzMihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4gZS5nZXRJbnQzMihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuIGUuZ2V0VWludDMyKG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0OnJldHVybiBmKGkuZGVmYXVsdC5mcm9tQml0cyhlLmdldFVpbnQzMihuLCEwKSxlLmdldFVpbnQzMihuKzQsITApLCExKSx0KTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU6cmV0dXJuIGUuZ2V0RmxvYXQ2NChuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuIGYoaS5kZWZhdWx0LmZyb21CaXRzKGUuZ2V0VWludDMyKG4sITApLGUuZ2V0VWludDMyKG4rNCwhMCksITApLHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVhZCBmcm9tIERhdGFWaWV3IGZvciB0eXBlICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW3RdfWApfX10LlRlbnNvcj1jO30sNzI3MzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVjb2RlVXRmOFN0cmluZz10Lk1BWF9DTElQPXQuTUlOX0NMSVA9dC5Qb29sQ29udlV0aWw9dC5SZWR1Y2VVdGlsPXQuU3BsaXRVdGlsPXQuTWF0aFV0aWw9dC5TaGFwZVV0aWw9dC5Mb25nVXRpbD10LlByb3RvVXRpbD10LkdlbW1VdGlsPXQuYXJyYXlDb3B5SGVscGVyPXQuQnJvYWRjYXN0VXRpbD10Lk1hdE11bFV0aWw9dC5BcnJheVV0aWw9dC5hc3NlcnQ9dC5jaGVja0lucHV0c1NoYXBlPXZvaWQgMDtjb25zdCBvPW4oNTY4NiksaT1yKG4oMTU4MykpLHM9bigyNDQ2KSxhPW4oOTI0MCk7dC5jaGVja0lucHV0c1NoYXBlPWZ1bmN0aW9uKGUsLi4udCl7aWYoIWV8fGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuICExO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKCFlW25dLmRpbXN8fGVbbl0uZGltcy5sZW5ndGghPT10W25dKXJldHVybiAhMTtyZXR1cm4gITB9LHQuYXNzZXJ0PWZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmciPT10eXBlb2YgdD90OnQoKSl9LHQuQXJyYXlVdGlsPWNsYXNze3N0YXRpYyBhcnJheXNFcXVhbChlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuICExO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKGVbbl0hPT10W25dKXJldHVybiAhMTtyZXR1cm4gITB9fTtjbGFzcyB1e3N0YXRpYyBwcmVwcm9jZXNzSW5wdXRTaGFwZXMoZSx0KXtyZXR1cm4gWzE9PT1lLmxlbmd0aD9bMSxlWzBdXTplLDE9PT10Lmxlbmd0aD9bdFswXSwxXTp0XX1zdGF0aWMgcG9zdHByb2Nlc3NPdXRwdXRTaGFwZShlLHQsbil7MT09PXQmJmUuc3BsaWNlKGUubGVuZ3RoLTIsMSksMT09PW4mJmUucG9wKCk7fXN0YXRpYyBjYWxjTWF0TXVsU2hhcGUoZSx0KXtyZXR1cm4gZVsxXSE9PXRbMF0/dm9pZCAwOltlWzBdLHRbMV1dfX10Lk1hdE11bFV0aWw9dTtjbGFzcyBse3N0YXRpYyBjYWxjU2hhcGUoZSx0LG49ITEpe2NvbnN0IHI9ZS5sZW5ndGgsbz10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gdDtpZigwPT09bylyZXR1cm4gZTtjb25zdCBpPU1hdGgubWF4KGUubGVuZ3RoLHQubGVuZ3RoKSxzPW5ldyBBcnJheShpKTtpZihuKXtpZihyPDJ8fG88MilyZXR1cm47Y29uc3Qgbj11LmNhbGNNYXRNdWxTaGFwZShbZVtyLTJdLGVbci0xXV0sW3Rbby0yXSx0W28tMV1dKTtpZih2b2lkIDA9PT1uKXJldHVybjtbc1tpLTJdLHNbaS0xXV09bjt9Zm9yKGxldCBhPW4/MzoxO2E8PWk7YSsrKXtjb25zdCBuPXItYTwwPzE6ZVtyLWFdLHU9by1hPDA/MTp0W28tYV07aWYobiE9PXUmJm4+MSYmdT4xKXJldHVybjtzW2ktYV09TWF0aC5tYXgobix1KTt9cmV0dXJuIHN9c3RhdGljIGluZGV4KGUsdCl7Y29uc3Qgbj1uZXcgQXJyYXkodC5sZW5ndGgpO3JldHVybiBsLmZpbGxJbmRleChlLHQsbiksbn1zdGF0aWMgZmlsbEluZGV4KGUsdCxuKXtjb25zdCByPWUubGVuZ3RoLXQubGVuZ3RoO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKW5bb109ZVtyK29dJXRbb107fXN0YXRpYyBjYWxjKGUsdCxuLHIsbyl7Y29uc3QgaT1sLmNhbGNTaGFwZShlLmRpbXMsdC5kaW1zKTtpZihpKXtpZihyJiYhZC5hcmVFcXVhbChpLGUuZGltcykpcmV0dXJuO2NvbnN0IHM9ZC5zaXplKGkpLHU9cj9lOm5ldyBhLlRlbnNvcihpLG98fGUudHlwZSk7aWYoMD09PWkubGVuZ3RoKXUuc2V0KFtdLG4oZS5nZXQoW10pLHQuZ2V0KFtdKSkpO2Vsc2Uge2NvbnN0IHI9bmV3IEFycmF5KGkubGVuZ3RoKSxvPW5ldyBBcnJheShlLmRpbXMubGVuZ3RoKSxhPW5ldyBBcnJheSh0LmRpbXMubGVuZ3RoKTtsZXQgYyxwPTAsZD0wLGY9ITEsaD0hMTswPT09ZS5kaW1zLmxlbmd0aCYmKHA9ZS5nZXQoW10pLGY9ITApLDA9PT10LmRpbXMubGVuZ3RoJiYoZD10LmdldChbXSksaD0hMCk7Zm9yKGxldCBnPTA7ZzxzO2crKyl7Yz1nO2ZvcihsZXQgZT1pLmxlbmd0aC0xO2U+PTA7ZS0tKXJbZV09YyVpW2VdLGM9TWF0aC5mbG9vcihjL2lbZV0pO2Z8fChsLmZpbGxJbmRleChyLGUuZGltcyxvKSxwPWUuZ2V0KG8pKSxofHwobC5maWxsSW5kZXgocix0LmRpbXMsYSksZD10LmdldChhKSksdS5zZXQocixuKHAsZCkpO319cmV0dXJuIHV9fXN0YXRpYyBpc1ZhbGlkQnJvYWRjYXN0KGUsdCl7Y29uc3Qgbj1lLmxlbmd0aCxyPXQubGVuZ3RoO2lmKG4+cilyZXR1cm4gITE7Zm9yKGxldCBvPTE7bzw9bjtvKyspaWYoMSE9PWVbbi1vXSYmZVtuLW9dIT09dFtyLW9dKXJldHVybiAhMTtyZXR1cm4gITB9c3RhdGljIGdldEJyb2FkY2FzdERpbXMoZSx0KXtjb25zdCBuPWUubGVuZ3RoLHI9W107Zm9yKGxldCBvPTA7bzxuO28rKyl7Y29uc3QgaT1uLTEtbyxzPWVbaV18fDE7KHRbdC5sZW5ndGgtMS1vXXx8MSk+MSYmMT09PXMmJnIudW5zaGlmdChpKTt9cmV0dXJuIHJ9fXQuQnJvYWRjYXN0VXRpbD1sLHQuYXJyYXlDb3B5SGVscGVyPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBpPTA7aTxvO2krKyllW24raV09dFtyK2ldO30sdC5HZW1tVXRpbD1jbGFzc3tzdGF0aWMgZ2V0U2hhcGVPZkdlbW1SZXN1bHQoZSx0LG4scixvKXtpZigyIT09ZS5sZW5ndGh8fDIhPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNoYXBlIG5lZWQgdG8gYmUgb2Ygc2l6ZSAyIik7bGV0IGkscyxhO3Q/KGk9ZVsxXSxzPWVbMF0pOihpPWVbMF0scz1lWzFdKTtsZXQgdT0tMTtpZihyPyhhPW5bMF0sdT0xKTooYT1uWzFdLHU9MCksblt1XSE9PXMpdGhyb3cgbmV3IEVycm9yKCJkaW1lbnNpb24gbWlzbWF0Y2giKTtpZihpPD0wfHxhPD0wfHxzPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaGFwZSBzcGVjaWZpZWQiKTtpZihvJiYhbC5pc1ZhbGlkQnJvYWRjYXN0KG8sW2ksYV0pKXRocm93IG5ldyBFcnJvcigiZ2VtbTogaW52YWxpZCBiaWFzIHNoYXBlIGZvciBicm9hZGNhc3QiKTtyZXR1cm4gW2ksYSxzXX19O2NsYXNzIGN7c3RhdGljIHRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGUpe3N3aXRjaChlKXtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OnJldHVybiAiaW50OCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuICJ1aW50OCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDpyZXR1cm4gImJvb2wiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiAiaW50MTYiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4gInVpbnQxNiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6cmV0dXJuICJpbnQzMiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyOnJldHVybiAidWludDMyIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4gImZsb2F0MzIiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpyZXR1cm4gImZsb2F0NjQiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlNUUklORzpyZXR1cm4gInN0cmluZyI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuICJpbnQzMiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiAidWludDMyIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke3Mub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVtlXX1gKX19c3RhdGljIHRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtKGUpe3N3aXRjaChlKXtjYXNlImludDgiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODtjYXNlInVpbnQ4IjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4O2Nhc2UiYm9vbCI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MO2Nhc2UiaW50MTYiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY7Y2FzZSJ1aW50MTYiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2O2Nhc2UiaW50MzIiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI7Y2FzZSJ1aW50MzIiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDtjYXNlImZsb2F0NjQiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFO2Nhc2Uic3RyaW5nIjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlNUUklORztjYXNlImludDY0IjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0O2Nhc2UidWludDY0IjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fXN0YXRpYyB0ZW5zb3JEaW1zRnJvbVByb3RvKGUpe3JldHVybiBlLm1hcCgoZT0+aS5kZWZhdWx0LmlzTG9uZyhlKT9lLnRvTnVtYmVyKCk6ZSkpfXN0YXRpYyB0ZW5zb3JWYWx1ZVR5cGVGcm9tUHJvdG8oZSl7cmV0dXJuIHt0ZW5zb3JUeXBlOmMudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZS5lbGVtVHlwZSksc2hhcGU6e2RpbXM6Yy50ZW5zb3JEaW1zRnJvbVByb3RvKGUuc2hhcGUuZGltLm1hcCgoZT0+ZS5kaW1WYWx1ZSkpKX19fXN0YXRpYyB0ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChlKXtjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5kaW1zTGVuZ3RoKCk7bisrKXQucHVzaChwLmxvbmdUb051bWJlcihlLmRpbXMobikpKTtyZXR1cm4gdH1zdGF0aWMgdGVuc29yQXR0cmlidXRlc0Zyb21PUlRGb3JtYXQoZSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPGUuYXR0cmlidXRlc0xlbmd0aCgpO24rKyl0LnB1c2goZS5hdHRyaWJ1dGVzKG4pKTtyZXR1cm4gdH19dC5Qcm90b1V0aWw9YztjbGFzcyBwe3N0YXRpYyBsb25nVG9OdW1iZXIoZSx0KXtyZXR1cm4gaS5kZWZhdWx0LmlzTG9uZyhlKT9lLnRvTnVtYmVyKCk6ZSBpbnN0YW5jZW9mIG8uZmxhdGJ1ZmZlcnMuTG9uZz9pLmRlZmF1bHQuZnJvbVZhbHVlKHtsb3c6ZS5sb3csaGlnaDplLmhpZ2gsdW5zaWduZWQ6bnVsbCE9dCYmdH0pLnRvTnVtYmVyKCk6ZX1zdGF0aWMgaXNMb25nKGUpe3JldHVybiBpLmRlZmF1bHQuaXNMb25nKGUpfHxlIGluc3RhbmNlb2Ygby5mbGF0YnVmZmVycy5Mb25nfX10LkxvbmdVdGlsPXA7Y2xhc3MgZHtzdGF0aWMgc2l6ZShlKXtyZXR1cm4gZC5nZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKGUsMCxlLmxlbmd0aCl9c3RhdGljIHNpemVGcm9tRGltZW5zaW9uKGUsdCl7aWYodDwwfHx0PmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaW1lbnNpb24gb2YgJHt0fSBmb3Igc2l6ZUZyb21EaW1lbnNpb24gYXMgVGVuc29yIGhhcyAke2UubGVuZ3RofSBkaW1lbnNpb25zLmApO3JldHVybiBkLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoZSx0LGUubGVuZ3RoKX1zdGF0aWMgc2l6ZVRvRGltZW5zaW9uKGUsdCl7aWYodDwwfHx0PmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaW1lbnNpb24gb2YgJHt0fSBmb3Igc2l6ZVRvRGltZW5zaW9uIGFzIFRlbnNvciBoYXMgJHtlLmxlbmd0aH0gZGltZW5zaW9ucy5gKTtyZXR1cm4gZC5nZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKGUsMCx0KX1zdGF0aWMgZ2V0U2l6ZUZyb21EaW1lbnNpb25SYW5nZShlLHQsbil7bGV0IHI9MTtmb3IobGV0IG89dDtvPG47bysrKXtpZihlW29dPD0wKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGdldCB2YWxpZCBzaXplIGZyb20gc3BlY2lmaWVkIGRpbWVuc2lvbiByYW5nZS4gTW9zdCBsaWtlbHkgdGhlIHJhbmdlIGNvbnRhaW5zIDAgb3IgbmVnYXRpdmUgdmFsdWVzIGluIHRoZW0uIik7cio9ZVtvXTt9cmV0dXJuIHJ9c3RhdGljIGNvbXB1dGVTdHJpZGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7aWYoMD09PXQpcmV0dXJuIFtdO2lmKDE9PT10KXJldHVybiBbMV07Y29uc3Qgbj1uZXcgQXJyYXkodCk7blt0LTFdPTEsblt0LTJdPWVbdC0xXTtmb3IobGV0IHI9dC0zO3I+PTA7LS1yKW5bcl09bltyKzFdKmVbcisxXTtyZXR1cm4gbn1zdGF0aWMgdHJhbnNwb3NlKGUpe3JldHVybiBlLnNsaWNlKCkucmV2ZXJzZSgpfXN0YXRpYyBpbmRpY2VzVG9PZmZzZXQoZSx0LG4pe3ZvaWQgMD09PW4mJihuPWUubGVuZ3RoKTtsZXQgcj0wO2ZvcihsZXQgbz0wO288bjsrK28pcis9dFtvXSplW29dO3JldHVybiByfXN0YXRpYyBvZmZzZXRUb0luZGljZXMoZSx0KXtjb25zdCBuPXQubGVuZ3RoO2lmKDA9PT1uKXJldHVybiBbXTtpZigxPT09bilyZXR1cm4gW2UqdFswXV07Y29uc3Qgcj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248ci5sZW5ndGgtMTsrK24pcltuXT1NYXRoLmZsb29yKGUvdFtuXSksZS09cltuXSp0W25dO3JldHVybiByW3IubGVuZ3RoLTFdPWUscn1zdGF0aWMgbm9ybWFsaXplQXhpcyhlLHQpe2lmKGU8LXQmJmU+PXQpdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBheGlzIGZvciB0aGlzIG9wZXJhdGlvbi4iKTtyZXR1cm4gZTwwP2UrdDplfXN0YXRpYyBub3JtYWxpemVBeGVzKGUsdCl7cmV0dXJuIGUubWFwKChlPT50aGlzLm5vcm1hbGl6ZUF4aXMoZSx0KSkpfXN0YXRpYyBpbmNyZW1lbnRJbmRleChlLHQsbil7aWYoMD09PXQubGVuZ3RofHwwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBpbmNyZW1lbnRpbmcgdW5zdXBwb3J0ZWQgZm9yIHNjYWxhciBUZW5zb3IiKTtpZih2b2lkIDA9PT1uKW49dC5sZW5ndGg7ZWxzZSBpZihuPD0wfHxuPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5jb3JyZWN0IGF4aXMgdG8gaW5jcmVtZW50IG9uIik7Zm9yKGxldCByPW4tMTtyPj0wJiYoZVtyXSsrLCEoZVtyXTx0W3JdKSk7LS1yKWVbcl09MDt9c3RhdGljIGNhbGN1bGF0ZVJlc2hhcGVkRGltcyhlLHQpe2lmKDA9PT10Lmxlbmd0aCl7aWYoMD09PWUubGVuZ3RofHwxPT09ZC5zaXplKGUpKXJldHVybiBbXTt0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCByZXNoYXBlIHRvIGEgc2NhbGFyIFRlbnNvciIpfWNvbnN0IG49dC5sZW5ndGgscj1uZXcgQXJyYXkobik7bGV0IG89LTEsaT0xO2ZvcihsZXQgcz0wO3M8bjtzKyspe2lmKHRbc108LTEpdGhyb3cgbmV3IEVycm9yKCJhIGRpbWVuc2lvbiBpbiBzaGFwZSBoaW50cyBjYW5ub3QgYmUgbGVzcyB0aGFuIC0xIik7aWYoLTE9PT10W3NdKXtpZigtMSE9PW8pdGhyb3cgbmV3IEVycm9yKCJhdCBtb3N0IG9uZSBkaW1lbnNpb24gaW4gc2hhcGUgaGludHMgY2FuIGJlIC0xIik7bz1zO31lbHNlIHtpZigwPT09dFtzXSl7aWYocz49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgZGltZW5zaW9uIHdpdGggdmFsdWUgemVybyBleGNlZWRzIHRoZSBkaW1lbnNpb24gc2l6ZSBvZiB0aGUgaW5wdXQgdGVuc29yIik7cltzXT1lW3NdO31lbHNlIHJbc109dFtzXTtpKj1yW3NdO319Y29uc3Qgcz1kLnNpemUoZSk7aWYoLTEhPT1vKXtpZihzJWkhPTApdGhyb3cgbmV3IEVycm9yKGB0aGUgaW5wdXQgdGVuc29yIGNhbm5vdCBiZSByZXNoYXBlZCB0byB0aGUgcmVxdWVzdGVkIHNoYXBlLiBJbnB1dCBzaGFwZTogWyR7ZX1dIE91dHB1dCBzaGFwZTogWyR7dH1dYCk7cltvXT1zL2k7fWVsc2UgaWYoaSE9PXMpdGhyb3cgbmV3IEVycm9yKCJyZXNoYXBlZERpbXMgYW5kIG9yaWdpbmFsRGltcyBkb24ndCBoYXZlIG1hdGNoaW5nIHNpemVzIik7cmV0dXJuIHJ9c3RhdGljIHNvcnRCYXNlZE9uUGVybShlLHQpe3JldHVybiB0P3QubWFwKCh0PT5lW3RdKSk6ZS5zbGljZSgpLnJldmVyc2UoKX1zdGF0aWMgcGFkU2hhcGUoZSx0KXtjb25zdCBuPWUubGVuZ3RoO3JldHVybiBlLm1hcCgoKGUscik9PmUrdFtyXSt0W3Irbl0pKX1zdGF0aWMgYXJlRXF1YWwoZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aCYmZS5ldmVyeSgoKGUsbik9PmU9PT10W25dKSl9c3RhdGljIHZhbGlkYXRlRGltc0FuZENhbGNTaXplKGUpe2lmKGUubGVuZ3RoPjYpdGhyb3cgbmV3IFR5cGVFcnJvcigiT25seSByYW5rIDAgdG8gNiBpcyBzdXBwb3J0ZWQgZm9yIHRlbnNvciBzaGFwZS4iKTtsZXQgdD0xO2Zvcihjb25zdCBuIG9mIGUpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgc2hhcGU6ICR7bn0gaXMgbm90IGFuIGludGVnZXJgKTtpZihuPDB8fG4+MjE0NzQ4MzY0Nyl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNoYXBlOiBsZW5ndGggJHtufSBpcyBub3QgYWxsb3dlZGApO3QqPW47fXJldHVybiB0fXN0YXRpYyBmbGF0dGVuU2hhcGUoZSx0KXt0PDAmJih0Kz1lLmxlbmd0aCk7Y29uc3Qgbj1lLnJlZHVjZSgoKGUsdCk9PmUqdCksMSkscj1lLnNsaWNlKHQpLnJlZHVjZSgoKGUsdCk9PmUqdCksMSk7cmV0dXJuIFtuL3Iscl19c3RhdGljIHNxdWVlemVTaGFwZShlLHQpe2NvbnN0IG49bmV3IEFycmF5O3Q9ZC5ub3JtYWxpemVBeGVzKHQsZS5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtjb25zdCBvPXQuaW5kZXhPZihyKT49MDtpZihvJiYxIT09ZVtyXSl0aHJvdyBuZXcgRXJyb3IoInNxdWVlemUgYW4gYXhpcyBvZiBzaXplIGRpZmZlcmVudCB0aGFuIDEiKTsoMD09PXQubGVuZ3RoJiZlW3JdPjF8fHQubGVuZ3RoPjAmJiFvKSYmbi5wdXNoKGVbcl0pO31yZXR1cm4gbn1zdGF0aWMgdW5zcXVlZXplU2hhcGUoZSx0KXtjb25zdCBuPW5ldyBBcnJheShlLmxlbmd0aCt0Lmxlbmd0aCk7bi5maWxsKDApO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCByPWQubm9ybWFsaXplQXhpcyh0W2VdLG4ubGVuZ3RoKTtpZihyPj1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIidheGVzJyBoYXMgYW4gb3V0IG9mIHJhbmdlIGF4aXMiKTtpZigwIT09bltyXSl0aHJvdyBuZXcgRXJyb3IoIidheGVzJyBoYXMgYSBkdXBsaWNhdGUgYXhpcyIpO25bcl09MTt9bGV0IHI9MDtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKykwPT09blt0XSYmKG5bdF09ZVtyKytdKTtpZihyIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgdW5zcXVlZXplZCBkaW1lbnNpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkIik7cmV0dXJuIG59fXQuU2hhcGVVdGlsPWQsdC5NYXRoVXRpbD1jbGFzc3tzdGF0aWMgc3FyKGUsdCxuLHIsbyl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBpPTA7aTxvO2krKyllW24raV0rPU1hdGgucG93KHRbcitpXSwyKTt9c3RhdGljIGF4cHkoZSx0LG4scixvLGkpe2lmKHI8MHx8cj49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZihyK28+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYobitvPmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgcz0wO3M8bztzKyspZVtuK3NdKz1pKnRbcitzXTt9c3RhdGljIHBvd3goZSx0LG4scixvLGkpe2lmKHI8MHx8cj49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZihyK28+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYobitvPmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgcz0wO3M8bztzKyspZVtuK3NdPU1hdGgucG93KHRbcitzXSxpKTt9c3RhdGljIG11bChlLHQsbixyLG8pe2lmKHI8MHx8cj49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZihyK28+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYobitvPmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgaT0wO2k8bztpKyspZVtuK2ldPXRbcitpXSplW24raV07fX07Y2xhc3MgZntzdGF0aWMgc3BsaXRTaGFwZShlLHQsbixyKXtpZigwPT09bi5sZW5ndGgpe2lmKCFyKXRocm93IG5ldyBFcnJvcigibmVlZCB0byBrbm93IG51bWJlciBvZiBvdXRwdXRzIHdoZW4gdGhlICdzcGxpdCcgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQiKTtmLmRldGVybWluZVNwbGl0KGVbdF0scixuKTt9Y29uc3Qgbz1bXSxpPVswXTtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoOysrcil7MCE9PXImJmkucHVzaChpW3ItMV0rbltyLTFdKTtjb25zdCBzPWUuc2xpY2UoKTtzW3RdPW5bcl0sby5wdXNoKHMpO31yZXR1cm4gW28saV19c3RhdGljIGRldGVybWluZVNwbGl0KGUsdCxuKXtpZihlJXQhPTApdGhyb3cgbmV3IEVycm9yKCJjYW5ub3Qgc3BsaXQgdGVuc29yIHRvIGVxdWFsIHNpemVkIHBhcnRzIik7Zm9yKGxldCByPTA7cjx0OysrciluLnB1c2goZS90KTt9fXQuU3BsaXRVdGlsPWY7Y2xhc3MgaHtzdGF0aWMgY2FsY1JlZHVjZShlLHQsbixyLG8pe2NvbnN0IGk9ZS5kaW1zLnNsaWNlKDApOzA9PT10Lmxlbmd0aCYmaS5mb3JFYWNoKCgoZSxuKT0+dC5wdXNoKG4pKSk7Y29uc3Qgcz1oLmNhbGNSZWR1Y2VTaGFwZShpLHQsITApLHU9ZC5zaXplKHMpLGM9bmV3IGEuVGVuc29yKHMsZS50eXBlKSxwPWQuY29tcHV0ZVN0cmlkZXMocyksZj1kLmNvbXB1dGVTdHJpZGVzKGkpLGc9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IobGV0IG49MDtuPHU7bisrKXtjb25zdCBzPWQub2Zmc2V0VG9JbmRpY2VzKG4scCk7bC5maWxsSW5kZXgocyxpLGcpLGMuc2V0KHMsaC5jYWxjUmVkdWNlQnlBeGlzKGUubnVtYmVyRGF0YSx0LGksMCxkLmluZGljZXNUb09mZnNldChnLGYpLHIsbykpO31yZXR1cm4gbj9jOm5ldyBhLlRlbnNvcihoLmNhbGNSZWR1Y2VTaGFwZShpLHQsbiksYy50eXBlLHZvaWQgMCx2b2lkIDAsYy5kYXRhLGMuZGF0YUlkKX1zdGF0aWMgY2FsY1JlZHVjZUJ5QXhpcyhlLHQsbixyLG8saSxzKXtsZXQgYT0wO2lmKHI+PXQubGVuZ3RoKXJldHVybiBpKGVbb10pO2NvbnN0IHU9dFtyXSxsPXU+PW4ubGVuZ3RoPzE6ZC5zaXplKG4uc2xpY2UodSsxKSk7Zm9yKGxldCBjPTA7YzxuW3VdO2MrKylhPTA9PT1jP2guY2FsY1JlZHVjZUJ5QXhpcyhlLHQsbixyKzEsbyxpLHMpOnMoYSxoLmNhbGNSZWR1Y2VCeUF4aXMoZSx0LG4scisxLG8saSxzKSksbys9bDtyZXR1cm4gYX1zdGF0aWMgY2FsY1JlZHVjZVNoYXBlKGUsdCxuKXtjb25zdCByPWUuc2xpY2UoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylyW3RbZV1dPW4/MTowO3JldHVybiByLmZpbHRlcigoZT0+MCE9PWUpKX19dC5SZWR1Y2VVdGlsPWg7Y2xhc3MgZ3tzdGF0aWMgYWRqdXN0UG9vbEF0dHJpYnV0ZXMoZSx0LG4scixvLGkpe2lmKCFlJiZuLmxlbmd0aCE9PXQubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggb2Ygc3BlY2lmaWVkIGtlcm5lbCBzaGFwZXMgc2hvdWxkIGJlIDIgbGVzcyB0aGFuIGxlbmd0aCBvZiBpbnB1dCBkaW1lbnNpb25zIik7aWYoZSlmb3IobGV0IGU9MDtlPHQubGVuZ3RoLTI7ZSsrKWU+PW4ubGVuZ3RoP24ucHVzaCh0W2UrMl0pOm5bZV09dFtlKzJdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKWlmKGU8ci5sZW5ndGgpe2lmKHJbZV08MCl0aHJvdyBuZXcgRXJyb3IoInN0cmlkZXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSByLnB1c2goMSk7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoZTxvLmxlbmd0aCl7aWYob1tlXTwwKXRocm93IG5ldyBFcnJvcigiZGlsYXRpb25zIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpfWVsc2Ugby5wdXNoKDEpO2ZvcihsZXQgZT0wO2U8MipuLmxlbmd0aDtlKyspaWYoZTxpLmxlbmd0aCl7aWYoaVtlXTwwKXRocm93IG5ldyBFcnJvcigicGFkIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpfWVsc2UgaS5wdXNoKDApO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtpZihuW2VdPD0wKXRocm93IG5ldyBFcnJvcigia2VybmVsIHNoYXBlcyBuZWVkIHRvIGJlIGdyZWF0ZXIgdGhhbiAwIik7aWYoaVtlXT49bltlXXx8aVtlK24ubGVuZ3RoXT49bltlXSl0aHJvdyBuZXcgRXJyb3IoInBhZHMgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBrZXJuZWwiKX19c3RhdGljIGFkanVzdFBhZHNCYXNlZE9uQXV0b1BhZChlLHQsbixyLG8saSl7aWYoaSl7aWYoby5sZW5ndGghPT0yKihlLmxlbmd0aC0yKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBwYWRzIHNob3VsZCBiZSB0d2ljZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBzdHJpZGVzIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2lmKHIubGVuZ3RoIT09ZS5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBrZXJuZWwgc2hhcGVzIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGgtMjtzKyspZy5hZGp1c3RQYWRBbmRSZXR1cm5TaGFwZShlW3MrMl0sdFtzXSxuW3NdLHJbc10sbyxzLHMrZS5sZW5ndGgtMixpKTt9fXN0YXRpYyBjb21wdXRlUG9vbE91dHB1dFNoYXBlKGUsdCxuLHIsbyxpLHMpe2lmKHQubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiaW5wdXQgc2hhcGUgbXVzdCBiZSBvZiBzaXplIGdyZWF0ZXIgdGhhbiAwIik7Y29uc3QgYT1bdFswXSx0WzFdXTtyZXR1cm4gZy5jb21wdXRlU2hhcGVIZWxwZXIoZSx0LGEsbixyLG8saSxzKSxhfXN0YXRpYyBjb21wdXRlQ29udk91dHB1dFNoYXBlKGUsdCxuLHIsbyxpLHMpe2lmKGUubGVuZ3RoPD0wfHx0Lmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIGRpbXMgb3IgaW52YWxpZCBmaWx0ZXIgdGVuc29yIGRpbXMiKTtjb25zdCBhPVtlWzBdLHRbMF1dO3JldHVybiBnLmNvbXB1dGVTaGFwZUhlbHBlcighMSxlLGEsbixyLG8saSxzKSxhfXN0YXRpYyBjb21wdXRlU2hhcGVIZWxwZXIoZSx0LG4scixvLGkscyxhKXtpZihlKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMjtlKyspbi5wdXNoKDEpO2Vsc2UgZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0yO2UrKyluLnB1c2goZy5hZGp1c3RQYWRBbmRSZXR1cm5TaGFwZSh0W2UrMl0scltlXSxvW2VdLGlbZV0scyxlLGUrdC5sZW5ndGgtMixhKSk7fXN0YXRpYyBhZGp1c3RQYWRBbmRSZXR1cm5TaGFwZShlLHQsbixyLG8saSxzLGEpe2NvbnN0IHU9biooci0xKSsxO2lmKCFhfHwiTk9UU0VUIj09PWEpcmV0dXJuIE1hdGguZmxvb3IoKGUrb1tpXStvW3NdLXUpL3QrMSk7c3dpdGNoKGEpe2Nhc2UiVkFMSUQiOnJldHVybiBvW2ldPTAsb1tzXT0wLE1hdGguZmxvb3IoKGUtdSkvdCsxKTtjYXNlIlNBTUVfTE9XRVIiOmNhc2UiU0FNRV9VUFBFUiI6aWYoMSE9PW4pdGhyb3cgbmV3IEVycm9yKCJEaWxhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciBTQU1FX1VQUEVSIG9yIFNBTUVfTE9XRVIiKTt7Y29uc3Qgbj0oKGUrdC0xKS90LTEpKnQrci1lO3JldHVybiBvW2ldPSJTQU1FX0xPV0VSIj09PWE/TWF0aC5mbG9vcigobisxKS8yKTpNYXRoLmZsb29yKG4vMiksb1tzXT1uLW9baV0sTWF0aC5mbG9vcigoZStuLXIpL3QrMSl9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIEF1dG9QYWQgdHlwZSIpfX19dC5Qb29sQ29udlV0aWw9Zyx0Lk1JTl9DTElQPS0zNDAyODIzNDY2Mzg1Mjg4NmUyMix0Lk1BWF9DTElQPTM0MDI4MjM0NjYzODUyODg2ZTIyLHQuZGVjb2RlVXRmOFN0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGUpfTt9LDg0MDg6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC52ZXJzaW9uPXZvaWQgMCx0LnZlcnNpb249IjEuMTYuMyI7fSw5NTQ0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKTt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7byYmISgiZ2V0ImluIG8/IXQuX19lc01vZHVsZTpvLndyaXRhYmxlfHxvLmNvbmZpZ3VyYWJsZSl8fChvPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbyk7fTpmdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKSxlW3JdPXRbbl07fSksaT10aGlzJiZ0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdHx8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pO306ZnVuY3Rpb24oZSx0KXtlLmRlZmF1bHQ9dDt9KSxzPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbihlKXtpZihlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9e307aWYobnVsbCE9ZSlmb3IodmFyIG4gaW4gZSkiZGVmYXVsdCIhPT1uJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmbyh0LGUsbik7cmV0dXJuIGkodCxlKSx0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbmRQcm9maWxpbmc9dC5ydW49dC5yZWxlYXNlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uRmluYWxpemU9dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9dC5pbml0aWFsaXplUnVudGltZT10LmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlPXZvaWQgMDtjb25zdCBhPW4oMjIzNSksdT1zKG4oMTI1OSkpLGw9bigyNjMpLGM9KCk9PiEhYS5lbnYud2FzbS5wcm94eSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudDtsZXQgcCxkLGYsaD0hMSxnPSExLGI9ITE7Y29uc3QgbT1bXSx5PVtdLHY9W10sXz1bXSx3PVtdLFQ9W10seD0oKT0+e2lmKGh8fCFnfHxifHwhcCl0aHJvdyBuZXcgRXJyb3IoIndvcmtlciBub3QgcmVhZHkiKX0sTz1lPT57c3dpdGNoKGUuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6aD0hMSxlLmRhdGEuZXJyPyhiPSEwLGRbMV0oZS5kYXRhLmVycikpOihnPSEwLGRbMF0oKSk7YnJlYWs7Y2FzZSJpbml0LW9ydCI6ZS5kYXRhLmVycj9mWzFdKGUuZGF0YS5lcnIpOmZbMF0oKTticmVhaztjYXNlImNyZWF0ZV9hbGxvY2F0ZSI6ZS5kYXRhLmVycj9tLnNoaWZ0KClbMV0oZS5kYXRhLmVycik6bS5zaGlmdCgpWzBdKGUuZGF0YS5vdXQpO2JyZWFrO2Nhc2UiY3JlYXRlX2ZpbmFsaXplIjplLmRhdGEuZXJyP3kuc2hpZnQoKVsxXShlLmRhdGEuZXJyKTp5LnNoaWZ0KClbMF0oZS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJjcmVhdGUiOmUuZGF0YS5lcnI/di5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOnYuc2hpZnQoKVswXShlLmRhdGEub3V0KTticmVhaztjYXNlInJlbGVhc2UiOmUuZGF0YS5lcnI/Xy5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOl8uc2hpZnQoKVswXSgpO2JyZWFrO2Nhc2UicnVuIjplLmRhdGEuZXJyP3cuc2hpZnQoKVsxXShlLmRhdGEuZXJyKTp3LnNoaWZ0KClbMF0oZS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJlbmQtcHJvZmlsaW5nIjplLmRhdGEuZXJyP1Quc2hpZnQoKVsxXShlLmRhdGEuZXJyKTpULnNoaWZ0KClbMF0oKTt9fSxTPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/bnVsbD09PShyPW51bGw9PT1kb2N1bWVudHx8dm9pZCAwPT09ZG9jdW1lbnQ/dm9pZCAwOmRvY3VtZW50LmN1cnJlbnRTY3JpcHQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnNyYzp2b2lkIDA7dC5pbml0aWFsaXplV2ViQXNzZW1ibHlJbnN0YW5jZT1hc3luYygpPT57aWYoYygpKXtpZihnKXJldHVybjtpZihoKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRXYXNtKCknIGRldGVjdGVkLiIpO2lmKGIpdGhyb3cgbmV3IEVycm9yKCJwcmV2aW91cyBjYWxsIHRvICdpbml0V2FzbSgpJyBmYWlsZWQuIik7cmV0dXJuIGg9ITAsdm9pZCAwPT09YS5lbnYud2FzbS53YXNtUGF0aHMmJlMmJjAhPT1TLmluZGV4T2YoImJsb2I6IikmJihhLmVudi53YXNtLndhc21QYXRocz1TLnN1YnN0cigwLCtTLmxhc3RJbmRleE9mKCIvIikrMSkpLG5ldyBQcm9taXNlKCgoZSx0KT0+e251bGw9PXB8fHAudGVybWluYXRlKCkscD1uKDgwNTApLlooKSxwLm9ubWVzc2FnZT1PLGQ9W2UsdF07Y29uc3Qgcj17dHlwZToiaW5pdC13YXNtIixpbjphLmVudi53YXNtfTtwLnBvc3RNZXNzYWdlKHIpO30pKX1yZXR1cm4gKDAsIGwuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KShhLmVudi53YXNtKX0sdC5pbml0aWFsaXplUnVudGltZT1hc3luYyBlPT57aWYoYygpKXJldHVybiB4KCksbmV3IFByb21pc2UoKCh0LG4pPT57Zj1bdCxuXTtjb25zdCByPXt0eXBlOiJpbml0LW9ydCIsaW46ZX07cC5wb3N0TWVzc2FnZShyKTt9KSk7YXdhaXQgdS5pbml0UnVudGltZShlKTt9LHQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPWFzeW5jIGU9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgodCxuKT0+e20ucHVzaChbdCxuXSk7Y29uc3Qgcj17dHlwZToiY3JlYXRlX2FsbG9jYXRlIixpbjp7bW9kZWw6ZX19O3AucG9zdE1lc3NhZ2UocixbZS5idWZmZXJdKTt9KSkpOnUuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKGUpLHQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPWFzeW5jKGUsdCk9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgobixyKT0+e3kucHVzaChbbixyXSk7Y29uc3Qgbz17dHlwZToiY3JlYXRlX2ZpbmFsaXplIixpbjp7bW9kZWxkYXRhOmUsb3B0aW9uczp0fX07cC5wb3N0TWVzc2FnZShvKTt9KSkpOnUuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKGUsdCksdC5jcmVhdGVTZXNzaW9uPWFzeW5jKGUsdCk9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgobixyKT0+e3YucHVzaChbbixyXSk7Y29uc3Qgbz17dHlwZToiY3JlYXRlIixpbjp7bW9kZWw6ZSxvcHRpb25zOnR9fTtwLnBvc3RNZXNzYWdlKG8sW2UuYnVmZmVyXSk7fSkpKTp1LmNyZWF0ZVNlc3Npb24oZSx0KSx0LnJlbGVhc2VTZXNzaW9uPWFzeW5jIGU9PntpZihjKCkpcmV0dXJuIHgoKSxuZXcgUHJvbWlzZSgoKHQsbik9PntfLnB1c2goW3Qsbl0pO2NvbnN0IHI9e3R5cGU6InJlbGVhc2UiLGluOmV9O3AucG9zdE1lc3NhZ2Uocik7fSkpO3UucmVsZWFzZVNlc3Npb24oZSk7fSx0LnJ1bj1hc3luYyhlLHQsbixyLG8pPT5jKCk/KHgoKSxuZXcgUHJvbWlzZSgoKGkscyk9Pnt3LnB1c2goW2ksc10pO2NvbnN0IGE9e3R5cGU6InJ1biIsaW46e3Nlc3Npb25JZDplLGlucHV0SW5kaWNlczp0LGlucHV0czpuLG91dHB1dEluZGljZXM6cixvcHRpb25zOm99fTtwLnBvc3RNZXNzYWdlKGEsdS5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycyhuKSk7fSkpKTp1LnJ1bihlLHQsbixyLG8pLHQuZW5kUHJvZmlsaW5nPWFzeW5jIGU9PntpZihjKCkpcmV0dXJuIHgoKSxuZXcgUHJvbWlzZSgoKHQsbik9PntULnB1c2goW3Qsbl0pO2NvbnN0IHI9e3R5cGU6ImVuZC1wcm9maWxpbmciLGluOmV9O3AucG9zdE1lc3NhZ2Uocik7fSkpO3UuZW5kUHJvZmlsaW5nKGUpO307fSw3OTE4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zZXRSdW5PcHRpb25zPXZvaWQgMDtjb25zdCByPW4oMjYzKSxvPW4oMTQ5Nyk7dC5zZXRSdW5PcHRpb25zPWU9Pntjb25zdCB0PSgwLCByLmdldEluc3RhbmNlKSgpO2xldCBuPTA7Y29uc3QgaT1bXSxzPWV8fHt9O3RyeXtpZih2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS5sb2dTZXZlcml0eUxldmVsKSlzLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dTZXZlcml0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcihlLmxvZ1NldmVyaXR5TGV2ZWwpfHxlLmxvZ1NldmVyaXR5TGV2ZWw8MHx8ZS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYodm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUubG9nVmVyYm9zaXR5TGV2ZWwpKXMubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLnRlcm1pbmF0ZSkmJihzLnRlcm1pbmF0ZT0hMSk7bGV0IHI9MDtyZXR1cm4gdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUudGFnKSYmKHI9KDAsby5hbGxvY1dhc21TdHJpbmcpKGUudGFnLGkpKSxuPXQuX09ydENyZWF0ZVJ1bk9wdGlvbnMocy5sb2dTZXZlcml0eUxldmVsLHMubG9nVmVyYm9zaXR5TGV2ZWwsISFzLnRlcm1pbmF0ZSxyKSwwPT09biYmKDAsby5jaGVja0xhc3RFcnJvcikoIkNhbid0IGNyZWF0ZSBydW4gb3B0aW9ucy4iKSx2b2lkIDAhPT0obnVsbD09ZT92b2lkIDA6ZS5leHRyYSkmJigwLG8uaXRlcmF0ZUV4dHJhT3B0aW9ucykoZS5leHRyYSwiIixuZXcgV2Vha1NldCwoKGUscik9Pntjb25zdCBzPSgwLG8uYWxsb2NXYXNtU3RyaW5nKShlLGkpLGE9KDAsby5hbGxvY1dhc21TdHJpbmcpKHIsaSk7MCE9PXQuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5KG4scyxhKSYmKDAsby5jaGVja0xhc3RFcnJvcikoYENhbid0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke3J9LmApO30pKSxbbixpXX1jYXRjaChlKXt0aHJvdyAwIT09biYmdC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMobiksaS5mb3JFYWNoKChlPT50Ll9mcmVlKGUpKSksZX19O30sNjY0MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMjgwNiksbz1uKDIyMzUpLGk9bigyODUwKSxzPW4oOTU0NCk7bGV0IGE7dC5Pbm54cnVudGltZVdlYkFzc2VtYmx5U2Vzc2lvbkhhbmRsZXI9Y2xhc3N7YXN5bmMgY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKGUpe2NvbnN0IHQ9YXdhaXQgZmV0Y2goZSk7aWYoMjAwIT09dC5zdGF0dXMpdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCBtb2RlbDogJHtlfWApO2NvbnN0IG49YXdhaXQgdC5hcnJheUJ1ZmZlcigpO3JldHVybiAoMCwgcy5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKG5ldyBVaW50OEFycmF5KG4pKX1hc3luYyBsb2FkTW9kZWwoZSx0KXtpZihhfHwoYXdhaXQoMCwgcy5pbml0aWFsaXplUnVudGltZSkoby5lbnYpLGE9ITApLCJzdHJpbmciPT10eXBlb2YgZSlpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSl7Y29uc3Qgbj1hd2FpdCgwLCBpLnByb21pc2lmeSkoci5yZWFkRmlsZSkoZSk7W3RoaXMuc2Vzc2lvbklkLHRoaXMuaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzXT1hd2FpdCgwLCBzLmNyZWF0ZVNlc3Npb24pKG4sdCk7fWVsc2Uge2NvbnN0IG49YXdhaXQgdGhpcy5jcmVhdGVTZXNzaW9uQWxsb2NhdGUoZSk7W3RoaXMuc2Vzc2lvbklkLHRoaXMuaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzXT1hd2FpdCgwLCBzLmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkobix0KTt9ZWxzZSBbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsIHMuY3JlYXRlU2Vzc2lvbikoZSx0KTt9YXN5bmMgZGlzcG9zZSgpe3JldHVybiAoMCwgcy5yZWxlYXNlU2Vzc2lvbikodGhpcy5zZXNzaW9uSWQpfWFzeW5jIHJ1bihlLHQsbil7Y29uc3Qgcj1bXSxpPVtdO09iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKGU9Pntjb25zdCB0PWVbMF0sbj1lWzFdLG89dGhpcy5pbnB1dE5hbWVzLmluZGV4T2YodCk7aWYoLTE9PT1vKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnB1dCAnJHt0fSdgKTtyLnB1c2gobiksaS5wdXNoKG8pO30pKTtjb25zdCBhPVtdO09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKGU9Pntjb25zdCB0PWVbMF0sbj10aGlzLm91dHB1dE5hbWVzLmluZGV4T2YodCk7aWYoLTE9PT1uKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvdXRwdXQgJyR7dH0nYCk7YS5wdXNoKG4pO30pKTtjb25zdCB1PWF3YWl0KDAsIHMucnVuKSh0aGlzLnNlc3Npb25JZCxpLHIubWFwKChlPT5bZS50eXBlLGUuZGltcyxlLmRhdGFdKSksYSxuKSxsPXt9O2ZvcihsZXQgZT0wO2U8dS5sZW5ndGg7ZSsrKWxbdGhpcy5vdXRwdXROYW1lc1thW2VdXV09bmV3IG8uVGVuc29yKHVbZV1bMF0sdVtlXVsyXSx1W2VdWzFdKTtyZXR1cm4gbH1zdGFydFByb2ZpbGluZygpe31lbmRQcm9maWxpbmcoKXsoMCwgcy5lbmRQcm9maWxpbmcpKHRoaXMuc2Vzc2lvbklkKTt9fTt9LDc2MjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFNlc3Npb25PcHRpb25zPXZvaWQgMDtjb25zdCByPW4oMjYzKSxvPW4oMTQ5Nyk7dC5zZXRTZXNzaW9uT3B0aW9ucz1lPT57dmFyIHQsbixpLHM7Y29uc3QgYT0oMCwgci5nZXRJbnN0YW5jZSkoKTtsZXQgdT0wO2NvbnN0IGw9W10sYz1lfHx7fTsoZT0+e2UuZXh0cmF8fChlLmV4dHJhPXt9KSxlLmV4dHJhLnNlc3Npb258fChlLmV4dHJhLnNlc3Npb249e30pO2NvbnN0IHQ9ZS5leHRyYS5zZXNzaW9uO3QudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KHQudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGUuZXhlY3V0aW9uUHJvdmlkZXJzJiZlLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKChlPT4id2ViZ3B1Ij09PSgic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSkmJihlLmVuYWJsZU1lbVBhdHRlcm49ITEpO30pKGMpO3RyeXtjb25zdCBlPShlPT57c3dpdGNoKGUpe2Nhc2UiZGlzYWJsZWQiOnJldHVybiAwO2Nhc2UiYmFzaWMiOnJldHVybiAxO2Nhc2UiZXh0ZW5kZWQiOnJldHVybiAyO2Nhc2UiYWxsIjpyZXR1cm4gOTk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGdyYXBoIG9wdGltaXphdGlvbiBsZXZlbDogJHtlfWApfX0pKG51bGwhPT0odD1jLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWwpJiZ2b2lkIDAhPT10P3Q6ImFsbCIpLHA9KGU9Pntzd2l0Y2goZSl7Y2FzZSJzZXF1ZW50aWFsIjpyZXR1cm4gMDtjYXNlInBhcmFsbGVsIjpyZXR1cm4gMTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZXhlY3V0aW9uIG1vZGU6ICR7ZX1gKX19KShudWxsIT09KG49Yy5leGVjdXRpb25Nb2RlKSYmdm9pZCAwIT09bj9uOiJzZXF1ZW50aWFsIiksZD0ic3RyaW5nIj09dHlwZW9mIGMubG9nSWQ/KDAsby5hbGxvY1dhc21TdHJpbmcpKGMubG9nSWQsbCk6MCxmPW51bGwhPT0oaT1jLmxvZ1NldmVyaXR5TGV2ZWwpJiZ2b2lkIDAhPT1pP2k6MjtpZighTnVtYmVyLmlzSW50ZWdlcihmKXx8ZjwwfHxmPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtmfWApO2NvbnN0IGg9bnVsbCE9PShzPWMubG9nVmVyYm9zaXR5TGV2ZWwpJiZ2b2lkIDAhPT1zP3M6MDtpZighTnVtYmVyLmlzSW50ZWdlcihoKXx8aDwwfHxoPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtofWApO2NvbnN0IGc9InN0cmluZyI9PXR5cGVvZiBjLm9wdGltaXplZE1vZGVsRmlsZVBhdGg/KDAsby5hbGxvY1dhc21TdHJpbmcpKGMub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxsKTowO3JldHVybiB1PWEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zKGUsISFjLmVuYWJsZUNwdU1lbUFyZW5hLCEhYy5lbmFibGVNZW1QYXR0ZXJuLHAsISFjLmVuYWJsZVByb2ZpbGluZywwLGQsZixoLGcpLDA9PT11JiYoMCxvLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgY3JlYXRlIHNlc3Npb24gb3B0aW9ucy4iKSxjLmV4ZWN1dGlvblByb3ZpZGVycyYmKChlLHQsbik9Pntmb3IoY29uc3QgaSBvZiB0KXtsZXQgdD0ic3RyaW5nIj09dHlwZW9mIGk/aTppLm5hbWU7c3dpdGNoKHQpe2Nhc2UieG5ucGFjayI6dD0iWE5OUEFDSyI7YnJlYWs7Y2FzZSJ3ZWJubiI6aWYodD0iV0VCTk4iLCJzdHJpbmciIT10eXBlb2YgaSl7Y29uc3QgdD1pO2lmKG51bGw9PXQ/dm9pZCAwOnQuZGV2aWNlVHlwZSl7Y29uc3QgaT0oMCxvLmFsbG9jV2FzbVN0cmluZykoImRldmljZVR5cGUiLG4pLHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQuZGV2aWNlVHlwZSxuKTswIT09KDAsci5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsaSxzKSYmKDAsby5jaGVja0xhc3RFcnJvcikoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAnZGV2aWNlVHlwZScgLSAke3QuZGV2aWNlVHlwZX0uYCk7fWlmKG51bGw9PXQ/dm9pZCAwOnQucG93ZXJQcmVmZXJlbmNlKXtjb25zdCBpPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSgicG93ZXJQcmVmZXJlbmNlIixuKSxzPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSh0LnBvd2VyUHJlZmVyZW5jZSxuKTswIT09KDAsci5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsaSxzKSYmKDAsby5jaGVja0xhc3RFcnJvcikoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAncG93ZXJQcmVmZXJlbmNlJyAtICR7dC5wb3dlclByZWZlcmVuY2V9LmApO319YnJlYWs7Y2FzZSJ3ZWJncHUiOnQ9IkpTIjticmVhaztjYXNlIndhc20iOmNhc2UiY3B1Ijpjb250aW51ZTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7dH1gKX1jb25zdCBzPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSh0LG4pOzAhPT0oMCxyLmdldEluc3RhbmNlKSgpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcihlLHMpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3QgYXBwZW5kIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fS5gKTt9fSkodSxjLmV4ZWN1dGlvblByb3ZpZGVycyxsKSx2b2lkIDAhPT1jLmV4dHJhJiYoMCxvLml0ZXJhdGVFeHRyYU9wdGlvbnMpKGMuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKChlLHQpPT57Y29uc3Qgbj0oMCxvLmFsbG9jV2FzbVN0cmluZykoZSxsKSxyPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSh0LGwpOzAhPT1hLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkodSxuLHIpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7ZX0gLSAke3R9LmApO30pKSxbdSxsXX1jYXRjaChlKXt0aHJvdyAwIT09dSYmYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKHUpLGwuZm9yRWFjaCgoZT0+YS5fZnJlZShlKSkpLGV9fTt9LDc5MTc6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5sb2dMZXZlbFN0cmluZ1RvRW51bT10LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj10LmdldFRlbnNvckVsZW1lbnRTaXplPXQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9dC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT12b2lkIDAsdC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UiaW50OCI6cmV0dXJuIDM7Y2FzZSJ1aW50OCI6cmV0dXJuIDI7Y2FzZSJib29sIjpyZXR1cm4gOTtjYXNlImludDE2IjpyZXR1cm4gNTtjYXNlInVpbnQxNiI6cmV0dXJuIDQ7Y2FzZSJpbnQzMiI6cmV0dXJuIDY7Y2FzZSJ1aW50MzIiOnJldHVybiAxMjtjYXNlImZsb2F0MTYiOnJldHVybiAxMDtjYXNlImZsb2F0MzIiOnJldHVybiAxO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDExO2Nhc2Uic3RyaW5nIjpyZXR1cm4gODtjYXNlImludDY0IjpyZXR1cm4gNztjYXNlInVpbnQ2NCI6cmV0dXJuIDEzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LHQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9ZT0+e3N3aXRjaChlKXtjYXNlIDM6cmV0dXJuICJpbnQ4IjtjYXNlIDI6cmV0dXJuICJ1aW50OCI7Y2FzZSA5OnJldHVybiAiYm9vbCI7Y2FzZSA1OnJldHVybiAiaW50MTYiO2Nhc2UgNDpyZXR1cm4gInVpbnQxNiI7Y2FzZSA2OnJldHVybiAiaW50MzIiO2Nhc2UgMTI6cmV0dXJuICJ1aW50MzIiO2Nhc2UgMTA6cmV0dXJuICJmbG9hdDE2IjtjYXNlIDE6cmV0dXJuICJmbG9hdDMyIjtjYXNlIDExOnJldHVybiAiZmxvYXQ2NCI7Y2FzZSA4OnJldHVybiAic3RyaW5nIjtjYXNlIDc6cmV0dXJuICJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4gInVpbnQ2NCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtlfWApfX0sdC5nZXRUZW5zb3JFbGVtZW50U2l6ZT1lPT5bdm9pZCAwLDQsMSwxLDIsMiw0LDgsdm9pZCAwLDEsMiw4LDQsOCx2b2lkIDAsdm9pZCAwLHZvaWQgMF1bZV0sdC50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3I9ZT0+e3N3aXRjaChlKXtjYXNlImZsb2F0MTYiOmNhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7ZX1gKX19LHQubG9nTGV2ZWxTdHJpbmdUb0VudW09ZT0+e3N3aXRjaChlKXtjYXNlInZlcmJvc2UiOnJldHVybiAwO2Nhc2UiaW5mbyI6cmV0dXJuIDE7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gMjtjYXNlImVycm9yIjpyZXR1cm4gMztjYXNlImZhdGFsIjpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtlfWApfX07fSwxMjU5OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycz10LmVuZFByb2ZpbGluZz10LnJ1bj10LnJlbGVhc2VTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT10LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT10LmluaXRSdW50aW1lPXZvaWQgMDtjb25zdCByPW4oNzkxOCksbz1uKDc2MjIpLGk9big3OTE3KSxzPW4oMjYzKSxhPW4oMTQ5Nyk7dC5pbml0UnVudGltZT1hc3luYyBlPT57dmFyIHQsbjt0PWUud2FzbS5udW1UaHJlYWRzLG49KDAsIGkubG9nTGV2ZWxTdHJpbmdUb0VudW0pKGUubG9nTGV2ZWwpLDAhPT0oMCwgcy5nZXRJbnN0YW5jZSkoKS5fT3J0SW5pdCh0LG4pJiYoMCwgYS5jaGVja0xhc3RFcnJvcikoIkNhbid0IGluaXRpYWxpemUgb25ueHJ1bnRpbWUuIik7fTtjb25zdCB1PW5ldyBNYXA7dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9ZT0+e2NvbnN0IHQ9KDAsIHMuZ2V0SW5zdGFuY2UpKCksbj10Ll9tYWxsb2MoZS5ieXRlTGVuZ3RoKTtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBhIHNlc3Npb24uIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICR7ZS5ieXRlTGVuZ3RofS5gKTtyZXR1cm4gdC5IRUFQVTguc2V0KGUsbiksW24sZS5ieXRlTGVuZ3RoXX0sdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9KGUsdCk9Pntjb25zdCBuPSgwLCBzLmdldEluc3RhbmNlKSgpO2xldCByPTAsaT0wLGw9W107Y29uc3QgYz1bXSxwPVtdO3RyeXtbaSxsXT0oMCxvLnNldFNlc3Npb25PcHRpb25zKSh0KSxyPW4uX09ydENyZWF0ZVNlc3Npb24oZVswXSxlWzFdLGkpLDA9PT1yJiYoMCxhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgY3JlYXRlIGEgc2Vzc2lvbi4iKTtjb25zdFtkLGZdPShlPT57Y29uc3QgdD0oMCxzLmdldEluc3RhbmNlKSgpLG49dC5zdGFja1NhdmUoKTt0cnl7Y29uc3Qgbj10LnN0YWNrQWxsb2MoOCk7cmV0dXJuIDAhPT10Ll9PcnRHZXRJbnB1dE91dHB1dENvdW50KGUsbixuKzQpJiYoMCxhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgZ2V0IHNlc3Npb24gaW5wdXQvb3V0cHV0IGNvdW50LiIpLFt0LkhFQVAzMltuLzRdLHQuSEVBUDMyW24vNCsxXV19ZmluYWxseXt0LnN0YWNrUmVzdG9yZShuKTt9fSkociksaD1bXSxnPVtdO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2NvbnN0IHQ9bi5fT3J0R2V0SW5wdXROYW1lKHIsZSk7MD09PXQmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgYW4gaW5wdXQgbmFtZS4iKSxjLnB1c2godCksaC5wdXNoKG4uVVRGOFRvU3RyaW5nKHQpKTt9Zm9yKGxldCBlPTA7ZTxmO2UrKyl7Y29uc3QgdD1uLl9PcnRHZXRPdXRwdXROYW1lKHIsZSk7MD09PXQmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgYW4gb3V0cHV0IG5hbWUuIikscC5wdXNoKHQpLGcucHVzaChuLlVURjhUb1N0cmluZyh0KSk7fXJldHVybiB1LnNldChyLFtyLGMscF0pLFtyLGgsZ119Y2F0Y2goZSl7dGhyb3cgYy5mb3JFYWNoKChlPT5uLl9PcnRGcmVlKGUpKSkscC5mb3JFYWNoKChlPT5uLl9PcnRGcmVlKGUpKSksMCE9PXImJm4uX09ydFJlbGVhc2VTZXNzaW9uKHIpLGV9ZmluYWxseXtuLl9mcmVlKGVbMF0pLDAhPT1pJiZuLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMoaSksbC5mb3JFYWNoKChlPT5uLl9mcmVlKGUpKSk7fX0sdC5jcmVhdGVTZXNzaW9uPShlLG4pPT57Y29uc3Qgcj0oMCwgdC5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKGUpO3JldHVybiAoMCwgdC5jcmVhdGVTZXNzaW9uRmluYWxpemUpKHIsbil9LHQucmVsZWFzZVNlc3Npb249ZT0+e2NvbnN0IHQ9KDAsIHMuZ2V0SW5zdGFuY2UpKCksbj11LmdldChlKTtpZighbil0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWxlYXNlIHNlc3Npb24uIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2NvbnN0W3IsbyxpXT1uO28uZm9yRWFjaCgoZT0+dC5fT3J0RnJlZShlKSkpLGkuZm9yRWFjaCgoZT0+dC5fT3J0RnJlZShlKSkpLHQuX09ydFJlbGVhc2VTZXNzaW9uKHIpLHUuZGVsZXRlKGUpO30sdC5ydW49YXN5bmMoZSx0LG4sbyxsKT0+e2NvbnN0IGM9KDAsIHMuZ2V0SW5zdGFuY2UpKCkscD11LmdldChlKTtpZighcCl0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBydW4gaW5mZXJlbmNlLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7ZX1gKTtjb25zdFtkLGYsaF09cCxnPXQubGVuZ3RoLGI9by5sZW5ndGg7bGV0IG09MCx5PVtdO2NvbnN0IHY9W10sXz1bXTt0cnl7W20seV09KDAsci5zZXRSdW5PcHRpb25zKShsKTtmb3IobGV0IGU9MDtlPGc7ZSsrKXtjb25zdCB0PW5bZV1bMF0scj1uW2VdWzFdLG89bltlXVsyXTtsZXQgcyx1O2lmKEFycmF5LmlzQXJyYXkobykpe3U9NCpvLmxlbmd0aCxzPWMuX21hbGxvYyh1KSxfLnB1c2gocyk7bGV0IGU9cy80O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCsrKXtpZigic3RyaW5nIiE9dHlwZW9mIG9bdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHt0fSBpcyBub3QgYSBzdHJpbmdgKTtjLkhFQVBVMzJbZSsrXT0oMCxhLmFsbG9jV2FzbVN0cmluZykob1t0XSxfKTt9fWVsc2UgdT1vLmJ5dGVMZW5ndGgscz1jLl9tYWxsb2ModSksXy5wdXNoKHMpLGMuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShvLmJ1ZmZlcixvLmJ5dGVPZmZzZXQsdSkscyk7Y29uc3QgbD1jLnN0YWNrU2F2ZSgpLHA9Yy5zdGFja0FsbG9jKDQqci5sZW5ndGgpO3RyeXtsZXQgbj1wLzQ7ci5mb3JFYWNoKChlPT5jLkhFQVAzMltuKytdPWUpKTtjb25zdCBvPWMuX09ydENyZWF0ZVRlbnNvcigoMCxpLnRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtKSh0KSxzLHUscCxyLmxlbmd0aCk7MD09PW8mJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW4ndCBjcmVhdGUgdGVuc29yIGZvciBpbnB1dFske2V9XS5gKSx2LnB1c2gobyk7fWZpbmFsbHl7Yy5zdGFja1Jlc3RvcmUobCk7fX1jb25zdCBlPWMuc3RhY2tTYXZlKCkscz1jLnN0YWNrQWxsb2MoNCpnKSx1PWMuc3RhY2tBbGxvYyg0KmcpLHA9Yy5zdGFja0FsbG9jKDQqYiksdz1jLnN0YWNrQWxsb2MoNCpiKTt0cnl7bGV0IGU9cy80LG49dS80LHI9cC80LGw9dy80O2ZvcihsZXQgcj0wO3I8ZztyKyspYy5IRUFQVTMyW2UrK109dltyXSxjLkhFQVBVMzJbbisrXT1mW3Rbcl1dO2ZvcihsZXQgZT0wO2U8YjtlKyspYy5IRUFQVTMyW3IrK109MCxjLkhFQVBVMzJbbCsrXT1oW29bZV1dO2xldCB5PWMuX09ydFJ1bihkLHUscyxnLHcsYixwLG0pO2NvbnN0IF89Yy5qc2VwUnVuUHJvbWlzZTtfJiZ2b2lkIDAhPT1fLnRoZW4mJih5PWF3YWl0IF8pO2NvbnN0IFQ9W107MCE9PXkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4iKTtmb3IobGV0IGU9MDtlPGI7ZSsrKXtjb25zdCB0PWMuSEVBUFUzMltwLzQrZV0sbj1jLnN0YWNrU2F2ZSgpLHI9Yy5zdGFja0FsbG9jKDE2KTtsZXQgbyxzPTA7dHJ5e3k9Yy5fT3J0R2V0VGVuc29yRGF0YSh0LHIscis0LHIrOCxyKzEyKSwwIT09eSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhbid0IGFjY2VzcyBvdXRwdXQgdGVuc29yIGRhdGEgb24gaW5kZXggJHtlfS5gKTtsZXQgbj1yLzQ7Y29uc3QgdT1jLkhFQVBVMzJbbisrXTtzPWMuSEVBUFUzMltuKytdO2NvbnN0IGw9Yy5IRUFQVTMyW24rK10scD1jLkhFQVBVMzJbbisrXSxkPVtdO2ZvcihsZXQgZT0wO2U8cDtlKyspZC5wdXNoKGMuSEVBUFUzMltsLzQrZV0pO2MuX09ydEZyZWUobCk7Y29uc3QgZj0wPT09ZC5sZW5ndGg/MTpkLnJlZHVjZSgoKGUsdCk9PmUqdCkpO2lmKG89KDAsaS50ZW5zb3JEYXRhVHlwZUVudW1Ub1N0cmluZykodSksInN0cmluZyI9PT1vKXtjb25zdCBlPVtdO2xldCB0PXMvNDtmb3IobGV0IG49MDtuPGY7bisrKXtjb25zdCByPWMuSEVBUFUzMlt0KytdLG89bj09PWYtMT92b2lkIDA6Yy5IRUFQVTMyW3RdLXI7ZS5wdXNoKGMuVVRGOFRvU3RyaW5nKHIsbykpO31ULnB1c2goW28sZCxlXSk7fWVsc2Uge2NvbnN0IGU9bmV3KCgwLGkudGVuc29yVHlwZVRvVHlwZWRBcnJheUNvbnN0cnVjdG9yKShvKSkoZik7bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkuc2V0KGMuSEVBUFU4LnN1YmFycmF5KHMscytlLmJ5dGVMZW5ndGgpKSxULnB1c2goW28sZCxlXSk7fX1maW5hbGx5e2Muc3RhY2tSZXN0b3JlKG4pLCJzdHJpbmciPT09byYmcyYmYy5fZnJlZShzKSxjLl9PcnRSZWxlYXNlVGVuc29yKHQpO319cmV0dXJuIFR9ZmluYWxseXtjLnN0YWNrUmVzdG9yZShlKTt9fWZpbmFsbHl7di5mb3JFYWNoKChlPT5jLl9PcnRSZWxlYXNlVGVuc29yKGUpKSksXy5mb3JFYWNoKChlPT5jLl9mcmVlKGUpKSksMCE9PW0mJmMuX09ydFJlbGVhc2VSdW5PcHRpb25zKG0pLHkuZm9yRWFjaCgoZT0+Yy5fZnJlZShlKSkpO319LHQuZW5kUHJvZmlsaW5nPWU9Pntjb25zdCB0PSgwLCBzLmdldEluc3RhbmNlKSgpLG49dS5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNlc3Npb24gaWQiKTtjb25zdCByPW5bMF0sbz10Ll9PcnRFbmRQcm9maWxpbmcocik7MD09PW8mJigwLCBhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUobyk7fSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPWU9Pntjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IGU9blsyXTshQXJyYXkuaXNBcnJheShlKSYmZS5idWZmZXImJnQucHVzaChlLmJ1ZmZlcik7fXJldHVybiB0fTt9LDI2MzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7fTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10O30pLGk9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKSJkZWZhdWx0IiE9PW4mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZyKHQsZSxuKTtyZXR1cm4gbyh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRpc3Bvc2U9dC5nZXRJbnN0YW5jZT10LmluaXRpYWxpemVXZWJBc3NlbWJseT12b2lkIDA7Y29uc3Qgcz1pKG4oNjQ0OSkpLGE9big5MzIpLHU9bigzNDc0KTtsZXQgbCxjPSExLHA9ITEsZD0hMTt0LmluaXRpYWxpemVXZWJBc3NlbWJseT1hc3luYyBlPT57aWYoYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYocCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvICdpbml0aWFsaXplV2ViQXNzZW1ibHkoKScgZGV0ZWN0ZWQuIik7aWYoZCl0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpJyBmYWlsZWQuIik7cD0hMDtjb25zdCB0PWUuaW5pdFRpbWVvdXQscj1lLm51bVRocmVhZHMsbz1lLnNpbWQsaT1yPjEmJigoKT0+e3RyeXtyZXR1cm4gInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKCJ1bmRlZmluZWQiIT10eXBlb2YgTWVzc2FnZUNoYW5uZWwmJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKSl9Y2F0Y2goZSl7cmV0dXJuICExfX0pKCksZj1vJiYoKCk9Pnt0cnl7cmV0dXJuIFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDQsMSw5NiwwLDAsMywyLDEsMCwxMCwzMCwxLDI4LDAsNjUsMCwyNTMsMTUsMjUzLDEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMjUzLDE4NiwxLDI2LDExXSkpfWNhdGNoKGUpe3JldHVybiAhMX19KSgpLGg9ZS53YXNtUGF0aHMsZz0ic3RyaW5nIj09dHlwZW9mIGg/aDp2b2lkIDAsYj0oKGUsdCk9PnQ/ZT8ib3J0LXdhc20tc2ltZC10aHJlYWRlZC53YXNtIjoib3J0LXdhc20tdGhyZWFkZWQud2FzbSI6ZT8ib3J0LXdhc20tc2ltZC53YXNtIjoib3J0LXdhc20ud2FzbSIpKGYsaSksbT0ib2JqZWN0Ij09dHlwZW9mIGg/aFtiXTp2b2lkIDA7bGV0IHk9ITE7Y29uc3Qgdj1bXTtpZih0PjAmJnYucHVzaChuZXcgUHJvbWlzZSgoZT0+e3NldFRpbWVvdXQoKCgpPT57eT0hMCxlKCk7fSksdCk7fSkpKSx2LnB1c2gobmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgcj1pP3U6YSxvPXtsb2NhdGVGaWxlOihlLHQpPT5pJiZlLmVuZHNXaXRoKCIud29ya2VyLmpzIikmJiJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYj9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuKDQxNTQpXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKTplLmVuZHNXaXRoKCIud2FzbSIpP218fChudWxsIT1nP2c6dCkrYjp0K2V9O2lmKGkpaWYoInVuZGVmaW5lZCI9PXR5cGVvZiBCbG9iKW8ubWFpblNjcmlwdFVybE9yQmxvYj1zLmpvaW4oX19kaXJuYW1lLCJvcnQtd2FzbS10aHJlYWRlZC5qcyIpO2Vsc2Uge2NvbnN0IGU9YHZhciBvcnRXYXNtVGhyZWFkZWQ9KGZ1bmN0aW9uKCl7dmFyIF9zY3JpcHREaXI7cmV0dXJuICR7ci50b1N0cmluZygpfX0pKCk7YDtvLm1haW5TY3JpcHRVcmxPckJsb2I9bmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSk7fXIobykudGhlbigodD0+e3A9ITEsYz0hMCxsPXQsZSgpO30pLChlPT57cD0hMSxkPSEwLHQoZSk7fSkpO30pKSksYXdhaXQgUHJvbWlzZS5yYWNlKHYpLHkpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7dH1tc2ApfSx0LmdldEluc3RhbmNlPSgpPT57aWYoYyYmbClyZXR1cm4gbDt0aHJvdyBuZXcgRXJyb3IoIldlYkFzc2VtYmx5IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIil9LHQuZGlzcG9zZT0oKT0+e3ZhciBlOyFjfHxwfHxkfHwocD0hMCxudWxsPT09KGU9bC5QVGhyZWFkKXx8dm9pZCAwPT09ZXx8ZS50ZXJtaW5hdGVBbGxUaHJlYWRzKCksbD12b2lkIDAscD0hMSxjPSExLGQ9ITApO307fSwxNDk3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jaGVja0xhc3RFcnJvcj10Lml0ZXJhdGVFeHRyYU9wdGlvbnM9dC5hbGxvY1dhc21TdHJpbmc9dm9pZCAwO2NvbnN0IHI9bigyNjMpO3QuYWxsb2NXYXNtU3RyaW5nPShlLHQpPT57Y29uc3Qgbj0oMCwgci5nZXRJbnN0YW5jZSkoKSxvPW4ubGVuZ3RoQnl0ZXNVVEY4KGUpKzEsaT1uLl9tYWxsb2Mobyk7cmV0dXJuIG4uc3RyaW5nVG9VVEY4KGUsaSxvKSx0LnB1c2goaSksaX0sdC5pdGVyYXRlRXh0cmFPcHRpb25zPShlLG4scixvKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUpe2lmKHIuaGFzKGUpKXRocm93IG5ldyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGluIG9wdGlvbnMiKTtyLmFkZChlKTt9T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoKFtlLGldKT0+e2NvbnN0IHM9bj9uK2U6ZTtpZigib2JqZWN0Ij09dHlwZW9mIGkpKDAsIHQuaXRlcmF0ZUV4dHJhT3B0aW9ucykoaSxzKyIuIixyLG8pO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBpfHwibnVtYmVyIj09dHlwZW9mIGkpbyhzLGkudG9TdHJpbmcoKSk7ZWxzZSB7aWYoImJvb2xlYW4iIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogIit0eXBlb2YgaSk7byhzLGk/IjEiOiIwIik7fX0pKTt9LHQuY2hlY2tMYXN0RXJyb3I9ZT0+e2NvbnN0IHQ9KDAsIHIuZ2V0SW5zdGFuY2UpKCksbj10LnN0YWNrU2F2ZSgpO3RyeXtjb25zdCBuPXQuc3RhY2tBbGxvYyg4KTt0Ll9PcnRHZXRMYXN0RXJyb3IobixuKzQpO2NvbnN0IHI9dC5IRUFQMzJbbi80XSxvPXQuSEVBUFUzMltuLzQrMV0saT1vP3QuVVRGOFRvU3RyaW5nKG8pOiIiO3Rocm93IG5ldyBFcnJvcihgJHtlfSBFUlJPUl9DT0RFOiAke3J9LCBFUlJPUl9NRVNTQUdFOiAke2l9YCl9ZmluYWxseXt0LnN0YWNrUmVzdG9yZShuKTt9fTt9LDgwNTA6KGUsdCxuKT0+e24uZCh0LHtaOigpPT5pfSk7dmFyIHI9big2NjE0KSxvPW4ubihyKTtmdW5jdGlvbiBpKCl7cmV0dXJuIG8oKSgnLyohXG4qIE9OTlggUnVudGltZSBXZWIgdjEuMTYuM1xuKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuKi9cbigoKT0+e3ZhciBlPXs5MTg6KGUsdCxyKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zZXRSdW5PcHRpb25zPXZvaWQgMDtjb25zdCBuPXIoMjYzKSxhPXIoNDk3KTt0LnNldFJ1bk9wdGlvbnM9ZT0+e2NvbnN0IHQ9KDAsbi5nZXRJbnN0YW5jZSkoKTtsZXQgcj0wO2NvbnN0IG89W10saT1lfHx7fTt0cnl7aWYodm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUubG9nU2V2ZXJpdHlMZXZlbCkpaS5sb2dTZXZlcml0eUxldmVsPTI7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIGUubG9nU2V2ZXJpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dTZXZlcml0eUxldmVsKXx8ZS5sb2dTZXZlcml0eUxldmVsPDB8fGUubG9nU2V2ZXJpdHlMZXZlbD40KXRocm93IG5ldyBFcnJvcihgbG9nIHNlcnZlcml0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7ZS5sb2dTZXZlcml0eUxldmVsfWApO2lmKHZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLmxvZ1ZlcmJvc2l0eUxldmVsKSlpLmxvZ1ZlcmJvc2l0eUxldmVsPTA7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIGUubG9nVmVyYm9zaXR5TGV2ZWx8fCFOdW1iZXIuaXNJbnRlZ2VyKGUubG9nVmVyYm9zaXR5TGV2ZWwpKXRocm93IG5ldyBFcnJvcihgbG9nIHZlcmJvc2l0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7ZS5sb2dWZXJib3NpdHlMZXZlbH1gKTt2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS50ZXJtaW5hdGUpJiYoaS50ZXJtaW5hdGU9ITEpO2xldCBuPTA7cmV0dXJuIHZvaWQgMCE9PShudWxsPT1lP3ZvaWQgMDplLnRhZykmJihuPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShlLnRhZyxvKSkscj10Ll9PcnRDcmVhdGVSdW5PcHRpb25zKGkubG9nU2V2ZXJpdHlMZXZlbCxpLmxvZ1ZlcmJvc2l0eUxldmVsLCEhaS50ZXJtaW5hdGUsbiksMD09PXImJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgY3JlYXRlIHJ1biBvcHRpb25zLiIpLHZvaWQgMCE9PShudWxsPT1lP3ZvaWQgMDplLmV4dHJhKSYmKDAsYS5pdGVyYXRlRXh0cmFPcHRpb25zKShlLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSxuKT0+e2NvbnN0IGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUsbykscz0oMCxhLmFsbG9jV2FzbVN0cmluZykobixvKTswIT09dC5fT3J0QWRkUnVuQ29uZmlnRW50cnkocixpLHMpJiYoMCxhLmNoZWNrTGFzdEVycm9yKShgQ2FuXCd0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke259LmApfSkpLFtyLG9dfWNhdGNoKGUpe3Rocm93IDAhPT1yJiZ0Ll9PcnRSZWxlYXNlUnVuT3B0aW9ucyhyKSxvLmZvckVhY2goKGU9PnQuX2ZyZWUoZSkpKSxlfX19LDYyMjooZSx0LHIpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFNlc3Npb25PcHRpb25zPXZvaWQgMDtjb25zdCBuPXIoMjYzKSxhPXIoNDk3KTt0LnNldFNlc3Npb25PcHRpb25zPWU9Pnt2YXIgdCxyLG8saTtjb25zdCBzPSgwLG4uZ2V0SW5zdGFuY2UpKCk7bGV0IHU9MDtjb25zdCBjPVtdLGw9ZXx8e307KGU9PntlLmV4dHJhfHwoZS5leHRyYT17fSksZS5leHRyYS5zZXNzaW9ufHwoZS5leHRyYS5zZXNzaW9uPXt9KTtjb25zdCB0PWUuZXh0cmEuc2Vzc2lvbjt0LnVzZV9vcnRfbW9kZWxfYnl0ZXNfZGlyZWN0bHl8fCh0LnVzZV9vcnRfbW9kZWxfYnl0ZXNfZGlyZWN0bHk9IjEiKSxlLmV4ZWN1dGlvblByb3ZpZGVycyYmZS5leGVjdXRpb25Qcm92aWRlcnMuc29tZSgoZT0+IndlYmdwdSI9PT0oInN0cmluZyI9PXR5cGVvZiBlP2U6ZS5uYW1lKSkpJiYoZS5lbmFibGVNZW1QYXR0ZXJuPSExKX0pKGwpO3RyeXtjb25zdCBlPShlPT57c3dpdGNoKGUpe2Nhc2UiZGlzYWJsZWQiOnJldHVybiAwO2Nhc2UiYmFzaWMiOnJldHVybiAxO2Nhc2UiZXh0ZW5kZWQiOnJldHVybiAyO2Nhc2UiYWxsIjpyZXR1cm4gOTk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGdyYXBoIG9wdGltaXphdGlvbiBsZXZlbDogJHtlfWApfX0pKG51bGwhPT0odD1sLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWwpJiZ2b2lkIDAhPT10P3Q6ImFsbCIpLGY9KGU9Pntzd2l0Y2goZSl7Y2FzZSJzZXF1ZW50aWFsIjpyZXR1cm4gMDtjYXNlInBhcmFsbGVsIjpyZXR1cm4gMTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZXhlY3V0aW9uIG1vZGU6ICR7ZX1gKX19KShudWxsIT09KHI9bC5leGVjdXRpb25Nb2RlKSYmdm9pZCAwIT09cj9yOiJzZXF1ZW50aWFsIiksZD0ic3RyaW5nIj09dHlwZW9mIGwubG9nSWQ/KDAsYS5hbGxvY1dhc21TdHJpbmcpKGwubG9nSWQsYyk6MCxwPW51bGwhPT0obz1sLmxvZ1NldmVyaXR5TGV2ZWwpJiZ2b2lkIDAhPT1vP286MjtpZighTnVtYmVyLmlzSW50ZWdlcihwKXx8cDwwfHxwPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtwfWApO2NvbnN0IGc9bnVsbCE9PShpPWwubG9nVmVyYm9zaXR5TGV2ZWwpJiZ2b2lkIDAhPT1pP2k6MDtpZighTnVtYmVyLmlzSW50ZWdlcihnKXx8ZzwwfHxnPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtnfWApO2NvbnN0IGg9InN0cmluZyI9PXR5cGVvZiBsLm9wdGltaXplZE1vZGVsRmlsZVBhdGg/KDAsYS5hbGxvY1dhc21TdHJpbmcpKGwub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxjKTowO3JldHVybiB1PXMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zKGUsISFsLmVuYWJsZUNwdU1lbUFyZW5hLCEhbC5lbmFibGVNZW1QYXR0ZXJuLGYsISFsLmVuYWJsZVByb2ZpbGluZywwLGQscCxnLGgpLDA9PT11JiYoMCxhLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMuIiksbC5leGVjdXRpb25Qcm92aWRlcnMmJigoZSx0LHIpPT57Zm9yKGNvbnN0IG8gb2YgdCl7bGV0IHQ9InN0cmluZyI9PXR5cGVvZiBvP286by5uYW1lO3N3aXRjaCh0KXtjYXNlInhubnBhY2siOnQ9IlhOTlBBQ0siO2JyZWFrO2Nhc2Uid2Vibm4iOmlmKHQ9IldFQk5OIiwic3RyaW5nIiE9dHlwZW9mIG8pe2NvbnN0IHQ9bztpZihudWxsPT10P3ZvaWQgMDp0LmRldmljZVR5cGUpe2NvbnN0IG89KDAsYS5hbGxvY1dhc21TdHJpbmcpKCJkZXZpY2VUeXBlIixyKSxpPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSh0LmRldmljZVR5cGUscik7MCE9PSgwLG4uZ2V0SW5zdGFuY2UpKCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShlLG8saSkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6IFwnZGV2aWNlVHlwZVwnIC0gJHt0LmRldmljZVR5cGV9LmApfWlmKG51bGw9PXQ/dm9pZCAwOnQucG93ZXJQcmVmZXJlbmNlKXtjb25zdCBvPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSgicG93ZXJQcmVmZXJlbmNlIixyKSxpPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSh0LnBvd2VyUHJlZmVyZW5jZSxyKTswIT09KDAsbi5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsbyxpKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogXCdwb3dlclByZWZlcmVuY2VcJyAtICR7dC5wb3dlclByZWZlcmVuY2V9LmApfX1icmVhaztjYXNlIndlYmdwdSI6dD0iSlMiO2JyZWFrO2Nhc2Uid2FzbSI6Y2FzZSJjcHUiOmNvbnRpbnVlO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fWApfWNvbnN0IGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQscik7MCE9PSgwLG4uZ2V0SW5zdGFuY2UpKCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKGUsaSkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3QgYXBwZW5kIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fS5gKX19KSh1LGwuZXhlY3V0aW9uUHJvdmlkZXJzLGMpLHZvaWQgMCE9PWwuZXh0cmEmJigwLGEuaXRlcmF0ZUV4dHJhT3B0aW9ucykobC5leHRyYSwiIixuZXcgV2Vha1NldCwoKGUsdCk9Pntjb25zdCByPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShlLGMpLG49KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQsYyk7MCE9PXMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeSh1LHIsbikmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7ZX0gLSAke3R9LmApfSkpLFt1LGNdfWNhdGNoKGUpe3Rocm93IDAhPT11JiZzLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnModSksYy5mb3JFYWNoKChlPT5zLl9mcmVlKGUpKSksZX19fSw5MTc6KGUsdCk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQubG9nTGV2ZWxTdHJpbmdUb0VudW09dC50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3I9dC5nZXRUZW5zb3JFbGVtZW50U2l6ZT10LnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nPXQudGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW09dm9pZCAwLHQudGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW09ZT0+e3N3aXRjaChlKXtjYXNlImludDgiOnJldHVybiAzO2Nhc2UidWludDgiOnJldHVybiAyO2Nhc2UiYm9vbCI6cmV0dXJuIDk7Y2FzZSJpbnQxNiI6cmV0dXJuIDU7Y2FzZSJ1aW50MTYiOnJldHVybiA0O2Nhc2UiaW50MzIiOnJldHVybiA2O2Nhc2UidWludDMyIjpyZXR1cm4gMTI7Y2FzZSJmbG9hdDE2IjpyZXR1cm4gMTA7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gMTtjYXNlImZsb2F0NjQiOnJldHVybiAxMTtjYXNlInN0cmluZyI6cmV0dXJuIDg7Y2FzZSJpbnQ2NCI6cmV0dXJuIDc7Y2FzZSJ1aW50NjQiOnJldHVybiAxMztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fSx0LnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nPWU9Pntzd2l0Y2goZSl7Y2FzZSAzOnJldHVybiJpbnQ4IjtjYXNlIDI6cmV0dXJuInVpbnQ4IjtjYXNlIDk6cmV0dXJuImJvb2wiO2Nhc2UgNTpyZXR1cm4iaW50MTYiO2Nhc2UgNDpyZXR1cm4idWludDE2IjtjYXNlIDY6cmV0dXJuImludDMyIjtjYXNlIDEyOnJldHVybiJ1aW50MzIiO2Nhc2UgMTA6cmV0dXJuImZsb2F0MTYiO2Nhc2UgMTpyZXR1cm4iZmxvYXQzMiI7Y2FzZSAxMTpyZXR1cm4iZmxvYXQ2NCI7Y2FzZSA4OnJldHVybiJzdHJpbmciO2Nhc2UgNzpyZXR1cm4iaW50NjQiO2Nhc2UgMTM6cmV0dXJuInVpbnQ2NCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtlfWApfX0sdC5nZXRUZW5zb3JFbGVtZW50U2l6ZT1lPT5bdm9pZCAwLDQsMSwxLDIsMiw0LDgsdm9pZCAwLDEsMiw4LDQsOCx2b2lkIDAsdm9pZCAwLHZvaWQgMF1bZV0sdC50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3I9ZT0+e3N3aXRjaChlKXtjYXNlImZsb2F0MTYiOmNhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7ZX1gKX19LHQubG9nTGV2ZWxTdHJpbmdUb0VudW09ZT0+e3N3aXRjaChlKXtjYXNlInZlcmJvc2UiOnJldHVybiAwO2Nhc2UiaW5mbyI6cmV0dXJuIDE7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gMjtjYXNlImVycm9yIjpyZXR1cm4gMztjYXNlImZhdGFsIjpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtlfWApfX19LDI1OTooZSx0LHIpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPXQuZW5kUHJvZmlsaW5nPXQucnVuPXQucmVsZWFzZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPXQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPXQuaW5pdFJ1bnRpbWU9dm9pZCAwO2NvbnN0IG49cig5MTgpLGE9cig2MjIpLG89cig5MTcpLGk9cigyNjMpLHM9cig0OTcpO3QuaW5pdFJ1bnRpbWU9YXN5bmMgZT0+e3ZhciB0LHI7dD1lLndhc20ubnVtVGhyZWFkcyxyPSgwLG8ubG9nTGV2ZWxTdHJpbmdUb0VudW0pKGUubG9nTGV2ZWwpLDAhPT0oMCxpLmdldEluc3RhbmNlKSgpLl9PcnRJbml0KHQscikmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgaW5pdGlhbGl6ZSBvbm54cnVudGltZS4iKX07Y29uc3QgdT1uZXcgTWFwO3QuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPWU9Pntjb25zdCB0PSgwLGkuZ2V0SW5zdGFuY2UpKCkscj10Ll9tYWxsb2MoZS5ieXRlTGVuZ3RoKTtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoYENhblwndCBjcmVhdGUgYSBzZXNzaW9uLiBmYWlsZWQgdG8gYWxsb2NhdGUgYSBidWZmZXIgb2Ygc2l6ZSAke2UuYnl0ZUxlbmd0aH0uYCk7cmV0dXJuIHQuSEVBUFU4LnNldChlLHIpLFtyLGUuYnl0ZUxlbmd0aF19LHQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPShlLHQpPT57Y29uc3Qgcj0oMCxpLmdldEluc3RhbmNlKSgpO2xldCBuPTAsbz0wLGM9W107Y29uc3QgbD1bXSxmPVtdO3RyeXtbbyxjXT0oMCxhLnNldFNlc3Npb25PcHRpb25zKSh0KSxuPXIuX09ydENyZWF0ZVNlc3Npb24oZVswXSxlWzFdLG8pLDA9PT1uJiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGNyZWF0ZSBhIHNlc3Npb24uIik7Y29uc3RbZCxwXT0oZT0+e2NvbnN0IHQ9KDAsaS5nZXRJbnN0YW5jZSkoKSxyPXQuc3RhY2tTYXZlKCk7dHJ5e2NvbnN0IHI9dC5zdGFja0FsbG9jKDgpO3JldHVybiAwIT09dC5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudChlLHIscis0KSYmKDAscy5jaGVja0xhc3RFcnJvcikoIkNhblwndCBnZXQgc2Vzc2lvbiBpbnB1dC9vdXRwdXQgY291bnQuIiksW3QuSEVBUDMyW3IvNF0sdC5IRUFQMzJbci80KzFdXX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKHIpfX0pKG4pLGc9W10saD1bXTtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtjb25zdCB0PXIuX09ydEdldElucHV0TmFtZShuLGUpOzA9PT10JiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGdldCBhbiBpbnB1dCBuYW1lLiIpLGwucHVzaCh0KSxnLnB1c2goci5VVEY4VG9TdHJpbmcodCkpfWZvcihsZXQgZT0wO2U8cDtlKyspe2NvbnN0IHQ9ci5fT3J0R2V0T3V0cHV0TmFtZShuLGUpOzA9PT10JiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGdldCBhbiBvdXRwdXQgbmFtZS4iKSxmLnB1c2godCksaC5wdXNoKHIuVVRGOFRvU3RyaW5nKHQpKX1yZXR1cm4gdS5zZXQobixbbixsLGZdKSxbbixnLGhdfWNhdGNoKGUpe3Rocm93IGwuZm9yRWFjaCgoZT0+ci5fT3J0RnJlZShlKSkpLGYuZm9yRWFjaCgoZT0+ci5fT3J0RnJlZShlKSkpLDAhPT1uJiZyLl9PcnRSZWxlYXNlU2Vzc2lvbihuKSxlfWZpbmFsbHl7ci5fZnJlZShlWzBdKSwwIT09byYmci5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKG8pLGMuZm9yRWFjaCgoZT0+ci5fZnJlZShlKSkpfX0sdC5jcmVhdGVTZXNzaW9uPShlLHIpPT57Y29uc3Qgbj0oMCx0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkoZSk7cmV0dXJuKDAsdC5jcmVhdGVTZXNzaW9uRmluYWxpemUpKG4scil9LHQucmVsZWFzZVNlc3Npb249ZT0+e2NvbnN0IHQ9KDAsaS5nZXRJbnN0YW5jZSkoKSxyPXUuZ2V0KGUpO2lmKCFyKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlbGVhc2Ugc2Vzc2lvbi4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2V9YCk7Y29uc3RbbixhLG9dPXI7YS5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksby5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksdC5fT3J0UmVsZWFzZVNlc3Npb24obiksdS5kZWxldGUoZSl9LHQucnVuPWFzeW5jKGUsdCxyLGEsYyk9Pntjb25zdCBsPSgwLGkuZ2V0SW5zdGFuY2UpKCksZj11LmdldChlKTtpZighZil0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBydW4gaW5mZXJlbmNlLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7ZX1gKTtjb25zdFtkLHAsZ109ZixoPXQubGVuZ3RoLG09YS5sZW5ndGg7bGV0IHk9MCx2PVtdO2NvbnN0IGI9W10sdz1bXTt0cnl7W3ksdl09KDAsbi5zZXRSdW5PcHRpb25zKShjKTtmb3IobGV0IGU9MDtlPGg7ZSsrKXtjb25zdCB0PXJbZV1bMF0sbj1yW2VdWzFdLGE9cltlXVsyXTtsZXQgaSx1O2lmKEFycmF5LmlzQXJyYXkoYSkpe3U9NCphLmxlbmd0aCxpPWwuX21hbGxvYyh1KSx3LnB1c2goaSk7bGV0IGU9aS80O2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCsrKXtpZigic3RyaW5nIiE9dHlwZW9mIGFbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHt0fSBpcyBub3QgYSBzdHJpbmdgKTtsLkhFQVBVMzJbZSsrXT0oMCxzLmFsbG9jV2FzbVN0cmluZykoYVt0XSx3KX19ZWxzZSB1PWEuYnl0ZUxlbmd0aCxpPWwuX21hbGxvYyh1KSx3LnB1c2goaSksbC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLGEuYnl0ZU9mZnNldCx1KSxpKTtjb25zdCBjPWwuc3RhY2tTYXZlKCksZj1sLnN0YWNrQWxsb2MoNCpuLmxlbmd0aCk7dHJ5e2xldCByPWYvNDtuLmZvckVhY2goKGU9PmwuSEVBUDMyW3IrK109ZSkpO2NvbnN0IGE9bC5fT3J0Q3JlYXRlVGVuc29yKCgwLG8udGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW0pKHQpLGksdSxmLG4ubGVuZ3RoKTswPT09YSYmKDAscy5jaGVja0xhc3RFcnJvcikoYENhblwndCBjcmVhdGUgdGVuc29yIGZvciBpbnB1dFske2V9XS5gKSxiLnB1c2goYSl9ZmluYWxseXtsLnN0YWNrUmVzdG9yZShjKX19Y29uc3QgZT1sLnN0YWNrU2F2ZSgpLGk9bC5zdGFja0FsbG9jKDQqaCksdT1sLnN0YWNrQWxsb2MoNCpoKSxmPWwuc3RhY2tBbGxvYyg0Km0pLF89bC5zdGFja0FsbG9jKDQqbSk7dHJ5e2xldCBlPWkvNCxyPXUvNCxuPWYvNCxjPV8vNDtmb3IobGV0IG49MDtuPGg7bisrKWwuSEVBUFUzMltlKytdPWJbbl0sbC5IRUFQVTMyW3IrK109cFt0W25dXTtmb3IobGV0IGU9MDtlPG07ZSsrKWwuSEVBUFUzMltuKytdPTAsbC5IRUFQVTMyW2MrK109Z1thW2VdXTtsZXQgdj1sLl9PcnRSdW4oZCx1LGksaCxfLG0sZix5KTtjb25zdCB3PWwuanNlcFJ1blByb21pc2U7dyYmdm9pZCAwIT09dy50aGVuJiYodj1hd2FpdCB3KTtjb25zdCBPPVtdOzAhPT12JiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiZmFpbGVkIHRvIGNhbGwgT3J0UnVuKCkuIik7Zm9yKGxldCBlPTA7ZTxtO2UrKyl7Y29uc3QgdD1sLkhFQVBVMzJbZi80K2VdLHI9bC5zdGFja1NhdmUoKSxuPWwuc3RhY2tBbGxvYygxNik7bGV0IGEsaT0wO3RyeXt2PWwuX09ydEdldFRlbnNvckRhdGEodCxuLG4rNCxuKzgsbisxMiksMCE9PXYmJigwLHMuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3QgYWNjZXNzIG91dHB1dCB0ZW5zb3IgZGF0YSBvbiBpbmRleCAke2V9LmApO2xldCByPW4vNDtjb25zdCB1PWwuSEVBUFUzMltyKytdO2k9bC5IRUFQVTMyW3IrK107Y29uc3QgYz1sLkhFQVBVMzJbcisrXSxmPWwuSEVBUFUzMltyKytdLGQ9W107Zm9yKGxldCBlPTA7ZTxmO2UrKylkLnB1c2gobC5IRUFQVTMyW2MvNCtlXSk7bC5fT3J0RnJlZShjKTtjb25zdCBwPTA9PT1kLmxlbmd0aD8xOmQucmVkdWNlKCgoZSx0KT0+ZSp0KSk7aWYoYT0oMCxvLnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nKSh1KSwic3RyaW5nIj09PWEpe2NvbnN0IGU9W107bGV0IHQ9aS80O2ZvcihsZXQgcj0wO3I8cDtyKyspe2NvbnN0IG49bC5IRUFQVTMyW3QrK10sYT1yPT09cC0xP3ZvaWQgMDpsLkhFQVBVMzJbdF0tbjtlLnB1c2gobC5VVEY4VG9TdHJpbmcobixhKSl9Ty5wdXNoKFthLGQsZV0pfWVsc2V7Y29uc3QgZT1uZXcoKDAsby50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3IpKGEpKShwKTtuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zZXQobC5IRUFQVTguc3ViYXJyYXkoaSxpK2UuYnl0ZUxlbmd0aCkpLE8ucHVzaChbYSxkLGVdKX19ZmluYWxseXtsLnN0YWNrUmVzdG9yZShyKSwic3RyaW5nIj09PWEmJmkmJmwuX2ZyZWUoaSksbC5fT3J0UmVsZWFzZVRlbnNvcih0KX19cmV0dXJuIE99ZmluYWxseXtsLnN0YWNrUmVzdG9yZShlKX19ZmluYWxseXtiLmZvckVhY2goKGU9PmwuX09ydFJlbGVhc2VUZW5zb3IoZSkpKSx3LmZvckVhY2goKGU9PmwuX2ZyZWUoZSkpKSwwIT09eSYmbC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMoeSksdi5mb3JFYWNoKChlPT5sLl9mcmVlKGUpKSl9fSx0LmVuZFByb2ZpbGluZz1lPT57Y29uc3QgdD0oMCxpLmdldEluc3RhbmNlKSgpLHI9dS5nZXQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNlc3Npb24gaWQiKTtjb25zdCBuPXJbMF0sYT10Ll9PcnRFbmRQcm9maWxpbmcobik7MD09PWEmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUoYSl9LHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnM9ZT0+e2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSl7Y29uc3QgZT1yWzJdOyFBcnJheS5pc0FycmF5KGUpJiZlLmJ1ZmZlciYmdC5wdXNoKGUuYnVmZmVyKX1yZXR1cm4gdH19LDI2MzpmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQscixuKXt2b2lkIDA9PT1uJiYobj1yKTt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscik7YSYmISgiZ2V0ImluIGE/IXQuX19lc01vZHVsZTphLndyaXRhYmxlfHxhLmNvbmZpZ3VyYWJsZSl8fChhPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W3JdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sYSl9OmZ1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PW4mJihuPXIpLGVbbl09dFtyXX0pLGE9dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KX06ZnVuY3Rpb24oZSx0KXtlLmRlZmF1bHQ9dH0pLG89dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgciBpbiBlKSJkZWZhdWx0IiE9PXImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZuKHQsZSxyKTtyZXR1cm4gYSh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRpc3Bvc2U9dC5nZXRJbnN0YW5jZT10LmluaXRpYWxpemVXZWJBc3NlbWJseT12b2lkIDA7Y29uc3QgaT1vKHIoNDQ5KSkscz1yKDkzMiksdT1yKDQ3NCk7bGV0IGMsbD0hMSxmPSExLGQ9ITE7dC5pbml0aWFsaXplV2ViQXNzZW1ibHk9YXN5bmMgZT0+e2lmKGwpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2lmKGYpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byBcJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpXCcgZGV0ZWN0ZWQuIik7aWYoZCl0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gXCdpbml0aWFsaXplV2ViQXNzZW1ibHkoKVwnIGZhaWxlZC4iKTtmPSEwO2NvbnN0IHQ9ZS5pbml0VGltZW91dCxuPWUubnVtVGhyZWFkcyxhPWUuc2ltZCxvPW4+MSYmKCgpPT57dHJ5e3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJigidW5kZWZpbmVkIiE9dHlwZW9mIE1lc3NhZ2VDaGFubmVsJiYobmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMSkpLFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDQsMSw5NiwwLDAsMywyLDEsMCw1LDQsMSwzLDEsMSwxMCwxMSwxLDksMCw2NSwwLDI1NCwxNiwyLDAsMjYsMTFdKSkpfWNhdGNoKGUpe3JldHVybiExfX0pKCkscD1hJiYoKCk9Pnt0cnl7cmV0dXJuIFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDQsMSw5NiwwLDAsMywyLDEsMCwxMCwzMCwxLDI4LDAsNjUsMCwyNTMsMTUsMjUzLDEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMjUzLDE4NiwxLDI2LDExXSkpfWNhdGNoKGUpe3JldHVybiExfX0pKCksZz1lLndhc21QYXRocyxoPSJzdHJpbmciPT10eXBlb2YgZz9nOnZvaWQgMCxtPSgoZSx0KT0+dD9lPyJvcnQtd2FzbS1zaW1kLXRocmVhZGVkLndhc20iOiJvcnQtd2FzbS10aHJlYWRlZC53YXNtIjplPyJvcnQtd2FzbS1zaW1kLndhc20iOiJvcnQtd2FzbS53YXNtIikocCxvKSx5PSJvYmplY3QiPT10eXBlb2YgZz9nW21dOnZvaWQgMDtsZXQgdj0hMTtjb25zdCBiPVtdO2lmKHQ+MCYmYi5wdXNoKG5ldyBQcm9taXNlKChlPT57c2V0VGltZW91dCgoKCk9Pnt2PSEwLGUoKX0pLHQpfSkpKSxiLnB1c2gobmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgbj1vP3U6cyxhPXtsb2NhdGVGaWxlOihlLHQpPT5vJiZlLmVuZHNXaXRoKCIud29ya2VyLmpzIikmJiJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYj9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyKDE1NCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpOmUuZW5kc1dpdGgoIi53YXNtIik/eXx8KG51bGwhPWg/aDp0KSttOnQrZX07aWYobylpZigidW5kZWZpbmVkIj09dHlwZW9mIEJsb2IpYS5tYWluU2NyaXB0VXJsT3JCbG9iPWkuam9pbihfX2Rpcm5hbWUsIm9ydC13YXNtLXRocmVhZGVkLmpzIik7ZWxzZXtjb25zdCBlPWB2YXIgb3J0V2FzbVRocmVhZGVkPShmdW5jdGlvbigpe3ZhciBfc2NyaXB0RGlyO3JldHVybiAke24udG9TdHJpbmcoKX19KSgpO2A7YS5tYWluU2NyaXB0VXJsT3JCbG9iPW5ldyBCbG9iKFtlXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pfW4oYSkudGhlbigodD0+e2Y9ITEsbD0hMCxjPXQsZSgpfSksKGU9PntmPSExLGQ9ITAsdChlKX0pKX0pKSksYXdhaXQgUHJvbWlzZS5yYWNlKGIpLHYpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7dH1tc2ApfSx0LmdldEluc3RhbmNlPSgpPT57aWYobCYmYylyZXR1cm4gYzt0aHJvdyBuZXcgRXJyb3IoIldlYkFzc2VtYmx5IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIil9LHQuZGlzcG9zZT0oKT0+e3ZhciBlOyFsfHxmfHxkfHwoZj0hMCxudWxsPT09KGU9Yy5QVGhyZWFkKXx8dm9pZCAwPT09ZXx8ZS50ZXJtaW5hdGVBbGxUaHJlYWRzKCksYz12b2lkIDAsZj0hMSxsPSExLGQ9ITApfX0sNDk3OihlLHQscik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY2hlY2tMYXN0RXJyb3I9dC5pdGVyYXRlRXh0cmFPcHRpb25zPXQuYWxsb2NXYXNtU3RyaW5nPXZvaWQgMDtjb25zdCBuPXIoMjYzKTt0LmFsbG9jV2FzbVN0cmluZz0oZSx0KT0+e2NvbnN0IHI9KDAsbi5nZXRJbnN0YW5jZSkoKSxhPXIubGVuZ3RoQnl0ZXNVVEY4KGUpKzEsbz1yLl9tYWxsb2MoYSk7cmV0dXJuIHIuc3RyaW5nVG9VVEY4KGUsbyxhKSx0LnB1c2gobyksb30sdC5pdGVyYXRlRXh0cmFPcHRpb25zPShlLHIsbixhKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUpe2lmKG4uaGFzKGUpKXRocm93IG5ldyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGluIG9wdGlvbnMiKTtuLmFkZChlKX1PYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2Usb10pPT57Y29uc3QgaT1yP3IrZTplO2lmKCJvYmplY3QiPT10eXBlb2YgbykoMCx0Lml0ZXJhdGVFeHRyYU9wdGlvbnMpKG8saSsiLiIsbixhKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygb3x8Im51bWJlciI9PXR5cGVvZiBvKWEoaSxvLnRvU3RyaW5nKCkpO2Vsc2V7aWYoImJvb2xlYW4iIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkNhblwndCBoYW5kbGUgZXh0cmEgY29uZmlnIHR5cGU6ICIrdHlwZW9mIG8pO2EoaSxvPyIxIjoiMCIpfX0pKX0sdC5jaGVja0xhc3RFcnJvcj1lPT57Y29uc3QgdD0oMCxuLmdldEluc3RhbmNlKSgpLHI9dC5zdGFja1NhdmUoKTt0cnl7Y29uc3Qgcj10LnN0YWNrQWxsb2MoOCk7dC5fT3J0R2V0TGFzdEVycm9yKHIscis0KTtjb25zdCBuPXQuSEVBUDMyW3IvNF0sYT10LkhFQVBVMzJbci80KzFdLG89YT90LlVURjhUb1N0cmluZyhhKToiIjt0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gRVJST1JfQ09ERTogJHtufSwgRVJST1JfTUVTU0FHRTogJHtvfWApfWZpbmFsbHl7dC5zdGFja1Jlc3RvcmUocil9fX0sNDc0OihlLHQscik9Pnt2YXIgX3NjcmlwdERpcixuPShfc2NyaXB0RGlyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKF9zY3JpcHREaXI9X3NjcmlwdERpcnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7ZnVuY3Rpb24gdCgpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSx4fWZ1bmN0aW9uIG4oKXtyZXR1cm4gay5idWZmZXIhPXguYnVmZmVyJiZZKCksSX1mdW5jdGlvbiBhKCl7cmV0dXJuIGsuYnVmZmVyIT14LmJ1ZmZlciYmWSgpLFV9ZnVuY3Rpb24gbygpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSxMfWZ1bmN0aW9uIGkoKXtyZXR1cm4gay5idWZmZXIhPXguYnVmZmVyJiZZKCksV312YXIgcyx1LGM9ZTtjLnJlYWR5PW5ldyBQcm9taXNlKCgoZSx0KT0+e3M9ZSx1PXR9KSk7dmFyIGwsZixkLHA9T2JqZWN0LmFzc2lnbih7fSxjKSxnPSIuL3RoaXMucHJvZ3JhbSIsaD0oZSx0KT0+e3Rocm93IHR9LG09Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cseT0iZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cyx2PSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSxiPWMuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRHx8ITEsdz0iIjtmdW5jdGlvbiBfKGUpe3JldHVybiBjLmxvY2F0ZUZpbGU/Yy5sb2NhdGVGaWxlKGUsdyk6dytlfWlmKHYpe3ZhciBPPXIoMzg0KSxTPXIoOTA4KTtsZXQgdDt3PXk/Uy5kaXJuYW1lKHcpKyIvIjpfX2Rpcm5hbWUrIi8iLGw9KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6Uy5ub3JtYWxpemUoZSksTy5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSxkPWU9PigoZT1sKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxmPShlLHQscixuPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTpTLm5vcm1hbGl6ZShlKSxPLnJlYWRGaWxlKGUsbj92b2lkIDA6InV0ZjgiLCgoZSxhKT0+e2U/cihlKTp0KG4/YS5idWZmZXI6YSl9KSl9LCFjLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihnPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLGg9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0sYy5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iO3RyeXt0PXIoOTI1KX1jYXRjaChlKXt0aHJvdyBjb25zb2xlLmVycm9yKFwnVGhlICJ3b3JrZXJfdGhyZWFkcyIgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBub2RlLmpzIGJ1aWxkIC0gcGVyaGFwcyBhIG5ld2VyIHZlcnNpb24gaXMgbmVlZGVkP1wnKSxlfWdsb2JhbC5Xb3JrZXI9dC5Xb3JrZXJ9ZWxzZShtfHx5KSYmKHk/dz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLF9zY3JpcHREaXImJih3PV9zY3JpcHREaXIpLHc9MCE9PXcuaW5kZXhPZigiYmxvYjoiKT93LnN1YnN0cigwLHcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIix2fHwobD1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5zZW5kKG51bGwpLHQucmVzcG9uc2VUZXh0fSx5JiYoZD1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix0LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkodC5yZXNwb25zZSl9KSxmPShlLHQscik9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PnsyMDA9PW4uc3RhdHVzfHwwPT1uLnN0YXR1cyYmbi5yZXNwb25zZT90KG4ucmVzcG9uc2UpOnIoKX0sbi5vbmVycm9yPXIsbi5zZW5kKG51bGwpfSkpO3YmJiJ1bmRlZmluZWQiPT10eXBlb2YgcGVyZm9ybWFuY2UmJihnbG9iYWwucGVyZm9ybWFuY2U9cig5NTMpLnBlcmZvcm1hbmNlKTt2YXIgRT1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLEE9Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO3YmJihFPSguLi5lKT0+Ty53cml0ZVN5bmMoMSxlLmpvaW4oIiAiKSsiXFxuIiksQT0oLi4uZSk9Pk8ud3JpdGVTeW5jKDIsZS5qb2luKCIgIikrIlxcbiIpKTt2YXIgVCxNPWMucHJpbnR8fEUsUj1jLnByaW50RXJyfHxBO09iamVjdC5hc3NpZ24oYyxwKSxwPW51bGwsYy50aGlzUHJvZ3JhbSYmKGc9Yy50aGlzUHJvZ3JhbSksYy5xdWl0JiYoaD1jLnF1aXQpLGMud2FzbUJpbmFyeSYmKFQ9Yy53YXNtQmluYXJ5KTt2YXIgRj1jLm5vRXhpdFJ1bnRpbWV8fCEwOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJnRlKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIGssQyxQLEQseCxJLFUsTCxXLEg9ITE7ZnVuY3Rpb24gWSgpe3ZhciBlPWsuYnVmZmVyO2MuSEVBUDg9eD1uZXcgSW50OEFycmF5KGUpLGMuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGMuSEVBUDMyPVU9bmV3IEludDMyQXJyYXkoZSksYy5IRUFQVTg9ST1uZXcgVWludDhBcnJheShlKSxjLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGMuSEVBUFUzMj1MPW5ldyBVaW50MzJBcnJheShlKSxjLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxjLkhFQVBGNjQ9Vz1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBqPWMuSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2O2lmKDUyNDI4ODA8PWp8fHRlKCJJTklUSUFMX01FTU9SWSBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gU1RBQ0tfU0laRSwgd2FzICIraisiISAoU1RBQ0tfU0laRT01MjQyODgwKSIpLGIpaz1jLndhc21NZW1vcnk7ZWxzZSBpZihjLndhc21NZW1vcnkpaz1jLndhc21NZW1vcnk7ZWxzZSBpZighKChrPW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6ai82NTUzNixtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pKS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikpdGhyb3cgUigicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnIiksdiYmUigiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQvb3IgcmVjZW50IHZlcnNpb24pIiksRXJyb3IoImJhZCBtZW1vcnkiKTtZKCksaj1rLmJ1ZmZlci5ieXRlTGVuZ3RoO3ZhciB6LEc9W10sTj1bXSxCPVtdLCQ9MDtmdW5jdGlvbiBxKCl7cmV0dXJuIEZ8fDA8JH12YXIgVixKLFg9MCxLPW51bGwsWj1udWxsO2Z1bmN0aW9uIFEoKXtYKyssYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoWCl9ZnVuY3Rpb24gZWUoKXtpZihYLS0sYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoWCksMD09WCYmKG51bGwhPT1LJiYoY2xlYXJJbnRlcnZhbChLKSxLPW51bGwpLFopKXt2YXIgZT1aO1o9bnVsbCxlKCl9fWZ1bmN0aW9uIHRlKGUpe3Rocm93IGMub25BYm9ydCYmYy5vbkFib3J0KGUpLFIoZT0iQWJvcnRlZCgiK2UrIikiKSxIPSEwLEQ9MSxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLHUoZSksZX1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9ZnVuY3Rpb24gbmUoZSl7aWYoZT09ViYmVClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoVCk7aWYoZClyZXR1cm4gZChlKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gYWUoZSx0LHIpe3JldHVybiBmdW5jdGlvbihlKXtpZighVCYmKG18fHkpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZmV0Y2gmJiFlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSlyZXR1cm4gZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKHQ9PntpZighdC5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0IFwnIitlKyJcJyI7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX0pKS5jYXRjaCgoKCk9Pm5lKGUpKSk7aWYoZilyZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57ZihlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSkscil9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT5uZShlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4ociwoZT0+e1IoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksdGUoZSl9KSl9ZnVuY3Rpb24gb2UoZSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9YFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtlfSlgLHRoaXMuc3RhdHVzPWV9ZnVuY3Rpb24gaWUoZSl7ZS50ZXJtaW5hdGUoKSxlLm9ubWVzc2FnZT0oKT0+e319ZnVuY3Rpb24gc2UoZSl7KGU9Z2UuRmFbZV0pfHx0ZSgpLGdlLmZiKGUpfWZ1bmN0aW9uIHVlKGUpe3ZhciB0PWdlLlphKCk7aWYoIXQpcmV0dXJuIDY7Z2UuSWEucHVzaCh0KSxnZS5GYVtlLkhhXT10LHQuSGE9ZS5IYTt2YXIgcj17Y21kOiJydW4iLHN0YXJ0X3JvdXRpbmU6ZS5nYixhcmc6ZS5ZYSxwdGhyZWFkX3B0cjplLkhhfTtyZXR1cm4gdiYmdC51bnJlZigpLHQucG9zdE1lc3NhZ2UocixlLm1iKSwwfXJlKFY9Im9ydC13YXNtLXRocmVhZGVkLndhc20iKXx8KFY9XyhWKSk7dmFyIGNlPSJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwLGxlPShlLHQscik9Pnt2YXIgbj0odD4+Pj0wKStyO2ZvcihyPXQ7ZVtyXSYmIShyPj1uKTspKytyO2lmKDE2PHItdCYmZS5idWZmZXImJmNlKXJldHVybiBjZS5kZWNvZGUoZS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcj9lLnNsaWNlKHQscik6ZS5zdWJhcnJheSh0LHIpKTtmb3Iobj0iIjt0PHI7KXt2YXIgYT1lW3QrK107aWYoMTI4JmEpe3ZhciBvPTYzJmVbdCsrXTtpZigxOTI9PSgyMjQmYSkpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmYSk8PDZ8byk7ZWxzZXt2YXIgaT02MyZlW3QrK107NjU1MzY+KGE9MjI0PT0oMjQwJmEpPygxNSZhKTw8MTJ8bzw8NnxpOig3JmEpPDwxOHxvPDwxMnxpPDw2fDYzJmVbdCsrXSk/bis9U3RyaW5nLmZyb21DaGFyQ29kZShhKTooYS09NjU1MzYsbis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxhPj4xMCw1NjMyMHwxMDIzJmEpKX19ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxmZT0oZSx0KT0+KGU+Pj49MCk/bGUobigpLGUsdCk6IiI7ZnVuY3Rpb24gZGUoZSl7aWYoYilyZXR1cm4gcWUoMSwxLGUpO0Q9ZSxxKCl8fChnZS5oYigpLGMub25FeGl0JiZjLm9uRXhpdChlKSxIPSEwKSxoKGUsbmV3IG9lKGUpKX12YXIgcGU9ZT0+e2lmKEQ9ZSxiKXRocm93IG1lKGUpLCJ1bndpbmQiO2RlKGUpfSxnZT17TGE6W10sSWE6W10sVGE6W10sRmE6e30sUGE6ZnVuY3Rpb24oKXtiP2dlLmFiKCk6Z2UuJGEoKX0sJGE6ZnVuY3Rpb24oKXtHLnVuc2hpZnQoKCgpPT57USgpLGdlLmJiKCgoKT0+ZWUoKSkpfSkpfSxhYjpmdW5jdGlvbigpe2dlLnJlY2VpdmVPYmplY3RUcmFuc2Zlcj1nZS5lYixnZS50aHJlYWRJbml0VExTPWdlLlNhLGdlLnNldEV4aXRTdGF0dXM9Z2UuUmEsRj0hMX0sUmE6ZnVuY3Rpb24oZSl7RD1lfSxyYjpbIiR0ZXJtaW5hdGVXb3JrZXIiXSxoYjpmdW5jdGlvbigpe2Zvcih2YXIgZSBvZiBnZS5JYSlpZShlKTtmb3IoZSBvZiBnZS5MYSlpZShlKTtnZS5MYT1bXSxnZS5JYT1bXSxnZS5GYT1bXX0sZmI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5IYTtkZWxldGUgZ2UuRmFbdF0sZ2UuTGEucHVzaChlKSxnZS5JYS5zcGxpY2UoZ2UuSWEuaW5kZXhPZihlKSwxKSxlLkhhPTAseXQodCl9LGViOmZ1bmN0aW9uKCl7fSxTYTpmdW5jdGlvbigpe2dlLlRhLmZvckVhY2goKGU9PmUoKSkpfSxjYjplPT5uZXcgUHJvbWlzZSgodD0+e2Uub25tZXNzYWdlPXI9Pnt2YXIgbj0ocj1yLmRhdGEpLmNtZDtpZihyLnRhcmdldFRocmVhZCYmci50YXJnZXRUaHJlYWQhPWR0KCkpe3ZhciBhPWdlLkZhW3IucWJdO2E/YS5wb3N0TWVzc2FnZShyLHIudHJhbnNmZXJMaXN0KTpSKFwnSW50ZXJuYWwgZXJyb3IhIFdvcmtlciBzZW50IGEgbWVzc2FnZSAiXCcrbitcJyIgdG8gdGFyZ2V0IHB0aHJlYWQgXCcrci50YXJnZXRUaHJlYWQrIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhIil9ZWxzZSJjaGVja01haWxib3giPT09bj9IZSgpOiJzcGF3blRocmVhZCI9PT1uP3VlKHIpOiJjbGVhbnVwVGhyZWFkIj09PW4/c2Uoci50aHJlYWQpOiJraWxsVGhyZWFkIj09PW4/KHI9ci50aHJlYWQsbj1nZS5GYVtyXSxkZWxldGUgZ2UuRmFbcl0saWUobikseXQociksZ2UuSWEuc3BsaWNlKGdlLklhLmluZGV4T2YobiksMSksbi5IYT0wKToiY2FuY2VsVGhyZWFkIj09PW4/Z2UuRmFbci50aHJlYWRdLnBvc3RNZXNzYWdlKHtjbWQ6ImNhbmNlbCJ9KToibG9hZGVkIj09PW4/KGUubG9hZGVkPSEwLHQoZSkpOiJhbGVydCI9PT1uP2FsZXJ0KCJUaHJlYWQgIityLnRocmVhZElkKyI6ICIrci50ZXh0KToic2V0aW1tZWRpYXRlIj09PXIudGFyZ2V0P2UucG9zdE1lc3NhZ2Uocik6ImNhbGxIYW5kbGVyIj09PW4/Y1tyLmhhbmRsZXJdKC4uLnIuYXJncyk6biYmUigid29ya2VyIHNlbnQgYW4gdW5rbm93biBjb21tYW5kICIrbil9LGUub25lcnJvcj1lPT57dGhyb3cgUigid29ya2VyIHNlbnQgYW4gZXJyb3IhICIrZS5maWxlbmFtZSsiOiIrZS5saW5lbm8rIjogIitlLm1lc3NhZ2UpLGV9LHYmJihlLm9uKCJtZXNzYWdlIiwoZnVuY3Rpb24odCl7ZS5vbm1lc3NhZ2Uoe2RhdGE6dH0pfSkpLGUub24oImVycm9yIiwoZnVuY3Rpb24odCl7ZS5vbmVycm9yKHQpfSkpKTt2YXIgcixuPVtdO2ZvcihyIG9mWyJvbkV4aXQiLCJvbkFib3J0IiwicHJpbnQiLCJwcmludEVyciJdKWMuaGFzT3duUHJvcGVydHkocikmJm4ucHVzaChyKTtlLnBvc3RNZXNzYWdlKHtjbWQ6ImxvYWQiLGhhbmRsZXJzOm4sdXJsT3JCbG9iOmMubWFpblNjcmlwdFVybE9yQmxvYnx8X3NjcmlwdERpcix3YXNtTWVtb3J5Omssd2FzbU1vZHVsZTpQfSl9KSksYmI6ZnVuY3Rpb24oZSl7ZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBlPV8oIm9ydC13YXNtLXRocmVhZGVkLndvcmtlci5qcyIpO2U9bmV3IFdvcmtlcihlKSxnZS5MYS5wdXNoKGUpfSxaYTpmdW5jdGlvbigpe3JldHVybiAwPT1nZS5MYS5sZW5ndGgmJihnZS5YYSgpLGdlLmNiKGdlLkxhWzBdKSksZ2UuTGEucG9wKCl9fTtjLlBUaHJlYWQ9Z2U7dmFyIGhlPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShjKX07ZnVuY3Rpb24gbWUoZSl7aWYoYilyZXR1cm4gcWUoMiwwLGUpO3BlKGUpfWMuZXN0YWJsaXNoU3RhY2tTcGFjZT1mdW5jdGlvbigpe3ZhciBlPWR0KCksdD1hKClbZSs1Mj4+Mj4+PjBdO2U9YSgpW2UrNTY+PjI+Pj4wXSxfdCh0LHQtZSksU3QodCl9O3ZhciB5ZT1bXTtmdW5jdGlvbiB2ZShlKXt0aGlzLk9hPWUtMjQsdGhpcy5XYT1mdW5jdGlvbihlKXtvKClbdGhpcy5PYSs0Pj4yPj4+MF09ZX0sdGhpcy5WYT1mdW5jdGlvbihlKXtvKClbdGhpcy5PYSs4Pj4yPj4+MF09ZX0sdGhpcy5QYT1mdW5jdGlvbihlLHQpe3RoaXMuVWEoKSx0aGlzLldhKGUpLHRoaXMuVmEodCl9LHRoaXMuVWE9ZnVuY3Rpb24oKXtvKClbdGhpcy5PYSsxNj4+Mj4+PjBdPTB9fWZ1bmN0aW9uIGJlKGUsdCxyLG4pe3JldHVybiBiP3FlKDMsMSxlLHQscixuKTp3ZShlLHQscixuKX1mdW5jdGlvbiB3ZShlLHQscixuKXtpZihlPj4+PTAsdD4+Pj0wLHI+Pj49MCxuPj4+PTAsInVuZGVmaW5lZCI9PXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4gUigiQ3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFNoYXJlZEFycmF5QnVmZmVyLCBwdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSEiKSw2O3ZhciBhPVtdO3JldHVybiBiJiYwPT09YS5sZW5ndGg/YmUoZSx0LHIsbik6KGU9e2diOnIsSGE6ZSxZYTpuLG1iOmF9LGI/KGUub2I9InNwYXduVGhyZWFkIixwb3N0TWVzc2FnZShlLGEpLDApOnVlKGUpKX1mdW5jdGlvbiBfZShlLHQscil7cmV0dXJuIGI/cWUoNCwxLGUsdCxyKTowfWZ1bmN0aW9uIE9lKGUsdCl7aWYoYilyZXR1cm4gcWUoNSwxLGUsdCl9Yy5pbnZva2VFbnRyeVBvaW50PWZ1bmN0aW9uKGUsdCl7dmFyIHI9eWVbZV07cnx8KGU+PXllLmxlbmd0aCYmKHllLmxlbmd0aD1lKzEpLHllW2VdPXI9ei5nZXQoZSkpLGU9cih0KSxxKCk/Z2UuUmEoZSk6dnQoZSl9O3ZhciBTZT1lPT57Zm9yKHZhciB0PTAscj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7MTI3Pj1uP3QrKzoyMDQ3Pj1uP3QrPTI6NTUyOTY8PW4mJjU3MzQzPj1uPyh0Kz00LCsrcik6dCs9M31yZXR1cm4gdH0sRWU9KGUsdCxyLG4pPT57aWYoISgwPG4pKXJldHVybiAwO3ZhciBhPXI+Pj49MDtuPXIrbi0xO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgaT1lLmNoYXJDb2RlQXQobyk7aWYoNTUyOTY8PWkmJjU3MzQzPj1pJiYoaT02NTUzNisoKDEwMjMmaSk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK28pKSwxMjc+PWkpe2lmKHI+PW4pYnJlYWs7dFtyKys+Pj4wXT1pfWVsc2V7aWYoMjA0Nz49aSl7aWYocisxPj1uKWJyZWFrO3RbcisrPj4+MF09MTkyfGk+PjZ9ZWxzZXtpZig2NTUzNT49aSl7aWYocisyPj1uKWJyZWFrO3RbcisrPj4+MF09MjI0fGk+PjEyfWVsc2V7aWYociszPj1uKWJyZWFrO3RbcisrPj4+MF09MjQwfGk+PjE4LHRbcisrPj4+MF09MTI4fGk+PjEyJjYzfXRbcisrPj4+MF09MTI4fGk+PjYmNjN9dFtyKys+Pj4wXT0xMjh8NjMmaX19cmV0dXJuIHRbcj4+PjBdPTAsci1hfSxBZT0oZSx0LHIpPT5FZShlLG4oKSx0LHIpO2Z1bmN0aW9uIFRlKGUsdCl7aWYoYilyZXR1cm4gcWUoNiwxLGUsdCl9ZnVuY3Rpb24gTWUoZSx0LHIpe2lmKGIpcmV0dXJuIHFlKDcsMSxlLHQscil9ZnVuY3Rpb24gUmUoZSx0LHIpe3JldHVybiBiP3FlKDgsMSxlLHQscik6MH1mdW5jdGlvbiBGZShlLHQpe2lmKGIpcmV0dXJuIHFlKDksMSxlLHQpfWZ1bmN0aW9uIGtlKGUsdCxyKXtpZihiKXJldHVybiBxZSgxMCwxLGUsdCxyKX1mdW5jdGlvbiBDZShlLHQscixuKXtpZihiKXJldHVybiBxZSgxMSwxLGUsdCxyLG4pfWZ1bmN0aW9uIFBlKGUsdCxyLG4pe2lmKGIpcmV0dXJuIHFlKDEyLDEsZSx0LHIsbil9ZnVuY3Rpb24gRGUoZSx0LHIsbil7aWYoYilyZXR1cm4gcWUoMTMsMSxlLHQscixuKX1mdW5jdGlvbiB4ZShlKXtpZihiKXJldHVybiBxZSgxNCwxLGUpfWZ1bmN0aW9uIEllKGUsdCl7aWYoYilyZXR1cm4gcWUoMTUsMSxlLHQpfWZ1bmN0aW9uIFVlKGUsdCxyKXtpZihiKXJldHVybiBxZSgxNiwxLGUsdCxyKX12YXIgTGU9ZT0+e2lmKCFIKXRyeXtpZihlKCksIXEoKSl0cnl7Yj92dChEKTpwZShEKX1jYXRjaChlKXtlIGluc3RhbmNlb2Ygb2V8fCJ1bndpbmQiPT1lfHxoKDEsZSl9fWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBvZXx8InVud2luZCI9PWV8fGgoMSxlKX19O2Z1bmN0aW9uIFdlKGUpe2U+Pj49MCwiZnVuY3Rpb24iPT10eXBlb2YgQXRvbWljcy5uYiYmKEF0b21pY3MubmIoYSgpLGU+PjIsZSkudmFsdWUudGhlbihIZSksZSs9MTI4LEF0b21pY3Muc3RvcmUoYSgpLGU+PjIsMSkpfWZ1bmN0aW9uIEhlKCl7dmFyIGU9ZHQoKTtlJiYoV2UoZSksTGUoKCgpPT5idCgpKSkpfWMuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0PVdlLGMuY2hlY2tNYWlsYm94PUhlO3ZhciBZZT1lPT4wPT1lJTQmJigwIT1lJTEwMHx8MD09ZSU0MDApLGplPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLHplPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdO2Z1bmN0aW9uIEdlKGUsdCxyLG4sYSxvLGkscyl7cmV0dXJuIGI/cWUoMTcsMSxlLHQscixuLGEsbyxpLHMpOi01Mn1mdW5jdGlvbiBOZShlLHQscixuLGEsbyxpKXtpZihiKXJldHVybiBxZSgxOCwxLGUsdCxyLG4sYSxvLGkpfXZhciBCZT1lPT57dmFyIHQ9U2UoZSkrMSxyPXB0KHQpO3JldHVybiByJiZBZShlLHIsdCkscn0sJGU9ZT0+e3ZhciB0PU90KCk7cmV0dXJuIGU9ZSgpLFN0KHQpLGV9O2Z1bmN0aW9uIHFlKGUsdCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aC0yLG49YXJndW1lbnRzO3JldHVybiAkZSgoKCk9Pntmb3IodmFyIGE9RXQoOCpyKSxvPWE+PjMscz0wO3M8cjtzKyspe3ZhciB1PW5bMitzXTtpKClbbytzPj4+MF09dX1yZXR1cm4gbXQoZSxyLGEsdCl9KSl9dmFyIFZlLEplPVtdLFhlPXt9LEtlPSgpPT57aWYoIVZlKXt2YXIgZSx0PXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzpnfHwiLi90aGlzLnByb2dyYW0ifTtmb3IoZSBpbiBYZSl2b2lkIDA9PT1YZVtlXT9kZWxldGUgdFtlXTp0W2VdPVhlW2VdO3ZhciByPVtdO2ZvcihlIGluIHQpci5wdXNoKGAke2V9PSR7dFtlXX1gKTtWZT1yfXJldHVybiBWZX07ZnVuY3Rpb24gWmUoZSxyKXtpZihiKXJldHVybiBxZSgxOSwxLGUscik7ZT4+Pj0wLHI+Pj49MDt2YXIgbj0wO3JldHVybiBLZSgpLmZvckVhY2goKGZ1bmN0aW9uKGEsaSl7dmFyIHM9cituO2ZvcihpPW8oKVtlKzQqaT4+Mj4+PjBdPXMscz0wO3M8YS5sZW5ndGg7KytzKXQoKVtpKys+PjA+Pj4wXT1hLmNoYXJDb2RlQXQocyk7dCgpW2k+PjA+Pj4wXT0wLG4rPWEubGVuZ3RoKzF9KSksMH1mdW5jdGlvbiBRZShlLHQpe2lmKGIpcmV0dXJuIHFlKDIwLDEsZSx0KTtlPj4+PTAsdD4+Pj0wO3ZhciByPUtlKCk7bygpW2U+PjI+Pj4wXT1yLmxlbmd0aDt2YXIgbj0wO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKGUpe24rPWUubGVuZ3RoKzF9KSksbygpW3Q+PjI+Pj4wXT1uLDB9ZnVuY3Rpb24gZXQoZSl7cmV0dXJuIGI/cWUoMjEsMSxlKTo1Mn1mdW5jdGlvbiB0dChlLHQscixuKXtyZXR1cm4gYj9xZSgyMiwxLGUsdCxyLG4pOjUyfWZ1bmN0aW9uIHJ0KGUsdCxyLG4sYSl7cmV0dXJuIGI/cWUoMjMsMSxlLHQscixuLGEpOjcwfXZhciBudD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gYXQoZSx0LHIsYSl7aWYoYilyZXR1cm4gcWUoMjQsMSxlLHQscixhKTt0Pj4+PTAscj4+Pj0wLGE+Pj49MDtmb3IodmFyIGk9MCxzPTA7czxyO3MrKyl7dmFyIHU9bygpW3Q+PjI+Pj4wXSxjPW8oKVt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgbD0wO2w8YztsKyspe3ZhciBmPW4oKVt1K2w+Pj4wXSxkPW50W2VdOzA9PT1mfHwxMD09PWY/KCgxPT09ZT9NOlIpKGxlKGQsMCkpLGQubGVuZ3RoPTApOmQucHVzaChmKX1pKz1jfXJldHVybiBvKClbYT4+Mj4+PjBdPWksMH12YXIgb3Q9ZT0+KG90PSgoKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gZT0+KGUuc2V0KGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZS5ieXRlTGVuZ3RoKSkpLGUpO2lmKHYpdHJ5e3ZhciBlPXIoNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe310ZSgiaW5pdFJhbmRvbURldmljZSIpfSkoKSkoZSksaXQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxzdD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHV0PShlLHIpPT57dCgpLnNldChlLHI+Pj4wKX07ZnVuY3Rpb24gY3QoZSx0LHIsbil7ZnVuY3Rpb24gbyhlLHQscil7Zm9yKGU9Im51bWJlciI9PXR5cGVvZiBlP2UudG9TdHJpbmcoKTplfHwiIjtlLmxlbmd0aDx0OyllPXJbMF0rZTtyZXR1cm4gZX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG8oZSx0LCIwIil9ZnVuY3Rpb24gcyhlLHQpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIDA+ZT8tMTowPGU/MTowfXZhciBuO3JldHVybiAwPT09KG49cihlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKSkmJjA9PT0obj1yKGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkpKSYmKG49cihlLmdldERhdGUoKS10LmdldERhdGUoKSkpLG59ZnVuY3Rpb24gdShlKXtzd2l0Y2goZS5nZXREYXkoKSl7Y2FzZSAwOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBlO2Nhc2UgMjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMyk7Y2FzZSAzOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpO2Nhc2UgNTpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzEpO2Nhc2UgNjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiBjKGUpe3ZhciB0PWUuSmE7Zm9yKGU9bmV3IERhdGUobmV3IERhdGUoZS5LYSsxOTAwLDAsMSkuZ2V0VGltZSgpKTswPHQ7KXt2YXIgcj1lLmdldE1vbnRoKCksbj0oWWUoZS5nZXRGdWxsWWVhcigpKT9pdDpzdClbcl07aWYoISh0Pm4tZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09bi1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5yP2Uuc2V0TW9udGgocisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSl9cmV0dXJuIHI9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpKzEsMCw0KSx0PXUobmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsNCkpLHI9dShyKSwwPj1zKHQsZSk/MD49cyhyLGUpP2UuZ2V0RnVsbFllYXIoKSsxOmUuZ2V0RnVsbFllYXIoKTplLmdldEZ1bGxZZWFyKCktMX1lPj4+PTAsdD4+Pj0wLHI+Pj49MCxuPj4+PTA7dmFyIGw9YSgpW24rNDA+PjI+Pj4wXTtmb3IodmFyIGYgaW4gbj17a2I6YSgpW24+PjI+Pj4wXSxqYjphKClbbis0Pj4yPj4+MF0sTWE6YSgpW24rOD4+Mj4+PjBdLFFhOmEoKVtuKzEyPj4yPj4+MF0sTmE6YSgpW24rMTY+PjI+Pj4wXSxLYTphKClbbisyMD4+Mj4+PjBdLEdhOmEoKVtuKzI0Pj4yPj4+MF0sSmE6YSgpW24rMjg+PjI+Pj4wXSxzYjphKClbbiszMj4+Mj4+PjBdLGliOmEoKVtuKzM2Pj4yPj4+MF0sbGI6bD9mZShsKToiIn0scj1mZShyKSxsPXsiJWMiOiIlYSAlYiAlZCAlSDolTTolUyAlWSIsIiVEIjoiJW0vJWQvJXkiLCIlRiI6IiVZLSVtLSVkIiwiJWgiOiIlYiIsIiVyIjoiJUk6JU06JVMgJXAiLCIlUiI6IiVIOiVNIiwiJVQiOiIlSDolTTolUyIsIiV4IjoiJW0vJWQvJXkiLCIlWCI6IiVIOiVNOiVTIiwiJUVjIjoiJWMiLCIlRUMiOiIlQyIsIiVFeCI6IiVtLyVkLyV5IiwiJUVYIjoiJUg6JU06JVMiLCIlRXkiOiIleSIsIiVFWSI6IiVZIiwiJU9kIjoiJWQiLCIlT2UiOiIlZSIsIiVPSCI6IiVIIiwiJU9JIjoiJUkiLCIlT20iOiIlbSIsIiVPTSI6IiVNIiwiJU9TIjoiJVMiLCIlT3UiOiIldSIsIiVPVSI6IiVVIiwiJU9WIjoiJVYiLCIlT3ciOiIldyIsIiVPVyI6IiVXIiwiJU95IjoiJXkifSlyPXIucmVwbGFjZShuZXcgUmVnRXhwKGYsImciKSxsW2ZdKTt2YXIgZD0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIikscD0iSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlciIuc3BsaXQoIiAiKTtmb3IoZiBpbiBsPXsiJWEiOmU9PmRbZS5HYV0uc3Vic3RyaW5nKDAsMyksIiVBIjplPT5kW2UuR2FdLCIlYiI6ZT0+cFtlLk5hXS5zdWJzdHJpbmcoMCwzKSwiJUIiOmU9PnBbZS5OYV0sIiVDIjplPT5pKChlLkthKzE5MDApLzEwMHwwLDIpLCIlZCI6ZT0+aShlLlFhLDIpLCIlZSI6ZT0+byhlLlFhLDIsIiAiKSwiJWciOmU9PmMoZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjplPT5jKGUpLCIlSCI6ZT0+aShlLk1hLDIpLCIlSSI6ZT0+KDA9PShlPWUuTWEpP2U9MTI6MTI8ZSYmKGUtPTEyKSxpKGUsMikpLCIlaiI6ZT0+e2Zvcih2YXIgdD0wLHI9MDtyPD1lLk5hLTE7dCs9KFllKGUuS2ErMTkwMCk/aXQ6c3QpW3IrK10pO3JldHVybiBpKGUuUWErdCwzKX0sIiVtIjplPT5pKGUuTmErMSwyKSwiJU0iOmU9PmkoZS5qYiwyKSwiJW4iOigpPT4iXFxuIiwiJXAiOmU9PjA8PWUuTWEmJjEyPmUuTWE/IkFNIjoiUE0iLCIlUyI6ZT0+aShlLmtiLDIpLCIldCI6KCk9PiJcXHQiLCIldSI6ZT0+ZS5HYXx8NywiJVUiOmU9PmkoTWF0aC5mbG9vcigoZS5KYSs3LWUuR2EpLzcpLDIpLCIlViI6ZT0+e3ZhciB0PU1hdGguZmxvb3IoKGUuSmErNy0oZS5HYSs2KSU3KS83KTtpZigyPj0oZS5HYSszNzEtZS5KYS0yKSU3JiZ0KyssdCk1Mz09dCYmKDQ9PShyPShlLkdhKzM3MS1lLkphKSU3KXx8Mz09ciYmWWUoZS5LYSl8fCh0PTEpKTtlbHNle3Q9NTI7dmFyIHI9KGUuR2ErNy1lLkphLTEpJTc7KDQ9PXJ8fDU9PXImJlllKGUuS2ElNDAwLTEpKSYmdCsrfXJldHVybiBpKHQsMil9LCIldyI6ZT0+ZS5HYSwiJVciOmU9PmkoTWF0aC5mbG9vcigoZS5KYSs3LShlLkdhKzYpJTcpLzcpLDIpLCIleSI6ZT0+KGUuS2ErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjplPT5lLkthKzE5MDAsIiV6IjplPT57dmFyIHQ9MDw9KGU9ZS5pYik7cmV0dXJuIGU9TWF0aC5hYnMoZSkvNjAsKHQ/IisiOiItIikrU3RyaW5nKCIwMDAwIisoZS82MCoxMDArZSU2MCkpLnNsaWNlKC00KX0sIiVaIjplPT5lLmxiLCIlJSI6KCk9PiIlIn0scj1yLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpLGwpci5pbmNsdWRlcyhmKSYmKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoZiwiZyIpLGxbZl0obikpKTtyZXR1cm4gZj1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShTZShlKSsxKTtyZXR1cm4gRWUoZSx0LDAsdC5sZW5ndGgpLHR9KHI9ci5yZXBsYWNlKC9cXDBcXDAvZywiJSIpKSxmLmxlbmd0aD50PzA6KHV0KGYsZSksZi5sZW5ndGgtMSl9Z2UuUGEoKTt2YXIgbHQ9W251bGwsZGUsbWUsYmUsX2UsT2UsVGUsTWUsUmUsRmUsa2UsQ2UsUGUsRGUseGUsSWUsVWUsR2UsTmUsWmUsUWUsZXQsdHQscnQsYXRdLGZ0PXtiOmZ1bmN0aW9uKGUsdCxyKXt0aHJvdyBuZXcgdmUoZT4+Pj0wKS5QYSh0Pj4+MCxyPj4+MCksZX0sTjpmdW5jdGlvbihlKXtndChlPj4+MCwheSwxLCFtLDEzMTA3MiwhMSksZ2UuU2EoKX0sazpmdW5jdGlvbihlKXtlPj4+PTAsYj9wb3N0TWVzc2FnZSh7Y21kOiJjbGVhbnVwVGhyZWFkIix0aHJlYWQ6ZX0pOnNlKGUpfSxJOndlLGg6X2UsVDpPZSxFOlRlLEc6TWUsVTpSZSxSOkZlLEo6a2UsUTpDZSxvOlBlLEY6RGUsQzp4ZSxTOkllLEQ6VWUscTooKT0+ITAsQTpmdW5jdGlvbihlLHQpeyhlPj4+PTApPT10Pj4+MD9zZXRUaW1lb3V0KCgoKT0+SGUoKSkpOmI/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPWdlLkZhW2VdKSYmZS5wb3N0TWVzc2FnZSh7Y21kOiJjaGVja01haWxib3gifSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sTTpXZSxwOmZ1bmN0aW9uKGUpe3YmJmdlLkZhW2U+Pj4wXS5yZWYoKX0sdDpmdW5jdGlvbihlLHQscil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixyPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksYSgpW3I+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxhKClbcis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksYSgpW3IrOD4+Mj4+PjBdPWUuZ2V0VVRDSG91cnMoKSxhKClbcisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGEoKVtyKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLGEoKVtyKzIwPj4yPj4+MF09ZS5nZXRVVENGdWxsWWVhcigpLTE5MDAsYSgpW3IrMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsYSgpW3IrMjg+PjI+Pj4wXT1lfSx1OmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxhKClbcj4+Mj4+PjBdPWUuZ2V0U2Vjb25kcygpLGEoKVtyKzQ+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxhKClbcis4Pj4yPj4+MF09ZS5nZXRIb3VycygpLGEoKVtyKzEyPj4yPj4+MF09ZS5nZXREYXRlKCksYSgpW3IrMTY+PjI+Pj4wXT1lLmdldE1vbnRoKCksYSgpW3IrMjA+PjI+Pj4wXT1lLmdldEZ1bGxZZWFyKCktMTkwMCxhKClbcisyND4+Mj4+PjBdPWUuZ2V0RGF5KCksdD0oWWUoZS5nZXRGdWxsWWVhcigpKT9qZTp6ZSlbZS5nZXRNb250aCgpXStlLmdldERhdGUoKS0xfDAsYSgpW3IrMjg+PjI+Pj4wXT10LGEoKVtyKzM2Pj4yPj4+MF09LTYwKmUuZ2V0VGltZXpvbmVPZmZzZXQoKSx0PW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIG49bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtlPTB8KHQhPW4mJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4obix0KSksYSgpW3IrMzI+PjI+Pj4wXT1lfSx2OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShhKClbZSsyMD4+Mj4+PjBdKzE5MDAsYSgpW2UrMTY+PjI+Pj4wXSxhKClbZSsxMj4+Mj4+PjBdLGEoKVtlKzg+PjI+Pj4wXSxhKClbZSs0Pj4yPj4+MF0sYSgpW2U+PjI+Pj4wXSwwKSxyPWEoKVtlKzMyPj4yPj4+MF0sbj10LmdldFRpbWV6b25lT2Zmc2V0KCksbz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpLGk9bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxzPU1hdGgubWluKGksbyk7cmV0dXJuIDA+cj9hKClbZSszMj4+Mj4+PjBdPU51bWJlcihvIT1pJiZzPT1uKTowPHIhPShzPT1uKSYmKG89TWF0aC5tYXgoaSxvKSx0LnNldFRpbWUodC5nZXRUaW1lKCkrNmU0KigoMDxyP3M6byktbikpKSxhKClbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCkscj0oWWUodC5nZXRGdWxsWWVhcigpKT9qZTp6ZSlbdC5nZXRNb250aCgpXSt0LmdldERhdGUoKS0xfDAsYSgpW2UrMjg+PjI+Pj4wXT1yLGEoKVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksYSgpW2UrND4+Mj4+PjBdPXQuZ2V0TWludXRlcygpLGEoKVtlKzg+PjI+Pj4wXT10LmdldEhvdXJzKCksYSgpW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxhKClbZSsxNj4+Mj4+PjBdPXQuZ2V0TW9udGgoKSxhKClbZSsyMD4+Mj4+PjBdPXQuZ2V0WWVhcigpLGU9dC5nZXRUaW1lKCkvMWUzLHd0KChKPWUsMTw9K01hdGguYWJzKEopPzA8Sj8rTWF0aC5mbG9vcihKLzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKEotKyh+fko+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApKSxlPj4+MH0scjpHZSxzOk5lLHo6ZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKT9lWzFdOiJHTVQifWU+Pj49MCx0Pj4+PTAscj4+Pj0wO3ZhciBpPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxzPW5ldyBEYXRlKGksMCwxKSx1PW5ldyBEYXRlKGksNiwxKTtpPXMuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgYz11LmdldFRpbWV6b25lT2Zmc2V0KCksbD1NYXRoLm1heChpLGMpO28oKVtlPj4yPj4+MF09NjAqbCxhKClbdD4+Mj4+PjBdPU51bWJlcihpIT1jKSxlPW4ocyksdD1uKHUpLGU9QmUoZSksdD1CZSh0KSxjPGk/KG8oKVtyPj4yPj4+MF09ZSxvKClbcis0Pj4yPj4+MF09dCk6KG8oKVtyPj4yPj4+MF09dCxvKClbcis0Pj4yPj4+MF09ZSl9LGM6KCk9Pnt0ZSgiIil9LGw6ZnVuY3Rpb24oKXt9LGk6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sVjooKT0+e3Rocm93ICQrPTEsInVud2luZCJ9LEI6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sZTooKT0+cGVyZm9ybWFuY2UudGltZU9yaWdpbitwZXJmb3JtYW5jZS5ub3coKSxmOmZ1bmN0aW9uKCl7cmV0dXJuIHY/cig5OTMpLmNwdXMoKS5sZW5ndGg6bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l9LEs6ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKGdlLnBiPXQ+Pj4wLEplLmxlbmd0aD1yLHQ9bj4+PjA+PjMsbj0wO248cjtuKyspSmVbbl09aSgpW3Qrbj4+PjBdO3JldHVybiBsdFtlXS5hcHBseShudWxsLEplKX0seTpmdW5jdGlvbihlKXtlPj4+PTA7dmFyIHQ9bigpLmxlbmd0aDtpZihlPD10fHw0Mjk0OTAxNzYwPGUpcmV0dXJuITE7Zm9yKHZhciByPTE7ND49cjtyKj0yKXt2YXIgYT10KigxKy4yL3IpO2E9TWF0aC5taW4oYSxlKzEwMDY2MzI5Nik7dmFyIG89TWF0aDthPU1hdGgubWF4KGUsYSk7ZTp7bz1vLm1pbi5jYWxsKG8sNDI5NDkwMTc2MCxhKyg2NTUzNi1hJTY1NTM2KSU2NTUzNiktay5idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2O3RyeXtrLmdyb3cobyksWSgpO3ZhciBpPTE7YnJlYWsgZX1jYXRjaChlKXt9aT12b2lkIDB9aWYoaSlyZXR1cm4hMH1yZXR1cm4hMX0sTzpaZSxQOlFlLGo6cGUsZzpldCxuOnR0LHc6cnQsbTphdCx4OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+Pj49MCx0Pj4+PTAsb3QobigpLnN1YmFycmF5KGU+Pj4wLGUrdD4+PjApKSwwfSxhOmt8fGMud2FzbU1lbW9yeSxIOmN0LGQ6ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIGN0KGU+Pj4wLHQ+Pj4wLHI+Pj4wLG4+Pj4wKX19OyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtyZXR1cm4gZT1lLmV4cG9ydHMsQz1lPWZ1bmN0aW9uKGUpe3ZhciB0PWU9PigpPT5lKCk+Pj4wLHI9ZT0+dD0+ZSh0KT4+PjA7cmV0dXJuKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5wdGhyZWFkX3NlbGY9dChlLnB0aHJlYWRfc2VsZiksZS5tYWxsb2M9cihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPXIoZS5zdGFja0FsbG9jKSxlfShlKSxnZS5UYS5wdXNoKEMuc2EpLHo9Qy50YSxOLnVuc2hpZnQoQy5XKSxQPXQsZWUoKSxlfXZhciB0PXthOmZ0fTtpZihRKCksYy5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBjLmluc3RhbnRpYXRlV2FzbSh0LGUpfWNhdGNoKGUpe1IoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrZSksdShlKX0oZnVuY3Rpb24oZSx0KXt2YXIgcj1WO3JldHVybiBUfHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fHJlKHIpfHxyLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKXx8dnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGZldGNoP2FlKHIsZSx0KTpmZXRjaChyLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigobj0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobixlKS50aGVuKHQsKGZ1bmN0aW9uKG4pe3JldHVybiBSKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIituKSxSKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLGFlKHIsZSx0KX0pKSkpfSkodCwoZnVuY3Rpb24odCl7ZSh0Lmluc3RhbmNlLHQubW9kdWxlKX0pKS5jYXRjaCh1KX0oKSxjLl9PcnRJbml0PShlLHQpPT4oYy5fT3J0SW5pdD1DLlgpKGUsdCksYy5fT3J0R2V0TGFzdEVycm9yPShlLHQpPT4oYy5fT3J0R2V0TGFzdEVycm9yPUMuWSkoZSx0KSxjLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0oZSx0LHIsbixhLG8saSxzLHUsbCk9PihjLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1DLlopKGUsdCxyLG4sYSxvLGkscyx1LGwpLGMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShlLHQpPT4oYy5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9Qy5fKShlLHQpLGMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0oZSx0LHIpPT4oYy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PUMuJCkoZSx0LHIpLGMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1lPT4oYy5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPUMuYWEpKGUpLGMuX09ydENyZWF0ZVNlc3Npb249KGUsdCxyKT0+KGMuX09ydENyZWF0ZVNlc3Npb249Qy5iYSkoZSx0LHIpLGMuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihjLl9PcnRSZWxlYXNlU2Vzc2lvbj1DLmNhKShlKSxjLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShlLHQscik9PihjLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PUMuZGEpKGUsdCxyKSxjLl9PcnRHZXRJbnB1dE5hbWU9KGUsdCk9PihjLl9PcnRHZXRJbnB1dE5hbWU9Qy5lYSkoZSx0KSxjLl9PcnRHZXRPdXRwdXROYW1lPShlLHQpPT4oYy5fT3J0R2V0T3V0cHV0TmFtZT1DLmZhKShlLHQpLGMuX09ydEZyZWU9ZT0+KGMuX09ydEZyZWU9Qy5nYSkoZSksYy5fT3J0Q3JlYXRlVGVuc29yPShlLHQscixuLGEpPT4oYy5fT3J0Q3JlYXRlVGVuc29yPUMuaGEpKGUsdCxyLG4sYSksYy5fT3J0R2V0VGVuc29yRGF0YT0oZSx0LHIsbixhKT0+KGMuX09ydEdldFRlbnNvckRhdGE9Qy5pYSkoZSx0LHIsbixhKSxjLl9PcnRSZWxlYXNlVGVuc29yPWU9PihjLl9PcnRSZWxlYXNlVGVuc29yPUMuamEpKGUpLGMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9KGUsdCxyLG4pPT4oYy5fT3J0Q3JlYXRlUnVuT3B0aW9ucz1DLmthKShlLHQscixuKSxjLl9PcnRBZGRSdW5Db25maWdFbnRyeT0oZSx0LHIpPT4oYy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9Qy5sYSkoZSx0LHIpLGMuX09ydFJlbGVhc2VSdW5PcHRpb25zPWU9PihjLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1DLm1hKShlKSxjLl9PcnRSdW49KGUsdCxyLG4sYSxvLGkscyk9PihjLl9PcnRSdW49Qy5uYSkoZSx0LHIsbixhLG8saSxzKSxjLl9PcnRFbmRQcm9maWxpbmc9ZT0+KGMuX09ydEVuZFByb2ZpbGluZz1DLm9hKShlKTt2YXIgZHQ9Yy5fcHRocmVhZF9zZWxmPSgpPT4oZHQ9Yy5fcHRocmVhZF9zZWxmPUMucGEpKCkscHQ9Yy5fbWFsbG9jPWU9PihwdD1jLl9tYWxsb2M9Qy5xYSkoZSk7Yy5fZnJlZT1lPT4oYy5fZnJlZT1DLnJhKShlKSxjLl9fZW1zY3JpcHRlbl90bHNfaW5pdD0oKT0+KGMuX19lbXNjcmlwdGVuX3Rsc19pbml0PUMuc2EpKCk7dmFyIGd0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PShlLHQscixuLGEsbyk9PihndD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1DLnVhKShlLHQscixuLGEsbyk7Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9KCk9PihjLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD1DLnZhKSgpO3ZhciBodCxtdD0oZSx0LHIsbik9PihtdD1DLndhKShlLHQscixuKSx5dD1lPT4oeXQ9Qy54YSkoZSksdnQ9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQ9ZT0+KHZ0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PUMueWEpKGUpLGJ0PWMuX19lbXNjcmlwdGVuX2NoZWNrX21haWxib3g9KCk9PihidD1jLl9fZW1zY3JpcHRlbl9jaGVja19tYWlsYm94PUMuemEpKCksd3Q9ZT0+KHd0PUMuQWEpKGUpLF90PShlLHQpPT4oX3Q9Qy5CYSkoZSx0KSxPdD0oKT0+KE90PUMuQ2EpKCksU3Q9ZT0+KFN0PUMuRGEpKGUpLEV0PWU9PihFdD1DLkVhKShlKTtmdW5jdGlvbiBBdCgpe2Z1bmN0aW9uIGUoKXtpZighaHQmJihodD0hMCxjLmNhbGxlZFJ1bj0hMCwhSCkmJihifHxoZShOKSxzKGMpLGMub25SdW50aW1lSW5pdGlhbGl6ZWQmJmMub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwhYikpe2lmKGMucG9zdFJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGMucG9zdFJ1biYmKGMucG9zdFJ1bj1bYy5wb3N0UnVuXSk7Yy5wb3N0UnVuLmxlbmd0aDspe3ZhciBlPWMucG9zdFJ1bi5zaGlmdCgpO0IudW5zaGlmdChlKX1oZShCKX19aWYoISgwPFgpKWlmKGIpcyhjKSxifHxoZShOKSxzdGFydFdvcmtlcihjKTtlbHNle2lmKGMucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYy5wcmVSdW4mJihjLnByZVJ1bj1bYy5wcmVSdW5dKTtjLnByZVJ1bi5sZW5ndGg7KUcudW5zaGlmdChjLnByZVJ1bi5zaGlmdCgpKTtoZShHKSwwPFh8fChjLnNldFN0YXR1cz8oYy5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Yy5zZXRTdGF0dXMoIiIpfSksMSksZSgpfSksMSkpOmUoKSl9fWlmKGMua2VlcFJ1bnRpbWVBbGl2ZT1xLGMud2FzbU1lbW9yeT1rLGMuc3RhY2tBbGxvYz1FdCxjLnN0YWNrU2F2ZT1PdCxjLnN0YWNrUmVzdG9yZT1TdCxjLlVURjhUb1N0cmluZz1mZSxjLnN0cmluZ1RvVVRGOD1BZSxjLmxlbmd0aEJ5dGVzVVRGOD1TZSxjLkV4aXRTdGF0dXM9b2UsYy5QVGhyZWFkPWdlLFo9ZnVuY3Rpb24gZSgpe2h0fHxBdCgpLGh0fHwoWj1lKX0sYy5wcmVJbml0KWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYy5wcmVJbml0JiYoYy5wcmVJbml0PVtjLnByZUluaXRdKTswPGMucHJlSW5pdC5sZW5ndGg7KWMucHJlSW5pdC5wb3AoKSgpO3JldHVybiBBdCgpLGUucmVhZHl9KTtlLmV4cG9ydHM9bn0sOTMyOihlLHQscik9Pnt2YXIgX3NjcmlwdERpcixuPShfc2NyaXB0RGlyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKF9zY3JpcHREaXI9X3NjcmlwdERpcnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7dmFyIHQsbixhPWU7YS5yZWFkeT1uZXcgUHJvbWlzZSgoKGUscik9Pnt0PWUsbj1yfSkpO3ZhciBvLGkscyx1PU9iamVjdC5hc3NpZ24oe30sYSksYz0iLi90aGlzLnByb2dyYW0iLGw9KGUsdCk9Pnt0aHJvdyB0fSxmPSJvYmplY3QiPT10eXBlb2Ygd2luZG93LGQ9ImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMscD0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsZz0iIjtpZihwKXt2YXIgaD1yKDM4NCksbT1yKDkwOCk7Zz1kP20uZGlybmFtZShnKSsiLyI6X19kaXJuYW1lKyIvIixvPShlLHQpPT4oZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOm0ubm9ybWFsaXplKGUpLGgucmVhZEZpbGVTeW5jKGUsdD92b2lkIDA6InV0ZjgiKSkscz1lPT4oKGU9byhlLCEwKSkuYnVmZmVyfHwoZT1uZXcgVWludDhBcnJheShlKSksZSksaT0oZSx0LHIsbj0hMCk9PntlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksaC5yZWFkRmlsZShlLG4/dm9pZCAwOiJ1dGY4IiwoKGUsYSk9PntlP3IoZSk6dChuP2EuYnVmZmVyOmEpfSkpfSwhYS50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYoYz1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxsPShlLHQpPT57dGhyb3cgcHJvY2Vzcy5leGl0Q29kZT1lLHR9LGEuaW5zcGVjdD0oKT0+IltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn1lbHNlKGZ8fGQpJiYoZD9nPXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoZz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksX3NjcmlwdERpciYmKGc9X3NjcmlwdERpciksZz0wIT09Zy5pbmRleE9mKCJibG9iOiIpP2cuc3Vic3RyKDAsZy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLG89ZT0+e3ZhciB0PW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gdC5vcGVuKCJHRVQiLGUsITEpLHQuc2VuZChudWxsKSx0LnJlc3BvbnNlVGV4dH0sZCYmKHM9ZT0+e3ZhciB0PW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gdC5vcGVuKCJHRVQiLGUsITEpLHQucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsdC5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KHQucmVzcG9uc2UpfSksaT0oZSx0LHIpPT57dmFyIG49bmV3IFhNTEh0dHBSZXF1ZXN0O24ub3BlbigiR0VUIixlLCEwKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4ub25sb2FkPSgpPT57MjAwPT1uLnN0YXR1c3x8MD09bi5zdGF0dXMmJm4ucmVzcG9uc2U/dChuLnJlc3BvbnNlKTpyKCl9LG4ub25lcnJvcj1yLG4uc2VuZChudWxsKX0pO3ZhciB5LHY9YS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxiPWEucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGEsdSksdT1udWxsLGEudGhpc1Byb2dyYW0mJihjPWEudGhpc1Byb2dyYW0pLGEucXVpdCYmKGw9YS5xdWl0KSxhLndhc21CaW5hcnkmJih5PWEud2FzbUJpbmFyeSk7dmFyIHc9YS5ub0V4aXRSdW50aW1lfHwhMDsib2JqZWN0IiE9dHlwZW9mIFdlYkFzc2VtYmx5JiZXKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIF8sTyxTLEUsQSxULE09ITE7ZnVuY3Rpb24gUigpe3ZhciBlPV8uYnVmZmVyO2EuSEVBUDg9Uz1uZXcgSW50OEFycmF5KGUpLGEuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGEuSEVBUDMyPUE9bmV3IEludDMyQXJyYXkoZSksYS5IRUFQVTg9RT1uZXcgVWludDhBcnJheShlKSxhLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGEuSEVBUFUzMj1UPW5ldyBVaW50MzJBcnJheShlKSxhLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxhLkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShlKX12YXIgRj1bXSxrPVtdLEM9W107ZnVuY3Rpb24gUCgpe3ZhciBlPWEucHJlUnVuLnNoaWZ0KCk7Ri51bnNoaWZ0KGUpfXZhciBELHgsST0wLFU9bnVsbCxMPW51bGw7ZnVuY3Rpb24gVyhlKXt0aHJvdyBhLm9uQWJvcnQmJmEub25BYm9ydChlKSxiKGU9IkFib3J0ZWQoIitlKyIpIiksTT0hMCxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLG4oZSksZX1mdW5jdGlvbiBIKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1pZighSChEPSJvcnQtd2FzbS53YXNtIikpe3ZhciBZPUQ7RD1hLmxvY2F0ZUZpbGU/YS5sb2NhdGVGaWxlKFksZyk6ZytZfWZ1bmN0aW9uIGooZSl7aWYoZT09RCYmeSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeSk7aWYocylyZXR1cm4gcyhlKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24geihlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCF5JiYoZnx8ZCkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgXCciK2UrIlwnIjtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfSkpLmNhdGNoKCgoKT0+aihlKSkpO2lmKGkpcmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e2koZSwoZT0+dChuZXcgVWludDhBcnJheShlKSkpLHIpfSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+aihlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4ociwoZT0+e2IoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksVyhlKX0pKX1mdW5jdGlvbiBHKGUpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPWBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7ZX0pYCx0aGlzLnN0YXR1cz1lfXZhciBOPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShhKX07ZnVuY3Rpb24gQihlKXt0aGlzLnFhPWUtMjQsdGhpcy52YT1mdW5jdGlvbihlKXtUW3RoaXMucWErND4+Mj4+PjBdPWV9LHRoaXMudWE9ZnVuY3Rpb24oZSl7VFt0aGlzLnFhKzg+PjI+Pj4wXT1lfSx0aGlzLnNhPWZ1bmN0aW9uKGUsdCl7dGhpcy50YSgpLHRoaXMudmEoZSksdGhpcy51YSh0KX0sdGhpcy50YT1mdW5jdGlvbigpe1RbdGhpcy5xYSsxNj4+Mj4+PjBdPTB9fXZhciAkLHE9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAsVj0oZSx0LHIpPT57dmFyIG49KHQ+Pj49MCkrcjtmb3Iocj10O2Vbcl0mJiEocj49bik7KSsrcjtpZigxNjxyLXQmJmUuYnVmZmVyJiZxKXJldHVybiBxLmRlY29kZShlLnN1YmFycmF5KHQscikpO2ZvcihuPSIiO3Q8cjspe3ZhciBhPWVbdCsrXTtpZigxMjgmYSl7dmFyIG89NjMmZVt0KytdO2lmKDE5Mj09KDIyNCZhKSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZhKTw8NnxvKTtlbHNle3ZhciBpPTYzJmVbdCsrXTs2NTUzNj4oYT0yMjQ9PSgyNDAmYSk/KDE1JmEpPDwxMnxvPDw2fGk6KDcmYSk8PDE4fG88PDEyfGk8PDZ8NjMmZVt0KytdKT9uKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpOihhLT02NTUzNixuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGE+PjEwLDU2MzIwfDEwMjMmYSkpfX1lbHNlIG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoYSl9cmV0dXJuIG59LEo9KGUsdCk9PihlPj4+PTApP1YoRSxlLHQpOiIiLFg9ZT0+e2Zvcih2YXIgdD0wLHI9MDtyPGUubGVuZ3RoOysrcil7dmFyIG49ZS5jaGFyQ29kZUF0KHIpOzEyNz49bj90Kys6MjA0Nz49bj90Kz0yOjU1Mjk2PD1uJiY1NzM0Mz49bj8odCs9NCwrK3IpOnQrPTN9cmV0dXJuIHR9LEs9KGUsdCxyLG4pPT57aWYoISgwPG4pKXJldHVybiAwO3ZhciBhPXI+Pj49MDtuPXIrbi0xO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgaT1lLmNoYXJDb2RlQXQobyk7aWYoNTUyOTY8PWkmJjU3MzQzPj1pJiYoaT02NTUzNisoKDEwMjMmaSk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK28pKSwxMjc+PWkpe2lmKHI+PW4pYnJlYWs7dFtyKys+Pj4wXT1pfWVsc2V7aWYoMjA0Nz49aSl7aWYocisxPj1uKWJyZWFrO3RbcisrPj4+MF09MTkyfGk+PjZ9ZWxzZXtpZig2NTUzNT49aSl7aWYocisyPj1uKWJyZWFrO3RbcisrPj4+MF09MjI0fGk+PjEyfWVsc2V7aWYociszPj1uKWJyZWFrO3RbcisrPj4+MF09MjQwfGk+PjE4LHRbcisrPj4+MF09MTI4fGk+PjEyJjYzfXRbcisrPj4+MF09MTI4fGk+PjYmNjN9dFtyKys+Pj4wXT0xMjh8NjMmaX19cmV0dXJuIHRbcj4+PjBdPTAsci1hfSxaPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksUT1bMCwzMSw2MCw5MSwxMjEsMTUyLDE4MiwyMTMsMjQ0LDI3NCwzMDUsMzM1XSxlZT1bMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0XSx0ZT1lPT57dmFyIHQ9WChlKSsxLHI9bGUodCk7cmV0dXJuIHImJksoZSxFLHIsdCkscn0scmU9e30sbmU9KCk9PntpZighJCl7dmFyIGUsdD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86Y3x8Ii4vdGhpcy5wcm9ncmFtIn07Zm9yKGUgaW4gcmUpdm9pZCAwPT09cmVbZV0/ZGVsZXRlIHRbZV06dFtlXT1yZVtlXTt2YXIgcj1bXTtmb3IoZSBpbiB0KXIucHVzaChgJHtlfT0ke3RbZV19YCk7JD1yfXJldHVybiAkfSxhZT1bbnVsbCxbXSxbXV0sb2U9ZT0+KG9lPSgoKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gZT0+Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKTtpZihwKXRyeXt2YXIgZT1yKDc2MCk7aWYoZS5yYW5kb21GaWxsU3luYylyZXR1cm4gdD0+ZS5yYW5kb21GaWxsU3luYyh0KTt2YXIgdD1lLnJhbmRvbUJ5dGVzO3JldHVybiBlPT4oZS5zZXQodChlLmJ5dGVMZW5ndGgpKSxlKX1jYXRjaChlKXt9VygiaW5pdFJhbmRvbURldmljZSIpfSkoKSkoZSksaWU9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxzZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIHVlKGUsdCxyLG4pe2Z1bmN0aW9uIGEoZSx0LHIpe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1yWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBhKGUsdCwiMCIpfWZ1bmN0aW9uIGkoZSx0KXtmdW5jdGlvbiByKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgbjtyZXR1cm4gMD09PShuPXIoZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KG49cihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihuPXIoZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxufWZ1bmN0aW9uIHMoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLm1hO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUubmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIHI9ZS5nZXRNb250aCgpLG49KFooZS5nZXRGdWxsWWVhcigpKT9pZTpzZSlbcl07aWYoISh0Pm4tZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09bi1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5yP2Uuc2V0TW9udGgocisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSl9cmV0dXJuIHI9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpKzEsMCw0KSx0PXMobmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsNCkpLHI9cyhyKSwwPj1pKHQsZSk/MD49aShyLGUpP2UuZ2V0RnVsbFllYXIoKSsxOmUuZ2V0RnVsbFllYXIoKTplLmdldEZ1bGxZZWFyKCktMX1lPj4+PTAsdD4+Pj0wLHI+Pj49MDt2YXIgYz1BWzQwKyhuPj4+PTApPj4yPj4+MF07Zm9yKHZhciBsIGluIG49e3lhOkFbbj4+Mj4+PjBdLHhhOkFbbis0Pj4yPj4+MF0sb2E6QVtuKzg+PjI+Pj4wXSxyYTpBW24rMTI+PjI+Pj4wXSxwYTpBW24rMTY+PjI+Pj4wXSxuYTpBW24rMjA+PjI+Pj4wXSxoYTpBW24rMjQ+PjI+Pj4wXSxtYTpBW24rMjg+PjI+Pj4wXSxBYTpBW24rMzI+PjI+Pj4wXSx3YTpBW24rMzY+PjI+Pj4wXSx6YTpjP0ooYyk6IiJ9LHI9SihyKSxjPXsiJWMiOiIlYSAlYiAlZCAlSDolTTolUyAlWSIsIiVEIjoiJW0vJWQvJXkiLCIlRiI6IiVZLSVtLSVkIiwiJWgiOiIlYiIsIiVyIjoiJUk6JU06JVMgJXAiLCIlUiI6IiVIOiVNIiwiJVQiOiIlSDolTTolUyIsIiV4IjoiJW0vJWQvJXkiLCIlWCI6IiVIOiVNOiVTIiwiJUVjIjoiJWMiLCIlRUMiOiIlQyIsIiVFeCI6IiVtLyVkLyV5IiwiJUVYIjoiJUg6JU06JVMiLCIlRXkiOiIleSIsIiVFWSI6IiVZIiwiJU9kIjoiJWQiLCIlT2UiOiIlZSIsIiVPSCI6IiVIIiwiJU9JIjoiJUkiLCIlT20iOiIlbSIsIiVPTSI6IiVNIiwiJU9TIjoiJVMiLCIlT3UiOiIldSIsIiVPVSI6IiVVIiwiJU9WIjoiJVYiLCIlT3ciOiIldyIsIiVPVyI6IiVXIiwiJU95IjoiJXkifSlyPXIucmVwbGFjZShuZXcgUmVnRXhwKGwsImciKSxjW2xdKTt2YXIgZj0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIiksZD0iSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlciIuc3BsaXQoIiAiKTtmb3IobCBpbiBjPXsiJWEiOmU9PmZbZS5oYV0uc3Vic3RyaW5nKDAsMyksIiVBIjplPT5mW2UuaGFdLCIlYiI6ZT0+ZFtlLnBhXS5zdWJzdHJpbmcoMCwzKSwiJUIiOmU9PmRbZS5wYV0sIiVDIjplPT5vKChlLm5hKzE5MDApLzEwMHwwLDIpLCIlZCI6ZT0+byhlLnJhLDIpLCIlZSI6ZT0+YShlLnJhLDIsIiAiKSwiJWciOmU9PnUoZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjplPT51KGUpLCIlSCI6ZT0+byhlLm9hLDIpLCIlSSI6ZT0+KDA9PShlPWUub2EpP2U9MTI6MTI8ZSYmKGUtPTEyKSxvKGUsMikpLCIlaiI6ZT0+e2Zvcih2YXIgdD0wLHI9MDtyPD1lLnBhLTE7dCs9KFooZS5uYSsxOTAwKT9pZTpzZSlbcisrXSk7cmV0dXJuIG8oZS5yYSt0LDMpfSwiJW0iOmU9Pm8oZS5wYSsxLDIpLCIlTSI6ZT0+byhlLnhhLDIpLCIlbiI6KCk9PiJcXG4iLCIlcCI6ZT0+MDw9ZS5vYSYmMTI+ZS5vYT8iQU0iOiJQTSIsIiVTIjplPT5vKGUueWEsMiksIiV0IjooKT0+IlxcdCIsIiV1IjplPT5lLmhhfHw3LCIlVSI6ZT0+byhNYXRoLmZsb29yKChlLm1hKzctZS5oYSkvNyksMiksIiVWIjplPT57dmFyIHQ9TWF0aC5mbG9vcigoZS5tYSs3LShlLmhhKzYpJTcpLzcpO2lmKDI+PShlLmhhKzM3MS1lLm1hLTIpJTcmJnQrKyx0KTUzPT10JiYoND09KHI9KGUuaGErMzcxLWUubWEpJTcpfHwzPT1yJiZaKGUubmEpfHwodD0xKSk7ZWxzZXt0PTUyO3ZhciByPShlLmhhKzctZS5tYS0xKSU3Oyg0PT1yfHw1PT1yJiZaKGUubmElNDAwLTEpKSYmdCsrfXJldHVybiBvKHQsMil9LCIldyI6ZT0+ZS5oYSwiJVciOmU9Pm8oTWF0aC5mbG9vcigoZS5tYSs3LShlLmhhKzYpJTcpLzcpLDIpLCIleSI6ZT0+KGUubmErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjplPT5lLm5hKzE5MDAsIiV6IjplPT57dmFyIHQ9MDw9KGU9ZS53YSk7cmV0dXJuIGU9TWF0aC5hYnMoZSkvNjAsKHQ/IisiOiItIikrU3RyaW5nKCIwMDAwIisoZS82MCoxMDArZSU2MCkpLnNsaWNlKC00KX0sIiVaIjplPT5lLnphLCIlJSI6KCk9PiIlIn0scj1yLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpLGMpci5pbmNsdWRlcyhsKSYmKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAobCwiZyIpLGNbbF0obikpKTtyZXR1cm4gbD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShYKGUpKzEpO3JldHVybiBLKGUsdCwwLHQubGVuZ3RoKSx0fShyPXIucmVwbGFjZSgvXFwwXFwwL2csIiUiKSksbC5sZW5ndGg+dD8wOihTLnNldChsLGU+Pj4wKSxsLmxlbmd0aC0xKX12YXIgY2U9e2E6ZnVuY3Rpb24oZSx0LHIpe3Rocm93IG5ldyBCKGU+Pj49MCkuc2EodD4+PjAscj4+PjApLGV9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSTpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sSzpmdW5jdGlvbigpe3JldHVybiAwfSxHOmZ1bmN0aW9uKCl7fSxCOmZ1bmN0aW9uKCl7fSxGOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx6OmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7fSx4OmZ1bmN0aW9uKCl7fSxrOigpPT4hMCxuOmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW3I+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxBW3IrND4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLEFbcis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLEFbcisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLEFbcisxNj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxBW3IrMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxBW3IrMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLEFbcisyOD4+Mj4+PjBdPShlLmdldFRpbWUoKS1EYXRlLlVUQyhlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwfSxvOmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW3I+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxBW3IrND4+Mj4+PjBdPWUuZ2V0TWludXRlcygpLEFbcis4Pj4yPj4+MF09ZS5nZXRIb3VycygpLEFbcisxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLEFbcisxNj4+Mj4+PjBdPWUuZ2V0TW9udGgoKSxBW3IrMjA+PjI+Pj4wXT1lLmdldEZ1bGxZZWFyKCktMTkwMCxBW3IrMjQ+PjI+Pj4wXT1lLmdldERheSgpLEFbcisyOD4+Mj4+PjBdPShaKGUuZ2V0RnVsbFllYXIoKSk/UTplZSlbZS5nZXRNb250aCgpXStlLmdldERhdGUoKS0xfDAsQVtyKzM2Pj4yPj4+MF09LTYwKmUuZ2V0VGltZXpvbmVPZmZzZXQoKSx0PW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIG49bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtBW3IrMzI+PjI+Pj4wXT0wfCh0IT1uJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKG4sdCkpfSxwOmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShBW2UrMjA+PjI+Pj4wXSsxOTAwLEFbZSsxNj4+Mj4+PjBdLEFbZSsxMj4+Mj4+PjBdLEFbZSs4Pj4yPj4+MF0sQVtlKzQ+PjI+Pj4wXSxBW2U+PjI+Pj4wXSwwKSxyPUFbZSszMj4+Mj4+PjBdLG49dC5nZXRUaW1lem9uZU9mZnNldCgpLGE9bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCksaT1NYXRoLm1pbihvLGEpO3JldHVybiAwPnI/QVtlKzMyPj4yPj4+MF09TnVtYmVyKGEhPW8mJmk9PW4pOjA8ciE9KGk9PW4pJiYoYT1NYXRoLm1heChvLGEpLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPHI/aTphKS1uKSkpLEFbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCksQVtlKzI4Pj4yPj4+MF09KFoodC5nZXRGdWxsWWVhcigpKT9ROmVlKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxBW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxBW2UrND4+Mj4+PjBdPXQuZ2V0TWludXRlcygpLEFbZSs4Pj4yPj4+MF09dC5nZXRIb3VycygpLEFbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLEFbZSsxNj4+Mj4+PjBdPXQuZ2V0TW9udGgoKSxBW2UrMjA+PjI+Pj4wXT10LmdldFllYXIoKSxlPXQuZ2V0VGltZSgpLzFlMyxkZSgoeD1lLDE8PStNYXRoLmFicyh4KT8wPHg/K01hdGguZmxvb3IoeC80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh4LSsofn54Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKSksZT4+PjB9LGw6ZnVuY3Rpb24oKXtyZXR1cm4tNTJ9LG06ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKT9lWzFdOiJHTVQifXI+Pj49MDt2YXIgYT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksbz1uZXcgRGF0ZShhLDAsMSksaT1uZXcgRGF0ZShhLDYsMSk7YT1vLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIHM9aS5nZXRUaW1lem9uZU9mZnNldCgpO1RbZT4+PjA+PjI+Pj4wXT02MCpNYXRoLm1heChhLHMpLEFbdD4+PjA+PjI+Pj4wXT1OdW1iZXIoYSE9cyksZT1uKG8pLHQ9bihpKSxlPXRlKGUpLHQ9dGUodCksczxhPyhUW3I+PjI+Pj4wXT1lLFRbcis0Pj4yPj4+MF09dCk6KFRbcj4+Mj4+PjBdPXQsVFtyKzQ+PjI+Pj4wXT1lKX0sZDooKT0+e1coIiIpfSxoOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHY6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sYjooKT0+cGVyZm9ybWFuY2Uubm93KCksSjpmdW5jdGlvbihlLHQscil7cmV0dXJuIHQ+Pj49MCxFLmNvcHlXaXRoaW4oZT4+PjA+Pj4wLHQ+Pj4wLHQrKHI+Pj4wKT4+PjApfSx0OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1FLmxlbmd0aDtpZig0Mjk0OTAxNzYwPGUpcmV0dXJuITE7Zm9yKHZhciByPTE7ND49cjtyKj0yKXt2YXIgbj10KigxKy4yL3IpO249TWF0aC5taW4obixlKzEwMDY2MzI5Nik7dmFyIGE9TWF0aDtuPU1hdGgubWF4KGUsbik7ZTp7YT1hLm1pbi5jYWxsKGEsNDI5NDkwMTc2MCxuKyg2NTUzNi1uJTY1NTM2KSU2NTUzNiktXy5idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2O3RyeXtfLmdyb3coYSksUigpO3ZhciBvPTE7YnJlYWsgZX1jYXRjaChlKXt9bz12b2lkIDB9aWYobylyZXR1cm4hMH1yZXR1cm4hMX0sRDpmdW5jdGlvbihlLHQpe2U+Pj49MCx0Pj4+PTA7dmFyIHI9MDtyZXR1cm4gbmUoKS5mb3JFYWNoKChmdW5jdGlvbihuLGEpe3ZhciBvPXQrcjtmb3IoYT1UW2UrNCphPj4yPj4+MF09byxvPTA7bzxuLmxlbmd0aDsrK28pU1thKys+PjA+Pj4wXT1uLmNoYXJDb2RlQXQobyk7U1thPj4wPj4+MF09MCxyKz1uLmxlbmd0aCsxfSkpLDB9LEU6ZnVuY3Rpb24oZSx0KXtlPj4+PTAsdD4+Pj0wO3ZhciByPW5lKCk7VFtlPj4yPj4+MF09ci5sZW5ndGg7dmFyIG49MDtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihlKXtuKz1lLmxlbmd0aCsxfSkpLFRbdD4+Mj4+PjBdPW4sMH0sczplPT57d3x8KGEub25FeGl0JiZhLm9uRXhpdChlKSxNPSEwKSxsKGUsbmV3IEcoZSkpfSxmOigpPT41MixqOmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxxOmZ1bmN0aW9uKCl7cmV0dXJuIDcwfSxpOmZ1bmN0aW9uKGUsdCxyLG4pe3Q+Pj49MCxyPj4+PTAsbj4+Pj0wO2Zvcih2YXIgYT0wLG89MDtvPHI7bysrKXt2YXIgaT1UW3Q+PjI+Pj4wXSxzPVRbdCs0Pj4yPj4+MF07dCs9ODtmb3IodmFyIHU9MDt1PHM7dSsrKXt2YXIgYz1FW2krdT4+PjBdLGw9YWVbZV07MD09PWN8fDEwPT09Yz8oKDE9PT1lP3Y6YikoVihsLDApKSxsLmxlbmd0aD0wKTpsLnB1c2goYyl9YSs9c31yZXR1cm4gVFtuPj4yPj4+MF09YSwwfSxyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+Pj49MCxvZShFLnN1YmFycmF5KGU+Pj4wLGUrKHQ+Pj4wKT4+PjApKSwwfSxDOnVlLGM6ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHVlKGU+Pj4wLHQ+Pj4wLHI+Pj4wLG4+Pj4wKX19OyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZT1lLmV4cG9ydHMsTz1lPWZ1bmN0aW9uKGUpe3ZhciB0PWU9PigpPT5lKCk+Pj4wLHI9ZT0+dD0+ZSh0KT4+PjA7cmV0dXJuKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5tYWxsb2M9cihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPXIoZS5zdGFja0FsbG9jKSxlfShlKSxfPU8uTCxSKCksay51bnNoaWZ0KE8uTSksSS0tLGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKEkpLDA9PUkmJihudWxsIT09VSYmKGNsZWFySW50ZXJ2YWwoVSksVT1udWxsKSxMKSl7dmFyIHQ9TDtMPW51bGwsdCgpfXJldHVybiBlfXZhciB0PXthOmNlfTtpZihJKyssYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoSSksYS5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBhLmluc3RhbnRpYXRlV2FzbSh0LGUpfWNhdGNoKGUpe2IoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrZSksbihlKX0oZnVuY3Rpb24oZSx0KXt2YXIgcj1EO3JldHVybiB5fHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fEgocil8fHIuc3RhcnRzV2l0aCgiZmlsZTovLyIpfHxwfHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/eihyLGUsdCk6ZmV0Y2gocix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKG4sZSkudGhlbih0LChmdW5jdGlvbihuKXtyZXR1cm4gYigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrbiksYigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSx6KHIsZSx0KX0pKSkpfSkodCwoZnVuY3Rpb24odCl7ZSh0Lmluc3RhbmNlKX0pKS5jYXRjaChuKX0oKSxhLl9PcnRJbml0PShlLHQpPT4oYS5fT3J0SW5pdD1PLk4pKGUsdCksYS5fT3J0R2V0TGFzdEVycm9yPShlLHQpPT4oYS5fT3J0R2V0TGFzdEVycm9yPU8uTykoZSx0KSxhLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0oZSx0LHIsbixvLGkscyx1LGMsbCk9PihhLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1PLlApKGUsdCxyLG4sbyxpLHMsdSxjLGwpLGEuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShlLHQpPT4oYS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9Ty5RKShlLHQpLGEuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0oZSx0LHIpPT4oYS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PU8uUikoZSx0LHIpLGEuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1lPT4oYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPU8uUykoZSksYS5fT3J0Q3JlYXRlU2Vzc2lvbj0oZSx0LHIpPT4oYS5fT3J0Q3JlYXRlU2Vzc2lvbj1PLlQpKGUsdCxyKSxhLl9PcnRSZWxlYXNlU2Vzc2lvbj1lPT4oYS5fT3J0UmVsZWFzZVNlc3Npb249Ty5VKShlKSxhLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShlLHQscik9PihhLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PU8uVikoZSx0LHIpLGEuX09ydEdldElucHV0TmFtZT0oZSx0KT0+KGEuX09ydEdldElucHV0TmFtZT1PLlcpKGUsdCksYS5fT3J0R2V0T3V0cHV0TmFtZT0oZSx0KT0+KGEuX09ydEdldE91dHB1dE5hbWU9Ty5YKShlLHQpLGEuX09ydEZyZWU9ZT0+KGEuX09ydEZyZWU9Ty5ZKShlKSxhLl9PcnRDcmVhdGVUZW5zb3I9KGUsdCxyLG4sbyk9PihhLl9PcnRDcmVhdGVUZW5zb3I9Ty5aKShlLHQscixuLG8pLGEuX09ydEdldFRlbnNvckRhdGE9KGUsdCxyLG4sbyk9PihhLl9PcnRHZXRUZW5zb3JEYXRhPU8uXykoZSx0LHIsbixvKSxhLl9PcnRSZWxlYXNlVGVuc29yPWU9PihhLl9PcnRSZWxlYXNlVGVuc29yPU8uJCkoZSksYS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz0oZSx0LHIsbik9PihhLl9PcnRDcmVhdGVSdW5PcHRpb25zPU8uYWEpKGUsdCxyLG4pLGEuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PShlLHQscik9PihhLl9PcnRBZGRSdW5Db25maWdFbnRyeT1PLmJhKShlLHQsciksYS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ZT0+KGEuX09ydFJlbGVhc2VSdW5PcHRpb25zPU8uY2EpKGUpLGEuX09ydFJ1bj0oZSx0LHIsbixvLGkscyx1KT0+KGEuX09ydFJ1bj1PLmRhKShlLHQscixuLG8saSxzLHUpLGEuX09ydEVuZFByb2ZpbGluZz1lPT4oYS5fT3J0RW5kUHJvZmlsaW5nPU8uZWEpKGUpO3ZhciBsZT1hLl9tYWxsb2M9ZT0+KGxlPWEuX21hbGxvYz1PLmZhKShlKTthLl9mcmVlPWU9PihhLl9mcmVlPU8uZ2EpKGUpO3ZhciBmZSxkZT1lPT4oZGU9Ty5pYSkoZSkscGU9KCk9PihwZT1PLmphKSgpLGdlPWU9PihnZT1PLmthKShlKSxoZT1lPT4oaGU9Ty5sYSkoZSk7ZnVuY3Rpb24gbWUoKXtmdW5jdGlvbiBlKCl7aWYoIWZlJiYoZmU9ITAsYS5jYWxsZWRSdW49ITAsIU0pKXtpZihOKGspLHQoYSksYS5vblJ1bnRpbWVJbml0aWFsaXplZCYmYS5vblJ1bnRpbWVJbml0aWFsaXplZCgpLGEucG9zdFJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGEucG9zdFJ1biYmKGEucG9zdFJ1bj1bYS5wb3N0UnVuXSk7YS5wb3N0UnVuLmxlbmd0aDspe3ZhciBlPWEucG9zdFJ1bi5zaGlmdCgpO0MudW5zaGlmdChlKX1OKEMpfX1pZighKDA8SSkpe2lmKGEucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYS5wcmVSdW4mJihhLnByZVJ1bj1bYS5wcmVSdW5dKTthLnByZVJ1bi5sZW5ndGg7KVAoKTtOKEYpLDA8SXx8KGEuc2V0U3RhdHVzPyhhLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnNldFN0YXR1cygiIil9KSwxKSxlKCl9KSwxKSk6ZSgpKX19aWYoYS5zdGFja0FsbG9jPWhlLGEuc3RhY2tTYXZlPXBlLGEuc3RhY2tSZXN0b3JlPWdlLGEuVVRGOFRvU3RyaW5nPUosYS5zdHJpbmdUb1VURjg9KGUsdCxyKT0+SyhlLEUsdCxyKSxhLmxlbmd0aEJ5dGVzVVRGOD1YLEw9ZnVuY3Rpb24gZSgpe2ZlfHxtZSgpLGZlfHwoTD1lKX0sYS5wcmVJbml0KWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYS5wcmVJbml0JiYoYS5wcmVJbml0PVthLnByZUluaXRdKTswPGEucHJlSW5pdC5sZW5ndGg7KWEucHJlSW5pdC5wb3AoKSgpO3JldHVybiBtZSgpLGUucmVhZHl9KTtlLmV4cG9ydHM9bn0sMTU0OmU9PnsidXNlIHN0cmljdCI7ZS5leHBvcnRzPVwnInVzZSBzdHJpY3QiO3ZhciBlPXt9LGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKGEpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksdD1yLnBhcmVudFBvcnQ7dC5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgcz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+KDAsZXZhbCkocy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKyIvLyMgc291cmNlVVJMPSIrZSkscG9zdE1lc3NhZ2U6ZT0+dC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIG89ITEsZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO2E/cy53cml0ZVN5bmMoMixlKyJcXFxcbiIpOmNvbnNvbGUuZXJyb3IoZSl9O3NlbGYuYWxlcnQ9ZnVuY3Rpb24oKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiAiKTtwb3N0TWVzc2FnZSh7Y21kOiJhbGVydCIsdGV4dDphLHRocmVhZElkOmUuX3B0aHJlYWRfc2VsZigpfSl9LGUuaW5zdGFudGlhdGVXYXNtPShhLHIpPT57dmFyIHQ9ZS53YXNtTW9kdWxlO3JldHVybiBlLndhc21Nb2R1bGU9bnVsbCxyKG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZSh0LGEpKX0sc2VsZi5vbnVuaGFuZGxlZHJlamVjdGlvbj1lPT57dGhyb3cgZS5yZWFzb24/P2V9LHNlbGYub25tZXNzYWdlPWZ1bmN0aW9uIGEocil7dHJ5e2lmKCJsb2FkIj09PXIuZGF0YS5jbWQpe2xldCBzPVtdO3NlbGYub25tZXNzYWdlPWU9PnMucHVzaChlKSxzZWxmLnN0YXJ0V29ya2VyPXI9PntlPXIscG9zdE1lc3NhZ2Uoe2NtZDoibG9hZGVkIn0pO2ZvcihsZXQgZSBvZiBzKWEoZSk7c2VsZi5vbm1lc3NhZ2U9YX0sZS53YXNtTW9kdWxlPXIuZGF0YS53YXNtTW9kdWxlO2Zvcihjb25zdCBhIG9mIHIuZGF0YS5oYW5kbGVycyllW2FdPSguLi5lKT0+e3Bvc3RNZXNzYWdlKHtjbWQ6ImNhbGxIYW5kbGVyIixoYW5kbGVyOmEsYXJnczplfSl9O2lmKGUud2FzbU1lbW9yeT1yLmRhdGEud2FzbU1lbW9yeSxlLmJ1ZmZlcj1lLndhc21NZW1vcnkuYnVmZmVyLGUuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRD0hMCwic3RyaW5nIj09dHlwZW9mIHIuZGF0YS51cmxPckJsb2IpaW1wb3J0U2NyaXB0cyhyLmRhdGEudXJsT3JCbG9iKTtlbHNle3ZhciB0PVVSTC5jcmVhdGVPYmplY3RVUkwoci5kYXRhLnVybE9yQmxvYik7aW1wb3J0U2NyaXB0cyh0KSxVUkwucmV2b2tlT2JqZWN0VVJMKHQpfW9ydFdhc21UaHJlYWRlZChlKX1lbHNlIGlmKCJydW4iPT09ci5kYXRhLmNtZCl7ZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQoci5kYXRhLnB0aHJlYWRfcHRyLDAsMCwxKSxlLl9fZW1zY3JpcHRlbl90aHJlYWRfbWFpbGJveF9hd2FpdChyLmRhdGEucHRocmVhZF9wdHIpLGUuZXN0YWJsaXNoU3RhY2tTcGFjZSgpLGUuUFRocmVhZC5yZWNlaXZlT2JqZWN0VHJhbnNmZXIoci5kYXRhKSxlLlBUaHJlYWQudGhyZWFkSW5pdFRMUygpLG98fChvPSEwKTt0cnl7ZS5pbnZva2VFbnRyeVBvaW50KHIuZGF0YS5zdGFydF9yb3V0aW5lLHIuZGF0YS5hcmcpfWNhdGNoKGUpe2lmKCJ1bndpbmQiIT1lKXRocm93IGV9fWVsc2UiY2FuY2VsIj09PXIuZGF0YS5jbWQ/ZS5fcHRocmVhZF9zZWxmKCkmJmUuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0KC0xKToic2V0aW1tZWRpYXRlIj09PXIuZGF0YS50YXJnZXR8fCgiY2hlY2tNYWlsYm94Ij09PXIuZGF0YS5jbWQ/byYmZS5jaGVja01haWxib3goKTpyLmRhdGEuY21kJiYoZCgid29ya2VyLmpzIHJlY2VpdmVkIHVua25vd24gY29tbWFuZCAiK3IuZGF0YS5jbWQpLGQoci5kYXRhKSkpfWNhdGNoKGEpe3Rocm93IGUuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCgpLGF9fTtcXG5cJ30sNzYwOigpPT57fSwzODQ6KCk9Pnt9LDk5MzooKT0+e30sOTA4OigpPT57fSw5NTM6KCk9Pnt9LDkyNTooKT0+e30sNDQ5OigpPT57fX0sdD17fTtmdW5jdGlvbiByKG4pe3ZhciBhPXRbbl07aWYodm9pZCAwIT09YSlyZXR1cm4gYS5leHBvcnRzO3ZhciBvPXRbbl09e2V4cG9ydHM6e319O3JldHVybiBlW25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHIpLG8uZXhwb3J0c30oKCk9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1yKDI1OSksdD1yKDI2Myk7c2VsZi5vbm1lc3NhZ2U9cj0+e3N3aXRjaChyLmRhdGEudHlwZSl7Y2FzZSJpbml0LXdhc20iOnRyeXsoMCx0LmluaXRpYWxpemVXZWJBc3NlbWJseSkoci5kYXRhLmluKS50aGVuKCgoKT0+cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtd2FzbSJ9KSksKGU9PnBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LXdhc20iLGVycjplfSkpKX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiaW5pdC13YXNtIixlcnI6ZX0pfWJyZWFrO2Nhc2UiaW5pdC1vcnQiOnRyeXsoMCxlLmluaXRSdW50aW1lKShyLmRhdGEuaW4pLnRoZW4oKCgpPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQifSkpLChlPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQiLGVycjplfSkpKSxwb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQifSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtb3J0IixlcnI6ZX0pfWJyZWFrO2Nhc2UiY3JlYXRlX2FsbG9jYXRlIjp0cnl7Y29uc3R7bW9kZWw6dH09ci5kYXRhLmluLG49KDAsZS5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKHQpO3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGVfYWxsb2NhdGUiLG91dDpufSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9hbGxvY2F0ZSIsZXJyOmV9KX1icmVhaztjYXNlImNyZWF0ZV9maW5hbGl6ZSI6dHJ5e2NvbnN0e21vZGVsZGF0YTp0LG9wdGlvbnM6bn09ci5kYXRhLmluLGE9KDAsZS5jcmVhdGVTZXNzaW9uRmluYWxpemUpKHQsbik7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9maW5hbGl6ZSIsb3V0OmF9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2ZpbmFsaXplIixlcnI6ZX0pfWJyZWFrO2Nhc2UiY3JlYXRlIjp0cnl7Y29uc3R7bW9kZWw6dCxvcHRpb25zOm59PXIuZGF0YS5pbixhPSgwLGUuY3JlYXRlU2Vzc2lvbikodCxuKTtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlIixvdXQ6YX0pfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGUiLGVycjplfSl9YnJlYWs7Y2FzZSJyZWxlYXNlIjp0cnl7Y29uc3QgdD1yLmRhdGEuaW47KDAsZS5yZWxlYXNlU2Vzc2lvbikodCkscG9zdE1lc3NhZ2Uoe3R5cGU6InJlbGVhc2UifSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6InJlbGVhc2UiLGVycjplfSl9YnJlYWs7Y2FzZSJydW4iOnRyeXtjb25zdHtzZXNzaW9uSWQ6dCxpbnB1dEluZGljZXM6bixpbnB1dHM6YSxvdXRwdXRJbmRpY2VzOm8sb3B0aW9uczppfT1yLmRhdGEuaW47KDAsZS5ydW4pKHQsbixhLG8saSkudGhlbigodD0+e3Bvc3RNZXNzYWdlKHt0eXBlOiJydW4iLG91dDp0fSwoMCxlLmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzKSh0KSl9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOiJydW4iLGVycjplfSl9KSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsZXJyOmV9KX1icmVhaztjYXNlImVuZC1wcm9maWxpbmciOnRyeXtjb25zdCB0PXIuZGF0YS5pbjsoMCxlLmVuZFByb2ZpbGluZykodCkscG9zdE1lc3NhZ2Uoe3R5cGU6ImVuZC1wcm9maWxpbmcifSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImVuZC1wcm9maWxpbmciLGVycjplfSl9fX19KSgpfSkoKTtcbicsIldvcmtlciIsdm9pZCAwLHZvaWQgMCl9fSw2NjE0OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89c2VsZnx8d2luZG93O3RyeXt0cnl7dmFyIGk7dHJ5e2k9bmV3IG8uQmxvYihbZV0pO31jYXRjaCh0KXsoaT1uZXcoby5CbG9iQnVpbGRlcnx8by5XZWJLaXRCbG9iQnVpbGRlcnx8by5Nb3pCbG9iQnVpbGRlcnx8by5NU0Jsb2JCdWlsZGVyKSkuYXBwZW5kKGUpLGk9aS5nZXRCbG9iKCk7fXZhciBzPW8uVVJMfHxvLndlYmtpdFVSTCxhPXMuY3JlYXRlT2JqZWN0VVJMKGkpLHU9bmV3IG9bdF0oYSxuKTtyZXR1cm4gcy5yZXZva2VPYmplY3RVUkwoYSksdX1jYXRjaChyKXtyZXR1cm4gbmV3IG9bdF0oImRhdGE6YXBwbGljYXRpb24vamF2YXNjcmlwdCwiLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZSkpLG4pfX1jYXRjaChlKXtpZighcil0aHJvdyBFcnJvcigiSW5saW5lIHdvcmtlciBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIG5ldyBvW3RdKHIsbil9fTt9LDI0NDY6KGUsdCxuKT0+e3ZhciByLG8saSxzPW4oMjEwMCksYT1zLlJlYWRlcix1PXMuV3JpdGVyLGw9cy51dGlsLGM9cy5yb290cy5kZWZhdWx0fHwocy5yb290cy5kZWZhdWx0PXt9KTtjLm9ubng9KChpPXt9KS5WZXJzaW9uPShyPXt9LChvPU9iamVjdC5jcmVhdGUocikpW3JbMF09Il9TVEFSVF9WRVJTSU9OIl09MCxvW3JbMV09IklSX1ZFUlNJT05fMjAxN18xMF8xMCJdPTEsb1tyWzJdPSJJUl9WRVJTSU9OXzIwMTdfMTBfMzAiXT0yLG9bclszXT0iSVJfVkVSU0lPTl8yMDE3XzExXzMiXT0zLG9bcls0XT0iSVJfVkVSU0lPTl8yMDE5XzFfMjIiXT00LG9bcls1XT0iSVJfVkVSU0lPTl8yMDE5XzNfMTgiXT01LG9bcls2XT0iSVJfVkVSU0lPTl8yMDE5XzlfMTkiXT02LG9bcls3XT0iSVJfVkVSU0lPTl8yMDIwXzVfOCJdPTcsb1tyWzhdPSJJUl9WRVJTSU9OXzIwMjFfN18zMCJdPTgsb1tyWzldPSJJUl9WRVJTSU9OIl09OSxvKSxpLkF0dHJpYnV0ZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmZsb2F0cz1bXSx0aGlzLmludHM9W10sdGhpcy5zdHJpbmdzPVtdLHRoaXMudGVuc29ycz1bXSx0aGlzLmdyYXBocz1bXSx0aGlzLnNwYXJzZVRlbnNvcnM9W10sdGhpcy50eXBlUHJvdG9zPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUucmVmQXR0ck5hbWU9IiIsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLnR5cGU9MCxlLnByb3RvdHlwZS5mPTAsZS5wcm90b3R5cGUuaT1sLkxvbmc/bC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5zPWwubmV3QnVmZmVyKFtdKSxlLnByb3RvdHlwZS50PW51bGwsZS5wcm90b3R5cGUuZz1udWxsLGUucHJvdG90eXBlLnNwYXJzZVRlbnNvcj1udWxsLGUucHJvdG90eXBlLnRwPW51bGwsZS5wcm90b3R5cGUuZmxvYXRzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5pbnRzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5zdHJpbmdzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS50ZW5zb3JzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5ncmFwaHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnNwYXJzZVRlbnNvcnM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnR5cGVQcm90b3M9bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLm5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmdC51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLG51bGwhPWUuZiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZiIpJiZ0LnVpbnQzMigyMSkuZmxvYXQoZS5mKSxudWxsIT1lLmkmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImkiKSYmdC51aW50MzIoMjQpLmludDY0KGUuaSksbnVsbCE9ZS5zJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzIikmJnQudWludDMyKDM0KS5ieXRlcyhlLnMpLG51bGwhPWUudCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidCIpJiZjLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudCx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImciKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZyx0LnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmZsb2F0cyYmZS5mbG9hdHMubGVuZ3RoKXt0LnVpbnQzMig1OCkuZm9yaygpO2Zvcih2YXIgbj0wO248ZS5mbG9hdHMubGVuZ3RoOysrbil0LmZsb2F0KGUuZmxvYXRzW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmludHMmJmUuaW50cy5sZW5ndGgpe2Zvcih0LnVpbnQzMig2NikuZm9yaygpLG49MDtuPGUuaW50cy5sZW5ndGg7KytuKXQuaW50NjQoZS5pbnRzW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLnN0cmluZ3MmJmUuc3RyaW5ncy5sZW5ndGgpZm9yKG49MDtuPGUuc3RyaW5ncy5sZW5ndGg7KytuKXQudWludDMyKDc0KS5ieXRlcyhlLnN0cmluZ3Nbbl0pO2lmKG51bGwhPWUudGVuc29ycyYmZS50ZW5zb3JzLmxlbmd0aClmb3Iobj0wO248ZS50ZW5zb3JzLmxlbmd0aDsrK24pYy5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLnRlbnNvcnNbbl0sdC51aW50MzIoODIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5ncmFwaHMmJmUuZ3JhcGhzLmxlbmd0aClmb3Iobj0wO248ZS5ncmFwaHMubGVuZ3RoOysrbiljLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5ncmFwaHNbbl0sdC51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMigxMDYpLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS50cCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidHAiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS50cCx0LnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS50eXBlUHJvdG9zJiZlLnR5cGVQcm90b3MubGVuZ3RoKWZvcihuPTA7bjxlLnR5cGVQcm90b3MubGVuZ3RoOysrbiljLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnR5cGVQcm90b3Nbbl0sdC51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUudHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidHlwZSIpJiZ0LnVpbnQzMigxNjApLmludDMyKGUudHlwZSksbnVsbCE9ZS5yZWZBdHRyTmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicmVmQXR0ck5hbWUiKSYmdC51aW50MzIoMTcwKS5zdHJpbmcoZS5yZWZBdHRyTmFtZSksbnVsbCE9ZS5zcGFyc2VUZW5zb3ImJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNwYXJzZVRlbnNvciIpJiZjLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZW5jb2RlKGUuc3BhcnNlVGVuc29yLHQudWludDMyKDE3OCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLnNwYXJzZVRlbnNvcnMmJmUuc3BhcnNlVGVuc29ycy5sZW5ndGgpZm9yKG49MDtuPGUuc3BhcnNlVGVuc29ycy5sZW5ndGg7KytuKWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5lbmNvZGUoZS5zcGFyc2VUZW5zb3JzW25dLHQudWludDMyKDE4NikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LkF0dHJpYnV0ZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjE6ci5yZWZBdHRyTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTM6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDIwOnIudHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIuZj1lLmZsb2F0KCk7YnJlYWs7Y2FzZSAzOnIuaT1lLmludDY0KCk7YnJlYWs7Y2FzZSA0OnIucz1lLmJ5dGVzKCk7YnJlYWs7Y2FzZSA1OnIudD1jLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA2OnIuZz1jLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDIyOnIuc3BhcnNlVGVuc29yPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDE0OnIudHA9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDc6aWYoci5mbG9hdHMmJnIuZmxvYXRzLmxlbmd0aHx8KHIuZmxvYXRzPVtdKSwyPT0oNyZvKSlmb3IodmFyIGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmZsb2F0cy5wdXNoKGUuZmxvYXQoKSk7ZWxzZSByLmZsb2F0cy5wdXNoKGUuZmxvYXQoKSk7YnJlYWs7Y2FzZSA4OmlmKHIuaW50cyYmci5pbnRzLmxlbmd0aHx8KHIuaW50cz1bXSksMj09KDcmbykpZm9yKGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmludHMucHVzaChlLmludDY0KCkpO2Vsc2Ugci5pbnRzLnB1c2goZS5pbnQ2NCgpKTticmVhaztjYXNlIDk6ci5zdHJpbmdzJiZyLnN0cmluZ3MubGVuZ3RofHwoci5zdHJpbmdzPVtdKSxyLnN0cmluZ3MucHVzaChlLmJ5dGVzKCkpO2JyZWFrO2Nhc2UgMTA6ci50ZW5zb3JzJiZyLnRlbnNvcnMubGVuZ3RofHwoci50ZW5zb3JzPVtdKSxyLnRlbnNvcnMucHVzaChjLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTE6ci5ncmFwaHMmJnIuZ3JhcGhzLmxlbmd0aHx8KHIuZ3JhcGhzPVtdKSxyLmdyYXBocy5wdXNoKGMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDIzOnIuc3BhcnNlVGVuc29ycyYmci5zcGFyc2VUZW5zb3JzLmxlbmd0aHx8KHIuc3BhcnNlVGVuc29ycz1bXSksci5zcGFyc2VUZW5zb3JzLnB1c2goYy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDE1OnIudHlwZVByb3RvcyYmci50eXBlUHJvdG9zLmxlbmd0aHx8KHIudHlwZVByb3Rvcz1bXSksci50eXBlUHJvdG9zLnB1c2goYy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucmVmQXR0ck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInJlZkF0dHJOYW1lIikmJiFsLmlzU3RyaW5nKGUucmVmQXR0ck5hbWUpKXJldHVybiAicmVmQXR0ck5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS50eXBlJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikpc3dpdGNoKGUudHlwZSl7ZGVmYXVsdDpyZXR1cm4gInR5cGU6IGVudW0gdmFsdWUgZXhwZWN0ZWQiO2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmNhc2UgMTE6Y2FzZSAxMzpjYXNlIDY6Y2FzZSA3OmNhc2UgODpjYXNlIDk6Y2FzZSAxMDpjYXNlIDEyOmNhc2UgMTQ6fWlmKG51bGwhPWUuZiYmZS5oYXNPd25Qcm9wZXJ0eSgiZiIpJiYibnVtYmVyIiE9dHlwZW9mIGUuZilyZXR1cm4gImY6IG51bWJlciBleHBlY3RlZCI7aWYobnVsbCE9ZS5pJiZlLmhhc093blByb3BlcnR5KCJpIikmJiEobC5pc0ludGVnZXIoZS5pKXx8ZS5pJiZsLmlzSW50ZWdlcihlLmkubG93KSYmbC5pc0ludGVnZXIoZS5pLmhpZ2gpKSlyZXR1cm4gImk6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5zJiZlLmhhc093blByb3BlcnR5KCJzIikmJiEoZS5zJiYibnVtYmVyIj09dHlwZW9mIGUucy5sZW5ndGh8fGwuaXNTdHJpbmcoZS5zKSkpcmV0dXJuICJzOiBidWZmZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUudCYmZS5oYXNPd25Qcm9wZXJ0eSgidCIpJiYobj1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudCkpKXJldHVybiAidC4iK247aWYobnVsbCE9ZS5nJiZlLmhhc093blByb3BlcnR5KCJnIikmJihuPWMub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmcpKSlyZXR1cm4gImcuIituO2lmKG51bGwhPWUuc3BhcnNlVGVuc29yJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3IiKSYmKG49Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZVRlbnNvcikpKXJldHVybiAic3BhcnNlVGVuc29yLiIrbjtpZihudWxsIT1lLnRwJiZlLmhhc093blByb3BlcnR5KCJ0cCIpJiYobj1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnRwKSkpcmV0dXJuICJ0cC4iK247aWYobnVsbCE9ZS5mbG9hdHMmJmUuaGFzT3duUHJvcGVydHkoImZsb2F0cyIpKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0cykpcmV0dXJuICJmbG9hdHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuZmxvYXRzLmxlbmd0aDsrK3QpaWYoIm51bWJlciIhPXR5cGVvZiBlLmZsb2F0c1t0XSlyZXR1cm4gImZsb2F0czogbnVtYmVyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuaW50cyYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50cyIpKXtpZighQXJyYXkuaXNBcnJheShlLmludHMpKXJldHVybiAiaW50czogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmludHMubGVuZ3RoOysrdClpZighKGwuaXNJbnRlZ2VyKGUuaW50c1t0XSl8fGUuaW50c1t0XSYmbC5pc0ludGVnZXIoZS5pbnRzW3RdLmxvdykmJmwuaXNJbnRlZ2VyKGUuaW50c1t0XS5oaWdoKSkpcmV0dXJuICJpbnRzOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5zdHJpbmdzJiZlLmhhc093blByb3BlcnR5KCJzdHJpbmdzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3RyaW5ncykpcmV0dXJuICJzdHJpbmdzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuc3RyaW5ncy5sZW5ndGg7Kyt0KWlmKCEoZS5zdHJpbmdzW3RdJiYibnVtYmVyIj09dHlwZW9mIGUuc3RyaW5nc1t0XS5sZW5ndGh8fGwuaXNTdHJpbmcoZS5zdHJpbmdzW3RdKSkpcmV0dXJuICJzdHJpbmdzOiBidWZmZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS50ZW5zb3JzJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JzIikpe2lmKCFBcnJheS5pc0FycmF5KGUudGVuc29ycykpcmV0dXJuICJ0ZW5zb3JzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudGVuc29ycy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnRlbnNvcnNbdF0pKXJldHVybiAidGVuc29ycy4iK259aWYobnVsbCE9ZS5ncmFwaHMmJmUuaGFzT3duUHJvcGVydHkoImdyYXBocyIpKXtpZighQXJyYXkuaXNBcnJheShlLmdyYXBocykpcmV0dXJuICJncmFwaHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5ncmFwaHMubGVuZ3RoOysrdClpZihuPWMub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmdyYXBoc1t0XSkpcmV0dXJuICJncmFwaHMuIitufWlmKG51bGwhPWUuc3BhcnNlVGVuc29ycyYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29ycyIpKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZVRlbnNvcnMpKXJldHVybiAic3BhcnNlVGVuc29yczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrdClpZihuPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by52ZXJpZnkoZS5zcGFyc2VUZW5zb3JzW3RdKSlyZXR1cm4gInNwYXJzZVRlbnNvcnMuIitufWlmKG51bGwhPWUudHlwZVByb3RvcyYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZVByb3RvcyIpKXtpZighQXJyYXkuaXNBcnJheShlLnR5cGVQcm90b3MpKXJldHVybiAidHlwZVByb3RvczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnR5cGVQcm90b3MubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnR5cGVQcm90b3NbdF0pKXJldHVybiAidHlwZVByb3Rvcy4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LkF0dHJpYnV0ZVByb3RvO3N3aXRjaChudWxsIT1lLm5hbWUmJih0Lm5hbWU9U3RyaW5nKGUubmFtZSkpLG51bGwhPWUucmVmQXR0ck5hbWUmJih0LnJlZkF0dHJOYW1lPVN0cmluZyhlLnJlZkF0dHJOYW1lKSksbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLnR5cGUpe2RlZmF1bHQ6aWYoIm51bWJlciI9PXR5cGVvZiBlLnR5cGUpe3QudHlwZT1lLnR5cGU7YnJlYWt9YnJlYWs7Y2FzZSJVTkRFRklORUQiOmNhc2UgMDp0LnR5cGU9MDticmVhaztjYXNlIkZMT0FUIjpjYXNlIDE6dC50eXBlPTE7YnJlYWs7Y2FzZSJJTlQiOmNhc2UgMjp0LnR5cGU9MjticmVhaztjYXNlIlNUUklORyI6Y2FzZSAzOnQudHlwZT0zO2JyZWFrO2Nhc2UiVEVOU09SIjpjYXNlIDQ6dC50eXBlPTQ7YnJlYWs7Y2FzZSJHUkFQSCI6Y2FzZSA1OnQudHlwZT01O2JyZWFrO2Nhc2UiU1BBUlNFX1RFTlNPUiI6Y2FzZSAxMTp0LnR5cGU9MTE7YnJlYWs7Y2FzZSJUWVBFX1BST1RPIjpjYXNlIDEzOnQudHlwZT0xMzticmVhaztjYXNlIkZMT0FUUyI6Y2FzZSA2OnQudHlwZT02O2JyZWFrO2Nhc2UiSU5UUyI6Y2FzZSA3OnQudHlwZT03O2JyZWFrO2Nhc2UiU1RSSU5HUyI6Y2FzZSA4OnQudHlwZT04O2JyZWFrO2Nhc2UiVEVOU09SUyI6Y2FzZSA5OnQudHlwZT05O2JyZWFrO2Nhc2UiR1JBUEhTIjpjYXNlIDEwOnQudHlwZT0xMDticmVhaztjYXNlIlNQQVJTRV9URU5TT1JTIjpjYXNlIDEyOnQudHlwZT0xMjticmVhaztjYXNlIlRZUEVfUFJPVE9TIjpjYXNlIDE0OnQudHlwZT0xNDt9aWYobnVsbCE9ZS5mJiYodC5mPU51bWJlcihlLmYpKSxudWxsIT1lLmkmJihsLkxvbmc/KHQuaT1sLkxvbmcuZnJvbVZhbHVlKGUuaSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5pP3QuaT1wYXJzZUludChlLmksMTApOiJudW1iZXIiPT10eXBlb2YgZS5pP3QuaT1lLmk6Im9iamVjdCI9PXR5cGVvZiBlLmkmJih0Lmk9bmV3IGwuTG9uZ0JpdHMoZS5pLmxvdz4+PjAsZS5pLmhpZ2g+Pj4wKS50b051bWJlcigpKSksbnVsbCE9ZS5zJiYoInN0cmluZyI9PXR5cGVvZiBlLnM/bC5iYXNlNjQuZGVjb2RlKGUucyx0LnM9bC5uZXdCdWZmZXIobC5iYXNlNjQubGVuZ3RoKGUucykpLDApOmUucy5sZW5ndGg+PTAmJih0LnM9ZS5zKSksbnVsbCE9ZS50KXtpZigib2JqZWN0IiE9dHlwZW9mIGUudCl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnQ6IG9iamVjdCBleHBlY3RlZCIpO3QudD1jLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnQpO31pZihudWxsIT1lLmcpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5nKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZzogb2JqZWN0IGV4cGVjdGVkIik7dC5nPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5nKTt9aWYobnVsbCE9ZS5zcGFyc2VUZW5zb3Ipe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zcGFyc2VUZW5zb3IpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5zcGFyc2VUZW5zb3I6IG9iamVjdCBleHBlY3RlZCIpO3Quc3BhcnNlVGVuc29yPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuc3BhcnNlVGVuc29yKTt9aWYobnVsbCE9ZS50cCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnRwKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udHA6IG9iamVjdCBleHBlY3RlZCIpO3QudHA9Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUudHApO31pZihlLmZsb2F0cyl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdHMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZmxvYXRzOiBhcnJheSBleHBlY3RlZCIpO3QuZmxvYXRzPVtdO2Zvcih2YXIgbj0wO248ZS5mbG9hdHMubGVuZ3RoOysrbil0LmZsb2F0c1tuXT1OdW1iZXIoZS5mbG9hdHNbbl0pO31pZihlLmludHMpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50cykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5pbnRzOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmludHM9W10sbj0wO248ZS5pbnRzLmxlbmd0aDsrK24pbC5Mb25nPyh0LmludHNbbl09bC5Mb25nLmZyb21WYWx1ZShlLmludHNbbl0pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuaW50c1tuXT90LmludHNbbl09cGFyc2VJbnQoZS5pbnRzW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUuaW50c1tuXT90LmludHNbbl09ZS5pbnRzW25dOiJvYmplY3QiPT10eXBlb2YgZS5pbnRzW25dJiYodC5pbnRzW25dPW5ldyBsLkxvbmdCaXRzKGUuaW50c1tuXS5sb3c+Pj4wLGUuaW50c1tuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSk7fWlmKGUuc3RyaW5ncyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnN0cmluZ3M6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuc3RyaW5ncz1bXSxuPTA7bjxlLnN0cmluZ3MubGVuZ3RoOysrbikic3RyaW5nIj09dHlwZW9mIGUuc3RyaW5nc1tuXT9sLmJhc2U2NC5kZWNvZGUoZS5zdHJpbmdzW25dLHQuc3RyaW5nc1tuXT1sLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5zdHJpbmdzW25dKSksMCk6ZS5zdHJpbmdzW25dLmxlbmd0aD49MCYmKHQuc3RyaW5nc1tuXT1lLnN0cmluZ3Nbbl0pO31pZihlLnRlbnNvcnMpe2lmKCFBcnJheS5pc0FycmF5KGUudGVuc29ycykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50ZW5zb3JzOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnRlbnNvcnM9W10sbj0wO248ZS50ZW5zb3JzLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS50ZW5zb3JzW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udGVuc29yczogb2JqZWN0IGV4cGVjdGVkIik7dC50ZW5zb3JzW25dPWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudGVuc29yc1tuXSk7fX1pZihlLmdyYXBocyl7aWYoIUFycmF5LmlzQXJyYXkoZS5ncmFwaHMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZ3JhcGhzOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmdyYXBocz1bXSxuPTA7bjxlLmdyYXBocy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZ3JhcGhzW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZ3JhcGhzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmdyYXBoc1tuXT1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZ3JhcGhzW25dKTt9fWlmKGUuc3BhcnNlVGVuc29ycyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VUZW5zb3JzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuc3BhcnNlVGVuc29ycz1bXSxuPTA7bjxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZVRlbnNvcnNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5zcGFyc2VUZW5zb3JzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNwYXJzZVRlbnNvcnNbbl09Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmZyb21PYmplY3QoZS5zcGFyc2VUZW5zb3JzW25dKTt9fWlmKGUudHlwZVByb3Rvcyl7aWYoIUFycmF5LmlzQXJyYXkoZS50eXBlUHJvdG9zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnR5cGVQcm90b3M6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudHlwZVByb3Rvcz1bXSxuPTA7bjxlLnR5cGVQcm90b3MubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnR5cGVQcm90b3Nbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50eXBlUHJvdG9zOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnR5cGVQcm90b3Nbbl09Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUudHlwZVByb3Rvc1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5mbG9hdHM9W10sbi5pbnRzPVtdLG4uc3RyaW5ncz1bXSxuLnRlbnNvcnM9W10sbi5ncmFwaHM9W10sbi50eXBlUHJvdG9zPVtdLG4uc3BhcnNlVGVuc29ycz1bXSksdC5kZWZhdWx0cyl7aWYobi5uYW1lPSIiLG4uZj0wLGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24uaT10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4uaT10LmxvbmdzPT09U3RyaW5nPyIwIjowO3QuYnl0ZXM9PT1TdHJpbmc/bi5zPSIiOihuLnM9W10sdC5ieXRlcyE9PUFycmF5JiYobi5zPWwubmV3QnVmZmVyKG4ucykpKSxuLnQ9bnVsbCxuLmc9bnVsbCxuLmRvY1N0cmluZz0iIixuLnRwPW51bGwsbi50eXBlPXQuZW51bXM9PT1TdHJpbmc/IlVOREVGSU5FRCI6MCxuLnJlZkF0dHJOYW1lPSIiLG4uc3BhcnNlVGVuc29yPW51bGw7fWlmKG51bGwhPWUubmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYobi5uYW1lPWUubmFtZSksbnVsbCE9ZS5mJiZlLmhhc093blByb3BlcnR5KCJmIikmJihuLmY9dC5qc29uJiYhaXNGaW5pdGUoZS5mKT9TdHJpbmcoZS5mKTplLmYpLG51bGwhPWUuaSYmZS5oYXNPd25Qcm9wZXJ0eSgiaSIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmk/bi5pPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaSk6ZS5pOm4uaT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmkpOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pLmxvdz4+PjAsZS5pLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaSksbnVsbCE9ZS5zJiZlLmhhc093blByb3BlcnR5KCJzIikmJihuLnM9dC5ieXRlcz09PVN0cmluZz9sLmJhc2U2NC5lbmNvZGUoZS5zLDAsZS5zLmxlbmd0aCk6dC5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUucyk6ZS5zKSxudWxsIT1lLnQmJmUuaGFzT3duUHJvcGVydHkoInQiKSYmKG4udD1jLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS50LHQpKSxudWxsIT1lLmcmJmUuaGFzT3duUHJvcGVydHkoImciKSYmKG4uZz1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmcsdCkpLGUuZmxvYXRzJiZlLmZsb2F0cy5sZW5ndGgpe24uZmxvYXRzPVtdO2Zvcih2YXIgbz0wO288ZS5mbG9hdHMubGVuZ3RoOysrbyluLmZsb2F0c1tvXT10Lmpzb24mJiFpc0Zpbml0ZShlLmZsb2F0c1tvXSk/U3RyaW5nKGUuZmxvYXRzW29dKTplLmZsb2F0c1tvXTt9aWYoZS5pbnRzJiZlLmludHMubGVuZ3RoKWZvcihuLmludHM9W10sbz0wO288ZS5pbnRzLmxlbmd0aDsrK28pIm51bWJlciI9PXR5cGVvZiBlLmludHNbb10/bi5pbnRzW29dPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaW50c1tvXSk6ZS5pbnRzW29dOm4uaW50c1tvXT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmludHNbb10pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pbnRzW29dLmxvdz4+PjAsZS5pbnRzW29dLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaW50c1tvXTtpZihlLnN0cmluZ3MmJmUuc3RyaW5ncy5sZW5ndGgpZm9yKG4uc3RyaW5ncz1bXSxvPTA7bzxlLnN0cmluZ3MubGVuZ3RoOysrbyluLnN0cmluZ3Nbb109dC5ieXRlcz09PVN0cmluZz9sLmJhc2U2NC5lbmNvZGUoZS5zdHJpbmdzW29dLDAsZS5zdHJpbmdzW29dLmxlbmd0aCk6dC5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuc3RyaW5nc1tvXSk6ZS5zdHJpbmdzW29dO2lmKGUudGVuc29ycyYmZS50ZW5zb3JzLmxlbmd0aClmb3Iobi50ZW5zb3JzPVtdLG89MDtvPGUudGVuc29ycy5sZW5ndGg7KytvKW4udGVuc29yc1tvXT1jLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS50ZW5zb3JzW29dLHQpO2lmKGUuZ3JhcGhzJiZlLmdyYXBocy5sZW5ndGgpZm9yKG4uZ3JhcGhzPVtdLG89MDtvPGUuZ3JhcGhzLmxlbmd0aDsrK28pbi5ncmFwaHNbb109Yy5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5ncmFwaHNbb10sdCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG51bGwhPWUudHAmJmUuaGFzT3duUHJvcGVydHkoInRwIikmJihuLnRwPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50cCx0KSksZS50eXBlUHJvdG9zJiZlLnR5cGVQcm90b3MubGVuZ3RoKWZvcihuLnR5cGVQcm90b3M9W10sbz0wO288ZS50eXBlUHJvdG9zLmxlbmd0aDsrK28pbi50eXBlUHJvdG9zW29dPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50eXBlUHJvdG9zW29dLHQpO2lmKG51bGwhPWUudHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpJiYobi50eXBlPXQuZW51bXM9PT1TdHJpbmc/dm9pZCAwPT09Yy5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbZS50eXBlXT9lLnR5cGU6Yy5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbZS50eXBlXTplLnR5cGUpLG51bGwhPWUucmVmQXR0ck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInJlZkF0dHJOYW1lIikmJihuLnJlZkF0dHJOYW1lPWUucmVmQXR0ck5hbWUpLG51bGwhPWUuc3BhcnNlVGVuc29yJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3IiKSYmKG4uc3BhcnNlVGVuc29yPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZVRlbnNvcix0KSksZS5zcGFyc2VUZW5zb3JzJiZlLnNwYXJzZVRlbnNvcnMubGVuZ3RoKWZvcihuLnNwYXJzZVRlbnNvcnM9W10sbz0wO288ZS5zcGFyc2VUZW5zb3JzLmxlbmd0aDsrK28pbi5zcGFyc2VUZW5zb3JzW29dPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZVRlbnNvcnNbb10sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguQXR0cmlidXRlUHJvdG8ifSxlLkF0dHJpYnV0ZVR5cGU9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iVU5ERUZJTkVEIl09MCx0W2VbMV09IkZMT0FUIl09MSx0W2VbMl09IklOVCJdPTIsdFtlWzNdPSJTVFJJTkciXT0zLHRbZVs0XT0iVEVOU09SIl09NCx0W2VbNV09IkdSQVBIIl09NSx0W2VbMTFdPSJTUEFSU0VfVEVOU09SIl09MTEsdFtlWzEzXT0iVFlQRV9QUk9UTyJdPTEzLHRbZVs2XT0iRkxPQVRTIl09Nix0W2VbN109IklOVFMiXT03LHRbZVs4XT0iU1RSSU5HUyJdPTgsdFtlWzldPSJURU5TT1JTIl09OSx0W2VbMTBdPSJHUkFQSFMiXT0xMCx0W2VbMTJdPSJTUEFSU0VfVEVOU09SUyJdPTEyLHRbZVsxNF09IlRZUEVfUFJPVE9TIl09MTQsdH0oKSxlfSgpLGkuVmFsdWVJbmZvUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUudHlwZT1udWxsLGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS50eXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0eXBlIikmJmMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudHlwZSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDI2KS5zdHJpbmcoZS5kb2NTdHJpbmcpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5WYWx1ZUluZm9Qcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci50eXBlPWMub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUudHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnR5cGUpO2lmKHQpcmV0dXJuICJ0eXBlLiIrdH1yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZyk/ImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5WYWx1ZUluZm9Qcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlZhbHVlSW5mb1Byb3RvO2lmKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksbnVsbCE9ZS50eXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlZhbHVlSW5mb1Byb3RvLnR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3QudHlwZT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50eXBlKTt9cmV0dXJuIG51bGwhPWUuZG9jU3RyaW5nJiYodC5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLnR5cGU9bnVsbCxuLmRvY1N0cmluZz0iIiksbnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLnR5cGUmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmKG4udHlwZT1jLm9ubnguVHlwZVByb3RvLnRvT2JqZWN0KGUudHlwZSx0KSksbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVmFsdWVJbmZvUHJvdG8ifSxlfSgpLGkuTm9kZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmlucHV0PVtdLHRoaXMub3V0cHV0PVtdLHRoaXMuYXR0cmlidXRlPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmlucHV0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5vdXRwdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUub3BUeXBlPSIiLGUucHJvdG90eXBlLmRvbWFpbj0iIixlLnByb3RvdHlwZS5hdHRyaWJ1dGU9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5pbnB1dCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pdC51aW50MzIoMTApLnN0cmluZyhlLmlucHV0W25dKTtpZihudWxsIT1lLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXQudWludDMyKDE4KS5zdHJpbmcoZS5vdXRwdXRbbl0pO2lmKG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigyNikuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5vcFR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm9wVHlwZSIpJiZ0LnVpbnQzMigzNCkuc3RyaW5nKGUub3BUeXBlKSxudWxsIT1lLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuPTA7bjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytuKWMub25ueC5BdHRyaWJ1dGVQcm90by5lbmNvZGUoZS5hdHRyaWJ1dGVbbl0sdC51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoNTApLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMig1OCkuc3RyaW5nKGUuZG9tYWluKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguTm9kZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuaW5wdXQmJnIuaW5wdXQubGVuZ3RofHwoci5pbnB1dD1bXSksci5pbnB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgMjpyLm91dHB1dCYmci5vdXRwdXQubGVuZ3RofHwoci5vdXRwdXQ9W10pLHIub3V0cHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAzOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDpyLm9wVHlwZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNzpyLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNTpyLmF0dHJpYnV0ZSYmci5hdHRyaWJ1dGUubGVuZ3RofHwoci5hdHRyaWJ1dGU9W10pLHIuYXR0cmlidXRlLnB1c2goYy5vbm54LkF0dHJpYnV0ZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDY6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmlucHV0JiZlLmhhc093blByb3BlcnR5KCJpbnB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSlyZXR1cm4gImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLmlucHV0Lmxlbmd0aDsrK3QpaWYoIWwuaXNTdHJpbmcoZS5pbnB1dFt0XSkpcmV0dXJuICJpbnB1dDogc3RyaW5nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUub3V0cHV0JiZlLmhhc093blByb3BlcnR5KCJvdXRwdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vdXRwdXQpKXJldHVybiAib3V0cHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUub3V0cHV0Lmxlbmd0aDsrK3QpaWYoIWwuaXNTdHJpbmcoZS5vdXRwdXRbdF0pKXJldHVybiAib3V0cHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUub3BUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcFR5cGUiKSYmIWwuaXNTdHJpbmcoZS5vcFR5cGUpKXJldHVybiAib3BUeXBlOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pKXJldHVybiAiZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuYXR0cmlidXRlJiZlLmhhc093blByb3BlcnR5KCJhdHRyaWJ1dGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXJldHVybiAiYXR0cmlidXRlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuYXR0cmlidXRlLmxlbmd0aDsrK3Qpe3ZhciBuPWMub25ueC5BdHRyaWJ1dGVQcm90by52ZXJpZnkoZS5hdHRyaWJ1dGVbdF0pO2lmKG4pcmV0dXJuICJhdHRyaWJ1dGUuIitufX1yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZyk/ImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5Ob2RlUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5Ob2RlUHJvdG87aWYoZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Ob2RlUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7dC5pbnB1dD1bXTtmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil0LmlucHV0W25dPVN0cmluZyhlLmlucHV0W25dKTt9aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5vdXRwdXQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQub3V0cHV0PVtdLG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pdC5vdXRwdXRbbl09U3RyaW5nKGUub3V0cHV0W25dKTt9aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxudWxsIT1lLm9wVHlwZSYmKHQub3BUeXBlPVN0cmluZyhlLm9wVHlwZSkpLG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksZS5hdHRyaWJ1dGUpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5hdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuYXR0cmlidXRlPVtdLG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5hdHRyaWJ1dGVbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Ob2RlUHJvdG8uYXR0cmlidXRlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmF0dHJpYnV0ZVtuXT1jLm9ubnguQXR0cmlidXRlUHJvdG8uZnJvbU9iamVjdChlLmF0dHJpYnV0ZVtuXSk7fX1yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKCh0LmFycmF5c3x8dC5kZWZhdWx0cykmJihuLmlucHV0PVtdLG4ub3V0cHV0PVtdLG4uYXR0cmlidXRlPVtdKSx0LmRlZmF1bHRzJiYobi5uYW1lPSIiLG4ub3BUeXBlPSIiLG4uZG9jU3RyaW5nPSIiLG4uZG9tYWluPSIiKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aCl7bi5pbnB1dD1bXTtmb3IodmFyIHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrciluLmlucHV0W3JdPWUuaW5wdXRbcl07fWlmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG4ub3V0cHV0PVtdLHI9MDtyPGUub3V0cHV0Lmxlbmd0aDsrK3Ipbi5vdXRwdXRbcl09ZS5vdXRwdXRbcl07aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLm9wVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgib3BUeXBlIikmJihuLm9wVHlwZT1lLm9wVHlwZSksZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aClmb3Iobi5hdHRyaWJ1dGU9W10scj0wO3I8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrciluLmF0dHJpYnV0ZVtyXT1jLm9ubnguQXR0cmlidXRlUHJvdG8udG9PYmplY3QoZS5hdHRyaWJ1dGVbcl0sdCk7cmV0dXJuIG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5Ob2RlUHJvdG8ifSxlfSgpLGkuVHJhaW5pbmdJbmZvUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdLHRoaXMudXBkYXRlQmluZGluZz1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5pbml0aWFsaXphdGlvbj1udWxsLGUucHJvdG90eXBlLmFsZ29yaXRobT1udWxsLGUucHJvdG90eXBlLmluaXRpYWxpemF0aW9uQmluZGluZz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudXBkYXRlQmluZGluZz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuaW5pdGlhbGl6YXRpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImluaXRpYWxpemF0aW9uIikmJmMub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmluaXRpYWxpemF0aW9uLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuYWxnb3JpdGhtJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJhbGdvcml0aG0iKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuYWxnb3JpdGhtLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuaW5pdGlhbGl6YXRpb25CaW5kaW5nJiZlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLmluaXRpYWxpemF0aW9uQmluZGluZ1tuXSx0LnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLnVwZGF0ZUJpbmRpbmcmJmUudXBkYXRlQmluZGluZy5sZW5ndGgpZm9yKG49MDtuPGUudXBkYXRlQmluZGluZy5sZW5ndGg7KytuKWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLnVwZGF0ZUJpbmRpbmdbbl0sdC51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UcmFpbmluZ0luZm9Qcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmluaXRpYWxpemF0aW9uPWMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjpyLmFsZ29yaXRobT1jLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDM6ci5pbml0aWFsaXphdGlvbkJpbmRpbmcmJnIuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aHx8KHIuaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdKSxyLmluaXRpYWxpemF0aW9uQmluZGluZy5wdXNoKGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDQ6ci51cGRhdGVCaW5kaW5nJiZyLnVwZGF0ZUJpbmRpbmcubGVuZ3RofHwoci51cGRhdGVCaW5kaW5nPVtdKSxyLnVwZGF0ZUJpbmRpbmcucHVzaChjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5pbml0aWFsaXphdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6YXRpb24iKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6YXRpb24pKSlyZXR1cm4gImluaXRpYWxpemF0aW9uLiIrbjtpZihudWxsIT1lLmFsZ29yaXRobSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWxnb3JpdGhtIikmJihuPWMub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmFsZ29yaXRobSkpKXJldHVybiAiYWxnb3JpdGhtLiIrbjtpZihudWxsIT1lLmluaXRpYWxpemF0aW9uQmluZGluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6YXRpb25CaW5kaW5nIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKSlyZXR1cm4gImluaXRpYWxpemF0aW9uQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RoOysrdClpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLmluaXRpYWxpemF0aW9uQmluZGluZ1t0XSkpcmV0dXJuICJpbml0aWFsaXphdGlvbkJpbmRpbmcuIitufWlmKG51bGwhPWUudXBkYXRlQmluZGluZyYmZS5oYXNPd25Qcm9wZXJ0eSgidXBkYXRlQmluZGluZyIpKXtpZighQXJyYXkuaXNBcnJheShlLnVwZGF0ZUJpbmRpbmcpKXJldHVybiAidXBkYXRlQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS51cGRhdGVCaW5kaW5nW3RdKSlyZXR1cm4gInVwZGF0ZUJpbmRpbmcuIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UcmFpbmluZ0luZm9Qcm90bztpZihudWxsIT1lLmluaXRpYWxpemF0aW9uKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5pdGlhbGl6YXRpb24pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbjogb2JqZWN0IGV4cGVjdGVkIik7dC5pbml0aWFsaXphdGlvbj1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6YXRpb24pO31pZihudWxsIT1lLmFsZ29yaXRobSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmFsZ29yaXRobSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmFsZ29yaXRobTogb2JqZWN0IGV4cGVjdGVkIik7dC5hbGdvcml0aG09Yy5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmFsZ29yaXRobSk7fWlmKGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemF0aW9uQmluZGluZykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbkJpbmRpbmc6IGFycmF5IGV4cGVjdGVkIik7dC5pbml0aWFsaXphdGlvbkJpbmRpbmc9W107Zm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uaW5pdGlhbGl6YXRpb25CaW5kaW5nOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemF0aW9uQmluZGluZ1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dKTt9fWlmKGUudXBkYXRlQmluZGluZyl7aWYoIUFycmF5LmlzQXJyYXkoZS51cGRhdGVCaW5kaW5nKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLnVwZGF0ZUJpbmRpbmc6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudXBkYXRlQmluZGluZz1bXSxuPTA7bjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnVwZGF0ZUJpbmRpbmdbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by51cGRhdGVCaW5kaW5nOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnVwZGF0ZUJpbmRpbmdbbl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZnJvbU9iamVjdChlLnVwZGF0ZUJpbmRpbmdbbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdLG4udXBkYXRlQmluZGluZz1bXSksdC5kZWZhdWx0cyYmKG4uaW5pdGlhbGl6YXRpb249bnVsbCxuLmFsZ29yaXRobT1udWxsKSxudWxsIT1lLmluaXRpYWxpemF0aW9uJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXphdGlvbiIpJiYobi5pbml0aWFsaXphdGlvbj1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmluaXRpYWxpemF0aW9uLHQpKSxudWxsIT1lLmFsZ29yaXRobSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWxnb3JpdGhtIikmJihuLmFsZ29yaXRobT1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmFsZ29yaXRobSx0KSksZS5pbml0aWFsaXphdGlvbkJpbmRpbmcmJmUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aCl7bi5pbml0aWFsaXphdGlvbkJpbmRpbmc9W107Zm9yKHZhciByPTA7cjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytyKW4uaW5pdGlhbGl6YXRpb25CaW5kaW5nW3JdPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW3JdLHQpO31pZihlLnVwZGF0ZUJpbmRpbmcmJmUudXBkYXRlQmluZGluZy5sZW5ndGgpZm9yKG4udXBkYXRlQmluZGluZz1bXSxyPTA7cjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrciluLnVwZGF0ZUJpbmRpbmdbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS51cGRhdGVCaW5kaW5nW3JdLHQpO3JldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRyYWluaW5nSW5mb1Byb3RvIn0sZX0oKSxpLk1vZGVsUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMub3BzZXRJbXBvcnQ9W10sdGhpcy5tZXRhZGF0YVByb3BzPVtdLHRoaXMudHJhaW5pbmdJbmZvPVtdLHRoaXMuZnVuY3Rpb25zPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmlyVmVyc2lvbj1sLkxvbmc/bC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5vcHNldEltcG9ydD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUucHJvZHVjZXJOYW1lPSIiLGUucHJvdG90eXBlLnByb2R1Y2VyVmVyc2lvbj0iIixlLnByb3RvdHlwZS5kb21haW49IiIsZS5wcm90b3R5cGUubW9kZWxWZXJzaW9uPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5ncmFwaD1udWxsLGUucHJvdG90eXBlLm1ldGFkYXRhUHJvcHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnRyYWluaW5nSW5mbz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZnVuY3Rpb25zPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5pclZlcnNpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImlyVmVyc2lvbiIpJiZ0LnVpbnQzMig4KS5pbnQ2NChlLmlyVmVyc2lvbiksbnVsbCE9ZS5wcm9kdWNlck5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInByb2R1Y2VyTmFtZSIpJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUucHJvZHVjZXJOYW1lKSxudWxsIT1lLnByb2R1Y2VyVmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicHJvZHVjZXJWZXJzaW9uIikmJnQudWludDMyKDI2KS5zdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pLG51bGwhPWUuZG9tYWluJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb21haW4iKSYmdC51aW50MzIoMzQpLnN0cmluZyhlLmRvbWFpbiksbnVsbCE9ZS5tb2RlbFZlcnNpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm1vZGVsVmVyc2lvbiIpJiZ0LnVpbnQzMig0MCkuaW50NjQoZS5tb2RlbFZlcnNpb24pLG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoNTApLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5ncmFwaCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZ3JhcGgiKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZ3JhcGgsdC51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK24pYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5lbmNvZGUoZS5vcHNldEltcG9ydFtuXSx0LnVpbnQzMig2NikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLm1ldGFkYXRhUHJvcHMmJmUubWV0YWRhdGFQcm9wcy5sZW5ndGgpZm9yKG49MDtuPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytuKWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLm1ldGFkYXRhUHJvcHNbbl0sdC51aW50MzIoMTE0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUudHJhaW5pbmdJbmZvJiZlLnRyYWluaW5nSW5mby5sZW5ndGgpZm9yKG49MDtuPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK24pYy5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmVuY29kZShlLnRyYWluaW5nSW5mb1tuXSx0LnVpbnQzMigxNjIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5mdW5jdGlvbnMmJmUuZnVuY3Rpb25zLmxlbmd0aClmb3Iobj0wO248ZS5mdW5jdGlvbnMubGVuZ3RoOysrbiljLm9ubnguRnVuY3Rpb25Qcm90by5lbmNvZGUoZS5mdW5jdGlvbnNbbl0sdC51aW50MzIoMjAyKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguTW9kZWxQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmlyVmVyc2lvbj1lLmludDY0KCk7YnJlYWs7Y2FzZSA4OnIub3BzZXRJbXBvcnQmJnIub3BzZXRJbXBvcnQubGVuZ3RofHwoci5vcHNldEltcG9ydD1bXSksci5vcHNldEltcG9ydC5wdXNoKGMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjpyLnByb2R1Y2VyTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLnByb2R1Y2VyVmVyc2lvbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDpyLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNTpyLm1vZGVsVmVyc2lvbj1lLmludDY0KCk7YnJlYWs7Y2FzZSA2OnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA3OnIuZ3JhcGg9Yy5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAxNDpyLm1ldGFkYXRhUHJvcHMmJnIubWV0YWRhdGFQcm9wcy5sZW5ndGh8fChyLm1ldGFkYXRhUHJvcHM9W10pLHIubWV0YWRhdGFQcm9wcy5wdXNoKGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDIwOnIudHJhaW5pbmdJbmZvJiZyLnRyYWluaW5nSW5mby5sZW5ndGh8fChyLnRyYWluaW5nSW5mbz1bXSksci50cmFpbmluZ0luZm8ucHVzaChjLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjU6ci5mdW5jdGlvbnMmJnIuZnVuY3Rpb25zLmxlbmd0aHx8KHIuZnVuY3Rpb25zPVtdKSxyLmZ1bmN0aW9ucy5wdXNoKGMub25ueC5GdW5jdGlvblByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmlyVmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJiEobC5pc0ludGVnZXIoZS5pclZlcnNpb24pfHxlLmlyVmVyc2lvbiYmbC5pc0ludGVnZXIoZS5pclZlcnNpb24ubG93KSYmbC5pc0ludGVnZXIoZS5pclZlcnNpb24uaGlnaCkpKXJldHVybiAiaXJWZXJzaW9uOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUub3BzZXRJbXBvcnQmJmUuaGFzT3duUHJvcGVydHkoIm9wc2V0SW1wb3J0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXJldHVybiAib3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUub3BzZXRJbXBvcnQubGVuZ3RoOysrdClpZihuPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8udmVyaWZ5KGUub3BzZXRJbXBvcnRbdF0pKXJldHVybiAib3BzZXRJbXBvcnQuIitufWlmKG51bGwhPWUucHJvZHVjZXJOYW1lJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlck5hbWUiKSYmIWwuaXNTdHJpbmcoZS5wcm9kdWNlck5hbWUpKXJldHVybiAicHJvZHVjZXJOYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucHJvZHVjZXJWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlclZlcnNpb24iKSYmIWwuaXNTdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKXJldHVybiAicHJvZHVjZXJWZXJzaW9uOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pKXJldHVybiAiZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUubW9kZWxWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJtb2RlbFZlcnNpb24iKSYmIShsLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbil8fGUubW9kZWxWZXJzaW9uJiZsLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbi5sb3cpJiZsLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbi5oaWdoKSkpcmV0dXJuICJtb2RlbFZlcnNpb246IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5ncmFwaCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGgiKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZ3JhcGgpKSlyZXR1cm4gImdyYXBoLiIrbjtpZihudWxsIT1lLm1ldGFkYXRhUHJvcHMmJmUuaGFzT3duUHJvcGVydHkoIm1ldGFkYXRhUHJvcHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSlyZXR1cm4gIm1ldGFkYXRhUHJvcHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5tZXRhZGF0YVByb3BzW3RdKSlyZXR1cm4gIm1ldGFkYXRhUHJvcHMuIitufWlmKG51bGwhPWUudHJhaW5pbmdJbmZvJiZlLmhhc093blByb3BlcnR5KCJ0cmFpbmluZ0luZm8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS50cmFpbmluZ0luZm8pKXJldHVybiAidHJhaW5pbmdJbmZvOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udmVyaWZ5KGUudHJhaW5pbmdJbmZvW3RdKSlyZXR1cm4gInRyYWluaW5nSW5mby4iK259aWYobnVsbCE9ZS5mdW5jdGlvbnMmJmUuaGFzT3duUHJvcGVydHkoImZ1bmN0aW9ucyIpKXtpZighQXJyYXkuaXNBcnJheShlLmZ1bmN0aW9ucykpcmV0dXJuICJmdW5jdGlvbnM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5mdW5jdGlvbnMubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguRnVuY3Rpb25Qcm90by52ZXJpZnkoZS5mdW5jdGlvbnNbdF0pKXJldHVybiAiZnVuY3Rpb25zLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54Lk1vZGVsUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5Nb2RlbFByb3RvO2lmKG51bGwhPWUuaXJWZXJzaW9uJiYobC5Mb25nPyh0LmlyVmVyc2lvbj1sLkxvbmcuZnJvbVZhbHVlKGUuaXJWZXJzaW9uKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmlyVmVyc2lvbj90LmlyVmVyc2lvbj1wYXJzZUludChlLmlyVmVyc2lvbiwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmlyVmVyc2lvbj90LmlyVmVyc2lvbj1lLmlyVmVyc2lvbjoib2JqZWN0Ij09dHlwZW9mIGUuaXJWZXJzaW9uJiYodC5pclZlcnNpb249bmV3IGwuTG9uZ0JpdHMoZS5pclZlcnNpb24ubG93Pj4+MCxlLmlyVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLGUub3BzZXRJbXBvcnQpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5vcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiKTt0Lm9wc2V0SW1wb3J0PVtdO2Zvcih2YXIgbj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUub3BzZXRJbXBvcnRbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm9wc2V0SW1wb3J0OiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm9wc2V0SW1wb3J0W25dPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZnJvbU9iamVjdChlLm9wc2V0SW1wb3J0W25dKTt9fWlmKG51bGwhPWUucHJvZHVjZXJOYW1lJiYodC5wcm9kdWNlck5hbWU9U3RyaW5nKGUucHJvZHVjZXJOYW1lKSksbnVsbCE9ZS5wcm9kdWNlclZlcnNpb24mJih0LnByb2R1Y2VyVmVyc2lvbj1TdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKSxudWxsIT1lLmRvbWFpbiYmKHQuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLG51bGwhPWUubW9kZWxWZXJzaW9uJiYobC5Mb25nPyh0Lm1vZGVsVmVyc2lvbj1sLkxvbmcuZnJvbVZhbHVlKGUubW9kZWxWZXJzaW9uKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLm1vZGVsVmVyc2lvbj90Lm1vZGVsVmVyc2lvbj1wYXJzZUludChlLm1vZGVsVmVyc2lvbiwxMCk6Im51bWJlciI9PXR5cGVvZiBlLm1vZGVsVmVyc2lvbj90Lm1vZGVsVmVyc2lvbj1lLm1vZGVsVmVyc2lvbjoib2JqZWN0Ij09dHlwZW9mIGUubW9kZWxWZXJzaW9uJiYodC5tb2RlbFZlcnNpb249bmV3IGwuTG9uZ0JpdHMoZS5tb2RlbFZlcnNpb24ubG93Pj4+MCxlLm1vZGVsVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLG51bGwhPWUuZG9jU3RyaW5nJiYodC5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksbnVsbCE9ZS5ncmFwaCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmdyYXBoKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5ncmFwaDogb2JqZWN0IGV4cGVjdGVkIik7dC5ncmFwaD1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZ3JhcGgpO31pZihlLm1ldGFkYXRhUHJvcHMpe2lmKCFBcnJheS5pc0FycmF5KGUubWV0YWRhdGFQcm9wcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm1ldGFkYXRhUHJvcHM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQubWV0YWRhdGFQcm9wcz1bXSxuPTA7bjxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm1ldGFkYXRhUHJvcHNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm1ldGFkYXRhUHJvcHM6IG9iamVjdCBleHBlY3RlZCIpO3QubWV0YWRhdGFQcm9wc1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUubWV0YWRhdGFQcm9wc1tuXSk7fX1pZihlLnRyYWluaW5nSW5mbyl7aWYoIUFycmF5LmlzQXJyYXkoZS50cmFpbmluZ0luZm8pKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by50cmFpbmluZ0luZm86IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudHJhaW5pbmdJbmZvPVtdLG49MDtuPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS50cmFpbmluZ0luZm9bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLnRyYWluaW5nSW5mbzogb2JqZWN0IGV4cGVjdGVkIik7dC50cmFpbmluZ0luZm9bbl09Yy5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmZyb21PYmplY3QoZS50cmFpbmluZ0luZm9bbl0pO319aWYoZS5mdW5jdGlvbnMpe2lmKCFBcnJheS5pc0FycmF5KGUuZnVuY3Rpb25zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8uZnVuY3Rpb25zOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmZ1bmN0aW9ucz1bXSxuPTA7bjxlLmZ1bmN0aW9ucy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZnVuY3Rpb25zW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5mdW5jdGlvbnM6IG9iamVjdCBleHBlY3RlZCIpO3QuZnVuY3Rpb25zW25dPWMub25ueC5GdW5jdGlvblByb3RvLmZyb21PYmplY3QoZS5mdW5jdGlvbnNbbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4ub3BzZXRJbXBvcnQ9W10sbi5tZXRhZGF0YVByb3BzPVtdLG4udHJhaW5pbmdJbmZvPVtdLG4uZnVuY3Rpb25zPVtdKSx0LmRlZmF1bHRzKXtpZihsLkxvbmcpe3ZhciByPW5ldyBsLkxvbmcoMCwwLCExKTtuLmlyVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4uaXJWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7bi5wcm9kdWNlck5hbWU9IiIsbi5wcm9kdWNlclZlcnNpb249IiIsbi5kb21haW49IiIsbC5Mb25nPyhyPW5ldyBsLkxvbmcoMCwwLCExKSxuLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyKTpuLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nPyIwIjowLG4uZG9jU3RyaW5nPSIiLG4uZ3JhcGg9bnVsbDt9aWYobnVsbCE9ZS5pclZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoImlyVmVyc2lvbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmlyVmVyc2lvbj9uLmlyVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmlyVmVyc2lvbik6ZS5pclZlcnNpb246bi5pclZlcnNpb249dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pclZlcnNpb24pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pclZlcnNpb24ubG93Pj4+MCxlLmlyVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmlyVmVyc2lvbiksbnVsbCE9ZS5wcm9kdWNlck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyTmFtZSIpJiYobi5wcm9kdWNlck5hbWU9ZS5wcm9kdWNlck5hbWUpLG51bGwhPWUucHJvZHVjZXJWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlclZlcnNpb24iKSYmKG4ucHJvZHVjZXJWZXJzaW9uPWUucHJvZHVjZXJWZXJzaW9uKSxudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksbnVsbCE9ZS5tb2RlbFZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoIm1vZGVsVmVyc2lvbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLm1vZGVsVmVyc2lvbj9uLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLm1vZGVsVmVyc2lvbik6ZS5tb2RlbFZlcnNpb246bi5tb2RlbFZlcnNpb249dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5tb2RlbFZlcnNpb24pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5tb2RlbFZlcnNpb24ubG93Pj4+MCxlLm1vZGVsVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKTplLm1vZGVsVmVyc2lvbiksbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG51bGwhPWUuZ3JhcGgmJmUuaGFzT3duUHJvcGVydHkoImdyYXBoIikmJihuLmdyYXBoPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuZ3JhcGgsdCkpLGUub3BzZXRJbXBvcnQmJmUub3BzZXRJbXBvcnQubGVuZ3RoKXtuLm9wc2V0SW1wb3J0PVtdO2Zvcih2YXIgbz0wO288ZS5vcHNldEltcG9ydC5sZW5ndGg7KytvKW4ub3BzZXRJbXBvcnRbb109Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by50b09iamVjdChlLm9wc2V0SW1wb3J0W29dLHQpO31pZihlLm1ldGFkYXRhUHJvcHMmJmUubWV0YWRhdGFQcm9wcy5sZW5ndGgpZm9yKG4ubWV0YWRhdGFQcm9wcz1bXSxvPTA7bzxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrbyluLm1ldGFkYXRhUHJvcHNbb109Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5tZXRhZGF0YVByb3BzW29dLHQpO2lmKGUudHJhaW5pbmdJbmZvJiZlLnRyYWluaW5nSW5mby5sZW5ndGgpZm9yKG4udHJhaW5pbmdJbmZvPVtdLG89MDtvPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK28pbi50cmFpbmluZ0luZm9bb109Yy5vbm54LlRyYWluaW5nSW5mb1Byb3RvLnRvT2JqZWN0KGUudHJhaW5pbmdJbmZvW29dLHQpO2lmKGUuZnVuY3Rpb25zJiZlLmZ1bmN0aW9ucy5sZW5ndGgpZm9yKG4uZnVuY3Rpb25zPVtdLG89MDtvPGUuZnVuY3Rpb25zLmxlbmd0aDsrK28pbi5mdW5jdGlvbnNbb109Yy5vbm54LkZ1bmN0aW9uUHJvdG8udG9PYmplY3QoZS5mdW5jdGlvbnNbb10sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguTW9kZWxQcm90byJ9LGV9KCksaS5TdHJpbmdTdHJpbmdFbnRyeVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5rZXk9IiIsZS5wcm90b3R5cGUudmFsdWU9IiIsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmtleSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwia2V5IikmJnQudWludDMyKDEwKS5zdHJpbmcoZS5rZXkpLG51bGwhPWUudmFsdWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZhbHVlIikmJnQudWludDMyKDE4KS5zdHJpbmcoZS52YWx1ZSksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5rZXk9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci52YWx1ZT1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiAib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lPyJvYmplY3QgZXhwZWN0ZWQiOm51bGwhPWUua2V5JiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmIWwuaXNTdHJpbmcoZS5rZXkpPyJrZXk6IHN0cmluZyBleHBlY3RlZCI6bnVsbCE9ZS52YWx1ZSYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSYmIWwuaXNTdHJpbmcoZS52YWx1ZSk/InZhbHVlOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvO3JldHVybiBudWxsIT1lLmtleSYmKHQua2V5PVN0cmluZyhlLmtleSkpLG51bGwhPWUudmFsdWUmJih0LnZhbHVlPVN0cmluZyhlLnZhbHVlKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4ua2V5PSIiLG4udmFsdWU9IiIpLG51bGwhPWUua2V5JiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmKG4ua2V5PWUua2V5KSxudWxsIT1lLnZhbHVlJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiYobi52YWx1ZT1lLnZhbHVlKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8ifSxlfSgpLGkuVGVuc29yQW5ub3RhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLnRlbnNvck5hbWU9IiIsZS5wcm90b3R5cGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUudGVuc29yTmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidGVuc29yTmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUudGVuc29yTmFtZSksbnVsbCE9ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzJiZlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlRlbnNvckFubm90YXRpb247ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci50ZW5zb3JOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOnIucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aHx8KHIucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXSksci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUudGVuc29yTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yTmFtZSIpJiYhbC5pc1N0cmluZyhlLnRlbnNvck5hbWUpKXJldHVybiAidGVuc29yTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMmJmUuaGFzT3duUHJvcGVydHkoInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKSlyZXR1cm4gInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGg7Kyt0KXt2YXIgbj1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3RdKTtpZihuKXJldHVybiAicXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JBbm5vdGF0aW9uKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVGVuc29yQW5ub3RhdGlvbjtpZihudWxsIT1lLnRlbnNvck5hbWUmJih0LnRlbnNvck5hbWU9U3RyaW5nKGUudGVuc29yTmFtZSkpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvckFubm90YXRpb24ucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogYXJyYXkgZXhwZWN0ZWQiKTt0LnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W107Zm9yKHZhciBuPTA7bjxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JBbm5vdGF0aW9uLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM6IG9iamVjdCBleHBlY3RlZCIpO3QucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdKSx0LmRlZmF1bHRzJiYobi50ZW5zb3JOYW1lPSIiKSxudWxsIT1lLnRlbnNvck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvck5hbWUiKSYmKG4udGVuc29yTmFtZT1lLnRlbnNvck5hbWUpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aCl7bi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdO2Zvcih2YXIgcj0wO3I8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Ipbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3JdPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnRvT2JqZWN0KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tyXSx0KTt9cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yQW5ub3RhdGlvbiJ9LGV9KCksaS5HcmFwaFByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLm5vZGU9W10sdGhpcy5pbml0aWFsaXplcj1bXSx0aGlzLnNwYXJzZUluaXRpYWxpemVyPVtdLHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy52YWx1ZUluZm89W10sdGhpcy5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5vZGU9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUuaW5pdGlhbGl6ZXI9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnNwYXJzZUluaXRpYWxpemVyPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsZS5wcm90b3R5cGUuaW5wdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm91dHB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudmFsdWVJbmZvPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5ub2RlJiZlLm5vZGUubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5ub2RlLmxlbmd0aDsrK24pYy5vbm54Lk5vZGVQcm90by5lbmNvZGUoZS5ub2RlW25dLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5pbml0aWFsaXplciYmZS5pbml0aWFsaXplci5sZW5ndGgpZm9yKG49MDtuPGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrbiljLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUuaW5pdGlhbGl6ZXJbbl0sdC51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig4Mikuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3Iobj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKWMub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS5pbnB1dFtuXSx0LnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKWMub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS5vdXRwdXRbbl0sdC51aW50MzIoOTgpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS52YWx1ZUluZm8mJmUudmFsdWVJbmZvLmxlbmd0aClmb3Iobj0wO248ZS52YWx1ZUluZm8ubGVuZ3RoOysrbiljLm9ubnguVmFsdWVJbmZvUHJvdG8uZW5jb2RlKGUudmFsdWVJbmZvW25dLHQudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLnF1YW50aXphdGlvbkFubm90YXRpb24mJmUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGgpZm9yKG49MDtuPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytuKWMub25ueC5UZW5zb3JBbm5vdGF0aW9uLmVuY29kZShlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0sdC51aW50MzIoMTE0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUuc3BhcnNlSW5pdGlhbGl6ZXImJmUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihuPTA7bjxlLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aDsrK24pYy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmVuY29kZShlLnNwYXJzZUluaXRpYWxpemVyW25dLHQudWludDMyKDEyMikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LkdyYXBoUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5ub2RlJiZyLm5vZGUubGVuZ3RofHwoci5ub2RlPVtdKSxyLm5vZGUucHVzaChjLm9ubnguTm9kZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDI6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIuaW5pdGlhbGl6ZXImJnIuaW5pdGlhbGl6ZXIubGVuZ3RofHwoci5pbml0aWFsaXplcj1bXSksci5pbml0aWFsaXplci5wdXNoKGMub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxNTpyLnNwYXJzZUluaXRpYWxpemVyJiZyLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aHx8KHIuc3BhcnNlSW5pdGlhbGl6ZXI9W10pLHIuc3BhcnNlSW5pdGlhbGl6ZXIucHVzaChjLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTA6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDExOnIuaW5wdXQmJnIuaW5wdXQubGVuZ3RofHwoci5pbnB1dD1bXSksci5pbnB1dC5wdXNoKGMub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMjpyLm91dHB1dCYmci5vdXRwdXQubGVuZ3RofHwoci5vdXRwdXQ9W10pLHIub3V0cHV0LnB1c2goYy5vbm54LlZhbHVlSW5mb1Byb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEzOnIudmFsdWVJbmZvJiZyLnZhbHVlSW5mby5sZW5ndGh8fChyLnZhbHVlSW5mbz1bXSksci52YWx1ZUluZm8ucHVzaChjLm9ubnguVmFsdWVJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTQ6ci5xdWFudGl6YXRpb25Bbm5vdGF0aW9uJiZyLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RofHwoci5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdKSxyLnF1YW50aXphdGlvbkFubm90YXRpb24ucHVzaChjLm9ubnguVGVuc29yQW5ub3RhdGlvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5ub2RlJiZlLmhhc093blByb3BlcnR5KCJub2RlIikpe2lmKCFBcnJheS5pc0FycmF5KGUubm9kZSkpcmV0dXJuICJub2RlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLm5vZGUubGVuZ3RoOysrdClpZihuPWMub25ueC5Ob2RlUHJvdG8udmVyaWZ5KGUubm9kZVt0XSkpcmV0dXJuICJub2RlLiIrbn1pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5pbml0aWFsaXplciYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6ZXIiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbml0aWFsaXplcikpcmV0dXJuICJpbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmluaXRpYWxpemVyLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6ZXJbdF0pKXJldHVybiAiaW5pdGlhbGl6ZXIuIitufWlmKG51bGwhPWUuc3BhcnNlSW5pdGlhbGl6ZXImJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZUluaXRpYWxpemVyIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3BhcnNlSW5pdGlhbGl6ZXIpKXJldHVybiAic3BhcnNlSW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZUluaXRpYWxpemVyW3RdKSlyZXR1cm4gInNwYXJzZUluaXRpYWxpemVyLiIrbn1pZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmlucHV0JiZlLmhhc093blByb3BlcnR5KCJpbnB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSlyZXR1cm4gImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW5wdXQubGVuZ3RoOysrdClpZihuPWMub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS5pbnB1dFt0XSkpcmV0dXJuICJpbnB1dC4iK259aWYobnVsbCE9ZS5vdXRwdXQmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuICJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5vdXRwdXQubGVuZ3RoOysrdClpZihuPWMub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS5vdXRwdXRbdF0pKXJldHVybiAib3V0cHV0LiIrbn1pZihudWxsIT1lLnZhbHVlSW5mbyYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWVJbmZvIikpe2lmKCFBcnJheS5pc0FycmF5KGUudmFsdWVJbmZvKSlyZXR1cm4gInZhbHVlSW5mbzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnZhbHVlSW5mby5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLnZhbHVlSW5mb1t0XSkpcmV0dXJuICJ2YWx1ZUluZm8uIitufWlmKG51bGwhPWUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgicXVhbnRpemF0aW9uQW5ub3RhdGlvbiIpKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50aXphdGlvbkFubm90YXRpb24pKXJldHVybiAicXVhbnRpemF0aW9uQW5ub3RhdGlvbjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguVGVuc29yQW5ub3RhdGlvbi52ZXJpZnkoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3RdKSlyZXR1cm4gInF1YW50aXphdGlvbkFubm90YXRpb24uIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguR3JhcGhQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LkdyYXBoUHJvdG87aWYoZS5ub2RlKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5ub2RlOiBhcnJheSBleHBlY3RlZCIpO3Qubm9kZT1bXTtmb3IodmFyIG49MDtuPGUubm9kZS5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubm9kZVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ubm9kZTogb2JqZWN0IGV4cGVjdGVkIik7dC5ub2RlW25dPWMub25ueC5Ob2RlUHJvdG8uZnJvbU9iamVjdChlLm5vZGVbbl0pO319aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLmluaXRpYWxpemVyKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemVyKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW5pdGlhbGl6ZXI9W10sbj0wO248ZS5pbml0aWFsaXplci5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5pdGlhbGl6ZXJbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmluaXRpYWxpemVyOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemVyW25dPWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6ZXJbbl0pO319aWYoZS5zcGFyc2VJbml0aWFsaXplcil7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VJbml0aWFsaXplcikpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnNwYXJzZUluaXRpYWxpemVyOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnNwYXJzZUluaXRpYWxpemVyPVtdLG49MDtuPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZUluaXRpYWxpemVyW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5zcGFyc2VJbml0aWFsaXplcjogb2JqZWN0IGV4cGVjdGVkIik7dC5zcGFyc2VJbml0aWFsaXplcltuXT1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnNwYXJzZUluaXRpYWxpemVyW25dKTt9fWlmKG51bGwhPWUuZG9jU3RyaW5nJiYodC5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmlucHV0OiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmlucHV0PVtdLG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmlucHV0W25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbnB1dDogb2JqZWN0IGV4cGVjdGVkIik7dC5pbnB1dFtuXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLmlucHV0W25dKTt9fWlmKGUub3V0cHV0KXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vdXRwdXQ9W10sbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm91dHB1dFtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm91dHB1dFtuXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLm91dHB1dFtuXSk7fX1pZihlLnZhbHVlSW5mbyl7aWYoIUFycmF5LmlzQXJyYXkoZS52YWx1ZUluZm8pKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by52YWx1ZUluZm86IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudmFsdWVJbmZvPVtdLG49MDtuPGUudmFsdWVJbmZvLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS52YWx1ZUluZm9bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogb2JqZWN0IGV4cGVjdGVkIik7dC52YWx1ZUluZm9bbl09Yy5vbm54LlZhbHVlSW5mb1Byb3RvLmZyb21PYmplY3QoZS52YWx1ZUluZm9bbl0pO319aWYoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50aXphdGlvbkFubm90YXRpb24pKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5xdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnF1YW50aXphdGlvbkFubm90YXRpb249W10sbj0wO248ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5xdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnF1YW50aXphdGlvbkFubm90YXRpb25bbl09Yy5vbm54LlRlbnNvckFubm90YXRpb24uZnJvbU9iamVjdChlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4ubm9kZT1bXSxuLmluaXRpYWxpemVyPVtdLG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi52YWx1ZUluZm89W10sbi5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLG4uc3BhcnNlSW5pdGlhbGl6ZXI9W10pLHQuZGVmYXVsdHMmJihuLm5hbWU9IiIsbi5kb2NTdHJpbmc9IiIpLGUubm9kZSYmZS5ub2RlLmxlbmd0aCl7bi5ub2RlPVtdO2Zvcih2YXIgcj0wO3I8ZS5ub2RlLmxlbmd0aDsrK3Ipbi5ub2RlW3JdPWMub25ueC5Ob2RlUHJvdG8udG9PYmplY3QoZS5ub2RlW3JdLHQpO31pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUuaW5pdGlhbGl6ZXImJmUuaW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihuLmluaXRpYWxpemVyPVtdLHI9MDtyPGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrciluLmluaXRpYWxpemVyW3JdPWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLmluaXRpYWxpemVyW3JdLHQpO2lmKG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3Iobi5pbnB1dD1bXSxyPTA7cjxlLmlucHV0Lmxlbmd0aDsrK3Ipbi5pbnB1dFtyXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8udG9PYmplY3QoZS5pbnB1dFtyXSx0KTtpZihlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuLm91dHB1dD1bXSxyPTA7cjxlLm91dHB1dC5sZW5ndGg7KytyKW4ub3V0cHV0W3JdPWMub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLm91dHB1dFtyXSx0KTtpZihlLnZhbHVlSW5mbyYmZS52YWx1ZUluZm8ubGVuZ3RoKWZvcihuLnZhbHVlSW5mbz1bXSxyPTA7cjxlLnZhbHVlSW5mby5sZW5ndGg7KytyKW4udmFsdWVJbmZvW3JdPWMub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLnZhbHVlSW5mb1tyXSx0KTtpZihlLnF1YW50aXphdGlvbkFubm90YXRpb24mJmUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGgpZm9yKG4ucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXSxyPTA7cjxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrciluLnF1YW50aXphdGlvbkFubm90YXRpb25bcl09Yy5vbm54LlRlbnNvckFubm90YXRpb24udG9PYmplY3QoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3JdLHQpO2lmKGUuc3BhcnNlSW5pdGlhbGl6ZXImJmUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihuLnNwYXJzZUluaXRpYWxpemVyPVtdLHI9MDtyPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrciluLnNwYXJzZUluaXRpYWxpemVyW3JdPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZUluaXRpYWxpemVyW3JdLHQpO3JldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LkdyYXBoUHJvdG8ifSxlfSgpLGkuVGVuc29yUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZGltcz1bXSx0aGlzLmZsb2F0RGF0YT1bXSx0aGlzLmludDMyRGF0YT1bXSx0aGlzLnN0cmluZ0RhdGE9W10sdGhpcy5pbnQ2NERhdGE9W10sdGhpcy5leHRlcm5hbERhdGE9W10sdGhpcy5kb3VibGVEYXRhPVtdLHRoaXMudWludDY0RGF0YT1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5kaW1zPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5kYXRhVHlwZT0wLGUucHJvdG90eXBlLnNlZ21lbnQ9bnVsbCxlLnByb3RvdHlwZS5mbG9hdERhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmludDMyRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3RyaW5nRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuaW50NjREYXRhPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5uYW1lPSIiLGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5yYXdEYXRhPWwubmV3QnVmZmVyKFtdKSxlLnByb3RvdHlwZS5leHRlcm5hbERhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRhdGFMb2NhdGlvbj0wLGUucHJvdG90eXBlLmRvdWJsZURhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnVpbnQ2NERhdGE9bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRpbXMmJmUuZGltcy5sZW5ndGgpe3QudWludDMyKDEwKS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbil0LmludDY0KGUuZGltc1tuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS5kYXRhVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGF0YVR5cGUiKSYmdC51aW50MzIoMTYpLmludDMyKGUuZGF0YVR5cGUpLG51bGwhPWUuc2VnbWVudCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2VnbWVudCIpJiZjLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5lbmNvZGUoZS5zZWdtZW50LHQudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZmxvYXREYXRhJiZlLmZsb2F0RGF0YS5sZW5ndGgpe2Zvcih0LnVpbnQzMigzNCkuZm9yaygpLG49MDtuPGUuZmxvYXREYXRhLmxlbmd0aDsrK24pdC5mbG9hdChlLmZsb2F0RGF0YVtuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS5pbnQzMkRhdGEmJmUuaW50MzJEYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDQyKS5mb3JrKCksbj0wO248ZS5pbnQzMkRhdGEubGVuZ3RoOysrbil0LmludDMyKGUuaW50MzJEYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLnN0cmluZ0RhdGEmJmUuc3RyaW5nRGF0YS5sZW5ndGgpZm9yKG49MDtuPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytuKXQudWludDMyKDUwKS5ieXRlcyhlLnN0cmluZ0RhdGFbbl0pO2lmKG51bGwhPWUuaW50NjREYXRhJiZlLmludDY0RGF0YS5sZW5ndGgpe2Zvcih0LnVpbnQzMig1OCkuZm9yaygpLG49MDtuPGUuaW50NjREYXRhLmxlbmd0aDsrK24pdC5pbnQ2NChlLmludDY0RGF0YVtuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDY2KS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLnJhd0RhdGEmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInJhd0RhdGEiKSYmdC51aW50MzIoNzQpLmJ5dGVzKGUucmF3RGF0YSksbnVsbCE9ZS5kb3VibGVEYXRhJiZlLmRvdWJsZURhdGEubGVuZ3RoKXtmb3IodC51aW50MzIoODIpLmZvcmsoKSxuPTA7bjxlLmRvdWJsZURhdGEubGVuZ3RoOysrbil0LmRvdWJsZShlLmRvdWJsZURhdGFbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUudWludDY0RGF0YSYmZS51aW50NjREYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDkwKS5mb3JrKCksbj0wO248ZS51aW50NjREYXRhLmxlbmd0aDsrK24pdC51aW50NjQoZS51aW50NjREYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDk4KS5zdHJpbmcoZS5kb2NTdHJpbmcpLG51bGwhPWUuZXh0ZXJuYWxEYXRhJiZlLmV4dGVybmFsRGF0YS5sZW5ndGgpZm9yKG49MDtuPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUuZXh0ZXJuYWxEYXRhW25dLHQudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gbnVsbCE9ZS5kYXRhTG9jYXRpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRhdGFMb2NhdGlvbiIpJiZ0LnVpbnQzMigxMTIpLmludDMyKGUuZGF0YUxvY2F0aW9uKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6aWYoci5kaW1zJiZyLmRpbXMubGVuZ3RofHwoci5kaW1zPVtdKSwyPT0oNyZvKSlmb3IodmFyIGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmRpbXMucHVzaChlLmludDY0KCkpO2Vsc2Ugci5kaW1zLnB1c2goZS5pbnQ2NCgpKTticmVhaztjYXNlIDI6ci5kYXRhVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAzOnIuc2VnbWVudD1jLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDQ6aWYoci5mbG9hdERhdGEmJnIuZmxvYXREYXRhLmxlbmd0aHx8KHIuZmxvYXREYXRhPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZmxvYXREYXRhLnB1c2goZS5mbG9hdCgpKTtlbHNlIHIuZmxvYXREYXRhLnB1c2goZS5mbG9hdCgpKTticmVhaztjYXNlIDU6aWYoci5pbnQzMkRhdGEmJnIuaW50MzJEYXRhLmxlbmd0aHx8KHIuaW50MzJEYXRhPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuaW50MzJEYXRhLnB1c2goZS5pbnQzMigpKTtlbHNlIHIuaW50MzJEYXRhLnB1c2goZS5pbnQzMigpKTticmVhaztjYXNlIDY6ci5zdHJpbmdEYXRhJiZyLnN0cmluZ0RhdGEubGVuZ3RofHwoci5zdHJpbmdEYXRhPVtdKSxyLnN0cmluZ0RhdGEucHVzaChlLmJ5dGVzKCkpO2JyZWFrO2Nhc2UgNzppZihyLmludDY0RGF0YSYmci5pbnQ2NERhdGEubGVuZ3RofHwoci5pbnQ2NERhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5pbnQ2NERhdGEucHVzaChlLmludDY0KCkpO2Vsc2Ugci5pbnQ2NERhdGEucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgODpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDEyOnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA5OnIucmF3RGF0YT1lLmJ5dGVzKCk7YnJlYWs7Y2FzZSAxMzpyLmV4dGVybmFsRGF0YSYmci5leHRlcm5hbERhdGEubGVuZ3RofHwoci5leHRlcm5hbERhdGE9W10pLHIuZXh0ZXJuYWxEYXRhLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTQ6ci5kYXRhTG9jYXRpb249ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMTA6aWYoci5kb3VibGVEYXRhJiZyLmRvdWJsZURhdGEubGVuZ3RofHwoci5kb3VibGVEYXRhPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZG91YmxlRGF0YS5wdXNoKGUuZG91YmxlKCkpO2Vsc2Ugci5kb3VibGVEYXRhLnB1c2goZS5kb3VibGUoKSk7YnJlYWs7Y2FzZSAxMTppZihyLnVpbnQ2NERhdGEmJnIudWludDY0RGF0YS5sZW5ndGh8fChyLnVpbnQ2NERhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci51aW50NjREYXRhLnB1c2goZS51aW50NjQoKSk7ZWxzZSByLnVpbnQ2NERhdGEucHVzaChlLnVpbnQ2NCgpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmRpbXMmJmUuaGFzT3duUHJvcGVydHkoImRpbXMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW1zKSlyZXR1cm4gImRpbXM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuZGltcy5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS5kaW1zW3RdKXx8ZS5kaW1zW3RdJiZsLmlzSW50ZWdlcihlLmRpbXNbdF0ubG93KSYmbC5pc0ludGVnZXIoZS5kaW1zW3RdLmhpZ2gpKSlyZXR1cm4gImRpbXM6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLmRhdGFUeXBlJiZlLmhhc093blByb3BlcnR5KCJkYXRhVHlwZSIpJiYhbC5pc0ludGVnZXIoZS5kYXRhVHlwZSkpcmV0dXJuICJkYXRhVHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYobnVsbCE9ZS5zZWdtZW50JiZlLmhhc093blByb3BlcnR5KCJzZWdtZW50IikmJihuPWMub25ueC5UZW5zb3JQcm90by5TZWdtZW50LnZlcmlmeShlLnNlZ21lbnQpKSlyZXR1cm4gInNlZ21lbnQuIituO2lmKG51bGwhPWUuZmxvYXREYXRhJiZlLmhhc093blByb3BlcnR5KCJmbG9hdERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXJldHVybiAiZmxvYXREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuZmxvYXREYXRhLmxlbmd0aDsrK3QpaWYoIm51bWJlciIhPXR5cGVvZiBlLmZsb2F0RGF0YVt0XSlyZXR1cm4gImZsb2F0RGF0YTogbnVtYmVyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuaW50MzJEYXRhJiZlLmhhc093blByb3BlcnR5KCJpbnQzMkRhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnQzMkRhdGEpKXJldHVybiAiaW50MzJEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW50MzJEYXRhLmxlbmd0aDsrK3QpaWYoIWwuaXNJbnRlZ2VyKGUuaW50MzJEYXRhW3RdKSlyZXR1cm4gImludDMyRGF0YTogaW50ZWdlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLnN0cmluZ0RhdGEmJmUuaGFzT3duUHJvcGVydHkoInN0cmluZ0RhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdEYXRhKSlyZXR1cm4gInN0cmluZ0RhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK3QpaWYoIShlLnN0cmluZ0RhdGFbdF0mJiJudW1iZXIiPT10eXBlb2YgZS5zdHJpbmdEYXRhW3RdLmxlbmd0aHx8bC5pc1N0cmluZyhlLnN0cmluZ0RhdGFbdF0pKSlyZXR1cm4gInN0cmluZ0RhdGE6IGJ1ZmZlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLmludDY0RGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50NjREYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50NjREYXRhKSlyZXR1cm4gImludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmludDY0RGF0YS5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS5pbnQ2NERhdGFbdF0pfHxlLmludDY0RGF0YVt0XSYmbC5pc0ludGVnZXIoZS5pbnQ2NERhdGFbdF0ubG93KSYmbC5pc0ludGVnZXIoZS5pbnQ2NERhdGFbdF0uaGlnaCkpKXJldHVybiAiaW50NjREYXRhOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWwuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiAiZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucmF3RGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgicmF3RGF0YSIpJiYhKGUucmF3RGF0YSYmIm51bWJlciI9PXR5cGVvZiBlLnJhd0RhdGEubGVuZ3RofHxsLmlzU3RyaW5nKGUucmF3RGF0YSkpKXJldHVybiAicmF3RGF0YTogYnVmZmVyIGV4cGVjdGVkIjtpZihudWxsIT1lLmV4dGVybmFsRGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgiZXh0ZXJuYWxEYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZXh0ZXJuYWxEYXRhKSlyZXR1cm4gImV4dGVybmFsRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmV4dGVybmFsRGF0YS5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLmV4dGVybmFsRGF0YVt0XSkpcmV0dXJuICJleHRlcm5hbERhdGEuIitufX1pZihudWxsIT1lLmRhdGFMb2NhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YUxvY2F0aW9uIikpc3dpdGNoKGUuZGF0YUxvY2F0aW9uKXtkZWZhdWx0OnJldHVybiAiZGF0YUxvY2F0aW9uOiBlbnVtIHZhbHVlIGV4cGVjdGVkIjtjYXNlIDA6Y2FzZSAxOn1pZihudWxsIT1lLmRvdWJsZURhdGEmJmUuaGFzT3duUHJvcGVydHkoImRvdWJsZURhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSlyZXR1cm4gImRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK3QpaWYoIm51bWJlciIhPXR5cGVvZiBlLmRvdWJsZURhdGFbdF0pcmV0dXJuICJkb3VibGVEYXRhOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS51aW50NjREYXRhJiZlLmhhc093blByb3BlcnR5KCJ1aW50NjREYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUudWludDY0RGF0YSkpcmV0dXJuICJ1aW50NjREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudWludDY0RGF0YS5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS51aW50NjREYXRhW3RdKXx8ZS51aW50NjREYXRhW3RdJiZsLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbdF0ubG93KSYmbC5pc0ludGVnZXIoZS51aW50NjREYXRhW3RdLmhpZ2gpKSlyZXR1cm4gInVpbnQ2NERhdGE6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVGVuc29yUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JQcm90bztpZihlLmRpbXMpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5kaW1zOiBhcnJheSBleHBlY3RlZCIpO3QuZGltcz1bXTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKWwuTG9uZz8odC5kaW1zW25dPWwuTG9uZy5mcm9tVmFsdWUoZS5kaW1zW25dKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPXBhcnNlSW50KGUuZGltc1tuXSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPWUuZGltc1tuXToib2JqZWN0Ij09dHlwZW9mIGUuZGltc1tuXSYmKHQuZGltc1tuXT1uZXcgbC5Mb25nQml0cyhlLmRpbXNbbl0ubG93Pj4+MCxlLmRpbXNbbl0uaGlnaD4+PjApLnRvTnVtYmVyKCkpO31pZihudWxsIT1lLmRhdGFUeXBlJiYodC5kYXRhVHlwZT0wfGUuZGF0YVR5cGUpLG51bGwhPWUuc2VnbWVudCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNlZ21lbnQpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5zZWdtZW50OiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNlZ21lbnQ9Yy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQuZnJvbU9iamVjdChlLnNlZ21lbnQpO31pZihlLmZsb2F0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZmxvYXREYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmZsb2F0RGF0YT1bXSxuPTA7bjxlLmZsb2F0RGF0YS5sZW5ndGg7KytuKXQuZmxvYXREYXRhW25dPU51bWJlcihlLmZsb2F0RGF0YVtuXSk7fWlmKGUuaW50MzJEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQzMkRhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW50MzJEYXRhPVtdLG49MDtuPGUuaW50MzJEYXRhLmxlbmd0aDsrK24pdC5pbnQzMkRhdGFbbl09MHxlLmludDMyRGF0YVtuXTt9aWYoZS5zdHJpbmdEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ0RhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uc3RyaW5nRGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5zdHJpbmdEYXRhPVtdLG49MDtuPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytuKSJzdHJpbmciPT10eXBlb2YgZS5zdHJpbmdEYXRhW25dP2wuYmFzZTY0LmRlY29kZShlLnN0cmluZ0RhdGFbbl0sdC5zdHJpbmdEYXRhW25dPWwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnN0cmluZ0RhdGFbbl0pKSwwKTplLnN0cmluZ0RhdGFbbl0ubGVuZ3RoPj0wJiYodC5zdHJpbmdEYXRhW25dPWUuc3RyaW5nRGF0YVtuXSk7fWlmKGUuaW50NjREYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDY0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW50NjREYXRhPVtdLG49MDtuPGUuaW50NjREYXRhLmxlbmd0aDsrK24pbC5Mb25nPyh0LmludDY0RGF0YVtuXT1sLkxvbmcuZnJvbVZhbHVlKGUuaW50NjREYXRhW25dKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmludDY0RGF0YVtuXT90LmludDY0RGF0YVtuXT1wYXJzZUludChlLmludDY0RGF0YVtuXSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmludDY0RGF0YVtuXT90LmludDY0RGF0YVtuXT1lLmludDY0RGF0YVtuXToib2JqZWN0Ij09dHlwZW9mIGUuaW50NjREYXRhW25dJiYodC5pbnQ2NERhdGFbbl09bmV3IGwuTG9uZ0JpdHMoZS5pbnQ2NERhdGFbbl0ubG93Pj4+MCxlLmludDY0RGF0YVtuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSk7fWlmKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxudWxsIT1lLnJhd0RhdGEmJigic3RyaW5nIj09dHlwZW9mIGUucmF3RGF0YT9sLmJhc2U2NC5kZWNvZGUoZS5yYXdEYXRhLHQucmF3RGF0YT1sLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5yYXdEYXRhKSksMCk6ZS5yYXdEYXRhLmxlbmd0aD49MCYmKHQucmF3RGF0YT1lLnJhd0RhdGEpKSxlLmV4dGVybmFsRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5leHRlcm5hbERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmV4dGVybmFsRGF0YT1bXSxuPTA7bjxlLmV4dGVybmFsRGF0YS5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZXh0ZXJuYWxEYXRhW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmV4dGVybmFsRGF0YVtuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUuZXh0ZXJuYWxEYXRhW25dKTt9fXN3aXRjaChlLmRhdGFMb2NhdGlvbil7ZGVmYXVsdDppZigibnVtYmVyIj09dHlwZW9mIGUuZGF0YUxvY2F0aW9uKXt0LmRhdGFMb2NhdGlvbj1lLmRhdGFMb2NhdGlvbjticmVha31icmVhaztjYXNlIkRFRkFVTFQiOmNhc2UgMDp0LmRhdGFMb2NhdGlvbj0wO2JyZWFrO2Nhc2UiRVhURVJOQUwiOmNhc2UgMTp0LmRhdGFMb2NhdGlvbj0xO31pZihlLmRvdWJsZURhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuZG91YmxlRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5kb3VibGVEYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmRvdWJsZURhdGE9W10sbj0wO248ZS5kb3VibGVEYXRhLmxlbmd0aDsrK24pdC5kb3VibGVEYXRhW25dPU51bWJlcihlLmRvdWJsZURhdGFbbl0pO31pZihlLnVpbnQ2NERhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUudWludDY0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by51aW50NjREYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnVpbnQ2NERhdGE9W10sbj0wO248ZS51aW50NjREYXRhLmxlbmd0aDsrK24pbC5Mb25nPyh0LnVpbnQ2NERhdGFbbl09bC5Mb25nLmZyb21WYWx1ZShlLnVpbnQ2NERhdGFbbl0pKS51bnNpZ25lZD0hMDoic3RyaW5nIj09dHlwZW9mIGUudWludDY0RGF0YVtuXT90LnVpbnQ2NERhdGFbbl09cGFyc2VJbnQoZS51aW50NjREYXRhW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUudWludDY0RGF0YVtuXT90LnVpbnQ2NERhdGFbbl09ZS51aW50NjREYXRhW25dOiJvYmplY3QiPT10eXBlb2YgZS51aW50NjREYXRhW25dJiYodC51aW50NjREYXRhW25dPW5ldyBsLkxvbmdCaXRzKGUudWludDY0RGF0YVtuXS5sb3c+Pj4wLGUudWludDY0RGF0YVtuXS5oaWdoPj4+MCkudG9OdW1iZXIoITApKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uZGltcz1bXSxuLmZsb2F0RGF0YT1bXSxuLmludDMyRGF0YT1bXSxuLnN0cmluZ0RhdGE9W10sbi5pbnQ2NERhdGE9W10sbi5kb3VibGVEYXRhPVtdLG4udWludDY0RGF0YT1bXSxuLmV4dGVybmFsRGF0YT1bXSksdC5kZWZhdWx0cyYmKG4uZGF0YVR5cGU9MCxuLnNlZ21lbnQ9bnVsbCxuLm5hbWU9IiIsdC5ieXRlcz09PVN0cmluZz9uLnJhd0RhdGE9IiI6KG4ucmF3RGF0YT1bXSx0LmJ5dGVzIT09QXJyYXkmJihuLnJhd0RhdGE9bC5uZXdCdWZmZXIobi5yYXdEYXRhKSkpLG4uZG9jU3RyaW5nPSIiLG4uZGF0YUxvY2F0aW9uPXQuZW51bXM9PT1TdHJpbmc/IkRFRkFVTFQiOjApLGUuZGltcyYmZS5kaW1zLmxlbmd0aCl7bi5kaW1zPVtdO2Zvcih2YXIgcj0wO3I8ZS5kaW1zLmxlbmd0aDsrK3IpIm51bWJlciI9PXR5cGVvZiBlLmRpbXNbcl0/bi5kaW1zW3JdPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuZGltc1tyXSk6ZS5kaW1zW3JdOm4uZGltc1tyXT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmRpbXNbcl0pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5kaW1zW3JdLmxvdz4+PjAsZS5kaW1zW3JdLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuZGltc1tyXTt9aWYobnVsbCE9ZS5kYXRhVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YVR5cGUiKSYmKG4uZGF0YVR5cGU9ZS5kYXRhVHlwZSksbnVsbCE9ZS5zZWdtZW50JiZlLmhhc093blByb3BlcnR5KCJzZWdtZW50IikmJihuLnNlZ21lbnQ9Yy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQudG9PYmplY3QoZS5zZWdtZW50LHQpKSxlLmZsb2F0RGF0YSYmZS5mbG9hdERhdGEubGVuZ3RoKWZvcihuLmZsb2F0RGF0YT1bXSxyPTA7cjxlLmZsb2F0RGF0YS5sZW5ndGg7KytyKW4uZmxvYXREYXRhW3JdPXQuanNvbiYmIWlzRmluaXRlKGUuZmxvYXREYXRhW3JdKT9TdHJpbmcoZS5mbG9hdERhdGFbcl0pOmUuZmxvYXREYXRhW3JdO2lmKGUuaW50MzJEYXRhJiZlLmludDMyRGF0YS5sZW5ndGgpZm9yKG4uaW50MzJEYXRhPVtdLHI9MDtyPGUuaW50MzJEYXRhLmxlbmd0aDsrK3Ipbi5pbnQzMkRhdGFbcl09ZS5pbnQzMkRhdGFbcl07aWYoZS5zdHJpbmdEYXRhJiZlLnN0cmluZ0RhdGEubGVuZ3RoKWZvcihuLnN0cmluZ0RhdGE9W10scj0wO3I8ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK3Ipbi5zdHJpbmdEYXRhW3JdPXQuYnl0ZXM9PT1TdHJpbmc/bC5iYXNlNjQuZW5jb2RlKGUuc3RyaW5nRGF0YVtyXSwwLGUuc3RyaW5nRGF0YVtyXS5sZW5ndGgpOnQuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnN0cmluZ0RhdGFbcl0pOmUuc3RyaW5nRGF0YVtyXTtpZihlLmludDY0RGF0YSYmZS5pbnQ2NERhdGEubGVuZ3RoKWZvcihuLmludDY0RGF0YT1bXSxyPTA7cjxlLmludDY0RGF0YS5sZW5ndGg7KytyKSJudW1iZXIiPT10eXBlb2YgZS5pbnQ2NERhdGFbcl0/bi5pbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pbnQ2NERhdGFbcl0pOmUuaW50NjREYXRhW3JdOm4uaW50NjREYXRhW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaW50NjREYXRhW3JdKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuaW50NjREYXRhW3JdLmxvdz4+PjAsZS5pbnQ2NERhdGFbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pbnQ2NERhdGFbcl07aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLnJhd0RhdGEmJmUuaGFzT3duUHJvcGVydHkoInJhd0RhdGEiKSYmKG4ucmF3RGF0YT10LmJ5dGVzPT09U3RyaW5nP2wuYmFzZTY0LmVuY29kZShlLnJhd0RhdGEsMCxlLnJhd0RhdGEubGVuZ3RoKTp0LmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5yYXdEYXRhKTplLnJhd0RhdGEpLGUuZG91YmxlRGF0YSYmZS5kb3VibGVEYXRhLmxlbmd0aClmb3Iobi5kb3VibGVEYXRhPVtdLHI9MDtyPGUuZG91YmxlRGF0YS5sZW5ndGg7KytyKW4uZG91YmxlRGF0YVtyXT10Lmpzb24mJiFpc0Zpbml0ZShlLmRvdWJsZURhdGFbcl0pP1N0cmluZyhlLmRvdWJsZURhdGFbcl0pOmUuZG91YmxlRGF0YVtyXTtpZihlLnVpbnQ2NERhdGEmJmUudWludDY0RGF0YS5sZW5ndGgpZm9yKG4udWludDY0RGF0YT1bXSxyPTA7cjxlLnVpbnQ2NERhdGEubGVuZ3RoOysrcikibnVtYmVyIj09dHlwZW9mIGUudWludDY0RGF0YVtyXT9uLnVpbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS51aW50NjREYXRhW3JdKTplLnVpbnQ2NERhdGFbcl06bi51aW50NjREYXRhW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudWludDY0RGF0YVtyXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLnVpbnQ2NERhdGFbcl0ubG93Pj4+MCxlLnVpbnQ2NERhdGFbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCEwKTplLnVpbnQ2NERhdGFbcl07aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUuZXh0ZXJuYWxEYXRhJiZlLmV4dGVybmFsRGF0YS5sZW5ndGgpZm9yKG4uZXh0ZXJuYWxEYXRhPVtdLHI9MDtyPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK3Ipbi5leHRlcm5hbERhdGFbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5leHRlcm5hbERhdGFbcl0sdCk7cmV0dXJuIG51bGwhPWUuZGF0YUxvY2F0aW9uJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSYmKG4uZGF0YUxvY2F0aW9uPXQuZW51bXM9PT1TdHJpbmc/dm9pZCAwPT09Yy5vbm54LlRlbnNvclByb3RvLkRhdGFMb2NhdGlvbltlLmRhdGFMb2NhdGlvbl0/ZS5kYXRhTG9jYXRpb246Yy5vbm54LlRlbnNvclByb3RvLkRhdGFMb2NhdGlvbltlLmRhdGFMb2NhdGlvbl06ZS5kYXRhTG9jYXRpb24pLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yUHJvdG8ifSxlLkRhdGFUeXBlPWZ1bmN0aW9uKCl7dmFyIGU9e30sdD1PYmplY3QuY3JlYXRlKGUpO3JldHVybiB0W2VbMF09IlVOREVGSU5FRCJdPTAsdFtlWzFdPSJGTE9BVCJdPTEsdFtlWzJdPSJVSU5UOCJdPTIsdFtlWzNdPSJJTlQ4Il09Myx0W2VbNF09IlVJTlQxNiJdPTQsdFtlWzVdPSJJTlQxNiJdPTUsdFtlWzZdPSJJTlQzMiJdPTYsdFtlWzddPSJJTlQ2NCJdPTcsdFtlWzhdPSJTVFJJTkciXT04LHRbZVs5XT0iQk9PTCJdPTksdFtlWzEwXT0iRkxPQVQxNiJdPTEwLHRbZVsxMV09IkRPVUJMRSJdPTExLHRbZVsxMl09IlVJTlQzMiJdPTEyLHRbZVsxM109IlVJTlQ2NCJdPTEzLHRbZVsxNF09IkNPTVBMRVg2NCJdPTE0LHRbZVsxNV09IkNPTVBMRVgxMjgiXT0xNSx0W2VbMTZdPSJCRkxPQVQxNiJdPTE2LHRbZVsxN109IkZMT0FUOEU0TTNGTiJdPTE3LHRbZVsxOF09IkZMT0FUOEU0TTNGTlVaIl09MTgsdFtlWzE5XT0iRkxPQVQ4RTVNMiJdPTE5LHRbZVsyMF09IkZMT0FUOEU1TTJGTlVaIl09MjAsdH0oKSxlLlNlZ21lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmJlZ2luPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLmVuZD1sLkxvbmc/bC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuYmVnaW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImJlZ2luIikmJnQudWludDMyKDgpLmludDY0KGUuYmVnaW4pLG51bGwhPWUuZW5kJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJlbmQiKSYmdC51aW50MzIoMTYpLmludDY0KGUuZW5kKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudDtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmJlZ2luPWUuaW50NjQoKTticmVhaztjYXNlIDI6ci5lbmQ9ZS5pbnQ2NCgpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiAib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lPyJvYmplY3QgZXhwZWN0ZWQiOm51bGwhPWUuYmVnaW4mJmUuaGFzT3duUHJvcGVydHkoImJlZ2luIikmJiEobC5pc0ludGVnZXIoZS5iZWdpbil8fGUuYmVnaW4mJmwuaXNJbnRlZ2VyKGUuYmVnaW4ubG93KSYmbC5pc0ludGVnZXIoZS5iZWdpbi5oaWdoKSk/ImJlZ2luOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGwhPWUuZW5kJiZlLmhhc093blByb3BlcnR5KCJlbmQiKSYmIShsLmlzSW50ZWdlcihlLmVuZCl8fGUuZW5kJiZsLmlzSW50ZWdlcihlLmVuZC5sb3cpJiZsLmlzSW50ZWdlcihlLmVuZC5oaWdoKSk/ImVuZDogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JQcm90by5TZWdtZW50KXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudDtyZXR1cm4gbnVsbCE9ZS5iZWdpbiYmKGwuTG9uZz8odC5iZWdpbj1sLkxvbmcuZnJvbVZhbHVlKGUuYmVnaW4pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuYmVnaW4/dC5iZWdpbj1wYXJzZUludChlLmJlZ2luLDEwKToibnVtYmVyIj09dHlwZW9mIGUuYmVnaW4/dC5iZWdpbj1lLmJlZ2luOiJvYmplY3QiPT10eXBlb2YgZS5iZWdpbiYmKHQuYmVnaW49bmV3IGwuTG9uZ0JpdHMoZS5iZWdpbi5sb3c+Pj4wLGUuYmVnaW4uaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxudWxsIT1lLmVuZCYmKGwuTG9uZz8odC5lbmQ9bC5Mb25nLmZyb21WYWx1ZShlLmVuZCkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5lbmQ/dC5lbmQ9cGFyc2VJbnQoZS5lbmQsMTApOiJudW1iZXIiPT10eXBlb2YgZS5lbmQ/dC5lbmQ9ZS5lbmQ6Im9iamVjdCI9PXR5cGVvZiBlLmVuZCYmKHQuZW5kPW5ldyBsLkxvbmdCaXRzKGUuZW5kLmxvdz4+PjAsZS5lbmQuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKHQuZGVmYXVsdHMpe2lmKGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24uYmVnaW49dC5sb25ncz09PVN0cmluZz9yLnRvU3RyaW5nKCk6dC5sb25ncz09PU51bWJlcj9yLnRvTnVtYmVyKCk6cjt9ZWxzZSBuLmJlZ2luPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7bC5Mb25nPyhyPW5ldyBsLkxvbmcoMCwwLCExKSxuLmVuZD10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyKTpuLmVuZD10LmxvbmdzPT09U3RyaW5nPyIwIjowO31yZXR1cm4gbnVsbCE9ZS5iZWdpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiYmVnaW4iKSYmKCJudW1iZXIiPT10eXBlb2YgZS5iZWdpbj9uLmJlZ2luPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuYmVnaW4pOmUuYmVnaW46bi5iZWdpbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmJlZ2luKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuYmVnaW4ubG93Pj4+MCxlLmJlZ2luLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuYmVnaW4pLG51bGwhPWUuZW5kJiZlLmhhc093blByb3BlcnR5KCJlbmQiKSYmKCJudW1iZXIiPT10eXBlb2YgZS5lbmQ/bi5lbmQ9dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5lbmQpOmUuZW5kOm4uZW5kPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZW5kKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuZW5kLmxvdz4+PjAsZS5lbmQuaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5lbmQpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yUHJvdG8uU2VnbWVudCJ9LGV9KCksZS5EYXRhTG9jYXRpb249ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iREVGQVVMVCJdPTAsdFtlWzFdPSJFWFRFUk5BTCJdPTEsdH0oKSxlfSgpLGkuU3BhcnNlVGVuc29yUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZGltcz1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS52YWx1ZXM9bnVsbCxlLnByb3RvdHlwZS5pbmRpY2VzPW51bGwsZS5wcm90b3R5cGUuZGltcz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUudmFsdWVzJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ2YWx1ZXMiKSYmYy5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLnZhbHVlcyx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmluZGljZXMmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImluZGljZXMiKSYmYy5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLmluZGljZXMsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXt0LnVpbnQzMigyNikuZm9yaygpO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24pdC5pbnQ2NChlLmRpbXNbbl0pO3QubGRlbGltKCk7fXJldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguU3BhcnNlVGVuc29yUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci52YWx1ZXM9Yy5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjpyLmluZGljZXM9Yy5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzppZihyLmRpbXMmJnIuZGltcy5sZW5ndGh8fChyLmRpbXM9W10pLDI9PSg3Jm8pKWZvcih2YXIgaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZGltcy5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmRpbXMucHVzaChlLmludDY0KCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO3ZhciB0O2lmKG51bGwhPWUudmFsdWVzJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZXMiKSYmKHQ9Yy5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnZhbHVlcykpKXJldHVybiAidmFsdWVzLiIrdDtpZihudWxsIT1lLmluZGljZXMmJmUuaGFzT3duUHJvcGVydHkoImluZGljZXMiKSYmKHQ9Yy5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLmluZGljZXMpKSlyZXR1cm4gImluZGljZXMuIit0O2lmKG51bGwhPWUuZGltcyYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltcyIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXJldHVybiAiZGltczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24paWYoIShsLmlzSW50ZWdlcihlLmRpbXNbbl0pfHxlLmRpbXNbbl0mJmwuaXNJbnRlZ2VyKGUuZGltc1tuXS5sb3cpJiZsLmlzSW50ZWdlcihlLmRpbXNbbl0uaGlnaCkpKXJldHVybiAiZGltczogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5TcGFyc2VUZW5zb3JQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlNwYXJzZVRlbnNvclByb3RvO2lmKG51bGwhPWUudmFsdWVzKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudmFsdWVzKXRocm93IFR5cGVFcnJvcigiLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udmFsdWVzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnZhbHVlcz1jLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnZhbHVlcyk7fWlmKG51bGwhPWUuaW5kaWNlcyl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmluZGljZXMpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by5pbmRpY2VzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluZGljZXM9Yy5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS5pbmRpY2VzKTt9aWYoZS5kaW1zKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGltczogYXJyYXkgZXhwZWN0ZWQiKTt0LmRpbXM9W107Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilsLkxvbmc/KHQuZGltc1tuXT1sLkxvbmcuZnJvbVZhbHVlKGUuZGltc1tuXSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5kaW1zW25dP3QuZGltc1tuXT1wYXJzZUludChlLmRpbXNbbl0sMTApOiJudW1iZXIiPT10eXBlb2YgZS5kaW1zW25dP3QuZGltc1tuXT1lLmRpbXNbbl06Im9iamVjdCI9PXR5cGVvZiBlLmRpbXNbbl0mJih0LmRpbXNbbl09bmV3IGwuTG9uZ0JpdHMoZS5kaW1zW25dLmxvdz4+PjAsZS5kaW1zW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uZGltcz1bXSksdC5kZWZhdWx0cyYmKG4udmFsdWVzPW51bGwsbi5pbmRpY2VzPW51bGwpLG51bGwhPWUudmFsdWVzJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZXMiKSYmKG4udmFsdWVzPWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLnZhbHVlcyx0KSksbnVsbCE9ZS5pbmRpY2VzJiZlLmhhc093blByb3BlcnR5KCJpbmRpY2VzIikmJihuLmluZGljZXM9Yy5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUuaW5kaWNlcyx0KSksZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXtuLmRpbXM9W107Zm9yKHZhciByPTA7cjxlLmRpbXMubGVuZ3RoOysrcikibnVtYmVyIj09dHlwZW9mIGUuZGltc1tyXT9uLmRpbXNbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1zW3JdKTplLmRpbXNbcl06bi5kaW1zW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltc1tyXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmRpbXNbcl0ubG93Pj4+MCxlLmRpbXNbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1zW3JdO31yZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5TcGFyc2VUZW5zb3JQcm90byJ9LGV9KCksaS5UZW5zb3JTaGFwZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmRpbT1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5kaW09bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRpbSYmZS5kaW0ubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5kaW0ubGVuZ3RoOysrbiljLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24uZW5jb2RlKGUuZGltW25dLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yU2hhcGVQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtvPj4+Mz09MT8oci5kaW0mJnIuZGltLmxlbmd0aHx8KHIuZGltPVtdKSxyLmRpbS5wdXNoKGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSkpOmUuc2tpcFR5cGUoNyZvKTt9cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZGltJiZlLmhhc093blByb3BlcnR5KCJkaW0iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW0pKXJldHVybiAiZGltOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLmRpbS5sZW5ndGg7Kyt0KXt2YXIgbj1jLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24udmVyaWZ5KGUuZGltW3RdKTtpZihuKXJldHVybiAiZGltLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlRlbnNvclNoYXBlUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvO2lmKGUuZGltKXtpZighQXJyYXkuaXNBcnJheShlLmRpbSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JTaGFwZVByb3RvLmRpbTogYXJyYXkgZXhwZWN0ZWQiKTt0LmRpbT1bXTtmb3IodmFyIG49MDtuPGUuZGltLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5kaW1bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JTaGFwZVByb3RvLmRpbTogb2JqZWN0IGV4cGVjdGVkIik7dC5kaW1bbl09Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLmZyb21PYmplY3QoZS5kaW1bbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uZGltPVtdKSxlLmRpbSYmZS5kaW0ubGVuZ3RoKXtuLmRpbT1bXTtmb3IodmFyIHI9MDtyPGUuZGltLmxlbmd0aDsrK3Ipbi5kaW1bcl09Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLnRvT2JqZWN0KGUuZGltW3JdLHQpO31yZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JTaGFwZVByb3RvIn0sZS5EaW1lbnNpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9dmFyIHQ7cmV0dXJuIGUucHJvdG90eXBlLmRpbVZhbHVlPW51bGwsZS5wcm90b3R5cGUuZGltUGFyYW09bnVsbCxlLnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6bC5vbmVPZkdldHRlcih0PVsiZGltVmFsdWUiLCJkaW1QYXJhbSJdKSxzZXQ6bC5vbmVPZlNldHRlcih0KX0pLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5kaW1WYWx1ZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGltVmFsdWUiKSYmdC51aW50MzIoOCkuaW50NjQoZS5kaW1WYWx1ZSksbnVsbCE9ZS5kaW1QYXJhbSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGltUGFyYW0iKSYmdC51aW50MzIoMTgpLnN0cmluZyhlLmRpbVBhcmFtKSxudWxsIT1lLmRlbm90YXRpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlbm90YXRpb24iKSYmdC51aW50MzIoMjYpLnN0cmluZyhlLmRlbm90YXRpb24pLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbjtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmRpbVZhbHVlPWUuaW50NjQoKTticmVhaztjYXNlIDI6ci5kaW1QYXJhbT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLmRlbm90YXRpb249ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjt2YXIgdD17fTtpZihudWxsIT1lLmRpbVZhbHVlJiZlLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiYodC52YWx1ZT0xLCEobC5pc0ludGVnZXIoZS5kaW1WYWx1ZSl8fGUuZGltVmFsdWUmJmwuaXNJbnRlZ2VyKGUuZGltVmFsdWUubG93KSYmbC5pc0ludGVnZXIoZS5kaW1WYWx1ZS5oaWdoKSkpKXJldHVybiAiZGltVmFsdWU6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kaW1QYXJhbSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltUGFyYW0iKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtpZih0LnZhbHVlPTEsIWwuaXNTdHJpbmcoZS5kaW1QYXJhbSkpcmV0dXJuICJkaW1QYXJhbTogc3RyaW5nIGV4cGVjdGVkIn1yZXR1cm4gbnVsbCE9ZS5kZW5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJiFsLmlzU3RyaW5nKGUuZGVub3RhdGlvbik/ImRlbm90YXRpb246IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbjtyZXR1cm4gbnVsbCE9ZS5kaW1WYWx1ZSYmKGwuTG9uZz8odC5kaW1WYWx1ZT1sLkxvbmcuZnJvbVZhbHVlKGUuZGltVmFsdWUpKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuZGltVmFsdWU/dC5kaW1WYWx1ZT1wYXJzZUludChlLmRpbVZhbHVlLDEwKToibnVtYmVyIj09dHlwZW9mIGUuZGltVmFsdWU/dC5kaW1WYWx1ZT1lLmRpbVZhbHVlOiJvYmplY3QiPT10eXBlb2YgZS5kaW1WYWx1ZSYmKHQuZGltVmFsdWU9bmV3IGwuTG9uZ0JpdHMoZS5kaW1WYWx1ZS5sb3c+Pj4wLGUuZGltVmFsdWUuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxudWxsIT1lLmRpbVBhcmFtJiYodC5kaW1QYXJhbT1TdHJpbmcoZS5kaW1QYXJhbSkpLG51bGwhPWUuZGVub3RhdGlvbiYmKHQuZGVub3RhdGlvbj1TdHJpbmcoZS5kZW5vdGF0aW9uKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZGVub3RhdGlvbj0iIiksbnVsbCE9ZS5kaW1WYWx1ZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltVmFsdWUiKSYmKCJudW1iZXIiPT10eXBlb2YgZS5kaW1WYWx1ZT9uLmRpbVZhbHVlPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuZGltVmFsdWUpOmUuZGltVmFsdWU6bi5kaW1WYWx1ZT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmRpbVZhbHVlKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuZGltVmFsdWUubG93Pj4+MCxlLmRpbVZhbHVlLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuZGltVmFsdWUsdC5vbmVvZnMmJihuLnZhbHVlPSJkaW1WYWx1ZSIpKSxudWxsIT1lLmRpbVBhcmFtJiZlLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpJiYobi5kaW1QYXJhbT1lLmRpbVBhcmFtLHQub25lb2ZzJiYobi52YWx1ZT0iZGltUGFyYW0iKSksbnVsbCE9ZS5kZW5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJihuLmRlbm90YXRpb249ZS5kZW5vdGF0aW9uKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uIn0sZX0oKSxlfSgpLGkuVHlwZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXZhciB0O3JldHVybiBlLnByb3RvdHlwZS50ZW5zb3JUeXBlPW51bGwsZS5wcm90b3R5cGUuc2VxdWVuY2VUeXBlPW51bGwsZS5wcm90b3R5cGUubWFwVHlwZT1udWxsLGUucHJvdG90eXBlLm9wdGlvbmFsVHlwZT1udWxsLGUucHJvdG90eXBlLnNwYXJzZVRlbnNvclR5cGU9bnVsbCxlLnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6bC5vbmVPZkdldHRlcih0PVsidGVuc29yVHlwZSIsInNlcXVlbmNlVHlwZSIsIm1hcFR5cGUiLCJvcHRpb25hbFR5cGUiLCJzcGFyc2VUZW5zb3JUeXBlIl0pLHNldDpsLm9uZU9mU2V0dGVyKHQpfSksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLnRlbnNvclR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInRlbnNvclR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5UZW5zb3IuZW5jb2RlKGUudGVuc29yVHlwZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLnNlcXVlbmNlVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2VxdWVuY2VUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZW5jb2RlKGUuc2VxdWVuY2VUeXBlLHQudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUubWFwVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibWFwVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLk1hcC5lbmNvZGUoZS5tYXBUeXBlLHQudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZGVub3RhdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVub3RhdGlvbiIpJiZ0LnVpbnQzMig1MCkuc3RyaW5nKGUuZGVub3RhdGlvbiksbnVsbCE9ZS5zcGFyc2VUZW5zb3JUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzcGFyc2VUZW5zb3JUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLmVuY29kZShlLnNwYXJzZVRlbnNvclR5cGUsdC51aW50MzIoNjYpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5vcHRpb25hbFR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm9wdGlvbmFsVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmVuY29kZShlLm9wdGlvbmFsVHlwZSx0LnVpbnQzMig3NCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIudGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlRlbnNvci5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDQ6ci5zZXF1ZW5jZVR5cGU9Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDU6ci5tYXBUeXBlPWMub25ueC5UeXBlUHJvdG8uTWFwLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgOTpyLm9wdGlvbmFsVHlwZT1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgODpyLnNwYXJzZVRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA2OnIuZGVub3RhdGlvbj1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO3ZhciB0PXt9O2lmKG51bGwhPWUudGVuc29yVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpJiYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5UZW5zb3IudmVyaWZ5KGUudGVuc29yVHlwZSkpKXJldHVybiAidGVuc29yVHlwZS4iK247aWYobnVsbCE9ZS5zZXF1ZW5jZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNlcXVlbmNlVHlwZSIpKXtpZigxPT09dC52YWx1ZSlyZXR1cm4gInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO2lmKHQudmFsdWU9MSxuPWMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UudmVyaWZ5KGUuc2VxdWVuY2VUeXBlKSlyZXR1cm4gInNlcXVlbmNlVHlwZS4iK259aWYobnVsbCE9ZS5tYXBUeXBlJiZlLmhhc093blByb3BlcnR5KCJtYXBUeXBlIikpe2lmKDE9PT10LnZhbHVlKXJldHVybiAidmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5NYXAudmVyaWZ5KGUubWFwVHlwZSkpcmV0dXJuICJtYXBUeXBlLiIrbn1pZihudWxsIT1lLm9wdGlvbmFsVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgib3B0aW9uYWxUeXBlIikpe2lmKDE9PT10LnZhbHVlKXJldHVybiAidmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5PcHRpb25hbC52ZXJpZnkoZS5vcHRpb25hbFR5cGUpKXJldHVybiAib3B0aW9uYWxUeXBlLiIrbn1pZihudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvclR5cGUiKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjt2YXIgbjtpZih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci52ZXJpZnkoZS5zcGFyc2VUZW5zb3JUeXBlKSlyZXR1cm4gInNwYXJzZVRlbnNvclR5cGUuIitufXJldHVybiBudWxsIT1lLmRlbm90YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRlbm90YXRpb24iKSYmIWwuaXNTdHJpbmcoZS5kZW5vdGF0aW9uKT8iZGVub3RhdGlvbjogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG87aWYobnVsbCE9ZS50ZW5zb3JUeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudGVuc29yVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by50ZW5zb3JUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5UZW5zb3IuZnJvbU9iamVjdChlLnRlbnNvclR5cGUpO31pZihudWxsIT1lLnNlcXVlbmNlVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNlcXVlbmNlVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5zZXF1ZW5jZVR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc2VxdWVuY2VUeXBlPWMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZnJvbU9iamVjdChlLnNlcXVlbmNlVHlwZSk7fWlmKG51bGwhPWUubWFwVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm1hcFR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8ubWFwVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5tYXBUeXBlPWMub25ueC5UeXBlUHJvdG8uTWFwLmZyb21PYmplY3QoZS5tYXBUeXBlKTt9aWYobnVsbCE9ZS5vcHRpb25hbFR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5vcHRpb25hbFR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8ub3B0aW9uYWxUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm9wdGlvbmFsVHlwZT1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmZyb21PYmplY3QoZS5vcHRpb25hbFR5cGUpO31pZihudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zcGFyc2VUZW5zb3JUeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnNwYXJzZVRlbnNvclR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc3BhcnNlVGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci5mcm9tT2JqZWN0KGUuc3BhcnNlVGVuc29yVHlwZSk7fXJldHVybiBudWxsIT1lLmRlbm90YXRpb24mJih0LmRlbm90YXRpb249U3RyaW5nKGUuZGVub3RhdGlvbikpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmRlbm90YXRpb249IiIpLG51bGwhPWUudGVuc29yVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpJiYobi50ZW5zb3JUeXBlPWMub25ueC5UeXBlUHJvdG8uVGVuc29yLnRvT2JqZWN0KGUudGVuc29yVHlwZSx0KSx0Lm9uZW9mcyYmKG4udmFsdWU9InRlbnNvclR5cGUiKSksbnVsbCE9ZS5zZXF1ZW5jZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNlcXVlbmNlVHlwZSIpJiYobi5zZXF1ZW5jZVR5cGU9Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS50b09iamVjdChlLnNlcXVlbmNlVHlwZSx0KSx0Lm9uZW9mcyYmKG4udmFsdWU9InNlcXVlbmNlVHlwZSIpKSxudWxsIT1lLm1hcFR5cGUmJmUuaGFzT3duUHJvcGVydHkoIm1hcFR5cGUiKSYmKG4ubWFwVHlwZT1jLm9ubnguVHlwZVByb3RvLk1hcC50b09iamVjdChlLm1hcFR5cGUsdCksdC5vbmVvZnMmJihuLnZhbHVlPSJtYXBUeXBlIikpLG51bGwhPWUuZGVub3RhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYobi5kZW5vdGF0aW9uPWUuZGVub3RhdGlvbiksbnVsbCE9ZS5zcGFyc2VUZW5zb3JUeXBlJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3JUeXBlIikmJihuLnNwYXJzZVRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IudG9PYmplY3QoZS5zcGFyc2VUZW5zb3JUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0ic3BhcnNlVGVuc29yVHlwZSIpKSxudWxsIT1lLm9wdGlvbmFsVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgib3B0aW9uYWxUeXBlIikmJihuLm9wdGlvbmFsVHlwZT1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLnRvT2JqZWN0KGUub3B0aW9uYWxUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0ib3B0aW9uYWxUeXBlIikpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvIn0sZS5UZW5zb3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmVsZW1UeXBlPTAsZS5wcm90b3R5cGUuc2hhcGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZWxlbVR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImVsZW1UeXBlIikmJnQudWludDMyKDgpLmludDMyKGUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNoYXBlIikmJmMub25ueC5UZW5zb3JTaGFwZVByb3RvLmVuY29kZShlLnNoYXBlLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG8uVGVuc29yO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuZWxlbVR5cGU9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMjpyLnNoYXBlPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJiFsLmlzSW50ZWdlcihlLmVsZW1UeXBlKSlyZXR1cm4gImVsZW1UeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihudWxsIT1lLnNoYXBlJiZlLmhhc093blByb3BlcnR5KCJzaGFwZSIpKXt2YXIgdD1jLm9ubnguVGVuc29yU2hhcGVQcm90by52ZXJpZnkoZS5zaGFwZSk7aWYodClyZXR1cm4gInNoYXBlLiIrdH1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHlwZVByb3RvLlRlbnNvcilyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90by5UZW5zb3I7aWYobnVsbCE9ZS5lbGVtVHlwZSYmKHQuZWxlbVR5cGU9MHxlLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc2hhcGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uVGVuc29yLnNoYXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNoYXBlPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLmZyb21PYmplY3QoZS5zaGFwZSk7fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5lbGVtVHlwZT0wLG4uc2hhcGU9bnVsbCksbnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmKG4uZWxlbVR5cGU9ZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2hhcGUiKSYmKG4uc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8udG9PYmplY3QoZS5zaGFwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uVGVuc29yIn0sZX0oKSxlLlNlcXVlbmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5lbGVtVHlwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS5lbGVtVHlwZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO28+Pj4zPT0xP3IuZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTplLnNraXBUeXBlKDcmbyk7fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLmVsZW1UeXBlKTtpZih0KXJldHVybiAiZWxlbVR5cGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2U7aWYobnVsbCE9ZS5lbGVtVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmVsZW1UeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLmVsZW1UeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLmVsZW1UeXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPW51bGwpLG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihuLmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS5lbGVtVHlwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uU2VxdWVuY2UifSxlfSgpLGUuTWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5rZXlUeXBlPTAsZS5wcm90b3R5cGUudmFsdWVUeXBlPW51bGwsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmtleVR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImtleVR5cGUiKSYmdC51aW50MzIoOCkuaW50MzIoZS5rZXlUeXBlKSxudWxsIT1lLnZhbHVlVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmFsdWVUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudmFsdWVUeXBlLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG8uTWFwO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIua2V5VHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIudmFsdWVUeXBlPWMub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5rZXlUeXBlJiZlLmhhc093blByb3BlcnR5KCJrZXlUeXBlIikmJiFsLmlzSW50ZWdlcihlLmtleVR5cGUpKXJldHVybiAia2V5VHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYobnVsbCE9ZS52YWx1ZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlVHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnZhbHVlVHlwZSk7aWYodClyZXR1cm4gInZhbHVlVHlwZS4iK3R9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90by5NYXApcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uTWFwO2lmKG51bGwhPWUua2V5VHlwZSYmKHQua2V5VHlwZT0wfGUua2V5VHlwZSksbnVsbCE9ZS52YWx1ZVR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS52YWx1ZVR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uTWFwLnZhbHVlVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC52YWx1ZVR5cGU9Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUudmFsdWVUeXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmtleVR5cGU9MCxuLnZhbHVlVHlwZT1udWxsKSxudWxsIT1lLmtleVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImtleVR5cGUiKSYmKG4ua2V5VHlwZT1lLmtleVR5cGUpLG51bGwhPWUudmFsdWVUeXBlJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZVR5cGUiKSYmKG4udmFsdWVUeXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS52YWx1ZVR5cGUsdCkpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvLk1hcCJ9LGV9KCksZS5PcHRpb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZWxlbVR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImVsZW1UeXBlIikmJmMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUuZWxlbVR5cGUsdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5PcHRpb25hbDtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtvPj4+Mz09MT9yLmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk6ZS5za2lwVHlwZSg3Jm8pO31yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSl7dmFyIHQ9Yy5vbm54LlR5cGVQcm90by52ZXJpZnkoZS5lbGVtVHlwZSk7aWYodClyZXR1cm4gImVsZW1UeXBlLiIrdH1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsO2lmKG51bGwhPWUuZWxlbVR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5lbGVtVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5PcHRpb25hbC5lbGVtVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5lbGVtVHlwZT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS5lbGVtVHlwZSk7fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5lbGVtVHlwZT1udWxsKSxudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYobi5lbGVtVHlwZT1jLm9ubnguVHlwZVByb3RvLnRvT2JqZWN0KGUuZWxlbVR5cGUsdCkpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvLk9wdGlvbmFsIn0sZX0oKSxlLlNwYXJzZVRlbnNvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9MCxlLnByb3RvdHlwZS5zaGFwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmdC51aW50MzIoOCkuaW50MzIoZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2hhcGUiKSYmYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZW5jb2RlKGUuc2hhcGUsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3I7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5lbGVtVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIuc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmIWwuaXNJbnRlZ2VyKGUuZWxlbVR5cGUpKXJldHVybiAiZWxlbVR5cGU6IGludGVnZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUuc2hhcGUmJmUuaGFzT3duUHJvcGVydHkoInNoYXBlIikpe3ZhciB0PWMub25ueC5UZW5zb3JTaGFwZVByb3RvLnZlcmlmeShlLnNoYXBlKTtpZih0KXJldHVybiAic2hhcGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvcjtpZihudWxsIT1lLmVsZW1UeXBlJiYodC5lbGVtVHlwZT0wfGUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zaGFwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChlLnNoYXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPTAsbi5zaGFwZT1udWxsKSxudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYobi5lbGVtVHlwZT1lLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlJiZlLmhhc093blByb3BlcnR5KCJzaGFwZSIpJiYobi5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by50b09iamVjdChlLnNoYXBlLHQpKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IifSxlfSgpLGV9KCksaS5PcGVyYXRvclNldElkUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmRvbWFpbj0iIixlLnByb3RvdHlwZS52ZXJzaW9uPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUuZG9tYWluKSxudWxsIT1lLnZlcnNpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZlcnNpb24iKSYmdC51aW50MzIoMTYpLmludDY0KGUudmVyc2lvbiksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnZlcnNpb249ZS5pbnQ2NCgpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiAib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lPyJvYmplY3QgZXhwZWN0ZWQiOm51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pPyJkb21haW46IHN0cmluZyBleHBlY3RlZCI6bnVsbCE9ZS52ZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJ2ZXJzaW9uIikmJiEobC5pc0ludGVnZXIoZS52ZXJzaW9uKXx8ZS52ZXJzaW9uJiZsLmlzSW50ZWdlcihlLnZlcnNpb24ubG93KSYmbC5pc0ludGVnZXIoZS52ZXJzaW9uLmhpZ2gpKT8idmVyc2lvbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5PcGVyYXRvclNldElkUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5PcGVyYXRvclNldElkUHJvdG87cmV0dXJuIG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksbnVsbCE9ZS52ZXJzaW9uJiYobC5Mb25nPyh0LnZlcnNpb249bC5Mb25nLmZyb21WYWx1ZShlLnZlcnNpb24pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUudmVyc2lvbj90LnZlcnNpb249cGFyc2VJbnQoZS52ZXJzaW9uLDEwKToibnVtYmVyIj09dHlwZW9mIGUudmVyc2lvbj90LnZlcnNpb249ZS52ZXJzaW9uOiJvYmplY3QiPT10eXBlb2YgZS52ZXJzaW9uJiYodC52ZXJzaW9uPW5ldyBsLkxvbmdCaXRzKGUudmVyc2lvbi5sb3c+Pj4wLGUudmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYodC5kZWZhdWx0cylpZihuLmRvbWFpbj0iIixsLkxvbmcpe3ZhciByPW5ldyBsLkxvbmcoMCwwLCExKTtuLnZlcnNpb249dC5sb25ncz09PVN0cmluZz9yLnRvU3RyaW5nKCk6dC5sb25ncz09PU51bWJlcj9yLnRvTnVtYmVyKCk6cjt9ZWxzZSBuLnZlcnNpb249dC5sb25ncz09PVN0cmluZz8iMCI6MDtyZXR1cm4gbnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYobi5kb21haW49ZS5kb21haW4pLG51bGwhPWUudmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgidmVyc2lvbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLnZlcnNpb24/bi52ZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUudmVyc2lvbik6ZS52ZXJzaW9uOm4udmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnZlcnNpb24pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS52ZXJzaW9uLmxvdz4+PjAsZS52ZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUudmVyc2lvbiksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5PcGVyYXRvclNldElkUHJvdG8ifSxlfSgpLGkuT3BlcmF0b3JTdGF0dXM9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iRVhQRVJJTUVOVEFMIl09MCx0W2VbMV09IlNUQUJMRSJdPTEsdH0oKSxpLkZ1bmN0aW9uUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy5hdHRyaWJ1dGU9W10sdGhpcy5hdHRyaWJ1dGVQcm90bz1bXSx0aGlzLm5vZGU9W10sdGhpcy5vcHNldEltcG9ydD1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5uYW1lPSIiLGUucHJvdG90eXBlLmlucHV0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5vdXRwdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmF0dHJpYnV0ZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuYXR0cmlidXRlUHJvdG89bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5vZGU9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5vcHNldEltcG9ydD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG9tYWluPSIiLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLm5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmdC51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLG51bGwhPWUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKXQudWludDMyKDM0KS5zdHJpbmcoZS5pbnB1dFtuXSk7aWYobnVsbCE9ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aClmb3Iobj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil0LnVpbnQzMig0Mikuc3RyaW5nKGUub3V0cHV0W25dKTtpZihudWxsIT1lLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuPTA7bjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytuKXQudWludDMyKDUwKS5zdHJpbmcoZS5hdHRyaWJ1dGVbbl0pO2lmKG51bGwhPWUubm9kZSYmZS5ub2RlLmxlbmd0aClmb3Iobj0wO248ZS5ub2RlLmxlbmd0aDsrK24pYy5vbm54Lk5vZGVQcm90by5lbmNvZGUoZS5ub2RlW25dLHQudWludDMyKDU4KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoNjYpLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpZm9yKG49MDtuPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrbiljLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmVuY29kZShlLm9wc2V0SW1wb3J0W25dLHQudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUuZG9tYWluJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb21haW4iKSYmdC51aW50MzIoODIpLnN0cmluZyhlLmRvbWFpbiksbnVsbCE9ZS5hdHRyaWJ1dGVQcm90byYmZS5hdHRyaWJ1dGVQcm90by5sZW5ndGgpZm9yKG49MDtuPGUuYXR0cmlidXRlUHJvdG8ubGVuZ3RoOysrbiljLm9ubnguQXR0cmlidXRlUHJvdG8uZW5jb2RlKGUuYXR0cmlidXRlUHJvdG9bbl0sdC51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5GdW5jdGlvblByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDpyLmlucHV0JiZyLmlucHV0Lmxlbmd0aHx8KHIuaW5wdXQ9W10pLHIuaW5wdXQucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDU6ci5vdXRwdXQmJnIub3V0cHV0Lmxlbmd0aHx8KHIub3V0cHV0PVtdKSxyLm91dHB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgNjpyLmF0dHJpYnV0ZSYmci5hdHRyaWJ1dGUubGVuZ3RofHwoci5hdHRyaWJ1dGU9W10pLHIuYXR0cmlidXRlLnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAxMTpyLmF0dHJpYnV0ZVByb3RvJiZyLmF0dHJpYnV0ZVByb3RvLmxlbmd0aHx8KHIuYXR0cmlidXRlUHJvdG89W10pLHIuYXR0cmlidXRlUHJvdG8ucHVzaChjLm9ubnguQXR0cmlidXRlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNzpyLm5vZGUmJnIubm9kZS5sZW5ndGh8fChyLm5vZGU9W10pLHIubm9kZS5wdXNoKGMub25ueC5Ob2RlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgODpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2Nhc2UgOTpyLm9wc2V0SW1wb3J0JiZyLm9wc2V0SW1wb3J0Lmxlbmd0aHx8KHIub3BzZXRJbXBvcnQ9W10pLHIub3BzZXRJbXBvcnQucHVzaChjLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEwOnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaW5wdXQmJmUuaGFzT3duUHJvcGVydHkoImlucHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXJldHVybiAiaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuaW5wdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLmlucHV0W3RdKSlyZXR1cm4gImlucHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5vdXRwdXQmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuICJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5vdXRwdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLm91dHB1dFt0XSkpcmV0dXJuICJvdXRwdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLmF0dHJpYnV0ZSYmZS5oYXNPd25Qcm9wZXJ0eSgiYXR0cmlidXRlIikpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlKSlyZXR1cm4gImF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmF0dHJpYnV0ZS5sZW5ndGg7Kyt0KWlmKCFsLmlzU3RyaW5nKGUuYXR0cmlidXRlW3RdKSlyZXR1cm4gImF0dHJpYnV0ZTogc3RyaW5nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuYXR0cmlidXRlUHJvdG8mJmUuaGFzT3duUHJvcGVydHkoImF0dHJpYnV0ZVByb3RvIikpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlUHJvdG8pKXJldHVybiAiYXR0cmlidXRlUHJvdG86IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LkF0dHJpYnV0ZVByb3RvLnZlcmlmeShlLmF0dHJpYnV0ZVByb3RvW3RdKSlyZXR1cm4gImF0dHJpYnV0ZVByb3RvLiIrbn1pZihudWxsIT1lLm5vZGUmJmUuaGFzT3duUHJvcGVydHkoIm5vZGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSlyZXR1cm4gIm5vZGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5ub2RlLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguTm9kZVByb3RvLnZlcmlmeShlLm5vZGVbdF0pKXJldHVybiAibm9kZS4iK259aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5vcHNldEltcG9ydCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BzZXRJbXBvcnQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpcmV0dXJuICJvcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK3Qpe3ZhciBuO2lmKG49Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by52ZXJpZnkoZS5vcHNldEltcG9ydFt0XSkpcmV0dXJuICJvcHNldEltcG9ydC4iK259fXJldHVybiBudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFsLmlzU3RyaW5nKGUuZG9tYWluKT8iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LkZ1bmN0aW9uUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5GdW5jdGlvblByb3RvO2lmKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmlucHV0OiBhcnJheSBleHBlY3RlZCIpO3QuaW5wdXQ9W107Zm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pdC5pbnB1dFtuXT1TdHJpbmcoZS5pbnB1dFtuXSk7fWlmKGUub3V0cHV0KXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vdXRwdXQ9W10sbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil0Lm91dHB1dFtuXT1TdHJpbmcoZS5vdXRwdXRbbl0pO31pZihlLmF0dHJpYnV0ZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5hdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuYXR0cmlidXRlPVtdLG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pdC5hdHRyaWJ1dGVbbl09U3RyaW5nKGUuYXR0cmlidXRlW25dKTt9aWYoZS5hdHRyaWJ1dGVQcm90byl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVQcm90bykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZVByb3RvOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmF0dHJpYnV0ZVByb3RvPVtdLG49MDtuPGUuYXR0cmlidXRlUHJvdG8ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmF0dHJpYnV0ZVByb3RvW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5hdHRyaWJ1dGVQcm90bzogb2JqZWN0IGV4cGVjdGVkIik7dC5hdHRyaWJ1dGVQcm90b1tuXT1jLm9ubnguQXR0cmlidXRlUHJvdG8uZnJvbU9iamVjdChlLmF0dHJpYnV0ZVByb3RvW25dKTt9fWlmKGUubm9kZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ubm9kZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5ub2RlPVtdLG49MDtuPGUubm9kZS5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubm9kZVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ubm9kZTogb2JqZWN0IGV4cGVjdGVkIik7dC5ub2RlW25dPWMub25ueC5Ob2RlUHJvdG8uZnJvbU9iamVjdChlLm5vZGVbbl0pO319aWYobnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLm9wc2V0SW1wb3J0KXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQub3BzZXRJbXBvcnQ9W10sbj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUub3BzZXRJbXBvcnRbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLm9wc2V0SW1wb3J0OiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm9wc2V0SW1wb3J0W25dPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZnJvbU9iamVjdChlLm9wc2V0SW1wb3J0W25dKTt9fXJldHVybiBudWxsIT1lLmRvbWFpbiYmKHQuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi5hdHRyaWJ1dGU9W10sbi5ub2RlPVtdLG4ub3BzZXRJbXBvcnQ9W10sbi5hdHRyaWJ1dGVQcm90bz1bXSksdC5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLmRvY1N0cmluZz0iIixuLmRvbWFpbj0iIiksbnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aCl7bi5pbnB1dD1bXTtmb3IodmFyIHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrciluLmlucHV0W3JdPWUuaW5wdXRbcl07fWlmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG4ub3V0cHV0PVtdLHI9MDtyPGUub3V0cHV0Lmxlbmd0aDsrK3Ipbi5vdXRwdXRbcl09ZS5vdXRwdXRbcl07aWYoZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aClmb3Iobi5hdHRyaWJ1dGU9W10scj0wO3I8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrciluLmF0dHJpYnV0ZVtyXT1lLmF0dHJpYnV0ZVtyXTtpZihlLm5vZGUmJmUubm9kZS5sZW5ndGgpZm9yKG4ubm9kZT1bXSxyPTA7cjxlLm5vZGUubGVuZ3RoOysrciluLm5vZGVbcl09Yy5vbm54Lk5vZGVQcm90by50b09iamVjdChlLm5vZGVbcl0sdCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUub3BzZXRJbXBvcnQmJmUub3BzZXRJbXBvcnQubGVuZ3RoKWZvcihuLm9wc2V0SW1wb3J0PVtdLHI9MDtyPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrciluLm9wc2V0SW1wb3J0W3JdPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8udG9PYmplY3QoZS5vcHNldEltcG9ydFtyXSx0KTtpZihudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksZS5hdHRyaWJ1dGVQcm90byYmZS5hdHRyaWJ1dGVQcm90by5sZW5ndGgpZm9yKG4uYXR0cmlidXRlUHJvdG89W10scj0wO3I8ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytyKW4uYXR0cmlidXRlUHJvdG9bcl09Yy5vbm54LkF0dHJpYnV0ZVByb3RvLnRvT2JqZWN0KGUuYXR0cmlidXRlUHJvdG9bcl0sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguRnVuY3Rpb25Qcm90byJ9LGV9KCksaSksZS5leHBvcnRzPWM7fSwzNDc0OihlLHQsbik9Pnt2YXIgcixvPShyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKHI9cnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7ZnVuY3Rpb24gdCgpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxqfWZ1bmN0aW9uIG8oKXtyZXR1cm4gJC5idWZmZXIhPWouYnVmZmVyJiZCKCksUn1mdW5jdGlvbiBpKCl7cmV0dXJuICQuYnVmZmVyIT1qLmJ1ZmZlciYmQigpLEx9ZnVuY3Rpb24gcygpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxDfWZ1bmN0aW9uIGEoKXtyZXR1cm4gJC5idWZmZXIhPWouYnVmZmVyJiZCKCksTX12YXIgdSxsLGM9ZTtjLnJlYWR5PW5ldyBQcm9taXNlKCgoZSx0KT0+e3U9ZSxsPXQ7fSkpO3ZhciBwLGQsZixoPU9iamVjdC5hc3NpZ24oe30sYyksZz0iLi90aGlzLnByb2dyYW0iLGI9KGUsdCk9Pnt0aHJvdyB0fSxtPSJvYmplY3QiPT10eXBlb2Ygd2luZG93LHk9ImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMsdj0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsXz1jLkVOVklST05NRU5UX0lTX1BUSFJFQUR8fCExLHc9IiI7ZnVuY3Rpb24gVChlKXtyZXR1cm4gYy5sb2NhdGVGaWxlP2MubG9jYXRlRmlsZShlLHcpOncrZX1pZih2KXt2YXIgeD1uKDEzODQpLE89big5MDgpO2xldCB0O3c9eT9PLmRpcm5hbWUodykrIi8iOl9fZGlybmFtZSsiLyIscD0oZSx0KT0+KGU9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTpPLm5vcm1hbGl6ZShlKSx4LnJlYWRGaWxlU3luYyhlLHQ/dm9pZCAwOiJ1dGY4IikpLGY9ZT0+KChlPXAoZSwhMCkpLmJ1ZmZlcnx8KGU9bmV3IFVpbnQ4QXJyYXkoZSkpLGUpLGQ9KGUsdCxuLHI9ITApPT57ZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOk8ubm9ybWFsaXplKGUpLHgucmVhZEZpbGUoZSxyP3ZvaWQgMDoidXRmOCIsKChlLG8pPT57ZT9uKGUpOnQocj9vLmJ1ZmZlcjpvKTt9KSk7fSwhYy50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYoZz1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpKSxwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksYj0oZSx0KT0+e3Rocm93IHByb2Nlc3MuZXhpdENvZGU9ZSx0fSxjLmluc3BlY3Q9KCk9PiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSI7dHJ5e3Q9big5OTI1KTt9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignVGhlICJ3b3JrZXJfdGhyZWFkcyIgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBub2RlLmpzIGJ1aWxkIC0gcGVyaGFwcyBhIG5ld2VyIHZlcnNpb24gaXMgbmVlZGVkPycpLGV9Y29tbW9uanNHbG9iYWwuV29ya2VyPXQuV29ya2VyO31lbHNlIChtfHx5KSYmKHk/dz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJih3PXIpLHc9MCE9PXcuaW5kZXhPZigiYmxvYjoiKT93LnN1YnN0cigwLHcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIix2fHwocD1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5zZW5kKG51bGwpLHQucmVzcG9uc2VUZXh0fSx5JiYoZj1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix0LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkodC5yZXNwb25zZSl9KSxkPShlLHQsbik9Pnt2YXIgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7ci5vcGVuKCJHRVQiLGUsITApLHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsci5vbmxvYWQ9KCk9PnsyMDA9PXIuc3RhdHVzfHwwPT1yLnN0YXR1cyYmci5yZXNwb25zZT90KHIucmVzcG9uc2UpOm4oKTt9LHIub25lcnJvcj1uLHIuc2VuZChudWxsKTt9KSk7diYmInVuZGVmaW5lZCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmKGNvbW1vbmpzR2xvYmFsLnBlcmZvcm1hbmNlPW4oNjk1MykucGVyZm9ybWFuY2UpO3ZhciBTPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksQT1jb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7diYmKFM9KC4uLmUpPT54LndyaXRlU3luYygxLGUuam9pbigiICIpKyJcbiIpLEE9KC4uLmUpPT54LndyaXRlU3luYygyLGUuam9pbigiICIpKyJcbiIpKTt2YXIgUCxJPWMucHJpbnR8fFMsRT1jLnByaW50RXJyfHxBO09iamVjdC5hc3NpZ24oYyxoKSxoPW51bGwsYy50aGlzUHJvZ3JhbSYmKGc9Yy50aGlzUHJvZ3JhbSksYy5xdWl0JiYoYj1jLnF1aXQpLGMud2FzbUJpbmFyeSYmKFA9Yy53YXNtQmluYXJ5KTt2YXIgRD1jLm5vRXhpdFJ1bnRpbWV8fCEwOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJm5lKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyICQsayxGLE4saixSLEwsQyxNLFU9ITE7ZnVuY3Rpb24gQigpe3ZhciBlPSQuYnVmZmVyO2MuSEVBUDg9aj1uZXcgSW50OEFycmF5KGUpLGMuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGMuSEVBUDMyPUw9bmV3IEludDMyQXJyYXkoZSksYy5IRUFQVTg9Uj1uZXcgVWludDhBcnJheShlKSxjLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGMuSEVBUFUzMj1DPW5ldyBVaW50MzJBcnJheShlKSxjLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxjLkhFQVBGNjQ9TT1uZXcgRmxvYXQ2NEFycmF5KGUpO312YXIgVj1jLklOSVRJQUxfTUVNT1JZfHwxNjc3NzIxNjtpZig1MjQyODgwPD1WfHxuZSgiSU5JVElBTF9NRU1PUlkgc2hvdWxkIGJlIGxhcmdlciB0aGFuIFNUQUNLX1NJWkUsIHdhcyAiK1YrIiEgKFNUQUNLX1NJWkU9NTI0Mjg4MCkiKSxfKSQ9Yy53YXNtTWVtb3J5O2Vsc2UgaWYoYy53YXNtTWVtb3J5KSQ9Yy53YXNtTWVtb3J5O2Vsc2UgaWYoISgoJD1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOlYvNjU1MzYsbWF4aW11bTo2NTUzNixzaGFyZWQ6ITB9KSkuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IEUoInJlcXVlc3RlZCBhIHNoYXJlZCBXZWJBc3NlbWJseS5NZW1vcnkgYnV0IHRoZSByZXR1cm5lZCBidWZmZXIgaXMgbm90IGEgU2hhcmVkQXJyYXlCdWZmZXIsIGluZGljYXRpbmcgdGhhdCB3aGlsZSB0aGUgYnJvd3NlciBoYXMgU2hhcmVkQXJyYXlCdWZmZXIgaXQgZG9lcyBub3QgaGF2ZSBXZWJBc3NlbWJseSB0aHJlYWRzIHN1cHBvcnQgLSB5b3UgbWF5IG5lZWQgdG8gc2V0IGEgZmxhZyIpLHYmJkUoIihvbiBub2RlIHlvdSBtYXkgbmVlZDogLS1leHBlcmltZW50YWwtd2FzbS10aHJlYWRzIC0tZXhwZXJpbWVudGFsLXdhc20tYnVsay1tZW1vcnkgYW5kL29yIHJlY2VudCB2ZXJzaW9uKSIpLEVycm9yKCJiYWQgbWVtb3J5Iik7QigpLFY9JC5idWZmZXIuYnl0ZUxlbmd0aDt2YXIgeixHPVtdLEg9W10sVz1bXSxxPTA7ZnVuY3Rpb24gWCgpe3JldHVybiBEfHwwPHF9dmFyIFksSyxKPTAsUT1udWxsO2Z1bmN0aW9uIGVlKCl7SisrLGMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKEopO31mdW5jdGlvbiB0ZSgpe2lmKEotLSxjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhKKSwwPT1KJiYoUSkpe3ZhciBlPVE7UT1udWxsLGUoKTt9fWZ1bmN0aW9uIG5lKGUpe3Rocm93IGMub25BYm9ydCYmYy5vbkFib3J0KGUpLEUoZT0iQWJvcnRlZCgiK2UrIikiKSxVPSEwLE49MSxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLGwoZSksZX1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9ZnVuY3Rpb24gb2UoZSl7aWYoZT09WSYmUClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoUCk7aWYoZilyZXR1cm4gZihlKTt0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWZ1bmN0aW9uIGllKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoIVAmJihtfHx5KSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGZldGNoJiYhZS5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKCh0PT57aWYoIXQub2spdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrZSsiJyI7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX0pKS5jYXRjaCgoKCk9Pm9lKGUpKSk7aWYoZClyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57ZChlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSksbik7fSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+b2UoZSkpKX0oZSkudGhlbigoZT0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSx0KSkpLnRoZW4oKGU9PmUpKS50aGVuKG4sKGU9PntFKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK2UpLG5lKGUpO30pKX1mdW5jdGlvbiBzZShlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZTt9ZnVuY3Rpb24gYWUoZSl7ZS50ZXJtaW5hdGUoKSxlLm9ubWVzc2FnZT0oKT0+e307fWZ1bmN0aW9uIHVlKGUpeyhlPWdlLkZhW2VdKXx8bmUoKSxnZS5mYihlKTt9ZnVuY3Rpb24gbGUoZSl7dmFyIHQ9Z2UuWmEoKTtpZighdClyZXR1cm4gNjtnZS5JYS5wdXNoKHQpLGdlLkZhW2UuSGFdPXQsdC5IYT1lLkhhO3ZhciBuPXtjbWQ6InJ1biIsc3RhcnRfcm91dGluZTplLmdiLGFyZzplLllhLHB0aHJlYWRfcHRyOmUuSGF9O3JldHVybiB2JiZ0LnVucmVmKCksdC5wb3N0TWVzc2FnZShuLGUubWIpLDB9cmUoWT0ib3J0LXdhc20tdGhyZWFkZWQud2FzbSIpfHwoWT1UKFkpKTt2YXIgY2U9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAscGU9KGUsdCxuKT0+e3ZhciByPSh0Pj4+PTApK247Zm9yKG49dDtlW25dJiYhKG4+PXIpOykrK247aWYoMTY8bi10JiZlLmJ1ZmZlciYmY2UpcmV0dXJuIGNlLmRlY29kZShlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP2Uuc2xpY2UodCxuKTplLnN1YmFycmF5KHQsbikpO2ZvcihyPSIiO3Q8bjspe3ZhciBvPWVbdCsrXTtpZigxMjgmbyl7dmFyIGk9NjMmZVt0KytdO2lmKDE5Mj09KDIyNCZvKSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZvKTw8NnxpKTtlbHNlIHt2YXIgcz02MyZlW3QrK107NjU1MzY+KG89MjI0PT0oMjQwJm8pPygxNSZvKTw8MTJ8aTw8NnxzOig3Jm8pPDwxOHxpPDwxMnxzPDw2fDYzJmVbdCsrXSk/cis9U3RyaW5nLmZyb21DaGFyQ29kZShvKTooby09NjU1MzYscis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxvPj4xMCw1NjMyMHwxMDIzJm8pKTt9fWVsc2Ugcis9U3RyaW5nLmZyb21DaGFyQ29kZShvKTt9cmV0dXJuIHJ9LGRlPShlLHQpPT4oZT4+Pj0wKT9wZShvKCksZSx0KToiIjtmdW5jdGlvbiBmZShlKXtpZihfKXJldHVybiBYZSgxLDEsZSk7Tj1lLFgoKXx8KGdlLmhiKCksYy5vbkV4aXQmJmMub25FeGl0KGUpLFU9ITApLGIoZSxuZXcgc2UoZSkpO312YXIgaGU9ZT0+e2lmKE49ZSxfKXRocm93IG1lKGUpLCJ1bndpbmQiO2ZlKGUpO30sZ2U9e0xhOltdLElhOltdLFRhOltdLEZhOnt9LFBhOmZ1bmN0aW9uKCl7Xz9nZS5hYigpOmdlLiRhKCk7fSwkYTpmdW5jdGlvbigpe0cudW5zaGlmdCgoKCk9PntlZSgpLGdlLmJiKCgoKT0+dGUoKSkpO30pKTt9LGFiOmZ1bmN0aW9uKCl7Z2UucmVjZWl2ZU9iamVjdFRyYW5zZmVyPWdlLmViLGdlLnRocmVhZEluaXRUTFM9Z2UuU2EsZ2Uuc2V0RXhpdFN0YXR1cz1nZS5SYSxEPSExO30sUmE6ZnVuY3Rpb24oZSl7Tj1lO30scmI6WyIkdGVybWluYXRlV29ya2VyIl0saGI6ZnVuY3Rpb24oKXtmb3IodmFyIGUgb2YgZ2UuSWEpYWUoZSk7Zm9yKGUgb2YgZ2UuTGEpYWUoZSk7Z2UuTGE9W10sZ2UuSWE9W10sZ2UuRmE9W107fSxmYjpmdW5jdGlvbihlKXt2YXIgdD1lLkhhO2RlbGV0ZSBnZS5GYVt0XSxnZS5MYS5wdXNoKGUpLGdlLklhLnNwbGljZShnZS5JYS5pbmRleE9mKGUpLDEpLGUuSGE9MCx5dCh0KTt9LGViOmZ1bmN0aW9uKCl7fSxTYTpmdW5jdGlvbigpe2dlLlRhLmZvckVhY2goKGU9PmUoKSkpO30sY2I6ZT0+bmV3IFByb21pc2UoKHQ9PntlLm9ubWVzc2FnZT1uPT57dmFyIHI9KG49bi5kYXRhKS5jbWQ7aWYobi50YXJnZXRUaHJlYWQmJm4udGFyZ2V0VGhyZWFkIT1mdCgpKXt2YXIgbz1nZS5GYVtuLnFiXTtvP28ucG9zdE1lc3NhZ2UobixuLnRyYW5zZmVyTGlzdCk6RSgnSW50ZXJuYWwgZXJyb3IhIFdvcmtlciBzZW50IGEgbWVzc2FnZSAiJytyKyciIHRvIHRhcmdldCBwdGhyZWFkICcrbi50YXJnZXRUaHJlYWQrIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhIik7fWVsc2UgImNoZWNrTWFpbGJveCI9PT1yP1VlKCk6InNwYXduVGhyZWFkIj09PXI/bGUobik6ImNsZWFudXBUaHJlYWQiPT09cj91ZShuLnRocmVhZCk6ImtpbGxUaHJlYWQiPT09cj8obj1uLnRocmVhZCxyPWdlLkZhW25dLGRlbGV0ZSBnZS5GYVtuXSxhZShyKSx5dChuKSxnZS5JYS5zcGxpY2UoZ2UuSWEuaW5kZXhPZihyKSwxKSxyLkhhPTApOiJjYW5jZWxUaHJlYWQiPT09cj9nZS5GYVtuLnRocmVhZF0ucG9zdE1lc3NhZ2Uoe2NtZDoiY2FuY2VsIn0pOiJsb2FkZWQiPT09cj8oZS5sb2FkZWQ9ITAsdChlKSk6ImFsZXJ0Ij09PXI/YWxlcnQoIlRocmVhZCAiK24udGhyZWFkSWQrIjogIituLnRleHQpOiJzZXRpbW1lZGlhdGUiPT09bi50YXJnZXQ/ZS5wb3N0TWVzc2FnZShuKToiY2FsbEhhbmRsZXIiPT09cj9jW24uaGFuZGxlcl0oLi4ubi5hcmdzKTpyJiZFKCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgIityKTt9LGUub25lcnJvcj1lPT57dGhyb3cgRSgid29ya2VyIHNlbnQgYW4gZXJyb3IhICIrZS5maWxlbmFtZSsiOiIrZS5saW5lbm8rIjogIitlLm1lc3NhZ2UpLGV9LHYmJihlLm9uKCJtZXNzYWdlIiwoZnVuY3Rpb24odCl7ZS5vbm1lc3NhZ2Uoe2RhdGE6dH0pO30pKSxlLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2Uub25lcnJvcih0KTt9KSkpO3ZhciBuLG89W107Zm9yKG4gb2YgWyJvbkV4aXQiLCJvbkFib3J0IiwicHJpbnQiLCJwcmludEVyciJdKWMuaGFzT3duUHJvcGVydHkobikmJm8ucHVzaChuKTtlLnBvc3RNZXNzYWdlKHtjbWQ6ImxvYWQiLGhhbmRsZXJzOm8sdXJsT3JCbG9iOmMubWFpblNjcmlwdFVybE9yQmxvYnx8cix3YXNtTWVtb3J5OiQsd2FzbU1vZHVsZTpGfSk7fSkpLGJiOmZ1bmN0aW9uKGUpe2UoKTt9LFhhOmZ1bmN0aW9uKCl7dmFyIGU9VCgib3J0LXdhc20tdGhyZWFkZWQud29ya2VyLmpzIik7ZT1uZXcgV29ya2VyKGUpLGdlLkxhLnB1c2goZSk7fSxaYTpmdW5jdGlvbigpe3JldHVybiAwPT1nZS5MYS5sZW5ndGgmJihnZS5YYSgpLGdlLmNiKGdlLkxhWzBdKSksZ2UuTGEucG9wKCl9fTtjLlBUaHJlYWQ9Z2U7dmFyIGJlPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShjKTt9O2Z1bmN0aW9uIG1lKGUpe2lmKF8pcmV0dXJuIFhlKDIsMCxlKTtoZShlKTt9Yy5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7dmFyIGU9ZnQoKSx0PWkoKVtlKzUyPj4yPj4+MF07ZT1pKClbZSs1Nj4+Mj4+PjBdLFR0KHQsdC1lKSxPdCh0KTt9O3ZhciB5ZT1bXTtmdW5jdGlvbiB2ZShlKXt0aGlzLk9hPWUtMjQsdGhpcy5XYT1mdW5jdGlvbihlKXtzKClbdGhpcy5PYSs0Pj4yPj4+MF09ZTt9LHRoaXMuVmE9ZnVuY3Rpb24oZSl7cygpW3RoaXMuT2ErOD4+Mj4+PjBdPWU7fSx0aGlzLlBhPWZ1bmN0aW9uKGUsdCl7dGhpcy5VYSgpLHRoaXMuV2EoZSksdGhpcy5WYSh0KTt9LHRoaXMuVWE9ZnVuY3Rpb24oKXtzKClbdGhpcy5PYSsxNj4+Mj4+PjBdPTA7fTt9ZnVuY3Rpb24gX2UoZSx0LG4scil7cmV0dXJuIF8/WGUoMywxLGUsdCxuLHIpOndlKGUsdCxuLHIpfWZ1bmN0aW9uIHdlKGUsdCxuLHIpe2lmKGU+Pj49MCx0Pj4+PTAsbj4+Pj0wLHI+Pj49MCwidW5kZWZpbmVkIj09dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBFKCJDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlISIpLDY7dmFyIG89W107cmV0dXJuIF8mJjA9PT1vLmxlbmd0aD9fZShlLHQsbixyKTooZT17Z2I6bixIYTplLFlhOnIsbWI6b30sXz8oZS5vYj0ic3Bhd25UaHJlYWQiLHBvc3RNZXNzYWdlKGUsbyksMCk6bGUoZSkpfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gXz9YZSg0LDEsZSx0LG4pOjB9ZnVuY3Rpb24geGUoZSx0KXtpZihfKXJldHVybiBYZSg1LDEsZSx0KX1jLmludm9rZUVudHJ5UG9pbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj15ZVtlXTtufHwoZT49eWUubGVuZ3RoJiYoeWUubGVuZ3RoPWUrMSkseWVbZV09bj16LmdldChlKSksZT1uKHQpLFgoKT9nZS5SYShlKTp2dChlKTt9O3ZhciBPZT1lPT57Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lLmNoYXJDb2RlQXQobik7MTI3Pj1yP3QrKzoyMDQ3Pj1yP3QrPTI6NTUyOTY8PXImJjU3MzQzPj1yPyh0Kz00LCsrbik6dCs9Mzt9cmV0dXJuIHR9LFNlPShlLHQsbixyKT0+e2lmKCEoMDxyKSlyZXR1cm4gMDt2YXIgbz1uPj4+PTA7cj1uK3ItMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO2lmKDU1Mjk2PD1zJiY1NzM0Mz49cyYmKHM9NjU1MzYrKCgxMDIzJnMpPDwxMCl8MTAyMyZlLmNoYXJDb2RlQXQoKytpKSksMTI3Pj1zKXtpZihuPj1yKWJyZWFrO3RbbisrPj4+MF09czt9ZWxzZSB7aWYoMjA0Nz49cyl7aWYobisxPj1yKWJyZWFrO3RbbisrPj4+MF09MTkyfHM+PjY7fWVsc2Uge2lmKDY1NTM1Pj1zKXtpZihuKzI+PXIpYnJlYWs7dFtuKys+Pj4wXT0yMjR8cz4+MTI7fWVsc2Uge2lmKG4rMz49cilicmVhazt0W24rKz4+PjBdPTI0MHxzPj4xOCx0W24rKz4+PjBdPTEyOHxzPj4xMiY2Mzt9dFtuKys+Pj4wXT0xMjh8cz4+NiY2Mzt9dFtuKys+Pj4wXT0xMjh8NjMmczt9fXJldHVybiB0W24+Pj4wXT0wLG4tb30sQWU9KGUsdCxuKT0+U2UoZSxvKCksdCxuKTtmdW5jdGlvbiBQZShlLHQpe2lmKF8pcmV0dXJuIFhlKDYsMSxlLHQpfWZ1bmN0aW9uIEllKGUsdCxuKXtpZihfKXJldHVybiBYZSg3LDEsZSx0LG4pfWZ1bmN0aW9uIEVlKGUsdCxuKXtyZXR1cm4gXz9YZSg4LDEsZSx0LG4pOjB9ZnVuY3Rpb24gRGUoZSx0KXtpZihfKXJldHVybiBYZSg5LDEsZSx0KX1mdW5jdGlvbiAkZShlLHQsbil7aWYoXylyZXR1cm4gWGUoMTAsMSxlLHQsbil9ZnVuY3Rpb24ga2UoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMTEsMSxlLHQsbixyKX1mdW5jdGlvbiBGZShlLHQsbixyKXtpZihfKXJldHVybiBYZSgxMiwxLGUsdCxuLHIpfWZ1bmN0aW9uIE5lKGUsdCxuLHIpe2lmKF8pcmV0dXJuIFhlKDEzLDEsZSx0LG4scil9ZnVuY3Rpb24gamUoZSl7aWYoXylyZXR1cm4gWGUoMTQsMSxlKX1mdW5jdGlvbiBSZShlLHQpe2lmKF8pcmV0dXJuIFhlKDE1LDEsZSx0KX1mdW5jdGlvbiBMZShlLHQsbil7aWYoXylyZXR1cm4gWGUoMTYsMSxlLHQsbil9dmFyIENlPWU9PntpZighVSl0cnl7aWYoZSgpLCFYKCkpdHJ5e18/dnQoTik6aGUoTik7fWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBzZXx8InVud2luZCI9PWV8fGIoMSxlKTt9fWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBzZXx8InVud2luZCI9PWV8fGIoMSxlKTt9fTtmdW5jdGlvbiBNZShlKXtlPj4+PTAsImZ1bmN0aW9uIj09dHlwZW9mIEF0b21pY3MubmImJihBdG9taWNzLm5iKGkoKSxlPj4yLGUpLnZhbHVlLnRoZW4oVWUpLGUrPTEyOCxBdG9taWNzLnN0b3JlKGkoKSxlPj4yLDEpKTt9ZnVuY3Rpb24gVWUoKXt2YXIgZT1mdCgpO2UmJihNZShlKSxDZSgoKCk9Pl90KCkpKSk7fWMuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0PU1lLGMuY2hlY2tNYWlsYm94PVVlO3ZhciBCZT1lPT4wPT1lJTQmJigwIT1lJTEwMHx8MD09ZSU0MDApLFZlPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLHplPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdO2Z1bmN0aW9uIEdlKGUsdCxuLHIsbyxpLHMsYSl7cmV0dXJuIF8/WGUoMTcsMSxlLHQsbixyLG8saSxzLGEpOi01Mn1mdW5jdGlvbiBIZShlLHQsbixyLG8saSxzKXtpZihfKXJldHVybiBYZSgxOCwxLGUsdCxuLHIsbyxpLHMpfXZhciBXZT1lPT57dmFyIHQ9T2UoZSkrMSxuPWh0KHQpO3JldHVybiBuJiZBZShlLG4sdCksbn0scWU9ZT0+e3ZhciB0PXh0KCk7cmV0dXJuIGU9ZSgpLE90KHQpLGV9O2Z1bmN0aW9uIFhlKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aC0yLHI9YXJndW1lbnRzO3JldHVybiBxZSgoKCk9Pntmb3IodmFyIG89U3QoOCpuKSxpPW8+PjMscz0wO3M8bjtzKyspe3ZhciB1PXJbMitzXTthKClbaStzPj4+MF09dTt9cmV0dXJuIG10KGUsbixvLHQpfSkpfXZhciBZZSxLZT1bXSxKZT17fSxaZT0oKT0+e2lmKCFZZSl7dmFyIGUsdD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86Z3x8Ii4vdGhpcy5wcm9ncmFtIn07Zm9yKGUgaW4gSmUpdm9pZCAwPT09SmVbZV0/ZGVsZXRlIHRbZV06dFtlXT1KZVtlXTt2YXIgbj1bXTtmb3IoZSBpbiB0KW4ucHVzaChgJHtlfT0ke3RbZV19YCk7WWU9bjt9cmV0dXJuIFllfTtmdW5jdGlvbiBRZShlLG4pe2lmKF8pcmV0dXJuIFhlKDE5LDEsZSxuKTtlPj4+PTAsbj4+Pj0wO3ZhciByPTA7cmV0dXJuIFplKCkuZm9yRWFjaCgoZnVuY3Rpb24obyxpKXt2YXIgYT1uK3I7Zm9yKGk9cygpW2UrNCppPj4yPj4+MF09YSxhPTA7YTxvLmxlbmd0aDsrK2EpdCgpWygwfGkrKyk+Pj4wXT1vLmNoYXJDb2RlQXQoYSk7dCgpWygwfGkpPj4+MF09MCxyKz1vLmxlbmd0aCsxO30pKSwwfWZ1bmN0aW9uIGV0KGUsdCl7aWYoXylyZXR1cm4gWGUoMjAsMSxlLHQpO2U+Pj49MCx0Pj4+PTA7dmFyIG49WmUoKTtzKClbZT4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cis9ZS5sZW5ndGgrMTt9KSkscygpW3Q+PjI+Pj4wXT1yLDB9ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIF8/WGUoMjEsMSxlKTo1Mn1mdW5jdGlvbiBudChlLHQsbixyKXtyZXR1cm4gXz9YZSgyMiwxLGUsdCxuLHIpOjUyfWZ1bmN0aW9uIHJ0KGUsdCxuLHIsbyl7cmV0dXJuIF8/WGUoMjMsMSxlLHQsbixyLG8pOjcwfXZhciBvdD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gaXQoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMjQsMSxlLHQsbixyKTt0Pj4+PTAsbj4+Pj0wLHI+Pj49MDtmb3IodmFyIGk9MCxhPTA7YTxuO2ErKyl7dmFyIHU9cygpW3Q+PjI+Pj4wXSxsPXMoKVt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgYz0wO2M8bDtjKyspe3ZhciBwPW8oKVt1K2M+Pj4wXSxkPW90W2VdOzA9PT1wfHwxMD09PXA/KCgxPT09ZT9JOkUpKHBlKGQsMCkpLGQubGVuZ3RoPTApOmQucHVzaChwKTt9aSs9bDt9cmV0dXJuIHMoKVtyPj4yPj4+MF09aSwwfXZhciBzdD1lPT4oc3Q9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT4oZS5zZXQoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpKSksZSk7aWYodil0cnl7dmFyIGU9big3NjApO2lmKGUucmFuZG9tRmlsbFN5bmMpcmV0dXJuIHQ9PmUucmFuZG9tRmlsbFN5bmModCk7dmFyIHQ9ZS5yYW5kb21CeXRlcztyZXR1cm4gZT0+KGUuc2V0KHQoZS5ieXRlTGVuZ3RoKSksZSl9Y2F0Y2goZSl7fW5lKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYXQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1dD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLGx0PShlLG4pPT57dCgpLnNldChlLG4+Pj4wKTt9O2Z1bmN0aW9uIGN0KGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIGEoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIHUoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gbChlKXt2YXIgdD1lLkphO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUuS2ErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KEJlKGUuZ2V0RnVsbFllYXIoKSk/YXQ6dXQpW25dO2lmKCEodD5yLWUuZ2V0RGF0ZSgpKSl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpK3QpO2JyZWFrfXQtPXItZS5nZXREYXRlKCkrMSxlLnNldERhdGUoMSksMTE+bj9lLnNldE1vbnRoKG4rMSk6KGUuc2V0TW9udGgoMCksZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrMSkpO31yZXR1cm4gbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9dShuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSksbj11KG4pLDA+PWEodCxlKT8wPj1hKG4sZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAsbj4+Pj0wLHI+Pj49MDt2YXIgYz1pKClbcis0MD4+Mj4+PjBdO2Zvcih2YXIgcCBpbiByPXtrYjppKClbcj4+Mj4+PjBdLGpiOmkoKVtyKzQ+PjI+Pj4wXSxNYTppKClbcis4Pj4yPj4+MF0sUWE6aSgpW3IrMTI+PjI+Pj4wXSxOYTppKClbcisxNj4+Mj4+PjBdLEthOmkoKVtyKzIwPj4yPj4+MF0sR2E6aSgpW3IrMjQ+PjI+Pj4wXSxKYTppKClbcisyOD4+Mj4+PjBdLHNiOmkoKVtyKzMyPj4yPj4+MF0saWI6aSgpW3IrMzY+PjI+Pj4wXSxsYjpjP2RlKGMpOiIifSxuPWRlKG4pLGM9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KW49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0pO3ZhciBkPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxmPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihwIGluIGM9eyIlYSI6ZT0+ZFtlLkdhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmRbZS5HYV0sIiViIjplPT5mW2UuTmFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+ZltlLk5hXSwiJUMiOmU9PnMoKGUuS2ErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5zKGUuUWEsMiksIiVlIjplPT5vKGUuUWEsMiwiICIpLCIlZyI6ZT0+bChlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PmwoZSksIiVIIjplPT5zKGUuTWEsMiksIiVJIjplPT4oMD09KGU9ZS5NYSk/ZT0xMjoxMjxlJiYoZS09MTIpLHMoZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAsbj0wO248PWUuTmEtMTt0Kz0oQmUoZS5LYSsxOTAwKT9hdDp1dClbbisrXSk7cmV0dXJuIHMoZS5RYSt0LDMpfSwiJW0iOmU9PnMoZS5OYSsxLDIpLCIlTSI6ZT0+cyhlLmpiLDIpLCIlbiI6KCk9PiJcbiIsIiVwIjplPT4wPD1lLk1hJiYxMj5lLk1hPyJBTSI6IlBNIiwiJVMiOmU9PnMoZS5rYiwyKSwiJXQiOigpPT4iXHQiLCIldSI6ZT0+ZS5HYXx8NywiJVUiOmU9PnMoTWF0aC5mbG9vcigoZS5KYSs3LWUuR2EpLzcpLDIpLCIlViI6ZT0+e3ZhciB0PU1hdGguZmxvb3IoKGUuSmErNy0oZS5HYSs2KSU3KS83KTtpZigyPj0oZS5HYSszNzEtZS5KYS0yKSU3JiZ0KyssdCk1Mz09dCYmKDQ9PShuPShlLkdhKzM3MS1lLkphKSU3KXx8Mz09biYmQmUoZS5LYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLkdhKzctZS5KYS0xKSU3Oyg0PT1ufHw1PT1uJiZCZShlLkthJTQwMC0xKSkmJnQrKzt9cmV0dXJuIHModCwyKX0sIiV3IjplPT5lLkdhLCIlVyI6ZT0+cyhNYXRoLmZsb29yKChlLkphKzctKGUuR2ErNiklNykvNyksMiksIiV5IjplPT4oZS5LYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUuS2ErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLmliKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUubGIsIiUlIjooKT0+IiUifSxuPW4ucmVwbGFjZSgvJSUvZywiXDBcMCIpLGMpbi5pbmNsdWRlcyhwKSYmKG49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0ocikpKTtyZXR1cm4gcD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShPZShlKSsxKTtyZXR1cm4gU2UoZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSkscC5sZW5ndGg+dD8wOihsdChwLGUpLHAubGVuZ3RoLTEpfWdlLlBhKCk7dmFyIHB0PVtudWxsLGZlLG1lLF9lLFRlLHhlLFBlLEllLEVlLERlLCRlLGtlLEZlLE5lLGplLFJlLExlLEdlLEhlLFFlLGV0LHR0LG50LHJ0LGl0XSxkdD17YjpmdW5jdGlvbihlLHQsbil7dGhyb3cgbmV3IHZlKGU+Pj49MCkuUGEodD4+PjAsbj4+PjApLGV9LE46ZnVuY3Rpb24oZSl7Z3QoZT4+PjAsIXksMSwhbSwxMzEwNzIsITEpLGdlLlNhKCk7fSxrOmZ1bmN0aW9uKGUpe2U+Pj49MCxfP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6dWUoZSk7fSxJOndlLGg6VGUsVDp4ZSxFOlBlLEc6SWUsVTpFZSxSOkRlLEo6JGUsUTprZSxvOkZlLEY6TmUsQzpqZSxTOlJlLEQ6TGUscTooKT0+ITAsQTpmdW5jdGlvbihlLHQpeyhlPj4+PTApPT10Pj4+MD9zZXRUaW1lb3V0KCgoKT0+VWUoKSkpOl8/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPWdlLkZhW2VdKSYmZS5wb3N0TWVzc2FnZSh7Y21kOiJjaGVja01haWxib3gifSk7fSxMOmZ1bmN0aW9uKCl7cmV0dXJuIC0xfSxNOk1lLHA6ZnVuY3Rpb24oZSl7diYmZ2UuRmFbZT4+PjBdLnJlZigpO30sdDpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0VVRDSG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRVVENGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsaSgpW24rMjg+PjI+Pj4wXT1lO30sdTpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldERheSgpLHQ9KEJlKGUuZ2V0RnVsbFllYXIoKSk/VmU6emUpW2UuZ2V0TW9udGgoKV0rZS5nZXREYXRlKCktMXwwLGkoKVtuKzI4Pj4yPj4+MF09dCxpKClbbiszNj4+Mj4+PjBdPS02MCplLmdldFRpbWV6b25lT2Zmc2V0KCksdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciByPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7ZT0wfCh0IT1yJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKHIsdCkpLGkoKVtuKzMyPj4yPj4+MF09ZTt9LHY6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKGkoKVtlKzIwPj4yPj4+MF0rMTkwMCxpKClbZSsxNj4+Mj4+PjBdLGkoKVtlKzEyPj4yPj4+MF0saSgpW2UrOD4+Mj4+PjBdLGkoKVtlKzQ+PjI+Pj4wXSxpKClbZT4+Mj4+PjBdLDApLG49aSgpW2UrMzI+PjI+Pj4wXSxyPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLGE9TWF0aC5taW4ocyxvKTtyZXR1cm4gMD5uP2koKVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPXMmJmE9PXIpOjA8biE9KGE9PXIpJiYobz1NYXRoLm1heChzLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/YTpvKS1yKSkpLGkoKVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxuPShCZSh0LmdldEZ1bGxZZWFyKCkpP1ZlOnplKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxpKClbZSsyOD4+Mj4+PjBdPW4saSgpW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxpKClbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksaSgpW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxpKClbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLGkoKVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLGkoKVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsd3QoKEs9ZSwxPD0rTWF0aC5hYnMoSyk/MDxLPytNYXRoLmZsb29yKEsvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoSy0rKH5+Sz4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxyOkdlLHM6SGUsejpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1lPj4+PTAsdD4+Pj0wLG4+Pj49MDt2YXIgbz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksYT1uZXcgRGF0ZShvLDAsMSksdT1uZXcgRGF0ZShvLDYsMSk7bz1hLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIGw9dS5nZXRUaW1lem9uZU9mZnNldCgpLGM9TWF0aC5tYXgobyxsKTtzKClbZT4+Mj4+PjBdPTYwKmMsaSgpW3Q+PjI+Pj4wXT1OdW1iZXIobyE9bCksZT1yKGEpLHQ9cih1KSxlPVdlKGUpLHQ9V2UodCksbDxvPyhzKClbbj4+Mj4+PjBdPWUscygpW24rND4+Mj4+PjBdPXQpOihzKClbbj4+Mj4+PjBdPXQscygpW24rND4+Mj4+PjBdPWUpO30sYzooKT0+e25lKCIiKTt9LGw6ZnVuY3Rpb24oKXt9LGk6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sVjooKT0+e3Rocm93IHErPTEsInVud2luZCJ9LEI6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sZTooKT0+cGVyZm9ybWFuY2UudGltZU9yaWdpbitwZXJmb3JtYW5jZS5ub3coKSxmOmZ1bmN0aW9uKCl7cmV0dXJuIHY/bigzOTkzKS5jcHVzKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5fSxLOmZ1bmN0aW9uKGUsdCxuLHIpe2ZvcihnZS5wYj10Pj4+MCxLZS5sZW5ndGg9bix0PXI+Pj4wPj4zLHI9MDtyPG47cisrKUtlW3JdPWEoKVt0K3I+Pj4wXTtyZXR1cm4gcHRbZV0uYXBwbHkobnVsbCxLZSl9LHk6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW8oKS5sZW5ndGg7aWYoZTw9dHx8NDI5NDkwMTc2MDxlKXJldHVybiAhMTtmb3IodmFyIG49MTs0Pj1uO24qPTIpe3ZhciByPXQqKDErLjIvbik7cj1NYXRoLm1pbihyLGUrMTAwNjYzMjk2KTt2YXIgaT1NYXRoO3I9TWF0aC5tYXgoZSxyKTtlOntpPWkubWluLmNhbGwoaSw0Mjk0OTAxNzYwLHIrKDY1NTM2LXIlNjU1MzYpJTY1NTM2KS0kLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5eyQuZ3JvdyhpKSxCKCk7dmFyIHM9MTticmVhayBlfWNhdGNoKGUpe31zPXZvaWQgMDt9aWYocylyZXR1cm4gITB9cmV0dXJuICExfSxPOlFlLFA6ZXQsajpoZSxnOnR0LG46bnQsdzpydCxtOml0LHg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHQ+Pj49MCxzdChvKCkuc3ViYXJyYXkoZT4+PjAsZSt0Pj4+MCkpLDB9LGE6JHx8Yy53YXNtTWVtb3J5LEg6Y3QsZDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gY3QoZT4+PjAsdD4+PjAsbj4+PjAscj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPWUuZXhwb3J0cyxrPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAsbj1lPT50PT5lKHQpPj4+MDtyZXR1cm4gKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5wdGhyZWFkX3NlbGY9dChlLnB0aHJlYWRfc2VsZiksZS5tYWxsb2M9bihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPW4oZS5zdGFja0FsbG9jKSxlfShlKSxnZS5UYS5wdXNoKGsuc2EpLHo9ay50YSxILnVuc2hpZnQoay5XKSxGPXQsdGUoKSxlfXZhciB0PXthOmR0fTtpZihlZSgpLGMuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gYy5pbnN0YW50aWF0ZVdhc20odCxlKX1jYXRjaChlKXtFKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpLGwoZSk7fShmdW5jdGlvbihlLHQpe3ZhciBuPVk7cmV0dXJuIFB8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8cmUobil8fG4uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHx2fHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/aWUobixlLHQpOmZldGNoKG4se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChyPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyLGUpLnRoZW4odCwoZnVuY3Rpb24ocil7cmV0dXJuIEUoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK3IpLEUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksaWUobixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UsdC5tb2R1bGUpO30pKS5jYXRjaChsKTt9KCksYy5fT3J0SW5pdD0oZSx0KT0+KGMuX09ydEluaXQ9ay5YKShlLHQpLGMuX09ydEdldExhc3RFcnJvcj0oZSx0KT0+KGMuX09ydEdldExhc3RFcnJvcj1rLlkpKGUsdCksYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9KGUsdCxuLHIsbyxpLHMsYSx1LGwpPT4oYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9ay5aKShlLHQsbixyLG8saSxzLGEsdSxsKSxjLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj0oZSx0KT0+KGMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPWsuXykoZSx0KSxjLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT1rLiQpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZT0+KGMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1rLmFhKShlKSxjLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQsbik9PihjLl9PcnRDcmVhdGVTZXNzaW9uPWsuYmEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbj1lPT4oYy5fT3J0UmVsZWFzZVNlc3Npb249ay5jYSkoZSksYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD0oZSx0LG4pPT4oYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD1rLmRhKShlLHQsbiksYy5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oYy5fT3J0R2V0SW5wdXROYW1lPWsuZWEpKGUsdCksYy5fT3J0R2V0T3V0cHV0TmFtZT0oZSx0KT0+KGMuX09ydEdldE91dHB1dE5hbWU9ay5mYSkoZSx0KSxjLl9PcnRGcmVlPWU9PihjLl9PcnRGcmVlPWsuZ2EpKGUpLGMuX09ydENyZWF0ZVRlbnNvcj0oZSx0LG4scixvKT0+KGMuX09ydENyZWF0ZVRlbnNvcj1rLmhhKShlLHQsbixyLG8pLGMuX09ydEdldFRlbnNvckRhdGE9KGUsdCxuLHIsbyk9PihjLl9PcnRHZXRUZW5zb3JEYXRhPWsuaWEpKGUsdCxuLHIsbyksYy5fT3J0UmVsZWFzZVRlbnNvcj1lPT4oYy5fT3J0UmVsZWFzZVRlbnNvcj1rLmphKShlKSxjLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQsbixyKT0+KGMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9ay5rYSkoZSx0LG4sciksYy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PWsubGEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ay5tYSkoZSksYy5fT3J0UnVuPShlLHQsbixyLG8saSxzLGEpPT4oYy5fT3J0UnVuPWsubmEpKGUsdCxuLHIsbyxpLHMsYSksYy5fT3J0RW5kUHJvZmlsaW5nPWU9PihjLl9PcnRFbmRQcm9maWxpbmc9ay5vYSkoZSk7dmFyIGZ0PWMuX3B0aHJlYWRfc2VsZj0oKT0+KGZ0PWMuX3B0aHJlYWRfc2VsZj1rLnBhKSgpLGh0PWMuX21hbGxvYz1lPT4oaHQ9Yy5fbWFsbG9jPWsucWEpKGUpO2MuX2ZyZWU9ZT0+KGMuX2ZyZWU9ay5yYSkoZSksYy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9KCk9PihjLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1rLnNhKSgpO3ZhciBndD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD0oZSx0LG4scixvLGkpPT4oZ3Q9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9ay51YSkoZSx0LG4scixvLGkpO2MuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPSgpPT4oYy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9ay52YSkoKTt2YXIgYnQsbXQ9KGUsdCxuLHIpPT4obXQ9ay53YSkoZSx0LG4scikseXQ9ZT0+KHl0PWsueGEpKGUpLHZ0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PWU9Pih2dD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1rLnlhKShlKSxfdD1jLl9fZW1zY3JpcHRlbl9jaGVja19tYWlsYm94PSgpPT4oX3Q9Yy5fX2Vtc2NyaXB0ZW5fY2hlY2tfbWFpbGJveD1rLnphKSgpLHd0PWU9Pih3dD1rLkFhKShlKSxUdD0oZSx0KT0+KFR0PWsuQmEpKGUsdCkseHQ9KCk9Pih4dD1rLkNhKSgpLE90PWU9PihPdD1rLkRhKShlKSxTdD1lPT4oU3Q9ay5FYSkoZSk7ZnVuY3Rpb24gQXQoKXtmdW5jdGlvbiBlKCl7aWYoIWJ0JiYoYnQ9ITAsYy5jYWxsZWRSdW49ITAsIVUpJiYoX3x8YmUoSCksdShjKSxjLm9uUnVudGltZUluaXRpYWxpemVkJiZjLm9uUnVudGltZUluaXRpYWxpemVkKCksIV8pKXtpZihjLnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnBvc3RSdW4mJihjLnBvc3RSdW49W2MucG9zdFJ1bl0pO2MucG9zdFJ1bi5sZW5ndGg7KXt2YXIgZT1jLnBvc3RSdW4uc2hpZnQoKTtXLnVuc2hpZnQoZSk7fWJlKFcpO319aWYoISgwPEopKWlmKF8pdShjKSxffHxiZShIKSxzdGFydFdvcmtlcihjKTtlbHNlIHtpZihjLnByZVJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGMucHJlUnVuJiYoYy5wcmVSdW49W2MucHJlUnVuXSk7Yy5wcmVSdW4ubGVuZ3RoOylHLnVuc2hpZnQoYy5wcmVSdW4uc2hpZnQoKSk7YmUoRyksMDxKfHwoYy5zZXRTdGF0dXM/KGMuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Muc2V0U3RhdHVzKCIiKTt9KSwxKSxlKCk7fSksMSkpOmUoKSk7fX1pZihjLmtlZXBSdW50aW1lQWxpdmU9WCxjLndhc21NZW1vcnk9JCxjLnN0YWNrQWxsb2M9U3QsYy5zdGFja1NhdmU9eHQsYy5zdGFja1Jlc3RvcmU9T3QsYy5VVEY4VG9TdHJpbmc9ZGUsYy5zdHJpbmdUb1VURjg9QWUsYy5sZW5ndGhCeXRlc1VURjg9T2UsYy5FeGl0U3RhdHVzPXNlLGMuUFRocmVhZD1nZSxRPWZ1bmN0aW9uIGUoKXtidHx8QXQoKSxidHx8KFE9ZSk7fSxjLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZUluaXQmJihjLnByZUluaXQ9W2MucHJlSW5pdF0pOzA8Yy5wcmVJbml0Lmxlbmd0aDspYy5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEF0KCksZS5yZWFkeX0pO2UuZXhwb3J0cz1vO30sOTMyOihlLHQsbik9Pnt2YXIgcixvPShyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKHI9cnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7dmFyIHQsbyxpPWU7aS5yZWFkeT1uZXcgUHJvbWlzZSgoKGUsbik9Pnt0PWUsbz1uO30pKTt2YXIgcyxhLHUsbD1PYmplY3QuYXNzaWduKHt9LGkpLGM9Ii4vdGhpcy5wcm9ncmFtIixwPShlLHQpPT57dGhyb3cgdH0sZD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyxmPSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLGg9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLGc9IiI7aWYoaCl7dmFyIGI9bigxMzg0KSxtPW4oOTA4KTtnPWY/bS5kaXJuYW1lKGcpKyIvIjpfX2Rpcm5hbWUrIi8iLHM9KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksYi5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSx1PWU9PigoZT1zKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxhPShlLHQsbixyPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTptLm5vcm1hbGl6ZShlKSxiLnJlYWRGaWxlKGUscj92b2lkIDA6InV0ZjgiLCgoZSxvKT0+e2U/bihlKTp0KHI/by5idWZmZXI6byk7fSkpO30sIWkudGhpc1Byb2dyYW0mJjE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGM9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHA9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0saS5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iO31lbHNlIChkfHxmKSYmKGY/Zz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihnPXIpLGc9MCE9PWcuaW5kZXhPZigiYmxvYjoiKT9nLnN1YnN0cigwLGcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIixzPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LGYmJih1PWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGE9KGUsdCxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsZSwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP3Qoci5yZXNwb25zZSk6bigpO30sci5vbmVycm9yPW4sci5zZW5kKG51bGwpO30pO3ZhciB5LHY9aS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxfPWkucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGksbCksbD1udWxsLGkudGhpc1Byb2dyYW0mJihjPWkudGhpc1Byb2dyYW0pLGkucXVpdCYmKHA9aS5xdWl0KSxpLndhc21CaW5hcnkmJih5PWkud2FzbUJpbmFyeSk7dmFyIHc9aS5ub0V4aXRSdW50aW1lfHwhMDsib2JqZWN0IiE9dHlwZW9mIFdlYkFzc2VtYmx5JiZNKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIFQseCxPLFMsQSxQLEk9ITE7ZnVuY3Rpb24gRSgpe3ZhciBlPVQuYnVmZmVyO2kuSEVBUDg9Tz1uZXcgSW50OEFycmF5KGUpLGkuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGkuSEVBUDMyPUE9bmV3IEludDMyQXJyYXkoZSksaS5IRUFQVTg9Uz1uZXcgVWludDhBcnJheShlKSxpLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGkuSEVBUFUzMj1QPW5ldyBVaW50MzJBcnJheShlKSxpLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxpLkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShlKTt9dmFyIEQ9W10sJD1bXSxrPVtdO2Z1bmN0aW9uIEYoKXt2YXIgZT1pLnByZVJ1bi5zaGlmdCgpO0QudW5zaGlmdChlKTt9dmFyIE4saixSPTAsQz1udWxsO2Z1bmN0aW9uIE0oZSl7dGhyb3cgaS5vbkFib3J0JiZpLm9uQWJvcnQoZSksXyhlPSJBYm9ydGVkKCIrZSsiKSIpLEk9ITAsZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGUrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxvKGUpLGV9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9aWYoIVUoTj0ib3J0LXdhc20ud2FzbSIpKXt2YXIgQj1OO049aS5sb2NhdGVGaWxlP2kubG9jYXRlRmlsZShCLGcpOmcrQjt9ZnVuY3Rpb24gVihlKXtpZihlPT1OJiZ5KXJldHVybiBuZXcgVWludDhBcnJheSh5KTtpZih1KXJldHVybiB1KGUpO3Rocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24geihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCF5JiYoZHx8Zikpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK2UrIiciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKCgpPT5WKGUpKSk7aWYoYSlyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57YShlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSksbik7fSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+VihlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4obiwoZT0+e18oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksTShlKTt9KSl9ZnVuY3Rpb24gRyhlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZTt9dmFyIEg9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGkpO307ZnVuY3Rpb24gVyhlKXt0aGlzLnFhPWUtMjQsdGhpcy52YT1mdW5jdGlvbihlKXtQW3RoaXMucWErND4+Mj4+PjBdPWU7fSx0aGlzLnVhPWZ1bmN0aW9uKGUpe1BbdGhpcy5xYSs4Pj4yPj4+MF09ZTt9LHRoaXMuc2E9ZnVuY3Rpb24oZSx0KXt0aGlzLnRhKCksdGhpcy52YShlKSx0aGlzLnVhKHQpO30sdGhpcy50YT1mdW5jdGlvbigpe1BbdGhpcy5xYSsxNj4+Mj4+PjBdPTA7fTt9dmFyIHEsWD0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxZPShlLHQsbik9Pnt2YXIgcj0odD4+Pj0wKStuO2ZvcihuPXQ7ZVtuXSYmIShuPj1yKTspKytuO2lmKDE2PG4tdCYmZS5idWZmZXImJlgpcmV0dXJuIFguZGVjb2RlKGUuc3ViYXJyYXkodCxuKSk7Zm9yKHI9IiI7dDxuOyl7dmFyIG89ZVt0KytdO2lmKDEyOCZvKXt2YXIgaT02MyZlW3QrK107aWYoMTkyPT0oMjI0Jm8pKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJm8pPDw2fGkpO2Vsc2Uge3ZhciBzPTYzJmVbdCsrXTs2NTUzNj4obz0yMjQ9PSgyNDAmbyk/KDE1Jm8pPDwxMnxpPDw2fHM6KDcmbyk8PDE4fGk8PDEyfHM8PDZ8NjMmZVt0KytdKT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pOihvLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fG8+PjEwLDU2MzIwfDEwMjMmbykpO319ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO31yZXR1cm4gcn0sSz0oZSx0KT0+KGU+Pj49MCk/WShTLGUsdCk6IiIsSj1lPT57Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lLmNoYXJDb2RlQXQobik7MTI3Pj1yP3QrKzoyMDQ3Pj1yP3QrPTI6NTUyOTY8PXImJjU3MzQzPj1yPyh0Kz00LCsrbik6dCs9Mzt9cmV0dXJuIHR9LFo9KGUsdCxuLHIpPT57aWYoISgwPHIpKXJldHVybiAwO3ZhciBvPW4+Pj49MDtyPW4rci0xO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYoNTUyOTY8PXMmJjU3MzQzPj1zJiYocz02NTUzNisoKDEwMjMmcyk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK2kpKSwxMjc+PXMpe2lmKG4+PXIpYnJlYWs7dFtuKys+Pj4wXT1zO31lbHNlIHtpZigyMDQ3Pj1zKXtpZihuKzE+PXIpYnJlYWs7dFtuKys+Pj4wXT0xOTJ8cz4+Njt9ZWxzZSB7aWYoNjU1MzU+PXMpe2lmKG4rMj49cilicmVhazt0W24rKz4+PjBdPTIyNHxzPj4xMjt9ZWxzZSB7aWYobiszPj1yKWJyZWFrO3RbbisrPj4+MF09MjQwfHM+PjE4LHRbbisrPj4+MF09MTI4fHM+PjEyJjYzO310W24rKz4+PjBdPTEyOHxzPj42JjYzO310W24rKz4+PjBdPTEyOHw2MyZzO319cmV0dXJuIHRbbj4+PjBdPTAsbi1vfSxRPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksZWU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0sdGU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sbmU9ZT0+e3ZhciB0PUooZSkrMSxuPXBlKHQpO3JldHVybiBuJiZaKGUsUyxuLHQpLG59LHJlPXt9LG9lPSgpPT57aWYoIXEpe3ZhciBlLHQ9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmN8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihlIGluIHJlKXZvaWQgMD09PXJlW2VdP2RlbGV0ZSB0W2VdOnRbZV09cmVbZV07dmFyIG49W107Zm9yKGUgaW4gdCluLnB1c2goYCR7ZX09JHt0W2VdfWApO3E9bjt9cmV0dXJuIHF9LGllPVtudWxsLFtdLFtdXSxzZT1lPT4oc2U9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2lmKGgpdHJ5e3ZhciBlPW4oNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe31NKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYWU9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1ZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIGxlKGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIHMoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIGEoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLm1hO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUubmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KFEoZS5nZXRGdWxsWWVhcigpKT9hZTp1ZSlbbl07aWYoISh0PnItZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09ci1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5uP2Uuc2V0TW9udGgobisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSk7fXJldHVybiBuPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSsxLDAsNCksdD1hKG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDQpKSxuPWEobiksMD49cyh0LGUpPzA+PXMobixlKT9lLmdldEZ1bGxZZWFyKCkrMTplLmdldEZ1bGxZZWFyKCk6ZS5nZXRGdWxsWWVhcigpLTF9ZT4+Pj0wLHQ+Pj49MCxuPj4+PTA7dmFyIGw9QVs0MCsocj4+Pj0wKT4+Mj4+PjBdO2Zvcih2YXIgYyBpbiByPXt5YTpBW3I+PjI+Pj4wXSx4YTpBW3IrND4+Mj4+PjBdLG9hOkFbcis4Pj4yPj4+MF0scmE6QVtyKzEyPj4yPj4+MF0scGE6QVtyKzE2Pj4yPj4+MF0sbmE6QVtyKzIwPj4yPj4+MF0saGE6QVtyKzI0Pj4yPj4+MF0sbWE6QVtyKzI4Pj4yPj4+MF0sQWE6QVtyKzMyPj4yPj4+MF0sd2E6QVtyKzM2Pj4yPj4+MF0semE6bD9LKGwpOiIifSxuPUsobiksbD17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In0pbj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXSk7dmFyIHA9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLGQ9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKGMgaW4gbD17IiVhIjplPT5wW2UuaGFdLnN1YnN0cmluZygwLDMpLCIlQSI6ZT0+cFtlLmhhXSwiJWIiOmU9PmRbZS5wYV0uc3Vic3RyaW5nKDAsMyksIiVCIjplPT5kW2UucGFdLCIlQyI6ZT0+aSgoZS5uYSsxOTAwKS8xMDB8MCwyKSwiJWQiOmU9PmkoZS5yYSwyKSwiJWUiOmU9Pm8oZS5yYSwyLCIgIiksIiVnIjplPT51KGUpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlRyI6ZT0+dShlKSwiJUgiOmU9PmkoZS5vYSwyKSwiJUkiOmU9PigwPT0oZT1lLm9hKT9lPTEyOjEyPGUmJihlLT0xMiksaShlLDIpKSwiJWoiOmU9Pntmb3IodmFyIHQ9MCxuPTA7bjw9ZS5wYS0xO3QrPShRKGUubmErMTkwMCk/YWU6dWUpW24rK10pO3JldHVybiBpKGUucmErdCwzKX0sIiVtIjplPT5pKGUucGErMSwyKSwiJU0iOmU9PmkoZS54YSwyKSwiJW4iOigpPT4iXG4iLCIlcCI6ZT0+MDw9ZS5vYSYmMTI+ZS5vYT8iQU0iOiJQTSIsIiVTIjplPT5pKGUueWEsMiksIiV0IjooKT0+Ilx0IiwiJXUiOmU9PmUuaGF8fDcsIiVVIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy1lLmhhKS83KSwyKSwiJVYiOmU9Pnt2YXIgdD1NYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyk7aWYoMj49KGUuaGErMzcxLWUubWEtMiklNyYmdCsrLHQpNTM9PXQmJig0PT0obj0oZS5oYSszNzEtZS5tYSklNyl8fDM9PW4mJlEoZS5uYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLmhhKzctZS5tYS0xKSU3Oyg0PT1ufHw1PT1uJiZRKGUubmElNDAwLTEpKSYmdCsrO31yZXR1cm4gaSh0LDIpfSwiJXciOmU9PmUuaGEsIiVXIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy0oZS5oYSs2KSU3KS83KSwyKSwiJXkiOmU9PihlLm5hKzE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlWSI6ZT0+ZS5uYSsxOTAwLCIleiI6ZT0+e3ZhciB0PTA8PShlPWUud2EpO3JldHVybiBlPU1hdGguYWJzKGUpLzYwLCh0PyIrIjoiLSIpK1N0cmluZygiMDAwMCIrKGUvNjAqMTAwK2UlNjApKS5zbGljZSgtNCl9LCIlWiI6ZT0+ZS56YSwiJSUiOigpPT4iJSJ9LG49bi5yZXBsYWNlKC8lJS9nLCJcMFwwIiksbCluLmluY2x1ZGVzKGMpJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXShyKSkpO3JldHVybiBjPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KEooZSkrMSk7cmV0dXJuIFooZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSksYy5sZW5ndGg+dD8wOihPLnNldChjLGU+Pj4wKSxjLmxlbmd0aC0xKX12YXIgY2U9e2E6ZnVuY3Rpb24oZSx0LG4pe3Rocm93IG5ldyBXKGU+Pj49MCkuc2EodD4+PjAsbj4+PjApLGV9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSTpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sSzpmdW5jdGlvbigpe3JldHVybiAwfSxHOmZ1bmN0aW9uKCl7fSxCOmZ1bmN0aW9uKCl7fSxGOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx6OmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7fSx4OmZ1bmN0aW9uKCl7fSxrOigpPT4hMCxuOmZ1bmN0aW9uKGUsdCxuKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLG4+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxBW24rND4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLEFbbis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLEFbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLEFbbisxNj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxBW24rMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxBW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLEFbbisyOD4+Mj4+PjBdPShlLmdldFRpbWUoKS1EYXRlLlVUQyhlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwO30sbzpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksQVtuPj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksQVtuKzQ+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxBW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxBW24rMTI+PjI+Pj4wXT1lLmdldERhdGUoKSxBW24rMTY+PjI+Pj4wXT1lLmdldE1vbnRoKCksQVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsQVtuKzI0Pj4yPj4+MF09ZS5nZXREYXkoKSxBW24rMjg+PjI+Pj4wXT0oUShlLmdldEZ1bGxZZWFyKCkpP2VlOnRlKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxBW24rMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0FbbiszMj4+Mj4+PjBdPTB8KHQhPXImJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4ocix0KSk7fSxwOmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShBW2UrMjA+PjI+Pj4wXSsxOTAwLEFbZSsxNj4+Mj4+PjBdLEFbZSsxMj4+Mj4+PjBdLEFbZSs4Pj4yPj4+MF0sQVtlKzQ+PjI+Pj4wXSxBW2U+PjI+Pj4wXSwwKSxuPUFbZSszMj4+Mj4+PjBdLHI9dC5nZXRUaW1lem9uZU9mZnNldCgpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxpPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1NYXRoLm1pbihpLG8pO3JldHVybiAwPm4/QVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPWkmJnM9PXIpOjA8biE9KHM9PXIpJiYobz1NYXRoLm1heChpLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/czpvKS1yKSkpLEFbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCksQVtlKzI4Pj4yPj4+MF09KFEodC5nZXRGdWxsWWVhcigpKT9lZTp0ZSlbdC5nZXRNb250aCgpXSt0LmdldERhdGUoKS0xfDAsQVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksQVtlKzQ+PjI+Pj4wXT10LmdldE1pbnV0ZXMoKSxBW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxBW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxBW2UrMTY+PjI+Pj4wXT10LmdldE1vbnRoKCksQVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsZmUoKGo9ZSwxPD0rTWF0aC5hYnMoaik/MDxqPytNYXRoLmZsb29yKGovNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoai0rKH5+aj4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxsOmZ1bmN0aW9uKCl7cmV0dXJuIC01Mn0sbTpmdW5jdGlvbigpe30sdTpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1uPj4+PTA7dmFyIG89KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLGk9bmV3IERhdGUobywwLDEpLHM9bmV3IERhdGUobyw2LDEpO289aS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBhPXMuZ2V0VGltZXpvbmVPZmZzZXQoKTtQW2U+Pj4wPj4yPj4+MF09NjAqTWF0aC5tYXgobyxhKSxBW3Q+Pj4wPj4yPj4+MF09TnVtYmVyKG8hPWEpLGU9cihpKSx0PXIocyksZT1uZShlKSx0PW5lKHQpLGE8bz8oUFtuPj4yPj4+MF09ZSxQW24rND4+Mj4+PjBdPXQpOihQW24+PjI+Pj4wXT10LFBbbis0Pj4yPj4+MF09ZSk7fSxkOigpPT57TSgiIik7fSxoOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHY6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sYjooKT0+cGVyZm9ybWFuY2Uubm93KCksSjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ+Pj49MCxTLmNvcHlXaXRoaW4oZT4+PjA+Pj4wLHQ+Pj4wLHQrKG4+Pj4wKT4+PjApfSx0OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1TLmxlbmd0aDtpZig0Mjk0OTAxNzYwPGUpcmV0dXJuICExO2Zvcih2YXIgbj0xOzQ+PW47bio9Mil7dmFyIHI9dCooMSsuMi9uKTtyPU1hdGgubWluKHIsZSsxMDA2NjMyOTYpO3ZhciBvPU1hdGg7cj1NYXRoLm1heChlLHIpO2U6e289by5taW4uY2FsbChvLDQyOTQ5MDE3NjAscisoNjU1MzYtciU2NTUzNiklNjU1MzYpLVQuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNjt0cnl7VC5ncm93KG8pLEUoKTt2YXIgaT0xO2JyZWFrIGV9Y2F0Y2goZSl7fWk9dm9pZCAwO31pZihpKXJldHVybiAhMH1yZXR1cm4gITF9LEQ6ZnVuY3Rpb24oZSx0KXtlPj4+PTAsdD4+Pj0wO3ZhciBuPTA7cmV0dXJuIG9lKCkuZm9yRWFjaCgoZnVuY3Rpb24ocixvKXt2YXIgaT10K247Zm9yKG89UFtlKzQqbz4+Mj4+PjBdPWksaT0wO2k8ci5sZW5ndGg7KytpKU9bKDB8bysrKT4+PjBdPXIuY2hhckNvZGVBdChpKTtPWygwfG8pPj4+MF09MCxuKz1yLmxlbmd0aCsxO30pKSwwfSxFOmZ1bmN0aW9uKGUsdCl7ZT4+Pj0wLHQ+Pj49MDt2YXIgbj1vZSgpO1BbZT4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cis9ZS5sZW5ndGgrMTt9KSksUFt0Pj4yPj4+MF09ciwwfSxzOmU9Pnt3fHwoaS5vbkV4aXQmJmkub25FeGl0KGUpLEk9ITApLHAoZSxuZXcgRyhlKSk7fSxmOigpPT41MixqOmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxxOmZ1bmN0aW9uKCl7cmV0dXJuIDcwfSxpOmZ1bmN0aW9uKGUsdCxuLHIpe3Q+Pj49MCxuPj4+PTAscj4+Pj0wO2Zvcih2YXIgbz0wLGk9MDtpPG47aSsrKXt2YXIgcz1QW3Q+PjI+Pj4wXSxhPVBbdCs0Pj4yPj4+MF07dCs9ODtmb3IodmFyIHU9MDt1PGE7dSsrKXt2YXIgbD1TW3MrdT4+PjBdLGM9aWVbZV07MD09PWx8fDEwPT09bD8oKDE9PT1lP3Y6XykoWShjLDApKSxjLmxlbmd0aD0wKTpjLnB1c2gobCk7fW8rPWE7fXJldHVybiBQW3I+PjI+Pj4wXT1vLDB9LHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHNlKFMuc3ViYXJyYXkoZT4+PjAsZSsodD4+PjApPj4+MCkpLDB9LEM6bGUsYzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbGUoZT4+PjAsdD4+PjAsbj4+PjAscj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlPWUuZXhwb3J0cyx4PWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAsbj1lPT50PT5lKHQpPj4+MDtyZXR1cm4gKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5tYWxsb2M9bihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPW4oZS5zdGFja0FsbG9jKSxlfShlKSxUPXguTCxFKCksJC51bnNoaWZ0KHguTSksUi0tLGkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmaS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKFIpLDA9PVImJihDKSl7dmFyIHQ9QztDPW51bGwsdCgpO31yZXR1cm4gZX12YXIgdD17YTpjZX07aWYoUisrLGkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmaS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKFIpLGkuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gaS5pbnN0YW50aWF0ZVdhc20odCxlKX1jYXRjaChlKXtfKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpLG8oZSk7fShmdW5jdGlvbihlLHQpe3ZhciBuPU47cmV0dXJuIHl8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8VShuKXx8bi5zdGFydHNXaXRoKCJmaWxlOi8vIil8fGh8fCJmdW5jdGlvbiIhPXR5cGVvZiBmZXRjaD96KG4sZSx0KTpmZXRjaChuLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigocj0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocixlKS50aGVuKHQsKGZ1bmN0aW9uKHIpe3JldHVybiBfKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIityKSxfKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHoobixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UpO30pKS5jYXRjaChvKTt9KCksaS5fT3J0SW5pdD0oZSx0KT0+KGkuX09ydEluaXQ9eC5OKShlLHQpLGkuX09ydEdldExhc3RFcnJvcj0oZSx0KT0+KGkuX09ydEdldExhc3RFcnJvcj14Lk8pKGUsdCksaS5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9KGUsdCxuLHIsbyxzLGEsdSxsLGMpPT4oaS5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9eC5QKShlLHQsbixyLG8scyxhLHUsbCxjKSxpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj0oZSx0KT0+KGkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPXguUSkoZSx0KSxpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9KGUsdCxuKT0+KGkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT14LlIpKGUsdCxuKSxpLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZT0+KGkuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz14LlMpKGUpLGkuX09ydENyZWF0ZVNlc3Npb249KGUsdCxuKT0+KGkuX09ydENyZWF0ZVNlc3Npb249eC5UKShlLHQsbiksaS5fT3J0UmVsZWFzZVNlc3Npb249ZT0+KGkuX09ydFJlbGVhc2VTZXNzaW9uPXguVSkoZSksaS5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD0oZSx0LG4pPT4oaS5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD14LlYpKGUsdCxuKSxpLl9PcnRHZXRJbnB1dE5hbWU9KGUsdCk9PihpLl9PcnRHZXRJbnB1dE5hbWU9eC5XKShlLHQpLGkuX09ydEdldE91dHB1dE5hbWU9KGUsdCk9PihpLl9PcnRHZXRPdXRwdXROYW1lPXguWCkoZSx0KSxpLl9PcnRGcmVlPWU9PihpLl9PcnRGcmVlPXguWSkoZSksaS5fT3J0Q3JlYXRlVGVuc29yPShlLHQsbixyLG8pPT4oaS5fT3J0Q3JlYXRlVGVuc29yPXguWikoZSx0LG4scixvKSxpLl9PcnRHZXRUZW5zb3JEYXRhPShlLHQsbixyLG8pPT4oaS5fT3J0R2V0VGVuc29yRGF0YT14Ll8pKGUsdCxuLHIsbyksaS5fT3J0UmVsZWFzZVRlbnNvcj1lPT4oaS5fT3J0UmVsZWFzZVRlbnNvcj14LiQpKGUpLGkuX09ydENyZWF0ZVJ1bk9wdGlvbnM9KGUsdCxuLHIpPT4oaS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz14LmFhKShlLHQsbixyKSxpLl9PcnRBZGRSdW5Db25maWdFbnRyeT0oZSx0LG4pPT4oaS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9eC5iYSkoZSx0LG4pLGkuX09ydFJlbGVhc2VSdW5PcHRpb25zPWU9PihpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz14LmNhKShlKSxpLl9PcnRSdW49KGUsdCxuLHIsbyxzLGEsdSk9PihpLl9PcnRSdW49eC5kYSkoZSx0LG4scixvLHMsYSx1KSxpLl9PcnRFbmRQcm9maWxpbmc9ZT0+KGkuX09ydEVuZFByb2ZpbGluZz14LmVhKShlKTt2YXIgcGU9aS5fbWFsbG9jPWU9PihwZT1pLl9tYWxsb2M9eC5mYSkoZSk7aS5fZnJlZT1lPT4oaS5fZnJlZT14LmdhKShlKTt2YXIgZGUsZmU9ZT0+KGZlPXguaWEpKGUpLGhlPSgpPT4oaGU9eC5qYSkoKSxnZT1lPT4oZ2U9eC5rYSkoZSksYmU9ZT0+KGJlPXgubGEpKGUpO2Z1bmN0aW9uIG1lKCl7ZnVuY3Rpb24gZSgpe2lmKCFkZSYmKGRlPSEwLGkuY2FsbGVkUnVuPSEwLCFJKSl7aWYoSCgkKSx0KGkpLGkub25SdW50aW1lSW5pdGlhbGl6ZWQmJmkub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxpLnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBpLnBvc3RSdW4mJihpLnBvc3RSdW49W2kucG9zdFJ1bl0pO2kucG9zdFJ1bi5sZW5ndGg7KXt2YXIgZT1pLnBvc3RSdW4uc2hpZnQoKTtrLnVuc2hpZnQoZSk7fUgoayk7fX1pZighKDA8Uikpe2lmKGkucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgaS5wcmVSdW4mJihpLnByZVJ1bj1baS5wcmVSdW5dKTtpLnByZVJ1bi5sZW5ndGg7KUYoKTtIKEQpLDA8Unx8KGkuc2V0U3RhdHVzPyhpLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLnNldFN0YXR1cygiIik7fSksMSksZSgpO30pLDEpKTplKCkpO319aWYoaS5zdGFja0FsbG9jPWJlLGkuc3RhY2tTYXZlPWhlLGkuc3RhY2tSZXN0b3JlPWdlLGkuVVRGOFRvU3RyaW5nPUssaS5zdHJpbmdUb1VURjg9KGUsdCxuKT0+WihlLFMsdCxuKSxpLmxlbmd0aEJ5dGVzVVRGOD1KLEM9ZnVuY3Rpb24gZSgpe2RlfHxtZSgpLGRlfHwoQz1lKTt9LGkucHJlSW5pdClmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGkucHJlSW5pdCYmKGkucHJlSW5pdD1baS5wcmVJbml0XSk7MDxpLnByZUluaXQubGVuZ3RoOylpLnByZUluaXQucG9wKCkoKTtyZXR1cm4gbWUoKSxlLnJlYWR5fSk7ZS5leHBvcnRzPW87fSw0NTM3OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wLG89MixpPSEwO288YXJndW1lbnRzLmxlbmd0aDspbltyKytdPWFyZ3VtZW50c1tvKytdO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxzKXtuW3JdPWZ1bmN0aW9uKGUpe2lmKGkpaWYoaT0hMSxlKXMoZSk7ZWxzZSB7Zm9yKHZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPHQubGVuZ3RoOyl0W24rK109YXJndW1lbnRzW25dO28uYXBwbHkobnVsbCx0KTt9fTt0cnl7ZS5hcHBseSh0fHxudWxsLG4pO31jYXRjaChlKXtpJiYoaT0hMSxzKGUpKTt9fSkpfTt9LDc0MTk6KGUsdCk9Pnt2YXIgbj10O24ubGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKCF0KXJldHVybiAwO2Zvcih2YXIgbj0wOy0tdCU0PjEmJiI9Ij09PWUuY2hhckF0KHQpOykrK247cmV0dXJuIE1hdGguY2VpbCgzKmUubGVuZ3RoKS80LW59O2Zvcih2YXIgcj1uZXcgQXJyYXkoNjQpLG89bmV3IEFycmF5KDEyMyksaT0wO2k8NjQ7KW9bcltpXT1pPDI2P2krNjU6aTw1Mj9pKzcxOmk8NjI/aS00OmktNTl8NDNdPWkrKztuLmVuY29kZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvLGk9bnVsbCxzPVtdLGE9MCx1PTA7dDxuOyl7dmFyIGw9ZVt0KytdO3N3aXRjaCh1KXtjYXNlIDA6c1thKytdPXJbbD4+Ml0sbz0oMyZsKTw8NCx1PTE7YnJlYWs7Y2FzZSAxOnNbYSsrXT1yW298bD4+NF0sbz0oMTUmbCk8PDIsdT0yO2JyZWFrO2Nhc2UgMjpzW2ErK109cltvfGw+PjZdLHNbYSsrXT1yWzYzJmxdLHU9MDt9YT44MTkxJiYoKGl8fChpPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzKSksYT0wKTt9cmV0dXJuIHUmJihzW2ErK109cltvXSxzW2ErK109NjEsMT09PXUmJihzW2ErK109NjEpKSxpPyhhJiZpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscy5zbGljZSgwLGEpKSksaS5qb2luKCIiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscy5zbGljZSgwLGEpKX07dmFyIHM9ImludmFsaWQgZW5jb2RpbmciO24uZGVjb2RlPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1uLGE9MCx1PTA7dTxlLmxlbmd0aDspe3ZhciBsPWUuY2hhckNvZGVBdCh1KyspO2lmKDYxPT09bCYmYT4xKWJyZWFrO2lmKHZvaWQgMD09PShsPW9bbF0pKXRocm93IEVycm9yKHMpO3N3aXRjaChhKXtjYXNlIDA6cj1sLGE9MTticmVhaztjYXNlIDE6dFtuKytdPXI8PDJ8KDQ4JmwpPj40LHI9bCxhPTI7YnJlYWs7Y2FzZSAyOnRbbisrXT0oMTUmcik8PDR8KDYwJmwpPj4yLHI9bCxhPTM7YnJlYWs7Y2FzZSAzOnRbbisrXT0oMyZyKTw8NnxsLGE9MDt9fWlmKDE9PT1hKXRocm93IEVycm9yKHMpO3JldHVybiBuLWl9LG4udGVzdD1mdW5jdGlvbihlKXtyZXR1cm4gL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3QoZSl9O30sOTIxMTplPT57ZnVuY3Rpb24gdCgpe3RoaXMuX2xpc3RlbmVycz17fTt9ZS5leHBvcnRzPXQsdC5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAodGhpcy5fbGlzdGVuZXJzW2VdfHwodGhpcy5fbGlzdGVuZXJzW2VdPVtdKSkucHVzaCh7Zm46dCxjdHg6bnx8dGhpc30pLHRoaXN9LHQucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PWUpdGhpcy5fbGlzdGVuZXJzPXt9O2Vsc2UgaWYodm9pZCAwPT09dCl0aGlzLl9saXN0ZW5lcnNbZV09W107ZWxzZSBmb3IodmFyIG49dGhpcy5fbGlzdGVuZXJzW2VdLHI9MDtyPG4ubGVuZ3RoOyluW3JdLmZuPT09dD9uLnNwbGljZShyLDEpOisrcjtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9saXN0ZW5lcnNbZV07aWYodCl7Zm9yKHZhciBuPVtdLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7KW4ucHVzaChhcmd1bWVudHNbcisrXSk7Zm9yKHI9MDtyPHQubGVuZ3RoOyl0W3JdLmZuLmFwcGx5KHRbcisrXS5jdHgsbik7fXJldHVybiB0aGlzfTt9LDk0NTplPT57ZnVuY3Rpb24gdChlKXtyZXR1cm4gInVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KFstMF0pLG49bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpLHI9MTI4PT09blszXTtmdW5jdGlvbiBvKGUscixvKXt0WzBdPWUscltvXT1uWzBdLHJbbysxXT1uWzFdLHJbbysyXT1uWzJdLHJbbyszXT1uWzNdO31mdW5jdGlvbiBpKGUscixvKXt0WzBdPWUscltvXT1uWzNdLHJbbysxXT1uWzJdLHJbbysyXT1uWzFdLHJbbyszXT1uWzBdO31mdW5jdGlvbiBzKGUscil7cmV0dXJuIG5bMF09ZVtyXSxuWzFdPWVbcisxXSxuWzJdPWVbcisyXSxuWzNdPWVbciszXSx0WzBdfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gblszXT1lW3JdLG5bMl09ZVtyKzFdLG5bMV09ZVtyKzJdLG5bMF09ZVtyKzNdLHRbMF19ZS53cml0ZUZsb2F0TEU9cj9vOmksZS53cml0ZUZsb2F0QkU9cj9pOm8sZS5yZWFkRmxvYXRMRT1yP3M6YSxlLnJlYWRGbG9hdEJFPXI/YTpzO30oKTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0LG4scil7dmFyIG89dDwwPzE6MDtpZihvJiYodD0tdCksMD09PXQpZSgxL3Q+MD8wOjIxNDc0ODM2NDgsbixyKTtlbHNlIGlmKGlzTmFOKHQpKWUoMjE0MzI4OTM0NCxuLHIpO2Vsc2UgaWYodD4zNDAyODIzNDY2Mzg1Mjg4NmUyMillKChvPDwzMXwyMTM5MDk1MDQwKT4+PjAsbixyKTtlbHNlIGlmKHQ8MTE3NTQ5NDM1MDgyMjI4NzVlLTU0KWUoKG88PDMxfE1hdGgucm91bmQodC8xNDAxMjk4NDY0MzI0ODE3ZS02MCkpPj4+MCxuLHIpO2Vsc2Uge3ZhciBpPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpO2UoKG88PDMxfGkrMTI3PDwyM3w4Mzg4NjA3Jk1hdGgucm91bmQodCpNYXRoLnBvdygyLC1pKSo4Mzg4NjA4KSk+Pj4wLG4scik7fX1mdW5jdGlvbiBzKGUsdCxuKXt2YXIgcj1lKHQsbiksbz0yKihyPj4zMSkrMSxpPXI+Pj4yMyYyNTUscz04Mzg4NjA3JnI7cmV0dXJuIDI1NT09PWk/cz9OYU46byooMS8wKTowPT09aT8xNDAxMjk4NDY0MzI0ODE3ZS02MCpvKnM6bypNYXRoLnBvdygyLGktMTUwKSoocys4Mzg4NjA4KX1lLndyaXRlRmxvYXRMRT10LmJpbmQobnVsbCxuKSxlLndyaXRlRmxvYXRCRT10LmJpbmQobnVsbCxyKSxlLnJlYWRGbG9hdExFPXMuYmluZChudWxsLG8pLGUucmVhZEZsb2F0QkU9cy5iaW5kKG51bGwsaSk7fSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQ2NEFycmF5P2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0NjRBcnJheShbLTBdKSxuPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxyPTEyOD09PW5bN107ZnVuY3Rpb24gbyhlLHIsbyl7dFswXT1lLHJbb109blswXSxyW28rMV09blsxXSxyW28rMl09blsyXSxyW28rM109blszXSxyW28rNF09bls0XSxyW28rNV09bls1XSxyW28rNl09bls2XSxyW28rN109bls3XTt9ZnVuY3Rpb24gaShlLHIsbyl7dFswXT1lLHJbb109bls3XSxyW28rMV09bls2XSxyW28rMl09bls1XSxyW28rM109bls0XSxyW28rNF09blszXSxyW28rNV09blsyXSxyW28rNl09blsxXSxyW28rN109blswXTt9ZnVuY3Rpb24gcyhlLHIpe3JldHVybiBuWzBdPWVbcl0sblsxXT1lW3IrMV0sblsyXT1lW3IrMl0sblszXT1lW3IrM10sbls0XT1lW3IrNF0sbls1XT1lW3IrNV0sbls2XT1lW3IrNl0sbls3XT1lW3IrN10sdFswXX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIG5bN109ZVtyXSxuWzZdPWVbcisxXSxuWzVdPWVbcisyXSxuWzRdPWVbciszXSxuWzNdPWVbcis0XSxuWzJdPWVbcis1XSxuWzFdPWVbcis2XSxuWzBdPWVbcis3XSx0WzBdfWUud3JpdGVEb3VibGVMRT1yP286aSxlLndyaXRlRG91YmxlQkU9cj9pOm8sZS5yZWFkRG91YmxlTEU9cj9zOmEsZS5yZWFkRG91YmxlQkU9cj9hOnM7fSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHQsbixyLG8saSl7dmFyIHM9cjwwPzE6MDtpZihzJiYocj0tciksMD09PXIpZSgwLG8saSt0KSxlKDEvcj4wPzA6MjE0NzQ4MzY0OCxvLGkrbik7ZWxzZSBpZihpc05hTihyKSllKDAsbyxpK3QpLGUoMjE0Njk1OTM2MCxvLGkrbik7ZWxzZSBpZihyPjE3OTc2OTMxMzQ4NjIzMTU3ZTI5MillKDAsbyxpK3QpLGUoKHM8PDMxfDIxNDY0MzUwNzIpPj4+MCxvLGkrbik7ZWxzZSB7dmFyIGE7aWYocjwyMjI1MDczODU4NTA3MjAxNGUtMzI0KWUoKGE9ci81ZS0zMjQpPj4+MCxvLGkrdCksZSgoczw8MzF8YS80Mjk0OTY3Mjk2KT4+PjAsbyxpK24pO2Vsc2Uge3ZhciB1PU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjIpOzEwMjQ9PT11JiYodT0xMDIzKSxlKDQ1MDM1OTk2MjczNzA0OTYqKGE9cipNYXRoLnBvdygyLC11KSk+Pj4wLG8saSt0KSxlKChzPDwzMXx1KzEwMjM8PDIwfDEwNDg1NzYqYSYxMDQ4NTc1KT4+PjAsbyxpK24pO319fWZ1bmN0aW9uIHMoZSx0LG4scixvKXt2YXIgaT1lKHIsbyt0KSxzPWUocixvK24pLGE9Mioocz4+MzEpKzEsdT1zPj4+MjAmMjA0NyxsPTQyOTQ5NjcyOTYqKDEwNDg1NzUmcykraTtyZXR1cm4gMjA0Nz09PXU/bD9OYU46YSooMS8wKTowPT09dT81ZS0zMjQqYSpsOmEqTWF0aC5wb3coMix1LTEwNzUpKihsKzQ1MDM1OTk2MjczNzA0OTYpfWUud3JpdGVEb3VibGVMRT10LmJpbmQobnVsbCxuLDAsNCksZS53cml0ZURvdWJsZUJFPXQuYmluZChudWxsLHIsNCwwKSxlLnJlYWREb3VibGVMRT1zLmJpbmQobnVsbCxvLDAsNCksZS5yZWFkRG91YmxlQkU9cy5iaW5kKG51bGwsaSw0LDApO30oKSxlfWZ1bmN0aW9uIG4oZSx0LG4pe3Rbbl09MjU1JmUsdFtuKzFdPWU+Pj44JjI1NSx0W24rMl09ZT4+PjE2JjI1NSx0W24rM109ZT4+PjI0O31mdW5jdGlvbiByKGUsdCxuKXt0W25dPWU+Pj4yNCx0W24rMV09ZT4+PjE2JjI1NSx0W24rMl09ZT4+PjgmMjU1LHRbbiszXT0yNTUmZTt9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiAoZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0KT4+PjB9ZnVuY3Rpb24gaShlLHQpe3JldHVybiAoZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9ZS5leHBvcnRzPXQodCk7fSw3MTk5Om1vZHVsZT0+e2Z1bmN0aW9uIGlucXVpcmUobW9kdWxlTmFtZSl7dHJ5e3ZhciBtb2Q9ZXZhbCgicXVpcmUiLnJlcGxhY2UoL14vLCJyZSIpKShtb2R1bGVOYW1lKTtpZihtb2QmJihtb2QubGVuZ3RofHxPYmplY3Qua2V5cyhtb2QpLmxlbmd0aCkpcmV0dXJuIG1vZH1jYXRjaChlKXt9cmV0dXJuIG51bGx9bW9kdWxlLmV4cG9ydHM9aW5xdWlyZTt9LDY2NjI6ZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnx8ODE5MixvPXI+Pj4xLGk9bnVsbCxzPXI7cmV0dXJuIGZ1bmN0aW9uKG4pe2lmKG48MXx8bj5vKXJldHVybiBlKG4pO3Mrbj5yJiYoaT1lKHIpLHM9MCk7dmFyIGE9dC5jYWxsKGkscyxzKz1uKTtyZXR1cm4gNyZzJiYocz0xKyg3fHMpKSxhfX07fSw0OTk3OihlLHQpPT57dmFyIG49dDtuLmxlbmd0aD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPTAscj0wO3I8ZS5sZW5ndGg7KytyKShuPWUuY2hhckNvZGVBdChyKSk8MTI4P3QrPTE6bjwyMDQ4P3QrPTI6NTUyOTY9PSg2NDUxMiZuKSYmNTYzMjA9PSg2NDUxMiZlLmNoYXJDb2RlQXQocisxKSk/KCsrcix0Kz00KTp0Kz0zO3JldHVybiB0fSxuLnJlYWQ9ZnVuY3Rpb24oZSx0LG4pe2lmKG4tdDwxKXJldHVybiAiIjtmb3IodmFyIHIsbz1udWxsLGk9W10scz0wO3Q8bjspKHI9ZVt0KytdKTwxMjg/aVtzKytdPXI6cj4xOTEmJnI8MjI0P2lbcysrXT0oMzEmcik8PDZ8NjMmZVt0KytdOnI+MjM5JiZyPDM2NT8ocj0oKDcmcik8PDE4fCg2MyZlW3QrK10pPDwxMnwoNjMmZVt0KytdKTw8Nnw2MyZlW3QrK10pLTY1NTM2LGlbcysrXT01NTI5Nisocj4+MTApLGlbcysrXT01NjMyMCsoMTAyMyZyKSk6aVtzKytdPSgxNSZyKTw8MTJ8KDYzJmVbdCsrXSk8PDZ8NjMmZVt0KytdLHM+ODE5MSYmKChvfHwobz1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaSkpLHM9MCk7cmV0dXJuIG8/KHMmJm8ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxpLnNsaWNlKDAscykpKSxvLmpvaW4oIiIpKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxpLnNsaWNlKDAscykpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsbyxpPW4scz0wO3M8ZS5sZW5ndGg7KytzKShyPWUuY2hhckNvZGVBdChzKSk8MTI4P3RbbisrXT1yOnI8MjA0OD8odFtuKytdPXI+PjZ8MTkyLHRbbisrXT02MyZyfDEyOCk6NTUyOTY9PSg2NDUxMiZyKSYmNTYzMjA9PSg2NDUxMiYobz1lLmNoYXJDb2RlQXQocysxKSkpPyhyPTY1NTM2KygoMTAyMyZyKTw8MTApKygxMDIzJm8pLCsrcyx0W24rK109cj4+MTh8MjQwLHRbbisrXT1yPj4xMiY2M3wxMjgsdFtuKytdPXI+PjYmNjN8MTI4LHRbbisrXT02MyZyfDEyOCk6KHRbbisrXT1yPj4xMnwyMjQsdFtuKytdPXI+PjYmNjN8MTI4LHRbbisrXT02MyZyfDEyOCk7cmV0dXJuIG4taX07fSwzNDQyOihlLHQpPT57dC5fX2VzTW9kdWxlPSEwO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50OyBgdmFsdWVgIGhhcyBubyB2YWx1ZS4iKTt0aGlzLnZhbHVlPWUuRU1QVFksdCYmZS5pc0d1aWQodCkmJih0aGlzLnZhbHVlPXQpO31yZXR1cm4gZS5pc0d1aWQ9ZnVuY3Rpb24odCl7dmFyIG49dC50b1N0cmluZygpO3JldHVybiB0JiYodCBpbnN0YW5jZW9mIGV8fGUudmFsaWRhdG9yLnRlc3QobikpfSxlLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZShbZS5nZW4oMiksZS5nZW4oMSksZS5nZW4oMSksZS5nZW4oMSksZS5nZW4oMyldLmpvaW4oIi0iKSl9LGUuY3JlYXRlRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUoImVtcHR5Z3VpZCIpfSxlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5yYXc9ZnVuY3Rpb24oKXtyZXR1cm4gW2UuZ2VuKDIpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDMpXS5qb2luKCItIil9LGUuZ2VuPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iIixuPTA7bjxlO24rKyl0Kz0oNjU1MzYqKDErTWF0aC5yYW5kb20oKSl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBlLmlzR3VpZCh0KSYmdGhpcy52YWx1ZT09PXQudG9TdHJpbmcoKX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlPT09ZS5FTVBUWX0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHt2YWx1ZTp0aGlzLnZhbHVlfX0sZS52YWxpZGF0b3I9bmV3IFJlZ0V4cCgiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSQiLCJpIiksZS5FTVBUWT0iMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIixlfSgpO3QuR3VpZD1uO30sMjEwMDooZSx0LG4pPT57ZS5leHBvcnRzPW4oOTQ4Mik7fSw5NDgyOihlLHQsbik9Pnt2YXIgcj10O2Z1bmN0aW9uIG8oKXtyLnV0aWwuX2NvbmZpZ3VyZSgpLHIuV3JpdGVyLl9jb25maWd1cmUoci5CdWZmZXJXcml0ZXIpLHIuUmVhZGVyLl9jb25maWd1cmUoci5CdWZmZXJSZWFkZXIpO31yLmJ1aWxkPSJtaW5pbWFsIixyLldyaXRlcj1uKDExNzMpLHIuQnVmZmVyV3JpdGVyPW4oMzE1NSksci5SZWFkZXI9bigxNDA4KSxyLkJ1ZmZlclJlYWRlcj1uKDU5Myksci51dGlsPW4oOTY5Myksci5ycGM9big1OTk0KSxyLnJvb3RzPW4oNTA1NCksci5jb25maWd1cmU9byxvKCk7fSwxNDA4OihlLHQsbik9PntlLmV4cG9ydHM9dTt2YXIgcixvPW4oOTY5MyksaT1vLkxvbmdCaXRzLHM9by51dGY4O2Z1bmN0aW9uIGEoZSx0KXtyZXR1cm4gUmFuZ2VFcnJvcigiaW5kZXggb3V0IG9mIHJhbmdlOiAiK2UucG9zKyIgKyAiKyh0fHwxKSsiID4gIitlLmxlbil9ZnVuY3Rpb24gdShlKXt0aGlzLmJ1Zj1lLHRoaXMucG9zPTAsdGhpcy5sZW49ZS5sZW5ndGg7fXZhciBsLGM9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P2Z1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheS5pc0FycmF5KGUpKXJldHVybiBuZXcgdShlKTt0aHJvdyBFcnJvcigiaWxsZWdhbCBidWZmZXIiKX06ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gbmV3IHUoZSk7dGhyb3cgRXJyb3IoImlsbGVnYWwgYnVmZmVyIil9LHA9ZnVuY3Rpb24oKXtyZXR1cm4gby5CdWZmZXI/ZnVuY3Rpb24oZSl7cmV0dXJuICh1LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gby5CdWZmZXIuaXNCdWZmZXIoZSk/bmV3IHIoZSk6YyhlKX0pKGUpfTpjfTtmdW5jdGlvbiBkKCl7dmFyIGU9bmV3IGkoMCwwKSx0PTA7aWYoISh0aGlzLmxlbi10aGlzLnBvcz40KSl7Zm9yKDt0PDM7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgYSh0aGlzKTtpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfXJldHVybiBlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3MrK10pPDw3KnQpPj4+MCxlfWZvcig7dDw0OysrdClpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlO2lmKGUubG89KGUubG98KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyOCk+Pj4wLGUuaGk9KGUuaGl8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPj40KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlO2lmKHQ9MCx0aGlzLmxlbi10aGlzLnBvcz40KXtmb3IoO3Q8NTsrK3QpaWYoZS5oaT0oZS5oaXwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfWVsc2UgZm9yKDt0PDU7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgYSh0aGlzKTtpZihlLmhpPShlLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KzMpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGV9dGhyb3cgRXJyb3IoImludmFsaWQgdmFyaW50IGVuY29kaW5nIil9ZnVuY3Rpb24gZihlLHQpe3JldHVybiAoZVt0LTRdfGVbdC0zXTw8OHxlW3QtMl08PDE2fGVbdC0xXTw8MjQpPj4+MH1mdW5jdGlvbiBoKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBhKHRoaXMsOCk7cmV0dXJuIG5ldyBpKGYodGhpcy5idWYsdGhpcy5wb3MrPTQpLGYodGhpcy5idWYsdGhpcy5wb3MrPTQpKX11LmNyZWF0ZT1wKCksdS5wcm90b3R5cGUuX3NsaWNlPW8uQXJyYXkucHJvdG90eXBlLnN1YmFycmF5fHxvLkFycmF5LnByb3RvdHlwZS5zbGljZSx1LnByb3RvdHlwZS51aW50MzI9KGw9NDI5NDk2NzI5NSxmdW5jdGlvbigpe2lmKGw9KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYobD0obHwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYobD0obHwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDE0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBsO2lmKGw9KGx8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyMSk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbDtpZihsPShsfCgxNSZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyOCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbDtpZigodGhpcy5wb3MrPTUpPnRoaXMubGVuKXRocm93IHRoaXMucG9zPXRoaXMubGVuLGEodGhpcywxMCk7cmV0dXJuIGx9KSx1LnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbigpe3JldHVybiAwfHRoaXMudWludDMyKCl9LHUucHJvdG90eXBlLnNpbnQzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCk7cmV0dXJuIGU+Pj4xXi0oMSZlKX0sdS5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy51aW50MzIoKX0sdS5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLDQpO3JldHVybiBmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuc2ZpeGVkMzI9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTtyZXR1cm4gMHxmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTt2YXIgZT1vLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX0sdS5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBhKHRoaXMsNCk7dmFyIGU9by5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfSx1LnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCksdD10aGlzLnBvcyxuPXRoaXMucG9zK2U7aWYobj50aGlzLmxlbil0aHJvdyBhKHRoaXMsZSk7cmV0dXJuIHRoaXMucG9zKz1lLEFycmF5LmlzQXJyYXkodGhpcy5idWYpP3RoaXMuYnVmLnNsaWNlKHQsbik6dD09PW4/bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApOnRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYsdCxuKX0sdS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ieXRlcygpO3JldHVybiBzLnJlYWQoZSwwLGUubGVuZ3RoKX0sdS5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKHRoaXMucG9zK2U+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLGUpO3RoaXMucG9zKz1lO31lbHNlIGRve2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBhKHRoaXMpfXdoaWxlKDEyOCZ0aGlzLmJ1Zlt0aGlzLnBvcysrXSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnNraXBUeXBlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDA6dGhpcy5za2lwKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcCg4KTticmVhaztjYXNlIDI6dGhpcy5za2lwKHRoaXMudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpmb3IoOzQhPShlPTcmdGhpcy51aW50MzIoKSk7KXRoaXMuc2tpcFR5cGUoZSk7YnJlYWs7Y2FzZSA1OnRoaXMuc2tpcCg0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHdpcmUgdHlwZSAiK2UrIiBhdCBvZmZzZXQgIit0aGlzLnBvcyl9cmV0dXJuIHRoaXN9LHUuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUsdS5jcmVhdGU9cCgpLHIuX2NvbmZpZ3VyZSgpO3ZhciB0PW8uTG9uZz8idG9Mb25nIjoidG9OdW1iZXIiO28ubWVyZ2UodS5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKVt0XSghMSl9LHVpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcylbdF0oITApfSxzaW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMCl9LHNmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMSl9fSk7fTt9LDU5MzooZSx0LG4pPT57ZS5leHBvcnRzPWk7dmFyIHI9bigxNDA4KTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIG89big5NjkzKTtmdW5jdGlvbiBpKGUpe3IuY2FsbCh0aGlzLGUpO31pLl9jb25maWd1cmU9ZnVuY3Rpb24oKXtvLkJ1ZmZlciYmKGkucHJvdG90eXBlLl9zbGljZT1vLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO30saS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aW50MzIoKTtyZXR1cm4gdGhpcy5idWYudXRmOFNsaWNlP3RoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSk6dGhpcy5idWYudG9TdHJpbmcoInV0Zi04Iix0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSl9LGkuX2NvbmZpZ3VyZSgpO30sNTA1NDplPT57ZS5leHBvcnRzPXt9O30sNTk5NDooZSx0LG4pPT57dC5TZXJ2aWNlPW4oNzk0OCk7fSw3OTQ4OihlLHQsbik9PntlLmV4cG9ydHM9bzt2YXIgcj1uKDk2OTMpO2Z1bmN0aW9uIG8oZSx0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcigicnBjSW1wbCBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyLkV2ZW50RW1pdHRlci5jYWxsKHRoaXMpLHRoaXMucnBjSW1wbD1lLHRoaXMucmVxdWVzdERlbGltaXRlZD1Cb29sZWFuKHQpLHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQ9Qm9vbGVhbihuKTt9KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5ycGNDYWxsPWZ1bmN0aW9uIGUodCxuLG8saSxzKXtpZighaSl0aHJvdyBUeXBlRXJyb3IoInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWQiKTt2YXIgYT10aGlzO2lmKCFzKXJldHVybiByLmFzUHJvbWlzZShlLGEsdCxuLG8saSk7aWYoYS5ycGNJbXBsKXRyeXtyZXR1cm4gYS5ycGNJbXBsKHQsblthLnJlcXVlc3REZWxpbWl0ZWQ/ImVuY29kZURlbGltaXRlZCI6ImVuY29kZSJdKGkpLmZpbmlzaCgpLChmdW5jdGlvbihlLG4pe2lmKGUpcmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKTtpZihudWxsIT09bil7aWYoIShuIGluc3RhbmNlb2YgbykpdHJ5e249b1thLnJlc3BvbnNlRGVsaW1pdGVkPyJkZWNvZGVEZWxpbWl0ZWQiOiJkZWNvZGUiXShuKTt9Y2F0Y2goZSl7cmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKX1yZXR1cm4gYS5lbWl0KCJkYXRhIixuLHQpLHMobnVsbCxuKX1hLmVuZCghMCk7fSkpfWNhdGNoKGUpe3JldHVybiBhLmVtaXQoImVycm9yIixlLHQpLHZvaWQgc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKGUpO30pLDApfWVsc2Ugc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKEVycm9yKCJhbHJlYWR5IGVuZGVkIikpO30pLDApO30sby5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJwY0ltcGwmJihlfHx0aGlzLnJwY0ltcGwobnVsbCxudWxsLG51bGwpLHRoaXMucnBjSW1wbD1udWxsLHRoaXMuZW1pdCgiZW5kIikub2ZmKCkpLHRoaXN9O30sMTk0NTooZSx0LG4pPT57ZS5leHBvcnRzPW87dmFyIHI9big5NjkzKTtmdW5jdGlvbiBvKGUsdCl7dGhpcy5sbz1lPj4+MCx0aGlzLmhpPXQ+Pj4wO312YXIgaT1vLnplcm89bmV3IG8oMCwwKTtpLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGkuenpFbmNvZGU9aS56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiAxfTt2YXIgcz1vLnplcm9IYXNoPSJcMFwwXDBcMFwwXDBcMFwwIjtvLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoMD09PWUpcmV0dXJuIGk7dmFyIHQ9ZTwwO3QmJihlPS1lKTt2YXIgbj1lPj4+MCxyPShlLW4pLzQyOTQ5NjcyOTY+Pj4wO3JldHVybiB0JiYocj1+cj4+PjAsbj1+bj4+PjAsKytuPjQyOTQ5NjcyOTUmJihuPTAsKytyPjQyOTQ5NjcyOTUmJihyPTApKSksbmV3IG8obixyKX0sby5mcm9tPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gby5mcm9tTnVtYmVyKGUpO2lmKHIuaXNTdHJpbmcoZSkpe2lmKCFyLkxvbmcpcmV0dXJuIG8uZnJvbU51bWJlcihwYXJzZUludChlLDEwKSk7ZT1yLkxvbmcuZnJvbVN0cmluZyhlKTt9cmV0dXJuIGUubG93fHxlLmhpZ2g/bmV3IG8oZS5sb3c+Pj4wLGUuaGlnaD4+PjApOml9LG8ucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKCFlJiZ0aGlzLmhpPj4+MzEpe3ZhciB0PTErfnRoaXMubG8+Pj4wLG49fnRoaXMuaGk+Pj4wO3JldHVybiB0fHwobj1uKzE+Pj4wKSwtKHQrNDI5NDk2NzI5NipuKX1yZXR1cm4gdGhpcy5sbys0Mjk0OTY3Mjk2KnRoaXMuaGl9LG8ucHJvdG90eXBlLnRvTG9uZz1mdW5jdGlvbihlKXtyZXR1cm4gci5Mb25nP25ldyByLkxvbmcoMHx0aGlzLmxvLDB8dGhpcy5oaSxCb29sZWFuKGUpKTp7bG93OjB8dGhpcy5sbyxoaWdoOjB8dGhpcy5oaSx1bnNpZ25lZDpCb29sZWFuKGUpfX07dmFyIGE9U3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0O28uZnJvbUhhc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1zP2k6bmV3IG8oKGEuY2FsbChlLDApfGEuY2FsbChlLDEpPDw4fGEuY2FsbChlLDIpPDwxNnxhLmNhbGwoZSwzKTw8MjQpPj4+MCwoYS5jYWxsKGUsNCl8YS5jYWxsKGUsNSk8PDh8YS5jYWxsKGUsNik8PDE2fGEuY2FsbChlLDcpPDwyNCk+Pj4wKX0sby5wcm90b3R5cGUudG9IYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnRoaXMubG8sdGhpcy5sbz4+PjgmMjU1LHRoaXMubG8+Pj4xNiYyNTUsdGhpcy5sbz4+PjI0LDI1NSZ0aGlzLmhpLHRoaXMuaGk+Pj44JjI1NSx0aGlzLmhpPj4+MTYmMjU1LHRoaXMuaGk+Pj4yNCl9LG8ucHJvdG90eXBlLnp6RW5jb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaT4+MzE7cmV0dXJuIHRoaXMuaGk9KCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSleZSk+Pj4wLHRoaXMubG89KHRoaXMubG88PDFeZSk+Pj4wLHRoaXN9LG8ucHJvdG90eXBlLnp6RGVjb2RlPWZ1bmN0aW9uKCl7dmFyIGU9LSgxJnRoaXMubG8pO3JldHVybiB0aGlzLmxvPSgodGhpcy5sbz4+PjF8dGhpcy5oaTw8MzEpXmUpPj4+MCx0aGlzLmhpPSh0aGlzLmhpPj4+MV5lKT4+PjAsdGhpc30sby5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sbyx0PSh0aGlzLmxvPj4+Mjh8dGhpcy5oaTw8NCk+Pj4wLG49dGhpcy5oaT4+PjI0O3JldHVybiAwPT09bj8wPT09dD9lPDE2Mzg0P2U8MTI4PzE6MjplPDIwOTcxNTI/Mzo0OnQ8MTYzODQ/dDwxMjg/NTo2OnQ8MjA5NzE1Mj83Ojg6bjwxMjg/OToxMH07fSw5NjkzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10O2Z1bmN0aW9uIG8oZSx0LG4pe2Zvcih2YXIgcj1PYmplY3Qua2V5cyh0KSxvPTA7bzxyLmxlbmd0aDsrK28pdm9pZCAwIT09ZVtyW29dXSYmbnx8KGVbcltvXV09dFtyW29dXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KGUsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHQpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOihuZXcgRXJyb3IpLnN0YWNrfHwiIn0pLG4mJm8odGhpcyxuKTt9cmV0dXJuIHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0sbmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDp2b2lkIDAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LHRvU3RyaW5nOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLHR9ci5hc1Byb21pc2U9big0NTM3KSxyLmJhc2U2ND1uKDc0MTkpLHIuRXZlbnRFbWl0dGVyPW4oOTIxMSksci5mbG9hdD1uKDk0NSksci5pbnF1aXJlPW4oNzE5OSksci51dGY4PW4oNDk5Nyksci5wb29sPW4oNjY2Miksci5Mb25nQml0cz1uKDE5NDUpLHIuaXNOb2RlPUJvb2xlYW4odm9pZCAwIT09Y29tbW9uanNHbG9iYWwmJmNvbW1vbmpzR2xvYmFsJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpLHIuZ2xvYmFsPXIuaXNOb2RlJiZjb21tb25qc0dsb2JhbHx8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmfHx0aGlzLHIuZW1wdHlBcnJheT1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdLHIuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZT9PYmplY3QuZnJlZXplKHt9KTp7fSxyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbihlKXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlJiZpc0Zpbml0ZShlKSYmTWF0aC5mbG9vcihlKT09PWV9LHIuaXNTdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuICJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZ30sci5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlfSxyLmlzc2V0PXIuaXNTZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW3RdO3JldHVybiAhKG51bGw9PW58fCFlLmhhc093blByb3BlcnR5KHQpKSYmKCJvYmplY3QiIT10eXBlb2Ygbnx8KEFycmF5LmlzQXJyYXkobik/bi5sZW5ndGg6T2JqZWN0LmtleXMobikubGVuZ3RoKT4wKX0sci5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci5pbnF1aXJlKCJidWZmZXIiKS5CdWZmZXI7cmV0dXJuIGUucHJvdG90eXBlLnV0ZjhXcml0ZT9lOm51bGx9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSgpLHIuX0J1ZmZlcl9mcm9tPW51bGwsci5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGwsci5uZXdCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuICJudW1iZXIiPT10eXBlb2YgZT9yLkJ1ZmZlcj9yLl9CdWZmZXJfYWxsb2NVbnNhZmUoZSk6bmV3IHIuQXJyYXkoZSk6ci5CdWZmZXI/ci5fQnVmZmVyX2Zyb20oZSk6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5P2U6bmV3IFVpbnQ4QXJyYXkoZSl9LHIuQXJyYXk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksci5Mb25nPXIuZ2xvYmFsLmRjb2RlSU8mJnIuZ2xvYmFsLmRjb2RlSU8uTG9uZ3x8ci5nbG9iYWwuTG9uZ3x8ci5pbnF1aXJlKCJsb25nIiksci5rZXkyUmU9L150cnVlfGZhbHNlfDB8MSQvLHIua2V5MzJSZT0vXi0/KD86MHxbMS05XVswLTldKikkLyxyLmtleTY0UmU9L14oPzpbXFx4MDAtXFx4ZmZdezh9fC0/KD86MHxbMS05XVswLTldKikpJC8sci5sb25nVG9IYXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlP3IuTG9uZ0JpdHMuZnJvbShlKS50b0hhc2goKTpyLkxvbmdCaXRzLnplcm9IYXNofSxyLmxvbmdGcm9tSGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXIuTG9uZ0JpdHMuZnJvbUhhc2goZSk7cmV0dXJuIHIuTG9uZz9yLkxvbmcuZnJvbUJpdHMobi5sbyxuLmhpLHQpOm4udG9OdW1iZXIoQm9vbGVhbih0KSl9LHIubWVyZ2U9byxyLmxjRmlyc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9LHIubmV3RXJyb3I9aSxyLlByb3RvY29sRXJyb3I9aSgiUHJvdG9jb2xFcnJvciIpLHIub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOysrbil0W2Vbbl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMpLG49ZS5sZW5ndGgtMTtuPi0xOy0tbilpZigxPT09dFtlW25dXSYmdm9pZCAwIT09dGhpc1tlW25dXSYmbnVsbCE9PXRoaXNbZVtuXV0pcmV0dXJuIGVbbl19fSxyLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbillW25dIT09dCYmZGVsZXRlIHRoaXNbZVtuXV07fX0sci50b0pTT05PcHRpb25zPXtsb25nczpTdHJpbmcsZW51bXM6U3RyaW5nLGJ5dGVzOlN0cmluZyxqc29uOiEwfSxyLl9jb25maWd1cmU9ZnVuY3Rpb24oKXt2YXIgZT1yLkJ1ZmZlcjtlPyhyLl9CdWZmZXJfZnJvbT1lLmZyb20hPT1VaW50OEFycmF5LmZyb20mJmUuZnJvbXx8ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IGUodCxuKX0sci5fQnVmZmVyX2FsbG9jVW5zYWZlPWUuYWxsb2NVbnNhZmV8fGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0pOnIuX0J1ZmZlcl9mcm9tPXIuX0J1ZmZlcl9hbGxvY1Vuc2FmZT1udWxsO307fSwxMTczOihlLHQsbik9PntlLmV4cG9ydHM9cDt2YXIgcixvPW4oOTY5MyksaT1vLkxvbmdCaXRzLHM9by5iYXNlNjQsYT1vLnV0Zjg7ZnVuY3Rpb24gdShlLHQsbil7dGhpcy5mbj1lLHRoaXMubGVuPXQsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1uO31mdW5jdGlvbiBsKCl7fWZ1bmN0aW9uIGMoZSl7dGhpcy5oZWFkPWUuaGVhZCx0aGlzLnRhaWw9ZS50YWlsLHRoaXMubGVuPWUubGVuLHRoaXMubmV4dD1lLnN0YXRlczt9ZnVuY3Rpb24gcCgpe3RoaXMubGVuPTAsdGhpcy5oZWFkPW5ldyB1KGwsMCwwKSx0aGlzLnRhaWw9dGhpcy5oZWFkLHRoaXMuc3RhdGVzPW51bGw7fXZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIG8uQnVmZmVyP2Z1bmN0aW9uKCl7cmV0dXJuIChwLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcn0pKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwfX07ZnVuY3Rpb24gZihlLHQsbil7dFtuXT0yNTUmZTt9ZnVuY3Rpb24gaChlLHQpe3RoaXMubGVuPWUsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD10O31mdW5jdGlvbiBnKGUsdCxuKXtmb3IoO2UuaGk7KXRbbisrXT0xMjcmZS5sb3wxMjgsZS5sbz0oZS5sbz4+Pjd8ZS5oaTw8MjUpPj4+MCxlLmhpPj4+PTc7Zm9yKDtlLmxvPjEyNzspdFtuKytdPTEyNyZlLmxvfDEyOCxlLmxvPWUubG8+Pj43O3RbbisrXT1lLmxvO31mdW5jdGlvbiBiKGUsdCxuKXt0W25dPTI1NSZlLHRbbisxXT1lPj4+OCYyNTUsdFtuKzJdPWU+Pj4xNiYyNTUsdFtuKzNdPWU+Pj4yNDt9cC5jcmVhdGU9ZCgpLHAuYWxsb2M9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvLkFycmF5KGUpfSxvLkFycmF5IT09QXJyYXkmJihwLmFsbG9jPW8ucG9vbChwLmFsbG9jLG8uQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KSkscC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IHUoZSx0LG4pLHRoaXMubGVuKz10LHRoaXN9LGgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpLGgucHJvdG90eXBlLmZuPWZ1bmN0aW9uKGUsdCxuKXtmb3IoO2U+MTI3Oyl0W24rK109MTI3JmV8MTI4LGU+Pj49Nzt0W25dPWU7fSxwLnByb3RvdHlwZS51aW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGVuKz0odGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBoKChlPj4+PTApPDEyOD8xOmU8MTYzODQ/MjplPDIwOTcxNTI/MzplPDI2ODQzNTQ1Nj80OjUsZSkpLmxlbix0aGlzfSxwLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gZTwwP3RoaXMuX3B1c2goZywxMCxpLmZyb21OdW1iZXIoZSkpOnRoaXMudWludDMyKGUpfSxwLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudWludDMyKChlPDwxXmU+PjMxKT4+PjApfSxwLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGcsdC5sZW5ndGgoKSx0KX0scC5wcm90b3R5cGUuaW50NjQ9cC5wcm90b3R5cGUudWludDY0LHAucHJvdG90eXBlLnNpbnQ2ND1mdW5jdGlvbihlKXt2YXIgdD1pLmZyb20oZSkuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaChnLHQubGVuZ3RoKCksdCl9LHAucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goZiwxLGU/MTowKX0scC5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaChiLDQsZT4+PjApfSxwLnByb3RvdHlwZS5zZml4ZWQzMj1wLnByb3RvdHlwZS5maXhlZDMyLHAucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGIsNCx0LmxvKS5fcHVzaChiLDQsdC5oaSl9LHAucHJvdG90eXBlLnNmaXhlZDY0PXAucHJvdG90eXBlLmZpeGVkNjQscC5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goby5mbG9hdC53cml0ZUZsb2F0TEUsNCxlKX0scC5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wdXNoKG8uZmxvYXQud3JpdGVEb3VibGVMRSw4LGUpfTt2YXIgbT1vLkFycmF5LnByb3RvdHlwZS5zZXQ/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDsrK3IpdFtuK3JdPWVbcl07fTtwLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aD4+PjA7aWYoIXQpcmV0dXJuIHRoaXMuX3B1c2goZiwxLDApO2lmKG8uaXNTdHJpbmcoZSkpe3ZhciBuPXAuYWxsb2ModD1zLmxlbmd0aChlKSk7cy5kZWNvZGUoZSxuLDApLGU9bjt9cmV0dXJuIHRoaXMudWludDMyKHQpLl9wdXNoKG0sdCxlKX0scC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWEubGVuZ3RoKGUpO3JldHVybiB0P3RoaXMudWludDMyKHQpLl9wdXNoKGEud3JpdGUsdCxlKTp0aGlzLl9wdXNoKGYsMSwwKX0scC5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgYyh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyB1KGwsMCwwKSx0aGlzLmxlbj0wLHRoaXN9LHAucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IHUobCwwLDApLHRoaXMubGVuPTApLHRoaXN9LHAucHJvdG90eXBlLmxkZWxpbT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZCx0PXRoaXMudGFpbCxuPXRoaXMubGVuO3JldHVybiB0aGlzLnJlc2V0KCkudWludDMyKG4pLG4mJih0aGlzLnRhaWwubmV4dD1lLm5leHQsdGhpcy50YWlsPXQsdGhpcy5sZW4rPW4pLHRoaXN9LHAucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmhlYWQubmV4dCx0PXRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLG49MDtlOyllLmZuKGUudmFsLHQsbiksbis9ZS5sZW4sZT1lLm5leHQ7cmV0dXJuIHR9LHAuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUscC5jcmVhdGU9ZCgpLHIuX2NvbmZpZ3VyZSgpO307fSwzMTU1OihlLHQsbik9PntlLmV4cG9ydHM9aTt2YXIgcj1uKDExNzMpOyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aTt2YXIgbz1uKDk2OTMpO2Z1bmN0aW9uIGkoKXtyLmNhbGwodGhpcyk7fWZ1bmN0aW9uIHMoZSx0LG4pe2UubGVuZ3RoPDQwP28udXRmOC53cml0ZShlLHQsbik6dC51dGY4V3JpdGU/dC51dGY4V3JpdGUoZSxuKTp0LndyaXRlKGUsbik7fWkuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe2kuYWxsb2M9by5fQnVmZmVyX2FsbG9jVW5zYWZlLGkud3JpdGVCeXRlc0J1ZmZlcj1vLkJ1ZmZlciYmby5CdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSYmInNldCI9PT1vLkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7aWYoZS5jb3B5KWUuY29weSh0LG4sMCxlLmxlbmd0aCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoOyl0W24rK109ZVtyKytdO307fSxpLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXtvLmlzU3RyaW5nKGUpJiYoZT1vLl9CdWZmZXJfZnJvbShlLCJiYXNlNjQiKSk7dmFyIHQ9ZS5sZW5ndGg+Pj4wO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKGkud3JpdGVCeXRlc0J1ZmZlcix0LGUpLHRoaXN9LGkucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1vLkJ1ZmZlci5ieXRlTGVuZ3RoKGUpO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKHMsdCxlKSx0aGlzfSxpLl9jb25maWd1cmUoKTt9LDQxNTQ6ZT0+e2UuZXhwb3J0cz0nInVzZSBzdHJpY3QiO3ZhciBlPXt9LGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKGEpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksdD1yLnBhcmVudFBvcnQ7dC5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgcz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+KDAsZXZhbCkocy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKyIvLyMgc291cmNlVVJMPSIrZSkscG9zdE1lc3NhZ2U6ZT0+dC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIG89ITEsZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO2E/cy53cml0ZVN5bmMoMixlKyJcXG4iKTpjb25zb2xlLmVycm9yKGUpfTtzZWxmLmFsZXJ0PWZ1bmN0aW9uKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIgIik7cG9zdE1lc3NhZ2Uoe2NtZDoiYWxlcnQiLHRleHQ6YSx0aHJlYWRJZDplLl9wdGhyZWFkX3NlbGYoKX0pfSxlLmluc3RhbnRpYXRlV2FzbT0oYSxyKT0+e3ZhciB0PWUud2FzbU1vZHVsZTtyZXR1cm4gZS53YXNtTW9kdWxlPW51bGwscihuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UodCxhKSl9LHNlbGYub251bmhhbmRsZWRyZWplY3Rpb249ZT0+e3Rocm93IGUucmVhc29uPz9lfSxzZWxmLm9ubWVzc2FnZT1mdW5jdGlvbiBhKHIpe3RyeXtpZigibG9hZCI9PT1yLmRhdGEuY21kKXtsZXQgcz1bXTtzZWxmLm9ubWVzc2FnZT1lPT5zLnB1c2goZSksc2VsZi5zdGFydFdvcmtlcj1yPT57ZT1yLHBvc3RNZXNzYWdlKHtjbWQ6ImxvYWRlZCJ9KTtmb3IobGV0IGUgb2YgcylhKGUpO3NlbGYub25tZXNzYWdlPWF9LGUud2FzbU1vZHVsZT1yLmRhdGEud2FzbU1vZHVsZTtmb3IoY29uc3QgYSBvZiByLmRhdGEuaGFuZGxlcnMpZVthXT0oLi4uZSk9Pntwb3N0TWVzc2FnZSh7Y21kOiJjYWxsSGFuZGxlciIsaGFuZGxlcjphLGFyZ3M6ZX0pfTtpZihlLndhc21NZW1vcnk9ci5kYXRhLndhc21NZW1vcnksZS5idWZmZXI9ZS53YXNtTWVtb3J5LmJ1ZmZlcixlLkVOVklST05NRU5UX0lTX1BUSFJFQUQ9ITAsInN0cmluZyI9PXR5cGVvZiByLmRhdGEudXJsT3JCbG9iKWltcG9ydFNjcmlwdHMoci5kYXRhLnVybE9yQmxvYik7ZWxzZXt2YXIgdD1VUkwuY3JlYXRlT2JqZWN0VVJMKHIuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHModCksVVJMLnJldm9rZU9iamVjdFVSTCh0KX1vcnRXYXNtVGhyZWFkZWQoZSl9ZWxzZSBpZigicnVuIj09PXIuZGF0YS5jbWQpe2UuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHIuZGF0YS5wdGhyZWFkX3B0ciwwLDAsMSksZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQoci5kYXRhLnB0aHJlYWRfcHRyKSxlLmVzdGFibGlzaFN0YWNrU3BhY2UoKSxlLlBUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKHIuZGF0YSksZS5QVGhyZWFkLnRocmVhZEluaXRUTFMoKSxvfHwobz0hMCk7dHJ5e2UuaW52b2tlRW50cnlQb2ludChyLmRhdGEuc3RhcnRfcm91dGluZSxyLmRhdGEuYXJnKX1jYXRjaChlKXtpZigidW53aW5kIiE9ZSl0aHJvdyBlfX1lbHNlImNhbmNlbCI9PT1yLmRhdGEuY21kP2UuX3B0aHJlYWRfc2VsZigpJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdCgtMSk6InNldGltbWVkaWF0ZSI9PT1yLmRhdGEudGFyZ2V0fHwoImNoZWNrTWFpbGJveCI9PT1yLmRhdGEuY21kP28mJmUuY2hlY2tNYWlsYm94KCk6ci5kYXRhLmNtZCYmKGQoIndvcmtlci5qcyByZWNlaXZlZCB1bmtub3duIGNvbW1hbmQgIityLmRhdGEuY21kKSxkKHIuZGF0YSkpKX1jYXRjaChhKXt0aHJvdyBlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQoKSxhfX07XG4nO30sNzA2NzooKT0+e30sMTI5NjooKT0+e30sNzYwOigpPT57fSwxMzg0OigpPT57fSwzOTkzOigpPT57fSw5MDg6KCk9Pnt9LDY5NTM6KCk9Pnt9LDk5MjU6KCk9Pnt9LDI4MDY6KCk9Pnt9LDY0NDk6KCk9Pnt9LDI4NTA6KCk9Pnt9LDUzODE6KCk9Pnt9LDY4NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc29sdmVCYWNrZW5kPXQucmVnaXN0ZXJCYWNrZW5kPXZvaWQgMDtjb25zdCBuPXt9LHI9W107dC5yZWdpc3RlckJhY2tlbmQ9KGUsdCxvKT0+e2lmKCF0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5pbml0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jcmVhdGVTZXNzaW9uSGFuZGxlcil0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSB2YWxpZCBiYWNrZW5kIik7e2NvbnN0IGk9bltlXTtpZih2b2lkIDA9PT1pKW5bZV09e2JhY2tlbmQ6dCxwcmlvcml0eTpvfTtlbHNlIHtpZihpLnByaW9yaXR5Pm8pcmV0dXJuO2lmKGkucHJpb3JpdHk9PT1vJiZpLmJhY2tlbmQhPT10KXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlZ2lzdGVyIGJhY2tlbmQgIiR7ZX0iIHVzaW5nIHByaW9yaXR5ICR7b31gKX1pZihvPj0wKXtjb25zdCB0PXIuaW5kZXhPZihlKTstMSE9PXQmJnIuc3BsaWNlKHQsMSk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspaWYobltyW3RdXS5wcmlvcml0eTw9bylyZXR1cm4gdm9pZCByLnNwbGljZSh0LDAsZSk7ci5wdXNoKGUpO319fSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGU9Pntjb25zdCB0PTA9PT1lLmxlbmd0aD9yOmUsbz1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PW5bZV07aWYodCl7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZCljb250aW51ZTtjb25zdCBuPSEhdC5pbml0UHJvbWlzZTt0cnl7cmV0dXJuIG58fCh0LmluaXRQcm9taXNlPXQuYmFja2VuZC5pbml0KCkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2gocil7bnx8by5wdXNoKHtuYW1lOmUsZXJyOnJ9KSx0LmFib3J0ZWQ9ITA7fWZpbmFsbHl7ZGVsZXRlIHQuaW5pdFByb21pc2U7fX19dGhyb3cgbmV3IEVycm9yKGBubyBhdmFpbGFibGUgYmFja2VuZCBmb3VuZC4gRVJSOiAke28ubWFwKChlPT5gWyR7ZS5uYW1lfV0gJHtlLmVycn1gKSkuam9pbigiLCAiKX1gKX07fSw0Nzk4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWdpc3RlckJhY2tlbmQ9dm9pZCAwO3ZhciByPW4oNjg1KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJCYWNrZW5kIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5yZWdpc3RlckJhY2tlbmR9fSk7fSwzMTIxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbnY9dm9pZCAwO2NvbnN0IHI9big5MTA0KTtsZXQgbz0id2FybmluZyI7dC5lbnY9e3dhc206e30sd2ViZ2w6e30sd2ViZ3B1Ont9LHZlcnNpb25zOntjb21tb246ci52ZXJzaW9ufSxzZXQgbG9nTGV2ZWwoZSl7aWYodm9pZCAwIT09ZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlfHwtMT09PVsidmVyYm9zZSIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJmYXRhbCJdLmluZGV4T2YoZSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCk7bz1lO319LGdldCBsb2dMZXZlbCgpe3JldHVybiBvfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZW52LCJsb2dMZXZlbCIse2VudW1lcmFibGU6ITB9KTt9LDI0NTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmVudj12b2lkIDA7Y29uc3Qgcj1uKDMxMjEpO3QuZW52PXIuZW52O30sMjIzNTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oNDc5OCksdCksbyhuKDI0NTcpLHQpLG8obigzOTc0KSx0KSxvKG4oOTYzKSx0KSxvKG4oNzg1MiksdCk7fSw4MDM2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5JbmZlcmVuY2VTZXNzaW9uPXZvaWQgMDtjb25zdCByPW4oNjg1KSxvPW4oOTYzKTtjbGFzcyBpe2NvbnN0cnVjdG9yKGUpe3RoaXMuaGFuZGxlcj1lO31hc3luYyBydW4oZSx0LG4pe2NvbnN0IHI9e307bGV0IGk9e307aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8ZSBpbnN0YW5jZW9mIG8uVGVuc29yfHxBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZWVkcycgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCB1c2UgaW5wdXQgbmFtZXMgYXMga2V5cyBhbmQgT25ueFZhbHVlIGFzIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiIpO2xldCBzPSEwO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7aWYobnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFsxXTogY2Fubm90IGJlIG51bGwuIik7aWYodCBpbnN0YW5jZW9mIG8uVGVuc29yKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYSBUZW5zb3IiKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4iKTtzPSExO2Zvcihjb25zdCBlIG9mIHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgbXVzdCBiZSBhIHN0cmluZyBhcnJheSBvciBhbiBvYmplY3QuIik7aWYoLTE9PT10aGlzLm91dHB1dE5hbWVzLmluZGV4T2YoZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdmZXRjaGVzJyBjb250YWlucyBpbnZhbGlkIG91dHB1dCBuYW1lOiAke2V9LmApO3JbZV09bnVsbDt9aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtsZXQgZT0hMTtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2Zvcihjb25zdCBuIG9mIHRoaXMub3V0cHV0TmFtZXMpaWYoLTEhPT1hLmluZGV4T2Yobikpe2NvbnN0IGk9dFtuXTsobnVsbD09PWl8fGkgaW5zdGFuY2VvZiBvLlRlbnNvcikmJihlPSEwLHM9ITEscltuXT1pKTt9aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGk9dDt9fWVsc2UgaWYodm9pZCAwIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBtdXN0IGJlICdmZXRjaGVzJyBvciAnb3B0aW9ucycuIik7Zm9yKGNvbnN0IHQgb2YgdGhpcy5pbnB1dE5hbWVzKWlmKHZvaWQgMD09PWVbdF0pdGhyb3cgbmV3IEVycm9yKGBpbnB1dCAnJHt0fScgaXMgbWlzc2luZyBpbiAnZmVlZHMnLmApO2lmKHMpZm9yKGNvbnN0IGUgb2YgdGhpcy5vdXRwdXROYW1lcylyW2VdPW51bGw7Y29uc3QgYT1hd2FpdCB0aGlzLmhhbmRsZXIucnVuKGUscixpKSx1PXt9O2Zvcihjb25zdCBlIGluIGEpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYSxlKSYmKHVbZV09bmV3IG8uVGVuc29yKGFbZV0udHlwZSxhW2VdLmRhdGEsYVtlXS5kaW1zKSk7cmV0dXJuIHV9YXN5bmMgcmVsZWFzZSgpe3JldHVybiB0aGlzLmhhbmRsZXIuZGlzcG9zZSgpfXN0YXRpYyBhc3luYyBjcmVhdGUoZSx0LG4sbyl7bGV0IHMsYT17fTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2Uge2lmKCEoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMF06IG11c3QgYmUgJ3BhdGgnIG9yICdidWZmZXInLiIpO3tjb25zdCByPWU7bGV0IGk9MCx1PWUuYnl0ZUxlbmd0aDtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoaT10LCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVPZmZzZXQnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZihpPDB8fGk+PXIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVPZmZzZXQnIGlzIG91dCBvZiByYW5nZSBbMCwgJHtyLmJ5dGVMZW5ndGh9KS5gKTtpZih1PWUuYnl0ZUxlbmd0aC1pLCJudW1iZXIiPT10eXBlb2Ygbil7aWYodT1uLCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZih1PD0wfHxpK3U+ci5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKGAnYnl0ZUxlbmd0aCcgaXMgb3V0IG9mIHJhbmdlICgwLCAke3IuYnl0ZUxlbmd0aC1pfV0uYCk7aWYoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09bylhPW87ZWxzZSBpZih2b2lkIDAhPT1vKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYSBudW1iZXIuIil9ZWxzZSBpZih2b2lkIDAhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKTtzPW5ldyBVaW50OEFycmF5KHIsaSx1KTt9fWNvbnN0IHU9KGEuZXhlY3V0aW9uUHJvdmlkZXJzfHxbXSkubWFwKChlPT4ic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSxsPWF3YWl0KDAsIHIucmVzb2x2ZUJhY2tlbmQpKHUpLGM9YXdhaXQgbC5jcmVhdGVTZXNzaW9uSGFuZGxlcihzLGEpO3JldHVybiBuZXcgaShjKX1zdGFydFByb2ZpbGluZygpe3RoaXMuaGFuZGxlci5zdGFydFByb2ZpbGluZygpO31lbmRQcm9maWxpbmcoKXt0aGlzLmhhbmRsZXIuZW5kUHJvZmlsaW5nKCk7fWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5pbnB1dE5hbWVzfWdldCBvdXRwdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIub3V0cHV0TmFtZXN9fXQuSW5mZXJlbmNlU2Vzc2lvbj1pO30sMzk3NDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSW5mZXJlbmNlU2Vzc2lvbj12b2lkIDA7Y29uc3Qgcj1uKDgwMzYpO3QuSW5mZXJlbmNlU2Vzc2lvbj1yLkluZmVyZW5jZVNlc3Npb247fSw3ODUyOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO30sMjM1MDooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRlbnNvclRvSW1hZ2VEYXRhPXQudGVuc29yVG9EYXRhVVJMPXZvaWQgMCx0LnRlbnNvclRvRGF0YVVSTD0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bi53aWR0aD1lLmRpbXNbM10sbi5oZWlnaHQ9ZS5kaW1zWzJdO2NvbnN0IHI9bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGwhPXIpe2xldCBvLGk7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSk7Y29uc3Qgcz12b2lkIDAhPT10Py5mb3JtYXQ/dC5mb3JtYXQ6IlJHQiIsYT10Py5ub3JtO2xldCB1LGw7dm9pZCAwPT09YXx8dm9pZCAwPT09YS5tZWFuP3U9WzI1NSwyNTUsMjU1LDI1NV06Im51bWJlciI9PXR5cGVvZiBhLm1lYW4/dT1bYS5tZWFuLGEubWVhbixhLm1lYW4sYS5tZWFuXToodT1bYS5tZWFuWzBdLGEubWVhblsxXSxhLm1lYW5bMl0sMF0sdm9pZCAwIT09YS5tZWFuWzNdJiYodVszXT1hLm1lYW5bM10pKSx2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLmJpYXM/bD1bMCwwLDAsMF06Im51bWJlciI9PXR5cGVvZiBhLmJpYXM/bD1bYS5iaWFzLGEuYmlhcyxhLmJpYXMsYS5iaWFzXToobD1bYS5iaWFzWzBdLGEuYmlhc1sxXSxhLmJpYXNbMl0sMF0sdm9pZCAwIT09YS5iaWFzWzNdJiYobFszXT1hLmJpYXNbM10pKTtjb25zdCBjPWkqbztsZXQgcD0wLGQ9YyxmPTIqYyxoPS0xOyJSR0JBIj09PXM/KHA9MCxkPWMsZj0yKmMsaD0zKmMpOiJSR0IiPT09cz8ocD0wLGQ9YyxmPTIqYyk6IlJCRyI9PT1zJiYocD0wLGY9YyxkPTIqYyk7Zm9yKGxldCB0PTA7dDxpO3QrKylmb3IobGV0IG49MDtuPG87bisrKXtjb25zdCBvPShlLmRhdGFbcCsrXS1sWzBdKSp1WzBdLGk9KGUuZGF0YVtkKytdLWxbMV0pKnVbMV0scz0oZS5kYXRhW2YrK10tbFsyXSkqdVsyXSxhPS0xPT09aD8yNTU6KGUuZGF0YVtoKytdLWxbM10pKnVbM107ci5maWxsU3R5bGU9InJnYmEoIitvKyIsIitpKyIsIitzKyIsIithKyIpIixyLmZpbGxSZWN0KG4sdCwxLDEpO31yZXR1cm4gbi50b0RhdGFVUkwoKX10aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX0sdC50ZW5zb3JUb0ltYWdlRGF0YT0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtsZXQgcjtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgbyxpLHM7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbMV0scz1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSxzPWUuZGltc1sxXSk7Y29uc3QgYT12b2lkIDAhPT10JiZ2b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCIix1PXQ/Lm5vcm07bGV0IGwsYzt2b2lkIDA9PT11fHx2b2lkIDA9PT11Lm1lYW4/bD1bMjU1LDI1NSwyNTUsMjU1XToibnVtYmVyIj09dHlwZW9mIHUubWVhbj9sPVt1Lm1lYW4sdS5tZWFuLHUubWVhbix1Lm1lYW5dOihsPVt1Lm1lYW5bMF0sdS5tZWFuWzFdLHUubWVhblsyXSwyNTVdLHZvaWQgMCE9PXUubWVhblszXSYmKGxbM109dS5tZWFuWzNdKSksdm9pZCAwPT09dXx8dm9pZCAwPT09dS5iaWFzP2M9WzAsMCwwLDBdOiJudW1iZXIiPT10eXBlb2YgdS5iaWFzP2M9W3UuYmlhcyx1LmJpYXMsdS5iaWFzLHUuYmlhc106KGM9W3UuYmlhc1swXSx1LmJpYXNbMV0sdS5iaWFzWzJdLDBdLHZvaWQgMCE9PXUuYmlhc1szXSYmKGNbM109dS5iaWFzWzNdKSk7Y29uc3QgcD1pKm87aWYodm9pZCAwIT09dCYmKHZvaWQgMCE9PXQuZm9ybWF0JiY0PT09cyYmIlJHQkEiIT09dC5mb3JtYXR8fDM9PT1zJiYiUkdCIiE9PXQuZm9ybWF0JiYiQkdSIiE9PXQuZm9ybWF0KSl0aHJvdyBuZXcgRXJyb3IoIlRlbnNvciBmb3JtYXQgZG9lc24ndCBtYXRjaCBpbnB1dCB0ZW5zb3IgZGltcyIpO2NvbnN0IGQ9NDtsZXQgZj0wLGg9MSxnPTIsYj0zLG09MCx5PXAsdj0yKnAsXz0tMTsiUkdCQSI9PT1hPyhtPTAseT1wLHY9MipwLF89MypwKToiUkdCIj09PWE/KG09MCx5PXAsdj0yKnApOiJSQkciPT09YSYmKG09MCx2PXAseT0yKnApLHI9bi5jcmVhdGVJbWFnZURhdGEobyxpKTtmb3IobGV0IHQ9MDt0PGkqbztmKz1kLGgrPWQsZys9ZCxiKz1kLHQrKylyLmRhdGFbZl09KGUuZGF0YVttKytdLWNbMF0pKmxbMF0sci5kYXRhW2hdPShlLmRhdGFbeSsrXS1jWzFdKSpsWzFdLHIuZGF0YVtnXT0oZS5kYXRhW3YrK10tY1syXSkqbFsyXSxyLmRhdGFbYl09LTE9PT1fPzI1NTooZS5kYXRhW18rK10tY1szXSkqbFszXTt9cmV0dXJuIHJ9O30sNDg2NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudGVuc29yRnJvbUltYWdlPXQuYnVmZmVyVG9UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big5NjMpO3QuYnVmZmVyVG9UZW5zb3I9KGUsdCk9PntpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgYnVmZmVyIG11c3QgYmUgZGVmaW5lZCIpO2lmKHZvaWQgMD09PXQuaGVpZ2h0fHx2b2lkIDA9PT10LndpZHRoKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGRlZmluZWQiKTtpZigiTkhXQyI9PT10LnRlbnNvckxheW91dCl0aHJvdyBuZXcgRXJyb3IoIk5IV0MgVGVuc29yIGxheW91dCBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0e2hlaWdodDpuLHdpZHRoOm99PXQsaT10Lm5vcm0/P3ttZWFuOjI1NSxiaWFzOjB9O2xldCBzLGE7cz0ibnVtYmVyIj09dHlwZW9mIGkubWVhbj9baS5tZWFuLGkubWVhbixpLm1lYW4saS5tZWFuXTpbaS5tZWFuWzBdLGkubWVhblsxXSxpLm1lYW5bMl0saS5tZWFuWzNdPz8yNTVdLGE9Im51bWJlciI9PXR5cGVvZiBpLmJpYXM/W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLGkuYmlhc1szXT8/MF07Y29uc3QgdT12b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCQSIsbD12b2lkIDAhPT10LnRlbnNvckZvcm1hdCYmdm9pZCAwIT09dC50ZW5zb3JGb3JtYXQ/dC50ZW5zb3JGb3JtYXQ6IlJHQiIsYz1uKm8scD0iUkdCQSI9PT1sP25ldyBGbG9hdDMyQXJyYXkoNCpjKTpuZXcgRmxvYXQzMkFycmF5KDMqYyk7bGV0IGQ9NCxmPTAsaD0xLGc9MixiPTMsbT0wLHk9Yyx2PTIqYyxfPS0xOyJSR0IiPT09dSYmKGQ9MyxmPTAsaD0xLGc9MixiPS0xKSwiUkdCQSI9PT1sP189MypjOiJSQkciPT09bD8obT0wLHY9Yyx5PTIqYyk6IkJHUiI9PT1sJiYodj0wLHk9YyxtPTIqYyk7Zm9yKGxldCB0PTA7dDxjO3QrKyxmKz1kLGcrPWQsaCs9ZCxiKz1kKXBbbSsrXT0oZVtmXSthWzBdKS9zWzBdLHBbeSsrXT0oZVtoXSthWzFdKS9zWzFdLHBbdisrXT0oZVtnXSthWzJdKS9zWzJdLC0xIT09XyYmLTEhPT1iJiYocFtfKytdPShlW2JdK2FbM10pL3NbM10pO3JldHVybiAiUkdCQSI9PT1sP25ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSw0LG4sb10pOm5ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSwzLG4sb10pfSx0LnRlbnNvckZyb21JbWFnZT1hc3luYyhlLG4pPT57Y29uc3Qgcj0idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50LG89InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZURhdGEmJmUgaW5zdGFuY2VvZiBJbWFnZURhdGEsaT0idW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAscz0ic3RyaW5nIj09dHlwZW9mIGU7bGV0IGEsdT1uPz97fTtpZihyKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Qud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodDtjb25zdCByPXQuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgdD1lLmhlaWdodCxvPWUud2lkdGg7aWYodm9pZCAwIT09biYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0JiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmKHQ9bi5yZXNpemVkSGVpZ2h0LG89bi5yZXNpemVkV2lkdGgpLHZvaWQgMCE9PW4pe2lmKHU9bix2b2lkIDAhPT1uLnRlbnNvckZvcm1hdCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7dS50ZW5zb3JGb3JtYXQ9IlJHQkEiLHUuaGVpZ2h0PXQsdS53aWR0aD1vO31lbHNlIHUudGVuc29yRm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9bztyLmRyYXdJbWFnZShlLDAsMCksYT1yLmdldEltYWdlRGF0YSgwLDAsbyx0KS5kYXRhO319ZWxzZSB7aWYoIW8pe2lmKGkpe2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBpbWFnZSBjb25maWcgd2l0aCBmb3JtYXQgZm9yIEltYWdlYml0bWFwIik7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyLndpZHRoPWUud2lkdGgsci5oZWlnaHQ9ZS5oZWlnaHQ7Y29uc3Qgbz1yLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9byl7Y29uc3Qgbj1lLmhlaWdodCxyPWUud2lkdGg7cmV0dXJuIG8uZHJhd0ltYWdlKGUsMCwwLHIsbiksYT1vLmdldEltYWdlRGF0YSgwLDAscixuKS5kYXRhLHUuaGVpZ2h0PW4sdS53aWR0aD1yLCgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpfXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWlmKHMpcmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT1vLmdldENvbnRleHQoIjJkIik7aWYoIWV8fCFpKXJldHVybiByKCk7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5jcm9zc09yaWdpbj0iQW5vbnltb3VzIixzLnNyYz1lLHMub25sb2FkPSgpPT57by53aWR0aD1zLndpZHRoLG8uaGVpZ2h0PXMuaGVpZ2h0LGkuZHJhd0ltYWdlKHMsMCwwLG8ud2lkdGgsby5oZWlnaHQpO2NvbnN0IGU9aS5nZXRJbWFnZURhdGEoMCwwLG8ud2lkdGgsby5oZWlnaHQpO3UuaGVpZ2h0PW8uaGVpZ2h0LHUud2lkdGg9by53aWR0aCxuKCgwLCB0LmJ1ZmZlclRvVGVuc29yKShlLmRhdGEsdSkpO307fSkpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX17bGV0IHQscjtpZih2b2lkIDAhPT1uJiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0Pyh0PW4ucmVzaXplZEhlaWdodCxyPW4ucmVzaXplZFdpZHRoKToodD1lLmhlaWdodCxyPWUud2lkdGgpLHZvaWQgMCE9PW4mJih1PW4pLHUuZm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9cix2b2lkIDAhPT1uKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO24ud2lkdGg9cixuLmhlaWdodD10O2NvbnN0IG89bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGw9PW8pdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7by5wdXRJbWFnZURhdGEoZSwwLDApLGE9by5nZXRJbWFnZURhdGEoMCwwLHIsdCkuZGF0YTt9ZWxzZSBhPWUuZGF0YTt9fWlmKHZvaWQgMCE9PWEpcmV0dXJuICgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX07fSw1OTU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9bigyMzUwKSxvPW4oNDg2NiksaT1uKDEwNikscz1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJmbG9hdDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XV0pLGE9bmV3IE1hcChbW0Zsb2F0MzJBcnJheSwiZmxvYXQzMiJdLFtVaW50OEFycmF5LCJ1aW50OCJdLFtJbnQ4QXJyYXksImludDgiXSxbVWludDE2QXJyYXksInVpbnQxNiJdLFtJbnQxNkFycmF5LCJpbnQxNiJdLFtJbnQzMkFycmF5LCJpbnQzMiJdLFtGbG9hdDY0QXJyYXksImZsb2F0NjQiXSxbVWludDMyQXJyYXksInVpbnQzMiJdXSk7bGV0IHU9ITE7dC5UZW5zb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe2xldCByLG8sbDtpZigoKCk9PntpZighdSl7dT0hMDtjb25zdCBlPSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnSW50NjRBcnJheSYmImZ1bmN0aW9uIj09dHlwZW9mIEJpZ0ludDY0QXJyYXkuZnJvbSx0PSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnVWludDY0QXJyYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBCaWdVaW50NjRBcnJheS5mcm9tO2UmJihzLnNldCgiaW50NjQiLEJpZ0ludDY0QXJyYXkpLGEuc2V0KEJpZ0ludDY0QXJyYXksImludDY0IikpLHQmJihzLnNldCgidWludDY0IixCaWdVaW50NjRBcnJheSksYS5zZXQoQmlnVWludDY0QXJyYXksInVpbnQ2NCIpKTt9fSkoKSwic3RyaW5nIj09dHlwZW9mIGUpaWYocj1lLGw9biwic3RyaW5nIj09PWUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgc3RyaW5nIHRlbnNvcidzIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBhcnJheS4iKTtvPXQ7fWVsc2Uge2NvbnN0IG49cy5nZXQoZSk7aWYodm9pZCAwPT09bil0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0ZW5zb3IgdHlwZTogJHtlfS5gKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigiZmxvYXQxNiI9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkNyZWF0aW5nIGEgZmxvYXQxNiB0ZW5zb3IgZnJvbSBudW1iZXIgYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBVaW50MTZBcnJheSBhcyBkYXRhLiIpO289InVpbnQ2NCI9PT1lfHwiaW50NjQiPT09ZT9uLmZyb20odCxCaWdJbnQpOm4uZnJvbSh0KTt9ZWxzZSB7aWYoISh0IGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihgQSAke3J9IHRlbnNvcidzIGRhdGEgbXVzdCBiZSB0eXBlIG9mICR7bn1gKTtvPXQ7fX1lbHNlIGlmKGw9dCxBcnJheS5pc0FycmF5KGUpKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7Y29uc3QgdD10eXBlb2YgZVswXTtpZigic3RyaW5nIj09PXQpcj0ic3RyaW5nIixvPWU7ZWxzZSB7aWYoImJvb2xlYW4iIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBvZiBkYXRhIGFycmF5OiAke3R9LmApO3I9ImJvb2wiLG89VWludDhBcnJheS5mcm9tKGUpO319ZWxzZSB7Y29uc3QgdD1hLmdldChlLmNvbnN0cnVjdG9yKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRlbnNvciBkYXRhOiAke2UuY29uc3RydWN0b3J9LmApO3I9dCxvPWU7fWlmKHZvaWQgMD09PWwpbD1bby5sZW5ndGhdO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSB0ZW5zb3IncyBkaW1zIG11c3QgYmUgYSBudW1iZXIgYXJyYXkiKTtjb25zdCBjPSgwLCBpLmNhbGN1bGF0ZVNpemUpKGwpO2lmKGMhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRlbnNvcidzIHNpemUoJHtjfSkgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGgoJHtvLmxlbmd0aH0pLmApO3RoaXMuZGltcz1sLHRoaXMudHlwZT1yLHRoaXMuZGF0YT1vLHRoaXMuc2l6ZT1jO31zdGF0aWMgYXN5bmMgZnJvbUltYWdlKGUsdCl7cmV0dXJuICgwLCBvLnRlbnNvckZyb21JbWFnZSkoZSx0KX10b0RhdGFVUkwoZSl7cmV0dXJuICgwLCByLnRlbnNvclRvRGF0YVVSTCkodGhpcyxlKX10b0ltYWdlRGF0YShlKXtyZXR1cm4gKDAsIHIudGVuc29yVG9JbWFnZURhdGEpKHRoaXMsZSl9cmVzaGFwZShlKXtyZXR1cm4gKDAsIGkudGVuc29yUmVzaGFwZSkodGhpcyxlKX19O30sMTA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50ZW5zb3JSZXNoYXBlPXQuY2FsY3VsYXRlU2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDk2Myk7dC5jYWxjdWxhdGVTaXplPWU9PntsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07aWYoIm51bWJlciIhPXR5cGVvZiByfHwhTnVtYmVyLmlzU2FmZUludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGFuIGludGVnZXIsIGdvdDogJHtyfWApO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdDogJHtyfWApO3QqPXI7fXJldHVybiB0fSx0LnRlbnNvclJlc2hhcGU9KGUsdCk9Pm5ldyByLlRlbnNvcihlLnR5cGUsZS5kYXRhLHQpO30sOTYzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big1OTU3KTt0LlRlbnNvcj1yLlRlbnNvcjt9LDkxMDQ6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC52ZXJzaW9uPXZvaWQgMCx0LnZlcnNpb249IjEuMTYuMyI7fSwxNTgzOihlLHQpPT57dmFyIG4scj1mdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXZvaWQgMDt2YXIgdD1udWxsO3RyeXt0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0czt9Y2F0Y2goZSl7fWZ1bmN0aW9uIG4oZSx0LG4pe3RoaXMubG93PTB8ZSx0aGlzLmhpZ2g9MHx0LHRoaXMudW5zaWduZWQ9ISFuO31mdW5jdGlvbiByKGUpe3JldHVybiAhMD09PShlJiZlLl9faXNMb25nX18pfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9TWF0aC5jbHozMihlJi1lKTtyZXR1cm4gZT8zMS10OnR9bi5wcm90b3R5cGUuX19pc0xvbmdfXyxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsIl9faXNMb25nX18iLHt2YWx1ZTohMH0pLG4uaXNMb25nPXI7dmFyIGk9e30scz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG4scixvO3JldHVybiB0PyhvPTA8PShlPj4+PTApJiZlPDI1NikmJihyPXNbZV0pP3I6KG49bChlLDAsITApLG8mJihzW2VdPW4pLG4pOihvPS0xMjg8PShlfD0wKSYmZTwxMjgpJiYocj1pW2VdKT9yOihuPWwoZSxlPDA/LTE6MCwhMSksbyYmKGlbZV09biksbil9ZnVuY3Rpb24gdShlLHQpe2lmKGlzTmFOKGUpKXJldHVybiB0P3k6bTtpZih0KXtpZihlPDApcmV0dXJuIHk7aWYoZT49aClyZXR1cm4geH1lbHNlIHtpZihlPD0tZylyZXR1cm4gTztpZihlKzE+PWcpcmV0dXJuIFR9cmV0dXJuIGU8MD91KC1lLHQpLm5lZygpOmwoZSVmfDAsZS9mfDAsdCl9ZnVuY3Rpb24gbChlLHQscil7cmV0dXJuIG5ldyBuKGUsdCxyKX1uLmZyb21JbnQ9YSxuLmZyb21OdW1iZXI9dSxuLmZyb21CaXRzPWw7dmFyIGM9TWF0aC5wb3c7ZnVuY3Rpb24gcChlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IEVycm9yKCJlbXB0eSBzdHJpbmciKTtpZigibnVtYmVyIj09dHlwZW9mIHQ/KG49dCx0PSExKTp0PSEhdCwiTmFOIj09PWV8fCJJbmZpbml0eSI9PT1lfHwiK0luZmluaXR5Ij09PWV8fCItSW5maW5pdHkiPT09ZSlyZXR1cm4gdD95Om07aWYoKG49bnx8MTApPDJ8fDM2PG4pdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTt2YXIgcjtpZigocj1lLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBFcnJvcigiaW50ZXJpb3IgaHlwaGVuIik7aWYoMD09PXIpcmV0dXJuIHAoZS5zdWJzdHJpbmcoMSksdCxuKS5uZWcoKTtmb3IodmFyIG89dShjKG4sOCkpLGk9bSxzPTA7czxlLmxlbmd0aDtzKz04KXt2YXIgYT1NYXRoLm1pbig4LGUubGVuZ3RoLXMpLGw9cGFyc2VJbnQoZS5zdWJzdHJpbmcocyxzK2EpLG4pO2lmKGE8OCl7dmFyIGQ9dShjKG4sYSkpO2k9aS5tdWwoZCkuYWRkKHUobCkpO31lbHNlIGk9KGk9aS5tdWwobykpLmFkZCh1KGwpKTt9cmV0dXJuIGkudW5zaWduZWQ9dCxpfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlP3UoZSx0KToic3RyaW5nIj09dHlwZW9mIGU/cChlLHQpOmwoZS5sb3csZS5oaWdoLCJib29sZWFuIj09dHlwZW9mIHQ/dDplLnVuc2lnbmVkKX1uLmZyb21TdHJpbmc9cCxuLmZyb21WYWx1ZT1kO3ZhciBmPTQyOTQ5NjcyOTYsaD1mKmYsZz1oLzIsYj1hKDE8PDI0KSxtPWEoMCk7bi5aRVJPPW07dmFyIHk9YSgwLCEwKTtuLlVaRVJPPXk7dmFyIHY9YSgxKTtuLk9ORT12O3ZhciBfPWEoMSwhMCk7bi5VT05FPV87dmFyIHc9YSgtMSk7bi5ORUdfT05FPXc7dmFyIFQ9bCgtMSwyMTQ3NDgzNjQ3LCExKTtuLk1BWF9WQUxVRT1UO3ZhciB4PWwoLTEsLTEsITApO24uTUFYX1VOU0lHTkVEX1ZBTFVFPXg7dmFyIE89bCgwLC0yMTQ3NDgzNjQ4LCExKTtuLk1JTl9WQUxVRT1PO3ZhciBTPW4ucHJvdG90eXBlO1MudG9JbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9LFMudG9OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqZisodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqZisodGhpcy5sb3c+Pj4wKX0sUy50b1N0cmluZz1mdW5jdGlvbihlKXtpZigoZT1lfHwxMCk8Mnx8MzY8ZSl0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuICIwIjtpZih0aGlzLmlzTmVnYXRpdmUoKSl7aWYodGhpcy5lcShPKSl7dmFyIHQ9dShlKSxuPXRoaXMuZGl2KHQpLHI9bi5tdWwodCkuc3ViKHRoaXMpO3JldHVybiBuLnRvU3RyaW5nKGUpK3IudG9JbnQoKS50b1N0cmluZyhlKX1yZXR1cm4gIi0iK3RoaXMubmVnKCkudG9TdHJpbmcoZSl9Zm9yKHZhciBvPXUoYyhlLDYpLHRoaXMudW5zaWduZWQpLGk9dGhpcyxzPSIiOzspe3ZhciBhPWkuZGl2KG8pLGw9KGkuc3ViKGEubXVsKG8pKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYoKGk9YSkuaXNaZXJvKCkpcmV0dXJuIGwrcztmb3IoO2wubGVuZ3RoPDY7KWw9IjAiK2w7cz0iIitsK3M7fX0sUy5nZXRIaWdoQml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2h9LFMuZ2V0SGlnaEJpdHNVbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfSxTLmdldExvd0JpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3d9LFMuZ2V0TG93Qml0c1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93Pj4+MH0sUy5nZXROdW1CaXRzQWJzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoTyk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Zm9yKHZhciBlPTAhPXRoaXMuaGlnaD90aGlzLmhpZ2g6dGhpcy5sb3csdD0zMTt0PjAmJiEoZSYxPDx0KTt0LS0pO3JldHVybiAwIT10aGlzLmhpZ2g/dCszMzp0KzF9LFMuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmhpZ2gmJjA9PT10aGlzLmxvd30sUy5lcXo9Uy5pc1plcm8sUy5pc05lZ2F0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuICF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g8MH0sUy5pc1Bvc2l0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaD49MH0sUy5pc09kZD1mdW5jdGlvbigpe3JldHVybiAhKDEmfnRoaXMubG93KX0sUy5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gISgxJnRoaXMubG93KX0sUy5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLCh0aGlzLnVuc2lnbmVkPT09ZS51bnNpZ25lZHx8dGhpcy5oaWdoPj4+MzEhPTF8fGUuaGlnaD4+PjMxIT0xKSYmdGhpcy5oaWdoPT09ZS5oaWdoJiZ0aGlzLmxvdz09PWUubG93fSxTLmVxPVMuZXF1YWxzLFMubm90RXF1YWxzPWZ1bmN0aW9uKGUpe3JldHVybiAhdGhpcy5lcShlKX0sUy5uZXE9Uy5ub3RFcXVhbHMsUy5uZT1TLm5vdEVxdWFscyxTLmxlc3NUaGFuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8MH0sUy5sdD1TLmxlc3NUaGFuLFMubGVzc1RoYW5PckVxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8PTB9LFMubHRlPVMubGVzc1RoYW5PckVxdWFsLFMubGU9Uy5sZXNzVGhhbk9yRXF1YWwsUy5ncmVhdGVyVGhhbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wKGUpPjB9LFMuZ3Q9Uy5ncmVhdGVyVGhhbixTLmdyZWF0ZXJUaGFuT3JFcXVhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wKGUpPj0wfSxTLmd0ZT1TLmdyZWF0ZXJUaGFuT3JFcXVhbCxTLmdlPVMuZ3JlYXRlclRoYW5PckVxdWFsLFMuY29tcGFyZT1mdW5jdGlvbihlKXtpZihyKGUpfHwoZT1kKGUpKSx0aGlzLmVxKGUpKXJldHVybiAwO3ZhciB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfSxTLmNvbXA9Uy5jb21wYXJlLFMubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuICF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKE8pP086dGhpcy5ub3QoKS5hZGQodil9LFMubmVnPVMubmVnYXRlLFMuYWRkPWZ1bmN0aW9uKGUpe3IoZSl8fChlPWQoZSkpO3ZhciB0PXRoaXMuaGlnaD4+PjE2LG49NjU1MzUmdGhpcy5oaWdoLG89dGhpcy5sb3c+Pj4xNixpPTY1NTM1JnRoaXMubG93LHM9ZS5oaWdoPj4+MTYsYT02NTUzNSZlLmhpZ2gsdT1lLmxvdz4+PjE2LGM9MCxwPTAsZj0wLGg9MDtyZXR1cm4gZis9KGgrPWkrKDY1NTM1JmUubG93KSk+Pj4xNixwKz0oZis9byt1KT4+PjE2LGMrPShwKz1uK2EpPj4+MTYsYys9dCtzLGwoKGYmPTY1NTM1KTw8MTZ8KGgmPTY1NTM1KSwoYyY9NjU1MzUpPDwxNnwocCY9NjU1MzUpLHRoaXMudW5zaWduZWQpfSxTLnN1YnRyYWN0PWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHwoZT1kKGUpKSx0aGlzLmFkZChlLm5lZygpKX0sUy5zdWI9Uy5zdWJ0cmFjdCxTLm11bHRpcGx5PWZ1bmN0aW9uKGUpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXM7aWYocihlKXx8KGU9ZChlKSksdClyZXR1cm4gbCh0Lm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKSx0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCk7aWYoZS5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD95Om07aWYodGhpcy5lcShPKSlyZXR1cm4gZS5pc09kZCgpP086bTtpZihlLmVxKE8pKXJldHVybiB0aGlzLmlzT2RkKCk/TzptO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBlLmlzTmVnYXRpdmUoKT90aGlzLm5lZygpLm11bChlLm5lZygpKTp0aGlzLm5lZygpLm11bChlKS5uZWcoKTtpZihlLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5tdWwoZS5uZWcoKSkubmVnKCk7aWYodGhpcy5sdChiKSYmZS5sdChiKSlyZXR1cm4gdSh0aGlzLnRvTnVtYmVyKCkqZS50b051bWJlcigpLHRoaXMudW5zaWduZWQpO3ZhciBuPXRoaXMuaGlnaD4+PjE2LG89NjU1MzUmdGhpcy5oaWdoLGk9dGhpcy5sb3c+Pj4xNixzPTY1NTM1JnRoaXMubG93LGE9ZS5oaWdoPj4+MTYsYz02NTUzNSZlLmhpZ2gscD1lLmxvdz4+PjE2LGY9NjU1MzUmZS5sb3csaD0wLGc9MCx2PTAsXz0wO3JldHVybiB2Kz0oXys9cypmKT4+PjE2LGcrPSh2Kz1pKmYpPj4+MTYsdiY9NjU1MzUsZys9KHYrPXMqcCk+Pj4xNixoKz0oZys9bypmKT4+PjE2LGcmPTY1NTM1LGgrPShnKz1pKnApPj4+MTYsZyY9NjU1MzUsaCs9KGcrPXMqYyk+Pj4xNixoKz1uKmYrbypwK2kqYytzKmEsbCgodiY9NjU1MzUpPDwxNnwoXyY9NjU1MzUpLChoJj02NTUzNSk8PDE2fChnJj02NTUzNSksdGhpcy51bnNpZ25lZCl9LFMubXVsPVMubXVsdGlwbHksUy5kaXZpZGU9ZnVuY3Rpb24oZSl7aWYocihlKXx8KGU9ZChlKSksZS5pc1plcm8oKSl0aHJvdyBFcnJvcigiZGl2aXNpb24gYnkgemVybyIpO3ZhciBuLG8saTtpZih0KXJldHVybiB0aGlzLnVuc2lnbmVkfHwtMjE0NzQ4MzY0OCE9PXRoaXMuaGlnaHx8LTEhPT1lLmxvd3x8LTEhPT1lLmhpZ2g/bCgodGhpcy51bnNpZ25lZD90LmRpdl91OnQuZGl2X3MpKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpLHQuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKTp0aGlzO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/eTptO2lmKHRoaXMudW5zaWduZWQpe2lmKGUudW5zaWduZWR8fChlPWUudG9VbnNpZ25lZCgpKSxlLmd0KHRoaXMpKXJldHVybiB5O2lmKGUuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gXztpPXk7fWVsc2Uge2lmKHRoaXMuZXEoTykpcmV0dXJuIGUuZXEodil8fGUuZXEodyk/TzplLmVxKE8pP3Y6KG49dGhpcy5zaHIoMSkuZGl2KGUpLnNobCgxKSkuZXEobSk/ZS5pc05lZ2F0aXZlKCk/djp3OihvPXRoaXMuc3ViKGUubXVsKG4pKSxpPW4uYWRkKG8uZGl2KGUpKSk7aWYoZS5lcShPKSlyZXR1cm4gdGhpcy51bnNpZ25lZD95Om07aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkuZGl2KGUubmVnKCkpOnRoaXMubmVnKCkuZGl2KGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmRpdihlLm5lZygpKS5uZWcoKTtpPW07fWZvcihvPXRoaXM7by5ndGUoZSk7KXtuPU1hdGgubWF4KDEsTWF0aC5mbG9vcihvLnRvTnVtYmVyKCkvZS50b051bWJlcigpKSk7Zm9yKHZhciBzPU1hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMiksYT1zPD00OD8xOmMoMixzLTQ4KSxwPXUobiksZj1wLm11bChlKTtmLmlzTmVnYXRpdmUoKXx8Zi5ndChvKTspZj0ocD11KG4tPWEsdGhpcy51bnNpZ25lZCkpLm11bChlKTtwLmlzWmVybygpJiYocD12KSxpPWkuYWRkKHApLG89by5zdWIoZik7fXJldHVybiBpfSxTLmRpdj1TLmRpdmlkZSxTLm1vZHVsbz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksdD9sKCh0aGlzLnVuc2lnbmVkP3QucmVtX3U6dC5yZW1fcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCksdC5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpOnRoaXMuc3ViKHRoaXMuZGl2KGUpLm11bChlKSl9LFMubW9kPVMubW9kdWxvLFMucmVtPVMubW9kdWxvLFMubm90PWZ1bmN0aW9uKCl7cmV0dXJuIGwofnRoaXMubG93LH50aGlzLmhpZ2gsdGhpcy51bnNpZ25lZCl9LFMuY291bnRMZWFkaW5nWmVyb3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoP01hdGguY2x6MzIodGhpcy5oaWdoKTpNYXRoLmNsejMyKHRoaXMubG93KSszMn0sUy5jbHo9Uy5jb3VudExlYWRpbmdaZXJvcyxTLmNvdW50VHJhaWxpbmdaZXJvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvdz9vKHRoaXMubG93KTpvKHRoaXMuaGlnaCkrMzJ9LFMuY3R6PVMuY291bnRUcmFpbGluZ1plcm9zLFMuYW5kPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHwoZT1kKGUpKSxsKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9LFMub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLGwodGhpcy5sb3d8ZS5sb3csdGhpcy5oaWdofGUuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy54b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLGwodGhpcy5sb3deZS5sb3csdGhpcy5oaWdoXmUuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy5zaGlmdExlZnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/bCh0aGlzLmxvdzw8ZSx0aGlzLmhpZ2g8PGV8dGhpcy5sb3c+Pj4zMi1lLHRoaXMudW5zaWduZWQpOmwoMCx0aGlzLmxvdzw8ZS0zMix0aGlzLnVuc2lnbmVkKX0sUy5zaGw9Uy5zaGlmdExlZnQsUy5zaGlmdFJpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiByKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2wodGhpcy5sb3c+Pj5lfHRoaXMuaGlnaDw8MzItZSx0aGlzLmhpZ2g+PmUsdGhpcy51bnNpZ25lZCk6bCh0aGlzLmhpZ2g+PmUtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9LFMuc2hyPVMuc2hpZnRSaWdodCxTLnNoaWZ0UmlnaHRVbnNpZ25lZD1mdW5jdGlvbihlKXtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9sKHRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWUsdGhpcy5oaWdoPj4+ZSx0aGlzLnVuc2lnbmVkKTpsKDMyPT09ZT90aGlzLmhpZ2g6dGhpcy5oaWdoPj4+ZS0zMiwwLHRoaXMudW5zaWduZWQpfSxTLnNocnU9Uy5zaGlmdFJpZ2h0VW5zaWduZWQsUy5zaHJfdT1TLnNoaWZ0UmlnaHRVbnNpZ25lZCxTLnJvdGF0ZUxlZnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOjMyPT09ZT9sKHRoaXMuaGlnaCx0aGlzLmxvdyx0aGlzLnVuc2lnbmVkKTplPDMyPyh0PTMyLWUsbCh0aGlzLmxvdzw8ZXx0aGlzLmhpZ2g+Pj50LHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PnQsdGhpcy51bnNpZ25lZCkpOih0PTMyLShlLT0zMiksbCh0aGlzLmhpZ2g8PGV8dGhpcy5sb3c+Pj50LHRoaXMubG93PDxlfHRoaXMuaGlnaD4+PnQsdGhpcy51bnNpZ25lZCkpfSxTLnJvdGw9Uy5yb3RhdGVMZWZ0LFMucm90YXRlUmlnaHQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOjMyPT09ZT9sKHRoaXMuaGlnaCx0aGlzLmxvdyx0aGlzLnVuc2lnbmVkKTplPDMyPyh0PTMyLWUsbCh0aGlzLmhpZ2g8PHR8dGhpcy5sb3c+Pj5lLHRoaXMubG93PDx0fHRoaXMuaGlnaD4+PmUsdGhpcy51bnNpZ25lZCkpOih0PTMyLShlLT0zMiksbCh0aGlzLmxvdzw8dHx0aGlzLmhpZ2g+Pj5lLHRoaXMuaGlnaDw8dHx0aGlzLmxvdz4+PmUsdGhpcy51bnNpZ25lZCkpfSxTLnJvdHI9Uy5yb3RhdGVSaWdodCxTLnRvU2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/bCh0aGlzLmxvdyx0aGlzLmhpZ2gsITEpOnRoaXN9LFMudG9VbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXM6bCh0aGlzLmxvdyx0aGlzLmhpZ2gsITApfSxTLnRvQnl0ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfSxTLnRvQnl0ZXNMRT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGlnaCx0PXRoaXMubG93O3JldHVybiBbMjU1JnQsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0LDI1NSZlLGU+Pj44JjI1NSxlPj4+MTYmMjU1LGU+Pj4yNF19LFMudG9CeXRlc0JFPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuIFtlPj4+MjQsZT4+PjE2JjI1NSxlPj4+OCYyNTUsMjU1JmUsdD4+PjI0LHQ+Pj4xNiYyNTUsdD4+PjgmMjU1LDI1NSZ0XX0sbi5mcm9tQnl0ZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiByP24uZnJvbUJ5dGVzTEUoZSx0KTpuLmZyb21CeXRlc0JFKGUsdCl9LG4uZnJvbUJ5dGVzTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IG4oZVswXXxlWzFdPDw4fGVbMl08PDE2fGVbM108PDI0LGVbNF18ZVs1XTw8OHxlWzZdPDwxNnxlWzddPDwyNCx0KX0sbi5mcm9tQnl0ZXNCRT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbihlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfTt2YXIgQT1uO3JldHVybiBlLmRlZmF1bHQ9QSwiZGVmYXVsdCJpbiBlP2UuZGVmYXVsdDplfSh7fSk7dm9pZCAwPT09KG49ZnVuY3Rpb24oKXtyZXR1cm4gcn0uYXBwbHkodCxbXSkpfHwoZS5leHBvcnRzPW4pO30sNTY4NjooZSx0LG4pPT57bi5yKHQpLG4uZCh0LHtmbGF0YnVmZmVyczooKT0+cn0pO3ZhciByPXt9O3IuT2Zmc2V0LHIuVGFibGUsci5TSVpFT0ZfU0hPUlQ9MixyLlNJWkVPRl9JTlQ9NCxyLkZJTEVfSURFTlRJRklFUl9MRU5HVEg9NCxyLlNJWkVfUFJFRklYX0xFTkdUSD00LHIuRW5jb2Rpbmc9e1VURjhfQllURVM6MSxVVEYxNl9TVFJJTkc6Mn0sci5pbnQzMj1uZXcgSW50MzJBcnJheSgyKSxyLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheShyLmludDMyLmJ1ZmZlciksci5mbG9hdDY0PW5ldyBGbG9hdDY0QXJyYXkoci5pbnQzMi5idWZmZXIpLHIuaXNMaXR0bGVFbmRpYW49MT09PW5ldyBVaW50MTZBcnJheShuZXcgVWludDhBcnJheShbMSwwXSkuYnVmZmVyKVswXSxyLkxvbmc9ZnVuY3Rpb24oZSx0KXt0aGlzLmxvdz0wfGUsdGhpcy5oaWdoPTB8dDt9LHIuTG9uZy5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMD09ZSYmMD09dD9yLkxvbmcuWkVSTzpuZXcgci5Mb25nKGUsdCl9LHIuTG9uZy5wcm90b3R5cGUudG9GbG9hdDY0PWZ1bmN0aW9uKCl7cmV0dXJuICh0aGlzLmxvdz4+PjApKzQyOTQ5NjcyOTYqdGhpcy5oaWdofSxyLkxvbmcucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb3c9PWUubG93JiZ0aGlzLmhpZ2g9PWUuaGlnaH0sci5Mb25nLlpFUk89bmV3IHIuTG9uZygwLDApLHIuQnVpbGRlcj1mdW5jdGlvbihlKXtpZihlKXQ9ZTtlbHNlIHZhciB0PTEwMjQ7dGhpcy5iYj1yLkJ5dGVCdWZmZXIuYWxsb2NhdGUodCksdGhpcy5zcGFjZT10LHRoaXMubWluYWxpZ249MSx0aGlzLnZ0YWJsZT1udWxsLHRoaXMudnRhYmxlX2luX3VzZT0wLHRoaXMuaXNOZXN0ZWQ9ITEsdGhpcy5vYmplY3Rfc3RhcnQ9MCx0aGlzLnZ0YWJsZXM9W10sdGhpcy52ZWN0b3JfbnVtX2VsZW1zPTAsdGhpcy5mb3JjZV9kZWZhdWx0cz0hMTt9LHIuQnVpbGRlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmJiLmNsZWFyKCksdGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCksdGhpcy5taW5hbGlnbj0xLHRoaXMudnRhYmxlPW51bGwsdGhpcy52dGFibGVfaW5fdXNlPTAsdGhpcy5pc05lc3RlZD0hMSx0aGlzLm9iamVjdF9zdGFydD0wLHRoaXMudnRhYmxlcz1bXSx0aGlzLnZlY3Rvcl9udW1fZWxlbXM9MCx0aGlzLmZvcmNlX2RlZmF1bHRzPSExO30sci5CdWlsZGVyLnByb3RvdHlwZS5mb3JjZURlZmF1bHRzPWZ1bmN0aW9uKGUpe3RoaXMuZm9yY2VfZGVmYXVsdHM9ZTt9LHIuQnVpbGRlci5wcm90b3R5cGUuZGF0YUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJifSxyLkJ1aWxkZXIucHJvdG90eXBlLmFzVWludDhBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiLmJ5dGVzKCkuc3ViYXJyYXkodGhpcy5iYi5wb3NpdGlvbigpLHRoaXMuYmIucG9zaXRpb24oKSt0aGlzLm9mZnNldCgpKX0sci5CdWlsZGVyLnByb3RvdHlwZS5wcmVwPWZ1bmN0aW9uKGUsdCl7ZT50aGlzLm1pbmFsaWduJiYodGhpcy5taW5hbGlnbj1lKTtmb3IodmFyIG49MSt+KHRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnNwYWNlK3QpJmUtMTt0aGlzLnNwYWNlPG4rZSt0Oyl7dmFyIG89dGhpcy5iYi5jYXBhY2l0eSgpO3RoaXMuYmI9ci5CdWlsZGVyLmdyb3dCeXRlQnVmZmVyKHRoaXMuYmIpLHRoaXMuc3BhY2UrPXRoaXMuYmIuY2FwYWNpdHkoKS1vO310aGlzLnBhZChuKTt9LHIuQnVpbGRlci5wcm90b3R5cGUucGFkPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZTt0KyspdGhpcy5iYi53cml0ZUludDgoLS10aGlzLnNwYWNlLDApO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSl7dGhpcy5iYi53cml0ZUludDgodGhpcy5zcGFjZS09MSxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQxNj1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50MTYodGhpcy5zcGFjZS09MixlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQzMj1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZS09NCxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQ2ND1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50NjQodGhpcy5zcGFjZS09OCxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuc3BhY2UtPTQsZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlRmxvYXQ2NCh0aGlzLnNwYWNlLT04LGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQ4PWZ1bmN0aW9uKGUpe3RoaXMucHJlcCgxLDApLHRoaXMud3JpdGVJbnQ4KGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQxNj1mdW5jdGlvbihlKXt0aGlzLnByZXAoMiwwKSx0aGlzLndyaXRlSW50MTYoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDMyPWZ1bmN0aW9uKGUpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVJbnQzMihlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkSW50NjQ9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUludDY0KGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGbG9hdDMyPWZ1bmN0aW9uKGUpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVGbG9hdDMyKGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGbG9hdDY0PWZ1bmN0aW9uKGUpe3RoaXMucHJlcCg4LDApLHRoaXMud3JpdGVGbG9hdDY0KGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDg9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkSW50OCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDE2PWZ1bmN0aW9uKGUsdCxuKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bikmJih0aGlzLmFkZEludDE2KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50MzI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkSW50MzIodCksdGhpcy5zbG90KGUpKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQ2ND1mdW5jdGlvbihlLHQsbil7IXRoaXMuZm9yY2VfZGVmYXVsdHMmJnQuZXF1YWxzKG4pfHwodGhpcy5hZGRJbnQ2NCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEZsb2F0MzI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkRmxvYXQzMih0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEZsb2F0NjQ9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkRmxvYXQ2NCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZE9mZnNldD1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRPZmZzZXQodCksdGhpcy5zbG90KGUpKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRTdHJ1Y3Q9ZnVuY3Rpb24oZSx0LG4pe3QhPW4mJih0aGlzLm5lc3RlZCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5uZXN0ZWQ9ZnVuY3Rpb24oZSl7aWYoZSE9dGhpcy5vZmZzZXQoKSl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBzdHJ1Y3QgbXVzdCBiZSBzZXJpYWxpemVkIGlubGluZS4iKX0sci5CdWlsZGVyLnByb3RvdHlwZS5ub3ROZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmVzdGVkKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IG9iamVjdCBzZXJpYWxpemF0aW9uIG11c3Qgbm90IGJlIG5lc3RlZC4iKX0sci5CdWlsZGVyLnByb3RvdHlwZS5zbG90PWZ1bmN0aW9uKGUpe3RoaXMudnRhYmxlW2VdPXRoaXMub2Zmc2V0KCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZX0sci5CdWlsZGVyLmdyb3dCeXRlQnVmZmVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FwYWNpdHkoKTtpZigzMjIxMjI1NDcyJnQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogY2Fubm90IGdyb3cgYnVmZmVyIGJleW9uZCAyIGdpZ2FieXRlcy4iKTt2YXIgbj10PDwxLG89ci5CeXRlQnVmZmVyLmFsbG9jYXRlKG4pO3JldHVybiBvLnNldFBvc2l0aW9uKG4tdCksby5ieXRlcygpLnNldChlLmJ5dGVzKCksbi10KSxvfSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZE9mZnNldD1mdW5jdGlvbihlKXt0aGlzLnByZXAoci5TSVpFT0ZfSU5ULDApLHRoaXMud3JpdGVJbnQzMih0aGlzLm9mZnNldCgpLWUrci5TSVpFT0ZfSU5UKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuc3RhcnRPYmplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5ub3ROZXN0ZWQoKSxudWxsPT10aGlzLnZ0YWJsZSYmKHRoaXMudnRhYmxlPVtdKSx0aGlzLnZ0YWJsZV9pbl91c2U9ZTtmb3IodmFyIHQ9MDt0PGU7dCsrKXRoaXMudnRhYmxlW3RdPTA7dGhpcy5pc05lc3RlZD0hMCx0aGlzLm9iamVjdF9zdGFydD10aGlzLm9mZnNldCgpO30sci5CdWlsZGVyLnByb3RvdHlwZS5lbmRPYmplY3Q9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLnZ0YWJsZXx8IXRoaXMuaXNOZXN0ZWQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZW5kT2JqZWN0IGNhbGxlZCB3aXRob3V0IHN0YXJ0T2JqZWN0Iik7dGhpcy5hZGRJbnQzMigwKTtmb3IodmFyIGU9dGhpcy5vZmZzZXQoKSx0PXRoaXMudnRhYmxlX2luX3VzZS0xO3Q+PTAmJjA9PXRoaXMudnRhYmxlW3RdO3QtLSk7Zm9yKHZhciBuPXQrMTt0Pj0wO3QtLSl0aGlzLmFkZEludDE2KDAhPXRoaXMudnRhYmxlW3RdP2UtdGhpcy52dGFibGVbdF06MCk7dGhpcy5hZGRJbnQxNihlLXRoaXMub2JqZWN0X3N0YXJ0KTt2YXIgbz0obisyKSpyLlNJWkVPRl9TSE9SVDt0aGlzLmFkZEludDE2KG8pO3ZhciBpPTAscz10aGlzLnNwYWNlO2U6Zm9yKHQ9MDt0PHRoaXMudnRhYmxlcy5sZW5ndGg7dCsrKXt2YXIgYT10aGlzLmJiLmNhcGFjaXR5KCktdGhpcy52dGFibGVzW3RdO2lmKG89PXRoaXMuYmIucmVhZEludDE2KGEpKXtmb3IodmFyIHU9ci5TSVpFT0ZfU0hPUlQ7dTxvO3UrPXIuU0laRU9GX1NIT1JUKWlmKHRoaXMuYmIucmVhZEludDE2KHMrdSkhPXRoaXMuYmIucmVhZEludDE2KGErdSkpY29udGludWUgZTtpPXRoaXMudnRhYmxlc1t0XTticmVha319cmV0dXJuIGk/KHRoaXMuc3BhY2U9dGhpcy5iYi5jYXBhY2l0eSgpLWUsdGhpcy5iYi53cml0ZUludDMyKHRoaXMuc3BhY2UsaS1lKSk6KHRoaXMudnRhYmxlcy5wdXNoKHRoaXMub2Zmc2V0KCkpLHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCktZSx0aGlzLm9mZnNldCgpLWUpKSx0aGlzLmlzTmVzdGVkPSExLGV9LHIuQnVpbGRlci5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1uP3IuU0laRV9QUkVGSVhfTEVOR1RIOjA7aWYodCl7dmFyIGk9dDtpZih0aGlzLnByZXAodGhpcy5taW5hbGlnbixyLlNJWkVPRl9JTlQrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIK28pLGkubGVuZ3RoIT1yLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICIrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKTtmb3IodmFyIHM9ci5GSUxFX0lERU5USUZJRVJfTEVOR1RILTE7cz49MDtzLS0pdGhpcy53cml0ZUludDgoaS5jaGFyQ29kZUF0KHMpKTt9dGhpcy5wcmVwKHRoaXMubWluYWxpZ24sci5TSVpFT0ZfSU5UK28pLHRoaXMuYWRkT2Zmc2V0KGUpLG8mJnRoaXMuYWRkSW50MzIodGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2UpLHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmZpbmlzaFNpemVQcmVmaXhlZD1mdW5jdGlvbihlLHQpe3RoaXMuZmluaXNoKGUsdCwhMCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLnJlcXVpcmVkRmllbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJiLmNhcGFjaXR5KCktZSxyPW4tdGhpcy5iYi5yZWFkSW50MzIobik7aWYoMD09dGhpcy5iYi5yZWFkSW50MTYocit0KSl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBmaWVsZCAiK3QrIiBtdXN0IGJlIHNldCIpfSxyLkJ1aWxkZXIucHJvdG90eXBlLnN0YXJ0VmVjdG9yPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLm5vdE5lc3RlZCgpLHRoaXMudmVjdG9yX251bV9lbGVtcz10LHRoaXMucHJlcChyLlNJWkVPRl9JTlQsZSp0KSx0aGlzLnByZXAobixlKnQpO30sci5CdWlsZGVyLnByb3RvdHlwZS5lbmRWZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53cml0ZUludDMyKHRoaXMudmVjdG9yX251bV9lbGVtcyksdGhpcy5vZmZzZXQoKX0sci5CdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVTdHJpbmc9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdmFyIHQ9ZTtlbHNlIHt0PVtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7KXt2YXIgcixvPWUuY2hhckNvZGVBdChuKyspOyhyPW88NTUyOTZ8fG8+PTU2MzIwP286KG88PDEwKStlLmNoYXJDb2RlQXQobisrKSstNTY2MTM4ODgpPDEyOD90LnB1c2gocik6KHI8MjA0OD90LnB1c2gocj4+NiYzMXwxOTIpOihyPDY1NTM2P3QucHVzaChyPj4xMiYxNXwyMjQpOnQucHVzaChyPj4xOCY3fDI0MCxyPj4xMiY2M3wxMjgpLHQucHVzaChyPj42JjYzfDEyOCkpLHQucHVzaCg2MyZyfDEyOCkpO319dGhpcy5hZGRJbnQ4KDApLHRoaXMuc3RhcnRWZWN0b3IoMSx0Lmxlbmd0aCwxKSx0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UtPXQubGVuZ3RoKSxuPTA7Zm9yKHZhciBpPXRoaXMuc3BhY2Uscz10aGlzLmJiLmJ5dGVzKCk7bjx0Lmxlbmd0aDtuKyspc1tpKytdPXRbbl07cmV0dXJuIHRoaXMuZW5kVmVjdG9yKCl9LHIuQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTG9uZz1mdW5jdGlvbihlLHQpe3JldHVybiByLkxvbmcuY3JlYXRlKGUsdCl9LHIuQnl0ZUJ1ZmZlcj1mdW5jdGlvbihlKXt0aGlzLmJ5dGVzXz1lLHRoaXMucG9zaXRpb25fPTA7fSxyLkJ5dGVCdWZmZXIuYWxsb2NhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByLkJ5dGVCdWZmZXIobmV3IFVpbnQ4QXJyYXkoZSkpfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbl89MDt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc199LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl99LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5wb3NpdGlvbl89ZTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuY2FwYWNpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc18ubGVuZ3RofSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRVaW50OChlKTw8MjQ+PjI0fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50OD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ieXRlc19bZV19LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRVaW50MTYoZSk8PDE2Pj4xNn0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ5dGVzX1tlXXx0aGlzLmJ5dGVzX1tlKzFdPDw4fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ieXRlc19bZV18dGhpcy5ieXRlc19bZSsxXTw8OHx0aGlzLmJ5dGVzX1tlKzJdPDwxNnx0aGlzLmJ5dGVzX1tlKzNdPDwyNH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRJbnQzMihlKT4+PjB9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDY0PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgci5Mb25nKHRoaXMucmVhZEludDMyKGUpLHRoaXMucmVhZEludDMyKGUrNCkpfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByLkxvbmcodGhpcy5yZWFkVWludDMyKGUpLHRoaXMucmVhZFVpbnQzMihlKzQpKX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXQzMj1mdW5jdGlvbihlKXtyZXR1cm4gci5pbnQzMlswXT10aGlzLnJlYWRJbnQzMihlKSxyLmZsb2F0MzJbMF19LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8wOjFdPXRoaXMucmVhZEludDMyKGUpLHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8xOjBdPXRoaXMucmVhZEludDMyKGUrNCksci5mbG9hdDY0WzBdfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQpe3RoaXMuYnl0ZXNfW2VdPXQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDg9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10O30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2PWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dCx0aGlzLmJ5dGVzX1tlKzFdPXQ+Pjg7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2PWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dCx0aGlzLmJ5dGVzX1tlKzFdPXQ+Pjg7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzI9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+OCx0aGlzLmJ5dGVzX1tlKzJdPXQ+PjE2LHRoaXMuYnl0ZXNfW2UrM109dD4+MjQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyPWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dCx0aGlzLmJ5dGVzX1tlKzFdPXQ+PjgsdGhpcy5ieXRlc19bZSsyXT10Pj4xNix0aGlzLmJ5dGVzX1tlKzNdPXQ+PjI0O30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDY0PWZ1bmN0aW9uKGUsdCl7dGhpcy53cml0ZUludDMyKGUsdC5sb3cpLHRoaXMud3JpdGVJbnQzMihlKzQsdC5oaWdoKTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50NjQ9ZnVuY3Rpb24oZSx0KXt0aGlzLndyaXRlVWludDMyKGUsdC5sb3cpLHRoaXMud3JpdGVVaW50MzIoZSs0LHQuaGlnaCk7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQzMj1mdW5jdGlvbihlLHQpe3IuZmxvYXQzMlswXT10LHRoaXMud3JpdGVJbnQzMihlLHIuaW50MzJbMF0pO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0NjQ9ZnVuY3Rpb24oZSx0KXtyLmZsb2F0NjRbMF09dCx0aGlzLndyaXRlSW50MzIoZSxyLmludDMyW3IuaXNMaXR0bGVFbmRpYW4/MDoxXSksdGhpcy53cml0ZUludDMyKGUrNCxyLmludDMyW3IuaXNMaXR0bGVFbmRpYW4/MTowXSk7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLmdldEJ1ZmZlcklkZW50aWZpZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmJ5dGVzXy5sZW5ndGg8dGhpcy5wb3NpdGlvbl8rci5TSVpFT0ZfSU5UK3IuRklMRV9JREVOVElGSUVSX0xFTkdUSCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBCeXRlQnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluIGFuIGlkZW50aWZpZXIuIik7Zm9yKHZhciBlPSIiLHQ9MDt0PHIuRklMRV9JREVOVElGSUVSX0xFTkdUSDt0KyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb25fK3IuU0laRU9GX0lOVCt0KSk7cmV0dXJuIGV9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19vZmZzZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLXRoaXMucmVhZEludDMyKGUpO3JldHVybiB0PHRoaXMucmVhZEludDE2KG4pP3RoaXMucmVhZEludDE2KG4rdCk6MH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX3VuaW9uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYmJfcG9zPXQrdGhpcy5yZWFkSW50MzIodCksZS5iYj10aGlzLGV9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19zdHJpbmc9ZnVuY3Rpb24oZSx0KXtlKz10aGlzLnJlYWRJbnQzMihlKTt2YXIgbj10aGlzLnJlYWRJbnQzMihlKSxvPSIiLGk9MDtpZihlKz1yLlNJWkVPRl9JTlQsdD09PXIuRW5jb2RpbmcuVVRGOF9CWVRFUylyZXR1cm4gdGhpcy5ieXRlc18uc3ViYXJyYXkoZSxlK24pO2Zvcig7aTxuOyl7dmFyIHMsYT10aGlzLnJlYWRVaW50OChlK2krKyk7aWYoYTwxOTIpcz1hO2Vsc2Uge3ZhciB1PXRoaXMucmVhZFVpbnQ4KGUraSsrKTtpZihhPDIyNClzPSgzMSZhKTw8Nnw2MyZ1O2Vsc2Uge3ZhciBsPXRoaXMucmVhZFVpbnQ4KGUraSsrKTtzPWE8MjQwPygxNSZhKTw8MTJ8KDYzJnUpPDw2fDYzJmw6KDcmYSk8PDE4fCg2MyZ1KTw8MTJ8KDYzJmwpPDw2fDYzJnRoaXMucmVhZFVpbnQ4KGUraSsrKTt9fXM8NjU1MzY/bys9U3RyaW5nLmZyb21DaGFyQ29kZShzKToocy09NjU1MzYsbys9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5Nisocz4+MTApLDU2MzIwKygxMDIzJnMpKSk7fXJldHVybiBvfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9faW5kaXJlY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUrdGhpcy5yZWFkSW50MzIoZSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX192ZWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUrdGhpcy5yZWFkSW50MzIoZSkrci5TSVpFT0ZfSU5UfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fdmVjdG9yX2xlbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWFkSW50MzIoZSt0aGlzLnJlYWRJbnQzMihlKSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19oYXNfaWRlbnRpZmllcj1mdW5jdGlvbihlKXtpZihlLmxlbmd0aCE9ci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpbGUgaWRlbnRpZmllciBtdXN0IGJlIGxlbmd0aCAiK3IuRklMRV9JREVOVElGSUVSX0xFTkdUSCk7Zm9yKHZhciB0PTA7dDxyLkZJTEVfSURFTlRJRklFUl9MRU5HVEg7dCsrKWlmKGUuY2hhckNvZGVBdCh0KSE9dGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXytyLlNJWkVPRl9JTlQrdCkpcmV0dXJuICExO3JldHVybiAhMH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5jcmVhdGVMb25nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuTG9uZy5jcmVhdGUoZSx0KX07fX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18oZSl7dmFyIHQ9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW2VdO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHQuZXhwb3J0czt2YXIgbj1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bZV09e2V4cG9ydHM6e319O3JldHVybiBfX3dlYnBhY2tfbW9kdWxlc19fW2VdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pLG4uZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm49ZT0+e3ZhciB0PWUmJmUuX19lc01vZHVsZT8oKT0+ZS5kZWZhdWx0OigpPT5lO3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQodCx7YTp0fSksdH0sX193ZWJwYWNrX3JlcXVpcmVfXy5kPShlLHQpPT57Zm9yKHZhciBuIGluIHQpX193ZWJwYWNrX3JlcXVpcmVfXy5vKHQsbikmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZSxuKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6dFtuXX0pO30sX193ZWJwYWNrX3JlcXVpcmVfXy5vPShlLHQpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSxfX3dlYnBhY2tfcmVxdWlyZV9fLnI9ZT0+eyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7fTt2YXIgX193ZWJwYWNrX2V4cG9ydHNfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDEwNTcpO3JldHVybiBfX3dlYnBhY2tfZXhwb3J0c19ffSkoKSxtb2R1bGUuZXhwb3J0cz10KCk7fSkob3J0X21pbixvcnRfbWluLmV4cG9ydHMpO3ZhciBvcnRfbWluRXhwb3J0cz1vcnRfbWluLmV4cG9ydHM7Z2V0RGVmYXVsdEV4cG9ydEZyb21DanMob3J0X21pbkV4cG9ydHMpOwoKY2xhc3MgV29ya2VyTmF0aXZle2NvbnN0cnVjdG9yKCl7dGhpcy5yZWFkeT0hMTt0aGlzLmluZGV4ZWREQk1hbmFnZXI9bmV3IEluZGV4ZWREQk1hbmFnZXIoIm9uaXJpeC1zZGsiLCJmaWxlcyIpLHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGaWxlRnJvbUluZGV4ZWREQigiU0RLXzEuOS4xIikudGhlbigoYXN5bmMgdD0+e2xldCBlPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpO2NvbnN0e2RlZmF1bHQ6YX09YXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUsIHdlYnBhY2tNb2RlOiAibGF6eSIgKi9lKSxzPWF3YWl0IGEoKTt0aGlzLm5hdGl2ZVNESz1zLHRoaXMuY29hcnNlRnJhbWU9dGhpcy5uYXRpdmVTREsuX21hbGxvYygzNjg2NDAwKSx0aGlzLmV4dHJhY3Rpb25GcmFtZT10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDM2ODY0MDApLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5mcmFtZUxheW91dFN0cnVjdD10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDI4KTtsZXQgaT1hd2FpdCB0aGlzLmluZGV4ZWREQk1hbmFnZXIuZ2V0RmlsZUZyb21JbmRleGVkREIoIm9ubngud2FzbSIpLHI9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbaV0se3R5cGU6ImFwcGxpY2F0aW9uL3dhc20ifSkpO29ydF9taW5FeHBvcnRzLmVudi53YXNtLndhc21QYXRocz17Im9ydC13YXNtLXNpbWQud2FzbSI6cn07bGV0IG49YXdhaXQgdGhpcy5pbmRleGVkREJNYW5hZ2VyLmdldEZyb21DYWNoZU9yRmV0Y2goImNvYXJzZWxvYy5vbm54IiwiaHR0cHM6Ly9zZGsub25pcml4LmNvbS9jb21tb24vY29hcnNlbG9jLm9ubngiKTtjb25zdCBvPWF3YWl0IG9ydF9taW5FeHBvcnRzLkluZmVyZW5jZVNlc3Npb24uY3JlYXRlKG4se2V4ZWN1dGlvblByb3ZpZGVyczpbIndhc20iXX0pO2xldCBoPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGcm9tQ2FjaGVPckZldGNoKCJzcGFyc2VfZXh0cmFjdC5vbm54IiwiaHR0cHM6Ly9zZGsub25pcml4LmNvbS9jb21tb24vc3BhcnNlX2V4dHJhY3Qub25ueCIpO2NvbnN0IGM9YXdhaXQgb3J0X21pbkV4cG9ydHMuSW5mZXJlbmNlU2Vzc2lvbi5jcmVhdGUoaCx7ZXhlY3V0aW9uUHJvdmlkZXJzOlsid2FzbSJdfSk7dGhpcy5zZXNzaW9uPW8sdGhpcy5zZXNzaW9uRXh0cmFjdGlvbj1jLGF3YWl0IHRoaXMuc2Vzc2lvbi5ydW4oe2lucHV0Om5ldyBvcnRfbWluRXhwb3J0cy5UZW5zb3IobmV3IEZsb2F0MzJBcnJheShBcnJheSg5MjE2MDApLmZpbGwoMCkpLFsxLDMsNjQwLDQ4MF0pfSksYXdhaXQgdGhpcy5zZXNzaW9uRXh0cmFjdGlvbi5ydW4oe2ltYWdlOm5ldyBvcnRfbWluRXhwb3J0cy5UZW5zb3IobmV3IEZsb2F0MzJBcnJheShBcnJheSg5MjE2MDApLmZpbGwoMCkpLFsxLDMsNDgwLDY0MF0pfSksdGhpcy5yZWFkeT0hMCxwb3N0TWVzc2FnZSgicmVhZHkiKTt9KSk7fXN0YXJ0KCl7YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGFzeW5jIHQ9PntpZighdGhpcy5yZWFkeSlyZXR1cm4gdm9pZCBwb3N0TWVzc2FnZSghMSk7dGhpcy5yZWFkeT0hMTtjb25zdCBlPXQuZGF0YSxhPWUud2lkdGgqZS5oZWlnaHQqNDswIT10aGlzLmJ1ZmZlckxlbmd0aCYmdGhpcy5idWZmZXJMZW5ndGg9PWF8fCgwIT10aGlzLmJ1ZmZlckxlbmd0aCYmdGhpcy5uYXRpdmVTREsuX2ZyZWUodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyTGVuZ3RoPWEsdGhpcy5idWZmZXI9dGhpcy5uYXRpdmVTREsuX21hbGxvYyh0aGlzLmJ1ZmZlckxlbmd0aCkpLHRoaXMubmF0aXZlU0RLLkhFQVBVOC5zZXQoZS5kYXRhLHRoaXMuYnVmZmVyKSx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCswXT1lLndpZHRoLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzFdPWUuaGVpZ2h0LHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzJdPTQqZS53aWR0aCx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCszXT0hMSx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCs0XT1lLmNvbG9yU3BhY2UsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrNV09ZS5yb3RhdGUsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrNl09ZS5mbGlwO2xldCBzPXRoaXMubmF0aXZlU0RLLl9PWF9FeHRyYWN0KHRoaXMuYnVmZmVyLHRoaXMuY29hcnNlRnJhbWUsdGhpcy5leHRyYWN0aW9uRnJhbWUsdGhpcy5mcmFtZUxheW91dFN0cnVjdCxlLmR0eXBlKSxpPVtdO2lmKGUub25seUNvYXJzZXx8MiE9ZS5kdHlwZSlpPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5yZWFkRXh0cmFjdGlvbkRhdGEodGhpcy5uYXRpdmVTREsuSEVBUEYzMixzLzQpKTtlbHNlIHtsZXQgdD1bXTtmb3IobGV0IGU9MDtlPDkyMTYwMDtlKyspdC5wdXNoKHRoaXMubmF0aXZlU0RLLkhFQVBGMzJbdGhpcy5leHRyYWN0aW9uRnJhbWUvNCtlXSk7bGV0e2tleXBvaW50czplLGRlc2NyaXB0b3JzOmF9PWF3YWl0IHRoaXMuc2Vzc2lvbkV4dHJhY3Rpb24ucnVuKHtpbWFnZTpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkodCksWzEsMyw0ODAsNjQwXSl9KSxzPVtlLmRpbXNbMF0sLi4uZS5kYXRhLC4uLmEuZGF0YV07aT1uZXcgRmxvYXQzMkFycmF5KHMpO31sZXQgcj1bXTtmb3IobGV0IHQ9MDt0PDkyMTYwMDt0Kyspci5wdXNoKHRoaXMubmF0aXZlU0RLLkhFQVBGMzJbdGhpcy5jb2Fyc2VGcmFtZS80K3RdKTtsZXQgbj1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkociksWzEsMyw2NDAsNDgwXSl9KTtwb3N0TWVzc2FnZSh7ZXh0cmFjdGlvbjppLGRlc2NyaXB0b3I6bi5vdXRwdXQuZGF0YSxvbmx5Q29hcnNlOmUub25seUNvYXJzZX0pLHRoaXMucmVhZHk9ITA7fSkpO31yZWFkRXh0cmFjdGlvbkRhdGEodCxlKXtsZXQgYT1lLHM9W10saT10W2FdO3MucHVzaChpKSxhKys7Zm9yKGxldCBlPTA7ZTxpO2UrKylzLnB1c2godFthXSkscy5wdXNoKHRbYSsxXSksYSs9Mjtmb3IobGV0IGU9MDtlPDEyOCppO2UrKylzLnB1c2godFthXSksYSsrO3JldHVybiBzfX1jb25zdCB3b3JrZXI9bmV3IFdvcmtlck5hdGl2ZTt3b3JrZXIuc3RhcnQoKTsK"),d=new Blob([b],{type:"application/javascript"});this.workers[l]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(d),{type:"module"}),this.callbacks[l]=Z,this.workers[l].addEventListener("message",(Z=>{this.callbacks[l](Z.data);}));}}createMatchingWorker(l,Z){if(!this.workerExists(l)){let b=atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319Cgp2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7CglyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4Owp9Cgp2YXIgb3J0X21pbiA9IHtleHBvcnRzOiB7fX07CgpvcnRfbWluLmV4cG9ydHM7KGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXt2YXIgdDt0PSgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17NTcxNjooZSx0LG4pPT57dC5SPXZvaWQgMDtjb25zdCByPW4oNjAyNyksbz1uKDE3MjMpO3QuUj1uZXcgY2xhc3N7YXN5bmMgaW5pdCgpe31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHIuU2Vzc2lvbih0KTtyZXR1cm4gYXdhaXQgbi5sb2FkTW9kZWwoZSksbmV3IG8uT25ueGpzU2Vzc2lvbkhhbmRsZXIobil9fTt9LDI4MTg6KGUsdCxuKT0+e3QuYzg9dC5yWD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89big1MzgxKSxpPW4oOTU0NCkscz1uKDY2NDApO3Quclg9KCk9PntpZigoIm51bWJlciIhPXR5cGVvZiByLmVudi53YXNtLmluaXRUaW1lb3V0fHxyLmVudi53YXNtLmluaXRUaW1lb3V0PDApJiYoci5lbnYud2FzbS5pbml0VGltZW91dD0wKSwiYm9vbGVhbiIhPXR5cGVvZiByLmVudi53YXNtLnNpbWQmJihyLmVudi53YXNtLnNpbWQ9ITApLCJib29sZWFuIiE9dHlwZW9mIHIuZW52Lndhc20ucHJveHkmJihyLmVudi53YXNtLnByb3h5PSExKSwibnVtYmVyIiE9dHlwZW9mIHIuZW52Lndhc20ubnVtVGhyZWFkc3x8IU51bWJlci5pc0ludGVnZXIoci5lbnYud2FzbS5udW1UaHJlYWRzKXx8ci5lbnYud2FzbS5udW1UaHJlYWRzPD0wKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yPygwLCBvLmNwdXMpKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O3IuZW52Lndhc20ubnVtVGhyZWFkcz1NYXRoLm1pbig0LE1hdGguY2VpbCgoZXx8MSkvMikpO319LHQuYzg9bmV3IGNsYXNze2FzeW5jIGluaXQoKXsoMCwgdC5yWCkoKSxhd2FpdCgwLCBpLmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlKSgpO31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHMuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyO3JldHVybiBhd2FpdCBuLmxvYWRNb2RlbChlLHQpLFByb21pc2UucmVzb2x2ZShuKX19O30sMTA1NzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oMjIzNSksdCk7Y29uc3QgaT1uKDIyMzUpLHM9big4NDA4KTt7Y29uc3QgZT1uKDU3MTYpLlI7KDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2ViZ2wiLGUsLTEwKTt9e2NvbnN0IGU9bigyODE4KS5jODsoMCwgaS5yZWdpc3RlckJhY2tlbmQpKCJjcHUiLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoIndhc20iLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoInhubnBhY2siLGUsOSksKDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2Vibm4iLGUsOSk7fWkuZW52LnZlcnNpb25zLndlYj1zLnZlcnNpb247fSw0OTEwOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5PXZvaWQgMDtjbGFzcyBue2NvbnN0cnVjdG9yKGUpe09iamVjdC5hc3NpZ24odGhpcyxlKTt9Z2V0IGNhY2hlS2V5KCl7cmV0dXJuIHRoaXMuX2NhY2hlS2V5fHwodGhpcy5fY2FjaGVLZXk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykuc29ydCgpLm1hcCgoZT0+YCR7dGhpc1tlXX1gKSkuam9pbigiOyIpKSx0aGlzLl9jYWNoZUtleX19dC5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXk9ZT0+bmV3IG4oZSk7fSw2ODc0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5BdHRyaWJ1dGU9dm9pZCAwO2NvbnN0IHI9big1MTI3KSxvPW4oMjQ0NiksaT1uKDkyNDApLHM9big3MjczKTt2YXIgYT1yLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7Y2xhc3MgdXtjb25zdHJ1Y3RvcihlKXtpZih0aGlzLl9hdHRyaWJ1dGVzPW5ldyBNYXAsbnVsbCE9ZSl7Zm9yKGNvbnN0IHQgb2YgZSl0IGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvP3RoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSxbdS5nZXRWYWx1ZSh0KSx1LmdldFR5cGUodCldKTp0IGluc3RhbmNlb2YgYS5BdHRyaWJ1dGUmJnRoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSgpLFt1LmdldFZhbHVlKHQpLHUuZ2V0VHlwZSh0KV0pO2lmKHRoaXMuX2F0dHJpYnV0ZXMuc2l6ZTxlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZWQgYXR0cmlidXRlIG5hbWVzIil9fXNldChlLHQsbil7dGhpcy5fYXR0cmlidXRlcy5zZXQoZSxbbix0XSk7fWRlbGV0ZShlKXt0aGlzLl9hdHRyaWJ1dGVzLmRlbGV0ZShlKTt9Z2V0RmxvYXQoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiZmxvYXQiLHQpfWdldEludChlLHQpe3JldHVybiB0aGlzLmdldChlLCJpbnQiLHQpfWdldFN0cmluZyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmciLHQpfWdldFRlbnNvcihlLHQpe3JldHVybiB0aGlzLmdldChlLCJ0ZW5zb3IiLHQpfWdldEZsb2F0cyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJmbG9hdHMiLHQpfWdldEludHMoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiaW50cyIsdCl9Z2V0U3RyaW5ncyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmdzIix0KX1nZXRUZW5zb3JzKGUsdCl7cmV0dXJuIHRoaXMuZ2V0KGUsInRlbnNvcnMiLHQpfWdldChlLHQsbil7Y29uc3Qgcj10aGlzLl9hdHRyaWJ1dGVzLmdldChlKTtpZih2b2lkIDA9PT1yKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO3Rocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgYXR0cmlidXRlIG5vdCBmb3VuZDogJHtlfWApfWlmKHJbMV0hPT10KXRocm93IG5ldyBFcnJvcihgdHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0fSBidXQgZ290ICR7clsxXX1gKTtyZXR1cm4gclswXX1zdGF0aWMgZ2V0VHlwZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO3N3aXRjaCh0KXtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiAiZmxvYXQiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiAiaW50IjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gInN0cmluZyI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1I6cmV0dXJuICJ0ZW5zb3IiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiAiZmxvYXRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVFM6cmV0dXJuICJpbnRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6cmV0dXJuICJzdHJpbmdzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6cmV0dXJuICJ0ZW5zb3JzIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgYXR0cmlidXRlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6ICR7by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbdF19YCl9fXN0YXRpYyBnZXRWYWx1ZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSHx8dD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkdSQVBIUyl0aHJvdyBuZXcgRXJyb3IoImdyYXBoIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0IG49dGhpcy5nZXRWYWx1ZU5vQ2hlY2soZSk7aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVCYmcy5Mb25nVXRpbC5pc0xvbmcobikpcmV0dXJuIHMuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKG4pO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTKXtjb25zdCBlPW4sdD1uZXcgQXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07dFtuXT1zLkxvbmdVdGlsLmxvbmdUb051bWJlcihyKTt9cmV0dXJuIHR9aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUilyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9pLlRlbnNvci5mcm9tUHJvdG8obik6aS5UZW5zb3IuZnJvbU9ydFRlbnNvcihuKTtpZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUyl7aWYoZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21Qcm90byhlKSkpO2lmKGUgaW5zdGFuY2VvZiBhLkF0dHJpYnV0ZSlyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21PcnRUZW5zb3IoZSkpKX1pZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HJiZlIGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvKXtjb25zdCBlPW47cmV0dXJuICgwLCBzLmRlY29kZVV0ZjhTdHJpbmcpKGUpfXJldHVybiB0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HUyYmZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9uLm1hcChzLmRlY29kZVV0ZjhTdHJpbmcpOm59c3RhdGljIGdldFZhbHVlTm9DaGVjayhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz90aGlzLmdldFZhbHVlTm9DaGVja0Zyb21Pbm54Rm9ybWF0KGUpOnRoaXMuZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ubnhGb3JtYXQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVDpyZXR1cm4gZS5mO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiBlLmk7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuIGUucztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUjpyZXR1cm4gZS50O2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEg6cmV0dXJuIGUuZztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUUzpyZXR1cm4gZS5mbG9hdHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTOnJldHVybiBlLmludHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkdTOnJldHVybiBlLnN0cmluZ3M7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1JTOnJldHVybiBlLnRlbnNvcnM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSFM6cmV0dXJuIGUuZ3JhcGhzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZTogJHtvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdfWApfX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKXtzd2l0Y2goZS50eXBlKCkpe2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiBlLmYoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuIGUuaSgpO2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gZS5zKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuVEVOU09SOnJldHVybiBlLnQoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5HUkFQSDpyZXR1cm4gZS5nKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiBlLmZsb2F0c0FycmF5KCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuSU5UUzp7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPGUuaW50c0xlbmd0aCgpO24rKyl0LnB1c2goZS5pbnRzKG4pKTtyZXR1cm4gdH1jYXNlIGEuQXR0cmlidXRlVHlwZS5TVFJJTkdTOntjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5zdHJpbmdzTGVuZ3RoKCk7bisrKXQucHVzaChlLnN0cmluZ3MobikpO3JldHVybiB0fWNhc2UgYS5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6e2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLnRlbnNvcnNMZW5ndGgoKTtuKyspdC5wdXNoKGUudGVuc29ycyhuKSk7cmV0dXJuIHR9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlOiAke2EuQXR0cmlidXRlVHlwZVtlLnR5cGUoKV19YCl9fX10LkF0dHJpYnV0ZT11O30sMTk3NTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVzb2x2ZUJhY2tlbmQ9dC5iYWNrZW5kPXZvaWQgMDtjb25zdCByPW4oNDQxOCksbz1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIGkoZSl7Y29uc3Qgbj10LmJhY2tlbmQ7aWYodm9pZCAwIT09bltlXSYmZnVuY3Rpb24oZSl7Y29uc3QgdD1lO3JldHVybiAiaW5pdGlhbGl6ZSJpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5pbml0aWFsaXplJiYiY3JlYXRlU2Vzc2lvbkhhbmRsZXIiaW4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY3JlYXRlU2Vzc2lvbkhhbmRsZXImJiJkaXNwb3NlImluIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpc3Bvc2V9KG5bZV0pKXtjb25zdCB0PW5bZV07bGV0IHI9dC5pbml0aWFsaXplKCk7aWYoIm9iamVjdCI9PXR5cGVvZiByJiYidGhlbiJpbiByJiYocj1hd2FpdCByKSxyKXJldHVybiBvLnNldChlLHQpLHR9fXQuYmFja2VuZD17d2ViZ2w6bmV3IHIuV2ViR0xCYWNrZW5kfSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGZ1bmN0aW9uIGUodCl7aWYoIXQpcmV0dXJuIGUoWyJ3ZWJnbCJdKTt7Y29uc3QgZT0ic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQ7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT1vLmdldCh0KTtpZihlKXJldHVybiBlO2NvbnN0IG49YXdhaXQgaSh0KTtpZihuKXJldHVybiBufX10aHJvdyBuZXcgRXJyb3IoIm5vIGF2YWlsYWJsZSBiYWNrZW5kIHRvIHVzZSIpfTt9LDQ0MTg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQmFja2VuZD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oMjE3MSkscz1uKDMzODkpO3QuV2ViR0xCYWNrZW5kPWNsYXNze2dldCBjb250ZXh0SWQoKXtyZXR1cm4gci5lbnYud2ViZ2wuY29udGV4dElkfXNldCBjb250ZXh0SWQoZSl7ci5lbnYud2ViZ2wuY29udGV4dElkPWU7fWdldCBtYXRtdWxNYXhCYXRjaFNpemUoKXtyZXR1cm4gci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplfXNldCBtYXRtdWxNYXhCYXRjaFNpemUoZSl7ci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplPWU7fWdldCB0ZXh0dXJlQ2FjaGVNb2RlKCl7cmV0dXJuIHIuZW52LndlYmdsLnRleHR1cmVDYWNoZU1vZGV9c2V0IHRleHR1cmVDYWNoZU1vZGUoZSl7ci5lbnYud2ViZ2wudGV4dHVyZUNhY2hlTW9kZT1lO31nZXQgcGFjaygpe3JldHVybiByLmVudi53ZWJnbC5wYWNrfXNldCBwYWNrKGUpe3IuZW52LndlYmdsLnBhY2s9ZTt9Z2V0IGFzeW5jKCl7cmV0dXJuIHIuZW52LndlYmdsLmFzeW5jfXNldCBhc3luYyhlKXtyLmVudi53ZWJnbC5hc3luYz1lO31pbml0aWFsaXplKCl7dHJ5e3JldHVybiB0aGlzLmdsQ29udGV4dD0oMCxzLmNyZWF0ZVdlYkdMQ29udGV4dCkodGhpcy5jb250ZXh0SWQpLCJudW1iZXIiIT10eXBlb2YgdGhpcy5tYXRtdWxNYXhCYXRjaFNpemUmJih0aGlzLm1hdG11bE1heEJhdGNoU2l6ZT0xNiksInN0cmluZyIhPXR5cGVvZiB0aGlzLnRleHR1cmVDYWNoZU1vZGUmJih0aGlzLnRleHR1cmVDYWNoZU1vZGU9ImZ1bGwiKSwiYm9vbGVhbiIhPXR5cGVvZiB0aGlzLnBhY2smJih0aGlzLnBhY2s9ITEpLCJib29sZWFuIiE9dHlwZW9mIHRoaXMuYXN5bmMmJih0aGlzLmFzeW5jPSExKSxvLkxvZ2dlci5zZXRXaXRoRW52KHIuZW52KSxvLkxvZ2dlci52ZXJib3NlKCJXZWJHTEJhY2tlbmQiLGBDcmVhdGVkIFdlYkdMQ29udGV4dDogJHt0eXBlb2YgdGhpcy5nbENvbnRleHR9IHdpdGggbWF0bXVsTWF4QmF0Y2hTaXplOiAke3RoaXMubWF0bXVsTWF4QmF0Y2hTaXplfTsgdGV4dHVyZUNhY2hlTW9kZTogJHt0aGlzLnRleHR1cmVDYWNoZU1vZGV9OyBwYWNrOiAke3RoaXMucGFja307IGFzeW5jOiAke3RoaXMuYXN5bmN9LmApLCEwfWNhdGNoKGUpe3JldHVybiBvLkxvZ2dlci53YXJuaW5nKCJXZWJHTEJhY2tlbmQiLGBVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTEJhY2tlbmQuICR7ZX1gKSwhMX19Y3JlYXRlU2Vzc2lvbkhhbmRsZXIoZSl7cmV0dXJuIG5ldyBpLldlYkdMU2Vzc2lvbkhhbmRsZXIodGhpcyxlKX1kaXNwb3NlKCl7dGhpcy5nbENvbnRleHQuZGlzcG9zZSgpO319O30sNjg1OTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ29vcmRzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpLG89bigxOTk3KSxpPW4oNjc1Nykscz1uKDc2MTgpLGE9big0MzIpO2NsYXNzIHUgZXh0ZW5kcyBvLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMub2Zmc2V0VG9Db29yZHMoKSksdGhpcy5jb29yZHNUb09mZnNldCgpKSx0aGlzLnRvVmVjKCkpLHRoaXMudmFsdWVGcm9tKCkpLHRoaXMuZ2V0Q29tbW9uVXRpbEZ1bmNzKCkpLHRoaXMuZ2V0SW5wdXRzU2FtcGxpbmdTbmlwcGV0cygpKSx0aGlzLmdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1vZmZzZXRUb0Nvb3Jkcygpe3JldHVybiB7b2Zmc2V0VG9Db29yZHM6bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBvZmZzZXRUb0Nvb3JkcyhpbnQgb2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHtcbiAgICAgICAgaW50IHQgPSBvZmZzZXQgLyB3aWR0aDtcbiAgICAgICAgaW50IHMgPSBvZmZzZXQgLSB0KndpZHRoO1xuICAgICAgICB2ZWMyIGNvb3JkcyA9ICh2ZWMyKHMsdCkgKyB2ZWMyKDAuNSwwLjUpKSAvIHZlYzIod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgICB9XG4gICAgICAiKX19Y29vcmRzVG9PZmZzZXQoKXtyZXR1cm4ge2Nvb3Jkc1RvT2Zmc2V0Om5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIGludCBjb29yZHNUb09mZnNldCh2ZWMyIGNvb3JkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7XG4gICAgICAgIGZsb2F0IHMgPSBjb29yZHMucyAqIGZsb2F0KHdpZHRoKTtcbiAgICAgICAgZmxvYXQgdCA9IGNvb3Jkcy50ICogZmxvYXQoaGVpZ2h0KTtcbiAgICAgICAgaW50IG9mZnNldCA9IGludCh0KSAqIHdpZHRoICsgaW50KHMpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfVxuICAgICAgIil9fWdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQ7cmV0dXJuIGUuaXNQYWNrZWQ/dGhpcy5nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSk6dGhpcy5nZXRVbnBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChlKX1nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSl7Y29uc3QgdD1lLnVucGFja2VkU2hhcGUsbj1bZS53aWR0aCxlLmhlaWdodF0scj17fSxzPSJnZXRPdXRwdXRDb29yZHMiO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJbc109dGhpcy5nZXRPdXRwdXRTY2FsYXJDb29yZHMoKTticmVhaztjYXNlIDE6cltzXT10aGlzLmdldE91dHB1dFBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWQyRENvb3Jkcyh0LG4pO2JyZWFrO2Nhc2UgMzpyW3NdPXRoaXMuZ2V0T3V0cHV0UGFja2VkM0RDb29yZHModCxuKTticmVhaztkZWZhdWx0OnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWRORENvb3Jkcyh0LG4pO31jb25zdCBhPWBcbiAgICAgIHZvaWQgc2V0T3V0cHV0KHZlYzQgdmFsKSB7XG4gICAgICAgICR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmFsO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIHIuZmxvYXRUZXh0dXJlU2V0UkdCQT1uZXcgby5HbHNsTGliUm91dGluZShhKSxyfWdldFVucGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KGUpe2NvbnN0IHQ9ZS51bnBhY2tlZFNoYXBlLG49W2Uud2lkdGgsZS5oZWlnaHRdLHI9e30scz0iZ2V0T3V0cHV0Q29vcmRzIjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyW3NdPXRoaXMuZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7YnJlYWs7Y2FzZSAxOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDJEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAzOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDNEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA0OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA1OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA2OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKHQsbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG91dHB1dCBkaW1lbnNpb25hbGl0eTogJHt0Lmxlbmd0aH1gKX1jb25zdCBhPWBcbiAgICAgICAgdm9pZCBzZXRPdXRwdXQoZmxvYXQgdmFsKSB7XG4gICAgICAgICAgJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICBgO3JldHVybiByLmZsb2F0VGV4dHVyZVNldFI9bmV3IG8uR2xzbExpYlJvdXRpbmUoYSkscn1nZXRPdXRwdXRTY2FsYXJDb29yZHMoKXtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgIil9Z2V0T3V0cHV0UGFja2VkMURDb29yZHMoZSx0KXtjb25zdCBuPXQ7bGV0IHI9IiI7cmV0dXJuIDE9PT1uWzBdPyhyPWBcbiAgICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiBpbnQoVGV4Q29vcmRzLnkgKiAke25bMV19LjApO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSk6MT09PW5bMV0/KHI9YFxuICAgICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gMiAqIGludChUZXhDb29yZHMueCAqICR7blswXX0uMCk7XG4gICAgICAgICAgfVxuICAgICAgICBgLG5ldyBvLkdsc2xMaWJSb3V0aW5lKHIpKToocj1gXG4gICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueSAqICR7blswXX0gKyByZXNUZXhSQy54KTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSl9Z2V0T3V0cHV0UGFja2VkMkRDb29yZHMoZSx0KXtsZXQgbj0iIjtpZihyLkFycmF5VXRpbC5hcnJheXNFcXVhbChlLHQpKXJldHVybiBuPWBcbiAgICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIHJldHVybiAyICogaXZlYzIoVGV4Q29vcmRzLnh5ICogdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgIH1cbiAgICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobik7Y29uc3QgaT10LHM9TWF0aC5jZWlsKGVbMV0vMik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7aVswXX0sICR7aVsxXX0pKTtcblxuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke2lbMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgICBpbnQgciA9IGltb2QoaW5kZXgsICR7c30pICogMjtcbiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke3N9KTtcblxuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVsyXS8yKSxpPXIqTWF0aC5jZWlsKGVbMV0vMikscz1gXG4gICAgICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtuWzBdfSwgJHtuWzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIGludCBiID0gaW5kZXggLyAke2l9O1xuICAgICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZVxuICAgICAgICAgIGludCByID0gaW1vZChpbmRleCwgJHtyfSkgKiAyO1xuICAgICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgICAgcmV0dXJuIGl2ZWMzKGIsIHIsIGMpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzKX1nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVtlLmxlbmd0aC0xXS8yKSxpPXIqTWF0aC5jZWlsKGVbZS5sZW5ndGgtMl0vMik7bGV0IHM9aSxhPSIiLHU9ImIsIHIsIGMiO2ZvcihsZXQgdD0yO3Q8ZS5sZW5ndGgtMTt0Kyspcyo9ZVtlLmxlbmd0aC10LTFdLGE9YFxuICAgICAgaW50IGIke3R9ID0gaW5kZXggLyAke3N9O1xuICAgICAgaW5kZXggLT0gYiR7dH0gKiAke3N9O1xuICAgIGArYSx1PWBiJHt0fSwgYCt1O2NvbnN0IGw9YFxuICAgICAgaXZlYyR7ZS5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAke2F9XG5cbiAgICAgICAgaW50IGIgPSBpbmRleCAvICR7aX07XG4gICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke3J9KSAqIDI7XG4gICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgIHJldHVybiBpdmVjJHtlLmxlbmd0aH0oJHt1fSk7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCl9Z2V0T3V0cHV0VW5wYWNrZWQxRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQyRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgaW50IHIgPSBpbmRleCAvICR7ZVsxXX07XG4gICAgICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiAke2VbMV19O1xuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQzRENvb3JkcyhlLHQpe2xldCBuPSIiO2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bnVsbDtyPDImJihpPVtdKSxpPW5ldyBBcnJheShyLTEpLGlbci0yXT1lW3ItMV07Zm9yKGxldCB0PXItMzt0Pj0wOy0tdClpW3RdPWlbdCsxXSplW3QrMV07Y29uc3Qgcz1bInIiLCJjIiwiZCJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgJHthfVxuICAgICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiXSxhPWkubWFwKCgoZSx0KT0+YGludCAke3NbdF19ID0gaW5kZXggLyAke2V9OyAke3Q9PT1pLmxlbmd0aC0xP2BpbnQgJHtzW3QrMV19ID0gaW5kZXggLSAke3NbdF19ICogJHtlfWA6YGluZGV4IC09ICR7c1t0XX0gKiAke2V9YH07YCkpLmpvaW4oIiIpO3JldHVybiBuPWBcbiAgICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0WzBdfSwgJHt0WzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICAke2F9XG4gICAgICAgICAgcmV0dXJuIGl2ZWM0KHIsIGMsIGQsIGQyKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7dFswXX0gKyByZXNUZXhSQy54O1xuICAgICAgICAgICR7YX1cbiAgICAgICAgICByZXR1cm4gaXZlYzUociwgYywgZCwgZDIsIGQzKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyIsImQ0Il0sYT1pLm1hcCgoKGUsdCk9PmBpbnQgJHtzW3RdfSA9IGluZGV4IC8gJHtlfTsgJHt0PT09aS5sZW5ndGgtMT9gaW50ICR7c1t0KzFdfSA9IGluZGV4IC0gJHtzW3RdfSAqICR7ZX1gOmBpbmRleCAtPSAke3NbdF19ICogJHtlfWB9O2ApKS5qb2luKCIiKTtyZXR1cm4gbj1gXG4gICAgIGl2ZWM2IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICR7YX1cbiAgICAgICAgIHJldHVybiBpdmVjNihyLCBjLCBkLCBkMiwgZDMsIGQ0KTtcbiAgICAgICB9XG4gICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0Q29tbW9uVXRpbEZ1bmNzKCl7Y29uc3QgZT17fTtsZXQgdD0idXZGcm9tRmxhdCI7ZVt0XT1uZXcgby5HbHNsTGliUm91dGluZSgiXG4gICAgdmVjMiB1dkZyb21GbGF0KGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC8gdGV4TnVtUjtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLSB0ZXhDICogdGV4TnVtUjtcbiAgICAgIC8vIFRPRE86IHN3YXAgdGV4UiwgdGV4QyBvcmRlciBpbiBmb2xsb3dpbmcgZnVuY3Rpb24gc28gcm93IGlzIGNvcnJlc3BvbmRpbmcgdG8gdSBhbmQgY29sdW1uIGlzIGNvcnJlc3BvbmRpbmcgdG9cbiAgICAgIC8vICAgICAgIHYuXG4gICAgICByZXR1cm4gKHZlYzIodGV4UiwgdGV4QykgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1SLCB0ZXhOdW1DKTtcbiAgICB9XG4gICAgIiksdD0icGFja2VkVVZmcm9tMUQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20xRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBpbmRleCkge1xuICAgICAgICBpbnQgdGV4ZWxJbmRleCA9IGluZGV4IC8gMjtcbiAgICAgICAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSB0ZXhlbEluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xuICAgICAgfVxuICAgICAgIiksdD0icGFja2VkVVZmcm9tMkQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20yRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgaW50IHRleGVsSW5kZXggPSAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7XG4gICAgICAgIGludCB0ZXhSID0gdGV4ZWxJbmRleCAvIHRleE51bUM7XG4gICAgICAgIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InBhY2tlZFVWZnJvbTNEIixlW3RdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIHZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgICAgICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICAgICAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICAgICAgICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InNhbXBsZVRleHR1cmUiO2NvbnN0IG49KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm4gZVt0XT1uZXcgby5HbHNsTGliUm91dGluZShgXG4gICAgICAgIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XG4gICAgICAgICAgICByZXR1cm4gJHtuLnRleHR1cmUyRH0odGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xuICAgICAgICB9YCksZX1nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCl7Y29uc3QgZT17fSx0PXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgobixyKT0+e2NvbnN0IG89dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbcl0saT0oMCwgYS5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWUpKG4pO28uaXNQYWNrZWQ/ZVtpXT10aGlzLmdldFBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pOmVbaV09dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pO2NvbnN0IHM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHMpKG4pO28udW5wYWNrZWRTaGFwZS5sZW5ndGg8PXQudW5wYWNrZWRTaGFwZS5sZW5ndGgmJihvLmlzUGFja2VkP2Vbc109dGhpcy5nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMocyxvLHQsbik6ZVtzXT10aGlzLmdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKHMsbyx0LG4pKTt9KSksZX1nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz10LnVucGFja2VkU2hhcGUsdT1uLnVucGFja2VkU2hhcGUsbD1pLGM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lKShsKSxwPXMubGVuZ3RoLGQ9dS5sZW5ndGgsZj1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhzLHUpLGg9KDAsIGEuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLGc9ZC1wO2xldCBiO2NvbnN0IG09KDAsIGEuZ2V0R2xDaGFubmVscykoKTtiPTA9PT1wPyIiOmQ8MiYmZi5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpmLm1hcCgoZT0+YGNvb3Jkcy4ke21bZStnXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB5PSIiO3k9ZDwyJiZwPjA/ImNvb3JkcyI6cy5tYXAoKChlLHQpPT5gY29vcmRzLiR7bVt0K2ddfWApKS5qb2luKCIsICIpO2xldCB2PSJyZXR1cm4gb3V0cHV0VmFsdWU7Ijtjb25zdCBfPTE9PT1yLlNoYXBlVXRpbC5zaXplKHMpLHc9MT09PXIuU2hhcGVVdGlsLnNpemUodSk7aWYoMSE9PXB8fF98fHcpe2lmKF8mJiF3KXY9MT09PWQ/IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLngsIDAuLCAwLik7XG4gICAgICAgICI6IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO1xuICAgICAgICAiO2Vsc2UgaWYoZi5sZW5ndGgpe2NvbnN0IGU9cC0yLHQ9cC0xO2YuaW5kZXhPZihlKT4tMSYmZi5pbmRleE9mKHQpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpOyI6Zi5pbmRleE9mKGUpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnksIG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpOyI6Zi5pbmRleE9mKHQpPi0xJiYodj0icmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHgsIG91dHB1dFZhbHVlLnp6KTsiKTt9fWVsc2Ugdj0iXG4gICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh5LCBvdXRwdXRWYWx1ZS54eSk7XG4gICAgICAiO2NvbnN0IFQ9YFxuICAgICAgdmVjNCAke2V9KCkge1xuICAgICAgICAke2h9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBcbiAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHttW2QtMV19O1xuICAgICAgICBjb29yZHMuJHttW2QtMV19ID0gY29vcmRzLiR7bVtkLTJdfTtcbiAgICAgICAgY29vcmRzLiR7bVtkLTJdfSA9IGxhc3REaW07XG4gICAgICBcbiAgICAgICAgJHtifVxuICAgICAgICB2ZWM0IG91dHB1dFZhbHVlID0gJHtjfSgke3l9KTtcbiAgICAgICAgJHt2fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKFQsWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz1bbi53aWR0aCxuLmhlaWdodF0sdT1bdC53aWR0aCx0LmhlaWdodF0sbD10LnVucGFja2VkU2hhcGUubGVuZ3RoLGM9bi51bnBhY2tlZFNoYXBlLmxlbmd0aCxwPXQudW5wYWNrZWRTaGFwZSxkPW4udW5wYWNrZWRTaGFwZSxmPSgwLCBhLmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZSkoaSk7aWYobD09PWMmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKHUscykpe2NvbnN0IHQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2l9LCBUZXhDb29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Y29uc3QgaD0oMCwgYS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhwLGQpLGI9Yy1sO2xldCBtO2NvbnN0IHk9KDAsIGEuZ2V0R2xDaGFubmVscykoKTttPTA9PT1sPyIiOmM8MiYmZy5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpnLm1hcCgoZT0+YGNvb3Jkcy4ke3lbZStiXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB2PSIiO3Y9YzwyJiZsPjA/ImNvb3JkcyI6dC51bnBhY2tlZFNoYXBlLm1hcCgoKGUsdCk9PmBjb29yZHMuJHt5W3QrYl19YCkpLmpvaW4oIiwgIik7Y29uc3QgXz1gXG4gICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgJHtofSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICAke219XG4gICAgICAgICAgcmV0dXJuICR7Zn0oJHt2fSk7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKF8sWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsbil7c3dpdGNoKG4udW5wYWNrZWRTaGFwZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGUsdCk7Y2FzZSAxOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIxRChlLHQsbik7Y2FzZSAyOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIyRChlLHQsbik7Y2FzZSAzOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIzRChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyTkQoZSx0LG4pfX1nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbik7Y2FzZSAxOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjFEKGUsdCxuKTtjYXNlIDI6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pO2Nhc2UgMzpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbik7Y2FzZSA0OnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjREKGUsdCxuKTtjYXNlIDU6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyNUQoZSx0LG4pO2Nhc2UgNjpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXI2RChlLHQsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRpbWVuc2lvbiAke3IubGVuZ3RofS1EYCl9fWdldFBhY2tlZFNhbXBsZXJTY2FsYXIoZSx0KXtjb25zdCBuPWBcbiAgICAgICAgICB2ZWM0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4pfWdldFBhY2tlZFNhbXBsZXIxRChlLHQsbil7Y29uc3Qgcj1bbi53aWR0aCxuLmhlaWdodF0scz1bclsxXSxyWzBdXSxhPSgwLCBpLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbiksdT1gdmVjNCAke2V9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKFxuICAgICAgJHtzWzBdfSwgJHtzWzFdfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICB9YDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodSxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTFEIl0pfWdldFBhY2tlZFNhbXBsZXIyRChlLHQsbil7Y29uc3Qgcz1uLnVucGFja2VkU2hhcGUsYT1bbi53aWR0aCxuLmhlaWdodF0sdT0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLGw9YVswXSxjPWFbMV07aWYobnVsbCE9YSYmci5BcnJheVV0aWwuYXJyYXlzRXF1YWwocyxhKSl7Y29uc3Qgbj1gdmVjNCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7Y30uMCwgJHtsfS4wKTtcbiAgICAgICAgcmV0dXJuICR7dS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICAgIH1gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuKX1jb25zdCBwPWEsZD1NYXRoLmNlaWwoc1sxXS8yKSxmPWB2ZWM0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKCR7cFsxXX0sICR7cFswXX0sICR7ZH0sIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsWyJjb29yZGluYXRlcy5wYWNrZWRVVmZyb20yRCJdKX1nZXRQYWNrZWRTYW1wbGVyM0QoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLHM9W24ud2lkdGgsbi5oZWlnaHRdLHU9W3NbMF0sc1sxXV0sbD0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pO2lmKDE9PT1yWzBdKXtjb25zdCBpPXIuc2xpY2UoMSkscz1bMSwyXSx1PSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGkpLGw9WyJiIiwicm93IiwiY29sIl0sYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtjLnVucGFja2VkU2hhcGU9dTtjb25zdCBwPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsYyksZD1gJHtwLnJvdXRpbmVCb2R5fVxuICAgICAgdmVjNCAke2V9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKGwscyl9KTtcbiAgICAgIH0gYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoZCxwLmRlcGVuZGVuY2llcyl9Y29uc3QgYz11WzBdLHA9dVsxXSxkPU1hdGguY2VpbChyWzJdLzIpLGY9YHZlYzQgJHtlfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICAke3B9LCAke2N9LCAke2QqTWF0aC5jZWlsKHJbMV0vMil9LCAke2R9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtsLnRleHR1cmUyRH0oJHt0fSwgdXYpO31gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMucGFja2VkVVZmcm9tM0QiXSl9Z2V0UGFja2VkU2FtcGxlck5EKGUsdCxuKXtjb25zdCByPW4udW5wYWNrZWRTaGFwZSxzPXIubGVuZ3RoLGE9W24ud2lkdGgsbi5oZWlnaHRdLHU9KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKSxsPVthWzBdLGFbMV1dLGM9bFsxXSxwPWxbMF0sZD1NYXRoLmNlaWwocltzLTFdLzIpO2xldCBmPWQqTWF0aC5jZWlsKHJbcy0yXS8yKSxoPSJpbnQgYiwgaW50IHJvdywgaW50IGNvbCIsZz1gYiAqICR7Zn0gKyAocm93IC8gMikgKiAke2R9ICsgKGNvbCAvIDIpYDtmb3IobGV0IGU9MjtlPHMtMTtlKyspaD1gaW50IGIke2V9LCBgK2gsZio9cltzLWUtMV0sZz1gYiR7ZX0gKiAke2Z9ICsgYCtnO2NvbnN0IGI9YHZlYzQgJHtlfSgke2h9KSB7XG4gICAgICBpbnQgaW5kZXggPSAke2d9O1xuICAgICAgaW50IHRleFIgPSBpbmRleCAvICR7cH07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqICR7cH07XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3B9LCAke2N9KTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGIpfWdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbil7Y29uc3RbcixpXT1bbi53aWR0aCxuLmhlaWdodF07aWYoMT09PXImJjE9PT1pKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0IHM9YFxuICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtyfSwgJHtpfSk7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtyfSwgJHtpfSwgb2Zmc2V0XyR7dH0pO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUocyxbImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiLCJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMUQoZSx0LG4pe2NvbnN0IHI9bi53aWR0aCxpPW4uaGVpZ2h0O2lmKDE9PT1pJiYxPT09cil7Y29uc3Qgbj1gXG4gICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9aWYoMT09PWkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7cn0uMCwgMC41KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWlmKDE9PT1yKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCBpbmRleCkge1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7aX0uMCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBzPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgaW5kZXgpIHtcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3J9LCAke2l9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pe2NvbnN0IGk9bi51bnBhY2tlZFNoYXBlLHU9W24uaGVpZ2h0LG4ud2lkdGhdO2lmKG51bGwhPXUmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKGksdSkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHJvdywgY29sKSArIGhhbGZDUikgLyB2ZWMyKCR7dVsxXX0uMCwgJHt1WzBdfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0e25ld1NoYXBlOmwsa2VwdERpbXM6Y309KDAsIHMuc3F1ZWV6ZVNoYXBlKShpKSxwPWw7aWYocC5sZW5ndGg8aS5sZW5ndGgpe2NvbnN0IHI9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKGkscCkscz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtzLnVucGFja2VkU2hhcGU9cjtjb25zdCB1PVsiY29sIiwicm93Il0sbD1gXG4gICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQscykucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gJHtlfSgkeygwLCBhLmdldFNxdWVlemVkUGFyYW1zKSh1LGMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBkPXVbMV0sZj11WzBdO2lmKDE9PT1mKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtkfSwgJHtmfSk7XG4gICAgICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCBvZmZzZXRfJHt0fSksIHZlYzMoJHtpWzFdfSwgMSwgMSkpO1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHtkfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9aWYoMT09PWQpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgaW50IG9mZnNldF8ke3R9ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2R9LCAke2Z9KTtcbiAgICAgICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsIG9mZnNldF8ke3R9KSwgdmVjMygke2lbMV19LCAxLCAxKSk7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gJHtmfS4wLCAwLjUpO1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1jb25zdCBoPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgaW50IGluZGV4ID0gY29sICogJHtpWzFdfSArIHJvdztcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke2R9LCAke2Z9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzFdKnJbMl0sdT1yWzJdLHtuZXdTaGFwZTpsLGtlcHREaW1zOmN9PSgwLCBzLnNxdWVlemVTaGFwZSkocikscD1sO2lmKHAubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLHApLHM9WyJiYXRjaCIsImNvbCIsInJvdyJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD10aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsdSksZD1jLnJldmVyc2UoKSxmPWBcbiAgICAgICAgICAke2wucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgYmF0Y2gsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZCl9KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsbC5kZXBlbmRlbmNpZXMpfWNvbnN0IGQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGRlcHRoLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICAgICAgICBpbnQgaW5kZXggPSBkZXB0aCAqICR7aX0gKyBjb2wgKiAke3V9ICsgcm93O1xuICAgICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShkLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXI0RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzNdLHM9clsyXSppLGE9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7clsxXSpzfSArIGNvbCAqICR7c30gK1xuICAgICAgICAgICAgICBkZXB0aDIgKiAke2l9ICsgZGVwdGg7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1nZXRVbnBhY2tlZFNhbXBsZXI1RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzRdLHU9clszXSppLGw9clsyXSp1LGM9clsxXSpsLHtuZXdTaGFwZTpwLGtlcHREaW1zOmR9PSgwLCBzLnNxdWVlemVTaGFwZSkocik7aWYocC5sZW5ndGg8ci5sZW5ndGgpe2NvbnN0IGk9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKHIscCkscz1bInJvdyIsImNvbCIsImRlcHRoIiwiZGVwdGgyIiwiZGVwdGgzIl0sdT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTt1LnVucGFja2VkU2hhcGU9aTtjb25zdCBsPWBcbiAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgICAgcmV0dXJuICR7ZX0oJHsoMCwgYS5nZXRTcXVlZXplZFBhcmFtcykocyxkKX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWNvbnN0IGY9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7Y30gKyBjb2wgKiAke2x9ICsgZGVwdGggKiAke3V9ICtcbiAgICAgICAgICBkZXB0aDMgKiAke2l9ICsgZGVwdGgyO1xuICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyNkQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLGk9cls1XSx1PXJbNF0qaSxsPXJbM10qdSxjPXJbMl0qbCxwPXJbMV0qYyx7bmV3U2hhcGU6ZCxrZXB0RGltczpmfT0oMCwgcy5zcXVlZXplU2hhcGUpKHIpO2lmKGQubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGQpLHM9WyJyb3ciLCJjb2wiLCJkZXB0aCIsImRlcHRoMiIsImRlcHRoMyIsImRlcHRoNCJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD1gXG4gICAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZil9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Y29uc3QgaD1gXG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXG4gICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICBpbnQgaW5kZXggPSByb3cgKiAke3B9ICsgY29sICogJHtjfSArIGRlcHRoICogJHtsfSArXG4gICAgICAgICAgICBkZXB0aDIgKiAke3V9ICsgZGVwdGgzICogJHtpfSArIGRlcHRoNDtcbiAgICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX10b1ZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQsdD1lLnNoYXBlLmxlbmd0aCxuPWUuc3RyaWRlcyxyPWUud2lkdGgsaT1lLmhlaWdodCxzPVtdO2ZvcihsZXQgZT0wO2U8dC0xOysrZSlzLnB1c2goYFxuICAgICAgICBjWyR7ZX1dID0gb2Zmc2V0IC8gJHtuW2VdfTtgKSxzLnB1c2goYFxuICAgICAgICBvZmZzZXQgLT0gY1ske2V9XSAqICR7bltlXX07YCk7cy5wdXNoKGBcbiAgICAgICAgY1ske3QtMX1dID0gb2Zmc2V0O2ApO2NvbnN0IGE9YFxuICAgICAgdm9pZCB0b1ZlYyh2ZWMyIHRleENvb3Jkcywgb3V0IGludCBjWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSBjb29yZHNUb09mZnNldCh0ZXhDb29yZHMsICR7cn0sICR7aX0pO1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgICB2b2lkIHRvVmVjKGludCBvZmZzZXQsIG91dCBpbnQgY1ske3R9XSkge1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgYDtyZXR1cm4ge3RvVmVjOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX19dmFsdWVGcm9tKCl7Y29uc3QgZT17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKHQsbik9Pntjb25zdCByPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLGk9KHIudW5wYWNrZWRTaGFwZS5sZW5ndGg+MD9yLnVucGFja2VkU2hhcGU6ci5zaGFwZSkubGVuZ3RoO2xldCBzPWBfJHt0fWA7ZVtzXT1uZXcgby5HbHNsTGliUm91dGluZSh0aGlzLmdldFZhbHVlRnJvbVNpbmdsZSh0LGksci53aWR0aCxyLmhlaWdodCwhMSksW2BzaGFwZVV0aWxzLmluZGljZXNUb09mZnNldCR7c31gLCJjb29yZGluYXRlcy5vZmZzZXRUb0Nvb3JkcyIsImZyYWdjb2xvci5nZXRDb2xvckFzRmxvYXQiXSkscys9Il9UIixlW3NdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKHRoaXMuZ2V0VmFsdWVGcm9tU2luZ2xlKHQsaSxyLndpZHRoLHIuaGVpZ2h0LCEwKSxbYHNoYXBlVXRpbHMuaW5kaWNlc1RvT2Zmc2V0JHtzfWAsImNvb3JkaW5hdGVzLm9mZnNldFRvQ29vcmRzIiwiZnJhZ2NvbG9yLmdldENvbG9yQXNGbG9hdCJdKTt9KSksZX1nZXRWYWx1ZUZyb21TaW5nbGUoZSx0LG4scixvKXtsZXQgcz1gXyR7ZX1gO3JldHVybiBvJiYocys9Il9UIiksYFxuICAgICAgICBmbG9hdCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldCR7c30obSk7XG4gICAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7bn0sICR7cn0pO1xuICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7ZX0sIGNvb3JkcykpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBgfWdldFBhY2tlZFZhbHVlRnJvbShlLHQsbixyLG8pe2xldCBzPWBfJHtlfV9QYWNrYDtyZXR1cm4gbyYmKHMrPSJfVCIpLGBcbiAgICAgICAgdmVjNCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldF8ke2V9KG0pO1xuICAgICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke259LCAke3J9KTtcbiAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHtlfSwgY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgICBgfX10LkNvb3Jkc0dsc2xMaWI9dTt9LDE5OTc6KGUsdCk9Pnt2YXIgbjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXM9dC5HbHNsTGliUm91dGluZU5vZGU9dC5HbHNsTGliUm91dGluZT10Lkdsc2xMaWI9dC5HbHNsQ29udGV4dD10LkZ1bmN0aW9uVHlwZT12b2lkIDAsKG49dC5GdW5jdGlvblR5cGV8fCh0LkZ1bmN0aW9uVHlwZT17fSkpW24uVmFsdWVCYXNlZD0wXT0iVmFsdWVCYXNlZCIsbltuLlBvc2l0aW9uYWw9MV09IlBvc2l0aW9uYWwiLHQuR2xzbENvbnRleHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLnByb2dyYW1JbmZvPXQsdGhpcy5pbnB1dFRleHR1cmVMYXlvdXRzPW4sdGhpcy5vdXRwdXRUZXh0dXJlTGF5b3V0PXI7fX0sdC5HbHNsTGliPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuY29udGV4dD1lO319LHQuR2xzbExpYlJvdXRpbmU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnJvdXRpbmVCb2R5PWUsdGhpcy5kZXBlbmRlbmNpZXM9dDt9fSx0Lkdsc2xMaWJSb3V0aW5lTm9kZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5kZXBlbmRlbmNpZXM9bnx8W10sdCYmKHRoaXMucm91dGluZUJvZHk9dCk7fWFkZERlcGVuZGVuY3koZSl7ZSYmdGhpcy5kZXBlbmRlbmNpZXMucHVzaChlKTt9fSx0LlRvcG9sb2dpY2FsU29ydEdsc2xSb3V0aW5lcz1jbGFzc3tzdGF0aWMgcmV0dXJuT3JkZXJlZE5vZGVzKGUpe2lmKCFlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIFtdO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZTtjb25zdCB0PW5ldyBTZXQsbj1uZXcgU2V0LHI9bmV3IEFycmF5O3JldHVybiB0aGlzLmNyZWF0ZU9yZGVyZWROb2RlcyhlLHQsbixyKSxyfXN0YXRpYyBjcmVhdGVPcmRlcmVkTm9kZXMoZSx0LG4scil7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pdGhpcy5kZnNUcmF2ZXJzZShlW29dLHQsbixyKTt9c3RhdGljIGRmc1RyYXZlcnNlKGUsdCxuLHIpe2lmKCFlfHxuLmhhcyhlLm5hbWUpKXJldHVybjtpZih0LmhhcyhlLm5hbWUpKXRocm93IG5ldyBFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuIENhbid0IHRvcG9sb2dpY2FsbHkgc29ydCByb3V0aW5lcyBuZWVkZWQgZm9yIHNoYWRlci4iKTt0LmFkZChlLm5hbWUpO2NvbnN0IG89ZS5kZXBlbmRlbmNpZXM7aWYobyYmby5sZW5ndGg+MClmb3IobGV0IGU9MDtlPG8ubGVuZ3RoOysrZSl0aGlzLmRmc1RyYXZlcnNlKG9bZV0sdCxuLHIpO3IucHVzaChlKSxuLmFkZChlLm5hbWUpLHQuZGVsZXRlKGUubmFtZSk7fX07fSwxMzcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5FbmNvZGluZ0dsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KTtjbGFzcyBvIGV4dGVuZHMgci5HbHNsTGlie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO31nZXRGdW5jdGlvbnMoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuZW5jb2RlRmxvYXQzMigpKSx0aGlzLmRlY29kZUZsb2F0MzIoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319ZW5jb2RlRmxvYXQzMigpe3JldHVybiB7ZW5jb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCB2ZWM0IGVuY29kZShoaWdocCBmbG9hdCBmKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KGYsIDAuMCwgMC4wLCAwLjApO1xuICAgICAgfVxuICAgICAgICAiKX19ZGVjb2RlRmxvYXQzMigpe3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCBmbG9hdCBkZWNvZGUoaGlnaHAgdmVjNCByZ2JhKSB7XG4gICAgICAgIHJldHVybiByZ2JhLnI7XG4gICAgICB9XG4gICAgICAgICIpfX1lbmNvZGVVaW50OCgpe2NvbnN0IGU9by5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJuIHtlbmNvZGU6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgaGlnaHAgdmVjNCBlbmNvZGUoaGlnaHAgZmxvYXQgZikge1xuICAgICAgICBoaWdocCBmbG9hdCBGID0gYWJzKGYpO1xuICAgICAgICBoaWdocCBmbG9hdCBTaWduID0gc3RlcCgwLjAsLWYpO1xuICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IGZsb29yKGxvZzIoRikpO1xuICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IChleHAyKC0gRXhwb25lbnQpICogRik7XG4gICAgICAgIEV4cG9uZW50ID0gZmxvb3IobG9nMihGKSArIDEyNy4wKSArIGZsb29yKGxvZzIoTWFudGlzc2EpKTtcbiAgICAgICAgaGlnaHAgdmVjNCByZ2JhO1xuICAgICAgICByZ2JhWzBdID0gMTI4LjAgKiBTaWduICArIGZsb29yKEV4cG9uZW50KmV4cDIoLTEuMCkpO1xuICAgICAgICByZ2JhWzFdID0gMTI4LjAgKiBtb2QoRXhwb25lbnQsMi4wKSArIG1vZChmbG9vcihNYW50aXNzYSoxMjguMCksMTI4LjApO1xuICAgICAgICByZ2JhWzJdID0gZmxvb3IobW9kKGZsb29yKE1hbnRpc3NhKmV4cDIoMjMuMCAtOC4wKSksZXhwMig4LjApKSk7XG4gICAgICAgIHJnYmFbM10gPSBmbG9vcihleHAyKDIzLjApKm1vZChNYW50aXNzYSxleHAyKC0xNS4wKSkpO1xuICAgICAgICAke2V9XG4gICAgICAgIHJnYmEgPSByZ2JhIC8gMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIG5vcm1hbGl6ZWQgdG8gWzAsMV1cbiAgICAgICAgcmV0dXJuIHJnYmE7XG4gICAgfVxuICAgICAgICBgKX19ZGVjb2RlVWludDgoKXtjb25zdCBlPW8uaXNMaXR0bGVFbmRpYW4oKT8icmdiYS5yZ2JhPXJnYmEuYWJncjsiOiIiO3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKGBcbiAgICAgICAgaGlnaHAgZmxvYXQgZGVjb2RlKGhpZ2hwIHZlYzQgcmdiYSkge1xuICAgICAgICAgIHJnYmEgPSByZ2JhICogMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIGRlLW5vcm1hbGl6ZWQgZnJvbSBbMCwxXSB0byBbMCwyNTVdXG4gICAgICAgICAgJHtlfVxuICAgICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSAxLjAgLSBzdGVwKDEyOC4wLHJnYmFbMF0pKjIuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IDIuMCAqIG1vZChyZ2JhWzBdLDEyOC4wKSArIHN0ZXAoMTI4LjAscmdiYVsxXSkgLSAxMjcuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IG1vZChyZ2JhWzFdLDEyOC4wKSo2NTUzNi4wICsgcmdiYVsyXSoyNTYuMCArcmdiYVszXSArIGZsb2F0KDB4ODAwMDAwKTtcbiAgICAgICAgICBoaWdocCBmbG9hdCBSZXN1bHQgPSAgU2lnbiAqIGV4cDIoRXhwb25lbnQpICogKE1hbnRpc3NhICogZXhwMigtMjMuMCApKTtcbiAgICAgICAgICByZXR1cm4gUmVzdWx0O1xuICAgICAgfVxuICAgICAgICBgKX19c3RhdGljIGlzTGl0dGxlRW5kaWFuKCl7Y29uc3QgZT1uZXcgQXJyYXlCdWZmZXIoNCksdD1uZXcgVWludDMyQXJyYXkoZSksbj1uZXcgVWludDhBcnJheShlKTtpZih0WzBdPTM3MzU5Mjg1NTksMjM5PT09blswXSlyZXR1cm4gITA7aWYoMjIyPT09blswXSlyZXR1cm4gITE7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGVuZGlhbm5lc3MiKX19dC5FbmNvZGluZ0dsc2xMaWI9bzt9LDI2OTE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZyYWdDb2xvckdsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oNjc1Nyk7Y2xhc3MgaSBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLnNldEZyYWdDb2xvcigpKSx0aGlzLmdldENvbG9yQXNGbG9hdCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1zZXRGcmFnQ29sb3IoKXtjb25zdCBlPSgwLCBvLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbik7cmV0dXJuIHtzZXRGcmFnQ29sb3I6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgICB2b2lkIHNldEZyYWdDb2xvcihmbG9hdCB2YWx1ZSkge1xuICAgICAgICAgICAgJHtlLm91dHB1dH0gPSBlbmNvZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGAsWyJlbmNvZGluZy5lbmNvZGUiXSl9fWdldENvbG9yQXNGbG9hdCgpe3JldHVybiB7Z2V0Q29sb3JBc0Zsb2F0Om5ldyByLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgICAgZmxvYXQgZ2V0Q29sb3JBc0Zsb2F0KHZlYzQgY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgICIsWyJlbmNvZGluZy5kZWNvZGUiXSl9fX10LkZyYWdDb2xvckdsc2xMaWI9aTt9LDM4Nzg6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXBsYWNlSW5saW5lcz12b2lkIDA7Y29uc3Qgbj0vQGlubGluZVtcc1xuXHJdKyhcdyspW1xzXG5ccl0rKFswLTlhLXpBLVpfXSspXHMqXCgoW14pXSopXClccyp7KChbXn1dfFtcblxyXSkqKX0vZ207dC5yZXBsYWNlSW5saW5lcz1mdW5jdGlvbihlKXtjb25zdCB0PXt9O2xldCByO2Zvcig7bnVsbCE9PShyPW4uZXhlYyhlKSk7KXtjb25zdCBlPXJbM10uc3BsaXQoIiwiKS5tYXAoKGU9Pntjb25zdCB0PWUudHJpbSgpLnNwbGl0KCIgIik7cmV0dXJuIHQmJjI9PT10Lmxlbmd0aD97dHlwZTp0WzBdLG5hbWU6dFsxXX06bnVsbH0pKS5maWx0ZXIoKGU9Pm51bGwhPT1lKSk7dFtyWzJdXT17cGFyYW1zOmUsYm9keTpyWzRdfTt9Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz0iKFxcdyspP1xccysoW18wLTlhLXpBLVpdKylcXHMrPVxccytfX0ZVTkNfX1xcKCguKilcXClcXHMqOyIucmVwbGFjZSgiX19GVU5DX18iLG4pLGk9bmV3IFJlZ0V4cChvLCJnbSIpO2Zvcig7bnVsbCE9PShyPWkuZXhlYyhlKSk7KXtjb25zdCBvPXJbMV0saT1yWzJdLHM9clszXS5zcGxpdCgiLCIpLGE9bz9gJHtvfSAke2l9O2A6IiI7bGV0IHU9dFtuXS5ib2R5LGw9IiI7dFtuXS5wYXJhbXMuZm9yRWFjaCgoKGUsdCk9PntlJiYobCs9YCR7ZS50eXBlfSAke2UubmFtZX0gPSAke3NbdF19O1xuYCk7fSkpLHU9YCR7bH1cbiAke3V9YCx1PXUucmVwbGFjZSgicmV0dXJuIixgJHtpfSA9IGApO2NvbnN0IGM9YFxuICAgICAgJHthfVxuICAgICAge1xuICAgICAgICAke3V9XG4gICAgICB9XG4gICAgICBgO2U9ZS5yZXBsYWNlKHJbMF0sYyk7fX1yZXR1cm4gZS5yZXBsYWNlKG4sIiIpfTt9LDg4OTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lkdsc2xQcmVwcm9jZXNzb3I9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oMzg3OCksaT1uKDEyNDgpLHM9big2NzU3KTt0Lkdsc2xQcmVwcm9jZXNzb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4sbyl7dGhpcy5saWJzPXt9LHRoaXMuZ2xzbExpYlJvdXRpbmVEZXBlbmRlbmN5R3JhcGg9e30sdGhpcy5jb250ZXh0PW5ldyByLkdsc2xDb250ZXh0KGUsdCxuLG8pLE9iamVjdC5rZXlzKGkuZ2xzbFJlZ2lzdHJ5KS5mb3JFYWNoKChlPT57Y29uc3QgdD1uZXcgaS5nbHNsUmVnaXN0cnlbZV0odGhpcy5jb250ZXh0KTt0aGlzLmxpYnNbZV09dDt9KSk7Y29uc3Qgcz10aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoO2Zvcihjb25zdCBlIGluIHRoaXMubGlicyl7Y29uc3QgdD10aGlzLmxpYnNbZV0uZ2V0RnVuY3Rpb25zKCk7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz1lKyIuIituO2xldCBpO3Nbb10/KGk9c1tvXSxpLnJvdXRpbmVCb2R5PXRbbl0ucm91dGluZUJvZHkpOihpPW5ldyByLkdsc2xMaWJSb3V0aW5lTm9kZShvLHRbbl0ucm91dGluZUJvZHkpLHNbb109aSk7Y29uc3QgYT10W25dLmRlcGVuZGVuY2llcztpZihhKWZvcihsZXQgZT0wO2U8YS5sZW5ndGg7KytlKWlmKHNbYVtlXV0paS5hZGREZXBlbmRlbmN5KHNbYVtlXV0pO2Vsc2Uge2NvbnN0IHQ9bmV3IHIuR2xzbExpYlJvdXRpbmVOb2RlKGFbZV0pO3NbYVtlXV09dCxpLmFkZERlcGVuZGVuY3kodCk7fX19fXByZXByb2Nlc3MoKXtjb25zdCBlPXRoaXMuY29udGV4dC5wcm9ncmFtSW5mbztsZXQgdD1lLnNoYWRlclNvdXJjZTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmhhc01haW58fCh0PWAke3R9XG4gICAgICAkeygwLCBzLmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbikodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uLHRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCl9YCksdD0oMCwgby5yZXBsYWNlSW5saW5lcykodCksYCR7KDAsIHMuZ2V0RnJhZ1NoYWRlclByZWFtYmxlKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pfVxuICAgICR7dGhpcy5nZXRVbmlmb3JtcyhlLmlucHV0TmFtZXMsZS52YXJpYWJsZXMpfVxuICAgICR7dGhpcy5nZXRJbXBvcnRzKHQpfVxuICAgICR7dH1gfWdldEltcG9ydHMoZSl7Y29uc3QgdD10aGlzLnNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuICIiO2xldCBuPSIiO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXS5yb3V0aW5lQm9keSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYm9keSBmb3IgdGhlIEdsc2wgTGlicmFyeSByb3V0aW5lOiAke3RbZV0ubmFtZX1gKTtuKz10W2VdLnJvdXRpbmVCb2R5KyJcbiI7fXJldHVybiBufXNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKXtjb25zdCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnNwbGl0KCIuIilbMV07LTEhPT1lLmluZGV4T2YocikmJnQucHVzaCh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoW25dKTt9KSksci5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXMucmV0dXJuT3JkZXJlZE5vZGVzKHQpfWdldFVuaWZvcm1zKGUsdCl7Y29uc3Qgbj1bXTtpZihlKWZvcihjb25zdCB0IG9mIGUpbi5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3R9O2ApO2lmKHQpZm9yKGNvbnN0IGUgb2YgdCluLnB1c2goYHVuaWZvcm0gJHtlLnR5cGV9ICR7ZS5uYW1lfSR7ZS5hcnJheUxlbmd0aD9gWyR7ZS5hcnJheUxlbmd0aH1dYDoiIn07YCk7cmV0dXJuIG4uam9pbigiXG4iKX19O30sMTI0ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2xzbFJlZ2lzdHJ5PXZvaWQgMDtjb25zdCByPW4oNjg1OSksbz1uKDEzNzEpLGk9bigyNjkxKSxzPW4oOTE4MyksYT1uKDkzMTQpO3QuZ2xzbFJlZ2lzdHJ5PXtlbmNvZGluZzpvLkVuY29kaW5nR2xzbExpYixmcmFnY29sb3I6aS5GcmFnQ29sb3JHbHNsTGliLHZlYzphLlZlY0dsc2xMaWIsc2hhcGVVdGlsczpzLlNoYXBlVXRpbHNHbHNsTGliLGNvb3JkaW5hdGVzOnIuQ29vcmRzR2xzbExpYn07fSw5MTgzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TaGFwZVV0aWxzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDE5OTcpO2NsYXNzIG8gZXh0ZW5kcyByLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iY2FzdEluZGV4KCkpLHRoaXMuYmNhc3RNYXRtdWxJbmRleCgpKSx0aGlzLm9mZnNldFRvSW5kaWNlcygpKSx0aGlzLmluZGljZXNUb09mZnNldCgpKSx0aGlzLmluY3JlbWVudEluZGljZXMoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319YmNhc3RJbmRleCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLHQ9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKChuLG8pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tvXS51bnBhY2tlZFNoYXBlO2lmKGkubGVuZ3RoPD1lKXtjb25zdCBvPWkubGVuZ3RoLHM9ZS1vLGE9YGJjYXN0SW5kaWNlc18ke259YDtsZXQgdT0iIjtmb3IobGV0IGU9MDtlPG87KytlKXUrPWBcbiAgICAgICAgICByZWFsSW5kaWNlc1ske2V9XSA9IGludCggbW9kKGZsb2F0KGJjYXN0ZWRJbmRpY2VzWyR7cytlfV0pLCAke2lbZV19LjApICk7XG4gICAgICAgICAgYDtjb25zdCBsPWBcbiAgICAgICAgdm9pZCAke2F9IChpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1iY2FzdE1hdG11bEluZGV4KCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKG4sbyk9Pntjb25zdCBpPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW29dLnNoYXBlO2lmKCEoaS5sZW5ndGg8Mnx8aS5sZW5ndGg+ZSkpe2NvbnN0IG89aS5sZW5ndGgscz1lLW8sYT1gYmNhc3RNYXRtdWxJbmRpY2VzXyR7bn1gO2xldCB1PSIiO2ZvcihsZXQgZT0wO2U8by0yOysrZSl1Kz1gXG4gICAgICAgICAgcmVhbEluZGljZXNbJHtlfV0gPSBpbnQoIG1vZChmbG9hdChiY2FzdGVkSW5kaWNlc1ske3MrZX1dKSwgJHtpW2VdfS4wKSApO1xuICAgICAgICAgIGA7Y29uc3QgbD1gXG4gICAgICAgIHZvaWQgJHthfShpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTF9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0xfV07XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTJ9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0yfV07XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1pbmRpY2VzVG9PZmZzZXQoKXtjb25zdCBlPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgodCxuKT0+e2NvbnN0IGk9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbbl0uc2hhcGUscz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zdHJpZGVzLGE9aS5sZW5ndGg7bGV0IHU9YGluZGljZXNUb09mZnNldF8ke3R9YDtlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8uaW5kZXhUb09mZnNldFNpbmdsZSh1LGEscykpLHU9YGluZGljZXNUb09mZnNldF8ke3R9X1RgLGVbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5pbmRleFRvT2Zmc2V0U2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIGluZGV4VG9PZmZzZXRTaW5nbGUoZSx0LG4pe2xldCByPSIiO2ZvcihsZXQgZT10LTE7ZT49MDstLWUpcis9YFxuICAgICAgICBvZmZzZXQgKz0gaW5kaWNlc1ske2V9XSAqICR7bltlXX07XG4gICAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGludCAke2V9KGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSAwO1xuICAgICAgICAke3J9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICB9XG4gICAgICBgfW9mZnNldFRvSW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxzPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLnN0cmlkZXMsYT1pLmxlbmd0aDtsZXQgdT1gb2Zmc2V0VG9JbmRpY2VzXyR7dH1gO2VbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5vZmZzZXRUb0luZGljZXNTaW5nbGUodSxhLHMpKSx1PWBvZmZzZXRUb0luZGljZXNfJHt0fV9UYCxlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8ub2Zmc2V0VG9JbmRpY2VzU2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIG9mZnNldFRvSW5kaWNlc1NpbmdsZShlLHQsbil7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQtMTsrK2Upci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHtlfV0gPSBvZmZzZXQgLyAke25bZV19O2ApLHIucHVzaChgXG4gICAgICAgIG9mZnNldCAtPSBpbmRpY2VzWyR7ZX1dICogJHtuW2VdfTtgKTtyZXR1cm4gci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHt0LTF9XSA9IG9mZnNldDtgKSxgXG4gICAgICB2b2lkICR7ZX0oaW50IG9mZnNldCwgb3V0IGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgICR7ci5qb2luKCIiKX1cbiAgICAgIH1cbiAgICAgIGB9aW5jcmVtZW50SW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3Qgbz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxpPW8ubGVuZ3RoLHM9YGluY3JlbWVudEluZGljZXNfJHt0fWA7bGV0IGE9IiI7Zm9yKGxldCBlPTA7ZTxpOysrZSlhKz1gXG4gICAgICAgIHNoYXBlWyR7ZX1dID0gJHtvW2VdfTtgO2NvbnN0IHU9YFxuICAgICAgICB2b2lkICR7c30oaW50IGF4aXMsIG91dCBpbnQgaW5kaWNlc1ske2l9XSkge1xuICAgICAgICAgIGludCBzaGFwZVske2l9XTtcbiAgICAgICAgICAke2F9O1xuICAgICAgICAgIGZvcihpbnQgaSA9ICR7aX0gLTEgOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgaWYoaSA+IGF4aXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5kaWNlc1tpXSArPSAxO1xuICAgICAgICAgICAgaWYoaW5kaWNlc1tpXSA8IHNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGA7ZVtzXT1uZXcgci5HbHNsTGliUm91dGluZSh1KTt9KSksZX19dC5TaGFwZVV0aWxzR2xzbExpYj1vO30sNjc1NzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbj10LmdldEZyYWdTaGFkZXJQcmVhbWJsZT10LmdldFZlcnRleFNoYWRlclNvdXJjZT10LmdldEdsc2w9dm9pZCAwO2NvbnN0IG49e3ZlcnNpb246IiIsYXR0cmlidXRlOiJhdHRyaWJ1dGUiLHZhcnlpbmdWZXJ0ZXg6InZhcnlpbmciLHZhcnlpbmdGcmFnOiJ2YXJ5aW5nIix0ZXh0dXJlMkQ6InRleHR1cmUyRCIsb3V0cHV0OiJnbF9GcmFnQ29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiIifSxyPXt2ZXJzaW9uOiIjdmVyc2lvbiAzMDAgZXMiLGF0dHJpYnV0ZToiaW4iLHZhcnlpbmdWZXJ0ZXg6Im91dCIsdmFyeWluZ0ZyYWc6ImluIix0ZXh0dXJlMkQ6InRleHR1cmUiLG91dHB1dDoib3V0cHV0Q29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiJvdXQgdmVjNCBvdXRwdXRDb2xvcjsifTtmdW5jdGlvbiBvKGUpe3JldHVybiAxPT09ZT9uOnJ9dC5nZXRHbHNsPW8sdC5nZXRWZXJ0ZXhTaGFkZXJTb3VyY2U9ZnVuY3Rpb24oZSl7Y29uc3QgdD1vKGUpO3JldHVybiBgJHt0LnZlcnNpb259XG4gICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgICAke3QuYXR0cmlidXRlfSB2ZWMzIHBvc2l0aW9uO1xuICAgICAgJHt0LmF0dHJpYnV0ZX0gdmVjMiB0ZXh0dXJlQ29vcmQ7XG5cbiAgICAgICR7dC52YXJ5aW5nVmVydGV4fSB2ZWMyIFRleENvb3JkcztcblxuICAgICAgdm9pZCBtYWluKClcbiAgICAgIHtcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICAgICAgVGV4Q29vcmRzID0gdGV4dHVyZUNvb3JkO1xuICAgICAgfWB9LHQuZ2V0RnJhZ1NoYWRlclByZWFtYmxlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9byhlKTtyZXR1cm4gYCR7dC52ZXJzaW9ufVxuICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICBwcmVjaXNpb24gaGlnaHAgaW50O1xuICAgIHByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7XG4gICAgJHt0LnZhcnlpbmdGcmFnfSB2ZWMyIFRleENvb3JkcztcbiAgICAke3Qub3V0cHV0RGVjbGFyYXRpb259XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIC8vIEN1c3RvbSB2ZWN0b3IgdHlwZXMgdG8gaGFuZGxlIGhpZ2hlciBkaW1lbmFsaXRpZXMuXG4gICAgc3RydWN0IGl2ZWM1XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICB9O1xuXG4gICAgc3RydWN0IGl2ZWM2XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICAgIGludCB2O1xuICAgIH07XG5cbiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHtcbiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7XG4gICAgfVxuXG4gICAgYH0sdC5nZXREZWZhdWx0RnJhZ1NoYWRlck1haW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYFxuICB2b2lkIG1haW4oKSB7XG4gICAgaW50IGluZGljZXNbJHt0fV07XG4gICAgdG9WZWMoVGV4Q29vcmRzLCBpbmRpY2VzKTtcbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQocHJvY2VzcyhpbmRpY2VzKSk7XG4gICAgJHtvKGUpLm91dHB1dH0gPSByZXN1bHQ7XG4gIH1cbiAgYH07fSw5MzE0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5WZWNHbHNsTGliPXZvaWQgMDtjb25zdCByPW4oMTk5Nyk7Y2xhc3MgbyBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iaW5hcnlWZWNGdW5jdGlvbnMoKSksdGhpcy5jb3B5VmVjKCkpLHRoaXMuc2V0VmVjSXRlbSgpKSx0aGlzLmdldFZlY0l0ZW0oKSl9YmluYXJ5VmVjRnVuY3Rpb25zKCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17YWRkOiIrPSIsc3ViOiItPSIsbXVsOiIqPSIsZGl2OiIvPSJ9LG49e307Zm9yKGNvbnN0IG8gaW4gdCl7Y29uc3QgaT1gJHtvfVZlY2A7bGV0IHM9IiI7Zm9yKGxldCBuPTA7bjxlOysrbilzKz1gXG4gICAgICAgICAgZGVzdFske259XSAke3Rbb119IHNyY1ske259XTtcbiAgICAgICAgICBgO2NvbnN0IGE9YFxuICAgICAgICB2b2lkICR7aX0oaW50IHNyY1ske2V9XSwgb3V0IGludCBkZXN0WyR7ZX1dKSB7XG4gICAgICAgICAgJHtzfVxuICAgICAgICB9XG4gICAgICAgIGA7bltpXT1uZXcgci5HbHNsTGliUm91dGluZShhKTt9cmV0dXJuIG59Y29weVZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PSIiO2ZvcihsZXQgbj0wO248ZTsrK24pdCs9YFxuICAgICAgICBkZXN0WyR7bn1dID0gc3JjWyR7bn1dO1xuICAgICAgICBgO2NvbnN0IG49YFxuICAgICAgdm9pZCBjb3B5VmVjKGludCBzcmNbJHtlfV0sIG91dCBpbnQgZGVzdFske2V9XSkge1xuICAgICAgICAke3R9XG4gICAgICB9XG4gICAgICBgO3JldHVybiB7Y29weVZlYzpuZXcgci5HbHNsTGliUm91dGluZShuKX19c2V0VmVjSXRlbSgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PWBcbiAgICAgICAgaWYoaW5kZXggPCAwKVxuICAgICAgICAgICAgaW5kZXggPSR7ZX0gKyBpbmRleDtcbiAgICAgICAgaWYgKGluZGV4ID09IDApXG4gICAgICAgICAgICBtWzBdID0gdmFsdWU7XG4gICAgICAgIGA7Zm9yKGxldCBuPTE7bjxlLTE7KytuKXQrPWBcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT0gJHtufSlcbiAgICAgICAgICAgIG1bJHtufV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGA7dCs9YFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtWyR7ZS0xfV0gPSB2YWx1ZTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIHZvaWQgc2V0VmVjSXRlbShvdXQgaW50IG1bJHtlfV0sIGludCBpbmRleCwgaW50IHZhbHVlKSB7XG4gICAgICAgICR7dH1cbiAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4ge3NldFZlY0l0ZW06bmV3IHIuR2xzbExpYlJvdXRpbmUobil9fWdldFZlY0l0ZW0oKXtjb25zdCBlPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aDtsZXQgdD1gXG4gICAgICAgIGlmKGluZGV4IDwgMClcbiAgICAgICAgICAgIGluZGV4ID0gJHtlfSArIGluZGV4O1xuICAgICAgICBpZiAoaW5kZXggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgYDtmb3IobGV0IG49MTtuPGUtMTsrK24pdCs9YFxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAke259KVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtufV07XG4gICAgICBgO3QrPWBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtlLTF9XTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIGludCBnZXRWZWNJdGVtKGludCBtWyR7ZX1dLCBpbnQgaW5kZXgpIHtcbiAgICAgICAgJHt0fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIHtnZXRWZWNJdGVtOm5ldyByLkdsc2xMaWJSb3V0aW5lKG4pfX19dC5WZWNHbHNsTGliPW87fSw3ODYwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigxMzE1KSxvPW4oOTI0MCksaT1uKDcyNzMpLHM9big5KSxhPW4oNzM3OSksdT1uKDI0ODgpLGw9big1NDApLGM9bigzMzE0KSxwPW4oNTYzOSk7dC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9Y2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGUsdCl7cmV0dXJuICgwLCBjLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUsdCl9ZXhlY3V0ZVByb2dyYW0oZSx0KXtpZih0Lmxlbmd0aDxlLmlucHV0TmFtZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgSW5wdXQgc2l6ZSBtdXN0bid0IGJlIGxlc3MgdGhhbiAke2UuaW5wdXROYW1lcy5sZW5ndGh9LmApO2lmKGUuaW5wdXROYW1lcy5sZW5ndGghPT1lLmlucHV0VHlwZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiaW5wdXQgbmFtZXMgc2l6ZSBkb2VzIG5vdCBtYXRjaCBpbnB1dCB0eXBlcyIpO2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlLmlucHV0TmFtZXMubGVuZ3RoOysrciluW3JdPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0W3JdLGUuaW5wdXRUeXBlc1tyXSk7Y29uc3Qgcj0oKGUsdCk9Pntjb25zdCBuPXQubWFwKChlPT5gJHtlLnVucGFja2VkU2hhcGUuam9pbigiLCIpfTske2Uud2lkdGh9eCR7ZS5oZWlnaHR9YCkpLmpvaW4oIl8iKTtsZXQgcj1lLm5hbWU7cmV0dXJuIGUuY2FjaGVIaW50JiYocis9IlsiK2UuY2FjaGVIaW50KyJdIikscis9IjoiK24scn0pKGUsbik7bGV0IG89dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmdldEFydGlmYWN0KHIpO2NvbnN0IGk9bz9vLnByb2dyYW1JbmZvOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldD9lLmdldCgpOmUscz0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksaS5vdXRwdXQuZGltcyxpLm91dHB1dC50ZXh0dXJlVHlwZSksYT10aGlzLmNyZWF0ZVRleHR1cmVEYXRhKHMsaS5vdXRwdXQudHlwZSk7cmV0dXJuIG98fChvPXRoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5idWlsZChpLG4sYSksdGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLnNldEFydGlmYWN0KHIsbykpLHRoaXMucnVuUHJvZ3JhbShvLG4sYSksYX1ydW4oZSx0KXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbShlLHQpLnRlbnNvcn1ydW5Qcm9ncmFtKGUsdCxuKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoOysrbilpZighIXRbbl0uaXNQYWNrZWQhPShlLnByb2dyYW1JbmZvLmlucHV0VHlwZXNbbl09PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKGBpbnB1dFske259XSBwcm9wZXJ0eSBwYWNrZWQgaW5jb25zaXN0ZW50YCk7aWYoISFuLmlzUGFja2VkIT0oZS5wcm9ncmFtSW5mby5vdXRwdXQudGV4dHVyZVR5cGU9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKCJvdXRwdXQgcHJvcGVydHkgcGFja2VkIGluY29uc2lzdGVudCIpO3RoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5ydW4oZSx0LG4pO31nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUsdCl7bGV0IG49dGhpcy5nZXRUZXh0dXJlRGF0YShlLmRhdGFJZCx0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCFuJiYobj10aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQhPT1wLlRleHR1cmVUeXBlLnBhY2tlZCksbikpcmV0dXJuIHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZD90aGlzLnBhY2sobik6dGhpcy51bnBhY2sobik7aWYoIW4pe2NvbnN0IHI9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUuZGltcyx0KTtpZih0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKXtjb25zdCBuPTEscj00LG89ZS5kaW1zO2lmKDQ9PT1vLmxlbmd0aCl7Y29uc3QgaT1bb1swXSxNYXRoLmNlaWwob1sxXSpvWzJdKm9bM10vcildLHM9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGksdCk7bGV0IGE9ZS5udW1iZXJEYXRhO2lmKG9bMV0qb1syXSpvWzNdJXIhPTApe2NvbnN0IHQ9b1swXSxpPW9bMV0qb1syXSpvWzNdLHM9TWF0aC5jZWlsKGkqbi9yKSpyO2E9bmV3IEZsb2F0MzJBcnJheSh0KnMpO2ZvcihsZXQgcj0wO3I8dDsrK3Ipe2NvbnN0IHQ9cippLG89cipzK3IlbippO2Euc2V0KGUubnVtYmVyRGF0YS5zdWJhcnJheSh0LHQraSksbyk7fX1yZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YShzLGUudHlwZSxhLGUsMSl9fWlmKHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCl7Y29uc3QgdD0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksZS5kaW1zLDEsW10se3JldmVyc2VXSDohMH0pLHI9dGhpcy5jcmVhdGVUZXh0dXJlRGF0YSh0LGUudHlwZSxlLm51bWJlckRhdGEsZSwxKTtuPXRoaXMucGFjayhyKTt9ZWxzZSBuPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEocixlLnR5cGUsZS5udW1iZXJEYXRhLGUsMSk7fXJldHVybiBufWNyZWF0ZVRleHR1cmVEYXRhRnJvbUxheW91dEJpbmRUZW5zb3IoZSx0LG4scil7cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGEoZSx0LG4sciwxKX1jcmVhdGVUZXh0dXJlRGF0YShlLHQsbixvLGkpe3IuTG9nZ2VyLnZlcmJvc2UoIkluZmVyZW5jZUhhbmRsZXIiLGBDcmVhdGluZyBUZXh0dXJlRGF0YTogbGF5b3V0Olske0pTT04uc3RyaW5naWZ5KGUpfV1gKTtjb25zdCBzPXRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5jcmVhdGVUZXh0dXJlRnJvbUxheW91dCh0LGUsbixpKTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKGUsdCxzLG8pfXJlc2hhcGVVbnBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS51bnBhY2tlZCkscj17Y2hhbm5lbHM6bi5jaGFubmVscyxoZWlnaHQ6bi5oZWlnaHQsd2lkdGg6bi53aWR0aCxzaGFwZTowIT09dC5sZW5ndGg/dDpbMV0sc3RyaWRlczppLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0KSx1bnBhY2tlZFNoYXBlOnR9O3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUocixlLnR5cGUsbi50ZXh0dXJlKS50ZW5zb3J9cmVzaGFwZVBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCgwLCBhLmlzUmVzaGFwZUNoZWFwKShlLmRpbXMsdCkpe2NvbnN0IHI9e2NoYW5uZWxzOm4uY2hhbm5lbHMsaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgsc2hhcGU6MCE9PXQubGVuZ3RoP3Q6WzFdLHN0cmlkZXM6aS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModCksdW5wYWNrZWRTaGFwZTp0LGlzUGFja2VkOiEwfTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKHIsZS50eXBlLG4udGV4dHVyZSkudGVuc29yfWNvbnN0IHI9KDAsIGEucHJvY2Vzc0RpbXMzRCkoZS5kaW1zKSxvPSgwLCBhLnByb2Nlc3NEaW1zM0QpKHQpLHM9dGhpcy5yZXNoYXBlUGFja2VkKGUsciksdT10aGlzLnJ1bigoMCwgYS5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcikodGhpcyxzLG8pLFtzXSk7cmV0dXJuIHRoaXMucmVzaGFwZVBhY2tlZCh1LHQpfWNhc3QoZSx0KXtjb25zdCBuPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YShlLHAuVGV4dHVyZVR5cGUudW5wYWNrZWQpO3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUobix0LG4udGV4dHVyZSkudGVuc29yfWNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUoZSx0LG4scixpKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7dGVuc29yOnJ8fG5ldyBvLlRlbnNvcihlLnVucGFja2VkU2hhcGUsdCwoZT0+dGhpcy5yZWFkVGV4dHVyZShzKSksKGFzeW5jIGU9PnRoaXMucmVhZFRleHR1cmVBc3luYyhzKSksdm9pZCAwLGkpLHRleHR1cmU6bn0pO3JldHVybiB0aGlzLnNldFRleHR1cmVEYXRhKHMudGVuc29yLmRhdGFJZCxzLGUuaXNQYWNrZWQpLHN9Z2V0VGV4dHVyZURhdGEoZSx0PSExKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLmdldFRleHR1cmVEYXRhKGUsdCk6dD90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KGUpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKX1zZXRUZXh0dXJlRGF0YShlLHQsbj0hMSl7dGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLnNldFRleHR1cmVEYXRhKGUsdCxuKToobj90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUpLnNldChlLHQpO31pc1RleHR1cmVMYXlvdXRDYWNoZWQoZSx0PSExKXtyZXR1cm4gISF0aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQpfWRpc3Bvc2UoKXt0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIuY2xlYXJBY3RpdmVUZXh0dXJlcygpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwO31yZWFkVGV4dHVyZShlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlKHRoaXMudW5wYWNrKGUpKTp0aGlzLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ/dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlKGUsZS50ZW5zb3IudHlwZSxlLmNoYW5uZWxzKTp0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFVpbnQ4VGV4dHVyZUFzRmxvYXQoKDAsIHUuZW5jb2RlQXNVaW50OCkodGhpcyxlKSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlQXN5bmModGhpcy51bnBhY2soZSkpOnRoaXMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC5pc0Zsb2F0MzJEb3dubG9hZFN1cHBvcnRlZD90aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmVBc3luYyhlLGUudGVuc29yLnR5cGUsZS5jaGFubmVscyk6dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0KCgwLCB1LmVuY29kZUFzVWludDgpKHRoaXMsZSkpfXBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIHMuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyKSh0aGlzLGUudGVuc29yKSxbZS50ZW5zb3JdKX11bnBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIGwuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXIpKHRoaXMsZS50ZW5zb3IpLFtlLnRlbnNvcl0pfX07fSw0MTEwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pO28mJiEoImdldCJpbiBvPyF0Ll9fZXNNb2R1bGU6by53cml0YWJsZXx8by5jb25maWd1cmFibGUpfHwobz17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG8pO306ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9biksZVtyXT10W25dO30pLG89dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KTt9OmZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQ7fSksaT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpImRlZmF1bHQiIT09biYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnIodCxlLG4pO3JldHVybiBvKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuV0VCR0xfT1BfUkVTT0xWRV9SVUxFUz12b2lkIDA7Y29uc3Qgcz1uKDg4MTcpLGE9aShuKDUxOTQpKSx1PW4oNDc1MiksbD1uKDY2NjgpLGM9big5NzU0KSxwPW4oNTA0MiksZD1uKDY3NDIpLGY9big0MTI1KSxoPW4oNjE0OSksZz1uKDUzNzgpLGI9big2OTgxKSxtPW4oNzQxMykseT1uKDcwMDYpLHY9big4Mjc2KSxfPW4oNTU2NSksdz1uKDI4MzQpLFQ9bigxMDEwKSx4PW4oODEyNiksTz1uKDI4MDEpLFM9big1NjUpLEE9bigyNDQ0KSxQPW4oODE1KSxJPW4oNTY0KSxFPW4oNTQxNiksRD1uKDEyNDApLCQ9big1OTQ0KSxrPW4oNTcwNyksRj1pKG4oOTA4NykpLE49big3ODYyKSxqPW4oMzk4MCk7dC5XRUJHTF9PUF9SRVNPTFZFX1JVTEVTPVtbIkFicyIsIiIsIjYrIixGLmFic10sWyJBY29zIiwiIiwiNysiLEYuYWNvc10sWyJBZGQiLCIiLCI3KyIsYS5hZGRdLFsiQW5kIiwiIiwiNysiLGEuYW5kXSxbIkFzaW4iLCIiLCI3KyIsRi5hc2luXSxbIkF0YW4iLCIiLCI3KyIsRi5hdGFuXSxbIkF2ZXJhZ2VQb29sIiwiIiwiNysiLHcuYXZlcmFnZVBvb2wsdy5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJCYXRjaE5vcm1hbGl6YXRpb24iLCIiLCI3KyIscy5iYXRjaE5vcm1hbGl6YXRpb24scy5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiQ2FzdCIsIiIsIjYrIix1LmNhc3QsdS5wYXJzZUNhc3RBdHRyaWJ1dGVzXSxbIkNlaWwiLCIiLCI2KyIsRi5jZWlsXSxbIkNsaXAiLCIiLCI2LTEwIixGLmNsaXAsRi5wYXJzZUNsaXBBdHRyaWJ1dGVzXSxbIkNsaXAiLCIiLCIxMSsiLEYuY2xpcFYxMV0sWyJDb25jYXQiLCIiLCI0KyIsbC5jb25jYXQsbC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXNdLFsiQ29udiIsIiIsIjErIixjLmNvbnYsYy5wYXJzZUNvbnZBdHRyaWJ1dGVzXSxbIkNvbnZUcmFuc3Bvc2UiLCIiLCIxKyIscC5jb252VHJhbnNwb3NlLHAucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlc10sWyJDb3MiLCIiLCI3KyIsRi5jb3NdLFsiRGl2IiwiIiwiNysiLGEuZGl2XSxbIkRyb3BvdXQiLCIiLCI3KyIsRi5pZGVudGl0eV0sWyJEZXB0aFRvU3BhY2UiLCIiLCIxKyIsZC5kZXB0aFRvU3BhY2UsZC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXNdLFsiRXF1YWwiLCIiLCI3KyIsYS5lcXVhbF0sWyJFbHUiLCIiLCI2KyIsRi5lbHUsRi5wYXJzZUVsdUF0dHJpYnV0ZXNdLFsiRXhwIiwiIiwiNisiLEYuZXhwXSxbIkZsYXR0ZW4iLCIiLCIxKyIsZi5mbGF0dGVuLGYucGFyc2VGbGF0dGVuQXR0cmlidXRlc10sWyJGbG9vciIsIiIsIjYrIixGLmZsb29yXSxbIkZ1c2VkQ29udiIsImNvbS5taWNyb3NvZnQiLCIxKyIsYy5jb252LGMucGFyc2VDb252QXR0cmlidXRlc10sWyJHYXRoZXIiLCIiLCIxKyIsaC5nYXRoZXIsaC5wYXJzZUdhdGhlckF0dHJpYnV0ZXNdLFsiR2VtbSIsIiIsIjctMTAiLGcuZ2VtbSxnLnBhcnNlR2VtbUF0dHJpYnV0ZXNWN10sWyJHZW1tIiwiIiwiMTErIixnLmdlbW0sZy5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExXSxbIkdsb2JhbEF2ZXJhZ2VQb29sIiwiIiwiMSsiLHcuZ2xvYmFsQXZlcmFnZVBvb2wsdy5wYXJzZUdsb2JhbEF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJHbG9iYWxNYXhQb29sIiwiIiwiMSsiLHcuZ2xvYmFsTWF4UG9vbF0sWyJHcmVhdGVyIiwiIiwiNysiLGEuZ3JlYXRlcl0sWyJJZGVudGl0eSIsIiIsIjErIixGLmlkZW50aXR5XSxbIkltYWdlU2NhbGVyIiwiIiwiMSsiLGIuaW1hZ2VTY2FsZXIsYi5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlc10sWyJJbnN0YW5jZU5vcm1hbGl6YXRpb24iLCIiLCI2KyIsbS5pbnN0YW5jZU5vcm1hbGl6YXRpb24sbS5wYXJzZUluc3RhbmNlTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiTGVha3lSZWx1IiwiIiwiNisiLEYubGVha3lSZWx1LEYucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzXSxbIkxlc3MiLCIiLCI3KyIsYS5sZXNzXSxbIkxSTiIsIiIsIjErIix5Lmxybix5LnBhcnNlTHJuQXR0cmlidXRlc10sWyJMb2ciLCIiLCI2KyIsRi5sb2ddLFsiTWF0TXVsIiwiIiwiMSsiLHYubWF0TXVsLHYucGFyc2VNYXRNdWxBdHRyaWJ1dGVzXSxbIk1heFBvb2wiLCIiLCIxKyIsdy5tYXhQb29sLHcucGFyc2VNYXhQb29sQXR0cmlidXRlc10sWyJNdWwiLCIiLCI3KyIsYS5tdWxdLFsiTmVnIiwiIiwiNisiLEYubmVnXSxbIk5vdCIsIiIsIjErIixGLm5vdF0sWyJPciIsIiIsIjcrIixhLm9yXSxbIlBhZCIsIiIsIjItMTAiLF8ucGFkVjIsXy5wYXJzZVBhZEF0dHJpYnV0ZXNWMl0sWyJQYWQiLCIiLCIxMSsiLF8ucGFkVjExLF8ucGFyc2VQYWRBdHRyaWJ1dGVzVjExXSxbIlBvdyIsIiIsIjcrIixhLnBvd10sWyJQUmVsdSIsIiIsIjcrIixhLnBSZWx1XSxbIlJlZHVjZUxvZ1N1bSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VNYXgiLCIiLCIxKyIsVC5yZWR1Y2VNYXgsVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWVhbiIsIiIsIjErIixULnJlZHVjZU1lYW4sVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWluIiwiIiwiMSsiLFQucmVkdWNlTWluLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVByb2QiLCIiLCIxKyIsVC5yZWR1Y2VQcm9kLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bSIsIiIsIjEtMTIiLFQucmVkdWNlU3VtLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bVNxdWFyZSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bVNxdWFyZSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWx1IiwiIiwiNisiLEYucmVsdV0sWyJSZXNoYXBlIiwiIiwiNSsiLHgucmVzaGFwZV0sWyJSZXNpemUiLCIiLCIxMCIsTy5yZXNpemUsTy5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTBdLFsiUmVzaXplIiwiIiwiMTErIixPLnJlc2l6ZSxPLnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMV0sWyJTaGFwZSIsIiIsIjErIixTLnNoYXBlXSxbIlNpZ21vaWQiLCIiLCI2KyIsRi5zaWdtb2lkXSxbIlNpbiIsIiIsIjcrIixGLnNpbl0sWyJTbGljZSIsIiIsIjEwKyIsQS5zbGljZVYxMF0sWyJTbGljZSIsIiIsIjEtOSIsQS5zbGljZSxBLnBhcnNlU2xpY2VBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxLTEyIixQLnNvZnRtYXgsUC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxMysiLFAuc29mdG1heFYxMyxQLnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTNdLFsiU3BsaXQiLCIiLCIyLTEyIixJLnNwbGl0LEkucGFyc2VTcGxpdEF0dHJpYnV0ZXNdLFsiU3FydCIsIiIsIjYrIixGLnNxcnRdLFsiU3F1ZWV6ZSIsIiIsIjEtMTIiLEUuc3F1ZWV6ZSxFLnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXNdLFsiU3F1ZWV6ZSIsIiIsIjEzKyIsRS5zcXVlZXplVjEzXSxbIlN1YiIsIiIsIjcrIixhLnN1Yl0sWyJTdW0iLCIiLCI2KyIsRC5zdW1dLFsiVGFuIiwiIiwiNysiLEYudGFuXSxbIlRhbmgiLCIiLCI2KyIsRi50YW5oXSxbIlRpbGUiLCIiLCI2KyIsJC50aWxlXSxbIlRyYW5zcG9zZSIsIiIsIjErIixrLnRyYW5zcG9zZSxrLnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlc10sWyJVcHNhbXBsZSIsIiIsIjctOCIsai51cHNhbXBsZSxqLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjddLFsiVXBzYW1wbGUiLCIiLCI5IixqLnVwc2FtcGxlLGoucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWOV0sWyJVbnNxdWVlemUiLCIiLCIxLTEyIixOLnVuc3F1ZWV6ZSxOLnBhcnNlVW5zcXVlZXplQXR0cmlidXRlc10sWyJVbnNxdWVlemUiLCIiLCIxMysiLE4udW5zcXVlZXplVjEzXSxbIlhvciIsIiIsIjcrIixhLnhvcl1dO30sODgxNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VCYXRjaE5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPXQuYmF0Y2hOb3JtYWxpemF0aW9uPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDY3NTcpLGk9big1NjM5KSxzPXtuYW1lOiJCYXRjaE5vcm1hbGl6YXRpb24iLGlucHV0TmFtZXM6WyJBIiwiU2NhbGUiLCJCIiwiTWVhbiIsIlZhcmlhbmNlIl0saW5wdXRUeXBlczpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5iYXRjaE5vcm1hbGl6YXRpb249KGUsdCxuKT0+KHUodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdCxuKX0pLHQpXSksdC5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJlcHNpbG9uIiwxZS01KSxuPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgibW9tZW50dW0iLC45KSxvPWUuYXR0cmlidXRlcy5nZXRJbnQoInNwYXRpYWwiLDEpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtlcHNpbG9uOnQsbW9tZW50dW06bixzcGF0aWFsOm99KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksYT10WzBdLmRpbXMubGVuZ3RoLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHRbMV0uZGltcyxpLlRleHR1cmVUeXBlLnVucGFja2VkKSxjPWBcbiAgZmxvYXQgcHJvY2VzcyhpbnRbJHthfV0gaW5kaWNlcykge1xuICAgIHZlYzIgcG9zaXRpb24gPSBvZmZzZXRUb0Nvb3JkcyhpbmRpY2VzWzFdLCAke3V9LCAke2x9KTtcbiAgICBmbG9hdCBzY2FsZSA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShTY2FsZSwgcG9zaXRpb24pKTtcbiAgICBmbG9hdCBtZWFuID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KE1lYW4sIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgdmFyaWFuY2UgPSBnZXRDb2xvckFzRmxvYXQoJHtyLnRleHR1cmUyRH0oVmFyaWFuY2UsIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgYiA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShCLCBwb3NpdGlvbikpO1xuXG4gICAgcmV0dXJuIHNjYWxlICogKCAoX0EoaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBmbG9hdCgke24uZXBzaWxvbn0pKSApICsgYjtcbiAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOnRbMF0uZGltcyx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSx1PWU9PntpZighZXx8NSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmF0Y2hOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDUgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdLG89ZVszXSxpPWVbNF07aWYodC5kaW1zLmxlbmd0aDwzfHwxIT09bi5kaW1zLmxlbmd0aHx8MSE9PXIuZGltcy5sZW5ndGh8fDEhPT1vLmRpbXMubGVuZ3RofHwxIT09aS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYobi5kaW1zWzBdIT09dC5kaW1zWzFdfHxyLmRpbXNbMF0hPT10LmRpbXNbMV18fG8uZGltc1swXSE9PXQuZGltc1sxXXx8aS5kaW1zWzBdIT09dC5kaW1zWzFdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlfHwiZmxvYXQzMiIhPT1vLnR5cGUmJiJmbG9hdDY0IiE9PW8udHlwZXx8ImZsb2F0MzIiIT09aS50eXBlJiYiZmxvYXQ2NCIhPT1pLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX07fSw1MTk0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC54b3I9dC5zdWI9dC5wUmVsdT10LnBvdz10Lm9yPXQubXVsPXQubGVzcz10LmdyZWF0ZXI9dC5lcXVhbD10LmRpdj10LmFuZD10LmFkZD10Lmdsc2xQUmVsdT10Lmdsc2xQb3c9dC5nbHNsWG9yPXQuZ2xzbE9yPXQuZ2xzbEFuZD10Lmdsc2xMZXNzPXQuZ2xzbEdyZWF0ZXI9dC5nbHNsRXF1YWw9dC5nbHNsU3ViPXQuZ2xzbE11bD10Lmdsc2xEaXY9dC5nbHNsQWRkPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDE5OTcpLGk9big2NzU3KSxzPW4oNTYzOSk7ZnVuY3Rpb24gYSgpe2NvbnN0IGU9ImFkZF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICsgYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSArIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gdSgpe2NvbnN0IGU9ImRpdl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC8gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAvIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbCgpe2NvbnN0IGU9Im11bF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICogYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAqIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYygpe2NvbnN0IGU9InN1Yl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAtIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gcCgpe2NvbnN0IGU9ImVxdWFsXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPT0gYik7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gdmVjNChlcXVhbCh2MSwgdjIpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGQoKXtjb25zdCBlPSJncmVhdGVyXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPiBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yID4gdjIuciAsXG4gICAgICB2MS5nID4gdjIuZyxcbiAgICAgIHYxLmIgPiB2Mi5iLFxuICAgICAgdjEuYSA+IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGYoKXtjb25zdCBlPSJsZXNzXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPCBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yIDwgdjIuciAsXG4gICAgICAgICAgICAgICAgdjEuZyA8IHYyLmcsXG4gICAgICAgICAgICAgICAgdjEuYiA8IHYyLmIsXG4gICAgICAgICAgICAgICAgdjEuYSA8IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGgoKXtjb25zdCBlPSJhbmRfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gZmxvYXQoIGJvb2woYSkgJiYgYm9vbChiKSApO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgYnZlYzQgYjEgPSBidmVjNCh2MSk7XG4gICAgYnZlYzQgYjIgPSBidmVjNCh2Mik7XG4gICAgcmV0dXJuIHZlYzQoIGIxLnIgJiYgYjIuciAsXG4gICAgICAgICAgICAgICAgYjEuZyAmJiBiMi5nLFxuICAgICAgICAgICAgICAgIGIxLmIgJiYgYjIuYixcbiAgICAgICAgICAgICAgICBiMS5hICYmIGIyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGcoKXtjb25zdCBlPSJvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSB8fCBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciB8fCBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIHx8IGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiB8fCBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgfHwgYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYigpe2NvbnN0IGU9Inhvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSBeXiBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciBeXiBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIF5eIGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiBeXiBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgXl4gYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbSgpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCB0PWAke2V9X2A7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHt0fShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuICR7ZX0oYSwgYik7XG4gIH1cbiAgdmVjNCAke3R9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gJHtlfSh2MSwgdjIpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19KCJwb3ciKX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0icHJlbHVfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBiOiBhO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgcmV0dXJuIHZlYzQoXG4gICAgICB2MS5yIDwgMC4wID8gdjEuciAqIHYyLnI6IHYxLnIsXG4gICAgICB2MS5nIDwgMC4wID8gdjEuZyAqIHYyLmc6IHYxLmcsXG4gICAgICB2MS5iIDwgMC4wID8gdjEuYiAqIHYyLmI6IHYxLmIsXG4gICAgICB2MS5hIDwgMC4wID8gdjEuYSAqIHYyLmE6IHYxLmFcbiAgICAgICk7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTpvLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBZGQ9YSx0Lmdsc2xEaXY9dSx0Lmdsc2xNdWw9bCx0Lmdsc2xTdWI9Yyx0Lmdsc2xFcXVhbD1wLHQuZ2xzbEdyZWF0ZXI9ZCx0Lmdsc2xMZXNzPWYsdC5nbHNsQW5kPWgsdC5nbHNsT3I9Zyx0Lmdsc2xYb3I9Yix0Lmdsc2xQb3c9bSx0Lmdsc2xQUmVsdT15O2NvbnN0IHY9KGUsdCxuLHI9dFswXS50eXBlLG8pPT57Y29uc3QgaT1lLnNlc3Npb24ucGFjaz9zLlRleHR1cmVUeXBlLnBhY2tlZDpzLlRleHR1cmVUeXBlLnVucGFja2VkO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbaSxpXSxjYWNoZUhpbnQ6byxnZXQ6KCk9Pl8oZSx0LG4scil9fSxfPShlLHQsbixvPXRbMF0udHlwZSk9Pntjb25zdCBhPWUuc2Vzc2lvbi5wYWNrP3MuVGV4dHVyZVR5cGUucGFja2VkOnMuVGV4dHVyZVR5cGUudW5wYWNrZWQsdT0hci5TaGFwZVV0aWwuYXJlRXF1YWwodFswXS5kaW1zLHRbMV0uZGltcyk7bGV0IGw9dFswXS5kaW1zO2NvbnN0IGM9ZS5zZXNzaW9uLnBhY2s7aWYodSl7Y29uc3Qgcz1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKHRbMF0uZGltcyx0WzFdLmRpbXMsITEpO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgcGVyZm9ybSBiaW5hcnkgb3Agb24gdGhlIGdpdmVuIHRlbnNvcnMiKTtsPXM7Y29uc3QgdT1sLmxlbmd0aCxwPTAhPT10WzBdLmRpbXMubGVuZ3RoP3RbMF0uZGltcy5sZW5ndGg6MSxkPTAhPT10WzFdLmRpbXMubGVuZ3RoP3RbMV0uZGltcy5sZW5ndGg6MSxmPTAhPT10WzBdLmRpbXMubGVuZ3RoPyJiY2FzdEluZGljZXNfQShpbmRpY2VzLCBhaW5kaWNlcyk7IjoiYWluZGljZXNbMF0gPSAwOyIsaD0wIT09dFsxXS5kaW1zLmxlbmd0aD8iYmNhc3RJbmRpY2VzX0IoaW5kaWNlcywgYmluZGljZXMpOyI6ImJpbmRpY2VzWzBdID0gMDsiLGc9KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGI9Yz9gXG4gICAgICAke24uYm9keX1cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBhID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgYiA9IGdldEJBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9ICR7bi5uYW1lfShhLCBiKTtcbiAgICAgICAgJHtnLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9YDpgXG4gICAgICAke24uYm9keX1cbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHt1fV0pIHtcbiAgICAgICAgaW50IGFpbmRpY2VzWyR7cH1dO1xuICAgICAgICBpbnQgYmluZGljZXNbJHtkfV07XG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtofVxuICAgICAgICByZXR1cm4gJHtuLm5hbWV9KF9BKGFpbmRpY2VzKSwgX0IoYmluZGljZXMpKTtcbiAgICAgIH1gO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6bCx0eXBlOm8sdGV4dHVyZVR5cGU6YX0sc2hhZGVyU291cmNlOmIsaGFzTWFpbjpjfX1jb25zdCBwPSgwLCBpLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxkPWBcbiAgICAke24uYm9keX1cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICB2ZWM0IHYxID0gJHtwLnRleHR1cmUyRH0oQSwgVGV4Q29vcmRzKTtcbiAgICAgIHZlYzQgdjIgPSAke3AudGV4dHVyZTJEfShCLCBUZXhDb29yZHMpO1xuICAgICAgdmVjNCByZXN1bHQgPSAke24ubmFtZX0odjEsIHYyKTtcbiAgICAgICR7cC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgIH1cbiAgICBgO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6dFswXS5kaW1zLHR5cGU6byx0ZXh0dXJlVHlwZTphfSxzaGFkZXJTb3VyY2U6ZCxoYXNNYWluOiEwfX07dC5hZGQ9KGUsdCk9PltlLnJ1bih2KGUsdCxhKCkpLHQpXSx0LmFuZD0oZSx0KT0+W2UucnVuKHYoZSx0LGgoKSwiYm9vbCIpLHQpXSx0LmRpdj0oZSx0KT0+W2UucnVuKHYoZSx0LHUoKSksdCldLHQuZXF1YWw9KGUsdCk9PltlLnJ1bih2KGUsdCxwKCksImJvb2wiKSx0KV0sdC5ncmVhdGVyPShlLHQpPT5bZS5ydW4odihlLHQsZCgpLCJib29sIiksdCldLHQubGVzcz0oZSx0KT0+W2UucnVuKHYoZSx0LGYoKSwiYm9vbCIpLHQpXSx0Lm11bD0oZSx0KT0+W2UucnVuKHYoZSx0LGwoKSksdCldLHQub3I9KGUsdCk9PltlLnJ1bih2KGUsdCxnKCksImJvb2wiKSx0KV0sdC5wb3c9KGUsdCk9PltlLnJ1bih2KGUsdCxtKCkpLHQpXSx0LnBSZWx1PShlLHQpPT5bZS5ydW4odihlLHQseSgpKSx0KV0sdC5zdWI9KGUsdCk9PltlLnJ1bih2KGUsdCxjKCkpLHQpXSx0Lnhvcj0oZSx0KT0+W2UucnVuKHYoZSx0LGIoKSwiYm9vbCIpLHQpXTt9LDQ3NTI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ2FzdEF0dHJpYnV0ZXM9dC5jYXN0PXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5jYXN0PShlLHQsbik9PihvKHQpLFtlLmNhc3QodFswXSxuKV0pLHQucGFyc2VDYXN0QXR0cmlidXRlcz1lPT5yLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0byIpKTtjb25zdCBvPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FzdCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDQ1OTU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KTt0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbik9Pntjb25zdCB1PShsPXQubGVuZ3RoLGM9bi5jYWNoZUtleSx7bmFtZToiQ29uY2F0IChwYWNrZWQpIixpbnB1dE5hbWVzOkFycmF5LmZyb20oe2xlbmd0aDpsfSwoKGUsdCk9PmBYJHt0fWApKSxpbnB1dFR5cGVzOkFycmF5KGwpLmZpbGwoby5UZXh0dXJlVHlwZS5wYWNrZWQpLGNhY2hlSGludDpjfSk7dmFyIGwsYztyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4sdSk9Pntjb25zdCBsPW5bMF0uZGltcy5zbGljZSgpO2lmKHU+PWwubGVuZ3RofHx1PC0xKmwubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYXhpcyBzcGVjaWZpZWQgZm9yIGNvbmNhdCBkb2Vzbid0IG1hdGNoIGlucHV0IGRpbWVuc2lvbmFsaXR5Iik7dTwwJiYodT1sLmxlbmd0aCt1KTtjb25zdCBjPWwuc2xpY2UoMCk7Zm9yKGxldCBlPTE7ZTxuLmxlbmd0aDtlKyspe2NvbnN0IHQ9bltlXS5kaW1zLnNsaWNlKCk7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaWYoZT09PXUpY1t1XSs9dFtlXTtlbHNlIGlmKGxbZV0hPT10W2VdKXRocm93IG5ldyBFcnJvcigibm9uIGNvbmNhdCBkaW1lbnNpb25zIG11c3QgbWF0Y2giKX1jb25zdCBwPWMubGVuZ3RoLGQ9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJjb29yZHMiLHApLGY9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKHApLGg9KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCksZz1uLm1hcCgoZT0+ZS5kaW1zKSksYj0oMCwgaS5nZXRHbENoYW5uZWxzKShwKSxtPW5ldyBBcnJheShnLmxlbmd0aC0xKTttWzBdPWdbMF1bdV07Zm9yKGxldCBlPTE7ZTxtLmxlbmd0aDtlKyspbVtlXT1tW2UtMV0rZ1tlXVt1XTtjb25zdCB5PWJbdV0sdj1iLnNsaWNlKC0yKSxfPWIuam9pbigpO2xldCB3PWBpZiAoJHt5fSA8ICR7bVswXX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRYMCgke199KSwgdmVjMigke3Yuam9pbigpfSkpO1xuICAgICAgICB9YDtmb3IobGV0IGU9MTtlPG0ubGVuZ3RoO2UrKyl7Y29uc3QgdD1tW2UtMV07dys9YFxuICAgICAgICAgICAgaWYgKCR7eX0gPCAke21bZV19ICAmJiAke3l9ID49ICR7bVtlLTFdfSkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICBnZXRYJHtlfSgke2EoYix5LHQpfSksXG4gICAgICAgICAgICAgICAgdmVjMigke2Eodix5LHQpfSkpO1xuICAgICAgICAgICAgfWA7fWNvbnN0IFQ9bS5sZW5ndGgseD1tW20ubGVuZ3RoLTFdO3crPWBcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKFxuICAgICAgICAgICAgICBnZXRYJHtUfSgke2EoYix5LHgpfSksXG4gICAgICAgICAgICAgIHZlYzIoJHthKHYseSx4KX0pKTtgO2NvbnN0IE89KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuICAgICAgICAgICR7aH1cbiAgICAgICAgICBmbG9hdCBnZXRWYWx1ZSgke2IubWFwKChlPT4iaW50ICIrZSkpfSkge1xuICAgICAgICAgICAgJHt3fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICR7Zn0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgICBpbnQgbGFzdERpbSA9IGNvb3Jkcy4ke2JbcC0xXX07XG4gICAgICAgICAgICBjb29yZHMuJHtiW3AtMV19ID0gY29vcmRzLiR7YltwLTJdfTtcbiAgICAgICAgICAgIGNvb3Jkcy4ke2JbcC0yXX0gPSBsYXN0RGltO1xuXG4gICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtkfSksIDAuLCAwLiwgMC4pO1xuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuZyA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0yXX0gPSAke2RbcC0yXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gLSAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSAmJlxuICAgICAgICAgICAgICAgICR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHtPLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpjLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxzaGFkZXJTb3VyY2U6UyxoYXNNYWluOiEwfSl9KShlLHUsdCxuLmF4aXMpfSl9O2NvbnN0IGE9KGUsdCxuKT0+e2NvbnN0IHI9ZS5pbmRleE9mKHQpO3JldHVybiBlLm1hcCgoKGUsdCk9PnQ9PT1yP2Ake2V9IC0gJHtufWA6ZSkpLmpvaW4oKX07fSw2NjY4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXM9dC5jb25jYXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNTYzOSksaT1uKDQ1OTUpO3QuY29uY2F0PShlLHQsbik9PihwKHQpLGUuc2Vzc2lvbi5wYWNrJiZ0WzBdLmRpbXMubGVuZ3RoPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihzKGUsdCxuKSx0KV0pO2NvbnN0IHM9KGUsdCxuKT0+e2NvbnN0IHI9KGk9dC5sZW5ndGgscz1uLmNhY2hlS2V5LHtuYW1lOiJDb25jYXQiLGlucHV0TmFtZXM6QXJyYXkuZnJvbSh7bGVuZ3RoOml9LCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6QXJyYXkoaSkuZmlsbChvLlRleHR1cmVUeXBlLnVucGFja2VkKSxjYWNoZUhpbnQ6c30pO3ZhciBpLHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgaT1uWzBdLmRpbXMuc2xpY2UoKTtpZihyPj1pLmxlbmd0aHx8cjwtMSppLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF4aXMgc3BlY2lmaWVkIGZvciBjb25jYXQgZG9lc24ndCBtYXRjaCBpbnB1dCBkaW1lbnNpb25hbGl0eSIpO3I8MCYmKHI9aS5sZW5ndGgrcik7Y29uc3Qgcz1pLnNsaWNlKDApO2ZvcihsZXQgZT0xO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCB0PW5bZV0uZGltcy5zbGljZSgpO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKWlmKGU9PT1yKXNbcl0rPXRbZV07ZWxzZSBpZihpW2VdIT09dFtlXSl0aHJvdyBuZXcgRXJyb3IoIm5vbiBjb25jYXQgZGltZW5zaW9ucyBtdXN0IG1hdGNoIil9Y29uc3QgcD1zLmxlbmd0aCxkPW5ldyBBcnJheShuLmxlbmd0aCk7bGV0IGY9MDtmb3IobGV0IGU9MDtlPGQubGVuZ3RoOysrZSlmKz1uW2VdLmRpbXNbcl0sZFtlXT1mO2xldCBoPSIiO2g9bi5sZW5ndGg8NT9hKGQpOnUoZCk7Y29uc3QgZz1gXG4gICAgICAgICR7bChuLmxlbmd0aCxwKX1cbiAgICAgICAgJHtjKGQpfVxuICAgICAgICAke2h9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtwfV0pIHtcbiAgICAgICAgICBpbnQgdGV4dHVyZUluZGV4ID0gZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMgKGluZGljZXNbJHtyfV0pO1xuXG4gICAgICAgICAgaWYodGV4dHVyZUluZGV4ICE9IDApIHtcbiAgICAgICAgICAgIGluZGljZXNbJHtyfV0gPSBpbmRpY2VzWyR7cn1dIC0gaW50KGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleCh0ZXh0dXJlSW5kZXgtaW50KDEpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YUZyb21Db3JyZWN0VGV4dHVyZSh0ZXh0dXJlSW5kZXgsIGluZGljZXMpO1xuICAgICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6cyx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Z30pfSkoMCxyLHQsbi5heGlzKX0pfSxhPWU9PmBpbnQgZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMoaW50IGluZGV4KSB7XG4gICAgICAke2UubWFwKCgoZSx0KT0+YGlmKGluZGV4PCR7ZX0pIHtyZXR1cm4gJHt0fTt9XG5gKSkuam9pbigiIil9XG4gICAgfWAsdT1lPT5hKGUpLGw9KGUsdCk9Pntjb25zdCBuPVtgZmxvYXQgZmV0Y2hEYXRhRnJvbUNvcnJlY3RUZXh0dXJlKGludCB0ZXh0dXJlSW5kZXgsIGludCBpbmRpY2VzWyR7dH1dKSB7YF07Zm9yKGxldCB0PTA7dDxlOysrdCkwPT09dD9uLnB1c2goYFx0aWYgKHRleHR1cmVJbmRleCA9PSAke3R9KSB7IHJldHVybiBfWCR7dH0oaW5kaWNlcyk7IH1gKTp0PT09ZS0xP24ucHVzaChgXHRlbHNlIHsgcmV0dXJuIF9YJHt0fShpbmRpY2VzKTsgfWApOm4ucHVzaChgXHRlbHNlIGlmICh0ZXh0dXJlSW5kZXggPT0gJHt0fSkgeyByZXR1cm4gX1gke3R9KGluZGljZXMpOyB9YCk7cmV0dXJuIG4ucHVzaCgiXHR9Iiksbi5qb2luKCJcbiIpfSxjPWU9Pntjb25zdCB0PVsiaW50IGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleChpbnQgaW5kZXgpIHsiXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbikwPT09bj90LnB1c2goYFx0aWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTpuPT09ZS5sZW5ndGgtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiAke2Vbbl19OyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTtyZXR1cm4gdC5wdXNoKCJcdH0iKSx0LmpvaW4oIlxuIil9O3QucGFyc2VDb25jYXRBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIpfSk7Y29uc3QgcD1lPT57aWYoIWV8fGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJ0b28gZmV3IGlucHV0cyIpO2NvbnN0IHQ9ZVswXS50eXBlLG49ZVswXS5kaW1zLmxlbmd0aDtpZigic3RyaW5nIj09PXQpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Zm9yKGNvbnN0IHIgb2YgZSl7aWYoci50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHRlbnNvcnMgc2hvdWxkIGJlIG9uZSB0eXBlIik7aWYoci5kaW1zLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKCJpbnB1dCB0ZW5zb3JzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNoYXBlIil9fTt9LDc4MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big2NzU3KSxpPW4oNTYzOSkscz1uKDk3NTQpLGE9bigyMTUwKTt0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgdT0obD10Lmxlbmd0aD4yLGM9bi5jYWNoZUtleSx7bmFtZToiR3JvdXBlZENvbnYiLGlucHV0TmFtZXM6bD9bIlgiLCJXIiwiQmlhcyJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmw/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6Y30pO3ZhciBsLGM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7Z2V0OigpPT4oKGUsdCxuLHUpPT57Y29uc3QgbD10Lmxlbmd0aD4yPyJ2YWx1ZSArPSBnZXRCaWFzKG91dHB1dF9jaGFubmVsKTsiOiIiLGM9dFswXS5kaW1zLnNsaWNlKCkscD10WzFdLmRpbXMuc2xpY2UoKSxkPXBbMF0vdS5ncm91cDtyLkxvZ2dlci52ZXJib3NlKCJHcm91cGVkQ29udiIsYGF1dHBQYWQ6JHt1LmF1dG9QYWR9LCBkaWxhdGlvbnM6JHt1LmRpbGF0aW9uc30sIGdyb3VwOiR7dS5ncm91cH0sIGtlcm5lbFNoYXBlOiR7dS5rZXJuZWxTaGFwZX0sIHBhZHM6JHt1LnBhZHN9LCBzdHJpZGVzOiR7dS5zdHJpZGVzfWApO2NvbnN0IGY9KDAsIHMuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKGMscCx1LmRpbGF0aW9ucyx1LnBhZHMsdS5zdHJpZGVzKSxoPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmcsYXBwbHlBY3RpdmF0aW9uOmJ9PSgwLCBhLmdldEFjdGl2YXRpb25TbmlwcGV0KSh1KSxtPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7dS5zdHJpZGVzWzBdfSwgJHt1LnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7dS5wYWRzWzBdfSwgJHt1LnBhZHNbMV19KTtcbiAgJHtnfVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG4gICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnp3ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2R9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAwLjA7XG4gICAgZm9yIChpbnQgd0luQ2hhbm5lbCA9IDA7IHdJbkNoYW5uZWwgPCAke3BbMV19OyB3SW5DaGFubmVsKyspIHtcbiAgICAgIGludCBpbnB1dF9jaGFubmVsID0gZ3JvdXBfaWQgKiAke3BbMV19ICsgd0luQ2hhbm5lbDtcbiAgICAgIGZvciAoaW50IHdIZWlnaHQgPSAwOyB3SGVpZ2h0IDwgJHtwWzJdfTsgd0hlaWdodCsrKSB7XG4gICAgICAgIGludCB4SGVpZ2h0ID0geFJDQ29ybmVyLnggKyB3SGVpZ2h0ICogJHt1LmRpbGF0aW9uc1swXX07XG5cbiAgICAgICAgaWYgKHhIZWlnaHQgPCAwIHx8IHhIZWlnaHQgPj0gJHtjWzJdfSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpbnQgd1dpZHRoID0gMDsgd1dpZHRoIDwgJHtwWzNdfTsgd1dpZHRoKyspIHtcbiAgICAgICAgICBpbnQgeFdpZHRoID0geFJDQ29ybmVyLnkgKyB3V2lkdGggKiAke3UuZGlsYXRpb25zWzFdfTtcbiAgICAgICAgICBpZiAoeFdpZHRoIDwgMCB8fCB4V2lkdGggPj0gJHtjWzNdfSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgeFZhbCA9IGdldFgoYmF0Y2gsIGlucHV0X2NoYW5uZWwsIHhXaWR0aCwgeEhlaWdodCk7XG4gICAgICAgICAgZmxvYXQgd1ZhbCA9IGdldFcob3V0cHV0X2NoYW5uZWwsIHdJbkNoYW5uZWwsIHdXaWR0aCwgd0hlaWdodCk7XG4gICAgICAgICAgdmFsdWUgKz0geFZhbCp3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7bH1cbiAgICAke2J9XG4gICAgJHtoLm91dHB1dH0gPSB2ZWM0KHZhbHVlLCAuMCwgLjAsIC4wKTtcbiAgfVxuYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6Zix0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSxoYXNNYWluOiEwfSl9KShlLHQsdSxuKX0pfTt9LDc3MDg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbnYyRFBhY2tlZD10LmNvbnYyRFBhY2tlZFBvaW50d2lzZT12b2lkIDA7Y29uc3Qgcj1uKDk3NTQpLG89big1OTUwKSxpPW4oNTYzMik7dC5jb252MkRQYWNrZWRQb2ludHdpc2U9KGUsdCxuKT0+e2NvbnN0IG89dFswXS5kaW1zLHM9dFsxXS5kaW1zLGE9KDAsIHIuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8scyxuLmRpbGF0aW9ucyxuLnBhZHMsbi5zdHJpZGVzKSx1PWUucmVzaGFwZVBhY2tlZCh0WzBdLFtvWzFdLG9bMl0qb1szXV0pLGw9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW3NbMF0sc1sxXV0pLGM9dC5sZW5ndGg+Mj9bbCx1LHRbMl1dOltsLHVdLHA9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUsYyxuKSxjKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKHAsYSl9LHQuY29udjJEUGFja2VkPShlLHQsbik9Pntjb25zdCBzPXRbMF0uZGltcyxhPXRbMV0uZGltcyx1PSgwLCByLmNhbGN1bGF0ZU91dHB1dFNoYXBlKShzLGEsbi5kaWxhdGlvbnMsbi5wYWRzLG4uc3RyaWRlcyksbD1lLnJ1bigoMCwgby5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcikoZSx0WzBdLHRbMV0sdSxuKSxbdFswXV0pLGM9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW2FbMF0sYVsxXSphWzJdKmFbM11dKSxwPTM9PT10Lmxlbmd0aD9bYyxsLHRbMl1dOltjLGxdLGQ9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUscCxuKSxwKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKGQsdSl9O30sNTA0MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlcz10LmNvbnZUcmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9bigyMTUwKSxhPShlLHQsbixyLG8saSk9PihlLTEpKnQrbisoci0xKSpvKzEtaSx1PShlLHQsbixyLG8pPT57Y29uc3QgaT1NYXRoLmZsb29yKGUvMik7IlNBTUVfVVBQRVIiPT09dD8obltyXT1pLG5bb109ZS1pKToiU0FNRV9MT1dFUiI9PT10JiYobltyXT1lLWksbltvXT1pKTt9O3QuY29udlRyYW5zcG9zZT0oZSx0LG4pPT4oZCh0LG4pLGwoZSx0LG4pKTtjb25zdCBsPShlLHQsbik9Pntjb25zdCByPXAobix0KTtyZXR1cm4gW2MoZSx0LHIpXX0sYz0oZSx0LG4pPT5lLnJ1bigoKGUsdCxuKT0+e2NvbnN0IHI9KGE9dC5sZW5ndGg+Mix1PW4uY2FjaGVLZXkse25hbWU6IkNvbnZUcmFuc3Bvc2UiLGlucHV0TmFtZXM6YT9bIlgiLCJXIiwiQiJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmE/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciBhLHU7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgYT10Lmxlbmd0aD4yPyJnZXRCKG91dHB1dF9jaGFubmVsKSI6IjAuMCIsdT10WzBdLmRpbXMsbD10WzFdLmRpbXMsYz1sWzFdLHA9bFswXS9yLmdyb3VwLGQ9W3RbMF0uZGltc1swXSx0WzFdLmRpbXNbMV0qci5ncm91cCwuLi5yLm91dHB1dFNoYXBlXSxmPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmgsYXBwbHlBY3RpdmF0aW9uOmd9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShyKSxiPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7ci5zdHJpZGVzWzBdfSwgJHtyLnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7ci5wYWRzWzBdfSwgJHtyLnBhZHNbMV19KTtcbiAgJHtofVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG5cbiAgICBpdmVjMiBsb2MgPSBjb29yZHMuencgKyBwYWRzO1xuXG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2N9O1xuICAgIGludCB3T3V0Q2hhbm5lbCA9IG91dHB1dF9jaGFubmVsIC0gZ3JvdXBfaWQgKiAke2N9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAke2F9O1xuICAgIGZvciAoaW50IGluQ2hhbm5lbE9mZnNldCA9IDA7IGluQ2hhbm5lbE9mZnNldCA8ICR7cH07IGluQ2hhbm5lbE9mZnNldCsrKSB7XG4gICAgICBpbnQgaW5wdXRfY2hhbm5lbCA9IGdyb3VwX2lkICogJHtwfSArIGluQ2hhbm5lbE9mZnNldDtcbiAgICAgIGZvciAoaW50IHdXT2ZmID0gMDsgd1dPZmYgPCAke2xbMl19OyB3V09mZisrKSB7XG4gICAgICAgIGZvciAoaW50IHdIT2ZmID0gMDsgd0hPZmYgPCAke2xbM119OyB3SE9mZisrKSB7XG4gICAgICAgICAgaXZlYzIgd09mZiA9IGl2ZWMyKHdXT2ZmICogJHtyLmRpbGF0aW9uc1swXX0sIHdIT2ZmICogJHtyLmRpbGF0aW9uc1sxXX0pO1xuICAgICAgICAgIGl2ZWMyIHdMb2MgPSBsb2MgLSB3T2ZmO1xuICAgICAgICAgIGl2ZWMyIHdMb2NJbiA9IHdMb2MgLyBzdHJpZGVzO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHdMb2NJbiAqIHN0cmlkZXMgPT0gd0xvYyAmJlxuICAgICAgICAgICAgd0xvY0luLnggPj0gMCAmJiB3TG9jSW4ueCA8ICR7dVsyXX0gJiZcbiAgICAgICAgICAgIHdMb2NJbi55ID49IDAgJiYgd0xvY0luLnkgPCAke3VbM119XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaW5wdXRfY2hhbm5lbCwgd0xvY0luLnksIHdMb2NJbi54KTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKGlucHV0X2NoYW5uZWwsIHdPdXRDaGFubmVsLCB3SE9mZiwgd1dPZmYpO1xuICAgICAgICAgICAgdmFsdWUgKz0geFZhbCAqIHdWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7Z31cbiAgICAke2Yub3V0cHV0fSA9IHZlYzQodmFsdWUsIC4wLCAuMCwgLjApO1xuICB9XG5gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpkLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOmkuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpiLGhhc01haW46ITB9KX0pKGUsdCxyLG4pfSl9KShlLHQsbiksdCkscD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCksbz1lLm91dHB1dFNoYXBlLnNsaWNlKCk7KChlLHQsbixyLG8saSxzLGwpPT57Y29uc3QgYz1lLmxlbmd0aC0yLHA9MD09PWwubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8YzsrK2Qpe2NvbnN0IGY9cD9lW2QrMl0qaVtkXTpsW2RdLGg9YShlW2QrMl0saVtkXSxvW2RdLHRbZF0sbltkXSxmKTt1KGgscixvLGQsZCtjKSxwJiZsLnB1c2goaVtkXSooZVtkKzJdLTEpK3NbZF0rKHRbZF0tMSkqbltkXSsxLW9bZF0tb1tkK2NdKTt9fSkodFswXS5kaW1zLG4sZS5kaWxhdGlvbnMsZS5hdXRvUGFkLHIsZS5zdHJpZGVzLGUub3V0cHV0UGFkZGluZyxvKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oaSx7a2VybmVsU2hhcGU6bixwYWRzOnIsb3V0cHV0U2hhcGU6byxjYWNoZUtleTplLmNhY2hlS2V5fSksaX07dC5wYXJzZUNvbnZUcmFuc3Bvc2VBdHRyaWJ1dGVzPWU9Pntjb25zdCB0PWUuYXR0cmlidXRlcyxuPSgwLCBzLnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcykodCksbz10LmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxpPXQuZ2V0SW50cygiZGlsYXRpb25zIixbMSwxXSksYT10LmdldEludCgiZ3JvdXAiLDEpLHU9dC5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiLFtdKSxsPXQuZ2V0SW50cygib3V0cHV0X3BhZGRpbmciLFswLDBdKSxjPXQuZ2V0SW50cygib3V0cHV0X3NoYXBlIixbXSkscD10LmdldEludHMoInBhZHMiLFswLDAsMCwwXSksZD10LmdldEludHMoInN0cmlkZXMiLFsxLDFdKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KShPYmplY3QuYXNzaWduKHthdXRvUGFkOm8sZGlsYXRpb25zOmksZ3JvdXA6YSxrZXJuZWxTaGFwZTp1LG91dHB1dFBhZGRpbmc6bCxvdXRwdXRTaGFwZTpjLHBhZHM6cCxzdHJpZGVzOmR9LG4pKX07Y29uc3QgZD0oZSx0KT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgmJjMhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgcmVxdWlyZXMgMiBvciAzIGlucHV0cyIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RofHw0IT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMi1kaW1lbnNpb25hbCBjb252Iik7aWYoZVswXS5kaW1zWzFdIT09ZVsxXS5kaW1zWzBdKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2NvbnN0IG49ZVsxXS5kaW1zWzFdKnQuZ3JvdXA7aWYoMz09PWUubGVuZ3RoJiYoMSE9PWVbMl0uZGltcy5sZW5ndGh8fGVbMl0uZGltc1swXSE9PW4pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgcj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtyfURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7cn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqcil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipyfURgKTtpZih0Lm91dHB1dFBhZGRpbmcubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYG91dHB1dF9wYWRkaW5nIHNob3VsZCBiZSAke3J9RGApO2lmKDAhPT10Lmtlcm5lbFNoYXBlLmxlbmd0aCYmdC5rZXJuZWxTaGFwZS5sZW5ndGghPT1lWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKDAhPT10Lm91dHB1dFNoYXBlLmxlbmd0aCYmdC5vdXRwdXRTaGFwZS5sZW5ndGghPT1lWzBdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG91dHB1dCBzaGFwZSIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiQ29udlRyYW5zcG9zZSBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZigzPT09ZS5sZW5ndGgmJiJmbG9hdDMyIiE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnZUcmFuc3Bvc2UgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfTt9LDk3NTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ29udkF0dHJpYnV0ZXM9dC5jb252PXQuY2FsY3VsYXRlT3V0cHV0U2hhcGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDc4MjUpLHM9big3NzA4KSxhPW4oMzI4MSksdT1uKDIxNTApLGw9bigxNjI1KSxjPW4oODI3Nik7dC5jYWxjdWxhdGVPdXRwdXRTaGFwZT0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZVswXSxzPWUuc2xpY2UoMiksYT1zLmxlbmd0aCx1PXRbMF0sbD10LnNsaWNlKDIpLm1hcCgoKGUsdCk9PmUrKGUtMSkqKG5bdF0tMSkpKSxjPXMubWFwKCgoZSx0KT0+ZStyW3RdK3JbdCthXSkpLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoKGUtbFt0XStvW3RdKS9vW3RdKSkpO3JldHVybiBbaSx1XS5jb25jYXQoLi4uYyl9LHQuY29udj0oZSx0LG4pPT4oZyh0LG4pLHAoZSx0LG4pKTtjb25zdCBwPShlLHQsbik9Pntjb25zdCByPWgobix0KSxvPWUuc2Vzc2lvbi5wYWNrLGE9MT09PXIua2VybmVsU2hhcGVbMF0mJjE9PT1yLmtlcm5lbFNoYXBlWzFdO3JldHVybiByLmdyb3VwPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcikoZSx0LHIpLHQpXTphJiZvP1tkKGUsdCxyKV06byYmND09PXRbMF0uZGltcy5sZW5ndGgmJjE9PT10WzBdLmRpbXNbMF0mJiFhP1soMCwgcy5jb252MkRQYWNrZWQpKGUsdCxyKV06W2YoZSx0LHIpXX0sZD0oZSxuLHIpPT57Y29uc3Qgbz1uWzBdLmRpbXMsaT1uWzFdLmRpbXMscz0oMCwgdC5jYWxjdWxhdGVPdXRwdXRTaGFwZSkobyxpLHIuZGlsYXRpb25zLHIucGFkcyxyLnN0cmlkZXMpLGE9ZS5yZXNoYXBlVW5wYWNrZWQoblswXSxbb1sxXSxvWzJdKm9bM11dKSx1PWUucmVzaGFwZVVucGFja2VkKG5bMV0sW2lbMF0saVsxXV0pLGw9bi5sZW5ndGg+Mj9bdSxhLG5bMl1dOlt1LGFdLHA9ZS5ydW4oKDAsIGMuY3JlYXRlTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGwsciksbCk7cmV0dXJuIGUucmVzaGFwZVVucGFja2VkKHAscyl9LGY9KGUsbixyKT0+e2NvbnN0IG89blswXS5kaW1zLGk9blsxXS5kaW1zLHM9KDAsIHQuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8saSxyLmRpbGF0aW9ucyxyLnBhZHMsci5zdHJpZGVzKSx1PWUucnVuKCgwLCBsLmNyZWF0ZUltMkNvbFByb2dyYW1JbmZvTG9hZGVyKShlLG5bMF0sblsxXSxzLHIpLFtuWzBdXSksYz0zPT09bi5sZW5ndGg/W3UsblsxXSxuWzJdXTpbdSxuWzFdXTtyZXR1cm4gZS5ydW4oKDAsIGEuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyKShlLG4scyxyKSxjKX0saD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCk7by5Qb29sQ29udlV0aWwuYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKHRbMF0uZGltcyxlLnN0cmlkZXMsZS5kaWxhdGlvbnMsbixyLGUuYXV0b1BhZCk7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBPYmplY3QuYXNzaWduKGkse2tlcm5lbFNoYXBlOm4scGFkczpyLGNhY2hlS2V5OmUuY2FjaGVLZXl9KSxpfTt0LnBhcnNlQ29udkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLG49KDAsIHUucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzKSh0KSxvPXQuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLGk9dC5nZXRJbnRzKCJkaWxhdGlvbnMiLFsxLDFdKSxzPXQuZ2V0SW50KCJncm91cCIsMSksYT10LmdldEludHMoImtlcm5lbF9zaGFwZSIsW10pLGw9dC5nZXRJbnRzKCJwYWRzIixbMCwwLDAsMF0pLGM9dC5nZXRJbnRzKCJzdHJpZGVzIixbMSwxXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoT2JqZWN0LmFzc2lnbih7YXV0b1BhZDpvLGRpbGF0aW9uczppLGdyb3VwOnMsa2VybmVsU2hhcGU6YSxwYWRzOmwsc3RyaWRlczpjfSxuKSl9O2NvbnN0IGc9KGUsdCk9PntpZighZXx8MiE9PWUubGVuZ3RoJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDb252IHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZig0IT09ZVswXS5kaW1zLmxlbmd0aHx8NCE9PWVbMV0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjdXJyZW50bHkgb25seSBzdXBwb3J0IDItZGltZW5zaW9uYWwgY29udiIpO2lmKGVbMF0uZGltc1sxXSE9PWVbMV0uZGltc1sxXSp0Lmdyb3VwKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2lmKDM9PT1lLmxlbmd0aCYmKDEhPT1lWzJdLmRpbXMubGVuZ3RofHxlWzFdLmRpbXNbMF0hPT1lWzJdLmRpbXNbMF0pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgbj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtufURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7bn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqbil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipufURgKTtpZigwIT09dC5rZXJuZWxTaGFwZS5sZW5ndGgmJnQua2VybmVsU2hhcGUubGVuZ3RoIT09ZVsxXS5kaW1zLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBrZXJuZWwgc2hhcGUiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGV8fCJmbG9hdDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgaW5wdXQoWCxXKSBzaG91bGQgYmUgZmxvYXQgdGVuc29yIik7aWYoMz09PWUubGVuZ3RoJiYiZmxvYXQzMiIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJDb252IGlucHV0KGJpYXMpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKX07fSw2NzQyOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9dC5kZXB0aFRvU3BhY2U9dm9pZCAwO2NvbnN0IHI9big1NzA3KTt0LmRlcHRoVG9TcGFjZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPW4uYmxvY2tzaXplLHM9aSppLGE9IkRDUiI9PT1uLm1vZGU/WzAsMyw0LDEsNSwyXTpbMCwxLDQsMiw1LDNdLHU9IkRDUiI9PT1uLm1vZGU/W3RbMF0uZGltc1swXSxpLGksdFswXS5kaW1zWzFdL3MsdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV06W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyxpLGksdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV0sbD1lLnJlc2hhcGVVbnBhY2tlZCh0WzBdLHUpLGM9e3Blcm06YSxjYWNoZUtleTpgJHthfWB9LFtwXT0oMCwgci50cmFuc3Bvc2UpKGUsW2xdLGMpLGQ9W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyx0WzBdLmRpbXNbMl0qaSx0WzBdLmRpbXNbM10qaV07cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZChwLGQpXX0sdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYmxvY2tzaXplIik7aWYodDwxKXRocm93IG5ldyBFcnJvcihgYmxvY2tzaXplIG11c3QgYmUgPj0gMSwgYnV0IGdvdCA6ICR7dH0gZm9yIERlcHRoVG9TcGFjZWApO2NvbnN0IG49ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIkRDUiIpO2lmKCJEQ1IiIT09biYmIkNSRCIhPT1uKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIG1vZGU6ICR7bn0gZm9yIERlcHRoVG9TcGFjZWApO3JldHVybiB7bW9kZTpuLGJsb2Nrc2l6ZTp0fX07Y29uc3Qgbz1lPT57aWYoMSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgRGVwdGhUb1NwYWNlIGV4cGVjdCAxIGlucHV0cywgYnV0IGdvdCAke2UubGVuZ3RofWApO2lmKCJzdHJpbmciPT09ZVswXS50eXBlfHw0IT09ZVswXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXB0aFRvU3BhY2UgaW5wdXQgc2hvdWxkIGJlIGEgNC1EIG51bWVyaWMgdGVuc29yIil9O30sMzI4MTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oMjE1MCksYT1uKDE2MjUpO3QuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbix1KT0+e2NvbnN0IGw9KChlLHQpPT4oe25hbWU6IkNvbnZEb3RQcm9kdWN0IixpbnB1dE5hbWVzOmU/WyJJbTJDb2wiLCJLIiwiQiJdOlsiSW0yQ29sIiwiSyJdLGlucHV0VHlwZXM6ZT9baS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24saS5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uXSxjYWNoZUtleTp0LmFjdGl2YXRpb25DYWNoZUtleX0pKSh0Lmxlbmd0aD4yLHUpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbix1LGwpPT57Y29uc3QgYz1uWzBdLmRpbXMscD1uWzFdLmRpbXMsZD1bcFswXSxNYXRoLmNlaWwoY1sxXSpwWzJdKnBbM10vNCldLGY9KDAsIGEuY2FsY3VsYXRlSW0yQ29sRGltcykoYyxwLHUpLFtoLGddPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxiPXIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGYpLFttLHldPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGYsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSx2PXUubGVuZ3RoLF89bi5sZW5ndGg8Mz8iMC4wIjoiX0IoYikiLHc9TWF0aC5jZWlsKGNbMV0qcFsyXSpwWzNdLzQpLHthY3RpdmF0aW9uRnVuY3Rpb246VCxhcHBseUFjdGl2YXRpb246eH09KDAsIHMuZ2V0QWN0aXZhdGlvblNuaXBwZXQpKGwpLE89KDAsIG8uZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuJHtUfVxuZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske3Z9XSkge1xuICBpbnQgYlsxXTtcbiAgYlswXSA9IGluZGljZXNbMV07XG4gIGludCBpbTJjb2xbNF07XG4gIGltMmNvbFswXSA9IGluZGljZXNbMF07XG4gIGltMmNvbFsxXSA9IGluZGljZXNbMl07XG4gIGltMmNvbFsyXSA9IGluZGljZXNbM107XG4gIGludCBpbTJjb2xPZmZzZXQgPSBpbTJjb2xbMF0gKiAke2JbMF19ICsgaW0yY29sWzFdICogJHtiWzFdfSArIGltMmNvbFsyXSAqICR7YlsyXX07XG4gIGludCBrZXJuZWxPZmZzZXQgPSBpbmRpY2VzWzFdICogJHtkWzFdfTtcbiAgZmxvYXQgdmFsdWUgPSAke199O1xuICBmb3IgKGludCBpID0gMDsgaSA8ICR7d307ICsraSkge1xuICAgIHZlYzIgaW0yY29sQ29vcmRzID0gb2Zmc2V0VG9Db29yZHMoaW0yY29sT2Zmc2V0LCAke219LCAke3l9KTtcbiAgICB2ZWMyIGtlcm5lbENvb3JkcyA9IG9mZnNldFRvQ29vcmRzKGtlcm5lbE9mZnNldCwgJHtofSwgJHtnfSk7XG4gICAgdmFsdWUgKz0gZG90KCR7Ty50ZXh0dXJlMkR9KEltMkNvbCwgaW0yY29sQ29vcmRzKSwgJHtPLnRleHR1cmUyRH0oSywga2VybmVsQ29vcmRzKSk7XG4gICAgKytpbTJjb2xPZmZzZXQ7XG4gICAgKytrZXJuZWxPZmZzZXQ7XG4gIH1cbiAgJHt4fVxuICByZXR1cm4gdmFsdWU7XG59YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6U30pfSkoZSxsLHQsbix1KX0pfTt9LDQxMjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlRmxhdHRlbkF0dHJpYnV0ZXM9dC5mbGF0dGVuPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5mbGF0dGVuPShlLHQsbik9PntvKHQsbik7Y29uc3QgaT1yLlNoYXBlVXRpbC5mbGF0dGVuU2hhcGUodFswXS5kaW1zLG4pO3JldHVybiBbZS5yZXNoYXBlVW5wYWNrZWQodFswXSxpKV19LHQucGFyc2VGbGF0dGVuQXR0cmlidXRlcz1lPT5lLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwxKTtjb25zdCBvPShlLHQpPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkZsYXR0ZW4gcmVxdWlyZXMgMSBpbnB1dC4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJzY2FsYXIgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYodDwtbnx8dD5uKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBheGlzIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIil9O30sMjE1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzPXQuZ2V0QWN0aXZhdGlvblNuaXBwZXQ9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oOTA4Nyk7dC5nZXRBY3RpdmF0aW9uU25pcHBldD1mdW5jdGlvbihlKXtsZXQgdDtzd2l0Y2goZS5hY3RpdmF0aW9uKXtjYXNlIlJlbHUiOnQ9KDAsIG8uZ2xzbFJlbHUpKCk7YnJlYWs7Y2FzZSJTaWdtb2lkIjp0PSgwLCBvLmdsc2xTaWdtb2lkKSgpO2JyZWFrO2Nhc2UiQ2xpcCI6dD0oMCwgby5nbHNsQ2xpcCkoZS5jbGlwTWluLGUuY2xpcE1heCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4ge2FjdGl2YXRpb25GdW5jdGlvbjoiIixhcHBseUFjdGl2YXRpb246IiJ9fWNvbnN0IG49dC5uYW1lO3JldHVybiB7YWN0aXZhdGlvbkZ1bmN0aW9uOnQuYm9keSxhcHBseUFjdGl2YXRpb246YHZhbHVlID0gJHtufV8odmFsdWUpO2B9fSx0LnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmdldFN0cmluZygiYWN0aXZhdGlvbiIsIiIpO2lmKCJDbGlwIj09PXQpe2NvbnN0W24sb109ZS5nZXRGbG9hdHMoImFjdGl2YXRpb25fcGFyYW1zIixbci5NSU5fQ0xJUCxyLk1BWF9DTElQXSk7cmV0dXJuIHthY3RpdmF0aW9uOnQsY2xpcE1heDpvLGNsaXBNaW46bixhY3RpdmF0aW9uQ2FjaGVLZXk6YCR7dH06JHtufSwke299YH19cmV0dXJuIHthY3RpdmF0aW9uOnQsYWN0aXZhdGlvbkNhY2hlS2V5OnR9fTt9LDYxNDk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz10LmdhdGhlcj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpO3QuZ2F0aGVyPShlLHQsbik9PihsKHQsbi5heGlzKSxbZS5ydW4odShlLHQsbiksdCldKSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDApfSk7Y29uc3QgYT17bmFtZToiR2F0aGVyIixpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSx1PShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBvPW5bMF0uZGltcy5zbGljZSgpLGE9blsxXS5kaW1zLnNsaWNlKCksdT1uZXcgQXJyYXkoby5sZW5ndGgrYS5sZW5ndGgtMSk7cj1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKHIsby5sZW5ndGgpO2NvbnN0IGw9W107Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspZTxyPyh1W2VdPW9bZV0sbC5wdXNoKGBpbnB1dElkeFske2V9XSA9IG91dHB1dElkeFske2V9XTtgKSk6ZTxyK2EubGVuZ3RoPyh1W2VdPWFbZS1yXSxsLnB1c2goYGluZGV4RGF0YUlkeFske2Utcn1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKToodVtlXT1vW2UtYS5sZW5ndGgrMV0sbC5wdXNoKGBpbnB1dElkeFske2UtYS5sZW5ndGgrMX1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKTtjb25zdCBjPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske3UubGVuZ3RofHwxfV0pIHtcbiAgICAgICAgaW50IGlucHV0SWR4WyR7by5sZW5ndGh9XTtcbiAgICAgICAgaW50IGluZGV4RGF0YUlkeFske2EubGVuZ3RofHwxfV07XG4gICAgICAgIGluZGV4RGF0YUlkeFswXSA9IDA7XG4gICAgICAgICR7bC5qb2luKCJcbiAgICAgICAgIil9XG4gICAgICAgIGludCBpZHggPSBpbnQoX0IoaW5kZXhEYXRhSWR4KSk7XG4gICAgICAgIGlucHV0SWR4WyR7cn1dID0gaWR4IDwgMCA/IGlkeCArICR7b1tyXX0gOiBpZHg7XG4gICAgICAgIHJldHVybiBfQShpbnB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSkoMCxyLHQsbi5heGlzKX0pfSxsPShlLHQpPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkdhdGhlciByZXF1aXJlcyAyIGlucHV0cy4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYobjwxKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZih0PC1ufHx0Pm4tMSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcy4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGUmJiJpbnQxNiIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhaWQgaW5wdXQgdHlwZS4iKX07fSw1Mzc4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExPXQucGFyc2VHZW1tQXR0cmlidXRlc1Y3PXQuZ2VtbT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNTYzOSk7dC5nZW1tPShlLHQsbik9PihsKHQsbiksW2UucnVuKGEodCxuKSx0KV0pO2NvbnN0IHM9KGUsdCk9Pntjb25zdCBuPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0cmFuc0EiLDApLG89MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoInRyYW5zQiIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwxKSxzPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYmV0YSIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3RyYW5zQTpuLHRyYW5zQjpvLGFscGhhOmksYmV0YTpzLGlzT3B0aW9uYWxDOnR9KX07dC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjc9ZT0+cyhlLCExKSx0LnBhcnNlR2VtbUF0dHJpYnV0ZXNWMTE9ZT0+cyhlLCEwKTtjb25zdCBhPShlLHQpPT57Y29uc3Qgbj17bmFtZToiR2VtbSIsaW5wdXROYW1lczozPT09ZS5sZW5ndGg/WyJBIiwiQiIsIkMiXTpbIkEiLCJCIl0saW5wdXRUeXBlczozPT09ZS5sZW5ndGg/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxrZXk6dC5jYWNoZUtleX07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT51KG4sZSx0KX0pfSx1PShlLHQsbik9Pntjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLHM9dFsxXS5kaW1zLnNsaWNlKCksW2EsdV09by5HZW1tVXRpbC5nZXRTaGFwZU9mR2VtbVJlc3VsdChyLG4udHJhbnNBLHMsbi50cmFuc0IsMz09PXQubGVuZ3RoP3RbMl0uZGltczp2b2lkIDApLGw9W2EsdV07aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgZ2VtbSBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2xldCBjPXJbci5sZW5ndGgtMV0scD0iIjtuLnRyYW5zQSYmKGM9clswXSksbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BX1QoYSkgKiBfQl9UKGIpOyI6bi50cmFuc0EmJiFuLnRyYW5zQj9wPSJ2YWx1ZSArPSBfQV9UKGEpICogX0IoYik7Ijohbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BKGEpICogX0JfVChiKTsiOm4udHJhbnNBfHxuLnRyYW5zQnx8KHA9InZhbHVlICs9IF9BKGEpICogX0IoYik7Iik7Y29uc3QgZD1sLmxlbmd0aCxmPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtkfV0pIHtcbiAgICAgICAgICBpbnQgYVske2R9XTtcbiAgICAgICAgICBpbnQgYlske2R9XTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD9gaW50IGNbJHt0WzJdLmRpbXMubGVuZ3RofV07YDoiIn1cblxuICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgYSk7XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCBiKTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8iYmNhc3RJbmRpY2VzX0MoaW5kaWNlcywgYyk7IjoiIn1cblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gMC4wO1xuICAgICAgICAgIGZvciAoaW50IGs9MDsgazwke2N9OyArK2spIHtcbiAgICAgICAgICAgICAgYVske2QtMX1dID0gaztcbiAgICAgICAgICAgICAgYlske2QtMn1dID0gaztcbiAgICAgICAgICAgICAgJHtwfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiBhbHBoYTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8idmFsdWUgKz0gYmV0YSAqIF9DKGMpOyI6IiJ9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOmwsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sdmFyaWFibGVzOlt7bmFtZToiYWxwaGEiLHR5cGU6ImZsb2F0IixkYXRhOm4uYWxwaGF9LHtuYW1lOiJiZXRhIix0eXBlOiJmbG9hdCIsZGF0YTpuLmJldGF9XSxzaGFkZXJTb3VyY2U6Zn0pfSxsPShlLHQpPT57aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBpcyBtaXNzaW5nIik7aWYodC5pc09wdGlvbmFsQyYmKGUubGVuZ3RoPDJ8fGUubGVuZ3RoPjMpKXRocm93IG5ldyBFcnJvcigiSW52YWlkIGlucHV0IHNoYXBlLiIpO2lmKCF0LmlzT3B0aW9uYWxDJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJHZW1tIHJlcXVpcmVzIDMgaW5wdXRzIik7aWYoMz09PWUubGVuZ3RoJiYxIT09ZVsyXS5kaW1zLmxlbmd0aCYmMiE9PWVbMl0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlIG9mIEMiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGV8fDM9PT1lLmxlbmd0aCYmImZsb2F0MzIiIT09ZVsyXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoZVswXS50eXBlIT09ZVsxXS50eXBlfHwzPT09ZS5sZW5ndGgmJmVbMF0udHlwZSE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHR5cGVzIGFyZSBtaXNtYXRjaGVkIil9O30sNTk1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big2NzU3KSxvPW4oNTYzOSksaT1uKDU2MTQpO3QuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsdCxuLHMsYSk9Pntjb25zdCB1PShsPWEuY2FjaGVLZXkse25hbWU6IkltMkNvbCAocGFja2VkKSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50Omx9KTt2YXIgbDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4scyxhLHUpPT57Y29uc3QgbD1uLmRpbXMsYz1zLmRpbXMscD1hLmxlbmd0aCxkPVtjWzFdKmNbMl0qY1szXSxhWzJdKmFbM11dLGY9Y1syXSpjWzNdLGg9KDAsIGkudW5wYWNrRnJvbUNoYW5uZWwpKCksZz0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbik7bGV0IGI9IiI7Zm9yKGxldCBlPTA7ZTw9MTtlKyspZm9yKGxldCB0PTA7dDw9MTt0KyspYis9YFxuICAgICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnggKyAke3R9O1xuICAgICAgICAgICAgcG9zID0gcmMueSArICR7ZX07XG5cbiAgICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke2RbMV19ICYmIHBvcyA8ICR7ZFswXX0pIHtcbiAgICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gKCR7YVtwLTFdfSkpICogJHt1LnN0cmlkZXNbMF19IC1cbiAgICAgICAgICAgICAgICAke3UucGFkc1swXX07XG4gICAgICAgICAgICAgIGQwID0gb2Zmc2V0WSArICR7dS5kaWxhdGlvbnNbMF19ICogKGltb2QocG9zLCAke2Z9KSAvICR7Y1syXX0pO1xuXG4gICAgICAgICAgICAgIGlmKGQwIDwgJHtsWzJdfSAmJiBkMCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WCA9IGltb2QoYmxvY2tJbmRleCwgJHthW3AtMV19KSAqICR7dS5zdHJpZGVzWzFdfSAtXG4gICAgICAgICAgICAgICAgICAke3UucGFkc1sxXX07XG4gICAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgJHt1LmRpbGF0aW9uc1sxXX0gKiBpbW9kKGltb2QocG9zLCAke2Z9KSwgJHtjWzJdfSk7XG5cbiAgICAgICAgICAgICAgICBpZihkMSA8ICR7bFszXX0gJiYgZDEgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgICBjaCA9IGludChmbG9hdChwb3MpLyAke2Z9Lik7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7MiplK3R9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0QSgwLCBjaCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgICBpbnQoaW5uZXJEaW1zLnkpKSwgaW5uZXJEaW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGA7Y29uc3QgbT1gXG4gICAgICAke2h9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICAgIHZlYzIgaW5uZXJEaW1zO1xuICAgICAgICAgICR7Yn1cbiAgICAgICAgICAke2cub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmQsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTptLGhhc01haW46ITB9KX0pKGUsdSx0LG4scyxhKX0pfTt9LDE2MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNhbGN1bGF0ZUltMkNvbERpbXM9dC5jcmVhdGVJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDU2MzkpO3QuY3JlYXRlSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbixvLGkscyk9Pntjb25zdCBhPSh1PXMuY2FjaGVLZXkse25hbWU6IkltMkNvbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltyLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciB1O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLG4sbyxpLHMsYSk9Pntjb25zdCB1PW8uZGltcyxsPWkuZGltcyxjPXMubGVuZ3RoLHA9KDAsIHQuY2FsY3VsYXRlSW0yQ29sRGltcykodSxsLHMsNCksZD1gXG4gICAgICAgIGNvbnN0IGludCBYQyA9ICR7dVsxXX07XG4gICAgICAgIGNvbnN0IGludCBYSCA9ICR7dVsyXX07XG4gICAgICAgIGNvbnN0IGludCBYVyA9ICR7dVszXX07XG4gICAgICAgIGNvbnN0IGludCBLSCA9ICR7YS5rZXJuZWxTaGFwZVswXX07XG4gICAgICAgIGNvbnN0IGludCBLVyA9ICR7YS5rZXJuZWxTaGFwZVsxXX07XG4gICAgICAgIGNvbnN0IGludCBkaWxhdGlvbkggPSAke2EuZGlsYXRpb25zWzBdfTtcbiAgICAgICAgY29uc3QgaW50IGRpbGF0aW9uVyA9ICR7YS5kaWxhdGlvbnNbMV19O1xuICAgICAgICBjb25zdCBpbnQgc3RyaWRlSCA9ICR7YS5zdHJpZGVzWzBdfTtcbiAgICAgICAgY29uc3QgaW50IHN0cmlkZVcgPSAke2Euc3RyaWRlc1sxXX07XG4gICAgICAgIGNvbnN0IGludCBwYWRIID0gJHthLnBhZHNbMF19O1xuICAgICAgICBjb25zdCBpbnQgcGFkVyA9ICR7YS5wYWRzWzFdfTtcbiAgICAgICAgY29uc3QgaW50IEtIS1cgPSBLSCpLVztcbiAgICAgICAgY29uc3QgaW50IFhDS0hLVyA9IFhDICogS0hLVztcbiAgICAgICAgY29uc3QgaW50IG91dHB1dENoYW5uZWxzID0gNDtcbiAgICAgICAgdmVjNCBwcm9jZXNzKGludCBpbmRpY2VzWyR7Y31dKSB7XG4gICAgICAgICAgaW50IGIgID0gaW5kaWNlc1swXTsgLy8gYmF0Y2ggc2l6ZVxuICAgICAgICAgIGludCBvaCA9IGluZGljZXNbMV0gKiBzdHJpZGVIIC0gcGFkSDsgLy9vdXRwdXQgaGVpZ2h0XG4gICAgICAgICAgaW50IG93ID0gaW5kaWNlc1syXSAqIHN0cmlkZVcgLSBwYWRXOyAvL291dHB1dCB3aWR0aFxuICAgICAgICAgIGludCBwID0gaW5kaWNlc1szXSAqIG91dHB1dENoYW5uZWxzOyAvL3BhdGNoXG4gICAgICAgICAgdmVjNCB2YWx1ZSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaSA8IG91dHB1dENoYW5uZWxzOyArK2kpIHtcbiAgICAgICAgICAgIGlmKHAgPCBYQ0tIS1cpIHtcbiAgICAgICAgICAgICAgaW50IHBhdGNoQyA9IHAgLyBLSEtXO1xuICAgICAgICAgICAgICBpbnQgcGF0Y2hIID0gKHAgLSBwYXRjaEMqS0hLVykgLyBLVztcbiAgICAgICAgICAgICAgaW50IHBhdGNoVyA9IChwIC0gcGF0Y2hDKktIS1cpIC0gcGF0Y2hIICogS1c7XG4gICAgICAgICAgICAgIGludCB4aDIgPSBvaCArIHBhdGNoSCAqIGRpbGF0aW9uSDtcbiAgICAgICAgICAgICAgaW50IHh3MiA9IG93ICsgcGF0Y2hXICogZGlsYXRpb25XO1xuICAgICAgICAgICAgICBpbnQgeFske3UubGVuZ3RofV07XG4gICAgICAgICAgICAgIHhbMF0gPSBiO1xuICAgICAgICAgICAgICB4WzFdID0gcGF0Y2hDO1xuICAgICAgICAgICAgICB4WzJdID0geGgyO1xuICAgICAgICAgICAgICB4WzNdID0geHcyO1xuICAgICAgICAgICAgICBpZih4aDIgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgeGgyIDwgWEggJiZcbiAgICAgICAgICAgICAgICAgIHh3MiA+PSAwICYmXG4gICAgICAgICAgICAgICAgICB4dzIgPCBYVykge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gX1goeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOnAsdHlwZTpvLnR5cGUsdGV4dHVyZVR5cGU6ci5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6ZH0pfSkoMCxhLG4sbyxpLHMpfSl9LHQuY2FsY3VsYXRlSW0yQ29sRGltcz0oZSx0LG4scj00KT0+W25bMF0sblsyXSxuWzNdLE1hdGguY2VpbChlWzFdKnRbMl0qdFszXS9yKV07fSw2OTgxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz10LmltYWdlU2NhbGVyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDU2MzkpO3QuaW1hZ2VTY2FsZXI9KGUsdCxuKT0+KHUodCksW2UucnVuKHMoZSx0LG4pLHQpXSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInNjYWxlIiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXRzKCJiaWFzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3NjYWxlOnQsYmlhczpufSl9O2NvbnN0IGk9e25hbWU6IkltYWdlU2NhbGVyIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxzPShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBpPW5bMF0uZGltcy5zbGljZSgpLHM9aS5sZW5ndGgsdT1gXG4gICAgICAke2Eoci5iaWFzLmxlbmd0aCl9XG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgIHJldHVybiBfWChpbmRpY2VzKSAqIHNjYWxlICsgZ2V0QmlhcyhiaWFzLCBpbmRpY2VzWzFdKTtcbiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczppLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImJpYXMiLHR5cGU6ImZsb2F0IixhcnJheUxlbmd0aDpyLmJpYXMubGVuZ3RoLGRhdGE6ci5iaWFzfSx7bmFtZToic2NhbGUiLHR5cGU6ImZsb2F0IixkYXRhOnIuc2NhbGV9XSxzaGFkZXJTb3VyY2U6dX0pfSkoMCxyLHQsbil9KX0sYT1lPT57Y29uc3QgdD1bYGZsb2F0IGdldEJpYXMoZmxvYXQgYmlhc1ske2V9XSwgaW50IGNoYW5uZWwpIHtgXTtmb3IobGV0IG49MDtuPGU7KytuKTA9PT1uP3QucHVzaChgXHRpZiAoY2hhbm5lbCA9PSAke259KSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6bj09PWUtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGNoYW5uZWwgPT0gJHtufSkgeyByZXR1cm4gYmlhc1ske259XTsgfWApO3JldHVybiB0LnB1c2goIlx0fSIpLHQuam9pbigiXG4iKX0sdT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlU2NhbGVyIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoNCE9PWVbMF0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSYmImZsb2F0NjQiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDc0MTM6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlSW5zdGFuY2VOb3JtYWxpemF0aW9uQXR0cmlidXRlcz10Lmluc3RhbmNlTm9ybWFsaXphdGlvbj12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0Lmluc3RhbmNlTm9ybWFsaXphdGlvbj0oZSx0LG4pPT57bCh0KTtjb25zdCByPWUucnVuKHModFswXSksdCk7cmV0dXJuIFtlLnJ1bih1KGUsdFswXSxuLHIuZGltcyksW3RbMF0scix0WzFdLHRbMl1dKV19LHQucGFyc2VJbnN0YW5jZU5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXBzaWxvbiIsMWUtNSk7Y29uc3QgaT17bmFtZToiSW5zdGFuY2VOb3JtYWxpemF0aW9uX01lYW5BbmRWYXJpYW5jZSIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX0scz1lPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj10LmRpbXMuc2xpY2UoKSxyPW5bMV0saT1uWzJdKm5bM10scz1bblswXSxyXSxhPWBcbiAgICAgIHZlYzQgcHJvY2VzcyhpbnRbMl0gaW5kaWNlcykge1xuICAgICAgICB2ZWM0IHYgPSB2ZWM0KDAuMCk7XG4gICAgICAgIGludCBhWzRdO1xuICAgICAgICBhWzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgYVsxXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHRlbXAgPSAwLjA7XG4gICAgICAgIGZvcihpbnQgYTI9MDsgYTI8JHtuWzJdfTsgYTIrKykge1xuICAgICAgICAgIGFbMl0gPSBhMjtcbiAgICAgICAgICBmb3IoaW50IGEzPTA7IGEzPCR7blszXX07IGEzKyspIHtcbiAgICAgICAgICAgIGFbM10gPSBhMztcbiAgICAgICAgICAgIGZsb2F0IHggPSBfWChhKTtcbiAgICAgICAgICAgIHRlbXAgKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgbWVhbiA9IHRlbXAgLyBmbG9hdCgke2l9KTtcbiAgICAgICAgdGVtcCA9IDAuMDtcbiAgICAgICAgZm9yKGludCBhMj0wOyBhMjwke25bMl19OyBhMisrKSB7XG4gICAgICAgICAgYVsyXSA9IGEyO1xuICAgICAgICAgIGZvcihpbnQgYTM9MDsgYTM8JHtuWzNdfTsgYTMrKykge1xuICAgICAgICAgICAgYVszXSA9IGEzO1xuICAgICAgICAgICAgZmxvYXQgeCA9IF9YKGEpO1xuICAgICAgICAgICAgdGVtcCArPSAoeCAtIG1lYW4pICogKHggLSBtZWFuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdi5yID0gbWVhbjtcbiAgICAgICAgdi5nID0gdGVtcCAvIGZsb2F0KCR7aX0pO1xuXG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOnMsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6YX0pfSkoaSxlKX0pLGE9e25hbWU6Ikluc3RhbmNlTm9ybWFsaXphdGlvbl9Db21wdXRlT3V0cHV0IixpbnB1dE5hbWVzOlsiWCIsIk1lYW5BbmRWYXJpYW5jZSIsIlNjYWxlIiwiQiJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uLG8uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZF19LHU9KGUsdCxuLGkpPT57Y29uc3Qgcz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpgJHtufWB9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtnZXQ6KCk9PigoZSx0LG4saSxzKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHMsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxbYyxwXT1bdS80LGxdLGQ9YFxuICAgICAgdmVjNCBnZXRfTWVhbkFuZFZhcmlhbmNlKGludFsyXSBtdikge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke2N9LCAke3B9KTtcbiAgICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KE1lYW5BbmRWYXJpYW5jZSwgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbNF0gaW5kaWNlcykge1xuICAgICAgICBpbnQgbXZbMl07XG4gICAgICAgIG12WzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgbXZbMV0gPSBpbmRpY2VzWzFdO1xuICAgICAgICB2ZWM0IG1lYW5fYW5kX3ZhcmlhbmNlID0gZ2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIGZsb2F0IG1lYW4gPSBtZWFuX2FuZF92YXJpYW5jZS5yO1xuICAgICAgICBmbG9hdCB2YXJpYW5jZSA9IG1lYW5fYW5kX3ZhcmlhbmNlLmc7XG5cbiAgICAgICAgaW50IHNiWzFdO1xuICAgICAgICBzYlswXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHNjYWxlID0gX1NjYWxlKHNiKTtcbiAgICAgICAgZmxvYXQgYiA9IF9CKHNiKTtcblxuICAgICAgICByZXR1cm4gc2NhbGUgKiAoX1goaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBlcHNpbG9uKSArIGI7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6bi5kaW1zLHR5cGU6bi50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImVwc2lsb24iLHR5cGU6ImZsb2F0IixkYXRhOml9XSxzaGFkZXJTb3VyY2U6ZH0pfSkoZSxzLHQsbixpKX0pfSxsPWU9PntpZighZXx8MyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5zdGFuY2VOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDMgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdO2lmKHQuZGltcy5sZW5ndGg8M3x8MSE9PW4uZGltcy5sZW5ndGh8fDEhPT1yLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihuLmRpbXNbMF0hPT10LmRpbXNbMV18fHIuZGltc1swXSE9PXQuZGltc1sxXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSBzdXBwb3J0IDQtRCBpbnB1dCBzaGFwZS4iKX07fSw3MDA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVMcm5Qcm9ncmFtSW5mb0xvYWRlcj10LnBhcnNlTHJuQXR0cmlidXRlcz10Lmxybj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big1NjM5KTt0Lmxybj0oZSx0LG4pPT4oYSh0KSxbZS5ydW4ocyh0LG4pLHQpXSksdC5wYXJzZUxybkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMWUtNCksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJldGEiLC43NSksbz1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJpYXMiLDEpLGk9ZS5hdHRyaWJ1dGVzLmdldEludCgic2l6ZSIpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTp0LGJldGE6bixiaWFzOm8sc2l6ZTppfSl9O2NvbnN0IGk9e25hbWU6IkxSTiIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX07ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2NhY2hlSGludDp0LmNhY2hlS2V5LGdldDooKT0+ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWVbMF0uZGltc1sxXSxyPWVbMF0uZGltcy5sZW5ndGgscz0tTWF0aC5mbG9vcigodC5zaXplLTEpLzIpLGE9TWF0aC5jZWlsKCh0LnNpemUtMSkvMiksdT1gZmxvYXQoJHt0LmFscGhhfSkgLyBmbG9hdCgke3Quc2l6ZX0pYCxsPWBcbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cn1dKSB7XG4gICAgICAgIGludCBjID0gaW5kaWNlc1sxXTtcbiAgICAgICAgZmxvYXQgeCA9IF9YKGluZGljZXMpO1xuICAgICAgICBmbG9hdCBzcXVhcmVfc3VtID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAke3N9OyBpIDw9ICR7YX07IGkrKykge1xuICAgICAgICAgIGludCBpZHggPSBjICsgaTtcbiAgICAgICAgICBpZiAoYyA+PSAwICYmIGMgPCAke259KSB7XG4gICAgICAgICAgICBpbmRpY2VzWzFdID0gaWR4O1xuICAgICAgICAgICAgZmxvYXQgaiA9IF9YKGluZGljZXMpO1xuICAgICAgICAgICAgc3F1YXJlX3N1bSArPSBqICogajtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggLyBwb3coZmxvYXQoJHt0LmJpYXN9KSArICR7dX0gKiBzcXVhcmVfc3VtLCBmbG9hdCgke3QuYmV0YX0pKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtjYWNoZUhpbnQ6dC5jYWNoZUtleSxvdXRwdXQ6e2RpbXM6ZVswXS5kaW1zLHR5cGU6ZVswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpsfSl9KGUsdCl9KX10LmNyZWF0ZUxyblByb2dyYW1JbmZvTG9hZGVyPXM7Y29uc3QgYT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkxSTiByZXF1aXJlcyAxIGlucHV0LiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcignY3VycmVudGx5IG9ubHkgc3VwcG9ydCBMUk4gZm9yIGlucHV0IHdpdGggIk5DSFciIGZvcm1hdCcpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHNob3VsZCBiZSBmbG9hdCB0eXBlIil9O30sNTYzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9big0MzIpLGE9bigyMTUwKSx1PW4oODI3Nik7dC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgbD0oYz10Lmxlbmd0aD4yLHA9bi5hY3RpdmF0aW9uQ2FjaGVLZXkse25hbWU6Ik1hdE11bCAocGFja2VkKSIsaW5wdXROYW1lczpjP1siQSIsIkIiLCJCaWFzIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6Yz9baS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRdOltpLlRleHR1cmVUeXBlLnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50OnB9KTt2YXIgYyxwO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbixsKT0+e2NvbnN0IGM9bi5sZW5ndGg+MixwPWM/InZhbHVlICs9IGdldEJpYXNGb3JNYXRtdWwoKTsiOiIiLGQ9blswXS5kaW1zLGY9blsxXS5kaW1zLGg9ci5Ccm9hZGNhc3RVdGlsLmNhbGNTaGFwZShkLGYsITApLGc9IXIuU2hhcGVVdGlsLmFyZUVxdWFsKG5bMF0uZGltcyxuWzFdLmRpbXMpO2lmKCFoKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIG1hdG11bCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2NvbnN0IGI9ZFtkLmxlbmd0aC0xXSxtPU1hdGguY2VpbChiLzIpLHk9ZC5sZW5ndGgsdj1mLmxlbmd0aCxfPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx3PSgwLCBzLmdldENvb3Jkc0RhdGFUeXBlKShoLmxlbmd0aCksVD1oLmxlbmd0aCx4PSgwLCBzLmdldEdsQ2hhbm5lbHMpKCkse2FjdGl2YXRpb25GdW5jdGlvbjpPLGFwcGx5QWN0aXZhdGlvbjpTfT0oMCwgYS5nZXRBY3RpdmF0aW9uU25pcHBldCkobCksQT1jP2AkeygwLCB1LmdldEJpYXNGb3JNYXRtdWwpKHcseCxuWzJdLmRpbXMsaCwhMCl9YDoiIixQPWc/YCR7ZnVuY3Rpb24oZSx0LG4sbyl7bGV0IGk9W10scz1bXTtjb25zdCBhPW5bMF0uZGltcyx1PW5bMV0uZGltcyxsPWEubGVuZ3RoLGM9dS5sZW5ndGgscD1vLmxlbmd0aCxkPXAtbCxmPXAtYztpPWEubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitkXX1gKSksaVtsLTFdPSJpKjIiLGkuam9pbigiLCAiKSxzPXUubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitmXX1gKSksc1tjLTJdPSJpKjIiLHMuam9pbigiLCAiKTtjb25zdCBoPXIuQnJvYWRjYXN0VXRpbC5nZXRCcm9hZGNhc3REaW1zKGEsbyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyh1LG8pLGI9aC5tYXAoKGU9PmBjb29yZHMuJHt0W2UrZF19ID0gMDtgKSkuam9pbigiXG4iKSxtPWcubWFwKChlPT5gY29vcmRzLiR7dFtlK2ZdfSA9IDA7YCkpLmpvaW4oIlxuIikseT1gaW50IGxhc3REaW0gPSBjb29yZHMuJHt0W3AtMV19O1xuICBjb29yZHMuJHt0W3AtMV19ID0gY29vcmRzLiR7dFtwLTJdfTtcbiAgY29vcmRzLiR7dFtwLTJdfSA9IGxhc3REaW07YDtyZXR1cm4gYFxudmVjNCBnZXRBQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHt5fVxuICAke2J9XG4gIHZlYzQgb3V0cHV0VmFsdWUgPSBnZXRBKCR7aX0pO1xuICByZXR1cm4gb3V0cHV0VmFsdWU7XG59XG5cbnZlYzQgZ2V0QkF0T3V0Q29vcmRzTWF0bXVsKGludCBpKSB7XG4gICR7ZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICR7eX1cbiAgJHttfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qigke3N9KTtcbiAgcmV0dXJuIG91dHB1dFZhbHVlO1xufWB9KHcseCxuLGgpfWA6IiIsST1nPyJnZXRBQXRPdXRDb29yZHNNYXRtdWwoaSkiOmBnZXRBKCR7ZnVuY3Rpb24oZSx0KXtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPHQtMjtyKyspbis9YHJjLiR7ZVtyXX0sIGA7cmV0dXJuIG4rPWByYy4ke2VbdC0yXX0sIGkqMmAsbn0oeCx5KX0pYCxFPWc/ImdldEJBdE91dENvb3Jkc01hdG11bChpKSI6YGdldEIoJHtmdW5jdGlvbihlLHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dC0yO3IrKyluKz1gcmMuJHtlW3JdfSwgYDtyZXR1cm4gbis9YGkqMiwgcmMuJHtlW3QtMV19YCxufSh4LHYpfSlgLEQ9YFxuICAgICAgICAgICAgJHtQfVxuICAgICAgICAgICAgJHtBfVxuICAgICAgICAgICAgJHtPfVxuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICAke2c/IiI6YCR7d30gcmMgPVxuICAgICAgICAgIGdldE91dHB1dENvb3JkcygpOyBpbnQgbGFzdERpbSA9IHJjLiR7eFtULTFdfTsgcmMuJHt4W1QtMV19ID1cbiAgICAgICAgICByYy4ke3hbVC0yXX07IHJjLiR7eFtULTJdfSA9IGxhc3REaW07XG4gICAgICBgfVxuXG4gICAgICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDApO1xuICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7bX07IGkrKykge1xuICAgICAgICAgICAgICAgIHZlYzQgYSA9ICR7SX07XG4gICAgICAgICAgICAgICAgdmVjNCBiID0gJHtFfTtcblxuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLnJyYmIgKiBiLnJncmcpO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLmdnYWEgKiBiLmJhYmEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICR7cH1cbiAgICAgICAgICAgICAgJHtTfVxuICAgICAgICAgICAgICAke18ub3V0cHV0fSA9IHZhbHVlO1xuICAgICAgICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmgsdHlwZTpuWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTpELGhhc01haW46ITB9KX0pKGUsbCx0LG4pfSl9O30sODI3NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Qmlhc0Zvck1hdG11bD10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPXQucGFyc2VNYXRNdWxBdHRyaWJ1dGVzPXQubWF0TXVsPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpLGk9big0MzIpLHM9bigyMTUwKSxhPW4oNTYzMik7dC5tYXRNdWw9KGUsdCxuKT0+KGModCksZS5zZXNzaW9uLnBhY2s/W2UucnVuKCgwLCBhLmNyZWF0ZVBhY2tlZE1hdG11bFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihsKHQsbiksdCldKSx0LnBhcnNlTWF0TXVsQXR0cmlidXRlcz1lPT4oMCwgcy5wYXJzZUludGVybmFsQWN0aXZhdGlvbkF0dHJpYnV0ZXMpKGUuYXR0cmlidXRlcyk7Y29uc3QgdT0oZSx0KT0+KHtuYW1lOiJNYXRNdWwiLGlucHV0TmFtZXM6ZT9bIkEiLCJCIiwiQmlhcyJdOlsiQSIsIkIiXSxpbnB1dFR5cGVzOmU/W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXTpbby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dH0pO2Z1bmN0aW9uIGwoZSx0KXtjb25zdCBuPXUoZS5sZW5ndGg+Mix0LmFjdGl2YXRpb25DYWNoZUtleSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5mdW5jdGlvbihlLHQsbil7Y29uc3QgYT10WzBdLmRpbXMsdT10WzFdLmRpbXMsbD1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKGEsdSwhMCk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgbWF0bXVsIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7Y29uc3QgYz0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkobC5sZW5ndGgpLGQ9KDAsIGkuZ2V0R2xDaGFubmVscykoKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmYsYXBwbHlBY3RpdmF0aW9uOmh9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShuKSxnPXQubGVuZ3RoPjIsYj1nPyJ2YWx1ZSArPSBnZXRCaWFzRm9yTWF0bXVsKCk7IjoiIixtPWc/YCR7cChjLGQsdFsyXS5kaW1zLGwsITEpfWA6IiIseT1sLmxlbmd0aCx2PWEubGVuZ3RoLF89dS5sZW5ndGgsdz1gXG4gICAgJHtmfVxuICAgICR7bX1cbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7eX1dKSB7XG4gICAgICAgIGludCBhWyR7dn1dO1xuICAgICAgICBpbnQgYlske199XTtcbiAgICAgICAgYmNhc3RNYXRtdWxJbmRpY2VzX0EoaW5kaWNlcywgYSk7XG4gICAgICAgIGJjYXN0TWF0bXVsSW5kaWNlc19CKGluZGljZXMsIGIpO1xuXG4gICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICBmb3IgKGludCBrPTA7IGs8JHthW2EubGVuZ3RoLTFdfTsgKytrKSB7XG4gICAgICAgICAgICBhWyR7di0xfV0gPSBrO1xuICAgICAgICAgICAgYlske18tMn1dID0gaztcbiAgICAgICAgICAgIHZhbHVlICs9IF9BKGEpICogX0IoYik7XG4gICAgICAgIH1cbiAgICAgICAgJHtifVxuICAgICAgICAke2h9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6d30pfShuLGUsdCl9KX10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPWw7Y29uc3QgYz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk1hdE11bCByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihlWzBdLmRpbXNbZVswXS5kaW1zLmxlbmd0aC0xXSE9PWVbMV0uZGltc1tlWzFdLmRpbXMubGVuZ3RoLTJdKXRocm93IG5ldyBFcnJvcigic2hhcmVkIGRpbWVuc2lvbiBkb2VzIG5vdCBtYXRjaC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgc2hvdWxkIGJlIGZsb2F0IHR5cGUiKTtpZihlWzBdLnR5cGUhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgdHlwZXMgc2hvdWxkIG1hdGNoIil9O2Z1bmN0aW9uIHAoZSx0LG4sbyxpKXtsZXQgcz0iIjtjb25zdCBhPW4ubGVuZ3RoLHU9by5sZW5ndGgsbD11LWE7cz11PDImJmE+MD8iY29vcmRzIjpuLm1hcCgoKGUsbik9PmBjb29yZHMuJHt0W24rbF19YCkpLmpvaW4oIiwgIik7Y29uc3QgYz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhuLG8pLm1hcCgoZT0+YGNvb3Jkcy4ke3RbZStsXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCBwPSJ2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS55eSkiO3JldHVybiAxPT09ci5TaGFwZVV0aWwuc2l6ZShuKSYmKHA9InZlYzQob3V0cHV0VmFsdWUueCkiKSxpP2BcbnZlYzQgZ2V0Qmlhc0Zvck1hdG11bCgpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHtjfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qmlhcygke3N9KTtcbiAgcmV0dXJuICR7cH07XG59YDpgXG5mbG9hdCBnZXRCaWFzRm9yTWF0bXVsKCkge1xuICAke2V9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAke2N9XG4gIHJldHVybiBnZXRCaWFzKGNvb3Jkcy54KTtcbn1gfXQuZ2V0Qmlhc0Zvck1hdG11bD1wO30sOTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJwYWNrIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZF19O3QuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPShlLHQpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksdT10LmRpbXMsbD11Lmxlbmd0aCxjPXQuZGltcy5sZW5ndGgscD0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZD0oMCwgcy5nZXRDaGFubmVscykoInJjIixjKSxmPShoPWMsZz1kLGI9dVt1Lmxlbmd0aC0yXSxtPXVbdS5sZW5ndGgtMV0sMD09PWh8fDE9PT1oPyIiOmBcbiAgICBpbnQgciA9ICR7Z1toLTJdfTtcbiAgICBpbnQgYyA9ICR7Z1toLTFdfTtcbiAgICBpbnQgcnAxID0gJHtnW2gtMl19ICsgMTtcbiAgICBpbnQgY3AxID0gJHtnW2gtMV19ICsgMTtcbiAgICBib29sIHJFZGdlID0gcnAxID49ICR7bX07XG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2J9O1xuICAgIGApO3ZhciBoLGcsYixtO2xldCB5O3k9MD09PWw/WzEsMV06MT09PWw/W3VbMF0sMV06W3VbYy0xXSx1W2MtMl1dO2NvbnN0IHY9ZnVuY3Rpb24oZSx0LG4pe2lmKDA9PT1lKXJldHVybiAiZmFsc2UiO2lmKDE9PT1lKXJldHVybiBgcmMgPiAke3RbMF19YDtsZXQgcj0iIjtmb3IobGV0IG89ZS0yO288ZTtvKyspcis9YCR7bltvXX0gPj0gJHt0W28tZSsyXX1gLG88ZS0xJiYocis9Inx8Iik7cmV0dXJuIHJ9KGMseSxkKSxfPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gImdldEEoKSwgMCwgMCwgMCI7aWYoMT09PW4pcmV0dXJuIGBnZXRBKHJjKSxcbiAgICAgICAgICAgIHJjICsgMSA+PSAke2VbMF19ID8gMC4gOiBnZXRBKHJjICsgMSksXG4gICAgICAgICAgICAwLCAwYDtsZXQgcj0iIjtpZihuPjIpZm9yKGxldCBlPTA7ZTxuLTI7KytlKXIrPWAke3RbZV19LGA7cmV0dXJuIGBnZXRBKCR7cn1yLCBjKSxcbiAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjKSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3J9ciwgY3AxKSxcbiAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjcDEpYH0odSxkKSx3PWBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7cH0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICAgIGlmKCR7dn0pIHtcbiAgICAgICAgICAgICR7bi5vdXRwdXR9ID0gdmVjNCgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHtmfVxuXG4gICAgICAgICAgICAke24ub3V0cHV0fSA9IHZlYzQoJHtffSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2hhc01haW46ITAsb3V0cHV0OntkaW1zOnQuZGltcyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOnd9KX0pKGUsdCl9KTt9LDU2MTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnVucGFja0Zyb21DaGFubmVsPXQuZ2V0Q2hhbm5lbHM9dC5nZXRWZWNDaGFubmVscz12b2lkIDA7Y29uc3Qgcj1uKDQzMik7ZnVuY3Rpb24gbyhlLHQpe3JldHVybiAoMCwgci5nZXRHbENoYW5uZWxzKSh0KS5tYXAoKHQ9PmAke2V9LiR7dH1gKSl9dC5nZXRWZWNDaGFubmVscz1vLHQuZ2V0Q2hhbm5lbHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMT09PXQ/W2VdOm8oZSx0KX0sdC51bnBhY2tGcm9tQ2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiAiXG4gICAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICAgIGludCBtb2RDb29yZCA9IGltb2QoZGltLCAyKTtcbiAgICAgIHJldHVybiBtb2RDb29yZCA9PSAwID8gZnJhZy5yIDogZnJhZy5nO1xuICAgIH1cblxuICAgIGZsb2F0IGdldENoYW5uZWwodmVjNCBmcmFnLCB2ZWMyIGlubmVyRGltcykge1xuICAgICAgdmVjMiBtb2RDb29yZCA9IG1vZChpbm5lckRpbXMsIDIuKTtcbiAgICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLnIgOiBmcmFnLmcpIDpcbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLmIgOiBmcmFnLmEpO1xuICAgIH1cbiAgIn07fSw1NTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVBhZEF0dHJpYnV0ZXNWMTE9dC5wYWRWMTE9dC5wYXJzZVBhZEF0dHJpYnV0ZXNWMj10LnBhZFYyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big2NzU3KSxzPW4oNTYzOSksYT17bmFtZToiUGFkIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnBhZFYyPShlLHQsbik9PihjKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+bChlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VQYWRBdHRyaWJ1dGVzVjI9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsImNvbnN0YW50Iiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInZhbHVlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJwYWRzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21vZGU6dCx2YWx1ZTpuLHBhZHM6b30pfSx0LnBhZFYxMT0oZSxuLHIpPT57cChuKTtjb25zdCBvPXUoZSxuLHIpO3JldHVybiAoMCwgdC5wYWRWMikoZSxbblswXV0sbyl9LHQucGFyc2VQYWRBdHRyaWJ1dGVzVjExPWU9PmUuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJjb25zdGFudCIpO2NvbnN0IHU9KGUsdCxuKT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fHQubGVuZ3RoPj0zJiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFsyXS5kYXRhSWQpKXRocm93IG5ldyBFcnJvcigiZHluYW1pYyBwYWQgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBvPUFycmF5LmZyb20odFsxXS5pbnRlZ2VyRGF0YSksaT10Lmxlbmd0aD49Mz90WzJdLmZsb2F0RGF0YVswXTowO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHttb2RlOm4scGFkczpvLHZhbHVlOml9KX0sbD0oZSx0LG4pPT57Y29uc3Qgcj1vLlNoYXBlVXRpbC5wYWRTaGFwZSh0LmRpbXMuc2xpY2UoKSxuLnBhZHMpLGk9ci5sZW5ndGgsYT1gXG4gICAgICAke2QoZSx0LG4pfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbJHtpfV0gaW5kaWNlcykge1xuICAgICAgICAgIHJldHVybiBwYWRBKGluZGljZXMpO1xuICAgICAgfWA7cmV0dXJuIHtuYW1lOiJQYWQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbcy5UZXh0dXJlVHlwZS51bnBhY2tlZF0sb3V0cHV0OntkaW1zOnIsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9fSxjPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDEgaW5wdXQiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0scD1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCYmMyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj0zJiYic3RyaW5nIj09PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModC5kaW1zKTtzd2l0Y2gobi5tb2RlKXtjYXNlImNvbnN0YW50IjpyZXR1cm4gZihyLHQuZGltcyxsLGEsdSxuLnBhZHMsbi52YWx1ZSk7Y2FzZSJyZWZsZWN0IjpyZXR1cm4gaChyLHQuZGltcyxsLGEsdSxuLnBhZHMpO2Nhc2UiZWRnZSI6cmV0dXJuIGcocix0LmRpbXMsbCxhLHUsbi5wYWRzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtb2RlIil9fSxmPShlLHQsbixyLG8saSxzKT0+e2NvbnN0IGE9dC5sZW5ndGg7bGV0IHU9IiI7Zm9yKGxldCBlPWEtMTtlPj0wOy0tZSl1Kz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgcmV0dXJuIGNvbnN0YW50O1xuICAgICAgICBpZiAoayA+PSAke3RbZV19KSByZXR1cm4gY29uc3RhbnQ7XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske2F9XSkge1xuICAgICAgICBjb25zdCBmbG9hdCBjb25zdGFudCA9IGZsb2F0KCR7c30pO1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke3V9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGg9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSB7IGsgPSAtazsgfVxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgaW50IF8ybl8xID0gJHsyKih0W2VdLTEpfTtcbiAgICAgICAgICBrID0gaW50KCBtb2QoIGZsb2F0KGspLCBmbG9hdChfMm5fMSkgKSApIDtcbiAgICAgICAgICBpZihrID49ICR7dFtlXX0pIHsgayA9IF8ybl8xIC0gazsgfVxuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske3N9XSkge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke2F9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGc9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgayA9IDA7XG4gICAgICAgIGlmIChrID49ICR7dFtlXX0pIGsgPSAke3RbZV0tMX07XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGZsb2F0IHBhZEEoaW50IG1bJHtzfV0pIHtcbiAgICAgICAgaW50IG9mZnNldCA9IDA7XG4gICAgICAgIGludCBrID0gMDtcbiAgICAgICAgJHthfVxuICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtyfSwgJHtvfSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KEEsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgfTt9LDI4MzQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lmdsb2JhbE1heFBvb2w9dC5wYXJzZU1heFBvb2xBdHRyaWJ1dGVzPXQubWF4UG9vbD10LnBhcnNlR2xvYmFsQXZlcmFnZVBvb2xBdHRyaWJ1dGVzPXQuZ2xvYmFsQXZlcmFnZVBvb2w9dC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz10LmF2ZXJhZ2VQb29sPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big1NjM5KTt0LmF2ZXJhZ2VQb29sPShlLHQsbik9PntwKHQpO2NvbnN0IHI9e25hbWU6IkF2ZXJhZ2VQb29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpuLmNhY2hlS2V5fTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT5zKHQsciwhMSxuKX0pLHQpXX0sdC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJjb3VudF9pbmNsdWRlX3BhZCIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIikscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKTtpZigwIT09bil0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQXZlcmFnZVBvb2wiKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDp0LGNlaWxNb2RlOm4sY291bnRJbmNsdWRlUGFkOm8sa2VybmVsU2hhcGU6aSxzdHJpZGVzOnMscGFkczphfSl9O2NvbnN0IHM9KGUsdCxuLHIpPT57Y29uc3RbcyxhXT11KGUscixuKSxsPW8uU2hhcGVVdGlsLnNpemUocy5rZXJuZWxTaGFwZSk7bGV0IGM9IiI7cy5jb3VudEluY2x1ZGVQYWQ/Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0pO2A6Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0gLSBwYWQpO2A7Y29uc3QgcD1gXG4gICAgICAgICR7ZChlWzBdLmRpbXMscywidmFsdWUgKz0gX1goeCk7IixjLCIwLjAiKX1cbiAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmEsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX07dC5nbG9iYWxBdmVyYWdlUG9vbD0oZSx0LG4pPT57cCh0KTtjb25zdCByPXtuYW1lOiJHbG9iYWxBdmVyYWdlUG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6YCR7bi5jb3VudEluY2x1ZGVQYWR9YH07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+cyh0LHIsITAsbil9KSx0KV19LHQucGFyc2VHbG9iYWxBdmVyYWdlUG9vbEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDoiIixjZWlsTW9kZTowLGNvdW50SW5jbHVkZVBhZDp0LGtlcm5lbFNoYXBlOltdLHN0cmlkZXM6W10scGFkczpbXX0pfSx0Lm1heFBvb2w9KGUsdCxuKT0+e3AodCk7Y29uc3Qgcj17bmFtZToiTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6bi5jYWNoZUtleX07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+YSh0LHIsITEsbil9KSx0KV19LHQucGFyc2VNYXhQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiKSxpPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJzdHJpZGVzIixbXSkscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygicGFkcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludCgic3RvcmFnZV9vcmRlciIsMCksdT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygiZGlsYXRpb25zIixbXSk7aWYoMCE9PWEpdGhyb3cgbmV3IEVycm9yKCJjb2x1bW4gbWFqb3Igc3RvcmFnZSBvcmRlciBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWF4UG9vbCIpO2lmKDAhPT1uKXRocm93IG5ldyBFcnJvcigidXNpbmcgY2VpbCgpIGluIHNoYXBlIGNvbXB1dGF0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBNYXhQb29sIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F1dG9QYWQ6dCxjZWlsTW9kZTpuLGNvdW50SW5jbHVkZVBhZDohMSxrZXJuZWxTaGFwZTpvLHN0cmlkZXM6aSxwYWRzOnMsc3RvcmFnZU9yZGVyOmEsZGlsYXRpb25zOnV9KX07Y29uc3QgYT0oZSx0LG4scik9Pntjb25zdFtvLHNdPXUoZSxyLG4pLGE9YFxuICAgICAgJHtkKGVbMF0uZGltcyxvLCJcbiAgICAgIHZhbHVlID0gbWF4KF9YKHgpLCB2YWx1ZSk7XG4gICAgIiwiIiwiLTFlNSIpfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOnMsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9KX0sdT0oZSx0LG4pPT57Y29uc3Qgcj1lWzBdLmRpbXMuc2xpY2UoKSxpPU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRpbGF0aW9ucyIpLHM9dC5rZXJuZWxTaGFwZS5zbGljZSgpLGE9dC5zdHJpZGVzLnNsaWNlKCksdT1pP3QuZGlsYXRpb25zLnNsaWNlKCk6W10sbD10LnBhZHMuc2xpY2UoKTtvLlBvb2xDb252VXRpbC5hZGp1c3RQb29sQXR0cmlidXRlcyhuLHIscyxhLHUsbCk7Y29uc3QgYz1vLlBvb2xDb252VXRpbC5jb21wdXRlUG9vbE91dHB1dFNoYXBlKG4scixhLHUscyxsLHQuYXV0b1BhZCkscD1PYmplY3QuYXNzaWduKHt9LHQpO3JldHVybiBpP09iamVjdC5hc3NpZ24ocCx7a2VybmVsU2hhcGU6cyxzdHJpZGVzOmEscGFkczpsLGRpbGF0aW9uczp1LGNhY2hlS2V5OnQuY2FjaGVLZXl9KTpPYmplY3QuYXNzaWduKHAse2tlcm5lbFNoYXBlOnMsc3RyaWRlczphLHBhZHM6bCxjYWNoZUtleTp0LmNhY2hlS2V5fSksW3AsY119LGw9e2F1dG9QYWQ6IiIsY2VpbE1vZGU6MCxjb3VudEluY2x1ZGVQYWQ6ITEsa2VybmVsU2hhcGU6W10sc3RyaWRlczpbXSxwYWRzOltdLHN0b3JhZ2VPcmRlcjowLGRpbGF0aW9uczpbXSxjYWNoZUtleToiIn0sYz17bmFtZToiR2xvYmFsTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5nbG9iYWxNYXhQb29sPShlLHQpPT4ocCh0KSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtnZXQ6KCk9PmEodCxjLCEwLGwpfSksdCldKTtjb25zdCBwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUG9vbCBvcHMgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4scixpKT0+e2NvbnN0IHM9ZS5sZW5ndGg7aWYodC5rZXJuZWxTaGFwZS5sZW5ndGg8PTIpe2NvbnN0IG89dC5rZXJuZWxTaGFwZVt0Lmtlcm5lbFNoYXBlLmxlbmd0aC0xXSxhPXQuc3RyaWRlc1t0LnN0cmlkZXMubGVuZ3RoLTFdLHU9dC5wYWRzW3QucGFkcy5sZW5ndGgvMi0xXSxsPXQucGFkc1t0LnBhZHMubGVuZ3RoLTFdLGM9ZVtzLTFdO2xldCBwPSIiLGQ9IiIsZj0iIjtpZihwPXUrbCE9PTA/YFxuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtvfTsgaSsrKSB7XG4gICAgICAgICAgICB4WyR7c30gLSAxXSA9IGluZGljZXNbJHtzfSAtIDFdICogJHthfSAtICR7dX0gKyBpO1xuICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDFdIDwgMCB8fCB4WyR7c30gLSAxXSA+PSAke2N9KSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7bn1cbiAgICAgICAgICB9YDpgXG4gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke299OyBpKyspIHtcbiAgICAgICAgICAgIHhbJHtzfSAtIDFdID0gaW5kaWNlc1ske3N9IC0gMV0gKiAke2F9IC0gJHt1fSArIGk7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWAsMj09PXQua2VybmVsU2hhcGUubGVuZ3RoKXtjb25zdCBuPXQua2VybmVsU2hhcGVbdC5rZXJuZWxTaGFwZS5sZW5ndGgtMl0scj10LnN0cmlkZXNbdC5zdHJpZGVzLmxlbmd0aC0yXSxpPXQucGFkc1t0LnBhZHMubGVuZ3RoLzItMl0sYT10LnBhZHNbdC5wYWRzLmxlbmd0aC0yXSx1PWVbcy0yXTtkPWkrYSE9PTA/YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDJdIDwgMCB8fCB4WyR7c30gLSAyXSA+PSAke3V9KSB7XG4gICAgICAgICAgICAgICAgcGFkKz0gJHtvfTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGA6YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgIGAsZj0iXG4gICAgICAgICAgfVxuICAgICAgICAiO31yZXR1cm4gYFxuICAgICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgICAgaW50IHhbJHtzfV07XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCB4KTtcblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHtpfTtcbiAgICAgICAgICBpbnQgcGFkID0gMDtcbiAgICAgICAgICAke2R9XG4gICAgICAgICAgJHtwfVxuICAgICAgICAgICR7Zn1cbiAgICAgICAgICAke3J9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfXtjb25zdCBhPW8uU2hhcGVVdGlsLnNpemUodC5rZXJuZWxTaGFwZSksdT1vLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0Lmtlcm5lbFNoYXBlKSxsPXUubGVuZ3RoLGM9dC5wYWRzLmxlbmd0aCxwPWgobCksZD1mKGUsImlucHV0RGltcyIpLGc9Zih0LnBhZHMsInBhZHMiKSxiPWYodSwia2VybmVsU3RyaWRlcyIpLG09Zih0LnN0cmlkZXMsInN0cmlkZXMiKTtsZXQgeT0iIjtyZXR1cm4geT10LnBhZHMucmVkdWNlKCgoZSx0KT0+ZSt0KSk/YFxuICAgICAgICAgICAgaWYgKHhbal0gPj0gaW5wdXREaW1zW2pdIHx8IHhbal0gPCAwKSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBpc1BhZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzUGFkKSB7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWA6YFxuICAgICAgICAgIH1cbiAgICAgICAgICAke259XG4gICAgICAgIGAsYFxuICAgICAgICAke3B9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtzfV0pIHtcbiAgICAgICAgICBpbnQgeFske3N9XTtcbiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIHgpO1xuICAgICAgICAgIGludCBvZmZzZXRbJHtsfV07XG4gICAgICAgICAgaW50IHBhZHNbJHtjfV07XG4gICAgICAgICAgaW50IGlucHV0RGltc1ske3N9XTtcbiAgICAgICAgICBpbnQga2VybmVsU3RyaWRlc1ske2x9XTtcbiAgICAgICAgICBpbnQgc3RyaWRlc1ske2x9XTtcbiAgICAgICAgICAke2d9XG4gICAgICAgICAgJHtkfVxuICAgICAgICAgICR7bX1cbiAgICAgICAgICAke2J9XG5cbiAgICAgICAgICBmbG9hdCB2YWx1ZSA9ICR7aX07XG4gICAgICAgICAgaW50IHBhZCA9IDA7XG4gICAgICAgICAgYm9vbCBpc1BhZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHthfTsgaSsrKSB7XG4gICAgICAgICAgICBvZmZzZXRUb0luZGljZXMoaSwga2VybmVsU3RyaWRlcywgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlzUGFkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGludCBqID0gJHtzfSAtICR7bH07IGogPCAke3N9OyBqKyspIHtcbiAgICAgICAgICAgICAgeFtqXSA9IGluZGljZXNbal0gKiBzdHJpZGVzW2ogLSAke3N9ICsgJHtsfV1cbiAgICAgICAgICAgICAgICArIG9mZnNldFtqIC0gJHtzfSArICR7bH1dIC0gcGFkc1tqIC0gMl07XG4gICAgICAgICAgICAgICR7eX1cbiAgICAgICAgICB9XG4gICAgICAgICAgJHtyfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfX0sZj0oZSx0KT0+e2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4rPWBcbiAgICAgICR7dH1bJHtyfV0gPSAke2Vbcl19O1xuICAgIGA7cmV0dXJuIG59LGg9ZT0+YFxuICB2b2lkIG9mZnNldFRvSW5kaWNlcyhpbnQgb2Zmc2V0LCBpbnRbJHtlfV0gc3RyaWRlcywgb3V0IGludFske2V9XSBpbmRpY2VzKSB7XG4gICAgaWYgKCR7ZX0gPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7ZX0gLSAxOyArK2kpIHtcbiAgICAgIGluZGljZXNbaV0gPSBvZmZzZXQgLyBzdHJpZGVzW2ldO1xuICAgICAgb2Zmc2V0IC09IGluZGljZXNbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBpbmRpY2VzWyR7ZX0gLSAxXSA9IG9mZnNldDtcbiAgfWA7fSwxMDEwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9dC5yZWR1Y2VMb2dTdW09dC5yZWR1Y2VQcm9kPXQucmVkdWNlTWluPXQucmVkdWNlTWF4PXQucmVkdWNlTWVhbj10LnJlZHVjZVN1bT10LnBhcnNlUmVkdWNlQXR0cmlidXRlcz12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9KGUsdCxuLHIsbyk9PntsKHQpO2NvbnN0IGk9e25hbWU6cixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT51KGUsdCxuLHIsbyxpKX0pLHQpXX07dC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiLFtdKSxuPTE9PT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJrZWVwZGltcyIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4ZXM6dCxrZWVwRGltczpufSl9O2NvbnN0IHU9KGUsdCxuLHIsbyxhKT0+e2NvbnN0IHU9W10sbD10WzBdLmRpbXMubGVuZ3RofHwxLGM9W10scD1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGVzKG4uYXhlcyx0WzBdLmRpbXMubGVuZ3RoKSxkPW8odCxwKTtsZXQgZj1kWzFdO2ZvcihsZXQgZT0wO2U8dFswXS5kaW1zLmxlbmd0aDtlKyspcC5pbmRleE9mKGUpPj0wfHwwPT09cC5sZW5ndGg/KG4ua2VlcERpbXMmJnUucHVzaCgxKSxmPWBcbiAgICAgICAgICBmb3IoaW50IGoke2V9ID0gMDsgaiR7ZX0gPCAke3RbMF0uZGltc1tlXX07IGoke2V9KyspIHtcbiAgICAgICAgICAgIGlucHV0SWR4WyR7ZX1dID0gaiR7ZX07XG4gICAgICAgICAgICAke2Z9XG4gICAgICAgICAgfWApOihjLnB1c2goYGlucHV0SWR4WyR7ZX1dID0gb3V0cHV0SWR4WyR7dS5sZW5ndGh9XTtgKSx1LnB1c2godFswXS5kaW1zW2VdKSk7Y29uc3QgaD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHt1Lmxlbmd0aHx8MX1dKSB7XG4gICAgICAgIGZsb2F0IHZhbHVlOyAgICAgICAgICAgICAgICAgLy8gZmluYWwgcmVzdWx0XG4gICAgICAgIGludCBpbnB1dElkeFske2x9XTsgICAgICAvLyBhZGRyZXNzaW5nIGlucHV0IGRhdGFcbiAgICAgICAgJHtjLmpvaW4oIlxuIil9XG4gICAgICAgICR7ZFswXX0gICAgICAgLy8gaW5pdCBvcHMgZm9yIHJlZHVjZSBtYXgvbWluXG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtkWzJdfSAgICAgICAvLyBmaW5hbCBjb21wdXRhdGlvbiBmb3IgcmVkdWNlIG1lYW5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7b3V0cHV0OntkaW1zOnUsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmh9KX0sbD1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlJlZHVjZSBvcCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKC0xPT09by5OVU1CRVJfVFlQRVMuaW5kZXhPZihlWzBdLnR5cGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt0LnJlZHVjZVN1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZU1lYW49KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTWVhbiIsKChlLHQpPT57bGV0IG49MTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJihuKj1lWzBdLmRpbXNbcl0pO3JldHVybiBbInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLGB2YWx1ZSAvPSAke259LjtgXX0pKSx0LnJlZHVjZU1heD0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VNYXgiLCgoZSx0KT0+e2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlWzBdLmRpbXMubGVuZ3RoO3IrKykodC5pbmRleE9mKHIpPj0wfHwwPT09dC5sZW5ndGgpJiZuLnB1c2goYGlucHV0SWR4WyR7cn1dID0gMDtgKTtyZXR1cm4gW2Ake24uam9pbigiXG4iKX1cbnZhbHVlID0gX0EoaW5wdXRJZHgpO2AsInZhbHVlID0gbWF4KHZhbHVlLCBfQShpbnB1dElkeCkpOyIsIiJdfSkpLHQucmVkdWNlTWluPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZU1pbiIsKChlLHQpPT57Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJm4ucHVzaChgaW5wdXRJZHhbJHtyfV0gPSAwO2ApO3JldHVybiBbYCR7bi5qb2luKCJcbiIpfVxudmFsdWUgPSBfQShpbnB1dElkeCk7YCwidmFsdWUgPSBtaW4odmFsdWUsIF9BKGlucHV0SWR4KSk7IiwiIl19KSksdC5yZWR1Y2VQcm9kPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZVByb2QiLCgoKT0+WyJ2YWx1ZSA9IDEuMDsiLCJ2YWx1ZSAqPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZUxvZ1N1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VMb2dTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwidmFsdWUgPSBsb2codmFsdWUpOyJdKSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTG9nU3VtU3F1YXJlIiwoKCk9PlsiZmxvYXQgdDsgdmFsdWUgPSAwLjA7IiwidCA9IF9BKGlucHV0SWR4KTsgdmFsdWUgKz0gdCAqIHQ7IiwiIl0pKTt9LDczNzk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmlzUmVzaGFwZUNoZWFwPXQucHJvY2Vzc0RpbXMzRD10LmNyZWF0ZVBhY2tlZFJlc2hhcGUzRFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oNTYxNCk7dC5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgYT0oZT0+KHtuYW1lOiJSZXNoYXBlIChwYWNrZWQpIixpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnBhY2tlZF0saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6YCR7ZX1gfSkpKG4pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQsbixhKT0+e2NvbnN0IHU9dC5kaW1zLGw9YTtsZXQgYz0iIjtmb3IobGV0IGU9MDtlPDQ7ZSsrKXtsZXQgdD0iIjtzd2l0Y2goZSl7Y2FzZSAwOnQ9Im91dHB1dENvb3JkcyA9IHJjOyI7YnJlYWs7Y2FzZSAxOnQ9Im91dHB1dENvb3JkcyA9IGl2ZWMzKHJjLngsIHJjLnkrMSwgcmMueik7IjticmVhaztjYXNlIDI6dD0ib3V0cHV0Q29vcmRzID0gaXZlYzMocmMueCwgcmMueSwgcmMueisxKTsiO2JyZWFrO2Nhc2UgMzp0PSJvdXRwdXRDb29yZHMgPSBpdmVjMyhyYy54LCByYy55KzEsIHJjLnorMSk7IjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcn1jKz1gXG4gICAgICAgICR7dH1cbiAgICAgICAgJHtlPjA/ImlmKG91dHB1dENvb3Jkcy55IDwgcm93cyAmJiBvdXRwdXRDb29yZHMueiA8IGNvbHMpeyI6IiJ9XG4gICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gZ2V0RmxhdHRlbmVkSW5kZXgob3V0cHV0Q29vcmRzKTtcblxuICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0dGVuZWRJbmRleCk7XG4gICAgICAgICAgdmVjMiBpbm5lckRpbXMgPSB2ZWMyKGZsb2F0KGlucHV0UkMueSksZmxvYXQoaW5wdXRSQy56KSk7XG5cbiAgICAgICAgICByZXN1bHRbJHtlfV0gPSBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlubmVyRGltcyk7XG5cbiAgICAgICAgJHtlPjA/In0iOiIifVxuICAgICAgYDt9Y29uc3QgcD0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICAke2Z1bmN0aW9uKGUpe2NvbnN0IHQ9ci5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMoZSksbj1bImIiLCJyIiwiYyJdLG89ImluZGV4IjtyZXR1cm4gYFxuICAgIGl2ZWMzIGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGludCBpbmRleCkge1xuICAgICAgJHt0Lm1hcCgoKGUscik9PmBpbnQgJHtuW3JdfSA9ICR7b30gLyAke2V9OyAke3I9PT10Lmxlbmd0aC0xP2BpbnQgJHtuW3IrMV19ID0gJHtvfSAtICR7bltyXX0gKiAke2V9YDpgaW5kZXggLT0gJHtuW3JdfSAqICR7ZX1gfTtgKSkuam9pbigiIil9XG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgfSh1KX1cbiAgICAgICR7ZnVuY3Rpb24oZSl7Y29uc3QgdD1yLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyhlKTtyZXR1cm4gYFxuICBpbnQgZ2V0RmxhdHRlbmVkSW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgLy8gcmV2ZXJzZSB5LCB6IG9yZGVyXG4gICAgcmV0dXJuIGNvb3Jkcy54ICogJHt0WzBdfSArIGNvb3Jkcy56ICogJHt0WzFdfSArIGNvb3Jkcy55O1xuICB9XG5gfShsKX1cbiAgICAgICR7KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcblxuICAgICAgICBpdmVjMyBvdXRwdXRDb29yZHM7XG4gICAgICAgIGludCByb3dzID0gJHtsWzJdfTtcbiAgICAgICAgaW50IGNvbHMgPSAke2xbMV19O1xuXG4gICAgICAgICR7Y31cbiAgICAgICAgJHtwLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOmQsaGFzTWFpbjohMH0pfSkoZSx0LGEsbil9KX0sdC5wcm9jZXNzRGltczNEPWZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gWzEsMSwxXTtsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGgtMjsrK24pdCo9ZVtuXTtyZXR1cm4gW3QsZS5sZW5ndGg+MT9lW2UubGVuZ3RoLTJdOjEsZVtlLmxlbmd0aC0xXV19LHQuaXNSZXNoYXBlQ2hlYXA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0hMTtyZXR1cm4gbj0wPT09ZS5sZW5ndGh8fDA9PT10Lmxlbmd0aHx8KGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDI/ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV06ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV0mJmVbZS5sZW5ndGgtMl09PT10W3QubGVuZ3RoLTJdKSxufTt9LDgxMjY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc2hhcGU9dm9pZCAwO2NvbnN0IHI9big3MjczKTt0LnJlc2hhcGU9KGUsdCk9Pntjb25zdCBuPXIuU2hhcGVVdGlsLmNhbGN1bGF0ZVJlc2hhcGVkRGltcyh0WzBdLmRpbXMsdFsxXS5pbnRlZ2VyRGF0YSk7cmV0dXJuIGUuc2Vzc2lvbi5wYWNrP1tlLnJlc2hhcGVQYWNrZWQodFswXSxuKV06W2UucmVzaGFwZVVucGFja2VkKHRbMF0sbildfTt9LDI4MDE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMT10LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD10LnJlc2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KSxpPW4oNDMyKSxzPW4oNTYxNCksYT1uKDM5ODApLHU9e25hbWU6IlJlc2l6ZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF19O3QucmVzaXplPShlLHQsbik9PigoMCwgYS52YWxpZGF0ZUlucHV0cykodCxuKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtjYWNoZUhpbnQ6bi5jYWNoZUtleSxnZXQ6KCk9PmwoZSx0LG4pfSksdCldKSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD1lPT4oMCwgYS5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcykoZSwxMCksdC5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTE9ZT0+KDAsIGEucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsMTEpO2NvbnN0IGw9KGUsdCxuKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFtsLHBdPWModCxuKTtpZihsLmV2ZXJ5KChlPT4xPT09ZSkpJiYidGZfY3JvcF9hbmRfcmVzaXplIiE9PW4uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGUpcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOnAsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzQgdiA9ICR7YS50ZXh0dXJlMkR9KFgsIFRleENvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICR7YS5vdXRwdXR9ID0gdjtcbiAgICAgICAgICAgICAgICB9YH0pO2NvbnN0IGQ9cC5sZW5ndGg7aWYoZDwyKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgYmUgYXQgbGVhc3QgMiwgYnV0IGdvdCAke2R9YCk7Y29uc3QgZj1wW2QtMl0saD1wW2QtMV0sZz10WzBdLmRpbXM7aWYoZCE9PWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgbWF0Y2ggaW5wdXQgJHtnLmxlbmd0aH0sIGJ1dCBnb3QgJHtkfWApO2NvbnN0IGI9Z1tkLTJdLG09Z1tkLTFdLHk9bFtkLTJdLHY9bFtkLTFdO2xldCBfPSIiO2lmKCJsaW5lYXIiIT09bi5tb2RlKXRocm93IG5ldyBFcnJvcihgcmVzaXplIChwYWNrZWQpIGRvZXMgbm90IHN1cHBvcnQgbW9kZTogJyR7bi5tb2RlfSdgKTtzd2l0Y2gobi5jb29yZGluYXRlVHJhbnNmb3JtTW9kZSl7Y2FzZSJhc3ltbWV0cmljIjpfPSJcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjNChjb29yZHMpIC8gc2NhbGVXSFdIO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIjticmVhaztjYXNlImhhbGZfcGl4ZWwiOl89IlxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodmVjNChjb29yZHMpICsgMC41KSAvIHNjYWxlV0hXSCAtIDAuNTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICI7YnJlYWs7Y2FzZSJweXRvcmNoX2hhbGZfcGl4ZWwiOl89YFxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgZmNvb3JkcyA9IHZlYzQoY29vcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aH0uMCA+IDEuMCA/IChmY29vcmRzLnggKyAwLjUpIC8gc2NhbGVXSFdILnggLSAwLjUgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wID4gMS4wID8gKGZjb29yZHMueSArIDAuNSkgLyBzY2FsZVdIV0gueSAtIDAuNSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2h9LjAgPiAxLjAgPyAoZmNvb3Jkcy56ICsgMC41KSAvIHNjYWxlV0hXSC56IC0gMC41IDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Zn0uMCA+IDEuMCA/IChmY29vcmRzLncgKyAwLjUpIC8gc2NhbGVXSFdILncgLSAwLjUgOiAwLjBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7Y2FzZSJhbGlnbl9jb3JuZXJzIjpfPWBcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IHJlc2l6ZWQgPSB2ZWM0KCR7aH0uMCAtIDEuMCwgJHtmfS4wIC0gMS4wLCAke2h9LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgb3JpZ2luYWwgPSB2ZWM0KCR7bX0uMCAtIDEuMCwgJHtifS4wIC0gMS4wLCAke219LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtifS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgbmV3X3NjYWxlID0gb3JpZ2luYWwgLyByZXNpemVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoY29vcmRzKSAqIG5ld19zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHJlc2l6ZSAocGFja2VkKSBkb2VzIG5vdCBzdXBwb3J0IGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcke24uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGV9J2ApfWNvbnN0IHc9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLFQ9YFxuICAgICAgICAgICAgY29uc3QgdmVjMiBpbnB1dFdIID0gdmVjMigke2J9LjAsICR7bX0uMCk7XG4gICAgICAgICAgICBjb25zdCB2ZWM0IHNjYWxlV0hXSCA9IHZlYzQoZmxvYXQoJHt5fSksIGZsb2F0KCR7dn0pLCBmbG9hdCgke3l9KSwgZmxvYXQoJHt2fSkpO1xuICAgICAgICAgICAgJHsoMCwgcy51bnBhY2tGcm9tQ2hhbm5lbCkoKX1cbiAgICAgICAgICAgICR7X31cbiAgICAgICAgICAgIGZsb2F0IGdldEFWYWx1ZShpbnQgeDEwLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QSh4MTAsIHIsIGMsIGQpLCB2ZWMyKGMsIGQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgICAke3d9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgICAgICBpbnQgYmF0Y2ggPSByY1swXTtcbiAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSByY1sxXTtcblxuICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSA0IGNvb3JkaW5hdGVzIHRoYXQgaXMgdXNlZCBpbiB0aGUgNCBwYWNrZWQgb3V0cHV0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpdmVjNCBjb29yZHMgPSBpdmVjNChyYy53eiwgcmMudyArIDEsIHJjLnogKyAxKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgc291cmNlIGluZGV4IGluIGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdmVjNCBzb3VyY2VGcmFjID0gZ2V0U291cmNlRnJhY0luZGV4KGNvb3Jkcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgNCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHBhY2tlZCBpbnRvIG9uZSB0ZXhlbC5cbiAgICAgICAgICAgICAgICBpdmVjNCB4MDAgPSBpdmVjNChtYXgoc291cmNlRnJhYy54eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MDEgPSBpdmVjNChtYXgoc291cmNlRnJhYy54dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54dykpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTAgPSBpdmVjNChtYXgoc291cmNlRnJhYy56eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTEgPSBpdmVjNChtYXgoc291cmNlRnJhYy56dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56dykpKTtcblxuICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IHJjLncgPCAke2YtMX07XG4gICAgICAgICAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gcmMueiA8ICR7aC0xfTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgdG9wLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BMZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLngsIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS54LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueCwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS54LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyB0b3AtcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BSaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC54LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueCwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLngsIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueCwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgYm90dG9tLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLnosIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS56LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueiwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS56LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyBib3R0b20tcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21SaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC56LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueiwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLnosIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueiwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGlvbiBmcmFjdGlvbiBvbiB1IGFuZCB2IGRpcmVjdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgZnJhYyA9IHZlYzQoc291cmNlRnJhYykgLSBmbG9vcihzb3VyY2VGcmFjKTtcbiAgICAgICAgICAgICAgICB2ZWM0IGNsYW1wRnJhYyA9IGNsYW1wKGZyYWMsIHZlYzQoMC4wKSwgdmVjNCgxLjApKTtcblxuICAgICAgICAgICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBjbGFtcEZyYWMueXd5dyk7XG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b20gPSBtaXgoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGNsYW1wRnJhYy55d3l3KTtcbiAgICAgICAgICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBjbGFtcEZyYWMueHh6eik7XG5cbiAgICAgICAgICAgICAgICAke2Eub3V0cHV0fSA9IHZlYzQobmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse291dHB1dDp7ZGltczpwLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpUfSl9LGM9KGUsdCk9Pntjb25zdCBuPWVbMF0uZGltcztsZXQgcixvPXQuc2NhbGVzO2lmKDA9PT1vLmxlbmd0aCl7Y29uc3QgaT1lW3Quc2NhbGVzSW5wdXRJZHhdO2lmKGkmJjAhPT1pLnNpemUpe2lmKGVbdC5zaXplc0lucHV0SWR4XSl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgb25lIG9mIHNjYWxlcyBvciBzaXplcyBtdXN0IGJlIHByb3ZpZGVkIGFzIGlucHV0LiIpO289cChpLHQubW9kZSx0LmlzUmVzaXplKTt9ZWxzZSB7Y29uc3QgaT1lW3Quc2l6ZXNJbnB1dElkeF07aWYoIWl8fDA9PT1pLnNpemUpdGhyb3cgbmV3IEVycm9yKCJFaXRoZXIgc2NhbGVzIG9yIHNpemVzIE1VU1QgYmUgcHJvdmlkZWQgYXMgaW5wdXQuIik7cj1BcnJheS5mcm9tKGkuaW50ZWdlckRhdGEpLG89ZChyLG4sdC5tb2RlLHQuaXNSZXNpemUpO319ZWxzZSBpZihlW3Quc2l6ZXNJbnB1dElkeF0pdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBvZiBzY2FsZXMgb3Igc2l6ZXMgbXVzdCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtjb25zdCBpPXJ8fG4ubWFwKCgoZSx0KT0+TWF0aC5mbG9vcihlKm9bdF0pKSk7cmV0dXJuIFtvLGldfSxwPShlLHQsbik9Pntjb25zdCByPUFycmF5LmZyb20oZS5mbG9hdERhdGEpO3JldHVybiAoMCwgYS5zY2FsZXNWYWxpZGF0aW9uKShyLHQsbikscn0sZD0oZSx0LG4scik9Pntjb25zdCBvPXQubGVuZ3RoLGk9bmV3IEFycmF5KG8pO2ZvcihsZXQgbj0wLHI9bztuPHI7bisrKWlmKDA9PT10W25dKXtpZigwIT09ZVtuXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGRpbSBpcyB6ZXJvIGJ1dCByZXF1aXJlZCBvdXRwdXQgZGltIGlzIG5vbi16ZXJvLiIpO2lbbl09MTt9ZWxzZSBpW25dPWVbbl0vdFtuXTtyZXR1cm4gKDAsIGEuc2NhbGVzVmFsaWRhdGlvbikoaSxuLHIpLGl9O30sNTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDkyNDApO3Quc2hhcGU9KGUsdCk9PihvKHQpLFtuZXcgci5UZW5zb3IoW3RbMF0uZGltcy5sZW5ndGhdLCJpbnQzMiIsdm9pZCAwLHZvaWQgMCxuZXcgSW50MzJBcnJheSh0WzBdLmRpbXMpKV0pO2NvbnN0IG89ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSByZXF1aXJlcyAxIGlucHV0LiIpfTt9LDI0NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNsaWNlVjEwPXQucGFyc2VTbGljZUF0dHJpYnV0ZXM9dC5zbGljZT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9e25hbWU6IlNsaWNlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNsaWNlPShlLHQsbik9PihsKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VTbGljZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoInN0YXJ0cyIpLG49ZS5hdHRyaWJ1dGVzLmdldEludHMoImVuZHMiKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIixbXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3N0YXJ0czp0LGVuZHM6bixheGVzOm99KX07Y29uc3QgdT0oZSx0LG4pPT57Y29uc3Qgcj0wPT09bi5heGVzLmxlbmd0aD90LmRpbXMuc2xpY2UoMCkubWFwKCgoZSx0KT0+dCkpOm4uYXhlcyxvPWkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4ZXMocix0LmRpbXMubGVuZ3RoKSx1PW4uc3RhcnRzLm1hcCgoKGUsbik9PmU+dC5kaW1zW29bbl1dLTE/dC5kaW1zW29bbl1dOmkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4aXMoZSx0LmRpbXNbb1tuXV0pKSksbD1uLmVuZHMubWFwKCgoZSxuKT0+ZT50LmRpbXNbb1tuXV0tMT90LmRpbXNbb1tuXV06aS5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhlLHQuZGltc1tvW25dXSkpKSxjPXQuZGltcy5zbGljZSgpLHA9W107Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspY1tvW2VdXT1sW2VdLXVbZV0sdVtlXT4wJiZwLnB1c2goYG91dHB1dElkeFske29bZV19XSArPSAke3VbZV19O2ApO2NvbnN0IGQ9YFxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgb3V0cHV0SWR4WyR7Yy5sZW5ndGh9XSkge1xuICAgICAgICAke3Auam9pbigiXG4gICAgICAiKX1cbiAgICAgICAgcmV0dXJuIF9BKG91dHB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtvdXRwdXQ6e2RpbXM6Yyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU2xpY2UgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07dC5zbGljZVYxMD0oZSx0KT0+e3AodCk7Y29uc3Qgbj1jKGUsdCk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSxbdFswXV0pXX07Y29uc3QgYz0oZSx0KT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzJdLmRhdGFJZCl8fHQubGVuZ3RoPj00JiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFszXS5kYXRhSWQpfHx0Lmxlbmd0aD49NSYmIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbNF0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgc2xpY2UgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtpZih0Lmxlbmd0aD49NSYmdFs0XS5pbnRlZ2VyRGF0YS5zb21lKChlPT4xIT09ZSkpKXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG5vbi0xIHN0ZXBzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNsaWNlIik7Y29uc3Qgbj1BcnJheS5mcm9tKHRbMV0uaW50ZWdlckRhdGEpLHI9QXJyYXkuZnJvbSh0WzJdLmludGVnZXJEYXRhKSxvPXQubGVuZ3RoPj00P0FycmF5LmZyb20odFszXS5pbnRlZ2VyRGF0YSk6W107cmV0dXJuIHtzdGFydHM6bixlbmRzOnIsYXhlczpvLGNhY2hlS2V5OmAke299OyR7bn07JHtyfWB9fSxwPWU9PntpZighZXx8ZS5sZW5ndGg8M3x8ZS5sZW5ndGg+NSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgbnVtYmVyLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGV8fDEhPT1lWzFdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzJdLnR5cGV8fDEhPT1lWzJdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj00JiYoImludDMyIiE9PWVbM10udHlwZXx8MSE9PWVbM10uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj01JiYoImludDMyIiE9PWVbNF0udHlwZXx8MSE9PWVbNF0uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDgxNTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc29mdG1heFYxMz10LnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTM9dC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzPXQuc29mdG1heD12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNjc1Nykscz1uKDU2MzkpLGE9big1NzA3KSx1PXtuYW1lOiJTb2Z0bWF4Q29tcHV0ZU1heCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkXX0sbD17bmFtZToiU29mdG1heENvbXB1dGVTY2FsZSIsaW5wdXROYW1lczpbIkEiLCJNYXgiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxjPXtuYW1lOiJTb2Z0TWF4IixpbnB1dE5hbWVzOlsiQSIsIk1heCIsIk5vcm0iXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQscy5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3Quc29mdG1heD0oZSx0LG4pPT57Zyh0KTtjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLGk9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsci5sZW5ndGgpLHM9by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKHIsaSksYT1vLlNoYXBlVXRpbC5zaXplRnJvbURpbWVuc2lvbihyLGkpO3JldHVybiBwKGUsdCxuLHMsYSl9LHQucGFyc2VTb2Z0bWF4QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDEpfSksdC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzVjEzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsLTEpfSksdC5zb2Z0bWF4VjEzPShlLHQsbik9PntnKHQpO2NvbnN0IGk9dFswXS5kaW1zLnNsaWNlKCkscz1vLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKG4uYXhpcyxpLmxlbmd0aCksdT1pLmxlbmd0aCxsPXMhPT11LTEsYz1bXTtsZXQgZCxmPVtdLGg9W107bCYmKGY9QXJyYXkuZnJvbSh7bGVuZ3RoOnV9KS5tYXAoKChlLHQpPT50KSksZltzXT11LTEsZlt1LTFdPXMsZi5tYXAoKGU9PmMucHVzaChpW2VdKSkpLGQ9KDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7cGVybTpmfSksaD0oMCwgYS50cmFuc3Bvc2UpKGUsdCxkKSk7Y29uc3QgYj1sP28uU2hhcGVVdGlsLnNpemVUb0RpbWVuc2lvbihjLHUtMSk6by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKGksdS0xKSxtPWw/by5TaGFwZVV0aWwuc2l6ZUZyb21EaW1lbnNpb24oYyx1LTEpOm8uU2hhcGVVdGlsLnNpemVGcm9tRGltZW5zaW9uKGksdS0xKSx5PXAoZSxsP2g6dCxuLGIsbSk7cmV0dXJuIGw/KDAsIGEudHJhbnNwb3NlKShlLHksZCk6eX07Y29uc3QgcD0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZChlLHRbMF0scixvLFtyXSkscz1lLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+aX0pLHQpLGE9ZihlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsW3JdKSxwPWUucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hfSksW3RbMF0sc10pLGc9aChlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsYS5vdXRwdXQuZGltcyk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+Z30pLFt0WzBdLHMscF0pXX0sZD0oZSx0LG4scixvKT0+e2NvbnN0W2EsbF09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGM9by5sZW5ndGg7aWYobjwxfHxyPDEpdGhyb3cgbmV3IEVycm9yKCJMb2dpY2FsIHJvdyBjb3VudCBOIGFuZCBmZWF0dXJlIGNvdW50IEQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpO2lmKDEhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7Y29uc3QgcD0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludFske2N9XSBpbmRpY2VzKSB7XG4gICAgICAgIGludCBsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgPSBpbmRpY2VzWzBdICogJHtyfTtcblxuICAgICAgICBmbG9hdCBtYXggPSBnZXRDb2xvckFzRmxvYXQoJHtwLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0LCAke2F9LFxuICAgICAgICAke2x9ICkpKTtcbiAgICAgICAgZm9yKGludCBpPTE7IGk8JHtyfTsgKytpKVxuICAgICAgICB7XG4gICAgICAgICAgZmxvYXQgY3VycmVudCA9IGdldENvbG9yQXNGbG9hdCgke3AudGV4dHVyZTJEfShBLCBvZmZzZXRUb0Nvb3Jkcyhsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgKyBpLFxuICAgICAgICAgICAgJHthfSwgJHtsfSkpKTtcbiAgICAgICAgICBpZihjdXJyZW50ID4gbWF4KVxuICAgICAgICAgIG1heCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0sZj0oZSx0LG4scixvLGEpPT57Y29uc3RbdSxjXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCkscD1hLmxlbmd0aDtpZihuPDF8fHI8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYoMSE9PWEubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uYWxpdHkgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgMSIpO2lmKGFbMF0hPT1uKXRocm93IG5ldyBFcnJvcigiU2hhcGUgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtpZigxIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBkPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7cH1dIGluZGljZXMpIHtcbiAgICAgICAgaW50IGxvZ2ljYWxfcm93X3N0YXJ0X29mZnNldCA9IGluZGljZXNbMF0gKiAke3J9O1xuXG4gICAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gMC4wO1xuICAgICAgICBmbG9hdCBtYXggPSBfTWF4KGluZGljZXMpO1xuICAgICAgICBmb3IoaW50IGk9MDsgaTwke3J9OyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICBub3JtX2ZhY3RvciArPSBleHAoZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSxcbiAgICAgICAgICAgICR7dX0sICR7Y30pKSkgLSBtYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1fZmFjdG9yO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7b3V0cHV0OntkaW1zOmEsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0saD0oZSx0LG4scixvLGkpPT57Y29uc3RbYSx1XT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCksbD10LmRpbXMubGVuZ3RoO2lmKG48MXx8cjwxKXRocm93IG5ldyBFcnJvcigiTG9naWNhbCByb3cgY291bnQgTiBhbmQgZmVhdHVyZSBjb3VudCBEIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTtpZigxIT09by5sZW5ndGh8fDEhPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgMSIpO2lmKG9bMF0hPT1ufHxpWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBwPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7bH1dIGluZGljZXMpIHtcblxuICAgICAgLy8gZ2V0IG9mZnNldCBvZiBjdXJyZW50IGxvZ2ljYWwgdGVuc29yIGluZGV4IGZyb20gdGhlIDItRCB0ZXh0dXJlIGNvb3JkaW5hdGVzIChUZXhDb29yZHMpXG4gICAgICBpbnQgb2Zmc2V0ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2F9LCAke3V9KTtcblxuICAgICAgLy9kZXRlcm1pbmUgdGhlIGxvZ2ljYWwgcm93IGZvciB0aGlzIGluZGV4XG4gICAgICBpbnQgbG9naWNhbF9yb3dfaW5kZXhbMV07XG4gICAgICBsb2dpY2FsX3Jvd19pbmRleFswXSA9IG9mZnNldCAvICR7cn07XG5cbiAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gX05vcm0obG9naWNhbF9yb3dfaW5kZXgpO1xuXG4gICAgICAvLyBhdm9pZCBwb3NzaWJsZSBkaXZpc2lvbiBieSAwXG4gICAgICAvLyBpZiBub3JtX2ZhY29yIGlzIDAsIGFsbCBlbGVtZW50cyBhcmUgemVyb1xuICAgICAgLy8gaWYgc28sIHJldHVybiAwXG4gICAgICBpZihub3JtX2ZhY3RvciA9PSAwLjApXG4gICAgICAgIHJldHVybiAwLjA7XG5cbiAgICAgIHJldHVybiBleHAoX0EoaW5kaWNlcykgLSBfTWF4KGxvZ2ljYWxfcm93X2luZGV4KSkgLyBub3JtX2ZhY3RvcjtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOnMuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpwfSl9LGc9ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTb2Z0bWF4IHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUiKX07fSw1NjQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3BsaXRBdHRyaWJ1dGVzPXQuc3BsaXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlNwbGl0IixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNwbGl0PShlLHQsbik9PntsKHQpO2NvbnN0IHI9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsdFswXS5kaW1zLmxlbmd0aCksaT1hKGUsdCxyLG4pLGM9W107Zm9yKGxldCBvPTA7bzxpOysrbyljLnB1c2goZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6YCR7bi5jYWNoZUtleX07JHtvfWAsZ2V0OigpPT51KGUsdFswXSxuLHIsbyl9KSx0KSk7cmV0dXJuIGN9LHQucGFyc2VTcGxpdEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsMCksbj1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3BsaXQiLFtdKSxvPWUub3V0cHV0cy5sZW5ndGg7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6dCxzcGxpdDpuLG51bU91dHB1dHM6b30pfTtjb25zdCBhPShlLHQsbixyKT0+e2NvbnN0WyxpXT1vLlNwbGl0VXRpbC5zcGxpdFNoYXBlKHRbMF0uZGltcyxuLHIuc3BsaXQsci5udW1PdXRwdXRzKTtyZXR1cm4gaS5sZW5ndGh9LHU9KGUsdCxuLHIsYSk9Pntjb25zdFt1LGxdPW8uU3BsaXRVdGlsLnNwbGl0U2hhcGUodC5kaW1zLHIsbi5zcGxpdCxuLm51bU91dHB1dHMpLGM9bFthXSxwPXVbYV0sZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cC5sZW5ndGh9XSkge1xuICAgICAgICBpbmRpY2VzWyR7cn1dICs9ICR7Y307XG4gICAgICAgIHJldHVybiBfQShpbmRpY2VzKTtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2NhY2hlSGludDpgJHtuLmNhY2hlS2V5fToke2F9YCxvdXRwdXQ6e2RpbXM6cCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BsaXQgcmVxdWlyZXMgb25lIGlucHV0LiIpO2lmKCJpbnQ4IiE9PWVbMF0udHlwZSYmInVpbnQ4IiE9PWVbMF0udHlwZSYmImludDE2IiE9PWVbMF0udHlwZSYmInVpbnQxNiIhPT1lWzBdLnR5cGUmJiJpbnQzMiIhPT1lWzBdLnR5cGUmJiJ1aW50MzIiIT09ZVswXS50eXBlJiYiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSYmImJvb2wiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDU0MTY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXM9dC5zcXVlZXplVjEzPXQuc3F1ZWV6ZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3Quc3F1ZWV6ZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPXIuU2hhcGVVdGlsLnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC5zcXVlZXplVjEzPShlLG4pPT4oaShuKSwoMCwgdC5zcXVlZXplKShlLFtuWzBdXSxBcnJheS5mcm9tKG5bMV0uaW50ZWdlckRhdGEpKSksdC5wYXJzZVNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigic3RyaW5nIj09PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfSxpPWU9PntpZighZXx8MiE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3F1ZWV6ZSByZXF1aXJlcyAyIGlucHV0cy4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDEyNDA6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnN1bT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LnN1bT0oZSx0KT0+e3ModCk7Y29uc3Qgbj17bmFtZToiU3VtIixpbnB1dE5hbWVzOnQubWFwKCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG8uVGV4dHVyZVR5cGUudW5wYWNrZWQpfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3QgaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz10WzBdLmRpbXMuc2xpY2UoKSxhPWBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSAke3QubWFwKCgoZSx0KT0+YCR7aS50ZXh0dXJlMkR9KFgke3R9LFRleENvb3JkcylgKSkuam9pbigiICsgIil9O1xuICAgICAgICAke2kub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpzLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmF9KX0scz1lPT57aWYoIWV8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlN1bSByZXF1aXJlcyBpbnB1dHMuIik7Y29uc3QgdD1lWzBdLmRpbXMubGVuZ3RoO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtpZih0IT09ZVtuXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtmb3IobGV0IHI9MDtyPHQ7cisrKWlmKGVbMF0uZGltc1tyXSE9PWVbbl0uZGltc1tyXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbm90IG1hdGNoZWQuIil9aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDt0KyspaWYoZVswXS50eXBlIT09ZVt0XS50eXBlKXRocm93IG5ldyBFcnJvcigiSW5wdXQgdHlwZXMgYXJlIG5vdCBtYXRjaGVkLiIpfTt9LDU5NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRpbGU9dm9pZCAwO2NvbnN0IHI9big2MTQ1KSxvPW4oNTYzOSk7dC50aWxlPShlLHQpPT57cyh0KTtjb25zdCBuPXtuYW1lOiJUaWxlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3Qgcj10WzBdLmRpbXMuc2xpY2UoKSxpPW5ldyBBcnJheShyLmxlbmd0aCkscz1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpW2VdPXJbZV0qdFsxXS5udW1iZXJEYXRhW2VdLHMucHVzaChgaW5wdXRJZHhbJHtlfV0gPSBpbnQobW9kKGZsb2F0KG91dHB1dElkeFske2V9XSksICR7cltlXX0uKSk7YCk7Y29uc3QgYT1pLmxlbmd0aCx1PWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske2F9XSkge1xuICAgICAgICBpbnQgaW5wdXRJZHhbJHthfV07XG4gICAgICAgICR7cy5qb2luKCJcbiIpfVxuICAgICAgICByZXR1cm4gX0EoaW5wdXRJZHgpO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOmksdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnV9KX0scz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRpbGUgcmVxdWlyZXMgMiBpbnB1dC4iKTtpZigxIT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzZWNvbmQgaW5wdXQgc2hhcGUgbXVzdCAxIGRpbWVuc2lvbi4iKTtpZihlWzFdLmRpbXNbMF0hPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigtMT09PXIuTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlJiYiaW50MTYiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZXBlYXQgdHlwZS4iKX07fSw1NzA3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVRyYW5zcG9zZUF0dHJpYnV0ZXM9dC50cmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlRyYW5zcG9zZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC50cmFuc3Bvc2U9KGUsdCxuKT0+KHAodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdFswXSxuLnBlcm0pfSksdCldKSx0LnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtwZXJtOmUuYXR0cmlidXRlcy5nZXRJbnRzKCJwZXJtIixbXSl9KTtjb25zdCBhPShlLHQsbik9Pntjb25zdCByPXQuZGltcztuPXUocixuKTtjb25zdCBvPWwocixuKSxhPXIubGVuZ3RoLHA9YFxuICAgICAgJHtjKCJwZXJtIixuLGEpfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2F9XSkge1xuICAgICAgICBpbnQgYVske2F9XTtcbiAgICAgICAgcGVybShhLCBpbmRpY2VzKTtcbiAgICAgICAgcmV0dXJuIF9BKGEpO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX0sdT0oZSx0KT0+KHQmJnQubGVuZ3RoIT09ZS5sZW5ndGgmJih0PVsuLi5lLmtleXMoKV0ucmV2ZXJzZSgpKSx0KSxsPShlLHQpPT4odD11KGUsdCksby5TaGFwZVV0aWwuc29ydEJhc2VkT25QZXJtKGUsdCkpLGM9KGUsdCxuKT0+e2NvbnN0IHI9W107ci5wdXNoKGB2b2lkICR7ZX0ob3V0IGludCBhWyR7bn1dLCBpbnQgc3JjWyR7bn1dKSB7YCk7Zm9yKGxldCBlPTA7ZTxuOysrZSlyLnB1c2goYFx0YVske3RbZV19XT1zcmNbJHtlfV07YCk7cmV0dXJuIHIucHVzaCgiXHR9Iiksci5qb2luKCJcbiIpfSxwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVHJhbnNwb3NlIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaG91bGQgYmUgZmxvYXQgdGVuc29yIil9O30sMjQ4ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZW5jb2RlQXNVaW50OD12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LmVuY29kZUFzVWludDg9KGUsdCk9Pntjb25zdCBuPXQuc2hhcGUsaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz1gXG4gICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODtcbiAgICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcblxuICAgIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7XG4gICAgICByZXR1cm4gKHZhbCA8IDEuMCB8fCAwLjAgPCB2YWwgfHwgdmFsID09IDAuMCkgPyBmYWxzZSA6IHRydWU7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBlbmNvZGVBc1VpbnQ4KGhpZ2hwIGZsb2F0IHYpIHtcbiAgICAgIGlmIChpc05hTih2KSkge1xuICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpO1xuICAgICAgfVxuXG4gICAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgICAgaWYoYXYgPCBGTE9BVF9NSU4pIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAxMjguMCwgMTI3LjApIC8gMjU1LjA7XG4gICAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgICB9XG5cbiAgICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgICBoaWdocCBmbG9hdCBtID0gZXhwMihmcmFjdChsb2cyKGF2KSkpIC0gMS4wO1xuXG4gICAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgICAgY1sxXSA9IGZsb29yKDMyNzY4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7XG4gICAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xuICAgICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcbiAgICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wO1xuXG4gICAgICBjWzNdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAgICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgICB9XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBmbG9hdCB2YWx1ZSA9ICR7aS50ZXh0dXJlMkR9KFgsVGV4Q29vcmRzKS5yO1xuICAgICAgJHtpLm91dHB1dH0gPSBlbmNvZGVBc1VpbnQ4KHZhbHVlKTtcbiAgICB9YCxhPXtuYW1lOiJVaW50OEVuY29kZSIsaW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS51bnBhY2tlZF0saW5wdXROYW1lczpbIlgiXSxvdXRwdXQ6e2RpbXM6bix0eXBlOnQudGVuc29yLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5kb3dubG9hZFVpbnQ4QXNGbG9hdH0sc2hhZGVyU291cmNlOnMsaGFzTWFpbjohMH07cmV0dXJuIGUuZXhlY3V0ZVByb2dyYW0oYSxbdC50ZW5zb3JdKX07fSw5MDg3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50YW5oPXQudGFuPXQuc3FydD10LnNpbj10LnNpZ21vaWQ9dC5yZWx1PXQubm90PXQubmVnPXQubG9nPXQucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzPXQubGVha3lSZWx1PXQuaWRlbnRpdHk9dC5mbG9vcj10LmV4cD10LnBhcnNlRWx1QXR0cmlidXRlcz10LmVsdT10LmNvcz10LmNlaWw9dC5jbGlwVjExPXQucGFyc2VDbGlwQXR0cmlidXRlcz10LmNsaXA9dC5hdGFuPXQuYXNpbj10LmFjb3M9dC5hYnM9dC5nbHNsVGFuaD10Lmdsc2xUYW49dC5nbHNsU3FydD10Lmdsc2xTaWdtb2lkPXQuZ2xzbFJlbHU9dC5nbHNsU2luPXQuZ2xzbE5vdD10Lmdsc2xOZWc9dC5nbHNsTG9nPXQuZ2xzbExlYWt5UmVsdT10Lmdsc2xJZGVudGl0eT10Lmdsc2xDbGlwPXQuZ2xzbEZsb29yPXQuZ2xzbEV4cD10Lmdsc2xFbHU9dC5nbHNsQ29zPXQuZ2xzbENlaWw9dC5nbHNsQXRhbj10Lmdsc2xBc2luPXQuZ2xzbEFjb3M9dC5nbHNsQWJzPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9bigxOTk3KSxzPW4oNjc1NyksYT1uKDU2MzkpO2Z1bmN0aW9uIHUoKXtyZXR1cm4gRSgiYWJzIil9ZnVuY3Rpb24gbCgpe3JldHVybiBFKCJhY29zIil9ZnVuY3Rpb24gYygpe3JldHVybiBFKCJhc2luIil9ZnVuY3Rpb24gcCgpe3JldHVybiBFKCJhdGFuIil9ZnVuY3Rpb24gZCgpe3JldHVybiBFKCJjZWlsIil9ZnVuY3Rpb24gZigpe3JldHVybiBFKCJjb3MiKX1mdW5jdGlvbiBoKGUpe2NvbnN0IHQ9ImVsdSI7cmV0dXJuIHtib2R5OmBcbiAgY29uc3QgZmxvYXQgYWxwaGEgPSBmbG9hdCgke2V9KTtcblxuICBmbG9hdCAke3R9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGEgPj0gMC4wID8gYTogKGV4cChhKSAtIDEuMCkgKiBhbHBoYTtcbiAgfVxuICB2ZWM0ICR7dH1fKHZlYzQgdikge1xuICAgIHJldHVybiB2ZWM0KCR7dH1fKHYueCksICR7dH1fKHYueSksICR7dH1fKHYueiksICR7dH1fKHYudykpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gZygpe3JldHVybiBFKCJleHAiKX1mdW5jdGlvbiBiKCl7cmV0dXJuIEUoImZsb29yIil9ZnVuY3Rpb24gbShlLHQpe2NvbnN0IG49ImNsaXAiO3JldHVybiB7Ym9keTpgXG4gIGNvbnN0IGZsb2F0IG1pbiA9IGZsb2F0KCR7ZX0pO1xuICBjb25zdCBmbG9hdCBtYXggPSBmbG9hdCgke3R9KTtcblxuICBmbG9hdCAke259XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGNsYW1wKGEsIG1pbiwgbWF4KTtcbiAgfVxuICB2ZWM0ICR7bn1fKHZlYzQgdikge1xuICAgIHJldHVybiBjbGFtcCh2LCBtaW4sIG1heCk7XG4gIH1cbiAgYCxuYW1lOm4sdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0iaW5kZW50aXR5IjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGE7XG4gIH1cbiAgdmVjNCAke2V9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHYoZSl7Y29uc3QgdD0ibGVha3lSZWx1IjtyZXR1cm4ge2JvZHk6YFxuICBjb25zdCBmbG9hdCBhbHBoYSA9IGZsb2F0KCR7ZX0pO1xuXG4gIGZsb2F0ICR7dH1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBhbHBoYSA6IGE7XG4gIH1cbiAgdmVjNCAke3R9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdmVjNCgke3R9Xyh2LngpLCAke3R9Xyh2LnkpLCAke3R9Xyh2LnopLCAke3R9Xyh2LncpKTtcbiAgfVxuICBgLG5hbWU6dCx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIF8oKXtyZXR1cm4gRSgibG9nIil9ZnVuY3Rpb24gdygpe2NvbnN0IGU9Im5lZyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAtYTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiAtdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIFQoKXtjb25zdCBlPSJub3QiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gZmxvYXQoICEgYm9vbChhKSApO1xuICB9XG4gIGJvb2wgJHtlfV8oYm9vbCBhKSB7XG4gICAgcmV0dXJuICFhO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIHZlYzQoIWJvb2wodi54KSwgIWJvb2wodi55KSwgIWJvb2wodi56KSwgIWJvb2wodi53KSk7XG4gIH1cbiAgYnZlYzQgJHtlfV8oYnZlYzQgdikge1xuICAgIHJldHVybiBidmVjNCghdi54LCAhdi55LCAhdi56LCAhdi53KTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHgoKXtyZXR1cm4gRSgic2luIil9ZnVuY3Rpb24gTygpe2NvbnN0IGU9InJlbHUiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gbWF4KCBhLCAwLjAgKTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiBtYXgoIHYsIDAuMCApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gUygpe2NvbnN0IGU9InNpZ21vaWQiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtYSkpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLXYpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEEoKXtyZXR1cm4gRSgic3FydCIpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gRSgidGFuIil9ZnVuY3Rpb24gSSgpe2NvbnN0IGU9InRhbmgiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICBhID0gY2xhbXAoYSwgLTEwLiwgMTAuKTtcbiAgICBhID0gZXhwKDIuKmEpO1xuICAgIHJldHVybiAoYSAtIDEuKSAvIChhICsgMS4pO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgdiA9IGNsYW1wKHYsIC0xMC4sIDEwLik7XG4gICAgdiA9IGV4cCgyLip2KTtcbiAgICByZXR1cm4gKHYgLSAxLikgLyAodiArIDEuKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEUoZSl7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAke2V9KGEpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuICR7ZX0odik7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBYnM9dSx0Lmdsc2xBY29zPWwsdC5nbHNsQXNpbj1jLHQuZ2xzbEF0YW49cCx0Lmdsc2xDZWlsPWQsdC5nbHNsQ29zPWYsdC5nbHNsRWx1PWgsdC5nbHNsRXhwPWcsdC5nbHNsRmxvb3I9Yix0Lmdsc2xDbGlwPW0sdC5nbHNsSWRlbnRpdHk9eSx0Lmdsc2xMZWFreVJlbHU9dix0Lmdsc2xMb2c9Xyx0Lmdsc2xOZWc9dyx0Lmdsc2xOb3Q9VCx0Lmdsc2xTaW49eCx0Lmdsc2xSZWx1PU8sdC5nbHNsU2lnbW9pZD1TLHQuZ2xzbFNxcnQ9QSx0Lmdsc2xUYW49UCx0Lmdsc2xUYW5oPUk7Y29uc3QgRD0oZSx0LG4scik9Pntjb25zdCBvPWUuc2Vzc2lvbi5wYWNrP2EuVGV4dHVyZVR5cGUucGFja2VkOmEuVGV4dHVyZVR5cGUudW5wYWNrZWQsaT17bmFtZTpuLm5hbWUsaW5wdXRUeXBlczpbb10saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6cn07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3Qgbz1lLnNlc3Npb24ucGFjaz9hLlRleHR1cmVUeXBlLnBhY2tlZDphLlRleHR1cmVUeXBlLnVucGFja2VkLGk9KDAsIHMuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpuLmRpbXMsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6b30sc2hhZGVyU291cmNlOmBcbiAgICAgJHtyLmJvZHl9XG4gICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICB2ZWM0IHYgPSAke2kudGV4dHVyZTJEfShBLCBUZXhDb29yZHMpO1xuICAgICAgIHYgPSAke3IubmFtZX1fKHYpO1xuICAgICAgICR7aS5vdXRwdXR9ID0gdjtcbiAgICAgfVxuICAgICBgLGhhc01haW46ITB9KX0pKGUsaSx0LG4pfSl9O3QuYWJzPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sdSgpKSx0KV0sdC5hY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sbCgpKSx0KV0sdC5hc2luPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYygpKSx0KV0sdC5hdGFuPShlLHQpPT5bZS5ydW4oRChlLHRbMF0scCgpKSx0KV0sdC5jbGlwPShlLHQsbik9PltlLnJ1bihEKGUsdFswXSxtKG4ubWluLG4ubWF4KSxuLmNhY2hlS2V5KSx0KV0sdC5wYXJzZUNsaXBBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1pbiIsby5NSU5fQ0xJUCksbWF4OmUuYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4IixvLk1BWF9DTElQKX0pLHQuY2xpcFYxMT0oZSxuKT0+e2NvbnN0IHI9JChlLG4pO3JldHVybiAoMCwgdC5jbGlwKShlLFtuWzBdXSxyKX07Y29uc3QgJD0oZSx0KT0+e2lmKHQubGVuZ3RoPj0zJiYoIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMV0uZGF0YUlkKXx8IWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKSkpdGhyb3cgbmV3IEVycm9yKCJkeW5hbWljIGNsaXAgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBuPXQubGVuZ3RoPj0zP3RbMV0ubnVtYmVyRGF0YVswXTpvLk1JTl9DTElQLGk9dC5sZW5ndGg+PTM/dFsyXS5udW1iZXJEYXRhWzBdOm8uTUFYX0NMSVA7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjpuLG1heDppfSl9O3QuY2VpbD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLGQoKSksdCldLHQuY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sZigpKSx0KV0sdC5lbHU9KGUsdCxuKT0+W2UucnVuKEQoZSx0WzBdLGgobi5hbHBoYSksbi5jYWNoZUtleSksdCldLHQucGFyc2VFbHVBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2FscGhhOmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYWxwaGEiLDEpfSksdC5leHA9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxnKCkpLHQpXSx0LmZsb29yPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYigpKSx0KV0sdC5pZGVudGl0eT0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHkoKSksdCldLHQubGVha3lSZWx1PShlLHQsbik9PltlLnJ1bihEKGUsdFswXSx2KG4uYWxwaGEpLG4uY2FjaGVLZXkpLHQpXSx0LnBhcnNlTGVha3lSZWx1QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwuMDEpfSksdC5sb2c9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxfKCkpLHQpXSx0Lm5lZz0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHcoKSksdCldLHQubm90PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sVCgpKSx0KV0sdC5yZWx1PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sTygpKSx0KV0sdC5zaWdtb2lkPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sUygpKSx0KV0sdC5zaW49KGUsdCk9PltlLnJ1bihEKGUsdFswXSx4KCkpLHQpXSx0LnNxcnQ9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxBKCkpLHQpXSx0LnRhbj0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLFAoKSksdCldLHQudGFuaD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLEkoKSksdCldO30sNTQwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mb0xvYWRlcj10LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJ1bnBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS5wYWNrZWRdfTt0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPShlLHQpPT57Y29uc3Qgbj10LmRpbXMubGVuZ3RoLHU9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJyYyIsbiksbD11LnNsaWNlKC0yKSxjPSgwLCBpLmdldENvb3Jkc0RhdGFUeXBlKShuKSxwPSgwLCBzLnVucGFja0Zyb21DaGFubmVsKSgpLGQ9MD09PXQuZGltcy5sZW5ndGg/IiI6ZnVuY3Rpb24oZSx0KXtpZigxPT09ZSlyZXR1cm4gInJjIjtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPGU7cisrKW4rPXRbcl0scjxlLTEmJihuKz0iLCIpO3JldHVybiBufShuLHUpLGY9bjw9MT8icmMiOmB2ZWMyKCR7bC5qb2luKCIsIil9KWAsaD1gXG4gICAgJHtwfVxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7Y30gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgIC8vIFNhbXBsZSB0aGUgdGV4dHVyZSB3aXRoIHRoZSBjb29yZHMgdG8gZ2V0IHRoZSByZ2JhIGNoYW5uZWwgdmFsdWUuXG4gICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHtkfSk7XG5cbiAgICAgICAkeygwLCByLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmVjNChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Z9KSwgMCwgMCwgMCk7XG4gICAgIH1cbiAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aGFzTWFpbjohMCxvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpofSl9LHQuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbik9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Z2V0OigpPT4oMCwgdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mbykoZSxuKX0pO30sNzg2MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPXQudW5zcXVlZXplVjEzPXQudW5zcXVlZXplPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC51bnNxdWVlemU9KGUsdCxuKT0+e28odCk7Y29uc3QgaT1yLlNoYXBlVXRpbC51bnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC51bnNxdWVlemVWMTM9KGUsbik9PihpKG4pLCgwLCB0LnVuc3F1ZWV6ZSkoZSxbblswXV0sQXJyYXkuZnJvbShuWzFdLmludGVnZXJEYXRhKSkpLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlVuc3F1ZWV6ZSByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgdHlwZXMuIil9LGk9ZT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbnNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoImludDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07fSwzOTgwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zY2FsZXNWYWxpZGF0aW9uPXQudmFsaWRhdGVJbnB1dHM9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcz10LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjk9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y3PXQudXBzYW1wbGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9e25hbWU6IlVwc2FtcGxlIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnVwc2FtcGxlPShlLG4scik9PigoMCwgdC52YWxpZGF0ZUlucHV0cykobixyKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6ci5jYWNoZUtleSxnZXQ6KCk9PmEoZSxuLHIpfSksbildKSx0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjc9ZT0+KDAsIHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsNyksdC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y5PWU9PigwLCB0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShlLDkpLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXM9KGUsbik9Pntjb25zdCBvPW4+PTEwLGk9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIm5lYXJlc3QiKTtpZigibmVhcmVzdCIhPT1pJiYibGluZWFyIiE9PWkmJihuPDExfHwiY3ViaWMiIT09aSkpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtpfWApO2xldCBzPVtdO248OSYmKHM9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0cygic2NhbGVzIiksKDAsIHQuc2NhbGVzVmFsaWRhdGlvbikocyxpLG8pKTtjb25zdCBhPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXh0cmFwb2xhdGlvbl92YWx1ZSIsMCksdT1uPjEwP2UuYXR0cmlidXRlcy5nZXRTdHJpbmcoImNvb3JkaW5hdGVfdHJhbnNmb3JtYXRpb25fbW9kZSIsImhhbGZfcGl4ZWwiKToiYXN5bW1ldHJpYyI7aWYoLTE9PT1bImFzeW1tZXRyaWMiLCJweXRvcmNoX2hhbGZfcGl4ZWwiLCJ0Zl9oYWxmX3BpeGVsX2Zvcl9ubiIsImFsaWduX2Nvcm5lcnMiLCJ0Zl9jcm9wX2FuZF9yZXNpemUiLCJoYWxmX3BpeGVsIl0uaW5kZXhPZih1KSl0aHJvdyBuZXcgRXJyb3IoYGNvb3JkaW5hdGVfdHJhbnNmb3JtX21vZGUgJyR7dX0nIGlzIG5vdCBzdXBwb3J0ZWRgKTtjb25zdCBsPSJ0Zl9jcm9wX2FuZF9yZXNpemUiPT09dSxjPWwscD0ibmVhcmVzdCI9PT1pJiZuPj0xMT9lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJuZWFyZXN0X21vZGUiLCJyb3VuZF9wcmVmZXJfZmxvb3IiKToiIjtpZigtMT09PVsicm91bmRfcHJlZmVyX2Zsb29yIiwicm91bmRfcHJlZmVyX2NlaWwiLCJmbG9vciIsImNlaWwiLCIiXS5pbmRleE9mKHApKXRocm93IG5ldyBFcnJvcihgbmVhcmVzdF9tb2RlICcke3B9JyBpcyBub3Qgc3VwcG9ydGVkYCk7Y29uc3QgZD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImN1YmljX2NvZWZmX2EiLC0uNzUpLGY9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImV4Y2x1ZGVfb3V0c2lkZSIsMCk7aWYoZiYmImN1YmljIiE9PWkpdGhyb3cgbmV3IEVycm9yKCJleGNsdWRlX291dHNpZGUgY2FuIGJlIHNldCB0byAxIG9ubHkgd2hlbiBtb2RlIGlzIENVQklDLiIpO2NvbnN0IGg9bjwxMXx8Im5lYXJlc3QiPT09aSYmImFzeW1tZXRyaWMiPT09dSYmImZsb29yIj09PXA7bGV0IGc9MCxiPTAsbT0wO3JldHVybiBuPjEwP2UuaW5wdXRzLmxlbmd0aD4yPyhnPTEsYj0yLG09Myk6KGI9MSxtPTIpOjk9PT1uJiYoYj0xKSwoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtvcHNldDpuLGlzUmVzaXplOm8sbW9kZTppLHNjYWxlczpzLGV4dHJhcG9sYXRpb25WYWx1ZTphLGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOnUsdXNlRXh0cmFwb2xhdGlvbjpjLG5lZWRSb2lJbnB1dDpsLG5lYXJlc3RNb2RlOnAsY3ViaWNDb2VmZmljaWVudEE6ZCxleGNsdWRlT3V0c2lkZTpmLHVzZU5lYXJlc3QyeE9wdGltaXphdGlvbjpoLHJvaUlucHV0SWR4Omcsc2NhbGVzSW5wdXRJZHg6YixzaXplc0lucHV0SWR4Om19KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodFswXS5kaW1zLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9dFswXS5kaW1zLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoZSpuLnNjYWxlc1t0XSkpKSxbYyxwXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChsLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGQ9bC5sZW5ndGgsZj1uZXcgQXJyYXkoZCksaD1uZXcgQXJyYXkoZCk7bGV0IGc9YFxuICAgICAgaW50IG91dHB1dF9waXRjaGVzWyR7ZH1dO1xuICAgICAgaW50IGlucHV0X3BpdGNoZXNbJHtkfV07XG4gICAgICBgO2ZvcihsZXQgZT1kLTE7ZT49MDtlLS0pZltlXT1lPT09ZC0xPzE6ZltlKzFdKmxbZSsxXSxoW2VdPWU9PT1kLTE/MTpoW2UrMV0qdFswXS5kaW1zW2UrMV0sZys9YFxuICAgICAgICBvdXRwdXRfcGl0Y2hlc1ske2V9XSA9ICR7ZltlXX07XG4gICAgICAgIGlucHV0X3BpdGNoZXNbJHtlfV0gPSAke2hbZV19O1xuICAgICAgICBgO2NvbnN0IGI9YFxuICAgICAgZmxvYXQgZ2V0SW5wdXRGbG9hdChpbnQgaW5kZXgpIHtcbiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbmRleCwgJHthfSwgJHt1fSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KFgsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgLG09Im5lYXJlc3QiPT09bi5tb2RlP2BcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2R9XSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBkLCBtO1xuICAgICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgJHtkfTsgKytkaW0pIHtcbiAgICAgICAgZCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzW2RpbV07XG4gICAgICAgIG0gPSBvdXRwdXRfaW5kZXggLSBkICogb3V0cHV0X3BpdGNoZXNbZGltXTtcbiAgICAgICAgb3V0cHV0X2luZGV4ID0gbTtcblxuICAgICAgICBpZiAoc2NhbGVzW2RpbV0gIT0gMSAmJiBkID4gMCkge1xuICAgICAgICAgIGludCBkMiA9IGQgLyBzY2FsZXNbZGltXTtcbiAgICAgICAgICBtID0gZCAtIGQyICogc2NhbGVzW2RpbV07XG4gICAgICAgICAgZCA9IGQyO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0X2luZGV4ICs9IGlucHV0X3BpdGNoZXNbZGltXSAqIGQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICB9YDo0PT09ZD9gXG4gICAgJHtifVxuICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbNF0pIHtcbiAgICAgIGludCBpbnB1dF9pbmRleCA9IDA7XG4gICAgICBpbnQgb3V0cHV0X2luZGV4ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2N9LCAke3B9KTtcblxuICAgICAgJHtnfVxuXG4gICAgICBpbnQgbTtcbiAgICAgIGludCBpbmRleF9vZl9kaW0wLCBpbmRleF9vZl9kaW0xLCBpbmRleF9vZl9kaW0yLCBpbmRleF9vZl9kaW0zO1xuICAgICAgaW5kZXhfb2ZfZGltMCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGluZGV4X29mX2RpbTAgKiBvdXRwdXRfcGl0Y2hlc1swXTtcbiAgICAgIGluZGV4X29mX2RpbTEgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMV07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTEgKiBvdXRwdXRfcGl0Y2hlc1sxXTtcbiAgICAgIGluZGV4X29mX2RpbTIgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMl07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTIgKiBvdXRwdXRfcGl0Y2hlc1syXTtcbiAgICAgIGluZGV4X29mX2RpbTMgPSBtO1xuXG4gICAgICBpbnQgaW5kZXhfb2ZfaW5wdXRfZGltMiwgaW5kZXhfb2ZfaW5wdXRfZGltMywgeF9vZmZzZXQsIHlfb2Zmc2V0O1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMiA9IGluZGV4X29mX2RpbTIgLyBzY2FsZXNbMl07XG4gICAgICB5X29mZnNldCA9IGluZGV4X29mX2RpbTIgLSBpbmRleF9vZl9pbnB1dF9kaW0yICogc2NhbGVzWzJdO1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMyA9IGluZGV4X29mX2RpbTMgLyBzY2FsZXNbM107XG4gICAgICB4X29mZnNldCA9IGluZGV4X29mX2RpbTMgLSBpbmRleF9vZl9pbnB1dF9kaW0zICogc2NhbGVzWzNdO1xuXG4gICAgICBpbnB1dF9pbmRleCA9IGluZGV4X29mX2RpbTAgKiBpbnB1dF9waXRjaGVzWzBdICtcbiAgICAgICAgICAgIGluZGV4X29mX2RpbTEgKiBpbnB1dF9waXRjaGVzWzFdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTIgKiBpbnB1dF9waXRjaGVzWzJdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTM7XG5cbiAgICAgIGZsb2F0IHgwMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXgpO1xuICAgICAgZmxvYXQgeDEwLCB4MDEsIHgxMTtcblxuICAgICAgYm9vbCBlbmRfb2ZfZGltMiA9IGZhbHNlO1xuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTIgPT0gKCR7dFswXS5kaW1zWzJdfSAtIDEpKSB7XG4gICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMlxuICAgICAgICB4MDEgPSB4MDA7XG4gICAgICAgIGVuZF9vZl9kaW0yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHgwMSA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTMgPT0gKGlucHV0X3BpdGNoZXNbMl0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDNcbiAgICAgICAgeDEwID0geDAwO1xuICAgICAgICB4MTEgPSB4MDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgeDEwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIDEpO1xuICAgICAgICB4MTEgPSBlbmRfb2ZfZGltMiA/IHgxMCA6IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGZsb2F0IHkwID0geDAwICsgZmxvYXQoeV9vZmZzZXQpICogKHgwMSAtIHgwMCkgLyBmbG9hdChzY2FsZXNbMl0pO1xuICAgICAgZmxvYXQgeTEgPSB4MTAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDExIC0geDEwKSAvIGZsb2F0KHNjYWxlc1syXSk7XG4gICAgICByZXR1cm4geTAgKyBmbG9hdCh4X29mZnNldCkgKiAoeTEgLSB5MCkgLyBmbG9hdChzY2FsZXNbM10pO1xuICAgIH1gOmBcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1syXSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBtO1xuICAgICAgaW50IGluZGV4X29mX2RpbTAsIGluZGV4X29mX2RpbTE7XG4gICAgICBpbmRleF9vZl9kaW0wID0gb3V0cHV0X2luZGV4IC8gb3V0cHV0X3BpdGNoZXNbMF07XG4gICAgICBtID0gb3V0cHV0X2luZGV4IC0gaW5kZXhfb2ZfZGltMCAqIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgaW5kZXhfb2ZfZGltMSA9IG07XG5cbiAgICAgIGludCBpbmRleF9vZl9pbnB1dF9kaW0wLCBpbmRleF9vZl9pbnB1dF9kaW0xLCB4X29mZnNldCwgeV9vZmZzZXQ7XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0wID0gaW5kZXhfb2ZfZGltMCAvIHNjYWxlc1swXTtcbiAgICAgIHlfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMCAtIGluZGV4X29mX2lucHV0X2RpbTAgKiBzY2FsZXNbMF07XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0xID0gaW5kZXhfb2ZfZGltMSAvIHNjYWxlc1sxXTtcbiAgICAgIHhfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMSAtIGluZGV4X29mX2lucHV0X2RpbTEgKiBzY2FsZXNbMV07XG5cbiAgICAgIGlucHV0X2luZGV4ID0gaW5kZXhfb2ZfaW5wdXRfZGltMCAqIGlucHV0X3BpdGNoZXNbMF0gKyBpbmRleF9vZl9pbnB1dF9kaW0xO1xuXG4gICAgICBmbG9hdCB4MDAgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICAgIGZsb2F0IHgxMCwgeDAxLCB4MTE7XG5cbiAgICAgIGJvb2wgZW5kX29mX2RpbTAgPSBmYWxzZTtcbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0wID09ICgke3RbMF0uZGltc1swXX0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDBcbiAgICAgICAgeDAxID0geDAwO1xuICAgICAgICBlbmRfb2ZfZGltMCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4MDEgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0xID09IChpbnB1dF9waXRjaGVzWzBdIC0gMSkpIHtcbiAgICAgICAgLy8gSXQncyB0aGUgZW5kIGluIGRpbWVuc2lvbiAxXG4gICAgICAgIHgxMCA9IHgwMDtcbiAgICAgICAgeDExID0geDAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHgxMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyAxKTtcbiAgICAgICAgeDExID0gZW5kX29mX2RpbTAgPyB4MTAgOiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSArIDEpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCB5MCA9IHgwMCArIGZsb2F0KHlfb2Zmc2V0KSAqICh4MDEgLSB4MDApIC8gZmxvYXQoc2NhbGVzWzBdKTtcbiAgICAgIGZsb2F0IHkxID0geDEwICsgZmxvYXQoeV9vZmZzZXQpICogKHgxMSAtIHgxMCkgLyBmbG9hdChzY2FsZXNbMF0pO1xuICAgICAgcmV0dXJuIHkwICsgZmxvYXQoeF9vZmZzZXQpICogKHkxIC0geTApIC8gZmxvYXQoc2NhbGVzWzFdKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSx2YXJpYWJsZXM6W3tuYW1lOiJzY2FsZXMiLHR5cGU6ImludCIsYXJyYXlMZW5ndGg6bi5zY2FsZXMubGVuZ3RoLGRhdGE6bi5zY2FsZXMubWFwKChlPT5NYXRoLmNlaWwoZSkpKX1dfSl9O3QudmFsaWRhdGVJbnB1dHM9KGUsdCk9PntpZighZXx8dC5vcHNldDw5JiYxIT09ZS5sZW5ndGh8fHQub3BzZXQ+PTkmJnQub3BzZXQ8MTEmJjIhPT1lLmxlbmd0aHx8dC5vcHNldD49MTEmJmUubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0cy4iKTtpZih0LnNjYWxlcy5sZW5ndGg+MCYmZVswXS5kaW1zLmxlbmd0aCE9PXQuc2NhbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0sdC5zY2FsZXNWYWxpZGF0aW9uPShlLHQsbik9PntpZihuKXtmb3IoY29uc3QgdCBvZiBlKWlmKHQ8PTApdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAuIil9ZWxzZSBmb3IoY29uc3QgdCBvZiBlKWlmKHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNjYWxlIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4iKTtpZighKCJsaW5lYXIiIT09dCYmImN1YmljIiE9PXR8fDI9PT1lLmxlbmd0aHx8ND09PWUubGVuZ3RoJiYxPT09ZVswXSYmMT09PWVbMV0pKXRocm93IG5ldyBFcnJvcihgJ0xpbmVhcicgbW9kZSBhbmQgJ0N1YmljJyBtb2RlIG9ubHkgc3VwcG9ydCAyLUQgaW5wdXRzICgnQmlsaW5lYXInLCAnQmljdWJpYycpICAgICAgICAgb3IgNC1EIGlucHV0cyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG91dGVybW9zdCAyIHNjYWxlIHZhbHVlcyBiZWluZyAxICAgICAgICAgaW4gdGhlICR7bj8iUmVzaXplIjoiVXBzYW1wbGUifSBvcGVhcnRvci5gKX07fSwyNzU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qcm9ncmFtTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oODg5Nykscz1uKDY3NTcpO3QuUHJvZ3JhbU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucHJvZmlsZXI9ZSx0aGlzLmdsQ29udGV4dD10LHRoaXMudGV4dHVyZUxheW91dFN0cmF0ZWd5PW4sdGhpcy5yZXBvPW5ldyBNYXAsdGhpcy5hdHRyaWJ1dGVzQm91bmQ9ITE7fWdldEFydGlmYWN0KGUpe3JldHVybiB0aGlzLnJlcG8uZ2V0KGUpfXNldEFydGlmYWN0KGUsdCl7dGhpcy5yZXBvLnNldChlLHQpO31ydW4oZSx0LG4pe3ZhciByO3RoaXMucHJvZmlsZXIuZXZlbnQoIm9wIixgUHJvZ3JhbU1hbmFnZXIucnVuICR7bnVsbCE9PShyPWUucHJvZ3JhbUluZm8ubmFtZSkmJnZvaWQgMCE9PXI/cjoidW5rbm93biBrZXJuZWwifWAsKCgpPT57dmFyIHI7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5nbCxzPWUucHJvZ3JhbTtpLnVzZVByb2dyYW0ocyk7dHJ5e3RoaXMuYmluZE91dHB1dChuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZHx8dGhpcy5iaW5kQXR0cmlidXRlcyhlLmF0dHJpYkxvY2F0aW9ucyksdGhpcy5iaW5kVW5pZm9ybXMoZS51bmlmb3JtTG9jYXRpb25zLG51bGwhPT0ocj1lLnByb2dyYW1JbmZvLnZhcmlhYmxlcykmJnZvaWQgMCE9PXI/cjpbXSx0KTt9Y2F0Y2godCl7dGhyb3cgby5Mb2dnZXIuZXJyb3IoIlByb2dyYW1NYW5hZ2VyIixlLnByb2dyYW1JbmZvLnNoYWRlclNvdXJjZSksdH10aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiR2xDb250ZXh0LmRyYXcoKSIsKCgpPT57dGhpcy5nbENvbnRleHQuZHJhdygpO30pKTt9KSx0aGlzLmdsQ29udGV4dCk7fWRpc3Bvc2UoKXt0aGlzLnZlcnRleFNoYWRlciYmdGhpcy5nbENvbnRleHQuZGVsZXRlU2hhZGVyKHRoaXMudmVydGV4U2hhZGVyKSx0aGlzLnJlcG8uZm9yRWFjaCgoZT0+dGhpcy5nbENvbnRleHQuZGVsZXRlUHJvZ3JhbShlLnByb2dyYW0pKSk7fWJ1aWxkKGUsdCxuKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlByb2dyYW1NYW5hZ2VyLmJ1aWxkIiwoKCk9Pntjb25zdCByPW5ldyBpLkdsc2xQcmVwcm9jZXNzb3IodGhpcy5nbENvbnRleHQsZSx0LG4pLG89ci5wcmVwcm9jZXNzKCkscz10aGlzLmNvbXBpbGUobyk7cmV0dXJuIHtwcm9ncmFtSW5mbzplLHByb2dyYW06cyx1bmlmb3JtTG9jYXRpb25zOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9ucyhzLHIuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLHIuY29udGV4dC5wcm9ncmFtSW5mby52YXJpYWJsZXMpLGF0dHJpYkxvY2F0aW9uczp0aGlzLmdldEF0dHJpYkxvY2F0aW9ucyhzKX19KSl9Y29tcGlsZShlKXtpZighdGhpcy52ZXJ0ZXhTaGFkZXIpe28uTG9nZ2VyLnZlcmJvc2UoIlByb3JncmFtTWFuYWdlciIsIkNvbXBpbGluZyBhbmQgY2FjaGluZyBWZXJ0ZXggc2hhZGVyIGZvciB0aGUgZmlyc3QgdGltZSIpO2NvbnN0IGU9KDAsIHMuZ2V0VmVydGV4U2hhZGVyU291cmNlKSh0aGlzLmdsQ29udGV4dC52ZXJzaW9uKTt0aGlzLnZlcnRleFNoYWRlcj10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuVkVSVEVYX1NIQURFUik7fXIuZW52LmRlYnVnJiZvLkxvZ2dlci52ZXJib3NlKCJQcm9yZ3JhbU1hbmFnZXIiLGBGcmFnU2hhZGVyOlxuJHtlfVxuYCk7Y29uc3QgdD10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuRlJBR01FTlRfU0hBREVSKSxuPXRoaXMuZ2xDb250ZXh0LmNyZWF0ZVByb2dyYW0odGhpcy52ZXJ0ZXhTaGFkZXIsdCk7cmV0dXJuIHRoaXMuZ2xDb250ZXh0LmRlbGV0ZVNoYWRlcih0KSxufWJpbmRPdXRwdXQoZSl7Y29uc3QgdD1lLndpZHRoLG49ZS5oZWlnaHQ7by5Mb2dnZXIudmVyYm9zZSgiUHJvcmdyYW1NYW5hZ2VyIixgQmluZGluZyBvdXRwdXQgdGV4dHVyZSB0byBGcmFtZWJ1ZmZlcjogdy9oPSR7dH0vJHtufSwgc2hhcGU9JHtlLnNoYXBlfSwgdHlwZT0ke2UudGVuc29yLnR5cGV9YCksdGhpcy5nbENvbnRleHQuYXR0YWNoRnJhbWVidWZmZXIoZS50ZXh0dXJlLHQsbik7fWJpbmRBdHRyaWJ1dGVzKGUpe2NvbnN0IHQ9ZS5wb3NpdGlvbixuPWUudGV4dHVyZUNvb3JkO3RoaXMuZ2xDb250ZXh0LnNldFZlcnRleEF0dHJpYnV0ZXModCxuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZD0hMDt9YmluZFVuaWZvcm1zKGUsdCxuKXt2YXIgcjtjb25zdCBvPXRoaXMuZ2xDb250ZXh0LmdsO2xldCBpPTA7Zm9yKGNvbnN0e25hbWU6cyx0eXBlOmEsbG9jYXRpb246dSxhcnJheUxlbmd0aDpsfW9mIGUpe2NvbnN0IGU9bnVsbD09PShyPXQuZmluZCgoZT0+ZS5uYW1lPT09cykpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5kYXRhO2lmKCJzYW1wbGVyMkQiIT09YSYmIWUpdGhyb3cgbmV3IEVycm9yKGB2YXJpYWJsZSAnJHtzfScgZG9lcyBub3QgaGF2ZSBkYXRhIGRlZmluZWQgaW4gcHJvZ3JhbSBpbmZvYCk7c3dpdGNoKGEpe2Nhc2Uic2FtcGxlcjJEIjp0aGlzLmJpbmRUZXh0dXJlKG5baV0sdSxpKSxpKys7YnJlYWs7Y2FzZSJmbG9hdCI6bD9vLnVuaWZvcm0xZnYodSxlKTpvLnVuaWZvcm0xZih1LGUpO2JyZWFrO2Nhc2UiaW50IjpsP28udW5pZm9ybTFpdih1LGUpOm8udW5pZm9ybTFpKHUsZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gbm90IGltcGxlbWVudGVkOiAke2F9YCl9fX1iaW5kVGV4dHVyZShlLHQsbil7dGhpcy5nbENvbnRleHQuYmluZFRleHR1cmVUb1VuaWZvcm0oZS50ZXh0dXJlLG4sdCk7fWdldEF0dHJpYkxvY2F0aW9ucyhlKXtyZXR1cm4ge3Bvc2l0aW9uOnRoaXMuZ2V0QXR0cmliTG9jYXRpb24oZSwicG9zaXRpb24iKSx0ZXh0dXJlQ29vcmQ6dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihlLCJ0ZXh0dXJlQ29vcmQiKX19Z2V0VW5pZm9ybUxvY2F0aW9ucyhlLHQsbil7Y29uc3Qgcj1bXTtpZih0KWZvcihjb25zdCBuIG9mIHQpci5wdXNoKHtuYW1lOm4sdHlwZToic2FtcGxlcjJEIixsb2NhdGlvbjp0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihlLG4pfSk7aWYobilmb3IoY29uc3QgdCBvZiBuKXIucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xvY2F0aW9uOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdC5uYW1lKX0pKTtyZXR1cm4gcn1nZXRVbmlmb3JtTG9jYXRpb24oZSx0KXtjb25zdCBuPXRoaXMuZ2xDb250ZXh0LmdsLmdldFVuaWZvcm1Mb2NhdGlvbihlLHQpO2lmKG51bGw9PT1uKXRocm93IG5ldyBFcnJvcihgVW5pZm9ybSAke3R9IG5vdCBmb3VuZC5gKTtyZXR1cm4gbn1nZXRBdHRyaWJMb2NhdGlvbihlLHQpe3JldHVybiB0aGlzLmdsQ29udGV4dC5nbC5nZXRBdHRyaWJMb2NhdGlvbihlLHQpfX07fSwyMTcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTFNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMTMxNSksbz1uKDU4ODEpLGk9big3ODYwKSxzPW4oNDExMCksYT1uKDI3NTcpLHU9big3NjE4KSxsPW4oNTI0Myk7dC5XZWJHTFNlc3Npb25IYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5iYWNrZW5kPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5sYXlvdXRTdHJhdGVneT1uZXcgdS5QcmVmZXJMb2dpY2FsU3RyYXRlZ3koZS5nbENvbnRleHQubWF4VGV4dHVyZVNpemUpLHRoaXMucHJvZ3JhbU1hbmFnZXI9bmV3IGEuUHJvZ3JhbU1hbmFnZXIodGhpcy5jb250ZXh0LnByb2ZpbGVyLGUuZ2xDb250ZXh0LHRoaXMubGF5b3V0U3RyYXRlZ3kpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IGwuVGV4dHVyZU1hbmFnZXIoZS5nbENvbnRleHQsdGhpcy5sYXlvdXRTdHJhdGVneSx0aGlzLmNvbnRleHQucHJvZmlsZXIse3JldXNlVGV4dHVyZXM6ImZ1bGwiPT09ZS50ZXh0dXJlQ2FjaGVNb2RlfSksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnBhY2s9ZS5wYWNrLHRoaXMucGFjazJ1bnBhY2tNYXA9bmV3IE1hcCx0aGlzLnVucGFjazJwYWNrTWFwPW5ldyBNYXA7fWNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKXtyZXR1cm4gbmV3IGkuV2ViR0xJbmZlcmVuY2VIYW5kbGVyKHRoaXMpfW9uR3JhcGhJbml0aWFsaXplZChlKXtjb25zdCB0PWUuZ2V0VmFsdWVzKCkuZmlsdGVyKChlPT4tMT09PWUuZnJvbSYmZS50ZW5zb3IpKS5tYXAoKGU9PmUudGVuc29yLmRhdGFJZCkpO3RoaXMuaW5pdGlhbGl6ZXJzPW5ldyBTZXQodCk7fWlzSW5pdGlhbGl6ZXIoZSl7cmV0dXJuICEhdGhpcy5pbml0aWFsaXplcnMmJnRoaXMuaW5pdGlhbGl6ZXJzLmhhcyhlKX1hZGRJbml0aWFsaXplcihlKXt0aGlzLmluaXRpYWxpemVycy5hZGQoZSk7fWdldFRleHR1cmVEYXRhKGUsdCl7cmV0dXJuIHQ/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKTp0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5nZXQoZSl9c2V0VGV4dHVyZURhdGEoZSx0LG49ITEpe3IuTG9nZ2VyLnZlcmJvc2UoIldlYkdMU2Vzc2lvbkhhbmRsZXIiLCJTdG9yaW5nIFRleHR1cmUgZGF0YSBpbiBjYWNoZSIpLG4/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpO31kaXNwb3NlKCl7dGhpcy5wcm9ncmFtTWFuYWdlci5kaXNwb3NlKCksdGhpcy50ZXh0dXJlTWFuYWdlci5jbGVhckFjdGl2ZVRleHR1cmVzKCksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2goKGU9PnRoaXMudGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSwhMCkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKGUsITApKSksdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9cmVzb2x2ZShlLHQsbil7Y29uc3Qgcj0oMCwgby5yZXNvbHZlT3BlcmF0b3IpKGUsdCxzLldFQkdMX09QX1JFU09MVkVfUlVMRVMpO3JldHVybiB7aW1wbDpyLm9wSW1wbCxjb250ZXh0OnIub3BJbml0P3Iub3BJbml0KGUsbik6ZX19fTt9LDk2MjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlVpbnQ4RGF0YUVuY29kZXI9dC5SR0JBRmxvYXREYXRhRW5jb2Rlcj10LlJlZEZsb2F0MzJEYXRhRW5jb2Rlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuUmVkRmxvYXQzMkRhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZigxPT09dCl0aGlzLmludGVybmFsRm9ybWF0PWUuUjMyRix0aGlzLmZvcm1hdD1lLlJFRCx0aGlzLnRleHR1cmVUeXBlPWUuRkxPQVQsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQTMyRix0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLkZMT0FULHRoaXMuY2hhbm5lbFNpemU9dDt9fWVuY29kZShlLHQpe2xldCBuLG87cmV0dXJuIGUuY29uc3RydWN0b3IhPT1GbG9hdDMyQXJyYXkmJihyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiZGF0YSB3YXMgbm90IG9mIHR5cGUgRmxvYXQzMjsgY3JlYXRpbmcgbmV3IEZsb2F0MzJBcnJheSIpLG89bmV3IEZsb2F0MzJBcnJheShlKSksdCp0aGlzLmNoYW5uZWxTaXplPmUubGVuZ3RoPyhyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiU291cmNlIGRhdGEgdG9vIHNtYWxsLiBBbGxvY2F0aW5nIGxhcmdlciBhcnJheSIpLG89ZSxuPXRoaXMuYWxsb2NhdGUodCp0aGlzLmNoYW5uZWxTaXplKSxvLmZvckVhY2goKChlLHQpPT5uW3RdPWUpKSk6KG89ZSxuPW8pLG59YWxsb2NhdGUoZSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoNCplKX1kZWNvZGUoZSx0KXtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemU/ZS5maWx0ZXIoKChlLHQpPT50JTQ9PTApKS5zdWJhcnJheSgwLHQpOmUuc3ViYXJyYXkoMCx0KX19LHQuUkdCQUZsb2F0RGF0YUVuY29kZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PTEsbil7aWYoMSE9PXQmJjQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy5jaGFubmVsU2l6ZT10LHRoaXMudGV4dHVyZVR5cGU9bnx8ZS5GTE9BVDt9ZW5jb2RlKGUsdCl7bGV0IG49ZTtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemUmJihyLkxvZ2dlci52ZXJib3NlKCJFbmNvZGVyIiwiRXhwbG9kaW5nIGludG8gYSBsYXJnZXIgYXJyYXkiKSxuPXRoaXMuYWxsb2NhdGUodCksZS5mb3JFYWNoKCgoZSx0KT0+bls0KnRdPWUpKSksbn1hbGxvY2F0ZShlKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheSg0KmUpfWRlY29kZShlLHQpe3JldHVybiAxPT09dGhpcy5jaGFubmVsU2l6ZT9lLmZpbHRlcigoKGUsdCk9PnQlND09MCkpLnN1YmFycmF5KDAsdCk6ZS5zdWJhcnJheSgwLHQpfX0sdC5VaW50OERhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZih0aGlzLmNoYW5uZWxTaXplPTQsMT09PXQpdGhpcy5pbnRlcm5hbEZvcm1hdD1lLkFMUEhBLHRoaXMuZm9ybWF0PWUuQUxQSEEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O319ZW5jb2RlKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfWFsbG9jYXRlKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKnRoaXMuY2hhbm5lbFNpemUpfWRlY29kZShlLHQpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlLnN1YmFycmF5KDAsdCk7dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFycmF5IHR5cGU6ICR7ZS5jb25zdHJ1Y3Rvcn1gKX19O30sNzYxODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0QmF0Y2hEaW09dC5zaXplVG9TcXVhcmlzaFNoYXBlPXQuZ2V0Um93c0NvbHM9dC5zaXplRnJvbVNoYXBlPXQuaXNJbnQ9dC5wYXJzZUF4aXNQYXJhbT10LnNxdWVlemVTaGFwZT10LlByZWZlckxvZ2ljYWxTdHJhdGVneT10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big3MjczKTtmdW5jdGlvbiBpKGUsdCl7Y29uc3Qgbj1bXSxyPVtdLG89bnVsbCE9dCYmQXJyYXkuaXNBcnJheSh0KSYmMD09PXQubGVuZ3RoLGk9bnVsbD09dHx8bz9udWxsOnModCxlKS5zb3J0KCk7bGV0IGE9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7aWYobnVsbCE9aSl7aWYoaVthXT09PXQmJjEhPT1lW3RdKXRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc3F1ZWV6ZSBheGlzICR7dH0gc2luY2UgaXRzIGRpbSAnJHtlW3RdfScgaXMgbm90IDFgKTsobnVsbD09aVthXXx8aVthXT50KSYmMT09PWVbdF0mJihuLnB1c2goZVt0XSksci5wdXNoKHQpKSxpW2FdPD10JiZhKys7fTEhPT1lW3RdJiYobi5wdXNoKGVbdF0pLHIucHVzaCh0KSk7fXJldHVybiB7bmV3U2hhcGU6bixrZXB0RGltczpyfX1mdW5jdGlvbiBzKGUsdCl7Y29uc3Qgbj10Lmxlbmd0aDtyZXR1cm4gZT1udWxsPT1lP3QubWFwKCgoZSx0KT0+dCkpOltdLmNvbmNhdChlKSwoMCwgby5hc3NlcnQpKGUuZXZlcnkoKGU9PmU+PS1uJiZlPG4pKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbiByYW5nZSBbLSR7bn0sICR7bn0pIGJ1dCBnb3QgYXhpcyAke2V9YCkpLCgwLCBvLmFzc2VydCkoZS5ldmVyeShhKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbnRlZ2VycyBidXQgZ290IGF4aXMgJHtlfWApKSxlLm1hcCgoZT0+ZTwwP24rZTplKSl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSUxPT0wfWZ1bmN0aW9uIHUoZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiAxO2xldCB0PWVbMF07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspdCo9ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBsKGUpe2NvbnN0IHQ9TWF0aC5jZWlsKE1hdGguc3FydChlKSk7cmV0dXJuIFt0LE1hdGguY2VpbChlL3QpXX10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFsxLDFdO2NvbnN0IG49dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbz10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG8+bnx8aT5uKSlyZXR1cm4gW28saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWNvbnN0IG89ZS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtsZXQgaT1NYXRoLmZsb29yKE1hdGguc3FydChvKSk7Zm9yKDtpPG4mJmk8byYmbyVpIT0wO2krKyk7aWYoaT49bnx8byVpIT0wKXRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGRpbWVuc2lvbnMgYXJlIG91dHNpZGUgdGhpcyBHUFUncyBib3VuZGFyaWVzOiAke2V9YCk7cmV0dXJuIFtpLG8vaV19fSx0LlByZWZlckxvZ2ljYWxTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtjb25zdCBuPXRoaXMuY29tcHV0ZVRleHR1cmUoZSx0KTtyZXR1cm4gdCYmdC5pc1BhY2tlZCYmKG5bMF0vPTIsblsxXS89MiksdCYmdC5yZXZlcnNlV0g/W25bMV0sblswXV06bn1jb21wdXRlVGV4dHVyZShlLHQpe2NvbnN0IG49dCYmdC5pc1BhY2tlZDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG4/WzIsMl06WzEsMV07bGV0IG89dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbj10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG4+b3x8aT5vKSlyZXR1cm4gW24saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWxldCBzPWUuc2xpY2UoMCk7aWYobiYmKG8qPTIscz1zLm1hcCgoKGUsdCk9PnQ+PXMubGVuZ3RoLTI/c1t0XSUyPT0wP3NbdF06c1t0XSsxOnNbdF0pKSwxPT09cy5sZW5ndGgmJihzPVsyLHNbMF1dKSksMiE9PXMubGVuZ3RoKXtjb25zdCBlPWkocyk7cz1lLm5ld1NoYXBlO31jb25zdCBhPXUocyk7cmV0dXJuIHMubGVuZ3RoPD0xJiZhPD1vP1sxLGFdOjI9PT1zLmxlbmd0aCYmc1swXTw9byYmc1sxXTw9bz9zOjM9PT1zLmxlbmd0aCYmc1swXSpzWzFdPD1vJiZzWzJdPD1vP1tzWzBdKnNbMV0sc1syXV06Mz09PXMubGVuZ3RoJiZzWzBdPD1vJiZzWzFdKnNbMl08PW8/W3NbMF0sc1sxXSpzWzJdXTo0PT09cy5sZW5ndGgmJnNbMF0qc1sxXSpzWzJdPD1vJiZzWzNdPD1vP1tzWzBdKnNbMV0qc1syXSxzWzNdXTo0PT09cy5sZW5ndGgmJnNbMF08PW8mJnNbMV0qc1syXSpzWzNdPD1vP1tzWzBdLHNbMV0qc1syXSpzWzNdXTpuP2woYS80KS5tYXAoKGU9PjIqZSkpOmwoYSl9fSx0LnNxdWVlemVTaGFwZT1pLHQucGFyc2VBeGlzUGFyYW09cyx0LmlzSW50PWEsdC5zaXplRnJvbVNoYXBlPXUsdC5nZXRSb3dzQ29scz1mdW5jdGlvbihlKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgRXJyb3IoIkNhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4iKTtyZXR1cm4gW2UubGVuZ3RoPjE/ZVtlLmxlbmd0aC0yXToxLGVbZS5sZW5ndGgtMV1dfSx0LnNpemVUb1NxdWFyaXNoU2hhcGU9bCx0LmdldEJhdGNoRGltPWZ1bmN0aW9uKGUsdD0yKXtyZXR1cm4gdShlLnNsaWNlKDAsZS5sZW5ndGgtdCkpfTt9LDMzMTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9dC5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQ9dC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpO3QuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZT0oZSxuLHIpPT57Y29uc3QgaT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZHx8cj09PW8uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZD8xOjQscz1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsYT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZFJldmVyc2VkfHxyPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsdT1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uP24ubGVuZ3RoLTE6dm9pZCAwLGw9cj09PW8uVGV4dHVyZVR5cGUucGFja2VkTGFzdERpbWVuc2lvbj9uLm1hcCgoKGUsdCk9PnQ9PT1uLmxlbmd0aC0xPzQqZTplKSk6dm9pZCAwO3JldHVybiAoMCwgdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKShlLG4saSxsLHtpc1BhY2tlZDpzLHJldmVyc2VXSDphLGJyZWFrQXhpczp1fSl9LHQuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0PShlLG4scik9Pntjb25zdCBvPSgwLCB0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tVGV4dHVyZVR5cGUpKGUsbixyKTtyZXR1cm4gW28ud2lkdGgsby5oZWlnaHRdfSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9KGUsdCxuPTEsbyxpKT0+e2NvbnN0IHM9ISghaXx8IWkuaXNQYWNrZWQpLFthLHVdPWUuY29tcHV0ZVRleHR1cmVXSChzJiZvfHx0LGkpLGw9dC5sZW5ndGg7bGV0IGM9dC5zbGljZSgwKTtpZigwPT09bCYmKGM9WzFdKSwxPT09bilvPXQ7ZWxzZSBpZihzKXtpZig0IT09bil0aHJvdyBuZXcgRXJyb3IoImEgcGFja2VkIHRleHR1cmUgbXVzdCBiZSA0LWNoYW5uZWwiKTtvPXQsbD4wJiYoY1tsLTFdPU1hdGguY2VpbChjW2wtMV0vMikpLGw+MSYmKGNbbC0yXT1NYXRoLmNlaWwoY1tsLTJdLzIpKTt9ZWxzZSBpZighbyl0aHJvdyBuZXcgRXJyb3IoIlVucGFja2VkIHNoYXBlIGlzIG5lZWRlZCB3aGVuIHVzaW5nIGNoYW5uZWxzID4gMSIpO3JldHVybiB7d2lkdGg6YSxoZWlnaHQ6dSxjaGFubmVsczpuLGlzUGFja2VkOnMsc2hhcGU6YyxzdHJpZGVzOnIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGMpLHVucGFja2VkU2hhcGU6byxyZXZlcnNlZFdIOmkmJmkucmV2ZXJzZVdIfX07fSw1MjQzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZXh0dXJlTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuVGV4dHVyZU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLmxheW91dFN0cmF0ZWd5PXQsdGhpcy5wcm9maWxlcj1uLHRoaXMuY29uZmlnPXIsdGhpcy5wZW5kaW5nUmVhZD1uZXcgTWFwLHIucmV1c2VUZXh0dXJlcyYmKHRoaXMuaW5Vc2VUZXh0dXJlcz1uZXcgTWFwLHRoaXMuaWRsZVRleHR1cmVzPW5ldyBNYXAsdGhpcy50ZXh0dXJlTG9va3VwPW5ldyBNYXApO31jcmVhdGVUZXh0dXJlRnJvbUxheW91dChlLHQsbixvKXtjb25zdCBpPXRoaXMudG9FbmNvZGVyVHlwZShlKSxzPXRoaXMuZ2xDb250ZXh0LmdldEVuY29kZXIoaSx0LmNoYW5uZWxzfHwxLG8pO2lmKHQuaXNQYWNrZWQmJjE9PT1vKXRocm93IG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIik7Y29uc3QgYT10LndpZHRoLHU9dC5oZWlnaHQ7bGV0IGwsYztpZih0aGlzLmNvbmZpZy5yZXVzZVRleHR1cmVzKXtsPWAke2F9eCR7dX1fJHtzLmZvcm1hdH1fJHtzLmludGVybmFsRm9ybWF0fV8ke3MudGV4dHVyZVR5cGV9YCxjPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobCksY3x8KGM9W10sdGhpcy5pblVzZVRleHR1cmVzLnNldChsLGMpKTtjb25zdCB0PXRoaXMuaWRsZVRleHR1cmVzLmdldChsKTtpZih0JiZ0Lmxlbmd0aD4wKXtjb25zdCByPXQucG9wKCk7cmV0dXJuIGMucHVzaChyKSwxPT09byYmdGhpcy5nbENvbnRleHQudXBkYXRlVGV4dHVyZShyLGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKSxyfX1yLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTWFuYWdlciIsYENyZWF0aW5nIG5ldyB0ZXh0dXJlIG9mIHNpemUgJHt0LndpZHRofXgke3QuaGVpZ2h0fWApO2NvbnN0IHA9dGhpcy5nbENvbnRleHQuYWxsb2NhdGVUZXh0dXJlKGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKTtyZXR1cm4gdGhpcy5jb25maWcucmV1c2VUZXh0dXJlcyYmKGMucHVzaChwKSx0aGlzLnRleHR1cmVMb29rdXAuc2V0KHAsbCkpLHB9cmVhZFRleHR1cmUoZSx0LG4pe3JldHVybiBufHwobj0xKSx0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiVGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUiLCgoKT0+e2NvbnN0IHI9ZS5zaGFwZS5yZWR1Y2UoKChlLHQpPT5lKnQpKSpuLG89dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUoZS50ZXh0dXJlLGUud2lkdGgsZS5oZWlnaHQscix0aGlzLnRvRW5jb2RlclR5cGUodCksbik7cmV0dXJuIHRoaXMudG9UZW5zb3JEYXRhKHQsbyl9KSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlLHQsbil7Y29uc3Qgcj1lLnRlbnNvci5kYXRhSWQ7aWYobnx8KG49MSksdGhpcy5wZW5kaW5nUmVhZC5oYXMocikpe2NvbnN0IGU9dGhpcy5wZW5kaW5nUmVhZC5nZXQocik7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT5udWxsPT1lP3ZvaWQgMDplLnB1c2godCkpKX1yZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMiLChhc3luYygpPT57dGhpcy5wZW5kaW5nUmVhZC5zZXQocixbXSk7Y29uc3Qgbz1lLnNoYXBlLnJlZHVjZSgoKGUsdCk9PmUqdCkpKm47YXdhaXQgdGhpcy5nbENvbnRleHQuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCxvLHRoaXMudG9FbmNvZGVyVHlwZSh0KSxuKSxzPXRoaXMudG9UZW5zb3JEYXRhKHQsaSksYT10aGlzLnBlbmRpbmdSZWFkLmdldChyKTtyZXR1cm4gdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUociksbnVsbD09YXx8YS5mb3JFYWNoKChlPT5lKHMpKSksc30pKX1yZWFkVWludDhUZXh0dXJlQXNGbG9hdChlKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0IiwoKCk9Pntjb25zdCB0PWUuc2hhcGUucmVkdWNlKCgoZSx0KT0+ZSp0KSksbj10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCw0KnQsImJ5dGUiLDQpO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KG4uYnVmZmVyLG4uYnl0ZU9mZnNldCx0KX0pKX1yZWxlYXNlVGV4dHVyZShlLHQpe2xldCBuO2lmKHRoaXMuY29uZmlnLnJldXNlVGV4dHVyZXMmJihuPXRoaXMudGV4dHVyZUxvb2t1cC5nZXQoZS50ZXh0dXJlKSxuKSl7dCYmdGhpcy50ZXh0dXJlTG9va3VwLmRlbGV0ZShuKTtjb25zdCByPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobik7aWYocil7Y29uc3QgdD1yLmluZGV4T2YoZS50ZXh0dXJlKTtpZigtMSE9PXQpe3Iuc3BsaWNlKHQsMSk7bGV0IG89dGhpcy5pZGxlVGV4dHVyZXMuZ2V0KG4pO298fChvPVtdLHRoaXMuaWRsZVRleHR1cmVzLnNldChuLG8pKSxvLnB1c2goZS50ZXh0dXJlKTt9fX1uJiYhdHx8KHIuTG9nZ2VyLnZlcmJvc2UoIlRleHR1cmVNYW5hZ2VyIixgRGVsZXRpbmcgdGV4dHVyZSBvZiBzaXplICR7ZS53aWR0aH14JHtlLmhlaWdodH1gKSx0aGlzLmdsQ29udGV4dC5kZWxldGVUZXh0dXJlKGUudGV4dHVyZSkpO310b1RlbnNvckRhdGEoZSx0KXtzd2l0Y2goZSl7Y2FzZSJpbnQxNiI6cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5P3Q6SW50MTZBcnJheS5mcm9tKHQpO2Nhc2UiaW50MzIiOnJldHVybiB0IGluc3RhbmNlb2YgSW50MzJBcnJheT90OkludDMyQXJyYXkuZnJvbSh0KTtjYXNlImludDgiOnJldHVybiB0IGluc3RhbmNlb2YgSW50OEFycmF5P3Q6SW50OEFycmF5LmZyb20odCk7Y2FzZSJ1aW50MTYiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDE2QXJyYXk/dDpVaW50MTZBcnJheS5mcm9tKHQpO2Nhc2UidWludDMyIjpyZXR1cm4gdCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Q6VWludDMyQXJyYXkuZnJvbSh0KTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDhBcnJheT90OlVpbnQ4QXJyYXkuZnJvbSh0KTtjYXNlImZsb2F0MzIiOnJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6RmxvYXQzMkFycmF5LmZyb20odCk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gdCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT90OkZsb2F0NjRBcnJheS5mcm9tKHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBUZW5zb3JEYXRhIHR5cGUgJHtlfSBpcyBub3Qgc3VwcG9ydGVkYCl9fXRvVGV4dHVyZURhdGEoZSx0KXtpZih0KXJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6bmV3IEZsb2F0MzJBcnJheSh0KX10b0VuY29kZXJUeXBlKGUpe3JldHVybiAiZmxvYXQifWNsZWFyQWN0aXZlVGV4dHVyZXMoKXt0aGlzLmdsQ29udGV4dC5jbGVhckFjdGl2ZVRleHR1cmVzKCk7fX07fSw1NjM5OihlLHQpPT57dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGV4dHVyZVR5cGU9dm9pZCAwLChuPXQuVGV4dHVyZVR5cGV8fCh0LlRleHR1cmVUeXBlPXt9KSlbbi51bnBhY2tlZD0wXT0idW5wYWNrZWQiLG5bbi51bnBhY2tlZFJldmVyc2VkPTFdPSJ1bnBhY2tlZFJldmVyc2VkIixuW24ucGFja2VkPTJdPSJwYWNrZWQiLG5bbi5kb3dubG9hZFVpbnQ4QXNGbG9hdD0zXT0iZG93bmxvYWRVaW50OEFzRmxvYXQiLG5bbi5wYWNrZWRMYXN0RGltZW5zaW9uPTRdPSJwYWNrZWRMYXN0RGltZW5zaW9uIjt9LDQzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0R2xDaGFubmVscz10LmdldENvb3Jkc0RhdGFUeXBlPXQuZ2V0U3F1ZWV6ZWRQYXJhbXM9dC5zcXVlZXplSW5wdXRTaGFwZT10LmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZUF0T3V0Q29vcmRzPXQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPXQucmVwZWF0ZWRUcnk9dC5nZXRQYWNrZWRTaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3QuZ2V0UGFja2VkU2hhcGU9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmxlbmd0aDtyZXR1cm4gZS5zbGljZSgwLHQtMSkuY29uY2F0KGVbdC0xXS80KX0sdC5yZXBlYXRlZFRyeT1hc3luYyBmdW5jdGlvbihlLHQ9ZT0+MCxuKXtyZXR1cm4gbmV3IFByb21pc2UoKChyLG8pPT57bGV0IGk9MDtjb25zdCBzPSgpPT57aWYoZSgpKXJldHVybiB2b2lkIHIoKTtpKys7Y29uc3QgYT10KGkpO251bGwhPW4mJmk+PW4/bygpOnNldFRpbWVvdXQocyxhKTt9O3MoKTt9KSl9LHQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPWZ1bmN0aW9uKGUpe3JldHVybiAoMCwgci5hc3NlcnQpKHZvaWQgMCE9PWUmJjAhPT1lLmxlbmd0aCwoKCk9PiJlbXB0eSBzdHJpbmcgZm91bmQgZm9yIHNhbXBsZXIgbmFtZSIpKSwiZ2V0IitlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9LHQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHM9ZnVuY3Rpb24oZSl7cmV0dXJuICgwLCByLmFzc2VydCkodm9pZCAwIT09ZSYmMCE9PWUubGVuZ3RoLCgoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIikpLCJnZXQiK2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSsiQXRPdXRDb29yZHMifSx0LnNxdWVlemVJbnB1dFNoYXBlPWZ1bmN0aW9uKGUsdCl7bGV0IG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIG49dCxufSx0LmdldFNxdWVlemVkUGFyYW1zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKCh0PT5lW3RdKSkuam9pbigiLCAiKX0sdC5nZXRDb29yZHNEYXRhVHlwZT1mdW5jdGlvbihlKXtpZihlPD0xKXJldHVybiAiaW50IjtpZigyPT09ZSlyZXR1cm4gIml2ZWMyIjtpZigzPT09ZSlyZXR1cm4gIml2ZWMzIjtpZig0PT09ZSlyZXR1cm4gIml2ZWM0IjtpZig1PT09ZSlyZXR1cm4gIml2ZWM1IjtpZig2PT09ZSlyZXR1cm4gIml2ZWM2Ijt0aHJvdyBFcnJvcihgR1BVIGZvciByYW5rICR7ZX0gaXMgbm90IHlldCBzdXBwb3J0ZWRgKX0sdC5nZXRHbENoYW5uZWxzPWZ1bmN0aW9uKGU9Nil7cmV0dXJuIFsieCIsInkiLCJ6IiwidyIsInUiLCJ2Il0uc2xpY2UoMCxlKX07fSwzMzg5OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVOZXdXZWJHTENvbnRleHQ9dC5jcmVhdGVXZWJHTENvbnRleHQ9dm9pZCAwO2NvbnN0IHI9bigxMzE1KSxvPW4oMzUyNCksaT17fTtmdW5jdGlvbiBzKGUsdCl7bGV0IG47Y29uc3QgaT17YWxwaGE6ITEsZGVwdGg6ITEsYW50aWFsaWFzOiExLHN0ZW5jaWw6ITEscHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLHByZW11bHRpcGxpZWRBbHBoYTohMSxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExfTtpZigoIXR8fCJ3ZWJnbDIiPT09dCkmJihuPWUuZ2V0Q29udGV4dCgid2ViZ2wyIixpKSxuKSl0cnl7cmV0dXJuIG5ldyBvLldlYkdMQ29udGV4dChuLDIpfWNhdGNoKGUpe3IuTG9nZ2VyLndhcm5pbmcoIkdsQ29udGV4dEZhY3RvcnkiLGBmYWlsZWQgdG8gY3JlYXRlIFdlYkdMQ29udGV4dCB1c2luZyBjb250ZXh0SWQgJ3dlYmdsMicuIEVycm9yOiAke2V9YCk7fWlmKCghdHx8IndlYmdsIj09PXQpJiYobj1lLmdldENvbnRleHQoIndlYmdsIixpKXx8ZS5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiLGkpLG4pKXRyeXtyZXR1cm4gbmV3IG8uV2ViR0xDb250ZXh0KG4sMSl9Y2F0Y2goZSl7ci5Mb2dnZXIud2FybmluZygiR2xDb250ZXh0RmFjdG9yeSIsYGZhaWxlZCB0byBjcmVhdGUgV2ViR0xDb250ZXh0IHVzaW5nIGNvbnRleHRJZCAnd2ViZ2wnIG9yICdleHBlcmltZW50YWwtd2ViZ2wnLiBFcnJvcjogJHtlfWApO310aHJvdyBuZXcgRXJyb3IoIldlYkdMIGlzIG5vdCBzdXBwb3J0ZWQiKX10LmNyZWF0ZVdlYkdMQ29udGV4dD1mdW5jdGlvbiBlKHQpe2xldCBuO2lmKHQmJiJ3ZWJnbDIiIT09dHx8ISgid2ViZ2wyImluIGkpP3QmJiJ3ZWJnbCIhPT10fHwhKCJ3ZWJnbCJpbiBpKXx8KG49aS53ZWJnbCk6bj1pLndlYmdsMiwhbil0cnl7bj1zKGZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBvZmZzY3JlZW4gY2FudmFzOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSl9KCksdCk7fWNhdGNoKGUpe249cyhmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQpdGhyb3cgbmV3IFR5cGVFcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBjYW52YXM6IGRvY3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiBlLndpZHRoPTEsZS5oZWlnaHQ9MSxlfSgpLHQpO310PXR8fDE9PT1uLnZlcnNpb24/IndlYmdsIjoid2ViZ2wyIjtjb25zdCByPW4uZ2w7cmV0dXJuIGlbdF09bixyLmlzQ29udGV4dExvc3QoKT8oZGVsZXRlIGlbdF0sZSh0KSk6KHIuZGlzYWJsZShyLkRFUFRIX1RFU1QpLHIuZGlzYWJsZShyLlNURU5DSUxfVEVTVCksci5kaXNhYmxlKHIuQkxFTkQpLHIuZGlzYWJsZShyLkRJVEhFUiksci5kaXNhYmxlKHIuUE9MWUdPTl9PRkZTRVRfRklMTCksci5kaXNhYmxlKHIuU0FNUExFX0NPVkVSQUdFKSxyLmVuYWJsZShyLlNDSVNTT1JfVEVTVCksci5lbmFibGUoci5DVUxMX0ZBQ0UpLHIuY3VsbEZhY2Uoci5CQUNLKSxuKX0sdC5jcmVhdGVOZXdXZWJHTENvbnRleHQ9czt9LDM1MjQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKTt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7byYmISgiZ2V0ImluIG8/IXQuX19lc01vZHVsZTpvLndyaXRhYmxlfHxvLmNvbmZpZ3VyYWJsZSl8fChvPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbyk7fTpmdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKSxlW3JdPXRbbl07fSksbz10aGlzJiZ0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdHx8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pO306ZnVuY3Rpb24oZSx0KXtlLmRlZmF1bHQ9dDt9KSxpPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbihlKXtpZihlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9e307aWYobnVsbCE9ZSlmb3IodmFyIG4gaW4gZSkiZGVmYXVsdCIhPT1uJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmcih0LGUsbik7cmV0dXJuIG8odCxlKSx0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTENvbnRleHQ9dC5saW5lYXJTZWFyY2hMYXN0VHJ1ZT12b2lkIDA7Y29uc3Qgcz1uKDIyMzUpLGE9aShuKDk2MjIpKSx1PW4oNDMyKTtmdW5jdGlvbiBsKGUpe2xldCB0PTA7Zm9yKDt0PGUubGVuZ3RoJiZlW3RdKCk7Kyt0KTtyZXR1cm4gdC0xfXQubGluZWFyU2VhcmNoTGFzdFRydWU9bCx0LldlYkdMQ29udGV4dD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZnJhbWVCdWZmZXJCb3VuZD0hMSx0aGlzLml0ZW1zVG9Qb2xsPVtdLHRoaXMuZ2w9ZSx0aGlzLnZlcnNpb249dCx0aGlzLmdldEV4dGVuc2lvbnMoKSx0aGlzLnZlcnRleGJ1ZmZlcj10aGlzLmNyZWF0ZVZlcnRleGJ1ZmZlcigpLHRoaXMuZnJhbWVidWZmZXI9dGhpcy5jcmVhdGVGcmFtZWJ1ZmZlcigpLHRoaXMucXVlcnlWaXRhbFBhcmFtZXRlcnMoKTt9YWxsb2NhdGVUZXh0dXJlKGUsdCxuLHIpe2NvbnN0IG89dGhpcy5nbCxpPW8uY3JlYXRlVGV4dHVyZSgpO28uYmluZFRleHR1cmUoby5URVhUVVJFXzJELGkpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01JTl9GSUxURVIsby5ORUFSRVNUKSxvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELG8uVEVYVFVSRV9NQUdfRklMVEVSLG8uTkVBUkVTVCksby50ZXhQYXJhbWV0ZXJpKG8uVEVYVFVSRV8yRCxvLlRFWFRVUkVfV1JBUF9TLG8uQ0xBTVBfVE9fRURHRSksby50ZXhQYXJhbWV0ZXJpKG8uVEVYVFVSRV8yRCxvLlRFWFRVUkVfV1JBUF9ULG8uQ0xBTVBfVE9fRURHRSk7Y29uc3Qgcz1yP24uZW5jb2RlKHIsZSp0KTpudWxsO3JldHVybiBvLnRleEltYWdlMkQoby5URVhUVVJFXzJELDAsbi5pbnRlcm5hbEZvcm1hdCxlLHQsMCxuLmZvcm1hdCxuLnRleHR1cmVUeXBlLHMpLHRoaXMuY2hlY2tFcnJvcigpLGl9dXBkYXRlVGV4dHVyZShlLHQsbixyLG8pe2NvbnN0IGk9dGhpcy5nbDtpLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV8yRCxlKTtjb25zdCBzPXIuZW5jb2RlKG8sdCpuKTtpLnRleFN1YkltYWdlMkQoaS5URVhUVVJFXzJELDAsMCwwLHQsbixyLmZvcm1hdCxyLnRleHR1cmVUeXBlLHMpLHRoaXMuY2hlY2tFcnJvcigpO31hdHRhY2hGcmFtZWJ1ZmZlcihlLHQsbil7Y29uc3Qgcj10aGlzLmdsO3IuYmluZFRleHR1cmUoci5URVhUVVJFXzJELGUpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsdGhpcy5mcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELGUsMCksdGhpcy5jaGVja0Vycm9yKCksci52aWV3cG9ydCgwLDAsdCxuKSxyLnNjaXNzb3IoMCwwLHQsbik7fXJlYWRUZXh0dXJlKGUsdCxuLHIsbyxpKXtjb25zdCBzPXRoaXMuZ2w7aXx8KGk9MSksdGhpcy5mcmFtZUJ1ZmZlckJvdW5kfHx0aGlzLmF0dGFjaEZyYW1lYnVmZmVyKGUsdCxuKTtjb25zdCBhPXRoaXMuZ2V0RW5jb2RlcihvLGkpLHU9YS5hbGxvY2F0ZSh0Km4pO3JldHVybiBzLmJpbmRUZXh0dXJlKHMuVEVYVFVSRV8yRCxlKSxzLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHMuRlJBTUVCVUZGRVIscy5DT0xPUl9BVFRBQ0hNRU5UMCxzLlRFWFRVUkVfMkQsZSwwKSxzLnJlYWRQaXhlbHMoMCwwLHQsbixzLlJHQkEsYS50ZXh0dXJlVHlwZSx1KSx0aGlzLmNoZWNrRXJyb3IoKSxhLmRlY29kZSh1LHIpfWlzRnJhbWVidWZmZXJSZWFkeSgpe3JldHVybiAhMH1nZXRBY3RpdmVUZXh0dXJlKCl7Y29uc3QgZT10aGlzLmdsO3JldHVybiAiVEVYVFVSRSIrKGUuZ2V0UGFyYW1ldGVyKHRoaXMuZ2wuQUNUSVZFX1RFWFRVUkUpLWUuVEVYVFVSRTApfWdldFRleHR1cmVCaW5kaW5nKCl7cmV0dXJuIHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKHRoaXMuZ2wuVEVYVFVSRV9CSU5ESU5HXzJEKX1nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKXtyZXR1cm4gdGhpcy5nbC5nZXRQYXJhbWV0ZXIodGhpcy5nbC5GUkFNRUJVRkZFUl9CSU5ESU5HKX1zZXRWZXJ0ZXhBdHRyaWJ1dGVzKGUsdCl7Y29uc3Qgbj10aGlzLmdsO24udmVydGV4QXR0cmliUG9pbnRlcihlLDMsbi5GTE9BVCwhMSwyMCwwKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLC0xIT09dCYmKG4udmVydGV4QXR0cmliUG9pbnRlcih0LDIsbi5GTE9BVCwhMSwyMCwxMiksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KSksdGhpcy5jaGVja0Vycm9yKCk7fWNyZWF0ZVByb2dyYW0oZSx0KXtjb25zdCBuPXRoaXMuZ2wscj1uLmNyZWF0ZVByb2dyYW0oKTtyZXR1cm4gbi5hdHRhY2hTaGFkZXIocixlKSxuLmF0dGFjaFNoYWRlcihyLHQpLG4ubGlua1Byb2dyYW0ocikscn1jb21waWxlU2hhZGVyKGUsdCl7Y29uc3Qgbj10aGlzLmdsLHI9bi5jcmVhdGVTaGFkZXIodCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVTaGFkZXIoKSByZXR1cm5lZCBudWxsIHdpdGggdHlwZSAke3R9YCk7aWYobi5zaGFkZXJTb3VyY2UocixlKSxuLmNvbXBpbGVTaGFkZXIociksITE9PT1uLmdldFNoYWRlclBhcmFtZXRlcihyLG4uQ09NUElMRV9TVEFUVVMpKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbXBpbGUgc2hhZGVyOiAke24uZ2V0U2hhZGVySW5mb0xvZyhyKX1cblNoYWRlciBzb3VyY2U6XG4ke2V9YCk7cmV0dXJuIHJ9ZGVsZXRlU2hhZGVyKGUpe3RoaXMuZ2wuZGVsZXRlU2hhZGVyKGUpO31iaW5kVGV4dHVyZVRvVW5pZm9ybShlLHQsbil7Y29uc3Qgcj10aGlzLmdsO3IuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwK3QpLHRoaXMuY2hlY2tFcnJvcigpLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELGUpLHRoaXMuY2hlY2tFcnJvcigpLHIudW5pZm9ybTFpKG4sdCksdGhpcy5jaGVja0Vycm9yKCk7fWRyYXcoKXt0aGlzLmdsLmRyYXdBcnJheXModGhpcy5nbC5UUklBTkdMRV9TVFJJUCwwLDQpLHRoaXMuY2hlY2tFcnJvcigpO31jaGVja0Vycm9yKCl7aWYocy5lbnYuZGVidWcpe2NvbnN0IGU9dGhpcy5nbCx0PWUuZ2V0RXJyb3IoKTtsZXQgbj0iIjtzd2l0Y2godCl7Y2FzZSBlLk5PX0VSUk9SOnJldHVybjtjYXNlIGUuSU5WQUxJRF9FTlVNOm49IklOVkFMSURfRU5VTSI7YnJlYWs7Y2FzZSBlLklOVkFMSURfVkFMVUU6bj0iSU5WQUxJRF9WQUxVRSI7YnJlYWs7Y2FzZSBlLklOVkFMSURfT1BFUkFUSU9OOm49IklOVkFMSURfT1BFUkFUSU9OIjticmVhaztjYXNlIGUuSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT046bj0iSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04iO2JyZWFrO2Nhc2UgZS5PVVRfT0ZfTUVNT1JZOm49Ik9VVF9PRl9NRU1PUlkiO2JyZWFrO2Nhc2UgZS5DT05URVhUX0xPU1RfV0VCR0w6bj0iQ09OVEVYVF9MT1NUX1dFQkdMIjticmVhaztkZWZhdWx0Om49YFVua25vd24gV2ViR0wgRXJyb3I6ICR7dC50b1N0cmluZygxNil9YDt9dGhyb3cgbmV3IEVycm9yKG4pfX1kZWxldGVUZXh0dXJlKGUpe3RoaXMuZ2wuZGVsZXRlVGV4dHVyZShlKTt9ZGVsZXRlUHJvZ3JhbShlKXt0aGlzLmdsLmRlbGV0ZVByb2dyYW0oZSk7fWdldEVuY29kZXIoZSx0LG49MCl7aWYoMj09PXRoaXMudmVyc2lvbilyZXR1cm4gbmV3IGEuUmVkRmxvYXQzMkRhdGFFbmNvZGVyKHRoaXMuZ2wsdCk7c3dpdGNoKGUpe2Nhc2UiZmxvYXQiOnJldHVybiAxPT09bnx8dGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQ/bmV3IGEuUkdCQUZsb2F0RGF0YUVuY29kZXIodGhpcy5nbCx0KTpuZXcgYS5SR0JBRmxvYXREYXRhRW5jb2Rlcih0aGlzLmdsLHQsdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTKTtjYXNlImludCI6dGhyb3cgbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTtjYXNlImJ5dGUiOnJldHVybiBuZXcgYS5VaW50OERhdGFFbmNvZGVyKHRoaXMuZ2wsdCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YVR5cGU6ICR7ZX1gKX19Y2xlYXJBY3RpdmVUZXh0dXJlcygpe2NvbnN0IGU9dGhpcy5nbDtmb3IobGV0IHQ9MDt0PHRoaXMubWF4VGV4dHVyZUltYWdlVW5pdHM7Kyt0KWUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwK3QpLGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpO31kaXNwb3NlKCl7aWYodGhpcy5kaXNwb3NlZClyZXR1cm47Y29uc3QgZT10aGlzLmdsO2UuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKSxlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsbnVsbCksZS5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhidWZmZXIpLGUuYmluZEJ1ZmZlcihlLkVMRU1FTlRfQVJSQVlfQlVGRkVSLG51bGwpLGUuZmluaXNoKCksdGhpcy5kaXNwb3NlZD0hMDt9Y3JlYXRlRGVmYXVsdEdlb21ldHJ5KCl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoWy0xLDEsMCwwLDEsLTEsLTEsMCwwLDAsMSwxLDAsMSwxLDEsLTEsMCwxLDBdKX1jcmVhdGVWZXJ0ZXhidWZmZXIoKXtjb25zdCBlPXRoaXMuZ2wsdD1lLmNyZWF0ZUJ1ZmZlcigpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiY3JlYXRlQnVmZmVyKCkgcmV0dXJuZWQgbnVsbCIpO2NvbnN0IG49dGhpcy5jcmVhdGVEZWZhdWx0R2VvbWV0cnkoKTtyZXR1cm4gZS5iaW5kQnVmZmVyKGUuQVJSQVlfQlVGRkVSLHQpLGUuYnVmZmVyRGF0YShlLkFSUkFZX0JVRkZFUixuLGUuU1RBVElDX0RSQVcpLHRoaXMuY2hlY2tFcnJvcigpLHR9Y3JlYXRlRnJhbWVidWZmZXIoKXtjb25zdCBlPXRoaXMuZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZUZyYW1lYnVmZmVyIHJldHVybmVkIG51bGwiKTtyZXR1cm4gZX1xdWVyeVZpdGFsUGFyYW1ldGVycygpe2NvbnN0IGU9dGhpcy5nbDtpZih0aGlzLmlzRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXI9dGhpcy5jaGVja0Zsb2F0VGV4dHVyZUF0dGFjaGFibGVUb0ZyYW1lQnVmZmVyKCksdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQ9dGhpcy5jaGVja1JlbmRlckZsb2F0MzIoKSx0aGlzLmlzRmxvYXQzMkRvd25sb2FkU3VwcG9ydGVkPXRoaXMuY2hlY2tGbG9hdDMyRG93bmxvYWQoKSwxPT09dGhpcy52ZXJzaW9uJiYhdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uJiYhdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQpdGhyb3cgbmV3IEVycm9yKCJib3RoIGZsb2F0MzIgYW5kIGZsb2F0MTYgVGV4dHVyZVR5cGUgYXJlIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLmlzQmxlbmRTdXBwb3J0ZWQ9IXRoaXMuaXNSZW5kZXJGbG9hdDMyU3VwcG9ydGVkfHx0aGlzLmNoZWNrRmxvYXQzMkJsZW5kKCksdGhpcy5tYXhUZXh0dXJlU2l6ZT1lLmdldFBhcmFtZXRlcihlLk1BWF9URVhUVVJFX1NJWkUpLHRoaXMubWF4VGV4dHVyZUltYWdlVW5pdHM9ZS5nZXRQYXJhbWV0ZXIoZS5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyksdGhpcy52ZXJzaW9uO31nZXRFeHRlbnNpb25zKCl7Mj09PXRoaXMudmVyc2lvbj8odGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksdGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIkVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDIiKSk6KHRoaXMudGV4dHVyZUZsb2F0RXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9mbG9hdCIpLHRoaXMudGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpKTt9Y2hlY2tGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcigpe2NvbnN0IGU9dGhpcy5nbCx0PWUuY3JlYXRlVGV4dHVyZSgpO2UuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHQpO2NvbnN0IG49Mj09PXRoaXMudmVyc2lvbj9lLlJHQkEzMkY6ZS5SR0JBO2UudGV4SW1hZ2UyRChlLlRFWFRVUkVfMkQsMCxuLDEsMSwwLGUuUkdCQSxlLkZMT0FULG51bGwpO2NvbnN0IHI9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpO2UuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsciksZS5mcmFtZWJ1ZmZlclRleHR1cmUyRChlLkZSQU1FQlVGRkVSLGUuQ09MT1JfQVRUQUNITUVOVDAsZS5URVhUVVJFXzJELHQsMCk7Y29uc3Qgbz1lLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZS5GUkFNRUJVRkZFUik9PT1lLkZSQU1FQlVGRkVSX0NPTVBMRVRFO3JldHVybiBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxudWxsKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuZGVsZXRlVGV4dHVyZSh0KSxlLmRlbGV0ZUZyYW1lYnVmZmVyKHIpLG99Y2hlY2tSZW5kZXJGbG9hdDMyKCl7aWYoMj09PXRoaXMudmVyc2lvbil7aWYoIXRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbilyZXR1cm4gITF9ZWxzZSBpZighdGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb24pcmV0dXJuICExO3JldHVybiB0aGlzLmlzRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXJ9Y2hlY2tGbG9hdDMyRG93bmxvYWQoKXtpZigyPT09dGhpcy52ZXJzaW9uKXtpZighdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uKXJldHVybiAhMX1lbHNlIHtpZighdGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb24pcmV0dXJuICExO2lmKCF0aGlzLmdsLmdldEV4dGVuc2lvbigiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpcmV0dXJuICExfXJldHVybiB0aGlzLmlzRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXJ9Y2hlY2tGbG9hdDMyQmxlbmQoKXtjb25zdCBlPXRoaXMuZ2w7bGV0IHQsbixyLG8saTt0cnl7dD1lLmNyZWF0ZVRleHR1cmUoKSxuPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCx0KTtjb25zdCBzPTI9PT10aGlzLnZlcnNpb24/ZS5SR0JBMzJGOmUuUkdCQTtyZXR1cm4gZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLHMsMSwxLDAsZS5SR0JBLGUuRkxPQVQsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixuKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdCwwKSxlLmVuYWJsZShlLkJMRU5EKSxyPWUuY3JlYXRlU2hhZGVyKGUuVkVSVEVYX1NIQURFUiksISFyJiYoZS5zaGFkZXJTb3VyY2Uociwidm9pZCBtYWluKCl7fSIpLGUuY29tcGlsZVNoYWRlcihyKSxvPWUuY3JlYXRlU2hhZGVyKGUuRlJBR01FTlRfU0hBREVSKSwhIW8mJihlLnNoYWRlclNvdXJjZShvLCJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dm9pZCBtYWluKCl7Z2xfRnJhZ0NvbG9yPXZlYzQoMC41KTt9IiksZS5jb21waWxlU2hhZGVyKG8pLGk9ZS5jcmVhdGVQcm9ncmFtKCksISFpJiYoZS5hdHRhY2hTaGFkZXIoaSxyKSxlLmF0dGFjaFNoYWRlcihpLG8pLGUubGlua1Byb2dyYW0oaSksZS51c2VQcm9ncmFtKGkpLGUuZHJhd0FycmF5cyhlLlBPSU5UUywwLDEpLGUuZ2V0RXJyb3IoKT09PWUuTk9fRVJST1IpKSl9ZmluYWxseXtlLmRpc2FibGUoZS5CTEVORCksaSYmZS5kZWxldGVQcm9ncmFtKGkpLHImJmUuZGVsZXRlU2hhZGVyKHIpLG8mJmUuZGVsZXRlU2hhZGVyKG8pLG4mJihlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuZGVsZXRlRnJhbWVidWZmZXIobikpLHQmJihlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCxudWxsKSxlLmRlbGV0ZVRleHR1cmUodCkpO319YmVnaW5UaW1lcigpe2lmKDI9PT10aGlzLnZlcnNpb24mJnRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXtjb25zdCBlPXRoaXMuZ2wsdD10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbixuPWUuY3JlYXRlUXVlcnkoKTtyZXR1cm4gZS5iZWdpblF1ZXJ5KHQuVElNRV9FTEFQU0VEX0VYVCxuKSxufXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4iKX1lbmRUaW1lcigpe2lmKDIhPT10aGlzLnZlcnNpb258fCF0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3QgZT10aGlzLmdsLHQ9dGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb247ZS5lbmRRdWVyeSh0LlRJTUVfRUxBUFNFRF9FWFQpO319aXNUaW1lclJlc3VsdEF2YWlsYWJsZShlKXtsZXQgdD0hMSxuPSExO2lmKDIhPT10aGlzLnZlcnNpb258fCF0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3Qgcj10aGlzLmdsLG89dGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb247dD1yLmdldFF1ZXJ5UGFyYW1ldGVyKGUsci5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFKSxuPXIuZ2V0UGFyYW1ldGVyKG8uR1BVX0RJU0pPSU5UX0VYVCk7fXJldHVybiB0JiYhbn1nZXRUaW1lclJlc3VsdChlKXtsZXQgdD0wO2lmKDIhPT10aGlzLnZlcnNpb24pdGhyb3cgbmV3IEVycm9yKCJXZWJHTDEgcHJvZmlsaW5nIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIik7e2NvbnN0IG49dGhpcy5nbDt0PW4uZ2V0UXVlcnlQYXJhbWV0ZXIoZSxuLlFVRVJZX1JFU1VMVCksbi5kZWxldGVRdWVyeShlKTt9cmV0dXJuIHQvMWU2fWFzeW5jIHdhaXRGb3JRdWVyeUFuZEdldFRpbWUoZSl7cmV0dXJuIGF3YWl0KDAsIHUucmVwZWF0ZWRUcnkpKCgoKT0+dGhpcy5pc1RpbWVyUmVzdWx0QXZhaWxhYmxlKGUpKSksdGhpcy5nZXRUaW1lclJlc3VsdChlKX1hc3luYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKXtjb25zdCBlPXRoaXMuY3JlYXRlRmVuY2UodGhpcy5nbCk7cmV0dXJuIHRoaXMucG9sbEZlbmNlKGUpfWNyZWF0ZUZlbmNlKGUpe2xldCB0O2NvbnN0IG49ZSxyPW4uZmVuY2VTeW5jKG4uU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7cmV0dXJuIGUuZmx1c2goKSx0PW51bGw9PT1yPygpPT4hMDooKT0+e2NvbnN0IGU9bi5jbGllbnRXYWl0U3luYyhyLDAsMCk7cmV0dXJuIGU9PT1uLkFMUkVBRFlfU0lHTkFMRUR8fGU9PT1uLkNPTkRJVElPTl9TQVRJU0ZJRUR9LHtxdWVyeTpyLGlzRmVuY2VQYXNzZWQ6dH19YXN5bmMgcG9sbEZlbmNlKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodD0+e3RoaXMuYWRkSXRlbVRvUG9sbCgoKCk9PmUuaXNGZW5jZVBhc3NlZCgpKSwoKCk9PnQoKSkpO30pKX1wb2xsSXRlbXMoKXtjb25zdCBlPWwodGhpcy5pdGVtc1RvUG9sbC5tYXAoKGU9PmUuaXNEb25lRm4pKSk7Zm9yKGxldCB0PTA7dDw9ZTsrK3Qpe2NvbnN0e3Jlc29sdmVGbjplfT10aGlzLml0ZW1zVG9Qb2xsW3RdO2UoKTt9dGhpcy5pdGVtc1RvUG9sbD10aGlzLml0ZW1zVG9Qb2xsLnNsaWNlKGUrMSk7fWFzeW5jIGFkZEl0ZW1Ub1BvbGwoZSx0KXt0aGlzLml0ZW1zVG9Qb2xsLnB1c2goe2lzRG9uZUZuOmUscmVzb2x2ZUZuOnR9KSx0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aD4xfHxhd2FpdCgwLCB1LnJlcGVhdGVkVHJ5KSgoKCk9Pih0aGlzLnBvbGxJdGVtcygpLDA9PT10aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aCkpKTt9fTt9LDY0OTY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkV4ZWN1dGlvblBsYW49dm9pZCAwO2NvbnN0IHI9bigxMzE1KTtjbGFzcyBve2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5vcD1lLHRoaXMubm9kZT10O319dC5FeGVjdXRpb25QbGFuPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmdyYXBoPWUsdGhpcy5wcm9maWxlcj1uLHRoaXMuaW5pdGlhbGl6ZSh0KTt9aW5pdGlhbGl6ZShlKXt0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiRXhlY3V0aW9uUGxhbi5pbml0aWFsaXplIiwoKCk9Pntjb25zdCB0PXRoaXMuZ3JhcGguZ2V0Tm9kZXMoKTtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlIHNpemUgb2Ygbm9kZXMgYW5kIE9QcyBkbyBub3QgbWF0Y2guIik7dGhpcy5fb3BzPWUubWFwKCgoZSxuKT0+bmV3IG8oZSx0W25dKSkpLHRoaXMucmVzZXQoKSx0aGlzLl9zdGFydGVyPVtdLHRoaXMuX29wcy5mb3JFYWNoKCgoZSx0KT0+e2xldCBuPSEwO2Zvcihjb25zdCB0IG9mIGUubm9kZS5pbnB1dHMpaWYoIXRoaXMuX3ZhbHVlc1t0XSYmLTE9PT10aGlzLmdyYXBoLmdldElucHV0SW5kaWNlcygpLmluZGV4T2YodCkpe249ITE7YnJlYWt9biYmdGhpcy5fc3RhcnRlci5wdXNoKHQpO30pKTt9KSk7fXJlc2V0KCl7dGhpcy5fdmFsdWVzPXRoaXMuZ3JhcGguZ2V0VmFsdWVzKCkubWFwKChlPT5lLnRlbnNvcikpO31hc3luYyBleGVjdXRlKGUsdCl7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJFeGVjdXRpb25QbGFuLmV4ZWN1dGUiLChhc3luYygpPT57dGhpcy5yZXNldCgpO2NvbnN0IG49ZS5jcmVhdGVJbmZlcmVuY2VIYW5kbGVyKCksbz10aGlzLmdyYXBoLmdldElucHV0SW5kaWNlcygpO2lmKHQubGVuZ3RoIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBudW1iZXIgb2YgaW5wdXQgdGVuc29ycyBkb24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mIGlucHV0cyB0byB0aGUgbW9kZWw6IGFjdHVhbDogJHt0Lmxlbmd0aH0gZXhwZWN0ZWQ6ICR7by5sZW5ndGh9YCk7dC5mb3JFYWNoKCgoZSx0KT0+e2NvbnN0IG49b1t0XTt0aGlzLl92YWx1ZXNbbl09ZTt9KSk7Y29uc3QgaT10aGlzLl9zdGFydGVyLnNsaWNlKDApLHM9dGhpcy5ncmFwaC5nZXRWYWx1ZXMoKSxhPXRoaXMuZ3JhcGguZ2V0Tm9kZXMoKTtsZXQgdT0wO2Zvcig7dTxpLmxlbmd0aDspe2NvbnN0IGU9aVt1KytdLHQ9dGhpcy5fb3BzW2VdLG89dC5ub2RlLmlucHV0cy5tYXAoKGU9PnRoaXMuX3ZhbHVlc1tlXSkpO2lmKC0xIT09by5pbmRleE9mKHZvaWQgMCkpdGhyb3cgbmV3IEVycm9yKGB1bnJlc29sdmVkIGlucHV0IGRldGVjdGVkOiBvcDogJHt0Lm5vZGV9YCk7Y29uc3QgbD1vO3IuTG9nZ2VyLnZlcmJvc2UoIkV4ZWNQbGFuIixgUnVuaW5nIG9wOiR7dC5ub2RlLm5hbWV9ICgke2wubWFwKCgoZSxuKT0+YCcke3Qubm9kZS5pbnB1dHNbbl19JzogJHtlLnR5cGV9WyR7ZS5kaW1zLmpvaW4oIiwiKX1dYCkpLmpvaW4oIiwgIil9KWApO2NvbnN0IGM9YXdhaXQgdGhpcy5wcm9maWxlci5ldmVudCgibm9kZSIsdC5ub2RlLm5hbWUsKGFzeW5jKCk9PnQub3AuaW1wbChuLGwsdC5vcC5jb250ZXh0KSkpO2lmKGMubGVuZ3RoIT09dC5ub2RlLm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIHNpemUgb2Ygb3V0cHV0IGRvZXMgbm90IG1hdGNoIG1vZGVsIGRlZmluaXRpb24uIik7Yy5mb3JFYWNoKCgoZSxuKT0+e2NvbnN0IHI9dC5ub2RlLm91dHB1dHNbbl07aWYodGhpcy5fdmFsdWVzW3JdKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IFske3J9XSBhbHJlYWR5IGhhcyB2YWx1ZTogb3A6JHt0Lm5vZGUubmFtZX1gKTt0aGlzLl92YWx1ZXNbcl09ZTt9KSk7Y29uc3QgcD1uZXcgU2V0O2MuZm9yRWFjaCgoKGUsbik9Pntjb25zdCByPXQubm9kZS5vdXRwdXRzW25dO2Zvcihjb25zdCBlIG9mIHNbcl0udG8pe2NvbnN0IHQ9YVtlXTtsZXQgbj0hMDtmb3IoY29uc3QgZSBvZiB0LmlucHV0cylpZighdGhpcy5fdmFsdWVzW2VdKXtuPSExO2JyZWFrfW4mJnAuYWRkKGUpO319KSksaS5wdXNoKC4uLnApO31jb25zdCBsPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5ncmFwaC5nZXRPdXRwdXRJbmRpY2VzKCkubGVuZ3RoO2UrKyl7Y29uc3QgdD10aGlzLmdyYXBoLmdldE91dHB1dEluZGljZXMoKVtlXSxuPXRoaXMuX3ZhbHVlc1t0XTtpZih2b2lkIDA9PT1uKXRocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgb3V0cHV0IFske3R9XSBkb2VzIG5vdCBoYXZlIHZhbHVlYCk7MD09PXQ/YXdhaXQgbi5nZXREYXRhKCk6bi5kYXRhLGwucHVzaChuKTt9cmV0dXJuIHIuTG9nZ2VyLnZlcmJvc2UoIkV4ZWNQbGFuIiwiZGlzcG9zaW5nIG9mIGluZmVyZW5jZUhhbmRsZXIiKSxuLmRpc3Bvc2UoKSxsfSkpfX07fSw0NjYyOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5HcmFwaD12b2lkIDA7Y29uc3Qgcj1uKDY4NzQpLG89big1MTI3KSxpPW4oMjQ0Nikscz1uKDkyNDApLGE9big3MjczKTt2YXIgdT1vLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7dC5HcmFwaD17ZnJvbTooZSx0KT0+bmV3IHAoZSx0KX07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9mcm9tPXZvaWQgMCx0aGlzLl90bz1bXSx0aGlzLnRlbnNvcj12b2lkIDAsdGhpcy50eXBlPXZvaWQgMCxlJiYodGhpcy50eXBlPWEuUHJvdG9VdGlsLnRlbnNvclZhbHVlVHlwZUZyb21Qcm90byhlLnR5cGUudGVuc29yVHlwZSkpO31nZXQgZnJvbSgpe3JldHVybiB0aGlzLl9mcm9tfWdldCB0bygpe3JldHVybiB0aGlzLl90b319Y2xhc3MgY3tjb25zdHJ1Y3RvcihlLHQpe2UgaW5zdGFuY2VvZiBpLm9ubnguTm9kZVByb3RvPyh0aGlzLm5hbWU9ZS5uYW1lLHRoaXMub3BUeXBlPWUub3BUeXBlLHRoaXMuYXR0cmlidXRlcz1uZXcgci5BdHRyaWJ1dGUoZS5hdHRyaWJ1dGUpKTplIGluc3RhbmNlb2YgdS5Ob2RlJiYodGhpcy5uYW1lPW51bGwhPXQ/dDplLm5hbWUoKSx0aGlzLm9wVHlwZT1lLm9wVHlwZSgpLHRoaXMuYXR0cmlidXRlcz1uZXcgci5BdHRyaWJ1dGUoYS5Qcm90b1V0aWwudGVuc29yQXR0cmlidXRlc0Zyb21PUlRGb3JtYXQoZSkpKSx0aGlzLmlucHV0cz1bXSx0aGlzLm91dHB1dHM9W10sdGhpcy5leGVjdXRlTm9kZT0hMDt9fWNsYXNzIHB7Y29uc3RydWN0b3IoZSx0KXtpZighZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJncmFwaCBpcyBlbXB0eSIpO3RoaXMuYnVpbGRHcmFwaChlKSx0aGlzLnRyYW5zZm9ybUdyYXBoKHQpLHRoaXMuY2hlY2tJc0FjeWNsaWMoKTt9Z2V0SW5wdXRJbmRpY2VzKCl7cmV0dXJuIHRoaXMuX2FsbElucHV0SW5kaWNlc31nZXRJbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX2FsbElucHV0TmFtZXN9Z2V0T3V0cHV0SW5kaWNlcygpe3JldHVybiB0aGlzLl9hbGxPdXRwdXRJbmRpY2VzfWdldE91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX2FsbE91dHB1dE5hbWVzfWdldFZhbHVlcygpe3JldHVybiB0aGlzLl9hbGxEYXRhfWdldE5vZGVzKCl7cmV0dXJuIHRoaXMuX25vZGVzfWJ1aWxkR3JhcGgoZSl7aWYoZSBpbnN0YW5jZW9mIGkub25ueC5HcmFwaFByb3RvKXRoaXMuYnVpbGRHcmFwaEZyb21Pbm54Rm9ybWF0KGUpO2Vsc2Uge2lmKCEoZSBpbnN0YW5jZW9mIHUuR3JhcGgpKXRocm93IG5ldyBUeXBlRXJyb3IoIkdyYXBoIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4iKTt0aGlzLmJ1aWxkR3JhcGhGcm9tT3J0Rm9ybWF0KGUpO319YnVpbGRHcmFwaEZyb21Pbm54Rm9ybWF0KGUpe2NvbnN0IHQ9bmV3IE1hcDt0aGlzLl9hbGxEYXRhPVtdLHRoaXMuX2FsbElucHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxJbnB1dE5hbWVzPVtdLHRoaXMuX2FsbE91dHB1dEluZGljZXM9W10sdGhpcy5fYWxsT3V0cHV0TmFtZXM9W10sdGhpcy5fbm9kZXM9W107Y29uc3Qgbj1uZXcgTWFwO2lmKCFlLmlucHV0KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogaW5wdXQiKTtjb25zdCByPVtdO2Zvcihjb25zdCBuIG9mIGUuaW5wdXQpe2lmKHQuaGFzKG4ubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIGlucHV0IG5hbWU6ICR7bi5uYW1lfWApO2NvbnN0IGU9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBsKG4pKS0xO3Quc2V0KG4ubmFtZSxlKSxyLnB1c2gobi5uYW1lKTt9aWYoIWUuaW5pdGlhbGl6ZXIpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBpbml0aWFsaXplciIpO2Zvcihjb25zdCBuIG9mIGUuaW5pdGlhbGl6ZXIpe2xldCBlPXQuZ2V0KG4ubmFtZSk7aWYodm9pZCAwPT09ZSl7Y29uc3Qgcj1uZXcgbDtyLnR5cGU9e3NoYXBlOntkaW1zOmEuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tUHJvdG8obi5kaW1zKX0sdGVuc29yVHlwZTphLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhuLmRhdGFUeXBlKX0sZT10aGlzLl9hbGxEYXRhLnB1c2gociktMSx0LnNldChuLm5hbWUsZSk7fXRoaXMuX2FsbERhdGFbZV0uX2Zyb209LTEsdGhpcy5fYWxsRGF0YVtlXS50ZW5zb3I9cy5UZW5zb3IuZnJvbVByb3RvKG4pO31mb3IobGV0IGU9MDtlPHRoaXMuX2FsbERhdGEubGVuZ3RoO2UrKyl0aGlzLl9hbGxEYXRhW2VdLnRlbnNvcnx8KHRoaXMuX2FsbElucHV0SW5kaWNlcy5wdXNoKGUpLHRoaXMuX2FsbElucHV0TmFtZXMucHVzaChyW2VdKSk7aWYoIWUub3V0cHV0KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogb3V0cHV0Iik7Zm9yKGNvbnN0IG4gb2YgZS5vdXRwdXQpe2lmKHQuaGFzKG4ubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG91dHB1dCBuYW1lOiAke24ubmFtZX1gKTtjb25zdCBlPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbChuKSktMTt0LnNldChuLm5hbWUsZSksdGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5wdXNoKGUpLHRoaXMuX2FsbE91dHB1dE5hbWVzLnB1c2gobi5uYW1lKTt9aWYoIWUubm9kZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG5vZGUiKTtmb3IoY29uc3QgdCBvZiBlLm5vZGUpe2lmKCF0Lm5hbWUpZm9yKGxldCBlPTA7O2UrKyl7Y29uc3Qgcj1gdW5uYW1lZF8ke3Qub3BUeXBlfV8ke2V9YDtpZighbi5oYXMocikpe3QubmFtZT1yO2JyZWFrfX1pZihuLmhhcyh0Lm5hbWUpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBub2RlIG5hbWU6ICR7dC5uYW1lfWApO2NvbnN0IGU9dGhpcy5fbm9kZXMucHVzaChuZXcgYyh0KSktMTtuLnNldCh0Lm5hbWUsZSk7fWZvcihsZXQgbj0wO248dGhpcy5fbm9kZXMubGVuZ3RoO24rKyl7Y29uc3Qgcj10aGlzLl9ub2Rlc1tuXSxvPWUubm9kZVtuXTtpZighby5vdXRwdXQpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIG91dHB1dCBmb3Igbm9kZTogJHtvLm5hbWV9YCk7Zm9yKGNvbnN0IGUgb2Ygby5vdXRwdXQpe2xldCBpPXQuZ2V0KGUpO2lmKHZvaWQgMD09PWkmJihpPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbCktMSx0LnNldChlLGkpKSxyLm91dHB1dHMucHVzaChpKSx2b2lkIDAhPT10aGlzLl9hbGxEYXRhW2ldLl9mcm9tKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke2l9YCk7aWYodGhpcy5fYWxsRGF0YVtpXS5fZnJvbT1uLCJDb25zdGFudCI9PT1vLm9wVHlwZSl7aWYoIW8uYXR0cmlidXRlfHwxIT09by5hdHRyaWJ1dGUubGVuZ3RofHwhby5hdHRyaWJ1dGVbMF0udCl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgYXR0cmlidXRlcyBvciBtaXNzaW5nIHRlbnNvciB2YWx1ZSBpbiBhdHRyaWJ1dGVzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7aWYoIW8ub3V0cHV0fHwxIT09by5vdXRwdXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBvdXRwdXQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXRzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7ci5vdXRwdXRzLnBvcCgpLHIuZXhlY3V0ZU5vZGU9ITEsdGhpcy5fYWxsRGF0YVtpXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2ldLnRlbnNvcj1zLlRlbnNvci5mcm9tUHJvdG8oby5hdHRyaWJ1dGVbMF0udCk7fX19Zm9yKGxldCBuPTA7bjx0aGlzLl9ub2Rlcy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuX25vZGVzW25dLG89ZS5ub2RlW25dO2lmKCFvLmlucHV0KXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBpbnB1dCBmb3Igbm9kZTogJHtvLm5hbWV9YCk7Zm9yKGNvbnN0IGUgb2Ygby5pbnB1dCl7Y29uc3QgaT10LmdldChlKTtpZih2b2lkIDA9PT1pKXtpZigiIj09PWUmJigzPT09by5pbnB1dC5sZW5ndGh8fDQ9PT1vLmlucHV0Lmxlbmd0aCkmJiJSZXNpemUiPT09by5vcFR5cGUpY29udGludWU7dGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgaW5wdXQgJyR7ZX0nIGZvciBub2RlOiAke28ubmFtZX1gKX1yLmlucHV0cy5wdXNoKGkpLHRoaXMuX2FsbERhdGFbaV0uX3RvLnB1c2gobik7fX1yZXR1cm4gITB9YnVpbGRHcmFwaEZyb21PcnRGb3JtYXQoZSl7dmFyIHQsbixyO2NvbnN0IG89bmV3IE1hcDt0aGlzLl9hbGxEYXRhPVtdLHRoaXMuX2FsbElucHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxJbnB1dE5hbWVzPVtdLHRoaXMuX2FsbE91dHB1dEluZGljZXM9W10sdGhpcy5fYWxsT3V0cHV0TmFtZXM9W10sdGhpcy5fbm9kZXM9W107Y29uc3QgaT1uZXcgTWFwLHA9W107Zm9yKGxldCBpPTA7aTxlLmlucHV0c0xlbmd0aCgpO2krKyl7Y29uc3Qgcz1lLmlucHV0cyhpKTtpZihvLmhhcyhzKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgaW5wdXQgbmFtZTogJHtzfWApO2ZvcihsZXQgaT0wO2k8ZS5ub2RlQXJnc0xlbmd0aCgpO2krKylpZigobnVsbD09PSh0PWUubm9kZUFyZ3MoaSkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lm5hbWUoKSk9PT1zKXtjb25zdCB0PW5ldyBsO2lmKChudWxsPT09KHI9bnVsbD09PShuPWUubm9kZUFyZ3MoaSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnR5cGUoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIudmFsdWVUeXBlKCkpIT09dS5UeXBlSW5mb1ZhbHVlLnRlbnNvcl90eXBlKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB2YWx1ZSB0eXBlIGZvciB0aGUgbm9kZUFyZy4iKTtjb25zdCBjPWUubm9kZUFyZ3MoaSkudHlwZSgpLnZhbHVlKG5ldyB1LlRlbnNvclR5cGVBbmRTaGFwZSksZD1hLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhjLmVsZW1UeXBlKCkpLGY9Yy5zaGFwZSgpLGg9W107Zm9yKGxldCBlPTA7ZTxmLmRpbUxlbmd0aCgpO2UrKyloLnB1c2goYS5Mb25nVXRpbC5sb25nVG9OdW1iZXIoZi5kaW0oZSkudmFsdWUoKS5kaW1WYWx1ZSgpKSk7dC50eXBlPXtzaGFwZTp7ZGltczpofSx0ZW5zb3JUeXBlOmR9O2NvbnN0IGc9dGhpcy5fYWxsRGF0YS5wdXNoKHQpLTE7by5zZXQocyxnKSxwLnB1c2gocyk7fX1mb3IobGV0IHQ9MDt0PGUuaW5pdGlhbGl6ZXJzTGVuZ3RoKCk7dCsrKXtjb25zdCBuPWUuaW5pdGlhbGl6ZXJzKHQpO2xldCByPW8uZ2V0KG4ubmFtZSgpKTtpZih2b2lkIDA9PT1yKXtjb25zdCBlPW5ldyBsLHQ9YS5Qcm90b1V0aWwudGVuc29yRGltc0Zyb21PUlRGb3JtYXQobiksaT1hLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhuLmRhdGFUeXBlKCkpO2UudHlwZT17c2hhcGU6e2RpbXM6dH0sdGVuc29yVHlwZTppfSxyPXRoaXMuX2FsbERhdGEucHVzaChlKS0xLG8uc2V0KG4ubmFtZSgpLHIpO310aGlzLl9hbGxEYXRhW3JdLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbcl0udGVuc29yPXMuVGVuc29yLmZyb21PcnRUZW5zb3Iobik7fWZvcihsZXQgZT0wO2U8dGhpcy5fYWxsRGF0YS5sZW5ndGg7ZSsrKXRoaXMuX2FsbERhdGFbZV0udGVuc29yfHwodGhpcy5fYWxsSW5wdXRJbmRpY2VzLnB1c2goZSksdGhpcy5fYWxsSW5wdXROYW1lcy5wdXNoKHBbZV0pKTtmb3IobGV0IHQ9MDt0PGUub3V0cHV0c0xlbmd0aCgpO3QrKyl7Y29uc3Qgbj1lLm91dHB1dHModCk7aWYoby5oYXMobikpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG91dHB1dCBuYW1lOiAke259YCk7Y29uc3Qgcj10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGwpLTE7by5zZXQobixyKSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzLnB1c2gociksdGhpcy5fYWxsT3V0cHV0TmFtZXMucHVzaChuKTt9aWYoIWUubm9kZXMpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBub2RlIik7Zm9yKGxldCB0PTA7dDxlLm5vZGVzTGVuZ3RoKCk7dCsrKXtjb25zdCBuPWUubm9kZXModCk7bGV0IHI9bi5uYW1lKCk7aWYoIXIpZm9yKGxldCBlPTA7cj1gdW5uYW1lZF8ke24ub3BUeXBlKCl9XyR7ZX1gLGkuaGFzKHIpO2UrKyk7aWYoaS5oYXMocikpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG5vZGUgbmFtZTogJHtyfWApO2NvbnN0IG89dGhpcy5fbm9kZXMucHVzaChuZXcgYyhuLHIpKS0xO2kuc2V0KHIsbyk7fWZvcihsZXQgdD0wO3Q8dGhpcy5fbm9kZXMubGVuZ3RoO3QrKyl7Y29uc3Qgbj10aGlzLl9ub2Rlc1t0XSxyPWUubm9kZXModCk7aWYobnVsbD09cil0aHJvdyBuZXcgRXJyb3IoYE5vIG5vZGUgZXhpc3RzIGF0IGluZGV4ICR7dH1gKTtpZigwPT09KG51bGw9PXI/dm9pZCAwOnIub3V0cHV0c0xlbmd0aCgpKSl0aHJvdyBuZXcgRXJyb3IoYG1pc3Npbmcgb3V0cHV0IGZvciBub2RlOiAke3IubmFtZX1gKTtmb3IobGV0IGU9MDtlPChudWxsPT1yP3ZvaWQgMDpyLm91dHB1dHNMZW5ndGgoKSk7ZSsrKXtjb25zdCBpPW51bGw9PXI/dm9pZCAwOnIub3V0cHV0cyhlKTtsZXQgYT1vLmdldChpKTtpZih2b2lkIDA9PT1hJiYoYT10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGwpLTEsby5zZXQoaSxhKSksbi5vdXRwdXRzLnB1c2goYSksdm9pZCAwIT09dGhpcy5fYWxsRGF0YVthXS5fZnJvbSl0aHJvdyBuZXcgRXJyb3IoYG11bHRpcGxlIG5vZGVzIG91dHB1dCB0byBvbmUgZGF0YSB2YWx1ZTogJHthfWApO2lmKHRoaXMuX2FsbERhdGFbYV0uX2Zyb209dCwiQ29uc3RhbnQiPT09ci5vcFR5cGUoKSl7aWYoMSE9PXIuYXR0cmlidXRlc0xlbmd0aCgpfHwhci5hdHRyaWJ1dGVzKDApLnQoKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgYXR0cmlidXRlcyBvciBtaXNzaW5nIHRlbnNvciB2YWx1ZSBpbiBhdHRyaWJ1dGVzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7aWYoMSE9PXIub3V0cHV0c0xlbmd0aCgpKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBvdXRwdXQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXRzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7bi5vdXRwdXRzLnBvcCgpLG4uZXhlY3V0ZU5vZGU9ITEsdGhpcy5fYWxsRGF0YVthXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2FdLnRlbnNvcj1zLlRlbnNvci5mcm9tT3J0VGVuc29yKHIuYXR0cmlidXRlcygwKS50KCkpO319fWZvcihsZXQgdD0wO3Q8dGhpcy5fbm9kZXMubGVuZ3RoO3QrKyl7Y29uc3Qgbj10aGlzLl9ub2Rlc1t0XSxyPWUubm9kZXModCk7aWYoMD09PXIuaW5wdXRzTGVuZ3RoKCkpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IGZvciBub2RlOiAke3IubmFtZX1gKTtmb3IobGV0IGU9MDtlPHIuaW5wdXRzTGVuZ3RoKCk7ZSsrKXtjb25zdCBpPXIuaW5wdXRzKGUpLHM9by5nZXQoaSk7aWYodm9pZCAwPT09cyl0aHJvdyBuZXcgRXJyb3IoYHVucmVjb2duaXplZCBpbnB1dCAnJHtpfScgZm9yIG5vZGU6ICR7ci5uYW1lKCl9YCk7bi5pbnB1dHMucHVzaChzKSx0aGlzLl9hbGxEYXRhW3NdLl90by5wdXNoKHQpO319fWNoZWNrSXNBY3ljbGljKCl7Y29uc3QgZT1uZXcgU2V0O3RoaXMuX2FsbElucHV0SW5kaWNlcy5mb3JFYWNoKCh0PT57dGhpcy5fYWxsRGF0YVt0XS5fdG8uZm9yRWFjaCgodD0+e2UuYWRkKHQpO30pKTt9KSk7Y29uc3QgdD1BcnJheS5mcm9tKGUpLG49bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCkuZmlsbCgid2hpdGUiKTtmb3IoO3QubGVuZ3RoPjA7KXtjb25zdCBlPXQucG9wKCk7ImdyYXkiPT09bltlXT9uW2VdPSJibGFjayI6KHQucHVzaChlKSxuW2VdPSJncmF5Iix0aGlzLl9ub2Rlc1tlXS5vdXRwdXRzLmZvckVhY2goKHI9Pntjb25zdCBvPXRoaXMuX2FsbERhdGFbcl07aWYodm9pZCAwIT09by50ZW5zb3IpdGhyb3cgbmV3IEVycm9yKCJub2RlIG91dHB1dHMgc2hvdWxkIG5vdCBiZSBpbml0aWFsaXplZCIpO2lmKG8uX2Zyb20hPT1lKXRocm93IG5ldyBFcnJvcigiZnJvbSBwcm9wZXJ0eSBvZiB0aGUgVmFsdWUgb2JqZWN0IGRvZXNuJ3QgbWF0Y2ggaW5kZXggb2YgTm9kZSBiZWluZyBwcm9jZXNzZWQiKTtvLl90by5mb3JFYWNoKChlPT57aWYoImdyYXkiPT09bltlXSl0aHJvdyBuZXcgRXJyb3IoIm1vZGVsIGdyYXBoIGlzIGN5Y2xpYyIpOyJ3aGl0ZSI9PT1uW2VdJiZ0LnB1c2goZSk7fSkpO30pKSk7fX10cmFuc2Zvcm1HcmFwaChlKXt0aGlzLnJlbW92ZUFsbElkZW50aXR5Tm9kZXMoKSx0aGlzLnJlbW92ZUFsbERyb3BvdXROb2RlcygpLHRoaXMuZnVzZUNvbnZBY3RpdmF0aW9uTm9kZXMoKSxlJiZlLnRyYW5zZm9ybUdyYXBoKHRoaXMpLHRoaXMuZmluYWxpemVHcmFwaCgpO31maW5hbGl6ZUdyYXBoKCl7bGV0IGU9MDtjb25zdCB0PW5ldyBBcnJheSh0aGlzLl9ub2Rlcy5sZW5ndGgsMCk7bGV0IG49MDtmb3IobGV0IGU9MDtlPHRoaXMuX25vZGVzLmxlbmd0aDtlKyspdFtlXT1uLHRoaXMuX25vZGVzW2VdLmV4ZWN1dGVOb2RlPyhuIT09ZSYmKHRoaXMuX25vZGVzW25dPXRoaXMuX25vZGVzW2VdKSxuKyspOnRoaXMuX25vZGVzW2VdLm91dHB1dHMuZm9yRWFjaCgoZT0+e3RoaXMuX2FsbERhdGFbZV0uX2Zyb209LTI7fSkpO3RoaXMuX25vZGVzLnNwbGljZShuLHRoaXMuX25vZGVzLmxlbmd0aC1uKTtmb3IobGV0IGU9MDtlPHRoaXMuX2FsbERhdGEubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLl9hbGxEYXRhW2VdO3ZvaWQgMCE9PW4uX2Zyb20mJi0xIT09bi5fZnJvbSYmLTIhPT1uLl9mcm9tJiYobi5fZnJvbT10W24uX2Zyb21dKTtmb3IobGV0IGU9MDtlPG4uX3RvLmxlbmd0aDtlKyspe2lmKCEobi5fdG9bZV0+PTApKXRocm93IG5ldyBFcnJvcigiVHJ5aW5nIHRvIHVwZGF0ZSBhIHJlbW92ZWQgbm9kZSIpO24uX3RvW2VdPXRbbi5fdG9bZV1dO319ZT0wO2ZvcihsZXQgdD0wO3Q8dGhpcy5fYWxsRGF0YS5sZW5ndGg7dCsrKWlmKC0yIT09dGhpcy5fYWxsRGF0YVt0XS5mcm9tfHwtMSE9PXRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZih0K2UpKXtpZihlPjApe2xldCBuPS0xO3ZvaWQgMCE9PXRoaXMuX2FsbERhdGFbdF0uZnJvbSYmLTEhPT10aGlzLl9hbGxEYXRhW3RdLmZyb20/KG49dGhpcy5fbm9kZXNbdGhpcy5fYWxsRGF0YVt0XS5mcm9tXS5vdXRwdXRzLmluZGV4T2YodCtlKSwtMSE9PW4mJih0aGlzLl9ub2Rlc1t0aGlzLl9hbGxEYXRhW3RdLmZyb21dLm91dHB1dHNbbl09dCkpOihuPXRoaXMuX2FsbElucHV0SW5kaWNlcy5pbmRleE9mKHQrZSksLTEhPT1uJiYodGhpcy5fYWxsSW5wdXRJbmRpY2VzW25dPXQpKSx0aGlzLl9hbGxEYXRhW3RdLnRvLmZvckVhY2goKHI9PntuPXRoaXMuX25vZGVzW3JdLmlucHV0cy5pbmRleE9mKHQrZSksLTEhPT1uJiYodGhpcy5fbm9kZXNbcl0uaW5wdXRzW25dPXQpO30pKSwwPT09dGhpcy5fYWxsRGF0YVt0XS50by5sZW5ndGgmJihuPXRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZih0K2UpLC0xIT09biYmKHRoaXMuX2FsbE91dHB1dEluZGljZXNbbl09dCkpO319ZWxzZSBlKyssdGhpcy5fYWxsRGF0YS5zcGxpY2UodCwxKSx0LS07fWRlbGV0ZU5vZGUoZSl7Y29uc3QgdD10aGlzLl9ub2Rlc1tlXTtpZih0Lm91dHB1dHMubGVuZ3RoPjEpZm9yKGxldCBlPTE7ZTx0Lm91dHB1dHMubGVuZ3RoO2UrKylpZih0aGlzLl9hbGxEYXRhW3Qub3V0cHV0c1tlXV0udG8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCJOb2RlIGRlbGV0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBvdXRwdXQgY29ubmVjdGVkIHRvIG90aGVyIG5vZGVzIGlzIG5vdCBzdXBwb3J0ZWQuICIpO3QuZXhlY3V0ZU5vZGU9ITE7Y29uc3Qgbj10LmlucHV0c1swXSxyPXQub3V0cHV0c1swXSxvPXRoaXMuX2FsbERhdGFbcl0udG87Zm9yKGxldCBuPTA7bjx0LmlucHV0cy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuX2FsbERhdGFbdC5pbnB1dHNbbl1dLnRvLmluZGV4T2YoZSk7aWYoLTE9PT1yKXRocm93IG5ldyBFcnJvcigiVGhlIFZhbHVlIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIGN1cnJlbnQgTm9kZSBpbiBpdCdzICd0bycgcHJvcGVydHkgIik7dGhpcy5fYWxsRGF0YVt0LmlucHV0c1tuXV0udG8uc3BsaWNlKHIsMSk7fXRoaXMuX2FsbERhdGFbcl0uX3RvPVtdO2NvbnN0IGk9dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHIpO2lmKC0xIT09aSYmKHRoaXMuX2FsbE91dHB1dEluZGljZXNbaV09biksbyYmby5sZW5ndGg+MClmb3IoY29uc3QgZSBvZiBvKXtjb25zdCB0PXRoaXMuX25vZGVzW2VdLmlucHV0cy5pbmRleE9mKHIpO2lmKC0xPT09dCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBOb2RlIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIG91dHB1dCBWYWx1ZSBpbiBpdCdzICdpbnB1dHMnIHByb3BlcnR5ICIpO3RoaXMuX25vZGVzW2VdLmlucHV0c1t0XT1uLHRoaXMuX2FsbERhdGFbbl0udG8ucHVzaChlKTt9fXJlbW92ZUFsbERyb3BvdXROb2Rlcygpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fbm9kZXMpe2lmKCJEcm9wb3V0Ij09PXQub3BUeXBlKXtpZigxIT09dC5pbnB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRHJvcG91dCBub2RlcyBzaG91bGQgb25seSBjb250YWluIG9uZSBpbnB1dC4gIik7aWYoMSE9PXQub3V0cHV0cy5sZW5ndGgmJjIhPT10Lm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRHJvcG91dCBub2RlcyBzaG91bGQgY29udGFpbiBlaXRoZXIgMSBvciAyIG91dHB1dChzKSIpO2lmKDI9PT10Lm91dHB1dHMubGVuZ3RoJiYwIT09dGhpcy5fYWxsRGF0YVt0Lm91dHB1dHNbMV1dLl90by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzJ3Mgc2Vjb25kIG91dHB1dCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYnkgb3RoZXIgbm9kZXMiKTt0aGlzLmRlbGV0ZU5vZGUoZSk7fWUrKzt9fXJlbW92ZUFsbElkZW50aXR5Tm9kZXMoKXtsZXQgZT0wO2Zvcihjb25zdCB0IG9mIHRoaXMuX25vZGVzKSJJZGVudGl0eSI9PT10Lm9wVHlwZSYmdGhpcy5kZWxldGVOb2RlKGUpLGUrKzt9aXNBY3RpdmF0aW9uKGUpe3N3aXRjaChlLm9wVHlwZSl7Y2FzZSJSZWx1IjpjYXNlIlNpZ21vaWQiOmNhc2UiQ2xpcCI6cmV0dXJuICEwO2RlZmF1bHQ6cmV0dXJuICExfX1mdXNlQ29udkFjdGl2YXRpb25Ob2Rlcygpe2Zvcihjb25zdCBlIG9mIHRoaXMuX25vZGVzKWlmKCJDb252Ij09PWUub3BUeXBlKXtjb25zdCB0PXRoaXMuX2FsbERhdGFbZS5vdXRwdXRzWzBdXS5fdG87aWYoMT09PXQubGVuZ3RoJiZ0aGlzLmlzQWN0aXZhdGlvbih0aGlzLl9ub2Rlc1t0WzBdXSkpe2NvbnN0IG49dGhpcy5fbm9kZXNbdFswXV07aWYoIkNsaXAiPT09bi5vcFR5cGUpaWYoMT09PW4uaW5wdXRzLmxlbmd0aCl0cnl7ZS5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFtuLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1pbiIpLG4uYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4IildKTt9Y2F0Y2godCl7ZS5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFthLk1JTl9DTElQLGEuTUFYX0NMSVBdKTt9ZWxzZSB7aWYoIShuLmlucHV0cy5sZW5ndGg+PTMmJnZvaWQgMCE9PXRoaXMuX2FsbERhdGFbbi5pbnB1dHNbMV1dLnRlbnNvciYmdm9pZCAwIT09dGhpcy5fYWxsRGF0YVtuLmlucHV0c1syXV0udGVuc29yKSljb250aW51ZTtlLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW3RoaXMuX2FsbERhdGFbbi5pbnB1dHNbMV1dLnRlbnNvci5mbG9hdERhdGFbMF0sdGhpcy5fYWxsRGF0YVtuLmlucHV0c1syXV0udGVuc29yLmZsb2F0RGF0YVswXV0pO31lLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uIiwic3RyaW5nIixuLm9wVHlwZSksdGhpcy5kZWxldGVOb2RlKHRbMF0pO319fX19LDEzMTU6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5ub3c9dC5Qcm9maWxlcj10LkxvZ2dlcj12b2lkIDA7Y29uc3Qgbj17dmVyYm9zZToxZTMsaW5mbzoyZTMsd2FybmluZzo0ZTMsZXJyb3I6NWUzLGZhdGFsOjZlM30scj17bm9uZTpuZXcgY2xhc3N7bG9nKGUsdCxuKXt9fSxjb25zb2xlOm5ldyBjbGFzc3tsb2coZSx0LG4pe2NvbnNvbGUubG9nKGAke3RoaXMuY29sb3IoZSl9ICR7bj8iG1szNW0iK24rIhtbMG0gIjoiIn0ke3R9YCk7fWNvbG9yKGUpe3N3aXRjaChlKXtjYXNlInZlcmJvc2UiOnJldHVybiAiG1szNDs0MG12G1swbSI7Y2FzZSJpbmZvIjpyZXR1cm4gIhtbMzJtaRtbMG0iO2Nhc2Uid2FybmluZyI6cmV0dXJuICIbWzMwOzQzbXcbWzBtIjtjYXNlImVycm9yIjpyZXR1cm4gIhtbMzE7NDBtZRtbMG0iO2Nhc2UiZmF0YWwiOnJldHVybiAiG1sxMDFtZhtbMG0iO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBzZXZlcml0eTogJHtlfWApfX19fSxvPXtwcm92aWRlcjoiY29uc29sZSIsbWluaW1hbFNldmVyaXR5OiJ3YXJuaW5nIixsb2dEYXRlVGltZTohMCxsb2dTb3VyY2VMb2NhdGlvbjohMX07bGV0IGk9eyIiOm99O2Z1bmN0aW9uIHMoZSx0LG4scil7aWYodm9pZCAwPT09dClyZXR1cm4gbz1lLHt2ZXJib3NlOnMudmVyYm9zZS5iaW5kKG51bGwsbyksaW5mbzpzLmluZm8uYmluZChudWxsLG8pLHdhcm5pbmc6cy53YXJuaW5nLmJpbmQobnVsbCxvKSxlcnJvcjpzLmVycm9yLmJpbmQobnVsbCxvKSxmYXRhbDpzLmZhdGFsLmJpbmQobnVsbCxvKX07aWYodm9pZCAwPT09bilhKGUsdCk7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIG4mJnZvaWQgMD09PXIpYShlLHQpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuJiZ2b2lkIDA9PT1yKWEoZSxuLDAsdCk7ZWxzZSB7aWYoInN0cmluZyIhPXR5cGVvZiBufHwibnVtYmVyIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgaXMgdmFsaWQiKTthKGUsbiwwLHQpO312YXIgbzt9ZnVuY3Rpb24gYShlLHQsbyxzKXtjb25zdCBhPWlbc3x8IiJdfHxpWyIiXTtuW2VdPG5bYS5taW5pbWFsU2V2ZXJpdHldfHwoYS5sb2dEYXRlVGltZSYmKHQ9YCR7KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfXwke3R9YCksYS5sb2dTb3VyY2VMb2NhdGlvbixyW2EucHJvdmlkZXJdLmxvZyhlLHQscykpO30hZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtpPXt9LG4oIiIsZXx8e30pO31mdW5jdGlvbiBuKGUsbil7aWYoIioiPT09ZSl0KG4pO2Vsc2Uge2NvbnN0IHQ9aVtlXXx8bztpW2VdPXtwcm92aWRlcjpuLnByb3ZpZGVyfHx0LnByb3ZpZGVyLG1pbmltYWxTZXZlcml0eTpuLm1pbmltYWxTZXZlcml0eXx8dC5taW5pbWFsU2V2ZXJpdHksbG9nRGF0ZVRpbWU6dm9pZCAwPT09bi5sb2dEYXRlVGltZT90LmxvZ0RhdGVUaW1lOm4ubG9nRGF0ZVRpbWUsbG9nU291cmNlTG9jYXRpb246dm9pZCAwPT09bi5sb2dTb3VyY2VMb2NhdGlvbj90LmxvZ1NvdXJjZUxvY2F0aW9uOm4ubG9nU291cmNlTG9jYXRpb259O319ZS52ZXJib3NlPWZ1bmN0aW9uKHQsbil7ZSgidmVyYm9zZSIsdCxuKTt9LGUuaW5mbz1mdW5jdGlvbih0LG4pe2UoImluZm8iLHQsbik7fSxlLndhcm5pbmc9ZnVuY3Rpb24odCxuKXtlKCJ3YXJuaW5nIix0LG4pO30sZS5lcnJvcj1mdW5jdGlvbih0LG4pe2UoImVycm9yIix0LG4pO30sZS5mYXRhbD1mdW5jdGlvbih0LG4pe2UoImZhdGFsIix0LG4pO30sZS5yZXNldD10LGUuc2V0PW4sZS5zZXRXaXRoRW52PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9e307ZS5sb2dMZXZlbCYmKHQubWluaW1hbFNldmVyaXR5PWUubG9nTGV2ZWwpLG4oIiIsdCk7fTt9KHN8fChzPXt9KSksdC5Mb2dnZXI9cztjbGFzcyB1e2NvbnN0cnVjdG9yKGUsdCxuLHIsbyxpKXt0aGlzLmNhdGVnb3J5PWUsdGhpcy5uYW1lPXQsdGhpcy5zdGFydFRpbWU9bix0aGlzLmVuZENhbGxiYWNrPXIsdGhpcy50aW1lcj1vLHRoaXMuY3R4PWk7fWFzeW5jIGVuZCgpe3JldHVybiB0aGlzLmVuZENhbGxiYWNrKHRoaXMpfWFzeW5jIGNoZWNrVGltZXIoKXtpZih2b2lkIDA9PT10aGlzLmN0eHx8dm9pZCAwPT09dGhpcy50aW1lcil0aHJvdyBuZXcgRXJyb3IoIk5vIHdlYmdsIHRpbWVyIGZvdW5kIik7cmV0dXJuIHRoaXMuY3R4LmVuZFRpbWVyKCksdGhpcy5jdHgud2FpdEZvclF1ZXJ5QW5kR2V0VGltZSh0aGlzLnRpbWVyKX19Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLHQsbixyKXt0aGlzLmNhdGVnb3J5PWUsdGhpcy5uYW1lPXQsdGhpcy5zdGFydFRpbWU9bix0aGlzLmVuZFRpbWU9cjt9fXQuUHJvZmlsZXI9Y2xhc3N7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gdm9pZCAwPT09ZT9uZXcgdGhpczpuZXcgdGhpcyhlLm1heE51bWJlckV2ZW50cyxlLmZsdXNoQmF0Y2hTaXplLGUuZmx1c2hJbnRlcnZhbEluTWlsbGlzZWNvbmRzKX1jb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9mbHVzaFBvaW50ZXI9MCx0aGlzLl9zdGFydGVkPSExLHRoaXMuX21heE51bWJlckV2ZW50cz12b2lkIDA9PT1lPzFlNDplLHRoaXMuX2ZsdXNoQmF0Y2hTaXplPXZvaWQgMD09PXQ/MTA6dCx0aGlzLl9mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHM9dm9pZCAwPT09bj81ZTM6bjt9c3RhcnQoKXt0aGlzLl9zdGFydGVkPSEwLHRoaXMuX3RpbWluZ0V2ZW50cz1bXSx0aGlzLl9mbHVzaFRpbWU9KDAsIHQubm93KSgpLHRoaXMuX2ZsdXNoUG9pbnRlcj0wO31zdG9wKCl7Zm9yKHRoaXMuX3N0YXJ0ZWQ9ITE7dGhpcy5fZmx1c2hQb2ludGVyPHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg7dGhpcy5fZmx1c2hQb2ludGVyKyspdGhpcy5sb2dPbmVFdmVudCh0aGlzLl90aW1pbmdFdmVudHNbdGhpcy5fZmx1c2hQb2ludGVyXSk7fWV2ZW50KGUsdCxuLHIpe2NvbnN0IG89dGhpcy5fc3RhcnRlZD90aGlzLmJlZ2luKGUsdCxyKTp2b2lkIDA7bGV0IGk9ITE7Y29uc3Qgcz1uKCk7aWYocyYmImZ1bmN0aW9uIj09dHlwZW9mIHMudGhlbilyZXR1cm4gaT0hMCxuZXcgUHJvbWlzZSgoKGUsdCk9PntzLnRoZW4oKGFzeW5jIHQ9PntvJiZhd2FpdCBvLmVuZCgpLGUodCk7fSksKGFzeW5jIGU9PntvJiZhd2FpdCBvLmVuZCgpLHQoZSk7fSkpO30pKTtpZighaSYmbyl7Y29uc3QgZT1vLmVuZCgpO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRoZW4pcmV0dXJuIG5ldyBQcm9taXNlKCgodCxuKT0+e2UudGhlbigoKCk9Pnt0KHMpO30pLChlPT57bihlKTt9KSk7fSkpfXJldHVybiBzfWJlZ2luKGUsbixyKXtpZighdGhpcy5fc3RhcnRlZCl0aHJvdyBuZXcgRXJyb3IoInByb2ZpbGVyIGlzIG5vdCBzdGFydGVkIHlldCIpO2lmKHZvaWQgMD09PXIpe2NvbnN0IHI9KDAsIHQubm93KSgpO3JldHVybiB0aGlzLmZsdXNoKHIpLG5ldyB1KGUsbixyLChlPT50aGlzLmVuZFN5bmMoZSkpKX17Y29uc3QgdD1yLmJlZ2luVGltZXIoKTtyZXR1cm4gbmV3IHUoZSxuLDAsKGFzeW5jIGU9PnRoaXMuZW5kKGUpKSx0LHIpfX1hc3luYyBlbmQoZSl7Y29uc3QgdD1hd2FpdCBlLmNoZWNrVGltZXIoKTt0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoPHRoaXMuX21heE51bWJlckV2ZW50cyYmKHRoaXMuX3RpbWluZ0V2ZW50cy5wdXNoKG5ldyBsKGUuY2F0ZWdvcnksZS5uYW1lLGUuc3RhcnRUaW1lLHQpKSx0aGlzLmZsdXNoKHQpKTt9ZW5kU3luYyhlKXtjb25zdCBuPSgwLCB0Lm5vdykoKTt0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoPHRoaXMuX21heE51bWJlckV2ZW50cyYmKHRoaXMuX3RpbWluZ0V2ZW50cy5wdXNoKG5ldyBsKGUuY2F0ZWdvcnksZS5uYW1lLGUuc3RhcnRUaW1lLG4pKSx0aGlzLmZsdXNoKG4pKTt9bG9nT25lRXZlbnQoZSl7dC5Mb2dnZXIudmVyYm9zZShgUHJvZmlsZXIuJHtlLmNhdGVnb3J5fWAsYCR7KGUuZW5kVGltZS1lLnN0YXJ0VGltZSkudG9GaXhlZCgyKX1tcyBvbiBldmVudCAnJHtlLm5hbWV9JyBhdCAke2UuZW5kVGltZS50b0ZpeGVkKDIpfWApO31mbHVzaChlKXtpZih0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoLXRoaXMuX2ZsdXNoUG9pbnRlcj49dGhpcy5fZmx1c2hCYXRjaFNpemV8fGUtdGhpcy5fZmx1c2hUaW1lPj10aGlzLl9mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHMpe2Zvcihjb25zdCBlPXRoaXMuX2ZsdXNoUG9pbnRlcjt0aGlzLl9mbHVzaFBvaW50ZXI8ZSt0aGlzLl9mbHVzaEJhdGNoU2l6ZSYmdGhpcy5fZmx1c2hQb2ludGVyPHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg7dGhpcy5fZmx1c2hQb2ludGVyKyspdGhpcy5sb2dPbmVFdmVudCh0aGlzLl90aW1pbmdFdmVudHNbdGhpcy5fZmx1c2hQb2ludGVyXSk7dGhpcy5fZmx1c2hUaW1lPSgwLCB0Lm5vdykoKTt9fWdldCBzdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9fSx0Lm5vdz0idW5kZWZpbmVkIiE9dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/KCk9PnBlcmZvcm1hbmNlLm5vdygpOkRhdGUubm93O30sMTc0NTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTW9kZWw9dm9pZCAwO2NvbnN0IHI9big1Njg2KSxvPW4oNDY2MiksaT1uKDUxMjcpLHM9bigyNDQ2KSxhPW4oNzI3Myk7dmFyIHU9aS5vbm54cnVudGltZS5leHBlcmltZW50YWwuZmJzO3QuTW9kZWw9Y2xhc3N7Y29uc3RydWN0b3IoKXt9bG9hZChlLHQsbil7aWYoIW4pdHJ5e3JldHVybiB2b2lkIHRoaXMubG9hZEZyb21Pbm54Rm9ybWF0KGUsdCl9Y2F0Y2goZSl7aWYodm9pZCAwIT09bil0aHJvdyBlfXRoaXMubG9hZEZyb21PcnRGb3JtYXQoZSx0KTt9bG9hZEZyb21Pbm54Rm9ybWF0KGUsdCl7Y29uc3Qgbj1zLm9ubnguTW9kZWxQcm90by5kZWNvZGUoZSk7aWYoYS5Mb25nVXRpbC5sb25nVG9OdW1iZXIobi5pclZlcnNpb24pPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9bi5vcHNldEltcG9ydC5tYXAoKGU9Pih7ZG9tYWluOmUuZG9tYWluLHZlcnNpb246YS5Mb25nVXRpbC5sb25nVG9OdW1iZXIoZS52ZXJzaW9uKX0pKSksdGhpcy5fZ3JhcGg9by5HcmFwaC5mcm9tKG4uZ3JhcGgsdCk7fWxvYWRGcm9tT3J0Rm9ybWF0KGUsdCl7Y29uc3Qgbj1uZXcgci5mbGF0YnVmZmVycy5CeXRlQnVmZmVyKGUpLGk9dS5JbmZlcmVuY2VTZXNzaW9uLmdldFJvb3RBc0luZmVyZW5jZVNlc3Npb24obikubW9kZWwoKTtpZihhLkxvbmdVdGlsLmxvbmdUb051bWJlcihpLmlyVmVyc2lvbigpKTwzKXRocm93IG5ldyBFcnJvcigib25seSBzdXBwb3J0IE9OTlggbW9kZWwgd2l0aCBJUl9WRVJTSU9OPj0zIik7dGhpcy5fb3BzZXRzPVtdO2ZvcihsZXQgZT0wO2U8aS5vcHNldEltcG9ydExlbmd0aCgpO2UrKyl7Y29uc3QgdD1pLm9wc2V0SW1wb3J0KGUpO3RoaXMuX29wc2V0cy5wdXNoKHtkb21haW46bnVsbD09dD92b2lkIDA6dC5kb21haW4oKSx2ZXJzaW9uOmEuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKHQudmVyc2lvbigpKX0pO310aGlzLl9ncmFwaD1vLkdyYXBoLmZyb20oaS5ncmFwaCgpLHQpO31nZXQgZ3JhcGgoKXtyZXR1cm4gdGhpcy5fZ3JhcGh9Z2V0IG9wc2V0cygpe3JldHVybiB0aGlzLl9vcHNldHN9fTt9LDYxNDU6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5GTE9BVF9UWVBFUz10LklOVF9UWVBFUz10Lk5VTUJFUl9UWVBFUz12b2lkIDAsdC5OVU1CRVJfVFlQRVM9WyJmbG9hdDMyIiwiZmxvYXQ2NCIsImludDMyIiwiaW50MTYiLCJpbnQ4IiwidWludDE2IiwidWludDMyIiwidWludDgiXSx0LklOVF9UWVBFUz1bImludDMyIiwiaW50MTYiLCJpbnQ4IiwidWludDE2IiwidWludDMyIiwidWludDgiXSx0LkZMT0FUX1RZUEVTPVsiZmxvYXQzMiIsImZsb2F0NjQiXTt9LDU4ODE6KGUsdCk9PntmdW5jdGlvbiBuKGUsdCl7aWYodC5lbmRzV2l0aCgiKyIpKXtjb25zdCBuPU51bWJlci5wYXJzZUludCh0LnN1YnN0cmluZygwLHQubGVuZ3RoLTEpLDEwKTtyZXR1cm4gIWlzTmFOKG4pJiZuPD1lfWlmKDI9PT10LnNwbGl0KCItIikubGVuZ3RoKXtjb25zdCBuPXQuc3BsaXQoIi0iKSxyPU51bWJlci5wYXJzZUludChuWzBdLDEwKSxvPU51bWJlci5wYXJzZUludChuWzFdLDEwKTtyZXR1cm4gIWlzTmFOKHIpJiYhaXNOYU4obykmJnI8PWUmJmU8PW99cmV0dXJuIE51bWJlci5wYXJzZUludCh0LDEwKT09PWV9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVzb2x2ZU9wZXJhdG9yPXZvaWQgMCx0LnJlc29sdmVPcGVyYXRvcj1mdW5jdGlvbihlLHQscil7Zm9yKGNvbnN0IG8gb2Ygcil7Y29uc3Qgcj1vWzBdLGk9b1sxXSxzPW9bMl0sYT1vWzNdLHU9b1s0XTtpZihlLm9wVHlwZT09PXIpZm9yKGNvbnN0IGUgb2YgdClpZigoZS5kb21haW49PT1pfHwiYWkub25ueCI9PT1lLmRvbWFpbiYmIiI9PT1pKSYmbihlLnZlcnNpb24scykpcmV0dXJuIHtvcEltcGw6YSxvcEluaXQ6dX19dGhyb3cgbmV3IFR5cGVFcnJvcihgY2Fubm90IHJlc29sdmUgb3BlcmF0b3IgJyR7ZS5vcFR5cGV9JyB3aXRoIG9wc2V0czogJHt0Lm1hcCgoZT0+YCR7ZS5kb21haW58fCJhaS5vbm54In0gdiR7ZS52ZXJzaW9ufWApKS5qb2luKCIsICIpfWApfTt9LDUxMjc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lm9ubnhydW50aW1lPXZvaWQgMDtjb25zdCByPW4oNTY4Nik7dmFyIG8saTsoKGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuVU5ERUZJTkVEPTBdPSJVTkRFRklORUQiLGVbZS5GTE9BVD0xXT0iRkxPQVQiLGVbZS5JTlQ9Ml09IklOVCIsZVtlLlNUUklORz0zXT0iU1RSSU5HIixlW2UuVEVOU09SPTRdPSJURU5TT1IiLGVbZS5HUkFQSD01XT0iR1JBUEgiLGVbZS5GTE9BVFM9Nl09IkZMT0FUUyIsZVtlLklOVFM9N109IklOVFMiLGVbZS5TVFJJTkdTPThdPSJTVFJJTkdTIixlW2UuVEVOU09SUz05XT0iVEVOU09SUyIsZVtlLkdSQVBIUz0xMF09IkdSQVBIUyIsZVtlLlNQQVJTRV9URU5TT1I9MTFdPSJTUEFSU0VfVEVOU09SIixlW2UuU1BBUlNFX1RFTlNPUlM9MTJdPSJTUEFSU0VfVEVOU09SUyI7fShlLkF0dHJpYnV0ZVR5cGV8fChlLkF0dHJpYnV0ZVR5cGU9e30pKTt9KSkoKGk9KG89dC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKS5leHBlcmltZW50YWx8fChvLmV4cGVyaW1lbnRhbD17fSkpLmZic3x8KGkuZmJzPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZVtlLlVOS05PV049MF09IlVOS05PV04iLGVbZS5WQUxVRT0xXT0iVkFMVUUiLGVbZS5QQVJBTT0yXT0iUEFSQU0iO30oZS5EaW1lbnNpb25WYWx1ZVR5cGV8fChlLkRpbWVuc2lvblZhbHVlVHlwZT17fSkpO30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuVU5ERUZJTkVEPTBdPSJVTkRFRklORUQiLGVbZS5GTE9BVD0xXT0iRkxPQVQiLGVbZS5VSU5UOD0yXT0iVUlOVDgiLGVbZS5JTlQ4PTNdPSJJTlQ4IixlW2UuVUlOVDE2PTRdPSJVSU5UMTYiLGVbZS5JTlQxNj01XT0iSU5UMTYiLGVbZS5JTlQzMj02XT0iSU5UMzIiLGVbZS5JTlQ2ND03XT0iSU5UNjQiLGVbZS5TVFJJTkc9OF09IlNUUklORyIsZVtlLkJPT0w9OV09IkJPT0wiLGVbZS5GTE9BVDE2PTEwXT0iRkxPQVQxNiIsZVtlLkRPVUJMRT0xMV09IkRPVUJMRSIsZVtlLlVJTlQzMj0xMl09IlVJTlQzMiIsZVtlLlVJTlQ2ND0xM109IlVJTlQ2NCIsZVtlLkNPTVBMRVg2ND0xNF09IkNPTVBMRVg2NCIsZVtlLkNPTVBMRVgxMjg9MTVdPSJDT01QTEVYMTI4IixlW2UuQkZMT0FUMTY9MTZdPSJCRkxPQVQxNiIsZVtlLkZMT0FUOEU0TTNGTj0xN109IkZMT0FUOEU0TTNGTiIsZVtlLkZMT0FUOEU0TTNGTlVaPTE4XT0iRkxPQVQ4RTRNM0ZOVVoiLGVbZS5GTE9BVDhFNU0yPTE5XT0iRkxPQVQ4RTVNMiIsZVtlLkZMT0FUOEU1TTJGTlVaPTIwXT0iRkxPQVQ4RTVNMkZOVVoiO30oZS5UZW5zb3JEYXRhVHlwZXx8KGUuVGVuc29yRGF0YVR5cGU9e30pKTt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZVtlLlByaW1pdGl2ZT0wXT0iUHJpbWl0aXZlIixlW2UuRnVzZWQ9MV09IkZ1c2VkIjt9KGUuTm9kZVR5cGV8fChlLk5vZGVUeXBlPXt9KSk7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2VbZS5OT05FPTBdPSJOT05FIixlW2UudGVuc29yX3R5cGU9MV09InRlbnNvcl90eXBlIixlW2Uuc2VxdWVuY2VfdHlwZT0yXT0ic2VxdWVuY2VfdHlwZSIsZVtlLm1hcF90eXBlPTNdPSJtYXBfdHlwZSI7fShlLlR5cGVJbmZvVmFsdWV8fChlLlR5cGVJbmZvVmFsdWU9e30pKTt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNTaGFwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2hhcGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRpbSh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfWRpbUxlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRTaGFwZShlKXtlLnN0YXJ0T2JqZWN0KDEpO31zdGF0aWMgYWRkRGltKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBjcmVhdGVEaW1WZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRTaGFwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2hhcGUoZSx0KXtyZXR1cm4gbi5zdGFydFNoYXBlKGUpLG4uYWRkRGltKGUsdCksbi5lbmRTaGFwZShlKX19dC5TaGFwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc0RpbWVuc2lvbihlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGltZW5zaW9uKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX12YWx1ZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkRpbWVuc2lvblZhbHVlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9ZGVub3RhdGlvbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvbihlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkVmFsdWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZERlbm90YXRpb24oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGVuZERpbWVuc2lvbihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRGltZW5zaW9uKGUsdCxyKXtyZXR1cm4gbi5zdGFydERpbWVuc2lvbihlKSxuLmFkZFZhbHVlKGUsdCksbi5hZGREZW5vdGF0aW9uKGUsciksbi5lbmREaW1lbnNpb24oZSl9fXQuRGltZW5zaW9uPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRGltZW5zaW9uVmFsdWUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0RpbWVuc2lvblZhbHVlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1kaW1UeXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ4KHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb25WYWx1ZVR5cGUuVU5LTk9XTn1kaW1WYWx1ZSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltUGFyYW0oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1zdGF0aWMgc3RhcnREaW1lbnNpb25WYWx1ZShlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkRGltVHlwZSh0LG4pe3QuYWRkRmllbGRJbnQ4KDAsbixlLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uVmFsdWVUeXBlLlVOS05PV04pO31zdGF0aWMgYWRkRGltVmFsdWUoZSx0KXtlLmFkZEZpZWxkSW50NjQoMSx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZERpbVBhcmFtKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBlbmREaW1lbnNpb25WYWx1ZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRGltZW5zaW9uVmFsdWUoZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnREaW1lbnNpb25WYWx1ZShlKSxuLmFkZERpbVR5cGUoZSx0KSxuLmFkZERpbVZhbHVlKGUsciksbi5hZGREaW1QYXJhbShlLG8pLG4uZW5kRGltZW5zaW9uVmFsdWUoZSl9fXQuRGltZW5zaW9uVmFsdWU9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNUZW5zb3JUeXBlQW5kU2hhcGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvclR5cGVBbmRTaGFwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9ZWxlbVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUR9c2hhcGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5TaGFwZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFRlbnNvclR5cGVBbmRTaGFwZShlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkRWxlbVR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMCxuLGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkU2hhcGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGVuZFRlbnNvclR5cGVBbmRTaGFwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGVuc29yVHlwZUFuZFNoYXBlKGUsdCxyKXtyZXR1cm4gbi5zdGFydFRlbnNvclR5cGVBbmRTaGFwZShlKSxuLmFkZEVsZW1UeXBlKGUsdCksbi5hZGRTaGFwZShlLHIpLG4uZW5kVGVuc29yVHlwZUFuZFNoYXBlKGUpfX10LlRlbnNvclR5cGVBbmRTaGFwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc01hcFR5cGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01hcFR5cGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWtleVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUR9dmFsdWVUeXBlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRNYXBUeXBlKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRLZXlUeXBlKHQsbil7dC5hZGRGaWVsZEludDMyKDAsbixlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yRGF0YVR5cGUuVU5ERUZJTkVEKTt9c3RhdGljIGFkZFZhbHVlVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kTWFwVHlwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTWFwVHlwZShlLHQscil7cmV0dXJuIG4uc3RhcnRNYXBUeXBlKGUpLG4uYWRkS2V5VHlwZShlLHQpLG4uYWRkVmFsdWVUeXBlKGUsciksbi5lbmRNYXBUeXBlKGUpfX10Lk1hcFR5cGU9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNTZXF1ZW5jZVR5cGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NlcXVlbmNlVHlwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9ZWxlbVR5cGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFNlcXVlbmNlVHlwZShlKXtlLnN0YXJ0T2JqZWN0KDEpO31zdGF0aWMgYWRkRWxlbVR5cGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGVuZFNlcXVlbmNlVHlwZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2VxdWVuY2VUeXBlKGUsdCl7cmV0dXJuIG4uc3RhcnRTZXF1ZW5jZVR5cGUoZSksbi5hZGRFbGVtVHlwZShlLHQpLG4uZW5kU2VxdWVuY2VUeXBlKGUpfX10LlNlcXVlbmNlVHlwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7KGUuZmJzfHwoZS5mYnM9e30pKS5FZGdlRW5kPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfW5vZGVJbmRleCgpe3JldHVybiB0aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MpfXNyY0FyZ0luZGV4KCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKzQpfWRzdEFyZ0luZGV4KCl7cmV0dXJuIHRoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zKzgpfXN0YXRpYyBjcmVhdGVFZGdlRW5kKGUsdCxuLHIpe3JldHVybiBlLnByZXAoNCwxMiksZS53cml0ZUludDMyKHIpLGUud3JpdGVJbnQzMihuKSxlLndyaXRlSW50MzIodCksZS5vZmZzZXQoKX19O30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc05vZGVFZGdlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNOb2RlRWRnZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bm9kZUluZGV4KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MrZSk6MH1pbnB1dEVkZ2VzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5FZGdlRW5kKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSsxMip0LHRoaXMuYmIpOm51bGx9aW5wdXRFZGdlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1vdXRwdXRFZGdlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuRWRnZUVuZCkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrMTIqdCx0aGlzLmJiKTpudWxsfW91dHB1dEVkZ2VzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydE5vZGVFZGdlKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGROb2RlSW5kZXgoZSx0KXtlLmFkZEZpZWxkSW50MzIoMCx0LDApO31zdGF0aWMgYWRkSW5wdXRFZGdlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgc3RhcnRJbnB1dEVkZ2VzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3RvcigxMix0LDQpO31zdGF0aWMgYWRkT3V0cHV0RWRnZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIHN0YXJ0T3V0cHV0RWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDEyLHQsNCk7fXN0YXRpYyBlbmROb2RlRWRnZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTm9kZUVkZ2UoZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnROb2RlRWRnZShlKSxuLmFkZE5vZGVJbmRleChlLHQpLG4uYWRkSW5wdXRFZGdlcyhlLHIpLG4uYWRkT3V0cHV0RWRnZXMoZSxvKSxuLmVuZE5vZGVFZGdlKGUpfX10Lk5vZGVFZGdlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTm9kZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvbWFpbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXNpbmNlVmVyc2lvbigpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBlP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK2UpOjB9aW5kZXgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MrZSk6MH1vcFR5cGUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9dHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5Ob2RlVHlwZS5QcmltaXRpdmV9ZXhlY3V0aW9uUHJvdmlkZXJUeXBlKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWlucHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1pbnB1dHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW91dHB1dHMoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9b3V0cHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9YXR0cmlidXRlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkF0dHJpYnV0ZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1hdHRyaWJ1dGVzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1pbnB1dEFyZ0NvdW50cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzQqZSk6MH1pbnB1dEFyZ0NvdW50c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9aW5wdXRBcmdDb3VudHNBcnJheSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBlP25ldyBJbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1pbXBsaWNpdElucHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1pbXBsaWNpdElucHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0Tm9kZShlKXtlLnN0YXJ0T2JqZWN0KDEzKTt9c3RhdGljIGFkZE5hbWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkRG9tYWluKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBhZGRTaW5jZVZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50MzIoMyx0LDApO31zdGF0aWMgYWRkSW5kZXgoZSx0KXtlLmFkZEZpZWxkSW50MzIoNCx0LDApO31zdGF0aWMgYWRkT3BUeXBlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg1LHQsMCk7fXN0YXRpYyBhZGRUeXBlKHQsbil7dC5hZGRGaWVsZEludDMyKDYsbixlLmV4cGVyaW1lbnRhbC5mYnMuTm9kZVR5cGUuUHJpbWl0aXZlKTt9c3RhdGljIGFkZEV4ZWN1dGlvblByb3ZpZGVyVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoNyx0LDApO31zdGF0aWMgYWRkSW5wdXRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg4LHQsMCk7fXN0YXRpYyBjcmVhdGVJbnB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRPdXRwdXRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg5LHQsMCk7fXN0YXRpYyBjcmVhdGVPdXRwdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE91dHB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEF0dHJpYnV0ZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEwLHQsMCk7fXN0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZElucHV0QXJnQ291bnRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxMSx0LDApO31zdGF0aWMgY3JlYXRlSW5wdXRBcmdDb3VudHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQzMih0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dEFyZ0NvdW50c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkSW1wbGljaXRJbnB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEyLHQsMCk7fXN0YXRpYyBjcmVhdGVJbXBsaWNpdElucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbXBsaWNpdElucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgZW5kTm9kZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTm9kZShlLHQscixvLGkscyxhLHUsbCxjLHAsZCxmLGgpe3JldHVybiBuLnN0YXJ0Tm9kZShlKSxuLmFkZE5hbWUoZSx0KSxuLmFkZERvY1N0cmluZyhlLHIpLG4uYWRkRG9tYWluKGUsbyksbi5hZGRTaW5jZVZlcnNpb24oZSxpKSxuLmFkZEluZGV4KGUscyksbi5hZGRPcFR5cGUoZSxhKSxuLmFkZFR5cGUoZSx1KSxuLmFkZEV4ZWN1dGlvblByb3ZpZGVyVHlwZShlLGwpLG4uYWRkSW5wdXRzKGUsYyksbi5hZGRPdXRwdXRzKGUscCksbi5hZGRBdHRyaWJ1dGVzKGUsZCksbi5hZGRJbnB1dEFyZ0NvdW50cyhlLGYpLG4uYWRkSW1wbGljaXRJbnB1dHMoZSxoKSxuLmVuZE5vZGUoZSl9fXQuTm9kZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1ZhbHVlSW5mbyhlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVmFsdWVJbmZvKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1uYW1lKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9dHlwZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0VmFsdWVJbmZvKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGROYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZFR5cGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGVuZFZhbHVlSW5mbyhlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVmFsdWVJbmZvKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0VmFsdWVJbmZvKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGRUeXBlKGUsbyksbi5lbmRWYWx1ZUluZm8oZSl9fXQuVmFsdWVJbmZvPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVHlwZUluZm8oZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1R5cGVJbmZvKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1kZW5vdGF0aW9uKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9dmFsdWVUeXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiX3Bvcyt0KTplLmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm9WYWx1ZS5OT05FfXZhbHVlKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3VuaW9uKGUsdGhpcy5iYl9wb3MrdCk6bnVsbH1zdGF0aWMgc3RhcnRUeXBlSW5mbyhlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkRGVub3RhdGlvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkVmFsdWVUeXBlKHQsbil7dC5hZGRGaWVsZEludDgoMSxuLGUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mb1ZhbHVlLk5PTkUpO31zdGF0aWMgYWRkVmFsdWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGVuZFR5cGVJbmZvKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVUeXBlSW5mbyhlLHQscixvKXtyZXR1cm4gbi5zdGFydFR5cGVJbmZvKGUpLG4uYWRkRGVub3RhdGlvbihlLHQpLG4uYWRkVmFsdWVUeXBlKGUsciksbi5hZGRWYWx1ZShlLG8pLG4uZW5kVHlwZUluZm8oZSl9fXQuVHlwZUluZm89bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtjbGFzcyB0e2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNPcGVyYXRvclNldElkKGUsbil7cmV0dXJuIChufHxuZXcgdCkuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNPcGVyYXRvclNldElkKGUsbil7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwobnx8bmV3IHQpLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1kb21haW4oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH12ZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1zdGF0aWMgc3RhcnRPcGVyYXRvclNldElkKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGREb21haW4oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZFZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50NjQoMSx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGVuZE9wZXJhdG9yU2V0SWQoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU9wZXJhdG9yU2V0SWQoZSxuLHIpe3JldHVybiB0LnN0YXJ0T3BlcmF0b3JTZXRJZChlKSx0LmFkZERvbWFpbihlLG4pLHQuYWRkVmVyc2lvbihlLHIpLHQuZW5kT3BlcmF0b3JTZXRJZChlKX19ZS5PcGVyYXRvclNldElkPXQ7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVGVuc29yKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUZW5zb3IoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfW5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kaW1zKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KSs4KmUpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWRpbXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9ZGF0YVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyt0KTplLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yRGF0YVR5cGUuVU5ERUZJTkVEfXJhd0RhdGEoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KStlKTowfXJhd0RhdGFMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXJhd0RhdGFBcnJheSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP25ldyBVaW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1zdHJpbmdEYXRhKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfXN0cmluZ0RhdGFMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFRlbnNvcihlKXtlLnN0YXJ0T2JqZWN0KDYpO31zdGF0aWMgYWRkTmFtZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGREaW1zKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQubGVuZ3RoLDgpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50NjQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0LDgpO31zdGF0aWMgYWRkRGF0YVR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMyxuLGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkUmF3RGF0YShlLHQpe2UuYWRkRmllbGRPZmZzZXQoNCx0LDApO31zdGF0aWMgY3JlYXRlUmF3RGF0YVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoMSx0Lmxlbmd0aCwxKTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDgodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0UmF3RGF0YVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoMSx0LDEpO31zdGF0aWMgYWRkU3RyaW5nRGF0YShlLHQpe2UuYWRkRmllbGRPZmZzZXQoNSx0LDApO31zdGF0aWMgY3JlYXRlU3RyaW5nRGF0YVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTdHJpbmdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRUZW5zb3IoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVRlbnNvcihlLHQscixvLGkscyxhKXtyZXR1cm4gbi5zdGFydFRlbnNvcihlKSxuLmFkZE5hbWUoZSx0KSxuLmFkZERvY1N0cmluZyhlLHIpLG4uYWRkRGltcyhlLG8pLG4uYWRkRGF0YVR5cGUoZSxpKSxuLmFkZFJhd0RhdGEoZSxzKSxuLmFkZFN0cmluZ0RhdGEoZSxhKSxuLmVuZFRlbnNvcihlKX19dC5UZW5zb3I9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNTcGFyc2VUZW5zb3IoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZVRlbnNvcihlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9dmFsdWVzKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9aW5kaWNlcyh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWRpbXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRTcGFyc2VUZW5zb3IoZSl7ZS5zdGFydE9iamVjdCgzKTt9c3RhdGljIGFkZFZhbHVlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkSW5kaWNlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkRGltcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgY3JlYXRlRGltc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0Lmxlbmd0aCw4KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDY0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydERpbXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdCw4KTt9c3RhdGljIGVuZFNwYXJzZVRlbnNvcihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU3BhcnNlVGVuc29yKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0U3BhcnNlVGVuc29yKGUpLG4uYWRkVmFsdWVzKGUsdCksbi5hZGRJbmRpY2VzKGUsciksbi5hZGREaW1zKGUsbyksbi5lbmRTcGFyc2VUZW5zb3IoZSl9fXQuU3BhcnNlVGVuc29yPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzQXR0cmlidXRlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNBdHRyaWJ1dGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfW5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10eXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcyt0KTplLmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlVHlwZS5VTkRFRklORUR9Zigpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBlP3RoaXMuYmIucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MrZSk6MH1pKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10KHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWcodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuR3JhcGgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1mbG9hdHMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzQqZSk6MH1mbG9hdHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWZsb2F0c0FycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIGU/bmV3IEZsb2F0MzJBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0K3RoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrZSksdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSkpOm51bGx9aW50cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9aW50c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RyaW5ncyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1zdHJpbmdzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH10ZW5zb3JzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfXRlbnNvcnNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWdyYXBocyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfWdyYXBoc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0QXR0cmlidXRlKGUpe2Uuc3RhcnRPYmplY3QoMTMpO31zdGF0aWMgYWRkTmFtZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGRUeXBlKHQsbil7dC5hZGRGaWVsZEludDMyKDIsbixlLmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkRihlLHQpe2UuYWRkRmllbGRGbG9hdDMyKDMsdCwwKTt9c3RhdGljIGFkZEkoZSx0KXtlLmFkZEZpZWxkSW50NjQoNCx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZFMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDUsdCwwKTt9c3RhdGljIGFkZFQoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDYsdCwwKTt9c3RhdGljIGFkZEcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDcsdCwwKTt9c3RhdGljIGFkZEZsb2F0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoOCx0LDApO31zdGF0aWMgY3JlYXRlRmxvYXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkRmxvYXQzMih0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRGbG9hdHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEludHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDksdCwwKTt9c3RhdGljIGNyZWF0ZUludHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdC5sZW5ndGgsOCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQ2NCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQsOCk7fXN0YXRpYyBhZGRTdHJpbmdzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxMCx0LDApO31zdGF0aWMgY3JlYXRlU3RyaW5nc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTdHJpbmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRUZW5zb3JzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxMSx0LDApO31zdGF0aWMgY3JlYXRlVGVuc29yc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRUZW5zb3JzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRHcmFwaHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEyLHQsMCk7fXN0YXRpYyBjcmVhdGVHcmFwaHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0R3JhcGhzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRBdHRyaWJ1dGUoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZShlLHQscixvLGkscyxhLHUsbCxjLHAsZCxmLGgpe3JldHVybiBuLnN0YXJ0QXR0cmlidXRlKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGRUeXBlKGUsbyksbi5hZGRGKGUsaSksbi5hZGRJKGUscyksbi5hZGRTKGUsYSksbi5hZGRUKGUsdSksbi5hZGRHKGUsbCksbi5hZGRGbG9hdHMoZSxjKSxuLmFkZEludHMoZSxwKSxuLmFkZFN0cmluZ3MoZSxkKSxuLmFkZFRlbnNvcnMoZSxmKSxuLmFkZEdyYXBocyhlLGgpLG4uZW5kQXR0cmlidXRlKGUpfX10LkF0dHJpYnV0ZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc0dyYXBoKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNHcmFwaChlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9aW5pdGlhbGl6ZXJzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9aW5pdGlhbGl6ZXJzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW5vZGVBcmdzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5WYWx1ZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9bm9kZUFyZ3NMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bm9kZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLk5vZGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9bm9kZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bWF4Tm9kZUluZGV4KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zK2UpOjB9bm9kZUVkZ2VzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuTm9kZUVkZ2UpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9bm9kZUVkZ2VzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1pbnB1dHMoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9aW5wdXRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1vdXRwdXRzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfW91dHB1dHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXNwYXJzZUluaXRpYWxpemVycyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlNwYXJzZVRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1zcGFyc2VJbml0aWFsaXplcnNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydEdyYXBoKGUpe2Uuc3RhcnRPYmplY3QoOCk7fXN0YXRpYyBhZGRJbml0aWFsaXplcnMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGNyZWF0ZUluaXRpYWxpemVyc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbml0aWFsaXplcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE5vZGVBcmdzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVOb2RlQXJnc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlQXJnc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkTm9kZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRNYXhOb2RlSW5kZXgoZSx0KXtlLmFkZEZpZWxkSW50MzIoMyx0LDApO31zdGF0aWMgYWRkTm9kZUVkZ2VzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg0LHQsMCk7fXN0YXRpYyBjcmVhdGVOb2RlRWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZUVkZ2VzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRJbnB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDUsdCwwKTt9c3RhdGljIGNyZWF0ZUlucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE91dHB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDYsdCwwKTt9c3RhdGljIGNyZWF0ZU91dHB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3V0cHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkU3BhcnNlSW5pdGlhbGl6ZXJzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg3LHQsMCk7fXN0YXRpYyBjcmVhdGVTcGFyc2VJbml0aWFsaXplcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0U3BhcnNlSW5pdGlhbGl6ZXJzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRHcmFwaChlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlR3JhcGgoZSx0LHIsbyxpLHMsYSx1LGwpe3JldHVybiBuLnN0YXJ0R3JhcGgoZSksbi5hZGRJbml0aWFsaXplcnMoZSx0KSxuLmFkZE5vZGVBcmdzKGUsciksbi5hZGROb2RlcyhlLG8pLG4uYWRkTWF4Tm9kZUluZGV4KGUsaSksbi5hZGROb2RlRWRnZXMoZSxzKSxuLmFkZElucHV0cyhlLGEpLG4uYWRkT3V0cHV0cyhlLHUpLG4uYWRkU3BhcnNlSW5pdGlhbGl6ZXJzKGUsbCksbi5lbmRHcmFwaChlKX19dC5HcmFwaD1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc01vZGVsKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNb2RlbChlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9aXJWZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1vcHNldEltcG9ydCh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuT3BlcmF0b3JTZXRJZCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1vcHNldEltcG9ydExlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1wcm9kdWNlck5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1wcm9kdWNlclZlcnNpb24oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9tYWluKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfW1vZGVsVmVyc2lvbigpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2UpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1ncmFwaCh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5HcmFwaCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWdyYXBoRG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXN0YXRpYyBzdGFydE1vZGVsKGUpe2Uuc3RhcnRPYmplY3QoOSk7fXN0YXRpYyBhZGRJclZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50NjQoMCx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZE9wc2V0SW1wb3J0KGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVPcHNldEltcG9ydFZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRPcHNldEltcG9ydFZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkUHJvZHVjZXJOYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBhZGRQcm9kdWNlclZlcnNpb24oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDMsdCwwKTt9c3RhdGljIGFkZERvbWFpbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoNCx0LDApO31zdGF0aWMgYWRkTW9kZWxWZXJzaW9uKGUsdCl7ZS5hZGRGaWVsZEludDY0KDUsdCxlLmNyZWF0ZUxvbmcoMCwwKSk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDYsdCwwKTt9c3RhdGljIGFkZEdyYXBoKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg3LHQsMCk7fXN0YXRpYyBhZGRHcmFwaERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoOCx0LDApO31zdGF0aWMgZW5kTW9kZWwoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU1vZGVsKGUsdCxyLG8saSxzLGEsdSxsLGMpe3JldHVybiBuLnN0YXJ0TW9kZWwoZSksbi5hZGRJclZlcnNpb24oZSx0KSxuLmFkZE9wc2V0SW1wb3J0KGUsciksbi5hZGRQcm9kdWNlck5hbWUoZSxvKSxuLmFkZFByb2R1Y2VyVmVyc2lvbihlLGkpLG4uYWRkRG9tYWluKGUscyksbi5hZGRNb2RlbFZlcnNpb24oZSxhKSxuLmFkZERvY1N0cmluZyhlLHUpLG4uYWRkR3JhcGgoZSxsKSxuLmFkZEdyYXBoRG9jU3RyaW5nKGUsYyksbi5lbmRNb2RlbChlKX19dC5Nb2RlbD1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2NsYXNzIHR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc0tlcm5lbENyZWF0ZUluZm9zKGUsbil7cmV0dXJuIChufHxuZXcgdCkuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNLZXJuZWxDcmVhdGVJbmZvcyhlLG4pe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKG58fG5ldyB0KS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bm9kZUluZGljZXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KSs0KmUpOjB9bm9kZUluZGljZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bm9kZUluZGljZXNBcnJheSgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/bmV3IFVpbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1rZXJuZWxEZWZIYXNoZXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt0KSs4KmUpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWtlcm5lbERlZkhhc2hlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRLZXJuZWxDcmVhdGVJbmZvcyhlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkTm9kZUluZGljZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVJbmRpY2VzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50MzIodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZUluZGljZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEtlcm5lbERlZkhhc2hlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgY3JlYXRlS2VybmVsRGVmSGFzaGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQubGVuZ3RoLDgpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50NjQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0S2VybmVsRGVmSGFzaGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQsOCk7fXN0YXRpYyBlbmRLZXJuZWxDcmVhdGVJbmZvcyhlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlS2VybmVsQ3JlYXRlSW5mb3MoZSxuLHIpe3JldHVybiB0LnN0YXJ0S2VybmVsQ3JlYXRlSW5mb3MoZSksdC5hZGROb2RlSW5kaWNlcyhlLG4pLHQuYWRkS2VybmVsRGVmSGFzaGVzKGUsciksdC5lbmRLZXJuZWxDcmVhdGVJbmZvcyhlKX19ZS5LZXJuZWxDcmVhdGVJbmZvcz10O30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1N1YkdyYXBoU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTdWJHcmFwaFNlc3Npb25TdGF0ZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9Z3JhcGhJZChlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXNlc3Npb25TdGF0ZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlNlc3Npb25TdGF0ZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRHcmFwaElkKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRTZXNzaW9uU3RhdGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGVuZFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpe2xldCB0PWUuZW5kT2JqZWN0KCk7cmV0dXJuIGUucmVxdWlyZWRGaWVsZCh0LDQpLHR9c3RhdGljIGNyZWF0ZVN1YkdyYXBoU2Vzc2lvblN0YXRlKGUsdCxyKXtyZXR1cm4gbi5zdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpLG4uYWRkR3JhcGhJZChlLHQpLG4uYWRkU2Vzc2lvblN0YXRlKGUsciksbi5lbmRTdWJHcmFwaFNlc3Npb25TdGF0ZShlKX19dC5TdWJHcmFwaFNlc3Npb25TdGF0ZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1Nlc3Npb25TdGF0ZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1rZXJuZWxzKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuS2VybmVsQ3JlYXRlSW5mb3MpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdWJHcmFwaFNlc3Npb25TdGF0ZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlN1YkdyYXBoU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfXN1YkdyYXBoU2Vzc2lvblN0YXRlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRTZXNzaW9uU3RhdGUoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZEtlcm5lbHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZFN1YkdyYXBoU2Vzc2lvblN0YXRlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgY3JlYXRlU3ViR3JhcGhTZXNzaW9uU3RhdGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgZW5kU2Vzc2lvblN0YXRlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTZXNzaW9uU3RhdGUoZSx0LHIpe3JldHVybiBuLnN0YXJ0U2Vzc2lvblN0YXRlKGUpLG4uYWRkS2VybmVscyhlLHQpLG4uYWRkU3ViR3JhcGhTZXNzaW9uU3RhdGVzKGUsciksbi5lbmRTZXNzaW9uU3RhdGUoZSl9fXQuU2Vzc2lvblN0YXRlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzSW5mZXJlbmNlU2Vzc2lvbihlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSW5mZXJlbmNlU2Vzc2lvbihlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGJ1ZmZlckhhc0lkZW50aWZpZXIoZSl7cmV0dXJuIGUuX19oYXNfaWRlbnRpZmllcigiT1JUTSIpfW9ydFZlcnNpb24oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1tb2RlbCh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLk1vZGVsKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c2Vzc2lvblN0YXRlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkT3J0VmVyc2lvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkTW9kZWwoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgZW5kSW5mZXJlbmNlU2Vzc2lvbihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgZmluaXNoSW5mZXJlbmNlU2Vzc2lvbkJ1ZmZlcihlLHQpe2UuZmluaXNoKHQsIk9SVE0iKTt9c3RhdGljIGZpbmlzaFNpemVQcmVmaXhlZEluZmVyZW5jZVNlc3Npb25CdWZmZXIoZSx0KXtlLmZpbmlzaCh0LCJPUlRNIiwhMCk7fXN0YXRpYyBjcmVhdGVJbmZlcmVuY2VTZXNzaW9uKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihlKSxuLmFkZE9ydFZlcnNpb24oZSx0KSxuLmFkZE1vZGVsKGUsciksbi5hZGRTZXNzaW9uU3RhdGUoZSxvKSxuLmVuZEluZmVyZW5jZVNlc3Npb24oZSl9fXQuSW5mZXJlbmNlU2Vzc2lvbj1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKTt9LDE3MjM6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk9ubnhqc1Nlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMjIzNSksbz1uKDkyNDApO3QuT25ueGpzU2Vzc2lvbkhhbmRsZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5pbnB1dE5hbWVzPXRoaXMuc2Vzc2lvbi5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXM9dGhpcy5zZXNzaW9uLm91dHB1dE5hbWVzO31hc3luYyBkaXNwb3NlKCl7fWFzeW5jIHJ1bihlLHQsbil7Y29uc3QgaT1uZXcgTWFwO2Zvcihjb25zdCB0IGluIGUpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSx0KSl7Y29uc3Qgbj1lW3RdO2kuc2V0KHQsbmV3IG8uVGVuc29yKG4uZGltcyxuLnR5cGUsdm9pZCAwLHZvaWQgMCxuLmRhdGEpKTt9Y29uc3Qgcz1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKGkpLGE9e307cmV0dXJuIHMuZm9yRWFjaCgoKGUsdCk9PnthW3RdPW5ldyByLlRlbnNvcihlLnR5cGUsZS5kYXRhLGUuZGltcyk7fSkpLGF9c3RhcnRQcm9maWxpbmcoKXt0aGlzLnNlc3Npb24uc3RhcnRQcm9maWxpbmcoKTt9ZW5kUHJvZmlsaW5nKCl7dGhpcy5zZXNzaW9uLmVuZFByb2ZpbGluZygpO319O30sNjAyNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU2Vzc2lvbj12b2lkIDA7Y29uc3Qgcj1uKDcwNjcpLG89bigxMjk2KSxpPW4oMTk3NSkscz1uKDY0OTYpLGE9bigxMzE1KSx1PW4oMTc0NSk7dC5TZXNzaW9uPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3RoaXMuX2luaXRpYWxpemVkPSExLHRoaXMuYmFja2VuZEhpbnQ9ZS5iYWNrZW5kSGludCx0aGlzLnByb2ZpbGVyPWEuUHJvZmlsZXIuY3JlYXRlKGUucHJvZmlsZXIpLHRoaXMuY29udGV4dD17cHJvZmlsZXI6dGhpcy5wcm9maWxlcixncmFwaElucHV0VHlwZXM6W10sZ3JhcGhJbnB1dERpbXM6W119O31nZXQgaW5wdXROYW1lcygpe3JldHVybiB0aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dE5hbWVzKCl9Z2V0IG91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX21vZGVsLmdyYXBoLmdldE91dHB1dE5hbWVzKCl9c3RhcnRQcm9maWxpbmcoKXt0aGlzLnByb2ZpbGVyLnN0YXJ0KCk7fWVuZFByb2ZpbGluZygpe3RoaXMucHJvZmlsZXIuc3RvcCgpO31hc3luYyBsb2FkTW9kZWwoZSx0LG4pe2F3YWl0IHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJTZXNzaW9uLmxvYWRNb2RlbCIsKGFzeW5jKCk9Pntjb25zdCBzPWF3YWl0KDAsIGkucmVzb2x2ZUJhY2tlbmQpKHRoaXMuYmFja2VuZEhpbnQpO2lmKHRoaXMuc2Vzc2lvbkhhbmRsZXI9cy5jcmVhdGVTZXNzaW9uSGFuZGxlcih0aGlzLmNvbnRleHQpLHRoaXMuX21vZGVsPW5ldyB1Lk1vZGVsLCJzdHJpbmciPT10eXBlb2YgZSl7Y29uc3QgdD1lLmVuZHNXaXRoKCIub3J0Iik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb25zJiZwcm9jZXNzLnZlcnNpb25zLm5vZGUpe2NvbnN0IG49YXdhaXQoMCwgby5wcm9taXNpZnkpKHIucmVhZEZpbGUpKGUpO3RoaXMuaW5pdGlhbGl6ZShuLHQpO31lbHNlIHtjb25zdCBuPWF3YWl0IGZldGNoKGUpLHI9YXdhaXQgbi5hcnJheUJ1ZmZlcigpO3RoaXMuaW5pdGlhbGl6ZShuZXcgVWludDhBcnJheShyKSx0KTt9fWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXRoaXMuaW5pdGlhbGl6ZShlKTtlbHNlIHtjb25zdCByPW5ldyBVaW50OEFycmF5KGUsdHx8MCxufHxlLmJ5dGVMZW5ndGgpO3RoaXMuaW5pdGlhbGl6ZShyKTt9fSkpO31pbml0aWFsaXplKGUsdCl7aWYodGhpcy5faW5pdGlhbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJhbHJlYWR5IGluaXRpYWxpemVkIik7dGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24uaW5pdGlhbGl6ZSIsKCgpPT57Y29uc3Qgbj10aGlzLnNlc3Npb25IYW5kbGVyLnRyYW5zZm9ybUdyYXBoP3RoaXMuc2Vzc2lvbkhhbmRsZXI6dm9pZCAwO3RoaXMuX21vZGVsLmxvYWQoZSxuLHQpLHRoaXMuc2Vzc2lvbkhhbmRsZXIub25HcmFwaEluaXRpYWxpemVkJiZ0aGlzLnNlc3Npb25IYW5kbGVyLm9uR3JhcGhJbml0aWFsaXplZCh0aGlzLl9tb2RlbC5ncmFwaCksdGhpcy5pbml0aWFsaXplT3BzKHRoaXMuX21vZGVsLmdyYXBoKSx0aGlzLl9leGVjdXRpb25QbGFuPW5ldyBzLkV4ZWN1dGlvblBsYW4odGhpcy5fbW9kZWwuZ3JhcGgsdGhpcy5fb3BzLHRoaXMucHJvZmlsZXIpO30pKSx0aGlzLl9pbml0aWFsaXplZD0hMDt9YXN5bmMgcnVuKGUpe2lmKCF0aGlzLl9pbml0aWFsaXplZCl0aHJvdyBuZXcgRXJyb3IoInNlc3Npb24gbm90IGluaXRpYWxpemVkIHlldCIpO3JldHVybiB0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiU2Vzc2lvbi5ydW4iLChhc3luYygpPT57Y29uc3QgdD10aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlSW5wdXRzKGUpLG49YXdhaXQgdGhpcy5fZXhlY3V0aW9uUGxhbi5leGVjdXRlKHRoaXMuc2Vzc2lvbkhhbmRsZXIsdCk7cmV0dXJuIHRoaXMuY3JlYXRlT3V0cHV0KG4pfSkpfW5vcm1hbGl6ZUFuZFZhbGlkYXRlSW5wdXRzKGUpe2NvbnN0IHQ9dGhpcy5fbW9kZWwuZ3JhcGguZ2V0SW5wdXROYW1lcygpO2lmKEFycmF5LmlzQXJyYXkoZSkpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgaW5wdXQgYXJyYXkgbGVuZ3RoOiBleHBlY3RlZCAke3QubGVuZ3RofSBidXQgZ290ICR7ZS5sZW5ndGh9YCl9ZWxzZSB7aWYoZS5zaXplIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbmNvcnJlY3QgaW5wdXQgbWFwIHNpemU6IGV4cGVjdGVkICR7dC5sZW5ndGh9IGJ1dCBnb3QgJHtlLnNpemV9YCk7Y29uc3Qgbj1uZXcgQXJyYXkoZS5zaXplKTtsZXQgcj0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtjb25zdCBpPWUuZ2V0KHRbb10pO2lmKCFpKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBpbnB1dCB0ZW5zb3IgZm9yOiAnJHtuYW1lfSdgKTtuW3IrK109aTt9ZT1uO31pZih0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzJiYwIT09dGhpcy5jb250ZXh0LmdyYXBoSW5wdXRUeXBlcy5sZW5ndGgmJnRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcyYmMCE9PXRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcy5sZW5ndGgpdGhpcy52YWxpZGF0ZUlucHV0VGVuc29yRGltcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMsZSwhMSk7ZWxzZSB7Y29uc3QgdD10aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dEluZGljZXMoKSxuPXRoaXMuX21vZGVsLmdyYXBoLmdldFZhbHVlcygpLHI9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoOysrbyl7Y29uc3QgaT1uW3Rbb11dO3Jbb109aS50eXBlLnNoYXBlLmRpbXMsdGhpcy5jb250ZXh0LmdyYXBoSW5wdXRUeXBlcy5wdXNoKGkudHlwZS50ZW5zb3JUeXBlKSx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMucHVzaChlW29dLmRpbXMpO310aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JEaW1zKHIsZSwhMCk7fXJldHVybiB0aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JUeXBlcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLGUpLGV9dmFsaWRhdGVJbnB1dFRlbnNvclR5cGVzKGUsdCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9ZVtuXSxvPXRbbl0udHlwZTtpZihyIT09byl0aHJvdyBuZXcgRXJyb3IoYGlucHV0IHRlbnNvclske259XSBjaGVjayBmYWlsZWQ6IGV4cGVjdGVkIHR5cGUgJyR7cn0nIGJ1dCBnb3QgJHtvfWApfX12YWxpZGF0ZUlucHV0VGVuc29yRGltcyhlLHQsbil7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IG89ZVtyXSxpPXRbcl0uZGltcztpZighdGhpcy5jb21wYXJlVGVuc29yRGltcyhvLGksbikpdGhyb3cgbmV3IEVycm9yKGBpbnB1dCB0ZW5zb3JbJHtyfV0gY2hlY2sgZmFpbGVkOiBleHBlY3RlZCBzaGFwZSAnWyR7by5qb2luKCIsIil9XScgYnV0IGdvdCBbJHtpLmpvaW4oIiwiKX1dYCl9fWNvbXBhcmVUZW5zb3JEaW1zKGUsdCxuKXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiAhMTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoOysrcilpZihlW3JdIT09dFtyXSYmKCFufHwwIT09ZVtyXSkpcmV0dXJuICExO3JldHVybiAhMH1jcmVhdGVPdXRwdXQoZSl7Y29uc3QgdD10aGlzLl9tb2RlbC5ncmFwaC5nZXRPdXRwdXROYW1lcygpO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBudW1iZXIgb2Ygb3V0cHV0cyBkbyBub3QgbWF0Y2ggbnVtYmVyIG9mIGdlbmVyYXRlZCBvdXRwdXRzIik7Y29uc3Qgbj1uZXcgTWFwO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7KytyKW4uc2V0KHRbcl0sZVtyXSk7cmV0dXJuIG59aW5pdGlhbGl6ZU9wcyhlKXtjb25zdCB0PWUuZ2V0Tm9kZXMoKTt0aGlzLl9vcHM9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLl9vcHNbbl09dGhpcy5zZXNzaW9uSGFuZGxlci5yZXNvbHZlKHRbbl0sdGhpcy5fbW9kZWwub3BzZXRzLGUpO319O30sOTI0MDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGVuc29yPXZvaWQgMDtjb25zdCBvPW4oMzQ0MiksaT1yKG4oMTU4MykpLHM9big1MTI3KSxhPW4oMjQ0NiksdT1uKDcyNzMpO3ZhciBsPXMub25ueHJ1bnRpbWUuZXhwZXJpbWVudGFsLmZicztjbGFzcyBje2dldCBkYXRhKCl7aWYodm9pZCAwPT09dGhpcy5jYWNoZSl7Y29uc3QgZT10aGlzLmRhdGFQcm92aWRlcih0aGlzLmRhdGFJZCk7aWYoZS5sZW5ndGghPT10aGlzLnNpemUpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggb2YgZGF0YSBwcm92aWRlZCBieSB0aGUgRGF0YSBQcm92aWRlciBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgZGltcyBvZiB0aGlzIFRlbnNvci4iKTt0aGlzLmNhY2hlPWU7fXJldHVybiB0aGlzLmNhY2hlfWdldCBzdHJpbmdEYXRhKCl7aWYoInN0cmluZyIhPT10aGlzLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSB0eXBlIGlzIG5vdCBzdHJpbmciKTtyZXR1cm4gdGhpcy5kYXRhfWdldCBpbnRlZ2VyRGF0YSgpe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UidWludDgiOmNhc2UiaW50OCI6Y2FzZSJ1aW50MTYiOmNhc2UiaW50MTYiOmNhc2UiaW50MzIiOmNhc2UidWludDMyIjpjYXNlImJvb2wiOnJldHVybiB0aGlzLmRhdGE7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IGludGVnZXIgKHVpbnQ4LCBpbnQ4LCB1aW50MTYsIGludDE2LCBpbnQzMiwgdWludDMyLCBib29sKSIpfX1nZXQgZmxvYXREYXRhKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOnJldHVybiB0aGlzLmRhdGE7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IGZsb2F0IChmbG9hdDMyLCBmbG9hdDY0KSIpfX1nZXQgbnVtYmVyRGF0YSgpe2lmKCJzdHJpbmciIT09dGhpcy50eXBlKXJldHVybiB0aGlzLmRhdGE7dGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZSBjYW5ub3QgYmUgbm9uLW51bWJlciAoc3RyaW5nKSIpfWdldChlKXtyZXR1cm4gdGhpcy5kYXRhW3UuU2hhcGVVdGlsLmluZGljZXNUb09mZnNldChlLHRoaXMuc3RyaWRlcyldfXNldChlLHQpe3RoaXMuZGF0YVt1LlNoYXBlVXRpbC5pbmRpY2VzVG9PZmZzZXQoZSx0aGlzLnN0cmlkZXMpXT10O31hc3luYyBnZXREYXRhKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuY2FjaGUmJih0aGlzLmNhY2hlPWF3YWl0IHRoaXMuYXN5bmNEYXRhUHJvdmlkZXIodGhpcy5kYXRhSWQpKSx0aGlzLmNhY2hlfWdldCBzdHJpZGVzKCl7cmV0dXJuIHRoaXMuX3N0cmlkZXN8fCh0aGlzLl9zdHJpZGVzPXUuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKHRoaXMuZGltcykpLHRoaXMuX3N0cmlkZXN9Y29uc3RydWN0b3IoZSx0LG4scixpLHM9by5HdWlkLmNyZWF0ZSgpKXt0aGlzLmRpbXM9ZSx0aGlzLnR5cGU9dCx0aGlzLmRhdGFQcm92aWRlcj1uLHRoaXMuYXN5bmNEYXRhUHJvdmlkZXI9cix0aGlzLmNhY2hlPWksdGhpcy5kYXRhSWQ9cyx0aGlzLnNpemU9dS5TaGFwZVV0aWwudmFsaWRhdGVEaW1zQW5kQ2FsY1NpemUoZSk7Y29uc3QgYT10aGlzLnNpemUsbD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yJiZ2b2lkIDA9PT1pO2lmKHZvaWQgMCE9PWkmJmkubGVuZ3RoIT09YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5wdXQgZGltcyBkb2Vzbid0IG1hdGNoIGRhdGEgbGVuZ3RoLiIpO2lmKCJzdHJpbmciPT09dCl7aWYoISh2b2lkIDA9PT1pfHxBcnJheS5pc0FycmF5KGkpJiZpLmV2ZXJ5KChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FjaGUgc2hvdWxkIGJlIGEgc3RyaW5nIGFycmF5Iik7bCYmKHRoaXMuY2FjaGU9bmV3IEFycmF5KGEpKTt9ZWxzZSB7aWYodm9pZCAwIT09aSl7Y29uc3QgZT1kKHQpO2lmKCEoaSBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoYGNhY2hlIHNob3VsZCBiZSB0eXBlICR7ZS5uYW1lfWApfWlmKGwpe2NvbnN0IGU9bmV3IEFycmF5QnVmZmVyKGEqZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiYm9vbCI6Y2FzZSJpbnQ4IjpjYXNlInVpbnQ4IjpyZXR1cm4gMTtjYXNlImludDE2IjpjYXNlInVpbnQxNiI6cmV0dXJuIDI7Y2FzZSJpbnQzMiI6Y2FzZSJ1aW50MzIiOmNhc2UiZmxvYXQzMiI6cmV0dXJuIDQ7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gODtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGNhbGN1bGF0ZSBzaXplb2YoKSBvbiB0eXBlICR7ZX1gKX19KHQpKTt0aGlzLmNhY2hlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyhkKHQpKShlKX0oZSx0KTt9fX1zdGF0aWMgZnJvbVByb3RvKGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGNvbnN0cnVjdCBWYWx1ZSBmcm9tIGFuIGVtcHR5IHRlbnNvciIpO2NvbnN0IHQ9dS5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZS5kYXRhVHlwZSksbj11LlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbVByb3RvKGUuZGltcykscj1uZXcgYyhuLHQpO2lmKCJzdHJpbmciPT09dCllLnN0cmluZ0RhdGEuZm9yRWFjaCgoKGUsdCk9PntyLmRhdGFbdF09KDAsIHUuZGVjb2RlVXRmOFN0cmluZykoZSk7fSkpO2Vsc2UgaWYoZS5yYXdEYXRhJiYibnVtYmVyIj09dHlwZW9mIGUucmF3RGF0YS5ieXRlTGVuZ3RoJiZlLnJhd0RhdGEuYnl0ZUxlbmd0aD4wKXtjb25zdCB0PXIuZGF0YSxuPW5ldyBEYXRhVmlldyhlLnJhd0RhdGEuYnVmZmVyLGUucmF3RGF0YS5ieXRlT2Zmc2V0LGUucmF3RGF0YS5ieXRlTGVuZ3RoKSxvPXAoZS5kYXRhVHlwZSksaT1lLnJhd0RhdGEuYnl0ZUxlbmd0aC9vO2lmKGUucmF3RGF0YS5ieXRlTGVuZ3RoJW8hPTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJ1ZmZlciBsZW5ndGgiKTtpZih0Lmxlbmd0aCE9PWkpdGhyb3cgbmV3IEVycm9yKCJidWZmZXIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKGxldCByPTA7cjxpO3IrKyl7Y29uc3QgaT1oKG4sZS5kYXRhVHlwZSxyKm8pO3Rbcl09aTt9fWVsc2Uge2xldCB0O3N3aXRjaChlLmRhdGFUeXBlKXtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDp0PWUuZmxvYXREYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6dD1lLmludDMyRGF0YTticmVhaztjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDp0PWUuaW50NjREYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTp0PWUuZG91YmxlRGF0YTticmVhaztjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnQ9ZS51aW50NjREYXRhO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnNwZWNpZmljIGVycm9yIil9aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImZhaWxlZCB0byBwb3B1bGF0ZSBkYXRhIGZyb20gYSB0ZW5zb3Jwcm90byB2YWx1ZSIpO2NvbnN0IG49ci5kYXRhO2lmKG4ubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhcnJheSBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgbz10W3JdO2kuZGVmYXVsdC5pc0xvbmcobyk/bltyXT1mKG8sZS5kYXRhVHlwZSk6bltyXT1vO319cmV0dXJuIHJ9c3RhdGljIGZyb21EYXRhKGUsdCxuKXtyZXR1cm4gbmV3IGModCxuLHZvaWQgMCx2b2lkIDAsZSl9c3RhdGljIGZyb21PcnRUZW5zb3IoZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgY29uc3RydWN0IFZhbHVlIGZyb20gYW4gZW1wdHkgdGVuc29yIik7Y29uc3QgdD11LlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChlKSxuPXUuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGUuZGF0YVR5cGUoKSkscj1uZXcgYyh0LG4pO2lmKCJzdHJpbmciPT09bilmb3IobGV0IHQ9MDt0PGUuc3RyaW5nRGF0YUxlbmd0aCgpO3QrKylyLmRhdGFbdF09ZS5zdHJpbmdEYXRhKHQpO2Vsc2UgaWYoZS5yYXdEYXRhQXJyYXkoKSYmIm51bWJlciI9PXR5cGVvZiBlLnJhd0RhdGFMZW5ndGgoKSYmZS5yYXdEYXRhTGVuZ3RoKCk+MCl7Y29uc3QgdD1yLmRhdGEsbj1uZXcgRGF0YVZpZXcoZS5yYXdEYXRhQXJyYXkoKS5idWZmZXIsZS5yYXdEYXRhQXJyYXkoKS5ieXRlT2Zmc2V0LGUucmF3RGF0YUxlbmd0aCgpKSxvPXAoZS5kYXRhVHlwZSgpKSxpPWUucmF3RGF0YUxlbmd0aCgpL287aWYoZS5yYXdEYXRhTGVuZ3RoKCklbyE9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYnVmZmVyIGxlbmd0aCIpO2lmKHQubGVuZ3RoIT09aSl0aHJvdyBuZXcgRXJyb3IoImJ1ZmZlciBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHI9MDtyPGk7cisrKXtjb25zdCBpPWgobixlLmRhdGFUeXBlKCkscipvKTt0W3JdPWk7fX1yZXR1cm4gcn19ZnVuY3Rpb24gcChlKXtzd2l0Y2goZSl7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOnJldHVybiAxO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjpyZXR1cm4gMjtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuIDQ7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDpyZXR1cm4gODtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGNhbGN1bGF0ZSBzaXplb2YoKSBvbiB0eXBlICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW2VdfWApfX1mdW5jdGlvbiBkKGUpe3N3aXRjaChlKXtjYXNlImJvb2wiOmNhc2UidWludDgiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiaW50OCI6cmV0dXJuIEludDhBcnJheTtjYXNlImludDE2IjpyZXR1cm4gSW50MTZBcnJheTtjYXNlInVpbnQxNiI6cmV0dXJuIFVpbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5zcGVjaWZpZWQgZXJyb3IiKX19ZnVuY3Rpb24gZihlLHQpe2lmKHQ9PT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjR8fHQ9PT1sLlRlbnNvckRhdGFUeXBlLklOVDY0KXtpZihlLmdyZWF0ZXJUaGFuT3JFcXVhbCgyMTQ3NDgzNjQ4KXx8ZS5sZXNzVGhhbigtMjE0NzQ4MzY0OCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW50NjQgaXMgbm90IHN1cHBvcnRlZCIpfWVsc2Uge2lmKHQhPT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyJiZ0IT09bC5UZW5zb3JEYXRhVHlwZS5VSU5UMzImJnQhPT1hLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0JiZ0IT09bC5UZW5zb3JEYXRhVHlwZS5VSU5UNjQpdGhyb3cgbmV3IFR5cGVFcnJvcihgbm90IGEgTE9ORyB0eXBlOiAke2Eub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVt0XX1gKTtpZihlLmdyZWF0ZXJUaGFuT3JFcXVhbCg0Mjk0OTY3Mjk2KXx8ZS5sZXNzVGhhbigwKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ1aW50NjQgaXMgbm90IHN1cHBvcnRlZCIpfXJldHVybiBlLnRvTnVtYmVyKCl9ZnVuY3Rpb24gaChlLHQsbil7c3dpdGNoKHQpe2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuIGUuZ2V0VWludDgobik7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODpyZXR1cm4gZS5nZXRJbnQ4KG4pO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4gZS5nZXRVaW50MTYobiwhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6cmV0dXJuIGUuZ2V0SW50MTYobiwhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRkxPQVQ6cmV0dXJuIGUuZ2V0RmxvYXQzMihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4gZS5nZXRJbnQzMihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuIGUuZ2V0VWludDMyKG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0OnJldHVybiBmKGkuZGVmYXVsdC5mcm9tQml0cyhlLmdldFVpbnQzMihuLCEwKSxlLmdldFVpbnQzMihuKzQsITApLCExKSx0KTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU6cmV0dXJuIGUuZ2V0RmxvYXQ2NChuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuIGYoaS5kZWZhdWx0LmZyb21CaXRzKGUuZ2V0VWludDMyKG4sITApLGUuZ2V0VWludDMyKG4rNCwhMCksITApLHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVhZCBmcm9tIERhdGFWaWV3IGZvciB0eXBlICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW3RdfWApfX10LlRlbnNvcj1jO30sNzI3MzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVjb2RlVXRmOFN0cmluZz10Lk1BWF9DTElQPXQuTUlOX0NMSVA9dC5Qb29sQ29udlV0aWw9dC5SZWR1Y2VVdGlsPXQuU3BsaXRVdGlsPXQuTWF0aFV0aWw9dC5TaGFwZVV0aWw9dC5Mb25nVXRpbD10LlByb3RvVXRpbD10LkdlbW1VdGlsPXQuYXJyYXlDb3B5SGVscGVyPXQuQnJvYWRjYXN0VXRpbD10Lk1hdE11bFV0aWw9dC5BcnJheVV0aWw9dC5hc3NlcnQ9dC5jaGVja0lucHV0c1NoYXBlPXZvaWQgMDtjb25zdCBvPW4oNTY4NiksaT1yKG4oMTU4MykpLHM9bigyNDQ2KSxhPW4oOTI0MCk7dC5jaGVja0lucHV0c1NoYXBlPWZ1bmN0aW9uKGUsLi4udCl7aWYoIWV8fGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuICExO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKCFlW25dLmRpbXN8fGVbbl0uZGltcy5sZW5ndGghPT10W25dKXJldHVybiAhMTtyZXR1cm4gITB9LHQuYXNzZXJ0PWZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmciPT10eXBlb2YgdD90OnQoKSl9LHQuQXJyYXlVdGlsPWNsYXNze3N0YXRpYyBhcnJheXNFcXVhbChlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuICExO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKGVbbl0hPT10W25dKXJldHVybiAhMTtyZXR1cm4gITB9fTtjbGFzcyB1e3N0YXRpYyBwcmVwcm9jZXNzSW5wdXRTaGFwZXMoZSx0KXtyZXR1cm4gWzE9PT1lLmxlbmd0aD9bMSxlWzBdXTplLDE9PT10Lmxlbmd0aD9bdFswXSwxXTp0XX1zdGF0aWMgcG9zdHByb2Nlc3NPdXRwdXRTaGFwZShlLHQsbil7MT09PXQmJmUuc3BsaWNlKGUubGVuZ3RoLTIsMSksMT09PW4mJmUucG9wKCk7fXN0YXRpYyBjYWxjTWF0TXVsU2hhcGUoZSx0KXtyZXR1cm4gZVsxXSE9PXRbMF0/dm9pZCAwOltlWzBdLHRbMV1dfX10Lk1hdE11bFV0aWw9dTtjbGFzcyBse3N0YXRpYyBjYWxjU2hhcGUoZSx0LG49ITEpe2NvbnN0IHI9ZS5sZW5ndGgsbz10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gdDtpZigwPT09bylyZXR1cm4gZTtjb25zdCBpPU1hdGgubWF4KGUubGVuZ3RoLHQubGVuZ3RoKSxzPW5ldyBBcnJheShpKTtpZihuKXtpZihyPDJ8fG88MilyZXR1cm47Y29uc3Qgbj11LmNhbGNNYXRNdWxTaGFwZShbZVtyLTJdLGVbci0xXV0sW3Rbby0yXSx0W28tMV1dKTtpZih2b2lkIDA9PT1uKXJldHVybjtbc1tpLTJdLHNbaS0xXV09bjt9Zm9yKGxldCBhPW4/MzoxO2E8PWk7YSsrKXtjb25zdCBuPXItYTwwPzE6ZVtyLWFdLHU9by1hPDA/MTp0W28tYV07aWYobiE9PXUmJm4+MSYmdT4xKXJldHVybjtzW2ktYV09TWF0aC5tYXgobix1KTt9cmV0dXJuIHN9c3RhdGljIGluZGV4KGUsdCl7Y29uc3Qgbj1uZXcgQXJyYXkodC5sZW5ndGgpO3JldHVybiBsLmZpbGxJbmRleChlLHQsbiksbn1zdGF0aWMgZmlsbEluZGV4KGUsdCxuKXtjb25zdCByPWUubGVuZ3RoLXQubGVuZ3RoO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKW5bb109ZVtyK29dJXRbb107fXN0YXRpYyBjYWxjKGUsdCxuLHIsbyl7Y29uc3QgaT1sLmNhbGNTaGFwZShlLmRpbXMsdC5kaW1zKTtpZihpKXtpZihyJiYhZC5hcmVFcXVhbChpLGUuZGltcykpcmV0dXJuO2NvbnN0IHM9ZC5zaXplKGkpLHU9cj9lOm5ldyBhLlRlbnNvcihpLG98fGUudHlwZSk7aWYoMD09PWkubGVuZ3RoKXUuc2V0KFtdLG4oZS5nZXQoW10pLHQuZ2V0KFtdKSkpO2Vsc2Uge2NvbnN0IHI9bmV3IEFycmF5KGkubGVuZ3RoKSxvPW5ldyBBcnJheShlLmRpbXMubGVuZ3RoKSxhPW5ldyBBcnJheSh0LmRpbXMubGVuZ3RoKTtsZXQgYyxwPTAsZD0wLGY9ITEsaD0hMTswPT09ZS5kaW1zLmxlbmd0aCYmKHA9ZS5nZXQoW10pLGY9ITApLDA9PT10LmRpbXMubGVuZ3RoJiYoZD10LmdldChbXSksaD0hMCk7Zm9yKGxldCBnPTA7ZzxzO2crKyl7Yz1nO2ZvcihsZXQgZT1pLmxlbmd0aC0xO2U+PTA7ZS0tKXJbZV09YyVpW2VdLGM9TWF0aC5mbG9vcihjL2lbZV0pO2Z8fChsLmZpbGxJbmRleChyLGUuZGltcyxvKSxwPWUuZ2V0KG8pKSxofHwobC5maWxsSW5kZXgocix0LmRpbXMsYSksZD10LmdldChhKSksdS5zZXQocixuKHAsZCkpO319cmV0dXJuIHV9fXN0YXRpYyBpc1ZhbGlkQnJvYWRjYXN0KGUsdCl7Y29uc3Qgbj1lLmxlbmd0aCxyPXQubGVuZ3RoO2lmKG4+cilyZXR1cm4gITE7Zm9yKGxldCBvPTE7bzw9bjtvKyspaWYoMSE9PWVbbi1vXSYmZVtuLW9dIT09dFtyLW9dKXJldHVybiAhMTtyZXR1cm4gITB9c3RhdGljIGdldEJyb2FkY2FzdERpbXMoZSx0KXtjb25zdCBuPWUubGVuZ3RoLHI9W107Zm9yKGxldCBvPTA7bzxuO28rKyl7Y29uc3QgaT1uLTEtbyxzPWVbaV18fDE7KHRbdC5sZW5ndGgtMS1vXXx8MSk+MSYmMT09PXMmJnIudW5zaGlmdChpKTt9cmV0dXJuIHJ9fXQuQnJvYWRjYXN0VXRpbD1sLHQuYXJyYXlDb3B5SGVscGVyPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBpPTA7aTxvO2krKyllW24raV09dFtyK2ldO30sdC5HZW1tVXRpbD1jbGFzc3tzdGF0aWMgZ2V0U2hhcGVPZkdlbW1SZXN1bHQoZSx0LG4scixvKXtpZigyIT09ZS5sZW5ndGh8fDIhPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNoYXBlIG5lZWQgdG8gYmUgb2Ygc2l6ZSAyIik7bGV0IGkscyxhO3Q/KGk9ZVsxXSxzPWVbMF0pOihpPWVbMF0scz1lWzFdKTtsZXQgdT0tMTtpZihyPyhhPW5bMF0sdT0xKTooYT1uWzFdLHU9MCksblt1XSE9PXMpdGhyb3cgbmV3IEVycm9yKCJkaW1lbnNpb24gbWlzbWF0Y2giKTtpZihpPD0wfHxhPD0wfHxzPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaGFwZSBzcGVjaWZpZWQiKTtpZihvJiYhbC5pc1ZhbGlkQnJvYWRjYXN0KG8sW2ksYV0pKXRocm93IG5ldyBFcnJvcigiZ2VtbTogaW52YWxpZCBiaWFzIHNoYXBlIGZvciBicm9hZGNhc3QiKTtyZXR1cm4gW2ksYSxzXX19O2NsYXNzIGN7c3RhdGljIHRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGUpe3N3aXRjaChlKXtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OnJldHVybiAiaW50OCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuICJ1aW50OCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDpyZXR1cm4gImJvb2wiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiAiaW50MTYiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4gInVpbnQxNiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6cmV0dXJuICJpbnQzMiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyOnJldHVybiAidWludDMyIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4gImZsb2F0MzIiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpyZXR1cm4gImZsb2F0NjQiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlNUUklORzpyZXR1cm4gInN0cmluZyI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuICJpbnQzMiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiAidWludDMyIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke3Mub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVtlXX1gKX19c3RhdGljIHRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtKGUpe3N3aXRjaChlKXtjYXNlImludDgiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UODtjYXNlInVpbnQ4IjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4O2Nhc2UiYm9vbCI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MO2Nhc2UiaW50MTYiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY7Y2FzZSJ1aW50MTYiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2O2Nhc2UiaW50MzIiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI7Y2FzZSJ1aW50MzIiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDtjYXNlImZsb2F0NjQiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFO2Nhc2Uic3RyaW5nIjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlNUUklORztjYXNlImludDY0IjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0O2Nhc2UidWludDY0IjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fXN0YXRpYyB0ZW5zb3JEaW1zRnJvbVByb3RvKGUpe3JldHVybiBlLm1hcCgoZT0+aS5kZWZhdWx0LmlzTG9uZyhlKT9lLnRvTnVtYmVyKCk6ZSkpfXN0YXRpYyB0ZW5zb3JWYWx1ZVR5cGVGcm9tUHJvdG8oZSl7cmV0dXJuIHt0ZW5zb3JUeXBlOmMudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZS5lbGVtVHlwZSksc2hhcGU6e2RpbXM6Yy50ZW5zb3JEaW1zRnJvbVByb3RvKGUuc2hhcGUuZGltLm1hcCgoZT0+ZS5kaW1WYWx1ZSkpKX19fXN0YXRpYyB0ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChlKXtjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5kaW1zTGVuZ3RoKCk7bisrKXQucHVzaChwLmxvbmdUb051bWJlcihlLmRpbXMobikpKTtyZXR1cm4gdH1zdGF0aWMgdGVuc29yQXR0cmlidXRlc0Zyb21PUlRGb3JtYXQoZSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPGUuYXR0cmlidXRlc0xlbmd0aCgpO24rKyl0LnB1c2goZS5hdHRyaWJ1dGVzKG4pKTtyZXR1cm4gdH19dC5Qcm90b1V0aWw9YztjbGFzcyBwe3N0YXRpYyBsb25nVG9OdW1iZXIoZSx0KXtyZXR1cm4gaS5kZWZhdWx0LmlzTG9uZyhlKT9lLnRvTnVtYmVyKCk6ZSBpbnN0YW5jZW9mIG8uZmxhdGJ1ZmZlcnMuTG9uZz9pLmRlZmF1bHQuZnJvbVZhbHVlKHtsb3c6ZS5sb3csaGlnaDplLmhpZ2gsdW5zaWduZWQ6bnVsbCE9dCYmdH0pLnRvTnVtYmVyKCk6ZX1zdGF0aWMgaXNMb25nKGUpe3JldHVybiBpLmRlZmF1bHQuaXNMb25nKGUpfHxlIGluc3RhbmNlb2Ygby5mbGF0YnVmZmVycy5Mb25nfX10LkxvbmdVdGlsPXA7Y2xhc3MgZHtzdGF0aWMgc2l6ZShlKXtyZXR1cm4gZC5nZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKGUsMCxlLmxlbmd0aCl9c3RhdGljIHNpemVGcm9tRGltZW5zaW9uKGUsdCl7aWYodDwwfHx0PmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaW1lbnNpb24gb2YgJHt0fSBmb3Igc2l6ZUZyb21EaW1lbnNpb24gYXMgVGVuc29yIGhhcyAke2UubGVuZ3RofSBkaW1lbnNpb25zLmApO3JldHVybiBkLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoZSx0LGUubGVuZ3RoKX1zdGF0aWMgc2l6ZVRvRGltZW5zaW9uKGUsdCl7aWYodDwwfHx0PmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaW1lbnNpb24gb2YgJHt0fSBmb3Igc2l6ZVRvRGltZW5zaW9uIGFzIFRlbnNvciBoYXMgJHtlLmxlbmd0aH0gZGltZW5zaW9ucy5gKTtyZXR1cm4gZC5nZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKGUsMCx0KX1zdGF0aWMgZ2V0U2l6ZUZyb21EaW1lbnNpb25SYW5nZShlLHQsbil7bGV0IHI9MTtmb3IobGV0IG89dDtvPG47bysrKXtpZihlW29dPD0wKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGdldCB2YWxpZCBzaXplIGZyb20gc3BlY2lmaWVkIGRpbWVuc2lvbiByYW5nZS4gTW9zdCBsaWtlbHkgdGhlIHJhbmdlIGNvbnRhaW5zIDAgb3IgbmVnYXRpdmUgdmFsdWVzIGluIHRoZW0uIik7cio9ZVtvXTt9cmV0dXJuIHJ9c3RhdGljIGNvbXB1dGVTdHJpZGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7aWYoMD09PXQpcmV0dXJuIFtdO2lmKDE9PT10KXJldHVybiBbMV07Y29uc3Qgbj1uZXcgQXJyYXkodCk7blt0LTFdPTEsblt0LTJdPWVbdC0xXTtmb3IobGV0IHI9dC0zO3I+PTA7LS1yKW5bcl09bltyKzFdKmVbcisxXTtyZXR1cm4gbn1zdGF0aWMgdHJhbnNwb3NlKGUpe3JldHVybiBlLnNsaWNlKCkucmV2ZXJzZSgpfXN0YXRpYyBpbmRpY2VzVG9PZmZzZXQoZSx0LG4pe3ZvaWQgMD09PW4mJihuPWUubGVuZ3RoKTtsZXQgcj0wO2ZvcihsZXQgbz0wO288bjsrK28pcis9dFtvXSplW29dO3JldHVybiByfXN0YXRpYyBvZmZzZXRUb0luZGljZXMoZSx0KXtjb25zdCBuPXQubGVuZ3RoO2lmKDA9PT1uKXJldHVybiBbXTtpZigxPT09bilyZXR1cm4gW2UqdFswXV07Y29uc3Qgcj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248ci5sZW5ndGgtMTsrK24pcltuXT1NYXRoLmZsb29yKGUvdFtuXSksZS09cltuXSp0W25dO3JldHVybiByW3IubGVuZ3RoLTFdPWUscn1zdGF0aWMgbm9ybWFsaXplQXhpcyhlLHQpe2lmKGU8LXQmJmU+PXQpdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBheGlzIGZvciB0aGlzIG9wZXJhdGlvbi4iKTtyZXR1cm4gZTwwP2UrdDplfXN0YXRpYyBub3JtYWxpemVBeGVzKGUsdCl7cmV0dXJuIGUubWFwKChlPT50aGlzLm5vcm1hbGl6ZUF4aXMoZSx0KSkpfXN0YXRpYyBpbmNyZW1lbnRJbmRleChlLHQsbil7aWYoMD09PXQubGVuZ3RofHwwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbmRleCBpbmNyZW1lbnRpbmcgdW5zdXBwb3J0ZWQgZm9yIHNjYWxhciBUZW5zb3IiKTtpZih2b2lkIDA9PT1uKW49dC5sZW5ndGg7ZWxzZSBpZihuPD0wfHxuPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5jb3JyZWN0IGF4aXMgdG8gaW5jcmVtZW50IG9uIik7Zm9yKGxldCByPW4tMTtyPj0wJiYoZVtyXSsrLCEoZVtyXTx0W3JdKSk7LS1yKWVbcl09MDt9c3RhdGljIGNhbGN1bGF0ZVJlc2hhcGVkRGltcyhlLHQpe2lmKDA9PT10Lmxlbmd0aCl7aWYoMD09PWUubGVuZ3RofHwxPT09ZC5zaXplKGUpKXJldHVybiBbXTt0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCByZXNoYXBlIHRvIGEgc2NhbGFyIFRlbnNvciIpfWNvbnN0IG49dC5sZW5ndGgscj1uZXcgQXJyYXkobik7bGV0IG89LTEsaT0xO2ZvcihsZXQgcz0wO3M8bjtzKyspe2lmKHRbc108LTEpdGhyb3cgbmV3IEVycm9yKCJhIGRpbWVuc2lvbiBpbiBzaGFwZSBoaW50cyBjYW5ub3QgYmUgbGVzcyB0aGFuIC0xIik7aWYoLTE9PT10W3NdKXtpZigtMSE9PW8pdGhyb3cgbmV3IEVycm9yKCJhdCBtb3N0IG9uZSBkaW1lbnNpb24gaW4gc2hhcGUgaGludHMgY2FuIGJlIC0xIik7bz1zO31lbHNlIHtpZigwPT09dFtzXSl7aWYocz49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgZGltZW5zaW9uIHdpdGggdmFsdWUgemVybyBleGNlZWRzIHRoZSBkaW1lbnNpb24gc2l6ZSBvZiB0aGUgaW5wdXQgdGVuc29yIik7cltzXT1lW3NdO31lbHNlIHJbc109dFtzXTtpKj1yW3NdO319Y29uc3Qgcz1kLnNpemUoZSk7aWYoLTEhPT1vKXtpZihzJWkhPTApdGhyb3cgbmV3IEVycm9yKGB0aGUgaW5wdXQgdGVuc29yIGNhbm5vdCBiZSByZXNoYXBlZCB0byB0aGUgcmVxdWVzdGVkIHNoYXBlLiBJbnB1dCBzaGFwZTogWyR7ZX1dIE91dHB1dCBzaGFwZTogWyR7dH1dYCk7cltvXT1zL2k7fWVsc2UgaWYoaSE9PXMpdGhyb3cgbmV3IEVycm9yKCJyZXNoYXBlZERpbXMgYW5kIG9yaWdpbmFsRGltcyBkb24ndCBoYXZlIG1hdGNoaW5nIHNpemVzIik7cmV0dXJuIHJ9c3RhdGljIHNvcnRCYXNlZE9uUGVybShlLHQpe3JldHVybiB0P3QubWFwKCh0PT5lW3RdKSk6ZS5zbGljZSgpLnJldmVyc2UoKX1zdGF0aWMgcGFkU2hhcGUoZSx0KXtjb25zdCBuPWUubGVuZ3RoO3JldHVybiBlLm1hcCgoKGUscik9PmUrdFtyXSt0W3Irbl0pKX1zdGF0aWMgYXJlRXF1YWwoZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aCYmZS5ldmVyeSgoKGUsbik9PmU9PT10W25dKSl9c3RhdGljIHZhbGlkYXRlRGltc0FuZENhbGNTaXplKGUpe2lmKGUubGVuZ3RoPjYpdGhyb3cgbmV3IFR5cGVFcnJvcigiT25seSByYW5rIDAgdG8gNiBpcyBzdXBwb3J0ZWQgZm9yIHRlbnNvciBzaGFwZS4iKTtsZXQgdD0xO2Zvcihjb25zdCBuIG9mIGUpe2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgc2hhcGU6ICR7bn0gaXMgbm90IGFuIGludGVnZXJgKTtpZihuPDB8fG4+MjE0NzQ4MzY0Nyl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNoYXBlOiBsZW5ndGggJHtufSBpcyBub3QgYWxsb3dlZGApO3QqPW47fXJldHVybiB0fXN0YXRpYyBmbGF0dGVuU2hhcGUoZSx0KXt0PDAmJih0Kz1lLmxlbmd0aCk7Y29uc3Qgbj1lLnJlZHVjZSgoKGUsdCk9PmUqdCksMSkscj1lLnNsaWNlKHQpLnJlZHVjZSgoKGUsdCk9PmUqdCksMSk7cmV0dXJuIFtuL3Iscl19c3RhdGljIHNxdWVlemVTaGFwZShlLHQpe2NvbnN0IG49bmV3IEFycmF5O3Q9ZC5ub3JtYWxpemVBeGVzKHQsZS5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtjb25zdCBvPXQuaW5kZXhPZihyKT49MDtpZihvJiYxIT09ZVtyXSl0aHJvdyBuZXcgRXJyb3IoInNxdWVlemUgYW4gYXhpcyBvZiBzaXplIGRpZmZlcmVudCB0aGFuIDEiKTsoMD09PXQubGVuZ3RoJiZlW3JdPjF8fHQubGVuZ3RoPjAmJiFvKSYmbi5wdXNoKGVbcl0pO31yZXR1cm4gbn1zdGF0aWMgdW5zcXVlZXplU2hhcGUoZSx0KXtjb25zdCBuPW5ldyBBcnJheShlLmxlbmd0aCt0Lmxlbmd0aCk7bi5maWxsKDApO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCByPWQubm9ybWFsaXplQXhpcyh0W2VdLG4ubGVuZ3RoKTtpZihyPj1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIidheGVzJyBoYXMgYW4gb3V0IG9mIHJhbmdlIGF4aXMiKTtpZigwIT09bltyXSl0aHJvdyBuZXcgRXJyb3IoIidheGVzJyBoYXMgYSBkdXBsaWNhdGUgYXhpcyIpO25bcl09MTt9bGV0IHI9MDtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKykwPT09blt0XSYmKG5bdF09ZVtyKytdKTtpZihyIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgdW5zcXVlZXplZCBkaW1lbnNpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkIik7cmV0dXJuIG59fXQuU2hhcGVVdGlsPWQsdC5NYXRoVXRpbD1jbGFzc3tzdGF0aWMgc3FyKGUsdCxuLHIsbyl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBpPTA7aTxvO2krKyllW24raV0rPU1hdGgucG93KHRbcitpXSwyKTt9c3RhdGljIGF4cHkoZSx0LG4scixvLGkpe2lmKHI8MHx8cj49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZihyK28+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYobitvPmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgcz0wO3M8bztzKyspZVtuK3NdKz1pKnRbcitzXTt9c3RhdGljIHBvd3goZSx0LG4scixvLGkpe2lmKHI8MHx8cj49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZihyK28+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYobitvPmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgcz0wO3M8bztzKyspZVtuK3NdPU1hdGgucG93KHRbcitzXSxpKTt9c3RhdGljIG11bChlLHQsbixyLG8pe2lmKHI8MHx8cj49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2VJbmRleCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldEluZGV4IG91dCBvZiBib3VuZHMiKTtpZihyK28+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzb3VyY2UgaW5kaWNlcyB0byBiZSBjb3BpZWQgYXJlIG91dHNpZGUgYm91bmRzIik7aWYobitvPmUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0IGFycmF5IGlzIHRvbyBzbWFsbCB0byBob2xkIHJlc3VsdCIpO2ZvcihsZXQgaT0wO2k8bztpKyspZVtuK2ldPXRbcitpXSplW24raV07fX07Y2xhc3MgZntzdGF0aWMgc3BsaXRTaGFwZShlLHQsbixyKXtpZigwPT09bi5sZW5ndGgpe2lmKCFyKXRocm93IG5ldyBFcnJvcigibmVlZCB0byBrbm93IG51bWJlciBvZiBvdXRwdXRzIHdoZW4gdGhlICdzcGxpdCcgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQiKTtmLmRldGVybWluZVNwbGl0KGVbdF0scixuKTt9Y29uc3Qgbz1bXSxpPVswXTtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoOysrcil7MCE9PXImJmkucHVzaChpW3ItMV0rbltyLTFdKTtjb25zdCBzPWUuc2xpY2UoKTtzW3RdPW5bcl0sby5wdXNoKHMpO31yZXR1cm4gW28saV19c3RhdGljIGRldGVybWluZVNwbGl0KGUsdCxuKXtpZihlJXQhPTApdGhyb3cgbmV3IEVycm9yKCJjYW5ub3Qgc3BsaXQgdGVuc29yIHRvIGVxdWFsIHNpemVkIHBhcnRzIik7Zm9yKGxldCByPTA7cjx0OysrciluLnB1c2goZS90KTt9fXQuU3BsaXRVdGlsPWY7Y2xhc3MgaHtzdGF0aWMgY2FsY1JlZHVjZShlLHQsbixyLG8pe2NvbnN0IGk9ZS5kaW1zLnNsaWNlKDApOzA9PT10Lmxlbmd0aCYmaS5mb3JFYWNoKCgoZSxuKT0+dC5wdXNoKG4pKSk7Y29uc3Qgcz1oLmNhbGNSZWR1Y2VTaGFwZShpLHQsITApLHU9ZC5zaXplKHMpLGM9bmV3IGEuVGVuc29yKHMsZS50eXBlKSxwPWQuY29tcHV0ZVN0cmlkZXMocyksZj1kLmNvbXB1dGVTdHJpZGVzKGkpLGc9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IobGV0IG49MDtuPHU7bisrKXtjb25zdCBzPWQub2Zmc2V0VG9JbmRpY2VzKG4scCk7bC5maWxsSW5kZXgocyxpLGcpLGMuc2V0KHMsaC5jYWxjUmVkdWNlQnlBeGlzKGUubnVtYmVyRGF0YSx0LGksMCxkLmluZGljZXNUb09mZnNldChnLGYpLHIsbykpO31yZXR1cm4gbj9jOm5ldyBhLlRlbnNvcihoLmNhbGNSZWR1Y2VTaGFwZShpLHQsbiksYy50eXBlLHZvaWQgMCx2b2lkIDAsYy5kYXRhLGMuZGF0YUlkKX1zdGF0aWMgY2FsY1JlZHVjZUJ5QXhpcyhlLHQsbixyLG8saSxzKXtsZXQgYT0wO2lmKHI+PXQubGVuZ3RoKXJldHVybiBpKGVbb10pO2NvbnN0IHU9dFtyXSxsPXU+PW4ubGVuZ3RoPzE6ZC5zaXplKG4uc2xpY2UodSsxKSk7Zm9yKGxldCBjPTA7YzxuW3VdO2MrKylhPTA9PT1jP2guY2FsY1JlZHVjZUJ5QXhpcyhlLHQsbixyKzEsbyxpLHMpOnMoYSxoLmNhbGNSZWR1Y2VCeUF4aXMoZSx0LG4scisxLG8saSxzKSksbys9bDtyZXR1cm4gYX1zdGF0aWMgY2FsY1JlZHVjZVNoYXBlKGUsdCxuKXtjb25zdCByPWUuc2xpY2UoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylyW3RbZV1dPW4/MTowO3JldHVybiByLmZpbHRlcigoZT0+MCE9PWUpKX19dC5SZWR1Y2VVdGlsPWg7Y2xhc3MgZ3tzdGF0aWMgYWRqdXN0UG9vbEF0dHJpYnV0ZXMoZSx0LG4scixvLGkpe2lmKCFlJiZuLmxlbmd0aCE9PXQubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggb2Ygc3BlY2lmaWVkIGtlcm5lbCBzaGFwZXMgc2hvdWxkIGJlIDIgbGVzcyB0aGFuIGxlbmd0aCBvZiBpbnB1dCBkaW1lbnNpb25zIik7aWYoZSlmb3IobGV0IGU9MDtlPHQubGVuZ3RoLTI7ZSsrKWU+PW4ubGVuZ3RoP24ucHVzaCh0W2UrMl0pOm5bZV09dFtlKzJdO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKWlmKGU8ci5sZW5ndGgpe2lmKHJbZV08MCl0aHJvdyBuZXcgRXJyb3IoInN0cmlkZXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSByLnB1c2goMSk7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoZTxvLmxlbmd0aCl7aWYob1tlXTwwKXRocm93IG5ldyBFcnJvcigiZGlsYXRpb25zIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpfWVsc2Ugby5wdXNoKDEpO2ZvcihsZXQgZT0wO2U8MipuLmxlbmd0aDtlKyspaWYoZTxpLmxlbmd0aCl7aWYoaVtlXTwwKXRocm93IG5ldyBFcnJvcigicGFkIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpfWVsc2UgaS5wdXNoKDApO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtpZihuW2VdPD0wKXRocm93IG5ldyBFcnJvcigia2VybmVsIHNoYXBlcyBuZWVkIHRvIGJlIGdyZWF0ZXIgdGhhbiAwIik7aWYoaVtlXT49bltlXXx8aVtlK24ubGVuZ3RoXT49bltlXSl0aHJvdyBuZXcgRXJyb3IoInBhZHMgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBrZXJuZWwiKX19c3RhdGljIGFkanVzdFBhZHNCYXNlZE9uQXV0b1BhZChlLHQsbixyLG8saSl7aWYoaSl7aWYoby5sZW5ndGghPT0yKihlLmxlbmd0aC0yKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBwYWRzIHNob3VsZCBiZSB0d2ljZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBzdHJpZGVzIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2lmKHIubGVuZ3RoIT09ZS5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBrZXJuZWwgc2hhcGVzIHNob3VsZCBiZSB0aGUgbGVuZ3RoIG9mIGRhdGEgZGltZW5zaW9ucyIpO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGgtMjtzKyspZy5hZGp1c3RQYWRBbmRSZXR1cm5TaGFwZShlW3MrMl0sdFtzXSxuW3NdLHJbc10sbyxzLHMrZS5sZW5ndGgtMixpKTt9fXN0YXRpYyBjb21wdXRlUG9vbE91dHB1dFNoYXBlKGUsdCxuLHIsbyxpLHMpe2lmKHQubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiaW5wdXQgc2hhcGUgbXVzdCBiZSBvZiBzaXplIGdyZWF0ZXIgdGhhbiAwIik7Y29uc3QgYT1bdFswXSx0WzFdXTtyZXR1cm4gZy5jb21wdXRlU2hhcGVIZWxwZXIoZSx0LGEsbixyLG8saSxzKSxhfXN0YXRpYyBjb21wdXRlQ29udk91dHB1dFNoYXBlKGUsdCxuLHIsbyxpLHMpe2lmKGUubGVuZ3RoPD0wfHx0Lmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIGRpbXMgb3IgaW52YWxpZCBmaWx0ZXIgdGVuc29yIGRpbXMiKTtjb25zdCBhPVtlWzBdLHRbMF1dO3JldHVybiBnLmNvbXB1dGVTaGFwZUhlbHBlcighMSxlLGEsbixyLG8saSxzKSxhfXN0YXRpYyBjb21wdXRlU2hhcGVIZWxwZXIoZSx0LG4scixvLGkscyxhKXtpZihlKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMjtlKyspbi5wdXNoKDEpO2Vsc2UgZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0yO2UrKyluLnB1c2goZy5hZGp1c3RQYWRBbmRSZXR1cm5TaGFwZSh0W2UrMl0scltlXSxvW2VdLGlbZV0scyxlLGUrdC5sZW5ndGgtMixhKSk7fXN0YXRpYyBhZGp1c3RQYWRBbmRSZXR1cm5TaGFwZShlLHQsbixyLG8saSxzLGEpe2NvbnN0IHU9biooci0xKSsxO2lmKCFhfHwiTk9UU0VUIj09PWEpcmV0dXJuIE1hdGguZmxvb3IoKGUrb1tpXStvW3NdLXUpL3QrMSk7c3dpdGNoKGEpe2Nhc2UiVkFMSUQiOnJldHVybiBvW2ldPTAsb1tzXT0wLE1hdGguZmxvb3IoKGUtdSkvdCsxKTtjYXNlIlNBTUVfTE9XRVIiOmNhc2UiU0FNRV9VUFBFUiI6aWYoMSE9PW4pdGhyb3cgbmV3IEVycm9yKCJEaWxhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciBTQU1FX1VQUEVSIG9yIFNBTUVfTE9XRVIiKTt7Y29uc3Qgbj0oKGUrdC0xKS90LTEpKnQrci1lO3JldHVybiBvW2ldPSJTQU1FX0xPV0VSIj09PWE/TWF0aC5mbG9vcigobisxKS8yKTpNYXRoLmZsb29yKG4vMiksb1tzXT1uLW9baV0sTWF0aC5mbG9vcigoZStuLXIpL3QrMSl9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIEF1dG9QYWQgdHlwZSIpfX19dC5Qb29sQ29udlV0aWw9Zyx0Lk1JTl9DTElQPS0zNDAyODIzNDY2Mzg1Mjg4NmUyMix0Lk1BWF9DTElQPTM0MDI4MjM0NjYzODUyODg2ZTIyLHQuZGVjb2RlVXRmOFN0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGUpfTt9LDg0MDg6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC52ZXJzaW9uPXZvaWQgMCx0LnZlcnNpb249IjEuMTYuMyI7fSw5NTQ0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKTt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7byYmISgiZ2V0ImluIG8/IXQuX19lc01vZHVsZTpvLndyaXRhYmxlfHxvLmNvbmZpZ3VyYWJsZSl8fChvPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbyk7fTpmdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj1uKSxlW3JdPXRbbl07fSksaT10aGlzJiZ0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdHx8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pO306ZnVuY3Rpb24oZSx0KXtlLmRlZmF1bHQ9dDt9KSxzPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbihlKXtpZihlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9e307aWYobnVsbCE9ZSlmb3IodmFyIG4gaW4gZSkiZGVmYXVsdCIhPT1uJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmbyh0LGUsbik7cmV0dXJuIGkodCxlKSx0fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbmRQcm9maWxpbmc9dC5ydW49dC5yZWxlYXNlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uRmluYWxpemU9dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9dC5pbml0aWFsaXplUnVudGltZT10LmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlPXZvaWQgMDtjb25zdCBhPW4oMjIzNSksdT1zKG4oMTI1OSkpLGw9bigyNjMpLGM9KCk9PiEhYS5lbnYud2FzbS5wcm94eSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudDtsZXQgcCxkLGYsaD0hMSxnPSExLGI9ITE7Y29uc3QgbT1bXSx5PVtdLHY9W10sXz1bXSx3PVtdLFQ9W10seD0oKT0+e2lmKGh8fCFnfHxifHwhcCl0aHJvdyBuZXcgRXJyb3IoIndvcmtlciBub3QgcmVhZHkiKX0sTz1lPT57c3dpdGNoKGUuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6aD0hMSxlLmRhdGEuZXJyPyhiPSEwLGRbMV0oZS5kYXRhLmVycikpOihnPSEwLGRbMF0oKSk7YnJlYWs7Y2FzZSJpbml0LW9ydCI6ZS5kYXRhLmVycj9mWzFdKGUuZGF0YS5lcnIpOmZbMF0oKTticmVhaztjYXNlImNyZWF0ZV9hbGxvY2F0ZSI6ZS5kYXRhLmVycj9tLnNoaWZ0KClbMV0oZS5kYXRhLmVycik6bS5zaGlmdCgpWzBdKGUuZGF0YS5vdXQpO2JyZWFrO2Nhc2UiY3JlYXRlX2ZpbmFsaXplIjplLmRhdGEuZXJyP3kuc2hpZnQoKVsxXShlLmRhdGEuZXJyKTp5LnNoaWZ0KClbMF0oZS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJjcmVhdGUiOmUuZGF0YS5lcnI/di5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOnYuc2hpZnQoKVswXShlLmRhdGEub3V0KTticmVhaztjYXNlInJlbGVhc2UiOmUuZGF0YS5lcnI/Xy5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOl8uc2hpZnQoKVswXSgpO2JyZWFrO2Nhc2UicnVuIjplLmRhdGEuZXJyP3cuc2hpZnQoKVsxXShlLmRhdGEuZXJyKTp3LnNoaWZ0KClbMF0oZS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJlbmQtcHJvZmlsaW5nIjplLmRhdGEuZXJyP1Quc2hpZnQoKVsxXShlLmRhdGEuZXJyKTpULnNoaWZ0KClbMF0oKTt9fSxTPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/bnVsbD09PShyPW51bGw9PT1kb2N1bWVudHx8dm9pZCAwPT09ZG9jdW1lbnQ/dm9pZCAwOmRvY3VtZW50LmN1cnJlbnRTY3JpcHQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnNyYzp2b2lkIDA7dC5pbml0aWFsaXplV2ViQXNzZW1ibHlJbnN0YW5jZT1hc3luYygpPT57aWYoYygpKXtpZihnKXJldHVybjtpZihoKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRXYXNtKCknIGRldGVjdGVkLiIpO2lmKGIpdGhyb3cgbmV3IEVycm9yKCJwcmV2aW91cyBjYWxsIHRvICdpbml0V2FzbSgpJyBmYWlsZWQuIik7cmV0dXJuIGg9ITAsdm9pZCAwPT09YS5lbnYud2FzbS53YXNtUGF0aHMmJlMmJjAhPT1TLmluZGV4T2YoImJsb2I6IikmJihhLmVudi53YXNtLndhc21QYXRocz1TLnN1YnN0cigwLCtTLmxhc3RJbmRleE9mKCIvIikrMSkpLG5ldyBQcm9taXNlKCgoZSx0KT0+e251bGw9PXB8fHAudGVybWluYXRlKCkscD1uKDgwNTApLlooKSxwLm9ubWVzc2FnZT1PLGQ9W2UsdF07Y29uc3Qgcj17dHlwZToiaW5pdC13YXNtIixpbjphLmVudi53YXNtfTtwLnBvc3RNZXNzYWdlKHIpO30pKX1yZXR1cm4gKDAsIGwuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KShhLmVudi53YXNtKX0sdC5pbml0aWFsaXplUnVudGltZT1hc3luYyBlPT57aWYoYygpKXJldHVybiB4KCksbmV3IFByb21pc2UoKCh0LG4pPT57Zj1bdCxuXTtjb25zdCByPXt0eXBlOiJpbml0LW9ydCIsaW46ZX07cC5wb3N0TWVzc2FnZShyKTt9KSk7YXdhaXQgdS5pbml0UnVudGltZShlKTt9LHQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPWFzeW5jIGU9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgodCxuKT0+e20ucHVzaChbdCxuXSk7Y29uc3Qgcj17dHlwZToiY3JlYXRlX2FsbG9jYXRlIixpbjp7bW9kZWw6ZX19O3AucG9zdE1lc3NhZ2UocixbZS5idWZmZXJdKTt9KSkpOnUuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKGUpLHQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPWFzeW5jKGUsdCk9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgobixyKT0+e3kucHVzaChbbixyXSk7Y29uc3Qgbz17dHlwZToiY3JlYXRlX2ZpbmFsaXplIixpbjp7bW9kZWxkYXRhOmUsb3B0aW9uczp0fX07cC5wb3N0TWVzc2FnZShvKTt9KSkpOnUuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKGUsdCksdC5jcmVhdGVTZXNzaW9uPWFzeW5jKGUsdCk9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgobixyKT0+e3YucHVzaChbbixyXSk7Y29uc3Qgbz17dHlwZToiY3JlYXRlIixpbjp7bW9kZWw6ZSxvcHRpb25zOnR9fTtwLnBvc3RNZXNzYWdlKG8sW2UuYnVmZmVyXSk7fSkpKTp1LmNyZWF0ZVNlc3Npb24oZSx0KSx0LnJlbGVhc2VTZXNzaW9uPWFzeW5jIGU9PntpZihjKCkpcmV0dXJuIHgoKSxuZXcgUHJvbWlzZSgoKHQsbik9PntfLnB1c2goW3Qsbl0pO2NvbnN0IHI9e3R5cGU6InJlbGVhc2UiLGluOmV9O3AucG9zdE1lc3NhZ2Uocik7fSkpO3UucmVsZWFzZVNlc3Npb24oZSk7fSx0LnJ1bj1hc3luYyhlLHQsbixyLG8pPT5jKCk/KHgoKSxuZXcgUHJvbWlzZSgoKGkscyk9Pnt3LnB1c2goW2ksc10pO2NvbnN0IGE9e3R5cGU6InJ1biIsaW46e3Nlc3Npb25JZDplLGlucHV0SW5kaWNlczp0LGlucHV0czpuLG91dHB1dEluZGljZXM6cixvcHRpb25zOm99fTtwLnBvc3RNZXNzYWdlKGEsdS5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycyhuKSk7fSkpKTp1LnJ1bihlLHQsbixyLG8pLHQuZW5kUHJvZmlsaW5nPWFzeW5jIGU9PntpZihjKCkpcmV0dXJuIHgoKSxuZXcgUHJvbWlzZSgoKHQsbik9PntULnB1c2goW3Qsbl0pO2NvbnN0IHI9e3R5cGU6ImVuZC1wcm9maWxpbmciLGluOmV9O3AucG9zdE1lc3NhZ2Uocik7fSkpO3UuZW5kUHJvZmlsaW5nKGUpO307fSw3OTE4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zZXRSdW5PcHRpb25zPXZvaWQgMDtjb25zdCByPW4oMjYzKSxvPW4oMTQ5Nyk7dC5zZXRSdW5PcHRpb25zPWU9Pntjb25zdCB0PSgwLCByLmdldEluc3RhbmNlKSgpO2xldCBuPTA7Y29uc3QgaT1bXSxzPWV8fHt9O3RyeXtpZih2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS5sb2dTZXZlcml0eUxldmVsKSlzLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dTZXZlcml0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcihlLmxvZ1NldmVyaXR5TGV2ZWwpfHxlLmxvZ1NldmVyaXR5TGV2ZWw8MHx8ZS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYodm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUubG9nVmVyYm9zaXR5TGV2ZWwpKXMubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLnRlcm1pbmF0ZSkmJihzLnRlcm1pbmF0ZT0hMSk7bGV0IHI9MDtyZXR1cm4gdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUudGFnKSYmKHI9KDAsby5hbGxvY1dhc21TdHJpbmcpKGUudGFnLGkpKSxuPXQuX09ydENyZWF0ZVJ1bk9wdGlvbnMocy5sb2dTZXZlcml0eUxldmVsLHMubG9nVmVyYm9zaXR5TGV2ZWwsISFzLnRlcm1pbmF0ZSxyKSwwPT09biYmKDAsby5jaGVja0xhc3RFcnJvcikoIkNhbid0IGNyZWF0ZSBydW4gb3B0aW9ucy4iKSx2b2lkIDAhPT0obnVsbD09ZT92b2lkIDA6ZS5leHRyYSkmJigwLG8uaXRlcmF0ZUV4dHJhT3B0aW9ucykoZS5leHRyYSwiIixuZXcgV2Vha1NldCwoKGUscik9Pntjb25zdCBzPSgwLG8uYWxsb2NXYXNtU3RyaW5nKShlLGkpLGE9KDAsby5hbGxvY1dhc21TdHJpbmcpKHIsaSk7MCE9PXQuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5KG4scyxhKSYmKDAsby5jaGVja0xhc3RFcnJvcikoYENhbid0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke3J9LmApO30pKSxbbixpXX1jYXRjaChlKXt0aHJvdyAwIT09biYmdC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMobiksaS5mb3JFYWNoKChlPT50Ll9mcmVlKGUpKSksZX19O30sNjY0MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMjgwNiksbz1uKDIyMzUpLGk9bigyODUwKSxzPW4oOTU0NCk7bGV0IGE7dC5Pbm54cnVudGltZVdlYkFzc2VtYmx5U2Vzc2lvbkhhbmRsZXI9Y2xhc3N7YXN5bmMgY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKGUpe2NvbnN0IHQ9YXdhaXQgZmV0Y2goZSk7aWYoMjAwIT09dC5zdGF0dXMpdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCBtb2RlbDogJHtlfWApO2NvbnN0IG49YXdhaXQgdC5hcnJheUJ1ZmZlcigpO3JldHVybiAoMCwgcy5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKG5ldyBVaW50OEFycmF5KG4pKX1hc3luYyBsb2FkTW9kZWwoZSx0KXtpZihhfHwoYXdhaXQoMCwgcy5pbml0aWFsaXplUnVudGltZSkoby5lbnYpLGE9ITApLCJzdHJpbmciPT10eXBlb2YgZSlpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSl7Y29uc3Qgbj1hd2FpdCgwLCBpLnByb21pc2lmeSkoci5yZWFkRmlsZSkoZSk7W3RoaXMuc2Vzc2lvbklkLHRoaXMuaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzXT1hd2FpdCgwLCBzLmNyZWF0ZVNlc3Npb24pKG4sdCk7fWVsc2Uge2NvbnN0IG49YXdhaXQgdGhpcy5jcmVhdGVTZXNzaW9uQWxsb2NhdGUoZSk7W3RoaXMuc2Vzc2lvbklkLHRoaXMuaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzXT1hd2FpdCgwLCBzLmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkobix0KTt9ZWxzZSBbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsIHMuY3JlYXRlU2Vzc2lvbikoZSx0KTt9YXN5bmMgZGlzcG9zZSgpe3JldHVybiAoMCwgcy5yZWxlYXNlU2Vzc2lvbikodGhpcy5zZXNzaW9uSWQpfWFzeW5jIHJ1bihlLHQsbil7Y29uc3Qgcj1bXSxpPVtdO09iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKGU9Pntjb25zdCB0PWVbMF0sbj1lWzFdLG89dGhpcy5pbnB1dE5hbWVzLmluZGV4T2YodCk7aWYoLTE9PT1vKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnB1dCAnJHt0fSdgKTtyLnB1c2gobiksaS5wdXNoKG8pO30pKTtjb25zdCBhPVtdO09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKGU9Pntjb25zdCB0PWVbMF0sbj10aGlzLm91dHB1dE5hbWVzLmluZGV4T2YodCk7aWYoLTE9PT1uKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvdXRwdXQgJyR7dH0nYCk7YS5wdXNoKG4pO30pKTtjb25zdCB1PWF3YWl0KDAsIHMucnVuKSh0aGlzLnNlc3Npb25JZCxpLHIubWFwKChlPT5bZS50eXBlLGUuZGltcyxlLmRhdGFdKSksYSxuKSxsPXt9O2ZvcihsZXQgZT0wO2U8dS5sZW5ndGg7ZSsrKWxbdGhpcy5vdXRwdXROYW1lc1thW2VdXV09bmV3IG8uVGVuc29yKHVbZV1bMF0sdVtlXVsyXSx1W2VdWzFdKTtyZXR1cm4gbH1zdGFydFByb2ZpbGluZygpe31lbmRQcm9maWxpbmcoKXsoMCwgcy5lbmRQcm9maWxpbmcpKHRoaXMuc2Vzc2lvbklkKTt9fTt9LDc2MjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFNlc3Npb25PcHRpb25zPXZvaWQgMDtjb25zdCByPW4oMjYzKSxvPW4oMTQ5Nyk7dC5zZXRTZXNzaW9uT3B0aW9ucz1lPT57dmFyIHQsbixpLHM7Y29uc3QgYT0oMCwgci5nZXRJbnN0YW5jZSkoKTtsZXQgdT0wO2NvbnN0IGw9W10sYz1lfHx7fTsoZT0+e2UuZXh0cmF8fChlLmV4dHJhPXt9KSxlLmV4dHJhLnNlc3Npb258fChlLmV4dHJhLnNlc3Npb249e30pO2NvbnN0IHQ9ZS5leHRyYS5zZXNzaW9uO3QudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KHQudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGUuZXhlY3V0aW9uUHJvdmlkZXJzJiZlLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKChlPT4id2ViZ3B1Ij09PSgic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSkmJihlLmVuYWJsZU1lbVBhdHRlcm49ITEpO30pKGMpO3RyeXtjb25zdCBlPShlPT57c3dpdGNoKGUpe2Nhc2UiZGlzYWJsZWQiOnJldHVybiAwO2Nhc2UiYmFzaWMiOnJldHVybiAxO2Nhc2UiZXh0ZW5kZWQiOnJldHVybiAyO2Nhc2UiYWxsIjpyZXR1cm4gOTk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGdyYXBoIG9wdGltaXphdGlvbiBsZXZlbDogJHtlfWApfX0pKG51bGwhPT0odD1jLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWwpJiZ2b2lkIDAhPT10P3Q6ImFsbCIpLHA9KGU9Pntzd2l0Y2goZSl7Y2FzZSJzZXF1ZW50aWFsIjpyZXR1cm4gMDtjYXNlInBhcmFsbGVsIjpyZXR1cm4gMTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZXhlY3V0aW9uIG1vZGU6ICR7ZX1gKX19KShudWxsIT09KG49Yy5leGVjdXRpb25Nb2RlKSYmdm9pZCAwIT09bj9uOiJzZXF1ZW50aWFsIiksZD0ic3RyaW5nIj09dHlwZW9mIGMubG9nSWQ/KDAsby5hbGxvY1dhc21TdHJpbmcpKGMubG9nSWQsbCk6MCxmPW51bGwhPT0oaT1jLmxvZ1NldmVyaXR5TGV2ZWwpJiZ2b2lkIDAhPT1pP2k6MjtpZighTnVtYmVyLmlzSW50ZWdlcihmKXx8ZjwwfHxmPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtmfWApO2NvbnN0IGg9bnVsbCE9PShzPWMubG9nVmVyYm9zaXR5TGV2ZWwpJiZ2b2lkIDAhPT1zP3M6MDtpZighTnVtYmVyLmlzSW50ZWdlcihoKXx8aDwwfHxoPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtofWApO2NvbnN0IGc9InN0cmluZyI9PXR5cGVvZiBjLm9wdGltaXplZE1vZGVsRmlsZVBhdGg/KDAsby5hbGxvY1dhc21TdHJpbmcpKGMub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxsKTowO3JldHVybiB1PWEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zKGUsISFjLmVuYWJsZUNwdU1lbUFyZW5hLCEhYy5lbmFibGVNZW1QYXR0ZXJuLHAsISFjLmVuYWJsZVByb2ZpbGluZywwLGQsZixoLGcpLDA9PT11JiYoMCxvLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgY3JlYXRlIHNlc3Npb24gb3B0aW9ucy4iKSxjLmV4ZWN1dGlvblByb3ZpZGVycyYmKChlLHQsbik9Pntmb3IoY29uc3QgaSBvZiB0KXtsZXQgdD0ic3RyaW5nIj09dHlwZW9mIGk/aTppLm5hbWU7c3dpdGNoKHQpe2Nhc2UieG5ucGFjayI6dD0iWE5OUEFDSyI7YnJlYWs7Y2FzZSJ3ZWJubiI6aWYodD0iV0VCTk4iLCJzdHJpbmciIT10eXBlb2YgaSl7Y29uc3QgdD1pO2lmKG51bGw9PXQ/dm9pZCAwOnQuZGV2aWNlVHlwZSl7Y29uc3QgaT0oMCxvLmFsbG9jV2FzbVN0cmluZykoImRldmljZVR5cGUiLG4pLHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQuZGV2aWNlVHlwZSxuKTswIT09KDAsci5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsaSxzKSYmKDAsby5jaGVja0xhc3RFcnJvcikoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAnZGV2aWNlVHlwZScgLSAke3QuZGV2aWNlVHlwZX0uYCk7fWlmKG51bGw9PXQ/dm9pZCAwOnQucG93ZXJQcmVmZXJlbmNlKXtjb25zdCBpPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSgicG93ZXJQcmVmZXJlbmNlIixuKSxzPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSh0LnBvd2VyUHJlZmVyZW5jZSxuKTswIT09KDAsci5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsaSxzKSYmKDAsby5jaGVja0xhc3RFcnJvcikoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAncG93ZXJQcmVmZXJlbmNlJyAtICR7dC5wb3dlclByZWZlcmVuY2V9LmApO319YnJlYWs7Y2FzZSJ3ZWJncHUiOnQ9IkpTIjticmVhaztjYXNlIndhc20iOmNhc2UiY3B1Ijpjb250aW51ZTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7dH1gKX1jb25zdCBzPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSh0LG4pOzAhPT0oMCxyLmdldEluc3RhbmNlKSgpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcihlLHMpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3QgYXBwZW5kIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fS5gKTt9fSkodSxjLmV4ZWN1dGlvblByb3ZpZGVycyxsKSx2b2lkIDAhPT1jLmV4dHJhJiYoMCxvLml0ZXJhdGVFeHRyYU9wdGlvbnMpKGMuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKChlLHQpPT57Y29uc3Qgbj0oMCxvLmFsbG9jV2FzbVN0cmluZykoZSxsKSxyPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSh0LGwpOzAhPT1hLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkodSxuLHIpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7ZX0gLSAke3R9LmApO30pKSxbdSxsXX1jYXRjaChlKXt0aHJvdyAwIT09dSYmYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKHUpLGwuZm9yRWFjaCgoZT0+YS5fZnJlZShlKSkpLGV9fTt9LDc5MTc6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5sb2dMZXZlbFN0cmluZ1RvRW51bT10LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj10LmdldFRlbnNvckVsZW1lbnRTaXplPXQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9dC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT12b2lkIDAsdC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UiaW50OCI6cmV0dXJuIDM7Y2FzZSJ1aW50OCI6cmV0dXJuIDI7Y2FzZSJib29sIjpyZXR1cm4gOTtjYXNlImludDE2IjpyZXR1cm4gNTtjYXNlInVpbnQxNiI6cmV0dXJuIDQ7Y2FzZSJpbnQzMiI6cmV0dXJuIDY7Y2FzZSJ1aW50MzIiOnJldHVybiAxMjtjYXNlImZsb2F0MTYiOnJldHVybiAxMDtjYXNlImZsb2F0MzIiOnJldHVybiAxO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDExO2Nhc2Uic3RyaW5nIjpyZXR1cm4gODtjYXNlImludDY0IjpyZXR1cm4gNztjYXNlInVpbnQ2NCI6cmV0dXJuIDEzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LHQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9ZT0+e3N3aXRjaChlKXtjYXNlIDM6cmV0dXJuICJpbnQ4IjtjYXNlIDI6cmV0dXJuICJ1aW50OCI7Y2FzZSA5OnJldHVybiAiYm9vbCI7Y2FzZSA1OnJldHVybiAiaW50MTYiO2Nhc2UgNDpyZXR1cm4gInVpbnQxNiI7Y2FzZSA2OnJldHVybiAiaW50MzIiO2Nhc2UgMTI6cmV0dXJuICJ1aW50MzIiO2Nhc2UgMTA6cmV0dXJuICJmbG9hdDE2IjtjYXNlIDE6cmV0dXJuICJmbG9hdDMyIjtjYXNlIDExOnJldHVybiAiZmxvYXQ2NCI7Y2FzZSA4OnJldHVybiAic3RyaW5nIjtjYXNlIDc6cmV0dXJuICJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4gInVpbnQ2NCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtlfWApfX0sdC5nZXRUZW5zb3JFbGVtZW50U2l6ZT1lPT5bdm9pZCAwLDQsMSwxLDIsMiw0LDgsdm9pZCAwLDEsMiw4LDQsOCx2b2lkIDAsdm9pZCAwLHZvaWQgMF1bZV0sdC50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3I9ZT0+e3N3aXRjaChlKXtjYXNlImZsb2F0MTYiOmNhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7ZX1gKX19LHQubG9nTGV2ZWxTdHJpbmdUb0VudW09ZT0+e3N3aXRjaChlKXtjYXNlInZlcmJvc2UiOnJldHVybiAwO2Nhc2UiaW5mbyI6cmV0dXJuIDE7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gMjtjYXNlImVycm9yIjpyZXR1cm4gMztjYXNlImZhdGFsIjpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtlfWApfX07fSwxMjU5OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycz10LmVuZFByb2ZpbGluZz10LnJ1bj10LnJlbGVhc2VTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT10LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT10LmluaXRSdW50aW1lPXZvaWQgMDtjb25zdCByPW4oNzkxOCksbz1uKDc2MjIpLGk9big3OTE3KSxzPW4oMjYzKSxhPW4oMTQ5Nyk7dC5pbml0UnVudGltZT1hc3luYyBlPT57dmFyIHQsbjt0PWUud2FzbS5udW1UaHJlYWRzLG49KDAsIGkubG9nTGV2ZWxTdHJpbmdUb0VudW0pKGUubG9nTGV2ZWwpLDAhPT0oMCwgcy5nZXRJbnN0YW5jZSkoKS5fT3J0SW5pdCh0LG4pJiYoMCwgYS5jaGVja0xhc3RFcnJvcikoIkNhbid0IGluaXRpYWxpemUgb25ueHJ1bnRpbWUuIik7fTtjb25zdCB1PW5ldyBNYXA7dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9ZT0+e2NvbnN0IHQ9KDAsIHMuZ2V0SW5zdGFuY2UpKCksbj10Ll9tYWxsb2MoZS5ieXRlTGVuZ3RoKTtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBhIHNlc3Npb24uIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICR7ZS5ieXRlTGVuZ3RofS5gKTtyZXR1cm4gdC5IRUFQVTguc2V0KGUsbiksW24sZS5ieXRlTGVuZ3RoXX0sdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9KGUsdCk9Pntjb25zdCBuPSgwLCBzLmdldEluc3RhbmNlKSgpO2xldCByPTAsaT0wLGw9W107Y29uc3QgYz1bXSxwPVtdO3RyeXtbaSxsXT0oMCxvLnNldFNlc3Npb25PcHRpb25zKSh0KSxyPW4uX09ydENyZWF0ZVNlc3Npb24oZVswXSxlWzFdLGkpLDA9PT1yJiYoMCxhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgY3JlYXRlIGEgc2Vzc2lvbi4iKTtjb25zdFtkLGZdPShlPT57Y29uc3QgdD0oMCxzLmdldEluc3RhbmNlKSgpLG49dC5zdGFja1NhdmUoKTt0cnl7Y29uc3Qgbj10LnN0YWNrQWxsb2MoOCk7cmV0dXJuIDAhPT10Ll9PcnRHZXRJbnB1dE91dHB1dENvdW50KGUsbixuKzQpJiYoMCxhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgZ2V0IHNlc3Npb24gaW5wdXQvb3V0cHV0IGNvdW50LiIpLFt0LkhFQVAzMltuLzRdLHQuSEVBUDMyW24vNCsxXV19ZmluYWxseXt0LnN0YWNrUmVzdG9yZShuKTt9fSkociksaD1bXSxnPVtdO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2NvbnN0IHQ9bi5fT3J0R2V0SW5wdXROYW1lKHIsZSk7MD09PXQmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgYW4gaW5wdXQgbmFtZS4iKSxjLnB1c2godCksaC5wdXNoKG4uVVRGOFRvU3RyaW5nKHQpKTt9Zm9yKGxldCBlPTA7ZTxmO2UrKyl7Y29uc3QgdD1uLl9PcnRHZXRPdXRwdXROYW1lKHIsZSk7MD09PXQmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgYW4gb3V0cHV0IG5hbWUuIikscC5wdXNoKHQpLGcucHVzaChuLlVURjhUb1N0cmluZyh0KSk7fXJldHVybiB1LnNldChyLFtyLGMscF0pLFtyLGgsZ119Y2F0Y2goZSl7dGhyb3cgYy5mb3JFYWNoKChlPT5uLl9PcnRGcmVlKGUpKSkscC5mb3JFYWNoKChlPT5uLl9PcnRGcmVlKGUpKSksMCE9PXImJm4uX09ydFJlbGVhc2VTZXNzaW9uKHIpLGV9ZmluYWxseXtuLl9mcmVlKGVbMF0pLDAhPT1pJiZuLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMoaSksbC5mb3JFYWNoKChlPT5uLl9mcmVlKGUpKSk7fX0sdC5jcmVhdGVTZXNzaW9uPShlLG4pPT57Y29uc3Qgcj0oMCwgdC5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKGUpO3JldHVybiAoMCwgdC5jcmVhdGVTZXNzaW9uRmluYWxpemUpKHIsbil9LHQucmVsZWFzZVNlc3Npb249ZT0+e2NvbnN0IHQ9KDAsIHMuZ2V0SW5zdGFuY2UpKCksbj11LmdldChlKTtpZighbil0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWxlYXNlIHNlc3Npb24uIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2NvbnN0W3IsbyxpXT1uO28uZm9yRWFjaCgoZT0+dC5fT3J0RnJlZShlKSkpLGkuZm9yRWFjaCgoZT0+dC5fT3J0RnJlZShlKSkpLHQuX09ydFJlbGVhc2VTZXNzaW9uKHIpLHUuZGVsZXRlKGUpO30sdC5ydW49YXN5bmMoZSx0LG4sbyxsKT0+e2NvbnN0IGM9KDAsIHMuZ2V0SW5zdGFuY2UpKCkscD11LmdldChlKTtpZighcCl0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBydW4gaW5mZXJlbmNlLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7ZX1gKTtjb25zdFtkLGYsaF09cCxnPXQubGVuZ3RoLGI9by5sZW5ndGg7bGV0IG09MCx5PVtdO2NvbnN0IHY9W10sXz1bXTt0cnl7W20seV09KDAsci5zZXRSdW5PcHRpb25zKShsKTtmb3IobGV0IGU9MDtlPGc7ZSsrKXtjb25zdCB0PW5bZV1bMF0scj1uW2VdWzFdLG89bltlXVsyXTtsZXQgcyx1O2lmKEFycmF5LmlzQXJyYXkobykpe3U9NCpvLmxlbmd0aCxzPWMuX21hbGxvYyh1KSxfLnB1c2gocyk7bGV0IGU9cy80O2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCsrKXtpZigic3RyaW5nIiE9dHlwZW9mIG9bdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHt0fSBpcyBub3QgYSBzdHJpbmdgKTtjLkhFQVBVMzJbZSsrXT0oMCxhLmFsbG9jV2FzbVN0cmluZykob1t0XSxfKTt9fWVsc2UgdT1vLmJ5dGVMZW5ndGgscz1jLl9tYWxsb2ModSksXy5wdXNoKHMpLGMuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShvLmJ1ZmZlcixvLmJ5dGVPZmZzZXQsdSkscyk7Y29uc3QgbD1jLnN0YWNrU2F2ZSgpLHA9Yy5zdGFja0FsbG9jKDQqci5sZW5ndGgpO3RyeXtsZXQgbj1wLzQ7ci5mb3JFYWNoKChlPT5jLkhFQVAzMltuKytdPWUpKTtjb25zdCBvPWMuX09ydENyZWF0ZVRlbnNvcigoMCxpLnRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtKSh0KSxzLHUscCxyLmxlbmd0aCk7MD09PW8mJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW4ndCBjcmVhdGUgdGVuc29yIGZvciBpbnB1dFske2V9XS5gKSx2LnB1c2gobyk7fWZpbmFsbHl7Yy5zdGFja1Jlc3RvcmUobCk7fX1jb25zdCBlPWMuc3RhY2tTYXZlKCkscz1jLnN0YWNrQWxsb2MoNCpnKSx1PWMuc3RhY2tBbGxvYyg0KmcpLHA9Yy5zdGFja0FsbG9jKDQqYiksdz1jLnN0YWNrQWxsb2MoNCpiKTt0cnl7bGV0IGU9cy80LG49dS80LHI9cC80LGw9dy80O2ZvcihsZXQgcj0wO3I8ZztyKyspYy5IRUFQVTMyW2UrK109dltyXSxjLkhFQVBVMzJbbisrXT1mW3Rbcl1dO2ZvcihsZXQgZT0wO2U8YjtlKyspYy5IRUFQVTMyW3IrK109MCxjLkhFQVBVMzJbbCsrXT1oW29bZV1dO2xldCB5PWMuX09ydFJ1bihkLHUscyxnLHcsYixwLG0pO2NvbnN0IF89Yy5qc2VwUnVuUHJvbWlzZTtfJiZ2b2lkIDAhPT1fLnRoZW4mJih5PWF3YWl0IF8pO2NvbnN0IFQ9W107MCE9PXkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4iKTtmb3IobGV0IGU9MDtlPGI7ZSsrKXtjb25zdCB0PWMuSEVBUFUzMltwLzQrZV0sbj1jLnN0YWNrU2F2ZSgpLHI9Yy5zdGFja0FsbG9jKDE2KTtsZXQgbyxzPTA7dHJ5e3k9Yy5fT3J0R2V0VGVuc29yRGF0YSh0LHIscis0LHIrOCxyKzEyKSwwIT09eSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhbid0IGFjY2VzcyBvdXRwdXQgdGVuc29yIGRhdGEgb24gaW5kZXggJHtlfS5gKTtsZXQgbj1yLzQ7Y29uc3QgdT1jLkhFQVBVMzJbbisrXTtzPWMuSEVBUFUzMltuKytdO2NvbnN0IGw9Yy5IRUFQVTMyW24rK10scD1jLkhFQVBVMzJbbisrXSxkPVtdO2ZvcihsZXQgZT0wO2U8cDtlKyspZC5wdXNoKGMuSEVBUFUzMltsLzQrZV0pO2MuX09ydEZyZWUobCk7Y29uc3QgZj0wPT09ZC5sZW5ndGg/MTpkLnJlZHVjZSgoKGUsdCk9PmUqdCkpO2lmKG89KDAsaS50ZW5zb3JEYXRhVHlwZUVudW1Ub1N0cmluZykodSksInN0cmluZyI9PT1vKXtjb25zdCBlPVtdO2xldCB0PXMvNDtmb3IobGV0IG49MDtuPGY7bisrKXtjb25zdCByPWMuSEVBUFUzMlt0KytdLG89bj09PWYtMT92b2lkIDA6Yy5IRUFQVTMyW3RdLXI7ZS5wdXNoKGMuVVRGOFRvU3RyaW5nKHIsbykpO31ULnB1c2goW28sZCxlXSk7fWVsc2Uge2NvbnN0IGU9bmV3KCgwLGkudGVuc29yVHlwZVRvVHlwZWRBcnJheUNvbnN0cnVjdG9yKShvKSkoZik7bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkuc2V0KGMuSEVBUFU4LnN1YmFycmF5KHMscytlLmJ5dGVMZW5ndGgpKSxULnB1c2goW28sZCxlXSk7fX1maW5hbGx5e2Muc3RhY2tSZXN0b3JlKG4pLCJzdHJpbmciPT09byYmcyYmYy5fZnJlZShzKSxjLl9PcnRSZWxlYXNlVGVuc29yKHQpO319cmV0dXJuIFR9ZmluYWxseXtjLnN0YWNrUmVzdG9yZShlKTt9fWZpbmFsbHl7di5mb3JFYWNoKChlPT5jLl9PcnRSZWxlYXNlVGVuc29yKGUpKSksXy5mb3JFYWNoKChlPT5jLl9mcmVlKGUpKSksMCE9PW0mJmMuX09ydFJlbGVhc2VSdW5PcHRpb25zKG0pLHkuZm9yRWFjaCgoZT0+Yy5fZnJlZShlKSkpO319LHQuZW5kUHJvZmlsaW5nPWU9Pntjb25zdCB0PSgwLCBzLmdldEluc3RhbmNlKSgpLG49dS5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNlc3Npb24gaWQiKTtjb25zdCByPW5bMF0sbz10Ll9PcnRFbmRQcm9maWxpbmcocik7MD09PW8mJigwLCBhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUobyk7fSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPWU9Pntjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IGU9blsyXTshQXJyYXkuaXNBcnJheShlKSYmZS5idWZmZXImJnQucHVzaChlLmJ1ZmZlcik7fXJldHVybiB0fTt9LDI2MzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7fTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10O30pLGk9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKSJkZWZhdWx0IiE9PW4mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZyKHQsZSxuKTtyZXR1cm4gbyh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRpc3Bvc2U9dC5nZXRJbnN0YW5jZT10LmluaXRpYWxpemVXZWJBc3NlbWJseT12b2lkIDA7Y29uc3Qgcz1pKG4oNjQ0OSkpLGE9big5MzIpLHU9bigzNDc0KTtsZXQgbCxjPSExLHA9ITEsZD0hMTt0LmluaXRpYWxpemVXZWJBc3NlbWJseT1hc3luYyBlPT57aWYoYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYocCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvICdpbml0aWFsaXplV2ViQXNzZW1ibHkoKScgZGV0ZWN0ZWQuIik7aWYoZCl0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpJyBmYWlsZWQuIik7cD0hMDtjb25zdCB0PWUuaW5pdFRpbWVvdXQscj1lLm51bVRocmVhZHMsbz1lLnNpbWQsaT1yPjEmJigoKT0+e3RyeXtyZXR1cm4gInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKCJ1bmRlZmluZWQiIT10eXBlb2YgTWVzc2FnZUNoYW5uZWwmJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKSl9Y2F0Y2goZSl7cmV0dXJuICExfX0pKCksZj1vJiYoKCk9Pnt0cnl7cmV0dXJuIFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDQsMSw5NiwwLDAsMywyLDEsMCwxMCwzMCwxLDI4LDAsNjUsMCwyNTMsMTUsMjUzLDEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMjUzLDE4NiwxLDI2LDExXSkpfWNhdGNoKGUpe3JldHVybiAhMX19KSgpLGg9ZS53YXNtUGF0aHMsZz0ic3RyaW5nIj09dHlwZW9mIGg/aDp2b2lkIDAsYj0oKGUsdCk9PnQ/ZT8ib3J0LXdhc20tc2ltZC10aHJlYWRlZC53YXNtIjoib3J0LXdhc20tdGhyZWFkZWQud2FzbSI6ZT8ib3J0LXdhc20tc2ltZC53YXNtIjoib3J0LXdhc20ud2FzbSIpKGYsaSksbT0ib2JqZWN0Ij09dHlwZW9mIGg/aFtiXTp2b2lkIDA7bGV0IHk9ITE7Y29uc3Qgdj1bXTtpZih0PjAmJnYucHVzaChuZXcgUHJvbWlzZSgoZT0+e3NldFRpbWVvdXQoKCgpPT57eT0hMCxlKCk7fSksdCk7fSkpKSx2LnB1c2gobmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgcj1pP3U6YSxvPXtsb2NhdGVGaWxlOihlLHQpPT5pJiZlLmVuZHNXaXRoKCIud29ya2VyLmpzIikmJiJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYj9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuKDQxNTQpXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKTplLmVuZHNXaXRoKCIud2FzbSIpP218fChudWxsIT1nP2c6dCkrYjp0K2V9O2lmKGkpaWYoInVuZGVmaW5lZCI9PXR5cGVvZiBCbG9iKW8ubWFpblNjcmlwdFVybE9yQmxvYj1zLmpvaW4oX19kaXJuYW1lLCJvcnQtd2FzbS10aHJlYWRlZC5qcyIpO2Vsc2Uge2NvbnN0IGU9YHZhciBvcnRXYXNtVGhyZWFkZWQ9KGZ1bmN0aW9uKCl7dmFyIF9zY3JpcHREaXI7cmV0dXJuICR7ci50b1N0cmluZygpfX0pKCk7YDtvLm1haW5TY3JpcHRVcmxPckJsb2I9bmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSk7fXIobykudGhlbigodD0+e3A9ITEsYz0hMCxsPXQsZSgpO30pLChlPT57cD0hMSxkPSEwLHQoZSk7fSkpO30pKSksYXdhaXQgUHJvbWlzZS5yYWNlKHYpLHkpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7dH1tc2ApfSx0LmdldEluc3RhbmNlPSgpPT57aWYoYyYmbClyZXR1cm4gbDt0aHJvdyBuZXcgRXJyb3IoIldlYkFzc2VtYmx5IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIil9LHQuZGlzcG9zZT0oKT0+e3ZhciBlOyFjfHxwfHxkfHwocD0hMCxudWxsPT09KGU9bC5QVGhyZWFkKXx8dm9pZCAwPT09ZXx8ZS50ZXJtaW5hdGVBbGxUaHJlYWRzKCksbD12b2lkIDAscD0hMSxjPSExLGQ9ITApO307fSwxNDk3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jaGVja0xhc3RFcnJvcj10Lml0ZXJhdGVFeHRyYU9wdGlvbnM9dC5hbGxvY1dhc21TdHJpbmc9dm9pZCAwO2NvbnN0IHI9bigyNjMpO3QuYWxsb2NXYXNtU3RyaW5nPShlLHQpPT57Y29uc3Qgbj0oMCwgci5nZXRJbnN0YW5jZSkoKSxvPW4ubGVuZ3RoQnl0ZXNVVEY4KGUpKzEsaT1uLl9tYWxsb2Mobyk7cmV0dXJuIG4uc3RyaW5nVG9VVEY4KGUsaSxvKSx0LnB1c2goaSksaX0sdC5pdGVyYXRlRXh0cmFPcHRpb25zPShlLG4scixvKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUpe2lmKHIuaGFzKGUpKXRocm93IG5ldyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGluIG9wdGlvbnMiKTtyLmFkZChlKTt9T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoKFtlLGldKT0+e2NvbnN0IHM9bj9uK2U6ZTtpZigib2JqZWN0Ij09dHlwZW9mIGkpKDAsIHQuaXRlcmF0ZUV4dHJhT3B0aW9ucykoaSxzKyIuIixyLG8pO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBpfHwibnVtYmVyIj09dHlwZW9mIGkpbyhzLGkudG9TdHJpbmcoKSk7ZWxzZSB7aWYoImJvb2xlYW4iIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogIit0eXBlb2YgaSk7byhzLGk/IjEiOiIwIik7fX0pKTt9LHQuY2hlY2tMYXN0RXJyb3I9ZT0+e2NvbnN0IHQ9KDAsIHIuZ2V0SW5zdGFuY2UpKCksbj10LnN0YWNrU2F2ZSgpO3RyeXtjb25zdCBuPXQuc3RhY2tBbGxvYyg4KTt0Ll9PcnRHZXRMYXN0RXJyb3IobixuKzQpO2NvbnN0IHI9dC5IRUFQMzJbbi80XSxvPXQuSEVBUFUzMltuLzQrMV0saT1vP3QuVVRGOFRvU3RyaW5nKG8pOiIiO3Rocm93IG5ldyBFcnJvcihgJHtlfSBFUlJPUl9DT0RFOiAke3J9LCBFUlJPUl9NRVNTQUdFOiAke2l9YCl9ZmluYWxseXt0LnN0YWNrUmVzdG9yZShuKTt9fTt9LDgwNTA6KGUsdCxuKT0+e24uZCh0LHtaOigpPT5pfSk7dmFyIHI9big2NjE0KSxvPW4ubihyKTtmdW5jdGlvbiBpKCl7cmV0dXJuIG8oKSgnLyohXG4qIE9OTlggUnVudGltZSBXZWIgdjEuMTYuM1xuKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuKi9cbigoKT0+e3ZhciBlPXs5MTg6KGUsdCxyKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zZXRSdW5PcHRpb25zPXZvaWQgMDtjb25zdCBuPXIoMjYzKSxhPXIoNDk3KTt0LnNldFJ1bk9wdGlvbnM9ZT0+e2NvbnN0IHQ9KDAsbi5nZXRJbnN0YW5jZSkoKTtsZXQgcj0wO2NvbnN0IG89W10saT1lfHx7fTt0cnl7aWYodm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUubG9nU2V2ZXJpdHlMZXZlbCkpaS5sb2dTZXZlcml0eUxldmVsPTI7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIGUubG9nU2V2ZXJpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dTZXZlcml0eUxldmVsKXx8ZS5sb2dTZXZlcml0eUxldmVsPDB8fGUubG9nU2V2ZXJpdHlMZXZlbD40KXRocm93IG5ldyBFcnJvcihgbG9nIHNlcnZlcml0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7ZS5sb2dTZXZlcml0eUxldmVsfWApO2lmKHZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLmxvZ1ZlcmJvc2l0eUxldmVsKSlpLmxvZ1ZlcmJvc2l0eUxldmVsPTA7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIGUubG9nVmVyYm9zaXR5TGV2ZWx8fCFOdW1iZXIuaXNJbnRlZ2VyKGUubG9nVmVyYm9zaXR5TGV2ZWwpKXRocm93IG5ldyBFcnJvcihgbG9nIHZlcmJvc2l0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7ZS5sb2dWZXJib3NpdHlMZXZlbH1gKTt2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS50ZXJtaW5hdGUpJiYoaS50ZXJtaW5hdGU9ITEpO2xldCBuPTA7cmV0dXJuIHZvaWQgMCE9PShudWxsPT1lP3ZvaWQgMDplLnRhZykmJihuPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShlLnRhZyxvKSkscj10Ll9PcnRDcmVhdGVSdW5PcHRpb25zKGkubG9nU2V2ZXJpdHlMZXZlbCxpLmxvZ1ZlcmJvc2l0eUxldmVsLCEhaS50ZXJtaW5hdGUsbiksMD09PXImJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgY3JlYXRlIHJ1biBvcHRpb25zLiIpLHZvaWQgMCE9PShudWxsPT1lP3ZvaWQgMDplLmV4dHJhKSYmKDAsYS5pdGVyYXRlRXh0cmFPcHRpb25zKShlLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSxuKT0+e2NvbnN0IGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUsbykscz0oMCxhLmFsbG9jV2FzbVN0cmluZykobixvKTswIT09dC5fT3J0QWRkUnVuQ29uZmlnRW50cnkocixpLHMpJiYoMCxhLmNoZWNrTGFzdEVycm9yKShgQ2FuXCd0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke259LmApfSkpLFtyLG9dfWNhdGNoKGUpe3Rocm93IDAhPT1yJiZ0Ll9PcnRSZWxlYXNlUnVuT3B0aW9ucyhyKSxvLmZvckVhY2goKGU9PnQuX2ZyZWUoZSkpKSxlfX19LDYyMjooZSx0LHIpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFNlc3Npb25PcHRpb25zPXZvaWQgMDtjb25zdCBuPXIoMjYzKSxhPXIoNDk3KTt0LnNldFNlc3Npb25PcHRpb25zPWU9Pnt2YXIgdCxyLG8saTtjb25zdCBzPSgwLG4uZ2V0SW5zdGFuY2UpKCk7bGV0IHU9MDtjb25zdCBjPVtdLGw9ZXx8e307KGU9PntlLmV4dHJhfHwoZS5leHRyYT17fSksZS5leHRyYS5zZXNzaW9ufHwoZS5leHRyYS5zZXNzaW9uPXt9KTtjb25zdCB0PWUuZXh0cmEuc2Vzc2lvbjt0LnVzZV9vcnRfbW9kZWxfYnl0ZXNfZGlyZWN0bHl8fCh0LnVzZV9vcnRfbW9kZWxfYnl0ZXNfZGlyZWN0bHk9IjEiKSxlLmV4ZWN1dGlvblByb3ZpZGVycyYmZS5leGVjdXRpb25Qcm92aWRlcnMuc29tZSgoZT0+IndlYmdwdSI9PT0oInN0cmluZyI9PXR5cGVvZiBlP2U6ZS5uYW1lKSkpJiYoZS5lbmFibGVNZW1QYXR0ZXJuPSExKX0pKGwpO3RyeXtjb25zdCBlPShlPT57c3dpdGNoKGUpe2Nhc2UiZGlzYWJsZWQiOnJldHVybiAwO2Nhc2UiYmFzaWMiOnJldHVybiAxO2Nhc2UiZXh0ZW5kZWQiOnJldHVybiAyO2Nhc2UiYWxsIjpyZXR1cm4gOTk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGdyYXBoIG9wdGltaXphdGlvbiBsZXZlbDogJHtlfWApfX0pKG51bGwhPT0odD1sLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWwpJiZ2b2lkIDAhPT10P3Q6ImFsbCIpLGY9KGU9Pntzd2l0Y2goZSl7Y2FzZSJzZXF1ZW50aWFsIjpyZXR1cm4gMDtjYXNlInBhcmFsbGVsIjpyZXR1cm4gMTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZXhlY3V0aW9uIG1vZGU6ICR7ZX1gKX19KShudWxsIT09KHI9bC5leGVjdXRpb25Nb2RlKSYmdm9pZCAwIT09cj9yOiJzZXF1ZW50aWFsIiksZD0ic3RyaW5nIj09dHlwZW9mIGwubG9nSWQ/KDAsYS5hbGxvY1dhc21TdHJpbmcpKGwubG9nSWQsYyk6MCxwPW51bGwhPT0obz1sLmxvZ1NldmVyaXR5TGV2ZWwpJiZ2b2lkIDAhPT1vP286MjtpZighTnVtYmVyLmlzSW50ZWdlcihwKXx8cDwwfHxwPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtwfWApO2NvbnN0IGc9bnVsbCE9PShpPWwubG9nVmVyYm9zaXR5TGV2ZWwpJiZ2b2lkIDAhPT1pP2k6MDtpZighTnVtYmVyLmlzSW50ZWdlcihnKXx8ZzwwfHxnPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtnfWApO2NvbnN0IGg9InN0cmluZyI9PXR5cGVvZiBsLm9wdGltaXplZE1vZGVsRmlsZVBhdGg/KDAsYS5hbGxvY1dhc21TdHJpbmcpKGwub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxjKTowO3JldHVybiB1PXMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zKGUsISFsLmVuYWJsZUNwdU1lbUFyZW5hLCEhbC5lbmFibGVNZW1QYXR0ZXJuLGYsISFsLmVuYWJsZVByb2ZpbGluZywwLGQscCxnLGgpLDA9PT11JiYoMCxhLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMuIiksbC5leGVjdXRpb25Qcm92aWRlcnMmJigoZSx0LHIpPT57Zm9yKGNvbnN0IG8gb2YgdCl7bGV0IHQ9InN0cmluZyI9PXR5cGVvZiBvP286by5uYW1lO3N3aXRjaCh0KXtjYXNlInhubnBhY2siOnQ9IlhOTlBBQ0siO2JyZWFrO2Nhc2Uid2Vibm4iOmlmKHQ9IldFQk5OIiwic3RyaW5nIiE9dHlwZW9mIG8pe2NvbnN0IHQ9bztpZihudWxsPT10P3ZvaWQgMDp0LmRldmljZVR5cGUpe2NvbnN0IG89KDAsYS5hbGxvY1dhc21TdHJpbmcpKCJkZXZpY2VUeXBlIixyKSxpPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSh0LmRldmljZVR5cGUscik7MCE9PSgwLG4uZ2V0SW5zdGFuY2UpKCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShlLG8saSkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6IFwnZGV2aWNlVHlwZVwnIC0gJHt0LmRldmljZVR5cGV9LmApfWlmKG51bGw9PXQ/dm9pZCAwOnQucG93ZXJQcmVmZXJlbmNlKXtjb25zdCBvPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSgicG93ZXJQcmVmZXJlbmNlIixyKSxpPSgwLGEuYWxsb2NXYXNtU3RyaW5nKSh0LnBvd2VyUHJlZmVyZW5jZSxyKTswIT09KDAsbi5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsbyxpKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogXCdwb3dlclByZWZlcmVuY2VcJyAtICR7dC5wb3dlclByZWZlcmVuY2V9LmApfX1icmVhaztjYXNlIndlYmdwdSI6dD0iSlMiO2JyZWFrO2Nhc2Uid2FzbSI6Y2FzZSJjcHUiOmNvbnRpbnVlO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fWApfWNvbnN0IGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQscik7MCE9PSgwLG4uZ2V0SW5zdGFuY2UpKCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKGUsaSkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3QgYXBwZW5kIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fS5gKX19KSh1LGwuZXhlY3V0aW9uUHJvdmlkZXJzLGMpLHZvaWQgMCE9PWwuZXh0cmEmJigwLGEuaXRlcmF0ZUV4dHJhT3B0aW9ucykobC5leHRyYSwiIixuZXcgV2Vha1NldCwoKGUsdCk9Pntjb25zdCByPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShlLGMpLG49KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQsYyk7MCE9PXMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeSh1LHIsbikmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7ZX0gLSAke3R9LmApfSkpLFt1LGNdfWNhdGNoKGUpe3Rocm93IDAhPT11JiZzLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnModSksYy5mb3JFYWNoKChlPT5zLl9mcmVlKGUpKSksZX19fSw5MTc6KGUsdCk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQubG9nTGV2ZWxTdHJpbmdUb0VudW09dC50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3I9dC5nZXRUZW5zb3JFbGVtZW50U2l6ZT10LnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nPXQudGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW09dm9pZCAwLHQudGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW09ZT0+e3N3aXRjaChlKXtjYXNlImludDgiOnJldHVybiAzO2Nhc2UidWludDgiOnJldHVybiAyO2Nhc2UiYm9vbCI6cmV0dXJuIDk7Y2FzZSJpbnQxNiI6cmV0dXJuIDU7Y2FzZSJ1aW50MTYiOnJldHVybiA0O2Nhc2UiaW50MzIiOnJldHVybiA2O2Nhc2UidWludDMyIjpyZXR1cm4gMTI7Y2FzZSJmbG9hdDE2IjpyZXR1cm4gMTA7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gMTtjYXNlImZsb2F0NjQiOnJldHVybiAxMTtjYXNlInN0cmluZyI6cmV0dXJuIDg7Y2FzZSJpbnQ2NCI6cmV0dXJuIDc7Y2FzZSJ1aW50NjQiOnJldHVybiAxMztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fSx0LnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nPWU9Pntzd2l0Y2goZSl7Y2FzZSAzOnJldHVybiJpbnQ4IjtjYXNlIDI6cmV0dXJuInVpbnQ4IjtjYXNlIDk6cmV0dXJuImJvb2wiO2Nhc2UgNTpyZXR1cm4iaW50MTYiO2Nhc2UgNDpyZXR1cm4idWludDE2IjtjYXNlIDY6cmV0dXJuImludDMyIjtjYXNlIDEyOnJldHVybiJ1aW50MzIiO2Nhc2UgMTA6cmV0dXJuImZsb2F0MTYiO2Nhc2UgMTpyZXR1cm4iZmxvYXQzMiI7Y2FzZSAxMTpyZXR1cm4iZmxvYXQ2NCI7Y2FzZSA4OnJldHVybiJzdHJpbmciO2Nhc2UgNzpyZXR1cm4iaW50NjQiO2Nhc2UgMTM6cmV0dXJuInVpbnQ2NCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtlfWApfX0sdC5nZXRUZW5zb3JFbGVtZW50U2l6ZT1lPT5bdm9pZCAwLDQsMSwxLDIsMiw0LDgsdm9pZCAwLDEsMiw4LDQsOCx2b2lkIDAsdm9pZCAwLHZvaWQgMF1bZV0sdC50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3I9ZT0+e3N3aXRjaChlKXtjYXNlImZsb2F0MTYiOmNhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7ZX1gKX19LHQubG9nTGV2ZWxTdHJpbmdUb0VudW09ZT0+e3N3aXRjaChlKXtjYXNlInZlcmJvc2UiOnJldHVybiAwO2Nhc2UiaW5mbyI6cmV0dXJuIDE7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gMjtjYXNlImVycm9yIjpyZXR1cm4gMztjYXNlImZhdGFsIjpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtlfWApfX19LDI1OTooZSx0LHIpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPXQuZW5kUHJvZmlsaW5nPXQucnVuPXQucmVsZWFzZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPXQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPXQuaW5pdFJ1bnRpbWU9dm9pZCAwO2NvbnN0IG49cig5MTgpLGE9cig2MjIpLG89cig5MTcpLGk9cigyNjMpLHM9cig0OTcpO3QuaW5pdFJ1bnRpbWU9YXN5bmMgZT0+e3ZhciB0LHI7dD1lLndhc20ubnVtVGhyZWFkcyxyPSgwLG8ubG9nTGV2ZWxTdHJpbmdUb0VudW0pKGUubG9nTGV2ZWwpLDAhPT0oMCxpLmdldEluc3RhbmNlKSgpLl9PcnRJbml0KHQscikmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgaW5pdGlhbGl6ZSBvbm54cnVudGltZS4iKX07Y29uc3QgdT1uZXcgTWFwO3QuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPWU9Pntjb25zdCB0PSgwLGkuZ2V0SW5zdGFuY2UpKCkscj10Ll9tYWxsb2MoZS5ieXRlTGVuZ3RoKTtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoYENhblwndCBjcmVhdGUgYSBzZXNzaW9uLiBmYWlsZWQgdG8gYWxsb2NhdGUgYSBidWZmZXIgb2Ygc2l6ZSAke2UuYnl0ZUxlbmd0aH0uYCk7cmV0dXJuIHQuSEVBUFU4LnNldChlLHIpLFtyLGUuYnl0ZUxlbmd0aF19LHQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPShlLHQpPT57Y29uc3Qgcj0oMCxpLmdldEluc3RhbmNlKSgpO2xldCBuPTAsbz0wLGM9W107Y29uc3QgbD1bXSxmPVtdO3RyeXtbbyxjXT0oMCxhLnNldFNlc3Npb25PcHRpb25zKSh0KSxuPXIuX09ydENyZWF0ZVNlc3Npb24oZVswXSxlWzFdLG8pLDA9PT1uJiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGNyZWF0ZSBhIHNlc3Npb24uIik7Y29uc3RbZCxwXT0oZT0+e2NvbnN0IHQ9KDAsaS5nZXRJbnN0YW5jZSkoKSxyPXQuc3RhY2tTYXZlKCk7dHJ5e2NvbnN0IHI9dC5zdGFja0FsbG9jKDgpO3JldHVybiAwIT09dC5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudChlLHIscis0KSYmKDAscy5jaGVja0xhc3RFcnJvcikoIkNhblwndCBnZXQgc2Vzc2lvbiBpbnB1dC9vdXRwdXQgY291bnQuIiksW3QuSEVBUDMyW3IvNF0sdC5IRUFQMzJbci80KzFdXX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKHIpfX0pKG4pLGc9W10saD1bXTtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtjb25zdCB0PXIuX09ydEdldElucHV0TmFtZShuLGUpOzA9PT10JiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGdldCBhbiBpbnB1dCBuYW1lLiIpLGwucHVzaCh0KSxnLnB1c2goci5VVEY4VG9TdHJpbmcodCkpfWZvcihsZXQgZT0wO2U8cDtlKyspe2NvbnN0IHQ9ci5fT3J0R2V0T3V0cHV0TmFtZShuLGUpOzA9PT10JiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGdldCBhbiBvdXRwdXQgbmFtZS4iKSxmLnB1c2godCksaC5wdXNoKHIuVVRGOFRvU3RyaW5nKHQpKX1yZXR1cm4gdS5zZXQobixbbixsLGZdKSxbbixnLGhdfWNhdGNoKGUpe3Rocm93IGwuZm9yRWFjaCgoZT0+ci5fT3J0RnJlZShlKSkpLGYuZm9yRWFjaCgoZT0+ci5fT3J0RnJlZShlKSkpLDAhPT1uJiZyLl9PcnRSZWxlYXNlU2Vzc2lvbihuKSxlfWZpbmFsbHl7ci5fZnJlZShlWzBdKSwwIT09byYmci5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKG8pLGMuZm9yRWFjaCgoZT0+ci5fZnJlZShlKSkpfX0sdC5jcmVhdGVTZXNzaW9uPShlLHIpPT57Y29uc3Qgbj0oMCx0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkoZSk7cmV0dXJuKDAsdC5jcmVhdGVTZXNzaW9uRmluYWxpemUpKG4scil9LHQucmVsZWFzZVNlc3Npb249ZT0+e2NvbnN0IHQ9KDAsaS5nZXRJbnN0YW5jZSkoKSxyPXUuZ2V0KGUpO2lmKCFyKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlbGVhc2Ugc2Vzc2lvbi4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2V9YCk7Y29uc3RbbixhLG9dPXI7YS5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksby5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksdC5fT3J0UmVsZWFzZVNlc3Npb24obiksdS5kZWxldGUoZSl9LHQucnVuPWFzeW5jKGUsdCxyLGEsYyk9Pntjb25zdCBsPSgwLGkuZ2V0SW5zdGFuY2UpKCksZj11LmdldChlKTtpZighZil0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBydW4gaW5mZXJlbmNlLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7ZX1gKTtjb25zdFtkLHAsZ109ZixoPXQubGVuZ3RoLG09YS5sZW5ndGg7bGV0IHk9MCx2PVtdO2NvbnN0IGI9W10sdz1bXTt0cnl7W3ksdl09KDAsbi5zZXRSdW5PcHRpb25zKShjKTtmb3IobGV0IGU9MDtlPGg7ZSsrKXtjb25zdCB0PXJbZV1bMF0sbj1yW2VdWzFdLGE9cltlXVsyXTtsZXQgaSx1O2lmKEFycmF5LmlzQXJyYXkoYSkpe3U9NCphLmxlbmd0aCxpPWwuX21hbGxvYyh1KSx3LnB1c2goaSk7bGV0IGU9aS80O2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCsrKXtpZigic3RyaW5nIiE9dHlwZW9mIGFbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHt0fSBpcyBub3QgYSBzdHJpbmdgKTtsLkhFQVBVMzJbZSsrXT0oMCxzLmFsbG9jV2FzbVN0cmluZykoYVt0XSx3KX19ZWxzZSB1PWEuYnl0ZUxlbmd0aCxpPWwuX21hbGxvYyh1KSx3LnB1c2goaSksbC5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLGEuYnl0ZU9mZnNldCx1KSxpKTtjb25zdCBjPWwuc3RhY2tTYXZlKCksZj1sLnN0YWNrQWxsb2MoNCpuLmxlbmd0aCk7dHJ5e2xldCByPWYvNDtuLmZvckVhY2goKGU9PmwuSEVBUDMyW3IrK109ZSkpO2NvbnN0IGE9bC5fT3J0Q3JlYXRlVGVuc29yKCgwLG8udGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW0pKHQpLGksdSxmLG4ubGVuZ3RoKTswPT09YSYmKDAscy5jaGVja0xhc3RFcnJvcikoYENhblwndCBjcmVhdGUgdGVuc29yIGZvciBpbnB1dFske2V9XS5gKSxiLnB1c2goYSl9ZmluYWxseXtsLnN0YWNrUmVzdG9yZShjKX19Y29uc3QgZT1sLnN0YWNrU2F2ZSgpLGk9bC5zdGFja0FsbG9jKDQqaCksdT1sLnN0YWNrQWxsb2MoNCpoKSxmPWwuc3RhY2tBbGxvYyg0Km0pLF89bC5zdGFja0FsbG9jKDQqbSk7dHJ5e2xldCBlPWkvNCxyPXUvNCxuPWYvNCxjPV8vNDtmb3IobGV0IG49MDtuPGg7bisrKWwuSEVBUFUzMltlKytdPWJbbl0sbC5IRUFQVTMyW3IrK109cFt0W25dXTtmb3IobGV0IGU9MDtlPG07ZSsrKWwuSEVBUFUzMltuKytdPTAsbC5IRUFQVTMyW2MrK109Z1thW2VdXTtsZXQgdj1sLl9PcnRSdW4oZCx1LGksaCxfLG0sZix5KTtjb25zdCB3PWwuanNlcFJ1blByb21pc2U7dyYmdm9pZCAwIT09dy50aGVuJiYodj1hd2FpdCB3KTtjb25zdCBPPVtdOzAhPT12JiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiZmFpbGVkIHRvIGNhbGwgT3J0UnVuKCkuIik7Zm9yKGxldCBlPTA7ZTxtO2UrKyl7Y29uc3QgdD1sLkhFQVBVMzJbZi80K2VdLHI9bC5zdGFja1NhdmUoKSxuPWwuc3RhY2tBbGxvYygxNik7bGV0IGEsaT0wO3RyeXt2PWwuX09ydEdldFRlbnNvckRhdGEodCxuLG4rNCxuKzgsbisxMiksMCE9PXYmJigwLHMuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3QgYWNjZXNzIG91dHB1dCB0ZW5zb3IgZGF0YSBvbiBpbmRleCAke2V9LmApO2xldCByPW4vNDtjb25zdCB1PWwuSEVBUFUzMltyKytdO2k9bC5IRUFQVTMyW3IrK107Y29uc3QgYz1sLkhFQVBVMzJbcisrXSxmPWwuSEVBUFUzMltyKytdLGQ9W107Zm9yKGxldCBlPTA7ZTxmO2UrKylkLnB1c2gobC5IRUFQVTMyW2MvNCtlXSk7bC5fT3J0RnJlZShjKTtjb25zdCBwPTA9PT1kLmxlbmd0aD8xOmQucmVkdWNlKCgoZSx0KT0+ZSp0KSk7aWYoYT0oMCxvLnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nKSh1KSwic3RyaW5nIj09PWEpe2NvbnN0IGU9W107bGV0IHQ9aS80O2ZvcihsZXQgcj0wO3I8cDtyKyspe2NvbnN0IG49bC5IRUFQVTMyW3QrK10sYT1yPT09cC0xP3ZvaWQgMDpsLkhFQVBVMzJbdF0tbjtlLnB1c2gobC5VVEY4VG9TdHJpbmcobixhKSl9Ty5wdXNoKFthLGQsZV0pfWVsc2V7Y29uc3QgZT1uZXcoKDAsby50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3IpKGEpKShwKTtuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zZXQobC5IRUFQVTguc3ViYXJyYXkoaSxpK2UuYnl0ZUxlbmd0aCkpLE8ucHVzaChbYSxkLGVdKX19ZmluYWxseXtsLnN0YWNrUmVzdG9yZShyKSwic3RyaW5nIj09PWEmJmkmJmwuX2ZyZWUoaSksbC5fT3J0UmVsZWFzZVRlbnNvcih0KX19cmV0dXJuIE99ZmluYWxseXtsLnN0YWNrUmVzdG9yZShlKX19ZmluYWxseXtiLmZvckVhY2goKGU9PmwuX09ydFJlbGVhc2VUZW5zb3IoZSkpKSx3LmZvckVhY2goKGU9PmwuX2ZyZWUoZSkpKSwwIT09eSYmbC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMoeSksdi5mb3JFYWNoKChlPT5sLl9mcmVlKGUpKSl9fSx0LmVuZFByb2ZpbGluZz1lPT57Y29uc3QgdD0oMCxpLmdldEluc3RhbmNlKSgpLHI9dS5nZXQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNlc3Npb24gaWQiKTtjb25zdCBuPXJbMF0sYT10Ll9PcnRFbmRQcm9maWxpbmcobik7MD09PWEmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUoYSl9LHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnM9ZT0+e2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSl7Y29uc3QgZT1yWzJdOyFBcnJheS5pc0FycmF5KGUpJiZlLmJ1ZmZlciYmdC5wdXNoKGUuYnVmZmVyKX1yZXR1cm4gdH19LDI2MzpmdW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPXRoaXMmJnRoaXMuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQscixuKXt2b2lkIDA9PT1uJiYobj1yKTt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscik7YSYmISgiZ2V0ImluIGE/IXQuX19lc01vZHVsZTphLndyaXRhYmxlfHxhLmNvbmZpZ3VyYWJsZSl8fChhPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W3JdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sYSl9OmZ1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PW4mJihuPXIpLGVbbl09dFtyXX0pLGE9dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KX06ZnVuY3Rpb24oZSx0KXtlLmRlZmF1bHQ9dH0pLG89dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgciBpbiBlKSJkZWZhdWx0IiE9PXImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZuKHQsZSxyKTtyZXR1cm4gYSh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRpc3Bvc2U9dC5nZXRJbnN0YW5jZT10LmluaXRpYWxpemVXZWJBc3NlbWJseT12b2lkIDA7Y29uc3QgaT1vKHIoNDQ5KSkscz1yKDkzMiksdT1yKDQ3NCk7bGV0IGMsbD0hMSxmPSExLGQ9ITE7dC5pbml0aWFsaXplV2ViQXNzZW1ibHk9YXN5bmMgZT0+e2lmKGwpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2lmKGYpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byBcJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpXCcgZGV0ZWN0ZWQuIik7aWYoZCl0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gXCdpbml0aWFsaXplV2ViQXNzZW1ibHkoKVwnIGZhaWxlZC4iKTtmPSEwO2NvbnN0IHQ9ZS5pbml0VGltZW91dCxuPWUubnVtVGhyZWFkcyxhPWUuc2ltZCxvPW4+MSYmKCgpPT57dHJ5e3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJigidW5kZWZpbmVkIiE9dHlwZW9mIE1lc3NhZ2VDaGFubmVsJiYobmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMSkpLFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDQsMSw5NiwwLDAsMywyLDEsMCw1LDQsMSwzLDEsMSwxMCwxMSwxLDksMCw2NSwwLDI1NCwxNiwyLDAsMjYsMTFdKSkpfWNhdGNoKGUpe3JldHVybiExfX0pKCkscD1hJiYoKCk9Pnt0cnl7cmV0dXJuIFdlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDQsMSw5NiwwLDAsMywyLDEsMCwxMCwzMCwxLDI4LDAsNjUsMCwyNTMsMTUsMjUzLDEyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMjUzLDE4NiwxLDI2LDExXSkpfWNhdGNoKGUpe3JldHVybiExfX0pKCksZz1lLndhc21QYXRocyxoPSJzdHJpbmciPT10eXBlb2YgZz9nOnZvaWQgMCxtPSgoZSx0KT0+dD9lPyJvcnQtd2FzbS1zaW1kLXRocmVhZGVkLndhc20iOiJvcnQtd2FzbS10aHJlYWRlZC53YXNtIjplPyJvcnQtd2FzbS1zaW1kLndhc20iOiJvcnQtd2FzbS53YXNtIikocCxvKSx5PSJvYmplY3QiPT10eXBlb2YgZz9nW21dOnZvaWQgMDtsZXQgdj0hMTtjb25zdCBiPVtdO2lmKHQ+MCYmYi5wdXNoKG5ldyBQcm9taXNlKChlPT57c2V0VGltZW91dCgoKCk9Pnt2PSEwLGUoKX0pLHQpfSkpKSxiLnB1c2gobmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgbj1vP3U6cyxhPXtsb2NhdGVGaWxlOihlLHQpPT5vJiZlLmVuZHNXaXRoKCIud29ya2VyLmpzIikmJiJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYj9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyKDE1NCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpOmUuZW5kc1dpdGgoIi53YXNtIik/eXx8KG51bGwhPWg/aDp0KSttOnQrZX07aWYobylpZigidW5kZWZpbmVkIj09dHlwZW9mIEJsb2IpYS5tYWluU2NyaXB0VXJsT3JCbG9iPWkuam9pbihfX2Rpcm5hbWUsIm9ydC13YXNtLXRocmVhZGVkLmpzIik7ZWxzZXtjb25zdCBlPWB2YXIgb3J0V2FzbVRocmVhZGVkPShmdW5jdGlvbigpe3ZhciBfc2NyaXB0RGlyO3JldHVybiAke24udG9TdHJpbmcoKX19KSgpO2A7YS5tYWluU2NyaXB0VXJsT3JCbG9iPW5ldyBCbG9iKFtlXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pfW4oYSkudGhlbigodD0+e2Y9ITEsbD0hMCxjPXQsZSgpfSksKGU9PntmPSExLGQ9ITAsdChlKX0pKX0pKSksYXdhaXQgUHJvbWlzZS5yYWNlKGIpLHYpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7dH1tc2ApfSx0LmdldEluc3RhbmNlPSgpPT57aWYobCYmYylyZXR1cm4gYzt0aHJvdyBuZXcgRXJyb3IoIldlYkFzc2VtYmx5IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIil9LHQuZGlzcG9zZT0oKT0+e3ZhciBlOyFsfHxmfHxkfHwoZj0hMCxudWxsPT09KGU9Yy5QVGhyZWFkKXx8dm9pZCAwPT09ZXx8ZS50ZXJtaW5hdGVBbGxUaHJlYWRzKCksYz12b2lkIDAsZj0hMSxsPSExLGQ9ITApfX0sNDk3OihlLHQscik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY2hlY2tMYXN0RXJyb3I9dC5pdGVyYXRlRXh0cmFPcHRpb25zPXQuYWxsb2NXYXNtU3RyaW5nPXZvaWQgMDtjb25zdCBuPXIoMjYzKTt0LmFsbG9jV2FzbVN0cmluZz0oZSx0KT0+e2NvbnN0IHI9KDAsbi5nZXRJbnN0YW5jZSkoKSxhPXIubGVuZ3RoQnl0ZXNVVEY4KGUpKzEsbz1yLl9tYWxsb2MoYSk7cmV0dXJuIHIuc3RyaW5nVG9VVEY4KGUsbyxhKSx0LnB1c2gobyksb30sdC5pdGVyYXRlRXh0cmFPcHRpb25zPShlLHIsbixhKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUpe2lmKG4uaGFzKGUpKXRocm93IG5ldyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGluIG9wdGlvbnMiKTtuLmFkZChlKX1PYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2Usb10pPT57Y29uc3QgaT1yP3IrZTplO2lmKCJvYmplY3QiPT10eXBlb2YgbykoMCx0Lml0ZXJhdGVFeHRyYU9wdGlvbnMpKG8saSsiLiIsbixhKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygb3x8Im51bWJlciI9PXR5cGVvZiBvKWEoaSxvLnRvU3RyaW5nKCkpO2Vsc2V7aWYoImJvb2xlYW4iIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkNhblwndCBoYW5kbGUgZXh0cmEgY29uZmlnIHR5cGU6ICIrdHlwZW9mIG8pO2EoaSxvPyIxIjoiMCIpfX0pKX0sdC5jaGVja0xhc3RFcnJvcj1lPT57Y29uc3QgdD0oMCxuLmdldEluc3RhbmNlKSgpLHI9dC5zdGFja1NhdmUoKTt0cnl7Y29uc3Qgcj10LnN0YWNrQWxsb2MoOCk7dC5fT3J0R2V0TGFzdEVycm9yKHIscis0KTtjb25zdCBuPXQuSEVBUDMyW3IvNF0sYT10LkhFQVBVMzJbci80KzFdLG89YT90LlVURjhUb1N0cmluZyhhKToiIjt0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gRVJST1JfQ09ERTogJHtufSwgRVJST1JfTUVTU0FHRTogJHtvfWApfWZpbmFsbHl7dC5zdGFja1Jlc3RvcmUocil9fX0sNDc0OihlLHQscik9Pnt2YXIgX3NjcmlwdERpcixuPShfc2NyaXB0RGlyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKF9zY3JpcHREaXI9X3NjcmlwdERpcnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7ZnVuY3Rpb24gdCgpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSx4fWZ1bmN0aW9uIG4oKXtyZXR1cm4gay5idWZmZXIhPXguYnVmZmVyJiZZKCksSX1mdW5jdGlvbiBhKCl7cmV0dXJuIGsuYnVmZmVyIT14LmJ1ZmZlciYmWSgpLFV9ZnVuY3Rpb24gbygpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSxMfWZ1bmN0aW9uIGkoKXtyZXR1cm4gay5idWZmZXIhPXguYnVmZmVyJiZZKCksV312YXIgcyx1LGM9ZTtjLnJlYWR5PW5ldyBQcm9taXNlKCgoZSx0KT0+e3M9ZSx1PXR9KSk7dmFyIGwsZixkLHA9T2JqZWN0LmFzc2lnbih7fSxjKSxnPSIuL3RoaXMucHJvZ3JhbSIsaD0oZSx0KT0+e3Rocm93IHR9LG09Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cseT0iZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cyx2PSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSxiPWMuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRHx8ITEsdz0iIjtmdW5jdGlvbiBfKGUpe3JldHVybiBjLmxvY2F0ZUZpbGU/Yy5sb2NhdGVGaWxlKGUsdyk6dytlfWlmKHYpe3ZhciBPPXIoMzg0KSxTPXIoOTA4KTtsZXQgdDt3PXk/Uy5kaXJuYW1lKHcpKyIvIjpfX2Rpcm5hbWUrIi8iLGw9KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6Uy5ub3JtYWxpemUoZSksTy5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSxkPWU9PigoZT1sKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxmPShlLHQscixuPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTpTLm5vcm1hbGl6ZShlKSxPLnJlYWRGaWxlKGUsbj92b2lkIDA6InV0ZjgiLCgoZSxhKT0+e2U/cihlKTp0KG4/YS5idWZmZXI6YSl9KSl9LCFjLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihnPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLGg9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0sYy5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iO3RyeXt0PXIoOTI1KX1jYXRjaChlKXt0aHJvdyBjb25zb2xlLmVycm9yKFwnVGhlICJ3b3JrZXJfdGhyZWFkcyIgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBub2RlLmpzIGJ1aWxkIC0gcGVyaGFwcyBhIG5ld2VyIHZlcnNpb24gaXMgbmVlZGVkP1wnKSxlfWdsb2JhbC5Xb3JrZXI9dC5Xb3JrZXJ9ZWxzZShtfHx5KSYmKHk/dz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLF9zY3JpcHREaXImJih3PV9zY3JpcHREaXIpLHc9MCE9PXcuaW5kZXhPZigiYmxvYjoiKT93LnN1YnN0cigwLHcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIix2fHwobD1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5zZW5kKG51bGwpLHQucmVzcG9uc2VUZXh0fSx5JiYoZD1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix0LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkodC5yZXNwb25zZSl9KSxmPShlLHQscik9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PnsyMDA9PW4uc3RhdHVzfHwwPT1uLnN0YXR1cyYmbi5yZXNwb25zZT90KG4ucmVzcG9uc2UpOnIoKX0sbi5vbmVycm9yPXIsbi5zZW5kKG51bGwpfSkpO3YmJiJ1bmRlZmluZWQiPT10eXBlb2YgcGVyZm9ybWFuY2UmJihnbG9iYWwucGVyZm9ybWFuY2U9cig5NTMpLnBlcmZvcm1hbmNlKTt2YXIgRT1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLEE9Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO3YmJihFPSguLi5lKT0+Ty53cml0ZVN5bmMoMSxlLmpvaW4oIiAiKSsiXFxuIiksQT0oLi4uZSk9Pk8ud3JpdGVTeW5jKDIsZS5qb2luKCIgIikrIlxcbiIpKTt2YXIgVCxNPWMucHJpbnR8fEUsUj1jLnByaW50RXJyfHxBO09iamVjdC5hc3NpZ24oYyxwKSxwPW51bGwsYy50aGlzUHJvZ3JhbSYmKGc9Yy50aGlzUHJvZ3JhbSksYy5xdWl0JiYoaD1jLnF1aXQpLGMud2FzbUJpbmFyeSYmKFQ9Yy53YXNtQmluYXJ5KTt2YXIgRj1jLm5vRXhpdFJ1bnRpbWV8fCEwOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJnRlKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIGssQyxQLEQseCxJLFUsTCxXLEg9ITE7ZnVuY3Rpb24gWSgpe3ZhciBlPWsuYnVmZmVyO2MuSEVBUDg9eD1uZXcgSW50OEFycmF5KGUpLGMuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGMuSEVBUDMyPVU9bmV3IEludDMyQXJyYXkoZSksYy5IRUFQVTg9ST1uZXcgVWludDhBcnJheShlKSxjLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGMuSEVBUFUzMj1MPW5ldyBVaW50MzJBcnJheShlKSxjLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxjLkhFQVBGNjQ9Vz1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBqPWMuSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2O2lmKDUyNDI4ODA8PWp8fHRlKCJJTklUSUFMX01FTU9SWSBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gU1RBQ0tfU0laRSwgd2FzICIraisiISAoU1RBQ0tfU0laRT01MjQyODgwKSIpLGIpaz1jLndhc21NZW1vcnk7ZWxzZSBpZihjLndhc21NZW1vcnkpaz1jLndhc21NZW1vcnk7ZWxzZSBpZighKChrPW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6ai82NTUzNixtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pKS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikpdGhyb3cgUigicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnIiksdiYmUigiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQvb3IgcmVjZW50IHZlcnNpb24pIiksRXJyb3IoImJhZCBtZW1vcnkiKTtZKCksaj1rLmJ1ZmZlci5ieXRlTGVuZ3RoO3ZhciB6LEc9W10sTj1bXSxCPVtdLCQ9MDtmdW5jdGlvbiBxKCl7cmV0dXJuIEZ8fDA8JH12YXIgVixKLFg9MCxLPW51bGwsWj1udWxsO2Z1bmN0aW9uIFEoKXtYKyssYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoWCl9ZnVuY3Rpb24gZWUoKXtpZihYLS0sYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoWCksMD09WCYmKG51bGwhPT1LJiYoY2xlYXJJbnRlcnZhbChLKSxLPW51bGwpLFopKXt2YXIgZT1aO1o9bnVsbCxlKCl9fWZ1bmN0aW9uIHRlKGUpe3Rocm93IGMub25BYm9ydCYmYy5vbkFib3J0KGUpLFIoZT0iQWJvcnRlZCgiK2UrIikiKSxIPSEwLEQ9MSxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLHUoZSksZX1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9ZnVuY3Rpb24gbmUoZSl7aWYoZT09ViYmVClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoVCk7aWYoZClyZXR1cm4gZChlKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gYWUoZSx0LHIpe3JldHVybiBmdW5jdGlvbihlKXtpZighVCYmKG18fHkpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZmV0Y2gmJiFlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSlyZXR1cm4gZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKHQ9PntpZighdC5vayl0aHJvdyJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0IFwnIitlKyJcJyI7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX0pKS5jYXRjaCgoKCk9Pm5lKGUpKSk7aWYoZilyZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57ZihlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSkscil9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT5uZShlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4ociwoZT0+e1IoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksdGUoZSl9KSl9ZnVuY3Rpb24gb2UoZSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9YFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtlfSlgLHRoaXMuc3RhdHVzPWV9ZnVuY3Rpb24gaWUoZSl7ZS50ZXJtaW5hdGUoKSxlLm9ubWVzc2FnZT0oKT0+e319ZnVuY3Rpb24gc2UoZSl7KGU9Z2UuRmFbZV0pfHx0ZSgpLGdlLmZiKGUpfWZ1bmN0aW9uIHVlKGUpe3ZhciB0PWdlLlphKCk7aWYoIXQpcmV0dXJuIDY7Z2UuSWEucHVzaCh0KSxnZS5GYVtlLkhhXT10LHQuSGE9ZS5IYTt2YXIgcj17Y21kOiJydW4iLHN0YXJ0X3JvdXRpbmU6ZS5nYixhcmc6ZS5ZYSxwdGhyZWFkX3B0cjplLkhhfTtyZXR1cm4gdiYmdC51bnJlZigpLHQucG9zdE1lc3NhZ2UocixlLm1iKSwwfXJlKFY9Im9ydC13YXNtLXRocmVhZGVkLndhc20iKXx8KFY9XyhWKSk7dmFyIGNlPSJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwLGxlPShlLHQscik9Pnt2YXIgbj0odD4+Pj0wKStyO2ZvcihyPXQ7ZVtyXSYmIShyPj1uKTspKytyO2lmKDE2PHItdCYmZS5idWZmZXImJmNlKXJldHVybiBjZS5kZWNvZGUoZS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcj9lLnNsaWNlKHQscik6ZS5zdWJhcnJheSh0LHIpKTtmb3Iobj0iIjt0PHI7KXt2YXIgYT1lW3QrK107aWYoMTI4JmEpe3ZhciBvPTYzJmVbdCsrXTtpZigxOTI9PSgyMjQmYSkpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmYSk8PDZ8byk7ZWxzZXt2YXIgaT02MyZlW3QrK107NjU1MzY+KGE9MjI0PT0oMjQwJmEpPygxNSZhKTw8MTJ8bzw8NnxpOig3JmEpPDwxOHxvPDwxMnxpPDw2fDYzJmVbdCsrXSk/bis9U3RyaW5nLmZyb21DaGFyQ29kZShhKTooYS09NjU1MzYsbis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxhPj4xMCw1NjMyMHwxMDIzJmEpKX19ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxmZT0oZSx0KT0+KGU+Pj49MCk/bGUobigpLGUsdCk6IiI7ZnVuY3Rpb24gZGUoZSl7aWYoYilyZXR1cm4gcWUoMSwxLGUpO0Q9ZSxxKCl8fChnZS5oYigpLGMub25FeGl0JiZjLm9uRXhpdChlKSxIPSEwKSxoKGUsbmV3IG9lKGUpKX12YXIgcGU9ZT0+e2lmKEQ9ZSxiKXRocm93IG1lKGUpLCJ1bndpbmQiO2RlKGUpfSxnZT17TGE6W10sSWE6W10sVGE6W10sRmE6e30sUGE6ZnVuY3Rpb24oKXtiP2dlLmFiKCk6Z2UuJGEoKX0sJGE6ZnVuY3Rpb24oKXtHLnVuc2hpZnQoKCgpPT57USgpLGdlLmJiKCgoKT0+ZWUoKSkpfSkpfSxhYjpmdW5jdGlvbigpe2dlLnJlY2VpdmVPYmplY3RUcmFuc2Zlcj1nZS5lYixnZS50aHJlYWRJbml0VExTPWdlLlNhLGdlLnNldEV4aXRTdGF0dXM9Z2UuUmEsRj0hMX0sUmE6ZnVuY3Rpb24oZSl7RD1lfSxyYjpbIiR0ZXJtaW5hdGVXb3JrZXIiXSxoYjpmdW5jdGlvbigpe2Zvcih2YXIgZSBvZiBnZS5JYSlpZShlKTtmb3IoZSBvZiBnZS5MYSlpZShlKTtnZS5MYT1bXSxnZS5JYT1bXSxnZS5GYT1bXX0sZmI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5IYTtkZWxldGUgZ2UuRmFbdF0sZ2UuTGEucHVzaChlKSxnZS5JYS5zcGxpY2UoZ2UuSWEuaW5kZXhPZihlKSwxKSxlLkhhPTAseXQodCl9LGViOmZ1bmN0aW9uKCl7fSxTYTpmdW5jdGlvbigpe2dlLlRhLmZvckVhY2goKGU9PmUoKSkpfSxjYjplPT5uZXcgUHJvbWlzZSgodD0+e2Uub25tZXNzYWdlPXI9Pnt2YXIgbj0ocj1yLmRhdGEpLmNtZDtpZihyLnRhcmdldFRocmVhZCYmci50YXJnZXRUaHJlYWQhPWR0KCkpe3ZhciBhPWdlLkZhW3IucWJdO2E/YS5wb3N0TWVzc2FnZShyLHIudHJhbnNmZXJMaXN0KTpSKFwnSW50ZXJuYWwgZXJyb3IhIFdvcmtlciBzZW50IGEgbWVzc2FnZSAiXCcrbitcJyIgdG8gdGFyZ2V0IHB0aHJlYWQgXCcrci50YXJnZXRUaHJlYWQrIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhIil9ZWxzZSJjaGVja01haWxib3giPT09bj9IZSgpOiJzcGF3blRocmVhZCI9PT1uP3VlKHIpOiJjbGVhbnVwVGhyZWFkIj09PW4/c2Uoci50aHJlYWQpOiJraWxsVGhyZWFkIj09PW4/KHI9ci50aHJlYWQsbj1nZS5GYVtyXSxkZWxldGUgZ2UuRmFbcl0saWUobikseXQociksZ2UuSWEuc3BsaWNlKGdlLklhLmluZGV4T2YobiksMSksbi5IYT0wKToiY2FuY2VsVGhyZWFkIj09PW4/Z2UuRmFbci50aHJlYWRdLnBvc3RNZXNzYWdlKHtjbWQ6ImNhbmNlbCJ9KToibG9hZGVkIj09PW4/KGUubG9hZGVkPSEwLHQoZSkpOiJhbGVydCI9PT1uP2FsZXJ0KCJUaHJlYWQgIityLnRocmVhZElkKyI6ICIrci50ZXh0KToic2V0aW1tZWRpYXRlIj09PXIudGFyZ2V0P2UucG9zdE1lc3NhZ2Uocik6ImNhbGxIYW5kbGVyIj09PW4/Y1tyLmhhbmRsZXJdKC4uLnIuYXJncyk6biYmUigid29ya2VyIHNlbnQgYW4gdW5rbm93biBjb21tYW5kICIrbil9LGUub25lcnJvcj1lPT57dGhyb3cgUigid29ya2VyIHNlbnQgYW4gZXJyb3IhICIrZS5maWxlbmFtZSsiOiIrZS5saW5lbm8rIjogIitlLm1lc3NhZ2UpLGV9LHYmJihlLm9uKCJtZXNzYWdlIiwoZnVuY3Rpb24odCl7ZS5vbm1lc3NhZ2Uoe2RhdGE6dH0pfSkpLGUub24oImVycm9yIiwoZnVuY3Rpb24odCl7ZS5vbmVycm9yKHQpfSkpKTt2YXIgcixuPVtdO2ZvcihyIG9mWyJvbkV4aXQiLCJvbkFib3J0IiwicHJpbnQiLCJwcmludEVyciJdKWMuaGFzT3duUHJvcGVydHkocikmJm4ucHVzaChyKTtlLnBvc3RNZXNzYWdlKHtjbWQ6ImxvYWQiLGhhbmRsZXJzOm4sdXJsT3JCbG9iOmMubWFpblNjcmlwdFVybE9yQmxvYnx8X3NjcmlwdERpcix3YXNtTWVtb3J5Omssd2FzbU1vZHVsZTpQfSl9KSksYmI6ZnVuY3Rpb24oZSl7ZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBlPV8oIm9ydC13YXNtLXRocmVhZGVkLndvcmtlci5qcyIpO2U9bmV3IFdvcmtlcihlKSxnZS5MYS5wdXNoKGUpfSxaYTpmdW5jdGlvbigpe3JldHVybiAwPT1nZS5MYS5sZW5ndGgmJihnZS5YYSgpLGdlLmNiKGdlLkxhWzBdKSksZ2UuTGEucG9wKCl9fTtjLlBUaHJlYWQ9Z2U7dmFyIGhlPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShjKX07ZnVuY3Rpb24gbWUoZSl7aWYoYilyZXR1cm4gcWUoMiwwLGUpO3BlKGUpfWMuZXN0YWJsaXNoU3RhY2tTcGFjZT1mdW5jdGlvbigpe3ZhciBlPWR0KCksdD1hKClbZSs1Mj4+Mj4+PjBdO2U9YSgpW2UrNTY+PjI+Pj4wXSxfdCh0LHQtZSksU3QodCl9O3ZhciB5ZT1bXTtmdW5jdGlvbiB2ZShlKXt0aGlzLk9hPWUtMjQsdGhpcy5XYT1mdW5jdGlvbihlKXtvKClbdGhpcy5PYSs0Pj4yPj4+MF09ZX0sdGhpcy5WYT1mdW5jdGlvbihlKXtvKClbdGhpcy5PYSs4Pj4yPj4+MF09ZX0sdGhpcy5QYT1mdW5jdGlvbihlLHQpe3RoaXMuVWEoKSx0aGlzLldhKGUpLHRoaXMuVmEodCl9LHRoaXMuVWE9ZnVuY3Rpb24oKXtvKClbdGhpcy5PYSsxNj4+Mj4+PjBdPTB9fWZ1bmN0aW9uIGJlKGUsdCxyLG4pe3JldHVybiBiP3FlKDMsMSxlLHQscixuKTp3ZShlLHQscixuKX1mdW5jdGlvbiB3ZShlLHQscixuKXtpZihlPj4+PTAsdD4+Pj0wLHI+Pj49MCxuPj4+PTAsInVuZGVmaW5lZCI9PXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4gUigiQ3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFNoYXJlZEFycmF5QnVmZmVyLCBwdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSEiKSw2O3ZhciBhPVtdO3JldHVybiBiJiYwPT09YS5sZW5ndGg/YmUoZSx0LHIsbik6KGU9e2diOnIsSGE6ZSxZYTpuLG1iOmF9LGI/KGUub2I9InNwYXduVGhyZWFkIixwb3N0TWVzc2FnZShlLGEpLDApOnVlKGUpKX1mdW5jdGlvbiBfZShlLHQscil7cmV0dXJuIGI/cWUoNCwxLGUsdCxyKTowfWZ1bmN0aW9uIE9lKGUsdCl7aWYoYilyZXR1cm4gcWUoNSwxLGUsdCl9Yy5pbnZva2VFbnRyeVBvaW50PWZ1bmN0aW9uKGUsdCl7dmFyIHI9eWVbZV07cnx8KGU+PXllLmxlbmd0aCYmKHllLmxlbmd0aD1lKzEpLHllW2VdPXI9ei5nZXQoZSkpLGU9cih0KSxxKCk/Z2UuUmEoZSk6dnQoZSl9O3ZhciBTZT1lPT57Zm9yKHZhciB0PTAscj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7MTI3Pj1uP3QrKzoyMDQ3Pj1uP3QrPTI6NTUyOTY8PW4mJjU3MzQzPj1uPyh0Kz00LCsrcik6dCs9M31yZXR1cm4gdH0sRWU9KGUsdCxyLG4pPT57aWYoISgwPG4pKXJldHVybiAwO3ZhciBhPXI+Pj49MDtuPXIrbi0xO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgaT1lLmNoYXJDb2RlQXQobyk7aWYoNTUyOTY8PWkmJjU3MzQzPj1pJiYoaT02NTUzNisoKDEwMjMmaSk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK28pKSwxMjc+PWkpe2lmKHI+PW4pYnJlYWs7dFtyKys+Pj4wXT1pfWVsc2V7aWYoMjA0Nz49aSl7aWYocisxPj1uKWJyZWFrO3RbcisrPj4+MF09MTkyfGk+PjZ9ZWxzZXtpZig2NTUzNT49aSl7aWYocisyPj1uKWJyZWFrO3RbcisrPj4+MF09MjI0fGk+PjEyfWVsc2V7aWYociszPj1uKWJyZWFrO3RbcisrPj4+MF09MjQwfGk+PjE4LHRbcisrPj4+MF09MTI4fGk+PjEyJjYzfXRbcisrPj4+MF09MTI4fGk+PjYmNjN9dFtyKys+Pj4wXT0xMjh8NjMmaX19cmV0dXJuIHRbcj4+PjBdPTAsci1hfSxBZT0oZSx0LHIpPT5FZShlLG4oKSx0LHIpO2Z1bmN0aW9uIFRlKGUsdCl7aWYoYilyZXR1cm4gcWUoNiwxLGUsdCl9ZnVuY3Rpb24gTWUoZSx0LHIpe2lmKGIpcmV0dXJuIHFlKDcsMSxlLHQscil9ZnVuY3Rpb24gUmUoZSx0LHIpe3JldHVybiBiP3FlKDgsMSxlLHQscik6MH1mdW5jdGlvbiBGZShlLHQpe2lmKGIpcmV0dXJuIHFlKDksMSxlLHQpfWZ1bmN0aW9uIGtlKGUsdCxyKXtpZihiKXJldHVybiBxZSgxMCwxLGUsdCxyKX1mdW5jdGlvbiBDZShlLHQscixuKXtpZihiKXJldHVybiBxZSgxMSwxLGUsdCxyLG4pfWZ1bmN0aW9uIFBlKGUsdCxyLG4pe2lmKGIpcmV0dXJuIHFlKDEyLDEsZSx0LHIsbil9ZnVuY3Rpb24gRGUoZSx0LHIsbil7aWYoYilyZXR1cm4gcWUoMTMsMSxlLHQscixuKX1mdW5jdGlvbiB4ZShlKXtpZihiKXJldHVybiBxZSgxNCwxLGUpfWZ1bmN0aW9uIEllKGUsdCl7aWYoYilyZXR1cm4gcWUoMTUsMSxlLHQpfWZ1bmN0aW9uIFVlKGUsdCxyKXtpZihiKXJldHVybiBxZSgxNiwxLGUsdCxyKX12YXIgTGU9ZT0+e2lmKCFIKXRyeXtpZihlKCksIXEoKSl0cnl7Yj92dChEKTpwZShEKX1jYXRjaChlKXtlIGluc3RhbmNlb2Ygb2V8fCJ1bndpbmQiPT1lfHxoKDEsZSl9fWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBvZXx8InVud2luZCI9PWV8fGgoMSxlKX19O2Z1bmN0aW9uIFdlKGUpe2U+Pj49MCwiZnVuY3Rpb24iPT10eXBlb2YgQXRvbWljcy5uYiYmKEF0b21pY3MubmIoYSgpLGU+PjIsZSkudmFsdWUudGhlbihIZSksZSs9MTI4LEF0b21pY3Muc3RvcmUoYSgpLGU+PjIsMSkpfWZ1bmN0aW9uIEhlKCl7dmFyIGU9ZHQoKTtlJiYoV2UoZSksTGUoKCgpPT5idCgpKSkpfWMuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0PVdlLGMuY2hlY2tNYWlsYm94PUhlO3ZhciBZZT1lPT4wPT1lJTQmJigwIT1lJTEwMHx8MD09ZSU0MDApLGplPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLHplPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdO2Z1bmN0aW9uIEdlKGUsdCxyLG4sYSxvLGkscyl7cmV0dXJuIGI/cWUoMTcsMSxlLHQscixuLGEsbyxpLHMpOi01Mn1mdW5jdGlvbiBOZShlLHQscixuLGEsbyxpKXtpZihiKXJldHVybiBxZSgxOCwxLGUsdCxyLG4sYSxvLGkpfXZhciBCZT1lPT57dmFyIHQ9U2UoZSkrMSxyPXB0KHQpO3JldHVybiByJiZBZShlLHIsdCkscn0sJGU9ZT0+e3ZhciB0PU90KCk7cmV0dXJuIGU9ZSgpLFN0KHQpLGV9O2Z1bmN0aW9uIHFlKGUsdCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aC0yLG49YXJndW1lbnRzO3JldHVybiAkZSgoKCk9Pntmb3IodmFyIGE9RXQoOCpyKSxvPWE+PjMscz0wO3M8cjtzKyspe3ZhciB1PW5bMitzXTtpKClbbytzPj4+MF09dX1yZXR1cm4gbXQoZSxyLGEsdCl9KSl9dmFyIFZlLEplPVtdLFhlPXt9LEtlPSgpPT57aWYoIVZlKXt2YXIgZSx0PXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzpnfHwiLi90aGlzLnByb2dyYW0ifTtmb3IoZSBpbiBYZSl2b2lkIDA9PT1YZVtlXT9kZWxldGUgdFtlXTp0W2VdPVhlW2VdO3ZhciByPVtdO2ZvcihlIGluIHQpci5wdXNoKGAke2V9PSR7dFtlXX1gKTtWZT1yfXJldHVybiBWZX07ZnVuY3Rpb24gWmUoZSxyKXtpZihiKXJldHVybiBxZSgxOSwxLGUscik7ZT4+Pj0wLHI+Pj49MDt2YXIgbj0wO3JldHVybiBLZSgpLmZvckVhY2goKGZ1bmN0aW9uKGEsaSl7dmFyIHM9cituO2ZvcihpPW8oKVtlKzQqaT4+Mj4+PjBdPXMscz0wO3M8YS5sZW5ndGg7KytzKXQoKVtpKys+PjA+Pj4wXT1hLmNoYXJDb2RlQXQocyk7dCgpW2k+PjA+Pj4wXT0wLG4rPWEubGVuZ3RoKzF9KSksMH1mdW5jdGlvbiBRZShlLHQpe2lmKGIpcmV0dXJuIHFlKDIwLDEsZSx0KTtlPj4+PTAsdD4+Pj0wO3ZhciByPUtlKCk7bygpW2U+PjI+Pj4wXT1yLmxlbmd0aDt2YXIgbj0wO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKGUpe24rPWUubGVuZ3RoKzF9KSksbygpW3Q+PjI+Pj4wXT1uLDB9ZnVuY3Rpb24gZXQoZSl7cmV0dXJuIGI/cWUoMjEsMSxlKTo1Mn1mdW5jdGlvbiB0dChlLHQscixuKXtyZXR1cm4gYj9xZSgyMiwxLGUsdCxyLG4pOjUyfWZ1bmN0aW9uIHJ0KGUsdCxyLG4sYSl7cmV0dXJuIGI/cWUoMjMsMSxlLHQscixuLGEpOjcwfXZhciBudD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gYXQoZSx0LHIsYSl7aWYoYilyZXR1cm4gcWUoMjQsMSxlLHQscixhKTt0Pj4+PTAscj4+Pj0wLGE+Pj49MDtmb3IodmFyIGk9MCxzPTA7czxyO3MrKyl7dmFyIHU9bygpW3Q+PjI+Pj4wXSxjPW8oKVt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgbD0wO2w8YztsKyspe3ZhciBmPW4oKVt1K2w+Pj4wXSxkPW50W2VdOzA9PT1mfHwxMD09PWY/KCgxPT09ZT9NOlIpKGxlKGQsMCkpLGQubGVuZ3RoPTApOmQucHVzaChmKX1pKz1jfXJldHVybiBvKClbYT4+Mj4+PjBdPWksMH12YXIgb3Q9ZT0+KG90PSgoKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gZT0+KGUuc2V0KGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZS5ieXRlTGVuZ3RoKSkpLGUpO2lmKHYpdHJ5e3ZhciBlPXIoNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe310ZSgiaW5pdFJhbmRvbURldmljZSIpfSkoKSkoZSksaXQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxzdD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHV0PShlLHIpPT57dCgpLnNldChlLHI+Pj4wKX07ZnVuY3Rpb24gY3QoZSx0LHIsbil7ZnVuY3Rpb24gbyhlLHQscil7Zm9yKGU9Im51bWJlciI9PXR5cGVvZiBlP2UudG9TdHJpbmcoKTplfHwiIjtlLmxlbmd0aDx0OyllPXJbMF0rZTtyZXR1cm4gZX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG8oZSx0LCIwIil9ZnVuY3Rpb24gcyhlLHQpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIDA+ZT8tMTowPGU/MTowfXZhciBuO3JldHVybiAwPT09KG49cihlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKSkmJjA9PT0obj1yKGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkpKSYmKG49cihlLmdldERhdGUoKS10LmdldERhdGUoKSkpLG59ZnVuY3Rpb24gdShlKXtzd2l0Y2goZS5nZXREYXkoKSl7Y2FzZSAwOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBlO2Nhc2UgMjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMyk7Y2FzZSAzOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpO2Nhc2UgNTpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzEpO2Nhc2UgNjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiBjKGUpe3ZhciB0PWUuSmE7Zm9yKGU9bmV3IERhdGUobmV3IERhdGUoZS5LYSsxOTAwLDAsMSkuZ2V0VGltZSgpKTswPHQ7KXt2YXIgcj1lLmdldE1vbnRoKCksbj0oWWUoZS5nZXRGdWxsWWVhcigpKT9pdDpzdClbcl07aWYoISh0Pm4tZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09bi1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5yP2Uuc2V0TW9udGgocisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSl9cmV0dXJuIHI9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpKzEsMCw0KSx0PXUobmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsNCkpLHI9dShyKSwwPj1zKHQsZSk/MD49cyhyLGUpP2UuZ2V0RnVsbFllYXIoKSsxOmUuZ2V0RnVsbFllYXIoKTplLmdldEZ1bGxZZWFyKCktMX1lPj4+PTAsdD4+Pj0wLHI+Pj49MCxuPj4+PTA7dmFyIGw9YSgpW24rNDA+PjI+Pj4wXTtmb3IodmFyIGYgaW4gbj17a2I6YSgpW24+PjI+Pj4wXSxqYjphKClbbis0Pj4yPj4+MF0sTWE6YSgpW24rOD4+Mj4+PjBdLFFhOmEoKVtuKzEyPj4yPj4+MF0sTmE6YSgpW24rMTY+PjI+Pj4wXSxLYTphKClbbisyMD4+Mj4+PjBdLEdhOmEoKVtuKzI0Pj4yPj4+MF0sSmE6YSgpW24rMjg+PjI+Pj4wXSxzYjphKClbbiszMj4+Mj4+PjBdLGliOmEoKVtuKzM2Pj4yPj4+MF0sbGI6bD9mZShsKToiIn0scj1mZShyKSxsPXsiJWMiOiIlYSAlYiAlZCAlSDolTTolUyAlWSIsIiVEIjoiJW0vJWQvJXkiLCIlRiI6IiVZLSVtLSVkIiwiJWgiOiIlYiIsIiVyIjoiJUk6JU06JVMgJXAiLCIlUiI6IiVIOiVNIiwiJVQiOiIlSDolTTolUyIsIiV4IjoiJW0vJWQvJXkiLCIlWCI6IiVIOiVNOiVTIiwiJUVjIjoiJWMiLCIlRUMiOiIlQyIsIiVFeCI6IiVtLyVkLyV5IiwiJUVYIjoiJUg6JU06JVMiLCIlRXkiOiIleSIsIiVFWSI6IiVZIiwiJU9kIjoiJWQiLCIlT2UiOiIlZSIsIiVPSCI6IiVIIiwiJU9JIjoiJUkiLCIlT20iOiIlbSIsIiVPTSI6IiVNIiwiJU9TIjoiJVMiLCIlT3UiOiIldSIsIiVPVSI6IiVVIiwiJU9WIjoiJVYiLCIlT3ciOiIldyIsIiVPVyI6IiVXIiwiJU95IjoiJXkifSlyPXIucmVwbGFjZShuZXcgUmVnRXhwKGYsImciKSxsW2ZdKTt2YXIgZD0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIikscD0iSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlciIuc3BsaXQoIiAiKTtmb3IoZiBpbiBsPXsiJWEiOmU9PmRbZS5HYV0uc3Vic3RyaW5nKDAsMyksIiVBIjplPT5kW2UuR2FdLCIlYiI6ZT0+cFtlLk5hXS5zdWJzdHJpbmcoMCwzKSwiJUIiOmU9PnBbZS5OYV0sIiVDIjplPT5pKChlLkthKzE5MDApLzEwMHwwLDIpLCIlZCI6ZT0+aShlLlFhLDIpLCIlZSI6ZT0+byhlLlFhLDIsIiAiKSwiJWciOmU9PmMoZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjplPT5jKGUpLCIlSCI6ZT0+aShlLk1hLDIpLCIlSSI6ZT0+KDA9PShlPWUuTWEpP2U9MTI6MTI8ZSYmKGUtPTEyKSxpKGUsMikpLCIlaiI6ZT0+e2Zvcih2YXIgdD0wLHI9MDtyPD1lLk5hLTE7dCs9KFllKGUuS2ErMTkwMCk/aXQ6c3QpW3IrK10pO3JldHVybiBpKGUuUWErdCwzKX0sIiVtIjplPT5pKGUuTmErMSwyKSwiJU0iOmU9PmkoZS5qYiwyKSwiJW4iOigpPT4iXFxuIiwiJXAiOmU9PjA8PWUuTWEmJjEyPmUuTWE/IkFNIjoiUE0iLCIlUyI6ZT0+aShlLmtiLDIpLCIldCI6KCk9PiJcXHQiLCIldSI6ZT0+ZS5HYXx8NywiJVUiOmU9PmkoTWF0aC5mbG9vcigoZS5KYSs3LWUuR2EpLzcpLDIpLCIlViI6ZT0+e3ZhciB0PU1hdGguZmxvb3IoKGUuSmErNy0oZS5HYSs2KSU3KS83KTtpZigyPj0oZS5HYSszNzEtZS5KYS0yKSU3JiZ0KyssdCk1Mz09dCYmKDQ9PShyPShlLkdhKzM3MS1lLkphKSU3KXx8Mz09ciYmWWUoZS5LYSl8fCh0PTEpKTtlbHNle3Q9NTI7dmFyIHI9KGUuR2ErNy1lLkphLTEpJTc7KDQ9PXJ8fDU9PXImJlllKGUuS2ElNDAwLTEpKSYmdCsrfXJldHVybiBpKHQsMil9LCIldyI6ZT0+ZS5HYSwiJVciOmU9PmkoTWF0aC5mbG9vcigoZS5KYSs3LShlLkdhKzYpJTcpLzcpLDIpLCIleSI6ZT0+KGUuS2ErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjplPT5lLkthKzE5MDAsIiV6IjplPT57dmFyIHQ9MDw9KGU9ZS5pYik7cmV0dXJuIGU9TWF0aC5hYnMoZSkvNjAsKHQ/IisiOiItIikrU3RyaW5nKCIwMDAwIisoZS82MCoxMDArZSU2MCkpLnNsaWNlKC00KX0sIiVaIjplPT5lLmxiLCIlJSI6KCk9PiIlIn0scj1yLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpLGwpci5pbmNsdWRlcyhmKSYmKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoZiwiZyIpLGxbZl0obikpKTtyZXR1cm4gZj1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShTZShlKSsxKTtyZXR1cm4gRWUoZSx0LDAsdC5sZW5ndGgpLHR9KHI9ci5yZXBsYWNlKC9cXDBcXDAvZywiJSIpKSxmLmxlbmd0aD50PzA6KHV0KGYsZSksZi5sZW5ndGgtMSl9Z2UuUGEoKTt2YXIgbHQ9W251bGwsZGUsbWUsYmUsX2UsT2UsVGUsTWUsUmUsRmUsa2UsQ2UsUGUsRGUseGUsSWUsVWUsR2UsTmUsWmUsUWUsZXQsdHQscnQsYXRdLGZ0PXtiOmZ1bmN0aW9uKGUsdCxyKXt0aHJvdyBuZXcgdmUoZT4+Pj0wKS5QYSh0Pj4+MCxyPj4+MCksZX0sTjpmdW5jdGlvbihlKXtndChlPj4+MCwheSwxLCFtLDEzMTA3MiwhMSksZ2UuU2EoKX0sazpmdW5jdGlvbihlKXtlPj4+PTAsYj9wb3N0TWVzc2FnZSh7Y21kOiJjbGVhbnVwVGhyZWFkIix0aHJlYWQ6ZX0pOnNlKGUpfSxJOndlLGg6X2UsVDpPZSxFOlRlLEc6TWUsVTpSZSxSOkZlLEo6a2UsUTpDZSxvOlBlLEY6RGUsQzp4ZSxTOkllLEQ6VWUscTooKT0+ITAsQTpmdW5jdGlvbihlLHQpeyhlPj4+PTApPT10Pj4+MD9zZXRUaW1lb3V0KCgoKT0+SGUoKSkpOmI/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPWdlLkZhW2VdKSYmZS5wb3N0TWVzc2FnZSh7Y21kOiJjaGVja01haWxib3gifSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sTTpXZSxwOmZ1bmN0aW9uKGUpe3YmJmdlLkZhW2U+Pj4wXS5yZWYoKX0sdDpmdW5jdGlvbihlLHQscil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixyPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksYSgpW3I+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxhKClbcis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksYSgpW3IrOD4+Mj4+PjBdPWUuZ2V0VVRDSG91cnMoKSxhKClbcisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGEoKVtyKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLGEoKVtyKzIwPj4yPj4+MF09ZS5nZXRVVENGdWxsWWVhcigpLTE5MDAsYSgpW3IrMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsYSgpW3IrMjg+PjI+Pj4wXT1lfSx1OmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxhKClbcj4+Mj4+PjBdPWUuZ2V0U2Vjb25kcygpLGEoKVtyKzQ+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxhKClbcis4Pj4yPj4+MF09ZS5nZXRIb3VycygpLGEoKVtyKzEyPj4yPj4+MF09ZS5nZXREYXRlKCksYSgpW3IrMTY+PjI+Pj4wXT1lLmdldE1vbnRoKCksYSgpW3IrMjA+PjI+Pj4wXT1lLmdldEZ1bGxZZWFyKCktMTkwMCxhKClbcisyND4+Mj4+PjBdPWUuZ2V0RGF5KCksdD0oWWUoZS5nZXRGdWxsWWVhcigpKT9qZTp6ZSlbZS5nZXRNb250aCgpXStlLmdldERhdGUoKS0xfDAsYSgpW3IrMjg+PjI+Pj4wXT10LGEoKVtyKzM2Pj4yPj4+MF09LTYwKmUuZ2V0VGltZXpvbmVPZmZzZXQoKSx0PW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIG49bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtlPTB8KHQhPW4mJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4obix0KSksYSgpW3IrMzI+PjI+Pj4wXT1lfSx2OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShhKClbZSsyMD4+Mj4+PjBdKzE5MDAsYSgpW2UrMTY+PjI+Pj4wXSxhKClbZSsxMj4+Mj4+PjBdLGEoKVtlKzg+PjI+Pj4wXSxhKClbZSs0Pj4yPj4+MF0sYSgpW2U+PjI+Pj4wXSwwKSxyPWEoKVtlKzMyPj4yPj4+MF0sbj10LmdldFRpbWV6b25lT2Zmc2V0KCksbz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpLGk9bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxzPU1hdGgubWluKGksbyk7cmV0dXJuIDA+cj9hKClbZSszMj4+Mj4+PjBdPU51bWJlcihvIT1pJiZzPT1uKTowPHIhPShzPT1uKSYmKG89TWF0aC5tYXgoaSxvKSx0LnNldFRpbWUodC5nZXRUaW1lKCkrNmU0KigoMDxyP3M6byktbikpKSxhKClbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCkscj0oWWUodC5nZXRGdWxsWWVhcigpKT9qZTp6ZSlbdC5nZXRNb250aCgpXSt0LmdldERhdGUoKS0xfDAsYSgpW2UrMjg+PjI+Pj4wXT1yLGEoKVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksYSgpW2UrND4+Mj4+PjBdPXQuZ2V0TWludXRlcygpLGEoKVtlKzg+PjI+Pj4wXT10LmdldEhvdXJzKCksYSgpW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxhKClbZSsxNj4+Mj4+PjBdPXQuZ2V0TW9udGgoKSxhKClbZSsyMD4+Mj4+PjBdPXQuZ2V0WWVhcigpLGU9dC5nZXRUaW1lKCkvMWUzLHd0KChKPWUsMTw9K01hdGguYWJzKEopPzA8Sj8rTWF0aC5mbG9vcihKLzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKEotKyh+fko+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApKSxlPj4+MH0scjpHZSxzOk5lLHo6ZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKT9lWzFdOiJHTVQifWU+Pj49MCx0Pj4+PTAscj4+Pj0wO3ZhciBpPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxzPW5ldyBEYXRlKGksMCwxKSx1PW5ldyBEYXRlKGksNiwxKTtpPXMuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgYz11LmdldFRpbWV6b25lT2Zmc2V0KCksbD1NYXRoLm1heChpLGMpO28oKVtlPj4yPj4+MF09NjAqbCxhKClbdD4+Mj4+PjBdPU51bWJlcihpIT1jKSxlPW4ocyksdD1uKHUpLGU9QmUoZSksdD1CZSh0KSxjPGk/KG8oKVtyPj4yPj4+MF09ZSxvKClbcis0Pj4yPj4+MF09dCk6KG8oKVtyPj4yPj4+MF09dCxvKClbcis0Pj4yPj4+MF09ZSl9LGM6KCk9Pnt0ZSgiIil9LGw6ZnVuY3Rpb24oKXt9LGk6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sVjooKT0+e3Rocm93ICQrPTEsInVud2luZCJ9LEI6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sZTooKT0+cGVyZm9ybWFuY2UudGltZU9yaWdpbitwZXJmb3JtYW5jZS5ub3coKSxmOmZ1bmN0aW9uKCl7cmV0dXJuIHY/cig5OTMpLmNwdXMoKS5sZW5ndGg6bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3l9LEs6ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKGdlLnBiPXQ+Pj4wLEplLmxlbmd0aD1yLHQ9bj4+PjA+PjMsbj0wO248cjtuKyspSmVbbl09aSgpW3Qrbj4+PjBdO3JldHVybiBsdFtlXS5hcHBseShudWxsLEplKX0seTpmdW5jdGlvbihlKXtlPj4+PTA7dmFyIHQ9bigpLmxlbmd0aDtpZihlPD10fHw0Mjk0OTAxNzYwPGUpcmV0dXJuITE7Zm9yKHZhciByPTE7ND49cjtyKj0yKXt2YXIgYT10KigxKy4yL3IpO2E9TWF0aC5taW4oYSxlKzEwMDY2MzI5Nik7dmFyIG89TWF0aDthPU1hdGgubWF4KGUsYSk7ZTp7bz1vLm1pbi5jYWxsKG8sNDI5NDkwMTc2MCxhKyg2NTUzNi1hJTY1NTM2KSU2NTUzNiktay5idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2O3RyeXtrLmdyb3cobyksWSgpO3ZhciBpPTE7YnJlYWsgZX1jYXRjaChlKXt9aT12b2lkIDB9aWYoaSlyZXR1cm4hMH1yZXR1cm4hMX0sTzpaZSxQOlFlLGo6cGUsZzpldCxuOnR0LHc6cnQsbTphdCx4OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+Pj49MCx0Pj4+PTAsb3QobigpLnN1YmFycmF5KGU+Pj4wLGUrdD4+PjApKSwwfSxhOmt8fGMud2FzbU1lbW9yeSxIOmN0LGQ6ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIGN0KGU+Pj4wLHQ+Pj4wLHI+Pj4wLG4+Pj4wKX19OyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtyZXR1cm4gZT1lLmV4cG9ydHMsQz1lPWZ1bmN0aW9uKGUpe3ZhciB0PWU9PigpPT5lKCk+Pj4wLHI9ZT0+dD0+ZSh0KT4+PjA7cmV0dXJuKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5wdGhyZWFkX3NlbGY9dChlLnB0aHJlYWRfc2VsZiksZS5tYWxsb2M9cihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPXIoZS5zdGFja0FsbG9jKSxlfShlKSxnZS5UYS5wdXNoKEMuc2EpLHo9Qy50YSxOLnVuc2hpZnQoQy5XKSxQPXQsZWUoKSxlfXZhciB0PXthOmZ0fTtpZihRKCksYy5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBjLmluc3RhbnRpYXRlV2FzbSh0LGUpfWNhdGNoKGUpe1IoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrZSksdShlKX0oZnVuY3Rpb24oZSx0KXt2YXIgcj1WO3JldHVybiBUfHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fHJlKHIpfHxyLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKXx8dnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGZldGNoP2FlKHIsZSx0KTpmZXRjaChyLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigobj0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobixlKS50aGVuKHQsKGZ1bmN0aW9uKG4pe3JldHVybiBSKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIituKSxSKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLGFlKHIsZSx0KX0pKSkpfSkodCwoZnVuY3Rpb24odCl7ZSh0Lmluc3RhbmNlLHQubW9kdWxlKX0pKS5jYXRjaCh1KX0oKSxjLl9PcnRJbml0PShlLHQpPT4oYy5fT3J0SW5pdD1DLlgpKGUsdCksYy5fT3J0R2V0TGFzdEVycm9yPShlLHQpPT4oYy5fT3J0R2V0TGFzdEVycm9yPUMuWSkoZSx0KSxjLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0oZSx0LHIsbixhLG8saSxzLHUsbCk9PihjLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1DLlopKGUsdCxyLG4sYSxvLGkscyx1LGwpLGMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShlLHQpPT4oYy5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9Qy5fKShlLHQpLGMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0oZSx0LHIpPT4oYy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PUMuJCkoZSx0LHIpLGMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1lPT4oYy5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPUMuYWEpKGUpLGMuX09ydENyZWF0ZVNlc3Npb249KGUsdCxyKT0+KGMuX09ydENyZWF0ZVNlc3Npb249Qy5iYSkoZSx0LHIpLGMuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihjLl9PcnRSZWxlYXNlU2Vzc2lvbj1DLmNhKShlKSxjLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShlLHQscik9PihjLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PUMuZGEpKGUsdCxyKSxjLl9PcnRHZXRJbnB1dE5hbWU9KGUsdCk9PihjLl9PcnRHZXRJbnB1dE5hbWU9Qy5lYSkoZSx0KSxjLl9PcnRHZXRPdXRwdXROYW1lPShlLHQpPT4oYy5fT3J0R2V0T3V0cHV0TmFtZT1DLmZhKShlLHQpLGMuX09ydEZyZWU9ZT0+KGMuX09ydEZyZWU9Qy5nYSkoZSksYy5fT3J0Q3JlYXRlVGVuc29yPShlLHQscixuLGEpPT4oYy5fT3J0Q3JlYXRlVGVuc29yPUMuaGEpKGUsdCxyLG4sYSksYy5fT3J0R2V0VGVuc29yRGF0YT0oZSx0LHIsbixhKT0+KGMuX09ydEdldFRlbnNvckRhdGE9Qy5pYSkoZSx0LHIsbixhKSxjLl9PcnRSZWxlYXNlVGVuc29yPWU9PihjLl9PcnRSZWxlYXNlVGVuc29yPUMuamEpKGUpLGMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9KGUsdCxyLG4pPT4oYy5fT3J0Q3JlYXRlUnVuT3B0aW9ucz1DLmthKShlLHQscixuKSxjLl9PcnRBZGRSdW5Db25maWdFbnRyeT0oZSx0LHIpPT4oYy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9Qy5sYSkoZSx0LHIpLGMuX09ydFJlbGVhc2VSdW5PcHRpb25zPWU9PihjLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1DLm1hKShlKSxjLl9PcnRSdW49KGUsdCxyLG4sYSxvLGkscyk9PihjLl9PcnRSdW49Qy5uYSkoZSx0LHIsbixhLG8saSxzKSxjLl9PcnRFbmRQcm9maWxpbmc9ZT0+KGMuX09ydEVuZFByb2ZpbGluZz1DLm9hKShlKTt2YXIgZHQ9Yy5fcHRocmVhZF9zZWxmPSgpPT4oZHQ9Yy5fcHRocmVhZF9zZWxmPUMucGEpKCkscHQ9Yy5fbWFsbG9jPWU9PihwdD1jLl9tYWxsb2M9Qy5xYSkoZSk7Yy5fZnJlZT1lPT4oYy5fZnJlZT1DLnJhKShlKSxjLl9fZW1zY3JpcHRlbl90bHNfaW5pdD0oKT0+KGMuX19lbXNjcmlwdGVuX3Rsc19pbml0PUMuc2EpKCk7dmFyIGd0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PShlLHQscixuLGEsbyk9PihndD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD1DLnVhKShlLHQscixuLGEsbyk7Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9KCk9PihjLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD1DLnZhKSgpO3ZhciBodCxtdD0oZSx0LHIsbik9PihtdD1DLndhKShlLHQscixuKSx5dD1lPT4oeXQ9Qy54YSkoZSksdnQ9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQ9ZT0+KHZ0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PUMueWEpKGUpLGJ0PWMuX19lbXNjcmlwdGVuX2NoZWNrX21haWxib3g9KCk9PihidD1jLl9fZW1zY3JpcHRlbl9jaGVja19tYWlsYm94PUMuemEpKCksd3Q9ZT0+KHd0PUMuQWEpKGUpLF90PShlLHQpPT4oX3Q9Qy5CYSkoZSx0KSxPdD0oKT0+KE90PUMuQ2EpKCksU3Q9ZT0+KFN0PUMuRGEpKGUpLEV0PWU9PihFdD1DLkVhKShlKTtmdW5jdGlvbiBBdCgpe2Z1bmN0aW9uIGUoKXtpZighaHQmJihodD0hMCxjLmNhbGxlZFJ1bj0hMCwhSCkmJihifHxoZShOKSxzKGMpLGMub25SdW50aW1lSW5pdGlhbGl6ZWQmJmMub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwhYikpe2lmKGMucG9zdFJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGMucG9zdFJ1biYmKGMucG9zdFJ1bj1bYy5wb3N0UnVuXSk7Yy5wb3N0UnVuLmxlbmd0aDspe3ZhciBlPWMucG9zdFJ1bi5zaGlmdCgpO0IudW5zaGlmdChlKX1oZShCKX19aWYoISgwPFgpKWlmKGIpcyhjKSxifHxoZShOKSxzdGFydFdvcmtlcihjKTtlbHNle2lmKGMucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYy5wcmVSdW4mJihjLnByZVJ1bj1bYy5wcmVSdW5dKTtjLnByZVJ1bi5sZW5ndGg7KUcudW5zaGlmdChjLnByZVJ1bi5zaGlmdCgpKTtoZShHKSwwPFh8fChjLnNldFN0YXR1cz8oYy5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Yy5zZXRTdGF0dXMoIiIpfSksMSksZSgpfSksMSkpOmUoKSl9fWlmKGMua2VlcFJ1bnRpbWVBbGl2ZT1xLGMud2FzbU1lbW9yeT1rLGMuc3RhY2tBbGxvYz1FdCxjLnN0YWNrU2F2ZT1PdCxjLnN0YWNrUmVzdG9yZT1TdCxjLlVURjhUb1N0cmluZz1mZSxjLnN0cmluZ1RvVVRGOD1BZSxjLmxlbmd0aEJ5dGVzVVRGOD1TZSxjLkV4aXRTdGF0dXM9b2UsYy5QVGhyZWFkPWdlLFo9ZnVuY3Rpb24gZSgpe2h0fHxBdCgpLGh0fHwoWj1lKX0sYy5wcmVJbml0KWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYy5wcmVJbml0JiYoYy5wcmVJbml0PVtjLnByZUluaXRdKTswPGMucHJlSW5pdC5sZW5ndGg7KWMucHJlSW5pdC5wb3AoKSgpO3JldHVybiBBdCgpLGUucmVhZHl9KTtlLmV4cG9ydHM9bn0sOTMyOihlLHQscik9Pnt2YXIgX3NjcmlwdERpcixuPShfc2NyaXB0RGlyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKF9zY3JpcHREaXI9X3NjcmlwdERpcnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7dmFyIHQsbixhPWU7YS5yZWFkeT1uZXcgUHJvbWlzZSgoKGUscik9Pnt0PWUsbj1yfSkpO3ZhciBvLGkscyx1PU9iamVjdC5hc3NpZ24oe30sYSksYz0iLi90aGlzLnByb2dyYW0iLGw9KGUsdCk9Pnt0aHJvdyB0fSxmPSJvYmplY3QiPT10eXBlb2Ygd2luZG93LGQ9ImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMscD0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsZz0iIjtpZihwKXt2YXIgaD1yKDM4NCksbT1yKDkwOCk7Zz1kP20uZGlybmFtZShnKSsiLyI6X19kaXJuYW1lKyIvIixvPShlLHQpPT4oZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOm0ubm9ybWFsaXplKGUpLGgucmVhZEZpbGVTeW5jKGUsdD92b2lkIDA6InV0ZjgiKSkscz1lPT4oKGU9byhlLCEwKSkuYnVmZmVyfHwoZT1uZXcgVWludDhBcnJheShlKSksZSksaT0oZSx0LHIsbj0hMCk9PntlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksaC5yZWFkRmlsZShlLG4/dm9pZCAwOiJ1dGY4IiwoKGUsYSk9PntlP3IoZSk6dChuP2EuYnVmZmVyOmEpfSkpfSwhYS50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYoYz1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxsPShlLHQpPT57dGhyb3cgcHJvY2Vzcy5leGl0Q29kZT1lLHR9LGEuaW5zcGVjdD0oKT0+IltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIn1lbHNlKGZ8fGQpJiYoZD9nPXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoZz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksX3NjcmlwdERpciYmKGc9X3NjcmlwdERpciksZz0wIT09Zy5pbmRleE9mKCJibG9iOiIpP2cuc3Vic3RyKDAsZy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLG89ZT0+e3ZhciB0PW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gdC5vcGVuKCJHRVQiLGUsITEpLHQuc2VuZChudWxsKSx0LnJlc3BvbnNlVGV4dH0sZCYmKHM9ZT0+e3ZhciB0PW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gdC5vcGVuKCJHRVQiLGUsITEpLHQucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsdC5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KHQucmVzcG9uc2UpfSksaT0oZSx0LHIpPT57dmFyIG49bmV3IFhNTEh0dHBSZXF1ZXN0O24ub3BlbigiR0VUIixlLCEwKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4ub25sb2FkPSgpPT57MjAwPT1uLnN0YXR1c3x8MD09bi5zdGF0dXMmJm4ucmVzcG9uc2U/dChuLnJlc3BvbnNlKTpyKCl9LG4ub25lcnJvcj1yLG4uc2VuZChudWxsKX0pO3ZhciB5LHY9YS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxiPWEucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGEsdSksdT1udWxsLGEudGhpc1Byb2dyYW0mJihjPWEudGhpc1Byb2dyYW0pLGEucXVpdCYmKGw9YS5xdWl0KSxhLndhc21CaW5hcnkmJih5PWEud2FzbUJpbmFyeSk7dmFyIHc9YS5ub0V4aXRSdW50aW1lfHwhMDsib2JqZWN0IiE9dHlwZW9mIFdlYkFzc2VtYmx5JiZXKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIF8sTyxTLEUsQSxULE09ITE7ZnVuY3Rpb24gUigpe3ZhciBlPV8uYnVmZmVyO2EuSEVBUDg9Uz1uZXcgSW50OEFycmF5KGUpLGEuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGEuSEVBUDMyPUE9bmV3IEludDMyQXJyYXkoZSksYS5IRUFQVTg9RT1uZXcgVWludDhBcnJheShlKSxhLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGEuSEVBUFUzMj1UPW5ldyBVaW50MzJBcnJheShlKSxhLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxhLkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShlKX12YXIgRj1bXSxrPVtdLEM9W107ZnVuY3Rpb24gUCgpe3ZhciBlPWEucHJlUnVuLnNoaWZ0KCk7Ri51bnNoaWZ0KGUpfXZhciBELHgsST0wLFU9bnVsbCxMPW51bGw7ZnVuY3Rpb24gVyhlKXt0aHJvdyBhLm9uQWJvcnQmJmEub25BYm9ydChlKSxiKGU9IkFib3J0ZWQoIitlKyIpIiksTT0hMCxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLG4oZSksZX1mdW5jdGlvbiBIKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1pZighSChEPSJvcnQtd2FzbS53YXNtIikpe3ZhciBZPUQ7RD1hLmxvY2F0ZUZpbGU/YS5sb2NhdGVGaWxlKFksZyk6ZytZfWZ1bmN0aW9uIGooZSl7aWYoZT09RCYmeSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeSk7aWYocylyZXR1cm4gcyhlKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24geihlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCF5JiYoZnx8ZCkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgXCciK2UrIlwnIjtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfSkpLmNhdGNoKCgoKT0+aihlKSkpO2lmKGkpcmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e2koZSwoZT0+dChuZXcgVWludDhBcnJheShlKSkpLHIpfSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+aihlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4ociwoZT0+e2IoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksVyhlKX0pKX1mdW5jdGlvbiBHKGUpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPWBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7ZX0pYCx0aGlzLnN0YXR1cz1lfXZhciBOPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShhKX07ZnVuY3Rpb24gQihlKXt0aGlzLnFhPWUtMjQsdGhpcy52YT1mdW5jdGlvbihlKXtUW3RoaXMucWErND4+Mj4+PjBdPWV9LHRoaXMudWE9ZnVuY3Rpb24oZSl7VFt0aGlzLnFhKzg+PjI+Pj4wXT1lfSx0aGlzLnNhPWZ1bmN0aW9uKGUsdCl7dGhpcy50YSgpLHRoaXMudmEoZSksdGhpcy51YSh0KX0sdGhpcy50YT1mdW5jdGlvbigpe1RbdGhpcy5xYSsxNj4+Mj4+PjBdPTB9fXZhciAkLHE9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAsVj0oZSx0LHIpPT57dmFyIG49KHQ+Pj49MCkrcjtmb3Iocj10O2Vbcl0mJiEocj49bik7KSsrcjtpZigxNjxyLXQmJmUuYnVmZmVyJiZxKXJldHVybiBxLmRlY29kZShlLnN1YmFycmF5KHQscikpO2ZvcihuPSIiO3Q8cjspe3ZhciBhPWVbdCsrXTtpZigxMjgmYSl7dmFyIG89NjMmZVt0KytdO2lmKDE5Mj09KDIyNCZhKSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZhKTw8NnxvKTtlbHNle3ZhciBpPTYzJmVbdCsrXTs2NTUzNj4oYT0yMjQ9PSgyNDAmYSk/KDE1JmEpPDwxMnxvPDw2fGk6KDcmYSk8PDE4fG88PDEyfGk8PDZ8NjMmZVt0KytdKT9uKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpOihhLT02NTUzNixuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGE+PjEwLDU2MzIwfDEwMjMmYSkpfX1lbHNlIG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoYSl9cmV0dXJuIG59LEo9KGUsdCk9PihlPj4+PTApP1YoRSxlLHQpOiIiLFg9ZT0+e2Zvcih2YXIgdD0wLHI9MDtyPGUubGVuZ3RoOysrcil7dmFyIG49ZS5jaGFyQ29kZUF0KHIpOzEyNz49bj90Kys6MjA0Nz49bj90Kz0yOjU1Mjk2PD1uJiY1NzM0Mz49bj8odCs9NCwrK3IpOnQrPTN9cmV0dXJuIHR9LEs9KGUsdCxyLG4pPT57aWYoISgwPG4pKXJldHVybiAwO3ZhciBhPXI+Pj49MDtuPXIrbi0xO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgaT1lLmNoYXJDb2RlQXQobyk7aWYoNTUyOTY8PWkmJjU3MzQzPj1pJiYoaT02NTUzNisoKDEwMjMmaSk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK28pKSwxMjc+PWkpe2lmKHI+PW4pYnJlYWs7dFtyKys+Pj4wXT1pfWVsc2V7aWYoMjA0Nz49aSl7aWYocisxPj1uKWJyZWFrO3RbcisrPj4+MF09MTkyfGk+PjZ9ZWxzZXtpZig2NTUzNT49aSl7aWYocisyPj1uKWJyZWFrO3RbcisrPj4+MF09MjI0fGk+PjEyfWVsc2V7aWYociszPj1uKWJyZWFrO3RbcisrPj4+MF09MjQwfGk+PjE4LHRbcisrPj4+MF09MTI4fGk+PjEyJjYzfXRbcisrPj4+MF09MTI4fGk+PjYmNjN9dFtyKys+Pj4wXT0xMjh8NjMmaX19cmV0dXJuIHRbcj4+PjBdPTAsci1hfSxaPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksUT1bMCwzMSw2MCw5MSwxMjEsMTUyLDE4MiwyMTMsMjQ0LDI3NCwzMDUsMzM1XSxlZT1bMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0XSx0ZT1lPT57dmFyIHQ9WChlKSsxLHI9bGUodCk7cmV0dXJuIHImJksoZSxFLHIsdCkscn0scmU9e30sbmU9KCk9PntpZighJCl7dmFyIGUsdD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86Y3x8Ii4vdGhpcy5wcm9ncmFtIn07Zm9yKGUgaW4gcmUpdm9pZCAwPT09cmVbZV0/ZGVsZXRlIHRbZV06dFtlXT1yZVtlXTt2YXIgcj1bXTtmb3IoZSBpbiB0KXIucHVzaChgJHtlfT0ke3RbZV19YCk7JD1yfXJldHVybiAkfSxhZT1bbnVsbCxbXSxbXV0sb2U9ZT0+KG9lPSgoKT0+e2lmKCJvYmplY3QiPT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gZT0+Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKTtpZihwKXRyeXt2YXIgZT1yKDc2MCk7aWYoZS5yYW5kb21GaWxsU3luYylyZXR1cm4gdD0+ZS5yYW5kb21GaWxsU3luYyh0KTt2YXIgdD1lLnJhbmRvbUJ5dGVzO3JldHVybiBlPT4oZS5zZXQodChlLmJ5dGVMZW5ndGgpKSxlKX1jYXRjaChlKXt9VygiaW5pdFJhbmRvbURldmljZSIpfSkoKSkoZSksaWU9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxzZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIHVlKGUsdCxyLG4pe2Z1bmN0aW9uIGEoZSx0LHIpe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1yWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBhKGUsdCwiMCIpfWZ1bmN0aW9uIGkoZSx0KXtmdW5jdGlvbiByKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgbjtyZXR1cm4gMD09PShuPXIoZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KG49cihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihuPXIoZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxufWZ1bmN0aW9uIHMoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLm1hO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUubmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIHI9ZS5nZXRNb250aCgpLG49KFooZS5nZXRGdWxsWWVhcigpKT9pZTpzZSlbcl07aWYoISh0Pm4tZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09bi1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5yP2Uuc2V0TW9udGgocisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSl9cmV0dXJuIHI9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpKzEsMCw0KSx0PXMobmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsNCkpLHI9cyhyKSwwPj1pKHQsZSk/MD49aShyLGUpP2UuZ2V0RnVsbFllYXIoKSsxOmUuZ2V0RnVsbFllYXIoKTplLmdldEZ1bGxZZWFyKCktMX1lPj4+PTAsdD4+Pj0wLHI+Pj49MDt2YXIgYz1BWzQwKyhuPj4+PTApPj4yPj4+MF07Zm9yKHZhciBsIGluIG49e3lhOkFbbj4+Mj4+PjBdLHhhOkFbbis0Pj4yPj4+MF0sb2E6QVtuKzg+PjI+Pj4wXSxyYTpBW24rMTI+PjI+Pj4wXSxwYTpBW24rMTY+PjI+Pj4wXSxuYTpBW24rMjA+PjI+Pj4wXSxoYTpBW24rMjQ+PjI+Pj4wXSxtYTpBW24rMjg+PjI+Pj4wXSxBYTpBW24rMzI+PjI+Pj4wXSx3YTpBW24rMzY+PjI+Pj4wXSx6YTpjP0ooYyk6IiJ9LHI9SihyKSxjPXsiJWMiOiIlYSAlYiAlZCAlSDolTTolUyAlWSIsIiVEIjoiJW0vJWQvJXkiLCIlRiI6IiVZLSVtLSVkIiwiJWgiOiIlYiIsIiVyIjoiJUk6JU06JVMgJXAiLCIlUiI6IiVIOiVNIiwiJVQiOiIlSDolTTolUyIsIiV4IjoiJW0vJWQvJXkiLCIlWCI6IiVIOiVNOiVTIiwiJUVjIjoiJWMiLCIlRUMiOiIlQyIsIiVFeCI6IiVtLyVkLyV5IiwiJUVYIjoiJUg6JU06JVMiLCIlRXkiOiIleSIsIiVFWSI6IiVZIiwiJU9kIjoiJWQiLCIlT2UiOiIlZSIsIiVPSCI6IiVIIiwiJU9JIjoiJUkiLCIlT20iOiIlbSIsIiVPTSI6IiVNIiwiJU9TIjoiJVMiLCIlT3UiOiIldSIsIiVPVSI6IiVVIiwiJU9WIjoiJVYiLCIlT3ciOiIldyIsIiVPVyI6IiVXIiwiJU95IjoiJXkifSlyPXIucmVwbGFjZShuZXcgUmVnRXhwKGwsImciKSxjW2xdKTt2YXIgZj0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIiksZD0iSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlciIuc3BsaXQoIiAiKTtmb3IobCBpbiBjPXsiJWEiOmU9PmZbZS5oYV0uc3Vic3RyaW5nKDAsMyksIiVBIjplPT5mW2UuaGFdLCIlYiI6ZT0+ZFtlLnBhXS5zdWJzdHJpbmcoMCwzKSwiJUIiOmU9PmRbZS5wYV0sIiVDIjplPT5vKChlLm5hKzE5MDApLzEwMHwwLDIpLCIlZCI6ZT0+byhlLnJhLDIpLCIlZSI6ZT0+YShlLnJhLDIsIiAiKSwiJWciOmU9PnUoZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjplPT51KGUpLCIlSCI6ZT0+byhlLm9hLDIpLCIlSSI6ZT0+KDA9PShlPWUub2EpP2U9MTI6MTI8ZSYmKGUtPTEyKSxvKGUsMikpLCIlaiI6ZT0+e2Zvcih2YXIgdD0wLHI9MDtyPD1lLnBhLTE7dCs9KFooZS5uYSsxOTAwKT9pZTpzZSlbcisrXSk7cmV0dXJuIG8oZS5yYSt0LDMpfSwiJW0iOmU9Pm8oZS5wYSsxLDIpLCIlTSI6ZT0+byhlLnhhLDIpLCIlbiI6KCk9PiJcXG4iLCIlcCI6ZT0+MDw9ZS5vYSYmMTI+ZS5vYT8iQU0iOiJQTSIsIiVTIjplPT5vKGUueWEsMiksIiV0IjooKT0+IlxcdCIsIiV1IjplPT5lLmhhfHw3LCIlVSI6ZT0+byhNYXRoLmZsb29yKChlLm1hKzctZS5oYSkvNyksMiksIiVWIjplPT57dmFyIHQ9TWF0aC5mbG9vcigoZS5tYSs3LShlLmhhKzYpJTcpLzcpO2lmKDI+PShlLmhhKzM3MS1lLm1hLTIpJTcmJnQrKyx0KTUzPT10JiYoND09KHI9KGUuaGErMzcxLWUubWEpJTcpfHwzPT1yJiZaKGUubmEpfHwodD0xKSk7ZWxzZXt0PTUyO3ZhciByPShlLmhhKzctZS5tYS0xKSU3Oyg0PT1yfHw1PT1yJiZaKGUubmElNDAwLTEpKSYmdCsrfXJldHVybiBvKHQsMil9LCIldyI6ZT0+ZS5oYSwiJVciOmU9Pm8oTWF0aC5mbG9vcigoZS5tYSs3LShlLmhhKzYpJTcpLzcpLDIpLCIleSI6ZT0+KGUubmErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjplPT5lLm5hKzE5MDAsIiV6IjplPT57dmFyIHQ9MDw9KGU9ZS53YSk7cmV0dXJuIGU9TWF0aC5hYnMoZSkvNjAsKHQ/IisiOiItIikrU3RyaW5nKCIwMDAwIisoZS82MCoxMDArZSU2MCkpLnNsaWNlKC00KX0sIiVaIjplPT5lLnphLCIlJSI6KCk9PiIlIn0scj1yLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpLGMpci5pbmNsdWRlcyhsKSYmKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAobCwiZyIpLGNbbF0obikpKTtyZXR1cm4gbD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShYKGUpKzEpO3JldHVybiBLKGUsdCwwLHQubGVuZ3RoKSx0fShyPXIucmVwbGFjZSgvXFwwXFwwL2csIiUiKSksbC5sZW5ndGg+dD8wOihTLnNldChsLGU+Pj4wKSxsLmxlbmd0aC0xKX12YXIgY2U9e2E6ZnVuY3Rpb24oZSx0LHIpe3Rocm93IG5ldyBCKGU+Pj49MCkuc2EodD4+PjAscj4+PjApLGV9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSTpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sSzpmdW5jdGlvbigpe3JldHVybiAwfSxHOmZ1bmN0aW9uKCl7fSxCOmZ1bmN0aW9uKCl7fSxGOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx6OmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7fSx4OmZ1bmN0aW9uKCl7fSxrOigpPT4hMCxuOmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW3I+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxBW3IrND4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLEFbcis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLEFbcisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLEFbcisxNj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxBW3IrMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxBW3IrMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLEFbcisyOD4+Mj4+PjBdPShlLmdldFRpbWUoKS1EYXRlLlVUQyhlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwfSxvOmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW3I+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxBW3IrND4+Mj4+PjBdPWUuZ2V0TWludXRlcygpLEFbcis4Pj4yPj4+MF09ZS5nZXRIb3VycygpLEFbcisxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLEFbcisxNj4+Mj4+PjBdPWUuZ2V0TW9udGgoKSxBW3IrMjA+PjI+Pj4wXT1lLmdldEZ1bGxZZWFyKCktMTkwMCxBW3IrMjQ+PjI+Pj4wXT1lLmdldERheSgpLEFbcisyOD4+Mj4+PjBdPShaKGUuZ2V0RnVsbFllYXIoKSk/UTplZSlbZS5nZXRNb250aCgpXStlLmdldERhdGUoKS0xfDAsQVtyKzM2Pj4yPj4+MF09LTYwKmUuZ2V0VGltZXpvbmVPZmZzZXQoKSx0PW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIG49bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtBW3IrMzI+PjI+Pj4wXT0wfCh0IT1uJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKG4sdCkpfSxwOmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShBW2UrMjA+PjI+Pj4wXSsxOTAwLEFbZSsxNj4+Mj4+PjBdLEFbZSsxMj4+Mj4+PjBdLEFbZSs4Pj4yPj4+MF0sQVtlKzQ+PjI+Pj4wXSxBW2U+PjI+Pj4wXSwwKSxyPUFbZSszMj4+Mj4+PjBdLG49dC5nZXRUaW1lem9uZU9mZnNldCgpLGE9bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCksaT1NYXRoLm1pbihvLGEpO3JldHVybiAwPnI/QVtlKzMyPj4yPj4+MF09TnVtYmVyKGEhPW8mJmk9PW4pOjA8ciE9KGk9PW4pJiYoYT1NYXRoLm1heChvLGEpLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPHI/aTphKS1uKSkpLEFbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCksQVtlKzI4Pj4yPj4+MF09KFoodC5nZXRGdWxsWWVhcigpKT9ROmVlKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxBW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxBW2UrND4+Mj4+PjBdPXQuZ2V0TWludXRlcygpLEFbZSs4Pj4yPj4+MF09dC5nZXRIb3VycygpLEFbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLEFbZSsxNj4+Mj4+PjBdPXQuZ2V0TW9udGgoKSxBW2UrMjA+PjI+Pj4wXT10LmdldFllYXIoKSxlPXQuZ2V0VGltZSgpLzFlMyxkZSgoeD1lLDE8PStNYXRoLmFicyh4KT8wPHg/K01hdGguZmxvb3IoeC80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh4LSsofn54Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKSksZT4+PjB9LGw6ZnVuY3Rpb24oKXtyZXR1cm4tNTJ9LG06ZnVuY3Rpb24oKXt9LHU6ZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKT9lWzFdOiJHTVQifXI+Pj49MDt2YXIgYT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksbz1uZXcgRGF0ZShhLDAsMSksaT1uZXcgRGF0ZShhLDYsMSk7YT1vLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIHM9aS5nZXRUaW1lem9uZU9mZnNldCgpO1RbZT4+PjA+PjI+Pj4wXT02MCpNYXRoLm1heChhLHMpLEFbdD4+PjA+PjI+Pj4wXT1OdW1iZXIoYSE9cyksZT1uKG8pLHQ9bihpKSxlPXRlKGUpLHQ9dGUodCksczxhPyhUW3I+PjI+Pj4wXT1lLFRbcis0Pj4yPj4+MF09dCk6KFRbcj4+Mj4+PjBdPXQsVFtyKzQ+PjI+Pj4wXT1lKX0sZDooKT0+e1coIiIpfSxoOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHY6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sYjooKT0+cGVyZm9ybWFuY2Uubm93KCksSjpmdW5jdGlvbihlLHQscil7cmV0dXJuIHQ+Pj49MCxFLmNvcHlXaXRoaW4oZT4+PjA+Pj4wLHQ+Pj4wLHQrKHI+Pj4wKT4+PjApfSx0OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1FLmxlbmd0aDtpZig0Mjk0OTAxNzYwPGUpcmV0dXJuITE7Zm9yKHZhciByPTE7ND49cjtyKj0yKXt2YXIgbj10KigxKy4yL3IpO249TWF0aC5taW4obixlKzEwMDY2MzI5Nik7dmFyIGE9TWF0aDtuPU1hdGgubWF4KGUsbik7ZTp7YT1hLm1pbi5jYWxsKGEsNDI5NDkwMTc2MCxuKyg2NTUzNi1uJTY1NTM2KSU2NTUzNiktXy5idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNT4+PjE2O3RyeXtfLmdyb3coYSksUigpO3ZhciBvPTE7YnJlYWsgZX1jYXRjaChlKXt9bz12b2lkIDB9aWYobylyZXR1cm4hMH1yZXR1cm4hMX0sRDpmdW5jdGlvbihlLHQpe2U+Pj49MCx0Pj4+PTA7dmFyIHI9MDtyZXR1cm4gbmUoKS5mb3JFYWNoKChmdW5jdGlvbihuLGEpe3ZhciBvPXQrcjtmb3IoYT1UW2UrNCphPj4yPj4+MF09byxvPTA7bzxuLmxlbmd0aDsrK28pU1thKys+PjA+Pj4wXT1uLmNoYXJDb2RlQXQobyk7U1thPj4wPj4+MF09MCxyKz1uLmxlbmd0aCsxfSkpLDB9LEU6ZnVuY3Rpb24oZSx0KXtlPj4+PTAsdD4+Pj0wO3ZhciByPW5lKCk7VFtlPj4yPj4+MF09ci5sZW5ndGg7dmFyIG49MDtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihlKXtuKz1lLmxlbmd0aCsxfSkpLFRbdD4+Mj4+PjBdPW4sMH0sczplPT57d3x8KGEub25FeGl0JiZhLm9uRXhpdChlKSxNPSEwKSxsKGUsbmV3IEcoZSkpfSxmOigpPT41MixqOmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxxOmZ1bmN0aW9uKCl7cmV0dXJuIDcwfSxpOmZ1bmN0aW9uKGUsdCxyLG4pe3Q+Pj49MCxyPj4+PTAsbj4+Pj0wO2Zvcih2YXIgYT0wLG89MDtvPHI7bysrKXt2YXIgaT1UW3Q+PjI+Pj4wXSxzPVRbdCs0Pj4yPj4+MF07dCs9ODtmb3IodmFyIHU9MDt1PHM7dSsrKXt2YXIgYz1FW2krdT4+PjBdLGw9YWVbZV07MD09PWN8fDEwPT09Yz8oKDE9PT1lP3Y6YikoVihsLDApKSxsLmxlbmd0aD0wKTpsLnB1c2goYyl9YSs9c31yZXR1cm4gVFtuPj4yPj4+MF09YSwwfSxyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+Pj49MCxvZShFLnN1YmFycmF5KGU+Pj4wLGUrKHQ+Pj4wKT4+PjApKSwwfSxDOnVlLGM6ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHVlKGU+Pj4wLHQ+Pj4wLHI+Pj4wLG4+Pj4wKX19OyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZT1lLmV4cG9ydHMsTz1lPWZ1bmN0aW9uKGUpe3ZhciB0PWU9PigpPT5lKCk+Pj4wLHI9ZT0+dD0+ZSh0KT4+PjA7cmV0dXJuKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5tYWxsb2M9cihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPXIoZS5zdGFja0FsbG9jKSxlfShlKSxfPU8uTCxSKCksay51bnNoaWZ0KE8uTSksSS0tLGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKEkpLDA9PUkmJihudWxsIT09VSYmKGNsZWFySW50ZXJ2YWwoVSksVT1udWxsKSxMKSl7dmFyIHQ9TDtMPW51bGwsdCgpfXJldHVybiBlfXZhciB0PXthOmNlfTtpZihJKyssYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoSSksYS5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBhLmluc3RhbnRpYXRlV2FzbSh0LGUpfWNhdGNoKGUpe2IoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrZSksbihlKX0oZnVuY3Rpb24oZSx0KXt2YXIgcj1EO3JldHVybiB5fHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fEgocil8fHIuc3RhcnRzV2l0aCgiZmlsZTovLyIpfHxwfHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/eihyLGUsdCk6ZmV0Y2gocix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKG4sZSkudGhlbih0LChmdW5jdGlvbihuKXtyZXR1cm4gYigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrbiksYigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSx6KHIsZSx0KX0pKSkpfSkodCwoZnVuY3Rpb24odCl7ZSh0Lmluc3RhbmNlKX0pKS5jYXRjaChuKX0oKSxhLl9PcnRJbml0PShlLHQpPT4oYS5fT3J0SW5pdD1PLk4pKGUsdCksYS5fT3J0R2V0TGFzdEVycm9yPShlLHQpPT4oYS5fT3J0R2V0TGFzdEVycm9yPU8uTykoZSx0KSxhLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0oZSx0LHIsbixvLGkscyx1LGMsbCk9PihhLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1PLlApKGUsdCxyLG4sbyxpLHMsdSxjLGwpLGEuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShlLHQpPT4oYS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9Ty5RKShlLHQpLGEuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0oZSx0LHIpPT4oYS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PU8uUikoZSx0LHIpLGEuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1lPT4oYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPU8uUykoZSksYS5fT3J0Q3JlYXRlU2Vzc2lvbj0oZSx0LHIpPT4oYS5fT3J0Q3JlYXRlU2Vzc2lvbj1PLlQpKGUsdCxyKSxhLl9PcnRSZWxlYXNlU2Vzc2lvbj1lPT4oYS5fT3J0UmVsZWFzZVNlc3Npb249Ty5VKShlKSxhLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShlLHQscik9PihhLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PU8uVikoZSx0LHIpLGEuX09ydEdldElucHV0TmFtZT0oZSx0KT0+KGEuX09ydEdldElucHV0TmFtZT1PLlcpKGUsdCksYS5fT3J0R2V0T3V0cHV0TmFtZT0oZSx0KT0+KGEuX09ydEdldE91dHB1dE5hbWU9Ty5YKShlLHQpLGEuX09ydEZyZWU9ZT0+KGEuX09ydEZyZWU9Ty5ZKShlKSxhLl9PcnRDcmVhdGVUZW5zb3I9KGUsdCxyLG4sbyk9PihhLl9PcnRDcmVhdGVUZW5zb3I9Ty5aKShlLHQscixuLG8pLGEuX09ydEdldFRlbnNvckRhdGE9KGUsdCxyLG4sbyk9PihhLl9PcnRHZXRUZW5zb3JEYXRhPU8uXykoZSx0LHIsbixvKSxhLl9PcnRSZWxlYXNlVGVuc29yPWU9PihhLl9PcnRSZWxlYXNlVGVuc29yPU8uJCkoZSksYS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz0oZSx0LHIsbik9PihhLl9PcnRDcmVhdGVSdW5PcHRpb25zPU8uYWEpKGUsdCxyLG4pLGEuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PShlLHQscik9PihhLl9PcnRBZGRSdW5Db25maWdFbnRyeT1PLmJhKShlLHQsciksYS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ZT0+KGEuX09ydFJlbGVhc2VSdW5PcHRpb25zPU8uY2EpKGUpLGEuX09ydFJ1bj0oZSx0LHIsbixvLGkscyx1KT0+KGEuX09ydFJ1bj1PLmRhKShlLHQscixuLG8saSxzLHUpLGEuX09ydEVuZFByb2ZpbGluZz1lPT4oYS5fT3J0RW5kUHJvZmlsaW5nPU8uZWEpKGUpO3ZhciBsZT1hLl9tYWxsb2M9ZT0+KGxlPWEuX21hbGxvYz1PLmZhKShlKTthLl9mcmVlPWU9PihhLl9mcmVlPU8uZ2EpKGUpO3ZhciBmZSxkZT1lPT4oZGU9Ty5pYSkoZSkscGU9KCk9PihwZT1PLmphKSgpLGdlPWU9PihnZT1PLmthKShlKSxoZT1lPT4oaGU9Ty5sYSkoZSk7ZnVuY3Rpb24gbWUoKXtmdW5jdGlvbiBlKCl7aWYoIWZlJiYoZmU9ITAsYS5jYWxsZWRSdW49ITAsIU0pKXtpZihOKGspLHQoYSksYS5vblJ1bnRpbWVJbml0aWFsaXplZCYmYS5vblJ1bnRpbWVJbml0aWFsaXplZCgpLGEucG9zdFJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGEucG9zdFJ1biYmKGEucG9zdFJ1bj1bYS5wb3N0UnVuXSk7YS5wb3N0UnVuLmxlbmd0aDspe3ZhciBlPWEucG9zdFJ1bi5zaGlmdCgpO0MudW5zaGlmdChlKX1OKEMpfX1pZighKDA8SSkpe2lmKGEucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYS5wcmVSdW4mJihhLnByZVJ1bj1bYS5wcmVSdW5dKTthLnByZVJ1bi5sZW5ndGg7KVAoKTtOKEYpLDA8SXx8KGEuc2V0U3RhdHVzPyhhLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnNldFN0YXR1cygiIil9KSwxKSxlKCl9KSwxKSk6ZSgpKX19aWYoYS5zdGFja0FsbG9jPWhlLGEuc3RhY2tTYXZlPXBlLGEuc3RhY2tSZXN0b3JlPWdlLGEuVVRGOFRvU3RyaW5nPUosYS5zdHJpbmdUb1VURjg9KGUsdCxyKT0+SyhlLEUsdCxyKSxhLmxlbmd0aEJ5dGVzVVRGOD1YLEw9ZnVuY3Rpb24gZSgpe2ZlfHxtZSgpLGZlfHwoTD1lKX0sYS5wcmVJbml0KWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYS5wcmVJbml0JiYoYS5wcmVJbml0PVthLnByZUluaXRdKTswPGEucHJlSW5pdC5sZW5ndGg7KWEucHJlSW5pdC5wb3AoKSgpO3JldHVybiBtZSgpLGUucmVhZHl9KTtlLmV4cG9ydHM9bn0sMTU0OmU9PnsidXNlIHN0cmljdCI7ZS5leHBvcnRzPVwnInVzZSBzdHJpY3QiO3ZhciBlPXt9LGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKGEpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksdD1yLnBhcmVudFBvcnQ7dC5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgcz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+KDAsZXZhbCkocy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKyIvLyMgc291cmNlVVJMPSIrZSkscG9zdE1lc3NhZ2U6ZT0+dC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIG89ITEsZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO2E/cy53cml0ZVN5bmMoMixlKyJcXFxcbiIpOmNvbnNvbGUuZXJyb3IoZSl9O3NlbGYuYWxlcnQ9ZnVuY3Rpb24oKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiAiKTtwb3N0TWVzc2FnZSh7Y21kOiJhbGVydCIsdGV4dDphLHRocmVhZElkOmUuX3B0aHJlYWRfc2VsZigpfSl9LGUuaW5zdGFudGlhdGVXYXNtPShhLHIpPT57dmFyIHQ9ZS53YXNtTW9kdWxlO3JldHVybiBlLndhc21Nb2R1bGU9bnVsbCxyKG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZSh0LGEpKX0sc2VsZi5vbnVuaGFuZGxlZHJlamVjdGlvbj1lPT57dGhyb3cgZS5yZWFzb24/P2V9LHNlbGYub25tZXNzYWdlPWZ1bmN0aW9uIGEocil7dHJ5e2lmKCJsb2FkIj09PXIuZGF0YS5jbWQpe2xldCBzPVtdO3NlbGYub25tZXNzYWdlPWU9PnMucHVzaChlKSxzZWxmLnN0YXJ0V29ya2VyPXI9PntlPXIscG9zdE1lc3NhZ2Uoe2NtZDoibG9hZGVkIn0pO2ZvcihsZXQgZSBvZiBzKWEoZSk7c2VsZi5vbm1lc3NhZ2U9YX0sZS53YXNtTW9kdWxlPXIuZGF0YS53YXNtTW9kdWxlO2Zvcihjb25zdCBhIG9mIHIuZGF0YS5oYW5kbGVycyllW2FdPSguLi5lKT0+e3Bvc3RNZXNzYWdlKHtjbWQ6ImNhbGxIYW5kbGVyIixoYW5kbGVyOmEsYXJnczplfSl9O2lmKGUud2FzbU1lbW9yeT1yLmRhdGEud2FzbU1lbW9yeSxlLmJ1ZmZlcj1lLndhc21NZW1vcnkuYnVmZmVyLGUuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRD0hMCwic3RyaW5nIj09dHlwZW9mIHIuZGF0YS51cmxPckJsb2IpaW1wb3J0U2NyaXB0cyhyLmRhdGEudXJsT3JCbG9iKTtlbHNle3ZhciB0PVVSTC5jcmVhdGVPYmplY3RVUkwoci5kYXRhLnVybE9yQmxvYik7aW1wb3J0U2NyaXB0cyh0KSxVUkwucmV2b2tlT2JqZWN0VVJMKHQpfW9ydFdhc21UaHJlYWRlZChlKX1lbHNlIGlmKCJydW4iPT09ci5kYXRhLmNtZCl7ZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQoci5kYXRhLnB0aHJlYWRfcHRyLDAsMCwxKSxlLl9fZW1zY3JpcHRlbl90aHJlYWRfbWFpbGJveF9hd2FpdChyLmRhdGEucHRocmVhZF9wdHIpLGUuZXN0YWJsaXNoU3RhY2tTcGFjZSgpLGUuUFRocmVhZC5yZWNlaXZlT2JqZWN0VHJhbnNmZXIoci5kYXRhKSxlLlBUaHJlYWQudGhyZWFkSW5pdFRMUygpLG98fChvPSEwKTt0cnl7ZS5pbnZva2VFbnRyeVBvaW50KHIuZGF0YS5zdGFydF9yb3V0aW5lLHIuZGF0YS5hcmcpfWNhdGNoKGUpe2lmKCJ1bndpbmQiIT1lKXRocm93IGV9fWVsc2UiY2FuY2VsIj09PXIuZGF0YS5jbWQ/ZS5fcHRocmVhZF9zZWxmKCkmJmUuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0KC0xKToic2V0aW1tZWRpYXRlIj09PXIuZGF0YS50YXJnZXR8fCgiY2hlY2tNYWlsYm94Ij09PXIuZGF0YS5jbWQ/byYmZS5jaGVja01haWxib3goKTpyLmRhdGEuY21kJiYoZCgid29ya2VyLmpzIHJlY2VpdmVkIHVua25vd24gY29tbWFuZCAiK3IuZGF0YS5jbWQpLGQoci5kYXRhKSkpfWNhdGNoKGEpe3Rocm93IGUuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCgpLGF9fTtcXG5cJ30sNzYwOigpPT57fSwzODQ6KCk9Pnt9LDk5MzooKT0+e30sOTA4OigpPT57fSw5NTM6KCk9Pnt9LDkyNTooKT0+e30sNDQ5OigpPT57fX0sdD17fTtmdW5jdGlvbiByKG4pe3ZhciBhPXRbbl07aWYodm9pZCAwIT09YSlyZXR1cm4gYS5leHBvcnRzO3ZhciBvPXRbbl09e2V4cG9ydHM6e319O3JldHVybiBlW25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHIpLG8uZXhwb3J0c30oKCk9PnsidXNlIHN0cmljdCI7Y29uc3QgZT1yKDI1OSksdD1yKDI2Myk7c2VsZi5vbm1lc3NhZ2U9cj0+e3N3aXRjaChyLmRhdGEudHlwZSl7Y2FzZSJpbml0LXdhc20iOnRyeXsoMCx0LmluaXRpYWxpemVXZWJBc3NlbWJseSkoci5kYXRhLmluKS50aGVuKCgoKT0+cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtd2FzbSJ9KSksKGU9PnBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LXdhc20iLGVycjplfSkpKX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiaW5pdC13YXNtIixlcnI6ZX0pfWJyZWFrO2Nhc2UiaW5pdC1vcnQiOnRyeXsoMCxlLmluaXRSdW50aW1lKShyLmRhdGEuaW4pLnRoZW4oKCgpPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQifSkpLChlPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQiLGVycjplfSkpKSxwb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQifSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtb3J0IixlcnI6ZX0pfWJyZWFrO2Nhc2UiY3JlYXRlX2FsbG9jYXRlIjp0cnl7Y29uc3R7bW9kZWw6dH09ci5kYXRhLmluLG49KDAsZS5jcmVhdGVTZXNzaW9uQWxsb2NhdGUpKHQpO3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGVfYWxsb2NhdGUiLG91dDpufSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9hbGxvY2F0ZSIsZXJyOmV9KX1icmVhaztjYXNlImNyZWF0ZV9maW5hbGl6ZSI6dHJ5e2NvbnN0e21vZGVsZGF0YTp0LG9wdGlvbnM6bn09ci5kYXRhLmluLGE9KDAsZS5jcmVhdGVTZXNzaW9uRmluYWxpemUpKHQsbik7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9maW5hbGl6ZSIsb3V0OmF9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2ZpbmFsaXplIixlcnI6ZX0pfWJyZWFrO2Nhc2UiY3JlYXRlIjp0cnl7Y29uc3R7bW9kZWw6dCxvcHRpb25zOm59PXIuZGF0YS5pbixhPSgwLGUuY3JlYXRlU2Vzc2lvbikodCxuKTtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlIixvdXQ6YX0pfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGUiLGVycjplfSl9YnJlYWs7Y2FzZSJyZWxlYXNlIjp0cnl7Y29uc3QgdD1yLmRhdGEuaW47KDAsZS5yZWxlYXNlU2Vzc2lvbikodCkscG9zdE1lc3NhZ2Uoe3R5cGU6InJlbGVhc2UifSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6InJlbGVhc2UiLGVycjplfSl9YnJlYWs7Y2FzZSJydW4iOnRyeXtjb25zdHtzZXNzaW9uSWQ6dCxpbnB1dEluZGljZXM6bixpbnB1dHM6YSxvdXRwdXRJbmRpY2VzOm8sb3B0aW9uczppfT1yLmRhdGEuaW47KDAsZS5ydW4pKHQsbixhLG8saSkudGhlbigodD0+e3Bvc3RNZXNzYWdlKHt0eXBlOiJydW4iLG91dDp0fSwoMCxlLmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzKSh0KSl9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOiJydW4iLGVycjplfSl9KSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsZXJyOmV9KX1icmVhaztjYXNlImVuZC1wcm9maWxpbmciOnRyeXtjb25zdCB0PXIuZGF0YS5pbjsoMCxlLmVuZFByb2ZpbGluZykodCkscG9zdE1lc3NhZ2Uoe3R5cGU6ImVuZC1wcm9maWxpbmcifSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImVuZC1wcm9maWxpbmciLGVycjplfSl9fX19KSgpfSkoKTtcbicsIldvcmtlciIsdm9pZCAwLHZvaWQgMCl9fSw2NjE0OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89c2VsZnx8d2luZG93O3RyeXt0cnl7dmFyIGk7dHJ5e2k9bmV3IG8uQmxvYihbZV0pO31jYXRjaCh0KXsoaT1uZXcoby5CbG9iQnVpbGRlcnx8by5XZWJLaXRCbG9iQnVpbGRlcnx8by5Nb3pCbG9iQnVpbGRlcnx8by5NU0Jsb2JCdWlsZGVyKSkuYXBwZW5kKGUpLGk9aS5nZXRCbG9iKCk7fXZhciBzPW8uVVJMfHxvLndlYmtpdFVSTCxhPXMuY3JlYXRlT2JqZWN0VVJMKGkpLHU9bmV3IG9bdF0oYSxuKTtyZXR1cm4gcy5yZXZva2VPYmplY3RVUkwoYSksdX1jYXRjaChyKXtyZXR1cm4gbmV3IG9bdF0oImRhdGE6YXBwbGljYXRpb24vamF2YXNjcmlwdCwiLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZSkpLG4pfX1jYXRjaChlKXtpZighcil0aHJvdyBFcnJvcigiSW5saW5lIHdvcmtlciBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIG5ldyBvW3RdKHIsbil9fTt9LDI0NDY6KGUsdCxuKT0+e3ZhciByLG8saSxzPW4oMjEwMCksYT1zLlJlYWRlcix1PXMuV3JpdGVyLGw9cy51dGlsLGM9cy5yb290cy5kZWZhdWx0fHwocy5yb290cy5kZWZhdWx0PXt9KTtjLm9ubng9KChpPXt9KS5WZXJzaW9uPShyPXt9LChvPU9iamVjdC5jcmVhdGUocikpW3JbMF09Il9TVEFSVF9WRVJTSU9OIl09MCxvW3JbMV09IklSX1ZFUlNJT05fMjAxN18xMF8xMCJdPTEsb1tyWzJdPSJJUl9WRVJTSU9OXzIwMTdfMTBfMzAiXT0yLG9bclszXT0iSVJfVkVSU0lPTl8yMDE3XzExXzMiXT0zLG9bcls0XT0iSVJfVkVSU0lPTl8yMDE5XzFfMjIiXT00LG9bcls1XT0iSVJfVkVSU0lPTl8yMDE5XzNfMTgiXT01LG9bcls2XT0iSVJfVkVSU0lPTl8yMDE5XzlfMTkiXT02LG9bcls3XT0iSVJfVkVSU0lPTl8yMDIwXzVfOCJdPTcsb1tyWzhdPSJJUl9WRVJTSU9OXzIwMjFfN18zMCJdPTgsb1tyWzldPSJJUl9WRVJTSU9OIl09OSxvKSxpLkF0dHJpYnV0ZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmZsb2F0cz1bXSx0aGlzLmludHM9W10sdGhpcy5zdHJpbmdzPVtdLHRoaXMudGVuc29ycz1bXSx0aGlzLmdyYXBocz1bXSx0aGlzLnNwYXJzZVRlbnNvcnM9W10sdGhpcy50eXBlUHJvdG9zPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUucmVmQXR0ck5hbWU9IiIsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLnR5cGU9MCxlLnByb3RvdHlwZS5mPTAsZS5wcm90b3R5cGUuaT1sLkxvbmc/bC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5zPWwubmV3QnVmZmVyKFtdKSxlLnByb3RvdHlwZS50PW51bGwsZS5wcm90b3R5cGUuZz1udWxsLGUucHJvdG90eXBlLnNwYXJzZVRlbnNvcj1udWxsLGUucHJvdG90eXBlLnRwPW51bGwsZS5wcm90b3R5cGUuZmxvYXRzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5pbnRzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5zdHJpbmdzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS50ZW5zb3JzPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5ncmFwaHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnNwYXJzZVRlbnNvcnM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnR5cGVQcm90b3M9bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLm5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmdC51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLG51bGwhPWUuZiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZiIpJiZ0LnVpbnQzMigyMSkuZmxvYXQoZS5mKSxudWxsIT1lLmkmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImkiKSYmdC51aW50MzIoMjQpLmludDY0KGUuaSksbnVsbCE9ZS5zJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzIikmJnQudWludDMyKDM0KS5ieXRlcyhlLnMpLG51bGwhPWUudCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidCIpJiZjLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudCx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImciKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZyx0LnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmZsb2F0cyYmZS5mbG9hdHMubGVuZ3RoKXt0LnVpbnQzMig1OCkuZm9yaygpO2Zvcih2YXIgbj0wO248ZS5mbG9hdHMubGVuZ3RoOysrbil0LmZsb2F0KGUuZmxvYXRzW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmludHMmJmUuaW50cy5sZW5ndGgpe2Zvcih0LnVpbnQzMig2NikuZm9yaygpLG49MDtuPGUuaW50cy5sZW5ndGg7KytuKXQuaW50NjQoZS5pbnRzW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLnN0cmluZ3MmJmUuc3RyaW5ncy5sZW5ndGgpZm9yKG49MDtuPGUuc3RyaW5ncy5sZW5ndGg7KytuKXQudWludDMyKDc0KS5ieXRlcyhlLnN0cmluZ3Nbbl0pO2lmKG51bGwhPWUudGVuc29ycyYmZS50ZW5zb3JzLmxlbmd0aClmb3Iobj0wO248ZS50ZW5zb3JzLmxlbmd0aDsrK24pYy5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLnRlbnNvcnNbbl0sdC51aW50MzIoODIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5ncmFwaHMmJmUuZ3JhcGhzLmxlbmd0aClmb3Iobj0wO248ZS5ncmFwaHMubGVuZ3RoOysrbiljLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5ncmFwaHNbbl0sdC51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMigxMDYpLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS50cCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidHAiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS50cCx0LnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS50eXBlUHJvdG9zJiZlLnR5cGVQcm90b3MubGVuZ3RoKWZvcihuPTA7bjxlLnR5cGVQcm90b3MubGVuZ3RoOysrbiljLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnR5cGVQcm90b3Nbbl0sdC51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUudHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidHlwZSIpJiZ0LnVpbnQzMigxNjApLmludDMyKGUudHlwZSksbnVsbCE9ZS5yZWZBdHRyTmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicmVmQXR0ck5hbWUiKSYmdC51aW50MzIoMTcwKS5zdHJpbmcoZS5yZWZBdHRyTmFtZSksbnVsbCE9ZS5zcGFyc2VUZW5zb3ImJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNwYXJzZVRlbnNvciIpJiZjLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZW5jb2RlKGUuc3BhcnNlVGVuc29yLHQudWludDMyKDE3OCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLnNwYXJzZVRlbnNvcnMmJmUuc3BhcnNlVGVuc29ycy5sZW5ndGgpZm9yKG49MDtuPGUuc3BhcnNlVGVuc29ycy5sZW5ndGg7KytuKWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5lbmNvZGUoZS5zcGFyc2VUZW5zb3JzW25dLHQudWludDMyKDE4NikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LkF0dHJpYnV0ZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjE6ci5yZWZBdHRyTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTM6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDIwOnIudHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIuZj1lLmZsb2F0KCk7YnJlYWs7Y2FzZSAzOnIuaT1lLmludDY0KCk7YnJlYWs7Y2FzZSA0OnIucz1lLmJ5dGVzKCk7YnJlYWs7Y2FzZSA1OnIudD1jLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA2OnIuZz1jLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDIyOnIuc3BhcnNlVGVuc29yPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDE0OnIudHA9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDc6aWYoci5mbG9hdHMmJnIuZmxvYXRzLmxlbmd0aHx8KHIuZmxvYXRzPVtdKSwyPT0oNyZvKSlmb3IodmFyIGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmZsb2F0cy5wdXNoKGUuZmxvYXQoKSk7ZWxzZSByLmZsb2F0cy5wdXNoKGUuZmxvYXQoKSk7YnJlYWs7Y2FzZSA4OmlmKHIuaW50cyYmci5pbnRzLmxlbmd0aHx8KHIuaW50cz1bXSksMj09KDcmbykpZm9yKGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmludHMucHVzaChlLmludDY0KCkpO2Vsc2Ugci5pbnRzLnB1c2goZS5pbnQ2NCgpKTticmVhaztjYXNlIDk6ci5zdHJpbmdzJiZyLnN0cmluZ3MubGVuZ3RofHwoci5zdHJpbmdzPVtdKSxyLnN0cmluZ3MucHVzaChlLmJ5dGVzKCkpO2JyZWFrO2Nhc2UgMTA6ci50ZW5zb3JzJiZyLnRlbnNvcnMubGVuZ3RofHwoci50ZW5zb3JzPVtdKSxyLnRlbnNvcnMucHVzaChjLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTE6ci5ncmFwaHMmJnIuZ3JhcGhzLmxlbmd0aHx8KHIuZ3JhcGhzPVtdKSxyLmdyYXBocy5wdXNoKGMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDIzOnIuc3BhcnNlVGVuc29ycyYmci5zcGFyc2VUZW5zb3JzLmxlbmd0aHx8KHIuc3BhcnNlVGVuc29ycz1bXSksci5zcGFyc2VUZW5zb3JzLnB1c2goYy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDE1OnIudHlwZVByb3RvcyYmci50eXBlUHJvdG9zLmxlbmd0aHx8KHIudHlwZVByb3Rvcz1bXSksci50eXBlUHJvdG9zLnB1c2goYy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucmVmQXR0ck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInJlZkF0dHJOYW1lIikmJiFsLmlzU3RyaW5nKGUucmVmQXR0ck5hbWUpKXJldHVybiAicmVmQXR0ck5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS50eXBlJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikpc3dpdGNoKGUudHlwZSl7ZGVmYXVsdDpyZXR1cm4gInR5cGU6IGVudW0gdmFsdWUgZXhwZWN0ZWQiO2Nhc2UgMDpjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmNhc2UgMTE6Y2FzZSAxMzpjYXNlIDY6Y2FzZSA3OmNhc2UgODpjYXNlIDk6Y2FzZSAxMDpjYXNlIDEyOmNhc2UgMTQ6fWlmKG51bGwhPWUuZiYmZS5oYXNPd25Qcm9wZXJ0eSgiZiIpJiYibnVtYmVyIiE9dHlwZW9mIGUuZilyZXR1cm4gImY6IG51bWJlciBleHBlY3RlZCI7aWYobnVsbCE9ZS5pJiZlLmhhc093blByb3BlcnR5KCJpIikmJiEobC5pc0ludGVnZXIoZS5pKXx8ZS5pJiZsLmlzSW50ZWdlcihlLmkubG93KSYmbC5pc0ludGVnZXIoZS5pLmhpZ2gpKSlyZXR1cm4gImk6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5zJiZlLmhhc093blByb3BlcnR5KCJzIikmJiEoZS5zJiYibnVtYmVyIj09dHlwZW9mIGUucy5sZW5ndGh8fGwuaXNTdHJpbmcoZS5zKSkpcmV0dXJuICJzOiBidWZmZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUudCYmZS5oYXNPd25Qcm9wZXJ0eSgidCIpJiYobj1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudCkpKXJldHVybiAidC4iK247aWYobnVsbCE9ZS5nJiZlLmhhc093blByb3BlcnR5KCJnIikmJihuPWMub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmcpKSlyZXR1cm4gImcuIituO2lmKG51bGwhPWUuc3BhcnNlVGVuc29yJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3IiKSYmKG49Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZVRlbnNvcikpKXJldHVybiAic3BhcnNlVGVuc29yLiIrbjtpZihudWxsIT1lLnRwJiZlLmhhc093blByb3BlcnR5KCJ0cCIpJiYobj1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnRwKSkpcmV0dXJuICJ0cC4iK247aWYobnVsbCE9ZS5mbG9hdHMmJmUuaGFzT3duUHJvcGVydHkoImZsb2F0cyIpKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0cykpcmV0dXJuICJmbG9hdHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuZmxvYXRzLmxlbmd0aDsrK3QpaWYoIm51bWJlciIhPXR5cGVvZiBlLmZsb2F0c1t0XSlyZXR1cm4gImZsb2F0czogbnVtYmVyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuaW50cyYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50cyIpKXtpZighQXJyYXkuaXNBcnJheShlLmludHMpKXJldHVybiAiaW50czogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmludHMubGVuZ3RoOysrdClpZighKGwuaXNJbnRlZ2VyKGUuaW50c1t0XSl8fGUuaW50c1t0XSYmbC5pc0ludGVnZXIoZS5pbnRzW3RdLmxvdykmJmwuaXNJbnRlZ2VyKGUuaW50c1t0XS5oaWdoKSkpcmV0dXJuICJpbnRzOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5zdHJpbmdzJiZlLmhhc093blByb3BlcnR5KCJzdHJpbmdzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3RyaW5ncykpcmV0dXJuICJzdHJpbmdzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuc3RyaW5ncy5sZW5ndGg7Kyt0KWlmKCEoZS5zdHJpbmdzW3RdJiYibnVtYmVyIj09dHlwZW9mIGUuc3RyaW5nc1t0XS5sZW5ndGh8fGwuaXNTdHJpbmcoZS5zdHJpbmdzW3RdKSkpcmV0dXJuICJzdHJpbmdzOiBidWZmZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS50ZW5zb3JzJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JzIikpe2lmKCFBcnJheS5pc0FycmF5KGUudGVuc29ycykpcmV0dXJuICJ0ZW5zb3JzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudGVuc29ycy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnRlbnNvcnNbdF0pKXJldHVybiAidGVuc29ycy4iK259aWYobnVsbCE9ZS5ncmFwaHMmJmUuaGFzT3duUHJvcGVydHkoImdyYXBocyIpKXtpZighQXJyYXkuaXNBcnJheShlLmdyYXBocykpcmV0dXJuICJncmFwaHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5ncmFwaHMubGVuZ3RoOysrdClpZihuPWMub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmdyYXBoc1t0XSkpcmV0dXJuICJncmFwaHMuIitufWlmKG51bGwhPWUuc3BhcnNlVGVuc29ycyYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29ycyIpKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZVRlbnNvcnMpKXJldHVybiAic3BhcnNlVGVuc29yczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrdClpZihuPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by52ZXJpZnkoZS5zcGFyc2VUZW5zb3JzW3RdKSlyZXR1cm4gInNwYXJzZVRlbnNvcnMuIitufWlmKG51bGwhPWUudHlwZVByb3RvcyYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZVByb3RvcyIpKXtpZighQXJyYXkuaXNBcnJheShlLnR5cGVQcm90b3MpKXJldHVybiAidHlwZVByb3RvczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnR5cGVQcm90b3MubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnR5cGVQcm90b3NbdF0pKXJldHVybiAidHlwZVByb3Rvcy4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LkF0dHJpYnV0ZVByb3RvO3N3aXRjaChudWxsIT1lLm5hbWUmJih0Lm5hbWU9U3RyaW5nKGUubmFtZSkpLG51bGwhPWUucmVmQXR0ck5hbWUmJih0LnJlZkF0dHJOYW1lPVN0cmluZyhlLnJlZkF0dHJOYW1lKSksbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLnR5cGUpe2RlZmF1bHQ6aWYoIm51bWJlciI9PXR5cGVvZiBlLnR5cGUpe3QudHlwZT1lLnR5cGU7YnJlYWt9YnJlYWs7Y2FzZSJVTkRFRklORUQiOmNhc2UgMDp0LnR5cGU9MDticmVhaztjYXNlIkZMT0FUIjpjYXNlIDE6dC50eXBlPTE7YnJlYWs7Y2FzZSJJTlQiOmNhc2UgMjp0LnR5cGU9MjticmVhaztjYXNlIlNUUklORyI6Y2FzZSAzOnQudHlwZT0zO2JyZWFrO2Nhc2UiVEVOU09SIjpjYXNlIDQ6dC50eXBlPTQ7YnJlYWs7Y2FzZSJHUkFQSCI6Y2FzZSA1OnQudHlwZT01O2JyZWFrO2Nhc2UiU1BBUlNFX1RFTlNPUiI6Y2FzZSAxMTp0LnR5cGU9MTE7YnJlYWs7Y2FzZSJUWVBFX1BST1RPIjpjYXNlIDEzOnQudHlwZT0xMzticmVhaztjYXNlIkZMT0FUUyI6Y2FzZSA2OnQudHlwZT02O2JyZWFrO2Nhc2UiSU5UUyI6Y2FzZSA3OnQudHlwZT03O2JyZWFrO2Nhc2UiU1RSSU5HUyI6Y2FzZSA4OnQudHlwZT04O2JyZWFrO2Nhc2UiVEVOU09SUyI6Y2FzZSA5OnQudHlwZT05O2JyZWFrO2Nhc2UiR1JBUEhTIjpjYXNlIDEwOnQudHlwZT0xMDticmVhaztjYXNlIlNQQVJTRV9URU5TT1JTIjpjYXNlIDEyOnQudHlwZT0xMjticmVhaztjYXNlIlRZUEVfUFJPVE9TIjpjYXNlIDE0OnQudHlwZT0xNDt9aWYobnVsbCE9ZS5mJiYodC5mPU51bWJlcihlLmYpKSxudWxsIT1lLmkmJihsLkxvbmc/KHQuaT1sLkxvbmcuZnJvbVZhbHVlKGUuaSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5pP3QuaT1wYXJzZUludChlLmksMTApOiJudW1iZXIiPT10eXBlb2YgZS5pP3QuaT1lLmk6Im9iamVjdCI9PXR5cGVvZiBlLmkmJih0Lmk9bmV3IGwuTG9uZ0JpdHMoZS5pLmxvdz4+PjAsZS5pLmhpZ2g+Pj4wKS50b051bWJlcigpKSksbnVsbCE9ZS5zJiYoInN0cmluZyI9PXR5cGVvZiBlLnM/bC5iYXNlNjQuZGVjb2RlKGUucyx0LnM9bC5uZXdCdWZmZXIobC5iYXNlNjQubGVuZ3RoKGUucykpLDApOmUucy5sZW5ndGg+PTAmJih0LnM9ZS5zKSksbnVsbCE9ZS50KXtpZigib2JqZWN0IiE9dHlwZW9mIGUudCl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnQ6IG9iamVjdCBleHBlY3RlZCIpO3QudD1jLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnQpO31pZihudWxsIT1lLmcpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5nKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZzogb2JqZWN0IGV4cGVjdGVkIik7dC5nPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5nKTt9aWYobnVsbCE9ZS5zcGFyc2VUZW5zb3Ipe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zcGFyc2VUZW5zb3IpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5zcGFyc2VUZW5zb3I6IG9iamVjdCBleHBlY3RlZCIpO3Quc3BhcnNlVGVuc29yPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuc3BhcnNlVGVuc29yKTt9aWYobnVsbCE9ZS50cCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnRwKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udHA6IG9iamVjdCBleHBlY3RlZCIpO3QudHA9Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUudHApO31pZihlLmZsb2F0cyl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdHMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZmxvYXRzOiBhcnJheSBleHBlY3RlZCIpO3QuZmxvYXRzPVtdO2Zvcih2YXIgbj0wO248ZS5mbG9hdHMubGVuZ3RoOysrbil0LmZsb2F0c1tuXT1OdW1iZXIoZS5mbG9hdHNbbl0pO31pZihlLmludHMpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50cykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5pbnRzOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmludHM9W10sbj0wO248ZS5pbnRzLmxlbmd0aDsrK24pbC5Mb25nPyh0LmludHNbbl09bC5Mb25nLmZyb21WYWx1ZShlLmludHNbbl0pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuaW50c1tuXT90LmludHNbbl09cGFyc2VJbnQoZS5pbnRzW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUuaW50c1tuXT90LmludHNbbl09ZS5pbnRzW25dOiJvYmplY3QiPT10eXBlb2YgZS5pbnRzW25dJiYodC5pbnRzW25dPW5ldyBsLkxvbmdCaXRzKGUuaW50c1tuXS5sb3c+Pj4wLGUuaW50c1tuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSk7fWlmKGUuc3RyaW5ncyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnN0cmluZ3M6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuc3RyaW5ncz1bXSxuPTA7bjxlLnN0cmluZ3MubGVuZ3RoOysrbikic3RyaW5nIj09dHlwZW9mIGUuc3RyaW5nc1tuXT9sLmJhc2U2NC5kZWNvZGUoZS5zdHJpbmdzW25dLHQuc3RyaW5nc1tuXT1sLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5zdHJpbmdzW25dKSksMCk6ZS5zdHJpbmdzW25dLmxlbmd0aD49MCYmKHQuc3RyaW5nc1tuXT1lLnN0cmluZ3Nbbl0pO31pZihlLnRlbnNvcnMpe2lmKCFBcnJheS5pc0FycmF5KGUudGVuc29ycykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50ZW5zb3JzOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnRlbnNvcnM9W10sbj0wO248ZS50ZW5zb3JzLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS50ZW5zb3JzW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udGVuc29yczogb2JqZWN0IGV4cGVjdGVkIik7dC50ZW5zb3JzW25dPWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudGVuc29yc1tuXSk7fX1pZihlLmdyYXBocyl7aWYoIUFycmF5LmlzQXJyYXkoZS5ncmFwaHMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZ3JhcGhzOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmdyYXBocz1bXSxuPTA7bjxlLmdyYXBocy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZ3JhcGhzW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZ3JhcGhzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmdyYXBoc1tuXT1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZ3JhcGhzW25dKTt9fWlmKGUuc3BhcnNlVGVuc29ycyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VUZW5zb3JzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuc3BhcnNlVGVuc29ycz1bXSxuPTA7bjxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZVRlbnNvcnNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5zcGFyc2VUZW5zb3JzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNwYXJzZVRlbnNvcnNbbl09Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmZyb21PYmplY3QoZS5zcGFyc2VUZW5zb3JzW25dKTt9fWlmKGUudHlwZVByb3Rvcyl7aWYoIUFycmF5LmlzQXJyYXkoZS50eXBlUHJvdG9zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnR5cGVQcm90b3M6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudHlwZVByb3Rvcz1bXSxuPTA7bjxlLnR5cGVQcm90b3MubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnR5cGVQcm90b3Nbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50eXBlUHJvdG9zOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnR5cGVQcm90b3Nbbl09Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUudHlwZVByb3Rvc1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5mbG9hdHM9W10sbi5pbnRzPVtdLG4uc3RyaW5ncz1bXSxuLnRlbnNvcnM9W10sbi5ncmFwaHM9W10sbi50eXBlUHJvdG9zPVtdLG4uc3BhcnNlVGVuc29ycz1bXSksdC5kZWZhdWx0cyl7aWYobi5uYW1lPSIiLG4uZj0wLGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24uaT10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4uaT10LmxvbmdzPT09U3RyaW5nPyIwIjowO3QuYnl0ZXM9PT1TdHJpbmc/bi5zPSIiOihuLnM9W10sdC5ieXRlcyE9PUFycmF5JiYobi5zPWwubmV3QnVmZmVyKG4ucykpKSxuLnQ9bnVsbCxuLmc9bnVsbCxuLmRvY1N0cmluZz0iIixuLnRwPW51bGwsbi50eXBlPXQuZW51bXM9PT1TdHJpbmc/IlVOREVGSU5FRCI6MCxuLnJlZkF0dHJOYW1lPSIiLG4uc3BhcnNlVGVuc29yPW51bGw7fWlmKG51bGwhPWUubmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYobi5uYW1lPWUubmFtZSksbnVsbCE9ZS5mJiZlLmhhc093blByb3BlcnR5KCJmIikmJihuLmY9dC5qc29uJiYhaXNGaW5pdGUoZS5mKT9TdHJpbmcoZS5mKTplLmYpLG51bGwhPWUuaSYmZS5oYXNPd25Qcm9wZXJ0eSgiaSIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmk/bi5pPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaSk6ZS5pOm4uaT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmkpOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pLmxvdz4+PjAsZS5pLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaSksbnVsbCE9ZS5zJiZlLmhhc093blByb3BlcnR5KCJzIikmJihuLnM9dC5ieXRlcz09PVN0cmluZz9sLmJhc2U2NC5lbmNvZGUoZS5zLDAsZS5zLmxlbmd0aCk6dC5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUucyk6ZS5zKSxudWxsIT1lLnQmJmUuaGFzT3duUHJvcGVydHkoInQiKSYmKG4udD1jLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS50LHQpKSxudWxsIT1lLmcmJmUuaGFzT3duUHJvcGVydHkoImciKSYmKG4uZz1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmcsdCkpLGUuZmxvYXRzJiZlLmZsb2F0cy5sZW5ndGgpe24uZmxvYXRzPVtdO2Zvcih2YXIgbz0wO288ZS5mbG9hdHMubGVuZ3RoOysrbyluLmZsb2F0c1tvXT10Lmpzb24mJiFpc0Zpbml0ZShlLmZsb2F0c1tvXSk/U3RyaW5nKGUuZmxvYXRzW29dKTplLmZsb2F0c1tvXTt9aWYoZS5pbnRzJiZlLmludHMubGVuZ3RoKWZvcihuLmludHM9W10sbz0wO288ZS5pbnRzLmxlbmd0aDsrK28pIm51bWJlciI9PXR5cGVvZiBlLmludHNbb10/bi5pbnRzW29dPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaW50c1tvXSk6ZS5pbnRzW29dOm4uaW50c1tvXT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmludHNbb10pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pbnRzW29dLmxvdz4+PjAsZS5pbnRzW29dLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaW50c1tvXTtpZihlLnN0cmluZ3MmJmUuc3RyaW5ncy5sZW5ndGgpZm9yKG4uc3RyaW5ncz1bXSxvPTA7bzxlLnN0cmluZ3MubGVuZ3RoOysrbyluLnN0cmluZ3Nbb109dC5ieXRlcz09PVN0cmluZz9sLmJhc2U2NC5lbmNvZGUoZS5zdHJpbmdzW29dLDAsZS5zdHJpbmdzW29dLmxlbmd0aCk6dC5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuc3RyaW5nc1tvXSk6ZS5zdHJpbmdzW29dO2lmKGUudGVuc29ycyYmZS50ZW5zb3JzLmxlbmd0aClmb3Iobi50ZW5zb3JzPVtdLG89MDtvPGUudGVuc29ycy5sZW5ndGg7KytvKW4udGVuc29yc1tvXT1jLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS50ZW5zb3JzW29dLHQpO2lmKGUuZ3JhcGhzJiZlLmdyYXBocy5sZW5ndGgpZm9yKG4uZ3JhcGhzPVtdLG89MDtvPGUuZ3JhcGhzLmxlbmd0aDsrK28pbi5ncmFwaHNbb109Yy5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5ncmFwaHNbb10sdCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG51bGwhPWUudHAmJmUuaGFzT3duUHJvcGVydHkoInRwIikmJihuLnRwPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50cCx0KSksZS50eXBlUHJvdG9zJiZlLnR5cGVQcm90b3MubGVuZ3RoKWZvcihuLnR5cGVQcm90b3M9W10sbz0wO288ZS50eXBlUHJvdG9zLmxlbmd0aDsrK28pbi50eXBlUHJvdG9zW29dPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50eXBlUHJvdG9zW29dLHQpO2lmKG51bGwhPWUudHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpJiYobi50eXBlPXQuZW51bXM9PT1TdHJpbmc/dm9pZCAwPT09Yy5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbZS50eXBlXT9lLnR5cGU6Yy5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbZS50eXBlXTplLnR5cGUpLG51bGwhPWUucmVmQXR0ck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInJlZkF0dHJOYW1lIikmJihuLnJlZkF0dHJOYW1lPWUucmVmQXR0ck5hbWUpLG51bGwhPWUuc3BhcnNlVGVuc29yJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3IiKSYmKG4uc3BhcnNlVGVuc29yPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZVRlbnNvcix0KSksZS5zcGFyc2VUZW5zb3JzJiZlLnNwYXJzZVRlbnNvcnMubGVuZ3RoKWZvcihuLnNwYXJzZVRlbnNvcnM9W10sbz0wO288ZS5zcGFyc2VUZW5zb3JzLmxlbmd0aDsrK28pbi5zcGFyc2VUZW5zb3JzW29dPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZVRlbnNvcnNbb10sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguQXR0cmlidXRlUHJvdG8ifSxlLkF0dHJpYnV0ZVR5cGU9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iVU5ERUZJTkVEIl09MCx0W2VbMV09IkZMT0FUIl09MSx0W2VbMl09IklOVCJdPTIsdFtlWzNdPSJTVFJJTkciXT0zLHRbZVs0XT0iVEVOU09SIl09NCx0W2VbNV09IkdSQVBIIl09NSx0W2VbMTFdPSJTUEFSU0VfVEVOU09SIl09MTEsdFtlWzEzXT0iVFlQRV9QUk9UTyJdPTEzLHRbZVs2XT0iRkxPQVRTIl09Nix0W2VbN109IklOVFMiXT03LHRbZVs4XT0iU1RSSU5HUyJdPTgsdFtlWzldPSJURU5TT1JTIl09OSx0W2VbMTBdPSJHUkFQSFMiXT0xMCx0W2VbMTJdPSJTUEFSU0VfVEVOU09SUyJdPTEyLHRbZVsxNF09IlRZUEVfUFJPVE9TIl09MTQsdH0oKSxlfSgpLGkuVmFsdWVJbmZvUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUudHlwZT1udWxsLGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS50eXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0eXBlIikmJmMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudHlwZSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDI2KS5zdHJpbmcoZS5kb2NTdHJpbmcpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5WYWx1ZUluZm9Qcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci50eXBlPWMub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUudHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnR5cGUpO2lmKHQpcmV0dXJuICJ0eXBlLiIrdH1yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZyk/ImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5WYWx1ZUluZm9Qcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlZhbHVlSW5mb1Byb3RvO2lmKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksbnVsbCE9ZS50eXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlZhbHVlSW5mb1Byb3RvLnR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3QudHlwZT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50eXBlKTt9cmV0dXJuIG51bGwhPWUuZG9jU3RyaW5nJiYodC5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLnR5cGU9bnVsbCxuLmRvY1N0cmluZz0iIiksbnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLnR5cGUmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmKG4udHlwZT1jLm9ubnguVHlwZVByb3RvLnRvT2JqZWN0KGUudHlwZSx0KSksbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVmFsdWVJbmZvUHJvdG8ifSxlfSgpLGkuTm9kZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmlucHV0PVtdLHRoaXMub3V0cHV0PVtdLHRoaXMuYXR0cmlidXRlPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmlucHV0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5vdXRwdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUub3BUeXBlPSIiLGUucHJvdG90eXBlLmRvbWFpbj0iIixlLnByb3RvdHlwZS5hdHRyaWJ1dGU9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5pbnB1dCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pdC51aW50MzIoMTApLnN0cmluZyhlLmlucHV0W25dKTtpZihudWxsIT1lLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXQudWludDMyKDE4KS5zdHJpbmcoZS5vdXRwdXRbbl0pO2lmKG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigyNikuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5vcFR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm9wVHlwZSIpJiZ0LnVpbnQzMigzNCkuc3RyaW5nKGUub3BUeXBlKSxudWxsIT1lLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuPTA7bjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytuKWMub25ueC5BdHRyaWJ1dGVQcm90by5lbmNvZGUoZS5hdHRyaWJ1dGVbbl0sdC51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoNTApLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMig1OCkuc3RyaW5nKGUuZG9tYWluKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguTm9kZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuaW5wdXQmJnIuaW5wdXQubGVuZ3RofHwoci5pbnB1dD1bXSksci5pbnB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgMjpyLm91dHB1dCYmci5vdXRwdXQubGVuZ3RofHwoci5vdXRwdXQ9W10pLHIub3V0cHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAzOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDpyLm9wVHlwZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNzpyLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNTpyLmF0dHJpYnV0ZSYmci5hdHRyaWJ1dGUubGVuZ3RofHwoci5hdHRyaWJ1dGU9W10pLHIuYXR0cmlidXRlLnB1c2goYy5vbm54LkF0dHJpYnV0ZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDY6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmlucHV0JiZlLmhhc093blByb3BlcnR5KCJpbnB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSlyZXR1cm4gImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLmlucHV0Lmxlbmd0aDsrK3QpaWYoIWwuaXNTdHJpbmcoZS5pbnB1dFt0XSkpcmV0dXJuICJpbnB1dDogc3RyaW5nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUub3V0cHV0JiZlLmhhc093blByb3BlcnR5KCJvdXRwdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vdXRwdXQpKXJldHVybiAib3V0cHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUub3V0cHV0Lmxlbmd0aDsrK3QpaWYoIWwuaXNTdHJpbmcoZS5vdXRwdXRbdF0pKXJldHVybiAib3V0cHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUub3BUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcFR5cGUiKSYmIWwuaXNTdHJpbmcoZS5vcFR5cGUpKXJldHVybiAib3BUeXBlOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pKXJldHVybiAiZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuYXR0cmlidXRlJiZlLmhhc093blByb3BlcnR5KCJhdHRyaWJ1dGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXJldHVybiAiYXR0cmlidXRlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuYXR0cmlidXRlLmxlbmd0aDsrK3Qpe3ZhciBuPWMub25ueC5BdHRyaWJ1dGVQcm90by52ZXJpZnkoZS5hdHRyaWJ1dGVbdF0pO2lmKG4pcmV0dXJuICJhdHRyaWJ1dGUuIitufX1yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZyk/ImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5Ob2RlUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5Ob2RlUHJvdG87aWYoZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Ob2RlUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7dC5pbnB1dD1bXTtmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil0LmlucHV0W25dPVN0cmluZyhlLmlucHV0W25dKTt9aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5vdXRwdXQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQub3V0cHV0PVtdLG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pdC5vdXRwdXRbbl09U3RyaW5nKGUub3V0cHV0W25dKTt9aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxudWxsIT1lLm9wVHlwZSYmKHQub3BUeXBlPVN0cmluZyhlLm9wVHlwZSkpLG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksZS5hdHRyaWJ1dGUpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5hdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuYXR0cmlidXRlPVtdLG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5hdHRyaWJ1dGVbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Ob2RlUHJvdG8uYXR0cmlidXRlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmF0dHJpYnV0ZVtuXT1jLm9ubnguQXR0cmlidXRlUHJvdG8uZnJvbU9iamVjdChlLmF0dHJpYnV0ZVtuXSk7fX1yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKCh0LmFycmF5c3x8dC5kZWZhdWx0cykmJihuLmlucHV0PVtdLG4ub3V0cHV0PVtdLG4uYXR0cmlidXRlPVtdKSx0LmRlZmF1bHRzJiYobi5uYW1lPSIiLG4ub3BUeXBlPSIiLG4uZG9jU3RyaW5nPSIiLG4uZG9tYWluPSIiKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aCl7bi5pbnB1dD1bXTtmb3IodmFyIHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrciluLmlucHV0W3JdPWUuaW5wdXRbcl07fWlmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG4ub3V0cHV0PVtdLHI9MDtyPGUub3V0cHV0Lmxlbmd0aDsrK3Ipbi5vdXRwdXRbcl09ZS5vdXRwdXRbcl07aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLm9wVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgib3BUeXBlIikmJihuLm9wVHlwZT1lLm9wVHlwZSksZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aClmb3Iobi5hdHRyaWJ1dGU9W10scj0wO3I8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrciluLmF0dHJpYnV0ZVtyXT1jLm9ubnguQXR0cmlidXRlUHJvdG8udG9PYmplY3QoZS5hdHRyaWJ1dGVbcl0sdCk7cmV0dXJuIG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5Ob2RlUHJvdG8ifSxlfSgpLGkuVHJhaW5pbmdJbmZvUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdLHRoaXMudXBkYXRlQmluZGluZz1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5pbml0aWFsaXphdGlvbj1udWxsLGUucHJvdG90eXBlLmFsZ29yaXRobT1udWxsLGUucHJvdG90eXBlLmluaXRpYWxpemF0aW9uQmluZGluZz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudXBkYXRlQmluZGluZz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuaW5pdGlhbGl6YXRpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImluaXRpYWxpemF0aW9uIikmJmMub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmluaXRpYWxpemF0aW9uLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuYWxnb3JpdGhtJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJhbGdvcml0aG0iKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuYWxnb3JpdGhtLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuaW5pdGlhbGl6YXRpb25CaW5kaW5nJiZlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLmluaXRpYWxpemF0aW9uQmluZGluZ1tuXSx0LnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLnVwZGF0ZUJpbmRpbmcmJmUudXBkYXRlQmluZGluZy5sZW5ndGgpZm9yKG49MDtuPGUudXBkYXRlQmluZGluZy5sZW5ndGg7KytuKWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLnVwZGF0ZUJpbmRpbmdbbl0sdC51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UcmFpbmluZ0luZm9Qcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmluaXRpYWxpemF0aW9uPWMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjpyLmFsZ29yaXRobT1jLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDM6ci5pbml0aWFsaXphdGlvbkJpbmRpbmcmJnIuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aHx8KHIuaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdKSxyLmluaXRpYWxpemF0aW9uQmluZGluZy5wdXNoKGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDQ6ci51cGRhdGVCaW5kaW5nJiZyLnVwZGF0ZUJpbmRpbmcubGVuZ3RofHwoci51cGRhdGVCaW5kaW5nPVtdKSxyLnVwZGF0ZUJpbmRpbmcucHVzaChjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5pbml0aWFsaXphdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6YXRpb24iKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6YXRpb24pKSlyZXR1cm4gImluaXRpYWxpemF0aW9uLiIrbjtpZihudWxsIT1lLmFsZ29yaXRobSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWxnb3JpdGhtIikmJihuPWMub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmFsZ29yaXRobSkpKXJldHVybiAiYWxnb3JpdGhtLiIrbjtpZihudWxsIT1lLmluaXRpYWxpemF0aW9uQmluZGluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6YXRpb25CaW5kaW5nIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKSlyZXR1cm4gImluaXRpYWxpemF0aW9uQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RoOysrdClpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLmluaXRpYWxpemF0aW9uQmluZGluZ1t0XSkpcmV0dXJuICJpbml0aWFsaXphdGlvbkJpbmRpbmcuIitufWlmKG51bGwhPWUudXBkYXRlQmluZGluZyYmZS5oYXNPd25Qcm9wZXJ0eSgidXBkYXRlQmluZGluZyIpKXtpZighQXJyYXkuaXNBcnJheShlLnVwZGF0ZUJpbmRpbmcpKXJldHVybiAidXBkYXRlQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS51cGRhdGVCaW5kaW5nW3RdKSlyZXR1cm4gInVwZGF0ZUJpbmRpbmcuIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UcmFpbmluZ0luZm9Qcm90bztpZihudWxsIT1lLmluaXRpYWxpemF0aW9uKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5pdGlhbGl6YXRpb24pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbjogb2JqZWN0IGV4cGVjdGVkIik7dC5pbml0aWFsaXphdGlvbj1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6YXRpb24pO31pZihudWxsIT1lLmFsZ29yaXRobSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmFsZ29yaXRobSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmFsZ29yaXRobTogb2JqZWN0IGV4cGVjdGVkIik7dC5hbGdvcml0aG09Yy5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmFsZ29yaXRobSk7fWlmKGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemF0aW9uQmluZGluZykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbkJpbmRpbmc6IGFycmF5IGV4cGVjdGVkIik7dC5pbml0aWFsaXphdGlvbkJpbmRpbmc9W107Zm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uaW5pdGlhbGl6YXRpb25CaW5kaW5nOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemF0aW9uQmluZGluZ1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dKTt9fWlmKGUudXBkYXRlQmluZGluZyl7aWYoIUFycmF5LmlzQXJyYXkoZS51cGRhdGVCaW5kaW5nKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLnVwZGF0ZUJpbmRpbmc6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudXBkYXRlQmluZGluZz1bXSxuPTA7bjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnVwZGF0ZUJpbmRpbmdbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by51cGRhdGVCaW5kaW5nOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnVwZGF0ZUJpbmRpbmdbbl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZnJvbU9iamVjdChlLnVwZGF0ZUJpbmRpbmdbbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdLG4udXBkYXRlQmluZGluZz1bXSksdC5kZWZhdWx0cyYmKG4uaW5pdGlhbGl6YXRpb249bnVsbCxuLmFsZ29yaXRobT1udWxsKSxudWxsIT1lLmluaXRpYWxpemF0aW9uJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXphdGlvbiIpJiYobi5pbml0aWFsaXphdGlvbj1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmluaXRpYWxpemF0aW9uLHQpKSxudWxsIT1lLmFsZ29yaXRobSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWxnb3JpdGhtIikmJihuLmFsZ29yaXRobT1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmFsZ29yaXRobSx0KSksZS5pbml0aWFsaXphdGlvbkJpbmRpbmcmJmUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aCl7bi5pbml0aWFsaXphdGlvbkJpbmRpbmc9W107Zm9yKHZhciByPTA7cjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytyKW4uaW5pdGlhbGl6YXRpb25CaW5kaW5nW3JdPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW3JdLHQpO31pZihlLnVwZGF0ZUJpbmRpbmcmJmUudXBkYXRlQmluZGluZy5sZW5ndGgpZm9yKG4udXBkYXRlQmluZGluZz1bXSxyPTA7cjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrciluLnVwZGF0ZUJpbmRpbmdbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS51cGRhdGVCaW5kaW5nW3JdLHQpO3JldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRyYWluaW5nSW5mb1Byb3RvIn0sZX0oKSxpLk1vZGVsUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMub3BzZXRJbXBvcnQ9W10sdGhpcy5tZXRhZGF0YVByb3BzPVtdLHRoaXMudHJhaW5pbmdJbmZvPVtdLHRoaXMuZnVuY3Rpb25zPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmlyVmVyc2lvbj1sLkxvbmc/bC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLnByb3RvdHlwZS5vcHNldEltcG9ydD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUucHJvZHVjZXJOYW1lPSIiLGUucHJvdG90eXBlLnByb2R1Y2VyVmVyc2lvbj0iIixlLnByb3RvdHlwZS5kb21haW49IiIsZS5wcm90b3R5cGUubW9kZWxWZXJzaW9uPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5ncmFwaD1udWxsLGUucHJvdG90eXBlLm1ldGFkYXRhUHJvcHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnRyYWluaW5nSW5mbz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZnVuY3Rpb25zPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5pclZlcnNpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImlyVmVyc2lvbiIpJiZ0LnVpbnQzMig4KS5pbnQ2NChlLmlyVmVyc2lvbiksbnVsbCE9ZS5wcm9kdWNlck5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInByb2R1Y2VyTmFtZSIpJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUucHJvZHVjZXJOYW1lKSxudWxsIT1lLnByb2R1Y2VyVmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicHJvZHVjZXJWZXJzaW9uIikmJnQudWludDMyKDI2KS5zdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pLG51bGwhPWUuZG9tYWluJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb21haW4iKSYmdC51aW50MzIoMzQpLnN0cmluZyhlLmRvbWFpbiksbnVsbCE9ZS5tb2RlbFZlcnNpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm1vZGVsVmVyc2lvbiIpJiZ0LnVpbnQzMig0MCkuaW50NjQoZS5tb2RlbFZlcnNpb24pLG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoNTApLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5ncmFwaCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZ3JhcGgiKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZ3JhcGgsdC51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK24pYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5lbmNvZGUoZS5vcHNldEltcG9ydFtuXSx0LnVpbnQzMig2NikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLm1ldGFkYXRhUHJvcHMmJmUubWV0YWRhdGFQcm9wcy5sZW5ndGgpZm9yKG49MDtuPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytuKWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLm1ldGFkYXRhUHJvcHNbbl0sdC51aW50MzIoMTE0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUudHJhaW5pbmdJbmZvJiZlLnRyYWluaW5nSW5mby5sZW5ndGgpZm9yKG49MDtuPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK24pYy5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmVuY29kZShlLnRyYWluaW5nSW5mb1tuXSx0LnVpbnQzMigxNjIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5mdW5jdGlvbnMmJmUuZnVuY3Rpb25zLmxlbmd0aClmb3Iobj0wO248ZS5mdW5jdGlvbnMubGVuZ3RoOysrbiljLm9ubnguRnVuY3Rpb25Qcm90by5lbmNvZGUoZS5mdW5jdGlvbnNbbl0sdC51aW50MzIoMjAyKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguTW9kZWxQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmlyVmVyc2lvbj1lLmludDY0KCk7YnJlYWs7Y2FzZSA4OnIub3BzZXRJbXBvcnQmJnIub3BzZXRJbXBvcnQubGVuZ3RofHwoci5vcHNldEltcG9ydD1bXSksci5vcHNldEltcG9ydC5wdXNoKGMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjpyLnByb2R1Y2VyTmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLnByb2R1Y2VyVmVyc2lvbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDpyLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNTpyLm1vZGVsVmVyc2lvbj1lLmludDY0KCk7YnJlYWs7Y2FzZSA2OnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA3OnIuZ3JhcGg9Yy5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAxNDpyLm1ldGFkYXRhUHJvcHMmJnIubWV0YWRhdGFQcm9wcy5sZW5ndGh8fChyLm1ldGFkYXRhUHJvcHM9W10pLHIubWV0YWRhdGFQcm9wcy5wdXNoKGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDIwOnIudHJhaW5pbmdJbmZvJiZyLnRyYWluaW5nSW5mby5sZW5ndGh8fChyLnRyYWluaW5nSW5mbz1bXSksci50cmFpbmluZ0luZm8ucHVzaChjLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjU6ci5mdW5jdGlvbnMmJnIuZnVuY3Rpb25zLmxlbmd0aHx8KHIuZnVuY3Rpb25zPVtdKSxyLmZ1bmN0aW9ucy5wdXNoKGMub25ueC5GdW5jdGlvblByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmlyVmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJiEobC5pc0ludGVnZXIoZS5pclZlcnNpb24pfHxlLmlyVmVyc2lvbiYmbC5pc0ludGVnZXIoZS5pclZlcnNpb24ubG93KSYmbC5pc0ludGVnZXIoZS5pclZlcnNpb24uaGlnaCkpKXJldHVybiAiaXJWZXJzaW9uOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUub3BzZXRJbXBvcnQmJmUuaGFzT3duUHJvcGVydHkoIm9wc2V0SW1wb3J0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXJldHVybiAib3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUub3BzZXRJbXBvcnQubGVuZ3RoOysrdClpZihuPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8udmVyaWZ5KGUub3BzZXRJbXBvcnRbdF0pKXJldHVybiAib3BzZXRJbXBvcnQuIitufWlmKG51bGwhPWUucHJvZHVjZXJOYW1lJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlck5hbWUiKSYmIWwuaXNTdHJpbmcoZS5wcm9kdWNlck5hbWUpKXJldHVybiAicHJvZHVjZXJOYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucHJvZHVjZXJWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlclZlcnNpb24iKSYmIWwuaXNTdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKXJldHVybiAicHJvZHVjZXJWZXJzaW9uOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pKXJldHVybiAiZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUubW9kZWxWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJtb2RlbFZlcnNpb24iKSYmIShsLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbil8fGUubW9kZWxWZXJzaW9uJiZsLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbi5sb3cpJiZsLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbi5oaWdoKSkpcmV0dXJuICJtb2RlbFZlcnNpb246IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5ncmFwaCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGgiKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZ3JhcGgpKSlyZXR1cm4gImdyYXBoLiIrbjtpZihudWxsIT1lLm1ldGFkYXRhUHJvcHMmJmUuaGFzT3duUHJvcGVydHkoIm1ldGFkYXRhUHJvcHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSlyZXR1cm4gIm1ldGFkYXRhUHJvcHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5tZXRhZGF0YVByb3BzW3RdKSlyZXR1cm4gIm1ldGFkYXRhUHJvcHMuIitufWlmKG51bGwhPWUudHJhaW5pbmdJbmZvJiZlLmhhc093blByb3BlcnR5KCJ0cmFpbmluZ0luZm8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS50cmFpbmluZ0luZm8pKXJldHVybiAidHJhaW5pbmdJbmZvOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udmVyaWZ5KGUudHJhaW5pbmdJbmZvW3RdKSlyZXR1cm4gInRyYWluaW5nSW5mby4iK259aWYobnVsbCE9ZS5mdW5jdGlvbnMmJmUuaGFzT3duUHJvcGVydHkoImZ1bmN0aW9ucyIpKXtpZighQXJyYXkuaXNBcnJheShlLmZ1bmN0aW9ucykpcmV0dXJuICJmdW5jdGlvbnM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5mdW5jdGlvbnMubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguRnVuY3Rpb25Qcm90by52ZXJpZnkoZS5mdW5jdGlvbnNbdF0pKXJldHVybiAiZnVuY3Rpb25zLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54Lk1vZGVsUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5Nb2RlbFByb3RvO2lmKG51bGwhPWUuaXJWZXJzaW9uJiYobC5Mb25nPyh0LmlyVmVyc2lvbj1sLkxvbmcuZnJvbVZhbHVlKGUuaXJWZXJzaW9uKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmlyVmVyc2lvbj90LmlyVmVyc2lvbj1wYXJzZUludChlLmlyVmVyc2lvbiwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmlyVmVyc2lvbj90LmlyVmVyc2lvbj1lLmlyVmVyc2lvbjoib2JqZWN0Ij09dHlwZW9mIGUuaXJWZXJzaW9uJiYodC5pclZlcnNpb249bmV3IGwuTG9uZ0JpdHMoZS5pclZlcnNpb24ubG93Pj4+MCxlLmlyVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLGUub3BzZXRJbXBvcnQpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5vcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiKTt0Lm9wc2V0SW1wb3J0PVtdO2Zvcih2YXIgbj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUub3BzZXRJbXBvcnRbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm9wc2V0SW1wb3J0OiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm9wc2V0SW1wb3J0W25dPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZnJvbU9iamVjdChlLm9wc2V0SW1wb3J0W25dKTt9fWlmKG51bGwhPWUucHJvZHVjZXJOYW1lJiYodC5wcm9kdWNlck5hbWU9U3RyaW5nKGUucHJvZHVjZXJOYW1lKSksbnVsbCE9ZS5wcm9kdWNlclZlcnNpb24mJih0LnByb2R1Y2VyVmVyc2lvbj1TdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKSxudWxsIT1lLmRvbWFpbiYmKHQuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLG51bGwhPWUubW9kZWxWZXJzaW9uJiYobC5Mb25nPyh0Lm1vZGVsVmVyc2lvbj1sLkxvbmcuZnJvbVZhbHVlKGUubW9kZWxWZXJzaW9uKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLm1vZGVsVmVyc2lvbj90Lm1vZGVsVmVyc2lvbj1wYXJzZUludChlLm1vZGVsVmVyc2lvbiwxMCk6Im51bWJlciI9PXR5cGVvZiBlLm1vZGVsVmVyc2lvbj90Lm1vZGVsVmVyc2lvbj1lLm1vZGVsVmVyc2lvbjoib2JqZWN0Ij09dHlwZW9mIGUubW9kZWxWZXJzaW9uJiYodC5tb2RlbFZlcnNpb249bmV3IGwuTG9uZ0JpdHMoZS5tb2RlbFZlcnNpb24ubG93Pj4+MCxlLm1vZGVsVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLG51bGwhPWUuZG9jU3RyaW5nJiYodC5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksbnVsbCE9ZS5ncmFwaCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmdyYXBoKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5ncmFwaDogb2JqZWN0IGV4cGVjdGVkIik7dC5ncmFwaD1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZ3JhcGgpO31pZihlLm1ldGFkYXRhUHJvcHMpe2lmKCFBcnJheS5pc0FycmF5KGUubWV0YWRhdGFQcm9wcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm1ldGFkYXRhUHJvcHM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQubWV0YWRhdGFQcm9wcz1bXSxuPTA7bjxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm1ldGFkYXRhUHJvcHNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm1ldGFkYXRhUHJvcHM6IG9iamVjdCBleHBlY3RlZCIpO3QubWV0YWRhdGFQcm9wc1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUubWV0YWRhdGFQcm9wc1tuXSk7fX1pZihlLnRyYWluaW5nSW5mbyl7aWYoIUFycmF5LmlzQXJyYXkoZS50cmFpbmluZ0luZm8pKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by50cmFpbmluZ0luZm86IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudHJhaW5pbmdJbmZvPVtdLG49MDtuPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS50cmFpbmluZ0luZm9bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLnRyYWluaW5nSW5mbzogb2JqZWN0IGV4cGVjdGVkIik7dC50cmFpbmluZ0luZm9bbl09Yy5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmZyb21PYmplY3QoZS50cmFpbmluZ0luZm9bbl0pO319aWYoZS5mdW5jdGlvbnMpe2lmKCFBcnJheS5pc0FycmF5KGUuZnVuY3Rpb25zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8uZnVuY3Rpb25zOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmZ1bmN0aW9ucz1bXSxuPTA7bjxlLmZ1bmN0aW9ucy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZnVuY3Rpb25zW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5mdW5jdGlvbnM6IG9iamVjdCBleHBlY3RlZCIpO3QuZnVuY3Rpb25zW25dPWMub25ueC5GdW5jdGlvblByb3RvLmZyb21PYmplY3QoZS5mdW5jdGlvbnNbbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4ub3BzZXRJbXBvcnQ9W10sbi5tZXRhZGF0YVByb3BzPVtdLG4udHJhaW5pbmdJbmZvPVtdLG4uZnVuY3Rpb25zPVtdKSx0LmRlZmF1bHRzKXtpZihsLkxvbmcpe3ZhciByPW5ldyBsLkxvbmcoMCwwLCExKTtuLmlyVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4uaXJWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7bi5wcm9kdWNlck5hbWU9IiIsbi5wcm9kdWNlclZlcnNpb249IiIsbi5kb21haW49IiIsbC5Mb25nPyhyPW5ldyBsLkxvbmcoMCwwLCExKSxuLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyKTpuLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nPyIwIjowLG4uZG9jU3RyaW5nPSIiLG4uZ3JhcGg9bnVsbDt9aWYobnVsbCE9ZS5pclZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoImlyVmVyc2lvbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmlyVmVyc2lvbj9uLmlyVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmlyVmVyc2lvbik6ZS5pclZlcnNpb246bi5pclZlcnNpb249dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pclZlcnNpb24pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pclZlcnNpb24ubG93Pj4+MCxlLmlyVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmlyVmVyc2lvbiksbnVsbCE9ZS5wcm9kdWNlck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyTmFtZSIpJiYobi5wcm9kdWNlck5hbWU9ZS5wcm9kdWNlck5hbWUpLG51bGwhPWUucHJvZHVjZXJWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlclZlcnNpb24iKSYmKG4ucHJvZHVjZXJWZXJzaW9uPWUucHJvZHVjZXJWZXJzaW9uKSxudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksbnVsbCE9ZS5tb2RlbFZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoIm1vZGVsVmVyc2lvbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLm1vZGVsVmVyc2lvbj9uLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLm1vZGVsVmVyc2lvbik6ZS5tb2RlbFZlcnNpb246bi5tb2RlbFZlcnNpb249dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5tb2RlbFZlcnNpb24pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5tb2RlbFZlcnNpb24ubG93Pj4+MCxlLm1vZGVsVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKTplLm1vZGVsVmVyc2lvbiksbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG51bGwhPWUuZ3JhcGgmJmUuaGFzT3duUHJvcGVydHkoImdyYXBoIikmJihuLmdyYXBoPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuZ3JhcGgsdCkpLGUub3BzZXRJbXBvcnQmJmUub3BzZXRJbXBvcnQubGVuZ3RoKXtuLm9wc2V0SW1wb3J0PVtdO2Zvcih2YXIgbz0wO288ZS5vcHNldEltcG9ydC5sZW5ndGg7KytvKW4ub3BzZXRJbXBvcnRbb109Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by50b09iamVjdChlLm9wc2V0SW1wb3J0W29dLHQpO31pZihlLm1ldGFkYXRhUHJvcHMmJmUubWV0YWRhdGFQcm9wcy5sZW5ndGgpZm9yKG4ubWV0YWRhdGFQcm9wcz1bXSxvPTA7bzxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrbyluLm1ldGFkYXRhUHJvcHNbb109Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5tZXRhZGF0YVByb3BzW29dLHQpO2lmKGUudHJhaW5pbmdJbmZvJiZlLnRyYWluaW5nSW5mby5sZW5ndGgpZm9yKG4udHJhaW5pbmdJbmZvPVtdLG89MDtvPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK28pbi50cmFpbmluZ0luZm9bb109Yy5vbm54LlRyYWluaW5nSW5mb1Byb3RvLnRvT2JqZWN0KGUudHJhaW5pbmdJbmZvW29dLHQpO2lmKGUuZnVuY3Rpb25zJiZlLmZ1bmN0aW9ucy5sZW5ndGgpZm9yKG4uZnVuY3Rpb25zPVtdLG89MDtvPGUuZnVuY3Rpb25zLmxlbmd0aDsrK28pbi5mdW5jdGlvbnNbb109Yy5vbm54LkZ1bmN0aW9uUHJvdG8udG9PYmplY3QoZS5mdW5jdGlvbnNbb10sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguTW9kZWxQcm90byJ9LGV9KCksaS5TdHJpbmdTdHJpbmdFbnRyeVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5rZXk9IiIsZS5wcm90b3R5cGUudmFsdWU9IiIsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmtleSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwia2V5IikmJnQudWludDMyKDEwKS5zdHJpbmcoZS5rZXkpLG51bGwhPWUudmFsdWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZhbHVlIikmJnQudWludDMyKDE4KS5zdHJpbmcoZS52YWx1ZSksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5rZXk9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci52YWx1ZT1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiAib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lPyJvYmplY3QgZXhwZWN0ZWQiOm51bGwhPWUua2V5JiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmIWwuaXNTdHJpbmcoZS5rZXkpPyJrZXk6IHN0cmluZyBleHBlY3RlZCI6bnVsbCE9ZS52YWx1ZSYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSYmIWwuaXNTdHJpbmcoZS52YWx1ZSk/InZhbHVlOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvO3JldHVybiBudWxsIT1lLmtleSYmKHQua2V5PVN0cmluZyhlLmtleSkpLG51bGwhPWUudmFsdWUmJih0LnZhbHVlPVN0cmluZyhlLnZhbHVlKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4ua2V5PSIiLG4udmFsdWU9IiIpLG51bGwhPWUua2V5JiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmKG4ua2V5PWUua2V5KSxudWxsIT1lLnZhbHVlJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiYobi52YWx1ZT1lLnZhbHVlKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8ifSxlfSgpLGkuVGVuc29yQW5ub3RhdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLnRlbnNvck5hbWU9IiIsZS5wcm90b3R5cGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUudGVuc29yTmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidGVuc29yTmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUudGVuc29yTmFtZSksbnVsbCE9ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzJiZlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlRlbnNvckFubm90YXRpb247ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci50ZW5zb3JOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOnIucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aHx8KHIucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXSksci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUudGVuc29yTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yTmFtZSIpJiYhbC5pc1N0cmluZyhlLnRlbnNvck5hbWUpKXJldHVybiAidGVuc29yTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMmJmUuaGFzT3duUHJvcGVydHkoInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKSlyZXR1cm4gInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGg7Kyt0KXt2YXIgbj1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3RdKTtpZihuKXJldHVybiAicXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JBbm5vdGF0aW9uKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVGVuc29yQW5ub3RhdGlvbjtpZihudWxsIT1lLnRlbnNvck5hbWUmJih0LnRlbnNvck5hbWU9U3RyaW5nKGUudGVuc29yTmFtZSkpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvckFubm90YXRpb24ucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogYXJyYXkgZXhwZWN0ZWQiKTt0LnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W107Zm9yKHZhciBuPTA7bjxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JBbm5vdGF0aW9uLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM6IG9iamVjdCBleHBlY3RlZCIpO3QucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdKSx0LmRlZmF1bHRzJiYobi50ZW5zb3JOYW1lPSIiKSxudWxsIT1lLnRlbnNvck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvck5hbWUiKSYmKG4udGVuc29yTmFtZT1lLnRlbnNvck5hbWUpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aCl7bi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdO2Zvcih2YXIgcj0wO3I8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Ipbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3JdPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnRvT2JqZWN0KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tyXSx0KTt9cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yQW5ub3RhdGlvbiJ9LGV9KCksaS5HcmFwaFByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLm5vZGU9W10sdGhpcy5pbml0aWFsaXplcj1bXSx0aGlzLnNwYXJzZUluaXRpYWxpemVyPVtdLHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy52YWx1ZUluZm89W10sdGhpcy5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5vZGU9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUuaW5pdGlhbGl6ZXI9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnNwYXJzZUluaXRpYWxpemVyPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsZS5wcm90b3R5cGUuaW5wdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm91dHB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudmFsdWVJbmZvPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5ub2RlJiZlLm5vZGUubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5ub2RlLmxlbmd0aDsrK24pYy5vbm54Lk5vZGVQcm90by5lbmNvZGUoZS5ub2RlW25dLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5pbml0aWFsaXplciYmZS5pbml0aWFsaXplci5sZW5ndGgpZm9yKG49MDtuPGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrbiljLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUuaW5pdGlhbGl6ZXJbbl0sdC51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig4Mikuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3Iobj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKWMub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS5pbnB1dFtuXSx0LnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKWMub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS5vdXRwdXRbbl0sdC51aW50MzIoOTgpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS52YWx1ZUluZm8mJmUudmFsdWVJbmZvLmxlbmd0aClmb3Iobj0wO248ZS52YWx1ZUluZm8ubGVuZ3RoOysrbiljLm9ubnguVmFsdWVJbmZvUHJvdG8uZW5jb2RlKGUudmFsdWVJbmZvW25dLHQudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLnF1YW50aXphdGlvbkFubm90YXRpb24mJmUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGgpZm9yKG49MDtuPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytuKWMub25ueC5UZW5zb3JBbm5vdGF0aW9uLmVuY29kZShlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0sdC51aW50MzIoMTE0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUuc3BhcnNlSW5pdGlhbGl6ZXImJmUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihuPTA7bjxlLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aDsrK24pYy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmVuY29kZShlLnNwYXJzZUluaXRpYWxpemVyW25dLHQudWludDMyKDEyMikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LkdyYXBoUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5ub2RlJiZyLm5vZGUubGVuZ3RofHwoci5ub2RlPVtdKSxyLm5vZGUucHVzaChjLm9ubnguTm9kZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDI6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIuaW5pdGlhbGl6ZXImJnIuaW5pdGlhbGl6ZXIubGVuZ3RofHwoci5pbml0aWFsaXplcj1bXSksci5pbml0aWFsaXplci5wdXNoKGMub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxNTpyLnNwYXJzZUluaXRpYWxpemVyJiZyLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aHx8KHIuc3BhcnNlSW5pdGlhbGl6ZXI9W10pLHIuc3BhcnNlSW5pdGlhbGl6ZXIucHVzaChjLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTA6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDExOnIuaW5wdXQmJnIuaW5wdXQubGVuZ3RofHwoci5pbnB1dD1bXSksci5pbnB1dC5wdXNoKGMub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMjpyLm91dHB1dCYmci5vdXRwdXQubGVuZ3RofHwoci5vdXRwdXQ9W10pLHIub3V0cHV0LnB1c2goYy5vbm54LlZhbHVlSW5mb1Byb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEzOnIudmFsdWVJbmZvJiZyLnZhbHVlSW5mby5sZW5ndGh8fChyLnZhbHVlSW5mbz1bXSksci52YWx1ZUluZm8ucHVzaChjLm9ubnguVmFsdWVJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTQ6ci5xdWFudGl6YXRpb25Bbm5vdGF0aW9uJiZyLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RofHwoci5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdKSxyLnF1YW50aXphdGlvbkFubm90YXRpb24ucHVzaChjLm9ubnguVGVuc29yQW5ub3RhdGlvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5ub2RlJiZlLmhhc093blByb3BlcnR5KCJub2RlIikpe2lmKCFBcnJheS5pc0FycmF5KGUubm9kZSkpcmV0dXJuICJub2RlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLm5vZGUubGVuZ3RoOysrdClpZihuPWMub25ueC5Ob2RlUHJvdG8udmVyaWZ5KGUubm9kZVt0XSkpcmV0dXJuICJub2RlLiIrbn1pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5pbml0aWFsaXplciYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6ZXIiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbml0aWFsaXplcikpcmV0dXJuICJpbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmluaXRpYWxpemVyLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6ZXJbdF0pKXJldHVybiAiaW5pdGlhbGl6ZXIuIitufWlmKG51bGwhPWUuc3BhcnNlSW5pdGlhbGl6ZXImJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZUluaXRpYWxpemVyIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3BhcnNlSW5pdGlhbGl6ZXIpKXJldHVybiAic3BhcnNlSW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZUluaXRpYWxpemVyW3RdKSlyZXR1cm4gInNwYXJzZUluaXRpYWxpemVyLiIrbn1pZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmlucHV0JiZlLmhhc093blByb3BlcnR5KCJpbnB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSlyZXR1cm4gImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW5wdXQubGVuZ3RoOysrdClpZihuPWMub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS5pbnB1dFt0XSkpcmV0dXJuICJpbnB1dC4iK259aWYobnVsbCE9ZS5vdXRwdXQmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuICJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5vdXRwdXQubGVuZ3RoOysrdClpZihuPWMub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS5vdXRwdXRbdF0pKXJldHVybiAib3V0cHV0LiIrbn1pZihudWxsIT1lLnZhbHVlSW5mbyYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWVJbmZvIikpe2lmKCFBcnJheS5pc0FycmF5KGUudmFsdWVJbmZvKSlyZXR1cm4gInZhbHVlSW5mbzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnZhbHVlSW5mby5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLnZhbHVlSW5mb1t0XSkpcmV0dXJuICJ2YWx1ZUluZm8uIitufWlmKG51bGwhPWUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgicXVhbnRpemF0aW9uQW5ub3RhdGlvbiIpKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50aXphdGlvbkFubm90YXRpb24pKXJldHVybiAicXVhbnRpemF0aW9uQW5ub3RhdGlvbjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguVGVuc29yQW5ub3RhdGlvbi52ZXJpZnkoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3RdKSlyZXR1cm4gInF1YW50aXphdGlvbkFubm90YXRpb24uIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguR3JhcGhQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LkdyYXBoUHJvdG87aWYoZS5ub2RlKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5ub2RlOiBhcnJheSBleHBlY3RlZCIpO3Qubm9kZT1bXTtmb3IodmFyIG49MDtuPGUubm9kZS5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubm9kZVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ubm9kZTogb2JqZWN0IGV4cGVjdGVkIik7dC5ub2RlW25dPWMub25ueC5Ob2RlUHJvdG8uZnJvbU9iamVjdChlLm5vZGVbbl0pO319aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLmluaXRpYWxpemVyKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemVyKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW5pdGlhbGl6ZXI9W10sbj0wO248ZS5pbml0aWFsaXplci5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5pdGlhbGl6ZXJbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmluaXRpYWxpemVyOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemVyW25dPWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6ZXJbbl0pO319aWYoZS5zcGFyc2VJbml0aWFsaXplcil7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VJbml0aWFsaXplcikpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnNwYXJzZUluaXRpYWxpemVyOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnNwYXJzZUluaXRpYWxpemVyPVtdLG49MDtuPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZUluaXRpYWxpemVyW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5zcGFyc2VJbml0aWFsaXplcjogb2JqZWN0IGV4cGVjdGVkIik7dC5zcGFyc2VJbml0aWFsaXplcltuXT1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnNwYXJzZUluaXRpYWxpemVyW25dKTt9fWlmKG51bGwhPWUuZG9jU3RyaW5nJiYodC5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmlucHV0OiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmlucHV0PVtdLG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmlucHV0W25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbnB1dDogb2JqZWN0IGV4cGVjdGVkIik7dC5pbnB1dFtuXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLmlucHV0W25dKTt9fWlmKGUub3V0cHV0KXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vdXRwdXQ9W10sbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm91dHB1dFtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm91dHB1dFtuXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLm91dHB1dFtuXSk7fX1pZihlLnZhbHVlSW5mbyl7aWYoIUFycmF5LmlzQXJyYXkoZS52YWx1ZUluZm8pKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by52YWx1ZUluZm86IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudmFsdWVJbmZvPVtdLG49MDtuPGUudmFsdWVJbmZvLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS52YWx1ZUluZm9bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogb2JqZWN0IGV4cGVjdGVkIik7dC52YWx1ZUluZm9bbl09Yy5vbm54LlZhbHVlSW5mb1Byb3RvLmZyb21PYmplY3QoZS52YWx1ZUluZm9bbl0pO319aWYoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50aXphdGlvbkFubm90YXRpb24pKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5xdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnF1YW50aXphdGlvbkFubm90YXRpb249W10sbj0wO248ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5xdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnF1YW50aXphdGlvbkFubm90YXRpb25bbl09Yy5vbm54LlRlbnNvckFubm90YXRpb24uZnJvbU9iamVjdChlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4ubm9kZT1bXSxuLmluaXRpYWxpemVyPVtdLG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi52YWx1ZUluZm89W10sbi5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLG4uc3BhcnNlSW5pdGlhbGl6ZXI9W10pLHQuZGVmYXVsdHMmJihuLm5hbWU9IiIsbi5kb2NTdHJpbmc9IiIpLGUubm9kZSYmZS5ub2RlLmxlbmd0aCl7bi5ub2RlPVtdO2Zvcih2YXIgcj0wO3I8ZS5ub2RlLmxlbmd0aDsrK3Ipbi5ub2RlW3JdPWMub25ueC5Ob2RlUHJvdG8udG9PYmplY3QoZS5ub2RlW3JdLHQpO31pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUuaW5pdGlhbGl6ZXImJmUuaW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihuLmluaXRpYWxpemVyPVtdLHI9MDtyPGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrciluLmluaXRpYWxpemVyW3JdPWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLmluaXRpYWxpemVyW3JdLHQpO2lmKG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3Iobi5pbnB1dD1bXSxyPTA7cjxlLmlucHV0Lmxlbmd0aDsrK3Ipbi5pbnB1dFtyXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8udG9PYmplY3QoZS5pbnB1dFtyXSx0KTtpZihlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuLm91dHB1dD1bXSxyPTA7cjxlLm91dHB1dC5sZW5ndGg7KytyKW4ub3V0cHV0W3JdPWMub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLm91dHB1dFtyXSx0KTtpZihlLnZhbHVlSW5mbyYmZS52YWx1ZUluZm8ubGVuZ3RoKWZvcihuLnZhbHVlSW5mbz1bXSxyPTA7cjxlLnZhbHVlSW5mby5sZW5ndGg7KytyKW4udmFsdWVJbmZvW3JdPWMub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLnZhbHVlSW5mb1tyXSx0KTtpZihlLnF1YW50aXphdGlvbkFubm90YXRpb24mJmUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGgpZm9yKG4ucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXSxyPTA7cjxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrciluLnF1YW50aXphdGlvbkFubm90YXRpb25bcl09Yy5vbm54LlRlbnNvckFubm90YXRpb24udG9PYmplY3QoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uW3JdLHQpO2lmKGUuc3BhcnNlSW5pdGlhbGl6ZXImJmUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoKWZvcihuLnNwYXJzZUluaXRpYWxpemVyPVtdLHI9MDtyPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrciluLnNwYXJzZUluaXRpYWxpemVyW3JdPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZUluaXRpYWxpemVyW3JdLHQpO3JldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LkdyYXBoUHJvdG8ifSxlfSgpLGkuVGVuc29yUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZGltcz1bXSx0aGlzLmZsb2F0RGF0YT1bXSx0aGlzLmludDMyRGF0YT1bXSx0aGlzLnN0cmluZ0RhdGE9W10sdGhpcy5pbnQ2NERhdGE9W10sdGhpcy5leHRlcm5hbERhdGE9W10sdGhpcy5kb3VibGVEYXRhPVtdLHRoaXMudWludDY0RGF0YT1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5kaW1zPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5kYXRhVHlwZT0wLGUucHJvdG90eXBlLnNlZ21lbnQ9bnVsbCxlLnByb3RvdHlwZS5mbG9hdERhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmludDMyRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3RyaW5nRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuaW50NjREYXRhPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5uYW1lPSIiLGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5yYXdEYXRhPWwubmV3QnVmZmVyKFtdKSxlLnByb3RvdHlwZS5leHRlcm5hbERhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRhdGFMb2NhdGlvbj0wLGUucHJvdG90eXBlLmRvdWJsZURhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnVpbnQ2NERhdGE9bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRpbXMmJmUuZGltcy5sZW5ndGgpe3QudWludDMyKDEwKS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbil0LmludDY0KGUuZGltc1tuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS5kYXRhVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGF0YVR5cGUiKSYmdC51aW50MzIoMTYpLmludDMyKGUuZGF0YVR5cGUpLG51bGwhPWUuc2VnbWVudCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2VnbWVudCIpJiZjLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5lbmNvZGUoZS5zZWdtZW50LHQudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZmxvYXREYXRhJiZlLmZsb2F0RGF0YS5sZW5ndGgpe2Zvcih0LnVpbnQzMigzNCkuZm9yaygpLG49MDtuPGUuZmxvYXREYXRhLmxlbmd0aDsrK24pdC5mbG9hdChlLmZsb2F0RGF0YVtuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS5pbnQzMkRhdGEmJmUuaW50MzJEYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDQyKS5mb3JrKCksbj0wO248ZS5pbnQzMkRhdGEubGVuZ3RoOysrbil0LmludDMyKGUuaW50MzJEYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLnN0cmluZ0RhdGEmJmUuc3RyaW5nRGF0YS5sZW5ndGgpZm9yKG49MDtuPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytuKXQudWludDMyKDUwKS5ieXRlcyhlLnN0cmluZ0RhdGFbbl0pO2lmKG51bGwhPWUuaW50NjREYXRhJiZlLmludDY0RGF0YS5sZW5ndGgpe2Zvcih0LnVpbnQzMig1OCkuZm9yaygpLG49MDtuPGUuaW50NjREYXRhLmxlbmd0aDsrK24pdC5pbnQ2NChlLmludDY0RGF0YVtuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDY2KS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLnJhd0RhdGEmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInJhd0RhdGEiKSYmdC51aW50MzIoNzQpLmJ5dGVzKGUucmF3RGF0YSksbnVsbCE9ZS5kb3VibGVEYXRhJiZlLmRvdWJsZURhdGEubGVuZ3RoKXtmb3IodC51aW50MzIoODIpLmZvcmsoKSxuPTA7bjxlLmRvdWJsZURhdGEubGVuZ3RoOysrbil0LmRvdWJsZShlLmRvdWJsZURhdGFbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUudWludDY0RGF0YSYmZS51aW50NjREYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDkwKS5mb3JrKCksbj0wO248ZS51aW50NjREYXRhLmxlbmd0aDsrK24pdC51aW50NjQoZS51aW50NjREYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDk4KS5zdHJpbmcoZS5kb2NTdHJpbmcpLG51bGwhPWUuZXh0ZXJuYWxEYXRhJiZlLmV4dGVybmFsRGF0YS5sZW5ndGgpZm9yKG49MDtuPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUuZXh0ZXJuYWxEYXRhW25dLHQudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gbnVsbCE9ZS5kYXRhTG9jYXRpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRhdGFMb2NhdGlvbiIpJiZ0LnVpbnQzMigxMTIpLmludDMyKGUuZGF0YUxvY2F0aW9uKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6aWYoci5kaW1zJiZyLmRpbXMubGVuZ3RofHwoci5kaW1zPVtdKSwyPT0oNyZvKSlmb3IodmFyIGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmRpbXMucHVzaChlLmludDY0KCkpO2Vsc2Ugci5kaW1zLnB1c2goZS5pbnQ2NCgpKTticmVhaztjYXNlIDI6ci5kYXRhVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAzOnIuc2VnbWVudD1jLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDQ6aWYoci5mbG9hdERhdGEmJnIuZmxvYXREYXRhLmxlbmd0aHx8KHIuZmxvYXREYXRhPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZmxvYXREYXRhLnB1c2goZS5mbG9hdCgpKTtlbHNlIHIuZmxvYXREYXRhLnB1c2goZS5mbG9hdCgpKTticmVhaztjYXNlIDU6aWYoci5pbnQzMkRhdGEmJnIuaW50MzJEYXRhLmxlbmd0aHx8KHIuaW50MzJEYXRhPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuaW50MzJEYXRhLnB1c2goZS5pbnQzMigpKTtlbHNlIHIuaW50MzJEYXRhLnB1c2goZS5pbnQzMigpKTticmVhaztjYXNlIDY6ci5zdHJpbmdEYXRhJiZyLnN0cmluZ0RhdGEubGVuZ3RofHwoci5zdHJpbmdEYXRhPVtdKSxyLnN0cmluZ0RhdGEucHVzaChlLmJ5dGVzKCkpO2JyZWFrO2Nhc2UgNzppZihyLmludDY0RGF0YSYmci5pbnQ2NERhdGEubGVuZ3RofHwoci5pbnQ2NERhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5pbnQ2NERhdGEucHVzaChlLmludDY0KCkpO2Vsc2Ugci5pbnQ2NERhdGEucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgODpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDEyOnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA5OnIucmF3RGF0YT1lLmJ5dGVzKCk7YnJlYWs7Y2FzZSAxMzpyLmV4dGVybmFsRGF0YSYmci5leHRlcm5hbERhdGEubGVuZ3RofHwoci5leHRlcm5hbERhdGE9W10pLHIuZXh0ZXJuYWxEYXRhLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTQ6ci5kYXRhTG9jYXRpb249ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMTA6aWYoci5kb3VibGVEYXRhJiZyLmRvdWJsZURhdGEubGVuZ3RofHwoci5kb3VibGVEYXRhPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZG91YmxlRGF0YS5wdXNoKGUuZG91YmxlKCkpO2Vsc2Ugci5kb3VibGVEYXRhLnB1c2goZS5kb3VibGUoKSk7YnJlYWs7Y2FzZSAxMTppZihyLnVpbnQ2NERhdGEmJnIudWludDY0RGF0YS5sZW5ndGh8fChyLnVpbnQ2NERhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci51aW50NjREYXRhLnB1c2goZS51aW50NjQoKSk7ZWxzZSByLnVpbnQ2NERhdGEucHVzaChlLnVpbnQ2NCgpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmRpbXMmJmUuaGFzT3duUHJvcGVydHkoImRpbXMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW1zKSlyZXR1cm4gImRpbXM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuZGltcy5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS5kaW1zW3RdKXx8ZS5kaW1zW3RdJiZsLmlzSW50ZWdlcihlLmRpbXNbdF0ubG93KSYmbC5pc0ludGVnZXIoZS5kaW1zW3RdLmhpZ2gpKSlyZXR1cm4gImRpbXM6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLmRhdGFUeXBlJiZlLmhhc093blByb3BlcnR5KCJkYXRhVHlwZSIpJiYhbC5pc0ludGVnZXIoZS5kYXRhVHlwZSkpcmV0dXJuICJkYXRhVHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYobnVsbCE9ZS5zZWdtZW50JiZlLmhhc093blByb3BlcnR5KCJzZWdtZW50IikmJihuPWMub25ueC5UZW5zb3JQcm90by5TZWdtZW50LnZlcmlmeShlLnNlZ21lbnQpKSlyZXR1cm4gInNlZ21lbnQuIituO2lmKG51bGwhPWUuZmxvYXREYXRhJiZlLmhhc093blByb3BlcnR5KCJmbG9hdERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXJldHVybiAiZmxvYXREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuZmxvYXREYXRhLmxlbmd0aDsrK3QpaWYoIm51bWJlciIhPXR5cGVvZiBlLmZsb2F0RGF0YVt0XSlyZXR1cm4gImZsb2F0RGF0YTogbnVtYmVyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuaW50MzJEYXRhJiZlLmhhc093blByb3BlcnR5KCJpbnQzMkRhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnQzMkRhdGEpKXJldHVybiAiaW50MzJEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW50MzJEYXRhLmxlbmd0aDsrK3QpaWYoIWwuaXNJbnRlZ2VyKGUuaW50MzJEYXRhW3RdKSlyZXR1cm4gImludDMyRGF0YTogaW50ZWdlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLnN0cmluZ0RhdGEmJmUuaGFzT3duUHJvcGVydHkoInN0cmluZ0RhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdEYXRhKSlyZXR1cm4gInN0cmluZ0RhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK3QpaWYoIShlLnN0cmluZ0RhdGFbdF0mJiJudW1iZXIiPT10eXBlb2YgZS5zdHJpbmdEYXRhW3RdLmxlbmd0aHx8bC5pc1N0cmluZyhlLnN0cmluZ0RhdGFbdF0pKSlyZXR1cm4gInN0cmluZ0RhdGE6IGJ1ZmZlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLmludDY0RGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50NjREYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50NjREYXRhKSlyZXR1cm4gImludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmludDY0RGF0YS5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS5pbnQ2NERhdGFbdF0pfHxlLmludDY0RGF0YVt0XSYmbC5pc0ludGVnZXIoZS5pbnQ2NERhdGFbdF0ubG93KSYmbC5pc0ludGVnZXIoZS5pbnQ2NERhdGFbdF0uaGlnaCkpKXJldHVybiAiaW50NjREYXRhOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWwuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiAiZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucmF3RGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgicmF3RGF0YSIpJiYhKGUucmF3RGF0YSYmIm51bWJlciI9PXR5cGVvZiBlLnJhd0RhdGEubGVuZ3RofHxsLmlzU3RyaW5nKGUucmF3RGF0YSkpKXJldHVybiAicmF3RGF0YTogYnVmZmVyIGV4cGVjdGVkIjtpZihudWxsIT1lLmV4dGVybmFsRGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgiZXh0ZXJuYWxEYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZXh0ZXJuYWxEYXRhKSlyZXR1cm4gImV4dGVybmFsRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmV4dGVybmFsRGF0YS5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLmV4dGVybmFsRGF0YVt0XSkpcmV0dXJuICJleHRlcm5hbERhdGEuIitufX1pZihudWxsIT1lLmRhdGFMb2NhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YUxvY2F0aW9uIikpc3dpdGNoKGUuZGF0YUxvY2F0aW9uKXtkZWZhdWx0OnJldHVybiAiZGF0YUxvY2F0aW9uOiBlbnVtIHZhbHVlIGV4cGVjdGVkIjtjYXNlIDA6Y2FzZSAxOn1pZihudWxsIT1lLmRvdWJsZURhdGEmJmUuaGFzT3duUHJvcGVydHkoImRvdWJsZURhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSlyZXR1cm4gImRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK3QpaWYoIm51bWJlciIhPXR5cGVvZiBlLmRvdWJsZURhdGFbdF0pcmV0dXJuICJkb3VibGVEYXRhOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS51aW50NjREYXRhJiZlLmhhc093blByb3BlcnR5KCJ1aW50NjREYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUudWludDY0RGF0YSkpcmV0dXJuICJ1aW50NjREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudWludDY0RGF0YS5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS51aW50NjREYXRhW3RdKXx8ZS51aW50NjREYXRhW3RdJiZsLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbdF0ubG93KSYmbC5pc0ludGVnZXIoZS51aW50NjREYXRhW3RdLmhpZ2gpKSlyZXR1cm4gInVpbnQ2NERhdGE6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVGVuc29yUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JQcm90bztpZihlLmRpbXMpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5kaW1zOiBhcnJheSBleHBlY3RlZCIpO3QuZGltcz1bXTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKWwuTG9uZz8odC5kaW1zW25dPWwuTG9uZy5mcm9tVmFsdWUoZS5kaW1zW25dKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPXBhcnNlSW50KGUuZGltc1tuXSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPWUuZGltc1tuXToib2JqZWN0Ij09dHlwZW9mIGUuZGltc1tuXSYmKHQuZGltc1tuXT1uZXcgbC5Mb25nQml0cyhlLmRpbXNbbl0ubG93Pj4+MCxlLmRpbXNbbl0uaGlnaD4+PjApLnRvTnVtYmVyKCkpO31pZihudWxsIT1lLmRhdGFUeXBlJiYodC5kYXRhVHlwZT0wfGUuZGF0YVR5cGUpLG51bGwhPWUuc2VnbWVudCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNlZ21lbnQpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5zZWdtZW50OiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNlZ21lbnQ9Yy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQuZnJvbU9iamVjdChlLnNlZ21lbnQpO31pZihlLmZsb2F0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZmxvYXREYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmZsb2F0RGF0YT1bXSxuPTA7bjxlLmZsb2F0RGF0YS5sZW5ndGg7KytuKXQuZmxvYXREYXRhW25dPU51bWJlcihlLmZsb2F0RGF0YVtuXSk7fWlmKGUuaW50MzJEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQzMkRhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW50MzJEYXRhPVtdLG49MDtuPGUuaW50MzJEYXRhLmxlbmd0aDsrK24pdC5pbnQzMkRhdGFbbl09MHxlLmludDMyRGF0YVtuXTt9aWYoZS5zdHJpbmdEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ0RhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uc3RyaW5nRGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5zdHJpbmdEYXRhPVtdLG49MDtuPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytuKSJzdHJpbmciPT10eXBlb2YgZS5zdHJpbmdEYXRhW25dP2wuYmFzZTY0LmRlY29kZShlLnN0cmluZ0RhdGFbbl0sdC5zdHJpbmdEYXRhW25dPWwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnN0cmluZ0RhdGFbbl0pKSwwKTplLnN0cmluZ0RhdGFbbl0ubGVuZ3RoPj0wJiYodC5zdHJpbmdEYXRhW25dPWUuc3RyaW5nRGF0YVtuXSk7fWlmKGUuaW50NjREYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDY0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW50NjREYXRhPVtdLG49MDtuPGUuaW50NjREYXRhLmxlbmd0aDsrK24pbC5Mb25nPyh0LmludDY0RGF0YVtuXT1sLkxvbmcuZnJvbVZhbHVlKGUuaW50NjREYXRhW25dKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmludDY0RGF0YVtuXT90LmludDY0RGF0YVtuXT1wYXJzZUludChlLmludDY0RGF0YVtuXSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmludDY0RGF0YVtuXT90LmludDY0RGF0YVtuXT1lLmludDY0RGF0YVtuXToib2JqZWN0Ij09dHlwZW9mIGUuaW50NjREYXRhW25dJiYodC5pbnQ2NERhdGFbbl09bmV3IGwuTG9uZ0JpdHMoZS5pbnQ2NERhdGFbbl0ubG93Pj4+MCxlLmludDY0RGF0YVtuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSk7fWlmKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxudWxsIT1lLnJhd0RhdGEmJigic3RyaW5nIj09dHlwZW9mIGUucmF3RGF0YT9sLmJhc2U2NC5kZWNvZGUoZS5yYXdEYXRhLHQucmF3RGF0YT1sLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5yYXdEYXRhKSksMCk6ZS5yYXdEYXRhLmxlbmd0aD49MCYmKHQucmF3RGF0YT1lLnJhd0RhdGEpKSxlLmV4dGVybmFsRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5leHRlcm5hbERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmV4dGVybmFsRGF0YT1bXSxuPTA7bjxlLmV4dGVybmFsRGF0YS5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZXh0ZXJuYWxEYXRhW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmV4dGVybmFsRGF0YVtuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUuZXh0ZXJuYWxEYXRhW25dKTt9fXN3aXRjaChlLmRhdGFMb2NhdGlvbil7ZGVmYXVsdDppZigibnVtYmVyIj09dHlwZW9mIGUuZGF0YUxvY2F0aW9uKXt0LmRhdGFMb2NhdGlvbj1lLmRhdGFMb2NhdGlvbjticmVha31icmVhaztjYXNlIkRFRkFVTFQiOmNhc2UgMDp0LmRhdGFMb2NhdGlvbj0wO2JyZWFrO2Nhc2UiRVhURVJOQUwiOmNhc2UgMTp0LmRhdGFMb2NhdGlvbj0xO31pZihlLmRvdWJsZURhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuZG91YmxlRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5kb3VibGVEYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmRvdWJsZURhdGE9W10sbj0wO248ZS5kb3VibGVEYXRhLmxlbmd0aDsrK24pdC5kb3VibGVEYXRhW25dPU51bWJlcihlLmRvdWJsZURhdGFbbl0pO31pZihlLnVpbnQ2NERhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUudWludDY0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by51aW50NjREYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnVpbnQ2NERhdGE9W10sbj0wO248ZS51aW50NjREYXRhLmxlbmd0aDsrK24pbC5Mb25nPyh0LnVpbnQ2NERhdGFbbl09bC5Mb25nLmZyb21WYWx1ZShlLnVpbnQ2NERhdGFbbl0pKS51bnNpZ25lZD0hMDoic3RyaW5nIj09dHlwZW9mIGUudWludDY0RGF0YVtuXT90LnVpbnQ2NERhdGFbbl09cGFyc2VJbnQoZS51aW50NjREYXRhW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUudWludDY0RGF0YVtuXT90LnVpbnQ2NERhdGFbbl09ZS51aW50NjREYXRhW25dOiJvYmplY3QiPT10eXBlb2YgZS51aW50NjREYXRhW25dJiYodC51aW50NjREYXRhW25dPW5ldyBsLkxvbmdCaXRzKGUudWludDY0RGF0YVtuXS5sb3c+Pj4wLGUudWludDY0RGF0YVtuXS5oaWdoPj4+MCkudG9OdW1iZXIoITApKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uZGltcz1bXSxuLmZsb2F0RGF0YT1bXSxuLmludDMyRGF0YT1bXSxuLnN0cmluZ0RhdGE9W10sbi5pbnQ2NERhdGE9W10sbi5kb3VibGVEYXRhPVtdLG4udWludDY0RGF0YT1bXSxuLmV4dGVybmFsRGF0YT1bXSksdC5kZWZhdWx0cyYmKG4uZGF0YVR5cGU9MCxuLnNlZ21lbnQ9bnVsbCxuLm5hbWU9IiIsdC5ieXRlcz09PVN0cmluZz9uLnJhd0RhdGE9IiI6KG4ucmF3RGF0YT1bXSx0LmJ5dGVzIT09QXJyYXkmJihuLnJhd0RhdGE9bC5uZXdCdWZmZXIobi5yYXdEYXRhKSkpLG4uZG9jU3RyaW5nPSIiLG4uZGF0YUxvY2F0aW9uPXQuZW51bXM9PT1TdHJpbmc/IkRFRkFVTFQiOjApLGUuZGltcyYmZS5kaW1zLmxlbmd0aCl7bi5kaW1zPVtdO2Zvcih2YXIgcj0wO3I8ZS5kaW1zLmxlbmd0aDsrK3IpIm51bWJlciI9PXR5cGVvZiBlLmRpbXNbcl0/bi5kaW1zW3JdPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuZGltc1tyXSk6ZS5kaW1zW3JdOm4uZGltc1tyXT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmRpbXNbcl0pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5kaW1zW3JdLmxvdz4+PjAsZS5kaW1zW3JdLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuZGltc1tyXTt9aWYobnVsbCE9ZS5kYXRhVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YVR5cGUiKSYmKG4uZGF0YVR5cGU9ZS5kYXRhVHlwZSksbnVsbCE9ZS5zZWdtZW50JiZlLmhhc093blByb3BlcnR5KCJzZWdtZW50IikmJihuLnNlZ21lbnQ9Yy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQudG9PYmplY3QoZS5zZWdtZW50LHQpKSxlLmZsb2F0RGF0YSYmZS5mbG9hdERhdGEubGVuZ3RoKWZvcihuLmZsb2F0RGF0YT1bXSxyPTA7cjxlLmZsb2F0RGF0YS5sZW5ndGg7KytyKW4uZmxvYXREYXRhW3JdPXQuanNvbiYmIWlzRmluaXRlKGUuZmxvYXREYXRhW3JdKT9TdHJpbmcoZS5mbG9hdERhdGFbcl0pOmUuZmxvYXREYXRhW3JdO2lmKGUuaW50MzJEYXRhJiZlLmludDMyRGF0YS5sZW5ndGgpZm9yKG4uaW50MzJEYXRhPVtdLHI9MDtyPGUuaW50MzJEYXRhLmxlbmd0aDsrK3Ipbi5pbnQzMkRhdGFbcl09ZS5pbnQzMkRhdGFbcl07aWYoZS5zdHJpbmdEYXRhJiZlLnN0cmluZ0RhdGEubGVuZ3RoKWZvcihuLnN0cmluZ0RhdGE9W10scj0wO3I8ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK3Ipbi5zdHJpbmdEYXRhW3JdPXQuYnl0ZXM9PT1TdHJpbmc/bC5iYXNlNjQuZW5jb2RlKGUuc3RyaW5nRGF0YVtyXSwwLGUuc3RyaW5nRGF0YVtyXS5sZW5ndGgpOnQuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnN0cmluZ0RhdGFbcl0pOmUuc3RyaW5nRGF0YVtyXTtpZihlLmludDY0RGF0YSYmZS5pbnQ2NERhdGEubGVuZ3RoKWZvcihuLmludDY0RGF0YT1bXSxyPTA7cjxlLmludDY0RGF0YS5sZW5ndGg7KytyKSJudW1iZXIiPT10eXBlb2YgZS5pbnQ2NERhdGFbcl0/bi5pbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pbnQ2NERhdGFbcl0pOmUuaW50NjREYXRhW3JdOm4uaW50NjREYXRhW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaW50NjREYXRhW3JdKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuaW50NjREYXRhW3JdLmxvdz4+PjAsZS5pbnQ2NERhdGFbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pbnQ2NERhdGFbcl07aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLnJhd0RhdGEmJmUuaGFzT3duUHJvcGVydHkoInJhd0RhdGEiKSYmKG4ucmF3RGF0YT10LmJ5dGVzPT09U3RyaW5nP2wuYmFzZTY0LmVuY29kZShlLnJhd0RhdGEsMCxlLnJhd0RhdGEubGVuZ3RoKTp0LmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5yYXdEYXRhKTplLnJhd0RhdGEpLGUuZG91YmxlRGF0YSYmZS5kb3VibGVEYXRhLmxlbmd0aClmb3Iobi5kb3VibGVEYXRhPVtdLHI9MDtyPGUuZG91YmxlRGF0YS5sZW5ndGg7KytyKW4uZG91YmxlRGF0YVtyXT10Lmpzb24mJiFpc0Zpbml0ZShlLmRvdWJsZURhdGFbcl0pP1N0cmluZyhlLmRvdWJsZURhdGFbcl0pOmUuZG91YmxlRGF0YVtyXTtpZihlLnVpbnQ2NERhdGEmJmUudWludDY0RGF0YS5sZW5ndGgpZm9yKG4udWludDY0RGF0YT1bXSxyPTA7cjxlLnVpbnQ2NERhdGEubGVuZ3RoOysrcikibnVtYmVyIj09dHlwZW9mIGUudWludDY0RGF0YVtyXT9uLnVpbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS51aW50NjREYXRhW3JdKTplLnVpbnQ2NERhdGFbcl06bi51aW50NjREYXRhW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudWludDY0RGF0YVtyXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLnVpbnQ2NERhdGFbcl0ubG93Pj4+MCxlLnVpbnQ2NERhdGFbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCEwKTplLnVpbnQ2NERhdGFbcl07aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUuZXh0ZXJuYWxEYXRhJiZlLmV4dGVybmFsRGF0YS5sZW5ndGgpZm9yKG4uZXh0ZXJuYWxEYXRhPVtdLHI9MDtyPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK3Ipbi5leHRlcm5hbERhdGFbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5leHRlcm5hbERhdGFbcl0sdCk7cmV0dXJuIG51bGwhPWUuZGF0YUxvY2F0aW9uJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSYmKG4uZGF0YUxvY2F0aW9uPXQuZW51bXM9PT1TdHJpbmc/dm9pZCAwPT09Yy5vbm54LlRlbnNvclByb3RvLkRhdGFMb2NhdGlvbltlLmRhdGFMb2NhdGlvbl0/ZS5kYXRhTG9jYXRpb246Yy5vbm54LlRlbnNvclByb3RvLkRhdGFMb2NhdGlvbltlLmRhdGFMb2NhdGlvbl06ZS5kYXRhTG9jYXRpb24pLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yUHJvdG8ifSxlLkRhdGFUeXBlPWZ1bmN0aW9uKCl7dmFyIGU9e30sdD1PYmplY3QuY3JlYXRlKGUpO3JldHVybiB0W2VbMF09IlVOREVGSU5FRCJdPTAsdFtlWzFdPSJGTE9BVCJdPTEsdFtlWzJdPSJVSU5UOCJdPTIsdFtlWzNdPSJJTlQ4Il09Myx0W2VbNF09IlVJTlQxNiJdPTQsdFtlWzVdPSJJTlQxNiJdPTUsdFtlWzZdPSJJTlQzMiJdPTYsdFtlWzddPSJJTlQ2NCJdPTcsdFtlWzhdPSJTVFJJTkciXT04LHRbZVs5XT0iQk9PTCJdPTksdFtlWzEwXT0iRkxPQVQxNiJdPTEwLHRbZVsxMV09IkRPVUJMRSJdPTExLHRbZVsxMl09IlVJTlQzMiJdPTEyLHRbZVsxM109IlVJTlQ2NCJdPTEzLHRbZVsxNF09IkNPTVBMRVg2NCJdPTE0LHRbZVsxNV09IkNPTVBMRVgxMjgiXT0xNSx0W2VbMTZdPSJCRkxPQVQxNiJdPTE2LHRbZVsxN109IkZMT0FUOEU0TTNGTiJdPTE3LHRbZVsxOF09IkZMT0FUOEU0TTNGTlVaIl09MTgsdFtlWzE5XT0iRkxPQVQ4RTVNMiJdPTE5LHRbZVsyMF09IkZMT0FUOEU1TTJGTlVaIl09MjAsdH0oKSxlLlNlZ21lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmJlZ2luPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLmVuZD1sLkxvbmc/bC5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuYmVnaW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImJlZ2luIikmJnQudWludDMyKDgpLmludDY0KGUuYmVnaW4pLG51bGwhPWUuZW5kJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJlbmQiKSYmdC51aW50MzIoMTYpLmludDY0KGUuZW5kKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudDtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmJlZ2luPWUuaW50NjQoKTticmVhaztjYXNlIDI6ci5lbmQ9ZS5pbnQ2NCgpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiAib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lPyJvYmplY3QgZXhwZWN0ZWQiOm51bGwhPWUuYmVnaW4mJmUuaGFzT3duUHJvcGVydHkoImJlZ2luIikmJiEobC5pc0ludGVnZXIoZS5iZWdpbil8fGUuYmVnaW4mJmwuaXNJbnRlZ2VyKGUuYmVnaW4ubG93KSYmbC5pc0ludGVnZXIoZS5iZWdpbi5oaWdoKSk/ImJlZ2luOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGwhPWUuZW5kJiZlLmhhc093blByb3BlcnR5KCJlbmQiKSYmIShsLmlzSW50ZWdlcihlLmVuZCl8fGUuZW5kJiZsLmlzSW50ZWdlcihlLmVuZC5sb3cpJiZsLmlzSW50ZWdlcihlLmVuZC5oaWdoKSk/ImVuZDogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JQcm90by5TZWdtZW50KXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudDtyZXR1cm4gbnVsbCE9ZS5iZWdpbiYmKGwuTG9uZz8odC5iZWdpbj1sLkxvbmcuZnJvbVZhbHVlKGUuYmVnaW4pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuYmVnaW4/dC5iZWdpbj1wYXJzZUludChlLmJlZ2luLDEwKToibnVtYmVyIj09dHlwZW9mIGUuYmVnaW4/dC5iZWdpbj1lLmJlZ2luOiJvYmplY3QiPT10eXBlb2YgZS5iZWdpbiYmKHQuYmVnaW49bmV3IGwuTG9uZ0JpdHMoZS5iZWdpbi5sb3c+Pj4wLGUuYmVnaW4uaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxudWxsIT1lLmVuZCYmKGwuTG9uZz8odC5lbmQ9bC5Mb25nLmZyb21WYWx1ZShlLmVuZCkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5lbmQ/dC5lbmQ9cGFyc2VJbnQoZS5lbmQsMTApOiJudW1iZXIiPT10eXBlb2YgZS5lbmQ/dC5lbmQ9ZS5lbmQ6Im9iamVjdCI9PXR5cGVvZiBlLmVuZCYmKHQuZW5kPW5ldyBsLkxvbmdCaXRzKGUuZW5kLmxvdz4+PjAsZS5lbmQuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKHQuZGVmYXVsdHMpe2lmKGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24uYmVnaW49dC5sb25ncz09PVN0cmluZz9yLnRvU3RyaW5nKCk6dC5sb25ncz09PU51bWJlcj9yLnRvTnVtYmVyKCk6cjt9ZWxzZSBuLmJlZ2luPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7bC5Mb25nPyhyPW5ldyBsLkxvbmcoMCwwLCExKSxuLmVuZD10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyKTpuLmVuZD10LmxvbmdzPT09U3RyaW5nPyIwIjowO31yZXR1cm4gbnVsbCE9ZS5iZWdpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiYmVnaW4iKSYmKCJudW1iZXIiPT10eXBlb2YgZS5iZWdpbj9uLmJlZ2luPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuYmVnaW4pOmUuYmVnaW46bi5iZWdpbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmJlZ2luKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuYmVnaW4ubG93Pj4+MCxlLmJlZ2luLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuYmVnaW4pLG51bGwhPWUuZW5kJiZlLmhhc093blByb3BlcnR5KCJlbmQiKSYmKCJudW1iZXIiPT10eXBlb2YgZS5lbmQ/bi5lbmQ9dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5lbmQpOmUuZW5kOm4uZW5kPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZW5kKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuZW5kLmxvdz4+PjAsZS5lbmQuaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5lbmQpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yUHJvdG8uU2VnbWVudCJ9LGV9KCksZS5EYXRhTG9jYXRpb249ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iREVGQVVMVCJdPTAsdFtlWzFdPSJFWFRFUk5BTCJdPTEsdH0oKSxlfSgpLGkuU3BhcnNlVGVuc29yUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZGltcz1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS52YWx1ZXM9bnVsbCxlLnByb3RvdHlwZS5pbmRpY2VzPW51bGwsZS5wcm90b3R5cGUuZGltcz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUudmFsdWVzJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ2YWx1ZXMiKSYmYy5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLnZhbHVlcyx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmluZGljZXMmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImluZGljZXMiKSYmYy5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLmluZGljZXMsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXt0LnVpbnQzMigyNikuZm9yaygpO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24pdC5pbnQ2NChlLmRpbXNbbl0pO3QubGRlbGltKCk7fXJldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguU3BhcnNlVGVuc29yUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci52YWx1ZXM9Yy5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjpyLmluZGljZXM9Yy5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzppZihyLmRpbXMmJnIuZGltcy5sZW5ndGh8fChyLmRpbXM9W10pLDI9PSg3Jm8pKWZvcih2YXIgaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZGltcy5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmRpbXMucHVzaChlLmludDY0KCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO3ZhciB0O2lmKG51bGwhPWUudmFsdWVzJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZXMiKSYmKHQ9Yy5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnZhbHVlcykpKXJldHVybiAidmFsdWVzLiIrdDtpZihudWxsIT1lLmluZGljZXMmJmUuaGFzT3duUHJvcGVydHkoImluZGljZXMiKSYmKHQ9Yy5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLmluZGljZXMpKSlyZXR1cm4gImluZGljZXMuIit0O2lmKG51bGwhPWUuZGltcyYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltcyIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXJldHVybiAiZGltczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24paWYoIShsLmlzSW50ZWdlcihlLmRpbXNbbl0pfHxlLmRpbXNbbl0mJmwuaXNJbnRlZ2VyKGUuZGltc1tuXS5sb3cpJiZsLmlzSW50ZWdlcihlLmRpbXNbbl0uaGlnaCkpKXJldHVybiAiZGltczogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5TcGFyc2VUZW5zb3JQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlNwYXJzZVRlbnNvclByb3RvO2lmKG51bGwhPWUudmFsdWVzKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudmFsdWVzKXRocm93IFR5cGVFcnJvcigiLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udmFsdWVzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnZhbHVlcz1jLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnZhbHVlcyk7fWlmKG51bGwhPWUuaW5kaWNlcyl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmluZGljZXMpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by5pbmRpY2VzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluZGljZXM9Yy5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS5pbmRpY2VzKTt9aWYoZS5kaW1zKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGltczogYXJyYXkgZXhwZWN0ZWQiKTt0LmRpbXM9W107Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilsLkxvbmc/KHQuZGltc1tuXT1sLkxvbmcuZnJvbVZhbHVlKGUuZGltc1tuXSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5kaW1zW25dP3QuZGltc1tuXT1wYXJzZUludChlLmRpbXNbbl0sMTApOiJudW1iZXIiPT10eXBlb2YgZS5kaW1zW25dP3QuZGltc1tuXT1lLmRpbXNbbl06Im9iamVjdCI9PXR5cGVvZiBlLmRpbXNbbl0mJih0LmRpbXNbbl09bmV3IGwuTG9uZ0JpdHMoZS5kaW1zW25dLmxvdz4+PjAsZS5kaW1zW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uZGltcz1bXSksdC5kZWZhdWx0cyYmKG4udmFsdWVzPW51bGwsbi5pbmRpY2VzPW51bGwpLG51bGwhPWUudmFsdWVzJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZXMiKSYmKG4udmFsdWVzPWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLnZhbHVlcyx0KSksbnVsbCE9ZS5pbmRpY2VzJiZlLmhhc093blByb3BlcnR5KCJpbmRpY2VzIikmJihuLmluZGljZXM9Yy5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUuaW5kaWNlcyx0KSksZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXtuLmRpbXM9W107Zm9yKHZhciByPTA7cjxlLmRpbXMubGVuZ3RoOysrcikibnVtYmVyIj09dHlwZW9mIGUuZGltc1tyXT9uLmRpbXNbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1zW3JdKTplLmRpbXNbcl06bi5kaW1zW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltc1tyXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmRpbXNbcl0ubG93Pj4+MCxlLmRpbXNbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1zW3JdO31yZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5TcGFyc2VUZW5zb3JQcm90byJ9LGV9KCksaS5UZW5zb3JTaGFwZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLmRpbT1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5kaW09bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRpbSYmZS5kaW0ubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5kaW0ubGVuZ3RoOysrbiljLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24uZW5jb2RlKGUuZGltW25dLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yU2hhcGVQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtvPj4+Mz09MT8oci5kaW0mJnIuZGltLmxlbmd0aHx8KHIuZGltPVtdKSxyLmRpbS5wdXNoKGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSkpOmUuc2tpcFR5cGUoNyZvKTt9cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZGltJiZlLmhhc093blByb3BlcnR5KCJkaW0iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW0pKXJldHVybiAiZGltOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLmRpbS5sZW5ndGg7Kyt0KXt2YXIgbj1jLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24udmVyaWZ5KGUuZGltW3RdKTtpZihuKXJldHVybiAiZGltLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlRlbnNvclNoYXBlUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvO2lmKGUuZGltKXtpZighQXJyYXkuaXNBcnJheShlLmRpbSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JTaGFwZVByb3RvLmRpbTogYXJyYXkgZXhwZWN0ZWQiKTt0LmRpbT1bXTtmb3IodmFyIG49MDtuPGUuZGltLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5kaW1bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JTaGFwZVByb3RvLmRpbTogb2JqZWN0IGV4cGVjdGVkIik7dC5kaW1bbl09Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLmZyb21PYmplY3QoZS5kaW1bbl0pO319cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uZGltPVtdKSxlLmRpbSYmZS5kaW0ubGVuZ3RoKXtuLmRpbT1bXTtmb3IodmFyIHI9MDtyPGUuZGltLmxlbmd0aDsrK3Ipbi5kaW1bcl09Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLnRvT2JqZWN0KGUuZGltW3JdLHQpO31yZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JTaGFwZVByb3RvIn0sZS5EaW1lbnNpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9dmFyIHQ7cmV0dXJuIGUucHJvdG90eXBlLmRpbVZhbHVlPW51bGwsZS5wcm90b3R5cGUuZGltUGFyYW09bnVsbCxlLnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6bC5vbmVPZkdldHRlcih0PVsiZGltVmFsdWUiLCJkaW1QYXJhbSJdKSxzZXQ6bC5vbmVPZlNldHRlcih0KX0pLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5kaW1WYWx1ZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGltVmFsdWUiKSYmdC51aW50MzIoOCkuaW50NjQoZS5kaW1WYWx1ZSksbnVsbCE9ZS5kaW1QYXJhbSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGltUGFyYW0iKSYmdC51aW50MzIoMTgpLnN0cmluZyhlLmRpbVBhcmFtKSxudWxsIT1lLmRlbm90YXRpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlbm90YXRpb24iKSYmdC51aW50MzIoMjYpLnN0cmluZyhlLmRlbm90YXRpb24pLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbjtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmRpbVZhbHVlPWUuaW50NjQoKTticmVhaztjYXNlIDI6ci5kaW1QYXJhbT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMzpyLmRlbm90YXRpb249ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjt2YXIgdD17fTtpZihudWxsIT1lLmRpbVZhbHVlJiZlLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiYodC52YWx1ZT0xLCEobC5pc0ludGVnZXIoZS5kaW1WYWx1ZSl8fGUuZGltVmFsdWUmJmwuaXNJbnRlZ2VyKGUuZGltVmFsdWUubG93KSYmbC5pc0ludGVnZXIoZS5kaW1WYWx1ZS5oaWdoKSkpKXJldHVybiAiZGltVmFsdWU6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kaW1QYXJhbSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltUGFyYW0iKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtpZih0LnZhbHVlPTEsIWwuaXNTdHJpbmcoZS5kaW1QYXJhbSkpcmV0dXJuICJkaW1QYXJhbTogc3RyaW5nIGV4cGVjdGVkIn1yZXR1cm4gbnVsbCE9ZS5kZW5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJiFsLmlzU3RyaW5nKGUuZGVub3RhdGlvbik/ImRlbm90YXRpb246IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbjtyZXR1cm4gbnVsbCE9ZS5kaW1WYWx1ZSYmKGwuTG9uZz8odC5kaW1WYWx1ZT1sLkxvbmcuZnJvbVZhbHVlKGUuZGltVmFsdWUpKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuZGltVmFsdWU/dC5kaW1WYWx1ZT1wYXJzZUludChlLmRpbVZhbHVlLDEwKToibnVtYmVyIj09dHlwZW9mIGUuZGltVmFsdWU/dC5kaW1WYWx1ZT1lLmRpbVZhbHVlOiJvYmplY3QiPT10eXBlb2YgZS5kaW1WYWx1ZSYmKHQuZGltVmFsdWU9bmV3IGwuTG9uZ0JpdHMoZS5kaW1WYWx1ZS5sb3c+Pj4wLGUuZGltVmFsdWUuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxudWxsIT1lLmRpbVBhcmFtJiYodC5kaW1QYXJhbT1TdHJpbmcoZS5kaW1QYXJhbSkpLG51bGwhPWUuZGVub3RhdGlvbiYmKHQuZGVub3RhdGlvbj1TdHJpbmcoZS5kZW5vdGF0aW9uKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZGVub3RhdGlvbj0iIiksbnVsbCE9ZS5kaW1WYWx1ZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltVmFsdWUiKSYmKCJudW1iZXIiPT10eXBlb2YgZS5kaW1WYWx1ZT9uLmRpbVZhbHVlPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuZGltVmFsdWUpOmUuZGltVmFsdWU6bi5kaW1WYWx1ZT10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmRpbVZhbHVlKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuZGltVmFsdWUubG93Pj4+MCxlLmRpbVZhbHVlLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuZGltVmFsdWUsdC5vbmVvZnMmJihuLnZhbHVlPSJkaW1WYWx1ZSIpKSxudWxsIT1lLmRpbVBhcmFtJiZlLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpJiYobi5kaW1QYXJhbT1lLmRpbVBhcmFtLHQub25lb2ZzJiYobi52YWx1ZT0iZGltUGFyYW0iKSksbnVsbCE9ZS5kZW5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJihuLmRlbm90YXRpb249ZS5kZW5vdGF0aW9uKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uIn0sZX0oKSxlfSgpLGkuVHlwZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXZhciB0O3JldHVybiBlLnByb3RvdHlwZS50ZW5zb3JUeXBlPW51bGwsZS5wcm90b3R5cGUuc2VxdWVuY2VUeXBlPW51bGwsZS5wcm90b3R5cGUubWFwVHlwZT1udWxsLGUucHJvdG90eXBlLm9wdGlvbmFsVHlwZT1udWxsLGUucHJvdG90eXBlLnNwYXJzZVRlbnNvclR5cGU9bnVsbCxlLnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6bC5vbmVPZkdldHRlcih0PVsidGVuc29yVHlwZSIsInNlcXVlbmNlVHlwZSIsIm1hcFR5cGUiLCJvcHRpb25hbFR5cGUiLCJzcGFyc2VUZW5zb3JUeXBlIl0pLHNldDpsLm9uZU9mU2V0dGVyKHQpfSksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLnRlbnNvclR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInRlbnNvclR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5UZW5zb3IuZW5jb2RlKGUudGVuc29yVHlwZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLnNlcXVlbmNlVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2VxdWVuY2VUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZW5jb2RlKGUuc2VxdWVuY2VUeXBlLHQudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUubWFwVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibWFwVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLk1hcC5lbmNvZGUoZS5tYXBUeXBlLHQudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZGVub3RhdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVub3RhdGlvbiIpJiZ0LnVpbnQzMig1MCkuc3RyaW5nKGUuZGVub3RhdGlvbiksbnVsbCE9ZS5zcGFyc2VUZW5zb3JUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzcGFyc2VUZW5zb3JUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLmVuY29kZShlLnNwYXJzZVRlbnNvclR5cGUsdC51aW50MzIoNjYpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5vcHRpb25hbFR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm9wdGlvbmFsVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmVuY29kZShlLm9wdGlvbmFsVHlwZSx0LnVpbnQzMig3NCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIudGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlRlbnNvci5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDQ6ci5zZXF1ZW5jZVR5cGU9Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDU6ci5tYXBUeXBlPWMub25ueC5UeXBlUHJvdG8uTWFwLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgOTpyLm9wdGlvbmFsVHlwZT1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgODpyLnNwYXJzZVRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA2OnIuZGVub3RhdGlvbj1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO3ZhciB0PXt9O2lmKG51bGwhPWUudGVuc29yVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpJiYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5UZW5zb3IudmVyaWZ5KGUudGVuc29yVHlwZSkpKXJldHVybiAidGVuc29yVHlwZS4iK247aWYobnVsbCE9ZS5zZXF1ZW5jZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNlcXVlbmNlVHlwZSIpKXtpZigxPT09dC52YWx1ZSlyZXR1cm4gInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO2lmKHQudmFsdWU9MSxuPWMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UudmVyaWZ5KGUuc2VxdWVuY2VUeXBlKSlyZXR1cm4gInNlcXVlbmNlVHlwZS4iK259aWYobnVsbCE9ZS5tYXBUeXBlJiZlLmhhc093blByb3BlcnR5KCJtYXBUeXBlIikpe2lmKDE9PT10LnZhbHVlKXJldHVybiAidmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5NYXAudmVyaWZ5KGUubWFwVHlwZSkpcmV0dXJuICJtYXBUeXBlLiIrbn1pZihudWxsIT1lLm9wdGlvbmFsVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgib3B0aW9uYWxUeXBlIikpe2lmKDE9PT10LnZhbHVlKXJldHVybiAidmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5PcHRpb25hbC52ZXJpZnkoZS5vcHRpb25hbFR5cGUpKXJldHVybiAib3B0aW9uYWxUeXBlLiIrbn1pZihudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvclR5cGUiKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjt2YXIgbjtpZih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci52ZXJpZnkoZS5zcGFyc2VUZW5zb3JUeXBlKSlyZXR1cm4gInNwYXJzZVRlbnNvclR5cGUuIitufXJldHVybiBudWxsIT1lLmRlbm90YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRlbm90YXRpb24iKSYmIWwuaXNTdHJpbmcoZS5kZW5vdGF0aW9uKT8iZGVub3RhdGlvbjogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG87aWYobnVsbCE9ZS50ZW5zb3JUeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudGVuc29yVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by50ZW5zb3JUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5UZW5zb3IuZnJvbU9iamVjdChlLnRlbnNvclR5cGUpO31pZihudWxsIT1lLnNlcXVlbmNlVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNlcXVlbmNlVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5zZXF1ZW5jZVR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc2VxdWVuY2VUeXBlPWMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZnJvbU9iamVjdChlLnNlcXVlbmNlVHlwZSk7fWlmKG51bGwhPWUubWFwVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm1hcFR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8ubWFwVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5tYXBUeXBlPWMub25ueC5UeXBlUHJvdG8uTWFwLmZyb21PYmplY3QoZS5tYXBUeXBlKTt9aWYobnVsbCE9ZS5vcHRpb25hbFR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5vcHRpb25hbFR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8ub3B0aW9uYWxUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm9wdGlvbmFsVHlwZT1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmZyb21PYmplY3QoZS5vcHRpb25hbFR5cGUpO31pZihudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zcGFyc2VUZW5zb3JUeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnNwYXJzZVRlbnNvclR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc3BhcnNlVGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci5mcm9tT2JqZWN0KGUuc3BhcnNlVGVuc29yVHlwZSk7fXJldHVybiBudWxsIT1lLmRlbm90YXRpb24mJih0LmRlbm90YXRpb249U3RyaW5nKGUuZGVub3RhdGlvbikpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmRlbm90YXRpb249IiIpLG51bGwhPWUudGVuc29yVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpJiYobi50ZW5zb3JUeXBlPWMub25ueC5UeXBlUHJvdG8uVGVuc29yLnRvT2JqZWN0KGUudGVuc29yVHlwZSx0KSx0Lm9uZW9mcyYmKG4udmFsdWU9InRlbnNvclR5cGUiKSksbnVsbCE9ZS5zZXF1ZW5jZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNlcXVlbmNlVHlwZSIpJiYobi5zZXF1ZW5jZVR5cGU9Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS50b09iamVjdChlLnNlcXVlbmNlVHlwZSx0KSx0Lm9uZW9mcyYmKG4udmFsdWU9InNlcXVlbmNlVHlwZSIpKSxudWxsIT1lLm1hcFR5cGUmJmUuaGFzT3duUHJvcGVydHkoIm1hcFR5cGUiKSYmKG4ubWFwVHlwZT1jLm9ubnguVHlwZVByb3RvLk1hcC50b09iamVjdChlLm1hcFR5cGUsdCksdC5vbmVvZnMmJihuLnZhbHVlPSJtYXBUeXBlIikpLG51bGwhPWUuZGVub3RhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYobi5kZW5vdGF0aW9uPWUuZGVub3RhdGlvbiksbnVsbCE9ZS5zcGFyc2VUZW5zb3JUeXBlJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3JUeXBlIikmJihuLnNwYXJzZVRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IudG9PYmplY3QoZS5zcGFyc2VUZW5zb3JUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0ic3BhcnNlVGVuc29yVHlwZSIpKSxudWxsIT1lLm9wdGlvbmFsVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgib3B0aW9uYWxUeXBlIikmJihuLm9wdGlvbmFsVHlwZT1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLnRvT2JqZWN0KGUub3B0aW9uYWxUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0ib3B0aW9uYWxUeXBlIikpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvIn0sZS5UZW5zb3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmVsZW1UeXBlPTAsZS5wcm90b3R5cGUuc2hhcGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZWxlbVR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImVsZW1UeXBlIikmJnQudWludDMyKDgpLmludDMyKGUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNoYXBlIikmJmMub25ueC5UZW5zb3JTaGFwZVByb3RvLmVuY29kZShlLnNoYXBlLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG8uVGVuc29yO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuZWxlbVR5cGU9ZS5pbnQzMigpO2JyZWFrO2Nhc2UgMjpyLnNoYXBlPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJiFsLmlzSW50ZWdlcihlLmVsZW1UeXBlKSlyZXR1cm4gImVsZW1UeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihudWxsIT1lLnNoYXBlJiZlLmhhc093blByb3BlcnR5KCJzaGFwZSIpKXt2YXIgdD1jLm9ubnguVGVuc29yU2hhcGVQcm90by52ZXJpZnkoZS5zaGFwZSk7aWYodClyZXR1cm4gInNoYXBlLiIrdH1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHlwZVByb3RvLlRlbnNvcilyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90by5UZW5zb3I7aWYobnVsbCE9ZS5lbGVtVHlwZSYmKHQuZWxlbVR5cGU9MHxlLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc2hhcGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uVGVuc29yLnNoYXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNoYXBlPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLmZyb21PYmplY3QoZS5zaGFwZSk7fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5lbGVtVHlwZT0wLG4uc2hhcGU9bnVsbCksbnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmKG4uZWxlbVR5cGU9ZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2hhcGUiKSYmKG4uc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8udG9PYmplY3QoZS5zaGFwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uVGVuc29yIn0sZX0oKSxlLlNlcXVlbmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5lbGVtVHlwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS5lbGVtVHlwZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO28+Pj4zPT0xP3IuZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTplLnNraXBUeXBlKDcmbyk7fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLmVsZW1UeXBlKTtpZih0KXJldHVybiAiZWxlbVR5cGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2U7aWYobnVsbCE9ZS5lbGVtVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmVsZW1UeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLmVsZW1UeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLmVsZW1UeXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPW51bGwpLG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihuLmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS5lbGVtVHlwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uU2VxdWVuY2UifSxlfSgpLGUuTWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5rZXlUeXBlPTAsZS5wcm90b3R5cGUudmFsdWVUeXBlPW51bGwsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmtleVR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImtleVR5cGUiKSYmdC51aW50MzIoOCkuaW50MzIoZS5rZXlUeXBlKSxudWxsIT1lLnZhbHVlVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmFsdWVUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudmFsdWVUeXBlLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG8uTWFwO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIua2V5VHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIudmFsdWVUeXBlPWMub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5rZXlUeXBlJiZlLmhhc093blByb3BlcnR5KCJrZXlUeXBlIikmJiFsLmlzSW50ZWdlcihlLmtleVR5cGUpKXJldHVybiAia2V5VHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYobnVsbCE9ZS52YWx1ZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlVHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLnZhbHVlVHlwZSk7aWYodClyZXR1cm4gInZhbHVlVHlwZS4iK3R9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90by5NYXApcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uTWFwO2lmKG51bGwhPWUua2V5VHlwZSYmKHQua2V5VHlwZT0wfGUua2V5VHlwZSksbnVsbCE9ZS52YWx1ZVR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS52YWx1ZVR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uTWFwLnZhbHVlVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC52YWx1ZVR5cGU9Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUudmFsdWVUeXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmtleVR5cGU9MCxuLnZhbHVlVHlwZT1udWxsKSxudWxsIT1lLmtleVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImtleVR5cGUiKSYmKG4ua2V5VHlwZT1lLmtleVR5cGUpLG51bGwhPWUudmFsdWVUeXBlJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZVR5cGUiKSYmKG4udmFsdWVUeXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS52YWx1ZVR5cGUsdCkpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvLk1hcCJ9LGV9KCksZS5PcHRpb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZWxlbVR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImVsZW1UeXBlIikmJmMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUuZWxlbVR5cGUsdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5PcHRpb25hbDtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtvPj4+Mz09MT9yLmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk6ZS5za2lwVHlwZSg3Jm8pO31yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSl7dmFyIHQ9Yy5vbm54LlR5cGVQcm90by52ZXJpZnkoZS5lbGVtVHlwZSk7aWYodClyZXR1cm4gImVsZW1UeXBlLiIrdH1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsO2lmKG51bGwhPWUuZWxlbVR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5lbGVtVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5PcHRpb25hbC5lbGVtVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5lbGVtVHlwZT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS5lbGVtVHlwZSk7fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5lbGVtVHlwZT1udWxsKSxudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYobi5lbGVtVHlwZT1jLm9ubnguVHlwZVByb3RvLnRvT2JqZWN0KGUuZWxlbVR5cGUsdCkpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvLk9wdGlvbmFsIn0sZX0oKSxlLlNwYXJzZVRlbnNvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9MCxlLnByb3RvdHlwZS5zaGFwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmdC51aW50MzIoOCkuaW50MzIoZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2hhcGUiKSYmYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZW5jb2RlKGUuc2hhcGUsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3I7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5lbGVtVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIuc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmIWwuaXNJbnRlZ2VyKGUuZWxlbVR5cGUpKXJldHVybiAiZWxlbVR5cGU6IGludGVnZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUuc2hhcGUmJmUuaGFzT3duUHJvcGVydHkoInNoYXBlIikpe3ZhciB0PWMub25ueC5UZW5zb3JTaGFwZVByb3RvLnZlcmlmeShlLnNoYXBlKTtpZih0KXJldHVybiAic2hhcGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvcjtpZihudWxsIT1lLmVsZW1UeXBlJiYodC5lbGVtVHlwZT0wfGUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zaGFwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChlLnNoYXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPTAsbi5zaGFwZT1udWxsKSxudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYobi5lbGVtVHlwZT1lLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlJiZlLmhhc093blByb3BlcnR5KCJzaGFwZSIpJiYobi5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by50b09iamVjdChlLnNoYXBlLHQpKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IifSxlfSgpLGV9KCksaS5PcGVyYXRvclNldElkUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmRvbWFpbj0iIixlLnByb3RvdHlwZS52ZXJzaW9uPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUuZG9tYWluKSxudWxsIT1lLnZlcnNpb24mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZlcnNpb24iKSYmdC51aW50MzIoMTYpLmludDY0KGUudmVyc2lvbiksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnZlcnNpb249ZS5pbnQ2NCgpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiAib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lPyJvYmplY3QgZXhwZWN0ZWQiOm51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pPyJkb21haW46IHN0cmluZyBleHBlY3RlZCI6bnVsbCE9ZS52ZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJ2ZXJzaW9uIikmJiEobC5pc0ludGVnZXIoZS52ZXJzaW9uKXx8ZS52ZXJzaW9uJiZsLmlzSW50ZWdlcihlLnZlcnNpb24ubG93KSYmbC5pc0ludGVnZXIoZS52ZXJzaW9uLmhpZ2gpKT8idmVyc2lvbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5PcGVyYXRvclNldElkUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5PcGVyYXRvclNldElkUHJvdG87cmV0dXJuIG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksbnVsbCE9ZS52ZXJzaW9uJiYobC5Mb25nPyh0LnZlcnNpb249bC5Mb25nLmZyb21WYWx1ZShlLnZlcnNpb24pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUudmVyc2lvbj90LnZlcnNpb249cGFyc2VJbnQoZS52ZXJzaW9uLDEwKToibnVtYmVyIj09dHlwZW9mIGUudmVyc2lvbj90LnZlcnNpb249ZS52ZXJzaW9uOiJvYmplY3QiPT10eXBlb2YgZS52ZXJzaW9uJiYodC52ZXJzaW9uPW5ldyBsLkxvbmdCaXRzKGUudmVyc2lvbi5sb3c+Pj4wLGUudmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYodC5kZWZhdWx0cylpZihuLmRvbWFpbj0iIixsLkxvbmcpe3ZhciByPW5ldyBsLkxvbmcoMCwwLCExKTtuLnZlcnNpb249dC5sb25ncz09PVN0cmluZz9yLnRvU3RyaW5nKCk6dC5sb25ncz09PU51bWJlcj9yLnRvTnVtYmVyKCk6cjt9ZWxzZSBuLnZlcnNpb249dC5sb25ncz09PVN0cmluZz8iMCI6MDtyZXR1cm4gbnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYobi5kb21haW49ZS5kb21haW4pLG51bGwhPWUudmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgidmVyc2lvbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLnZlcnNpb24/bi52ZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUudmVyc2lvbik6ZS52ZXJzaW9uOm4udmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnZlcnNpb24pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS52ZXJzaW9uLmxvdz4+PjAsZS52ZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUudmVyc2lvbiksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5PcGVyYXRvclNldElkUHJvdG8ifSxlfSgpLGkuT3BlcmF0b3JTdGF0dXM9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iRVhQRVJJTUVOVEFMIl09MCx0W2VbMV09IlNUQUJMRSJdPTEsdH0oKSxpLkZ1bmN0aW9uUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy5hdHRyaWJ1dGU9W10sdGhpcy5hdHRyaWJ1dGVQcm90bz1bXSx0aGlzLm5vZGU9W10sdGhpcy5vcHNldEltcG9ydD1bXSxlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5uYW1lPSIiLGUucHJvdG90eXBlLmlucHV0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5vdXRwdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmF0dHJpYnV0ZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuYXR0cmlidXRlUHJvdG89bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5vZGU9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5vcHNldEltcG9ydD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG9tYWluPSIiLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLm5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmdC51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLG51bGwhPWUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKXQudWludDMyKDM0KS5zdHJpbmcoZS5pbnB1dFtuXSk7aWYobnVsbCE9ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aClmb3Iobj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil0LnVpbnQzMig0Mikuc3RyaW5nKGUub3V0cHV0W25dKTtpZihudWxsIT1lLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuPTA7bjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytuKXQudWludDMyKDUwKS5zdHJpbmcoZS5hdHRyaWJ1dGVbbl0pO2lmKG51bGwhPWUubm9kZSYmZS5ub2RlLmxlbmd0aClmb3Iobj0wO248ZS5ub2RlLmxlbmd0aDsrK24pYy5vbm54Lk5vZGVQcm90by5lbmNvZGUoZS5ub2RlW25dLHQudWludDMyKDU4KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoNjYpLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpZm9yKG49MDtuPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrbiljLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmVuY29kZShlLm9wc2V0SW1wb3J0W25dLHQudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUuZG9tYWluJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb21haW4iKSYmdC51aW50MzIoODIpLnN0cmluZyhlLmRvbWFpbiksbnVsbCE9ZS5hdHRyaWJ1dGVQcm90byYmZS5hdHRyaWJ1dGVQcm90by5sZW5ndGgpZm9yKG49MDtuPGUuYXR0cmlidXRlUHJvdG8ubGVuZ3RoOysrbiljLm9ubnguQXR0cmlidXRlUHJvdG8uZW5jb2RlKGUuYXR0cmlidXRlUHJvdG9bbl0sdC51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5GdW5jdGlvblByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgNDpyLmlucHV0JiZyLmlucHV0Lmxlbmd0aHx8KHIuaW5wdXQ9W10pLHIuaW5wdXQucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDU6ci5vdXRwdXQmJnIub3V0cHV0Lmxlbmd0aHx8KHIub3V0cHV0PVtdKSxyLm91dHB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgNjpyLmF0dHJpYnV0ZSYmci5hdHRyaWJ1dGUubGVuZ3RofHwoci5hdHRyaWJ1dGU9W10pLHIuYXR0cmlidXRlLnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAxMTpyLmF0dHJpYnV0ZVByb3RvJiZyLmF0dHJpYnV0ZVByb3RvLmxlbmd0aHx8KHIuYXR0cmlidXRlUHJvdG89W10pLHIuYXR0cmlidXRlUHJvdG8ucHVzaChjLm9ubnguQXR0cmlidXRlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNzpyLm5vZGUmJnIubm9kZS5sZW5ndGh8fChyLm5vZGU9W10pLHIubm9kZS5wdXNoKGMub25ueC5Ob2RlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgODpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2Nhc2UgOTpyLm9wc2V0SW1wb3J0JiZyLm9wc2V0SW1wb3J0Lmxlbmd0aHx8KHIub3BzZXRJbXBvcnQ9W10pLHIub3BzZXRJbXBvcnQucHVzaChjLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEwOnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFsLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuICJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaW5wdXQmJmUuaGFzT3duUHJvcGVydHkoImlucHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXJldHVybiAiaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuaW5wdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLmlucHV0W3RdKSlyZXR1cm4gImlucHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5vdXRwdXQmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuICJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5vdXRwdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLm91dHB1dFt0XSkpcmV0dXJuICJvdXRwdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLmF0dHJpYnV0ZSYmZS5oYXNPd25Qcm9wZXJ0eSgiYXR0cmlidXRlIikpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlKSlyZXR1cm4gImF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmF0dHJpYnV0ZS5sZW5ndGg7Kyt0KWlmKCFsLmlzU3RyaW5nKGUuYXR0cmlidXRlW3RdKSlyZXR1cm4gImF0dHJpYnV0ZTogc3RyaW5nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuYXR0cmlidXRlUHJvdG8mJmUuaGFzT3duUHJvcGVydHkoImF0dHJpYnV0ZVByb3RvIikpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlUHJvdG8pKXJldHVybiAiYXR0cmlidXRlUHJvdG86IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LkF0dHJpYnV0ZVByb3RvLnZlcmlmeShlLmF0dHJpYnV0ZVByb3RvW3RdKSlyZXR1cm4gImF0dHJpYnV0ZVByb3RvLiIrbn1pZihudWxsIT1lLm5vZGUmJmUuaGFzT3duUHJvcGVydHkoIm5vZGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSlyZXR1cm4gIm5vZGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5ub2RlLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguTm9kZVByb3RvLnZlcmlmeShlLm5vZGVbdF0pKXJldHVybiAibm9kZS4iK259aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5vcHNldEltcG9ydCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BzZXRJbXBvcnQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpcmV0dXJuICJvcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK3Qpe3ZhciBuO2lmKG49Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by52ZXJpZnkoZS5vcHNldEltcG9ydFt0XSkpcmV0dXJuICJvcHNldEltcG9ydC4iK259fXJldHVybiBudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFsLmlzU3RyaW5nKGUuZG9tYWluKT8iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LkZ1bmN0aW9uUHJvdG8pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5GdW5jdGlvblByb3RvO2lmKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmlucHV0OiBhcnJheSBleHBlY3RlZCIpO3QuaW5wdXQ9W107Zm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pdC5pbnB1dFtuXT1TdHJpbmcoZS5pbnB1dFtuXSk7fWlmKGUub3V0cHV0KXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vdXRwdXQ9W10sbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil0Lm91dHB1dFtuXT1TdHJpbmcoZS5vdXRwdXRbbl0pO31pZihlLmF0dHJpYnV0ZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5hdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuYXR0cmlidXRlPVtdLG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pdC5hdHRyaWJ1dGVbbl09U3RyaW5nKGUuYXR0cmlidXRlW25dKTt9aWYoZS5hdHRyaWJ1dGVQcm90byl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVQcm90bykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZVByb3RvOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LmF0dHJpYnV0ZVByb3RvPVtdLG49MDtuPGUuYXR0cmlidXRlUHJvdG8ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmF0dHJpYnV0ZVByb3RvW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5hdHRyaWJ1dGVQcm90bzogb2JqZWN0IGV4cGVjdGVkIik7dC5hdHRyaWJ1dGVQcm90b1tuXT1jLm9ubnguQXR0cmlidXRlUHJvdG8uZnJvbU9iamVjdChlLmF0dHJpYnV0ZVByb3RvW25dKTt9fWlmKGUubm9kZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ubm9kZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5ub2RlPVtdLG49MDtuPGUubm9kZS5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubm9kZVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ubm9kZTogb2JqZWN0IGV4cGVjdGVkIik7dC5ub2RlW25dPWMub25ueC5Ob2RlUHJvdG8uZnJvbU9iamVjdChlLm5vZGVbbl0pO319aWYobnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLm9wc2V0SW1wb3J0KXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQub3BzZXRJbXBvcnQ9W10sbj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUub3BzZXRJbXBvcnRbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLm9wc2V0SW1wb3J0OiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm9wc2V0SW1wb3J0W25dPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZnJvbU9iamVjdChlLm9wc2V0SW1wb3J0W25dKTt9fXJldHVybiBudWxsIT1lLmRvbWFpbiYmKHQuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi5hdHRyaWJ1dGU9W10sbi5ub2RlPVtdLG4ub3BzZXRJbXBvcnQ9W10sbi5hdHRyaWJ1dGVQcm90bz1bXSksdC5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLmRvY1N0cmluZz0iIixuLmRvbWFpbj0iIiksbnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aCl7bi5pbnB1dD1bXTtmb3IodmFyIHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrciluLmlucHV0W3JdPWUuaW5wdXRbcl07fWlmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG4ub3V0cHV0PVtdLHI9MDtyPGUub3V0cHV0Lmxlbmd0aDsrK3Ipbi5vdXRwdXRbcl09ZS5vdXRwdXRbcl07aWYoZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aClmb3Iobi5hdHRyaWJ1dGU9W10scj0wO3I8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrciluLmF0dHJpYnV0ZVtyXT1lLmF0dHJpYnV0ZVtyXTtpZihlLm5vZGUmJmUubm9kZS5sZW5ndGgpZm9yKG4ubm9kZT1bXSxyPTA7cjxlLm5vZGUubGVuZ3RoOysrciluLm5vZGVbcl09Yy5vbm54Lk5vZGVQcm90by50b09iamVjdChlLm5vZGVbcl0sdCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUub3BzZXRJbXBvcnQmJmUub3BzZXRJbXBvcnQubGVuZ3RoKWZvcihuLm9wc2V0SW1wb3J0PVtdLHI9MDtyPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrciluLm9wc2V0SW1wb3J0W3JdPWMub25ueC5PcGVyYXRvclNldElkUHJvdG8udG9PYmplY3QoZS5vcHNldEltcG9ydFtyXSx0KTtpZihudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksZS5hdHRyaWJ1dGVQcm90byYmZS5hdHRyaWJ1dGVQcm90by5sZW5ndGgpZm9yKG4uYXR0cmlidXRlUHJvdG89W10scj0wO3I8ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytyKW4uYXR0cmlidXRlUHJvdG9bcl09Yy5vbm54LkF0dHJpYnV0ZVByb3RvLnRvT2JqZWN0KGUuYXR0cmlidXRlUHJvdG9bcl0sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguRnVuY3Rpb25Qcm90byJ9LGV9KCksaSksZS5leHBvcnRzPWM7fSwzNDc0OihlLHQsbik9Pnt2YXIgcixvPShyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKHI9cnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7ZnVuY3Rpb24gdCgpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxqfWZ1bmN0aW9uIG8oKXtyZXR1cm4gJC5idWZmZXIhPWouYnVmZmVyJiZCKCksUn1mdW5jdGlvbiBpKCl7cmV0dXJuICQuYnVmZmVyIT1qLmJ1ZmZlciYmQigpLEx9ZnVuY3Rpb24gcygpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxDfWZ1bmN0aW9uIGEoKXtyZXR1cm4gJC5idWZmZXIhPWouYnVmZmVyJiZCKCksTX12YXIgdSxsLGM9ZTtjLnJlYWR5PW5ldyBQcm9taXNlKCgoZSx0KT0+e3U9ZSxsPXQ7fSkpO3ZhciBwLGQsZixoPU9iamVjdC5hc3NpZ24oe30sYyksZz0iLi90aGlzLnByb2dyYW0iLGI9KGUsdCk9Pnt0aHJvdyB0fSxtPSJvYmplY3QiPT10eXBlb2Ygd2luZG93LHk9ImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMsdj0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsXz1jLkVOVklST05NRU5UX0lTX1BUSFJFQUR8fCExLHc9IiI7ZnVuY3Rpb24gVChlKXtyZXR1cm4gYy5sb2NhdGVGaWxlP2MubG9jYXRlRmlsZShlLHcpOncrZX1pZih2KXt2YXIgeD1uKDEzODQpLE89big5MDgpO2xldCB0O3c9eT9PLmRpcm5hbWUodykrIi8iOl9fZGlybmFtZSsiLyIscD0oZSx0KT0+KGU9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTpPLm5vcm1hbGl6ZShlKSx4LnJlYWRGaWxlU3luYyhlLHQ/dm9pZCAwOiJ1dGY4IikpLGY9ZT0+KChlPXAoZSwhMCkpLmJ1ZmZlcnx8KGU9bmV3IFVpbnQ4QXJyYXkoZSkpLGUpLGQ9KGUsdCxuLHI9ITApPT57ZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOk8ubm9ybWFsaXplKGUpLHgucmVhZEZpbGUoZSxyP3ZvaWQgMDoidXRmOCIsKChlLG8pPT57ZT9uKGUpOnQocj9vLmJ1ZmZlcjpvKTt9KSk7fSwhYy50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYoZz1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpKSxwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksYj0oZSx0KT0+e3Rocm93IHByb2Nlc3MuZXhpdENvZGU9ZSx0fSxjLmluc3BlY3Q9KCk9PiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSI7dHJ5e3Q9big5OTI1KTt9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignVGhlICJ3b3JrZXJfdGhyZWFkcyIgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBub2RlLmpzIGJ1aWxkIC0gcGVyaGFwcyBhIG5ld2VyIHZlcnNpb24gaXMgbmVlZGVkPycpLGV9Y29tbW9uanNHbG9iYWwuV29ya2VyPXQuV29ya2VyO31lbHNlIChtfHx5KSYmKHk/dz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJih3PXIpLHc9MCE9PXcuaW5kZXhPZigiYmxvYjoiKT93LnN1YnN0cigwLHcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIix2fHwocD1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5zZW5kKG51bGwpLHQucmVzcG9uc2VUZXh0fSx5JiYoZj1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix0LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkodC5yZXNwb25zZSl9KSxkPShlLHQsbik9Pnt2YXIgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7ci5vcGVuKCJHRVQiLGUsITApLHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsci5vbmxvYWQ9KCk9PnsyMDA9PXIuc3RhdHVzfHwwPT1yLnN0YXR1cyYmci5yZXNwb25zZT90KHIucmVzcG9uc2UpOm4oKTt9LHIub25lcnJvcj1uLHIuc2VuZChudWxsKTt9KSk7diYmInVuZGVmaW5lZCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmKGNvbW1vbmpzR2xvYmFsLnBlcmZvcm1hbmNlPW4oNjk1MykucGVyZm9ybWFuY2UpO3ZhciBTPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksQT1jb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7diYmKFM9KC4uLmUpPT54LndyaXRlU3luYygxLGUuam9pbigiICIpKyJcbiIpLEE9KC4uLmUpPT54LndyaXRlU3luYygyLGUuam9pbigiICIpKyJcbiIpKTt2YXIgUCxJPWMucHJpbnR8fFMsRT1jLnByaW50RXJyfHxBO09iamVjdC5hc3NpZ24oYyxoKSxoPW51bGwsYy50aGlzUHJvZ3JhbSYmKGc9Yy50aGlzUHJvZ3JhbSksYy5xdWl0JiYoYj1jLnF1aXQpLGMud2FzbUJpbmFyeSYmKFA9Yy53YXNtQmluYXJ5KTt2YXIgRD1jLm5vRXhpdFJ1bnRpbWV8fCEwOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJm5lKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyICQsayxGLE4saixSLEwsQyxNLFU9ITE7ZnVuY3Rpb24gQigpe3ZhciBlPSQuYnVmZmVyO2MuSEVBUDg9aj1uZXcgSW50OEFycmF5KGUpLGMuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGMuSEVBUDMyPUw9bmV3IEludDMyQXJyYXkoZSksYy5IRUFQVTg9Uj1uZXcgVWludDhBcnJheShlKSxjLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGMuSEVBUFUzMj1DPW5ldyBVaW50MzJBcnJheShlKSxjLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxjLkhFQVBGNjQ9TT1uZXcgRmxvYXQ2NEFycmF5KGUpO312YXIgVj1jLklOSVRJQUxfTUVNT1JZfHwxNjc3NzIxNjtpZig1MjQyODgwPD1WfHxuZSgiSU5JVElBTF9NRU1PUlkgc2hvdWxkIGJlIGxhcmdlciB0aGFuIFNUQUNLX1NJWkUsIHdhcyAiK1YrIiEgKFNUQUNLX1NJWkU9NTI0Mjg4MCkiKSxfKSQ9Yy53YXNtTWVtb3J5O2Vsc2UgaWYoYy53YXNtTWVtb3J5KSQ9Yy53YXNtTWVtb3J5O2Vsc2UgaWYoISgoJD1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOlYvNjU1MzYsbWF4aW11bTo2NTUzNixzaGFyZWQ6ITB9KSkuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IEUoInJlcXVlc3RlZCBhIHNoYXJlZCBXZWJBc3NlbWJseS5NZW1vcnkgYnV0IHRoZSByZXR1cm5lZCBidWZmZXIgaXMgbm90IGEgU2hhcmVkQXJyYXlCdWZmZXIsIGluZGljYXRpbmcgdGhhdCB3aGlsZSB0aGUgYnJvd3NlciBoYXMgU2hhcmVkQXJyYXlCdWZmZXIgaXQgZG9lcyBub3QgaGF2ZSBXZWJBc3NlbWJseSB0aHJlYWRzIHN1cHBvcnQgLSB5b3UgbWF5IG5lZWQgdG8gc2V0IGEgZmxhZyIpLHYmJkUoIihvbiBub2RlIHlvdSBtYXkgbmVlZDogLS1leHBlcmltZW50YWwtd2FzbS10aHJlYWRzIC0tZXhwZXJpbWVudGFsLXdhc20tYnVsay1tZW1vcnkgYW5kL29yIHJlY2VudCB2ZXJzaW9uKSIpLEVycm9yKCJiYWQgbWVtb3J5Iik7QigpLFY9JC5idWZmZXIuYnl0ZUxlbmd0aDt2YXIgeixHPVtdLEg9W10sVz1bXSxxPTA7ZnVuY3Rpb24gWCgpe3JldHVybiBEfHwwPHF9dmFyIFksSyxKPTAsUT1udWxsO2Z1bmN0aW9uIGVlKCl7SisrLGMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKEopO31mdW5jdGlvbiB0ZSgpe2lmKEotLSxjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhKKSwwPT1KJiYoUSkpe3ZhciBlPVE7UT1udWxsLGUoKTt9fWZ1bmN0aW9uIG5lKGUpe3Rocm93IGMub25BYm9ydCYmYy5vbkFib3J0KGUpLEUoZT0iQWJvcnRlZCgiK2UrIikiKSxVPSEwLE49MSxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLGwoZSksZX1mdW5jdGlvbiByZShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9ZnVuY3Rpb24gb2UoZSl7aWYoZT09WSYmUClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoUCk7aWYoZilyZXR1cm4gZihlKTt0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQifWZ1bmN0aW9uIGllKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoIVAmJihtfHx5KSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGZldGNoJiYhZS5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKCh0PT57aWYoIXQub2spdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrZSsiJyI7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX0pKS5jYXRjaCgoKCk9Pm9lKGUpKSk7aWYoZClyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57ZChlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSksbik7fSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+b2UoZSkpKX0oZSkudGhlbigoZT0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSx0KSkpLnRoZW4oKGU9PmUpKS50aGVuKG4sKGU9PntFKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiK2UpLG5lKGUpO30pKX1mdW5jdGlvbiBzZShlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZTt9ZnVuY3Rpb24gYWUoZSl7ZS50ZXJtaW5hdGUoKSxlLm9ubWVzc2FnZT0oKT0+e307fWZ1bmN0aW9uIHVlKGUpeyhlPWdlLkZhW2VdKXx8bmUoKSxnZS5mYihlKTt9ZnVuY3Rpb24gbGUoZSl7dmFyIHQ9Z2UuWmEoKTtpZighdClyZXR1cm4gNjtnZS5JYS5wdXNoKHQpLGdlLkZhW2UuSGFdPXQsdC5IYT1lLkhhO3ZhciBuPXtjbWQ6InJ1biIsc3RhcnRfcm91dGluZTplLmdiLGFyZzplLllhLHB0aHJlYWRfcHRyOmUuSGF9O3JldHVybiB2JiZ0LnVucmVmKCksdC5wb3N0TWVzc2FnZShuLGUubWIpLDB9cmUoWT0ib3J0LXdhc20tdGhyZWFkZWQud2FzbSIpfHwoWT1UKFkpKTt2YXIgY2U9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAscGU9KGUsdCxuKT0+e3ZhciByPSh0Pj4+PTApK247Zm9yKG49dDtlW25dJiYhKG4+PXIpOykrK247aWYoMTY8bi10JiZlLmJ1ZmZlciYmY2UpcmV0dXJuIGNlLmRlY29kZShlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP2Uuc2xpY2UodCxuKTplLnN1YmFycmF5KHQsbikpO2ZvcihyPSIiO3Q8bjspe3ZhciBvPWVbdCsrXTtpZigxMjgmbyl7dmFyIGk9NjMmZVt0KytdO2lmKDE5Mj09KDIyNCZvKSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZvKTw8NnxpKTtlbHNlIHt2YXIgcz02MyZlW3QrK107NjU1MzY+KG89MjI0PT0oMjQwJm8pPygxNSZvKTw8MTJ8aTw8NnxzOig3Jm8pPDwxOHxpPDwxMnxzPDw2fDYzJmVbdCsrXSk/cis9U3RyaW5nLmZyb21DaGFyQ29kZShvKTooby09NjU1MzYscis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxvPj4xMCw1NjMyMHwxMDIzJm8pKTt9fWVsc2Ugcis9U3RyaW5nLmZyb21DaGFyQ29kZShvKTt9cmV0dXJuIHJ9LGRlPShlLHQpPT4oZT4+Pj0wKT9wZShvKCksZSx0KToiIjtmdW5jdGlvbiBmZShlKXtpZihfKXJldHVybiBYZSgxLDEsZSk7Tj1lLFgoKXx8KGdlLmhiKCksYy5vbkV4aXQmJmMub25FeGl0KGUpLFU9ITApLGIoZSxuZXcgc2UoZSkpO312YXIgaGU9ZT0+e2lmKE49ZSxfKXRocm93IG1lKGUpLCJ1bndpbmQiO2ZlKGUpO30sZ2U9e0xhOltdLElhOltdLFRhOltdLEZhOnt9LFBhOmZ1bmN0aW9uKCl7Xz9nZS5hYigpOmdlLiRhKCk7fSwkYTpmdW5jdGlvbigpe0cudW5zaGlmdCgoKCk9PntlZSgpLGdlLmJiKCgoKT0+dGUoKSkpO30pKTt9LGFiOmZ1bmN0aW9uKCl7Z2UucmVjZWl2ZU9iamVjdFRyYW5zZmVyPWdlLmViLGdlLnRocmVhZEluaXRUTFM9Z2UuU2EsZ2Uuc2V0RXhpdFN0YXR1cz1nZS5SYSxEPSExO30sUmE6ZnVuY3Rpb24oZSl7Tj1lO30scmI6WyIkdGVybWluYXRlV29ya2VyIl0saGI6ZnVuY3Rpb24oKXtmb3IodmFyIGUgb2YgZ2UuSWEpYWUoZSk7Zm9yKGUgb2YgZ2UuTGEpYWUoZSk7Z2UuTGE9W10sZ2UuSWE9W10sZ2UuRmE9W107fSxmYjpmdW5jdGlvbihlKXt2YXIgdD1lLkhhO2RlbGV0ZSBnZS5GYVt0XSxnZS5MYS5wdXNoKGUpLGdlLklhLnNwbGljZShnZS5JYS5pbmRleE9mKGUpLDEpLGUuSGE9MCx5dCh0KTt9LGViOmZ1bmN0aW9uKCl7fSxTYTpmdW5jdGlvbigpe2dlLlRhLmZvckVhY2goKGU9PmUoKSkpO30sY2I6ZT0+bmV3IFByb21pc2UoKHQ9PntlLm9ubWVzc2FnZT1uPT57dmFyIHI9KG49bi5kYXRhKS5jbWQ7aWYobi50YXJnZXRUaHJlYWQmJm4udGFyZ2V0VGhyZWFkIT1mdCgpKXt2YXIgbz1nZS5GYVtuLnFiXTtvP28ucG9zdE1lc3NhZ2UobixuLnRyYW5zZmVyTGlzdCk6RSgnSW50ZXJuYWwgZXJyb3IhIFdvcmtlciBzZW50IGEgbWVzc2FnZSAiJytyKyciIHRvIHRhcmdldCBwdGhyZWFkICcrbi50YXJnZXRUaHJlYWQrIiwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhIik7fWVsc2UgImNoZWNrTWFpbGJveCI9PT1yP1VlKCk6InNwYXduVGhyZWFkIj09PXI/bGUobik6ImNsZWFudXBUaHJlYWQiPT09cj91ZShuLnRocmVhZCk6ImtpbGxUaHJlYWQiPT09cj8obj1uLnRocmVhZCxyPWdlLkZhW25dLGRlbGV0ZSBnZS5GYVtuXSxhZShyKSx5dChuKSxnZS5JYS5zcGxpY2UoZ2UuSWEuaW5kZXhPZihyKSwxKSxyLkhhPTApOiJjYW5jZWxUaHJlYWQiPT09cj9nZS5GYVtuLnRocmVhZF0ucG9zdE1lc3NhZ2Uoe2NtZDoiY2FuY2VsIn0pOiJsb2FkZWQiPT09cj8oZS5sb2FkZWQ9ITAsdChlKSk6ImFsZXJ0Ij09PXI/YWxlcnQoIlRocmVhZCAiK24udGhyZWFkSWQrIjogIituLnRleHQpOiJzZXRpbW1lZGlhdGUiPT09bi50YXJnZXQ/ZS5wb3N0TWVzc2FnZShuKToiY2FsbEhhbmRsZXIiPT09cj9jW24uaGFuZGxlcl0oLi4ubi5hcmdzKTpyJiZFKCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgIityKTt9LGUub25lcnJvcj1lPT57dGhyb3cgRSgid29ya2VyIHNlbnQgYW4gZXJyb3IhICIrZS5maWxlbmFtZSsiOiIrZS5saW5lbm8rIjogIitlLm1lc3NhZ2UpLGV9LHYmJihlLm9uKCJtZXNzYWdlIiwoZnVuY3Rpb24odCl7ZS5vbm1lc3NhZ2Uoe2RhdGE6dH0pO30pKSxlLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2Uub25lcnJvcih0KTt9KSkpO3ZhciBuLG89W107Zm9yKG4gb2YgWyJvbkV4aXQiLCJvbkFib3J0IiwicHJpbnQiLCJwcmludEVyciJdKWMuaGFzT3duUHJvcGVydHkobikmJm8ucHVzaChuKTtlLnBvc3RNZXNzYWdlKHtjbWQ6ImxvYWQiLGhhbmRsZXJzOm8sdXJsT3JCbG9iOmMubWFpblNjcmlwdFVybE9yQmxvYnx8cix3YXNtTWVtb3J5OiQsd2FzbU1vZHVsZTpGfSk7fSkpLGJiOmZ1bmN0aW9uKGUpe2UoKTt9LFhhOmZ1bmN0aW9uKCl7dmFyIGU9VCgib3J0LXdhc20tdGhyZWFkZWQud29ya2VyLmpzIik7ZT1uZXcgV29ya2VyKGUpLGdlLkxhLnB1c2goZSk7fSxaYTpmdW5jdGlvbigpe3JldHVybiAwPT1nZS5MYS5sZW5ndGgmJihnZS5YYSgpLGdlLmNiKGdlLkxhWzBdKSksZ2UuTGEucG9wKCl9fTtjLlBUaHJlYWQ9Z2U7dmFyIGJlPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShjKTt9O2Z1bmN0aW9uIG1lKGUpe2lmKF8pcmV0dXJuIFhlKDIsMCxlKTtoZShlKTt9Yy5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7dmFyIGU9ZnQoKSx0PWkoKVtlKzUyPj4yPj4+MF07ZT1pKClbZSs1Nj4+Mj4+PjBdLFR0KHQsdC1lKSxPdCh0KTt9O3ZhciB5ZT1bXTtmdW5jdGlvbiB2ZShlKXt0aGlzLk9hPWUtMjQsdGhpcy5XYT1mdW5jdGlvbihlKXtzKClbdGhpcy5PYSs0Pj4yPj4+MF09ZTt9LHRoaXMuVmE9ZnVuY3Rpb24oZSl7cygpW3RoaXMuT2ErOD4+Mj4+PjBdPWU7fSx0aGlzLlBhPWZ1bmN0aW9uKGUsdCl7dGhpcy5VYSgpLHRoaXMuV2EoZSksdGhpcy5WYSh0KTt9LHRoaXMuVWE9ZnVuY3Rpb24oKXtzKClbdGhpcy5PYSsxNj4+Mj4+PjBdPTA7fTt9ZnVuY3Rpb24gX2UoZSx0LG4scil7cmV0dXJuIF8/WGUoMywxLGUsdCxuLHIpOndlKGUsdCxuLHIpfWZ1bmN0aW9uIHdlKGUsdCxuLHIpe2lmKGU+Pj49MCx0Pj4+PTAsbj4+Pj0wLHI+Pj49MCwidW5kZWZpbmVkIj09dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBFKCJDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlISIpLDY7dmFyIG89W107cmV0dXJuIF8mJjA9PT1vLmxlbmd0aD9fZShlLHQsbixyKTooZT17Z2I6bixIYTplLFlhOnIsbWI6b30sXz8oZS5vYj0ic3Bhd25UaHJlYWQiLHBvc3RNZXNzYWdlKGUsbyksMCk6bGUoZSkpfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gXz9YZSg0LDEsZSx0LG4pOjB9ZnVuY3Rpb24geGUoZSx0KXtpZihfKXJldHVybiBYZSg1LDEsZSx0KX1jLmludm9rZUVudHJ5UG9pbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj15ZVtlXTtufHwoZT49eWUubGVuZ3RoJiYoeWUubGVuZ3RoPWUrMSkseWVbZV09bj16LmdldChlKSksZT1uKHQpLFgoKT9nZS5SYShlKTp2dChlKTt9O3ZhciBPZT1lPT57Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lLmNoYXJDb2RlQXQobik7MTI3Pj1yP3QrKzoyMDQ3Pj1yP3QrPTI6NTUyOTY8PXImJjU3MzQzPj1yPyh0Kz00LCsrbik6dCs9Mzt9cmV0dXJuIHR9LFNlPShlLHQsbixyKT0+e2lmKCEoMDxyKSlyZXR1cm4gMDt2YXIgbz1uPj4+PTA7cj1uK3ItMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO2lmKDU1Mjk2PD1zJiY1NzM0Mz49cyYmKHM9NjU1MzYrKCgxMDIzJnMpPDwxMCl8MTAyMyZlLmNoYXJDb2RlQXQoKytpKSksMTI3Pj1zKXtpZihuPj1yKWJyZWFrO3RbbisrPj4+MF09czt9ZWxzZSB7aWYoMjA0Nz49cyl7aWYobisxPj1yKWJyZWFrO3RbbisrPj4+MF09MTkyfHM+PjY7fWVsc2Uge2lmKDY1NTM1Pj1zKXtpZihuKzI+PXIpYnJlYWs7dFtuKys+Pj4wXT0yMjR8cz4+MTI7fWVsc2Uge2lmKG4rMz49cilicmVhazt0W24rKz4+PjBdPTI0MHxzPj4xOCx0W24rKz4+PjBdPTEyOHxzPj4xMiY2Mzt9dFtuKys+Pj4wXT0xMjh8cz4+NiY2Mzt9dFtuKys+Pj4wXT0xMjh8NjMmczt9fXJldHVybiB0W24+Pj4wXT0wLG4tb30sQWU9KGUsdCxuKT0+U2UoZSxvKCksdCxuKTtmdW5jdGlvbiBQZShlLHQpe2lmKF8pcmV0dXJuIFhlKDYsMSxlLHQpfWZ1bmN0aW9uIEllKGUsdCxuKXtpZihfKXJldHVybiBYZSg3LDEsZSx0LG4pfWZ1bmN0aW9uIEVlKGUsdCxuKXtyZXR1cm4gXz9YZSg4LDEsZSx0LG4pOjB9ZnVuY3Rpb24gRGUoZSx0KXtpZihfKXJldHVybiBYZSg5LDEsZSx0KX1mdW5jdGlvbiAkZShlLHQsbil7aWYoXylyZXR1cm4gWGUoMTAsMSxlLHQsbil9ZnVuY3Rpb24ga2UoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMTEsMSxlLHQsbixyKX1mdW5jdGlvbiBGZShlLHQsbixyKXtpZihfKXJldHVybiBYZSgxMiwxLGUsdCxuLHIpfWZ1bmN0aW9uIE5lKGUsdCxuLHIpe2lmKF8pcmV0dXJuIFhlKDEzLDEsZSx0LG4scil9ZnVuY3Rpb24gamUoZSl7aWYoXylyZXR1cm4gWGUoMTQsMSxlKX1mdW5jdGlvbiBSZShlLHQpe2lmKF8pcmV0dXJuIFhlKDE1LDEsZSx0KX1mdW5jdGlvbiBMZShlLHQsbil7aWYoXylyZXR1cm4gWGUoMTYsMSxlLHQsbil9dmFyIENlPWU9PntpZighVSl0cnl7aWYoZSgpLCFYKCkpdHJ5e18/dnQoTik6aGUoTik7fWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBzZXx8InVud2luZCI9PWV8fGIoMSxlKTt9fWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBzZXx8InVud2luZCI9PWV8fGIoMSxlKTt9fTtmdW5jdGlvbiBNZShlKXtlPj4+PTAsImZ1bmN0aW9uIj09dHlwZW9mIEF0b21pY3MubmImJihBdG9taWNzLm5iKGkoKSxlPj4yLGUpLnZhbHVlLnRoZW4oVWUpLGUrPTEyOCxBdG9taWNzLnN0b3JlKGkoKSxlPj4yLDEpKTt9ZnVuY3Rpb24gVWUoKXt2YXIgZT1mdCgpO2UmJihNZShlKSxDZSgoKCk9Pl90KCkpKSk7fWMuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0PU1lLGMuY2hlY2tNYWlsYm94PVVlO3ZhciBCZT1lPT4wPT1lJTQmJigwIT1lJTEwMHx8MD09ZSU0MDApLFZlPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLHplPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdO2Z1bmN0aW9uIEdlKGUsdCxuLHIsbyxpLHMsYSl7cmV0dXJuIF8/WGUoMTcsMSxlLHQsbixyLG8saSxzLGEpOi01Mn1mdW5jdGlvbiBIZShlLHQsbixyLG8saSxzKXtpZihfKXJldHVybiBYZSgxOCwxLGUsdCxuLHIsbyxpLHMpfXZhciBXZT1lPT57dmFyIHQ9T2UoZSkrMSxuPWh0KHQpO3JldHVybiBuJiZBZShlLG4sdCksbn0scWU9ZT0+e3ZhciB0PXh0KCk7cmV0dXJuIGU9ZSgpLE90KHQpLGV9O2Z1bmN0aW9uIFhlKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aC0yLHI9YXJndW1lbnRzO3JldHVybiBxZSgoKCk9Pntmb3IodmFyIG89U3QoOCpuKSxpPW8+PjMscz0wO3M8bjtzKyspe3ZhciB1PXJbMitzXTthKClbaStzPj4+MF09dTt9cmV0dXJuIG10KGUsbixvLHQpfSkpfXZhciBZZSxLZT1bXSxKZT17fSxaZT0oKT0+e2lmKCFZZSl7dmFyIGUsdD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOigib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86Z3x8Ii4vdGhpcy5wcm9ncmFtIn07Zm9yKGUgaW4gSmUpdm9pZCAwPT09SmVbZV0/ZGVsZXRlIHRbZV06dFtlXT1KZVtlXTt2YXIgbj1bXTtmb3IoZSBpbiB0KW4ucHVzaChgJHtlfT0ke3RbZV19YCk7WWU9bjt9cmV0dXJuIFllfTtmdW5jdGlvbiBRZShlLG4pe2lmKF8pcmV0dXJuIFhlKDE5LDEsZSxuKTtlPj4+PTAsbj4+Pj0wO3ZhciByPTA7cmV0dXJuIFplKCkuZm9yRWFjaCgoZnVuY3Rpb24obyxpKXt2YXIgYT1uK3I7Zm9yKGk9cygpW2UrNCppPj4yPj4+MF09YSxhPTA7YTxvLmxlbmd0aDsrK2EpdCgpWygwfGkrKyk+Pj4wXT1vLmNoYXJDb2RlQXQoYSk7dCgpWygwfGkpPj4+MF09MCxyKz1vLmxlbmd0aCsxO30pKSwwfWZ1bmN0aW9uIGV0KGUsdCl7aWYoXylyZXR1cm4gWGUoMjAsMSxlLHQpO2U+Pj49MCx0Pj4+PTA7dmFyIG49WmUoKTtzKClbZT4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cis9ZS5sZW5ndGgrMTt9KSkscygpW3Q+PjI+Pj4wXT1yLDB9ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIF8/WGUoMjEsMSxlKTo1Mn1mdW5jdGlvbiBudChlLHQsbixyKXtyZXR1cm4gXz9YZSgyMiwxLGUsdCxuLHIpOjUyfWZ1bmN0aW9uIHJ0KGUsdCxuLHIsbyl7cmV0dXJuIF8/WGUoMjMsMSxlLHQsbixyLG8pOjcwfXZhciBvdD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gaXQoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMjQsMSxlLHQsbixyKTt0Pj4+PTAsbj4+Pj0wLHI+Pj49MDtmb3IodmFyIGk9MCxhPTA7YTxuO2ErKyl7dmFyIHU9cygpW3Q+PjI+Pj4wXSxsPXMoKVt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgYz0wO2M8bDtjKyspe3ZhciBwPW8oKVt1K2M+Pj4wXSxkPW90W2VdOzA9PT1wfHwxMD09PXA/KCgxPT09ZT9JOkUpKHBlKGQsMCkpLGQubGVuZ3RoPTApOmQucHVzaChwKTt9aSs9bDt9cmV0dXJuIHMoKVtyPj4yPj4+MF09aSwwfXZhciBzdD1lPT4oc3Q9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT4oZS5zZXQoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpKSksZSk7aWYodil0cnl7dmFyIGU9big3NjApO2lmKGUucmFuZG9tRmlsbFN5bmMpcmV0dXJuIHQ9PmUucmFuZG9tRmlsbFN5bmModCk7dmFyIHQ9ZS5yYW5kb21CeXRlcztyZXR1cm4gZT0+KGUuc2V0KHQoZS5ieXRlTGVuZ3RoKSksZSl9Y2F0Y2goZSl7fW5lKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYXQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1dD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLGx0PShlLG4pPT57dCgpLnNldChlLG4+Pj4wKTt9O2Z1bmN0aW9uIGN0KGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIGEoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIHUoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gbChlKXt2YXIgdD1lLkphO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUuS2ErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KEJlKGUuZ2V0RnVsbFllYXIoKSk/YXQ6dXQpW25dO2lmKCEodD5yLWUuZ2V0RGF0ZSgpKSl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpK3QpO2JyZWFrfXQtPXItZS5nZXREYXRlKCkrMSxlLnNldERhdGUoMSksMTE+bj9lLnNldE1vbnRoKG4rMSk6KGUuc2V0TW9udGgoMCksZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrMSkpO31yZXR1cm4gbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9dShuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSksbj11KG4pLDA+PWEodCxlKT8wPj1hKG4sZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAsbj4+Pj0wLHI+Pj49MDt2YXIgYz1pKClbcis0MD4+Mj4+PjBdO2Zvcih2YXIgcCBpbiByPXtrYjppKClbcj4+Mj4+PjBdLGpiOmkoKVtyKzQ+PjI+Pj4wXSxNYTppKClbcis4Pj4yPj4+MF0sUWE6aSgpW3IrMTI+PjI+Pj4wXSxOYTppKClbcisxNj4+Mj4+PjBdLEthOmkoKVtyKzIwPj4yPj4+MF0sR2E6aSgpW3IrMjQ+PjI+Pj4wXSxKYTppKClbcisyOD4+Mj4+PjBdLHNiOmkoKVtyKzMyPj4yPj4+MF0saWI6aSgpW3IrMzY+PjI+Pj4wXSxsYjpjP2RlKGMpOiIifSxuPWRlKG4pLGM9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KW49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0pO3ZhciBkPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxmPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihwIGluIGM9eyIlYSI6ZT0+ZFtlLkdhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmRbZS5HYV0sIiViIjplPT5mW2UuTmFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+ZltlLk5hXSwiJUMiOmU9PnMoKGUuS2ErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5zKGUuUWEsMiksIiVlIjplPT5vKGUuUWEsMiwiICIpLCIlZyI6ZT0+bChlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PmwoZSksIiVIIjplPT5zKGUuTWEsMiksIiVJIjplPT4oMD09KGU9ZS5NYSk/ZT0xMjoxMjxlJiYoZS09MTIpLHMoZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAsbj0wO248PWUuTmEtMTt0Kz0oQmUoZS5LYSsxOTAwKT9hdDp1dClbbisrXSk7cmV0dXJuIHMoZS5RYSt0LDMpfSwiJW0iOmU9PnMoZS5OYSsxLDIpLCIlTSI6ZT0+cyhlLmpiLDIpLCIlbiI6KCk9PiJcbiIsIiVwIjplPT4wPD1lLk1hJiYxMj5lLk1hPyJBTSI6IlBNIiwiJVMiOmU9PnMoZS5rYiwyKSwiJXQiOigpPT4iXHQiLCIldSI6ZT0+ZS5HYXx8NywiJVUiOmU9PnMoTWF0aC5mbG9vcigoZS5KYSs3LWUuR2EpLzcpLDIpLCIlViI6ZT0+e3ZhciB0PU1hdGguZmxvb3IoKGUuSmErNy0oZS5HYSs2KSU3KS83KTtpZigyPj0oZS5HYSszNzEtZS5KYS0yKSU3JiZ0KyssdCk1Mz09dCYmKDQ9PShuPShlLkdhKzM3MS1lLkphKSU3KXx8Mz09biYmQmUoZS5LYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLkdhKzctZS5KYS0xKSU3Oyg0PT1ufHw1PT1uJiZCZShlLkthJTQwMC0xKSkmJnQrKzt9cmV0dXJuIHModCwyKX0sIiV3IjplPT5lLkdhLCIlVyI6ZT0+cyhNYXRoLmZsb29yKChlLkphKzctKGUuR2ErNiklNykvNyksMiksIiV5IjplPT4oZS5LYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUuS2ErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLmliKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUubGIsIiUlIjooKT0+IiUifSxuPW4ucmVwbGFjZSgvJSUvZywiXDBcMCIpLGMpbi5pbmNsdWRlcyhwKSYmKG49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0ocikpKTtyZXR1cm4gcD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShPZShlKSsxKTtyZXR1cm4gU2UoZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSkscC5sZW5ndGg+dD8wOihsdChwLGUpLHAubGVuZ3RoLTEpfWdlLlBhKCk7dmFyIHB0PVtudWxsLGZlLG1lLF9lLFRlLHhlLFBlLEllLEVlLERlLCRlLGtlLEZlLE5lLGplLFJlLExlLEdlLEhlLFFlLGV0LHR0LG50LHJ0LGl0XSxkdD17YjpmdW5jdGlvbihlLHQsbil7dGhyb3cgbmV3IHZlKGU+Pj49MCkuUGEodD4+PjAsbj4+PjApLGV9LE46ZnVuY3Rpb24oZSl7Z3QoZT4+PjAsIXksMSwhbSwxMzEwNzIsITEpLGdlLlNhKCk7fSxrOmZ1bmN0aW9uKGUpe2U+Pj49MCxfP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6dWUoZSk7fSxJOndlLGg6VGUsVDp4ZSxFOlBlLEc6SWUsVTpFZSxSOkRlLEo6JGUsUTprZSxvOkZlLEY6TmUsQzpqZSxTOlJlLEQ6TGUscTooKT0+ITAsQTpmdW5jdGlvbihlLHQpeyhlPj4+PTApPT10Pj4+MD9zZXRUaW1lb3V0KCgoKT0+VWUoKSkpOl8/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPWdlLkZhW2VdKSYmZS5wb3N0TWVzc2FnZSh7Y21kOiJjaGVja01haWxib3gifSk7fSxMOmZ1bmN0aW9uKCl7cmV0dXJuIC0xfSxNOk1lLHA6ZnVuY3Rpb24oZSl7diYmZ2UuRmFbZT4+PjBdLnJlZigpO30sdDpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0VVRDSG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRVVENGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsaSgpW24rMjg+PjI+Pj4wXT1lO30sdTpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldERheSgpLHQ9KEJlKGUuZ2V0RnVsbFllYXIoKSk/VmU6emUpW2UuZ2V0TW9udGgoKV0rZS5nZXREYXRlKCktMXwwLGkoKVtuKzI4Pj4yPj4+MF09dCxpKClbbiszNj4+Mj4+PjBdPS02MCplLmdldFRpbWV6b25lT2Zmc2V0KCksdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciByPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7ZT0wfCh0IT1yJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKHIsdCkpLGkoKVtuKzMyPj4yPj4+MF09ZTt9LHY6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKGkoKVtlKzIwPj4yPj4+MF0rMTkwMCxpKClbZSsxNj4+Mj4+PjBdLGkoKVtlKzEyPj4yPj4+MF0saSgpW2UrOD4+Mj4+PjBdLGkoKVtlKzQ+PjI+Pj4wXSxpKClbZT4+Mj4+PjBdLDApLG49aSgpW2UrMzI+PjI+Pj4wXSxyPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLGE9TWF0aC5taW4ocyxvKTtyZXR1cm4gMD5uP2koKVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPXMmJmE9PXIpOjA8biE9KGE9PXIpJiYobz1NYXRoLm1heChzLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/YTpvKS1yKSkpLGkoKVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxuPShCZSh0LmdldEZ1bGxZZWFyKCkpP1ZlOnplKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxpKClbZSsyOD4+Mj4+PjBdPW4saSgpW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxpKClbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksaSgpW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxpKClbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLGkoKVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLGkoKVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsd3QoKEs9ZSwxPD0rTWF0aC5hYnMoSyk/MDxLPytNYXRoLmZsb29yKEsvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoSy0rKH5+Sz4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxyOkdlLHM6SGUsejpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1lPj4+PTAsdD4+Pj0wLG4+Pj49MDt2YXIgbz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksYT1uZXcgRGF0ZShvLDAsMSksdT1uZXcgRGF0ZShvLDYsMSk7bz1hLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIGw9dS5nZXRUaW1lem9uZU9mZnNldCgpLGM9TWF0aC5tYXgobyxsKTtzKClbZT4+Mj4+PjBdPTYwKmMsaSgpW3Q+PjI+Pj4wXT1OdW1iZXIobyE9bCksZT1yKGEpLHQ9cih1KSxlPVdlKGUpLHQ9V2UodCksbDxvPyhzKClbbj4+Mj4+PjBdPWUscygpW24rND4+Mj4+PjBdPXQpOihzKClbbj4+Mj4+PjBdPXQscygpW24rND4+Mj4+PjBdPWUpO30sYzooKT0+e25lKCIiKTt9LGw6ZnVuY3Rpb24oKXt9LGk6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sVjooKT0+e3Rocm93IHErPTEsInVud2luZCJ9LEI6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sZTooKT0+cGVyZm9ybWFuY2UudGltZU9yaWdpbitwZXJmb3JtYW5jZS5ub3coKSxmOmZ1bmN0aW9uKCl7cmV0dXJuIHY/bigzOTkzKS5jcHVzKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5fSxLOmZ1bmN0aW9uKGUsdCxuLHIpe2ZvcihnZS5wYj10Pj4+MCxLZS5sZW5ndGg9bix0PXI+Pj4wPj4zLHI9MDtyPG47cisrKUtlW3JdPWEoKVt0K3I+Pj4wXTtyZXR1cm4gcHRbZV0uYXBwbHkobnVsbCxLZSl9LHk6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW8oKS5sZW5ndGg7aWYoZTw9dHx8NDI5NDkwMTc2MDxlKXJldHVybiAhMTtmb3IodmFyIG49MTs0Pj1uO24qPTIpe3ZhciByPXQqKDErLjIvbik7cj1NYXRoLm1pbihyLGUrMTAwNjYzMjk2KTt2YXIgaT1NYXRoO3I9TWF0aC5tYXgoZSxyKTtlOntpPWkubWluLmNhbGwoaSw0Mjk0OTAxNzYwLHIrKDY1NTM2LXIlNjU1MzYpJTY1NTM2KS0kLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5eyQuZ3JvdyhpKSxCKCk7dmFyIHM9MTticmVhayBlfWNhdGNoKGUpe31zPXZvaWQgMDt9aWYocylyZXR1cm4gITB9cmV0dXJuICExfSxPOlFlLFA6ZXQsajpoZSxnOnR0LG46bnQsdzpydCxtOml0LHg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHQ+Pj49MCxzdChvKCkuc3ViYXJyYXkoZT4+PjAsZSt0Pj4+MCkpLDB9LGE6JHx8Yy53YXNtTWVtb3J5LEg6Y3QsZDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gY3QoZT4+PjAsdD4+PjAsbj4+PjAscj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPWUuZXhwb3J0cyxrPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAsbj1lPT50PT5lKHQpPj4+MDtyZXR1cm4gKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5wdGhyZWFkX3NlbGY9dChlLnB0aHJlYWRfc2VsZiksZS5tYWxsb2M9bihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPW4oZS5zdGFja0FsbG9jKSxlfShlKSxnZS5UYS5wdXNoKGsuc2EpLHo9ay50YSxILnVuc2hpZnQoay5XKSxGPXQsdGUoKSxlfXZhciB0PXthOmR0fTtpZihlZSgpLGMuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gYy5pbnN0YW50aWF0ZVdhc20odCxlKX1jYXRjaChlKXtFKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpLGwoZSk7fShmdW5jdGlvbihlLHQpe3ZhciBuPVk7cmV0dXJuIFB8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8cmUobil8fG4uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHx2fHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/aWUobixlLHQpOmZldGNoKG4se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChyPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyLGUpLnRoZW4odCwoZnVuY3Rpb24ocil7cmV0dXJuIEUoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK3IpLEUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksaWUobixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UsdC5tb2R1bGUpO30pKS5jYXRjaChsKTt9KCksYy5fT3J0SW5pdD0oZSx0KT0+KGMuX09ydEluaXQ9ay5YKShlLHQpLGMuX09ydEdldExhc3RFcnJvcj0oZSx0KT0+KGMuX09ydEdldExhc3RFcnJvcj1rLlkpKGUsdCksYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9KGUsdCxuLHIsbyxpLHMsYSx1LGwpPT4oYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9ay5aKShlLHQsbixyLG8saSxzLGEsdSxsKSxjLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj0oZSx0KT0+KGMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPWsuXykoZSx0KSxjLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT1rLiQpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZT0+KGMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1rLmFhKShlKSxjLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQsbik9PihjLl9PcnRDcmVhdGVTZXNzaW9uPWsuYmEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbj1lPT4oYy5fT3J0UmVsZWFzZVNlc3Npb249ay5jYSkoZSksYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD0oZSx0LG4pPT4oYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD1rLmRhKShlLHQsbiksYy5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oYy5fT3J0R2V0SW5wdXROYW1lPWsuZWEpKGUsdCksYy5fT3J0R2V0T3V0cHV0TmFtZT0oZSx0KT0+KGMuX09ydEdldE91dHB1dE5hbWU9ay5mYSkoZSx0KSxjLl9PcnRGcmVlPWU9PihjLl9PcnRGcmVlPWsuZ2EpKGUpLGMuX09ydENyZWF0ZVRlbnNvcj0oZSx0LG4scixvKT0+KGMuX09ydENyZWF0ZVRlbnNvcj1rLmhhKShlLHQsbixyLG8pLGMuX09ydEdldFRlbnNvckRhdGE9KGUsdCxuLHIsbyk9PihjLl9PcnRHZXRUZW5zb3JEYXRhPWsuaWEpKGUsdCxuLHIsbyksYy5fT3J0UmVsZWFzZVRlbnNvcj1lPT4oYy5fT3J0UmVsZWFzZVRlbnNvcj1rLmphKShlKSxjLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQsbixyKT0+KGMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9ay5rYSkoZSx0LG4sciksYy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PWsubGEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ay5tYSkoZSksYy5fT3J0UnVuPShlLHQsbixyLG8saSxzLGEpPT4oYy5fT3J0UnVuPWsubmEpKGUsdCxuLHIsbyxpLHMsYSksYy5fT3J0RW5kUHJvZmlsaW5nPWU9PihjLl9PcnRFbmRQcm9maWxpbmc9ay5vYSkoZSk7dmFyIGZ0PWMuX3B0aHJlYWRfc2VsZj0oKT0+KGZ0PWMuX3B0aHJlYWRfc2VsZj1rLnBhKSgpLGh0PWMuX21hbGxvYz1lPT4oaHQ9Yy5fbWFsbG9jPWsucWEpKGUpO2MuX2ZyZWU9ZT0+KGMuX2ZyZWU9ay5yYSkoZSksYy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9KCk9PihjLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1rLnNhKSgpO3ZhciBndD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD0oZSx0LG4scixvLGkpPT4oZ3Q9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9ay51YSkoZSx0LG4scixvLGkpO2MuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPSgpPT4oYy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9ay52YSkoKTt2YXIgYnQsbXQ9KGUsdCxuLHIpPT4obXQ9ay53YSkoZSx0LG4scikseXQ9ZT0+KHl0PWsueGEpKGUpLHZ0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PWU9Pih2dD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1rLnlhKShlKSxfdD1jLl9fZW1zY3JpcHRlbl9jaGVja19tYWlsYm94PSgpPT4oX3Q9Yy5fX2Vtc2NyaXB0ZW5fY2hlY2tfbWFpbGJveD1rLnphKSgpLHd0PWU9Pih3dD1rLkFhKShlKSxUdD0oZSx0KT0+KFR0PWsuQmEpKGUsdCkseHQ9KCk9Pih4dD1rLkNhKSgpLE90PWU9PihPdD1rLkRhKShlKSxTdD1lPT4oU3Q9ay5FYSkoZSk7ZnVuY3Rpb24gQXQoKXtmdW5jdGlvbiBlKCl7aWYoIWJ0JiYoYnQ9ITAsYy5jYWxsZWRSdW49ITAsIVUpJiYoX3x8YmUoSCksdShjKSxjLm9uUnVudGltZUluaXRpYWxpemVkJiZjLm9uUnVudGltZUluaXRpYWxpemVkKCksIV8pKXtpZihjLnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnBvc3RSdW4mJihjLnBvc3RSdW49W2MucG9zdFJ1bl0pO2MucG9zdFJ1bi5sZW5ndGg7KXt2YXIgZT1jLnBvc3RSdW4uc2hpZnQoKTtXLnVuc2hpZnQoZSk7fWJlKFcpO319aWYoISgwPEopKWlmKF8pdShjKSxffHxiZShIKSxzdGFydFdvcmtlcihjKTtlbHNlIHtpZihjLnByZVJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGMucHJlUnVuJiYoYy5wcmVSdW49W2MucHJlUnVuXSk7Yy5wcmVSdW4ubGVuZ3RoOylHLnVuc2hpZnQoYy5wcmVSdW4uc2hpZnQoKSk7YmUoRyksMDxKfHwoYy5zZXRTdGF0dXM/KGMuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Muc2V0U3RhdHVzKCIiKTt9KSwxKSxlKCk7fSksMSkpOmUoKSk7fX1pZihjLmtlZXBSdW50aW1lQWxpdmU9WCxjLndhc21NZW1vcnk9JCxjLnN0YWNrQWxsb2M9U3QsYy5zdGFja1NhdmU9eHQsYy5zdGFja1Jlc3RvcmU9T3QsYy5VVEY4VG9TdHJpbmc9ZGUsYy5zdHJpbmdUb1VURjg9QWUsYy5sZW5ndGhCeXRlc1VURjg9T2UsYy5FeGl0U3RhdHVzPXNlLGMuUFRocmVhZD1nZSxRPWZ1bmN0aW9uIGUoKXtidHx8QXQoKSxidHx8KFE9ZSk7fSxjLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZUluaXQmJihjLnByZUluaXQ9W2MucHJlSW5pdF0pOzA8Yy5wcmVJbml0Lmxlbmd0aDspYy5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEF0KCksZS5yZWFkeX0pO2UuZXhwb3J0cz1vO30sOTMyOihlLHQsbik9Pnt2YXIgcixvPShyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKHI9cnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7dmFyIHQsbyxpPWU7aS5yZWFkeT1uZXcgUHJvbWlzZSgoKGUsbik9Pnt0PWUsbz1uO30pKTt2YXIgcyxhLHUsbD1PYmplY3QuYXNzaWduKHt9LGkpLGM9Ii4vdGhpcy5wcm9ncmFtIixwPShlLHQpPT57dGhyb3cgdH0sZD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyxmPSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLGg9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLGc9IiI7aWYoaCl7dmFyIGI9bigxMzg0KSxtPW4oOTA4KTtnPWY/bS5kaXJuYW1lKGcpKyIvIjpfX2Rpcm5hbWUrIi8iLHM9KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksYi5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSx1PWU9PigoZT1zKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxhPShlLHQsbixyPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTptLm5vcm1hbGl6ZShlKSxiLnJlYWRGaWxlKGUscj92b2lkIDA6InV0ZjgiLCgoZSxvKT0+e2U/bihlKTp0KHI/by5idWZmZXI6byk7fSkpO30sIWkudGhpc1Byb2dyYW0mJjE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGM9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHA9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0saS5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iO31lbHNlIChkfHxmKSYmKGY/Zz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihnPXIpLGc9MCE9PWcuaW5kZXhPZigiYmxvYjoiKT9nLnN1YnN0cigwLGcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIixzPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LGYmJih1PWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGE9KGUsdCxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsZSwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP3Qoci5yZXNwb25zZSk6bigpO30sci5vbmVycm9yPW4sci5zZW5kKG51bGwpO30pO3ZhciB5LHY9aS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxfPWkucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGksbCksbD1udWxsLGkudGhpc1Byb2dyYW0mJihjPWkudGhpc1Byb2dyYW0pLGkucXVpdCYmKHA9aS5xdWl0KSxpLndhc21CaW5hcnkmJih5PWkud2FzbUJpbmFyeSk7dmFyIHc9aS5ub0V4aXRSdW50aW1lfHwhMDsib2JqZWN0IiE9dHlwZW9mIFdlYkFzc2VtYmx5JiZNKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIFQseCxPLFMsQSxQLEk9ITE7ZnVuY3Rpb24gRSgpe3ZhciBlPVQuYnVmZmVyO2kuSEVBUDg9Tz1uZXcgSW50OEFycmF5KGUpLGkuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGkuSEVBUDMyPUE9bmV3IEludDMyQXJyYXkoZSksaS5IRUFQVTg9Uz1uZXcgVWludDhBcnJheShlKSxpLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGkuSEVBUFUzMj1QPW5ldyBVaW50MzJBcnJheShlKSxpLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxpLkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShlKTt9dmFyIEQ9W10sJD1bXSxrPVtdO2Z1bmN0aW9uIEYoKXt2YXIgZT1pLnByZVJ1bi5zaGlmdCgpO0QudW5zaGlmdChlKTt9dmFyIE4saixSPTAsQz1udWxsO2Z1bmN0aW9uIE0oZSl7dGhyb3cgaS5vbkFib3J0JiZpLm9uQWJvcnQoZSksXyhlPSJBYm9ydGVkKCIrZSsiKSIpLEk9ITAsZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGUrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxvKGUpLGV9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9aWYoIVUoTj0ib3J0LXdhc20ud2FzbSIpKXt2YXIgQj1OO049aS5sb2NhdGVGaWxlP2kubG9jYXRlRmlsZShCLGcpOmcrQjt9ZnVuY3Rpb24gVihlKXtpZihlPT1OJiZ5KXJldHVybiBuZXcgVWludDhBcnJheSh5KTtpZih1KXJldHVybiB1KGUpO3Rocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24geihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCF5JiYoZHx8Zikpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK2UrIiciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKCgpPT5WKGUpKSk7aWYoYSlyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57YShlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSksbik7fSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+VihlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4obiwoZT0+e18oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksTShlKTt9KSl9ZnVuY3Rpb24gRyhlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZTt9dmFyIEg9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGkpO307ZnVuY3Rpb24gVyhlKXt0aGlzLnFhPWUtMjQsdGhpcy52YT1mdW5jdGlvbihlKXtQW3RoaXMucWErND4+Mj4+PjBdPWU7fSx0aGlzLnVhPWZ1bmN0aW9uKGUpe1BbdGhpcy5xYSs4Pj4yPj4+MF09ZTt9LHRoaXMuc2E9ZnVuY3Rpb24oZSx0KXt0aGlzLnRhKCksdGhpcy52YShlKSx0aGlzLnVhKHQpO30sdGhpcy50YT1mdW5jdGlvbigpe1BbdGhpcy5xYSsxNj4+Mj4+PjBdPTA7fTt9dmFyIHEsWD0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxZPShlLHQsbik9Pnt2YXIgcj0odD4+Pj0wKStuO2ZvcihuPXQ7ZVtuXSYmIShuPj1yKTspKytuO2lmKDE2PG4tdCYmZS5idWZmZXImJlgpcmV0dXJuIFguZGVjb2RlKGUuc3ViYXJyYXkodCxuKSk7Zm9yKHI9IiI7dDxuOyl7dmFyIG89ZVt0KytdO2lmKDEyOCZvKXt2YXIgaT02MyZlW3QrK107aWYoMTkyPT0oMjI0Jm8pKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJm8pPDw2fGkpO2Vsc2Uge3ZhciBzPTYzJmVbdCsrXTs2NTUzNj4obz0yMjQ9PSgyNDAmbyk/KDE1Jm8pPDwxMnxpPDw2fHM6KDcmbyk8PDE4fGk8PDEyfHM8PDZ8NjMmZVt0KytdKT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pOihvLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fG8+PjEwLDU2MzIwfDEwMjMmbykpO319ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO31yZXR1cm4gcn0sSz0oZSx0KT0+KGU+Pj49MCk/WShTLGUsdCk6IiIsSj1lPT57Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lLmNoYXJDb2RlQXQobik7MTI3Pj1yP3QrKzoyMDQ3Pj1yP3QrPTI6NTUyOTY8PXImJjU3MzQzPj1yPyh0Kz00LCsrbik6dCs9Mzt9cmV0dXJuIHR9LFo9KGUsdCxuLHIpPT57aWYoISgwPHIpKXJldHVybiAwO3ZhciBvPW4+Pj49MDtyPW4rci0xO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYoNTUyOTY8PXMmJjU3MzQzPj1zJiYocz02NTUzNisoKDEwMjMmcyk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK2kpKSwxMjc+PXMpe2lmKG4+PXIpYnJlYWs7dFtuKys+Pj4wXT1zO31lbHNlIHtpZigyMDQ3Pj1zKXtpZihuKzE+PXIpYnJlYWs7dFtuKys+Pj4wXT0xOTJ8cz4+Njt9ZWxzZSB7aWYoNjU1MzU+PXMpe2lmKG4rMj49cilicmVhazt0W24rKz4+PjBdPTIyNHxzPj4xMjt9ZWxzZSB7aWYobiszPj1yKWJyZWFrO3RbbisrPj4+MF09MjQwfHM+PjE4LHRbbisrPj4+MF09MTI4fHM+PjEyJjYzO310W24rKz4+PjBdPTEyOHxzPj42JjYzO310W24rKz4+PjBdPTEyOHw2MyZzO319cmV0dXJuIHRbbj4+PjBdPTAsbi1vfSxRPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksZWU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0sdGU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sbmU9ZT0+e3ZhciB0PUooZSkrMSxuPXBlKHQpO3JldHVybiBuJiZaKGUsUyxuLHQpLG59LHJlPXt9LG9lPSgpPT57aWYoIXEpe3ZhciBlLHQ9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmN8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihlIGluIHJlKXZvaWQgMD09PXJlW2VdP2RlbGV0ZSB0W2VdOnRbZV09cmVbZV07dmFyIG49W107Zm9yKGUgaW4gdCluLnB1c2goYCR7ZX09JHt0W2VdfWApO3E9bjt9cmV0dXJuIHF9LGllPVtudWxsLFtdLFtdXSxzZT1lPT4oc2U9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2lmKGgpdHJ5e3ZhciBlPW4oNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe31NKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYWU9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1ZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIGxlKGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIHMoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIGEoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLm1hO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUubmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KFEoZS5nZXRGdWxsWWVhcigpKT9hZTp1ZSlbbl07aWYoISh0PnItZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09ci1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5uP2Uuc2V0TW9udGgobisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSk7fXJldHVybiBuPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSsxLDAsNCksdD1hKG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDQpKSxuPWEobiksMD49cyh0LGUpPzA+PXMobixlKT9lLmdldEZ1bGxZZWFyKCkrMTplLmdldEZ1bGxZZWFyKCk6ZS5nZXRGdWxsWWVhcigpLTF9ZT4+Pj0wLHQ+Pj49MCxuPj4+PTA7dmFyIGw9QVs0MCsocj4+Pj0wKT4+Mj4+PjBdO2Zvcih2YXIgYyBpbiByPXt5YTpBW3I+PjI+Pj4wXSx4YTpBW3IrND4+Mj4+PjBdLG9hOkFbcis4Pj4yPj4+MF0scmE6QVtyKzEyPj4yPj4+MF0scGE6QVtyKzE2Pj4yPj4+MF0sbmE6QVtyKzIwPj4yPj4+MF0saGE6QVtyKzI0Pj4yPj4+MF0sbWE6QVtyKzI4Pj4yPj4+MF0sQWE6QVtyKzMyPj4yPj4+MF0sd2E6QVtyKzM2Pj4yPj4+MF0semE6bD9LKGwpOiIifSxuPUsobiksbD17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In0pbj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXSk7dmFyIHA9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLGQ9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKGMgaW4gbD17IiVhIjplPT5wW2UuaGFdLnN1YnN0cmluZygwLDMpLCIlQSI6ZT0+cFtlLmhhXSwiJWIiOmU9PmRbZS5wYV0uc3Vic3RyaW5nKDAsMyksIiVCIjplPT5kW2UucGFdLCIlQyI6ZT0+aSgoZS5uYSsxOTAwKS8xMDB8MCwyKSwiJWQiOmU9PmkoZS5yYSwyKSwiJWUiOmU9Pm8oZS5yYSwyLCIgIiksIiVnIjplPT51KGUpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlRyI6ZT0+dShlKSwiJUgiOmU9PmkoZS5vYSwyKSwiJUkiOmU9PigwPT0oZT1lLm9hKT9lPTEyOjEyPGUmJihlLT0xMiksaShlLDIpKSwiJWoiOmU9Pntmb3IodmFyIHQ9MCxuPTA7bjw9ZS5wYS0xO3QrPShRKGUubmErMTkwMCk/YWU6dWUpW24rK10pO3JldHVybiBpKGUucmErdCwzKX0sIiVtIjplPT5pKGUucGErMSwyKSwiJU0iOmU9PmkoZS54YSwyKSwiJW4iOigpPT4iXG4iLCIlcCI6ZT0+MDw9ZS5vYSYmMTI+ZS5vYT8iQU0iOiJQTSIsIiVTIjplPT5pKGUueWEsMiksIiV0IjooKT0+Ilx0IiwiJXUiOmU9PmUuaGF8fDcsIiVVIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy1lLmhhKS83KSwyKSwiJVYiOmU9Pnt2YXIgdD1NYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyk7aWYoMj49KGUuaGErMzcxLWUubWEtMiklNyYmdCsrLHQpNTM9PXQmJig0PT0obj0oZS5oYSszNzEtZS5tYSklNyl8fDM9PW4mJlEoZS5uYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLmhhKzctZS5tYS0xKSU3Oyg0PT1ufHw1PT1uJiZRKGUubmElNDAwLTEpKSYmdCsrO31yZXR1cm4gaSh0LDIpfSwiJXciOmU9PmUuaGEsIiVXIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy0oZS5oYSs2KSU3KS83KSwyKSwiJXkiOmU9PihlLm5hKzE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlWSI6ZT0+ZS5uYSsxOTAwLCIleiI6ZT0+e3ZhciB0PTA8PShlPWUud2EpO3JldHVybiBlPU1hdGguYWJzKGUpLzYwLCh0PyIrIjoiLSIpK1N0cmluZygiMDAwMCIrKGUvNjAqMTAwK2UlNjApKS5zbGljZSgtNCl9LCIlWiI6ZT0+ZS56YSwiJSUiOigpPT4iJSJ9LG49bi5yZXBsYWNlKC8lJS9nLCJcMFwwIiksbCluLmluY2x1ZGVzKGMpJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXShyKSkpO3JldHVybiBjPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KEooZSkrMSk7cmV0dXJuIFooZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSksYy5sZW5ndGg+dD8wOihPLnNldChjLGU+Pj4wKSxjLmxlbmd0aC0xKX12YXIgY2U9e2E6ZnVuY3Rpb24oZSx0LG4pe3Rocm93IG5ldyBXKGU+Pj49MCkuc2EodD4+PjAsbj4+PjApLGV9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSTpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sSzpmdW5jdGlvbigpe3JldHVybiAwfSxHOmZ1bmN0aW9uKCl7fSxCOmZ1bmN0aW9uKCl7fSxGOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx6OmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7fSx4OmZ1bmN0aW9uKCl7fSxrOigpPT4hMCxuOmZ1bmN0aW9uKGUsdCxuKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLG4+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxBW24rND4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLEFbbis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLEFbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLEFbbisxNj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxBW24rMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxBW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLEFbbisyOD4+Mj4+PjBdPShlLmdldFRpbWUoKS1EYXRlLlVUQyhlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwO30sbzpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksQVtuPj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksQVtuKzQ+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxBW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxBW24rMTI+PjI+Pj4wXT1lLmdldERhdGUoKSxBW24rMTY+PjI+Pj4wXT1lLmdldE1vbnRoKCksQVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsQVtuKzI0Pj4yPj4+MF09ZS5nZXREYXkoKSxBW24rMjg+PjI+Pj4wXT0oUShlLmdldEZ1bGxZZWFyKCkpP2VlOnRlKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxBW24rMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0FbbiszMj4+Mj4+PjBdPTB8KHQhPXImJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4ocix0KSk7fSxwOmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShBW2UrMjA+PjI+Pj4wXSsxOTAwLEFbZSsxNj4+Mj4+PjBdLEFbZSsxMj4+Mj4+PjBdLEFbZSs4Pj4yPj4+MF0sQVtlKzQ+PjI+Pj4wXSxBW2U+PjI+Pj4wXSwwKSxuPUFbZSszMj4+Mj4+PjBdLHI9dC5nZXRUaW1lem9uZU9mZnNldCgpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxpPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1NYXRoLm1pbihpLG8pO3JldHVybiAwPm4/QVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPWkmJnM9PXIpOjA8biE9KHM9PXIpJiYobz1NYXRoLm1heChpLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/czpvKS1yKSkpLEFbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCksQVtlKzI4Pj4yPj4+MF09KFEodC5nZXRGdWxsWWVhcigpKT9lZTp0ZSlbdC5nZXRNb250aCgpXSt0LmdldERhdGUoKS0xfDAsQVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksQVtlKzQ+PjI+Pj4wXT10LmdldE1pbnV0ZXMoKSxBW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxBW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxBW2UrMTY+PjI+Pj4wXT10LmdldE1vbnRoKCksQVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsZmUoKGo9ZSwxPD0rTWF0aC5hYnMoaik/MDxqPytNYXRoLmZsb29yKGovNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoai0rKH5+aj4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxsOmZ1bmN0aW9uKCl7cmV0dXJuIC01Mn0sbTpmdW5jdGlvbigpe30sdTpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1uPj4+PTA7dmFyIG89KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLGk9bmV3IERhdGUobywwLDEpLHM9bmV3IERhdGUobyw2LDEpO289aS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBhPXMuZ2V0VGltZXpvbmVPZmZzZXQoKTtQW2U+Pj4wPj4yPj4+MF09NjAqTWF0aC5tYXgobyxhKSxBW3Q+Pj4wPj4yPj4+MF09TnVtYmVyKG8hPWEpLGU9cihpKSx0PXIocyksZT1uZShlKSx0PW5lKHQpLGE8bz8oUFtuPj4yPj4+MF09ZSxQW24rND4+Mj4+PjBdPXQpOihQW24+PjI+Pj4wXT10LFBbbis0Pj4yPj4+MF09ZSk7fSxkOigpPT57TSgiIik7fSxoOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHY6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sYjooKT0+cGVyZm9ybWFuY2Uubm93KCksSjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ+Pj49MCxTLmNvcHlXaXRoaW4oZT4+PjA+Pj4wLHQ+Pj4wLHQrKG4+Pj4wKT4+PjApfSx0OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1TLmxlbmd0aDtpZig0Mjk0OTAxNzYwPGUpcmV0dXJuICExO2Zvcih2YXIgbj0xOzQ+PW47bio9Mil7dmFyIHI9dCooMSsuMi9uKTtyPU1hdGgubWluKHIsZSsxMDA2NjMyOTYpO3ZhciBvPU1hdGg7cj1NYXRoLm1heChlLHIpO2U6e289by5taW4uY2FsbChvLDQyOTQ5MDE3NjAscisoNjU1MzYtciU2NTUzNiklNjU1MzYpLVQuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNjt0cnl7VC5ncm93KG8pLEUoKTt2YXIgaT0xO2JyZWFrIGV9Y2F0Y2goZSl7fWk9dm9pZCAwO31pZihpKXJldHVybiAhMH1yZXR1cm4gITF9LEQ6ZnVuY3Rpb24oZSx0KXtlPj4+PTAsdD4+Pj0wO3ZhciBuPTA7cmV0dXJuIG9lKCkuZm9yRWFjaCgoZnVuY3Rpb24ocixvKXt2YXIgaT10K247Zm9yKG89UFtlKzQqbz4+Mj4+PjBdPWksaT0wO2k8ci5sZW5ndGg7KytpKU9bKDB8bysrKT4+PjBdPXIuY2hhckNvZGVBdChpKTtPWygwfG8pPj4+MF09MCxuKz1yLmxlbmd0aCsxO30pKSwwfSxFOmZ1bmN0aW9uKGUsdCl7ZT4+Pj0wLHQ+Pj49MDt2YXIgbj1vZSgpO1BbZT4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cis9ZS5sZW5ndGgrMTt9KSksUFt0Pj4yPj4+MF09ciwwfSxzOmU9Pnt3fHwoaS5vbkV4aXQmJmkub25FeGl0KGUpLEk9ITApLHAoZSxuZXcgRyhlKSk7fSxmOigpPT41MixqOmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxxOmZ1bmN0aW9uKCl7cmV0dXJuIDcwfSxpOmZ1bmN0aW9uKGUsdCxuLHIpe3Q+Pj49MCxuPj4+PTAscj4+Pj0wO2Zvcih2YXIgbz0wLGk9MDtpPG47aSsrKXt2YXIgcz1QW3Q+PjI+Pj4wXSxhPVBbdCs0Pj4yPj4+MF07dCs9ODtmb3IodmFyIHU9MDt1PGE7dSsrKXt2YXIgbD1TW3MrdT4+PjBdLGM9aWVbZV07MD09PWx8fDEwPT09bD8oKDE9PT1lP3Y6XykoWShjLDApKSxjLmxlbmd0aD0wKTpjLnB1c2gobCk7fW8rPWE7fXJldHVybiBQW3I+PjI+Pj4wXT1vLDB9LHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHNlKFMuc3ViYXJyYXkoZT4+PjAsZSsodD4+PjApPj4+MCkpLDB9LEM6bGUsYzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbGUoZT4+PjAsdD4+PjAsbj4+PjAscj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlPWUuZXhwb3J0cyx4PWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAsbj1lPT50PT5lKHQpPj4+MDtyZXR1cm4gKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5tYWxsb2M9bihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPW4oZS5zdGFja0FsbG9jKSxlfShlKSxUPXguTCxFKCksJC51bnNoaWZ0KHguTSksUi0tLGkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmaS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKFIpLDA9PVImJihDKSl7dmFyIHQ9QztDPW51bGwsdCgpO31yZXR1cm4gZX12YXIgdD17YTpjZX07aWYoUisrLGkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmaS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKFIpLGkuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gaS5pbnN0YW50aWF0ZVdhc20odCxlKX1jYXRjaChlKXtfKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpLG8oZSk7fShmdW5jdGlvbihlLHQpe3ZhciBuPU47cmV0dXJuIHl8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8VShuKXx8bi5zdGFydHNXaXRoKCJmaWxlOi8vIil8fGh8fCJmdW5jdGlvbiIhPXR5cGVvZiBmZXRjaD96KG4sZSx0KTpmZXRjaChuLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigocj0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocixlKS50aGVuKHQsKGZ1bmN0aW9uKHIpe3JldHVybiBfKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIityKSxfKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHoobixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UpO30pKS5jYXRjaChvKTt9KCksaS5fT3J0SW5pdD0oZSx0KT0+KGkuX09ydEluaXQ9eC5OKShlLHQpLGkuX09ydEdldExhc3RFcnJvcj0oZSx0KT0+KGkuX09ydEdldExhc3RFcnJvcj14Lk8pKGUsdCksaS5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9KGUsdCxuLHIsbyxzLGEsdSxsLGMpPT4oaS5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9eC5QKShlLHQsbixyLG8scyxhLHUsbCxjKSxpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj0oZSx0KT0+KGkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPXguUSkoZSx0KSxpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9KGUsdCxuKT0+KGkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT14LlIpKGUsdCxuKSxpLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZT0+KGkuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz14LlMpKGUpLGkuX09ydENyZWF0ZVNlc3Npb249KGUsdCxuKT0+KGkuX09ydENyZWF0ZVNlc3Npb249eC5UKShlLHQsbiksaS5fT3J0UmVsZWFzZVNlc3Npb249ZT0+KGkuX09ydFJlbGVhc2VTZXNzaW9uPXguVSkoZSksaS5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD0oZSx0LG4pPT4oaS5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD14LlYpKGUsdCxuKSxpLl9PcnRHZXRJbnB1dE5hbWU9KGUsdCk9PihpLl9PcnRHZXRJbnB1dE5hbWU9eC5XKShlLHQpLGkuX09ydEdldE91dHB1dE5hbWU9KGUsdCk9PihpLl9PcnRHZXRPdXRwdXROYW1lPXguWCkoZSx0KSxpLl9PcnRGcmVlPWU9PihpLl9PcnRGcmVlPXguWSkoZSksaS5fT3J0Q3JlYXRlVGVuc29yPShlLHQsbixyLG8pPT4oaS5fT3J0Q3JlYXRlVGVuc29yPXguWikoZSx0LG4scixvKSxpLl9PcnRHZXRUZW5zb3JEYXRhPShlLHQsbixyLG8pPT4oaS5fT3J0R2V0VGVuc29yRGF0YT14Ll8pKGUsdCxuLHIsbyksaS5fT3J0UmVsZWFzZVRlbnNvcj1lPT4oaS5fT3J0UmVsZWFzZVRlbnNvcj14LiQpKGUpLGkuX09ydENyZWF0ZVJ1bk9wdGlvbnM9KGUsdCxuLHIpPT4oaS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz14LmFhKShlLHQsbixyKSxpLl9PcnRBZGRSdW5Db25maWdFbnRyeT0oZSx0LG4pPT4oaS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9eC5iYSkoZSx0LG4pLGkuX09ydFJlbGVhc2VSdW5PcHRpb25zPWU9PihpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz14LmNhKShlKSxpLl9PcnRSdW49KGUsdCxuLHIsbyxzLGEsdSk9PihpLl9PcnRSdW49eC5kYSkoZSx0LG4scixvLHMsYSx1KSxpLl9PcnRFbmRQcm9maWxpbmc9ZT0+KGkuX09ydEVuZFByb2ZpbGluZz14LmVhKShlKTt2YXIgcGU9aS5fbWFsbG9jPWU9PihwZT1pLl9tYWxsb2M9eC5mYSkoZSk7aS5fZnJlZT1lPT4oaS5fZnJlZT14LmdhKShlKTt2YXIgZGUsZmU9ZT0+KGZlPXguaWEpKGUpLGhlPSgpPT4oaGU9eC5qYSkoKSxnZT1lPT4oZ2U9eC5rYSkoZSksYmU9ZT0+KGJlPXgubGEpKGUpO2Z1bmN0aW9uIG1lKCl7ZnVuY3Rpb24gZSgpe2lmKCFkZSYmKGRlPSEwLGkuY2FsbGVkUnVuPSEwLCFJKSl7aWYoSCgkKSx0KGkpLGkub25SdW50aW1lSW5pdGlhbGl6ZWQmJmkub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxpLnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBpLnBvc3RSdW4mJihpLnBvc3RSdW49W2kucG9zdFJ1bl0pO2kucG9zdFJ1bi5sZW5ndGg7KXt2YXIgZT1pLnBvc3RSdW4uc2hpZnQoKTtrLnVuc2hpZnQoZSk7fUgoayk7fX1pZighKDA8Uikpe2lmKGkucHJlUnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgaS5wcmVSdW4mJihpLnByZVJ1bj1baS5wcmVSdW5dKTtpLnByZVJ1bi5sZW5ndGg7KUYoKTtIKEQpLDA8Unx8KGkuc2V0U3RhdHVzPyhpLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLnNldFN0YXR1cygiIik7fSksMSksZSgpO30pLDEpKTplKCkpO319aWYoaS5zdGFja0FsbG9jPWJlLGkuc3RhY2tTYXZlPWhlLGkuc3RhY2tSZXN0b3JlPWdlLGkuVVRGOFRvU3RyaW5nPUssaS5zdHJpbmdUb1VURjg9KGUsdCxuKT0+WihlLFMsdCxuKSxpLmxlbmd0aEJ5dGVzVVRGOD1KLEM9ZnVuY3Rpb24gZSgpe2RlfHxtZSgpLGRlfHwoQz1lKTt9LGkucHJlSW5pdClmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGkucHJlSW5pdCYmKGkucHJlSW5pdD1baS5wcmVJbml0XSk7MDxpLnByZUluaXQubGVuZ3RoOylpLnByZUluaXQucG9wKCkoKTtyZXR1cm4gbWUoKSxlLnJlYWR5fSk7ZS5leHBvcnRzPW87fSw0NTM3OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wLG89MixpPSEwO288YXJndW1lbnRzLmxlbmd0aDspbltyKytdPWFyZ3VtZW50c1tvKytdO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxzKXtuW3JdPWZ1bmN0aW9uKGUpe2lmKGkpaWYoaT0hMSxlKXMoZSk7ZWxzZSB7Zm9yKHZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPHQubGVuZ3RoOyl0W24rK109YXJndW1lbnRzW25dO28uYXBwbHkobnVsbCx0KTt9fTt0cnl7ZS5hcHBseSh0fHxudWxsLG4pO31jYXRjaChlKXtpJiYoaT0hMSxzKGUpKTt9fSkpfTt9LDc0MTk6KGUsdCk9Pnt2YXIgbj10O24ubGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKCF0KXJldHVybiAwO2Zvcih2YXIgbj0wOy0tdCU0PjEmJiI9Ij09PWUuY2hhckF0KHQpOykrK247cmV0dXJuIE1hdGguY2VpbCgzKmUubGVuZ3RoKS80LW59O2Zvcih2YXIgcj1uZXcgQXJyYXkoNjQpLG89bmV3IEFycmF5KDEyMyksaT0wO2k8NjQ7KW9bcltpXT1pPDI2P2krNjU6aTw1Mj9pKzcxOmk8NjI/aS00OmktNTl8NDNdPWkrKztuLmVuY29kZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvLGk9bnVsbCxzPVtdLGE9MCx1PTA7dDxuOyl7dmFyIGw9ZVt0KytdO3N3aXRjaCh1KXtjYXNlIDA6c1thKytdPXJbbD4+Ml0sbz0oMyZsKTw8NCx1PTE7YnJlYWs7Y2FzZSAxOnNbYSsrXT1yW298bD4+NF0sbz0oMTUmbCk8PDIsdT0yO2JyZWFrO2Nhc2UgMjpzW2ErK109cltvfGw+PjZdLHNbYSsrXT1yWzYzJmxdLHU9MDt9YT44MTkxJiYoKGl8fChpPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzKSksYT0wKTt9cmV0dXJuIHUmJihzW2ErK109cltvXSxzW2ErK109NjEsMT09PXUmJihzW2ErK109NjEpKSxpPyhhJiZpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscy5zbGljZSgwLGEpKSksaS5qb2luKCIiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscy5zbGljZSgwLGEpKX07dmFyIHM9ImludmFsaWQgZW5jb2RpbmciO24uZGVjb2RlPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1uLGE9MCx1PTA7dTxlLmxlbmd0aDspe3ZhciBsPWUuY2hhckNvZGVBdCh1KyspO2lmKDYxPT09bCYmYT4xKWJyZWFrO2lmKHZvaWQgMD09PShsPW9bbF0pKXRocm93IEVycm9yKHMpO3N3aXRjaChhKXtjYXNlIDA6cj1sLGE9MTticmVhaztjYXNlIDE6dFtuKytdPXI8PDJ8KDQ4JmwpPj40LHI9bCxhPTI7YnJlYWs7Y2FzZSAyOnRbbisrXT0oMTUmcik8PDR8KDYwJmwpPj4yLHI9bCxhPTM7YnJlYWs7Y2FzZSAzOnRbbisrXT0oMyZyKTw8NnxsLGE9MDt9fWlmKDE9PT1hKXRocm93IEVycm9yKHMpO3JldHVybiBuLWl9LG4udGVzdD1mdW5jdGlvbihlKXtyZXR1cm4gL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3QoZSl9O30sOTIxMTplPT57ZnVuY3Rpb24gdCgpe3RoaXMuX2xpc3RlbmVycz17fTt9ZS5leHBvcnRzPXQsdC5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAodGhpcy5fbGlzdGVuZXJzW2VdfHwodGhpcy5fbGlzdGVuZXJzW2VdPVtdKSkucHVzaCh7Zm46dCxjdHg6bnx8dGhpc30pLHRoaXN9LHQucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PWUpdGhpcy5fbGlzdGVuZXJzPXt9O2Vsc2UgaWYodm9pZCAwPT09dCl0aGlzLl9saXN0ZW5lcnNbZV09W107ZWxzZSBmb3IodmFyIG49dGhpcy5fbGlzdGVuZXJzW2VdLHI9MDtyPG4ubGVuZ3RoOyluW3JdLmZuPT09dD9uLnNwbGljZShyLDEpOisrcjtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9saXN0ZW5lcnNbZV07aWYodCl7Zm9yKHZhciBuPVtdLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7KW4ucHVzaChhcmd1bWVudHNbcisrXSk7Zm9yKHI9MDtyPHQubGVuZ3RoOyl0W3JdLmZuLmFwcGx5KHRbcisrXS5jdHgsbik7fXJldHVybiB0aGlzfTt9LDk0NTplPT57ZnVuY3Rpb24gdChlKXtyZXR1cm4gInVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KFstMF0pLG49bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpLHI9MTI4PT09blszXTtmdW5jdGlvbiBvKGUscixvKXt0WzBdPWUscltvXT1uWzBdLHJbbysxXT1uWzFdLHJbbysyXT1uWzJdLHJbbyszXT1uWzNdO31mdW5jdGlvbiBpKGUscixvKXt0WzBdPWUscltvXT1uWzNdLHJbbysxXT1uWzJdLHJbbysyXT1uWzFdLHJbbyszXT1uWzBdO31mdW5jdGlvbiBzKGUscil7cmV0dXJuIG5bMF09ZVtyXSxuWzFdPWVbcisxXSxuWzJdPWVbcisyXSxuWzNdPWVbciszXSx0WzBdfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gblszXT1lW3JdLG5bMl09ZVtyKzFdLG5bMV09ZVtyKzJdLG5bMF09ZVtyKzNdLHRbMF19ZS53cml0ZUZsb2F0TEU9cj9vOmksZS53cml0ZUZsb2F0QkU9cj9pOm8sZS5yZWFkRmxvYXRMRT1yP3M6YSxlLnJlYWRGbG9hdEJFPXI/YTpzO30oKTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0LG4scil7dmFyIG89dDwwPzE6MDtpZihvJiYodD0tdCksMD09PXQpZSgxL3Q+MD8wOjIxNDc0ODM2NDgsbixyKTtlbHNlIGlmKGlzTmFOKHQpKWUoMjE0MzI4OTM0NCxuLHIpO2Vsc2UgaWYodD4zNDAyODIzNDY2Mzg1Mjg4NmUyMillKChvPDwzMXwyMTM5MDk1MDQwKT4+PjAsbixyKTtlbHNlIGlmKHQ8MTE3NTQ5NDM1MDgyMjI4NzVlLTU0KWUoKG88PDMxfE1hdGgucm91bmQodC8xNDAxMjk4NDY0MzI0ODE3ZS02MCkpPj4+MCxuLHIpO2Vsc2Uge3ZhciBpPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpO2UoKG88PDMxfGkrMTI3PDwyM3w4Mzg4NjA3Jk1hdGgucm91bmQodCpNYXRoLnBvdygyLC1pKSo4Mzg4NjA4KSk+Pj4wLG4scik7fX1mdW5jdGlvbiBzKGUsdCxuKXt2YXIgcj1lKHQsbiksbz0yKihyPj4zMSkrMSxpPXI+Pj4yMyYyNTUscz04Mzg4NjA3JnI7cmV0dXJuIDI1NT09PWk/cz9OYU46byooMS8wKTowPT09aT8xNDAxMjk4NDY0MzI0ODE3ZS02MCpvKnM6bypNYXRoLnBvdygyLGktMTUwKSoocys4Mzg4NjA4KX1lLndyaXRlRmxvYXRMRT10LmJpbmQobnVsbCxuKSxlLndyaXRlRmxvYXRCRT10LmJpbmQobnVsbCxyKSxlLnJlYWRGbG9hdExFPXMuYmluZChudWxsLG8pLGUucmVhZEZsb2F0QkU9cy5iaW5kKG51bGwsaSk7fSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQ2NEFycmF5P2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0NjRBcnJheShbLTBdKSxuPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxyPTEyOD09PW5bN107ZnVuY3Rpb24gbyhlLHIsbyl7dFswXT1lLHJbb109blswXSxyW28rMV09blsxXSxyW28rMl09blsyXSxyW28rM109blszXSxyW28rNF09bls0XSxyW28rNV09bls1XSxyW28rNl09bls2XSxyW28rN109bls3XTt9ZnVuY3Rpb24gaShlLHIsbyl7dFswXT1lLHJbb109bls3XSxyW28rMV09bls2XSxyW28rMl09bls1XSxyW28rM109bls0XSxyW28rNF09blszXSxyW28rNV09blsyXSxyW28rNl09blsxXSxyW28rN109blswXTt9ZnVuY3Rpb24gcyhlLHIpe3JldHVybiBuWzBdPWVbcl0sblsxXT1lW3IrMV0sblsyXT1lW3IrMl0sblszXT1lW3IrM10sbls0XT1lW3IrNF0sbls1XT1lW3IrNV0sbls2XT1lW3IrNl0sbls3XT1lW3IrN10sdFswXX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIG5bN109ZVtyXSxuWzZdPWVbcisxXSxuWzVdPWVbcisyXSxuWzRdPWVbciszXSxuWzNdPWVbcis0XSxuWzJdPWVbcis1XSxuWzFdPWVbcis2XSxuWzBdPWVbcis3XSx0WzBdfWUud3JpdGVEb3VibGVMRT1yP286aSxlLndyaXRlRG91YmxlQkU9cj9pOm8sZS5yZWFkRG91YmxlTEU9cj9zOmEsZS5yZWFkRG91YmxlQkU9cj9hOnM7fSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHQsbixyLG8saSl7dmFyIHM9cjwwPzE6MDtpZihzJiYocj0tciksMD09PXIpZSgwLG8saSt0KSxlKDEvcj4wPzA6MjE0NzQ4MzY0OCxvLGkrbik7ZWxzZSBpZihpc05hTihyKSllKDAsbyxpK3QpLGUoMjE0Njk1OTM2MCxvLGkrbik7ZWxzZSBpZihyPjE3OTc2OTMxMzQ4NjIzMTU3ZTI5MillKDAsbyxpK3QpLGUoKHM8PDMxfDIxNDY0MzUwNzIpPj4+MCxvLGkrbik7ZWxzZSB7dmFyIGE7aWYocjwyMjI1MDczODU4NTA3MjAxNGUtMzI0KWUoKGE9ci81ZS0zMjQpPj4+MCxvLGkrdCksZSgoczw8MzF8YS80Mjk0OTY3Mjk2KT4+PjAsbyxpK24pO2Vsc2Uge3ZhciB1PU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjIpOzEwMjQ9PT11JiYodT0xMDIzKSxlKDQ1MDM1OTk2MjczNzA0OTYqKGE9cipNYXRoLnBvdygyLC11KSk+Pj4wLG8saSt0KSxlKChzPDwzMXx1KzEwMjM8PDIwfDEwNDg1NzYqYSYxMDQ4NTc1KT4+PjAsbyxpK24pO319fWZ1bmN0aW9uIHMoZSx0LG4scixvKXt2YXIgaT1lKHIsbyt0KSxzPWUocixvK24pLGE9Mioocz4+MzEpKzEsdT1zPj4+MjAmMjA0NyxsPTQyOTQ5NjcyOTYqKDEwNDg1NzUmcykraTtyZXR1cm4gMjA0Nz09PXU/bD9OYU46YSooMS8wKTowPT09dT81ZS0zMjQqYSpsOmEqTWF0aC5wb3coMix1LTEwNzUpKihsKzQ1MDM1OTk2MjczNzA0OTYpfWUud3JpdGVEb3VibGVMRT10LmJpbmQobnVsbCxuLDAsNCksZS53cml0ZURvdWJsZUJFPXQuYmluZChudWxsLHIsNCwwKSxlLnJlYWREb3VibGVMRT1zLmJpbmQobnVsbCxvLDAsNCksZS5yZWFkRG91YmxlQkU9cy5iaW5kKG51bGwsaSw0LDApO30oKSxlfWZ1bmN0aW9uIG4oZSx0LG4pe3Rbbl09MjU1JmUsdFtuKzFdPWU+Pj44JjI1NSx0W24rMl09ZT4+PjE2JjI1NSx0W24rM109ZT4+PjI0O31mdW5jdGlvbiByKGUsdCxuKXt0W25dPWU+Pj4yNCx0W24rMV09ZT4+PjE2JjI1NSx0W24rMl09ZT4+PjgmMjU1LHRbbiszXT0yNTUmZTt9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiAoZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0KT4+PjB9ZnVuY3Rpb24gaShlLHQpe3JldHVybiAoZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9ZS5leHBvcnRzPXQodCk7fSw3MTk5Om1vZHVsZT0+e2Z1bmN0aW9uIGlucXVpcmUobW9kdWxlTmFtZSl7dHJ5e3ZhciBtb2Q9ZXZhbCgicXVpcmUiLnJlcGxhY2UoL14vLCJyZSIpKShtb2R1bGVOYW1lKTtpZihtb2QmJihtb2QubGVuZ3RofHxPYmplY3Qua2V5cyhtb2QpLmxlbmd0aCkpcmV0dXJuIG1vZH1jYXRjaChlKXt9cmV0dXJuIG51bGx9bW9kdWxlLmV4cG9ydHM9aW5xdWlyZTt9LDY2NjI6ZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnx8ODE5MixvPXI+Pj4xLGk9bnVsbCxzPXI7cmV0dXJuIGZ1bmN0aW9uKG4pe2lmKG48MXx8bj5vKXJldHVybiBlKG4pO3Mrbj5yJiYoaT1lKHIpLHM9MCk7dmFyIGE9dC5jYWxsKGkscyxzKz1uKTtyZXR1cm4gNyZzJiYocz0xKyg3fHMpKSxhfX07fSw0OTk3OihlLHQpPT57dmFyIG49dDtuLmxlbmd0aD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPTAscj0wO3I8ZS5sZW5ndGg7KytyKShuPWUuY2hhckNvZGVBdChyKSk8MTI4P3QrPTE6bjwyMDQ4P3QrPTI6NTUyOTY9PSg2NDUxMiZuKSYmNTYzMjA9PSg2NDUxMiZlLmNoYXJDb2RlQXQocisxKSk/KCsrcix0Kz00KTp0Kz0zO3JldHVybiB0fSxuLnJlYWQ9ZnVuY3Rpb24oZSx0LG4pe2lmKG4tdDwxKXJldHVybiAiIjtmb3IodmFyIHIsbz1udWxsLGk9W10scz0wO3Q8bjspKHI9ZVt0KytdKTwxMjg/aVtzKytdPXI6cj4xOTEmJnI8MjI0P2lbcysrXT0oMzEmcik8PDZ8NjMmZVt0KytdOnI+MjM5JiZyPDM2NT8ocj0oKDcmcik8PDE4fCg2MyZlW3QrK10pPDwxMnwoNjMmZVt0KytdKTw8Nnw2MyZlW3QrK10pLTY1NTM2LGlbcysrXT01NTI5Nisocj4+MTApLGlbcysrXT01NjMyMCsoMTAyMyZyKSk6aVtzKytdPSgxNSZyKTw8MTJ8KDYzJmVbdCsrXSk8PDZ8NjMmZVt0KytdLHM+ODE5MSYmKChvfHwobz1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaSkpLHM9MCk7cmV0dXJuIG8/KHMmJm8ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxpLnNsaWNlKDAscykpKSxvLmpvaW4oIiIpKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxpLnNsaWNlKDAscykpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsbyxpPW4scz0wO3M8ZS5sZW5ndGg7KytzKShyPWUuY2hhckNvZGVBdChzKSk8MTI4P3RbbisrXT1yOnI8MjA0OD8odFtuKytdPXI+PjZ8MTkyLHRbbisrXT02MyZyfDEyOCk6NTUyOTY9PSg2NDUxMiZyKSYmNTYzMjA9PSg2NDUxMiYobz1lLmNoYXJDb2RlQXQocysxKSkpPyhyPTY1NTM2KygoMTAyMyZyKTw8MTApKygxMDIzJm8pLCsrcyx0W24rK109cj4+MTh8MjQwLHRbbisrXT1yPj4xMiY2M3wxMjgsdFtuKytdPXI+PjYmNjN8MTI4LHRbbisrXT02MyZyfDEyOCk6KHRbbisrXT1yPj4xMnwyMjQsdFtuKytdPXI+PjYmNjN8MTI4LHRbbisrXT02MyZyfDEyOCk7cmV0dXJuIG4taX07fSwzNDQyOihlLHQpPT57dC5fX2VzTW9kdWxlPSEwO3ZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50OyBgdmFsdWVgIGhhcyBubyB2YWx1ZS4iKTt0aGlzLnZhbHVlPWUuRU1QVFksdCYmZS5pc0d1aWQodCkmJih0aGlzLnZhbHVlPXQpO31yZXR1cm4gZS5pc0d1aWQ9ZnVuY3Rpb24odCl7dmFyIG49dC50b1N0cmluZygpO3JldHVybiB0JiYodCBpbnN0YW5jZW9mIGV8fGUudmFsaWRhdG9yLnRlc3QobikpfSxlLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZShbZS5nZW4oMiksZS5nZW4oMSksZS5nZW4oMSksZS5nZW4oMSksZS5nZW4oMyldLmpvaW4oIi0iKSl9LGUuY3JlYXRlRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUoImVtcHR5Z3VpZCIpfSxlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5yYXc9ZnVuY3Rpb24oKXtyZXR1cm4gW2UuZ2VuKDIpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDMpXS5qb2luKCItIil9LGUuZ2VuPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0iIixuPTA7bjxlO24rKyl0Kz0oNjU1MzYqKDErTWF0aC5yYW5kb20oKSl8MCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBlLmlzR3VpZCh0KSYmdGhpcy52YWx1ZT09PXQudG9TdHJpbmcoKX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlPT09ZS5FTVBUWX0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHt2YWx1ZTp0aGlzLnZhbHVlfX0sZS52YWxpZGF0b3I9bmV3IFJlZ0V4cCgiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSQiLCJpIiksZS5FTVBUWT0iMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIixlfSgpO3QuR3VpZD1uO30sMjEwMDooZSx0LG4pPT57ZS5leHBvcnRzPW4oOTQ4Mik7fSw5NDgyOihlLHQsbik9Pnt2YXIgcj10O2Z1bmN0aW9uIG8oKXtyLnV0aWwuX2NvbmZpZ3VyZSgpLHIuV3JpdGVyLl9jb25maWd1cmUoci5CdWZmZXJXcml0ZXIpLHIuUmVhZGVyLl9jb25maWd1cmUoci5CdWZmZXJSZWFkZXIpO31yLmJ1aWxkPSJtaW5pbWFsIixyLldyaXRlcj1uKDExNzMpLHIuQnVmZmVyV3JpdGVyPW4oMzE1NSksci5SZWFkZXI9bigxNDA4KSxyLkJ1ZmZlclJlYWRlcj1uKDU5Myksci51dGlsPW4oOTY5Myksci5ycGM9big1OTk0KSxyLnJvb3RzPW4oNTA1NCksci5jb25maWd1cmU9byxvKCk7fSwxNDA4OihlLHQsbik9PntlLmV4cG9ydHM9dTt2YXIgcixvPW4oOTY5MyksaT1vLkxvbmdCaXRzLHM9by51dGY4O2Z1bmN0aW9uIGEoZSx0KXtyZXR1cm4gUmFuZ2VFcnJvcigiaW5kZXggb3V0IG9mIHJhbmdlOiAiK2UucG9zKyIgKyAiKyh0fHwxKSsiID4gIitlLmxlbil9ZnVuY3Rpb24gdShlKXt0aGlzLmJ1Zj1lLHRoaXMucG9zPTAsdGhpcy5sZW49ZS5sZW5ndGg7fXZhciBsLGM9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P2Z1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheS5pc0FycmF5KGUpKXJldHVybiBuZXcgdShlKTt0aHJvdyBFcnJvcigiaWxsZWdhbCBidWZmZXIiKX06ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gbmV3IHUoZSk7dGhyb3cgRXJyb3IoImlsbGVnYWwgYnVmZmVyIil9LHA9ZnVuY3Rpb24oKXtyZXR1cm4gby5CdWZmZXI/ZnVuY3Rpb24oZSl7cmV0dXJuICh1LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gby5CdWZmZXIuaXNCdWZmZXIoZSk/bmV3IHIoZSk6YyhlKX0pKGUpfTpjfTtmdW5jdGlvbiBkKCl7dmFyIGU9bmV3IGkoMCwwKSx0PTA7aWYoISh0aGlzLmxlbi10aGlzLnBvcz40KSl7Zm9yKDt0PDM7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgYSh0aGlzKTtpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfXJldHVybiBlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3MrK10pPDw3KnQpPj4+MCxlfWZvcig7dDw0OysrdClpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlO2lmKGUubG89KGUubG98KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyOCk+Pj4wLGUuaGk9KGUuaGl8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPj40KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlO2lmKHQ9MCx0aGlzLmxlbi10aGlzLnBvcz40KXtmb3IoO3Q8NTsrK3QpaWYoZS5oaT0oZS5oaXwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfWVsc2UgZm9yKDt0PDU7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgYSh0aGlzKTtpZihlLmhpPShlLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8Nyp0KzMpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGV9dGhyb3cgRXJyb3IoImludmFsaWQgdmFyaW50IGVuY29kaW5nIil9ZnVuY3Rpb24gZihlLHQpe3JldHVybiAoZVt0LTRdfGVbdC0zXTw8OHxlW3QtMl08PDE2fGVbdC0xXTw8MjQpPj4+MH1mdW5jdGlvbiBoKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBhKHRoaXMsOCk7cmV0dXJuIG5ldyBpKGYodGhpcy5idWYsdGhpcy5wb3MrPTQpLGYodGhpcy5idWYsdGhpcy5wb3MrPTQpKX11LmNyZWF0ZT1wKCksdS5wcm90b3R5cGUuX3NsaWNlPW8uQXJyYXkucHJvdG90eXBlLnN1YmFycmF5fHxvLkFycmF5LnByb3RvdHlwZS5zbGljZSx1LnByb3RvdHlwZS51aW50MzI9KGw9NDI5NDk2NzI5NSxmdW5jdGlvbigpe2lmKGw9KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYobD0obHwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYobD0obHwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDE0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBsO2lmKGw9KGx8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyMSk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbDtpZihsPShsfCgxNSZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwyOCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbDtpZigodGhpcy5wb3MrPTUpPnRoaXMubGVuKXRocm93IHRoaXMucG9zPXRoaXMubGVuLGEodGhpcywxMCk7cmV0dXJuIGx9KSx1LnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbigpe3JldHVybiAwfHRoaXMudWludDMyKCl9LHUucHJvdG90eXBlLnNpbnQzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCk7cmV0dXJuIGU+Pj4xXi0oMSZlKX0sdS5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy51aW50MzIoKX0sdS5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLDQpO3JldHVybiBmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuc2ZpeGVkMzI9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTtyZXR1cm4gMHxmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTt2YXIgZT1vLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX0sdS5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBhKHRoaXMsNCk7dmFyIGU9by5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfSx1LnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCksdD10aGlzLnBvcyxuPXRoaXMucG9zK2U7aWYobj50aGlzLmxlbil0aHJvdyBhKHRoaXMsZSk7cmV0dXJuIHRoaXMucG9zKz1lLEFycmF5LmlzQXJyYXkodGhpcy5idWYpP3RoaXMuYnVmLnNsaWNlKHQsbik6dD09PW4/bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApOnRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYsdCxuKX0sdS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ieXRlcygpO3JldHVybiBzLnJlYWQoZSwwLGUubGVuZ3RoKX0sdS5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKHRoaXMucG9zK2U+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLGUpO3RoaXMucG9zKz1lO31lbHNlIGRve2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBhKHRoaXMpfXdoaWxlKDEyOCZ0aGlzLmJ1Zlt0aGlzLnBvcysrXSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnNraXBUeXBlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDA6dGhpcy5za2lwKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcCg4KTticmVhaztjYXNlIDI6dGhpcy5za2lwKHRoaXMudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpmb3IoOzQhPShlPTcmdGhpcy51aW50MzIoKSk7KXRoaXMuc2tpcFR5cGUoZSk7YnJlYWs7Y2FzZSA1OnRoaXMuc2tpcCg0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHdpcmUgdHlwZSAiK2UrIiBhdCBvZmZzZXQgIit0aGlzLnBvcyl9cmV0dXJuIHRoaXN9LHUuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUsdS5jcmVhdGU9cCgpLHIuX2NvbmZpZ3VyZSgpO3ZhciB0PW8uTG9uZz8idG9Mb25nIjoidG9OdW1iZXIiO28ubWVyZ2UodS5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKVt0XSghMSl9LHVpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcylbdF0oITApfSxzaW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMCl9LHNmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMSl9fSk7fTt9LDU5MzooZSx0LG4pPT57ZS5leHBvcnRzPWk7dmFyIHI9bigxNDA4KTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIG89big5NjkzKTtmdW5jdGlvbiBpKGUpe3IuY2FsbCh0aGlzLGUpO31pLl9jb25maWd1cmU9ZnVuY3Rpb24oKXtvLkJ1ZmZlciYmKGkucHJvdG90eXBlLl9zbGljZT1vLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO30saS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aW50MzIoKTtyZXR1cm4gdGhpcy5idWYudXRmOFNsaWNlP3RoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSk6dGhpcy5idWYudG9TdHJpbmcoInV0Zi04Iix0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSl9LGkuX2NvbmZpZ3VyZSgpO30sNTA1NDplPT57ZS5leHBvcnRzPXt9O30sNTk5NDooZSx0LG4pPT57dC5TZXJ2aWNlPW4oNzk0OCk7fSw3OTQ4OihlLHQsbik9PntlLmV4cG9ydHM9bzt2YXIgcj1uKDk2OTMpO2Z1bmN0aW9uIG8oZSx0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcigicnBjSW1wbCBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyLkV2ZW50RW1pdHRlci5jYWxsKHRoaXMpLHRoaXMucnBjSW1wbD1lLHRoaXMucmVxdWVzdERlbGltaXRlZD1Cb29sZWFuKHQpLHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQ9Qm9vbGVhbihuKTt9KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5ycGNDYWxsPWZ1bmN0aW9uIGUodCxuLG8saSxzKXtpZighaSl0aHJvdyBUeXBlRXJyb3IoInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWQiKTt2YXIgYT10aGlzO2lmKCFzKXJldHVybiByLmFzUHJvbWlzZShlLGEsdCxuLG8saSk7aWYoYS5ycGNJbXBsKXRyeXtyZXR1cm4gYS5ycGNJbXBsKHQsblthLnJlcXVlc3REZWxpbWl0ZWQ/ImVuY29kZURlbGltaXRlZCI6ImVuY29kZSJdKGkpLmZpbmlzaCgpLChmdW5jdGlvbihlLG4pe2lmKGUpcmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKTtpZihudWxsIT09bil7aWYoIShuIGluc3RhbmNlb2YgbykpdHJ5e249b1thLnJlc3BvbnNlRGVsaW1pdGVkPyJkZWNvZGVEZWxpbWl0ZWQiOiJkZWNvZGUiXShuKTt9Y2F0Y2goZSl7cmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKX1yZXR1cm4gYS5lbWl0KCJkYXRhIixuLHQpLHMobnVsbCxuKX1hLmVuZCghMCk7fSkpfWNhdGNoKGUpe3JldHVybiBhLmVtaXQoImVycm9yIixlLHQpLHZvaWQgc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKGUpO30pLDApfWVsc2Ugc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKEVycm9yKCJhbHJlYWR5IGVuZGVkIikpO30pLDApO30sby5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJwY0ltcGwmJihlfHx0aGlzLnJwY0ltcGwobnVsbCxudWxsLG51bGwpLHRoaXMucnBjSW1wbD1udWxsLHRoaXMuZW1pdCgiZW5kIikub2ZmKCkpLHRoaXN9O30sMTk0NTooZSx0LG4pPT57ZS5leHBvcnRzPW87dmFyIHI9big5NjkzKTtmdW5jdGlvbiBvKGUsdCl7dGhpcy5sbz1lPj4+MCx0aGlzLmhpPXQ+Pj4wO312YXIgaT1vLnplcm89bmV3IG8oMCwwKTtpLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGkuenpFbmNvZGU9aS56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiAxfTt2YXIgcz1vLnplcm9IYXNoPSJcMFwwXDBcMFwwXDBcMFwwIjtvLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoMD09PWUpcmV0dXJuIGk7dmFyIHQ9ZTwwO3QmJihlPS1lKTt2YXIgbj1lPj4+MCxyPShlLW4pLzQyOTQ5NjcyOTY+Pj4wO3JldHVybiB0JiYocj1+cj4+PjAsbj1+bj4+PjAsKytuPjQyOTQ5NjcyOTUmJihuPTAsKytyPjQyOTQ5NjcyOTUmJihyPTApKSksbmV3IG8obixyKX0sby5mcm9tPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gby5mcm9tTnVtYmVyKGUpO2lmKHIuaXNTdHJpbmcoZSkpe2lmKCFyLkxvbmcpcmV0dXJuIG8uZnJvbU51bWJlcihwYXJzZUludChlLDEwKSk7ZT1yLkxvbmcuZnJvbVN0cmluZyhlKTt9cmV0dXJuIGUubG93fHxlLmhpZ2g/bmV3IG8oZS5sb3c+Pj4wLGUuaGlnaD4+PjApOml9LG8ucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKCFlJiZ0aGlzLmhpPj4+MzEpe3ZhciB0PTErfnRoaXMubG8+Pj4wLG49fnRoaXMuaGk+Pj4wO3JldHVybiB0fHwobj1uKzE+Pj4wKSwtKHQrNDI5NDk2NzI5NipuKX1yZXR1cm4gdGhpcy5sbys0Mjk0OTY3Mjk2KnRoaXMuaGl9LG8ucHJvdG90eXBlLnRvTG9uZz1mdW5jdGlvbihlKXtyZXR1cm4gci5Mb25nP25ldyByLkxvbmcoMHx0aGlzLmxvLDB8dGhpcy5oaSxCb29sZWFuKGUpKTp7bG93OjB8dGhpcy5sbyxoaWdoOjB8dGhpcy5oaSx1bnNpZ25lZDpCb29sZWFuKGUpfX07dmFyIGE9U3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0O28uZnJvbUhhc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1zP2k6bmV3IG8oKGEuY2FsbChlLDApfGEuY2FsbChlLDEpPDw4fGEuY2FsbChlLDIpPDwxNnxhLmNhbGwoZSwzKTw8MjQpPj4+MCwoYS5jYWxsKGUsNCl8YS5jYWxsKGUsNSk8PDh8YS5jYWxsKGUsNik8PDE2fGEuY2FsbChlLDcpPDwyNCk+Pj4wKX0sby5wcm90b3R5cGUudG9IYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnRoaXMubG8sdGhpcy5sbz4+PjgmMjU1LHRoaXMubG8+Pj4xNiYyNTUsdGhpcy5sbz4+PjI0LDI1NSZ0aGlzLmhpLHRoaXMuaGk+Pj44JjI1NSx0aGlzLmhpPj4+MTYmMjU1LHRoaXMuaGk+Pj4yNCl9LG8ucHJvdG90eXBlLnp6RW5jb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaT4+MzE7cmV0dXJuIHRoaXMuaGk9KCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSleZSk+Pj4wLHRoaXMubG89KHRoaXMubG88PDFeZSk+Pj4wLHRoaXN9LG8ucHJvdG90eXBlLnp6RGVjb2RlPWZ1bmN0aW9uKCl7dmFyIGU9LSgxJnRoaXMubG8pO3JldHVybiB0aGlzLmxvPSgodGhpcy5sbz4+PjF8dGhpcy5oaTw8MzEpXmUpPj4+MCx0aGlzLmhpPSh0aGlzLmhpPj4+MV5lKT4+PjAsdGhpc30sby5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sbyx0PSh0aGlzLmxvPj4+Mjh8dGhpcy5oaTw8NCk+Pj4wLG49dGhpcy5oaT4+PjI0O3JldHVybiAwPT09bj8wPT09dD9lPDE2Mzg0P2U8MTI4PzE6MjplPDIwOTcxNTI/Mzo0OnQ8MTYzODQ/dDwxMjg/NTo2OnQ8MjA5NzE1Mj83Ojg6bjwxMjg/OToxMH07fSw5NjkzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10O2Z1bmN0aW9uIG8oZSx0LG4pe2Zvcih2YXIgcj1PYmplY3Qua2V5cyh0KSxvPTA7bzxyLmxlbmd0aDsrK28pdm9pZCAwIT09ZVtyW29dXSYmbnx8KGVbcltvXV09dFtyW29dXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KGUsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHQpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOihuZXcgRXJyb3IpLnN0YWNrfHwiIn0pLG4mJm8odGhpcyxuKTt9cmV0dXJuIHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0sbmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDp2b2lkIDAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LHRvU3RyaW5nOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLHR9ci5hc1Byb21pc2U9big0NTM3KSxyLmJhc2U2ND1uKDc0MTkpLHIuRXZlbnRFbWl0dGVyPW4oOTIxMSksci5mbG9hdD1uKDk0NSksci5pbnF1aXJlPW4oNzE5OSksci51dGY4PW4oNDk5Nyksci5wb29sPW4oNjY2Miksci5Mb25nQml0cz1uKDE5NDUpLHIuaXNOb2RlPUJvb2xlYW4odm9pZCAwIT09Y29tbW9uanNHbG9iYWwmJmNvbW1vbmpzR2xvYmFsJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpLHIuZ2xvYmFsPXIuaXNOb2RlJiZjb21tb25qc0dsb2JhbHx8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmfHx0aGlzLHIuZW1wdHlBcnJheT1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdLHIuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZT9PYmplY3QuZnJlZXplKHt9KTp7fSxyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbihlKXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlJiZpc0Zpbml0ZShlKSYmTWF0aC5mbG9vcihlKT09PWV9LHIuaXNTdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuICJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZ30sci5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlfSxyLmlzc2V0PXIuaXNTZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW3RdO3JldHVybiAhKG51bGw9PW58fCFlLmhhc093blByb3BlcnR5KHQpKSYmKCJvYmplY3QiIT10eXBlb2Ygbnx8KEFycmF5LmlzQXJyYXkobik/bi5sZW5ndGg6T2JqZWN0LmtleXMobikubGVuZ3RoKT4wKX0sci5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci5pbnF1aXJlKCJidWZmZXIiKS5CdWZmZXI7cmV0dXJuIGUucHJvdG90eXBlLnV0ZjhXcml0ZT9lOm51bGx9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSgpLHIuX0J1ZmZlcl9mcm9tPW51bGwsci5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGwsci5uZXdCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuICJudW1iZXIiPT10eXBlb2YgZT9yLkJ1ZmZlcj9yLl9CdWZmZXJfYWxsb2NVbnNhZmUoZSk6bmV3IHIuQXJyYXkoZSk6ci5CdWZmZXI/ci5fQnVmZmVyX2Zyb20oZSk6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5P2U6bmV3IFVpbnQ4QXJyYXkoZSl9LHIuQXJyYXk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksci5Mb25nPXIuZ2xvYmFsLmRjb2RlSU8mJnIuZ2xvYmFsLmRjb2RlSU8uTG9uZ3x8ci5nbG9iYWwuTG9uZ3x8ci5pbnF1aXJlKCJsb25nIiksci5rZXkyUmU9L150cnVlfGZhbHNlfDB8MSQvLHIua2V5MzJSZT0vXi0/KD86MHxbMS05XVswLTldKikkLyxyLmtleTY0UmU9L14oPzpbXFx4MDAtXFx4ZmZdezh9fC0/KD86MHxbMS05XVswLTldKikpJC8sci5sb25nVG9IYXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlP3IuTG9uZ0JpdHMuZnJvbShlKS50b0hhc2goKTpyLkxvbmdCaXRzLnplcm9IYXNofSxyLmxvbmdGcm9tSGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXIuTG9uZ0JpdHMuZnJvbUhhc2goZSk7cmV0dXJuIHIuTG9uZz9yLkxvbmcuZnJvbUJpdHMobi5sbyxuLmhpLHQpOm4udG9OdW1iZXIoQm9vbGVhbih0KSl9LHIubWVyZ2U9byxyLmxjRmlyc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9LHIubmV3RXJyb3I9aSxyLlByb3RvY29sRXJyb3I9aSgiUHJvdG9jb2xFcnJvciIpLHIub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOysrbil0W2Vbbl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMpLG49ZS5sZW5ndGgtMTtuPi0xOy0tbilpZigxPT09dFtlW25dXSYmdm9pZCAwIT09dGhpc1tlW25dXSYmbnVsbCE9PXRoaXNbZVtuXV0pcmV0dXJuIGVbbl19fSxyLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbillW25dIT09dCYmZGVsZXRlIHRoaXNbZVtuXV07fX0sci50b0pTT05PcHRpb25zPXtsb25nczpTdHJpbmcsZW51bXM6U3RyaW5nLGJ5dGVzOlN0cmluZyxqc29uOiEwfSxyLl9jb25maWd1cmU9ZnVuY3Rpb24oKXt2YXIgZT1yLkJ1ZmZlcjtlPyhyLl9CdWZmZXJfZnJvbT1lLmZyb20hPT1VaW50OEFycmF5LmZyb20mJmUuZnJvbXx8ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IGUodCxuKX0sci5fQnVmZmVyX2FsbG9jVW5zYWZlPWUuYWxsb2NVbnNhZmV8fGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0pOnIuX0J1ZmZlcl9mcm9tPXIuX0J1ZmZlcl9hbGxvY1Vuc2FmZT1udWxsO307fSwxMTczOihlLHQsbik9PntlLmV4cG9ydHM9cDt2YXIgcixvPW4oOTY5MyksaT1vLkxvbmdCaXRzLHM9by5iYXNlNjQsYT1vLnV0Zjg7ZnVuY3Rpb24gdShlLHQsbil7dGhpcy5mbj1lLHRoaXMubGVuPXQsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1uO31mdW5jdGlvbiBsKCl7fWZ1bmN0aW9uIGMoZSl7dGhpcy5oZWFkPWUuaGVhZCx0aGlzLnRhaWw9ZS50YWlsLHRoaXMubGVuPWUubGVuLHRoaXMubmV4dD1lLnN0YXRlczt9ZnVuY3Rpb24gcCgpe3RoaXMubGVuPTAsdGhpcy5oZWFkPW5ldyB1KGwsMCwwKSx0aGlzLnRhaWw9dGhpcy5oZWFkLHRoaXMuc3RhdGVzPW51bGw7fXZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIG8uQnVmZmVyP2Z1bmN0aW9uKCl7cmV0dXJuIChwLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcn0pKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwfX07ZnVuY3Rpb24gZihlLHQsbil7dFtuXT0yNTUmZTt9ZnVuY3Rpb24gaChlLHQpe3RoaXMubGVuPWUsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD10O31mdW5jdGlvbiBnKGUsdCxuKXtmb3IoO2UuaGk7KXRbbisrXT0xMjcmZS5sb3wxMjgsZS5sbz0oZS5sbz4+Pjd8ZS5oaTw8MjUpPj4+MCxlLmhpPj4+PTc7Zm9yKDtlLmxvPjEyNzspdFtuKytdPTEyNyZlLmxvfDEyOCxlLmxvPWUubG8+Pj43O3RbbisrXT1lLmxvO31mdW5jdGlvbiBiKGUsdCxuKXt0W25dPTI1NSZlLHRbbisxXT1lPj4+OCYyNTUsdFtuKzJdPWU+Pj4xNiYyNTUsdFtuKzNdPWU+Pj4yNDt9cC5jcmVhdGU9ZCgpLHAuYWxsb2M9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvLkFycmF5KGUpfSxvLkFycmF5IT09QXJyYXkmJihwLmFsbG9jPW8ucG9vbChwLmFsbG9jLG8uQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KSkscC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IHUoZSx0LG4pLHRoaXMubGVuKz10LHRoaXN9LGgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpLGgucHJvdG90eXBlLmZuPWZ1bmN0aW9uKGUsdCxuKXtmb3IoO2U+MTI3Oyl0W24rK109MTI3JmV8MTI4LGU+Pj49Nzt0W25dPWU7fSxwLnByb3RvdHlwZS51aW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGVuKz0odGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBoKChlPj4+PTApPDEyOD8xOmU8MTYzODQ/MjplPDIwOTcxNTI/MzplPDI2ODQzNTQ1Nj80OjUsZSkpLmxlbix0aGlzfSxwLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gZTwwP3RoaXMuX3B1c2goZywxMCxpLmZyb21OdW1iZXIoZSkpOnRoaXMudWludDMyKGUpfSxwLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudWludDMyKChlPDwxXmU+PjMxKT4+PjApfSxwLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGcsdC5sZW5ndGgoKSx0KX0scC5wcm90b3R5cGUuaW50NjQ9cC5wcm90b3R5cGUudWludDY0LHAucHJvdG90eXBlLnNpbnQ2ND1mdW5jdGlvbihlKXt2YXIgdD1pLmZyb20oZSkuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaChnLHQubGVuZ3RoKCksdCl9LHAucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goZiwxLGU/MTowKX0scC5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaChiLDQsZT4+PjApfSxwLnByb3RvdHlwZS5zZml4ZWQzMj1wLnByb3RvdHlwZS5maXhlZDMyLHAucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGIsNCx0LmxvKS5fcHVzaChiLDQsdC5oaSl9LHAucHJvdG90eXBlLnNmaXhlZDY0PXAucHJvdG90eXBlLmZpeGVkNjQscC5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goby5mbG9hdC53cml0ZUZsb2F0TEUsNCxlKX0scC5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wdXNoKG8uZmxvYXQud3JpdGVEb3VibGVMRSw4LGUpfTt2YXIgbT1vLkFycmF5LnByb3RvdHlwZS5zZXQ/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDsrK3IpdFtuK3JdPWVbcl07fTtwLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aD4+PjA7aWYoIXQpcmV0dXJuIHRoaXMuX3B1c2goZiwxLDApO2lmKG8uaXNTdHJpbmcoZSkpe3ZhciBuPXAuYWxsb2ModD1zLmxlbmd0aChlKSk7cy5kZWNvZGUoZSxuLDApLGU9bjt9cmV0dXJuIHRoaXMudWludDMyKHQpLl9wdXNoKG0sdCxlKX0scC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWEubGVuZ3RoKGUpO3JldHVybiB0P3RoaXMudWludDMyKHQpLl9wdXNoKGEud3JpdGUsdCxlKTp0aGlzLl9wdXNoKGYsMSwwKX0scC5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgYyh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyB1KGwsMCwwKSx0aGlzLmxlbj0wLHRoaXN9LHAucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IHUobCwwLDApLHRoaXMubGVuPTApLHRoaXN9LHAucHJvdG90eXBlLmxkZWxpbT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZCx0PXRoaXMudGFpbCxuPXRoaXMubGVuO3JldHVybiB0aGlzLnJlc2V0KCkudWludDMyKG4pLG4mJih0aGlzLnRhaWwubmV4dD1lLm5leHQsdGhpcy50YWlsPXQsdGhpcy5sZW4rPW4pLHRoaXN9LHAucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmhlYWQubmV4dCx0PXRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLG49MDtlOyllLmZuKGUudmFsLHQsbiksbis9ZS5sZW4sZT1lLm5leHQ7cmV0dXJuIHR9LHAuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUscC5jcmVhdGU9ZCgpLHIuX2NvbmZpZ3VyZSgpO307fSwzMTU1OihlLHQsbik9PntlLmV4cG9ydHM9aTt2YXIgcj1uKDExNzMpOyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aTt2YXIgbz1uKDk2OTMpO2Z1bmN0aW9uIGkoKXtyLmNhbGwodGhpcyk7fWZ1bmN0aW9uIHMoZSx0LG4pe2UubGVuZ3RoPDQwP28udXRmOC53cml0ZShlLHQsbik6dC51dGY4V3JpdGU/dC51dGY4V3JpdGUoZSxuKTp0LndyaXRlKGUsbik7fWkuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe2kuYWxsb2M9by5fQnVmZmVyX2FsbG9jVW5zYWZlLGkud3JpdGVCeXRlc0J1ZmZlcj1vLkJ1ZmZlciYmby5CdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSYmInNldCI9PT1vLkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7aWYoZS5jb3B5KWUuY29weSh0LG4sMCxlLmxlbmd0aCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoOyl0W24rK109ZVtyKytdO307fSxpLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXtvLmlzU3RyaW5nKGUpJiYoZT1vLl9CdWZmZXJfZnJvbShlLCJiYXNlNjQiKSk7dmFyIHQ9ZS5sZW5ndGg+Pj4wO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKGkud3JpdGVCeXRlc0J1ZmZlcix0LGUpLHRoaXN9LGkucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1vLkJ1ZmZlci5ieXRlTGVuZ3RoKGUpO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKHMsdCxlKSx0aGlzfSxpLl9jb25maWd1cmUoKTt9LDQxNTQ6ZT0+e2UuZXhwb3J0cz0nInVzZSBzdHJpY3QiO3ZhciBlPXt9LGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKGEpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksdD1yLnBhcmVudFBvcnQ7dC5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgcz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+KDAsZXZhbCkocy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKyIvLyMgc291cmNlVVJMPSIrZSkscG9zdE1lc3NhZ2U6ZT0+dC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIG89ITEsZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO2E/cy53cml0ZVN5bmMoMixlKyJcXG4iKTpjb25zb2xlLmVycm9yKGUpfTtzZWxmLmFsZXJ0PWZ1bmN0aW9uKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIgIik7cG9zdE1lc3NhZ2Uoe2NtZDoiYWxlcnQiLHRleHQ6YSx0aHJlYWRJZDplLl9wdGhyZWFkX3NlbGYoKX0pfSxlLmluc3RhbnRpYXRlV2FzbT0oYSxyKT0+e3ZhciB0PWUud2FzbU1vZHVsZTtyZXR1cm4gZS53YXNtTW9kdWxlPW51bGwscihuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UodCxhKSl9LHNlbGYub251bmhhbmRsZWRyZWplY3Rpb249ZT0+e3Rocm93IGUucmVhc29uPz9lfSxzZWxmLm9ubWVzc2FnZT1mdW5jdGlvbiBhKHIpe3RyeXtpZigibG9hZCI9PT1yLmRhdGEuY21kKXtsZXQgcz1bXTtzZWxmLm9ubWVzc2FnZT1lPT5zLnB1c2goZSksc2VsZi5zdGFydFdvcmtlcj1yPT57ZT1yLHBvc3RNZXNzYWdlKHtjbWQ6ImxvYWRlZCJ9KTtmb3IobGV0IGUgb2YgcylhKGUpO3NlbGYub25tZXNzYWdlPWF9LGUud2FzbU1vZHVsZT1yLmRhdGEud2FzbU1vZHVsZTtmb3IoY29uc3QgYSBvZiByLmRhdGEuaGFuZGxlcnMpZVthXT0oLi4uZSk9Pntwb3N0TWVzc2FnZSh7Y21kOiJjYWxsSGFuZGxlciIsaGFuZGxlcjphLGFyZ3M6ZX0pfTtpZihlLndhc21NZW1vcnk9ci5kYXRhLndhc21NZW1vcnksZS5idWZmZXI9ZS53YXNtTWVtb3J5LmJ1ZmZlcixlLkVOVklST05NRU5UX0lTX1BUSFJFQUQ9ITAsInN0cmluZyI9PXR5cGVvZiByLmRhdGEudXJsT3JCbG9iKWltcG9ydFNjcmlwdHMoci5kYXRhLnVybE9yQmxvYik7ZWxzZXt2YXIgdD1VUkwuY3JlYXRlT2JqZWN0VVJMKHIuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHModCksVVJMLnJldm9rZU9iamVjdFVSTCh0KX1vcnRXYXNtVGhyZWFkZWQoZSl9ZWxzZSBpZigicnVuIj09PXIuZGF0YS5jbWQpe2UuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHIuZGF0YS5wdGhyZWFkX3B0ciwwLDAsMSksZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQoci5kYXRhLnB0aHJlYWRfcHRyKSxlLmVzdGFibGlzaFN0YWNrU3BhY2UoKSxlLlBUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKHIuZGF0YSksZS5QVGhyZWFkLnRocmVhZEluaXRUTFMoKSxvfHwobz0hMCk7dHJ5e2UuaW52b2tlRW50cnlQb2ludChyLmRhdGEuc3RhcnRfcm91dGluZSxyLmRhdGEuYXJnKX1jYXRjaChlKXtpZigidW53aW5kIiE9ZSl0aHJvdyBlfX1lbHNlImNhbmNlbCI9PT1yLmRhdGEuY21kP2UuX3B0aHJlYWRfc2VsZigpJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdCgtMSk6InNldGltbWVkaWF0ZSI9PT1yLmRhdGEudGFyZ2V0fHwoImNoZWNrTWFpbGJveCI9PT1yLmRhdGEuY21kP28mJmUuY2hlY2tNYWlsYm94KCk6ci5kYXRhLmNtZCYmKGQoIndvcmtlci5qcyByZWNlaXZlZCB1bmtub3duIGNvbW1hbmQgIityLmRhdGEuY21kKSxkKHIuZGF0YSkpKX1jYXRjaChhKXt0aHJvdyBlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQoKSxhfX07XG4nO30sNzA2NzooKT0+e30sMTI5NjooKT0+e30sNzYwOigpPT57fSwxMzg0OigpPT57fSwzOTkzOigpPT57fSw5MDg6KCk9Pnt9LDY5NTM6KCk9Pnt9LDk5MjU6KCk9Pnt9LDI4MDY6KCk9Pnt9LDY0NDk6KCk9Pnt9LDI4NTA6KCk9Pnt9LDUzODE6KCk9Pnt9LDY4NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc29sdmVCYWNrZW5kPXQucmVnaXN0ZXJCYWNrZW5kPXZvaWQgMDtjb25zdCBuPXt9LHI9W107dC5yZWdpc3RlckJhY2tlbmQ9KGUsdCxvKT0+e2lmKCF0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5pbml0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jcmVhdGVTZXNzaW9uSGFuZGxlcil0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSB2YWxpZCBiYWNrZW5kIik7e2NvbnN0IGk9bltlXTtpZih2b2lkIDA9PT1pKW5bZV09e2JhY2tlbmQ6dCxwcmlvcml0eTpvfTtlbHNlIHtpZihpLnByaW9yaXR5Pm8pcmV0dXJuO2lmKGkucHJpb3JpdHk9PT1vJiZpLmJhY2tlbmQhPT10KXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlZ2lzdGVyIGJhY2tlbmQgIiR7ZX0iIHVzaW5nIHByaW9yaXR5ICR7b31gKX1pZihvPj0wKXtjb25zdCB0PXIuaW5kZXhPZihlKTstMSE9PXQmJnIuc3BsaWNlKHQsMSk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspaWYobltyW3RdXS5wcmlvcml0eTw9bylyZXR1cm4gdm9pZCByLnNwbGljZSh0LDAsZSk7ci5wdXNoKGUpO319fSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGU9Pntjb25zdCB0PTA9PT1lLmxlbmd0aD9yOmUsbz1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PW5bZV07aWYodCl7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZCljb250aW51ZTtjb25zdCBuPSEhdC5pbml0UHJvbWlzZTt0cnl7cmV0dXJuIG58fCh0LmluaXRQcm9taXNlPXQuYmFja2VuZC5pbml0KCkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2gocil7bnx8by5wdXNoKHtuYW1lOmUsZXJyOnJ9KSx0LmFib3J0ZWQ9ITA7fWZpbmFsbHl7ZGVsZXRlIHQuaW5pdFByb21pc2U7fX19dGhyb3cgbmV3IEVycm9yKGBubyBhdmFpbGFibGUgYmFja2VuZCBmb3VuZC4gRVJSOiAke28ubWFwKChlPT5gWyR7ZS5uYW1lfV0gJHtlLmVycn1gKSkuam9pbigiLCAiKX1gKX07fSw0Nzk4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWdpc3RlckJhY2tlbmQ9dm9pZCAwO3ZhciByPW4oNjg1KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJCYWNrZW5kIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5yZWdpc3RlckJhY2tlbmR9fSk7fSwzMTIxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbnY9dm9pZCAwO2NvbnN0IHI9big5MTA0KTtsZXQgbz0id2FybmluZyI7dC5lbnY9e3dhc206e30sd2ViZ2w6e30sd2ViZ3B1Ont9LHZlcnNpb25zOntjb21tb246ci52ZXJzaW9ufSxzZXQgbG9nTGV2ZWwoZSl7aWYodm9pZCAwIT09ZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlfHwtMT09PVsidmVyYm9zZSIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJmYXRhbCJdLmluZGV4T2YoZSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCk7bz1lO319LGdldCBsb2dMZXZlbCgpe3JldHVybiBvfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZW52LCJsb2dMZXZlbCIse2VudW1lcmFibGU6ITB9KTt9LDI0NTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmVudj12b2lkIDA7Y29uc3Qgcj1uKDMxMjEpO3QuZW52PXIuZW52O30sMjIzNTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oNDc5OCksdCksbyhuKDI0NTcpLHQpLG8obigzOTc0KSx0KSxvKG4oOTYzKSx0KSxvKG4oNzg1MiksdCk7fSw4MDM2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5JbmZlcmVuY2VTZXNzaW9uPXZvaWQgMDtjb25zdCByPW4oNjg1KSxvPW4oOTYzKTtjbGFzcyBpe2NvbnN0cnVjdG9yKGUpe3RoaXMuaGFuZGxlcj1lO31hc3luYyBydW4oZSx0LG4pe2NvbnN0IHI9e307bGV0IGk9e307aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8ZSBpbnN0YW5jZW9mIG8uVGVuc29yfHxBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZWVkcycgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCB1c2UgaW5wdXQgbmFtZXMgYXMga2V5cyBhbmQgT25ueFZhbHVlIGFzIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiIpO2xldCBzPSEwO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7aWYobnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFsxXTogY2Fubm90IGJlIG51bGwuIik7aWYodCBpbnN0YW5jZW9mIG8uVGVuc29yKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYSBUZW5zb3IiKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4iKTtzPSExO2Zvcihjb25zdCBlIG9mIHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgbXVzdCBiZSBhIHN0cmluZyBhcnJheSBvciBhbiBvYmplY3QuIik7aWYoLTE9PT10aGlzLm91dHB1dE5hbWVzLmluZGV4T2YoZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdmZXRjaGVzJyBjb250YWlucyBpbnZhbGlkIG91dHB1dCBuYW1lOiAke2V9LmApO3JbZV09bnVsbDt9aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtsZXQgZT0hMTtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2Zvcihjb25zdCBuIG9mIHRoaXMub3V0cHV0TmFtZXMpaWYoLTEhPT1hLmluZGV4T2Yobikpe2NvbnN0IGk9dFtuXTsobnVsbD09PWl8fGkgaW5zdGFuY2VvZiBvLlRlbnNvcikmJihlPSEwLHM9ITEscltuXT1pKTt9aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGk9dDt9fWVsc2UgaWYodm9pZCAwIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBtdXN0IGJlICdmZXRjaGVzJyBvciAnb3B0aW9ucycuIik7Zm9yKGNvbnN0IHQgb2YgdGhpcy5pbnB1dE5hbWVzKWlmKHZvaWQgMD09PWVbdF0pdGhyb3cgbmV3IEVycm9yKGBpbnB1dCAnJHt0fScgaXMgbWlzc2luZyBpbiAnZmVlZHMnLmApO2lmKHMpZm9yKGNvbnN0IGUgb2YgdGhpcy5vdXRwdXROYW1lcylyW2VdPW51bGw7Y29uc3QgYT1hd2FpdCB0aGlzLmhhbmRsZXIucnVuKGUscixpKSx1PXt9O2Zvcihjb25zdCBlIGluIGEpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYSxlKSYmKHVbZV09bmV3IG8uVGVuc29yKGFbZV0udHlwZSxhW2VdLmRhdGEsYVtlXS5kaW1zKSk7cmV0dXJuIHV9YXN5bmMgcmVsZWFzZSgpe3JldHVybiB0aGlzLmhhbmRsZXIuZGlzcG9zZSgpfXN0YXRpYyBhc3luYyBjcmVhdGUoZSx0LG4sbyl7bGV0IHMsYT17fTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2Uge2lmKCEoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMF06IG11c3QgYmUgJ3BhdGgnIG9yICdidWZmZXInLiIpO3tjb25zdCByPWU7bGV0IGk9MCx1PWUuYnl0ZUxlbmd0aDtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoaT10LCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVPZmZzZXQnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZihpPDB8fGk+PXIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVPZmZzZXQnIGlzIG91dCBvZiByYW5nZSBbMCwgJHtyLmJ5dGVMZW5ndGh9KS5gKTtpZih1PWUuYnl0ZUxlbmd0aC1pLCJudW1iZXIiPT10eXBlb2Ygbil7aWYodT1uLCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZih1PD0wfHxpK3U+ci5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKGAnYnl0ZUxlbmd0aCcgaXMgb3V0IG9mIHJhbmdlICgwLCAke3IuYnl0ZUxlbmd0aC1pfV0uYCk7aWYoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09bylhPW87ZWxzZSBpZih2b2lkIDAhPT1vKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYSBudW1iZXIuIil9ZWxzZSBpZih2b2lkIDAhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKTtzPW5ldyBVaW50OEFycmF5KHIsaSx1KTt9fWNvbnN0IHU9KGEuZXhlY3V0aW9uUHJvdmlkZXJzfHxbXSkubWFwKChlPT4ic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSxsPWF3YWl0KDAsIHIucmVzb2x2ZUJhY2tlbmQpKHUpLGM9YXdhaXQgbC5jcmVhdGVTZXNzaW9uSGFuZGxlcihzLGEpO3JldHVybiBuZXcgaShjKX1zdGFydFByb2ZpbGluZygpe3RoaXMuaGFuZGxlci5zdGFydFByb2ZpbGluZygpO31lbmRQcm9maWxpbmcoKXt0aGlzLmhhbmRsZXIuZW5kUHJvZmlsaW5nKCk7fWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5pbnB1dE5hbWVzfWdldCBvdXRwdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIub3V0cHV0TmFtZXN9fXQuSW5mZXJlbmNlU2Vzc2lvbj1pO30sMzk3NDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSW5mZXJlbmNlU2Vzc2lvbj12b2lkIDA7Y29uc3Qgcj1uKDgwMzYpO3QuSW5mZXJlbmNlU2Vzc2lvbj1yLkluZmVyZW5jZVNlc3Npb247fSw3ODUyOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO30sMjM1MDooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRlbnNvclRvSW1hZ2VEYXRhPXQudGVuc29yVG9EYXRhVVJMPXZvaWQgMCx0LnRlbnNvclRvRGF0YVVSTD0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bi53aWR0aD1lLmRpbXNbM10sbi5oZWlnaHQ9ZS5kaW1zWzJdO2NvbnN0IHI9bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGwhPXIpe2xldCBvLGk7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSk7Y29uc3Qgcz12b2lkIDAhPT10Py5mb3JtYXQ/dC5mb3JtYXQ6IlJHQiIsYT10Py5ub3JtO2xldCB1LGw7dm9pZCAwPT09YXx8dm9pZCAwPT09YS5tZWFuP3U9WzI1NSwyNTUsMjU1LDI1NV06Im51bWJlciI9PXR5cGVvZiBhLm1lYW4/dT1bYS5tZWFuLGEubWVhbixhLm1lYW4sYS5tZWFuXToodT1bYS5tZWFuWzBdLGEubWVhblsxXSxhLm1lYW5bMl0sMF0sdm9pZCAwIT09YS5tZWFuWzNdJiYodVszXT1hLm1lYW5bM10pKSx2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLmJpYXM/bD1bMCwwLDAsMF06Im51bWJlciI9PXR5cGVvZiBhLmJpYXM/bD1bYS5iaWFzLGEuYmlhcyxhLmJpYXMsYS5iaWFzXToobD1bYS5iaWFzWzBdLGEuYmlhc1sxXSxhLmJpYXNbMl0sMF0sdm9pZCAwIT09YS5iaWFzWzNdJiYobFszXT1hLmJpYXNbM10pKTtjb25zdCBjPWkqbztsZXQgcD0wLGQ9YyxmPTIqYyxoPS0xOyJSR0JBIj09PXM/KHA9MCxkPWMsZj0yKmMsaD0zKmMpOiJSR0IiPT09cz8ocD0wLGQ9YyxmPTIqYyk6IlJCRyI9PT1zJiYocD0wLGY9YyxkPTIqYyk7Zm9yKGxldCB0PTA7dDxpO3QrKylmb3IobGV0IG49MDtuPG87bisrKXtjb25zdCBvPShlLmRhdGFbcCsrXS1sWzBdKSp1WzBdLGk9KGUuZGF0YVtkKytdLWxbMV0pKnVbMV0scz0oZS5kYXRhW2YrK10tbFsyXSkqdVsyXSxhPS0xPT09aD8yNTU6KGUuZGF0YVtoKytdLWxbM10pKnVbM107ci5maWxsU3R5bGU9InJnYmEoIitvKyIsIitpKyIsIitzKyIsIithKyIpIixyLmZpbGxSZWN0KG4sdCwxLDEpO31yZXR1cm4gbi50b0RhdGFVUkwoKX10aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX0sdC50ZW5zb3JUb0ltYWdlRGF0YT0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtsZXQgcjtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgbyxpLHM7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbMV0scz1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSxzPWUuZGltc1sxXSk7Y29uc3QgYT12b2lkIDAhPT10JiZ2b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCIix1PXQ/Lm5vcm07bGV0IGwsYzt2b2lkIDA9PT11fHx2b2lkIDA9PT11Lm1lYW4/bD1bMjU1LDI1NSwyNTUsMjU1XToibnVtYmVyIj09dHlwZW9mIHUubWVhbj9sPVt1Lm1lYW4sdS5tZWFuLHUubWVhbix1Lm1lYW5dOihsPVt1Lm1lYW5bMF0sdS5tZWFuWzFdLHUubWVhblsyXSwyNTVdLHZvaWQgMCE9PXUubWVhblszXSYmKGxbM109dS5tZWFuWzNdKSksdm9pZCAwPT09dXx8dm9pZCAwPT09dS5iaWFzP2M9WzAsMCwwLDBdOiJudW1iZXIiPT10eXBlb2YgdS5iaWFzP2M9W3UuYmlhcyx1LmJpYXMsdS5iaWFzLHUuYmlhc106KGM9W3UuYmlhc1swXSx1LmJpYXNbMV0sdS5iaWFzWzJdLDBdLHZvaWQgMCE9PXUuYmlhc1szXSYmKGNbM109dS5iaWFzWzNdKSk7Y29uc3QgcD1pKm87aWYodm9pZCAwIT09dCYmKHZvaWQgMCE9PXQuZm9ybWF0JiY0PT09cyYmIlJHQkEiIT09dC5mb3JtYXR8fDM9PT1zJiYiUkdCIiE9PXQuZm9ybWF0JiYiQkdSIiE9PXQuZm9ybWF0KSl0aHJvdyBuZXcgRXJyb3IoIlRlbnNvciBmb3JtYXQgZG9lc24ndCBtYXRjaCBpbnB1dCB0ZW5zb3IgZGltcyIpO2NvbnN0IGQ9NDtsZXQgZj0wLGg9MSxnPTIsYj0zLG09MCx5PXAsdj0yKnAsXz0tMTsiUkdCQSI9PT1hPyhtPTAseT1wLHY9MipwLF89MypwKToiUkdCIj09PWE/KG09MCx5PXAsdj0yKnApOiJSQkciPT09YSYmKG09MCx2PXAseT0yKnApLHI9bi5jcmVhdGVJbWFnZURhdGEobyxpKTtmb3IobGV0IHQ9MDt0PGkqbztmKz1kLGgrPWQsZys9ZCxiKz1kLHQrKylyLmRhdGFbZl09KGUuZGF0YVttKytdLWNbMF0pKmxbMF0sci5kYXRhW2hdPShlLmRhdGFbeSsrXS1jWzFdKSpsWzFdLHIuZGF0YVtnXT0oZS5kYXRhW3YrK10tY1syXSkqbFsyXSxyLmRhdGFbYl09LTE9PT1fPzI1NTooZS5kYXRhW18rK10tY1szXSkqbFszXTt9cmV0dXJuIHJ9O30sNDg2NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudGVuc29yRnJvbUltYWdlPXQuYnVmZmVyVG9UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big5NjMpO3QuYnVmZmVyVG9UZW5zb3I9KGUsdCk9PntpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgYnVmZmVyIG11c3QgYmUgZGVmaW5lZCIpO2lmKHZvaWQgMD09PXQuaGVpZ2h0fHx2b2lkIDA9PT10LndpZHRoKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGRlZmluZWQiKTtpZigiTkhXQyI9PT10LnRlbnNvckxheW91dCl0aHJvdyBuZXcgRXJyb3IoIk5IV0MgVGVuc29yIGxheW91dCBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0e2hlaWdodDpuLHdpZHRoOm99PXQsaT10Lm5vcm0/P3ttZWFuOjI1NSxiaWFzOjB9O2xldCBzLGE7cz0ibnVtYmVyIj09dHlwZW9mIGkubWVhbj9baS5tZWFuLGkubWVhbixpLm1lYW4saS5tZWFuXTpbaS5tZWFuWzBdLGkubWVhblsxXSxpLm1lYW5bMl0saS5tZWFuWzNdPz8yNTVdLGE9Im51bWJlciI9PXR5cGVvZiBpLmJpYXM/W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLGkuYmlhc1szXT8/MF07Y29uc3QgdT12b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCQSIsbD12b2lkIDAhPT10LnRlbnNvckZvcm1hdCYmdm9pZCAwIT09dC50ZW5zb3JGb3JtYXQ/dC50ZW5zb3JGb3JtYXQ6IlJHQiIsYz1uKm8scD0iUkdCQSI9PT1sP25ldyBGbG9hdDMyQXJyYXkoNCpjKTpuZXcgRmxvYXQzMkFycmF5KDMqYyk7bGV0IGQ9NCxmPTAsaD0xLGc9MixiPTMsbT0wLHk9Yyx2PTIqYyxfPS0xOyJSR0IiPT09dSYmKGQ9MyxmPTAsaD0xLGc9MixiPS0xKSwiUkdCQSI9PT1sP189MypjOiJSQkciPT09bD8obT0wLHY9Yyx5PTIqYyk6IkJHUiI9PT1sJiYodj0wLHk9YyxtPTIqYyk7Zm9yKGxldCB0PTA7dDxjO3QrKyxmKz1kLGcrPWQsaCs9ZCxiKz1kKXBbbSsrXT0oZVtmXSthWzBdKS9zWzBdLHBbeSsrXT0oZVtoXSthWzFdKS9zWzFdLHBbdisrXT0oZVtnXSthWzJdKS9zWzJdLC0xIT09XyYmLTEhPT1iJiYocFtfKytdPShlW2JdK2FbM10pL3NbM10pO3JldHVybiAiUkdCQSI9PT1sP25ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSw0LG4sb10pOm5ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSwzLG4sb10pfSx0LnRlbnNvckZyb21JbWFnZT1hc3luYyhlLG4pPT57Y29uc3Qgcj0idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50LG89InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZURhdGEmJmUgaW5zdGFuY2VvZiBJbWFnZURhdGEsaT0idW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAscz0ic3RyaW5nIj09dHlwZW9mIGU7bGV0IGEsdT1uPz97fTtpZihyKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Qud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodDtjb25zdCByPXQuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgdD1lLmhlaWdodCxvPWUud2lkdGg7aWYodm9pZCAwIT09biYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0JiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmKHQ9bi5yZXNpemVkSGVpZ2h0LG89bi5yZXNpemVkV2lkdGgpLHZvaWQgMCE9PW4pe2lmKHU9bix2b2lkIDAhPT1uLnRlbnNvckZvcm1hdCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7dS50ZW5zb3JGb3JtYXQ9IlJHQkEiLHUuaGVpZ2h0PXQsdS53aWR0aD1vO31lbHNlIHUudGVuc29yRm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9bztyLmRyYXdJbWFnZShlLDAsMCksYT1yLmdldEltYWdlRGF0YSgwLDAsbyx0KS5kYXRhO319ZWxzZSB7aWYoIW8pe2lmKGkpe2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBpbWFnZSBjb25maWcgd2l0aCBmb3JtYXQgZm9yIEltYWdlYml0bWFwIik7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyLndpZHRoPWUud2lkdGgsci5oZWlnaHQ9ZS5oZWlnaHQ7Y29uc3Qgbz1yLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9byl7Y29uc3Qgbj1lLmhlaWdodCxyPWUud2lkdGg7cmV0dXJuIG8uZHJhd0ltYWdlKGUsMCwwLHIsbiksYT1vLmdldEltYWdlRGF0YSgwLDAscixuKS5kYXRhLHUuaGVpZ2h0PW4sdS53aWR0aD1yLCgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpfXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWlmKHMpcmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT1vLmdldENvbnRleHQoIjJkIik7aWYoIWV8fCFpKXJldHVybiByKCk7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5jcm9zc09yaWdpbj0iQW5vbnltb3VzIixzLnNyYz1lLHMub25sb2FkPSgpPT57by53aWR0aD1zLndpZHRoLG8uaGVpZ2h0PXMuaGVpZ2h0LGkuZHJhd0ltYWdlKHMsMCwwLG8ud2lkdGgsby5oZWlnaHQpO2NvbnN0IGU9aS5nZXRJbWFnZURhdGEoMCwwLG8ud2lkdGgsby5oZWlnaHQpO3UuaGVpZ2h0PW8uaGVpZ2h0LHUud2lkdGg9by53aWR0aCxuKCgwLCB0LmJ1ZmZlclRvVGVuc29yKShlLmRhdGEsdSkpO307fSkpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX17bGV0IHQscjtpZih2b2lkIDAhPT1uJiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0Pyh0PW4ucmVzaXplZEhlaWdodCxyPW4ucmVzaXplZFdpZHRoKToodD1lLmhlaWdodCxyPWUud2lkdGgpLHZvaWQgMCE9PW4mJih1PW4pLHUuZm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9cix2b2lkIDAhPT1uKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO24ud2lkdGg9cixuLmhlaWdodD10O2NvbnN0IG89bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGw9PW8pdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7by5wdXRJbWFnZURhdGEoZSwwLDApLGE9by5nZXRJbWFnZURhdGEoMCwwLHIsdCkuZGF0YTt9ZWxzZSBhPWUuZGF0YTt9fWlmKHZvaWQgMCE9PWEpcmV0dXJuICgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX07fSw1OTU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9bigyMzUwKSxvPW4oNDg2NiksaT1uKDEwNikscz1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJmbG9hdDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XV0pLGE9bmV3IE1hcChbW0Zsb2F0MzJBcnJheSwiZmxvYXQzMiJdLFtVaW50OEFycmF5LCJ1aW50OCJdLFtJbnQ4QXJyYXksImludDgiXSxbVWludDE2QXJyYXksInVpbnQxNiJdLFtJbnQxNkFycmF5LCJpbnQxNiJdLFtJbnQzMkFycmF5LCJpbnQzMiJdLFtGbG9hdDY0QXJyYXksImZsb2F0NjQiXSxbVWludDMyQXJyYXksInVpbnQzMiJdXSk7bGV0IHU9ITE7dC5UZW5zb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe2xldCByLG8sbDtpZigoKCk9PntpZighdSl7dT0hMDtjb25zdCBlPSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnSW50NjRBcnJheSYmImZ1bmN0aW9uIj09dHlwZW9mIEJpZ0ludDY0QXJyYXkuZnJvbSx0PSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnVWludDY0QXJyYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBCaWdVaW50NjRBcnJheS5mcm9tO2UmJihzLnNldCgiaW50NjQiLEJpZ0ludDY0QXJyYXkpLGEuc2V0KEJpZ0ludDY0QXJyYXksImludDY0IikpLHQmJihzLnNldCgidWludDY0IixCaWdVaW50NjRBcnJheSksYS5zZXQoQmlnVWludDY0QXJyYXksInVpbnQ2NCIpKTt9fSkoKSwic3RyaW5nIj09dHlwZW9mIGUpaWYocj1lLGw9biwic3RyaW5nIj09PWUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgc3RyaW5nIHRlbnNvcidzIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBhcnJheS4iKTtvPXQ7fWVsc2Uge2NvbnN0IG49cy5nZXQoZSk7aWYodm9pZCAwPT09bil0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0ZW5zb3IgdHlwZTogJHtlfS5gKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigiZmxvYXQxNiI9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkNyZWF0aW5nIGEgZmxvYXQxNiB0ZW5zb3IgZnJvbSBudW1iZXIgYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBVaW50MTZBcnJheSBhcyBkYXRhLiIpO289InVpbnQ2NCI9PT1lfHwiaW50NjQiPT09ZT9uLmZyb20odCxCaWdJbnQpOm4uZnJvbSh0KTt9ZWxzZSB7aWYoISh0IGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihgQSAke3J9IHRlbnNvcidzIGRhdGEgbXVzdCBiZSB0eXBlIG9mICR7bn1gKTtvPXQ7fX1lbHNlIGlmKGw9dCxBcnJheS5pc0FycmF5KGUpKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7Y29uc3QgdD10eXBlb2YgZVswXTtpZigic3RyaW5nIj09PXQpcj0ic3RyaW5nIixvPWU7ZWxzZSB7aWYoImJvb2xlYW4iIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBvZiBkYXRhIGFycmF5OiAke3R9LmApO3I9ImJvb2wiLG89VWludDhBcnJheS5mcm9tKGUpO319ZWxzZSB7Y29uc3QgdD1hLmdldChlLmNvbnN0cnVjdG9yKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRlbnNvciBkYXRhOiAke2UuY29uc3RydWN0b3J9LmApO3I9dCxvPWU7fWlmKHZvaWQgMD09PWwpbD1bby5sZW5ndGhdO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSB0ZW5zb3IncyBkaW1zIG11c3QgYmUgYSBudW1iZXIgYXJyYXkiKTtjb25zdCBjPSgwLCBpLmNhbGN1bGF0ZVNpemUpKGwpO2lmKGMhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRlbnNvcidzIHNpemUoJHtjfSkgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGgoJHtvLmxlbmd0aH0pLmApO3RoaXMuZGltcz1sLHRoaXMudHlwZT1yLHRoaXMuZGF0YT1vLHRoaXMuc2l6ZT1jO31zdGF0aWMgYXN5bmMgZnJvbUltYWdlKGUsdCl7cmV0dXJuICgwLCBvLnRlbnNvckZyb21JbWFnZSkoZSx0KX10b0RhdGFVUkwoZSl7cmV0dXJuICgwLCByLnRlbnNvclRvRGF0YVVSTCkodGhpcyxlKX10b0ltYWdlRGF0YShlKXtyZXR1cm4gKDAsIHIudGVuc29yVG9JbWFnZURhdGEpKHRoaXMsZSl9cmVzaGFwZShlKXtyZXR1cm4gKDAsIGkudGVuc29yUmVzaGFwZSkodGhpcyxlKX19O30sMTA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50ZW5zb3JSZXNoYXBlPXQuY2FsY3VsYXRlU2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDk2Myk7dC5jYWxjdWxhdGVTaXplPWU9PntsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07aWYoIm51bWJlciIhPXR5cGVvZiByfHwhTnVtYmVyLmlzU2FmZUludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGFuIGludGVnZXIsIGdvdDogJHtyfWApO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdDogJHtyfWApO3QqPXI7fXJldHVybiB0fSx0LnRlbnNvclJlc2hhcGU9KGUsdCk9Pm5ldyByLlRlbnNvcihlLnR5cGUsZS5kYXRhLHQpO30sOTYzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big1OTU3KTt0LlRlbnNvcj1yLlRlbnNvcjt9LDkxMDQ6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC52ZXJzaW9uPXZvaWQgMCx0LnZlcnNpb249IjEuMTYuMyI7fSwxNTgzOihlLHQpPT57dmFyIG4scj1mdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXZvaWQgMDt2YXIgdD1udWxsO3RyeXt0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0czt9Y2F0Y2goZSl7fWZ1bmN0aW9uIG4oZSx0LG4pe3RoaXMubG93PTB8ZSx0aGlzLmhpZ2g9MHx0LHRoaXMudW5zaWduZWQ9ISFuO31mdW5jdGlvbiByKGUpe3JldHVybiAhMD09PShlJiZlLl9faXNMb25nX18pfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9TWF0aC5jbHozMihlJi1lKTtyZXR1cm4gZT8zMS10OnR9bi5wcm90b3R5cGUuX19pc0xvbmdfXyxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsIl9faXNMb25nX18iLHt2YWx1ZTohMH0pLG4uaXNMb25nPXI7dmFyIGk9e30scz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG4scixvO3JldHVybiB0PyhvPTA8PShlPj4+PTApJiZlPDI1NikmJihyPXNbZV0pP3I6KG49bChlLDAsITApLG8mJihzW2VdPW4pLG4pOihvPS0xMjg8PShlfD0wKSYmZTwxMjgpJiYocj1pW2VdKT9yOihuPWwoZSxlPDA/LTE6MCwhMSksbyYmKGlbZV09biksbil9ZnVuY3Rpb24gdShlLHQpe2lmKGlzTmFOKGUpKXJldHVybiB0P3k6bTtpZih0KXtpZihlPDApcmV0dXJuIHk7aWYoZT49aClyZXR1cm4geH1lbHNlIHtpZihlPD0tZylyZXR1cm4gTztpZihlKzE+PWcpcmV0dXJuIFR9cmV0dXJuIGU8MD91KC1lLHQpLm5lZygpOmwoZSVmfDAsZS9mfDAsdCl9ZnVuY3Rpb24gbChlLHQscil7cmV0dXJuIG5ldyBuKGUsdCxyKX1uLmZyb21JbnQ9YSxuLmZyb21OdW1iZXI9dSxuLmZyb21CaXRzPWw7dmFyIGM9TWF0aC5wb3c7ZnVuY3Rpb24gcChlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IEVycm9yKCJlbXB0eSBzdHJpbmciKTtpZigibnVtYmVyIj09dHlwZW9mIHQ/KG49dCx0PSExKTp0PSEhdCwiTmFOIj09PWV8fCJJbmZpbml0eSI9PT1lfHwiK0luZmluaXR5Ij09PWV8fCItSW5maW5pdHkiPT09ZSlyZXR1cm4gdD95Om07aWYoKG49bnx8MTApPDJ8fDM2PG4pdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTt2YXIgcjtpZigocj1lLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBFcnJvcigiaW50ZXJpb3IgaHlwaGVuIik7aWYoMD09PXIpcmV0dXJuIHAoZS5zdWJzdHJpbmcoMSksdCxuKS5uZWcoKTtmb3IodmFyIG89dShjKG4sOCkpLGk9bSxzPTA7czxlLmxlbmd0aDtzKz04KXt2YXIgYT1NYXRoLm1pbig4LGUubGVuZ3RoLXMpLGw9cGFyc2VJbnQoZS5zdWJzdHJpbmcocyxzK2EpLG4pO2lmKGE8OCl7dmFyIGQ9dShjKG4sYSkpO2k9aS5tdWwoZCkuYWRkKHUobCkpO31lbHNlIGk9KGk9aS5tdWwobykpLmFkZCh1KGwpKTt9cmV0dXJuIGkudW5zaWduZWQ9dCxpfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlP3UoZSx0KToic3RyaW5nIj09dHlwZW9mIGU/cChlLHQpOmwoZS5sb3csZS5oaWdoLCJib29sZWFuIj09dHlwZW9mIHQ/dDplLnVuc2lnbmVkKX1uLmZyb21TdHJpbmc9cCxuLmZyb21WYWx1ZT1kO3ZhciBmPTQyOTQ5NjcyOTYsaD1mKmYsZz1oLzIsYj1hKDE8PDI0KSxtPWEoMCk7bi5aRVJPPW07dmFyIHk9YSgwLCEwKTtuLlVaRVJPPXk7dmFyIHY9YSgxKTtuLk9ORT12O3ZhciBfPWEoMSwhMCk7bi5VT05FPV87dmFyIHc9YSgtMSk7bi5ORUdfT05FPXc7dmFyIFQ9bCgtMSwyMTQ3NDgzNjQ3LCExKTtuLk1BWF9WQUxVRT1UO3ZhciB4PWwoLTEsLTEsITApO24uTUFYX1VOU0lHTkVEX1ZBTFVFPXg7dmFyIE89bCgwLC0yMTQ3NDgzNjQ4LCExKTtuLk1JTl9WQUxVRT1PO3ZhciBTPW4ucHJvdG90eXBlO1MudG9JbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9LFMudG9OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqZisodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqZisodGhpcy5sb3c+Pj4wKX0sUy50b1N0cmluZz1mdW5jdGlvbihlKXtpZigoZT1lfHwxMCk8Mnx8MzY8ZSl0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuICIwIjtpZih0aGlzLmlzTmVnYXRpdmUoKSl7aWYodGhpcy5lcShPKSl7dmFyIHQ9dShlKSxuPXRoaXMuZGl2KHQpLHI9bi5tdWwodCkuc3ViKHRoaXMpO3JldHVybiBuLnRvU3RyaW5nKGUpK3IudG9JbnQoKS50b1N0cmluZyhlKX1yZXR1cm4gIi0iK3RoaXMubmVnKCkudG9TdHJpbmcoZSl9Zm9yKHZhciBvPXUoYyhlLDYpLHRoaXMudW5zaWduZWQpLGk9dGhpcyxzPSIiOzspe3ZhciBhPWkuZGl2KG8pLGw9KGkuc3ViKGEubXVsKG8pKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYoKGk9YSkuaXNaZXJvKCkpcmV0dXJuIGwrcztmb3IoO2wubGVuZ3RoPDY7KWw9IjAiK2w7cz0iIitsK3M7fX0sUy5nZXRIaWdoQml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2h9LFMuZ2V0SGlnaEJpdHNVbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfSxTLmdldExvd0JpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3d9LFMuZ2V0TG93Qml0c1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93Pj4+MH0sUy5nZXROdW1CaXRzQWJzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoTyk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Zm9yKHZhciBlPTAhPXRoaXMuaGlnaD90aGlzLmhpZ2g6dGhpcy5sb3csdD0zMTt0PjAmJiEoZSYxPDx0KTt0LS0pO3JldHVybiAwIT10aGlzLmhpZ2g/dCszMzp0KzF9LFMuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmhpZ2gmJjA9PT10aGlzLmxvd30sUy5lcXo9Uy5pc1plcm8sUy5pc05lZ2F0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuICF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g8MH0sUy5pc1Bvc2l0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaD49MH0sUy5pc09kZD1mdW5jdGlvbigpe3JldHVybiAhKDEmfnRoaXMubG93KX0sUy5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gISgxJnRoaXMubG93KX0sUy5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLCh0aGlzLnVuc2lnbmVkPT09ZS51bnNpZ25lZHx8dGhpcy5oaWdoPj4+MzEhPTF8fGUuaGlnaD4+PjMxIT0xKSYmdGhpcy5oaWdoPT09ZS5oaWdoJiZ0aGlzLmxvdz09PWUubG93fSxTLmVxPVMuZXF1YWxzLFMubm90RXF1YWxzPWZ1bmN0aW9uKGUpe3JldHVybiAhdGhpcy5lcShlKX0sUy5uZXE9Uy5ub3RFcXVhbHMsUy5uZT1TLm5vdEVxdWFscyxTLmxlc3NUaGFuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8MH0sUy5sdD1TLmxlc3NUaGFuLFMubGVzc1RoYW5PckVxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8PTB9LFMubHRlPVMubGVzc1RoYW5PckVxdWFsLFMubGU9Uy5sZXNzVGhhbk9yRXF1YWwsUy5ncmVhdGVyVGhhbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wKGUpPjB9LFMuZ3Q9Uy5ncmVhdGVyVGhhbixTLmdyZWF0ZXJUaGFuT3JFcXVhbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wKGUpPj0wfSxTLmd0ZT1TLmdyZWF0ZXJUaGFuT3JFcXVhbCxTLmdlPVMuZ3JlYXRlclRoYW5PckVxdWFsLFMuY29tcGFyZT1mdW5jdGlvbihlKXtpZihyKGUpfHwoZT1kKGUpKSx0aGlzLmVxKGUpKXJldHVybiAwO3ZhciB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfSxTLmNvbXA9Uy5jb21wYXJlLFMubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuICF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKE8pP086dGhpcy5ub3QoKS5hZGQodil9LFMubmVnPVMubmVnYXRlLFMuYWRkPWZ1bmN0aW9uKGUpe3IoZSl8fChlPWQoZSkpO3ZhciB0PXRoaXMuaGlnaD4+PjE2LG49NjU1MzUmdGhpcy5oaWdoLG89dGhpcy5sb3c+Pj4xNixpPTY1NTM1JnRoaXMubG93LHM9ZS5oaWdoPj4+MTYsYT02NTUzNSZlLmhpZ2gsdT1lLmxvdz4+PjE2LGM9MCxwPTAsZj0wLGg9MDtyZXR1cm4gZis9KGgrPWkrKDY1NTM1JmUubG93KSk+Pj4xNixwKz0oZis9byt1KT4+PjE2LGMrPShwKz1uK2EpPj4+MTYsYys9dCtzLGwoKGYmPTY1NTM1KTw8MTZ8KGgmPTY1NTM1KSwoYyY9NjU1MzUpPDwxNnwocCY9NjU1MzUpLHRoaXMudW5zaWduZWQpfSxTLnN1YnRyYWN0PWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHwoZT1kKGUpKSx0aGlzLmFkZChlLm5lZygpKX0sUy5zdWI9Uy5zdWJ0cmFjdCxTLm11bHRpcGx5PWZ1bmN0aW9uKGUpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXM7aWYocihlKXx8KGU9ZChlKSksdClyZXR1cm4gbCh0Lm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKSx0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCk7aWYoZS5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD95Om07aWYodGhpcy5lcShPKSlyZXR1cm4gZS5pc09kZCgpP086bTtpZihlLmVxKE8pKXJldHVybiB0aGlzLmlzT2RkKCk/TzptO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBlLmlzTmVnYXRpdmUoKT90aGlzLm5lZygpLm11bChlLm5lZygpKTp0aGlzLm5lZygpLm11bChlKS5uZWcoKTtpZihlLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5tdWwoZS5uZWcoKSkubmVnKCk7aWYodGhpcy5sdChiKSYmZS5sdChiKSlyZXR1cm4gdSh0aGlzLnRvTnVtYmVyKCkqZS50b051bWJlcigpLHRoaXMudW5zaWduZWQpO3ZhciBuPXRoaXMuaGlnaD4+PjE2LG89NjU1MzUmdGhpcy5oaWdoLGk9dGhpcy5sb3c+Pj4xNixzPTY1NTM1JnRoaXMubG93LGE9ZS5oaWdoPj4+MTYsYz02NTUzNSZlLmhpZ2gscD1lLmxvdz4+PjE2LGY9NjU1MzUmZS5sb3csaD0wLGc9MCx2PTAsXz0wO3JldHVybiB2Kz0oXys9cypmKT4+PjE2LGcrPSh2Kz1pKmYpPj4+MTYsdiY9NjU1MzUsZys9KHYrPXMqcCk+Pj4xNixoKz0oZys9bypmKT4+PjE2LGcmPTY1NTM1LGgrPShnKz1pKnApPj4+MTYsZyY9NjU1MzUsaCs9KGcrPXMqYyk+Pj4xNixoKz1uKmYrbypwK2kqYytzKmEsbCgodiY9NjU1MzUpPDwxNnwoXyY9NjU1MzUpLChoJj02NTUzNSk8PDE2fChnJj02NTUzNSksdGhpcy51bnNpZ25lZCl9LFMubXVsPVMubXVsdGlwbHksUy5kaXZpZGU9ZnVuY3Rpb24oZSl7aWYocihlKXx8KGU9ZChlKSksZS5pc1plcm8oKSl0aHJvdyBFcnJvcigiZGl2aXNpb24gYnkgemVybyIpO3ZhciBuLG8saTtpZih0KXJldHVybiB0aGlzLnVuc2lnbmVkfHwtMjE0NzQ4MzY0OCE9PXRoaXMuaGlnaHx8LTEhPT1lLmxvd3x8LTEhPT1lLmhpZ2g/bCgodGhpcy51bnNpZ25lZD90LmRpdl91OnQuZGl2X3MpKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpLHQuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKTp0aGlzO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/eTptO2lmKHRoaXMudW5zaWduZWQpe2lmKGUudW5zaWduZWR8fChlPWUudG9VbnNpZ25lZCgpKSxlLmd0KHRoaXMpKXJldHVybiB5O2lmKGUuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gXztpPXk7fWVsc2Uge2lmKHRoaXMuZXEoTykpcmV0dXJuIGUuZXEodil8fGUuZXEodyk/TzplLmVxKE8pP3Y6KG49dGhpcy5zaHIoMSkuZGl2KGUpLnNobCgxKSkuZXEobSk/ZS5pc05lZ2F0aXZlKCk/djp3OihvPXRoaXMuc3ViKGUubXVsKG4pKSxpPW4uYWRkKG8uZGl2KGUpKSk7aWYoZS5lcShPKSlyZXR1cm4gdGhpcy51bnNpZ25lZD95Om07aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkuZGl2KGUubmVnKCkpOnRoaXMubmVnKCkuZGl2KGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmRpdihlLm5lZygpKS5uZWcoKTtpPW07fWZvcihvPXRoaXM7by5ndGUoZSk7KXtuPU1hdGgubWF4KDEsTWF0aC5mbG9vcihvLnRvTnVtYmVyKCkvZS50b051bWJlcigpKSk7Zm9yKHZhciBzPU1hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMiksYT1zPD00OD8xOmMoMixzLTQ4KSxwPXUobiksZj1wLm11bChlKTtmLmlzTmVnYXRpdmUoKXx8Zi5ndChvKTspZj0ocD11KG4tPWEsdGhpcy51bnNpZ25lZCkpLm11bChlKTtwLmlzWmVybygpJiYocD12KSxpPWkuYWRkKHApLG89by5zdWIoZik7fXJldHVybiBpfSxTLmRpdj1TLmRpdmlkZSxTLm1vZHVsbz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksdD9sKCh0aGlzLnVuc2lnbmVkP3QucmVtX3U6dC5yZW1fcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCksdC5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpOnRoaXMuc3ViKHRoaXMuZGl2KGUpLm11bChlKSl9LFMubW9kPVMubW9kdWxvLFMucmVtPVMubW9kdWxvLFMubm90PWZ1bmN0aW9uKCl7cmV0dXJuIGwofnRoaXMubG93LH50aGlzLmhpZ2gsdGhpcy51bnNpZ25lZCl9LFMuY291bnRMZWFkaW5nWmVyb3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoP01hdGguY2x6MzIodGhpcy5oaWdoKTpNYXRoLmNsejMyKHRoaXMubG93KSszMn0sUy5jbHo9Uy5jb3VudExlYWRpbmdaZXJvcyxTLmNvdW50VHJhaWxpbmdaZXJvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvdz9vKHRoaXMubG93KTpvKHRoaXMuaGlnaCkrMzJ9LFMuY3R6PVMuY291bnRUcmFpbGluZ1plcm9zLFMuYW5kPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHwoZT1kKGUpKSxsKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9LFMub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLGwodGhpcy5sb3d8ZS5sb3csdGhpcy5oaWdofGUuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy54b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLGwodGhpcy5sb3deZS5sb3csdGhpcy5oaWdoXmUuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy5zaGlmdExlZnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/bCh0aGlzLmxvdzw8ZSx0aGlzLmhpZ2g8PGV8dGhpcy5sb3c+Pj4zMi1lLHRoaXMudW5zaWduZWQpOmwoMCx0aGlzLmxvdzw8ZS0zMix0aGlzLnVuc2lnbmVkKX0sUy5zaGw9Uy5zaGlmdExlZnQsUy5zaGlmdFJpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiByKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2wodGhpcy5sb3c+Pj5lfHRoaXMuaGlnaDw8MzItZSx0aGlzLmhpZ2g+PmUsdGhpcy51bnNpZ25lZCk6bCh0aGlzLmhpZ2g+PmUtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9LFMuc2hyPVMuc2hpZnRSaWdodCxTLnNoaWZ0UmlnaHRVbnNpZ25lZD1mdW5jdGlvbihlKXtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9sKHRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWUsdGhpcy5oaWdoPj4+ZSx0aGlzLnVuc2lnbmVkKTpsKDMyPT09ZT90aGlzLmhpZ2g6dGhpcy5oaWdoPj4+ZS0zMiwwLHRoaXMudW5zaWduZWQpfSxTLnNocnU9Uy5zaGlmdFJpZ2h0VW5zaWduZWQsUy5zaHJfdT1TLnNoaWZ0UmlnaHRVbnNpZ25lZCxTLnJvdGF0ZUxlZnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOjMyPT09ZT9sKHRoaXMuaGlnaCx0aGlzLmxvdyx0aGlzLnVuc2lnbmVkKTplPDMyPyh0PTMyLWUsbCh0aGlzLmxvdzw8ZXx0aGlzLmhpZ2g+Pj50LHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PnQsdGhpcy51bnNpZ25lZCkpOih0PTMyLShlLT0zMiksbCh0aGlzLmhpZ2g8PGV8dGhpcy5sb3c+Pj50LHRoaXMubG93PDxlfHRoaXMuaGlnaD4+PnQsdGhpcy51bnNpZ25lZCkpfSxTLnJvdGw9Uy5yb3RhdGVMZWZ0LFMucm90YXRlUmlnaHQ9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOjMyPT09ZT9sKHRoaXMuaGlnaCx0aGlzLmxvdyx0aGlzLnVuc2lnbmVkKTplPDMyPyh0PTMyLWUsbCh0aGlzLmhpZ2g8PHR8dGhpcy5sb3c+Pj5lLHRoaXMubG93PDx0fHRoaXMuaGlnaD4+PmUsdGhpcy51bnNpZ25lZCkpOih0PTMyLShlLT0zMiksbCh0aGlzLmxvdzw8dHx0aGlzLmhpZ2g+Pj5lLHRoaXMuaGlnaDw8dHx0aGlzLmxvdz4+PmUsdGhpcy51bnNpZ25lZCkpfSxTLnJvdHI9Uy5yb3RhdGVSaWdodCxTLnRvU2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/bCh0aGlzLmxvdyx0aGlzLmhpZ2gsITEpOnRoaXN9LFMudG9VbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXM6bCh0aGlzLmxvdyx0aGlzLmhpZ2gsITApfSxTLnRvQnl0ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfSxTLnRvQnl0ZXNMRT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGlnaCx0PXRoaXMubG93O3JldHVybiBbMjU1JnQsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0LDI1NSZlLGU+Pj44JjI1NSxlPj4+MTYmMjU1LGU+Pj4yNF19LFMudG9CeXRlc0JFPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuIFtlPj4+MjQsZT4+PjE2JjI1NSxlPj4+OCYyNTUsMjU1JmUsdD4+PjI0LHQ+Pj4xNiYyNTUsdD4+PjgmMjU1LDI1NSZ0XX0sbi5mcm9tQnl0ZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiByP24uZnJvbUJ5dGVzTEUoZSx0KTpuLmZyb21CeXRlc0JFKGUsdCl9LG4uZnJvbUJ5dGVzTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IG4oZVswXXxlWzFdPDw4fGVbMl08PDE2fGVbM108PDI0LGVbNF18ZVs1XTw8OHxlWzZdPDwxNnxlWzddPDwyNCx0KX0sbi5mcm9tQnl0ZXNCRT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbihlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfTt2YXIgQT1uO3JldHVybiBlLmRlZmF1bHQ9QSwiZGVmYXVsdCJpbiBlP2UuZGVmYXVsdDplfSh7fSk7dm9pZCAwPT09KG49ZnVuY3Rpb24oKXtyZXR1cm4gcn0uYXBwbHkodCxbXSkpfHwoZS5leHBvcnRzPW4pO30sNTY4NjooZSx0LG4pPT57bi5yKHQpLG4uZCh0LHtmbGF0YnVmZmVyczooKT0+cn0pO3ZhciByPXt9O3IuT2Zmc2V0LHIuVGFibGUsci5TSVpFT0ZfU0hPUlQ9MixyLlNJWkVPRl9JTlQ9NCxyLkZJTEVfSURFTlRJRklFUl9MRU5HVEg9NCxyLlNJWkVfUFJFRklYX0xFTkdUSD00LHIuRW5jb2Rpbmc9e1VURjhfQllURVM6MSxVVEYxNl9TVFJJTkc6Mn0sci5pbnQzMj1uZXcgSW50MzJBcnJheSgyKSxyLmZsb2F0MzI9bmV3IEZsb2F0MzJBcnJheShyLmludDMyLmJ1ZmZlciksci5mbG9hdDY0PW5ldyBGbG9hdDY0QXJyYXkoci5pbnQzMi5idWZmZXIpLHIuaXNMaXR0bGVFbmRpYW49MT09PW5ldyBVaW50MTZBcnJheShuZXcgVWludDhBcnJheShbMSwwXSkuYnVmZmVyKVswXSxyLkxvbmc9ZnVuY3Rpb24oZSx0KXt0aGlzLmxvdz0wfGUsdGhpcy5oaWdoPTB8dDt9LHIuTG9uZy5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMD09ZSYmMD09dD9yLkxvbmcuWkVSTzpuZXcgci5Mb25nKGUsdCl9LHIuTG9uZy5wcm90b3R5cGUudG9GbG9hdDY0PWZ1bmN0aW9uKCl7cmV0dXJuICh0aGlzLmxvdz4+PjApKzQyOTQ5NjcyOTYqdGhpcy5oaWdofSxyLkxvbmcucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5sb3c9PWUubG93JiZ0aGlzLmhpZ2g9PWUuaGlnaH0sci5Mb25nLlpFUk89bmV3IHIuTG9uZygwLDApLHIuQnVpbGRlcj1mdW5jdGlvbihlKXtpZihlKXQ9ZTtlbHNlIHZhciB0PTEwMjQ7dGhpcy5iYj1yLkJ5dGVCdWZmZXIuYWxsb2NhdGUodCksdGhpcy5zcGFjZT10LHRoaXMubWluYWxpZ249MSx0aGlzLnZ0YWJsZT1udWxsLHRoaXMudnRhYmxlX2luX3VzZT0wLHRoaXMuaXNOZXN0ZWQ9ITEsdGhpcy5vYmplY3Rfc3RhcnQ9MCx0aGlzLnZ0YWJsZXM9W10sdGhpcy52ZWN0b3JfbnVtX2VsZW1zPTAsdGhpcy5mb3JjZV9kZWZhdWx0cz0hMTt9LHIuQnVpbGRlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmJiLmNsZWFyKCksdGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCksdGhpcy5taW5hbGlnbj0xLHRoaXMudnRhYmxlPW51bGwsdGhpcy52dGFibGVfaW5fdXNlPTAsdGhpcy5pc05lc3RlZD0hMSx0aGlzLm9iamVjdF9zdGFydD0wLHRoaXMudnRhYmxlcz1bXSx0aGlzLnZlY3Rvcl9udW1fZWxlbXM9MCx0aGlzLmZvcmNlX2RlZmF1bHRzPSExO30sci5CdWlsZGVyLnByb3RvdHlwZS5mb3JjZURlZmF1bHRzPWZ1bmN0aW9uKGUpe3RoaXMuZm9yY2VfZGVmYXVsdHM9ZTt9LHIuQnVpbGRlci5wcm90b3R5cGUuZGF0YUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJifSxyLkJ1aWxkZXIucHJvdG90eXBlLmFzVWludDhBcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiLmJ5dGVzKCkuc3ViYXJyYXkodGhpcy5iYi5wb3NpdGlvbigpLHRoaXMuYmIucG9zaXRpb24oKSt0aGlzLm9mZnNldCgpKX0sci5CdWlsZGVyLnByb3RvdHlwZS5wcmVwPWZ1bmN0aW9uKGUsdCl7ZT50aGlzLm1pbmFsaWduJiYodGhpcy5taW5hbGlnbj1lKTtmb3IodmFyIG49MSt+KHRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnNwYWNlK3QpJmUtMTt0aGlzLnNwYWNlPG4rZSt0Oyl7dmFyIG89dGhpcy5iYi5jYXBhY2l0eSgpO3RoaXMuYmI9ci5CdWlsZGVyLmdyb3dCeXRlQnVmZmVyKHRoaXMuYmIpLHRoaXMuc3BhY2UrPXRoaXMuYmIuY2FwYWNpdHkoKS1vO310aGlzLnBhZChuKTt9LHIuQnVpbGRlci5wcm90b3R5cGUucGFkPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZTt0KyspdGhpcy5iYi53cml0ZUludDgoLS10aGlzLnNwYWNlLDApO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSl7dGhpcy5iYi53cml0ZUludDgodGhpcy5zcGFjZS09MSxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQxNj1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50MTYodGhpcy5zcGFjZS09MixlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQzMj1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZS09NCxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQ2ND1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50NjQodGhpcy5zcGFjZS09OCxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuc3BhY2UtPTQsZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlRmxvYXQ2NCh0aGlzLnNwYWNlLT04LGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQ4PWZ1bmN0aW9uKGUpe3RoaXMucHJlcCgxLDApLHRoaXMud3JpdGVJbnQ4KGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQxNj1mdW5jdGlvbihlKXt0aGlzLnByZXAoMiwwKSx0aGlzLndyaXRlSW50MTYoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDMyPWZ1bmN0aW9uKGUpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVJbnQzMihlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkSW50NjQ9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUludDY0KGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGbG9hdDMyPWZ1bmN0aW9uKGUpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVGbG9hdDMyKGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGbG9hdDY0PWZ1bmN0aW9uKGUpe3RoaXMucHJlcCg4LDApLHRoaXMud3JpdGVGbG9hdDY0KGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDg9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkSW50OCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDE2PWZ1bmN0aW9uKGUsdCxuKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bikmJih0aGlzLmFkZEludDE2KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50MzI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkSW50MzIodCksdGhpcy5zbG90KGUpKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQ2ND1mdW5jdGlvbihlLHQsbil7IXRoaXMuZm9yY2VfZGVmYXVsdHMmJnQuZXF1YWxzKG4pfHwodGhpcy5hZGRJbnQ2NCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEZsb2F0MzI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkRmxvYXQzMih0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEZsb2F0NjQ9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkRmxvYXQ2NCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZE9mZnNldD1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRPZmZzZXQodCksdGhpcy5zbG90KGUpKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRTdHJ1Y3Q9ZnVuY3Rpb24oZSx0LG4pe3QhPW4mJih0aGlzLm5lc3RlZCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5uZXN0ZWQ9ZnVuY3Rpb24oZSl7aWYoZSE9dGhpcy5vZmZzZXQoKSl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBzdHJ1Y3QgbXVzdCBiZSBzZXJpYWxpemVkIGlubGluZS4iKX0sci5CdWlsZGVyLnByb3RvdHlwZS5ub3ROZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmVzdGVkKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IG9iamVjdCBzZXJpYWxpemF0aW9uIG11c3Qgbm90IGJlIG5lc3RlZC4iKX0sci5CdWlsZGVyLnByb3RvdHlwZS5zbG90PWZ1bmN0aW9uKGUpe3RoaXMudnRhYmxlW2VdPXRoaXMub2Zmc2V0KCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZX0sci5CdWlsZGVyLmdyb3dCeXRlQnVmZmVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FwYWNpdHkoKTtpZigzMjIxMjI1NDcyJnQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogY2Fubm90IGdyb3cgYnVmZmVyIGJleW9uZCAyIGdpZ2FieXRlcy4iKTt2YXIgbj10PDwxLG89ci5CeXRlQnVmZmVyLmFsbG9jYXRlKG4pO3JldHVybiBvLnNldFBvc2l0aW9uKG4tdCksby5ieXRlcygpLnNldChlLmJ5dGVzKCksbi10KSxvfSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZE9mZnNldD1mdW5jdGlvbihlKXt0aGlzLnByZXAoci5TSVpFT0ZfSU5ULDApLHRoaXMud3JpdGVJbnQzMih0aGlzLm9mZnNldCgpLWUrci5TSVpFT0ZfSU5UKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuc3RhcnRPYmplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5ub3ROZXN0ZWQoKSxudWxsPT10aGlzLnZ0YWJsZSYmKHRoaXMudnRhYmxlPVtdKSx0aGlzLnZ0YWJsZV9pbl91c2U9ZTtmb3IodmFyIHQ9MDt0PGU7dCsrKXRoaXMudnRhYmxlW3RdPTA7dGhpcy5pc05lc3RlZD0hMCx0aGlzLm9iamVjdF9zdGFydD10aGlzLm9mZnNldCgpO30sci5CdWlsZGVyLnByb3RvdHlwZS5lbmRPYmplY3Q9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLnZ0YWJsZXx8IXRoaXMuaXNOZXN0ZWQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZW5kT2JqZWN0IGNhbGxlZCB3aXRob3V0IHN0YXJ0T2JqZWN0Iik7dGhpcy5hZGRJbnQzMigwKTtmb3IodmFyIGU9dGhpcy5vZmZzZXQoKSx0PXRoaXMudnRhYmxlX2luX3VzZS0xO3Q+PTAmJjA9PXRoaXMudnRhYmxlW3RdO3QtLSk7Zm9yKHZhciBuPXQrMTt0Pj0wO3QtLSl0aGlzLmFkZEludDE2KDAhPXRoaXMudnRhYmxlW3RdP2UtdGhpcy52dGFibGVbdF06MCk7dGhpcy5hZGRJbnQxNihlLXRoaXMub2JqZWN0X3N0YXJ0KTt2YXIgbz0obisyKSpyLlNJWkVPRl9TSE9SVDt0aGlzLmFkZEludDE2KG8pO3ZhciBpPTAscz10aGlzLnNwYWNlO2U6Zm9yKHQ9MDt0PHRoaXMudnRhYmxlcy5sZW5ndGg7dCsrKXt2YXIgYT10aGlzLmJiLmNhcGFjaXR5KCktdGhpcy52dGFibGVzW3RdO2lmKG89PXRoaXMuYmIucmVhZEludDE2KGEpKXtmb3IodmFyIHU9ci5TSVpFT0ZfU0hPUlQ7dTxvO3UrPXIuU0laRU9GX1NIT1JUKWlmKHRoaXMuYmIucmVhZEludDE2KHMrdSkhPXRoaXMuYmIucmVhZEludDE2KGErdSkpY29udGludWUgZTtpPXRoaXMudnRhYmxlc1t0XTticmVha319cmV0dXJuIGk/KHRoaXMuc3BhY2U9dGhpcy5iYi5jYXBhY2l0eSgpLWUsdGhpcy5iYi53cml0ZUludDMyKHRoaXMuc3BhY2UsaS1lKSk6KHRoaXMudnRhYmxlcy5wdXNoKHRoaXMub2Zmc2V0KCkpLHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCktZSx0aGlzLm9mZnNldCgpLWUpKSx0aGlzLmlzTmVzdGVkPSExLGV9LHIuQnVpbGRlci5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1uP3IuU0laRV9QUkVGSVhfTEVOR1RIOjA7aWYodCl7dmFyIGk9dDtpZih0aGlzLnByZXAodGhpcy5taW5hbGlnbixyLlNJWkVPRl9JTlQrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIK28pLGkubGVuZ3RoIT1yLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICIrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKTtmb3IodmFyIHM9ci5GSUxFX0lERU5USUZJRVJfTEVOR1RILTE7cz49MDtzLS0pdGhpcy53cml0ZUludDgoaS5jaGFyQ29kZUF0KHMpKTt9dGhpcy5wcmVwKHRoaXMubWluYWxpZ24sci5TSVpFT0ZfSU5UK28pLHRoaXMuYWRkT2Zmc2V0KGUpLG8mJnRoaXMuYWRkSW50MzIodGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2UpLHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmZpbmlzaFNpemVQcmVmaXhlZD1mdW5jdGlvbihlLHQpe3RoaXMuZmluaXNoKGUsdCwhMCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLnJlcXVpcmVkRmllbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJiLmNhcGFjaXR5KCktZSxyPW4tdGhpcy5iYi5yZWFkSW50MzIobik7aWYoMD09dGhpcy5iYi5yZWFkSW50MTYocit0KSl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBmaWVsZCAiK3QrIiBtdXN0IGJlIHNldCIpfSxyLkJ1aWxkZXIucHJvdG90eXBlLnN0YXJ0VmVjdG9yPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLm5vdE5lc3RlZCgpLHRoaXMudmVjdG9yX251bV9lbGVtcz10LHRoaXMucHJlcChyLlNJWkVPRl9JTlQsZSp0KSx0aGlzLnByZXAobixlKnQpO30sci5CdWlsZGVyLnByb3RvdHlwZS5lbmRWZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53cml0ZUludDMyKHRoaXMudmVjdG9yX251bV9lbGVtcyksdGhpcy5vZmZzZXQoKX0sci5CdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVTdHJpbmc9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdmFyIHQ9ZTtlbHNlIHt0PVtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7KXt2YXIgcixvPWUuY2hhckNvZGVBdChuKyspOyhyPW88NTUyOTZ8fG8+PTU2MzIwP286KG88PDEwKStlLmNoYXJDb2RlQXQobisrKSstNTY2MTM4ODgpPDEyOD90LnB1c2gocik6KHI8MjA0OD90LnB1c2gocj4+NiYzMXwxOTIpOihyPDY1NTM2P3QucHVzaChyPj4xMiYxNXwyMjQpOnQucHVzaChyPj4xOCY3fDI0MCxyPj4xMiY2M3wxMjgpLHQucHVzaChyPj42JjYzfDEyOCkpLHQucHVzaCg2MyZyfDEyOCkpO319dGhpcy5hZGRJbnQ4KDApLHRoaXMuc3RhcnRWZWN0b3IoMSx0Lmxlbmd0aCwxKSx0aGlzLmJiLnNldFBvc2l0aW9uKHRoaXMuc3BhY2UtPXQubGVuZ3RoKSxuPTA7Zm9yKHZhciBpPXRoaXMuc3BhY2Uscz10aGlzLmJiLmJ5dGVzKCk7bjx0Lmxlbmd0aDtuKyspc1tpKytdPXRbbl07cmV0dXJuIHRoaXMuZW5kVmVjdG9yKCl9LHIuQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTG9uZz1mdW5jdGlvbihlLHQpe3JldHVybiByLkxvbmcuY3JlYXRlKGUsdCl9LHIuQnl0ZUJ1ZmZlcj1mdW5jdGlvbihlKXt0aGlzLmJ5dGVzXz1lLHRoaXMucG9zaXRpb25fPTA7fSxyLkJ5dGVCdWZmZXIuYWxsb2NhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByLkJ5dGVCdWZmZXIobmV3IFVpbnQ4QXJyYXkoZSkpfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbl89MDt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc199LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl99LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5wb3NpdGlvbl89ZTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuY2FwYWNpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc18ubGVuZ3RofSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRVaW50OChlKTw8MjQ+PjI0fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50OD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ieXRlc19bZV19LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRVaW50MTYoZSk8PDE2Pj4xNn0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ5dGVzX1tlXXx0aGlzLmJ5dGVzX1tlKzFdPDw4fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ieXRlc19bZV18dGhpcy5ieXRlc19bZSsxXTw8OHx0aGlzLmJ5dGVzX1tlKzJdPDwxNnx0aGlzLmJ5dGVzX1tlKzNdPDwyNH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRJbnQzMihlKT4+PjB9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDY0PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgci5Mb25nKHRoaXMucmVhZEludDMyKGUpLHRoaXMucmVhZEludDMyKGUrNCkpfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByLkxvbmcodGhpcy5yZWFkVWludDMyKGUpLHRoaXMucmVhZFVpbnQzMihlKzQpKX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXQzMj1mdW5jdGlvbihlKXtyZXR1cm4gci5pbnQzMlswXT10aGlzLnJlYWRJbnQzMihlKSxyLmZsb2F0MzJbMF19LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8wOjFdPXRoaXMucmVhZEludDMyKGUpLHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8xOjBdPXRoaXMucmVhZEludDMyKGUrNCksci5mbG9hdDY0WzBdfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQpe3RoaXMuYnl0ZXNfW2VdPXQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDg9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10O30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2PWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dCx0aGlzLmJ5dGVzX1tlKzFdPXQ+Pjg7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2PWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dCx0aGlzLmJ5dGVzX1tlKzFdPXQ+Pjg7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzI9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+OCx0aGlzLmJ5dGVzX1tlKzJdPXQ+PjE2LHRoaXMuYnl0ZXNfW2UrM109dD4+MjQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyPWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dCx0aGlzLmJ5dGVzX1tlKzFdPXQ+PjgsdGhpcy5ieXRlc19bZSsyXT10Pj4xNix0aGlzLmJ5dGVzX1tlKzNdPXQ+PjI0O30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDY0PWZ1bmN0aW9uKGUsdCl7dGhpcy53cml0ZUludDMyKGUsdC5sb3cpLHRoaXMud3JpdGVJbnQzMihlKzQsdC5oaWdoKTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50NjQ9ZnVuY3Rpb24oZSx0KXt0aGlzLndyaXRlVWludDMyKGUsdC5sb3cpLHRoaXMud3JpdGVVaW50MzIoZSs0LHQuaGlnaCk7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQzMj1mdW5jdGlvbihlLHQpe3IuZmxvYXQzMlswXT10LHRoaXMud3JpdGVJbnQzMihlLHIuaW50MzJbMF0pO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0NjQ9ZnVuY3Rpb24oZSx0KXtyLmZsb2F0NjRbMF09dCx0aGlzLndyaXRlSW50MzIoZSxyLmludDMyW3IuaXNMaXR0bGVFbmRpYW4/MDoxXSksdGhpcy53cml0ZUludDMyKGUrNCxyLmludDMyW3IuaXNMaXR0bGVFbmRpYW4/MTowXSk7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLmdldEJ1ZmZlcklkZW50aWZpZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmJ5dGVzXy5sZW5ndGg8dGhpcy5wb3NpdGlvbl8rci5TSVpFT0ZfSU5UK3IuRklMRV9JREVOVElGSUVSX0xFTkdUSCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBCeXRlQnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluIGFuIGlkZW50aWZpZXIuIik7Zm9yKHZhciBlPSIiLHQ9MDt0PHIuRklMRV9JREVOVElGSUVSX0xFTkdUSDt0KyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb25fK3IuU0laRU9GX0lOVCt0KSk7cmV0dXJuIGV9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19vZmZzZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLXRoaXMucmVhZEludDMyKGUpO3JldHVybiB0PHRoaXMucmVhZEludDE2KG4pP3RoaXMucmVhZEludDE2KG4rdCk6MH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX3VuaW9uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYmJfcG9zPXQrdGhpcy5yZWFkSW50MzIodCksZS5iYj10aGlzLGV9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19zdHJpbmc9ZnVuY3Rpb24oZSx0KXtlKz10aGlzLnJlYWRJbnQzMihlKTt2YXIgbj10aGlzLnJlYWRJbnQzMihlKSxvPSIiLGk9MDtpZihlKz1yLlNJWkVPRl9JTlQsdD09PXIuRW5jb2RpbmcuVVRGOF9CWVRFUylyZXR1cm4gdGhpcy5ieXRlc18uc3ViYXJyYXkoZSxlK24pO2Zvcig7aTxuOyl7dmFyIHMsYT10aGlzLnJlYWRVaW50OChlK2krKyk7aWYoYTwxOTIpcz1hO2Vsc2Uge3ZhciB1PXRoaXMucmVhZFVpbnQ4KGUraSsrKTtpZihhPDIyNClzPSgzMSZhKTw8Nnw2MyZ1O2Vsc2Uge3ZhciBsPXRoaXMucmVhZFVpbnQ4KGUraSsrKTtzPWE8MjQwPygxNSZhKTw8MTJ8KDYzJnUpPDw2fDYzJmw6KDcmYSk8PDE4fCg2MyZ1KTw8MTJ8KDYzJmwpPDw2fDYzJnRoaXMucmVhZFVpbnQ4KGUraSsrKTt9fXM8NjU1MzY/bys9U3RyaW5nLmZyb21DaGFyQ29kZShzKToocy09NjU1MzYsbys9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5Nisocz4+MTApLDU2MzIwKygxMDIzJnMpKSk7fXJldHVybiBvfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9faW5kaXJlY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUrdGhpcy5yZWFkSW50MzIoZSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX192ZWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUrdGhpcy5yZWFkSW50MzIoZSkrci5TSVpFT0ZfSU5UfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fdmVjdG9yX2xlbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWFkSW50MzIoZSt0aGlzLnJlYWRJbnQzMihlKSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19oYXNfaWRlbnRpZmllcj1mdW5jdGlvbihlKXtpZihlLmxlbmd0aCE9ci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpbGUgaWRlbnRpZmllciBtdXN0IGJlIGxlbmd0aCAiK3IuRklMRV9JREVOVElGSUVSX0xFTkdUSCk7Zm9yKHZhciB0PTA7dDxyLkZJTEVfSURFTlRJRklFUl9MRU5HVEg7dCsrKWlmKGUuY2hhckNvZGVBdCh0KSE9dGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXytyLlNJWkVPRl9JTlQrdCkpcmV0dXJuICExO3JldHVybiAhMH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5jcmVhdGVMb25nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuTG9uZy5jcmVhdGUoZSx0KX07fX0sX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18oZSl7dmFyIHQ9X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW2VdO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHQuZXhwb3J0czt2YXIgbj1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bZV09e2V4cG9ydHM6e319O3JldHVybiBfX3dlYnBhY2tfbW9kdWxlc19fW2VdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pLG4uZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm49ZT0+e3ZhciB0PWUmJmUuX19lc01vZHVsZT8oKT0+ZS5kZWZhdWx0OigpPT5lO3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQodCx7YTp0fSksdH0sX193ZWJwYWNrX3JlcXVpcmVfXy5kPShlLHQpPT57Zm9yKHZhciBuIGluIHQpX193ZWJwYWNrX3JlcXVpcmVfXy5vKHQsbikmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZSxuKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6dFtuXX0pO30sX193ZWJwYWNrX3JlcXVpcmVfXy5vPShlLHQpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSxfX3dlYnBhY2tfcmVxdWlyZV9fLnI9ZT0+eyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7fTt2YXIgX193ZWJwYWNrX2V4cG9ydHNfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKDEwNTcpO3JldHVybiBfX3dlYnBhY2tfZXhwb3J0c19ffSkoKSxtb2R1bGUuZXhwb3J0cz10KCk7fSkob3J0X21pbixvcnRfbWluLmV4cG9ydHMpO3ZhciBvcnRfbWluRXhwb3J0cz1vcnRfbWluLmV4cG9ydHM7Z2V0RGVmYXVsdEV4cG9ydEZyb21DanMob3J0X21pbkV4cG9ydHMpOwoKY2xhc3MgV29ya2VyTmF0aXZle2NvbnN0cnVjdG9yKCl7dGhpcy5yZWFkeT0hMTt0aGlzLmluZGV4ZWREQk1hbmFnZXI9bmV3IEluZGV4ZWREQk1hbmFnZXIoIm9uaXJpeC1zZGsiLCJmaWxlcyIpLHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGaWxlRnJvbUluZGV4ZWREQigiU0RLXzEuOS4xIikudGhlbigoYXN5bmMgZT0+e2xldCB0PVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpO2NvbnN0e2RlZmF1bHQ6YX09YXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUsIHdlYnBhY2tNb2RlOiAibGF6eSIgKi90KSxzPWF3YWl0IGEoKTt0aGlzLm5hdGl2ZVNESz1zLHRoaXMuc3BhdGlhbEJ1ZmZlclNpemU9dGhpcy5uYXRpdmVTREsuX09YX0dldEJ1ZmZlclNpemUoKSx0aGlzLmZyb21CdWZmZXI9dGhpcy5uYXRpdmVTREsuX21hbGxvYyg0KnRoaXMuc3BhdGlhbEJ1ZmZlclNpemUpLHRoaXMudG9CdWZmZXI9dGhpcy5uYXRpdmVTREsuX21hbGxvYyg0KnRoaXMuc3BhdGlhbEJ1ZmZlclNpemUpO2xldCByPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGaWxlRnJvbUluZGV4ZWREQigib25ueC53YXNtIiksaT1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyXSx7dHlwZToiYXBwbGljYXRpb24vd2FzbSJ9KSk7b3J0X21pbkV4cG9ydHMuZW52Lndhc20ud2FzbVBhdGhzPXsib3J0LXdhc20tc2ltZC53YXNtIjppfTtsZXQgbj1hd2FpdCB0aGlzLmluZGV4ZWREQk1hbmFnZXIuZ2V0RnJvbUNhY2hlT3JGZXRjaCgic3BhcnNlX21hdGNoaW5nLm9ubngiLCJodHRwczovL3Nkay5vbmlyaXguY29tL2NvbW1vbi9zcGFyc2VfbWF0Y2hpbmcub25ueCIpO2NvbnN0IG89YXdhaXQgb3J0X21pbkV4cG9ydHMuSW5mZXJlbmNlU2Vzc2lvbi5jcmVhdGUobix7ZXhlY3V0aW9uUHJvdmlkZXJzOlsid2FzbSJdfSk7dGhpcy5zZXNzaW9uTWF0Y2hpbmc9byxhd2FpdCB0aGlzLnNlc3Npb25NYXRjaGluZy5ydW4oe2ZlYXRzMDpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkoQXJyYXkoNjRlMykuZmlsbCgwKSksWzFlMyw2NF0pLGZlYXRzMTpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkoQXJyYXkoNjRlMykuZmlsbCgwKSksWzFlMyw2NF0pfSksdGhpcy5yZWFkeT0hMCxwb3N0TWVzc2FnZSgicmVhZHkiKTt9KSk7fXN0YXJ0KCl7YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGFzeW5jIGU9PntpZighdGhpcy5yZWFkeSlyZXR1cm47Y29uc3QgdD1lLmRhdGEsYT10LmZyb20scz10LnRvO2xldCByO2lmKDI9PXQuZHR5cGUpe2xldCBlPXRoaXMucmVhZERlc2NyaXB0b3JzKGEpLHQ9dGhpcy5yZWFkRGVzY3JpcHRvcnMocyksaT1hd2FpdCB0aGlzLnNlc3Npb25NYXRjaGluZy5ydW4oe2ZlYXRzMDplLGZlYXRzMTp0fSkse2lkeDA6bixpZHgxOm99PWksaD1bbi5kaW1zWzBdXTtmb3IobGV0IGU9MDtlPG4uZGltc1swXTtlKyspaC5wdXNoKE51bWJlcihuLmRhdGFbZV0pKSxoLnB1c2goTnVtYmVyKG8uZGF0YVtlXSkpO3I9bmV3IEZsb2F0MzJBcnJheShoKTt9ZWxzZSB7dGhpcy5uYXRpdmVTREsuSEVBUEYzMi5zZXQoYSx0aGlzLmZyb21CdWZmZXIvNCksdGhpcy5uYXRpdmVTREsuSEVBUEYzMi5zZXQocyx0aGlzLnRvQnVmZmVyLzQpO2xldCBlPXRoaXMubmF0aXZlU0RLLl9PWF9NYXRjaCh0aGlzLmZyb21CdWZmZXIsdGhpcy50b0J1ZmZlcix0LmR0eXBlKTtyPW5ldyBGbG9hdDMyQXJyYXkodGhpcy5yZWFkTWF0Y2hpbmdEYXRhKHRoaXMubmF0aXZlU0RLLkhFQVBGMzIsZS80KSk7fXBvc3RNZXNzYWdlKHIpO30pKTt9cmVhZERlc2NyaXB0b3JzKGUpe2xldCB0PWVbMF0sYT0xKzIqdDtyZXR1cm4gbmV3IG9ydF9taW5FeHBvcnRzLlRlbnNvcihuZXcgRmxvYXQzMkFycmF5KGUuc2xpY2UoYSxhKzY0KnQpKSxbdCw2NF0pfXJlYWRNYXRjaGluZ0RhdGEoZSx0KXtsZXQgYT10LHM9W10scj1lW2FdO3MucHVzaChyKSxhKys7Zm9yKGxldCB0PTA7dDxyO3QrKylzLnB1c2goZVthXSkscy5wdXNoKGVbYSsxXSksYSs9MjtyZXR1cm4gc319Y29uc3Qgd29ya2VyPW5ldyBXb3JrZXJOYXRpdmU7d29ya2VyLnN0YXJ0KCk7Cg=="),d=new Blob([b],{type:"application/javascript"});this.workers[l]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(d),{type:"module"}),this.callbacks[l]=Z,this.workers[l].addEventListener("message",(Z=>{this.callbacks[l](Z.data);}));}}replaceCallback(l,Z){this.workerExists(l)&&(this.callbacks[l]=Z);}sendDataToWorker(l,Z){this.workers[l].postMessage(Z);}async createWorkers(){return await this.indexedDBManager.getFromCacheOrFetch("onnx.wasm",new URL("./ort-wasm-simd.wasm",import.meta.url)),Promise.all([new Promise(((l,Z)=>{this.createExtractionWorker("extraction",(Z=>{"ready"===Z&&l();}));})),new Promise(((l,Z)=>{this.createMatchingWorker("matching",(Z=>{"ready"===Z&&l();}));}))])}}
|
51
|
+
class WorkerExtractionData{constructor(Z,l,d,b,c,m,G=5,X=!1){this.data=Z,this.width=l,this.height=d,this.rotate=b,this.flip=c,this.colorSpace=G,this.onlyCoarse=X,this.dtype=m;}}class WorkerMatchingData{constructor(Z,l,d,b){this.idx=Z,this.from=l,this.to=d,this.dtype=b;}}class WorkerManager{constructor(){this.workers={},this.callbacks={};this.indexedDBManager=new IndexedDBManager("onirix-sdk","files");}workerExists(Z){return void 0!==this.workers[Z]&&void 0!==this.callbacks[Z]}createExtractionWorker(Z,l){if(!this.workerExists(Z)){let d=atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319Cgp2YXIgaGUsaixpZSxBcix1dCxjdCxkdCxfLEEsbXQsaHQsSGUseXQsYnQsZ3QsRXQsVHQsSCxhZSxBdCxPdCxMdCxJdCx2LFIsdnQsQnQsVixZLHllLE9yLFdlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxncj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLEVyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLFRyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksJGU9KGU9PnR5cGVvZiByZXF1aXJlPCJ1Ij9yZXF1aXJlOnR5cGVvZiBQcm94eTwidSI/bmV3IFByb3h5KGUse2dldDooZSx0KT0+KHR5cGVvZiByZXF1aXJlPCJ1Ij9yZXF1aXJlOmUpW3RdfSk6ZSkoKGZ1bmN0aW9uKGUpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJytlKyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pKSxUPShlLHQpPT4oKT0+KGUmJih0PWUoZT0wKSksdCksR2U9KGUsdCk9Pntmb3IodmFyIHIgaW4gdClXZShlLHIse2dldDp0W3JdLGVudW1lcmFibGU6ITB9KTt9LFNyPShlLHQscixuKT0+e2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpZm9yKGxldCBvIG9mIEVyKHQpKSFUci5jYWxsKGUsbykmJm8hPT1yJiZXZShlLG8se2dldDooKT0+dFtvXSxlbnVtZXJhYmxlOiEobj1ncih0LG8pKXx8bi5lbnVtZXJhYmxlfSk7cmV0dXJuIGV9LGF0PWU9PlNyKFdlKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKSx6ZT1UKCgoKT0+e2hlPW5ldyBNYXAsaj1bXSxpZT0oZSx0LHIpPT57aWYoIXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmluaXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNyZWF0ZUluZmVyZW5jZVNlc3Npb25IYW5kbGVyKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIHZhbGlkIGJhY2tlbmQiKTt7bGV0IG49aGUuZ2V0KGUpO2lmKHZvaWQgMD09PW4paGUuc2V0KGUse2JhY2tlbmQ6dCxwcmlvcml0eTpyfSk7ZWxzZSB7aWYobi5wcmlvcml0eT5yKXJldHVybjtpZihuLnByaW9yaXR5PT09ciYmbi5iYWNrZW5kIT09dCl0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWdpc3RlciBiYWNrZW5kICIke2V9IiB1c2luZyBwcmlvcml0eSAke3J9YCl9aWYocj49MCl7bGV0IHQ9ai5pbmRleE9mKGUpOy0xIT09dCYmai5zcGxpY2UodCwxKTtmb3IobGV0IHQ9MDt0PGoubGVuZ3RoO3QrKylpZihoZS5nZXQoalt0XSkucHJpb3JpdHk8PXIpcmV0dXJuIHZvaWQgai5zcGxpY2UodCwwLGUpO2oucHVzaChlKTt9fX0sQXI9YXN5bmMgZT0+e2xldCB0PWhlLmdldChlKTtpZighdClyZXR1cm4gImJhY2tlbmQgbm90IGZvdW5kLiI7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZClyZXR1cm4gdC5lcnJvcjt7bGV0IHI9ISF0LmluaXRQcm9taXNlO3RyeXtyZXR1cm4gcnx8KHQuaW5pdFByb21pc2U9dC5iYWNrZW5kLmluaXQoZSkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2goZSl7cmV0dXJuIHJ8fCh0LmVycm9yPWAke2V9YCx0LmFib3J0ZWQ9ITApLHQuZXJyb3J9ZmluYWxseXtkZWxldGUgdC5pbml0UHJvbWlzZTt9fX0sdXQ9YXN5bmMgZT0+e2xldCB0LHI9ZS5leGVjdXRpb25Qcm92aWRlcnN8fFtdLG49ci5tYXAoKGU9PiJzdHJpbmciPT10eXBlb2YgZT9lOmUubmFtZSkpLG89MD09PW4ubGVuZ3RoP2o6bixhPVtdLGk9bmV3IFNldDtmb3IobGV0IGUgb2Ygbyl7bGV0IHI9YXdhaXQgQXIoZSk7InN0cmluZyI9PXR5cGVvZiByP2EucHVzaCh7bmFtZTplLGVycjpyfSk6KHR8fCh0PXIpLHQ9PT1yJiZpLmFkZChlKSk7fWlmKCF0KXRocm93IG5ldyBFcnJvcihgbm8gYXZhaWxhYmxlIGJhY2tlbmQgZm91bmQuIEVSUjogJHthLm1hcCgoZT0+YFske2UubmFtZX1dICR7ZS5lcnJ9YCkpLmpvaW4oIiwgIil9YCk7Zm9yKGxldHtuYW1lOmUsZXJyOnR9b2YgYSluLmluY2x1ZGVzKGUpJiZjb25zb2xlLndhcm4oYHJlbW92aW5nIHJlcXVlc3RlZCBleGVjdXRpb24gcHJvdmlkZXIgIiR7ZX0iIGZyb20gc2Vzc2lvbiBvcHRpb25zIGJlY2F1c2UgaXQgaXMgbm90IGF2YWlsYWJsZTogJHt0fWApO2xldCBzPXIuZmlsdGVyKChlPT5pLmhhcygic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSk7cmV0dXJuIFt0LG5ldyBQcm94eShlLHtnZXQ6KGUsdCk9PiJleGVjdXRpb25Qcm92aWRlcnMiPT09dD9zOlJlZmxlY3QuZ2V0KGUsdCl9KV19O30pKSxmdD1UKCgoKT0+e3plKCk7fSkpLGx0PVQoKCgpPT57Y3Q9IjEuMjEuMCI7fSkpLGplPVQoKCgpPT57bHQoKSxkdD0id2FybmluZyIsXz17d2FzbTp7fSx3ZWJnbDp7fSx3ZWJncHU6e30sdmVyc2lvbnM6e2NvbW1vbjpjdH0sc2V0IGxvZ0xldmVsKGUpe2lmKHZvaWQgMCE9PWUpe2lmKCJzdHJpbmciIT10eXBlb2YgZXx8LTE9PT1bInZlcmJvc2UiLCJpbmZvIiwid2FybmluZyIsImVycm9yIiwiZmF0YWwiXS5pbmRleE9mKGUpKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtlfWApO2R0PWU7fX0sZ2V0IGxvZ0xldmVsKCl7cmV0dXJuIGR0fX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KF8sImxvZ0xldmVsIix7ZW51bWVyYWJsZTohMH0pO30pKSxwdD1UKCgoKT0+e2plKCksQT1fO30pKSx3dD1UKCgoKT0+e210PShlLHQpPT57bGV0IHI9dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTpuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSk7ci53aWR0aD1lLmRpbXNbM10sci5oZWlnaHQ9ZS5kaW1zWzJdO2xldCBuPXIuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1uKXtsZXQgbyxhO3ZvaWQgMCE9PXQ/LnRlbnNvckxheW91dCYmIk5IV0MiPT09dC50ZW5zb3JMYXlvdXQ/KG89ZS5kaW1zWzJdLGE9ZS5kaW1zWzNdKToobz1lLmRpbXNbM10sYT1lLmRpbXNbMl0pO2xldCBpLHMsbD12b2lkIDAhPT10Py5mb3JtYXQ/dC5mb3JtYXQ6IlJHQiIsdT10Py5ub3JtO3ZvaWQgMD09PXV8fHZvaWQgMD09PXUubWVhbj9pPVsyNTUsMjU1LDI1NSwyNTVdOiJudW1iZXIiPT10eXBlb2YgdS5tZWFuP2k9W3UubWVhbix1Lm1lYW4sdS5tZWFuLHUubWVhbl06KGk9W3UubWVhblswXSx1Lm1lYW5bMV0sdS5tZWFuWzJdLDBdLHZvaWQgMCE9PXUubWVhblszXSYmKGlbM109dS5tZWFuWzNdKSksdm9pZCAwPT09dXx8dm9pZCAwPT09dS5iaWFzP3M9WzAsMCwwLDBdOiJudW1iZXIiPT10eXBlb2YgdS5iaWFzP3M9W3UuYmlhcyx1LmJpYXMsdS5iaWFzLHUuYmlhc106KHM9W3UuYmlhc1swXSx1LmJpYXNbMV0sdS5iaWFzWzJdLDBdLHZvaWQgMCE9PXUuYmlhc1szXSYmKHNbM109dS5iaWFzWzNdKSk7bGV0IGY9YSpvLGQ9MCxwPWYsYz0yKmYsaD0tMTsiUkdCQSI9PT1sPyhkPTAscD1mLGM9MipmLGg9MypmKToiUkdCIj09PWw/KGQ9MCxwPWYsYz0yKmYpOiJSQkciPT09bCYmKGQ9MCxjPWYscD0yKmYpO2ZvcihsZXQgdD0wO3Q8YTt0KyspZm9yKGxldCByPTA7cjxvO3IrKyl7bGV0IG89KGUuZGF0YVtkKytdLXNbMF0pKmlbMF0sYT0oZS5kYXRhW3ArK10tc1sxXSkqaVsxXSxsPShlLmRhdGFbYysrXS1zWzJdKSppWzJdLHU9LTE9PT1oPzI1NTooZS5kYXRhW2grK10tc1szXSkqaVszXTtuLmZpbGxTdHlsZT0icmdiYSgiK28rIiwiK2ErIiwiK2wrIiwiK3UrIikiLG4uZmlsbFJlY3Qocix0LDEsMSk7fWlmKCJ0b0RhdGFVUkwiaW4gcilyZXR1cm4gci50b0RhdGFVUkwoKTt0aHJvdyBuZXcgRXJyb3IoInRvRGF0YVVSTCBpcyBub3Qgc3VwcG9ydGVkIil9dGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIil9LGh0PShlLHQpPT57bGV0IHIsbj10eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik6bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIik7aWYobnVsbD09bil0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKTt7bGV0IG8sYSxpO3ZvaWQgMCE9PXQ/LnRlbnNvckxheW91dCYmIk5IV0MiPT09dC50ZW5zb3JMYXlvdXQ/KG89ZS5kaW1zWzJdLGE9ZS5kaW1zWzFdLGk9ZS5kaW1zWzNdKToobz1lLmRpbXNbM10sYT1lLmRpbXNbMl0saT1lLmRpbXNbMV0pO2xldCBzLGwsdT12b2lkIDAhPT10JiZ2b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCIixmPXQ/Lm5vcm07dm9pZCAwPT09Znx8dm9pZCAwPT09Zi5tZWFuP3M9WzI1NSwyNTUsMjU1LDI1NV06Im51bWJlciI9PXR5cGVvZiBmLm1lYW4/cz1bZi5tZWFuLGYubWVhbixmLm1lYW4sZi5tZWFuXToocz1bZi5tZWFuWzBdLGYubWVhblsxXSxmLm1lYW5bMl0sMjU1XSx2b2lkIDAhPT1mLm1lYW5bM10mJihzWzNdPWYubWVhblszXSkpLHZvaWQgMD09PWZ8fHZvaWQgMD09PWYuYmlhcz9sPVswLDAsMCwwXToibnVtYmVyIj09dHlwZW9mIGYuYmlhcz9sPVtmLmJpYXMsZi5iaWFzLGYuYmlhcyxmLmJpYXNdOihsPVtmLmJpYXNbMF0sZi5iaWFzWzFdLGYuYmlhc1syXSwwXSx2b2lkIDAhPT1mLmJpYXNbM10mJihsWzNdPWYuYmlhc1szXSkpO2xldCBkPWEqbztpZih2b2lkIDAhPT10JiYodm9pZCAwIT09dC5mb3JtYXQmJjQ9PT1pJiYiUkdCQSIhPT10LmZvcm1hdHx8Mz09PWkmJiJSR0IiIT09dC5mb3JtYXQmJiJCR1IiIT09dC5mb3JtYXQpKXRocm93IG5ldyBFcnJvcigiVGVuc29yIGZvcm1hdCBkb2Vzbid0IG1hdGNoIGlucHV0IHRlbnNvciBkaW1zIik7bGV0IHA9NCxjPTAsaD0xLHc9Mix5PTMsbT0wLGc9ZCxiPTIqZCx2PS0xOyJSR0JBIj09PXU/KG09MCxnPWQsYj0yKmQsdj0zKmQpOiJSR0IiPT09dT8obT0wLGc9ZCxiPTIqZCk6IlJCRyI9PT11JiYobT0wLGI9ZCxnPTIqZCkscj1uLmNyZWF0ZUltYWdlRGF0YShvLGEpO2ZvcihsZXQgdD0wO3Q8YSpvO2MrPXAsaCs9cCx3Kz1wLHkrPXAsdCsrKXIuZGF0YVtjXT0oZS5kYXRhW20rK10tbFswXSkqc1swXSxyLmRhdGFbaF09KGUuZGF0YVtnKytdLWxbMV0pKnNbMV0sci5kYXRhW3ddPShlLmRhdGFbYisrXS1sWzJdKSpzWzJdLHIuZGF0YVt5XT0tMT09PXY/MjU1OihlLmRhdGFbdisrXS1sWzNdKSpzWzNdO31yZXR1cm4gcn07fSkpLFN0PVQoKCgpPT57d2UoKSxIZT0oZSx0KT0+e2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBidWZmZXIgbXVzdCBiZSBkZWZpbmVkIik7aWYodm9pZCAwPT09dC5oZWlnaHR8fHZvaWQgMD09PXQud2lkdGgpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBoZWlnaHQgYW5kIHdpZHRoIG11c3QgYmUgZGVmaW5lZCIpO2lmKCJOSFdDIj09PXQudGVuc29yTGF5b3V0KXRocm93IG5ldyBFcnJvcigiTkhXQyBUZW5zb3IgbGF5b3V0IGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7bGV0IHIsbix7aGVpZ2h0Om8sd2lkdGg6YX09dCxpPXQubm9ybT8/e21lYW46MjU1LGJpYXM6MH07cj0ibnVtYmVyIj09dHlwZW9mIGkubWVhbj9baS5tZWFuLGkubWVhbixpLm1lYW4saS5tZWFuXTpbaS5tZWFuWzBdLGkubWVhblsxXSxpLm1lYW5bMl0saS5tZWFuWzNdPz8yNTVdLG49Im51bWJlciI9PXR5cGVvZiBpLmJpYXM/W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLGkuYmlhc1szXT8/MF07bGV0IHM9dm9pZCAwIT09dC5mb3JtYXQ/dC5mb3JtYXQ6IlJHQkEiLGw9dm9pZCAwIT09dC50ZW5zb3JGb3JtYXQmJnZvaWQgMCE9PXQudGVuc29yRm9ybWF0P3QudGVuc29yRm9ybWF0OiJSR0IiLHU9byphLGY9IlJHQkEiPT09bD9uZXcgRmxvYXQzMkFycmF5KDQqdSk6bmV3IEZsb2F0MzJBcnJheSgzKnUpLGQ9NCxwPTAsYz0xLGg9Mix3PTMseT0wLG09dSxnPTIqdSxiPS0xOyJSR0IiPT09cyYmKGQ9MyxwPTAsYz0xLGg9Mix3PS0xKSwiUkdCQSI9PT1sP2I9Myp1OiJSQkciPT09bD8oeT0wLGc9dSxtPTIqdSk6IkJHUiI9PT1sJiYoZz0wLG09dSx5PTIqdSk7Zm9yKGxldCB0PTA7dDx1O3QrKyxwKz1kLGgrPWQsYys9ZCx3Kz1kKWZbeSsrXT0oZVtwXStuWzBdKS9yWzBdLGZbbSsrXT0oZVtjXStuWzFdKS9yWzFdLGZbZysrXT0oZVtoXStuWzJdKS9yWzJdLC0xIT09YiYmLTEhPT13JiYoZltiKytdPShlW3ddK25bM10pL3JbM10pO3JldHVybiBuZXcgdigiZmxvYXQzMiIsZiwiUkdCQSI9PT1sP1sxLDQsbyxhXTpbMSwzLG8sYV0pfSx5dD1hc3luYyhlLHQpPT57bGV0IHIsbj10eXBlb2YgSFRNTEltYWdlRWxlbWVudDwidSImJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50LG89dHlwZW9mIEltYWdlRGF0YTwidSImJmUgaW5zdGFuY2VvZiBJbWFnZURhdGEsYT10eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAsaT0ic3RyaW5nIj09dHlwZW9mIGUscz10Pz97fSxsPSgpPT57aWYodHlwZW9mIGRvY3VtZW50PCJ1IilyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7aWYodHlwZW9mIE9mZnNjcmVlbkNhbnZhczwidSIpcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKTt0aHJvdyBuZXcgRXJyb3IoIkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkIil9LHU9ZT0+dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PCJ1IiYmZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHxlIGluc3RhbmNlb2YgT2Zmc2NyZWVuQ2FudmFzP2UuZ2V0Q29udGV4dCgiMmQiKTpudWxsO2lmKG4pe2xldCBuPWwoKTtuLndpZHRoPWUud2lkdGgsbi5oZWlnaHQ9ZS5oZWlnaHQ7bGV0IG89dShuKTtpZihudWxsPT1vKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgbj1lLmhlaWdodCxhPWUud2lkdGg7aWYodm9pZCAwIT09dCYmdm9pZCAwIT09dC5yZXNpemVkSGVpZ2h0JiZ2b2lkIDAhPT10LnJlc2l6ZWRXaWR0aCYmKG49dC5yZXNpemVkSGVpZ2h0LGE9dC5yZXNpemVkV2lkdGgpLHZvaWQgMCE9PXQpe2lmKHM9dCx2b2lkIDAhPT10LnRlbnNvckZvcm1hdCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7cy50ZW5zb3JGb3JtYXQ9IlJHQkEiLHMuaGVpZ2h0PW4scy53aWR0aD1hO31lbHNlIHMudGVuc29yRm9ybWF0PSJSR0JBIixzLmhlaWdodD1uLHMud2lkdGg9YTtvLmRyYXdJbWFnZShlLDAsMCkscj1vLmdldEltYWdlRGF0YSgwLDAsYSxuKS5kYXRhO319ZWxzZSB7aWYoIW8pe2lmKGEpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBpbWFnZSBjb25maWcgd2l0aCBmb3JtYXQgZm9yIEltYWdlYml0bWFwIik7bGV0IG49bCgpO24ud2lkdGg9ZS53aWR0aCxuLmhlaWdodD1lLmhlaWdodDtsZXQgbz11KG4pO2lmKG51bGwhPW8pe2xldCB0PWUuaGVpZ2h0LG49ZS53aWR0aDtyZXR1cm4gby5kcmF3SW1hZ2UoZSwwLDAsbix0KSxyPW8uZ2V0SW1hZ2VEYXRhKDAsMCxuLHQpLmRhdGEscy5oZWlnaHQ9dCxzLndpZHRoPW4sSGUocixzKX10aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX1pZihpKXJldHVybiBuZXcgUHJvbWlzZSgoKHQscik9PntsZXQgbj1sKCksbz11KG4pO2lmKCFlfHwhbylyZXR1cm4gcigpO2xldCBhPW5ldyBJbWFnZTthLmNyb3NzT3JpZ2luPSJBbm9ueW1vdXMiLGEuc3JjPWUsYS5vbmxvYWQ9KCk9PntuLndpZHRoPWEud2lkdGgsbi5oZWlnaHQ9YS5oZWlnaHQsby5kcmF3SW1hZ2UoYSwwLDAsbi53aWR0aCxuLmhlaWdodCk7bGV0IGU9by5nZXRJbWFnZURhdGEoMCwwLG4ud2lkdGgsbi5oZWlnaHQpO3MuaGVpZ2h0PW4uaGVpZ2h0LHMud2lkdGg9bi53aWR0aCx0KEhlKGUuZGF0YSxzKSk7fTt9KSk7dGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQgLSBhYm9ydGVkIHRlbnNvciBjcmVhdGlvbiIpfXtsZXQgbixvO2lmKHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQucmVzaXplZFdpZHRoJiZ2b2lkIDAhPT10LnJlc2l6ZWRIZWlnaHQ/KG49dC5yZXNpemVkSGVpZ2h0LG89dC5yZXNpemVkV2lkdGgpOihuPWUuaGVpZ2h0LG89ZS53aWR0aCksdm9pZCAwIT09dCYmKHM9dCkscy5mb3JtYXQ9IlJHQkEiLHMuaGVpZ2h0PW4scy53aWR0aD1vLHZvaWQgMCE9PXQpe2xldCB0PWwoKTt0LndpZHRoPW8sdC5oZWlnaHQ9bjtsZXQgYT11KHQpO2lmKG51bGw9PWEpdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7YS5wdXRJbWFnZURhdGEoZSwwLDApLHI9YS5nZXRJbWFnZURhdGEoMCwwLG8sbikuZGF0YTt9ZWxzZSByPWUuZGF0YTt9fWlmKHZvaWQgMCE9PXIpcmV0dXJuIEhlKHIscyk7dGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQgLSBhYm9ydGVkIHRlbnNvciBjcmVhdGlvbiIpfSxidD0oZSx0KT0+e2xldHt3aWR0aDpyLGhlaWdodDpuLGRvd25sb2FkOm8sZGlzcG9zZTphfT10O3JldHVybiBuZXcgdih7bG9jYXRpb246InRleHR1cmUiLHR5cGU6ImZsb2F0MzIiLHRleHR1cmU6ZSxkaW1zOlsxLG4sciw0XSxkb3dubG9hZDpvLGRpc3Bvc2U6YX0pfSxndD0oZSx0KT0+e2xldHtkYXRhVHlwZTpyLGRpbXM6bixkb3dubG9hZDpvLGRpc3Bvc2U6YX09dDtyZXR1cm4gbmV3IHYoe2xvY2F0aW9uOiJncHUtYnVmZmVyIix0eXBlOnI/PyJmbG9hdDMyIixncHVCdWZmZXI6ZSxkaW1zOm4sZG93bmxvYWQ6byxkaXNwb3NlOmF9KX0sRXQ9KGUsdCk9PntsZXR7ZGF0YVR5cGU6cixkaW1zOm4sZG93bmxvYWQ6byxkaXNwb3NlOmF9PXQ7cmV0dXJuIG5ldyB2KHtsb2NhdGlvbjoibWwtdGVuc29yIix0eXBlOnI/PyJmbG9hdDMyIixtbFRlbnNvcjplLGRpbXM6bixkb3dubG9hZDpvLGRpc3Bvc2U6YX0pfSxUdD0oZSx0LHIpPT5uZXcgdih7bG9jYXRpb246ImNwdS1waW5uZWQiLHR5cGU6ZSxkYXRhOnQsZGltczpyPz9bdC5sZW5ndGhdfSk7fSkpLHh0PVQoKCgpPT57SD1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XSxbImludDQiLFVpbnQ4QXJyYXldLFsidWludDQiLFVpbnQ4QXJyYXldXSksYWU9bmV3IE1hcChbW0Zsb2F0MzJBcnJheSwiZmxvYXQzMiJdLFtVaW50OEFycmF5LCJ1aW50OCJdLFtJbnQ4QXJyYXksImludDgiXSxbVWludDE2QXJyYXksInVpbnQxNiJdLFtJbnQxNkFycmF5LCJpbnQxNiJdLFtJbnQzMkFycmF5LCJpbnQzMiJdLFtGbG9hdDY0QXJyYXksImZsb2F0NjQiXSxbVWludDMyQXJyYXksInVpbnQzMiJdXSksQXQ9ITEsT3Q9KCk9PntpZighQXQpe0F0PSEwO2xldCBlPXR5cGVvZiBCaWdJbnQ2NEFycmF5PCJ1IiYmQmlnSW50NjRBcnJheS5mcm9tLHQ9dHlwZW9mIEJpZ1VpbnQ2NEFycmF5PCJ1IiYmQmlnVWludDY0QXJyYXkuZnJvbSxyPWdsb2JhbFRoaXMuRmxvYXQxNkFycmF5LG49dHlwZW9mIHI8InUiJiZyLmZyb207ZSYmKEguc2V0KCJpbnQ2NCIsQmlnSW50NjRBcnJheSksYWUuc2V0KEJpZ0ludDY0QXJyYXksImludDY0IikpLHQmJihILnNldCgidWludDY0IixCaWdVaW50NjRBcnJheSksYWUuc2V0KEJpZ1VpbnQ2NEFycmF5LCJ1aW50NjQiKSksbj8oSC5zZXQoImZsb2F0MTYiLHIpLGFlLnNldChyLCJmbG9hdDE2IikpOkguc2V0KCJmbG9hdDE2IixVaW50MTZBcnJheSk7fX07fSkpLFB0PVQoKCgpPT57d2UoKSxMdD1lPT57bGV0IHQ9MTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG49ZVtyXTtpZigibnVtYmVyIiE9dHlwZW9mIG58fCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBkaW1zWyR7cn1dIG11c3QgYmUgYW4gaW50ZWdlciwgZ290OiAke259YCk7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBkaW1zWyR7cn1dIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290OiAke259YCk7dCo9bjt9cmV0dXJuIHR9LEl0PShlLHQpPT57c3dpdGNoKGUubG9jYXRpb24pe2Nhc2UiY3B1IjpyZXR1cm4gbmV3IHYoZS50eXBlLGUuZGF0YSx0KTtjYXNlImNwdS1waW5uZWQiOnJldHVybiBuZXcgdih7bG9jYXRpb246ImNwdS1waW5uZWQiLGRhdGE6ZS5kYXRhLHR5cGU6ZS50eXBlLGRpbXM6dH0pO2Nhc2UidGV4dHVyZSI6cmV0dXJuIG5ldyB2KHtsb2NhdGlvbjoidGV4dHVyZSIsdGV4dHVyZTplLnRleHR1cmUsdHlwZTplLnR5cGUsZGltczp0fSk7Y2FzZSJncHUtYnVmZmVyIjpyZXR1cm4gbmV3IHYoe2xvY2F0aW9uOiJncHUtYnVmZmVyIixncHVCdWZmZXI6ZS5ncHVCdWZmZXIsdHlwZTplLnR5cGUsZGltczp0fSk7Y2FzZSJtbC10ZW5zb3IiOnJldHVybiBuZXcgdih7bG9jYXRpb246Im1sLXRlbnNvciIsbWxUZW5zb3I6ZS5tbFRlbnNvcix0eXBlOmUudHlwZSxkaW1zOnR9KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdGVuc29yUmVzaGFwZTogdGVuc29yIGxvY2F0aW9uICR7ZS5sb2NhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApfX07fSkpLHdlPVQoKCgpPT57d3QoKSxTdCgpLHh0KCksUHQoKSx2PWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXtsZXQgbixvO2lmKE90KCksIm9iamVjdCI9PXR5cGVvZiBlJiYibG9jYXRpb24iaW4gZSlzd2l0Y2godGhpcy5kYXRhTG9jYXRpb249ZS5sb2NhdGlvbixuPWUudHlwZSxvPWUuZGltcyxlLmxvY2F0aW9uKXtjYXNlImNwdS1waW5uZWQiOntsZXQgdD1ILmdldChuKTtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKGB1bnN1cHBvcnRlZCB0eXBlICIke259IiB0byBjcmVhdGUgdGVuc29yIGZyb20gcGlubmVkIGJ1ZmZlcmApO2lmKCEoZS5kYXRhIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcihgYnVmZmVyIHNob3VsZCBiZSBvZiB0eXBlICR7dC5uYW1lfWApO3RoaXMuY3B1RGF0YT1lLmRhdGE7YnJlYWt9Y2FzZSJ0ZXh0dXJlIjppZigiZmxvYXQzMiIhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7bn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSB0ZXh0dXJlYCk7dGhpcy5ncHVUZXh0dXJlRGF0YT1lLnRleHR1cmUsdGhpcy5kb3dubG9hZGVyPWUuZG93bmxvYWQsdGhpcy5kaXNwb3Nlcj1lLmRpc3Bvc2U7YnJlYWs7Y2FzZSJncHUtYnVmZmVyIjppZigiZmxvYXQzMiIhPT1uJiYiZmxvYXQxNiIhPT1uJiYiaW50MzIiIT09biYmImludDY0IiE9PW4mJiJ1aW50MzIiIT09biYmInVpbnQ4IiE9PW4mJiJib29sIiE9PW4mJiJ1aW50NCIhPT1uJiYiaW50NCIhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7bn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSBncHUgYnVmZmVyYCk7dGhpcy5ncHVCdWZmZXJEYXRhPWUuZ3B1QnVmZmVyLHRoaXMuZG93bmxvYWRlcj1lLmRvd25sb2FkLHRoaXMuZGlzcG9zZXI9ZS5kaXNwb3NlO2JyZWFrO2Nhc2UibWwtdGVuc29yIjppZigiZmxvYXQzMiIhPT1uJiYiZmxvYXQxNiIhPT1uJiYiaW50MzIiIT09biYmImludDY0IiE9PW4mJiJ1aW50MzIiIT09biYmInVpbnQ2NCIhPT1uJiYiaW50OCIhPT1uJiYidWludDgiIT09biYmImJvb2wiIT09biYmInVpbnQ0IiE9PW4mJiJpbnQ0IiE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZSAiJHtufSIgdG8gY3JlYXRlIHRlbnNvciBmcm9tIE1MVGVuc29yYCk7dGhpcy5tbFRlbnNvckRhdGE9ZS5tbFRlbnNvcix0aGlzLmRvd25sb2FkZXI9ZS5kb3dubG9hZCx0aGlzLmRpc3Bvc2VyPWUuZGlzcG9zZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVGVuc29yIGNvbnN0cnVjdG9yOiB1bnN1cHBvcnRlZCBsb2NhdGlvbiAnJHt0aGlzLmRhdGFMb2NhdGlvbn0nYCl9ZWxzZSB7bGV0IGEsaTtpZigic3RyaW5nIj09dHlwZW9mIGUpaWYobj1lLGk9ciwic3RyaW5nIj09PWUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgc3RyaW5nIHRlbnNvcidzIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBhcnJheS4iKTthPXQ7fWVsc2Uge2xldCByPUguZ2V0KGUpO2lmKHZvaWQgMD09PXIpdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgdGVuc29yIHR5cGU6ICR7ZX0uYCk7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYoImZsb2F0MTYiPT09ZSYmcj09PVVpbnQxNkFycmF5fHwidWludDQiPT09ZXx8ImludDQiPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKGBDcmVhdGluZyBhICR7ZX0gdGVuc29yIGZyb20gbnVtYmVyIGFycmF5IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgJHtyLm5hbWV9IGFzIGRhdGEuYCk7YT0idWludDY0Ij09PWV8fCJpbnQ2NCI9PT1lP3IuZnJvbSh0LEJpZ0ludCk6ci5mcm9tKHQpO31lbHNlIGlmKHQgaW5zdGFuY2VvZiByKWE9dDtlbHNlIGlmKHQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSl7aWYoInVpbnQ4IiE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBVaW50OENsYW1wZWRBcnJheSB0ZW5zb3IncyBkYXRhIG11c3QgYmUgdHlwZSBvZiB1aW50OCIpO2E9VWludDhBcnJheS5mcm9tKHQpO31lbHNlIHtpZighKCJmbG9hdDE2Ij09PWUmJnQgaW5zdGFuY2VvZiBVaW50MTZBcnJheSYmciE9PVVpbnQxNkFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKGBBICR7bn0gdGVuc29yJ3MgZGF0YSBtdXN0IGJlIHR5cGUgb2YgJHtyfWApO2E9bmV3IGdsb2JhbFRoaXMuRmxvYXQxNkFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCk7fX1lbHNlIGlmKGk9dCxBcnJheS5pc0FycmF5KGUpKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7bGV0IHQ9dHlwZW9mIGVbMF07aWYoInN0cmluZyI9PT10KW49InN0cmluZyIsYT1lO2Vsc2Uge2lmKCJib29sZWFuIiE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgb2YgZGF0YSBhcnJheTogJHt0fS5gKTtuPSJib29sIixhPVVpbnQ4QXJyYXkuZnJvbShlKTt9fWVsc2UgaWYoZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KW49InVpbnQ4IixhPVVpbnQ4QXJyYXkuZnJvbShlKTtlbHNlIHtsZXQgdD1hZS5nZXQoZS5jb25zdHJ1Y3Rvcik7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0eXBlIGZvciB0ZW5zb3IgZGF0YTogJHtlLmNvbnN0cnVjdG9yfS5gKTtuPXQsYT1lO31pZih2b2lkIDA9PT1pKWk9W2EubGVuZ3RoXTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgdGVuc29yJ3MgZGltcyBtdXN0IGJlIGEgbnVtYmVyIGFycmF5Iik7bz1pLHRoaXMuY3B1RGF0YT1hLHRoaXMuZGF0YUxvY2F0aW9uPSJjcHUiO31sZXQgYT1MdChvKTtpZih0aGlzLmNwdURhdGEmJmEhPT10aGlzLmNwdURhdGEubGVuZ3RoJiYoInVpbnQ0IiE9PW4mJiJpbnQ0IiE9PW58fE1hdGguY2VpbChhLzIpIT09dGhpcy5jcHVEYXRhLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IncyBzaXplKCR7YX0pIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoKCR7dGhpcy5jcHVEYXRhLmxlbmd0aH0pLmApO3RoaXMudHlwZT1uLHRoaXMuZGltcz1vLHRoaXMuc2l6ZT1hO31zdGF0aWMgYXN5bmMgZnJvbUltYWdlKGUsdCl7cmV0dXJuIHl0KGUsdCl9c3RhdGljIGZyb21UZXh0dXJlKGUsdCl7cmV0dXJuIGJ0KGUsdCl9c3RhdGljIGZyb21HcHVCdWZmZXIoZSx0KXtyZXR1cm4gZ3QoZSx0KX1zdGF0aWMgZnJvbU1MVGVuc29yKGUsdCl7cmV0dXJuIEV0KGUsdCl9c3RhdGljIGZyb21QaW5uZWRCdWZmZXIoZSx0LHIpe3JldHVybiBUdChlLHQscil9dG9EYXRhVVJMKGUpe3JldHVybiBtdCh0aGlzLGUpfXRvSW1hZ2VEYXRhKGUpe3JldHVybiBodCh0aGlzLGUpfWdldCBkYXRhKCl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLCF0aGlzLmNwdURhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgb24gQ1BVLiBVc2UgYGdldERhdGEoKWAgdG8gZG93bmxvYWQgR1BVIGRhdGEgdG8gQ1BVLCBvciB1c2UgYHRleHR1cmVgIG9yIGBncHVCdWZmZXJgIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgR1BVIGRhdGEgZGlyZWN0bHkuIik7cmV0dXJuIHRoaXMuY3B1RGF0YX1nZXQgbG9jYXRpb24oKXtyZXR1cm4gdGhpcy5kYXRhTG9jYXRpb259Z2V0IHRleHR1cmUoKXtpZih0aGlzLmVuc3VyZVZhbGlkKCksIXRoaXMuZ3B1VGV4dHVyZURhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViR0wgdGV4dHVyZS4iKTtyZXR1cm4gdGhpcy5ncHVUZXh0dXJlRGF0YX1nZXQgZ3B1QnVmZmVyKCl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLCF0aGlzLmdwdUJ1ZmZlckRhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViR1BVIGJ1ZmZlci4iKTtyZXR1cm4gdGhpcy5ncHVCdWZmZXJEYXRhfWdldCBtbFRlbnNvcigpe2lmKHRoaXMuZW5zdXJlVmFsaWQoKSwhdGhpcy5tbFRlbnNvckRhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViTk4gTUxUZW5zb3IuIik7cmV0dXJuIHRoaXMubWxUZW5zb3JEYXRhfWFzeW5jIGdldERhdGEoZSl7c3dpdGNoKHRoaXMuZW5zdXJlVmFsaWQoKSx0aGlzLmRhdGFMb2NhdGlvbil7Y2FzZSJjcHUiOmNhc2UiY3B1LXBpbm5lZCI6cmV0dXJuIHRoaXMuZGF0YTtjYXNlInRleHR1cmUiOmNhc2UiZ3B1LWJ1ZmZlciI6Y2FzZSJtbC10ZW5zb3IiOmlmKCF0aGlzLmRvd25sb2FkZXIpdGhyb3cgbmV3IEVycm9yKCJUaGUgY3VycmVudCB0ZW5zb3IgaXMgbm90IGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmllZCBkYXRhIGRvd25sb2FkZXIuIik7aWYodGhpcy5pc0Rvd25sb2FkaW5nKXRocm93IG5ldyBFcnJvcigiVGhlIGN1cnJlbnQgdGVuc29yIGlzIGJlaW5nIGRvd25sb2FkZWQuIik7dHJ5e3RoaXMuaXNEb3dubG9hZGluZz0hMDtsZXQgdD1hd2FpdCB0aGlzLmRvd25sb2FkZXIoKTtyZXR1cm4gdGhpcy5kb3dubG9hZGVyPXZvaWQgMCx0aGlzLmRhdGFMb2NhdGlvbj0iY3B1Iix0aGlzLmNwdURhdGE9dCxlJiZ0aGlzLmRpc3Bvc2VyJiYodGhpcy5kaXNwb3NlcigpLHRoaXMuZGlzcG9zZXI9dm9pZCAwKSx0fWZpbmFsbHl7dGhpcy5pc0Rvd25sb2FkaW5nPSExO31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGdldCBkYXRhIGZyb20gbG9jYXRpb246ICR7dGhpcy5kYXRhTG9jYXRpb259YCl9fWRpc3Bvc2UoKXtpZih0aGlzLmlzRG93bmxvYWRpbmcpdGhyb3cgbmV3IEVycm9yKCJUaGUgY3VycmVudCB0ZW5zb3IgaXMgYmVpbmcgZG93bmxvYWRlZC4iKTt0aGlzLmRpc3Bvc2VyJiYodGhpcy5kaXNwb3NlcigpLHRoaXMuZGlzcG9zZXI9dm9pZCAwKSx0aGlzLmNwdURhdGE9dm9pZCAwLHRoaXMuZ3B1VGV4dHVyZURhdGE9dm9pZCAwLHRoaXMuZ3B1QnVmZmVyRGF0YT12b2lkIDAsdGhpcy5tbFRlbnNvckRhdGE9dm9pZCAwLHRoaXMuZG93bmxvYWRlcj12b2lkIDAsdGhpcy5pc0Rvd25sb2FkaW5nPXZvaWQgMCx0aGlzLmRhdGFMb2NhdGlvbj0ibm9uZSI7fWVuc3VyZVZhbGlkKCl7aWYoIm5vbmUiPT09dGhpcy5kYXRhTG9jYXRpb24pdGhyb3cgbmV3IEVycm9yKCJUaGUgdGVuc29yIGlzIGRpc3Bvc2VkLiIpfXJlc2hhcGUoZSl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLHRoaXMuZG93bmxvYWRlcnx8dGhpcy5kaXNwb3Nlcil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZXNoYXBlIGEgdGVuc29yIHRoYXQgb3ducyBHUFUgcmVzb3VyY2UuIik7cmV0dXJuIEl0KHRoaXMsZSl9fTt9KSksVmU9VCgoKCk9Pnt3ZSgpLFI9djt9KSksWWU9VCgoKCk9PntqZSgpLHZ0PShlLHQpPT57KHR5cGVvZiBfLnRyYWNlPiJ1Ij8hXy53YXNtLnRyYWNlOiFfLnRyYWNlKXx8Y29uc29sZS50aW1lU3RhbXAoYCR7ZX06Ok9SVDo6JHt0fWApO30sQnQ9KGUsdCk9PntsZXQgcj0obmV3IEVycm9yKS5zdGFjaz8uc3BsaXQoL1xyXG58XHJ8XG4vZyl8fFtdLG49ITE7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspe2lmKG4mJiFyW29dLmluY2x1ZGVzKCJUUkFDRV9GVU5DIikpe2xldCBuPWBGVU5DXyR7ZX06OiR7cltvXS50cmltKCkuc3BsaXQoIiAiKVsxXX1gO3JldHVybiB0JiYobis9YDo6JHt0fWApLHZvaWQgdnQoIkNQVSIsbil9cltvXS5pbmNsdWRlcygiVFJBQ0VfRlVOQyIpJiYobj0hMCk7fX0sVj1lPT57KHR5cGVvZiBfLnRyYWNlPiJ1Ij8hXy53YXNtLnRyYWNlOiFfLnRyYWNlKXx8QnQoIkJFR0lOIixlKTt9LFk9ZT0+eyh0eXBlb2YgXy50cmFjZT4idSI/IV8ud2FzbS50cmFjZTohXy50cmFjZSl8fEJ0KCJFTkQiLGUpO307fSkpLEN0PVQoKCgpPT57emUoKSxWZSgpLFllKCkseWU9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlKXt0aGlzLmhhbmRsZXI9ZTt9YXN5bmMgcnVuKGUsdCxyKXtWKCk7bGV0IG49e30sbz17fTtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lfHxlIGluc3RhbmNlb2YgUnx8QXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmVlZHMnIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgdXNlIGlucHV0IG5hbWVzIGFzIGtleXMgYW5kIE9ubnhWYWx1ZSBhcyBjb3JyZXNwb25kaW5nIHZhbHVlcy4iKTtsZXQgYT0hMDtpZigib2JqZWN0Ij09dHlwZW9mIHQpe2lmKG51bGw9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMV06IGNhbm5vdCBiZSBudWxsLiIpO2lmKHQgaW5zdGFuY2VvZiBSKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYSBUZW5zb3IiKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4iKTthPSExO2ZvcihsZXQgZSBvZiB0KXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIG11c3QgYmUgYSBzdHJpbmcgYXJyYXkgb3IgYW4gb2JqZWN0LiIpO2lmKC0xPT09dGhpcy5vdXRwdXROYW1lcy5pbmRleE9mKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKGAnZmV0Y2hlcycgY29udGFpbnMgaW52YWxpZCBvdXRwdXQgbmFtZTogJHtlfS5gKTtuW2VdPW51bGw7fWlmKCJvYmplY3QiPT10eXBlb2YgciYmbnVsbCE9PXIpbz1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtsZXQgZT0hMSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2ZvcihsZXQgciBvZiB0aGlzLm91dHB1dE5hbWVzKWlmKC0xIT09aS5pbmRleE9mKHIpKXtsZXQgbz10W3JdOyhudWxsPT09b3x8byBpbnN0YW5jZW9mIFIpJiYoZT0hMCxhPSExLG5bcl09byk7fWlmKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgciYmbnVsbCE9PXIpbz1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIG89dDt9fWVsc2UgaWYodHlwZW9mIHQ8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMV06IG11c3QgYmUgJ2ZldGNoZXMnIG9yICdvcHRpb25zJy4iKTtmb3IobGV0IHQgb2YgdGhpcy5pbnB1dE5hbWVzKWlmKHR5cGVvZiBlW3RdPiJ1Iil0aHJvdyBuZXcgRXJyb3IoYGlucHV0ICcke3R9JyBpcyBtaXNzaW5nIGluICdmZWVkcycuYCk7aWYoYSlmb3IobGV0IGUgb2YgdGhpcy5vdXRwdXROYW1lcyluW2VdPW51bGw7bGV0IGk9YXdhaXQgdGhpcy5oYW5kbGVyLnJ1bihlLG4sbykscz17fTtmb3IobGV0IGUgaW4gaSlpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChpLGUpKXtsZXQgdD1pW2VdO3NbZV09dCBpbnN0YW5jZW9mIFI/dDpuZXcgUih0LnR5cGUsdC5kYXRhLHQuZGltcyk7fXJldHVybiBZKCksc31hc3luYyByZWxlYXNlKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5kaXNwb3NlKCl9c3RhdGljIGFzeW5jIGNyZWF0ZSh0LHIsbixvKXtWKCk7bGV0IGEsaT17fTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKGE9dCwib2JqZWN0Ij09dHlwZW9mIHImJm51bGwhPT1yKWk9cjtlbHNlIGlmKHR5cGVvZiByPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIil9ZWxzZSBpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSl7aWYoYT10LCJvYmplY3QiPT10eXBlb2YgciYmbnVsbCE9PXIpaT1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtpZighKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzBdOiBtdXN0IGJlICdwYXRoJyBvciAnYnVmZmVyJy4iKTt7bGV0IGU9dCxzPTAsbD10LmJ5dGVMZW5ndGg7aWYoIm9iamVjdCI9PXR5cGVvZiByJiZudWxsIT09cilpPXI7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIHIpe2lmKHM9ciwhTnVtYmVyLmlzU2FmZUludGVnZXIocykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidieXRlT2Zmc2V0JyBtdXN0IGJlIGFuIGludGVnZXIuIik7aWYoczwwfHxzPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdieXRlT2Zmc2V0JyBpcyBvdXQgb2YgcmFuZ2UgWzAsICR7ZS5ieXRlTGVuZ3RofSkuYCk7aWYobD10LmJ5dGVMZW5ndGgtcywibnVtYmVyIj09dHlwZW9mIG4pe2lmKGw9biwhTnVtYmVyLmlzU2FmZUludGVnZXIobCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidieXRlTGVuZ3RoJyBtdXN0IGJlIGFuIGludGVnZXIuIik7aWYobDw9MHx8cytsPmUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVMZW5ndGgnIGlzIG91dCBvZiByYW5nZSAoMCwgJHtlLmJ5dGVMZW5ndGgtc31dLmApO2lmKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9PW8paT1vO2Vsc2UgaWYodHlwZW9mIG88InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHR5cGVvZiBuPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInYnl0ZUxlbmd0aCcgbXVzdCBiZSBhIG51bWJlci4iKX1lbHNlIGlmKHR5cGVvZiByPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIik7YT1uZXcgVWludDhBcnJheShlLHMsbCk7fX1sZXRbcyxsXT1hd2FpdCB1dChpKSx1PWF3YWl0IHMuY3JlYXRlSW5mZXJlbmNlU2Vzc2lvbkhhbmRsZXIoYSxsKTtyZXR1cm4gWSgpLG5ldyBlKHUpfXN0YXJ0UHJvZmlsaW5nKCl7dGhpcy5oYW5kbGVyLnN0YXJ0UHJvZmlsaW5nKCk7fWVuZFByb2ZpbGluZygpe3RoaXMuaGFuZGxlci5lbmRQcm9maWxpbmcoKTt9Z2V0IGlucHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5oYW5kbGVyLmlucHV0TmFtZXN9Z2V0IG91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5vdXRwdXROYW1lc319O30pKSxVdD1UKCgoKT0+e0N0KCksT3I9eWU7fSkpLF90PVQoKCgpPT57fSkpLE10PVQoKCgpPT57fSkpLER0PVQoKCgpPT57fSkpLFJ0PVQoKCgpPT57fSkpLHFlPXt9O0dlKHFlLHtJbmZlcmVuY2VTZXNzaW9uOigpPT5PcixUUkFDRTooKT0+dnQsVFJBQ0VfRlVOQ19CRUdJTjooKT0+VixUUkFDRV9GVU5DX0VORDooKT0+WSxUZW5zb3I6KCk9PlIsZW52OigpPT5BLHJlZ2lzdGVyQmFja2VuZDooKT0+aWV9KTt2YXIgcT1UKCgoKT0+e2Z0KCkscHQoKSxVdCgpLFZlKCksX3QoKSxNdCgpLFllKCksRHQoKSxSdCgpO30pKSxiZT1UKCgoKT0+e30pKSxXdD17fTtHZShXdCx7ZGVmYXVsdDooKT0+eHJ9KTt2YXIga3QsTnQseHIsanQsTSxQZSxYZSxJcixQcixIdCx2cixHdCxWdCx6dCxZdCxaZSxLZSx2ZSxxdCxCcixDcixFZSx4LEwsZmUsUyxKdCxVcixfcixNcixEcixadCxlZSxRdCx0ZSxlcix0cixDZSxVZSxycixjZSxScixUZSxTZSxyZSxGcix1ZSxBZSxPZSxucix4ZSxMZSxJZSxaLEQsbGUsTWUsRGUsX2UsdHQscnQsbmUsb2UsTnIsb3Isc3IsaXIsYXIsdXIsZnIsY3IsbHIsV3IsUmUsJHQ9VCgoKCk9PntKZSgpLEooKSxnZSgpLGt0PSJvcnQtd2FzbS1wcm94eS13b3JrZXIiLChOdD1nbG9iYWxUaGlzLnNlbGY/Lm5hbWU9PT1rdCkmJihzZWxmLm9ubWVzc2FnZT1lPT57bGV0e3R5cGU6dCxpbjpyfT1lLmRhdGE7dHJ5e3N3aXRjaCh0KXtjYXNlImluaXQtd2FzbSI6RWUoci53YXNtKS50aGVuKCgoKT0+e1RlKHIpLnRoZW4oKCgpPT57cG9zdE1lc3NhZ2Uoe3R5cGU6dH0pO30pLChlPT57cG9zdE1lc3NhZ2Uoe3R5cGU6dCxlcnI6ZX0pO30pKTt9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsZXJyOmV9KTt9KSk7YnJlYWs7Y2FzZSJpbml0LWVwIjp7bGV0e2VwTmFtZTplLGVudjpufT1yO1NlKG4sZSkudGhlbigoKCk9Pntwb3N0TWVzc2FnZSh7dHlwZTp0fSk7fSksKGU9Pntwb3N0TWVzc2FnZSh7dHlwZTp0LGVycjplfSk7fSkpO2JyZWFrfWNhc2UiY29weS1mcm9tIjp7bGV0e2J1ZmZlcjplfT1yLG49dWUoZSk7cG9zdE1lc3NhZ2Uoe3R5cGU6dCxvdXQ6bn0pO2JyZWFrfWNhc2UiY3JlYXRlIjp7bGV0e21vZGVsOmUsb3B0aW9uczpufT1yO0FlKGUsbikudGhlbigoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsb3V0OmV9KTt9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsZXJyOmV9KTt9KSk7YnJlYWt9Y2FzZSJyZWxlYXNlIjpPZShyKSxwb3N0TWVzc2FnZSh7dHlwZTp0fSk7YnJlYWs7Y2FzZSJydW4iOntsZXR7c2Vzc2lvbklkOmUsaW5wdXRJbmRpY2VzOm4saW5wdXRzOm8sb3V0cHV0SW5kaWNlczphLG9wdGlvbnM6aX09cjt4ZShlLG4sbyxhLG5ldyBBcnJheShhLmxlbmd0aCkuZmlsbChudWxsKSxpKS50aGVuKChlPT57ZS5zb21lKChlPT4iY3B1IiE9PWVbM10pKT9wb3N0TWVzc2FnZSh7dHlwZTp0LGVycjoiUHJveHkgZG9lcyBub3Qgc3VwcG9ydCBub24tY3B1IHRlbnNvciBsb2NhdGlvbi4ifSk6cG9zdE1lc3NhZ2Uoe3R5cGU6dCxvdXQ6ZX0sSWUoWy4uLm8sLi4uZV0pKTt9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsZXJyOmV9KTt9KSk7YnJlYWt9Y2FzZSJlbmQtcHJvZmlsaW5nIjpMZShyKSxwb3N0TWVzc2FnZSh7dHlwZTp0fSk7fX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZTp0LGVycjplfSk7fX0pLHhyPU50P251bGw6ZT0+bmV3IFdvcmtlcihlPz9NLHt0eXBlOiJtb2R1bGUiLG5hbWU6a3R9KTt9KSksZ2U9VCgoKCk9PntiZSgpLGp0PXR5cGVvZiBsb2NhdGlvbj4idSI/dm9pZCAwOmxvY2F0aW9uLm9yaWdpbixNPSgoKT0+aW1wb3J0Lm1ldGEudXJsPy5zdGFydHNXaXRoKCJmaWxlOiIpP25ldyBVUkwobmV3IFVSTCgib3J0Lndhc20uYnVuZGxlLm1pbi5tanMiLGltcG9ydC5tZXRhLnVybCkuaHJlZixqdCkuaHJlZjppbXBvcnQubWV0YS51cmwpKCksUGU9KCk9PntpZihNJiYhTS5zdGFydHNXaXRoKCJibG9iOiIpKXJldHVybiBNLnN1YnN0cmluZygwLE0ubGFzdEluZGV4T2YoIi8iKSsxKX0sWGU9KGUsdCk9Pnt0cnl7bGV0IHI9dD8/TTtyZXR1cm4gKHI/bmV3IFVSTChlLHIpOm5ldyBVUkwoZSkpLm9yaWdpbj09PWp0fWNhdGNoe3JldHVybiAhMX19LElyPShlLHQpPT57bGV0IHI9dD8/TTt0cnl7cmV0dXJuIChyP25ldyBVUkwoZSxyKTpuZXcgVVJMKGUpKS5ocmVmfWNhdGNoe3JldHVybn19LFByPShlLHQpPT5gJHt0Pz8iLi8ifSR7ZX1gLEh0PWFzeW5jIGU9PntsZXQgdD1hd2FpdChhd2FpdCBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkpLmJsb2IoKTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTCh0KX0sdnI9YXN5bmMgZT0+KGF3YWl0IGltcG9ydChlKSkuZGVmYXVsdCxHdD0oJHQoKSxhdChXdCkpLmRlZmF1bHQsVnQ9YXN5bmMoKT0+e2lmKCFNKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGxvYWQgcHJveHkgd29ya2VyOiBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBzY3JpcHQgc291cmNlIFVSTC4iKTtpZihYZShNKSlyZXR1cm4gW3ZvaWQgMCxHdCgpXTtsZXQgZT1hd2FpdCBIdChNKTtyZXR1cm4gW2UsR3QoZSldfSx6dD12b2lkIDAsWXQ9YXN5bmMoZSx0LHIpPT57aWYoIWUmJiF0JiZ6dCYmTSYmWGUoTSkpcmV0dXJuIFt2b2lkIDAsenRdO3tsZXQgbj0ib3J0LXdhc20tc2ltZC10aHJlYWRlZC5tanMiLG89ZT8/SXIobix0KSxhPXImJm8mJiFYZShvLHQpLGk9YT9hd2FpdCBIdChvKTpvPz9QcihuLHQpO3JldHVybiBbYT9pOnZvaWQgMCxhd2FpdCB2cihpKV19fTt9KSksSj1UKCgoKT0+e2dlKCksS2U9ITEsdmU9ITEscXQ9ITEsQnI9KCk9PntpZih0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI+InUiKXJldHVybiAhMTt0cnl7cmV0dXJuIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSImJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKX1jYXRjaHtyZXR1cm4gITF9fSxDcj0oKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2h7cmV0dXJuICExfX0sRWU9YXN5bmMgZT0+e2lmKEtlKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTtpZih2ZSl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvICdpbml0aWFsaXplV2ViQXNzZW1ibHkoKScgZGV0ZWN0ZWQuIik7aWYocXQpdGhyb3cgbmV3IEVycm9yKCJwcmV2aW91cyBjYWxsIHRvICdpbml0aWFsaXplV2ViQXNzZW1ibHkoKScgZmFpbGVkLiIpO3ZlPSEwO2xldCB0PWUuaW5pdFRpbWVvdXQscj1lLm51bVRocmVhZHM7aWYoIUNyKCkpdGhyb3cgbmV3IEVycm9yKCJXZWJBc3NlbWJseSBTSU1EIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIik7bGV0IG49QnIoKTtyPjEmJiFuJiYodHlwZW9mIHNlbGY8InUiJiYhc2VsZi5jcm9zc09yaWdpbklzb2xhdGVkJiZjb25zb2xlLndhcm4oImVudi53YXNtLm51bVRocmVhZHMgaXMgc2V0IHRvICIrcisiLCBidXQgdGhpcyB3aWxsIG5vdCB3b3JrIHVubGVzcyB5b3UgZW5hYmxlIGNyb3NzT3JpZ2luSXNvbGF0ZWQgbW9kZS4gU2VlIGh0dHBzOi8vd2ViLmRldi9jcm9zcy1vcmlnaW4taXNvbGF0aW9uLWd1aWRlLyBmb3IgbW9yZSBpbmZvLiIpLGNvbnNvbGUud2FybigiV2ViQXNzZW1ibHkgbXVsdGktdGhyZWFkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIEZhbGxpbmcgYmFjayB0byBzaW5nbGUtdGhyZWFkaW5nLiIpLGUubnVtVGhyZWFkcz1yPTEpO2xldCBvPWUud2FzbVBhdGhzLGE9InN0cmluZyI9PXR5cGVvZiBvP286dm9pZCAwLGk9bz8ubWpzLHM9aT8uaHJlZj8/aSxsPW8/Lndhc20sdT1sPy5ocmVmPz9sLGY9ZS53YXNtQmluYXJ5LFtkLHBdPWF3YWl0IFl0KHMsYSxyPjEpLGM9ITEsaD1bXTtpZih0PjAmJmgucHVzaChuZXcgUHJvbWlzZSgoZT0+e3NldFRpbWVvdXQoKCgpPT57Yz0hMCxlKCk7fSksdCk7fSkpKSxoLnB1c2gobmV3IFByb21pc2UoKChlLHQpPT57bGV0IG49e251bVRocmVhZHM6cn07aWYoZiluLndhc21CaW5hcnk9ZjtlbHNlIGlmKHV8fGEpbi5sb2NhdGVGaWxlPWU9PnU/P2ErZTtlbHNlIGlmKHMmJjAhPT1zLmluZGV4T2YoImJsb2I6Iikpbi5sb2NhdGVGaWxlPWU9Pm5ldyBVUkwoZSxzKS5ocmVmO2Vsc2UgaWYoZCl7bGV0IGU9UGUoKTtlJiYobi5sb2NhdGVGaWxlPXQ9PmUrdCk7fXAobikudGhlbigodD0+e3ZlPSExLEtlPSEwLFplPXQsZSgpLGQmJlVSTC5yZXZva2VPYmplY3RVUkwoZCk7fSksKGU9Pnt2ZT0hMSxxdD0hMCx0KGUpO30pKTt9KSkpLGF3YWl0IFByb21pc2UucmFjZShoKSxjKXRocm93IG5ldyBFcnJvcihgV2ViQXNzZW1ibHkgYmFja2VuZCBpbml0aWFsaXppbmcgZmFpbGVkIGR1ZSB0byB0aW1lb3V0OiAke3R9bXNgKX0seD0oKT0+e2lmKEtlJiZaZSlyZXR1cm4gWmU7dGhyb3cgbmV3IEVycm9yKCJXZWJBc3NlbWJseSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiIpfTt9KSksQmU9VCgoKCk9PntKKCksTD0oZSx0KT0+e2xldCByPXgoKSxuPXIubGVuZ3RoQnl0ZXNVVEY4KGUpKzEsbz1yLl9tYWxsb2Mobik7cmV0dXJuIHIuc3RyaW5nVG9VVEY4KGUsbyxuKSx0LnB1c2gobyksb30sZmU9KGUsdCxyLG4pPT57aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7aWYoci5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO3IuYWRkKGUpO31PYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2Usb10pPT57bGV0IGE9dD90K2U6ZTtpZigib2JqZWN0Ij09dHlwZW9mIG8pZmUobyxhKyIuIixyLG4pO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBvfHwibnVtYmVyIj09dHlwZW9mIG8pbihhLG8udG9TdHJpbmcoKSk7ZWxzZSB7aWYoImJvb2xlYW4iIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogIit0eXBlb2Ygbyk7bihhLG8/IjEiOiIwIik7fX0pKTt9LFM9ZT0+e2xldCB0PXgoKSxyPXQuc3RhY2tTYXZlKCk7dHJ5e2xldCByPXQuUFRSX1NJWkUsbj10LnN0YWNrQWxsb2MoMipyKTt0Ll9PcnRHZXRMYXN0RXJyb3IobixuK3IpO2xldCBvPU51bWJlcih0LmdldFZhbHVlKG4sND09PXI/ImkzMiI6Imk2NCIpKSxhPXQuZ2V0VmFsdWUobityLCIqIiksaT1hP3QuVVRGOFRvU3RyaW5nKGEpOiIiO3Rocm93IG5ldyBFcnJvcihgJHtlfSBFUlJPUl9DT0RFOiAke299LCBFUlJPUl9NRVNTQUdFOiAke2l9YCl9ZmluYWxseXt0LnN0YWNrUmVzdG9yZShyKTt9fTt9KSksWHQ9VCgoKCk9PntKKCksQmUoKSxKdD1lPT57bGV0IHQ9eCgpLHI9MCxuPVtdLG89ZXx8e307dHJ5e2lmKHZvaWQgMD09PWU/LmxvZ1NldmVyaXR5TGV2ZWwpby5sb2dTZXZlcml0eUxldmVsPTI7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIGUubG9nU2V2ZXJpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dTZXZlcml0eUxldmVsKXx8ZS5sb2dTZXZlcml0eUxldmVsPDB8fGUubG9nU2V2ZXJpdHlMZXZlbD40KXRocm93IG5ldyBFcnJvcihgbG9nIHNlcnZlcml0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7ZS5sb2dTZXZlcml0eUxldmVsfWApO2lmKHZvaWQgMD09PWU/LmxvZ1ZlcmJvc2l0eUxldmVsKW8ubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PWU/LnRlcm1pbmF0ZSYmKG8udGVybWluYXRlPSExKTtsZXQgYT0wO3JldHVybiB2b2lkIDAhPT1lPy50YWcmJihhPUwoZS50YWcsbikpLHI9dC5fT3J0Q3JlYXRlUnVuT3B0aW9ucyhvLmxvZ1NldmVyaXR5TGV2ZWwsby5sb2dWZXJib3NpdHlMZXZlbCwhIW8udGVybWluYXRlLGEpLDA9PT1yJiZTKCJDYW4ndCBjcmVhdGUgcnVuIG9wdGlvbnMuIiksdm9pZCAwIT09ZT8uZXh0cmEmJmZlKGUuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKChlLG8pPT57bGV0IGE9TChlLG4pLGk9TChvLG4pOzAhPT10Ll9PcnRBZGRSdW5Db25maWdFbnRyeShyLGEsaSkmJlMoYENhbid0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke299LmApO30pKSxbcixuXX1jYXRjaChlKXt0aHJvdyAwIT09ciYmdC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMociksbi5mb3JFYWNoKChlPT50Ll9mcmVlKGUpKSksZX19O30pKSxLdD1UKCgoKT0+e0ooKSxCZSgpLFVyPWU9Pntzd2l0Y2goZSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2V9YCl9fSxfcj1lPT57c3dpdGNoKGUpe2Nhc2Uic2VxdWVudGlhbCI6cmV0dXJuIDA7Y2FzZSJwYXJhbGxlbCI6cmV0dXJuIDE7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGV4ZWN1dGlvbiBtb2RlOiAke2V9YCl9fSxNcj1lPT57ZS5leHRyYXx8KGUuZXh0cmE9e30pLGUuZXh0cmEuc2Vzc2lvbnx8KGUuZXh0cmEuc2Vzc2lvbj17fSk7bGV0IHQ9ZS5leHRyYS5zZXNzaW9uO3QudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KHQudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGUuZXhlY3V0aW9uUHJvdmlkZXJzJiZlLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKChlPT4id2ViZ3B1Ij09PSgic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSkmJihlLmVuYWJsZU1lbVBhdHRlcm49ITEpO30sRHI9KGUsdCxyKT0+e2ZvcihsZXQgbiBvZiB0KXtsZXQgdD0ic3RyaW5nIj09dHlwZW9mIG4/bjpuLm5hbWU7c3dpdGNoKHQpe2Nhc2Uid2Vibm4iOmlmKHQ9IldFQk5OIiwic3RyaW5nIiE9dHlwZW9mIG4pe2xldCB0PW4/LmRldmljZVR5cGU7aWYodCl7bGV0IG49TCgiZGV2aWNlVHlwZSIsciksbz1MKHQscik7MCE9PXgoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsbixvKSYmUyhgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdkZXZpY2VUeXBlJyAtICR7dH0uYCk7fX1icmVhaztjYXNlIndlYmdwdSI6aWYodD0iSlMiLCJzdHJpbmciIT10eXBlb2Ygbil7bGV0IHQ9bjtpZih0Py5wcmVmZXJyZWRMYXlvdXQpe2lmKCJOQ0hXIiE9PXQucHJlZmVycmVkTGF5b3V0JiYiTkhXQyIhPT10LnByZWZlcnJlZExheW91dCl0aHJvdyBuZXcgRXJyb3IoYHByZWZlcnJlZExheW91dCBtdXN0IGJlIGVpdGhlciAnTkNIVycgb3IgJ05IV0MnOiAke3QucHJlZmVycmVkTGF5b3V0fWApO2xldCBuPUwoInByZWZlcnJlZExheW91dCIsciksbz1MKHQucHJlZmVycmVkTGF5b3V0LHIpOzAhPT14KCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShlLG4sbykmJlMoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAncHJlZmVycmVkTGF5b3V0JyAtICR7dC5wcmVmZXJyZWRMYXlvdXR9LmApO319YnJlYWs7Y2FzZSJ3YXNtIjpjYXNlImNwdSI6Y29udGludWU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYG5vdCBzdXBwb3J0ZWQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9YCl9bGV0IG89TCh0LHIpOzAhPT14KCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKGUsbykmJlMoYENhbid0IGFwcGVuZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7dH0uYCk7fX0sWnQ9ZT0+e2xldCB0PXgoKSxyPTAsbj1bXSxvPWV8fHt9O01yKG8pO3RyeXtsZXQgZT1VcihvLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWw/PyJhbGwiKSxhPV9yKG8uZXhlY3V0aW9uTW9kZT8/InNlcXVlbnRpYWwiKSxpPSJzdHJpbmciPT10eXBlb2Ygby5sb2dJZD9MKG8ubG9nSWQsbik6MCxzPW8ubG9nU2V2ZXJpdHlMZXZlbD8/MjtpZighTnVtYmVyLmlzSW50ZWdlcihzKXx8czwwfHxzPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtzfWApO2xldCBsPW8ubG9nVmVyYm9zaXR5TGV2ZWw/PzA7aWYoIU51bWJlci5pc0ludGVnZXIobCl8fGw8MHx8bD40KXRocm93IG5ldyBFcnJvcihgbG9nIHZlcmJvc2l0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7bH1gKTtsZXQgdT0ic3RyaW5nIj09dHlwZW9mIG8ub3B0aW1pemVkTW9kZWxGaWxlUGF0aD9MKG8ub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxuKTowO2lmKHI9dC5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMoZSwhIW8uZW5hYmxlQ3B1TWVtQXJlbmEsISFvLmVuYWJsZU1lbVBhdHRlcm4sYSwhIW8uZW5hYmxlUHJvZmlsaW5nLDAsaSxzLGwsdSksMD09PXImJlMoIkNhbid0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMuIiksby5leGVjdXRpb25Qcm92aWRlcnMmJkRyKHIsby5leGVjdXRpb25Qcm92aWRlcnMsbiksdm9pZCAwIT09by5lbmFibGVHcmFwaENhcHR1cmUpe2lmKCJib29sZWFuIiE9dHlwZW9mIG8uZW5hYmxlR3JhcGhDYXB0dXJlKXRocm93IG5ldyBFcnJvcihgZW5hYmxlR3JhcGhDYXB0dXJlIG11c3QgYmUgYSBib29sZWFuIHZhbHVlOiAke28uZW5hYmxlR3JhcGhDYXB0dXJlfWApO2xldCBlPUwoImVuYWJsZUdyYXBoQ2FwdHVyZSIsbiksYT1MKG8uZW5hYmxlR3JhcGhDYXB0dXJlLnRvU3RyaW5nKCksbik7MCE9PXQuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShyLGUsYSkmJlMoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAnZW5hYmxlR3JhcGhDYXB0dXJlJyAtICR7by5lbmFibGVHcmFwaENhcHR1cmV9LmApO31pZihvLmZyZWVEaW1lbnNpb25PdmVycmlkZXMpZm9yKGxldFtlLGFdb2YgT2JqZWN0LmVudHJpZXMoby5mcmVlRGltZW5zaW9uT3ZlcnJpZGVzKSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcihgZnJlZSBkaW1lbnNpb24gb3ZlcnJpZGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOiAke2V9YCk7aWYoIm51bWJlciIhPXR5cGVvZiBhfHwhTnVtYmVyLmlzSW50ZWdlcihhKXx8YTwwKXRocm93IG5ldyBFcnJvcihgZnJlZSBkaW1lbnNpb24gb3ZlcnJpZGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyOiAke2F9YCk7bGV0IG89TChlLG4pOzAhPT10Ll9PcnRBZGRGcmVlRGltZW5zaW9uT3ZlcnJpZGUocixvLGEpJiZTKGBDYW4ndCBzZXQgYSBmcmVlIGRpbWVuc2lvbiBvdmVycmlkZTogJHtlfSAtICR7YX0uYCk7fXJldHVybiB2b2lkIDAhPT1vLmV4dHJhJiZmZShvLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSxvKT0+e2xldCBhPUwoZSxuKSxpPUwobyxuKTswIT09dC5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KHIsYSxpKSYmUyhgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7ZX0gLSAke299LmApO30pKSxbcixuXX1jYXRjaChlKXt0aHJvdyAwIT09ciYmMCE9PXQuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyhyKSYmUygiQ2FuJ3QgcmVsZWFzZSBzZXNzaW9uIG9wdGlvbnMuIiksbi5mb3JFYWNoKChlPT50Ll9mcmVlKGUpKSksZX19O30pKSxRZT1UKCgoKT0+e2VlPWU9Pntzd2l0Y2goZSl7Y2FzZSJpbnQ4IjpyZXR1cm4gMztjYXNlInVpbnQ4IjpyZXR1cm4gMjtjYXNlImJvb2wiOnJldHVybiA5O2Nhc2UiaW50MTYiOnJldHVybiA1O2Nhc2UidWludDE2IjpyZXR1cm4gNDtjYXNlImludDMyIjpyZXR1cm4gNjtjYXNlInVpbnQzMiI6cmV0dXJuIDEyO2Nhc2UiZmxvYXQxNiI6cmV0dXJuIDEwO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIDE7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gMTE7Y2FzZSJzdHJpbmciOnJldHVybiA4O2Nhc2UiaW50NjQiOnJldHVybiA3O2Nhc2UidWludDY0IjpyZXR1cm4gMTM7Y2FzZSJpbnQ0IjpyZXR1cm4gMjI7Y2FzZSJ1aW50NCI6cmV0dXJuIDIxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LFF0PWU9Pntzd2l0Y2goZSl7Y2FzZSAzOnJldHVybiAiaW50OCI7Y2FzZSAyOnJldHVybiAidWludDgiO2Nhc2UgOTpyZXR1cm4gImJvb2wiO2Nhc2UgNTpyZXR1cm4gImludDE2IjtjYXNlIDQ6cmV0dXJuICJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4gImludDMyIjtjYXNlIDEyOnJldHVybiAidWludDMyIjtjYXNlIDEwOnJldHVybiAiZmxvYXQxNiI7Y2FzZSAxOnJldHVybiAiZmxvYXQzMiI7Y2FzZSAxMTpyZXR1cm4gImZsb2F0NjQiO2Nhc2UgODpyZXR1cm4gInN0cmluZyI7Y2FzZSA3OnJldHVybiAiaW50NjQiO2Nhc2UgMTM6cmV0dXJuICJ1aW50NjQiO2Nhc2UgMjI6cmV0dXJuICJpbnQ0IjtjYXNlIDIxOnJldHVybiAidWludDQiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LHRlPShlLHQpPT57bGV0IHI9Wy0xLDQsMSwxLDIsMiw0LDgsLTEsMSwyLDgsNCw4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC41LC41XVtlXSxuPSJudW1iZXIiPT10eXBlb2YgdD90OnQucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKTtyZXR1cm4gcj4wP01hdGguY2VpbChuKnIpOnZvaWQgMH0sZXI9ZT0+e3N3aXRjaChlKXtjYXNlImZsb2F0MTYiOnJldHVybiB0eXBlb2YgRmxvYXQxNkFycmF5PCJ1IiYmRmxvYXQxNkFycmF5LmZyb20/RmxvYXQxNkFycmF5OlVpbnQxNkFycmF5O2Nhc2UiZmxvYXQzMiI6cmV0dXJuIEZsb2F0MzJBcnJheTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiaW50OCI6cmV0dXJuIEludDhBcnJheTtjYXNlInVpbnQxNiI6cmV0dXJuIFVpbnQxNkFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7ZX1gKX19LHRyPWU9Pntzd2l0Y2goZSl7Y2FzZSJ2ZXJib3NlIjpyZXR1cm4gMDtjYXNlImluZm8iOnJldHVybiAxO2Nhc2Uid2FybmluZyI6cmV0dXJuIDI7Y2FzZSJlcnJvciI6cmV0dXJuIDM7Y2FzZSJmYXRhbCI6cmV0dXJuIDQ7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGxvZ2dpbmcgbGV2ZWw6ICR7ZX1gKX19LENlPWU9PiJmbG9hdDMyIj09PWV8fCJmbG9hdDE2Ij09PWV8fCJpbnQzMiI9PT1lfHwiaW50NjQiPT09ZXx8InVpbnQzMiI9PT1lfHwidWludDgiPT09ZXx8ImJvb2wiPT09ZXx8InVpbnQ0Ij09PWV8fCJpbnQ0Ij09PWUsVWU9ZT0+ImZsb2F0MzIiPT09ZXx8ImZsb2F0MTYiPT09ZXx8ImludDMyIj09PWV8fCJpbnQ2NCI9PT1lfHwidWludDMyIj09PWV8fCJ1aW50NjQiPT09ZXx8ImludDgiPT09ZXx8InVpbnQ4Ij09PWV8fCJib29sIj09PWV8fCJ1aW50NCI9PT1lfHwiaW50NCI9PT1lLHJyPWU9Pntzd2l0Y2goZSl7Y2FzZSJub25lIjpyZXR1cm4gMDtjYXNlImNwdSI6cmV0dXJuIDE7Y2FzZSJjcHUtcGlubmVkIjpyZXR1cm4gMjtjYXNlInRleHR1cmUiOnJldHVybiAzO2Nhc2UiZ3B1LWJ1ZmZlciI6cmV0dXJuIDQ7Y2FzZSJtbC10ZW5zb3IiOnJldHVybiA1O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIGxvY2F0aW9uOiAke2V9YCl9fTt9KSksZXQ9VCgoKCk9PntiZSgpLGNlPWFzeW5jIGU9PntpZigic3RyaW5nIj09dHlwZW9mIGUpe3tsZXQgdD1hd2FpdCBmZXRjaChlKTtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkIGV4dGVybmFsIGRhdGEgZmlsZTogJHtlfWApO2xldCByPXQuaGVhZGVycy5nZXQoIkNvbnRlbnQtTGVuZ3RoIiksbj1yP3BhcnNlSW50KHIsMTApOjA7aWYobjwxMDczNzQxODI0KXJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0LmFycmF5QnVmZmVyKCkpO3tpZighdC5ib2R5KXRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIGxvYWQgZXh0ZXJuYWwgZGF0YSBmaWxlOiAke2V9LCBubyByZXNwb25zZSBib2R5LmApO2xldCByLG89dC5ib2R5LmdldFJlYWRlcigpO3RyeXtyPW5ldyBBcnJheUJ1ZmZlcihuKTt9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgZTt7bGV0IGU9TWF0aC5jZWlsKG4vNjU1MzYpO3I9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDplLG1heGltdW06ZX0pLmJ1ZmZlcjt9fWxldCBhPTA7Zm9yKDs7KXtsZXR7ZG9uZTplLHZhbHVlOnR9PWF3YWl0IG8ucmVhZCgpO2lmKGUpYnJlYWs7bGV0IG49dC5ieXRlTGVuZ3RoO25ldyBVaW50OEFycmF5KHIsYSxuKS5zZXQodCksYSs9bjt9cmV0dXJuIG5ldyBVaW50OEFycmF5KHIsMCxuKX19fXJldHVybiBlIGluc3RhbmNlb2YgQmxvYj9uZXcgVWludDhBcnJheShhd2FpdCBlLmFycmF5QnVmZmVyKCkpOmUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6bmV3IFVpbnQ4QXJyYXkoZSl9O30pKSxKZT1UKCgoKT0+e1h0KCksS3QoKSxRZSgpLEooKSxCZSgpLGV0KCksUnI9KGUsdCk9PnswIT09eCgpLl9PcnRJbml0KGUsdCkmJlMoIkNhbid0IGluaXRpYWxpemUgb25ueHJ1bnRpbWUuIik7fSxUZT1hc3luYyBlPT57UnIoZS53YXNtLm51bVRocmVhZHMsdHIoZS5sb2dMZXZlbCkpO30sU2U9YXN5bmMoZSx0KT0+e30scmU9bmV3IE1hcCxGcj1lPT57bGV0IHQ9eCgpLHI9dC5zdGFja1NhdmUoKTt0cnl7bGV0IHI9dC5QVFJfU0laRSxuPXQuc3RhY2tBbGxvYygyKnIpOzAhPT10Ll9PcnRHZXRJbnB1dE91dHB1dENvdW50KGUsbixuK3IpJiZTKCJDYW4ndCBnZXQgc2Vzc2lvbiBpbnB1dC9vdXRwdXQgY291bnQuIik7bGV0IG89ND09PXI/ImkzMiI6Imk2NCI7cmV0dXJuIFtOdW1iZXIodC5nZXRWYWx1ZShuLG8pKSxOdW1iZXIodC5nZXRWYWx1ZShuK3IsbykpXX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKHIpO319LHVlPWU9PntsZXQgdD14KCkscj10Ll9tYWxsb2MoZS5ieXRlTGVuZ3RoKTtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBhIHNlc3Npb24uIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICR7ZS5ieXRlTGVuZ3RofS5gKTtyZXR1cm4gdC5IRUFQVTguc2V0KGUsciksW3IsZS5ieXRlTGVuZ3RoXX0sQWU9YXN5bmMoZSx0KT0+e2xldCByLG4sbz14KCk7QXJyYXkuaXNBcnJheShlKT9bcixuXT1lOmUuYnVmZmVyPT09by5IRUFQVTguYnVmZmVyP1tyLG5dPVtlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoXTpbcixuXT11ZShlKTtsZXQgYT0wLGk9MCxzPVtdLGw9W10sdT1bXTt0cnl7aWYoW2ksc109WnQodCksdD8uZXh0ZXJuYWxEYXRhJiZvLm1vdW50RXh0ZXJuYWxEYXRhKXtsZXQgZT1bXTtmb3IobGV0IHIgb2YgdC5leHRlcm5hbERhdGEpe2xldCB0PSJzdHJpbmciPT10eXBlb2Ygcj9yOnIucGF0aDtlLnB1c2goY2UoInN0cmluZyI9PXR5cGVvZiByP3I6ci5kYXRhKS50aGVuKChlPT57by5tb3VudEV4dGVybmFsRGF0YSh0LGUpO30pKSk7fWF3YWl0IFByb21pc2UuYWxsKGUpO31mb3IobGV0IGUgb2YgdD8uZXhlY3V0aW9uUHJvdmlkZXJzPz9bXSlpZigid2Vibm4iPT09KCJzdHJpbmciPT10eXBlb2YgZT9lOmUubmFtZSkpe2lmKG8uc2hvdWxkVHJhbnNmZXJUb01MVGVuc29yPSExLCJzdHJpbmciIT10eXBlb2YgZSl7bGV0IHQ9ZSxyPXQ/LmNvbnRleHQsbj10Py5ncHVEZXZpY2UsYT10Py5kZXZpY2VUeXBlLGk9dD8ucG93ZXJQcmVmZXJlbmNlO28uY3VycmVudENvbnRleHQ9cnx8KG4/YXdhaXQgby5qc2VwQ3JlYXRlTUxDb250ZXh0KG4pOmF3YWl0IG8uanNlcENyZWF0ZU1MQ29udGV4dCh7ZGV2aWNlVHlwZTphLHBvd2VyUHJlZmVyZW5jZTppfSkpO31lbHNlIG8uY3VycmVudENvbnRleHQ9YXdhaXQgby5qc2VwQ3JlYXRlTUxDb250ZXh0KCk7YnJlYWt9YT1hd2FpdCBvLl9PcnRDcmVhdGVTZXNzaW9uKHIsbixpKSwwPT09YSYmUygiQ2FuJ3QgY3JlYXRlIGEgc2Vzc2lvbi4iKSxvLmpzZXBPbkNyZWF0ZVNlc3Npb24/LigpLG8uY3VycmVudENvbnRleHQmJihvLmpzZXBSZWdpc3Rlck1MQ29udGV4dChhLG8uY3VycmVudENvbnRleHQpLG8uY3VycmVudENvbnRleHQ9dm9pZCAwLG8uc2hvdWxkVHJhbnNmZXJUb01MVGVuc29yPSEwKTtsZXRbZSxmXT1GcihhKSxkPSEhdD8uZW5hYmxlR3JhcGhDYXB0dXJlLHA9W10sYz1bXTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1vLl9PcnRHZXRJbnB1dE5hbWUoYSx0KTswPT09ZSYmUygiQ2FuJ3QgZ2V0IGFuIGlucHV0IG5hbWUuIiksbC5wdXNoKGUpLHAucHVzaChvLlVURjhUb1N0cmluZyhlKSk7fWZvcihsZXQgZT0wO2U8ZjtlKyspe2xldCB0PW8uX09ydEdldE91dHB1dE5hbWUoYSxlKTswPT09dCYmUygiQ2FuJ3QgZ2V0IGFuIG91dHB1dCBuYW1lLiIpLHUucHVzaCh0KTtsZXQgcj1vLlVURjhUb1N0cmluZyh0KTtjLnB1c2gocik7fXJldHVybiByZS5zZXQoYSxbYSxsLHUsbnVsbCxkLCExXSksW2EscCxjXX1jYXRjaChlKXt0aHJvdyBsLmZvckVhY2goKGU9Pm8uX09ydEZyZWUoZSkpKSx1LmZvckVhY2goKGU9Pm8uX09ydEZyZWUoZSkpKSwwIT09YSYmMCE9PW8uX09ydFJlbGVhc2VTZXNzaW9uKGEpJiZTKCJDYW4ndCByZWxlYXNlIHNlc3Npb24uIiksZX1maW5hbGx5e28uX2ZyZWUociksMCE9PWkmJjAhPT1vLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMoaSkmJlMoIkNhbid0IHJlbGVhc2Ugc2Vzc2lvbiBvcHRpb25zLiIpLHMuZm9yRWFjaCgoZT0+by5fZnJlZShlKSkpLG8udW5tb3VudEV4dGVybmFsRGF0YT8uKCk7fX0sT2U9ZT0+e2xldCB0PXgoKSxyPXJlLmdldChlKTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWxlYXNlIHNlc3Npb24uIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2xldFtuLG8sYSxpLHNdPXI7aSYmKHMmJjAhPT10Ll9PcnRDbGVhckJvdW5kT3V0cHV0cyhpLmhhbmRsZSkmJlMoIkNhbid0IGNsZWFyIGJvdW5kIG91dHB1dHMuIiksMCE9PXQuX09ydFJlbGVhc2VCaW5kaW5nKGkuaGFuZGxlKSYmUygiQ2FuJ3QgcmVsZWFzZSBJTyBiaW5kaW5nLiIpKSx0LmpzZXBPblJlbGVhc2VTZXNzaW9uPy4oZSksby5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksYS5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksMCE9PXQuX09ydFJlbGVhc2VTZXNzaW9uKG4pJiZTKCJDYW4ndCByZWxlYXNlIHNlc3Npb24uIikscmUuZGVsZXRlKGUpO30sbnI9YXN5bmMoZSx0LHIsbixvLGE9ITEpPT57aWYoIWUpcmV0dXJuIHZvaWQgdC5wdXNoKDApO2xldCBpLHMsbD14KCksdT1sLlBUUl9TSVpFLGY9ZVswXSxkPWVbMV0scD1lWzNdLGM9cDtpZigic3RyaW5nIj09PWYmJigiZ3B1LWJ1ZmZlciI9PT1wfHwibWwtdGVuc29yIj09PXApKXRocm93IG5ldyBFcnJvcigiU3RyaW5nIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkIG9uIEdQVS4iKTtpZihhJiYiZ3B1LWJ1ZmZlciIhPT1wKXRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgYnVmZmVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIGlucHV0L291dHB1dCBpbmRleCAke299IHdoZW4gZW5hYmxlR3JhcGhDYXB0dXJlIGlzIHRydWUuYCk7aWYoImdwdS1idWZmZXIiPT09cCl7bGV0IHQ9ZVsyXS5ncHVCdWZmZXI7cz10ZShlZShmKSxkKTtsZXQgcj1sLmpzZXBSZWdpc3RlckJ1ZmZlcjtpZighcil0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAiZ3B1LWJ1ZmZlciIgaXMgbm90IHN1cHBvcnRlZCB3aXRob3V0IHVzaW5nIFdlYkdQVS4nKTtpPXIobixvLHQscyk7fWVsc2UgaWYoIm1sLXRlbnNvciI9PT1wKXtsZXQgdD1lWzJdLm1sVGVuc29yO3M9dGUoZWUoZiksZCk7bGV0IHI9bC5qc2VwUmVnaXN0ZXJNTFRlbnNvcjtpZighcil0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAibWwtdGVuc29yIiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgdXNpbmcgV2ViTk4uJyk7aT1yKG4sdCxlZShmKSxkKTt9ZWxzZSB7bGV0IHQ9ZVsyXTtpZihBcnJheS5pc0FycmF5KHQpKXtzPXUqdC5sZW5ndGgsaT1sLl9tYWxsb2Mocyksci5wdXNoKGkpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtpZigic3RyaW5nIiE9dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHtlfSBpcyBub3QgYSBzdHJpbmdgKTtsLnNldFZhbHVlKGkrZSp1LEwodFtlXSxyKSwiKiIpO319ZWxzZSB7bGV0IGU9bC5qc2VwSXNHcmFwaElucHV0O2lmKCJzdHJpbmciIT09ZiYmZSl7bGV0IGE9bC5fT3J0R2V0SW5wdXROYW1lKG4sbyk7aWYoZShuLGwuVVRGOFRvU3RyaW5nKGEpKSl7bGV0IGU9ZWUoZik7cz10ZShlLGQpLGM9Im1sLXRlbnNvciI7bGV0IHI9bC5qc2VwQ3JlYXRlVGVtcG9yYXJ5VGVuc29yLG89bC5qc2VwVXBsb2FkVGVuc29yO2lmKCFyfHwhbyl0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAibWwtdGVuc29yIiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgdXNpbmcgV2ViTk4uJyk7bGV0IGE9YXdhaXQgcihuLGUsZCk7byhhLG5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpKSxpPWE7fWVsc2Ugcz10LmJ5dGVMZW5ndGgsaT1sLl9tYWxsb2Mocyksci5wdXNoKGkpLGwuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQscyksaSk7fWVsc2Ugcz10LmJ5dGVMZW5ndGgsaT1sLl9tYWxsb2Mocyksci5wdXNoKGkpLGwuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQscyksaSk7fX1sZXQgaD1sLnN0YWNrU2F2ZSgpLHc9bC5zdGFja0FsbG9jKDQqZC5sZW5ndGgpO3RyeXtkLmZvckVhY2goKChlLHQpPT5sLnNldFZhbHVlKHcrdCp1LGUsND09PXU/ImkzMiI6Imk2NCIpKSk7bGV0IGU9bC5fT3J0Q3JlYXRlVGVuc29yKGVlKGYpLGkscyx3LGQubGVuZ3RoLHJyKGMpKTswPT09ZSYmUyhgQ2FuJ3QgY3JlYXRlIHRlbnNvciBmb3IgaW5wdXQvb3V0cHV0LiBzZXNzaW9uPSR7bn0sIGluZGV4PSR7b30uYCksdC5wdXNoKGUpO31maW5hbGx5e2wuc3RhY2tSZXN0b3JlKGgpO319LHhlPWFzeW5jKGUsdCxyLG4sbyxhKT0+e2xldCBpPXgoKSxzPWkuUFRSX1NJWkUsbD1yZS5nZXQoZSk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcnVuIGluZmVyZW5jZS4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2V9YCk7bGV0IHU9bFswXSxmPWxbMV0sZD1sWzJdLHA9bFszXSxjPWxbNF0saD0obFs1XSx0Lmxlbmd0aCksdz1uLmxlbmd0aCx5PTAsbT1bXSxnPVtdLGI9W10sdj1bXSxFPWkuc3RhY2tTYXZlKCksVD1pLnN0YWNrQWxsb2MoaCpzKSxBPWkuc3RhY2tBbGxvYyhoKnMpLEw9aS5zdGFja0FsbG9jKHcqcyksQz1pLnN0YWNrQWxsb2ModypzKTt0cnl7W3ksbV09SnQoYSk7Zm9yKGxldCBuPTA7bjxoO24rKylhd2FpdCBucihyW25dLGcsdixlLHRbbl0sYyk7Zm9yKGxldCB0PTA7dDx3O3QrKylhd2FpdCBucihvW3RdLGIsdixlLGgrblt0XSxjKTtmb3IobGV0IGU9MDtlPGg7ZSsrKWkuc2V0VmFsdWUoVCtlKnMsZ1tlXSwiKiIpLGkuc2V0VmFsdWUoQStlKnMsZlt0W2VdXSwiKiIpO2ZvcihsZXQgZT0wO2U8dztlKyspaS5zZXRWYWx1ZShMK2UqcyxiW2VdLCIqIiksaS5zZXRWYWx1ZShDK2UqcyxkW25bZV1dLCIqIik7bGV0IGw7aS5qc2VwT25SdW5TdGFydD8uKHUpLGw9YXdhaXQgaS5fT3J0UnVuKHUsQSxULGgsQyx3LEwseSksMCE9PWwmJlMoImZhaWxlZCB0byBjYWxsIE9ydFJ1bigpLiIpO2xldCBFPVtdO2ZvcihsZXQgdD0wO3Q8dzt0Kyspe2xldCByPU51bWJlcihpLmdldFZhbHVlKEwrdCpzLCIqIikpO2lmKHI9PT1iW3RdKXtFLnB1c2gob1t0XSk7Y29udGludWV9bGV0IGEsbD1pLnN0YWNrU2F2ZSgpLGY9aS5zdGFja0FsbG9jKDQqcyksZD0hMSxjPTA7dHJ5ezAhPT1pLl9PcnRHZXRUZW5zb3JEYXRhKHIsZixmK3MsZisyKnMsZiszKnMpJiZTKGBDYW4ndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhIG9uIGluZGV4ICR7dH0uYCk7bGV0IG89ND09PXM/ImkzMiI6Imk2NCIsbD1OdW1iZXIoaS5nZXRWYWx1ZShmLG8pKTtjPWkuZ2V0VmFsdWUoZitzLCIqIik7bGV0IHU9aS5nZXRWYWx1ZShmKzIqcywiKiIpLGg9TnVtYmVyKGkuZ2V0VmFsdWUoZiszKnMsbykpLHc9W107Zm9yKGxldCBlPTA7ZTxoO2UrKyl3LnB1c2goTnVtYmVyKGkuZ2V0VmFsdWUodStlKnMsbykpKTswIT09aS5fT3J0RnJlZSh1KSYmUygiQ2FuJ3QgZnJlZSBtZW1vcnkgZm9yIHRlbnNvciBkaW1zLiIpO2xldCB5PXcucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKTthPVF0KGwpO2xldCBtPXA/Lm91dHB1dFByZWZlcnJlZExvY2F0aW9uc1tuW3RdXTtpZigic3RyaW5nIj09PWEpe2lmKCJncHUtYnVmZmVyIj09PW18fCJtbC10ZW5zb3IiPT09bSl0aHJvdyBuZXcgRXJyb3IoIlN0cmluZyB0ZW5zb3IgaXMgbm90IHN1cHBvcnRlZCBvbiBHUFUuIik7bGV0IGU9W107Zm9yKGxldCB0PTA7dDx5O3QrKyl7bGV0IHI9aS5nZXRWYWx1ZShjK3QqcywiKiIpLG49aS5nZXRWYWx1ZShjKyh0KzEpKnMsIioiKSxvPXQ9PT15LTE/dm9pZCAwOm4tcjtlLnB1c2goaS5VVEY4VG9TdHJpbmcocixvKSk7fUUucHVzaChbYSx3LGUsImNwdSJdKTt9ZWxzZSBpZigiZ3B1LWJ1ZmZlciI9PT1tJiZ5PjApe2xldCBlPWkuanNlcEdldEJ1ZmZlcjtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ3ByZWZlcnJlZExvY2F0aW9uICJncHUtYnVmZmVyIiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgdXNpbmcgV2ViR1BVLicpO2xldCB0PWUoYyksbj10ZShsLHkpO2lmKHZvaWQgMD09PW58fCFDZShhKSl0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHthfWApO2Q9ITAsRS5wdXNoKFthLHcse2dwdUJ1ZmZlcjp0LGRvd25sb2FkOmkuanNlcENyZWF0ZURvd25sb2FkZXIodCxuLGEpLGRpc3Bvc2U6KCk9PnswIT09aS5fT3J0UmVsZWFzZVRlbnNvcihyKSYmUygiQ2FuJ3QgcmVsZWFzZSB0ZW5zb3IuIik7fX0sImdwdS1idWZmZXIiXSk7fWVsc2UgaWYoIm1sLXRlbnNvciI9PT1tJiZ5PjApe2xldCB0PWkuanNlcEVuc3VyZVRlbnNvcjtpZighdCl0aHJvdyBuZXcgRXJyb3IoJ3ByZWZlcnJlZExvY2F0aW9uICJtbC10ZW5zb3IiIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCB1c2luZyBXZWJOTi4nKTtpZih2b2lkIDA9PT10ZShsLHkpfHwhVWUoYSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7YX1gKTtsZXQgbj1hd2FpdCB0KGUsYyxsLHcsITEpO2Q9ITAsRS5wdXNoKFthLHcse21sVGVuc29yOm4sZG93bmxvYWQ6aS5qc2VwQ3JlYXRlTUxUZW5zb3JEb3dubG9hZGVyKGMsYSksZGlzcG9zZTooKT0+e2kuanNlcFJlbGVhc2VUZW5zb3JJZChjKSxpLl9PcnRSZWxlYXNlVGVuc29yKHIpO319LCJtbC10ZW5zb3IiXSk7fWVsc2Uge2xldCBlPW5ldyhlcihhKSkoeSk7bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkuc2V0KGkuSEVBUFU4LnN1YmFycmF5KGMsYytlLmJ5dGVMZW5ndGgpKSxFLnB1c2goW2EsdyxlLCJjcHUiXSk7fX1maW5hbGx5e2kuc3RhY2tSZXN0b3JlKGwpLCJzdHJpbmciPT09YSYmYyYmaS5fZnJlZShjKSxkfHxpLl9PcnRSZWxlYXNlVGVuc29yKHIpLGkuanNlcE9uUnVuRW5kPy4odSk7fX1yZXR1cm4gcCYmIWMmJigwIT09aS5fT3J0Q2xlYXJCb3VuZE91dHB1dHMocC5oYW5kbGUpJiZTKCJDYW4ndCBjbGVhciBib3VuZCBvdXRwdXRzLiIpLHJlLnNldChlLFt1LGYsZCxwLGMsITFdKSksRX1maW5hbGx5e2kuc3RhY2tSZXN0b3JlKEUpLGcuZm9yRWFjaCgoZT0+aS5fT3J0UmVsZWFzZVRlbnNvcihlKSkpLGIuZm9yRWFjaCgoZT0+aS5fT3J0UmVsZWFzZVRlbnNvcihlKSkpLHYuZm9yRWFjaCgoZT0+aS5fZnJlZShlKSkpLDAhPT15JiZpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucyh5KSxtLmZvckVhY2goKGU9PmkuX2ZyZWUoZSkpKTt9fSxMZT1lPT57bGV0IHQ9eCgpLHI9cmUuZ2V0KGUpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzZXNzaW9uIGlkIik7bGV0IG49clswXSxvPXQuX09ydEVuZFByb2ZpbGluZyhuKTswPT09byYmUygiQ2FuJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUobyk7fSxJZT1lPT57bGV0IHQ9W107Zm9yKGxldCByIG9mIGUpe2xldCBlPXJbMl07IUFycmF5LmlzQXJyYXkoZSkmJiJidWZmZXIiaW4gZSYmdC5wdXNoKGUuYnVmZmVyKTt9cmV0dXJuIHR9O30pKSxudD1UKCgoKT0+e3EoKSxKZSgpLEooKSxnZSgpLFo9KCk9PiEhQS53YXNtLnByb3h5JiZ0eXBlb2YgZG9jdW1lbnQ8InUiLGxlPSExLE1lPSExLERlPSExLHJ0PW5ldyBNYXAsbmU9KGUsdCk9PntsZXQgcj1ydC5nZXQoZSk7cj9yLnB1c2godCk6cnQuc2V0KGUsW3RdKTt9LG9lPSgpPT57aWYobGV8fCFNZXx8RGV8fCFEKXRocm93IG5ldyBFcnJvcigid29ya2VyIG5vdCByZWFkeSIpfSxOcj1lPT57c3dpdGNoKGUuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6bGU9ITEsZS5kYXRhLmVycj8oRGU9ITAsdHRbMV0oZS5kYXRhLmVycikpOihNZT0hMCx0dFswXSgpKSxfZSYmKFVSTC5yZXZva2VPYmplY3RVUkwoX2UpLF9lPXZvaWQgMCk7YnJlYWs7Y2FzZSJpbml0LWVwIjpjYXNlImNvcHktZnJvbSI6Y2FzZSJjcmVhdGUiOmNhc2UicmVsZWFzZSI6Y2FzZSJydW4iOmNhc2UiZW5kLXByb2ZpbGluZyI6e2xldCB0PXJ0LmdldChlLmRhdGEudHlwZSk7ZS5kYXRhLmVycj90LnNoaWZ0KClbMV0oZS5kYXRhLmVycik6dC5zaGlmdCgpWzBdKGUuZGF0YS5vdXQpO2JyZWFrfX19LG9yPWFzeW5jKCk9PntpZighTWUpe2lmKGxlKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRXYXNtKCknIGRldGVjdGVkLiIpO2lmKERlKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdFdhc20oKScgZmFpbGVkLiIpO2lmKGxlPSEwLFooKSlyZXR1cm4gbmV3IFByb21pc2UoKChlLHQpPT57RD8udGVybWluYXRlKCksVnQoKS50aGVuKCgoW3Isbl0pPT57dHJ5eyhEPW4pLm9uZXJyb3I9ZT0+dChlKSxELm9ubWVzc2FnZT1Ocix0dD1bZSx0XTtsZXQgbz17dHlwZToiaW5pdC13YXNtIixpbjpBfTtpZighby5pbi53YXNtLndhc21QYXRocyYmcil7bGV0IGU9UGUoKTtlJiYoby5pbi53YXNtLndhc21QYXRocz1lKTt9RC5wb3N0TWVzc2FnZShvKSxfZT1yO31jYXRjaChlKXt0KGUpO319KSx0KTt9KSk7dHJ5e2F3YWl0IEVlKEEud2FzbSksYXdhaXQgVGUoQSksTWU9ITA7fWNhdGNoKGUpe3Rocm93IERlPSEwLGV9ZmluYWxseXtsZT0hMTt9fX0sc3I9YXN5bmMgZT0+e2lmKFooKSlyZXR1cm4gb2UoKSxuZXcgUHJvbWlzZSgoKHQscik9PntuZSgiaW5pdC1lcCIsW3Qscl0pO2xldCBuPXt0eXBlOiJpbml0LWVwIixpbjp7ZXBOYW1lOmUsZW52OkF9fTtELnBvc3RNZXNzYWdlKG4pO30pKTthd2FpdCBTZShBLGUpO30saXI9YXN5bmMgZT0+WigpPyhvZSgpLG5ldyBQcm9taXNlKCgodCxyKT0+e25lKCJjb3B5LWZyb20iLFt0LHJdKTtsZXQgbj17dHlwZToiY29weS1mcm9tIixpbjp7YnVmZmVyOmV9fTtELnBvc3RNZXNzYWdlKG4sW2UuYnVmZmVyXSk7fSkpKTp1ZShlKSxhcj1hc3luYyhlLHQpPT57aWYoWigpKXtpZih0Py5wcmVmZXJyZWRPdXRwdXRMb2NhdGlvbil0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb24gb3B0aW9uICJwcmVmZXJyZWRPdXRwdXRMb2NhdGlvbiIgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJveHkuJyk7cmV0dXJuIG9lKCksbmV3IFByb21pc2UoKChyLG4pPT57bmUoImNyZWF0ZSIsW3Isbl0pO2xldCBvPXt0eXBlOiJjcmVhdGUiLGluOnttb2RlbDplLG9wdGlvbnM6ey4uLnR9fX0sYT1bXTtlIGluc3RhbmNlb2YgVWludDhBcnJheSYmYS5wdXNoKGUuYnVmZmVyKSxELnBvc3RNZXNzYWdlKG8sYSk7fSkpfXJldHVybiBBZShlLHQpfSx1cj1hc3luYyBlPT57aWYoWigpKXJldHVybiBvZSgpLG5ldyBQcm9taXNlKCgodCxyKT0+e25lKCJyZWxlYXNlIixbdCxyXSk7bGV0IG49e3R5cGU6InJlbGVhc2UiLGluOmV9O0QucG9zdE1lc3NhZ2Uobik7fSkpO09lKGUpO30sZnI9YXN5bmMoZSx0LHIsbixvLGEpPT57aWYoWigpKXtpZihyLnNvbWUoKGU9PiJjcHUiIT09ZVszXSkpKXRocm93IG5ldyBFcnJvcigiaW5wdXQgdGVuc29yIG9uIEdQVSBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm94eS4iKTtpZihvLnNvbWUoKGU9PmUpKSl0aHJvdyBuZXcgRXJyb3IoInByZS1hbGxvY2F0ZWQgb3V0cHV0IHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm94eS4iKTtyZXR1cm4gb2UoKSxuZXcgUHJvbWlzZSgoKG8saSk9PntuZSgicnVuIixbbyxpXSk7bGV0IHM9cixsPXt0eXBlOiJydW4iLGluOntzZXNzaW9uSWQ6ZSxpbnB1dEluZGljZXM6dCxpbnB1dHM6cyxvdXRwdXRJbmRpY2VzOm4sb3B0aW9uczphfX07RC5wb3N0TWVzc2FnZShsLEllKHMpKTt9KSl9cmV0dXJuIHhlKGUsdCxyLG4sbyxhKX0sY3I9YXN5bmMgZT0+e2lmKFooKSlyZXR1cm4gb2UoKSxuZXcgUHJvbWlzZSgoKHQscik9PntuZSgiZW5kLXByb2ZpbGluZyIsW3Qscl0pO2xldCBuPXt0eXBlOiJlbmQtcHJvZmlsaW5nIixpbjplfTtELnBvc3RNZXNzYWdlKG4pO30pKTtMZShlKTt9O30pKSxkcj1UKCgoKT0+e3EoKSxudCgpLFFlKCksYmUoKSxldCgpLGxyPShlLHQpPT57c3dpdGNoKGUubG9jYXRpb24pe2Nhc2UiY3B1IjpyZXR1cm4gW2UudHlwZSxlLmRpbXMsZS5kYXRhLCJjcHUiXTtjYXNlImdwdS1idWZmZXIiOnJldHVybiBbZS50eXBlLGUuZGltcyx7Z3B1QnVmZmVyOmUuZ3B1QnVmZmVyfSwiZ3B1LWJ1ZmZlciJdO2Nhc2UibWwtdGVuc29yIjpyZXR1cm4gW2UudHlwZSxlLmRpbXMse21sVGVuc29yOmUubWxUZW5zb3J9LCJtbC10ZW5zb3IiXTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkYXRhIGxvY2F0aW9uOiAke2UubG9jYXRpb259IGZvciAke3QoKX1gKX19LFdyPWU9Pntzd2l0Y2goZVszXSl7Y2FzZSJjcHUiOnJldHVybiBuZXcgUihlWzBdLGVbMl0sZVsxXSk7Y2FzZSJncHUtYnVmZmVyIjp7bGV0IHQ9ZVswXTtpZighQ2UodCkpdGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGRhdGEgdHlwZTogJHt0fSBmb3IgZGVzZXJpYWxpemluZyBHUFUgdGVuc29yYCk7bGV0e2dwdUJ1ZmZlcjpyLGRvd25sb2FkOm4sZGlzcG9zZTpvfT1lWzJdO3JldHVybiBSLmZyb21HcHVCdWZmZXIocix7ZGF0YVR5cGU6dCxkaW1zOmVbMV0sZG93bmxvYWQ6bixkaXNwb3NlOm99KX1jYXNlIm1sLXRlbnNvciI6e2xldCB0PWVbMF07aWYoIVVlKHQpKXRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7dH0gZm9yIGRlc2VyaWFsaXppbmcgTUxUZW5zb3IgdGVuc29yYCk7bGV0e21sVGVuc29yOnIsZG93bmxvYWQ6bixkaXNwb3NlOm99PWVbMl07cmV0dXJuIFIuZnJvbU1MVGVuc29yKHIse2RhdGFUeXBlOnQsZGltczplWzFdLGRvd25sb2FkOm4sZGlzcG9zZTpvfSl9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZGF0YSBsb2NhdGlvbjogJHtlWzNdfWApfX0sUmU9Y2xhc3N7YXN5bmMgZmV0Y2hNb2RlbEFuZENvcHlUb1dhc21NZW1vcnkoZSl7cmV0dXJuIGlyKGF3YWl0IGNlKGUpKX1hc3luYyBsb2FkTW9kZWwoZSx0KXtsZXQgcjtWKCkscj0ic3RyaW5nIj09dHlwZW9mIGU/YXdhaXQgdGhpcy5mZXRjaE1vZGVsQW5kQ29weVRvV2FzbU1lbW9yeShlKTplLFt0aGlzLnNlc3Npb25JZCx0aGlzLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lc109YXdhaXQgYXIocix0KSxZKCk7fWFzeW5jIGRpc3Bvc2UoKXtyZXR1cm4gdXIodGhpcy5zZXNzaW9uSWQpfWFzeW5jIHJ1bihlLHQscil7VigpO2xldCBuPVtdLG89W107T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoZT0+e2xldCB0PWVbMF0scj1lWzFdLGE9dGhpcy5pbnB1dE5hbWVzLmluZGV4T2YodCk7aWYoLTE9PT1hKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnB1dCAnJHt0fSdgKTtuLnB1c2gociksby5wdXNoKGEpO30pKTtsZXQgYT1bXSxpPVtdO09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKGU9PntsZXQgdD1lWzBdLHI9ZVsxXSxuPXRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZih0KTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dCAnJHt0fSdgKTthLnB1c2gociksaS5wdXNoKG4pO30pKTtsZXQgcz1uLm1hcCgoKGUsdCk9PmxyKGUsKCgpPT5gaW5wdXQgIiR7dGhpcy5pbnB1dE5hbWVzW29bdF1dfSJgKSkpKSxsPWEubWFwKCgoZSx0KT0+ZT9scihlLCgoKT0+YG91dHB1dCAiJHt0aGlzLm91dHB1dE5hbWVzW2lbdF1dfSJgKSk6bnVsbCkpLHU9YXdhaXQgZnIodGhpcy5zZXNzaW9uSWQsbyxzLGksbCxyKSxmPXt9O2ZvcihsZXQgZT0wO2U8dS5sZW5ndGg7ZSsrKWZbdGhpcy5vdXRwdXROYW1lc1tpW2VdXV09YVtlXT8/V3IodVtlXSk7cmV0dXJuIFkoKSxmfXN0YXJ0UHJvZmlsaW5nKCl7fWVuZFByb2ZpbGluZygpe2NyKHRoaXMuc2Vzc2lvbklkKTt9fTt9KSksbXI9e307R2UobXIse09ubnhydW50aW1lV2ViQXNzZW1ibHlCYWNrZW5kOigpPT5GZSxpbml0aWFsaXplRmxhZ3M6KCk9PnByLHdhc21CYWNrZW5kOigpPT4kcn0pO3ZhciBwcixGZSwkcixocj1UKCgoKT0+e3EoKSxudCgpLGRyKCkscHI9KCk9PntpZigoIm51bWJlciIhPXR5cGVvZiBBLndhc20uaW5pdFRpbWVvdXR8fEEud2FzbS5pbml0VGltZW91dDwwKSYmKEEud2FzbS5pbml0VGltZW91dD0wKSwhMT09PUEud2FzbS5zaW1kJiZjb25zb2xlLndhcm4oJ0RlcHJlY2F0ZWQgcHJvcGVydHkgImVudi53YXNtLnNpbWQiIGlzIHNldCB0byBmYWxzZS4gbm9uLVNJTUQgYnVpbGQgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLCBhbmQgdGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZC4nKSwiYm9vbGVhbiIhPXR5cGVvZiBBLndhc20ucHJveHkmJihBLndhc20ucHJveHk9ITEpLCJib29sZWFuIiE9dHlwZW9mIEEud2FzbS50cmFjZSYmKEEud2FzbS50cmFjZT0hMSksIm51bWJlciIhPXR5cGVvZiBBLndhc20ubnVtVGhyZWFkc3x8IU51bWJlci5pc0ludGVnZXIoQS53YXNtLm51bVRocmVhZHMpfHxBLndhc20ubnVtVGhyZWFkczw9MClpZih0eXBlb2Ygc2VsZjwidSImJiFzZWxmLmNyb3NzT3JpZ2luSXNvbGF0ZWQpQS53YXNtLm51bVRocmVhZHM9MTtlbHNlIHtsZXQgZT10eXBlb2YgbmF2aWdhdG9yPiJ1Ij8kZSgibm9kZTpvcyIpLmNwdXMoKS5sZW5ndGg6bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7QS53YXNtLm51bVRocmVhZHM9TWF0aC5taW4oNCxNYXRoLmNlaWwoKGV8fDEpLzIpKTt9fSwkcj1uZXcoRmU9Y2xhc3N7YXN5bmMgaW5pdChlKXtwcigpLGF3YWl0IG9yKCksYXdhaXQgc3IoZSk7fWFzeW5jIGNyZWF0ZUluZmVyZW5jZVNlc3Npb25IYW5kbGVyKGUsdCl7bGV0IHI9bmV3IFJlO3JldHVybiBhd2FpdCByLmxvYWRNb2RlbChlLHQpLFByb21pc2UucmVzb2x2ZShyKX19KTt9KSk7cSgpLHEoKSxxKCk7dmFyIEZ0PSIxLjIxLjAiO3tsZXQgZT0oaHIoKSxhdChtcikpLndhc21CYWNrZW5kO2llKCJjcHUiLGUsMTApLGllKCJ3YXNtIixlLDEwKTt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEudmVyc2lvbnMsIndlYiIse3ZhbHVlOkZ0LGVudW1lcmFibGU6ITB9KTsKCmNsYXNzIFdvcmtlck5hdGl2ZXtjb25zdHJ1Y3Rvcigpe3RoaXMucmVhZHk9ITE7dGhpcy5pbmRleGVkREJNYW5hZ2VyPW5ldyBJbmRleGVkREJNYW5hZ2VyKCJvbmlyaXgtc2RrIiwiZmlsZXMiKSx0aGlzLmluZGV4ZWREQk1hbmFnZXIuZ2V0RmlsZUZyb21JbmRleGVkREIoIlNES18xLjEwLjAiKS50aGVuKChhc3luYyB0PT57bGV0IGU9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdF0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSk7Y29uc3R7ZGVmYXVsdDphfT1hd2FpdCBpbXBvcnQoLyogd2VicGFja0lnbm9yZTogdHJ1ZSwgd2VicGFja01vZGU6ICJsYXp5IiAqL2UpLGk9YXdhaXQgYSgpO3RoaXMubmF0aXZlU0RLPWksdGhpcy5jb2Fyc2VGcmFtZT10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDM2ODY0MDApLHRoaXMuZXh0cmFjdGlvbkZyYW1lPXRoaXMubmF0aXZlU0RLLl9tYWxsb2MoMzY4NjQwMCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmZyYW1lTGF5b3V0U3RydWN0PXRoaXMubmF0aXZlU0RLLl9tYWxsb2MoMjgpLEEud2FzbS5udW1UaHJlYWRzPTE7Y29uc3Qgcz1hd2FpdCB0aGlzLmluZGV4ZWREQk1hbmFnZXIuZ2V0RmlsZUZyb21JbmRleGVkREIoIm9ydC53YXNtIikscj1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtzXSx7dHlwZToiYXBwbGljYXRpb24vd2FzbSJ9KSk7QS53YXNtLndhc21QYXRocz17d2FzbTpyLG1qczoiaHR0cHM6Ly9jZG4ub25pcml4LmNvbS9vbmlyaXgtZW5naW5lLXNkay9vcnRfdjEuMjEuMF9taW4vb3J0LXdhc20tc2ltZC5tanMifTtsZXQgbj1hd2FpdCB0aGlzLmluZGV4ZWREQk1hbmFnZXIuZ2V0RnJvbUNhY2hlT3JGZXRjaCgiY29hcnNlbG9jLm9ydCIsImh0dHBzOi8vY2RuLm9uaXJpeC5jb20vb25pcml4LWVuZ2luZS1zZGsvY29hcnNlbG9jLm9ydCIpO2NvbnN0IG89YXdhaXQgT3IuY3JlYXRlKG4se2V4ZWN1dGlvblByb3ZpZGVyczpbIndhc20iXX0pO2xldCBoPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGcm9tQ2FjaGVPckZldGNoKCJzcGFyc2VfZXh0cmFjdC5vcnQiLCJodHRwczovL2Nkbi5vbmlyaXguY29tL29uaXJpeC1lbmdpbmUtc2RrL3NwYXJzZV9leHRyYWN0Lm9ydCIpO2NvbnN0IGM9YXdhaXQgT3IuY3JlYXRlKGgse2V4ZWN1dGlvblByb3ZpZGVyczpbIndhc20iXX0pO3RoaXMuc2Vzc2lvbj1vLHRoaXMuc2Vzc2lvbkV4dHJhY3Rpb249Yyxhd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgUihuZXcgRmxvYXQzMkFycmF5KEFycmF5KDkyMTYwMCkuZmlsbCgwKSksWzEsMyw2NDAsNDgwXSl9KSx0aGlzLnJlYWR5PSEwLHBvc3RNZXNzYWdlKCJyZWFkeSIpO30pKTt9c3RhcnQoKXthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoYXN5bmMgdD0+e2lmKCF0aGlzLnJlYWR5KXJldHVybiB2b2lkIHBvc3RNZXNzYWdlKCExKTt0aGlzLnJlYWR5PSExO2NvbnN0IGU9dC5kYXRhLGE9ZS53aWR0aCplLmhlaWdodCo0OzAhPXRoaXMuYnVmZmVyTGVuZ3RoJiZ0aGlzLmJ1ZmZlckxlbmd0aD09YXx8KDAhPXRoaXMuYnVmZmVyTGVuZ3RoJiZ0aGlzLm5hdGl2ZVNESy5fZnJlZSh0aGlzLmJ1ZmZlciksdGhpcy5idWZmZXJMZW5ndGg9YSx0aGlzLmJ1ZmZlcj10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKHRoaXMuYnVmZmVyTGVuZ3RoKSksdGhpcy5uYXRpdmVTREsuSEVBUFU4LnNldChlLmRhdGEsdGhpcy5idWZmZXIpLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzBdPWUud2lkdGgsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrMV09ZS5oZWlnaHQsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrMl09NCplLndpZHRoLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzNdPSExLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzRdPWUuY29sb3JTcGFjZSx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCs1XT1lLnJvdGF0ZSx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCs2XT1lLmZsaXA7bGV0IGk9dGhpcy5uYXRpdmVTREsuX09YX0V4dHJhY3QodGhpcy5idWZmZXIsdGhpcy5jb2Fyc2VGcmFtZSx0aGlzLmV4dHJhY3Rpb25GcmFtZSx0aGlzLmZyYW1lTGF5b3V0U3RydWN0LGUuZHR5cGUpLHM9W107aWYoZS5vbmx5Q29hcnNlfHwyIT1lLmR0eXBlKXM9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnJlYWRFeHRyYWN0aW9uRGF0YSh0aGlzLm5hdGl2ZVNESy5IRUFQRjMyLGkvNCkpO2Vsc2Uge2xldCB0PVtdO2ZvcihsZXQgZT0wO2U8OTIxNjAwO2UrKyl0LnB1c2godGhpcy5uYXRpdmVTREsuSEVBUEYzMlt0aGlzLmV4dHJhY3Rpb25GcmFtZS80K2VdKTtsZXR7a2V5cG9pbnRzOmUsZGVzY3JpcHRvcnM6YX09YXdhaXQgdGhpcy5zZXNzaW9uRXh0cmFjdGlvbi5ydW4oe2ltYWdlOm5ldyBSKG5ldyBGbG9hdDMyQXJyYXkodCksWzEsMyw0ODAsNjQwXSl9KSxpPVtlLmRpbXNbMF0sLi4uZS5kYXRhLC4uLmEuZGF0YV07cz1uZXcgRmxvYXQzMkFycmF5KGkpO31sZXQgcj1bXTtmb3IobGV0IHQ9MDt0PDkyMTYwMDt0Kyspci5wdXNoKHRoaXMubmF0aXZlU0RLLkhFQVBGMzJbdGhpcy5jb2Fyc2VGcmFtZS80K3RdKTtsZXQgbj1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgUihuZXcgRmxvYXQzMkFycmF5KHIpLFsxLDMsNjQwLDQ4MF0pfSk7cG9zdE1lc3NhZ2Uoe2V4dHJhY3Rpb246cyxkZXNjcmlwdG9yOm4ub3V0cHV0LmRhdGEsb25seUNvYXJzZTplLm9ubHlDb2Fyc2V9KSx0aGlzLnJlYWR5PSEwO30pKTt9cmVhZEV4dHJhY3Rpb25EYXRhKHQsZSl7bGV0IGE9ZSxpPVtdLHM9dFthXTtpLnB1c2gocyksYSsrO2ZvcihsZXQgZT0wO2U8cztlKyspaS5wdXNoKHRbYV0pLGkucHVzaCh0W2ErMV0pLGErPTI7Zm9yKGxldCBlPTA7ZTwxMjgqcztlKyspaS5wdXNoKHRbYV0pLGErKztyZXR1cm4gaX19Y29uc3Qgd29ya2VyPW5ldyBXb3JrZXJOYXRpdmU7d29ya2VyLnN0YXJ0KCk7Cg=="),b=new Blob([d],{type:"application/javascript"});this.workers[Z]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(b),{type:"module"}),this.callbacks[Z]=l,this.workers[Z].addEventListener("message",(l=>{this.callbacks[Z](l.data);}));}}createMatchingWorker(Z,l){if(!this.workerExists(Z)){let d=atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319Cgp2YXIgaGUsaixpZSxBcix1dCxjdCxkdCxfLEEsbXQsaHQsSGUseXQsYnQsZ3QsRXQsVHQsSCxhZSxBdCxPdCxMdCxJdCx2LFIsdnQsQnQsVixZLHllLE9yLFdlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxncj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLEVyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLFRyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksJGU9KGU9PnR5cGVvZiByZXF1aXJlPCJ1Ij9yZXF1aXJlOnR5cGVvZiBQcm94eTwidSI/bmV3IFByb3h5KGUse2dldDooZSx0KT0+KHR5cGVvZiByZXF1aXJlPCJ1Ij9yZXF1aXJlOmUpW3RdfSk6ZSkoKGZ1bmN0aW9uKGUpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJytlKyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pKSxUPShlLHQpPT4oKT0+KGUmJih0PWUoZT0wKSksdCksR2U9KGUsdCk9Pntmb3IodmFyIHIgaW4gdClXZShlLHIse2dldDp0W3JdLGVudW1lcmFibGU6ITB9KTt9LFNyPShlLHQscixuKT0+e2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpZm9yKGxldCBvIG9mIEVyKHQpKSFUci5jYWxsKGUsbykmJm8hPT1yJiZXZShlLG8se2dldDooKT0+dFtvXSxlbnVtZXJhYmxlOiEobj1ncih0LG8pKXx8bi5lbnVtZXJhYmxlfSk7cmV0dXJuIGV9LGF0PWU9PlNyKFdlKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKSx6ZT1UKCgoKT0+e2hlPW5ldyBNYXAsaj1bXSxpZT0oZSx0LHIpPT57aWYoIXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmluaXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNyZWF0ZUluZmVyZW5jZVNlc3Npb25IYW5kbGVyKXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIHZhbGlkIGJhY2tlbmQiKTt7bGV0IG49aGUuZ2V0KGUpO2lmKHZvaWQgMD09PW4paGUuc2V0KGUse2JhY2tlbmQ6dCxwcmlvcml0eTpyfSk7ZWxzZSB7aWYobi5wcmlvcml0eT5yKXJldHVybjtpZihuLnByaW9yaXR5PT09ciYmbi5iYWNrZW5kIT09dCl0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWdpc3RlciBiYWNrZW5kICIke2V9IiB1c2luZyBwcmlvcml0eSAke3J9YCl9aWYocj49MCl7bGV0IHQ9ai5pbmRleE9mKGUpOy0xIT09dCYmai5zcGxpY2UodCwxKTtmb3IobGV0IHQ9MDt0PGoubGVuZ3RoO3QrKylpZihoZS5nZXQoalt0XSkucHJpb3JpdHk8PXIpcmV0dXJuIHZvaWQgai5zcGxpY2UodCwwLGUpO2oucHVzaChlKTt9fX0sQXI9YXN5bmMgZT0+e2xldCB0PWhlLmdldChlKTtpZighdClyZXR1cm4gImJhY2tlbmQgbm90IGZvdW5kLiI7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZClyZXR1cm4gdC5lcnJvcjt7bGV0IHI9ISF0LmluaXRQcm9taXNlO3RyeXtyZXR1cm4gcnx8KHQuaW5pdFByb21pc2U9dC5iYWNrZW5kLmluaXQoZSkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2goZSl7cmV0dXJuIHJ8fCh0LmVycm9yPWAke2V9YCx0LmFib3J0ZWQ9ITApLHQuZXJyb3J9ZmluYWxseXtkZWxldGUgdC5pbml0UHJvbWlzZTt9fX0sdXQ9YXN5bmMgZT0+e2xldCB0LHI9ZS5leGVjdXRpb25Qcm92aWRlcnN8fFtdLG49ci5tYXAoKGU9PiJzdHJpbmciPT10eXBlb2YgZT9lOmUubmFtZSkpLG89MD09PW4ubGVuZ3RoP2o6bixhPVtdLGk9bmV3IFNldDtmb3IobGV0IGUgb2Ygbyl7bGV0IHI9YXdhaXQgQXIoZSk7InN0cmluZyI9PXR5cGVvZiByP2EucHVzaCh7bmFtZTplLGVycjpyfSk6KHR8fCh0PXIpLHQ9PT1yJiZpLmFkZChlKSk7fWlmKCF0KXRocm93IG5ldyBFcnJvcihgbm8gYXZhaWxhYmxlIGJhY2tlbmQgZm91bmQuIEVSUjogJHthLm1hcCgoZT0+YFske2UubmFtZX1dICR7ZS5lcnJ9YCkpLmpvaW4oIiwgIil9YCk7Zm9yKGxldHtuYW1lOmUsZXJyOnR9b2YgYSluLmluY2x1ZGVzKGUpJiZjb25zb2xlLndhcm4oYHJlbW92aW5nIHJlcXVlc3RlZCBleGVjdXRpb24gcHJvdmlkZXIgIiR7ZX0iIGZyb20gc2Vzc2lvbiBvcHRpb25zIGJlY2F1c2UgaXQgaXMgbm90IGF2YWlsYWJsZTogJHt0fWApO2xldCBzPXIuZmlsdGVyKChlPT5pLmhhcygic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSk7cmV0dXJuIFt0LG5ldyBQcm94eShlLHtnZXQ6KGUsdCk9PiJleGVjdXRpb25Qcm92aWRlcnMiPT09dD9zOlJlZmxlY3QuZ2V0KGUsdCl9KV19O30pKSxmdD1UKCgoKT0+e3plKCk7fSkpLGx0PVQoKCgpPT57Y3Q9IjEuMjEuMCI7fSkpLGplPVQoKCgpPT57bHQoKSxkdD0id2FybmluZyIsXz17d2FzbTp7fSx3ZWJnbDp7fSx3ZWJncHU6e30sdmVyc2lvbnM6e2NvbW1vbjpjdH0sc2V0IGxvZ0xldmVsKGUpe2lmKHZvaWQgMCE9PWUpe2lmKCJzdHJpbmciIT10eXBlb2YgZXx8LTE9PT1bInZlcmJvc2UiLCJpbmZvIiwid2FybmluZyIsImVycm9yIiwiZmF0YWwiXS5pbmRleE9mKGUpKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHtlfWApO2R0PWU7fX0sZ2V0IGxvZ0xldmVsKCl7cmV0dXJuIGR0fX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KF8sImxvZ0xldmVsIix7ZW51bWVyYWJsZTohMH0pO30pKSxwdD1UKCgoKT0+e2plKCksQT1fO30pKSx3dD1UKCgoKT0+e210PShlLHQpPT57bGV0IHI9dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTpuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSk7ci53aWR0aD1lLmRpbXNbM10sci5oZWlnaHQ9ZS5kaW1zWzJdO2xldCBuPXIuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1uKXtsZXQgbyxhO3ZvaWQgMCE9PXQ/LnRlbnNvckxheW91dCYmIk5IV0MiPT09dC50ZW5zb3JMYXlvdXQ/KG89ZS5kaW1zWzJdLGE9ZS5kaW1zWzNdKToobz1lLmRpbXNbM10sYT1lLmRpbXNbMl0pO2xldCBpLHMsbD12b2lkIDAhPT10Py5mb3JtYXQ/dC5mb3JtYXQ6IlJHQiIsdT10Py5ub3JtO3ZvaWQgMD09PXV8fHZvaWQgMD09PXUubWVhbj9pPVsyNTUsMjU1LDI1NSwyNTVdOiJudW1iZXIiPT10eXBlb2YgdS5tZWFuP2k9W3UubWVhbix1Lm1lYW4sdS5tZWFuLHUubWVhbl06KGk9W3UubWVhblswXSx1Lm1lYW5bMV0sdS5tZWFuWzJdLDBdLHZvaWQgMCE9PXUubWVhblszXSYmKGlbM109dS5tZWFuWzNdKSksdm9pZCAwPT09dXx8dm9pZCAwPT09dS5iaWFzP3M9WzAsMCwwLDBdOiJudW1iZXIiPT10eXBlb2YgdS5iaWFzP3M9W3UuYmlhcyx1LmJpYXMsdS5iaWFzLHUuYmlhc106KHM9W3UuYmlhc1swXSx1LmJpYXNbMV0sdS5iaWFzWzJdLDBdLHZvaWQgMCE9PXUuYmlhc1szXSYmKHNbM109dS5iaWFzWzNdKSk7bGV0IGY9YSpvLGQ9MCxwPWYsYz0yKmYsaD0tMTsiUkdCQSI9PT1sPyhkPTAscD1mLGM9MipmLGg9MypmKToiUkdCIj09PWw/KGQ9MCxwPWYsYz0yKmYpOiJSQkciPT09bCYmKGQ9MCxjPWYscD0yKmYpO2ZvcihsZXQgdD0wO3Q8YTt0KyspZm9yKGxldCByPTA7cjxvO3IrKyl7bGV0IG89KGUuZGF0YVtkKytdLXNbMF0pKmlbMF0sYT0oZS5kYXRhW3ArK10tc1sxXSkqaVsxXSxsPShlLmRhdGFbYysrXS1zWzJdKSppWzJdLHU9LTE9PT1oPzI1NTooZS5kYXRhW2grK10tc1szXSkqaVszXTtuLmZpbGxTdHlsZT0icmdiYSgiK28rIiwiK2ErIiwiK2wrIiwiK3UrIikiLG4uZmlsbFJlY3Qocix0LDEsMSk7fWlmKCJ0b0RhdGFVUkwiaW4gcilyZXR1cm4gci50b0RhdGFVUkwoKTt0aHJvdyBuZXcgRXJyb3IoInRvRGF0YVVSTCBpcyBub3Qgc3VwcG9ydGVkIil9dGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIil9LGh0PShlLHQpPT57bGV0IHIsbj10eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik6bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIik7aWYobnVsbD09bil0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKTt7bGV0IG8sYSxpO3ZvaWQgMCE9PXQ/LnRlbnNvckxheW91dCYmIk5IV0MiPT09dC50ZW5zb3JMYXlvdXQ/KG89ZS5kaW1zWzJdLGE9ZS5kaW1zWzFdLGk9ZS5kaW1zWzNdKToobz1lLmRpbXNbM10sYT1lLmRpbXNbMl0saT1lLmRpbXNbMV0pO2xldCBzLGwsdT12b2lkIDAhPT10JiZ2b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCIixmPXQ/Lm5vcm07dm9pZCAwPT09Znx8dm9pZCAwPT09Zi5tZWFuP3M9WzI1NSwyNTUsMjU1LDI1NV06Im51bWJlciI9PXR5cGVvZiBmLm1lYW4/cz1bZi5tZWFuLGYubWVhbixmLm1lYW4sZi5tZWFuXToocz1bZi5tZWFuWzBdLGYubWVhblsxXSxmLm1lYW5bMl0sMjU1XSx2b2lkIDAhPT1mLm1lYW5bM10mJihzWzNdPWYubWVhblszXSkpLHZvaWQgMD09PWZ8fHZvaWQgMD09PWYuYmlhcz9sPVswLDAsMCwwXToibnVtYmVyIj09dHlwZW9mIGYuYmlhcz9sPVtmLmJpYXMsZi5iaWFzLGYuYmlhcyxmLmJpYXNdOihsPVtmLmJpYXNbMF0sZi5iaWFzWzFdLGYuYmlhc1syXSwwXSx2b2lkIDAhPT1mLmJpYXNbM10mJihsWzNdPWYuYmlhc1szXSkpO2xldCBkPWEqbztpZih2b2lkIDAhPT10JiYodm9pZCAwIT09dC5mb3JtYXQmJjQ9PT1pJiYiUkdCQSIhPT10LmZvcm1hdHx8Mz09PWkmJiJSR0IiIT09dC5mb3JtYXQmJiJCR1IiIT09dC5mb3JtYXQpKXRocm93IG5ldyBFcnJvcigiVGVuc29yIGZvcm1hdCBkb2Vzbid0IG1hdGNoIGlucHV0IHRlbnNvciBkaW1zIik7bGV0IHA9NCxjPTAsaD0xLHc9Mix5PTMsbT0wLGc9ZCxiPTIqZCx2PS0xOyJSR0JBIj09PXU/KG09MCxnPWQsYj0yKmQsdj0zKmQpOiJSR0IiPT09dT8obT0wLGc9ZCxiPTIqZCk6IlJCRyI9PT11JiYobT0wLGI9ZCxnPTIqZCkscj1uLmNyZWF0ZUltYWdlRGF0YShvLGEpO2ZvcihsZXQgdD0wO3Q8YSpvO2MrPXAsaCs9cCx3Kz1wLHkrPXAsdCsrKXIuZGF0YVtjXT0oZS5kYXRhW20rK10tbFswXSkqc1swXSxyLmRhdGFbaF09KGUuZGF0YVtnKytdLWxbMV0pKnNbMV0sci5kYXRhW3ddPShlLmRhdGFbYisrXS1sWzJdKSpzWzJdLHIuZGF0YVt5XT0tMT09PXY/MjU1OihlLmRhdGFbdisrXS1sWzNdKSpzWzNdO31yZXR1cm4gcn07fSkpLFN0PVQoKCgpPT57d2UoKSxIZT0oZSx0KT0+e2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBidWZmZXIgbXVzdCBiZSBkZWZpbmVkIik7aWYodm9pZCAwPT09dC5oZWlnaHR8fHZvaWQgMD09PXQud2lkdGgpdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBoZWlnaHQgYW5kIHdpZHRoIG11c3QgYmUgZGVmaW5lZCIpO2lmKCJOSFdDIj09PXQudGVuc29yTGF5b3V0KXRocm93IG5ldyBFcnJvcigiTkhXQyBUZW5zb3IgbGF5b3V0IGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7bGV0IHIsbix7aGVpZ2h0Om8sd2lkdGg6YX09dCxpPXQubm9ybT8/e21lYW46MjU1LGJpYXM6MH07cj0ibnVtYmVyIj09dHlwZW9mIGkubWVhbj9baS5tZWFuLGkubWVhbixpLm1lYW4saS5tZWFuXTpbaS5tZWFuWzBdLGkubWVhblsxXSxpLm1lYW5bMl0saS5tZWFuWzNdPz8yNTVdLG49Im51bWJlciI9PXR5cGVvZiBpLmJpYXM/W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLGkuYmlhc1szXT8/MF07bGV0IHM9dm9pZCAwIT09dC5mb3JtYXQ/dC5mb3JtYXQ6IlJHQkEiLGw9dm9pZCAwIT09dC50ZW5zb3JGb3JtYXQmJnZvaWQgMCE9PXQudGVuc29yRm9ybWF0P3QudGVuc29yRm9ybWF0OiJSR0IiLHU9byphLGY9IlJHQkEiPT09bD9uZXcgRmxvYXQzMkFycmF5KDQqdSk6bmV3IEZsb2F0MzJBcnJheSgzKnUpLGQ9NCxwPTAsYz0xLGg9Mix3PTMseT0wLG09dSxnPTIqdSxiPS0xOyJSR0IiPT09cyYmKGQ9MyxwPTAsYz0xLGg9Mix3PS0xKSwiUkdCQSI9PT1sP2I9Myp1OiJSQkciPT09bD8oeT0wLGc9dSxtPTIqdSk6IkJHUiI9PT1sJiYoZz0wLG09dSx5PTIqdSk7Zm9yKGxldCB0PTA7dDx1O3QrKyxwKz1kLGgrPWQsYys9ZCx3Kz1kKWZbeSsrXT0oZVtwXStuWzBdKS9yWzBdLGZbbSsrXT0oZVtjXStuWzFdKS9yWzFdLGZbZysrXT0oZVtoXStuWzJdKS9yWzJdLC0xIT09YiYmLTEhPT13JiYoZltiKytdPShlW3ddK25bM10pL3JbM10pO3JldHVybiBuZXcgdigiZmxvYXQzMiIsZiwiUkdCQSI9PT1sP1sxLDQsbyxhXTpbMSwzLG8sYV0pfSx5dD1hc3luYyhlLHQpPT57bGV0IHIsbj10eXBlb2YgSFRNTEltYWdlRWxlbWVudDwidSImJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50LG89dHlwZW9mIEltYWdlRGF0YTwidSImJmUgaW5zdGFuY2VvZiBJbWFnZURhdGEsYT10eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAsaT0ic3RyaW5nIj09dHlwZW9mIGUscz10Pz97fSxsPSgpPT57aWYodHlwZW9mIGRvY3VtZW50PCJ1IilyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7aWYodHlwZW9mIE9mZnNjcmVlbkNhbnZhczwidSIpcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKTt0aHJvdyBuZXcgRXJyb3IoIkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkIil9LHU9ZT0+dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PCJ1IiYmZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHxlIGluc3RhbmNlb2YgT2Zmc2NyZWVuQ2FudmFzP2UuZ2V0Q29udGV4dCgiMmQiKTpudWxsO2lmKG4pe2xldCBuPWwoKTtuLndpZHRoPWUud2lkdGgsbi5oZWlnaHQ9ZS5oZWlnaHQ7bGV0IG89dShuKTtpZihudWxsPT1vKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgbj1lLmhlaWdodCxhPWUud2lkdGg7aWYodm9pZCAwIT09dCYmdm9pZCAwIT09dC5yZXNpemVkSGVpZ2h0JiZ2b2lkIDAhPT10LnJlc2l6ZWRXaWR0aCYmKG49dC5yZXNpemVkSGVpZ2h0LGE9dC5yZXNpemVkV2lkdGgpLHZvaWQgMCE9PXQpe2lmKHM9dCx2b2lkIDAhPT10LnRlbnNvckZvcm1hdCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7cy50ZW5zb3JGb3JtYXQ9IlJHQkEiLHMuaGVpZ2h0PW4scy53aWR0aD1hO31lbHNlIHMudGVuc29yRm9ybWF0PSJSR0JBIixzLmhlaWdodD1uLHMud2lkdGg9YTtvLmRyYXdJbWFnZShlLDAsMCkscj1vLmdldEltYWdlRGF0YSgwLDAsYSxuKS5kYXRhO319ZWxzZSB7aWYoIW8pe2lmKGEpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBpbWFnZSBjb25maWcgd2l0aCBmb3JtYXQgZm9yIEltYWdlYml0bWFwIik7bGV0IG49bCgpO24ud2lkdGg9ZS53aWR0aCxuLmhlaWdodD1lLmhlaWdodDtsZXQgbz11KG4pO2lmKG51bGwhPW8pe2xldCB0PWUuaGVpZ2h0LG49ZS53aWR0aDtyZXR1cm4gby5kcmF3SW1hZ2UoZSwwLDAsbix0KSxyPW8uZ2V0SW1hZ2VEYXRhKDAsMCxuLHQpLmRhdGEscy5oZWlnaHQ9dCxzLndpZHRoPW4sSGUocixzKX10aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX1pZihpKXJldHVybiBuZXcgUHJvbWlzZSgoKHQscik9PntsZXQgbj1sKCksbz11KG4pO2lmKCFlfHwhbylyZXR1cm4gcigpO2xldCBhPW5ldyBJbWFnZTthLmNyb3NzT3JpZ2luPSJBbm9ueW1vdXMiLGEuc3JjPWUsYS5vbmxvYWQ9KCk9PntuLndpZHRoPWEud2lkdGgsbi5oZWlnaHQ9YS5oZWlnaHQsby5kcmF3SW1hZ2UoYSwwLDAsbi53aWR0aCxuLmhlaWdodCk7bGV0IGU9by5nZXRJbWFnZURhdGEoMCwwLG4ud2lkdGgsbi5oZWlnaHQpO3MuaGVpZ2h0PW4uaGVpZ2h0LHMud2lkdGg9bi53aWR0aCx0KEhlKGUuZGF0YSxzKSk7fTt9KSk7dGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQgLSBhYm9ydGVkIHRlbnNvciBjcmVhdGlvbiIpfXtsZXQgbixvO2lmKHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQucmVzaXplZFdpZHRoJiZ2b2lkIDAhPT10LnJlc2l6ZWRIZWlnaHQ/KG49dC5yZXNpemVkSGVpZ2h0LG89dC5yZXNpemVkV2lkdGgpOihuPWUuaGVpZ2h0LG89ZS53aWR0aCksdm9pZCAwIT09dCYmKHM9dCkscy5mb3JtYXQ9IlJHQkEiLHMuaGVpZ2h0PW4scy53aWR0aD1vLHZvaWQgMCE9PXQpe2xldCB0PWwoKTt0LndpZHRoPW8sdC5oZWlnaHQ9bjtsZXQgYT11KHQpO2lmKG51bGw9PWEpdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7YS5wdXRJbWFnZURhdGEoZSwwLDApLHI9YS5nZXRJbWFnZURhdGEoMCwwLG8sbikuZGF0YTt9ZWxzZSByPWUuZGF0YTt9fWlmKHZvaWQgMCE9PXIpcmV0dXJuIEhlKHIscyk7dGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQgLSBhYm9ydGVkIHRlbnNvciBjcmVhdGlvbiIpfSxidD0oZSx0KT0+e2xldHt3aWR0aDpyLGhlaWdodDpuLGRvd25sb2FkOm8sZGlzcG9zZTphfT10O3JldHVybiBuZXcgdih7bG9jYXRpb246InRleHR1cmUiLHR5cGU6ImZsb2F0MzIiLHRleHR1cmU6ZSxkaW1zOlsxLG4sciw0XSxkb3dubG9hZDpvLGRpc3Bvc2U6YX0pfSxndD0oZSx0KT0+e2xldHtkYXRhVHlwZTpyLGRpbXM6bixkb3dubG9hZDpvLGRpc3Bvc2U6YX09dDtyZXR1cm4gbmV3IHYoe2xvY2F0aW9uOiJncHUtYnVmZmVyIix0eXBlOnI/PyJmbG9hdDMyIixncHVCdWZmZXI6ZSxkaW1zOm4sZG93bmxvYWQ6byxkaXNwb3NlOmF9KX0sRXQ9KGUsdCk9PntsZXR7ZGF0YVR5cGU6cixkaW1zOm4sZG93bmxvYWQ6byxkaXNwb3NlOmF9PXQ7cmV0dXJuIG5ldyB2KHtsb2NhdGlvbjoibWwtdGVuc29yIix0eXBlOnI/PyJmbG9hdDMyIixtbFRlbnNvcjplLGRpbXM6bixkb3dubG9hZDpvLGRpc3Bvc2U6YX0pfSxUdD0oZSx0LHIpPT5uZXcgdih7bG9jYXRpb246ImNwdS1waW5uZWQiLHR5cGU6ZSxkYXRhOnQsZGltczpyPz9bdC5sZW5ndGhdfSk7fSkpLHh0PVQoKCgpPT57SD1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XSxbImludDQiLFVpbnQ4QXJyYXldLFsidWludDQiLFVpbnQ4QXJyYXldXSksYWU9bmV3IE1hcChbW0Zsb2F0MzJBcnJheSwiZmxvYXQzMiJdLFtVaW50OEFycmF5LCJ1aW50OCJdLFtJbnQ4QXJyYXksImludDgiXSxbVWludDE2QXJyYXksInVpbnQxNiJdLFtJbnQxNkFycmF5LCJpbnQxNiJdLFtJbnQzMkFycmF5LCJpbnQzMiJdLFtGbG9hdDY0QXJyYXksImZsb2F0NjQiXSxbVWludDMyQXJyYXksInVpbnQzMiJdXSksQXQ9ITEsT3Q9KCk9PntpZighQXQpe0F0PSEwO2xldCBlPXR5cGVvZiBCaWdJbnQ2NEFycmF5PCJ1IiYmQmlnSW50NjRBcnJheS5mcm9tLHQ9dHlwZW9mIEJpZ1VpbnQ2NEFycmF5PCJ1IiYmQmlnVWludDY0QXJyYXkuZnJvbSxyPWdsb2JhbFRoaXMuRmxvYXQxNkFycmF5LG49dHlwZW9mIHI8InUiJiZyLmZyb207ZSYmKEguc2V0KCJpbnQ2NCIsQmlnSW50NjRBcnJheSksYWUuc2V0KEJpZ0ludDY0QXJyYXksImludDY0IikpLHQmJihILnNldCgidWludDY0IixCaWdVaW50NjRBcnJheSksYWUuc2V0KEJpZ1VpbnQ2NEFycmF5LCJ1aW50NjQiKSksbj8oSC5zZXQoImZsb2F0MTYiLHIpLGFlLnNldChyLCJmbG9hdDE2IikpOkguc2V0KCJmbG9hdDE2IixVaW50MTZBcnJheSk7fX07fSkpLFB0PVQoKCgpPT57d2UoKSxMdD1lPT57bGV0IHQ9MTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG49ZVtyXTtpZigibnVtYmVyIiE9dHlwZW9mIG58fCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBkaW1zWyR7cn1dIG11c3QgYmUgYW4gaW50ZWdlciwgZ290OiAke259YCk7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBkaW1zWyR7cn1dIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290OiAke259YCk7dCo9bjt9cmV0dXJuIHR9LEl0PShlLHQpPT57c3dpdGNoKGUubG9jYXRpb24pe2Nhc2UiY3B1IjpyZXR1cm4gbmV3IHYoZS50eXBlLGUuZGF0YSx0KTtjYXNlImNwdS1waW5uZWQiOnJldHVybiBuZXcgdih7bG9jYXRpb246ImNwdS1waW5uZWQiLGRhdGE6ZS5kYXRhLHR5cGU6ZS50eXBlLGRpbXM6dH0pO2Nhc2UidGV4dHVyZSI6cmV0dXJuIG5ldyB2KHtsb2NhdGlvbjoidGV4dHVyZSIsdGV4dHVyZTplLnRleHR1cmUsdHlwZTplLnR5cGUsZGltczp0fSk7Y2FzZSJncHUtYnVmZmVyIjpyZXR1cm4gbmV3IHYoe2xvY2F0aW9uOiJncHUtYnVmZmVyIixncHVCdWZmZXI6ZS5ncHVCdWZmZXIsdHlwZTplLnR5cGUsZGltczp0fSk7Y2FzZSJtbC10ZW5zb3IiOnJldHVybiBuZXcgdih7bG9jYXRpb246Im1sLXRlbnNvciIsbWxUZW5zb3I6ZS5tbFRlbnNvcix0eXBlOmUudHlwZSxkaW1zOnR9KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdGVuc29yUmVzaGFwZTogdGVuc29yIGxvY2F0aW9uICR7ZS5sb2NhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApfX07fSkpLHdlPVQoKCgpPT57d3QoKSxTdCgpLHh0KCksUHQoKSx2PWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXtsZXQgbixvO2lmKE90KCksIm9iamVjdCI9PXR5cGVvZiBlJiYibG9jYXRpb24iaW4gZSlzd2l0Y2godGhpcy5kYXRhTG9jYXRpb249ZS5sb2NhdGlvbixuPWUudHlwZSxvPWUuZGltcyxlLmxvY2F0aW9uKXtjYXNlImNwdS1waW5uZWQiOntsZXQgdD1ILmdldChuKTtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKGB1bnN1cHBvcnRlZCB0eXBlICIke259IiB0byBjcmVhdGUgdGVuc29yIGZyb20gcGlubmVkIGJ1ZmZlcmApO2lmKCEoZS5kYXRhIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcihgYnVmZmVyIHNob3VsZCBiZSBvZiB0eXBlICR7dC5uYW1lfWApO3RoaXMuY3B1RGF0YT1lLmRhdGE7YnJlYWt9Y2FzZSJ0ZXh0dXJlIjppZigiZmxvYXQzMiIhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7bn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSB0ZXh0dXJlYCk7dGhpcy5ncHVUZXh0dXJlRGF0YT1lLnRleHR1cmUsdGhpcy5kb3dubG9hZGVyPWUuZG93bmxvYWQsdGhpcy5kaXNwb3Nlcj1lLmRpc3Bvc2U7YnJlYWs7Y2FzZSJncHUtYnVmZmVyIjppZigiZmxvYXQzMiIhPT1uJiYiZmxvYXQxNiIhPT1uJiYiaW50MzIiIT09biYmImludDY0IiE9PW4mJiJ1aW50MzIiIT09biYmInVpbnQ4IiE9PW4mJiJib29sIiE9PW4mJiJ1aW50NCIhPT1uJiYiaW50NCIhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7bn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSBncHUgYnVmZmVyYCk7dGhpcy5ncHVCdWZmZXJEYXRhPWUuZ3B1QnVmZmVyLHRoaXMuZG93bmxvYWRlcj1lLmRvd25sb2FkLHRoaXMuZGlzcG9zZXI9ZS5kaXNwb3NlO2JyZWFrO2Nhc2UibWwtdGVuc29yIjppZigiZmxvYXQzMiIhPT1uJiYiZmxvYXQxNiIhPT1uJiYiaW50MzIiIT09biYmImludDY0IiE9PW4mJiJ1aW50MzIiIT09biYmInVpbnQ2NCIhPT1uJiYiaW50OCIhPT1uJiYidWludDgiIT09biYmImJvb2wiIT09biYmInVpbnQ0IiE9PW4mJiJpbnQ0IiE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZSAiJHtufSIgdG8gY3JlYXRlIHRlbnNvciBmcm9tIE1MVGVuc29yYCk7dGhpcy5tbFRlbnNvckRhdGE9ZS5tbFRlbnNvcix0aGlzLmRvd25sb2FkZXI9ZS5kb3dubG9hZCx0aGlzLmRpc3Bvc2VyPWUuZGlzcG9zZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVGVuc29yIGNvbnN0cnVjdG9yOiB1bnN1cHBvcnRlZCBsb2NhdGlvbiAnJHt0aGlzLmRhdGFMb2NhdGlvbn0nYCl9ZWxzZSB7bGV0IGEsaTtpZigic3RyaW5nIj09dHlwZW9mIGUpaWYobj1lLGk9ciwic3RyaW5nIj09PWUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgc3RyaW5nIHRlbnNvcidzIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBhcnJheS4iKTthPXQ7fWVsc2Uge2xldCByPUguZ2V0KGUpO2lmKHZvaWQgMD09PXIpdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgdGVuc29yIHR5cGU6ICR7ZX0uYCk7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYoImZsb2F0MTYiPT09ZSYmcj09PVVpbnQxNkFycmF5fHwidWludDQiPT09ZXx8ImludDQiPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKGBDcmVhdGluZyBhICR7ZX0gdGVuc29yIGZyb20gbnVtYmVyIGFycmF5IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgJHtyLm5hbWV9IGFzIGRhdGEuYCk7YT0idWludDY0Ij09PWV8fCJpbnQ2NCI9PT1lP3IuZnJvbSh0LEJpZ0ludCk6ci5mcm9tKHQpO31lbHNlIGlmKHQgaW5zdGFuY2VvZiByKWE9dDtlbHNlIGlmKHQgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSl7aWYoInVpbnQ4IiE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBVaW50OENsYW1wZWRBcnJheSB0ZW5zb3IncyBkYXRhIG11c3QgYmUgdHlwZSBvZiB1aW50OCIpO2E9VWludDhBcnJheS5mcm9tKHQpO31lbHNlIHtpZighKCJmbG9hdDE2Ij09PWUmJnQgaW5zdGFuY2VvZiBVaW50MTZBcnJheSYmciE9PVVpbnQxNkFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKGBBICR7bn0gdGVuc29yJ3MgZGF0YSBtdXN0IGJlIHR5cGUgb2YgJHtyfWApO2E9bmV3IGdsb2JhbFRoaXMuRmxvYXQxNkFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCk7fX1lbHNlIGlmKGk9dCxBcnJheS5pc0FycmF5KGUpKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7bGV0IHQ9dHlwZW9mIGVbMF07aWYoInN0cmluZyI9PT10KW49InN0cmluZyIsYT1lO2Vsc2Uge2lmKCJib29sZWFuIiE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgb2YgZGF0YSBhcnJheTogJHt0fS5gKTtuPSJib29sIixhPVVpbnQ4QXJyYXkuZnJvbShlKTt9fWVsc2UgaWYoZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KW49InVpbnQ4IixhPVVpbnQ4QXJyYXkuZnJvbShlKTtlbHNlIHtsZXQgdD1hZS5nZXQoZS5jb25zdHJ1Y3Rvcik7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0eXBlIGZvciB0ZW5zb3IgZGF0YTogJHtlLmNvbnN0cnVjdG9yfS5gKTtuPXQsYT1lO31pZih2b2lkIDA9PT1pKWk9W2EubGVuZ3RoXTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgdGVuc29yJ3MgZGltcyBtdXN0IGJlIGEgbnVtYmVyIGFycmF5Iik7bz1pLHRoaXMuY3B1RGF0YT1hLHRoaXMuZGF0YUxvY2F0aW9uPSJjcHUiO31sZXQgYT1MdChvKTtpZih0aGlzLmNwdURhdGEmJmEhPT10aGlzLmNwdURhdGEubGVuZ3RoJiYoInVpbnQ0IiE9PW4mJiJpbnQ0IiE9PW58fE1hdGguY2VpbChhLzIpIT09dGhpcy5jcHVEYXRhLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKGBUZW5zb3IncyBzaXplKCR7YX0pIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoKCR7dGhpcy5jcHVEYXRhLmxlbmd0aH0pLmApO3RoaXMudHlwZT1uLHRoaXMuZGltcz1vLHRoaXMuc2l6ZT1hO31zdGF0aWMgYXN5bmMgZnJvbUltYWdlKGUsdCl7cmV0dXJuIHl0KGUsdCl9c3RhdGljIGZyb21UZXh0dXJlKGUsdCl7cmV0dXJuIGJ0KGUsdCl9c3RhdGljIGZyb21HcHVCdWZmZXIoZSx0KXtyZXR1cm4gZ3QoZSx0KX1zdGF0aWMgZnJvbU1MVGVuc29yKGUsdCl7cmV0dXJuIEV0KGUsdCl9c3RhdGljIGZyb21QaW5uZWRCdWZmZXIoZSx0LHIpe3JldHVybiBUdChlLHQscil9dG9EYXRhVVJMKGUpe3JldHVybiBtdCh0aGlzLGUpfXRvSW1hZ2VEYXRhKGUpe3JldHVybiBodCh0aGlzLGUpfWdldCBkYXRhKCl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLCF0aGlzLmNwdURhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgb24gQ1BVLiBVc2UgYGdldERhdGEoKWAgdG8gZG93bmxvYWQgR1BVIGRhdGEgdG8gQ1BVLCBvciB1c2UgYHRleHR1cmVgIG9yIGBncHVCdWZmZXJgIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgR1BVIGRhdGEgZGlyZWN0bHkuIik7cmV0dXJuIHRoaXMuY3B1RGF0YX1nZXQgbG9jYXRpb24oKXtyZXR1cm4gdGhpcy5kYXRhTG9jYXRpb259Z2V0IHRleHR1cmUoKXtpZih0aGlzLmVuc3VyZVZhbGlkKCksIXRoaXMuZ3B1VGV4dHVyZURhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViR0wgdGV4dHVyZS4iKTtyZXR1cm4gdGhpcy5ncHVUZXh0dXJlRGF0YX1nZXQgZ3B1QnVmZmVyKCl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLCF0aGlzLmdwdUJ1ZmZlckRhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViR1BVIGJ1ZmZlci4iKTtyZXR1cm4gdGhpcy5ncHVCdWZmZXJEYXRhfWdldCBtbFRlbnNvcigpe2lmKHRoaXMuZW5zdXJlVmFsaWQoKSwhdGhpcy5tbFRlbnNvckRhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViTk4gTUxUZW5zb3IuIik7cmV0dXJuIHRoaXMubWxUZW5zb3JEYXRhfWFzeW5jIGdldERhdGEoZSl7c3dpdGNoKHRoaXMuZW5zdXJlVmFsaWQoKSx0aGlzLmRhdGFMb2NhdGlvbil7Y2FzZSJjcHUiOmNhc2UiY3B1LXBpbm5lZCI6cmV0dXJuIHRoaXMuZGF0YTtjYXNlInRleHR1cmUiOmNhc2UiZ3B1LWJ1ZmZlciI6Y2FzZSJtbC10ZW5zb3IiOmlmKCF0aGlzLmRvd25sb2FkZXIpdGhyb3cgbmV3IEVycm9yKCJUaGUgY3VycmVudCB0ZW5zb3IgaXMgbm90IGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmllZCBkYXRhIGRvd25sb2FkZXIuIik7aWYodGhpcy5pc0Rvd25sb2FkaW5nKXRocm93IG5ldyBFcnJvcigiVGhlIGN1cnJlbnQgdGVuc29yIGlzIGJlaW5nIGRvd25sb2FkZWQuIik7dHJ5e3RoaXMuaXNEb3dubG9hZGluZz0hMDtsZXQgdD1hd2FpdCB0aGlzLmRvd25sb2FkZXIoKTtyZXR1cm4gdGhpcy5kb3dubG9hZGVyPXZvaWQgMCx0aGlzLmRhdGFMb2NhdGlvbj0iY3B1Iix0aGlzLmNwdURhdGE9dCxlJiZ0aGlzLmRpc3Bvc2VyJiYodGhpcy5kaXNwb3NlcigpLHRoaXMuZGlzcG9zZXI9dm9pZCAwKSx0fWZpbmFsbHl7dGhpcy5pc0Rvd25sb2FkaW5nPSExO31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGdldCBkYXRhIGZyb20gbG9jYXRpb246ICR7dGhpcy5kYXRhTG9jYXRpb259YCl9fWRpc3Bvc2UoKXtpZih0aGlzLmlzRG93bmxvYWRpbmcpdGhyb3cgbmV3IEVycm9yKCJUaGUgY3VycmVudCB0ZW5zb3IgaXMgYmVpbmcgZG93bmxvYWRlZC4iKTt0aGlzLmRpc3Bvc2VyJiYodGhpcy5kaXNwb3NlcigpLHRoaXMuZGlzcG9zZXI9dm9pZCAwKSx0aGlzLmNwdURhdGE9dm9pZCAwLHRoaXMuZ3B1VGV4dHVyZURhdGE9dm9pZCAwLHRoaXMuZ3B1QnVmZmVyRGF0YT12b2lkIDAsdGhpcy5tbFRlbnNvckRhdGE9dm9pZCAwLHRoaXMuZG93bmxvYWRlcj12b2lkIDAsdGhpcy5pc0Rvd25sb2FkaW5nPXZvaWQgMCx0aGlzLmRhdGFMb2NhdGlvbj0ibm9uZSI7fWVuc3VyZVZhbGlkKCl7aWYoIm5vbmUiPT09dGhpcy5kYXRhTG9jYXRpb24pdGhyb3cgbmV3IEVycm9yKCJUaGUgdGVuc29yIGlzIGRpc3Bvc2VkLiIpfXJlc2hhcGUoZSl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLHRoaXMuZG93bmxvYWRlcnx8dGhpcy5kaXNwb3Nlcil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZXNoYXBlIGEgdGVuc29yIHRoYXQgb3ducyBHUFUgcmVzb3VyY2UuIik7cmV0dXJuIEl0KHRoaXMsZSl9fTt9KSksVmU9VCgoKCk9Pnt3ZSgpLFI9djt9KSksWWU9VCgoKCk9PntqZSgpLHZ0PShlLHQpPT57KHR5cGVvZiBfLnRyYWNlPiJ1Ij8hXy53YXNtLnRyYWNlOiFfLnRyYWNlKXx8Y29uc29sZS50aW1lU3RhbXAoYCR7ZX06Ok9SVDo6JHt0fWApO30sQnQ9KGUsdCk9PntsZXQgcj0obmV3IEVycm9yKS5zdGFjaz8uc3BsaXQoL1xyXG58XHJ8XG4vZyl8fFtdLG49ITE7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspe2lmKG4mJiFyW29dLmluY2x1ZGVzKCJUUkFDRV9GVU5DIikpe2xldCBuPWBGVU5DXyR7ZX06OiR7cltvXS50cmltKCkuc3BsaXQoIiAiKVsxXX1gO3JldHVybiB0JiYobis9YDo6JHt0fWApLHZvaWQgdnQoIkNQVSIsbil9cltvXS5pbmNsdWRlcygiVFJBQ0VfRlVOQyIpJiYobj0hMCk7fX0sVj1lPT57KHR5cGVvZiBfLnRyYWNlPiJ1Ij8hXy53YXNtLnRyYWNlOiFfLnRyYWNlKXx8QnQoIkJFR0lOIixlKTt9LFk9ZT0+eyh0eXBlb2YgXy50cmFjZT4idSI/IV8ud2FzbS50cmFjZTohXy50cmFjZSl8fEJ0KCJFTkQiLGUpO307fSkpLEN0PVQoKCgpPT57emUoKSxWZSgpLFllKCkseWU9Y2xhc3MgZXtjb25zdHJ1Y3RvcihlKXt0aGlzLmhhbmRsZXI9ZTt9YXN5bmMgcnVuKGUsdCxyKXtWKCk7bGV0IG49e30sbz17fTtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lfHxlIGluc3RhbmNlb2YgUnx8QXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmVlZHMnIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgdXNlIGlucHV0IG5hbWVzIGFzIGtleXMgYW5kIE9ubnhWYWx1ZSBhcyBjb3JyZXNwb25kaW5nIHZhbHVlcy4iKTtsZXQgYT0hMDtpZigib2JqZWN0Ij09dHlwZW9mIHQpe2lmKG51bGw9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMV06IGNhbm5vdCBiZSBudWxsLiIpO2lmKHQgaW5zdGFuY2VvZiBSKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYSBUZW5zb3IiKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4iKTthPSExO2ZvcihsZXQgZSBvZiB0KXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIG11c3QgYmUgYSBzdHJpbmcgYXJyYXkgb3IgYW4gb2JqZWN0LiIpO2lmKC0xPT09dGhpcy5vdXRwdXROYW1lcy5pbmRleE9mKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKGAnZmV0Y2hlcycgY29udGFpbnMgaW52YWxpZCBvdXRwdXQgbmFtZTogJHtlfS5gKTtuW2VdPW51bGw7fWlmKCJvYmplY3QiPT10eXBlb2YgciYmbnVsbCE9PXIpbz1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtsZXQgZT0hMSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2ZvcihsZXQgciBvZiB0aGlzLm91dHB1dE5hbWVzKWlmKC0xIT09aS5pbmRleE9mKHIpKXtsZXQgbz10W3JdOyhudWxsPT09b3x8byBpbnN0YW5jZW9mIFIpJiYoZT0hMCxhPSExLG5bcl09byk7fWlmKGUpe2lmKCJvYmplY3QiPT10eXBlb2YgciYmbnVsbCE9PXIpbz1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIG89dDt9fWVsc2UgaWYodHlwZW9mIHQ8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMV06IG11c3QgYmUgJ2ZldGNoZXMnIG9yICdvcHRpb25zJy4iKTtmb3IobGV0IHQgb2YgdGhpcy5pbnB1dE5hbWVzKWlmKHR5cGVvZiBlW3RdPiJ1Iil0aHJvdyBuZXcgRXJyb3IoYGlucHV0ICcke3R9JyBpcyBtaXNzaW5nIGluICdmZWVkcycuYCk7aWYoYSlmb3IobGV0IGUgb2YgdGhpcy5vdXRwdXROYW1lcyluW2VdPW51bGw7bGV0IGk9YXdhaXQgdGhpcy5oYW5kbGVyLnJ1bihlLG4sbykscz17fTtmb3IobGV0IGUgaW4gaSlpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChpLGUpKXtsZXQgdD1pW2VdO3NbZV09dCBpbnN0YW5jZW9mIFI/dDpuZXcgUih0LnR5cGUsdC5kYXRhLHQuZGltcyk7fXJldHVybiBZKCksc31hc3luYyByZWxlYXNlKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5kaXNwb3NlKCl9c3RhdGljIGFzeW5jIGNyZWF0ZSh0LHIsbixvKXtWKCk7bGV0IGEsaT17fTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKGE9dCwib2JqZWN0Ij09dHlwZW9mIHImJm51bGwhPT1yKWk9cjtlbHNlIGlmKHR5cGVvZiByPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIil9ZWxzZSBpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSl7aWYoYT10LCJvYmplY3QiPT10eXBlb2YgciYmbnVsbCE9PXIpaT1yO2Vsc2UgaWYodHlwZW9mIHI8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtpZighKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzBdOiBtdXN0IGJlICdwYXRoJyBvciAnYnVmZmVyJy4iKTt7bGV0IGU9dCxzPTAsbD10LmJ5dGVMZW5ndGg7aWYoIm9iamVjdCI9PXR5cGVvZiByJiZudWxsIT09cilpPXI7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIHIpe2lmKHM9ciwhTnVtYmVyLmlzU2FmZUludGVnZXIocykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidieXRlT2Zmc2V0JyBtdXN0IGJlIGFuIGludGVnZXIuIik7aWYoczwwfHxzPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdieXRlT2Zmc2V0JyBpcyBvdXQgb2YgcmFuZ2UgWzAsICR7ZS5ieXRlTGVuZ3RofSkuYCk7aWYobD10LmJ5dGVMZW5ndGgtcywibnVtYmVyIj09dHlwZW9mIG4pe2lmKGw9biwhTnVtYmVyLmlzU2FmZUludGVnZXIobCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidieXRlTGVuZ3RoJyBtdXN0IGJlIGFuIGludGVnZXIuIik7aWYobDw9MHx8cytsPmUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVMZW5ndGgnIGlzIG91dCBvZiByYW5nZSAoMCwgJHtlLmJ5dGVMZW5ndGgtc31dLmApO2lmKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9PW8paT1vO2Vsc2UgaWYodHlwZW9mIG88InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHR5cGVvZiBuPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInYnl0ZUxlbmd0aCcgbXVzdCBiZSBhIG51bWJlci4iKX1lbHNlIGlmKHR5cGVvZiByPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIik7YT1uZXcgVWludDhBcnJheShlLHMsbCk7fX1sZXRbcyxsXT1hd2FpdCB1dChpKSx1PWF3YWl0IHMuY3JlYXRlSW5mZXJlbmNlU2Vzc2lvbkhhbmRsZXIoYSxsKTtyZXR1cm4gWSgpLG5ldyBlKHUpfXN0YXJ0UHJvZmlsaW5nKCl7dGhpcy5oYW5kbGVyLnN0YXJ0UHJvZmlsaW5nKCk7fWVuZFByb2ZpbGluZygpe3RoaXMuaGFuZGxlci5lbmRQcm9maWxpbmcoKTt9Z2V0IGlucHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5oYW5kbGVyLmlucHV0TmFtZXN9Z2V0IG91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5vdXRwdXROYW1lc319O30pKSxVdD1UKCgoKT0+e0N0KCksT3I9eWU7fSkpLF90PVQoKCgpPT57fSkpLE10PVQoKCgpPT57fSkpLER0PVQoKCgpPT57fSkpLFJ0PVQoKCgpPT57fSkpLHFlPXt9O0dlKHFlLHtJbmZlcmVuY2VTZXNzaW9uOigpPT5PcixUUkFDRTooKT0+dnQsVFJBQ0VfRlVOQ19CRUdJTjooKT0+VixUUkFDRV9GVU5DX0VORDooKT0+WSxUZW5zb3I6KCk9PlIsZW52OigpPT5BLHJlZ2lzdGVyQmFja2VuZDooKT0+aWV9KTt2YXIgcT1UKCgoKT0+e2Z0KCkscHQoKSxVdCgpLFZlKCksX3QoKSxNdCgpLFllKCksRHQoKSxSdCgpO30pKSxiZT1UKCgoKT0+e30pKSxXdD17fTtHZShXdCx7ZGVmYXVsdDooKT0+eHJ9KTt2YXIga3QsTnQseHIsanQsTSxQZSxYZSxJcixQcixIdCx2cixHdCxWdCx6dCxZdCxaZSxLZSx2ZSxxdCxCcixDcixFZSx4LEwsZmUsUyxKdCxVcixfcixNcixEcixadCxlZSxRdCx0ZSxlcix0cixDZSxVZSxycixjZSxScixUZSxTZSxyZSxGcix1ZSxBZSxPZSxucix4ZSxMZSxJZSxaLEQsbGUsTWUsRGUsX2UsdHQscnQsbmUsb2UsTnIsb3Isc3IsaXIsYXIsdXIsZnIsY3IsbHIsV3IsUmUsJHQ9VCgoKCk9PntKZSgpLEooKSxnZSgpLGt0PSJvcnQtd2FzbS1wcm94eS13b3JrZXIiLChOdD1nbG9iYWxUaGlzLnNlbGY/Lm5hbWU9PT1rdCkmJihzZWxmLm9ubWVzc2FnZT1lPT57bGV0e3R5cGU6dCxpbjpyfT1lLmRhdGE7dHJ5e3N3aXRjaCh0KXtjYXNlImluaXQtd2FzbSI6RWUoci53YXNtKS50aGVuKCgoKT0+e1RlKHIpLnRoZW4oKCgpPT57cG9zdE1lc3NhZ2Uoe3R5cGU6dH0pO30pLChlPT57cG9zdE1lc3NhZ2Uoe3R5cGU6dCxlcnI6ZX0pO30pKTt9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsZXJyOmV9KTt9KSk7YnJlYWs7Y2FzZSJpbml0LWVwIjp7bGV0e2VwTmFtZTplLGVudjpufT1yO1NlKG4sZSkudGhlbigoKCk9Pntwb3N0TWVzc2FnZSh7dHlwZTp0fSk7fSksKGU9Pntwb3N0TWVzc2FnZSh7dHlwZTp0LGVycjplfSk7fSkpO2JyZWFrfWNhc2UiY29weS1mcm9tIjp7bGV0e2J1ZmZlcjplfT1yLG49dWUoZSk7cG9zdE1lc3NhZ2Uoe3R5cGU6dCxvdXQ6bn0pO2JyZWFrfWNhc2UiY3JlYXRlIjp7bGV0e21vZGVsOmUsb3B0aW9uczpufT1yO0FlKGUsbikudGhlbigoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsb3V0OmV9KTt9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsZXJyOmV9KTt9KSk7YnJlYWt9Y2FzZSJyZWxlYXNlIjpPZShyKSxwb3N0TWVzc2FnZSh7dHlwZTp0fSk7YnJlYWs7Y2FzZSJydW4iOntsZXR7c2Vzc2lvbklkOmUsaW5wdXRJbmRpY2VzOm4saW5wdXRzOm8sb3V0cHV0SW5kaWNlczphLG9wdGlvbnM6aX09cjt4ZShlLG4sbyxhLG5ldyBBcnJheShhLmxlbmd0aCkuZmlsbChudWxsKSxpKS50aGVuKChlPT57ZS5zb21lKChlPT4iY3B1IiE9PWVbM10pKT9wb3N0TWVzc2FnZSh7dHlwZTp0LGVycjoiUHJveHkgZG9lcyBub3Qgc3VwcG9ydCBub24tY3B1IHRlbnNvciBsb2NhdGlvbi4ifSk6cG9zdE1lc3NhZ2Uoe3R5cGU6dCxvdXQ6ZX0sSWUoWy4uLm8sLi4uZV0pKTt9KSwoZT0+e3Bvc3RNZXNzYWdlKHt0eXBlOnQsZXJyOmV9KTt9KSk7YnJlYWt9Y2FzZSJlbmQtcHJvZmlsaW5nIjpMZShyKSxwb3N0TWVzc2FnZSh7dHlwZTp0fSk7fX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZTp0LGVycjplfSk7fX0pLHhyPU50P251bGw6ZT0+bmV3IFdvcmtlcihlPz9NLHt0eXBlOiJtb2R1bGUiLG5hbWU6a3R9KTt9KSksZ2U9VCgoKCk9PntiZSgpLGp0PXR5cGVvZiBsb2NhdGlvbj4idSI/dm9pZCAwOmxvY2F0aW9uLm9yaWdpbixNPSgoKT0+aW1wb3J0Lm1ldGEudXJsPy5zdGFydHNXaXRoKCJmaWxlOiIpP25ldyBVUkwobmV3IFVSTCgib3J0Lndhc20uYnVuZGxlLm1pbi5tanMiLGltcG9ydC5tZXRhLnVybCkuaHJlZixqdCkuaHJlZjppbXBvcnQubWV0YS51cmwpKCksUGU9KCk9PntpZihNJiYhTS5zdGFydHNXaXRoKCJibG9iOiIpKXJldHVybiBNLnN1YnN0cmluZygwLE0ubGFzdEluZGV4T2YoIi8iKSsxKX0sWGU9KGUsdCk9Pnt0cnl7bGV0IHI9dD8/TTtyZXR1cm4gKHI/bmV3IFVSTChlLHIpOm5ldyBVUkwoZSkpLm9yaWdpbj09PWp0fWNhdGNoe3JldHVybiAhMX19LElyPShlLHQpPT57bGV0IHI9dD8/TTt0cnl7cmV0dXJuIChyP25ldyBVUkwoZSxyKTpuZXcgVVJMKGUpKS5ocmVmfWNhdGNoe3JldHVybn19LFByPShlLHQpPT5gJHt0Pz8iLi8ifSR7ZX1gLEh0PWFzeW5jIGU9PntsZXQgdD1hd2FpdChhd2FpdCBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkpLmJsb2IoKTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTCh0KX0sdnI9YXN5bmMgZT0+KGF3YWl0IGltcG9ydChlKSkuZGVmYXVsdCxHdD0oJHQoKSxhdChXdCkpLmRlZmF1bHQsVnQ9YXN5bmMoKT0+e2lmKCFNKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGxvYWQgcHJveHkgd29ya2VyOiBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBzY3JpcHQgc291cmNlIFVSTC4iKTtpZihYZShNKSlyZXR1cm4gW3ZvaWQgMCxHdCgpXTtsZXQgZT1hd2FpdCBIdChNKTtyZXR1cm4gW2UsR3QoZSldfSx6dD12b2lkIDAsWXQ9YXN5bmMoZSx0LHIpPT57aWYoIWUmJiF0JiZ6dCYmTSYmWGUoTSkpcmV0dXJuIFt2b2lkIDAsenRdO3tsZXQgbj0ib3J0LXdhc20tc2ltZC10aHJlYWRlZC5tanMiLG89ZT8/SXIobix0KSxhPXImJm8mJiFYZShvLHQpLGk9YT9hd2FpdCBIdChvKTpvPz9QcihuLHQpO3JldHVybiBbYT9pOnZvaWQgMCxhd2FpdCB2cihpKV19fTt9KSksSj1UKCgoKT0+e2dlKCksS2U9ITEsdmU9ITEscXQ9ITEsQnI9KCk9PntpZih0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI+InUiKXJldHVybiAhMTt0cnl7cmV0dXJuIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSImJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKX1jYXRjaHtyZXR1cm4gITF9fSxDcj0oKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2h7cmV0dXJuICExfX0sRWU9YXN5bmMgZT0+e2lmKEtlKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTtpZih2ZSl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvICdpbml0aWFsaXplV2ViQXNzZW1ibHkoKScgZGV0ZWN0ZWQuIik7aWYocXQpdGhyb3cgbmV3IEVycm9yKCJwcmV2aW91cyBjYWxsIHRvICdpbml0aWFsaXplV2ViQXNzZW1ibHkoKScgZmFpbGVkLiIpO3ZlPSEwO2xldCB0PWUuaW5pdFRpbWVvdXQscj1lLm51bVRocmVhZHM7aWYoIUNyKCkpdGhyb3cgbmV3IEVycm9yKCJXZWJBc3NlbWJseSBTSU1EIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIik7bGV0IG49QnIoKTtyPjEmJiFuJiYodHlwZW9mIHNlbGY8InUiJiYhc2VsZi5jcm9zc09yaWdpbklzb2xhdGVkJiZjb25zb2xlLndhcm4oImVudi53YXNtLm51bVRocmVhZHMgaXMgc2V0IHRvICIrcisiLCBidXQgdGhpcyB3aWxsIG5vdCB3b3JrIHVubGVzcyB5b3UgZW5hYmxlIGNyb3NzT3JpZ2luSXNvbGF0ZWQgbW9kZS4gU2VlIGh0dHBzOi8vd2ViLmRldi9jcm9zcy1vcmlnaW4taXNvbGF0aW9uLWd1aWRlLyBmb3IgbW9yZSBpbmZvLiIpLGNvbnNvbGUud2FybigiV2ViQXNzZW1ibHkgbXVsdGktdGhyZWFkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIEZhbGxpbmcgYmFjayB0byBzaW5nbGUtdGhyZWFkaW5nLiIpLGUubnVtVGhyZWFkcz1yPTEpO2xldCBvPWUud2FzbVBhdGhzLGE9InN0cmluZyI9PXR5cGVvZiBvP286dm9pZCAwLGk9bz8ubWpzLHM9aT8uaHJlZj8/aSxsPW8/Lndhc20sdT1sPy5ocmVmPz9sLGY9ZS53YXNtQmluYXJ5LFtkLHBdPWF3YWl0IFl0KHMsYSxyPjEpLGM9ITEsaD1bXTtpZih0PjAmJmgucHVzaChuZXcgUHJvbWlzZSgoZT0+e3NldFRpbWVvdXQoKCgpPT57Yz0hMCxlKCk7fSksdCk7fSkpKSxoLnB1c2gobmV3IFByb21pc2UoKChlLHQpPT57bGV0IG49e251bVRocmVhZHM6cn07aWYoZiluLndhc21CaW5hcnk9ZjtlbHNlIGlmKHV8fGEpbi5sb2NhdGVGaWxlPWU9PnU/P2ErZTtlbHNlIGlmKHMmJjAhPT1zLmluZGV4T2YoImJsb2I6Iikpbi5sb2NhdGVGaWxlPWU9Pm5ldyBVUkwoZSxzKS5ocmVmO2Vsc2UgaWYoZCl7bGV0IGU9UGUoKTtlJiYobi5sb2NhdGVGaWxlPXQ9PmUrdCk7fXAobikudGhlbigodD0+e3ZlPSExLEtlPSEwLFplPXQsZSgpLGQmJlVSTC5yZXZva2VPYmplY3RVUkwoZCk7fSksKGU9Pnt2ZT0hMSxxdD0hMCx0KGUpO30pKTt9KSkpLGF3YWl0IFByb21pc2UucmFjZShoKSxjKXRocm93IG5ldyBFcnJvcihgV2ViQXNzZW1ibHkgYmFja2VuZCBpbml0aWFsaXppbmcgZmFpbGVkIGR1ZSB0byB0aW1lb3V0OiAke3R9bXNgKX0seD0oKT0+e2lmKEtlJiZaZSlyZXR1cm4gWmU7dGhyb3cgbmV3IEVycm9yKCJXZWJBc3NlbWJseSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiIpfTt9KSksQmU9VCgoKCk9PntKKCksTD0oZSx0KT0+e2xldCByPXgoKSxuPXIubGVuZ3RoQnl0ZXNVVEY4KGUpKzEsbz1yLl9tYWxsb2Mobik7cmV0dXJuIHIuc3RyaW5nVG9VVEY4KGUsbyxuKSx0LnB1c2gobyksb30sZmU9KGUsdCxyLG4pPT57aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7aWYoci5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO3IuYWRkKGUpO31PYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2Usb10pPT57bGV0IGE9dD90K2U6ZTtpZigib2JqZWN0Ij09dHlwZW9mIG8pZmUobyxhKyIuIixyLG4pO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBvfHwibnVtYmVyIj09dHlwZW9mIG8pbihhLG8udG9TdHJpbmcoKSk7ZWxzZSB7aWYoImJvb2xlYW4iIT10eXBlb2Ygbyl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogIit0eXBlb2Ygbyk7bihhLG8/IjEiOiIwIik7fX0pKTt9LFM9ZT0+e2xldCB0PXgoKSxyPXQuc3RhY2tTYXZlKCk7dHJ5e2xldCByPXQuUFRSX1NJWkUsbj10LnN0YWNrQWxsb2MoMipyKTt0Ll9PcnRHZXRMYXN0RXJyb3IobixuK3IpO2xldCBvPU51bWJlcih0LmdldFZhbHVlKG4sND09PXI/ImkzMiI6Imk2NCIpKSxhPXQuZ2V0VmFsdWUobityLCIqIiksaT1hP3QuVVRGOFRvU3RyaW5nKGEpOiIiO3Rocm93IG5ldyBFcnJvcihgJHtlfSBFUlJPUl9DT0RFOiAke299LCBFUlJPUl9NRVNTQUdFOiAke2l9YCl9ZmluYWxseXt0LnN0YWNrUmVzdG9yZShyKTt9fTt9KSksWHQ9VCgoKCk9PntKKCksQmUoKSxKdD1lPT57bGV0IHQ9eCgpLHI9MCxuPVtdLG89ZXx8e307dHJ5e2lmKHZvaWQgMD09PWU/LmxvZ1NldmVyaXR5TGV2ZWwpby5sb2dTZXZlcml0eUxldmVsPTI7ZWxzZSBpZigibnVtYmVyIiE9dHlwZW9mIGUubG9nU2V2ZXJpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dTZXZlcml0eUxldmVsKXx8ZS5sb2dTZXZlcml0eUxldmVsPDB8fGUubG9nU2V2ZXJpdHlMZXZlbD40KXRocm93IG5ldyBFcnJvcihgbG9nIHNlcnZlcml0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7ZS5sb2dTZXZlcml0eUxldmVsfWApO2lmKHZvaWQgMD09PWU/LmxvZ1ZlcmJvc2l0eUxldmVsKW8ubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PWU/LnRlcm1pbmF0ZSYmKG8udGVybWluYXRlPSExKTtsZXQgYT0wO3JldHVybiB2b2lkIDAhPT1lPy50YWcmJihhPUwoZS50YWcsbikpLHI9dC5fT3J0Q3JlYXRlUnVuT3B0aW9ucyhvLmxvZ1NldmVyaXR5TGV2ZWwsby5sb2dWZXJib3NpdHlMZXZlbCwhIW8udGVybWluYXRlLGEpLDA9PT1yJiZTKCJDYW4ndCBjcmVhdGUgcnVuIG9wdGlvbnMuIiksdm9pZCAwIT09ZT8uZXh0cmEmJmZlKGUuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKChlLG8pPT57bGV0IGE9TChlLG4pLGk9TChvLG4pOzAhPT10Ll9PcnRBZGRSdW5Db25maWdFbnRyeShyLGEsaSkmJlMoYENhbid0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7ZX0gLSAke299LmApO30pKSxbcixuXX1jYXRjaChlKXt0aHJvdyAwIT09ciYmdC5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMociksbi5mb3JFYWNoKChlPT50Ll9mcmVlKGUpKSksZX19O30pKSxLdD1UKCgoKT0+e0ooKSxCZSgpLFVyPWU9Pntzd2l0Y2goZSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2V9YCl9fSxfcj1lPT57c3dpdGNoKGUpe2Nhc2Uic2VxdWVudGlhbCI6cmV0dXJuIDA7Y2FzZSJwYXJhbGxlbCI6cmV0dXJuIDE7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGV4ZWN1dGlvbiBtb2RlOiAke2V9YCl9fSxNcj1lPT57ZS5leHRyYXx8KGUuZXh0cmE9e30pLGUuZXh0cmEuc2Vzc2lvbnx8KGUuZXh0cmEuc2Vzc2lvbj17fSk7bGV0IHQ9ZS5leHRyYS5zZXNzaW9uO3QudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KHQudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGUuZXhlY3V0aW9uUHJvdmlkZXJzJiZlLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKChlPT4id2ViZ3B1Ij09PSgic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSkmJihlLmVuYWJsZU1lbVBhdHRlcm49ITEpO30sRHI9KGUsdCxyKT0+e2ZvcihsZXQgbiBvZiB0KXtsZXQgdD0ic3RyaW5nIj09dHlwZW9mIG4/bjpuLm5hbWU7c3dpdGNoKHQpe2Nhc2Uid2Vibm4iOmlmKHQ9IldFQk5OIiwic3RyaW5nIiE9dHlwZW9mIG4pe2xldCB0PW4/LmRldmljZVR5cGU7aWYodCl7bGV0IG49TCgiZGV2aWNlVHlwZSIsciksbz1MKHQscik7MCE9PXgoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsbixvKSYmUyhgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdkZXZpY2VUeXBlJyAtICR7dH0uYCk7fX1icmVhaztjYXNlIndlYmdwdSI6aWYodD0iSlMiLCJzdHJpbmciIT10eXBlb2Ygbil7bGV0IHQ9bjtpZih0Py5wcmVmZXJyZWRMYXlvdXQpe2lmKCJOQ0hXIiE9PXQucHJlZmVycmVkTGF5b3V0JiYiTkhXQyIhPT10LnByZWZlcnJlZExheW91dCl0aHJvdyBuZXcgRXJyb3IoYHByZWZlcnJlZExheW91dCBtdXN0IGJlIGVpdGhlciAnTkNIVycgb3IgJ05IV0MnOiAke3QucHJlZmVycmVkTGF5b3V0fWApO2xldCBuPUwoInByZWZlcnJlZExheW91dCIsciksbz1MKHQucHJlZmVycmVkTGF5b3V0LHIpOzAhPT14KCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShlLG4sbykmJlMoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAncHJlZmVycmVkTGF5b3V0JyAtICR7dC5wcmVmZXJyZWRMYXlvdXR9LmApO319YnJlYWs7Y2FzZSJ3YXNtIjpjYXNlImNwdSI6Y29udGludWU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYG5vdCBzdXBwb3J0ZWQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9YCl9bGV0IG89TCh0LHIpOzAhPT14KCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKGUsbykmJlMoYENhbid0IGFwcGVuZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7dH0uYCk7fX0sWnQ9ZT0+e2xldCB0PXgoKSxyPTAsbj1bXSxvPWV8fHt9O01yKG8pO3RyeXtsZXQgZT1VcihvLmdyYXBoT3B0aW1pemF0aW9uTGV2ZWw/PyJhbGwiKSxhPV9yKG8uZXhlY3V0aW9uTW9kZT8/InNlcXVlbnRpYWwiKSxpPSJzdHJpbmciPT10eXBlb2Ygby5sb2dJZD9MKG8ubG9nSWQsbik6MCxzPW8ubG9nU2V2ZXJpdHlMZXZlbD8/MjtpZighTnVtYmVyLmlzSW50ZWdlcihzKXx8czwwfHxzPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtzfWApO2xldCBsPW8ubG9nVmVyYm9zaXR5TGV2ZWw/PzA7aWYoIU51bWJlci5pc0ludGVnZXIobCl8fGw8MHx8bD40KXRocm93IG5ldyBFcnJvcihgbG9nIHZlcmJvc2l0eSBsZXZlbCBpcyBub3QgdmFsaWQ6ICR7bH1gKTtsZXQgdT0ic3RyaW5nIj09dHlwZW9mIG8ub3B0aW1pemVkTW9kZWxGaWxlUGF0aD9MKG8ub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxuKTowO2lmKHI9dC5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMoZSwhIW8uZW5hYmxlQ3B1TWVtQXJlbmEsISFvLmVuYWJsZU1lbVBhdHRlcm4sYSwhIW8uZW5hYmxlUHJvZmlsaW5nLDAsaSxzLGwsdSksMD09PXImJlMoIkNhbid0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMuIiksby5leGVjdXRpb25Qcm92aWRlcnMmJkRyKHIsby5leGVjdXRpb25Qcm92aWRlcnMsbiksdm9pZCAwIT09by5lbmFibGVHcmFwaENhcHR1cmUpe2lmKCJib29sZWFuIiE9dHlwZW9mIG8uZW5hYmxlR3JhcGhDYXB0dXJlKXRocm93IG5ldyBFcnJvcihgZW5hYmxlR3JhcGhDYXB0dXJlIG11c3QgYmUgYSBib29sZWFuIHZhbHVlOiAke28uZW5hYmxlR3JhcGhDYXB0dXJlfWApO2xldCBlPUwoImVuYWJsZUdyYXBoQ2FwdHVyZSIsbiksYT1MKG8uZW5hYmxlR3JhcGhDYXB0dXJlLnRvU3RyaW5nKCksbik7MCE9PXQuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShyLGUsYSkmJlMoYENhbid0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiAnZW5hYmxlR3JhcGhDYXB0dXJlJyAtICR7by5lbmFibGVHcmFwaENhcHR1cmV9LmApO31pZihvLmZyZWVEaW1lbnNpb25PdmVycmlkZXMpZm9yKGxldFtlLGFdb2YgT2JqZWN0LmVudHJpZXMoby5mcmVlRGltZW5zaW9uT3ZlcnJpZGVzKSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcihgZnJlZSBkaW1lbnNpb24gb3ZlcnJpZGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOiAke2V9YCk7aWYoIm51bWJlciIhPXR5cGVvZiBhfHwhTnVtYmVyLmlzSW50ZWdlcihhKXx8YTwwKXRocm93IG5ldyBFcnJvcihgZnJlZSBkaW1lbnNpb24gb3ZlcnJpZGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyOiAke2F9YCk7bGV0IG89TChlLG4pOzAhPT10Ll9PcnRBZGRGcmVlRGltZW5zaW9uT3ZlcnJpZGUocixvLGEpJiZTKGBDYW4ndCBzZXQgYSBmcmVlIGRpbWVuc2lvbiBvdmVycmlkZTogJHtlfSAtICR7YX0uYCk7fXJldHVybiB2b2lkIDAhPT1vLmV4dHJhJiZmZShvLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSxvKT0+e2xldCBhPUwoZSxuKSxpPUwobyxuKTswIT09dC5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KHIsYSxpKSYmUyhgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7ZX0gLSAke299LmApO30pKSxbcixuXX1jYXRjaChlKXt0aHJvdyAwIT09ciYmMCE9PXQuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyhyKSYmUygiQ2FuJ3QgcmVsZWFzZSBzZXNzaW9uIG9wdGlvbnMuIiksbi5mb3JFYWNoKChlPT50Ll9mcmVlKGUpKSksZX19O30pKSxRZT1UKCgoKT0+e2VlPWU9Pntzd2l0Y2goZSl7Y2FzZSJpbnQ4IjpyZXR1cm4gMztjYXNlInVpbnQ4IjpyZXR1cm4gMjtjYXNlImJvb2wiOnJldHVybiA5O2Nhc2UiaW50MTYiOnJldHVybiA1O2Nhc2UidWludDE2IjpyZXR1cm4gNDtjYXNlImludDMyIjpyZXR1cm4gNjtjYXNlInVpbnQzMiI6cmV0dXJuIDEyO2Nhc2UiZmxvYXQxNiI6cmV0dXJuIDEwO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIDE7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gMTE7Y2FzZSJzdHJpbmciOnJldHVybiA4O2Nhc2UiaW50NjQiOnJldHVybiA3O2Nhc2UidWludDY0IjpyZXR1cm4gMTM7Y2FzZSJpbnQ0IjpyZXR1cm4gMjI7Y2FzZSJ1aW50NCI6cmV0dXJuIDIxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LFF0PWU9Pntzd2l0Y2goZSl7Y2FzZSAzOnJldHVybiAiaW50OCI7Y2FzZSAyOnJldHVybiAidWludDgiO2Nhc2UgOTpyZXR1cm4gImJvb2wiO2Nhc2UgNTpyZXR1cm4gImludDE2IjtjYXNlIDQ6cmV0dXJuICJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4gImludDMyIjtjYXNlIDEyOnJldHVybiAidWludDMyIjtjYXNlIDEwOnJldHVybiAiZmxvYXQxNiI7Y2FzZSAxOnJldHVybiAiZmxvYXQzMiI7Y2FzZSAxMTpyZXR1cm4gImZsb2F0NjQiO2Nhc2UgODpyZXR1cm4gInN0cmluZyI7Y2FzZSA3OnJldHVybiAiaW50NjQiO2Nhc2UgMTM6cmV0dXJuICJ1aW50NjQiO2Nhc2UgMjI6cmV0dXJuICJpbnQ0IjtjYXNlIDIxOnJldHVybiAidWludDQiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LHRlPShlLHQpPT57bGV0IHI9Wy0xLDQsMSwxLDIsMiw0LDgsLTEsMSwyLDgsNCw4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC41LC41XVtlXSxuPSJudW1iZXIiPT10eXBlb2YgdD90OnQucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKTtyZXR1cm4gcj4wP01hdGguY2VpbChuKnIpOnZvaWQgMH0sZXI9ZT0+e3N3aXRjaChlKXtjYXNlImZsb2F0MTYiOnJldHVybiB0eXBlb2YgRmxvYXQxNkFycmF5PCJ1IiYmRmxvYXQxNkFycmF5LmZyb20/RmxvYXQxNkFycmF5OlVpbnQxNkFycmF5O2Nhc2UiZmxvYXQzMiI6cmV0dXJuIEZsb2F0MzJBcnJheTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiaW50OCI6cmV0dXJuIEludDhBcnJheTtjYXNlInVpbnQxNiI6cmV0dXJuIFVpbnQxNkFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7ZX1gKX19LHRyPWU9Pntzd2l0Y2goZSl7Y2FzZSJ2ZXJib3NlIjpyZXR1cm4gMDtjYXNlImluZm8iOnJldHVybiAxO2Nhc2Uid2FybmluZyI6cmV0dXJuIDI7Y2FzZSJlcnJvciI6cmV0dXJuIDM7Y2FzZSJmYXRhbCI6cmV0dXJuIDQ7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGxvZ2dpbmcgbGV2ZWw6ICR7ZX1gKX19LENlPWU9PiJmbG9hdDMyIj09PWV8fCJmbG9hdDE2Ij09PWV8fCJpbnQzMiI9PT1lfHwiaW50NjQiPT09ZXx8InVpbnQzMiI9PT1lfHwidWludDgiPT09ZXx8ImJvb2wiPT09ZXx8InVpbnQ0Ij09PWV8fCJpbnQ0Ij09PWUsVWU9ZT0+ImZsb2F0MzIiPT09ZXx8ImZsb2F0MTYiPT09ZXx8ImludDMyIj09PWV8fCJpbnQ2NCI9PT1lfHwidWludDMyIj09PWV8fCJ1aW50NjQiPT09ZXx8ImludDgiPT09ZXx8InVpbnQ4Ij09PWV8fCJib29sIj09PWV8fCJ1aW50NCI9PT1lfHwiaW50NCI9PT1lLHJyPWU9Pntzd2l0Y2goZSl7Y2FzZSJub25lIjpyZXR1cm4gMDtjYXNlImNwdSI6cmV0dXJuIDE7Y2FzZSJjcHUtcGlubmVkIjpyZXR1cm4gMjtjYXNlInRleHR1cmUiOnJldHVybiAzO2Nhc2UiZ3B1LWJ1ZmZlciI6cmV0dXJuIDQ7Y2FzZSJtbC10ZW5zb3IiOnJldHVybiA1O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIGxvY2F0aW9uOiAke2V9YCl9fTt9KSksZXQ9VCgoKCk9PntiZSgpLGNlPWFzeW5jIGU9PntpZigic3RyaW5nIj09dHlwZW9mIGUpe3tsZXQgdD1hd2FpdCBmZXRjaChlKTtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkIGV4dGVybmFsIGRhdGEgZmlsZTogJHtlfWApO2xldCByPXQuaGVhZGVycy5nZXQoIkNvbnRlbnQtTGVuZ3RoIiksbj1yP3BhcnNlSW50KHIsMTApOjA7aWYobjwxMDczNzQxODI0KXJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0LmFycmF5QnVmZmVyKCkpO3tpZighdC5ib2R5KXRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIGxvYWQgZXh0ZXJuYWwgZGF0YSBmaWxlOiAke2V9LCBubyByZXNwb25zZSBib2R5LmApO2xldCByLG89dC5ib2R5LmdldFJlYWRlcigpO3RyeXtyPW5ldyBBcnJheUJ1ZmZlcihuKTt9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgZTt7bGV0IGU9TWF0aC5jZWlsKG4vNjU1MzYpO3I9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDplLG1heGltdW06ZX0pLmJ1ZmZlcjt9fWxldCBhPTA7Zm9yKDs7KXtsZXR7ZG9uZTplLHZhbHVlOnR9PWF3YWl0IG8ucmVhZCgpO2lmKGUpYnJlYWs7bGV0IG49dC5ieXRlTGVuZ3RoO25ldyBVaW50OEFycmF5KHIsYSxuKS5zZXQodCksYSs9bjt9cmV0dXJuIG5ldyBVaW50OEFycmF5KHIsMCxuKX19fXJldHVybiBlIGluc3RhbmNlb2YgQmxvYj9uZXcgVWludDhBcnJheShhd2FpdCBlLmFycmF5QnVmZmVyKCkpOmUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6bmV3IFVpbnQ4QXJyYXkoZSl9O30pKSxKZT1UKCgoKT0+e1h0KCksS3QoKSxRZSgpLEooKSxCZSgpLGV0KCksUnI9KGUsdCk9PnswIT09eCgpLl9PcnRJbml0KGUsdCkmJlMoIkNhbid0IGluaXRpYWxpemUgb25ueHJ1bnRpbWUuIik7fSxUZT1hc3luYyBlPT57UnIoZS53YXNtLm51bVRocmVhZHMsdHIoZS5sb2dMZXZlbCkpO30sU2U9YXN5bmMoZSx0KT0+e30scmU9bmV3IE1hcCxGcj1lPT57bGV0IHQ9eCgpLHI9dC5zdGFja1NhdmUoKTt0cnl7bGV0IHI9dC5QVFJfU0laRSxuPXQuc3RhY2tBbGxvYygyKnIpOzAhPT10Ll9PcnRHZXRJbnB1dE91dHB1dENvdW50KGUsbixuK3IpJiZTKCJDYW4ndCBnZXQgc2Vzc2lvbiBpbnB1dC9vdXRwdXQgY291bnQuIik7bGV0IG89ND09PXI/ImkzMiI6Imk2NCI7cmV0dXJuIFtOdW1iZXIodC5nZXRWYWx1ZShuLG8pKSxOdW1iZXIodC5nZXRWYWx1ZShuK3IsbykpXX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKHIpO319LHVlPWU9PntsZXQgdD14KCkscj10Ll9tYWxsb2MoZS5ieXRlTGVuZ3RoKTtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNyZWF0ZSBhIHNlc3Npb24uIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICR7ZS5ieXRlTGVuZ3RofS5gKTtyZXR1cm4gdC5IRUFQVTguc2V0KGUsciksW3IsZS5ieXRlTGVuZ3RoXX0sQWU9YXN5bmMoZSx0KT0+e2xldCByLG4sbz14KCk7QXJyYXkuaXNBcnJheShlKT9bcixuXT1lOmUuYnVmZmVyPT09by5IRUFQVTguYnVmZmVyP1tyLG5dPVtlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoXTpbcixuXT11ZShlKTtsZXQgYT0wLGk9MCxzPVtdLGw9W10sdT1bXTt0cnl7aWYoW2ksc109WnQodCksdD8uZXh0ZXJuYWxEYXRhJiZvLm1vdW50RXh0ZXJuYWxEYXRhKXtsZXQgZT1bXTtmb3IobGV0IHIgb2YgdC5leHRlcm5hbERhdGEpe2xldCB0PSJzdHJpbmciPT10eXBlb2Ygcj9yOnIucGF0aDtlLnB1c2goY2UoInN0cmluZyI9PXR5cGVvZiByP3I6ci5kYXRhKS50aGVuKChlPT57by5tb3VudEV4dGVybmFsRGF0YSh0LGUpO30pKSk7fWF3YWl0IFByb21pc2UuYWxsKGUpO31mb3IobGV0IGUgb2YgdD8uZXhlY3V0aW9uUHJvdmlkZXJzPz9bXSlpZigid2Vibm4iPT09KCJzdHJpbmciPT10eXBlb2YgZT9lOmUubmFtZSkpe2lmKG8uc2hvdWxkVHJhbnNmZXJUb01MVGVuc29yPSExLCJzdHJpbmciIT10eXBlb2YgZSl7bGV0IHQ9ZSxyPXQ/LmNvbnRleHQsbj10Py5ncHVEZXZpY2UsYT10Py5kZXZpY2VUeXBlLGk9dD8ucG93ZXJQcmVmZXJlbmNlO28uY3VycmVudENvbnRleHQ9cnx8KG4/YXdhaXQgby5qc2VwQ3JlYXRlTUxDb250ZXh0KG4pOmF3YWl0IG8uanNlcENyZWF0ZU1MQ29udGV4dCh7ZGV2aWNlVHlwZTphLHBvd2VyUHJlZmVyZW5jZTppfSkpO31lbHNlIG8uY3VycmVudENvbnRleHQ9YXdhaXQgby5qc2VwQ3JlYXRlTUxDb250ZXh0KCk7YnJlYWt9YT1hd2FpdCBvLl9PcnRDcmVhdGVTZXNzaW9uKHIsbixpKSwwPT09YSYmUygiQ2FuJ3QgY3JlYXRlIGEgc2Vzc2lvbi4iKSxvLmpzZXBPbkNyZWF0ZVNlc3Npb24/LigpLG8uY3VycmVudENvbnRleHQmJihvLmpzZXBSZWdpc3Rlck1MQ29udGV4dChhLG8uY3VycmVudENvbnRleHQpLG8uY3VycmVudENvbnRleHQ9dm9pZCAwLG8uc2hvdWxkVHJhbnNmZXJUb01MVGVuc29yPSEwKTtsZXRbZSxmXT1GcihhKSxkPSEhdD8uZW5hYmxlR3JhcGhDYXB0dXJlLHA9W10sYz1bXTtmb3IobGV0IHQ9MDt0PGU7dCsrKXtsZXQgZT1vLl9PcnRHZXRJbnB1dE5hbWUoYSx0KTswPT09ZSYmUygiQ2FuJ3QgZ2V0IGFuIGlucHV0IG5hbWUuIiksbC5wdXNoKGUpLHAucHVzaChvLlVURjhUb1N0cmluZyhlKSk7fWZvcihsZXQgZT0wO2U8ZjtlKyspe2xldCB0PW8uX09ydEdldE91dHB1dE5hbWUoYSxlKTswPT09dCYmUygiQ2FuJ3QgZ2V0IGFuIG91dHB1dCBuYW1lLiIpLHUucHVzaCh0KTtsZXQgcj1vLlVURjhUb1N0cmluZyh0KTtjLnB1c2gocik7fXJldHVybiByZS5zZXQoYSxbYSxsLHUsbnVsbCxkLCExXSksW2EscCxjXX1jYXRjaChlKXt0aHJvdyBsLmZvckVhY2goKGU9Pm8uX09ydEZyZWUoZSkpKSx1LmZvckVhY2goKGU9Pm8uX09ydEZyZWUoZSkpKSwwIT09YSYmMCE9PW8uX09ydFJlbGVhc2VTZXNzaW9uKGEpJiZTKCJDYW4ndCByZWxlYXNlIHNlc3Npb24uIiksZX1maW5hbGx5e28uX2ZyZWUociksMCE9PWkmJjAhPT1vLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMoaSkmJlMoIkNhbid0IHJlbGVhc2Ugc2Vzc2lvbiBvcHRpb25zLiIpLHMuZm9yRWFjaCgoZT0+by5fZnJlZShlKSkpLG8udW5tb3VudEV4dGVybmFsRGF0YT8uKCk7fX0sT2U9ZT0+e2xldCB0PXgoKSxyPXJlLmdldChlKTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWxlYXNlIHNlc3Npb24uIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2xldFtuLG8sYSxpLHNdPXI7aSYmKHMmJjAhPT10Ll9PcnRDbGVhckJvdW5kT3V0cHV0cyhpLmhhbmRsZSkmJlMoIkNhbid0IGNsZWFyIGJvdW5kIG91dHB1dHMuIiksMCE9PXQuX09ydFJlbGVhc2VCaW5kaW5nKGkuaGFuZGxlKSYmUygiQ2FuJ3QgcmVsZWFzZSBJTyBiaW5kaW5nLiIpKSx0LmpzZXBPblJlbGVhc2VTZXNzaW9uPy4oZSksby5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksYS5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksMCE9PXQuX09ydFJlbGVhc2VTZXNzaW9uKG4pJiZTKCJDYW4ndCByZWxlYXNlIHNlc3Npb24uIikscmUuZGVsZXRlKGUpO30sbnI9YXN5bmMoZSx0LHIsbixvLGE9ITEpPT57aWYoIWUpcmV0dXJuIHZvaWQgdC5wdXNoKDApO2xldCBpLHMsbD14KCksdT1sLlBUUl9TSVpFLGY9ZVswXSxkPWVbMV0scD1lWzNdLGM9cDtpZigic3RyaW5nIj09PWYmJigiZ3B1LWJ1ZmZlciI9PT1wfHwibWwtdGVuc29yIj09PXApKXRocm93IG5ldyBFcnJvcigiU3RyaW5nIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkIG9uIEdQVS4iKTtpZihhJiYiZ3B1LWJ1ZmZlciIhPT1wKXRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgYnVmZmVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIGlucHV0L291dHB1dCBpbmRleCAke299IHdoZW4gZW5hYmxlR3JhcGhDYXB0dXJlIGlzIHRydWUuYCk7aWYoImdwdS1idWZmZXIiPT09cCl7bGV0IHQ9ZVsyXS5ncHVCdWZmZXI7cz10ZShlZShmKSxkKTtsZXQgcj1sLmpzZXBSZWdpc3RlckJ1ZmZlcjtpZighcil0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAiZ3B1LWJ1ZmZlciIgaXMgbm90IHN1cHBvcnRlZCB3aXRob3V0IHVzaW5nIFdlYkdQVS4nKTtpPXIobixvLHQscyk7fWVsc2UgaWYoIm1sLXRlbnNvciI9PT1wKXtsZXQgdD1lWzJdLm1sVGVuc29yO3M9dGUoZWUoZiksZCk7bGV0IHI9bC5qc2VwUmVnaXN0ZXJNTFRlbnNvcjtpZighcil0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAibWwtdGVuc29yIiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgdXNpbmcgV2ViTk4uJyk7aT1yKG4sdCxlZShmKSxkKTt9ZWxzZSB7bGV0IHQ9ZVsyXTtpZihBcnJheS5pc0FycmF5KHQpKXtzPXUqdC5sZW5ndGgsaT1sLl9tYWxsb2Mocyksci5wdXNoKGkpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtpZigic3RyaW5nIiE9dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHtlfSBpcyBub3QgYSBzdHJpbmdgKTtsLnNldFZhbHVlKGkrZSp1LEwodFtlXSxyKSwiKiIpO319ZWxzZSB7bGV0IGU9bC5qc2VwSXNHcmFwaElucHV0O2lmKCJzdHJpbmciIT09ZiYmZSl7bGV0IGE9bC5fT3J0R2V0SW5wdXROYW1lKG4sbyk7aWYoZShuLGwuVVRGOFRvU3RyaW5nKGEpKSl7bGV0IGU9ZWUoZik7cz10ZShlLGQpLGM9Im1sLXRlbnNvciI7bGV0IHI9bC5qc2VwQ3JlYXRlVGVtcG9yYXJ5VGVuc29yLG89bC5qc2VwVXBsb2FkVGVuc29yO2lmKCFyfHwhbyl0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAibWwtdGVuc29yIiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgdXNpbmcgV2ViTk4uJyk7bGV0IGE9YXdhaXQgcihuLGUsZCk7byhhLG5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpKSxpPWE7fWVsc2Ugcz10LmJ5dGVMZW5ndGgsaT1sLl9tYWxsb2Mocyksci5wdXNoKGkpLGwuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQscyksaSk7fWVsc2Ugcz10LmJ5dGVMZW5ndGgsaT1sLl9tYWxsb2Mocyksci5wdXNoKGkpLGwuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQscyksaSk7fX1sZXQgaD1sLnN0YWNrU2F2ZSgpLHc9bC5zdGFja0FsbG9jKDQqZC5sZW5ndGgpO3RyeXtkLmZvckVhY2goKChlLHQpPT5sLnNldFZhbHVlKHcrdCp1LGUsND09PXU/ImkzMiI6Imk2NCIpKSk7bGV0IGU9bC5fT3J0Q3JlYXRlVGVuc29yKGVlKGYpLGkscyx3LGQubGVuZ3RoLHJyKGMpKTswPT09ZSYmUyhgQ2FuJ3QgY3JlYXRlIHRlbnNvciBmb3IgaW5wdXQvb3V0cHV0LiBzZXNzaW9uPSR7bn0sIGluZGV4PSR7b30uYCksdC5wdXNoKGUpO31maW5hbGx5e2wuc3RhY2tSZXN0b3JlKGgpO319LHhlPWFzeW5jKGUsdCxyLG4sbyxhKT0+e2xldCBpPXgoKSxzPWkuUFRSX1NJWkUsbD1yZS5nZXQoZSk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcnVuIGluZmVyZW5jZS4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2V9YCk7bGV0IHU9bFswXSxmPWxbMV0sZD1sWzJdLHA9bFszXSxjPWxbNF0saD0obFs1XSx0Lmxlbmd0aCksdz1uLmxlbmd0aCx5PTAsbT1bXSxnPVtdLGI9W10sdj1bXSxFPWkuc3RhY2tTYXZlKCksVD1pLnN0YWNrQWxsb2MoaCpzKSxBPWkuc3RhY2tBbGxvYyhoKnMpLEw9aS5zdGFja0FsbG9jKHcqcyksQz1pLnN0YWNrQWxsb2ModypzKTt0cnl7W3ksbV09SnQoYSk7Zm9yKGxldCBuPTA7bjxoO24rKylhd2FpdCBucihyW25dLGcsdixlLHRbbl0sYyk7Zm9yKGxldCB0PTA7dDx3O3QrKylhd2FpdCBucihvW3RdLGIsdixlLGgrblt0XSxjKTtmb3IobGV0IGU9MDtlPGg7ZSsrKWkuc2V0VmFsdWUoVCtlKnMsZ1tlXSwiKiIpLGkuc2V0VmFsdWUoQStlKnMsZlt0W2VdXSwiKiIpO2ZvcihsZXQgZT0wO2U8dztlKyspaS5zZXRWYWx1ZShMK2UqcyxiW2VdLCIqIiksaS5zZXRWYWx1ZShDK2UqcyxkW25bZV1dLCIqIik7bGV0IGw7aS5qc2VwT25SdW5TdGFydD8uKHUpLGw9YXdhaXQgaS5fT3J0UnVuKHUsQSxULGgsQyx3LEwseSksMCE9PWwmJlMoImZhaWxlZCB0byBjYWxsIE9ydFJ1bigpLiIpO2xldCBFPVtdO2ZvcihsZXQgdD0wO3Q8dzt0Kyspe2xldCByPU51bWJlcihpLmdldFZhbHVlKEwrdCpzLCIqIikpO2lmKHI9PT1iW3RdKXtFLnB1c2gob1t0XSk7Y29udGludWV9bGV0IGEsbD1pLnN0YWNrU2F2ZSgpLGY9aS5zdGFja0FsbG9jKDQqcyksZD0hMSxjPTA7dHJ5ezAhPT1pLl9PcnRHZXRUZW5zb3JEYXRhKHIsZixmK3MsZisyKnMsZiszKnMpJiZTKGBDYW4ndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhIG9uIGluZGV4ICR7dH0uYCk7bGV0IG89ND09PXM/ImkzMiI6Imk2NCIsbD1OdW1iZXIoaS5nZXRWYWx1ZShmLG8pKTtjPWkuZ2V0VmFsdWUoZitzLCIqIik7bGV0IHU9aS5nZXRWYWx1ZShmKzIqcywiKiIpLGg9TnVtYmVyKGkuZ2V0VmFsdWUoZiszKnMsbykpLHc9W107Zm9yKGxldCBlPTA7ZTxoO2UrKyl3LnB1c2goTnVtYmVyKGkuZ2V0VmFsdWUodStlKnMsbykpKTswIT09aS5fT3J0RnJlZSh1KSYmUygiQ2FuJ3QgZnJlZSBtZW1vcnkgZm9yIHRlbnNvciBkaW1zLiIpO2xldCB5PXcucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKTthPVF0KGwpO2xldCBtPXA/Lm91dHB1dFByZWZlcnJlZExvY2F0aW9uc1tuW3RdXTtpZigic3RyaW5nIj09PWEpe2lmKCJncHUtYnVmZmVyIj09PW18fCJtbC10ZW5zb3IiPT09bSl0aHJvdyBuZXcgRXJyb3IoIlN0cmluZyB0ZW5zb3IgaXMgbm90IHN1cHBvcnRlZCBvbiBHUFUuIik7bGV0IGU9W107Zm9yKGxldCB0PTA7dDx5O3QrKyl7bGV0IHI9aS5nZXRWYWx1ZShjK3QqcywiKiIpLG49aS5nZXRWYWx1ZShjKyh0KzEpKnMsIioiKSxvPXQ9PT15LTE/dm9pZCAwOm4tcjtlLnB1c2goaS5VVEY4VG9TdHJpbmcocixvKSk7fUUucHVzaChbYSx3LGUsImNwdSJdKTt9ZWxzZSBpZigiZ3B1LWJ1ZmZlciI9PT1tJiZ5PjApe2xldCBlPWkuanNlcEdldEJ1ZmZlcjtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ3ByZWZlcnJlZExvY2F0aW9uICJncHUtYnVmZmVyIiBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgdXNpbmcgV2ViR1BVLicpO2xldCB0PWUoYyksbj10ZShsLHkpO2lmKHZvaWQgMD09PW58fCFDZShhKSl0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHthfWApO2Q9ITAsRS5wdXNoKFthLHcse2dwdUJ1ZmZlcjp0LGRvd25sb2FkOmkuanNlcENyZWF0ZURvd25sb2FkZXIodCxuLGEpLGRpc3Bvc2U6KCk9PnswIT09aS5fT3J0UmVsZWFzZVRlbnNvcihyKSYmUygiQ2FuJ3QgcmVsZWFzZSB0ZW5zb3IuIik7fX0sImdwdS1idWZmZXIiXSk7fWVsc2UgaWYoIm1sLXRlbnNvciI9PT1tJiZ5PjApe2xldCB0PWkuanNlcEVuc3VyZVRlbnNvcjtpZighdCl0aHJvdyBuZXcgRXJyb3IoJ3ByZWZlcnJlZExvY2F0aW9uICJtbC10ZW5zb3IiIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCB1c2luZyBXZWJOTi4nKTtpZih2b2lkIDA9PT10ZShsLHkpfHwhVWUoYSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7YX1gKTtsZXQgbj1hd2FpdCB0KGUsYyxsLHcsITEpO2Q9ITAsRS5wdXNoKFthLHcse21sVGVuc29yOm4sZG93bmxvYWQ6aS5qc2VwQ3JlYXRlTUxUZW5zb3JEb3dubG9hZGVyKGMsYSksZGlzcG9zZTooKT0+e2kuanNlcFJlbGVhc2VUZW5zb3JJZChjKSxpLl9PcnRSZWxlYXNlVGVuc29yKHIpO319LCJtbC10ZW5zb3IiXSk7fWVsc2Uge2xldCBlPW5ldyhlcihhKSkoeSk7bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkuc2V0KGkuSEVBUFU4LnN1YmFycmF5KGMsYytlLmJ5dGVMZW5ndGgpKSxFLnB1c2goW2EsdyxlLCJjcHUiXSk7fX1maW5hbGx5e2kuc3RhY2tSZXN0b3JlKGwpLCJzdHJpbmciPT09YSYmYyYmaS5fZnJlZShjKSxkfHxpLl9PcnRSZWxlYXNlVGVuc29yKHIpLGkuanNlcE9uUnVuRW5kPy4odSk7fX1yZXR1cm4gcCYmIWMmJigwIT09aS5fT3J0Q2xlYXJCb3VuZE91dHB1dHMocC5oYW5kbGUpJiZTKCJDYW4ndCBjbGVhciBib3VuZCBvdXRwdXRzLiIpLHJlLnNldChlLFt1LGYsZCxwLGMsITFdKSksRX1maW5hbGx5e2kuc3RhY2tSZXN0b3JlKEUpLGcuZm9yRWFjaCgoZT0+aS5fT3J0UmVsZWFzZVRlbnNvcihlKSkpLGIuZm9yRWFjaCgoZT0+aS5fT3J0UmVsZWFzZVRlbnNvcihlKSkpLHYuZm9yRWFjaCgoZT0+aS5fZnJlZShlKSkpLDAhPT15JiZpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucyh5KSxtLmZvckVhY2goKGU9PmkuX2ZyZWUoZSkpKTt9fSxMZT1lPT57bGV0IHQ9eCgpLHI9cmUuZ2V0KGUpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzZXNzaW9uIGlkIik7bGV0IG49clswXSxvPXQuX09ydEVuZFByb2ZpbGluZyhuKTswPT09byYmUygiQ2FuJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUobyk7fSxJZT1lPT57bGV0IHQ9W107Zm9yKGxldCByIG9mIGUpe2xldCBlPXJbMl07IUFycmF5LmlzQXJyYXkoZSkmJiJidWZmZXIiaW4gZSYmdC5wdXNoKGUuYnVmZmVyKTt9cmV0dXJuIHR9O30pKSxudD1UKCgoKT0+e3EoKSxKZSgpLEooKSxnZSgpLFo9KCk9PiEhQS53YXNtLnByb3h5JiZ0eXBlb2YgZG9jdW1lbnQ8InUiLGxlPSExLE1lPSExLERlPSExLHJ0PW5ldyBNYXAsbmU9KGUsdCk9PntsZXQgcj1ydC5nZXQoZSk7cj9yLnB1c2godCk6cnQuc2V0KGUsW3RdKTt9LG9lPSgpPT57aWYobGV8fCFNZXx8RGV8fCFEKXRocm93IG5ldyBFcnJvcigid29ya2VyIG5vdCByZWFkeSIpfSxOcj1lPT57c3dpdGNoKGUuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6bGU9ITEsZS5kYXRhLmVycj8oRGU9ITAsdHRbMV0oZS5kYXRhLmVycikpOihNZT0hMCx0dFswXSgpKSxfZSYmKFVSTC5yZXZva2VPYmplY3RVUkwoX2UpLF9lPXZvaWQgMCk7YnJlYWs7Y2FzZSJpbml0LWVwIjpjYXNlImNvcHktZnJvbSI6Y2FzZSJjcmVhdGUiOmNhc2UicmVsZWFzZSI6Y2FzZSJydW4iOmNhc2UiZW5kLXByb2ZpbGluZyI6e2xldCB0PXJ0LmdldChlLmRhdGEudHlwZSk7ZS5kYXRhLmVycj90LnNoaWZ0KClbMV0oZS5kYXRhLmVycik6dC5zaGlmdCgpWzBdKGUuZGF0YS5vdXQpO2JyZWFrfX19LG9yPWFzeW5jKCk9PntpZighTWUpe2lmKGxlKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRXYXNtKCknIGRldGVjdGVkLiIpO2lmKERlKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdFdhc20oKScgZmFpbGVkLiIpO2lmKGxlPSEwLFooKSlyZXR1cm4gbmV3IFByb21pc2UoKChlLHQpPT57RD8udGVybWluYXRlKCksVnQoKS50aGVuKCgoW3Isbl0pPT57dHJ5eyhEPW4pLm9uZXJyb3I9ZT0+dChlKSxELm9ubWVzc2FnZT1Ocix0dD1bZSx0XTtsZXQgbz17dHlwZToiaW5pdC13YXNtIixpbjpBfTtpZighby5pbi53YXNtLndhc21QYXRocyYmcil7bGV0IGU9UGUoKTtlJiYoby5pbi53YXNtLndhc21QYXRocz1lKTt9RC5wb3N0TWVzc2FnZShvKSxfZT1yO31jYXRjaChlKXt0KGUpO319KSx0KTt9KSk7dHJ5e2F3YWl0IEVlKEEud2FzbSksYXdhaXQgVGUoQSksTWU9ITA7fWNhdGNoKGUpe3Rocm93IERlPSEwLGV9ZmluYWxseXtsZT0hMTt9fX0sc3I9YXN5bmMgZT0+e2lmKFooKSlyZXR1cm4gb2UoKSxuZXcgUHJvbWlzZSgoKHQscik9PntuZSgiaW5pdC1lcCIsW3Qscl0pO2xldCBuPXt0eXBlOiJpbml0LWVwIixpbjp7ZXBOYW1lOmUsZW52OkF9fTtELnBvc3RNZXNzYWdlKG4pO30pKTthd2FpdCBTZShBLGUpO30saXI9YXN5bmMgZT0+WigpPyhvZSgpLG5ldyBQcm9taXNlKCgodCxyKT0+e25lKCJjb3B5LWZyb20iLFt0LHJdKTtsZXQgbj17dHlwZToiY29weS1mcm9tIixpbjp7YnVmZmVyOmV9fTtELnBvc3RNZXNzYWdlKG4sW2UuYnVmZmVyXSk7fSkpKTp1ZShlKSxhcj1hc3luYyhlLHQpPT57aWYoWigpKXtpZih0Py5wcmVmZXJyZWRPdXRwdXRMb2NhdGlvbil0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb24gb3B0aW9uICJwcmVmZXJyZWRPdXRwdXRMb2NhdGlvbiIgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJveHkuJyk7cmV0dXJuIG9lKCksbmV3IFByb21pc2UoKChyLG4pPT57bmUoImNyZWF0ZSIsW3Isbl0pO2xldCBvPXt0eXBlOiJjcmVhdGUiLGluOnttb2RlbDplLG9wdGlvbnM6ey4uLnR9fX0sYT1bXTtlIGluc3RhbmNlb2YgVWludDhBcnJheSYmYS5wdXNoKGUuYnVmZmVyKSxELnBvc3RNZXNzYWdlKG8sYSk7fSkpfXJldHVybiBBZShlLHQpfSx1cj1hc3luYyBlPT57aWYoWigpKXJldHVybiBvZSgpLG5ldyBQcm9taXNlKCgodCxyKT0+e25lKCJyZWxlYXNlIixbdCxyXSk7bGV0IG49e3R5cGU6InJlbGVhc2UiLGluOmV9O0QucG9zdE1lc3NhZ2Uobik7fSkpO09lKGUpO30sZnI9YXN5bmMoZSx0LHIsbixvLGEpPT57aWYoWigpKXtpZihyLnNvbWUoKGU9PiJjcHUiIT09ZVszXSkpKXRocm93IG5ldyBFcnJvcigiaW5wdXQgdGVuc29yIG9uIEdQVSBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm94eS4iKTtpZihvLnNvbWUoKGU9PmUpKSl0aHJvdyBuZXcgRXJyb3IoInByZS1hbGxvY2F0ZWQgb3V0cHV0IHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm94eS4iKTtyZXR1cm4gb2UoKSxuZXcgUHJvbWlzZSgoKG8saSk9PntuZSgicnVuIixbbyxpXSk7bGV0IHM9cixsPXt0eXBlOiJydW4iLGluOntzZXNzaW9uSWQ6ZSxpbnB1dEluZGljZXM6dCxpbnB1dHM6cyxvdXRwdXRJbmRpY2VzOm4sb3B0aW9uczphfX07RC5wb3N0TWVzc2FnZShsLEllKHMpKTt9KSl9cmV0dXJuIHhlKGUsdCxyLG4sbyxhKX0sY3I9YXN5bmMgZT0+e2lmKFooKSlyZXR1cm4gb2UoKSxuZXcgUHJvbWlzZSgoKHQscik9PntuZSgiZW5kLXByb2ZpbGluZyIsW3Qscl0pO2xldCBuPXt0eXBlOiJlbmQtcHJvZmlsaW5nIixpbjplfTtELnBvc3RNZXNzYWdlKG4pO30pKTtMZShlKTt9O30pKSxkcj1UKCgoKT0+e3EoKSxudCgpLFFlKCksYmUoKSxldCgpLGxyPShlLHQpPT57c3dpdGNoKGUubG9jYXRpb24pe2Nhc2UiY3B1IjpyZXR1cm4gW2UudHlwZSxlLmRpbXMsZS5kYXRhLCJjcHUiXTtjYXNlImdwdS1idWZmZXIiOnJldHVybiBbZS50eXBlLGUuZGltcyx7Z3B1QnVmZmVyOmUuZ3B1QnVmZmVyfSwiZ3B1LWJ1ZmZlciJdO2Nhc2UibWwtdGVuc29yIjpyZXR1cm4gW2UudHlwZSxlLmRpbXMse21sVGVuc29yOmUubWxUZW5zb3J9LCJtbC10ZW5zb3IiXTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkYXRhIGxvY2F0aW9uOiAke2UubG9jYXRpb259IGZvciAke3QoKX1gKX19LFdyPWU9Pntzd2l0Y2goZVszXSl7Y2FzZSJjcHUiOnJldHVybiBuZXcgUihlWzBdLGVbMl0sZVsxXSk7Y2FzZSJncHUtYnVmZmVyIjp7bGV0IHQ9ZVswXTtpZighQ2UodCkpdGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGRhdGEgdHlwZTogJHt0fSBmb3IgZGVzZXJpYWxpemluZyBHUFUgdGVuc29yYCk7bGV0e2dwdUJ1ZmZlcjpyLGRvd25sb2FkOm4sZGlzcG9zZTpvfT1lWzJdO3JldHVybiBSLmZyb21HcHVCdWZmZXIocix7ZGF0YVR5cGU6dCxkaW1zOmVbMV0sZG93bmxvYWQ6bixkaXNwb3NlOm99KX1jYXNlIm1sLXRlbnNvciI6e2xldCB0PWVbMF07aWYoIVVlKHQpKXRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7dH0gZm9yIGRlc2VyaWFsaXppbmcgTUxUZW5zb3IgdGVuc29yYCk7bGV0e21sVGVuc29yOnIsZG93bmxvYWQ6bixkaXNwb3NlOm99PWVbMl07cmV0dXJuIFIuZnJvbU1MVGVuc29yKHIse2RhdGFUeXBlOnQsZGltczplWzFdLGRvd25sb2FkOm4sZGlzcG9zZTpvfSl9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZGF0YSBsb2NhdGlvbjogJHtlWzNdfWApfX0sUmU9Y2xhc3N7YXN5bmMgZmV0Y2hNb2RlbEFuZENvcHlUb1dhc21NZW1vcnkoZSl7cmV0dXJuIGlyKGF3YWl0IGNlKGUpKX1hc3luYyBsb2FkTW9kZWwoZSx0KXtsZXQgcjtWKCkscj0ic3RyaW5nIj09dHlwZW9mIGU/YXdhaXQgdGhpcy5mZXRjaE1vZGVsQW5kQ29weVRvV2FzbU1lbW9yeShlKTplLFt0aGlzLnNlc3Npb25JZCx0aGlzLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lc109YXdhaXQgYXIocix0KSxZKCk7fWFzeW5jIGRpc3Bvc2UoKXtyZXR1cm4gdXIodGhpcy5zZXNzaW9uSWQpfWFzeW5jIHJ1bihlLHQscil7VigpO2xldCBuPVtdLG89W107T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoZT0+e2xldCB0PWVbMF0scj1lWzFdLGE9dGhpcy5pbnB1dE5hbWVzLmluZGV4T2YodCk7aWYoLTE9PT1hKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnB1dCAnJHt0fSdgKTtuLnB1c2gociksby5wdXNoKGEpO30pKTtsZXQgYT1bXSxpPVtdO09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKGU9PntsZXQgdD1lWzBdLHI9ZVsxXSxuPXRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZih0KTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dCAnJHt0fSdgKTthLnB1c2gociksaS5wdXNoKG4pO30pKTtsZXQgcz1uLm1hcCgoKGUsdCk9PmxyKGUsKCgpPT5gaW5wdXQgIiR7dGhpcy5pbnB1dE5hbWVzW29bdF1dfSJgKSkpKSxsPWEubWFwKCgoZSx0KT0+ZT9scihlLCgoKT0+YG91dHB1dCAiJHt0aGlzLm91dHB1dE5hbWVzW2lbdF1dfSJgKSk6bnVsbCkpLHU9YXdhaXQgZnIodGhpcy5zZXNzaW9uSWQsbyxzLGksbCxyKSxmPXt9O2ZvcihsZXQgZT0wO2U8dS5sZW5ndGg7ZSsrKWZbdGhpcy5vdXRwdXROYW1lc1tpW2VdXV09YVtlXT8/V3IodVtlXSk7cmV0dXJuIFkoKSxmfXN0YXJ0UHJvZmlsaW5nKCl7fWVuZFByb2ZpbGluZygpe2NyKHRoaXMuc2Vzc2lvbklkKTt9fTt9KSksbXI9e307R2UobXIse09ubnhydW50aW1lV2ViQXNzZW1ibHlCYWNrZW5kOigpPT5GZSxpbml0aWFsaXplRmxhZ3M6KCk9PnByLHdhc21CYWNrZW5kOigpPT4kcn0pO3ZhciBwcixGZSwkcixocj1UKCgoKT0+e3EoKSxudCgpLGRyKCkscHI9KCk9PntpZigoIm51bWJlciIhPXR5cGVvZiBBLndhc20uaW5pdFRpbWVvdXR8fEEud2FzbS5pbml0VGltZW91dDwwKSYmKEEud2FzbS5pbml0VGltZW91dD0wKSwhMT09PUEud2FzbS5zaW1kJiZjb25zb2xlLndhcm4oJ0RlcHJlY2F0ZWQgcHJvcGVydHkgImVudi53YXNtLnNpbWQiIGlzIHNldCB0byBmYWxzZS4gbm9uLVNJTUQgYnVpbGQgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLCBhbmQgdGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZC4nKSwiYm9vbGVhbiIhPXR5cGVvZiBBLndhc20ucHJveHkmJihBLndhc20ucHJveHk9ITEpLCJib29sZWFuIiE9dHlwZW9mIEEud2FzbS50cmFjZSYmKEEud2FzbS50cmFjZT0hMSksIm51bWJlciIhPXR5cGVvZiBBLndhc20ubnVtVGhyZWFkc3x8IU51bWJlci5pc0ludGVnZXIoQS53YXNtLm51bVRocmVhZHMpfHxBLndhc20ubnVtVGhyZWFkczw9MClpZih0eXBlb2Ygc2VsZjwidSImJiFzZWxmLmNyb3NzT3JpZ2luSXNvbGF0ZWQpQS53YXNtLm51bVRocmVhZHM9MTtlbHNlIHtsZXQgZT10eXBlb2YgbmF2aWdhdG9yPiJ1Ij8kZSgibm9kZTpvcyIpLmNwdXMoKS5sZW5ndGg6bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7QS53YXNtLm51bVRocmVhZHM9TWF0aC5taW4oNCxNYXRoLmNlaWwoKGV8fDEpLzIpKTt9fSwkcj1uZXcoRmU9Y2xhc3N7YXN5bmMgaW5pdChlKXtwcigpLGF3YWl0IG9yKCksYXdhaXQgc3IoZSk7fWFzeW5jIGNyZWF0ZUluZmVyZW5jZVNlc3Npb25IYW5kbGVyKGUsdCl7bGV0IHI9bmV3IFJlO3JldHVybiBhd2FpdCByLmxvYWRNb2RlbChlLHQpLFByb21pc2UucmVzb2x2ZShyKX19KTt9KSk7cSgpLHEoKSxxKCk7dmFyIEZ0PSIxLjIxLjAiO3tsZXQgZT0oaHIoKSxhdChtcikpLndhc21CYWNrZW5kO2llKCJjcHUiLGUsMTApLGllKCJ3YXNtIixlLDEwKTt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEudmVyc2lvbnMsIndlYiIse3ZhbHVlOkZ0LGVudW1lcmFibGU6ITB9KTsKCmNsYXNzIFdvcmtlck5hdGl2ZXtjb25zdHJ1Y3Rvcigpe3RoaXMucmVhZHk9ITE7dGhpcy5pbmRleGVkREJNYW5hZ2VyPW5ldyBJbmRleGVkREJNYW5hZ2VyKCJvbmlyaXgtc2RrIiwiZmlsZXMiKSx0aGlzLmluZGV4ZWREQk1hbmFnZXIuZ2V0RmlsZUZyb21JbmRleGVkREIoIlNES18xLjEwLjAiKS50aGVuKChhc3luYyBlPT57bGV0IHQ9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbZV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSk7Y29uc3R7ZGVmYXVsdDphfT1hd2FpdCBpbXBvcnQoLyogd2VicGFja0lnbm9yZTogdHJ1ZSwgd2VicGFja01vZGU6ICJsYXp5IiAqL3QpLHM9YXdhaXQgYSgpO3RoaXMubmF0aXZlU0RLPXMsdGhpcy5zcGF0aWFsQnVmZmVyU2l6ZT10aGlzLm5hdGl2ZVNESy5fT1hfR2V0QnVmZmVyU2l6ZSgpLHRoaXMuZnJvbUJ1ZmZlcj10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDQqdGhpcy5zcGF0aWFsQnVmZmVyU2l6ZSksdGhpcy50b0J1ZmZlcj10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDQqdGhpcy5zcGF0aWFsQnVmZmVyU2l6ZSksQS53YXNtLm51bVRocmVhZHM9MTtjb25zdCByPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGaWxlRnJvbUluZGV4ZWREQigib3J0Lndhc20iKSxpPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3JdLHt0eXBlOiJhcHBsaWNhdGlvbi93YXNtIn0pKTtBLndhc20ud2FzbVBhdGhzPXt3YXNtOmksbWpzOiJodHRwczovL2Nkbi5vbmlyaXguY29tL29uaXJpeC1lbmdpbmUtc2RrL29ydF92MS4yMS4wX21pbi9vcnQtd2FzbS1zaW1kLm1qcyJ9O2xldCBuPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGcm9tQ2FjaGVPckZldGNoKCJzcGFyc2VfbWF0Y2hpbmcub3J0IiwiaHR0cHM6Ly9jZG4ub25pcml4LmNvbS9vbmlyaXgtZW5naW5lLXNkay9zcGFyc2VfbWF0Y2hpbmcub3J0Iik7Y29uc3Qgbz1hd2FpdCBPci5jcmVhdGUobix7ZXhlY3V0aW9uUHJvdmlkZXJzOlsid2FzbSJdfSk7dGhpcy5zZXNzaW9uTWF0Y2hpbmc9byxhd2FpdCB0aGlzLnNlc3Npb25NYXRjaGluZy5ydW4oe2ZlYXRzMDpuZXcgUihuZXcgRmxvYXQzMkFycmF5KEFycmF5KDY0ZTMpLmZpbGwoMCkpLFsxZTMsNjRdKSxmZWF0czE6bmV3IFIobmV3IEZsb2F0MzJBcnJheShBcnJheSg2NGUzKS5maWxsKDApKSxbMWUzLDY0XSl9KSx0aGlzLnJlYWR5PSEwLHBvc3RNZXNzYWdlKCJyZWFkeSIpO30pKTt9c3RhcnQoKXthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoYXN5bmMgZT0+e2lmKCF0aGlzLnJlYWR5KXJldHVybjtjb25zdCB0PWUuZGF0YSxhPXQuZnJvbSxzPXQudG87bGV0IHI7aWYoMj09dC5kdHlwZSl7bGV0IGU9dGhpcy5yZWFkRGVzY3JpcHRvcnMoYSksdD10aGlzLnJlYWREZXNjcmlwdG9ycyhzKSxpPWF3YWl0IHRoaXMuc2Vzc2lvbk1hdGNoaW5nLnJ1bih7ZmVhdHMwOmUsZmVhdHMxOnR9KSx7aWR4MDpuLGlkeDE6b309aSxoPVtuLmRpbXNbMF1dO2ZvcihsZXQgZT0wO2U8bi5kaW1zWzBdO2UrKyloLnB1c2goTnVtYmVyKG4uZGF0YVtlXSkpLGgucHVzaChOdW1iZXIoby5kYXRhW2VdKSk7cj1uZXcgRmxvYXQzMkFycmF5KGgpO31lbHNlIHt0aGlzLm5hdGl2ZVNESy5IRUFQRjMyLnNldChhLHRoaXMuZnJvbUJ1ZmZlci80KSx0aGlzLm5hdGl2ZVNESy5IRUFQRjMyLnNldChzLHRoaXMudG9CdWZmZXIvNCk7bGV0IGU9dGhpcy5uYXRpdmVTREsuX09YX01hdGNoKHRoaXMuZnJvbUJ1ZmZlcix0aGlzLnRvQnVmZmVyLHQuZHR5cGUpO3I9bmV3IEZsb2F0MzJBcnJheSh0aGlzLnJlYWRNYXRjaGluZ0RhdGEodGhpcy5uYXRpdmVTREsuSEVBUEYzMixlLzQpKTt9cG9zdE1lc3NhZ2Uocik7fSkpO31yZWFkRGVzY3JpcHRvcnMoZSl7bGV0IHQ9ZVswXSxhPTErMip0O3JldHVybiBuZXcgUihuZXcgRmxvYXQzMkFycmF5KGUuc2xpY2UoYSxhKzY0KnQpKSxbdCw2NF0pfXJlYWRNYXRjaGluZ0RhdGEoZSx0KXtsZXQgYT10LHM9W10scj1lW2FdO3MucHVzaChyKSxhKys7Zm9yKGxldCB0PTA7dDxyO3QrKylzLnB1c2goZVthXSkscy5wdXNoKGVbYSsxXSksYSs9MjtyZXR1cm4gc319Y29uc3Qgd29ya2VyPW5ldyBXb3JrZXJOYXRpdmU7d29ya2VyLnN0YXJ0KCk7Cg=="),b=new Blob([d],{type:"application/javascript"});this.workers[Z]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(b),{type:"module"}),this.callbacks[Z]=l,this.workers[Z].addEventListener("message",(l=>{this.callbacks[Z](l.data);}));}}replaceCallback(Z,l){this.workerExists(Z)&&(this.callbacks[Z]=l);}sendDataToWorker(Z,l){this.workers[Z].postMessage(l);}async createWorkers(){return await this.indexedDBManager.getFromCacheOrFetch("ort.wasm","https://cdn.onirix.com/onirix-engine-sdk/ort_v1.21.0_min/ort-wasm-simd.wasm"),Promise.all([new Promise(((Z,l)=>{this.createExtractionWorker("extraction",(l=>{"ready"===l&&Z();}));})),new Promise(((Z,l)=>{this.createMatchingWorker("matching",(l=>{"ready"===l&&Z();}));}))])}}
|
52
52
|
|
53
53
|
class WebXRManager{constructor(t,e,i,a){this.uiManager=t,this.nativeManager=e,this.deviceManager=i,this.workerManager=a,this.hitTestTimeout=void 0,this.hotSwap=!1,this.continuousLocalizationEnabled=!1,this.initialCalibrationPose=null,this.isCalibrated=!0,this.startedOnce=!1;}async isWebXRSupported(){let t=!1;return navigator.xr&&(t=await navigator.xr.isSessionSupported("immersive-ar")),t}async init(t,e,i,a){this.onPose=e,this.onSessionEnd=i,this.isCalibrated=!a;const r=async()=>{const e=["hit-test"],i=["dom-overlay"];t&&i.push("camera-access");try{const t=await new Promise((async(t,a)=>{let r,s=!1;this.requestStallTime&&this.requestStallTime>0&&(r=window.setTimeout((()=>{s=!0,a(new TimeoutError);}),this.requestStallTime));try{const a=await navigator.xr.requestSession("immersive-ar",{requiredFeatures:e,optionalFeatures:i,domOverlay:{root:document.body}});s?await a.end():(window.clearTimeout(r),t(a));}catch(t){window.clearTimeout(r),a(t);}}));await this.onXRSessionStarted(t),this.hitTestStallTime&&this.hitTestStallTime>0&&(this.hitTestTimeout=window.setTimeout((async()=>{this.onHitTestStall&&this.onHitTestStall();}),this.hitTestStallTime));}catch(t){throw console.log(t),new SensorsError(`error while initializing webXR API: ${t}`)}};window.navigator.userAgent.includes("OnirixPlayer")?await r():await this.uiManager.displayPermissionsDialog(r);}startImageDetection(){this.usingImageDetection=!0,this.detectingImage=!0;}stopImageDetection(){this.detectingImage=!1;}start(){this.started=!0,this.usingSpatial&&(this.relocating=!1,this.nativeManager.setWebXRRelocationListener(this.onXRRelocation.bind(this)),this.workerManager.replaceCallback("extraction",(t=>{if(!1!==t)if(this.nativeManager.coarseLocationCheck(t)){let e=this.nativeManager.loadExtractionData(t);this.candidates=Array.from(Array(e).keys()).reverse(),this.extractionData=t.extraction,this.matchKeyframes();}else this.relocating=!1;else this.relocating=!1;})),this.workerManager.replaceCallback("matching",(t=>{this.nativeManager.loadMatch(t),this.matchKeyframes();})));}stop(){this.started=!1,this.xrTransform=null,this.lastRelocationTry=null;}setStartedFlag(){this.startedOnce=!0;}hasStartedOnce(){return this.startedOnce}matchKeyframes(){if(this.candidates.length>0)if(this.nativeManager.spatialLocalize())this.relocating=!1;else {let t=this.candidates.pop();this.workerManager.sendDataToWorker("matching",new WorkerMatchingData(t,this.extractionData,this.nativeManager.getCandidateData(t),this.nativeManager.extractionType()));}else this.nativeManager.spatialLocalize(),this.relocating=!1;}async destroy(){this.xrSession&&(await this.xrSession.end(),this.xrSession=null,this.xrLastPose=null);}async onXRSessionStarted(t){let e=this.uiManager.renderCanvas.getContext("webgl2");e||(e=this.uiManager.renderCanvas.getContext("webgl")),e.getContextAttributes().xrCompatible||await e.makeXRCompatible(),this.xrContext=e,this.framebuffer=this.xrContext.createFramebuffer(),this.xrLayer=new XRWebGLLayer(t,this.xrContext),this.usingSpatial?(navigator.userAgent.includes("OnirixPlayer")||(this.glBinding=new XRWebGLBinding(t,this.xrContext)),this.nativeManager.initExtractionBuffers()):this.detectingImage&&(navigator.userAgent.includes("OnirixPlayer")||(this.glBinding=new XRWebGLBinding(t,this.xrContext))),t.updateRenderState({baseLayer:this.xrLayer}),this.xrLocalRefSpace=await t.requestReferenceSpace("local"),this.xrViewerRefSpace=await t.requestReferenceSpace("viewer"),this.xrHitTestSource=await t.requestHitTestSource({space:this.xrViewerRefSpace}),t.requestAnimationFrame(this.onXRFrame.bind(this)),window.navigator.userAgent.includes("WebXRViewer")?(this.uiManager.renderCanvas.addEventListener("click",(t=>{this.onTouch&&this.onTouch(this.getNormalizedTouchCoords(t));})),this.uiManager.renderCanvas.addEventListener("touchstart",(t=>{this.onTouchStart&&this.onTouchStart(this.getNormalizedTouchCoords(t));})),this.uiManager.renderCanvas.addEventListener("touchend",(t=>{this.onTouchEnd&&this.onTouchEnd(this.getNormalizedTouchCoords(t));}))):(t.addEventListener("select",(t=>{this.onTouch&&this.onTouch(this.getXRInputCoords(t));})),t.addEventListener("selectstart",(t=>{this.onTouchStart&&this.onTouchStart(this.getXRInputCoords(t));})),t.addEventListener("selectend",(t=>{this.onTouchEnd&&this.onTouchEnd(this.getXRInputCoords(t));}))),this.uiManager.renderCanvas.addEventListener("touchmove",(t=>{this.onTouchMove&&this.onTouchMove(this.getNormalizedTouchCoords(t));})),t.addEventListener("end",(()=>{this.hotSwap||this.onSessionEnd&&this.onSessionEnd();})),this.xrSession=t;}enableHotSwap(){this.hotSwap=!0;}disableHotSwap(){this.hotSwap=!1;}hasRelocatedOrDetected(){return (this.usingSpatial||this.usingImageDetection)&&null!=this.xrTransform}needsSmoothing(){return null!=this.xrTransform&&null!=this.prevXrTransform}needsSpatialRelocation(){return this.usingSpatial&&(null==this.lastRelocationTry||this.msSinceRelocation()>2e3)&&(!this.hasRelocatedOrDetected()||this.continuousLocalizationEnabled)}needsImageDetection(){return this.detectingImage&&(null==this.lastRelocationTry||this.msSinceRelocation()>200)}startRelocationTimer(){this.lastRelocationTry=new Date;}msSinceRelocation(){let t=new Date;return this.lastRelocationTry?t-this.lastRelocationTry:0}msSinceOkRelocation(){let t=new Date;return this.lastRelocationTry?t-this.xrTransitionTimer:0}resizeTexture(t,e,i,a,r,s){const n=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,n),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,e,0);const o=t.createTexture();t.bindTexture(t.TEXTURE_2D,o),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,r,s,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR);const h=t.createFramebuffer();return t.bindFramebuffer(t.FRAMEBUFFER,h),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,o,0),t.bindFramebuffer(t.READ_FRAMEBUFFER,n),t.bindFramebuffer(t.DRAW_FRAMEBUFFER,h),t.blitFramebuffer(0,0,i,a,0,0,r,s,t.COLOR_BUFFER_BIT,t.LINEAR),o}getCameraIntrinsics(t,e){const i=t,a=e.width,r=e.height;if(this.uiManager.isPortrait()){return [r/2*i[5]*Math.min(480/r,640/a),320,240]}return [r/2*i[5]*Math.min(640/r,480/a),320,240]}offsetByXRTransform(t,e){return e?(new Matrix4).fromArray(e.elements).multiply(t):(new Matrix4).fromArray(this.xrTransform.elements).multiply(t)}onXRRelocation(t){if(this.lastCameraImagePose){let e=(new Matrix4).fromArray(this.lastCameraImagePose),i=(new Matrix4).fromArray(t.elements);this.xrTransitionTimer=new Date,null!=this.xrTransform&&(this.prevXrTransform=this.xrTransform.clone()),this.xrTransform=i.multiply(e.invert());}}onXRFrame(t,e){const i=e.session;if(i.requestAnimationFrame(this.onXRFrame.bind(this)),!this.started)return;const a=e.getViewerPose(this.xrLocalRefSpace);if(!a)return;const r=this.xrContext;this.isCalibrated&&(this.needsSpatialRelocation()&&!this.relocating||this.needsImageDetection())&&(this.relocating=!0,(async()=>{const t=this.getGLState(r),{cameraWidth:i,cameraHeight:s,cameraTexture:n,cameraPose:o}=await this.fetchCameraImage(e,a,r);if(!n)return;this.lastCameraImagePose=o;const{scaledWidth:h,scaledHeight:c}=this.calculateScale(i,s),l=this.resizeTexture(r,n,i,s,h,c);this.cameraData||(this.cameraData=new Uint8ClampedArray(h*c*4)),r.bindTexture(r.TEXTURE_2D,l),r.bindFramebuffer(r.FRAMEBUFFER,this.framebuffer),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,l,0),r.readPixels(0,0,h,c,r.RGBA,r.UNSIGNED_BYTE,this.cameraData),this.restoreGLState(r,t);const{flip:d,rotate:u}=this.getOrientationFlags();if(this.usingSpatial&&this.workerManager.sendDataToWorker("extraction",new WorkerExtractionData(this.cameraData,h,c,u,d,this.nativeManager.extractionType())),this.detectingImage){let t=this.nativeManager.getXRFrameBuffer(h,c);this.nativeManager.processFrame(this.cameraData,t,c,h,d,u);}this.startRelocationTimer();})()),r.bindFramebuffer(r.FRAMEBUFFER,i.renderState.baseLayer.framebuffer);const s=a.views[0];let n=(new Matrix4).fromArray(s.transform.matrix);if(this.shouldCorrectJump(n)?(n=this.correctJump(n),this.isCalibrated||this.resetCalibration()):this.lastPose=n,this.checkTrackingCalibration(n),this.hasRelocatedOrDetected())if(this.needsSmoothing()){let t=this.lastInterpolatedTransform??this.prevXrTransform,e=this.xrTransform;this.lastInterpolatedTransform=t.interpolatePose(e,.1),n=this.offsetByXRTransform(n,this.lastInterpolatedTransform);}else n=this.offsetByXRTransform(n);if((!this.usingSpatial&&!this.usingImageDetection||this.hasRelocatedOrDetected())&&this.onPose(n.toArray()),this.handleViewportResize(a),this.onHitTestResult){const t=e.getHitTestResults(this.xrHitTestSource);if(t.length>0){this.hitTestTimeout&&(window.clearInterval(this.hitTestTimeout),this.hitTestTimeout=void 0);const e=t[0].getPose(this.xrLocalRefSpace),i=(new Matrix4).fromArray(e.transform.matrix),a=i.extractPosition(),r=((new Quaternion).setFromRotationMatrix(i),n.extractPosition()),s=Math.atan2(r.x-a.x,r.z-a.z),o={position:a,rotation:(new Quaternion).setFromEuler(new Euler(0,s,0))};this.onHitTestResult(o);}}this.onFrame&&this.onFrame(e);}async fetchCameraImage(t,e,i){let a,r,s,n;if(navigator.userAgent.includes("OnirixPlayer")){const o=await t.getCameraImage();a=o.width,r=o.height,n=o.pose??e.views[0].transform.matrix,s=await this.createTextureFromImage(i,o),await this.updateIntrinsicsIfNeeded(o);}else for(const t of e.views)t.camera&&(a=t.camera.width,r=t.camera.height,s=this.glBinding.getCameraImage(t.camera),n=e.views[0].transform.matrix);return {cameraWidth:a,cameraHeight:r,cameraTexture:s,cameraPose:n}}async updateIntrinsicsIfNeeded(t){const[e,i,a]=this.nativeManager.getIntrinsics();Math.abs(e-t.focalLength)>1&&this.nativeManager.setIntrinsics(t.focalLength,320,240);}handleViewportResize(t){const e=this.xrLayer.getViewport(t.views[0]),i=e.width,a=e.height,r=null==this.xrLastPose||this.lastViewportWidth!=i||this.lastViewportHeight!=a;this.xrLastPose=t,this.lastViewportWidth=i,this.lastViewportHeight=a,r&&this.onResize&&this.onResize();}calculateScale(t,e){let i,a;this.uiManager.isPortrait()?(i=640/e,a=480/t):(i=480/e,a=640/t);const r=Math.max(i,a);return {scaledWidth:t*r,scaledHeight:e*r}}async createTextureFromImage(t,e){const i=new Image;await new Promise((t=>{i.src=`data:image/jpeg;base64,${e.data}`,i.onload=t;}));const a=t.createTexture();return t.bindTexture(t.TEXTURE_2D,a),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,i),a}getOrientationFlags(){return this.uiManager.isPortrait()?{flip:1,rotate:3}:{flip:2,rotate:0}}shouldCorrectJump(t){return this.deviceManager.os===DeviceManager.OS.Android&&this.started&&this.lastPose&&!this.jumpPose&&this.hasLargeRotationChange(t)}hasLargeRotationChange(t){return 2*Math.acos(Math.abs((new Quaternion).setFromRotationMatrix(t).dot((new Quaternion).setFromRotationMatrix(this.lastPose))))>1}correctJump(t){this.jumpPose||(this.jumpPose=t.clone());const e=this.jumpPose.clone().invert().multiply(t);return this.lastPose.clone().multiply(e)}getGLState(t){return {readFramebuffer:t.getParameter(t.READ_FRAMEBUFFER_BINDING),drawFramebuffer:t.getParameter(t.DRAW_FRAMEBUFFER_BINDING),texture:t.getParameter(t.TEXTURE_BINDING_2D)}}restoreGLState(t,e){t.bindFramebuffer(t.READ_FRAMEBUFFER,e.readFramebuffer),t.bindFramebuffer(t.DRAW_FRAMEBUFFER,e.drawFramebuffer),t.bindTexture(t.TEXTURE_2D,e.texture);}checkTrackingCalibration(t){if(this.isCalibrated)return;if(!this.initialCalibrationPose)return void(this.initialCalibrationPose=t.clone());const e=t.extractPosition(),i=this.initialCalibrationPose.extractPosition();e.distanceTo(i)>TrackingCalibrationTranslationThreshold&&(this.isCalibrated=!0,this.onTrackingCalibrated&&this.onTrackingCalibrated());}fitCanvasToXRViewport(){if(this.xrLastPose){const t=this.xrLastPose.views[0],e=this.xrLayer.getViewport(t);if((e.width>e.height&&window.innerWidth>window.innerHeight||e.width<=e.height&&window.innerWidth<=window.innerHeight)&&e.width*e.height>window.innerWidth*window.innerHeight)this.uiManager.renderCanvas.width=e.width,this.uiManager.renderCanvas.height=e.height;else {this.uiManager.renderCanvas.width=window.innerWidth;const t=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--sat"),10)||0,e=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--sab"),10)||0,i=window.innerHeight+t+e;this.uiManager.renderCanvas.height=i;}}}getCameraParameters(){let t=60,e=9/16;if(this.xrSession&&this.xrLastPose){const i=this.xrLastPose.views[0].projectionMatrix;e=this.uiManager.renderCanvas.width/this.uiManager.renderCanvas.height,t=radToDeg(2*Math.atan(1/i[5]));}return {fov:t,aspect:e}}getXRLayer(){return this.xrLayer}getXRInputCoords(t){const e=t.inputSource.gamepad.axes;return new Vector2(e[0],-e[1])}getNormalizedTouchCoords(t){const e=new Vector2,i=this.uiManager.renderCanvas.getBoundingClientRect();return null!=t.clientX?(e.x=(t.clientX-i.left)/i.width*2-1,e.y=-(t.clientY-i.top)/i.height*2+1):t.touches[0]?(e.x=t.touches[0].clientX/window.innerWidth*2-1,e.y=-t.touches[0].clientY/window.innerHeight*2+1):(e.x=t.changedTouches[0].clientX/window.innerWidth*2-1,e.y=-t.changedTouches[0].clientY/window.innerHeight*2+1),e}setResizeListener(t){this.onResize=t;}setTouchListener(t){this.onTouch=t;}setTouchStartListener(t){this.onTouchStart=t;}setTouchMoveListener(t){this.onTouchMove=t;}setTouchEndListener(t){this.onTouchEnd=t;}setSessionEndListener(t){this.onSessionEnd=t;}setHitTestListener(t){this.onHitTestResult=t;}setFrameListener(t){this.onFrame=t;}setHitTestStallListener(t){this.onHitTestStall=t;}setRequestStallTimeout(t){this.requestStallTime=t;}setHitTestStallTimeout(t){this.hitTestStallTime=t;}setTrackingCalibratedListener(t){this.onTrackingCalibrated=t;}resetCalibration(){this.initialCalibrationPose=null,this.isCalibrated=!1;}}
|
54
54
|
|