UNPKG

sql.js

Version:

SQLite library with support for opening and writing databases, prepared statements, and more. This SQLite library is in pure javascript (compiled with emscripten).

97 lines (85 loc) 1.35 MB
// We are modularizing this manually because the current modularize setting in Emscripten has some issues: // https://github.com/kripken/emscripten/issues/5820 // In addition, When you use emcc's modularization, it still expects to export a global object called `Module`, // which is able to be used/called before the WASM is loaded. // The modularization below exports a promise that loads and resolves to the actual sql.js module. // That way, this module can't be used before the WASM is finished loading. // We are going to define a function that a user will call to start loading initializing our Sql.js library // However, that function might be called multiple times, and on subsequent calls, we don't actually want it to instantiate a new instance of the Module // Instead, we want to return the previously loaded module // TODO: Make this not declare a global if used in the browser var initSqlJsPromise = undefined; var initSqlJs = function (moduleConfig) { if (initSqlJsPromise){ return initSqlJsPromise; } // If we're here, we've never called this function before initSqlJsPromise = new Promise(function (resolveModule, reject) { // We are modularizing this manually because the current modularize setting in Emscripten has some issues: // https://github.com/kripken/emscripten/issues/5820 // The way to affect the loading of emcc compiled modules is to create a variable called `Module` and add // properties to it, like `preRun`, `postRun`, etc // We are using that to get notified when the WASM has finished loading. // Only then will we return our promise // If they passed in a moduleConfig object, use that // Otherwise, initialize Module to the empty object var Module = typeof moduleConfig !== 'undefined' ? moduleConfig : {}; // EMCC only allows for a single onAbort function (not an array of functions) // So if the user defined their own onAbort function, we remember it and call it var originalOnAbortFunction = Module['onAbort']; Module['onAbort'] = function (errorThatCausedAbort) { reject(new Error(errorThatCausedAbort)); if (originalOnAbortFunction){ originalOnAbortFunction(errorThatCausedAbort); } }; Module['postRun'] = Module['postRun'] || []; Module['postRun'].push(function () { // When Emscripted calls postRun, this promise resolves with the built Module resolveModule(Module); }); // There is a section of code in the emcc-generated code below that looks like this: // (Note that this is lowercase `module`) // if (typeof module !== 'undefined') { // module['exports'] = Module; // } // When that runs, it's going to overwrite our own modularization export efforts in shell-post.js! // The only way to tell emcc not to emit it is to pass the MODULARIZE=1 or MODULARIZE_INSTANCE=1 flags, // but that carries with it additional unnecessary baggage/bugs we don't want either. // So, we have three options: // 1) We undefine `module` // 2) We remember what `module['exports']` was at the beginning of this function and we restore it later // 3) We write a script to remove those lines of code as part of the Make process. // // Since those are the only lines of code that care about module, we will undefine it. It's the most straightforward // of the options, and has the side effect of reducing emcc's efforts to modify the module if its output were to change in the future. // That's a nice side effect since we're handling the modularization efforts ourselves module = undefined; // The emcc-generated code and shell-post.js code goes below, // meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort var f;f||=typeof Module != 'undefined' ? Module : {};var aa="object"==typeof window,ba="function"==typeof importScripts,ca="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node;"use strict"; f.onRuntimeInitialized=function(){function a(g,k){switch(typeof k){case "boolean":fc(g,k?1:0);break;case "number":gc(g,k);break;case "string":hc(g,k,-1,-1);break;case "object":if(null===k)ib(g);else if(null!=k.length){var n=da(k,ea);ic(g,n,k.length,-1);fa(n)}else xa(g,"Wrong API use : tried to return a value of an unknown type ("+k+").",-1);break;default:ib(g)}}function b(g,k){for(var n=[],r=0;r<g;r+=1){var w=m(k+4*r,"i32"),A=jc(w);if(1===A||2===A)w=kc(w);else if(3===A)w=lc(w);else if(4===A){A=w; w=mc(A);A=nc(A);for(var N=new Uint8Array(w),M=0;M<w;M+=1)N[M]=p[A+M];w=N}else w=null;n.push(w)}return n}function c(g,k){this.Ka=g;this.db=k;this.Ia=1;this.eb=[]}function d(g,k){this.db=k;k=ha(g)+1;this.Xa=ia(k);if(null===this.Xa)throw Error("Unable to allocate memory for the SQL string");q(g,t,this.Xa,k);this.cb=this.Xa;this.Ta=this.hb=null}function e(g){this.filename="dbfile_"+(4294967295*Math.random()>>>0);if(null!=g){var k=this.filename,n="/",r=k;n&&(n="string"==typeof n?n:ja(n),r=k?x(n+"/"+k): n);k=ka(!0,!0);r=la(r,(void 0!==k?k:438)&4095|32768,0);if(g){if("string"==typeof g){n=Array(g.length);for(var w=0,A=g.length;w<A;++w)n[w]=g.charCodeAt(w);g=n}ma(r,k|146);n=na(r,577);oa(n,g,0,g.length,0);pa(n);ma(r,k)}}this.handleError(u(this.filename,h));this.db=m(h,"i32");lb(this.db);this.Ya={};this.Ma={}}var h=y(4),l=f.cwrap,u=l("sqlite3_open","number",["string","number"]),z=l("sqlite3_close_v2","number",["number"]),v=l("sqlite3_exec","number",["number","string","number","number","number"]),E=l("sqlite3_changes", "number",["number"]),H=l("sqlite3_prepare_v2","number",["number","string","number","number","number"]),mb=l("sqlite3_sql","string",["number"]),oc=l("sqlite3_normalized_sql","string",["number"]),nb=l("sqlite3_prepare_v2","number",["number","number","number","number","number"]),pc=l("sqlite3_bind_text","number",["number","number","number","number","number"]),ob=l("sqlite3_bind_blob","number",["number","number","number","number","number"]),qc=l("sqlite3_bind_double","number",["number","number","number"]), rc=l("sqlite3_bind_int","number",["number","number","number"]),sc=l("sqlite3_bind_parameter_index","number",["number","string"]),tc=l("sqlite3_step","number",["number"]),uc=l("sqlite3_errmsg","string",["number"]),vc=l("sqlite3_column_count","number",["number"]),wc=l("sqlite3_data_count","number",["number"]),xc=l("sqlite3_column_double","number",["number","number"]),pb=l("sqlite3_column_text","string",["number","number"]),yc=l("sqlite3_column_blob","number",["number","number"]),zc=l("sqlite3_column_bytes", "number",["number","number"]),Ac=l("sqlite3_column_type","number",["number","number"]),Bc=l("sqlite3_column_name","string",["number","number"]),Cc=l("sqlite3_reset","number",["number"]),Dc=l("sqlite3_clear_bindings","number",["number"]),Ec=l("sqlite3_finalize","number",["number"]),qb=l("sqlite3_create_function_v2","number","number string number number number number number number number".split(" ")),jc=l("sqlite3_value_type","number",["number"]),mc=l("sqlite3_value_bytes","number",["number"]),lc=l("sqlite3_value_text", "string",["number"]),nc=l("sqlite3_value_blob","number",["number"]),kc=l("sqlite3_value_double","number",["number"]),gc=l("sqlite3_result_double","",["number","number"]),ib=l("sqlite3_result_null","",["number"]),hc=l("sqlite3_result_text","",["number","string","number","number"]),ic=l("sqlite3_result_blob","",["number","number","number","number"]),fc=l("sqlite3_result_int","",["number","number"]),xa=l("sqlite3_result_error","",["number","string","number"]),rb=l("sqlite3_aggregate_context","number", ["number","number"]),lb=l("RegisterExtensionFunctions","number",["number"]);c.prototype.bind=function(g){if(!this.Ka)throw"Statement closed";this.reset();return Array.isArray(g)?this.vb(g):null!=g&&"object"===typeof g?this.wb(g):!0};c.prototype.step=function(){if(!this.Ka)throw"Statement closed";this.Ia=1;var g=tc(this.Ka);switch(g){case 100:return!0;case 101:return!1;default:throw this.db.handleError(g);}};c.prototype.qb=function(g){null==g&&(g=this.Ia,this.Ia+=1);return xc(this.Ka,g)};c.prototype.zb= function(g){null==g&&(g=this.Ia,this.Ia+=1);g=pb(this.Ka,g);if("function"!==typeof BigInt)throw Error("BigInt is not supported");return BigInt(g)};c.prototype.Ab=function(g){null==g&&(g=this.Ia,this.Ia+=1);return pb(this.Ka,g)};c.prototype.getBlob=function(g){null==g&&(g=this.Ia,this.Ia+=1);var k=zc(this.Ka,g);g=yc(this.Ka,g);for(var n=new Uint8Array(k),r=0;r<k;r+=1)n[r]=p[g+r];return n};c.prototype.get=function(g,k){k=k||{};null!=g&&this.bind(g)&&this.step();g=[];for(var n=wc(this.Ka),r=0;r<n;r+= 1)switch(Ac(this.Ka,r)){case 1:var w=k.useBigInt?this.zb(r):this.qb(r);g.push(w);break;case 2:g.push(this.qb(r));break;case 3:g.push(this.Ab(r));break;case 4:g.push(this.getBlob(r));break;default:g.push(null)}return g};c.prototype.getColumnNames=function(){for(var g=[],k=vc(this.Ka),n=0;n<k;n+=1)g.push(Bc(this.Ka,n));return g};c.prototype.getAsObject=function(g,k){g=this.get(g,k);k=this.getColumnNames();for(var n={},r=0;r<k.length;r+=1)n[k[r]]=g[r];return n};c.prototype.getSQL=function(){return mb(this.Ka)}; c.prototype.getNormalizedSQL=function(){return oc(this.Ka)};c.prototype.run=function(g){null!=g&&this.bind(g);this.step();return this.reset()};c.prototype.mb=function(g,k){null==k&&(k=this.Ia,this.Ia+=1);g=qa(g);var n=da(g,ea);this.eb.push(n);this.db.handleError(pc(this.Ka,k,n,g.length-1,0))};c.prototype.ub=function(g,k){null==k&&(k=this.Ia,this.Ia+=1);var n=da(g,ea);this.eb.push(n);this.db.handleError(ob(this.Ka,k,n,g.length,0))};c.prototype.lb=function(g,k){null==k&&(k=this.Ia,this.Ia+=1);this.db.handleError((g=== (g|0)?rc:qc)(this.Ka,k,g))};c.prototype.xb=function(g){null==g&&(g=this.Ia,this.Ia+=1);ob(this.Ka,g,0,0,0)};c.prototype.nb=function(g,k){null==k&&(k=this.Ia,this.Ia+=1);switch(typeof g){case "string":this.mb(g,k);return;case "number":this.lb(g,k);return;case "bigint":this.mb(g.toString(),k);return;case "boolean":this.lb(g+0,k);return;case "object":if(null===g){this.xb(k);return}if(null!=g.length){this.ub(g,k);return}}throw"Wrong API use : tried to bind a value of an unknown type ("+g+").";};c.prototype.wb= function(g){var k=this;Object.keys(g).forEach(function(n){var r=sc(k.Ka,n);0!==r&&k.nb(g[n],r)});return!0};c.prototype.vb=function(g){for(var k=0;k<g.length;k+=1)this.nb(g[k],k+1);return!0};c.prototype.reset=function(){this.freemem();return 0===Dc(this.Ka)&&0===Cc(this.Ka)};c.prototype.freemem=function(){for(var g;void 0!==(g=this.eb.pop());)fa(g)};c.prototype.free=function(){this.freemem();var g=0===Ec(this.Ka);delete this.db.Ya[this.Ka];this.Ka=0;return g};d.prototype.next=function(){if(null=== this.Xa)return{done:!0};null!==this.Ta&&(this.Ta.free(),this.Ta=null);if(!this.db.db)throw this.fb(),Error("Database closed");var g=ra(),k=y(4);sa(h);sa(k);try{this.db.handleError(nb(this.db.db,this.cb,-1,h,k));this.cb=m(k,"i32");var n=m(h,"i32");if(0===n)return this.fb(),{done:!0};this.Ta=new c(n,this.db);this.db.Ya[n]=this.Ta;return{value:this.Ta,done:!1}}catch(r){throw this.hb=ta(this.cb),this.fb(),r;}finally{ua(g)}};d.prototype.fb=function(){fa(this.Xa);this.Xa=null};d.prototype.getRemainingSQL= function(){return null!==this.hb?this.hb:ta(this.cb)};"function"===typeof Symbol&&"symbol"===typeof Symbol.iterator&&(d.prototype[Symbol.iterator]=function(){return this});e.prototype.run=function(g,k){if(!this.db)throw"Database closed";if(k){g=this.prepare(g,k);try{g.step()}finally{g.free()}}else this.handleError(v(this.db,g,0,0,h));return this};e.prototype.exec=function(g,k,n){if(!this.db)throw"Database closed";var r=ra(),w=null;try{var A=va(g),N=y(4);for(g=[];0!==m(A,"i8");){sa(h);sa(N);this.handleError(nb(this.db, A,-1,h,N));var M=m(h,"i32");A=m(N,"i32");if(0!==M){var K=null;w=new c(M,this);for(null!=k&&w.bind(k);w.step();)null===K&&(K={columns:w.getColumnNames(),values:[]},g.push(K)),K.values.push(w.get(null,n));w.free()}}return g}catch(O){throw w&&w.free(),O;}finally{ua(r)}};e.prototype.each=function(g,k,n,r,w){"function"===typeof k&&(r=n,n=k,k=void 0);g=this.prepare(g,k);try{for(;g.step();)n(g.getAsObject(null,w))}finally{g.free()}if("function"===typeof r)return r()};e.prototype.prepare=function(g,k){sa(h); this.handleError(H(this.db,g,-1,h,0));g=m(h,"i32");if(0===g)throw"Nothing to prepare";var n=new c(g,this);null!=k&&n.bind(k);return this.Ya[g]=n};e.prototype.iterateStatements=function(g){return new d(g,this)};e.prototype["export"]=function(){Object.values(this.Ya).forEach(function(k){k.free()});Object.values(this.Ma).forEach(wa);this.Ma={};this.handleError(z(this.db));var g=ya(this.filename);this.handleError(u(this.filename,h));this.db=m(h,"i32");lb(this.db);return g};e.prototype.close=function(){null!== this.db&&(Object.values(this.Ya).forEach(function(g){g.free()}),Object.values(this.Ma).forEach(wa),this.Ma={},this.handleError(z(this.db)),za("/"+this.filename),this.db=null)};e.prototype.handleError=function(g){if(0===g)return null;g=uc(this.db);throw Error(g);};e.prototype.getRowsModified=function(){return E(this.db)};e.prototype.create_function=function(g,k){Object.prototype.hasOwnProperty.call(this.Ma,g)&&(wa(this.Ma[g]),delete this.Ma[g]);var n=Aa(function(r,w,A){w=b(w,A);try{var N=k.apply(null, w)}catch(M){xa(r,M,-1);return}a(r,N)},"viii");this.Ma[g]=n;this.handleError(qb(this.db,g,k.length,1,0,n,0,0,0));return this};e.prototype.create_aggregate=function(g,k){var n=k.init||function(){return null},r=k.finalize||function(K){return K},w=k.step;if(!w)throw"An aggregate function must have a step function in "+g;var A={};Object.hasOwnProperty.call(this.Ma,g)&&(wa(this.Ma[g]),delete this.Ma[g]);k=g+"__finalize";Object.hasOwnProperty.call(this.Ma,k)&&(wa(this.Ma[k]),delete this.Ma[k]);var N=Aa(function(K, O,Ra){var Y=rb(K,1);Object.hasOwnProperty.call(A,Y)||(A[Y]=n());O=b(O,Ra);O=[A[Y]].concat(O);try{A[Y]=w.apply(null,O)}catch(Gc){delete A[Y],xa(K,Gc,-1)}},"viii"),M=Aa(function(K){var O=rb(K,1);try{var Ra=r(A[O])}catch(Y){delete A[O];xa(K,Y,-1);return}a(K,Ra);delete A[O]},"vi");this.Ma[g]=N;this.Ma[k]=M;this.handleError(qb(this.db,g,w.length-1,1,0,0,N,M,0));return this};f.Database=e};var Ba=Object.assign({},f),Ca="./this.program",B="",Da,Ea; if(ca){var fs=require("fs"),Fa=require("path");B=__dirname+"/";Ea=a=>{a=Ga(a)?new URL(a):Fa.normalize(a);return fs.readFileSync(a)};Da=a=>{a=Ga(a)?new URL(a):Fa.normalize(a);return new Promise((b,c)=>{fs.readFile(a,void 0,(d,e)=>{d?c(d):b(e.buffer)})})};!f.thisProgram&&1<process.argv.length&&(Ca=process.argv[1].replace(/\\/g,"/"));process.argv.slice(2);"undefined"!=typeof module&&(module.exports=f)}else if(aa||ba)ba?B=self.location.href:"undefined"!=typeof document&&document.currentScript&&(B=document.currentScript.src), B=B.startsWith("blob:")?"":B.substr(0,B.replace(/[?#].*/,"").lastIndexOf("/")+1),ba&&(Ea=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),Da=a=>Ga(a)?new Promise((b,c)=>{var d=new XMLHttpRequest;d.open("GET",a,!0);d.responseType="arraybuffer";d.onload=()=>{(200==d.status||0==d.status&&d.response)&&c(d.response);b(d.status)};d.onerror=b;d.send(null)}):fetch(a,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(Error(b.status+ " : "+b.url)));var Ha=f.print||console.log.bind(console),C=f.printErr||console.error.bind(console);Object.assign(f,Ba);Ba=null;f.thisProgram&&(Ca=f.thisProgram);var Ia;f.wasmBinary&&(Ia=f.wasmBinary);function Ja(a){this.exports=( // EMSCRIPTEN_START_ASM function instantiate(Ra){function e(f){f.grow=function(b){var a=this.length;this.length=this.length+b;return a};f.set=function(c,d){this[c]=d};f.get=function(c){return this[c]};return f}var g;var h=new Uint8Array(123);for(var c=25;c>=0;--c){h[48+c]=52+c;h[65+c]=c;h[97+c]=26+c}h[43]=62;h[47]=63;function n(o,p,q){var i,j,c=0,k=p,l=q.length,m=p+(l*3>>2)-(q[l-2]=="=")-(q[l-1]=="=");for(;c<l;c+=4){i=h[q.charCodeAt(c+1)];j=h[q.charCodeAt(c+2)];o[k++]=h[q.charCodeAt(c)]<<2|i>>4;if(k<m)o[k++]=i<<4|j>>2;if(k<m)o[k++]=j<<6|h[q.charCodeAt(c+3)]}}function r(s){n(g,1024,"My40NS4yAHt9ACVzLiV6AGluZmluaXR5AGFmZmluaXR5AFJlYWxBZmZpbml0eQBidXN5AHRlbXBfc3RvcmVfZGlyZWN0b3J5AG5vdCBhIHdyaXRhYmxlIGRpcmVjdG9yeQBvcGVuRGlyZWN0b3J5AHNocmlua19tZW1vcnkAb3V0IG9mIG1lbW9yeQBmYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgb2YgbWVtb3J5AEhBVklORyBjbGF1c2Ugb24gYSBub24tYWdncmVnYXRlIHF1ZXJ5AEludENvcHkAU0NvcHkAVkRlc3Ryb3kATXVsdGlwbHkAcXVlcnlfb25seQB1bmxpa2VseQB0YWJsZSAiJXMiIGhhcyBtb3JlIHRoYW4gb25lIHByaW1hcnkga2V5AGZvcmVpZ24ga2V5AGpzb25fZ3JvdXBfYXJyYXkAanNvbmJfZ3JvdXBfYXJyYXkAanNvbl9hcnJheQBqc29uYl9hcnJheQBqdWxpYW5kYXkAZnRzNGF1eAB1bml4AHNxbGl0ZV9yZW5hbWVfcXVvdGVmaXgAcHJlZml4AExJS0Ugb3IgR0xPQiBwYXR0ZXJuIHRvbyBjb21wbGV4AHVuaGV4AGNoYXJpbmRleABPcGVuQXV0b2luZGV4AGF1dG9tYXRpY19pbmRleABhdXRvLWluZGV4AG9ycGhhbiBpbmRleABEcm9wSW5kZXgAaWR4AFJlb3BlbklkeABwY3gAbWF4AE1lbU1heAAlMDJ4ADB4ACBGUk9NICclcScuJyVxJXMnIEFTIHgAQ1JFQVRFIFRBQkxFIHgAcncAcHNvdwBpbXBsaWVzX25vbm51bGxfcm93AG5vdwBpbnRlZ2VyIG92ZXJmbG93AHBhcnNlciBzdGFjayBvdmVyZmxvdwB3aW5kb3cAc2hhZG93AFJlc3VsdFJvdwBJZk51bGxSb3cAbmV3AG5vIHN1Y2ggdmlldwBjYW5ub3QgbW9kaWZ5ICVzIGJlY2F1c2UgaXQgaXMgYSB2aWV3AENhbm5vdCBhZGQgYSBjb2x1bW4gdG8gYSB2aWV3AGNhbm5vdCBVUFNFUlQgYSB2aWV3AFByZXYAc3RkZXYAICVsbHUAJWMldQBGYWlsZWQgdG8gcmVhZCBwdHJtYXAga2V5PSV1ACUuKno6JXUAT2Zmc2V0ICV1IG91dCBvZiByYW5nZSAldS4uJXUAaW52YWxpZCBwYWdlIG51bWJlciAldQBmYWlsZWQgdG8gZ2V0IHBhZ2UgJXUAMm5kIHJlZmVyZW5jZSB0byBwYWdlICV1AEZyYWdtZW50YXRpb24gb2YgJXUgYnl0ZXMgcmVwb3J0ZWQgYXMgJXUgb24gcGFnZSAldQBmcmVlbGlzdCBsZWFmIGNvdW50IHRvbyBiaWcgb24gcGFnZSAldQBNdWx0aXBsZSB1c2VzIGZvciBieXRlICV1IG9mIHBhZ2UgJXUAJXMgaXMgJXUgYnV0IHNob3VsZCBiZSAldQB1bmFibGUgdG8gdXNlIGZ1bmN0aW9uICVzIGluIHRoZSByZXF1ZXN0ZWQgY29udGV4dABTb3J0ZXJOZXh0AFZOZXh0AGluY29tcGxldGUgaW5wdXQAYnVzeV90aW1lb3V0AGxvY2FsaG9zdABjYW5ub3QgZHJvcCBjb2x1bW4gIiVzIjogbm8gb3RoZXIgY29sdW1ucyBleGlzdABwZXJzaXN0AGZvcmVpZ25fa2V5X2xpc3QAaW5kZXhfbGlzdABmdW5jdGlvbl9saXN0AGNvbGxhdGlvbl9saXN0AGRhdGFiYXNlX2xpc3QAbW9kdWxlX2xpc3QAUFJBR01BIHRhYmxlX2xpc3QAcHJhZ21hX2xpc3QAc2V0IGxpc3QAVmFsdWVMaXN0AHNxbGl0ZV9yZW5hbWVfdGVzdABSb3dTZXRUZXN0AFNlcXVlbmNlVGVzdABmYXN0AExhc3QAQ2FzdABzcXJ0AFNvcnRlclNvcnQAIlwvYmZucnQAanNvbl9pbnNlcnQAanNvbmJfaW5zZXJ0AElkeEluc2VydABTb3J0ZXJJbnNlcnQAcmVzdGFydABjb3QAQml0Tm90AElmTm90AFBhZ2Vjb3VudABmcmVlbGlzdF9jb3VudABtYXhfcGFnZV9jb3VudABSZXNldENvdW50AHdhbF9hdXRvY2hlY2twb2ludAB3YWxfY2hlY2twb2ludABDaGVja3BvaW50AFNhdmVwb2ludABhIENIRUNLIGNvbnN0cmFpbnQAJXNPTiBDT05GTElDVCBjbGF1c2UgZG9lcyBub3QgbWF0Y2ggYW55IFBSSU1BUlkgS0VZIG9yIFVOSVFVRSBjb25zdHJhaW50AEN1cnNvckhpbnQAX2NvbnRlbnQAcGFyZW50AERJU1RJTkNUIGFnZ3JlZ2F0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGFyZ3VtZW50AGNvbW1lbnQAQVBJIGNhbGxlZCB3aXRoIGZpbmFsaXplZCBwcmVwYXJlZCBzdGF0ZW1lbnQAQVBJIGNhbGxlZCB3aXRoIE5VTEwgcHJlcGFyZWQgc3RhdGVtZW50AE1heFBnY250AGRlZmF1bHQgdmFsdWUgb2YgY29sdW1uIFslc10gaXMgbm90IGNvbnN0YW50AE11c3RCZUludABDYW5ub3QgYWRkIGEgY29sdW1uIHdpdGggbm9uLWNvbnN0YW50IGRlZmF1bHQASGFsdABsYW5vaXQAc3RhdF9pbml0AEluaXQAQXV0b0NvbW1pdABhbmFseXNpc19saW1pdABzb2Z0X2hlYXBfbGltaXQAaGFyZF9oZWFwX2xpbWl0AGpvdXJuYWxfc2l6ZV9saW1pdABPZmZzZXRMaW1pdABTZWVrSGl0AE9OIGNsYXVzZSByZWZlcmVuY2VzIHRhYmxlcyB0byBpdHMgcmlnaHQAU2hpZnRSaWdodABoZ2h0AFNoaWZ0TGVmdABPZmZzZXQAcmVzZXQAanNvbl9zZXQAanNvbmJfc2V0AHRvbyBtYW55IGNvbHVtbnMgaW4gcmVzdWx0IHNldAAlciBPUkRFUiBCWSB0ZXJtIGRvZXMgbm90IG1hdGNoIGFueSBjb2x1bW4gaW4gdGhlIHJlc3VsdCBzZXQAc25pcHBldABzdGF0X2dldABzcWxpdGVfY29tcGlsZW9wdGlvbl9nZXQAc3RyaWN0AE5vQ29uZmxpY3QAanNvbl9ncm91cF9vYmplY3QAanNvbmJfZ3JvdXBfb2JqZWN0AGpzb25fb2JqZWN0AGpzb25iX29iamVjdABqc29uX2V4dHJhY3QAanNvbmJfZXh0cmFjdABTdWJ0cmFjdABsc3RhdABmc3RhdAAlc19zdGF0AHRibCxpZHgsc3RhdAB1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdABncm91cF9jb25jYXQAQ29uY2F0AEx0AEd0AGRlZmVyX2ZvcmVpZ25fa2V5cwBhbHdheXMAcGFyYW1ldGVycyBhcmUgbm90IGFsbG93ZWQgaW4gdmlld3MAY29uY2F0X3dzAHN0YXR1cwBzeW5jaHJvbm91cwBpbmRleCAlcyBhbHJlYWR5IGV4aXN0cwBvdXRwdXQgZmlsZSBhbHJlYWR5IGV4aXN0cwAlcyAlVCBhbHJlYWR5IGV4aXN0cwB0cmlnZ2VyICVUIGFscmVhZHkgZXhpc3RzAE5vdEV4aXN0cwBpZ25vcmVfY2hlY2tfY29uc3RyYWludHMAQ0hFQ0sgY29uc3RyYWludHMAZXhwcmVzc2lvbnMgcHJvaGliaXRlZCBpbiBQUklNQVJZIEtFWSBhbmQgVU5JUVVFIGNvbnN0cmFpbnRzAGpzb25fb2JqZWN0KCkgcmVxdWlyZXMgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzAGpzb25fJXMoKSBuZWVkcyBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cwAlc19zZWdtZW50cwB1bmFibGUgdG8gZGVsZXRlL21vZGlmeSB1c2VyLWZ1bmN0aW9uIGR1ZSB0byBhY3RpdmUgc3RhdGVtZW50cwB1bmFibGUgdG8gZGVsZXRlL21vZGlmeSBjb2xsYXRpb24gc2VxdWVuY2UgZHVlIHRvIGFjdGl2ZSBzdGF0ZW1lbnRzAG9mZnNldHMAcmV2ZXJzZV91bm9yZGVyZWRfc2VsZWN0cwBpaXNzc3NzcwBpc3MAc2VzcwB1bmNvbXByZXNzAGNhbm5vdCBvcGVuIHNhdmVwb2ludCAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCByZWxlYXNlIHNhdmVwb2ludCAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCBjb21taXQgdHJhbnNhY3Rpb24gLSBTUUwgc3RhdGVtZW50cyBpbiBwcm9ncmVzcwBjYW5ub3QgVkFDVVVNIC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAYWNjZXNzAHBhcmFtZXRlcnMAcmVjdXJzaXZlX3RyaWdnZXJzAHRoZSBJTkRFWEVEIEJZIGNsYXVzZSBpcyBub3QgYWxsb3dlZCBvbiBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAHRoZSBOT1QgSU5ERVhFRCBjbGF1c2UgaXMgbm90IGFsbG93ZWQgb24gVVBEQVRFIG9yIERFTEVURSBzdGF0ZW1lbnRzIHdpdGhpbiB0cmlnZ2VycwBxdWFsaWZpZWQgdGFibGUgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIG9uIElOU0VSVCwgVVBEQVRFLCBhbmQgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAENoaWxkIHBhZ2UgZGVwdGggZGlmZmVycwB1bmFibGUgdG8gY2xvc2UgZHVlIHRvIHVuZmluYWxpemVkIHN0YXRlbWVudHMgb3IgdW5maW5pc2hlZCBiYWNrdXBzAGFjb3MASWZQb3MAY29tcGlsZV9vcHRpb25zAERJU1RJTkNUIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMARklMVEVSIGNsYXVzZSBtYXkgb25seSBiZSB1c2VkIHdpdGggYWdncmVnYXRlIHdpbmRvdyBmdW5jdGlvbnMAbm9uLWRldGVybWluaXN0aWMgZnVuY3Rpb25zAGluZGV4IGV4cHJlc3Npb25zAFNFTEVDVHMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IG9mICVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXN1bHQgY29sdW1ucwB2aXJ0dWFsIHRhYmxlcyBjYW5ub3QgdXNlIGNvbXB1dGVkIGNvbHVtbnMAZ2VuZXJhdGVkIGNvbHVtbnMAdGFibGUgJXMgaGFzICVkIHZhbHVlcyBmb3IgJWQgY29sdW1ucwByYWRpYW5zAGFsbCBWQUxVRVMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiB0ZXJtcwBlbXB0eV9yZXN1bHRfY2FsbGJhY2tzAExvYWRBbmFseXNpcwBmbGdzAGZsYWdzAHZmcwAlZCBjb2x1bW5zIGFzc2lnbmVkICVkIHZhbHVlcwBKU09OIGNhbm5vdCBob2xkIEJMT0IgdmFsdWVzAGZhaWxlZCBtZW1vcnkgcmVzaXplICV1IHRvICV1IGJ5dGVzAHBhcnRpYWwgaW5kZXggV0hFUkUgY2xhdXNlcwBzaG9ydF9jb2x1bW5fbmFtZXMAZnVsbF9jb2x1bW5fbmFtZXMAdW5hYmxlIHRvIG9wZW4gYSB0ZW1wb3JhcnkgZGF0YWJhc2UgZmlsZSBmb3Igc3RvcmluZyB0ZW1wb3JhcnkgdGFibGVzAGNhbm5vdCBjcmVhdGUgdHJpZ2dlcnMgb24gc2hhZG93IHRhYmxlcwBjYW5ub3QgY3JlYXRlIHRyaWdnZXJzIG9uIHZpcnR1YWwgdGFibGVzACVzIFJFVFVSTklORyBpcyBub3QgYXZhaWxhYmxlIG9uIHZpcnR1YWwgdGFibGVzAGNhbm5vdCBqb2luIHVzaW5nIGNvbHVtbiAlcyAtIGNvbHVtbiBub3QgcHJlc2VudCBpbiBib3RoIHRhYmxlcwBBVVRPSU5DUkVNRU5UIG5vdCBhbGxvd2VkIG9uIFdJVEhPVVQgUk9XSUQgdGFibGVzACVzIGNhbm5vdCB1c2UgdmFyaWFibGVzAHRvbyBtYW55IFNRTCB2YXJpYWJsZXMAc3VicXVlcmllcwBjYW5ub3QgdXNlIHdpbmRvdyBmdW5jdGlvbnMgaW4gcmVjdXJzaXZlIHF1ZXJpZXMAY291bnRfY2hhbmdlcwB0b3RhbF9jaGFuZ2VzAGRlZ3JlZXMAUkVUVVJOSU5HIG1heSBub3QgdXNlICJUQUJMRS4qIiB3aWxkY2FyZHMAdGhyZWFkcwBhYnMALiUuKnMAQ1JFQVRFICVzICUuKnMAQ1JFQVRFJXMgSU5ERVggJS4qcwBpbnZhbGlkIHVyaSBhdXRob3JpdHk6ICUuKnMAdW5rbm93biB0YWJsZSBvcHRpb246ICUuKnMAJS4qcyVzACwlcyVzJXMAU0NBTiAlcyVzJXMAc3FsaXRlX2FsdGVydGFiXyVzAFNDQU4gJWQgQ09OU1RBTlQgUk9XJXMAJVElcwAgVklSVFVBTCBUQUJMRSBJTkRFWCAlZDolcwAlczogJXMuJXMuJXMAbWlzc2luZyBkYXRhdHlwZSBmb3IgJXMuJXMAY2Fubm90IHN0b3JlICVzIHZhbHVlIGluICVzIGNvbHVtbiAlcy4lcwBub24tJXMgdmFsdWUgaW4gJXMuJXMAVEVYVCB2YWx1ZSBpbiAlcy4lcwBOVUxMIHZhbHVlIGluICVzLiVzAE5VTUVSSUMgdmFsdWUgaW4gJXMuJXMAbWFsZm9ybWVkIGludmVydGVkIGluZGV4IGZvciBGVFMlZCB0YWJsZSAlcy4lcwAlczogJXMuJXMAbm8gc3VjaCB0YWJsZSBjb2x1bW46ICVzLiVzAC4uJXMAJS4xOHMtJXMAIFVTSU5HIElOVEVHRVIgUFJJTUFSWSBLRVkgKCVzAHVzZSBEUk9QIFZJRVcgdG8gZGVsZXRlIHZpZXcgJXMAcm93IG5vdCBpbiBQUklNQVJZIEtFWSBvcmRlciBmb3IgJXMAaWxsZWdhbCBmaXJzdCBhcmd1bWVudCB0byAlcwBtaXN1c2Ugb2YgYWxpYXNlZCB3aW5kb3cgZnVuY3Rpb24gJXMAdG9vIG1hbnkgY29sdW1ucyBvbiAlcwB0b28gbWFueSBjb2x1bW5zIGluICVzACVzIHByb2hpYml0ZWQgaW4gJXMAQ0hFQ0sgY29uc3RyYWludCBmYWlsZWQgaW4gJXMAbm9uLWRldGVybWluaXN0aWMgdXNlIG9mICVzKCkgaW4gJXMAcmVjb3ZlcmVkICVkIHBhZ2VzIGZyb20gJXMAbWlzdXNlIG9mIGFsaWFzZWQgYWdncmVnYXRlICVzACVzICVUIGNhbm5vdCByZWZlcmVuY2Ugb2JqZWN0cyBpbiBkYXRhYmFzZSAlcwBjYW5ub3QgZGV0YWNoIGRhdGFiYXNlICVzAGEgSk9JTiBjbGF1c2UgaXMgcmVxdWlyZWQgYmVmb3JlICVzAGNhbm5vdCBvcGVuIHZhbHVlIG9mIHR5cGUgJXMAY2Fubm90IGZzdGF0IGRiIGZpbGUgJXMAcmVjb3ZlcmVkICVkIGZyYW1lcyBmcm9tIFdBTCBmaWxlICVzAFBSSU1BUlkgS0VZIG1pc3Npbmcgb24gdGFibGUgJXMAdXNlIERST1AgVEFCTEUgdG8gZGVsZXRlIHRhYmxlICVzAFNFTEVDVCAlcyBPUkRFUiBCWSByb3dpZCAlcwBTRUxFQ1QgJXMgV0hFUkUgcm93aWQgQkVUV0VFTiAlbGxkIEFORCAlbGxkIE9SREVSIEJZIHJvd2lkICVzAHRoZXJlIGlzIGFscmVhZHkgYW4gaW5kZXggbmFtZWQgJXMAdGFibGUgJVMgaGFzIG5vIGNvbHVtbiBuYW1lZCAlcwB0aGVyZSBpcyBhbHJlYWR5IGEgdGFibGUgbmFtZWQgJXMAc3RhdGVtZW50IGFib3J0cyBhdCAlZDogWyVzXSAlcwBDT1ZFUklORyBJTkRFWCAlcwBTRUxFQ1QgJXMAdW5zdXBwb3J0ZWQgdXNlIG9mIE5VTExTICVzAFVTRSBURU1QIEItVFJFRSBGT1IgJXMALS0gVFJJR0dFUiAlcwBSSUdIVC1KT0lOICVzAD4/IEFORCAlcwAlejogJXMAcmVjdXJzaXZlIHJlZmVyZW5jZSBpbiBhIHN1YnF1ZXJ5OiAlcwB2dGFibGUgY29uc3RydWN0b3IgY2FsbGVkIHJlY3Vyc2l2ZWx5OiAlcwBubyBzdWNoIGluZGV4OiAlcwBubyBzdWNoIHdpbmRvdzogJXMAY2Fubm90IG92ZXJyaWRlICVzIG9mIHdpbmRvdzogJXMAY2Fubm90IG9wZW4gdmlldzogJXMAbm8gc3VjaCBzYXZlcG9pbnQ6ICVzAG5vIHN1Y2ggdmZzOiAlcwBtdWx0aXBsZSByZWN1cnNpdmUgcmVmZXJlbmNlczogJXMAZXJyb3IgaW4gJXMgJXMlcyVzOiAlcwB1bmFibGUgdG8gdmFsaWRhdGUgdGhlIGludmVydGVkIGluZGV4IGZvciBGVFMlZCB0YWJsZSAlcy4lczogJXMAZXJyb3IgaW4gJXMgJXMgYWZ0ZXIgJXM6ICVzAHVua25vd24gdG9rZW5pemVyOiAlcwBlcnJvciBwYXJzaW5nIHByZWZpeCBwYXJhbWV0ZXI6ICVzAHVucmVjb2duaXplZCBwYXJhbWV0ZXI6ICVzAHVucmVjb2duaXplZCBvcmRlcjogJXMAdW5yZWNvZ25pemVkIG1hdGNoaW5mbzogJXMAbm8gc3VjaCBjb2x1bW46ICVzAGZpbGUgcmVuYW1lZCB3aGlsZSBvcGVuOiAlcwBmaWxlIHVubGlua2VkIHdoaWxlIG9wZW46ICVzAHVuc3VwcG9ydGVkIGVuY29kaW5nOiAlcwBjYW5ub3QgbGltaXQgV0FMIHNpemU6ICVzAE1KIGRlbGV0ZTogJXMAdGFyZ2V0IG9iamVjdC9hbGlhcyBtYXkgbm90IGFwcGVhciBpbiBGUk9NIGNsYXVzZTogJXMAb2JqZWN0IG5hbWUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogJXMAdW5rbm93biBkYXRhYmFzZTogJXMAdW5hYmxlIHRvIG9wZW4gZGF0YWJhc2U6ICVzAG5vIHN1Y2ggZGF0YWJhc2U6ICVzAHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciB0YWJsZSBvciBpbmRleCB3aXRoIHRoaXMgbmFtZTogJXMAZHVwbGljYXRlIGNvbHVtbiBuYW1lOiAlcwBkdXBsaWNhdGUgV0lUSCB0YWJsZSBuYW1lOiAlcwBubyBzdWNoIG1vZHVsZTogJXMAbXVsdGlwbGUgbGlua3MgdG8gZmlsZTogJXMAY2Fubm90IG9wZW4gdmlydHVhbCB0YWJsZTogJXMAbm8gc3VjaCB0YWJsZTogJXMAbXVsdGlwbGUgcmVmZXJlbmNlcyB0byByZWN1cnNpdmUgdGFibGU6ICVzAG5vIHN1Y2ggJXMgbW9kZTogJXMATUogY29sbGlkZTogJXMAbm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6ICVzAGNpcmN1bGFyIHJlZmVyZW5jZTogJXMAY2Fubm90IG9wZW4gdGFibGUgd2l0aG91dCByb3dpZDogJXMAJXMgbW9kZSBub3QgYWxsb3dlZDogJXMAdnRhYmxlIGNvbnN0cnVjdG9yIGZhaWxlZDogJXMAYXV0b21hdGljIGV4dGVuc2lvbiBsb2FkaW5nIGZhaWxlZDogJXMAZGF0YWJhc2UgdGFibGUgaXMgbG9ja2VkOiAlcwBkYXRhYmFzZSBzY2hlbWEgaXMgbG9ja2VkOiAlcwB2dGFibGUgY29uc3RydWN0b3IgZGlkIG5vdCBkZWNsYXJlIHNjaGVtYTogJXMAYWJvcnQgYXQgJWQgaW4gWyVzXTogJXMALS0gJXMAJXogLSAlcwBvc191bml4LmM6JWQ6ICglZCkgJXMoJXMpIC0gJXMAd3IAcmlnaHRzdHIAbGVmdHN0cgBpbnN0cgBzdWJzdHIAZXhwcl9pbXBsaWVzX2V4cHIAaW52YWxpZCBhcmd1bWVudHMgdG8gZnRzNGF1eCBjb25zdHJ1Y3RvcgBtaXNzaW5nICVzIHBhcmFtZXRlciBpbiBmdHM0IGNvbnN0cnVjdG9yAHRoZSAiLiIgb3BlcmF0b3IAZnRzM2N1cnNvcgBuZWFyICIlVCI6IHN5bnRheCBlcnJvcgB1bmtub3duIGVycm9yAGRvbWFpbiBlcnJvcgBub3QgYW4gZXJyb3IAU1FMIGxvZ2ljIGVycm9yAGRpc2sgSS9PIGVycm9yAGZsb29yAHJtZGlyAG1rZGlyAHNlZ2RpcgBmdHMzX3Rva2VuaXplcgB1bmtub3duIHRva2VuaXplcgBwb3dlcgBsb3dlcgBzcWxpdGVfdGVtcF9tYXN0ZXIAc3FsaXRlX21hc3RlcgBwb3J0ZXIAUmVzZXRTb3J0ZXIARmtDb3VudGVyAEFQSSBjYWxsIHdpdGggJXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb2ludGVyAHN0cmZpbHRlcgBWRmlsdGVyAEVTQ0FQRSBleHByZXNzaW9uIG11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyAHVwcGVyAHByb3BlcgBJZlNtYWxsZXIAY2Fubm90IHVzZSBSRVRVUk5JTkcgaW4gYSB0cmlnZ2VyAERyb3BUcmlnZ2VyAHNlY29uZCBhcmd1bWVudCB0byBudGhfdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIAYXJndW1lbnQgb2YgbnRpbGUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIAZnJhbWUgc3RhcnRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcgBmcmFtZSBlbmRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcgBJbnRlZ2VyAFJvd2lkICVsbGQgb3V0IG9mIG9yZGVyAFJlbWFpbmRlcgBmcmFtZSBzdGFydGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIAZnJhbWUgZW5kaW5nIG9mZnNldCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcgBhZGRyAHBhZHIAY2hhcgB5ZWFyAENsZWFyAEJpdE9yAHNlcQBDb2xsU2VxAEVsc2VFcQByZWdleHAAT3BlbkR1cABOb29wAEp1bXAAL3Vzci90bXAAL3Zhci90bXAAdGVtcABjdXJyZW50X3RpbWVzdGFtcABBZ2dTdGVwAG1vZGVTdGVwAHZhcmlhbmNlU3RlcABtdW5tYXAAbW1hcABtcmVtYXAAc3FsaXRlX3JldHVybmluZ18lcAB2dGFiOiVwAHNzZW5zdW8AaWxzdW8AYXV0bwBHb3RvAGludG8AaW5jcmVtZW50YWxfdmFjdXVtIGVuYWJsZWQgd2l0aCBhIG1heCByb290cGFnZSBvZiB6ZXJvAElmTm90WmVybwBEZWNySnVtcFplcm8ARmtJZlplcm8Ac2Vxbm8AaW5kZXhfeGluZm8AdGFibGVfeGluZm8AbWF0Y2hpbmZvAGluZGV4X2luZm8AdGFibGVfaW5mbwBPcGVuUHNldWRvAGZjaG93bgBCZWdpblN1YnJ0bgBSZXR1cm4AanNvbgBubyBxdWVyeSBzb2x1dGlvbgBpbmRleCBjb3JydXB0aW9uAGRhdGFiYXNlIGNvcnJ1cHRpb24AZnJlZSBzcGFjZSBjb3JydXB0aW9uAGpzb25fZXJyb3JfcG9zaXRpb24AdW5rbm93biBjb2x1bW4gIiVzIiBpbiBmb3JlaWduIGtleSBkZWZpbml0aW9uACVzLnhCZXN0SW5kZXggbWFsZnVuY3Rpb24AYXV0aG9yaXplciBtYWxmdW5jdGlvbgAlI1QoKSBtYXkgbm90IGJlIHVzZWQgYXMgYSB3aW5kb3cgZnVuY3Rpb24AJyVzJyBpcyBub3QgYSBmdW5jdGlvbgBGdW5jdGlvbgBjYW5ub3Qgc3RhcnQgYSB0cmFuc2FjdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbgBjYW5ub3QgY2hhbmdlICVzIHdhbCBtb2RlIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AdGVtcG9yYXJ5IHN0b3JhZ2UgY2Fubm90IGJlIGNoYW5nZWQgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbgBjYW5ub3QgVkFDVVVNIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AU2FmZXR5IGxldmVsIG1heSBub3QgYmUgY2hhbmdlZCBpbnNpZGUgYSB0cmFuc2FjdGlvbgBUcmFuc2FjdGlvbgBQZXJtdXRhdGlvbgB1bmtub3duIG9wZXJhdGlvbgB1bnN1cHBvcnRlZCBmcmFtZSBzcGVjaWZpY2F0aW9uAFJBTkdFIHdpdGggb2Zmc2V0IFBSRUNFRElORy9GT0xMT1dJTkcgcmVxdWlyZXMgb25lIE9SREVSIEJZIGV4cHJlc3Npb24AdG9vIG1hbnkgbGV2ZWxzIG9mIHRyaWdnZXIgcmVjdXJzaW9uAHVzZXJfdmVyc2lvbgBzcWxpdGVfdmVyc2lvbgBkYXRhX3ZlcnNpb24Ac2NoZW1hX3ZlcnNpb24Ac3FsaXRlX2Ryb3BfY29sdW1uAHNxbGl0ZV9yZW5hbWVfY29sdW1uAGFmdGVyIGRyb3AgY29sdW1uAG5vIHN1Y2ggY29sdW1uAG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLWdlbmVyYXRlZCBjb2x1bW4AY2Fubm90IHVzZSBERUZBVUxUIG9uIGEgZ2VuZXJhdGVkIGNvbHVtbgBhZGQgY29sdW1uAENhbm5vdCBhZGQgYSBQUklNQVJZIEtFWSBjb2x1bW4AQ2Fubm90IGFkZCBhIFVOSVFVRSBjb2x1bW4AY2Fubm90IGFkZCBhIFNUT1JFRCBjb2x1bW4AVkNvbHVtbgBidWlsdGluAGFzaW4AYXQgbW9zdCAlZCB0YWJsZXMgaW4gYSBqb2luAG1pbgBvcmlnaW4AVkJlZ2luAG1haW4ARXhwbGFpbgBzaWduAHNzZW4Ab3BlbgBJZk5vdE9wZW4AU29ydGVyT3BlbgBWT3BlbgBoaWRkZW4AYXRhbgBtZWRpYW4AU2Vla1NjYW4AVkluaXRJbgBhdXRvX3ZhY3V1bQBpbmNyZW1lbnRhbF92YWN1dW0ASW5jclZhY3V1bQBzdW0AZmxleG51bQBwbQBkcm9wIGNvbHVtbiBmcm9tAC9kZXYvdXJhbmRvbQBBZGRJbW0AcnRyaW0AbHRyaW0AcmVhZG9ubHlfc2htACVzLXNobQB0bmVtAFJBSVNFKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gYSB0cmlnZ2VyLXByb2dyYW0AUHJvZ3JhbQBQYXJhbQBmdWwAZmNudGwAaW9jdGwAaWdvbABsb2NraW5nIHByb3RvY29sAG5jb2wAbm90bnVsbABpZm51bGwAL2Rldi9udWxsAGRhdGFiYXNlIG9yIGRpc2sgaXMgZnVsbABOb3ROdWxsAFNvZnROdWxsAElzTnVsbABaZXJvT3JOdWxsAEhhbHRJZk51bGwAY29sbABjYWNoZV9zcGlsbABSb3dDZWxsAGNlaWwAZGV0YWlsAHBhZGwAdW5peC1leGNsAHRibAB3YWwAdmlydHVhbAB0b3RhbABpbmNyZW1lbnRhbABPcGVuRXBoZW1lcmFsAEFnZ0ZpbmFsAG5vcm1hbABJbmRleCBhbHJlYWR5IG9wdGltYWwAcGFydGlhbAByZWFsAFJlYWwAcGsAb2sAdW5saW5rAHJlYWRsaW5rAEZpbmlzaFNlZWsARGVmZXJyZWRTZWVrAG5vbG9jawBDdXJzb3JVbmxvY2sAYmxvY2sAJXMubG9jawBDdXJzb3JMb2NrAFRhYmxlTG9jawBpbnRlZ3JpdHlfY2hlY2sAZm9yZWlnbl9rZXlfY2hlY2sAcXVpY2tfY2hlY2sAY2VsbF9zaXplX2NoZWNrAGludGVncml0eS1jaGVjawBGa0NoZWNrAFR5cGVDaGVjawBWQ2hlY2sASW50ZWdyaXR5Q2sAcmV6aQBub2l0YXppAGl0aXZpAHNzZW5ldmkAaXRpAGlzc2lzaQBpc2lzaQBwaQBub2kAZ25pAHNpc3NpaQBpc3Npc2lpAHNzc2lpaQBzZWkAaXRpY2kAZXRhY2kAbGFjaQBjb3RoAG1vbnRoAGpzb25fYXJyYXlfbGVuZ3RoAG9jdGV0X2xlbmd0aABvdmVyZmxvdyBsaXN0IGxlbmd0aAB3ZHRoAHN0YXRfcHVzaABmbHVzaABhY29zaABhc2luaABhdGFuaABqc29uX3BhdGNoAGpzb25iX3BhdGNoAGRhdGF0eXBlIG1pc21hdGNoAGFyZ3VtZW50IHR5cGUgbWlzbWF0Y2gAYWJicmV2aWF0ZWQgcXVlcnkgYWxnb3JpdGhtIHNlYXJjaAB1bml4ZXBvY2gAc3FsaXRlX2F0dGFjaABzcWxpdGVfZGV0YWNoAGpzb25fZWFjaABhdmcAbmFyZwBzcWxpdGVfbG9nAHN0YXRlbWVudCB0b28gbG9uZwBjYW5ub3Qgb3BlbiAlcyBjb2x1bW4gZm9yIHdyaXRpbmcAc3Vic3RyaW5nAFN0cmluZwBlbmNvZGluZwBzdHJpbmcgb3IgYmxvYiB0b28gYmlnAHN0cmluZ19hZ2cAUmVsZWFzZVJlZwAlLjE2ZwAlITAuMTVnACUhLjE1ZwBzc2VubHVmAHByaW50ZgB0eXBlb2YAbW9kZW9mAG91dCBvZgByZW5hbWUgY29sdW1ucyBvZgBpbmYALUluZgBudWxsaWYAaWlmAG9mZgB0aW1lZGlmZgAwMTIzNDU2Nzg5YWJjZGVmAElmACVjJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwNi4zZgAlLjNmADUwZgA0MGYAJSEuKmYAZ2V0cGFnZXNpemUAZG9jc2l6ZQBtbWFwX3NpemUAZGVmYXVsdF9jYWNoZV9zaXplAFBSQUdNQSAlUS5wYWdlX3NpemUAZnRzM3Rva2VuaXplAG9wdGltaXplAGpzb25fcmVtb3ZlAGpzb25iX3JlbW92ZQBNb3ZlAGNhbm5vdCBjb21taXQgLSBubyB0cmFuc2FjdGlvbiBpcyBhY3RpdmUAY2Fubm90IHJvbGxiYWNrIC0gbm8gdHJhbnNhY3Rpb24gaXMgYWN0aXZlAGV4Y2x1c2l2ZQB0cnVlAElzVHJ1ZQB1bmlxdWUAZGZsdF92YWx1ZQBDYW5ub3QgYWRkIGEgUkVGRVJFTkNFUyBjb2x1bW4gd2l0aCBub24tTlVMTCBkZWZhdWx0IHZhbHVlAEFnZ1ZhbHVlAGpzb25fcXVvdGUAcHdyaXRlAE9wZW5Xcml0ZQBvbl9kZWxldGUAc2VjdXJlX2RlbGV0ZQBJZHhEZWxldGUAcHJpdmF0ZQBhZ2dyZWdhdGUAVkNyZWF0ZQBvbl91cGRhdGUAVlVwZGF0ZQBjdXJyZW50X2RhdGUAZmFsbG9jYXRlAGZ0cnVuY2F0ZQByZXBsaWNhdGUAYmFkIHBhcmFtZXRlciBvciBvdGhlciBBUEkgbWlzdXNlAHRvbyBtYW55IHRlcm1zIGluICVzIEJZIGNsYXVzZQB0b28gbWFueSB0ZXJtcyBpbiBPUkRFUiBCWSBjbGF1c2UAYWdncmVnYXRlIGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIEdST1VQIEJZIGNsYXVzZQBQQVJUSVRJT04gY2xhdXNlAGEgTkFUVVJBTCBqb2luIG1heSBub3QgaGF2ZSBhbiBPTiBvciBVU0lORyBjbGF1c2UAZGF0YWJhc2UgJXMgaXMgYWxyZWFkeSBpbiB1c2UAQWdnSW52ZXJzZQByZXZlcnNlAGNsb3NlAENsb3NlAGZhbHNlAGF0dGVtcHQgdG8gd3JpdGUgYSByZWFkb25seSBkYXRhYmFzZQBjb3JydXB0IGRhdGFiYXNlAGF0dGFjaGVkIGRhdGFiYXNlcyBtdXN0IHVzZSB0aGUgc2FtZSB0ZXh0IGVuY29kaW5nIGFzIG1haW4gZGF0YWJhc2UAZmlsZSBpcyBub3QgYSBkYXRhYmFzZQB0ZW1wX3N0b3JlACVzIGNsYXVzZSBzaG91bGQgY29tZSBhZnRlciAlcyBub3QgYmVmb3JlAEV4cGlyZQBzcXVhcmUAZXhwcl9jb21wYXJlAFNvcnRlckNvbXBhcmUAc3VidHlwZQBTZXRTdWJ0eXBlAEdldFN1YnR5cGUAQ2xyU3VidHlwZQBqc29uX3R5cGUASXNUeXBlAElmTm9Ib3BlAGlsdG5lAHVuaXgtbm9uZQBJbml0Q29yb3V0aW5lAEVuZENvcm91dGluZQBpY25lAGxvY2FsdGltZQBzdHJmdGltZQBkYXRldGltZQBjdXJyZW50X3RpbWUAdG5lbWUAYWZ0ZXIgcmVuYW1lAG5vbi10ZXh0IGZpbGVuYW1lAFZSZW5hbWUAYW1iaWd1b3VzIGNvbHVtbiBuYW1lAHRlbXBvcmFyeSB0cmlnZ2VyIG1heSBub3QgaGF2ZSBxdWFsaWZpZWQgbmFtZQBzaW1wbGUAbG93ZXJfcXVhcnRpbGUAdXBwZXJfcXVhcnRpbGUAdW5peC1kb3RmaWxlAGNhbm5vdCBvcGVuIGZpbGUAdW5hYmxlIHRvIG9wZW4gZGF0YWJhc2UgZmlsZQBpbW11dGFibGUAQWJvcnRhYmxlAGxlZ2FjeV9hbHRlcl90YWJsZQBzcWxpdGVfcmVuYW1lX3RhYmxlAGNhbm5vdCBjcmVhdGUgdHJpZ2dlciBvbiBzeXN0ZW0gdGFibGUAdmlydHVhbCB0YWJsZQBubyBzdWNoIHRhYmxlAG51bWJlciBvZiBjb2x1bW5zIGluIGZvcmVpZ24ga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgcmVmZXJlbmNlZCB0YWJsZQBsb2NhbCB0aW1lIHVuYXZhaWxhYmxlAGFub3RoZXIgcm93IGF2YWlsYWJsZQBubyBtb3JlIHJvd3MgYXZhaWxhYmxlAFZhcmlhYmxlAERyb3BUYWJsZQB1dGYxNmxlAFVURjE2bGUAVVRGLTE2bGUAY2FzZV9zZW5zaXRpdmVfbGlrZQBTZXRDb29raWUAUmVhZENvb2tpZQBjYWNoZQBjb2x1bW4gaW5kZXggb3V0IG9mIHJhbmdlAG5vdGlmaWNhdGlvbiBtZXNzYWdlAHdhcm5pbmcgbWVzc2FnZQBpbnZhbGlkIHJvb3RwYWdlAEV4dGVuZHMgb2ZmIGVuZCBvZiBwYWdlAE1BWF9QQUdFX0NPVU5UPTB4ZmZmZmZmZmUAanNvbl90cmVlAENyZWF0ZUJ0cmVlAGRlZQBqb3VybmFsX21vZGUAbG9ja2luZ19tb2RlAG9wY29kZQB1bmljb2RlAEpvdXJuYWxNb2RlAERpdmlkZQBjb2FsZXNjZQBzcWxpdGVfc2VxdWVuY2UAU2VxdWVuY2UAZGlmZmVyZW5jZQB2YXJpYW5jZQBPbmNlAFRyYWNlAGpzb25fcmVwbGFjZQBqc29uYl9yZXBsYWNlAHV0ZjE2YmUAVVRGMTZiZQBVVEYtMTZiZQBOZQBMZQBHZQAyMGM6MjBlADIwYjoyMGUAJSEwLjIwZQBnZXRjd2QATWFrZVJlY29yZAB0aHN0bmRyZABsaWtlbGlob29kAGZjaG1vZAByb3VuZABOb3RGb3VuZABzdWJzZWNvbmQAUmV3aW5kAFNlZWtFbmQAQml0QW5kAG9sZAAlbGxkICVsbGQAbm8gc3VjaCByb3dpZDogJWxsZAByZWJ1aWxkAFlpZWxkAGxhc3RfaW5zZXJ0X3Jvd2lkACVzLnJvd2lkAFNFTEVDVCpGUk9NIiV3Ii4lcyBPUkRFUiBCWSByb3dpZABTRUxFQ1QqRlJPTSIldyIuJXMgV0hFUkUgJXMgT1JERVIgQlkgcm93aWQASWR4Um93aWQATmV3Um93aWQAU2Vla1Jvd2lkAGdldGV1aWQAaW52YWxpZABqc29uX3ZhbGlkAGZraWQAX19sYW5naWQAJXosIGxhbmdpZABsYW5ndWFnZWlkAGRvY2lkAGFwcGxpY2F0aW9uX2lkAHNxbGl0ZV9zb3VyY2VfaWQAbm90IGF1dGhvcml6ZWQASW5kZXggb3B0aW1pemVkAG5vdGluZGV4ZWQAdW5hYmxlIHRvIGlkZW50aWZ5IHRoZSBvYmplY3QgdG8gYmUgcmVpbmRleGVkAHZpZXdzIG1heSBub3QgYmUgaW5kZXhlZAB2aXJ0dWFsIHRhYmxlcyBtYXkgbm90IGJlIGluZGV4ZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBpbmRleGVkAHJlYWRfdW5jb21taXR0ZWQAcmVjdXJzaXZlIGFnZ3JlZ2F0ZSBxdWVyaWVzIG5vdCBzdXBwb3J0ZWQAcXVlcnkgYWJvcnRlZAByb3dzIGluc2VydGVkAGludGVycnVwdGVkAGNoZWNrcG9pbnRlZABhY2Nlc3MgdG8gJXogaXMgcHJvaGliaXRlZABhY2Nlc3MgdG8gdmlldyAiJXMiIHByb2hpYml0ZWQAcm93cyBkZWxldGVkAGdlbmVyYXRlZAByb3dzIHVwZGF0ZWQAbm90dXNlZAByb3cgdmFsdWUgbWlzdXNlZABzcWxpdGVfY29tcGlsZW9wdGlvbl91c2VkAFBhZ2UgJXU6IG5ldmVyIHVzZWQAQ29sdW1uc1VzZWQAc3RvcmVkAHZpcnR1YWwgdGFibGVzIG1heSBub3QgYmUgYWx0ZXJlZAB2aWV3ICVzIG1heSBub3QgYmUgYWx0ZXJlZAB0YWJsZSAlcyBtYXkgbm90IGJlIGFsdGVyZWQAc2hhcmVkAGluZGV4IGFzc29jaWF0ZWQgd2l0aCBVTklRVUUgb3IgUFJJTUFSWSBLRVkgY29uc3RyYWludCBjYW5ub3QgYmUgZHJvcHBlZAB0YWJsZSAlcyBtYXkgbm90IGJlIGRyb3BwZWQAdmlldyAlcyBpcyBjaXJjdWxhcmx5IGRlZmluZWQAdW5vcGVuZWQAZGF0YWJhc2UgZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQAJXMgY29uc3RyYWludCBmYWlsZWQARk9SRUlHTiBLRVkgY29uc3RyYWludCBmYWlsZWQAbGFyZ2UgZmlsZSBzdXBwb3J0IGlzIGRpc2FibGVkAGZ0czN0b2tlbml6ZSBkaXNhYmxlZABkYXRhYmFzZSAlcyBpcyBsb2NrZWQAZGF0YWJhc2UgaXMgbG9ja2VkAGRhdGFiYXNlIHRhYmxlIGlzIGxvY2tlZABhdXRob3JpemF0aW9uIGRlbmllZABhY2Nlc3MgcGVybWlzc2lvbiBkZW5pZWQAdGFibGUgJVMgaGFzICVkIGNvbHVtbnMgYnV0ICVkIHZhbHVlcyB3ZXJlIHN1cHBsaWVkAHRlbXBvcmFyeSB0YWJsZSBuYW1lIG11c3QgYmUgdW5xdWFsaWZpZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBtb2RpZmllZABjb25mbGljdGluZyBPTiBDT05GTElDVCBjbGF1c2VzIHNwZWNpZmllZABubyB0YWJsZXMgc3BlY2lmaWVkAGRhdGFiYXNlIGlzIGFscmVhZHkgYXR0YWNoZWQAZGF0YWJhc2Ugc2NoZW1hIGhhcyBjaGFuZ2VkAGV4Y2x1ZGVkAFBhZ2UgJXU6IHBvaW50ZXIgbWFwIHJlZmVyZW5jZWQAUm93U2V0QWRkAEZpbHRlckFkZABwcmVhZABSb3dTZXRSZWFkAE9wZW5SZWFkACUwNGQAJTAzZAAlMDJkOiUwMmQ6JTAyZAAlMDRkLSUwMmQtJTAyZAAlMmQANDBmLTIxYS0yMWQANTBmLTIwYS0yMGQANDBmLTIwYS0yMGQAc3FsaXRlX3N0YXQlZABjb2x1bW4lZABzcWxpdGVfYXV0b2luZGV4XyVzXyVkAHZhcmlhYmxlIG51bWJlciBtdXN0IGJlIGJldHdlZW4gPzEgYW5kID8lZAB1bmFibGUgdG8gZ2V0IHRoZSBwYWdlLiBlcnJvciBjb2RlPSVkAGsoJWQAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHJvb3RwYWdlPSVkIFdIRVJFICMlZCBBTkQgcm9vdHBhZ2U9IyVkAFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCB0eXBlPSclcycsIG5hbWU9JVEsIHRibF9uYW1lPSVRLCByb290cGFnZT0jJWQsIHNxbD0lUSBXSEVSRSByb3dpZD0jJWQAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHR5cGU9J3RhYmxlJywgbmFtZT0lUSwgdGJsX25hbWU9JVEsIHJvb3RwYWdlPTAsIHNxbD0lUSBXSEVSRSByb3dpZD0jJWQAdG9vIG1hbnkgYXR0YWNoZWQgZGF0YWJhc2VzIC0gbWF4ICVkAHRvbyBtYW55IGFyZ3VtZW50cyBvbiAlcygpIC0gbWF4ICVkAGV4cGVjdGVkICVkIGNvbHVtbnMgZm9yICclcycgYnV0IGdvdCAlZABhdHRlbXB0IHRvIG9wZW4gIiVzIiBhcyBmaWxlIGRlc2NyaXB0b3IgJWQAYnRyZWVJbml0UGFnZSgpIHJldHVybnMgZXJyb3IgY29kZSAlZAAlciAlcyBCWSB0ZXJtIG91dCBvZiByYW5nZSAtIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kICVkAHN1Yi1zZWxlY3QgcmV0dXJucyAlZCBjb2x1bW5zIC0gZXhwZWN0ZWQgJWQASU4oLi4uKSBlbGVtZW50IGhhcyAlZCB0ZXJtJXMgLSBleHBlY3RlZCAlZAAlc0xJU1QgU1VCUVVFUlkgJWQAUkVVU0UgTElTVCBTVUJRVUVSWSAlZAAlc1NDQUxBUiBTVUJRVUVSWSAlZABSRVVTRSBTVUJRVUVSWSAlZABJTkRFWCAlZAB0b28gbWFueSBGUk9NIGNsYXVzZSB0ZXJtcywgbWF4OiAlZAByd2MAdXRjAGRlc2MAYXNjAGNoZWNrcG9pbnRfZnVsbGZzeW5jAGZ1bGxfZnN5bmMAY2hhcmluZGV4RnVuYwBzcXJ0RnVuYwBjb3RGdW5jAHJpZ2h0RnVuYwBsZWZ0RnVuYwBhY29zRnVuYwBmbG9vckZ1bmMAcG93ZXJGdW5jAHN0cmZpbHRlckZ1bmMAcHJvcGVyRnVuYwBwYWRyRnVuYwBleHBGdW5jAGFzaW5GdW5jAHNpZ25GdW5jAGF0YW5GdW5jAGNlaWxGdW5jAHBhZGxGdW5jAGNvdGhGdW5jAGFjb3NoRnVuYwBhc2luaEZ1bmMAYXRhbmhGdW5jAGxvZ0Z1bmMAcmFkMmRlZ0Z1bmMAcmV2ZXJzZUZ1bmMAUHVyZUZ1bmMAc3F1YXJlRnVuYwBkaWZmZXJlbmNlRnVuYwBkZWcycmFkRnVuYwBwYWRjRnVuYwBhdG4yRnVuYwBsb2cxMEZ1bmMAZW5jAG51bWVyaWMAMT09YXJnYwBTcWxFeGVjAHN1YnNlYwBwYWRjACUuNGMlcyUuMTZjAHNxbGl0ZS1zcmMvc3FsaXRlLWFtYWxnYW1hdGlvbi0zNDUwMjAwL2V4dGVuc2lvbi1mdW5jdGlvbnMuYwAlcy9ldGlscXNfJWxseCVjAHVucmVjb2duaXplZCBtYXRjaGluZm8gcmVxdWVzdDogJWMAR29zdWIAZ2xvYgB6ZXJvYmxvYgByYW5kb21ibG9iAEJsb2IAanNvbmIAaWxiAGl0aWxpYgBtZW1kYgBBVFRBQ0ggJVEgQVMgdmFjdXVtX2RiAHJvdGEAZXZpdGEAbGFub2l0YQBldGEAUm93RGF0YQBTb3J0ZXJEYXRhAGljbmEAc3FsaXRlX3RlbXBfc2NoZW1hAHNxbGl0ZV9zY2hlbWEAd3JpdGFibGVfc2NoZW1hAHRydXN0ZWRfc2NoZW1hAGNvcnJ1cHQgc2NoZW1hAFBhcnNlU2NoZW1hAGlsbGEAZXppbGEAaXRpbGEAbXNpbGEAc3FsaXRlXwBwcmFnbWFfAFNRTElURV8AX1JPV0lEXwAlcyBhdCBsaW5lICVkIG9mIFslLjEwc10AYmluZCBvbiBhIGJ1c3kgcHJlcGFyZWQgc3RhdGVtZW50OiBbJXNdAG1hbGZvcm1lZCBNQVRDSCBleHByZXNzaW9uOiBbJXNdAFslbGxkXQBbXQBbAExFRlQtTU9TVCBTVUJRVUVSWQBDT01QT1VORCBRVUVSWQBBTlkAZ2VuZXJhdGVkIGNvbHVtbnMgY2Fubm90IGJlIHBhcnQgb2YgdGhlIFBSSU1BUlkgS0VZAEFVVE9JTkNSRU1FTlQgaXMgb25seSBhbGxvd2VkIG9uIGFuIElOVEVHRVIgUFJJTUFSWSBLRVkAZG9jaWQgSU5URUdFUiBQUklNQVJZIEtFWQBGT1JFSUdOIEtFWQBVU0UgVEVNUCBCLVRSRUUgRk9SICVzT1JERVIgQlkAR1JPVVAgQlkAaWlzWABpc2lYAEFVVE9NQVRJQyBQQVJUSUFMIENPVkVSSU5HIElOREVYAEFVVE9NQVRJQyBDT1ZFUklORyBJTkRFWAAtbWolMDZYOSUwMlgAU0NBTiBDT05TVEFOVCBST1cAVklFVwBqc29uX29iamVjdCgpIGxhYmVscyBtdXN0IGJlIFRFWFQARklSU1QATEFTVABFWENFUFQATk9UACBJTlQASWR4TFQAU2Vla0xUAFNFVCBERUZBVUxUAE1VVEVYX09NSVQAQ09NTUlUAExJTUlUAFJJR0hUAElkeEdUAFNlZWtHVABMRUZUAERJU1RJTkNUAFJFU1RSSUNUAElOVEVSU0VDVAB0b28gbWFueSB0ZXJtcyBpbiBjb21wb3VuZCBTRUxFQ1QAdW5rbm93biBqb2luIHR5cGU6ICVUJXMlVCVzJVQALSVUAHRvbyBtYW55IGFyZ3VtZW50cyBvbiBmdW5jdGlvbiAlVAB1bmtub3duIGRhdGFiYXNlICVUAGZvcmVpZ24ga2V5IG9uICVzIHNob3VsZCByZWZlcmVuY2Ugb25seSBvbmUgY29sdW1uIG9mIHRhYmxlICVUAENSRUFURSBWSVJUVUFMIFRBQkxFICVUAGhleCBsaXRlcmFsIHRvbyBiaWc6ICVzJSNUAG5vIHN1Y2ggZnVuY3Rpb246ICUjVABub3QgYXV0aG9yaXplZCB0byB1c2UgZnVuY3Rpb246ICUjVABERUZBVUxUX1JFQ1VSU0lWRV9UUklHR0VSUwBFTkFCTEVfRlRTM19QQVJFTlRIRVNJUwBESVNBQkxFX0xGUwAlcyAlUwBubyBzdWNoIGluZGV4OiAlUwBjYW5ub3QgY3JlYXRlICVzIHRyaWdnZXIgb24gdmlldzogJVMAbm8gc3VjaCB0cmlnZ2VyOiAlUwBjYW5ub3QgY3JlYXRlIElOU1RFQUQgT0YgdHJpZ2dlciBvbiB0YWJsZTogJVMATUFURVJJQUxJWkUgJSFTAENPLVJPVVRJTkUgJSFTAFVTSU5HIElOREVYICVzIEZPUiBJTi1PUEVSQVRPUgBVU0lORyBST1dJRCBTRUFSQ0ggT04gVEFCTEUgJXMgRk9SIElOLU9QRVJBVE9SAE1VTFRJLUlOREVYIE9SAFNRTElURV9UTVBESVIAQUZURVIASU5URUdFUgBPUkRFUgBORUFSAERFTEVURSBGUk9NICVRLiVzIFdIRVJFICVzPSVRAG5hbWU9JVEgQU5EIHNxbD0lUQBERUxFVEUgRlJPTSAlUS5zcWxpdGVfc2VxdWVuY2UgV0hFUkUgbmFtZT0lUQAsIHguJVEAU0VMRUNUICogRlJPTSAlUS4lUQBVUERBVEUgIiV3Ii5zcWxpdGVfc2VxdWVuY2Ugc2V0IG5hbWUgPSAlUSBXSEVSRSBuYW1lID0gJVEAVVBEQVRFICIldyIuc3FsaXRlX21hc3RlciBTRVQgc3FsID0gcHJpbnRmKCclJS4lZHMsICcsc3FsKSB8fCAlUSB8fCBzdWJzdHIoc3FsLDErbGVuZ3RoKHByaW50ZignJSUuJWRzJyxzcWwpKSkgV0hFUkUgdHlwZSA9ICd0YWJsZScgQU5EIG5hbWUgPSAlUQBiYWQgSlNPTiBwYXRoOiAlUQBTRVRVUABHUk9VUABSRUNVUlNJVkUgU1RFUABTTmFOAFFOYU4AbWFsZm9ybWVkIEpTT04ATk8gQUNUSU9OAE9NSVRfTE9BRF9FWFRFTlNJT04AVU5JT04AIExFRlQtSk9JTgBCRUdJTgAsYXJnIEhJRERFTgAsc2NoZW1hIEhJRERFTgBTQ0FOAERFRkFVTFRfQVVUT1ZBQ1VVTQAgTlVNAFBNAFJUUklNAEFNAENhbm5vdCBhZGQgYSBOT1QgTlVMTCBjb2x1bW4gd2l0aCBkZWZhdWx0IHZhbHVlIE5VTEwATk9UIE5VTEwAU0VUIE5VTEwAU0VMRUNUIDEgRlJPTSAlUS4nJXFfc2VnbWVudHMnIFdIRVJFIGJsb2NraWQ9PyBBTkQgYmxvY2sgSVMgTlVMTABVTklPTiBBTEwAIFJFQUwAQ0hFQ0sAYWJvcnQgZHVlIHRvIFJPTExCQUNLAE1BVENIAFNFQVJDSABVU0lORwBFTkFCTEVfTk9STUFMSVpFACBVTklRVUUAREVMRVRFAFVQREFURQBSRUxFQVNFAE5PQ0FTRQBCRUZPUkUATk9ORQBJZHhMRQBTZWVrTEUAVEFCTEUAMTZMRQBJZHhHRQBTZWVrR0UAJXMgVVNJTkcgVEVNUCBCLVRSRUUAQ0FTQ0FERQAxNkJFAEFORABST1dJRABPSUQARElSRUNUX09WRVJGTE9XX1JFQUQAREVTQwBTRUxFQ1QgaWR4LCBzdGFydF9ibG9jaywgbGVhdmVzX2VuZF9ibG9jaywgZW5kX2Jsb2NrLCByb290IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IE9SREVSIEJZIGlkeCBBU0MAU0VMRUNUIGlkeCwgc3RhcnRfYmxvY2ssIGxlYXZlc19lbmRfYmxvY2ssIGVuZF9ibG9jaywgcm9vdCBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgP09SREVSIEJZIGxldmVsIERFU0MsIGlkeCBBU0MAU0VMRUNUIGxldmVsLCBpZHgsIGVuZF9ibG9jayBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPyBPUkRFUiBCWSBsZXZlbCBERVNDLCBpZHggQVNDAFNFTEVDVCBpZHggRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbD0/IE9SREVSIEJZIDEgQVNDAFNZU1RFTV9NQUxMT0MAQkxPQgBCQkIAQABVUERBVEUgT1IgRkFJTCAlUS4nJXFfc2VnZGlyJyBTRVQgbGV2ZWw9LTEsaWR4PT8gV0hFUkUgbGV2ZWw9PyBBTkQgaWR4PT8AVVBEQVRFICVRLiclcV9zZWdkaXInIFNFVCBpZHggPSA/IFdIRVJFIGxldmVsPT8gQU5EIGlkeD0/ACVzPT8AU0VMRUNUICVzIFdIRVJFIHJvd2lkPT8AU0VMRUNUIHNpemUgRlJPTSAlUS4nJXFfZG9jc2l6ZScgV0hFUkUgZG9jaWQ9PwBTRUxFQ1QgdmFsdWUgRlJPTSAlUS4nJXFfc3RhdCcgV0hFUkUgaWQ9PwA/LD8sPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCBCRVRXRUVOID8gQU5EID8AU0VMRUNUIG1heChsZXZlbCkgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCBCRVRXRUVOID8gQU5EID8AREVMRVRFIEZST00gJVEuJyVxX3NlZ21lbnRzJyBXSEVSRSBibG9ja2lkIEJFVFdFRU4gPyBBTkQgPwBVUERBVEUgJVEuJyVxX3NlZ2RpcicgU0VUIHN0YXJ0X2Jsb2NrID0gPywgcm9vdCA9ID9XSEVSRSBsZXZlbCA9ID8gQU5EIGlkeCA9ID8AU0VMRUNUIGlkeCwgc3RhcnRfYmxvY2ssIGxlYXZlc19lbmRfYmxvY2ssIGVuZF9ibG9jaywgcm9vdCBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8gQU5EIGlkeCA9ID8AREVMRVRFIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/AFNFTEVDVCBjb3VudCgqKSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPwBTRUxFQ1QgJXMgV0hFUkUgcm93aWQgPSA/AERFTEVURSBGUk9NICVRLiclcV9jb250ZW50JyBXSEVSRSByb3dpZCA9ID8AREVMRVRFIEZST00gJVEuJyVxX2RvY3NpemUnIFdIRVJFIGRvY2lkID0gPwAsID8APGV4cHI+ADxiPgA8Yj4uLi48L2I+AC0+PgAtPgBzZXBhcmF0b3JzPQB0b2tlbmNoYXJzPQBhdXRvbWVyZ2U9ADwASU5TRVJUIElOVE8gJVEuc3FsaXRlX21hc3RlciBWQUxVRVMoJ2luZGV4JywlUSwlUSwjJWQsJVEpOwBDUkVBVEUgVEFCTEUgJVEuJyVxX3NlZ21lbnRzJyhibG9ja2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGJsb2NrIEJMT0IpOwBDUkVBVEUgVEFCTEUgJVEuJyVxX2RvY3NpemUnKGRvY2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHNpemUgQkxPQik7AENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICVRLiclcV9zdGF0JyhpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB2YWx1ZSBCTE9CKTsAQ1JFQVRFIFRBQkxFICVRLiclcV9zZWdkaXInKGxldmVsIElOVEVHRVIsaWR4IElOVEVHRVIsc3RhcnRfYmxvY2sgSU5URUdFUixsZWF2ZXNfZW5kX2Jsb2NrIElOVEVHRVIsZW5kX2Jsb2NrIElOVEVHRVIscm9vdCBCTE9CLFBSSU1BUlkgS0VZKGxldmVsLCBpZHgpKTsAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHRibF9uYW1lID0gJVEsIG5hbWUgPSBDQVNFIFdIRU4gdHlwZT0ndGFibGUnIFRIRU4gJVEgV0hFTiBuYW1lIExJS0UgJ3NxbGl0ZVhfYXV0b2luZGV4JSUnIEVTQ0FQRSAnWCcgICAgICBBTkQgdHlwZT0naW5kZXgnIFRIRU4gJ3NxbGl0ZV9hdXRvaW5kZXhfJyB8fCAlUSB8fCBzdWJzdHIobmFtZSwlZCsxOCkgRUxTRSBuYW1lIEVORCBXSEVSRSB0YmxfbmFtZT0lUSBDT0xMQVRFIG5vY2FzZSBBTkQgKHR5cGU9J3RhYmxlJyBPUiB0eXBlPSdpbmRleCcgT1IgdHlwZT0ndHJpZ2dlcicpOwBEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfc2VnbWVudHMnO0RST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9zZWdkaXInO0RST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9kb2NzaXplJztEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfc3RhdCc7JXMgRFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX2NvbnRlbnQnOwBBTFRFUiBUQUJMRSAlUS4nJXFfY29udGVudCcgIFJFTkFNRSBUTyAnJXFfY29udGVudCc7AEFMVEVSIFRBQkxFICVRLiclcV9zdGF0JyAgUkVOQU1FIFRPICclcV9zdGF0JzsAQUxURVIgVEFCTEUgJVEuJyVxX3NlZ21lbnRzJyBSRU5BTUUgVE8gJyVxX3NlZ21lbnRzJzsAQUxURVIgVEFCTEUgJVEuJyVxX3NlZ2RpcicgICBSRU5BTUUgVE8gJyVxX3NlZ2Rpcic7AEFMVEVSIFRBQkxFICVRLiclcV9kb2NzaXplJyAgUkVOQU1FIFRPICclcV9kb2NzaXplJzsAOm1lbW9yeToAZmlsZToALTllOTk5ADkuMGU5OTkAKy0gCgkwMTIzNDU2Nzg5AFx1MDAwOQBTdHJpbmc4AHV0ZjgAVVRGOABVVEYtOAAyMDI0LTAzLTEyIDExOjA2OjIzIGQ4Y2Q2ZDQ5YjQ2YTM5NWIxMzk1NTM4N2QwNWU5ZTFhMmE0N2U1NGZiOTlmM2M5YjU5ODM1YmJlZmFkNmFmNzcATUFYX0ZVTkNUSU9OX0FSRz0xMjcAREVGQVVMVF9TRUNUT1JfU0laRT00MDk2AERFRkFVTFRfUEFHRV9TSVpFPTQwOTYATUFYX1ZBUklBQkxFX05VTUJFUj0zMjc2NgBNQVhfUEFHRV9TSVpFPTY1NTM2AFVURjE2AFVURi0xNgBwNQB0b28gbWFueSByZWZlcmVuY2VzIHRvICIlcyI6IG1heCA2NTUzNQBGTEFHUyBwYXJhbWV0ZXIgdG8ganNvbl92YWxpZCgpIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxNQBzcWxpdGVfc3RhdDQAZnRzNABwNABERUZBVUxUX0ZJTEVfRk9STUFUPTQASW50NjQAcHdyaXRlNjQAcHJlYWQ2NABNQUxMT0NfU09GVF9MSU1JVD0xMDI0AHNxbGl0ZV9zdGF0MwBTQVZFUE9JTlQgZnRzMwBST0xMQkFDSyBUTyBmdHMzAFJFTEVBU0UgZnRzMwBwMwBFTkFCTEVfRlRTMwBwMgBhdG4yAGF0YW4yAHJlbW92ZV9kaWFjcml0aWNzPTIAREVGQVVMVF9TWU5DSFJPTk9VUz0yAERFRkFVTFRfV0FMX1NZTkNIUk9OT1VTPTIAYXJnYz09MyB8fGFyZ2M9PTIATUFYX0RFRkFVTFRfUEFHRV9TSVpFPTgxOTIAU0VMRUNUIHRibCxpZHgsc3RhdCBGUk9NICVRLnNxbGl0ZV9zdGF0MQBBZ2dTdGVwMQByZW1vdmVfZGlhY3JpdGljcz0xAEFUT01JQ19JTlRSSU5TSUNTPTEAVEVNUF9TVE9SRT0xAGFyZ2M9PTEAdW5pY29kZTYxAFVQREFURSBPUiBGQUlMICVRLiclcV9zZWdkaXInIFNFVCBsZXZlbD0/IFdIRVJFIGxldmVsPS0xAERFRkFVTFRfSk9VUk5BTF9TSVpFX0xJTUlUPS0xAFNFTEVDVCBsZXZlbCwgY291bnQoKikgQVMgY250IEZST00gJVEuJyVxX3NlZ2RpcicgICBHUk9VUCBCWSBsZXZlbCBIQVZJTkcgY250Pj0/ICBPUkRFUiBCWSAobGV2ZWwgJSUgMTAyNCkgQVNDLCAyIERFU0MgTElNSVQgMQBTRUxFQ1QgKFNFTEVDVCBtYXgoaWR4KSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPykgKyAxAFNFTEVDVCdJTlNFUlQgSU5UTyB2YWN1dW1fZGIuJ3x8cXVvdGUobmFtZSl8fCcgU0VMRUNUKkZST00iJXciLid8fHF1b3RlKG5hbWUpRlJPTSB2YWN1dW1fZGIuc3FsaXRlX3NjaGVtYSBXSEVSRSB0eXBlPSd0YWJsZSdBTkQgY29hbGVzY2Uocm9vdHBhZ2UsMSk+MABTRUxFQ1Qgc3FsIEZST00gIiV3Ii5zcWxpdGVfc2NoZW1hIFdIRVJFIHR5cGU9J3RhYmxlJ0FORCBuYW1lPD4nc3FsaXRlX3NlcXVlbmNlJyBBTkQgY29hbGVzY2Uocm9vdHBhZ2UsMSk+MAByZW1vdmVfZGlhY3JpdGljcz0wAE1BWF9XT1JLRVJfVEhSRUFEUz0wAERFRkFVTFRfV09SS0VSX1RIUkVBRFM9MABNQVhfTU1BUF9TSVpFPTAAREVGQVVMVF9NTUFQX1NJWkU9MABUSFJFQURTQUZFPTAAOTIyMzM3MjAzNjg1NDc3NTgwAERFRkFVTFRfUENBQ0hFX0lOSVRTWj0yMABsb2cxMABNQVhfQVRUQUNIRUQ9MTAAXHUwMABNQVhfQ09NUE9VTkRfU0VMRUNUPTUwMAA/MDAwAE1BWF9DT0xVTU49MjAwMABERUZBVUxUX0NBQ0hFX1NJWkU9LTIwMDAAREVGQVVMVF9XQUxfQVVUT0NIRUNLUE9JTlQ9MTAwMABNQVhfRVhQUl9ERVBUSD0xMDAwAE1BWF9UUklHR0VSX0RFUFRIPTEwMDAAXHUwMDAwAE1BWF9MSUtFX1BBVFRFUk5fTEVOR1RIPTUwMDAwAE1BWF9WREJFX09QPTI1MDAwMDAwMABNQVhfTEVOR1RIPTEwMDAwMDAwMDAATUFYX1NRTF9MRU5HVEg9MTAwMDAwMDAwMABzZWNvbmQgYXJndW1lbnQgdG8gJSNUKCkgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gMC4wIGFuZCAxLjAAQ09NUElMRVI9Y2xhbmctMTkuMC4wAC9wcm9jL3NlbGYvZmQvACVRLgBOLgAtLQAsAG5vc2tpcHNjYW4qAHVub3JkZXJlZCoAc3o9WzAtOV0qAChzdWJxdWVyeS0ldSkAKGpvaW4tJXUpAEJhZCBwdHIgbWFwIGVudHJ5IGtleT0ldSBleHBlY3RlZD0oJXUsJXUpIGdvdD0oJXUsJXUpAG1heCByb290cGFnZSAoJXUpIGRpc2FncmVlcyB3aXRoIGhlYWRlciAoJXUpAENSRUFURSBUQUJMRSB4KHR5cGUgdGV4dCxuYW1lIHRleHQsdGJsX25hbWUgdGV4dCxyb290cGFnZSBpbnQsc3FsIHRleHQpAENSRUFURSBUQUJMRSAlUS4lcyglcykAYXV0b21hdGljIGluZGV4IG9uICVzKCVzKQBBTlkoJXMpAElOU0VSVCBJTlRPICVRLiclcV9jb250ZW50JyBWQUxVRVMoJXMpAENSRUFURSBUQUJMRSAlUS4nJXFfY29udGVudCcoJXMpAG1hbGZvcm1lZCBkYXRhYmFzZSBzY2hlbWEgKCVzKQBNRVJHRSAoJXMpAENSRUFURSBUQUJMRSAlUS5zcWxpdGVfc2VxdWVuY2UobmFtZSxzZXEpAENSRUFURSBUQUJMRSB4KGlucHV0LCB0b2tlbiwgc3RhcnQsIGVuZCwgcG9zaXRpb24pAFVQREFURSAiJXciLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHNxbGl0ZV9kcm9wX2NvbHVtbiglZCwgc3FsLCAlZCkgV0hFUkUgKHR5cGU9PSd0YWJsZScgQU5EIHRibF9uYW1lPSVRIENPTExBVEUgbm9jYXNlKQBtZW1kYiglcCwlbGxkKQAlcyglZCkAemVyb2Jsb2IoJWQpAEZUUyBleHByZXNzaW9uIHRyZWUgaXMgdG9vIGxhcmdlIChtYXhpbXVtIGRlcHRoICVkKQBFeHByZXNzaW9uIHRyZWUgaXMgdG9vIGxhcmdlIChtYXhpbXVtIGRlcHRoICVkKQAoYmxvYikAVVNFIFRFTVAgQi1UUkVFIEZPUiAlcyhPUkRFUiBCWSkAVVNFIFRFTVAgQi1UUkVFIEZPUiAlcyhESVNUSU5DVCkAUFJBR01BICIldyIuaW50ZWdyaXR5X2NoZWNrKCVRKQBVUERBVEUgIiV3Ii5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX2NvbHVtbihzcWwsIHR5cGUsIG5hbWUsICVRLCAlUSwgJWQsICVRLCAlZCwgJWQpIFdIRVJFIG5hbWUgTk9UIExJS0UgJ3NxbGl0ZVhfJSUnIEVTQ0FQRSAnWCcgIEFORCAodHlwZSAhPSAnaW5kZXgnIE9SIHRibF9uYW1lID0gJVEpAENSRUFURSBUQUJMRSB4KGtleSx2YWx1ZSx0eXBlLGF0b20saWQscGFyZW50LGZ1bGxrZXkscGF0aCxqc29uIEhJRERFTixyb290IEhJRERFTikAQ1JFQVRFIFRBQkxFIHgodGVybSwgY29sLCBkb2N1bWVudHMsIG9jY3VycmVuY2VzLCBsYW5ndWFnZWlkIEhJRERFTikAQ1JFQVRFIFRBQkxFIHgoJXMgJVEgSElEREVOLCBkb2NpZCBISURERU4sICVRIEhJRERFTikAKE5VTEwpACVjPykAU0VMRUNUIE5PVCBFWElTVFMoU0VMRUNUIGRvY2lkIEZST00gJVEuJyVxX2NvbnRlbnQnIFdIRVJFIHJvd2lkIT0/KQBSRVBMQUNFIElOVE8gJVEuJyVxX3NlZ2RpcicgVkFMVUVTKD8sPyw/LD8sPyw/KQBSRVBMQUNFIElOVE8gJVEuJyVxX3N0YXQnIFZBTFVFUyg/LD8pAFJFUExBQ0UgSU5UTyAlUS4nJXFfZG9jc2l6ZScgVkFMVUVTKD8sPykALCVzKD8pAFJFUExBQ0UgSU5UTyAlUS4nJXFfc2VnbWVudHMnKGJsb2NraWQsIGJ