@interncom/diplomatic 0.21.1 → 0.22.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.
@@ -1 +1 @@
1
- function hi(t){let e=t.length,n=0,s=0;while(s<e){let i=t.charCodeAt(s++);if((i&4294967168)===0){n++;continue}else if((i&4294965248)===0)n+=2;else{if(i>=55296&&i<=56319){if(s<e){let r=t.charCodeAt(s);if((r&64512)===56320)++s,i=((i&1023)<<10)+(r&1023)+65536}}if((i&4294901760)===0)n+=3;else n+=4}}return n}function co(t,e,n){let s=t.length,i=n,r=0;while(r<s){let o=t.charCodeAt(r++);if((o&4294967168)===0){e[i++]=o;continue}else if((o&4294965248)===0)e[i++]=o>>6&31|192;else{if(o>=55296&&o<=56319){if(r<s){let l=t.charCodeAt(r);if((l&64512)===56320)++r,o=((o&1023)<<10)+(l&1023)+65536}}if((o&4294901760)===0)e[i++]=o>>12&15|224,e[i++]=o>>6&63|128;else e[i++]=o>>18&7|240,e[i++]=o>>12&63|128,e[i++]=o>>6&63|128}e[i++]=o&63|128}}var ao=new TextEncoder,uo=50;function po(t,e,n){ao.encodeInto(t,e.subarray(n))}function yi(t,e,n){if(t.length>uo)po(t,e,n);else co(t,e,n)}var mo=4096;function En(t,e,n){let s=e,i=s+n,r=[],o="";while(s<i){let l=t[s++];if((l&128)===0)r.push(l);else if((l&224)===192){let c=t[s++]&63;r.push((l&31)<<6|c)}else if((l&240)===224){let c=t[s++]&63,d=t[s++]&63;r.push((l&31)<<12|c<<6|d)}else if((l&248)===240){let c=t[s++]&63,d=t[s++]&63,u=t[s++]&63,p=(l&7)<<18|c<<12|d<<6|u;if(p>65535)p-=65536,r.push(p>>>10&1023|55296),p=56320|p&1023;r.push(p)}else r.push(l);if(r.length>=mo)o+=String.fromCharCode(...r),r.length=0}if(r.length>0)o+=String.fromCharCode(...r);return o}var ho=new TextDecoder,yo=200;function Zo(t,e,n){let s=t.subarray(e,e+n);return ho.decode(s)}function Zi(t,e,n){if(n>yo)return Zo(t,e,n);else return En(t,e,n)}class se{type;data;constructor(t,e){this.type=t,this.data=e}}class lt extends Error{constructor(t){super(t);let e=Object.create(lt.prototype);Object.setPrototypeOf(this,e),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:lt.name})}}var ie=4294967295;function bi(t,e,n){let s=n/4294967296,i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Fe(t,e,n){let s=Math.floor(n/4294967296),i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Qe(t,e){let n=t.getInt32(e),s=t.getUint32(e+4);return n*4294967296+s}function Xi(t,e){let n=t.getUint32(e),s=t.getUint32(e+4);return n*4294967296+s}var bo=-1,Xo=4294967295,Go=17179869183;function fo({sec:t,nsec:e}){if(t>=0&&e>=0&&t<=Go)if(e===0&&t<=Xo){let n=new Uint8Array(4);return new DataView(n.buffer).setUint32(0,t),n}else{let n=t/4294967296,s=t&4294967295,i=new Uint8Array(8),r=new DataView(i.buffer);return r.setUint32(0,e<<2|n&3),r.setUint32(4,s),i}else{let n=new Uint8Array(12),s=new DataView(n.buffer);return s.setUint32(0,e),Fe(s,4,t),n}}function Vo(t){let e=t.getTime(),n=Math.floor(e/1000),s=(e-n*1000)*1e6,i=Math.floor(s/1e9);return{sec:n+i,nsec:s-i*1e9}}function Io(t){if(t instanceof Date){let e=Vo(t);return fo(e)}else return null}function So(t){let e=new DataView(t.buffer,t.byteOffset,t.byteLength);switch(t.byteLength){case 4:{let n=e.getUint32(0),s=0;return{sec:n,nsec:0}}case 8:{let n=e.getUint32(0),s=e.getUint32(4),i=(n&3)*4294967296+s,r=n>>>2;return{sec:i,nsec:r}}case 12:{let n=Qe(e,4),s=e.getUint32(0);return{sec:n,nsec:s}}default:throw new lt(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${t.length}`)}}function Wo(t){let e=So(t);return new Date(e.sec*1000+e.nsec/1e6)}var Gi={type:bo,encode:Io,decode:Wo};class re{static defaultCodec=new re;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(Gi)}register({type:t,encode:e,decode:n}){if(t>=0)this.encoders[t]=e,this.decoders[t]=n;else{let s=-1-t;this.builtInEncoders[s]=e,this.builtInDecoders[s]=n}}tryToEncode(t,e){for(let n=0;n<this.builtInEncoders.length;n++){let s=this.builtInEncoders[n];if(s!=null){let i=s(t,e);if(i!=null){let r=-1-n;return new se(r,i)}}}for(let n=0;n<this.encoders.length;n++){let s=this.encoders[n];if(s!=null){let i=s(t,e);if(i!=null)return new se(n,i)}}if(t instanceof se)return t;return null}decode(t,e,n){let s=e<0?this.builtInDecoders[-1-e]:this.decoders[e];if(s)return s(t,e,n);else return new se(e,t)}}function go(t){return t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer}function Ie(t){if(t instanceof Uint8Array)return t;else if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);else if(go(t))return new Uint8Array(t);else return Uint8Array.from(t)}var Ko=100,xo=2048;class ve{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??re.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.maxDepth=t?.maxDepth??Ko,this.initialBufferSize=t?.initialBufferSize??xo,this.sortKeys=t?.sortKeys??!1,this.forceFloat32=t?.forceFloat32??!1,this.ignoreUndefined=t?.ignoreUndefined??!1,this.forceIntegerToFloat=t?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new ve({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,maxDepth:this.maxDepth,initialBufferSize:this.initialBufferSize,sortKeys:this.sortKeys,forceFloat32:this.forceFloat32,ignoreUndefined:this.ignoreUndefined,forceIntegerToFloat:this.forceIntegerToFloat})}reinitializeState(){this.pos=0}encodeSharedRef(t){if(this.entered)return this.clone().encodeSharedRef(t);try{return this.entered=!0,this.reinitializeState(),this.doEncode(t,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(t){if(this.entered)return this.clone().encode(t);try{return this.entered=!0,this.reinitializeState(),this.doEncode(t,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(t,e){if(e>this.maxDepth)throw Error(`Too deep objects in depth ${e}`);if(t==null)this.encodeNil();else if(typeof t==="boolean")this.encodeBoolean(t);else if(typeof t==="number")if(!this.forceIntegerToFloat)this.encodeNumber(t);else this.encodeNumberAsFloat(t);else if(typeof t==="string")this.encodeString(t);else if(this.useBigInt64&&typeof t==="bigint")this.encodeBigInt64(t);else this.encodeObject(t,e)}ensureBufferSizeToWrite(t){let e=this.pos+t;if(this.view.byteLength<e)this.resizeBuffer(e*2)}resizeBuffer(t){let e=new ArrayBuffer(t),n=new Uint8Array(e),s=new DataView(e);n.set(this.bytes),this.view=s,this.bytes=n}encodeNil(){this.writeU8(192)}encodeBoolean(t){if(t===!1)this.writeU8(194);else this.writeU8(195)}encodeNumber(t){if(!this.forceIntegerToFloat&&Number.isSafeInteger(t))if(t>=0)if(t<128)this.writeU8(t);else if(t<256)this.writeU8(204),this.writeU8(t);else if(t<65536)this.writeU8(205),this.writeU16(t);else if(t<4294967296)this.writeU8(206),this.writeU32(t);else if(!this.useBigInt64)this.writeU8(207),this.writeU64(t);else this.encodeNumberAsFloat(t);else if(t>=-32)this.writeU8(224|t+32);else if(t>=-128)this.writeU8(208),this.writeI8(t);else if(t>=-32768)this.writeU8(209),this.writeI16(t);else if(t>=-2147483648)this.writeU8(210),this.writeI32(t);else if(!this.useBigInt64)this.writeU8(211),this.writeI64(t);else this.encodeNumberAsFloat(t);else this.encodeNumberAsFloat(t)}encodeNumberAsFloat(t){if(this.forceFloat32)this.writeU8(202),this.writeF32(t);else this.writeU8(203),this.writeF64(t)}encodeBigInt64(t){if(t>=BigInt(0))this.writeU8(207),this.writeBigUint64(t);else this.writeU8(211),this.writeBigInt64(t)}writeStringHeader(t){if(t<32)this.writeU8(160+t);else if(t<256)this.writeU8(217),this.writeU8(t);else if(t<65536)this.writeU8(218),this.writeU16(t);else if(t<4294967296)this.writeU8(219),this.writeU32(t);else throw Error(`Too long string: ${t} bytes in UTF-8`)}encodeString(t){let n=hi(t);this.ensureBufferSizeToWrite(5+n),this.writeStringHeader(n),yi(t,this.bytes,this.pos),this.pos+=n}encodeObject(t,e){let n=this.extensionCodec.tryToEncode(t,this.context);if(n!=null)this.encodeExtension(n);else if(Array.isArray(t))this.encodeArray(t,e);else if(ArrayBuffer.isView(t))this.encodeBinary(t);else if(typeof t==="object")this.encodeMap(t,e);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply(t)}`)}encodeBinary(t){let e=t.byteLength;if(e<256)this.writeU8(196),this.writeU8(e);else if(e<65536)this.writeU8(197),this.writeU16(e);else if(e<4294967296)this.writeU8(198),this.writeU32(e);else throw Error(`Too large binary: ${e}`);let n=Ie(t);this.writeU8a(n)}encodeArray(t,e){let n=t.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else if(n<4294967296)this.writeU8(221),this.writeU32(n);else throw Error(`Too large array: ${n}`);for(let s of t)this.doEncode(s,e+1)}countWithoutUndefined(t,e){let n=0;for(let s of e)if(t[s]!==void 0)n++;return n}encodeMap(t,e){let n=Object.keys(t);if(this.sortKeys)n.sort();let s=this.ignoreUndefined?this.countWithoutUndefined(t,n):n.length;if(s<16)this.writeU8(128+s);else if(s<65536)this.writeU8(222),this.writeU16(s);else if(s<4294967296)this.writeU8(223),this.writeU32(s);else throw Error(`Too large map object: ${s}`);for(let i of n){let r=t[i];if(!(this.ignoreUndefined&&r===void 0))this.encodeString(i),this.doEncode(r,e+1)}}encodeExtension(t){if(typeof t.data==="function"){let n=t.data(this.pos+6),s=n.length;if(s>=4294967296)throw Error(`Too large extension object: ${s}`);this.writeU8(201),this.writeU32(s),this.writeI8(t.type),this.writeU8a(n);return}let e=t.data.length;if(e===1)this.writeU8(212);else if(e===2)this.writeU8(213);else if(e===4)this.writeU8(214);else if(e===8)this.writeU8(215);else if(e===16)this.writeU8(216);else if(e<256)this.writeU8(199),this.writeU8(e);else if(e<65536)this.writeU8(200),this.writeU16(e);else if(e<4294967296)this.writeU8(201),this.writeU32(e);else throw Error(`Too large extension object: ${e}`);this.writeI8(t.type),this.writeU8a(t.data)}writeU8(t){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,t),this.pos++}writeU8a(t){let e=t.length;this.ensureBufferSizeToWrite(e),this.bytes.set(t,this.pos),this.pos+=e}writeI8(t){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,t),this.pos++}writeU16(t){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,t),this.pos+=2}writeI16(t){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,t),this.pos+=2}writeU32(t){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,t),this.pos+=4}writeI32(t){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,t),this.pos+=4}writeF32(t){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,t),this.pos+=4}writeF64(t){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,t),this.pos+=8}writeU64(t){this.ensureBufferSizeToWrite(8),bi(this.view,this.pos,t),this.pos+=8}writeI64(t){this.ensureBufferSizeToWrite(8),Fe(this.view,this.pos,t),this.pos+=8}writeBigUint64(t){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,t),this.pos+=8}writeBigInt64(t){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,t),this.pos+=8}}function Ft(t,e){return new ve(e).encodeSharedRef(t)}function De(t){return`${t<0?"-":""}0x${Math.abs(t).toString(16).padStart(2,"0")}`}var Ro=16,Co=16;class Fn{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(t=Ro,e=Co){this.maxKeyLength=t,this.maxLengthPerKey=e,this.caches=[];for(let n=0;n<this.maxKeyLength;n++)this.caches.push([])}canBeCached(t){return t>0&&t<=this.maxKeyLength}find(t,e,n){let s=this.caches[n-1];t:for(let i of s){let r=i.bytes;for(let o=0;o<n;o++)if(r[o]!==t[e+o])continue t;return i.str}return null}store(t,e){let n=this.caches[t.length-1],s={bytes:t,str:e};if(n.length>=this.maxLengthPerKey)n[Math.random()*n.length|0]=s;else n.push(s)}decode(t,e,n){let s=this.find(t,e,n);if(s!=null)return this.hit++,s;this.miss++;let i=En(t,e,n),r=Uint8Array.prototype.slice.call(t,e,e+n);return this.store(r,i),i}}var Qn="array",We="map_key",Vi="map_value",Ho=(t)=>{if(typeof t==="string"||typeof t==="number")return t;throw new lt("The type of key must be string or number but "+typeof t)};class Ii{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(t){let e=this.getUninitializedStateFromPool();e.type=Qn,e.position=0,e.size=t,e.array=Array(t)}pushMapState(t){let e=this.getUninitializedStateFromPool();e.type=We,e.readCount=0,e.size=t,e.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let t={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(t)}return this.stack[this.stackHeadPosition]}release(t){if(this.stack[this.stackHeadPosition]!==t)throw Error("Invalid stack state. Released state is not on top of the stack.");if(t.type===Qn){let n=t;n.size=0,n.array=void 0,n.position=0,n.type=void 0}if(t.type===We||t.type===Vi){let n=t;n.size=0,n.map=void 0,n.readCount=0,n.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}}var Se=-1,vn=new DataView(new ArrayBuffer(0)),Yo=new Uint8Array(vn.buffer);try{vn.getInt8(0)}catch(t){if(!(t instanceof RangeError))throw Error("This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access")}var fi=RangeError("Insufficient data"),To=new Fn;class Oe{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=vn;bytes=Yo;headByte=Se;stack=new Ii;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??re.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.rawStrings=t?.rawStrings??!1,this.maxStrLength=t?.maxStrLength??ie,this.maxBinLength=t?.maxBinLength??ie,this.maxArrayLength=t?.maxArrayLength??ie,this.maxMapLength=t?.maxMapLength??ie,this.maxExtLength=t?.maxExtLength??ie,this.keyDecoder=t?.keyDecoder!==void 0?t.keyDecoder:To,this.mapKeyConverter=t?.mapKeyConverter??Ho}clone(){return new Oe({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=Se,this.stack.reset()}setBuffer(t){let e=Ie(t);this.bytes=e,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.pos=0}appendBuffer(t){if(this.headByte===Se&&!this.hasRemaining(1))this.setBuffer(t);else{let e=this.bytes.subarray(this.pos),n=Ie(t),s=new Uint8Array(e.length+n.length);s.set(e),s.set(n,e.length),this.setBuffer(s)}}hasRemaining(t){return this.view.byteLength-this.pos>=t}createExtraByteError(t){let{view:e,pos:n}=this;return RangeError(`Extra ${e.byteLength-n} of ${e.byteLength} byte(s) found at buffer[${t}]`)}decode(t){if(this.entered)return this.clone().decode(t);try{this.entered=!0,this.reinitializeState(),this.setBuffer(t);let e=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return e}finally{this.entered=!1}}*decodeMulti(t){if(this.entered){yield*this.clone().decodeMulti(t);return}try{this.entered=!0,this.reinitializeState(),this.setBuffer(t);while(this.hasRemaining(1))yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(t){if(this.entered)return this.clone().decodeAsync(t);try{this.entered=!0;let e=!1,n;for await(let o of t){if(e)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(o);try{n=this.doDecodeSync(),e=!0}catch(l){if(!(l instanceof RangeError))throw l}this.totalPos+=this.pos}if(e){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:s,pos:i,totalPos:r}=this;throw RangeError(`Insufficient data in parsing ${De(s)} at ${r} (${i} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(t){return this.decodeMultiAsync(t,!0)}decodeStream(t){return this.decodeMultiAsync(t,!1)}async*decodeMultiAsync(t,e){if(this.entered){yield*this.clone().decodeMultiAsync(t,e);return}try{this.entered=!0;let n=e,s=-1;for await(let i of t){if(e&&s===0)throw this.createExtraByteError(this.totalPos);if(this.appendBuffer(i),n)s=this.readArraySize(),n=!1,this.complete();try{while(!0)if(yield this.doDecodeSync(),--s===0)break}catch(r){if(!(r instanceof RangeError))throw r}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){t:while(!0){let t=this.readHeadByte(),e;if(t>=224)e=t-256;else if(t<192)if(t<128)e=t;else if(t<144){let s=t-128;if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t<160){let s=t-144;if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else{let s=t-160;e=this.decodeString(s,0)}else if(t===192)e=null;else if(t===194)e=!1;else if(t===195)e=!0;else if(t===202)e=this.readF32();else if(t===203)e=this.readF64();else if(t===204)e=this.readU8();else if(t===205)e=this.readU16();else if(t===206)e=this.readU32();else if(t===207)if(this.useBigInt64)e=this.readU64AsBigInt();else e=this.readU64();else if(t===208)e=this.readI8();else if(t===209)e=this.readI16();else if(t===210)e=this.readI32();else if(t===211)if(this.useBigInt64)e=this.readI64AsBigInt();else e=this.readI64();else if(t===217){let s=this.lookU8();e=this.decodeString(s,1)}else if(t===218){let s=this.lookU16();e=this.decodeString(s,2)}else if(t===219){let s=this.lookU32();e=this.decodeString(s,4)}else if(t===220){let s=this.readU16();if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else if(t===221){let s=this.readU32();if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else if(t===222){let s=this.readU16();if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t===223){let s=this.readU32();if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t===196){let s=this.lookU8();e=this.decodeBinary(s,1)}else if(t===197){let s=this.lookU16();e=this.decodeBinary(s,2)}else if(t===198){let s=this.lookU32();e=this.decodeBinary(s,4)}else if(t===212)e=this.decodeExtension(1,0);else if(t===213)e=this.decodeExtension(2,0);else if(t===214)e=this.decodeExtension(4,0);else if(t===215)e=this.decodeExtension(8,0);else if(t===216)e=this.decodeExtension(16,0);else if(t===199){let s=this.lookU8();e=this.decodeExtension(s,1)}else if(t===200){let s=this.lookU16();e=this.decodeExtension(s,2)}else if(t===201){let s=this.lookU32();e=this.decodeExtension(s,4)}else throw new lt(`Unrecognized type byte: ${De(t)}`);this.complete();let n=this.stack;while(n.length>0){let s=n.top();if(s.type===Qn)if(s.array[s.position]=e,s.position++,s.position===s.size)e=s.array,n.release(s);else continue t;else if(s.type===We){if(e==="__proto__")throw new lt("The key __proto__ is not allowed");s.key=this.mapKeyConverter(e),s.type=Vi;continue t}else if(s.map[s.key]=e,s.readCount++,s.readCount===s.size)e=s.map,n.release(s);else{s.key=null,s.type=We;continue t}}return e}}readHeadByte(){if(this.headByte===Se)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=Se}readArraySize(){let t=this.readHeadByte();switch(t){case 220:return this.readU16();case 221:return this.readU32();default:if(t<160)return t-144;else throw new lt(`Unrecognized array type byte: ${De(t)}`)}}pushMapState(t){if(t>this.maxMapLength)throw new lt(`Max length exceeded: map length (${t}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(t)}pushArrayState(t){if(t>this.maxArrayLength)throw new lt(`Max length exceeded: array length (${t}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(t)}decodeString(t,e){if(!this.rawStrings||this.stateIsMapKey())return this.decodeUtf8String(t,e);return this.decodeBinary(t,e)}decodeUtf8String(t,e){if(t>this.maxStrLength)throw new lt(`Max length exceeded: UTF-8 byte length (${t}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+e+t)throw fi;let n=this.pos+e,s;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(t))s=this.keyDecoder.decode(this.bytes,n,t);else s=Zi(this.bytes,n,t);return this.pos+=e+t,s}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===We;return!1}decodeBinary(t,e){if(t>this.maxBinLength)throw new lt(`Max length exceeded: bin length (${t}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(t+e))throw fi;let n=this.pos+e,s=this.bytes.subarray(n,n+t);return this.pos+=e+t,s}decodeExtension(t,e){if(t>this.maxExtLength)throw new lt(`Max length exceeded: ext length (${t}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+e),s=this.decodeBinary(t,e+1);return this.extensionCodec.decode(s,n,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let t=this.view.getUint8(this.pos);return this.pos++,t}readI8(){let t=this.view.getInt8(this.pos);return this.pos++,t}readU16(){let t=this.view.getUint16(this.pos);return this.pos+=2,t}readI16(){let t=this.view.getInt16(this.pos);return this.pos+=2,t}readU32(){let t=this.view.getUint32(this.pos);return this.pos+=4,t}readI32(){let t=this.view.getInt32(this.pos);return this.pos+=4,t}readU64(){let t=Xi(this.view,this.pos);return this.pos+=8,t}readI64(){let t=Qe(this.view,this.pos);return this.pos+=8,t}readU64AsBigInt(){let t=this.view.getBigUint64(this.pos);return this.pos+=8,t}readI64AsBigInt(){let t=this.view.getBigInt64(this.pos);return this.pos+=8,t}readF32(){let t=this.view.getFloat32(this.pos);return this.pos+=4,t}readF64(){let t=this.view.getFloat64(this.pos);return this.pos+=8,t}}function Dn(t,e){return new Oe(e).decode(t)}class Lt{listeners=new Map;addEventListener(t,e){let n=this.listeners.get(t);if(!n)n=new Set,this.listeners.set(t,n);return n.add(e),()=>{this.removeEventListener(t,e)}}removeEventListener(t,e){let n=this.listeners.get(t);if(n){if(n.delete(e),n.size===0)this.listeners.delete(t)}}emit(t,e){let n=this.listeners.get(t);if(n){let s=Array.from(n);for(let i of s)i(e)}}emitAll(t){let e=Array.from(this.listeners.keys());for(let n of e)this.emit(n,t)}}class ft{getter;static eventName="update";emitter;constructor(t){this.getter=t;this.emitter=new Lt}get=()=>this.getter();async emit(){let t=await this.getter();queueMicrotask(()=>this.emitter.emit(ft.eventName,t))}listen(t){return this.emitter.addEventListener(ft.eventName,t),()=>{this.emitter.removeEventListener(ft.eventName,t)}}}var Mt=64;var Si=32,wt=8;var je=32;var Wi=30000,gi=512,g;((V)=>{V[V.Success=0]="Success";V[V.InvalidSignature=3]="InvalidSignature";V[V.ClockOutOfSync=4]="ClockOutOfSync";V[V.UserNotRegistered=5]="UserNotRegistered";V[V.ServerMisconfigured=6]="ServerMisconfigured";V[V.MissingBody=7]="MissingBody";V[V.ExtraBodyContent=8]="ExtraBodyContent";V[V.MissingParam=9]="MissingParam";V[V.InvalidParam=10]="InvalidParam";V[V.InvalidRequest=11]="InvalidRequest";V[V.InternalError=12]="InternalError";V[V.NotFound=13]="NotFound";V[V.InvalidMessage=14]="InvalidMessage";V[V.NoChange=15]="NoChange";V[V.DatabaseClosed=16]="DatabaseClosed";V[V.StorageError=17]="StorageError";V[V.DatabaseError=18]="DatabaseError";V[V.HashMismatch=19]="HashMismatch";V[V.DecryptionError=20]="DecryptionError";V[V.NotImplemented=21]="NotImplemented";V[V.MissingSeed=22]="MissingSeed";V[V.OutOfBounds=23]="OutOfBounds";V[V.HostError=24]="HostError";V[V.CommunicationError=25]="CommunicationError";V[V.VarLimitExceeded=26]="VarLimitExceeded";V[V.InvalidResponse=27]="InvalidResponse";V[V.ConnectionClosed=28]="ConnectionClosed";V[V.CryptoError=29]="CryptoError";V[V.WebAuthnError=30]="WebAuthnError"})(g||={});function m(t){return[t,0]}function a(t){return[void 0,t]}function ko(t){if(t<0)console.info("N",t),console.trace();if(typeof t!=="bigint")t=BigInt(t);if(t<0n)return a(10);let e=[];while(t>0n){let n=Number(t&0x7fn);if(t>>=7n,t>0n)e.push(n|128);else e.push(n)}if(e.length===0)return m(new Uint8Array([0]));if(e.length>8)return a(26);return m(new Uint8Array(e))}function Lo(t,e=0){let n=0n,s=0,i=e;while(!0){if(i>=t.length)return a(14);let r=t[i++];if(r===void 0)return a(14);if(n|=BigInt(r&127)<<BigInt(s),(r&128)===0){if(i-e>8)return a(26);return m({value:n>0x1fffffffffffffn?n:Number(n),bytesRead:i-e})}if(s+=7,s>=56)return a(26)}}class U{data;pos=0;constructor(t){this.data=t}static async fromResponse(t){let e=await t.arrayBuffer(),n=new Uint8Array(e);return new U(n)}readBigInt(){if(this.pos+8>this.data.length)return a(7);let t=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,m(t)}readDate(){let[t,e]=this.readVarInt();if(e!==0)return a(e);return m(new Date(t))}readVarInt(){let[t,e]=Lo(this.data,this.pos);if(e!==0)return a(e);this.pos+=t.bytesRead;let n=t.value;return m(typeof n==="bigint"?Number(n):n)}readVarString(){let[t,e]=this.readVarInt();if(e!==0)return a(e);let[n,s]=this.readBytes(t);if(s!==0)return a(s);let i=new TextDecoder().decode(n);return m(i)}readBytes(t){if(t<0)return a(10);if(this.pos+t>this.data.length)return a(23);let e=this.data.slice(this.pos,this.pos+t);return this.pos+=t,m(e)}readVarBytes(){let[t,e]=this.readVarInt();if(e!==0)return a(e);return this.readBytes(t)}readStruct(t){return t.decode(this)}readStructs(t){let e=[];while(!this.done()){let[n,s]=this.readStruct(t);if(s!==0)return a(s);e.push(n)}return m(e)}readBytesSeq(t){let e=[];while(!this.done()){let[n,s]=this.readBytes(t);if(s!==0)return a(s);e.push(n)}return m(e)}done(){return this.pos>=this.data.length}consumed(){return this.pos}}class N{parts=[];writeBigInt(t){let e=new Uint8Array(8);new DataView(e.buffer).setBigUint64(0,t,!1),this.parts.push(e)}writeDate(t){let e=t.getTime();return this.writeVarInt(e)}writeVarInt(t){let[e,n]=ko(t);if(n!==0)return n;return this.parts.push(e),0}writeVarString(t){let e=new TextEncoder().encode(t),n=this.writeVarInt(e.length);if(n!==0)return n;return this.writeBytes(e),0}prependBytes(t){this.parts.unshift(t.slice())}writeBytes(t){this.parts.push(t.slice())}writeVarBytes(t){let e=this.writeVarInt(t.length);if(e!==0)return e;return this.writeBytes(t),0}writeStruct(t,e){return t.encode(this,e)}writeStructs(t,e){for(let n of e){let s=this.writeStruct(t,n);if(s!==0)return s}return 0}writeBytesSeq(t){for(let e of t)this.writeBytes(e)}result(){let t=this.parts.reduce((s,i)=>s+i.length,0),e=new Uint8Array(t),n=0;for(let s of this.parts)e.set(s,n),n+=s.length;return e}wipe(){for(let t of this.parts)t.fill(0);this.parts.length=0}*scan(){for(let t of this.parts)yield t}}async function On(t,e){let n=new N,s=n.writeDate(e);if(s!==0)return a(s);let i=n.result(),r=await t.sign(i);return m({pubKey:t.publicKey,sig:r,timestamp:e})}async function Pt(t,e,n){let s=n.now().getTime(),i=t.timestamp.getTime();if(Math.abs(s-i)>Wi)return 4;let o=new N;o.writeDate(t.timestamp);let l=o.result();if(!await e.checkSigEd25519(t.sig,l,t.pubKey))return 3;return 0}var et={encode(t,e){let n=t.writeVarBytes(e.id);if(n!==0)return n;let s=t.writeDate(e.ts);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return a(n);let[s,i]=t.readDate();if(i!==0)return a(i);return m({id:e,ts:s})}};function oe(t){let e=new N,n=e.writeStruct(et,t);if(n!==0)return a(n);let s=e.result();return m(s)}async function Mo(t){return oe({id:t,ts:new Date(0)})}var yt={encode(t,e){let n=t.writeVarString(e.typ??"");if(n!==0)return n;let s=t.writeVarBytes(e.eid);if(s!==0)return s;let i=t.writeVarInt(e.off);if(i!==0)return i;let r=t.writeVarInt(e.ctr);if(r!==0)return r;let o=t.writeVarInt(e.len);if(o!==0)return o;if(e.hsh)t.writeBytes(e.hsh);return 0},decode(t){let[e,n]=t.readVarString();if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let r=new U(s),[,o]=et.decode(r);if(o!==0)return a(o);let[l,c]=t.readVarInt();if(c!==0)return a(c);let[d,u]=t.readVarInt();if(u!==0)return a(u);let[p,h]=t.readVarInt();if(h!==0)return a(h);let y;if(p>0){let[Z,b]=t.readBytes(je);if(b!==0)return a(b);y=Z}return m({typ:e,eid:s,off:l,ctr:d,len:p,hsh:y})}};function pt(t){return Array.from(t).map((n)=>n.toString(16).padStart(2,"0")).join("")}function ge(t){if(t.length%2!==0)throw Error("Invalid hex string");let e=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2)e[n/2]=Number.parseInt(t.substr(n,2),16);return e}function F(t,e){if(t===e)return!0;if(t.byteLength!==e.byteLength)return!1;return t.every((n,s)=>n===e[s])}var Y;if(typeof Uint8Array.prototype.toBase64==="function")Y=(t)=>t.toBase64();else Y=(t)=>btoa(String.fromCharCode(...t));var rt;if(typeof Uint8Array.fromBase64==="function")rt=(t)=>Uint8Array.fromBase64(t);else rt=(t)=>Uint8Array.from(atob(t),(e)=>e.charCodeAt(0));function wo(t){return Y(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function jn(t){let e=t.length%4===0?"":"=".repeat(4-t.length%4),n=t.replace(/-/g,"+").replace(/_/g,"/")+e;return rt(n)}function Vt(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}function Ki(t,e,n){return n.checkSigEd25519(t.sig,t.headCph,e)}async function xi(t,e,n,s){let i;if(t.bod&&t.len>0)i=await n.blake3(t.bod);let r=new N,o=yt.encode(r,{...t,hsh:i});if(o!==0)return a(o);let l=r.result(),c=await e.kdmFor(l),d=s.deriveCipher(c,"encrypt"),u=await d.encrypt(l),p=t.bod?await d.encrypt(t.bod):new Uint8Array(0),h=await e.sign(u);return m({sig:h,kdm:c,headCph:u,bodyCph:p})}async function An(t,e,n,s,i){let r=new U(t),[o,l]=yt.decode(r);if(l!==0)return a(14);let c;try{c=e&&e.length>0?await n.decrypt(e):void 0}catch{return a(20)}let d=o.hsh&&c===void 0,u=o.hsh===void 0&&c!==void 0;if(d||u)return a(19);if(o.hsh&&c){let h=await s.blake3(c);if(!F(h,o.hsh))return a(19)}let p=i??await s.blake3(t);return m({msgHead:o,bod:c,headHash:p})}class Ut{now(){return new Date}}function Ri(t,e,n,s){let i=e.getTime()-t.getTime(),r=n.getTime()-s.getTime();return(i+r)/2}var Ke={encode(t,e){if(t.writeVarInt(e.quota),e.quota>0){if(e.usage===void 0)return 9;t.writeVarInt(e.usage)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let s;if(e>0){let[i,r]=t.readVarInt();if(r!==0)return a(r);s=i}return m({quota:e,usage:s})}};var qn={encode(t,e){t.writeBytes(new Uint8Array([e.status]));let n=t.writeDate(e.timeRcvd);if(n!==0)return n;let s=t.writeDate(e.timeSent);if(s!==0)return s;let i=t.writeVarInt(e.subscription.term);if(i!==0)return i;let r=t.writeVarInt(e.subscription.elapsed);if(r!==0)return r;let o=t.writeStruct(Ke,e.subscription.stat);if(o!==0)return o;let l=t.writeStruct(Ke,e.subscription.dyn);if(l!==0)return l;return 0},decode(t){let[e,n]=t.readBytes(1);if(n!==0)return a(n);let s=e[0],[i,r]=t.readDate();if(r!==0)return a(r);let[o,l]=t.readDate();if(l!==0)return a(l);let[c,d]=t.readVarInt();if(d!==0)return a(d);let[u,p]=t.readVarInt();if(p!==0)return a(p);let[h,y]=t.readStruct(Ke);if(y!==0)return a(y);let[Z,b]=t.readStruct(Ke);if(b!==0)return a(b);return m({status:s,timeRcvd:i,timeSent:o,subscription:{term:c,elapsed:u,stat:h,dyn:Z}})}};var _n={encode(t,e){let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.seq);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return a(n);let[s,i]=t.readVarInt();if(i!==0)return a(i);return m({headCph:e,seq:s})}};var mt={encode(t,e){t.writeBytes(e.pubKey),t.writeBytes(e.sig);let n=t.writeDate(e.timestamp);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Si);if(n!==0)return a(n);let[s,i]=t.readBytes(Mt);if(i!==0)return a(i);let[r,o]=t.readDate();if(o!==0)return a(o);return m({pubKey:e,sig:s,timestamp:r})}};var Ci={async encodeReq(t,e,n,s,i){let r=i.writeStruct(mt,n);if(r!==0)return r;for(let o of s)i.writeVarInt(o);return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r}=t,[o,l]=e.readStruct(mt);if(l!==0)return l;let c=await Pt(o,i,s);if(c!==0)return c;let{pubKey:d}=o,[u,p]=await r.hasUser(d);if(p!==0)return p;if(!u)return 5;let[h,y]=e.readVarInt();if(y!==0)return y;if(!e.done())return 8;let[Z,b]=await r.listHeads(d,h);if(b!==0)return b;return n.writeStructs(_n,Z)},decodeResp(t){return t.readStructs(_n)}};var $n={encode(t,e){t.writeVarInt(e.seq);let n=t.writeVarBytes(e.bodyCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);return m({seq:e,bodyCph:s})}};var Hi={async encodeReq(t,e,n,s,i){let r=i.writeStruct(mt,n);if(r!==0)return r;for(let o of s){let l=i.writeVarInt(o);if(l!==0)return l}return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r}=t,[o,l]=e.readStruct(mt);if(l!==0)return l;let c=await Pt(o,i,s);if(c!==0)return c;let{pubKey:d}=o,[u,p]=await r.hasUser(d);if(p!==0)return p;if(!u)return 5;let h=[];while(!e.done()){let[b,X]=e.readVarInt();if(X!==0)return X;h.push(b)}console.info(`PULL: ${h.length} bags`);let[y,Z]=await r.getBodies(d,h);if(Z!==0)return Z;if(!y)return 17;for(let{seq:b,bodyCph:X}of y){let I={seq:b,bodyCph:X},f=n.writeStruct($n,I);if(f!==0)return f}return 0},decodeResp(t){return t.readStructs($n)}};var ts={encode(t,e){t.writeBytes(e.sig),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarBytes(e.bodyCph);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readBytes(Mt);if(n!==0)return a(n);let[s,i]=t.readBytes(wt);if(i!==0)return a(i);let[r,o]=t.readVarBytes();if(o!==0)return a(o);let[l,c]=t.readVarBytes();if(c!==0)return a(c);return m({sig:e,kdm:s,headCph:r,bodyCph:l})}};var Ae={encode(t,e){let n=t.writeVarInt(e.seq);if(n!==0)return n;let s=t.writeVarBytes(e.headCph);if(s!==0)return s;let i=e.bodyCph?e.bodyCph.length:0,r=t.writeVarInt(i);if(r!==0)return r;if(i>0){if(!e.bodyCph)return 10;t.writeBytes(e.bodyCph)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let[r,o]=t.readVarInt();if(o!==0)return a(o);let l;if(r>0){let[c,d]=t.readBytes(r);if(d!==0)return a(d);l=c}return m({seq:e,headCph:s,bodyCph:l})}};var qe={encode(t,e){t.writeBytes(e.sig),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Mt);if(n!==0)return a(n);let[s,i]=t.readBytes(wt);if(i!==0)return a(i);let[r,o]=t.readVarBytes();if(o!==0)return a(o);return m({sig:e,kdm:s,headCph:r})}};var _e={encode(t,e){if(t.writeVarInt(e.idx),t.writeBytes(new Uint8Array([e.status])),e.status===0)t.writeVarInt(e.seq);return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let[s,i]=t.readBytes(1);if(i!==0)return a(i);let r=s[0];if(r!==0)return m({idx:e,status:r});let[o,l]=t.readVarInt();if(l!==0)return a(l);return m({idx:e,status:r,seq:o})}};var Yi={async encodeReq(t,e,n,s,i){let r=i.writeStruct(mt,n);if(r!==0)return r;let o=i.writeStructs(ts,s);if(o!==0)return o;return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r,notifier:o}=t,[l,c]=e.readStruct(mt);if(c!==0)return c;let d=await Pt(l,i,s);if(d!==0)return d;let{pubKey:u}=l,[p,h]=await r.hasUser(u);if(h!==0)return h;if(!p)return 5;let[y,Z]=e.readStructs(ts);if(Z!==0)return Z;console.info(`PUSH: ${y.length} bags`);let b=[],X=[];for(let G=0;G<y.length;G++){let W=y[G];if(!await Ki(W,u,i)){let k={idx:G,status:3},L=n.writeStruct(_e,k);if(L!==0)return L;continue}b.push(G),X.push(W)}let[I,f]=await r.setBags(u,X);if(f!==0)return f;if(!I||I.length!==X.length)return 17;let S=[];for(let G=0;G<X.length;G++){let W=X[G],H=b[G],k=I[G],L=new N,x=L.writeStruct(qe,W);if(x!==0)return x;let B=L.result(),J={seq:k,headCph:B};if(y.length===1&&W.bodyCph.length<=gi)J.bodyCph=W.bodyCph;S.push(J);let E={idx:H,status:0,seq:k},V=n.writeStruct(_e,E);if(V!==0)return V}if(S.length>0){let G=new N,W=G.writeStructs(Ae,S);if(W!==0)return W;let H=G.result();await Promise.resolve(o.push(u,H))}return 0},decodeResp(t){return t.readStructs(_e)}};var Ti={async encodeReq(t,e,n,s,i){return i.writeStruct(mt,n)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r}=t,[o,l]=e.readStruct(mt);if(l!==0)return l;let c=await Pt(o,i,s);if(c!==0)return c;let{pubKey:d}=o;if(!e.done())return 8;let[u,p]=await r.addUser(d);if(p!==0)return p;return 0},decodeResp(t){return m(void 0)}};class es{url;websocket;constructor(t){this.url=t}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect(t,e,n=()=>{},s=()=>{}){let{url:i}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let r=new N;r.writeStruct(mt,t);let o=r.result(),l=pt(o);return i.searchParams.set("t",l),this.websocket=new WebSocket(i),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),s()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,n()},this.websocket.onmessage=(c)=>{let d=new Uint8Array(c.data);e(d)},this.websocket.onerror=(c)=>{console.log(`ERROR: ${JSON.stringify(c)}`),this.websocket=void 0,n()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}var nt={user:{path:"/user",endpoint:Ti,name:0},push:{path:"/push",endpoint:Yi,name:2},peek:{path:"/peek",endpoint:Ci,name:1},pull:{path:"/pull",endpoint:Hi,name:3}},Po={0:nt.user,2:nt.push,1:nt.peek,3:nt.pull},Fu={[nt.user.path]:nt.user,[nt.push.path]:nt.push,[nt.peek.path]:nt.peek,[nt.pull.path]:nt.pull};class ns{url;listener;constructor(t){this.url=t;this.listener=new es(t)}async call(t,e){let{path:n}=Po[t],s=new URL(n,this.url);try{return await Uo(s,e)}catch{return a(25)}}}var ss=(t)=>new ns(t.handle);async function Uo(t,e){let n=await fetch(t,{method:"POST",body:e.result().slice()});if(!n.ok)return a(24);let s=await U.fromResponse(n);return m(s)}class $e{enclave;crypto;host;clock;transport;updateHostMeta;constructor(t,e,n,s,i,r){this.enclave=t;this.crypto=e;this.host=n;this.clock=s;this.transport=i;this.updateHostMeta=r}async call(t,e){let{clock:n,transport:s}=this,{endpoint:i,name:r}=t,o=await this.identity(),l=n.now(),[c,d]=await On(o,l);if(d!==0)return a(d);let u=new N,p=await i.encodeReq(this,o,c,e,u);if(p!==0)return a(p);let h=n.now(),[y,Z]=await s.call(r,u),b=n.now();if(Z!==0)return a(Z);let[X,I]=y.readStruct(qn);if(I!==0)return a(I);if(X.status!==0)return a(X.status);let S={clockOffset:Ri(h,X.timeRcvd,X.timeSent,b),subscription:X.subscription},G=await this.updateHostMeta(S);if(G!==0)return a(G);return i.decodeResp(y)}identity=()=>{let{host:t,enclave:e}=this;return e.deriveIdentity(t.label,t.idx??0)};seal=async(t)=>{let{crypto:e,enclave:n}=this,s=await this.identity();return xi(t,s,e,n)};register=()=>this.call(nt.user,[]);peek=(t)=>this.call(nt.peek,[t]);push=(t)=>this.call(nt.push,t);pull=(t)=>this.call(nt.pull,t);listen=async(t,e,n)=>{let{clock:s,transport:i}=this,{listener:r}=i,o=await this.identity(),l=s.now(),[c,d]=await On(o,l);if(d!==0)return d;return await r.connect(c,t,e,n)};isConnected(){let t=this.transport?.listener;if(t&&typeof t.connected==="function")return t.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}var is={encode(t,e){let n=t.writeVarString(e.lbl);if(n!==0)return n;let s=t.writeVarInt(e.idx);if(s!==0)return s;let i=t.writeVarInt(e.num);if(i!==0)return i;return t.writeBytes(e.hsh),t.writeBytes(e.sig),0},decode(t){let[e,n]=t.readVarString();if(n!==0)return a(n);let[s,i]=t.readVarInt();if(i!==0)return a(i);let[r,o]=t.readVarInt();if(o!==0)return a(o);let[l,c]=t.readBytes(je);if(c!==0)return a(c);let[d,u]=t.readBytes(Mt);if(u!==0)return a(u);return m({lbl:e,idx:s,num:r,hsh:l,sig:d})}};var tn={encode(t,e){let n=t.writeStruct(is,e.head);if(n!==0)return n;let s=t.writeVarBytes(e.indexEnc);if(s!==0)return s;let i=t.writeVarBytes(e.bodyEnc);if(i!==0)return i;return 0},decode(t){let[e,n]=t.readStruct(is);if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let[r,o]=t.readVarBytes();if(o!==0)return a(o);return m({head:e,indexEnc:s,bodyEnc:r})}};var rs={encode(t,e){t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.lenBody);if(s!==0)return s;if(e.lenBody>0&&e.offBody!==void 0){let i=t.writeVarInt(e.offBody);if(i!==0)return i}return 0},decode(t){let[e,n]=t.readBytes(wt);if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let[r,o]=t.readVarInt();if(o!==0)return a(o);let l;if(r>0){let[c,d]=t.readVarInt();if(d!==0)return a(d);l=c}return m({kdm:e,headCph:s,lenBody:r,offBody:l})}};var en;((ki)=>{ki.defaultFileExtension="dpl";async function e(i,r,o,l,c){let d=await c.deriveIdentity(i,r),u=new N,p=new N,h=0,y=0;for(let W of o){let H=new N,k=H.writeStruct(yt,W.head);if(k!==0)return a(k);let L=H.result(),x=await d.kdmFor(L),B=c.deriveCipher(x,"encrypt"),J=await B.encrypt(L),E=W.body?await B.encrypt(W.body):new Uint8Array(0),V=W.head.len>0&&W.head.hsh!==void 0?E.length:0,C={kdm:x,headCph:J,lenBody:V,offBody:V>0?y:void 0},T=u.writeStruct(rs,C);if(T!==0)return a(T);if(W.body)p.writeBytes(E),y+=E.length;h++}let Z=p.result(),b=u.result(),X=await l.blake3(b),I=await d.sign(X),f={lbl:i,idx:r,num:h,hsh:X,sig:I},S=new N;S.writeStruct(tn,{head:f,indexEnc:b,bodyEnc:Z});let G=S.result();return m(G)}ki.encodeFile=e;async function n(i,r,o){let[l,c]=tn.decode(new U(i));if(c!==0)return a(c);let{head:d,indexEnc:u,bodyEnc:p}=l,h=await o.deriveIdentity(d.lbl,d.idx);if(!await r.checkSigEd25519(d.sig,d.hsh,h.publicKey))return a(3);let Z=await r.blake3(u);if(!F(Z,d.hsh))return a(19);let b=new U(u),X=[];for(let f=0;f<d.num;f++){let[S,G]=b.readStruct(rs);if(G!==0)return a(G);X.push(S)}if(X.length!==d.num)return a(14);let I=[];for(let f of X){let S=o.deriveCipher(f.kdm,"decrypt"),G;try{G=await S.decrypt(f.headCph)}catch{return a(20)}let[W,H]=yt.decode(new U(G));if(H!==0)return a(H);let k;if(f.lenBody>0&&f.offBody!==void 0){if(W.hsh===void 0)return a(14);let L=p.slice(f.offBody,f.offBody+f.lenBody);try{k=await S.decrypt(L)}catch{return a(20)}let x=await r.blake3(k);if(!F(x,W.hsh))return a(19)}I.push({head:W,body:k})}return m(I)}ki.decodeFile=n;async function s(i,r,o,l,c){let[d,u]=await n(i,r,o);if(u!==0)return a(u);let[p,h]=tn.decode(new U(i));if(h!==0)return a(h);let y=await c(d);return e(p.head.lbl,p.head.idx,y,r,l)}ki.migrateFile=s})(en||={});async function Li({now:t,bod:e,crypto:n,typ:s=""}){let i=await n.genRandomBytes(8),r=new N,o=r.writeStruct(et,{id:i,ts:t});if(o!==0)return a(o);let l=r.result();return nn({now:t,eid:l,ctr:0,typ:s,bod:e,crypto:n})}async function nn({now:t,eid:e,ctr:n,typ:s="",bod:i,crypto:r}){let o=new U(e),[l,c]=et.decode(o);if(c!==0)return a(c);let d=t.getTime()-l.ts.getTime(),u,p=i?.length??0;if(i&&p>0)u=await r.blake3(i);return m({eid:e,off:d,ctr:n,typ:s,len:p,hsh:u})}function Mi(t,e){let n=t.length<e.length?t.length:e.length;for(let s=0;s<n;s++)if(t[s]!==e[s])return t[s]-e[s];return t.length-e.length}async function le(t,e){let n=Array.from(t);n.sort(Mi);let s=0;for(let o of n)s+=o.length;let i=new Uint8Array(s),r=0;for(let o of n)i.set(o,r),r+=o.length;return e.blake3(i)}function wi(t){let e=new N,n=e.writeVarBytes(t.eid);if(n!==0)return a(n);let s=e.writeDate(t.updatedAt);if(s!==0)return a(s);let i=e.writeVarInt(t.ctr);if(i!==0)return a(i);return m(e.result())}async function xe(t,e){let n=[];for(let s of t){let[i,r]=wi(s);if(r!==0||!i)return a(r);n.push(i)}return m(await le(n,e))}var Pp=Symbol("MasterSeed"),Up=Symbol("SealedMasterKey"),Gt=32,os=24+Gt+16;function Bt(t){if(t.byteLength!==os)return a(10);return m(t)}var Jp=Symbol("EntityID");function Pi(t){return"type"in t}var zp=Symbol("DerivationSeed"),Np=Symbol("PublicKey"),Ep=Symbol("PrivateKey"),Fp=Symbol("HostSpecificKeyPair"),Qp=Symbol("Hash");function Bo(t){if(!t)return!1;if(typeof t!=="object")return!1;if("body"in t===!1)return!1;return!0}function Jo(t){if(t===null||typeof t!=="object")return;if(!("type"in t))return;let e=t.type;if(typeof e!=="string")return;return e}function zo(t){if(!t.bod||t.bod.length===0){let r={off:t.off,ctr:t.ctr,eid:t.eid};return m(r)}let e=Dn(t.bod);if(Bo(e)===!1)return console.warn("msg body invalid",e),a(14);let n=t.typ??"",s=n.length>0?n:Jo(e)??"",i={off:t.off,ctr:t.ctr,eid:t.eid,pid:e.pid,tags:e.tags,type:s,body:e.body};return m(i)}class Re{applier;emitter=new Lt;clearer;onDirtyEids;cacheDriven;peerIngest;constructor(t,e,n,s){this.applier=t;this.clearer=e,this.onDirtyEids=n,this.cacheDriven=s?.cacheDriven??!1,this.peerIngest=s?.peerIngest}apply=async(t)=>{let e=[],n=[];for(let l of t){let[c,d]=zo(l);if(n.push(d),d!==0)continue;e.push(c)}let{stats:s,types:i,eids:r}=await this.applier(e),o=[];for(let l=0;l<t.length;l++){let c=n[l],d=s[l];if(c!==0){o.push(c);continue}if(d!==0){o.push(d);continue}o.push(0)}if(!this.cacheDriven)for(let l of i)this.emitter.emit(l,null);if(r.length>0)this.onDirtyEids?.(r);return o};clear=async()=>{let t=await this.clearer();if(t!==0)return t;return this.emitter.emitAll(null),t};notify=(t)=>{for(let e of t)this.emitter.emit(e,null)};refresh=async(t)=>{if(this.peerIngest){await this.peerIngest(t);return}};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}var ls={apply:async function(t){return t.map(()=>0)},clear:async function(){return 0},notify:function(t){},refresh:async function(t){},on:function(t,e){},off:function(t,e){}};function No(t){return"subscribe"in t}function sn(t){if(No(t)){let e=new Re((n)=>t.apply(n),()=>t.clear(),void 0,{cacheDriven:!0,peerIngest:async(n)=>{await t.ingestFromDurable(n)}});return t.subscribe((n)=>e.notify(n)),e}return new Re((e)=>t.apply(e),()=>t.clear())}function O(t){return"type"in t}function Eo(t){return!O(t)}function Fo(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function Ce(t){if(t instanceof Date)return m(!0);if(t.range.start>t.range.end)return a(10);return m(!0)}function cs(t,e){if(e instanceof Date)return t.getTime()===e.getTime();return Fo(t,e.range)}function Qo(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function He(t){if(typeof t==="string")return m(t.length>0);if("range"in t){if(t.range.start>t.range.end)return a(10);return m(!0)}return m(t.prefix.length>0)}function as(t,e){if(typeof e==="string")return t===e;if("range"in e)return Qo(t,e.range);if(e.prefix.length===0)return!1;return t.startsWith(e.prefix)}function Ui(t){if(!Array.isArray(t)||t.length===0)return;let e=new Set,n=[];for(let s of t){if(typeof s!=="string"||s.length===0)continue;if(e.has(s))continue;e.add(s),n.push(s)}return n.length>0?n:void 0}function Ye(t){return{eid:t.eid,ctr:t.ctr,updatedAt:t.updatedAt}}function ds(t){let e=new U(t.eid),[n,s]=e.readStruct(et);if(s!==0)return a(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function ce(t,e){let n=new U(e.eid),[s,i]=n.readStruct(et);if(i!==0)return a(i);let r=new Date(s.ts.getTime()+e.off);if(t!==void 0&&r<=t.updatedAt)return a(15);if(Pi(e)){let o=Ui(e.tags);return m({eid:e.eid,pid:e.pid,...o!==void 0?{tags:o}:{},type:e.type,createdAt:s.ts,updatedAt:r,ctr:e.ctr,body:e.body})}return m({eid:e.eid,updatedAt:r,ctr:e.ctr})}function ae(t,e){let n=new Set;if(t!==void 0&&O(t))n.add(t.type);if(O(e))n.add(e.type);return[...n]}var vo={getEnt:async()=>a(21),getRow:async()=>a(21),getEntities:async(t)=>a(21),countEntities:async()=>a(21),checksum:async()=>a(21),apply:async(t)=>({stats:t.map(()=>21),types:new Set,eids:[]}),clear:async()=>21};class rn{inflight=null;again=!1;run(t){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain(t),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain(t){try{this.again=!1;let e=await t();while(this.again)this.again=!1,e=await t();return e}finally{this.inflight=null}}}var on=100;class Te{timer=null;delayMs;work;tail=new rn;constructor(t,e){this.delayMs=t<0?0:t,this.work=e}schedule(){if(this.delayMs<=0){this.fire();return}if(this.timer!==null)clearTimeout(this.timer);this.timer=setTimeout(()=>{this.timer=null,this.fire()},this.delayMs)}async flush(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null,this.fire();await this.tail.flush()}cancel(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null}fire(){return this.tail.run(this.work)}}var Bi=!1;function ln(t){Bi=t===!0}function P(t,e){if(!Bi)return;let n=Math.round(performance.now());if(e!==void 0)console.warn(`[dip ${n}ms] ${t}`,e);else console.warn(`[dip ${n}ms] ${t}`)}function Ji(t){let e=new U(t.eid),[n,s]=et.decode(e);if(s!==0)return;return n.ts.getTime()+t.off}function Do(t,e){let n=Ji(t),s=Ji(e);if(n===void 0&&s===void 0)return 0;if(n===void 0)return 1;if(s===void 0)return-1;if(s!==n)return s-n;return e.ctr-t.ctr}function de(t,e){return t.slice().sort((n,s)=>Do(e(n),e(s)))}var Qt={phase:"idle"},ue=50;function cn(t,e,n){if(t<=0||e<=0)return!1;if(t===1||t===e)return!0;return t%n===0}function an(t,e){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob(t,e);return}let n=URL.createObjectURL(t),s=document.createElement("a");s.href=n,s.download=e,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(n)}function zi(t,e,n){let s=[],i=[],r=0;for(let o of t){let l=e(o);if(i.length>0&&r+l>n)s.push(i),i=[],r=0;if(i.push(o),r+=l,r>=n)s.push(i),i=[],r=0}if(i.length>0)s.push(i);return s}async function us(t,e,n){let s=t.length;if(s<1)return[];let i=Array(s),r=0,o=Math.min(Math.max(1,e),s),l=async()=>{while(!0){let d=r;if(r+=1,d>=s)return;i[d]=await n(t[d],d)}},c=[];for(let d=0;d<o;d++)c.push(l());return await Promise.all(c),i}async function dn(t,e,n,s){let i=new U(t.headCph),[r,o]=i.readStruct(qe);if(o!==0)return a(o);let{sig:l,kdm:c,headCph:d}=r;if(!await s.checkSigEd25519(l,d,e))return a(3);let p=n.deriveCipher(c,"decrypt"),h;try{h=await p.decrypt(d)}catch{return a(20)}return m({kdm:c,headEnc:h})}var Kt="f",Jt="t",It="e";function Oo(t){return t===Kt||t===Jt||t===It}function pe(t){if(t===!0||t===Jt)return Jt;if(t===It)return It;return Kt}function jo(t){return pe(t.apld)===Kt}function ps(t){return t!==0&&t!==15&&t!==18&&t!==17}function vt(t,e,n){if(t.apld=e,e===It&&n!==void 0)t.err=n;else delete t.err}async function zt(t,e,n,s){let i=s?.body!==!1,r=pe(e.apld),o=e.body,l=o?.length??0,c;if(i&&o&&l>0)c=await n.blake3(o);let d={eid:e.eid,off:e.off??0,ctr:e.ctr??0,typ:e.typ??"",len:l,hsh:c},u={hash:t,head:d,apld:r};if(i&&o!==void 0)u.body=o;if(r===It&&e.err!==void 0)u.err=e.err;return u}var ms=1048576,hs=1048576,Ei=64;function Ao(t){return t.sig.length+t.kdm.length+t.headCph.length+t.bodyCph.length}async function qo(t,e,n,s,i){if(s.length<1)return 0;let[r,o]=await t.push(s);if(o!==0)return o;if(!r)return 27;for(let c of r){if(c.status!==0){console.error("push err",c);continue}let d=i[c.idx];if(!d){console.error("no hash",c);continue}await e.uploads.deq(n,[d])}let l=await e.hosts.get(n);if(l){let c=l.lastSeq,d=c,u=[];for(let p of r)if(p.status===0)u.push(p.seq);u.sort((p,h)=>p-h);for(let p of u)if(p===c+1)c=p;if(c>d)await e.hosts.touch(n,c)}return 0}async function Ni(t,e){if(e.length<1)return m([]);let n=new Map,s=[];for(let l of e)n.set(l.seq,l),s.push(l.seq);let[i,r]=await t.pull(s);if(r!==0)return a(r);if(!i)return a(27);let o=[];for(let{seq:l,bodyCph:c}of i){let d=n.get(l);if(!d)continue;o.push({dl:d,bodyCph:c})}return m(o)}async function _o(t,e,n,s){if(s.length<1)return m({parts:[],hashes:[]});let i=[],r=[],o=[],l=new Map;for(let{dl:d,bodyCph:u}of s){let{head:p,kdm:h,seq:y,host:Z}=d,[b,X]=await Fi(d,n);if(X!==0||!b){let x=l.get(Z)??[];x.push(y),l.set(Z,x);continue}let{headEnc:I,headEncHash:f}=b,S=e.deriveCipher(h,"decrypt"),[G,W]=await An(I,u,S,n,f);if(W!==0||!G){let x=l.get(Z)??[];x.push(y),l.set(Z,x);continue}let H={head:p,body:G.bod},k=G.headHash;o.push({key:k,data:Di(H)}),i.push(H),r.push(k);let L=l.get(Z)??[];L.push(y),l.set(Z,L)}let c=await t.messages.add(o);for(let[d,u]of l)await t.downloads.deq(d,u);for(let d=0;d<c.length;d++){let u=c[d];if(u!==0&&u!==15)console.error("ERR storing",g[u],"for message",d)}return m({parts:i,hashes:r})}async function Fi(t,e){let n=t.headEnc;if(!n){let i=new N,r=i.writeStruct(yt,t.head);if(r!==0)return a(r);n=i.result()}if(t.headEncHash)return m({headEnc:n,headEncHash:t.headEncHash});let s=await e.blake3(n);return m({headEnc:n,headEncHash:s})}async function Qi(t,e,n){let s=new Set;for(let o of e)s.add(Y(o));if(s.size<1)return;let i=Array.from(await t.downloads.list());if(i.length<1)return;let r=new Map;for(let o of i){let l;if(o.headEncHash)l=Y(o.headEncHash);else{let[d,u]=await Fi(o,n);if(u!==0||!d)continue;l=Y(d.headEncHash)}if(!s.has(l))continue;let c=r.get(o.host)??[];c.push(o.seq),r.set(o.host,c)}for(let[o,l]of r)await t.downloads.deq(o,l)}async function ys({conn:t,store:e,enclave:n,host:s,crypto:i,onProgress:r,peekProgressEvery:o,peekConcurrency:l}){let c=await t.identity(),d=[],[u,p]=await t.peek(s.lastSeq);if(p!==0)return p;let h=u.length,y=o??ue,Z=l??Ei;if(r&&h>0)r({phase:"peek",host:s.label,done:0,total:h});let b=0,X=await us(u,Z,async(f)=>{let[S,G]=await dn(f,c.publicKey,n,i),W;if(G!==0||!S)W={ok:!1,seq:f.seq,stat:G};else{let H=await i.blake3(S.headEnc);W={ok:!0,seq:f.seq,kdm:S.kdm,headEnc:S.headEnc,headEncHash:H}}if(b+=1,r&&cn(b,h,y))r({phase:"peek",host:s.label,done:b,total:h});return W}),I=new Set;for(let f of X){if(!f.ok){console.error("peek: decrypting item head",f.stat);continue}let S=Y(f.headEncHash);if(await e.messages.has(f.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await e.uploads.deq(s.label,[f.headEncHash]),await e.downloads.deq(s.label,[f.seq]);continue}if(I.has(S)){await e.downloads.deq(s.label,[f.seq]);continue}let W=new U(f.headEnc),[H,k]=W.readStruct(yt);if(k!==0){console.error("peek: reading item head",k);continue}I.add(S),d.push({kdm:f.kdm,head:H,seq:f.seq,host:s.label,headEnc:f.headEnc,headEncHash:f.headEncHash})}if(await e.downloads.enq(d),u.length>0){let f=Math.max(...u.map((S)=>S.seq));await e.hosts.recordStats(s.label,{lastSeq:f})}if(r)r({phase:"peek",host:s.label,done:h,total:h});return 0}async function vi({conn:t,store:e,host:n,maxPushBytes:s,onProgress:i}){let r=s??ms,o=await e.uploads.list(n.label),l=o.length,c=0;if(i&&l>0)i({phase:"push",host:n.label,done:0,total:l});let d=[],u=[],p=0,h=async()=>{if(d.length<1)return 0;let y=d.length,Z=await qo(t,e,n.label,d,u);if(d=[],u=[],p=0,Z===0){if(c+=y,i)i({phase:"push",host:n.label,done:c,total:l})}return Z};for(let y of o){let Z=await e.messages.get(y);if(!Z){c+=1;continue}let b={...Z.head,bod:Z.body},[X,I]=await t.seal(b);if(I!==0)return I;if(!X)return 12;let f=Ao(X);if(d.length>0&&p+f>r){let S=await h();if(S!==0)return S}if(d.push(X),u.push(y),p+=f,p>=r){let S=await h();if(S!==0)return S}}return h()}async function Zs({conn:t,store:e,enclave:n,host:s,crypto:i,maxPullBytes:r,onProgress:o},l){let c=r??hs,d=await e.downloads.list(),u=Array.from(d).filter((X)=>X.host===s.label);if(u.length<1)return 15;let p=de(u,(X)=>X.head),h=zi(p,(X)=>X.head.len,c),y=p.length,Z=0;if(o)o({phase:"pull",host:s.label,done:0,total:y});let b=Ni(t,h[0]);for(let X=0;X<h.length;X++){let[I,f]=await b;if(f!==0||!I)return f;if(Z+=h[X].length,o)o({phase:"pull",host:s.label,done:Z,total:y});let S=h[X+1];if(S)b=Ni(t,S);if(o)o({phase:"open",host:s.label,done:Z,total:y});let G=de(I,(H)=>H.dl.head),[,W]=await _o(e,n,i,G);if(W!==0)return W;if(l){if(o)o({phase:"exec",host:s.label,done:Z,total:y});await l()}}return 0}function Di({head:t,body:e}){let n={eid:t.eid,body:e,apld:Kt};if(t.off!==0)n.off=t.off;if(t.ctr!==0)n.ctr=t.ctr;if(t.typ)n.typ=t.typ;return n}async function Oi(t,{conn:e,store:n,enclave:s,host:i,crypto:r,onProgress:o},l){let c=i.label,d=await e.identity(),u=new U(t),[p,h]=u.readStructs(Ae);if(h!==0){console.error("Failed decoding notif",g[h]);return}let y=!1,b=(await n.hosts.get(c))?.lastSeq,X=[],I=!1;for(let G of p){let[W,H]=await dn({seq:G.seq,headCph:G.headCph},d.publicKey,s,r);if(H!==0){console.error("Failed decrypting notif",g[H]);continue}let k=await r.blake3(W.headEnc);if(await n.messages.has(k))continue;let L=new U(W.headEnc),[x,B]=L.readStruct(yt);if(B!==0){console.error("Failed to parse head",g[B]);continue}if(!G.bodyCph&&x.len>0)I=!0,await n.downloads.enq([{seq:G.seq,host:c,kdm:W.kdm,head:x,headEnc:W.headEnc,headEncHash:k}]);else X.push({...W,head:x,bodyCph:G.bodyCph,headEncHash:k});if(b===void 0||G.seq!==b+1)console.log("out of seq",G.seq,b),y=!0;else b=G.seq}if(b!==void 0)await n.hosts.touch(i.label,b);let f=[];for(let G of X){let W=s.deriveCipher(G.kdm,"decrypt"),[H,k]=await An(G.headEnc,G.bodyCph,W,r);if(k!==0){console.error("Failed to open body",g[k]);continue}f.push({key:G.headEncHash,data:Di({head:G.head,body:H.bod})})}let S=await n.messages.add(f);for(let G=0;G<S.length;G++){let W=S[G];if(W!==0&&W!==15)console.error("ERR storing",g[W],"for message",G)}if(o&&f.length>0)o({phase:"open",host:i.label,done:f.length,total:f.length});if(y||I||f.length>0)l()}async function bs(t,e={}){let n=e.pull!==!1,s=e.push===!0,{conn:i,store:r,enclave:o,host:l,crypto:c,onProgress:d,peekProgressEvery:u,peekConcurrency:p}=t,h=await i.identity(),[y,Z]=await i.peek(0);if(Z!==0)return a(Z);let b=y.length,X=u??ue,I=p??Ei;if(d&&b>0)d({phase:"peek",host:l.label,done:0,total:b});let f=0,S=await us(y,I,async(C)=>{let[T,w]=await dn(C,h.publicKey,o,c),M;if(w!==0||!T)M={ok:!1,seq:C.seq,stat:w};else{let R=await c.blake3(T.headEnc);M={ok:!0,seq:C.seq,kdm:T.kdm,headEnc:T.headEnc,headEncHash:R}}if(f+=1,d&&cn(f,b,X))d({phase:"peek",host:l.label,done:f,total:b});return M}),G=new Map;for(let C of S){if(!C.ok)continue;let T=Y(C.headEncHash),w=G.get(T);if(w)w.count+=1;else G.set(T,{hash:C.headEncHash,count:1,sample:C})}let W=0,H=[];for(let C of G.values()){if(C.count>1)W+=C.count-1;H.push(C.hash)}let k=y.length,L=G.size,x=await le(H,c),B=[],J=0;for(let C of G.values()){if(await r.messages.has(C.hash)){await r.uploads.deq(l.label,[C.hash]);continue}if(J+=1,!n)continue;let w=C.sample,M=new U(w.headEnc),[R,j]=M.readStruct(yt);if(j!==0){console.error("reconcile: reading msg header",j);continue}B.push({kdm:w.kdm,head:R,seq:w.seq,host:l.label,headEnc:w.headEnc,headEncHash:w.headEncHash})}if(B.length>0)await r.downloads.enq(B);let E=0;if(s){let C=await r.messages.listKeys(),T=new Set(G.keys()),w=[];for(let M of C)if(!T.has(Y(M)))E+=1,w.push(M);if(w.length>0)await r.uploads.enq(l.label,w)}else{let C=await r.messages.listKeys(),T=new Set(G.keys());for(let w of C)if(!T.has(Y(w)))E+=1}let V=y.length>0?Math.max(...y.map((C)=>C.seq)):0;if(await r.hosts.recordStats(l.label,{setLastSeq:V}),d)d({phase:"peek",host:l.label,done:b,total:b});return m({msgcheck:x,numBags:k,uniqueMsgs:L,numDupes:W,missingLocal:J,missingHost:E})}function $o(t){return t.map(({head:e,body:n})=>({...e,bod:n}))}class me{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new rn;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=ue;lastProgress=Qt;scheduledSync;constructor(t,e,n,s,i,r=!0,o=ms,l=hs,c){this.clock=t;this.state=e;this.store=n;this.transport=s;this.crypto=i;this.forceSkewHandlingByDefault=r;this.onScheduleSync=c;this.maxPushBytes=o,this.maxPullBytes=l,this.clientState=new ft(()=>this.getClientState()),this.xferState=new ft(()=>this.getXferState()),this.scheduledSync=new Te(on,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(d){console.error("Debounced sync failed:",d)}})}emitProgress=(t)=>{this.lastProgress=t,this.xferState.emit()};async setSeed(t,e){await this.store.seed.save(t,e),this.clientState.emit()}async getClientState(){let{store:t,connections:e}=this,n=await t.seed.load(),s=await t.hosts.list(),i=!1;for(let r of e.values())if(r.isConnected()){i=!0;break}return{hasSeed:n!==void 0,hasHost:Array.from(s).length>0,connected:i}}async getXferState(){let{uploads:t,downloads:e}=this.store,n=await t.count();return{numDownloads:await e.count(),numUploads:n,progress:this.lastProgress}}apply=(t,e)=>{P("apply kick",{n:t.length});let n=this.state.apply($o(t));return this.enqueueApplyJob(()=>this.doApply(t,e,n))};async doApply(t,e={enqueueUpload:!0,triggerUpload:!0},n){let s=[],i=[];for(let{head:o,body:l}of t){let c=new N;c.writeStruct(yt,o);let d=c.result(),u=await this.crypto.blake3(d),p={eid:o.eid,body:l,apld:Kt};if(o.off!==0)p.off=o.off;if(o.ctr!==0)p.ctr=o.ctr;if(o.typ)p.typ=o.typ;s.push(u),i.push({key:u,data:p})}P("doApply archive start"),await this.store.messages.add(i),P("doApply archive done"),await Qi(this.store,s,this.crypto),P("doApply await persist");let r=await n;if(P("doApply persist done"),await this.markApplyStats(s,r),e.enqueueUpload){let o=[];for(let l=0;l<s.length;l++){let c=r[l];if(c===0||c===15)o.push(s[l])}if(o.length>0){let l=await this.store.hosts.list();for(let c of l)await this.store.uploads.enq(c.label,o);this.xferState.emit()}}if(e.triggerUpload)this.scheduleSync();return r}enqueueApplyJob(t){let e=this.applyChain.then(t,t);return this.applyChain=e.then(()=>{return},()=>{return}),e}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let t=await this.store.messages.list({apld:Kt});if(t.length<1)return[];let e=de(t,(n)=>n.head);return this.applyStored(e)}applyHashes=(t)=>this.enqueueApplyJob(()=>this.doApplyHashes(t));async doApplyHashes(t){let e=[];for(let i of t){let r=await this.store.messages.get(i);if(r)e.push(r)}let n=await this.applyStored(e),s=new Map;for(let i=0;i<e.length;i++)s.set(Y(e[i].hash),n[i]??12);return t.map((i)=>s.get(Y(i))??13)}async applyStored(t){if(t.length<1)return[];let e=t.map((s)=>({...s.head,bod:s.body})),n=await this.state.apply(e);return await this.markApplyStats(t.map((s)=>s.hash),n),n}async markApplyStats(t,e){let n=[],s=[];for(let i=0;i<t.length;i++){let r=e[i];if(r===0||r===15)n.push(t[i]);else if(r!==void 0&&ps(r))s.push({key:t[i],err:r})}if(n.length>0)await this.store.messages.markApplied(n);if(s.length>0)await this.store.messages.markFailed(s)}async insertRaw(t,e=""){P("insertRaw");let{clock:n,crypto:s}=this,i=n.now(),[r,o]=await Li({now:i,bod:t,typ:e,crypto:s});if(o!==0)return a(o);let c=(await this.apply([{head:r,body:t}]))[0];if(c!==0&&c!==15)return a(c??12);return m(r)}async makeUpdate(t,e,n=""){let{clock:s,crypto:i}=this,r=s.now();if(t.updatedAt.getTime()>r.getTime())return a(4);let o=t.ctr+1,[l,c]=await nn({now:r,eid:t.eid,ctr:o,typ:n,bod:e,crypto:i});if(c!==0)return a(c);return m({head:l,body:e})}async updateWithSkew(t,e,n,s=""){if(n===!1)return a(4);let{clock:i,crypto:r}=this,o=i.now(),l=new U(t.eid),[c,d]=l.readStruct(et);if(d!==0)return a(d);let u=t.updatedAt.getTime()-c.ts.getTime(),p={eid:t.eid,off:u+1,ctr:t.ctr+1,typ:"",len:0},y=(await this.apply([{head:p,body:void 0}]))[0];if(y!==0&&y!==15)return a(y??12);if(e===void 0)return m(p);let[Z,b]=oe({id:c.id,ts:o});if(b!==0)return a(b);let[X,I]=await nn({now:o,eid:Z,ctr:0,typ:s,bod:e,crypto:r});if(I!==0)return a(I);let S=(await this.apply([{head:X,body:e}]))[0];if(S!==0&&S!==15)return a(S??12);return m(X)}async updateRaw(t,e,n=this.forceSkewHandlingByDefault,s=""){if(P("updateRaw"),t.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(t,e,n,s);let[i,r]=await this.makeUpdate(t,e,s);if(r!==0)return a(r);let l=(await this.apply([i]))[0];if(l!==0&&l!==15)return a(l??12);return m(i.head)}async insert(t){let{body:e,type:n,pid:s,tags:i}=t,r={body:e};if(s!==void 0)r.pid=s;if(i!==void 0)r.tags=i;let o=Ft(r);return this.insertRaw(o,n)}async update(t){let{prior:e,body:n,type:s,pid:i,tags:r,force:o}=t,l={body:n};if(i!==void 0)l.pid=i;if(r!==void 0)l.tags=r;let c=Ft(l);return this.updateRaw(e,c,o??this.forceSkewHandlingByDefault,s)}async delete(t){let e=t.force??!0;if("prior"in t)return this.updateRaw(t.prior,void 0,e);let[n,s]=await this.revFromArchive(t.eid);if(s!==0)return a(s);return this.updateRaw(n,void 0,e)}async revFromArchive(t){let e=await this.store.messages.last(t);if(e)return ds(e.head);let n=new U(t),[s,i]=n.readStruct(et);if(i!==0)return a(i);return m({eid:t,ctr:-1,updatedAt:s.ts})}async genEID(t){let{clock:e,crypto:n}=this,s=e.now();if(t!==void 0)return oe({id:t,ts:s});let i=await n.genRandomBytes(8);return oe({id:i,ts:s})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;await this.drainApplyQueue();for(let[i,r]of t){let o=await n.hosts.get(i);if(!o)continue;let l={conn:r,store:n,enclave:s,host:o,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},c=await ys(l);if(c!==0)return console.error(`Failed to peek: ${c}`),this.emitProgress({phase:"idle"}),c;this.xferState.emit();let d=await vi(l);if(d!==0)return console.error(`Failed to push: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await Zs(l,async()=>{await this.drainApplyQueue()});if(u!==0&&u!==15)return console.error(`Failed to pull: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild(t){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),t?.checkHost??!0){let n=await this.repull();if(n!==0)return n}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let t=await this.store.messages.listKeys();return le(t,this.crypto)}listMsgs(t){return this.store.messages.list(t)}countMsgs(t){return this.store.messages.count(t)}async reconcile(t,e){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:n,crypto:s,store:i}=this,r=await i.seed.load();if(!r)return a(22);let o=await i.hosts.get(t);if(!o)return a(13);let l=n.get(t);if(!l||!l.isConnected()){if(await this.connectToHost(o,!1,!1),o=await i.hosts.get(t),!o)return a(13);l=n.get(t)}if(!l)return a(12);let c={conn:l,store:i,enclave:r,crypto:s,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[d,u]=await bs({...c,host:o},e);if(this.xferState.emit(),u!==0)return this.emitProgress({phase:"idle"}),a(u);if(!d)return this.emitProgress({phase:"idle"}),a(12);if(e?.sync===!1)return this.emitProgress({phase:"idle"}),m(d);let p=await this.sync();if(p!==0)return a(p);let h=await i.hosts.get(t);if(!h)return a(13);let[y,Z]=await bs({...c,host:h},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),Z!==0)return a(Z);if(!y)return a(12);return m(y)}async repull(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;let i=Array.from(await n.hosts.list());if(i.length<1)return 0;for(let r of i){let o=t.get(r.label);if(!o||!o.isConnected())await this.connectToHost(r,!1,!1)}for(let[r,o]of t){let l=await n.hosts.get(r);if(!l)continue;let c={conn:o,store:n,enclave:s,host:{...l,lastSeq:0},crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},d=await ys(c);if(d!==0)return console.error(`rebuild: failed to peek: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await Zs(c);if(u!==0&&u!==15)return console.error(`rebuild: failed to pull: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let t=await this.state.clear();if(t!==0)return t;let e=await this.store.messages.list(),n=de(e,(r)=>r.head),s=n.length;if(s<1)return this.emitProgress({phase:"idle"}),0;let i=0;while(i<n.length){let r=0,o=0,l=i;for(let d=i;d<n.length&&o<100&&r<102400;d++)r+=n[d].head.len,o++,l=d+1;let c=n.slice(i,l);await this.applyStored(c),this.emitProgress({phase:"exec",done:l,total:s}),i=l}return this.emitProgress({phase:"idle"}),0}async wipe(t){let e=t?.msgs!==!1,n=t?.ents!==!1,s=t?.meta!==!1,i=t?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:r}=this;if(s)await r.hosts.wipe(),await r.uploads.wipe(),await r.downloads.wipe();if(e)await r.messages.wipe();if(i)await r.seed.wipe();if(n)await this.state.clear();this.lastProgress=Qt,this.clientState.emit(),this.xferState.emit()}import=async(t,e)=>{let{crypto:n,store:s}=this,i=e?.onProgress,r=await s.seed.load();if(!r)return 22;console.time("import: decoding file...");let o=await t.bytes(),[l,c]=await en.decodeFile(o,n,r);if(c!==0)return c;console.timeEnd("import: decoding file...");let d=0;while(d<l.length){let u=0,p=0,h=d;for(let b=d;b<l.length&&p<100&&u<102400;b++)u+=l[b].head.len,p++,h=b+1;let y=l.slice(d,h);console.time(`import: applying [${d}, ${h}]`);let Z=await this.apply(y,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${d}, ${h}]`);for(let b=0;b<y.length;b++){let X=Z[b];if(X!==0&&X!==15)console.warn(`failed to import msg ${d+b}: ${g[X]}`)}if(i)queueMicrotask(()=>i(h,l.length,0));this.emitProgress({phase:"import",done:h,total:l.length}),d=h}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:t,store:e}=this,n=await e.seed.load();if(!n)return a(22);let s=await e.messages.list();return en.encodeFile("export",0,s,t,n)}async export(t){let[e,n]=await this.exportBytes();if(n!==0)return n;if(!e)return 12;let s=new Blob([e.slice()]);return an(s,t),0}async link(t,e=!0){if(await this.store.hosts.add(t),this.clientState.emit(),e){let n=await this.store.hosts.get(t.label);if(n)await this.connectToHost(n)}}async unlink(t){await this.store.hosts.del(t),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async(t,e=!0,n=!0)=>{let{clock:s,connections:i,crypto:r,store:o,transport:l}=this,c=i.get(t.label);if(c){if(c.isConnected())return;try{c.closeListener()}catch{}i.delete(t.label)}let d=await o.seed.load();if(!d)return;console.info(`Connecting to ${t.handle} (${t.label})`);let u=new $e(d,r,t,s,l(t),(p)=>o.hosts.set(t.label,p));if(await u.register(),e)await u.listen(async(p)=>{let h={conn:u,store:o,enclave:d,host:t,crypto:r,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return Oi(p,h,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(i.set(t.label,u),this.clientState.emit(),n)this.scheduleSync()};async connect(t=!0,e=!0){let{connectToHost:n,scheduleSync:s,store:i}=this;if(!await i.seed.load())return;await this.drainApplyQueue();let o=await i.hosts.list();for(let l of o)await n(l,t,!1);if(e)s()}disconnect=async()=>{for(let t of this.connections.values())try{t.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}var Dt=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function un(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Xs(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function tt(t,...e){if(!Xs(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function Gs(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function ji(t,e){tt(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function fs(t){if(typeof t!=="boolean")throw Error(`boolean expected, not ${t}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var xt=(t)=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4));var tl=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!tl)throw Error("Non little-endian hardware is not supported");function el(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function pn(t){if(typeof t==="string")t=el(t);else if(Xs(t))t=mn(t);else throw Error("Uint8Array expected, got "+typeof t);return t}function Ai(t,e){if(e==null||typeof e!=="object")throw Error("options must be defined");return Object.assign(t,e)}function qi(t,e){if(t.length!==e.length)return!1;let n=0;for(let s=0;s<t.length;s++)n|=t[s]^e[s];return n===0}var _i=(t,e)=>{function n(s,...i){if(tt(s),t.nonceLength!==void 0){let u=i[0];if(!u)throw Error("nonce / iv required");if(t.varSizeNonce)tt(u);else tt(u,t.nonceLength)}let r=t.tagLength;if(r&&i[1]!==void 0)tt(i[1]);let o=e(s,...i),l=(u,p)=>{if(p!==void 0){if(u!==2)throw Error("cipher output not supported");tt(p)}},c=!1;return{encrypt(u,p){if(c)throw Error("cannot encrypt() twice with same key + nonce");return c=!0,tt(u),l(o.encrypt.length,p),o.encrypt(u,p)},decrypt(u,p){if(tt(u),r&&u.length<r)throw Error("invalid ciphertext length: smaller than tagLength="+r);return l(o.decrypt.length,p),o.decrypt(u,p)}}}return Object.assign(n,t),n};function Vs(t,e,n=!0){if(e===void 0)return new Uint8Array(t);if(e.length!==t)throw Error("invalid output length, expected "+t+", got: "+e.length);if(n&&!nl(e))throw Error("invalid output, must be aligned");return e}function nl(t){return t.byteOffset%4===0}function mn(t){return Uint8Array.from(t)}function St(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function ke(t=32){if(Dt&&typeof Dt.getRandomValues==="function")return Dt.getRandomValues(new Uint8Array(t));if(Dt&&typeof Dt.randomBytes==="function")return Dt.randomBytes(t);throw Error("crypto.getRandomValues must be defined")}var tr=(t)=>Uint8Array.from(t.split("").map((e)=>e.charCodeAt(0))),sl=tr("expand 16-byte k"),il=tr("expand 32-byte k"),rl=xt(sl),ol=xt(il);function K(t,e){return t<<e|t>>>32-e}function Is(t){return t.byteOffset%4===0}var hn=64,ll=16,er=4294967295,$i=new Uint32Array;function cl(t,e,n,s,i,r,o,l){let c=i.length,d=new Uint8Array(hn),u=xt(d),p=Is(i)&&Is(r),h=p?xt(i):$i,y=p?xt(r):$i;for(let Z=0;Z<c;o++){if(t(e,n,s,u,o,l),o>=er)throw Error("arx: counter overflow");let b=Math.min(hn,c-Z);if(p&&b===hn){let X=Z/4;if(Z%4!==0)throw Error("arx: invalid block position");for(let I=0,f;I<ll;I++)f=X+I,y[f]=h[f]^u[I];Z+=hn;continue}for(let X=0,I;X<b;X++)I=Z+X,r[I]=i[I]^d[X];Z+=b}}function nr(t,e){let{allowShortKeys:n,extendNonceFn:s,counterLength:i,counterRight:r,rounds:o}=Ai({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},e);if(typeof t!=="function")throw Error("core must be a function");return un(i),un(o),fs(r),fs(n),(l,c,d,u,p=0)=>{tt(l),tt(c),tt(d);let h=d.length;if(u===void 0)u=new Uint8Array(h);if(tt(u),un(p),p<0||p>=er)throw Error("arx: counter overflow");if(u.length<h)throw Error(`arx: output (${u.length}) is shorter than data (${h})`);let y=[],Z=l.length,b,X;if(Z===32)y.push(b=mn(l)),X=ol;else if(Z===16&&n)b=new Uint8Array(32),b.set(l),b.set(l,16),X=rl,y.push(b);else throw Error(`arx: invalid 32-byte key, got length=${Z}`);if(!Is(c))y.push(c=mn(c));let I=xt(b);if(s){if(c.length!==24)throw Error("arx: extended nonce must be 24 bytes");s(X,I,xt(c.subarray(0,16)),I),c=c.subarray(16)}let f=16-i;if(f!==c.length)throw Error(`arx: nonce must be ${f} or 16 bytes`);if(f!==12){let G=new Uint8Array(12);G.set(c,r?0:12-c.length),c=G,y.push(c)}let S=xt(c);return cl(t,X,I,S,d,u,p,o),St(...y),u}}var st=(t,e)=>t[e++]&255|(t[e++]&255)<<8;class sr{constructor(t){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,t=pn(t),tt(t,32);let e=st(t,0),n=st(t,2),s=st(t,4),i=st(t,6),r=st(t,8),o=st(t,10),l=st(t,12),c=st(t,14);this.r[0]=e&8191,this.r[1]=(e>>>13|n<<3)&8191,this.r[2]=(n>>>10|s<<6)&7939,this.r[3]=(s>>>7|i<<9)&8191,this.r[4]=(i>>>4|r<<12)&255,this.r[5]=r>>>1&8190,this.r[6]=(r>>>14|o<<2)&8191,this.r[7]=(o>>>11|l<<5)&8065,this.r[8]=(l>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let d=0;d<8;d++)this.pad[d]=st(t,16+2*d)}process(t,e,n=!1){let s=n?0:2048,{h:i,r}=this,o=r[0],l=r[1],c=r[2],d=r[3],u=r[4],p=r[5],h=r[6],y=r[7],Z=r[8],b=r[9],X=st(t,e+0),I=st(t,e+2),f=st(t,e+4),S=st(t,e+6),G=st(t,e+8),W=st(t,e+10),H=st(t,e+12),k=st(t,e+14),L=i[0]+(X&8191),x=i[1]+((X>>>13|I<<3)&8191),B=i[2]+((I>>>10|f<<6)&8191),J=i[3]+((f>>>7|S<<9)&8191),E=i[4]+((S>>>4|G<<12)&8191),V=i[5]+(G>>>1&8191),C=i[6]+((G>>>14|W<<2)&8191),T=i[7]+((W>>>11|H<<5)&8191),w=i[8]+((H>>>8|k<<8)&8191),M=i[9]+(k>>>5|s),R=0,j=R+L*o+x*(5*b)+B*(5*Z)+J*(5*y)+E*(5*h);R=j>>>13,j&=8191,j+=V*(5*p)+C*(5*u)+T*(5*d)+w*(5*c)+M*(5*l),R+=j>>>13,j&=8191;let _=R+L*l+x*o+B*(5*b)+J*(5*Z)+E*(5*y);R=_>>>13,_&=8191,_+=V*(5*h)+C*(5*p)+T*(5*u)+w*(5*d)+M*(5*c),R+=_>>>13,_&=8191;let D=R+L*c+x*l+B*o+J*(5*b)+E*(5*Z);R=D>>>13,D&=8191,D+=V*(5*y)+C*(5*h)+T*(5*p)+w*(5*u)+M*(5*d),R+=D>>>13,D&=8191;let z=R+L*d+x*c+B*l+J*o+E*(5*b);R=z>>>13,z&=8191,z+=V*(5*Z)+C*(5*y)+T*(5*h)+w*(5*p)+M*(5*u),R+=z>>>13,z&=8191;let v=R+L*u+x*d+B*c+J*l+E*o;R=v>>>13,v&=8191,v+=V*(5*b)+C*(5*Z)+T*(5*y)+w*(5*h)+M*(5*p),R+=v>>>13,v&=8191;let ut=R+L*p+x*u+B*d+J*c+E*l;R=ut>>>13,ut&=8191,ut+=V*o+C*(5*b)+T*(5*Z)+w*(5*y)+M*(5*h),R+=ut>>>13,ut&=8191;let ht=R+L*h+x*p+B*u+J*d+E*c;R=ht>>>13,ht&=8191,ht+=V*l+C*o+T*(5*b)+w*(5*Z)+M*(5*y),R+=ht>>>13,ht&=8191;let te=R+L*y+x*h+B*p+J*u+E*d;R=te>>>13,te&=8191,te+=V*c+C*l+T*o+w*(5*b)+M*(5*Z),R+=te>>>13,te&=8191;let ee=R+L*Z+x*y+B*h+J*p+E*u;R=ee>>>13,ee&=8191,ee+=V*d+C*c+T*l+w*o+M*(5*b),R+=ee>>>13,ee&=8191;let ne=R+L*b+x*Z+B*y+J*h+E*p;R=ne>>>13,ne&=8191,ne+=V*u+C*d+T*c+w*l+M*o,R+=ne>>>13,ne&=8191,R=(R<<2)+R|0,R=R+j|0,j=R&8191,R=R>>>13,_+=R,i[0]=j,i[1]=_,i[2]=D,i[3]=z,i[4]=v,i[5]=ut,i[6]=ht,i[7]=te,i[8]=ee,i[9]=ne}finalize(){let{h:t,pad:e}=this,n=new Uint16Array(10),s=t[1]>>>13;t[1]&=8191;for(let o=2;o<10;o++)t[o]+=s,s=t[o]>>>13,t[o]&=8191;t[0]+=s*5,s=t[0]>>>13,t[0]&=8191,t[1]+=s,s=t[1]>>>13,t[1]&=8191,t[2]+=s,n[0]=t[0]+5,s=n[0]>>>13,n[0]&=8191;for(let o=1;o<10;o++)n[o]=t[o]+s,s=n[o]>>>13,n[o]&=8191;n[9]-=8192;let i=(s^1)-1;for(let o=0;o<10;o++)n[o]&=i;i=~i;for(let o=0;o<10;o++)t[o]=t[o]&i|n[o];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let r=t[0]+e[0];t[0]=r&65535;for(let o=1;o<8;o++)r=(t[o]+e[o]|0)+(r>>>16)|0,t[o]=r&65535;St(n)}update(t){Gs(this);let{buffer:e,blockLen:n}=this;t=pn(t);let s=t.length;for(let i=0;i<s;){let r=Math.min(n-this.pos,s-i);if(r===n){for(;n<=s-i;i+=n)this.process(t,i);continue}if(e.set(t.subarray(i,i+r),this.pos),this.pos+=r,i+=r,this.pos===n)this.process(e,0,!1),this.pos=0}return this}destroy(){St(this.h,this.r,this.buffer,this.pad)}digestInto(t){Gs(this),ji(t,this),this.finished=!0;let{buffer:e,h:n}=this,{pos:s}=this;if(s){e[s++]=1;for(;s<16;s++)e[s]=0;this.process(e,0,!0)}this.finalize();let i=0;for(let r=0;r<8;r++)t[i++]=n[r]>>>0,t[i++]=n[r]>>>8;return t}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}}function al(t){let e=(s,i)=>t(i).update(pn(s)).digest(),n=t(new Uint8Array(32));return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var Ss=al((t)=>new sr(t));function dl(t,e,n,s,i,r=20){let o=t[0],l=e[0],c=e[1],d=e[2],u=e[3],p=t[1],h=n[0],y=n[1],Z=i,b=0,X=t[2],I=e[4],f=e[5],S=e[6],G=e[7],W=t[3],H=o,k=l,L=c,x=d,B=u,J=p,E=h,V=y,C=Z,T=b,w=X,M=I,R=f,j=S,_=G,D=W;for(let v=0;v<r;v+=2)B^=K(H+R|0,7),C^=K(B+H|0,9),R^=K(C+B|0,13),H^=K(R+C|0,18),T^=K(J+k|0,7),j^=K(T+J|0,9),k^=K(j+T|0,13),J^=K(k+j|0,18),_^=K(w+E|0,7),L^=K(_+w|0,9),E^=K(L+_|0,13),w^=K(E+L|0,18),x^=K(D+M|0,7),V^=K(x+D|0,9),M^=K(V+x|0,13),D^=K(M+V|0,18),k^=K(H+x|0,7),L^=K(k+H|0,9),x^=K(L+k|0,13),H^=K(x+L|0,18),E^=K(J+B|0,7),V^=K(E+J|0,9),B^=K(V+E|0,13),J^=K(B+V|0,18),M^=K(w+T|0,7),C^=K(M+w|0,9),T^=K(C+M|0,13),w^=K(T+C|0,18),R^=K(D+_|0,7),j^=K(R+D|0,9),_^=K(j+R|0,13),D^=K(_+j|0,18);let z=0;s[z++]=o+H|0,s[z++]=l+k|0,s[z++]=c+L|0,s[z++]=d+x|0,s[z++]=u+B|0,s[z++]=p+J|0,s[z++]=h+E|0,s[z++]=y+V|0,s[z++]=Z+C|0,s[z++]=b+T|0,s[z++]=X+w|0,s[z++]=I+M|0,s[z++]=f+R|0,s[z++]=S+j|0,s[z++]=G+_|0,s[z++]=W+D|0}function ul(t,e,n,s){let i=t[0],r=e[0],o=e[1],l=e[2],c=e[3],d=t[1],u=n[0],p=n[1],h=n[2],y=n[3],Z=t[2],b=e[4],X=e[5],I=e[6],f=e[7],S=t[3];for(let W=0;W<20;W+=2)c^=K(i+X|0,7),h^=K(c+i|0,9),X^=K(h+c|0,13),i^=K(X+h|0,18),y^=K(d+r|0,7),I^=K(y+d|0,9),r^=K(I+y|0,13),d^=K(r+I|0,18),f^=K(Z+u|0,7),o^=K(f+Z|0,9),u^=K(o+f|0,13),Z^=K(u+o|0,18),l^=K(S+b|0,7),p^=K(l+S|0,9),b^=K(p+l|0,13),S^=K(b+p|0,18),r^=K(i+l|0,7),o^=K(r+i|0,9),l^=K(o+r|0,13),i^=K(l+o|0,18),u^=K(d+c|0,7),p^=K(u+d|0,9),c^=K(p+u|0,13),d^=K(c+p|0,18),b^=K(Z+y|0,7),h^=K(b+Z|0,9),y^=K(h+b|0,13),Z^=K(y+h|0,18),X^=K(S+f|0,7),I^=K(X+S|0,9),f^=K(I+X|0,13),S^=K(f+I|0,18);let G=0;s[G++]=i,s[G++]=d,s[G++]=Z,s[G++]=S,s[G++]=u,s[G++]=p,s[G++]=h,s[G++]=y}var Ws=nr(dl,{counterRight:!0,extendNonceFn:ul}),gs=_i({blockSize:64,nonceLength:24,tagLength:16},(t,e)=>({encrypt(n,s){s=Vs(n.length+32,s,!1);let i=s.subarray(0,32),r=s.subarray(32);s.set(n,32),St(i),Ws(t,e,s,s);let o=Ss(r,i);return s.set(o,16),St(s.subarray(0,16),o),s.subarray(16)},decrypt(n,s){tt(n),s=Vs(n.length+32,s,!1);let i=s.subarray(0,32),r=s.subarray(32,48),o=s.subarray(48);s.set(n,32),St(i);let l=Ws(t,e,i,i),c=Ss(o,l);if(!qi(r,c))throw Error("invalid tag");return Ws(t,e,s.subarray(16),s.subarray(16)),St(i,r,c),o}}));/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function pl(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function Le(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Ot(t,...e){if(!pl(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function Me(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function yn(t,e){Ot(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function ir(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function he(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function ye(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function we(t,e){return t<<32-e|t>>>e}var rr=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function or(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}var lr=rr?(t)=>t:(t)=>or(t);function ml(t){for(let e=0;e<t.length;e++)t[e]=or(t[e]);return t}var ct=rr?(t)=>t:ml;function hl(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function Ze(t){if(typeof t==="string")t=hl(t);return Ot(t),t}class Ks{}function cr(t){let e=(s,i)=>t(i).update(Ze(s)).digest(),n=t({});return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var ar=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var Zn=BigInt(4294967295),dr=BigInt(32);function xs(t,e=!1){if(e)return{h:Number(t&Zn),l:Number(t>>dr&Zn)};return{h:Number(t>>dr&Zn)|0,l:Number(t&Zn)|0}}function Rt(t,e,n,s,i){return t=t+e+i|0,s=we(s^t,16),n=n+s|0,e=we(e^n,12),{a:t,b:e,c:n,d:s}}function Ct(t,e,n,s,i){return t=t+e+i|0,s=we(s^t,8),n=n+s|0,e=we(e^n,7),{a:t,b:e,c:n,d:s}}class Rs extends Ks{constructor(t,e){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,Le(t),Le(e),this.blockLen=t,this.outputLen=e,this.buffer=new Uint8Array(t),this.buffer32=he(this.buffer)}update(t){Me(this),t=Ze(t),Ot(t);let{blockLen:e,buffer:n,buffer32:s}=this,i=t.length,r=t.byteOffset,o=t.buffer;for(let l=0;l<i;){if(this.pos===e)ct(s),this.compress(s,0,!1),ct(s),this.pos=0;let c=Math.min(e-this.pos,i-l),d=r+l;if(c===e&&!(d%4)&&l+c<i){let u=new Uint32Array(o,d,Math.floor((i-l)/4));ct(u);for(let p=0;l+e<i;p+=s.length,l+=e)this.length+=e,this.compress(u,p,!1);ct(u);continue}n.set(t.subarray(l,l+c),this.pos),this.pos+=c,this.length+=c,l+=c}return this}digestInto(t){Me(this),yn(t,this);let{pos:e,buffer32:n}=this;this.finished=!0,ye(this.buffer.subarray(e)),ct(n),this.compress(n,0,!0),ct(n);let s=he(t);this.get().forEach((i,r)=>s[r]=lr(i))}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}_cloneInto(t){let{buffer:e,length:n,finished:s,destroyed:i,outputLen:r,pos:o}=this;return t||(t=new this.constructor({dkLen:r})),t.set(...this.get()),t.buffer.set(e),t.destroyed=i,t.finished=s,t.length=n,t.pos=o,t.outputLen=r,t}clone(){return this._cloneInto()}}function Cs(t,e,n,s,i,r,o,l,c,d,u,p,h,y,Z,b,X,I,f,S){let G=0;for(let W=0;W<s;W++)({a:i,b:c,c:h,d:X}=Rt(i,c,h,X,n[e+t[G++]])),{a:i,b:c,c:h,d:X}=Ct(i,c,h,X,n[e+t[G++]]),{a:r,b:d,c:y,d:I}=Rt(r,d,y,I,n[e+t[G++]]),{a:r,b:d,c:y,d:I}=Ct(r,d,y,I,n[e+t[G++]]),{a:o,b:u,c:Z,d:f}=Rt(o,u,Z,f,n[e+t[G++]]),{a:o,b:u,c:Z,d:f}=Ct(o,u,Z,f,n[e+t[G++]]),{a:l,b:p,c:b,d:S}=Rt(l,p,b,S,n[e+t[G++]]),{a:l,b:p,c:b,d:S}=Ct(l,p,b,S,n[e+t[G++]]),{a:i,b:d,c:Z,d:S}=Rt(i,d,Z,S,n[e+t[G++]]),{a:i,b:d,c:Z,d:S}=Ct(i,d,Z,S,n[e+t[G++]]),{a:r,b:u,c:b,d:X}=Rt(r,u,b,X,n[e+t[G++]]),{a:r,b:u,c:b,d:X}=Ct(r,u,b,X,n[e+t[G++]]),{a:o,b:p,c:h,d:I}=Rt(o,p,h,I,n[e+t[G++]]),{a:o,b:p,c:h,d:I}=Ct(o,p,h,I,n[e+t[G++]]),{a:l,b:c,c:y,d:f}=Rt(l,c,y,f,n[e+t[G++]]),{a:l,b:c,c:y,d:f}=Ct(l,c,y,f,n[e+t[G++]]);return{v0:i,v1:r,v2:o,v3:l,v4:c,v5:d,v6:u,v7:p,v8:h,v9:y,v10:Z,v11:b,v12:X,v13:I,v14:f,v15:S}}var Wt={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},Ht=ar.slice(),ur=(()=>{let t=Array.from({length:16},(s,i)=>i),e=(s)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((i)=>s[i]),n=[];for(let s=0,i=t;s<7;s++,i=e(i))n.push(...i);return Uint8Array.from(n)})();class Hs extends Rs{constructor(t={},e=0){super(64,t.dkLen===void 0?32:t.dkLen);this.chunkPos=0,this.chunksDone=0,this.flags=0,this.stack=[],this.posOut=0,this.bufferOut32=new Uint32Array(16),this.chunkOut=0,this.enableXOF=!0;let{key:n,context:s}=t,i=s!==void 0;if(n!==void 0){if(i)throw Error('Only "key" or "context" can be specified at same time');let r=Ze(n).slice();Ot(r,32),this.IV=he(r),ct(this.IV),this.flags=e|Wt.KEYED_HASH}else if(i){let r=Ze(s),o=new Hs({dkLen:32},Wt.DERIVE_KEY_CONTEXT).update(r).digest();this.IV=he(o),ct(this.IV),this.flags=e|Wt.DERIVE_KEY_MATERIAL}else this.IV=Ht.slice(),this.flags=e;this.state=this.IV.slice(),this.bufferOut=ir(this.bufferOut32)}get(){return[]}set(){}b2Compress(t,e,n,s=0){let{state:i,pos:r}=this,{h:o,l}=xs(BigInt(t),!0),{v0:c,v1:d,v2:u,v3:p,v4:h,v5:y,v6:Z,v7:b,v8:X,v9:I,v10:f,v11:S,v12:G,v13:W,v14:H,v15:k}=Cs(ur,s,n,7,i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],Ht[0],Ht[1],Ht[2],Ht[3],o,l,r,e);i[0]=c^X,i[1]=d^I,i[2]=u^f,i[3]=p^S,i[4]=h^G,i[5]=y^W,i[6]=Z^H,i[7]=b^k}compress(t,e=0,n=!1){let s=this.flags;if(!this.chunkPos)s|=Wt.CHUNK_START;if(this.chunkPos===15||n)s|=Wt.CHUNK_END;if(!n)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,s,t,e),this.chunkPos+=1,this.chunkPos===16||n){let i=this.state;this.state=this.IV.slice();for(let r,o=this.chunksDone+1;n||!(o&1);o>>=1){if(!(r=this.stack.pop()))break;this.buffer32.set(r,0),this.buffer32.set(i,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|Wt.PARENT,this.buffer32,0),i=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(i)}this.pos=0}_cloneInto(t){t=super._cloneInto(t);let{IV:e,flags:n,state:s,chunkPos:i,posOut:r,chunkOut:o,stack:l,chunksDone:c}=this;return t.state.set(s.slice()),t.stack=l.map((d)=>Uint32Array.from(d)),t.IV.set(e),t.flags=n,t.chunkPos=i,t.chunksDone=c,t.posOut=r,t.chunkOut=o,t.enableXOF=this.enableXOF,t.bufferOut32.set(this.bufferOut32),t}destroy(){this.destroyed=!0,ye(this.state,this.buffer32,this.IV,this.bufferOut32),ye(...this.stack)}b2CompressOut(){let{state:t,pos:e,flags:n,buffer32:s,bufferOut32:i}=this,{h:r,l:o}=xs(BigInt(this.chunkOut++));ct(s);let{v0:l,v1:c,v2:d,v3:u,v4:p,v5:h,v6:y,v7:Z,v8:b,v9:X,v10:I,v11:f,v12:S,v13:G,v14:W,v15:H}=Cs(ur,0,s,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],Ht[0],Ht[1],Ht[2],Ht[3],o,r,e,n);i[0]=l^b,i[1]=c^X,i[2]=d^I,i[3]=u^f,i[4]=p^S,i[5]=h^G,i[6]=y^W,i[7]=Z^H,i[8]=t[0]^b,i[9]=t[1]^X,i[10]=t[2]^I,i[11]=t[3]^f,i[12]=t[4]^S,i[13]=t[5]^G,i[14]=t[6]^W,i[15]=t[7]^H,ct(s),ct(i),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,ye(this.buffer.subarray(this.pos));let t=this.flags|Wt.ROOT;if(this.stack.length)t|=Wt.PARENT,ct(this.buffer32),this.compress(this.buffer32,0,!0),ct(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else t|=(!this.chunkPos?Wt.CHUNK_START:0)|Wt.CHUNK_END;this.flags=t,this.b2CompressOut()}writeInto(t){Me(this,!1),Ot(t),this.finish();let{blockLen:e,bufferOut:n}=this;for(let s=0,i=t.length;s<i;){if(this.posOut>=e)this.b2CompressOut();let r=Math.min(e-this.posOut,i-s);t.set(n.subarray(this.posOut,this.posOut+r),s),this.posOut+=r,s+=r}return t}xofInto(t){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto(t)}xof(t){return Le(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(yn(t,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}}var Ys=cr((t)=>new Hs(t));var yl=32,Wy=Symbol("X25519Sk");function pr(t){if(t.byteLength!==yl)return a(10);return m(t)}var Q=(1n<<255n)-19n,Zl=121665n,mr=new Uint8Array(32);mr[0]=9;function hr(t){let e=0n;for(let n=t.length-1;n>=0;n--)e=e<<8n|BigInt(t[n]);return e}function bl(t){let e=new Uint8Array(32),n=(t%Q+Q)%Q;for(let s=0;s<32;s++)e[s]=Number(n&0xffn),n>>=8n;return e}function Xl(t){let e=t.slice();return e[31]&=127,hr(e)}function Gl(t){let e=t.slice();return e[0]&=248,e[31]&=127,e[31]|=64,e}function bn(t,e,n){let s=-t,i=(e^n)&s;return[e^i,n^i]}function fl(t){let e=Q-2n,n=(t%Q+Q)%Q,s=1n;while(e>0n){if(e&1n)s=s*n%Q;n=n*n%Q,e>>=1n}return s}function Ts(t,e){let n=Gl(t),s=Xl(e),i=1n,r=0n,o=s,l=1n,c=0n,d=hr(n);for(let u=254;u>=0;u--){let p=d>>BigInt(u)&1n;c^=p,[i,o]=bn(c,i,o),[r,l]=bn(c,r,l),c=p;let h=(i+r)%Q,y=h*h%Q,Z=(i-r+Q)%Q,b=Z*Z%Q,X=(y-b+Q)%Q,I=(o+l)%Q,S=(o-l+Q)%Q*h%Q,G=I*Z%Q,W=(S+G)%Q,H=(S-G+Q)%Q;o=W*W%Q,l=s*H*H%Q,i=y*b%Q,r=X*(y+Zl*X)%Q}return[i,o]=bn(c,i,o),[r,l]=bn(c,r,l),n.fill(0),bl(i*fl(r)%Q)}function yr(t){return Ts(t,mr)}var ks=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function Zr(t){let e=new Uint8Array(ks.length+32);return e.set(ks),e.set(t.subarray(0,32),ks.length),e}var Ls=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);function br(t){let e=new Uint8Array(Ls.length+32);return e.set(Ls),e.set(t.subarray(0,32),Ls.length),e}function Xr(t){return typeof t==="string"?new TextEncoder().encode(t):t}function Yt(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),e}class jt{verifyKeys=new Map;async genRandomBytes(t){return ke(t)}async gen256BitSecureRandomSeed(){return ke(32)}async encryptXSalsa20Poly1305Combined(t,e){let n=ke(24),i=gs(e,n).encrypt(t);return new Uint8Array([...n,...i])}async decryptXSalsa20Poly1305Combined(t,e){let n=t.slice(0,24),s=t.slice(24);return gs(e,n).decrypt(s)}async deriveEd25519KeyPair(t){let e=t,n=Zr(e),s=Yt(n),i;try{let d=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!0,["sign"]);i=await globalThis.crypto.subtle.exportKey("jwk",d)}finally{n.fill(0),new Uint8Array(s).fill(0)}if(typeof i.x!=="string")throw Error("Ed25519 JWK missing x");let r=i.x;i.d=void 0;let o=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:r},{name:"Ed25519"},!0,["verify"]),l=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",o));this.verifyKeys.set(pt(l),o);let c=new Uint8Array(64);return c.set(e,0),c.set(l,32),{keyType:"ed25519",privateKey:c,publicKey:l}}async importSignKey(t){let e=t.subarray(0,32),n=Zr(e),s=Yt(n);try{return await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!1,["sign"])}finally{n.fill(0),new Uint8Array(s).fill(0)}}async importVerifyKey(t){let e=pt(t),n=this.verifyKeys.get(e);if(n)return n;let s=await globalThis.crypto.subtle.importKey("raw",Yt(t),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(e,s),s}async signEd25519(t,e){let n=Xr(t),s=await this.importSignKey(e),i=await globalThis.crypto.subtle.sign({name:"Ed25519"},s,Yt(n));return new Uint8Array(i)}async checkSigEd25519(t,e,n){let s=Xr(e);try{let i=await this.importVerifyKey(n);return await globalThis.crypto.subtle.verify({name:"Ed25519"},i,Yt(t),Yt(s))}catch{return!1}}async blake3(t,e){if(e===void 0)return Ys(t);return Ys(t,e)}async genX25519(){let t=await ke(32);t[0]&=248,t[31]&=127,t[31]|=64;let[e,n]=pr(t);if(n!==0||e===void 0)throw t.fill(0),Error("X25519 scalar brand failed");let s=yr(e),i=br(e),r=Yt(i);try{let o=await globalThis.crypto.subtle.importKey("pkcs8",r,{name:"X25519"},!0,["deriveBits"]),l=await globalThis.crypto.subtle.exportKey("jwk",o);if(typeof l.x!=="string")throw Error("X25519 JWK missing x");let c=jn(l.x);if(l.d=void 0,!F(c,s))throw Error("X25519 WebCrypto pub != RFC 7748");return{priv:e,pub:s}}catch(o){throw e.fill(0),o}finally{i.fill(0),new Uint8Array(r).fill(0)}}async x25519Shared(t,e){let n=br(t),s=Yt(n);try{let i=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"X25519"},!1,["deriveBits"]),r=await globalThis.crypto.subtle.importKey("raw",Yt(e),{name:"X25519"},!1,[]),o=await globalThis.crypto.subtle.deriveBits({name:"X25519",public:r},i,256);return new Uint8Array(o)}catch{return Ts(t,e)}finally{n.fill(0),new Uint8Array(s).fill(0)}}}var Vl=new jt,be=Vl;var q="entities",Xn="entity_type_created_at",ws="entity_type_updated_at",Ps="entity_type_parent_id",Xe="entity_tags",Gr="entity_type_group_id",fr="db",Vr=14;function Il(t){return"typ"in t}function Sl(t){let e={bod:t.body,crd:t.createdAt,...t.ctr!==0?{ctr:t.ctr}:{},eid:Y(t.eid),pid:t.pid?Y(t.pid):void 0,tgs:t.tags,typ:t.type,upd:t.updatedAt};if(e.pid===void 0)delete e.pid;if(e.tgs===void 0)delete e.tgs;if(e.ctr===void 0)delete e.ctr;return e}function Wl(t){if(!O(t))return{eid:Y(t.eid),upd:t.updatedAt,...t.ctr!==0?{ctr:t.ctr}:{}};return Sl(t)}function Ge(t){return{body:t.bod,createdAt:t.crd,updatedAt:t.upd,ctr:t.ctr??0,type:t.typ,eid:rt(t.eid),pid:t.pid?rt(t.pid):void 0,...t.tgs!==void 0?{tags:t.tgs}:{}}}function Ms(t){if(Il(t))return Ge(t);return{eid:rt(t.eid),updatedAt:t.upd,ctr:t.ctr??0}}function gl(t,e){if(e instanceof Date)return IDBKeyRange.only([t,e]);let n=e.range;return IDBKeyRange.bound([t,n.start],[t,n.end],n.excludeStart===!0,n.excludeEnd===!0)}function Kl(t){if(typeof t==="string")return IDBKeyRange.only(t);if("range"in t){let e=t.range;return IDBKeyRange.bound(e.start,e.end,e.excludeStart===!0,e.excludeEnd===!0)}return IDBKeyRange.bound(t.prefix,t.prefix+"￿")}function xl(t,e,n){let s=[];if(typeof n==="string"){for(let o of t)if(o.typ===e)s.push(Ge(o));return s}let i=new Set,r="prefix"in n?n.prefix:void 0;for(let o of t){if(o.typ!==e)continue;if(i.has(o.eid))continue;if(r!==void 0){let l=o.tgs;if(!l||!l.some((c)=>c.startsWith(r)))continue}i.add(o.eid),s.push(Ge(o))}return s}class Us{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=Cl().then((t)=>(t.onversionchange=()=>{if(t.close(),this.db===t)this.db=void 0},this.db=t,this.opening=void 0,t),(t)=>{throw this.opening=void 0,t}),this.opening}apply=async(t)=>{let e=new Set,n=[],s=performance.now();P("idb apply start",{ops:t.length});let i;try{i=await this.ensureDb()}catch{return{stats:t.map(()=>16),types:e,eids:n}}let r=i.transaction(q,"readwrite"),o=r.objectStore(q);return new Promise((l)=>{let c=Array(t.length).fill(0);if(t.length<1){l({stats:[],types:e,eids:n});return}r.oncomplete=()=>{P("idb apply complete",{ops:t.length,ms:Math.round(performance.now()-s)}),l({stats:c,types:e,eids:n})},r.onerror=()=>{for(let u=0;u<c.length;u++)if(c[u]===void 0)c[u]=18;l({stats:c,types:e,eids:n})};let d=new Map;for(let u=0;u<t.length;u++){let p=t[u],h=Y(p.eid),y={op:p,index:u},Z=d.get(h);if(Z)Z.push(y);else d.set(h,[y])}for(let[u,p]of d){if(p.length<1)continue;let h=o.get(u);h.onsuccess=()=>{let y=h.result,Z=y?Ms(y):void 0,b=!1;for(let{op:X,index:I}of p){let[f,S]=ce(Z,X);if(S!==0){c[I]=S;continue}if(f===void 0){c[I]=12;continue}b=!0;for(let G of ae(Z,f))e.add(G);Z=f}if(b)n.push(p[0].op.eid);if(Z){let X=o.put(Wl(Z));X.onerror=(I)=>{I.preventDefault();for(let{index:f}of p)c[f]=18}}},h.onerror=()=>{for(let{index:y}of p)c[y]=18}}})};async clear(){let t;try{t=await this.ensureDb()}catch{return 16}let e=t.transaction(q,"readwrite"),n=e.objectStore(q);return new Promise((s)=>{e.oncomplete=()=>s(0),e.onerror=()=>s(18),n.clear()})}async getRow(t){let e;try{e=await this.ensureDb()}catch{return a(16)}let n=Y(t),i=e.transaction(q,"readonly").objectStore(q);return new Promise((r)=>{let o=i.get(n);o.onsuccess=()=>{let l=o.result;if(!l)r(m(void 0));else r(m(Ms(l)))},o.onerror=()=>r(a(18))})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return a(n);if(e===void 0||!O(e))return m(void 0);return m(e)}async getByUpdatedAt(t,e){let[n,s]=Ce(e);if(s!==0)return a(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return a(16)}let o=i.transaction(q,"readonly").objectStore(q).index(ws),l=gl(t,e);return new Promise((c)=>{let d=o.getAll(l);d.onsuccess=()=>{let u=d.result;c(m(u.map(Ge)))},d.onerror=()=>c(a(18))})}async getAllOfType(t){let e;try{e=await this.ensureDb()}catch{return a(16)}let s=e.transaction(q,"readonly").objectStore(q).index(Xn);return new Promise((i)=>{let r=s.getAll(IDBKeyRange.bound([t],[t,[]]));r.onsuccess=()=>{let o=r.result;i(m(o.map(Ge)))},r.onerror=()=>i(a(18))})}async getByTag(t,e){let[n,s]=He(e);if(s!==0)return a(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return a(16)}let r=Kl(e),l=i.transaction(q,"readonly").objectStore(q).index(Xe);return new Promise((c)=>{let d=l.getAll(r);d.onsuccess=()=>{let u=d.result;c(m(xl(u,t,e)))},d.onerror=()=>c(a(18))})}async getAllEntities(t){if("pid"in t){let e;try{e=await this.ensureDb()}catch{return a(16)}let n=Y(t.pid),i=e.transaction(q,"readonly").objectStore(q).index(Ps);return new Promise((r)=>{let o=i.getAll(IDBKeyRange.only([t.type,n]));o.onsuccess=()=>{let c=o.result.map(Ge);r(m(c))},o.onerror=()=>r(a(18))})}else if("tag"in t)return await this.getByTag(t.type,t.tag);else if("updatedAt"in t)return await this.getByUpdatedAt(t.type,t.updatedAt);return await this.getAllOfType(t.type)}async getEntities(t){let e=performance.now(),[n,s]=await this.getAllEntities(t);if(P("idb getEntities",{type:t.type,n:n?.length??0,ms:Math.round(performance.now()-e)}),s!==0)return a(s);return m(n)}async countEntities({type:t}){let e;try{e=await this.ensureDb()}catch{return a(16)}let s=e.transaction(q,"readonly").objectStore(q).index(Xn);return new Promise((i)=>{let r=IDBKeyRange.bound([t],[t,[]]),o=s.count(r);o.onsuccess=()=>i(m(o.result)),o.onerror=()=>i(a(18))})}async checksum(t){let e;try{e=await this.ensureDb()}catch{return a(16)}let s=e.transaction(q,"readonly").objectStore(q),i=[];return new Promise((r)=>{let o=s.openCursor();o.onsuccess=()=>{let l=o.result;if(l){let c=l.value;i.push(Ye(Ms(c))),l.continue()}else xe(i,t).then(r)},o.onerror=()=>r(a(18))})}}function Rl(t,e){if(!t.objectStoreNames.contains(q))t.createObjectStore(q,{keyPath:"eid",autoIncrement:!1});let n=e.objectStore(q);if(!n.indexNames.contains(Xn))n.createIndex(Xn,["typ","crd"],{unique:!1});if(!n.indexNames.contains(ws))n.createIndex(ws,["typ","upd"],{unique:!1});if(n.indexNames.contains(Gr))n.deleteIndex(Gr);if(!n.indexNames.contains(Ps))n.createIndex(Ps,["typ","pid"],{unique:!1});if(n.indexNames.contains(Xe)){if(n.index(Xe).keyPath!=="tgs")n.deleteIndex(Xe)}if(!n.indexNames.contains(Xe))n.createIndex(Xe,"tgs",{unique:!1,multiEntry:!0})}function Cl(){return new Promise((t,e)=>{let n=indexedDB.open(fr,Vr);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!i){e(Error("Transaction is null during EntDB upgrade"));return}try{Rl(s,i)}catch(r){e(r instanceof Error?r:Error(String(r)))}},n.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${fr} → v${Vr}); waiting for other connections to close`)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error??Error("EntDB IndexedDB open failed"))})}async function Ir(){let t=new Us;return await t.init(),t}class Gn{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeTag=new Map;constructor(t=[],e){this.useIndex=e?.indexes!==!1;for(let n of t)this.put(n)}put(t){let e=Y(t.eid),n=this.ents.get(e);if(n!==void 0&&O(n))this.unindex(e,n);if(this.ents.set(e,t),O(t))this.index(e,t)}del(t){let e=this.ents.get(t);if(e===void 0)return;if(O(e))this.unindex(t,e);this.ents.delete(t)}index(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(!n)n=new Map,this.byType.set(e.type,n);if(n.set(t,e),e.pid){let s=Y(e.pid),i=this.byTypePid.get(e.type);if(!i)i=new Map,this.byTypePid.set(e.type,i);let r=i.get(s);if(!r)r=new Map,i.set(s,r);r.set(t,e)}if(e.tags){let s=this.byTypeTag.get(e.type);if(!s)s=new Map,this.byTypeTag.set(e.type,s);for(let i of e.tags){let r=s.get(i);if(!r)r=new Map,s.set(i,r);r.set(t,e)}}}unindex(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(n){if(n.delete(t),n.size===0)this.byType.delete(e.type)}if(e.pid){let s=Y(e.pid),i=this.byTypePid.get(e.type),r=i?.get(s);if(r){if(r.delete(t),r.size===0)i?.delete(s)}if(i&&i.size===0)this.byTypePid.delete(e.type)}if(e.tags){let s=this.byTypeTag.get(e.type);if(s){for(let i of e.tags){let r=s.get(i);if(r){if(r.delete(t),r.size===0)s.delete(i)}}if(s.size===0)this.byTypeTag.delete(e.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeTag.clear()}bucketList(t){if(!t||t.size===0)return[];let e=[];for(let n of t.values())e.push(n);return e}byTagSpec(t,e){let[n,s]=He(e);if(s!==0)return a(s);if(!n)return m([]);if(typeof e==="string")return m(this.bucketList(this.byTypeTag.get(t)?.get(e)));let i=this.byTypeTag.get(t);if(!i)return m([]);let r=new Set,o=[];for(let[l,c]of i){if(!as(l,e))continue;for(let[d,u]of c){if(r.has(d))continue;r.add(d),o.push(u)}}return m(o)}byDateSpec(t,e){let[n,s]=Ce(e);if(s!==0)return a(s);if(!n)return m([]);let i=[],r=this.byType.get(t);if(r){for(let o of r.values())if(cs(o.updatedAt,e))i.push(o)}return m(i)}async apply(t){let e=new Set,n=[],s=[];for(let i of t){let r=Y(i.eid),o=this.ents.get(r),[l,c]=ce(o,i);if(c!==0){s.push(c);continue}if(l===void 0){s.push(12);continue}for(let d of ae(o,l))e.add(d);this.put(l),n.push(i.eid),s.push(0)}return{stats:s,types:e,eids:n}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow(t){let e=Y(t),n=this.ents.get(e);return m(n)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return a(n);if(e===void 0||!O(e))return m(void 0);return m(e)}async getAllEntities(t){let{type:e}=t;if(this.useIndex){if("pid"in t){let s=Y(t.pid);return m(this.bucketList(this.byTypePid.get(e)?.get(s)))}if("tag"in t)return this.byTagSpec(e,t.tag);if("updatedAt"in t)return this.byDateSpec(e,t.updatedAt);return m(this.bucketList(this.byType.get(e)))}let n=[];if("pid"in t){for(let s of this.ents.values())if(O(s)&&s.type===e&&s.pid&&F(s.pid,t.pid))n.push(s)}else if("tag"in t){let s=t.tag,[i,r]=He(s);if(r!==0)return a(r);if(!i)return m(n);for(let o of this.ents.values())if(O(o)&&o.type===e&&o.tags&&o.tags.some((l)=>as(l,s)))n.push(o)}else if("updatedAt"in t){let s=t.updatedAt,[i,r]=Ce(s);if(r!==0)return a(r);if(!i)return m(n);for(let o of this.ents.values())if(O(o)&&o.type===e&&cs(o.updatedAt,s))n.push(o)}else for(let s of this.ents.values())if(O(s)&&s.type===e)n.push(s);return m(n)}async getEntities(t){let[e,n]=await this.getAllEntities(t);if(n!==0)return a(n);return m(e)}async countEntities({type:t}){if(this.useIndex)return m(this.byType.get(t)?.size??0);let e=0;for(let n of this.ents.values())if(O(n)&&n.type===t)e+=1;return m(e)}async checksum(t){let e=[];for(let n of this.ents.values())e.push(Ye(n));return xe(e,t)}}function Hl(t){let e=globalThis.requestAnimationFrame;if(typeof e!=="function"){queueMicrotask(t);return}e(()=>{e(t)})}async function Js(t){if(t?.verbose!==void 0)ln(t.verbose);let e=await Ir();if(t?.cache===!1)return e;return new zs(e,void 0,{indexes:t?.indexes,optimistic:t?.optimistic})}class zs{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();optimistic;inflight=0;warmP=new Map;constructor(t,e,n){if(this.durable=t,this.optimistic=n?.optimistic!==!1,P("CachedEntDB open",{optimistic:this.optimistic}),this.mem=new Gn(e??[],{indexes:n?.indexes}),e)for(let s of e)this.warmed.add(s.type)}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}emit(t){if(t.size<1)return;let e=performance.now();P("emit start",{types:[...t],listeners:this.listeners.size});for(let n of this.listeners)n(t);P("emit done",{ms:Math.round(performance.now()-e)})}run(t){let e=this.chain.then(t,t);return this.chain=e.then(()=>{return},()=>{return}),e}apply(t){let e,n;if(this.optimistic){n=wl(this.mem,t).types,e=new Map;for(let i of t){let r=Y(i.eid);e.set(r,Sr(this.mem.ents.get(r)))}this.inflight+=1,P("apply mem patched",{ops:t.length,types:n?[...n]:[],inflight:this.inflight})}let s=this.run(async()=>{P("persist start",{ops:t.length});try{let i=performance.now(),r=await this.durable.apply(t);if(P("persist durable.apply done",{ms:Math.round(performance.now()-i)}),!this.optimistic){let{changed:l,status:c}=await this.pullEids(t.map((d)=>d.eid));if(this.emit(l),c!==0)return{stats:t.map(()=>c),types:r.types,eids:r.eids};return r}let o=[];for(let l=0;l<t.length;l++)if(r.stats[l]!==0)o.push(t[l].eid);if(o.length>0){P("persist pull rejected eids",{n:o.length});let{changed:l,status:c}=await this.pullEids(o,e);if(this.emit(l),c!==0)return{stats:t.map(()=>c),types:r.types,eids:r.eids}}return P("persist done"),r}finally{if(this.optimistic)this.inflight-=1}});if(n)Hl(()=>{P("emit after paint"),this.emit(n)});return s}clear(){return this.run(async()=>{let t=await this.durable.clear();if(t!==0)return t;let e=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable(t){let e=[...t].length;return P("ingest queued",{eids:e}),this.run(async()=>{let n=performance.now();P("ingest start",{eids:e});let{changed:s,status:i}=await this.pullEids(t);return P("ingest done",{ms:Math.round(performance.now()-n),changed:[...s]}),this.emit(s),i})}async pullEids(t,e){let n=new Set,s=new Set;for(let i of t){let r=Y(i);if(s.has(r))continue;s.add(r);let[o,l]=await this.durable.getRow(i);if(l!==0)return{changed:n,status:l};let c=this.mem.ents.get(r);if(c!==void 0&&o!==void 0&&Bs(c,o))continue;if(e){if(!Ml(Sr(c),e.get(r)))continue}if(o){if(this.mem.put(o),!c||!Yl(c,o)){if(O(o))n.add(o.type);if(c!==void 0&&O(c))n.add(c.type)}}else if(c!==void 0){if(this.mem.del(r),O(c))n.add(c.type)}}return{changed:n,status:0}}async warmType(t){if(this.warmed.has(t))return 0;let e=performance.now();P("warmType start",{type:t});let[n,s]=await this.durable.getEntities({type:t});if(s!==0)return s;if(n)for(let i of n){let r=Y(i.eid),o=this.mem.ents.get(r);if(!o||Bs(i,o))this.mem.put(i)}return this.warmed.add(t),P("warmType done",{type:t,n:n?.length??0,ms:Math.round(performance.now()-e)}),0}beginWarm(t){if(this.warmed.has(t))return Promise.resolve(0);let e=this.warmP.get(t);if(e)return e;let n=this.warmType(t).finally(()=>{this.warmP.delete(t)});return this.warmP.set(t,n),n}ensureWarm(t){if(this.warmed.has(t))return;this.beginWarm(t).then((e)=>{if(e===0)this.emit(new Set([t]))})}async getRow(t){let e=Y(t);if(this.mem.ents.has(e))return this.mem.getRow(t);let[n,s]=await this.durable.getRow(t);if(s!==0)return a(s);if(n){let i=this.mem.ents.get(e);if(!i||Bs(n,i))this.mem.put(n)}return this.mem.getRow(t)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return a(n);if(e===void 0||!O(e))return m(void 0);return m(e)}async getEntities(t){if(this.warmed.has(t.type))return P("getEntities mem",{type:t.type}),this.mem.getEntities(t);if(this.inflight>0)return P("getEntities inflight-mem",{type:t.type}),this.ensureWarm(t.type),this.mem.getEntities(t);P("getEntities beginWarm",{type:t.type});let e=await this.beginWarm(t.type);if(e!==0)return a(e);return P("getEntities afterWarm",{type:t.type}),this.mem.getEntities(t)}async countEntities({type:t}){if(this.warmed.has(t))return this.mem.countEntities({type:t});if(this.inflight>0)return this.ensureWarm(t),this.mem.countEntities({type:t});let e=await this.beginWarm(t);if(e!==0)return a(e);return this.mem.countEntities({type:t})}async checksum(t){return this.durable.checksum(t)}}function Yl(t,e){if(O(t)!==O(e))return!1;if(t.ctr!==e.ctr)return!1;if(t.updatedAt.getTime()!==e.updatedAt.getTime())return!1;if(!F(t.eid,e.eid))return!1;if(!O(t)||!O(e))return!0;if(t.createdAt.getTime()!==e.createdAt.getTime())return!1;if(t.type!==e.type)return!1;if(!kl(t.pid,e.pid))return!1;if(!Tl(t.tags,e.tags))return!1;return Ll(t.body,e.body)}function Tl(t,e){if(t===e)return!0;if(t===void 0||e===void 0)return!1;if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function kl(t,e){if(t===void 0&&e===void 0)return!0;if(t===void 0||e===void 0)return!1;return F(t,e)}function Ll(t,e){if(Object.is(t,e))return!0;if(t instanceof Uint8Array&&e instanceof Uint8Array)return F(t,e);if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();try{return F(Ft(t),Ft(e))}catch{return!1}}function Bs(t,e){let n=t.updatedAt.getTime(),s=e.updatedAt.getTime();if(n!==s)return n>s;return t.ctr>e.ctr}function Sr(t){if(t===void 0)return;return{t:t.updatedAt.getTime(),ctr:t.ctr}}function Ml(t,e){if(t===void 0||e===void 0)return t===e;return t.t===e.t&&t.ctr===e.ctr}function wl(t,e){let n=new Set,s=[];for(let i of e){let r=Y(i.eid),o=t.ents.get(r),[l,c]=ce(o,i);if(c!==0){s.push(c);continue}if(l===void 0){s.push(12);continue}for(let d of ae(o,l))n.add(d);t.put(l),s.push(0)}return{stats:s,types:n}}import{useEffect as Nn,useState as ci}from"react";class Ns{db;constructor(t){this.db=t}async enq(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(Zt,"readwrite"),s=n.objectStore(Zt);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let o of e){let l=`${o.host}:${o.seq}`;s.put(o,l)}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(Zt,"readwrite"),i=s.objectStore(Zt);return new Promise((r,o)=>{s.oncomplete=()=>r(),s.onerror=()=>o(s.error);for(let l of n){let c=`${t}:${l}`;i.delete(c)}})}async list(){let e=this.db.transaction(Zt,"readonly").objectStore(Zt);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async count(){let e=this.db.transaction(Zt,"readonly").objectStore(Zt);return new Promise((n,s)=>{let i=e.count();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(Zt,"readwrite"),e=t.objectStore(Zt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}function Wr(t){return{label:t.label,handle:new URL(t.handle),idx:t.idx,lastSeq:t.lastSeq||0,clockOffset:t.clockOffset,subscription:t.subscription}}function Pl(t,e){let n={...t};if(e.setLastSeq!==void 0)n.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0){let s=n.lastSeq||0;if(e.lastSeq>s)n.lastSeq=e.lastSeq}return delete n.numBags,delete n.numDupes,n}class Es{db;constructor(t){this.db=t}async add(t){let e=await this.get(t.label),n=e!==void 0&&e.handle.href===t.handle.href&&(e.idx??0)===(t.idx??0);return this.put({...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0})}async put(t){let e={...t,handle:t.handle.toString(),lastSeq:t.lastSeq??0},n=this.db.transaction(at,"readwrite"),s=n.objectStore(at);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error),s.put(e)})}async touch(t,e){return this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.db.transaction(at,"readwrite"),s=n.objectStore(at);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);let o=s.get(t);o.onsuccess=()=>{let l=o.result;if(!l)return;s.put(Pl(l,e))}})}async get(t){let n=this.db.transaction(at,"readonly").objectStore(at);return new Promise((s,i)=>{let r=n.get(t);r.onsuccess=()=>{let o=r.result;if(!o)s(void 0);else s(Wr(o))},r.onerror=()=>i(r.error)})}async set(t,e){let n=await this.get(t);if(!n)return 13;try{return await this.put({...n,...e}),0}catch{return 18}}async del(t){let e=this.db.transaction(at,"readwrite"),n=e.objectStore(at);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}async list(){let e=this.db.transaction(at,"readonly").objectStore(at);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>{let r=i.result;n(r.map(Wr))},i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(at,"readwrite"),e=t.objectStore(at);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}class Fs{crypto;db;constructor(t,e){this.crypto=e;this.db=t}async add(t){let e=this.db.transaction(A,"readwrite"),n=e.objectStore(A);return new Promise((s)=>{if(t.length===0){s([]);return}let i=Array(t.length).fill(0);e.oncomplete=()=>s(i),e.onerror=()=>{for(let r=0;r<i.length;r++)i[r]=18;s(i)};for(let r=0;r<t.length;r++){let{key:o,data:l}=t[r],c=Y(o),d=n.put(l,c);d.onerror=(u)=>{u.preventDefault(),i[r]=18}}})}async del(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(A,"readwrite"),s=n.objectStore(A);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let o of e){let l=Y(o);s.delete(l)}})}async get(t){let n=this.db.transaction(A,"readonly").objectStore(A);return new Promise((s,i)=>{let r=Y(t),o=n.get(r);o.onsuccess=async()=>{let l=o.result;if(l)s(await zt(t,l,this.crypto));else s(void 0)},o.onerror=()=>i(o.error)})}async has(t){return await this.get(t)!==void 0}async list(t){let e=t?.apld,n=t?.body!==!1,i=this.db.transaction(A,"readonly").objectStore(A);return new Promise((r,o)=>{let l=[],c=e===void 0?i.openCursor():i.index(Pe).openCursor(IDBKeyRange.only(e));c.onsuccess=(d)=>{let u=d.target.result;if(u){let p=e===void 0?u.key:u.primaryKey,h=u.value;l.push({hash:rt(p),data:h}),u.continue()}else Promise.all(l.map(({hash:p,data:h})=>zt(p,h,this.crypto,{body:n}))).then(r).catch(o)},c.onerror=()=>o(c.error)})}async count(t){let n=this.db.transaction(A,"readonly").objectStore(A);return new Promise((s,i)=>{let r=t===void 0?n.count():n.index(Pe).count(IDBKeyRange.only(t));r.onsuccess=()=>s(r.result),r.onerror=()=>i(r.error)})}async listKeys(){let e=this.db.transaction(A,"readonly").objectStore(A);return new Promise((n,s)=>{let i=[],r=e.openKeyCursor();r.onsuccess=(o)=>{let l=o.target.result;if(l)i.push(rt(l.key)),l.continue();else n(i)},r.onerror=()=>s(r.error)})}async last(t){let n=this.db.transaction(A,"readonly").objectStore(A);return new Promise((s,i)=>{let r,o=n.openCursor();o.onsuccess=async(l)=>{let c=l.target.result;if(c){let{key:d,value:u}=c;if(F(t,u.eid)){if(!r||(u.ctr??0)>(r.data.ctr??0)||(u.ctr??0)===(r.data.ctr??0)&&(u.off??0)>(r.data.off??0))r={key:d,data:u}}c.continue()}else if(r){let d=rt(r.key);s(await zt(d,r.data,this.crypto))}else s(void 0)},o.onerror=()=>i(o.error)})}async markApplied(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(A,"readwrite"),s=n.objectStore(A);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let o of e){let l=Y(o),c=s.get(l);c.onsuccess=()=>{let d=c.result;if(!d)return;vt(d,Jt),s.put(d,l)},c.onerror=(d)=>{d.preventDefault()}}})}async markFailed(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(A,"readwrite"),s=n.objectStore(A);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let{key:o,err:l}of e){let c=Y(o),d=s.get(c);d.onsuccess=()=>{let u=d.result;if(!u)return;vt(u,It,l),s.put(u,c)},d.onerror=(u)=>{u.preventDefault()}}})}async wipe(){let t=this.db.transaction(A,"readwrite"),e=t.objectStore(A);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var fn={encode(t,e){let n=t.writeVarString(e.handle);if(n!==0)return n;let s=t.writeVarString(e.label);if(s!==0)return s;return t.writeVarInt(e.idx??0)},decode(t){let[e,n]=t.readVarString();if(n!==0)return a(n);let[s,i]=t.readVarString();if(i!==0)return a(i);let[r,o]=t.readVarInt();if(o!==0)return a(o);return m({handle:e,label:s,idx:r})}};var Qs={encode(t,e){let n=t.writeVarInt(e.hosts.length);if(n!==0)return n;for(let s of e.hosts){let i=t.writeStruct(fn,s);if(i!==0)return i}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);if(e===void 0||e<0)return a(10);let s=[];for(let i=0;i<e;i++){let[r,o]=t.readStruct(fn);if(o!==0)return a(o);if(r===void 0)return a(14);s.push(r)}return m({hosts:s})}};var Ul=new TextEncoder().encode("diplomatic.qrpair.v1"),Ue=32,Bl=Ue+24+16,Jl=32,qZ=Symbol("DHKEReq"),_Z=Symbol("DHKEResp");function vs(t){if(t.byteLength!==Ue)return a(10);return m(t)}function Ds(t){if(t.byteLength<Bl)return a(10);return m(t)}var Vn=new jt;async function Os(t,e,n,s){let i;try{i=await Vn.x25519Shared(t,e)}catch{return a(29)}try{if(i.byteLength!==Ue||i.every((l)=>l===0))return a(10);let r=Vt(i,Ul),o=Vt(r,Vt(n,s));try{let l=await Vn.blake3(o);return m(l.slice(0,Jl))}finally{r.fill(0),o.fill(0)}}finally{i.fill(0)}}class Be{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(){let t;try{let e=await Vn.genX25519();t=e.priv;let[n,s]=vs(e.pub);if(s!==0)return a(s);if(n===void 0)return a(10);let i=new Be(t,n);return t=void 0,m(i)}catch{return a(29)}finally{t?.fill(0)}}wipe(){this.#t.fill(0)}get dhkeReq(){let[t,e]=vs(this.#e.slice());if(t===void 0)throw Error(`dhkeReq ${e}`);return t}async finish(t){let e=t.subarray(0,Ue),n=t.subarray(Ue),[s,i]=await Os(this.#t,e,this.#e,e);if(i!==0)return a(i);if(s===void 0)return a(12);let r;try{try{r=await Vn.decryptXSalsa20Poly1305Combined(n,s)}catch{return a(20)}let[o,l]=it.fromPairPlain(r);if(l!==0)return a(l);if(o===void 0)return a(12);return this.wipe(),m(o)}finally{s.fill(0),r?.fill(0)}}}function Tt(t){let e=new Uint8Array(t);if(t>0)crypto.getRandomValues(e);return e}var At=32,In="DIPLOMATIC",gt="public-key",zl=-7,Nl=-8,El=-257,Sn=[{type:gt,alg:zl},{type:gt,alg:Nl},{type:gt,alg:El}];function xr(t){return t.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function Nt(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function Wn(t){if(t instanceof ArrayBuffer)return new Uint8Array(t).slice();return new Uint8Array(t.buffer,t.byteOffset,t.byteLength).slice()}function qt(t){if(t?.rpId!==void 0)return m(t.rpId);if(typeof location>"u")return a(9);return m(xr(location.hostname))}var As="";function Fl(){return As}function Et(t){if(t instanceof Error){As=t.message===""?t.name:`${t.name}: ${t.message}`;return}As=String(t)}function gn(t){if(!(t instanceof Error))return!1;return t.name==="NotAllowedError"&&t.message.toLowerCase().includes("does not have focus")}function gr(){if(typeof document>"u")return!0;return document.visibilityState!=="hidden"}function fe(){if(typeof globalThis.focus!=="function")return;try{globalThis.focus()}catch{}}function Kn(t=2500){if(gr())return fe(),Promise.resolve();return new Promise((e)=>{let n=()=>{clearTimeout(i),document.removeEventListener("visibilitychange",s),fe(),e()},s=()=>{if(gr())n()},i=setTimeout(n,t);document.addEventListener("visibilitychange",s),s()})}async function xn(t){await Kn();try{return await navigator.credentials.create(t)}catch(e){if(!gn(e))throw e;return fe(),await navigator.credentials.create(t)}}async function Rn(t){await Kn();try{return await navigator.credentials.get(t)}catch(e){if(!gn(e))throw e;return fe(),await navigator.credentials.get(t)}}function _t(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function $t(t){if(t===null||t.type!==gt||!("rawId"in t)||typeof t.getClientExtensionResults!=="function")return a(27);return m(t)}async function Cn(t){if(typeof PublicKeyCredential>"u")return!1;let e=PublicKeyCredential.getClientCapabilities;if(typeof e!=="function")return!0;let n=await e.call(PublicKeyCredential);if(t in n)return n[t]===!0;return!0}function qs(t){if(t==="platform"||t==="cross-platform")return t;return}function Rr(t){if(/iPhone|iPad|iPod/i.test(t))return"ios";if(/Android/i.test(t))return"android";if(/Mac OS X|Macintosh/i.test(t))return"macos";if(/Windows/i.test(t))return"windows";if(/Linux/i.test(t))return"linux";return"other"}function _s(t){let e=t.response;if(!("getTransports"in e))return;let n=e.getTransports;if(typeof n!=="function")return;let s=n.call(e);if(!Array.isArray(s))return;let i=[];for(let r of s)if(typeof r==="string"&&r.length>0)i.push(r);return i.length===0?void 0:i}var Ql=32,vl=64,js=37,Kr=16;function Cr(t){let e=t.response;if(!("getAuthenticatorData"in e))return;let n=e.getAuthenticatorData;if(typeof n!=="function")return;let s=n.call(e);if(!(s instanceof ArrayBuffer))return;let i=new Uint8Array(s);if(i.byteLength<js+Kr)return;let r=i[Ql];if(r===void 0||(r&vl)===0)return;return i.slice(js,js+Kr)}function Dl(){return Cn("extension:largeBlob")}async function Hr(t){let e=_t();if(e!==0)return a(e);let[n,s]=qt(t);if(s!==0)return a(s);if(n===void 0)return a(9);let i=t?.userName??t?.rpName??n,r={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(t?.authenticatorAttachment!==void 0)r.authenticatorAttachment=t.authenticatorAttachment;let o={largeBlob:{support:"required"}},l;try{l=await xn({publicKey:{challenge:Tt(At),rp:{id:n,name:t?.rpName??In},user:{id:Tt(16),name:i,displayName:i},pubKeyCredParams:Sn,authenticatorSelection:r,extensions:o,...t?.hints!==void 0?{hints:t.hints}:{}}})}catch(p){return Et(p),a(30)}let[c,d]=$t(l);if(d!==0)return a(d);if(c===void 0)return a(27);if(c.getClientExtensionResults().largeBlob?.supported!==!0)return a(30);return m(new Uint8Array(c.rawId))}async function $s(t,e,n,s){let i={challenge:Tt(At),rpId:t,userVerification:"preferred"};if(e?.hints!==void 0)i.hints=e.hints;if(n!==void 0)i.allowCredentials=[{type:gt,id:Nt(n)}];if(s!==void 0)i.extensions=s;let r;try{r=await Rn({publicKey:i})}catch(c){return Et(c),a(30)}let[o,l]=$t(r);if(l!==0)return a(l);if(o===void 0)return a(27);return m(o)}async function Yr(t,e){let n=_t();if(n!==0)return a(n);let[s,i]=qt(e);if(i!==0)return a(i);if(s===void 0)return a(9);let r=t;if(r===void 0){let[p,h]=await $s(s,e);if(h!==0&&e?.hints!==void 0)[p,h]=await $s(s,{rpId:e.rpId,rpName:e.rpName});if(h!==0)return a(h);if(p===void 0)return a(27);r=new Uint8Array(p.rawId)}let[o,l]=await $s(s,e,r,{largeBlob:{read:!0}});if(l!==0)return a(l);if(o===void 0)return a(27);let d=o.getClientExtensionResults().largeBlob;if(d===void 0||d.blob===void 0)return a(7);let u=Wn(d.blob);if(u.byteLength===0)return a(7);return m({blob:u,credId:new Uint8Array(o.rawId)})}var Hn=new TextEncoder().encode("diplomatic.prf.v1"),Je="diplomatic-prf";async function Ol(){return Cn("extension:prf")}var Yn="dmFyIENlPTY0O3ZhciBMbj0zMixUZT04O3ZhciBrdD0zMjt2YXIgT249MzAwMDAsS249NTEyLEI7KChJKT0+e0lbSS5TdWNjZXNzPTBdPSJTdWNjZXNzIjtJW0kuSW52YWxpZFNpZ25hdHVyZT0zXT0iSW52YWxpZFNpZ25hdHVyZSI7SVtJLkNsb2NrT3V0T2ZTeW5jPTRdPSJDbG9ja091dE9mU3luYyI7SVtJLlVzZXJOb3RSZWdpc3RlcmVkPTVdPSJVc2VyTm90UmVnaXN0ZXJlZCI7SVtJLlNlcnZlck1pc2NvbmZpZ3VyZWQ9Nl09IlNlcnZlck1pc2NvbmZpZ3VyZWQiO0lbSS5NaXNzaW5nQm9keT03XT0iTWlzc2luZ0JvZHkiO0lbSS5FeHRyYUJvZHlDb250ZW50PThdPSJFeHRyYUJvZHlDb250ZW50IjtJW0kuTWlzc2luZ1BhcmFtPTldPSJNaXNzaW5nUGFyYW0iO0lbSS5JbnZhbGlkUGFyYW09MTBdPSJJbnZhbGlkUGFyYW0iO0lbSS5JbnZhbGlkUmVxdWVzdD0xMV09IkludmFsaWRSZXF1ZXN0IjtJW0kuSW50ZXJuYWxFcnJvcj0xMl09IkludGVybmFsRXJyb3IiO0lbSS5Ob3RGb3VuZD0xM109Ik5vdEZvdW5kIjtJW0kuSW52YWxpZE1lc3NhZ2U9MTRdPSJJbnZhbGlkTWVzc2FnZSI7SVtJLk5vQ2hhbmdlPTE1XT0iTm9DaGFuZ2UiO0lbSS5EYXRhYmFzZUNsb3NlZD0xNl09IkRhdGFiYXNlQ2xvc2VkIjtJW0kuU3RvcmFnZUVycm9yPTE3XT0iU3RvcmFnZUVycm9yIjtJW0kuRGF0YWJhc2VFcnJvcj0xOF09IkRhdGFiYXNlRXJyb3IiO0lbSS5IYXNoTWlzbWF0Y2g9MTldPSJIYXNoTWlzbWF0Y2giO0lbSS5EZWNyeXB0aW9uRXJyb3I9MjBdPSJEZWNyeXB0aW9uRXJyb3IiO0lbSS5Ob3RJbXBsZW1lbnRlZD0yMV09Ik5vdEltcGxlbWVudGVkIjtJW0kuTWlzc2luZ1NlZWQ9MjJdPSJNaXNzaW5nU2VlZCI7SVtJLk91dE9mQm91bmRzPTIzXT0iT3V0T2ZCb3VuZHMiO0lbSS5Ib3N0RXJyb3I9MjRdPSJIb3N0RXJyb3IiO0lbSS5Db21tdW5pY2F0aW9uRXJyb3I9MjVdPSJDb21tdW5pY2F0aW9uRXJyb3IiO0lbSS5WYXJMaW1pdEV4Y2VlZGVkPTI2XT0iVmFyTGltaXRFeGNlZWRlZCI7SVtJLkludmFsaWRSZXNwb25zZT0yN109IkludmFsaWRSZXNwb25zZSI7SVtJLkNvbm5lY3Rpb25DbG9zZWQ9MjhdPSJDb25uZWN0aW9uQ2xvc2VkIjtJW0kuQ3J5cHRvRXJyb3I9MjldPSJDcnlwdG9FcnJvciI7SVtJLldlYkF1dGhuRXJyb3I9MzBdPSJXZWJBdXRobkVycm9yIn0pKEJ8fD17fSk7ZnVuY3Rpb24gVm4oZSl7aWYoIWV8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoISgib3AiaW4gZSl8fCEoImlkImluIGUpKXJldHVybiExO3JldHVybiB0eXBlb2YgZS5vcD09PSJzdHJpbmciJiZ0eXBlb2YgZS5pZD09PSJudW1iZXIifWZ1bmN0aW9uIF9uKGUpe2xldCB0PWUubGVuZ3RoLHI9MCxuPTA7d2hpbGUobjx0KXtsZXQgcz1lLmNoYXJDb2RlQXQobisrKTtpZigocyY0Mjk0OTY3MTY4KT09PTApe3IrKztjb250aW51ZX1lbHNlIGlmKChzJjQyOTQ5NjUyNDgpPT09MClyKz0yO2Vsc2V7aWYocz49NTUyOTYmJnM8PTU2MzE5KXtpZihuPHQpe2xldCBpPWUuY2hhckNvZGVBdChuKTtpZigoaSY2NDUxMik9PT01NjMyMCkrK24scz0oKHMmMTAyMyk8PDEwKSsoaSYxMDIzKSs2NTUzNn19aWYoKHMmNDI5NDkwMTc2MCk9PT0wKXIrPTM7ZWxzZSByKz00fX1yZXR1cm4gcn1mdW5jdGlvbiBMaShlLHQscil7bGV0IG49ZS5sZW5ndGgscz1yLGk9MDt3aGlsZShpPG4pe2xldCBvPWUuY2hhckNvZGVBdChpKyspO2lmKChvJjQyOTQ5NjcxNjgpPT09MCl7dFtzKytdPW87Y29udGludWV9ZWxzZSBpZigobyY0Mjk0OTY1MjQ4KT09PTApdFtzKytdPW8+PjYmMzF8MTkyO2Vsc2V7aWYobz49NTUyOTYmJm88PTU2MzE5KXtpZihpPG4pe2xldCBhPWUuY2hhckNvZGVBdChpKTtpZigoYSY2NDUxMik9PT01NjMyMCkrK2ksbz0oKG8mMTAyMyk8PDEwKSsoYSYxMDIzKSs2NTUzNn19aWYoKG8mNDI5NDkwMTc2MCk9PT0wKXRbcysrXT1vPj4xMiYxNXwyMjQsdFtzKytdPW8+PjYmNjN8MTI4O2Vsc2UgdFtzKytdPW8+PjE4Jjd8MjQwLHRbcysrXT1vPj4xMiY2M3wxMjgsdFtzKytdPW8+PjYmNjN8MTI4fXRbcysrXT1vJjYzfDEyOH19dmFyIE9pPW5ldyBUZXh0RW5jb2RlcixLaT01MDtmdW5jdGlvbiBWaShlLHQscil7T2kuZW5jb2RlSW50byhlLHQuc3ViYXJyYXkocikpfWZ1bmN0aW9uIE5uKGUsdCxyKXtpZihlLmxlbmd0aD5LaSlWaShlLHQscik7ZWxzZSBMaShlLHQscil9dmFyIF9pPTQwOTY7ZnVuY3Rpb24gYnIoZSx0LHIpe2xldCBuPXQscz1uK3IsaT1bXSxvPSIiO3doaWxlKG48cyl7bGV0IGE9ZVtuKytdO2lmKChhJjEyOCk9PT0wKWkucHVzaChhKTtlbHNlIGlmKChhJjIyNCk9PT0xOTIpe2xldCBjPWVbbisrXSY2MztpLnB1c2goKGEmMzEpPDw2fGMpfWVsc2UgaWYoKGEmMjQwKT09PTIyNCl7bGV0IGM9ZVtuKytdJjYzLHU9ZVtuKytdJjYzO2kucHVzaCgoYSYzMSk8PDEyfGM8PDZ8dSl9ZWxzZSBpZigoYSYyNDgpPT09MjQwKXtsZXQgYz1lW24rK10mNjMsdT1lW24rK10mNjMsbD1lW24rK10mNjMsZj0oYSY3KTw8MTh8Yzw8MTJ8dTw8NnxsO2lmKGY+NjU1MzUpZi09NjU1MzYsaS5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfGYmMTAyMztpLnB1c2goZil9ZWxzZSBpLnB1c2goYSk7aWYoaS5sZW5ndGg+PV9pKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSksaS5sZW5ndGg9MH1pZihpLmxlbmd0aD4wKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSk7cmV0dXJuIG99dmFyIE5pPW5ldyBUZXh0RGVjb2RlcixxaT0yMDA7ZnVuY3Rpb24gRmkoZSx0LHIpe2xldCBuPWUuc3ViYXJyYXkodCx0K3IpO3JldHVybiBOaS5kZWNvZGUobil9ZnVuY3Rpb24gcW4oZSx0LHIpe2lmKHI+cWkpcmV0dXJuIEZpKGUsdCxyKTtlbHNlIHJldHVybiBicihlLHQscil9Y2xhc3MgUWV7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHNlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9T2JqZWN0LmNyZWF0ZShzZS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6c2UubmFtZX0pfX12YXIgWWU9NDI5NDk2NzI5NTtmdW5jdGlvbiBGbihlLHQscil7bGV0IG49ci80Mjk0OTY3Mjk2LHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBCdChlLHQscil7bGV0IG49TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiB2dChlLHQpe2xldCByPWUuZ2V0SW50MzIodCksbj1lLmdldFVpbnQzMih0KzQpO3JldHVybiByKjQyOTQ5NjcyOTYrbn1mdW5jdGlvbiBXbihlLHQpe2xldCByPWUuZ2V0VWludDMyKHQpLG49ZS5nZXRVaW50MzIodCs0KTtyZXR1cm4gcio0Mjk0OTY3Mjk2K259dmFyIFdpPS0xLHppPTQyOTQ5NjcyOTUsWGk9MTcxNzk4NjkxODM7ZnVuY3Rpb24gamkoe3NlYzplLG5zZWM6dH0pe2lmKGU+PTAmJnQ+PTAmJmU8PVhpKWlmKHQ9PT0wJiZlPD16aSl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhyLmJ1ZmZlcikuc2V0VWludDMyKDAsZSkscn1lbHNle2xldCByPWUvNDI5NDk2NzI5NixuPWUmNDI5NDk2NzI5NSxzPW5ldyBVaW50OEFycmF5KDgpLGk9bmV3IERhdGFWaWV3KHMuYnVmZmVyKTtyZXR1cm4gaS5zZXRVaW50MzIoMCx0PDwyfHImMyksaS5zZXRVaW50MzIoNCxuKSxzfWVsc2V7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoMTIpLG49bmV3IERhdGFWaWV3KHIuYnVmZmVyKTtyZXR1cm4gbi5zZXRVaW50MzIoMCx0KSxCdChuLDQsZSkscn19ZnVuY3Rpb24gJGkoZSl7bGV0IHQ9ZS5nZXRUaW1lKCkscj1NYXRoLmZsb29yKHQvMTAwMCksbj0odC1yKjEwMDApKjFlNixzPU1hdGguZmxvb3Iobi8xZTkpO3JldHVybntzZWM6citzLG5zZWM6bi1zKjFlOX19ZnVuY3Rpb24gR2koZSl7aWYoZSBpbnN0YW5jZW9mIERhdGUpe2xldCB0PSRpKGUpO3JldHVybiBqaSh0KX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIFFpKGUpe2xldCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6e2xldCByPXQuZ2V0VWludDMyKDApLG49MDtyZXR1cm57c2VjOnIsbnNlYzowfX1jYXNlIDg6e2xldCByPXQuZ2V0VWludDMyKDApLG49dC5nZXRVaW50MzIoNCkscz0ociYzKSo0Mjk0OTY3Mjk2K24saT1yPj4+MjtyZXR1cm57c2VjOnMsbnNlYzppfX1jYXNlIDEyOntsZXQgcj12dCh0LDQpLG49dC5nZXRVaW50MzIoMCk7cmV0dXJue3NlYzpyLG5zZWM6bn19ZGVmYXVsdDp0aHJvdyBuZXcgc2UoYFVucmVjb2duaXplZCBkYXRhIHNpemUgZm9yIHRpbWVzdGFtcCAoZXhwZWN0ZWQgNCwgOCwgb3IgMTIpOiAke2UubGVuZ3RofWApfX1mdW5jdGlvbiBZaShlKXtsZXQgdD1RaShlKTtyZXR1cm4gbmV3IERhdGUodC5zZWMqMTAwMCt0Lm5zZWMvMWU2KX12YXIgem49e3R5cGU6V2ksZW5jb2RlOkdpLGRlY29kZTpZaX07Y2xhc3MgSmV7c3RhdGljIGRlZmF1bHRDb2RlYz1uZXcgSmU7X19icmFuZDtidWlsdEluRW5jb2RlcnM9W107YnVpbHRJbkRlY29kZXJzPVtdO2VuY29kZXJzPVtdO2RlY29kZXJzPVtdO2NvbnN0cnVjdG9yKCl7dGhpcy5yZWdpc3Rlcih6bil9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6cn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09cjtlbHNle2xldCBuPS0xLWU7dGhpcy5idWlsdEluRW5jb2RlcnNbbl09dCx0aGlzLmJ1aWx0SW5EZWNvZGVyc1tuXT1yfX10cnlUb0VuY29kZShlLHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5idWlsdEluRW5jb2RlcnMubGVuZ3RoO3IrKyl7bGV0IG49dGhpcy5idWlsdEluRW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpe2xldCBpPS0xLXI7cmV0dXJuIG5ldyBRZShpLHMpfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2xldCBuPXRoaXMuZW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpcmV0dXJuIG5ldyBRZShyLHMpfX1pZihlIGluc3RhbmNlb2YgUWUpcmV0dXJuIGU7cmV0dXJuIG51bGx9ZGVjb2RlKGUsdCxyKXtsZXQgbj10PDA/dGhpcy5idWlsdEluRGVjb2RlcnNbLTEtdF06dGhpcy5kZWNvZGVyc1t0XTtpZihuKXJldHVybiBuKGUsdCxyKTtlbHNlIHJldHVybiBuZXcgUWUodCxlKX19ZnVuY3Rpb24gSmkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyfWZ1bmN0aW9uIHV0KGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtlbHNlIGlmKEppKGUpKXJldHVybiBuZXcgVWludDhBcnJheShlKTtlbHNlIHJldHVybiBVaW50OEFycmF5LmZyb20oZSl9dmFyIFppPTEwMCxlbz0yMDQ4O2NsYXNzIER0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7bWF4RGVwdGg7aW5pdGlhbEJ1ZmZlclNpemU7c29ydEtleXM7Zm9yY2VGbG9hdDMyO2lnbm9yZVVuZGVmaW5lZDtmb3JjZUludGVnZXJUb0Zsb2F0O3Bvczt2aWV3O2J5dGVzO2VudGVyZWQ9ITE7Y29uc3RydWN0b3IoZSl7dGhpcy5leHRlbnNpb25Db2RlYz1lPy5leHRlbnNpb25Db2RlYz8/SmUuZGVmYXVsdENvZGVjLHRoaXMuY29udGV4dD1lPy5jb250ZXh0LHRoaXMudXNlQmlnSW50NjQ9ZT8udXNlQmlnSW50NjQ/PyExLHRoaXMubWF4RGVwdGg9ZT8ubWF4RGVwdGg/P1ppLHRoaXMuaW5pdGlhbEJ1ZmZlclNpemU9ZT8uaW5pdGlhbEJ1ZmZlclNpemU/P2VvLHRoaXMuc29ydEtleXM9ZT8uc29ydEtleXM/PyExLHRoaXMuZm9yY2VGbG9hdDMyPWU/LmZvcmNlRmxvYXQzMj8/ITEsdGhpcy5pZ25vcmVVbmRlZmluZWQ9ZT8uaWdub3JlVW5kZWZpbmVkPz8hMSx0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQ9ZT8uZm9yY2VJbnRlZ2VyVG9GbG9hdD8/ITEsdGhpcy5wb3M9MCx0aGlzLnZpZXc9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmluaXRpYWxCdWZmZXJTaXplKSksdGhpcy5ieXRlcz1uZXcgVWludDhBcnJheSh0aGlzLnZpZXcuYnVmZmVyKX1jbG9uZSgpe3JldHVybiBuZXcgRHQoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGVTaGFyZWRSZWYoZSk7dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnN1YmFycmF5KDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1lbmNvZGUoZSl7aWYodGhpcy5lbnRlcmVkKXJldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlKGUpO3RyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zbGljZSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9FbmNvZGUoZSx0KXtpZih0PnRoaXMubWF4RGVwdGgpdGhyb3cgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO2lmKGU9PW51bGwpdGhpcy5lbmNvZGVOaWwoKTtlbHNlIGlmKHR5cGVvZiBlPT09ImJvb2xlYW4iKXRoaXMuZW5jb2RlQm9vbGVhbihlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im51bWJlciIpaWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCl0aGlzLmVuY29kZU51bWJlcihlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIGlmKHR5cGVvZiBlPT09InN0cmluZyIpdGhpcy5lbmNvZGVTdHJpbmcoZSk7ZWxzZSBpZih0aGlzLnVzZUJpZ0ludDY0JiZ0eXBlb2YgZT09PSJiaWdpbnQiKXRoaXMuZW5jb2RlQmlnSW50NjQoZSk7ZWxzZSB0aGlzLmVuY29kZU9iamVjdChlLHQpfWVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKGUpe2xldCB0PXRoaXMucG9zK2U7aWYodGhpcy52aWV3LmJ5dGVMZW5ndGg8dCl0aGlzLnJlc2l6ZUJ1ZmZlcih0KjIpfXJlc2l6ZUJ1ZmZlcihlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZSkscj1uZXcgVWludDhBcnJheSh0KSxuPW5ldyBEYXRhVmlldyh0KTtyLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9bix0aGlzLmJ5dGVzPXJ9ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXtpZihlPT09ITEpdGhpcy53cml0ZVU4KDE5NCk7ZWxzZSB0aGlzLndyaXRlVTgoMTk1KX1lbmNvZGVOdW1iZXIoZSl7aWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCYmTnVtYmVyLmlzU2FmZUludGVnZXIoZSkpaWYoZT49MClpZihlPDEyOCl0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZSBpZihlPDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKTtlbHNlIGlmKCF0aGlzLnVzZUJpZ0ludDY0KXRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSk7ZWxzZSB0aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk7ZWxzZSBpZihlPj0tMzIpdGhpcy53cml0ZVU4KDIyNHxlKzMyKTtlbHNlIGlmKGU+PS0xMjgpdGhpcy53cml0ZVU4KDIwOCksdGhpcy53cml0ZUk4KGUpO2Vsc2UgaWYoZT49LTMyNzY4KXRoaXMud3JpdGVVOCgyMDkpLHRoaXMud3JpdGVJMTYoZSk7ZWxzZSBpZihlPj0tMjE0NzQ4MzY0OCl0aGlzLndyaXRlVTgoMjEwKSx0aGlzLndyaXRlSTMyKGUpO2Vsc2UgaWYoIXRoaXMudXNlQmlnSW50NjQpdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUk2NChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe2lmKHRoaXMuZm9yY2VGbG9hdDMyKXRoaXMud3JpdGVVOCgyMDIpLHRoaXMud3JpdGVGMzIoZSk7ZWxzZSB0aGlzLndyaXRlVTgoMjAzKSx0aGlzLndyaXRlRjY0KGUpfWVuY29kZUJpZ0ludDY0KGUpe2lmKGU+PUJpZ0ludCgwKSl0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpO2Vsc2UgdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpfXdyaXRlU3RyaW5nSGVhZGVyKGUpe2lmKGU8MzIpdGhpcy53cml0ZVU4KDE2MCtlKTtlbHNlIGlmKGU8MjU2KXRoaXMud3JpdGVVOCgyMTcpLHRoaXMud3JpdGVVOChlKTtlbHNlIGlmKGU8NjU1MzYpdGhpcy53cml0ZVU4KDIxOCksdGhpcy53cml0ZVUxNihlKTtlbHNlIGlmKGU8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsb25nIHN0cmluZzogJHtlfSBieXRlcyBpbiBVVEYtOGApfWVuY29kZVN0cmluZyhlKXtsZXQgcj1fbihlKTt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDUrciksdGhpcy53cml0ZVN0cmluZ0hlYWRlcihyKSxObihlLHRoaXMuYnl0ZXMsdGhpcy5wb3MpLHRoaXMucG9zKz1yfWVuY29kZU9iamVjdChlLHQpe2xldCByPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKHIhPW51bGwpdGhpcy5lbmNvZGVFeHRlbnNpb24ocik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im9iamVjdCIpdGhpcy5lbmNvZGVNYXAoZSx0KTtlbHNlIHRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgb2JqZWN0OiAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoZSl9YCl9ZW5jb2RlQmluYXJ5KGUpe2xldCB0PWUuYnl0ZUxlbmd0aDtpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk2KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgxOTcpLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDE5OCksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgYmluYXJ5OiAke3R9YCk7bGV0IHI9dXQoZSk7dGhpcy53cml0ZVU4YShyKX1lbmNvZGVBcnJheShlLHQpe2xldCByPWUubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDE0NCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihyKTtlbHNlIGlmKHI8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIxKSx0aGlzLndyaXRlVTMyKHIpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtyfWApO2ZvcihsZXQgbiBvZiBlKXRoaXMuZG9FbmNvZGUobix0KzEpfWNvdW50V2l0aG91dFVuZGVmaW5lZChlLHQpe2xldCByPTA7Zm9yKGxldCBuIG9mIHQpaWYoZVtuXSE9PXZvaWQgMClyKys7cmV0dXJuIHJ9ZW5jb2RlTWFwKGUsdCl7bGV0IHI9T2JqZWN0LmtleXMoZSk7aWYodGhpcy5zb3J0S2V5cylyLnNvcnQoKTtsZXQgbj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLHIpOnIubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDEyOCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihuKTtlbHNlIGlmKG48NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIzKSx0aGlzLndyaXRlVTMyKG4pO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke259YCk7Zm9yKGxldCBzIG9mIHIpe2xldCBpPWVbc107aWYoISh0aGlzLmlnbm9yZVVuZGVmaW5lZCYmaT09PXZvaWQgMCkpdGhpcy5lbmNvZGVTdHJpbmcocyksdGhpcy5kb0VuY29kZShpLHQrMSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZih0eXBlb2YgZS5kYXRhPT09ImZ1bmN0aW9uIil7bGV0IHI9ZS5kYXRhKHRoaXMucG9zKzYpLG49ci5sZW5ndGg7aWYobj49NDI5NDk2NzI5Nil0aHJvdyBFcnJvcihgVG9vIGxhcmdlIGV4dGVuc2lvbiBvYmplY3Q6ICR7bn1gKTt0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEocik7cmV0dXJufWxldCB0PWUuZGF0YS5sZW5ndGg7aWYodD09PTEpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZih0PT09Mil0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKHQ9PT00KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYodD09PTgpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZih0PT09MTYpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwMSksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEoZS5kYXRhKX13cml0ZVU4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldFVpbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVOGEoZSl7bGV0IHQ9ZS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSh0KSx0aGlzLmJ5dGVzLnNldChlLHRoaXMucG9zKSx0aGlzLnBvcys9dH13cml0ZUk4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldEludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVUxNihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDIpLHRoaXMudmlldy5zZXRVaW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVJMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0SW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVVMzIoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0VWludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlSTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEZsb2F0MzIodGhpcy5wb3MsZSksdGhpcy5wb3MrPTR9d3JpdGVGNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSx0aGlzLnZpZXcuc2V0RmxvYXQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZVU2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLEZuKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUk2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLEJ0KHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19ZnVuY3Rpb24gT2UoZSx0KXtyZXR1cm4gbmV3IER0KHQpLmVuY29kZVNoYXJlZFJlZihlKX1mdW5jdGlvbiBDdChlKXtyZXR1cm5gJHtlPDA/Ii0iOiIifTB4JHtNYXRoLmFicyhlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfWB9dmFyIHRvPTE2LHJvPTE2O2NsYXNzIHdye2hpdD0wO21pc3M9MDtjYWNoZXM7bWF4S2V5TGVuZ3RoO21heExlbmd0aFBlcktleTtjb25zdHJ1Y3RvcihlPXRvLHQ9cm8pe3RoaXMubWF4S2V5TGVuZ3RoPWUsdGhpcy5tYXhMZW5ndGhQZXJLZXk9dCx0aGlzLmNhY2hlcz1bXTtmb3IobGV0IHI9MDtyPHRoaXMubWF4S2V5TGVuZ3RoO3IrKyl0aGlzLmNhY2hlcy5wdXNoKFtdKX1jYW5CZUNhY2hlZChlKXtyZXR1cm4gZT4wJiZlPD10aGlzLm1heEtleUxlbmd0aH1maW5kKGUsdCxyKXtsZXQgbj10aGlzLmNhY2hlc1tyLTFdO2U6Zm9yKGxldCBzIG9mIG4pe2xldCBpPXMuYnl0ZXM7Zm9yKGxldCBvPTA7bzxyO28rKylpZihpW29dIT09ZVt0K29dKWNvbnRpbnVlIGU7cmV0dXJuIHMuc3RyfXJldHVybiBudWxsfXN0b3JlKGUsdCl7bGV0IHI9dGhpcy5jYWNoZXNbZS5sZW5ndGgtMV0sbj17Ynl0ZXM6ZSxzdHI6dH07aWYoci5sZW5ndGg+PXRoaXMubWF4TGVuZ3RoUGVyS2V5KXJbTWF0aC5yYW5kb20oKSpyLmxlbmd0aHwwXT1uO2Vsc2Ugci5wdXNoKG4pfWRlY29kZShlLHQscil7bGV0IG49dGhpcy5maW5kKGUsdCxyKTtpZihuIT1udWxsKXJldHVybiB0aGlzLmhpdCsrLG47dGhpcy5taXNzKys7bGV0IHM9YnIoZSx0LHIpLGk9VWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLHQsdCtyKTtyZXR1cm4gdGhpcy5zdG9yZShpLHMpLHN9fXZhciBJcj0iYXJyYXkiLGZ0PSJtYXBfa2V5Iixqbj0ibWFwX3ZhbHVlIixubz0oZSk9PntpZih0eXBlb2YgZT09PSJzdHJpbmcifHx0eXBlb2YgZT09PSJudW1iZXIiKXJldHVybiBlO3Rocm93IG5ldyBzZSgiVGhlIHR5cGUgb2Yga2V5IG11c3QgYmUgc3RyaW5nIG9yIG51bWJlciBidXQgIit0eXBlb2YgZSl9O2NsYXNzICRue3N0YWNrPVtdO3N0YWNrSGVhZFBvc2l0aW9uPS0xO2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5zdGFja0hlYWRQb3NpdGlvbisxfXRvcCgpe3JldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXB1c2hBcnJheVN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9SXIsdC5wb3NpdGlvbj0wLHQuc2l6ZT1lLHQuYXJyYXk9QXJyYXkoZSl9cHVzaE1hcFN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9ZnQsdC5yZWFkQ291bnQ9MCx0LnNpemU9ZSx0Lm1hcD17fX1nZXRVbmluaXRpYWxpemVkU3RhdGVGcm9tUG9vbCgpe2lmKHRoaXMuc3RhY2tIZWFkUG9zaXRpb24rKyx0aGlzLnN0YWNrSGVhZFBvc2l0aW9uPT09dGhpcy5zdGFjay5sZW5ndGgpe2xldCBlPXt0eXBlOnZvaWQgMCxzaXplOjAsYXJyYXk6dm9pZCAwLHBvc2l0aW9uOjAscmVhZENvdW50OjAsbWFwOnZvaWQgMCxrZXk6bnVsbH07dGhpcy5zdGFjay5wdXNoKGUpfXJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXJlbGVhc2UoZSl7aWYodGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXSE9PWUpdGhyb3cgRXJyb3IoIkludmFsaWQgc3RhY2sgc3RhdGUuIFJlbGVhc2VkIHN0YXRlIGlzIG5vdCBvbiB0b3Agb2YgdGhlIHN0YWNrLiIpO2lmKGUudHlwZT09PUlyKXtsZXQgcj1lO3Iuc2l6ZT0wLHIuYXJyYXk9dm9pZCAwLHIucG9zaXRpb249MCxyLnR5cGU9dm9pZCAwfWlmKGUudHlwZT09PWZ0fHxlLnR5cGU9PT1qbil7bGV0IHI9ZTtyLnNpemU9MCxyLm1hcD12b2lkIDAsci5yZWFkQ291bnQ9MCxyLnR5cGU9dm9pZCAwfXRoaXMuc3RhY2tIZWFkUG9zaXRpb24tLX1yZXNldCgpe3RoaXMuc3RhY2subGVuZ3RoPTAsdGhpcy5zdGFja0hlYWRQb3NpdGlvbj0tMX19dmFyIGx0PS0xLHhyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpLHNvPW5ldyBVaW50OEFycmF5KHhyLmJ1ZmZlcik7dHJ5e3hyLmdldEludDgoMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgRXJyb3IoIlRoaXMgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgYmVjYXVzZSBEYXRhVmlldyBkb2VzIG5vdCB0aHJvdyBSYW5nZUVycm9yIG9uIG91dC1vZi1ib3VuZHMgYWNjZXNzIil9dmFyIFhuPVJhbmdlRXJyb3IoIkluc3VmZmljaWVudCBkYXRhIiksaW89bmV3IHdyO2NsYXNzIFR0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7cmF3U3RyaW5nczttYXhTdHJMZW5ndGg7bWF4QmluTGVuZ3RoO21heEFycmF5TGVuZ3RoO21heE1hcExlbmd0aDttYXhFeHRMZW5ndGg7a2V5RGVjb2RlcjttYXBLZXlDb252ZXJ0ZXI7dG90YWxQb3M9MDtwb3M9MDt2aWV3PXhyO2J5dGVzPXNvO2hlYWRCeXRlPWx0O3N0YWNrPW5ldyAkbjtlbnRlcmVkPSExO2NvbnN0cnVjdG9yKGUpe3RoaXMuZXh0ZW5zaW9uQ29kZWM9ZT8uZXh0ZW5zaW9uQ29kZWM/P0plLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLnJhd1N0cmluZ3M9ZT8ucmF3U3RyaW5ncz8/ITEsdGhpcy5tYXhTdHJMZW5ndGg9ZT8ubWF4U3RyTGVuZ3RoPz9ZZSx0aGlzLm1heEJpbkxlbmd0aD1lPy5tYXhCaW5MZW5ndGg/P1llLHRoaXMubWF4QXJyYXlMZW5ndGg9ZT8ubWF4QXJyYXlMZW5ndGg/P1llLHRoaXMubWF4TWFwTGVuZ3RoPWU/Lm1heE1hcExlbmd0aD8/WWUsdGhpcy5tYXhFeHRMZW5ndGg9ZT8ubWF4RXh0TGVuZ3RoPz9ZZSx0aGlzLmtleURlY29kZXI9ZT8ua2V5RGVjb2RlciE9PXZvaWQgMD9lLmtleURlY29kZXI6aW8sdGhpcy5tYXBLZXlDb252ZXJ0ZXI9ZT8ubWFwS2V5Q29udmVydGVyPz9ub31jbG9uZSgpe3JldHVybiBuZXcgVHQoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxyYXdTdHJpbmdzOnRoaXMucmF3U3RyaW5ncyxtYXhTdHJMZW5ndGg6dGhpcy5tYXhTdHJMZW5ndGgsbWF4QmluTGVuZ3RoOnRoaXMubWF4QmluTGVuZ3RoLG1heEFycmF5TGVuZ3RoOnRoaXMubWF4QXJyYXlMZW5ndGgsbWF4TWFwTGVuZ3RoOnRoaXMubWF4TWFwTGVuZ3RoLG1heEV4dExlbmd0aDp0aGlzLm1heEV4dExlbmd0aCxrZXlEZWNvZGVyOnRoaXMua2V5RGVjb2Rlcn0pfXJlaW5pdGlhbGl6ZVN0YXRlKCl7dGhpcy50b3RhbFBvcz0wLHRoaXMuaGVhZEJ5dGU9bHQsdGhpcy5zdGFjay5yZXNldCgpfXNldEJ1ZmZlcihlKXtsZXQgdD11dChlKTt0aGlzLmJ5dGVzPXQsdGhpcy52aWV3PW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wfWFwcGVuZEJ1ZmZlcihlKXtpZih0aGlzLmhlYWRCeXRlPT09bHQmJiF0aGlzLmhhc1JlbWFpbmluZygxKSl0aGlzLnNldEJ1ZmZlcihlKTtlbHNle2xldCB0PXRoaXMuYnl0ZXMuc3ViYXJyYXkodGhpcy5wb3MpLHI9dXQoZSksbj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtyLmxlbmd0aCk7bi5zZXQodCksbi5zZXQocix0Lmxlbmd0aCksdGhpcy5zZXRCdWZmZXIobil9fWhhc1JlbWFpbmluZyhlKXtyZXR1cm4gdGhpcy52aWV3LmJ5dGVMZW5ndGgtdGhpcy5wb3M+PWV9Y3JlYXRlRXh0cmFCeXRlRXJyb3IoZSl7bGV0e3ZpZXc6dCxwb3M6cn09dGhpcztyZXR1cm4gUmFuZ2VFcnJvcihgRXh0cmEgJHt0LmJ5dGVMZW5ndGgtcn0gb2YgJHt0LmJ5dGVMZW5ndGh9IGJ5dGUocykgZm91bmQgYXQgYnVmZmVyWyR7ZX1dYCl9ZGVjb2RlKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZShlKTt0cnl7dGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLnNldEJ1ZmZlcihlKTtsZXQgdD10aGlzLmRvRGVjb2RlU3luYygpO2lmKHRoaXMuaGFzUmVtYWluaW5nKDEpKXRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy5wb3MpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX0qZGVjb2RlTXVsdGkoZSl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGkoZSk7cmV0dXJufXRyeXt0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuc2V0QnVmZmVyKGUpO3doaWxlKHRoaXMuaGFzUmVtYWluaW5nKDEpKXlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWFzeW5jIGRlY29kZUFzeW5jKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZUFzeW5jKGUpO3RyeXt0aGlzLmVudGVyZWQ9ITA7bGV0IHQ9ITEscjtmb3IgYXdhaXQobGV0IG8gb2YgZSl7aWYodCl0aHJvdyB0aGlzLmVudGVyZWQ9ITEsdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTt0aGlzLmFwcGVuZEJ1ZmZlcihvKTt0cnl7cj10aGlzLmRvRGVjb2RlU3luYygpLHQ9ITB9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgYX10aGlzLnRvdGFsUG9zKz10aGlzLnBvc31pZih0KXtpZih0aGlzLmhhc1JlbWFpbmluZygxKSl0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMudG90YWxQb3MpO3JldHVybiByfWxldHtoZWFkQnl0ZTpuLHBvczpzLHRvdGFsUG9zOml9PXRoaXM7dGhyb3cgUmFuZ2VFcnJvcihgSW5zdWZmaWNpZW50IGRhdGEgaW4gcGFyc2luZyAke0N0KG4pfSBhdCAke2l9ICgke3N9IGluIHRoZSBjdXJyZW50IGJ1ZmZlcilgKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZGVjb2RlQXJyYXlTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCEwKX1kZWNvZGVTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCExKX1hc3luYypkZWNvZGVNdWx0aUFzeW5jKGUsdCl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGlBc3luYyhlLHQpO3JldHVybn10cnl7dGhpcy5lbnRlcmVkPSEwO2xldCByPXQsbj0tMTtmb3IgYXdhaXQobGV0IHMgb2YgZSl7aWYodCYmbj09PTApdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTtpZih0aGlzLmFwcGVuZEJ1ZmZlcihzKSxyKW49dGhpcy5yZWFkQXJyYXlTaXplKCkscj0hMSx0aGlzLmNvbXBsZXRlKCk7dHJ5e3doaWxlKCEwKWlmKHlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCksLS1uPT09MClicmVha31jYXRjaChpKXtpZighKGkgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSl0aHJvdyBpfXRoaXMudG90YWxQb3MrPXRoaXMucG9zfX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9EZWNvZGVTeW5jKCl7ZTp3aGlsZSghMCl7bGV0IGU9dGhpcy5yZWFkSGVhZEJ5dGUoKSx0O2lmKGU+PTIyNCl0PWUtMjU2O2Vsc2UgaWYoZTwxOTIpaWYoZTwxMjgpdD1lO2Vsc2UgaWYoZTwxNDQpe2xldCBuPWUtMTI4O2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPDE2MCl7bGV0IG49ZS0xNDQ7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2V7bGV0IG49ZS0xNjA7dD10aGlzLmRlY29kZVN0cmluZyhuLDApfWVsc2UgaWYoZT09PTE5Mil0PW51bGw7ZWxzZSBpZihlPT09MTk0KXQ9ITE7ZWxzZSBpZihlPT09MTk1KXQ9ITA7ZWxzZSBpZihlPT09MjAyKXQ9dGhpcy5yZWFkRjMyKCk7ZWxzZSBpZihlPT09MjAzKXQ9dGhpcy5yZWFkRjY0KCk7ZWxzZSBpZihlPT09MjA0KXQ9dGhpcy5yZWFkVTgoKTtlbHNlIGlmKGU9PT0yMDUpdD10aGlzLnJlYWRVMTYoKTtlbHNlIGlmKGU9PT0yMDYpdD10aGlzLnJlYWRVMzIoKTtlbHNlIGlmKGU9PT0yMDcpaWYodGhpcy51c2VCaWdJbnQ2NCl0PXRoaXMucmVhZFU2NEFzQmlnSW50KCk7ZWxzZSB0PXRoaXMucmVhZFU2NCgpO2Vsc2UgaWYoZT09PTIwOCl0PXRoaXMucmVhZEk4KCk7ZWxzZSBpZihlPT09MjA5KXQ9dGhpcy5yZWFkSTE2KCk7ZWxzZSBpZihlPT09MjEwKXQ9dGhpcy5yZWFkSTMyKCk7ZWxzZSBpZihlPT09MjExKWlmKHRoaXMudXNlQmlnSW50NjQpdD10aGlzLnJlYWRJNjRBc0JpZ0ludCgpO2Vsc2UgdD10aGlzLnJlYWRJNjQoKTtlbHNlIGlmKGU9PT0yMTcpe2xldCBuPXRoaXMubG9va1U4KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDEpfWVsc2UgaWYoZT09PTIxOCl7bGV0IG49dGhpcy5sb29rVTE2KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDIpfWVsc2UgaWYoZT09PTIxOSl7bGV0IG49dGhpcy5sb29rVTMyKCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDQpfWVsc2UgaWYoZT09PTIyMCl7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMSl7bGV0IG49dGhpcy5yZWFkVTMyKCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMil7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaE1hcFN0YXRlKG4pLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSBlfWVsc2UgdD17fX1lbHNlIGlmKGU9PT0yMjMpe2xldCBuPXRoaXMucmVhZFUzMigpO2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPT09MTk2KXtsZXQgbj10aGlzLmxvb2tVOCgpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwxKX1lbHNlIGlmKGU9PT0xOTcpe2xldCBuPXRoaXMubG9va1UxNigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwyKX1lbHNlIGlmKGU9PT0xOTgpe2xldCBuPXRoaXMubG9va1UzMigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiw0KX1lbHNlIGlmKGU9PT0yMTIpdD10aGlzLmRlY29kZUV4dGVuc2lvbigxLDApO2Vsc2UgaWYoZT09PTIxMyl0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDIsMCk7ZWxzZSBpZihlPT09MjE0KXQ9dGhpcy5kZWNvZGVFeHRlbnNpb24oNCwwKTtlbHNlIGlmKGU9PT0yMTUpdD10aGlzLmRlY29kZUV4dGVuc2lvbig4LDApO2Vsc2UgaWYoZT09PTIxNil0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDE2LDApO2Vsc2UgaWYoZT09PTE5OSl7bGV0IG49dGhpcy5sb29rVTgoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMSl9ZWxzZSBpZihlPT09MjAwKXtsZXQgbj10aGlzLmxvb2tVMTYoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMil9ZWxzZSBpZihlPT09MjAxKXtsZXQgbj10aGlzLmxvb2tVMzIoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sNCl9ZWxzZSB0aHJvdyBuZXcgc2UoYFVucmVjb2duaXplZCB0eXBlIGJ5dGU6ICR7Q3QoZSl9YCk7dGhpcy5jb21wbGV0ZSgpO2xldCByPXRoaXMuc3RhY2s7d2hpbGUoci5sZW5ndGg+MCl7bGV0IG49ci50b3AoKTtpZihuLnR5cGU9PT1JcilpZihuLmFycmF5W24ucG9zaXRpb25dPXQsbi5wb3NpdGlvbisrLG4ucG9zaXRpb249PT1uLnNpemUpdD1uLmFycmF5LHIucmVsZWFzZShuKTtlbHNlIGNvbnRpbnVlIGU7ZWxzZSBpZihuLnR5cGU9PT1mdCl7aWYodD09PSJfX3Byb3RvX18iKXRocm93IG5ldyBzZSgiVGhlIGtleSBfX3Byb3RvX18gaXMgbm90IGFsbG93ZWQiKTtuLmtleT10aGlzLm1hcEtleUNvbnZlcnRlcih0KSxuLnR5cGU9am47Y29udGludWUgZX1lbHNlIGlmKG4ubWFwW24ua2V5XT10LG4ucmVhZENvdW50Kyssbi5yZWFkQ291bnQ9PT1uLnNpemUpdD1uLm1hcCxyLnJlbGVhc2Uobik7ZWxzZXtuLmtleT1udWxsLG4udHlwZT1mdDtjb250aW51ZSBlfX1yZXR1cm4gdH19cmVhZEhlYWRCeXRlKCl7aWYodGhpcy5oZWFkQnl0ZT09PWx0KXRoaXMuaGVhZEJ5dGU9dGhpcy5yZWFkVTgoKTtyZXR1cm4gdGhpcy5oZWFkQnl0ZX1jb21wbGV0ZSgpe3RoaXMuaGVhZEJ5dGU9bHR9cmVhZEFycmF5U2l6ZSgpe2xldCBlPXRoaXMucmVhZEhlYWRCeXRlKCk7c3dpdGNoKGUpe2Nhc2UgMjIwOnJldHVybiB0aGlzLnJlYWRVMTYoKTtjYXNlIDIyMTpyZXR1cm4gdGhpcy5yZWFkVTMyKCk7ZGVmYXVsdDppZihlPDE2MClyZXR1cm4gZS0xNDQ7ZWxzZSB0aHJvdyBuZXcgc2UoYFVucmVjb2duaXplZCBhcnJheSB0eXBlIGJ5dGU6ICR7Q3QoZSl9YCl9fXB1c2hNYXBTdGF0ZShlKXtpZihlPnRoaXMubWF4TWFwTGVuZ3RoKXRocm93IG5ldyBzZShgTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoJHtlfSkgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCR7dGhpcy5tYXhNYXBMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaE1hcFN0YXRlKGUpfXB1c2hBcnJheVN0YXRlKGUpe2lmKGU+dGhpcy5tYXhBcnJheUxlbmd0aCl0aHJvdyBuZXcgc2UoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGFycmF5IGxlbmd0aCAoJHtlfSkgPiBtYXhBcnJheUxlbmd0aCAoJHt0aGlzLm1heEFycmF5TGVuZ3RofSlgKTt0aGlzLnN0YWNrLnB1c2hBcnJheVN0YXRlKGUpfWRlY29kZVN0cmluZyhlLHQpe2lmKCF0aGlzLnJhd1N0cmluZ3N8fHRoaXMuc3RhdGVJc01hcEtleSgpKXJldHVybiB0aGlzLmRlY29kZVV0ZjhTdHJpbmcoZSx0KTtyZXR1cm4gdGhpcy5kZWNvZGVCaW5hcnkoZSx0KX1kZWNvZGVVdGY4U3RyaW5nKGUsdCl7aWYoZT50aGlzLm1heFN0ckxlbmd0aCl0aHJvdyBuZXcgc2UoYE1heCBsZW5ndGggZXhjZWVkZWQ6IFVURi04IGJ5dGUgbGVuZ3RoICgke2V9KSA+IG1heFN0ckxlbmd0aCAoJHt0aGlzLm1heFN0ckxlbmd0aH0pYCk7aWYodGhpcy5ieXRlcy5ieXRlTGVuZ3RoPHRoaXMucG9zK3QrZSl0aHJvdyBYbjtsZXQgcj10aGlzLnBvcyt0LG47aWYodGhpcy5zdGF0ZUlzTWFwS2V5KCkmJnRoaXMua2V5RGVjb2Rlcj8uY2FuQmVDYWNoZWQoZSkpbj10aGlzLmtleURlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMscixlKTtlbHNlIG49cW4odGhpcy5ieXRlcyxyLGUpO3JldHVybiB0aGlzLnBvcys9dCtlLG59c3RhdGVJc01hcEtleSgpe2lmKHRoaXMuc3RhY2subGVuZ3RoPjApcmV0dXJuIHRoaXMuc3RhY2sudG9wKCkudHlwZT09PWZ0O3JldHVybiExfWRlY29kZUJpbmFyeShlLHQpe2lmKGU+dGhpcy5tYXhCaW5MZW5ndGgpdGhyb3cgbmV3IHNlKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgke2V9KSA+IG1heEJpbkxlbmd0aCAoJHt0aGlzLm1heEJpbkxlbmd0aH0pYCk7aWYoIXRoaXMuaGFzUmVtYWluaW5nKGUrdCkpdGhyb3cgWG47bGV0IHI9dGhpcy5wb3MrdCxuPXRoaXMuYnl0ZXMuc3ViYXJyYXkocixyK2UpO3JldHVybiB0aGlzLnBvcys9dCtlLG59ZGVjb2RlRXh0ZW5zaW9uKGUsdCl7aWYoZT50aGlzLm1heEV4dExlbmd0aCl0aHJvdyBuZXcgc2UoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGV4dCBsZW5ndGggKCR7ZX0pID4gbWF4RXh0TGVuZ3RoICgke3RoaXMubWF4RXh0TGVuZ3RofSlgKTtsZXQgcj10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyt0KSxuPXRoaXMuZGVjb2RlQmluYXJ5KGUsdCsxKTtyZXR1cm4gdGhpcy5leHRlbnNpb25Db2RlYy5kZWNvZGUobixyLHRoaXMuY29udGV4dCl9bG9va1U4KCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyl9bG9va1UxNigpe3JldHVybiB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKX1sb29rVTMyKCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpfXJlYWRVOCgpe2xldCBlPXRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkSTgoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkVTE2KCl7bGV0IGU9dGhpcy52aWV3LmdldFVpbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZEkxNigpe2xldCBlPXRoaXMudmlldy5nZXRJbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZFUzMigpe2xldCBlPXRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRJMzIoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRVNjQoKXtsZXQgZT1Xbih0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjQoKXtsZXQgZT12dCh0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRVNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdVaW50NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdJbnQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZEYzMigpe2xldCBlPXRoaXMudmlldy5nZXRGbG9hdDMyKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX1yZWFkRjY0KCl7bGV0IGU9dGhpcy52aWV3LmdldEZsb2F0NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfX1mdW5jdGlvbiBFcihlLHQpe3JldHVybiBuZXcgVHQodCkuZGVjb2RlKGUpfWNsYXNzIHB0e2xpc3RlbmVycz1uZXcgTWFwO2FkZEV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYoIXIpcj1uZXcgU2V0LHRoaXMubGlzdGVuZXJzLnNldChlLHIpO3JldHVybiByLmFkZCh0KSwoKT0+e3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2lmKHIuZGVsZXRlKHQpLHIuc2l6ZT09PTApdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGUpfX1lbWl0KGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2xldCBuPUFycmF5LmZyb20ocik7Zm9yKGxldCBzIG9mIG4pcyh0KX19ZW1pdEFsbChlKXtsZXQgdD1BcnJheS5mcm9tKHRoaXMubGlzdGVuZXJzLmtleXMoKSk7Zm9yKGxldCByIG9mIHQpdGhpcy5lbWl0KHIsZSl9fWNsYXNzIEtle2dldHRlcjtzdGF0aWMgZXZlbnROYW1lPSJ1cGRhdGUiO2VtaXR0ZXI7Y29uc3RydWN0b3IoZSl7dGhpcy5nZXR0ZXI9ZTt0aGlzLmVtaXR0ZXI9bmV3IHB0fWdldD0oKT0+dGhpcy5nZXR0ZXIoKTthc3luYyBlbWl0KCl7bGV0IGU9YXdhaXQgdGhpcy5nZXR0ZXIoKTtxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5lbWl0dGVyLmVtaXQoS2UuZXZlbnROYW1lLGUpKX1saXN0ZW4oZSl7cmV0dXJuIHRoaXMuZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKEtlLmV2ZW50TmFtZSxlKSwoKT0+e3RoaXMuZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKEtlLmV2ZW50TmFtZSxlKX19fWZ1bmN0aW9uIHAoZSl7cmV0dXJuW2UsMF19ZnVuY3Rpb24gZChlKXtyZXR1cm5bdm9pZCAwLGVdfWZ1bmN0aW9uIG9vKGUpe2lmKGU8MCljb25zb2xlLmluZm8oIk4iLGUpLGNvbnNvbGUudHJhY2UoKTtpZih0eXBlb2YgZSE9PSJiaWdpbnQiKWU9QmlnSW50KGUpO2lmKGU8MG4pcmV0dXJuIGQoMTApO2xldCB0PVtdO3doaWxlKGU+MG4pe2xldCByPU51bWJlcihlJjB4N2ZuKTtpZihlPj49N24sZT4wbil0LnB1c2gocnwxMjgpO2Vsc2UgdC5wdXNoKHIpfWlmKHQubGVuZ3RoPT09MClyZXR1cm4gcChuZXcgVWludDhBcnJheShbMF0pKTtpZih0Lmxlbmd0aD44KXJldHVybiBkKDI2KTtyZXR1cm4gcChuZXcgVWludDhBcnJheSh0KSl9ZnVuY3Rpb24gYW8oZSx0PTApe2xldCByPTBuLG49MCxzPXQ7d2hpbGUoITApe2lmKHM+PWUubGVuZ3RoKXJldHVybiBkKDE0KTtsZXQgaT1lW3MrK107aWYoaT09PXZvaWQgMClyZXR1cm4gZCgxNCk7aWYocnw9QmlnSW50KGkmMTI3KTw8QmlnSW50KG4pLChpJjEyOCk9PT0wKXtpZihzLXQ+OClyZXR1cm4gZCgyNik7cmV0dXJuIHAoe3ZhbHVlOnI+MHgxZmZmZmZmZmZmZmZmZm4/cjpOdW1iZXIociksYnl0ZXNSZWFkOnMtdH0pfWlmKG4rPTcsbj49NTYpcmV0dXJuIGQoMjYpfX1jbGFzcyBOe2RhdGE7cG9zPTA7Y29uc3RydWN0b3IoZSl7dGhpcy5kYXRhPWV9c3RhdGljIGFzeW5jIGZyb21SZXNwb25zZShlKXtsZXQgdD1hd2FpdCBlLmFycmF5QnVmZmVyKCkscj1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gbmV3IE4ocil9cmVhZEJpZ0ludCgpe2lmKHRoaXMucG9zKzg+dGhpcy5kYXRhLmxlbmd0aClyZXR1cm4gZCg3KTtsZXQgZT1uZXcgRGF0YVZpZXcodGhpcy5kYXRhLmJ1ZmZlcix0aGlzLmRhdGEuYnl0ZU9mZnNldCt0aGlzLnBvcykuZ2V0QmlnVWludDY0KDAsITEpO3JldHVybiB0aGlzLnBvcys9OCxwKGUpfXJlYWREYXRlKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGQodCk7cmV0dXJuIHAobmV3IERhdGUoZSkpfXJlYWRWYXJJbnQoKXtsZXRbZSx0XT1hbyh0aGlzLmRhdGEsdGhpcy5wb3MpO2lmKHQhPT0wKXJldHVybiBkKHQpO3RoaXMucG9zKz1lLmJ5dGVzUmVhZDtsZXQgcj1lLnZhbHVlO3JldHVybiBwKHR5cGVvZiByPT09ImJpZ2ludCI/TnVtYmVyKHIpOnIpfXJlYWRWYXJTdHJpbmcoKXtsZXRbZSx0XT10aGlzLnJlYWRWYXJJbnQoKTtpZih0IT09MClyZXR1cm4gZCh0KTtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gZChuKTtsZXQgcz1uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7cmV0dXJuIHAocyl9cmVhZEJ5dGVzKGUpe2lmKGU8MClyZXR1cm4gZCgxMCk7aWYodGhpcy5wb3MrZT50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBkKDIzKTtsZXQgdD10aGlzLmRhdGEuc2xpY2UodGhpcy5wb3MsdGhpcy5wb3MrZSk7cmV0dXJuIHRoaXMucG9zKz1lLHAodCl9cmVhZFZhckJ5dGVzKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGQodCk7cmV0dXJuIHRoaXMucmVhZEJ5dGVzKGUpfXJlYWRTdHJ1Y3QoZSl7cmV0dXJuIGUuZGVjb2RlKHRoaXMpfXJlYWRTdHJ1Y3RzKGUpe2xldCB0PVtdO3doaWxlKCF0aGlzLmRvbmUoKSl7bGV0W3Isbl09dGhpcy5yZWFkU3RydWN0KGUpO2lmKG4hPT0wKXJldHVybiBkKG4pO3QucHVzaChyKX1yZXR1cm4gcCh0KX1yZWFkQnl0ZXNTZXEoZSl7bGV0IHQ9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gZChuKTt0LnB1c2gocil9cmV0dXJuIHAodCl9ZG9uZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5kYXRhLmxlbmd0aH1jb25zdW1lZCgpe3JldHVybiB0aGlzLnBvc319Y2xhc3MgcXtwYXJ0cz1bXTt3cml0ZUJpZ0ludChlKXtsZXQgdD1uZXcgVWludDhBcnJheSg4KTtuZXcgRGF0YVZpZXcodC5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLGUsITEpLHRoaXMucGFydHMucHVzaCh0KX13cml0ZURhdGUoZSl7bGV0IHQ9ZS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMud3JpdGVWYXJJbnQodCl9d3JpdGVWYXJJbnQoZSl7bGV0W3Qscl09b28oZSk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIHRoaXMucGFydHMucHVzaCh0KSwwfXdyaXRlVmFyU3RyaW5nKGUpe2xldCB0PW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxyPXRoaXMud3JpdGVWYXJJbnQodC5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLndyaXRlQnl0ZXModCksMH1wcmVwZW5kQnl0ZXMoZSl7dGhpcy5wYXJ0cy51bnNoaWZ0KGUuc2xpY2UoKSl9d3JpdGVCeXRlcyhlKXt0aGlzLnBhcnRzLnB1c2goZS5zbGljZSgpKX13cml0ZVZhckJ5dGVzKGUpe2xldCB0PXRoaXMud3JpdGVWYXJJbnQoZS5sZW5ndGgpO2lmKHQhPT0wKXJldHVybiB0O3JldHVybiB0aGlzLndyaXRlQnl0ZXMoZSksMH13cml0ZVN0cnVjdChlLHQpe3JldHVybiBlLmVuY29kZSh0aGlzLHQpfXdyaXRlU3RydWN0cyhlLHQpe2ZvcihsZXQgciBvZiB0KXtsZXQgbj10aGlzLndyaXRlU3RydWN0KGUscik7aWYobiE9PTApcmV0dXJuIG59cmV0dXJuIDB9d3JpdGVCeXRlc1NlcShlKXtmb3IobGV0IHQgb2YgZSl0aGlzLndyaXRlQnl0ZXModCl9cmVzdWx0KCl7bGV0IGU9dGhpcy5wYXJ0cy5yZWR1Y2UoKG4scyk9Pm4rcy5sZW5ndGgsMCksdD1uZXcgVWludDhBcnJheShlKSxyPTA7Zm9yKGxldCBuIG9mIHRoaXMucGFydHMpdC5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gdH13aXBlKCl7Zm9yKGxldCBlIG9mIHRoaXMucGFydHMpZS5maWxsKDApO3RoaXMucGFydHMubGVuZ3RoPTB9KnNjYW4oKXtmb3IobGV0IGUgb2YgdGhpcy5wYXJ0cyl5aWVsZCBlfX1hc3luYyBmdW5jdGlvbiBBcihlLHQpe2xldCByPW5ldyBxLG49ci53cml0ZURhdGUodCk7aWYobiE9PTApcmV0dXJuIGQobik7bGV0IHM9ci5yZXN1bHQoKSxpPWF3YWl0IGUuc2lnbihzKTtyZXR1cm4gcCh7cHViS2V5OmUucHVibGljS2V5LHNpZzppLHRpbWVzdGFtcDp0fSl9YXN5bmMgZnVuY3Rpb24gSGUoZSx0LHIpe2xldCBuPXIubm93KCkuZ2V0VGltZSgpLHM9ZS50aW1lc3RhbXAuZ2V0VGltZSgpO2lmKE1hdGguYWJzKG4tcyk+T24pcmV0dXJuIDQ7bGV0IG89bmV3IHE7by53cml0ZURhdGUoZS50aW1lc3RhbXApO2xldCBhPW8ucmVzdWx0KCk7aWYoIWF3YWl0IHQuY2hlY2tTaWdFZDI1NTE5KGUuc2lnLGEsZS5wdWJLZXkpKXJldHVybiAzO3JldHVybiAwfXZhciB1ZT17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudHMpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyQnl0ZXMoKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWREYXRlKCk7aWYocyE9PTApcmV0dXJuIGQocyk7cmV0dXJuIHAoe2lkOnQsdHM6bn0pfX07ZnVuY3Rpb24gSHQoZSl7bGV0IHQ9bmV3IHEscj10LndyaXRlU3RydWN0KHVlLGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldCBuPXQucmVzdWx0KCk7cmV0dXJuIHAobil9dmFyIHBlPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQudHlwPz8iIik7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuZWlkKTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQub2ZmKTtpZihzIT09MClyZXR1cm4gcztsZXQgaT1lLndyaXRlVmFySW50KHQuY3RyKTtpZihpIT09MClyZXR1cm4gaTtsZXQgbz1lLndyaXRlVmFySW50KHQubGVuKTtpZihvIT09MClyZXR1cm4gbztpZih0LmhzaCllLndyaXRlQnl0ZXModC5oc2gpO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyU3RyaW5nKCk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXQgaT1uZXcgTihuKSxbLG9dPXVlLmRlY29kZShpKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXRbYSxjXT1lLnJlYWRWYXJJbnQoKTtpZihjIT09MClyZXR1cm4gZChjKTtsZXRbdSxsXT1lLnJlYWRWYXJJbnQoKTtpZihsIT09MClyZXR1cm4gZChsKTtsZXRbZixoXT1lLnJlYWRWYXJJbnQoKTtpZihoIT09MClyZXR1cm4gZChoKTtsZXQgeTtpZihmPjApe2xldFtnLG1dPWUucmVhZEJ5dGVzKGt0KTtpZihtIT09MClyZXR1cm4gZChtKTt5PWd9cmV0dXJuIHAoe3R5cDp0LGVpZDpuLG9mZjphLGN0cjp1LGxlbjpmLGhzaDp5fSl9fTtmdW5jdGlvbiBTZShlKXtyZXR1cm4gQXJyYXkuZnJvbShlKS5tYXAoKHIpPT5yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWZ1bmN0aW9uIEduKGUpe2lmKGUubGVuZ3RoJTIhPT0wKXRocm93IEVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtsZXQgdD1uZXcgVWludDhBcnJheShlLmxlbmd0aC8yKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrPTIpdFtyLzJdPU51bWJlci5wYXJzZUludChlLnN1YnN0cihyLDIpLDE2KTtyZXR1cm4gdH1mdW5jdGlvbiBZKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO3JldHVybiBlLmV2ZXJ5KChyLG4pPT5yPT09dFtuXSl9dmFyIFI7aWYodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvQmFzZTY0PT09ImZ1bmN0aW9uIilSPShlKT0+ZS50b0Jhc2U2NCgpO2Vsc2UgUj0oZSk9PmJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5lKSk7dmFyIG1lO2lmKHR5cGVvZiBVaW50OEFycmF5LmZyb21CYXNlNjQ9PT0iZnVuY3Rpb24iKW1lPShlKT0+VWludDhBcnJheS5mcm9tQmFzZTY0KGUpO2Vsc2UgbWU9KGUpPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwodCk9PnQuY2hhckNvZGVBdCgwKSk7ZnVuY3Rpb24gUW4oZSl7bGV0IHQ9ZS5sZW5ndGglND09PTA/IiI6Ij0iLnJlcGVhdCg0LWUubGVuZ3RoJTQpLHI9ZS5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKSt0O3JldHVybiBtZShyKX1mdW5jdGlvbiBiZShlLHQpe2xldCByPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoK3QubGVuZ3RoKTtyZXR1cm4gci5zZXQoZSwwKSxyLnNldCh0LGUubGVuZ3RoKSxyfWZ1bmN0aW9uIFluKGUsdCxyKXtyZXR1cm4gci5jaGVja1NpZ0VkMjU1MTkoZS5zaWcsZS5oZWFkQ3BoLHQpfWFzeW5jIGZ1bmN0aW9uIEpuKGUsdCxyLG4pe2xldCBzO2lmKGUuYm9kJiZlLmxlbj4wKXM9YXdhaXQgci5ibGFrZTMoZS5ib2QpO2xldCBpPW5ldyBxLG89cGUuZW5jb2RlKGksey4uLmUsaHNoOnN9KTtpZihvIT09MClyZXR1cm4gZChvKTtsZXQgYT1pLnJlc3VsdCgpLGM9YXdhaXQgdC5rZG1Gb3IoYSksdT1uLmRlcml2ZUNpcGhlcihjLCJlbmNyeXB0IiksbD1hd2FpdCB1LmVuY3J5cHQoYSksZj1lLmJvZD9hd2FpdCB1LmVuY3J5cHQoZS5ib2QpOm5ldyBVaW50OEFycmF5KDApLGg9YXdhaXQgdC5zaWduKGwpO3JldHVybiBwKHtzaWc6aCxrZG06YyxoZWFkQ3BoOmwsYm9keUNwaDpmfSl9YXN5bmMgZnVuY3Rpb24gUHIoZSx0LHIsbixzKXtsZXQgaT1uZXcgTihlKSxbbyxhXT1wZS5kZWNvZGUoaSk7aWYoYSE9PTApcmV0dXJuIGQoMTQpO2xldCBjO3RyeXtjPXQmJnQubGVuZ3RoPjA/YXdhaXQgci5kZWNyeXB0KHQpOnZvaWQgMH1jYXRjaHtyZXR1cm4gZCgyMCl9bGV0IHU9by5oc2gmJmM9PT12b2lkIDAsbD1vLmhzaD09PXZvaWQgMCYmYyE9PXZvaWQgMDtpZih1fHxsKXJldHVybiBkKDE5KTtpZihvLmhzaCYmYyl7bGV0IGg9YXdhaXQgbi5ibGFrZTMoYyk7aWYoIVkoaCxvLmhzaCkpcmV0dXJuIGQoMTkpfWxldCBmPXM/P2F3YWl0IG4uYmxha2UzKGUpO3JldHVybiBwKHttc2dIZWFkOm8sYm9kOmMsaGVhZEhhc2g6Zn0pfWNsYXNzIFVye25vdygpe3JldHVybiBuZXcgRGF0ZX19ZnVuY3Rpb24gWm4oZSx0LHIsbil7bGV0IHM9dC5nZXRUaW1lKCktZS5nZXRUaW1lKCksaT1yLmdldFRpbWUoKS1uLmdldFRpbWUoKTtyZXR1cm4ocytpKS8yfXZhciBodD17ZW5jb2RlKGUsdCl7aWYoZS53cml0ZVZhckludCh0LnF1b3RhKSx0LnF1b3RhPjApe2lmKHQudXNhZ2U9PT12b2lkIDApcmV0dXJuIDk7ZS53cml0ZVZhckludCh0LnVzYWdlKX1yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldCBuO2lmKHQ+MCl7bGV0W3MsaV09ZS5yZWFkVmFySW50KCk7aWYoaSE9PTApcmV0dXJuIGQoaSk7bj1zfXJldHVybiBwKHtxdW90YTp0LHVzYWdlOm59KX19O3ZhciBrcj17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKG5ldyBVaW50OEFycmF5KFt0LnN0YXR1c10pKTtsZXQgcj1lLndyaXRlRGF0ZSh0LnRpbWVSY3ZkKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlRGF0ZSh0LnRpbWVTZW50KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQuc3Vic2NyaXB0aW9uLnRlcm0pO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWUud3JpdGVWYXJJbnQodC5zdWJzY3JpcHRpb24uZWxhcHNlZCk7aWYoaSE9PTApcmV0dXJuIGk7bGV0IG89ZS53cml0ZVN0cnVjdChodCx0LnN1YnNjcmlwdGlvbi5zdGF0KTtpZihvIT09MClyZXR1cm4gbztsZXQgYT1lLndyaXRlU3RydWN0KGh0LHQuc3Vic2NyaXB0aW9uLmR5bik7aWYoYSE9PTApcmV0dXJuIGE7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcygxKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXQgbj10WzBdLFtzLGldPWUucmVhZERhdGUoKTtpZihpIT09MClyZXR1cm4gZChpKTtsZXRbbyxhXT1lLnJlYWREYXRlKCk7aWYoYSE9PTApcmV0dXJuIGQoYSk7bGV0W2MsdV09ZS5yZWFkVmFySW50KCk7aWYodSE9PTApcmV0dXJuIGQodSk7bGV0W2wsZl09ZS5yZWFkVmFySW50KCk7aWYoZiE9PTApcmV0dXJuIGQoZik7bGV0W2gseV09ZS5yZWFkU3RydWN0KGh0KTtpZih5IT09MClyZXR1cm4gZCh5KTtsZXRbZyxtXT1lLnJlYWRTdHJ1Y3QoaHQpO2lmKG0hPT0wKXJldHVybiBkKG0pO3JldHVybiBwKHtzdGF0dXM6bix0aW1lUmN2ZDpzLHRpbWVTZW50Om8sc3Vic2NyaXB0aW9uOnt0ZXJtOmMsZWxhcHNlZDpsLHN0YXQ6aCxkeW46Z319KX19O3ZhciBCcj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0LnNlcSk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJCeXRlcygpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWUucmVhZFZhckludCgpO2lmKHMhPT0wKXJldHVybiBkKHMpO3JldHVybiBwKHtoZWFkQ3BoOnQsc2VxOm59KX19O3ZhciBsZT17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKHQucHViS2V5KSxlLndyaXRlQnl0ZXModC5zaWcpO2xldCByPWUud3JpdGVEYXRlKHQudGltZXN0YW1wKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKExuKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyhDZSk7aWYocyE9PTApcmV0dXJuIGQocyk7bGV0W2ksb109ZS5yZWFkRGF0ZSgpO2lmKG8hPT0wKXJldHVybiBkKG8pO3JldHVybiBwKHtwdWJLZXk6dCxzaWc6bix0aW1lc3RhbXA6aX0pfX07dmFyIGVzPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtsZXQgaT1zLndyaXRlU3RydWN0KGxlLHIpO2lmKGkhPT0wKXJldHVybiBpO2ZvcihsZXQgbyBvZiBuKXMud3JpdGVWYXJJbnQobyk7cmV0dXJuIDB9LGFzeW5jIGhhbmRsZVJlcShlLHQscil7bGV0e2Nsb2NrOm4sY3J5cHRvOnMsc3RvcmFnZTppfT1lLFtvLGFdPXQucmVhZFN0cnVjdChsZSk7aWYoYSE9PTApcmV0dXJuIGE7bGV0IGM9YXdhaXQgSGUobyxzLG4pO2lmKGMhPT0wKXJldHVybiBjO2xldHtwdWJLZXk6dX09byxbbCxmXT1hd2FpdCBpLmhhc1VzZXIodSk7aWYoZiE9PTApcmV0dXJuIGY7aWYoIWwpcmV0dXJuIDU7bGV0W2gseV09dC5yZWFkVmFySW50KCk7aWYoeSE9PTApcmV0dXJuIHk7aWYoIXQuZG9uZSgpKXJldHVybiA4O2xldFtnLG1dPWF3YWl0IGkubGlzdEhlYWRzKHUsaCk7aWYobSE9PTApcmV0dXJuIG07cmV0dXJuIHIud3JpdGVTdHJ1Y3RzKEJyLGcpfSxkZWNvZGVSZXNwKGUpe3JldHVybiBlLnJlYWRTdHJ1Y3RzKEJyKX19O3ZhciB2cj17ZW5jb2RlKGUsdCl7ZS53cml0ZVZhckludCh0LnNlcSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuYm9keUNwaCk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBkKHMpO3JldHVybiBwKHtzZXE6dCxib2R5Q3BoOm59KX19O3ZhciB0cz17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IGk9cy53cml0ZVN0cnVjdChsZSxyKTtpZihpIT09MClyZXR1cm4gaTtmb3IobGV0IG8gb2Ygbil7bGV0IGE9cy53cml0ZVZhckludChvKTtpZihhIT09MClyZXR1cm4gYX1yZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KGxlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgYz1hd2FpdCBIZShvLHMsbik7aWYoYyE9PTApcmV0dXJuIGM7bGV0e3B1YktleTp1fT1vLFtsLGZdPWF3YWl0IGkuaGFzVXNlcih1KTtpZihmIT09MClyZXR1cm4gZjtpZighbClyZXR1cm4gNTtsZXQgaD1bXTt3aGlsZSghdC5kb25lKCkpe2xldFttLFNdPXQucmVhZFZhckludCgpO2lmKFMhPT0wKXJldHVybiBTO2gucHVzaChtKX1jb25zb2xlLmluZm8oYFBVTEw6ICR7aC5sZW5ndGh9IGJhZ3NgKTtsZXRbeSxnXT1hd2FpdCBpLmdldEJvZGllcyh1LGgpO2lmKGchPT0wKXJldHVybiBnO2lmKCF5KXJldHVybiAxNztmb3IobGV0e3NlcTptLGJvZHlDcGg6U31vZiB5KXtsZXQgRT17c2VxOm0sYm9keUNwaDpTfSx3PXIud3JpdGVTdHJ1Y3QodnIsRSk7aWYodyE9PTApcmV0dXJuIHd9cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHModnIpfX07dmFyIERyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5zaWcpLGUud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuYm9keUNwaCk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhDZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoVGUpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGQobyk7bGV0W2EsY109ZS5yZWFkVmFyQnl0ZXMoKTtpZihjIT09MClyZXR1cm4gZChjKTtyZXR1cm4gcCh7c2lnOnQsa2RtOm4saGVhZENwaDppLGJvZHlDcGg6YX0pfX07dmFyIE10PXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFySW50KHQuc2VxKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz10LmJvZHlDcGg/dC5ib2R5Q3BoLmxlbmd0aDowLGk9ZS53cml0ZVZhckludChzKTtpZihpIT09MClyZXR1cm4gaTtpZihzPjApe2lmKCF0LmJvZHlDcGgpcmV0dXJuIDEwO2Uud3JpdGVCeXRlcyh0LmJvZHlDcGgpfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXQgYTtpZihpPjApe2xldFtjLHVdPWUucmVhZEJ5dGVzKGkpO2lmKHUhPT0wKXJldHVybiBkKHUpO2E9Y31yZXR1cm4gcCh7c2VxOnQsaGVhZENwaDpuLGJvZHlDcGg6YX0pfX07dmFyIFJ0PXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5zaWcpLGUud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhDZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoVGUpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGQobyk7cmV0dXJuIHAoe3NpZzp0LGtkbTpuLGhlYWRDcGg6aX0pfX07dmFyIEx0PXtlbmNvZGUoZSx0KXtpZihlLndyaXRlVmFySW50KHQuaWR4KSxlLndyaXRlQnl0ZXMobmV3IFVpbnQ4QXJyYXkoW3Quc3RhdHVzXSkpLHQuc3RhdHVzPT09MCllLndyaXRlVmFySW50KHQuc2VxKTtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKDEpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldCBpPW5bMF07aWYoaSE9PTApcmV0dXJuIHAoe2lkeDp0LHN0YXR1czppfSk7bGV0W28sYV09ZS5yZWFkVmFySW50KCk7aWYoYSE9PTApcmV0dXJuIGQoYSk7cmV0dXJuIHAoe2lkeDp0LHN0YXR1czppLHNlcTpvfSl9fTt2YXIgcnM9e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe2xldCBpPXMud3JpdGVTdHJ1Y3QobGUscik7aWYoaSE9PTApcmV0dXJuIGk7bGV0IG89cy53cml0ZVN0cnVjdHMoRHIsbik7aWYobyE9PTApcmV0dXJuIG87cmV0dXJuIDB9LGFzeW5jIGhhbmRsZVJlcShlLHQscil7bGV0e2Nsb2NrOm4sY3J5cHRvOnMsc3RvcmFnZTppLG5vdGlmaWVyOm99PWUsW2EsY109dC5yZWFkU3RydWN0KGxlKTtpZihjIT09MClyZXR1cm4gYztsZXQgdT1hd2FpdCBIZShhLHMsbik7aWYodSE9PTApcmV0dXJuIHU7bGV0e3B1YktleTpsfT1hLFtmLGhdPWF3YWl0IGkuaGFzVXNlcihsKTtpZihoIT09MClyZXR1cm4gaDtpZighZilyZXR1cm4gNTtsZXRbeSxnXT10LnJlYWRTdHJ1Y3RzKERyKTtpZihnIT09MClyZXR1cm4gZztjb25zb2xlLmluZm8oYFBVU0g6ICR7eS5sZW5ndGh9IGJhZ3NgKTtsZXQgbT1bXSxTPVtdO2ZvcihsZXQgYj0wO2I8eS5sZW5ndGg7YisrKXtsZXQgQT15W2JdO2lmKCFhd2FpdCBZbihBLGwscykpe2xldCBUPXtpZHg6YixzdGF0dXM6M30sSD1yLndyaXRlU3RydWN0KEx0LFQpO2lmKEghPT0wKXJldHVybiBIO2NvbnRpbnVlfW0ucHVzaChiKSxTLnB1c2goQSl9bGV0W0Usd109YXdhaXQgaS5zZXRCYWdzKGwsUyk7aWYodyE9PTApcmV0dXJuIHc7aWYoIUV8fEUubGVuZ3RoIT09Uy5sZW5ndGgpcmV0dXJuIDE3O2xldCB4PVtdO2ZvcihsZXQgYj0wO2I8Uy5sZW5ndGg7YisrKXtsZXQgQT1TW2JdLEQ9bVtiXSxUPUVbYl0sSD1uZXcgcSxVPUgud3JpdGVTdHJ1Y3QoUnQsQSk7aWYoVSE9PTApcmV0dXJuIFU7bGV0IE89SC5yZXN1bHQoKSxLPXtzZXE6VCxoZWFkQ3BoOk99O2lmKHkubGVuZ3RoPT09MSYmQS5ib2R5Q3BoLmxlbmd0aDw9S24pSy5ib2R5Q3BoPUEuYm9keUNwaDt4LnB1c2goSyk7bGV0IF89e2lkeDpELHN0YXR1czowLHNlcTpUfSxJPXIud3JpdGVTdHJ1Y3QoTHQsXyk7aWYoSSE9PTApcmV0dXJuIEl9aWYoeC5sZW5ndGg+MCl7bGV0IGI9bmV3IHEsQT1iLndyaXRlU3RydWN0cyhNdCx4KTtpZihBIT09MClyZXR1cm4gQTtsZXQgRD1iLnJlc3VsdCgpO2F3YWl0IFByb21pc2UucmVzb2x2ZShvLnB1c2gobCxEKSl9cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoTHQpfX07dmFyIG5zPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtyZXR1cm4gcy53cml0ZVN0cnVjdChsZSxyKX0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KGxlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgYz1hd2FpdCBIZShvLHMsbik7aWYoYyE9PTApcmV0dXJuIGM7bGV0e3B1YktleTp1fT1vO2lmKCF0LmRvbmUoKSlyZXR1cm4gODtsZXRbbCxmXT1hd2FpdCBpLmFkZFVzZXIodSk7aWYoZiE9PTApcmV0dXJuIGY7cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIHAodm9pZCAwKX19O2NsYXNzIENye3VybDt3ZWJzb2NrZXQ7Y29uc3RydWN0b3IoZSl7dGhpcy51cmw9ZX1jb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy53ZWJzb2NrZXQhPT12b2lkIDAmJnRoaXMud2Vic29ja2V0LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTn1hc3luYyBjb25uZWN0KGUsdCxyPSgpPT57fSxuPSgpPT57fSl7bGV0e3VybDpzfT10aGlzO2lmKHRoaXMud2Vic29ja2V0KXRoaXMud2Vic29ja2V0LmNsb3NlKCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwO2xldCBpPW5ldyBxO2kud3JpdGVTdHJ1Y3QobGUsZSk7bGV0IG89aS5yZXN1bHQoKSxhPVNlKG8pO3JldHVybiBzLnNlYXJjaFBhcmFtcy5zZXQoInQiLGEpLHRoaXMud2Vic29ja2V0PW5ldyBXZWJTb2NrZXQocyksdGhpcy53ZWJzb2NrZXQuYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLHRoaXMud2Vic29ja2V0Lm9ub3Blbj0oKT0+e2NvbnNvbGUubG9nKCJDT05ORUNURUQiKSxuKCl9LHRoaXMud2Vic29ja2V0Lm9uY2xvc2U9KCk9Pntjb25zb2xlLmxvZygiRElTQ09OTkVDVEVEIiksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwLHIoKX0sdGhpcy53ZWJzb2NrZXQub25tZXNzYWdlPShjKT0+e2xldCB1PW5ldyBVaW50OEFycmF5KGMuZGF0YSk7dCh1KX0sdGhpcy53ZWJzb2NrZXQub25lcnJvcj0oYyk9Pntjb25zb2xlLmxvZyhgRVJST1I6ICR7SlNPTi5zdHJpbmdpZnkoYyl9YCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwLHIoKX0sUHJvbWlzZS5yZXNvbHZlKDApfWRpc2Nvbm5lY3QoKXt0aGlzLndlYnNvY2tldD8uY2xvc2UoKSx0aGlzLndlYnNvY2tldD12b2lkIDB9fXZhciB0ZT17dXNlcjp7cGF0aDoiL3VzZXIiLGVuZHBvaW50Om5zLG5hbWU6MH0scHVzaDp7cGF0aDoiL3B1c2giLGVuZHBvaW50OnJzLG5hbWU6Mn0scGVlazp7cGF0aDoiL3BlZWsiLGVuZHBvaW50OmVzLG5hbWU6MX0scHVsbDp7cGF0aDoiL3B1bGwiLGVuZHBvaW50OnRzLG5hbWU6M319LGNvPXswOnRlLnVzZXIsMjp0ZS5wdXNoLDE6dGUucGVlaywzOnRlLnB1bGx9LEd1PXtbdGUudXNlci5wYXRoXTp0ZS51c2VyLFt0ZS5wdXNoLnBhdGhdOnRlLnB1c2gsW3RlLnBlZWsucGF0aF06dGUucGVlayxbdGUucHVsbC5wYXRoXTp0ZS5wdWxsfTtjbGFzcyBzc3t1cmw7bGlzdGVuZXI7Y29uc3RydWN0b3IoZSl7dGhpcy51cmw9ZTt0aGlzLmxpc3RlbmVyPW5ldyBDcihlKX1hc3luYyBjYWxsKGUsdCl7bGV0e3BhdGg6cn09Y29bZV0sbj1uZXcgVVJMKHIsdGhpcy51cmwpO3RyeXtyZXR1cm4gYXdhaXQgdW8obix0KX1jYXRjaHtyZXR1cm4gZCgyNSl9fX12YXIgaXM9KGUpPT5uZXcgc3MoZS5oYW5kbGUpO2FzeW5jIGZ1bmN0aW9uIHVvKGUsdCl7bGV0IHI9YXdhaXQgZmV0Y2goZSx7bWV0aG9kOiJQT1NUIixib2R5OnQucmVzdWx0KCkuc2xpY2UoKX0pO2lmKCFyLm9rKXJldHVybiBkKDI0KTtsZXQgbj1hd2FpdCBOLmZyb21SZXNwb25zZShyKTtyZXR1cm4gcChuKX1jbGFzcyBPdHtlbmNsYXZlO2NyeXB0bztob3N0O2Nsb2NrO3RyYW5zcG9ydDt1cGRhdGVIb3N0TWV0YTtjb25zdHJ1Y3RvcihlLHQscixuLHMsaSl7dGhpcy5lbmNsYXZlPWU7dGhpcy5jcnlwdG89dDt0aGlzLmhvc3Q9cjt0aGlzLmNsb2NrPW47dGhpcy50cmFuc3BvcnQ9czt0aGlzLnVwZGF0ZUhvc3RNZXRhPWl9YXN5bmMgY2FsbChlLHQpe2xldHtjbG9jazpyLHRyYW5zcG9ydDpufT10aGlzLHtlbmRwb2ludDpzLG5hbWU6aX09ZSxvPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxhPXIubm93KCksW2MsdV09YXdhaXQgQXIobyxhKTtpZih1IT09MClyZXR1cm4gZCh1KTtsZXQgbD1uZXcgcSxmPWF3YWl0IHMuZW5jb2RlUmVxKHRoaXMsbyxjLHQsbCk7aWYoZiE9PTApcmV0dXJuIGQoZik7bGV0IGg9ci5ub3coKSxbeSxnXT1hd2FpdCBuLmNhbGwoaSxsKSxtPXIubm93KCk7aWYoZyE9PTApcmV0dXJuIGQoZyk7bGV0W1MsRV09eS5yZWFkU3RydWN0KGtyKTtpZihFIT09MClyZXR1cm4gZChFKTtpZihTLnN0YXR1cyE9PTApcmV0dXJuIGQoUy5zdGF0dXMpO2xldCB4PXtjbG9ja09mZnNldDpabihoLFMudGltZVJjdmQsUy50aW1lU2VudCxtKSxzdWJzY3JpcHRpb246Uy5zdWJzY3JpcHRpb259LGI9YXdhaXQgdGhpcy51cGRhdGVIb3N0TWV0YSh4KTtpZihiIT09MClyZXR1cm4gZChiKTtyZXR1cm4gcy5kZWNvZGVSZXNwKHkpfWlkZW50aXR5PSgpPT57bGV0e2hvc3Q6ZSxlbmNsYXZlOnR9PXRoaXM7cmV0dXJuIHQuZGVyaXZlSWRlbnRpdHkoZS5sYWJlbCxlLmlkeD8/MCl9O3NlYWw9YXN5bmMoZSk9PntsZXR7Y3J5cHRvOnQsZW5jbGF2ZTpyfT10aGlzLG49YXdhaXQgdGhpcy5pZGVudGl0eSgpO3JldHVybiBKbihlLG4sdCxyKX07cmVnaXN0ZXI9KCk9PnRoaXMuY2FsbCh0ZS51c2VyLFtdKTtwZWVrPShlKT0+dGhpcy5jYWxsKHRlLnBlZWssW2VdKTtwdXNoPShlKT0+dGhpcy5jYWxsKHRlLnB1c2gsZSk7cHVsbD0oZSk9PnRoaXMuY2FsbCh0ZS5wdWxsLGUpO2xpc3Rlbj1hc3luYyhlLHQscik9PntsZXR7Y2xvY2s6bix0cmFuc3BvcnQ6c309dGhpcyx7bGlzdGVuZXI6aX09cyxvPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxhPW4ubm93KCksW2MsdV09YXdhaXQgQXIobyxhKTtpZih1IT09MClyZXR1cm4gdTtyZXR1cm4gYXdhaXQgaS5jb25uZWN0KGMsZSx0LHIpfTtpc0Nvbm5lY3RlZCgpe2xldCBlPXRoaXMudHJhbnNwb3J0Py5saXN0ZW5lcjtpZihlJiZ0eXBlb2YgZS5jb25uZWN0ZWQ9PT0iZnVuY3Rpb24iKXJldHVybiBlLmNvbm5lY3RlZCgpO3JldHVybiEwfWNsb3NlTGlzdGVuZXIoKXt0aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI/LmRpc2Nvbm5lY3QoKX19dmFyIFRyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQubGJsKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuaWR4KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQubnVtKTtpZihzIT09MClyZXR1cm4gcztyZXR1cm4gZS53cml0ZUJ5dGVzKHQuaHNoKSxlLndyaXRlQnl0ZXModC5zaWcpLDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXRbYSxjXT1lLnJlYWRCeXRlcyhrdCk7aWYoYyE9PTApcmV0dXJuIGQoYyk7bGV0W3UsbF09ZS5yZWFkQnl0ZXMoQ2UpO2lmKGwhPT0wKXJldHVybiBkKGwpO3JldHVybiBwKHtsYmw6dCxpZHg6bixudW06aSxoc2g6YSxzaWc6dX0pfX07dmFyIEt0PXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlU3RydWN0KFRyLHQuaGVhZCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuaW5kZXhFbmMpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlFbmMpO2lmKHMhPT0wKXJldHVybiBzO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkU3RydWN0KFRyKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGQobyk7cmV0dXJuIHAoe2hlYWQ6dCxpbmRleEVuYzpuLGJvZHlFbmM6aX0pfX07dmFyIEhyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5sZW5Cb2R5KTtpZihuIT09MClyZXR1cm4gbjtpZih0LmxlbkJvZHk+MCYmdC5vZmZCb2R5IT09dm9pZCAwKXtsZXQgcz1lLndyaXRlVmFySW50KHQub2ZmQm9keSk7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhUZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXQgYTtpZihpPjApe2xldFtjLHVdPWUucmVhZFZhckludCgpO2lmKHUhPT0wKXJldHVybiBkKHUpO2E9Y31yZXR1cm4gcCh7a2RtOnQsaGVhZENwaDpuLGxlbkJvZHk6aSxvZmZCb2R5OmF9KX19O3ZhciBWdDsoKG9zKT0+e29zLmRlZmF1bHRGaWxlRXh0ZW5zaW9uPSJkcGwiO2FzeW5jIGZ1bmN0aW9uIHQocyxpLG8sYSxjKXtsZXQgdT1hd2FpdCBjLmRlcml2ZUlkZW50aXR5KHMsaSksbD1uZXcgcSxmPW5ldyBxLGg9MCx5PTA7Zm9yKGxldCBBIG9mIG8pe2xldCBEPW5ldyBxLFQ9RC53cml0ZVN0cnVjdChwZSxBLmhlYWQpO2lmKFQhPT0wKXJldHVybiBkKFQpO2xldCBIPUQucmVzdWx0KCksVT1hd2FpdCB1LmtkbUZvcihIKSxPPWMuZGVyaXZlQ2lwaGVyKFUsImVuY3J5cHQiKSxLPWF3YWl0IE8uZW5jcnlwdChIKSxfPUEuYm9keT9hd2FpdCBPLmVuY3J5cHQoQS5ib2R5KTpuZXcgVWludDhBcnJheSgwKSxJPUEuaGVhZC5sZW4+MCYmQS5oZWFkLmhzaCE9PXZvaWQgMD9fLmxlbmd0aDowLHY9e2tkbTpVLGhlYWRDcGg6SyxsZW5Cb2R5Okksb2ZmQm9keTpJPjA/eTp2b2lkIDB9LEM9bC53cml0ZVN0cnVjdChIcix2KTtpZihDIT09MClyZXR1cm4gZChDKTtpZihBLmJvZHkpZi53cml0ZUJ5dGVzKF8pLHkrPV8ubGVuZ3RoO2grK31sZXQgZz1mLnJlc3VsdCgpLG09bC5yZXN1bHQoKSxTPWF3YWl0IGEuYmxha2UzKG0pLEU9YXdhaXQgdS5zaWduKFMpLHc9e2xibDpzLGlkeDppLG51bTpoLGhzaDpTLHNpZzpFfSx4PW5ldyBxO3gud3JpdGVTdHJ1Y3QoS3Qse2hlYWQ6dyxpbmRleEVuYzptLGJvZHlFbmM6Z30pO2xldCBiPXgucmVzdWx0KCk7cmV0dXJuIHAoYil9b3MuZW5jb2RlRmlsZT10O2FzeW5jIGZ1bmN0aW9uIHIocyxpLG8pe2xldFthLGNdPUt0LmRlY29kZShuZXcgTihzKSk7aWYoYyE9PTApcmV0dXJuIGQoYyk7bGV0e2hlYWQ6dSxpbmRleEVuYzpsLGJvZHlFbmM6Zn09YSxoPWF3YWl0IG8uZGVyaXZlSWRlbnRpdHkodS5sYmwsdS5pZHgpO2lmKCFhd2FpdCBpLmNoZWNrU2lnRWQyNTUxOSh1LnNpZyx1LmhzaCxoLnB1YmxpY0tleSkpcmV0dXJuIGQoMyk7bGV0IGc9YXdhaXQgaS5ibGFrZTMobCk7aWYoIVkoZyx1LmhzaCkpcmV0dXJuIGQoMTkpO2xldCBtPW5ldyBOKGwpLFM9W107Zm9yKGxldCB3PTA7dzx1Lm51bTt3Kyspe2xldFt4LGJdPW0ucmVhZFN0cnVjdChIcik7aWYoYiE9PTApcmV0dXJuIGQoYik7Uy5wdXNoKHgpfWlmKFMubGVuZ3RoIT09dS5udW0pcmV0dXJuIGQoMTQpO2xldCBFPVtdO2ZvcihsZXQgdyBvZiBTKXtsZXQgeD1vLmRlcml2ZUNpcGhlcih3LmtkbSwiZGVjcnlwdCIpLGI7dHJ5e2I9YXdhaXQgeC5kZWNyeXB0KHcuaGVhZENwaCl9Y2F0Y2h7cmV0dXJuIGQoMjApfWxldFtBLERdPXBlLmRlY29kZShuZXcgTihiKSk7aWYoRCE9PTApcmV0dXJuIGQoRCk7bGV0IFQ7aWYody5sZW5Cb2R5PjAmJncub2ZmQm9keSE9PXZvaWQgMCl7aWYoQS5oc2g9PT12b2lkIDApcmV0dXJuIGQoMTQpO2xldCBIPWYuc2xpY2Uody5vZmZCb2R5LHcub2ZmQm9keSt3LmxlbkJvZHkpO3RyeXtUPWF3YWl0IHguZGVjcnlwdChIKX1jYXRjaHtyZXR1cm4gZCgyMCl9bGV0IFU9YXdhaXQgaS5ibGFrZTMoVCk7aWYoIVkoVSxBLmhzaCkpcmV0dXJuIGQoMTkpfUUucHVzaCh7aGVhZDpBLGJvZHk6VH0pfXJldHVybiBwKEUpfW9zLmRlY29kZUZpbGU9cjthc3luYyBmdW5jdGlvbiBuKHMsaSxvLGEsYyl7bGV0W3UsbF09YXdhaXQgcihzLGksbyk7aWYobCE9PTApcmV0dXJuIGQobCk7bGV0W2YsaF09S3QuZGVjb2RlKG5ldyBOKHMpKTtpZihoIT09MClyZXR1cm4gZChoKTtsZXQgeT1hd2FpdCBjKHUpO3JldHVybiB0KGYuaGVhZC5sYmwsZi5oZWFkLmlkeCx5LGksYSl9b3MubWlncmF0ZUZpbGU9bn0pKFZ0fHw9e30pO2FzeW5jIGZ1bmN0aW9uIGFzKHtub3c6ZSxib2Q6dCxjcnlwdG86cix0eXA6bj0iIn0pe2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCksaT1uZXcgcSxvPWkud3JpdGVTdHJ1Y3QodWUse2lkOnMsdHM6ZX0pO2lmKG8hPT0wKXJldHVybiBkKG8pO2xldCBhPWkucmVzdWx0KCk7cmV0dXJuIF90KHtub3c6ZSxlaWQ6YSxjdHI6MCx0eXA6bixib2Q6dCxjcnlwdG86cn0pfWFzeW5jIGZ1bmN0aW9uIF90KHtub3c6ZSxlaWQ6dCxjdHI6cix0eXA6bj0iIixib2Q6cyxjcnlwdG86aX0pe2xldCBvPW5ldyBOKHQpLFthLGNdPXVlLmRlY29kZShvKTtpZihjIT09MClyZXR1cm4gZChjKTtsZXQgdT1lLmdldFRpbWUoKS1hLnRzLmdldFRpbWUoKSxsLGY9cz8ubGVuZ3RoPz8wO2lmKHMmJmY+MClsPWF3YWl0IGkuYmxha2UzKHMpO3JldHVybiBwKHtlaWQ6dCxvZmY6dSxjdHI6cix0eXA6bixsZW46Zixoc2g6bH0pfWZ1bmN0aW9uIGxvKGUsdCl7bGV0IHI9ZS5sZW5ndGg8dC5sZW5ndGg/ZS5sZW5ndGg6dC5sZW5ndGg7Zm9yKGxldCBuPTA7bjxyO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4gZVtuXS10W25dO3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH1hc3luYyBmdW5jdGlvbiB5dChlLHQpe2xldCByPUFycmF5LmZyb20oZSk7ci5zb3J0KGxvKTtsZXQgbj0wO2ZvcihsZXQgbyBvZiByKW4rPW8ubGVuZ3RoO2xldCBzPW5ldyBVaW50OEFycmF5KG4pLGk9MDtmb3IobGV0IG8gb2YgcilzLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiB0LmJsYWtlMyhzKX1mdW5jdGlvbiBmbyhlKXtsZXQgdD1uZXcgcSxyPXQud3JpdGVWYXJCeXRlcyhlLmVpZCk7aWYociE9PTApcmV0dXJuIGQocik7bGV0IG49dC53cml0ZURhdGUoZS51cGRhdGVkQXQpO2lmKG4hPT0wKXJldHVybiBkKG4pO2xldCBzPXQud3JpdGVWYXJJbnQoZS5jdHIpO2lmKHMhPT0wKXJldHVybiBkKHMpO3JldHVybiBwKHQucmVzdWx0KCkpfWFzeW5jIGZ1bmN0aW9uIE50KGUsdCl7bGV0IHI9W107Zm9yKGxldCBuIG9mIGUpe2xldFtzLGldPWZvKG4pO2lmKGkhPT0wfHwhcylyZXR1cm4gZChpKTtyLnB1c2gocyl9cmV0dXJuIHAoYXdhaXQgeXQocix0KSl9dmFyIHFsPVN5bWJvbCgiTWFzdGVyU2VlZCIpLEZsPVN5bWJvbCgiU2VhbGVkTWFzdGVyS2V5Iiksd2U9MzIsY3M9MjQrd2UrMTY7ZnVuY3Rpb24gVmUoZSl7aWYoZS5ieXRlTGVuZ3RoIT09Y3MpcmV0dXJuIGQoMTApO3JldHVybiBwKGUpfXZhciB6bD1TeW1ib2woIkVudGl0eUlEIik7ZnVuY3Rpb24gZHMoZSl7cmV0dXJuInR5cGUiaW4gZX12YXIgWGw9U3ltYm9sKCJEZXJpdmF0aW9uU2VlZCIpLGpsPVN5bWJvbCgiUHVibGljS2V5IiksJGw9U3ltYm9sKCJQcml2YXRlS2V5IiksR2w9U3ltYm9sKCJIb3N0U3BlY2lmaWNLZXlQYWlyIiksUWw9U3ltYm9sKCJIYXNoIik7ZnVuY3Rpb24gcG8oZSl7aWYoIWUpcmV0dXJuITE7aWYodHlwZW9mIGUhPT0ib2JqZWN0IilyZXR1cm4hMTtpZigiYm9keSJpbiBlPT09ITEpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaG8oZSl7aWYoZT09PW51bGx8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuO2lmKCEoInR5cGUiaW4gZSkpcmV0dXJuO2xldCB0PWUudHlwZTtpZih0eXBlb2YgdCE9PSJzdHJpbmciKXJldHVybjtyZXR1cm4gdH1mdW5jdGlvbiB5byhlKXtpZighZS5ib2R8fGUuYm9kLmxlbmd0aD09PTApe2xldCBpPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZH07cmV0dXJuIHAoaSl9bGV0IHQ9RXIoZS5ib2QpO2lmKHBvKHQpPT09ITEpcmV0dXJuIGNvbnNvbGUud2FybigibXNnIGJvZHkgaW52YWxpZCIsdCksZCgxNCk7bGV0IHI9ZS50eXA/PyIiLG49ci5sZW5ndGg+MD9yOmhvKHQpPz8iIixzPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZCxwaWQ6dC5waWQsdGFnczp0LnRhZ3MsdHlwZTpuLGJvZHk6dC5ib2R5fTtyZXR1cm4gcChzKX1jbGFzcyBxdHthcHBsaWVyO2VtaXR0ZXI9bmV3IHB0O2NsZWFyZXI7b25EaXJ0eUVpZHM7Y2FjaGVEcml2ZW47cGVlckluZ2VzdDtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmFwcGxpZXI9ZTt0aGlzLmNsZWFyZXI9dCx0aGlzLm9uRGlydHlFaWRzPXIsdGhpcy5jYWNoZURyaXZlbj1uPy5jYWNoZURyaXZlbj8/ITEsdGhpcy5wZWVySW5nZXN0PW4/LnBlZXJJbmdlc3R9YXBwbHk9YXN5bmMoZSk9PntsZXQgdD1bXSxyPVtdO2ZvcihsZXQgYSBvZiBlKXtsZXRbYyx1XT15byhhKTtpZihyLnB1c2godSksdSE9PTApY29udGludWU7dC5wdXNoKGMpfWxldHtzdGF0czpuLHR5cGVzOnMsZWlkczppfT1hd2FpdCB0aGlzLmFwcGxpZXIodCksbz1bXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7bGV0IGM9clthXSx1PW5bYV07aWYoYyE9PTApe28ucHVzaChjKTtjb250aW51ZX1pZih1IT09MCl7by5wdXNoKHUpO2NvbnRpbnVlfW8ucHVzaCgwKX1pZighdGhpcy5jYWNoZURyaXZlbilmb3IobGV0IGEgb2Ygcyl0aGlzLmVtaXR0ZXIuZW1pdChhLG51bGwpO2lmKGkubGVuZ3RoPjApdGhpcy5vbkRpcnR5RWlkcz8uKGkpO3JldHVybiBvfTtjbGVhcj1hc3luYygpPT57bGV0IGU9YXdhaXQgdGhpcy5jbGVhcmVyKCk7aWYoZSE9PTApcmV0dXJuIGU7cmV0dXJuIHRoaXMuZW1pdHRlci5lbWl0QWxsKG51bGwpLGV9O25vdGlmeT0oZSk9Pntmb3IobGV0IHQgb2YgZSl0aGlzLmVtaXR0ZXIuZW1pdCh0LG51bGwpfTtyZWZyZXNoPWFzeW5jKGUpPT57aWYodGhpcy5wZWVySW5nZXN0KXthd2FpdCB0aGlzLnBlZXJJbmdlc3QoZSk7cmV0dXJufX07b249KGUsdCk9Pnt0aGlzLmVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihlLHQpfTtvZmY9KGUsdCk9Pnt0aGlzLmVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1mdW5jdGlvbiBHKGUpe3JldHVybiJ0eXBlImluIGV9ZnVuY3Rpb24gbW8oZSx0KXtsZXQgcj10LmV4Y2x1ZGVTdGFydD9lPnQuc3RhcnQ6ZT49dC5zdGFydCxuPXQuZXhjbHVkZUVuZD9lPHQuZW5kOmU8PXQuZW5kO3JldHVybiByJiZufWZ1bmN0aW9uIG10KGUpe2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBwKCEwKTtpZihlLnJhbmdlLnN0YXJ0PmUucmFuZ2UuZW5kKXJldHVybiBkKDEwKTtyZXR1cm4gcCghMCl9ZnVuY3Rpb24gTXIoZSx0KXtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTtyZXR1cm4gbW8oZSx0LnJhbmdlKX1mdW5jdGlvbiBnbyhlLHQpe2xldCByPXQuZXhjbHVkZVN0YXJ0P2U+dC5zdGFydDplPj10LnN0YXJ0LG49dC5leGNsdWRlRW5kP2U8dC5lbmQ6ZTw9dC5lbmQ7cmV0dXJuIHImJm59ZnVuY3Rpb24gZ3QoZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIilyZXR1cm4gcChlLmxlbmd0aD4wKTtpZigicmFuZ2UiaW4gZSl7aWYoZS5yYW5nZS5zdGFydD5lLnJhbmdlLmVuZClyZXR1cm4gZCgxMCk7cmV0dXJuIHAoITApfXJldHVybiBwKGUucHJlZml4Lmxlbmd0aD4wKX1mdW5jdGlvbiBScihlLHQpe2lmKHR5cGVvZiB0PT09InN0cmluZyIpcmV0dXJuIGU9PT10O2lmKCJyYW5nZSJpbiB0KXJldHVybiBnbyhlLHQucmFuZ2UpO2lmKHQucHJlZml4Lmxlbmd0aD09PTApcmV0dXJuITE7cmV0dXJuIGUuc3RhcnRzV2l0aCh0LnByZWZpeCl9ZnVuY3Rpb24gU28oZSl7aWYoIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MClyZXR1cm47bGV0IHQ9bmV3IFNldCxyPVtdO2ZvcihsZXQgbiBvZiBlKXtpZih0eXBlb2YgbiE9PSJzdHJpbmcifHxuLmxlbmd0aD09PTApY29udGludWU7aWYodC5oYXMobikpY29udGludWU7dC5hZGQobiksci5wdXNoKG4pfXJldHVybiByLmxlbmd0aD4wP3I6dm9pZCAwfWZ1bmN0aW9uIEZ0KGUpe3JldHVybntlaWQ6ZS5laWQsY3RyOmUuY3RyLHVwZGF0ZWRBdDplLnVwZGF0ZWRBdH19ZnVuY3Rpb24gdXMoZSl7bGV0IHQ9bmV3IE4oZS5laWQpLFtyLG5dPXQucmVhZFN0cnVjdCh1ZSk7aWYobiE9PTApcmV0dXJuIGQobik7cmV0dXJuIHAoe2VpZDplLmVpZCxjdHI6ZS5jdHIsdXBkYXRlZEF0Om5ldyBEYXRlKHIudHMuZ2V0VGltZSgpK2Uub2ZmKX0pfWZ1bmN0aW9uIFplKGUsdCl7bGV0IHI9bmV3IE4odC5laWQpLFtuLHNdPXIucmVhZFN0cnVjdCh1ZSk7aWYocyE9PTApcmV0dXJuIGQocyk7bGV0IGk9bmV3IERhdGUobi50cy5nZXRUaW1lKCkrdC5vZmYpO2lmKGUhPT12b2lkIDAmJmk8PWUudXBkYXRlZEF0KXJldHVybiBkKDE1KTtpZihkcyh0KSl7bGV0IG89U28odC50YWdzKTtyZXR1cm4gcCh7ZWlkOnQuZWlkLHBpZDp0LnBpZCwuLi5vIT09dm9pZCAwP3t0YWdzOm99Ont9LHR5cGU6dC50eXBlLGNyZWF0ZWRBdDpuLnRzLHVwZGF0ZWRBdDppLGN0cjp0LmN0cixib2R5OnQuYm9keX0pfXJldHVybiBwKHtlaWQ6dC5laWQsdXBkYXRlZEF0OmksY3RyOnQuY3RyfSl9ZnVuY3Rpb24gZXQoZSx0KXtsZXQgcj1uZXcgU2V0O2lmKGUhPT12b2lkIDAmJkcoZSkpci5hZGQoZS50eXBlKTtpZihHKHQpKXIuYWRkKHQudHlwZSk7cmV0dXJuWy4uLnJdfWNsYXNzIFd0e2luZmxpZ2h0PW51bGw7YWdhaW49ITE7cnVuKGUpe2lmKHRoaXMuYWdhaW49ITAsdGhpcy5pbmZsaWdodClyZXR1cm4gdGhpcy5pbmZsaWdodDtyZXR1cm4gdGhpcy5pbmZsaWdodD10aGlzLmRyYWluKGUpLHRoaXMuaW5mbGlnaHR9YXN5bmMgZmx1c2goKXtpZighdGhpcy5pbmZsaWdodClyZXR1cm47dHJ5e2F3YWl0IHRoaXMuaW5mbGlnaHR9Y2F0Y2h7fX1hc3luYyBkcmFpbihlKXt0cnl7dGhpcy5hZ2Fpbj0hMTtsZXQgdD1hd2FpdCBlKCk7d2hpbGUodGhpcy5hZ2Fpbil0aGlzLmFnYWluPSExLHQ9YXdhaXQgZSgpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5pbmZsaWdodD1udWxsfX19dmFyIGxzPTEwMDtjbGFzcyBMcnt0aW1lcj1udWxsO2RlbGF5TXM7d29yazt0YWlsPW5ldyBXdDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGVsYXlNcz1lPDA/MDplLHRoaXMud29yaz10fXNjaGVkdWxlKCl7aWYodGhpcy5kZWxheU1zPD0wKXt0aGlzLmZpcmUoKTtyZXR1cm59aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMudGltZXI9c2V0VGltZW91dCgoKT0+e3RoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKX0sdGhpcy5kZWxheU1zKX1hc3luYyBmbHVzaCgpe2lmKHRoaXMudGltZXIhPT1udWxsKWNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGwsdGhpcy5maXJlKCk7YXdhaXQgdGhpcy50YWlsLmZsdXNoKCl9Y2FuY2VsKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbH1maXJlKCl7cmV0dXJuIHRoaXMudGFpbC5ydW4odGhpcy53b3JrKX19dmFyIGZzPSExO2Z1bmN0aW9uIHBzKGUpe2ZzPWU9PT0hMH1mdW5jdGlvbiBGKGUsdCl7aWYoIWZzKXJldHVybjtsZXQgcj1NYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKTtpZih0IT09dm9pZCAwKWNvbnNvbGUud2FybihgW2RpcCAke3J9bXNdICR7ZX1gLHQpO2Vsc2UgY29uc29sZS53YXJuKGBbZGlwICR7cn1tc10gJHtlfWApfWZ1bmN0aW9uIGhzKGUpe2xldCB0PW5ldyBOKGUuZWlkKSxbcixuXT11ZS5kZWNvZGUodCk7aWYobiE9PTApcmV0dXJuO3JldHVybiByLnRzLmdldFRpbWUoKStlLm9mZn1mdW5jdGlvbiBibyhlLHQpe2xldCByPWhzKGUpLG49aHModCk7aWYocj09PXZvaWQgMCYmbj09PXZvaWQgMClyZXR1cm4gMDtpZihyPT09dm9pZCAwKXJldHVybiAxO2lmKG49PT12b2lkIDApcmV0dXJuLTE7aWYobiE9PXIpcmV0dXJuIG4tcjtyZXR1cm4gdC5jdHItZS5jdHJ9ZnVuY3Rpb24gdHQoZSx0KXtyZXR1cm4gZS5zbGljZSgpLnNvcnQoKHIsbik9PmJvKHQociksdChuKSkpfXZhciBPcj17cGhhc2U6ImlkbGUifSxTdD01MDtmdW5jdGlvbiBLcihlLHQscil7aWYoZTw9MHx8dDw9MClyZXR1cm4hMTtpZihlPT09MXx8ZT09PXQpcmV0dXJuITA7cmV0dXJuIGUlcj09PTB9ZnVuY3Rpb24geXMoZSx0KXtpZih0eXBlb2YgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2I9PT0iZnVuY3Rpb24iKXtuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihlLHQpO3JldHVybn1sZXQgcj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO24uaHJlZj1yLG4uZG93bmxvYWQ9dCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG4pLG4uY2xpY2soKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG4pLFVSTC5yZXZva2VPYmplY3RVUkwocil9ZnVuY3Rpb24gbXMoZSx0LHIpe2xldCBuPVtdLHM9W10saT0wO2ZvcihsZXQgbyBvZiBlKXtsZXQgYT10KG8pO2lmKHMubGVuZ3RoPjAmJmkrYT5yKW4ucHVzaChzKSxzPVtdLGk9MDtpZihzLnB1c2gobyksaSs9YSxpPj1yKW4ucHVzaChzKSxzPVtdLGk9MH1pZihzLmxlbmd0aD4wKW4ucHVzaChzKTtyZXR1cm4gbn1hc3luYyBmdW5jdGlvbiBWcihlLHQscil7bGV0IG49ZS5sZW5ndGg7aWYobjwxKXJldHVybltdO2xldCBzPUFycmF5KG4pLGk9MCxvPU1hdGgubWluKE1hdGgubWF4KDEsdCksbiksYT1hc3luYygpPT57d2hpbGUoITApe2xldCB1PWk7aWYoaSs9MSx1Pj1uKXJldHVybjtzW3VdPWF3YWl0IHIoZVt1XSx1KX19LGM9W107Zm9yKGxldCB1PTA7dTxvO3UrKyljLnB1c2goYSgpKTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoYyksc31hc3luYyBmdW5jdGlvbiB6dChlLHQscixuKXtsZXQgcz1uZXcgTihlLmhlYWRDcGgpLFtpLG9dPXMucmVhZFN0cnVjdChSdCk7aWYobyE9PTApcmV0dXJuIGQobyk7bGV0e3NpZzphLGtkbTpjLGhlYWRDcGg6dX09aTtpZighYXdhaXQgbi5jaGVja1NpZ0VkMjU1MTkoYSx1LHQpKXJldHVybiBkKDMpO2xldCBmPXIuZGVyaXZlQ2lwaGVyKGMsImRlY3J5cHQiKSxoO3RyeXtoPWF3YWl0IGYuZGVjcnlwdCh1KX1jYXRjaHtyZXR1cm4gZCgyMCl9cmV0dXJuIHAoe2tkbTpjLGhlYWRFbmM6aH0pfXZhciBudD0iZiIsWHQ9InQiLHJ0PSJlIjtmdW5jdGlvbiB3byhlKXtpZihlPT09ITB8fGU9PT1YdClyZXR1cm4gWHQ7aWYoZT09PXJ0KXJldHVybiBydDtyZXR1cm4gbnR9ZnVuY3Rpb24gZ3MoZSl7cmV0dXJuIGUhPT0wJiZlIT09MTUmJmUhPT0xOCYmZSE9PTE3fWZ1bmN0aW9uIF9yKGUsdCxyKXtpZihlLmFwbGQ9dCx0PT09cnQmJnIhPT12b2lkIDApZS5lcnI9cjtlbHNlIGRlbGV0ZSBlLmVycn1hc3luYyBmdW5jdGlvbiBqdChlLHQscixuKXtsZXQgcz1uPy5ib2R5IT09ITEsaT13byh0LmFwbGQpLG89dC5ib2R5LGE9bz8ubGVuZ3RoPz8wLGM7aWYocyYmbyYmYT4wKWM9YXdhaXQgci5ibGFrZTMobyk7bGV0IHU9e2VpZDp0LmVpZCxvZmY6dC5vZmY/PzAsY3RyOnQuY3RyPz8wLHR5cDp0LnR5cD8/IiIsbGVuOmEsaHNoOmN9LGw9e2hhc2g6ZSxoZWFkOnUsYXBsZDppfTtpZihzJiZvIT09dm9pZCAwKWwuYm9keT1vO2lmKGk9PT1ydCYmdC5lcnIhPT12b2lkIDApbC5lcnI9dC5lcnI7cmV0dXJuIGx9dmFyIE5yPTEwNDg1NzYscXI9MTA0ODU3Nixicz02NDtmdW5jdGlvbiBJbyhlKXtyZXR1cm4gZS5zaWcubGVuZ3RoK2Uua2RtLmxlbmd0aCtlLmhlYWRDcGgubGVuZ3RoK2UuYm9keUNwaC5sZW5ndGh9YXN5bmMgZnVuY3Rpb24geG8oZSx0LHIsbixzKXtpZihuLmxlbmd0aDwxKXJldHVybiAwO2xldFtpLG9dPWF3YWl0IGUucHVzaChuKTtpZihvIT09MClyZXR1cm4gbztpZighaSlyZXR1cm4gMjc7Zm9yKGxldCBjIG9mIGkpe2lmKGMuc3RhdHVzIT09MCl7Y29uc29sZS5lcnJvcigicHVzaCBlcnIiLGMpO2NvbnRpbnVlfWxldCB1PXNbYy5pZHhdO2lmKCF1KXtjb25zb2xlLmVycm9yKCJubyBoYXNoIixjKTtjb250aW51ZX1hd2FpdCB0LnVwbG9hZHMuZGVxKHIsW3VdKX1sZXQgYT1hd2FpdCB0Lmhvc3RzLmdldChyKTtpZihhKXtsZXQgYz1hLmxhc3RTZXEsdT1jLGw9W107Zm9yKGxldCBmIG9mIGkpaWYoZi5zdGF0dXM9PT0wKWwucHVzaChmLnNlcSk7bC5zb3J0KChmLGgpPT5mLWgpO2ZvcihsZXQgZiBvZiBsKWlmKGY9PT1jKzEpYz1mO2lmKGM+dSlhd2FpdCB0Lmhvc3RzLnRvdWNoKHIsYyl9cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gU3MoZSx0KXtpZih0Lmxlbmd0aDwxKXJldHVybiBwKFtdKTtsZXQgcj1uZXcgTWFwLG49W107Zm9yKGxldCBhIG9mIHQpci5zZXQoYS5zZXEsYSksbi5wdXNoKGEuc2VxKTtsZXRbcyxpXT1hd2FpdCBlLnB1bGwobik7aWYoaSE9PTApcmV0dXJuIGQoaSk7aWYoIXMpcmV0dXJuIGQoMjcpO2xldCBvPVtdO2ZvcihsZXR7c2VxOmEsYm9keUNwaDpjfW9mIHMpe2xldCB1PXIuZ2V0KGEpO2lmKCF1KWNvbnRpbnVlO28ucHVzaCh7ZGw6dSxib2R5Q3BoOmN9KX1yZXR1cm4gcChvKX1hc3luYyBmdW5jdGlvbiBFbyhlLHQscixuKXtpZihuLmxlbmd0aDwxKXJldHVybiBwKHtwYXJ0czpbXSxoYXNoZXM6W119KTtsZXQgcz1bXSxpPVtdLG89W10sYT1uZXcgTWFwO2ZvcihsZXR7ZGw6dSxib2R5Q3BoOmx9b2Ygbil7bGV0e2hlYWQ6ZixrZG06aCxzZXE6eSxob3N0Omd9PXUsW20sU109YXdhaXQgd3ModSxyKTtpZihTIT09MHx8IW0pe2xldCBVPWEuZ2V0KGcpPz9bXTtVLnB1c2goeSksYS5zZXQoZyxVKTtjb250aW51ZX1sZXR7aGVhZEVuYzpFLGhlYWRFbmNIYXNoOnd9PW0seD10LmRlcml2ZUNpcGhlcihoLCJkZWNyeXB0IiksW2IsQV09YXdhaXQgUHIoRSxsLHgscix3KTtpZihBIT09MHx8IWIpe2xldCBVPWEuZ2V0KGcpPz9bXTtVLnB1c2goeSksYS5zZXQoZyxVKTtjb250aW51ZX1sZXQgRD17aGVhZDpmLGJvZHk6Yi5ib2R9LFQ9Yi5oZWFkSGFzaDtvLnB1c2goe2tleTpULGRhdGE6RXMoRCl9KSxzLnB1c2goRCksaS5wdXNoKFQpO2xldCBIPWEuZ2V0KGcpPz9bXTtILnB1c2goeSksYS5zZXQoZyxIKX1sZXQgYz1hd2FpdCBlLm1lc3NhZ2VzLmFkZChvKTtmb3IobGV0W3UsbF1vZiBhKWF3YWl0IGUuZG93bmxvYWRzLmRlcSh1LGwpO2ZvcihsZXQgdT0wO3U8Yy5sZW5ndGg7dSsrKXtsZXQgbD1jW3VdO2lmKGwhPT0wJiZsIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLEJbbF0sImZvciBtZXNzYWdlIix1KX1yZXR1cm4gcCh7cGFydHM6cyxoYXNoZXM6aX0pfWFzeW5jIGZ1bmN0aW9uIHdzKGUsdCl7bGV0IHI9ZS5oZWFkRW5jO2lmKCFyKXtsZXQgcz1uZXcgcSxpPXMud3JpdGVTdHJ1Y3QocGUsZS5oZWFkKTtpZihpIT09MClyZXR1cm4gZChpKTtyPXMucmVzdWx0KCl9aWYoZS5oZWFkRW5jSGFzaClyZXR1cm4gcCh7aGVhZEVuYzpyLGhlYWRFbmNIYXNoOmUuaGVhZEVuY0hhc2h9KTtsZXQgbj1hd2FpdCB0LmJsYWtlMyhyKTtyZXR1cm4gcCh7aGVhZEVuYzpyLGhlYWRFbmNIYXNoOm59KX1hc3luYyBmdW5jdGlvbiBJcyhlLHQscil7bGV0IG49bmV3IFNldDtmb3IobGV0IG8gb2YgdCluLmFkZChSKG8pKTtpZihuLnNpemU8MSlyZXR1cm47bGV0IHM9QXJyYXkuZnJvbShhd2FpdCBlLmRvd25sb2Fkcy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuO2xldCBpPW5ldyBNYXA7Zm9yKGxldCBvIG9mIHMpe2xldCBhO2lmKG8uaGVhZEVuY0hhc2gpYT1SKG8uaGVhZEVuY0hhc2gpO2Vsc2V7bGV0W3UsbF09YXdhaXQgd3MobyxyKTtpZihsIT09MHx8IXUpY29udGludWU7YT1SKHUuaGVhZEVuY0hhc2gpfWlmKCFuLmhhcyhhKSljb250aW51ZTtsZXQgYz1pLmdldChvLmhvc3QpPz9bXTtjLnB1c2goby5zZXEpLGkuc2V0KG8uaG9zdCxjKX1mb3IobGV0W28sYV1vZiBpKWF3YWl0IGUuZG93bmxvYWRzLmRlcShvLGEpfWFzeW5jIGZ1bmN0aW9uIEZyKHtjb25uOmUsc3RvcmU6dCxlbmNsYXZlOnIsaG9zdDpuLGNyeXB0bzpzLG9uUHJvZ3Jlc3M6aSxwZWVrUHJvZ3Jlc3NFdmVyeTpvLHBlZWtDb25jdXJyZW5jeTphfSl7bGV0IGM9YXdhaXQgZS5pZGVudGl0eSgpLHU9W10sW2wsZl09YXdhaXQgZS5wZWVrKG4ubGFzdFNlcSk7aWYoZiE9PTApcmV0dXJuIGY7bGV0IGg9bC5sZW5ndGgseT1vPz9TdCxnPWE/P2JzO2lmKGkmJmg+MClpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6MCx0b3RhbDpofSk7bGV0IG09MCxTPWF3YWl0IFZyKGwsZyxhc3luYyh3KT0+e2xldFt4LGJdPWF3YWl0IHp0KHcsYy5wdWJsaWNLZXkscixzKSxBO2lmKGIhPT0wfHwheClBPXtvazohMSxzZXE6dy5zZXEsc3RhdDpifTtlbHNle2xldCBEPWF3YWl0IHMuYmxha2UzKHguaGVhZEVuYyk7QT17b2s6ITAsc2VxOncuc2VxLGtkbTp4LmtkbSxoZWFkRW5jOnguaGVhZEVuYyxoZWFkRW5jSGFzaDpEfX1pZihtKz0xLGkmJktyKG0saCx5KSlpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6bSx0b3RhbDpofSk7cmV0dXJuIEF9KSxFPW5ldyBTZXQ7Zm9yKGxldCB3IG9mIFMpe2lmKCF3Lm9rKXtjb25zb2xlLmVycm9yKCJwZWVrOiBkZWNyeXB0aW5nIGl0ZW0gaGVhZCIsdy5zdGF0KTtjb250aW51ZX1sZXQgeD1SKHcuaGVhZEVuY0hhc2gpO2lmKGF3YWl0IHQubWVzc2FnZXMuaGFzKHcuaGVhZEVuY0hhc2gpKXtjb25zb2xlLmluZm8oInBlZWs6IGxvY2FsIG1zZzsgc2tpcCBkb3dubG9hZCwgZGVxIHVwbG9hZCIpLGF3YWl0IHQudXBsb2Fkcy5kZXEobi5sYWJlbCxbdy5oZWFkRW5jSGFzaF0pLGF3YWl0IHQuZG93bmxvYWRzLmRlcShuLmxhYmVsLFt3LnNlcV0pO2NvbnRpbnVlfWlmKEUuaGFzKHgpKXthd2FpdCB0LmRvd25sb2Fkcy5kZXEobi5sYWJlbCxbdy5zZXFdKTtjb250aW51ZX1sZXQgQT1uZXcgTih3LmhlYWRFbmMpLFtELFRdPUEucmVhZFN0cnVjdChwZSk7aWYoVCE9PTApe2NvbnNvbGUuZXJyb3IoInBlZWs6IHJlYWRpbmcgaXRlbSBoZWFkIixUKTtjb250aW51ZX1FLmFkZCh4KSx1LnB1c2goe2tkbTp3LmtkbSxoZWFkOkQsc2VxOncuc2VxLGhvc3Q6bi5sYWJlbCxoZWFkRW5jOncuaGVhZEVuYyxoZWFkRW5jSGFzaDp3LmhlYWRFbmNIYXNofSl9aWYoYXdhaXQgdC5kb3dubG9hZHMuZW5xKHUpLGwubGVuZ3RoPjApe2xldCB3PU1hdGgubWF4KC4uLmwubWFwKCh4KT0+eC5zZXEpKTthd2FpdCB0Lmhvc3RzLnJlY29yZFN0YXRzKG4ubGFiZWwse2xhc3RTZXE6d30pfWlmKGkpaSh7cGhhc2U6InBlZWsiLGhvc3Q6bi5sYWJlbCxkb25lOmgsdG90YWw6aH0pO3JldHVybiAwfWFzeW5jIGZ1bmN0aW9uIHhzKHtjb25uOmUsc3RvcmU6dCxob3N0OnIsbWF4UHVzaEJ5dGVzOm4sb25Qcm9ncmVzczpzfSl7bGV0IGk9bj8/TnIsbz1hd2FpdCB0LnVwbG9hZHMubGlzdChyLmxhYmVsKSxhPW8ubGVuZ3RoLGM9MDtpZihzJiZhPjApcyh7cGhhc2U6InB1c2giLGhvc3Q6ci5sYWJlbCxkb25lOjAsdG90YWw6YX0pO2xldCB1PVtdLGw9W10sZj0wLGg9YXN5bmMoKT0+e2lmKHUubGVuZ3RoPDEpcmV0dXJuIDA7bGV0IHk9dS5sZW5ndGgsZz1hd2FpdCB4byhlLHQsci5sYWJlbCx1LGwpO2lmKHU9W10sbD1bXSxmPTAsZz09PTApe2lmKGMrPXkscylzKHtwaGFzZToicHVzaCIsaG9zdDpyLmxhYmVsLGRvbmU6Yyx0b3RhbDphfSl9cmV0dXJuIGd9O2ZvcihsZXQgeSBvZiBvKXtsZXQgZz1hd2FpdCB0Lm1lc3NhZ2VzLmdldCh5KTtpZighZyl7Yys9MTtjb250aW51ZX1sZXQgbT17Li4uZy5oZWFkLGJvZDpnLmJvZHl9LFtTLEVdPWF3YWl0IGUuc2VhbChtKTtpZihFIT09MClyZXR1cm4gRTtpZighUylyZXR1cm4gMTI7bGV0IHc9SW8oUyk7aWYodS5sZW5ndGg+MCYmZit3Pmkpe2xldCB4PWF3YWl0IGgoKTtpZih4IT09MClyZXR1cm4geH1pZih1LnB1c2goUyksbC5wdXNoKHkpLGYrPXcsZj49aSl7bGV0IHg9YXdhaXQgaCgpO2lmKHghPT0wKXJldHVybiB4fX1yZXR1cm4gaCgpfWFzeW5jIGZ1bmN0aW9uIFdyKHtjb25uOmUsc3RvcmU6dCxlbmNsYXZlOnIsaG9zdDpuLGNyeXB0bzpzLG1heFB1bGxCeXRlczppLG9uUHJvZ3Jlc3M6b30sYSl7bGV0IGM9aT8/cXIsdT1hd2FpdCB0LmRvd25sb2Fkcy5saXN0KCksbD1BcnJheS5mcm9tKHUpLmZpbHRlcigoUyk9PlMuaG9zdD09PW4ubGFiZWwpO2lmKGwubGVuZ3RoPDEpcmV0dXJuIDE1O2xldCBmPXR0KGwsKFMpPT5TLmhlYWQpLGg9bXMoZiwoUyk9PlMuaGVhZC5sZW4sYykseT1mLmxlbmd0aCxnPTA7aWYobylvKHtwaGFzZToicHVsbCIsaG9zdDpuLmxhYmVsLGRvbmU6MCx0b3RhbDp5fSk7bGV0IG09U3MoZSxoWzBdKTtmb3IobGV0IFM9MDtTPGgubGVuZ3RoO1MrKyl7bGV0W0Usd109YXdhaXQgbTtpZih3IT09MHx8IUUpcmV0dXJuIHc7aWYoZys9aFtTXS5sZW5ndGgsbylvKHtwaGFzZToicHVsbCIsaG9zdDpuLmxhYmVsLGRvbmU6Zyx0b3RhbDp5fSk7bGV0IHg9aFtTKzFdO2lmKHgpbT1TcyhlLHgpO2lmKG8pbyh7cGhhc2U6Im9wZW4iLGhvc3Q6bi5sYWJlbCxkb25lOmcsdG90YWw6eX0pO2xldCBiPXR0KEUsKEQpPT5ELmRsLmhlYWQpLFssQV09YXdhaXQgRW8odCxyLHMsYik7aWYoQSE9PTApcmV0dXJuIEE7aWYoYSl7aWYobylvKHtwaGFzZToiZXhlYyIsaG9zdDpuLmxhYmVsLGRvbmU6Zyx0b3RhbDp5fSk7YXdhaXQgYSgpfX1yZXR1cm4gMH1mdW5jdGlvbiBFcyh7aGVhZDplLGJvZHk6dH0pe2xldCByPXtlaWQ6ZS5laWQsYm9keTp0LGFwbGQ6bnR9O2lmKGUub2ZmIT09MClyLm9mZj1lLm9mZjtpZihlLmN0ciE9PTApci5jdHI9ZS5jdHI7aWYoZS50eXApci50eXA9ZS50eXA7cmV0dXJuIHJ9YXN5bmMgZnVuY3Rpb24gQXMoZSx7Y29ubjp0LHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6cyxjcnlwdG86aSxvblByb2dyZXNzOm99LGEpe2xldCBjPXMubGFiZWwsdT1hd2FpdCB0LmlkZW50aXR5KCksbD1uZXcgTihlKSxbZixoXT1sLnJlYWRTdHJ1Y3RzKE10KTtpZihoIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY29kaW5nIG5vdGlmIixCW2hdKTtyZXR1cm59bGV0IHk9ITEsbT0oYXdhaXQgci5ob3N0cy5nZXQoYykpPy5sYXN0U2VxLFM9W10sRT0hMTtmb3IobGV0IGIgb2YgZil7bGV0W0EsRF09YXdhaXQgenQoe3NlcTpiLnNlcSxoZWFkQ3BoOmIuaGVhZENwaH0sdS5wdWJsaWNLZXksbixpKTtpZihEIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY3J5cHRpbmcgbm90aWYiLEJbRF0pO2NvbnRpbnVlfWxldCBUPWF3YWl0IGkuYmxha2UzKEEuaGVhZEVuYyk7aWYoYXdhaXQgci5tZXNzYWdlcy5oYXMoVCkpY29udGludWU7bGV0IEg9bmV3IE4oQS5oZWFkRW5jKSxbVSxPXT1ILnJlYWRTdHJ1Y3QocGUpO2lmKE8hPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcGFyc2UgaGVhZCIsQltPXSk7Y29udGludWV9aWYoIWIuYm9keUNwaCYmVS5sZW4+MClFPSEwLGF3YWl0IHIuZG93bmxvYWRzLmVucShbe3NlcTpiLnNlcSxob3N0OmMsa2RtOkEua2RtLGhlYWQ6VSxoZWFkRW5jOkEuaGVhZEVuYyxoZWFkRW5jSGFzaDpUfV0pO2Vsc2UgUy5wdXNoKHsuLi5BLGhlYWQ6VSxib2R5Q3BoOmIuYm9keUNwaCxoZWFkRW5jSGFzaDpUfSk7aWYobT09PXZvaWQgMHx8Yi5zZXEhPT1tKzEpY29uc29sZS5sb2coIm91dCBvZiBzZXEiLGIuc2VxLG0pLHk9ITA7ZWxzZSBtPWIuc2VxfWlmKG0hPT12b2lkIDApYXdhaXQgci5ob3N0cy50b3VjaChzLmxhYmVsLG0pO2xldCB3PVtdO2ZvcihsZXQgYiBvZiBTKXtsZXQgQT1uLmRlcml2ZUNpcGhlcihiLmtkbSwiZGVjcnlwdCIpLFtELFRdPWF3YWl0IFByKGIuaGVhZEVuYyxiLmJvZHlDcGgsQSxpKTtpZihUIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIG9wZW4gYm9keSIsQltUXSk7Y29udGludWV9dy5wdXNoKHtrZXk6Yi5oZWFkRW5jSGFzaCxkYXRhOkVzKHtoZWFkOmIuaGVhZCxib2R5OkQuYm9kfSl9KX1sZXQgeD1hd2FpdCByLm1lc3NhZ2VzLmFkZCh3KTtmb3IobGV0IGI9MDtiPHgubGVuZ3RoO2IrKyl7bGV0IEE9eFtiXTtpZihBIT09MCYmQSE9PTE1KWNvbnNvbGUuZXJyb3IoIkVSUiBzdG9yaW5nIixCW0FdLCJmb3IgbWVzc2FnZSIsYil9aWYobyYmdy5sZW5ndGg+MClvKHtwaGFzZToib3BlbiIsaG9zdDpzLmxhYmVsLGRvbmU6dy5sZW5ndGgsdG90YWw6dy5sZW5ndGh9KTtpZih5fHxFfHx3Lmxlbmd0aD4wKWEoKX1hc3luYyBmdW5jdGlvbiB6cihlLHQ9e30pe2xldCByPXQucHVsbCE9PSExLG49dC5wdXNoPT09ITAse2Nvbm46cyxzdG9yZTppLGVuY2xhdmU6byxob3N0OmEsY3J5cHRvOmMsb25Qcm9ncmVzczp1LHBlZWtQcm9ncmVzc0V2ZXJ5OmwscGVla0NvbmN1cnJlbmN5OmZ9PWUsaD1hd2FpdCBzLmlkZW50aXR5KCksW3ksZ109YXdhaXQgcy5wZWVrKDApO2lmKGchPT0wKXJldHVybiBkKGcpO2xldCBtPXkubGVuZ3RoLFM9bD8/U3QsRT1mPz9icztpZih1JiZtPjApdSh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOjAsdG90YWw6bX0pO2xldCB3PTAseD1hd2FpdCBWcih5LEUsYXN5bmModik9PntsZXRbQyxMXT1hd2FpdCB6dCh2LGgucHVibGljS2V5LG8sYyksTTtpZihMIT09MHx8IUMpTT17b2s6ITEsc2VxOnYuc2VxLHN0YXQ6TH07ZWxzZXtsZXQgaz1hd2FpdCBjLmJsYWtlMyhDLmhlYWRFbmMpO009e29rOiEwLHNlcTp2LnNlcSxrZG06Qy5rZG0saGVhZEVuYzpDLmhlYWRFbmMsaGVhZEVuY0hhc2g6a319aWYodys9MSx1JiZLcih3LG0sUykpdSh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOncsdG90YWw6bX0pO3JldHVybiBNfSksYj1uZXcgTWFwO2ZvcihsZXQgdiBvZiB4KXtpZighdi5vayljb250aW51ZTtsZXQgQz1SKHYuaGVhZEVuY0hhc2gpLEw9Yi5nZXQoQyk7aWYoTClMLmNvdW50Kz0xO2Vsc2UgYi5zZXQoQyx7aGFzaDp2LmhlYWRFbmNIYXNoLGNvdW50OjEsc2FtcGxlOnZ9KX1sZXQgQT0wLEQ9W107Zm9yKGxldCB2IG9mIGIudmFsdWVzKCkpe2lmKHYuY291bnQ+MSlBKz12LmNvdW50LTE7RC5wdXNoKHYuaGFzaCl9bGV0IFQ9eS5sZW5ndGgsSD1iLnNpemUsVT1hd2FpdCB5dChELGMpLE89W10sSz0wO2ZvcihsZXQgdiBvZiBiLnZhbHVlcygpKXtpZihhd2FpdCBpLm1lc3NhZ2VzLmhhcyh2Lmhhc2gpKXthd2FpdCBpLnVwbG9hZHMuZGVxKGEubGFiZWwsW3YuaGFzaF0pO2NvbnRpbnVlfWlmKEsrPTEsIXIpY29udGludWU7bGV0IEw9di5zYW1wbGUsTT1uZXcgTihMLmhlYWRFbmMpLFtrLGpdPU0ucmVhZFN0cnVjdChwZSk7aWYoaiE9PTApe2NvbnNvbGUuZXJyb3IoInJlY29uY2lsZTogcmVhZGluZyBtc2cgaGVhZGVyIixqKTtjb250aW51ZX1PLnB1c2goe2tkbTpMLmtkbSxoZWFkOmssc2VxOkwuc2VxLGhvc3Q6YS5sYWJlbCxoZWFkRW5jOkwuaGVhZEVuYyxoZWFkRW5jSGFzaDpMLmhlYWRFbmNIYXNofSl9aWYoTy5sZW5ndGg+MClhd2FpdCBpLmRvd25sb2Fkcy5lbnEoTyk7bGV0IF89MDtpZihuKXtsZXQgdj1hd2FpdCBpLm1lc3NhZ2VzLmxpc3RLZXlzKCksQz1uZXcgU2V0KGIua2V5cygpKSxMPVtdO2ZvcihsZXQgTSBvZiB2KWlmKCFDLmhhcyhSKE0pKSlfKz0xLEwucHVzaChNKTtpZihMLmxlbmd0aD4wKWF3YWl0IGkudXBsb2Fkcy5lbnEoYS5sYWJlbCxMKX1lbHNle2xldCB2PWF3YWl0IGkubWVzc2FnZXMubGlzdEtleXMoKSxDPW5ldyBTZXQoYi5rZXlzKCkpO2ZvcihsZXQgTCBvZiB2KWlmKCFDLmhhcyhSKEwpKSlfKz0xfWxldCBJPXkubGVuZ3RoPjA/TWF0aC5tYXgoLi4ueS5tYXAoKHYpPT52LnNlcSkpOjA7aWYoYXdhaXQgaS5ob3N0cy5yZWNvcmRTdGF0cyhhLmxhYmVsLHtzZXRMYXN0U2VxOkl9KSx1KXUoe3BoYXNlOiJwZWVrIixob3N0OmEubGFiZWwsZG9uZTptLHRvdGFsOm19KTtyZXR1cm4gcCh7bXNnY2hlY2s6VSxudW1CYWdzOlQsdW5pcXVlTXNnczpILG51bUR1cGVzOkEsbWlzc2luZ0xvY2FsOkssbWlzc2luZ0hvc3Q6X30pfWZ1bmN0aW9uIEFvKGUpe3JldHVybiBlLm1hcCgoe2hlYWQ6dCxib2R5OnJ9KT0+KHsuLi50LGJvZDpyfSkpfWNsYXNzIFhye2Nsb2NrO3N0YXRlO3N0b3JlO3RyYW5zcG9ydDtjcnlwdG87Zm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ7b25TY2hlZHVsZVN5bmM7Y29ubmVjdGlvbnM9bmV3IE1hcDthcHBseUNoYWluPVByb21pc2UucmVzb2x2ZSgpO3N5bmNSdW5zPW5ldyBXdDtjbGllbnRTdGF0ZTt4ZmVyU3RhdGU7bWF4UHVzaEJ5dGVzO21heFB1bGxCeXRlcztwZWVrUHJvZ3Jlc3NFdmVyeT1TdDtsYXN0UHJvZ3Jlc3M9T3I7c2NoZWR1bGVkU3luYztjb25zdHJ1Y3RvcihlLHQscixuLHMsaT0hMCxvPU5yLGE9cXIsYyl7dGhpcy5jbG9jaz1lO3RoaXMuc3RhdGU9dDt0aGlzLnN0b3JlPXI7dGhpcy50cmFuc3BvcnQ9bjt0aGlzLmNyeXB0bz1zO3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ9aTt0aGlzLm9uU2NoZWR1bGVTeW5jPWM7dGhpcy5tYXhQdXNoQnl0ZXM9byx0aGlzLm1heFB1bGxCeXRlcz1hLHRoaXMuY2xpZW50U3RhdGU9bmV3IEtlKCgpPT50aGlzLmdldENsaWVudFN0YXRlKCkpLHRoaXMueGZlclN0YXRlPW5ldyBLZSgoKT0+dGhpcy5nZXRYZmVyU3RhdGUoKSksdGhpcy5zY2hlZHVsZWRTeW5jPW5ldyBMcihscyxhc3luYygpPT57dHJ5e2NvbnNvbGUuaW5mbygiUnVubmluZyBzY2hlZHVsZWQgc3luYyIpLGF3YWl0IHRoaXMuc3luYygpfWNhdGNoKHUpe2NvbnNvbGUuZXJyb3IoIkRlYm91bmNlZCBzeW5jIGZhaWxlZDoiLHUpfX0pfWVtaXRQcm9ncmVzcz0oZSk9Pnt0aGlzLmxhc3RQcm9ncmVzcz1lLHRoaXMueGZlclN0YXRlLmVtaXQoKX07YXN5bmMgc2V0U2VlZChlLHQpe2F3YWl0IHRoaXMuc3RvcmUuc2VlZC5zYXZlKGUsdCksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgZ2V0Q2xpZW50U3RhdGUoKXtsZXR7c3RvcmU6ZSxjb25uZWN0aW9uczp0fT10aGlzLHI9YXdhaXQgZS5zZWVkLmxvYWQoKSxuPWF3YWl0IGUuaG9zdHMubGlzdCgpLHM9ITE7Zm9yKGxldCBpIG9mIHQudmFsdWVzKCkpaWYoaS5pc0Nvbm5lY3RlZCgpKXtzPSEwO2JyZWFrfXJldHVybntoYXNTZWVkOnIhPT12b2lkIDAsaGFzSG9zdDpBcnJheS5mcm9tKG4pLmxlbmd0aD4wLGNvbm5lY3RlZDpzfX1hc3luYyBnZXRYZmVyU3RhdGUoKXtsZXR7dXBsb2FkczplLGRvd25sb2Fkczp0fT10aGlzLnN0b3JlLHI9YXdhaXQgZS5jb3VudCgpO3JldHVybntudW1Eb3dubG9hZHM6YXdhaXQgdC5jb3VudCgpLG51bVVwbG9hZHM6cixwcm9ncmVzczp0aGlzLmxhc3RQcm9ncmVzc319YXBwbHk9KGUsdCk9PntGKCJhcHBseSBraWNrIix7bjplLmxlbmd0aH0pO2xldCByPXRoaXMuc3RhdGUuYXBwbHkoQW8oZSkpO3JldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0FwcGx5KGUsdCxyKSl9O2FzeW5jIGRvQXBwbHkoZSx0PXtlbnF1ZXVlVXBsb2FkOiEwLHRyaWdnZXJVcGxvYWQ6ITB9LHIpe2xldCBuPVtdLHM9W107Zm9yKGxldHtoZWFkOm8sYm9keTphfW9mIGUpe2xldCBjPW5ldyBxO2Mud3JpdGVTdHJ1Y3QocGUsbyk7bGV0IHU9Yy5yZXN1bHQoKSxsPWF3YWl0IHRoaXMuY3J5cHRvLmJsYWtlMyh1KSxmPXtlaWQ6by5laWQsYm9keTphLGFwbGQ6bnR9O2lmKG8ub2ZmIT09MClmLm9mZj1vLm9mZjtpZihvLmN0ciE9PTApZi5jdHI9by5jdHI7aWYoby50eXApZi50eXA9by50eXA7bi5wdXNoKGwpLHMucHVzaCh7a2V5OmwsZGF0YTpmfSl9RigiZG9BcHBseSBhcmNoaXZlIHN0YXJ0IiksYXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5hZGQocyksRigiZG9BcHBseSBhcmNoaXZlIGRvbmUiKSxhd2FpdCBJcyh0aGlzLnN0b3JlLG4sdGhpcy5jcnlwdG8pLEYoImRvQXBwbHkgYXdhaXQgcGVyc2lzdCIpO2xldCBpPWF3YWl0IHI7aWYoRigiZG9BcHBseSBwZXJzaXN0IGRvbmUiKSxhd2FpdCB0aGlzLm1hcmtBcHBseVN0YXRzKG4saSksdC5lbnF1ZXVlVXBsb2FkKXtsZXQgbz1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErKyl7bGV0IGM9aVthXTtpZihjPT09MHx8Yz09PTE1KW8ucHVzaChuW2FdKX1pZihvLmxlbmd0aD4wKXtsZXQgYT1hd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKTtmb3IobGV0IGMgb2YgYSlhd2FpdCB0aGlzLnN0b3JlLnVwbG9hZHMuZW5xKGMubGFiZWwsbyk7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfX1pZih0LnRyaWdnZXJVcGxvYWQpdGhpcy5zY2hlZHVsZVN5bmMoKTtyZXR1cm4gaX1lbnF1ZXVlQXBwbHlKb2IoZSl7bGV0IHQ9dGhpcy5hcHBseUNoYWluLnRoZW4oZSxlKTtyZXR1cm4gdGhpcy5hcHBseUNoYWluPXQudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSx0fWRyYWluQXBwbHlRdWV1ZSgpe3JldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0RyYWluQXBwbHlRdWV1ZSgpKX1hc3luYyBkb0RyYWluQXBwbHlRdWV1ZSgpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdCh7YXBsZDpudH0pO2lmKGUubGVuZ3RoPDEpcmV0dXJuW107bGV0IHQ9dHQoZSwocik9PnIuaGVhZCk7cmV0dXJuIHRoaXMuYXBwbHlTdG9yZWQodCl9YXBwbHlIYXNoZXM9KGUpPT50aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0FwcGx5SGFzaGVzKGUpKTthc3luYyBkb0FwcGx5SGFzaGVzKGUpe2xldCB0PVtdO2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmdldChzKTtpZihpKXQucHVzaChpKX1sZXQgcj1hd2FpdCB0aGlzLmFwcGx5U3RvcmVkKHQpLG49bmV3IE1hcDtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyluLnNldChSKHRbc10uaGFzaCkscltzXT8/MTIpO3JldHVybiBlLm1hcCgocyk9Pm4uZ2V0KFIocykpPz8xMyl9YXN5bmMgYXBwbHlTdG9yZWQoZSl7aWYoZS5sZW5ndGg8MSlyZXR1cm5bXTtsZXQgdD1lLm1hcCgobik9Pih7Li4ubi5oZWFkLGJvZDpuLmJvZHl9KSkscj1hd2FpdCB0aGlzLnN0YXRlLmFwcGx5KHQpO3JldHVybiBhd2FpdCB0aGlzLm1hcmtBcHBseVN0YXRzKGUubWFwKChuKT0+bi5oYXNoKSxyKSxyfWFzeW5jIG1hcmtBcHBseVN0YXRzKGUsdCl7bGV0IHI9W10sbj1bXTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7bGV0IGk9dFtzXTtpZihpPT09MHx8aT09PTE1KXIucHVzaChlW3NdKTtlbHNlIGlmKGkhPT12b2lkIDAmJmdzKGkpKW4ucHVzaCh7a2V5OmVbc10sZXJyOml9KX1pZihyLmxlbmd0aD4wKWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubWFya0FwcGxpZWQocik7aWYobi5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtGYWlsZWQobil9YXN5bmMgaW5zZXJ0UmF3KGUsdD0iIil7RigiaW5zZXJ0UmF3Iik7bGV0e2Nsb2NrOnIsY3J5cHRvOm59PXRoaXMscz1yLm5vdygpLFtpLG9dPWF3YWl0IGFzKHtub3c6cyxib2Q6ZSx0eXA6dCxjcnlwdG86bn0pO2lmKG8hPT0wKXJldHVybiBkKG8pO2xldCBjPShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDppLGJvZHk6ZX1dKSlbMF07aWYoYyE9PTAmJmMhPT0xNSlyZXR1cm4gZChjPz8xMik7cmV0dXJuIHAoaSl9YXN5bmMgbWFrZVVwZGF0ZShlLHQscj0iIil7bGV0e2Nsb2NrOm4sY3J5cHRvOnN9PXRoaXMsaT1uLm5vdygpO2lmKGUudXBkYXRlZEF0LmdldFRpbWUoKT5pLmdldFRpbWUoKSlyZXR1cm4gZCg0KTtsZXQgbz1lLmN0cisxLFthLGNdPWF3YWl0IF90KHtub3c6aSxlaWQ6ZS5laWQsY3RyOm8sdHlwOnIsYm9kOnQsY3J5cHRvOnN9KTtpZihjIT09MClyZXR1cm4gZChjKTtyZXR1cm4gcCh7aGVhZDphLGJvZHk6dH0pfWFzeW5jIHVwZGF0ZVdpdGhTa2V3KGUsdCxyLG49IiIpe2lmKHI9PT0hMSlyZXR1cm4gZCg0KTtsZXR7Y2xvY2s6cyxjcnlwdG86aX09dGhpcyxvPXMubm93KCksYT1uZXcgTihlLmVpZCksW2MsdV09YS5yZWFkU3RydWN0KHVlKTtpZih1IT09MClyZXR1cm4gZCh1KTtsZXQgbD1lLnVwZGF0ZWRBdC5nZXRUaW1lKCktYy50cy5nZXRUaW1lKCksZj17ZWlkOmUuZWlkLG9mZjpsKzEsY3RyOmUuY3RyKzEsdHlwOiIiLGxlbjowfSx5PShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDpmLGJvZHk6dm9pZCAwfV0pKVswXTtpZih5IT09MCYmeSE9PTE1KXJldHVybiBkKHk/PzEyKTtpZih0PT09dm9pZCAwKXJldHVybiBwKGYpO2xldFtnLG1dPUh0KHtpZDpjLmlkLHRzOm99KTtpZihtIT09MClyZXR1cm4gZChtKTtsZXRbUyxFXT1hd2FpdCBfdCh7bm93Om8sZWlkOmcsY3RyOjAsdHlwOm4sYm9kOnQsY3J5cHRvOml9KTtpZihFIT09MClyZXR1cm4gZChFKTtsZXQgeD0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6Uyxib2R5OnR9XSkpWzBdO2lmKHghPT0wJiZ4IT09MTUpcmV0dXJuIGQoeD8/MTIpO3JldHVybiBwKFMpfWFzeW5jIHVwZGF0ZVJhdyhlLHQscj10aGlzLmZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0LG49IiIpe2lmKEYoInVwZGF0ZVJhdyIpLGUudXBkYXRlZEF0LmdldFRpbWUoKT50aGlzLmNsb2NrLm5vdygpLmdldFRpbWUoKSlyZXR1cm4gdGhpcy51cGRhdGVXaXRoU2tldyhlLHQscixuKTtsZXRbcyxpXT1hd2FpdCB0aGlzLm1ha2VVcGRhdGUoZSx0LG4pO2lmKGkhPT0wKXJldHVybiBkKGkpO2xldCBhPShhd2FpdCB0aGlzLmFwcGx5KFtzXSkpWzBdO2lmKGEhPT0wJiZhIT09MTUpcmV0dXJuIGQoYT8/MTIpO3JldHVybiBwKHMuaGVhZCl9YXN5bmMgaW5zZXJ0KGUpe2xldHtib2R5OnQsdHlwZTpyLHBpZDpuLHRhZ3M6c309ZSxpPXtib2R5OnR9O2lmKG4hPT12b2lkIDApaS5waWQ9bjtpZihzIT09dm9pZCAwKWkudGFncz1zO2xldCBvPU9lKGkpO3JldHVybiB0aGlzLmluc2VydFJhdyhvLHIpfWFzeW5jIHVwZGF0ZShlKXtsZXR7cHJpb3I6dCxib2R5OnIsdHlwZTpuLHBpZDpzLHRhZ3M6aSxmb3JjZTpvfT1lLGE9e2JvZHk6cn07aWYocyE9PXZvaWQgMClhLnBpZD1zO2lmKGkhPT12b2lkIDApYS50YWdzPWk7bGV0IGM9T2UoYSk7cmV0dXJuIHRoaXMudXBkYXRlUmF3KHQsYyxvPz90aGlzLmZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0LG4pfWFzeW5jIGRlbGV0ZShlKXtsZXQgdD1lLmZvcmNlPz8hMDtpZigicHJpb3IiaW4gZSlyZXR1cm4gdGhpcy51cGRhdGVSYXcoZS5wcmlvcix2b2lkIDAsdCk7bGV0W3Isbl09YXdhaXQgdGhpcy5yZXZGcm9tQXJjaGl2ZShlLmVpZCk7aWYobiE9PTApcmV0dXJuIGQobik7cmV0dXJuIHRoaXMudXBkYXRlUmF3KHIsdm9pZCAwLHQpfWFzeW5jIHJldkZyb21BcmNoaXZlKGUpe2xldCB0PWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGFzdChlKTtpZih0KXJldHVybiB1cyh0LmhlYWQpO2xldCByPW5ldyBOKGUpLFtuLHNdPXIucmVhZFN0cnVjdCh1ZSk7aWYocyE9PTApcmV0dXJuIGQocyk7cmV0dXJuIHAoe2VpZDplLGN0cjotMSx1cGRhdGVkQXQ6bi50c30pfWFzeW5jIGdlbkVJRChlKXtsZXR7Y2xvY2s6dCxjcnlwdG86cn09dGhpcyxuPXQubm93KCk7aWYoZSE9PXZvaWQgMClyZXR1cm4gSHQoe2lkOmUsdHM6bn0pO2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCk7cmV0dXJuIEh0KHtpZDpzLHRzOm59KX1zeW5jKCl7cmV0dXJuIHRoaXMuc3luY1J1bnMucnVuKCgpPT50aGlzLmRvU3luYygpKX1hc3luYyBkb1N5bmMoKXtsZXR7Y29ubmVjdGlvbnM6ZSxjcnlwdG86dCxzdG9yZTpyfT10aGlzLG49YXdhaXQgci5zZWVkLmxvYWQoKTtpZighbilyZXR1cm4gMjI7YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKTtmb3IobGV0W3MsaV1vZiBlKXtsZXQgbz1hd2FpdCByLmhvc3RzLmdldChzKTtpZighbyljb250aW51ZTtsZXQgYT17Y29ubjppLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6byxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sYz1hd2FpdCBGcihhKTtpZihjIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBlZWs6ICR7Y31gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksYzt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IHU9YXdhaXQgeHMoYSk7aWYodSE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwdXNoOiAke3V9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLHU7dGhpcy54ZmVyU3RhdGUuZW1pdCgpO2xldCBsPWF3YWl0IFdyKGEsYXN5bmMoKT0+e2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCl9KTtpZihsIT09MCYmbCE9PTE1KXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHVsbDogJHtsfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxsO3RoaXMueGZlclN0YXRlLmVtaXQoKX1yZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLDB9YXN5bmMgcmVidWlsZChlKXtpZih0aGlzLnNjaGVkdWxlZFN5bmMuY2FuY2VsKCksYXdhaXQgdGhpcy5zeW5jUnVucy5mbHVzaCgpLGU/LmNoZWNrSG9zdD8/ITApe2xldCByPWF3YWl0IHRoaXMucmVwdWxsKCk7aWYociE9PTApcmV0dXJuIHJ9cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLnJlcGxheSgpKX1hc3luYyBtc2djaGVjaygpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdEtleXMoKTtyZXR1cm4geXQoZSx0aGlzLmNyeXB0byl9bGlzdE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdChlKX1jb3VudE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMuY291bnQoZSl9YXN5bmMgcmVjb25jaWxlKGUsdCl7dGhpcy5zY2hlZHVsZWRTeW5jLmNhbmNlbCgpLGF3YWl0IHRoaXMuc3luY1J1bnMuZmx1c2goKTtsZXR7Y29ubmVjdGlvbnM6cixjcnlwdG86bixzdG9yZTpzfT10aGlzLGk9YXdhaXQgcy5zZWVkLmxvYWQoKTtpZighaSlyZXR1cm4gZCgyMik7bGV0IG89YXdhaXQgcy5ob3N0cy5nZXQoZSk7aWYoIW8pcmV0dXJuIGQoMTMpO2xldCBhPXIuZ2V0KGUpO2lmKCFhfHwhYS5pc0Nvbm5lY3RlZCgpKXtpZihhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QobywhMSwhMSksbz1hd2FpdCBzLmhvc3RzLmdldChlKSwhbylyZXR1cm4gZCgxMyk7YT1yLmdldChlKX1pZighYSlyZXR1cm4gZCgxMik7bGV0IGM9e2Nvbm46YSxzdG9yZTpzLGVuY2xhdmU6aSxjcnlwdG86bixtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sW3UsbF09YXdhaXQgenIoey4uLmMsaG9zdDpvfSx0KTtpZih0aGlzLnhmZXJTdGF0ZS5lbWl0KCksbCE9PTApcmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxkKGwpO2lmKCF1KXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksZCgxMik7aWYodD8uc3luYz09PSExKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSkscCh1KTtsZXQgZj1hd2FpdCB0aGlzLnN5bmMoKTtpZihmIT09MClyZXR1cm4gZChmKTtsZXQgaD1hd2FpdCBzLmhvc3RzLmdldChlKTtpZighaClyZXR1cm4gZCgxMyk7bGV0W3ksZ109YXdhaXQgenIoey4uLmMsaG9zdDpofSx7cHVsbDohMSxwdXNoOiExfSk7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxnIT09MClyZXR1cm4gZChnKTtpZigheSlyZXR1cm4gZCgxMik7cmV0dXJuIHAoeSl9YXN5bmMgcmVwdWxsKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcyxuPWF3YWl0IHIuc2VlZC5sb2FkKCk7aWYoIW4pcmV0dXJuIDIyO2xldCBzPUFycmF5LmZyb20oYXdhaXQgci5ob3N0cy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuIDA7Zm9yKGxldCBpIG9mIHMpe2xldCBvPWUuZ2V0KGkubGFiZWwpO2lmKCFvfHwhby5pc0Nvbm5lY3RlZCgpKWF3YWl0IHRoaXMuY29ubmVjdFRvSG9zdChpLCExLCExKX1mb3IobGV0W2ksb11vZiBlKXtsZXQgYT1hd2FpdCByLmhvc3RzLmdldChpKTtpZighYSljb250aW51ZTtsZXQgYz17Y29ubjpvLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6ey4uLmEsbGFzdFNlcTowfSxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sdT1hd2FpdCBGcihjKTtpZih1IT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHBlZWs6ICR7dX1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksdTt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IGw9YXdhaXQgV3IoYyk7aWYobCE9PTAmJmwhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHB1bGw6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlcGxheSgpe2xldCBlPWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTtpZihlIT09MClyZXR1cm4gZTtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoKSxyPXR0KHQsKGkpPT5pLmhlYWQpLG49ci5sZW5ndGg7aWYobjwxKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMDtsZXQgcz0wO3doaWxlKHM8ci5sZW5ndGgpe2xldCBpPTAsbz0wLGE9cztmb3IobGV0IHU9czt1PHIubGVuZ3RoJiZvPDEwMCYmaTwxMDI0MDA7dSsrKWkrPXJbdV0uaGVhZC5sZW4sbysrLGE9dSsxO2xldCBjPXIuc2xpY2UocyxhKTthd2FpdCB0aGlzLmFwcGx5U3RvcmVkKGMpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiZXhlYyIsZG9uZTphLHRvdGFsOm59KSxzPWF9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHdpcGUoZSl7bGV0IHQ9ZT8ubXNncyE9PSExLHI9ZT8uZW50cyE9PSExLG49ZT8ubWV0YSE9PSExLHM9ZT8uc2VlZD09PSEwO3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e3N0b3JlOml9PXRoaXM7aWYobilhd2FpdCBpLmhvc3RzLndpcGUoKSxhd2FpdCBpLnVwbG9hZHMud2lwZSgpLGF3YWl0IGkuZG93bmxvYWRzLndpcGUoKTtpZih0KWF3YWl0IGkubWVzc2FnZXMud2lwZSgpO2lmKHMpYXdhaXQgaS5zZWVkLndpcGUoKTtpZihyKWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTt0aGlzLmxhc3RQcm9ncmVzcz1Pcix0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSx0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9aW1wb3J0PWFzeW5jKGUsdCk9PntsZXR7Y3J5cHRvOnIsc3RvcmU6bn09dGhpcyxzPXQ/Lm9uUHJvZ3Jlc3MsaT1hd2FpdCBuLnNlZWQubG9hZCgpO2lmKCFpKXJldHVybiAyMjtjb25zb2xlLnRpbWUoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCBvPWF3YWl0IGUuYnl0ZXMoKSxbYSxjXT1hd2FpdCBWdC5kZWNvZGVGaWxlKG8scixpKTtpZihjIT09MClyZXR1cm4gYztjb25zb2xlLnRpbWVFbmQoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCB1PTA7d2hpbGUodTxhLmxlbmd0aCl7bGV0IGw9MCxmPTAsaD11O2ZvcihsZXQgbT11O208YS5sZW5ndGgmJmY8MTAwJiZsPDEwMjQwMDttKyspbCs9YVttXS5oZWFkLmxlbixmKyssaD1tKzE7bGV0IHk9YS5zbGljZSh1LGgpO2NvbnNvbGUudGltZShgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtsZXQgZz1hd2FpdCB0aGlzLmFwcGx5KHkse2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMX0pO2NvbnNvbGUudGltZUVuZChgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtmb3IobGV0IG09MDttPHkubGVuZ3RoO20rKyl7bGV0IFM9Z1ttXTtpZihTIT09MCYmUyE9PTE1KWNvbnNvbGUud2FybihgZmFpbGVkIHRvIGltcG9ydCBtc2cgJHt1K219OiAke0JbU119YCl9aWYocylxdWV1ZU1pY3JvdGFzaygoKT0+cyhoLGEubGVuZ3RoLDApKTt0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImltcG9ydCIsZG9uZTpoLHRvdGFsOmEubGVuZ3RofSksdT1ofXJldHVybiB0aGlzLnNjaGVkdWxlU3luYygpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfTtzY2hlZHVsZVN5bmM9KCk9PntpZih0aGlzLm9uU2NoZWR1bGVTeW5jKXt0aGlzLm9uU2NoZWR1bGVTeW5jKCk7cmV0dXJufXRoaXMuc2NoZWR1bGVkU3luYy5zY2hlZHVsZSgpfTthc3luYyBleHBvcnRCeXRlcygpe2xldHtjcnlwdG86ZSxzdG9yZTp0fT10aGlzLHI9YXdhaXQgdC5zZWVkLmxvYWQoKTtpZighcilyZXR1cm4gZCgyMik7bGV0IG49YXdhaXQgdC5tZXNzYWdlcy5saXN0KCk7cmV0dXJuIFZ0LmVuY29kZUZpbGUoImV4cG9ydCIsMCxuLGUscil9YXN5bmMgZXhwb3J0KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZXhwb3J0Qnl0ZXMoKTtpZihyIT09MClyZXR1cm4gcjtpZighdClyZXR1cm4gMTI7bGV0IG49bmV3IEJsb2IoW3Quc2xpY2UoKV0pO3JldHVybiB5cyhuLGUpLDB9YXN5bmMgbGluayhlLHQ9ITApe2lmKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuYWRkKGUpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLHQpe2xldCByPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuZ2V0KGUubGFiZWwpO2lmKHIpYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KHIpfX1hc3luYyB1bmxpbmsoZSl7YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5kZWwoZSksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgaG9zdHMoKXtyZXR1cm4gQXJyYXkuZnJvbShhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKSl9Y29ubmVjdFRvSG9zdD1hc3luYyhlLHQ9ITAscj0hMCk9PntsZXR7Y2xvY2s6bixjb25uZWN0aW9uczpzLGNyeXB0bzppLHN0b3JlOm8sdHJhbnNwb3J0OmF9PXRoaXMsYz1zLmdldChlLmxhYmVsKTtpZihjKXtpZihjLmlzQ29ubmVjdGVkKCkpcmV0dXJuO3RyeXtjLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9cy5kZWxldGUoZS5sYWJlbCl9bGV0IHU9YXdhaXQgby5zZWVkLmxvYWQoKTtpZighdSlyZXR1cm47Y29uc29sZS5pbmZvKGBDb25uZWN0aW5nIHRvICR7ZS5oYW5kbGV9ICgke2UubGFiZWx9KWApO2xldCBsPW5ldyBPdCh1LGksZSxuLGEoZSksKGYpPT5vLmhvc3RzLnNldChlLmxhYmVsLGYpKTtpZihhd2FpdCBsLnJlZ2lzdGVyKCksdClhd2FpdCBsLmxpc3Rlbihhc3luYyhmKT0+e2xldCBoPXtjb25uOmwsc3RvcmU6byxlbmNsYXZlOnUsaG9zdDplLGNyeXB0bzppLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4gQXMoZixoLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYocy5zZXQoZS5sYWJlbCxsKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxyKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jIGNvbm5lY3QoZT0hMCx0PSEwKXtsZXR7Y29ubmVjdFRvSG9zdDpyLHNjaGVkdWxlU3luYzpuLHN0b3JlOnN9PXRoaXM7aWYoIWF3YWl0IHMuc2VlZC5sb2FkKCkpcmV0dXJuO2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCk7bGV0IG89YXdhaXQgcy5ob3N0cy5saXN0KCk7Zm9yKGxldCBhIG9mIG8pYXdhaXQgcihhLGUsITEpO2lmKHQpbigpfWRpc2Nvbm5lY3Q9YXN5bmMoKT0+e2ZvcihsZXQgZSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKXRyeXtlLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9dGhpcy5jb25uZWN0aW9ucy5jbGVhcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpfX12YXIgX2U9dHlwZW9mIGdsb2JhbFRoaXM9PT0ib2JqZWN0IiYmImNyeXB0byJpbiBnbG9iYWxUaGlzP2dsb2JhbFRoaXMuY3J5cHRvOnZvaWQgMDtmdW5jdGlvbiAkdChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24ganIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBlZShlLC4uLnQpe2lmKCFqcihlKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoPjAmJiF0LmluY2x1ZGVzKGUubGVuZ3RoKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCBvZiBsZW5ndGggIit0KyIsIGdvdCBsZW5ndGg9IitlLmxlbmd0aCl9ZnVuY3Rpb24gJHIoZSx0PSEwKXtpZihlLmRlc3Ryb3llZCl0aHJvdyBFcnJvcigiSGFzaCBpbnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQiKTtpZih0JiZlLmZpbmlzaGVkKXRocm93IEVycm9yKCJIYXNoI2RpZ2VzdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIil9ZnVuY3Rpb24gUHMoZSx0KXtlZShlKTtsZXQgcj10Lm91dHB1dExlbjtpZihlLmxlbmd0aDxyKXRocm93IEVycm9yKCJkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAiK3IpfWZ1bmN0aW9uIEdyKGUpe2lmKHR5cGVvZiBlIT09ImJvb2xlYW4iKXRocm93IEVycm9yKGBib29sZWFuIGV4cGVjdGVkLCBub3QgJHtlfWApfS8qISBub2JsZS1jaXBoZXJzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjMgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovdmFyIEFlPShlKT0+bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxNYXRoLmZsb29yKGUuYnl0ZUxlbmd0aC80KSk7dmFyIFBvPW5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMjg3NDU0MDIwXSkuYnVmZmVyKVswXT09PTY4O2lmKCFQbyl0aHJvdyBFcnJvcigiTm9uIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgaXMgbm90IHN1cHBvcnRlZCIpO2Z1bmN0aW9uIFVvKGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyIpdGhyb3cgRXJyb3IoInN0cmluZyBleHBlY3RlZCIpO3JldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSkpfWZ1bmN0aW9uIEd0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpZT1VbyhlKTtlbHNlIGlmKGpyKGUpKWU9UXQoZSk7ZWxzZSB0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCwgZ290ICIrdHlwZW9mIGUpO3JldHVybiBlfWZ1bmN0aW9uIFVzKGUsdCl7aWYodD09bnVsbHx8dHlwZW9mIHQhPT0ib2JqZWN0Iil0aHJvdyBFcnJvcigib3B0aW9ucyBtdXN0IGJlIGRlZmluZWQiKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHQpfWZ1bmN0aW9uIGtzKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXJ8PWVbbl1edFtuXTtyZXR1cm4gcj09PTB9dmFyIEJzPShlLHQpPT57ZnVuY3Rpb24gcihuLC4uLnMpe2lmKGVlKG4pLGUubm9uY2VMZW5ndGghPT12b2lkIDApe2xldCBsPXNbMF07aWYoIWwpdGhyb3cgRXJyb3IoIm5vbmNlIC8gaXYgcmVxdWlyZWQiKTtpZihlLnZhclNpemVOb25jZSllZShsKTtlbHNlIGVlKGwsZS5ub25jZUxlbmd0aCl9bGV0IGk9ZS50YWdMZW5ndGg7aWYoaSYmc1sxXSE9PXZvaWQgMCllZShzWzFdKTtsZXQgbz10KG4sLi4ucyksYT0obCxmKT0+e2lmKGYhPT12b2lkIDApe2lmKGwhPT0yKXRocm93IEVycm9yKCJjaXBoZXIgb3V0cHV0IG5vdCBzdXBwb3J0ZWQiKTtlZShmKX19LGM9ITE7cmV0dXJue2VuY3J5cHQobCxmKXtpZihjKXRocm93IEVycm9yKCJjYW5ub3QgZW5jcnlwdCgpIHR3aWNlIHdpdGggc2FtZSBrZXkgKyBub25jZSIpO3JldHVybiBjPSEwLGVlKGwpLGEoby5lbmNyeXB0Lmxlbmd0aCxmKSxvLmVuY3J5cHQobCxmKX0sZGVjcnlwdChsLGYpe2lmKGVlKGwpLGkmJmwubGVuZ3RoPGkpdGhyb3cgRXJyb3IoImludmFsaWQgY2lwaGVydGV4dCBsZW5ndGg6IHNtYWxsZXIgdGhhbiB0YWdMZW5ndGg9IitpKTtyZXR1cm4gYShvLmRlY3J5cHQubGVuZ3RoLGYpLG8uZGVjcnlwdChsLGYpfX19cmV0dXJuIE9iamVjdC5hc3NpZ24ocixlKSxyfTtmdW5jdGlvbiBRcihlLHQscj0hMCl7aWYodD09PXZvaWQgMClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7aWYodC5sZW5ndGghPT1lKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCBsZW5ndGgsIGV4cGVjdGVkICIrZSsiLCBnb3Q6ICIrdC5sZW5ndGgpO2lmKHImJiFrbyh0KSl0aHJvdyBFcnJvcigiaW52YWxpZCBvdXRwdXQsIG11c3QgYmUgYWxpZ25lZCIpO3JldHVybiB0fWZ1bmN0aW9uIGtvKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShlKX1mdW5jdGlvbiBJZSguLi5lKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLmZpbGwoMCl9ZnVuY3Rpb24gYnQoZT0zMil7aWYoX2UmJnR5cGVvZiBfZS5nZXRSYW5kb21WYWx1ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBfZS5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZSkpO2lmKF9lJiZ0eXBlb2YgX2UucmFuZG9tQnl0ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBfZS5yYW5kb21CeXRlcyhlKTt0aHJvdyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQiKX12YXIgRHM9KGUpPT5VaW50OEFycmF5LmZyb20oZS5zcGxpdCgiIikubWFwKCh0KT0+dC5jaGFyQ29kZUF0KDApKSksQm89RHMoImV4cGFuZCAxNi1ieXRlIGsiKSx2bz1EcygiZXhwYW5kIDMyLWJ5dGUgayIpLERvPUFlKEJvKSxDbz1BZSh2byk7ZnVuY3Rpb24gUChlLHQpe3JldHVybiBlPDx0fGU+Pj4zMi10fWZ1bmN0aW9uIFlyKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9dmFyIFl0PTY0LFRvPTE2LENzPTQyOTQ5NjcyOTUsdnM9bmV3IFVpbnQzMkFycmF5O2Z1bmN0aW9uIEhvKGUsdCxyLG4scyxpLG8sYSl7bGV0IGM9cy5sZW5ndGgsdT1uZXcgVWludDhBcnJheShZdCksbD1BZSh1KSxmPVlyKHMpJiZZcihpKSxoPWY/QWUocyk6dnMseT1mP0FlKGkpOnZzO2ZvcihsZXQgZz0wO2c8YztvKyspe2lmKGUodCxyLG4sbCxvLGEpLG8+PUNzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtsZXQgbT1NYXRoLm1pbihZdCxjLWcpO2lmKGYmJm09PT1ZdCl7bGV0IFM9Zy80O2lmKGclNCE9PTApdGhyb3cgRXJyb3IoImFyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbiIpO2ZvcihsZXQgRT0wLHc7RTxUbztFKyspdz1TK0UseVt3XT1oW3ddXmxbRV07Zys9WXQ7Y29udGludWV9Zm9yKGxldCBTPTAsRTtTPG07UysrKUU9ZytTLGlbRV09c1tFXV51W1NdO2crPW19fWZ1bmN0aW9uIFRzKGUsdCl7bGV0e2FsbG93U2hvcnRLZXlzOnIsZXh0ZW5kTm9uY2VGbjpuLGNvdW50ZXJMZW5ndGg6cyxjb3VudGVyUmlnaHQ6aSxyb3VuZHM6b309VXMoe2FsbG93U2hvcnRLZXlzOiExLGNvdW50ZXJMZW5ndGg6OCxjb3VudGVyUmlnaHQ6ITEscm91bmRzOjIwfSx0KTtpZih0eXBlb2YgZSE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoImNvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuICR0KHMpLCR0KG8pLEdyKGkpLEdyKHIpLChhLGMsdSxsLGY9MCk9PntlZShhKSxlZShjKSxlZSh1KTtsZXQgaD11Lmxlbmd0aDtpZihsPT09dm9pZCAwKWw9bmV3IFVpbnQ4QXJyYXkoaCk7aWYoZWUobCksJHQoZiksZjwwfHxmPj1Dcyl0aHJvdyBFcnJvcigiYXJ4OiBjb3VudGVyIG92ZXJmbG93Iik7aWYobC5sZW5ndGg8aCl0aHJvdyBFcnJvcihgYXJ4OiBvdXRwdXQgKCR7bC5sZW5ndGh9KSBpcyBzaG9ydGVyIHRoYW4gZGF0YSAoJHtofSlgKTtsZXQgeT1bXSxnPWEubGVuZ3RoLG0sUztpZihnPT09MzIpeS5wdXNoKG09UXQoYSkpLFM9Q287ZWxzZSBpZihnPT09MTYmJnIpbT1uZXcgVWludDhBcnJheSgzMiksbS5zZXQoYSksbS5zZXQoYSwxNiksUz1Ebyx5LnB1c2gobSk7ZWxzZSB0aHJvdyBFcnJvcihgYXJ4OiBpbnZhbGlkIDMyLWJ5dGUga2V5LCBnb3QgbGVuZ3RoPSR7Z31gKTtpZighWXIoYykpeS5wdXNoKGM9UXQoYykpO2xldCBFPUFlKG0pO2lmKG4pe2lmKGMubGVuZ3RoIT09MjQpdGhyb3cgRXJyb3IoImFyeDogZXh0ZW5kZWQgbm9uY2UgbXVzdCBiZSAyNCBieXRlcyIpO24oUyxFLEFlKGMuc3ViYXJyYXkoMCwxNikpLEUpLGM9Yy5zdWJhcnJheSgxNil9bGV0IHc9MTYtcztpZih3IT09Yy5sZW5ndGgpdGhyb3cgRXJyb3IoYGFyeDogbm9uY2UgbXVzdCBiZSAke3d9IG9yIDE2IGJ5dGVzYCk7aWYodyE9PTEyKXtsZXQgYj1uZXcgVWludDhBcnJheSgxMik7Yi5zZXQoYyxpPzA6MTItYy5sZW5ndGgpLGM9Yix5LnB1c2goYyl9bGV0IHg9QWUoYyk7cmV0dXJuIEhvKGUsUyxFLHgsdSxsLGYsbyksSWUoLi4ueSksbH19dmFyIHJlPShlLHQpPT5lW3QrK10mMjU1fChlW3QrK10mMjU1KTw8ODtjbGFzcyBIc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmJsb2NrTGVuPTE2LHRoaXMub3V0cHV0TGVuPTE2LHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDE2KSx0aGlzLnI9bmV3IFVpbnQxNkFycmF5KDEwKSx0aGlzLmg9bmV3IFVpbnQxNkFycmF5KDEwKSx0aGlzLnBhZD1uZXcgVWludDE2QXJyYXkoOCksdGhpcy5wb3M9MCx0aGlzLmZpbmlzaGVkPSExLGU9R3QoZSksZWUoZSwzMik7bGV0IHQ9cmUoZSwwKSxyPXJlKGUsMiksbj1yZShlLDQpLHM9cmUoZSw2KSxpPXJlKGUsOCksbz1yZShlLDEwKSxhPXJlKGUsMTIpLGM9cmUoZSwxNCk7dGhpcy5yWzBdPXQmODE5MSx0aGlzLnJbMV09KHQ+Pj4xM3xyPDwzKSY4MTkxLHRoaXMuclsyXT0ocj4+PjEwfG48PDYpJjc5MzksdGhpcy5yWzNdPShuPj4+N3xzPDw5KSY4MTkxLHRoaXMucls0XT0ocz4+PjR8aTw8MTIpJjI1NSx0aGlzLnJbNV09aT4+PjEmODE5MCx0aGlzLnJbNl09KGk+Pj4xNHxvPDwyKSY4MTkxLHRoaXMucls3XT0obz4+PjExfGE8PDUpJjgwNjUsdGhpcy5yWzhdPShhPj4+OHxjPDw4KSY4MTkxLHRoaXMucls5XT1jPj4+NSYxMjc7Zm9yKGxldCB1PTA7dTw4O3UrKyl0aGlzLnBhZFt1XT1yZShlLDE2KzIqdSl9cHJvY2VzcyhlLHQscj0hMSl7bGV0IG49cj8wOjIwNDgse2g6cyxyOml9PXRoaXMsbz1pWzBdLGE9aVsxXSxjPWlbMl0sdT1pWzNdLGw9aVs0XSxmPWlbNV0saD1pWzZdLHk9aVs3XSxnPWlbOF0sbT1pWzldLFM9cmUoZSx0KzApLEU9cmUoZSx0KzIpLHc9cmUoZSx0KzQpLHg9cmUoZSx0KzYpLGI9cmUoZSx0KzgpLEE9cmUoZSx0KzEwKSxEPXJlKGUsdCsxMiksVD1yZShlLHQrMTQpLEg9c1swXSsoUyY4MTkxKSxVPXNbMV0rKChTPj4+MTN8RTw8MykmODE5MSksTz1zWzJdKygoRT4+PjEwfHc8PDYpJjgxOTEpLEs9c1szXSsoKHc+Pj43fHg8PDkpJjgxOTEpLF89c1s0XSsoKHg+Pj40fGI8PDEyKSY4MTkxKSxJPXNbNV0rKGI+Pj4xJjgxOTEpLHY9c1s2XSsoKGI+Pj4xNHxBPDwyKSY4MTkxKSxDPXNbN10rKChBPj4+MTF8RDw8NSkmODE5MSksTD1zWzhdKygoRD4+Pjh8VDw8OCkmODE5MSksTT1zWzldKyhUPj4+NXxuKSxrPTAsaj1rK0gqbytVKig1Km0pK08qKDUqZykrSyooNSp5KStfKig1KmgpO2s9aj4+PjEzLGomPTgxOTEsais9SSooNSpmKSt2Kig1KmwpK0MqKDUqdSkrTCooNSpjKStNKig1KmEpLGsrPWo+Pj4xMyxqJj04MTkxO2xldCBaPWsrSCphK1UqbytPKig1Km0pK0sqKDUqZykrXyooNSp5KTtrPVo+Pj4xMyxaJj04MTkxLForPUkqKDUqaCkrdiooNSpmKStDKig1KmwpK0wqKDUqdSkrTSooNSpjKSxrKz1aPj4+MTMsWiY9ODE5MTtsZXQgWD1rK0gqYytVKmErTypvK0sqKDUqbSkrXyooNSpnKTtrPVg+Pj4xMyxYJj04MTkxLFgrPUkqKDUqeSkrdiooNSpoKStDKig1KmYpK0wqKDUqbCkrTSooNSp1KSxrKz1YPj4+MTMsWCY9ODE5MTtsZXQgVj1rK0gqdStVKmMrTyphK0sqbytfKig1Km0pO2s9Vj4+PjEzLFYmPTgxOTEsVis9SSooNSpnKSt2Kig1KnkpK0MqKDUqaCkrTCooNSpmKStNKig1KmwpLGsrPVY+Pj4xMyxWJj04MTkxO2xldCB6PWsrSCpsK1UqdStPKmMrSyphK18qbztrPXo+Pj4xMyx6Jj04MTkxLHorPUkqKDUqbSkrdiooNSpnKStDKig1KnkpK0wqKDUqaCkrTSooNSpmKSxrKz16Pj4+MTMseiY9ODE5MTtsZXQgZGU9aytIKmYrVSpsK08qdStLKmMrXyphO2s9ZGU+Pj4xMyxkZSY9ODE5MSxkZSs9SSpvK3YqKDUqbSkrQyooNSpnKStMKig1KnkpK00qKDUqaCksays9ZGU+Pj4xMyxkZSY9ODE5MTtsZXQgZmU9aytIKmgrVSpmK08qbCtLKnUrXypjO2s9ZmU+Pj4xMyxmZSY9ODE5MSxmZSs9SSphK3YqbytDKig1Km0pK0wqKDUqZykrTSooNSp5KSxrKz1mZT4+PjEzLGZlJj04MTkxO2xldCBqZT1rK0gqeStVKmgrTypmK0sqbCtfKnU7az1qZT4+PjEzLGplJj04MTkxLGplKz1JKmMrdiphK0MqbytMKig1Km0pK00qKDUqZyksays9amU+Pj4xMyxqZSY9ODE5MTtsZXQgJGU9aytIKmcrVSp5K08qaCtLKmYrXypsO2s9JGU+Pj4xMywkZSY9ODE5MSwkZSs9SSp1K3YqYytDKmErTCpvK00qKDUqbSksays9JGU+Pj4xMywkZSY9ODE5MTtsZXQgR2U9aytIKm0rVSpnK08qeStLKmgrXypmO2s9R2U+Pj4xMyxHZSY9ODE5MSxHZSs9SSpsK3YqdStDKmMrTCphK00qbyxrKz1HZT4+PjEzLEdlJj04MTkxLGs9KGs8PDIpK2t8MCxrPWsranwwLGo9ayY4MTkxLGs9az4+PjEzLForPWssc1swXT1qLHNbMV09WixzWzJdPVgsc1szXT1WLHNbNF09eixzWzVdPWRlLHNbNl09ZmUsc1s3XT1qZSxzWzhdPSRlLHNbOV09R2V9ZmluYWxpemUoKXtsZXR7aDplLHBhZDp0fT10aGlzLHI9bmV3IFVpbnQxNkFycmF5KDEwKSxuPWVbMV0+Pj4xMztlWzFdJj04MTkxO2ZvcihsZXQgbz0yO288MTA7bysrKWVbb10rPW4sbj1lW29dPj4+MTMsZVtvXSY9ODE5MTtlWzBdKz1uKjUsbj1lWzBdPj4+MTMsZVswXSY9ODE5MSxlWzFdKz1uLG49ZVsxXT4+PjEzLGVbMV0mPTgxOTEsZVsyXSs9bixyWzBdPWVbMF0rNSxuPXJbMF0+Pj4xMyxyWzBdJj04MTkxO2ZvcihsZXQgbz0xO288MTA7bysrKXJbb109ZVtvXStuLG49cltvXT4+PjEzLHJbb10mPTgxOTE7cls5XS09ODE5MjtsZXQgcz0obl4xKS0xO2ZvcihsZXQgbz0wO288MTA7bysrKXJbb10mPXM7cz1+cztmb3IobGV0IG89MDtvPDEwO28rKyllW29dPWVbb10mc3xyW29dO2VbMF09KGVbMF18ZVsxXTw8MTMpJjY1NTM1LGVbMV09KGVbMV0+Pj4zfGVbMl08PDEwKSY2NTUzNSxlWzJdPShlWzJdPj4+NnxlWzNdPDw3KSY2NTUzNSxlWzNdPShlWzNdPj4+OXxlWzRdPDw0KSY2NTUzNSxlWzRdPShlWzRdPj4+MTJ8ZVs1XTw8MXxlWzZdPDwxNCkmNjU1MzUsZVs1XT0oZVs2XT4+PjJ8ZVs3XTw8MTEpJjY1NTM1LGVbNl09KGVbN10+Pj41fGVbOF08PDgpJjY1NTM1LGVbN109KGVbOF0+Pj44fGVbOV08PDUpJjY1NTM1O2xldCBpPWVbMF0rdFswXTtlWzBdPWkmNjU1MzU7Zm9yKGxldCBvPTE7bzw4O28rKylpPShlW29dK3Rbb118MCkrKGk+Pj4xNil8MCxlW29dPWkmNjU1MzU7SWUocil9dXBkYXRlKGUpeyRyKHRoaXMpO2xldHtidWZmZXI6dCxibG9ja0xlbjpyfT10aGlzO2U9R3QoZSk7bGV0IG49ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxuOyl7bGV0IGk9TWF0aC5taW4oci10aGlzLnBvcyxuLXMpO2lmKGk9PT1yKXtmb3IoO3I8PW4tcztzKz1yKXRoaXMucHJvY2VzcyhlLHMpO2NvbnRpbnVlfWlmKHQuc2V0KGUuc3ViYXJyYXkocyxzK2kpLHRoaXMucG9zKSx0aGlzLnBvcys9aSxzKz1pLHRoaXMucG9zPT09cil0aGlzLnByb2Nlc3ModCwwLCExKSx0aGlzLnBvcz0wfXJldHVybiB0aGlzfWRlc3Ryb3koKXtJZSh0aGlzLmgsdGhpcy5yLHRoaXMuYnVmZmVyLHRoaXMucGFkKX1kaWdlc3RJbnRvKGUpeyRyKHRoaXMpLFBzKGUsdGhpcyksdGhpcy5maW5pc2hlZD0hMDtsZXR7YnVmZmVyOnQsaDpyfT10aGlzLHtwb3M6bn09dGhpcztpZihuKXt0W24rK109MTtmb3IoO248MTY7bisrKXRbbl09MDt0aGlzLnByb2Nlc3ModCwwLCEwKX10aGlzLmZpbmFsaXplKCk7bGV0IHM9MDtmb3IobGV0IGk9MDtpPDg7aSsrKWVbcysrXT1yW2ldPj4+MCxlW3MrK109cltpXT4+Pjg7cmV0dXJuIGV9ZGlnZXN0KCl7bGV0e2J1ZmZlcjplLG91dHB1dExlbjp0fT10aGlzO3RoaXMuZGlnZXN0SW50byhlKTtsZXQgcj1lLnNsaWNlKDAsdCk7cmV0dXJuIHRoaXMuZGVzdHJveSgpLHJ9fWZ1bmN0aW9uIE1vKGUpe2xldCB0PShuLHMpPT5lKHMpLnVwZGF0ZShHdChuKSkuZGlnZXN0KCkscj1lKG5ldyBVaW50OEFycmF5KDMyKSk7cmV0dXJuIHQub3V0cHV0TGVuPXIub3V0cHV0TGVuLHQuYmxvY2tMZW49ci5ibG9ja0xlbix0LmNyZWF0ZT0obik9PmUobiksdH12YXIgSnI9TW8oKGUpPT5uZXcgSHMoZSkpO2Z1bmN0aW9uIFJvKGUsdCxyLG4scyxpPTIwKXtsZXQgbz1lWzBdLGE9dFswXSxjPXRbMV0sdT10WzJdLGw9dFszXSxmPWVbMV0saD1yWzBdLHk9clsxXSxnPXMsbT0wLFM9ZVsyXSxFPXRbNF0sdz10WzVdLHg9dFs2XSxiPXRbN10sQT1lWzNdLEQ9byxUPWEsSD1jLFU9dSxPPWwsSz1mLF89aCxJPXksdj1nLEM9bSxMPVMsTT1FLGs9dyxqPXgsWj1iLFg9QTtmb3IobGV0IHo9MDt6PGk7eis9MilPXj1QKEQra3wwLDcpLHZePVAoTytEfDAsOSksa149UCh2K098MCwxMyksRF49UChrK3Z8MCwxOCksQ149UChLK1R8MCw3KSxqXj1QKEMrS3wwLDkpLFRePVAoaitDfDAsMTMpLEtePVAoVCtqfDAsMTgpLFpePVAoTCtffDAsNyksSF49UChaK0x8MCw5KSxfXj1QKEgrWnwwLDEzKSxMXj1QKF8rSHwwLDE4KSxVXj1QKFgrTXwwLDcpLElePVAoVStYfDAsOSksTV49UChJK1V8MCwxMyksWF49UChNK0l8MCwxOCksVF49UChEK1V8MCw3KSxIXj1QKFQrRHwwLDkpLFVePVAoSCtUfDAsMTMpLERePVAoVStIfDAsMTgpLF9ePVAoSytPfDAsNyksSV49UChfK0t8MCw5KSxPXj1QKEkrX3wwLDEzKSxLXj1QKE8rSXwwLDE4KSxNXj1QKEwrQ3wwLDcpLHZePVAoTStMfDAsOSksQ149UCh2K018MCwxMyksTF49UChDK3Z8MCwxOCksa149UChYK1p8MCw3KSxqXj1QKGsrWHwwLDkpLFpePVAoaitrfDAsMTMpLFhePVAoWitqfDAsMTgpO2xldCBWPTA7bltWKytdPW8rRHwwLG5bVisrXT1hK1R8MCxuW1YrK109YytIfDAsbltWKytdPXUrVXwwLG5bVisrXT1sK098MCxuW1YrK109ZitLfDAsbltWKytdPWgrX3wwLG5bVisrXT15K0l8MCxuW1YrK109Zyt2fDAsbltWKytdPW0rQ3wwLG5bVisrXT1TK0x8MCxuW1YrK109RStNfDAsbltWKytdPXcra3wwLG5bVisrXT14K2p8MCxuW1YrK109YitafDAsbltWKytdPUErWHwwfWZ1bmN0aW9uIExvKGUsdCxyLG4pe2xldCBzPWVbMF0saT10WzBdLG89dFsxXSxhPXRbMl0sYz10WzNdLHU9ZVsxXSxsPXJbMF0sZj1yWzFdLGg9clsyXSx5PXJbM10sZz1lWzJdLG09dFs0XSxTPXRbNV0sRT10WzZdLHc9dFs3XSx4PWVbM107Zm9yKGxldCBBPTA7QTwyMDtBKz0yKWNePVAocytTfDAsNyksaF49UChjK3N8MCw5KSxTXj1QKGgrY3wwLDEzKSxzXj1QKFMraHwwLDE4KSx5Xj1QKHUraXwwLDcpLEVePVAoeSt1fDAsOSksaV49UChFK3l8MCwxMyksdV49UChpK0V8MCwxOCksd149UChnK2x8MCw3KSxvXj1QKHcrZ3wwLDkpLGxePVAobyt3fDAsMTMpLGdePVAobCtvfDAsMTgpLGFePVAoeCttfDAsNyksZl49UChhK3h8MCw5KSxtXj1QKGYrYXwwLDEzKSx4Xj1QKG0rZnwwLDE4KSxpXj1QKHMrYXwwLDcpLG9ePVAoaStzfDAsOSksYV49UChvK2l8MCwxMyksc149UChhK298MCwxOCksbF49UCh1K2N8MCw3KSxmXj1QKGwrdXwwLDkpLGNePVAoZitsfDAsMTMpLHVePVAoYytmfDAsMTgpLG1ePVAoZyt5fDAsNyksaF49UChtK2d8MCw5KSx5Xj1QKGgrbXwwLDEzKSxnXj1QKHkraHwwLDE4KSxTXj1QKHgrd3wwLDcpLEVePVAoUyt4fDAsOSksd149UChFK1N8MCwxMykseF49UCh3K0V8MCwxOCk7bGV0IGI9MDtuW2IrK109cyxuW2IrK109dSxuW2IrK109ZyxuW2IrK109eCxuW2IrK109bCxuW2IrK109ZixuW2IrK109aCxuW2IrK109eX12YXIgWnI9VHMoUm8se2NvdW50ZXJSaWdodDohMCxleHRlbmROb25jZUZuOkxvfSksZW49QnMoe2Jsb2NrU2l6ZTo2NCxub25jZUxlbmd0aDoyNCx0YWdMZW5ndGg6MTZ9LChlLHQpPT4oe2VuY3J5cHQocixuKXtuPVFyKHIubGVuZ3RoKzMyLG4sITEpO2xldCBzPW4uc3ViYXJyYXkoMCwzMiksaT1uLnN1YmFycmF5KDMyKTtuLnNldChyLDMyKSxJZShzKSxacihlLHQsbixuKTtsZXQgbz1KcihpLHMpO3JldHVybiBuLnNldChvLDE2KSxJZShuLnN1YmFycmF5KDAsMTYpLG8pLG4uc3ViYXJyYXkoMTYpfSxkZWNyeXB0KHIsbil7ZWUociksbj1RcihyLmxlbmd0aCszMixuLCExKTtsZXQgcz1uLnN1YmFycmF5KDAsMzIpLGk9bi5zdWJhcnJheSgzMiw0OCksbz1uLnN1YmFycmF5KDQ4KTtuLnNldChyLDMyKSxJZShzKTtsZXQgYT1acihlLHQscyxzKSxjPUpyKG8sYSk7aWYoIWtzKGksYykpdGhyb3cgRXJyb3IoImludmFsaWQgdGFnIik7cmV0dXJuIFpyKGUsdCxuLnN1YmFycmF5KDE2KSxuLnN1YmFycmF5KDE2KSksSWUocyxpLGMpLG99fSkpOy8qISBub2JsZS1oYXNoZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9mdW5jdGlvbiBPbyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fEFycmF5QnVmZmVyLmlzVmlldyhlKSYmZS5jb25zdHJ1Y3Rvci5uYW1lPT09IlVpbnQ4QXJyYXkifWZ1bmN0aW9uIHd0KGUpe2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihlKXx8ZTwwKXRocm93IEVycm9yKCJwb3NpdGl2ZSBpbnRlZ2VyIGV4cGVjdGVkLCBnb3QgIitlKX1mdW5jdGlvbiBOZShlLC4uLnQpe2lmKCFPbyhlKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoPjAmJiF0LmluY2x1ZGVzKGUubGVuZ3RoKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCBvZiBsZW5ndGggIit0KyIsIGdvdCBsZW5ndGg9IitlLmxlbmd0aCl9ZnVuY3Rpb24gSXQoZSx0PSEwKXtpZihlLmRlc3Ryb3llZCl0aHJvdyBFcnJvcigiSGFzaCBpbnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQiKTtpZih0JiZlLmZpbmlzaGVkKXRocm93IEVycm9yKCJIYXNoI2RpZ2VzdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIil9ZnVuY3Rpb24gSnQoZSx0KXtOZShlKTtsZXQgcj10Lm91dHB1dExlbjtpZihlLmxlbmd0aDxyKXRocm93IEVycm9yKCJkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAiK3IpfWZ1bmN0aW9uIE1zKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gbmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxNYXRoLmZsb29yKGUuYnl0ZUxlbmd0aC80KSl9ZnVuY3Rpb24gaXQoLi4uZSl7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5maWxsKDApfWZ1bmN0aW9uIHh0KGUsdCl7cmV0dXJuIGU8PDMyLXR8ZT4+PnR9dmFyIFJzPSgoKT0+bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KFsyODc0NTQwMjBdKS5idWZmZXIpWzBdPT09NjgpKCk7ZnVuY3Rpb24gTHMoZSl7cmV0dXJuIGU8PDI0JjQyNzgxOTAwODB8ZTw8OCYxNjcxMTY4MHxlPj4+OCY2NTI4MHxlPj4+MjQmMjU1fXZhciBPcz1Scz8oZSk9PmU6KGUpPT5McyhlKTtmdW5jdGlvbiBLbyhlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdPUxzKGVbdF0pO3JldHVybiBlfXZhciBpZT1Scz8oZSk9PmU6S287ZnVuY3Rpb24gVm8oZSl7aWYodHlwZW9mIGUhPT0ic3RyaW5nIil0aHJvdyBFcnJvcigic3RyaW5nIGV4cGVjdGVkIik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSl9ZnVuY3Rpb24gb3QoZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIillPVZvKGUpO3JldHVybiBOZShlKSxlfWNsYXNzIHRue31mdW5jdGlvbiBLcyhlKXtsZXQgdD0obixzKT0+ZShzKS51cGRhdGUob3QobikpLmRpZ2VzdCgpLHI9ZSh7fSk7cmV0dXJuIHQub3V0cHV0TGVuPXIub3V0cHV0TGVuLHQuYmxvY2tMZW49ci5ibG9ja0xlbix0LmNyZWF0ZT0obik9PmUobiksdH12YXIgVnM9VWludDMyQXJyYXkuZnJvbShbMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdKTt2YXIgWnQ9QmlnSW50KDQyOTQ5NjcyOTUpLF9zPUJpZ0ludCgzMik7ZnVuY3Rpb24gcm4oZSx0PSExKXtpZih0KXJldHVybntoOk51bWJlcihlJlp0KSxsOk51bWJlcihlPj5fcyZadCl9O3JldHVybntoOk51bWJlcihlPj5fcyZadCl8MCxsOk51bWJlcihlJlp0KXwwfX1mdW5jdGlvbiBQZShlLHQscixuLHMpe3JldHVybiBlPWUrdCtzfDAsbj14dChuXmUsMTYpLHI9citufDAsdD14dCh0XnIsMTIpLHthOmUsYjp0LGM6cixkOm59fWZ1bmN0aW9uIFVlKGUsdCxyLG4scyl7cmV0dXJuIGU9ZSt0K3N8MCxuPXh0KG5eZSw4KSxyPXIrbnwwLHQ9eHQodF5yLDcpLHthOmUsYjp0LGM6cixkOm59fWNsYXNzIG5uIGV4dGVuZHMgdG57Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5sZW5ndGg9MCx0aGlzLnBvcz0wLHd0KGUpLHd0KHQpLHRoaXMuYmxvY2tMZW49ZSx0aGlzLm91dHB1dExlbj10LHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KGUpLHRoaXMuYnVmZmVyMzI9c3QodGhpcy5idWZmZXIpfXVwZGF0ZShlKXtJdCh0aGlzKSxlPW90KGUpLE5lKGUpO2xldHtibG9ja0xlbjp0LGJ1ZmZlcjpyLGJ1ZmZlcjMyOm59PXRoaXMscz1lLmxlbmd0aCxpPWUuYnl0ZU9mZnNldCxvPWUuYnVmZmVyO2ZvcihsZXQgYT0wO2E8czspe2lmKHRoaXMucG9zPT09dClpZShuKSx0aGlzLmNvbXByZXNzKG4sMCwhMSksaWUobiksdGhpcy5wb3M9MDtsZXQgYz1NYXRoLm1pbih0LXRoaXMucG9zLHMtYSksdT1pK2E7aWYoYz09PXQmJiEodSU0KSYmYStjPHMpe2xldCBsPW5ldyBVaW50MzJBcnJheShvLHUsTWF0aC5mbG9vcigocy1hKS80KSk7aWUobCk7Zm9yKGxldCBmPTA7YSt0PHM7Zis9bi5sZW5ndGgsYSs9dCl0aGlzLmxlbmd0aCs9dCx0aGlzLmNvbXByZXNzKGwsZiwhMSk7aWUobCk7Y29udGludWV9ci5zZXQoZS5zdWJhcnJheShhLGErYyksdGhpcy5wb3MpLHRoaXMucG9zKz1jLHRoaXMubGVuZ3RoKz1jLGErPWN9cmV0dXJuIHRoaXN9ZGlnZXN0SW50byhlKXtJdCh0aGlzKSxKdChlLHRoaXMpO2xldHtwb3M6dCxidWZmZXIzMjpyfT10aGlzO3RoaXMuZmluaXNoZWQ9ITAsaXQodGhpcy5idWZmZXIuc3ViYXJyYXkodCkpLGllKHIpLHRoaXMuY29tcHJlc3MociwwLCEwKSxpZShyKTtsZXQgbj1zdChlKTt0aGlzLmdldCgpLmZvckVhY2goKHMsaSk9Pm5baV09T3MocykpfWRpZ2VzdCgpe2xldHtidWZmZXI6ZSxvdXRwdXRMZW46dH09dGhpczt0aGlzLmRpZ2VzdEludG8oZSk7bGV0IHI9ZS5zbGljZSgwLHQpO3JldHVybiB0aGlzLmRlc3Ryb3koKSxyfV9jbG9uZUludG8oZSl7bGV0e2J1ZmZlcjp0LGxlbmd0aDpyLGZpbmlzaGVkOm4sZGVzdHJveWVkOnMsb3V0cHV0TGVuOmkscG9zOm99PXRoaXM7cmV0dXJuIGV8fChlPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtka0xlbjppfSkpLGUuc2V0KC4uLnRoaXMuZ2V0KCkpLGUuYnVmZmVyLnNldCh0KSxlLmRlc3Ryb3llZD1zLGUuZmluaXNoZWQ9bixlLmxlbmd0aD1yLGUucG9zPW8sZS5vdXRwdXRMZW49aSxlfWNsb25lKCl7cmV0dXJuIHRoaXMuX2Nsb25lSW50bygpfX1mdW5jdGlvbiBzbihlLHQscixuLHMsaSxvLGEsYyx1LGwsZixoLHksZyxtLFMsRSx3LHgpe2xldCBiPTA7Zm9yKGxldCBBPTA7QTxuO0ErKykoe2E6cyxiOmMsYzpoLGQ6U309UGUocyxjLGgsUyxyW3QrZVtiKytdXSkpLHthOnMsYjpjLGM6aCxkOlN9PVVlKHMsYyxoLFMsclt0K2VbYisrXV0pLHthOmksYjp1LGM6eSxkOkV9PVBlKGksdSx5LEUsclt0K2VbYisrXV0pLHthOmksYjp1LGM6eSxkOkV9PVVlKGksdSx5LEUsclt0K2VbYisrXV0pLHthOm8sYjpsLGM6ZyxkOnd9PVBlKG8sbCxnLHcsclt0K2VbYisrXV0pLHthOm8sYjpsLGM6ZyxkOnd9PVVlKG8sbCxnLHcsclt0K2VbYisrXV0pLHthLGI6ZixjOm0sZDp4fT1QZShhLGYsbSx4LHJbdCtlW2IrK11dKSx7YSxiOmYsYzptLGQ6eH09VWUoYSxmLG0seCxyW3QrZVtiKytdXSkse2E6cyxiOnUsYzpnLGQ6eH09UGUocyx1LGcseCxyW3QrZVtiKytdXSkse2E6cyxiOnUsYzpnLGQ6eH09VWUocyx1LGcseCxyW3QrZVtiKytdXSkse2E6aSxiOmwsYzptLGQ6U309UGUoaSxsLG0sUyxyW3QrZVtiKytdXSkse2E6aSxiOmwsYzptLGQ6U309VWUoaSxsLG0sUyxyW3QrZVtiKytdXSkse2E6byxiOmYsYzpoLGQ6RX09UGUobyxmLGgsRSxyW3QrZVtiKytdXSkse2E6byxiOmYsYzpoLGQ6RX09VWUobyxmLGgsRSxyW3QrZVtiKytdXSkse2EsYjpjLGM6eSxkOnd9PVBlKGEsYyx5LHcsclt0K2VbYisrXV0pLHthLGI6YyxjOnksZDp3fT1VZShhLGMseSx3LHJbdCtlW2IrK11dKTtyZXR1cm57djA6cyx2MTppLHYyOm8sdjM6YSx2NDpjLHY1OnUsdjY6bCx2NzpmLHY4Omgsdjk6eSx2MTA6Zyx2MTE6bSx2MTI6Uyx2MTM6RSx2MTQ6dyx2MTU6eH19dmFyIHhlPXtDSFVOS19TVEFSVDoxLENIVU5LX0VORDoyLFBBUkVOVDo0LFJPT1Q6OCxLRVlFRF9IQVNIOjE2LERFUklWRV9LRVlfQ09OVEVYVDozMixERVJJVkVfS0VZX01BVEVSSUFMOjY0fSxrZT1Wcy5zbGljZSgpLE5zPSgoKT0+e2xldCBlPUFycmF5LmZyb20oe2xlbmd0aDoxNn0sKG4scyk9PnMpLHQ9KG4pPT5bMiw2LDMsMTAsNywwLDQsMTMsMSwxMSwxMiw1LDksMTQsMTUsOF0ubWFwKChzKT0+bltzXSkscj1bXTtmb3IobGV0IG49MCxzPWU7bjw3O24rKyxzPXQocykpci5wdXNoKC4uLnMpO3JldHVybiBVaW50OEFycmF5LmZyb20ocil9KSgpO2NsYXNzIG9uIGV4dGVuZHMgbm57Y29uc3RydWN0b3IoZT17fSx0PTApe3N1cGVyKDY0LGUuZGtMZW49PT12b2lkIDA/MzI6ZS5ka0xlbik7dGhpcy5jaHVua1Bvcz0wLHRoaXMuY2h1bmtzRG9uZT0wLHRoaXMuZmxhZ3M9MCx0aGlzLnN0YWNrPVtdLHRoaXMucG9zT3V0PTAsdGhpcy5idWZmZXJPdXQzMj1uZXcgVWludDMyQXJyYXkoMTYpLHRoaXMuY2h1bmtPdXQ9MCx0aGlzLmVuYWJsZVhPRj0hMDtsZXR7a2V5OnIsY29udGV4dDpufT1lLHM9biE9PXZvaWQgMDtpZihyIT09dm9pZCAwKXtpZihzKXRocm93IEVycm9yKCdPbmx5ICJrZXkiIG9yICJjb250ZXh0IiBjYW4gYmUgc3BlY2lmaWVkIGF0IHNhbWUgdGltZScpO2xldCBpPW90KHIpLnNsaWNlKCk7TmUoaSwzMiksdGhpcy5JVj1zdChpKSxpZSh0aGlzLklWKSx0aGlzLmZsYWdzPXR8eGUuS0VZRURfSEFTSH1lbHNlIGlmKHMpe2xldCBpPW90KG4pLG89bmV3IG9uKHtka0xlbjozMn0seGUuREVSSVZFX0tFWV9DT05URVhUKS51cGRhdGUoaSkuZGlnZXN0KCk7dGhpcy5JVj1zdChvKSxpZSh0aGlzLklWKSx0aGlzLmZsYWdzPXR8eGUuREVSSVZFX0tFWV9NQVRFUklBTH1lbHNlIHRoaXMuSVY9a2Uuc2xpY2UoKSx0aGlzLmZsYWdzPXQ7dGhpcy5zdGF0ZT10aGlzLklWLnNsaWNlKCksdGhpcy5idWZmZXJPdXQ9TXModGhpcy5idWZmZXJPdXQzMil9Z2V0KCl7cmV0dXJuW119c2V0KCl7fWIyQ29tcHJlc3MoZSx0LHIsbj0wKXtsZXR7c3RhdGU6cyxwb3M6aX09dGhpcyx7aDpvLGw6YX09cm4oQmlnSW50KGUpLCEwKSx7djA6Yyx2MTp1LHYyOmwsdjM6Zix2NDpoLHY1OnksdjY6Zyx2NzptLHY4OlMsdjk6RSx2MTA6dyx2MTE6eCx2MTI6Yix2MTM6QSx2MTQ6RCx2MTU6VH09c24oTnMsbixyLDcsc1swXSxzWzFdLHNbMl0sc1szXSxzWzRdLHNbNV0sc1s2XSxzWzddLGtlWzBdLGtlWzFdLGtlWzJdLGtlWzNdLG8sYSxpLHQpO3NbMF09Y15TLHNbMV09dV5FLHNbMl09bF53LHNbM109Zl54LHNbNF09aF5iLHNbNV09eV5BLHNbNl09Z15ELHNbN109bV5UfWNvbXByZXNzKGUsdD0wLHI9ITEpe2xldCBuPXRoaXMuZmxhZ3M7aWYoIXRoaXMuY2h1bmtQb3Mpbnw9eGUuQ0hVTktfU1RBUlQ7aWYodGhpcy5jaHVua1Bvcz09PTE1fHxyKW58PXhlLkNIVU5LX0VORDtpZighcil0aGlzLnBvcz10aGlzLmJsb2NrTGVuO2lmKHRoaXMuYjJDb21wcmVzcyh0aGlzLmNodW5rc0RvbmUsbixlLHQpLHRoaXMuY2h1bmtQb3MrPTEsdGhpcy5jaHVua1Bvcz09PTE2fHxyKXtsZXQgcz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpO2ZvcihsZXQgaSxvPXRoaXMuY2h1bmtzRG9uZSsxO3J8fCEobyYxKTtvPj49MSl7aWYoIShpPXRoaXMuc3RhY2sucG9wKCkpKWJyZWFrO3RoaXMuYnVmZmVyMzIuc2V0KGksMCksdGhpcy5idWZmZXIzMi5zZXQocyw4KSx0aGlzLnBvcz10aGlzLmJsb2NrTGVuLHRoaXMuYjJDb21wcmVzcygwLHRoaXMuZmxhZ3N8eGUuUEFSRU5ULHRoaXMuYnVmZmVyMzIsMCkscz10aGlzLnN0YXRlLHRoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpfXRoaXMuY2h1bmtzRG9uZSsrLHRoaXMuY2h1bmtQb3M9MCx0aGlzLnN0YWNrLnB1c2gocyl9dGhpcy5wb3M9MH1fY2xvbmVJbnRvKGUpe2U9c3VwZXIuX2Nsb25lSW50byhlKTtsZXR7SVY6dCxmbGFnczpyLHN0YXRlOm4sY2h1bmtQb3M6cyxwb3NPdXQ6aSxjaHVua091dDpvLHN0YWNrOmEsY2h1bmtzRG9uZTpjfT10aGlzO3JldHVybiBlLnN0YXRlLnNldChuLnNsaWNlKCkpLGUuc3RhY2s9YS5tYXAoKHUpPT5VaW50MzJBcnJheS5mcm9tKHUpKSxlLklWLnNldCh0KSxlLmZsYWdzPXIsZS5jaHVua1Bvcz1zLGUuY2h1bmtzRG9uZT1jLGUucG9zT3V0PWksZS5jaHVua091dD1vLGUuZW5hYmxlWE9GPXRoaXMuZW5hYmxlWE9GLGUuYnVmZmVyT3V0MzIuc2V0KHRoaXMuYnVmZmVyT3V0MzIpLGV9ZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwLGl0KHRoaXMuc3RhdGUsdGhpcy5idWZmZXIzMix0aGlzLklWLHRoaXMuYnVmZmVyT3V0MzIpLGl0KC4uLnRoaXMuc3RhY2spfWIyQ29tcHJlc3NPdXQoKXtsZXR7c3RhdGU6ZSxwb3M6dCxmbGFnczpyLGJ1ZmZlcjMyOm4sYnVmZmVyT3V0MzI6c309dGhpcyx7aDppLGw6b309cm4oQmlnSW50KHRoaXMuY2h1bmtPdXQrKykpO2llKG4pO2xldHt2MDphLHYxOmMsdjI6dSx2MzpsLHY0OmYsdjU6aCx2Njp5LHY3Omcsdjg6bSx2OTpTLHYxMDpFLHYxMTp3LHYxMjp4LHYxMzpiLHYxNDpBLHYxNTpEfT1zbihOcywwLG4sNyxlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sa2VbMF0sa2VbMV0sa2VbMl0sa2VbM10sbyxpLHQscik7c1swXT1hXm0sc1sxXT1jXlMsc1syXT11XkUsc1szXT1sXncsc1s0XT1mXngsc1s1XT1oXmIsc1s2XT15XkEsc1s3XT1nXkQsc1s4XT1lWzBdXm0sc1s5XT1lWzFdXlMsc1sxMF09ZVsyXV5FLHNbMTFdPWVbM11edyxzWzEyXT1lWzRdXngsc1sxM109ZVs1XV5iLHNbMTRdPWVbNl1eQSxzWzE1XT1lWzddXkQsaWUobiksaWUocyksdGhpcy5wb3NPdXQ9MH1maW5pc2goKXtpZih0aGlzLmZpbmlzaGVkKXJldHVybjt0aGlzLmZpbmlzaGVkPSEwLGl0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zKSk7bGV0IGU9dGhpcy5mbGFnc3x4ZS5ST09UO2lmKHRoaXMuc3RhY2subGVuZ3RoKWV8PXhlLlBBUkVOVCxpZSh0aGlzLmJ1ZmZlcjMyKSx0aGlzLmNvbXByZXNzKHRoaXMuYnVmZmVyMzIsMCwhMCksaWUodGhpcy5idWZmZXIzMiksdGhpcy5jaHVua3NEb25lPTAsdGhpcy5wb3M9dGhpcy5ibG9ja0xlbjtlbHNlIGV8PSghdGhpcy5jaHVua1Bvcz94ZS5DSFVOS19TVEFSVDowKXx4ZS5DSFVOS19FTkQ7dGhpcy5mbGFncz1lLHRoaXMuYjJDb21wcmVzc091dCgpfXdyaXRlSW50byhlKXtJdCh0aGlzLCExKSxOZShlKSx0aGlzLmZpbmlzaCgpO2xldHtibG9ja0xlbjp0LGJ1ZmZlck91dDpyfT10aGlzO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzOyl7aWYodGhpcy5wb3NPdXQ+PXQpdGhpcy5iMkNvbXByZXNzT3V0KCk7bGV0IGk9TWF0aC5taW4odC10aGlzLnBvc091dCxzLW4pO2Uuc2V0KHIuc3ViYXJyYXkodGhpcy5wb3NPdXQsdGhpcy5wb3NPdXQraSksbiksdGhpcy5wb3NPdXQrPWksbis9aX1yZXR1cm4gZX14b2ZJbnRvKGUpe2lmKCF0aGlzLmVuYWJsZVhPRil0aHJvdyBFcnJvcigiWE9GIGlzIG5vdCBwb3NzaWJsZSBhZnRlciBkaWdlc3QgY2FsbCIpO3JldHVybiB0aGlzLndyaXRlSW50byhlKX14b2YoZSl7cmV0dXJuIHd0KGUpLHRoaXMueG9mSW50byhuZXcgVWludDhBcnJheShlKSl9ZGlnZXN0SW50byhlKXtpZihKdChlLHRoaXMpLHRoaXMuZmluaXNoZWQpdGhyb3cgRXJyb3IoImRpZ2VzdCgpIHdhcyBhbHJlYWR5IGNhbGxlZCIpO3JldHVybiB0aGlzLmVuYWJsZVhPRj0hMSx0aGlzLndyaXRlSW50byhlKSx0aGlzLmRlc3Ryb3koKSxlfWRpZ2VzdCgpe3JldHVybiB0aGlzLmRpZ2VzdEludG8obmV3IFVpbnQ4QXJyYXkodGhpcy5vdXRwdXRMZW4pKX19dmFyIGFuPUtzKChlKT0+bmV3IG9uKGUpKTt2YXIgX289MzIsQ2g9U3ltYm9sKCJYMjU1MTlTayIpO2Z1bmN0aW9uIHFzKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PV9vKXJldHVybiBkKDEwKTtyZXR1cm4gcChlKX12YXIgVz0oMW48PDI1NW4pLTE5bixObz0xMjE2NjVuLEZzPW5ldyBVaW50OEFycmF5KDMyKTtGc1swXT05O2Z1bmN0aW9uIFdzKGUpe2xldCB0PTBuO2ZvcihsZXQgcj1lLmxlbmd0aC0xO3I+PTA7ci0tKXQ9dDw8OG58QmlnSW50KGVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIHFvKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KDMyKSxyPShlJVcrVyklVztmb3IobGV0IG49MDtuPDMyO24rKyl0W25dPU51bWJlcihyJjB4ZmZuKSxyPj49OG47cmV0dXJuIHR9ZnVuY3Rpb24gRm8oZSl7bGV0IHQ9ZS5zbGljZSgpO3JldHVybiB0WzMxXSY9MTI3LFdzKHQpfWZ1bmN0aW9uIFdvKGUpe2xldCB0PWUuc2xpY2UoKTtyZXR1cm4gdFswXSY9MjQ4LHRbMzFdJj0xMjcsdFszMV18PTY0LHR9ZnVuY3Rpb24gZXIoZSx0LHIpe2xldCBuPS1lLHM9KHRecikmbjtyZXR1cm5bdF5zLHJec119ZnVuY3Rpb24gem8oZSl7bGV0IHQ9Vy0ybixyPShlJVcrVyklVyxuPTFuO3doaWxlKHQ+MG4pe2lmKHQmMW4pbj1uKnIlVztyPXIqciVXLHQ+Pj0xbn1yZXR1cm4gbn1mdW5jdGlvbiBjbihlLHQpe2xldCByPVdvKGUpLG49Rm8odCkscz0xbixpPTBuLG89bixhPTFuLGM9MG4sdT1XcyhyKTtmb3IobGV0IGw9MjU0O2w+PTA7bC0tKXtsZXQgZj11Pj5CaWdJbnQobCkmMW47Y149ZixbcyxvXT1lcihjLHMsbyksW2ksYV09ZXIoYyxpLGEpLGM9ZjtsZXQgaD0ocytpKSVXLHk9aCpoJVcsZz0ocy1pK1cpJVcsbT1nKmclVyxTPSh5LW0rVyklVyxFPShvK2EpJVcseD0oby1hK1cpJVcqaCVXLGI9RSpnJVcsQT0oeCtiKSVXLEQ9KHgtYitXKSVXO289QSpBJVcsYT1uKkQqRCVXLHM9eSptJVcsaT1TKih5K05vKlMpJVd9cmV0dXJuW3Msb109ZXIoYyxzLG8pLFtpLGFdPWVyKGMsaSxhKSxyLmZpbGwoMCkscW8ocyp6byhpKSVXKX1mdW5jdGlvbiB6cyhlKXtyZXR1cm4gY24oZSxGcyl9dmFyIGRuPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEyLDQsMzQsNCwzMl0pO2Z1bmN0aW9uIFhzKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGRuLmxlbmd0aCszMik7cmV0dXJuIHQuc2V0KGRuKSx0LnNldChlLnN1YmFycmF5KDAsMzIpLGRuLmxlbmd0aCksdH12YXIgdW49bmV3IFVpbnQ4QXJyYXkoWzQ4LDQ2LDIsMSwwLDQ4LDUsNiwzLDQzLDEwMSwxMTAsNCwzNCw0LDMyXSk7ZnVuY3Rpb24ganMoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkodW4ubGVuZ3RoKzMyKTtyZXR1cm4gdC5zZXQodW4pLHQuc2V0KGUuc3ViYXJyYXkoMCwzMiksdW4ubGVuZ3RoKSx0fWZ1bmN0aW9uICRzKGUpe3JldHVybiB0eXBlb2YgZT09PSJzdHJpbmciP25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKTplfWZ1bmN0aW9uIEJlKGUpe2xldCB0PW5ldyBBcnJheUJ1ZmZlcihlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheSh0KS5zZXQoZSksdH1jbGFzcyBxZXt2ZXJpZnlLZXlzPW5ldyBNYXA7YXN5bmMgZ2VuUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIGJ0KGUpfWFzeW5jIGdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKXtyZXR1cm4gYnQoMzIpfWFzeW5jIGVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQoZSx0KXtsZXQgcj1idCgyNCkscz1lbih0LHIpLmVuY3J5cHQoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KFsuLi5yLC4uLnNdKX1hc3luYyBkZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGUsdCl7bGV0IHI9ZS5zbGljZSgwLDI0KSxuPWUuc2xpY2UoMjQpO3JldHVybiBlbih0LHIpLmRlY3J5cHQobil9YXN5bmMgZGVyaXZlRWQyNTUxOUtleVBhaXIoZSl7bGV0IHQ9ZSxyPVhzKHQpLG49QmUociksczt0cnl7bGV0IHU9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG4se25hbWU6IkVkMjU1MTkifSwhMCxbInNpZ24iXSk7cz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJqd2siLHUpfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9aWYodHlwZW9mIHMueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJFZDI1NTE5IEpXSyBtaXNzaW5nIHgiKTtsZXQgaT1zLng7cy5kPXZvaWQgMDtsZXQgbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJqd2siLHtrdHk6Ik9LUCIsY3J2OiJFZDI1NTE5Iix4Oml9LHtuYW1lOiJFZDI1NTE5In0sITAsWyJ2ZXJpZnkiXSksYT1uZXcgVWludDhBcnJheShhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJyYXciLG8pKTt0aGlzLnZlcmlmeUtleXMuc2V0KFNlKGEpLG8pO2xldCBjPW5ldyBVaW50OEFycmF5KDY0KTtyZXR1cm4gYy5zZXQodCwwKSxjLnNldChhLDMyKSx7a2V5VHlwZToiZWQyNTUxOSIscHJpdmF0ZUtleTpjLHB1YmxpY0tleTphfX1hc3luYyBpbXBvcnRTaWduS2V5KGUpe2xldCB0PWUuc3ViYXJyYXkoMCwzMikscj1Ycyh0KSxuPUJlKHIpO3RyeXtyZXR1cm4gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG4se25hbWU6IkVkMjU1MTkifSwhMSxbInNpZ24iXSl9ZmluYWxseXtyLmZpbGwoMCksbmV3IFVpbnQ4QXJyYXkobikuZmlsbCgwKX19YXN5bmMgaW1wb3J0VmVyaWZ5S2V5KGUpe2xldCB0PVNlKGUpLHI9dGhpcy52ZXJpZnlLZXlzLmdldCh0KTtpZihyKXJldHVybiByO2xldCBuPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsQmUoZSkse25hbWU6IkVkMjU1MTkifSwhMSxbInZlcmlmeSJdKTtyZXR1cm4gdGhpcy52ZXJpZnlLZXlzLnNldCh0LG4pLG59YXN5bmMgc2lnbkVkMjU1MTkoZSx0KXtsZXQgcj0kcyhlKSxuPWF3YWl0IHRoaXMuaW1wb3J0U2lnbktleSh0KSxzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5zaWduKHtuYW1lOiJFZDI1NTE5In0sbixCZShyKSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHMpfWFzeW5jIGNoZWNrU2lnRWQyNTUxOShlLHQscil7bGV0IG49JHModCk7dHJ5e2xldCBzPWF3YWl0IHRoaXMuaW1wb3J0VmVyaWZ5S2V5KHIpO3JldHVybiBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUudmVyaWZ5KHtuYW1lOiJFZDI1NTE5In0scyxCZShlKSxCZShuKSl9Y2F0Y2h7cmV0dXJuITF9fWFzeW5jIGJsYWtlMyhlLHQpe2lmKHQ9PT12b2lkIDApcmV0dXJuIGFuKGUpO3JldHVybiBhbihlLHQpfWFzeW5jIGdlblgyNTUxOSgpe2xldCBlPWF3YWl0IGJ0KDMyKTtlWzBdJj0yNDgsZVszMV0mPTEyNyxlWzMxXXw9NjQ7bGV0W3Qscl09cXMoZSk7aWYociE9PTB8fHQ9PT12b2lkIDApdGhyb3cgZS5maWxsKDApLEVycm9yKCJYMjU1MTkgc2NhbGFyIGJyYW5kIGZhaWxlZCIpO2xldCBuPXpzKHQpLHM9anModCksaT1CZShzKTt0cnl7bGV0IG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLGkse25hbWU6IlgyNTUxOSJ9LCEwLFsiZGVyaXZlQml0cyJdKSxhPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsbyk7aWYodHlwZW9mIGEueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJYMjU1MTkgSldLIG1pc3NpbmcgeCIpO2xldCBjPVFuKGEueCk7aWYoYS5kPXZvaWQgMCwhWShjLG4pKXRocm93IEVycm9yKCJYMjU1MTkgV2ViQ3J5cHRvIHB1YiAhPSBSRkMgNzc0OCIpO3JldHVybntwcml2OnQscHViOm59fWNhdGNoKG8pe3Rocm93IHQuZmlsbCgwKSxvfWZpbmFsbHl7cy5maWxsKDApLG5ldyBVaW50OEFycmF5KGkpLmZpbGwoMCl9fWFzeW5jIHgyNTUxOVNoYXJlZChlLHQpe2xldCByPWpzKGUpLG49QmUocik7dHJ5e2xldCBzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJYMjU1MTkifSwhMSxbImRlcml2ZUJpdHMiXSksaT1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLEJlKHQpLHtuYW1lOiJYMjU1MTkifSwhMSxbXSksbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyh7bmFtZToiWDI1NTE5IixwdWJsaWM6aX0scywyNTYpO3JldHVybiBuZXcgVWludDhBcnJheShvKX1jYXRjaHtyZXR1cm4gY24oZSx0KX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfX19dmFyIFhvPW5ldyBxZSx0cj1Ybzt2YXIgSj0iZW50aXRpZXMiLHJyPSJlbnRpdHlfdHlwZV9jcmVhdGVkX2F0Iixmbj0iZW50aXR5X3R5cGVfdXBkYXRlZF9hdCIscG49ImVudGl0eV90eXBlX3BhcmVudF9pZCIsYXQ9ImVudGl0eV90YWdzIixHcz0iZW50aXR5X3R5cGVfZ3JvdXBfaWQiLFFzPSJkYiIsWXM9MTQ7ZnVuY3Rpb24gam8oZSl7cmV0dXJuInR5cCJpbiBlfWZ1bmN0aW9uICRvKGUpe2xldCB0PXtib2Q6ZS5ib2R5LGNyZDplLmNyZWF0ZWRBdCwuLi5lLmN0ciE9PTA/e2N0cjplLmN0cn06e30sZWlkOlIoZS5laWQpLHBpZDplLnBpZD9SKGUucGlkKTp2b2lkIDAsdGdzOmUudGFncyx0eXA6ZS50eXBlLHVwZDplLnVwZGF0ZWRBdH07aWYodC5waWQ9PT12b2lkIDApZGVsZXRlIHQucGlkO2lmKHQudGdzPT09dm9pZCAwKWRlbGV0ZSB0LnRncztpZih0LmN0cj09PXZvaWQgMClkZWxldGUgdC5jdHI7cmV0dXJuIHR9ZnVuY3Rpb24gR28oZSl7aWYoIUcoZSkpcmV0dXJue2VpZDpSKGUuZWlkKSx1cGQ6ZS51cGRhdGVkQXQsLi4uZS5jdHIhPT0wP3tjdHI6ZS5jdHJ9Ont9fTtyZXR1cm4gJG8oZSl9ZnVuY3Rpb24gY3QoZSl7cmV0dXJue2JvZHk6ZS5ib2QsY3JlYXRlZEF0OmUuY3JkLHVwZGF0ZWRBdDplLnVwZCxjdHI6ZS5jdHI/PzAsdHlwZTplLnR5cCxlaWQ6bWUoZS5laWQpLHBpZDplLnBpZD9tZShlLnBpZCk6dm9pZCAwLC4uLmUudGdzIT09dm9pZCAwP3t0YWdzOmUudGdzfTp7fX19ZnVuY3Rpb24gbG4oZSl7aWYoam8oZSkpcmV0dXJuIGN0KGUpO3JldHVybntlaWQ6bWUoZS5laWQpLHVwZGF0ZWRBdDplLnVwZCxjdHI6ZS5jdHI/PzB9fWZ1bmN0aW9uIFFvKGUsdCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIElEQktleVJhbmdlLm9ubHkoW2UsdF0pO2xldCByPXQucmFuZ2U7cmV0dXJuIElEQktleVJhbmdlLmJvdW5kKFtlLHIuc3RhcnRdLFtlLHIuZW5kXSxyLmV4Y2x1ZGVTdGFydD09PSEwLHIuZXhjbHVkZUVuZD09PSEwKX1mdW5jdGlvbiBZbyhlKXtpZih0eXBlb2YgZT09PSJzdHJpbmciKXJldHVybiBJREJLZXlSYW5nZS5vbmx5KGUpO2lmKCJyYW5nZSJpbiBlKXtsZXQgdD1lLnJhbmdlO3JldHVybiBJREJLZXlSYW5nZS5ib3VuZCh0LnN0YXJ0LHQuZW5kLHQuZXhjbHVkZVN0YXJ0PT09ITAsdC5leGNsdWRlRW5kPT09ITApfXJldHVybiBJREJLZXlSYW5nZS5ib3VuZChlLnByZWZpeCxlLnByZWZpeCsi77+/Iil9ZnVuY3Rpb24gSm8oZSx0LHIpe2xldCBuPVtdO2lmKHR5cGVvZiByPT09InN0cmluZyIpe2ZvcihsZXQgbyBvZiBlKWlmKG8udHlwPT09dCluLnB1c2goY3QobykpO3JldHVybiBufWxldCBzPW5ldyBTZXQsaT0icHJlZml4ImluIHI/ci5wcmVmaXg6dm9pZCAwO2ZvcihsZXQgbyBvZiBlKXtpZihvLnR5cCE9PXQpY29udGludWU7aWYocy5oYXMoby5laWQpKWNvbnRpbnVlO2lmKGkhPT12b2lkIDApe2xldCBhPW8udGdzO2lmKCFhfHwhYS5zb21lKChjKT0+Yy5zdGFydHNXaXRoKGkpKSljb250aW51ZX1zLmFkZChvLmVpZCksbi5wdXNoKGN0KG8pKX1yZXR1cm4gbn1jbGFzcyBKc3tkYjtvcGVuaW5nO2FzeW5jIGluaXQoKXthd2FpdCB0aGlzLmVuc3VyZURiKCl9YXN5bmMgZW5zdXJlRGIoKXtpZih0aGlzLmRiKXJldHVybiB0aGlzLmRiO2lmKHRoaXMub3BlbmluZylyZXR1cm4gdGhpcy5vcGVuaW5nO3JldHVybiB0aGlzLm9wZW5pbmc9ZWEoKS50aGVuKChlKT0+KGUub252ZXJzaW9uY2hhbmdlPSgpPT57aWYoZS5jbG9zZSgpLHRoaXMuZGI9PT1lKXRoaXMuZGI9dm9pZCAwfSx0aGlzLmRiPWUsdGhpcy5vcGVuaW5nPXZvaWQgMCxlKSwoZSk9Pnt0aHJvdyB0aGlzLm9wZW5pbmc9dm9pZCAwLGV9KSx0aGlzLm9wZW5pbmd9YXBwbHk9YXN5bmMoZSk9PntsZXQgdD1uZXcgU2V0LHI9W10sbj1wZXJmb3JtYW5jZS5ub3coKTtGKCJpZGIgYXBwbHkgc3RhcnQiLHtvcHM6ZS5sZW5ndGh9KTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJue3N0YXRzOmUubWFwKCgpPT4xNiksdHlwZXM6dCxlaWRzOnJ9fWxldCBpPXMudHJhbnNhY3Rpb24oSiwicmVhZHdyaXRlIiksbz1pLm9iamVjdFN0b3JlKEopO3JldHVybiBuZXcgUHJvbWlzZSgoYSk9PntsZXQgYz1BcnJheShlLmxlbmd0aCkuZmlsbCgwKTtpZihlLmxlbmd0aDwxKXthKHtzdGF0czpbXSx0eXBlczp0LGVpZHM6cn0pO3JldHVybn1pLm9uY29tcGxldGU9KCk9PntGKCJpZGIgYXBwbHkgY29tcGxldGUiLHtvcHM6ZS5sZW5ndGgsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS1uKX0pLGEoe3N0YXRzOmMsdHlwZXM6dCxlaWRzOnJ9KX0saS5vbmVycm9yPSgpPT57Zm9yKGxldCBsPTA7bDxjLmxlbmd0aDtsKyspaWYoY1tsXT09PXZvaWQgMCljW2xdPTE4O2Eoe3N0YXRzOmMsdHlwZXM6dCxlaWRzOnJ9KX07bGV0IHU9bmV3IE1hcDtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrKyl7bGV0IGY9ZVtsXSxoPVIoZi5laWQpLHk9e29wOmYsaW5kZXg6bH0sZz11LmdldChoKTtpZihnKWcucHVzaCh5KTtlbHNlIHUuc2V0KGgsW3ldKX1mb3IobGV0W2wsZl1vZiB1KXtpZihmLmxlbmd0aDwxKWNvbnRpbnVlO2xldCBoPW8uZ2V0KGwpO2gub25zdWNjZXNzPSgpPT57bGV0IHk9aC5yZXN1bHQsZz15P2xuKHkpOnZvaWQgMCxtPSExO2ZvcihsZXR7b3A6UyxpbmRleDpFfW9mIGYpe2xldFt3LHhdPVplKGcsUyk7aWYoeCE9PTApe2NbRV09eDtjb250aW51ZX1pZih3PT09dm9pZCAwKXtjW0VdPTEyO2NvbnRpbnVlfW09ITA7Zm9yKGxldCBiIG9mIGV0KGcsdykpdC5hZGQoYik7Zz13fWlmKG0pci5wdXNoKGZbMF0ub3AuZWlkKTtpZihnKXtsZXQgUz1vLnB1dChHbyhnKSk7Uy5vbmVycm9yPShFKT0+e0UucHJldmVudERlZmF1bHQoKTtmb3IobGV0e2luZGV4Ond9b2YgZiljW3ddPTE4fX19LGgub25lcnJvcj0oKT0+e2ZvcihsZXR7aW5kZXg6eX1vZiBmKWNbeV09MTh9fX0pfTthc3luYyBjbGVhcigpe2xldCBlO3RyeXtlPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gMTZ9bGV0IHQ9ZS50cmFuc2FjdGlvbihKLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoSik7cmV0dXJuIG5ldyBQcm9taXNlKChuKT0+e3Qub25jb21wbGV0ZT0oKT0+bigwKSx0Lm9uZXJyb3I9KCk9Pm4oMTgpLHIuY2xlYXIoKX0pfWFzeW5jIGdldFJvdyhlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGQoMTYpfWxldCByPVIoZSkscz10LnRyYW5zYWN0aW9uKEosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoSik7cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPXMuZ2V0KHIpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoIWEpaShwKHZvaWQgMCkpO2Vsc2UgaShwKGxuKGEpKSl9LG8ub25lcnJvcj0oKT0+aShkKDE4KSl9KX1hc3luYyBnZXRFbnQoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRSb3coZSk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMHx8IUcodCkpcmV0dXJuIHAodm9pZCAwKTtyZXR1cm4gcCh0KX1hc3luYyBnZXRCeVVwZGF0ZWRBdChlLHQpe2xldFtyLG5dPW10KHQpO2lmKG4hPT0wKXJldHVybiBkKG4pO2lmKCFyKXJldHVybiBwKFtdKTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGQoMTYpfWxldCBvPXMudHJhbnNhY3Rpb24oSiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShKKS5pbmRleChmbiksYT1RbyhlLHQpO3JldHVybiBuZXcgUHJvbWlzZSgoYyk9PntsZXQgdT1vLmdldEFsbChhKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBsPXUucmVzdWx0O2MocChsLm1hcChjdCkpKX0sdS5vbmVycm9yPSgpPT5jKGQoMTgpKX0pfWFzeW5jIGdldEFsbE9mVHlwZShlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGQoMTYpfWxldCBuPXQudHJhbnNhY3Rpb24oSiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShKKS5pbmRleChycik7cmV0dXJuIG5ldyBQcm9taXNlKChzKT0+e2xldCBpPW4uZ2V0QWxsKElEQktleVJhbmdlLmJvdW5kKFtlXSxbZSxbXV0pKTtpLm9uc3VjY2Vzcz0oKT0+e2xldCBvPWkucmVzdWx0O3MocChvLm1hcChjdCkpKX0saS5vbmVycm9yPSgpPT5zKGQoMTgpKX0pfWFzeW5jIGdldEJ5VGFnKGUsdCl7bGV0W3Isbl09Z3QodCk7aWYobiE9PTApcmV0dXJuIGQobik7aWYoIXIpcmV0dXJuIHAoW10pO2xldCBzO3RyeXtzPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gZCgxNil9bGV0IGk9WW8odCksYT1zLnRyYW5zYWN0aW9uKEosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoSikuaW5kZXgoYXQpO3JldHVybiBuZXcgUHJvbWlzZSgoYyk9PntsZXQgdT1hLmdldEFsbChpKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBsPXUucmVzdWx0O2MocChKbyhsLGUsdCkpKX0sdS5vbmVycm9yPSgpPT5jKGQoMTgpKX0pfWFzeW5jIGdldEFsbEVudGl0aWVzKGUpe2lmKCJwaWQiaW4gZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBkKDE2KX1sZXQgcj1SKGUucGlkKSxzPXQudHJhbnNhY3Rpb24oSiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShKKS5pbmRleChwbik7cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPXMuZ2V0QWxsKElEQktleVJhbmdlLm9ubHkoW2UudHlwZSxyXSkpO28ub25zdWNjZXNzPSgpPT57bGV0IGM9by5yZXN1bHQubWFwKGN0KTtpKHAoYykpfSxvLm9uZXJyb3I9KCk9PmkoZCgxOCkpfSl9ZWxzZSBpZigidGFnImluIGUpcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QnlUYWcoZS50eXBlLGUudGFnKTtlbHNlIGlmKCJ1cGRhdGVkQXQiaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVVwZGF0ZWRBdChlLnR5cGUsZS51cGRhdGVkQXQpO3JldHVybiBhd2FpdCB0aGlzLmdldEFsbE9mVHlwZShlLnR5cGUpfWFzeW5jIGdldEVudGl0aWVzKGUpe2xldCB0PXBlcmZvcm1hbmNlLm5vdygpLFtyLG5dPWF3YWl0IHRoaXMuZ2V0QWxsRW50aXRpZXMoZSk7aWYoRigiaWRiIGdldEVudGl0aWVzIix7dHlwZTplLnR5cGUsbjpyPy5sZW5ndGg/PzAsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS10KX0pLG4hPT0wKXJldHVybiBkKG4pO3JldHVybiBwKHIpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gZCgxNil9bGV0IG49dC50cmFuc2FjdGlvbihKLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKEopLmluZGV4KHJyKTtyZXR1cm4gbmV3IFByb21pc2UoKHMpPT57bGV0IGk9SURCS2V5UmFuZ2UuYm91bmQoW2VdLFtlLFtdXSksbz1uLmNvdW50KGkpO28ub25zdWNjZXNzPSgpPT5zKHAoby5yZXN1bHQpKSxvLm9uZXJyb3I9KCk9PnMoZCgxOCkpfSl9YXN5bmMgY2hlY2tzdW0oZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBkKDE2KX1sZXQgbj10LnRyYW5zYWN0aW9uKEosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoSikscz1bXTtyZXR1cm4gbmV3IFByb21pc2UoKGkpPT57bGV0IG89bi5vcGVuQ3Vyc29yKCk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgYT1vLnJlc3VsdDtpZihhKXtsZXQgYz1hLnZhbHVlO3MucHVzaChGdChsbihjKSkpLGEuY29udGludWUoKX1lbHNlIE50KHMsZSkudGhlbihpKX0sby5vbmVycm9yPSgpPT5pKGQoMTgpKX0pfX1mdW5jdGlvbiBabyhlLHQpe2lmKCFlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoSikpZS5jcmVhdGVPYmplY3RTdG9yZShKLHtrZXlQYXRoOiJlaWQiLGF1dG9JbmNyZW1lbnQ6ITF9KTtsZXQgcj10Lm9iamVjdFN0b3JlKEopO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMocnIpKXIuY3JlYXRlSW5kZXgocnIsWyJ0eXAiLCJjcmQiXSx7dW5pcXVlOiExfSk7aWYoIXIuaW5kZXhOYW1lcy5jb250YWlucyhmbikpci5jcmVhdGVJbmRleChmbixbInR5cCIsInVwZCJdLHt1bmlxdWU6ITF9KTtpZihyLmluZGV4TmFtZXMuY29udGFpbnMoR3MpKXIuZGVsZXRlSW5kZXgoR3MpO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMocG4pKXIuY3JlYXRlSW5kZXgocG4sWyJ0eXAiLCJwaWQiXSx7dW5pcXVlOiExfSk7aWYoci5pbmRleE5hbWVzLmNvbnRhaW5zKGF0KSl7aWYoci5pbmRleChhdCkua2V5UGF0aCE9PSJ0Z3MiKXIuZGVsZXRlSW5kZXgoYXQpfWlmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoYXQpKXIuY3JlYXRlSW5kZXgoYXQsInRncyIse3VuaXF1ZTohMSxtdWx0aUVudHJ5OiEwfSl9ZnVuY3Rpb24gZWEoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntsZXQgcj1pbmRleGVkREIub3BlbihRcyxZcyk7ci5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntsZXR7cmVzdWx0Om4sdHJhbnNhY3Rpb246c309cjtpZighcyl7dChFcnJvcigiVHJhbnNhY3Rpb24gaXMgbnVsbCBkdXJpbmcgRW50REIgdXBncmFkZSIpKTtyZXR1cm59dHJ5e1pvKG4scyl9Y2F0Y2goaSl7dChpIGluc3RhbmNlb2YgRXJyb3I/aTpFcnJvcihTdHJpbmcoaSkpKX19LHIub25ibG9ja2VkPSgpPT57Y29uc29sZS53YXJuKGBbRElQTE9NQVRJQ10gRW50REIgSURCIHVwZ3JhZGUgYmxvY2tlZCAoJHtRc30g4oaSIHYke1lzfSk7IHdhaXRpbmcgZm9yIG90aGVyIGNvbm5lY3Rpb25zIHRvIGNsb3NlYCl9LHIub25zdWNjZXNzPSgpPT5lKHIucmVzdWx0KSxyLm9uZXJyb3I9KCk9PnQoci5lcnJvcj8/RXJyb3IoIkVudERCIEluZGV4ZWREQiBvcGVuIGZhaWxlZCIpKX0pfWFzeW5jIGZ1bmN0aW9uIFpzKCl7bGV0IGU9bmV3IEpzO3JldHVybiBhd2FpdCBlLmluaXQoKSxlfWNsYXNzIGhue2VudHM9bmV3IE1hcDt1c2VJbmRleDtieVR5cGU9bmV3IE1hcDtieVR5cGVQaWQ9bmV3IE1hcDtieVR5cGVUYWc9bmV3IE1hcDtjb25zdHJ1Y3RvcihlPVtdLHQpe3RoaXMudXNlSW5kZXg9dD8uaW5kZXhlcyE9PSExO2ZvcihsZXQgciBvZiBlKXRoaXMucHV0KHIpfXB1dChlKXtsZXQgdD1SKGUuZWlkKSxyPXRoaXMuZW50cy5nZXQodCk7aWYociE9PXZvaWQgMCYmRyhyKSl0aGlzLnVuaW5kZXgodCxyKTtpZih0aGlzLmVudHMuc2V0KHQsZSksRyhlKSl0aGlzLmluZGV4KHQsZSl9ZGVsKGUpe2xldCB0PXRoaXMuZW50cy5nZXQoZSk7aWYodD09PXZvaWQgMClyZXR1cm47aWYoRyh0KSl0aGlzLnVuaW5kZXgoZSx0KTt0aGlzLmVudHMuZGVsZXRlKGUpfWluZGV4KGUsdCl7aWYoIXRoaXMudXNlSW5kZXgpcmV0dXJuO2xldCByPXRoaXMuYnlUeXBlLmdldCh0LnR5cGUpO2lmKCFyKXI9bmV3IE1hcCx0aGlzLmJ5VHlwZS5zZXQodC50eXBlLHIpO2lmKHIuc2V0KGUsdCksdC5waWQpe2xldCBuPVIodC5waWQpLHM9dGhpcy5ieVR5cGVQaWQuZ2V0KHQudHlwZSk7aWYoIXMpcz1uZXcgTWFwLHRoaXMuYnlUeXBlUGlkLnNldCh0LnR5cGUscyk7bGV0IGk9cy5nZXQobik7aWYoIWkpaT1uZXcgTWFwLHMuc2V0KG4saSk7aS5zZXQoZSx0KX1pZih0LnRhZ3Mpe2xldCBuPXRoaXMuYnlUeXBlVGFnLmdldCh0LnR5cGUpO2lmKCFuKW49bmV3IE1hcCx0aGlzLmJ5VHlwZVRhZy5zZXQodC50eXBlLG4pO2ZvcihsZXQgcyBvZiB0LnRhZ3Mpe2xldCBpPW4uZ2V0KHMpO2lmKCFpKWk9bmV3IE1hcCxuLnNldChzLGkpO2kuc2V0KGUsdCl9fX11bmluZGV4KGUsdCl7aWYoIXRoaXMudXNlSW5kZXgpcmV0dXJuO2xldCByPXRoaXMuYnlUeXBlLmdldCh0LnR5cGUpO2lmKHIpe2lmKHIuZGVsZXRlKGUpLHIuc2l6ZT09PTApdGhpcy5ieVR5cGUuZGVsZXRlKHQudHlwZSl9aWYodC5waWQpe2xldCBuPVIodC5waWQpLHM9dGhpcy5ieVR5cGVQaWQuZ2V0KHQudHlwZSksaT1zPy5nZXQobik7aWYoaSl7aWYoaS5kZWxldGUoZSksaS5zaXplPT09MClzPy5kZWxldGUobil9aWYocyYmcy5zaXplPT09MCl0aGlzLmJ5VHlwZVBpZC5kZWxldGUodC50eXBlKX1pZih0LnRhZ3Mpe2xldCBuPXRoaXMuYnlUeXBlVGFnLmdldCh0LnR5cGUpO2lmKG4pe2ZvcihsZXQgcyBvZiB0LnRhZ3Mpe2xldCBpPW4uZ2V0KHMpO2lmKGkpe2lmKGkuZGVsZXRlKGUpLGkuc2l6ZT09PTApbi5kZWxldGUocyl9fWlmKG4uc2l6ZT09PTApdGhpcy5ieVR5cGVUYWcuZGVsZXRlKHQudHlwZSl9fX1jbGVhckluZGV4ZXMoKXt0aGlzLmJ5VHlwZS5jbGVhcigpLHRoaXMuYnlUeXBlUGlkLmNsZWFyKCksdGhpcy5ieVR5cGVUYWcuY2xlYXIoKX1idWNrZXRMaXN0KGUpe2lmKCFlfHxlLnNpemU9PT0wKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgciBvZiBlLnZhbHVlcygpKXQucHVzaChyKTtyZXR1cm4gdH1ieVRhZ1NwZWMoZSx0KXtsZXRbcixuXT1ndCh0KTtpZihuIT09MClyZXR1cm4gZChuKTtpZighcilyZXR1cm4gcChbXSk7aWYodHlwZW9mIHQ9PT0ic3RyaW5nIilyZXR1cm4gcCh0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGVUYWcuZ2V0KGUpPy5nZXQodCkpKTtsZXQgcz10aGlzLmJ5VHlwZVRhZy5nZXQoZSk7aWYoIXMpcmV0dXJuIHAoW10pO2xldCBpPW5ldyBTZXQsbz1bXTtmb3IobGV0W2EsY11vZiBzKXtpZighUnIoYSx0KSljb250aW51ZTtmb3IobGV0W3UsbF1vZiBjKXtpZihpLmhhcyh1KSljb250aW51ZTtpLmFkZCh1KSxvLnB1c2gobCl9fXJldHVybiBwKG8pfWJ5RGF0ZVNwZWMoZSx0KXtsZXRbcixuXT1tdCh0KTtpZihuIT09MClyZXR1cm4gZChuKTtpZighcilyZXR1cm4gcChbXSk7bGV0IHM9W10saT10aGlzLmJ5VHlwZS5nZXQoZSk7aWYoaSl7Zm9yKGxldCBvIG9mIGkudmFsdWVzKCkpaWYoTXIoby51cGRhdGVkQXQsdCkpcy5wdXNoKG8pfXJldHVybiBwKHMpfWFzeW5jIGFwcGx5KGUpe2xldCB0PW5ldyBTZXQscj1bXSxuPVtdO2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1SKHMuZWlkKSxvPXRoaXMuZW50cy5nZXQoaSksW2EsY109WmUobyxzKTtpZihjIT09MCl7bi5wdXNoKGMpO2NvbnRpbnVlfWlmKGE9PT12b2lkIDApe24ucHVzaCgxMik7Y29udGludWV9Zm9yKGxldCB1IG9mIGV0KG8sYSkpdC5hZGQodSk7dGhpcy5wdXQoYSksci5wdXNoKHMuZWlkKSxuLnB1c2goMCl9cmV0dXJue3N0YXRzOm4sdHlwZXM6dCxlaWRzOnJ9fWFzeW5jIGNsZWFyKCl7cmV0dXJuIHRoaXMuZW50cy5jbGVhcigpLHRoaXMuY2xlYXJJbmRleGVzKCksMH1hc3luYyBnZXRSb3coZSl7bGV0IHQ9UihlKSxyPXRoaXMuZW50cy5nZXQodCk7cmV0dXJuIHAocil9YXN5bmMgZ2V0RW50KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0Um93KGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2lmKHQ9PT12b2lkIDB8fCFHKHQpKXJldHVybiBwKHZvaWQgMCk7cmV0dXJuIHAodCl9YXN5bmMgZ2V0QWxsRW50aXRpZXMoZSl7bGV0e3R5cGU6dH09ZTtpZih0aGlzLnVzZUluZGV4KXtpZigicGlkImluIGUpe2xldCBuPVIoZS5waWQpO3JldHVybiBwKHRoaXMuYnVja2V0TGlzdCh0aGlzLmJ5VHlwZVBpZC5nZXQodCk/LmdldChuKSkpfWlmKCJ0YWciaW4gZSlyZXR1cm4gdGhpcy5ieVRhZ1NwZWModCxlLnRhZyk7aWYoInVwZGF0ZWRBdCJpbiBlKXJldHVybiB0aGlzLmJ5RGF0ZVNwZWModCxlLnVwZGF0ZWRBdCk7cmV0dXJuIHAodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlLmdldCh0KSkpfWxldCByPVtdO2lmKCJwaWQiaW4gZSl7Zm9yKGxldCBuIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihHKG4pJiZuLnR5cGU9PT10JiZuLnBpZCYmWShuLnBpZCxlLnBpZCkpci5wdXNoKG4pfWVsc2UgaWYoInRhZyJpbiBlKXtsZXQgbj1lLnRhZyxbcyxpXT1ndChuKTtpZihpIT09MClyZXR1cm4gZChpKTtpZighcylyZXR1cm4gcChyKTtmb3IobGV0IG8gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEcobykmJm8udHlwZT09PXQmJm8udGFncyYmby50YWdzLnNvbWUoKGEpPT5ScihhLG4pKSlyLnB1c2gobyl9ZWxzZSBpZigidXBkYXRlZEF0ImluIGUpe2xldCBuPWUudXBkYXRlZEF0LFtzLGldPW10KG4pO2lmKGkhPT0wKXJldHVybiBkKGkpO2lmKCFzKXJldHVybiBwKHIpO2ZvcihsZXQgbyBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRyhvKSYmby50eXBlPT09dCYmTXIoby51cGRhdGVkQXQsbikpci5wdXNoKG8pfWVsc2UgZm9yKGxldCBuIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihHKG4pJiZuLnR5cGU9PT10KXIucHVzaChuKTtyZXR1cm4gcChyKX1hc3luYyBnZXRFbnRpdGllcyhlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldEFsbEVudGl0aWVzKGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO3JldHVybiBwKHQpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2lmKHRoaXMudXNlSW5kZXgpcmV0dXJuIHAodGhpcy5ieVR5cGUuZ2V0KGUpPy5zaXplPz8wKTtsZXQgdD0wO2ZvcihsZXQgciBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRyhyKSYmci50eXBlPT09ZSl0Kz0xO3JldHVybiBwKHQpfWFzeW5jIGNoZWNrc3VtKGUpe2xldCB0PVtdO2ZvcihsZXQgciBvZiB0aGlzLmVudHMudmFsdWVzKCkpdC5wdXNoKEZ0KHIpKTtyZXR1cm4gTnQodCxlKX19ZnVuY3Rpb24gdGEoZSl7bGV0IHQ9Z2xvYmFsVGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7aWYodHlwZW9mIHQhPT0iZnVuY3Rpb24iKXtxdWV1ZU1pY3JvdGFzayhlKTtyZXR1cm59dCgoKT0+e3QoZSl9KX1hc3luYyBmdW5jdGlvbiB0aShlKXtpZihlPy52ZXJib3NlIT09dm9pZCAwKXBzKGUudmVyYm9zZSk7bGV0IHQ9YXdhaXQgWnMoKTtpZihlPy5jYWNoZT09PSExKXJldHVybiB0O3JldHVybiBuZXcgcmkodCx2b2lkIDAse2luZGV4ZXM6ZT8uaW5kZXhlcyxvcHRpbWlzdGljOmU/Lm9wdGltaXN0aWN9KX1jbGFzcyByaXttZW07ZHVyYWJsZTt3YXJtZWQ9bmV3IFNldDtsaXN0ZW5lcnM9bmV3IFNldDtjaGFpbj1Qcm9taXNlLnJlc29sdmUoKTtvcHRpbWlzdGljO2luZmxpZ2h0PTA7d2FybVA9bmV3IE1hcDtjb25zdHJ1Y3RvcihlLHQscil7aWYodGhpcy5kdXJhYmxlPWUsdGhpcy5vcHRpbWlzdGljPXI/Lm9wdGltaXN0aWMhPT0hMSxGKCJDYWNoZWRFbnREQiBvcGVuIix7b3B0aW1pc3RpYzp0aGlzLm9wdGltaXN0aWN9KSx0aGlzLm1lbT1uZXcgaG4odD8/W10se2luZGV4ZXM6cj8uaW5kZXhlc30pLHQpZm9yKGxldCBuIG9mIHQpdGhpcy53YXJtZWQuYWRkKG4udHlwZSl9c3Vic2NyaWJlKGUpe3JldHVybiB0aGlzLmxpc3RlbmVycy5hZGQoZSksKCk9Pnt0aGlzLmxpc3RlbmVycy5kZWxldGUoZSl9fWVtaXQoZSl7aWYoZS5zaXplPDEpcmV0dXJuO2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO0YoImVtaXQgc3RhcnQiLHt0eXBlczpbLi4uZV0sbGlzdGVuZXJzOnRoaXMubGlzdGVuZXJzLnNpemV9KTtmb3IobGV0IHIgb2YgdGhpcy5saXN0ZW5lcnMpcihlKTtGKCJlbWl0IGRvbmUiLHttczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSl9cnVuKGUpe2xldCB0PXRoaXMuY2hhaW4udGhlbihlLGUpO3JldHVybiB0aGlzLmNoYWluPXQudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSx0fWFwcGx5KGUpe2xldCB0LHI7aWYodGhpcy5vcHRpbWlzdGljKXtyPWFhKHRoaXMubWVtLGUpLnR5cGVzLHQ9bmV3IE1hcDtmb3IobGV0IHMgb2YgZSl7bGV0IGk9UihzLmVpZCk7dC5zZXQoaSxlaSh0aGlzLm1lbS5lbnRzLmdldChpKSkpfXRoaXMuaW5mbGlnaHQrPTEsRigiYXBwbHkgbWVtIHBhdGNoZWQiLHtvcHM6ZS5sZW5ndGgsdHlwZXM6cj9bLi4ucl06W10saW5mbGlnaHQ6dGhpcy5pbmZsaWdodH0pfWxldCBuPXRoaXMucnVuKGFzeW5jKCk9PntGKCJwZXJzaXN0IHN0YXJ0Iix7b3BzOmUubGVuZ3RofSk7dHJ5e2xldCBzPXBlcmZvcm1hbmNlLm5vdygpLGk9YXdhaXQgdGhpcy5kdXJhYmxlLmFwcGx5KGUpO2lmKEYoInBlcnNpc3QgZHVyYWJsZS5hcHBseSBkb25lIix7bXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS1zKX0pLCF0aGlzLm9wdGltaXN0aWMpe2xldHtjaGFuZ2VkOmEsc3RhdHVzOmN9PWF3YWl0IHRoaXMucHVsbEVpZHMoZS5tYXAoKHUpPT51LmVpZCkpO2lmKHRoaXMuZW1pdChhKSxjIT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PmMpLHR5cGVzOmkudHlwZXMsZWlkczppLmVpZHN9O3JldHVybiBpfWxldCBvPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKWlmKGkuc3RhdHNbYV0hPT0wKW8ucHVzaChlW2FdLmVpZCk7aWYoby5sZW5ndGg+MCl7RigicGVyc2lzdCBwdWxsIHJlamVjdGVkIGVpZHMiLHtuOm8ubGVuZ3RofSk7bGV0e2NoYW5nZWQ6YSxzdGF0dXM6Y309YXdhaXQgdGhpcy5wdWxsRWlkcyhvLHQpO2lmKHRoaXMuZW1pdChhKSxjIT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PmMpLHR5cGVzOmkudHlwZXMsZWlkczppLmVpZHN9fXJldHVybiBGKCJwZXJzaXN0IGRvbmUiKSxpfWZpbmFsbHl7aWYodGhpcy5vcHRpbWlzdGljKXRoaXMuaW5mbGlnaHQtPTF9fSk7aWYocil0YSgoKT0+e0YoImVtaXQgYWZ0ZXIgcGFpbnQiKSx0aGlzLmVtaXQocil9KTtyZXR1cm4gbn1jbGVhcigpe3JldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0IGU9YXdhaXQgdGhpcy5kdXJhYmxlLmNsZWFyKCk7aWYoZSE9PTApcmV0dXJuIGU7bGV0IHQ9dGhpcy5tZW0uZW50cy5zaXplPjA7cmV0dXJuIGF3YWl0IHRoaXMubWVtLmNsZWFyKCksdGhpcy53YXJtZWQuY2xlYXIoKSwwfSl9aW5nZXN0RnJvbUR1cmFibGUoZSl7bGV0IHQ9Wy4uLmVdLmxlbmd0aDtyZXR1cm4gRigiaW5nZXN0IHF1ZXVlZCIse2VpZHM6dH0pLHRoaXMucnVuKGFzeW5jKCk9PntsZXQgcj1wZXJmb3JtYW5jZS5ub3coKTtGKCJpbmdlc3Qgc3RhcnQiLHtlaWRzOnR9KTtsZXR7Y2hhbmdlZDpuLHN0YXR1czpzfT1hd2FpdCB0aGlzLnB1bGxFaWRzKGUpO3JldHVybiBGKCJpbmdlc3QgZG9uZSIse21zOk1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCktciksY2hhbmdlZDpbLi4ubl19KSx0aGlzLmVtaXQobiksc30pfWFzeW5jIHB1bGxFaWRzKGUsdCl7bGV0IHI9bmV3IFNldCxuPW5ldyBTZXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBpPVIocyk7aWYobi5oYXMoaSkpY29udGludWU7bi5hZGQoaSk7bGV0W28sYV09YXdhaXQgdGhpcy5kdXJhYmxlLmdldFJvdyhzKTtpZihhIT09MClyZXR1cm57Y2hhbmdlZDpyLHN0YXR1czphfTtsZXQgYz10aGlzLm1lbS5lbnRzLmdldChpKTtpZihjIT09dm9pZCAwJiZvIT09dm9pZCAwJiZ5bihjLG8pKWNvbnRpbnVlO2lmKHQpe2lmKCFvYShlaShjKSx0LmdldChpKSkpY29udGludWV9aWYobyl7aWYodGhpcy5tZW0ucHV0KG8pLCFjfHwhcmEoYyxvKSl7aWYoRyhvKSlyLmFkZChvLnR5cGUpO2lmKGMhPT12b2lkIDAmJkcoYykpci5hZGQoYy50eXBlKX19ZWxzZSBpZihjIT09dm9pZCAwKXtpZih0aGlzLm1lbS5kZWwoaSksRyhjKSlyLmFkZChjLnR5cGUpfX1yZXR1cm57Y2hhbmdlZDpyLHN0YXR1czowfX1hc3luYyB3YXJtVHlwZShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIDA7bGV0IHQ9cGVyZm9ybWFuY2Uubm93KCk7Rigid2FybVR5cGUgc3RhcnQiLHt0eXBlOmV9KTtsZXRbcixuXT1hd2FpdCB0aGlzLmR1cmFibGUuZ2V0RW50aXRpZXMoe3R5cGU6ZX0pO2lmKG4hPT0wKXJldHVybiBuO2lmKHIpZm9yKGxldCBzIG9mIHIpe2xldCBpPVIocy5laWQpLG89dGhpcy5tZW0uZW50cy5nZXQoaSk7aWYoIW98fHluKHMsbykpdGhpcy5tZW0ucHV0KHMpfXJldHVybiB0aGlzLndhcm1lZC5hZGQoZSksRigid2FybVR5cGUgZG9uZSIse3R5cGU6ZSxuOnI/Lmxlbmd0aD8/MCxtczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSksMH1iZWdpbldhcm0oZSl7aWYodGhpcy53YXJtZWQuaGFzKGUpKXJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7bGV0IHQ9dGhpcy53YXJtUC5nZXQoZSk7aWYodClyZXR1cm4gdDtsZXQgcj10aGlzLndhcm1UeXBlKGUpLmZpbmFsbHkoKCk9Pnt0aGlzLndhcm1QLmRlbGV0ZShlKX0pO3JldHVybiB0aGlzLndhcm1QLnNldChlLHIpLHJ9ZW5zdXJlV2FybShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuO3RoaXMuYmVnaW5XYXJtKGUpLnRoZW4oKHQpPT57aWYodD09PTApdGhpcy5lbWl0KG5ldyBTZXQoW2VdKSl9KX1hc3luYyBnZXRSb3coZSl7bGV0IHQ9UihlKTtpZih0aGlzLm1lbS5lbnRzLmhhcyh0KSlyZXR1cm4gdGhpcy5tZW0uZ2V0Um93KGUpO2xldFtyLG5dPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRSb3coZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocil7bGV0IHM9dGhpcy5tZW0uZW50cy5nZXQodCk7aWYoIXN8fHluKHIscykpdGhpcy5tZW0ucHV0KHIpfXJldHVybiB0aGlzLm1lbS5nZXRSb3coZSl9YXN5bmMgZ2V0RW50KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0Um93KGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2lmKHQ9PT12b2lkIDB8fCFHKHQpKXJldHVybiBwKHZvaWQgMCk7cmV0dXJuIHAodCl9YXN5bmMgZ2V0RW50aXRpZXMoZSl7aWYodGhpcy53YXJtZWQuaGFzKGUudHlwZSkpcmV0dXJuIEYoImdldEVudGl0aWVzIG1lbSIse3R5cGU6ZS50eXBlfSksdGhpcy5tZW0uZ2V0RW50aXRpZXMoZSk7aWYodGhpcy5pbmZsaWdodD4wKXJldHVybiBGKCJnZXRFbnRpdGllcyBpbmZsaWdodC1tZW0iLHt0eXBlOmUudHlwZX0pLHRoaXMuZW5zdXJlV2FybShlLnR5cGUpLHRoaXMubWVtLmdldEVudGl0aWVzKGUpO0YoImdldEVudGl0aWVzIGJlZ2luV2FybSIse3R5cGU6ZS50eXBlfSk7bGV0IHQ9YXdhaXQgdGhpcy5iZWdpbldhcm0oZS50eXBlKTtpZih0IT09MClyZXR1cm4gZCh0KTtyZXR1cm4gRigiZ2V0RW50aXRpZXMgYWZ0ZXJXYXJtIix7dHlwZTplLnR5cGV9KSx0aGlzLm1lbS5nZXRFbnRpdGllcyhlKX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6ZX0pO2lmKHRoaXMuaW5mbGlnaHQ+MClyZXR1cm4gdGhpcy5lbnN1cmVXYXJtKGUpLHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6ZX0pO2xldCB0PWF3YWl0IHRoaXMuYmVnaW5XYXJtKGUpO2lmKHQhPT0wKXJldHVybiBkKHQpO3JldHVybiB0aGlzLm1lbS5jb3VudEVudGl0aWVzKHt0eXBlOmV9KX1hc3luYyBjaGVja3N1bShlKXtyZXR1cm4gdGhpcy5kdXJhYmxlLmNoZWNrc3VtKGUpfX1mdW5jdGlvbiByYShlLHQpe2lmKEcoZSkhPT1HKHQpKXJldHVybiExO2lmKGUuY3RyIT09dC5jdHIpcmV0dXJuITE7aWYoZS51cGRhdGVkQXQuZ2V0VGltZSgpIT09dC51cGRhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKCFZKGUuZWlkLHQuZWlkKSlyZXR1cm4hMTtpZighRyhlKXx8IUcodCkpcmV0dXJuITA7aWYoZS5jcmVhdGVkQXQuZ2V0VGltZSgpIT09dC5jcmVhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKGUudHlwZSE9PXQudHlwZSlyZXR1cm4hMTtpZighc2EoZS5waWQsdC5waWQpKXJldHVybiExO2lmKCFuYShlLnRhZ3MsdC50YWdzKSlyZXR1cm4hMTtyZXR1cm4gaWEoZS5ib2R5LHQuYm9keSl9ZnVuY3Rpb24gbmEoZSx0KXtpZihlPT09dClyZXR1cm4hMDtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiExO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gc2EoZSx0KXtpZihlPT09dm9pZCAwJiZ0PT09dm9pZCAwKXJldHVybiEwO2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuITE7cmV0dXJuIFkoZSx0KX1mdW5jdGlvbiBpYShlLHQpe2lmKE9iamVjdC5pcyhlLHQpKXJldHVybiEwO2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZ0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gWShlLHQpO2lmKGUgaW5zdGFuY2VvZiBEYXRlJiZ0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTt0cnl7cmV0dXJuIFkoT2UoZSksT2UodCkpfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiB5bihlLHQpe2xldCByPWUudXBkYXRlZEF0LmdldFRpbWUoKSxuPXQudXBkYXRlZEF0LmdldFRpbWUoKTtpZihyIT09bilyZXR1cm4gcj5uO3JldHVybiBlLmN0cj50LmN0cn1mdW5jdGlvbiBlaShlKXtpZihlPT09dm9pZCAwKXJldHVybjtyZXR1cm57dDplLnVwZGF0ZWRBdC5nZXRUaW1lKCksY3RyOmUuY3RyfX1mdW5jdGlvbiBvYShlLHQpe2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuIGU9PT10O3JldHVybiBlLnQ9PT10LnQmJmUuY3RyPT09dC5jdHJ9ZnVuY3Rpb24gYWEoZSx0KXtsZXQgcj1uZXcgU2V0LG49W107Zm9yKGxldCBzIG9mIHQpe2xldCBpPVIocy5laWQpLG89ZS5lbnRzLmdldChpKSxbYSxjXT1aZShvLHMpO2lmKGMhPT0wKXtuLnB1c2goYyk7Y29udGludWV9aWYoYT09PXZvaWQgMCl7bi5wdXNoKDEyKTtjb250aW51ZX1mb3IobGV0IHUgb2YgZXQobyxhKSlyLmFkZCh1KTtlLnB1dChhKSxuLnB1c2goMCl9cmV0dXJue3N0YXRzOm4sdHlwZXM6cn19dmFyIG5yPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQuaGFuZGxlKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyU3RyaW5nKHQubGFiZWwpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiBlLndyaXRlVmFySW50KHQuaWR4Pz8wKX0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhclN0cmluZygpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWUucmVhZFZhclN0cmluZygpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBkKG8pO3JldHVybiBwKHtoYW5kbGU6dCxsYWJlbDpuLGlkeDppfSl9fTt2YXIgbW49e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJJbnQodC5ob3N0cy5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO2ZvcihsZXQgbiBvZiB0Lmhvc3RzKXtsZXQgcz1lLndyaXRlU3RydWN0KG5yLG4pO2lmKHMhPT0wKXJldHVybiBzfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMHx8dDwwKXJldHVybiBkKDEwKTtsZXQgbj1bXTtmb3IobGV0IHM9MDtzPHQ7cysrKXtsZXRbaSxvXT1lLnJlYWRTdHJ1Y3QobnIpO2lmKG8hPT0wKXJldHVybiBkKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGQoMTQpO24ucHVzaChpKX1yZXR1cm4gcCh7aG9zdHM6bn0pfX07dmFyIGNhPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5xcnBhaXIudjEiKSxFdD0zMixkYT1FdCsyNCsxNix1YT0zMixxeT1TeW1ib2woIkRIS0VSZXEiKSxGeT1TeW1ib2woIkRIS0VSZXNwIik7ZnVuY3Rpb24gbmkoZSl7aWYoZS5ieXRlTGVuZ3RoIT09RXQpcmV0dXJuIGQoMTApO3JldHVybiBwKGUpfWZ1bmN0aW9uIHNpKGUpe2lmKGUuYnl0ZUxlbmd0aDxkYSlyZXR1cm4gZCgxMCk7cmV0dXJuIHAoZSl9dmFyIHNyPW5ldyBxZTthc3luYyBmdW5jdGlvbiBnbihlLHQscixuKXtsZXQgczt0cnl7cz1hd2FpdCBzci54MjU1MTlTaGFyZWQoZSx0KX1jYXRjaHtyZXR1cm4gZCgyOSl9dHJ5e2lmKHMuYnl0ZUxlbmd0aCE9PUV0fHxzLmV2ZXJ5KChhKT0+YT09PTApKXJldHVybiBkKDEwKTtsZXQgaT1iZShzLGNhKSxvPWJlKGksYmUocixuKSk7dHJ5e2xldCBhPWF3YWl0IHNyLmJsYWtlMyhvKTtyZXR1cm4gcChhLnNsaWNlKDAsdWEpKX1maW5hbGx5e2kuZmlsbCgwKSxvLmZpbGwoMCl9fWZpbmFsbHl7cy5maWxsKDApfX1jbGFzcyBpcnsjZTsjdDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuI2U9ZSx0aGlzLiN0PXR9c3RhdGljIGFzeW5jIGNyZWF0ZSgpe2xldCBlO3RyeXtsZXQgdD1hd2FpdCBzci5nZW5YMjU1MTkoKTtlPXQucHJpdjtsZXRbcixuXT1uaSh0LnB1Yik7aWYobiE9PTApcmV0dXJuIGQobik7aWYocj09PXZvaWQgMClyZXR1cm4gZCgxMCk7bGV0IHM9bmV3IGlyKGUscik7cmV0dXJuIGU9dm9pZCAwLHAocyl9Y2F0Y2h7cmV0dXJuIGQoMjkpfWZpbmFsbHl7ZT8uZmlsbCgwKX19d2lwZSgpe3RoaXMuI2UuZmlsbCgwKX1nZXQgZGhrZVJlcSgpe2xldFtlLHRdPW5pKHRoaXMuI3Quc2xpY2UoKSk7aWYoZT09PXZvaWQgMCl0aHJvdyBFcnJvcihgZGhrZVJlcSAke3R9YCk7cmV0dXJuIGV9YXN5bmMgZmluaXNoKGUpe2xldCB0PWUuc3ViYXJyYXkoMCxFdCkscj1lLnN1YmFycmF5KEV0KSxbbixzXT1hd2FpdCBnbih0aGlzLiNlLHQsdGhpcy4jdCx0KTtpZihzIT09MClyZXR1cm4gZChzKTtpZihuPT09dm9pZCAwKXJldHVybiBkKDEyKTtsZXQgaTt0cnl7dHJ5e2k9YXdhaXQgc3IuZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChyLG4pfWNhdGNoe3JldHVybiBkKDIwKX1sZXRbbyxhXT1vZS5mcm9tUGFpclBsYWluKGkpO2lmKGEhPT0wKXJldHVybiBkKGEpO2lmKG89PT12b2lkIDApcmV0dXJuIGQoMTIpO3JldHVybiB0aGlzLndpcGUoKSxwKG8pfWZpbmFsbHl7bi5maWxsKDApLGk/LmZpbGwoMCl9fX1mdW5jdGlvbiB2ZShlKXtsZXQgdD1uZXcgVWludDhBcnJheShlKTtpZihlPjApY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh0KTtyZXR1cm4gdH12YXIgRmU9MzIsb3I9IkRJUExPTUFUSUMiLEVlPSJwdWJsaWMta2V5IixsYT0tNyxmYT0tOCxwYT0tMjU3LGFyPVt7dHlwZTpFZSxhbGc6bGF9LHt0eXBlOkVlLGFsZzpmYX0se3R5cGU6RWUsYWxnOnBhfV07ZnVuY3Rpb24gaGEoZSl7cmV0dXJuIGUudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXC4kLywiIil8fCJsb2NhbGhvc3QifWZ1bmN0aW9uIE1lKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGUuYnl0ZUxlbmd0aCk7cmV0dXJuIHQuc2V0KGUpLHQuYnVmZmVyfWZ1bmN0aW9uIGNyKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSkuc2xpY2UoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkuc2xpY2UoKX1mdW5jdGlvbiBXZShlKXtpZihlPy5ycElkIT09dm9pZCAwKXJldHVybiBwKGUucnBJZCk7aWYodHlwZW9mIGxvY2F0aW9uPiJ1IilyZXR1cm4gZCg5KTtyZXR1cm4gcChoYShsb2NhdGlvbi5ob3N0bmFtZSkpfXZhciBpaT0iIjtmdW5jdGlvbiBSZShlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe2lpPWUubWVzc2FnZT09PSIiP2UubmFtZTpgJHtlLm5hbWV9OiAke2UubWVzc2FnZX1gO3JldHVybn1paT1TdHJpbmcoZSl9ZnVuY3Rpb24gZHIoZSl7aWYoIShlIGluc3RhbmNlb2YgRXJyb3IpKXJldHVybiExO3JldHVybiBlLm5hbWU9PT0iTm90QWxsb3dlZEVycm9yIiYmZS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImRvZXMgbm90IGhhdmUgZm9jdXMiKX1mdW5jdGlvbiBvaSgpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuITA7cmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSE9PSJoaWRkZW4ifWZ1bmN0aW9uIGR0KCl7aWYodHlwZW9mIGdsb2JhbFRoaXMuZm9jdXMhPT0iZnVuY3Rpb24iKXJldHVybjt0cnl7Z2xvYmFsVGhpcy5mb2N1cygpfWNhdGNoe319ZnVuY3Rpb24gdXIoZT0yNTAwKXtpZihvaSgpKXJldHVybiBkdCgpLFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBuZXcgUHJvbWlzZSgodCk9PntsZXQgcj0oKT0+e2NsZWFyVGltZW91dChzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKSxkdCgpLHQoKX0sbj0oKT0+e2lmKG9pKCkpcigpfSxzPXNldFRpbWVvdXQocixlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKSxuKCl9KX1hc3luYyBmdW5jdGlvbiBscihlKXthd2FpdCB1cigpO3RyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShlKX1jYXRjaCh0KXtpZighZHIodCkpdGhyb3cgdDtyZXR1cm4gZHQoKSxhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKGUpfX1hc3luYyBmdW5jdGlvbiBmcihlKXthd2FpdCB1cigpO3RyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChlKX1jYXRjaCh0KXtpZighZHIodCkpdGhyb3cgdDtyZXR1cm4gZHQoKSxhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KGUpfX1mdW5jdGlvbiB6ZSgpe2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUifHwhbmF2aWdhdG9yLmNyZWRlbnRpYWxzfHx0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbD4idSIpcmV0dXJuIDI0O3JldHVybiAwfWZ1bmN0aW9uIFhlKGUpe2lmKGU9PT1udWxsfHxlLnR5cGUhPT1FZXx8ISgicmF3SWQiaW4gZSl8fHR5cGVvZiBlLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMhPT0iZnVuY3Rpb24iKXJldHVybiBkKDI3KTtyZXR1cm4gcChlKX1mdW5jdGlvbiBibihlKXtpZihlPT09InBsYXRmb3JtInx8ZT09PSJjcm9zcy1wbGF0Zm9ybSIpcmV0dXJuIGU7cmV0dXJufWZ1bmN0aW9uIGNpKGUpe2lmKC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChlKSlyZXR1cm4iaW9zIjtpZigvQW5kcm9pZC9pLnRlc3QoZSkpcmV0dXJuImFuZHJvaWQiO2lmKC9NYWMgT1MgWHxNYWNpbnRvc2gvaS50ZXN0KGUpKXJldHVybiJtYWNvcyI7aWYoL1dpbmRvd3MvaS50ZXN0KGUpKXJldHVybiJ3aW5kb3dzIjtpZigvTGludXgvaS50ZXN0KGUpKXJldHVybiJsaW51eCI7cmV0dXJuIm90aGVyIn1mdW5jdGlvbiB3bihlKXtsZXQgdD1lLnJlc3BvbnNlO2lmKCEoImdldFRyYW5zcG9ydHMiaW4gdCkpcmV0dXJuO2xldCByPXQuZ2V0VHJhbnNwb3J0cztpZih0eXBlb2YgciE9PSJmdW5jdGlvbiIpcmV0dXJuO2xldCBuPXIuY2FsbCh0KTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm47bGV0IHM9W107Zm9yKGxldCBpIG9mIG4paWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmaS5sZW5ndGg+MClzLnB1c2goaSk7cmV0dXJuIHMubGVuZ3RoPT09MD92b2lkIDA6c312YXIgeWE9MzIsbWE9NjQsU249MzcsYWk9MTY7ZnVuY3Rpb24gZGkoZSl7bGV0IHQ9ZS5yZXNwb25zZTtpZighKCJnZXRBdXRoZW50aWNhdG9yRGF0YSJpbiB0KSlyZXR1cm47bGV0IHI9dC5nZXRBdXRoZW50aWNhdG9yRGF0YTtpZih0eXBlb2YgciE9PSJmdW5jdGlvbiIpcmV0dXJuO2xldCBuPXIuY2FsbCh0KTtpZighKG4gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuO2xldCBzPW5ldyBVaW50OEFycmF5KG4pO2lmKHMuYnl0ZUxlbmd0aDxTbithaSlyZXR1cm47bGV0IGk9c1t5YV07aWYoaT09PXZvaWQgMHx8KGkmbWEpPT09MClyZXR1cm47cmV0dXJuIHMuc2xpY2UoU24sU24rYWkpfWFzeW5jIGZ1bmN0aW9uIHVpKGUpe2xldCB0PXplKCk7aWYodCE9PTApcmV0dXJuIGQodCk7bGV0W3Isbl09V2UoZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocj09PXZvaWQgMClyZXR1cm4gZCg5KTtsZXQgcz1lPy51c2VyTmFtZT8/ZT8ucnBOYW1lPz9yLGk9e3Jlc2lkZW50S2V5OiJyZXF1aXJlZCIscmVxdWlyZVJlc2lkZW50S2V5OiEwLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIn07aWYoZT8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQhPT12b2lkIDApaS5hdXRoZW50aWNhdG9yQXR0YWNobWVudD1lLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50O2xldCBvPXtsYXJnZUJsb2I6e3N1cHBvcnQ6InJlcXVpcmVkIn19LGE7dHJ5e2E9YXdhaXQgbHIoe3B1YmxpY0tleTp7Y2hhbGxlbmdlOnZlKEZlKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/b3J9LHVzZXI6e2lkOnZlKDE2KSxuYW1lOnMsZGlzcGxheU5hbWU6c30scHViS2V5Q3JlZFBhcmFtczphcixhdXRoZW50aWNhdG9yU2VsZWN0aW9uOmksZXh0ZW5zaW9uczpvLC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fX19KX1jYXRjaChmKXtyZXR1cm4gUmUoZiksZCgzMCl9bGV0W2MsdV09WGUoYSk7aWYodSE9PTApcmV0dXJuIGQodSk7aWYoYz09PXZvaWQgMClyZXR1cm4gZCgyNyk7aWYoYy5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iPy5zdXBwb3J0ZWQhPT0hMClyZXR1cm4gZCgzMCk7cmV0dXJuIHAobmV3IFVpbnQ4QXJyYXkoYy5yYXdJZCkpfWFzeW5jIGZ1bmN0aW9uIEluKGUsdCxyLG4pe2xldCBzPXtjaGFsbGVuZ2U6dmUoRmUpLHJwSWQ6ZSx1c2VyVmVyaWZpY2F0aW9uOiJwcmVmZXJyZWQifTtpZih0Py5oaW50cyE9PXZvaWQgMClzLmhpbnRzPXQuaGludHM7aWYociE9PXZvaWQgMClzLmFsbG93Q3JlZGVudGlhbHM9W3t0eXBlOkVlLGlkOk1lKHIpfV07aWYobiE9PXZvaWQgMClzLmV4dGVuc2lvbnM9bjtsZXQgaTt0cnl7aT1hd2FpdCBmcih7cHVibGljS2V5OnN9KX1jYXRjaChjKXtyZXR1cm4gUmUoYyksZCgzMCl9bGV0W28sYV09WGUoaSk7aWYoYSE9PTApcmV0dXJuIGQoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gZCgyNyk7cmV0dXJuIHAobyl9YXN5bmMgZnVuY3Rpb24gbGkoZSx0KXtsZXQgcj16ZSgpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPVdlKHQpO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoOSk7bGV0IGk9ZTtpZihpPT09dm9pZCAwKXtsZXRbZixoXT1hd2FpdCBJbihuLHQpO2lmKGghPT0wJiZ0Py5oaW50cyE9PXZvaWQgMClbZixoXT1hd2FpdCBJbihuLHtycElkOnQucnBJZCxycE5hbWU6dC5ycE5hbWV9KTtpZihoIT09MClyZXR1cm4gZChoKTtpZihmPT09dm9pZCAwKXJldHVybiBkKDI3KTtpPW5ldyBVaW50OEFycmF5KGYucmF3SWQpfWxldFtvLGFdPWF3YWl0IEluKG4sdCxpLHtsYXJnZUJsb2I6e3JlYWQ6ITB9fSk7aWYoYSE9PTApcmV0dXJuIGQoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gZCgyNyk7bGV0IHU9by5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iO2lmKHU9PT12b2lkIDB8fHUuYmxvYj09PXZvaWQgMClyZXR1cm4gZCg3KTtsZXQgbD1jcih1LmJsb2IpO2lmKGwuYnl0ZUxlbmd0aD09PTApcmV0dXJuIGQoNyk7cmV0dXJuIHAoe2Jsb2I6bCxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkoby5yYXdJZCl9KX12YXIgeG49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJkaXBsb21hdGljLnByZi52MSIpLEF0PSJkaXBsb21hdGljLXByZiI7dmFyIHByPSIiO3ZhciB5cj10eXBlb2YgZ2xvYmFsVGhpcy5Xb3JrZXI9PT0iZnVuY3Rpb24iP2dsb2JhbFRoaXMuV29ya2VyOnZvaWQgMCxFbj15cj09PXZvaWQgMD92b2lkIDA6eXIucHJvdG90eXBlLnBvc3RNZXNzYWdlLGhyO2Z1bmN0aW9uIFNhKCl7aWYodHlwZW9mIHByIT09InN0cmluZyJ8fHByLmxlbmd0aD09PTApdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSB3b3JrZXIgc291cmNlIG5vdCBlbWJlZGRlZDsgcnVuIHBrZyBidWlsZCBiZWZvcmUgc3Bhd24iKTtyZXR1cm4gYXRvYihwcil9ZnVuY3Rpb24gYmEoKXtpZihociE9PXZvaWQgMClyZXR1cm4gaHI7bGV0IGU9bmV3IEJsb2IoW1NhKCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSk7cmV0dXJuIGhyPVVSTC5jcmVhdGVPYmplY3RVUkwoZSksaHJ9ZnVuY3Rpb24gZmkoKXtpZih5cj09PXZvaWQgMCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIFdvcmtlciBBUEkgdW5hdmFpbGFibGU7IGNhbm5vdCBzcGF3biBzeW5jIHdvcmtlciIpO3JldHVybiBuZXcgeXIoYmEoKSx7dHlwZToibW9kdWxlIn0pfWZ1bmN0aW9uIHBpKGUsdCxyKXtpZihFbj09PXZvaWQgMCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIFdvcmtlciBBUEkgdW5hdmFpbGFibGU7IGNhbm5vdCBwb3N0IHRvIHN5bmMgd29ya2VyIik7aWYociE9PXZvaWQgMCYmci5sZW5ndGg+MClFbi5jYWxsKGUsdCx7dHJhbnNmZXI6cn0pO2Vsc2UgRW4uY2FsbChlLHQpfXZhciB3YT1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoImRpcGxvbWF0aWMuYmluZC52MSIpLEFuPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5iaW5kdGFnLnYxIiksSWE9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJESVBMT01BVElDIFNFRUQgRklOR0VSUFJJTlQiKSx4YT0zMixFYT0zMixBYT0xNixQYT0zMixuZT1uZXcgcWU7ZnVuY3Rpb24gVWEoZSl7cmV0dXJuIGUubWFwKCh0KT0+KHtoYW5kbGU6dC5oYW5kbGUsbGFiZWw6dC5sYWJlbCxpZHg6dC5pZHg/PzB9KSl9ZnVuY3Rpb24gaGkoZSl7aWYoZS5ieXRlTGVuZ3RoPT09MHx8ZS5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gZCgyMik7aWYoZS5ieXRlTGVuZ3RoPHdlKzEpcmV0dXJuIGQoMTQpO2xldCB0PWUuc3ViYXJyYXkoMCx3ZSk7aWYodC5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gZCgyMik7bGV0IHI9bmV3IE4oZS5zdWJhcnJheSh3ZSkpLFtuLHNdPXIucmVhZFN0cnVjdChtbik7aWYocyE9PTApcmV0dXJuIGQocyk7aWYobj09PXZvaWQgMClyZXR1cm4gZCgxNCk7aWYoIXIuZG9uZSgpKXJldHVybiBkKDE0KTtsZXRbaSxvXT1vZS5mcm9tQnl0ZXModCk7aWYobyE9PTApcmV0dXJuIGQobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gZCgxMik7cmV0dXJuIHAoe2VuY2xhdmU6aSxob3N0czpuLmhvc3RzLm1hcCgoYSk9Pih7Li4uYX0pKX0pfWFzeW5jIGZ1bmN0aW9uIHlpKGUsdCxyKXtsZXQgbj16ZSgpO2lmKG4hPT0wKXJldHVybiBuO2xldFtzLGldPVdlKHIpO2lmKGkhPT0wKXJldHVybiBpO2lmKHM9PT12b2lkIDApcmV0dXJuIDk7YXdhaXQgdXIoKTtsZXQgbz1uZXcgVWludDhBcnJheSh0LmJ5dGVMZW5ndGgpO28uc2V0KHQpO2xldCBhPXtsYXJnZUJsb2I6e3dyaXRlOm8uYnVmZmVyfX0sYz17cHVibGljS2V5OntjaGFsbGVuZ2U6dmUoRmUpLHJwSWQ6cyxhbGxvd0NyZWRlbnRpYWxzOlt7dHlwZTpFZSxpZDpNZShlKX1dLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOmEsLi4ucj8uaGludHMhPT12b2lkIDA/e2hpbnRzOnIuaGludHN9Ont9fX0sdTt0cnl7dHJ5e3U9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChjKX1jYXRjaCh5KXtpZighZHIoeSkpdGhyb3cgeTtkdCgpLHU9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChjKX19Y2F0Y2goeSl7cmV0dXJuIFJlKHkpLDMwfWZpbmFsbHl7by5maWxsKDApfWxldFtsLGZdPVhlKHUpO2lmKGYhPT0wKXJldHVybiBmO2lmKGw9PT12b2lkIDApcmV0dXJuIDI3O2lmKGwuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8ud3JpdHRlbiE9PSEwKXJldHVybiAzMDtyZXR1cm4gMH12YXIgUG49MzI7ZnVuY3Rpb24ga2EoZSl7aWYoZT09PXZvaWQgMClyZXR1cm5bXTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm5bZV07cmV0dXJuIGUuZmlsdGVyKCh0KT0+dC5ieXRlTGVuZ3RoPjApfWZ1bmN0aW9uIEJhKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEVycm9yKSlyZXR1cm4hMTtyZXR1cm4gZS5uYW1lPT09Ik5vdFN1cHBvcnRlZEVycm9yInx8ZS5uYW1lPT09IlR5cGVFcnJvciJ9ZnVuY3Rpb24gU2koZSl7aWYoZT09PXZvaWQgMClyZXR1cm47bGV0IHQ9Y3IoZSk7aWYodC5ieXRlTGVuZ3RoPFBuKXt0LmZpbGwoMCk7cmV0dXJufWlmKHQuYnl0ZUxlbmd0aD09PVBuKXJldHVybiB0O2xldCByPXQuc2xpY2UoMCxQbik7cmV0dXJuIHQuZmlsbCgwKSxyfWFzeW5jIGZ1bmN0aW9uIHZhKGUpe2xldCB0PXplKCk7aWYodCE9PTApcmV0dXJuIGQodCk7bGV0W3Isbl09V2UoZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocj09PXZvaWQgMClyZXR1cm4gZCg5KTtsZXQgcz1lPy51c2VyTmFtZT8/QXQsaT1lPy5kaXNwbGF5TmFtZT8/cyxvPXZlKDE2KSxhPWU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PT09ImNyb3NzLXBsYXRmb3JtIixjPXtyZXNpZGVudEtleTphPyJkaXNjb3VyYWdlZCI6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6IWEsdXNlclZlcmlmaWNhdGlvbjphPyJwcmVmZXJyZWQiOiJyZXF1aXJlZCJ9O2lmKGU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50IT09dm9pZCAwKWMuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ9ZS5hdXRoZW50aWNhdG9yQXR0YWNobWVudDtsZXQgdT17Y2hhbGxlbmdlOnZlKEZlKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/b3J9LHVzZXI6e2lkOm8sbmFtZTpzLGRpc3BsYXlOYW1lOml9LHB1YktleUNyZWRQYXJhbXM6YXIsYXV0aGVudGljYXRvclNlbGVjdGlvbjpjLC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fSwuLi5lPy5leGNsdWRlQ3JlZGVudGlhbHMhPT12b2lkIDAmJmUuZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aD4wP3tleGNsdWRlQ3JlZGVudGlhbHM6ZS5leGNsdWRlQ3JlZGVudGlhbHMubWFwKCh3KT0+KHt0eXBlOkVlLGlkOk1lKHcpfSkpfTp7fX0sbD1lPy5zYWx0IT09dm9pZCAwP01lKGUuc2FsdCk6dm9pZCAwLGY9KHcpPT5scih7cHVibGljS2V5OnsuLi51LGV4dGVuc2lvbnM6dyYmbCE9PXZvaWQgMD97cHJmOntldmFsOntmaXJzdDpsfX19OntwcmY6e319fX0pLGg7dHJ5e2g9YXdhaXQgZihsIT09dm9pZCAwKX1jYXRjaCh3KXtpZihsPT09dm9pZCAwfHwhQmEodykpcmV0dXJuIFJlKHcpLGQoMzApO3RyeXtoPWF3YWl0IGYoITEpfWNhdGNoKHgpe3JldHVybiBSZSh4KSxkKDMwKX19bGV0W3ksZ109WGUoaCk7aWYoZyE9PTApcmV0dXJuIGQoZyk7aWYoeT09PXZvaWQgMClyZXR1cm4gZCgyNyk7bGV0IG09eS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksUz1TaShtLnByZj8ucmVzdWx0cz8uZmlyc3QpLEU9bS5wcmY/LmVuYWJsZWQ9PT0hMHx8UyE9PXZvaWQgMDtpZihhJiZTIT09dm9pZCAwKVMuZmlsbCgwKTtyZXR1cm4gcCh7Y3JlZElkOm5ldyBVaW50OEFycmF5KHkucmF3SWQpLHVzZXJJZDpuZXcgVWludDhBcnJheShvKSxwcmZFbmFibGVkOkUscHJmOmE/dm9pZCAwOlMsYXR0YWNobWVudDpibih5LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOnduKHkpLGFhZ3VpZDpkaSh5KX0pfWFzeW5jIGZ1bmN0aW9uIG1pKGUpe2xldCB0PXplKCk7aWYodCE9PTApcmV0dXJuIGQodCk7bGV0W3Isbl09V2UoZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocj09PXZvaWQgMClyZXR1cm4gZCg5KTtsZXQgcz1lPy5zYWx0Pz94bixpPU1lKHMpLG89e2NoYWxsZW5nZTp2ZShGZSkscnBJZDpyLHVzZXJWZXJpZmljYXRpb246InByZWZlcnJlZCIsZXh0ZW5zaW9uczp7cHJmOntldmFsOntmaXJzdDppfX19fTtpZihlPy5oaW50cyE9PXZvaWQgMClvLmhpbnRzPWUuaGludHM7bGV0IGE9a2EoZT8uY3JlZElkKTtpZihhLmxlbmd0aD4wKW8uYWxsb3dDcmVkZW50aWFscz1hLm1hcCgoeSk9Pih7dHlwZTpFZSxpZDpNZSh5KX0pKTtsZXQgYzt0cnl7Yz1hd2FpdCBmcih7cHVibGljS2V5Om99KX1jYXRjaCh5KXtyZXR1cm4gUmUoeSksZCgzMCl9bGV0W3UsbF09WGUoYyk7aWYobCE9PTApcmV0dXJuIGQobCk7aWYodT09PXZvaWQgMClyZXR1cm4gZCgyNyk7bGV0IGY9dS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkucHJmPy5yZXN1bHRzO2lmKGY/LmZpcnN0PT09dm9pZCAwKXJldHVybiBkKDcpO2xldCBoPVNpKGYuZmlyc3QpO2lmKGg9PT12b2lkIDApcmV0dXJuIGQoMjcpO3JldHVybiBwKHtwcmY6aCxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkodS5yYXdJZCksYXR0YWNobWVudDpibih1LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOnduKHUpfSl9ZnVuY3Rpb24gVW4oZSl7aWYoZS5ieXRlTGVuZ3RoIT09d2UpcmV0dXJuIGQoMTApO3JldHVybltlLDBdfWNsYXNzIG9leyNlO2NvbnN0cnVjdG9yKGUpe3RoaXMuI2U9ZX1zdGF0aWMgYXN5bmMgZnJvbVJhbmRvbShlKXtpZihlLmJ5dGVMZW5ndGg8UGEpcmV0dXJuIGQoMTApO2xldCB0PWF3YWl0IG5lLmdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKSxyPWJlKHQsZSk7dHJ5e2xldCBuPWF3YWl0IG5lLmJsYWtlMyhyKSxbcyxpXT1VbihuKTtpZihpIT09MClyZXR1cm4gZChpKTtpZihzPT09dm9pZCAwKXJldHVybiBkKDEyKTtyZXR1cm4gcChuZXcgb2UocykpfWZpbmFsbHl7dC5maWxsKDApLHIuZmlsbCgwKSxlLmZpbGwoMCl9fXN0YXRpYyBmcm9tQnl0ZXMoZSl7bGV0W3Qscl09VW4oZSk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMClyZXR1cm4gZCgxMCk7bGV0W24sc109VW4odC5zbGljZSgpKTtpZihzIT09MClyZXR1cm4gZChzKTtpZihuPT09dm9pZCAwKXJldHVybiBkKDEwKTtyZXR1cm4gcChuZXcgb2UobikpfWFzeW5jIHNlYWxXaXRoUGFzc2tleShlKXtsZXQgdD1lPy5zYWx0Pz94bixyPWU/LmNyZWRJZCxuPXIscz1lPy5jcmVhdGVDcmVkSWZOZWVkZWQ9PT0hMCYmKHI9PT12b2lkIDB8fCEociBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpJiZyLmxlbmd0aD09PTApLGksbztpZihzKXtsZXRbbCxmXT1hd2FpdCB2YSh7cnBJZDplPy5ycElkLHJwTmFtZTplPy5ycE5hbWUsdXNlck5hbWU6ZT8udXNlck5hbWU/P0F0LGRpc3BsYXlOYW1lOmU/LmRpc3BsYXlOYW1lLGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OmU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50LGhpbnRzOmU/LmhpbnRzLGV4Y2x1ZGVDcmVkZW50aWFsczplPy5leGNsdWRlQ3JlZGVudGlhbHMsc2FsdDp0fSk7aWYoZiE9PTApcmV0dXJuIGQoZik7aWYobD09PXZvaWQgMClyZXR1cm4gZCgzMCk7aWYoIWwucHJmRW5hYmxlZClyZXR1cm4gZCgzMCk7bj1sLmNyZWRJZCxpPWwsbz1sLnByZn1sZXQgYT1hc3luYyhsLGYsaCx5KT0+e3RyeXtsZXRbZyxtXT1hd2FpdCB0aGlzLiNyKGwpO2lmKG0hPT0wKXJldHVybiBkKG0pO2lmKGc9PT12b2lkIDApcmV0dXJuIGQoMTIpO3JldHVybiBwKHtzZWFsZWRNYXN0ZXI6ZyxzYWx0OnQuc2xpY2UoKSxjcmVkSWQ6Zi5zbGljZSgpLHVzZXJJZDppPy51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmkudXNlcklkLnNsaWNlKCksYXR0YWNobWVudDpoPz9pPy5hdHRhY2htZW50LHRyYW5zcG9ydHM6eT8/aT8udHJhbnNwb3J0cyxhYWd1aWQ6aT8uYWFndWlkPT09dm9pZCAwP3ZvaWQgMDppLmFhZ3VpZC5zbGljZSgpfSl9ZmluYWxseXtsLmZpbGwoMCl9fTtpZihvIT09dm9pZCAwJiZpIT09dm9pZCAwKXJldHVybiBhKG8saS5jcmVkSWQsaS5hdHRhY2htZW50LGkudHJhbnNwb3J0cyk7bGV0W2MsdV09YXdhaXQgbWkoe3JwSWQ6ZT8ucnBJZCxycE5hbWU6ZT8ucnBOYW1lLGNyZWRJZDpuLHNhbHQ6dCxoaW50czplPy5oaW50c30pO2lmKHUhPT0wKXJldHVybiBkKHUpO2lmKGM9PT12b2lkIDApcmV0dXJuIGQoNyk7cmV0dXJuIGEoYy5wcmYsYy5jcmVkSWQsYy5hdHRhY2htZW50LGMudHJhbnNwb3J0cyl9YXN5bmMgYmluZChlLHQpe2lmKHQhPT12b2lkIDApe2ZvcihsZXQgaSBvZiB0KWlmKCFhd2FpdCB0aGlzLiNzKGkuY3JlZElkLGkudGFnKSlyZXR1cm4gZCgxMCl9bGV0W3Isbl09YXdhaXQgdGhpcy5zZWFsV2l0aFBhc3NrZXkoZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocj09PXZvaWQgMClyZXR1cm4gZCgxMik7bGV0IHM9YXdhaXQgdGhpcy4jbihyLmNyZWRJZCk7cmV0dXJuIHAoey4uLnIsdGFnOnN9KX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aFBhc3NrZXkoZSx0KXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGQoMjIpO2xldCByPVtdO2ZvcihsZXQgYSBvZiBlKWlmKGEuY3JlZElkLmJ5dGVMZW5ndGg+MClyLnB1c2goYS5jcmVkSWQpO2xldFtuLHNdPWF3YWl0IG1pKHtycElkOnQucnBJZCxycE5hbWU6dC5ycE5hbWUsaGludHM6dC5oaW50cyxjcmVkSWQ6ci5sZW5ndGg+MD9yOnZvaWQgMCxzYWx0OnQuc2FsdH0pO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoNyk7bGV0IGk9ZS5maW5kKChhKT0+WShhLmNyZWRJZCxuLmNyZWRJZCkpLG89aT09PXZvaWQgMD9lOltpLC4uLmUuZmlsdGVyKChhKT0+YSE9PWkpXTt0cnl7Zm9yKGxldCBhIG9mIG8pe2xldFtjXT1hd2FpdCBvZS4jaShhLnNlYWxlZE1hc3RlcixuLnByZik7aWYoYyE9PXZvaWQgMClyZXR1cm4gcCh7ZW5jbGF2ZTpjLGNyZWRJZDpuLmNyZWRJZC5zbGljZSgpfSl9cmV0dXJuIGQoMjApfWZpbmFsbHl7bi5wcmYuZmlsbCgwKX19YXN5bmMgc2VhbFdpdGhJa20oZSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLiNyKGUpfWZpbmFsbHl7ZS5maWxsKDApfX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aElrbShlLHQpe3RyeXtyZXR1cm4gYXdhaXQgb2UuI2koZSx0KX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMgcGVyc2lzdFRvTGFyZ2VCbG9iKGU9W10sdCl7bGV0IHI9dD8uY3JlZElkO2lmKHI9PT12b2lkIDApe2xldFtpLG9dPWF3YWl0IHVpKHQpO2lmKG8hPT0wKXJldHVybiBkKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGQoMzApO3I9aX1sZXRbbixzXT10aGlzLiNjKGUpO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoMTIpO3RyeXtsZXQgaT1hd2FpdCB5aShyLG4sdCk7aWYoaSE9PTApcmV0dXJuIGQoaSk7cmV0dXJuIHAocil9ZmluYWxseXtuLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBmcm9tTGFyZ2VCbG9iKGUpe2xldFt0LHJdPWF3YWl0IGxpKGU/LmNyZWRJZCxlKTtpZihyIT09MClyZXR1cm4gZChyKTtpZih0PT09dm9pZCAwKXJldHVybiBkKDcpO3RyeXtsZXRbbixzXT1oaSh0LmJsb2IpO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoMTIpO3JldHVybiBwKHsuLi5uLGNyZWRJZDp0LmNyZWRJZH0pfWZpbmFsbHl7dC5ibG9iLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBjbGVhckxhcmdlQmxvYihlLHQpe3JldHVybiB5aShlLG5ldyBVaW50OEFycmF5KHdlKSx0KX1hc3luYyBkdW1wVG9UdHkoKXtyZXR1cm4gMjF9c3RhdGljIGZyb21QYWlyUGxhaW4oZSl7cmV0dXJuIGhpKGUpfXN0YXRpYyBwYWlyUmVxdWVzdCgpe3JldHVybiBpci5jcmVhdGUoKX1hc3luYyBwYWlyQWNjZXB0KGUsdCl7bGV0IHI7dHJ5e3I9YXdhaXQgbmUuZ2VuWDI1NTE5KCl9Y2F0Y2h7cmV0dXJuIGQoMjkpfXRyeXtsZXRbbixzXT1hd2FpdCBnbihyLnByaXYsZSxlLHIucHViKTtpZihzIT09MClyZXR1cm4gZChzKTtpZihuPT09dm9pZCAwKXJldHVybiBkKDEyKTt0cnl7bGV0W2ksb109dGhpcy4jYyh0KTtpZihvIT09MClyZXR1cm4gZChvKTtpZihpPT09dm9pZCAwKXJldHVybiBkKDEyKTt0cnl7bGV0IGE9YXdhaXQgbmUuZW5jcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChpLG4pO3JldHVybiBzaShiZShyLnB1YixhKSl9Y2F0Y2h7cmV0dXJuIGQoMTIpfWZpbmFsbHl7aS5maWxsKDApfX1maW5hbGx5e24uZmlsbCgwKX19ZmluYWxseXtyLnByaXYuZmlsbCgwKX19c3Bhd25TeW5jV29ya2VyKGUpe2xldCB0PWZpKCkscj10aGlzLiNlLnNsaWNlKCk7cmV0dXJuIHBpKHQse2lkOmUuaWQsb3A6InNldFNlZWQiLHNlZWQ6cixwZXJzaXN0OmUucGVyc2lzdH0sW3IuYnVmZmVyXSksdH1kZXJpdmVDaXBoZXIoZSx0KXtsZXQgcj1lLnNsaWNlKCksbj0obyk9PnRoaXMuI2QocixvKSxzPShvKT0+dGhpcy4jdShyLG8pO3JldHVybntlbmNyeXB0Ok9iamVjdC5mcmVlemUoe2VuY3J5cHQ6bn0pLGRlY3J5cHQ6T2JqZWN0LmZyZWV6ZSh7ZGVjcnlwdDpzfSksYm90aDpPYmplY3QuZnJlZXplKHtlbmNyeXB0Om4sZGVjcnlwdDpzfSl9W3RdfWFzeW5jIGRlcml2ZUlkZW50aXR5KGUsdD0wKXtsZXQgcj1lLG49dCxzPWF3YWl0IHRoaXMuI2EocixuKSxpPXMucHVibGljS2V5O3JldHVybiBzLnByaXZhdGVLZXkuZmlsbCgwKSxPYmplY3QuZnJlZXplKHtwdWJsaWNLZXk6aSxzaWduOihvKT0+dGhpcy4jZihyLG4sbyksa2RtRm9yOihvKT0+dGhpcy4jcChyLG4sbyl9KX1hc3luYyN0KCl7cmV0dXJuIGF3YWl0IG5lLmJsYWtlMyh0aGlzLiNlLHtjb250ZXh0OklhfSl9YXN5bmMjbihlKXtsZXQgdD1uZXcgVWludDhBcnJheSh0aGlzLiNlLmJ5dGVMZW5ndGgrQW4uYnl0ZUxlbmd0aCtlLmJ5dGVMZW5ndGgpO3Quc2V0KHRoaXMuI2UsMCksdC5zZXQoQW4sdGhpcy4jZS5ieXRlTGVuZ3RoKSx0LnNldChlLHRoaXMuI2UuYnl0ZUxlbmd0aCtBbi5ieXRlTGVuZ3RoKTt0cnl7cmV0dXJuIGF3YWl0IG5lLmJsYWtlMyh0KX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMjcyhlLHQpe2lmKHQuYnl0ZUxlbmd0aCE9PXhhKXJldHVybiExO2xldCByPWF3YWl0IHRoaXMuI24oZSk7dHJ5e2lmKHIuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtsZXQgbj0wO2ZvcihsZXQgcz0wO3M8ci5ieXRlTGVuZ3RoO3MrKyl7bGV0IGk9cltzXSxvPXRbc107aWYoaT09PXZvaWQgMHx8bz09PXZvaWQgMClyZXR1cm4hMTtufD1pXm99cmV0dXJuIG49PT0wfWZpbmFsbHl7ci5maWxsKDApfX1hc3luYyNyKGUpe2xldFt0LHJdPWF3YWl0IGdpKG5lLGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2lmKHQ9PT12b2lkIDApcmV0dXJuIGQoMTIpO3RyeXtsZXQgbj1hd2FpdCBuZS5lbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHRoaXMuI2UsdCk7cmV0dXJuIFZlKG4pfWNhdGNoe3JldHVybiBkKDEyKX1maW5hbGx5e3QuZmlsbCgwKX19c3RhdGljIGFzeW5jI2koZSx0KXtsZXRbLHJdPVZlKGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWF3YWl0IGdpKG5lLHQpO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoMTIpO2xldCBpO3RyeXt0cnl7aT1hd2FpdCBuZS5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGUsbil9Y2F0Y2h7cmV0dXJuIGQoMjApfXJldHVybiBvZS5mcm9tQnl0ZXMoaSl9ZmluYWxseXtuLmZpbGwoMCksaT8uZmlsbCgwKX19I2MoZSl7bGV0IHQ9bmV3IHEscj10LndyaXRlU3RydWN0KG1uLHtob3N0czpVYShlKX0pO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldCBuPXQucmVzdWx0KCkscz1uZXcgVWludDhBcnJheSh3ZStuLmJ5dGVMZW5ndGgpO3JldHVybiBzLnNldCh0aGlzLiNlLDApLHMuc2V0KG4sd2UpLFtzLDBdfWFzeW5jI2QoZSx0KXtsZXQgcj1hd2FpdCB0aGlzLiNvKGUpO3RyeXtyZXR1cm4gYXdhaXQgbmUuZW5jcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZCh0LHIpfWZpbmFsbHl7ci5maWxsKDApfX1hc3luYyN1KGUsdCl7bGV0IHI9YXdhaXQgdGhpcy4jbyhlKTt0cnl7cmV0dXJuIGF3YWl0IG5lLmRlY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQodCxyKX1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjbyhlKXtsZXQgdD1uZXcgVWludDhBcnJheSh0aGlzLiNlLmJ5dGVMZW5ndGgrZS5ieXRlTGVuZ3RoKTt0LnNldCh0aGlzLiNlLDApLHQuc2V0KGUsdGhpcy4jZS5ieXRlTGVuZ3RoKTt0cnl7cmV0dXJuIGF3YWl0IG5lLmJsYWtlMyh0KX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMjbChlLHQpe2xldCByPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxuPW5ldyBVaW50OEFycmF5KDgpO3JldHVybiBuZXcgRGF0YVZpZXcobi5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLEJpZ0ludCh0KSwhMSksYXdhaXQgdGhpcy4jbyhiZShyLG4pKX1hc3luYyNhKGUsdCl7bGV0IHI9YXdhaXQgdGhpcy4jbChlLHQpO3RyeXtyZXR1cm4gYXdhaXQgbmUuZGVyaXZlRWQyNTUxOUtleVBhaXIocil9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jI2YoZSx0LHIpe2xldCBuPWF3YWl0IHRoaXMuI2EoZSx0KTt0cnl7cmV0dXJuIGF3YWl0IG5lLnNpZ25FZDI1NTE5KHIsbi5wcml2YXRlS2V5KX1maW5hbGx5e24ucHJpdmF0ZUtleS5maWxsKDApfX1hc3luYyNwKGUsdCxyKXtsZXQgbj1hd2FpdCB0aGlzLiNhKGUsdCkscz1iZShuLnByaXZhdGVLZXkscik7bi5wcml2YXRlS2V5LmZpbGwoMCk7dHJ5e3JldHVybihhd2FpdCBuZS5ibGFrZTMocykpLnNsaWNlKDAsVGUpfWZpbmFsbHl7cy5maWxsKDApfX19YXN5bmMgZnVuY3Rpb24gZ2koZSx0LHI9d2Epe2lmKHQuYnl0ZUxlbmd0aDxBYSlyZXR1cm4gZCgxMCk7bGV0IG49YXdhaXQgZS5ibGFrZTMoYmUodCxyKSk7cmV0dXJuIHAobi5zbGljZSgwLEVhKSl9dmFyIERhPW5ldyBTZXQoWyJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsImxlbmd0aCIsIm5hbWUiXSk7ZnVuY3Rpb24gYmkoZSl7Zm9yKGxldCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKXtpZihEYS5oYXModCkpY29udGludWU7bGV0IHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHI9PT12b2lkIDB8fHR5cGVvZiByLnZhbHVlIT09ImZ1bmN0aW9uIiljb250aW51ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLnZhbHVlLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMX0pfX1iaShvZSk7Ymkob2UucHJvdG90eXBlKTtjbGFzcyBrbntkYjtjb25zdHJ1Y3RvcihlKXt0aGlzLmRiPWV9YXN5bmMgZW5xKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oaGUsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShoZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXQgbyBvZiB0KXtsZXQgYT1gJHtvLmhvc3R9OiR7by5zZXF9YDtuLnB1dChvLGEpfX0pfWFzeW5jIGRlcShlLHQpe2xldCByPVsuLi50XTtpZihyLmxlbmd0aD09PTApcmV0dXJuO2xldCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oaGUsInJlYWR3cml0ZSIpLHM9bi5vYmplY3RTdG9yZShoZSk7cmV0dXJuIG5ldyBQcm9taXNlKChpLG8pPT57bi5vbmNvbXBsZXRlPSgpPT5pKCksbi5vbmVycm9yPSgpPT5vKG4uZXJyb3IpO2ZvcihsZXQgYSBvZiByKXtsZXQgYz1gJHtlfToke2F9YDtzLmRlbGV0ZShjKX19KX1hc3luYyBsaXN0KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihoZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShoZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5nZXRBbGwoKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgY291bnQoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGhlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGhlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmNvdW50KCk7cy5vbnN1Y2Nlc3M9KCk9PnIocy5yZXN1bHQpLHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIHdpcGUoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKGhlLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoaGUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmNsZWFyKCl9KX19ZnVuY3Rpb24gd2koZSl7cmV0dXJue2xhYmVsOmUubGFiZWwsaGFuZGxlOm5ldyBVUkwoZS5oYW5kbGUpLGlkeDplLmlkeCxsYXN0U2VxOmUubGFzdFNlcXx8MCxjbG9ja09mZnNldDplLmNsb2NrT2Zmc2V0LHN1YnNjcmlwdGlvbjplLnN1YnNjcmlwdGlvbn19ZnVuY3Rpb24gQ2EoZSx0KXtsZXQgcj17Li4uZX07aWYodC5zZXRMYXN0U2VxIT09dm9pZCAwKXIubGFzdFNlcT10LnNldExhc3RTZXE7ZWxzZSBpZih0Lmxhc3RTZXEhPT12b2lkIDApe2xldCBuPXIubGFzdFNlcXx8MDtpZih0Lmxhc3RTZXE+bilyLmxhc3RTZXE9dC5sYXN0U2VxfXJldHVybiBkZWxldGUgci5udW1CYWdzLGRlbGV0ZSByLm51bUR1cGVzLHJ9Y2xhc3MgQm57ZGI7Y29uc3RydWN0b3IoZSl7dGhpcy5kYj1lfWFzeW5jIGFkZChlKXtsZXQgdD1hd2FpdCB0aGlzLmdldChlLmxhYmVsKSxyPXQhPT12b2lkIDAmJnQuaGFuZGxlLmhyZWY9PT1lLmhhbmRsZS5ocmVmJiYodC5pZHg/PzApPT09KGUuaWR4Pz8wKTtyZXR1cm4gdGhpcy5wdXQoey4uLmUsbGFzdFNlcTpyP3QubGFzdFNlcTowLGNsb2NrT2Zmc2V0OnI/dC5jbG9ja09mZnNldDp2b2lkIDAsc3Vic2NyaXB0aW9uOnI/dC5zdWJzY3JpcHRpb246dm9pZCAwfSl9YXN5bmMgcHV0KGUpe2xldCB0PXsuLi5lLGhhbmRsZTplLmhhbmRsZS50b1N0cmluZygpLGxhc3RTZXE6ZS5sYXN0U2VxPz8wfSxyPXRoaXMuZGIudHJhbnNhY3Rpb24oYWUsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShhZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpLG4ucHV0KHQpfSl9YXN5bmMgdG91Y2goZSx0KXtyZXR1cm4gdGhpcy5yZWNvcmRTdGF0cyhlLHtsYXN0U2VxOnR9KX1hc3luYyByZWNvcmRTdGF0cyhlLHQpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oYWUsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShhZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2xldCBvPW4uZ2V0KGUpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoIWEpcmV0dXJuO24ucHV0KENhKGEsdCkpfX0pfWFzeW5jIGdldChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKGFlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGFlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1yLmdldChlKTtpLm9uc3VjY2Vzcz0oKT0+e2xldCBvPWkucmVzdWx0O2lmKCFvKW4odm9pZCAwKTtlbHNlIG4od2kobykpfSxpLm9uZXJyb3I9KCk9PnMoaS5lcnJvcil9KX1hc3luYyBzZXQoZSx0KXtsZXQgcj1hd2FpdCB0aGlzLmdldChlKTtpZighcilyZXR1cm4gMTM7dHJ5e3JldHVybiBhd2FpdCB0aGlzLnB1dCh7Li4uciwuLi50fSksMH1jYXRjaHtyZXR1cm4gMTh9fWFzeW5jIGRlbChlKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGFlLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoYWUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e3Qub25jb21wbGV0ZT0oKT0+bigpLHQub25lcnJvcj0oKT0+cyh0LmVycm9yKSxyLmRlbGV0ZShlKX0pfWFzeW5jIGxpc3QoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGFlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGFlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldEFsbCgpO3Mub25zdWNjZXNzPSgpPT57bGV0IGk9cy5yZXN1bHQ7cihpLm1hcCh3aSkpfSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihhZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKGFlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fWNsYXNzIHZue2NyeXB0bztkYjtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY3J5cHRvPXQ7dGhpcy5kYj1lfWFzeW5jIGFkZChlKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKG4pPT57aWYoZS5sZW5ndGg9PT0wKXtuKFtdKTtyZXR1cm59bGV0IHM9QXJyYXkoZS5sZW5ndGgpLmZpbGwoMCk7dC5vbmNvbXBsZXRlPSgpPT5uKHMpLHQub25lcnJvcj0oKT0+e2ZvcihsZXQgaT0wO2k8cy5sZW5ndGg7aSsrKXNbaV09MTg7bihzKX07Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2xldHtrZXk6byxkYXRhOmF9PWVbaV0sYz1SKG8pLHU9ci5wdXQoYSxjKTt1Lm9uZXJyb3I9KGwpPT57bC5wcmV2ZW50RGVmYXVsdCgpLHNbaV09MTh9fX0pfWFzeW5jIGRlbChlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvcik7Zm9yKGxldCBvIG9mIHQpe2xldCBhPVIobyk7bi5kZWxldGUoYSl9fSl9YXN5bmMgZ2V0KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1SKGUpLG89ci5nZXQoaSk7by5vbnN1Y2Nlc3M9YXN5bmMoKT0+e2xldCBhPW8ucmVzdWx0O2lmKGEpbihhd2FpdCBqdChlLGEsdGhpcy5jcnlwdG8pKTtlbHNlIG4odm9pZCAwKX0sby5vbmVycm9yPSgpPT5zKG8uZXJyb3IpfSl9YXN5bmMgaGFzKGUpe3JldHVybiBhd2FpdCB0aGlzLmdldChlKSE9PXZvaWQgMH1hc3luYyBsaXN0KGUpe2xldCB0PWU/LmFwbGQscj1lPy5ib2R5IT09ITEscz10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoUSk7cmV0dXJuIG5ldyBQcm9taXNlKChpLG8pPT57bGV0IGE9W10sYz10PT09dm9pZCAwP3Mub3BlbkN1cnNvcigpOnMuaW5kZXgoUHQpLm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seSh0KSk7Yy5vbnN1Y2Nlc3M9KHUpPT57bGV0IGw9dS50YXJnZXQucmVzdWx0O2lmKGwpe2xldCBmPXQ9PT12b2lkIDA/bC5rZXk6bC5wcmltYXJ5S2V5LGg9bC52YWx1ZTthLnB1c2goe2hhc2g6bWUoZiksZGF0YTpofSksbC5jb250aW51ZSgpfWVsc2UgUHJvbWlzZS5hbGwoYS5tYXAoKHtoYXNoOmYsZGF0YTpofSk9Pmp0KGYsaCx0aGlzLmNyeXB0byx7Ym9keTpyfSkpKS50aGVuKGkpLmNhdGNoKG8pfSxjLm9uZXJyb3I9KCk9Pm8oYy5lcnJvcil9KX1hc3luYyBjb3VudChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoUSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9ZT09PXZvaWQgMD9yLmNvdW50KCk6ci5pbmRleChQdCkuY291bnQoSURCS2V5UmFuZ2Uub25seShlKSk7aS5vbnN1Y2Nlc3M9KCk9Pm4oaS5yZXN1bHQpLGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIGxpc3RLZXlzKCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihRLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFEpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPVtdLGk9dC5vcGVuS2V5Q3Vyc29yKCk7aS5vbnN1Y2Nlc3M9KG8pPT57bGV0IGE9by50YXJnZXQucmVzdWx0O2lmKGEpcy5wdXNoKG1lKGEua2V5KSksYS5jb250aW51ZSgpO2Vsc2UgcihzKX0saS5vbmVycm9yPSgpPT5uKGkuZXJyb3IpfSl9YXN5bmMgbGFzdChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoUSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGksbz1yLm9wZW5DdXJzb3IoKTtvLm9uc3VjY2Vzcz1hc3luYyhhKT0+e2xldCBjPWEudGFyZ2V0LnJlc3VsdDtpZihjKXtsZXR7a2V5OnUsdmFsdWU6bH09YztpZihZKGUsbC5laWQpKXtpZighaXx8KGwuY3RyPz8wKT4oaS5kYXRhLmN0cj8/MCl8fChsLmN0cj8/MCk9PT0oaS5kYXRhLmN0cj8/MCkmJihsLm9mZj8/MCk+KGkuZGF0YS5vZmY/PzApKWk9e2tleTp1LGRhdGE6bH19Yy5jb250aW51ZSgpfWVsc2UgaWYoaSl7bGV0IHU9bWUoaS5rZXkpO24oYXdhaXQganQodSxpLmRhdGEsdGhpcy5jcnlwdG8pKX1lbHNlIG4odm9pZCAwKX0sby5vbmVycm9yPSgpPT5zKG8uZXJyb3IpfSl9YXN5bmMgbWFya0FwcGxpZWQoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihRLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoUSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXQgbyBvZiB0KXtsZXQgYT1SKG8pLGM9bi5nZXQoYSk7Yy5vbnN1Y2Nlc3M9KCk9PntsZXQgdT1jLnJlc3VsdDtpZighdSlyZXR1cm47X3IodSxYdCksbi5wdXQodSxhKX0sYy5vbmVycm9yPSh1KT0+e3UucHJldmVudERlZmF1bHQoKX19fSl9YXN5bmMgbWFya0ZhaWxlZChlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvcik7Zm9yKGxldHtrZXk6byxlcnI6YX1vZiB0KXtsZXQgYz1SKG8pLHU9bi5nZXQoYyk7dS5vbnN1Y2Nlc3M9KCk9PntsZXQgbD11LnJlc3VsdDtpZighbClyZXR1cm47X3IobCxydCxhKSxuLnB1dChsLGMpfSx1Lm9uZXJyb3I9KGwpPT57bC5wcmV2ZW50RGVmYXVsdCgpfX19KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihRLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoUSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX12YXIgVGE9ODtjbGFzcyBEbnsjZTsjdDsjbjsjczsjcjtjb25zdHJ1Y3RvcihlKXtpZih0aGlzLiNyPWUucGVyc2lzdEtleXJpbmcsdGhpcy4jbj17cnBJZDplLnJwSWQscnBOYW1lOmUucnBOYW1lfSx0aGlzLiNzPWUudXNlck5hbWU/P2UucnBJZD8/ZS5ycE5hbWU/P0F0LGUua2V5cmluZyE9PXZvaWQgMCl0aGlzLiN0PURlKGUua2V5cmluZyl9Z2V0IGtleXJpbmcoKXtyZXR1cm4gdGhpcy4jdD09PXZvaWQgMD92b2lkIDA6RGUodGhpcy4jdCl9bGlzdCgpe2lmKHRoaXMuI3Q9PT12b2lkIDApcmV0dXJuW107cmV0dXJuIHRoaXMuI3QuZW50cmllcy5tYXAoUmEpfWFzeW5jIHNhdmUoZSx0KXtpZih0Py5wZXJzaXN0PT09ITApcmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKCJwcmYtc3RvcmU6IHVzZSBiaW5kQW5kU2F2ZShlbmNsYXZlKSB0byBwZXJzaXN0IGEgYmluZGluZyIpKTtyZXR1cm4gdGhpcy4jZT1lLHRoaXMuI2V9YXN5bmMgYmluZEFuZFNhdmUoZSx0KXtsZXQgcj10aGlzLiN0LG49dD8uY3JlZElkLHM9biBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/bi5ieXRlTGVuZ3RoPjA6biE9PXZvaWQgMCYmbi5sZW5ndGg+MDtpZighcyYmciE9PXZvaWQgMCYmci5lbnRyaWVzLmxlbmd0aD49VGEpcmV0dXJuIGQoMjYpO2xldCBpPUlpKHQ/Lm5pY2spLG89dD8uZXhjbHVkZUNyZWRlbnRpYWxzPz8ocz92b2lkIDA6TGEocikpLGE9dD8uc2FsdD8/cj8uc2FsdCxjPXI9PT12b2lkIDA/dm9pZCAwOnIuZW50cmllcy5tYXAoKGcpPT4oe2NyZWRJZDpnLmNyZWRJZCx0YWc6Zy50YWd9KSksW3UsbF09YXdhaXQgZS5iaW5kKHsuLi50aGlzLiNuLHNhbHQ6YSxjcmVkSWQ6bixjcmVhdGVDcmVkSWZOZWVkZWQ6dD8uY3JlYXRlQ3JlZElmTmVlZGVkPz8hcyxleGNsdWRlQ3JlZGVudGlhbHM6byx1c2VyTmFtZTp0aGlzLiNzLGRpc3BsYXlOYW1lOmk/P3RoaXMuI24ucnBOYW1lPz90aGlzLiNzLGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OnQ/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50LGhpbnRzOnQ/LmhpbnRzfSxjKTtpZihsIT09MClyZXR1cm4gZChsKTtpZih1PT09dm9pZCAwKXJldHVybiBkKDEyKTtsZXQgZj1EYXRlLm5vdygpLGg9e3R5cGU6InByZiIsc2VhbGVkTWFzdGVyOnUuc2VhbGVkTWFzdGVyLGNyZWRJZDp1LmNyZWRJZCx0YWc6dS50YWcsdXNlcklkOnUudXNlcklkLG5pY2s6aSxlbnJvbGxlZEF0OmYsbGFzdFVzZWRBdDpmLGF0dGFjaG1lbnQ6dS5hdHRhY2htZW50LHRyYW5zcG9ydHM6dS50cmFuc3BvcnRzLGFhZ3VpZDp1LmFhZ3VpZCxlbnJvbGxlZE9zOkhhKCl9LHk9cj09PXZvaWQgMD97c2FsdDp1LnNhbHQuc2xpY2UoKSxlbnRyaWVzOltdfTpEZShyKTtyZXR1cm4gdGhpcy4jdD1PYSh5LGgpLHRoaXMuI2U9ZSxhd2FpdCB0aGlzLiNyKERlKHRoaXMuI3QpKSxwKHRoaXMuI2UpfWFzeW5jIGxvYWQoKXtyZXR1cm4gdGhpcy4jZX1hc3luYyB1bmxvY2soKXtsZXQgZT10aGlzLiN0O2lmKGU9PT12b2lkIDB8fGUuZW50cmllcy5sZW5ndGg9PT0wKXJldHVybiBkKDIyKTtsZXRbdCxyXT1hd2FpdCBvZS51bnNlYWxXaXRoUGFzc2tleShlLmVudHJpZXMubWFwKChzKT0+KHtzZWFsZWRNYXN0ZXI6cy5zZWFsZWRNYXN0ZXIsY3JlZElkOnMuY3JlZElkfSkpLHsuLi50aGlzLiNuLHNhbHQ6ZS5zYWx0fSk7aWYociE9PTApcmV0dXJuIGQocik7dGhpcy4jZT10LmVuY2xhdmU7bGV0IG49S2EoZSx0LmNyZWRJZCk7aWYobiE9PXZvaWQgMCl0aGlzLiN0PW4sYXdhaXQgdGhpcy4jcihEZShuKSk7cmV0dXJuIHAodC5lbmNsYXZlKX1hc3luYyByZW5hbWUoZSx0KXtsZXQgcj10aGlzLiN0O2lmKHI9PT12b2lkIDApcmV0dXJuIGQoMjIpO2xldCBuPXIuZW50cmllcy5maW5kSW5kZXgoKGMpPT5ZKGMuY3JlZElkLGUpKTtpZihuPDApcmV0dXJuIGQoMTMpO2xldCBzPXIuZW50cmllcy5tYXAoVXQpLGk9c1tuXTtpZihpPT09dm9pZCAwKXJldHVybiBkKDEzKTtsZXQgbz1JaSh0KTtzW25dPXsuLi5pLG5pY2s6b307bGV0IGE9e3NhbHQ6ci5zYWx0LnNsaWNlKCksZW50cmllczpzfTtyZXR1cm4gdGhpcy4jdD1hLGF3YWl0IHRoaXMuI3IoRGUoYSkpLHAodm9pZCAwKX1hc3luYyByZW1vdmUoZSl7bGV0IHQ9dGhpcy4jdDtpZih0PT09dm9pZCAwKXJldHVybiBkKDIyKTtsZXQgcj10LmVudHJpZXMuZmlsdGVyKChzKT0+IVkocy5jcmVkSWQsZSkpO2lmKHIubGVuZ3RoPT09dC5lbnRyaWVzLmxlbmd0aClyZXR1cm4gZCgxMyk7aWYoci5sZW5ndGg9PT0wKXJldHVybiB0aGlzLiN0PXZvaWQgMCxhd2FpdCB0aGlzLiNyKHZvaWQgMCkscCh2b2lkIDApO2xldCBuPXtzYWx0OnQuc2FsdC5zbGljZSgpLGVudHJpZXM6ci5tYXAoVXQpfTtyZXR1cm4gdGhpcy4jdD1uLGF3YWl0IHRoaXMuI3IoRGUobikpLHAodm9pZCAwKX1hc3luYyB3aXBlKCl7dGhpcy4jZT12b2lkIDAsdGhpcy4jdD12b2lkIDAsYXdhaXQgdGhpcy4jcih2b2lkIDApfX1mdW5jdGlvbiBJaShlKXtpZihlPT09dm9pZCAwKXJldHVybjtsZXQgdD1lLnRyaW0oKTtyZXR1cm4gdD09PSIiP3ZvaWQgMDp0fWZ1bmN0aW9uIEhhKCl7aWYodHlwZW9mIG5hdmlnYXRvcj4idSIpcmV0dXJuO3JldHVybiBjaShuYXZpZ2F0b3IudXNlckFnZW50KX1mdW5jdGlvbiBVdChlKXtsZXRbdCxyXT1WZShlLnNlYWxlZE1hc3Rlci5zbGljZSgpKTtyZXR1cm57dHlwZToicHJmIixzZWFsZWRNYXN0ZXI6cj09PTAmJnQhPT12b2lkIDA/dDplLnNlYWxlZE1hc3RlcixjcmVkSWQ6ZS5jcmVkSWQuc2xpY2UoKSx0YWc6ZS50YWcuc2xpY2UoKSx1c2VySWQ6ZS51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmUudXNlcklkLnNsaWNlKCksbmljazplLm5pY2ssZW5yb2xsZWRBdDplLmVucm9sbGVkQXQsbGFzdFVzZWRBdDplLmxhc3RVc2VkQXQsYXR0YWNobWVudDplLmF0dGFjaG1lbnQsdHJhbnNwb3J0czplLnRyYW5zcG9ydHM9PT12b2lkIDA/dm9pZCAwOlsuLi5lLnRyYW5zcG9ydHNdLGFhZ3VpZDplLmFhZ3VpZD09PXZvaWQgMD92b2lkIDA6ZS5hYWd1aWQuc2xpY2UoKSxlbnJvbGxlZE9zOmUuZW5yb2xsZWRPc319ZnVuY3Rpb24gRGUoZSl7cmV0dXJue3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczplLmVudHJpZXMubWFwKFV0KX19ZnVuY3Rpb24geGkoZSl7cmV0dXJuIGUhPT1udWxsJiZ0eXBlb2YgZT09PSJvYmplY3QifWZ1bmN0aW9uIE1hKGUpe2lmKCF4aShlKXx8ZS50eXBlIT09InByZiIpcmV0dXJuO2lmKCEoZS5zZWFsZWRNYXN0ZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IShlLmNyZWRJZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHwhKGUudGFnIGluc3RhbmNlb2YgVWludDhBcnJheSl8fGUudGFnLmJ5dGVMZW5ndGghPT0zMnx8dHlwZW9mIGUuZW5yb2xsZWRBdCE9PSJudW1iZXIifHwhTnVtYmVyLmlzRmluaXRlKGUuZW5yb2xsZWRBdCkpcmV0dXJuO2xldFt0LHJdPVZlKGUuc2VhbGVkTWFzdGVyKTtpZihyIT09MHx8dD09PXZvaWQgMClyZXR1cm47bGV0IG49ZS5hdHRhY2htZW50PT09InBsYXRmb3JtInx8ZS5hdHRhY2htZW50PT09ImNyb3NzLXBsYXRmb3JtIj9lLmF0dGFjaG1lbnQ6dm9pZCAwLHM9ZS5lbnJvbGxlZE9zLGk9cz09PSJpb3MifHxzPT09Im1hY29zInx8cz09PSJhbmRyb2lkInx8cz09PSJ3aW5kb3dzInx8cz09PSJsaW51eCJ8fHM9PT0ib3RoZXIiP3M6dm9pZCAwLG89QXJyYXkuaXNBcnJheShlLnRyYW5zcG9ydHMpP2UudHJhbnNwb3J0cy5maWx0ZXIoKGEpPT50eXBlb2YgYT09PSJzdHJpbmciKTp2b2lkIDA7cmV0dXJue3R5cGU6InByZiIsc2VhbGVkTWFzdGVyOnQsY3JlZElkOmUuY3JlZElkLnNsaWNlKCksdGFnOmUudGFnLnNsaWNlKCksdXNlcklkOmUudXNlcklkIGluc3RhbmNlb2YgVWludDhBcnJheT9lLnVzZXJJZC5zbGljZSgpOnZvaWQgMCxuaWNrOnR5cGVvZiBlLm5pY2s9PT0ic3RyaW5nIj9lLm5pY2s6dm9pZCAwLGVucm9sbGVkQXQ6ZS5lbnJvbGxlZEF0LGxhc3RVc2VkQXQ6dHlwZW9mIGUubGFzdFVzZWRBdD09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUoZS5sYXN0VXNlZEF0KT9lLmxhc3RVc2VkQXQ6dm9pZCAwLGF0dGFjaG1lbnQ6bix0cmFuc3BvcnRzOm89PT12b2lkIDB8fG8ubGVuZ3RoPT09MD92b2lkIDA6byxhYWd1aWQ6ZS5hYWd1aWQgaW5zdGFuY2VvZiBVaW50OEFycmF5P2UuYWFndWlkLnNsaWNlKCk6dm9pZCAwLGVucm9sbGVkT3M6aX19ZnVuY3Rpb24gRWkoZSl7aWYoIXhpKGUpKXJldHVybjtpZighKGUuc2FsdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHwhQXJyYXkuaXNBcnJheShlLmVudHJpZXMpKXJldHVybjtsZXQgdD1bXTtmb3IobGV0IHIgb2YgZS5lbnRyaWVzKXtsZXQgbj1NYShyKTtpZihuIT09dm9pZCAwKXQucHVzaChuKX1pZih0Lmxlbmd0aD09PTApcmV0dXJuO3JldHVybntzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6dH19ZnVuY3Rpb24gUmEoZSl7cmV0dXJue3R5cGU6InByZiIsY3JlZElkOmUuY3JlZElkLnNsaWNlKCksdXNlcklkOmUudXNlcklkPT09dm9pZCAwP3ZvaWQgMDplLnVzZXJJZC5zbGljZSgpLG5pY2s6ZS5uaWNrLGVucm9sbGVkQXQ6ZS5lbnJvbGxlZEF0LGxhc3RVc2VkQXQ6ZS5sYXN0VXNlZEF0LGF0dGFjaG1lbnQ6ZS5hdHRhY2htZW50LHRyYW5zcG9ydHM6ZS50cmFuc3BvcnRzPT09dm9pZCAwP3ZvaWQgMDpbLi4uZS50cmFuc3BvcnRzXSxhYWd1aWQ6ZS5hYWd1aWQ9PT12b2lkIDA/dm9pZCAwOmUuYWFndWlkLnNsaWNlKCksZW5yb2xsZWRPczplLmVucm9sbGVkT3N9fWZ1bmN0aW9uIExhKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuW107cmV0dXJuIGUuZW50cmllcy5maWx0ZXIoKHQpPT50LmNyZWRJZC5ieXRlTGVuZ3RoPjApLm1hcCgodCk9PnQuY3JlZElkLnNsaWNlKCkpfWZ1bmN0aW9uIE9hKGUsdCl7bGV0IHI9ZS5lbnRyaWVzLm1hcChVdCksbj1yLmZpbmRJbmRleCgocyk9Plkocy5jcmVkSWQsdC5jcmVkSWQpKTtpZihuPj0wKXtsZXQgcz1yW25dO3Jbbl09ey4uLnQsZW5yb2xsZWRBdDpzPy5lbnJvbGxlZEF0Pz90LmVucm9sbGVkQXQsbmljazp0Lm5pY2s/P3M/Lm5pY2t9fWVsc2Ugci5wdXNoKHQpO3JldHVybntzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6cn19ZnVuY3Rpb24gS2EoZSx0KXtpZih0LmJ5dGVMZW5ndGg9PT0wKXJldHVybjtsZXQgcj1lLmVudHJpZXMuZmluZEluZGV4KChpKT0+WShpLmNyZWRJZCx0KSk7aWYocjwwKXJldHVybjtsZXQgbj1lLmVudHJpZXMubWFwKFV0KSxzPW5bcl07aWYocz09PXZvaWQgMClyZXR1cm47cmV0dXJuIG5bcl09ey4uLnMsbGFzdFVzZWRBdDpEYXRlLm5vdygpfSx7c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOm59fXZhciBxbT1tcigiZmJmYzMwMDcxNTRlNGVjYzhjMGI2ZTAyMDU1N2Q3YmQiKSxGbT1tcigiZWE5YjhkNjY0ZDAxMWQyMTNjZTRiNmI0OGNiNTc1ZDQiKSxXbT1tcigiMDg5ODcwNThjYWRjNGI4MWI2ZTEzMGRlNTBkY2JlOTYiKSx6bT1tcigiMmZjMDU3OWY4MTEzNDdlYWIxMTZiYjVhOGRiOTIwMmEiKTtmdW5jdGlvbiBtcihlKXtsZXQgdD1uZXcgVWludDhBcnJheSgxNik7Zm9yKGxldCByPTA7cjwxNjtyKyspdFtyXT1OdW1iZXIucGFyc2VJbnQoZS5zbGljZShyKjIscioyKzIpLDE2KTtyZXR1cm4gdH12YXIgVmE9ImRpcGxvbWF0aWMucGluLyI7ZnVuY3Rpb24gX2EoZSl7cmV0dXJuIFZhK1NlKGUpfWFzeW5jIGZ1bmN0aW9uIEFpKGUsdCxyKXtsZXQgbj1hd2FpdCB0LmRlcml2ZUlkZW50aXR5KF9hKHIpLDApO3JldHVybiBlLmJsYWtlMyhuLnB1YmxpY0tleSl9YXN5bmMgZnVuY3Rpb24gUGkoZSx0KXtsZXQgcj1hd2FpdCBlLmdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKSxuPWF3YWl0IEFpKGUsdCxyKTtyZXR1cm57bjpyLGg6bn19YXN5bmMgZnVuY3Rpb24gVWkoZSx0LHIpe2xldCBuPWF3YWl0IEFpKGUsdCxyLm4pO3JldHVybiBOYShuLHIuaCl9ZnVuY3Rpb24ga2koZSl7aWYoZT09PXZvaWQgMHx8ZT09PW51bGx8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuO2xldCB0PWU7aWYoISh0Lm4gaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8ISh0LmggaW5zdGFuY2VvZiBVaW50OEFycmF5KSlyZXR1cm47aWYodC5uLmJ5dGVMZW5ndGg8MXx8dC5oLmJ5dGVMZW5ndGg8MSlyZXR1cm47cmV0dXJue246dC5uLnNsaWNlKCksaDp0Lmguc2xpY2UoKX19ZnVuY3Rpb24gQmkoZSl7cmV0dXJue246ZS5uLnNsaWNlKCksaDplLmguc2xpY2UoKX19ZnVuY3Rpb24gTmEoZSx0KXtpZihlLmJ5dGVMZW5ndGghPT10LmJ5dGVMZW5ndGgpcmV0dXJuITE7bGV0IHI9MDtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspcnw9ZVtuXV50W25dO3JldHVybiByPT09MH12YXIgZ3I9ImtleXJpbmciLHZpPSJwcmZNZXRhIixDbj0iaWRQaW4iLERpPSJpZFB1YiI7Y2xhc3MgVG57I2U7ZGI7I3Q7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmRiPWUsdGhpcy4jdD10fWFzeW5jIHNhdmUoZSx0KXtyZXR1cm4gYXdhaXQgdGhpcy4jbihlKSx0aGlzLiNlPWUsdGhpcy4jZX1hc3luYyBsb2FkKCl7cmV0dXJuIHRoaXMuI2V9YXN5bmMgY2xlYXJTZXNzaW9uKCl7dGhpcy4jZT12b2lkIDB9YXN5bmMgd2lwZSgpe3RoaXMuI2U9dm9pZCAwO2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oY2UsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShjZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuZGVsZXRlKGdyKSx0LmRlbGV0ZSh2aSksdC5kZWxldGUoQ24pLHQuZGVsZXRlKERpKX0pfWFzeW5jIGxvYWRLZXlyaW5nKCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihjZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShjZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5nZXQoZ3IpO3Mub25zdWNjZXNzPSgpPT57cihFaShzLnJlc3VsdCkpfSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyBwZXJzaXN0S2V5cmluZyhlKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGNlLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoY2UpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2lmKHQub25jb21wbGV0ZT0oKT0+bigpLHQub25lcnJvcj0oKT0+cyh0LmVycm9yKSxyLmRlbGV0ZSh2aSksZT09PXZvaWQgMCl7ci5kZWxldGUoZ3IpO3JldHVybn1yLnB1dChEZShlKSxncil9KX1hc3luYyBoYXNLZXlyaW5nKCl7bGV0IGU9YXdhaXQgdGhpcy5sb2FkS2V5cmluZygpO3JldHVybiBlIT09dm9pZCAwJiZlLmVudHJpZXMubGVuZ3RoPjB9YXN5bmMgb3BlblByZlN0b3JlKGUpe2xldCB0PWF3YWl0IHRoaXMubG9hZEtleXJpbmcoKTtyZXR1cm4gbmV3IERuKHtycElkOmUucnBJZCxycE5hbWU6ZS5ycE5hbWUsdXNlck5hbWU6ZS51c2VyTmFtZSxrZXlyaW5nOnQscGVyc2lzdEtleXJpbmc6KHIpPT50aGlzLnBlcnNpc3RLZXlyaW5nKHIpfSl9YXN5bmMjbihlKXthd2FpdCB0aGlzLiNpKERpKTtsZXQgdD1hd2FpdCB0aGlzLiNzKCk7aWYodCE9PXZvaWQgMCl7aWYoIWF3YWl0IFVpKHRoaXMuI3QsZSx0KSl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIHNlZWQgZG9lcyBub3QgbWF0Y2ggdGhpcyBkZXZpY2UncyBpZGVudGl0eSAobG9jYWwgZGF0YSB3YXMgY3JlYXRlZCB3aXRoIGEgZGlmZmVyZW50IG1hc3RlciBzZWVkKSIpO3JldHVybn1sZXQgcj1hd2FpdCBQaSh0aGlzLiN0LGUpO2F3YWl0IHRoaXMuI3Iocil9I3MoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGNlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGNlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldChDbik7cy5vbnN1Y2Nlc3M9KCk9PnIoa2kocy5yZXN1bHQpKSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX0jcihlKXtsZXQgdD1CaShlKSxyPXRoaXMuZGIudHJhbnNhY3Rpb24oY2UsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShjZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpLG4ucHV0KHQsQ24pfSl9I2koZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihjZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKGNlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9Pnt0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5kZWxldGUoZSl9KX19Y2xhc3MgSG57ZGI7Y29uc3RydWN0b3IoZSl7dGhpcy5kYj1lfWFzeW5jIGVucShlLHQpe2xldCByPVsuLi50XTtpZihyLmxlbmd0aD09PTApcmV0dXJuO2xldCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oeWUsInJlYWR3cml0ZSIpLHM9bi5vYmplY3RTdG9yZSh5ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChpLG8pPT57bi5vbmNvbXBsZXRlPSgpPT5pKCksbi5vbmVycm9yPSgpPT5vKG4uZXJyb3IpO2ZvcihsZXQgYSBvZiByKXtsZXQgYz1TZShhKTtzLnB1dCh7aG9zdDplLGhhc2g6Y30pfX0pfWFzeW5jIGRlcShlLHQpe2xldCByPVsuLi50XTtpZihyLmxlbmd0aD09PTApcmV0dXJuO2xldCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oeWUsInJlYWR3cml0ZSIpLHM9bi5vYmplY3RTdG9yZSh5ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChpLG8pPT57bi5vbmNvbXBsZXRlPSgpPT5pKCksbi5vbmVycm9yPSgpPT5vKG4uZXJyb3IpO2ZvcihsZXQgYSBvZiByKXtsZXQgYz1TZShhKTtzLmRlbGV0ZShbZSxjXSl9fSl9YXN5bmMgbGlzdChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKHllLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHllKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1yLmdldEFsbCgpO2kub25zdWNjZXNzPSgpPT57bGV0IGE9aS5yZXN1bHQuZmlsdGVyKChjKT0+Yy5ob3N0PT09ZSkubWFwKChjKT0+Yy5oYXNoKTtuKGEubWFwKChjKT0+R24oYykpKX0saS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9YXN5bmMgY291bnQoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKHllLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHllKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmNvdW50KCk7cy5vbnN1Y2Nlc3M9KCk9PnIocy5yZXN1bHQpLHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIHdpcGUoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKHllLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoeWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmNsZWFyKCl9KX19dmFyIGNlPSJzZWVkTWV0YSIsYWU9Imhvc3RzIix5ZT0idXBsb2FkUXVldWUiLGhlPSJkb3dubG9hZFF1ZXVlIixRPSJtZXNzYWdlcyIsUHQ9ImFwbGQiLENpPTMsVGk9ImRpcGxvbWF0aWMtc3RvcmUtZGIiO2NsYXNzIEhpe3NlZWQ7aG9zdHM7dXBsb2Fkcztkb3dubG9hZHM7bWVzc2FnZXM7ZGI7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmRiPWUsdGhpcy5zZWVkPW5ldyBUbihlLHQpLHRoaXMuaG9zdHM9bmV3IEJuKGUpLHRoaXMudXBsb2Fkcz1uZXcgSG4oZSksdGhpcy5kb3dubG9hZHM9bmV3IGtuKGUpLHRoaXMubWVzc2FnZXM9bmV3IHZuKGUsdCl9YXN5bmMgd2lwZSgpe2F3YWl0IHRoaXMuaG9zdHMud2lwZSgpLGF3YWl0IHRoaXMudXBsb2Fkcy53aXBlKCksYXdhaXQgdGhpcy5kb3dubG9hZHMud2lwZSgpLGF3YWl0IHRoaXMubWVzc2FnZXMud2lwZSgpfX1hc3luYyBmdW5jdGlvbiBxYSgpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e2xldCByPWluZGV4ZWREQi5vcGVuKFRpLENpKTtyLm9udXBncmFkZW5lZWRlZD0oKT0+e2xldHtyZXN1bHQ6bix0cmFuc2FjdGlvbjpzfT1yO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoY2UpKW4uY3JlYXRlT2JqZWN0U3RvcmUoY2UpO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoYWUpKW4uY3JlYXRlT2JqZWN0U3RvcmUoYWUse2tleVBhdGg6ImxhYmVsIn0pO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoeWUpKW4uY3JlYXRlT2JqZWN0U3RvcmUoeWUse2tleVBhdGg6WyJob3N0IiwiaGFzaCJdfSk7aWYoIW4ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhoZSkpbi5jcmVhdGVPYmplY3RTdG9yZShoZSk7bGV0IGk7aWYoIW4ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhRKSlpPW4uY3JlYXRlT2JqZWN0U3RvcmUoUSk7ZWxzZXtpZighcyl0aHJvdyBFcnJvcigibWlzc2luZyB1cGdyYWRlIHRyYW5zYWN0aW9uIGZvciBtZXNzYWdlcyBzdG9yZSIpO2k9cy5vYmplY3RTdG9yZShRKX1pZighaS5pbmRleE5hbWVzLmNvbnRhaW5zKFB0KSlpLmNyZWF0ZUluZGV4KFB0LCJhcGxkIix7dW5pcXVlOiExfSl9LHIub25ibG9ja2VkPSgpPT57Y29uc29sZS53YXJuKGBbRElQTE9NQVRJQ10gcHJvdG9jb2wgc3RvcmUgSURCIHVwZ3JhZGUgYmxvY2tlZCAoJHtUaX0g4oaSIHYke0NpfSk7IHdhaXRpbmcgZm9yIG90aGVyIGNvbm5lY3Rpb25zIHRvIGNsb3NlYCl9LHIub25zdWNjZXNzPSgpPT57bGV0IG49ci5yZXN1bHQ7bi5vbnZlcnNpb25jaGFuZ2U9KCk9PntuLmNsb3NlKCl9LGUobil9LHIub25lcnJvcj0oKT0+dChyLmVycm9yPz9FcnJvcigicHJvdG9jb2wgc3RvcmUgSW5kZXhlZERCIG9wZW4gZmFpbGVkIikpfSl9YXN5bmMgZnVuY3Rpb24gTWkoZSl7bGV0IHQ9YXdhaXQgcWEoKTtpZih0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnN0b3JhZ2U/LnBlcnNpc3QpdHJ5e2F3YWl0IFByb21pc2UucmFjZShbbmF2aWdhdG9yLnN0b3JhZ2UucGVyc2lzdCgpLG5ldyBQcm9taXNlKChyKT0+e3NldFRpbWVvdXQoKCk9PnIoITEpLDIwMDApfSldKX1jYXRjaHt9cmV0dXJuIG5ldyBIaSh0LGUpfWNsYXNzIE1ue2NsaWVudDtlbnREQjtwb3N0O3doZW5SZWFkeTtyZXNvbHZlUmVhZHk7cmVqZWN0UmVhZHk7Y29uc3RydWN0b3IoZSl7dGhpcy5wb3N0PWUsdGhpcy53aGVuUmVhZHk9bmV3IFByb21pc2UoKHQscik9Pnt0aGlzLnJlc29sdmVSZWFkeT10LHRoaXMucmVqZWN0UmVhZHk9cn0pfWFzeW5jIGluaXQoKXt0cnl7bGV0IGU9YXdhaXQgTWkodHIpLHQ9YXdhaXQgdGkoe2NhY2hlOiExfSkscj1uZXcgcXQodC5hcHBseSwoKT0+dC5jbGVhcigpLChpKT0+e2lmKGkubGVuZ3RoPDEpcmV0dXJuO3RoaXMucG9zdCh7a2luZDoiZGlydHkiLGVpZHM6aS5tYXAoKG8pPT5vLnNsaWNlKCkpfSl9KSxuPXIuY2xlYXI7ci5jbGVhcj1hc3luYygpPT57bGV0IGk9YXdhaXQgbigpO2lmKGk9PT0wKXRoaXMucG9zdCh7a2luZDoid2lwZWQifSk7cmV0dXJuIGl9O2xldCBzPW5ldyBYcihuZXcgVXIscixlLGlzLHRyKTt0aGlzLmNsaWVudD1zLHRoaXMuZW50REI9dCxzLmNsaWVudFN0YXRlLmxpc3RlbigoKT0+e3RoaXMuZW1pdENsaWVudFN0YXRlKCl9KSxzLnhmZXJTdGF0ZS5saXN0ZW4oKCk9Pnt0aGlzLmVtaXRYZmVyU3RhdGUoKX0pLGF3YWl0IHRoaXMuZW1pdFhmZXJTdGF0ZSgpLHRoaXMucG9zdCh7a2luZDoicmVhZHkifSksdGhpcy5tYXJrUmVhZHkoKX1jYXRjaChlKXtsZXQgdD1lIGluc3RhbmNlb2YgRXJyb3I/ZTpFcnJvcihTdHJpbmcoZSkpO3Rocm93IHRoaXMucG9zdCh7a2luZDoiaW5pdEVycm9yIixtZXNzYWdlOnQubWVzc2FnZX0pLHRoaXMuZmFpbFJlYWR5KHQpLHR9fW1hcmtSZWFkeSgpe2xldCBlPXRoaXMucmVzb2x2ZVJlYWR5O2lmKHRoaXMucmVzb2x2ZVJlYWR5PXZvaWQgMCx0aGlzLnJlamVjdFJlYWR5PXZvaWQgMCxlKWUoKX1mYWlsUmVhZHkoZSl7bGV0IHQ9dGhpcy5yZWplY3RSZWFkeTtpZih0aGlzLnJlc29sdmVSZWFkeT12b2lkIDAsdGhpcy5yZWplY3RSZWFkeT12b2lkIDAsdCl0KGUpfXJlcXVpcmVDbGllbnQoKXtpZighdGhpcy5jbGllbnQpdGhyb3cgRXJyb3IoIldvcmtlclJ1bnRpbWUgbm90IGluaXRpYWxpemVkIik7cmV0dXJuIHRoaXMuY2xpZW50fWFzeW5jIGVtaXRDbGllbnRTdGF0ZSgpe2xldCBlPXRoaXMuY2xpZW50O2lmKCFlKXJldHVybjtsZXQgdD1hd2FpdCBlLmNsaWVudFN0YXRlLmdldCgpO3RoaXMucG9zdCh7a2luZDoiY2xpZW50U3RhdGUiLGNvbm5lY3RlZDp0LmNvbm5lY3RlZH0pfWFzeW5jIGVtaXRYZmVyU3RhdGUoKXtsZXQgZT10aGlzLmNsaWVudDtpZighZSlyZXR1cm47bGV0IHQ9YXdhaXQgZS54ZmVyU3RhdGUuZ2V0KCk7dGhpcy5wb3N0KHtraW5kOiJ4ZmVyU3RhdGUiLHN0YXRlOnR9KX1ob3N0RnJvbVNlcmlhbGl6ZWQoZSl7cmV0dXJue2hhbmRsZTpuZXcgVVJMKGUuaGFuZGxlKSxsYWJlbDplLmxhYmVsLGlkeDplLmlkeH19YXN5bmMgaGFuZGxlKGUpe2F3YWl0IHRoaXMud2hlblJlYWR5O2xldCB0PXRoaXMucmVxdWlyZUNsaWVudCgpO3N3aXRjaChlLm9wKXtjYXNlInBpbmciOnJldHVybiJwb25nIjtjYXNlInNldFNlZWQiOntsZXRbcixuXT1vZS5mcm9tQnl0ZXMoZS5zZWVkKTtpZihlLnNlZWQuZmlsbCgwKSxuIT09MHx8cj09PXZvaWQgMCl0aHJvdyBuZXcgZ2Uobik7YXdhaXQgdC5zZXRTZWVkKHIse3BlcnNpc3Q6ZS5wZXJzaXN0fSk7cmV0dXJufWNhc2UibGluayI6e2F3YWl0IHQubGluayh0aGlzLmhvc3RGcm9tU2VyaWFsaXplZChlLmhvc3QpLGUuY29ubmVjdD8/ITApO3JldHVybn1jYXNlInVubGluayI6e2F3YWl0IHQudW5saW5rKGUubGFiZWwpO3JldHVybn1jYXNlImNvbm5lY3QiOnthd2FpdCB0LmNvbm5lY3QoZS5saXN0ZW4/PyEwLGUuc3luYz8/ITApO3JldHVybn1jYXNlImRpc2Nvbm5lY3QiOnthd2FpdCB0LmRpc2Nvbm5lY3QoKTtyZXR1cm59Y2FzZSJzeW5jIjpyZXR1cm4gYXdhaXQgdC5zeW5jKCk7Y2FzZSJyZWJ1aWxkIjpyZXR1cm4gYXdhaXQgdC5yZWJ1aWxkKHtjaGVja0hvc3Q6ZS5jaGVja0hvc3Q/PyEwfSk7Y2FzZSJyZWNvbmNpbGUiOntsZXRbcixuXT1hd2FpdCB0LnJlY29uY2lsZShlLmhvc3RMYWJlbCx7cHVsbDplLnB1bGwscHVzaDplLnB1c2gsc3luYzplLnN5bmN9KTtpZihuIT09MCl0aHJvdyBuZXcgZ2Uobik7aWYoIXIpdGhyb3cgbmV3IGdlKDEyKTtyZXR1cm4gcn1jYXNlIm1zZ2NoZWNrIjpyZXR1cm4gYXdhaXQgdC5tc2djaGVjaygpO2Nhc2UiZW50Y2hlY2siOntsZXQgcj10aGlzLmVudERCO2lmKCFyKXRocm93IG5ldyBnZSgxMik7bGV0W24sc109YXdhaXQgci5jaGVja3N1bSh0cik7aWYocyE9PTApdGhyb3cgbmV3IGdlKHMpO2lmKCFuKXRocm93IG5ldyBnZSgxMik7cmV0dXJuIG59Y2FzZSJ3aXBlIjp7YXdhaXQgdC53aXBlKHttc2dzOmUubXNncyxlbnRzOmUuZW50cyxtZXRhOmUubWV0YSxzZWVkOmUuc2VlZH0pO3JldHVybn1jYXNlImltcG9ydCI6e2xldCByPWUuYnl0ZXMuc2xpY2UoKSxuPW5ldyBCbG9iKFtyXSkscz1uZXcgRmlsZShbbl0sImltcG9ydC5kaXAiKTtyZXR1cm4gYXdhaXQgdC5pbXBvcnQocyl9Y2FzZSJleHBvcnQiOntsZXRbcixuXT1hd2FpdCB0LmV4cG9ydEJ5dGVzKCk7aWYobiE9PTApdGhyb3cgbmV3IGdlKG4pO2lmKCFyKXRocm93IG5ldyBnZSgxMik7cmV0dXJuIHJ9Y2FzZSJnZXRYZmVyU3RhdGUiOnJldHVybiBhd2FpdCB0LnhmZXJTdGF0ZS5nZXQoKTtkZWZhdWx0OntsZXQgcj1lO3Rocm93IEVycm9yKCJ1bmtub3duIHdvcmtlciBjb21tYW5kIil9fX19Y2xhc3MgZ2UgZXh0ZW5kcyBFcnJvcntzdGF0dXM7Y29uc3RydWN0b3IoZSl7c3VwZXIoYFdvcmtlclN0YXR1c0Vycm9yOiAke0JbZV19YCk7dGhpcy5zdGF0dXM9ZTt0aGlzLm5hbWU9IldvcmtlclN0YXR1c0Vycm9yIn19ZnVuY3Rpb24gU3IoZSx0KXtyZXR1cm57a2luZDoicmVwbHkiLGlkOmUsb2s6ITAscmVzdWx0OnR9fWZ1bmN0aW9uIFJuKGUsdCl7cmV0dXJue2tpbmQ6InJlcGx5IixpZDplLG9rOiExLHN0YXR1czp0fX12YXIgTGU9Z2xvYmFsVGhpcyxSaT1uZXcgTW4oKGUsdCk9PntpZih0JiZ0Lmxlbmd0aD4wKUxlLnBvc3RNZXNzYWdlKGUsdCk7ZWxzZSBMZS5wb3N0TWVzc2FnZShlKX0pO0xlLm9ubWVzc2FnZT0oZSk9PntsZXQgdD1lLmRhdGE7aWYoIVZuKHQpKXJldHVybjtGYSh0KX07YXN5bmMgZnVuY3Rpb24gRmEoZSl7dHJ5e2xldCB0PWF3YWl0IFJpLmhhbmRsZShlKTtpZigoZS5vcD09PSJleHBvcnQifHxlLm9wPT09Im1zZ2NoZWNrInx8ZS5vcD09PSJlbnRjaGVjayIpJiZ0IGluc3RhbmNlb2YgVWludDhBcnJheSl7bGV0IHI9dC5zbGljZSgpO0xlLnBvc3RNZXNzYWdlKFNyKGUuaWQsciksW3IuYnVmZmVyXSk7cmV0dXJufWlmKGUub3A9PT0icmVjb25jaWxlIiYmdCYmdHlwZW9mIHQ9PT0ib2JqZWN0IiYmIm1zZ2NoZWNrImluIHQmJnQubXNnY2hlY2sgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtsZXQgcj10Lm1zZ2NoZWNrLnNsaWNlKCksbj17Li4udCxtc2djaGVjazpyfTtMZS5wb3N0TWVzc2FnZShTcihlLmlkLG4pLFtyLmJ1ZmZlcl0pO3JldHVybn1MZS5wb3N0TWVzc2FnZShTcihlLmlkLHQpKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgZ2Upe0xlLnBvc3RNZXNzYWdlKFJuKGUuaWQsdC5zdGF0dXMpKTtyZXR1cm59Y29uc29sZS5lcnJvcigid29ya2VyIGNvbW1hbmQgZmFpbGVkIix0KSxMZS5wb3N0TWVzc2FnZShSbihlLmlkLDEyKSl9fVJpLmluaXQoKS5jYXRjaCgoZSk9Pntjb25zb2xlLmVycm9yKCJ3b3JrZXIgaW5pdCBmYWlsZWQiLGUpfSk7Cg==";var kn=typeof globalThis.Worker==="function"?globalThis.Worker:void 0,ti=kn===void 0?void 0:kn.prototype.postMessage,Tn;function jl(){if(typeof Yn!=="string"||Yn.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(Yn)}function Al(){if(Tn!==void 0)return Tn;let t=new Blob([jl()],{type:"text/javascript"});return Tn=URL.createObjectURL(t),Tn}function Tr(){if(kn===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new kn(Al(),{type:"module"})}function kr(t,e,n){if(ti===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot post to sync worker");if(n!==void 0&&n.length>0)ti.call(t,e,{transfer:n});else ti.call(t,e)}var ql=new TextEncoder().encode("diplomatic.bind.v1"),ei=new TextEncoder().encode("diplomatic.bindtag.v1"),_l=new TextEncoder().encode("DIPLOMATIC SEED FINGERPRINT"),$l=32,tc=32,ec=16,nc=32,ot=new jt;function sc(t){return t.map((e)=>({handle:e.handle,label:e.label,idx:e.idx??0}))}function Lr(t){if(t.byteLength===0||t.every((l)=>l===0))return a(22);if(t.byteLength<Gt+1)return a(14);let e=t.subarray(0,Gt);if(e.every((l)=>l===0))return a(22);let n=new U(t.subarray(Gt)),[s,i]=n.readStruct(Qs);if(i!==0)return a(i);if(s===void 0)return a(14);if(!n.done())return a(14);let[r,o]=it.fromBytes(e);if(o!==0)return a(o);if(r===void 0)return a(12);return m({enclave:r,hosts:s.hosts.map((l)=>({...l}))})}async function Mr(t,e,n){let s=_t();if(s!==0)return s;let[i,r]=qt(n);if(r!==0)return r;if(i===void 0)return 9;await Kn();let o=new Uint8Array(e.byteLength);o.set(e);let l={largeBlob:{write:o.buffer}},c={publicKey:{challenge:Tt(At),rpId:i,allowCredentials:[{type:gt,id:Nt(t)}],userVerification:"required",extensions:l,...n?.hints!==void 0?{hints:n.hints}:{}}},d;try{try{d=await navigator.credentials.get(c)}catch(y){if(!gn(y))throw y;fe(),d=await navigator.credentials.get(c)}}catch(y){return Et(y),30}finally{o.fill(0)}let[u,p]=$t(d);if(p!==0)return p;if(u===void 0)return 27;if(u.getClientExtensionResults().largeBlob?.written!==!0)return 30;return 0}var ni=32;function ic(t){if(t===void 0)return[];if(t instanceof Uint8Array)return[t];return t.filter((e)=>e.byteLength>0)}function rc(t){if(!(t instanceof Error))return!1;return t.name==="NotSupportedError"||t.name==="TypeError"}function Ur(t){if(t===void 0)return;let e=Wn(t);if(e.byteLength<ni){e.fill(0);return}if(e.byteLength===ni)return e;let n=e.slice(0,ni);return e.fill(0),n}async function oc(t){let e=_t();if(e!==0)return a(e);let[n,s]=qt(t);if(s!==0)return a(s);if(n===void 0)return a(9);let i=t?.userName??Je,r=t?.displayName??i,o=Tt(16),l=t?.authenticatorAttachment==="cross-platform",c={residentKey:l?"discouraged":"required",requireResidentKey:!l,userVerification:l?"preferred":"required"};if(t?.authenticatorAttachment!==void 0)c.authenticatorAttachment=t.authenticatorAttachment;let d={challenge:Tt(At),rp:{id:n,name:t?.rpName??In},user:{id:o,name:i,displayName:r},pubKeyCredParams:Sn,authenticatorSelection:c,...t?.hints!==void 0?{hints:t.hints}:{},...t?.excludeCredentials!==void 0&&t.excludeCredentials.length>0?{excludeCredentials:t.excludeCredentials.map((f)=>({type:gt,id:Nt(f)}))}:{}},u=t?.salt!==void 0?Nt(t.salt):void 0,p=(f)=>xn({publicKey:{...d,extensions:f&&u!==void 0?{prf:{eval:{first:u}}}:{prf:{}}}}),h;try{h=await p(u!==void 0)}catch(f){if(u===void 0||!rc(f))return Et(f),a(30);try{h=await p(!1)}catch(S){return Et(S),a(30)}}let[y,Z]=$t(h);if(Z!==0)return a(Z);if(y===void 0)return a(27);let b=y.getClientExtensionResults(),X=Ur(b.prf?.results?.first),I=b.prf?.enabled===!0||X!==void 0;if(l&&X!==void 0)X.fill(0);return m({credId:new Uint8Array(y.rawId),userId:new Uint8Array(o),prfEnabled:I,prf:l?void 0:X,attachment:qs(y.authenticatorAttachment),transports:_s(y),aaguid:Cr(y)})}async function wr(t){let e=_t();if(e!==0)return a(e);let[n,s]=qt(t);if(s!==0)return a(s);if(n===void 0)return a(9);let i=t?.salt??Hn,r=Nt(i),o={challenge:Tt(At),rpId:n,userVerification:"preferred",extensions:{prf:{eval:{first:r}}}};if(t?.hints!==void 0)o.hints=t.hints;let l=ic(t?.credId);if(l.length>0)o.allowCredentials=l.map((y)=>({type:gt,id:Nt(y)}));let c;try{c=await Rn({publicKey:o})}catch(y){return Et(y),a(30)}let[d,u]=$t(c);if(u!==0)return a(u);if(d===void 0)return a(27);let p=d.getClientExtensionResults().prf?.results;if(p?.first===void 0)return a(7);let h=Ur(p.first);if(h===void 0)return a(27);return m({prf:h,credId:new Uint8Array(d.rawId),attachment:qs(d.authenticatorAttachment),transports:_s(d)})}function si(t){if(t.byteLength!==Gt)return a(10);return[t,0]}class it{#t;constructor(t){this.#t=t}static async fromRandom(t){if(t.byteLength<nc)return a(10);let e=await ot.gen256BitSecureRandomSeed(),n=Vt(e,t);try{let s=await ot.blake3(n),[i,r]=si(s);if(r!==0)return a(r);if(i===void 0)return a(12);return m(new it(i))}finally{e.fill(0),n.fill(0),t.fill(0)}}static fromBytes(t){let[e,n]=si(t);if(n!==0)return a(n);if(e===void 0)return a(10);let[s,i]=si(e.slice());if(i!==0)return a(i);if(s===void 0)return a(10);return m(new it(s))}async sealWithPasskey(t){let e=t?.salt??Hn,n=t?.credId,s=n,i=t?.createCredIfNeeded===!0&&(n===void 0||!(n instanceof Uint8Array)&&n.length===0),r,o;if(i){let[u,p]=await oc({rpId:t?.rpId,rpName:t?.rpName,userName:t?.userName??Je,displayName:t?.displayName,authenticatorAttachment:t?.authenticatorAttachment,hints:t?.hints,excludeCredentials:t?.excludeCredentials,salt:e});if(p!==0)return a(p);if(u===void 0)return a(30);if(!u.prfEnabled)return a(30);s=u.credId,r=u,o=u.prf}let l=async(u,p,h,y)=>{try{let[Z,b]=await this.#s(u);if(b!==0)return a(b);if(Z===void 0)return a(12);return m({sealedMaster:Z,salt:e.slice(),credId:p.slice(),userId:r?.userId===void 0?void 0:r.userId.slice(),attachment:h??r?.attachment,transports:y??r?.transports,aaguid:r?.aaguid===void 0?void 0:r.aaguid.slice()})}finally{u.fill(0)}};if(o!==void 0&&r!==void 0)return l(o,r.credId,r.attachment,r.transports);let[c,d]=await wr({rpId:t?.rpId,rpName:t?.rpName,credId:s,salt:e,hints:t?.hints});if(d!==0)return a(d);if(c===void 0)return a(7);return l(c.prf,c.credId,c.attachment,c.transports)}async bind(t,e){if(e!==void 0){for(let r of e)if(!await this.#i(r.credId,r.tag))return a(10)}let[n,s]=await this.sealWithPasskey(t);if(s!==0)return a(s);if(n===void 0)return a(12);let i=await this.#n(n.credId);return m({...n,tag:i})}static async unsealWithPasskey(t,e){if(t.length===0)return a(22);let n=[];for(let l of t)if(l.credId.byteLength>0)n.push(l.credId);let[s,i]=await wr({rpId:e.rpId,rpName:e.rpName,hints:e.hints,credId:n.length>0?n:void 0,salt:e.salt});if(i!==0)return a(i);if(s===void 0)return a(7);let r=t.find((l)=>F(l.credId,s.credId)),o=r===void 0?t:[r,...t.filter((l)=>l!==r)];try{for(let l of o){let[c]=await it.#r(l.sealedMaster,s.prf);if(c!==void 0)return m({enclave:c,credId:s.credId.slice()})}return a(20)}finally{s.prf.fill(0)}}async sealWithIkm(t){try{return await this.#s(t)}finally{t.fill(0)}}static async unsealWithIkm(t,e){try{return await it.#r(t,e)}finally{e.fill(0)}}async persistToLargeBlob(t=[],e){let n=e?.credId;if(n===void 0){let[r,o]=await Hr(e);if(o!==0)return a(o);if(r===void 0)return a(30);n=r}let[s,i]=this.#c(t);if(i!==0)return a(i);if(s===void 0)return a(12);try{let r=await Mr(n,s,e);if(r!==0)return a(r);return m(n)}finally{s.fill(0)}}static async fromLargeBlob(t){let[e,n]=await Yr(t?.credId,t);if(n!==0)return a(n);if(e===void 0)return a(7);try{let[s,i]=Lr(e.blob);if(i!==0)return a(i);if(s===void 0)return a(12);return m({...s,credId:e.credId})}finally{e.blob.fill(0)}}static async clearLargeBlob(t,e){return Mr(t,new Uint8Array(Gt),e)}async dumpToTty(){return 21}static fromPairPlain(t){return Lr(t)}static pairRequest(){return Be.create()}async pairAccept(t,e){let n;try{n=await ot.genX25519()}catch{return a(29)}try{let[s,i]=await Os(n.priv,t,t,n.pub);if(i!==0)return a(i);if(s===void 0)return a(12);try{let[r,o]=this.#c(e);if(o!==0)return a(o);if(r===void 0)return a(12);try{let l=await ot.encryptXSalsa20Poly1305Combined(r,s);return Ds(Vt(n.pub,l))}catch{return a(12)}finally{r.fill(0)}}finally{s.fill(0)}}finally{n.priv.fill(0)}}spawnSyncWorker(t){let e=Tr(),n=this.#t.slice();return kr(e,{id:t.id,op:"setSeed",seed:n,persist:t.persist},[n.buffer]),e}deriveCipher(t,e){let n=t.slice(),s=(o)=>this.#a(n,o),i=(o)=>this.#d(n,o);return{encrypt:Object.freeze({encrypt:s}),decrypt:Object.freeze({decrypt:i}),both:Object.freeze({encrypt:s,decrypt:i})}[e]}async deriveIdentity(t,e=0){let n=t,s=e,i=await this.#l(n,s),r=i.publicKey;return i.privateKey.fill(0),Object.freeze({publicKey:r,sign:(o)=>this.#p(n,s,o),kdmFor:(o)=>this.#m(n,s,o)})}async#e(){return await ot.blake3(this.#t,{context:_l})}async#n(t){let e=new Uint8Array(this.#t.byteLength+ei.byteLength+t.byteLength);e.set(this.#t,0),e.set(ei,this.#t.byteLength),e.set(t,this.#t.byteLength+ei.byteLength);try{return await ot.blake3(e)}finally{e.fill(0)}}async#i(t,e){if(e.byteLength!==$l)return!1;let n=await this.#n(t);try{if(n.byteLength!==e.byteLength)return!1;let s=0;for(let i=0;i<n.byteLength;i++){let r=n[i],o=e[i];if(r===void 0||o===void 0)return!1;s|=r^o}return s===0}finally{n.fill(0)}}async#s(t){let[e,n]=await Pr(ot,t);if(n!==0)return a(n);if(e===void 0)return a(12);try{let s=await ot.encryptXSalsa20Poly1305Combined(this.#t,e);return Bt(s)}catch{return a(12)}finally{e.fill(0)}}static async#r(t,e){let[,n]=Bt(t);if(n!==0)return a(n);let[s,i]=await Pr(ot,e);if(i!==0)return a(i);if(s===void 0)return a(12);let r;try{try{r=await ot.decryptXSalsa20Poly1305Combined(t,s)}catch{return a(20)}return it.fromBytes(r)}finally{s.fill(0),r?.fill(0)}}#c(t){let e=new N,n=e.writeStruct(Qs,{hosts:sc(t)});if(n!==0)return a(n);let s=e.result(),i=new Uint8Array(Gt+s.byteLength);return i.set(this.#t,0),i.set(s,Gt),[i,0]}async#a(t,e){let n=await this.#o(t);try{return await ot.encryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#d(t,e){let n=await this.#o(t);try{return await ot.decryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#o(t){let e=new Uint8Array(this.#t.byteLength+t.byteLength);e.set(this.#t,0),e.set(t,this.#t.byteLength);try{return await ot.blake3(e)}finally{e.fill(0)}}async#u(t,e){let n=new TextEncoder().encode(t),s=new Uint8Array(8);return new DataView(s.buffer).setBigUint64(0,BigInt(e),!1),await this.#o(Vt(n,s))}async#l(t,e){let n=await this.#u(t,e);try{return await ot.deriveEd25519KeyPair(n)}finally{n.fill(0)}}async#p(t,e,n){let s=await this.#l(t,e);try{return await ot.signEd25519(n,s.privateKey)}finally{s.privateKey.fill(0)}}async#m(t,e,n){let s=await this.#l(t,e),i=Vt(s.privateKey,n);s.privateKey.fill(0);try{return(await ot.blake3(i)).slice(0,wt)}finally{i.fill(0)}}}async function Pr(t,e,n=ql){if(e.byteLength<ec)return a(10);let s=await t.blake3(Vt(e,n));return m(s.slice(0,tc))}var lc=new Set(["constructor","prototype","length","name"]);function Br(t){for(let e of Object.getOwnPropertyNames(t)){if(lc.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}Br(it);Br(it.prototype);var zr=8;class Ln{#t;#e;#n;#i;#s;constructor(t){if(this.#s=t.persistKeyring,this.#n={rpId:t.rpId,rpName:t.rpName},this.#i=t.userName??t.rpId??t.rpName??Je,t.keyring!==void 0)this.#e=kt(t.keyring)}get keyring(){return this.#e===void 0?void 0:kt(this.#e)}list(){if(this.#e===void 0)return[];return this.#e.entries.map(dc)}async save(t,e){if(e?.persist===!0)return Promise.reject(Error("prf-store: use bindAndSave(enclave) to persist a binding"));return this.#t=t,this.#t}async bindAndSave(t,e){let n=this.#e,s=e?.credId,i=s instanceof Uint8Array?s.byteLength>0:s!==void 0&&s.length>0;if(!i&&n!==void 0&&n.entries.length>=zr)return a(26);let r=Jr(e?.nick),o=e?.excludeCredentials??(i?void 0:Fr(n)),l=e?.salt??n?.salt,c=n===void 0?void 0:n.entries.map((Z)=>({credId:Z.credId,tag:Z.tag})),[d,u]=await t.bind({...this.#n,salt:l,credId:s,createCredIfNeeded:e?.createCredIfNeeded??!i,excludeCredentials:o,userName:this.#i,displayName:r??this.#n.rpName??this.#i,authenticatorAttachment:e?.authenticatorAttachment,hints:e?.hints},c);if(u!==0)return a(u);if(d===void 0)return a(12);let p=Date.now(),h={type:"prf",sealedMaster:d.sealedMaster,credId:d.credId,tag:d.tag,userId:d.userId,nick:r,enrolledAt:p,lastUsedAt:p,attachment:d.attachment,transports:d.transports,aaguid:d.aaguid,enrolledOs:cc()},y=n===void 0?{salt:d.salt.slice(),entries:[]}:kt(n);return this.#e=uc(y,h),this.#t=t,await this.#s(kt(this.#e)),m(this.#t)}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0||t.entries.length===0)return a(22);let[e,n]=await it.unsealWithPasskey(t.entries.map((i)=>({sealedMaster:i.sealedMaster,credId:i.credId})),{...this.#n,salt:t.salt});if(n!==0)return a(n);this.#t=e.enclave;let s=pc(t,e.credId);if(s!==void 0)this.#e=s,await this.#s(kt(s));return m(e.enclave)}async rename(t,e){let n=this.#e;if(n===void 0)return a(22);let s=n.entries.findIndex((c)=>F(c.credId,t));if(s<0)return a(13);let i=n.entries.map(ze),r=i[s];if(r===void 0)return a(13);let o=Jr(e);i[s]={...r,nick:o};let l={salt:n.salt.slice(),entries:i};return this.#e=l,await this.#s(kt(l)),m(void 0)}async remove(t){let e=this.#e;if(e===void 0)return a(22);let n=e.entries.filter((i)=>!F(i.credId,t));if(n.length===e.entries.length)return a(13);if(n.length===0)return this.#e=void 0,await this.#s(void 0),m(void 0);let s={salt:e.salt.slice(),entries:n.map(ze)};return this.#e=s,await this.#s(kt(s)),m(void 0)}async wipe(){this.#t=void 0,this.#e=void 0,await this.#s(void 0)}}function Jr(t){if(t===void 0)return;let e=t.trim();return e===""?void 0:e}function cc(){if(typeof navigator>"u")return;return Rr(navigator.userAgent)}function ze(t){let[e,n]=Bt(t.sealedMaster.slice());return{type:"prf",sealedMaster:n===0&&e!==void 0?e:t.sealedMaster,credId:t.credId.slice(),tag:t.tag.slice(),userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs}}function kt(t){return{salt:t.salt.slice(),entries:t.entries.map(ze)}}function Nr(t){return t!==null&&typeof t==="object"}function ac(t){if(!Nr(t)||t.type!=="prf")return;if(!(t.sealedMaster instanceof Uint8Array)||!(t.credId instanceof Uint8Array)||!(t.tag instanceof Uint8Array)||t.tag.byteLength!==32||typeof t.enrolledAt!=="number"||!Number.isFinite(t.enrolledAt))return;let[e,n]=Bt(t.sealedMaster);if(n!==0||e===void 0)return;let s=t.attachment==="platform"||t.attachment==="cross-platform"?t.attachment:void 0,i=t.enrolledOs,r=i==="ios"||i==="macos"||i==="android"||i==="windows"||i==="linux"||i==="other"?i:void 0,o=Array.isArray(t.transports)?t.transports.filter((l)=>typeof l==="string"):void 0;return{type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:t.tag.slice(),userId:t.userId instanceof Uint8Array?t.userId.slice():void 0,nick:typeof t.nick==="string"?t.nick:void 0,enrolledAt:t.enrolledAt,lastUsedAt:typeof t.lastUsedAt==="number"&&Number.isFinite(t.lastUsedAt)?t.lastUsedAt:void 0,attachment:s,transports:o===void 0||o.length===0?void 0:o,aaguid:t.aaguid instanceof Uint8Array?t.aaguid.slice():void 0,enrolledOs:r}}function Er(t){if(!Nr(t))return;if(!(t.salt instanceof Uint8Array)||!Array.isArray(t.entries))return;let e=[];for(let n of t.entries){let s=ac(n);if(s!==void 0)e.push(s)}if(e.length===0)return;return{salt:t.salt.slice(),entries:e}}function dc(t){return{type:"prf",credId:t.credId.slice(),userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs}}function Fr(t){if(t===void 0)return[];return t.entries.filter((e)=>e.credId.byteLength>0).map((e)=>e.credId.slice())}function uc(t,e){let n=t.entries.map(ze),s=n.findIndex((i)=>F(i.credId,e.credId));if(s>=0){let i=n[s];n[s]={...e,enrolledAt:i?.enrolledAt??e.enrolledAt,nick:e.nick??i?.nick}}else n.push(e);return{salt:t.salt.slice(),entries:n}}function pc(t,e){if(e.byteLength===0)return;let n=t.entries.findIndex((r)=>F(r.credId,e));if(n<0)return;let s=t.entries.map(ze),i=s[n];if(i===void 0)return;return s[n]={...i,lastUsedAt:Date.now()},{salt:t.salt.slice(),entries:s}}var mc=Mn("fbfc3007154e4ecc8c0b6e020557d7bd"),hc=Mn("ea9b8d664d011d213ce4b6b48cb575d4"),yc=Mn("08987058cadc4b81b6e130de50dcbe96"),Zc=Mn("2fc0579f811347eab116bb5a8db9202a");function Mn(t){let e=new Uint8Array(16);for(let n=0;n<16;n++)e[n]=Number.parseInt(t.slice(n*2,n*2+2),16);return e}function bc(t){if(t===void 0||t.byteLength!==16)return;if(F(t,mc))return"Apple Passkey";if(F(t,hc))return"GPM";if(F(t,yc))return"Windows Hello";if(F(t,Zc))return"YubiKey";return}function Xc(t){if(t.attachment==="cross-platform")return!0;if(t.transports===void 0)return!1;return t.transports.some((e)=>e==="usb"||e==="nfc"||e==="ble")}function Qr(t){let e=bc(t.aaguid);if(e!==void 0)return e;if(Xc(t))return"Security key";if(t.attachment==="platform"){if(t.enrolledOs==="ios"||t.enrolledOs==="macos")return"Apple Passkey";if(t.enrolledOs==="android")return"GPM";if(t.enrolledOs==="windows")return"Windows Hello";return"Passkey"}return"Passkey"}function Gc(t){if(t.byteLength===0)return"";let e=Math.min(4,t.byteLength),n="";for(let s=t.byteLength-e;s<t.byteLength;s++){let i=t[s];if(i===void 0)continue;n+=i.toString(16).padStart(2,"0")}return n}function fc(t){if(t.nick!==void 0&&t.nick!=="")return t.nick;let e=Qr(t),n=Gc(t.credId);return n===""?e:`${e} ${n}`}var Vc="diplomatic.pin/";function Ic(t){return Vc+pt(t)}async function vr(t,e,n){let s=await e.deriveIdentity(Ic(n),0);return t.blake3(s.publicKey)}async function wn(t,e){let n=await t.gen256BitSecureRandomSeed(),s=await vr(t,e,n);return{n,h:s}}async function Pn(t,e,n){let s=await vr(t,e,n.n);return Sc(s,n.h)}function Dr(t){if(t===void 0||t===null||typeof t!=="object")return;let e=t;if(!(e.n instanceof Uint8Array)||!(e.h instanceof Uint8Array))return;if(e.n.byteLength<1||e.h.byteLength<1)return;return{n:e.n.slice(),h:e.h.slice()}}function Un(t){return{n:t.n.slice(),h:t.h.slice()}}function Sc(t,e){if(t.byteLength!==e.byteLength)return!1;let n=0;for(let s=0;s<t.byteLength;s++)n|=t[s]^e[s];return n===0}var Bn="keyring",Or="prfMeta",ii="idPin",jr="idPub";class Jn{#t;db;#e;constructor(t,e){this.db=t,this.#e=e}async save(t,e){return await this.#n(t),this.#t=t,this.#t}async load(){return this.#t}async clearSession(){this.#t=void 0}async wipe(){this.#t=void 0;let t=this.db.transaction(dt,"readwrite"),e=t.objectStore(dt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.delete(Bn),e.delete(Or),e.delete(ii),e.delete(jr)})}async loadKeyring(){let e=this.db.transaction(dt,"readonly").objectStore(dt);return new Promise((n,s)=>{let i=e.get(Bn);i.onsuccess=()=>{n(Er(i.result))},i.onerror=()=>s(i.error)})}async persistKeyring(t){let e=this.db.transaction(dt,"readwrite"),n=e.objectStore(dt);return new Promise((s,i)=>{if(e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(Or),t===void 0){n.delete(Bn);return}n.put(kt(t),Bn)})}async hasKeyring(){let t=await this.loadKeyring();return t!==void 0&&t.entries.length>0}async openPrfStore(t){let e=await this.loadKeyring();return new Ln({rpId:t.rpId,rpName:t.rpName,userName:t.userName,keyring:e,persistKeyring:(n)=>this.persistKeyring(n)})}async#n(t){await this.#r(jr);let e=await this.#i();if(e!==void 0){if(!await Pn(this.#e,t,e))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)");return}let n=await wn(this.#e,t);await this.#s(n)}#i(){let e=this.db.transaction(dt,"readonly").objectStore(dt);return new Promise((n,s)=>{let i=e.get(ii);i.onsuccess=()=>n(Dr(i.result)),i.onerror=()=>s(i.error)})}#s(t){let e=Un(t),n=this.db.transaction(dt,"readwrite"),s=n.objectStore(dt);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error),s.put(e,ii)})}#r(t){let e=this.db.transaction(dt,"readwrite"),n=e.objectStore(dt);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}}class ri{db;constructor(t){this.db=t}async enq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(bt,"readwrite"),i=s.objectStore(bt);return new Promise((r,o)=>{s.oncomplete=()=>r(),s.onerror=()=>o(s.error);for(let l of n){let c=pt(l);i.put({host:t,hash:c})}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(bt,"readwrite"),i=s.objectStore(bt);return new Promise((r,o)=>{s.oncomplete=()=>r(),s.onerror=()=>o(s.error);for(let l of n){let c=pt(l);i.delete([t,c])}})}async list(t){let n=this.db.transaction(bt,"readonly").objectStore(bt);return new Promise((s,i)=>{let r=n.getAll();r.onsuccess=()=>{let l=r.result.filter((c)=>c.host===t).map((c)=>c.hash);s(l.map((c)=>ge(c)))},r.onerror=()=>i(r.error)})}async count(){let e=this.db.transaction(bt,"readonly").objectStore(bt);return new Promise((n,s)=>{let i=e.count();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(bt,"readwrite"),e=t.objectStore(bt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var dt="seedMeta",at="hosts",bt="uploadQueue",Zt="downloadQueue",A="messages",Pe="apld",Ar=3,qr="diplomatic-store-db";class oi{seed;hosts;uploads;downloads;messages;db;constructor(t,e){this.db=t,this.seed=new Jn(t,e),this.hosts=new Es(t),this.uploads=new ri(t),this.downloads=new Ns(t),this.messages=new Fs(t,e)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function Wc(){return new Promise((t,e)=>{let n=indexedDB.open(qr,Ar);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!s.objectStoreNames.contains(dt))s.createObjectStore(dt);if(!s.objectStoreNames.contains(at))s.createObjectStore(at,{keyPath:"label"});if(!s.objectStoreNames.contains(bt))s.createObjectStore(bt,{keyPath:["host","hash"]});if(!s.objectStoreNames.contains(Zt))s.createObjectStore(Zt);let r;if(!s.objectStoreNames.contains(A))r=s.createObjectStore(A);else{if(!i)throw Error("missing upgrade transaction for messages store");r=i.objectStore(A)}if(!r.indexNames.contains(Pe))r.createIndex(Pe,"apld",{unique:!1})},n.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${qr} → v${Ar}); waiting for other connections to close`)},n.onsuccess=()=>{let s=n.result;s.onversionchange=()=>{s.close()},t(s)},n.onerror=()=>e(n.error??Error("protocol store IndexedDB open failed"))})}async function li(t){let e=await Wc();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((n)=>{setTimeout(()=>n(!1),2000)})])}catch{}return new oi(e,t)}function _r(t){if(!t||typeof t!=="object")return!1;if(!("kind"in t))return!1;return typeof t.kind==="string"}function $r(t){if(typeof t!=="number")return;return t}function gc(t){if(!t||typeof t!=="object")return;if(!("phase"in t))return;let e=Kc(t.phase);if(e===void 0)return;let n={phase:e};if("host"in t&&typeof t.host==="string")n.host=t.host;if("done"in t&&typeof t.done==="number")n.done=t.done;if("total"in t&&typeof t.total==="number")n.total=t.total;if("bytesDone"in t&&typeof t.bytesDone==="number")n.bytesDone=t.bytesDone;if("bytesTotal"in t&&typeof t.bytesTotal==="number")n.bytesTotal=t.bytesTotal;return n}function Kc(t){if(t==="peek"||t==="pull"||t==="open"||t==="exec"||t==="push"||t==="import"||t==="idle"||t==="apply")return t==="apply"?"exec":t;return}function to(t){if(!t||typeof t!=="object")return;if(!("numUploads"in t)||!("numDownloads"in t))return;if(typeof t.numUploads!=="number"||typeof t.numDownloads!=="number")return;let e={phase:"idle"};if("progress"in t){let n=gc(t.progress);if(n===void 0)return;e=n}return{numUploads:t.numUploads,numDownloads:t.numDownloads,progress:e}}var Xt="[DIPLOMATIC]";class Ee{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:Qt};clientState;xferState;constructor(t,e,n,s,i){this.state=t,this.store=e,this.readyTimeoutMs=i,this.clientState=new ft(async()=>this.cachedClientState),this.xferState=new ft(async()=>this.cachedXferState),this.scheduledSync=new Te(s,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(r){console.error(`${Xt} worker sync after local write failed`,r)}}),this.local=new me(n,t,e,()=>{throw Error(`${Xt} local writer has no transport (use worker for network)`)},be,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),this.local.xferState.listen((r)=>{this.cachedXferState={numUploads:r.numUploads,numDownloads:r.numDownloads,progress:this.cachedXferState.progress},this.xferState.emit()})}bindWorker(t){let e=this.worker;if(e){e.onmessage=null,e.onerror=null,e.onmessageerror=null;try{e.terminate()}catch{}}this.worker=t,t.onmessage=(n)=>{this.onMessage(n.data)},t.onerror=(n)=>{console.error(`${Xt} worker error`,n),this.failPending(Error(`${Xt} worker failed to load`))},t.onmessageerror=()=>{this.failPending(Error(`${Xt} worker message error`))}}failPending(t){for(let[,e]of this.pending)e.reject(t);this.pending.clear()}async flushScheduledSync(){await this.scheduledSync.flush()}static async open(t,e,n={}){let s=n.clock??new Ut,i=n.syncDebounceMs??on,r=n.readyTimeoutMs??15000,o=new Ee(t,e,s,i,r);return await o.hydrateStateFromStore(e),o}async hydrateStateFromStore(t){await this.loadSession(!1);let e=await t.uploads.count(),n=await t.downloads.count();this.cachedXferState={numUploads:e,numDownloads:n,progress:Qt}}async loadSession(t){let e=await this.store.seed.load(),n=await this.store.hosts.list();this.cachedClientState={hasSeed:e!==void 0,hasHost:Array.from(n).length>0,connected:t}}async pullRemoteXfer(){let t=await this.request({id:this.allocId(),op:"getXferState"}),e=to(t);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${Xt} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${Xt} worker ping failed`)}terminate(){this.scheduledSync.cancel();let t=this.worker;if(this.worker=void 0,t)try{t.terminate()}catch{}this.failPending(Error(`${Xt} worker terminated`))}onMessage(t){if(!_r(t))return;let e=t;switch(e.kind){case"ready":return;case"initError":{this.failPending(Error(`${Xt} worker init failed: ${e.message}`));return}case"clientState":{if(this.cachedClientState.connected===e.connected)return;this.cachedClientState={...this.cachedClientState,connected:e.connected},this.clientState.emit();return}case"xferState":{this.cachedXferState=e.state,this.xferState.emit();return}case"dirty":{P("worker dirty",{eids:e.eids.length}),this.state.refresh(e.eids.map(Rc));return}case"wiped":{this.state.clear();return}case"reply":{let n=this.pending.get(e.id);if(!n)return;if(this.pending.delete(e.id),e.ok)n.resolve(e.result);else n.reject(new Ne(e.status));return}default:return}}allocId(){let t=this.nextId;return this.nextId+=1,t}request(t,e){let n=this.requireWorker();return new Promise((s,i)=>{if(this.pending.set(t.id,{resolve:s,reject:i}),e&&e.length>0)n.postMessage(t,e);else n.postMessage(t)})}async requestStatus(t,e){try{let n=await this.request(t,e),s=$r(n);if(s!==void 0)return s;return 0}catch(n){if(n instanceof Ne)return n.status;return 12}}serializeHost(t){return{handle:t.handle.href,label:t.label,idx:t.idx??0}}async setSeed(t,e){await this.local.setSeed(t,e),await this.loadSession(!1),this.clientState.emit();let n=this.allocId(),s=this.readyTimeoutMs;await new Promise((i,r)=>{let o=void 0,l=(c)=>{if(o!==void 0)clearTimeout(o);c()};this.pending.set(n,{resolve:(c)=>l(()=>i(c)),reject:(c)=>l(()=>r(c))}),o=setTimeout(()=>{this.pending.delete(n),r(Error(`${Xt} setSeed worker timeout after ${s}ms`))},s);try{let c=t.spawnSyncWorker({id:n,persist:e?.persist});this.bindWorker(c)}catch(c){if(this.pending.delete(n),o!==void 0)clearTimeout(o);r(c instanceof Error?c:Error(String(c)))}});try{await this.pullRemoteXfer()}catch{}}async link(t,e=!0){await this.local.link(t,!1),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),await this.request({id:this.allocId(),op:"link",host:this.serializeHost(t),connect:e})}async unlink(t){if(await this.local.unlink(t),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),!this.worker)return;await this.request({id:this.allocId(),op:"unlink",label:t})}async hosts(){return this.local.hosts()}async connect(t=!0,e=!0){if(!this.worker)return;await this.request({id:this.allocId(),op:"connect",listen:t,sync:e})}async disconnect(){if(!this.worker)return;await this.request({id:this.allocId(),op:"disconnect"})}async insertRaw(t,e){return this.local.insertRaw(t,e)}async updateRaw(t,e,n,s){return this.local.updateRaw(t,e,n,s)}async insert(t){return this.local.insert(t)}async update(t){return this.local.update(t)}async delete(t){return this.local.delete(t)}async genEID(t){return this.local.genEID(t)}async sync(){if(!this.worker)return 0;return this.requestStatus({id:this.allocId(),op:"sync"})}async rebuild(t){return this.scheduledSync.cancel(),await this.scheduledSync.flush(),this.requestStatus({id:this.allocId(),op:"rebuild",checkHost:t?.checkHost})}async listMsgs(t){return this.local.listMsgs(t)}async countMsgs(t){return this.local.countMsgs(t)}async reconcile(t,e){try{let n=await this.request({id:this.allocId(),op:"reconcile",hostLabel:t,pull:e?.pull,push:e?.push,sync:e?.sync});if(!xc(n))return a(12);return m(n)}catch(n){if(n instanceof Ne&&n.status!==0)return a(n.status);return a(12)}}async msgcheck(){let t=await this.request({id:this.allocId(),op:"msgcheck"});if(!(t instanceof Uint8Array))throw Error(`${Xt} msgcheck: expected Uint8Array`);return t}async entcheck(){let t=await this.request({id:this.allocId(),op:"entcheck"});if(!(t instanceof Uint8Array))throw Error(`${Xt} entcheck: expected Uint8Array`);return t}async wipe(t){if(await this.local.wipe(t),this.worker)await this.request({id:this.allocId(),op:"wipe",msgs:t?.msgs,ents:t?.ents,meta:t?.meta,seed:t?.seed});await this.hydrateStateFromStore(this.store),this.clientState.emit(),this.xferState.emit()}async import(t){let e=new Uint8Array(await t.arrayBuffer());return this.requestStatus({id:this.allocId(),op:"import",bytes:e},[e.buffer])}async export(t,e){try{let n=await this.request({id:this.allocId(),op:"export"});if(!(n instanceof Uint8Array))return 12;let s=new Blob([n.slice()]);return an(s,t),0}catch(n){if(n instanceof Ne)return n.status;return 12}}}class Ne extends Error{status;constructor(t){super(`WorkerReplyError: ${g[t]}`);this.status=t;this.name="WorkerReplyError"}}function xc(t){if(!t||typeof t!=="object")return!1;let e=t;return e.msgcheck instanceof Uint8Array&&e.msgcheck.length===32&&typeof e.numBags==="number"&&typeof e.numDupes==="number"}function Rc(t){return t}var Ve="[DIPLOMATIC]";async function zn(t){if(t.verbose!==void 0)ln(t.verbose);let e=t.clock??new Ut;if(t.worker===!0&&Cc(t)!==void 0)throw Error(`${Ve} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(t.worker!==!0){console.info(`${Ve} sync on main thread `+"(no worker — app did not request a worker)");let i=await eo(t.store);return Hc(e,t.state,i)}if(typeof Worker>"u")throw Error(`${Ve} worker: true but Worker API is unavailable`);let n=await eo(void 0),s=await Ee.open(t.state,n,{readyTimeoutMs:t.readyTimeoutMs,clock:e,syncDebounceMs:t.syncDebounceMs});return console.info(`${Ve} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:s,mode:"worker",dispose:()=>{console.info(`${Ve} terminating sync worker`),s.terminate()}}}function Cc(t){if("store"in t)return t.store;return}async function Hc(t,e,n){let s=new me(t,e,n,ss,be);return{client:s,mode:"main",dispose:()=>{s.disconnect()}}}async function eo(t){if(t!==void 0)return t;if(typeof indexedDB>"u")throw Error(`${Ve} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return li(be)}function Yc(t){let[e,n]=ci();return Nn(()=>{async function s(){let r=await t.clientState.get();n(r)}let i=t.clientState.listen(s);return s(),()=>{i()}},[t]),e}function Tc(t){let[e,n]=ci();return Nn(()=>{async function s(){let r=await t.xferState.get();n(r)}let i=t.xferState.listen(s);return s(),()=>{i()}},[t]),e}function kc(t){Nn(()=>{async function e(){try{if(!(await t.clientState.get()).hasSeed)return;await t.connect(),await t.sync()}catch(r){console.error("reconnectAndSync failed",r)}}function n(){e()}function s(){if(typeof document<"u"&&document.visibilityState==="visible")e()}function i(){e()}if(globalThis.addEventListener("online",n),typeof document<"u")document.addEventListener("visibilitychange",s);return globalThis.addEventListener("focus",i),globalThis.addEventListener("pageshow",i),()=>{if(globalThis.removeEventListener("online",n),typeof document<"u")document.removeEventListener("visibilitychange",s);globalThis.removeEventListener("focus",i),globalThis.removeEventListener("pageshow",i)}},[t])}function Lc(t={}){let e=t.clock??new Ut,{seed:n,host:s,readyTimeoutMs:i,optimistic:r,verbose:o}=t,l=t.worker===!0,c="store"in t?t.store:void 0,[d,u]=ci({stateMgr:ls});return Nn(()=>{let p=!1,h;return(async()=>{let y=await Js({optimistic:r,verbose:o});if(p)return;let Z=sn(y),b=l?await zn({state:Z,clock:e,worker:!0,readyTimeoutMs:i,verbose:o}):await zn({state:Z,clock:e,store:c,readyTimeoutMs:i,verbose:o});if(p){b.dispose();return}h=b.dispose;let{client:X,mode:I}=b;if(n)await X.setSeed(n);if(s)await X.link(s);if(p){h();return}u({client:X,entDB:y,stateMgr:Z,mode:I,error:void 0})})().catch((y)=>{let Z=y instanceof Error?y:Error(String(y));if(console.error("[DIPLOMATIC] useClient init failed",Z),!p)u((b)=>({...b,client:void 0,error:Z}))}),()=>{p=!0,h?.()}},[e,n,s,l,c,i,r,o]),d}import{use as Mc,useEffect as no,useRef as wc,useState as Pc}from"react";function so(t,e,n){let[s,i]=Pc();return no(()=>{async function r(){let o=performance.now();P(`watcher ${e} start`);let l=await n();P(`watcher ${e} setVal`,{ms:Math.round(performance.now()-o)}),i(l)}return r(),t.on(e,r),()=>{t.off(e,r)}},[t,e,n]),s}function Uc(t,e,n){let s=wc(n());return no(()=>{async function i(){s.current=n()}return t.on(e,i),()=>{t.off(e,i)}},[t,e,n]),Mc(s.current)}function io(t,e){return`${t}:${e}`}class ai{queue=new Map;async enq(t){for(let e of t){let n=io(e.host,e.seq);this.queue.set(n,e)}}async deq(t,e){for(let n of e){let s=io(t,n);this.queue.delete(s)}}async list(){let t=[];for(let e of this.queue.values())t.push(e);return t}async count(){return this.queue.size}async wipe(){this.queue.clear()}}function Bc(t,e){if(e.setLastSeq!==void 0)t.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0&&e.lastSeq>t.lastSeq)t.lastSeq=e.lastSeq}class di{hosts=new Map;async add(t){let e=this.hosts.get(t.label),n=e!==void 0&&e.handle===t.handle&&(e.idx??0)===(t.idx??0),s={...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0};this.hosts.set(t.label,s)}async touch(t,e){await this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.hosts.get(t);if(!n)return;Bc(n,e),this.hosts.set(t,{...n})}async get(t){return this.hosts.get(t)}async set(t,e){let n=this.hosts.get(t);if(!n)return 13;return this.hosts.set(t,{...n,...e}),0}async del(t){this.hosts.delete(t)}async list(){return this.hosts.values()}async wipe(){this.hosts.clear()}}class ui{crypto;messages=new Map;constructor(t){this.crypto=t}async add(t){let e=[];for(let{key:n,data:s}of t)this.messages.set(Y(n),s),e.push(0);return e}async del(t){for(let e of t)this.messages.delete(Y(e))}async get(t){let e=this.messages.get(Y(t));if(e)return await zt(t,e,this.crypto);return}async has(t){return this.messages.has(Y(t))}async list(t){let e=t?.apld,n=t?.body!==!1,s=[];for(let[i,r]of this.messages){if(e!==void 0&&pe(r.apld)!==e)continue;let o=rt(i);s.push(await zt(o,r,this.crypto,{body:n}))}return s}async count(t){if(t===void 0)return this.messages.size;let e=0;for(let n of this.messages.values())if(pe(n.apld)===t)e++;return e}async listKeys(){let t=[];for(let e of this.messages.keys())t.push(rt(e));return t}async last(t){let e;for(let[n,s]of this.messages){if(F(t,s.eid)===!1)continue;let i=rt(n);if(e===void 0)e={hash:i,data:s};else if((s.ctr??0)>(e.data.ctr??0)||(s.ctr??0)===(e.data.ctr??0)&&(s.off??0)>(e.data.off??0))e={hash:i,data:s}}if(e)return await zt(e.hash,e.data,this.crypto);return}async markApplied(t){for(let e of t){let n=this.messages.get(Y(e));if(!n)continue;vt(n,Jt)}}async markFailed(t){for(let{key:e,err:n}of t){let s=this.messages.get(Y(e));if(!s)continue;vt(s,It,n)}}async wipe(){this.messages.clear()}}class pi{#t;#e;#n;constructor(t){this.#e=t}async save(t,e){if(this.#n!==void 0){if(!await Pn(this.#e,t,this.#n))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)")}else this.#n=await wn(this.#e,t);return this.#t=t,this.#t}async load(){return this.#t}async wipe(){this.#t=void 0,this.#n=void 0}peekPin(){return this.#n===void 0?void 0:Un(this.#n)}}class mi{queue=new Map;async enq(t,e){let n=this.queue.get(t)||new Set;this.queue.set(t,n);for(let s of e)n.add(pt(s))}async deq(t,e){let n=this.queue.get(t);if(n)for(let s of e)n.delete(pt(s))}async list(t){let e=this.queue.get(t);if(!e)return[];let n=[];for(let s of e)n.push(ge(s));return n}async count(){let t=0;for(let e of this.queue.values())t+=e.size;return t}async wipe(){this.queue.clear()}}class ro{seed;hosts=new di;uploads=new mi;downloads=new ai;messages;constructor(t){this.seed=new pi(t),this.messages=new ui(t)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}class oo{singletonType;latest;latestOff=-1;emitter=new Lt;constructor(t){this.singletonType=t}async apply(t){for(let e of t){let n=new U(e.eid),[s,i]=n.readStruct(et);if(i!==0)continue;let r=new N;r.writeVarString(this.singletonType);let o=r.result();if(s.id.length===o.length&&s.id.every((l,c)=>l===o[c])){if(this.latest===void 0||e.off>this.latestOff)this.latestOff=e.off,this.latest=e.bod,this.emitter.emit(this.singletonType,null)}}return t.map(()=>0)}clear=async()=>(this.latest=void 0,this.latestOff=-1,this.emitter.emit(this.singletonType,null),0);notify=(t)=>{for(let e of t)if(e===this.singletonType)this.emitter.emit(this.singletonType,null)};refresh=async(t)=>{this.notify([this.singletonType])};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}class lo{#t;#e;#n;#i;constructor(t){if(this.#n=t.rpId,this.#i=t.rpName,t.credId!==void 0)this.#e=t.credId.slice()}get credId(){if(this.#e===void 0)return;return this.#e.slice()}setCredId(t){this.#e=t===void 0?void 0:t.slice()}async save(t,e){if(e?.persist!==!0)return this.#t=t,this.#t;let[n,s]=await t.persistToLargeBlob([],{rpId:this.#n,rpName:this.#i,credId:this.#e});if(s!==0||n===void 0)return Promise.reject(Error(`persistToLargeBlob status ${s}`));return this.#e=n,this.#t=t,this.#t}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0)return a(22);let[e,n]=await it.fromLargeBlob({rpId:this.#n,rpName:this.#i,credId:t});if(n!==0||e===void 0)return a(n);return this.#t=e.enclave,m(e.enclave)}async wipe(){let t=this.#e;if(t!==void 0){let e=await it.clearLargeBlob(t,{rpId:this.#n});if(e!==0)return Promise.reject(Error(`clearLargeBlob status ${e}`))}this.#t=void 0,this.#e=void 0}}export{Jt as APLD_APPLIED,It as APLD_ERROR,Kt as APLD_PENDING,zs as CachedEntDB,Ut as Clock,Hn as DEFAULT_PRF_SALT,U as Decoder,it as Enclave,N as Encoder,Gn as EntDBMemory,Us as EntIDB,ns as HTTPTransport,Jn as IDBSeedStore,oi as IDBStore,zr as KEYRING_MAX,Gt as MASTER_SEED_LEN,ro as MemoryStore,Be as PairRequest,lo as PasskeySeedStore,Ln as PrfSeedStore,os as SEALED_MASTER_KEY_LEN,oo as SingletonStateManager,Re as StateManager,g as Status,me as SyncClient,Lt as TypedEventEmitter,Ee as WorkerClient,pe as apldFromStored,vs as asDHKEReq,Ds as asDHKEResp,Bt as asSealedMasterKey,rt as b64tob,jn as b64urltob,Y as btob64,wo as btob64url,pt as btoh,xe as checksumEntRevs,le as checksumSet,Mi as cmpBytes,be as crypto,ue as defaultPeekProgressEvery,xr as defaultWebAuthnRpId,et as eidCodec,wi as encodeEntRev,sn as entStateManager,Mo as genSingletonEID,ss as hostHTTPTransport,ge as htob,Qt as idleProgress,Oo as isApldState,O as isLiveEnt,jo as isPendingApply,ps as isTerminalApplyFailure,Eo as isTombstone,Fr as keyringCredIds,Qr as keyringKind,fc as keyringLabel,Dl as largeBlobCapable,Ui as normalizeTags,vo as nullEntDB,ls as nullStateManager,zn as openDiplomaticClient,Js as openEntDB,li as openIDBStore,Ol as prfCapable,Ye as revFromEntity,ds as revFromHead,vt as setApld,cn as shouldEmitItemProgress,Lc as useClient,Yc as useClientState,Tc as useClientXferState,so as useStateWatcher,Uc as useStateWatcherSuspense,kc as useSyncOnResume,Fl as webAuthnLastError};
1
+ function hi(t){let e=t.length,n=0,s=0;while(s<e){let i=t.charCodeAt(s++);if((i&4294967168)===0){n++;continue}else if((i&4294965248)===0)n+=2;else{if(i>=55296&&i<=56319){if(s<e){let o=t.charCodeAt(s);if((o&64512)===56320)++s,i=((i&1023)<<10)+(o&1023)+65536}}if((i&4294901760)===0)n+=3;else n+=4}}return n}function ar(t,e,n){let s=t.length,i=n,o=0;while(o<s){let r=t.charCodeAt(o++);if((r&4294967168)===0){e[i++]=r;continue}else if((r&4294965248)===0)e[i++]=r>>6&31|192;else{if(r>=55296&&r<=56319){if(o<s){let l=t.charCodeAt(o);if((l&64512)===56320)++o,r=((r&1023)<<10)+(l&1023)+65536}}if((r&4294901760)===0)e[i++]=r>>12&15|224,e[i++]=r>>6&63|128;else e[i++]=r>>18&7|240,e[i++]=r>>12&63|128,e[i++]=r>>6&63|128}e[i++]=r&63|128}}var dr=new TextEncoder,ur=50;function pr(t,e,n){dr.encodeInto(t,e.subarray(n))}function yi(t,e,n){if(t.length>ur)pr(t,e,n);else ar(t,e,n)}var mr=4096;function Fn(t,e,n){let s=e,i=s+n,o=[],r="";while(s<i){let l=t[s++];if((l&128)===0)o.push(l);else if((l&224)===192){let c=t[s++]&63;o.push((l&31)<<6|c)}else if((l&240)===224){let c=t[s++]&63,d=t[s++]&63;o.push((l&31)<<12|c<<6|d)}else if((l&248)===240){let c=t[s++]&63,d=t[s++]&63,u=t[s++]&63,p=(l&7)<<18|c<<12|d<<6|u;if(p>65535)p-=65536,o.push(p>>>10&1023|55296),p=56320|p&1023;o.push(p)}else o.push(l);if(o.length>=mr)r+=String.fromCharCode(...o),o.length=0}if(o.length>0)r+=String.fromCharCode(...o);return r}var hr=new TextDecoder,yr=200;function br(t,e,n){let s=t.subarray(e,e+n);return hr.decode(s)}function bi(t,e,n){if(n>yr)return br(t,e,n);else return Fn(t,e,n)}class se{type;data;constructor(t,e){this.type=t,this.data=e}}class rt extends Error{constructor(t){super(t);let e=Object.create(rt.prototype);Object.setPrototypeOf(this,e),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:rt.name})}}var ie=4294967295;function Zi(t,e,n){let s=n/4294967296,i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Fe(t,e,n){let s=Math.floor(n/4294967296),i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Qe(t,e){let n=t.getInt32(e),s=t.getUint32(e+4);return n*4294967296+s}function Xi(t,e){let n=t.getUint32(e),s=t.getUint32(e+4);return n*4294967296+s}var Zr=-1,Xr=4294967295,Gr=17179869183;function fr({sec:t,nsec:e}){if(t>=0&&e>=0&&t<=Gr)if(e===0&&t<=Xr){let n=new Uint8Array(4);return new DataView(n.buffer).setUint32(0,t),n}else{let n=t/4294967296,s=t&4294967295,i=new Uint8Array(8),o=new DataView(i.buffer);return o.setUint32(0,e<<2|n&3),o.setUint32(4,s),i}else{let n=new Uint8Array(12),s=new DataView(n.buffer);return s.setUint32(0,e),Fe(s,4,t),n}}function Vr(t){let e=t.getTime(),n=Math.floor(e/1000),s=(e-n*1000)*1e6,i=Math.floor(s/1e9);return{sec:n+i,nsec:s-i*1e9}}function Ir(t){if(t instanceof Date){let e=Vr(t);return fr(e)}else return null}function Sr(t){let e=new DataView(t.buffer,t.byteOffset,t.byteLength);switch(t.byteLength){case 4:{let n=e.getUint32(0),s=0;return{sec:n,nsec:0}}case 8:{let n=e.getUint32(0),s=e.getUint32(4),i=(n&3)*4294967296+s,o=n>>>2;return{sec:i,nsec:o}}case 12:{let n=Qe(e,4),s=e.getUint32(0);return{sec:n,nsec:s}}default:throw new rt(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${t.length}`)}}function Wr(t){let e=Sr(t);return new Date(e.sec*1000+e.nsec/1e6)}var Gi={type:Zr,encode:Ir,decode:Wr};class oe{static defaultCodec=new oe;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(Gi)}register({type:t,encode:e,decode:n}){if(t>=0)this.encoders[t]=e,this.decoders[t]=n;else{let s=-1-t;this.builtInEncoders[s]=e,this.builtInDecoders[s]=n}}tryToEncode(t,e){for(let n=0;n<this.builtInEncoders.length;n++){let s=this.builtInEncoders[n];if(s!=null){let i=s(t,e);if(i!=null){let o=-1-n;return new se(o,i)}}}for(let n=0;n<this.encoders.length;n++){let s=this.encoders[n];if(s!=null){let i=s(t,e);if(i!=null)return new se(n,i)}}if(t instanceof se)return t;return null}decode(t,e,n){let s=e<0?this.builtInDecoders[-1-e]:this.decoders[e];if(s)return s(t,e,n);else return new se(e,t)}}function gr(t){return t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer}function Se(t){if(t instanceof Uint8Array)return t;else if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);else if(gr(t))return new Uint8Array(t);else return Uint8Array.from(t)}var Kr=100,xr=2048;class ve{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??oe.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.maxDepth=t?.maxDepth??Kr,this.initialBufferSize=t?.initialBufferSize??xr,this.sortKeys=t?.sortKeys??!1,this.forceFloat32=t?.forceFloat32??!1,this.ignoreUndefined=t?.ignoreUndefined??!1,this.forceIntegerToFloat=t?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new ve({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,maxDepth:this.maxDepth,initialBufferSize:this.initialBufferSize,sortKeys:this.sortKeys,forceFloat32:this.forceFloat32,ignoreUndefined:this.ignoreUndefined,forceIntegerToFloat:this.forceIntegerToFloat})}reinitializeState(){this.pos=0}encodeSharedRef(t){if(this.entered)return this.clone().encodeSharedRef(t);try{return this.entered=!0,this.reinitializeState(),this.doEncode(t,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(t){if(this.entered)return this.clone().encode(t);try{return this.entered=!0,this.reinitializeState(),this.doEncode(t,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(t,e){if(e>this.maxDepth)throw Error(`Too deep objects in depth ${e}`);if(t==null)this.encodeNil();else if(typeof t==="boolean")this.encodeBoolean(t);else if(typeof t==="number")if(!this.forceIntegerToFloat)this.encodeNumber(t);else this.encodeNumberAsFloat(t);else if(typeof t==="string")this.encodeString(t);else if(this.useBigInt64&&typeof t==="bigint")this.encodeBigInt64(t);else this.encodeObject(t,e)}ensureBufferSizeToWrite(t){let e=this.pos+t;if(this.view.byteLength<e)this.resizeBuffer(e*2)}resizeBuffer(t){let e=new ArrayBuffer(t),n=new Uint8Array(e),s=new DataView(e);n.set(this.bytes),this.view=s,this.bytes=n}encodeNil(){this.writeU8(192)}encodeBoolean(t){if(t===!1)this.writeU8(194);else this.writeU8(195)}encodeNumber(t){if(!this.forceIntegerToFloat&&Number.isSafeInteger(t))if(t>=0)if(t<128)this.writeU8(t);else if(t<256)this.writeU8(204),this.writeU8(t);else if(t<65536)this.writeU8(205),this.writeU16(t);else if(t<4294967296)this.writeU8(206),this.writeU32(t);else if(!this.useBigInt64)this.writeU8(207),this.writeU64(t);else this.encodeNumberAsFloat(t);else if(t>=-32)this.writeU8(224|t+32);else if(t>=-128)this.writeU8(208),this.writeI8(t);else if(t>=-32768)this.writeU8(209),this.writeI16(t);else if(t>=-2147483648)this.writeU8(210),this.writeI32(t);else if(!this.useBigInt64)this.writeU8(211),this.writeI64(t);else this.encodeNumberAsFloat(t);else this.encodeNumberAsFloat(t)}encodeNumberAsFloat(t){if(this.forceFloat32)this.writeU8(202),this.writeF32(t);else this.writeU8(203),this.writeF64(t)}encodeBigInt64(t){if(t>=BigInt(0))this.writeU8(207),this.writeBigUint64(t);else this.writeU8(211),this.writeBigInt64(t)}writeStringHeader(t){if(t<32)this.writeU8(160+t);else if(t<256)this.writeU8(217),this.writeU8(t);else if(t<65536)this.writeU8(218),this.writeU16(t);else if(t<4294967296)this.writeU8(219),this.writeU32(t);else throw Error(`Too long string: ${t} bytes in UTF-8`)}encodeString(t){let n=hi(t);this.ensureBufferSizeToWrite(5+n),this.writeStringHeader(n),yi(t,this.bytes,this.pos),this.pos+=n}encodeObject(t,e){let n=this.extensionCodec.tryToEncode(t,this.context);if(n!=null)this.encodeExtension(n);else if(Array.isArray(t))this.encodeArray(t,e);else if(ArrayBuffer.isView(t))this.encodeBinary(t);else if(typeof t==="object")this.encodeMap(t,e);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply(t)}`)}encodeBinary(t){let e=t.byteLength;if(e<256)this.writeU8(196),this.writeU8(e);else if(e<65536)this.writeU8(197),this.writeU16(e);else if(e<4294967296)this.writeU8(198),this.writeU32(e);else throw Error(`Too large binary: ${e}`);let n=Se(t);this.writeU8a(n)}encodeArray(t,e){let n=t.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else if(n<4294967296)this.writeU8(221),this.writeU32(n);else throw Error(`Too large array: ${n}`);for(let s of t)this.doEncode(s,e+1)}countWithoutUndefined(t,e){let n=0;for(let s of e)if(t[s]!==void 0)n++;return n}encodeMap(t,e){let n=Object.keys(t);if(this.sortKeys)n.sort();let s=this.ignoreUndefined?this.countWithoutUndefined(t,n):n.length;if(s<16)this.writeU8(128+s);else if(s<65536)this.writeU8(222),this.writeU16(s);else if(s<4294967296)this.writeU8(223),this.writeU32(s);else throw Error(`Too large map object: ${s}`);for(let i of n){let o=t[i];if(!(this.ignoreUndefined&&o===void 0))this.encodeString(i),this.doEncode(o,e+1)}}encodeExtension(t){if(typeof t.data==="function"){let n=t.data(this.pos+6),s=n.length;if(s>=4294967296)throw Error(`Too large extension object: ${s}`);this.writeU8(201),this.writeU32(s),this.writeI8(t.type),this.writeU8a(n);return}let e=t.data.length;if(e===1)this.writeU8(212);else if(e===2)this.writeU8(213);else if(e===4)this.writeU8(214);else if(e===8)this.writeU8(215);else if(e===16)this.writeU8(216);else if(e<256)this.writeU8(199),this.writeU8(e);else if(e<65536)this.writeU8(200),this.writeU16(e);else if(e<4294967296)this.writeU8(201),this.writeU32(e);else throw Error(`Too large extension object: ${e}`);this.writeI8(t.type),this.writeU8a(t.data)}writeU8(t){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,t),this.pos++}writeU8a(t){let e=t.length;this.ensureBufferSizeToWrite(e),this.bytes.set(t,this.pos),this.pos+=e}writeI8(t){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,t),this.pos++}writeU16(t){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,t),this.pos+=2}writeI16(t){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,t),this.pos+=2}writeU32(t){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,t),this.pos+=4}writeI32(t){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,t),this.pos+=4}writeF32(t){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,t),this.pos+=4}writeF64(t){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,t),this.pos+=8}writeU64(t){this.ensureBufferSizeToWrite(8),Zi(this.view,this.pos,t),this.pos+=8}writeI64(t){this.ensureBufferSizeToWrite(8),Fe(this.view,this.pos,t),this.pos+=8}writeBigUint64(t){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,t),this.pos+=8}writeBigInt64(t){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,t),this.pos+=8}}function Ft(t,e){return new ve(e).encodeSharedRef(t)}function De(t){return`${t<0?"-":""}0x${Math.abs(t).toString(16).padStart(2,"0")}`}var Rr=16,Hr=16;class Qn{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(t=Rr,e=Hr){this.maxKeyLength=t,this.maxLengthPerKey=e,this.caches=[];for(let n=0;n<this.maxKeyLength;n++)this.caches.push([])}canBeCached(t){return t>0&&t<=this.maxKeyLength}find(t,e,n){let s=this.caches[n-1];t:for(let i of s){let o=i.bytes;for(let r=0;r<n;r++)if(o[r]!==t[e+r])continue t;return i.str}return null}store(t,e){let n=this.caches[t.length-1],s={bytes:t,str:e};if(n.length>=this.maxLengthPerKey)n[Math.random()*n.length|0]=s;else n.push(s)}decode(t,e,n){let s=this.find(t,e,n);if(s!=null)return this.hit++,s;this.miss++;let i=Fn(t,e,n),o=Uint8Array.prototype.slice.call(t,e,e+n);return this.store(o,i),i}}var vn="array",ge="map_key",Vi="map_value",Cr=(t)=>{if(typeof t==="string"||typeof t==="number")return t;throw new rt("The type of key must be string or number but "+typeof t)};class Ii{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(t){let e=this.getUninitializedStateFromPool();e.type=vn,e.position=0,e.size=t,e.array=Array(t)}pushMapState(t){let e=this.getUninitializedStateFromPool();e.type=ge,e.readCount=0,e.size=t,e.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let t={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(t)}return this.stack[this.stackHeadPosition]}release(t){if(this.stack[this.stackHeadPosition]!==t)throw Error("Invalid stack state. Released state is not on top of the stack.");if(t.type===vn){let n=t;n.size=0,n.array=void 0,n.position=0,n.type=void 0}if(t.type===ge||t.type===Vi){let n=t;n.size=0,n.map=void 0,n.readCount=0,n.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}}var We=-1,Dn=new DataView(new ArrayBuffer(0)),Tr=new Uint8Array(Dn.buffer);try{Dn.getInt8(0)}catch(t){if(!(t instanceof RangeError))throw Error("This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access")}var fi=RangeError("Insufficient data"),Yr=new Qn;class Oe{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=Dn;bytes=Tr;headByte=We;stack=new Ii;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??oe.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.rawStrings=t?.rawStrings??!1,this.maxStrLength=t?.maxStrLength??ie,this.maxBinLength=t?.maxBinLength??ie,this.maxArrayLength=t?.maxArrayLength??ie,this.maxMapLength=t?.maxMapLength??ie,this.maxExtLength=t?.maxExtLength??ie,this.keyDecoder=t?.keyDecoder!==void 0?t.keyDecoder:Yr,this.mapKeyConverter=t?.mapKeyConverter??Cr}clone(){return new Oe({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=We,this.stack.reset()}setBuffer(t){let e=Se(t);this.bytes=e,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.pos=0}appendBuffer(t){if(this.headByte===We&&!this.hasRemaining(1))this.setBuffer(t);else{let e=this.bytes.subarray(this.pos),n=Se(t),s=new Uint8Array(e.length+n.length);s.set(e),s.set(n,e.length),this.setBuffer(s)}}hasRemaining(t){return this.view.byteLength-this.pos>=t}createExtraByteError(t){let{view:e,pos:n}=this;return RangeError(`Extra ${e.byteLength-n} of ${e.byteLength} byte(s) found at buffer[${t}]`)}decode(t){if(this.entered)return this.clone().decode(t);try{this.entered=!0,this.reinitializeState(),this.setBuffer(t);let e=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return e}finally{this.entered=!1}}*decodeMulti(t){if(this.entered){yield*this.clone().decodeMulti(t);return}try{this.entered=!0,this.reinitializeState(),this.setBuffer(t);while(this.hasRemaining(1))yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(t){if(this.entered)return this.clone().decodeAsync(t);try{this.entered=!0;let e=!1,n;for await(let r of t){if(e)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(r);try{n=this.doDecodeSync(),e=!0}catch(l){if(!(l instanceof RangeError))throw l}this.totalPos+=this.pos}if(e){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:s,pos:i,totalPos:o}=this;throw RangeError(`Insufficient data in parsing ${De(s)} at ${o} (${i} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(t){return this.decodeMultiAsync(t,!0)}decodeStream(t){return this.decodeMultiAsync(t,!1)}async*decodeMultiAsync(t,e){if(this.entered){yield*this.clone().decodeMultiAsync(t,e);return}try{this.entered=!0;let n=e,s=-1;for await(let i of t){if(e&&s===0)throw this.createExtraByteError(this.totalPos);if(this.appendBuffer(i),n)s=this.readArraySize(),n=!1,this.complete();try{while(!0)if(yield this.doDecodeSync(),--s===0)break}catch(o){if(!(o instanceof RangeError))throw o}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){t:while(!0){let t=this.readHeadByte(),e;if(t>=224)e=t-256;else if(t<192)if(t<128)e=t;else if(t<144){let s=t-128;if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t<160){let s=t-144;if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else{let s=t-160;e=this.decodeString(s,0)}else if(t===192)e=null;else if(t===194)e=!1;else if(t===195)e=!0;else if(t===202)e=this.readF32();else if(t===203)e=this.readF64();else if(t===204)e=this.readU8();else if(t===205)e=this.readU16();else if(t===206)e=this.readU32();else if(t===207)if(this.useBigInt64)e=this.readU64AsBigInt();else e=this.readU64();else if(t===208)e=this.readI8();else if(t===209)e=this.readI16();else if(t===210)e=this.readI32();else if(t===211)if(this.useBigInt64)e=this.readI64AsBigInt();else e=this.readI64();else if(t===217){let s=this.lookU8();e=this.decodeString(s,1)}else if(t===218){let s=this.lookU16();e=this.decodeString(s,2)}else if(t===219){let s=this.lookU32();e=this.decodeString(s,4)}else if(t===220){let s=this.readU16();if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else if(t===221){let s=this.readU32();if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else if(t===222){let s=this.readU16();if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t===223){let s=this.readU32();if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t===196){let s=this.lookU8();e=this.decodeBinary(s,1)}else if(t===197){let s=this.lookU16();e=this.decodeBinary(s,2)}else if(t===198){let s=this.lookU32();e=this.decodeBinary(s,4)}else if(t===212)e=this.decodeExtension(1,0);else if(t===213)e=this.decodeExtension(2,0);else if(t===214)e=this.decodeExtension(4,0);else if(t===215)e=this.decodeExtension(8,0);else if(t===216)e=this.decodeExtension(16,0);else if(t===199){let s=this.lookU8();e=this.decodeExtension(s,1)}else if(t===200){let s=this.lookU16();e=this.decodeExtension(s,2)}else if(t===201){let s=this.lookU32();e=this.decodeExtension(s,4)}else throw new rt(`Unrecognized type byte: ${De(t)}`);this.complete();let n=this.stack;while(n.length>0){let s=n.top();if(s.type===vn)if(s.array[s.position]=e,s.position++,s.position===s.size)e=s.array,n.release(s);else continue t;else if(s.type===ge){if(e==="__proto__")throw new rt("The key __proto__ is not allowed");s.key=this.mapKeyConverter(e),s.type=Vi;continue t}else if(s.map[s.key]=e,s.readCount++,s.readCount===s.size)e=s.map,n.release(s);else{s.key=null,s.type=ge;continue t}}return e}}readHeadByte(){if(this.headByte===We)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=We}readArraySize(){let t=this.readHeadByte();switch(t){case 220:return this.readU16();case 221:return this.readU32();default:if(t<160)return t-144;else throw new rt(`Unrecognized array type byte: ${De(t)}`)}}pushMapState(t){if(t>this.maxMapLength)throw new rt(`Max length exceeded: map length (${t}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(t)}pushArrayState(t){if(t>this.maxArrayLength)throw new rt(`Max length exceeded: array length (${t}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(t)}decodeString(t,e){if(!this.rawStrings||this.stateIsMapKey())return this.decodeUtf8String(t,e);return this.decodeBinary(t,e)}decodeUtf8String(t,e){if(t>this.maxStrLength)throw new rt(`Max length exceeded: UTF-8 byte length (${t}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+e+t)throw fi;let n=this.pos+e,s;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(t))s=this.keyDecoder.decode(this.bytes,n,t);else s=bi(this.bytes,n,t);return this.pos+=e+t,s}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===ge;return!1}decodeBinary(t,e){if(t>this.maxBinLength)throw new rt(`Max length exceeded: bin length (${t}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(t+e))throw fi;let n=this.pos+e,s=this.bytes.subarray(n,n+t);return this.pos+=e+t,s}decodeExtension(t,e){if(t>this.maxExtLength)throw new rt(`Max length exceeded: ext length (${t}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+e),s=this.decodeBinary(t,e+1);return this.extensionCodec.decode(s,n,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let t=this.view.getUint8(this.pos);return this.pos++,t}readI8(){let t=this.view.getInt8(this.pos);return this.pos++,t}readU16(){let t=this.view.getUint16(this.pos);return this.pos+=2,t}readI16(){let t=this.view.getInt16(this.pos);return this.pos+=2,t}readU32(){let t=this.view.getUint32(this.pos);return this.pos+=4,t}readI32(){let t=this.view.getInt32(this.pos);return this.pos+=4,t}readU64(){let t=Xi(this.view,this.pos);return this.pos+=8,t}readI64(){let t=Qe(this.view,this.pos);return this.pos+=8,t}readU64AsBigInt(){let t=this.view.getBigUint64(this.pos);return this.pos+=8,t}readI64AsBigInt(){let t=this.view.getBigInt64(this.pos);return this.pos+=8,t}readF32(){let t=this.view.getFloat32(this.pos);return this.pos+=4,t}readF64(){let t=this.view.getFloat64(this.pos);return this.pos+=8,t}}function On(t,e){return new Oe(e).decode(t)}class Lt{listeners=new Map;addEventListener(t,e){let n=this.listeners.get(t);if(!n)n=new Set,this.listeners.set(t,n);return n.add(e),()=>{this.removeEventListener(t,e)}}removeEventListener(t,e){let n=this.listeners.get(t);if(n){if(n.delete(e),n.size===0)this.listeners.delete(t)}}emit(t,e){let n=this.listeners.get(t);if(n){let s=Array.from(n);for(let i of s)i(e)}}emitAll(t){let e=Array.from(this.listeners.keys());for(let n of e)this.emit(n,t)}}class ft{getter;static eventName="update";emitter;constructor(t){this.getter=t;this.emitter=new Lt}get=()=>this.getter();async emit(){let t=await this.getter();queueMicrotask(()=>this.emitter.emit(ft.eventName,t))}listen(t){return this.emitter.addEventListener(ft.eventName,t),()=>{this.emitter.removeEventListener(ft.eventName,t)}}}var Mt=64;var Si=32,wt=8;var je=32;var Wi=30000,gi=512,g;((V)=>{V[V.Success=0]="Success";V[V.InvalidSignature=3]="InvalidSignature";V[V.ClockOutOfSync=4]="ClockOutOfSync";V[V.UserNotRegistered=5]="UserNotRegistered";V[V.ServerMisconfigured=6]="ServerMisconfigured";V[V.MissingBody=7]="MissingBody";V[V.ExtraBodyContent=8]="ExtraBodyContent";V[V.MissingParam=9]="MissingParam";V[V.InvalidParam=10]="InvalidParam";V[V.InvalidRequest=11]="InvalidRequest";V[V.InternalError=12]="InternalError";V[V.NotFound=13]="NotFound";V[V.InvalidMessage=14]="InvalidMessage";V[V.NoChange=15]="NoChange";V[V.DatabaseClosed=16]="DatabaseClosed";V[V.StorageError=17]="StorageError";V[V.DatabaseError=18]="DatabaseError";V[V.HashMismatch=19]="HashMismatch";V[V.DecryptionError=20]="DecryptionError";V[V.NotImplemented=21]="NotImplemented";V[V.MissingSeed=22]="MissingSeed";V[V.OutOfBounds=23]="OutOfBounds";V[V.HostError=24]="HostError";V[V.CommunicationError=25]="CommunicationError";V[V.VarLimitExceeded=26]="VarLimitExceeded";V[V.InvalidResponse=27]="InvalidResponse";V[V.ConnectionClosed=28]="ConnectionClosed";V[V.CryptoError=29]="CryptoError";V[V.WebAuthnError=30]="WebAuthnError"})(g||={});function m(t){return[t,0]}function a(t){return[void 0,t]}function kr(t){if(t<0)console.info("N",t),console.trace();if(typeof t!=="bigint")t=BigInt(t);if(t<0n)return a(10);let e=[];while(t>0n){let n=Number(t&0x7fn);if(t>>=7n,t>0n)e.push(n|128);else e.push(n)}if(e.length===0)return m(new Uint8Array([0]));if(e.length>8)return a(26);return m(new Uint8Array(e))}function Lr(t,e=0){let n=0n,s=0,i=e;while(!0){if(i>=t.length)return a(14);let o=t[i++];if(o===void 0)return a(14);if(n|=BigInt(o&127)<<BigInt(s),(o&128)===0){if(i-e>8)return a(26);return m({value:n>0x1fffffffffffffn?n:Number(n),bytesRead:i-e})}if(s+=7,s>=56)return a(26)}}class U{data;pos=0;constructor(t){this.data=t}static async fromResponse(t){let e=await t.arrayBuffer(),n=new Uint8Array(e);return new U(n)}readBigInt(){if(this.pos+8>this.data.length)return a(7);let t=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,m(t)}readDate(){let[t,e]=this.readVarInt();if(e!==0)return a(e);return m(new Date(t))}readVarInt(){let[t,e]=Lr(this.data,this.pos);if(e!==0)return a(e);this.pos+=t.bytesRead;let n=t.value;return m(typeof n==="bigint"?Number(n):n)}readVarString(){let[t,e]=this.readVarInt();if(e!==0)return a(e);let[n,s]=this.readBytes(t);if(s!==0)return a(s);let i=new TextDecoder().decode(n);return m(i)}readBytes(t){if(t<0)return a(10);if(this.pos+t>this.data.length)return a(23);let e=this.data.slice(this.pos,this.pos+t);return this.pos+=t,m(e)}readVarBytes(){let[t,e]=this.readVarInt();if(e!==0)return a(e);return this.readBytes(t)}readStruct(t){return t.decode(this)}readStructs(t){let e=[];while(!this.done()){let[n,s]=this.readStruct(t);if(s!==0)return a(s);e.push(n)}return m(e)}readBytesSeq(t){let e=[];while(!this.done()){let[n,s]=this.readBytes(t);if(s!==0)return a(s);e.push(n)}return m(e)}done(){return this.pos>=this.data.length}consumed(){return this.pos}}class N{parts=[];writeBigInt(t){let e=new Uint8Array(8);new DataView(e.buffer).setBigUint64(0,t,!1),this.parts.push(e)}writeDate(t){let e=t.getTime();return this.writeVarInt(e)}writeVarInt(t){let[e,n]=kr(t);if(n!==0)return n;return this.parts.push(e),0}writeVarString(t){let e=new TextEncoder().encode(t),n=this.writeVarInt(e.length);if(n!==0)return n;return this.writeBytes(e),0}prependBytes(t){this.parts.unshift(t.slice())}writeBytes(t){this.parts.push(t.slice())}writeVarBytes(t){let e=this.writeVarInt(t.length);if(e!==0)return e;return this.writeBytes(t),0}writeStruct(t,e){return t.encode(this,e)}writeStructs(t,e){for(let n of e){let s=this.writeStruct(t,n);if(s!==0)return s}return 0}writeBytesSeq(t){for(let e of t)this.writeBytes(e)}result(){let t=this.parts.reduce((s,i)=>s+i.length,0),e=new Uint8Array(t),n=0;for(let s of this.parts)e.set(s,n),n+=s.length;return e}wipe(){for(let t of this.parts)t.fill(0);this.parts.length=0}*scan(){for(let t of this.parts)yield t}}async function jn(t,e){let n=new N,s=n.writeDate(e);if(s!==0)return a(s);let i=n.result(),o=await t.sign(i);return m({pubKey:t.publicKey,sig:o,timestamp:e})}async function Pt(t,e,n){let s=n.now().getTime(),i=t.timestamp.getTime();if(Math.abs(s-i)>Wi)return 4;let r=new N;r.writeDate(t.timestamp);let l=r.result();if(!await e.checkSigEd25519(t.sig,l,t.pubKey))return 3;return 0}var nt={encode(t,e){let n=t.writeVarBytes(e.id);if(n!==0)return n;let s=t.writeDate(e.ts);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return a(n);let[s,i]=t.readDate();if(i!==0)return a(i);return m({id:e,ts:s})}};function re(t){let e=new N,n=e.writeStruct(nt,t);if(n!==0)return a(n);let s=e.result();return m(s)}async function Mr(t){return re({id:t,ts:new Date(0)})}var yt={encode(t,e){let n=t.writeVarString(e.typ??"");if(n!==0)return n;let s=t.writeVarBytes(e.eid);if(s!==0)return s;let i=t.writeVarInt(e.off);if(i!==0)return i;let o=t.writeVarInt(e.ctr);if(o!==0)return o;let r=t.writeVarInt(e.len);if(r!==0)return r;if(e.hsh)t.writeBytes(e.hsh);return 0},decode(t){let[e,n]=t.readVarString();if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let o=new U(s),[,r]=nt.decode(o);if(r!==0)return a(r);let[l,c]=t.readVarInt();if(c!==0)return a(c);let[d,u]=t.readVarInt();if(u!==0)return a(u);let[p,h]=t.readVarInt();if(h!==0)return a(h);let y;if(p>0){let[b,Z]=t.readBytes(je);if(Z!==0)return a(Z);y=b}return m({typ:e,eid:s,off:l,ctr:d,len:p,hsh:y})}};function pt(t){return Array.from(t).map((n)=>n.toString(16).padStart(2,"0")).join("")}function Ke(t){if(t.length%2!==0)throw Error("Invalid hex string");let e=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2)e[n/2]=Number.parseInt(t.substr(n,2),16);return e}function F(t,e){if(t===e)return!0;if(t.byteLength!==e.byteLength)return!1;return t.every((n,s)=>n===e[s])}var T;if(typeof Uint8Array.prototype.toBase64==="function")T=(t)=>t.toBase64();else T=(t)=>btoa(String.fromCharCode(...t));var ot;if(typeof Uint8Array.fromBase64==="function")ot=(t)=>Uint8Array.fromBase64(t);else ot=(t)=>Uint8Array.from(atob(t),(e)=>e.charCodeAt(0));function wr(t){return T(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function An(t){let e=t.length%4===0?"":"=".repeat(4-t.length%4),n=t.replace(/-/g,"+").replace(/_/g,"/")+e;return ot(n)}function Vt(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}function Ki(t,e,n){return n.checkSigEd25519(t.sig,t.headCph,e)}async function xi(t,e,n,s){let i;if(t.bod&&t.len>0)i=await n.blake3(t.bod);let o=new N,r=yt.encode(o,{...t,hsh:i});if(r!==0)return a(r);let l=o.result(),c=await e.kdmFor(l),d=s.deriveCipher(c,"encrypt"),u=await d.encrypt(l),p=t.bod?await d.encrypt(t.bod):new Uint8Array(0),h=await e.sign(u);return m({sig:h,kdm:c,headCph:u,bodyCph:p})}async function qn(t,e,n,s,i){let o=new U(t),[r,l]=yt.decode(o);if(l!==0)return a(14);let c;try{c=e&&e.length>0?await n.decrypt(e):void 0}catch{return a(20)}let d=r.hsh&&c===void 0,u=r.hsh===void 0&&c!==void 0;if(d||u)return a(19);if(r.hsh&&c){let h=await s.blake3(c);if(!F(h,r.hsh))return a(19)}let p=i??await s.blake3(t);return m({msgHead:r,bod:c,headHash:p})}class Ut{now(){return new Date}}function Ri(t,e,n,s){let i=e.getTime()-t.getTime(),o=n.getTime()-s.getTime();return(i+o)/2}var xe={encode(t,e){if(t.writeVarInt(e.quota),e.quota>0){if(e.usage===void 0)return 9;t.writeVarInt(e.usage)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let s;if(e>0){let[i,o]=t.readVarInt();if(o!==0)return a(o);s=i}return m({quota:e,usage:s})}};var _n={encode(t,e){t.writeBytes(new Uint8Array([e.status]));let n=t.writeDate(e.timeRcvd);if(n!==0)return n;let s=t.writeDate(e.timeSent);if(s!==0)return s;let i=t.writeVarInt(e.subscription.term);if(i!==0)return i;let o=t.writeVarInt(e.subscription.elapsed);if(o!==0)return o;let r=t.writeStruct(xe,e.subscription.stat);if(r!==0)return r;let l=t.writeStruct(xe,e.subscription.dyn);if(l!==0)return l;return 0},decode(t){let[e,n]=t.readBytes(1);if(n!==0)return a(n);let s=e[0],[i,o]=t.readDate();if(o!==0)return a(o);let[r,l]=t.readDate();if(l!==0)return a(l);let[c,d]=t.readVarInt();if(d!==0)return a(d);let[u,p]=t.readVarInt();if(p!==0)return a(p);let[h,y]=t.readStruct(xe);if(y!==0)return a(y);let[b,Z]=t.readStruct(xe);if(Z!==0)return a(Z);return m({status:s,timeRcvd:i,timeSent:r,subscription:{term:c,elapsed:u,stat:h,dyn:b}})}};var $n={encode(t,e){let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.seq);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return a(n);let[s,i]=t.readVarInt();if(i!==0)return a(i);return m({headCph:e,seq:s})}};var mt={encode(t,e){t.writeBytes(e.pubKey),t.writeBytes(e.sig);let n=t.writeDate(e.timestamp);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Si);if(n!==0)return a(n);let[s,i]=t.readBytes(Mt);if(i!==0)return a(i);let[o,r]=t.readDate();if(r!==0)return a(r);return m({pubKey:e,sig:s,timestamp:o})}};var Hi={async encodeReq(t,e,n,s,i){let o=i.writeStruct(mt,n);if(o!==0)return o;for(let r of s)i.writeVarInt(r);return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(mt);if(l!==0)return l;let c=await Pt(r,i,s);if(c!==0)return c;let{pubKey:d}=r,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let[h,y]=e.readVarInt();if(y!==0)return y;if(!e.done())return 8;let[b,Z]=await o.listHeads(d,h);if(Z!==0)return Z;return n.writeStructs($n,b)},decodeResp(t){return t.readStructs($n)}};var ts={encode(t,e){t.writeVarInt(e.seq);let n=t.writeVarBytes(e.bodyCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);return m({seq:e,bodyCph:s})}};var Ci={async encodeReq(t,e,n,s,i){let o=i.writeStruct(mt,n);if(o!==0)return o;for(let r of s){let l=i.writeVarInt(r);if(l!==0)return l}return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(mt);if(l!==0)return l;let c=await Pt(r,i,s);if(c!==0)return c;let{pubKey:d}=r,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let h=[];while(!e.done()){let[Z,X]=e.readVarInt();if(X!==0)return X;h.push(Z)}console.info(`PULL: ${h.length} bags`);let[y,b]=await o.getBodies(d,h);if(b!==0)return b;if(!y)return 17;for(let{seq:Z,bodyCph:X}of y){let I={seq:Z,bodyCph:X},f=n.writeStruct(ts,I);if(f!==0)return f}return 0},decodeResp(t){return t.readStructs(ts)}};var es={encode(t,e){t.writeBytes(e.sig),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarBytes(e.bodyCph);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readBytes(Mt);if(n!==0)return a(n);let[s,i]=t.readBytes(wt);if(i!==0)return a(i);let[o,r]=t.readVarBytes();if(r!==0)return a(r);let[l,c]=t.readVarBytes();if(c!==0)return a(c);return m({sig:e,kdm:s,headCph:o,bodyCph:l})}};var Ae={encode(t,e){let n=t.writeVarInt(e.seq);if(n!==0)return n;let s=t.writeVarBytes(e.headCph);if(s!==0)return s;let i=e.bodyCph?e.bodyCph.length:0,o=t.writeVarInt(i);if(o!==0)return o;if(i>0){if(!e.bodyCph)return 10;t.writeBytes(e.bodyCph)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let[o,r]=t.readVarInt();if(r!==0)return a(r);let l;if(o>0){let[c,d]=t.readBytes(o);if(d!==0)return a(d);l=c}return m({seq:e,headCph:s,bodyCph:l})}};var qe={encode(t,e){t.writeBytes(e.sig),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Mt);if(n!==0)return a(n);let[s,i]=t.readBytes(wt);if(i!==0)return a(i);let[o,r]=t.readVarBytes();if(r!==0)return a(r);return m({sig:e,kdm:s,headCph:o})}};var _e={encode(t,e){if(t.writeVarInt(e.idx),t.writeBytes(new Uint8Array([e.status])),e.status===0)t.writeVarInt(e.seq);return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);let[s,i]=t.readBytes(1);if(i!==0)return a(i);let o=s[0];if(o!==0)return m({idx:e,status:o});let[r,l]=t.readVarInt();if(l!==0)return a(l);return m({idx:e,status:o,seq:r})}};var Ti={async encodeReq(t,e,n,s,i){let o=i.writeStruct(mt,n);if(o!==0)return o;let r=i.writeStructs(es,s);if(r!==0)return r;return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o,notifier:r}=t,[l,c]=e.readStruct(mt);if(c!==0)return c;let d=await Pt(l,i,s);if(d!==0)return d;let{pubKey:u}=l,[p,h]=await o.hasUser(u);if(h!==0)return h;if(!p)return 5;let[y,b]=e.readStructs(es);if(b!==0)return b;console.info(`PUSH: ${y.length} bags`);let Z=[],X=[];for(let G=0;G<y.length;G++){let W=y[G];if(!await Ki(W,u,i)){let k={idx:G,status:3},L=n.writeStruct(_e,k);if(L!==0)return L;continue}Z.push(G),X.push(W)}let[I,f]=await o.setBags(u,X);if(f!==0)return f;if(!I||I.length!==X.length)return 17;let S=[];for(let G=0;G<X.length;G++){let W=X[G],C=Z[G],k=I[G],L=new N,x=L.writeStruct(qe,W);if(x!==0)return x;let B=L.result(),J={seq:k,headCph:B};if(y.length===1&&W.bodyCph.length<=gi)J.bodyCph=W.bodyCph;S.push(J);let E={idx:C,status:0,seq:k},V=n.writeStruct(_e,E);if(V!==0)return V}if(S.length>0){let G=new N,W=G.writeStructs(Ae,S);if(W!==0)return W;let C=G.result();await Promise.resolve(r.push(u,C))}return 0},decodeResp(t){return t.readStructs(_e)}};var Yi={async encodeReq(t,e,n,s,i){return i.writeStruct(mt,n)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(mt);if(l!==0)return l;let c=await Pt(r,i,s);if(c!==0)return c;let{pubKey:d}=r;if(!e.done())return 8;let[u,p]=await o.addUser(d);if(p!==0)return p;return 0},decodeResp(t){return m(void 0)}};class ns{url;websocket;constructor(t){this.url=t}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect(t,e,n=()=>{},s=()=>{}){let{url:i}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let o=new N;o.writeStruct(mt,t);let r=o.result(),l=pt(r);return i.searchParams.set("t",l),this.websocket=new WebSocket(i),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),s()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,n()},this.websocket.onmessage=(c)=>{let d=new Uint8Array(c.data);e(d)},this.websocket.onerror=(c)=>{console.log(`ERROR: ${JSON.stringify(c)}`),this.websocket=void 0,n()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}var st={user:{path:"/user",endpoint:Yi,name:0},push:{path:"/push",endpoint:Ti,name:2},peek:{path:"/peek",endpoint:Hi,name:1},pull:{path:"/pull",endpoint:Ci,name:3}},Pr={0:st.user,2:st.push,1:st.peek,3:st.pull},Fu={[st.user.path]:st.user,[st.push.path]:st.push,[st.peek.path]:st.peek,[st.pull.path]:st.pull};class ss{url;listener;constructor(t){this.url=t;this.listener=new ns(t)}async call(t,e){let{path:n}=Pr[t],s=new URL(n,this.url);try{return await Ur(s,e)}catch{return a(25)}}}var is=(t)=>new ss(t.handle);async function Ur(t,e){let n=await fetch(t,{method:"POST",body:e.result().slice()});if(!n.ok)return a(24);let s=await U.fromResponse(n);return m(s)}class $e{enclave;crypto;host;clock;transport;updateHostMeta;constructor(t,e,n,s,i,o){this.enclave=t;this.crypto=e;this.host=n;this.clock=s;this.transport=i;this.updateHostMeta=o}async call(t,e){let{clock:n,transport:s}=this,{endpoint:i,name:o}=t,r=await this.identity(),l=n.now(),[c,d]=await jn(r,l);if(d!==0)return a(d);let u=new N,p=await i.encodeReq(this,r,c,e,u);if(p!==0)return a(p);let h=n.now(),[y,b]=await s.call(o,u),Z=n.now();if(b!==0)return a(b);let[X,I]=y.readStruct(_n);if(I!==0)return a(I);if(X.status!==0)return a(X.status);let S={clockOffset:Ri(h,X.timeRcvd,X.timeSent,Z),subscription:X.subscription},G=await this.updateHostMeta(S);if(G!==0)return a(G);return i.decodeResp(y)}identity=()=>{let{host:t,enclave:e}=this;return e.deriveIdentity(t.label,t.idx??0)};seal=async(t)=>{let{crypto:e,enclave:n}=this,s=await this.identity();return xi(t,s,e,n)};register=()=>this.call(st.user,[]);peek=(t)=>this.call(st.peek,[t]);push=(t)=>this.call(st.push,t);pull=(t)=>this.call(st.pull,t);listen=async(t,e,n)=>{let{clock:s,transport:i}=this,{listener:o}=i,r=await this.identity(),l=s.now(),[c,d]=await jn(r,l);if(d!==0)return d;return await o.connect(c,t,e,n)};isConnected(){let t=this.transport?.listener;if(t&&typeof t.connected==="function")return t.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}var os={encode(t,e){let n=t.writeVarString(e.lbl);if(n!==0)return n;let s=t.writeVarInt(e.idx);if(s!==0)return s;let i=t.writeVarInt(e.num);if(i!==0)return i;return t.writeBytes(e.hsh),t.writeBytes(e.sig),0},decode(t){let[e,n]=t.readVarString();if(n!==0)return a(n);let[s,i]=t.readVarInt();if(i!==0)return a(i);let[o,r]=t.readVarInt();if(r!==0)return a(r);let[l,c]=t.readBytes(je);if(c!==0)return a(c);let[d,u]=t.readBytes(Mt);if(u!==0)return a(u);return m({lbl:e,idx:s,num:o,hsh:l,sig:d})}};var tn={encode(t,e){let n=t.writeStruct(os,e.head);if(n!==0)return n;let s=t.writeVarBytes(e.indexEnc);if(s!==0)return s;let i=t.writeVarBytes(e.bodyEnc);if(i!==0)return i;return 0},decode(t){let[e,n]=t.readStruct(os);if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let[o,r]=t.readVarBytes();if(r!==0)return a(r);return m({head:e,indexEnc:s,bodyEnc:o})}};var rs={encode(t,e){t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.lenBody);if(s!==0)return s;if(e.lenBody>0&&e.offBody!==void 0){let i=t.writeVarInt(e.offBody);if(i!==0)return i}return 0},decode(t){let[e,n]=t.readBytes(wt);if(n!==0)return a(n);let[s,i]=t.readVarBytes();if(i!==0)return a(i);let[o,r]=t.readVarInt();if(r!==0)return a(r);let l;if(o>0){let[c,d]=t.readVarInt();if(d!==0)return a(d);l=c}return m({kdm:e,headCph:s,lenBody:o,offBody:l})}};var en;((ki)=>{ki.defaultFileExtension="dpl";async function e(i,o,r,l,c){let d=await c.deriveIdentity(i,o),u=new N,p=new N,h=0,y=0;for(let W of r){let C=new N,k=C.writeStruct(yt,W.head);if(k!==0)return a(k);let L=C.result(),x=await d.kdmFor(L),B=c.deriveCipher(x,"encrypt"),J=await B.encrypt(L),E=W.body?await B.encrypt(W.body):new Uint8Array(0),V=W.head.len>0&&W.head.hsh!==void 0?E.length:0,H={kdm:x,headCph:J,lenBody:V,offBody:V>0?y:void 0},Y=u.writeStruct(rs,H);if(Y!==0)return a(Y);if(W.body)p.writeBytes(E),y+=E.length;h++}let b=p.result(),Z=u.result(),X=await l.blake3(Z),I=await d.sign(X),f={lbl:i,idx:o,num:h,hsh:X,sig:I},S=new N;S.writeStruct(tn,{head:f,indexEnc:Z,bodyEnc:b});let G=S.result();return m(G)}ki.encodeFile=e;async function n(i,o,r){let[l,c]=tn.decode(new U(i));if(c!==0)return a(c);let{head:d,indexEnc:u,bodyEnc:p}=l,h=await r.deriveIdentity(d.lbl,d.idx);if(!await o.checkSigEd25519(d.sig,d.hsh,h.publicKey))return a(3);let b=await o.blake3(u);if(!F(b,d.hsh))return a(19);let Z=new U(u),X=[];for(let f=0;f<d.num;f++){let[S,G]=Z.readStruct(rs);if(G!==0)return a(G);X.push(S)}if(X.length!==d.num)return a(14);let I=[];for(let f of X){let S=r.deriveCipher(f.kdm,"decrypt"),G;try{G=await S.decrypt(f.headCph)}catch{return a(20)}let[W,C]=yt.decode(new U(G));if(C!==0)return a(C);let k;if(f.lenBody>0&&f.offBody!==void 0){if(W.hsh===void 0)return a(14);let L=p.slice(f.offBody,f.offBody+f.lenBody);try{k=await S.decrypt(L)}catch{return a(20)}let x=await o.blake3(k);if(!F(x,W.hsh))return a(19)}I.push({head:W,body:k})}return m(I)}ki.decodeFile=n;async function s(i,o,r,l,c){let[d,u]=await n(i,o,r);if(u!==0)return a(u);let[p,h]=tn.decode(new U(i));if(h!==0)return a(h);let y=await c(d);return e(p.head.lbl,p.head.idx,y,o,l)}ki.migrateFile=s})(en||={});async function Li({now:t,bod:e,crypto:n,typ:s=""}){let i=await n.genRandomBytes(8),o=new N,r=o.writeStruct(nt,{id:i,ts:t});if(r!==0)return a(r);let l=o.result();return nn({now:t,eid:l,ctr:0,typ:s,bod:e,crypto:n})}async function nn({now:t,eid:e,ctr:n,typ:s="",bod:i,crypto:o}){let r=new U(e),[l,c]=nt.decode(r);if(c!==0)return a(c);let d=t.getTime()-l.ts.getTime(),u,p=i?.length??0;if(i&&p>0)u=await o.blake3(i);return m({eid:e,off:d,ctr:n,typ:s,len:p,hsh:u})}function Mi(t,e){let n=t.length<e.length?t.length:e.length;for(let s=0;s<n;s++)if(t[s]!==e[s])return t[s]-e[s];return t.length-e.length}async function le(t,e){let n=Array.from(t);n.sort(Mi);let s=0;for(let r of n)s+=r.length;let i=new Uint8Array(s),o=0;for(let r of n)i.set(r,o),o+=r.length;return e.blake3(i)}function wi(t){let e=new N,n=e.writeVarBytes(t.eid);if(n!==0)return a(n);let s=e.writeDate(t.updatedAt);if(s!==0)return a(s);let i=e.writeVarInt(t.ctr);if(i!==0)return a(i);return m(e.result())}async function Re(t,e){let n=[];for(let s of t){let[i,o]=wi(s);if(o!==0||!i)return a(o);n.push(i)}return m(await le(n,e))}var Pp=Symbol("MasterSeed"),Up=Symbol("SealedMasterKey"),Gt=32,ls=24+Gt+16;function Bt(t){if(t.byteLength!==ls)return a(10);return m(t)}var Jp=Symbol("EntityID");function Pi(t){return"type"in t}var zp=Symbol("DerivationSeed"),Np=Symbol("PublicKey"),Ep=Symbol("PrivateKey"),Fp=Symbol("HostSpecificKeyPair"),Qp=Symbol("Hash");function Br(t){if(!t)return!1;if(typeof t!=="object")return!1;if("body"in t===!1)return!1;return!0}function Jr(t){if(t===null||typeof t!=="object")return;if(!("type"in t))return;let e=t.type;if(typeof e!=="string")return;return e}function zr(t){if(!t.bod||t.bod.length===0){let o={off:t.off,ctr:t.ctr,eid:t.eid};return m(o)}let e=On(t.bod);if(Br(e)===!1)return console.warn("msg body invalid",e),a(14);let n=t.typ??"",s=n.length>0?n:Jr(e)??"",i={off:t.off,ctr:t.ctr,eid:t.eid,pid:e.pid,tags:e.tags,type:s,body:e.body};return m(i)}class He{applier;emitter=new Lt;clearer;onDirtyEids;cacheDriven;peerIngest;constructor(t,e,n,s){this.applier=t;this.clearer=e,this.onDirtyEids=n,this.cacheDriven=s?.cacheDriven??!1,this.peerIngest=s?.peerIngest}apply=async(t)=>{let e=[],n=[];for(let l of t){let[c,d]=zr(l);if(n.push(d),d!==0)continue;e.push(c)}let{stats:s,types:i,eids:o}=await this.applier(e),r=[];for(let l=0;l<t.length;l++){let c=n[l],d=s[l];if(c!==0){r.push(c);continue}if(d!==0){r.push(d);continue}r.push(0)}if(!this.cacheDriven)for(let l of i)this.emitter.emit(l,null);if(o.length>0)this.onDirtyEids?.(o);return r};clear=async()=>{let t=await this.clearer();if(t!==0)return t;return this.emitter.emitAll(null),t};notify=(t)=>{for(let e of t)this.emitter.emit(e,null)};refresh=async(t)=>{if(this.peerIngest){await this.peerIngest(t);return}};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}var cs={apply:async function(t){return t.map(()=>0)},clear:async function(){return 0},notify:function(t){},refresh:async function(t){},on:function(t,e){},off:function(t,e){}};function Nr(t){return"subscribe"in t}function sn(t){if(Nr(t)){let e=new He((n)=>t.apply(n),()=>t.clear(),void 0,{cacheDriven:!0,peerIngest:async(n)=>{await t.ingestFromDurable(n)}});return t.subscribe((n)=>e.notify(n)),e}return new He((e)=>t.apply(e),()=>t.clear())}function O(t){return"type"in t}function Er(t){return!O(t)}function Fr(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function Ce(t){if(t instanceof Date)return m(!0);if(t.range.start>t.range.end)return a(10);return m(!0)}function as(t,e){if(e instanceof Date)return t.getTime()===e.getTime();return Fr(t,e.range)}function Qr(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function Te(t){if(typeof t==="string")return m(t.length>0);if("range"in t){if(t.range.start>t.range.end)return a(10);return m(!0)}return m(t.prefix.length>0)}function ds(t,e){if(typeof e==="string")return t===e;if("range"in e)return Qr(t,e.range);if(e.prefix.length===0)return!1;return t.startsWith(e.prefix)}function Ui(t){if(!Array.isArray(t)||t.length===0)return;let e=new Set,n=[];for(let s of t){if(typeof s!=="string"||s.length===0)continue;if(e.has(s))continue;e.add(s),n.push(s)}return n.length>0?n:void 0}function Ye(t){return{eid:t.eid,ctr:t.ctr,updatedAt:t.updatedAt}}function us(t){let e=new U(t.eid),[n,s]=e.readStruct(nt);if(s!==0)return a(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function ce(t,e){let n=new U(e.eid),[s,i]=n.readStruct(nt);if(i!==0)return a(i);let o=new Date(s.ts.getTime()+e.off);if(t!==void 0&&o<=t.updatedAt)return a(15);if(Pi(e)){let r=Ui(e.tags);return m({eid:e.eid,pid:e.pid,...r!==void 0?{tags:r}:{},type:e.type,createdAt:s.ts,updatedAt:o,ctr:e.ctr,body:e.body})}return m({eid:e.eid,updatedAt:o,ctr:e.ctr})}function ae(t,e){let n=new Set;if(t!==void 0&&O(t))n.add(t.type);if(O(e))n.add(e.type);return[...n]}var vr={getEnt:async()=>a(21),getRow:async()=>a(21),getEntities:async(t)=>a(21),countEntities:async()=>a(21),checksum:async()=>a(21),apply:async(t)=>({stats:t.map(()=>21),types:new Set,eids:[]}),clear:async()=>21};class on{inflight=null;again=!1;run(t){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain(t),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain(t){try{this.again=!1;let e=await t();while(this.again)this.again=!1,e=await t();return e}finally{this.inflight=null}}}var rn=100;class ke{timer=null;delayMs;work;tail=new on;constructor(t,e){this.delayMs=t<0?0:t,this.work=e}schedule(){if(this.delayMs<=0){this.fire();return}if(this.timer!==null)clearTimeout(this.timer);this.timer=setTimeout(()=>{this.timer=null,this.fire()},this.delayMs)}async flush(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null,this.fire();await this.tail.flush()}cancel(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null}fire(){return this.tail.run(this.work)}}var Bi=!1;function ln(t){Bi=t===!0}function P(t,e){if(!Bi)return;let n=Math.round(performance.now());if(e!==void 0)console.warn(`[dip ${n}ms] ${t}`,e);else console.warn(`[dip ${n}ms] ${t}`)}function Ji(t){let e=new U(t.eid),[n,s]=nt.decode(e);if(s!==0)return;return n.ts.getTime()+t.off}function Dr(t,e){let n=Ji(t),s=Ji(e);if(n===void 0&&s===void 0)return 0;if(n===void 0)return 1;if(s===void 0)return-1;if(s!==n)return s-n;return e.ctr-t.ctr}function de(t,e){return t.slice().sort((n,s)=>Dr(e(n),e(s)))}var Qt={phase:"idle"},ue=50;function cn(t,e,n){if(t<=0||e<=0)return!1;if(t===1||t===e)return!0;return t%n===0}function an(t,e){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob(t,e);return}let n=URL.createObjectURL(t),s=document.createElement("a");s.href=n,s.download=e,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(n)}function zi(t,e,n){let s=[],i=[],o=0;for(let r of t){let l=e(r);if(i.length>0&&o+l>n)s.push(i),i=[],o=0;if(i.push(r),o+=l,o>=n)s.push(i),i=[],o=0}if(i.length>0)s.push(i);return s}async function ps(t,e,n){let s=t.length;if(s<1)return[];let i=Array(s),o=0,r=Math.min(Math.max(1,e),s),l=async()=>{while(!0){let d=o;if(o+=1,d>=s)return;i[d]=await n(t[d],d)}},c=[];for(let d=0;d<r;d++)c.push(l());return await Promise.all(c),i}async function dn(t,e,n,s){let i=new U(t.headCph),[o,r]=i.readStruct(qe);if(r!==0)return a(r);let{sig:l,kdm:c,headCph:d}=o;if(!await s.checkSigEd25519(l,d,e))return a(3);let p=n.deriveCipher(c,"decrypt"),h;try{h=await p.decrypt(d)}catch{return a(20)}return m({kdm:c,headEnc:h})}var Kt="f",Jt="t",It="e";function Or(t){return t===Kt||t===Jt||t===It}function pe(t){if(t===!0||t===Jt)return Jt;if(t===It)return It;return Kt}function jr(t){return pe(t.apld)===Kt}function ms(t){return t!==0&&t!==15&&t!==18&&t!==17}function vt(t,e,n){if(t.apld=e,e===It&&n!==void 0)t.err=n;else delete t.err}async function zt(t,e,n,s){let i=s?.body!==!1,o=pe(e.apld),r=e.body,l=r?.length??0,c;if(i&&r&&l>0)c=await n.blake3(r);let d={eid:e.eid,off:e.off??0,ctr:e.ctr??0,typ:e.typ??"",len:l,hsh:c},u={hash:t,head:d,apld:o};if(i&&r!==void 0)u.body=r;if(o===It&&e.err!==void 0)u.err=e.err;return u}var hs=1048576,ys=1048576,Ei=64;function Ar(t){return t.sig.length+t.kdm.length+t.headCph.length+t.bodyCph.length}async function qr(t,e,n,s,i){if(s.length<1)return 0;let[o,r]=await t.push(s);if(r!==0)return r;if(!o)return 27;for(let c of o){if(c.status!==0){console.error("push err",c);continue}let d=i[c.idx];if(!d){console.error("no hash",c);continue}await e.uploads.deq(n,[d])}let l=await e.hosts.get(n);if(l){let c=l.lastSeq,d=c,u=[];for(let p of o)if(p.status===0)u.push(p.seq);u.sort((p,h)=>p-h);for(let p of u)if(p===c+1)c=p;if(c>d)await e.hosts.touch(n,c)}return 0}async function Ni(t,e){if(e.length<1)return m([]);let n=new Map,s=[];for(let l of e)n.set(l.seq,l),s.push(l.seq);let[i,o]=await t.pull(s);if(o!==0)return a(o);if(!i)return a(27);let r=[];for(let{seq:l,bodyCph:c}of i){let d=n.get(l);if(!d)continue;r.push({dl:d,bodyCph:c})}return m(r)}async function _r(t,e,n,s){if(s.length<1)return m({parts:[],hashes:[]});let i=[],o=[],r=[],l=new Map;for(let{dl:d,bodyCph:u}of s){let{head:p,kdm:h,seq:y,host:b}=d,[Z,X]=await Fi(d,n);if(X!==0||!Z){let x=l.get(b)??[];x.push(y),l.set(b,x);continue}let{headEnc:I,headEncHash:f}=Z,S=e.deriveCipher(h,"decrypt"),[G,W]=await qn(I,u,S,n,f);if(W!==0||!G){let x=l.get(b)??[];x.push(y),l.set(b,x);continue}let C={head:p,body:G.bod},k=G.headHash;r.push({key:k,data:Di(C)}),i.push(C),o.push(k);let L=l.get(b)??[];L.push(y),l.set(b,L)}let c=await t.messages.add(r);for(let[d,u]of l)await t.downloads.deq(d,u);for(let d=0;d<c.length;d++){let u=c[d];if(u!==0&&u!==15)console.error("ERR storing",g[u],"for message",d)}return m({parts:i,hashes:o})}async function Fi(t,e){let n=t.headEnc;if(!n){let i=new N,o=i.writeStruct(yt,t.head);if(o!==0)return a(o);n=i.result()}if(t.headEncHash)return m({headEnc:n,headEncHash:t.headEncHash});let s=await e.blake3(n);return m({headEnc:n,headEncHash:s})}async function Qi(t,e,n){let s=new Set;for(let r of e)s.add(T(r));if(s.size<1)return;let i=Array.from(await t.downloads.list());if(i.length<1)return;let o=new Map;for(let r of i){let l;if(r.headEncHash)l=T(r.headEncHash);else{let[d,u]=await Fi(r,n);if(u!==0||!d)continue;l=T(d.headEncHash)}if(!s.has(l))continue;let c=o.get(r.host)??[];c.push(r.seq),o.set(r.host,c)}for(let[r,l]of o)await t.downloads.deq(r,l)}async function bs({conn:t,store:e,enclave:n,host:s,crypto:i,onProgress:o,peekProgressEvery:r,peekConcurrency:l}){let c=await t.identity(),d=[],[u,p]=await t.peek(s.lastSeq);if(p!==0)return p;let h=u.length,y=r??ue,b=l??Ei;if(o&&h>0)o({phase:"peek",host:s.label,done:0,total:h});let Z=0,X=await ps(u,b,async(f)=>{let[S,G]=await dn(f,c.publicKey,n,i),W;if(G!==0||!S)W={ok:!1,seq:f.seq,stat:G};else{let C=await i.blake3(S.headEnc);W={ok:!0,seq:f.seq,kdm:S.kdm,headEnc:S.headEnc,headEncHash:C}}if(Z+=1,o&&cn(Z,h,y))o({phase:"peek",host:s.label,done:Z,total:h});return W}),I=new Set;for(let f of X){if(!f.ok){console.error("peek: decrypting item head",f.stat);continue}let S=T(f.headEncHash);if(await e.messages.has(f.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await e.uploads.deq(s.label,[f.headEncHash]),await e.downloads.deq(s.label,[f.seq]);continue}if(I.has(S)){await e.downloads.deq(s.label,[f.seq]);continue}let W=new U(f.headEnc),[C,k]=W.readStruct(yt);if(k!==0){console.error("peek: reading item head",k);continue}I.add(S),d.push({kdm:f.kdm,head:C,seq:f.seq,host:s.label,headEnc:f.headEnc,headEncHash:f.headEncHash})}if(await e.downloads.enq(d),u.length>0){let f=Math.max(...u.map((S)=>S.seq));await e.hosts.recordStats(s.label,{lastSeq:f})}if(o)o({phase:"peek",host:s.label,done:h,total:h});return 0}async function vi({conn:t,store:e,host:n,maxPushBytes:s,onProgress:i}){let o=s??hs,r=await e.uploads.list(n.label),l=r.length,c=0;if(i&&l>0)i({phase:"push",host:n.label,done:0,total:l});let d=[],u=[],p=0,h=async()=>{if(d.length<1)return 0;let y=d.length,b=await qr(t,e,n.label,d,u);if(d=[],u=[],p=0,b===0){if(c+=y,i)i({phase:"push",host:n.label,done:c,total:l})}return b};for(let y of r){let b=await e.messages.get(y);if(!b){c+=1;continue}let Z={...b.head,bod:b.body},[X,I]=await t.seal(Z);if(I!==0)return I;if(!X)return 12;let f=Ar(X);if(d.length>0&&p+f>o){let S=await h();if(S!==0)return S}if(d.push(X),u.push(y),p+=f,p>=o){let S=await h();if(S!==0)return S}}return h()}async function Zs({conn:t,store:e,enclave:n,host:s,crypto:i,maxPullBytes:o,onProgress:r},l){let c=o??ys,d=await e.downloads.list(),u=Array.from(d).filter((X)=>X.host===s.label);if(u.length<1)return 15;let p=de(u,(X)=>X.head),h=zi(p,(X)=>X.head.len,c),y=p.length,b=0;if(r)r({phase:"pull",host:s.label,done:0,total:y});let Z=Ni(t,h[0]);for(let X=0;X<h.length;X++){let[I,f]=await Z;if(f!==0||!I)return f;if(b+=h[X].length,r)r({phase:"pull",host:s.label,done:b,total:y});let S=h[X+1];if(S)Z=Ni(t,S);if(r)r({phase:"open",host:s.label,done:b,total:y});let G=de(I,(C)=>C.dl.head),[,W]=await _r(e,n,i,G);if(W!==0)return W;if(l){if(r)r({phase:"exec",host:s.label,done:b,total:y});await l()}}return 0}function Di({head:t,body:e}){let n={eid:t.eid,body:e,apld:Kt};if(t.off!==0)n.off=t.off;if(t.ctr!==0)n.ctr=t.ctr;if(t.typ)n.typ=t.typ;return n}async function Oi(t,{conn:e,store:n,enclave:s,host:i,crypto:o,onProgress:r},l){let c=i.label,d=await e.identity(),u=new U(t),[p,h]=u.readStructs(Ae);if(h!==0){console.error("Failed decoding notif",g[h]);return}let y=!1,Z=(await n.hosts.get(c))?.lastSeq,X=[],I=!1;for(let G of p){let[W,C]=await dn({seq:G.seq,headCph:G.headCph},d.publicKey,s,o);if(C!==0){console.error("Failed decrypting notif",g[C]);continue}let k=await o.blake3(W.headEnc);if(await n.messages.has(k))continue;let L=new U(W.headEnc),[x,B]=L.readStruct(yt);if(B!==0){console.error("Failed to parse head",g[B]);continue}if(!G.bodyCph&&x.len>0)I=!0,await n.downloads.enq([{seq:G.seq,host:c,kdm:W.kdm,head:x,headEnc:W.headEnc,headEncHash:k}]);else X.push({...W,head:x,bodyCph:G.bodyCph,headEncHash:k});if(Z===void 0||G.seq!==Z+1)console.log("out of seq",G.seq,Z),y=!0;else Z=G.seq}if(Z!==void 0)await n.hosts.touch(i.label,Z);let f=[];for(let G of X){let W=s.deriveCipher(G.kdm,"decrypt"),[C,k]=await qn(G.headEnc,G.bodyCph,W,o);if(k!==0){console.error("Failed to open body",g[k]);continue}f.push({key:G.headEncHash,data:Di({head:G.head,body:C.bod})})}let S=await n.messages.add(f);for(let G=0;G<S.length;G++){let W=S[G];if(W!==0&&W!==15)console.error("ERR storing",g[W],"for message",G)}if(r&&f.length>0)r({phase:"open",host:i.label,done:f.length,total:f.length});if(y||I||f.length>0)l()}async function Xs(t,e={}){let n=e.pull!==!1,s=e.push===!0,{conn:i,store:o,enclave:r,host:l,crypto:c,onProgress:d,peekProgressEvery:u,peekConcurrency:p}=t,h=await i.identity(),[y,b]=await i.peek(0);if(b!==0)return a(b);let Z=y.length,X=u??ue,I=p??Ei;if(d&&Z>0)d({phase:"peek",host:l.label,done:0,total:Z});let f=0,S=await ps(y,I,async(H)=>{let[Y,w]=await dn(H,h.publicKey,r,c),M;if(w!==0||!Y)M={ok:!1,seq:H.seq,stat:w};else{let R=await c.blake3(Y.headEnc);M={ok:!0,seq:H.seq,kdm:Y.kdm,headEnc:Y.headEnc,headEncHash:R}}if(f+=1,d&&cn(f,Z,X))d({phase:"peek",host:l.label,done:f,total:Z});return M}),G=new Map;for(let H of S){if(!H.ok)continue;let Y=T(H.headEncHash),w=G.get(Y);if(w)w.count+=1;else G.set(Y,{hash:H.headEncHash,count:1,sample:H})}let W=0,C=[];for(let H of G.values()){if(H.count>1)W+=H.count-1;C.push(H.hash)}let k=y.length,L=G.size,x=await le(C,c),B=[],J=0;for(let H of G.values()){if(await o.messages.has(H.hash)){await o.uploads.deq(l.label,[H.hash]);continue}if(J+=1,!n)continue;let w=H.sample,M=new U(w.headEnc),[R,j]=M.readStruct(yt);if(j!==0){console.error("reconcile: reading msg header",j);continue}B.push({kdm:w.kdm,head:R,seq:w.seq,host:l.label,headEnc:w.headEnc,headEncHash:w.headEncHash})}if(B.length>0)await o.downloads.enq(B);let E=0;if(s){let H=await o.messages.listKeys(),Y=new Set(G.keys()),w=[];for(let M of H)if(!Y.has(T(M)))E+=1,w.push(M);if(w.length>0)await o.uploads.enq(l.label,w)}else{let H=await o.messages.listKeys(),Y=new Set(G.keys());for(let w of H)if(!Y.has(T(w)))E+=1}let V=y.length>0?Math.max(...y.map((H)=>H.seq)):0;if(await o.hosts.recordStats(l.label,{setLastSeq:V}),d)d({phase:"peek",host:l.label,done:Z,total:Z});return m({msgcheck:x,numBags:k,uniqueMsgs:L,numDupes:W,missingLocal:J,missingHost:E})}function $r(t){return t.map(({head:e,body:n})=>({...e,bod:n}))}class me{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new on;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=ue;lastProgress=Qt;scheduledSync;constructor(t,e,n,s,i,o=!0,r=hs,l=ys,c){this.clock=t;this.state=e;this.store=n;this.transport=s;this.crypto=i;this.forceSkewHandlingByDefault=o;this.onScheduleSync=c;this.maxPushBytes=r,this.maxPullBytes=l,this.clientState=new ft(()=>this.getClientState()),this.xferState=new ft(()=>this.getXferState()),this.scheduledSync=new ke(rn,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(d){console.error("Debounced sync failed:",d)}})}emitProgress=(t)=>{this.lastProgress=t,this.xferState.emit()};async setSeed(t,e){await this.store.seed.save(t,e),this.clientState.emit()}async getClientState(){let{store:t,connections:e}=this,n=await t.seed.load(),s=await t.hosts.list(),i=!1;for(let o of e.values())if(o.isConnected()){i=!0;break}return{hasSeed:n!==void 0,hasHost:Array.from(s).length>0,connected:i}}async getXferState(){let{uploads:t,downloads:e}=this.store,n=await t.count();return{numDownloads:await e.count(),numUploads:n,progress:this.lastProgress}}apply=(t,e)=>{P("apply kick",{n:t.length});let n=this.state.apply($r(t));return this.enqueueApplyJob(()=>this.doApply(t,e,n))};async doApply(t,e={enqueueUpload:!0,triggerUpload:!0},n){let s=[],i=[];for(let{head:r,body:l}of t){let c=new N;c.writeStruct(yt,r);let d=c.result(),u=await this.crypto.blake3(d),p={eid:r.eid,body:l,apld:Kt};if(r.off!==0)p.off=r.off;if(r.ctr!==0)p.ctr=r.ctr;if(r.typ)p.typ=r.typ;s.push(u),i.push({key:u,data:p})}P("doApply archive start"),await this.store.messages.add(i),P("doApply archive done"),await Qi(this.store,s,this.crypto),P("doApply await persist");let o=await n;if(P("doApply persist done"),await this.markApplyStats(s,o),e.enqueueUpload){let r=[];for(let l=0;l<s.length;l++){let c=o[l];if(c===0||c===15)r.push(s[l])}if(r.length>0){let l=await this.store.hosts.list();for(let c of l)await this.store.uploads.enq(c.label,r);this.xferState.emit()}}if(e.triggerUpload)this.scheduleSync();return o}enqueueApplyJob(t){let e=this.applyChain.then(t,t);return this.applyChain=e.then(()=>{return},()=>{return}),e}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let t=await this.store.messages.list({apld:Kt});if(t.length<1)return[];let e=de(t,(n)=>n.head);return this.applyStored(e)}applyHashes=(t)=>this.enqueueApplyJob(()=>this.doApplyHashes(t));async doApplyHashes(t){let e=[];for(let i of t){let o=await this.store.messages.get(i);if(o)e.push(o)}let n=await this.applyStored(e),s=new Map;for(let i=0;i<e.length;i++)s.set(T(e[i].hash),n[i]??12);return t.map((i)=>s.get(T(i))??13)}async applyStored(t){if(t.length<1)return[];let e=t.map((s)=>({...s.head,bod:s.body})),n=await this.state.apply(e);return await this.markApplyStats(t.map((s)=>s.hash),n),n}async markApplyStats(t,e){let n=[],s=[];for(let i=0;i<t.length;i++){let o=e[i];if(o===0||o===15)n.push(t[i]);else if(o!==void 0&&ms(o))s.push({key:t[i],err:o})}if(n.length>0)await this.store.messages.markApplied(n);if(s.length>0)await this.store.messages.markFailed(s)}async insertRaw(t,e=""){P("insertRaw");let{clock:n,crypto:s}=this,i=n.now(),[o,r]=await Li({now:i,bod:t,typ:e,crypto:s});if(r!==0)return a(r);let c=(await this.apply([{head:o,body:t}]))[0];if(c!==0&&c!==15)return a(c??12);return m(o)}async makeUpdate(t,e,n=""){let{clock:s,crypto:i}=this,o=s.now();if(t.updatedAt.getTime()>o.getTime())return a(4);let r=t.ctr+1,[l,c]=await nn({now:o,eid:t.eid,ctr:r,typ:n,bod:e,crypto:i});if(c!==0)return a(c);return m({head:l,body:e})}async updateWithSkew(t,e,n,s=""){if(n===!1)return a(4);let{clock:i,crypto:o}=this,r=i.now(),l=new U(t.eid),[c,d]=l.readStruct(nt);if(d!==0)return a(d);let u=t.updatedAt.getTime()-c.ts.getTime(),p={eid:t.eid,off:u+1,ctr:t.ctr+1,typ:"",len:0},y=(await this.apply([{head:p,body:void 0}]))[0];if(y!==0&&y!==15)return a(y??12);if(e===void 0)return m(p);let[b,Z]=re({id:c.id,ts:r});if(Z!==0)return a(Z);let[X,I]=await nn({now:r,eid:b,ctr:0,typ:s,bod:e,crypto:o});if(I!==0)return a(I);let S=(await this.apply([{head:X,body:e}]))[0];if(S!==0&&S!==15)return a(S??12);return m(X)}async updateRaw(t,e,n=this.forceSkewHandlingByDefault,s=""){if(P("updateRaw"),t.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(t,e,n,s);let[i,o]=await this.makeUpdate(t,e,s);if(o!==0)return a(o);let l=(await this.apply([i]))[0];if(l!==0&&l!==15)return a(l??12);return m(i.head)}async insert(t){let{body:e,type:n,pid:s,tags:i}=t,o={body:e};if(s!==void 0)o.pid=s;if(i!==void 0)o.tags=i;let r=Ft(o);return this.insertRaw(r,n)}async update(t){let{prior:e,body:n,type:s,pid:i,tags:o,force:r}=t,l={body:n};if(i!==void 0)l.pid=i;if(o!==void 0)l.tags=o;let c=Ft(l);return this.updateRaw(e,c,r??this.forceSkewHandlingByDefault,s)}async delete(t){let e=t.force??!0;if("prior"in t)return this.updateRaw(t.prior,void 0,e);let[n,s]=await this.revFromArchive(t.eid);if(s!==0)return a(s);return this.updateRaw(n,void 0,e)}async revFromArchive(t){let e=await this.store.messages.last(t);if(e)return us(e.head);let n=new U(t),[s,i]=n.readStruct(nt);if(i!==0)return a(i);return m({eid:t,ctr:-1,updatedAt:s.ts})}async genEID(t){let{clock:e,crypto:n}=this,s=e.now();if(t!==void 0)return re({id:t,ts:s});let i=await n.genRandomBytes(8);return re({id:i,ts:s})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;await this.drainApplyQueue();for(let[i,o]of t){let r=await n.hosts.get(i);if(!r)continue;let l={conn:o,store:n,enclave:s,host:r,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},c=await bs(l);if(c!==0)return console.error(`Failed to peek: ${c}`),this.emitProgress({phase:"idle"}),c;this.xferState.emit();let d=await vi(l);if(d!==0)return console.error(`Failed to push: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await Zs(l,async()=>{await this.drainApplyQueue()});if(u!==0&&u!==15)return console.error(`Failed to pull: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild(t){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),t?.checkHost??!0){let n=await this.repull();if(n!==0)return n}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let t=await this.store.messages.listKeys();return le(t,this.crypto)}listMsgs(t){return this.store.messages.list(t)}countMsgs(t){return this.store.messages.count(t)}async reconcile(t,e){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:n,crypto:s,store:i}=this,o=await i.seed.load();if(!o)return a(22);let r=await i.hosts.get(t);if(!r)return a(13);let l=n.get(t);if(!l||!l.isConnected()){if(await this.connectToHost(r,!1,!1),r=await i.hosts.get(t),!r)return a(13);l=n.get(t)}if(!l)return a(12);let c={conn:l,store:i,enclave:o,crypto:s,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[d,u]=await Xs({...c,host:r},e);if(this.xferState.emit(),u!==0)return this.emitProgress({phase:"idle"}),a(u);if(!d)return this.emitProgress({phase:"idle"}),a(12);if(e?.sync===!1)return this.emitProgress({phase:"idle"}),m(d);let p=await this.sync();if(p!==0)return a(p);let h=await i.hosts.get(t);if(!h)return a(13);let[y,b]=await Xs({...c,host:h},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),b!==0)return a(b);if(!y)return a(12);return m(y)}async repull(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;let i=Array.from(await n.hosts.list());if(i.length<1)return 0;for(let o of i){let r=t.get(o.label);if(!r||!r.isConnected())await this.connectToHost(o,!1,!1)}for(let[o,r]of t){let l=await n.hosts.get(o);if(!l)continue;let c={conn:r,store:n,enclave:s,host:{...l,lastSeq:0},crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},d=await bs(c);if(d!==0)return console.error(`rebuild: failed to peek: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await Zs(c);if(u!==0&&u!==15)return console.error(`rebuild: failed to pull: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let t=await this.state.clear();if(t!==0)return t;let e=await this.store.messages.list(),n=de(e,(o)=>o.head),s=n.length;if(s<1)return this.emitProgress({phase:"idle"}),0;let i=0;while(i<n.length){let o=0,r=0,l=i;for(let d=i;d<n.length&&r<100&&o<102400;d++)o+=n[d].head.len,r++,l=d+1;let c=n.slice(i,l);await this.applyStored(c),this.emitProgress({phase:"exec",done:l,total:s}),i=l}return this.emitProgress({phase:"idle"}),0}async wipe(t){let e=t?.msgs!==!1,n=t?.ents!==!1,s=t?.meta!==!1,i=t?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:o}=this;if(s)await o.hosts.wipe(),await o.uploads.wipe(),await o.downloads.wipe();if(e)await o.messages.wipe();if(i)await o.seed.wipe();if(n)await this.state.clear();this.lastProgress=Qt,this.clientState.emit(),this.xferState.emit()}import=async(t,e)=>{let{crypto:n,store:s}=this,i=e?.onProgress,o=await s.seed.load();if(!o)return 22;console.time("import: decoding file...");let r=await t.bytes(),[l,c]=await en.decodeFile(r,n,o);if(c!==0)return c;console.timeEnd("import: decoding file...");let d=0;while(d<l.length){let u=0,p=0,h=d;for(let Z=d;Z<l.length&&p<100&&u<102400;Z++)u+=l[Z].head.len,p++,h=Z+1;let y=l.slice(d,h);console.time(`import: applying [${d}, ${h}]`);let b=await this.apply(y,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${d}, ${h}]`);for(let Z=0;Z<y.length;Z++){let X=b[Z];if(X!==0&&X!==15)console.warn(`failed to import msg ${d+Z}: ${g[X]}`)}if(i)queueMicrotask(()=>i(h,l.length,0));this.emitProgress({phase:"import",done:h,total:l.length}),d=h}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:t,store:e}=this,n=await e.seed.load();if(!n)return a(22);let s=await e.messages.list();return en.encodeFile("export",0,s,t,n)}async export(t){let[e,n]=await this.exportBytes();if(n!==0)return n;if(!e)return 12;let s=new Blob([e.slice()]);return an(s,t),0}async link(t,e=!0){if(await this.store.hosts.add(t),this.clientState.emit(),e){let n=await this.store.hosts.get(t.label);if(n)await this.connectToHost(n)}}async unlink(t){await this.store.hosts.del(t),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async(t,e=!0,n=!0)=>{let{clock:s,connections:i,crypto:o,store:r,transport:l}=this,c=i.get(t.label);if(c){if(c.isConnected())return;try{c.closeListener()}catch{}i.delete(t.label)}let d=await r.seed.load();if(!d)return;console.info(`Connecting to ${t.handle} (${t.label})`);let u=new $e(d,o,t,s,l(t),(p)=>r.hosts.set(t.label,p));if(await u.register(),e)await u.listen(async(p)=>{let h={conn:u,store:r,enclave:d,host:t,crypto:o,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return Oi(p,h,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(i.set(t.label,u),this.clientState.emit(),n)this.scheduleSync()};async connect(t=!0,e=!0){let{connectToHost:n,scheduleSync:s,store:i}=this;if(!await i.seed.load())return;await this.drainApplyQueue();let r=await i.hosts.list();for(let l of r)await n(l,t,!1);if(e)s()}disconnect=async()=>{for(let t of this.connections.values())try{t.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}var Dt=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function un(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Gs(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function tt(t,...e){if(!Gs(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function fs(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function ji(t,e){tt(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Vs(t){if(typeof t!=="boolean")throw Error(`boolean expected, not ${t}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var xt=(t)=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4));var tl=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!tl)throw Error("Non little-endian hardware is not supported");function el(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function pn(t){if(typeof t==="string")t=el(t);else if(Gs(t))t=mn(t);else throw Error("Uint8Array expected, got "+typeof t);return t}function Ai(t,e){if(e==null||typeof e!=="object")throw Error("options must be defined");return Object.assign(t,e)}function qi(t,e){if(t.length!==e.length)return!1;let n=0;for(let s=0;s<t.length;s++)n|=t[s]^e[s];return n===0}var _i=(t,e)=>{function n(s,...i){if(tt(s),t.nonceLength!==void 0){let u=i[0];if(!u)throw Error("nonce / iv required");if(t.varSizeNonce)tt(u);else tt(u,t.nonceLength)}let o=t.tagLength;if(o&&i[1]!==void 0)tt(i[1]);let r=e(s,...i),l=(u,p)=>{if(p!==void 0){if(u!==2)throw Error("cipher output not supported");tt(p)}},c=!1;return{encrypt(u,p){if(c)throw Error("cannot encrypt() twice with same key + nonce");return c=!0,tt(u),l(r.encrypt.length,p),r.encrypt(u,p)},decrypt(u,p){if(tt(u),o&&u.length<o)throw Error("invalid ciphertext length: smaller than tagLength="+o);return l(r.decrypt.length,p),r.decrypt(u,p)}}}return Object.assign(n,t),n};function Is(t,e,n=!0){if(e===void 0)return new Uint8Array(t);if(e.length!==t)throw Error("invalid output length, expected "+t+", got: "+e.length);if(n&&!nl(e))throw Error("invalid output, must be aligned");return e}function nl(t){return t.byteOffset%4===0}function mn(t){return Uint8Array.from(t)}function St(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function Le(t=32){if(Dt&&typeof Dt.getRandomValues==="function")return Dt.getRandomValues(new Uint8Array(t));if(Dt&&typeof Dt.randomBytes==="function")return Dt.randomBytes(t);throw Error("crypto.getRandomValues must be defined")}var to=(t)=>Uint8Array.from(t.split("").map((e)=>e.charCodeAt(0))),sl=to("expand 16-byte k"),il=to("expand 32-byte k"),ol=xt(sl),rl=xt(il);function K(t,e){return t<<e|t>>>32-e}function Ss(t){return t.byteOffset%4===0}var hn=64,ll=16,eo=4294967295,$i=new Uint32Array;function cl(t,e,n,s,i,o,r,l){let c=i.length,d=new Uint8Array(hn),u=xt(d),p=Ss(i)&&Ss(o),h=p?xt(i):$i,y=p?xt(o):$i;for(let b=0;b<c;r++){if(t(e,n,s,u,r,l),r>=eo)throw Error("arx: counter overflow");let Z=Math.min(hn,c-b);if(p&&Z===hn){let X=b/4;if(b%4!==0)throw Error("arx: invalid block position");for(let I=0,f;I<ll;I++)f=X+I,y[f]=h[f]^u[I];b+=hn;continue}for(let X=0,I;X<Z;X++)I=b+X,o[I]=i[I]^d[X];b+=Z}}function no(t,e){let{allowShortKeys:n,extendNonceFn:s,counterLength:i,counterRight:o,rounds:r}=Ai({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},e);if(typeof t!=="function")throw Error("core must be a function");return un(i),un(r),Vs(o),Vs(n),(l,c,d,u,p=0)=>{tt(l),tt(c),tt(d);let h=d.length;if(u===void 0)u=new Uint8Array(h);if(tt(u),un(p),p<0||p>=eo)throw Error("arx: counter overflow");if(u.length<h)throw Error(`arx: output (${u.length}) is shorter than data (${h})`);let y=[],b=l.length,Z,X;if(b===32)y.push(Z=mn(l)),X=rl;else if(b===16&&n)Z=new Uint8Array(32),Z.set(l),Z.set(l,16),X=ol,y.push(Z);else throw Error(`arx: invalid 32-byte key, got length=${b}`);if(!Ss(c))y.push(c=mn(c));let I=xt(Z);if(s){if(c.length!==24)throw Error("arx: extended nonce must be 24 bytes");s(X,I,xt(c.subarray(0,16)),I),c=c.subarray(16)}let f=16-i;if(f!==c.length)throw Error(`arx: nonce must be ${f} or 16 bytes`);if(f!==12){let G=new Uint8Array(12);G.set(c,o?0:12-c.length),c=G,y.push(c)}let S=xt(c);return cl(t,X,I,S,d,u,p,r),St(...y),u}}var it=(t,e)=>t[e++]&255|(t[e++]&255)<<8;class so{constructor(t){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,t=pn(t),tt(t,32);let e=it(t,0),n=it(t,2),s=it(t,4),i=it(t,6),o=it(t,8),r=it(t,10),l=it(t,12),c=it(t,14);this.r[0]=e&8191,this.r[1]=(e>>>13|n<<3)&8191,this.r[2]=(n>>>10|s<<6)&7939,this.r[3]=(s>>>7|i<<9)&8191,this.r[4]=(i>>>4|o<<12)&255,this.r[5]=o>>>1&8190,this.r[6]=(o>>>14|r<<2)&8191,this.r[7]=(r>>>11|l<<5)&8065,this.r[8]=(l>>>8|c<<8)&8191,this.r[9]=c>>>5&127;for(let d=0;d<8;d++)this.pad[d]=it(t,16+2*d)}process(t,e,n=!1){let s=n?0:2048,{h:i,r:o}=this,r=o[0],l=o[1],c=o[2],d=o[3],u=o[4],p=o[5],h=o[6],y=o[7],b=o[8],Z=o[9],X=it(t,e+0),I=it(t,e+2),f=it(t,e+4),S=it(t,e+6),G=it(t,e+8),W=it(t,e+10),C=it(t,e+12),k=it(t,e+14),L=i[0]+(X&8191),x=i[1]+((X>>>13|I<<3)&8191),B=i[2]+((I>>>10|f<<6)&8191),J=i[3]+((f>>>7|S<<9)&8191),E=i[4]+((S>>>4|G<<12)&8191),V=i[5]+(G>>>1&8191),H=i[6]+((G>>>14|W<<2)&8191),Y=i[7]+((W>>>11|C<<5)&8191),w=i[8]+((C>>>8|k<<8)&8191),M=i[9]+(k>>>5|s),R=0,j=R+L*r+x*(5*Z)+B*(5*b)+J*(5*y)+E*(5*h);R=j>>>13,j&=8191,j+=V*(5*p)+H*(5*u)+Y*(5*d)+w*(5*c)+M*(5*l),R+=j>>>13,j&=8191;let _=R+L*l+x*r+B*(5*Z)+J*(5*b)+E*(5*y);R=_>>>13,_&=8191,_+=V*(5*h)+H*(5*p)+Y*(5*u)+w*(5*d)+M*(5*c),R+=_>>>13,_&=8191;let D=R+L*c+x*l+B*r+J*(5*Z)+E*(5*b);R=D>>>13,D&=8191,D+=V*(5*y)+H*(5*h)+Y*(5*p)+w*(5*u)+M*(5*d),R+=D>>>13,D&=8191;let z=R+L*d+x*c+B*l+J*r+E*(5*Z);R=z>>>13,z&=8191,z+=V*(5*b)+H*(5*y)+Y*(5*h)+w*(5*p)+M*(5*u),R+=z>>>13,z&=8191;let v=R+L*u+x*d+B*c+J*l+E*r;R=v>>>13,v&=8191,v+=V*(5*Z)+H*(5*b)+Y*(5*y)+w*(5*h)+M*(5*p),R+=v>>>13,v&=8191;let ut=R+L*p+x*u+B*d+J*c+E*l;R=ut>>>13,ut&=8191,ut+=V*r+H*(5*Z)+Y*(5*b)+w*(5*y)+M*(5*h),R+=ut>>>13,ut&=8191;let ht=R+L*h+x*p+B*u+J*d+E*c;R=ht>>>13,ht&=8191,ht+=V*l+H*r+Y*(5*Z)+w*(5*b)+M*(5*y),R+=ht>>>13,ht&=8191;let te=R+L*y+x*h+B*p+J*u+E*d;R=te>>>13,te&=8191,te+=V*c+H*l+Y*r+w*(5*Z)+M*(5*b),R+=te>>>13,te&=8191;let ee=R+L*b+x*y+B*h+J*p+E*u;R=ee>>>13,ee&=8191,ee+=V*d+H*c+Y*l+w*r+M*(5*Z),R+=ee>>>13,ee&=8191;let ne=R+L*Z+x*b+B*y+J*h+E*p;R=ne>>>13,ne&=8191,ne+=V*u+H*d+Y*c+w*l+M*r,R+=ne>>>13,ne&=8191,R=(R<<2)+R|0,R=R+j|0,j=R&8191,R=R>>>13,_+=R,i[0]=j,i[1]=_,i[2]=D,i[3]=z,i[4]=v,i[5]=ut,i[6]=ht,i[7]=te,i[8]=ee,i[9]=ne}finalize(){let{h:t,pad:e}=this,n=new Uint16Array(10),s=t[1]>>>13;t[1]&=8191;for(let r=2;r<10;r++)t[r]+=s,s=t[r]>>>13,t[r]&=8191;t[0]+=s*5,s=t[0]>>>13,t[0]&=8191,t[1]+=s,s=t[1]>>>13,t[1]&=8191,t[2]+=s,n[0]=t[0]+5,s=n[0]>>>13,n[0]&=8191;for(let r=1;r<10;r++)n[r]=t[r]+s,s=n[r]>>>13,n[r]&=8191;n[9]-=8192;let i=(s^1)-1;for(let r=0;r<10;r++)n[r]&=i;i=~i;for(let r=0;r<10;r++)t[r]=t[r]&i|n[r];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let o=t[0]+e[0];t[0]=o&65535;for(let r=1;r<8;r++)o=(t[r]+e[r]|0)+(o>>>16)|0,t[r]=o&65535;St(n)}update(t){fs(this);let{buffer:e,blockLen:n}=this;t=pn(t);let s=t.length;for(let i=0;i<s;){let o=Math.min(n-this.pos,s-i);if(o===n){for(;n<=s-i;i+=n)this.process(t,i);continue}if(e.set(t.subarray(i,i+o),this.pos),this.pos+=o,i+=o,this.pos===n)this.process(e,0,!1),this.pos=0}return this}destroy(){St(this.h,this.r,this.buffer,this.pad)}digestInto(t){fs(this),ji(t,this),this.finished=!0;let{buffer:e,h:n}=this,{pos:s}=this;if(s){e[s++]=1;for(;s<16;s++)e[s]=0;this.process(e,0,!0)}this.finalize();let i=0;for(let o=0;o<8;o++)t[i++]=n[o]>>>0,t[i++]=n[o]>>>8;return t}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}}function al(t){let e=(s,i)=>t(i).update(pn(s)).digest(),n=t(new Uint8Array(32));return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var Ws=al((t)=>new so(t));function dl(t,e,n,s,i,o=20){let r=t[0],l=e[0],c=e[1],d=e[2],u=e[3],p=t[1],h=n[0],y=n[1],b=i,Z=0,X=t[2],I=e[4],f=e[5],S=e[6],G=e[7],W=t[3],C=r,k=l,L=c,x=d,B=u,J=p,E=h,V=y,H=b,Y=Z,w=X,M=I,R=f,j=S,_=G,D=W;for(let v=0;v<o;v+=2)B^=K(C+R|0,7),H^=K(B+C|0,9),R^=K(H+B|0,13),C^=K(R+H|0,18),Y^=K(J+k|0,7),j^=K(Y+J|0,9),k^=K(j+Y|0,13),J^=K(k+j|0,18),_^=K(w+E|0,7),L^=K(_+w|0,9),E^=K(L+_|0,13),w^=K(E+L|0,18),x^=K(D+M|0,7),V^=K(x+D|0,9),M^=K(V+x|0,13),D^=K(M+V|0,18),k^=K(C+x|0,7),L^=K(k+C|0,9),x^=K(L+k|0,13),C^=K(x+L|0,18),E^=K(J+B|0,7),V^=K(E+J|0,9),B^=K(V+E|0,13),J^=K(B+V|0,18),M^=K(w+Y|0,7),H^=K(M+w|0,9),Y^=K(H+M|0,13),w^=K(Y+H|0,18),R^=K(D+_|0,7),j^=K(R+D|0,9),_^=K(j+R|0,13),D^=K(_+j|0,18);let z=0;s[z++]=r+C|0,s[z++]=l+k|0,s[z++]=c+L|0,s[z++]=d+x|0,s[z++]=u+B|0,s[z++]=p+J|0,s[z++]=h+E|0,s[z++]=y+V|0,s[z++]=b+H|0,s[z++]=Z+Y|0,s[z++]=X+w|0,s[z++]=I+M|0,s[z++]=f+R|0,s[z++]=S+j|0,s[z++]=G+_|0,s[z++]=W+D|0}function ul(t,e,n,s){let i=t[0],o=e[0],r=e[1],l=e[2],c=e[3],d=t[1],u=n[0],p=n[1],h=n[2],y=n[3],b=t[2],Z=e[4],X=e[5],I=e[6],f=e[7],S=t[3];for(let W=0;W<20;W+=2)c^=K(i+X|0,7),h^=K(c+i|0,9),X^=K(h+c|0,13),i^=K(X+h|0,18),y^=K(d+o|0,7),I^=K(y+d|0,9),o^=K(I+y|0,13),d^=K(o+I|0,18),f^=K(b+u|0,7),r^=K(f+b|0,9),u^=K(r+f|0,13),b^=K(u+r|0,18),l^=K(S+Z|0,7),p^=K(l+S|0,9),Z^=K(p+l|0,13),S^=K(Z+p|0,18),o^=K(i+l|0,7),r^=K(o+i|0,9),l^=K(r+o|0,13),i^=K(l+r|0,18),u^=K(d+c|0,7),p^=K(u+d|0,9),c^=K(p+u|0,13),d^=K(c+p|0,18),Z^=K(b+y|0,7),h^=K(Z+b|0,9),y^=K(h+Z|0,13),b^=K(y+h|0,18),X^=K(S+f|0,7),I^=K(X+S|0,9),f^=K(I+X|0,13),S^=K(f+I|0,18);let G=0;s[G++]=i,s[G++]=d,s[G++]=b,s[G++]=S,s[G++]=u,s[G++]=p,s[G++]=h,s[G++]=y}var gs=no(dl,{counterRight:!0,extendNonceFn:ul}),Ks=_i({blockSize:64,nonceLength:24,tagLength:16},(t,e)=>({encrypt(n,s){s=Is(n.length+32,s,!1);let i=s.subarray(0,32),o=s.subarray(32);s.set(n,32),St(i),gs(t,e,s,s);let r=Ws(o,i);return s.set(r,16),St(s.subarray(0,16),r),s.subarray(16)},decrypt(n,s){tt(n),s=Is(n.length+32,s,!1);let i=s.subarray(0,32),o=s.subarray(32,48),r=s.subarray(48);s.set(n,32),St(i);let l=gs(t,e,i,i),c=Ws(r,l);if(!qi(o,c))throw Error("invalid tag");return gs(t,e,s.subarray(16),s.subarray(16)),St(i,o,c),r}}));/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function pl(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function Me(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Ot(t,...e){if(!pl(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function we(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function yn(t,e){Ot(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function io(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function he(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function ye(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function Pe(t,e){return t<<32-e|t>>>e}var oo=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function ro(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}var lo=oo?(t)=>t:(t)=>ro(t);function ml(t){for(let e=0;e<t.length;e++)t[e]=ro(t[e]);return t}var lt=oo?(t)=>t:ml;function hl(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function be(t){if(typeof t==="string")t=hl(t);return Ot(t),t}class xs{}function co(t){let e=(s,i)=>t(i).update(be(s)).digest(),n=t({});return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var ao=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var bn=BigInt(4294967295),uo=BigInt(32);function Rs(t,e=!1){if(e)return{h:Number(t&bn),l:Number(t>>uo&bn)};return{h:Number(t>>uo&bn)|0,l:Number(t&bn)|0}}function Rt(t,e,n,s,i){return t=t+e+i|0,s=Pe(s^t,16),n=n+s|0,e=Pe(e^n,12),{a:t,b:e,c:n,d:s}}function Ht(t,e,n,s,i){return t=t+e+i|0,s=Pe(s^t,8),n=n+s|0,e=Pe(e^n,7),{a:t,b:e,c:n,d:s}}class Hs extends xs{constructor(t,e){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,Me(t),Me(e),this.blockLen=t,this.outputLen=e,this.buffer=new Uint8Array(t),this.buffer32=he(this.buffer)}update(t){we(this),t=be(t),Ot(t);let{blockLen:e,buffer:n,buffer32:s}=this,i=t.length,o=t.byteOffset,r=t.buffer;for(let l=0;l<i;){if(this.pos===e)lt(s),this.compress(s,0,!1),lt(s),this.pos=0;let c=Math.min(e-this.pos,i-l),d=o+l;if(c===e&&!(d%4)&&l+c<i){let u=new Uint32Array(r,d,Math.floor((i-l)/4));lt(u);for(let p=0;l+e<i;p+=s.length,l+=e)this.length+=e,this.compress(u,p,!1);lt(u);continue}n.set(t.subarray(l,l+c),this.pos),this.pos+=c,this.length+=c,l+=c}return this}digestInto(t){we(this),yn(t,this);let{pos:e,buffer32:n}=this;this.finished=!0,ye(this.buffer.subarray(e)),lt(n),this.compress(n,0,!0),lt(n);let s=he(t);this.get().forEach((i,o)=>s[o]=lo(i))}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}_cloneInto(t){let{buffer:e,length:n,finished:s,destroyed:i,outputLen:o,pos:r}=this;return t||(t=new this.constructor({dkLen:o})),t.set(...this.get()),t.buffer.set(e),t.destroyed=i,t.finished=s,t.length=n,t.pos=r,t.outputLen=o,t}clone(){return this._cloneInto()}}function Cs(t,e,n,s,i,o,r,l,c,d,u,p,h,y,b,Z,X,I,f,S){let G=0;for(let W=0;W<s;W++)({a:i,b:c,c:h,d:X}=Rt(i,c,h,X,n[e+t[G++]])),{a:i,b:c,c:h,d:X}=Ht(i,c,h,X,n[e+t[G++]]),{a:o,b:d,c:y,d:I}=Rt(o,d,y,I,n[e+t[G++]]),{a:o,b:d,c:y,d:I}=Ht(o,d,y,I,n[e+t[G++]]),{a:r,b:u,c:b,d:f}=Rt(r,u,b,f,n[e+t[G++]]),{a:r,b:u,c:b,d:f}=Ht(r,u,b,f,n[e+t[G++]]),{a:l,b:p,c:Z,d:S}=Rt(l,p,Z,S,n[e+t[G++]]),{a:l,b:p,c:Z,d:S}=Ht(l,p,Z,S,n[e+t[G++]]),{a:i,b:d,c:b,d:S}=Rt(i,d,b,S,n[e+t[G++]]),{a:i,b:d,c:b,d:S}=Ht(i,d,b,S,n[e+t[G++]]),{a:o,b:u,c:Z,d:X}=Rt(o,u,Z,X,n[e+t[G++]]),{a:o,b:u,c:Z,d:X}=Ht(o,u,Z,X,n[e+t[G++]]),{a:r,b:p,c:h,d:I}=Rt(r,p,h,I,n[e+t[G++]]),{a:r,b:p,c:h,d:I}=Ht(r,p,h,I,n[e+t[G++]]),{a:l,b:c,c:y,d:f}=Rt(l,c,y,f,n[e+t[G++]]),{a:l,b:c,c:y,d:f}=Ht(l,c,y,f,n[e+t[G++]]);return{v0:i,v1:o,v2:r,v3:l,v4:c,v5:d,v6:u,v7:p,v8:h,v9:y,v10:b,v11:Z,v12:X,v13:I,v14:f,v15:S}}var Wt={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},Ct=ao.slice(),po=(()=>{let t=Array.from({length:16},(s,i)=>i),e=(s)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((i)=>s[i]),n=[];for(let s=0,i=t;s<7;s++,i=e(i))n.push(...i);return Uint8Array.from(n)})();class Ts extends Hs{constructor(t={},e=0){super(64,t.dkLen===void 0?32:t.dkLen);this.chunkPos=0,this.chunksDone=0,this.flags=0,this.stack=[],this.posOut=0,this.bufferOut32=new Uint32Array(16),this.chunkOut=0,this.enableXOF=!0;let{key:n,context:s}=t,i=s!==void 0;if(n!==void 0){if(i)throw Error('Only "key" or "context" can be specified at same time');let o=be(n).slice();Ot(o,32),this.IV=he(o),lt(this.IV),this.flags=e|Wt.KEYED_HASH}else if(i){let o=be(s),r=new Ts({dkLen:32},Wt.DERIVE_KEY_CONTEXT).update(o).digest();this.IV=he(r),lt(this.IV),this.flags=e|Wt.DERIVE_KEY_MATERIAL}else this.IV=Ct.slice(),this.flags=e;this.state=this.IV.slice(),this.bufferOut=io(this.bufferOut32)}get(){return[]}set(){}b2Compress(t,e,n,s=0){let{state:i,pos:o}=this,{h:r,l}=Rs(BigInt(t),!0),{v0:c,v1:d,v2:u,v3:p,v4:h,v5:y,v6:b,v7:Z,v8:X,v9:I,v10:f,v11:S,v12:G,v13:W,v14:C,v15:k}=Cs(po,s,n,7,i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],Ct[0],Ct[1],Ct[2],Ct[3],r,l,o,e);i[0]=c^X,i[1]=d^I,i[2]=u^f,i[3]=p^S,i[4]=h^G,i[5]=y^W,i[6]=b^C,i[7]=Z^k}compress(t,e=0,n=!1){let s=this.flags;if(!this.chunkPos)s|=Wt.CHUNK_START;if(this.chunkPos===15||n)s|=Wt.CHUNK_END;if(!n)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,s,t,e),this.chunkPos+=1,this.chunkPos===16||n){let i=this.state;this.state=this.IV.slice();for(let o,r=this.chunksDone+1;n||!(r&1);r>>=1){if(!(o=this.stack.pop()))break;this.buffer32.set(o,0),this.buffer32.set(i,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|Wt.PARENT,this.buffer32,0),i=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(i)}this.pos=0}_cloneInto(t){t=super._cloneInto(t);let{IV:e,flags:n,state:s,chunkPos:i,posOut:o,chunkOut:r,stack:l,chunksDone:c}=this;return t.state.set(s.slice()),t.stack=l.map((d)=>Uint32Array.from(d)),t.IV.set(e),t.flags=n,t.chunkPos=i,t.chunksDone=c,t.posOut=o,t.chunkOut=r,t.enableXOF=this.enableXOF,t.bufferOut32.set(this.bufferOut32),t}destroy(){this.destroyed=!0,ye(this.state,this.buffer32,this.IV,this.bufferOut32),ye(...this.stack)}b2CompressOut(){let{state:t,pos:e,flags:n,buffer32:s,bufferOut32:i}=this,{h:o,l:r}=Rs(BigInt(this.chunkOut++));lt(s);let{v0:l,v1:c,v2:d,v3:u,v4:p,v5:h,v6:y,v7:b,v8:Z,v9:X,v10:I,v11:f,v12:S,v13:G,v14:W,v15:C}=Cs(po,0,s,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],Ct[0],Ct[1],Ct[2],Ct[3],r,o,e,n);i[0]=l^Z,i[1]=c^X,i[2]=d^I,i[3]=u^f,i[4]=p^S,i[5]=h^G,i[6]=y^W,i[7]=b^C,i[8]=t[0]^Z,i[9]=t[1]^X,i[10]=t[2]^I,i[11]=t[3]^f,i[12]=t[4]^S,i[13]=t[5]^G,i[14]=t[6]^W,i[15]=t[7]^C,lt(s),lt(i),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,ye(this.buffer.subarray(this.pos));let t=this.flags|Wt.ROOT;if(this.stack.length)t|=Wt.PARENT,lt(this.buffer32),this.compress(this.buffer32,0,!0),lt(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else t|=(!this.chunkPos?Wt.CHUNK_START:0)|Wt.CHUNK_END;this.flags=t,this.b2CompressOut()}writeInto(t){we(this,!1),Ot(t),this.finish();let{blockLen:e,bufferOut:n}=this;for(let s=0,i=t.length;s<i;){if(this.posOut>=e)this.b2CompressOut();let o=Math.min(e-this.posOut,i-s);t.set(n.subarray(this.posOut,this.posOut+o),s),this.posOut+=o,s+=o}return t}xofInto(t){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto(t)}xof(t){return Me(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(yn(t,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}}var Ys=co((t)=>new Ts(t));var yl=32,Wy=Symbol("X25519Sk");function mo(t){if(t.byteLength!==yl)return a(10);return m(t)}var Q=(1n<<255n)-19n,bl=121665n,ho=new Uint8Array(32);ho[0]=9;function yo(t){let e=0n;for(let n=t.length-1;n>=0;n--)e=e<<8n|BigInt(t[n]);return e}function Zl(t){let e=new Uint8Array(32),n=(t%Q+Q)%Q;for(let s=0;s<32;s++)e[s]=Number(n&0xffn),n>>=8n;return e}function Xl(t){let e=t.slice();return e[31]&=127,yo(e)}function Gl(t){let e=t.slice();return e[0]&=248,e[31]&=127,e[31]|=64,e}function Zn(t,e,n){let s=-t,i=(e^n)&s;return[e^i,n^i]}function fl(t){let e=Q-2n,n=(t%Q+Q)%Q,s=1n;while(e>0n){if(e&1n)s=s*n%Q;n=n*n%Q,e>>=1n}return s}function ks(t,e){let n=Gl(t),s=Xl(e),i=1n,o=0n,r=s,l=1n,c=0n,d=yo(n);for(let u=254;u>=0;u--){let p=d>>BigInt(u)&1n;c^=p,[i,r]=Zn(c,i,r),[o,l]=Zn(c,o,l),c=p;let h=(i+o)%Q,y=h*h%Q,b=(i-o+Q)%Q,Z=b*b%Q,X=(y-Z+Q)%Q,I=(r+l)%Q,S=(r-l+Q)%Q*h%Q,G=I*b%Q,W=(S+G)%Q,C=(S-G+Q)%Q;r=W*W%Q,l=s*C*C%Q,i=y*Z%Q,o=X*(y+bl*X)%Q}return[i,r]=Zn(c,i,r),[o,l]=Zn(c,o,l),n.fill(0),Zl(i*fl(o)%Q)}function bo(t){return ks(t,ho)}var Ls=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function Zo(t){let e=new Uint8Array(Ls.length+32);return e.set(Ls),e.set(t.subarray(0,32),Ls.length),e}var Ms=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);function Xo(t){let e=new Uint8Array(Ms.length+32);return e.set(Ms),e.set(t.subarray(0,32),Ms.length),e}function Go(t){return typeof t==="string"?new TextEncoder().encode(t):t}function Tt(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),e}class jt{verifyKeys=new Map;async genRandomBytes(t){return Le(t)}async gen256BitSecureRandomSeed(){return Le(32)}async encryptXSalsa20Poly1305Combined(t,e){let n=Le(24),i=Ks(e,n).encrypt(t);return new Uint8Array([...n,...i])}async decryptXSalsa20Poly1305Combined(t,e){let n=t.slice(0,24),s=t.slice(24);return Ks(e,n).decrypt(s)}async deriveEd25519KeyPair(t){let e=t,n=Zo(e),s=Tt(n),i;try{let d=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!0,["sign"]);i=await globalThis.crypto.subtle.exportKey("jwk",d)}finally{n.fill(0),new Uint8Array(s).fill(0)}if(typeof i.x!=="string")throw Error("Ed25519 JWK missing x");let o=i.x;i.d=void 0;let r=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:o},{name:"Ed25519"},!0,["verify"]),l=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",r));this.verifyKeys.set(pt(l),r);let c=new Uint8Array(64);return c.set(e,0),c.set(l,32),{keyType:"ed25519",privateKey:c,publicKey:l}}async importSignKey(t){let e=t.subarray(0,32),n=Zo(e),s=Tt(n);try{return await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!1,["sign"])}finally{n.fill(0),new Uint8Array(s).fill(0)}}async importVerifyKey(t){let e=pt(t),n=this.verifyKeys.get(e);if(n)return n;let s=await globalThis.crypto.subtle.importKey("raw",Tt(t),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(e,s),s}async signEd25519(t,e){let n=Go(t),s=await this.importSignKey(e),i=await globalThis.crypto.subtle.sign({name:"Ed25519"},s,Tt(n));return new Uint8Array(i)}async checkSigEd25519(t,e,n){let s=Go(e);try{let i=await this.importVerifyKey(n);return await globalThis.crypto.subtle.verify({name:"Ed25519"},i,Tt(t),Tt(s))}catch{return!1}}async blake3(t,e){if(e===void 0)return Ys(t);return Ys(t,e)}async genX25519(){let t=await Le(32);t[0]&=248,t[31]&=127,t[31]|=64;let[e,n]=mo(t);if(n!==0||e===void 0)throw t.fill(0),Error("X25519 scalar brand failed");let s=bo(e),i=Xo(e),o=Tt(i);try{let r=await globalThis.crypto.subtle.importKey("pkcs8",o,{name:"X25519"},!0,["deriveBits"]),l=await globalThis.crypto.subtle.exportKey("jwk",r);if(typeof l.x!=="string")throw Error("X25519 JWK missing x");let c=An(l.x);if(l.d=void 0,!F(c,s))throw Error("X25519 WebCrypto pub != RFC 7748");return{priv:e,pub:s}}catch(r){throw e.fill(0),r}finally{i.fill(0),new Uint8Array(o).fill(0)}}async x25519Shared(t,e){let n=Xo(t),s=Tt(n);try{let i=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"X25519"},!1,["deriveBits"]),o=await globalThis.crypto.subtle.importKey("raw",Tt(e),{name:"X25519"},!1,[]),r=await globalThis.crypto.subtle.deriveBits({name:"X25519",public:o},i,256);return new Uint8Array(r)}catch{return ks(t,e)}finally{n.fill(0),new Uint8Array(s).fill(0)}}}var Vl=new jt,Ze=Vl;var q="entities",Xn="entity_type_created_at",Ps="entity_type_updated_at",Us="entity_type_parent_id",Xe="entity_tags",fo="entity_type_group_id",Vo="db",Io=14;function Il(t){return"typ"in t}function Sl(t){let e={bod:t.body,crd:t.createdAt,...t.ctr!==0?{ctr:t.ctr}:{},eid:T(t.eid),pid:t.pid?T(t.pid):void 0,tgs:t.tags,typ:t.type,upd:t.updatedAt};if(e.pid===void 0)delete e.pid;if(e.tgs===void 0)delete e.tgs;if(e.ctr===void 0)delete e.ctr;return e}function Wl(t){if(!O(t))return{eid:T(t.eid),upd:t.updatedAt,...t.ctr!==0?{ctr:t.ctr}:{}};return Sl(t)}function Ge(t){return{body:t.bod,createdAt:t.crd,updatedAt:t.upd,ctr:t.ctr??0,type:t.typ,eid:ot(t.eid),pid:t.pid?ot(t.pid):void 0,...t.tgs!==void 0?{tags:t.tgs}:{}}}function ws(t){if(Il(t))return Ge(t);return{eid:ot(t.eid),updatedAt:t.upd,ctr:t.ctr??0}}function gl(t,e){if(e instanceof Date)return IDBKeyRange.only([t,e]);let n=e.range;return IDBKeyRange.bound([t,n.start],[t,n.end],n.excludeStart===!0,n.excludeEnd===!0)}function Kl(t){if(typeof t==="string")return IDBKeyRange.only(t);if("range"in t){let e=t.range;return IDBKeyRange.bound(e.start,e.end,e.excludeStart===!0,e.excludeEnd===!0)}return IDBKeyRange.bound(t.prefix,t.prefix+"￿")}function xl(t,e,n){let s=[];if(typeof n==="string"){for(let r of t)if(r.typ===e)s.push(Ge(r));return s}let i=new Set,o="prefix"in n?n.prefix:void 0;for(let r of t){if(r.typ!==e)continue;if(i.has(r.eid))continue;if(o!==void 0){let l=r.tgs;if(!l||!l.some((c)=>c.startsWith(o)))continue}i.add(r.eid),s.push(Ge(r))}return s}class Bs{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=Hl().then((t)=>(t.onversionchange=()=>{if(t.close(),this.db===t)this.db=void 0},this.db=t,this.opening=void 0,t),(t)=>{throw this.opening=void 0,t}),this.opening}apply=async(t)=>{let e=new Set,n=[],s=performance.now();P("idb apply start",{ops:t.length});let i;try{i=await this.ensureDb()}catch{return{stats:t.map(()=>16),types:e,eids:n}}let o=i.transaction(q,"readwrite"),r=o.objectStore(q);return new Promise((l)=>{let c=Array(t.length).fill(0);if(t.length<1){l({stats:[],types:e,eids:n});return}o.oncomplete=()=>{P("idb apply complete",{ops:t.length,ms:Math.round(performance.now()-s)}),l({stats:c,types:e,eids:n})},o.onerror=()=>{for(let u=0;u<c.length;u++)if(c[u]===void 0)c[u]=18;l({stats:c,types:e,eids:n})};let d=new Map;for(let u=0;u<t.length;u++){let p=t[u],h=T(p.eid),y={op:p,index:u},b=d.get(h);if(b)b.push(y);else d.set(h,[y])}for(let[u,p]of d){if(p.length<1)continue;let h=r.get(u);h.onsuccess=()=>{let y=h.result,b=y?ws(y):void 0,Z=!1;for(let{op:X,index:I}of p){let[f,S]=ce(b,X);if(S!==0){c[I]=S;continue}if(f===void 0){c[I]=12;continue}Z=!0;for(let G of ae(b,f))e.add(G);b=f}if(Z)n.push(p[0].op.eid);if(b){let X=r.put(Wl(b));X.onerror=(I)=>{I.preventDefault();for(let{index:f}of p)c[f]=18}}},h.onerror=()=>{for(let{index:y}of p)c[y]=18}}})};async clear(){let t;try{t=await this.ensureDb()}catch{return 16}let e=t.transaction(q,"readwrite"),n=e.objectStore(q);return new Promise((s)=>{e.oncomplete=()=>s(0),e.onerror=()=>s(18),n.clear()})}async getRow(t){let e;try{e=await this.ensureDb()}catch{return a(16)}let n=T(t),i=e.transaction(q,"readonly").objectStore(q);return new Promise((o)=>{let r=i.get(n);r.onsuccess=()=>{let l=r.result;if(!l)o(m(void 0));else o(m(ws(l)))},r.onerror=()=>o(a(18))})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return a(n);if(e===void 0||!O(e))return m(void 0);return m(e)}async getByUpdatedAt(t,e){let[n,s]=Ce(e);if(s!==0)return a(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return a(16)}let r=i.transaction(q,"readonly").objectStore(q).index(Ps),l=gl(t,e);return new Promise((c)=>{let d=r.getAll(l);d.onsuccess=()=>{let u=d.result;c(m(u.map(Ge)))},d.onerror=()=>c(a(18))})}async getAllOfType(t){let e;try{e=await this.ensureDb()}catch{return a(16)}let s=e.transaction(q,"readonly").objectStore(q).index(Xn);return new Promise((i)=>{let o=s.getAll(IDBKeyRange.bound([t],[t,[]]));o.onsuccess=()=>{let r=o.result;i(m(r.map(Ge)))},o.onerror=()=>i(a(18))})}async getByTag(t,e){let[n,s]=Te(e);if(s!==0)return a(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return a(16)}let o=Kl(e),l=i.transaction(q,"readonly").objectStore(q).index(Xe);return new Promise((c)=>{let d=l.getAll(o);d.onsuccess=()=>{let u=d.result;c(m(xl(u,t,e)))},d.onerror=()=>c(a(18))})}async getAllEntities(t){if("pid"in t){let e;try{e=await this.ensureDb()}catch{return a(16)}let n=T(t.pid),i=e.transaction(q,"readonly").objectStore(q).index(Us);return new Promise((o)=>{let r=i.getAll(IDBKeyRange.only([t.type,n]));r.onsuccess=()=>{let c=r.result.map(Ge);o(m(c))},r.onerror=()=>o(a(18))})}else if("tag"in t)return await this.getByTag(t.type,t.tag);else if("updatedAt"in t)return await this.getByUpdatedAt(t.type,t.updatedAt);return await this.getAllOfType(t.type)}async getEntities(t){let e=performance.now(),[n,s]=await this.getAllEntities(t);if(P("idb getEntities",{type:t.type,n:n?.length??0,ms:Math.round(performance.now()-e)}),s!==0)return a(s);return m(n)}async countEntities({type:t}){let e;try{e=await this.ensureDb()}catch{return a(16)}let s=e.transaction(q,"readonly").objectStore(q).index(Xn);return new Promise((i)=>{let o=IDBKeyRange.bound([t],[t,[]]),r=s.count(o);r.onsuccess=()=>i(m(r.result)),r.onerror=()=>i(a(18))})}async checksum(t){let e;try{e=await this.ensureDb()}catch{return a(16)}let s=e.transaction(q,"readonly").objectStore(q),i=[];return new Promise((o)=>{let r=s.openCursor();r.onsuccess=()=>{let l=r.result;if(l){let c=l.value;i.push(Ye(ws(c))),l.continue()}else Re(i,t).then(o)},r.onerror=()=>o(a(18))})}}function Rl(t,e){if(!t.objectStoreNames.contains(q))t.createObjectStore(q,{keyPath:"eid",autoIncrement:!1});let n=e.objectStore(q);if(!n.indexNames.contains(Xn))n.createIndex(Xn,["typ","crd"],{unique:!1});if(!n.indexNames.contains(Ps))n.createIndex(Ps,["typ","upd"],{unique:!1});if(n.indexNames.contains(fo))n.deleteIndex(fo);if(!n.indexNames.contains(Us))n.createIndex(Us,["typ","pid"],{unique:!1});if(n.indexNames.contains(Xe)){if(n.index(Xe).keyPath!=="tgs")n.deleteIndex(Xe)}if(!n.indexNames.contains(Xe))n.createIndex(Xe,"tgs",{unique:!1,multiEntry:!0})}function Hl(){return new Promise((t,e)=>{let n=indexedDB.open(Vo,Io);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!i){e(Error("Transaction is null during EntDB upgrade"));return}try{Rl(s,i)}catch(o){e(o instanceof Error?o:Error(String(o)))}},n.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${Vo} → v${Io}); waiting for other connections to close`)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error??Error("EntDB IndexedDB open failed"))})}async function So(){let t=new Bs;return await t.init(),t}class Gn{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeTag=new Map;constructor(t=[],e){this.useIndex=e?.indexes!==!1;for(let n of t)this.put(n)}put(t){let e=T(t.eid),n=this.ents.get(e);if(n!==void 0&&O(n))this.unindex(e,n);if(this.ents.set(e,t),O(t))this.index(e,t)}del(t){let e=this.ents.get(t);if(e===void 0)return;if(O(e))this.unindex(t,e);this.ents.delete(t)}index(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(!n)n=new Map,this.byType.set(e.type,n);if(n.set(t,e),e.pid){let s=T(e.pid),i=this.byTypePid.get(e.type);if(!i)i=new Map,this.byTypePid.set(e.type,i);let o=i.get(s);if(!o)o=new Map,i.set(s,o);o.set(t,e)}if(e.tags){let s=this.byTypeTag.get(e.type);if(!s)s=new Map,this.byTypeTag.set(e.type,s);for(let i of e.tags){let o=s.get(i);if(!o)o=new Map,s.set(i,o);o.set(t,e)}}}unindex(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(n){if(n.delete(t),n.size===0)this.byType.delete(e.type)}if(e.pid){let s=T(e.pid),i=this.byTypePid.get(e.type),o=i?.get(s);if(o){if(o.delete(t),o.size===0)i?.delete(s)}if(i&&i.size===0)this.byTypePid.delete(e.type)}if(e.tags){let s=this.byTypeTag.get(e.type);if(s){for(let i of e.tags){let o=s.get(i);if(o){if(o.delete(t),o.size===0)s.delete(i)}}if(s.size===0)this.byTypeTag.delete(e.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeTag.clear()}bucketList(t){if(!t||t.size===0)return[];let e=[];for(let n of t.values())e.push(n);return e}byTagSpec(t,e){let[n,s]=Te(e);if(s!==0)return a(s);if(!n)return m([]);if(typeof e==="string")return m(this.bucketList(this.byTypeTag.get(t)?.get(e)));let i=this.byTypeTag.get(t);if(!i)return m([]);let o=new Set,r=[];for(let[l,c]of i){if(!ds(l,e))continue;for(let[d,u]of c){if(o.has(d))continue;o.add(d),r.push(u)}}return m(r)}byDateSpec(t,e){let[n,s]=Ce(e);if(s!==0)return a(s);if(!n)return m([]);let i=[],o=this.byType.get(t);if(o){for(let r of o.values())if(as(r.updatedAt,e))i.push(r)}return m(i)}async apply(t){let e=new Set,n=[],s=[];for(let i of t){let o=T(i.eid),r=this.ents.get(o),[l,c]=ce(r,i);if(c!==0){s.push(c);continue}if(l===void 0){s.push(12);continue}for(let d of ae(r,l))e.add(d);this.put(l),n.push(i.eid),s.push(0)}return{stats:s,types:e,eids:n}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow(t){let e=T(t),n=this.ents.get(e);return m(n)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return a(n);if(e===void 0||!O(e))return m(void 0);return m(e)}async getAllEntities(t){let{type:e}=t;if(this.useIndex){if("pid"in t){let s=T(t.pid);return m(this.bucketList(this.byTypePid.get(e)?.get(s)))}if("tag"in t)return this.byTagSpec(e,t.tag);if("updatedAt"in t)return this.byDateSpec(e,t.updatedAt);return m(this.bucketList(this.byType.get(e)))}let n=[];if("pid"in t){for(let s of this.ents.values())if(O(s)&&s.type===e&&s.pid&&F(s.pid,t.pid))n.push(s)}else if("tag"in t){let s=t.tag,[i,o]=Te(s);if(o!==0)return a(o);if(!i)return m(n);for(let r of this.ents.values())if(O(r)&&r.type===e&&r.tags&&r.tags.some((l)=>ds(l,s)))n.push(r)}else if("updatedAt"in t){let s=t.updatedAt,[i,o]=Ce(s);if(o!==0)return a(o);if(!i)return m(n);for(let r of this.ents.values())if(O(r)&&r.type===e&&as(r.updatedAt,s))n.push(r)}else for(let s of this.ents.values())if(O(s)&&s.type===e)n.push(s);return m(n)}async getEntities(t){let[e,n]=await this.getAllEntities(t);if(n!==0)return a(n);return m(e)}async countEntities({type:t}){if(this.useIndex)return m(this.byType.get(t)?.size??0);let e=0;for(let n of this.ents.values())if(O(n)&&n.type===t)e+=1;return m(e)}async checksum(t){let e=[];for(let n of this.ents.values())e.push(Ye(n));return Re(e,t)}}function Cl(t){let e=globalThis.requestAnimationFrame;if(typeof e!=="function"){queueMicrotask(t);return}e(()=>{e(t)})}async function zs(t){if(t?.verbose!==void 0)ln(t.verbose);let e=await So();if(t?.cache===!1)return e;return new Ns(e,void 0,{indexes:t?.indexes,optimistic:t?.optimistic})}class Ns{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();optimistic;inflight=0;warmP=new Map;constructor(t,e,n){if(this.durable=t,this.optimistic=n?.optimistic!==!1,P("CachedEntDB open",{optimistic:this.optimistic}),this.mem=new Gn(e??[],{indexes:n?.indexes}),e)for(let s of e)this.warmed.add(s.type)}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}emit(t){if(t.size<1)return;let e=performance.now();P("emit start",{types:[...t],listeners:this.listeners.size});for(let n of this.listeners)n(t);P("emit done",{ms:Math.round(performance.now()-e)})}run(t){let e=this.chain.then(t,t);return this.chain=e.then(()=>{return},()=>{return}),e}apply(t){let e,n;if(this.optimistic){n=wl(this.mem,t).types,e=new Map;for(let i of t){let o=T(i.eid);e.set(o,Wo(this.mem.ents.get(o)))}this.inflight+=1,P("apply mem patched",{ops:t.length,types:n?[...n]:[],inflight:this.inflight})}let s=this.run(async()=>{P("persist start",{ops:t.length});try{let i=performance.now(),o=await this.durable.apply(t);if(P("persist durable.apply done",{ms:Math.round(performance.now()-i)}),!this.optimistic){let{changed:l,status:c}=await this.pullEids(t.map((d)=>d.eid));if(this.emit(l),c!==0)return{stats:t.map(()=>c),types:o.types,eids:o.eids};return o}let r=[];for(let l=0;l<t.length;l++)if(o.stats[l]!==0)r.push(t[l].eid);if(r.length>0){P("persist pull rejected eids",{n:r.length});let{changed:l,status:c}=await this.pullEids(r,e);if(this.emit(l),c!==0)return{stats:t.map(()=>c),types:o.types,eids:o.eids}}return P("persist done"),o}finally{if(this.optimistic)this.inflight-=1}});if(n)Cl(()=>{P("emit after paint"),this.emit(n)});return s}clear(){return this.run(async()=>{let t=await this.durable.clear();if(t!==0)return t;let e=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable(t){let e=[...t].length;return P("ingest queued",{eids:e}),this.run(async()=>{let n=performance.now();P("ingest start",{eids:e});let{changed:s,status:i}=await this.pullEids(t);return P("ingest done",{ms:Math.round(performance.now()-n),changed:[...s]}),this.emit(s),i})}async pullEids(t,e){let n=new Set,s=new Set;for(let i of t){let o=T(i);if(s.has(o))continue;s.add(o);let[r,l]=await this.durable.getRow(i);if(l!==0)return{changed:n,status:l};let c=this.mem.ents.get(o);if(c!==void 0&&r!==void 0&&Js(c,r))continue;if(e){if(!Ml(Wo(c),e.get(o)))continue}if(r){if(this.mem.put(r),!c||!Tl(c,r)){if(O(r))n.add(r.type);if(c!==void 0&&O(c))n.add(c.type)}}else if(c!==void 0){if(this.mem.del(o),O(c))n.add(c.type)}}return{changed:n,status:0}}async warmType(t){if(this.warmed.has(t))return 0;let e=performance.now();P("warmType start",{type:t});let[n,s]=await this.durable.getEntities({type:t});if(s!==0)return s;if(n)for(let i of n){let o=T(i.eid),r=this.mem.ents.get(o);if(!r||Js(i,r))this.mem.put(i)}return this.warmed.add(t),P("warmType done",{type:t,n:n?.length??0,ms:Math.round(performance.now()-e)}),0}beginWarm(t){if(this.warmed.has(t))return Promise.resolve(0);let e=this.warmP.get(t);if(e)return e;let n=this.warmType(t).finally(()=>{this.warmP.delete(t)});return this.warmP.set(t,n),n}ensureWarm(t){if(this.warmed.has(t))return;this.beginWarm(t).then((e)=>{if(e===0)this.emit(new Set([t]))})}async getRow(t){let e=T(t);if(this.mem.ents.has(e))return this.mem.getRow(t);let[n,s]=await this.durable.getRow(t);if(s!==0)return a(s);if(n){let i=this.mem.ents.get(e);if(!i||Js(n,i))this.mem.put(n)}return this.mem.getRow(t)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return a(n);if(e===void 0||!O(e))return m(void 0);return m(e)}async getEntities(t){if(this.warmed.has(t.type))return P("getEntities mem",{type:t.type}),this.mem.getEntities(t);if(this.inflight>0)return P("getEntities inflight-mem",{type:t.type}),this.ensureWarm(t.type),this.mem.getEntities(t);P("getEntities beginWarm",{type:t.type});let e=await this.beginWarm(t.type);if(e!==0)return a(e);return P("getEntities afterWarm",{type:t.type}),this.mem.getEntities(t)}async countEntities({type:t}){if(this.warmed.has(t))return this.mem.countEntities({type:t});if(this.inflight>0)return this.ensureWarm(t),this.mem.countEntities({type:t});let e=await this.beginWarm(t);if(e!==0)return a(e);return this.mem.countEntities({type:t})}async checksum(t){return this.durable.checksum(t)}}function Tl(t,e){if(O(t)!==O(e))return!1;if(t.ctr!==e.ctr)return!1;if(t.updatedAt.getTime()!==e.updatedAt.getTime())return!1;if(!F(t.eid,e.eid))return!1;if(!O(t)||!O(e))return!0;if(t.createdAt.getTime()!==e.createdAt.getTime())return!1;if(t.type!==e.type)return!1;if(!kl(t.pid,e.pid))return!1;if(!Yl(t.tags,e.tags))return!1;return Ll(t.body,e.body)}function Yl(t,e){if(t===e)return!0;if(t===void 0||e===void 0)return!1;if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function kl(t,e){if(t===void 0&&e===void 0)return!0;if(t===void 0||e===void 0)return!1;return F(t,e)}function Ll(t,e){if(Object.is(t,e))return!0;if(t instanceof Uint8Array&&e instanceof Uint8Array)return F(t,e);if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();try{return F(Ft(t),Ft(e))}catch{return!1}}function Js(t,e){let n=t.updatedAt.getTime(),s=e.updatedAt.getTime();if(n!==s)return n>s;return t.ctr>e.ctr}function Wo(t){if(t===void 0)return;return{t:t.updatedAt.getTime(),ctr:t.ctr}}function Ml(t,e){if(t===void 0||e===void 0)return t===e;return t.t===e.t&&t.ctr===e.ctr}function wl(t,e){let n=new Set,s=[];for(let i of e){let o=T(i.eid),r=t.ents.get(o),[l,c]=ce(r,i);if(c!==0){s.push(c);continue}if(l===void 0){s.push(12);continue}for(let d of ae(r,l))n.add(d);t.put(l),s.push(0)}return{stats:s,types:n}}import{useEffect as En,useState as ci}from"react";class Es{db;constructor(t){this.db=t}async enq(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(bt,"readwrite"),s=n.objectStore(bt);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=`${r.host}:${r.seq}`;s.put(r,l)}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(bt,"readwrite"),i=s.objectStore(bt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let c=`${t}:${l}`;i.delete(c)}})}async list(){let e=this.db.transaction(bt,"readonly").objectStore(bt);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async count(){let e=this.db.transaction(bt,"readonly").objectStore(bt);return new Promise((n,s)=>{let i=e.count();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(bt,"readwrite"),e=t.objectStore(bt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}function go(t){return{label:t.label,handle:new URL(t.handle),idx:t.idx,lastSeq:t.lastSeq||0,clockOffset:t.clockOffset,subscription:t.subscription}}function Pl(t,e){let n={...t};if(e.setLastSeq!==void 0)n.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0){let s=n.lastSeq||0;if(e.lastSeq>s)n.lastSeq=e.lastSeq}return delete n.numBags,delete n.numDupes,n}class Fs{db;constructor(t){this.db=t}async add(t){let e=await this.get(t.label),n=e!==void 0&&e.handle.href===t.handle.href&&(e.idx??0)===(t.idx??0);return this.put({...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0})}async put(t){let e={...t,handle:t.handle.toString(),lastSeq:t.lastSeq??0},n=this.db.transaction(ct,"readwrite"),s=n.objectStore(ct);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error),s.put(e)})}async touch(t,e){return this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.db.transaction(ct,"readwrite"),s=n.objectStore(ct);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);let r=s.get(t);r.onsuccess=()=>{let l=r.result;if(!l)return;s.put(Pl(l,e))}})}async get(t){let n=this.db.transaction(ct,"readonly").objectStore(ct);return new Promise((s,i)=>{let o=n.get(t);o.onsuccess=()=>{let r=o.result;if(!r)s(void 0);else s(go(r))},o.onerror=()=>i(o.error)})}async set(t,e){let n=await this.get(t);if(!n)return 13;try{return await this.put({...n,...e}),0}catch{return 18}}async del(t){let e=this.db.transaction(ct,"readwrite"),n=e.objectStore(ct);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}async list(){let e=this.db.transaction(ct,"readonly").objectStore(ct);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>{let o=i.result;n(o.map(go))},i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(ct,"readwrite"),e=t.objectStore(ct);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}class Qs{crypto;db;constructor(t,e){this.crypto=e;this.db=t}async add(t){let e=this.db.transaction(A,"readwrite"),n=e.objectStore(A);return new Promise((s)=>{if(t.length===0){s([]);return}let i=Array(t.length).fill(0);e.oncomplete=()=>s(i),e.onerror=()=>{for(let o=0;o<i.length;o++)i[o]=18;s(i)};for(let o=0;o<t.length;o++){let{key:r,data:l}=t[o],c=T(r),d=n.put(l,c);d.onerror=(u)=>{u.preventDefault(),i[o]=18}}})}async del(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(A,"readwrite"),s=n.objectStore(A);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=T(r);s.delete(l)}})}async get(t){let n=this.db.transaction(A,"readonly").objectStore(A);return new Promise((s,i)=>{let o=T(t),r=n.get(o);r.onsuccess=async()=>{let l=r.result;if(l)s(await zt(t,l,this.crypto));else s(void 0)},r.onerror=()=>i(r.error)})}async has(t){return await this.get(t)!==void 0}async list(t){let e=t?.apld,n=t?.body!==!1,i=this.db.transaction(A,"readonly").objectStore(A);return new Promise((o,r)=>{let l=[],c=e===void 0?i.openCursor():i.index(Ue).openCursor(IDBKeyRange.only(e));c.onsuccess=(d)=>{let u=d.target.result;if(u){let p=e===void 0?u.key:u.primaryKey,h=u.value;l.push({hash:ot(p),data:h}),u.continue()}else Promise.all(l.map(({hash:p,data:h})=>zt(p,h,this.crypto,{body:n}))).then(o).catch(r)},c.onerror=()=>r(c.error)})}async count(t){let n=this.db.transaction(A,"readonly").objectStore(A);return new Promise((s,i)=>{let o=t===void 0?n.count():n.index(Ue).count(IDBKeyRange.only(t));o.onsuccess=()=>s(o.result),o.onerror=()=>i(o.error)})}async listKeys(){let e=this.db.transaction(A,"readonly").objectStore(A);return new Promise((n,s)=>{let i=[],o=e.openKeyCursor();o.onsuccess=(r)=>{let l=r.target.result;if(l)i.push(ot(l.key)),l.continue();else n(i)},o.onerror=()=>s(o.error)})}async last(t){let n=this.db.transaction(A,"readonly").objectStore(A);return new Promise((s,i)=>{let o,r=n.openCursor();r.onsuccess=async(l)=>{let c=l.target.result;if(c){let{key:d,value:u}=c;if(F(t,u.eid)){if(!o||(u.ctr??0)>(o.data.ctr??0)||(u.ctr??0)===(o.data.ctr??0)&&(u.off??0)>(o.data.off??0))o={key:d,data:u}}c.continue()}else if(o){let d=ot(o.key);s(await zt(d,o.data,this.crypto))}else s(void 0)},r.onerror=()=>i(r.error)})}async markApplied(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(A,"readwrite"),s=n.objectStore(A);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=T(r),c=s.get(l);c.onsuccess=()=>{let d=c.result;if(!d)return;vt(d,Jt),s.put(d,l)},c.onerror=(d)=>{d.preventDefault()}}})}async markFailed(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(A,"readwrite"),s=n.objectStore(A);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let{key:r,err:l}of e){let c=T(r),d=s.get(c);d.onsuccess=()=>{let u=d.result;if(!u)return;vt(u,It,l),s.put(u,c)},d.onerror=(u)=>{u.preventDefault()}}})}async wipe(){let t=this.db.transaction(A,"readwrite"),e=t.objectStore(A);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var fn={encode(t,e){let n=t.writeVarString(e.handle);if(n!==0)return n;let s=t.writeVarString(e.label);if(s!==0)return s;return t.writeVarInt(e.idx??0)},decode(t){let[e,n]=t.readVarString();if(n!==0)return a(n);let[s,i]=t.readVarString();if(i!==0)return a(i);let[o,r]=t.readVarInt();if(r!==0)return a(r);return m({handle:e,label:s,idx:o})}};var vs={encode(t,e){let n=t.writeVarInt(e.hosts.length);if(n!==0)return n;for(let s of e.hosts){let i=t.writeStruct(fn,s);if(i!==0)return i}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return a(n);if(e===void 0||e<0)return a(10);let s=[];for(let i=0;i<e;i++){let[o,r]=t.readStruct(fn);if(r!==0)return a(r);if(o===void 0)return a(14);s.push(o)}return m({hosts:s})}};var Ul=new TextEncoder().encode("diplomatic.qrpair.v1"),fe=32,Bl=fe+24+16,Jl=32,Ab=Symbol("DHKEReq"),qb=Symbol("DHKEResp");function Vn(t){if(t.byteLength!==fe)return a(10);return m(t)}function Ds(t){if(t.byteLength<Bl)return a(10);return m(t)}var Ko=new jt;async function Os(t,e,n,s){let i;try{i=await Ko.x25519Shared(t,e)}catch{return a(29)}try{if(i.byteLength!==fe||i.every((l)=>l===0))return a(10);let o=Vt(i,Ul),r=Vt(o,Vt(n,s));try{let l=await Ko.blake3(r);return m(l.slice(0,Jl))}finally{o.fill(0),r.fill(0)}}finally{i.fill(0)}}function Yt(t){let e=new Uint8Array(t);if(t>0)crypto.getRandomValues(e);return e}var At=32,In="DIPLOMATIC",gt="public-key",zl=-7,Nl=-8,El=-257,Sn=[{type:gt,alg:zl},{type:gt,alg:Nl},{type:gt,alg:El}];function Ho(t){return t.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function Nt(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function Wn(t){if(t instanceof ArrayBuffer)return new Uint8Array(t).slice();return new Uint8Array(t.buffer,t.byteOffset,t.byteLength).slice()}function qt(t){if(t?.rpId!==void 0)return m(t.rpId);if(typeof location>"u")return a(9);return m(Ho(location.hostname))}var As="";function Fl(){return As}function Et(t){if(t instanceof Error){As=t.message===""?t.name:`${t.name}: ${t.message}`;return}As=String(t)}function gn(t){if(!(t instanceof Error))return!1;return t.name==="NotAllowedError"&&t.message.toLowerCase().includes("does not have focus")}function xo(){if(typeof document>"u")return!0;return document.visibilityState!=="hidden"}function Ve(){if(typeof globalThis.focus!=="function")return;try{globalThis.focus()}catch{}}function Kn(t=2500){if(xo())return Ve(),Promise.resolve();return new Promise((e)=>{let n=()=>{clearTimeout(i),document.removeEventListener("visibilitychange",s),Ve(),e()},s=()=>{if(xo())n()},i=setTimeout(n,t);document.addEventListener("visibilitychange",s),s()})}async function xn(t){await Kn();try{return await navigator.credentials.create(t)}catch(e){if(!gn(e))throw e;return Ve(),await navigator.credentials.create(t)}}async function Rn(t){await Kn();try{return await navigator.credentials.get(t)}catch(e){if(!gn(e))throw e;return Ve(),await navigator.credentials.get(t)}}function _t(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function $t(t){if(t===null||t.type!==gt||!("rawId"in t)||typeof t.getClientExtensionResults!=="function")return a(27);return m(t)}async function Hn(t){if(typeof PublicKeyCredential>"u")return!1;let e=PublicKeyCredential.getClientCapabilities;if(typeof e!=="function")return!0;let n=await e.call(PublicKeyCredential);if(t in n)return n[t]===!0;return!0}function qs(t){if(t==="platform"||t==="cross-platform")return t;return}function Co(t){if(/iPhone|iPad|iPod/i.test(t))return"ios";if(/Android/i.test(t))return"android";if(/Mac OS X|Macintosh/i.test(t))return"macos";if(/Windows/i.test(t))return"windows";if(/Linux/i.test(t))return"linux";return"other"}function _s(t){let e=t.response;if(!("getTransports"in e))return;let n=e.getTransports;if(typeof n!=="function")return;let s=n.call(e);if(!Array.isArray(s))return;let i=[];for(let o of s)if(typeof o==="string"&&o.length>0)i.push(o);return i.length===0?void 0:i}var Ql=32,vl=64,js=37,Ro=16;function To(t){let e=t.response;if(!("getAuthenticatorData"in e))return;let n=e.getAuthenticatorData;if(typeof n!=="function")return;let s=n.call(e);if(!(s instanceof ArrayBuffer))return;let i=new Uint8Array(s);if(i.byteLength<js+Ro)return;let o=i[Ql];if(o===void 0||(o&vl)===0)return;return i.slice(js,js+Ro)}function Dl(){return Hn("extension:largeBlob")}async function Yo(t){let e=_t();if(e!==0)return a(e);let[n,s]=qt(t);if(s!==0)return a(s);if(n===void 0)return a(9);let i=t?.userName??t?.rpName??n,o={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(t?.authenticatorAttachment!==void 0)o.authenticatorAttachment=t.authenticatorAttachment;let r={largeBlob:{support:"required"}},l;try{l=await xn({publicKey:{challenge:Yt(At),rp:{id:n,name:t?.rpName??In},user:{id:Yt(16),name:i,displayName:i},pubKeyCredParams:Sn,authenticatorSelection:o,extensions:r,...t?.hints!==void 0?{hints:t.hints}:{}}})}catch(p){return Et(p),a(30)}let[c,d]=$t(l);if(d!==0)return a(d);if(c===void 0)return a(27);if(c.getClientExtensionResults().largeBlob?.supported!==!0)return a(30);return m(new Uint8Array(c.rawId))}async function $s(t,e,n,s){let i={challenge:Yt(At),rpId:t,userVerification:"preferred"};if(e?.hints!==void 0)i.hints=e.hints;if(n!==void 0)i.allowCredentials=[{type:gt,id:Nt(n)}];if(s!==void 0)i.extensions=s;let o;try{o=await Rn({publicKey:i})}catch(c){return Et(c),a(30)}let[r,l]=$t(o);if(l!==0)return a(l);if(r===void 0)return a(27);return m(r)}async function ko(t,e){let n=_t();if(n!==0)return a(n);let[s,i]=qt(e);if(i!==0)return a(i);if(s===void 0)return a(9);let o=t;if(o===void 0){let[p,h]=await $s(s,e);if(h!==0&&e?.hints!==void 0)[p,h]=await $s(s,{rpId:e.rpId,rpName:e.rpName});if(h!==0)return a(h);if(p===void 0)return a(27);o=new Uint8Array(p.rawId)}let[r,l]=await $s(s,e,o,{largeBlob:{read:!0}});if(l!==0)return a(l);if(r===void 0)return a(27);let d=r.getClientExtensionResults().largeBlob;if(d===void 0||d.blob===void 0)return a(7);let u=Wn(d.blob);if(u.byteLength===0)return a(7);return m({blob:u,credId:new Uint8Array(r.rawId)})}var Cn=new TextEncoder().encode("diplomatic.prf.v1"),Be="diplomatic-prf";async function Ol(){return Hn("extension:prf")}var Tn="dmFyIENlPTY0O3ZhciBPbj0zMixUZT04O3ZhciBCdD0zMjt2YXIgS249MzAwMDAsVm49NTEyLEI7KChJKT0+e0lbSS5TdWNjZXNzPTBdPSJTdWNjZXNzIjtJW0kuSW52YWxpZFNpZ25hdHVyZT0zXT0iSW52YWxpZFNpZ25hdHVyZSI7SVtJLkNsb2NrT3V0T2ZTeW5jPTRdPSJDbG9ja091dE9mU3luYyI7SVtJLlVzZXJOb3RSZWdpc3RlcmVkPTVdPSJVc2VyTm90UmVnaXN0ZXJlZCI7SVtJLlNlcnZlck1pc2NvbmZpZ3VyZWQ9Nl09IlNlcnZlck1pc2NvbmZpZ3VyZWQiO0lbSS5NaXNzaW5nQm9keT03XT0iTWlzc2luZ0JvZHkiO0lbSS5FeHRyYUJvZHlDb250ZW50PThdPSJFeHRyYUJvZHlDb250ZW50IjtJW0kuTWlzc2luZ1BhcmFtPTldPSJNaXNzaW5nUGFyYW0iO0lbSS5JbnZhbGlkUGFyYW09MTBdPSJJbnZhbGlkUGFyYW0iO0lbSS5JbnZhbGlkUmVxdWVzdD0xMV09IkludmFsaWRSZXF1ZXN0IjtJW0kuSW50ZXJuYWxFcnJvcj0xMl09IkludGVybmFsRXJyb3IiO0lbSS5Ob3RGb3VuZD0xM109Ik5vdEZvdW5kIjtJW0kuSW52YWxpZE1lc3NhZ2U9MTRdPSJJbnZhbGlkTWVzc2FnZSI7SVtJLk5vQ2hhbmdlPTE1XT0iTm9DaGFuZ2UiO0lbSS5EYXRhYmFzZUNsb3NlZD0xNl09IkRhdGFiYXNlQ2xvc2VkIjtJW0kuU3RvcmFnZUVycm9yPTE3XT0iU3RvcmFnZUVycm9yIjtJW0kuRGF0YWJhc2VFcnJvcj0xOF09IkRhdGFiYXNlRXJyb3IiO0lbSS5IYXNoTWlzbWF0Y2g9MTldPSJIYXNoTWlzbWF0Y2giO0lbSS5EZWNyeXB0aW9uRXJyb3I9MjBdPSJEZWNyeXB0aW9uRXJyb3IiO0lbSS5Ob3RJbXBsZW1lbnRlZD0yMV09Ik5vdEltcGxlbWVudGVkIjtJW0kuTWlzc2luZ1NlZWQ9MjJdPSJNaXNzaW5nU2VlZCI7SVtJLk91dE9mQm91bmRzPTIzXT0iT3V0T2ZCb3VuZHMiO0lbSS5Ib3N0RXJyb3I9MjRdPSJIb3N0RXJyb3IiO0lbSS5Db21tdW5pY2F0aW9uRXJyb3I9MjVdPSJDb21tdW5pY2F0aW9uRXJyb3IiO0lbSS5WYXJMaW1pdEV4Y2VlZGVkPTI2XT0iVmFyTGltaXRFeGNlZWRlZCI7SVtJLkludmFsaWRSZXNwb25zZT0yN109IkludmFsaWRSZXNwb25zZSI7SVtJLkNvbm5lY3Rpb25DbG9zZWQ9MjhdPSJDb25uZWN0aW9uQ2xvc2VkIjtJW0kuQ3J5cHRvRXJyb3I9MjldPSJDcnlwdG9FcnJvciI7SVtJLldlYkF1dGhuRXJyb3I9MzBdPSJXZWJBdXRobkVycm9yIn0pKEJ8fD17fSk7ZnVuY3Rpb24gX24oZSl7aWYoIWV8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoISgib3AiaW4gZSl8fCEoImlkImluIGUpKXJldHVybiExO3JldHVybiB0eXBlb2YgZS5vcD09PSJzdHJpbmciJiZ0eXBlb2YgZS5pZD09PSJudW1iZXIifWZ1bmN0aW9uIE5uKGUpe2xldCB0PWUubGVuZ3RoLHI9MCxuPTA7d2hpbGUobjx0KXtsZXQgcz1lLmNoYXJDb2RlQXQobisrKTtpZigocyY0Mjk0OTY3MTY4KT09PTApe3IrKztjb250aW51ZX1lbHNlIGlmKChzJjQyOTQ5NjUyNDgpPT09MClyKz0yO2Vsc2V7aWYocz49NTUyOTYmJnM8PTU2MzE5KXtpZihuPHQpe2xldCBpPWUuY2hhckNvZGVBdChuKTtpZigoaSY2NDUxMik9PT01NjMyMCkrK24scz0oKHMmMTAyMyk8PDEwKSsoaSYxMDIzKSs2NTUzNn19aWYoKHMmNDI5NDkwMTc2MCk9PT0wKXIrPTM7ZWxzZSByKz00fX1yZXR1cm4gcn1mdW5jdGlvbiBMaShlLHQscil7bGV0IG49ZS5sZW5ndGgscz1yLGk9MDt3aGlsZShpPG4pe2xldCBvPWUuY2hhckNvZGVBdChpKyspO2lmKChvJjQyOTQ5NjcxNjgpPT09MCl7dFtzKytdPW87Y29udGludWV9ZWxzZSBpZigobyY0Mjk0OTY1MjQ4KT09PTApdFtzKytdPW8+PjYmMzF8MTkyO2Vsc2V7aWYobz49NTUyOTYmJm88PTU2MzE5KXtpZihpPG4pe2xldCBhPWUuY2hhckNvZGVBdChpKTtpZigoYSY2NDUxMik9PT01NjMyMCkrK2ksbz0oKG8mMTAyMyk8PDEwKSsoYSYxMDIzKSs2NTUzNn19aWYoKG8mNDI5NDkwMTc2MCk9PT0wKXRbcysrXT1vPj4xMiYxNXwyMjQsdFtzKytdPW8+PjYmNjN8MTI4O2Vsc2UgdFtzKytdPW8+PjE4Jjd8MjQwLHRbcysrXT1vPj4xMiY2M3wxMjgsdFtzKytdPW8+PjYmNjN8MTI4fXRbcysrXT1vJjYzfDEyOH19dmFyIE9pPW5ldyBUZXh0RW5jb2RlcixLaT01MDtmdW5jdGlvbiBWaShlLHQscil7T2kuZW5jb2RlSW50byhlLHQuc3ViYXJyYXkocikpfWZ1bmN0aW9uIHFuKGUsdCxyKXtpZihlLmxlbmd0aD5LaSlWaShlLHQscik7ZWxzZSBMaShlLHQscil9dmFyIF9pPTQwOTY7ZnVuY3Rpb24gYnIoZSx0LHIpe2xldCBuPXQscz1uK3IsaT1bXSxvPSIiO3doaWxlKG48cyl7bGV0IGE9ZVtuKytdO2lmKChhJjEyOCk9PT0wKWkucHVzaChhKTtlbHNlIGlmKChhJjIyNCk9PT0xOTIpe2xldCBjPWVbbisrXSY2MztpLnB1c2goKGEmMzEpPDw2fGMpfWVsc2UgaWYoKGEmMjQwKT09PTIyNCl7bGV0IGM9ZVtuKytdJjYzLHU9ZVtuKytdJjYzO2kucHVzaCgoYSYzMSk8PDEyfGM8PDZ8dSl9ZWxzZSBpZigoYSYyNDgpPT09MjQwKXtsZXQgYz1lW24rK10mNjMsdT1lW24rK10mNjMsbD1lW24rK10mNjMsZj0oYSY3KTw8MTh8Yzw8MTJ8dTw8NnxsO2lmKGY+NjU1MzUpZi09NjU1MzYsaS5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfGYmMTAyMztpLnB1c2goZil9ZWxzZSBpLnB1c2goYSk7aWYoaS5sZW5ndGg+PV9pKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSksaS5sZW5ndGg9MH1pZihpLmxlbmd0aD4wKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSk7cmV0dXJuIG99dmFyIE5pPW5ldyBUZXh0RGVjb2RlcixxaT0yMDA7ZnVuY3Rpb24gRmkoZSx0LHIpe2xldCBuPWUuc3ViYXJyYXkodCx0K3IpO3JldHVybiBOaS5kZWNvZGUobil9ZnVuY3Rpb24gRm4oZSx0LHIpe2lmKHI+cWkpcmV0dXJuIEZpKGUsdCxyKTtlbHNlIHJldHVybiBicihlLHQscil9Y2xhc3MgUWV7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHNlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9T2JqZWN0LmNyZWF0ZShzZS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6c2UubmFtZX0pfX12YXIgWWU9NDI5NDk2NzI5NTtmdW5jdGlvbiBXbihlLHQscil7bGV0IG49ci80Mjk0OTY3Mjk2LHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiB2dChlLHQscil7bGV0IG49TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBEdChlLHQpe2xldCByPWUuZ2V0SW50MzIodCksbj1lLmdldFVpbnQzMih0KzQpO3JldHVybiByKjQyOTQ5NjcyOTYrbn1mdW5jdGlvbiB6bihlLHQpe2xldCByPWUuZ2V0VWludDMyKHQpLG49ZS5nZXRVaW50MzIodCs0KTtyZXR1cm4gcio0Mjk0OTY3Mjk2K259dmFyIFdpPS0xLHppPTQyOTQ5NjcyOTUsWGk9MTcxNzk4NjkxODM7ZnVuY3Rpb24gamkoe3NlYzplLG5zZWM6dH0pe2lmKGU+PTAmJnQ+PTAmJmU8PVhpKWlmKHQ9PT0wJiZlPD16aSl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhyLmJ1ZmZlcikuc2V0VWludDMyKDAsZSkscn1lbHNle2xldCByPWUvNDI5NDk2NzI5NixuPWUmNDI5NDk2NzI5NSxzPW5ldyBVaW50OEFycmF5KDgpLGk9bmV3IERhdGFWaWV3KHMuYnVmZmVyKTtyZXR1cm4gaS5zZXRVaW50MzIoMCx0PDwyfHImMyksaS5zZXRVaW50MzIoNCxuKSxzfWVsc2V7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoMTIpLG49bmV3IERhdGFWaWV3KHIuYnVmZmVyKTtyZXR1cm4gbi5zZXRVaW50MzIoMCx0KSx2dChuLDQsZSkscn19ZnVuY3Rpb24gJGkoZSl7bGV0IHQ9ZS5nZXRUaW1lKCkscj1NYXRoLmZsb29yKHQvMTAwMCksbj0odC1yKjEwMDApKjFlNixzPU1hdGguZmxvb3Iobi8xZTkpO3JldHVybntzZWM6citzLG5zZWM6bi1zKjFlOX19ZnVuY3Rpb24gR2koZSl7aWYoZSBpbnN0YW5jZW9mIERhdGUpe2xldCB0PSRpKGUpO3JldHVybiBqaSh0KX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIFFpKGUpe2xldCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6e2xldCByPXQuZ2V0VWludDMyKDApLG49MDtyZXR1cm57c2VjOnIsbnNlYzowfX1jYXNlIDg6e2xldCByPXQuZ2V0VWludDMyKDApLG49dC5nZXRVaW50MzIoNCkscz0ociYzKSo0Mjk0OTY3Mjk2K24saT1yPj4+MjtyZXR1cm57c2VjOnMsbnNlYzppfX1jYXNlIDEyOntsZXQgcj1EdCh0LDQpLG49dC5nZXRVaW50MzIoMCk7cmV0dXJue3NlYzpyLG5zZWM6bn19ZGVmYXVsdDp0aHJvdyBuZXcgc2UoYFVucmVjb2duaXplZCBkYXRhIHNpemUgZm9yIHRpbWVzdGFtcCAoZXhwZWN0ZWQgNCwgOCwgb3IgMTIpOiAke2UubGVuZ3RofWApfX1mdW5jdGlvbiBZaShlKXtsZXQgdD1RaShlKTtyZXR1cm4gbmV3IERhdGUodC5zZWMqMTAwMCt0Lm5zZWMvMWU2KX12YXIgWG49e3R5cGU6V2ksZW5jb2RlOkdpLGRlY29kZTpZaX07Y2xhc3MgSmV7c3RhdGljIGRlZmF1bHRDb2RlYz1uZXcgSmU7X19icmFuZDtidWlsdEluRW5jb2RlcnM9W107YnVpbHRJbkRlY29kZXJzPVtdO2VuY29kZXJzPVtdO2RlY29kZXJzPVtdO2NvbnN0cnVjdG9yKCl7dGhpcy5yZWdpc3RlcihYbil9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6cn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09cjtlbHNle2xldCBuPS0xLWU7dGhpcy5idWlsdEluRW5jb2RlcnNbbl09dCx0aGlzLmJ1aWx0SW5EZWNvZGVyc1tuXT1yfX10cnlUb0VuY29kZShlLHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5idWlsdEluRW5jb2RlcnMubGVuZ3RoO3IrKyl7bGV0IG49dGhpcy5idWlsdEluRW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpe2xldCBpPS0xLXI7cmV0dXJuIG5ldyBRZShpLHMpfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2xldCBuPXRoaXMuZW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpcmV0dXJuIG5ldyBRZShyLHMpfX1pZihlIGluc3RhbmNlb2YgUWUpcmV0dXJuIGU7cmV0dXJuIG51bGx9ZGVjb2RlKGUsdCxyKXtsZXQgbj10PDA/dGhpcy5idWlsdEluRGVjb2RlcnNbLTEtdF06dGhpcy5kZWNvZGVyc1t0XTtpZihuKXJldHVybiBuKGUsdCxyKTtlbHNlIHJldHVybiBuZXcgUWUodCxlKX19ZnVuY3Rpb24gSmkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyfWZ1bmN0aW9uIGx0KGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtlbHNlIGlmKEppKGUpKXJldHVybiBuZXcgVWludDhBcnJheShlKTtlbHNlIHJldHVybiBVaW50OEFycmF5LmZyb20oZSl9dmFyIFppPTEwMCxlbz0yMDQ4O2NsYXNzIEN0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7bWF4RGVwdGg7aW5pdGlhbEJ1ZmZlclNpemU7c29ydEtleXM7Zm9yY2VGbG9hdDMyO2lnbm9yZVVuZGVmaW5lZDtmb3JjZUludGVnZXJUb0Zsb2F0O3Bvczt2aWV3O2J5dGVzO2VudGVyZWQ9ITE7Y29uc3RydWN0b3IoZSl7dGhpcy5leHRlbnNpb25Db2RlYz1lPy5leHRlbnNpb25Db2RlYz8/SmUuZGVmYXVsdENvZGVjLHRoaXMuY29udGV4dD1lPy5jb250ZXh0LHRoaXMudXNlQmlnSW50NjQ9ZT8udXNlQmlnSW50NjQ/PyExLHRoaXMubWF4RGVwdGg9ZT8ubWF4RGVwdGg/P1ppLHRoaXMuaW5pdGlhbEJ1ZmZlclNpemU9ZT8uaW5pdGlhbEJ1ZmZlclNpemU/P2VvLHRoaXMuc29ydEtleXM9ZT8uc29ydEtleXM/PyExLHRoaXMuZm9yY2VGbG9hdDMyPWU/LmZvcmNlRmxvYXQzMj8/ITEsdGhpcy5pZ25vcmVVbmRlZmluZWQ9ZT8uaWdub3JlVW5kZWZpbmVkPz8hMSx0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQ9ZT8uZm9yY2VJbnRlZ2VyVG9GbG9hdD8/ITEsdGhpcy5wb3M9MCx0aGlzLnZpZXc9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmluaXRpYWxCdWZmZXJTaXplKSksdGhpcy5ieXRlcz1uZXcgVWludDhBcnJheSh0aGlzLnZpZXcuYnVmZmVyKX1jbG9uZSgpe3JldHVybiBuZXcgQ3Qoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGVTaGFyZWRSZWYoZSk7dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnN1YmFycmF5KDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1lbmNvZGUoZSl7aWYodGhpcy5lbnRlcmVkKXJldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlKGUpO3RyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zbGljZSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9FbmNvZGUoZSx0KXtpZih0PnRoaXMubWF4RGVwdGgpdGhyb3cgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO2lmKGU9PW51bGwpdGhpcy5lbmNvZGVOaWwoKTtlbHNlIGlmKHR5cGVvZiBlPT09ImJvb2xlYW4iKXRoaXMuZW5jb2RlQm9vbGVhbihlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im51bWJlciIpaWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCl0aGlzLmVuY29kZU51bWJlcihlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIGlmKHR5cGVvZiBlPT09InN0cmluZyIpdGhpcy5lbmNvZGVTdHJpbmcoZSk7ZWxzZSBpZih0aGlzLnVzZUJpZ0ludDY0JiZ0eXBlb2YgZT09PSJiaWdpbnQiKXRoaXMuZW5jb2RlQmlnSW50NjQoZSk7ZWxzZSB0aGlzLmVuY29kZU9iamVjdChlLHQpfWVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKGUpe2xldCB0PXRoaXMucG9zK2U7aWYodGhpcy52aWV3LmJ5dGVMZW5ndGg8dCl0aGlzLnJlc2l6ZUJ1ZmZlcih0KjIpfXJlc2l6ZUJ1ZmZlcihlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZSkscj1uZXcgVWludDhBcnJheSh0KSxuPW5ldyBEYXRhVmlldyh0KTtyLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9bix0aGlzLmJ5dGVzPXJ9ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXtpZihlPT09ITEpdGhpcy53cml0ZVU4KDE5NCk7ZWxzZSB0aGlzLndyaXRlVTgoMTk1KX1lbmNvZGVOdW1iZXIoZSl7aWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCYmTnVtYmVyLmlzU2FmZUludGVnZXIoZSkpaWYoZT49MClpZihlPDEyOCl0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZSBpZihlPDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKTtlbHNlIGlmKCF0aGlzLnVzZUJpZ0ludDY0KXRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSk7ZWxzZSB0aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk7ZWxzZSBpZihlPj0tMzIpdGhpcy53cml0ZVU4KDIyNHxlKzMyKTtlbHNlIGlmKGU+PS0xMjgpdGhpcy53cml0ZVU4KDIwOCksdGhpcy53cml0ZUk4KGUpO2Vsc2UgaWYoZT49LTMyNzY4KXRoaXMud3JpdGVVOCgyMDkpLHRoaXMud3JpdGVJMTYoZSk7ZWxzZSBpZihlPj0tMjE0NzQ4MzY0OCl0aGlzLndyaXRlVTgoMjEwKSx0aGlzLndyaXRlSTMyKGUpO2Vsc2UgaWYoIXRoaXMudXNlQmlnSW50NjQpdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUk2NChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe2lmKHRoaXMuZm9yY2VGbG9hdDMyKXRoaXMud3JpdGVVOCgyMDIpLHRoaXMud3JpdGVGMzIoZSk7ZWxzZSB0aGlzLndyaXRlVTgoMjAzKSx0aGlzLndyaXRlRjY0KGUpfWVuY29kZUJpZ0ludDY0KGUpe2lmKGU+PUJpZ0ludCgwKSl0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpO2Vsc2UgdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpfXdyaXRlU3RyaW5nSGVhZGVyKGUpe2lmKGU8MzIpdGhpcy53cml0ZVU4KDE2MCtlKTtlbHNlIGlmKGU8MjU2KXRoaXMud3JpdGVVOCgyMTcpLHRoaXMud3JpdGVVOChlKTtlbHNlIGlmKGU8NjU1MzYpdGhpcy53cml0ZVU4KDIxOCksdGhpcy53cml0ZVUxNihlKTtlbHNlIGlmKGU8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsb25nIHN0cmluZzogJHtlfSBieXRlcyBpbiBVVEYtOGApfWVuY29kZVN0cmluZyhlKXtsZXQgcj1ObihlKTt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDUrciksdGhpcy53cml0ZVN0cmluZ0hlYWRlcihyKSxxbihlLHRoaXMuYnl0ZXMsdGhpcy5wb3MpLHRoaXMucG9zKz1yfWVuY29kZU9iamVjdChlLHQpe2xldCByPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKHIhPW51bGwpdGhpcy5lbmNvZGVFeHRlbnNpb24ocik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im9iamVjdCIpdGhpcy5lbmNvZGVNYXAoZSx0KTtlbHNlIHRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgb2JqZWN0OiAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoZSl9YCl9ZW5jb2RlQmluYXJ5KGUpe2xldCB0PWUuYnl0ZUxlbmd0aDtpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk2KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgxOTcpLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDE5OCksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgYmluYXJ5OiAke3R9YCk7bGV0IHI9bHQoZSk7dGhpcy53cml0ZVU4YShyKX1lbmNvZGVBcnJheShlLHQpe2xldCByPWUubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDE0NCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihyKTtlbHNlIGlmKHI8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIxKSx0aGlzLndyaXRlVTMyKHIpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtyfWApO2ZvcihsZXQgbiBvZiBlKXRoaXMuZG9FbmNvZGUobix0KzEpfWNvdW50V2l0aG91dFVuZGVmaW5lZChlLHQpe2xldCByPTA7Zm9yKGxldCBuIG9mIHQpaWYoZVtuXSE9PXZvaWQgMClyKys7cmV0dXJuIHJ9ZW5jb2RlTWFwKGUsdCl7bGV0IHI9T2JqZWN0LmtleXMoZSk7aWYodGhpcy5zb3J0S2V5cylyLnNvcnQoKTtsZXQgbj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLHIpOnIubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDEyOCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihuKTtlbHNlIGlmKG48NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIzKSx0aGlzLndyaXRlVTMyKG4pO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke259YCk7Zm9yKGxldCBzIG9mIHIpe2xldCBpPWVbc107aWYoISh0aGlzLmlnbm9yZVVuZGVmaW5lZCYmaT09PXZvaWQgMCkpdGhpcy5lbmNvZGVTdHJpbmcocyksdGhpcy5kb0VuY29kZShpLHQrMSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZih0eXBlb2YgZS5kYXRhPT09ImZ1bmN0aW9uIil7bGV0IHI9ZS5kYXRhKHRoaXMucG9zKzYpLG49ci5sZW5ndGg7aWYobj49NDI5NDk2NzI5Nil0aHJvdyBFcnJvcihgVG9vIGxhcmdlIGV4dGVuc2lvbiBvYmplY3Q6ICR7bn1gKTt0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEocik7cmV0dXJufWxldCB0PWUuZGF0YS5sZW5ndGg7aWYodD09PTEpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZih0PT09Mil0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKHQ9PT00KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYodD09PTgpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZih0PT09MTYpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwMSksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEoZS5kYXRhKX13cml0ZVU4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldFVpbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVOGEoZSl7bGV0IHQ9ZS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSh0KSx0aGlzLmJ5dGVzLnNldChlLHRoaXMucG9zKSx0aGlzLnBvcys9dH13cml0ZUk4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldEludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVUxNihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDIpLHRoaXMudmlldy5zZXRVaW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVJMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0SW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVVMzIoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0VWludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlSTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEZsb2F0MzIodGhpcy5wb3MsZSksdGhpcy5wb3MrPTR9d3JpdGVGNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSx0aGlzLnZpZXcuc2V0RmxvYXQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZVU2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLFduKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUk2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHZ0KHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19ZnVuY3Rpb24gT2UoZSx0KXtyZXR1cm4gbmV3IEN0KHQpLmVuY29kZVNoYXJlZFJlZihlKX1mdW5jdGlvbiBUdChlKXtyZXR1cm5gJHtlPDA/Ii0iOiIifTB4JHtNYXRoLmFicyhlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfWB9dmFyIHRvPTE2LHJvPTE2O2NsYXNzIHdye2hpdD0wO21pc3M9MDtjYWNoZXM7bWF4S2V5TGVuZ3RoO21heExlbmd0aFBlcktleTtjb25zdHJ1Y3RvcihlPXRvLHQ9cm8pe3RoaXMubWF4S2V5TGVuZ3RoPWUsdGhpcy5tYXhMZW5ndGhQZXJLZXk9dCx0aGlzLmNhY2hlcz1bXTtmb3IobGV0IHI9MDtyPHRoaXMubWF4S2V5TGVuZ3RoO3IrKyl0aGlzLmNhY2hlcy5wdXNoKFtdKX1jYW5CZUNhY2hlZChlKXtyZXR1cm4gZT4wJiZlPD10aGlzLm1heEtleUxlbmd0aH1maW5kKGUsdCxyKXtsZXQgbj10aGlzLmNhY2hlc1tyLTFdO2U6Zm9yKGxldCBzIG9mIG4pe2xldCBpPXMuYnl0ZXM7Zm9yKGxldCBvPTA7bzxyO28rKylpZihpW29dIT09ZVt0K29dKWNvbnRpbnVlIGU7cmV0dXJuIHMuc3RyfXJldHVybiBudWxsfXN0b3JlKGUsdCl7bGV0IHI9dGhpcy5jYWNoZXNbZS5sZW5ndGgtMV0sbj17Ynl0ZXM6ZSxzdHI6dH07aWYoci5sZW5ndGg+PXRoaXMubWF4TGVuZ3RoUGVyS2V5KXJbTWF0aC5yYW5kb20oKSpyLmxlbmd0aHwwXT1uO2Vsc2Ugci5wdXNoKG4pfWRlY29kZShlLHQscil7bGV0IG49dGhpcy5maW5kKGUsdCxyKTtpZihuIT1udWxsKXJldHVybiB0aGlzLmhpdCsrLG47dGhpcy5taXNzKys7bGV0IHM9YnIoZSx0LHIpLGk9VWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLHQsdCtyKTtyZXR1cm4gdGhpcy5zdG9yZShpLHMpLHN9fXZhciBJcj0iYXJyYXkiLHB0PSJtYXBfa2V5Iiwkbj0ibWFwX3ZhbHVlIixubz0oZSk9PntpZih0eXBlb2YgZT09PSJzdHJpbmcifHx0eXBlb2YgZT09PSJudW1iZXIiKXJldHVybiBlO3Rocm93IG5ldyBzZSgiVGhlIHR5cGUgb2Yga2V5IG11c3QgYmUgc3RyaW5nIG9yIG51bWJlciBidXQgIit0eXBlb2YgZSl9O2NsYXNzIEdue3N0YWNrPVtdO3N0YWNrSGVhZFBvc2l0aW9uPS0xO2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5zdGFja0hlYWRQb3NpdGlvbisxfXRvcCgpe3JldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXB1c2hBcnJheVN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9SXIsdC5wb3NpdGlvbj0wLHQuc2l6ZT1lLHQuYXJyYXk9QXJyYXkoZSl9cHVzaE1hcFN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9cHQsdC5yZWFkQ291bnQ9MCx0LnNpemU9ZSx0Lm1hcD17fX1nZXRVbmluaXRpYWxpemVkU3RhdGVGcm9tUG9vbCgpe2lmKHRoaXMuc3RhY2tIZWFkUG9zaXRpb24rKyx0aGlzLnN0YWNrSGVhZFBvc2l0aW9uPT09dGhpcy5zdGFjay5sZW5ndGgpe2xldCBlPXt0eXBlOnZvaWQgMCxzaXplOjAsYXJyYXk6dm9pZCAwLHBvc2l0aW9uOjAscmVhZENvdW50OjAsbWFwOnZvaWQgMCxrZXk6bnVsbH07dGhpcy5zdGFjay5wdXNoKGUpfXJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXJlbGVhc2UoZSl7aWYodGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXSE9PWUpdGhyb3cgRXJyb3IoIkludmFsaWQgc3RhY2sgc3RhdGUuIFJlbGVhc2VkIHN0YXRlIGlzIG5vdCBvbiB0b3Agb2YgdGhlIHN0YWNrLiIpO2lmKGUudHlwZT09PUlyKXtsZXQgcj1lO3Iuc2l6ZT0wLHIuYXJyYXk9dm9pZCAwLHIucG9zaXRpb249MCxyLnR5cGU9dm9pZCAwfWlmKGUudHlwZT09PXB0fHxlLnR5cGU9PT0kbil7bGV0IHI9ZTtyLnNpemU9MCxyLm1hcD12b2lkIDAsci5yZWFkQ291bnQ9MCxyLnR5cGU9dm9pZCAwfXRoaXMuc3RhY2tIZWFkUG9zaXRpb24tLX1yZXNldCgpe3RoaXMuc3RhY2subGVuZ3RoPTAsdGhpcy5zdGFja0hlYWRQb3NpdGlvbj0tMX19dmFyIGZ0PS0xLHhyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpLHNvPW5ldyBVaW50OEFycmF5KHhyLmJ1ZmZlcik7dHJ5e3hyLmdldEludDgoMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgRXJyb3IoIlRoaXMgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgYmVjYXVzZSBEYXRhVmlldyBkb2VzIG5vdCB0aHJvdyBSYW5nZUVycm9yIG9uIG91dC1vZi1ib3VuZHMgYWNjZXNzIil9dmFyIGpuPVJhbmdlRXJyb3IoIkluc3VmZmljaWVudCBkYXRhIiksaW89bmV3IHdyO2NsYXNzIEh0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7cmF3U3RyaW5nczttYXhTdHJMZW5ndGg7bWF4QmluTGVuZ3RoO21heEFycmF5TGVuZ3RoO21heE1hcExlbmd0aDttYXhFeHRMZW5ndGg7a2V5RGVjb2RlcjttYXBLZXlDb252ZXJ0ZXI7dG90YWxQb3M9MDtwb3M9MDt2aWV3PXhyO2J5dGVzPXNvO2hlYWRCeXRlPWZ0O3N0YWNrPW5ldyBHbjtlbnRlcmVkPSExO2NvbnN0cnVjdG9yKGUpe3RoaXMuZXh0ZW5zaW9uQ29kZWM9ZT8uZXh0ZW5zaW9uQ29kZWM/P0plLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLnJhd1N0cmluZ3M9ZT8ucmF3U3RyaW5ncz8/ITEsdGhpcy5tYXhTdHJMZW5ndGg9ZT8ubWF4U3RyTGVuZ3RoPz9ZZSx0aGlzLm1heEJpbkxlbmd0aD1lPy5tYXhCaW5MZW5ndGg/P1llLHRoaXMubWF4QXJyYXlMZW5ndGg9ZT8ubWF4QXJyYXlMZW5ndGg/P1llLHRoaXMubWF4TWFwTGVuZ3RoPWU/Lm1heE1hcExlbmd0aD8/WWUsdGhpcy5tYXhFeHRMZW5ndGg9ZT8ubWF4RXh0TGVuZ3RoPz9ZZSx0aGlzLmtleURlY29kZXI9ZT8ua2V5RGVjb2RlciE9PXZvaWQgMD9lLmtleURlY29kZXI6aW8sdGhpcy5tYXBLZXlDb252ZXJ0ZXI9ZT8ubWFwS2V5Q29udmVydGVyPz9ub31jbG9uZSgpe3JldHVybiBuZXcgSHQoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxyYXdTdHJpbmdzOnRoaXMucmF3U3RyaW5ncyxtYXhTdHJMZW5ndGg6dGhpcy5tYXhTdHJMZW5ndGgsbWF4QmluTGVuZ3RoOnRoaXMubWF4QmluTGVuZ3RoLG1heEFycmF5TGVuZ3RoOnRoaXMubWF4QXJyYXlMZW5ndGgsbWF4TWFwTGVuZ3RoOnRoaXMubWF4TWFwTGVuZ3RoLG1heEV4dExlbmd0aDp0aGlzLm1heEV4dExlbmd0aCxrZXlEZWNvZGVyOnRoaXMua2V5RGVjb2Rlcn0pfXJlaW5pdGlhbGl6ZVN0YXRlKCl7dGhpcy50b3RhbFBvcz0wLHRoaXMuaGVhZEJ5dGU9ZnQsdGhpcy5zdGFjay5yZXNldCgpfXNldEJ1ZmZlcihlKXtsZXQgdD1sdChlKTt0aGlzLmJ5dGVzPXQsdGhpcy52aWV3PW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wfWFwcGVuZEJ1ZmZlcihlKXtpZih0aGlzLmhlYWRCeXRlPT09ZnQmJiF0aGlzLmhhc1JlbWFpbmluZygxKSl0aGlzLnNldEJ1ZmZlcihlKTtlbHNle2xldCB0PXRoaXMuYnl0ZXMuc3ViYXJyYXkodGhpcy5wb3MpLHI9bHQoZSksbj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtyLmxlbmd0aCk7bi5zZXQodCksbi5zZXQocix0Lmxlbmd0aCksdGhpcy5zZXRCdWZmZXIobil9fWhhc1JlbWFpbmluZyhlKXtyZXR1cm4gdGhpcy52aWV3LmJ5dGVMZW5ndGgtdGhpcy5wb3M+PWV9Y3JlYXRlRXh0cmFCeXRlRXJyb3IoZSl7bGV0e3ZpZXc6dCxwb3M6cn09dGhpcztyZXR1cm4gUmFuZ2VFcnJvcihgRXh0cmEgJHt0LmJ5dGVMZW5ndGgtcn0gb2YgJHt0LmJ5dGVMZW5ndGh9IGJ5dGUocykgZm91bmQgYXQgYnVmZmVyWyR7ZX1dYCl9ZGVjb2RlKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZShlKTt0cnl7dGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLnNldEJ1ZmZlcihlKTtsZXQgdD10aGlzLmRvRGVjb2RlU3luYygpO2lmKHRoaXMuaGFzUmVtYWluaW5nKDEpKXRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy5wb3MpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX0qZGVjb2RlTXVsdGkoZSl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGkoZSk7cmV0dXJufXRyeXt0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuc2V0QnVmZmVyKGUpO3doaWxlKHRoaXMuaGFzUmVtYWluaW5nKDEpKXlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWFzeW5jIGRlY29kZUFzeW5jKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZUFzeW5jKGUpO3RyeXt0aGlzLmVudGVyZWQ9ITA7bGV0IHQ9ITEscjtmb3IgYXdhaXQobGV0IG8gb2YgZSl7aWYodCl0aHJvdyB0aGlzLmVudGVyZWQ9ITEsdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTt0aGlzLmFwcGVuZEJ1ZmZlcihvKTt0cnl7cj10aGlzLmRvRGVjb2RlU3luYygpLHQ9ITB9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgYX10aGlzLnRvdGFsUG9zKz10aGlzLnBvc31pZih0KXtpZih0aGlzLmhhc1JlbWFpbmluZygxKSl0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMudG90YWxQb3MpO3JldHVybiByfWxldHtoZWFkQnl0ZTpuLHBvczpzLHRvdGFsUG9zOml9PXRoaXM7dGhyb3cgUmFuZ2VFcnJvcihgSW5zdWZmaWNpZW50IGRhdGEgaW4gcGFyc2luZyAke1R0KG4pfSBhdCAke2l9ICgke3N9IGluIHRoZSBjdXJyZW50IGJ1ZmZlcilgKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZGVjb2RlQXJyYXlTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCEwKX1kZWNvZGVTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCExKX1hc3luYypkZWNvZGVNdWx0aUFzeW5jKGUsdCl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGlBc3luYyhlLHQpO3JldHVybn10cnl7dGhpcy5lbnRlcmVkPSEwO2xldCByPXQsbj0tMTtmb3IgYXdhaXQobGV0IHMgb2YgZSl7aWYodCYmbj09PTApdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTtpZih0aGlzLmFwcGVuZEJ1ZmZlcihzKSxyKW49dGhpcy5yZWFkQXJyYXlTaXplKCkscj0hMSx0aGlzLmNvbXBsZXRlKCk7dHJ5e3doaWxlKCEwKWlmKHlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCksLS1uPT09MClicmVha31jYXRjaChpKXtpZighKGkgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSl0aHJvdyBpfXRoaXMudG90YWxQb3MrPXRoaXMucG9zfX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9EZWNvZGVTeW5jKCl7ZTp3aGlsZSghMCl7bGV0IGU9dGhpcy5yZWFkSGVhZEJ5dGUoKSx0O2lmKGU+PTIyNCl0PWUtMjU2O2Vsc2UgaWYoZTwxOTIpaWYoZTwxMjgpdD1lO2Vsc2UgaWYoZTwxNDQpe2xldCBuPWUtMTI4O2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPDE2MCl7bGV0IG49ZS0xNDQ7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2V7bGV0IG49ZS0xNjA7dD10aGlzLmRlY29kZVN0cmluZyhuLDApfWVsc2UgaWYoZT09PTE5Mil0PW51bGw7ZWxzZSBpZihlPT09MTk0KXQ9ITE7ZWxzZSBpZihlPT09MTk1KXQ9ITA7ZWxzZSBpZihlPT09MjAyKXQ9dGhpcy5yZWFkRjMyKCk7ZWxzZSBpZihlPT09MjAzKXQ9dGhpcy5yZWFkRjY0KCk7ZWxzZSBpZihlPT09MjA0KXQ9dGhpcy5yZWFkVTgoKTtlbHNlIGlmKGU9PT0yMDUpdD10aGlzLnJlYWRVMTYoKTtlbHNlIGlmKGU9PT0yMDYpdD10aGlzLnJlYWRVMzIoKTtlbHNlIGlmKGU9PT0yMDcpaWYodGhpcy51c2VCaWdJbnQ2NCl0PXRoaXMucmVhZFU2NEFzQmlnSW50KCk7ZWxzZSB0PXRoaXMucmVhZFU2NCgpO2Vsc2UgaWYoZT09PTIwOCl0PXRoaXMucmVhZEk4KCk7ZWxzZSBpZihlPT09MjA5KXQ9dGhpcy5yZWFkSTE2KCk7ZWxzZSBpZihlPT09MjEwKXQ9dGhpcy5yZWFkSTMyKCk7ZWxzZSBpZihlPT09MjExKWlmKHRoaXMudXNlQmlnSW50NjQpdD10aGlzLnJlYWRJNjRBc0JpZ0ludCgpO2Vsc2UgdD10aGlzLnJlYWRJNjQoKTtlbHNlIGlmKGU9PT0yMTcpe2xldCBuPXRoaXMubG9va1U4KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDEpfWVsc2UgaWYoZT09PTIxOCl7bGV0IG49dGhpcy5sb29rVTE2KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDIpfWVsc2UgaWYoZT09PTIxOSl7bGV0IG49dGhpcy5sb29rVTMyKCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDQpfWVsc2UgaWYoZT09PTIyMCl7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMSl7bGV0IG49dGhpcy5yZWFkVTMyKCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMil7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaE1hcFN0YXRlKG4pLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSBlfWVsc2UgdD17fX1lbHNlIGlmKGU9PT0yMjMpe2xldCBuPXRoaXMucmVhZFUzMigpO2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPT09MTk2KXtsZXQgbj10aGlzLmxvb2tVOCgpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwxKX1lbHNlIGlmKGU9PT0xOTcpe2xldCBuPXRoaXMubG9va1UxNigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwyKX1lbHNlIGlmKGU9PT0xOTgpe2xldCBuPXRoaXMubG9va1UzMigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiw0KX1lbHNlIGlmKGU9PT0yMTIpdD10aGlzLmRlY29kZUV4dGVuc2lvbigxLDApO2Vsc2UgaWYoZT09PTIxMyl0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDIsMCk7ZWxzZSBpZihlPT09MjE0KXQ9dGhpcy5kZWNvZGVFeHRlbnNpb24oNCwwKTtlbHNlIGlmKGU9PT0yMTUpdD10aGlzLmRlY29kZUV4dGVuc2lvbig4LDApO2Vsc2UgaWYoZT09PTIxNil0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDE2LDApO2Vsc2UgaWYoZT09PTE5OSl7bGV0IG49dGhpcy5sb29rVTgoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMSl9ZWxzZSBpZihlPT09MjAwKXtsZXQgbj10aGlzLmxvb2tVMTYoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMil9ZWxzZSBpZihlPT09MjAxKXtsZXQgbj10aGlzLmxvb2tVMzIoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sNCl9ZWxzZSB0aHJvdyBuZXcgc2UoYFVucmVjb2duaXplZCB0eXBlIGJ5dGU6ICR7VHQoZSl9YCk7dGhpcy5jb21wbGV0ZSgpO2xldCByPXRoaXMuc3RhY2s7d2hpbGUoci5sZW5ndGg+MCl7bGV0IG49ci50b3AoKTtpZihuLnR5cGU9PT1JcilpZihuLmFycmF5W24ucG9zaXRpb25dPXQsbi5wb3NpdGlvbisrLG4ucG9zaXRpb249PT1uLnNpemUpdD1uLmFycmF5LHIucmVsZWFzZShuKTtlbHNlIGNvbnRpbnVlIGU7ZWxzZSBpZihuLnR5cGU9PT1wdCl7aWYodD09PSJfX3Byb3RvX18iKXRocm93IG5ldyBzZSgiVGhlIGtleSBfX3Byb3RvX18gaXMgbm90IGFsbG93ZWQiKTtuLmtleT10aGlzLm1hcEtleUNvbnZlcnRlcih0KSxuLnR5cGU9JG47Y29udGludWUgZX1lbHNlIGlmKG4ubWFwW24ua2V5XT10LG4ucmVhZENvdW50Kyssbi5yZWFkQ291bnQ9PT1uLnNpemUpdD1uLm1hcCxyLnJlbGVhc2Uobik7ZWxzZXtuLmtleT1udWxsLG4udHlwZT1wdDtjb250aW51ZSBlfX1yZXR1cm4gdH19cmVhZEhlYWRCeXRlKCl7aWYodGhpcy5oZWFkQnl0ZT09PWZ0KXRoaXMuaGVhZEJ5dGU9dGhpcy5yZWFkVTgoKTtyZXR1cm4gdGhpcy5oZWFkQnl0ZX1jb21wbGV0ZSgpe3RoaXMuaGVhZEJ5dGU9ZnR9cmVhZEFycmF5U2l6ZSgpe2xldCBlPXRoaXMucmVhZEhlYWRCeXRlKCk7c3dpdGNoKGUpe2Nhc2UgMjIwOnJldHVybiB0aGlzLnJlYWRVMTYoKTtjYXNlIDIyMTpyZXR1cm4gdGhpcy5yZWFkVTMyKCk7ZGVmYXVsdDppZihlPDE2MClyZXR1cm4gZS0xNDQ7ZWxzZSB0aHJvdyBuZXcgc2UoYFVucmVjb2duaXplZCBhcnJheSB0eXBlIGJ5dGU6ICR7VHQoZSl9YCl9fXB1c2hNYXBTdGF0ZShlKXtpZihlPnRoaXMubWF4TWFwTGVuZ3RoKXRocm93IG5ldyBzZShgTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoJHtlfSkgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCR7dGhpcy5tYXhNYXBMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaE1hcFN0YXRlKGUpfXB1c2hBcnJheVN0YXRlKGUpe2lmKGU+dGhpcy5tYXhBcnJheUxlbmd0aCl0aHJvdyBuZXcgc2UoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGFycmF5IGxlbmd0aCAoJHtlfSkgPiBtYXhBcnJheUxlbmd0aCAoJHt0aGlzLm1heEFycmF5TGVuZ3RofSlgKTt0aGlzLnN0YWNrLnB1c2hBcnJheVN0YXRlKGUpfWRlY29kZVN0cmluZyhlLHQpe2lmKCF0aGlzLnJhd1N0cmluZ3N8fHRoaXMuc3RhdGVJc01hcEtleSgpKXJldHVybiB0aGlzLmRlY29kZVV0ZjhTdHJpbmcoZSx0KTtyZXR1cm4gdGhpcy5kZWNvZGVCaW5hcnkoZSx0KX1kZWNvZGVVdGY4U3RyaW5nKGUsdCl7aWYoZT50aGlzLm1heFN0ckxlbmd0aCl0aHJvdyBuZXcgc2UoYE1heCBsZW5ndGggZXhjZWVkZWQ6IFVURi04IGJ5dGUgbGVuZ3RoICgke2V9KSA+IG1heFN0ckxlbmd0aCAoJHt0aGlzLm1heFN0ckxlbmd0aH0pYCk7aWYodGhpcy5ieXRlcy5ieXRlTGVuZ3RoPHRoaXMucG9zK3QrZSl0aHJvdyBqbjtsZXQgcj10aGlzLnBvcyt0LG47aWYodGhpcy5zdGF0ZUlzTWFwS2V5KCkmJnRoaXMua2V5RGVjb2Rlcj8uY2FuQmVDYWNoZWQoZSkpbj10aGlzLmtleURlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMscixlKTtlbHNlIG49Rm4odGhpcy5ieXRlcyxyLGUpO3JldHVybiB0aGlzLnBvcys9dCtlLG59c3RhdGVJc01hcEtleSgpe2lmKHRoaXMuc3RhY2subGVuZ3RoPjApcmV0dXJuIHRoaXMuc3RhY2sudG9wKCkudHlwZT09PXB0O3JldHVybiExfWRlY29kZUJpbmFyeShlLHQpe2lmKGU+dGhpcy5tYXhCaW5MZW5ndGgpdGhyb3cgbmV3IHNlKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgke2V9KSA+IG1heEJpbkxlbmd0aCAoJHt0aGlzLm1heEJpbkxlbmd0aH0pYCk7aWYoIXRoaXMuaGFzUmVtYWluaW5nKGUrdCkpdGhyb3cgam47bGV0IHI9dGhpcy5wb3MrdCxuPXRoaXMuYnl0ZXMuc3ViYXJyYXkocixyK2UpO3JldHVybiB0aGlzLnBvcys9dCtlLG59ZGVjb2RlRXh0ZW5zaW9uKGUsdCl7aWYoZT50aGlzLm1heEV4dExlbmd0aCl0aHJvdyBuZXcgc2UoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGV4dCBsZW5ndGggKCR7ZX0pID4gbWF4RXh0TGVuZ3RoICgke3RoaXMubWF4RXh0TGVuZ3RofSlgKTtsZXQgcj10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyt0KSxuPXRoaXMuZGVjb2RlQmluYXJ5KGUsdCsxKTtyZXR1cm4gdGhpcy5leHRlbnNpb25Db2RlYy5kZWNvZGUobixyLHRoaXMuY29udGV4dCl9bG9va1U4KCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyl9bG9va1UxNigpe3JldHVybiB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKX1sb29rVTMyKCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpfXJlYWRVOCgpe2xldCBlPXRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkSTgoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkVTE2KCl7bGV0IGU9dGhpcy52aWV3LmdldFVpbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZEkxNigpe2xldCBlPXRoaXMudmlldy5nZXRJbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZFUzMigpe2xldCBlPXRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRJMzIoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRVNjQoKXtsZXQgZT16bih0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjQoKXtsZXQgZT1EdCh0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRVNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdVaW50NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdJbnQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZEYzMigpe2xldCBlPXRoaXMudmlldy5nZXRGbG9hdDMyKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX1yZWFkRjY0KCl7bGV0IGU9dGhpcy52aWV3LmdldEZsb2F0NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfX1mdW5jdGlvbiBFcihlLHQpe3JldHVybiBuZXcgSHQodCkuZGVjb2RlKGUpfWNsYXNzIGh0e2xpc3RlbmVycz1uZXcgTWFwO2FkZEV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYoIXIpcj1uZXcgU2V0LHRoaXMubGlzdGVuZXJzLnNldChlLHIpO3JldHVybiByLmFkZCh0KSwoKT0+e3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2lmKHIuZGVsZXRlKHQpLHIuc2l6ZT09PTApdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGUpfX1lbWl0KGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2xldCBuPUFycmF5LmZyb20ocik7Zm9yKGxldCBzIG9mIG4pcyh0KX19ZW1pdEFsbChlKXtsZXQgdD1BcnJheS5mcm9tKHRoaXMubGlzdGVuZXJzLmtleXMoKSk7Zm9yKGxldCByIG9mIHQpdGhpcy5lbWl0KHIsZSl9fWNsYXNzIEtle2dldHRlcjtzdGF0aWMgZXZlbnROYW1lPSJ1cGRhdGUiO2VtaXR0ZXI7Y29uc3RydWN0b3IoZSl7dGhpcy5nZXR0ZXI9ZTt0aGlzLmVtaXR0ZXI9bmV3IGh0fWdldD0oKT0+dGhpcy5nZXR0ZXIoKTthc3luYyBlbWl0KCl7bGV0IGU9YXdhaXQgdGhpcy5nZXR0ZXIoKTtxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5lbWl0dGVyLmVtaXQoS2UuZXZlbnROYW1lLGUpKX1saXN0ZW4oZSl7cmV0dXJuIHRoaXMuZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKEtlLmV2ZW50TmFtZSxlKSwoKT0+e3RoaXMuZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKEtlLmV2ZW50TmFtZSxlKX19fWZ1bmN0aW9uIHAoZSl7cmV0dXJuW2UsMF19ZnVuY3Rpb24gZChlKXtyZXR1cm5bdm9pZCAwLGVdfWZ1bmN0aW9uIG9vKGUpe2lmKGU8MCljb25zb2xlLmluZm8oIk4iLGUpLGNvbnNvbGUudHJhY2UoKTtpZih0eXBlb2YgZSE9PSJiaWdpbnQiKWU9QmlnSW50KGUpO2lmKGU8MG4pcmV0dXJuIGQoMTApO2xldCB0PVtdO3doaWxlKGU+MG4pe2xldCByPU51bWJlcihlJjB4N2ZuKTtpZihlPj49N24sZT4wbil0LnB1c2gocnwxMjgpO2Vsc2UgdC5wdXNoKHIpfWlmKHQubGVuZ3RoPT09MClyZXR1cm4gcChuZXcgVWludDhBcnJheShbMF0pKTtpZih0Lmxlbmd0aD44KXJldHVybiBkKDI2KTtyZXR1cm4gcChuZXcgVWludDhBcnJheSh0KSl9ZnVuY3Rpb24gYW8oZSx0PTApe2xldCByPTBuLG49MCxzPXQ7d2hpbGUoITApe2lmKHM+PWUubGVuZ3RoKXJldHVybiBkKDE0KTtsZXQgaT1lW3MrK107aWYoaT09PXZvaWQgMClyZXR1cm4gZCgxNCk7aWYocnw9QmlnSW50KGkmMTI3KTw8QmlnSW50KG4pLChpJjEyOCk9PT0wKXtpZihzLXQ+OClyZXR1cm4gZCgyNik7cmV0dXJuIHAoe3ZhbHVlOnI+MHgxZmZmZmZmZmZmZmZmZm4/cjpOdW1iZXIociksYnl0ZXNSZWFkOnMtdH0pfWlmKG4rPTcsbj49NTYpcmV0dXJuIGQoMjYpfX1jbGFzcyBOe2RhdGE7cG9zPTA7Y29uc3RydWN0b3IoZSl7dGhpcy5kYXRhPWV9c3RhdGljIGFzeW5jIGZyb21SZXNwb25zZShlKXtsZXQgdD1hd2FpdCBlLmFycmF5QnVmZmVyKCkscj1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gbmV3IE4ocil9cmVhZEJpZ0ludCgpe2lmKHRoaXMucG9zKzg+dGhpcy5kYXRhLmxlbmd0aClyZXR1cm4gZCg3KTtsZXQgZT1uZXcgRGF0YVZpZXcodGhpcy5kYXRhLmJ1ZmZlcix0aGlzLmRhdGEuYnl0ZU9mZnNldCt0aGlzLnBvcykuZ2V0QmlnVWludDY0KDAsITEpO3JldHVybiB0aGlzLnBvcys9OCxwKGUpfXJlYWREYXRlKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGQodCk7cmV0dXJuIHAobmV3IERhdGUoZSkpfXJlYWRWYXJJbnQoKXtsZXRbZSx0XT1hbyh0aGlzLmRhdGEsdGhpcy5wb3MpO2lmKHQhPT0wKXJldHVybiBkKHQpO3RoaXMucG9zKz1lLmJ5dGVzUmVhZDtsZXQgcj1lLnZhbHVlO3JldHVybiBwKHR5cGVvZiByPT09ImJpZ2ludCI/TnVtYmVyKHIpOnIpfXJlYWRWYXJTdHJpbmcoKXtsZXRbZSx0XT10aGlzLnJlYWRWYXJJbnQoKTtpZih0IT09MClyZXR1cm4gZCh0KTtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gZChuKTtsZXQgcz1uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7cmV0dXJuIHAocyl9cmVhZEJ5dGVzKGUpe2lmKGU8MClyZXR1cm4gZCgxMCk7aWYodGhpcy5wb3MrZT50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBkKDIzKTtsZXQgdD10aGlzLmRhdGEuc2xpY2UodGhpcy5wb3MsdGhpcy5wb3MrZSk7cmV0dXJuIHRoaXMucG9zKz1lLHAodCl9cmVhZFZhckJ5dGVzKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGQodCk7cmV0dXJuIHRoaXMucmVhZEJ5dGVzKGUpfXJlYWRTdHJ1Y3QoZSl7cmV0dXJuIGUuZGVjb2RlKHRoaXMpfXJlYWRTdHJ1Y3RzKGUpe2xldCB0PVtdO3doaWxlKCF0aGlzLmRvbmUoKSl7bGV0W3Isbl09dGhpcy5yZWFkU3RydWN0KGUpO2lmKG4hPT0wKXJldHVybiBkKG4pO3QucHVzaChyKX1yZXR1cm4gcCh0KX1yZWFkQnl0ZXNTZXEoZSl7bGV0IHQ9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gZChuKTt0LnB1c2gocil9cmV0dXJuIHAodCl9ZG9uZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5kYXRhLmxlbmd0aH1jb25zdW1lZCgpe3JldHVybiB0aGlzLnBvc319Y2xhc3MgcXtwYXJ0cz1bXTt3cml0ZUJpZ0ludChlKXtsZXQgdD1uZXcgVWludDhBcnJheSg4KTtuZXcgRGF0YVZpZXcodC5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLGUsITEpLHRoaXMucGFydHMucHVzaCh0KX13cml0ZURhdGUoZSl7bGV0IHQ9ZS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMud3JpdGVWYXJJbnQodCl9d3JpdGVWYXJJbnQoZSl7bGV0W3Qscl09b28oZSk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIHRoaXMucGFydHMucHVzaCh0KSwwfXdyaXRlVmFyU3RyaW5nKGUpe2xldCB0PW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxyPXRoaXMud3JpdGVWYXJJbnQodC5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLndyaXRlQnl0ZXModCksMH1wcmVwZW5kQnl0ZXMoZSl7dGhpcy5wYXJ0cy51bnNoaWZ0KGUuc2xpY2UoKSl9d3JpdGVCeXRlcyhlKXt0aGlzLnBhcnRzLnB1c2goZS5zbGljZSgpKX13cml0ZVZhckJ5dGVzKGUpe2xldCB0PXRoaXMud3JpdGVWYXJJbnQoZS5sZW5ndGgpO2lmKHQhPT0wKXJldHVybiB0O3JldHVybiB0aGlzLndyaXRlQnl0ZXMoZSksMH13cml0ZVN0cnVjdChlLHQpe3JldHVybiBlLmVuY29kZSh0aGlzLHQpfXdyaXRlU3RydWN0cyhlLHQpe2ZvcihsZXQgciBvZiB0KXtsZXQgbj10aGlzLndyaXRlU3RydWN0KGUscik7aWYobiE9PTApcmV0dXJuIG59cmV0dXJuIDB9d3JpdGVCeXRlc1NlcShlKXtmb3IobGV0IHQgb2YgZSl0aGlzLndyaXRlQnl0ZXModCl9cmVzdWx0KCl7bGV0IGU9dGhpcy5wYXJ0cy5yZWR1Y2UoKG4scyk9Pm4rcy5sZW5ndGgsMCksdD1uZXcgVWludDhBcnJheShlKSxyPTA7Zm9yKGxldCBuIG9mIHRoaXMucGFydHMpdC5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gdH13aXBlKCl7Zm9yKGxldCBlIG9mIHRoaXMucGFydHMpZS5maWxsKDApO3RoaXMucGFydHMubGVuZ3RoPTB9KnNjYW4oKXtmb3IobGV0IGUgb2YgdGhpcy5wYXJ0cyl5aWVsZCBlfX1hc3luYyBmdW5jdGlvbiBBcihlLHQpe2xldCByPW5ldyBxLG49ci53cml0ZURhdGUodCk7aWYobiE9PTApcmV0dXJuIGQobik7bGV0IHM9ci5yZXN1bHQoKSxpPWF3YWl0IGUuc2lnbihzKTtyZXR1cm4gcCh7cHViS2V5OmUucHVibGljS2V5LHNpZzppLHRpbWVzdGFtcDp0fSl9YXN5bmMgZnVuY3Rpb24gSGUoZSx0LHIpe2xldCBuPXIubm93KCkuZ2V0VGltZSgpLHM9ZS50aW1lc3RhbXAuZ2V0VGltZSgpO2lmKE1hdGguYWJzKG4tcyk+S24pcmV0dXJuIDQ7bGV0IG89bmV3IHE7by53cml0ZURhdGUoZS50aW1lc3RhbXApO2xldCBhPW8ucmVzdWx0KCk7aWYoIWF3YWl0IHQuY2hlY2tTaWdFZDI1NTE5KGUuc2lnLGEsZS5wdWJLZXkpKXJldHVybiAzO3JldHVybiAwfXZhciBkZT17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudHMpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyQnl0ZXMoKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWREYXRlKCk7aWYocyE9PTApcmV0dXJuIGQocyk7cmV0dXJuIHAoe2lkOnQsdHM6bn0pfX07ZnVuY3Rpb24gTXQoZSl7bGV0IHQ9bmV3IHEscj10LndyaXRlU3RydWN0KGRlLGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldCBuPXQucmVzdWx0KCk7cmV0dXJuIHAobil9dmFyIGZlPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQudHlwPz8iIik7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuZWlkKTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQub2ZmKTtpZihzIT09MClyZXR1cm4gcztsZXQgaT1lLndyaXRlVmFySW50KHQuY3RyKTtpZihpIT09MClyZXR1cm4gaTtsZXQgbz1lLndyaXRlVmFySW50KHQubGVuKTtpZihvIT09MClyZXR1cm4gbztpZih0LmhzaCllLndyaXRlQnl0ZXModC5oc2gpO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyU3RyaW5nKCk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXQgaT1uZXcgTihuKSxbLG9dPWRlLmRlY29kZShpKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXRbYSxjXT1lLnJlYWRWYXJJbnQoKTtpZihjIT09MClyZXR1cm4gZChjKTtsZXRbdSxsXT1lLnJlYWRWYXJJbnQoKTtpZihsIT09MClyZXR1cm4gZChsKTtsZXRbZixoXT1lLnJlYWRWYXJJbnQoKTtpZihoIT09MClyZXR1cm4gZChoKTtsZXQgeTtpZihmPjApe2xldFtnLG1dPWUucmVhZEJ5dGVzKEJ0KTtpZihtIT09MClyZXR1cm4gZChtKTt5PWd9cmV0dXJuIHAoe3R5cDp0LGVpZDpuLG9mZjphLGN0cjp1LGxlbjpmLGhzaDp5fSl9fTtmdW5jdGlvbiBTZShlKXtyZXR1cm4gQXJyYXkuZnJvbShlKS5tYXAoKHIpPT5yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWZ1bmN0aW9uIFFuKGUpe2lmKGUubGVuZ3RoJTIhPT0wKXRocm93IEVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtsZXQgdD1uZXcgVWludDhBcnJheShlLmxlbmd0aC8yKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrPTIpdFtyLzJdPU51bWJlci5wYXJzZUludChlLnN1YnN0cihyLDIpLDE2KTtyZXR1cm4gdH1mdW5jdGlvbiBZKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO3JldHVybiBlLmV2ZXJ5KChyLG4pPT5yPT09dFtuXSl9dmFyIFI7aWYodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvQmFzZTY0PT09ImZ1bmN0aW9uIilSPShlKT0+ZS50b0Jhc2U2NCgpO2Vsc2UgUj0oZSk9PmJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5lKSk7dmFyIG1lO2lmKHR5cGVvZiBVaW50OEFycmF5LmZyb21CYXNlNjQ9PT0iZnVuY3Rpb24iKW1lPShlKT0+VWludDhBcnJheS5mcm9tQmFzZTY0KGUpO2Vsc2UgbWU9KGUpPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwodCk9PnQuY2hhckNvZGVBdCgwKSk7ZnVuY3Rpb24gWW4oZSl7bGV0IHQ9ZS5sZW5ndGglND09PTA/IiI6Ij0iLnJlcGVhdCg0LWUubGVuZ3RoJTQpLHI9ZS5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKSt0O3JldHVybiBtZShyKX1mdW5jdGlvbiBiZShlLHQpe2xldCByPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoK3QubGVuZ3RoKTtyZXR1cm4gci5zZXQoZSwwKSxyLnNldCh0LGUubGVuZ3RoKSxyfWZ1bmN0aW9uIEpuKGUsdCxyKXtyZXR1cm4gci5jaGVja1NpZ0VkMjU1MTkoZS5zaWcsZS5oZWFkQ3BoLHQpfWFzeW5jIGZ1bmN0aW9uIFpuKGUsdCxyLG4pe2xldCBzO2lmKGUuYm9kJiZlLmxlbj4wKXM9YXdhaXQgci5ibGFrZTMoZS5ib2QpO2xldCBpPW5ldyBxLG89ZmUuZW5jb2RlKGksey4uLmUsaHNoOnN9KTtpZihvIT09MClyZXR1cm4gZChvKTtsZXQgYT1pLnJlc3VsdCgpLGM9YXdhaXQgdC5rZG1Gb3IoYSksdT1uLmRlcml2ZUNpcGhlcihjLCJlbmNyeXB0IiksbD1hd2FpdCB1LmVuY3J5cHQoYSksZj1lLmJvZD9hd2FpdCB1LmVuY3J5cHQoZS5ib2QpOm5ldyBVaW50OEFycmF5KDApLGg9YXdhaXQgdC5zaWduKGwpO3JldHVybiBwKHtzaWc6aCxrZG06YyxoZWFkQ3BoOmwsYm9keUNwaDpmfSl9YXN5bmMgZnVuY3Rpb24gUHIoZSx0LHIsbixzKXtsZXQgaT1uZXcgTihlKSxbbyxhXT1mZS5kZWNvZGUoaSk7aWYoYSE9PTApcmV0dXJuIGQoMTQpO2xldCBjO3RyeXtjPXQmJnQubGVuZ3RoPjA/YXdhaXQgci5kZWNyeXB0KHQpOnZvaWQgMH1jYXRjaHtyZXR1cm4gZCgyMCl9bGV0IHU9by5oc2gmJmM9PT12b2lkIDAsbD1vLmhzaD09PXZvaWQgMCYmYyE9PXZvaWQgMDtpZih1fHxsKXJldHVybiBkKDE5KTtpZihvLmhzaCYmYyl7bGV0IGg9YXdhaXQgbi5ibGFrZTMoYyk7aWYoIVkoaCxvLmhzaCkpcmV0dXJuIGQoMTkpfWxldCBmPXM/P2F3YWl0IG4uYmxha2UzKGUpO3JldHVybiBwKHttc2dIZWFkOm8sYm9kOmMsaGVhZEhhc2g6Zn0pfWNsYXNzIFVye25vdygpe3JldHVybiBuZXcgRGF0ZX19ZnVuY3Rpb24gZXMoZSx0LHIsbil7bGV0IHM9dC5nZXRUaW1lKCktZS5nZXRUaW1lKCksaT1yLmdldFRpbWUoKS1uLmdldFRpbWUoKTtyZXR1cm4ocytpKS8yfXZhciB5dD17ZW5jb2RlKGUsdCl7aWYoZS53cml0ZVZhckludCh0LnF1b3RhKSx0LnF1b3RhPjApe2lmKHQudXNhZ2U9PT12b2lkIDApcmV0dXJuIDk7ZS53cml0ZVZhckludCh0LnVzYWdlKX1yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldCBuO2lmKHQ+MCl7bGV0W3MsaV09ZS5yZWFkVmFySW50KCk7aWYoaSE9PTApcmV0dXJuIGQoaSk7bj1zfXJldHVybiBwKHtxdW90YTp0LHVzYWdlOm59KX19O3ZhciBrcj17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKG5ldyBVaW50OEFycmF5KFt0LnN0YXR1c10pKTtsZXQgcj1lLndyaXRlRGF0ZSh0LnRpbWVSY3ZkKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlRGF0ZSh0LnRpbWVTZW50KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQuc3Vic2NyaXB0aW9uLnRlcm0pO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWUud3JpdGVWYXJJbnQodC5zdWJzY3JpcHRpb24uZWxhcHNlZCk7aWYoaSE9PTApcmV0dXJuIGk7bGV0IG89ZS53cml0ZVN0cnVjdCh5dCx0LnN1YnNjcmlwdGlvbi5zdGF0KTtpZihvIT09MClyZXR1cm4gbztsZXQgYT1lLndyaXRlU3RydWN0KHl0LHQuc3Vic2NyaXB0aW9uLmR5bik7aWYoYSE9PTApcmV0dXJuIGE7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcygxKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXQgbj10WzBdLFtzLGldPWUucmVhZERhdGUoKTtpZihpIT09MClyZXR1cm4gZChpKTtsZXRbbyxhXT1lLnJlYWREYXRlKCk7aWYoYSE9PTApcmV0dXJuIGQoYSk7bGV0W2MsdV09ZS5yZWFkVmFySW50KCk7aWYodSE9PTApcmV0dXJuIGQodSk7bGV0W2wsZl09ZS5yZWFkVmFySW50KCk7aWYoZiE9PTApcmV0dXJuIGQoZik7bGV0W2gseV09ZS5yZWFkU3RydWN0KHl0KTtpZih5IT09MClyZXR1cm4gZCh5KTtsZXRbZyxtXT1lLnJlYWRTdHJ1Y3QoeXQpO2lmKG0hPT0wKXJldHVybiBkKG0pO3JldHVybiBwKHtzdGF0dXM6bix0aW1lUmN2ZDpzLHRpbWVTZW50Om8sc3Vic2NyaXB0aW9uOnt0ZXJtOmMsZWxhcHNlZDpsLHN0YXQ6aCxkeW46Z319KX19O3ZhciBCcj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0LnNlcSk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJCeXRlcygpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWUucmVhZFZhckludCgpO2lmKHMhPT0wKXJldHVybiBkKHMpO3JldHVybiBwKHtoZWFkQ3BoOnQsc2VxOm59KX19O3ZhciB1ZT17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKHQucHViS2V5KSxlLndyaXRlQnl0ZXModC5zaWcpO2xldCByPWUud3JpdGVEYXRlKHQudGltZXN0YW1wKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKE9uKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyhDZSk7aWYocyE9PTApcmV0dXJuIGQocyk7bGV0W2ksb109ZS5yZWFkRGF0ZSgpO2lmKG8hPT0wKXJldHVybiBkKG8pO3JldHVybiBwKHtwdWJLZXk6dCxzaWc6bix0aW1lc3RhbXA6aX0pfX07dmFyIHRzPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtsZXQgaT1zLndyaXRlU3RydWN0KHVlLHIpO2lmKGkhPT0wKXJldHVybiBpO2ZvcihsZXQgbyBvZiBuKXMud3JpdGVWYXJJbnQobyk7cmV0dXJuIDB9LGFzeW5jIGhhbmRsZVJlcShlLHQscil7bGV0e2Nsb2NrOm4sY3J5cHRvOnMsc3RvcmFnZTppfT1lLFtvLGFdPXQucmVhZFN0cnVjdCh1ZSk7aWYoYSE9PTApcmV0dXJuIGE7bGV0IGM9YXdhaXQgSGUobyxzLG4pO2lmKGMhPT0wKXJldHVybiBjO2xldHtwdWJLZXk6dX09byxbbCxmXT1hd2FpdCBpLmhhc1VzZXIodSk7aWYoZiE9PTApcmV0dXJuIGY7aWYoIWwpcmV0dXJuIDU7bGV0W2gseV09dC5yZWFkVmFySW50KCk7aWYoeSE9PTApcmV0dXJuIHk7aWYoIXQuZG9uZSgpKXJldHVybiA4O2xldFtnLG1dPWF3YWl0IGkubGlzdEhlYWRzKHUsaCk7aWYobSE9PTApcmV0dXJuIG07cmV0dXJuIHIud3JpdGVTdHJ1Y3RzKEJyLGcpfSxkZWNvZGVSZXNwKGUpe3JldHVybiBlLnJlYWRTdHJ1Y3RzKEJyKX19O3ZhciB2cj17ZW5jb2RlKGUsdCl7ZS53cml0ZVZhckludCh0LnNlcSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuYm9keUNwaCk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBkKHMpO3JldHVybiBwKHtzZXE6dCxib2R5Q3BoOm59KX19O3ZhciBycz17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IGk9cy53cml0ZVN0cnVjdCh1ZSxyKTtpZihpIT09MClyZXR1cm4gaTtmb3IobGV0IG8gb2Ygbil7bGV0IGE9cy53cml0ZVZhckludChvKTtpZihhIT09MClyZXR1cm4gYX1yZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KHVlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgYz1hd2FpdCBIZShvLHMsbik7aWYoYyE9PTApcmV0dXJuIGM7bGV0e3B1YktleTp1fT1vLFtsLGZdPWF3YWl0IGkuaGFzVXNlcih1KTtpZihmIT09MClyZXR1cm4gZjtpZighbClyZXR1cm4gNTtsZXQgaD1bXTt3aGlsZSghdC5kb25lKCkpe2xldFttLFNdPXQucmVhZFZhckludCgpO2lmKFMhPT0wKXJldHVybiBTO2gucHVzaChtKX1jb25zb2xlLmluZm8oYFBVTEw6ICR7aC5sZW5ndGh9IGJhZ3NgKTtsZXRbeSxnXT1hd2FpdCBpLmdldEJvZGllcyh1LGgpO2lmKGchPT0wKXJldHVybiBnO2lmKCF5KXJldHVybiAxNztmb3IobGV0e3NlcTptLGJvZHlDcGg6U31vZiB5KXtsZXQgRT17c2VxOm0sYm9keUNwaDpTfSx3PXIud3JpdGVTdHJ1Y3QodnIsRSk7aWYodyE9PTApcmV0dXJuIHd9cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHModnIpfX07dmFyIERyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5zaWcpLGUud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuYm9keUNwaCk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhDZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoVGUpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGQobyk7bGV0W2EsY109ZS5yZWFkVmFyQnl0ZXMoKTtpZihjIT09MClyZXR1cm4gZChjKTtyZXR1cm4gcCh7c2lnOnQsa2RtOm4saGVhZENwaDppLGJvZHlDcGg6YX0pfX07dmFyIFJ0PXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFySW50KHQuc2VxKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz10LmJvZHlDcGg/dC5ib2R5Q3BoLmxlbmd0aDowLGk9ZS53cml0ZVZhckludChzKTtpZihpIT09MClyZXR1cm4gaTtpZihzPjApe2lmKCF0LmJvZHlDcGgpcmV0dXJuIDEwO2Uud3JpdGVCeXRlcyh0LmJvZHlDcGgpfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXQgYTtpZihpPjApe2xldFtjLHVdPWUucmVhZEJ5dGVzKGkpO2lmKHUhPT0wKXJldHVybiBkKHUpO2E9Y31yZXR1cm4gcCh7c2VxOnQsaGVhZENwaDpuLGJvZHlDcGg6YX0pfX07dmFyIEx0PXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5zaWcpLGUud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhDZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoVGUpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGQobyk7cmV0dXJuIHAoe3NpZzp0LGtkbTpuLGhlYWRDcGg6aX0pfX07dmFyIE90PXtlbmNvZGUoZSx0KXtpZihlLndyaXRlVmFySW50KHQuaWR4KSxlLndyaXRlQnl0ZXMobmV3IFVpbnQ4QXJyYXkoW3Quc3RhdHVzXSkpLHQuc3RhdHVzPT09MCllLndyaXRlVmFySW50KHQuc2VxKTtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKDEpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldCBpPW5bMF07aWYoaSE9PTApcmV0dXJuIHAoe2lkeDp0LHN0YXR1czppfSk7bGV0W28sYV09ZS5yZWFkVmFySW50KCk7aWYoYSE9PTApcmV0dXJuIGQoYSk7cmV0dXJuIHAoe2lkeDp0LHN0YXR1czppLHNlcTpvfSl9fTt2YXIgbnM9e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe2xldCBpPXMud3JpdGVTdHJ1Y3QodWUscik7aWYoaSE9PTApcmV0dXJuIGk7bGV0IG89cy53cml0ZVN0cnVjdHMoRHIsbik7aWYobyE9PTApcmV0dXJuIG87cmV0dXJuIDB9LGFzeW5jIGhhbmRsZVJlcShlLHQscil7bGV0e2Nsb2NrOm4sY3J5cHRvOnMsc3RvcmFnZTppLG5vdGlmaWVyOm99PWUsW2EsY109dC5yZWFkU3RydWN0KHVlKTtpZihjIT09MClyZXR1cm4gYztsZXQgdT1hd2FpdCBIZShhLHMsbik7aWYodSE9PTApcmV0dXJuIHU7bGV0e3B1YktleTpsfT1hLFtmLGhdPWF3YWl0IGkuaGFzVXNlcihsKTtpZihoIT09MClyZXR1cm4gaDtpZighZilyZXR1cm4gNTtsZXRbeSxnXT10LnJlYWRTdHJ1Y3RzKERyKTtpZihnIT09MClyZXR1cm4gZztjb25zb2xlLmluZm8oYFBVU0g6ICR7eS5sZW5ndGh9IGJhZ3NgKTtsZXQgbT1bXSxTPVtdO2ZvcihsZXQgYj0wO2I8eS5sZW5ndGg7YisrKXtsZXQgQT15W2JdO2lmKCFhd2FpdCBKbihBLGwscykpe2xldCBUPXtpZHg6YixzdGF0dXM6M30sSD1yLndyaXRlU3RydWN0KE90LFQpO2lmKEghPT0wKXJldHVybiBIO2NvbnRpbnVlfW0ucHVzaChiKSxTLnB1c2goQSl9bGV0W0Usd109YXdhaXQgaS5zZXRCYWdzKGwsUyk7aWYodyE9PTApcmV0dXJuIHc7aWYoIUV8fEUubGVuZ3RoIT09Uy5sZW5ndGgpcmV0dXJuIDE3O2xldCB4PVtdO2ZvcihsZXQgYj0wO2I8Uy5sZW5ndGg7YisrKXtsZXQgQT1TW2JdLEQ9bVtiXSxUPUVbYl0sSD1uZXcgcSxVPUgud3JpdGVTdHJ1Y3QoTHQsQSk7aWYoVSE9PTApcmV0dXJuIFU7bGV0IE89SC5yZXN1bHQoKSxLPXtzZXE6VCxoZWFkQ3BoOk99O2lmKHkubGVuZ3RoPT09MSYmQS5ib2R5Q3BoLmxlbmd0aDw9Vm4pSy5ib2R5Q3BoPUEuYm9keUNwaDt4LnB1c2goSyk7bGV0IF89e2lkeDpELHN0YXR1czowLHNlcTpUfSxJPXIud3JpdGVTdHJ1Y3QoT3QsXyk7aWYoSSE9PTApcmV0dXJuIEl9aWYoeC5sZW5ndGg+MCl7bGV0IGI9bmV3IHEsQT1iLndyaXRlU3RydWN0cyhSdCx4KTtpZihBIT09MClyZXR1cm4gQTtsZXQgRD1iLnJlc3VsdCgpO2F3YWl0IFByb21pc2UucmVzb2x2ZShvLnB1c2gobCxEKSl9cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoT3QpfX07dmFyIHNzPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtyZXR1cm4gcy53cml0ZVN0cnVjdCh1ZSxyKX0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KHVlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgYz1hd2FpdCBIZShvLHMsbik7aWYoYyE9PTApcmV0dXJuIGM7bGV0e3B1YktleTp1fT1vO2lmKCF0LmRvbmUoKSlyZXR1cm4gODtsZXRbbCxmXT1hd2FpdCBpLmFkZFVzZXIodSk7aWYoZiE9PTApcmV0dXJuIGY7cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIHAodm9pZCAwKX19O2NsYXNzIENye3VybDt3ZWJzb2NrZXQ7Y29uc3RydWN0b3IoZSl7dGhpcy51cmw9ZX1jb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy53ZWJzb2NrZXQhPT12b2lkIDAmJnRoaXMud2Vic29ja2V0LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTn1hc3luYyBjb25uZWN0KGUsdCxyPSgpPT57fSxuPSgpPT57fSl7bGV0e3VybDpzfT10aGlzO2lmKHRoaXMud2Vic29ja2V0KXRoaXMud2Vic29ja2V0LmNsb3NlKCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwO2xldCBpPW5ldyBxO2kud3JpdGVTdHJ1Y3QodWUsZSk7bGV0IG89aS5yZXN1bHQoKSxhPVNlKG8pO3JldHVybiBzLnNlYXJjaFBhcmFtcy5zZXQoInQiLGEpLHRoaXMud2Vic29ja2V0PW5ldyBXZWJTb2NrZXQocyksdGhpcy53ZWJzb2NrZXQuYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLHRoaXMud2Vic29ja2V0Lm9ub3Blbj0oKT0+e2NvbnNvbGUubG9nKCJDT05ORUNURUQiKSxuKCl9LHRoaXMud2Vic29ja2V0Lm9uY2xvc2U9KCk9Pntjb25zb2xlLmxvZygiRElTQ09OTkVDVEVEIiksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwLHIoKX0sdGhpcy53ZWJzb2NrZXQub25tZXNzYWdlPShjKT0+e2xldCB1PW5ldyBVaW50OEFycmF5KGMuZGF0YSk7dCh1KX0sdGhpcy53ZWJzb2NrZXQub25lcnJvcj0oYyk9Pntjb25zb2xlLmxvZyhgRVJST1I6ICR7SlNPTi5zdHJpbmdpZnkoYyl9YCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwLHIoKX0sUHJvbWlzZS5yZXNvbHZlKDApfWRpc2Nvbm5lY3QoKXt0aGlzLndlYnNvY2tldD8uY2xvc2UoKSx0aGlzLndlYnNvY2tldD12b2lkIDB9fXZhciByZT17dXNlcjp7cGF0aDoiL3VzZXIiLGVuZHBvaW50OnNzLG5hbWU6MH0scHVzaDp7cGF0aDoiL3B1c2giLGVuZHBvaW50Om5zLG5hbWU6Mn0scGVlazp7cGF0aDoiL3BlZWsiLGVuZHBvaW50OnRzLG5hbWU6MX0scHVsbDp7cGF0aDoiL3B1bGwiLGVuZHBvaW50OnJzLG5hbWU6M319LGNvPXswOnJlLnVzZXIsMjpyZS5wdXNoLDE6cmUucGVlaywzOnJlLnB1bGx9LEd1PXtbcmUudXNlci5wYXRoXTpyZS51c2VyLFtyZS5wdXNoLnBhdGhdOnJlLnB1c2gsW3JlLnBlZWsucGF0aF06cmUucGVlayxbcmUucHVsbC5wYXRoXTpyZS5wdWxsfTtjbGFzcyBpc3t1cmw7bGlzdGVuZXI7Y29uc3RydWN0b3IoZSl7dGhpcy51cmw9ZTt0aGlzLmxpc3RlbmVyPW5ldyBDcihlKX1hc3luYyBjYWxsKGUsdCl7bGV0e3BhdGg6cn09Y29bZV0sbj1uZXcgVVJMKHIsdGhpcy51cmwpO3RyeXtyZXR1cm4gYXdhaXQgdW8obix0KX1jYXRjaHtyZXR1cm4gZCgyNSl9fX12YXIgb3M9KGUpPT5uZXcgaXMoZS5oYW5kbGUpO2FzeW5jIGZ1bmN0aW9uIHVvKGUsdCl7bGV0IHI9YXdhaXQgZmV0Y2goZSx7bWV0aG9kOiJQT1NUIixib2R5OnQucmVzdWx0KCkuc2xpY2UoKX0pO2lmKCFyLm9rKXJldHVybiBkKDI0KTtsZXQgbj1hd2FpdCBOLmZyb21SZXNwb25zZShyKTtyZXR1cm4gcChuKX1jbGFzcyBLdHtlbmNsYXZlO2NyeXB0bztob3N0O2Nsb2NrO3RyYW5zcG9ydDt1cGRhdGVIb3N0TWV0YTtjb25zdHJ1Y3RvcihlLHQscixuLHMsaSl7dGhpcy5lbmNsYXZlPWU7dGhpcy5jcnlwdG89dDt0aGlzLmhvc3Q9cjt0aGlzLmNsb2NrPW47dGhpcy50cmFuc3BvcnQ9czt0aGlzLnVwZGF0ZUhvc3RNZXRhPWl9YXN5bmMgY2FsbChlLHQpe2xldHtjbG9jazpyLHRyYW5zcG9ydDpufT10aGlzLHtlbmRwb2ludDpzLG5hbWU6aX09ZSxvPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxhPXIubm93KCksW2MsdV09YXdhaXQgQXIobyxhKTtpZih1IT09MClyZXR1cm4gZCh1KTtsZXQgbD1uZXcgcSxmPWF3YWl0IHMuZW5jb2RlUmVxKHRoaXMsbyxjLHQsbCk7aWYoZiE9PTApcmV0dXJuIGQoZik7bGV0IGg9ci5ub3coKSxbeSxnXT1hd2FpdCBuLmNhbGwoaSxsKSxtPXIubm93KCk7aWYoZyE9PTApcmV0dXJuIGQoZyk7bGV0W1MsRV09eS5yZWFkU3RydWN0KGtyKTtpZihFIT09MClyZXR1cm4gZChFKTtpZihTLnN0YXR1cyE9PTApcmV0dXJuIGQoUy5zdGF0dXMpO2xldCB4PXtjbG9ja09mZnNldDplcyhoLFMudGltZVJjdmQsUy50aW1lU2VudCxtKSxzdWJzY3JpcHRpb246Uy5zdWJzY3JpcHRpb259LGI9YXdhaXQgdGhpcy51cGRhdGVIb3N0TWV0YSh4KTtpZihiIT09MClyZXR1cm4gZChiKTtyZXR1cm4gcy5kZWNvZGVSZXNwKHkpfWlkZW50aXR5PSgpPT57bGV0e2hvc3Q6ZSxlbmNsYXZlOnR9PXRoaXM7cmV0dXJuIHQuZGVyaXZlSWRlbnRpdHkoZS5sYWJlbCxlLmlkeD8/MCl9O3NlYWw9YXN5bmMoZSk9PntsZXR7Y3J5cHRvOnQsZW5jbGF2ZTpyfT10aGlzLG49YXdhaXQgdGhpcy5pZGVudGl0eSgpO3JldHVybiBabihlLG4sdCxyKX07cmVnaXN0ZXI9KCk9PnRoaXMuY2FsbChyZS51c2VyLFtdKTtwZWVrPShlKT0+dGhpcy5jYWxsKHJlLnBlZWssW2VdKTtwdXNoPShlKT0+dGhpcy5jYWxsKHJlLnB1c2gsZSk7cHVsbD0oZSk9PnRoaXMuY2FsbChyZS5wdWxsLGUpO2xpc3Rlbj1hc3luYyhlLHQscik9PntsZXR7Y2xvY2s6bix0cmFuc3BvcnQ6c309dGhpcyx7bGlzdGVuZXI6aX09cyxvPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxhPW4ubm93KCksW2MsdV09YXdhaXQgQXIobyxhKTtpZih1IT09MClyZXR1cm4gdTtyZXR1cm4gYXdhaXQgaS5jb25uZWN0KGMsZSx0LHIpfTtpc0Nvbm5lY3RlZCgpe2xldCBlPXRoaXMudHJhbnNwb3J0Py5saXN0ZW5lcjtpZihlJiZ0eXBlb2YgZS5jb25uZWN0ZWQ9PT0iZnVuY3Rpb24iKXJldHVybiBlLmNvbm5lY3RlZCgpO3JldHVybiEwfWNsb3NlTGlzdGVuZXIoKXt0aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI/LmRpc2Nvbm5lY3QoKX19dmFyIFRyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQubGJsKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuaWR4KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQubnVtKTtpZihzIT09MClyZXR1cm4gcztyZXR1cm4gZS53cml0ZUJ5dGVzKHQuaHNoKSxlLndyaXRlQnl0ZXModC5zaWcpLDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXRbYSxjXT1lLnJlYWRCeXRlcyhCdCk7aWYoYyE9PTApcmV0dXJuIGQoYyk7bGV0W3UsbF09ZS5yZWFkQnl0ZXMoQ2UpO2lmKGwhPT0wKXJldHVybiBkKGwpO3JldHVybiBwKHtsYmw6dCxpZHg6bixudW06aSxoc2g6YSxzaWc6dX0pfX07dmFyIFZ0PXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlU3RydWN0KFRyLHQuaGVhZCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuaW5kZXhFbmMpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlFbmMpO2lmKHMhPT0wKXJldHVybiBzO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkU3RydWN0KFRyKTtpZihyIT09MClyZXR1cm4gZChyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGQobyk7cmV0dXJuIHAoe2hlYWQ6dCxpbmRleEVuYzpuLGJvZHlFbmM6aX0pfX07dmFyIEhyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5sZW5Cb2R5KTtpZihuIT09MClyZXR1cm4gbjtpZih0LmxlbkJvZHk+MCYmdC5vZmZCb2R5IT09dm9pZCAwKXtsZXQgcz1lLndyaXRlVmFySW50KHQub2ZmQm9keSk7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhUZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gZChzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gZChvKTtsZXQgYTtpZihpPjApe2xldFtjLHVdPWUucmVhZFZhckludCgpO2lmKHUhPT0wKXJldHVybiBkKHUpO2E9Y31yZXR1cm4gcCh7a2RtOnQsaGVhZENwaDpuLGxlbkJvZHk6aSxvZmZCb2R5OmF9KX19O3ZhciBfdDsoKGFzKT0+e2FzLmRlZmF1bHRGaWxlRXh0ZW5zaW9uPSJkcGwiO2FzeW5jIGZ1bmN0aW9uIHQocyxpLG8sYSxjKXtsZXQgdT1hd2FpdCBjLmRlcml2ZUlkZW50aXR5KHMsaSksbD1uZXcgcSxmPW5ldyBxLGg9MCx5PTA7Zm9yKGxldCBBIG9mIG8pe2xldCBEPW5ldyBxLFQ9RC53cml0ZVN0cnVjdChmZSxBLmhlYWQpO2lmKFQhPT0wKXJldHVybiBkKFQpO2xldCBIPUQucmVzdWx0KCksVT1hd2FpdCB1LmtkbUZvcihIKSxPPWMuZGVyaXZlQ2lwaGVyKFUsImVuY3J5cHQiKSxLPWF3YWl0IE8uZW5jcnlwdChIKSxfPUEuYm9keT9hd2FpdCBPLmVuY3J5cHQoQS5ib2R5KTpuZXcgVWludDhBcnJheSgwKSxJPUEuaGVhZC5sZW4+MCYmQS5oZWFkLmhzaCE9PXZvaWQgMD9fLmxlbmd0aDowLHY9e2tkbTpVLGhlYWRDcGg6SyxsZW5Cb2R5Okksb2ZmQm9keTpJPjA/eTp2b2lkIDB9LEM9bC53cml0ZVN0cnVjdChIcix2KTtpZihDIT09MClyZXR1cm4gZChDKTtpZihBLmJvZHkpZi53cml0ZUJ5dGVzKF8pLHkrPV8ubGVuZ3RoO2grK31sZXQgZz1mLnJlc3VsdCgpLG09bC5yZXN1bHQoKSxTPWF3YWl0IGEuYmxha2UzKG0pLEU9YXdhaXQgdS5zaWduKFMpLHc9e2xibDpzLGlkeDppLG51bTpoLGhzaDpTLHNpZzpFfSx4PW5ldyBxO3gud3JpdGVTdHJ1Y3QoVnQse2hlYWQ6dyxpbmRleEVuYzptLGJvZHlFbmM6Z30pO2xldCBiPXgucmVzdWx0KCk7cmV0dXJuIHAoYil9YXMuZW5jb2RlRmlsZT10O2FzeW5jIGZ1bmN0aW9uIHIocyxpLG8pe2xldFthLGNdPVZ0LmRlY29kZShuZXcgTihzKSk7aWYoYyE9PTApcmV0dXJuIGQoYyk7bGV0e2hlYWQ6dSxpbmRleEVuYzpsLGJvZHlFbmM6Zn09YSxoPWF3YWl0IG8uZGVyaXZlSWRlbnRpdHkodS5sYmwsdS5pZHgpO2lmKCFhd2FpdCBpLmNoZWNrU2lnRWQyNTUxOSh1LnNpZyx1LmhzaCxoLnB1YmxpY0tleSkpcmV0dXJuIGQoMyk7bGV0IGc9YXdhaXQgaS5ibGFrZTMobCk7aWYoIVkoZyx1LmhzaCkpcmV0dXJuIGQoMTkpO2xldCBtPW5ldyBOKGwpLFM9W107Zm9yKGxldCB3PTA7dzx1Lm51bTt3Kyspe2xldFt4LGJdPW0ucmVhZFN0cnVjdChIcik7aWYoYiE9PTApcmV0dXJuIGQoYik7Uy5wdXNoKHgpfWlmKFMubGVuZ3RoIT09dS5udW0pcmV0dXJuIGQoMTQpO2xldCBFPVtdO2ZvcihsZXQgdyBvZiBTKXtsZXQgeD1vLmRlcml2ZUNpcGhlcih3LmtkbSwiZGVjcnlwdCIpLGI7dHJ5e2I9YXdhaXQgeC5kZWNyeXB0KHcuaGVhZENwaCl9Y2F0Y2h7cmV0dXJuIGQoMjApfWxldFtBLERdPWZlLmRlY29kZShuZXcgTihiKSk7aWYoRCE9PTApcmV0dXJuIGQoRCk7bGV0IFQ7aWYody5sZW5Cb2R5PjAmJncub2ZmQm9keSE9PXZvaWQgMCl7aWYoQS5oc2g9PT12b2lkIDApcmV0dXJuIGQoMTQpO2xldCBIPWYuc2xpY2Uody5vZmZCb2R5LHcub2ZmQm9keSt3LmxlbkJvZHkpO3RyeXtUPWF3YWl0IHguZGVjcnlwdChIKX1jYXRjaHtyZXR1cm4gZCgyMCl9bGV0IFU9YXdhaXQgaS5ibGFrZTMoVCk7aWYoIVkoVSxBLmhzaCkpcmV0dXJuIGQoMTkpfUUucHVzaCh7aGVhZDpBLGJvZHk6VH0pfXJldHVybiBwKEUpfWFzLmRlY29kZUZpbGU9cjthc3luYyBmdW5jdGlvbiBuKHMsaSxvLGEsYyl7bGV0W3UsbF09YXdhaXQgcihzLGksbyk7aWYobCE9PTApcmV0dXJuIGQobCk7bGV0W2YsaF09VnQuZGVjb2RlKG5ldyBOKHMpKTtpZihoIT09MClyZXR1cm4gZChoKTtsZXQgeT1hd2FpdCBjKHUpO3JldHVybiB0KGYuaGVhZC5sYmwsZi5oZWFkLmlkeCx5LGksYSl9YXMubWlncmF0ZUZpbGU9bn0pKF90fHw9e30pO2FzeW5jIGZ1bmN0aW9uIGNzKHtub3c6ZSxib2Q6dCxjcnlwdG86cix0eXA6bj0iIn0pe2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCksaT1uZXcgcSxvPWkud3JpdGVTdHJ1Y3QoZGUse2lkOnMsdHM6ZX0pO2lmKG8hPT0wKXJldHVybiBkKG8pO2xldCBhPWkucmVzdWx0KCk7cmV0dXJuIE50KHtub3c6ZSxlaWQ6YSxjdHI6MCx0eXA6bixib2Q6dCxjcnlwdG86cn0pfWFzeW5jIGZ1bmN0aW9uIE50KHtub3c6ZSxlaWQ6dCxjdHI6cix0eXA6bj0iIixib2Q6cyxjcnlwdG86aX0pe2xldCBvPW5ldyBOKHQpLFthLGNdPWRlLmRlY29kZShvKTtpZihjIT09MClyZXR1cm4gZChjKTtsZXQgdT1lLmdldFRpbWUoKS1hLnRzLmdldFRpbWUoKSxsLGY9cz8ubGVuZ3RoPz8wO2lmKHMmJmY+MClsPWF3YWl0IGkuYmxha2UzKHMpO3JldHVybiBwKHtlaWQ6dCxvZmY6dSxjdHI6cix0eXA6bixsZW46Zixoc2g6bH0pfWZ1bmN0aW9uIGxvKGUsdCl7bGV0IHI9ZS5sZW5ndGg8dC5sZW5ndGg/ZS5sZW5ndGg6dC5sZW5ndGg7Zm9yKGxldCBuPTA7bjxyO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4gZVtuXS10W25dO3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH1hc3luYyBmdW5jdGlvbiBtdChlLHQpe2xldCByPUFycmF5LmZyb20oZSk7ci5zb3J0KGxvKTtsZXQgbj0wO2ZvcihsZXQgbyBvZiByKW4rPW8ubGVuZ3RoO2xldCBzPW5ldyBVaW50OEFycmF5KG4pLGk9MDtmb3IobGV0IG8gb2YgcilzLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiB0LmJsYWtlMyhzKX1mdW5jdGlvbiBmbyhlKXtsZXQgdD1uZXcgcSxyPXQud3JpdGVWYXJCeXRlcyhlLmVpZCk7aWYociE9PTApcmV0dXJuIGQocik7bGV0IG49dC53cml0ZURhdGUoZS51cGRhdGVkQXQpO2lmKG4hPT0wKXJldHVybiBkKG4pO2xldCBzPXQud3JpdGVWYXJJbnQoZS5jdHIpO2lmKHMhPT0wKXJldHVybiBkKHMpO3JldHVybiBwKHQucmVzdWx0KCkpfWFzeW5jIGZ1bmN0aW9uIHF0KGUsdCl7bGV0IHI9W107Zm9yKGxldCBuIG9mIGUpe2xldFtzLGldPWZvKG4pO2lmKGkhPT0wfHwhcylyZXR1cm4gZChpKTtyLnB1c2gocyl9cmV0dXJuIHAoYXdhaXQgbXQocix0KSl9dmFyIHFsPVN5bWJvbCgiTWFzdGVyU2VlZCIpLEZsPVN5bWJvbCgiU2VhbGVkTWFzdGVyS2V5Iiksd2U9MzIsZHM9MjQrd2UrMTY7ZnVuY3Rpb24gVmUoZSl7aWYoZS5ieXRlTGVuZ3RoIT09ZHMpcmV0dXJuIGQoMTApO3JldHVybiBwKGUpfXZhciB6bD1TeW1ib2woIkVudGl0eUlEIik7ZnVuY3Rpb24gdXMoZSl7cmV0dXJuInR5cGUiaW4gZX12YXIgWGw9U3ltYm9sKCJEZXJpdmF0aW9uU2VlZCIpLGpsPVN5bWJvbCgiUHVibGljS2V5IiksJGw9U3ltYm9sKCJQcml2YXRlS2V5IiksR2w9U3ltYm9sKCJIb3N0U3BlY2lmaWNLZXlQYWlyIiksUWw9U3ltYm9sKCJIYXNoIik7ZnVuY3Rpb24gcG8oZSl7aWYoIWUpcmV0dXJuITE7aWYodHlwZW9mIGUhPT0ib2JqZWN0IilyZXR1cm4hMTtpZigiYm9keSJpbiBlPT09ITEpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaG8oZSl7aWYoZT09PW51bGx8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuO2lmKCEoInR5cGUiaW4gZSkpcmV0dXJuO2xldCB0PWUudHlwZTtpZih0eXBlb2YgdCE9PSJzdHJpbmciKXJldHVybjtyZXR1cm4gdH1mdW5jdGlvbiB5byhlKXtpZighZS5ib2R8fGUuYm9kLmxlbmd0aD09PTApe2xldCBpPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZH07cmV0dXJuIHAoaSl9bGV0IHQ9RXIoZS5ib2QpO2lmKHBvKHQpPT09ITEpcmV0dXJuIGNvbnNvbGUud2FybigibXNnIGJvZHkgaW52YWxpZCIsdCksZCgxNCk7bGV0IHI9ZS50eXA/PyIiLG49ci5sZW5ndGg+MD9yOmhvKHQpPz8iIixzPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZCxwaWQ6dC5waWQsdGFnczp0LnRhZ3MsdHlwZTpuLGJvZHk6dC5ib2R5fTtyZXR1cm4gcChzKX1jbGFzcyBGdHthcHBsaWVyO2VtaXR0ZXI9bmV3IGh0O2NsZWFyZXI7b25EaXJ0eUVpZHM7Y2FjaGVEcml2ZW47cGVlckluZ2VzdDtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmFwcGxpZXI9ZTt0aGlzLmNsZWFyZXI9dCx0aGlzLm9uRGlydHlFaWRzPXIsdGhpcy5jYWNoZURyaXZlbj1uPy5jYWNoZURyaXZlbj8/ITEsdGhpcy5wZWVySW5nZXN0PW4/LnBlZXJJbmdlc3R9YXBwbHk9YXN5bmMoZSk9PntsZXQgdD1bXSxyPVtdO2ZvcihsZXQgYSBvZiBlKXtsZXRbYyx1XT15byhhKTtpZihyLnB1c2godSksdSE9PTApY29udGludWU7dC5wdXNoKGMpfWxldHtzdGF0czpuLHR5cGVzOnMsZWlkczppfT1hd2FpdCB0aGlzLmFwcGxpZXIodCksbz1bXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7bGV0IGM9clthXSx1PW5bYV07aWYoYyE9PTApe28ucHVzaChjKTtjb250aW51ZX1pZih1IT09MCl7by5wdXNoKHUpO2NvbnRpbnVlfW8ucHVzaCgwKX1pZighdGhpcy5jYWNoZURyaXZlbilmb3IobGV0IGEgb2Ygcyl0aGlzLmVtaXR0ZXIuZW1pdChhLG51bGwpO2lmKGkubGVuZ3RoPjApdGhpcy5vbkRpcnR5RWlkcz8uKGkpO3JldHVybiBvfTtjbGVhcj1hc3luYygpPT57bGV0IGU9YXdhaXQgdGhpcy5jbGVhcmVyKCk7aWYoZSE9PTApcmV0dXJuIGU7cmV0dXJuIHRoaXMuZW1pdHRlci5lbWl0QWxsKG51bGwpLGV9O25vdGlmeT0oZSk9Pntmb3IobGV0IHQgb2YgZSl0aGlzLmVtaXR0ZXIuZW1pdCh0LG51bGwpfTtyZWZyZXNoPWFzeW5jKGUpPT57aWYodGhpcy5wZWVySW5nZXN0KXthd2FpdCB0aGlzLnBlZXJJbmdlc3QoZSk7cmV0dXJufX07b249KGUsdCk9Pnt0aGlzLmVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihlLHQpfTtvZmY9KGUsdCk9Pnt0aGlzLmVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1mdW5jdGlvbiBHKGUpe3JldHVybiJ0eXBlImluIGV9ZnVuY3Rpb24gbW8oZSx0KXtsZXQgcj10LmV4Y2x1ZGVTdGFydD9lPnQuc3RhcnQ6ZT49dC5zdGFydCxuPXQuZXhjbHVkZUVuZD9lPHQuZW5kOmU8PXQuZW5kO3JldHVybiByJiZufWZ1bmN0aW9uIGd0KGUpe2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBwKCEwKTtpZihlLnJhbmdlLnN0YXJ0PmUucmFuZ2UuZW5kKXJldHVybiBkKDEwKTtyZXR1cm4gcCghMCl9ZnVuY3Rpb24gTXIoZSx0KXtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTtyZXR1cm4gbW8oZSx0LnJhbmdlKX1mdW5jdGlvbiBnbyhlLHQpe2xldCByPXQuZXhjbHVkZVN0YXJ0P2U+dC5zdGFydDplPj10LnN0YXJ0LG49dC5leGNsdWRlRW5kP2U8dC5lbmQ6ZTw9dC5lbmQ7cmV0dXJuIHImJm59ZnVuY3Rpb24gU3QoZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIilyZXR1cm4gcChlLmxlbmd0aD4wKTtpZigicmFuZ2UiaW4gZSl7aWYoZS5yYW5nZS5zdGFydD5lLnJhbmdlLmVuZClyZXR1cm4gZCgxMCk7cmV0dXJuIHAoITApfXJldHVybiBwKGUucHJlZml4Lmxlbmd0aD4wKX1mdW5jdGlvbiBScihlLHQpe2lmKHR5cGVvZiB0PT09InN0cmluZyIpcmV0dXJuIGU9PT10O2lmKCJyYW5nZSJpbiB0KXJldHVybiBnbyhlLHQucmFuZ2UpO2lmKHQucHJlZml4Lmxlbmd0aD09PTApcmV0dXJuITE7cmV0dXJuIGUuc3RhcnRzV2l0aCh0LnByZWZpeCl9ZnVuY3Rpb24gU28oZSl7aWYoIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MClyZXR1cm47bGV0IHQ9bmV3IFNldCxyPVtdO2ZvcihsZXQgbiBvZiBlKXtpZih0eXBlb2YgbiE9PSJzdHJpbmcifHxuLmxlbmd0aD09PTApY29udGludWU7aWYodC5oYXMobikpY29udGludWU7dC5hZGQobiksci5wdXNoKG4pfXJldHVybiByLmxlbmd0aD4wP3I6dm9pZCAwfWZ1bmN0aW9uIFd0KGUpe3JldHVybntlaWQ6ZS5laWQsY3RyOmUuY3RyLHVwZGF0ZWRBdDplLnVwZGF0ZWRBdH19ZnVuY3Rpb24gbHMoZSl7bGV0IHQ9bmV3IE4oZS5laWQpLFtyLG5dPXQucmVhZFN0cnVjdChkZSk7aWYobiE9PTApcmV0dXJuIGQobik7cmV0dXJuIHAoe2VpZDplLmVpZCxjdHI6ZS5jdHIsdXBkYXRlZEF0Om5ldyBEYXRlKHIudHMuZ2V0VGltZSgpK2Uub2ZmKX0pfWZ1bmN0aW9uIFplKGUsdCl7bGV0IHI9bmV3IE4odC5laWQpLFtuLHNdPXIucmVhZFN0cnVjdChkZSk7aWYocyE9PTApcmV0dXJuIGQocyk7bGV0IGk9bmV3IERhdGUobi50cy5nZXRUaW1lKCkrdC5vZmYpO2lmKGUhPT12b2lkIDAmJmk8PWUudXBkYXRlZEF0KXJldHVybiBkKDE1KTtpZih1cyh0KSl7bGV0IG89U28odC50YWdzKTtyZXR1cm4gcCh7ZWlkOnQuZWlkLHBpZDp0LnBpZCwuLi5vIT09dm9pZCAwP3t0YWdzOm99Ont9LHR5cGU6dC50eXBlLGNyZWF0ZWRBdDpuLnRzLHVwZGF0ZWRBdDppLGN0cjp0LmN0cixib2R5OnQuYm9keX0pfXJldHVybiBwKHtlaWQ6dC5laWQsdXBkYXRlZEF0OmksY3RyOnQuY3RyfSl9ZnVuY3Rpb24gZXQoZSx0KXtsZXQgcj1uZXcgU2V0O2lmKGUhPT12b2lkIDAmJkcoZSkpci5hZGQoZS50eXBlKTtpZihHKHQpKXIuYWRkKHQudHlwZSk7cmV0dXJuWy4uLnJdfWNsYXNzIHp0e2luZmxpZ2h0PW51bGw7YWdhaW49ITE7cnVuKGUpe2lmKHRoaXMuYWdhaW49ITAsdGhpcy5pbmZsaWdodClyZXR1cm4gdGhpcy5pbmZsaWdodDtyZXR1cm4gdGhpcy5pbmZsaWdodD10aGlzLmRyYWluKGUpLHRoaXMuaW5mbGlnaHR9YXN5bmMgZmx1c2goKXtpZighdGhpcy5pbmZsaWdodClyZXR1cm47dHJ5e2F3YWl0IHRoaXMuaW5mbGlnaHR9Y2F0Y2h7fX1hc3luYyBkcmFpbihlKXt0cnl7dGhpcy5hZ2Fpbj0hMTtsZXQgdD1hd2FpdCBlKCk7d2hpbGUodGhpcy5hZ2Fpbil0aGlzLmFnYWluPSExLHQ9YXdhaXQgZSgpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5pbmZsaWdodD1udWxsfX19dmFyIGZzPTEwMDtjbGFzcyBMcnt0aW1lcj1udWxsO2RlbGF5TXM7d29yazt0YWlsPW5ldyB6dDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGVsYXlNcz1lPDA/MDplLHRoaXMud29yaz10fXNjaGVkdWxlKCl7aWYodGhpcy5kZWxheU1zPD0wKXt0aGlzLmZpcmUoKTtyZXR1cm59aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMudGltZXI9c2V0VGltZW91dCgoKT0+e3RoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKX0sdGhpcy5kZWxheU1zKX1hc3luYyBmbHVzaCgpe2lmKHRoaXMudGltZXIhPT1udWxsKWNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGwsdGhpcy5maXJlKCk7YXdhaXQgdGhpcy50YWlsLmZsdXNoKCl9Y2FuY2VsKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbH1maXJlKCl7cmV0dXJuIHRoaXMudGFpbC5ydW4odGhpcy53b3JrKX19dmFyIHBzPSExO2Z1bmN0aW9uIGhzKGUpe3BzPWU9PT0hMH1mdW5jdGlvbiBGKGUsdCl7aWYoIXBzKXJldHVybjtsZXQgcj1NYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKTtpZih0IT09dm9pZCAwKWNvbnNvbGUud2FybihgW2RpcCAke3J9bXNdICR7ZX1gLHQpO2Vsc2UgY29uc29sZS53YXJuKGBbZGlwICR7cn1tc10gJHtlfWApfWZ1bmN0aW9uIHlzKGUpe2xldCB0PW5ldyBOKGUuZWlkKSxbcixuXT1kZS5kZWNvZGUodCk7aWYobiE9PTApcmV0dXJuO3JldHVybiByLnRzLmdldFRpbWUoKStlLm9mZn1mdW5jdGlvbiBibyhlLHQpe2xldCByPXlzKGUpLG49eXModCk7aWYocj09PXZvaWQgMCYmbj09PXZvaWQgMClyZXR1cm4gMDtpZihyPT09dm9pZCAwKXJldHVybiAxO2lmKG49PT12b2lkIDApcmV0dXJuLTE7aWYobiE9PXIpcmV0dXJuIG4tcjtyZXR1cm4gdC5jdHItZS5jdHJ9ZnVuY3Rpb24gdHQoZSx0KXtyZXR1cm4gZS5zbGljZSgpLnNvcnQoKHIsbik9PmJvKHQociksdChuKSkpfXZhciBPcj17cGhhc2U6ImlkbGUifSxidD01MDtmdW5jdGlvbiBLcihlLHQscil7aWYoZTw9MHx8dDw9MClyZXR1cm4hMTtpZihlPT09MXx8ZT09PXQpcmV0dXJuITA7cmV0dXJuIGUlcj09PTB9ZnVuY3Rpb24gbXMoZSx0KXtpZih0eXBlb2YgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2I9PT0iZnVuY3Rpb24iKXtuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihlLHQpO3JldHVybn1sZXQgcj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO24uaHJlZj1yLG4uZG93bmxvYWQ9dCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG4pLG4uY2xpY2soKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG4pLFVSTC5yZXZva2VPYmplY3RVUkwocil9ZnVuY3Rpb24gZ3MoZSx0LHIpe2xldCBuPVtdLHM9W10saT0wO2ZvcihsZXQgbyBvZiBlKXtsZXQgYT10KG8pO2lmKHMubGVuZ3RoPjAmJmkrYT5yKW4ucHVzaChzKSxzPVtdLGk9MDtpZihzLnB1c2gobyksaSs9YSxpPj1yKW4ucHVzaChzKSxzPVtdLGk9MH1pZihzLmxlbmd0aD4wKW4ucHVzaChzKTtyZXR1cm4gbn1hc3luYyBmdW5jdGlvbiBWcihlLHQscil7bGV0IG49ZS5sZW5ndGg7aWYobjwxKXJldHVybltdO2xldCBzPUFycmF5KG4pLGk9MCxvPU1hdGgubWluKE1hdGgubWF4KDEsdCksbiksYT1hc3luYygpPT57d2hpbGUoITApe2xldCB1PWk7aWYoaSs9MSx1Pj1uKXJldHVybjtzW3VdPWF3YWl0IHIoZVt1XSx1KX19LGM9W107Zm9yKGxldCB1PTA7dTxvO3UrKyljLnB1c2goYSgpKTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoYyksc31hc3luYyBmdW5jdGlvbiBYdChlLHQscixuKXtsZXQgcz1uZXcgTihlLmhlYWRDcGgpLFtpLG9dPXMucmVhZFN0cnVjdChMdCk7aWYobyE9PTApcmV0dXJuIGQobyk7bGV0e3NpZzphLGtkbTpjLGhlYWRDcGg6dX09aTtpZighYXdhaXQgbi5jaGVja1NpZ0VkMjU1MTkoYSx1LHQpKXJldHVybiBkKDMpO2xldCBmPXIuZGVyaXZlQ2lwaGVyKGMsImRlY3J5cHQiKSxoO3RyeXtoPWF3YWl0IGYuZGVjcnlwdCh1KX1jYXRjaHtyZXR1cm4gZCgyMCl9cmV0dXJuIHAoe2tkbTpjLGhlYWRFbmM6aH0pfXZhciBudD0iZiIsanQ9InQiLHJ0PSJlIjtmdW5jdGlvbiB3byhlKXtpZihlPT09ITB8fGU9PT1qdClyZXR1cm4ganQ7aWYoZT09PXJ0KXJldHVybiBydDtyZXR1cm4gbnR9ZnVuY3Rpb24gU3MoZSl7cmV0dXJuIGUhPT0wJiZlIT09MTUmJmUhPT0xOCYmZSE9PTE3fWZ1bmN0aW9uIF9yKGUsdCxyKXtpZihlLmFwbGQ9dCx0PT09cnQmJnIhPT12b2lkIDApZS5lcnI9cjtlbHNlIGRlbGV0ZSBlLmVycn1hc3luYyBmdW5jdGlvbiAkdChlLHQscixuKXtsZXQgcz1uPy5ib2R5IT09ITEsaT13byh0LmFwbGQpLG89dC5ib2R5LGE9bz8ubGVuZ3RoPz8wLGM7aWYocyYmbyYmYT4wKWM9YXdhaXQgci5ibGFrZTMobyk7bGV0IHU9e2VpZDp0LmVpZCxvZmY6dC5vZmY/PzAsY3RyOnQuY3RyPz8wLHR5cDp0LnR5cD8/IiIsbGVuOmEsaHNoOmN9LGw9e2hhc2g6ZSxoZWFkOnUsYXBsZDppfTtpZihzJiZvIT09dm9pZCAwKWwuYm9keT1vO2lmKGk9PT1ydCYmdC5lcnIhPT12b2lkIDApbC5lcnI9dC5lcnI7cmV0dXJuIGx9dmFyIE5yPTEwNDg1NzYscXI9MTA0ODU3Nix3cz02NDtmdW5jdGlvbiBJbyhlKXtyZXR1cm4gZS5zaWcubGVuZ3RoK2Uua2RtLmxlbmd0aCtlLmhlYWRDcGgubGVuZ3RoK2UuYm9keUNwaC5sZW5ndGh9YXN5bmMgZnVuY3Rpb24geG8oZSx0LHIsbixzKXtpZihuLmxlbmd0aDwxKXJldHVybiAwO2xldFtpLG9dPWF3YWl0IGUucHVzaChuKTtpZihvIT09MClyZXR1cm4gbztpZighaSlyZXR1cm4gMjc7Zm9yKGxldCBjIG9mIGkpe2lmKGMuc3RhdHVzIT09MCl7Y29uc29sZS5lcnJvcigicHVzaCBlcnIiLGMpO2NvbnRpbnVlfWxldCB1PXNbYy5pZHhdO2lmKCF1KXtjb25zb2xlLmVycm9yKCJubyBoYXNoIixjKTtjb250aW51ZX1hd2FpdCB0LnVwbG9hZHMuZGVxKHIsW3VdKX1sZXQgYT1hd2FpdCB0Lmhvc3RzLmdldChyKTtpZihhKXtsZXQgYz1hLmxhc3RTZXEsdT1jLGw9W107Zm9yKGxldCBmIG9mIGkpaWYoZi5zdGF0dXM9PT0wKWwucHVzaChmLnNlcSk7bC5zb3J0KChmLGgpPT5mLWgpO2ZvcihsZXQgZiBvZiBsKWlmKGY9PT1jKzEpYz1mO2lmKGM+dSlhd2FpdCB0Lmhvc3RzLnRvdWNoKHIsYyl9cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gYnMoZSx0KXtpZih0Lmxlbmd0aDwxKXJldHVybiBwKFtdKTtsZXQgcj1uZXcgTWFwLG49W107Zm9yKGxldCBhIG9mIHQpci5zZXQoYS5zZXEsYSksbi5wdXNoKGEuc2VxKTtsZXRbcyxpXT1hd2FpdCBlLnB1bGwobik7aWYoaSE9PTApcmV0dXJuIGQoaSk7aWYoIXMpcmV0dXJuIGQoMjcpO2xldCBvPVtdO2ZvcihsZXR7c2VxOmEsYm9keUNwaDpjfW9mIHMpe2xldCB1PXIuZ2V0KGEpO2lmKCF1KWNvbnRpbnVlO28ucHVzaCh7ZGw6dSxib2R5Q3BoOmN9KX1yZXR1cm4gcChvKX1hc3luYyBmdW5jdGlvbiBFbyhlLHQscixuKXtpZihuLmxlbmd0aDwxKXJldHVybiBwKHtwYXJ0czpbXSxoYXNoZXM6W119KTtsZXQgcz1bXSxpPVtdLG89W10sYT1uZXcgTWFwO2ZvcihsZXR7ZGw6dSxib2R5Q3BoOmx9b2Ygbil7bGV0e2hlYWQ6ZixrZG06aCxzZXE6eSxob3N0Omd9PXUsW20sU109YXdhaXQgSXModSxyKTtpZihTIT09MHx8IW0pe2xldCBVPWEuZ2V0KGcpPz9bXTtVLnB1c2goeSksYS5zZXQoZyxVKTtjb250aW51ZX1sZXR7aGVhZEVuYzpFLGhlYWRFbmNIYXNoOnd9PW0seD10LmRlcml2ZUNpcGhlcihoLCJkZWNyeXB0IiksW2IsQV09YXdhaXQgUHIoRSxsLHgscix3KTtpZihBIT09MHx8IWIpe2xldCBVPWEuZ2V0KGcpPz9bXTtVLnB1c2goeSksYS5zZXQoZyxVKTtjb250aW51ZX1sZXQgRD17aGVhZDpmLGJvZHk6Yi5ib2R9LFQ9Yi5oZWFkSGFzaDtvLnB1c2goe2tleTpULGRhdGE6QXMoRCl9KSxzLnB1c2goRCksaS5wdXNoKFQpO2xldCBIPWEuZ2V0KGcpPz9bXTtILnB1c2goeSksYS5zZXQoZyxIKX1sZXQgYz1hd2FpdCBlLm1lc3NhZ2VzLmFkZChvKTtmb3IobGV0W3UsbF1vZiBhKWF3YWl0IGUuZG93bmxvYWRzLmRlcSh1LGwpO2ZvcihsZXQgdT0wO3U8Yy5sZW5ndGg7dSsrKXtsZXQgbD1jW3VdO2lmKGwhPT0wJiZsIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLEJbbF0sImZvciBtZXNzYWdlIix1KX1yZXR1cm4gcCh7cGFydHM6cyxoYXNoZXM6aX0pfWFzeW5jIGZ1bmN0aW9uIElzKGUsdCl7bGV0IHI9ZS5oZWFkRW5jO2lmKCFyKXtsZXQgcz1uZXcgcSxpPXMud3JpdGVTdHJ1Y3QoZmUsZS5oZWFkKTtpZihpIT09MClyZXR1cm4gZChpKTtyPXMucmVzdWx0KCl9aWYoZS5oZWFkRW5jSGFzaClyZXR1cm4gcCh7aGVhZEVuYzpyLGhlYWRFbmNIYXNoOmUuaGVhZEVuY0hhc2h9KTtsZXQgbj1hd2FpdCB0LmJsYWtlMyhyKTtyZXR1cm4gcCh7aGVhZEVuYzpyLGhlYWRFbmNIYXNoOm59KX1hc3luYyBmdW5jdGlvbiB4cyhlLHQscil7bGV0IG49bmV3IFNldDtmb3IobGV0IG8gb2YgdCluLmFkZChSKG8pKTtpZihuLnNpemU8MSlyZXR1cm47bGV0IHM9QXJyYXkuZnJvbShhd2FpdCBlLmRvd25sb2Fkcy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuO2xldCBpPW5ldyBNYXA7Zm9yKGxldCBvIG9mIHMpe2xldCBhO2lmKG8uaGVhZEVuY0hhc2gpYT1SKG8uaGVhZEVuY0hhc2gpO2Vsc2V7bGV0W3UsbF09YXdhaXQgSXMobyxyKTtpZihsIT09MHx8IXUpY29udGludWU7YT1SKHUuaGVhZEVuY0hhc2gpfWlmKCFuLmhhcyhhKSljb250aW51ZTtsZXQgYz1pLmdldChvLmhvc3QpPz9bXTtjLnB1c2goby5zZXEpLGkuc2V0KG8uaG9zdCxjKX1mb3IobGV0W28sYV1vZiBpKWF3YWl0IGUuZG93bmxvYWRzLmRlcShvLGEpfWFzeW5jIGZ1bmN0aW9uIEZyKHtjb25uOmUsc3RvcmU6dCxlbmNsYXZlOnIsaG9zdDpuLGNyeXB0bzpzLG9uUHJvZ3Jlc3M6aSxwZWVrUHJvZ3Jlc3NFdmVyeTpvLHBlZWtDb25jdXJyZW5jeTphfSl7bGV0IGM9YXdhaXQgZS5pZGVudGl0eSgpLHU9W10sW2wsZl09YXdhaXQgZS5wZWVrKG4ubGFzdFNlcSk7aWYoZiE9PTApcmV0dXJuIGY7bGV0IGg9bC5sZW5ndGgseT1vPz9idCxnPWE/P3dzO2lmKGkmJmg+MClpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6MCx0b3RhbDpofSk7bGV0IG09MCxTPWF3YWl0IFZyKGwsZyxhc3luYyh3KT0+e2xldFt4LGJdPWF3YWl0IFh0KHcsYy5wdWJsaWNLZXkscixzKSxBO2lmKGIhPT0wfHwheClBPXtvazohMSxzZXE6dy5zZXEsc3RhdDpifTtlbHNle2xldCBEPWF3YWl0IHMuYmxha2UzKHguaGVhZEVuYyk7QT17b2s6ITAsc2VxOncuc2VxLGtkbTp4LmtkbSxoZWFkRW5jOnguaGVhZEVuYyxoZWFkRW5jSGFzaDpEfX1pZihtKz0xLGkmJktyKG0saCx5KSlpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6bSx0b3RhbDpofSk7cmV0dXJuIEF9KSxFPW5ldyBTZXQ7Zm9yKGxldCB3IG9mIFMpe2lmKCF3Lm9rKXtjb25zb2xlLmVycm9yKCJwZWVrOiBkZWNyeXB0aW5nIGl0ZW0gaGVhZCIsdy5zdGF0KTtjb250aW51ZX1sZXQgeD1SKHcuaGVhZEVuY0hhc2gpO2lmKGF3YWl0IHQubWVzc2FnZXMuaGFzKHcuaGVhZEVuY0hhc2gpKXtjb25zb2xlLmluZm8oInBlZWs6IGxvY2FsIG1zZzsgc2tpcCBkb3dubG9hZCwgZGVxIHVwbG9hZCIpLGF3YWl0IHQudXBsb2Fkcy5kZXEobi5sYWJlbCxbdy5oZWFkRW5jSGFzaF0pLGF3YWl0IHQuZG93bmxvYWRzLmRlcShuLmxhYmVsLFt3LnNlcV0pO2NvbnRpbnVlfWlmKEUuaGFzKHgpKXthd2FpdCB0LmRvd25sb2Fkcy5kZXEobi5sYWJlbCxbdy5zZXFdKTtjb250aW51ZX1sZXQgQT1uZXcgTih3LmhlYWRFbmMpLFtELFRdPUEucmVhZFN0cnVjdChmZSk7aWYoVCE9PTApe2NvbnNvbGUuZXJyb3IoInBlZWs6IHJlYWRpbmcgaXRlbSBoZWFkIixUKTtjb250aW51ZX1FLmFkZCh4KSx1LnB1c2goe2tkbTp3LmtkbSxoZWFkOkQsc2VxOncuc2VxLGhvc3Q6bi5sYWJlbCxoZWFkRW5jOncuaGVhZEVuYyxoZWFkRW5jSGFzaDp3LmhlYWRFbmNIYXNofSl9aWYoYXdhaXQgdC5kb3dubG9hZHMuZW5xKHUpLGwubGVuZ3RoPjApe2xldCB3PU1hdGgubWF4KC4uLmwubWFwKCh4KT0+eC5zZXEpKTthd2FpdCB0Lmhvc3RzLnJlY29yZFN0YXRzKG4ubGFiZWwse2xhc3RTZXE6d30pfWlmKGkpaSh7cGhhc2U6InBlZWsiLGhvc3Q6bi5sYWJlbCxkb25lOmgsdG90YWw6aH0pO3JldHVybiAwfWFzeW5jIGZ1bmN0aW9uIEVzKHtjb25uOmUsc3RvcmU6dCxob3N0OnIsbWF4UHVzaEJ5dGVzOm4sb25Qcm9ncmVzczpzfSl7bGV0IGk9bj8/TnIsbz1hd2FpdCB0LnVwbG9hZHMubGlzdChyLmxhYmVsKSxhPW8ubGVuZ3RoLGM9MDtpZihzJiZhPjApcyh7cGhhc2U6InB1c2giLGhvc3Q6ci5sYWJlbCxkb25lOjAsdG90YWw6YX0pO2xldCB1PVtdLGw9W10sZj0wLGg9YXN5bmMoKT0+e2lmKHUubGVuZ3RoPDEpcmV0dXJuIDA7bGV0IHk9dS5sZW5ndGgsZz1hd2FpdCB4byhlLHQsci5sYWJlbCx1LGwpO2lmKHU9W10sbD1bXSxmPTAsZz09PTApe2lmKGMrPXkscylzKHtwaGFzZToicHVzaCIsaG9zdDpyLmxhYmVsLGRvbmU6Yyx0b3RhbDphfSl9cmV0dXJuIGd9O2ZvcihsZXQgeSBvZiBvKXtsZXQgZz1hd2FpdCB0Lm1lc3NhZ2VzLmdldCh5KTtpZighZyl7Yys9MTtjb250aW51ZX1sZXQgbT17Li4uZy5oZWFkLGJvZDpnLmJvZHl9LFtTLEVdPWF3YWl0IGUuc2VhbChtKTtpZihFIT09MClyZXR1cm4gRTtpZighUylyZXR1cm4gMTI7bGV0IHc9SW8oUyk7aWYodS5sZW5ndGg+MCYmZit3Pmkpe2xldCB4PWF3YWl0IGgoKTtpZih4IT09MClyZXR1cm4geH1pZih1LnB1c2goUyksbC5wdXNoKHkpLGYrPXcsZj49aSl7bGV0IHg9YXdhaXQgaCgpO2lmKHghPT0wKXJldHVybiB4fX1yZXR1cm4gaCgpfWFzeW5jIGZ1bmN0aW9uIFdyKHtjb25uOmUsc3RvcmU6dCxlbmNsYXZlOnIsaG9zdDpuLGNyeXB0bzpzLG1heFB1bGxCeXRlczppLG9uUHJvZ3Jlc3M6b30sYSl7bGV0IGM9aT8/cXIsdT1hd2FpdCB0LmRvd25sb2Fkcy5saXN0KCksbD1BcnJheS5mcm9tKHUpLmZpbHRlcigoUyk9PlMuaG9zdD09PW4ubGFiZWwpO2lmKGwubGVuZ3RoPDEpcmV0dXJuIDE1O2xldCBmPXR0KGwsKFMpPT5TLmhlYWQpLGg9Z3MoZiwoUyk9PlMuaGVhZC5sZW4sYykseT1mLmxlbmd0aCxnPTA7aWYobylvKHtwaGFzZToicHVsbCIsaG9zdDpuLmxhYmVsLGRvbmU6MCx0b3RhbDp5fSk7bGV0IG09YnMoZSxoWzBdKTtmb3IobGV0IFM9MDtTPGgubGVuZ3RoO1MrKyl7bGV0W0Usd109YXdhaXQgbTtpZih3IT09MHx8IUUpcmV0dXJuIHc7aWYoZys9aFtTXS5sZW5ndGgsbylvKHtwaGFzZToicHVsbCIsaG9zdDpuLmxhYmVsLGRvbmU6Zyx0b3RhbDp5fSk7bGV0IHg9aFtTKzFdO2lmKHgpbT1icyhlLHgpO2lmKG8pbyh7cGhhc2U6Im9wZW4iLGhvc3Q6bi5sYWJlbCxkb25lOmcsdG90YWw6eX0pO2xldCBiPXR0KEUsKEQpPT5ELmRsLmhlYWQpLFssQV09YXdhaXQgRW8odCxyLHMsYik7aWYoQSE9PTApcmV0dXJuIEE7aWYoYSl7aWYobylvKHtwaGFzZToiZXhlYyIsaG9zdDpuLmxhYmVsLGRvbmU6Zyx0b3RhbDp5fSk7YXdhaXQgYSgpfX1yZXR1cm4gMH1mdW5jdGlvbiBBcyh7aGVhZDplLGJvZHk6dH0pe2xldCByPXtlaWQ6ZS5laWQsYm9keTp0LGFwbGQ6bnR9O2lmKGUub2ZmIT09MClyLm9mZj1lLm9mZjtpZihlLmN0ciE9PTApci5jdHI9ZS5jdHI7aWYoZS50eXApci50eXA9ZS50eXA7cmV0dXJuIHJ9YXN5bmMgZnVuY3Rpb24gUHMoZSx7Y29ubjp0LHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6cyxjcnlwdG86aSxvblByb2dyZXNzOm99LGEpe2xldCBjPXMubGFiZWwsdT1hd2FpdCB0LmlkZW50aXR5KCksbD1uZXcgTihlKSxbZixoXT1sLnJlYWRTdHJ1Y3RzKFJ0KTtpZihoIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY29kaW5nIG5vdGlmIixCW2hdKTtyZXR1cm59bGV0IHk9ITEsbT0oYXdhaXQgci5ob3N0cy5nZXQoYykpPy5sYXN0U2VxLFM9W10sRT0hMTtmb3IobGV0IGIgb2YgZil7bGV0W0EsRF09YXdhaXQgWHQoe3NlcTpiLnNlcSxoZWFkQ3BoOmIuaGVhZENwaH0sdS5wdWJsaWNLZXksbixpKTtpZihEIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY3J5cHRpbmcgbm90aWYiLEJbRF0pO2NvbnRpbnVlfWxldCBUPWF3YWl0IGkuYmxha2UzKEEuaGVhZEVuYyk7aWYoYXdhaXQgci5tZXNzYWdlcy5oYXMoVCkpY29udGludWU7bGV0IEg9bmV3IE4oQS5oZWFkRW5jKSxbVSxPXT1ILnJlYWRTdHJ1Y3QoZmUpO2lmKE8hPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcGFyc2UgaGVhZCIsQltPXSk7Y29udGludWV9aWYoIWIuYm9keUNwaCYmVS5sZW4+MClFPSEwLGF3YWl0IHIuZG93bmxvYWRzLmVucShbe3NlcTpiLnNlcSxob3N0OmMsa2RtOkEua2RtLGhlYWQ6VSxoZWFkRW5jOkEuaGVhZEVuYyxoZWFkRW5jSGFzaDpUfV0pO2Vsc2UgUy5wdXNoKHsuLi5BLGhlYWQ6VSxib2R5Q3BoOmIuYm9keUNwaCxoZWFkRW5jSGFzaDpUfSk7aWYobT09PXZvaWQgMHx8Yi5zZXEhPT1tKzEpY29uc29sZS5sb2coIm91dCBvZiBzZXEiLGIuc2VxLG0pLHk9ITA7ZWxzZSBtPWIuc2VxfWlmKG0hPT12b2lkIDApYXdhaXQgci5ob3N0cy50b3VjaChzLmxhYmVsLG0pO2xldCB3PVtdO2ZvcihsZXQgYiBvZiBTKXtsZXQgQT1uLmRlcml2ZUNpcGhlcihiLmtkbSwiZGVjcnlwdCIpLFtELFRdPWF3YWl0IFByKGIuaGVhZEVuYyxiLmJvZHlDcGgsQSxpKTtpZihUIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIG9wZW4gYm9keSIsQltUXSk7Y29udGludWV9dy5wdXNoKHtrZXk6Yi5oZWFkRW5jSGFzaCxkYXRhOkFzKHtoZWFkOmIuaGVhZCxib2R5OkQuYm9kfSl9KX1sZXQgeD1hd2FpdCByLm1lc3NhZ2VzLmFkZCh3KTtmb3IobGV0IGI9MDtiPHgubGVuZ3RoO2IrKyl7bGV0IEE9eFtiXTtpZihBIT09MCYmQSE9PTE1KWNvbnNvbGUuZXJyb3IoIkVSUiBzdG9yaW5nIixCW0FdLCJmb3IgbWVzc2FnZSIsYil9aWYobyYmdy5sZW5ndGg+MClvKHtwaGFzZToib3BlbiIsaG9zdDpzLmxhYmVsLGRvbmU6dy5sZW5ndGgsdG90YWw6dy5sZW5ndGh9KTtpZih5fHxFfHx3Lmxlbmd0aD4wKWEoKX1hc3luYyBmdW5jdGlvbiB6cihlLHQ9e30pe2xldCByPXQucHVsbCE9PSExLG49dC5wdXNoPT09ITAse2Nvbm46cyxzdG9yZTppLGVuY2xhdmU6byxob3N0OmEsY3J5cHRvOmMsb25Qcm9ncmVzczp1LHBlZWtQcm9ncmVzc0V2ZXJ5OmwscGVla0NvbmN1cnJlbmN5OmZ9PWUsaD1hd2FpdCBzLmlkZW50aXR5KCksW3ksZ109YXdhaXQgcy5wZWVrKDApO2lmKGchPT0wKXJldHVybiBkKGcpO2xldCBtPXkubGVuZ3RoLFM9bD8/YnQsRT1mPz93cztpZih1JiZtPjApdSh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOjAsdG90YWw6bX0pO2xldCB3PTAseD1hd2FpdCBWcih5LEUsYXN5bmModik9PntsZXRbQyxMXT1hd2FpdCBYdCh2LGgucHVibGljS2V5LG8sYyksTTtpZihMIT09MHx8IUMpTT17b2s6ITEsc2VxOnYuc2VxLHN0YXQ6TH07ZWxzZXtsZXQgaz1hd2FpdCBjLmJsYWtlMyhDLmhlYWRFbmMpO009e29rOiEwLHNlcTp2LnNlcSxrZG06Qy5rZG0saGVhZEVuYzpDLmhlYWRFbmMsaGVhZEVuY0hhc2g6a319aWYodys9MSx1JiZLcih3LG0sUykpdSh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOncsdG90YWw6bX0pO3JldHVybiBNfSksYj1uZXcgTWFwO2ZvcihsZXQgdiBvZiB4KXtpZighdi5vayljb250aW51ZTtsZXQgQz1SKHYuaGVhZEVuY0hhc2gpLEw9Yi5nZXQoQyk7aWYoTClMLmNvdW50Kz0xO2Vsc2UgYi5zZXQoQyx7aGFzaDp2LmhlYWRFbmNIYXNoLGNvdW50OjEsc2FtcGxlOnZ9KX1sZXQgQT0wLEQ9W107Zm9yKGxldCB2IG9mIGIudmFsdWVzKCkpe2lmKHYuY291bnQ+MSlBKz12LmNvdW50LTE7RC5wdXNoKHYuaGFzaCl9bGV0IFQ9eS5sZW5ndGgsSD1iLnNpemUsVT1hd2FpdCBtdChELGMpLE89W10sSz0wO2ZvcihsZXQgdiBvZiBiLnZhbHVlcygpKXtpZihhd2FpdCBpLm1lc3NhZ2VzLmhhcyh2Lmhhc2gpKXthd2FpdCBpLnVwbG9hZHMuZGVxKGEubGFiZWwsW3YuaGFzaF0pO2NvbnRpbnVlfWlmKEsrPTEsIXIpY29udGludWU7bGV0IEw9di5zYW1wbGUsTT1uZXcgTihMLmhlYWRFbmMpLFtrLGpdPU0ucmVhZFN0cnVjdChmZSk7aWYoaiE9PTApe2NvbnNvbGUuZXJyb3IoInJlY29uY2lsZTogcmVhZGluZyBtc2cgaGVhZGVyIixqKTtjb250aW51ZX1PLnB1c2goe2tkbTpMLmtkbSxoZWFkOmssc2VxOkwuc2VxLGhvc3Q6YS5sYWJlbCxoZWFkRW5jOkwuaGVhZEVuYyxoZWFkRW5jSGFzaDpMLmhlYWRFbmNIYXNofSl9aWYoTy5sZW5ndGg+MClhd2FpdCBpLmRvd25sb2Fkcy5lbnEoTyk7bGV0IF89MDtpZihuKXtsZXQgdj1hd2FpdCBpLm1lc3NhZ2VzLmxpc3RLZXlzKCksQz1uZXcgU2V0KGIua2V5cygpKSxMPVtdO2ZvcihsZXQgTSBvZiB2KWlmKCFDLmhhcyhSKE0pKSlfKz0xLEwucHVzaChNKTtpZihMLmxlbmd0aD4wKWF3YWl0IGkudXBsb2Fkcy5lbnEoYS5sYWJlbCxMKX1lbHNle2xldCB2PWF3YWl0IGkubWVzc2FnZXMubGlzdEtleXMoKSxDPW5ldyBTZXQoYi5rZXlzKCkpO2ZvcihsZXQgTCBvZiB2KWlmKCFDLmhhcyhSKEwpKSlfKz0xfWxldCBJPXkubGVuZ3RoPjA/TWF0aC5tYXgoLi4ueS5tYXAoKHYpPT52LnNlcSkpOjA7aWYoYXdhaXQgaS5ob3N0cy5yZWNvcmRTdGF0cyhhLmxhYmVsLHtzZXRMYXN0U2VxOkl9KSx1KXUoe3BoYXNlOiJwZWVrIixob3N0OmEubGFiZWwsZG9uZTptLHRvdGFsOm19KTtyZXR1cm4gcCh7bXNnY2hlY2s6VSxudW1CYWdzOlQsdW5pcXVlTXNnczpILG51bUR1cGVzOkEsbWlzc2luZ0xvY2FsOkssbWlzc2luZ0hvc3Q6X30pfWZ1bmN0aW9uIEFvKGUpe3JldHVybiBlLm1hcCgoe2hlYWQ6dCxib2R5OnJ9KT0+KHsuLi50LGJvZDpyfSkpfWNsYXNzIFhye2Nsb2NrO3N0YXRlO3N0b3JlO3RyYW5zcG9ydDtjcnlwdG87Zm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ7b25TY2hlZHVsZVN5bmM7Y29ubmVjdGlvbnM9bmV3IE1hcDthcHBseUNoYWluPVByb21pc2UucmVzb2x2ZSgpO3N5bmNSdW5zPW5ldyB6dDtjbGllbnRTdGF0ZTt4ZmVyU3RhdGU7bWF4UHVzaEJ5dGVzO21heFB1bGxCeXRlcztwZWVrUHJvZ3Jlc3NFdmVyeT1idDtsYXN0UHJvZ3Jlc3M9T3I7c2NoZWR1bGVkU3luYztjb25zdHJ1Y3RvcihlLHQscixuLHMsaT0hMCxvPU5yLGE9cXIsYyl7dGhpcy5jbG9jaz1lO3RoaXMuc3RhdGU9dDt0aGlzLnN0b3JlPXI7dGhpcy50cmFuc3BvcnQ9bjt0aGlzLmNyeXB0bz1zO3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ9aTt0aGlzLm9uU2NoZWR1bGVTeW5jPWM7dGhpcy5tYXhQdXNoQnl0ZXM9byx0aGlzLm1heFB1bGxCeXRlcz1hLHRoaXMuY2xpZW50U3RhdGU9bmV3IEtlKCgpPT50aGlzLmdldENsaWVudFN0YXRlKCkpLHRoaXMueGZlclN0YXRlPW5ldyBLZSgoKT0+dGhpcy5nZXRYZmVyU3RhdGUoKSksdGhpcy5zY2hlZHVsZWRTeW5jPW5ldyBMcihmcyxhc3luYygpPT57dHJ5e2NvbnNvbGUuaW5mbygiUnVubmluZyBzY2hlZHVsZWQgc3luYyIpLGF3YWl0IHRoaXMuc3luYygpfWNhdGNoKHUpe2NvbnNvbGUuZXJyb3IoIkRlYm91bmNlZCBzeW5jIGZhaWxlZDoiLHUpfX0pfWVtaXRQcm9ncmVzcz0oZSk9Pnt0aGlzLmxhc3RQcm9ncmVzcz1lLHRoaXMueGZlclN0YXRlLmVtaXQoKX07YXN5bmMgc2V0U2VlZChlLHQpe2F3YWl0IHRoaXMuc3RvcmUuc2VlZC5zYXZlKGUsdCksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgZ2V0Q2xpZW50U3RhdGUoKXtsZXR7c3RvcmU6ZSxjb25uZWN0aW9uczp0fT10aGlzLHI9YXdhaXQgZS5zZWVkLmxvYWQoKSxuPWF3YWl0IGUuaG9zdHMubGlzdCgpLHM9ITE7Zm9yKGxldCBpIG9mIHQudmFsdWVzKCkpaWYoaS5pc0Nvbm5lY3RlZCgpKXtzPSEwO2JyZWFrfXJldHVybntoYXNTZWVkOnIhPT12b2lkIDAsaGFzSG9zdDpBcnJheS5mcm9tKG4pLmxlbmd0aD4wLGNvbm5lY3RlZDpzfX1hc3luYyBnZXRYZmVyU3RhdGUoKXtsZXR7dXBsb2FkczplLGRvd25sb2Fkczp0fT10aGlzLnN0b3JlLHI9YXdhaXQgZS5jb3VudCgpO3JldHVybntudW1Eb3dubG9hZHM6YXdhaXQgdC5jb3VudCgpLG51bVVwbG9hZHM6cixwcm9ncmVzczp0aGlzLmxhc3RQcm9ncmVzc319YXBwbHk9KGUsdCk9PntGKCJhcHBseSBraWNrIix7bjplLmxlbmd0aH0pO2xldCByPXRoaXMuc3RhdGUuYXBwbHkoQW8oZSkpO3JldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0FwcGx5KGUsdCxyKSl9O2FzeW5jIGRvQXBwbHkoZSx0PXtlbnF1ZXVlVXBsb2FkOiEwLHRyaWdnZXJVcGxvYWQ6ITB9LHIpe2xldCBuPVtdLHM9W107Zm9yKGxldHtoZWFkOm8sYm9keTphfW9mIGUpe2xldCBjPW5ldyBxO2Mud3JpdGVTdHJ1Y3QoZmUsbyk7bGV0IHU9Yy5yZXN1bHQoKSxsPWF3YWl0IHRoaXMuY3J5cHRvLmJsYWtlMyh1KSxmPXtlaWQ6by5laWQsYm9keTphLGFwbGQ6bnR9O2lmKG8ub2ZmIT09MClmLm9mZj1vLm9mZjtpZihvLmN0ciE9PTApZi5jdHI9by5jdHI7aWYoby50eXApZi50eXA9by50eXA7bi5wdXNoKGwpLHMucHVzaCh7a2V5OmwsZGF0YTpmfSl9RigiZG9BcHBseSBhcmNoaXZlIHN0YXJ0IiksYXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5hZGQocyksRigiZG9BcHBseSBhcmNoaXZlIGRvbmUiKSxhd2FpdCB4cyh0aGlzLnN0b3JlLG4sdGhpcy5jcnlwdG8pLEYoImRvQXBwbHkgYXdhaXQgcGVyc2lzdCIpO2xldCBpPWF3YWl0IHI7aWYoRigiZG9BcHBseSBwZXJzaXN0IGRvbmUiKSxhd2FpdCB0aGlzLm1hcmtBcHBseVN0YXRzKG4saSksdC5lbnF1ZXVlVXBsb2FkKXtsZXQgbz1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErKyl7bGV0IGM9aVthXTtpZihjPT09MHx8Yz09PTE1KW8ucHVzaChuW2FdKX1pZihvLmxlbmd0aD4wKXtsZXQgYT1hd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKTtmb3IobGV0IGMgb2YgYSlhd2FpdCB0aGlzLnN0b3JlLnVwbG9hZHMuZW5xKGMubGFiZWwsbyk7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfX1pZih0LnRyaWdnZXJVcGxvYWQpdGhpcy5zY2hlZHVsZVN5bmMoKTtyZXR1cm4gaX1lbnF1ZXVlQXBwbHlKb2IoZSl7bGV0IHQ9dGhpcy5hcHBseUNoYWluLnRoZW4oZSxlKTtyZXR1cm4gdGhpcy5hcHBseUNoYWluPXQudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSx0fWRyYWluQXBwbHlRdWV1ZSgpe3JldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0RyYWluQXBwbHlRdWV1ZSgpKX1hc3luYyBkb0RyYWluQXBwbHlRdWV1ZSgpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdCh7YXBsZDpudH0pO2lmKGUubGVuZ3RoPDEpcmV0dXJuW107bGV0IHQ9dHQoZSwocik9PnIuaGVhZCk7cmV0dXJuIHRoaXMuYXBwbHlTdG9yZWQodCl9YXBwbHlIYXNoZXM9KGUpPT50aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0FwcGx5SGFzaGVzKGUpKTthc3luYyBkb0FwcGx5SGFzaGVzKGUpe2xldCB0PVtdO2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmdldChzKTtpZihpKXQucHVzaChpKX1sZXQgcj1hd2FpdCB0aGlzLmFwcGx5U3RvcmVkKHQpLG49bmV3IE1hcDtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyluLnNldChSKHRbc10uaGFzaCkscltzXT8/MTIpO3JldHVybiBlLm1hcCgocyk9Pm4uZ2V0KFIocykpPz8xMyl9YXN5bmMgYXBwbHlTdG9yZWQoZSl7aWYoZS5sZW5ndGg8MSlyZXR1cm5bXTtsZXQgdD1lLm1hcCgobik9Pih7Li4ubi5oZWFkLGJvZDpuLmJvZHl9KSkscj1hd2FpdCB0aGlzLnN0YXRlLmFwcGx5KHQpO3JldHVybiBhd2FpdCB0aGlzLm1hcmtBcHBseVN0YXRzKGUubWFwKChuKT0+bi5oYXNoKSxyKSxyfWFzeW5jIG1hcmtBcHBseVN0YXRzKGUsdCl7bGV0IHI9W10sbj1bXTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7bGV0IGk9dFtzXTtpZihpPT09MHx8aT09PTE1KXIucHVzaChlW3NdKTtlbHNlIGlmKGkhPT12b2lkIDAmJlNzKGkpKW4ucHVzaCh7a2V5OmVbc10sZXJyOml9KX1pZihyLmxlbmd0aD4wKWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubWFya0FwcGxpZWQocik7aWYobi5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtGYWlsZWQobil9YXN5bmMgaW5zZXJ0UmF3KGUsdD0iIil7RigiaW5zZXJ0UmF3Iik7bGV0e2Nsb2NrOnIsY3J5cHRvOm59PXRoaXMscz1yLm5vdygpLFtpLG9dPWF3YWl0IGNzKHtub3c6cyxib2Q6ZSx0eXA6dCxjcnlwdG86bn0pO2lmKG8hPT0wKXJldHVybiBkKG8pO2xldCBjPShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDppLGJvZHk6ZX1dKSlbMF07aWYoYyE9PTAmJmMhPT0xNSlyZXR1cm4gZChjPz8xMik7cmV0dXJuIHAoaSl9YXN5bmMgbWFrZVVwZGF0ZShlLHQscj0iIil7bGV0e2Nsb2NrOm4sY3J5cHRvOnN9PXRoaXMsaT1uLm5vdygpO2lmKGUudXBkYXRlZEF0LmdldFRpbWUoKT5pLmdldFRpbWUoKSlyZXR1cm4gZCg0KTtsZXQgbz1lLmN0cisxLFthLGNdPWF3YWl0IE50KHtub3c6aSxlaWQ6ZS5laWQsY3RyOm8sdHlwOnIsYm9kOnQsY3J5cHRvOnN9KTtpZihjIT09MClyZXR1cm4gZChjKTtyZXR1cm4gcCh7aGVhZDphLGJvZHk6dH0pfWFzeW5jIHVwZGF0ZVdpdGhTa2V3KGUsdCxyLG49IiIpe2lmKHI9PT0hMSlyZXR1cm4gZCg0KTtsZXR7Y2xvY2s6cyxjcnlwdG86aX09dGhpcyxvPXMubm93KCksYT1uZXcgTihlLmVpZCksW2MsdV09YS5yZWFkU3RydWN0KGRlKTtpZih1IT09MClyZXR1cm4gZCh1KTtsZXQgbD1lLnVwZGF0ZWRBdC5nZXRUaW1lKCktYy50cy5nZXRUaW1lKCksZj17ZWlkOmUuZWlkLG9mZjpsKzEsY3RyOmUuY3RyKzEsdHlwOiIiLGxlbjowfSx5PShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDpmLGJvZHk6dm9pZCAwfV0pKVswXTtpZih5IT09MCYmeSE9PTE1KXJldHVybiBkKHk/PzEyKTtpZih0PT09dm9pZCAwKXJldHVybiBwKGYpO2xldFtnLG1dPU10KHtpZDpjLmlkLHRzOm99KTtpZihtIT09MClyZXR1cm4gZChtKTtsZXRbUyxFXT1hd2FpdCBOdCh7bm93Om8sZWlkOmcsY3RyOjAsdHlwOm4sYm9kOnQsY3J5cHRvOml9KTtpZihFIT09MClyZXR1cm4gZChFKTtsZXQgeD0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6Uyxib2R5OnR9XSkpWzBdO2lmKHghPT0wJiZ4IT09MTUpcmV0dXJuIGQoeD8/MTIpO3JldHVybiBwKFMpfWFzeW5jIHVwZGF0ZVJhdyhlLHQscj10aGlzLmZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0LG49IiIpe2lmKEYoInVwZGF0ZVJhdyIpLGUudXBkYXRlZEF0LmdldFRpbWUoKT50aGlzLmNsb2NrLm5vdygpLmdldFRpbWUoKSlyZXR1cm4gdGhpcy51cGRhdGVXaXRoU2tldyhlLHQscixuKTtsZXRbcyxpXT1hd2FpdCB0aGlzLm1ha2VVcGRhdGUoZSx0LG4pO2lmKGkhPT0wKXJldHVybiBkKGkpO2xldCBhPShhd2FpdCB0aGlzLmFwcGx5KFtzXSkpWzBdO2lmKGEhPT0wJiZhIT09MTUpcmV0dXJuIGQoYT8/MTIpO3JldHVybiBwKHMuaGVhZCl9YXN5bmMgaW5zZXJ0KGUpe2xldHtib2R5OnQsdHlwZTpyLHBpZDpuLHRhZ3M6c309ZSxpPXtib2R5OnR9O2lmKG4hPT12b2lkIDApaS5waWQ9bjtpZihzIT09dm9pZCAwKWkudGFncz1zO2xldCBvPU9lKGkpO3JldHVybiB0aGlzLmluc2VydFJhdyhvLHIpfWFzeW5jIHVwZGF0ZShlKXtsZXR7cHJpb3I6dCxib2R5OnIsdHlwZTpuLHBpZDpzLHRhZ3M6aSxmb3JjZTpvfT1lLGE9e2JvZHk6cn07aWYocyE9PXZvaWQgMClhLnBpZD1zO2lmKGkhPT12b2lkIDApYS50YWdzPWk7bGV0IGM9T2UoYSk7cmV0dXJuIHRoaXMudXBkYXRlUmF3KHQsYyxvPz90aGlzLmZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0LG4pfWFzeW5jIGRlbGV0ZShlKXtsZXQgdD1lLmZvcmNlPz8hMDtpZigicHJpb3IiaW4gZSlyZXR1cm4gdGhpcy51cGRhdGVSYXcoZS5wcmlvcix2b2lkIDAsdCk7bGV0W3Isbl09YXdhaXQgdGhpcy5yZXZGcm9tQXJjaGl2ZShlLmVpZCk7aWYobiE9PTApcmV0dXJuIGQobik7cmV0dXJuIHRoaXMudXBkYXRlUmF3KHIsdm9pZCAwLHQpfWFzeW5jIHJldkZyb21BcmNoaXZlKGUpe2xldCB0PWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGFzdChlKTtpZih0KXJldHVybiBscyh0LmhlYWQpO2xldCByPW5ldyBOKGUpLFtuLHNdPXIucmVhZFN0cnVjdChkZSk7aWYocyE9PTApcmV0dXJuIGQocyk7cmV0dXJuIHAoe2VpZDplLGN0cjotMSx1cGRhdGVkQXQ6bi50c30pfWFzeW5jIGdlbkVJRChlKXtsZXR7Y2xvY2s6dCxjcnlwdG86cn09dGhpcyxuPXQubm93KCk7aWYoZSE9PXZvaWQgMClyZXR1cm4gTXQoe2lkOmUsdHM6bn0pO2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCk7cmV0dXJuIE10KHtpZDpzLHRzOm59KX1zeW5jKCl7cmV0dXJuIHRoaXMuc3luY1J1bnMucnVuKCgpPT50aGlzLmRvU3luYygpKX1hc3luYyBkb1N5bmMoKXtsZXR7Y29ubmVjdGlvbnM6ZSxjcnlwdG86dCxzdG9yZTpyfT10aGlzLG49YXdhaXQgci5zZWVkLmxvYWQoKTtpZighbilyZXR1cm4gMjI7YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKTtmb3IobGV0W3MsaV1vZiBlKXtsZXQgbz1hd2FpdCByLmhvc3RzLmdldChzKTtpZighbyljb250aW51ZTtsZXQgYT17Y29ubjppLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6byxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sYz1hd2FpdCBGcihhKTtpZihjIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBlZWs6ICR7Y31gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksYzt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IHU9YXdhaXQgRXMoYSk7aWYodSE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwdXNoOiAke3V9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLHU7dGhpcy54ZmVyU3RhdGUuZW1pdCgpO2xldCBsPWF3YWl0IFdyKGEsYXN5bmMoKT0+e2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCl9KTtpZihsIT09MCYmbCE9PTE1KXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHVsbDogJHtsfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxsO3RoaXMueGZlclN0YXRlLmVtaXQoKX1yZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLDB9YXN5bmMgcmVidWlsZChlKXtpZih0aGlzLnNjaGVkdWxlZFN5bmMuY2FuY2VsKCksYXdhaXQgdGhpcy5zeW5jUnVucy5mbHVzaCgpLGU/LmNoZWNrSG9zdD8/ITApe2xldCByPWF3YWl0IHRoaXMucmVwdWxsKCk7aWYociE9PTApcmV0dXJuIHJ9cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLnJlcGxheSgpKX1hc3luYyBtc2djaGVjaygpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdEtleXMoKTtyZXR1cm4gbXQoZSx0aGlzLmNyeXB0byl9bGlzdE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdChlKX1jb3VudE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMuY291bnQoZSl9YXN5bmMgcmVjb25jaWxlKGUsdCl7dGhpcy5zY2hlZHVsZWRTeW5jLmNhbmNlbCgpLGF3YWl0IHRoaXMuc3luY1J1bnMuZmx1c2goKTtsZXR7Y29ubmVjdGlvbnM6cixjcnlwdG86bixzdG9yZTpzfT10aGlzLGk9YXdhaXQgcy5zZWVkLmxvYWQoKTtpZighaSlyZXR1cm4gZCgyMik7bGV0IG89YXdhaXQgcy5ob3N0cy5nZXQoZSk7aWYoIW8pcmV0dXJuIGQoMTMpO2xldCBhPXIuZ2V0KGUpO2lmKCFhfHwhYS5pc0Nvbm5lY3RlZCgpKXtpZihhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QobywhMSwhMSksbz1hd2FpdCBzLmhvc3RzLmdldChlKSwhbylyZXR1cm4gZCgxMyk7YT1yLmdldChlKX1pZighYSlyZXR1cm4gZCgxMik7bGV0IGM9e2Nvbm46YSxzdG9yZTpzLGVuY2xhdmU6aSxjcnlwdG86bixtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sW3UsbF09YXdhaXQgenIoey4uLmMsaG9zdDpvfSx0KTtpZih0aGlzLnhmZXJTdGF0ZS5lbWl0KCksbCE9PTApcmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxkKGwpO2lmKCF1KXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksZCgxMik7aWYodD8uc3luYz09PSExKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSkscCh1KTtsZXQgZj1hd2FpdCB0aGlzLnN5bmMoKTtpZihmIT09MClyZXR1cm4gZChmKTtsZXQgaD1hd2FpdCBzLmhvc3RzLmdldChlKTtpZighaClyZXR1cm4gZCgxMyk7bGV0W3ksZ109YXdhaXQgenIoey4uLmMsaG9zdDpofSx7cHVsbDohMSxwdXNoOiExfSk7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxnIT09MClyZXR1cm4gZChnKTtpZigheSlyZXR1cm4gZCgxMik7cmV0dXJuIHAoeSl9YXN5bmMgcmVwdWxsKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcyxuPWF3YWl0IHIuc2VlZC5sb2FkKCk7aWYoIW4pcmV0dXJuIDIyO2xldCBzPUFycmF5LmZyb20oYXdhaXQgci5ob3N0cy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuIDA7Zm9yKGxldCBpIG9mIHMpe2xldCBvPWUuZ2V0KGkubGFiZWwpO2lmKCFvfHwhby5pc0Nvbm5lY3RlZCgpKWF3YWl0IHRoaXMuY29ubmVjdFRvSG9zdChpLCExLCExKX1mb3IobGV0W2ksb11vZiBlKXtsZXQgYT1hd2FpdCByLmhvc3RzLmdldChpKTtpZighYSljb250aW51ZTtsZXQgYz17Y29ubjpvLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6ey4uLmEsbGFzdFNlcTowfSxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sdT1hd2FpdCBGcihjKTtpZih1IT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHBlZWs6ICR7dX1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksdTt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IGw9YXdhaXQgV3IoYyk7aWYobCE9PTAmJmwhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHB1bGw6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlcGxheSgpe2xldCBlPWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTtpZihlIT09MClyZXR1cm4gZTtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoKSxyPXR0KHQsKGkpPT5pLmhlYWQpLG49ci5sZW5ndGg7aWYobjwxKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMDtsZXQgcz0wO3doaWxlKHM8ci5sZW5ndGgpe2xldCBpPTAsbz0wLGE9cztmb3IobGV0IHU9czt1PHIubGVuZ3RoJiZvPDEwMCYmaTwxMDI0MDA7dSsrKWkrPXJbdV0uaGVhZC5sZW4sbysrLGE9dSsxO2xldCBjPXIuc2xpY2UocyxhKTthd2FpdCB0aGlzLmFwcGx5U3RvcmVkKGMpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiZXhlYyIsZG9uZTphLHRvdGFsOm59KSxzPWF9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHdpcGUoZSl7bGV0IHQ9ZT8ubXNncyE9PSExLHI9ZT8uZW50cyE9PSExLG49ZT8ubWV0YSE9PSExLHM9ZT8uc2VlZD09PSEwO3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e3N0b3JlOml9PXRoaXM7aWYobilhd2FpdCBpLmhvc3RzLndpcGUoKSxhd2FpdCBpLnVwbG9hZHMud2lwZSgpLGF3YWl0IGkuZG93bmxvYWRzLndpcGUoKTtpZih0KWF3YWl0IGkubWVzc2FnZXMud2lwZSgpO2lmKHMpYXdhaXQgaS5zZWVkLndpcGUoKTtpZihyKWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTt0aGlzLmxhc3RQcm9ncmVzcz1Pcix0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSx0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9aW1wb3J0PWFzeW5jKGUsdCk9PntsZXR7Y3J5cHRvOnIsc3RvcmU6bn09dGhpcyxzPXQ/Lm9uUHJvZ3Jlc3MsaT1hd2FpdCBuLnNlZWQubG9hZCgpO2lmKCFpKXJldHVybiAyMjtjb25zb2xlLnRpbWUoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCBvPWF3YWl0IGUuYnl0ZXMoKSxbYSxjXT1hd2FpdCBfdC5kZWNvZGVGaWxlKG8scixpKTtpZihjIT09MClyZXR1cm4gYztjb25zb2xlLnRpbWVFbmQoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCB1PTA7d2hpbGUodTxhLmxlbmd0aCl7bGV0IGw9MCxmPTAsaD11O2ZvcihsZXQgbT11O208YS5sZW5ndGgmJmY8MTAwJiZsPDEwMjQwMDttKyspbCs9YVttXS5oZWFkLmxlbixmKyssaD1tKzE7bGV0IHk9YS5zbGljZSh1LGgpO2NvbnNvbGUudGltZShgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtsZXQgZz1hd2FpdCB0aGlzLmFwcGx5KHkse2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMX0pO2NvbnNvbGUudGltZUVuZChgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtmb3IobGV0IG09MDttPHkubGVuZ3RoO20rKyl7bGV0IFM9Z1ttXTtpZihTIT09MCYmUyE9PTE1KWNvbnNvbGUud2FybihgZmFpbGVkIHRvIGltcG9ydCBtc2cgJHt1K219OiAke0JbU119YCl9aWYocylxdWV1ZU1pY3JvdGFzaygoKT0+cyhoLGEubGVuZ3RoLDApKTt0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImltcG9ydCIsZG9uZTpoLHRvdGFsOmEubGVuZ3RofSksdT1ofXJldHVybiB0aGlzLnNjaGVkdWxlU3luYygpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfTtzY2hlZHVsZVN5bmM9KCk9PntpZih0aGlzLm9uU2NoZWR1bGVTeW5jKXt0aGlzLm9uU2NoZWR1bGVTeW5jKCk7cmV0dXJufXRoaXMuc2NoZWR1bGVkU3luYy5zY2hlZHVsZSgpfTthc3luYyBleHBvcnRCeXRlcygpe2xldHtjcnlwdG86ZSxzdG9yZTp0fT10aGlzLHI9YXdhaXQgdC5zZWVkLmxvYWQoKTtpZighcilyZXR1cm4gZCgyMik7bGV0IG49YXdhaXQgdC5tZXNzYWdlcy5saXN0KCk7cmV0dXJuIF90LmVuY29kZUZpbGUoImV4cG9ydCIsMCxuLGUscil9YXN5bmMgZXhwb3J0KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZXhwb3J0Qnl0ZXMoKTtpZihyIT09MClyZXR1cm4gcjtpZighdClyZXR1cm4gMTI7bGV0IG49bmV3IEJsb2IoW3Quc2xpY2UoKV0pO3JldHVybiBtcyhuLGUpLDB9YXN5bmMgbGluayhlLHQ9ITApe2lmKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuYWRkKGUpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLHQpe2xldCByPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuZ2V0KGUubGFiZWwpO2lmKHIpYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KHIpfX1hc3luYyB1bmxpbmsoZSl7YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5kZWwoZSksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgaG9zdHMoKXtyZXR1cm4gQXJyYXkuZnJvbShhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKSl9Y29ubmVjdFRvSG9zdD1hc3luYyhlLHQ9ITAscj0hMCk9PntsZXR7Y2xvY2s6bixjb25uZWN0aW9uczpzLGNyeXB0bzppLHN0b3JlOm8sdHJhbnNwb3J0OmF9PXRoaXMsYz1zLmdldChlLmxhYmVsKTtpZihjKXtpZihjLmlzQ29ubmVjdGVkKCkpcmV0dXJuO3RyeXtjLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9cy5kZWxldGUoZS5sYWJlbCl9bGV0IHU9YXdhaXQgby5zZWVkLmxvYWQoKTtpZighdSlyZXR1cm47Y29uc29sZS5pbmZvKGBDb25uZWN0aW5nIHRvICR7ZS5oYW5kbGV9ICgke2UubGFiZWx9KWApO2xldCBsPW5ldyBLdCh1LGksZSxuLGEoZSksKGYpPT5vLmhvc3RzLnNldChlLmxhYmVsLGYpKTtpZihhd2FpdCBsLnJlZ2lzdGVyKCksdClhd2FpdCBsLmxpc3Rlbihhc3luYyhmKT0+e2xldCBoPXtjb25uOmwsc3RvcmU6byxlbmNsYXZlOnUsaG9zdDplLGNyeXB0bzppLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4gUHMoZixoLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYocy5zZXQoZS5sYWJlbCxsKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxyKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jIGNvbm5lY3QoZT0hMCx0PSEwKXtsZXR7Y29ubmVjdFRvSG9zdDpyLHNjaGVkdWxlU3luYzpuLHN0b3JlOnN9PXRoaXM7aWYoIWF3YWl0IHMuc2VlZC5sb2FkKCkpcmV0dXJuO2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCk7bGV0IG89YXdhaXQgcy5ob3N0cy5saXN0KCk7Zm9yKGxldCBhIG9mIG8pYXdhaXQgcihhLGUsITEpO2lmKHQpbigpfWRpc2Nvbm5lY3Q9YXN5bmMoKT0+e2ZvcihsZXQgZSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKXRyeXtlLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9dGhpcy5jb25uZWN0aW9ucy5jbGVhcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpfX12YXIgX2U9dHlwZW9mIGdsb2JhbFRoaXM9PT0ib2JqZWN0IiYmImNyeXB0byJpbiBnbG9iYWxUaGlzP2dsb2JhbFRoaXMuY3J5cHRvOnZvaWQgMDtmdW5jdGlvbiBHdChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24ganIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBlZShlLC4uLnQpe2lmKCFqcihlKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoPjAmJiF0LmluY2x1ZGVzKGUubGVuZ3RoKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCBvZiBsZW5ndGggIit0KyIsIGdvdCBsZW5ndGg9IitlLmxlbmd0aCl9ZnVuY3Rpb24gJHIoZSx0PSEwKXtpZihlLmRlc3Ryb3llZCl0aHJvdyBFcnJvcigiSGFzaCBpbnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQiKTtpZih0JiZlLmZpbmlzaGVkKXRocm93IEVycm9yKCJIYXNoI2RpZ2VzdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIil9ZnVuY3Rpb24gVXMoZSx0KXtlZShlKTtsZXQgcj10Lm91dHB1dExlbjtpZihlLmxlbmd0aDxyKXRocm93IEVycm9yKCJkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAiK3IpfWZ1bmN0aW9uIEdyKGUpe2lmKHR5cGVvZiBlIT09ImJvb2xlYW4iKXRocm93IEVycm9yKGBib29sZWFuIGV4cGVjdGVkLCBub3QgJHtlfWApfS8qISBub2JsZS1jaXBoZXJzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjMgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovdmFyIEFlPShlKT0+bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxNYXRoLmZsb29yKGUuYnl0ZUxlbmd0aC80KSk7dmFyIFBvPW5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMjg3NDU0MDIwXSkuYnVmZmVyKVswXT09PTY4O2lmKCFQbyl0aHJvdyBFcnJvcigiTm9uIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgaXMgbm90IHN1cHBvcnRlZCIpO2Z1bmN0aW9uIFVvKGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyIpdGhyb3cgRXJyb3IoInN0cmluZyBleHBlY3RlZCIpO3JldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSkpfWZ1bmN0aW9uIFF0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpZT1VbyhlKTtlbHNlIGlmKGpyKGUpKWU9WXQoZSk7ZWxzZSB0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCwgZ290ICIrdHlwZW9mIGUpO3JldHVybiBlfWZ1bmN0aW9uIGtzKGUsdCl7aWYodD09bnVsbHx8dHlwZW9mIHQhPT0ib2JqZWN0Iil0aHJvdyBFcnJvcigib3B0aW9ucyBtdXN0IGJlIGRlZmluZWQiKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHQpfWZ1bmN0aW9uIEJzKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXJ8PWVbbl1edFtuXTtyZXR1cm4gcj09PTB9dmFyIHZzPShlLHQpPT57ZnVuY3Rpb24gcihuLC4uLnMpe2lmKGVlKG4pLGUubm9uY2VMZW5ndGghPT12b2lkIDApe2xldCBsPXNbMF07aWYoIWwpdGhyb3cgRXJyb3IoIm5vbmNlIC8gaXYgcmVxdWlyZWQiKTtpZihlLnZhclNpemVOb25jZSllZShsKTtlbHNlIGVlKGwsZS5ub25jZUxlbmd0aCl9bGV0IGk9ZS50YWdMZW5ndGg7aWYoaSYmc1sxXSE9PXZvaWQgMCllZShzWzFdKTtsZXQgbz10KG4sLi4ucyksYT0obCxmKT0+e2lmKGYhPT12b2lkIDApe2lmKGwhPT0yKXRocm93IEVycm9yKCJjaXBoZXIgb3V0cHV0IG5vdCBzdXBwb3J0ZWQiKTtlZShmKX19LGM9ITE7cmV0dXJue2VuY3J5cHQobCxmKXtpZihjKXRocm93IEVycm9yKCJjYW5ub3QgZW5jcnlwdCgpIHR3aWNlIHdpdGggc2FtZSBrZXkgKyBub25jZSIpO3JldHVybiBjPSEwLGVlKGwpLGEoby5lbmNyeXB0Lmxlbmd0aCxmKSxvLmVuY3J5cHQobCxmKX0sZGVjcnlwdChsLGYpe2lmKGVlKGwpLGkmJmwubGVuZ3RoPGkpdGhyb3cgRXJyb3IoImludmFsaWQgY2lwaGVydGV4dCBsZW5ndGg6IHNtYWxsZXIgdGhhbiB0YWdMZW5ndGg9IitpKTtyZXR1cm4gYShvLmRlY3J5cHQubGVuZ3RoLGYpLG8uZGVjcnlwdChsLGYpfX19cmV0dXJuIE9iamVjdC5hc3NpZ24ocixlKSxyfTtmdW5jdGlvbiBRcihlLHQscj0hMCl7aWYodD09PXZvaWQgMClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7aWYodC5sZW5ndGghPT1lKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCBsZW5ndGgsIGV4cGVjdGVkICIrZSsiLCBnb3Q6ICIrdC5sZW5ndGgpO2lmKHImJiFrbyh0KSl0aHJvdyBFcnJvcigiaW52YWxpZCBvdXRwdXQsIG11c3QgYmUgYWxpZ25lZCIpO3JldHVybiB0fWZ1bmN0aW9uIGtvKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9ZnVuY3Rpb24gWXQoZSl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShlKX1mdW5jdGlvbiBJZSguLi5lKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLmZpbGwoMCl9ZnVuY3Rpb24gd3QoZT0zMil7aWYoX2UmJnR5cGVvZiBfZS5nZXRSYW5kb21WYWx1ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBfZS5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZSkpO2lmKF9lJiZ0eXBlb2YgX2UucmFuZG9tQnl0ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBfZS5yYW5kb21CeXRlcyhlKTt0aHJvdyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQiKX12YXIgQ3M9KGUpPT5VaW50OEFycmF5LmZyb20oZS5zcGxpdCgiIikubWFwKCh0KT0+dC5jaGFyQ29kZUF0KDApKSksQm89Q3MoImV4cGFuZCAxNi1ieXRlIGsiKSx2bz1DcygiZXhwYW5kIDMyLWJ5dGUgayIpLERvPUFlKEJvKSxDbz1BZSh2byk7ZnVuY3Rpb24gUChlLHQpe3JldHVybiBlPDx0fGU+Pj4zMi10fWZ1bmN0aW9uIFlyKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9dmFyIEp0PTY0LFRvPTE2LFRzPTQyOTQ5NjcyOTUsRHM9bmV3IFVpbnQzMkFycmF5O2Z1bmN0aW9uIEhvKGUsdCxyLG4scyxpLG8sYSl7bGV0IGM9cy5sZW5ndGgsdT1uZXcgVWludDhBcnJheShKdCksbD1BZSh1KSxmPVlyKHMpJiZZcihpKSxoPWY/QWUocyk6RHMseT1mP0FlKGkpOkRzO2ZvcihsZXQgZz0wO2c8YztvKyspe2lmKGUodCxyLG4sbCxvLGEpLG8+PVRzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtsZXQgbT1NYXRoLm1pbihKdCxjLWcpO2lmKGYmJm09PT1KdCl7bGV0IFM9Zy80O2lmKGclNCE9PTApdGhyb3cgRXJyb3IoImFyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbiIpO2ZvcihsZXQgRT0wLHc7RTxUbztFKyspdz1TK0UseVt3XT1oW3ddXmxbRV07Zys9SnQ7Y29udGludWV9Zm9yKGxldCBTPTAsRTtTPG07UysrKUU9ZytTLGlbRV09c1tFXV51W1NdO2crPW19fWZ1bmN0aW9uIEhzKGUsdCl7bGV0e2FsbG93U2hvcnRLZXlzOnIsZXh0ZW5kTm9uY2VGbjpuLGNvdW50ZXJMZW5ndGg6cyxjb3VudGVyUmlnaHQ6aSxyb3VuZHM6b309a3Moe2FsbG93U2hvcnRLZXlzOiExLGNvdW50ZXJMZW5ndGg6OCxjb3VudGVyUmlnaHQ6ITEscm91bmRzOjIwfSx0KTtpZih0eXBlb2YgZSE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoImNvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIEd0KHMpLEd0KG8pLEdyKGkpLEdyKHIpLChhLGMsdSxsLGY9MCk9PntlZShhKSxlZShjKSxlZSh1KTtsZXQgaD11Lmxlbmd0aDtpZihsPT09dm9pZCAwKWw9bmV3IFVpbnQ4QXJyYXkoaCk7aWYoZWUobCksR3QoZiksZjwwfHxmPj1Ucyl0aHJvdyBFcnJvcigiYXJ4OiBjb3VudGVyIG92ZXJmbG93Iik7aWYobC5sZW5ndGg8aCl0aHJvdyBFcnJvcihgYXJ4OiBvdXRwdXQgKCR7bC5sZW5ndGh9KSBpcyBzaG9ydGVyIHRoYW4gZGF0YSAoJHtofSlgKTtsZXQgeT1bXSxnPWEubGVuZ3RoLG0sUztpZihnPT09MzIpeS5wdXNoKG09WXQoYSkpLFM9Q287ZWxzZSBpZihnPT09MTYmJnIpbT1uZXcgVWludDhBcnJheSgzMiksbS5zZXQoYSksbS5zZXQoYSwxNiksUz1Ebyx5LnB1c2gobSk7ZWxzZSB0aHJvdyBFcnJvcihgYXJ4OiBpbnZhbGlkIDMyLWJ5dGUga2V5LCBnb3QgbGVuZ3RoPSR7Z31gKTtpZighWXIoYykpeS5wdXNoKGM9WXQoYykpO2xldCBFPUFlKG0pO2lmKG4pe2lmKGMubGVuZ3RoIT09MjQpdGhyb3cgRXJyb3IoImFyeDogZXh0ZW5kZWQgbm9uY2UgbXVzdCBiZSAyNCBieXRlcyIpO24oUyxFLEFlKGMuc3ViYXJyYXkoMCwxNikpLEUpLGM9Yy5zdWJhcnJheSgxNil9bGV0IHc9MTYtcztpZih3IT09Yy5sZW5ndGgpdGhyb3cgRXJyb3IoYGFyeDogbm9uY2UgbXVzdCBiZSAke3d9IG9yIDE2IGJ5dGVzYCk7aWYodyE9PTEyKXtsZXQgYj1uZXcgVWludDhBcnJheSgxMik7Yi5zZXQoYyxpPzA6MTItYy5sZW5ndGgpLGM9Yix5LnB1c2goYyl9bGV0IHg9QWUoYyk7cmV0dXJuIEhvKGUsUyxFLHgsdSxsLGYsbyksSWUoLi4ueSksbH19dmFyIG5lPShlLHQpPT5lW3QrK10mMjU1fChlW3QrK10mMjU1KTw8ODtjbGFzcyBNc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmJsb2NrTGVuPTE2LHRoaXMub3V0cHV0TGVuPTE2LHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDE2KSx0aGlzLnI9bmV3IFVpbnQxNkFycmF5KDEwKSx0aGlzLmg9bmV3IFVpbnQxNkFycmF5KDEwKSx0aGlzLnBhZD1uZXcgVWludDE2QXJyYXkoOCksdGhpcy5wb3M9MCx0aGlzLmZpbmlzaGVkPSExLGU9UXQoZSksZWUoZSwzMik7bGV0IHQ9bmUoZSwwKSxyPW5lKGUsMiksbj1uZShlLDQpLHM9bmUoZSw2KSxpPW5lKGUsOCksbz1uZShlLDEwKSxhPW5lKGUsMTIpLGM9bmUoZSwxNCk7dGhpcy5yWzBdPXQmODE5MSx0aGlzLnJbMV09KHQ+Pj4xM3xyPDwzKSY4MTkxLHRoaXMuclsyXT0ocj4+PjEwfG48PDYpJjc5MzksdGhpcy5yWzNdPShuPj4+N3xzPDw5KSY4MTkxLHRoaXMucls0XT0ocz4+PjR8aTw8MTIpJjI1NSx0aGlzLnJbNV09aT4+PjEmODE5MCx0aGlzLnJbNl09KGk+Pj4xNHxvPDwyKSY4MTkxLHRoaXMucls3XT0obz4+PjExfGE8PDUpJjgwNjUsdGhpcy5yWzhdPShhPj4+OHxjPDw4KSY4MTkxLHRoaXMucls5XT1jPj4+NSYxMjc7Zm9yKGxldCB1PTA7dTw4O3UrKyl0aGlzLnBhZFt1XT1uZShlLDE2KzIqdSl9cHJvY2VzcyhlLHQscj0hMSl7bGV0IG49cj8wOjIwNDgse2g6cyxyOml9PXRoaXMsbz1pWzBdLGE9aVsxXSxjPWlbMl0sdT1pWzNdLGw9aVs0XSxmPWlbNV0saD1pWzZdLHk9aVs3XSxnPWlbOF0sbT1pWzldLFM9bmUoZSx0KzApLEU9bmUoZSx0KzIpLHc9bmUoZSx0KzQpLHg9bmUoZSx0KzYpLGI9bmUoZSx0KzgpLEE9bmUoZSx0KzEwKSxEPW5lKGUsdCsxMiksVD1uZShlLHQrMTQpLEg9c1swXSsoUyY4MTkxKSxVPXNbMV0rKChTPj4+MTN8RTw8MykmODE5MSksTz1zWzJdKygoRT4+PjEwfHc8PDYpJjgxOTEpLEs9c1szXSsoKHc+Pj43fHg8PDkpJjgxOTEpLF89c1s0XSsoKHg+Pj40fGI8PDEyKSY4MTkxKSxJPXNbNV0rKGI+Pj4xJjgxOTEpLHY9c1s2XSsoKGI+Pj4xNHxBPDwyKSY4MTkxKSxDPXNbN10rKChBPj4+MTF8RDw8NSkmODE5MSksTD1zWzhdKygoRD4+Pjh8VDw8OCkmODE5MSksTT1zWzldKyhUPj4+NXxuKSxrPTAsaj1rK0gqbytVKig1Km0pK08qKDUqZykrSyooNSp5KStfKig1KmgpO2s9aj4+PjEzLGomPTgxOTEsais9SSooNSpmKSt2Kig1KmwpK0MqKDUqdSkrTCooNSpjKStNKig1KmEpLGsrPWo+Pj4xMyxqJj04MTkxO2xldCBaPWsrSCphK1UqbytPKig1Km0pK0sqKDUqZykrXyooNSp5KTtrPVo+Pj4xMyxaJj04MTkxLForPUkqKDUqaCkrdiooNSpmKStDKig1KmwpK0wqKDUqdSkrTSooNSpjKSxrKz1aPj4+MTMsWiY9ODE5MTtsZXQgWD1rK0gqYytVKmErTypvK0sqKDUqbSkrXyooNSpnKTtrPVg+Pj4xMyxYJj04MTkxLFgrPUkqKDUqeSkrdiooNSpoKStDKig1KmYpK0wqKDUqbCkrTSooNSp1KSxrKz1YPj4+MTMsWCY9ODE5MTtsZXQgVj1rK0gqdStVKmMrTyphK0sqbytfKig1Km0pO2s9Vj4+PjEzLFYmPTgxOTEsVis9SSooNSpnKSt2Kig1KnkpK0MqKDUqaCkrTCooNSpmKStNKig1KmwpLGsrPVY+Pj4xMyxWJj04MTkxO2xldCB6PWsrSCpsK1UqdStPKmMrSyphK18qbztrPXo+Pj4xMyx6Jj04MTkxLHorPUkqKDUqbSkrdiooNSpnKStDKig1KnkpK0wqKDUqaCkrTSooNSpmKSxrKz16Pj4+MTMseiY9ODE5MTtsZXQgY2U9aytIKmYrVSpsK08qdStLKmMrXyphO2s9Y2U+Pj4xMyxjZSY9ODE5MSxjZSs9SSpvK3YqKDUqbSkrQyooNSpnKStMKig1KnkpK00qKDUqaCksays9Y2U+Pj4xMyxjZSY9ODE5MTtsZXQgbGU9aytIKmgrVSpmK08qbCtLKnUrXypjO2s9bGU+Pj4xMyxsZSY9ODE5MSxsZSs9SSphK3YqbytDKig1Km0pK0wqKDUqZykrTSooNSp5KSxrKz1sZT4+PjEzLGxlJj04MTkxO2xldCBqZT1rK0gqeStVKmgrTypmK0sqbCtfKnU7az1qZT4+PjEzLGplJj04MTkxLGplKz1JKmMrdiphK0MqbytMKig1Km0pK00qKDUqZyksays9amU+Pj4xMyxqZSY9ODE5MTtsZXQgJGU9aytIKmcrVSp5K08qaCtLKmYrXypsO2s9JGU+Pj4xMywkZSY9ODE5MSwkZSs9SSp1K3YqYytDKmErTCpvK00qKDUqbSksays9JGU+Pj4xMywkZSY9ODE5MTtsZXQgR2U9aytIKm0rVSpnK08qeStLKmgrXypmO2s9R2U+Pj4xMyxHZSY9ODE5MSxHZSs9SSpsK3YqdStDKmMrTCphK00qbyxrKz1HZT4+PjEzLEdlJj04MTkxLGs9KGs8PDIpK2t8MCxrPWsranwwLGo9ayY4MTkxLGs9az4+PjEzLForPWssc1swXT1qLHNbMV09WixzWzJdPVgsc1szXT1WLHNbNF09eixzWzVdPWNlLHNbNl09bGUsc1s3XT1qZSxzWzhdPSRlLHNbOV09R2V9ZmluYWxpemUoKXtsZXR7aDplLHBhZDp0fT10aGlzLHI9bmV3IFVpbnQxNkFycmF5KDEwKSxuPWVbMV0+Pj4xMztlWzFdJj04MTkxO2ZvcihsZXQgbz0yO288MTA7bysrKWVbb10rPW4sbj1lW29dPj4+MTMsZVtvXSY9ODE5MTtlWzBdKz1uKjUsbj1lWzBdPj4+MTMsZVswXSY9ODE5MSxlWzFdKz1uLG49ZVsxXT4+PjEzLGVbMV0mPTgxOTEsZVsyXSs9bixyWzBdPWVbMF0rNSxuPXJbMF0+Pj4xMyxyWzBdJj04MTkxO2ZvcihsZXQgbz0xO288MTA7bysrKXJbb109ZVtvXStuLG49cltvXT4+PjEzLHJbb10mPTgxOTE7cls5XS09ODE5MjtsZXQgcz0obl4xKS0xO2ZvcihsZXQgbz0wO288MTA7bysrKXJbb10mPXM7cz1+cztmb3IobGV0IG89MDtvPDEwO28rKyllW29dPWVbb10mc3xyW29dO2VbMF09KGVbMF18ZVsxXTw8MTMpJjY1NTM1LGVbMV09KGVbMV0+Pj4zfGVbMl08PDEwKSY2NTUzNSxlWzJdPShlWzJdPj4+NnxlWzNdPDw3KSY2NTUzNSxlWzNdPShlWzNdPj4+OXxlWzRdPDw0KSY2NTUzNSxlWzRdPShlWzRdPj4+MTJ8ZVs1XTw8MXxlWzZdPDwxNCkmNjU1MzUsZVs1XT0oZVs2XT4+PjJ8ZVs3XTw8MTEpJjY1NTM1LGVbNl09KGVbN10+Pj41fGVbOF08PDgpJjY1NTM1LGVbN109KGVbOF0+Pj44fGVbOV08PDUpJjY1NTM1O2xldCBpPWVbMF0rdFswXTtlWzBdPWkmNjU1MzU7Zm9yKGxldCBvPTE7bzw4O28rKylpPShlW29dK3Rbb118MCkrKGk+Pj4xNil8MCxlW29dPWkmNjU1MzU7SWUocil9dXBkYXRlKGUpeyRyKHRoaXMpO2xldHtidWZmZXI6dCxibG9ja0xlbjpyfT10aGlzO2U9UXQoZSk7bGV0IG49ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxuOyl7bGV0IGk9TWF0aC5taW4oci10aGlzLnBvcyxuLXMpO2lmKGk9PT1yKXtmb3IoO3I8PW4tcztzKz1yKXRoaXMucHJvY2VzcyhlLHMpO2NvbnRpbnVlfWlmKHQuc2V0KGUuc3ViYXJyYXkocyxzK2kpLHRoaXMucG9zKSx0aGlzLnBvcys9aSxzKz1pLHRoaXMucG9zPT09cil0aGlzLnByb2Nlc3ModCwwLCExKSx0aGlzLnBvcz0wfXJldHVybiB0aGlzfWRlc3Ryb3koKXtJZSh0aGlzLmgsdGhpcy5yLHRoaXMuYnVmZmVyLHRoaXMucGFkKX1kaWdlc3RJbnRvKGUpeyRyKHRoaXMpLFVzKGUsdGhpcyksdGhpcy5maW5pc2hlZD0hMDtsZXR7YnVmZmVyOnQsaDpyfT10aGlzLHtwb3M6bn09dGhpcztpZihuKXt0W24rK109MTtmb3IoO248MTY7bisrKXRbbl09MDt0aGlzLnByb2Nlc3ModCwwLCEwKX10aGlzLmZpbmFsaXplKCk7bGV0IHM9MDtmb3IobGV0IGk9MDtpPDg7aSsrKWVbcysrXT1yW2ldPj4+MCxlW3MrK109cltpXT4+Pjg7cmV0dXJuIGV9ZGlnZXN0KCl7bGV0e2J1ZmZlcjplLG91dHB1dExlbjp0fT10aGlzO3RoaXMuZGlnZXN0SW50byhlKTtsZXQgcj1lLnNsaWNlKDAsdCk7cmV0dXJuIHRoaXMuZGVzdHJveSgpLHJ9fWZ1bmN0aW9uIE1vKGUpe2xldCB0PShuLHMpPT5lKHMpLnVwZGF0ZShRdChuKSkuZGlnZXN0KCkscj1lKG5ldyBVaW50OEFycmF5KDMyKSk7cmV0dXJuIHQub3V0cHV0TGVuPXIub3V0cHV0TGVuLHQuYmxvY2tMZW49ci5ibG9ja0xlbix0LmNyZWF0ZT0obik9PmUobiksdH12YXIgSnI9TW8oKGUpPT5uZXcgTXMoZSkpO2Z1bmN0aW9uIFJvKGUsdCxyLG4scyxpPTIwKXtsZXQgbz1lWzBdLGE9dFswXSxjPXRbMV0sdT10WzJdLGw9dFszXSxmPWVbMV0saD1yWzBdLHk9clsxXSxnPXMsbT0wLFM9ZVsyXSxFPXRbNF0sdz10WzVdLHg9dFs2XSxiPXRbN10sQT1lWzNdLEQ9byxUPWEsSD1jLFU9dSxPPWwsSz1mLF89aCxJPXksdj1nLEM9bSxMPVMsTT1FLGs9dyxqPXgsWj1iLFg9QTtmb3IobGV0IHo9MDt6PGk7eis9MilPXj1QKEQra3wwLDcpLHZePVAoTytEfDAsOSksa149UCh2K098MCwxMyksRF49UChrK3Z8MCwxOCksQ149UChLK1R8MCw3KSxqXj1QKEMrS3wwLDkpLFRePVAoaitDfDAsMTMpLEtePVAoVCtqfDAsMTgpLFpePVAoTCtffDAsNyksSF49UChaK0x8MCw5KSxfXj1QKEgrWnwwLDEzKSxMXj1QKF8rSHwwLDE4KSxVXj1QKFgrTXwwLDcpLElePVAoVStYfDAsOSksTV49UChJK1V8MCwxMyksWF49UChNK0l8MCwxOCksVF49UChEK1V8MCw3KSxIXj1QKFQrRHwwLDkpLFVePVAoSCtUfDAsMTMpLERePVAoVStIfDAsMTgpLF9ePVAoSytPfDAsNyksSV49UChfK0t8MCw5KSxPXj1QKEkrX3wwLDEzKSxLXj1QKE8rSXwwLDE4KSxNXj1QKEwrQ3wwLDcpLHZePVAoTStMfDAsOSksQ149UCh2K018MCwxMyksTF49UChDK3Z8MCwxOCksa149UChYK1p8MCw3KSxqXj1QKGsrWHwwLDkpLFpePVAoaitrfDAsMTMpLFhePVAoWitqfDAsMTgpO2xldCBWPTA7bltWKytdPW8rRHwwLG5bVisrXT1hK1R8MCxuW1YrK109YytIfDAsbltWKytdPXUrVXwwLG5bVisrXT1sK098MCxuW1YrK109ZitLfDAsbltWKytdPWgrX3wwLG5bVisrXT15K0l8MCxuW1YrK109Zyt2fDAsbltWKytdPW0rQ3wwLG5bVisrXT1TK0x8MCxuW1YrK109RStNfDAsbltWKytdPXcra3wwLG5bVisrXT14K2p8MCxuW1YrK109YitafDAsbltWKytdPUErWHwwfWZ1bmN0aW9uIExvKGUsdCxyLG4pe2xldCBzPWVbMF0saT10WzBdLG89dFsxXSxhPXRbMl0sYz10WzNdLHU9ZVsxXSxsPXJbMF0sZj1yWzFdLGg9clsyXSx5PXJbM10sZz1lWzJdLG09dFs0XSxTPXRbNV0sRT10WzZdLHc9dFs3XSx4PWVbM107Zm9yKGxldCBBPTA7QTwyMDtBKz0yKWNePVAocytTfDAsNyksaF49UChjK3N8MCw5KSxTXj1QKGgrY3wwLDEzKSxzXj1QKFMraHwwLDE4KSx5Xj1QKHUraXwwLDcpLEVePVAoeSt1fDAsOSksaV49UChFK3l8MCwxMyksdV49UChpK0V8MCwxOCksd149UChnK2x8MCw3KSxvXj1QKHcrZ3wwLDkpLGxePVAobyt3fDAsMTMpLGdePVAobCtvfDAsMTgpLGFePVAoeCttfDAsNyksZl49UChhK3h8MCw5KSxtXj1QKGYrYXwwLDEzKSx4Xj1QKG0rZnwwLDE4KSxpXj1QKHMrYXwwLDcpLG9ePVAoaStzfDAsOSksYV49UChvK2l8MCwxMyksc149UChhK298MCwxOCksbF49UCh1K2N8MCw3KSxmXj1QKGwrdXwwLDkpLGNePVAoZitsfDAsMTMpLHVePVAoYytmfDAsMTgpLG1ePVAoZyt5fDAsNyksaF49UChtK2d8MCw5KSx5Xj1QKGgrbXwwLDEzKSxnXj1QKHkraHwwLDE4KSxTXj1QKHgrd3wwLDcpLEVePVAoUyt4fDAsOSksd149UChFK1N8MCwxMykseF49UCh3K0V8MCwxOCk7bGV0IGI9MDtuW2IrK109cyxuW2IrK109dSxuW2IrK109ZyxuW2IrK109eCxuW2IrK109bCxuW2IrK109ZixuW2IrK109aCxuW2IrK109eX12YXIgWnI9SHMoUm8se2NvdW50ZXJSaWdodDohMCxleHRlbmROb25jZUZuOkxvfSksZW49dnMoe2Jsb2NrU2l6ZTo2NCxub25jZUxlbmd0aDoyNCx0YWdMZW5ndGg6MTZ9LChlLHQpPT4oe2VuY3J5cHQocixuKXtuPVFyKHIubGVuZ3RoKzMyLG4sITEpO2xldCBzPW4uc3ViYXJyYXkoMCwzMiksaT1uLnN1YmFycmF5KDMyKTtuLnNldChyLDMyKSxJZShzKSxacihlLHQsbixuKTtsZXQgbz1KcihpLHMpO3JldHVybiBuLnNldChvLDE2KSxJZShuLnN1YmFycmF5KDAsMTYpLG8pLG4uc3ViYXJyYXkoMTYpfSxkZWNyeXB0KHIsbil7ZWUociksbj1RcihyLmxlbmd0aCszMixuLCExKTtsZXQgcz1uLnN1YmFycmF5KDAsMzIpLGk9bi5zdWJhcnJheSgzMiw0OCksbz1uLnN1YmFycmF5KDQ4KTtuLnNldChyLDMyKSxJZShzKTtsZXQgYT1acihlLHQscyxzKSxjPUpyKG8sYSk7aWYoIUJzKGksYykpdGhyb3cgRXJyb3IoImludmFsaWQgdGFnIik7cmV0dXJuIFpyKGUsdCxuLnN1YmFycmF5KDE2KSxuLnN1YmFycmF5KDE2KSksSWUocyxpLGMpLG99fSkpOy8qISBub2JsZS1oYXNoZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9mdW5jdGlvbiBPbyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fEFycmF5QnVmZmVyLmlzVmlldyhlKSYmZS5jb25zdHJ1Y3Rvci5uYW1lPT09IlVpbnQ4QXJyYXkifWZ1bmN0aW9uIEl0KGUpe2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihlKXx8ZTwwKXRocm93IEVycm9yKCJwb3NpdGl2ZSBpbnRlZ2VyIGV4cGVjdGVkLCBnb3QgIitlKX1mdW5jdGlvbiBOZShlLC4uLnQpe2lmKCFPbyhlKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoPjAmJiF0LmluY2x1ZGVzKGUubGVuZ3RoKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCBvZiBsZW5ndGggIit0KyIsIGdvdCBsZW5ndGg9IitlLmxlbmd0aCl9ZnVuY3Rpb24geHQoZSx0PSEwKXtpZihlLmRlc3Ryb3llZCl0aHJvdyBFcnJvcigiSGFzaCBpbnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQiKTtpZih0JiZlLmZpbmlzaGVkKXRocm93IEVycm9yKCJIYXNoI2RpZ2VzdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIil9ZnVuY3Rpb24gWnQoZSx0KXtOZShlKTtsZXQgcj10Lm91dHB1dExlbjtpZihlLmxlbmd0aDxyKXRocm93IEVycm9yKCJkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAiK3IpfWZ1bmN0aW9uIFJzKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gbmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxNYXRoLmZsb29yKGUuYnl0ZUxlbmd0aC80KSl9ZnVuY3Rpb24gaXQoLi4uZSl7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5maWxsKDApfWZ1bmN0aW9uIEV0KGUsdCl7cmV0dXJuIGU8PDMyLXR8ZT4+PnR9dmFyIExzPSgoKT0+bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KFsyODc0NTQwMjBdKS5idWZmZXIpWzBdPT09NjgpKCk7ZnVuY3Rpb24gT3MoZSl7cmV0dXJuIGU8PDI0JjQyNzgxOTAwODB8ZTw8OCYxNjcxMTY4MHxlPj4+OCY2NTI4MHxlPj4+MjQmMjU1fXZhciBLcz1Mcz8oZSk9PmU6KGUpPT5PcyhlKTtmdW5jdGlvbiBLbyhlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdPU9zKGVbdF0pO3JldHVybiBlfXZhciBpZT1Mcz8oZSk9PmU6S287ZnVuY3Rpb24gVm8oZSl7aWYodHlwZW9mIGUhPT0ic3RyaW5nIil0aHJvdyBFcnJvcigic3RyaW5nIGV4cGVjdGVkIik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSl9ZnVuY3Rpb24gb3QoZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIillPVZvKGUpO3JldHVybiBOZShlKSxlfWNsYXNzIHRue31mdW5jdGlvbiBWcyhlKXtsZXQgdD0obixzKT0+ZShzKS51cGRhdGUob3QobikpLmRpZ2VzdCgpLHI9ZSh7fSk7cmV0dXJuIHQub3V0cHV0TGVuPXIub3V0cHV0TGVuLHQuYmxvY2tMZW49ci5ibG9ja0xlbix0LmNyZWF0ZT0obik9PmUobiksdH12YXIgX3M9VWludDMyQXJyYXkuZnJvbShbMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdKTt2YXIgZXI9QmlnSW50KDQyOTQ5NjcyOTUpLE5zPUJpZ0ludCgzMik7ZnVuY3Rpb24gcm4oZSx0PSExKXtpZih0KXJldHVybntoOk51bWJlcihlJmVyKSxsOk51bWJlcihlPj5OcyZlcil9O3JldHVybntoOk51bWJlcihlPj5OcyZlcil8MCxsOk51bWJlcihlJmVyKXwwfX1mdW5jdGlvbiBQZShlLHQscixuLHMpe3JldHVybiBlPWUrdCtzfDAsbj1FdChuXmUsMTYpLHI9citufDAsdD1FdCh0XnIsMTIpLHthOmUsYjp0LGM6cixkOm59fWZ1bmN0aW9uIFVlKGUsdCxyLG4scyl7cmV0dXJuIGU9ZSt0K3N8MCxuPUV0KG5eZSw4KSxyPXIrbnwwLHQ9RXQodF5yLDcpLHthOmUsYjp0LGM6cixkOm59fWNsYXNzIG5uIGV4dGVuZHMgdG57Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO3RoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5sZW5ndGg9MCx0aGlzLnBvcz0wLEl0KGUpLEl0KHQpLHRoaXMuYmxvY2tMZW49ZSx0aGlzLm91dHB1dExlbj10LHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KGUpLHRoaXMuYnVmZmVyMzI9c3QodGhpcy5idWZmZXIpfXVwZGF0ZShlKXt4dCh0aGlzKSxlPW90KGUpLE5lKGUpO2xldHtibG9ja0xlbjp0LGJ1ZmZlcjpyLGJ1ZmZlcjMyOm59PXRoaXMscz1lLmxlbmd0aCxpPWUuYnl0ZU9mZnNldCxvPWUuYnVmZmVyO2ZvcihsZXQgYT0wO2E8czspe2lmKHRoaXMucG9zPT09dClpZShuKSx0aGlzLmNvbXByZXNzKG4sMCwhMSksaWUobiksdGhpcy5wb3M9MDtsZXQgYz1NYXRoLm1pbih0LXRoaXMucG9zLHMtYSksdT1pK2E7aWYoYz09PXQmJiEodSU0KSYmYStjPHMpe2xldCBsPW5ldyBVaW50MzJBcnJheShvLHUsTWF0aC5mbG9vcigocy1hKS80KSk7aWUobCk7Zm9yKGxldCBmPTA7YSt0PHM7Zis9bi5sZW5ndGgsYSs9dCl0aGlzLmxlbmd0aCs9dCx0aGlzLmNvbXByZXNzKGwsZiwhMSk7aWUobCk7Y29udGludWV9ci5zZXQoZS5zdWJhcnJheShhLGErYyksdGhpcy5wb3MpLHRoaXMucG9zKz1jLHRoaXMubGVuZ3RoKz1jLGErPWN9cmV0dXJuIHRoaXN9ZGlnZXN0SW50byhlKXt4dCh0aGlzKSxadChlLHRoaXMpO2xldHtwb3M6dCxidWZmZXIzMjpyfT10aGlzO3RoaXMuZmluaXNoZWQ9ITAsaXQodGhpcy5idWZmZXIuc3ViYXJyYXkodCkpLGllKHIpLHRoaXMuY29tcHJlc3MociwwLCEwKSxpZShyKTtsZXQgbj1zdChlKTt0aGlzLmdldCgpLmZvckVhY2goKHMsaSk9Pm5baV09S3MocykpfWRpZ2VzdCgpe2xldHtidWZmZXI6ZSxvdXRwdXRMZW46dH09dGhpczt0aGlzLmRpZ2VzdEludG8oZSk7bGV0IHI9ZS5zbGljZSgwLHQpO3JldHVybiB0aGlzLmRlc3Ryb3koKSxyfV9jbG9uZUludG8oZSl7bGV0e2J1ZmZlcjp0LGxlbmd0aDpyLGZpbmlzaGVkOm4sZGVzdHJveWVkOnMsb3V0cHV0TGVuOmkscG9zOm99PXRoaXM7cmV0dXJuIGV8fChlPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtka0xlbjppfSkpLGUuc2V0KC4uLnRoaXMuZ2V0KCkpLGUuYnVmZmVyLnNldCh0KSxlLmRlc3Ryb3llZD1zLGUuZmluaXNoZWQ9bixlLmxlbmd0aD1yLGUucG9zPW8sZS5vdXRwdXRMZW49aSxlfWNsb25lKCl7cmV0dXJuIHRoaXMuX2Nsb25lSW50bygpfX1mdW5jdGlvbiBzbihlLHQscixuLHMsaSxvLGEsYyx1LGwsZixoLHksZyxtLFMsRSx3LHgpe2xldCBiPTA7Zm9yKGxldCBBPTA7QTxuO0ErKykoe2E6cyxiOmMsYzpoLGQ6U309UGUocyxjLGgsUyxyW3QrZVtiKytdXSkpLHthOnMsYjpjLGM6aCxkOlN9PVVlKHMsYyxoLFMsclt0K2VbYisrXV0pLHthOmksYjp1LGM6eSxkOkV9PVBlKGksdSx5LEUsclt0K2VbYisrXV0pLHthOmksYjp1LGM6eSxkOkV9PVVlKGksdSx5LEUsclt0K2VbYisrXV0pLHthOm8sYjpsLGM6ZyxkOnd9PVBlKG8sbCxnLHcsclt0K2VbYisrXV0pLHthOm8sYjpsLGM6ZyxkOnd9PVVlKG8sbCxnLHcsclt0K2VbYisrXV0pLHthLGI6ZixjOm0sZDp4fT1QZShhLGYsbSx4LHJbdCtlW2IrK11dKSx7YSxiOmYsYzptLGQ6eH09VWUoYSxmLG0seCxyW3QrZVtiKytdXSkse2E6cyxiOnUsYzpnLGQ6eH09UGUocyx1LGcseCxyW3QrZVtiKytdXSkse2E6cyxiOnUsYzpnLGQ6eH09VWUocyx1LGcseCxyW3QrZVtiKytdXSkse2E6aSxiOmwsYzptLGQ6U309UGUoaSxsLG0sUyxyW3QrZVtiKytdXSkse2E6aSxiOmwsYzptLGQ6U309VWUoaSxsLG0sUyxyW3QrZVtiKytdXSkse2E6byxiOmYsYzpoLGQ6RX09UGUobyxmLGgsRSxyW3QrZVtiKytdXSkse2E6byxiOmYsYzpoLGQ6RX09VWUobyxmLGgsRSxyW3QrZVtiKytdXSkse2EsYjpjLGM6eSxkOnd9PVBlKGEsYyx5LHcsclt0K2VbYisrXV0pLHthLGI6YyxjOnksZDp3fT1VZShhLGMseSx3LHJbdCtlW2IrK11dKTtyZXR1cm57djA6cyx2MTppLHYyOm8sdjM6YSx2NDpjLHY1OnUsdjY6bCx2NzpmLHY4Omgsdjk6eSx2MTA6Zyx2MTE6bSx2MTI6Uyx2MTM6RSx2MTQ6dyx2MTU6eH19dmFyIHhlPXtDSFVOS19TVEFSVDoxLENIVU5LX0VORDoyLFBBUkVOVDo0LFJPT1Q6OCxLRVlFRF9IQVNIOjE2LERFUklWRV9LRVlfQ09OVEVYVDozMixERVJJVkVfS0VZX01BVEVSSUFMOjY0fSxrZT1fcy5zbGljZSgpLHFzPSgoKT0+e2xldCBlPUFycmF5LmZyb20oe2xlbmd0aDoxNn0sKG4scyk9PnMpLHQ9KG4pPT5bMiw2LDMsMTAsNywwLDQsMTMsMSwxMSwxMiw1LDksMTQsMTUsOF0ubWFwKChzKT0+bltzXSkscj1bXTtmb3IobGV0IG49MCxzPWU7bjw3O24rKyxzPXQocykpci5wdXNoKC4uLnMpO3JldHVybiBVaW50OEFycmF5LmZyb20ocil9KSgpO2NsYXNzIG9uIGV4dGVuZHMgbm57Y29uc3RydWN0b3IoZT17fSx0PTApe3N1cGVyKDY0LGUuZGtMZW49PT12b2lkIDA/MzI6ZS5ka0xlbik7dGhpcy5jaHVua1Bvcz0wLHRoaXMuY2h1bmtzRG9uZT0wLHRoaXMuZmxhZ3M9MCx0aGlzLnN0YWNrPVtdLHRoaXMucG9zT3V0PTAsdGhpcy5idWZmZXJPdXQzMj1uZXcgVWludDMyQXJyYXkoMTYpLHRoaXMuY2h1bmtPdXQ9MCx0aGlzLmVuYWJsZVhPRj0hMDtsZXR7a2V5OnIsY29udGV4dDpufT1lLHM9biE9PXZvaWQgMDtpZihyIT09dm9pZCAwKXtpZihzKXRocm93IEVycm9yKCdPbmx5ICJrZXkiIG9yICJjb250ZXh0IiBjYW4gYmUgc3BlY2lmaWVkIGF0IHNhbWUgdGltZScpO2xldCBpPW90KHIpLnNsaWNlKCk7TmUoaSwzMiksdGhpcy5JVj1zdChpKSxpZSh0aGlzLklWKSx0aGlzLmZsYWdzPXR8eGUuS0VZRURfSEFTSH1lbHNlIGlmKHMpe2xldCBpPW90KG4pLG89bmV3IG9uKHtka0xlbjozMn0seGUuREVSSVZFX0tFWV9DT05URVhUKS51cGRhdGUoaSkuZGlnZXN0KCk7dGhpcy5JVj1zdChvKSxpZSh0aGlzLklWKSx0aGlzLmZsYWdzPXR8eGUuREVSSVZFX0tFWV9NQVRFUklBTH1lbHNlIHRoaXMuSVY9a2Uuc2xpY2UoKSx0aGlzLmZsYWdzPXQ7dGhpcy5zdGF0ZT10aGlzLklWLnNsaWNlKCksdGhpcy5idWZmZXJPdXQ9UnModGhpcy5idWZmZXJPdXQzMil9Z2V0KCl7cmV0dXJuW119c2V0KCl7fWIyQ29tcHJlc3MoZSx0LHIsbj0wKXtsZXR7c3RhdGU6cyxwb3M6aX09dGhpcyx7aDpvLGw6YX09cm4oQmlnSW50KGUpLCEwKSx7djA6Yyx2MTp1LHYyOmwsdjM6Zix2NDpoLHY1OnksdjY6Zyx2NzptLHY4OlMsdjk6RSx2MTA6dyx2MTE6eCx2MTI6Yix2MTM6QSx2MTQ6RCx2MTU6VH09c24ocXMsbixyLDcsc1swXSxzWzFdLHNbMl0sc1szXSxzWzRdLHNbNV0sc1s2XSxzWzddLGtlWzBdLGtlWzFdLGtlWzJdLGtlWzNdLG8sYSxpLHQpO3NbMF09Y15TLHNbMV09dV5FLHNbMl09bF53LHNbM109Zl54LHNbNF09aF5iLHNbNV09eV5BLHNbNl09Z15ELHNbN109bV5UfWNvbXByZXNzKGUsdD0wLHI9ITEpe2xldCBuPXRoaXMuZmxhZ3M7aWYoIXRoaXMuY2h1bmtQb3Mpbnw9eGUuQ0hVTktfU1RBUlQ7aWYodGhpcy5jaHVua1Bvcz09PTE1fHxyKW58PXhlLkNIVU5LX0VORDtpZighcil0aGlzLnBvcz10aGlzLmJsb2NrTGVuO2lmKHRoaXMuYjJDb21wcmVzcyh0aGlzLmNodW5rc0RvbmUsbixlLHQpLHRoaXMuY2h1bmtQb3MrPTEsdGhpcy5jaHVua1Bvcz09PTE2fHxyKXtsZXQgcz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpO2ZvcihsZXQgaSxvPXRoaXMuY2h1bmtzRG9uZSsxO3J8fCEobyYxKTtvPj49MSl7aWYoIShpPXRoaXMuc3RhY2sucG9wKCkpKWJyZWFrO3RoaXMuYnVmZmVyMzIuc2V0KGksMCksdGhpcy5idWZmZXIzMi5zZXQocyw4KSx0aGlzLnBvcz10aGlzLmJsb2NrTGVuLHRoaXMuYjJDb21wcmVzcygwLHRoaXMuZmxhZ3N8eGUuUEFSRU5ULHRoaXMuYnVmZmVyMzIsMCkscz10aGlzLnN0YXRlLHRoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpfXRoaXMuY2h1bmtzRG9uZSsrLHRoaXMuY2h1bmtQb3M9MCx0aGlzLnN0YWNrLnB1c2gocyl9dGhpcy5wb3M9MH1fY2xvbmVJbnRvKGUpe2U9c3VwZXIuX2Nsb25lSW50byhlKTtsZXR7SVY6dCxmbGFnczpyLHN0YXRlOm4sY2h1bmtQb3M6cyxwb3NPdXQ6aSxjaHVua091dDpvLHN0YWNrOmEsY2h1bmtzRG9uZTpjfT10aGlzO3JldHVybiBlLnN0YXRlLnNldChuLnNsaWNlKCkpLGUuc3RhY2s9YS5tYXAoKHUpPT5VaW50MzJBcnJheS5mcm9tKHUpKSxlLklWLnNldCh0KSxlLmZsYWdzPXIsZS5jaHVua1Bvcz1zLGUuY2h1bmtzRG9uZT1jLGUucG9zT3V0PWksZS5jaHVua091dD1vLGUuZW5hYmxlWE9GPXRoaXMuZW5hYmxlWE9GLGUuYnVmZmVyT3V0MzIuc2V0KHRoaXMuYnVmZmVyT3V0MzIpLGV9ZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwLGl0KHRoaXMuc3RhdGUsdGhpcy5idWZmZXIzMix0aGlzLklWLHRoaXMuYnVmZmVyT3V0MzIpLGl0KC4uLnRoaXMuc3RhY2spfWIyQ29tcHJlc3NPdXQoKXtsZXR7c3RhdGU6ZSxwb3M6dCxmbGFnczpyLGJ1ZmZlcjMyOm4sYnVmZmVyT3V0MzI6c309dGhpcyx7aDppLGw6b309cm4oQmlnSW50KHRoaXMuY2h1bmtPdXQrKykpO2llKG4pO2xldHt2MDphLHYxOmMsdjI6dSx2MzpsLHY0OmYsdjU6aCx2Njp5LHY3Omcsdjg6bSx2OTpTLHYxMDpFLHYxMTp3LHYxMjp4LHYxMzpiLHYxNDpBLHYxNTpEfT1zbihxcywwLG4sNyxlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sa2VbMF0sa2VbMV0sa2VbMl0sa2VbM10sbyxpLHQscik7c1swXT1hXm0sc1sxXT1jXlMsc1syXT11XkUsc1szXT1sXncsc1s0XT1mXngsc1s1XT1oXmIsc1s2XT15XkEsc1s3XT1nXkQsc1s4XT1lWzBdXm0sc1s5XT1lWzFdXlMsc1sxMF09ZVsyXV5FLHNbMTFdPWVbM11edyxzWzEyXT1lWzRdXngsc1sxM109ZVs1XV5iLHNbMTRdPWVbNl1eQSxzWzE1XT1lWzddXkQsaWUobiksaWUocyksdGhpcy5wb3NPdXQ9MH1maW5pc2goKXtpZih0aGlzLmZpbmlzaGVkKXJldHVybjt0aGlzLmZpbmlzaGVkPSEwLGl0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zKSk7bGV0IGU9dGhpcy5mbGFnc3x4ZS5ST09UO2lmKHRoaXMuc3RhY2subGVuZ3RoKWV8PXhlLlBBUkVOVCxpZSh0aGlzLmJ1ZmZlcjMyKSx0aGlzLmNvbXByZXNzKHRoaXMuYnVmZmVyMzIsMCwhMCksaWUodGhpcy5idWZmZXIzMiksdGhpcy5jaHVua3NEb25lPTAsdGhpcy5wb3M9dGhpcy5ibG9ja0xlbjtlbHNlIGV8PSghdGhpcy5jaHVua1Bvcz94ZS5DSFVOS19TVEFSVDowKXx4ZS5DSFVOS19FTkQ7dGhpcy5mbGFncz1lLHRoaXMuYjJDb21wcmVzc091dCgpfXdyaXRlSW50byhlKXt4dCh0aGlzLCExKSxOZShlKSx0aGlzLmZpbmlzaCgpO2xldHtibG9ja0xlbjp0LGJ1ZmZlck91dDpyfT10aGlzO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzOyl7aWYodGhpcy5wb3NPdXQ+PXQpdGhpcy5iMkNvbXByZXNzT3V0KCk7bGV0IGk9TWF0aC5taW4odC10aGlzLnBvc091dCxzLW4pO2Uuc2V0KHIuc3ViYXJyYXkodGhpcy5wb3NPdXQsdGhpcy5wb3NPdXQraSksbiksdGhpcy5wb3NPdXQrPWksbis9aX1yZXR1cm4gZX14b2ZJbnRvKGUpe2lmKCF0aGlzLmVuYWJsZVhPRil0aHJvdyBFcnJvcigiWE9GIGlzIG5vdCBwb3NzaWJsZSBhZnRlciBkaWdlc3QgY2FsbCIpO3JldHVybiB0aGlzLndyaXRlSW50byhlKX14b2YoZSl7cmV0dXJuIEl0KGUpLHRoaXMueG9mSW50byhuZXcgVWludDhBcnJheShlKSl9ZGlnZXN0SW50byhlKXtpZihadChlLHRoaXMpLHRoaXMuZmluaXNoZWQpdGhyb3cgRXJyb3IoImRpZ2VzdCgpIHdhcyBhbHJlYWR5IGNhbGxlZCIpO3JldHVybiB0aGlzLmVuYWJsZVhPRj0hMSx0aGlzLndyaXRlSW50byhlKSx0aGlzLmRlc3Ryb3koKSxlfWRpZ2VzdCgpe3JldHVybiB0aGlzLmRpZ2VzdEludG8obmV3IFVpbnQ4QXJyYXkodGhpcy5vdXRwdXRMZW4pKX19dmFyIGFuPVZzKChlKT0+bmV3IG9uKGUpKTt2YXIgX289MzIsQ2g9U3ltYm9sKCJYMjU1MTlTayIpO2Z1bmN0aW9uIEZzKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PV9vKXJldHVybiBkKDEwKTtyZXR1cm4gcChlKX12YXIgVz0oMW48PDI1NW4pLTE5bixObz0xMjE2NjVuLFdzPW5ldyBVaW50OEFycmF5KDMyKTtXc1swXT05O2Z1bmN0aW9uIHpzKGUpe2xldCB0PTBuO2ZvcihsZXQgcj1lLmxlbmd0aC0xO3I+PTA7ci0tKXQ9dDw8OG58QmlnSW50KGVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIHFvKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KDMyKSxyPShlJVcrVyklVztmb3IobGV0IG49MDtuPDMyO24rKyl0W25dPU51bWJlcihyJjB4ZmZuKSxyPj49OG47cmV0dXJuIHR9ZnVuY3Rpb24gRm8oZSl7bGV0IHQ9ZS5zbGljZSgpO3JldHVybiB0WzMxXSY9MTI3LHpzKHQpfWZ1bmN0aW9uIFdvKGUpe2xldCB0PWUuc2xpY2UoKTtyZXR1cm4gdFswXSY9MjQ4LHRbMzFdJj0xMjcsdFszMV18PTY0LHR9ZnVuY3Rpb24gdHIoZSx0LHIpe2xldCBuPS1lLHM9KHRecikmbjtyZXR1cm5bdF5zLHJec119ZnVuY3Rpb24gem8oZSl7bGV0IHQ9Vy0ybixyPShlJVcrVyklVyxuPTFuO3doaWxlKHQ+MG4pe2lmKHQmMW4pbj1uKnIlVztyPXIqciVXLHQ+Pj0xbn1yZXR1cm4gbn1mdW5jdGlvbiBjbihlLHQpe2xldCByPVdvKGUpLG49Rm8odCkscz0xbixpPTBuLG89bixhPTFuLGM9MG4sdT16cyhyKTtmb3IobGV0IGw9MjU0O2w+PTA7bC0tKXtsZXQgZj11Pj5CaWdJbnQobCkmMW47Y149ZixbcyxvXT10cihjLHMsbyksW2ksYV09dHIoYyxpLGEpLGM9ZjtsZXQgaD0ocytpKSVXLHk9aCpoJVcsZz0ocy1pK1cpJVcsbT1nKmclVyxTPSh5LW0rVyklVyxFPShvK2EpJVcseD0oby1hK1cpJVcqaCVXLGI9RSpnJVcsQT0oeCtiKSVXLEQ9KHgtYitXKSVXO289QSpBJVcsYT1uKkQqRCVXLHM9eSptJVcsaT1TKih5K05vKlMpJVd9cmV0dXJuW3Msb109dHIoYyxzLG8pLFtpLGFdPXRyKGMsaSxhKSxyLmZpbGwoMCkscW8ocyp6byhpKSVXKX1mdW5jdGlvbiBYcyhlKXtyZXR1cm4gY24oZSxXcyl9dmFyIGRuPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEyLDQsMzQsNCwzMl0pO2Z1bmN0aW9uIGpzKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGRuLmxlbmd0aCszMik7cmV0dXJuIHQuc2V0KGRuKSx0LnNldChlLnN1YmFycmF5KDAsMzIpLGRuLmxlbmd0aCksdH12YXIgdW49bmV3IFVpbnQ4QXJyYXkoWzQ4LDQ2LDIsMSwwLDQ4LDUsNiwzLDQzLDEwMSwxMTAsNCwzNCw0LDMyXSk7ZnVuY3Rpb24gJHMoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkodW4ubGVuZ3RoKzMyKTtyZXR1cm4gdC5zZXQodW4pLHQuc2V0KGUuc3ViYXJyYXkoMCwzMiksdW4ubGVuZ3RoKSx0fWZ1bmN0aW9uIEdzKGUpe3JldHVybiB0eXBlb2YgZT09PSJzdHJpbmciP25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKTplfWZ1bmN0aW9uIEJlKGUpe2xldCB0PW5ldyBBcnJheUJ1ZmZlcihlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheSh0KS5zZXQoZSksdH1jbGFzcyBxZXt2ZXJpZnlLZXlzPW5ldyBNYXA7YXN5bmMgZ2VuUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIHd0KGUpfWFzeW5jIGdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKXtyZXR1cm4gd3QoMzIpfWFzeW5jIGVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQoZSx0KXtsZXQgcj13dCgyNCkscz1lbih0LHIpLmVuY3J5cHQoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KFsuLi5yLC4uLnNdKX1hc3luYyBkZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGUsdCl7bGV0IHI9ZS5zbGljZSgwLDI0KSxuPWUuc2xpY2UoMjQpO3JldHVybiBlbih0LHIpLmRlY3J5cHQobil9YXN5bmMgZGVyaXZlRWQyNTUxOUtleVBhaXIoZSl7bGV0IHQ9ZSxyPWpzKHQpLG49QmUociksczt0cnl7bGV0IHU9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG4se25hbWU6IkVkMjU1MTkifSwhMCxbInNpZ24iXSk7cz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJqd2siLHUpfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9aWYodHlwZW9mIHMueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJFZDI1NTE5IEpXSyBtaXNzaW5nIHgiKTtsZXQgaT1zLng7cy5kPXZvaWQgMDtsZXQgbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJqd2siLHtrdHk6Ik9LUCIsY3J2OiJFZDI1NTE5Iix4Oml9LHtuYW1lOiJFZDI1NTE5In0sITAsWyJ2ZXJpZnkiXSksYT1uZXcgVWludDhBcnJheShhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJyYXciLG8pKTt0aGlzLnZlcmlmeUtleXMuc2V0KFNlKGEpLG8pO2xldCBjPW5ldyBVaW50OEFycmF5KDY0KTtyZXR1cm4gYy5zZXQodCwwKSxjLnNldChhLDMyKSx7a2V5VHlwZToiZWQyNTUxOSIscHJpdmF0ZUtleTpjLHB1YmxpY0tleTphfX1hc3luYyBpbXBvcnRTaWduS2V5KGUpe2xldCB0PWUuc3ViYXJyYXkoMCwzMikscj1qcyh0KSxuPUJlKHIpO3RyeXtyZXR1cm4gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG4se25hbWU6IkVkMjU1MTkifSwhMSxbInNpZ24iXSl9ZmluYWxseXtyLmZpbGwoMCksbmV3IFVpbnQ4QXJyYXkobikuZmlsbCgwKX19YXN5bmMgaW1wb3J0VmVyaWZ5S2V5KGUpe2xldCB0PVNlKGUpLHI9dGhpcy52ZXJpZnlLZXlzLmdldCh0KTtpZihyKXJldHVybiByO2xldCBuPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsQmUoZSkse25hbWU6IkVkMjU1MTkifSwhMSxbInZlcmlmeSJdKTtyZXR1cm4gdGhpcy52ZXJpZnlLZXlzLnNldCh0LG4pLG59YXN5bmMgc2lnbkVkMjU1MTkoZSx0KXtsZXQgcj1HcyhlKSxuPWF3YWl0IHRoaXMuaW1wb3J0U2lnbktleSh0KSxzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5zaWduKHtuYW1lOiJFZDI1NTE5In0sbixCZShyKSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHMpfWFzeW5jIGNoZWNrU2lnRWQyNTUxOShlLHQscil7bGV0IG49R3ModCk7dHJ5e2xldCBzPWF3YWl0IHRoaXMuaW1wb3J0VmVyaWZ5S2V5KHIpO3JldHVybiBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUudmVyaWZ5KHtuYW1lOiJFZDI1NTE5In0scyxCZShlKSxCZShuKSl9Y2F0Y2h7cmV0dXJuITF9fWFzeW5jIGJsYWtlMyhlLHQpe2lmKHQ9PT12b2lkIDApcmV0dXJuIGFuKGUpO3JldHVybiBhbihlLHQpfWFzeW5jIGdlblgyNTUxOSgpe2xldCBlPWF3YWl0IHd0KDMyKTtlWzBdJj0yNDgsZVszMV0mPTEyNyxlWzMxXXw9NjQ7bGV0W3Qscl09RnMoZSk7aWYociE9PTB8fHQ9PT12b2lkIDApdGhyb3cgZS5maWxsKDApLEVycm9yKCJYMjU1MTkgc2NhbGFyIGJyYW5kIGZhaWxlZCIpO2xldCBuPVhzKHQpLHM9JHModCksaT1CZShzKTt0cnl7bGV0IG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLGkse25hbWU6IlgyNTUxOSJ9LCEwLFsiZGVyaXZlQml0cyJdKSxhPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsbyk7aWYodHlwZW9mIGEueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJYMjU1MTkgSldLIG1pc3NpbmcgeCIpO2xldCBjPVluKGEueCk7aWYoYS5kPXZvaWQgMCwhWShjLG4pKXRocm93IEVycm9yKCJYMjU1MTkgV2ViQ3J5cHRvIHB1YiAhPSBSRkMgNzc0OCIpO3JldHVybntwcml2OnQscHViOm59fWNhdGNoKG8pe3Rocm93IHQuZmlsbCgwKSxvfWZpbmFsbHl7cy5maWxsKDApLG5ldyBVaW50OEFycmF5KGkpLmZpbGwoMCl9fWFzeW5jIHgyNTUxOVNoYXJlZChlLHQpe2xldCByPSRzKGUpLG49QmUocik7dHJ5e2xldCBzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJYMjU1MTkifSwhMSxbImRlcml2ZUJpdHMiXSksaT1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLEJlKHQpLHtuYW1lOiJYMjU1MTkifSwhMSxbXSksbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyh7bmFtZToiWDI1NTE5IixwdWJsaWM6aX0scywyNTYpO3JldHVybiBuZXcgVWludDhBcnJheShvKX1jYXRjaHtyZXR1cm4gY24oZSx0KX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfX19dmFyIFhvPW5ldyBxZSxycj1Ybzt2YXIgSj0iZW50aXRpZXMiLG5yPSJlbnRpdHlfdHlwZV9jcmVhdGVkX2F0Iixmbj0iZW50aXR5X3R5cGVfdXBkYXRlZF9hdCIscG49ImVudGl0eV90eXBlX3BhcmVudF9pZCIsYXQ9ImVudGl0eV90YWdzIixRcz0iZW50aXR5X3R5cGVfZ3JvdXBfaWQiLFlzPSJkYiIsSnM9MTQ7ZnVuY3Rpb24gam8oZSl7cmV0dXJuInR5cCJpbiBlfWZ1bmN0aW9uICRvKGUpe2xldCB0PXtib2Q6ZS5ib2R5LGNyZDplLmNyZWF0ZWRBdCwuLi5lLmN0ciE9PTA/e2N0cjplLmN0cn06e30sZWlkOlIoZS5laWQpLHBpZDplLnBpZD9SKGUucGlkKTp2b2lkIDAsdGdzOmUudGFncyx0eXA6ZS50eXBlLHVwZDplLnVwZGF0ZWRBdH07aWYodC5waWQ9PT12b2lkIDApZGVsZXRlIHQucGlkO2lmKHQudGdzPT09dm9pZCAwKWRlbGV0ZSB0LnRncztpZih0LmN0cj09PXZvaWQgMClkZWxldGUgdC5jdHI7cmV0dXJuIHR9ZnVuY3Rpb24gR28oZSl7aWYoIUcoZSkpcmV0dXJue2VpZDpSKGUuZWlkKSx1cGQ6ZS51cGRhdGVkQXQsLi4uZS5jdHIhPT0wP3tjdHI6ZS5jdHJ9Ont9fTtyZXR1cm4gJG8oZSl9ZnVuY3Rpb24gY3QoZSl7cmV0dXJue2JvZHk6ZS5ib2QsY3JlYXRlZEF0OmUuY3JkLHVwZGF0ZWRBdDplLnVwZCxjdHI6ZS5jdHI/PzAsdHlwZTplLnR5cCxlaWQ6bWUoZS5laWQpLHBpZDplLnBpZD9tZShlLnBpZCk6dm9pZCAwLC4uLmUudGdzIT09dm9pZCAwP3t0YWdzOmUudGdzfTp7fX19ZnVuY3Rpb24gbG4oZSl7aWYoam8oZSkpcmV0dXJuIGN0KGUpO3JldHVybntlaWQ6bWUoZS5laWQpLHVwZGF0ZWRBdDplLnVwZCxjdHI6ZS5jdHI/PzB9fWZ1bmN0aW9uIFFvKGUsdCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIElEQktleVJhbmdlLm9ubHkoW2UsdF0pO2xldCByPXQucmFuZ2U7cmV0dXJuIElEQktleVJhbmdlLmJvdW5kKFtlLHIuc3RhcnRdLFtlLHIuZW5kXSxyLmV4Y2x1ZGVTdGFydD09PSEwLHIuZXhjbHVkZUVuZD09PSEwKX1mdW5jdGlvbiBZbyhlKXtpZih0eXBlb2YgZT09PSJzdHJpbmciKXJldHVybiBJREJLZXlSYW5nZS5vbmx5KGUpO2lmKCJyYW5nZSJpbiBlKXtsZXQgdD1lLnJhbmdlO3JldHVybiBJREJLZXlSYW5nZS5ib3VuZCh0LnN0YXJ0LHQuZW5kLHQuZXhjbHVkZVN0YXJ0PT09ITAsdC5leGNsdWRlRW5kPT09ITApfXJldHVybiBJREJLZXlSYW5nZS5ib3VuZChlLnByZWZpeCxlLnByZWZpeCsi77+/Iil9ZnVuY3Rpb24gSm8oZSx0LHIpe2xldCBuPVtdO2lmKHR5cGVvZiByPT09InN0cmluZyIpe2ZvcihsZXQgbyBvZiBlKWlmKG8udHlwPT09dCluLnB1c2goY3QobykpO3JldHVybiBufWxldCBzPW5ldyBTZXQsaT0icHJlZml4ImluIHI/ci5wcmVmaXg6dm9pZCAwO2ZvcihsZXQgbyBvZiBlKXtpZihvLnR5cCE9PXQpY29udGludWU7aWYocy5oYXMoby5laWQpKWNvbnRpbnVlO2lmKGkhPT12b2lkIDApe2xldCBhPW8udGdzO2lmKCFhfHwhYS5zb21lKChjKT0+Yy5zdGFydHNXaXRoKGkpKSljb250aW51ZX1zLmFkZChvLmVpZCksbi5wdXNoKGN0KG8pKX1yZXR1cm4gbn1jbGFzcyBac3tkYjtvcGVuaW5nO2FzeW5jIGluaXQoKXthd2FpdCB0aGlzLmVuc3VyZURiKCl9YXN5bmMgZW5zdXJlRGIoKXtpZih0aGlzLmRiKXJldHVybiB0aGlzLmRiO2lmKHRoaXMub3BlbmluZylyZXR1cm4gdGhpcy5vcGVuaW5nO3JldHVybiB0aGlzLm9wZW5pbmc9ZWEoKS50aGVuKChlKT0+KGUub252ZXJzaW9uY2hhbmdlPSgpPT57aWYoZS5jbG9zZSgpLHRoaXMuZGI9PT1lKXRoaXMuZGI9dm9pZCAwfSx0aGlzLmRiPWUsdGhpcy5vcGVuaW5nPXZvaWQgMCxlKSwoZSk9Pnt0aHJvdyB0aGlzLm9wZW5pbmc9dm9pZCAwLGV9KSx0aGlzLm9wZW5pbmd9YXBwbHk9YXN5bmMoZSk9PntsZXQgdD1uZXcgU2V0LHI9W10sbj1wZXJmb3JtYW5jZS5ub3coKTtGKCJpZGIgYXBwbHkgc3RhcnQiLHtvcHM6ZS5sZW5ndGh9KTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJue3N0YXRzOmUubWFwKCgpPT4xNiksdHlwZXM6dCxlaWRzOnJ9fWxldCBpPXMudHJhbnNhY3Rpb24oSiwicmVhZHdyaXRlIiksbz1pLm9iamVjdFN0b3JlKEopO3JldHVybiBuZXcgUHJvbWlzZSgoYSk9PntsZXQgYz1BcnJheShlLmxlbmd0aCkuZmlsbCgwKTtpZihlLmxlbmd0aDwxKXthKHtzdGF0czpbXSx0eXBlczp0LGVpZHM6cn0pO3JldHVybn1pLm9uY29tcGxldGU9KCk9PntGKCJpZGIgYXBwbHkgY29tcGxldGUiLHtvcHM6ZS5sZW5ndGgsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS1uKX0pLGEoe3N0YXRzOmMsdHlwZXM6dCxlaWRzOnJ9KX0saS5vbmVycm9yPSgpPT57Zm9yKGxldCBsPTA7bDxjLmxlbmd0aDtsKyspaWYoY1tsXT09PXZvaWQgMCljW2xdPTE4O2Eoe3N0YXRzOmMsdHlwZXM6dCxlaWRzOnJ9KX07bGV0IHU9bmV3IE1hcDtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrKyl7bGV0IGY9ZVtsXSxoPVIoZi5laWQpLHk9e29wOmYsaW5kZXg6bH0sZz11LmdldChoKTtpZihnKWcucHVzaCh5KTtlbHNlIHUuc2V0KGgsW3ldKX1mb3IobGV0W2wsZl1vZiB1KXtpZihmLmxlbmd0aDwxKWNvbnRpbnVlO2xldCBoPW8uZ2V0KGwpO2gub25zdWNjZXNzPSgpPT57bGV0IHk9aC5yZXN1bHQsZz15P2xuKHkpOnZvaWQgMCxtPSExO2ZvcihsZXR7b3A6UyxpbmRleDpFfW9mIGYpe2xldFt3LHhdPVplKGcsUyk7aWYoeCE9PTApe2NbRV09eDtjb250aW51ZX1pZih3PT09dm9pZCAwKXtjW0VdPTEyO2NvbnRpbnVlfW09ITA7Zm9yKGxldCBiIG9mIGV0KGcsdykpdC5hZGQoYik7Zz13fWlmKG0pci5wdXNoKGZbMF0ub3AuZWlkKTtpZihnKXtsZXQgUz1vLnB1dChHbyhnKSk7Uy5vbmVycm9yPShFKT0+e0UucHJldmVudERlZmF1bHQoKTtmb3IobGV0e2luZGV4Ond9b2YgZiljW3ddPTE4fX19LGgub25lcnJvcj0oKT0+e2ZvcihsZXR7aW5kZXg6eX1vZiBmKWNbeV09MTh9fX0pfTthc3luYyBjbGVhcigpe2xldCBlO3RyeXtlPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gMTZ9bGV0IHQ9ZS50cmFuc2FjdGlvbihKLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoSik7cmV0dXJuIG5ldyBQcm9taXNlKChuKT0+e3Qub25jb21wbGV0ZT0oKT0+bigwKSx0Lm9uZXJyb3I9KCk9Pm4oMTgpLHIuY2xlYXIoKX0pfWFzeW5jIGdldFJvdyhlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGQoMTYpfWxldCByPVIoZSkscz10LnRyYW5zYWN0aW9uKEosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoSik7cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPXMuZ2V0KHIpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoIWEpaShwKHZvaWQgMCkpO2Vsc2UgaShwKGxuKGEpKSl9LG8ub25lcnJvcj0oKT0+aShkKDE4KSl9KX1hc3luYyBnZXRFbnQoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRSb3coZSk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMHx8IUcodCkpcmV0dXJuIHAodm9pZCAwKTtyZXR1cm4gcCh0KX1hc3luYyBnZXRCeVVwZGF0ZWRBdChlLHQpe2xldFtyLG5dPWd0KHQpO2lmKG4hPT0wKXJldHVybiBkKG4pO2lmKCFyKXJldHVybiBwKFtdKTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGQoMTYpfWxldCBvPXMudHJhbnNhY3Rpb24oSiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShKKS5pbmRleChmbiksYT1RbyhlLHQpO3JldHVybiBuZXcgUHJvbWlzZSgoYyk9PntsZXQgdT1vLmdldEFsbChhKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBsPXUucmVzdWx0O2MocChsLm1hcChjdCkpKX0sdS5vbmVycm9yPSgpPT5jKGQoMTgpKX0pfWFzeW5jIGdldEFsbE9mVHlwZShlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGQoMTYpfWxldCBuPXQudHJhbnNhY3Rpb24oSiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShKKS5pbmRleChucik7cmV0dXJuIG5ldyBQcm9taXNlKChzKT0+e2xldCBpPW4uZ2V0QWxsKElEQktleVJhbmdlLmJvdW5kKFtlXSxbZSxbXV0pKTtpLm9uc3VjY2Vzcz0oKT0+e2xldCBvPWkucmVzdWx0O3MocChvLm1hcChjdCkpKX0saS5vbmVycm9yPSgpPT5zKGQoMTgpKX0pfWFzeW5jIGdldEJ5VGFnKGUsdCl7bGV0W3Isbl09U3QodCk7aWYobiE9PTApcmV0dXJuIGQobik7aWYoIXIpcmV0dXJuIHAoW10pO2xldCBzO3RyeXtzPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gZCgxNil9bGV0IGk9WW8odCksYT1zLnRyYW5zYWN0aW9uKEosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoSikuaW5kZXgoYXQpO3JldHVybiBuZXcgUHJvbWlzZSgoYyk9PntsZXQgdT1hLmdldEFsbChpKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBsPXUucmVzdWx0O2MocChKbyhsLGUsdCkpKX0sdS5vbmVycm9yPSgpPT5jKGQoMTgpKX0pfWFzeW5jIGdldEFsbEVudGl0aWVzKGUpe2lmKCJwaWQiaW4gZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBkKDE2KX1sZXQgcj1SKGUucGlkKSxzPXQudHJhbnNhY3Rpb24oSiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShKKS5pbmRleChwbik7cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPXMuZ2V0QWxsKElEQktleVJhbmdlLm9ubHkoW2UudHlwZSxyXSkpO28ub25zdWNjZXNzPSgpPT57bGV0IGM9by5yZXN1bHQubWFwKGN0KTtpKHAoYykpfSxvLm9uZXJyb3I9KCk9PmkoZCgxOCkpfSl9ZWxzZSBpZigidGFnImluIGUpcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QnlUYWcoZS50eXBlLGUudGFnKTtlbHNlIGlmKCJ1cGRhdGVkQXQiaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVVwZGF0ZWRBdChlLnR5cGUsZS51cGRhdGVkQXQpO3JldHVybiBhd2FpdCB0aGlzLmdldEFsbE9mVHlwZShlLnR5cGUpfWFzeW5jIGdldEVudGl0aWVzKGUpe2xldCB0PXBlcmZvcm1hbmNlLm5vdygpLFtyLG5dPWF3YWl0IHRoaXMuZ2V0QWxsRW50aXRpZXMoZSk7aWYoRigiaWRiIGdldEVudGl0aWVzIix7dHlwZTplLnR5cGUsbjpyPy5sZW5ndGg/PzAsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS10KX0pLG4hPT0wKXJldHVybiBkKG4pO3JldHVybiBwKHIpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gZCgxNil9bGV0IG49dC50cmFuc2FjdGlvbihKLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKEopLmluZGV4KG5yKTtyZXR1cm4gbmV3IFByb21pc2UoKHMpPT57bGV0IGk9SURCS2V5UmFuZ2UuYm91bmQoW2VdLFtlLFtdXSksbz1uLmNvdW50KGkpO28ub25zdWNjZXNzPSgpPT5zKHAoby5yZXN1bHQpKSxvLm9uZXJyb3I9KCk9PnMoZCgxOCkpfSl9YXN5bmMgY2hlY2tzdW0oZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBkKDE2KX1sZXQgbj10LnRyYW5zYWN0aW9uKEosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoSikscz1bXTtyZXR1cm4gbmV3IFByb21pc2UoKGkpPT57bGV0IG89bi5vcGVuQ3Vyc29yKCk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgYT1vLnJlc3VsdDtpZihhKXtsZXQgYz1hLnZhbHVlO3MucHVzaChXdChsbihjKSkpLGEuY29udGludWUoKX1lbHNlIHF0KHMsZSkudGhlbihpKX0sby5vbmVycm9yPSgpPT5pKGQoMTgpKX0pfX1mdW5jdGlvbiBabyhlLHQpe2lmKCFlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoSikpZS5jcmVhdGVPYmplY3RTdG9yZShKLHtrZXlQYXRoOiJlaWQiLGF1dG9JbmNyZW1lbnQ6ITF9KTtsZXQgcj10Lm9iamVjdFN0b3JlKEopO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMobnIpKXIuY3JlYXRlSW5kZXgobnIsWyJ0eXAiLCJjcmQiXSx7dW5pcXVlOiExfSk7aWYoIXIuaW5kZXhOYW1lcy5jb250YWlucyhmbikpci5jcmVhdGVJbmRleChmbixbInR5cCIsInVwZCJdLHt1bmlxdWU6ITF9KTtpZihyLmluZGV4TmFtZXMuY29udGFpbnMoUXMpKXIuZGVsZXRlSW5kZXgoUXMpO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMocG4pKXIuY3JlYXRlSW5kZXgocG4sWyJ0eXAiLCJwaWQiXSx7dW5pcXVlOiExfSk7aWYoci5pbmRleE5hbWVzLmNvbnRhaW5zKGF0KSl7aWYoci5pbmRleChhdCkua2V5UGF0aCE9PSJ0Z3MiKXIuZGVsZXRlSW5kZXgoYXQpfWlmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoYXQpKXIuY3JlYXRlSW5kZXgoYXQsInRncyIse3VuaXF1ZTohMSxtdWx0aUVudHJ5OiEwfSl9ZnVuY3Rpb24gZWEoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntsZXQgcj1pbmRleGVkREIub3BlbihZcyxKcyk7ci5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntsZXR7cmVzdWx0Om4sdHJhbnNhY3Rpb246c309cjtpZighcyl7dChFcnJvcigiVHJhbnNhY3Rpb24gaXMgbnVsbCBkdXJpbmcgRW50REIgdXBncmFkZSIpKTtyZXR1cm59dHJ5e1pvKG4scyl9Y2F0Y2goaSl7dChpIGluc3RhbmNlb2YgRXJyb3I/aTpFcnJvcihTdHJpbmcoaSkpKX19LHIub25ibG9ja2VkPSgpPT57Y29uc29sZS53YXJuKGBbRElQTE9NQVRJQ10gRW50REIgSURCIHVwZ3JhZGUgYmxvY2tlZCAoJHtZc30g4oaSIHYke0pzfSk7IHdhaXRpbmcgZm9yIG90aGVyIGNvbm5lY3Rpb25zIHRvIGNsb3NlYCl9LHIub25zdWNjZXNzPSgpPT5lKHIucmVzdWx0KSxyLm9uZXJyb3I9KCk9PnQoci5lcnJvcj8/RXJyb3IoIkVudERCIEluZGV4ZWREQiBvcGVuIGZhaWxlZCIpKX0pfWFzeW5jIGZ1bmN0aW9uIGVpKCl7bGV0IGU9bmV3IFpzO3JldHVybiBhd2FpdCBlLmluaXQoKSxlfWNsYXNzIGhue2VudHM9bmV3IE1hcDt1c2VJbmRleDtieVR5cGU9bmV3IE1hcDtieVR5cGVQaWQ9bmV3IE1hcDtieVR5cGVUYWc9bmV3IE1hcDtjb25zdHJ1Y3RvcihlPVtdLHQpe3RoaXMudXNlSW5kZXg9dD8uaW5kZXhlcyE9PSExO2ZvcihsZXQgciBvZiBlKXRoaXMucHV0KHIpfXB1dChlKXtsZXQgdD1SKGUuZWlkKSxyPXRoaXMuZW50cy5nZXQodCk7aWYociE9PXZvaWQgMCYmRyhyKSl0aGlzLnVuaW5kZXgodCxyKTtpZih0aGlzLmVudHMuc2V0KHQsZSksRyhlKSl0aGlzLmluZGV4KHQsZSl9ZGVsKGUpe2xldCB0PXRoaXMuZW50cy5nZXQoZSk7aWYodD09PXZvaWQgMClyZXR1cm47aWYoRyh0KSl0aGlzLnVuaW5kZXgoZSx0KTt0aGlzLmVudHMuZGVsZXRlKGUpfWluZGV4KGUsdCl7aWYoIXRoaXMudXNlSW5kZXgpcmV0dXJuO2xldCByPXRoaXMuYnlUeXBlLmdldCh0LnR5cGUpO2lmKCFyKXI9bmV3IE1hcCx0aGlzLmJ5VHlwZS5zZXQodC50eXBlLHIpO2lmKHIuc2V0KGUsdCksdC5waWQpe2xldCBuPVIodC5waWQpLHM9dGhpcy5ieVR5cGVQaWQuZ2V0KHQudHlwZSk7aWYoIXMpcz1uZXcgTWFwLHRoaXMuYnlUeXBlUGlkLnNldCh0LnR5cGUscyk7bGV0IGk9cy5nZXQobik7aWYoIWkpaT1uZXcgTWFwLHMuc2V0KG4saSk7aS5zZXQoZSx0KX1pZih0LnRhZ3Mpe2xldCBuPXRoaXMuYnlUeXBlVGFnLmdldCh0LnR5cGUpO2lmKCFuKW49bmV3IE1hcCx0aGlzLmJ5VHlwZVRhZy5zZXQodC50eXBlLG4pO2ZvcihsZXQgcyBvZiB0LnRhZ3Mpe2xldCBpPW4uZ2V0KHMpO2lmKCFpKWk9bmV3IE1hcCxuLnNldChzLGkpO2kuc2V0KGUsdCl9fX11bmluZGV4KGUsdCl7aWYoIXRoaXMudXNlSW5kZXgpcmV0dXJuO2xldCByPXRoaXMuYnlUeXBlLmdldCh0LnR5cGUpO2lmKHIpe2lmKHIuZGVsZXRlKGUpLHIuc2l6ZT09PTApdGhpcy5ieVR5cGUuZGVsZXRlKHQudHlwZSl9aWYodC5waWQpe2xldCBuPVIodC5waWQpLHM9dGhpcy5ieVR5cGVQaWQuZ2V0KHQudHlwZSksaT1zPy5nZXQobik7aWYoaSl7aWYoaS5kZWxldGUoZSksaS5zaXplPT09MClzPy5kZWxldGUobil9aWYocyYmcy5zaXplPT09MCl0aGlzLmJ5VHlwZVBpZC5kZWxldGUodC50eXBlKX1pZih0LnRhZ3Mpe2xldCBuPXRoaXMuYnlUeXBlVGFnLmdldCh0LnR5cGUpO2lmKG4pe2ZvcihsZXQgcyBvZiB0LnRhZ3Mpe2xldCBpPW4uZ2V0KHMpO2lmKGkpe2lmKGkuZGVsZXRlKGUpLGkuc2l6ZT09PTApbi5kZWxldGUocyl9fWlmKG4uc2l6ZT09PTApdGhpcy5ieVR5cGVUYWcuZGVsZXRlKHQudHlwZSl9fX1jbGVhckluZGV4ZXMoKXt0aGlzLmJ5VHlwZS5jbGVhcigpLHRoaXMuYnlUeXBlUGlkLmNsZWFyKCksdGhpcy5ieVR5cGVUYWcuY2xlYXIoKX1idWNrZXRMaXN0KGUpe2lmKCFlfHxlLnNpemU9PT0wKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgciBvZiBlLnZhbHVlcygpKXQucHVzaChyKTtyZXR1cm4gdH1ieVRhZ1NwZWMoZSx0KXtsZXRbcixuXT1TdCh0KTtpZihuIT09MClyZXR1cm4gZChuKTtpZighcilyZXR1cm4gcChbXSk7aWYodHlwZW9mIHQ9PT0ic3RyaW5nIilyZXR1cm4gcCh0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGVUYWcuZ2V0KGUpPy5nZXQodCkpKTtsZXQgcz10aGlzLmJ5VHlwZVRhZy5nZXQoZSk7aWYoIXMpcmV0dXJuIHAoW10pO2xldCBpPW5ldyBTZXQsbz1bXTtmb3IobGV0W2EsY11vZiBzKXtpZighUnIoYSx0KSljb250aW51ZTtmb3IobGV0W3UsbF1vZiBjKXtpZihpLmhhcyh1KSljb250aW51ZTtpLmFkZCh1KSxvLnB1c2gobCl9fXJldHVybiBwKG8pfWJ5RGF0ZVNwZWMoZSx0KXtsZXRbcixuXT1ndCh0KTtpZihuIT09MClyZXR1cm4gZChuKTtpZighcilyZXR1cm4gcChbXSk7bGV0IHM9W10saT10aGlzLmJ5VHlwZS5nZXQoZSk7aWYoaSl7Zm9yKGxldCBvIG9mIGkudmFsdWVzKCkpaWYoTXIoby51cGRhdGVkQXQsdCkpcy5wdXNoKG8pfXJldHVybiBwKHMpfWFzeW5jIGFwcGx5KGUpe2xldCB0PW5ldyBTZXQscj1bXSxuPVtdO2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1SKHMuZWlkKSxvPXRoaXMuZW50cy5nZXQoaSksW2EsY109WmUobyxzKTtpZihjIT09MCl7bi5wdXNoKGMpO2NvbnRpbnVlfWlmKGE9PT12b2lkIDApe24ucHVzaCgxMik7Y29udGludWV9Zm9yKGxldCB1IG9mIGV0KG8sYSkpdC5hZGQodSk7dGhpcy5wdXQoYSksci5wdXNoKHMuZWlkKSxuLnB1c2goMCl9cmV0dXJue3N0YXRzOm4sdHlwZXM6dCxlaWRzOnJ9fWFzeW5jIGNsZWFyKCl7cmV0dXJuIHRoaXMuZW50cy5jbGVhcigpLHRoaXMuY2xlYXJJbmRleGVzKCksMH1hc3luYyBnZXRSb3coZSl7bGV0IHQ9UihlKSxyPXRoaXMuZW50cy5nZXQodCk7cmV0dXJuIHAocil9YXN5bmMgZ2V0RW50KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0Um93KGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2lmKHQ9PT12b2lkIDB8fCFHKHQpKXJldHVybiBwKHZvaWQgMCk7cmV0dXJuIHAodCl9YXN5bmMgZ2V0QWxsRW50aXRpZXMoZSl7bGV0e3R5cGU6dH09ZTtpZih0aGlzLnVzZUluZGV4KXtpZigicGlkImluIGUpe2xldCBuPVIoZS5waWQpO3JldHVybiBwKHRoaXMuYnVja2V0TGlzdCh0aGlzLmJ5VHlwZVBpZC5nZXQodCk/LmdldChuKSkpfWlmKCJ0YWciaW4gZSlyZXR1cm4gdGhpcy5ieVRhZ1NwZWModCxlLnRhZyk7aWYoInVwZGF0ZWRBdCJpbiBlKXJldHVybiB0aGlzLmJ5RGF0ZVNwZWModCxlLnVwZGF0ZWRBdCk7cmV0dXJuIHAodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlLmdldCh0KSkpfWxldCByPVtdO2lmKCJwaWQiaW4gZSl7Zm9yKGxldCBuIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihHKG4pJiZuLnR5cGU9PT10JiZuLnBpZCYmWShuLnBpZCxlLnBpZCkpci5wdXNoKG4pfWVsc2UgaWYoInRhZyJpbiBlKXtsZXQgbj1lLnRhZyxbcyxpXT1TdChuKTtpZihpIT09MClyZXR1cm4gZChpKTtpZighcylyZXR1cm4gcChyKTtmb3IobGV0IG8gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEcobykmJm8udHlwZT09PXQmJm8udGFncyYmby50YWdzLnNvbWUoKGEpPT5ScihhLG4pKSlyLnB1c2gobyl9ZWxzZSBpZigidXBkYXRlZEF0ImluIGUpe2xldCBuPWUudXBkYXRlZEF0LFtzLGldPWd0KG4pO2lmKGkhPT0wKXJldHVybiBkKGkpO2lmKCFzKXJldHVybiBwKHIpO2ZvcihsZXQgbyBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRyhvKSYmby50eXBlPT09dCYmTXIoby51cGRhdGVkQXQsbikpci5wdXNoKG8pfWVsc2UgZm9yKGxldCBuIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihHKG4pJiZuLnR5cGU9PT10KXIucHVzaChuKTtyZXR1cm4gcChyKX1hc3luYyBnZXRFbnRpdGllcyhlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldEFsbEVudGl0aWVzKGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO3JldHVybiBwKHQpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2lmKHRoaXMudXNlSW5kZXgpcmV0dXJuIHAodGhpcy5ieVR5cGUuZ2V0KGUpPy5zaXplPz8wKTtsZXQgdD0wO2ZvcihsZXQgciBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRyhyKSYmci50eXBlPT09ZSl0Kz0xO3JldHVybiBwKHQpfWFzeW5jIGNoZWNrc3VtKGUpe2xldCB0PVtdO2ZvcihsZXQgciBvZiB0aGlzLmVudHMudmFsdWVzKCkpdC5wdXNoKFd0KHIpKTtyZXR1cm4gcXQodCxlKX19ZnVuY3Rpb24gdGEoZSl7bGV0IHQ9Z2xvYmFsVGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7aWYodHlwZW9mIHQhPT0iZnVuY3Rpb24iKXtxdWV1ZU1pY3JvdGFzayhlKTtyZXR1cm59dCgoKT0+e3QoZSl9KX1hc3luYyBmdW5jdGlvbiByaShlKXtpZihlPy52ZXJib3NlIT09dm9pZCAwKWhzKGUudmVyYm9zZSk7bGV0IHQ9YXdhaXQgZWkoKTtpZihlPy5jYWNoZT09PSExKXJldHVybiB0O3JldHVybiBuZXcgbmkodCx2b2lkIDAse2luZGV4ZXM6ZT8uaW5kZXhlcyxvcHRpbWlzdGljOmU/Lm9wdGltaXN0aWN9KX1jbGFzcyBuaXttZW07ZHVyYWJsZTt3YXJtZWQ9bmV3IFNldDtsaXN0ZW5lcnM9bmV3IFNldDtjaGFpbj1Qcm9taXNlLnJlc29sdmUoKTtvcHRpbWlzdGljO2luZmxpZ2h0PTA7d2FybVA9bmV3IE1hcDtjb25zdHJ1Y3RvcihlLHQscil7aWYodGhpcy5kdXJhYmxlPWUsdGhpcy5vcHRpbWlzdGljPXI/Lm9wdGltaXN0aWMhPT0hMSxGKCJDYWNoZWRFbnREQiBvcGVuIix7b3B0aW1pc3RpYzp0aGlzLm9wdGltaXN0aWN9KSx0aGlzLm1lbT1uZXcgaG4odD8/W10se2luZGV4ZXM6cj8uaW5kZXhlc30pLHQpZm9yKGxldCBuIG9mIHQpdGhpcy53YXJtZWQuYWRkKG4udHlwZSl9c3Vic2NyaWJlKGUpe3JldHVybiB0aGlzLmxpc3RlbmVycy5hZGQoZSksKCk9Pnt0aGlzLmxpc3RlbmVycy5kZWxldGUoZSl9fWVtaXQoZSl7aWYoZS5zaXplPDEpcmV0dXJuO2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO0YoImVtaXQgc3RhcnQiLHt0eXBlczpbLi4uZV0sbGlzdGVuZXJzOnRoaXMubGlzdGVuZXJzLnNpemV9KTtmb3IobGV0IHIgb2YgdGhpcy5saXN0ZW5lcnMpcihlKTtGKCJlbWl0IGRvbmUiLHttczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSl9cnVuKGUpe2xldCB0PXRoaXMuY2hhaW4udGhlbihlLGUpO3JldHVybiB0aGlzLmNoYWluPXQudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSx0fWFwcGx5KGUpe2xldCB0LHI7aWYodGhpcy5vcHRpbWlzdGljKXtyPWFhKHRoaXMubWVtLGUpLnR5cGVzLHQ9bmV3IE1hcDtmb3IobGV0IHMgb2YgZSl7bGV0IGk9UihzLmVpZCk7dC5zZXQoaSx0aSh0aGlzLm1lbS5lbnRzLmdldChpKSkpfXRoaXMuaW5mbGlnaHQrPTEsRigiYXBwbHkgbWVtIHBhdGNoZWQiLHtvcHM6ZS5sZW5ndGgsdHlwZXM6cj9bLi4ucl06W10saW5mbGlnaHQ6dGhpcy5pbmZsaWdodH0pfWxldCBuPXRoaXMucnVuKGFzeW5jKCk9PntGKCJwZXJzaXN0IHN0YXJ0Iix7b3BzOmUubGVuZ3RofSk7dHJ5e2xldCBzPXBlcmZvcm1hbmNlLm5vdygpLGk9YXdhaXQgdGhpcy5kdXJhYmxlLmFwcGx5KGUpO2lmKEYoInBlcnNpc3QgZHVyYWJsZS5hcHBseSBkb25lIix7bXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS1zKX0pLCF0aGlzLm9wdGltaXN0aWMpe2xldHtjaGFuZ2VkOmEsc3RhdHVzOmN9PWF3YWl0IHRoaXMucHVsbEVpZHMoZS5tYXAoKHUpPT51LmVpZCkpO2lmKHRoaXMuZW1pdChhKSxjIT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PmMpLHR5cGVzOmkudHlwZXMsZWlkczppLmVpZHN9O3JldHVybiBpfWxldCBvPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKWlmKGkuc3RhdHNbYV0hPT0wKW8ucHVzaChlW2FdLmVpZCk7aWYoby5sZW5ndGg+MCl7RigicGVyc2lzdCBwdWxsIHJlamVjdGVkIGVpZHMiLHtuOm8ubGVuZ3RofSk7bGV0e2NoYW5nZWQ6YSxzdGF0dXM6Y309YXdhaXQgdGhpcy5wdWxsRWlkcyhvLHQpO2lmKHRoaXMuZW1pdChhKSxjIT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PmMpLHR5cGVzOmkudHlwZXMsZWlkczppLmVpZHN9fXJldHVybiBGKCJwZXJzaXN0IGRvbmUiKSxpfWZpbmFsbHl7aWYodGhpcy5vcHRpbWlzdGljKXRoaXMuaW5mbGlnaHQtPTF9fSk7aWYocil0YSgoKT0+e0YoImVtaXQgYWZ0ZXIgcGFpbnQiKSx0aGlzLmVtaXQocil9KTtyZXR1cm4gbn1jbGVhcigpe3JldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0IGU9YXdhaXQgdGhpcy5kdXJhYmxlLmNsZWFyKCk7aWYoZSE9PTApcmV0dXJuIGU7bGV0IHQ9dGhpcy5tZW0uZW50cy5zaXplPjA7cmV0dXJuIGF3YWl0IHRoaXMubWVtLmNsZWFyKCksdGhpcy53YXJtZWQuY2xlYXIoKSwwfSl9aW5nZXN0RnJvbUR1cmFibGUoZSl7bGV0IHQ9Wy4uLmVdLmxlbmd0aDtyZXR1cm4gRigiaW5nZXN0IHF1ZXVlZCIse2VpZHM6dH0pLHRoaXMucnVuKGFzeW5jKCk9PntsZXQgcj1wZXJmb3JtYW5jZS5ub3coKTtGKCJpbmdlc3Qgc3RhcnQiLHtlaWRzOnR9KTtsZXR7Y2hhbmdlZDpuLHN0YXR1czpzfT1hd2FpdCB0aGlzLnB1bGxFaWRzKGUpO3JldHVybiBGKCJpbmdlc3QgZG9uZSIse21zOk1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCktciksY2hhbmdlZDpbLi4ubl19KSx0aGlzLmVtaXQobiksc30pfWFzeW5jIHB1bGxFaWRzKGUsdCl7bGV0IHI9bmV3IFNldCxuPW5ldyBTZXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBpPVIocyk7aWYobi5oYXMoaSkpY29udGludWU7bi5hZGQoaSk7bGV0W28sYV09YXdhaXQgdGhpcy5kdXJhYmxlLmdldFJvdyhzKTtpZihhIT09MClyZXR1cm57Y2hhbmdlZDpyLHN0YXR1czphfTtsZXQgYz10aGlzLm1lbS5lbnRzLmdldChpKTtpZihjIT09dm9pZCAwJiZvIT09dm9pZCAwJiZ5bihjLG8pKWNvbnRpbnVlO2lmKHQpe2lmKCFvYSh0aShjKSx0LmdldChpKSkpY29udGludWV9aWYobyl7aWYodGhpcy5tZW0ucHV0KG8pLCFjfHwhcmEoYyxvKSl7aWYoRyhvKSlyLmFkZChvLnR5cGUpO2lmKGMhPT12b2lkIDAmJkcoYykpci5hZGQoYy50eXBlKX19ZWxzZSBpZihjIT09dm9pZCAwKXtpZih0aGlzLm1lbS5kZWwoaSksRyhjKSlyLmFkZChjLnR5cGUpfX1yZXR1cm57Y2hhbmdlZDpyLHN0YXR1czowfX1hc3luYyB3YXJtVHlwZShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIDA7bGV0IHQ9cGVyZm9ybWFuY2Uubm93KCk7Rigid2FybVR5cGUgc3RhcnQiLHt0eXBlOmV9KTtsZXRbcixuXT1hd2FpdCB0aGlzLmR1cmFibGUuZ2V0RW50aXRpZXMoe3R5cGU6ZX0pO2lmKG4hPT0wKXJldHVybiBuO2lmKHIpZm9yKGxldCBzIG9mIHIpe2xldCBpPVIocy5laWQpLG89dGhpcy5tZW0uZW50cy5nZXQoaSk7aWYoIW98fHluKHMsbykpdGhpcy5tZW0ucHV0KHMpfXJldHVybiB0aGlzLndhcm1lZC5hZGQoZSksRigid2FybVR5cGUgZG9uZSIse3R5cGU6ZSxuOnI/Lmxlbmd0aD8/MCxtczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSksMH1iZWdpbldhcm0oZSl7aWYodGhpcy53YXJtZWQuaGFzKGUpKXJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7bGV0IHQ9dGhpcy53YXJtUC5nZXQoZSk7aWYodClyZXR1cm4gdDtsZXQgcj10aGlzLndhcm1UeXBlKGUpLmZpbmFsbHkoKCk9Pnt0aGlzLndhcm1QLmRlbGV0ZShlKX0pO3JldHVybiB0aGlzLndhcm1QLnNldChlLHIpLHJ9ZW5zdXJlV2FybShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuO3RoaXMuYmVnaW5XYXJtKGUpLnRoZW4oKHQpPT57aWYodD09PTApdGhpcy5lbWl0KG5ldyBTZXQoW2VdKSl9KX1hc3luYyBnZXRSb3coZSl7bGV0IHQ9UihlKTtpZih0aGlzLm1lbS5lbnRzLmhhcyh0KSlyZXR1cm4gdGhpcy5tZW0uZ2V0Um93KGUpO2xldFtyLG5dPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRSb3coZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocil7bGV0IHM9dGhpcy5tZW0uZW50cy5nZXQodCk7aWYoIXN8fHluKHIscykpdGhpcy5tZW0ucHV0KHIpfXJldHVybiB0aGlzLm1lbS5nZXRSb3coZSl9YXN5bmMgZ2V0RW50KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0Um93KGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2lmKHQ9PT12b2lkIDB8fCFHKHQpKXJldHVybiBwKHZvaWQgMCk7cmV0dXJuIHAodCl9YXN5bmMgZ2V0RW50aXRpZXMoZSl7aWYodGhpcy53YXJtZWQuaGFzKGUudHlwZSkpcmV0dXJuIEYoImdldEVudGl0aWVzIG1lbSIse3R5cGU6ZS50eXBlfSksdGhpcy5tZW0uZ2V0RW50aXRpZXMoZSk7aWYodGhpcy5pbmZsaWdodD4wKXJldHVybiBGKCJnZXRFbnRpdGllcyBpbmZsaWdodC1tZW0iLHt0eXBlOmUudHlwZX0pLHRoaXMuZW5zdXJlV2FybShlLnR5cGUpLHRoaXMubWVtLmdldEVudGl0aWVzKGUpO0YoImdldEVudGl0aWVzIGJlZ2luV2FybSIse3R5cGU6ZS50eXBlfSk7bGV0IHQ9YXdhaXQgdGhpcy5iZWdpbldhcm0oZS50eXBlKTtpZih0IT09MClyZXR1cm4gZCh0KTtyZXR1cm4gRigiZ2V0RW50aXRpZXMgYWZ0ZXJXYXJtIix7dHlwZTplLnR5cGV9KSx0aGlzLm1lbS5nZXRFbnRpdGllcyhlKX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6ZX0pO2lmKHRoaXMuaW5mbGlnaHQ+MClyZXR1cm4gdGhpcy5lbnN1cmVXYXJtKGUpLHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6ZX0pO2xldCB0PWF3YWl0IHRoaXMuYmVnaW5XYXJtKGUpO2lmKHQhPT0wKXJldHVybiBkKHQpO3JldHVybiB0aGlzLm1lbS5jb3VudEVudGl0aWVzKHt0eXBlOmV9KX1hc3luYyBjaGVja3N1bShlKXtyZXR1cm4gdGhpcy5kdXJhYmxlLmNoZWNrc3VtKGUpfX1mdW5jdGlvbiByYShlLHQpe2lmKEcoZSkhPT1HKHQpKXJldHVybiExO2lmKGUuY3RyIT09dC5jdHIpcmV0dXJuITE7aWYoZS51cGRhdGVkQXQuZ2V0VGltZSgpIT09dC51cGRhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKCFZKGUuZWlkLHQuZWlkKSlyZXR1cm4hMTtpZighRyhlKXx8IUcodCkpcmV0dXJuITA7aWYoZS5jcmVhdGVkQXQuZ2V0VGltZSgpIT09dC5jcmVhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKGUudHlwZSE9PXQudHlwZSlyZXR1cm4hMTtpZighc2EoZS5waWQsdC5waWQpKXJldHVybiExO2lmKCFuYShlLnRhZ3MsdC50YWdzKSlyZXR1cm4hMTtyZXR1cm4gaWEoZS5ib2R5LHQuYm9keSl9ZnVuY3Rpb24gbmEoZSx0KXtpZihlPT09dClyZXR1cm4hMDtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiExO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gc2EoZSx0KXtpZihlPT09dm9pZCAwJiZ0PT09dm9pZCAwKXJldHVybiEwO2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuITE7cmV0dXJuIFkoZSx0KX1mdW5jdGlvbiBpYShlLHQpe2lmKE9iamVjdC5pcyhlLHQpKXJldHVybiEwO2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZ0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gWShlLHQpO2lmKGUgaW5zdGFuY2VvZiBEYXRlJiZ0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTt0cnl7cmV0dXJuIFkoT2UoZSksT2UodCkpfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiB5bihlLHQpe2xldCByPWUudXBkYXRlZEF0LmdldFRpbWUoKSxuPXQudXBkYXRlZEF0LmdldFRpbWUoKTtpZihyIT09bilyZXR1cm4gcj5uO3JldHVybiBlLmN0cj50LmN0cn1mdW5jdGlvbiB0aShlKXtpZihlPT09dm9pZCAwKXJldHVybjtyZXR1cm57dDplLnVwZGF0ZWRBdC5nZXRUaW1lKCksY3RyOmUuY3RyfX1mdW5jdGlvbiBvYShlLHQpe2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuIGU9PT10O3JldHVybiBlLnQ9PT10LnQmJmUuY3RyPT09dC5jdHJ9ZnVuY3Rpb24gYWEoZSx0KXtsZXQgcj1uZXcgU2V0LG49W107Zm9yKGxldCBzIG9mIHQpe2xldCBpPVIocy5laWQpLG89ZS5lbnRzLmdldChpKSxbYSxjXT1aZShvLHMpO2lmKGMhPT0wKXtuLnB1c2goYyk7Y29udGludWV9aWYoYT09PXZvaWQgMCl7bi5wdXNoKDEyKTtjb250aW51ZX1mb3IobGV0IHUgb2YgZXQobyxhKSlyLmFkZCh1KTtlLnB1dChhKSxuLnB1c2goMCl9cmV0dXJue3N0YXRzOm4sdHlwZXM6cn19dmFyIHNyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQuaGFuZGxlKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyU3RyaW5nKHQubGFiZWwpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiBlLndyaXRlVmFySW50KHQuaWR4Pz8wKX0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhclN0cmluZygpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPWUucmVhZFZhclN0cmluZygpO2lmKHMhPT0wKXJldHVybiBkKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBkKG8pO3JldHVybiBwKHtoYW5kbGU6dCxsYWJlbDpuLGlkeDppfSl9fTt2YXIgbW49e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJJbnQodC5ob3N0cy5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO2ZvcihsZXQgbiBvZiB0Lmhvc3RzKXtsZXQgcz1lLndyaXRlU3RydWN0KHNyLG4pO2lmKHMhPT0wKXJldHVybiBzfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMHx8dDwwKXJldHVybiBkKDEwKTtsZXQgbj1bXTtmb3IobGV0IHM9MDtzPHQ7cysrKXtsZXRbaSxvXT1lLnJlYWRTdHJ1Y3Qoc3IpO2lmKG8hPT0wKXJldHVybiBkKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGQoMTQpO24ucHVzaChpKX1yZXR1cm4gcCh7aG9zdHM6bn0pfX07dmFyIGNhPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5xcnBhaXIudjEiKSxkdD0zMixkYT1kdCsyNCsxNix1YT0zMixOeT1TeW1ib2woIkRIS0VSZXEiKSxxeT1TeW1ib2woIkRIS0VSZXNwIik7ZnVuY3Rpb24gZ24oZSl7aWYoZS5ieXRlTGVuZ3RoIT09ZHQpcmV0dXJuIGQoMTApO3JldHVybiBwKGUpfWZ1bmN0aW9uIGlpKGUpe2lmKGUuYnl0ZUxlbmd0aDxkYSlyZXR1cm4gZCgxMCk7cmV0dXJuIHAoZSl9dmFyIHNpPW5ldyBxZTthc3luYyBmdW5jdGlvbiBTbihlLHQscixuKXtsZXQgczt0cnl7cz1hd2FpdCBzaS54MjU1MTlTaGFyZWQoZSx0KX1jYXRjaHtyZXR1cm4gZCgyOSl9dHJ5e2lmKHMuYnl0ZUxlbmd0aCE9PWR0fHxzLmV2ZXJ5KChhKT0+YT09PTApKXJldHVybiBkKDEwKTtsZXQgaT1iZShzLGNhKSxvPWJlKGksYmUocixuKSk7dHJ5e2xldCBhPWF3YWl0IHNpLmJsYWtlMyhvKTtyZXR1cm4gcChhLnNsaWNlKDAsdWEpKX1maW5hbGx5e2kuZmlsbCgwKSxvLmZpbGwoMCl9fWZpbmFsbHl7cy5maWxsKDApfX1mdW5jdGlvbiB2ZShlKXtsZXQgdD1uZXcgVWludDhBcnJheShlKTtpZihlPjApY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh0KTtyZXR1cm4gdH12YXIgRmU9MzIsaXI9IkRJUExPTUFUSUMiLEVlPSJwdWJsaWMta2V5IixsYT0tNyxmYT0tOCxwYT0tMjU3LG9yPVt7dHlwZTpFZSxhbGc6bGF9LHt0eXBlOkVlLGFsZzpmYX0se3R5cGU6RWUsYWxnOnBhfV07ZnVuY3Rpb24gaGEoZSl7cmV0dXJuIGUudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXC4kLywiIil8fCJsb2NhbGhvc3QifWZ1bmN0aW9uIE1lKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGUuYnl0ZUxlbmd0aCk7cmV0dXJuIHQuc2V0KGUpLHQuYnVmZmVyfWZ1bmN0aW9uIGFyKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSkuc2xpY2UoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCkuc2xpY2UoKX1mdW5jdGlvbiBXZShlKXtpZihlPy5ycElkIT09dm9pZCAwKXJldHVybiBwKGUucnBJZCk7aWYodHlwZW9mIGxvY2F0aW9uPiJ1IilyZXR1cm4gZCg5KTtyZXR1cm4gcChoYShsb2NhdGlvbi5ob3N0bmFtZSkpfXZhciBvaT0iIjtmdW5jdGlvbiBSZShlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe29pPWUubWVzc2FnZT09PSIiP2UubmFtZTpgJHtlLm5hbWV9OiAke2UubWVzc2FnZX1gO3JldHVybn1vaT1TdHJpbmcoZSl9ZnVuY3Rpb24gY3IoZSl7aWYoIShlIGluc3RhbmNlb2YgRXJyb3IpKXJldHVybiExO3JldHVybiBlLm5hbWU9PT0iTm90QWxsb3dlZEVycm9yIiYmZS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImRvZXMgbm90IGhhdmUgZm9jdXMiKX1mdW5jdGlvbiBhaSgpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuITA7cmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSE9PSJoaWRkZW4ifWZ1bmN0aW9uIHV0KCl7aWYodHlwZW9mIGdsb2JhbFRoaXMuZm9jdXMhPT0iZnVuY3Rpb24iKXJldHVybjt0cnl7Z2xvYmFsVGhpcy5mb2N1cygpfWNhdGNoe319ZnVuY3Rpb24gZHIoZT0yNTAwKXtpZihhaSgpKXJldHVybiB1dCgpLFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBuZXcgUHJvbWlzZSgodCk9PntsZXQgcj0oKT0+e2NsZWFyVGltZW91dChzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKSx1dCgpLHQoKX0sbj0oKT0+e2lmKGFpKCkpcigpfSxzPXNldFRpbWVvdXQocixlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKSxuKCl9KX1hc3luYyBmdW5jdGlvbiB1cihlKXthd2FpdCBkcigpO3RyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShlKX1jYXRjaCh0KXtpZighY3IodCkpdGhyb3cgdDtyZXR1cm4gdXQoKSxhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKGUpfX1hc3luYyBmdW5jdGlvbiBscihlKXthd2FpdCBkcigpO3RyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChlKX1jYXRjaCh0KXtpZighY3IodCkpdGhyb3cgdDtyZXR1cm4gdXQoKSxhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KGUpfX1mdW5jdGlvbiB6ZSgpe2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUifHwhbmF2aWdhdG9yLmNyZWRlbnRpYWxzfHx0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbD4idSIpcmV0dXJuIDI0O3JldHVybiAwfWZ1bmN0aW9uIFhlKGUpe2lmKGU9PT1udWxsfHxlLnR5cGUhPT1FZXx8ISgicmF3SWQiaW4gZSl8fHR5cGVvZiBlLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMhPT0iZnVuY3Rpb24iKXJldHVybiBkKDI3KTtyZXR1cm4gcChlKX1mdW5jdGlvbiB3bihlKXtpZihlPT09InBsYXRmb3JtInx8ZT09PSJjcm9zcy1wbGF0Zm9ybSIpcmV0dXJuIGU7cmV0dXJufWZ1bmN0aW9uIGRpKGUpe2lmKC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChlKSlyZXR1cm4iaW9zIjtpZigvQW5kcm9pZC9pLnRlc3QoZSkpcmV0dXJuImFuZHJvaWQiO2lmKC9NYWMgT1MgWHxNYWNpbnRvc2gvaS50ZXN0KGUpKXJldHVybiJtYWNvcyI7aWYoL1dpbmRvd3MvaS50ZXN0KGUpKXJldHVybiJ3aW5kb3dzIjtpZigvTGludXgvaS50ZXN0KGUpKXJldHVybiJsaW51eCI7cmV0dXJuIm90aGVyIn1mdW5jdGlvbiBJbihlKXtsZXQgdD1lLnJlc3BvbnNlO2lmKCEoImdldFRyYW5zcG9ydHMiaW4gdCkpcmV0dXJuO2xldCByPXQuZ2V0VHJhbnNwb3J0cztpZih0eXBlb2YgciE9PSJmdW5jdGlvbiIpcmV0dXJuO2xldCBuPXIuY2FsbCh0KTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm47bGV0IHM9W107Zm9yKGxldCBpIG9mIG4paWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmaS5sZW5ndGg+MClzLnB1c2goaSk7cmV0dXJuIHMubGVuZ3RoPT09MD92b2lkIDA6c312YXIgeWE9MzIsbWE9NjQsYm49MzcsY2k9MTY7ZnVuY3Rpb24gdWkoZSl7bGV0IHQ9ZS5yZXNwb25zZTtpZighKCJnZXRBdXRoZW50aWNhdG9yRGF0YSJpbiB0KSlyZXR1cm47bGV0IHI9dC5nZXRBdXRoZW50aWNhdG9yRGF0YTtpZih0eXBlb2YgciE9PSJmdW5jdGlvbiIpcmV0dXJuO2xldCBuPXIuY2FsbCh0KTtpZighKG4gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuO2xldCBzPW5ldyBVaW50OEFycmF5KG4pO2lmKHMuYnl0ZUxlbmd0aDxibitjaSlyZXR1cm47bGV0IGk9c1t5YV07aWYoaT09PXZvaWQgMHx8KGkmbWEpPT09MClyZXR1cm47cmV0dXJuIHMuc2xpY2UoYm4sYm4rY2kpfWFzeW5jIGZ1bmN0aW9uIGxpKGUpe2xldCB0PXplKCk7aWYodCE9PTApcmV0dXJuIGQodCk7bGV0W3Isbl09V2UoZSk7aWYobiE9PTApcmV0dXJuIGQobik7aWYocj09PXZvaWQgMClyZXR1cm4gZCg5KTtsZXQgcz1lPy51c2VyTmFtZT8/ZT8ucnBOYW1lPz9yLGk9e3Jlc2lkZW50S2V5OiJyZXF1aXJlZCIscmVxdWlyZVJlc2lkZW50S2V5OiEwLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIn07aWYoZT8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQhPT12b2lkIDApaS5hdXRoZW50aWNhdG9yQXR0YWNobWVudD1lLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50O2xldCBvPXtsYXJnZUJsb2I6e3N1cHBvcnQ6InJlcXVpcmVkIn19LGE7dHJ5e2E9YXdhaXQgdXIoe3B1YmxpY0tleTp7Y2hhbGxlbmdlOnZlKEZlKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/aXJ9LHVzZXI6e2lkOnZlKDE2KSxuYW1lOnMsZGlzcGxheU5hbWU6c30scHViS2V5Q3JlZFBhcmFtczpvcixhdXRoZW50aWNhdG9yU2VsZWN0aW9uOmksZXh0ZW5zaW9uczpvLC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fX19KX1jYXRjaChmKXtyZXR1cm4gUmUoZiksZCgzMCl9bGV0W2MsdV09WGUoYSk7aWYodSE9PTApcmV0dXJuIGQodSk7aWYoYz09PXZvaWQgMClyZXR1cm4gZCgyNyk7aWYoYy5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iPy5zdXBwb3J0ZWQhPT0hMClyZXR1cm4gZCgzMCk7cmV0dXJuIHAobmV3IFVpbnQ4QXJyYXkoYy5yYXdJZCkpfWFzeW5jIGZ1bmN0aW9uIHhuKGUsdCxyLG4pe2xldCBzPXtjaGFsbGVuZ2U6dmUoRmUpLHJwSWQ6ZSx1c2VyVmVyaWZpY2F0aW9uOiJwcmVmZXJyZWQifTtpZih0Py5oaW50cyE9PXZvaWQgMClzLmhpbnRzPXQuaGludHM7aWYociE9PXZvaWQgMClzLmFsbG93Q3JlZGVudGlhbHM9W3t0eXBlOkVlLGlkOk1lKHIpfV07aWYobiE9PXZvaWQgMClzLmV4dGVuc2lvbnM9bjtsZXQgaTt0cnl7aT1hd2FpdCBscih7cHVibGljS2V5OnN9KX1jYXRjaChjKXtyZXR1cm4gUmUoYyksZCgzMCl9bGV0W28sYV09WGUoaSk7aWYoYSE9PTApcmV0dXJuIGQoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gZCgyNyk7cmV0dXJuIHAobyl9YXN5bmMgZnVuY3Rpb24gZmkoZSx0KXtsZXQgcj16ZSgpO2lmKHIhPT0wKXJldHVybiBkKHIpO2xldFtuLHNdPVdlKHQpO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoOSk7bGV0IGk9ZTtpZihpPT09dm9pZCAwKXtsZXRbZixoXT1hd2FpdCB4bihuLHQpO2lmKGghPT0wJiZ0Py5oaW50cyE9PXZvaWQgMClbZixoXT1hd2FpdCB4bihuLHtycElkOnQucnBJZCxycE5hbWU6dC5ycE5hbWV9KTtpZihoIT09MClyZXR1cm4gZChoKTtpZihmPT09dm9pZCAwKXJldHVybiBkKDI3KTtpPW5ldyBVaW50OEFycmF5KGYucmF3SWQpfWxldFtvLGFdPWF3YWl0IHhuKG4sdCxpLHtsYXJnZUJsb2I6e3JlYWQ6ITB9fSk7aWYoYSE9PTApcmV0dXJuIGQoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gZCgyNyk7bGV0IHU9by5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iO2lmKHU9PT12b2lkIDB8fHUuYmxvYj09PXZvaWQgMClyZXR1cm4gZCg3KTtsZXQgbD1hcih1LmJsb2IpO2lmKGwuYnl0ZUxlbmd0aD09PTApcmV0dXJuIGQoNyk7cmV0dXJuIHAoe2Jsb2I6bCxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkoby5yYXdJZCl9KX12YXIgRW49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJkaXBsb21hdGljLnByZi52MSIpLEF0PSJkaXBsb21hdGljLXByZiI7dmFyIGZyPSIiO3ZhciBocj10eXBlb2YgZ2xvYmFsVGhpcy5Xb3JrZXI9PT0iZnVuY3Rpb24iP2dsb2JhbFRoaXMuV29ya2VyOnZvaWQgMCxBbj1ocj09PXZvaWQgMD92b2lkIDA6aHIucHJvdG90eXBlLnBvc3RNZXNzYWdlLHByO2Z1bmN0aW9uIFNhKCl7aWYodHlwZW9mIGZyIT09InN0cmluZyJ8fGZyLmxlbmd0aD09PTApdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSB3b3JrZXIgc291cmNlIG5vdCBlbWJlZGRlZDsgcnVuIHBrZyBidWlsZCBiZWZvcmUgc3Bhd24iKTtyZXR1cm4gYXRvYihmcil9ZnVuY3Rpb24gYmEoKXtpZihwciE9PXZvaWQgMClyZXR1cm4gcHI7bGV0IGU9bmV3IEJsb2IoW1NhKCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSk7cmV0dXJuIHByPVVSTC5jcmVhdGVPYmplY3RVUkwoZSkscHJ9ZnVuY3Rpb24gcGkoKXtpZihocj09PXZvaWQgMCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIFdvcmtlciBBUEkgdW5hdmFpbGFibGU7IGNhbm5vdCBzcGF3biBzeW5jIHdvcmtlciIpO3JldHVybiBuZXcgaHIoYmEoKSx7dHlwZToibW9kdWxlIn0pfWZ1bmN0aW9uIGhpKGUsdCxyKXtpZihBbj09PXZvaWQgMCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIFdvcmtlciBBUEkgdW5hdmFpbGFibGU7IGNhbm5vdCBwb3N0IHRvIHN5bmMgd29ya2VyIik7aWYociE9PXZvaWQgMCYmci5sZW5ndGg+MClBbi5jYWxsKGUsdCx7dHJhbnNmZXI6cn0pO2Vsc2UgQW4uY2FsbChlLHQpfXZhciB3YT1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoImRpcGxvbWF0aWMuYmluZC52MSIpLFBuPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5iaW5kdGFnLnYxIiksSWE9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJESVBMT01BVElDIFNFRUQgRklOR0VSUFJJTlQiKSx4YT0zMixFYT0zMixBYT0xNixQYT0zMix0ZT1uZXcgcWU7ZnVuY3Rpb24gVWEoZSl7cmV0dXJuIGUubWFwKCh0KT0+KHtoYW5kbGU6dC5oYW5kbGUsbGFiZWw6dC5sYWJlbCxpZHg6dC5pZHg/PzB9KSl9ZnVuY3Rpb24gU2koZSl7aWYoZS5ieXRlTGVuZ3RoPT09MHx8ZS5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gZCgyMik7aWYoZS5ieXRlTGVuZ3RoPHdlKzEpcmV0dXJuIGQoMTQpO2xldCB0PWUuc3ViYXJyYXkoMCx3ZSk7aWYodC5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gZCgyMik7bGV0IHI9bmV3IE4oZS5zdWJhcnJheSh3ZSkpLFtuLHNdPXIucmVhZFN0cnVjdChtbik7aWYocyE9PTApcmV0dXJuIGQocyk7aWYobj09PXZvaWQgMClyZXR1cm4gZCgxNCk7aWYoIXIuZG9uZSgpKXJldHVybiBkKDE0KTtsZXRbaSxvXT1wZS5mcm9tQnl0ZXModCk7aWYobyE9PTApcmV0dXJuIGQobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gZCgxMik7cmV0dXJuIHAoe2VuY2xhdmU6aSxob3N0czpuLmhvc3RzLm1hcCgoYSk9Pih7Li4uYX0pKX0pfWNsYXNzIFB0eyNlOyN0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy4jZT1lLHRoaXMuI3Q9dH1zdGF0aWMgYXN5bmMgY3JlYXRlKCl7bGV0IGU7dHJ5e2xldCB0PWF3YWl0IHRlLmdlblgyNTUxOSgpO2U9dC5wcml2O2xldFtyLG5dPWduKHQucHViKTtpZihuIT09MClyZXR1cm4gZChuKTtpZihyPT09dm9pZCAwKXJldHVybiBkKDEwKTtsZXQgcz1uZXcgUHQoZSxyKTtyZXR1cm4gZT12b2lkIDAscChzKX1jYXRjaHtyZXR1cm4gZCgyOSl9ZmluYWxseXtlPy5maWxsKDApfX13aXBlKCl7dGhpcy4jZS5maWxsKDApfWdldCBkaGtlUmVxKCl7bGV0W2UsdF09Z24odGhpcy4jdC5zbGljZSgpKTtpZihlPT09dm9pZCAwKXRocm93IEVycm9yKGBkaGtlUmVxICR7dH1gKTtyZXR1cm4gZX1hc3luYyBmaW5pc2goZSl7bGV0IHQ9ZS5zdWJhcnJheSgwLGR0KSxyPWUuc3ViYXJyYXkoZHQpLFtuLHNdPWF3YWl0IFNuKHRoaXMuI2UsdCx0aGlzLiN0LHQpO2lmKHMhPT0wKXJldHVybiBkKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGQoMTIpO2xldCBpO3RyeXt0cnl7aT1hd2FpdCB0ZS5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHIsbil9Y2F0Y2h7cmV0dXJuIGQoMjApfWxldCBvPVNpKGkpO2lmKG9bMV09PT0wKXRoaXMud2lwZSgpO3JldHVybiBvfWZpbmFsbHl7bi5maWxsKDApLGk/LmZpbGwoMCl9fX1hc3luYyBmdW5jdGlvbiB5aShlLHQscil7bGV0IG49emUoKTtpZihuIT09MClyZXR1cm4gbjtsZXRbcyxpXT1XZShyKTtpZihpIT09MClyZXR1cm4gaTtpZihzPT09dm9pZCAwKXJldHVybiA5O2F3YWl0IGRyKCk7bGV0IG89bmV3IFVpbnQ4QXJyYXkodC5ieXRlTGVuZ3RoKTtvLnNldCh0KTtsZXQgYT17bGFyZ2VCbG9iOnt3cml0ZTpvLmJ1ZmZlcn19LGM9e3B1YmxpY0tleTp7Y2hhbGxlbmdlOnZlKEZlKSxycElkOnMsYWxsb3dDcmVkZW50aWFsczpbe3R5cGU6RWUsaWQ6TWUoZSl9XSx1c2VyVmVyaWZpY2F0aW9uOiJyZXF1aXJlZCIsZXh0ZW5zaW9uczphLC4uLnI/LmhpbnRzIT09dm9pZCAwP3toaW50czpyLmhpbnRzfTp7fX19LHU7dHJ5e3RyeXt1PWF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoYyl9Y2F0Y2goeSl7aWYoIWNyKHkpKXRocm93IHk7dXQoKSx1PWF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoYyl9fWNhdGNoKHkpe3JldHVybiBSZSh5KSwzMH1maW5hbGx5e28uZmlsbCgwKX1sZXRbbCxmXT1YZSh1KTtpZihmIT09MClyZXR1cm4gZjtpZihsPT09dm9pZCAwKXJldHVybiAyNztpZihsLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5sYXJnZUJsb2I/LndyaXR0ZW4hPT0hMClyZXR1cm4gMzA7cmV0dXJuIDB9dmFyIFVuPTMyO2Z1bmN0aW9uIGthKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuW107aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuW2VdO3JldHVybiBlLmZpbHRlcigodCk9PnQuYnl0ZUxlbmd0aD4wKX1mdW5jdGlvbiBCYShlKXtpZighKGUgaW5zdGFuY2VvZiBFcnJvcikpcmV0dXJuITE7cmV0dXJuIGUubmFtZT09PSJOb3RTdXBwb3J0ZWRFcnJvciJ8fGUubmFtZT09PSJUeXBlRXJyb3IifWZ1bmN0aW9uIGJpKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuO2xldCB0PWFyKGUpO2lmKHQuYnl0ZUxlbmd0aDxVbil7dC5maWxsKDApO3JldHVybn1pZih0LmJ5dGVMZW5ndGg9PT1VbilyZXR1cm4gdDtsZXQgcj10LnNsaWNlKDAsVW4pO3JldHVybiB0LmZpbGwoMCkscn1hc3luYyBmdW5jdGlvbiB2YShlKXtsZXQgdD16ZSgpO2lmKHQhPT0wKXJldHVybiBkKHQpO2xldFtyLG5dPVdlKGUpO2lmKG4hPT0wKXJldHVybiBkKG4pO2lmKHI9PT12b2lkIDApcmV0dXJuIGQoOSk7bGV0IHM9ZT8udXNlck5hbWU/P0F0LGk9ZT8uZGlzcGxheU5hbWU/P3Msbz12ZSgxNiksYT1lPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudD09PSJjcm9zcy1wbGF0Zm9ybSIsYz17cmVzaWRlbnRLZXk6YT8iZGlzY291cmFnZWQiOiJyZXF1aXJlZCIscmVxdWlyZVJlc2lkZW50S2V5OiFhLHVzZXJWZXJpZmljYXRpb246YT8icHJlZmVycmVkIjoicmVxdWlyZWQifTtpZihlPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudCE9PXZvaWQgMCljLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PWUuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ7bGV0IHU9e2NoYWxsZW5nZTp2ZShGZSkscnA6e2lkOnIsbmFtZTplPy5ycE5hbWU/P2lyfSx1c2VyOntpZDpvLG5hbWU6cyxkaXNwbGF5TmFtZTppfSxwdWJLZXlDcmVkUGFyYW1zOm9yLGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246YywuLi5lPy5oaW50cyE9PXZvaWQgMD97aGludHM6ZS5oaW50c306e30sLi4uZT8uZXhjbHVkZUNyZWRlbnRpYWxzIT09dm9pZCAwJiZlLmV4Y2x1ZGVDcmVkZW50aWFscy5sZW5ndGg+MD97ZXhjbHVkZUNyZWRlbnRpYWxzOmUuZXhjbHVkZUNyZWRlbnRpYWxzLm1hcCgodyk9Pih7dHlwZTpFZSxpZDpNZSh3KX0pKX06e319LGw9ZT8uc2FsdCE9PXZvaWQgMD9NZShlLnNhbHQpOnZvaWQgMCxmPSh3KT0+dXIoe3B1YmxpY0tleTp7Li4udSxleHRlbnNpb25zOncmJmwhPT12b2lkIDA/e3ByZjp7ZXZhbDp7Zmlyc3Q6bH19fTp7cHJmOnt9fX19KSxoO3RyeXtoPWF3YWl0IGYobCE9PXZvaWQgMCl9Y2F0Y2godyl7aWYobD09PXZvaWQgMHx8IUJhKHcpKXJldHVybiBSZSh3KSxkKDMwKTt0cnl7aD1hd2FpdCBmKCExKX1jYXRjaCh4KXtyZXR1cm4gUmUoeCksZCgzMCl9fWxldFt5LGddPVhlKGgpO2lmKGchPT0wKXJldHVybiBkKGcpO2lmKHk9PT12b2lkIDApcmV0dXJuIGQoMjcpO2xldCBtPXkuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLFM9YmkobS5wcmY/LnJlc3VsdHM/LmZpcnN0KSxFPW0ucHJmPy5lbmFibGVkPT09ITB8fFMhPT12b2lkIDA7aWYoYSYmUyE9PXZvaWQgMClTLmZpbGwoMCk7cmV0dXJuIHAoe2NyZWRJZDpuZXcgVWludDhBcnJheSh5LnJhd0lkKSx1c2VySWQ6bmV3IFVpbnQ4QXJyYXkobykscHJmRW5hYmxlZDpFLHByZjphP3ZvaWQgMDpTLGF0dGFjaG1lbnQ6d24oeS5hdXRoZW50aWNhdG9yQXR0YWNobWVudCksdHJhbnNwb3J0czpJbih5KSxhYWd1aWQ6dWkoeSl9KX1hc3luYyBmdW5jdGlvbiBtaShlKXtsZXQgdD16ZSgpO2lmKHQhPT0wKXJldHVybiBkKHQpO2xldFtyLG5dPVdlKGUpO2lmKG4hPT0wKXJldHVybiBkKG4pO2lmKHI9PT12b2lkIDApcmV0dXJuIGQoOSk7bGV0IHM9ZT8uc2FsdD8/RW4saT1NZShzKSxvPXtjaGFsbGVuZ2U6dmUoRmUpLHJwSWQ6cix1c2VyVmVyaWZpY2F0aW9uOiJwcmVmZXJyZWQiLGV4dGVuc2lvbnM6e3ByZjp7ZXZhbDp7Zmlyc3Q6aX19fX07aWYoZT8uaGludHMhPT12b2lkIDApby5oaW50cz1lLmhpbnRzO2xldCBhPWthKGU/LmNyZWRJZCk7aWYoYS5sZW5ndGg+MClvLmFsbG93Q3JlZGVudGlhbHM9YS5tYXAoKHkpPT4oe3R5cGU6RWUsaWQ6TWUoeSl9KSk7bGV0IGM7dHJ5e2M9YXdhaXQgbHIoe3B1YmxpY0tleTpvfSl9Y2F0Y2goeSl7cmV0dXJuIFJlKHkpLGQoMzApfWxldFt1LGxdPVhlKGMpO2lmKGwhPT0wKXJldHVybiBkKGwpO2lmKHU9PT12b2lkIDApcmV0dXJuIGQoMjcpO2xldCBmPXUuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLnByZj8ucmVzdWx0cztpZihmPy5maXJzdD09PXZvaWQgMClyZXR1cm4gZCg3KTtsZXQgaD1iaShmLmZpcnN0KTtpZihoPT09dm9pZCAwKXJldHVybiBkKDI3KTtyZXR1cm4gcCh7cHJmOmgsY3JlZElkOm5ldyBVaW50OEFycmF5KHUucmF3SWQpLGF0dGFjaG1lbnQ6d24odS5hdXRoZW50aWNhdG9yQXR0YWNobWVudCksdHJhbnNwb3J0czpJbih1KX0pfWZ1bmN0aW9uIGtuKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PXdlKXJldHVybiBkKDEwKTtyZXR1cm5bZSwwXX1jbGFzcyBwZXsjZTtjb25zdHJ1Y3RvcihlKXt0aGlzLiNlPWV9c3RhdGljIGFzeW5jIGZyb21SYW5kb20oZSl7aWYoZS5ieXRlTGVuZ3RoPFBhKXJldHVybiBkKDEwKTtsZXQgdD1hd2FpdCB0ZS5nZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkKCkscj1iZSh0LGUpO3RyeXtsZXQgbj1hd2FpdCB0ZS5ibGFrZTMociksW3MsaV09a24obik7aWYoaSE9PTApcmV0dXJuIGQoaSk7aWYocz09PXZvaWQgMClyZXR1cm4gZCgxMik7cmV0dXJuIHAobmV3IHBlKHMpKX1maW5hbGx5e3QuZmlsbCgwKSxyLmZpbGwoMCksZS5maWxsKDApfX1zdGF0aWMgZnJvbUJ5dGVzKGUpe2xldFt0LHJdPWtuKGUpO2lmKHIhPT0wKXJldHVybiBkKHIpO2lmKHQ9PT12b2lkIDApcmV0dXJuIGQoMTApO2xldFtuLHNdPWtuKHQuc2xpY2UoKSk7aWYocyE9PTApcmV0dXJuIGQocyk7aWYobj09PXZvaWQgMClyZXR1cm4gZCgxMCk7cmV0dXJuIHAobmV3IHBlKG4pKX1hc3luYyBzZWFsV2l0aFBhc3NrZXkoZSl7bGV0IHQ9ZT8uc2FsdD8/RW4scj1lPy5jcmVkSWQsbj1yLHM9ZT8uY3JlYXRlQ3JlZElmTmVlZGVkPT09ITAmJihyPT09dm9pZCAwfHwhKHIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSYmci5sZW5ndGg9PT0wKSxpLG87aWYocyl7bGV0W2wsZl09YXdhaXQgdmEoe3JwSWQ6ZT8ucnBJZCxycE5hbWU6ZT8ucnBOYW1lLHVzZXJOYW1lOmU/LnVzZXJOYW1lPz9BdCxkaXNwbGF5TmFtZTplPy5kaXNwbGF5TmFtZSxhdXRoZW50aWNhdG9yQXR0YWNobWVudDplPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxoaW50czplPy5oaW50cyxleGNsdWRlQ3JlZGVudGlhbHM6ZT8uZXhjbHVkZUNyZWRlbnRpYWxzLHNhbHQ6dH0pO2lmKGYhPT0wKXJldHVybiBkKGYpO2lmKGw9PT12b2lkIDApcmV0dXJuIGQoMzApO2lmKCFsLnByZkVuYWJsZWQpcmV0dXJuIGQoMzApO249bC5jcmVkSWQsaT1sLG89bC5wcmZ9bGV0IGE9YXN5bmMobCxmLGgseSk9Pnt0cnl7bGV0W2csbV09YXdhaXQgdGhpcy4jcihsKTtpZihtIT09MClyZXR1cm4gZChtKTtpZihnPT09dm9pZCAwKXJldHVybiBkKDEyKTtyZXR1cm4gcCh7c2VhbGVkTWFzdGVyOmcsc2FsdDp0LnNsaWNlKCksY3JlZElkOmYuc2xpY2UoKSx1c2VySWQ6aT8udXNlcklkPT09dm9pZCAwP3ZvaWQgMDppLnVzZXJJZC5zbGljZSgpLGF0dGFjaG1lbnQ6aD8/aT8uYXR0YWNobWVudCx0cmFuc3BvcnRzOnk/P2k/LnRyYW5zcG9ydHMsYWFndWlkOmk/LmFhZ3VpZD09PXZvaWQgMD92b2lkIDA6aS5hYWd1aWQuc2xpY2UoKX0pfWZpbmFsbHl7bC5maWxsKDApfX07aWYobyE9PXZvaWQgMCYmaSE9PXZvaWQgMClyZXR1cm4gYShvLGkuY3JlZElkLGkuYXR0YWNobWVudCxpLnRyYW5zcG9ydHMpO2xldFtjLHVdPWF3YWl0IG1pKHtycElkOmU/LnJwSWQscnBOYW1lOmU/LnJwTmFtZSxjcmVkSWQ6bixzYWx0OnQsaGludHM6ZT8uaGludHN9KTtpZih1IT09MClyZXR1cm4gZCh1KTtpZihjPT09dm9pZCAwKXJldHVybiBkKDcpO3JldHVybiBhKGMucHJmLGMuY3JlZElkLGMuYXR0YWNobWVudCxjLnRyYW5zcG9ydHMpfWFzeW5jIGJpbmQoZSx0KXtpZih0IT09dm9pZCAwKXtmb3IobGV0IGkgb2YgdClpZighYXdhaXQgdGhpcy4jcyhpLmNyZWRJZCxpLnRhZykpcmV0dXJuIGQoMTApfWxldFtyLG5dPWF3YWl0IHRoaXMuc2VhbFdpdGhQYXNza2V5KGUpO2lmKG4hPT0wKXJldHVybiBkKG4pO2lmKHI9PT12b2lkIDApcmV0dXJuIGQoMTIpO2xldCBzPWF3YWl0IHRoaXMuI24oci5jcmVkSWQpO3JldHVybiBwKHsuLi5yLHRhZzpzfSl9c3RhdGljIGFzeW5jIHVuc2VhbFdpdGhQYXNza2V5KGUsdCl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBkKDIyKTtsZXQgcj1bXTtmb3IobGV0IGEgb2YgZSlpZihhLmNyZWRJZC5ieXRlTGVuZ3RoPjApci5wdXNoKGEuY3JlZElkKTtsZXRbbixzXT1hd2FpdCBtaSh7cnBJZDp0LnJwSWQscnBOYW1lOnQucnBOYW1lLGhpbnRzOnQuaGludHMsY3JlZElkOnIubGVuZ3RoPjA/cjp2b2lkIDAsc2FsdDp0LnNhbHR9KTtpZihzIT09MClyZXR1cm4gZChzKTtpZihuPT09dm9pZCAwKXJldHVybiBkKDcpO2xldCBpPWUuZmluZCgoYSk9PlkoYS5jcmVkSWQsbi5jcmVkSWQpKSxvPWk9PT12b2lkIDA/ZTpbaSwuLi5lLmZpbHRlcigoYSk9PmEhPT1pKV07dHJ5e2ZvcihsZXQgYSBvZiBvKXtsZXRbY109YXdhaXQgcGUuI2koYS5zZWFsZWRNYXN0ZXIsbi5wcmYpO2lmKGMhPT12b2lkIDApcmV0dXJuIHAoe2VuY2xhdmU6YyxjcmVkSWQ6bi5jcmVkSWQuc2xpY2UoKX0pfXJldHVybiBkKDIwKX1maW5hbGx5e24ucHJmLmZpbGwoMCl9fWFzeW5jIHNlYWxXaXRoSWttKGUpe3RyeXtyZXR1cm4gYXdhaXQgdGhpcy4jcihlKX1maW5hbGx5e2UuZmlsbCgwKX19c3RhdGljIGFzeW5jIHVuc2VhbFdpdGhJa20oZSx0KXt0cnl7cmV0dXJuIGF3YWl0IHBlLiNpKGUsdCl9ZmluYWxseXt0LmZpbGwoMCl9fWFzeW5jIHBlcnNpc3RUb0xhcmdlQmxvYihlPVtdLHQpe2xldCByPXQ/LmNyZWRJZDtpZihyPT09dm9pZCAwKXtsZXRbaSxvXT1hd2FpdCBsaSh0KTtpZihvIT09MClyZXR1cm4gZChvKTtpZihpPT09dm9pZCAwKXJldHVybiBkKDMwKTtyPWl9bGV0W24sc109dGhpcy4jYyhlKTtpZihzIT09MClyZXR1cm4gZChzKTtpZihuPT09dm9pZCAwKXJldHVybiBkKDEyKTt0cnl7bGV0IGk9YXdhaXQgeWkocixuLHQpO2lmKGkhPT0wKXJldHVybiBkKGkpO3JldHVybiBwKHIpfWZpbmFsbHl7bi5maWxsKDApfX1zdGF0aWMgYXN5bmMgZnJvbUxhcmdlQmxvYihlKXtsZXRbdCxyXT1hd2FpdCBmaShlPy5jcmVkSWQsZSk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMClyZXR1cm4gZCg3KTt0cnl7bGV0W24sc109U2kodC5ibG9iKTtpZihzIT09MClyZXR1cm4gZChzKTtpZihuPT09dm9pZCAwKXJldHVybiBkKDEyKTtyZXR1cm4gcCh7Li4ubixjcmVkSWQ6dC5jcmVkSWR9KX1maW5hbGx5e3QuYmxvYi5maWxsKDApfX1zdGF0aWMgYXN5bmMgY2xlYXJMYXJnZUJsb2IoZSx0KXtyZXR1cm4geWkoZSxuZXcgVWludDhBcnJheSh3ZSksdCl9YXN5bmMgZHVtcFRvVHR5KCl7cmV0dXJuIDIxfXN0YXRpYyBwYWlyUmVxdWVzdCgpe3JldHVybiBQdC5jcmVhdGUoKX1hc3luYyBwYWlyQWNjZXB0KGUsdCxyKXtpZihyLnVzZXJDb250cm9sc0JvdGhTaWRlc09mUGFpciE9PSEwKXJldHVybiBkKDEwKTtsZXQgbjt0cnl7bj1hd2FpdCB0ZS5nZW5YMjU1MTkoKX1jYXRjaHtyZXR1cm4gZCgyOSl9dHJ5e2xldFtzLGldPWF3YWl0IFNuKG4ucHJpdixlLGUsbi5wdWIpO2lmKGkhPT0wKXJldHVybiBkKGkpO2lmKHM9PT12b2lkIDApcmV0dXJuIGQoMTIpO3RyeXtsZXRbbyxhXT10aGlzLiNjKHQpO2lmKGEhPT0wKXJldHVybiBkKGEpO2lmKG89PT12b2lkIDApcmV0dXJuIGQoMTIpO3RyeXtsZXQgYz1hd2FpdCB0ZS5lbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKG8scyk7cmV0dXJuIGlpKGJlKG4ucHViLGMpKX1jYXRjaHtyZXR1cm4gZCgxMil9ZmluYWxseXtvLmZpbGwoMCl9fWZpbmFsbHl7cy5maWxsKDApfX1maW5hbGx5e24ucHJpdi5maWxsKDApfX1zcGF3blN5bmNXb3JrZXIoZSl7bGV0IHQ9cGkoKSxyPXRoaXMuI2Uuc2xpY2UoKTtyZXR1cm4gaGkodCx7aWQ6ZS5pZCxvcDoic2V0U2VlZCIsc2VlZDpyLHBlcnNpc3Q6ZS5wZXJzaXN0fSxbci5idWZmZXJdKSx0fWRlcml2ZUNpcGhlcihlLHQpe2xldCByPWUuc2xpY2UoKSxuPShvKT0+dGhpcy4jZChyLG8pLHM9KG8pPT50aGlzLiN1KHIsbyk7cmV0dXJue2VuY3J5cHQ6T2JqZWN0LmZyZWV6ZSh7ZW5jcnlwdDpufSksZGVjcnlwdDpPYmplY3QuZnJlZXplKHtkZWNyeXB0OnN9KSxib3RoOk9iamVjdC5mcmVlemUoe2VuY3J5cHQ6bixkZWNyeXB0OnN9KX1bdF19YXN5bmMgZGVyaXZlSWRlbnRpdHkoZSx0PTApe2xldCByPWUsbj10LHM9YXdhaXQgdGhpcy4jYShyLG4pLGk9cy5wdWJsaWNLZXk7cmV0dXJuIHMucHJpdmF0ZUtleS5maWxsKDApLE9iamVjdC5mcmVlemUoe3B1YmxpY0tleTppLHNpZ246KG8pPT50aGlzLiNmKHIsbixvKSxrZG1Gb3I6KG8pPT50aGlzLiNwKHIsbixvKX0pfWFzeW5jI3QoKXtyZXR1cm4gYXdhaXQgdGUuYmxha2UzKHRoaXMuI2Use2NvbnRleHQ6SWF9KX1hc3luYyNuKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KHRoaXMuI2UuYnl0ZUxlbmd0aCtQbi5ieXRlTGVuZ3RoK2UuYnl0ZUxlbmd0aCk7dC5zZXQodGhpcy4jZSwwKSx0LnNldChQbix0aGlzLiNlLmJ5dGVMZW5ndGgpLHQuc2V0KGUsdGhpcy4jZS5ieXRlTGVuZ3RoK1BuLmJ5dGVMZW5ndGgpO3RyeXtyZXR1cm4gYXdhaXQgdGUuYmxha2UzKHQpfWZpbmFsbHl7dC5maWxsKDApfX1hc3luYyNzKGUsdCl7aWYodC5ieXRlTGVuZ3RoIT09eGEpcmV0dXJuITE7bGV0IHI9YXdhaXQgdGhpcy4jbihlKTt0cnl7aWYoci5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2xldCBuPTA7Zm9yKGxldCBzPTA7czxyLmJ5dGVMZW5ndGg7cysrKXtsZXQgaT1yW3NdLG89dFtzXTtpZihpPT09dm9pZCAwfHxvPT09dm9pZCAwKXJldHVybiExO258PWleb31yZXR1cm4gbj09PTB9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jI3IoZSl7bGV0W3Qscl09YXdhaXQgZ2kodGUsZSk7aWYociE9PTApcmV0dXJuIGQocik7aWYodD09PXZvaWQgMClyZXR1cm4gZCgxMik7dHJ5e2xldCBuPWF3YWl0IHRlLmVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQodGhpcy4jZSx0KTtyZXR1cm4gVmUobil9Y2F0Y2h7cmV0dXJuIGQoMTIpfWZpbmFsbHl7dC5maWxsKDApfX1zdGF0aWMgYXN5bmMjaShlLHQpe2xldFsscl09VmUoZSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0W24sc109YXdhaXQgZ2kodGUsdCk7aWYocyE9PTApcmV0dXJuIGQocyk7aWYobj09PXZvaWQgMClyZXR1cm4gZCgxMik7bGV0IGk7dHJ5e3RyeXtpPWF3YWl0IHRlLmRlY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQoZSxuKX1jYXRjaHtyZXR1cm4gZCgyMCl9cmV0dXJuIHBlLmZyb21CeXRlcyhpKX1maW5hbGx5e24uZmlsbCgwKSxpPy5maWxsKDApfX0jYyhlKXtsZXQgdD1uZXcgcSxyPXQud3JpdGVTdHJ1Y3QobW4se2hvc3RzOlVhKGUpfSk7aWYociE9PTApcmV0dXJuIGQocik7bGV0IG49dC5yZXN1bHQoKSxzPW5ldyBVaW50OEFycmF5KHdlK24uYnl0ZUxlbmd0aCk7cmV0dXJuIHMuc2V0KHRoaXMuI2UsMCkscy5zZXQobix3ZSksW3MsMF19YXN5bmMjZChlLHQpe2xldCByPWF3YWl0IHRoaXMuI28oZSk7dHJ5e3JldHVybiBhd2FpdCB0ZS5lbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHQscil9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jI3UoZSx0KXtsZXQgcj1hd2FpdCB0aGlzLiNvKGUpO3RyeXtyZXR1cm4gYXdhaXQgdGUuZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZCh0LHIpfWZpbmFsbHl7ci5maWxsKDApfX1hc3luYyNvKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KHRoaXMuI2UuYnl0ZUxlbmd0aCtlLmJ5dGVMZW5ndGgpO3Quc2V0KHRoaXMuI2UsMCksdC5zZXQoZSx0aGlzLiNlLmJ5dGVMZW5ndGgpO3RyeXtyZXR1cm4gYXdhaXQgdGUuYmxha2UzKHQpfWZpbmFsbHl7dC5maWxsKDApfX1hc3luYyNsKGUsdCl7bGV0IHI9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGUpLG49bmV3IFVpbnQ4QXJyYXkoOCk7cmV0dXJuIG5ldyBEYXRhVmlldyhuLmJ1ZmZlcikuc2V0QmlnVWludDY0KDAsQmlnSW50KHQpLCExKSxhd2FpdCB0aGlzLiNvKGJlKHIsbikpfWFzeW5jI2EoZSx0KXtsZXQgcj1hd2FpdCB0aGlzLiNsKGUsdCk7dHJ5e3JldHVybiBhd2FpdCB0ZS5kZXJpdmVFZDI1NTE5S2V5UGFpcihyKX1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjZihlLHQscil7bGV0IG49YXdhaXQgdGhpcy4jYShlLHQpO3RyeXtyZXR1cm4gYXdhaXQgdGUuc2lnbkVkMjU1MTkocixuLnByaXZhdGVLZXkpfWZpbmFsbHl7bi5wcml2YXRlS2V5LmZpbGwoMCl9fWFzeW5jI3AoZSx0LHIpe2xldCBuPWF3YWl0IHRoaXMuI2EoZSx0KSxzPWJlKG4ucHJpdmF0ZUtleSxyKTtuLnByaXZhdGVLZXkuZmlsbCgwKTt0cnl7cmV0dXJuKGF3YWl0IHRlLmJsYWtlMyhzKSkuc2xpY2UoMCxUZSl9ZmluYWxseXtzLmZpbGwoMCl9fX1hc3luYyBmdW5jdGlvbiBnaShlLHQscj13YSl7aWYodC5ieXRlTGVuZ3RoPEFhKXJldHVybiBkKDEwKTtsZXQgbj1hd2FpdCBlLmJsYWtlMyhiZSh0LHIpKTtyZXR1cm4gcChuLnNsaWNlKDAsRWEpKX12YXIgRGE9bmV3IFNldChbImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwibGVuZ3RoIiwibmFtZSJdKTtmdW5jdGlvbiB5cihlKXtmb3IobGV0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpe2lmKERhLmhhcyh0KSljb250aW51ZTtsZXQgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYocj09PXZvaWQgMHx8dHlwZW9mIHIudmFsdWUhPT0iZnVuY3Rpb24iKWNvbnRpbnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOnIudmFsdWUsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiExfSl9fXlyKHBlKTt5cihwZS5wcm90b3R5cGUpO3lyKFB0KTt5cihQdC5wcm90b3R5cGUpO2NsYXNzIEJue2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBlbnEoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihoZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKGhlKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvcik7Zm9yKGxldCBvIG9mIHQpe2xldCBhPWAke28uaG9zdH06JHtvLnNlcX1gO24ucHV0KG8sYSl9fSl9YXN5bmMgZGVxKGUsdCl7bGV0IHI9Wy4uLnRdO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IG49dGhpcy5kYi50cmFuc2FjdGlvbihoZSwicmVhZHdyaXRlIikscz1uLm9iamVjdFN0b3JlKGhlKTtyZXR1cm4gbmV3IFByb21pc2UoKGksbyk9PntuLm9uY29tcGxldGU9KCk9PmkoKSxuLm9uZXJyb3I9KCk9Pm8obi5lcnJvcik7Zm9yKGxldCBhIG9mIHIpe2xldCBjPWAke2V9OiR7YX1gO3MuZGVsZXRlKGMpfX0pfWFzeW5jIGxpc3QoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGhlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGhlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldEFsbCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyBjb3VudCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oaGUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoaGUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuY291bnQoKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oaGUsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShoZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX1mdW5jdGlvbiB3aShlKXtyZXR1cm57bGFiZWw6ZS5sYWJlbCxoYW5kbGU6bmV3IFVSTChlLmhhbmRsZSksaWR4OmUuaWR4LGxhc3RTZXE6ZS5sYXN0U2VxfHwwLGNsb2NrT2Zmc2V0OmUuY2xvY2tPZmZzZXQsc3Vic2NyaXB0aW9uOmUuc3Vic2NyaXB0aW9ufX1mdW5jdGlvbiBDYShlLHQpe2xldCByPXsuLi5lfTtpZih0LnNldExhc3RTZXEhPT12b2lkIDApci5sYXN0U2VxPXQuc2V0TGFzdFNlcTtlbHNlIGlmKHQubGFzdFNlcSE9PXZvaWQgMCl7bGV0IG49ci5sYXN0U2VxfHwwO2lmKHQubGFzdFNlcT5uKXIubGFzdFNlcT10Lmxhc3RTZXF9cmV0dXJuIGRlbGV0ZSByLm51bUJhZ3MsZGVsZXRlIHIubnVtRHVwZXMscn1jbGFzcyB2bntkYjtjb25zdHJ1Y3RvcihlKXt0aGlzLmRiPWV9YXN5bmMgYWRkKGUpe2xldCB0PWF3YWl0IHRoaXMuZ2V0KGUubGFiZWwpLHI9dCE9PXZvaWQgMCYmdC5oYW5kbGUuaHJlZj09PWUuaGFuZGxlLmhyZWYmJih0LmlkeD8/MCk9PT0oZS5pZHg/PzApO3JldHVybiB0aGlzLnB1dCh7Li4uZSxsYXN0U2VxOnI/dC5sYXN0U2VxOjAsY2xvY2tPZmZzZXQ6cj90LmNsb2NrT2Zmc2V0OnZvaWQgMCxzdWJzY3JpcHRpb246cj90LnN1YnNjcmlwdGlvbjp2b2lkIDB9KX1hc3luYyBwdXQoZSl7bGV0IHQ9ey4uLmUsaGFuZGxlOmUuaGFuZGxlLnRvU3RyaW5nKCksbGFzdFNlcTplLmxhc3RTZXE/PzB9LHI9dGhpcy5kYi50cmFuc2FjdGlvbihvZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKG9lKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvciksbi5wdXQodCl9KX1hc3luYyB0b3VjaChlLHQpe3JldHVybiB0aGlzLnJlY29yZFN0YXRzKGUse2xhc3RTZXE6dH0pfWFzeW5jIHJlY29yZFN0YXRzKGUsdCl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihvZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKG9lKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvcik7bGV0IG89bi5nZXQoZSk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgYT1vLnJlc3VsdDtpZighYSlyZXR1cm47bi5wdXQoQ2EoYSx0KSl9fSl9YXN5bmMgZ2V0KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24ob2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUob2UpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPXIuZ2V0KGUpO2kub25zdWNjZXNzPSgpPT57bGV0IG89aS5yZXN1bHQ7aWYoIW8pbih2b2lkIDApO2Vsc2Ugbih3aShvKSl9LGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIHNldChlLHQpe2xldCByPWF3YWl0IHRoaXMuZ2V0KGUpO2lmKCFyKXJldHVybiAxMzt0cnl7cmV0dXJuIGF3YWl0IHRoaXMucHV0KHsuLi5yLC4uLnR9KSwwfWNhdGNoe3JldHVybiAxOH19YXN5bmMgZGVsKGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24ob2UsInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShvZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57dC5vbmNvbXBsZXRlPSgpPT5uKCksdC5vbmVycm9yPSgpPT5zKHQuZXJyb3IpLHIuZGVsZXRlKGUpfSl9YXN5bmMgbGlzdCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24ob2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUob2UpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0QWxsKCk7cy5vbnN1Y2Nlc3M9KCk9PntsZXQgaT1zLnJlc3VsdDtyKGkubWFwKHdpKSl9LHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIHdpcGUoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKG9lLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUob2UpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmNsZWFyKCl9KX19Y2xhc3MgRG57Y3J5cHRvO2RiO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5jcnlwdG89dDt0aGlzLmRiPWV9YXN5bmMgYWRkKGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKFEpO3JldHVybiBuZXcgUHJvbWlzZSgobik9PntpZihlLmxlbmd0aD09PTApe24oW10pO3JldHVybn1sZXQgcz1BcnJheShlLmxlbmd0aCkuZmlsbCgwKTt0Lm9uY29tcGxldGU9KCk9Pm4ocyksdC5vbmVycm9yPSgpPT57Zm9yKGxldCBpPTA7aTxzLmxlbmd0aDtpKyspc1tpXT0xODtuKHMpfTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0e2tleTpvLGRhdGE6YX09ZVtpXSxjPVIobyksdT1yLnB1dChhLGMpO3Uub25lcnJvcj0obCk9PntsLnByZXZlbnREZWZhdWx0KCksc1tpXT0xOH19fSl9YXN5bmMgZGVsKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFEpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0IG8gb2YgdCl7bGV0IGE9UihvKTtuLmRlbGV0ZShhKX19KX1hc3luYyBnZXQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihRLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFEpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPVIoZSksbz1yLmdldChpKTtvLm9uc3VjY2Vzcz1hc3luYygpPT57bGV0IGE9by5yZXN1bHQ7aWYoYSluKGF3YWl0ICR0KGUsYSx0aGlzLmNyeXB0bykpO2Vsc2Ugbih2b2lkIDApfSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX1hc3luYyBoYXMoZSl7cmV0dXJuIGF3YWl0IHRoaXMuZ2V0KGUpIT09dm9pZCAwfWFzeW5jIGxpc3QoZSl7bGV0IHQ9ZT8uYXBsZCxyPWU/LmJvZHkhPT0hMSxzPXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKGksbyk9PntsZXQgYT1bXSxjPXQ9PT12b2lkIDA/cy5vcGVuQ3Vyc29yKCk6cy5pbmRleChVdCkub3BlbkN1cnNvcihJREJLZXlSYW5nZS5vbmx5KHQpKTtjLm9uc3VjY2Vzcz0odSk9PntsZXQgbD11LnRhcmdldC5yZXN1bHQ7aWYobCl7bGV0IGY9dD09PXZvaWQgMD9sLmtleTpsLnByaW1hcnlLZXksaD1sLnZhbHVlO2EucHVzaCh7aGFzaDptZShmKSxkYXRhOmh9KSxsLmNvbnRpbnVlKCl9ZWxzZSBQcm9taXNlLmFsbChhLm1hcCgoe2hhc2g6ZixkYXRhOmh9KT0+JHQoZixoLHRoaXMuY3J5cHRvLHtib2R5OnJ9KSkpLnRoZW4oaSkuY2F0Y2gobyl9LGMub25lcnJvcj0oKT0+byhjLmVycm9yKX0pfWFzeW5jIGNvdW50KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1lPT09dm9pZCAwP3IuY291bnQoKTpyLmluZGV4KFV0KS5jb3VudChJREJLZXlSYW5nZS5vbmx5KGUpKTtpLm9uc3VjY2Vzcz0oKT0+bihpLnJlc3VsdCksaS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9YXN5bmMgbGlzdEtleXMoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoUSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9W10saT10Lm9wZW5LZXlDdXJzb3IoKTtpLm9uc3VjY2Vzcz0obyk9PntsZXQgYT1vLnRhcmdldC5yZXN1bHQ7aWYoYSlzLnB1c2gobWUoYS5rZXkpKSxhLmNvbnRpbnVlKCk7ZWxzZSByKHMpfSxpLm9uZXJyb3I9KCk9Pm4oaS5lcnJvcil9KX1hc3luYyBsYXN0KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaSxvPXIub3BlbkN1cnNvcigpO28ub25zdWNjZXNzPWFzeW5jKGEpPT57bGV0IGM9YS50YXJnZXQucmVzdWx0O2lmKGMpe2xldHtrZXk6dSx2YWx1ZTpsfT1jO2lmKFkoZSxsLmVpZCkpe2lmKCFpfHwobC5jdHI/PzApPihpLmRhdGEuY3RyPz8wKXx8KGwuY3RyPz8wKT09PShpLmRhdGEuY3RyPz8wKSYmKGwub2ZmPz8wKT4oaS5kYXRhLm9mZj8/MCkpaT17a2V5OnUsZGF0YTpsfX1jLmNvbnRpbnVlKCl9ZWxzZSBpZihpKXtsZXQgdT1tZShpLmtleSk7bihhd2FpdCAkdCh1LGkuZGF0YSx0aGlzLmNyeXB0bykpfWVsc2Ugbih2b2lkIDApfSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX1hc3luYyBtYXJrQXBwbGllZChlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvcik7Zm9yKGxldCBvIG9mIHQpe2xldCBhPVIobyksYz1uLmdldChhKTtjLm9uc3VjY2Vzcz0oKT0+e2xldCB1PWMucmVzdWx0O2lmKCF1KXJldHVybjtfcih1LGp0KSxuLnB1dCh1LGEpfSxjLm9uZXJyb3I9KHUpPT57dS5wcmV2ZW50RGVmYXVsdCgpfX19KX1hc3luYyBtYXJrRmFpbGVkKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oUSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFEpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0e2tleTpvLGVycjphfW9mIHQpe2xldCBjPVIobyksdT1uLmdldChjKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBsPXUucmVzdWx0O2lmKCFsKXJldHVybjtfcihsLHJ0LGEpLG4ucHV0KGwsYyl9LHUub25lcnJvcj0obCk9PntsLnByZXZlbnREZWZhdWx0KCl9fX0pfWFzeW5jIHdpcGUoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKFEsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShRKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fXZhciBUYT04O2NsYXNzIENueyNlOyN0OyNuOyNzOyNyO2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuI3I9ZS5wZXJzaXN0S2V5cmluZyx0aGlzLiNuPXtycElkOmUucnBJZCxycE5hbWU6ZS5ycE5hbWV9LHRoaXMuI3M9ZS51c2VyTmFtZT8/ZS5ycElkPz9lLnJwTmFtZT8/QXQsZS5rZXlyaW5nIT09dm9pZCAwKXRoaXMuI3Q9RGUoZS5rZXlyaW5nKX1nZXQga2V5cmluZygpe3JldHVybiB0aGlzLiN0PT09dm9pZCAwP3ZvaWQgMDpEZSh0aGlzLiN0KX1saXN0KCl7aWYodGhpcy4jdD09PXZvaWQgMClyZXR1cm5bXTtyZXR1cm4gdGhpcy4jdC5lbnRyaWVzLm1hcChSYSl9YXN5bmMgc2F2ZShlLHQpe2lmKHQ/LnBlcnNpc3Q9PT0hMClyZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IoInByZi1zdG9yZTogdXNlIGJpbmRBbmRTYXZlKGVuY2xhdmUpIHRvIHBlcnNpc3QgYSBiaW5kaW5nIikpO3JldHVybiB0aGlzLiNlPWUsdGhpcy4jZX1hc3luYyBiaW5kQW5kU2F2ZShlLHQpe2xldCByPXRoaXMuI3Qsbj10Py5jcmVkSWQscz1uIGluc3RhbmNlb2YgVWludDhBcnJheT9uLmJ5dGVMZW5ndGg+MDpuIT09dm9pZCAwJiZuLmxlbmd0aD4wO2lmKCFzJiZyIT09dm9pZCAwJiZyLmVudHJpZXMubGVuZ3RoPj1UYSlyZXR1cm4gZCgyNik7bGV0IGk9SWkodD8ubmljayksbz10Py5leGNsdWRlQ3JlZGVudGlhbHM/PyhzP3ZvaWQgMDpMYShyKSksYT10Py5zYWx0Pz9yPy5zYWx0LGM9cj09PXZvaWQgMD92b2lkIDA6ci5lbnRyaWVzLm1hcCgoZyk9Pih7Y3JlZElkOmcuY3JlZElkLHRhZzpnLnRhZ30pKSxbdSxsXT1hd2FpdCBlLmJpbmQoey4uLnRoaXMuI24sc2FsdDphLGNyZWRJZDpuLGNyZWF0ZUNyZWRJZk5lZWRlZDp0Py5jcmVhdGVDcmVkSWZOZWVkZWQ/PyFzLGV4Y2x1ZGVDcmVkZW50aWFsczpvLHVzZXJOYW1lOnRoaXMuI3MsZGlzcGxheU5hbWU6aT8/dGhpcy4jbi5ycE5hbWU/P3RoaXMuI3MsYXV0aGVudGljYXRvckF0dGFjaG1lbnQ6dD8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQsaGludHM6dD8uaGludHN9LGMpO2lmKGwhPT0wKXJldHVybiBkKGwpO2lmKHU9PT12b2lkIDApcmV0dXJuIGQoMTIpO2xldCBmPURhdGUubm93KCksaD17dHlwZToicHJmIixzZWFsZWRNYXN0ZXI6dS5zZWFsZWRNYXN0ZXIsY3JlZElkOnUuY3JlZElkLHRhZzp1LnRhZyx1c2VySWQ6dS51c2VySWQsbmljazppLGVucm9sbGVkQXQ6ZixsYXN0VXNlZEF0OmYsYXR0YWNobWVudDp1LmF0dGFjaG1lbnQsdHJhbnNwb3J0czp1LnRyYW5zcG9ydHMsYWFndWlkOnUuYWFndWlkLGVucm9sbGVkT3M6SGEoKX0seT1yPT09dm9pZCAwP3tzYWx0OnUuc2FsdC5zbGljZSgpLGVudHJpZXM6W119OkRlKHIpO3JldHVybiB0aGlzLiN0PU9hKHksaCksdGhpcy4jZT1lLGF3YWl0IHRoaXMuI3IoRGUodGhpcy4jdCkpLHAodGhpcy4jZSl9YXN5bmMgbG9hZCgpe3JldHVybiB0aGlzLiNlfWFzeW5jIHVubG9jaygpe2xldCBlPXRoaXMuI3Q7aWYoZT09PXZvaWQgMHx8ZS5lbnRyaWVzLmxlbmd0aD09PTApcmV0dXJuIGQoMjIpO2xldFt0LHJdPWF3YWl0IHBlLnVuc2VhbFdpdGhQYXNza2V5KGUuZW50cmllcy5tYXAoKHMpPT4oe3NlYWxlZE1hc3RlcjpzLnNlYWxlZE1hc3RlcixjcmVkSWQ6cy5jcmVkSWR9KSksey4uLnRoaXMuI24sc2FsdDplLnNhbHR9KTtpZihyIT09MClyZXR1cm4gZChyKTt0aGlzLiNlPXQuZW5jbGF2ZTtsZXQgbj1LYShlLHQuY3JlZElkKTtpZihuIT09dm9pZCAwKXRoaXMuI3Q9bixhd2FpdCB0aGlzLiNyKERlKG4pKTtyZXR1cm4gcCh0LmVuY2xhdmUpfWFzeW5jIHJlbmFtZShlLHQpe2xldCByPXRoaXMuI3Q7aWYocj09PXZvaWQgMClyZXR1cm4gZCgyMik7bGV0IG49ci5lbnRyaWVzLmZpbmRJbmRleCgoYyk9PlkoYy5jcmVkSWQsZSkpO2lmKG48MClyZXR1cm4gZCgxMyk7bGV0IHM9ci5lbnRyaWVzLm1hcChrdCksaT1zW25dO2lmKGk9PT12b2lkIDApcmV0dXJuIGQoMTMpO2xldCBvPUlpKHQpO3Nbbl09ey4uLmksbmljazpvfTtsZXQgYT17c2FsdDpyLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnN9O3JldHVybiB0aGlzLiN0PWEsYXdhaXQgdGhpcy4jcihEZShhKSkscCh2b2lkIDApfWFzeW5jIHJlbW92ZShlKXtsZXQgdD10aGlzLiN0O2lmKHQ9PT12b2lkIDApcmV0dXJuIGQoMjIpO2xldCByPXQuZW50cmllcy5maWx0ZXIoKHMpPT4hWShzLmNyZWRJZCxlKSk7aWYoci5sZW5ndGg9PT10LmVudHJpZXMubGVuZ3RoKXJldHVybiBkKDEzKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIHRoaXMuI3Q9dm9pZCAwLGF3YWl0IHRoaXMuI3Iodm9pZCAwKSxwKHZvaWQgMCk7bGV0IG49e3NhbHQ6dC5zYWx0LnNsaWNlKCksZW50cmllczpyLm1hcChrdCl9O3JldHVybiB0aGlzLiN0PW4sYXdhaXQgdGhpcy4jcihEZShuKSkscCh2b2lkIDApfWFzeW5jIHdpcGUoKXt0aGlzLiNlPXZvaWQgMCx0aGlzLiN0PXZvaWQgMCxhd2FpdCB0aGlzLiNyKHZvaWQgMCl9fWZ1bmN0aW9uIElpKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuO2xldCB0PWUudHJpbSgpO3JldHVybiB0PT09IiI/dm9pZCAwOnR9ZnVuY3Rpb24gSGEoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1IilyZXR1cm47cmV0dXJuIGRpKG5hdmlnYXRvci51c2VyQWdlbnQpfWZ1bmN0aW9uIGt0KGUpe2xldFt0LHJdPVZlKGUuc2VhbGVkTWFzdGVyLnNsaWNlKCkpO3JldHVybnt0eXBlOiJwcmYiLHNlYWxlZE1hc3RlcjpyPT09MCYmdCE9PXZvaWQgMD90OmUuc2VhbGVkTWFzdGVyLGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHRhZzplLnRhZy5zbGljZSgpLHVzZXJJZDplLnVzZXJJZD09PXZvaWQgMD92b2lkIDA6ZS51c2VySWQuc2xpY2UoKSxuaWNrOmUubmljayxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OmUubGFzdFVzZWRBdCxhdHRhY2htZW50OmUuYXR0YWNobWVudCx0cmFuc3BvcnRzOmUudHJhbnNwb3J0cz09PXZvaWQgMD92b2lkIDA6Wy4uLmUudHJhbnNwb3J0c10sYWFndWlkOmUuYWFndWlkPT09dm9pZCAwP3ZvaWQgMDplLmFhZ3VpZC5zbGljZSgpLGVucm9sbGVkT3M6ZS5lbnJvbGxlZE9zfX1mdW5jdGlvbiBEZShlKXtyZXR1cm57c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOmUuZW50cmllcy5tYXAoa3QpfX1mdW5jdGlvbiB4aShlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT09Im9iamVjdCJ9ZnVuY3Rpb24gTWEoZSl7aWYoIXhpKGUpfHxlLnR5cGUhPT0icHJmIilyZXR1cm47aWYoIShlLnNlYWxlZE1hc3RlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHwhKGUuY3JlZElkIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEoZS50YWcgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8ZS50YWcuYnl0ZUxlbmd0aCE9PTMyfHx0eXBlb2YgZS5lbnJvbGxlZEF0IT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoZS5lbnJvbGxlZEF0KSlyZXR1cm47bGV0W3Qscl09VmUoZS5zZWFsZWRNYXN0ZXIpO2lmKHIhPT0wfHx0PT09dm9pZCAwKXJldHVybjtsZXQgbj1lLmF0dGFjaG1lbnQ9PT0icGxhdGZvcm0ifHxlLmF0dGFjaG1lbnQ9PT0iY3Jvc3MtcGxhdGZvcm0iP2UuYXR0YWNobWVudDp2b2lkIDAscz1lLmVucm9sbGVkT3MsaT1zPT09ImlvcyJ8fHM9PT0ibWFjb3MifHxzPT09ImFuZHJvaWQifHxzPT09IndpbmRvd3MifHxzPT09ImxpbnV4Inx8cz09PSJvdGhlciI/czp2b2lkIDAsbz1BcnJheS5pc0FycmF5KGUudHJhbnNwb3J0cyk/ZS50cmFuc3BvcnRzLmZpbHRlcigoYSk9PnR5cGVvZiBhPT09InN0cmluZyIpOnZvaWQgMDtyZXR1cm57dHlwZToicHJmIixzZWFsZWRNYXN0ZXI6dCxjcmVkSWQ6ZS5jcmVkSWQuc2xpY2UoKSx0YWc6ZS50YWcuc2xpY2UoKSx1c2VySWQ6ZS51c2VySWQgaW5zdGFuY2VvZiBVaW50OEFycmF5P2UudXNlcklkLnNsaWNlKCk6dm9pZCAwLG5pY2s6dHlwZW9mIGUubmljaz09PSJzdHJpbmciP2Uubmljazp2b2lkIDAsZW5yb2xsZWRBdDplLmVucm9sbGVkQXQsbGFzdFVzZWRBdDp0eXBlb2YgZS5sYXN0VXNlZEF0PT09Im51bWJlciImJk51bWJlci5pc0Zpbml0ZShlLmxhc3RVc2VkQXQpP2UubGFzdFVzZWRBdDp2b2lkIDAsYXR0YWNobWVudDpuLHRyYW5zcG9ydHM6bz09PXZvaWQgMHx8by5sZW5ndGg9PT0wP3ZvaWQgMDpvLGFhZ3VpZDplLmFhZ3VpZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZS5hYWd1aWQuc2xpY2UoKTp2b2lkIDAsZW5yb2xsZWRPczppfX1mdW5jdGlvbiBFaShlKXtpZigheGkoZSkpcmV0dXJuO2lmKCEoZS5zYWx0IGluc3RhbmNlb2YgVWludDhBcnJheSl8fCFBcnJheS5pc0FycmF5KGUuZW50cmllcykpcmV0dXJuO2xldCB0PVtdO2ZvcihsZXQgciBvZiBlLmVudHJpZXMpe2xldCBuPU1hKHIpO2lmKG4hPT12b2lkIDApdC5wdXNoKG4pfWlmKHQubGVuZ3RoPT09MClyZXR1cm47cmV0dXJue3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczp0fX1mdW5jdGlvbiBSYShlKXtyZXR1cm57dHlwZToicHJmIixjcmVkSWQ6ZS5jcmVkSWQuc2xpY2UoKSx1c2VySWQ6ZS51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmUudXNlcklkLnNsaWNlKCksbmljazplLm5pY2ssZW5yb2xsZWRBdDplLmVucm9sbGVkQXQsbGFzdFVzZWRBdDplLmxhc3RVc2VkQXQsYXR0YWNobWVudDplLmF0dGFjaG1lbnQsdHJhbnNwb3J0czplLnRyYW5zcG9ydHM9PT12b2lkIDA/dm9pZCAwOlsuLi5lLnRyYW5zcG9ydHNdLGFhZ3VpZDplLmFhZ3VpZD09PXZvaWQgMD92b2lkIDA6ZS5hYWd1aWQuc2xpY2UoKSxlbnJvbGxlZE9zOmUuZW5yb2xsZWRPc319ZnVuY3Rpb24gTGEoZSl7aWYoZT09PXZvaWQgMClyZXR1cm5bXTtyZXR1cm4gZS5lbnRyaWVzLmZpbHRlcigodCk9PnQuY3JlZElkLmJ5dGVMZW5ndGg+MCkubWFwKCh0KT0+dC5jcmVkSWQuc2xpY2UoKSl9ZnVuY3Rpb24gT2EoZSx0KXtsZXQgcj1lLmVudHJpZXMubWFwKGt0KSxuPXIuZmluZEluZGV4KChzKT0+WShzLmNyZWRJZCx0LmNyZWRJZCkpO2lmKG4+PTApe2xldCBzPXJbbl07cltuXT17Li4udCxlbnJvbGxlZEF0OnM/LmVucm9sbGVkQXQ/P3QuZW5yb2xsZWRBdCxuaWNrOnQubmljaz8/cz8ubmlja319ZWxzZSByLnB1c2godCk7cmV0dXJue3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczpyfX1mdW5jdGlvbiBLYShlLHQpe2lmKHQuYnl0ZUxlbmd0aD09PTApcmV0dXJuO2xldCByPWUuZW50cmllcy5maW5kSW5kZXgoKGkpPT5ZKGkuY3JlZElkLHQpKTtpZihyPDApcmV0dXJuO2xldCBuPWUuZW50cmllcy5tYXAoa3QpLHM9bltyXTtpZihzPT09dm9pZCAwKXJldHVybjtyZXR1cm4gbltyXT17Li4ucyxsYXN0VXNlZEF0OkRhdGUubm93KCl9LHtzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6bn19dmFyIE5tPW1yKCJmYmZjMzAwNzE1NGU0ZWNjOGMwYjZlMDIwNTU3ZDdiZCIpLHFtPW1yKCJlYTliOGQ2NjRkMDExZDIxM2NlNGI2YjQ4Y2I1NzVkNCIpLEZtPW1yKCIwODk4NzA1OGNhZGM0YjgxYjZlMTMwZGU1MGRjYmU5NiIpLFdtPW1yKCIyZmMwNTc5ZjgxMTM0N2VhYjExNmJiNWE4ZGI5MjAyYSIpO2Z1bmN0aW9uIG1yKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyl0W3JdPU51bWJlci5wYXJzZUludChlLnNsaWNlKHIqMixyKjIrMiksMTYpO3JldHVybiB0fXZhciBWYT0iZGlwbG9tYXRpYy5waW4vIjtmdW5jdGlvbiBfYShlKXtyZXR1cm4gVmErU2UoZSl9YXN5bmMgZnVuY3Rpb24gQWkoZSx0LHIpe2xldCBuPWF3YWl0IHQuZGVyaXZlSWRlbnRpdHkoX2EociksMCk7cmV0dXJuIGUuYmxha2UzKG4ucHVibGljS2V5KX1hc3luYyBmdW5jdGlvbiBQaShlLHQpe2xldCByPWF3YWl0IGUuZ2VuMjU2Qml0U2VjdXJlUmFuZG9tU2VlZCgpLG49YXdhaXQgQWkoZSx0LHIpO3JldHVybntuOnIsaDpufX1hc3luYyBmdW5jdGlvbiBVaShlLHQscil7bGV0IG49YXdhaXQgQWkoZSx0LHIubik7cmV0dXJuIE5hKG4sci5oKX1mdW5jdGlvbiBraShlKXtpZihlPT09dm9pZCAwfHxlPT09bnVsbHx8dHlwZW9mIGUhPT0ib2JqZWN0IilyZXR1cm47bGV0IHQ9ZTtpZighKHQubiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHwhKHQuaCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXJldHVybjtpZih0Lm4uYnl0ZUxlbmd0aDwxfHx0LmguYnl0ZUxlbmd0aDwxKXJldHVybjtyZXR1cm57bjp0Lm4uc2xpY2UoKSxoOnQuaC5zbGljZSgpfX1mdW5jdGlvbiBCaShlKXtyZXR1cm57bjplLm4uc2xpY2UoKSxoOmUuaC5zbGljZSgpfX1mdW5jdGlvbiBOYShlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5ieXRlTGVuZ3RoO24rKylyfD1lW25dXnRbbl07cmV0dXJuIHI9PT0wfXZhciBncj0ia2V5cmluZyIsdmk9InByZk1ldGEiLFRuPSJpZFBpbiIsRGk9ImlkUHViIjtjbGFzcyBIbnsjZTtkYjsjdDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGI9ZSx0aGlzLiN0PXR9YXN5bmMgc2F2ZShlLHQpe3JldHVybiBhd2FpdCB0aGlzLiNuKGUpLHRoaXMuI2U9ZSx0aGlzLiNlfWFzeW5jIGxvYWQoKXtyZXR1cm4gdGhpcy4jZX1hc3luYyBjbGVhclNlc3Npb24oKXt0aGlzLiNlPXZvaWQgMH1hc3luYyB3aXBlKCl7dGhpcy4jZT12b2lkIDA7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihhZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKGFlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5kZWxldGUoZ3IpLHQuZGVsZXRlKHZpKSx0LmRlbGV0ZShUbiksdC5kZWxldGUoRGkpfSl9YXN5bmMgbG9hZEtleXJpbmcoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGFlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGFlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldChncik7cy5vbnN1Y2Nlc3M9KCk9PntyKEVpKHMucmVzdWx0KSl9LHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIHBlcnNpc3RLZXlyaW5nKGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oYWUsInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShhZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57aWYodC5vbmNvbXBsZXRlPSgpPT5uKCksdC5vbmVycm9yPSgpPT5zKHQuZXJyb3IpLHIuZGVsZXRlKHZpKSxlPT09dm9pZCAwKXtyLmRlbGV0ZShncik7cmV0dXJufXIucHV0KERlKGUpLGdyKX0pfWFzeW5jIGhhc0tleXJpbmcoKXtsZXQgZT1hd2FpdCB0aGlzLmxvYWRLZXlyaW5nKCk7cmV0dXJuIGUhPT12b2lkIDAmJmUuZW50cmllcy5sZW5ndGg+MH1hc3luYyBvcGVuUHJmU3RvcmUoZSl7bGV0IHQ9YXdhaXQgdGhpcy5sb2FkS2V5cmluZygpO3JldHVybiBuZXcgQ24oe3JwSWQ6ZS5ycElkLHJwTmFtZTplLnJwTmFtZSx1c2VyTmFtZTplLnVzZXJOYW1lLGtleXJpbmc6dCxwZXJzaXN0S2V5cmluZzoocik9PnRoaXMucGVyc2lzdEtleXJpbmcocil9KX1hc3luYyNuKGUpe2F3YWl0IHRoaXMuI2koRGkpO2xldCB0PWF3YWl0IHRoaXMuI3MoKTtpZih0IT09dm9pZCAwKXtpZighYXdhaXQgVWkodGhpcy4jdCxlLHQpKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gc2VlZCBkb2VzIG5vdCBtYXRjaCB0aGlzIGRldmljZSdzIGlkZW50aXR5IChsb2NhbCBkYXRhIHdhcyBjcmVhdGVkIHdpdGggYSBkaWZmZXJlbnQgbWFzdGVyIHNlZWQpIik7cmV0dXJufWxldCByPWF3YWl0IFBpKHRoaXMuI3QsZSk7YXdhaXQgdGhpcy4jcihyKX0jcygpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oYWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoYWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0KFRuKTtzLm9uc3VjY2Vzcz0oKT0+cihraShzLnJlc3VsdCkpLHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfSNyKGUpe2xldCB0PUJpKGUpLHI9dGhpcy5kYi50cmFuc2FjdGlvbihhZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKGFlKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvciksbi5wdXQodCxUbil9KX0jaShlKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGFlLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoYWUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e3Qub25jb21wbGV0ZT0oKT0+bigpLHQub25lcnJvcj0oKT0+cyh0LmVycm9yKSxyLmRlbGV0ZShlKX0pfX1jbGFzcyBNbntkYjtjb25zdHJ1Y3RvcihlKXt0aGlzLmRiPWV9YXN5bmMgZW5xKGUsdCl7bGV0IHI9Wy4uLnRdO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IG49dGhpcy5kYi50cmFuc2FjdGlvbih5ZSwicmVhZHdyaXRlIikscz1uLm9iamVjdFN0b3JlKHllKTtyZXR1cm4gbmV3IFByb21pc2UoKGksbyk9PntuLm9uY29tcGxldGU9KCk9PmkoKSxuLm9uZXJyb3I9KCk9Pm8obi5lcnJvcik7Zm9yKGxldCBhIG9mIHIpe2xldCBjPVNlKGEpO3MucHV0KHtob3N0OmUsaGFzaDpjfSl9fSl9YXN5bmMgZGVxKGUsdCl7bGV0IHI9Wy4uLnRdO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IG49dGhpcy5kYi50cmFuc2FjdGlvbih5ZSwicmVhZHdyaXRlIikscz1uLm9iamVjdFN0b3JlKHllKTtyZXR1cm4gbmV3IFByb21pc2UoKGksbyk9PntuLm9uY29tcGxldGU9KCk9PmkoKSxuLm9uZXJyb3I9KCk9Pm8obi5lcnJvcik7Zm9yKGxldCBhIG9mIHIpe2xldCBjPVNlKGEpO3MuZGVsZXRlKFtlLGNdKX19KX1hc3luYyBsaXN0KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oeWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoeWUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPXIuZ2V0QWxsKCk7aS5vbnN1Y2Nlc3M9KCk9PntsZXQgYT1pLnJlc3VsdC5maWx0ZXIoKGMpPT5jLmhvc3Q9PT1lKS5tYXAoKGMpPT5jLmhhc2gpO24oYS5tYXAoKGMpPT5RbihjKSkpfSxpLm9uZXJyb3I9KCk9PnMoaS5lcnJvcil9KX1hc3luYyBjb3VudCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oeWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoeWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuY291bnQoKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oeWUsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZSh5ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX12YXIgYWU9InNlZWRNZXRhIixvZT0iaG9zdHMiLHllPSJ1cGxvYWRRdWV1ZSIsaGU9ImRvd25sb2FkUXVldWUiLFE9Im1lc3NhZ2VzIixVdD0iYXBsZCIsQ2k9MyxUaT0iZGlwbG9tYXRpYy1zdG9yZS1kYiI7Y2xhc3MgSGl7c2VlZDtob3N0czt1cGxvYWRzO2Rvd25sb2FkczttZXNzYWdlcztkYjtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGI9ZSx0aGlzLnNlZWQ9bmV3IEhuKGUsdCksdGhpcy5ob3N0cz1uZXcgdm4oZSksdGhpcy51cGxvYWRzPW5ldyBNbihlKSx0aGlzLmRvd25sb2Fkcz1uZXcgQm4oZSksdGhpcy5tZXNzYWdlcz1uZXcgRG4oZSx0KX1hc3luYyB3aXBlKCl7YXdhaXQgdGhpcy5ob3N0cy53aXBlKCksYXdhaXQgdGhpcy51cGxvYWRzLndpcGUoKSxhd2FpdCB0aGlzLmRvd25sb2Fkcy53aXBlKCksYXdhaXQgdGhpcy5tZXNzYWdlcy53aXBlKCl9fWFzeW5jIGZ1bmN0aW9uIHFhKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57bGV0IHI9aW5kZXhlZERCLm9wZW4oVGksQ2kpO3Iub251cGdyYWRlbmVlZGVkPSgpPT57bGV0e3Jlc3VsdDpuLHRyYW5zYWN0aW9uOnN9PXI7aWYoIW4ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhhZSkpbi5jcmVhdGVPYmplY3RTdG9yZShhZSk7aWYoIW4ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhvZSkpbi5jcmVhdGVPYmplY3RTdG9yZShvZSx7a2V5UGF0aDoibGFiZWwifSk7aWYoIW4ub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh5ZSkpbi5jcmVhdGVPYmplY3RTdG9yZSh5ZSx7a2V5UGF0aDpbImhvc3QiLCJoYXNoIl19KTtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGhlKSluLmNyZWF0ZU9iamVjdFN0b3JlKGhlKTtsZXQgaTtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFEpKWk9bi5jcmVhdGVPYmplY3RTdG9yZShRKTtlbHNle2lmKCFzKXRocm93IEVycm9yKCJtaXNzaW5nIHVwZ3JhZGUgdHJhbnNhY3Rpb24gZm9yIG1lc3NhZ2VzIHN0b3JlIik7aT1zLm9iamVjdFN0b3JlKFEpfWlmKCFpLmluZGV4TmFtZXMuY29udGFpbnMoVXQpKWkuY3JlYXRlSW5kZXgoVXQsImFwbGQiLHt1bmlxdWU6ITF9KX0sci5vbmJsb2NrZWQ9KCk9Pntjb25zb2xlLndhcm4oYFtESVBMT01BVElDXSBwcm90b2NvbCBzdG9yZSBJREIgdXBncmFkZSBibG9ja2VkICgke1RpfSDihpIgdiR7Q2l9KTsgd2FpdGluZyBmb3Igb3RoZXIgY29ubmVjdGlvbnMgdG8gY2xvc2VgKX0sci5vbnN1Y2Nlc3M9KCk9PntsZXQgbj1yLnJlc3VsdDtuLm9udmVyc2lvbmNoYW5nZT0oKT0+e24uY2xvc2UoKX0sZShuKX0sci5vbmVycm9yPSgpPT50KHIuZXJyb3I/P0Vycm9yKCJwcm90b2NvbCBzdG9yZSBJbmRleGVkREIgb3BlbiBmYWlsZWQiKSl9KX1hc3luYyBmdW5jdGlvbiBNaShlKXtsZXQgdD1hd2FpdCBxYSgpO2lmKHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3Iuc3RvcmFnZT8ucGVyc2lzdCl0cnl7YXdhaXQgUHJvbWlzZS5yYWNlKFtuYXZpZ2F0b3Iuc3RvcmFnZS5wZXJzaXN0KCksbmV3IFByb21pc2UoKHIpPT57c2V0VGltZW91dCgoKT0+cighMSksMjAwMCl9KV0pfWNhdGNoe31yZXR1cm4gbmV3IEhpKHQsZSl9Y2xhc3MgUm57Y2xpZW50O2VudERCO3Bvc3Q7d2hlblJlYWR5O3Jlc29sdmVSZWFkeTtyZWplY3RSZWFkeTtjb25zdHJ1Y3RvcihlKXt0aGlzLnBvc3Q9ZSx0aGlzLndoZW5SZWFkeT1uZXcgUHJvbWlzZSgodCxyKT0+e3RoaXMucmVzb2x2ZVJlYWR5PXQsdGhpcy5yZWplY3RSZWFkeT1yfSl9YXN5bmMgaW5pdCgpe3RyeXtsZXQgZT1hd2FpdCBNaShyciksdD1hd2FpdCByaSh7Y2FjaGU6ITF9KSxyPW5ldyBGdCh0LmFwcGx5LCgpPT50LmNsZWFyKCksKGkpPT57aWYoaS5sZW5ndGg8MSlyZXR1cm47dGhpcy5wb3N0KHtraW5kOiJkaXJ0eSIsZWlkczppLm1hcCgobyk9Pm8uc2xpY2UoKSl9KX0pLG49ci5jbGVhcjtyLmNsZWFyPWFzeW5jKCk9PntsZXQgaT1hd2FpdCBuKCk7aWYoaT09PTApdGhpcy5wb3N0KHtraW5kOiJ3aXBlZCJ9KTtyZXR1cm4gaX07bGV0IHM9bmV3IFhyKG5ldyBVcixyLGUsb3MscnIpO3RoaXMuY2xpZW50PXMsdGhpcy5lbnREQj10LHMuY2xpZW50U3RhdGUubGlzdGVuKCgpPT57dGhpcy5lbWl0Q2xpZW50U3RhdGUoKX0pLHMueGZlclN0YXRlLmxpc3RlbigoKT0+e3RoaXMuZW1pdFhmZXJTdGF0ZSgpfSksYXdhaXQgdGhpcy5lbWl0WGZlclN0YXRlKCksdGhpcy5wb3N0KHtraW5kOiJyZWFkeSJ9KSx0aGlzLm1hcmtSZWFkeSgpfWNhdGNoKGUpe2xldCB0PWUgaW5zdGFuY2VvZiBFcnJvcj9lOkVycm9yKFN0cmluZyhlKSk7dGhyb3cgdGhpcy5wb3N0KHtraW5kOiJpbml0RXJyb3IiLG1lc3NhZ2U6dC5tZXNzYWdlfSksdGhpcy5mYWlsUmVhZHkodCksdH19bWFya1JlYWR5KCl7bGV0IGU9dGhpcy5yZXNvbHZlUmVhZHk7aWYodGhpcy5yZXNvbHZlUmVhZHk9dm9pZCAwLHRoaXMucmVqZWN0UmVhZHk9dm9pZCAwLGUpZSgpfWZhaWxSZWFkeShlKXtsZXQgdD10aGlzLnJlamVjdFJlYWR5O2lmKHRoaXMucmVzb2x2ZVJlYWR5PXZvaWQgMCx0aGlzLnJlamVjdFJlYWR5PXZvaWQgMCx0KXQoZSl9cmVxdWlyZUNsaWVudCgpe2lmKCF0aGlzLmNsaWVudCl0aHJvdyBFcnJvcigiV29ya2VyUnVudGltZSBub3QgaW5pdGlhbGl6ZWQiKTtyZXR1cm4gdGhpcy5jbGllbnR9YXN5bmMgZW1pdENsaWVudFN0YXRlKCl7bGV0IGU9dGhpcy5jbGllbnQ7aWYoIWUpcmV0dXJuO2xldCB0PWF3YWl0IGUuY2xpZW50U3RhdGUuZ2V0KCk7dGhpcy5wb3N0KHtraW5kOiJjbGllbnRTdGF0ZSIsY29ubmVjdGVkOnQuY29ubmVjdGVkfSl9YXN5bmMgZW1pdFhmZXJTdGF0ZSgpe2xldCBlPXRoaXMuY2xpZW50O2lmKCFlKXJldHVybjtsZXQgdD1hd2FpdCBlLnhmZXJTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6InhmZXJTdGF0ZSIsc3RhdGU6dH0pfWhvc3RGcm9tU2VyaWFsaXplZChlKXtyZXR1cm57aGFuZGxlOm5ldyBVUkwoZS5oYW5kbGUpLGxhYmVsOmUubGFiZWwsaWR4OmUuaWR4fX1hc3luYyBoYW5kbGUoZSl7YXdhaXQgdGhpcy53aGVuUmVhZHk7bGV0IHQ9dGhpcy5yZXF1aXJlQ2xpZW50KCk7c3dpdGNoKGUub3Ape2Nhc2UicGluZyI6cmV0dXJuInBvbmciO2Nhc2Uic2V0U2VlZCI6e2xldFtyLG5dPXBlLmZyb21CeXRlcyhlLnNlZWQpO2lmKGUuc2VlZC5maWxsKDApLG4hPT0wfHxyPT09dm9pZCAwKXRocm93IG5ldyBnZShuKTthd2FpdCB0LnNldFNlZWQocix7cGVyc2lzdDplLnBlcnNpc3R9KTtyZXR1cm59Y2FzZSJsaW5rIjp7YXdhaXQgdC5saW5rKHRoaXMuaG9zdEZyb21TZXJpYWxpemVkKGUuaG9zdCksZS5jb25uZWN0Pz8hMCk7cmV0dXJufWNhc2UidW5saW5rIjp7YXdhaXQgdC51bmxpbmsoZS5sYWJlbCk7cmV0dXJufWNhc2UiY29ubmVjdCI6e2F3YWl0IHQuY29ubmVjdChlLmxpc3Rlbj8/ITAsZS5zeW5jPz8hMCk7cmV0dXJufWNhc2UiZGlzY29ubmVjdCI6e2F3YWl0IHQuZGlzY29ubmVjdCgpO3JldHVybn1jYXNlInN5bmMiOnJldHVybiBhd2FpdCB0LnN5bmMoKTtjYXNlInJlYnVpbGQiOnJldHVybiBhd2FpdCB0LnJlYnVpbGQoe2NoZWNrSG9zdDplLmNoZWNrSG9zdD8/ITB9KTtjYXNlInJlY29uY2lsZSI6e2xldFtyLG5dPWF3YWl0IHQucmVjb25jaWxlKGUuaG9zdExhYmVsLHtwdWxsOmUucHVsbCxwdXNoOmUucHVzaCxzeW5jOmUuc3luY30pO2lmKG4hPT0wKXRocm93IG5ldyBnZShuKTtpZighcil0aHJvdyBuZXcgZ2UoMTIpO3JldHVybiByfWNhc2UibXNnY2hlY2siOnJldHVybiBhd2FpdCB0Lm1zZ2NoZWNrKCk7Y2FzZSJlbnRjaGVjayI6e2xldCByPXRoaXMuZW50REI7aWYoIXIpdGhyb3cgbmV3IGdlKDEyKTtsZXRbbixzXT1hd2FpdCByLmNoZWNrc3VtKHJyKTtpZihzIT09MCl0aHJvdyBuZXcgZ2Uocyk7aWYoIW4pdGhyb3cgbmV3IGdlKDEyKTtyZXR1cm4gbn1jYXNlIndpcGUiOnthd2FpdCB0LndpcGUoe21zZ3M6ZS5tc2dzLGVudHM6ZS5lbnRzLG1ldGE6ZS5tZXRhLHNlZWQ6ZS5zZWVkfSk7cmV0dXJufWNhc2UiaW1wb3J0Ijp7bGV0IHI9ZS5ieXRlcy5zbGljZSgpLG49bmV3IEJsb2IoW3JdKSxzPW5ldyBGaWxlKFtuXSwiaW1wb3J0LmRpcCIpO3JldHVybiBhd2FpdCB0LmltcG9ydChzKX1jYXNlImV4cG9ydCI6e2xldFtyLG5dPWF3YWl0IHQuZXhwb3J0Qnl0ZXMoKTtpZihuIT09MCl0aHJvdyBuZXcgZ2Uobik7aWYoIXIpdGhyb3cgbmV3IGdlKDEyKTtyZXR1cm4gcn1jYXNlImdldFhmZXJTdGF0ZSI6cmV0dXJuIGF3YWl0IHQueGZlclN0YXRlLmdldCgpO2RlZmF1bHQ6e2xldCByPWU7dGhyb3cgRXJyb3IoInVua25vd24gd29ya2VyIGNvbW1hbmQiKX19fX1jbGFzcyBnZSBleHRlbmRzIEVycm9ye3N0YXR1cztjb25zdHJ1Y3RvcihlKXtzdXBlcihgV29ya2VyU3RhdHVzRXJyb3I6ICR7QltlXX1gKTt0aGlzLnN0YXR1cz1lO3RoaXMubmFtZT0iV29ya2VyU3RhdHVzRXJyb3IifX1mdW5jdGlvbiBTcihlLHQpe3JldHVybntraW5kOiJyZXBseSIsaWQ6ZSxvazohMCxyZXN1bHQ6dH19ZnVuY3Rpb24gTG4oZSx0KXtyZXR1cm57a2luZDoicmVwbHkiLGlkOmUsb2s6ITEsc3RhdHVzOnR9fXZhciBMZT1nbG9iYWxUaGlzLFJpPW5ldyBSbigoZSx0KT0+e2lmKHQmJnQubGVuZ3RoPjApTGUucG9zdE1lc3NhZ2UoZSx0KTtlbHNlIExlLnBvc3RNZXNzYWdlKGUpfSk7TGUub25tZXNzYWdlPShlKT0+e2xldCB0PWUuZGF0YTtpZighX24odCkpcmV0dXJuO0ZhKHQpfTthc3luYyBmdW5jdGlvbiBGYShlKXt0cnl7bGV0IHQ9YXdhaXQgUmkuaGFuZGxlKGUpO2lmKChlLm9wPT09ImV4cG9ydCJ8fGUub3A9PT0ibXNnY2hlY2sifHxlLm9wPT09ImVudGNoZWNrIikmJnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtsZXQgcj10LnNsaWNlKCk7TGUucG9zdE1lc3NhZ2UoU3IoZS5pZCxyKSxbci5idWZmZXJdKTtyZXR1cm59aWYoZS5vcD09PSJyZWNvbmNpbGUiJiZ0JiZ0eXBlb2YgdD09PSJvYmplY3QiJiYibXNnY2hlY2siaW4gdCYmdC5tc2djaGVjayBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2xldCByPXQubXNnY2hlY2suc2xpY2UoKSxuPXsuLi50LG1zZ2NoZWNrOnJ9O0xlLnBvc3RNZXNzYWdlKFNyKGUuaWQsbiksW3IuYnVmZmVyXSk7cmV0dXJufUxlLnBvc3RNZXNzYWdlKFNyKGUuaWQsdCkpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBnZSl7TGUucG9zdE1lc3NhZ2UoTG4oZS5pZCx0LnN0YXR1cykpO3JldHVybn1jb25zb2xlLmVycm9yKCJ3b3JrZXIgY29tbWFuZCBmYWlsZWQiLHQpLExlLnBvc3RNZXNzYWdlKExuKGUuaWQsMTIpKX19UmkuaW5pdCgpLmNhdGNoKChlKT0+e2NvbnNvbGUuZXJyb3IoIndvcmtlciBpbml0IGZhaWxlZCIsZSl9KTsK";var kn=typeof globalThis.Worker==="function"?globalThis.Worker:void 0,ti=kn===void 0?void 0:kn.prototype.postMessage,Yn;function jl(){if(typeof Tn!=="string"||Tn.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(Tn)}function Al(){if(Yn!==void 0)return Yn;let t=new Blob([jl()],{type:"text/javascript"});return Yn=URL.createObjectURL(t),Yn}function Lo(){if(kn===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new kn(Al(),{type:"module"})}function Mo(t,e,n){if(ti===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot post to sync worker");if(n!==void 0&&n.length>0)ti.call(t,e,{transfer:n});else ti.call(t,e)}var ql=new TextEncoder().encode("diplomatic.bind.v1"),ei=new TextEncoder().encode("diplomatic.bindtag.v1"),_l=new TextEncoder().encode("DIPLOMATIC SEED FINGERPRINT"),$l=32,tc=32,ec=16,nc=32,et=new jt;function sc(t){return t.map((e)=>({handle:e.handle,label:e.label,idx:e.idx??0}))}function Bo(t){if(t.byteLength===0||t.every((l)=>l===0))return a(22);if(t.byteLength<Gt+1)return a(14);let e=t.subarray(0,Gt);if(e.every((l)=>l===0))return a(22);let n=new U(t.subarray(Gt)),[s,i]=n.readStruct(vs);if(i!==0)return a(i);if(s===void 0)return a(14);if(!n.done())return a(14);let[o,r]=at.fromBytes(e);if(r!==0)return a(r);if(o===void 0)return a(12);return m({enclave:o,hosts:s.hosts.map((l)=>({...l}))})}class Je{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(){let t;try{let e=await et.genX25519();t=e.priv;let[n,s]=Vn(e.pub);if(s!==0)return a(s);if(n===void 0)return a(10);let i=new Je(t,n);return t=void 0,m(i)}catch{return a(29)}finally{t?.fill(0)}}wipe(){this.#t.fill(0)}get dhkeReq(){let[t,e]=Vn(this.#e.slice());if(t===void 0)throw Error(`dhkeReq ${e}`);return t}async finish(t){let e=t.subarray(0,fe),n=t.subarray(fe),[s,i]=await Os(this.#t,e,this.#e,e);if(i!==0)return a(i);if(s===void 0)return a(12);let o;try{try{o=await et.decryptXSalsa20Poly1305Combined(n,s)}catch{return a(20)}let r=Bo(o);if(r[1]===0)this.wipe();return r}finally{s.fill(0),o?.fill(0)}}}async function wo(t,e,n){let s=_t();if(s!==0)return s;let[i,o]=qt(n);if(o!==0)return o;if(i===void 0)return 9;await Kn();let r=new Uint8Array(e.byteLength);r.set(e);let l={largeBlob:{write:r.buffer}},c={publicKey:{challenge:Yt(At),rpId:i,allowCredentials:[{type:gt,id:Nt(t)}],userVerification:"required",extensions:l,...n?.hints!==void 0?{hints:n.hints}:{}}},d;try{try{d=await navigator.credentials.get(c)}catch(y){if(!gn(y))throw y;Ve(),d=await navigator.credentials.get(c)}}catch(y){return Et(y),30}finally{r.fill(0)}let[u,p]=$t(d);if(p!==0)return p;if(u===void 0)return 27;if(u.getClientExtensionResults().largeBlob?.written!==!0)return 30;return 0}var ni=32;function ic(t){if(t===void 0)return[];if(t instanceof Uint8Array)return[t];return t.filter((e)=>e.byteLength>0)}function oc(t){if(!(t instanceof Error))return!1;return t.name==="NotSupportedError"||t.name==="TypeError"}function Jo(t){if(t===void 0)return;let e=Wn(t);if(e.byteLength<ni){e.fill(0);return}if(e.byteLength===ni)return e;let n=e.slice(0,ni);return e.fill(0),n}async function rc(t){let e=_t();if(e!==0)return a(e);let[n,s]=qt(t);if(s!==0)return a(s);if(n===void 0)return a(9);let i=t?.userName??Be,o=t?.displayName??i,r=Yt(16),l=t?.authenticatorAttachment==="cross-platform",c={residentKey:l?"discouraged":"required",requireResidentKey:!l,userVerification:l?"preferred":"required"};if(t?.authenticatorAttachment!==void 0)c.authenticatorAttachment=t.authenticatorAttachment;let d={challenge:Yt(At),rp:{id:n,name:t?.rpName??In},user:{id:r,name:i,displayName:o},pubKeyCredParams:Sn,authenticatorSelection:c,...t?.hints!==void 0?{hints:t.hints}:{},...t?.excludeCredentials!==void 0&&t.excludeCredentials.length>0?{excludeCredentials:t.excludeCredentials.map((f)=>({type:gt,id:Nt(f)}))}:{}},u=t?.salt!==void 0?Nt(t.salt):void 0,p=(f)=>xn({publicKey:{...d,extensions:f&&u!==void 0?{prf:{eval:{first:u}}}:{prf:{}}}}),h;try{h=await p(u!==void 0)}catch(f){if(u===void 0||!oc(f))return Et(f),a(30);try{h=await p(!1)}catch(S){return Et(S),a(30)}}let[y,b]=$t(h);if(b!==0)return a(b);if(y===void 0)return a(27);let Z=y.getClientExtensionResults(),X=Jo(Z.prf?.results?.first),I=Z.prf?.enabled===!0||X!==void 0;if(l&&X!==void 0)X.fill(0);return m({credId:new Uint8Array(y.rawId),userId:new Uint8Array(r),prfEnabled:I,prf:l?void 0:X,attachment:qs(y.authenticatorAttachment),transports:_s(y),aaguid:To(y)})}async function Po(t){let e=_t();if(e!==0)return a(e);let[n,s]=qt(t);if(s!==0)return a(s);if(n===void 0)return a(9);let i=t?.salt??Cn,o=Nt(i),r={challenge:Yt(At),rpId:n,userVerification:"preferred",extensions:{prf:{eval:{first:o}}}};if(t?.hints!==void 0)r.hints=t.hints;let l=ic(t?.credId);if(l.length>0)r.allowCredentials=l.map((y)=>({type:gt,id:Nt(y)}));let c;try{c=await Rn({publicKey:r})}catch(y){return Et(y),a(30)}let[d,u]=$t(c);if(u!==0)return a(u);if(d===void 0)return a(27);let p=d.getClientExtensionResults().prf?.results;if(p?.first===void 0)return a(7);let h=Jo(p.first);if(h===void 0)return a(27);return m({prf:h,credId:new Uint8Array(d.rawId),attachment:qs(d.authenticatorAttachment),transports:_s(d)})}function si(t){if(t.byteLength!==Gt)return a(10);return[t,0]}class at{#t;constructor(t){this.#t=t}static async fromRandom(t){if(t.byteLength<nc)return a(10);let e=await et.gen256BitSecureRandomSeed(),n=Vt(e,t);try{let s=await et.blake3(n),[i,o]=si(s);if(o!==0)return a(o);if(i===void 0)return a(12);return m(new at(i))}finally{e.fill(0),n.fill(0),t.fill(0)}}static fromBytes(t){let[e,n]=si(t);if(n!==0)return a(n);if(e===void 0)return a(10);let[s,i]=si(e.slice());if(i!==0)return a(i);if(s===void 0)return a(10);return m(new at(s))}async sealWithPasskey(t){let e=t?.salt??Cn,n=t?.credId,s=n,i=t?.createCredIfNeeded===!0&&(n===void 0||!(n instanceof Uint8Array)&&n.length===0),o,r;if(i){let[u,p]=await rc({rpId:t?.rpId,rpName:t?.rpName,userName:t?.userName??Be,displayName:t?.displayName,authenticatorAttachment:t?.authenticatorAttachment,hints:t?.hints,excludeCredentials:t?.excludeCredentials,salt:e});if(p!==0)return a(p);if(u===void 0)return a(30);if(!u.prfEnabled)return a(30);s=u.credId,o=u,r=u.prf}let l=async(u,p,h,y)=>{try{let[b,Z]=await this.#s(u);if(Z!==0)return a(Z);if(b===void 0)return a(12);return m({sealedMaster:b,salt:e.slice(),credId:p.slice(),userId:o?.userId===void 0?void 0:o.userId.slice(),attachment:h??o?.attachment,transports:y??o?.transports,aaguid:o?.aaguid===void 0?void 0:o.aaguid.slice()})}finally{u.fill(0)}};if(r!==void 0&&o!==void 0)return l(r,o.credId,o.attachment,o.transports);let[c,d]=await Po({rpId:t?.rpId,rpName:t?.rpName,credId:s,salt:e,hints:t?.hints});if(d!==0)return a(d);if(c===void 0)return a(7);return l(c.prf,c.credId,c.attachment,c.transports)}async bind(t,e){if(e!==void 0){for(let o of e)if(!await this.#i(o.credId,o.tag))return a(10)}let[n,s]=await this.sealWithPasskey(t);if(s!==0)return a(s);if(n===void 0)return a(12);let i=await this.#n(n.credId);return m({...n,tag:i})}static async unsealWithPasskey(t,e){if(t.length===0)return a(22);let n=[];for(let l of t)if(l.credId.byteLength>0)n.push(l.credId);let[s,i]=await Po({rpId:e.rpId,rpName:e.rpName,hints:e.hints,credId:n.length>0?n:void 0,salt:e.salt});if(i!==0)return a(i);if(s===void 0)return a(7);let o=t.find((l)=>F(l.credId,s.credId)),r=o===void 0?t:[o,...t.filter((l)=>l!==o)];try{for(let l of r){let[c]=await at.#o(l.sealedMaster,s.prf);if(c!==void 0)return m({enclave:c,credId:s.credId.slice()})}return a(20)}finally{s.prf.fill(0)}}async sealWithIkm(t){try{return await this.#s(t)}finally{t.fill(0)}}static async unsealWithIkm(t,e){try{return await at.#o(t,e)}finally{e.fill(0)}}async persistToLargeBlob(t=[],e){let n=e?.credId;if(n===void 0){let[o,r]=await Yo(e);if(r!==0)return a(r);if(o===void 0)return a(30);n=o}let[s,i]=this.#c(t);if(i!==0)return a(i);if(s===void 0)return a(12);try{let o=await wo(n,s,e);if(o!==0)return a(o);return m(n)}finally{s.fill(0)}}static async fromLargeBlob(t){let[e,n]=await ko(t?.credId,t);if(n!==0)return a(n);if(e===void 0)return a(7);try{let[s,i]=Bo(e.blob);if(i!==0)return a(i);if(s===void 0)return a(12);return m({...s,credId:e.credId})}finally{e.blob.fill(0)}}static async clearLargeBlob(t,e){return wo(t,new Uint8Array(Gt),e)}async dumpToTty(){return 21}static pairRequest(){return Je.create()}async pairAccept(t,e,n){if(n.userControlsBothSidesOfPair!==!0)return a(10);let s;try{s=await et.genX25519()}catch{return a(29)}try{let[i,o]=await Os(s.priv,t,t,s.pub);if(o!==0)return a(o);if(i===void 0)return a(12);try{let[r,l]=this.#c(e);if(l!==0)return a(l);if(r===void 0)return a(12);try{let c=await et.encryptXSalsa20Poly1305Combined(r,i);return Ds(Vt(s.pub,c))}catch{return a(12)}finally{r.fill(0)}}finally{i.fill(0)}}finally{s.priv.fill(0)}}spawnSyncWorker(t){let e=Lo(),n=this.#t.slice();return Mo(e,{id:t.id,op:"setSeed",seed:n,persist:t.persist},[n.buffer]),e}deriveCipher(t,e){let n=t.slice(),s=(r)=>this.#a(n,r),i=(r)=>this.#d(n,r);return{encrypt:Object.freeze({encrypt:s}),decrypt:Object.freeze({decrypt:i}),both:Object.freeze({encrypt:s,decrypt:i})}[e]}async deriveIdentity(t,e=0){let n=t,s=e,i=await this.#l(n,s),o=i.publicKey;return i.privateKey.fill(0),Object.freeze({publicKey:o,sign:(r)=>this.#p(n,s,r),kdmFor:(r)=>this.#m(n,s,r)})}async#e(){return await et.blake3(this.#t,{context:_l})}async#n(t){let e=new Uint8Array(this.#t.byteLength+ei.byteLength+t.byteLength);e.set(this.#t,0),e.set(ei,this.#t.byteLength),e.set(t,this.#t.byteLength+ei.byteLength);try{return await et.blake3(e)}finally{e.fill(0)}}async#i(t,e){if(e.byteLength!==$l)return!1;let n=await this.#n(t);try{if(n.byteLength!==e.byteLength)return!1;let s=0;for(let i=0;i<n.byteLength;i++){let o=n[i],r=e[i];if(o===void 0||r===void 0)return!1;s|=o^r}return s===0}finally{n.fill(0)}}async#s(t){let[e,n]=await Uo(et,t);if(n!==0)return a(n);if(e===void 0)return a(12);try{let s=await et.encryptXSalsa20Poly1305Combined(this.#t,e);return Bt(s)}catch{return a(12)}finally{e.fill(0)}}static async#o(t,e){let[,n]=Bt(t);if(n!==0)return a(n);let[s,i]=await Uo(et,e);if(i!==0)return a(i);if(s===void 0)return a(12);let o;try{try{o=await et.decryptXSalsa20Poly1305Combined(t,s)}catch{return a(20)}return at.fromBytes(o)}finally{s.fill(0),o?.fill(0)}}#c(t){let e=new N,n=e.writeStruct(vs,{hosts:sc(t)});if(n!==0)return a(n);let s=e.result(),i=new Uint8Array(Gt+s.byteLength);return i.set(this.#t,0),i.set(s,Gt),[i,0]}async#a(t,e){let n=await this.#r(t);try{return await et.encryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#d(t,e){let n=await this.#r(t);try{return await et.decryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#r(t){let e=new Uint8Array(this.#t.byteLength+t.byteLength);e.set(this.#t,0),e.set(t,this.#t.byteLength);try{return await et.blake3(e)}finally{e.fill(0)}}async#u(t,e){let n=new TextEncoder().encode(t),s=new Uint8Array(8);return new DataView(s.buffer).setBigUint64(0,BigInt(e),!1),await this.#r(Vt(n,s))}async#l(t,e){let n=await this.#u(t,e);try{return await et.deriveEd25519KeyPair(n)}finally{n.fill(0)}}async#p(t,e,n){let s=await this.#l(t,e);try{return await et.signEd25519(n,s.privateKey)}finally{s.privateKey.fill(0)}}async#m(t,e,n){let s=await this.#l(t,e),i=Vt(s.privateKey,n);s.privateKey.fill(0);try{return(await et.blake3(i)).slice(0,wt)}finally{i.fill(0)}}}async function Uo(t,e,n=ql){if(e.byteLength<ec)return a(10);let s=await t.blake3(Vt(e,n));return m(s.slice(0,tc))}var lc=new Set(["constructor","prototype","length","name"]);function Ln(t){for(let e of Object.getOwnPropertyNames(t)){if(lc.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}Ln(at);Ln(at.prototype);Ln(Je);Ln(Je.prototype);var No=8;class Mn{#t;#e;#n;#i;#s;constructor(t){if(this.#s=t.persistKeyring,this.#n={rpId:t.rpId,rpName:t.rpName},this.#i=t.userName??t.rpId??t.rpName??Be,t.keyring!==void 0)this.#e=kt(t.keyring)}get keyring(){return this.#e===void 0?void 0:kt(this.#e)}list(){if(this.#e===void 0)return[];return this.#e.entries.map(dc)}async save(t,e){if(e?.persist===!0)return Promise.reject(Error("prf-store: use bindAndSave(enclave) to persist a binding"));return this.#t=t,this.#t}async bindAndSave(t,e){let n=this.#e,s=e?.credId,i=s instanceof Uint8Array?s.byteLength>0:s!==void 0&&s.length>0;if(!i&&n!==void 0&&n.entries.length>=No)return a(26);let o=zo(e?.nick),r=e?.excludeCredentials??(i?void 0:Qo(n)),l=e?.salt??n?.salt,c=n===void 0?void 0:n.entries.map((b)=>({credId:b.credId,tag:b.tag})),[d,u]=await t.bind({...this.#n,salt:l,credId:s,createCredIfNeeded:e?.createCredIfNeeded??!i,excludeCredentials:r,userName:this.#i,displayName:o??this.#n.rpName??this.#i,authenticatorAttachment:e?.authenticatorAttachment,hints:e?.hints},c);if(u!==0)return a(u);if(d===void 0)return a(12);let p=Date.now(),h={type:"prf",sealedMaster:d.sealedMaster,credId:d.credId,tag:d.tag,userId:d.userId,nick:o,enrolledAt:p,lastUsedAt:p,attachment:d.attachment,transports:d.transports,aaguid:d.aaguid,enrolledOs:cc()},y=n===void 0?{salt:d.salt.slice(),entries:[]}:kt(n);return this.#e=uc(y,h),this.#t=t,await this.#s(kt(this.#e)),m(this.#t)}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0||t.entries.length===0)return a(22);let[e,n]=await at.unsealWithPasskey(t.entries.map((i)=>({sealedMaster:i.sealedMaster,credId:i.credId})),{...this.#n,salt:t.salt});if(n!==0)return a(n);this.#t=e.enclave;let s=pc(t,e.credId);if(s!==void 0)this.#e=s,await this.#s(kt(s));return m(e.enclave)}async rename(t,e){let n=this.#e;if(n===void 0)return a(22);let s=n.entries.findIndex((c)=>F(c.credId,t));if(s<0)return a(13);let i=n.entries.map(ze),o=i[s];if(o===void 0)return a(13);let r=zo(e);i[s]={...o,nick:r};let l={salt:n.salt.slice(),entries:i};return this.#e=l,await this.#s(kt(l)),m(void 0)}async remove(t){let e=this.#e;if(e===void 0)return a(22);let n=e.entries.filter((i)=>!F(i.credId,t));if(n.length===e.entries.length)return a(13);if(n.length===0)return this.#e=void 0,await this.#s(void 0),m(void 0);let s={salt:e.salt.slice(),entries:n.map(ze)};return this.#e=s,await this.#s(kt(s)),m(void 0)}async wipe(){this.#t=void 0,this.#e=void 0,await this.#s(void 0)}}function zo(t){if(t===void 0)return;let e=t.trim();return e===""?void 0:e}function cc(){if(typeof navigator>"u")return;return Co(navigator.userAgent)}function ze(t){let[e,n]=Bt(t.sealedMaster.slice());return{type:"prf",sealedMaster:n===0&&e!==void 0?e:t.sealedMaster,credId:t.credId.slice(),tag:t.tag.slice(),userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs}}function kt(t){return{salt:t.salt.slice(),entries:t.entries.map(ze)}}function Eo(t){return t!==null&&typeof t==="object"}function ac(t){if(!Eo(t)||t.type!=="prf")return;if(!(t.sealedMaster instanceof Uint8Array)||!(t.credId instanceof Uint8Array)||!(t.tag instanceof Uint8Array)||t.tag.byteLength!==32||typeof t.enrolledAt!=="number"||!Number.isFinite(t.enrolledAt))return;let[e,n]=Bt(t.sealedMaster);if(n!==0||e===void 0)return;let s=t.attachment==="platform"||t.attachment==="cross-platform"?t.attachment:void 0,i=t.enrolledOs,o=i==="ios"||i==="macos"||i==="android"||i==="windows"||i==="linux"||i==="other"?i:void 0,r=Array.isArray(t.transports)?t.transports.filter((l)=>typeof l==="string"):void 0;return{type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:t.tag.slice(),userId:t.userId instanceof Uint8Array?t.userId.slice():void 0,nick:typeof t.nick==="string"?t.nick:void 0,enrolledAt:t.enrolledAt,lastUsedAt:typeof t.lastUsedAt==="number"&&Number.isFinite(t.lastUsedAt)?t.lastUsedAt:void 0,attachment:s,transports:r===void 0||r.length===0?void 0:r,aaguid:t.aaguid instanceof Uint8Array?t.aaguid.slice():void 0,enrolledOs:o}}function Fo(t){if(!Eo(t))return;if(!(t.salt instanceof Uint8Array)||!Array.isArray(t.entries))return;let e=[];for(let n of t.entries){let s=ac(n);if(s!==void 0)e.push(s)}if(e.length===0)return;return{salt:t.salt.slice(),entries:e}}function dc(t){return{type:"prf",credId:t.credId.slice(),userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs}}function Qo(t){if(t===void 0)return[];return t.entries.filter((e)=>e.credId.byteLength>0).map((e)=>e.credId.slice())}function uc(t,e){let n=t.entries.map(ze),s=n.findIndex((i)=>F(i.credId,e.credId));if(s>=0){let i=n[s];n[s]={...e,enrolledAt:i?.enrolledAt??e.enrolledAt,nick:e.nick??i?.nick}}else n.push(e);return{salt:t.salt.slice(),entries:n}}function pc(t,e){if(e.byteLength===0)return;let n=t.entries.findIndex((o)=>F(o.credId,e));if(n<0)return;let s=t.entries.map(ze),i=s[n];if(i===void 0)return;return s[n]={...i,lastUsedAt:Date.now()},{salt:t.salt.slice(),entries:s}}var mc=wn("fbfc3007154e4ecc8c0b6e020557d7bd"),hc=wn("ea9b8d664d011d213ce4b6b48cb575d4"),yc=wn("08987058cadc4b81b6e130de50dcbe96"),bc=wn("2fc0579f811347eab116bb5a8db9202a");function wn(t){let e=new Uint8Array(16);for(let n=0;n<16;n++)e[n]=Number.parseInt(t.slice(n*2,n*2+2),16);return e}function Zc(t){if(t===void 0||t.byteLength!==16)return;if(F(t,mc))return"Apple Passkey";if(F(t,hc))return"GPM";if(F(t,yc))return"Windows Hello";if(F(t,bc))return"YubiKey";return}function Xc(t){if(t.attachment==="cross-platform")return!0;if(t.transports===void 0)return!1;return t.transports.some((e)=>e==="usb"||e==="nfc"||e==="ble")}function vo(t){let e=Zc(t.aaguid);if(e!==void 0)return e;if(Xc(t))return"Security key";if(t.attachment==="platform"){if(t.enrolledOs==="ios"||t.enrolledOs==="macos")return"Apple Passkey";if(t.enrolledOs==="android")return"GPM";if(t.enrolledOs==="windows")return"Windows Hello";return"Passkey"}return"Passkey"}function Gc(t){if(t.byteLength===0)return"";let e=Math.min(4,t.byteLength),n="";for(let s=t.byteLength-e;s<t.byteLength;s++){let i=t[s];if(i===void 0)continue;n+=i.toString(16).padStart(2,"0")}return n}function fc(t){if(t.nick!==void 0&&t.nick!=="")return t.nick;let e=vo(t),n=Gc(t.credId);return n===""?e:`${e} ${n}`}var Vc="diplomatic.pin/";function Ic(t){return Vc+pt(t)}async function Do(t,e,n){let s=await e.deriveIdentity(Ic(n),0);return t.blake3(s.publicKey)}async function Pn(t,e){let n=await t.gen256BitSecureRandomSeed(),s=await Do(t,e,n);return{n,h:s}}async function Un(t,e,n){let s=await Do(t,e,n.n);return Sc(s,n.h)}function Oo(t){if(t===void 0||t===null||typeof t!=="object")return;let e=t;if(!(e.n instanceof Uint8Array)||!(e.h instanceof Uint8Array))return;if(e.n.byteLength<1||e.h.byteLength<1)return;return{n:e.n.slice(),h:e.h.slice()}}function Bn(t){return{n:t.n.slice(),h:t.h.slice()}}function Sc(t,e){if(t.byteLength!==e.byteLength)return!1;let n=0;for(let s=0;s<t.byteLength;s++)n|=t[s]^e[s];return n===0}var Jn="keyring",jo="prfMeta",ii="idPin",Ao="idPub";class zn{#t;db;#e;constructor(t,e){this.db=t,this.#e=e}async save(t,e){return await this.#n(t),this.#t=t,this.#t}async load(){return this.#t}async clearSession(){this.#t=void 0}async wipe(){this.#t=void 0;let t=this.db.transaction(dt,"readwrite"),e=t.objectStore(dt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.delete(Jn),e.delete(jo),e.delete(ii),e.delete(Ao)})}async loadKeyring(){let e=this.db.transaction(dt,"readonly").objectStore(dt);return new Promise((n,s)=>{let i=e.get(Jn);i.onsuccess=()=>{n(Fo(i.result))},i.onerror=()=>s(i.error)})}async persistKeyring(t){let e=this.db.transaction(dt,"readwrite"),n=e.objectStore(dt);return new Promise((s,i)=>{if(e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(jo),t===void 0){n.delete(Jn);return}n.put(kt(t),Jn)})}async hasKeyring(){let t=await this.loadKeyring();return t!==void 0&&t.entries.length>0}async openPrfStore(t){let e=await this.loadKeyring();return new Mn({rpId:t.rpId,rpName:t.rpName,userName:t.userName,keyring:e,persistKeyring:(n)=>this.persistKeyring(n)})}async#n(t){await this.#o(Ao);let e=await this.#i();if(e!==void 0){if(!await Un(this.#e,t,e))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)");return}let n=await Pn(this.#e,t);await this.#s(n)}#i(){let e=this.db.transaction(dt,"readonly").objectStore(dt);return new Promise((n,s)=>{let i=e.get(ii);i.onsuccess=()=>n(Oo(i.result)),i.onerror=()=>s(i.error)})}#s(t){let e=Bn(t),n=this.db.transaction(dt,"readwrite"),s=n.objectStore(dt);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error),s.put(e,ii)})}#o(t){let e=this.db.transaction(dt,"readwrite"),n=e.objectStore(dt);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}}class oi{db;constructor(t){this.db=t}async enq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(Zt,"readwrite"),i=s.objectStore(Zt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let c=pt(l);i.put({host:t,hash:c})}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(Zt,"readwrite"),i=s.objectStore(Zt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let c=pt(l);i.delete([t,c])}})}async list(t){let n=this.db.transaction(Zt,"readonly").objectStore(Zt);return new Promise((s,i)=>{let o=n.getAll();o.onsuccess=()=>{let l=o.result.filter((c)=>c.host===t).map((c)=>c.hash);s(l.map((c)=>Ke(c)))},o.onerror=()=>i(o.error)})}async count(){let e=this.db.transaction(Zt,"readonly").objectStore(Zt);return new Promise((n,s)=>{let i=e.count();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(Zt,"readwrite"),e=t.objectStore(Zt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var dt="seedMeta",ct="hosts",Zt="uploadQueue",bt="downloadQueue",A="messages",Ue="apld",qo=3,_o="diplomatic-store-db";class ri{seed;hosts;uploads;downloads;messages;db;constructor(t,e){this.db=t,this.seed=new zn(t,e),this.hosts=new Fs(t),this.uploads=new oi(t),this.downloads=new Es(t),this.messages=new Qs(t,e)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function Wc(){return new Promise((t,e)=>{let n=indexedDB.open(_o,qo);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!s.objectStoreNames.contains(dt))s.createObjectStore(dt);if(!s.objectStoreNames.contains(ct))s.createObjectStore(ct,{keyPath:"label"});if(!s.objectStoreNames.contains(Zt))s.createObjectStore(Zt,{keyPath:["host","hash"]});if(!s.objectStoreNames.contains(bt))s.createObjectStore(bt);let o;if(!s.objectStoreNames.contains(A))o=s.createObjectStore(A);else{if(!i)throw Error("missing upgrade transaction for messages store");o=i.objectStore(A)}if(!o.indexNames.contains(Ue))o.createIndex(Ue,"apld",{unique:!1})},n.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${_o} → v${qo}); waiting for other connections to close`)},n.onsuccess=()=>{let s=n.result;s.onversionchange=()=>{s.close()},t(s)},n.onerror=()=>e(n.error??Error("protocol store IndexedDB open failed"))})}async function li(t){let e=await Wc();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((n)=>{setTimeout(()=>n(!1),2000)})])}catch{}return new ri(e,t)}function $o(t){if(!t||typeof t!=="object")return!1;if(!("kind"in t))return!1;return typeof t.kind==="string"}function tr(t){if(typeof t!=="number")return;return t}function gc(t){if(!t||typeof t!=="object")return;if(!("phase"in t))return;let e=Kc(t.phase);if(e===void 0)return;let n={phase:e};if("host"in t&&typeof t.host==="string")n.host=t.host;if("done"in t&&typeof t.done==="number")n.done=t.done;if("total"in t&&typeof t.total==="number")n.total=t.total;if("bytesDone"in t&&typeof t.bytesDone==="number")n.bytesDone=t.bytesDone;if("bytesTotal"in t&&typeof t.bytesTotal==="number")n.bytesTotal=t.bytesTotal;return n}function Kc(t){if(t==="peek"||t==="pull"||t==="open"||t==="exec"||t==="push"||t==="import"||t==="idle"||t==="apply")return t==="apply"?"exec":t;return}function er(t){if(!t||typeof t!=="object")return;if(!("numUploads"in t)||!("numDownloads"in t))return;if(typeof t.numUploads!=="number"||typeof t.numDownloads!=="number")return;let e={phase:"idle"};if("progress"in t){let n=gc(t.progress);if(n===void 0)return;e=n}return{numUploads:t.numUploads,numDownloads:t.numDownloads,progress:e}}var Xt="[DIPLOMATIC]";class Ee{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:Qt};clientState;xferState;constructor(t,e,n,s,i){this.state=t,this.store=e,this.readyTimeoutMs=i,this.clientState=new ft(async()=>this.cachedClientState),this.xferState=new ft(async()=>this.cachedXferState),this.scheduledSync=new ke(s,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(o){console.error(`${Xt} worker sync after local write failed`,o)}}),this.local=new me(n,t,e,()=>{throw Error(`${Xt} local writer has no transport (use worker for network)`)},Ze,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),this.local.xferState.listen((o)=>{this.cachedXferState={numUploads:o.numUploads,numDownloads:o.numDownloads,progress:this.cachedXferState.progress},this.xferState.emit()})}bindWorker(t){let e=this.worker;if(e){e.onmessage=null,e.onerror=null,e.onmessageerror=null;try{e.terminate()}catch{}}this.worker=t,t.onmessage=(n)=>{this.onMessage(n.data)},t.onerror=(n)=>{console.error(`${Xt} worker error`,n),this.failPending(Error(`${Xt} worker failed to load`))},t.onmessageerror=()=>{this.failPending(Error(`${Xt} worker message error`))}}failPending(t){for(let[,e]of this.pending)e.reject(t);this.pending.clear()}async flushScheduledSync(){await this.scheduledSync.flush()}static async open(t,e,n={}){let s=n.clock??new Ut,i=n.syncDebounceMs??rn,o=n.readyTimeoutMs??15000,r=new Ee(t,e,s,i,o);return await r.hydrateStateFromStore(e),r}async hydrateStateFromStore(t){await this.loadSession(!1);let e=await t.uploads.count(),n=await t.downloads.count();this.cachedXferState={numUploads:e,numDownloads:n,progress:Qt}}async loadSession(t){let e=await this.store.seed.load(),n=await this.store.hosts.list();this.cachedClientState={hasSeed:e!==void 0,hasHost:Array.from(n).length>0,connected:t}}async pullRemoteXfer(){let t=await this.request({id:this.allocId(),op:"getXferState"}),e=er(t);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${Xt} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${Xt} worker ping failed`)}terminate(){this.scheduledSync.cancel();let t=this.worker;if(this.worker=void 0,t)try{t.terminate()}catch{}this.failPending(Error(`${Xt} worker terminated`))}onMessage(t){if(!$o(t))return;let e=t;switch(e.kind){case"ready":return;case"initError":{this.failPending(Error(`${Xt} worker init failed: ${e.message}`));return}case"clientState":{if(this.cachedClientState.connected===e.connected)return;this.cachedClientState={...this.cachedClientState,connected:e.connected},this.clientState.emit();return}case"xferState":{this.cachedXferState=e.state,this.xferState.emit();return}case"dirty":{P("worker dirty",{eids:e.eids.length}),this.state.refresh(e.eids.map(Rc));return}case"wiped":{this.state.clear();return}case"reply":{let n=this.pending.get(e.id);if(!n)return;if(this.pending.delete(e.id),e.ok)n.resolve(e.result);else n.reject(new Ne(e.status));return}default:return}}allocId(){let t=this.nextId;return this.nextId+=1,t}request(t,e){let n=this.requireWorker();return new Promise((s,i)=>{if(this.pending.set(t.id,{resolve:s,reject:i}),e&&e.length>0)n.postMessage(t,e);else n.postMessage(t)})}async requestStatus(t,e){try{let n=await this.request(t,e),s=tr(n);if(s!==void 0)return s;return 0}catch(n){if(n instanceof Ne)return n.status;return 12}}serializeHost(t){return{handle:t.handle.href,label:t.label,idx:t.idx??0}}async setSeed(t,e){await this.local.setSeed(t,e),await this.loadSession(!1),this.clientState.emit();let n=this.allocId(),s=this.readyTimeoutMs;await new Promise((i,o)=>{let r=void 0,l=(c)=>{if(r!==void 0)clearTimeout(r);c()};this.pending.set(n,{resolve:(c)=>l(()=>i(c)),reject:(c)=>l(()=>o(c))}),r=setTimeout(()=>{this.pending.delete(n),o(Error(`${Xt} setSeed worker timeout after ${s}ms`))},s);try{let c=t.spawnSyncWorker({id:n,persist:e?.persist});this.bindWorker(c)}catch(c){if(this.pending.delete(n),r!==void 0)clearTimeout(r);o(c instanceof Error?c:Error(String(c)))}});try{await this.pullRemoteXfer()}catch{}}async link(t,e=!0){await this.local.link(t,!1),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),await this.request({id:this.allocId(),op:"link",host:this.serializeHost(t),connect:e})}async unlink(t){if(await this.local.unlink(t),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),!this.worker)return;await this.request({id:this.allocId(),op:"unlink",label:t})}async hosts(){return this.local.hosts()}async connect(t=!0,e=!0){if(!this.worker)return;await this.request({id:this.allocId(),op:"connect",listen:t,sync:e})}async disconnect(){if(!this.worker)return;await this.request({id:this.allocId(),op:"disconnect"})}async insertRaw(t,e){return this.local.insertRaw(t,e)}async updateRaw(t,e,n,s){return this.local.updateRaw(t,e,n,s)}async insert(t){return this.local.insert(t)}async update(t){return this.local.update(t)}async delete(t){return this.local.delete(t)}async genEID(t){return this.local.genEID(t)}async sync(){if(!this.worker)return 0;return this.requestStatus({id:this.allocId(),op:"sync"})}async rebuild(t){return this.scheduledSync.cancel(),await this.scheduledSync.flush(),this.requestStatus({id:this.allocId(),op:"rebuild",checkHost:t?.checkHost})}async listMsgs(t){return this.local.listMsgs(t)}async countMsgs(t){return this.local.countMsgs(t)}async reconcile(t,e){try{let n=await this.request({id:this.allocId(),op:"reconcile",hostLabel:t,pull:e?.pull,push:e?.push,sync:e?.sync});if(!xc(n))return a(12);return m(n)}catch(n){if(n instanceof Ne&&n.status!==0)return a(n.status);return a(12)}}async msgcheck(){let t=await this.request({id:this.allocId(),op:"msgcheck"});if(!(t instanceof Uint8Array))throw Error(`${Xt} msgcheck: expected Uint8Array`);return t}async entcheck(){let t=await this.request({id:this.allocId(),op:"entcheck"});if(!(t instanceof Uint8Array))throw Error(`${Xt} entcheck: expected Uint8Array`);return t}async wipe(t){if(await this.local.wipe(t),this.worker)await this.request({id:this.allocId(),op:"wipe",msgs:t?.msgs,ents:t?.ents,meta:t?.meta,seed:t?.seed});await this.hydrateStateFromStore(this.store),this.clientState.emit(),this.xferState.emit()}async import(t){let e=new Uint8Array(await t.arrayBuffer());return this.requestStatus({id:this.allocId(),op:"import",bytes:e},[e.buffer])}async export(t,e){try{let n=await this.request({id:this.allocId(),op:"export"});if(!(n instanceof Uint8Array))return 12;let s=new Blob([n.slice()]);return an(s,t),0}catch(n){if(n instanceof Ne)return n.status;return 12}}}class Ne extends Error{status;constructor(t){super(`WorkerReplyError: ${g[t]}`);this.status=t;this.name="WorkerReplyError"}}function xc(t){if(!t||typeof t!=="object")return!1;let e=t;return e.msgcheck instanceof Uint8Array&&e.msgcheck.length===32&&typeof e.numBags==="number"&&typeof e.numDupes==="number"}function Rc(t){return t}var Ie="[DIPLOMATIC]";async function Nn(t){if(t.verbose!==void 0)ln(t.verbose);let e=t.clock??new Ut;if(t.worker===!0&&Hc(t)!==void 0)throw Error(`${Ie} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(t.worker!==!0){console.info(`${Ie} sync on main thread `+"(no worker — app did not request a worker)");let i=await nr(t.store);return Cc(e,t.state,i)}if(typeof Worker>"u")throw Error(`${Ie} worker: true but Worker API is unavailable`);let n=await nr(void 0),s=await Ee.open(t.state,n,{readyTimeoutMs:t.readyTimeoutMs,clock:e,syncDebounceMs:t.syncDebounceMs});return console.info(`${Ie} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:s,mode:"worker",dispose:()=>{console.info(`${Ie} terminating sync worker`),s.terminate()}}}function Hc(t){if("store"in t)return t.store;return}async function Cc(t,e,n){let s=new me(t,e,n,is,Ze);return{client:s,mode:"main",dispose:()=>{s.disconnect()}}}async function nr(t){if(t!==void 0)return t;if(typeof indexedDB>"u")throw Error(`${Ie} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return li(Ze)}function Tc(t){let[e,n]=ci();return En(()=>{async function s(){let o=await t.clientState.get();n(o)}let i=t.clientState.listen(s);return s(),()=>{i()}},[t]),e}function Yc(t){let[e,n]=ci();return En(()=>{async function s(){let o=await t.xferState.get();n(o)}let i=t.xferState.listen(s);return s(),()=>{i()}},[t]),e}function kc(t){En(()=>{async function e(){try{if(!(await t.clientState.get()).hasSeed)return;await t.connect(),await t.sync()}catch(o){console.error("reconnectAndSync failed",o)}}function n(){e()}function s(){if(typeof document<"u"&&document.visibilityState==="visible")e()}function i(){e()}if(globalThis.addEventListener("online",n),typeof document<"u")document.addEventListener("visibilitychange",s);return globalThis.addEventListener("focus",i),globalThis.addEventListener("pageshow",i),()=>{if(globalThis.removeEventListener("online",n),typeof document<"u")document.removeEventListener("visibilitychange",s);globalThis.removeEventListener("focus",i),globalThis.removeEventListener("pageshow",i)}},[t])}function Lc(t={}){let e=t.clock??new Ut,{seed:n,host:s,readyTimeoutMs:i,optimistic:o,verbose:r}=t,l=t.worker===!0,c="store"in t?t.store:void 0,[d,u]=ci({stateMgr:cs});return En(()=>{let p=!1,h;return(async()=>{let y=await zs({optimistic:o,verbose:r});if(p)return;let b=sn(y),Z=l?await Nn({state:b,clock:e,worker:!0,readyTimeoutMs:i,verbose:r}):await Nn({state:b,clock:e,store:c,readyTimeoutMs:i,verbose:r});if(p){Z.dispose();return}h=Z.dispose;let{client:X,mode:I}=Z;if(n)await X.setSeed(n);if(s)await X.link(s);if(p){h();return}u({client:X,entDB:y,stateMgr:b,mode:I,error:void 0})})().catch((y)=>{let b=y instanceof Error?y:Error(String(y));if(console.error("[DIPLOMATIC] useClient init failed",b),!p)u((Z)=>({...Z,client:void 0,error:b}))}),()=>{p=!0,h?.()}},[e,n,s,l,c,i,o,r]),d}import{use as Mc,useEffect as sr,useRef as wc,useState as Pc}from"react";function ir(t,e,n){let[s,i]=Pc();return sr(()=>{async function o(){let r=performance.now();P(`watcher ${e} start`);let l=await n();P(`watcher ${e} setVal`,{ms:Math.round(performance.now()-r)}),i(l)}return o(),t.on(e,o),()=>{t.off(e,o)}},[t,e,n]),s}function Uc(t,e,n){let s=wc(n());return sr(()=>{async function i(){s.current=n()}return t.on(e,i),()=>{t.off(e,i)}},[t,e,n]),Mc(s.current)}function or(t,e){return`${t}:${e}`}class ai{queue=new Map;async enq(t){for(let e of t){let n=or(e.host,e.seq);this.queue.set(n,e)}}async deq(t,e){for(let n of e){let s=or(t,n);this.queue.delete(s)}}async list(){let t=[];for(let e of this.queue.values())t.push(e);return t}async count(){return this.queue.size}async wipe(){this.queue.clear()}}function Bc(t,e){if(e.setLastSeq!==void 0)t.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0&&e.lastSeq>t.lastSeq)t.lastSeq=e.lastSeq}class di{hosts=new Map;async add(t){let e=this.hosts.get(t.label),n=e!==void 0&&e.handle===t.handle&&(e.idx??0)===(t.idx??0),s={...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0};this.hosts.set(t.label,s)}async touch(t,e){await this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.hosts.get(t);if(!n)return;Bc(n,e),this.hosts.set(t,{...n})}async get(t){return this.hosts.get(t)}async set(t,e){let n=this.hosts.get(t);if(!n)return 13;return this.hosts.set(t,{...n,...e}),0}async del(t){this.hosts.delete(t)}async list(){return this.hosts.values()}async wipe(){this.hosts.clear()}}class ui{crypto;messages=new Map;constructor(t){this.crypto=t}async add(t){let e=[];for(let{key:n,data:s}of t)this.messages.set(T(n),s),e.push(0);return e}async del(t){for(let e of t)this.messages.delete(T(e))}async get(t){let e=this.messages.get(T(t));if(e)return await zt(t,e,this.crypto);return}async has(t){return this.messages.has(T(t))}async list(t){let e=t?.apld,n=t?.body!==!1,s=[];for(let[i,o]of this.messages){if(e!==void 0&&pe(o.apld)!==e)continue;let r=ot(i);s.push(await zt(r,o,this.crypto,{body:n}))}return s}async count(t){if(t===void 0)return this.messages.size;let e=0;for(let n of this.messages.values())if(pe(n.apld)===t)e++;return e}async listKeys(){let t=[];for(let e of this.messages.keys())t.push(ot(e));return t}async last(t){let e;for(let[n,s]of this.messages){if(F(t,s.eid)===!1)continue;let i=ot(n);if(e===void 0)e={hash:i,data:s};else if((s.ctr??0)>(e.data.ctr??0)||(s.ctr??0)===(e.data.ctr??0)&&(s.off??0)>(e.data.off??0))e={hash:i,data:s}}if(e)return await zt(e.hash,e.data,this.crypto);return}async markApplied(t){for(let e of t){let n=this.messages.get(T(e));if(!n)continue;vt(n,Jt)}}async markFailed(t){for(let{key:e,err:n}of t){let s=this.messages.get(T(e));if(!s)continue;vt(s,It,n)}}async wipe(){this.messages.clear()}}class pi{#t;#e;#n;constructor(t){this.#e=t}async save(t,e){if(this.#n!==void 0){if(!await Un(this.#e,t,this.#n))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)")}else this.#n=await Pn(this.#e,t);return this.#t=t,this.#t}async load(){return this.#t}async wipe(){this.#t=void 0,this.#n=void 0}peekPin(){return this.#n===void 0?void 0:Bn(this.#n)}}class mi{queue=new Map;async enq(t,e){let n=this.queue.get(t)||new Set;this.queue.set(t,n);for(let s of e)n.add(pt(s))}async deq(t,e){let n=this.queue.get(t);if(n)for(let s of e)n.delete(pt(s))}async list(t){let e=this.queue.get(t);if(!e)return[];let n=[];for(let s of e)n.push(Ke(s));return n}async count(){let t=0;for(let e of this.queue.values())t+=e.size;return t}async wipe(){this.queue.clear()}}class rr{seed;hosts=new di;uploads=new mi;downloads=new ai;messages;constructor(t){this.seed=new pi(t),this.messages=new ui(t)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}class lr{singletonType;latest;latestOff=-1;emitter=new Lt;constructor(t){this.singletonType=t}async apply(t){for(let e of t){let n=new U(e.eid),[s,i]=n.readStruct(nt);if(i!==0)continue;let o=new N;o.writeVarString(this.singletonType);let r=o.result();if(s.id.length===r.length&&s.id.every((l,c)=>l===r[c])){if(this.latest===void 0||e.off>this.latestOff)this.latestOff=e.off,this.latest=e.bod,this.emitter.emit(this.singletonType,null)}}return t.map(()=>0)}clear=async()=>(this.latest=void 0,this.latestOff=-1,this.emitter.emit(this.singletonType,null),0);notify=(t)=>{for(let e of t)if(e===this.singletonType)this.emitter.emit(this.singletonType,null)};refresh=async(t)=>{this.notify([this.singletonType])};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}class cr{#t;#e;#n;#i;constructor(t){if(this.#n=t.rpId,this.#i=t.rpName,t.credId!==void 0)this.#e=t.credId.slice()}get credId(){if(this.#e===void 0)return;return this.#e.slice()}setCredId(t){this.#e=t===void 0?void 0:t.slice()}async save(t,e){if(e?.persist!==!0)return this.#t=t,this.#t;let[n,s]=await t.persistToLargeBlob([],{rpId:this.#n,rpName:this.#i,credId:this.#e});if(s!==0||n===void 0)return Promise.reject(Error(`persistToLargeBlob status ${s}`));return this.#e=n,this.#t=t,this.#t}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0)return a(22);let[e,n]=await at.fromLargeBlob({rpId:this.#n,rpName:this.#i,credId:t});if(n!==0||e===void 0)return a(n);return this.#t=e.enclave,m(e.enclave)}async wipe(){let t=this.#e;if(t!==void 0){let e=await at.clearLargeBlob(t,{rpId:this.#n});if(e!==0)return Promise.reject(Error(`clearLargeBlob status ${e}`))}this.#t=void 0,this.#e=void 0}}export{Jt as APLD_APPLIED,It as APLD_ERROR,Kt as APLD_PENDING,Ns as CachedEntDB,Ut as Clock,Cn as DEFAULT_PRF_SALT,U as Decoder,at as Enclave,N as Encoder,Gn as EntDBMemory,Bs as EntIDB,ss as HTTPTransport,zn as IDBSeedStore,ri as IDBStore,No as KEYRING_MAX,Gt as MASTER_SEED_LEN,rr as MemoryStore,cr as PasskeySeedStore,Mn as PrfSeedStore,ls as SEALED_MASTER_KEY_LEN,lr as SingletonStateManager,He as StateManager,g as Status,me as SyncClient,Lt as TypedEventEmitter,Ee as WorkerClient,pe as apldFromStored,Vn as asDHKEReq,Ds as asDHKEResp,Bt as asSealedMasterKey,ot as b64tob,An as b64urltob,T as btob64,wr as btob64url,pt as btoh,Re as checksumEntRevs,le as checksumSet,Mi as cmpBytes,Ze as crypto,ue as defaultPeekProgressEvery,Ho as defaultWebAuthnRpId,nt as eidCodec,wi as encodeEntRev,sn as entStateManager,Mr as genSingletonEID,is as hostHTTPTransport,Ke as htob,Qt as idleProgress,Or as isApldState,O as isLiveEnt,jr as isPendingApply,ms as isTerminalApplyFailure,Er as isTombstone,Qo as keyringCredIds,vo as keyringKind,fc as keyringLabel,Dl as largeBlobCapable,Ui as normalizeTags,vr as nullEntDB,cs as nullStateManager,Nn as openDiplomaticClient,zs as openEntDB,li as openIDBStore,Ol as prfCapable,Ye as revFromEntity,us as revFromHead,vt as setApld,cn as shouldEmitItemProgress,Lc as useClient,Tc as useClientState,Yc as useClientXferState,ir as useStateWatcher,Uc as useStateWatcherSuspense,kc as useSyncOnResume,Fl as webAuthnLastError};