galaxy-commits
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
June 2014
- 1 participants
- 233 discussions
commit/galaxy-central: guerler: Charts: Refactor nvd3 wrappers, remove excluded wrappers
by commits-noreply@bitbucket.org 07 Jun '14
by commits-noreply@bitbucket.org 07 Jun '14
07 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a932242dc2da/
Changeset: a932242dc2da
User: guerler
Date: 2014-06-07 23:51:41
Summary: Charts: Refactor nvd3 wrappers, remove excluded wrappers
Affected #: 59 files
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/build-app.js
--- a/config/plugins/visualizations/charts/static/build-app.js
+++ b/config/plugins/visualizations/charts/static/build-app.js
@@ -3,4 +3,4 @@
// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore may be freely distributed under the MIT license.
-define("mvc/ui/ui-modal",[],function(){var e=Backbone.View.extend({elMain:"body",optionsDefault:{title:"ui-modal",body:"",backdrop:!0,height:null,width:null,closing_events:!1,closing_callback:null},buttonList:{},initialize:function(e){e&&this._create(e)},show:function(e){this.initialize(e),this.options.height?(this.$body.css("height",this.options.height),this.$body.css("overflow","hidden")):this.$body.css("max-height",$(window).height()/2),this.options.width&&this.$dialog.css("width",this.options.width),this.visible?this.$el.show():this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.visible=!1,this.$el.fadeOut("fast"),this.options.closing_callback&&this.options.closing_callback()},enableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!1)},disableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!0)},showButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).show()},hideButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).hide()},getButton:function(e){var t=this.buttonList[e];return this.$buttons.find("#"+t)},scrollTop:function(){return this.$body.scrollTop()},_create:function(e){var t=this;this.options=_.defaults(e,this.optionsDefault),this.options.body=="progress"&&(this.options.body=$('<div class="progress progress-striped active"><div class="progress-bar progress-bar-info" style="width:100%"></div></div>')),this.$el&&(this.$el.remove(),$(document).off("keyup.ui-modal")),this.setElement(this._template(this.options.title)),this.$dialog=this.$el.find(".modal-dialog"),this.$body=this.$el.find(".modal-body"),this.$footer=this.$el.find(".modal-footer"),this.$buttons=this.$el.find(".buttons"),this.$backdrop=this.$el.find(".modal-backdrop"),this.$body.html(this.options.body),this.options.backdrop||this.$backdrop.removeClass("in");if(this.options.buttons){this.buttonList={};var n=0;$.each(this.options.buttons,function(e,r){var i="button-"+n++;t.$buttons.append($('<button id="'+i+'"></button>').text(e).click(r)).append(" "),t.buttonList[e]=i})}else this.$footer.hide();$(this.elMain).append($(this.el)),this.options.closing_events&&($(document).on("keyup.ui-modal",function(e){e.keyCode==27&&t.hide()}),this.$el.find(".modal-backdrop").on("click",function(){t.hide()}))},_template:function(e){return'<div class="ui-modal modal"><div class="modal-backdrop fade in" style="z-index: -1;"></div><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" style="display: none;">×</button><h4 class="title">'+e+"</h4>"+"</div>"+'<div class="modal-body" style="position: static;"></div>'+'<div class="modal-footer">'+'<div class="buttons" style="float: right;"></div>'+"</div>"+"</div"+"</div>"+"</div>"}});return{View:e}}),function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.4.4";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(t.call(r,e[i],i,e)===n)return}else for(var o in e)if(x.has(e,o)&&t.call(r,e[o],o,e)===n)return};x.map=x.collect=function(e,t,n){var r=[];return e==null?r:h&&e.map===h?e.map(t,n):(T(e,function(e,i,s){r.push(t.call(n,e,i,s))}),r)};var N="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},x.shuffle=function(e){var t,n=0,r=[];return T(e,function(e){t=x.random(n++),r[n-1]=r[t],r[t]=e}),r};var k=function(e){return x.isFunction(e)?e:function(t){return t[e]}};x.sortBy=function(e,t,n){var r=k(t);return x.pluck(x.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var L=function(e,t,n,r){var i={},s=k(t==null?x.identity:t);return T(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};x.groupBy=function(e,t,n){return L(e,t,n,function(e,t,n){(x.has(e,t)?e[t]:e[t]=[]).push(n)})},x.countBy=function(e,t,n){return L(e,t,n,function(e,t){x.has(e,t)||(e[t]=0),e[t]++})},x.sortedIndex=function(e,t,n,r){n=n==null?x.identity:k(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},x.toArray=function(e){return e?x.isArray(e)?u.call(e):e.length===+e.length?x.map(e,x.identity):x.values(e):[]},x.size=function(e){return e==null?0:e.length===+e.length?e.length:x.keys(e).length},x.first=x.head=x.take=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,0,t):e[0]},x.initial=function(e,t,n){return u.call(e,0,e.length-(t==null||n?1:t))},x.last=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,Math.max(e.length-t,0)):e[e.length-1]},x.rest=x.tail=x.drop=function(e,t,n){return u.call(e,t==null||n?1:t)},x.compact=function(e){return x.filter(e,x.identity)};var A=function(e,t,n){return T(e,function(e){x.isArray(e)?t?o.apply(n,e):A(e,t,n):n.push(e)}),n};x.flatten=function(e,t){return A(e,t,[])},x.without=function(e){return x.difference(e,u.call(arguments,1))},x.uniq=x.unique=function(e,t,n,r){x.isFunction(t)&&(r=n,n=t,t=!1);var i=n?x.map(e,n,r):e,s=[],o=[];return T(i,function(n,r){if(t?!r||o[o.length-1]!==n:!x.contains(o,n))o.push(n),s.push(e[r])}),s},x.union=function(){return x.uniq(a.apply(r,arguments))},x.intersection=function(e){var t=u.call(arguments,1);return x.filter(x.uniq(e),function(e){return x.every(t,function(t){return x.indexOf(t,e)>=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=u.call(arguments),t=x.max(x.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=x.pluck(e,""+r);return n},x.unzip=function(e){var t=[];return x.each(e,function(e,n){x.each(e,function(e,r){t.length<=r&&(t[r]=[]),t[r][n]=e})}),t},x.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},x.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=x.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(y&&e.indexOf===y)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},x.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(b&&e.lastIndexOf===b)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},x.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s};var O=function(){};x.bind=function(e,t){var n,r;if(e.bind===S&&S)return S.apply(e,u.call(arguments,1));if(!x.isFunction(e))throw new TypeError;return n=u.call(arguments,2),r=function(){if(this instanceof r){O.prototype=e.prototype;var i=new O;O.prototype=null;var s=e.apply(i,n.concat(u.call(arguments)));return Object(s)===s?s:i}return e.apply(t,n.concat(u.call(arguments)))}},x.partial=function(e){var t=u.call(arguments,1);return function(){return e.apply(this,t.concat(u.call(arguments)))}},x.bindAll=function(e){var t=u.call(arguments,1);if(t.length===0)throw new Error("bindAll must be passed function names");return T(t,function(t){e[t]=x.bind(e[t],e)}),e},x.memoize=function(e,t){var n={};return t||(t=x.identity),function(){var r=t.apply(this,arguments);return x.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},x.delay=function(e,t){var n=u.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},x.defer=function(e){return x.delay.apply(x,[e,1].concat(u.call(arguments,1)))},x.throttle=function(e,t,n){var r,i,s,o,u=0,a=function(){u=new Date,s=null,o=e.apply(r,i)};return function(){var f=new Date;!u&&n===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0?(clearTimeout(s),s=null,u=f,o=e.apply(r,i)):s||(s=setTimeout(a,l)),o}},x.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},x.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},x.wrap=function(e,t){return function(){var n=[e];return o.apply(n,arguments),t.apply(this,n)}},x.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push(e[n]);return t},x.pairs=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push([n,e[n]]);return t},x.invert=function(e){var t={};for(var n in e)x.has(e,n)&&(t[e[n]]=n);return t},x.functions=x.methods=function(e){var t=[];for(var n in e)x.isFunction(e[n])&&t.push(n);return t.sort()},x.extend=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},x.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return T(n,function(n){n in e&&(t[n]=e[n])}),t},x.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)x.contains(n,i)||(t[i]=e[i]);return t},x.defaults=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e},x.clone=function(e){return x.isObject(e)?x.isArray(e)?e.slice():x.extend({},e):e},x.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof x&&(e=e._wrapped),t instanceof x&&(t=t._wrapped);var i=f.call(e);if(i!=f.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,l=t.constructor;if(a!==l&&!(x.isFunction(a)&&a instanceof a&&x.isFunction(l)&&l instanceof l))return!1;for(var c in e)if(x.has(e,c)){o++;if(!(u=x.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(x.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};x.isEqual=function(e,t){return M(e,t,[],[])},x.isEmpty=function(e){if(e==null)return!0;if(x.isArray(e)||x.isString(e))return e.length===0;for(var t in e)if(x.has(e,t))return!1;return!0},x.isElement=function(e){return!!e&&e.nodeType===1},x.isArray=w||function(e){return f.call(e)=="[object Array]"},x.isObject=function(e){return e===Object(e)},T(["Arguments","Function","String","Number","Date","RegExp"],function(e){x["is"+e]=function(t){return f.call(t)=="[object "+e+"]"}}),x.isArguments(arguments)||(x.isArguments=function(e){return!!e&&!!x.has(e,"callee")}),typeof /./!="function"&&(x.isFunction=function(e){return typeof e=="function"}),x.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},x.isNaN=function(e){return x.isNumber(e)&&e!=+e},x.isBoolean=function(e){return e===!0||e===!1||f.call(e)=="[object Boolean]"},x.isNull=function(e){return e===null},x.isUndefined=function(e){return e===void 0},x.has=function(e,t){return l.call(e,t)},x.noConflict=function(){return e._=t,this},x.identity=function(e){return e},x.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},x.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var _={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}.call(this),define("libs/underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("utils/utils",["libs/underscore"],function(e){function t(e,t,r){n("GET",e,{},t,r)}function n(e,t,n,r,i){if(e=="GET"||e=="DELETE")t.indexOf("?")==-1?t+="?":t+="&",t+=$.param(n);var s=new XMLHttpRequest;s.open(e,t,!0),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Cache-Control","no-cache"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-Type","application/json"),s.onloadend=function(){var e=s.status;try{response=jQuery.parseJSON(s.responseText)}catch(t){response=s.responseText}e==200?r&&r(response):i&&i(response)},e=="GET"||e=="DELETE"?s.send():s.send(JSON.stringify(n))}function r(e,t){var n=$('<div class="'+e+'"></div>');n.appendTo(":eq(0)");var r=n.css(t);return n.remove(),r}function i(e){$('link[href^="'+e+'"]').length||$('<link href="'+galaxy_config.root+e+'" rel="stylesheet">').appendTo("head")}function s(t,n){return t?e.defaults(t,n):n}function o(e,t){var n="";if(e>=1e11)e/=1e11,n="TB";else if(e>=1e8)e/=1e8,n="GB";else if(e>=1e5)e/=1e5,n="MB";else if(e>=100)e/=100,n="KB";else{if(!(e>0))return"<strong>-</strong>";e*=10,n="b"}var r=Math.round(e)/10;return t?r+" "+n:"<strong>"+r+"</strong> "+n}function u(){return(new Date).getTime().toString(36)}function a(e){var t=$("<p></p>");return t.append(e),t}function f(){var e=new Date,t=(e.getHours()<10?"0":"")+e.getHours(),n=(e.getMinutes()<10?"0":"")+e.getMinutes(),r=e.getDate()+"/"+(e.getMonth()+1)+"/"+e.getFullYear()+", "+t+":"+n;return r}return{cssLoadFile:i,cssGetAttribute:r,get:t,merge:s,bytesToString:o,uuid:u,time:f,wrap:a,request:n}}),define("mvc/ui/ui-portlet",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,optionsDefault:{title:"",icon:"",buttons:null,body:null,scrollable:!0,nopadding:!1,operations:null,placement:"bottom"},$title:null,$content:null,$buttons:null,$operations:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$content=this.$el.find("#content"),this.$title=this.$el.find("#portlet-header-text");var n=this.$el.find("#portlet-content");this.options.scrollable?n.addClass("scroll"):this.options.title?n.addClass("no-scroll"):n.addClass("no-scroll-no-title"),this.options.nopadding&&(n.css("padding","0px"),this.$content.css("padding","0px")),this.$buttons=$(this.el).find("#buttons");if(this.options.buttons){var r=this;$.each(this.options.buttons,function(e,t){t.$el.prop("id",e),r.$buttons.append(t.$el)})}else this.$buttons.remove();this.$operations=$(this.el).find("#operations");if(this.options.operations){var r=this;$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$operations.append(t.$el)})}this.options.body&&this.append(this.options.body)},append:function(t){this.$content.append(e.wrap(t))},content:function(){return this.$content},show:function(){this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},enableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!1)},disableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!0)},hideOperation:function(e){this.$operations.find("#"+e).hide()},showOperation:function(e){this.$operations.find("#"+e).show()},setOperation:function(e,t){var n=this.$operations.find("#"+e);n.off("click"),n.on("click",t)},title:function(e){var t=this.$title;return e&&t.html(e),t.html()},_template:function(e){var t='<div class="ui-portlet">';return e.title&&(t+='<div id="portlet-header" class="portlet-header"><div id="operations" style="float: right;"></div><h3>',e.icon&&(t+='<i class="icon fa '+e.icon+'"> </i>'),t+='<span id="portlet-header-text">'+e.title+"</span>"+"</h3>"+"</div>"),t+='<div id="portlet-content" class="portlet-content">',e.placement=="top"&&(t+='<div id="buttons" class="buttons"></div>'),t+='<div id="content" class="content"></div>',e.placement=="bottom"&&(t+='<div id="buttons" class="buttons"></div>'),t+="</div></div>",t}});return{View:t}}),define("plugin/library/ui-select",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{id:"",cls:"",empty:"No data available",visible:!0,wait:!1},selected:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.selected=this.options.value,this.setElement(this._template(this.options)),this.$select=this.$el.find("#select"),this.$icon=this.$el.find("#icon");var n=this;this.$select.on("change",function(){n.value(n.$select.val())}),this.on("change",function(){n.options.onchange&&n.options.onchange(n.value())}),this._refresh(),this.options.visible||this.hide(),this.options.wait?this.wait():this.show()},value:function(e){var t=this.selected;e!==undefined&&(this.selected=e,this.$select.val(e));var n=this.selected;return n&&n!=t&&this.options.onchange&&this.options.onchange(n),n},first:function(){var e=this.$select.find("option");return e.length>0?e.val():undefined},text:function(){return this.$select.find("option:selected").text()},show:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-caret-down"),this.$select.show(),this.$el.show()},hide:function(){this.$el.hide()},wait:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-spinner fa-spin"),this.$select.hide()},disabled:function(){return this.$select.is(":disabled")},enable:function(){this.$select.prop("disabled",!1)},disable:function(){this.$select.prop("disabled",!0)},add:function(e){this.$select.append(this._templateOption(e)),this._refresh()},del:function(e){this.$select.find("option[value="+e+"]").remove(),this.$select.trigger("change"),this._refresh()},update:function(e){this.$select.find("option").remove();for(var t in e)this.$select.append(this._templateOption(e[t]));this._refresh()},setOnChange:function(e){this.options.onchange=e},exists:function(e){return this.$select.find("option[value="+e+"]").length>0},_refresh:function(){this.$select.find("option[value=null]").remove();var e=this.$select.find("option").length;e==0?(this.disable(),this.$select.append(this._templateOption({value:"null",label:this.options.empty}))):this.enable(),this.selected&&this.$select.val(this.selected)},_templateOption:function(e){return'<option value="'+e.value+'">'+e.label+"</option>"},_template:function(e){var t='<div id="'+e.id+'" class="ui-select">'+'<div class="button">'+'<i id="icon"/>'+"</div>"+'<select id="select" class="select '+e.cls+" "+e.id+'">';for(key in e.data){var n=e.data[key],r="";if(n.value==e.value||n.value=="")r="selected";t+='<option value="'+n.value+'" '+r+">"+n.label+"</option>"}return t+="</select></div>",t}});return{View:t}}),define("plugin/library/ui",["utils/utils","plugin/library/ui-select","mvc/ui/ui-modal"],function(e,t,n){var r=Backbone.View.extend({optionsDefault:{url:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},_template:function(e){return'<img class="ui-image '+e.cls+'" src="'+e.url+'"/>'}}),i=Backbone.View.extend({optionsDefault:{title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.html(e)},_template:function(e){return'<label class="ui-label '+e.cls+'">'+e.title+"</label>"},value:function(){return options.title}}),s=Backbone.View.extend({optionsDefault:{id:null,title:"","float":"right",cls:"btn btn-default",icon:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t='<button id="'+e.id+'" type="submit" style="float: '+e.float+';" type="button" class="ui-button '+e.cls+'">';return e.icon&&(t+='<i class="icon fa '+e.icon+'"></i> '),t+=e.title+"</button>",t}}),o=Backbone.View.extend({optionsDefault:{"float":"right",icon:"",tooltip:"",placement:"bottom",title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){return'<div><span class="fa '+e.icon+'" class="ui-icon"/> '+e.title+"</div>"}}),u=Backbone.View.extend({optionsDefault:{title:"",id:null,"float":"right",cls:"icon-btn",icon:"",tooltip:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t="";e.title&&(t="width: auto;");var n='<div id="'+e.id+'" style="float: '+e.float+"; "+t+'" class="ui-button-icon '+e.cls+'">';return e.title?n+='<div class="button"><i class="icon fa '+e.icon+'"/> '+'<span class="title">'+e.title+"</span>"+"</div>":n+='<i class="icon fa '+e.icon+'"/>',n+="</div>",n}}),a=Backbone.View.extend({optionsDefault:{title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick)},_template:function(e){return'<div><a href="javascript:void(0)" class="ui-anchor '+e.cls+'">'+e.title+"</a></div>"}}),f=Backbone.View.extend({optionsDefault:{message:"",status:"info",persistent:!1},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement("<div></div>")},update:function(t){this.options=e.merge(t,this.optionsDefault);if(t.message!=""){this.$el.html(this._template(this.options)),this.$el.find(".alert").append(t.message),this.$el.fadeIn();if(!t.persistent){var n=this;window.setTimeout(function(){n.$el.is(":visible")?n.$el.fadeOut():n.$el.hide()},3e3)}}else this.$el.fadeOut()},_template:function(e){return'<div class="ui-message alert alert-'+e.status+'"/>'}}),l=Backbone.View.extend({optionsDefault:{onclick:null,searchword:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options));var n=this;this.options.onclick&&this.$el.on("submit",function(e){var t=n.$el.find("#search");n.options.onclick(t.val())})},_template:function(e){return'<div class="ui-search"><form onsubmit="return false;"><input id="search" class="form-control input-sm" type="text" name="search" placeholder="Search..." value="'+e.searchword+'">'+'<button type="submit" class="btn search-btn">'+'<i class="fa fa-search"></i>'+"</button>"+"</form>"+"</div>"}}),c=Backbone.View.extend({optionsDefault:{id:"",title:"",target:"",href:"",onunload:null,onclick:null,visible:!0,icon:null,tag:""},$menu:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement($(this._template(this.options)));var n=$(this.el).find(".root"),r=this;n.on("click",function(e){e.preventDefault(),r.options.onclick&&r.options.onclick()}),this.options.visible||this.hide()},show:function(){$(this.el).show()},hide:function(){$(this.el).hide()},addMenu:function(t){var n={title:"",target:"",href:"",onclick:null,divider:!1,icon:null,cls:"button-menu btn-group"};n=e.merge(t,n),this.$menu||($(this.el).append(this._templateMenu()),this.$menu=$(this.el).find(".menu"));var r=$(this._templateMenuItem(n));r.on("click",function(e){e.preventDefault(),n.onclick&&n.onclick()}),this.$menu.append(r),n.divider&&this.$menu.append($(this._templateDivider()))},_templateMenuItem:function(e){var t='<li><a href="'+e.href+'" target="'+e.target+'">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),t+=" "+e.title+"</a>"+"</li>",t},_templateMenu:function(){return'<ul class="menu dropdown-menu pull-right" role="menu"></ul>'},_templateDivider:function(){return'<li class="divider"></li>'},_template:function(e){var t='<div id="'+e.id+'" class="ui-button-menu '+e.cls+'">'+'<button type="button" class="root btn btn-default dropdown-toggle" data-toggle="dropdown">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),"</button></div>",t}}),h=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0,cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.$el.on("input",function(){n.options.onchange&&n.options.onchange(n.$el.val())})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<input id="'+e.id+'" type="'+e.type+'" value="'+e.value+'" placeholder="'+e.placeholder+'" class="ui-input '+e.cls+'">'}}),p=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0,cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.$el.on("input",function(){n.options.onchange&&n.options.onchange(n.$el.val())})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<textarea id="'+e.id+'" class="ui-textarea '+e.cls+'" rows="5"></textarea>'}}),d=Backbone.View.extend({optionsDefault:{value:"",visible:!0,cls:"",data:[],id:e.uuid()},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.visible||this.$el.hide(),this.options.value&&this.value(this.options.value),this.current=this.options.value;var n=this;this.$el.find("input").on("change",function(){n.value(n._getValue())})},value:function(e){var t=this.current;e!==undefined&&(this.$el.find("label").removeClass("active"),this.$el.find('[value="'+e+'"]').closest("label").addClass("active"),this.current=e);var n=this.current;return n!=t&&this.options.onchange&&this.options.onchange(this.current),this.current},_getValue:function(){var e=this.$el.find(":checked"),t=null;return e.length>0&&(t=e.val()),t},_template:function(e){var t='<div class="btn-group ui-radiobutton" data-toggle="buttons">';for(key in e.data){var n=e.data[key];t+='<label class="btn btn-default"><input type="radio" name="'+e.id+'" value="'+n.value+'" selected>'+n.label+"</label>"}return t+="</div>",t}});return{Label:i,Button:s,Icon:o,ButtonIcon:u,Input:h,Anchor:a,Message:f,Searchbox:l,Select:t,ButtonMenu:c,Modal:n,Textarea:p,Image:r,RadioButton:d}}),define("plugin/library/jobs",["utils/utils"],function(e){return Backbone.Model.extend({initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(e,t,n,r,i){var s=this;e.state("wait","Requesting job results...");var o=e.get("dataset_id_job");o!=""?s._wait(e,r,i):s._submit(e,t,n,r,i)},cleanup:function(t){var n=this,r=t.get("dataset_id_job");r!=""&&(e.request("PUT",config.root+"api/histories/none/contents/"+r,{deleted:!0},function(){n._refreshHdas()}),t.set("dataset_id_job",""))},_submit:function(t,n,r,i,s){var o=this,u=t.id,a=t.get("type"),f=t.definition;data={tool_id:"charts",inputs:{input:{id:t.get("dataset_id"),src:"hda"},module:f.execute,columns:r,settings:n}},t.state("wait","Sending job request..."),e.request("POST",config.root+"api/tools",data,function(e){if(!e.outputs||e.outputs.length==0)t.state("failed","Job submission failed. No response."),s&&s();else{o._refreshHdas();var n=e.outputs[0];t.state("wait","Your job has been queued. You may close the browser window. The job will run in the background."),t.set("dataset_id_job",n.id),this.app.storage.save(),o._wait(t,i,s)}},function(e){var n="";e&&e.message&&e.message.data&&e.message.data.input&&(n=e.message.data.input+"."),t.state("failed","This visualization requires the 'charts' tool. Please make sure it is installed. "+n),s&&s()})},_wait:function(t,n,r){var i=this;e.request("GET",config.root+"api/datasets/"+t.get("dataset_id_job"),{},function(e){var s=!1;switch(e.state){case"ok":t.state("wait","Job completed successfully..."),n&&n(e),s=!0;break;case"error":t.state("failed","Job has failed. Please check the history for details."),r&&r(e),s=!0;break;case"running":t.state("wait","Your job is running. You may close the browser window. The job will continue in the background.")}s||setTimeout(function(){i._wait(t,n,r)},i.app.config.get("query_timeout"))})},_refreshHdas:function(){Galaxy&&Galaxy.currHistoryPanel&&Galaxy.currHistoryPanel.refreshContents()}})}),define("plugin/library/datasets",["utils/utils"],function(e){return Backbone.Collection.extend({list:{},cache:{},initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(e,t,n){var r=this;e.groups?this._get_dataset(e.id,function(){r._get(e,t)}):this._get_dataset(e.id,t,n)},_get_dataset:function(t,n,r){var i=this.list[t];if(i){n(i);return}var s=this;e.request("GET",config.root+"api/datasets/"+t,{},function(e){switch(e.state){case"error":r&&r(e);break;default:s.list[t]=e,n(e)}})},_block_id:function(e,t){return e.id+"_"+e.start+"_"+e.end+"_"+t},_get:function(e,t){e.start||(e.start=0),e.end||(e.end=this.app.config.get("query_limit"));var n=[],r={},i=0;for(var s in e.groups){var o=e.groups[s];for(var u in o.columns){var a=o.columns[u].index,f=this._block_id(e,a);if(this.cache[f]||a==="auto")continue;!r[a]&&a!==undefined&&(r[a]=i,n.push(a),i++)}}if(n.length==0){this._fill_from_cache(e),t(e);return}var l={dataset_id:e.id,start:e.start,end:e.end,columns:n},c=this;this._fetch(l,function(r){for(var i in r){var s=n[i],o=c._block_id(e,s);c.cache[o]=r[i]}c._fill_from_cache(e),t(e)})},_fill_from_cache:function(e){console.debug("Datasets::_fill_from_cache() - Filling request from cache.");var t=e.start,n=0;for(var r in e.groups){var i=e.groups[r];for(var s in i.columns){var o=i.columns[s],u=this._block_id(e,o.index),a=this.cache[u];a&&(n=Math.max(n,a.length))}}n==0&&console.debug("FAILED - Datasets::_fill_from_cache() - Invalid range.");for(var r in e.groups){var i=e.groups[r];i.values=[];for(var f=0;f<n;f++)i.values[f]={x:parseInt(f)+t}}for(var r in e.groups){var i=e.groups[r];for(var s in i.columns){var o=i.columns[s];if(o.index=="auto")for(var f=0;f<n;f++){var l=i.values[f];l[s]=parseInt(f)+t}else{var u=this._block_id(e,o.index),a=this.cache[u];for(var f=0;f<n;f++){var l=i.values[f],c=a[f];isNaN(c)&&!o.is_label&&(c=0),l[s]=c}}}}},_fetch:function(t,n){var r=t.start?t.start:0,i=Math.abs(t.end-t.start),s=this.app.config.get("query_limit");if(!i||i>s)i=s;var o=0;t.columns&&(o=t.columns.length,console.debug("Datasets::_fetch() - Fetching "+o+" column(s)")),o==0&&console.debug("Datasets::_fetch() - No columns requested");var u="";for(var a in t.columns)u+=t.columns[a]+",";u=u.substring(0,u.length-1);var f=this;e.request("GET",config.root+"api/datasets/"+t.dataset_id,{data_type:"raw_data",provider:"dataset-column",limit:i,offset:r,indeces:u},function(e){var t=new Array(o);for(var r=0;r<o;r++)t[r]=[];for(var r in e.data){var i=e.data[r];for(var s in i){var u=i[s];u!==undefined&&u!=2147483647&&t[s].push(u)}}console.debug("Datasets::_fetch() - Fetching complete."),n(t)})}})}),define("plugin/models/group",[],function(){return Backbone.Model.extend({defaults:{key:"Data label",date:""},reset:function(){this.clear({silent:!0}).set(this.defaults),this.trigger("reset",this)}})}),define("plugin/models/groups",["plugin/models/group"],function(e){return Backbone.Collection.extend({model:e})}),define("plugin/library/deferred",["utils/utils"],function(e){return Backbone.Model.extend({queue:[],process:{},counter:0,initialize:function(){this.on("refresh",function(){for(var e in this.queue)if(this.counter==0){var t=this.queue[e];this.queue.splice(e,1),t()}})},execute:function(e){this.queue.push(e),this.trigger("refresh")},register:function(){var t=e.uuid();return this.process[t]=!0,this.counter++,console.debug("Deferred:register() - Registering "+t),t},done:function(e){this.process[e]&&(delete this.process[e],this.counter--,console.debug("Deferred:done() - Unregistering "+e),this.trigger("refresh"))},ready:function(){return this.counter==0}})});var Visualization=Backbone.Model.extend({defaults:{config:{}},urlRoot:function(){var e="/api/visualizations";return window.galaxy_config&&galaxy_config.root?galaxy_config.root+e:e},initialize:function(e){_.isObject(e.config)&&_.isObject(this.defaults.config)&&_.defaults(e.config,this.defaults.config),this._setUpListeners()},_setUpListeners:function(){},set:function(e,t){if(e==="config"){var n=this.get("config");_.isObject(n)&&(t=_.extend(_.clone(n),t))}return Backbone.Model.prototype.set.call(this,e,t),this},toString:function(){var e=this.get("id")||"";return this.get("title")&&(e+=":"+this.get("title")),"Visualization("+e+")"}}),VisualizationCollection=Backbone.Collection.extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(e,t){t=t||{}},set:function(e,t){var n=this;e=_.map(e,function(e){var t=n.get(e.id);if(!t)return e;var r=t.toJSON();return _.extend(r,e),r}),Backbone.Collection.prototype.set.call(this,e,t)},toString:function(){return["VisualizationCollection(",[this.historyId,this.length].join(),")"].join("")}});define("mvc/visualization/visualization-model",function(){}),define("plugin/models/chart",["plugin/models/groups","plugin/library/deferred","mvc/visualization/visualization-model"],function(e,t){return Backbone.Model.extend({defaults:{id:null,title:"",type:"",date:null,state:"",state_info:"",modified:!1,dataset_id:"",dataset_id_job:""},initialize:function(n){this.groups=new e,this.settings=new Backbone.Model,this.deferred=new t},reset:function(){this.clear({silent:!0}).set(this.defaults),this.groups.reset(),this.settings.clear(),this.trigger("reset",this)},copy:function(e){var t=this;t.clear({silent:!0}).set(this.defaults),t.set(e.attributes),t.settings=e.settings.clone(),t.groups.reset(),e.groups.each(function(e){t.groups.add(e.clone())}),t.trigger("change",t)},state:function(e,t){this.set("state",e),this.set("state_info",t),this.trigger("set:state"),console.debug("Chart:state() - "+t+" ("+e+")")}})}),define("plugin/library/storage",["utils/utils","plugin/models/chart","plugin/models/group"],function(e,t,n){return Backbone.Model.extend({vis:null,initialize:function(e){this.app=e,this.chart=this.app.chart,this.options=this.app.options,this.id=this.options.id,this.vis=new Visualization({type:"charts",config:{dataset_id:this.options.config.dataset_id,chart_dict:{}}}),this.id&&(this.vis.id=this.id);var t=this.options.config.chart_dict;t&&(this.vis.get("config").chart_dict=t)},save:function(){var e=this.app.chart;this.vis.get("config").chart_dict={};var t=e.get("title");t!=""&&this.vis.set("title",t);var n={attributes:e.attributes,settings:e.settings.attributes,groups:[]};e.groups.each(function(e){n.groups.push(e.attributes)}),this.vis.get("config").chart_dict=n;var r=this;this.vis.save().fail(function(e,t,n){console.error(e,t,n)}).then(function(e){e&&e.id&&(r.id=e.id)})},load:function(){var e=this.vis.get("config").chart_dict;if(!e.attributes)return!1;var t=e.attributes.type;if(!t)return console.debug("Storage::load() - Chart type not provided. Invalid format."),!1;var r=this.app.types.get(t);if(!r)return console.debug("Storage::load() - Chart type not supported. Please re-configure the chart. Resetting chart."),!1;console.debug("Storage::load() - Loading chart type "+t+"."),this.chart.definition=r,this.chart.set(e.attributes),this.chart.state("ok","Loading saved visualization..."),this.chart.settings.set(e.settings);for(var i in e.groups)this.chart.groups.add(new n(e.groups[i]));return this.chart.set("modified",!1),!0}})}),define("plugin/library/screenshot",["libs/underscore"],function(e){function t(e,t,i){var s=new XMLSerializer,o="",u=this,a=0,f=0;return e.find("svg").each(function(){var e=$(this);n(e),a=parseInt(e.css("height")),f=parseInt(e.css("width")),e.attr({version:"1.1",xmlns:"http://www.w3.org/2000/svg",width:f,height:a}),e.find(".highcharts-button").hide(),o+=s.serializeToString(this),e.find(".highcharts-button").show()}),r(e,t,{filename:i||"chart",type:"application/pdf",height:a,width:f,scale:2,svg:o}),o}function n(e){for(var t in document.styleSheets){var n=document.styleSheets[t],r=n.cssRules;if(r)for(var i=0,s=r.length;i<s;i++)try{e.find(r[i].selectorText).each(function(e,t){t.style.cssText+=r[i].style.cssText})}catch(o){}}}function r(e,t,n){var r=e.find("#viewport-form");r.length===0&&(r=$("<form>",{id:"viewport-form",method:"post",action:t,display:"none"}),e.append(r)),r.empty();for(name in n){var i=$("<input/>",{type:"hidden",name:name,value:n[name]});r.append(i)}try{r.submit()}catch(s){console.log(s)}}return{create:t}}),define("plugin/views/viewport",["mvc/ui/ui-portlet","plugin/library/ui","plugin/library/screenshot","utils/utils"],function(e,t,n,r){return Backbone.View.extend({container_list:[],canvas_list:[],initialize:function(e,t){this.app=e,this.chart=this.app.chart,this.options=r.merge(t,this.optionsDefault),this.setElement($(this._template())),this._fullscreen(this.$el,100),this._createContainer("div");var n=this;this.chart.on("redraw",function(){n._draw(n.chart)}),this.chart.on("set:state",function(){var e=n.$el.find("#info"),t=n.$el.find(".charts-viewport-container"),r=e.find("#icon");r.removeClass(),e.show(),e.find("#text").html(n.chart.get("state_info"));var i=n.chart.get("state");switch(i){case"ok":e.hide(),t.show();break;case"failed":r.addClass("icon fa fa-warning"),t.hide();break;default:r.addClass("icon fa fa-spinner fa-spin"),t.show()}})},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_fullscreen:function(e,t){e.css("height",$(window).height()-t),$(window).resize(function(){e.css("height",$(window).height()-t)})},_createContainer:function(e,t){t=t||1;for(var n in this.container_list)this.container_list[n].remove();this.container_list=[],this.canvas_list=[];for(var n=0;n<t;n++){var r=$(this._templateContainer(e,parseInt(100/t)));this.$el.append(r),this.container_list[n]=r,e=="svg"?this.canvas_list[n]=d3.select(r.find("#canvas")[0]):this.canvas_list[n]=r.find("#canvas")}},_draw:function(e){var t=this,n=e.deferred.register(),r=e.get("type");this.chart_definition=e.definition;var i=this.chart_definition.use_panels,s=1;i&&(s=e.groups.length),this._createContainer(this.chart_definition.tag,s),e.state("wait","Please wait...");if(!this.chart_definition.execute||this.chart_definition.execute&&e.get("modified"))this.app.jobs.cleanup(e),e.set("modified",!1);var t=this;require(["plugin/charts/"+this.app.chartPath(r)+"/wrapper"],function(r){var i=new r(t.app,{canvas:t.canvas_list});t.chart_definition.execute?t.app.jobs.request(e,t._defaultSettingsString(e),t._defaultRequestString(e),function(){i.draw(n,e,t._defaultRequestDictionary(e))},function(){e.deferred.done(n)}):i.draw(n,e,t._defaultRequestDictionary(e))})},_defaultRequestString:function(e){var t="",n=0,r=this;return e.groups.each(function(e){n++;for(var i in r.chart_definition.columns)t+=i+"_"+n+":"+(parseInt(e.get(i))+1)+", "}),t.substring(0,t.length-2)},_defaultSettingsString:function(e){var t="";for(key in e.settings.attributes)t+=key+":"+e.settings.get(key)+", ";return t.substring(0,t.length-2)},_defaultRequestDictionary:function(e){var t={groups:[]};this.chart_definition.execute?t.id=e.get("dataset_id_job"):t.id=e.get("dataset_id");var n=0,i=this;return e.groups.each(function(e){var s={};for(var o in i.chart_definition.columns){var u=i.chart_definition.columns[o];s[o]=r.merge({index:e.get(o)},u)}t.groups.push({key:++n+":"+e.get("key"),columns:s})}),t},_template:function(){return'<div class="charts-viewport"><div id="info" class="info"><span id="icon" class="icon" /><span id="text" class="text" /></div></div>'},_templateContainer:function(e,t){return'<div class="charts-viewport-container" style="width:'+t+'%;">'+'<div id="menu"/>'+"<"+e+' id="canvas" class="charts-viewport-canvas">'+"</div>"}})}),define("plugin/views/viewer",["utils/utils","plugin/library/ui","mvc/ui/ui-portlet","plugin/models/group","plugin/views/viewport","plugin/library/screenshot"],function(e,t,n,r,i,s){return Backbone.View.extend({initialize:function(e,r){this.app=e,this.chart=this.app.chart,this.viewport_view=new i(e);var o=this;this.message=new t.Message,this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Viewport",scrollable:!1,operations:{edit_button:new t.ButtonIcon({icon:"fa-edit",tooltip:"Customize this chart",title:"Editor",onclick:function(){o._wait(o.chart,function(){o.app.go("editor")})}}),picture_button:new t.ButtonIcon({icon:"fa-camera",tooltip:"Download PDF-file ("+o.app.config.get("screenshot_url")+")",title:"Screenshot",onclick:function(){o._wait(o.chart,function(){s.create(o.viewport_view.$el,o.app.config.get("screenshot_url"),o.chart.get("title"))})}})}}),this.portlet.append(this.message.$el),this.portlet.append(this.viewport_view.$el),this.setElement(this.portlet.$el);var o=this;this.chart.on("change:title",function(){o._refreshTitle()})},show:function(){this.$el.show(),$(window).trigger("resize")},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e)},_wait:function(e,t){e.deferred.ready()?t():this.message.update({message:"Your chart is currently being processed. Please wait and try again."})}})}),define("mvc/ui/ui-tabs",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(t){this.visible=!1,this.$nav=null,this.$content=null,this.first_tab=null,this.options=e.merge(t,this.optionsDefault);var n=$(this._template(this.options));this.$nav=n.find(".tab-navigation"),this.$content=n.find(".tab-content"),this.setElement(n),this.list={};var r=this;this.options.operations&&$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$nav.find(".operations").append(t.$el)});if(this.options.onnew){var i=$(this._template_tab_new(this.options));this.$nav.append(i),i.tooltip({title:"Add a new tab",placement:"bottom",container:r.$el}),i.on("click",function(e){i.tooltip("hide"),r.options.onnew()})}},add:function(e){var t=this,n=e.id,r=$(this._template_tab(e)),i=$(this._template_tab_content(e));this.list[n]=e.ondel?!0:!1,this.options.onnew?this.$nav.find("#new-tab").before(r):this.$nav.append(r),i.append(e.$el),this.$content.append(i),_.size(this.list)==1&&(r.addClass("active"),i.addClass("active"),this.first_tab=n);if(e.ondel){var s=r.find("#delete");s.tooltip({title:"Delete this tab",placement:"bottom",container:t.$el}),s.on("click",function(){return s.tooltip("destroy"),t.$el.find(".tooltip").remove(),e.ondel(),!1})}r.on("click",function(r){r.preventDefault(),e.onclick?e.onclick():t.show(n)})},del:function(e){this.$el.find("#tab-"+e).remove(),this.$el.find("#tab-content-"+e).remove(),this.first_tab==e&&(this.first_tab=null),this.first_tab!=null&&this.show(this.first_tab)},delRemovable:function(){for(var e in this.list)this.list[e]&&this.del(e)},show:function(e){this.$el.fadeIn("fast"),this.visible=!0,e&&(this.$el.find(".tab-element").removeClass("active"),this.$el.find(".tab-pane").removeClass("active"),this.$el.find("#tab-"+e).addClass("active"),this.$el.find("#tab-content-"+e).addClass("active"))},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},hideOperation:function(e){this.$nav.find("#"+e).hide()},showOperation:function(e){this.$nav.find("#"+e).show()},setOperation:function(e,t){var n=this.$nav.find("#"+e);n.off("click"),n.on("click",t)},title:function(e,t){var n=this.$el.find("#tab-title-text-"+e);return t&&n.html(t),n.html()},_template:function(e){return'<div class="ui-tabs tabbable tabs-left"><ul id="tab-navigation" class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div id="tab-content" class="tab-content"/></div>'},_template_tab_new:function(e){return'<li id="new-tab"><a href="javascript:void(0);"><i class="ui-tabs-add fa fa-plus-circle"/>'+e.title_new+"</a>"+"</li>"},_template_tab:function(e){var t='<li id="tab-'+e.id+'" class="tab-element">'+'<a id="tab-title-link-'+e.id+'" title="" href="#tab-content-'+e.id+'" data-original-title="">'+'<span id="tab-title-text-'+e.id+'">'+e.title+"</span>";return e.ondel&&(t+='<i id="delete" class="ui-tabs-delete fa fa-minus-circle"/>'),t+="</a></li>",t},_template_tab_content:function(e){return'<div id="tab-content-'+e.id+'" class="tab-pane"/>'}});return{View:t}}),define("plugin/library/ui-table",["utils/utils"],function(e){var t=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null,cls:""},events:{click:"_onclick",dblclick:"_ondblclick"},initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(t));this.$thead=n.find("thead"),this.$tbody=n.find("tbody"),this.$tmessage=n.find("tmessage"),this.setElement(n),this.row=$("<tr></tr>")},addHeader:function(e){var t=$("<th></th>");t.append(e),this.row.append(t)},appendHeader:function(){this.$thead.append(this.row),this.row=$("<tr></tr>")},add:function(e,t,n){var r=$("<td></td>");t&&r.css("width",t),n&&r.css("text-align",n),r.append(e),this.row.append(r)},append:function(e){this._commit(e)},prepend:function(e){this._commit(e,!0)},get:function(e){return this.$el.find("#"+e)},del:function(e){var t=this.$tbody.find("#"+e);t.length>0&&(t.remove(),this.row_count--,this._refresh())},delAll:function(){this.$tbody.html(""),this.row_count=0,this._refresh()},value:function(e){this.before=this.$tbody.find(".current").attr("id"),e!==undefined&&(this.$tbody.find("tr").removeClass("current"),e&&this.$tbody.find("#"+e).addClass("current"));var t=this.$tbody.find(".current").attr("id");return t===undefined?null:(t!=this.before&&this.options.onchange&&this.options.onchange(e),t)},size:function(){return this.$tbody.find("tr").length},_commit:function(e,t){this.del(e),this.row.attr("id",e),t?this.$tbody.prepend(this.row):this.$tbody.append(this.row),this.row=$("<tr></tr>"),this.row_count++,this._refresh()},_onclick:function(e){var t=this.value(),n=$(e.target).closest("tr").attr("id");n!=""&&n&&t!=n&&(this.options.onconfirm?this.options.onconfirm(n):this.value(n))},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_refresh:function(){this.row_count==0?this.$tmessage.show():this.$tmessage.hide()},_template:function(e){return'<div><table class="ui-table '+e.cls+'">'+"<thead></thead>"+'<tbody style="cursor: pointer;"></tbody>'+"</table>"+"<tmessage>"+e.content+"</tmessage>"+"<div>"}});return{View:t}}),define("plugin/views/group",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(r,i){this.app=r;var s=this;this.chart=this.app.chart,this.group=i.group,this.group_key=new t.Input({placeholder:"Data label",onchange:function(e){s.group.set("key",e)}}),this.table=new e.View({content:"No data column."});var o=$("<div/>");o.append(n.wrap((new t.Label({title:"Provide a label:"})).$el)),o.append(n.wrap(this.group_key.$el)),o.append(n.wrap((new t.Label({title:"Select columns:"})).$el)),o.append(n.wrap(this.table.$el)),this.setElement(o);var s=this;this.chart.on("change:dataset_id",function(){s._refreshTable()}),this.chart.on("change:type",function(){s._refreshTable()}),this.group.on("change:key",function(){s._refreshGroupKey()}),this.group.on("change",function(){s._refreshGroup()}),this._refreshTable(),this._refreshGroupKey(),this._refreshGroup()},_refreshTable:function(){var e=this.chart.get("dataset_id"),n=this.chart.get("type");if(!e||!n)return;var r=this,i=this.chart.definition;this.table.delAll();var s={};for(var o in i.columns){var u=i.columns[o];if(!u){console.debug("Group::_refreshTable() - Skipping column definition.");continue}var a=new t.Select.View({id:"select_"+o,wait:!0});this.table.add(u.title,"25%"),this.table.add(a.$el),this.table.append(o),s[o]=a}this.chart.state("wait","Loading metadata...");var f=this.chart.deferred.register();this.app.datasets.request({id:e},function(e){for(var t in s)r._addRow(t,e,s,i.columns[t]);r.chart.state("ok","Metadata initialized..."),r.chart.deferred.done(f)})},_addRow:function(e,t,n,r){var i=this,s=r.is_label,o=r.is_auto,u=r.is_numeric,a=[],f=n[e];o&&a.push({label:"Column: Row Number",value:"auto"});var l=t.metadata_column_types;for(var c in l){var h=!1;l[c]=="int"||l[c]=="float"?h=u:h=s,h&&a.push({label:"Column: "+(parseInt(c)+1)+" ["+l[c]+"]",value:c})}f.update(a);if(!f.exists(this.group.get(e))){var p=f.first();console.debug('Group()::_addRow() - Switching model value from "'+this.group.get(e)+'" to "'+p+'".'),this.group.set(e,p)}f.value(this.group.get(e)),f.setOnChange(function(t){i.group.set(e,t),i.chart.set("modified",!0)}),f.show()},_refreshGroup:function(){this.group.set("date",n.time())},_refreshGroupKey:function(){var e=this.group.get("key");e===undefined&&(e=""),this.group_key.value(e)}})}),define("plugin/library/ui-table-form",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){var r=Backbone.View.extend({optionsDefault:{title:"",content:"",mode:""},list:[],initialize:function(r,i){this.app=r,this.options=n.merge(i,this.optionsDefault),this.table_title=new t.Label({title:this.options.title}),this.table=new e.View({content:this.options.content});var s=$('<div class="ui-table-form"/>');this.options.title&&s.append(n.wrap(this.table_title.$el)),s.append(n.wrap(this.table.$el)),this.setElement(s)},title:function(e){this.table_title.title(e)},update:function(e,t){this.table.delAll(),this.list=[];for(var n in e)this._add(e[n].id||n,e[n],t);for(var n in this.list)this.list[n].trigger("change")},_add:function(e,n,r){var i=this,s=null,o=n.type;switch(o){case"text":s=new t.Input({id:"field-"+e,placeholder:n.placeholder,value:r.get(e),onchange:function(t){r.set(e,t)}});break;case"radiobutton":s=new t.RadioButton({id:"field-"+e,data:n.data,value:r.get(e),onchange:function(t){r.set(e,t);var s=_.findWhere(n.data,{value:t});if(s){for(var o in s.show){var u=s.show[o];i.table.get(u).show()}for(var o in s.hide){var u=s.hide[o];i.table.get(u).hide()}}}});break;case"select":s=new t.Select.View({id:"field-"+e,data:n.data,value:r.get(e),onchange:function(t){r.set(e,t);var s=_.findWhere(n.data,{value:t});if(s){for(var o in s.show){var u=s.show[o];i.table.get(u).show()}for(var o in s.hide){var u=s.hide[o];i.table.get(u).hide()}}}});break;case"dataset":s=new t.Select.View({id:"field-"+e,onchange:function(t){r.set(e,t)}}),i.app.datasets.on("all",function(){var t=[];i.app.datasets.each(function(e){e.get("datatype_id")==n.data&&t.push({value:e.get("id"),label:e.get("name")})}),s.update(t),r.get(e)||r.set(e,s.first()),s.value(r.get(e))}),i.app.datasets.trigger("all.datasets");break;case"textarea":s=new t.Textarea({id:"field-"+e,onchange:function(){r.set(e,s.value())}});break;case"separator":s=$("<div/>");break;default:s=new t.Input({id:"field-"+e,placeholder:n.placeholder,type:n.type,onchange:function(){r.set(e,s.value())}})}if(o!="separator"){r.get(e)||r.set(e,n.init),s.value(r.get(e)),this.list[e]=s;var u=$("<div/>");u.append(s.$el),n.info&&u.append('<div class="ui-table-form-info">'+n.info+"</div>"),this.options.style=="bold"?(this.table.add((new t.Label({title:n.title,cls:"form-label"})).$el),this.table.add(u)):(this.table.add('<span class="ui-table-form-title">'+n.title+"</span>","25%"),this.table.add(u))}else this.table.add('<div class="ui-table-form-separator">'+n.title+":<div/>"),this.table.add($("<div/>"));this.table.append(e)}});return{View:r}}),define("plugin/views/settings",["plugin/library/ui","plugin/library/ui-table-form","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,n){this.app=e;var r=this;this.chart=this.app.chart,this.form=new t.View({title:"Chart options:",content:"This chart type does not provide any options."}),this.setElement(this.form.$el);var r=this;this.chart.on("change",function(){r._refresh()})},_refresh:function(){var e=this.chart.definition;if(!e)return;this.form.title(e.category+" - "+e.title+":"),this.form.update(e.settings,this.chart.settings)}})}),define("plugin/views/types",["utils/utils","plugin/library/ui"],function(e,t){return Backbone.View.extend({optionsDefault:{onchange:null,ondblclick:null},events:{click:"_onclick",dblclick:"_ondblclick"},initialize:function(t,n){var r=this;this.app=t,this.options=e.merge(n,this.optionsDefault);var i=$('<div class="charts-grid"/>');this.setElement(i),this._render(),this._filter("default")},value:function(e){var t=this.$el.find(".current").attr("id");e!==undefined&&(this.$el.find(".current").removeClass("current"),this.$el.find("#"+e).addClass("current"));var n=this.$el.find(".current").attr("id");return n===undefined?null:(n!=t&&this.options.onchange&&this.options.onchange(e),n)},_filter:function(e){var t=this.app.types.attributes;for(var n in t){var r=t[n],i=this.$el.find("#"+n),s=r.keywords||"";s.indexOf(e)==-1&&e!="all"?i.hide():i.show()}},_render:function(){var t={},n=this.app.types.attributes;for(var r in n){var i=n[r],s=i.category;t[s]||(t[s]={}),t[s][r]=i}for(var s in t){var o=$('<div style="clear: both;"/>');o.append(e.wrap(this._template_header({title:s})));for(var r in t[s]){var i=t[s][r];o.append(e.wrap(this._template_item({id:r,title:i.title+" ("+i.library+")",url:config.app_root+"charts/"+this.app.chartPath(r)+"/logo.png"})))}this.$el.append(e.wrap(o))}},_onclick:function(e){var t=this.value(),n=$(e.target).closest(".item").attr("id");n!=""&&n&&t!=n&&this.value(n)},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_template_header:function(e){return'<div class="header">• '+e.title+"<div>"},_template_item:function(e){return'<div id="'+e.id+'" class="item">'+'<img class="image" src="'+e.url+'">'+'<div class="title">'+e.title+"</div>"+"<div>"}})}),define("plugin/views/editor",["mvc/ui/ui-tabs","plugin/library/ui","mvc/ui/ui-portlet","utils/utils","plugin/models/chart","plugin/models/group","plugin/views/group","plugin/views/settings","plugin/views/types"],function(e,t,n,r,i,s,o,u,a){return Backbone.View.extend({optionsDefault:{header:!0,content:"No content available."},initialize:function(i,s){var o=this;this.app=i,this.chart=this.app.chart,this.options=r.merge(s,this.optionsDefault),this.message=new t.Message,this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Editor",operations:{save:new t.ButtonIcon({icon:"fa-save",tooltip:"Draw Chart",title:"Draw",onclick:function(){o._saveChart()}}),back:new t.ButtonIcon({icon:"fa-caret-left",tooltip:"Return to Viewer",title:"Cancel",onclick:function(){o.app.go("viewer"),o.app.storage.load()}})}}),this.types=new a(i,{onchange:function(e){var t=o.app.types.get(e);t||console.debug("FAILED - Editor::onchange() - Chart type not supported."),o.chart.definition=t,o.chart.settings.clear(),o.chart.set({type:e}),o.chart.set("modified",!0),console.debug("Editor::onchange() - Switched chart type.")},ondblclick:function(e){o._saveChart()}}),this.tabs=new e.View({title_new:"Add Data",onnew:function(){var e=o._addGroupModel();o.tabs.show(e.id)}}),this.title=new t.Input({placeholder:"Chart title",onchange:function(){o.chart.set("title",o.title.value())}});var f=$("<div/>");f.append(r.wrap((new t.Label({title:"Provide a chart title:"})).$el)),f.append(r.wrap(this.title.$el)),f.append(r.wrap((new t.Label({title:"Select a chart type:"})).$el)),f.append(r.wrap(this.types.$el)),this.tabs.add({id:"main",title:"Start",$el:f}),this.settings=new u(this.app),this.tabs.add({id:"settings",title:"Configuration",$el:this.settings.$el}),this.portlet.append(this.message.$el),this.portlet.append(this.tabs.$el),this.setElement(this.portlet.$el),this.tabs.hideOperation("back");var o=this;this.chart.on("change:title",function(e){o._refreshTitle()}),this.chart.on("change:type",function(e){o.types.value(e.get("type"))}),this.chart.on("reset",function(e){o._resetChart()}),this.app.chart.on("redraw",function(e){o.portlet.showOperation("back")}),this.app.chart.groups.on("add",function(e){o._addGroup(e)}),this.app.chart.groups.on("remove",function(e){o._removeGroup(e)}),this.app.chart.groups.on("reset",function(e){o._removeAllGroups()}),this.app.chart.groups.on("change:key",function(e){o._refreshGroupKey()}),this._resetChart()},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e),this.title.value(e)},_refreshGroupKey:function(){var e=this,t=0;this.chart.groups.each(function(n){var r=n.get("key","");r==""&&(r="Chart data"),e.tabs.title(n.id,++t+": "+r)})},_addGroupModel:function(){var e=new s({id:r.uuid()});return this.chart.groups.add(e),e},_addGroup:function(e){var t=this,n=new o(this.app,{group:e});this.tabs.add({id:e.id,$el:n.$el,ondel:function(){t.chart.groups.remove(e.id)}}),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeGroup:function(e){this.tabs.del(e.id),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeAllGroups:function(e){this.tabs.delRemovable()},_resetChart:function(){this.chart.set("id",r.uuid()),this.chart.set("type","highcharts_bar"),this.chart.set("dataset_id",this.app.options.config.dataset_id),this.chart.set("title","New Chart"),this.portlet.hideOperation("back")},_saveChart:function(){this.chart.set({type:this.types.value(),title:this.title.value(),date:r.time()});if(this.chart.groups.length==0){this.message.update({message:"Please select data columns before drawing the chart."});var e=this._addGroupModel();this.tabs.show(e.id);return}var t=this,n=!0,i=this.chart.definition;this.chart.groups.each(function(e){if(!n)return;for(var r in i.columns)if(e.attributes[r]=="null"){t.message.update({status:"danger",message:"This chart type requires column types not found in your tabular file."}),t.tabs.show(e.id),n=!1;return}});if(!n)return;this.app.go("viewer");var t=this;this.chart.deferred.execute(function(){t.app.storage.save(),t.chart.trigger("redraw")})}})}),define("plugin/models/config",[],function(){return Backbone.Model.extend({defaults:{query_limit:1e3,query_timeout:100,screenshot_url:"http://export.highcharts.com/"}})}),define("plugin/charts/nvd3/common/config",[],function(){return{title:"",category:"",library:"NVD3",tag:"svg",keywords:"default nvd3",settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["x_axis_tick"]},{label:"Auto",value:"auto",hide:["x_axis_tick"]},{label:"Float",value:"f",show:["x_axis_tick"]},{label:"Exponent",value:"e",show:["x_axis_tick"]},{label:"Integer",value:"d",hide:["x_axis_tick"]},{label:"Percentage",value:"p",show:["x_axis_tick"]},{label:"Rounded",value:"r",show:["x_axis_tick"]},{label:"SI-prefix",value:"s",show:["x_axis_tick"]}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["y_axis_tick"]},{label:"Auto",value:"auto",hide:["y_axis_tick"]},{label:"Float",value:"f",show:["y_axis_tick"]},{label:"Exponent",value:"e",show:["y_axis_tick"]},{label:"Integer",value:"d",hide:["y_axis_tick"]},{label:"Percentage",value:"p",show:["y_axis_tick"]},{label:"Rounded",value:"r",show:["y_axis_tick"]},{label:"SI-prefix",value:"s",show:["y_axis_tick"]}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_legend:{title:"Others",type:"separator"},show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"radiobutton",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/nvd3/bar/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Regular",category:"Bar diagrams",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/bar_stacked/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Stacked",category:"Bar diagrams",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/bar_horizontal/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Horizontal",category:"Bar diagrams",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}},settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/nvd3/bar_horizontal_stacked/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Stacked horizontal",category:"Bar diagrams",settings:{x_axis_type:{init:"hide"}},columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/line_focus/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Line with focus",category:"Others",keywords:"default nvd3",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/pie/config",[],function(){return $.extend(!0,{},{title:"Pie chart",category:"Area charts",library:"NVD3",tag:"svg",keywords:"default nvd3",use_panels:!0,columns:{label:{title:"Labels",is_label:!0,is_auto:!0},y:{title:"Values",is_numeric:!0}},settings:{show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]},donut_ratio:{title:"Donut ratio",info:"Determine how large the donut hole will be.",type:"select",init:"0.5",data:[{label:"50%",value:"0.5"},{label:"25%",value:"0.25"},{label:"10%",value:"0.10"},{label:"0%",value:"0"}]},label_separator:{type:"separator",title:"Label settings"},label_type:{title:"Donut label",info:"What would you like to show for each slice?",type:"select",init:"percent",data:[{label:"-- Nothing --",value:"hide",hide:"label_outside"},{label:"Label column",value:"key",show:"label_outside"},{label:"Value column",value:"value",show:"label_outside"},{label:"Percentage",value:"percent",show:"label_outside"}]},label_outside:{title:"Show outside",info:"Would you like to show labels outside the donut?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}})}),define("plugin/charts/nvd3/stackedarea_full/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Expanded",category:"Area charts",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/stackedarea_stream/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Stream",category:"Area charts",keywords:"default nvd3",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/histogram/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",category:"Data processing (requires 'charts' tool from Toolshed)",execute:"histogram",columns:{y:{title:"Observations",is_numeric:!0}},settings:{x_axis_label:{init:"Values"},y_axis_label:{init:"Density"},y_axis_type:{init:"f"},y_axis_tick:{init:".2"}}})}),define("plugin/charts/nvd3/histogram_discrete/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Discrete Histogram",category:"Data processing (requires 'charts' tool from Toolshed)",execute:"histogramdiscrete",columns:{x:{title:"Observations",is_label:!0}},settings:{x_axis_label:{init:"Breaks"},y_axis_label:{init:"Density"},y_axis_type:{init:"f"},y_axis_tick:{init:".2"}}})}),define("plugin/charts/nvd3/line/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Line chart",category:"Others",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/scatter/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",category:"Others",columns:{x:{title:"Values for x-axis",is_numeric:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/stackedarea/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Regular",category:"Area charts",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/common/config",[],function(){return{title:"",category:"",library:"Highcharts",tag:"div",keywords:"highcharts",settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["x_axis_tick"]},{label:"Auto",value:"auto",hide:["x_axis_tick"]},{label:"Float",value:"f",show:["x_axis_tick"]},{label:"Exponent",value:"e",show:["x_axis_tick"]},{label:"Integer",value:"d",hide:["x_axis_tick"]},{label:"Percentage",value:"p",show:["x_axis_tick"]},{label:"Rounded",value:"r",show:["x_axis_tick"]},{label:"SI-prefix",value:"s",show:["x_axis_tick"]}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},x_axis_grid:{title:"Axis grid",info:"Would you like to show grid lines for this axis?",type:"radiobutton",init:"0",data:[{label:"On",value:"1"},{label:"Off",value:"0"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["y_axis_tick"]},{label:"Auto",value:"auto",hide:["y_axis_tick"]},{label:"Float",value:"f",show:["y_axis_tick"]},{label:"Exponent",value:"e",show:["y_axis_tick"]},{label:"Integer",value:"d",hide:["y_axis_tick"]},{label:"Percentage",value:"p",show:["y_axis_tick"]},{label:"Rounded",value:"r",show:["y_axis_tick"]},{label:"SI-prefix",value:"s",show:["y_axis_tick"]}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},y_axis_grid:{title:"Axis grid",info:"Would you like to show grid lines for this axis?",type:"radiobutton",init:"1",data:[{label:"On",value:"1"},{label:"Off",value:"0"}]},separator_legend:{title:"Others",type:"separator"},legend_enabled:{title:"Show legend",info:"Would you like to add a legend?",type:"radiobutton",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/highcharts/bar/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Regular",category:"Bar diagrams",keywords:"highcharts",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/bar_stacked/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Stacked",category:"Bar diagrams",keywords:"highcharts",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/bar_horizontal/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Horizontal",category:"Bar diagrams",keywords:"highcharts",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}},settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/highcharts/bar_horizontal_stacked/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Stacked horizontal",category:"Bar diagrams",keywords:"highcharts",settings:{x_axis_type:{init:"hide"}},columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/histogram/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",category:"Data processing (requires 'charts' tool from Toolshed)",execute:"histogram",keywords:"highcharts",columns:{y:{title:"Observations",is_numeric:!0}},settings:{x_axis_label:{init:"Values"},y_axis_label:{init:"Density"},y_axis_type:{init:"f"},y_axis_tick:{init:".2"}}})}),define("plugin/charts/highcharts/histogram_discrete/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Discrete Histogram",category:"Data processing (requires 'charts' tool from Toolshed)",execute:"histogramdiscrete",keywords:"highcharts",columns:{y:{title:"Observations",is_label:!0}},settings:{x_axis_label:{init:"Labels"},y_axis_label:{init:"Density"}}})}),define("plugin/charts/highcharts/line/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Line",category:"Others",keywords:"highcharts",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0,is_numeric:!1},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/pie/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Pie chart",category:"Area charts",keywords:"highcharts",use_panels:!0,columns:{label:{title:"Labels",is_label:!0,is_auto:!0},y:{title:"Values",is_numeric:!0}},settings:{show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]},donut_ratio:{title:"Donut ratio",info:"Determine how large the donut hole will be.",type:"select",init:"0.5",data:[{label:"50%",value:"0.5"},{label:"25%",value:"0.25"},{label:"10%",value:"0.10"},{label:"0%",value:"0"}]},label_separator:{type:"separator",title:"Label settings"},label_type:{title:"Donut label",info:"What would you like to show for each slice?",type:"select",init:"percent",data:[{label:"-- Nothing --",value:"hide",hide:"label_outside"},{label:"Label column",value:"key",show:"label_outside"},{label:"Value column",value:"value",show:"label_outside"},{label:"Percentage",value:"percent",show:"label_outside"}]},label_outside:{title:"Show outside",info:"Would you like to show labels outside the donut?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}})}),define("plugin/charts/highcharts/scatter/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",category:"Others",keywords:"highcharts",columns:{x:{title:"Values for x-axis",is_numeric:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/stackedarea/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Regular",category:"Area charts",keywords:"highcharts",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0,is_numeric:!1},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/highcharts/boxplot/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},{title:"Box plot",category:"Data processing (requires 'charts' tool from Toolshed)",library:"Highcharts",tag:"div",execute:"boxplot",keywords:"highcharts",columns:{y:{title:"Observations",is_numeric:!0}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["y_axis_tick"]},{label:"Auto",value:"auto",hide:["y_axis_tick"]},{label:"Float",value:"f",show:["y_axis_tick"]},{label:"Exponent",value:"e",show:["y_axis_tick"]},{label:"Integer",value:"d",hide:["y_axis_tick"]},{label:"Percentage",value:"p",show:["y_axis_tick"]},{label:"Rounded",value:"r",show:["y_axis_tick"]},{label:"SI-prefix",value:"s",show:["y_axis_tick"]}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},y_axis_grid:{title:"Axis grid",info:"Would you like to show grid lines for this axis?",type:"radiobutton",init:"1",data:[{label:"On",value:"1"},{label:"Off",value:"0"}]}}})}),define("plugin/charts/highcharts/heatmap/config",["plugin/charts/highcharts/common/config"],function(e){return $.extend(!0,{},e,{title:"Heatmap",category:"Others",use_panels:!0,keywords:"highcharts",columns:{x:{title:"Column labels",is_label:!0,is_numeric:!0},y:{title:"Row labels",is_label:!0,is_numeric:!0},z:{title:"Observations",is_numeric:!0}},settings:{y_axis_grid:{init:"0"}}})}),define("plugin/charts/types",["plugin/charts/nvd3/bar/config","plugin/charts/nvd3/bar_stacked/config","plugin/charts/nvd3/bar_horizontal/config","plugin/charts/nvd3/bar_horizontal_stacked/config","plugin/charts/nvd3/line_focus/config","plugin/charts/nvd3/pie/config","plugin/charts/nvd3/stackedarea_full/config","plugin/charts/nvd3/stackedarea_stream/config","plugin/charts/nvd3/histogram/config","plugin/charts/nvd3/histogram_discrete/config","plugin/charts/nvd3/line/config","plugin/charts/nvd3/scatter/config","plugin/charts/nvd3/stackedarea/config","plugin/charts/highcharts/bar/config","plugin/charts/highcharts/bar_stacked/config","plugin/charts/highcharts/bar_horizontal/config","plugin/charts/highcharts/bar_horizontal_stacked/config","plugin/charts/highcharts/histogram/config","plugin/charts/highcharts/histogram_discrete/config","plugin/charts/highcharts/line/config","plugin/charts/highcharts/pie/config","plugin/charts/highcharts/scatter/config","plugin/charts/highcharts/stackedarea/config","plugin/charts/highcharts/boxplot/config","plugin/charts/highcharts/heatmap/config"],function(e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x,T){return Backbone.Model.extend({defaults:{nvd3_bar:e,nvd3_bar_stacked:t,nvd3_bar_horizontal:n,nvd3_bar_horizontal_stacked:r,nvd3_line_focus:i,nvd3_stackedarea_full:o,nvd3_stackedarea_stream:u,nvd3_pie:s,nvd3_stackedarea:h,nvd3_line:l,nvd3_scatter:c,nvd3_histogram:a,nvd3_histogram_discrete:f,highcharts_bar:p,highcharts_bar_stacked:d,highcharts_bar_horizontal:v,highcharts_bar_horizontal_stacked:m,highcharts_stackedarea:S,highcharts_pie:w,highcharts_line:b,highcharts_scatter:E,highcharts_histogram:g,highcharts_histogram_discrete:y,highcharts_boxplot:x,highcharts_heatmap:T}})}),define("plugin/app",["mvc/ui/ui-modal","mvc/ui/ui-portlet","plugin/library/ui","utils/utils","plugin/library/jobs","plugin/library/datasets","plugin/library/storage","plugin/views/viewer","plugin/views/editor","plugin/models/config","plugin/models/chart","plugin/charts/types"],function(e,t,n,r,i,s,o,u,a,f,l,c){return Backbone.View.extend({initialize:function(t){this.options=t,Galaxy&&Galaxy.modal?this.modal=Galaxy.modal:this.modal=new e.View,this.config=new f,this.types=new c,this.chart=new l,this.jobs=new i(this),this.datasets=new s(this),this.storage=new o(this),this.viewer_view=new u(this),this.editor_view=new a(this),this.$el.append(this.viewer_view.$el),this.$el.append(this.editor_view.$el);if(!this.storage.load())this.go("editor");else{this.go("viewer");var n=this;this.chart.deferred.execute(function(){n.chart.trigger("redraw")})}},go:function(e){$(".tooltip").hide();switch(e){case"editor":this.editor_view.show(),this.viewer_view.hide();break;case"viewer":this.editor_view.hide(),this.viewer_view.show()}},chartPath:function(e){var t=e.split(/_(.+)/);return t.length>=2?t[0]+"/"+t[1]:(console.debug("FAILED App:chartPath() - Invalid format: "+e),undefined)},execute:function(e){},onunload:function(){},log:function(e,t){console.log(e+" "+t)}})});
\ No newline at end of file
+define("mvc/ui/ui-modal",[],function(){var e=Backbone.View.extend({elMain:"body",optionsDefault:{title:"ui-modal",body:"",backdrop:!0,height:null,width:null,closing_events:!1,closing_callback:null},buttonList:{},initialize:function(e){e&&this._create(e)},show:function(e){this.initialize(e),this.options.height?(this.$body.css("height",this.options.height),this.$body.css("overflow","hidden")):this.$body.css("max-height",$(window).height()/2),this.options.width&&this.$dialog.css("width",this.options.width),this.visible?this.$el.show():this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.visible=!1,this.$el.fadeOut("fast"),this.options.closing_callback&&this.options.closing_callback()},enableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!1)},disableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!0)},showButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).show()},hideButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).hide()},getButton:function(e){var t=this.buttonList[e];return this.$buttons.find("#"+t)},scrollTop:function(){return this.$body.scrollTop()},_create:function(e){var t=this;this.options=_.defaults(e,this.optionsDefault),this.options.body=="progress"&&(this.options.body=$('<div class="progress progress-striped active"><div class="progress-bar progress-bar-info" style="width:100%"></div></div>')),this.$el&&(this.$el.remove(),$(document).off("keyup.ui-modal")),this.setElement(this._template(this.options.title)),this.$dialog=this.$el.find(".modal-dialog"),this.$body=this.$el.find(".modal-body"),this.$footer=this.$el.find(".modal-footer"),this.$buttons=this.$el.find(".buttons"),this.$backdrop=this.$el.find(".modal-backdrop"),this.$body.html(this.options.body),this.options.backdrop||this.$backdrop.removeClass("in");if(this.options.buttons){this.buttonList={};var n=0;$.each(this.options.buttons,function(e,r){var i="button-"+n++;t.$buttons.append($('<button id="'+i+'"></button>').text(e).click(r)).append(" "),t.buttonList[e]=i})}else this.$footer.hide();$(this.elMain).append($(this.el)),this.options.closing_events&&($(document).on("keyup.ui-modal",function(e){e.keyCode==27&&t.hide()}),this.$el.find(".modal-backdrop").on("click",function(){t.hide()}))},_template:function(e){return'<div class="ui-modal modal"><div class="modal-backdrop fade in" style="z-index: -1;"></div><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" style="display: none;">×</button><h4 class="title">'+e+"</h4>"+"</div>"+'<div class="modal-body" style="position: static;"></div>'+'<div class="modal-footer">'+'<div class="buttons" style="float: right;"></div>'+"</div>"+"</div"+"</div>"+"</div>"}});return{View:e}}),function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.4.4";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(t.call(r,e[i],i,e)===n)return}else for(var o in e)if(x.has(e,o)&&t.call(r,e[o],o,e)===n)return};x.map=x.collect=function(e,t,n){var r=[];return e==null?r:h&&e.map===h?e.map(t,n):(T(e,function(e,i,s){r.push(t.call(n,e,i,s))}),r)};var N="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},x.shuffle=function(e){var t,n=0,r=[];return T(e,function(e){t=x.random(n++),r[n-1]=r[t],r[t]=e}),r};var k=function(e){return x.isFunction(e)?e:function(t){return t[e]}};x.sortBy=function(e,t,n){var r=k(t);return x.pluck(x.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var L=function(e,t,n,r){var i={},s=k(t==null?x.identity:t);return T(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};x.groupBy=function(e,t,n){return L(e,t,n,function(e,t,n){(x.has(e,t)?e[t]:e[t]=[]).push(n)})},x.countBy=function(e,t,n){return L(e,t,n,function(e,t){x.has(e,t)||(e[t]=0),e[t]++})},x.sortedIndex=function(e,t,n,r){n=n==null?x.identity:k(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},x.toArray=function(e){return e?x.isArray(e)?u.call(e):e.length===+e.length?x.map(e,x.identity):x.values(e):[]},x.size=function(e){return e==null?0:e.length===+e.length?e.length:x.keys(e).length},x.first=x.head=x.take=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,0,t):e[0]},x.initial=function(e,t,n){return u.call(e,0,e.length-(t==null||n?1:t))},x.last=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,Math.max(e.length-t,0)):e[e.length-1]},x.rest=x.tail=x.drop=function(e,t,n){return u.call(e,t==null||n?1:t)},x.compact=function(e){return x.filter(e,x.identity)};var A=function(e,t,n){return T(e,function(e){x.isArray(e)?t?o.apply(n,e):A(e,t,n):n.push(e)}),n};x.flatten=function(e,t){return A(e,t,[])},x.without=function(e){return x.difference(e,u.call(arguments,1))},x.uniq=x.unique=function(e,t,n,r){x.isFunction(t)&&(r=n,n=t,t=!1);var i=n?x.map(e,n,r):e,s=[],o=[];return T(i,function(n,r){if(t?!r||o[o.length-1]!==n:!x.contains(o,n))o.push(n),s.push(e[r])}),s},x.union=function(){return x.uniq(a.apply(r,arguments))},x.intersection=function(e){var t=u.call(arguments,1);return x.filter(x.uniq(e),function(e){return x.every(t,function(t){return x.indexOf(t,e)>=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=u.call(arguments),t=x.max(x.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=x.pluck(e,""+r);return n},x.unzip=function(e){var t=[];return x.each(e,function(e,n){x.each(e,function(e,r){t.length<=r&&(t[r]=[]),t[r][n]=e})}),t},x.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},x.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=x.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(y&&e.indexOf===y)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},x.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(b&&e.lastIndexOf===b)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},x.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s};var O=function(){};x.bind=function(e,t){var n,r;if(e.bind===S&&S)return S.apply(e,u.call(arguments,1));if(!x.isFunction(e))throw new TypeError;return n=u.call(arguments,2),r=function(){if(this instanceof r){O.prototype=e.prototype;var i=new O;O.prototype=null;var s=e.apply(i,n.concat(u.call(arguments)));return Object(s)===s?s:i}return e.apply(t,n.concat(u.call(arguments)))}},x.partial=function(e){var t=u.call(arguments,1);return function(){return e.apply(this,t.concat(u.call(arguments)))}},x.bindAll=function(e){var t=u.call(arguments,1);if(t.length===0)throw new Error("bindAll must be passed function names");return T(t,function(t){e[t]=x.bind(e[t],e)}),e},x.memoize=function(e,t){var n={};return t||(t=x.identity),function(){var r=t.apply(this,arguments);return x.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},x.delay=function(e,t){var n=u.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},x.defer=function(e){return x.delay.apply(x,[e,1].concat(u.call(arguments,1)))},x.throttle=function(e,t,n){var r,i,s,o,u=0,a=function(){u=new Date,s=null,o=e.apply(r,i)};return function(){var f=new Date;!u&&n===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0?(clearTimeout(s),s=null,u=f,o=e.apply(r,i)):s||(s=setTimeout(a,l)),o}},x.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},x.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},x.wrap=function(e,t){return function(){var n=[e];return o.apply(n,arguments),t.apply(this,n)}},x.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push(e[n]);return t},x.pairs=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push([n,e[n]]);return t},x.invert=function(e){var t={};for(var n in e)x.has(e,n)&&(t[e[n]]=n);return t},x.functions=x.methods=function(e){var t=[];for(var n in e)x.isFunction(e[n])&&t.push(n);return t.sort()},x.extend=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},x.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return T(n,function(n){n in e&&(t[n]=e[n])}),t},x.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)x.contains(n,i)||(t[i]=e[i]);return t},x.defaults=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e},x.clone=function(e){return x.isObject(e)?x.isArray(e)?e.slice():x.extend({},e):e},x.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof x&&(e=e._wrapped),t instanceof x&&(t=t._wrapped);var i=f.call(e);if(i!=f.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,l=t.constructor;if(a!==l&&!(x.isFunction(a)&&a instanceof a&&x.isFunction(l)&&l instanceof l))return!1;for(var c in e)if(x.has(e,c)){o++;if(!(u=x.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(x.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};x.isEqual=function(e,t){return M(e,t,[],[])},x.isEmpty=function(e){if(e==null)return!0;if(x.isArray(e)||x.isString(e))return e.length===0;for(var t in e)if(x.has(e,t))return!1;return!0},x.isElement=function(e){return!!e&&e.nodeType===1},x.isArray=w||function(e){return f.call(e)=="[object Array]"},x.isObject=function(e){return e===Object(e)},T(["Arguments","Function","String","Number","Date","RegExp"],function(e){x["is"+e]=function(t){return f.call(t)=="[object "+e+"]"}}),x.isArguments(arguments)||(x.isArguments=function(e){return!!e&&!!x.has(e,"callee")}),typeof /./!="function"&&(x.isFunction=function(e){return typeof e=="function"}),x.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},x.isNaN=function(e){return x.isNumber(e)&&e!=+e},x.isBoolean=function(e){return e===!0||e===!1||f.call(e)=="[object Boolean]"},x.isNull=function(e){return e===null},x.isUndefined=function(e){return e===void 0},x.has=function(e,t){return l.call(e,t)},x.noConflict=function(){return e._=t,this},x.identity=function(e){return e},x.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},x.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var _={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}.call(this),define("libs/underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("utils/utils",["libs/underscore"],function(e){function t(e,t,r){n("GET",e,{},t,r)}function n(e,t,n,r,i){if(e=="GET"||e=="DELETE")t.indexOf("?")==-1?t+="?":t+="&",t+=$.param(n);var s=new XMLHttpRequest;s.open(e,t,!0),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Cache-Control","no-cache"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-Type","application/json"),s.onloadend=function(){var e=s.status;try{response=jQuery.parseJSON(s.responseText)}catch(t){response=s.responseText}e==200?r&&r(response):i&&i(response)},e=="GET"||e=="DELETE"?s.send():s.send(JSON.stringify(n))}function r(e,t){var n=$('<div class="'+e+'"></div>');n.appendTo(":eq(0)");var r=n.css(t);return n.remove(),r}function i(e){$('link[href^="'+e+'"]').length||$('<link href="'+galaxy_config.root+e+'" rel="stylesheet">').appendTo("head")}function s(t,n){return t?e.defaults(t,n):n}function o(e,t){var n="";if(e>=1e11)e/=1e11,n="TB";else if(e>=1e8)e/=1e8,n="GB";else if(e>=1e5)e/=1e5,n="MB";else if(e>=100)e/=100,n="KB";else{if(!(e>0))return"<strong>-</strong>";e*=10,n="b"}var r=Math.round(e)/10;return t?r+" "+n:"<strong>"+r+"</strong> "+n}function u(){return(new Date).getTime().toString(36)}function a(e){var t=$("<p></p>");return t.append(e),t}function f(){var e=new Date,t=(e.getHours()<10?"0":"")+e.getHours(),n=(e.getMinutes()<10?"0":"")+e.getMinutes(),r=e.getDate()+"/"+(e.getMonth()+1)+"/"+e.getFullYear()+", "+t+":"+n;return r}return{cssLoadFile:i,cssGetAttribute:r,get:t,merge:s,bytesToString:o,uuid:u,time:f,wrap:a,request:n}}),define("mvc/ui/ui-portlet",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,optionsDefault:{title:"",icon:"",buttons:null,body:null,scrollable:!0,nopadding:!1,operations:null,placement:"bottom"},$title:null,$content:null,$buttons:null,$operations:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$content=this.$el.find("#content"),this.$title=this.$el.find("#portlet-header-text");var n=this.$el.find("#portlet-content");this.options.scrollable?n.addClass("scroll"):this.options.title?n.addClass("no-scroll"):n.addClass("no-scroll-no-title"),this.options.nopadding&&(n.css("padding","0px"),this.$content.css("padding","0px")),this.$buttons=$(this.el).find("#buttons");if(this.options.buttons){var r=this;$.each(this.options.buttons,function(e,t){t.$el.prop("id",e),r.$buttons.append(t.$el)})}else this.$buttons.remove();this.$operations=$(this.el).find("#operations");if(this.options.operations){var r=this;$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$operations.append(t.$el)})}this.options.body&&this.append(this.options.body)},append:function(t){this.$content.append(e.wrap(t))},content:function(){return this.$content},show:function(){this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},enableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!1)},disableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!0)},hideOperation:function(e){this.$operations.find("#"+e).hide()},showOperation:function(e){this.$operations.find("#"+e).show()},setOperation:function(e,t){var n=this.$operations.find("#"+e);n.off("click"),n.on("click",t)},title:function(e){var t=this.$title;return e&&t.html(e),t.html()},_template:function(e){var t='<div class="ui-portlet">';return e.title&&(t+='<div id="portlet-header" class="portlet-header"><div id="operations" style="float: right;"></div><h3>',e.icon&&(t+='<i class="icon fa '+e.icon+'"> </i>'),t+='<span id="portlet-header-text">'+e.title+"</span>"+"</h3>"+"</div>"),t+='<div id="portlet-content" class="portlet-content">',e.placement=="top"&&(t+='<div id="buttons" class="buttons"></div>'),t+='<div id="content" class="content"></div>',e.placement=="bottom"&&(t+='<div id="buttons" class="buttons"></div>'),t+="</div></div>",t}});return{View:t}}),define("plugin/library/ui-select",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{id:"",cls:"",empty:"No data available",visible:!0,wait:!1},selected:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.selected=this.options.value,this.setElement(this._template(this.options)),this.$select=this.$el.find("#select"),this.$icon=this.$el.find("#icon");var n=this;this.$select.on("change",function(){n.value(n.$select.val())}),this.on("change",function(){n.options.onchange&&n.options.onchange(n.value())}),this._refresh(),this.options.visible||this.hide(),this.options.wait?this.wait():this.show()},value:function(e){var t=this.selected;e!==undefined&&(this.selected=e,this.$select.val(e));var n=this.selected;return n&&n!=t&&this.options.onchange&&this.options.onchange(n),n},first:function(){var e=this.$select.find("option");return e.length>0?e.val():undefined},text:function(){return this.$select.find("option:selected").text()},show:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-caret-down"),this.$select.show(),this.$el.show()},hide:function(){this.$el.hide()},wait:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-spinner fa-spin"),this.$select.hide()},disabled:function(){return this.$select.is(":disabled")},enable:function(){this.$select.prop("disabled",!1)},disable:function(){this.$select.prop("disabled",!0)},add:function(e){this.$select.append(this._templateOption(e)),this._refresh()},del:function(e){this.$select.find("option[value="+e+"]").remove(),this.$select.trigger("change"),this._refresh()},update:function(e){this.$select.find("option").remove();for(var t in e)this.$select.append(this._templateOption(e[t]));this._refresh()},setOnChange:function(e){this.options.onchange=e},exists:function(e){return this.$select.find("option[value="+e+"]").length>0},_refresh:function(){this.$select.find("option[value=null]").remove();var e=this.$select.find("option").length;e==0?(this.disable(),this.$select.append(this._templateOption({value:"null",label:this.options.empty}))):this.enable(),this.selected&&this.$select.val(this.selected)},_templateOption:function(e){return'<option value="'+e.value+'">'+e.label+"</option>"},_template:function(e){var t='<div id="'+e.id+'" class="ui-select">'+'<div class="button">'+'<i id="icon"/>'+"</div>"+'<select id="select" class="select '+e.cls+" "+e.id+'">';for(key in e.data){var n=e.data[key],r="";if(n.value==e.value||n.value=="")r="selected";t+='<option value="'+n.value+'" '+r+">"+n.label+"</option>"}return t+="</select></div>",t}});return{View:t}}),define("plugin/library/ui",["utils/utils","plugin/library/ui-select","mvc/ui/ui-modal"],function(e,t,n){var r=Backbone.View.extend({optionsDefault:{url:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},_template:function(e){return'<img class="ui-image '+e.cls+'" src="'+e.url+'"/>'}}),i=Backbone.View.extend({optionsDefault:{title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.html(e)},_template:function(e){return'<label class="ui-label '+e.cls+'">'+e.title+"</label>"},value:function(){return options.title}}),s=Backbone.View.extend({optionsDefault:{id:null,title:"","float":"right",cls:"btn btn-default",icon:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t='<button id="'+e.id+'" type="submit" style="float: '+e.float+';" type="button" class="ui-button '+e.cls+'">';return e.icon&&(t+='<i class="icon fa '+e.icon+'"></i> '),t+=e.title+"</button>",t}}),o=Backbone.View.extend({optionsDefault:{"float":"right",icon:"",tooltip:"",placement:"bottom",title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){return'<div><span class="fa '+e.icon+'" class="ui-icon"/> '+e.title+"</div>"}}),u=Backbone.View.extend({optionsDefault:{title:"",id:null,"float":"right",cls:"icon-btn",icon:"",tooltip:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t="";e.title&&(t="width: auto;");var n='<div id="'+e.id+'" style="float: '+e.float+"; "+t+'" class="ui-button-icon '+e.cls+'">';return e.title?n+='<div class="button"><i class="icon fa '+e.icon+'"/> '+'<span class="title">'+e.title+"</span>"+"</div>":n+='<i class="icon fa '+e.icon+'"/>',n+="</div>",n}}),a=Backbone.View.extend({optionsDefault:{title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick)},_template:function(e){return'<div><a href="javascript:void(0)" class="ui-anchor '+e.cls+'">'+e.title+"</a></div>"}}),f=Backbone.View.extend({optionsDefault:{message:"",status:"info",persistent:!1},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement("<div></div>")},update:function(t){this.options=e.merge(t,this.optionsDefault);if(t.message!=""){this.$el.html(this._template(this.options)),this.$el.find(".alert").append(t.message),this.$el.fadeIn();if(!t.persistent){var n=this;window.setTimeout(function(){n.$el.is(":visible")?n.$el.fadeOut():n.$el.hide()},3e3)}}else this.$el.fadeOut()},_template:function(e){return'<div class="ui-message alert alert-'+e.status+'"/>'}}),l=Backbone.View.extend({optionsDefault:{onclick:null,searchword:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options));var n=this;this.options.onclick&&this.$el.on("submit",function(e){var t=n.$el.find("#search");n.options.onclick(t.val())})},_template:function(e){return'<div class="ui-search"><form onsubmit="return false;"><input id="search" class="form-control input-sm" type="text" name="search" placeholder="Search..." value="'+e.searchword+'">'+'<button type="submit" class="btn search-btn">'+'<i class="fa fa-search"></i>'+"</button>"+"</form>"+"</div>"}}),c=Backbone.View.extend({optionsDefault:{id:"",title:"",target:"",href:"",onunload:null,onclick:null,visible:!0,icon:null,tag:""},$menu:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement($(this._template(this.options)));var n=$(this.el).find(".root"),r=this;n.on("click",function(e){e.preventDefault(),r.options.onclick&&r.options.onclick()}),this.options.visible||this.hide()},show:function(){$(this.el).show()},hide:function(){$(this.el).hide()},addMenu:function(t){var n={title:"",target:"",href:"",onclick:null,divider:!1,icon:null,cls:"button-menu btn-group"};n=e.merge(t,n),this.$menu||($(this.el).append(this._templateMenu()),this.$menu=$(this.el).find(".menu"));var r=$(this._templateMenuItem(n));r.on("click",function(e){e.preventDefault(),n.onclick&&n.onclick()}),this.$menu.append(r),n.divider&&this.$menu.append($(this._templateDivider()))},_templateMenuItem:function(e){var t='<li><a href="'+e.href+'" target="'+e.target+'">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),t+=" "+e.title+"</a>"+"</li>",t},_templateMenu:function(){return'<ul class="menu dropdown-menu pull-right" role="menu"></ul>'},_templateDivider:function(){return'<li class="divider"></li>'},_template:function(e){var t='<div id="'+e.id+'" class="ui-button-menu '+e.cls+'">'+'<button type="button" class="root btn btn-default dropdown-toggle" data-toggle="dropdown">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),"</button></div>",t}}),h=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0,cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.$el.on("input",function(){n.options.onchange&&n.options.onchange(n.$el.val())})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<input id="'+e.id+'" type="'+e.type+'" value="'+e.value+'" placeholder="'+e.placeholder+'" class="ui-input '+e.cls+'">'}}),p=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0,cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.$el.on("input",function(){n.options.onchange&&n.options.onchange(n.$el.val())})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<textarea id="'+e.id+'" class="ui-textarea '+e.cls+'" rows="5"></textarea>'}}),d=Backbone.View.extend({optionsDefault:{value:"",visible:!0,cls:"",data:[],id:e.uuid()},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.visible||this.$el.hide(),this.options.value&&this.value(this.options.value),this.current=this.options.value;var n=this;this.$el.find("input").on("change",function(){n.value(n._getValue())})},value:function(e){var t=this.current;e!==undefined&&(this.$el.find("label").removeClass("active"),this.$el.find('[value="'+e+'"]').closest("label").addClass("active"),this.current=e);var n=this.current;return n!=t&&this.options.onchange&&this.options.onchange(this.current),this.current},_getValue:function(){var e=this.$el.find(":checked"),t=null;return e.length>0&&(t=e.val()),t},_template:function(e){var t='<div class="btn-group ui-radiobutton" data-toggle="buttons">';for(key in e.data){var n=e.data[key];t+='<label class="btn btn-default"><input type="radio" name="'+e.id+'" value="'+n.value+'" selected>'+n.label+"</label>"}return t+="</div>",t}});return{Label:i,Button:s,Icon:o,ButtonIcon:u,Input:h,Anchor:a,Message:f,Searchbox:l,Select:t,ButtonMenu:c,Modal:n,Textarea:p,Image:r,RadioButton:d}}),define("plugin/library/jobs",["utils/utils"],function(e){return Backbone.Model.extend({initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(e,t,n,r,i){var s=this;e.state("wait","Requesting job results...");var o=e.get("dataset_id_job");o!=""?s._wait(e,r,i):s._submit(e,t,n,r,i)},cleanup:function(t){var n=this,r=t.get("dataset_id_job");r!=""&&(e.request("PUT",config.root+"api/histories/none/contents/"+r,{deleted:!0},function(){n._refreshHdas()}),t.set("dataset_id_job",""))},_submit:function(t,n,r,i,s){var o=this,u=t.id,a=t.get("type"),f=t.definition;data={tool_id:"charts",inputs:{input:{id:t.get("dataset_id"),src:"hda"},module:f.execute,columns:r,settings:n}},t.state("wait","Sending job request..."),e.request("POST",config.root+"api/tools",data,function(e){if(!e.outputs||e.outputs.length==0)t.state("failed","Job submission failed. No response."),s&&s();else{o._refreshHdas();var n=e.outputs[0];t.state("wait","Your job has been queued. You may close the browser window. The job will run in the background."),t.set("dataset_id_job",n.id),this.app.storage.save(),o._wait(t,i,s)}},function(e){var n="";e&&e.message&&e.message.data&&e.message.data.input&&(n=e.message.data.input+"."),t.state("failed","This visualization requires the 'charts' tool. Please make sure it is installed. "+n),s&&s()})},_wait:function(t,n,r){var i=this;e.request("GET",config.root+"api/datasets/"+t.get("dataset_id_job"),{},function(e){var s=!1;switch(e.state){case"ok":t.state("wait","Job completed successfully..."),n&&n(e),s=!0;break;case"error":t.state("failed","Job has failed. Please check the history for details."),r&&r(e),s=!0;break;case"running":t.state("wait","Your job is running. You may close the browser window. The job will continue in the background.")}s||setTimeout(function(){i._wait(t,n,r)},i.app.config.get("query_timeout"))})},_refreshHdas:function(){Galaxy&&Galaxy.currHistoryPanel&&Galaxy.currHistoryPanel.refreshContents()}})}),define("plugin/library/datasets",["utils/utils"],function(e){return Backbone.Collection.extend({list:{},cache:{},initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(e,t,n){var r=this;e.groups?this._get_dataset(e.id,function(){r._get(e,t)}):this._get_dataset(e.id,t,n)},_get_dataset:function(t,n,r){var i=this.list[t];if(i){n(i);return}var s=this;e.request("GET",config.root+"api/datasets/"+t,{},function(e){switch(e.state){case"error":r&&r(e);break;default:s.list[t]=e,n(e)}})},_block_id:function(e,t){return e.id+"_"+e.start+"_"+e.end+"_"+t},_get:function(e,t){e.start||(e.start=0),e.end||(e.end=this.app.config.get("query_limit"));var n=[],r={},i=0;for(var s in e.groups){var o=e.groups[s];for(var u in o.columns){var a=o.columns[u].index,f=this._block_id(e,a);if(this.cache[f]||a==="auto")continue;!r[a]&&a!==undefined&&(r[a]=i,n.push(a),i++)}}if(n.length==0){this._fill_from_cache(e),t(e);return}var l={dataset_id:e.id,start:e.start,end:e.end,columns:n},c=this;this._fetch(l,function(r){for(var i in r){var s=n[i],o=c._block_id(e,s);c.cache[o]=r[i]}c._fill_from_cache(e),t(e)})},_fill_from_cache:function(e){console.debug("Datasets::_fill_from_cache() - Filling request from cache.");var t=e.start,n=0;for(var r in e.groups){var i=e.groups[r];for(var s in i.columns){var o=i.columns[s],u=this._block_id(e,o.index),a=this.cache[u];a&&(n=Math.max(n,a.length))}}n==0&&console.debug("FAILED - Datasets::_fill_from_cache() - Invalid range.");for(var r in e.groups){var i=e.groups[r];i.values=[];for(var f=0;f<n;f++)i.values[f]={x:parseInt(f)+t}}for(var r in e.groups){var i=e.groups[r];for(var s in i.columns){var o=i.columns[s];if(o.index=="auto")for(var f=0;f<n;f++){var l=i.values[f];l[s]=parseInt(f)+t}else{var u=this._block_id(e,o.index),a=this.cache[u];for(var f=0;f<n;f++){var l=i.values[f],c=a[f];isNaN(c)&&!o.is_label&&(c=0),l[s]=c}}}}},_fetch:function(t,n){var r=t.start?t.start:0,i=Math.abs(t.end-t.start),s=this.app.config.get("query_limit");if(!i||i>s)i=s;var o=0;t.columns&&(o=t.columns.length,console.debug("Datasets::_fetch() - Fetching "+o+" column(s)")),o==0&&console.debug("Datasets::_fetch() - No columns requested");var u="";for(var a in t.columns)u+=t.columns[a]+",";u=u.substring(0,u.length-1);var f=this;e.request("GET",config.root+"api/datasets/"+t.dataset_id,{data_type:"raw_data",provider:"dataset-column",limit:i,offset:r,indeces:u},function(e){var t=new Array(o);for(var r=0;r<o;r++)t[r]=[];for(var r in e.data){var i=e.data[r];for(var s in i){var u=i[s];u!==undefined&&u!=2147483647&&t[s].push(u)}}console.debug("Datasets::_fetch() - Fetching complete."),n(t)})}})}),define("plugin/models/group",[],function(){return Backbone.Model.extend({defaults:{key:"Data label",date:""},reset:function(){this.clear({silent:!0}).set(this.defaults),this.trigger("reset",this)}})}),define("plugin/models/groups",["plugin/models/group"],function(e){return Backbone.Collection.extend({model:e})}),define("plugin/library/deferred",["utils/utils"],function(e){return Backbone.Model.extend({queue:[],process:{},counter:0,initialize:function(){this.on("refresh",function(){for(var e in this.queue)if(this.counter==0){var t=this.queue[e];this.queue.splice(e,1),t()}})},execute:function(e){this.queue.push(e),this.trigger("refresh")},register:function(){var t=e.uuid();return this.process[t]=!0,this.counter++,console.debug("Deferred:register() - Registering "+t),t},done:function(e){this.process[e]&&(delete this.process[e],this.counter--,console.debug("Deferred:done() - Unregistering "+e),this.trigger("refresh"))},ready:function(){return this.counter==0}})});var Visualization=Backbone.Model.extend({defaults:{config:{}},urlRoot:function(){var e="/api/visualizations";return window.galaxy_config&&galaxy_config.root?galaxy_config.root+e:e},initialize:function(e){_.isObject(e.config)&&_.isObject(this.defaults.config)&&_.defaults(e.config,this.defaults.config),this._setUpListeners()},_setUpListeners:function(){},set:function(e,t){if(e==="config"){var n=this.get("config");_.isObject(n)&&(t=_.extend(_.clone(n),t))}return Backbone.Model.prototype.set.call(this,e,t),this},toString:function(){var e=this.get("id")||"";return this.get("title")&&(e+=":"+this.get("title")),"Visualization("+e+")"}}),VisualizationCollection=Backbone.Collection.extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(e,t){t=t||{}},set:function(e,t){var n=this;e=_.map(e,function(e){var t=n.get(e.id);if(!t)return e;var r=t.toJSON();return _.extend(r,e),r}),Backbone.Collection.prototype.set.call(this,e,t)},toString:function(){return["VisualizationCollection(",[this.historyId,this.length].join(),")"].join("")}});define("mvc/visualization/visualization-model",function(){}),define("plugin/models/chart",["plugin/models/groups","plugin/library/deferred","mvc/visualization/visualization-model"],function(e,t){return Backbone.Model.extend({defaults:{id:null,title:"",type:"",date:null,state:"",state_info:"",modified:!1,dataset_id:"",dataset_id_job:""},initialize:function(n){this.groups=new e,this.settings=new Backbone.Model,this.deferred=new t},reset:function(){this.clear({silent:!0}).set(this.defaults),this.groups.reset(),this.settings.clear(),this.trigger("reset",this)},copy:function(e){var t=this;t.clear({silent:!0}).set(this.defaults),t.set(e.attributes),t.settings=e.settings.clone(),t.groups.reset(),e.groups.each(function(e){t.groups.add(e.clone())}),t.trigger("change",t)},state:function(e,t){this.set("state",e),this.set("state_info",t),this.trigger("set:state"),console.debug("Chart:state() - "+t+" ("+e+")")}})}),define("plugin/library/storage",["utils/utils","plugin/models/chart","plugin/models/group"],function(e,t,n){return Backbone.Model.extend({vis:null,initialize:function(e){this.app=e,this.chart=this.app.chart,this.options=this.app.options,this.id=this.options.id,this.vis=new Visualization({type:"charts",config:{dataset_id:this.options.config.dataset_id,chart_dict:{}}}),this.id&&(this.vis.id=this.id);var t=this.options.config.chart_dict;t&&(this.vis.get("config").chart_dict=t)},save:function(){var e=this.app.chart;this.vis.get("config").chart_dict={};var t=e.get("title");t!=""&&this.vis.set("title",t);var n={attributes:e.attributes,settings:e.settings.attributes,groups:[]};e.groups.each(function(e){n.groups.push(e.attributes)}),this.vis.get("config").chart_dict=n;var r=this;this.vis.save().fail(function(e,t,n){console.error(e,t,n)}).then(function(e){e&&e.id&&(r.id=e.id)})},load:function(){var e=this.vis.get("config").chart_dict;if(!e.attributes)return!1;var t=e.attributes.type;if(!t)return console.debug("Storage::load() - Chart type not provided. Invalid format."),!1;var r=this.app.types.get(t);if(!r)return console.debug("Storage::load() - Chart type not supported. Please re-configure the chart. Resetting chart."),!1;console.debug("Storage::load() - Loading chart type "+t+"."),this.chart.definition=r,this.chart.set(e.attributes),this.chart.state("ok","Loading saved visualization..."),this.chart.settings.set(e.settings);for(var i in e.groups)this.chart.groups.add(new n(e.groups[i]));return this.chart.set("modified",!1),!0}})}),define("plugin/library/screenshot",["libs/underscore"],function(e){function t(e,t,i){var s=new XMLSerializer,o="",u=this,a=0,f=0;return e.find("svg").each(function(){var e=$(this);n(e),a=parseInt(e.css("height")),f=parseInt(e.css("width")),e.attr({version:"1.1",xmlns:"http://www.w3.org/2000/svg",width:f,height:a}),e.find(".highcharts-button").hide(),o+=s.serializeToString(this),e.find(".highcharts-button").show()}),r(e,t,{filename:i||"chart",type:"application/pdf",height:a,width:f,scale:2,svg:o}),o}function n(e){for(var t in document.styleSheets){var n=document.styleSheets[t],r=n.cssRules;if(r)for(var i=0,s=r.length;i<s;i++)try{e.find(r[i].selectorText).each(function(e,t){t.style.cssText+=r[i].style.cssText})}catch(o){}}}function r(e,t,n){var r=e.find("#viewport-form");r.length===0&&(r=$("<form>",{id:"viewport-form",method:"post",action:t,display:"none"}),e.append(r)),r.empty();for(name in n){var i=$("<input/>",{type:"hidden",name:name,value:n[name]});r.append(i)}try{r.submit()}catch(s){console.log(s)}}return{create:t}}),define("plugin/views/viewport",["mvc/ui/ui-portlet","plugin/library/ui","plugin/library/screenshot","utils/utils"],function(e,t,n,r){return Backbone.View.extend({container_list:[],canvas_list:[],initialize:function(e,t){this.app=e,this.chart=this.app.chart,this.options=r.merge(t,this.optionsDefault),this.setElement($(this._template())),this._fullscreen(this.$el,100),this._createContainer("div");var n=this;this.chart.on("redraw",function(){n._draw(n.chart)}),this.chart.on("set:state",function(){var e=n.$el.find("#info"),t=n.$el.find(".charts-viewport-container"),r=e.find("#icon");r.removeClass(),e.show(),e.find("#text").html(n.chart.get("state_info"));var i=n.chart.get("state");switch(i){case"ok":e.hide(),t.show();break;case"failed":r.addClass("icon fa fa-warning"),t.hide();break;default:r.addClass("icon fa fa-spinner fa-spin"),t.show()}})},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_fullscreen:function(e,t){e.css("height",$(window).height()-t),$(window).resize(function(){e.css("height",$(window).height()-t)})},_createContainer:function(e,t){t=t||1;for(var n in this.container_list)this.container_list[n].remove();this.container_list=[],this.canvas_list=[];for(var n=0;n<t;n++){var r=$(this._templateContainer(e,parseInt(100/t)));this.$el.append(r),this.container_list[n]=r,e=="svg"?this.canvas_list[n]=d3.select(r.find("#canvas")[0]):this.canvas_list[n]=r.find("#canvas")}},_draw:function(e){var t=this,n=e.deferred.register(),r=e.get("type");this.chart_definition=e.definition;var i=this.chart_definition.use_panels||e.settings.get("use_panels")==="true",s=1;i&&(s=e.groups.length),this._createContainer(this.chart_definition.tag,s),e.state("wait","Please wait...");if(!this.chart_definition.execute||this.chart_definition.execute&&e.get("modified"))this.app.jobs.cleanup(e),e.set("modified",!1);var t=this;require(["plugin/charts/"+this.app.chartPath(r)+"/wrapper"],function(r){var i=new r(t.app,{canvas:t.canvas_list});t.chart_definition.execute?t.app.jobs.request(e,t._defaultSettingsString(e),t._defaultRequestString(e),function(){i.draw(n,e,t._defaultRequestDictionary(e))},function(){e.deferred.done(n)}):i.draw(n,e,t._defaultRequestDictionary(e))})},_defaultRequestString:function(e){var t="",n=0,r=this;return e.groups.each(function(e){n++;for(var i in r.chart_definition.columns)t+=i+"_"+n+":"+(parseInt(e.get(i))+1)+", "}),t.substring(0,t.length-2)},_defaultSettingsString:function(e){var t="";for(key in e.settings.attributes)t+=key+":"+e.settings.get(key)+", ";return t.substring(0,t.length-2)},_defaultRequestDictionary:function(e){var t={groups:[]};this.chart_definition.execute?t.id=e.get("dataset_id_job"):t.id=e.get("dataset_id");var n=0,i=this;return e.groups.each(function(e){var s={};for(var o in i.chart_definition.columns){var u=i.chart_definition.columns[o];s[o]=r.merge({index:e.get(o)},u)}t.groups.push({key:++n+":"+e.get("key"),columns:s})}),t},_template:function(){return'<div class="charts-viewport"><div id="info" class="info"><span id="icon" class="icon" /><span id="text" class="text" /></div></div>'},_templateContainer:function(e,t){return'<div class="charts-viewport-container" style="width:'+t+'%;">'+'<div id="menu"/>'+"<"+e+' id="canvas" class="charts-viewport-canvas">'+"</div>"}})}),define("plugin/views/viewer",["utils/utils","plugin/library/ui","mvc/ui/ui-portlet","plugin/models/group","plugin/views/viewport","plugin/library/screenshot"],function(e,t,n,r,i,s){return Backbone.View.extend({initialize:function(e,r){this.app=e,this.chart=this.app.chart,this.viewport_view=new i(e);var o=this;this.message=new t.Message,this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Viewport",scrollable:!1,operations:{edit_button:new t.ButtonIcon({icon:"fa-edit",tooltip:"Customize this chart",title:"Editor",onclick:function(){o._wait(o.chart,function(){o.app.go("editor")})}}),picture_button:new t.ButtonIcon({icon:"fa-camera",tooltip:"Download PDF-file ("+o.app.config.get("screenshot_url")+")",title:"Screenshot",onclick:function(){o._wait(o.chart,function(){s.create(o.viewport_view.$el,o.app.config.get("screenshot_url"),o.chart.get("title"))})}})}}),this.portlet.append(this.message.$el),this.portlet.append(this.viewport_view.$el),this.setElement(this.portlet.$el);var o=this;this.chart.on("change:title",function(){o._refreshTitle()})},show:function(){this.$el.show(),$(window).trigger("resize")},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e)},_wait:function(e,t){e.deferred.ready()?t():this.message.update({message:"Your chart is currently being processed. Please wait and try again."})}})}),define("mvc/ui/ui-tabs",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(t){this.visible=!1,this.$nav=null,this.$content=null,this.first_tab=null,this.options=e.merge(t,this.optionsDefault);var n=$(this._template(this.options));this.$nav=n.find(".tab-navigation"),this.$content=n.find(".tab-content"),this.setElement(n),this.list={};var r=this;this.options.operations&&$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$nav.find(".operations").append(t.$el)});if(this.options.onnew){var i=$(this._template_tab_new(this.options));this.$nav.append(i),i.tooltip({title:"Add a new tab",placement:"bottom",container:r.$el}),i.on("click",function(e){i.tooltip("hide"),r.options.onnew()})}},add:function(e){var t=this,n=e.id,r=$(this._template_tab(e)),i=$(this._template_tab_content(e));this.list[n]=e.ondel?!0:!1,this.options.onnew?this.$nav.find("#new-tab").before(r):this.$nav.append(r),i.append(e.$el),this.$content.append(i),_.size(this.list)==1&&(r.addClass("active"),i.addClass("active"),this.first_tab=n);if(e.ondel){var s=r.find("#delete");s.tooltip({title:"Delete this tab",placement:"bottom",container:t.$el}),s.on("click",function(){return s.tooltip("destroy"),t.$el.find(".tooltip").remove(),e.ondel(),!1})}r.on("click",function(r){r.preventDefault(),e.onclick?e.onclick():t.show(n)})},del:function(e){this.$el.find("#tab-"+e).remove(),this.$el.find("#tab-content-"+e).remove(),this.first_tab==e&&(this.first_tab=null),this.first_tab!=null&&this.show(this.first_tab)},delRemovable:function(){for(var e in this.list)this.list[e]&&this.del(e)},show:function(e){this.$el.fadeIn("fast"),this.visible=!0,e&&(this.$el.find(".tab-element").removeClass("active"),this.$el.find(".tab-pane").removeClass("active"),this.$el.find("#tab-"+e).addClass("active"),this.$el.find("#tab-content-"+e).addClass("active"))},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},hideOperation:function(e){this.$nav.find("#"+e).hide()},showOperation:function(e){this.$nav.find("#"+e).show()},setOperation:function(e,t){var n=this.$nav.find("#"+e);n.off("click"),n.on("click",t)},title:function(e,t){var n=this.$el.find("#tab-title-text-"+e);return t&&n.html(t),n.html()},_template:function(e){return'<div class="ui-tabs tabbable tabs-left"><ul id="tab-navigation" class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div id="tab-content" class="tab-content"/></div>'},_template_tab_new:function(e){return'<li id="new-tab"><a href="javascript:void(0);"><i class="ui-tabs-add fa fa-plus-circle"/>'+e.title_new+"</a>"+"</li>"},_template_tab:function(e){var t='<li id="tab-'+e.id+'" class="tab-element">'+'<a id="tab-title-link-'+e.id+'" title="" href="#tab-content-'+e.id+'" data-original-title="">'+'<span id="tab-title-text-'+e.id+'">'+e.title+"</span>";return e.ondel&&(t+='<i id="delete" class="ui-tabs-delete fa fa-minus-circle"/>'),t+="</a></li>",t},_template_tab_content:function(e){return'<div id="tab-content-'+e.id+'" class="tab-pane"/>'}});return{View:t}}),define("plugin/library/ui-table",["utils/utils"],function(e){var t=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null,cls:""},events:{click:"_onclick",dblclick:"_ondblclick"},initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(t));this.$thead=n.find("thead"),this.$tbody=n.find("tbody"),this.$tmessage=n.find("tmessage"),this.setElement(n),this.row=$("<tr></tr>")},addHeader:function(e){var t=$("<th></th>");t.append(e),this.row.append(t)},appendHeader:function(){this.$thead.append(this.row),this.row=$("<tr></tr>")},add:function(e,t,n){var r=$("<td></td>");t&&r.css("width",t),n&&r.css("text-align",n),r.append(e),this.row.append(r)},append:function(e){this._commit(e)},prepend:function(e){this._commit(e,!0)},get:function(e){return this.$el.find("#"+e)},del:function(e){var t=this.$tbody.find("#"+e);t.length>0&&(t.remove(),this.row_count--,this._refresh())},delAll:function(){this.$tbody.html(""),this.row_count=0,this._refresh()},value:function(e){this.before=this.$tbody.find(".current").attr("id"),e!==undefined&&(this.$tbody.find("tr").removeClass("current"),e&&this.$tbody.find("#"+e).addClass("current"));var t=this.$tbody.find(".current").attr("id");return t===undefined?null:(t!=this.before&&this.options.onchange&&this.options.onchange(e),t)},size:function(){return this.$tbody.find("tr").length},_commit:function(e,t){this.del(e),this.row.attr("id",e),t?this.$tbody.prepend(this.row):this.$tbody.append(this.row),this.row=$("<tr></tr>"),this.row_count++,this._refresh()},_onclick:function(e){var t=this.value(),n=$(e.target).closest("tr").attr("id");n!=""&&n&&t!=n&&(this.options.onconfirm?this.options.onconfirm(n):this.value(n))},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_refresh:function(){this.row_count==0?this.$tmessage.show():this.$tmessage.hide()},_template:function(e){return'<div><table class="ui-table '+e.cls+'">'+"<thead></thead>"+'<tbody style="cursor: pointer;"></tbody>'+"</table>"+"<tmessage>"+e.content+"</tmessage>"+"<div>"}});return{View:t}}),define("plugin/views/group",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(r,i){this.app=r;var s=this;this.chart=this.app.chart,this.group=i.group,this.group_key=new t.Input({placeholder:"Data label",onchange:function(e){s.group.set("key",e)}}),this.table=new e.View({content:"No data column."});var o=$("<div/>");o.append(n.wrap((new t.Label({title:"Provide a label:"})).$el)),o.append(n.wrap(this.group_key.$el)),o.append(n.wrap((new t.Label({title:"Select columns:"})).$el)),o.append(n.wrap(this.table.$el)),this.setElement(o);var s=this;this.chart.on("change:dataset_id",function(){s._refreshTable()}),this.chart.on("change:type",function(){s._refreshTable()}),this.group.on("change:key",function(){s._refreshGroupKey()}),this.group.on("change",function(){s._refreshGroup()}),this._refreshTable(),this._refreshGroupKey(),this._refreshGroup()},_refreshTable:function(){var e=this.chart.get("dataset_id"),n=this.chart.get("type");if(!e||!n)return;var r=this,i=this.chart.definition;this.table.delAll();var s={};for(var o in i.columns){var u=i.columns[o];if(!u){console.debug("Group::_refreshTable() - Skipping column definition.");continue}var a=new t.Select.View({id:"select_"+o,wait:!0});this.table.add(u.title,"25%"),this.table.add(a.$el),this.table.append(o),s[o]=a}this.chart.state("wait","Loading metadata...");var f=this.chart.deferred.register();this.app.datasets.request({id:e},function(e){for(var t in s)r._addRow(t,e,s,i.columns[t]);r.chart.state("ok","Metadata initialized..."),r.chart.deferred.done(f)})},_addRow:function(e,t,n,r){var i=this,s=r.is_label,o=r.is_auto,u=r.is_numeric,a=[],f=n[e];o&&a.push({label:"Column: Row Number",value:"auto"});var l=t.metadata_column_types;for(var c in l){var h=!1;l[c]=="int"||l[c]=="float"?h=u:h=s,h&&a.push({label:"Column: "+(parseInt(c)+1)+" ["+l[c]+"]",value:c})}f.update(a);if(!f.exists(this.group.get(e))){var p=f.first();console.debug('Group()::_addRow() - Switching model value from "'+this.group.get(e)+'" to "'+p+'".'),this.group.set(e,p)}f.value(this.group.get(e)),f.setOnChange(function(t){i.group.set(e,t),i.chart.set("modified",!0)}),f.show()},_refreshGroup:function(){this.group.set("date",n.time())},_refreshGroupKey:function(){var e=this.group.get("key");e===undefined&&(e=""),this.group_key.value(e)}})}),define("plugin/library/ui-table-form",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){var r=Backbone.View.extend({optionsDefault:{title:"",content:"",mode:""},list:[],initialize:function(r,i){this.app=r,this.options=n.merge(i,this.optionsDefault),this.table_title=new t.Label({title:this.options.title}),this.table=new e.View({content:this.options.content});var s=$('<div class="ui-table-form"/>');this.options.title&&s.append(n.wrap(this.table_title.$el)),s.append(n.wrap(this.table.$el)),this.setElement(s)},title:function(e){this.table_title.title(e)},update:function(e,t){this.table.delAll(),this.list=[];for(var n in e)this._add(e[n].id||n,e[n],t);for(var n in this.list)this.list[n].trigger("change")},_add:function(e,n,r){var i=this,s=null,o=n.type;switch(o){case"text":s=new t.Input({id:"field-"+e,placeholder:n.placeholder,value:r.get(e),onchange:function(t){r.set(e,t)}});break;case"radiobutton":s=new t.RadioButton({id:"field-"+e,data:n.data,value:r.get(e),onchange:function(t){r.set(e,t);var s=_.findWhere(n.data,{value:t});if(s){for(var o in s.show){var u=s.show[o];i.table.get(u).show()}for(var o in s.hide){var u=s.hide[o];i.table.get(u).hide()}}}});break;case"select":s=new t.Select.View({id:"field-"+e,data:n.data,value:r.get(e),onchange:function(t){r.set(e,t);var s=_.findWhere(n.data,{value:t});if(s){for(var o in s.show){var u=s.show[o];i.table.get(u).show()}for(var o in s.hide){var u=s.hide[o];i.table.get(u).hide()}}}});break;case"dataset":s=new t.Select.View({id:"field-"+e,onchange:function(t){r.set(e,t)}}),i.app.datasets.on("all",function(){var t=[];i.app.datasets.each(function(e){e.get("datatype_id")==n.data&&t.push({value:e.get("id"),label:e.get("name")})}),s.update(t),r.get(e)||r.set(e,s.first()),s.value(r.get(e))}),i.app.datasets.trigger("all.datasets");break;case"textarea":s=new t.Textarea({id:"field-"+e,onchange:function(){r.set(e,s.value())}});break;case"separator":s=$("<div/>");break;default:s=new t.Input({id:"field-"+e,placeholder:n.placeholder,type:n.type,onchange:function(){r.set(e,s.value())}})}if(o!="separator"){r.get(e)||r.set(e,n.init),s.value(r.get(e)),this.list[e]=s;var u=$("<div/>");u.append(s.$el),n.info&&u.append('<div class="ui-table-form-info">'+n.info+"</div>"),this.options.style=="bold"?(this.table.add((new t.Label({title:n.title,cls:"form-label"})).$el),this.table.add(u)):(this.table.add('<span class="ui-table-form-title">'+n.title+"</span>","25%"),this.table.add(u))}else this.table.add('<div class="ui-table-form-separator">'+n.title+":<div/>"),this.table.add($("<div/>"));this.table.append(e)}});return{View:r}}),define("plugin/views/settings",["plugin/library/ui","plugin/library/ui-table-form","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,n){this.app=e;var r=this;this.chart=this.app.chart,this.form=new t.View({title:"Chart options:",content:"This chart type does not provide any options."}),this.setElement(this.form.$el);var r=this;this.chart.on("change",function(){r._refresh()})},_refresh:function(){var e=this.chart.definition;if(!e)return;this.form.title(e.category+" - "+e.title+":"),this.form.update(e.settings,this.chart.settings)}})}),define("plugin/views/types",["utils/utils","plugin/library/ui"],function(e,t){return Backbone.View.extend({optionsDefault:{onchange:null,ondblclick:null},events:{click:"_onclick",dblclick:"_ondblclick"},initialize:function(t,n){var r=this;this.app=t,this.options=e.merge(n,this.optionsDefault);var i=$('<div class="charts-grid"/>');this.setElement(i),this._render(),this._filter("default")},value:function(e){var t=this.$el.find(".current").attr("id");e!==undefined&&(this.$el.find(".current").removeClass("current"),this.$el.find("#"+e).addClass("current"));var n=this.$el.find(".current").attr("id");return n===undefined?null:(n!=t&&this.options.onchange&&this.options.onchange(e),n)},_filter:function(e){var t=this.app.types.attributes;for(var n in t){var r=t[n],i=this.$el.find("#"+n),s=r.keywords||"";s.indexOf(e)==-1&&e!="all"?i.hide():i.show()}},_render:function(){var t={},n=this.app.types.attributes;for(var r in n){var i=n[r],s=i.category;t[s]||(t[s]={}),t[s][r]=i}for(var s in t){var o=$('<div style="clear: both;"/>');o.append(e.wrap(this._template_header({title:s})));for(var r in t[s]){var i=t[s][r];o.append(e.wrap(this._template_item({id:r,title:i.title+" ("+i.library+")",url:config.app_root+"charts/"+this.app.chartPath(r)+"/logo.png"})))}this.$el.append(e.wrap(o))}},_onclick:function(e){var t=this.value(),n=$(e.target).closest(".item").attr("id");n!=""&&n&&t!=n&&this.value(n)},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_template_header:function(e){return'<div class="header">• '+e.title+"<div>"},_template_item:function(e){return'<div id="'+e.id+'" class="item">'+'<img class="image" src="'+e.url+'">'+'<div class="title">'+e.title+"</div>"+"<div>"}})}),define("plugin/views/editor",["mvc/ui/ui-tabs","plugin/library/ui","mvc/ui/ui-portlet","utils/utils","plugin/models/chart","plugin/models/group","plugin/views/group","plugin/views/settings","plugin/views/types"],function(e,t,n,r,i,s,o,u,a){return Backbone.View.extend({optionsDefault:{header:!0,content:"No content available."},initialize:function(i,s){var o=this;this.app=i,this.chart=this.app.chart,this.options=r.merge(s,this.optionsDefault),this.message=new t.Message,this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Editor",operations:{save:new t.ButtonIcon({icon:"fa-save",tooltip:"Draw Chart",title:"Draw",onclick:function(){o._saveChart()}}),back:new t.ButtonIcon({icon:"fa-caret-left",tooltip:"Return to Viewer",title:"Cancel",onclick:function(){o.app.go("viewer"),o.app.storage.load()}})}}),this.types=new a(i,{onchange:function(e){var t=o.app.types.get(e);t||console.debug("FAILED - Editor::onchange() - Chart type not supported."),o.chart.definition=t,o.chart.settings.clear(),o.chart.set({type:e}),o.chart.set("modified",!0),console.debug("Editor::onchange() - Switched chart type.")},ondblclick:function(e){o._saveChart()}}),this.tabs=new e.View({title_new:"Add Data",onnew:function(){var e=o._addGroupModel();o.tabs.show(e.id)}}),this.title=new t.Input({placeholder:"Chart title",onchange:function(){o.chart.set("title",o.title.value())}});var f=$("<div/>");f.append(r.wrap((new t.Label({title:"Provide a chart title:"})).$el)),f.append(r.wrap(this.title.$el)),f.append(r.wrap((new t.Label({title:"Select a chart type:"})).$el)),f.append(r.wrap(this.types.$el)),this.tabs.add({id:"main",title:"Start",$el:f}),this.settings=new u(this.app),this.tabs.add({id:"settings",title:"Configuration",$el:this.settings.$el}),this.portlet.append(this.message.$el),this.portlet.append(this.tabs.$el),this.setElement(this.portlet.$el),this.tabs.hideOperation("back");var o=this;this.chart.on("change:title",function(e){o._refreshTitle()}),this.chart.on("change:type",function(e){o.types.value(e.get("type"))}),this.chart.on("reset",function(e){o._resetChart()}),this.app.chart.on("redraw",function(e){o.portlet.showOperation("back")}),this.app.chart.groups.on("add",function(e){o._addGroup(e)}),this.app.chart.groups.on("remove",function(e){o._removeGroup(e)}),this.app.chart.groups.on("reset",function(e){o._removeAllGroups()}),this.app.chart.groups.on("change:key",function(e){o._refreshGroupKey()}),this._resetChart()},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e),this.title.value(e)},_refreshGroupKey:function(){var e=this,t=0;this.chart.groups.each(function(n){var r=n.get("key","");r==""&&(r="Chart data"),e.tabs.title(n.id,++t+": "+r)})},_addGroupModel:function(){var e=new s({id:r.uuid()});return this.chart.groups.add(e),e},_addGroup:function(e){var t=this,n=new o(this.app,{group:e});this.tabs.add({id:e.id,$el:n.$el,ondel:function(){t.chart.groups.remove(e.id)}}),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeGroup:function(e){this.tabs.del(e.id),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeAllGroups:function(e){this.tabs.delRemovable()},_resetChart:function(){this.chart.set("id",r.uuid()),this.chart.set("type","highcharts_bar"),this.chart.set("dataset_id",this.app.options.config.dataset_id),this.chart.set("title","New Chart"),this.portlet.hideOperation("back")},_saveChart:function(){this.chart.set({type:this.types.value(),title:this.title.value(),date:r.time()});if(this.chart.groups.length==0){this.message.update({message:"Please select data columns before drawing the chart."});var e=this._addGroupModel();this.tabs.show(e.id);return}var t=this,n=!0,i=this.chart.definition;this.chart.groups.each(function(e){if(!n)return;for(var r in i.columns)if(e.attributes[r]=="null"){t.message.update({status:"danger",message:"This chart type requires column types not found in your tabular file."}),t.tabs.show(e.id),n=!1;return}});if(!n)return;this.app.go("viewer");var t=this;this.chart.deferred.execute(function(){t.app.storage.save(),t.chart.trigger("redraw")})}})}),define("plugin/models/config",[],function(){return Backbone.Model.extend({defaults:{query_limit:1e3,query_timeout:100,screenshot_url:"http://export.highcharts.com/"}})}),define("plugin/charts/nvd3/common/config",[],function(){return{title:"",category:"",library:"NVD3",tag:"svg",keywords:"default nvd3",settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["x_axis_tick"]},{label:"Auto",value:"auto",hide:["x_axis_tick"]},{label:"Float",value:"f",show:["x_axis_tick"]},{label:"Exponent",value:"e",show:["x_axis_tick"]},{label:"Integer",value:"d",hide:["x_axis_tick"]},{label:"Percentage",value:"p",show:["x_axis_tick"]},{label:"Rounded",value:"r",show:["x_axis_tick"]},{label:"SI-prefix",value:"s",show:["x_axis_tick"]}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:["y_axis_tick"]},{label:"Auto",value:"auto",hide:["y_axis_tick"]},{label:"Float",value:"f",show:["y_axis_tick"]},{label:"Exponent",value:"e",show:["y_axis_tick"]},{label:"Integer",value:"d",hide:["y_axis_tick"]},{label:"Percentage",value:"p",show:["y_axis_tick"]},{label:"Rounded",value:"r",show:["y_axis_tick"]},{label:"SI-prefix",value:"s",show:["y_axis_tick"]}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_legend:{title:"Others",type:"separator"},show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"radiobutton",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]},use_panels:{title:"Use multi-panels",info:"Would you like to separate your data into individual panels?",type:"radiobutton",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/nvd3/bar/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Regular",category:"Bar diagrams",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/bar_stacked/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Stacked",category:"Bar diagrams",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/bar_horizontal/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Horizontal",category:"Bar diagrams",columns:{x:{title:"Values for x-axis",is_label:!0,is_auto:!0},y:{title:"Values for y-axis",is_numeric:!0}},settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/nvd3/bar_horizontal_stacked/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Stacked horizontal",category:"Bar diagrams",settings:{x_axis_type:{init:"hide"}},columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/line_focus/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Line with focus",category:"Others",keywords:"default nvd3",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/pie/config",[],function(){return $.extend(!0,{},{title:"Pie chart",category:"Area charts",library:"NVD3",tag:"svg",keywords:"default nvd3",use_panels:!0,columns:{label:{title:"Labels",is_label:!0,is_auto:!0},y:{title:"Values",is_numeric:!0}},settings:{show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]},donut_ratio:{title:"Donut ratio",info:"Determine how large the donut hole will be.",type:"select",init:"0.5",data:[{label:"50%",value:"0.5"},{label:"25%",value:"0.25"},{label:"10%",value:"0.10"},{label:"0%",value:"0"}]},label_separator:{type:"separator",title:"Label settings"},label_type:{title:"Donut label",info:"What would you like to show for each slice?",type:"select",init:"percent",data:[{label:"-- Nothing --",value:"hide",hide:"label_outside"},{label:"Label column",value:"key",show:"label_outside"},{label:"Value column",value:"value",show:"label_outside"},{label:"Percentage",value:"percent",show:"label_outside"}]},label_outside:{title:"Show outside",info:"Would you like to show labels outside the donut?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}})}),define("plugin/charts/nvd3/stackedarea_full/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Expanded",category:"Area charts",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/stackedarea_stream/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Stream",category:"Area charts",keywords:"default nvd3",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/histogram/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",category:"Data processing (requires 'charts' tool from Toolshed)",execute:"histogram",columns:{y:{title:"Observations",is_numeric:!0}},settings:{x_axis_label:{init:"Values"},y_axis_label:{init:"Density"},y_axis_type:{init:"f"},y_axis_tick:{init:".2"}}})}),define("plugin/charts/nvd3/histogram_discrete/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Discrete Histogram",category:"Data processing (requires 'charts' tool from Toolshed)",execute:"histogramdiscrete",columns:{x:{title:"Observations",is_label:!0}},settings:{x_axis_label:{init:"Breaks"},y_axis_label:{init:"Density"},y_axis_type:{init:"f"},y_axis_tick:{init:".2"}}})}),define("plugin/charts/nvd3/line/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Line chart",category:"Others",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/scatter/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",category:"Others",columns:{x:{title:"Values for x-axis",is_numeric:!0},y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/nvd3/stackedarea/config",["plugin/charts/nvd3/common/config"],function(e){return $.extend(!0,{},e,{title:"Regular",category:"Area charts",columns:{y:{title:"Values for y-axis",is_numeric:!0}}})}),define("plugin/charts/types",["plugin/charts/nvd3/bar/config","plugin/charts/nvd3/bar_stacked/config","plugin/charts/nvd3/bar_horizontal/config","plugin/charts/nvd3/bar_horizontal_stacked/config","plugin/charts/nvd3/line_focus/config","plugin/charts/nvd3/pie/config","plugin/charts/nvd3/stackedarea_full/config","plugin/charts/nvd3/stackedarea_stream/config","plugin/charts/nvd3/histogram/config","plugin/charts/nvd3/histogram_discrete/config","plugin/charts/nvd3/line/config","plugin/charts/nvd3/scatter/config","plugin/charts/nvd3/stackedarea/config"],function(e,t,n,r,i,s,o,u,a,f,l,c,h){return Backbone.Model.extend({defaults:{nvd3_bar:e,nvd3_bar_stacked:t,nvd3_bar_horizontal:n,nvd3_bar_horizontal_stacked:r,nvd3_line_focus:i,nvd3_stackedarea:h,nvd3_stackedarea_full:o,nvd3_stackedarea_stream:u,nvd3_pie:s,nvd3_line:l,nvd3_scatter:c,nvd3_histogram:a,nvd3_histogram_discrete:f}})}),define("plugin/app",["mvc/ui/ui-modal","mvc/ui/ui-portlet","plugin/library/ui","utils/utils","plugin/library/jobs","plugin/library/datasets","plugin/library/storage","plugin/views/viewer","plugin/views/editor","plugin/models/config","plugin/models/chart","plugin/charts/types"],function(e,t,n,r,i,s,o,u,a,f,l,c){return Backbone.View.extend({initialize:function(t){this.options=t,Galaxy&&Galaxy.modal?this.modal=Galaxy.modal:this.modal=new e.View,this.config=new f,this.types=new c,this.chart=new l,this.jobs=new i(this),this.datasets=new s(this),this.storage=new o(this),this.viewer_view=new u(this),this.editor_view=new a(this),this.$el.append(this.viewer_view.$el),this.$el.append(this.editor_view.$el);if(!this.storage.load())this.go("editor");else{this.go("viewer");var n=this;this.chart.deferred.execute(function(){n.chart.trigger("redraw")})}},go:function(e){$(".tooltip").hide();switch(e){case"editor":this.editor_view.show(),this.viewer_view.hide();break;case"viewer":this.editor_view.hide(),this.viewer_view.show()}},chartPath:function(e){var t=e.split(/_(.+)/);return t.length>=2?t[0]+"/"+t[1]:(console.debug("FAILED App:chartPath() - Invalid format: "+e),undefined)},execute:function(e){},onunload:function(){},log:function(e,t){console.log(e+" "+t)}})});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar/config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Regular',
- category : 'Bar diagrams',
- keywords : 'highcharts',
- columns : {
- x : {
- title : 'Values for x-axis',
- is_label : true,
- is_auto : true
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/bar/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar/wrapper.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'column', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Horizontal',
- category : 'Bar diagrams',
- keywords : 'highcharts',
- columns : {
- x : {
- title : 'Values for x-axis',
- is_label : true,
- is_auto : true
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- },
- settings : {
- x_axis_type : {
- init : 'hide'
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal/wrapper.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'bar', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Stacked horizontal',
- category : 'Bar diagrams',
- keywords : 'highcharts',
- settings : {
- x_axis_type : {
- init : 'hide'
- }
- },
- columns : {
- x : {
- title : 'Values for x-axis',
- is_label : true,
- is_auto : true
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/wrapper.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- // finalize configuration
- chart.settings.set('plotoptions_series_stacking', 'normal');
-
- // draw chart
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'bar', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Stacked',
- category : 'Bar diagrams',
- keywords : 'highcharts',
- columns : {
- x : {
- title : 'Values for x-axis',
- is_label : true,
- is_auto : true
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/wrapper.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary)
- {
- // finalize configuration
- chart.settings.set('plotoptions_series_stacking', 'normal');
-
- // draw chart
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'column', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/boxplot/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/config.js
+++ /dev/null
@@ -1,138 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, {
- title : 'Box plot',
- category : 'Data processing (requires \'charts\' tool from Toolshed)',
- library : 'Highcharts',
- tag : 'div',
- execute : 'boxplot',
- keywords : 'highcharts',
- columns : {
- y : {
- title : 'Observations',
- is_numeric : true
- }
- },
- settings : {
- separator_label : {
- title : 'X axis',
- type : 'separator'
- },
- x_axis_label : {
- title : 'Axis label',
- info : 'Provide a label for the axis.',
- type : 'text',
- init : 'X-axis',
- placeholder : 'Axis label'
- },
- separator_tick : {
- title : 'Y axis',
- type : 'separator'
- },
- y_axis_label : {
- title : 'Axis label',
- info : 'Provide a label for the axis.',
- type : 'text',
- init : 'Y-axis',
- placeholder : 'Axis label'
- },
- y_axis_type : {
- title : 'Axis value type',
- info : 'Select the value type of the axis.',
- type : 'select',
- init : 'auto',
- data : [
- {
- label : '-- Do not show values --',
- value : 'hide',
- hide : ['y_axis_tick']
- },
- {
- label : 'Auto',
- value : 'auto',
- hide : ['y_axis_tick']
- },
- {
- label : 'Float',
- value : 'f',
- show : ['y_axis_tick']
- },
- {
- label : 'Exponent',
- value : 'e',
- show : ['y_axis_tick']
- },
- {
- label : 'Integer',
- value : 'd',
- hide : ['y_axis_tick']
- },
- {
- label : 'Percentage',
- value : 'p',
- show : ['y_axis_tick']
- },
- {
- label : 'Rounded',
- value : 'r',
- show : ['y_axis_tick']
- },
- {
- label : 'SI-prefix',
- value : 's',
- show : ['y_axis_tick']
- }
- ]
- },
- y_axis_tick : {
- title : 'Axis tick format',
- info : 'Select the tick format for the axis.',
- type : 'select',
- init : '.1',
- data : [
- {
- label : '0.00001',
- value : '.5'
- },
- {
- label : '0.0001',
- value : '.4'
- },
- {
- label : '0.001',
- value : '.3'
- },
- {
- label : '0.01',
- value : '.2'
- },
- {
- label : '0.1',
- value : '.1'
- },
- {
- label : '1',
- value : '1'
- }
- ]
- },
- y_axis_grid : {
- title : 'Axis grid',
- info : 'Would you like to show grid lines for this axis?',
- type : 'radiobutton',
- init : '1',
- data : [
- {
- label : 'On',
- value : '1'
- },
- {
- label : 'Off',
- value : '0'
- }
- ]
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/boxplot/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/boxplot/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
+++ /dev/null
@@ -1,79 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/highcharts-config', 'plugin/charts/highcharts/common/wrapper'], function(configmaker, Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary, callback) {
- // configure request
- var index = 0;
- for (var i in request_dictionary.groups) {
- var group = request_dictionary.groups[i];
- group.columns = null;
- group.columns = {
- x: {
- index: index++
- }
- }
- }
-
- // hide legend
- chart.settings.set('legend_enabled', 'false')
-
- // create configuration
- this.hc_config = configmaker(chart, callback);
-
- // request data
- var self = this;
- this.app.datasets.request(request_dictionary, function() {
- // reset data/categories
- var data = [];
- var categories = [];
-
- // loop through data groups
- for (var key in request_dictionary.groups) {
- // get group
- var group = request_dictionary.groups[key];
-
- // add category
- categories.push(group.key);
-
- // format chart data
- var point = [];
- for (var key in group.values) {
- point.push(group.values[key].x);
- }
-
- // add to data
- data.push (point);
- }
-
- // categories
- self.hc_config.xAxis.categories = categories;
-
- // update data
- self.hc_config.series.push({
- type : 'boxplot',
- data : data
- });
-
- // draw plot
- self.options.canvas[0].highcharts(self.hc_config);
-
- // set chart state
- chart.state('ok', 'Box plot drawn.');
-
- // unregister process
- chart.deferred.done(process_id);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/common/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/config.js
+++ /dev/null
@@ -1,249 +0,0 @@
-define([], function() {
-
-return {
- title : '',
- category : '',
- library : 'Highcharts',
- tag : 'div',
- keywords : 'highcharts',
- settings : {
- separator_label : {
- title : 'X axis',
- type : 'separator'
- },
- x_axis_label : {
- title : 'Axis label',
- info : 'Provide a label for the axis.',
- type : 'text',
- init : 'X-axis',
- placeholder : 'Axis label'
- },
- x_axis_type : {
- title : 'Axis value type',
- info : 'Select the value type of the axis.',
- type : 'select',
- init : 'auto',
- data : [
- {
- label : '-- Do not show values --',
- value : 'hide',
- hide : ['x_axis_tick']
- },
- {
- label : 'Auto',
- value : 'auto',
- hide : ['x_axis_tick']
- },
- {
- label : 'Float',
- value : 'f',
- show : ['x_axis_tick']
- },
- {
- label : 'Exponent',
- value : 'e',
- show : ['x_axis_tick']
- },
- {
- label : 'Integer',
- value : 'd',
- hide : ['x_axis_tick']
- },
- {
- label : 'Percentage',
- value : 'p',
- show : ['x_axis_tick']
- },
- {
- label : 'Rounded',
- value : 'r',
- show : ['x_axis_tick']
- },
- {
- label : 'SI-prefix',
- value : 's',
- show : ['x_axis_tick']
- }
- ]
- },
- x_axis_tick : {
- title : 'Axis tick format',
- info : 'Select the tick format for the axis.',
- type : 'select',
- init : '.1',
- data : [
- {
- label : '0.00001',
- value : '.5'
- },
- {
- label : '0.0001',
- value : '.4'
- },
- {
- label : '0.001',
- value : '.3'
- },
- {
- label : '0.01',
- value : '.2'
- },
- {
- label : '0.1',
- value : '.1'
- },
- {
- label : '1',
- value : '1'
- }
- ]
-
- },
- x_axis_grid : {
- title : 'Axis grid',
- info : 'Would you like to show grid lines for this axis?',
- type : 'radiobutton',
- init : '0',
- data : [
- {
- label : 'On',
- value : '1'
- },
- {
- label : 'Off',
- value : '0'
- }
- ]
- },
- separator_tick : {
- title : 'Y axis',
- type : 'separator'
- },
- y_axis_label : {
- title : 'Axis label',
- info : 'Provide a label for the axis.',
- type : 'text',
- init : 'Y-axis',
- placeholder : 'Axis label'
- },
- y_axis_type : {
- title : 'Axis value type',
- info : 'Select the value type of the axis.',
- type : 'select',
- init : 'auto',
- data : [
- {
- label : '-- Do not show values --',
- value : 'hide',
- hide : ['y_axis_tick']
- },
- {
- label : 'Auto',
- value : 'auto',
- hide : ['y_axis_tick']
- },
- {
- label : 'Float',
- value : 'f',
- show : ['y_axis_tick']
- },
- {
- label : 'Exponent',
- value : 'e',
- show : ['y_axis_tick']
- },
- {
- label : 'Integer',
- value : 'd',
- hide : ['y_axis_tick']
- },
- {
- label : 'Percentage',
- value : 'p',
- show : ['y_axis_tick']
- },
- {
- label : 'Rounded',
- value : 'r',
- show : ['y_axis_tick']
- },
- {
- label : 'SI-prefix',
- value : 's',
- show : ['y_axis_tick']
- }
- ]
- },
- y_axis_tick : {
- title : 'Axis tick format',
- info : 'Select the tick format for the axis.',
- type : 'select',
- init : '.1',
- data : [
- {
- label : '0.00001',
- value : '.5'
- },
- {
- label : '0.0001',
- value : '.4'
- },
- {
- label : '0.001',
- value : '.3'
- },
- {
- label : '0.01',
- value : '.2'
- },
- {
- label : '0.1',
- value : '.1'
- },
- {
- label : '1',
- value : '1'
- }
- ]
-
- },
- y_axis_grid : {
- title : 'Axis grid',
- info : 'Would you like to show grid lines for this axis?',
- type : 'radiobutton',
- init : '1',
- data : [
- {
- label : 'On',
- value : '1'
- },
- {
- label : 'Off',
- value : '0'
- }
- ]
- },
- separator_legend : {
- title : 'Others',
- type : 'separator'
- },
- legend_enabled : {
- title : 'Show legend',
- info : 'Would you like to add a legend?',
- type : 'radiobutton',
- init : 'true',
- data : [
- {
- label : 'Yes',
- value : 'true'
- },
- {
- label : 'No',
- value : 'false'
- }
- ]
- }
- }
-};
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
+++ /dev/null
@@ -1,103 +0,0 @@
-// dependencies
-define([], function() {
-
-// highcharts configuration
-return function(chart) {
-
- // get chart settings
- var settings = chart.settings;
-
- // initialize config object
- var hc_config = {
- chart: {
- type : '',
- zoomType : 'xy'
- },
-
- title: {
- text : ''
- },
-
- legend: {
- enabled : settings.get('legend_enabled') == undefined || settings.get('legend_enabled') == 'true'
- },
-
- credits: {
- enabled : false
- },
-
- xAxis: {
- title: {
- text : settings.get('x_axis_label')
- },
- stackLabels: {
- enabled: false,
- style: {
- fontWeight : 'bold',
- color : (Highcharts.theme && Highcharts.theme.textColor) || 'gray'
- }
- },
- labels: {
- formatter : function() {
- var axis_type = settings.get('x_axis_type');
- if (axis_type == 'auto' || axis_type === undefined)
- return this.value;
- var format = d3.format(settings.get('x_axis_tick') + axis_type);
- return format(this.value);
- },
- enabled : !(settings.get('x_axis_type') == 'hide')
- },
- gridLineWidth : settings.get('x_axis_grid')
- },
-
- yAxis: {
- title: {
- text : settings.get('y_axis_label')
- },
- labels: {
- formatter : function() {
- var axis_type = settings.get('y_axis_type');
- if (axis_type == 'auto' || axis_type === undefined)
- return this.value;
- var format = d3.format(settings.get('y_axis_tick') + axis_type);
- return format(this.value);
- },
- enabled : !(settings.get('y_axis_type') == 'hide')
- },
- gridLineWidth : settings.get('y_axis_grid')
- },
- plotOptions: {
- series: {
- animation : false,
- stacking : settings.get('plotoptions_series_stacking')
- },
- column: {
- stacking : settings.get('plotoptions_column_stacking')
- },
- area: {
- stacking : settings.get('plotoptions_area_stacking'),
- lineColor : '#ffffff',
- lineWidth : 1,
- marker: {
- lineWidth : 1,
- lineColor : '#ffffff'
- }
- },
- pie: {
- allowPointSelect : true,
- cursor : 'pointer',
- dataLabels: {
- enabled : false,
- distance : -1
- }
- }
- },
-
- series: []
- }
-
- // callback
- return hc_config;
-};
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
+++ /dev/null
@@ -1,179 +0,0 @@
-// dependencies
-define(['utils/utils', 'plugin/charts/highcharts/common/highcharts-config'], function(Utils, configmaker) {
-
-// widget
-return Backbone.View.extend(
-{
- // highcharts series
- hc_series: {
- name : '',
- data : [],
- tooltip: {
- headerFormat : '<em>{point.key}</em><br/>'
- }
- },
-
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, hc_type, chart, request_dictionary, callback)
- {
- // request data
- var self = this;
- this.app.datasets.request(request_dictionary, function() {
- // check if this chart has multiple panels
- if (!chart.definition.use_panels) {
- // draw all groups into a single panel
- if (self._drawGroups(hc_type, chart, request_dictionary.groups, self.options.canvas[0], callback)) {
- chart.state('ok', 'Chart drawn.');
- }
- } else {
- // draw groups in separate panels
- var valid = true;
- for (var group_index in request_dictionary.groups) {
- var group = request_dictionary.groups[group_index];
- if (!self._drawGroups(hc_type, chart, [group], self.options.canvas[group_index], callback)) {
- valid = false;
- break;
- }
- }
- if (valid) {
- chart.state('ok', 'Multi-panel chart drawn.');
- }
- }
-
- // unregister process
- chart.deferred.done(process_id);
- });
- },
-
- // draw all data into a single canvas
- _drawGroups: function(hc_type, chart, groups, canvas, callback) {
- // create configuration
- var hc_config = configmaker(chart);
-
- // fix title
- if (!chart.definition.use_panels) {
- hc_config.title.text = chart.get('title');
- }
-
- // identify categories
- this._makeCategories(chart, groups, hc_config);
-
- // loop through data groups
- for (var key in groups) {
- // get group
- var group = groups[key];
-
- // reset data
- var data = [];
-
- // format chart data
- for (var value_index in group.values) {
- // parse data
- var point = [];
- for (var column_index in group.values[value_index]) {
- point.push(group.values[value_index][column_index]);
- }
-
- // add to data
- data.push (point);
- }
-
- // highcharts series
- var hc_series = {
- name : group.key,
- type : hc_type,
- data : data
- };
-
- // append series
- hc_config.series.push(hc_series);
- }
-
- // make custom wrapper callback
- if (callback) {
- callback(hc_config);
- }
-
- // draw plot
- try {
- canvas.highcharts(hc_config);
- return true;
- } catch (err) {
- this._handleError(chart, err);
- return false;
- }
- },
-
- // create categories
- _makeCategories: function(chart, groups, hc_config) {
- // hashkeys, arrays and counter for labeled columns
- var categories = {};
- var array = {};
- var counter = {};
-
- // identify label columns
- var chart_definition = groups[0];
- for (var key in chart_definition.columns) {
- var column_def = chart_definition.columns[key];
- if (column_def.is_label) {
- categories[key] = {};
- array[key] = [];
- counter[key] = 0;
- }
- }
-
- // index all values contained in label columns (for all groups)
- for (var i in groups) {
- var group = groups[i];
- for (var j in group.values) {
- var value_dict = group.values[j];
- for (var key in categories) {
- var value = String(value_dict[key]);
- if (categories[key][value] === undefined) {
- categories[key][value] = counter[key]++;
- array[key].push(value);
- }
- }
- }
- }
-
- // convert group values into category indeces
- for (var i in groups) {
- var group = groups[i];
- for (var j in group.values) {
- var value_dict = group.values[j];
- for (var key in categories) {
- var value = String(value_dict[key]);
- value_dict[key] = categories[key][value]
- }
- }
- }
- console.log(array);
- // add categories to highcharts configuration
- for (var key in array) {
- var axis = key + 'Axis';
- if (hc_config[axis]) {
- hc_config[axis].categories = array[key];
- }
- }
- },
-
- // handle error
- _handleError: function(chart, err) {
- var regex = /\www\.highcharts\.com([^&]+)/;
- var match = err.match(regex);
- if (match.length > 0) {
- chart.state('failed', 'Highcharts error: <a target="_blank" href="http://' + match[0] + '">' + match[0] + '</a>');
- } else {
- chart.state('failed', err);
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/heatmap/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/heatmap/config.js
+++ /dev/null
@@ -1,31 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Heatmap',
- category : 'Others',
- use_panels : true,
- keywords : 'highcharts',
- columns: {
- x: {
- title : 'Column labels',
- is_label : true,
- is_numeric : true
- },
- y: {
- title : 'Row labels',
- is_label : true,
- is_numeric : true
- },
- z: {
- title : 'Observations',
- is_numeric : true
- }
- },
- settings: {
- y_axis_grid : {
- init : '0'
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/heatmap/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/heatmap/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/heatmap/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/heatmap/wrapper.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(HighchartsWrapper) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new HighchartsWrapper(this.app, this.options);
- hc.draw(process_id, 'heatmap', chart, request_dictionary, function(model) {
- model.colorAxis = {
- minColor : '#00FF99',
- maxColor : '#000066'
- }
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/histogram/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/histogram/config.js
+++ /dev/null
@@ -1,30 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Histogram',
- category : 'Data processing (requires \'charts\' tool from Toolshed)',
- execute : 'histogram',
- keywords : 'highcharts',
- columns : {
- y : {
- title : 'Observations',
- is_numeric : true
- }
- },
- settings : {
- x_axis_label : {
- init : 'Values'
- },
- y_axis_label : {
- init : 'Density'
- },
- y_axis_type : {
- init : 'f'
- },
- y_axis_tick : {
- init : '.2'
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/histogram/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/histogram/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/histogram/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/histogram/wrapper.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- // configure request
- var index = 1;
- for (var i in request_dictionary.groups) {
- var group = request_dictionary.groups[i];
- group.columns = {
- x: {
- index: 0
- },
- y: {
- index: index++
- }
- }
- }
-
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'column', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/histogram_discrete/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/histogram_discrete/config.js
+++ /dev/null
@@ -1,24 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Discrete Histogram',
- category : 'Data processing (requires \'charts\' tool from Toolshed)',
- execute : 'histogramdiscrete',
- keywords : 'highcharts',
- columns : {
- y : {
- title : 'Observations',
- is_label : true
- }
- },
- settings : {
- x_axis_label : {
- init : 'Labels'
- },
- y_axis_label : {
- init : 'Density'
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/histogram_discrete/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/histogram_discrete/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/histogram_discrete/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/histogram_discrete/wrapper.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- // configure request
- var tmp_dict = {
- id : request_dictionary.id,
- groups : []
- };
-
- // configure groups
- var index = 0;
- for (var group_index in request_dictionary.groups) {
- var group = request_dictionary.groups[group_index];
- tmp_dict.groups.push({
- key : group.key,
- columns : {
- x: {
- index : 0,
- is_label : true
- },
- y: {
- index : ++index,
- is_numeric : true
- }
- }
- });
- }
-
- // draw chart
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'column', chart, tmp_dict);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/line/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/line/config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Line',
- category : 'Others',
- keywords : 'highcharts',
- columns : {
- x : {
- title : 'Values for x-axis',
- is_label : true,
- is_auto : true,
- is_numeric : false
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/line/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/line/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/line/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/line/wrapper.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'line', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/pie/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/pie/config.js
+++ /dev/null
@@ -1,116 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Pie chart',
- category : 'Area charts',
- keywords : 'highcharts',
- use_panels : true,
- columns : {
- label : {
- title : 'Labels',
- is_label : true,
- is_auto : true
- },
- y : {
- title : 'Values',
- is_numeric : true
- }
- },
-
- settings : {
- show_legend : {
- title : 'Show legend',
- info : 'Would you like to add a legend?',
- type : 'select',
- init : 'false',
- data : [
- {
- label : 'Yes',
- value : 'true'
- },
- {
- label : 'No',
- value : 'false'
- }
- ]
- },
-
- donut_ratio : {
- title : 'Donut ratio',
- info : 'Determine how large the donut hole will be.',
- type : 'select',
- init : '0.5',
- data : [
- {
- label : '50%',
- value : '0.5'
- },
- {
- label : '25%',
- value : '0.25'
- },
- {
- label : '10%',
- value : '0.10'
- },
- {
- label : '0%',
- value : '0'
- }
- ]
- },
-
- label_separator : {
- type : 'separator',
- title : 'Label settings'
- },
-
- label_type : {
- title : 'Donut label',
- info : 'What would you like to show for each slice?',
- type : 'select',
- init : 'percent',
- data : [
- {
- label : '-- Nothing --',
- value : 'hide',
- hide : 'label_outside'
- },
- {
- label : 'Label column',
- value : 'key',
- show : 'label_outside'
- },
- {
- label : 'Value column',
- value : 'value',
- show : 'label_outside'
- },
- {
- label : 'Percentage',
- value : 'percent',
- show : 'label_outside'
- }
- ],
- },
-
- label_outside : {
- title : 'Show outside',
- info : 'Would you like to show labels outside the donut?',
- type : 'select',
- init : 'false',
- data : [
- {
- label : 'Yes',
- value : 'true'
- },
- {
- label : 'No',
- value : 'false'
- }
- ]
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/pie/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/pie/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/pie/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/pie/wrapper.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'pie', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/scatter/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/scatter/config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Scatter plot',
- category : 'Others',
- keywords : 'highcharts',
- columns : {
- x : {
- title : 'Values for x-axis',
- is_numeric : true
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/scatter/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/scatter/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/scatter/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/scatter/wrapper.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'scatter', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/stackedarea/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/stackedarea/config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-define(['plugin/charts/highcharts/common/config'], function(config) {
-
-return $.extend(true, {}, config, {
- title : 'Regular',
- category : 'Area charts',
- keywords : 'highcharts',
- columns : {
- x : {
- title : 'Values for x-axis',
- is_label : true,
- is_auto : true,
- is_numeric : false
- },
- y : {
- title : 'Values for y-axis',
- is_numeric : true
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/stackedarea/logo.png
Binary file config/plugins/visualizations/charts/static/charts/highcharts/stackedarea/logo.png has changed
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/highcharts/stackedarea/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/stackedarea/wrapper.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- draw : function(process_id, chart, request_dictionary) {
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'area', chart, request_dictionary);
- }
-});
-
-});
\ No newline at end of file
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/bar/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/bar/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/bar/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary);
+ nvd3.draw('multiBarChart', process_id, chart, request_dictionary);
}
});
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/bar_horizontal/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/bar_horizontal/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/bar_horizontal/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.multiBarHorizontalChart(), chart, request_dictionary);
+ nvd3.draw('multiBarHorizontalChart', process_id, chart, request_dictionary);
}
});
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/bar_horizontal_stacked/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/bar_horizontal_stacked/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/bar_horizontal_stacked/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.multiBarHorizontalChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('multiBarHorizontalChart', process_id, chart, request_dictionary, function(nvd3_model) {
nvd3_model.stacked(true);
});
}
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/bar_stacked/config.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/bar_stacked/config.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/bar_stacked/config.js
@@ -4,6 +4,11 @@
title : 'Stacked',
category : 'Bar diagrams',
columns : {
+ x : {
+ title : 'Values for x-axis',
+ is_label : true,
+ is_auto : true
+ },
y : {
title : 'Values for y-axis',
is_numeric : true
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/bar_stacked/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/bar_stacked/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/bar_stacked/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('multiBarChart', process_id, chart, request_dictionary, function(nvd3_model) {
nvd3_model.stacked(true);
});
}
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/common/config.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/common/config.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/common/config.js
@@ -210,6 +210,22 @@
value : 'false'
}
]
+ },
+ use_panels : {
+ title : 'Use multi-panels',
+ info : 'Would you like to separate your data into individual panels?',
+ type : 'radiobutton',
+ init : 'false',
+ data : [
+ {
+ label : 'Yes',
+ value : 'true'
+ },
+ {
+ label : 'No',
+ value : 'false'
+ }
+ ]
}
}
};
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/common/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/common/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/common/wrapper.js
@@ -1,5 +1,5 @@
// dependencies
-define([], function() {
+define(['plugin/charts/tools', 'plugin/plugins/nvd3/nv.d3'], function(Tools) {
// widget
return Backbone.View.extend(
@@ -9,58 +9,75 @@
this.app = app;
this.options = options;
},
-
+
// render
- draw : function(process_id, nvd3_model, chart, request_dictionary, callback)
+ draw : function(type, process_id, chart, request_dictionary, callback) {
+ var self = this;
+ var plot = Tools.panelHelper({
+ app : this.app,
+ process_id : process_id,
+ canvas : this.options.canvas,
+ chart : chart,
+ request_dictionary : request_dictionary,
+ render : function(chart, groups, canvas) {
+ return self.render(type, chart, groups, canvas, callback)
+ }
+ });
+ },
+
+ // render
+ render : function(type, chart, groups, canvas, callback)
{
+ // create nvd3 model
+ var d3chart = nv.models[type]();
+
// request data
var self = this;
- this.app.datasets.request(request_dictionary, function() {
- nv.addGraph(function() {
+ nv.addGraph(function() {
+ try {
// x axis
- self._axis(nvd3_model.xAxis, chart.settings.get('x_axis_type'), chart.settings.get('x_axis_tick'));
+ self._axis(d3chart.xAxis, chart.settings.get('x_axis_type'), chart.settings.get('x_axis_tick'));
// x axis label
- nvd3_model.xAxis.axisLabel(chart.settings.get('x_axis_label'));
+ d3chart.xAxis.axisLabel(chart.settings.get('x_axis_label'));
// y axis
- self._axis(nvd3_model.yAxis, chart.settings.get('y_axis_type'), chart.settings.get('y_axis_tick'));
+ self._axis(d3chart.yAxis, chart.settings.get('y_axis_type'), chart.settings.get('y_axis_tick'));
// y axis label
- nvd3_model.yAxis.axisLabel(chart.settings.get('y_axis_label'))
+ d3chart.yAxis.axisLabel(chart.settings.get('y_axis_label'))
.axisLabelDistance(30);
// controls
- nvd3_model.options({showControls: false});
+ d3chart.options({showControls: false});
// legend
- if (nvd3_model.showLegend) {
+ if (d3chart.showLegend) {
var legend_visible = true;
if (chart.settings.get('show_legend') == 'false') {
legend_visible = false;
}
- nvd3_model.showLegend(legend_visible);
+ d3chart.showLegend(legend_visible);
}
// custom callback
if (callback) {
- callback(nvd3_model);
+ callback(d3chart);
}
// parse data to canvas
- self.options.canvas[0].datum(request_dictionary.groups)
- .call(nvd3_model);
+ canvas.datum(groups)
+ .call(d3chart);
+
// refresh on window resize
- nv.utils.windowResize(nvd3_model.update);
-
- // set chart state
- chart.state('ok', 'Chart has been drawn.');
-
- // unregister process
- chart.deferred.done(process_id);
- });
+ nv.utils.windowResize(d3chart.update);
+ } catch (err) {
+ self._handleError(chart, err);
+ }
});
+
+ return true;
},
// make axis
@@ -74,6 +91,11 @@
default:
axis.tickFormat(d3.format(tick + type));
}
+ },
+
+ // handle error
+ _handleError: function(chart, err) {
+ chart.state('failed', err);
}
});
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/histogram/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/histogram/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/histogram/wrapper.js
@@ -32,7 +32,7 @@
// load nvd3
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('multiBarChart', process_id, chart, request_dictionary, function(nvd3_model) {
nvd3_model.options({showControls: true});
});
}
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/histogram_discrete/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/histogram_discrete/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/histogram_discrete/wrapper.js
@@ -39,7 +39,7 @@
// draw
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.multiBarChart(), chart, tmp_dict, function(nvd3_model) {
+ nvd3.draw('multiBarChart', process_id, chart, tmp_dict, function(nvd3_model) {
nvd3_model.options({showControls: false});
});
}
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/line/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/line/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/line/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.lineChart(), chart, request_dictionary);
+ nvd3.draw('lineChart', process_id, chart, request_dictionary);
}
});
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/line_focus/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/line_focus/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/line_focus/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.lineWithFocusChart(), chart, request_dictionary);
+ nvd3.draw('lineWithFocusChart', process_id, chart, request_dictionary);
}
});
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/scatter/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/scatter/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/scatter/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.scatterChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('scatterChart', process_id, chart, request_dictionary, function(nvd3_model) {
nvd3_model.showDistX(true)
.showDistY(true)
.color(d3.scale.category10().range());
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/stackedarea/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/stackedarea/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/stackedarea/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.stackedAreaChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('stackedAreaChart', process_id, chart, request_dictionary, function(nvd3_model) {
// make plot
nvd3_model.x(function(d) { return d.x })
.y(function(d) { return d.y })
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/stackedarea_full/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/stackedarea_full/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/stackedarea_full/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.stackedAreaChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('stackedAreaChart', process_id, chart, request_dictionary, function(nvd3_model) {
// make plot
nvd3_model.x(function(d) { return d.x })
.y(function(d) { return d.y })
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/nvd3/stackedarea_stream/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/stackedarea_stream/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/stackedarea_stream/wrapper.js
@@ -14,7 +14,7 @@
draw : function(process_id, chart, request_dictionary)
{
var nvd3 = new NVD3(this.app, this.options);
- nvd3.draw(process_id, nv.models.stackedAreaChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3.draw('stackedAreaChart', process_id, chart, request_dictionary, function(nvd3_model) {
// make plot
nvd3_model.x(function(d) { return d.x })
.y(function(d) { return d.y })
diff -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 -r a932242dc2da4fd532c640006aa2ae4d35a7d72b config/plugins/visualizations/charts/static/charts/tools.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/tools.js
@@ -0,0 +1,137 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// render
+function panelHelper (options)
+{
+ // require parameters
+ var process_id = options.process_id;
+ var chart = options.chart;
+ var request_dictionary = options.request_dictionary;
+ var render = options.render;
+ var canvas = options.canvas;
+ var app = options.app;
+
+ // request data
+ var self = this;
+ app.datasets.request(request_dictionary, function() {
+ try {
+ // check if this chart has multiple panels
+ if (!chart.definition.use_panels && chart.settings.get('use_panels') !== 'true') {
+ // draw all groups into a single panel
+ if (render(chart, request_dictionary.groups, canvas[0])) {
+ chart.state('ok', 'Chart drawn.');
+ }
+ } else {
+ // draw groups in separate panels
+ var valid = true;
+ for (var group_index in request_dictionary.groups) {
+ var group = request_dictionary.groups[group_index];
+ if (!render(chart, [group], canvas[group_index])) {
+ valid = false;
+ break;
+ }
+ }
+ if (valid) {
+ chart.state('ok', 'Multi-panel chart drawn.');
+ }
+ }
+
+ // unregister process
+ chart.deferred.done(process_id);
+ } catch (err) {
+ // log
+ console.debug('FAILED: Tools::draw() - ' + err);
+
+ // set chart state
+ chart.state('failed', err);
+
+ // unregister process
+ chart.deferred.done(process_id);
+ }
+ });
+};
+
+// series maker
+function makeSeries(group) {
+ // reset data
+ var data = [];
+
+ // format chart data
+ for (var value_index in group.values) {
+ // parse data
+ var point = [];
+ for (var column_index in group.values[value_index]) {
+ point.push(group.values[value_index][column_index]);
+ }
+
+ // add to data
+ data.push (point);
+ }
+
+ // return
+ return data;
+};
+
+// category maker
+function makeCategories(chart, groups) {
+ // hashkeys, arrays and counter for labeled columns
+ var categories = {};
+ var array = {};
+ var counter = {};
+
+ // identify label columns
+ var chart_definition = groups[0];
+ for (var key in chart_definition.columns) {
+ var column_def = chart_definition.columns[key];
+ if (column_def.is_label) {
+ categories[key] = {};
+ array[key] = [];
+ counter[key] = 0;
+ }
+ }
+
+ // index all values contained in label columns (for all groups)
+ for (var i in groups) {
+ var group = groups[i];
+ for (var j in group.values) {
+ var value_dict = group.values[j];
+ for (var key in categories) {
+ var value = String(value_dict[key]);
+ if (categories[key][value] === undefined) {
+ categories[key][value] = counter[key];
+ array[key].push([counter[key], value]);
+ counter[key]++;
+ }
+ }
+ }
+ }
+
+ // convert group values into category indeces
+ for (var i in groups) {
+ var group = groups[i];
+ for (var j in group.values) {
+ var value_dict = group.values[j];
+ for (var key in categories) {
+ var value = String(value_dict[key]);
+ value_dict[key] = categories[key][value]
+ }
+ }
+ }
+
+ // return dictionary
+ return {
+ categories : categories,
+ array : array,
+ counter : counter
+ }
+};
+
+// return
+return {
+ panelHelper : panelHelper,
+ makeCategories : makeCategories,
+ makeSeries : makeSeries
+}
+
+});
\ No newline at end of file
This diff is so big that we needed to truncate the remainder.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Clarify language in DeleteIntermediateDataset PJA.
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/84a00e4f7d06/
Changeset: 84a00e4f7d06
User: dannon
Date: 2014-06-06 23:12:30
Summary: Clarify language in DeleteIntermediateDataset PJA.
Affected #: 1 file
diff -r 6a90c63fe697c60350129d6c245d7516fc649bc4 -r 84a00e4f7d06e9adcec7297d8133ce70524dc242 lib/galaxy/jobs/actions/post.py
--- a/lib/galaxy/jobs/actions/post.py
+++ b/lib/galaxy/jobs/actions/post.py
@@ -404,7 +404,7 @@
p_str += "<label for='pja__"+pja.output_name+"__DeleteIntermediatesAction'>There are no additional options for this action.</label>\
<input type='hidden' name='pja__"+pja.output_name+"__DeleteIntermediatesAction'/>";
"""
- return get_form_template(cls.name, cls.verbose_name, form, "All steps in this workflow will have non-output datasets deleted if they are no longer being used as job inputs at the time of this job finishing.", on_output=False)
+ return get_form_template(cls.name, cls.verbose_name, form, "All non-output steps of this workflow will have datasets deleted if they are no longer being used as job inputs when the job this PostJobAction is attached to is finished. You *must* be using workflow outputs (the snowflake) in your workflow for this to have any effect.", on_output=False)
@classmethod
def get_short_str(cls, pja):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Cleanup, pep8 for postjobactions.
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6a90c63fe697/
Changeset: 6a90c63fe697
User: dannon
Date: 2014-06-06 22:44:47
Summary: Cleanup, pep8 for postjobactions.
Affected #: 1 file
diff -r f23dd6b6b6a54c09b0a6f6b890170869ded5723b -r 6a90c63fe697c60350129d6c245d7516fc649bc4 lib/galaxy/jobs/actions/post.py
--- a/lib/galaxy/jobs/actions/post.py
+++ b/lib/galaxy/jobs/actions/post.py
@@ -9,7 +9,8 @@
log = logging.getLogger( __name__ )
-def get_form_template(action_type, title, content, help, on_output = True ):
+
+def get_form_template(action_type, title, content, help, on_output=True ):
if on_output:
form = """
if (pja.action_type == "%s"){
@@ -19,7 +20,7 @@
p_str += "</div><div class='toolParamHelp'>%s</div></div>";
}""" % (action_type, title, content, help)
else:
- form = """
+ form = """
if (pja.action_type == "%s"){
p_str = "<div class='pjaForm toolForm'><span class='action_tag' style='display:none'>"+ pja.action_type + "</span><div class='toolFormTitle'> %s \
<div style='float: right;' class='buttons'><img src='/static/images/history-buttons/delete_icon.png'></div></div><div class='toolFormBody'>";
@@ -37,7 +38,7 @@
verbose_name = "Default Job"
@classmethod
- def execute(cls, app, sa_session, action, job, replacement_dict = None):
+ def execute(cls, app, sa_session, action, job, replacement_dict=None):
pass
@classmethod
@@ -61,12 +62,12 @@
@classmethod
def execute(cls, app, sa_session, action, job, replacement_dict):
- if action.action_arguments and action.action_arguments.has_key('host'):
+ if action.action_arguments and 'host' in action.action_arguments:
host = action.action_arguments['host']
else:
host = 'usegalaxy.org'
frm = 'galaxy-noreply@%s' % host
- to = job.user.email
+ to = job.user.email
subject = "Galaxy workflow step notification '%s'" % (job.history.name)
outdata = ', '.join(ds.dataset.display_name() for ds in job.output_datasets)
body = "Your Galaxy job generating dataset '%s' is complete as of %s." % (outdata, datetime.datetime.now().strftime( "%I:%M" ))
@@ -81,11 +82,11 @@
p_str += "<label for='pja__"+pja.output_name+"__EmailAction'>There are no additional options for this action. You will be emailed upon job completion.</label>\
<input type='hidden' value='%s' name='pja__"+pja.output_name+"__EmailAction__host'/><input type='hidden' name='pja__"+pja.output_name+"__EmailAction'/>";
""" % trans.request.host
- return get_form_template(cls.name, cls.verbose_name, form, "This action will send an email notifying you when the job is done.", on_output = False)
+ return get_form_template(cls.name, cls.verbose_name, form, "This action will send an email notifying you when the job is done.", on_output=False)
@classmethod
def get_short_str(cls, pja):
- if pja.action_arguments and pja.action_arguments.has_key('host'):
+ if pja.action_arguments and 'host' in pja.action_arguments:
return "Email the current user from server %s when this job is complete." % pja.action_arguments['host']
else:
return "Email the current user when this job is complete."
@@ -94,6 +95,7 @@
class ChangeDatatypeAction(DefaultJobAction):
name = "ChangeDatatypeAction"
verbose_name = "Change Datatype"
+
@classmethod
def execute(cls, app, sa_session, action, job, replacement_dict):
for dataset_assoc in job.output_datasets:
@@ -116,7 +118,7 @@
p_str += "<scrip" + "t type='text/javascript'>$('#pja__" + pja.output_name + "__ChangeDatatypeAction__newtype').val('" + pja.action_arguments.newtype + "');</scrip" + "t>";
}
""" % dt_list
- # Note the scrip + t hack above. Is there a better way?
+ # Note the scrip + t hack above. Is there a better way?
return get_form_template(cls.name, cls.verbose_name, ps, 'This action will change the datatype of the output to the indicated value.')
@classmethod
@@ -131,7 +133,7 @@
@classmethod
def execute(cls, app, sa_session, action, job, replacement_dict):
# Prevent renaming a dataset to the empty string.
- if action.action_arguments and action.action_arguments.has_key('newname') and action.action_arguments['newname'] != '':
+ if action.action_arguments and action.action_arguments.get('newname', ''):
new_name = action.action_arguments['newname']
# TODO: Unify and simplify replacement options.
@@ -165,10 +167,9 @@
tokens = to_be_replaced.split("|")
operations = []
if len(tokens) > 1:
- input_file_var = tokens[0].strip()
- for i in range(1, len(tokens)):
- operations.append(tokens[i].strip())
-
+ input_file_var = tokens[0].strip()
+ for i in range(1, len(tokens)):
+ operations.append(tokens[i].strip())
replacement = ""
# Lookp through inputs find one with "to_be_replaced" input
# variable name, and get the replacement name
@@ -220,7 +221,7 @@
@classmethod
def get_short_str(cls, pja):
# Prevent renaming a dataset to the empty string.
- if pja.action_arguments and pja.action_arguments.has_key('newname') and pja.action_arguments['newname'] != '':
+ if pja.action_arguments and pja.action_arguments.get('newname', ''):
return "Rename output '%s' to '%s'." % (pja.output_name, pja.action_arguments['newname'])
else:
return "Rename action used without a new name specified. Output name will be unchanged."
@@ -234,19 +235,21 @@
def execute(cls, app, sa_session, action, job, replacement_dict):
for dataset_assoc in job.output_datasets:
if dataset_assoc.dataset.state != dataset_assoc.dataset.states.ERROR and ( action.output_name == '' or dataset_assoc.name == action.output_name ):
- dataset_assoc.dataset.visible=False
+ dataset_assoc.dataset.visible = False
@classmethod
def get_config_form(cls, trans):
- return """
- if (pja.action_type == "HideDatasetAction"){
- p_str += "<input type='hidden' name='pja__"+pja.output_name+"__HideDatasetAction'/>";
- }
- """
+ return """
+ if (pja.action_type == "HideDatasetAction"){
+ p_str += "<input type='hidden' name='pja__"+pja.output_name+"__HideDatasetAction'/>";
+ }
+ """
+
@classmethod
def get_short_str(cls, pja):
return "Hide output '%s'." % pja.output_name
+
class DeleteDatasetAction(DefaultJobAction):
# This is disabled for right now. Deleting a dataset in the middle of a workflow causes errors (obviously) for the subsequent steps using the data.
name = "DeleteDatasetAction"
@@ -256,7 +259,7 @@
def execute(cls, app, sa_session, action, job, replacement_dict):
for dataset_assoc in job.output_datasets:
if action.output_name == '' or dataset_assoc.name == action.output_name:
- dataset_assoc.dataset.deleted=True
+ dataset_assoc.dataset.deleted = True
@classmethod
def get_config_form(cls, trans):
@@ -271,10 +274,10 @@
return "Delete this dataset after creation."
-
class ColumnSetAction(DefaultJobAction):
name = "ColumnSetAction"
verbose_name = "Assign Columns"
+
@classmethod
def execute(cls, app, sa_session, action, job, replacement_dict):
for dataset_assoc in job.output_datasets:
@@ -401,22 +404,21 @@
p_str += "<label for='pja__"+pja.output_name+"__DeleteIntermediatesAction'>There are no additional options for this action.</label>\
<input type='hidden' name='pja__"+pja.output_name+"__DeleteIntermediatesAction'/>";
"""
- return get_form_template(cls.name, cls.verbose_name, form, "All steps in this workflow will have non-output datasets deleted if they are no longer being used as job inputs at the time of this job finishing.This action will delete non-output datasets of parent steps in this workflow.", on_output = False)
+ return get_form_template(cls.name, cls.verbose_name, form, "All steps in this workflow will have non-output datasets deleted if they are no longer being used as job inputs at the time of this job finishing.", on_output=False)
@classmethod
def get_short_str(cls, pja):
return "Delete parent datasets of this step created in this workflow that aren't flagged as outputs."
-
class ActionBox(object):
- actions = { "RenameDatasetAction" : RenameDatasetAction,
- "HideDatasetAction" : HideDatasetAction,
+ actions = { "RenameDatasetAction": RenameDatasetAction,
+ "HideDatasetAction": HideDatasetAction,
"ChangeDatatypeAction": ChangeDatatypeAction,
- "ColumnSetAction" : ColumnSetAction,
- "EmailAction" : EmailAction,
- "DeleteIntermediatesAction" : DeleteIntermediatesAction,
+ "ColumnSetAction": ColumnSetAction,
+ "EmailAction": EmailAction,
+ "DeleteIntermediatesAction": DeleteIntermediatesAction,
}
public_actions = ['RenameDatasetAction', 'ChangeDatatypeAction',
'ColumnSetAction', 'EmailAction',
@@ -438,10 +440,10 @@
sp = key.split('__')
ao_key = sp[2] + sp[1]
# flag / output_name / pjatype / desc
- if not ao_key in npd:
- npd[ao_key] = {'action_type' : sp[2],
- 'output_name' : sp[1],
- 'action_arguments' : {}}
+ if ao_key not in npd:
+ npd[ao_key] = {'action_type': sp[2],
+ 'output_name': sp[1],
+ 'action_arguments': {}}
if len(sp) > 3:
if sp[3] == 'output_name':
npd[ao_key]['output_name'] = val
@@ -468,6 +470,6 @@
return forms
@classmethod
- def execute(cls, app, sa_session, pja, job, replacement_dict = None):
- if ActionBox.actions.has_key(pja.action_type):
+ def execute(cls, app, sa_session, pja, job, replacement_dict=None):
+ if pja.action_type in ActionBox.actions:
ActionBox.actions[pja.action_type].execute(app, sa_session, pja, job, replacement_dict)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Initial version of delete intermediate output steps action for workflows.
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f23dd6b6b6a5/
Changeset: f23dd6b6b6a5
User: dannon
Date: 2014-06-06 22:32:44
Summary: Initial version of delete intermediate output steps action for workflows.
Affected #: 1 file
diff -r 20d6c7849901c2669562ee6c0ccbb5089372ec03 -r f23dd6b6b6a54c09b0a6f6b890170869ded5723b lib/galaxy/jobs/actions/post.py
--- a/lib/galaxy/jobs/actions/post.py
+++ b/lib/galaxy/jobs/actions/post.py
@@ -1,3 +1,7 @@
+"""
+Actions to be run at job completion. Currently only used in workflows.
+"""
+
import datetime
import logging
from galaxy.util import send_mail
@@ -5,8 +9,6 @@
log = logging.getLogger( __name__ )
-# DBTODO This still needs refactoring and general cleanup.
-
def get_form_template(action_type, title, content, help, on_output = True ):
if on_output:
form = """
@@ -26,14 +28,11 @@
}""" % (action_type, title, content, help)
return form
-# def get_field(action, argument, i_type, label = None):
-# fstr = ''
-# fname = """pja__"+pja.output_name+"__%s__%s""" % (action, argument)
-# if label:
-# fstr += """<label for='pja__"+pja.output_name+"__ColumnSetAction__chromCol'>Chrom Column</label>"""
-# fstr += """<input type='text' value=" + chromCol + " name='pja__"+pja.output_name+"__ColumnSetAction__chromCol'/>"""
class DefaultJobAction(object):
+ """
+ Base job action.
+ """
name = "DefaultJobAction"
verbose_name = "Default Job"
@@ -54,6 +53,9 @@
class EmailAction(DefaultJobAction):
+ """
+ This action sends an email to the galaxy user responsible for a job.
+ """
name = "EmailAction"
verbose_name = "Email Notification"
@@ -358,6 +360,54 @@
return get_form_template(cls.name, cls.verbose_name, form, "This action will set metadata in the output dataset.")
+class DeleteIntermediatesAction(DefaultJobAction):
+ name = "DeleteIntermediatesAction"
+ verbose_name = "Delete Non-Output Completed Intermediate Steps"
+
+ @classmethod
+ def execute(cls, app, sa_session, action, job, replacement_dict):
+ # TODO Optimize this later. Just making it work for now.
+ # TODO Support purging as well as deletion if user_purge is enabled.
+ # Dataset candidates for deletion must be
+ # 1) Created by the workflow.
+ # 2) Not have any job_to_input_dataset associations with states other
+ # than OK or DELETED. If a step errors, we don't want to delete/purge it
+ # automatically.
+ # 3) Not marked as a workflow output.
+ # POTENTIAL ISSUES: When many outputs are being finish()ed
+ # concurrently, sometimes non-terminal steps won't be cleaned up
+ # because of the lag in job state updates.
+ wfi = job.workflow_invocation_step.workflow_invocation
+ if wfi.workflow.has_outputs_defined():
+ jobs_to_check = [wfistep.job for wfistep in wfi.steps if not wfistep.workflow_step.workflow_outputs]
+ for j2c in jobs_to_check:
+ for input_dataset in [x.dataset for x in j2c.input_datasets if x.dataset.creating_job.workflow_invocation_step and x.dataset.creating_job.workflow_invocation_step.workflow_invocation == wfi]:
+ safe_to_delete = True
+ for job_to_check in [d_j.job for d_j in input_dataset.dependent_jobs]:
+ if job_to_check != job and job_to_check.state not in [job.states.OK, job.states.DELETED]:
+ log.debug("Workflow Intermediates cleanup attempted, but non-terminal state '%s' detected for job %s" % (job_to_check.state, job_to_check.id))
+ safe_to_delete = False
+ if safe_to_delete:
+ # Support purging here too.
+ input_dataset.mark_deleted()
+ else:
+ # No workflow outputs defined, so we can't know what to delete.
+ # We could make this work differently in the future
+ pass
+
+ @classmethod
+ def get_config_form(cls, trans):
+ form = """
+ p_str += "<label for='pja__"+pja.output_name+"__DeleteIntermediatesAction'>There are no additional options for this action.</label>\
+ <input type='hidden' name='pja__"+pja.output_name+"__DeleteIntermediatesAction'/>";
+ """
+ return get_form_template(cls.name, cls.verbose_name, form, "All steps in this workflow will have non-output datasets deleted if they are no longer being used as job inputs at the time of this job finishing.This action will delete non-output datasets of parent steps in this workflow.", on_output = False)
+
+ @classmethod
+ def get_short_str(cls, pja):
+ return "Delete parent datasets of this step created in this workflow that aren't flagged as outputs."
+
+
class ActionBox(object):
@@ -366,10 +416,11 @@
"ChangeDatatypeAction": ChangeDatatypeAction,
"ColumnSetAction" : ColumnSetAction,
"EmailAction" : EmailAction,
- # "SetMetadataAction" : SetMetadataAction,
- # "DeleteDatasetAction" : DeleteDatasetAction,
+ "DeleteIntermediatesAction" : DeleteIntermediatesAction,
}
- public_actions = ['RenameDatasetAction', 'ChangeDatatypeAction', 'ColumnSetAction', 'EmailAction']
+ public_actions = ['RenameDatasetAction', 'ChangeDatatypeAction',
+ 'ColumnSetAction', 'EmailAction',
+ 'DeleteIntermediatesAction']
immediate_actions = ['ChangeDatatypeAction', 'RenameDatasetAction']
@classmethod
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Add Workflow.has_outputs_defined to the Workflow model.
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/20d6c7849901/
Changeset: 20d6c7849901
User: dannon
Date: 2014-06-06 21:36:07
Summary: Add Workflow.has_outputs_defined to the Workflow model.
Affected #: 2 files
diff -r c113771db6b2f50800f045e7b74a8d650c0474e8 -r 20d6c7849901c2669562ee6c0ccbb5089372ec03 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -2978,6 +2978,16 @@
self.has_errors = None
self.steps = []
+ def has_outputs_defined(self):
+ """
+ Returns true or false indicating whether or not a workflow has outputs defined.
+ """
+ for step in self.steps:
+ if step.workflow_outputs:
+ return True
+ return False
+
+
class WorkflowStep( object ):
diff -r c113771db6b2f50800f045e7b74a8d650c0474e8 -r 20d6c7849901c2669562ee6c0ccbb5089372ec03 lib/galaxy/model/mapping.py
--- a/lib/galaxy/model/mapping.py
+++ b/lib/galaxy/model/mapping.py
@@ -1915,10 +1915,7 @@
order_by=asc(model.WorkflowStep.table.c.order_index),
cascade="all, delete-orphan",
lazy=False ),
- # outputs = relation( WorkflowOutput, backref='workflow',
- # primaryjoin=(Workflow.table.c.id == WorkflowStep.table.c.workflow_id),
- # secondaryjoin=(WorkflowStep.table.c.id == WorkflowOutput.table.c.workflow_step_id))
- ) )
+ ) )
mapper( model.WorkflowStep, model.WorkflowStep.table,
properties=dict(
@@ -2140,9 +2137,9 @@
def db_next_hid( self ):
"""
db_next_hid( self )
-
+
Override __next_hid to generate from the database in a concurrency safe way.
- Loads the next history ID from the DB and returns it.
+ Loads the next history ID from the DB and returns it.
It also saves the future next_id into the DB.
:rtype: int
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Charts: Reduce number of available chart types
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
MSBuZXcgY29tbWl0IGluIGdhbGF4eS1jZW50cmFsOgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dh
bGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzL2MxMTM3NzFkYjZiMi8KQ2hhbmdlc2V0OiAgIGMx
MTM3NzFkYjZiMgpVc2VyOiAgICAgICAgZ3VlcmxlcgpEYXRlOiAgICAgICAgMjAxNC0wNi0wNiAy
MTozNDo0MApTdW1tYXJ5OiAgICAgQ2hhcnRzOiBSZWR1Y2UgbnVtYmVyIG9mIGF2YWlsYWJsZSBj
aGFydCB0eXBlcwpBZmZlY3RlZCAjOiAgMzMgZmlsZXMKCmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIx
YjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3
NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRp
Yy9idWlsZC1hcHAuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRz
L3N0YXRpYy9idWlsZC1hcHAuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMv
Y2hhcnRzL3N0YXRpYy9idWlsZC1hcHAuanMKQEAgLTMsNCArMyw0IEBACiAvLyAgICAgKGMpIDIw
MDktMjAxMyBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgSW5jLgogLy8gICAgIFVuZGVy
c2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCj0y
MAotZGVmaW5lKCJtdmMvdWkvdWktbW9kYWwiLFtdLGZ1bmN0aW9uKCl7dmFyIGU9M0RCYWNrYm9u
ZS5WaWV3LmV4dGVuZCh7ZWxNYWk9Cm46ImJvZHkiLG9wdGlvbnNEZWZhdWx0Ont0aXRsZToidWkt
bW9kYWwiLGJvZHk6IiIsYmFja2Ryb3A6ITAsaGVpZ2h0Om51bGwsdz0KaWR0aDpudWxsLGNsb3Np
bmdfZXZlbnRzOiExLGNsb3NpbmdfY2FsbGJhY2s6bnVsbH0sYnV0dG9uTGlzdDp7fSxpbml0aWFs
aXplPQo6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fY3JlYXRlKGUpfSxzaG93OmZ1bmN0aW9uKGUpe3Ro
aXMuaW5pdGlhbGl6ZShlKSx0aGlzLm89CnB0aW9ucy5oZWlnaHQ/KHRoaXMuJGJvZHkuY3NzKCJo
ZWlnaHQiLHRoaXMub3B0aW9ucy5oZWlnaHQpLHRoaXMuJGJvZHkuY3NzKD0KIm92ZXJmbG93Iiwi
aGlkZGVuIikpOnRoaXMuJGJvZHkuY3NzKCJtYXgtaGVpZ2h0IiwkKHdpbmRvdykuaGVpZ2h0KCkv
MiksdGhpPQpzLm9wdGlvbnMud2lkdGgmJnRoaXMuJGRpYWxvZy5jc3MoIndpZHRoIix0aGlzLm9w
dGlvbnMud2lkdGgpLHRoaXMudmlzaWJsZT89CnRoaXMuJGVsLnNob3coKTp0aGlzLiRlbC5mYWRl
SW4oImZhc3QiKSx0aGlzLnZpc2libGU9M0QhMH0saGlkZTpmdW5jdGlvbigpez0KdGhpcy52aXNp
YmxlPTNEITEsdGhpcy4kZWwuZmFkZU91dCgiZmFzdCIpLHRoaXMub3B0aW9ucy5jbG9zaW5nX2Nh
bGxiYWNrJiZ0PQpoaXMub3B0aW9ucy5jbG9zaW5nX2NhbGxiYWNrKCl9LGVuYWJsZUJ1dHRvbjpm
dW5jdGlvbihlKXt2YXIgdD0zRHRoaXMuYnV0dG89Cm5MaXN0W2VdO3RoaXMuJGJ1dHRvbnMuZmlu
ZCgiIyIrdCkucHJvcCgiZGlzYWJsZWQiLCExKX0sZGlzYWJsZUJ1dHRvbjpmdW5jdD0KaW9uKGUp
e3ZhciB0PTNEdGhpcy5idXR0b25MaXN0W2VdO3RoaXMuJGJ1dHRvbnMuZmluZCgiIyIrdCkucHJv
cCgiZGlzYWJsZWQiPQosITApfSxzaG93QnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PTNEdGhpcy5i
dXR0b25MaXN0W2VdO3RoaXMuJGJ1dHRvbnMuZmluZCg9CiIjIit0KS5zaG93KCl9LGhpZGVCdXR0
b246ZnVuY3Rpb24oZSl7dmFyIHQ9M0R0aGlzLmJ1dHRvbkxpc3RbZV07dGhpcy4kYnV0dD0Kb25z
LmZpbmQoIiMiK3QpLmhpZGUoKX0sZ2V0QnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PTNEdGhpcy5i
dXR0b25MaXN0W2VdO3JlPQp0dXJuIHRoaXMuJGJ1dHRvbnMuZmluZCgiIyIrdCl9LHNjcm9sbFRv
cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRib2R5LnNjcm89CmxsVG9wKCl9LF9jcmVhdGU6ZnVu
Y3Rpb24oZSl7dmFyIHQ9M0R0aGlzO3RoaXMub3B0aW9ucz0zRF8uZGVmYXVsdHMoZSx0aGlzLj0K
b3B0aW9uc0RlZmF1bHQpLHRoaXMub3B0aW9ucy5ib2R5PTNEPTNEInByb2dyZXNzIiYmKHRoaXMu
b3B0aW9ucy5ib2R5PTNEJCgnPQo8ZGl2IGNsYXNzPTNEInByb2dyZXNzIHByb2dyZXNzLXN0cmlw
ZWQgYWN0aXZlIj48ZGl2IGNsYXNzPTNEInByb2dyZXNzLWJhciA9CnByb2dyZXNzLWJhci1pbmZv
IiBzdHlsZT0zRCJ3aWR0aDoxMDAlIj48L2Rpdj48L2Rpdj4nKSksdGhpcy4kZWwmJih0aGlzLiRl
bD0KLnJlbW92ZSgpLCQoZG9jdW1lbnQpLm9mZigia2V5dXAudWktbW9kYWwiKSksdGhpcy5zZXRF
bGVtZW50KHRoaXMuX3RlbXBsYXRlPQoodGhpcy5vcHRpb25zLnRpdGxlKSksdGhpcy4kZGlhbG9n
PTNEdGhpcy4kZWwuZmluZCgiLm1vZGFsLWRpYWxvZyIpLHRoaXMuJGI9Cm9keT0zRHRoaXMuJGVs
LmZpbmQoIi5tb2RhbC1ib2R5IiksdGhpcy4kZm9vdGVyPTNEdGhpcy4kZWwuZmluZCgiLm1vZGFs
LWZvbz0KdGVyIiksdGhpcy4kYnV0dG9ucz0zRHRoaXMuJGVsLmZpbmQoIi5idXR0b25zIiksdGhp
cy4kYmFja2Ryb3A9M0R0aGlzLiRlbC5mPQppbmQoIi5tb2RhbC1iYWNrZHJvcCIpLHRoaXMuJGJv
ZHkuaHRtbCh0aGlzLm9wdGlvbnMuYm9keSksdGhpcy5vcHRpb25zLmJhY2s9CmRyb3B8fHRoaXMu
JGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO2lmKHRoaXMub3B0aW9ucy5idXR0b25zKXt0aGlz
LmJ1dHRvbj0KTGlzdD0zRHt9O3ZhciBuPTNEMDskLmVhY2godGhpcy5vcHRpb25zLmJ1dHRvbnMs
ZnVuY3Rpb24oZSxyKXt2YXIgaT0zRCJidXR0PQpvbi0iK24rKzt0LiRidXR0b25zLmFwcGVuZCgk
KCc8YnV0dG9uIGlkPTNEIicraSsnIj48L2J1dHRvbj4nKS50ZXh0KGUpLmNsaWM9CmsocikpLmFw
cGVuZCgiICIpLHQuYnV0dG9uTGlzdFtlXT0zRGl9KX1lbHNlIHRoaXMuJGZvb3Rlci5oaWRlKCk7
JCh0aGlzLmVsTT0KYWluKS5hcHBlbmQoJCh0aGlzLmVsKSksdGhpcy5vcHRpb25zLmNsb3Npbmdf
ZXZlbnRzJiYoJChkb2N1bWVudCkub24oImtleXVwPQoudWktbW9kYWwiLGZ1bmN0aW9uKGUpe2Uu
a2V5Q29kZT0zRD0zRDI3JiZ0LmhpZGUoKX0pLHRoaXMuJGVsLmZpbmQoIi5tb2RhbC09CmJhY2tk
cm9wIikub24oImNsaWNrIixmdW5jdGlvbigpe3QuaGlkZSgpfSkpfSxfdGVtcGxhdGU6ZnVuY3Rp
b24oZSl7cmV0dXJuJz0KPGRpdiBjbGFzcz0zRCJtb2RhbCI+PGRpdiBjbGFzcz0zRCJtb2RhbC1i
YWNrZHJvcCBmYWRlIGluIiBzdHlsZT0zRCJ6LWluZGV4PQo6IC0xOyI+PC9kaXY+PGRpdiBjbGFz
cz0zRCJtb2RhbC1kaWFsb2ciPjxkaXYgY2xhc3M9M0QibW9kYWwtY29udGVudCI+PGRpdiA9CmNs
YXNzPTNEIm1vZGFsLWhlYWRlciI+PGJ1dHRvbiB0eXBlPTNEImJ1dHRvbiIgY2xhc3M9M0QiY2xv
c2UiIHN0eWxlPTNEImRpcz0KcGxheTogbm9uZTsiPiZ0aW1lczs8L2J1dHRvbj48aDQgY2xhc3M9
M0QidGl0bGUiPicrZSsiPC9oND4iKyI8L2Rpdj4iKyc8ZGl2PQogY2xhc3M9M0QibW9kYWwtYm9k
eSIgc3R5bGU9M0QicG9zaXRpb246IHN0YXRpYzsiPjwvZGl2PicrJzxkaXYgY2xhc3M9M0QibW89
CmRhbC1mb290ZXIiPicrJzxkaXYgY2xhc3M9M0QiYnV0dG9ucyIgc3R5bGU9M0QiZmxvYXQ6IHJp
Z2h0OyI+PC9kaXY+JysiPC9kaT0Kdj4iKyI8L2RpdiIrIjwvZGl2PiIrIjwvZGl2PiJ9fSk7cmV0
dXJue1ZpZXc6ZX19KSxmdW5jdGlvbigpe3ZhciBlPTNEdGhpcyx0PQo9M0RlLl8sbj0zRHt9LHI9
M0RBcnJheS5wcm90b3R5cGUsaT0zRE9iamVjdC5wcm90b3R5cGUscz0zREZ1bmN0aW9uLnByb3Rv
dHk9CnBlLG89M0RyLnB1c2gsdT0zRHIuc2xpY2UsYT0zRHIuY29uY2F0LGY9M0RpLnRvU3RyaW5n
LGw9M0RpLmhhc093blByb3BlcnR5LD0KYz0zRHIuZm9yRWFjaCxoPTNEci5tYXAscD0zRHIucmVk
dWNlLGQ9M0RyLnJlZHVjZVJpZ2h0LHY9M0RyLmZpbHRlcixtPTNEci5lPQp2ZXJ5LGc9M0RyLnNv
bWUseT0zRHIuaW5kZXhPZixiPTNEci5sYXN0SW5kZXhPZix3PTNEQXJyYXkuaXNBcnJheSxFPTNE
T2JqZWM9CnQua2V5cyxTPTNEcy5iaW5kLHg9M0RmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2Yg
eClyZXR1cm4gZTtpZighKHRoaXMgaW5zdD0KYW5jZW9mIHgpKXJldHVybiBuZXcgeChlKTt0aGlz
Ll93cmFwcGVkPTNEZX07dHlwZW9mIGV4cG9ydHMhPTNEInVuZGVmaW5lZCI/PQoodHlwZW9mIG1v
ZHVsZSE9M0QidW5kZWZpbmVkIiYmbW9kdWxlLmV4cG9ydHMmJihleHBvcnRzPTNEbW9kdWxlLmV4
cG9ydHM9M0Q9CngpLGV4cG9ydHMuXz0zRHgpOmUuXz0zRHgseC5WRVJTSU9OPTNEIjEuNC40Ijt2
YXIgVD0zRHguZWFjaD0zRHguZm9yRWFjaD0zRD0KZnVuY3Rpb24oZSx0LHIpe2lmKGU9M0Q9M0Ru
dWxsKXJldHVybjtpZihjJiZlLmZvckVhY2g9M0Q9M0Q9M0RjKWUuZm9yRWFjaCh0PQoscik7ZWxz
ZSBpZihlLmxlbmd0aD0zRD0zRD0zRCtlLmxlbmd0aCl7Zm9yKHZhciBpPTNEMCxzPTNEZS5sZW5n
dGg7aTxzO2krKyk9CmlmKHQuY2FsbChyLGVbaV0saSxlKT0zRD0zRD0zRG4pcmV0dXJufWVsc2Ug
Zm9yKHZhciBvIGluIGUpaWYoeC5oYXMoZSxvKSYmdD0KLmNhbGwocixlW29dLG8sZSk9M0Q9M0Q9
M0RuKXJldHVybn07eC5tYXA9M0R4LmNvbGxlY3Q9M0RmdW5jdGlvbihlLHQsbil7dmFyPQogcj0z
RFtdO3JldHVybiBlPTNEPTNEbnVsbD9yOmgmJmUubWFwPTNEPTNEPTNEaD9lLm1hcCh0LG4pOihU
KGUsZnVuY3Rpb24oZSw9Cmkscyl7ci5wdXNoKHQuY2FsbChuLGUsaSxzKSl9KSxyKX07dmFyIE49
M0QiUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaT0Kbml0aWFsIHZhbHVlIjt4LnJlZHVj
ZT0zRHguZm9sZGw9M0R4LmluamVjdD0zRGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPTNEYXJnPQp1
bWVudHMubGVuZ3RoPjI7ZT0zRD0zRG51bGwmJihlPTNEW10pO2lmKHAmJmUucmVkdWNlPTNEPTNE
PTNEcClyZXR1cm4gciYmKHQ9Cj0zRHguYmluZCh0LHIpKSxpP2UucmVkdWNlKHQsbik6ZS5yZWR1
Y2UodCk7VChlLGZ1bmN0aW9uKGUscyxvKXtpP249M0R0LmNhbD0KbChyLG4sZSxzLG8pOihuPTNE
ZSxpPTNEITApfSk7aWYoIWkpdGhyb3cgbmV3IFR5cGVFcnJvcihOKTtyZXR1cm4gbn0seC5yZWR1
PQpjZVJpZ2h0PTNEeC5mb2xkcj0zRGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPTNEYXJndW1lbnRz
Lmxlbmd0aD4yO2U9M0Q9M0RudWw9CmwmJihlPTNEW10pO2lmKGQmJmUucmVkdWNlUmlnaHQ9M0Q9
M0Q9M0RkKXJldHVybiByJiYodD0zRHguYmluZCh0LHIpKSxpP2Uucj0KZWR1Y2VSaWdodCh0LG4p
OmUucmVkdWNlUmlnaHQodCk7dmFyIHM9M0RlLmxlbmd0aDtpZihzIT0zRD0zRCtzKXt2YXIgbz0z
RHguPQprZXlzKGUpO3M9M0RvLmxlbmd0aH1UKGUsZnVuY3Rpb24odSxhLGYpe2E9M0RvP29bLS1z
XTotLXMsaT9uPTNEdC5jYWxsKHIsbiw9CmVbYV0sYSxmKToobj0zRGVbYV0saT0zRCEwKX0pO2lm
KCFpKXRocm93IG5ldyBUeXBlRXJyb3IoTik7cmV0dXJuIG59LHguZmluZD0KPTNEeC5kZXRlY3Q9
M0RmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIEMoZSxmdW5jdGlvbihlLGkscyl7aWYodC5j
YWxsKG4sPQplLGkscykpcmV0dXJuIHI9M0RlLCEwfSkscn0seC5maWx0ZXI9M0R4LnNlbGVjdD0z
RGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0zRFs9Cl07cmV0dXJuIGU9M0Q9M0RudWxsP3I6diYmZS5m
aWx0ZXI9M0Q9M0Q9M0R2P2UuZmlsdGVyKHQsbik6KFQoZSxmdW5jdGlvbihlLD0KaSxzKXt0LmNh
bGwobixlLGkscykmJnIucHVzaChlKX0pLHIpfSx4LnJlamVjdD0zRGZ1bmN0aW9uKGUsdCxuKXty
ZXR1cm4geC5mPQppbHRlcihlLGZ1bmN0aW9uKGUscixpKXtyZXR1cm4hdC5jYWxsKG4sZSxyLGkp
fSxuKX0seC5ldmVyeT0zRHguYWxsPTNEZnVuY3Q9CmlvbihlLHQscil7dHx8KHQ9M0R4LmlkZW50
aXR5KTt2YXIgaT0zRCEwO3JldHVybiBlPTNEPTNEbnVsbD9pOm0mJmUuZXZlcnk9Cj0zRD0zRD0z
RG0/ZS5ldmVyeSh0LHIpOihUKGUsZnVuY3Rpb24oZSxzLG8pe2lmKCEoaT0zRGkmJnQuY2FsbChy
LGUscyxvKSkpcj0KZXR1cm4gbn0pLCEhaSl9O3ZhciBDPTNEeC5zb21lPTNEeC5hbnk9M0RmdW5j
dGlvbihlLHQscil7dHx8KHQ9M0R4LmlkZW50aXR5PQopO3ZhciBpPTNEITE7cmV0dXJuIGU9M0Q9
M0RudWxsP2k6ZyYmZS5zb21lPTNEPTNEPTNEZz9lLnNvbWUodCxyKTooVChlLGZ1bmM9CnRpb24o
ZSxzLG8pe2lmKGl8fChpPTNEdC5jYWxsKHIsZSxzLG8pKSlyZXR1cm4gbn0pLCEhaSl9O3guY29u
dGFpbnM9M0R4LmluYz0KbHVkZT0zRGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9M0Q9M0RudWxsPyEx
OnkmJmUuaW5kZXhPZj0zRD0zRD0zRHk/ZS5pbmRleE9mPQoodCkhPTNELTE6QyhlLGZ1bmN0aW9u
KGUpe3JldHVybiBlPTNEPTNEPTNEdH0pfSx4Lmludm9rZT0zRGZ1bmN0aW9uKGUsdCl7dmE9CnIg
bj0zRHUuY2FsbChhcmd1bWVudHMsMikscj0zRHguaXNGdW5jdGlvbih0KTtyZXR1cm4geC5tYXAo
ZSxmdW5jdGlvbihlKXtyZT0KdHVybihyP3Q6ZVt0XSkuYXBwbHkoZSxuKX0pfSx4LnBsdWNrPTNE
ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5tYXAoZSxmdW5jdGlvPQpuKGUpe3JldHVybiBlW3RdfSl9
LHgud2hlcmU9M0RmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguaXNFbXB0eSh0KT9uP3ZvaWQgMDo9
CltdOnhbbj8iZmluZCI6ImZpbHRlciJdKGUsZnVuY3Rpb24oZSl7Zm9yKHZhciBuIGluIHQpaWYo
dFtuXSE9M0Q9M0RlW25dKXJldD0KdXJuITE7cmV0dXJuITB9KX0seC5maW5kV2hlcmU9M0RmdW5j
dGlvbihlLHQpe3JldHVybiB4LndoZXJlKGUsdCwhMCl9LHgubWF4PQo9M0RmdW5jdGlvbihlLHQs
bil7aWYoIXQmJnguaXNBcnJheShlKSYmZVswXT0zRD0zRD0zRCtlWzBdJiZlLmxlbmd0aDw2NTUz
NSk9CnJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGUpO2lmKCF0JiZ4LmlzRW1wdHkoZSkpcmV0
dXJuLUluZmluaXR5O3ZhciByPTNEez0KY29tcHV0ZWQ6LUluZmluaXR5LHZhbHVlOi1JbmZpbml0
eX07cmV0dXJuIFQoZSxmdW5jdGlvbihlLGkscyl7dmFyIG89M0R0P3QuPQpjYWxsKG4sZSxpLHMp
OmU7bz49M0RyLmNvbXB1dGVkJiYocj0zRHt2YWx1ZTplLGNvbXB1dGVkOm99KX0pLHIudmFsdWV9
LHgubWk9Cm49M0RmdW5jdGlvbihlLHQsbil7aWYoIXQmJnguaXNBcnJheShlKSYmZVswXT0zRD0z
RD0zRCtlWzBdJiZlLmxlbmd0aDw2NTUzNT0KKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGUp
O2lmKCF0JiZ4LmlzRW1wdHkoZSkpcmV0dXJuIEluZmluaXR5O3ZhciByPTNEPQp7Y29tcHV0ZWQ6
SW5maW5pdHksdmFsdWU6SW5maW5pdHl9O3JldHVybiBUKGUsZnVuY3Rpb24oZSxpLHMpe3ZhciBv
PTNEdD90LmM9CmFsbChuLGUsaSxzKTplO288ci5jb21wdXRlZCYmKHI9M0R7dmFsdWU6ZSxjb21w
dXRlZDpvfSl9KSxyLnZhbHVlfSx4LnNodWZmbD0KZT0zRGZ1bmN0aW9uKGUpe3ZhciB0LG49M0Qw
LHI9M0RbXTtyZXR1cm4gVChlLGZ1bmN0aW9uKGUpe3Q9M0R4LnJhbmRvbShuKyspPQoscltuLTFd
PTNEclt0XSxyW3RdPTNEZX0pLHJ9O3ZhciBrPTNEZnVuY3Rpb24oZSl7cmV0dXJuIHguaXNGdW5j
dGlvbihlKT9lOmY9CnVuY3Rpb24odCl7cmV0dXJuIHRbZV19fTt4LnNvcnRCeT0zRGZ1bmN0aW9u
KGUsdCxuKXt2YXIgcj0zRGsodCk7cmV0dXJuIHgucD0KbHVjayh4Lm1hcChlLGZ1bmN0aW9uKGUs
dCxpKXtyZXR1cm57dmFsdWU6ZSxpbmRleDp0LGNyaXRlcmlhOnIuY2FsbChuLGUsdCxpPQopfX0p
LnNvcnQoZnVuY3Rpb24oZSx0KXt2YXIgbj0zRGUuY3JpdGVyaWEscj0zRHQuY3JpdGVyaWE7aWYo
biE9M0Q9M0RyKXtpZig9Cm4+cnx8bj0zRD0zRD0zRHZvaWQgMClyZXR1cm4gMTtpZihuPHJ8fHI9
M0Q9M0Q9M0R2b2lkIDApcmV0dXJuLTF9cmV0dXJuIGUuaT0KbmRleDx0LmluZGV4Py0xOjF9KSwi
dmFsdWUiKX07dmFyIEw9M0RmdW5jdGlvbihlLHQsbixyKXt2YXIgaT0zRHt9LHM9M0RrKHQ9Cj0z
RD0zRG51bGw/eC5pZGVudGl0eTp0KTtyZXR1cm4gVChlLGZ1bmN0aW9uKHQsbyl7dmFyIHU9M0Rz
LmNhbGwobix0LG8sZSk7cj0KKGksdSx0KX0pLGl9O3guZ3JvdXBCeT0zRGZ1bmN0aW9uKGUsdCxu
KXtyZXR1cm4gTChlLHQsbixmdW5jdGlvbihlLHQsbil7KHguPQpoYXMoZSx0KT9lW3RdOmVbdF09
M0RbXSkucHVzaChuKX0pfSx4LmNvdW50Qnk9M0RmdW5jdGlvbihlLHQsbil7cmV0dXJuIEwoZSw9
CnQsbixmdW5jdGlvbihlLHQpe3guaGFzKGUsdCl8fChlW3RdPTNEMCksZVt0XSsrfSl9LHguc29y
dGVkSW5kZXg9M0RmdW5jdGlvbj0KKGUsdCxuLHIpe249M0RuPTNEPTNEbnVsbD94LmlkZW50aXR5
Omsobik7dmFyIGk9M0RuLmNhbGwocix0KSxzPTNEMCxvPTNEZS5sPQplbmd0aDt3aGlsZShzPG8p
e3ZhciB1PTNEcytvPj4+MTtuLmNhbGwocixlW3VdKTxpP3M9M0R1KzE6bz0zRHV9cmV0dXJuIHN9
LHg9Ci50b0FycmF5PTNEZnVuY3Rpb24oZSl7cmV0dXJuIGU/eC5pc0FycmF5KGUpP3UuY2FsbChl
KTplLmxlbmd0aD0zRD0zRD0zRCtlLj0KbGVuZ3RoP3gubWFwKGUseC5pZGVudGl0eSk6eC52YWx1
ZXMoZSk6W119LHguc2l6ZT0zRGZ1bmN0aW9uKGUpe3JldHVybiBlPTNEPQo9M0RudWxsPzA6ZS5s
ZW5ndGg9M0Q9M0Q9M0QrZS5sZW5ndGg/ZS5sZW5ndGg6eC5rZXlzKGUpLmxlbmd0aH0seC5maXJz
dD0zRHg9Ci5oZWFkPTNEeC50YWtlPTNEZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPTNEPTNEbnVs
bD92b2lkIDA6dCE9M0RudWxsJiYhbj91Lj0KY2FsbChlLDAsdCk6ZVswXX0seC5pbml0aWFsPTNE
ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1LmNhbGwoZSwwLGUubGVuZ3RoLSh0PQo9M0Q9M0RudWxs
fHxuPzE6dCkpfSx4Lmxhc3Q9M0RmdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9M0Q9M0RudWxsP3Zv
aWQgMDp0IT0KPTNEbnVsbCYmIW4/dS5jYWxsKGUsTWF0aC5tYXgoZS5sZW5ndGgtdCwwKSk6ZVtl
Lmxlbmd0aC0xXX0seC5yZXN0PTNEeC50YWlsPQo9M0R4LmRyb3A9M0RmdW5jdGlvbihlLHQsbil7
cmV0dXJuIHUuY2FsbChlLHQ9M0Q9M0RudWxsfHxuPzE6dCl9LHguY29tcGFjdD0KPTNEZnVuY3Rp
b24oZSl7cmV0dXJuIHguZmlsdGVyKGUseC5pZGVudGl0eSl9O3ZhciBBPTNEZnVuY3Rpb24oZSx0
LG4pe3JldHVyPQpuIFQoZSxmdW5jdGlvbihlKXt4LmlzQXJyYXkoZSk/dD9vLmFwcGx5KG4sZSk6
QShlLHQsbik6bi5wdXNoKGUpfSksbn07eC5mbGE9CnR0ZW49M0RmdW5jdGlvbihlLHQpe3JldHVy
biBBKGUsdCxbXSl9LHgud2l0aG91dD0zRGZ1bmN0aW9uKGUpe3JldHVybiB4LmRpZj0KZmVyZW5j
ZShlLHUuY2FsbChhcmd1bWVudHMsMSkpfSx4LnVuaXE9M0R4LnVuaXF1ZT0zRGZ1bmN0aW9uKGUs
dCxuLHIpe3guaXNGPQp1bmN0aW9uKHQpJiYocj0zRG4sbj0zRHQsdD0zRCExKTt2YXIgaT0zRG4/
eC5tYXAoZSxuLHIpOmUscz0zRFtdLG89M0RbXTtyZXQ9CnVybiBUKGksZnVuY3Rpb24obixyKXtp
Zih0PyFyfHxvW28ubGVuZ3RoLTFdIT0zRD0zRG46IXguY29udGFpbnMobyxuKSlvLnB1cz0KaChu
KSxzLnB1c2goZVtyXSl9KSxzfSx4LnVuaW9uPTNEZnVuY3Rpb24oKXtyZXR1cm4geC51bmlxKGEu
YXBwbHkocixhcmd1bWVuPQp0cykpfSx4LmludGVyc2VjdGlvbj0zRGZ1bmN0aW9uKGUpe3ZhciB0
PTNEdS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4geC5maWw9CnRlcih4LnVuaXEoZSksZnVuY3Rp
b24oZSl7cmV0dXJuIHguZXZlcnkodCxmdW5jdGlvbih0KXtyZXR1cm4geC5pbmRleE9mKHQsZT0K
KT49M0QwfSl9KX0seC5kaWZmZXJlbmNlPTNEZnVuY3Rpb24oZSl7dmFyIHQ9M0RhLmFwcGx5KHIs
dS5jYWxsKGFyZ3VtZW50cywxPQopKTtyZXR1cm4geC5maWx0ZXIoZSxmdW5jdGlvbihlKXtyZXR1
cm4heC5jb250YWlucyh0LGUpfSl9LHguemlwPTNEZnVuY3Rpb249Cigpe3ZhciBlPTNEdS5jYWxs
KGFyZ3VtZW50cyksdD0zRHgubWF4KHgucGx1Y2soZSwibGVuZ3RoIikpLG49M0RuZXcgQXJyYXko
dD0KKTtmb3IodmFyIHI9M0QwO3I8dDtyKyspbltyXT0zRHgucGx1Y2soZSwiIityKTtyZXR1cm4g
bn0seC51bnppcD0zRGZ1bmN0aW9uPQooZSl7dmFyIHQ9M0RbXTtyZXR1cm4geC5lYWNoKGUsZnVu
Y3Rpb24oZSxuKXt4LmVhY2goZSxmdW5jdGlvbihlLHIpe3QubGVuZ3Q9Cmg8PTNEciYmKHRbcl09
M0RbXSksdFtyXVtuXT0zRGV9KX0pLHR9LHgub2JqZWN0PTNEZnVuY3Rpb24oZSx0KXtpZihlPTNE
PTNEbj0KdWxsKXJldHVybnt9O3ZhciBuPTNEe307Zm9yKHZhciByPTNEMCxpPTNEZS5sZW5ndGg7
cjxpO3IrKyl0P25bZVtyXV09M0R0W3JdPQo6bltlW3JdWzBdXT0zRGVbcl1bMV07cmV0dXJuIG59
LHguaW5kZXhPZj0zRGZ1bmN0aW9uKGUsdCxuKXtpZihlPTNEPTNEbnVsbCk9CnJldHVybi0xO3Zh
ciByPTNEMCxpPTNEZS5sZW5ndGg7aWYobil7aWYodHlwZW9mIG4hPTNEIm51bWJlciIpcmV0dXJu
IHI9M0R4Lj0Kc29ydGVkSW5kZXgoZSx0KSxlW3JdPTNEPTNEPTNEdD9yOi0xO3I9M0RuPDA/TWF0
aC5tYXgoMCxpK24pOm59aWYoeSYmZS5pbmRlPQp4T2Y9M0Q9M0Q9M0R5KXJldHVybiBlLmluZGV4
T2YodCxuKTtmb3IoO3I8aTtyKyspaWYoZVtyXT0zRD0zRD0zRHQpcmV0dXJuIHI9CjtyZXR1cm4t
MX0seC5sYXN0SW5kZXhPZj0zRGZ1bmN0aW9uKGUsdCxuKXtpZihlPTNEPTNEbnVsbClyZXR1cm4t
MTt2YXIgcj0zRD0KbiE9M0RudWxsO2lmKGImJmUubGFzdEluZGV4T2Y9M0Q9M0Q9M0RiKXJldHVy
biByP2UubGFzdEluZGV4T2YodCxuKTplLmxhc3RJPQpuZGV4T2YodCk7dmFyIGk9M0RyP246ZS5s
ZW5ndGg7d2hpbGUoaS0tKWlmKGVbaV09M0Q9M0Q9M0R0KXJldHVybiBpO3JldHVybi09CjF9LHgu
cmFuZ2U9M0RmdW5jdGlvbihlLHQsbil7YXJndW1lbnRzLmxlbmd0aDw9M0QxJiYodD0zRGV8fDAs
ZT0zRDApLG49M0Rhcj0KZ3VtZW50c1syXXx8MTt2YXIgcj0zRE1hdGgubWF4KE1hdGguY2VpbCgo
dC1lKS9uKSwwKSxpPTNEMCxzPTNEbmV3IEFycmF5KHIpPQo7d2hpbGUoaTxyKXNbaSsrXT0zRGUs
ZSs9M0RuO3JldHVybiBzfTt2YXIgTz0zRGZ1bmN0aW9uKCl7fTt4LmJpbmQ9M0RmdW5jdGk9Cm9u
KGUsdCl7dmFyIG4scjtpZihlLmJpbmQ9M0Q9M0Q9M0RTJiZTKXJldHVybiBTLmFwcGx5KGUsdS5j
YWxsKGFyZ3VtZW50cywxKT0KKTtpZigheC5pc0Z1bmN0aW9uKGUpKXRocm93IG5ldyBUeXBlRXJy
b3I7cmV0dXJuIG49M0R1LmNhbGwoYXJndW1lbnRzLDIpLHI9Cj0zRGZ1bmN0aW9uKCl7aWYodGhp
cyBpbnN0YW5jZW9mIHIpe08ucHJvdG90eXBlPTNEZS5wcm90b3R5cGU7dmFyIGk9M0RuZXcgTz0K
O08ucHJvdG90eXBlPTNEbnVsbDt2YXIgcz0zRGUuYXBwbHkoaSxuLmNvbmNhdCh1LmNhbGwoYXJn
dW1lbnRzKSkpO3JldHVybiBPPQpiamVjdChzKT0zRD0zRD0zRHM/czppfXJldHVybiBlLmFwcGx5
KHQsbi5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX19LHgucGE9CnJ0aWFsPTNEZnVuY3Rpb24o
ZSl7dmFyIHQ9M0R1LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBl
Lj0KYXBwbHkodGhpcyx0LmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfX0seC5iaW5kQWxsPTNE
ZnVuY3Rpb24oZSl7dmFyIHQ9M0R1PQouY2FsbChhcmd1bWVudHMsMSk7aWYodC5sZW5ndGg9M0Q9
M0Q9M0QwKXRocm93IG5ldyBFcnJvcigiYmluZEFsbCBtdXN0IGJlIHA9CmFzc2VkIGZ1bmN0aW9u
IG5hbWVzIik7cmV0dXJuIFQodCxmdW5jdGlvbih0KXtlW3RdPTNEeC5iaW5kKGVbdF0sZSl9KSxl
fSx4Lj0KbWVtb2l6ZT0zRGZ1bmN0aW9uKGUsdCl7dmFyIG49M0R7fTtyZXR1cm4gdHx8KHQ9M0R4
LmlkZW50aXR5KSxmdW5jdGlvbigpe3ZhPQpyIHI9M0R0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTty
ZXR1cm4geC5oYXMobixyKT9uW3JdOm5bcl09M0RlLmFwcGx5KHRoaXMsYXI9Cmd1bWVudHMpfX0s
eC5kZWxheT0zRGZ1bmN0aW9uKGUsdCl7dmFyIG49M0R1LmNhbGwoYXJndW1lbnRzLDIpO3JldHVy
biBzZXRUaT0KbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShudWxsLG4pfSx0KX0seC5k
ZWZlcj0zRGZ1bmN0aW9uKGUpe3JldHVybiB4PQouZGVsYXkuYXBwbHkoeCxbZSwxXS5jb25jYXQo
dS5jYWxsKGFyZ3VtZW50cywxKSkpfSx4LnRocm90dGxlPTNEZnVuY3Rpb24oZSw9CnQsbil7dmFy
IHIsaSxzLG8sdT0zRDAsYT0zRGZ1bmN0aW9uKCl7dT0zRG5ldyBEYXRlLHM9M0RudWxsLG89M0Rl
LmFwcGx5KHIsaT0KKX07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGY9M0RuZXcgRGF0ZTshdSYmbj0z
RD0zRD0zRCExJiYodT0zRGYpO3ZhciBsPTNEdC0oPQpmLXUpO3JldHVybiByPTNEdGhpcyxpPTNE
YXJndW1lbnRzLGw8PTNEMD8oY2xlYXJUaW1lb3V0KHMpLHM9M0RudWxsLHU9M0RmLG89Cj0zRGUu
YXBwbHkocixpKSk6c3x8KHM9M0RzZXRUaW1lb3V0KGEsbCkpLG99fSx4LmRlYm91bmNlPTNEZnVu
Y3Rpb24oZSx0LG4pez0KdmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz0zRHRoaXMsbz0z
RGFyZ3VtZW50cyx1PTNEZnVuY3Rpb24oKXtyPTNEbnVsPQpsLG58fChpPTNEZS5hcHBseShzLG8p
KX0sYT0zRG4mJiFyO3JldHVybiBjbGVhclRpbWVvdXQocikscj0zRHNldFRpbWVvdXQodSw9CnQp
LGEmJihpPTNEZS5hcHBseShzLG8pKSxpfX0seC5vbmNlPTNEZnVuY3Rpb24oZSl7dmFyIHQ9M0Qh
MSxuO3JldHVybiBmdW5jdD0KaW9uKCl7cmV0dXJuIHQ/bjoodD0zRCEwLG49M0RlLmFwcGx5KHRo
aXMsYXJndW1lbnRzKSxlPTNEbnVsbCxuKX19LHgud3JhcD0KPTNEZnVuY3Rpb24oZSx0KXtyZXR1
cm4gZnVuY3Rpb24oKXt2YXIgbj0zRFtlXTtyZXR1cm4gby5hcHBseShuLGFyZ3VtZW50cyksPQp0
LmFwcGx5KHRoaXMsbil9fSx4LmNvbXBvc2U9M0RmdW5jdGlvbigpe3ZhciBlPTNEYXJndW1lbnRz
O3JldHVybiBmdW5jdGlvbig9Cil7dmFyIHQ9M0Rhcmd1bWVudHM7Zm9yKHZhciBuPTNEZS5sZW5n
dGgtMTtuPj0zRDA7bi0tKXQ9M0RbZVtuXS5hcHBseSh0aGlzLD0KdCldO3JldHVybiB0WzBdfX0s
eC5hZnRlcj0zRGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8PTNEMD90KCk6ZnVuY3Rpb24oKXtpZigt
PQotZTwxKXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LHgua2V5cz0zREV8fGZ1bmN0
aW9uKGUpe2lmKGUhPTNEPTNET2I9CmplY3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxp
ZCBvYmplY3QiKTt2YXIgdD0zRFtdO2Zvcih2YXIgbiBpbiBlKXguaD0KYXMoZSxuKSYmdC5wdXNo
KG4pO3JldHVybiB0fSx4LnZhbHVlcz0zRGZ1bmN0aW9uKGUpe3ZhciB0PTNEW107Zm9yKHZhciBu
IGluPQogZSl4LmhhcyhlLG4pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9LHgucGFpcnM9M0RmdW5j
dGlvbihlKXt2YXIgdD0zRFtdO2Zvcig9CnZhciBuIGluIGUpeC5oYXMoZSxuKSYmdC5wdXNoKFtu
LGVbbl1dKTtyZXR1cm4gdH0seC5pbnZlcnQ9M0RmdW5jdGlvbihlKXt2YT0KciB0PTNEe307Zm9y
KHZhciBuIGluIGUpeC5oYXMoZSxuKSYmKHRbZVtuXV09M0RuKTtyZXR1cm4gdH0seC5mdW5jdGlv
bnM9M0R4PQoubWV0aG9kcz0zRGZ1bmN0aW9uKGUpe3ZhciB0PTNEW107Zm9yKHZhciBuIGluIGUp
eC5pc0Z1bmN0aW9uKGVbbl0pJiZ0LnB1c2g9CihuKTtyZXR1cm4gdC5zb3J0KCl9LHguZXh0ZW5k
PTNEZnVuY3Rpb24oZSl7cmV0dXJuIFQodS5jYWxsKGFyZ3VtZW50cywxKSxmdT0KbmN0aW9uKHQp
e2lmKHQpZm9yKHZhciBuIGluIHQpZVtuXT0zRHRbbl19KSxlfSx4LnBpY2s9M0RmdW5jdGlvbihl
KXt2YXIgdD0KPTNEe30sbj0zRGEuYXBwbHkocix1LmNhbGwoYXJndW1lbnRzLDEpKTtyZXR1cm4g
VChuLGZ1bmN0aW9uKG4pe24gaW4gZSYmKHRbPQpuXT0zRGVbbl0pfSksdH0seC5vbWl0PTNEZnVu
Y3Rpb24oZSl7dmFyIHQ9M0R7fSxuPTNEYS5hcHBseShyLHUuY2FsbChhcmd1bWU9Cm50cywxKSk7
Zm9yKHZhciBpIGluIGUpeC5jb250YWlucyhuLGkpfHwodFtpXT0zRGVbaV0pO3JldHVybiB0fSx4
LmRlZmF1bHRzPQo9M0RmdW5jdGlvbihlKXtyZXR1cm4gVCh1LmNhbGwoYXJndW1lbnRzLDEpLGZ1
bmN0aW9uKHQpe2lmKHQpZm9yKHZhciBuIGluIHQ9CillW25dPTNEPTNEPTNEdm9pZCAwJiYoZVtu
XT0zRHRbbl0pfSksZX0seC5jbG9uZT0zRGZ1bmN0aW9uKGUpe3JldHVybiB4LmlzTz0KYmplY3Qo
ZSk/eC5pc0FycmF5KGUpP2Uuc2xpY2UoKTp4LmV4dGVuZCh7fSxlKTplfSx4LnRhcD0zRGZ1bmN0
aW9uKGUsdCl7cmV0PQp1cm4gdChlKSxlfTt2YXIgTT0zRGZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9
M0Q9M0Q9M0R0KXJldHVybiBlIT0zRD0zRDB8fDEvZT0KPTNEPTNEMS90O2lmKGU9M0Q9M0RudWxs
fHx0PTNEPTNEbnVsbClyZXR1cm4gZT0zRD0zRD0zRHQ7ZSBpbnN0YW5jZW9mIHgmJihlPQo9M0Rl
Ll93cmFwcGVkKSx0IGluc3RhbmNlb2YgeCYmKHQ9M0R0Ll93cmFwcGVkKTt2YXIgaT0zRGYuY2Fs
bChlKTtpZihpIT0zRGY9Ci5jYWxsKHQpKXJldHVybiExO3N3aXRjaChpKXtjYXNlIltvYmplY3Qg
U3RyaW5nXSI6cmV0dXJuIGU9M0Q9M0RTdHJpbmcodCk7Yz0KYXNlIltvYmplY3QgTnVtYmVyXSI6
cmV0dXJuIGUhPTNEK2U/dCE9M0QrdDplPTNEPTNEMD8xL2U9M0Q9M0QxL3Q6ZT0zRD0zRCt0PQo7
Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybitlPTNEPTNE
K3Q7Y2FzZSJbb2JqZWN0IFI9CmVnRXhwXSI6cmV0dXJuIGUuc291cmNlPTNEPTNEdC5zb3VyY2Um
JmUuZ2xvYmFsPTNEPTNEdC5nbG9iYWwmJmUubXVsdGlsaW5lPQo9M0Q9M0R0Lm11bHRpbGluZSYm
ZS5pZ25vcmVDYXNlPTNEPTNEdC5pZ25vcmVDYXNlfWlmKHR5cGVvZiBlIT0zRCJvYmplY3QifHw9
CnR5cGVvZiB0IT0zRCJvYmplY3QiKXJldHVybiExO3ZhciBzPTNEbi5sZW5ndGg7d2hpbGUocy0t
KWlmKG5bc109M0Q9M0RlKXJldD0KdXJuIHJbc109M0Q9M0R0O24ucHVzaChlKSxyLnB1c2godCk7
dmFyIG89M0QwLHU9M0QhMDtpZihpPTNEPTNEIltvYmplY3QgQXJyPQpheV0iKXtvPTNEZS5sZW5n
dGgsdT0zRG89M0Q9M0R0Lmxlbmd0aDtpZih1KXdoaWxlKG8tLSlpZighKHU9M0RNKGVbb10sdFtv
XSw9Cm4scikpKWJyZWFrfWVsc2V7dmFyIGE9M0RlLmNvbnN0cnVjdG9yLGw9M0R0LmNvbnN0cnVj
dG9yO2lmKGEhPTNEPTNEbCYmISh4Lj0KaXNGdW5jdGlvbihhKSYmYSBpbnN0YW5jZW9mIGEmJngu
aXNGdW5jdGlvbihsKSYmbCBpbnN0YW5jZW9mIGwpKXJldHVybiExO2ZvPQpyKHZhciBjIGluIGUp
aWYoeC5oYXMoZSxjKSl7bysrO2lmKCEodT0zRHguaGFzKHQsYykmJk0oZVtjXSx0W2NdLG4scikp
KWJyZWE9Cmt9aWYodSl7Zm9yKGMgaW4gdClpZih4Lmhhcyh0LGMpJiYhKG8tLSkpYnJlYWs7dT0z
RCFvfX1yZXR1cm4gbi5wb3AoKSxyLnBvcD0KKCksdX07eC5pc0VxdWFsPTNEZnVuY3Rpb24oZSx0
KXtyZXR1cm4gTShlLHQsW10sW10pfSx4LmlzRW1wdHk9M0RmdW5jdGlvbihlPQope2lmKGU9M0Q9
M0RudWxsKXJldHVybiEwO2lmKHguaXNBcnJheShlKXx8eC5pc1N0cmluZyhlKSlyZXR1cm4gZS5s
ZW5ndGg9M0Q9Cj0zRD0zRDA7Zm9yKHZhciB0IGluIGUpaWYoeC5oYXMoZSx0KSlyZXR1cm4hMTty
ZXR1cm4hMH0seC5pc0VsZW1lbnQ9M0RmdW5jdD0KaW9uKGUpe3JldHVybiEhZSYmZS5ub2RlVHlw
ZT0zRD0zRD0zRDF9LHguaXNBcnJheT0zRHd8fGZ1bmN0aW9uKGUpe3JldHVybiBmPQouY2FsbChl
KT0zRD0zRCJbb2JqZWN0IEFycmF5XSJ9LHguaXNPYmplY3Q9M0RmdW5jdGlvbihlKXtyZXR1cm4g
ZT0zRD0zRD0zRE89CmJqZWN0KGUpfSxUKFsiQXJndW1lbnRzIiwiRnVuY3Rpb24iLCJTdHJpbmci
LCJOdW1iZXIiLCJEYXRlIiwiUmVnRXhwIl0sZnVuYz0KdGlvbihlKXt4WyJpcyIrZV09M0RmdW5j
dGlvbih0KXtyZXR1cm4gZi5jYWxsKHQpPTNEPTNEIltvYmplY3QgIitlKyJdIn19KSx4PQouaXNB
cmd1bWVudHMoYXJndW1lbnRzKXx8KHguaXNBcmd1bWVudHM9M0RmdW5jdGlvbihlKXtyZXR1cm4h
IWUmJiEheC5oYXMoZSw9CiJjYWxsZWUiKX0pLHR5cGVvZiAvLi8hPTNEImZ1bmN0aW9uIiYmKHgu
aXNGdW5jdGlvbj0zRGZ1bmN0aW9uKGUpe3JldHVybiB0eT0KcGVvZiBlPTNEPTNEImZ1bmN0aW9u
In0pLHguaXNGaW5pdGU9M0RmdW5jdGlvbihlKXtyZXR1cm4gaXNGaW5pdGUoZSkmJiFpc05hPQpO
KHBhcnNlRmxvYXQoZSkpfSx4LmlzTmFOPTNEZnVuY3Rpb24oZSl7cmV0dXJuIHguaXNOdW1iZXIo
ZSkmJmUhPTNEK2V9LHguaXM9CkJvb2xlYW49M0RmdW5jdGlvbihlKXtyZXR1cm4gZT0zRD0zRD0z
RCEwfHxlPTNEPTNEPTNEITF8fGYuY2FsbChlKT0zRD0zRCJbbz0KYmplY3QgQm9vbGVhbl0ifSx4
LmlzTnVsbD0zRGZ1bmN0aW9uKGUpe3JldHVybiBlPTNEPTNEPTNEbnVsbH0seC5pc1VuZGVmaW5l
PQpkPTNEZnVuY3Rpb24oZSl7cmV0dXJuIGU9M0Q9M0Q9M0R2b2lkIDB9LHguaGFzPTNEZnVuY3Rp
b24oZSx0KXtyZXR1cm4gbC5jYWw9CmwoZSx0KX0seC5ub0NvbmZsaWN0PTNEZnVuY3Rpb24oKXty
ZXR1cm4gZS5fPTNEdCx0aGlzfSx4LmlkZW50aXR5PTNEZnVuY3Rpbz0KbihlKXtyZXR1cm4gZX0s
eC50aW1lcz0zRGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0zREFycmF5KGUpO2Zvcih2YXIgaT0zRDA7
aTxlPQo7aSsrKXJbaV09M0R0LmNhbGwobixpKTtyZXR1cm4gcn0seC5yYW5kb209M0RmdW5jdGlv
bihlLHQpe3JldHVybiB0PTNEPTNEbnU9CmxsJiYodD0zRGUsZT0zRDApLGUrTWF0aC5mbG9vcihN
YXRoLnJhbmRvbSgpKih0LWUrMSkpfTt2YXIgXz0zRHtlc2NhcGU6eyImIj0KOiImYW1wOyIsIjwi
OiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjeDI3OyIsIi8iOiImI3gyRjsi
fX07Xy51PQpuZXNjYXBlPTNEeC5pbnZlcnQoXy5lc2NhcGUpO3ZhciBEPTNEe2VzY2FwZTpuZXcg
UmVnRXhwKCJbIit4LmtleXMoXy5lc2NhcGU9Cikuam9pbigiIikrIl0iLCJnIiksdW5lc2NhcGU6
bmV3IFJlZ0V4cCgiKCIreC5rZXlzKF8udW5lc2NhcGUpLmpvaW4oInwiKSsiKT0KIiwiZyIpfTt4
LmVhY2goWyJlc2NhcGUiLCJ1bmVzY2FwZSJdLGZ1bmN0aW9uKGUpe3hbZV09M0RmdW5jdGlvbih0
KXtyZXR1cm4gPQp0PTNEPTNEbnVsbD8iIjooIiIrdCkucmVwbGFjZShEW2VdLGZ1bmN0aW9uKHQp
e3JldHVybiBfW2VdW3RdfSl9fSkseC5yZXN1bHQ9Cj0zRGZ1bmN0aW9uKGUsdCl7aWYoZT0zRD0z
RG51bGwpcmV0dXJuIHZvaWQgMDt2YXIgbj0zRGVbdF07cmV0dXJuIHguaXNGdW5jdD0KaW9uKG4p
P24uY2FsbChlKTpufSx4Lm1peGluPTNEZnVuY3Rpb24oZSl7VCh4LmZ1bmN0aW9ucyhlKSxmdW5j
dGlvbih0KXt2YXIgPQpuPTNEeFt0XT0zRGVbdF07eC5wcm90b3R5cGVbdF09M0RmdW5jdGlvbigp
e3ZhciBlPTNEW3RoaXMuX3dyYXBwZWRdO3JldHVybiA9Cm8uYXBwbHkoZSxhcmd1bWVudHMpLEYu
Y2FsbCh0aGlzLG4uYXBwbHkoeCxlKSl9fSl9O3ZhciBQPTNEMDt4LnVuaXF1ZUlkPTNEZj0KdW5j
dGlvbihlKXt2YXIgdD0zRCsrUCsiIjtyZXR1cm4gZT9lK3Q6dH0seC50ZW1wbGF0ZVNldHRpbmdz
PTNEe2V2YWx1YXRlOi88PQolKFtcc1xTXSs/KSU+L2csaW50ZXJwb2xhdGU6LzwlPTNEKFtcc1xT
XSs/KSU+L2csZXNjYXBlOi88JS0oW1xzXFNdKz8pJT4vZ309Cjt2YXIgSD0zRC8oLileLyxCPTNE
eyInIjoiJyIsIlxcIjoiXFwiLCJcciI6InIiLCJcbiI6Im4iLCIJIjoidCIsIlx1MjAyOCI6Ij0K
dTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LGo9M0QvXFx8J3xccnxcbnxcdHxcdTIwMjh8XHUyMDI5
L2c7eC50ZW1wbGF0ZT0zRGZ1PQpuY3Rpb24oZSx0LG4pe3ZhciByO249M0R4LmRlZmF1bHRzKHt9
LG4seC50ZW1wbGF0ZVNldHRpbmdzKTt2YXIgaT0zRG5ldyBSZWc9CkV4cChbKG4uZXNjYXBlfHxI
KS5zb3VyY2UsKG4uaW50ZXJwb2xhdGV8fEgpLnNvdXJjZSwobi5ldmFsdWF0ZXx8SCkuc291cmNl
XT0KLmpvaW4oInwiKSsifCQiLCJnIikscz0zRDAsbz0zRCJfX3ArPTNEJyI7ZS5yZXBsYWNlKGks
ZnVuY3Rpb24odCxuLHIsaSx1KXtyPQpldHVybiBvKz0zRGUuc2xpY2Uocyx1KS5yZXBsYWNlKGos
ZnVuY3Rpb24oZSl7cmV0dXJuIlxcIitCW2VdfSksbiYmKG8rPTNEIic9CitcbigoX190PTNEKCIr
bisiKSk9M0Q9M0RudWxsPycnOl8uZXNjYXBlKF9fdCkpK1xuJyIpLHImJihvKz0zRCInK1xuKChf
X3Q9Cj0zRCgiK3IrIikpPTNEPTNEbnVsbD8nJzpfX3QpK1xuJyIpLGkmJihvKz0zRCInO1xuIitp
KyJcbl9fcCs9M0QnIikscz0zRHUrdD0KLmxlbmd0aCx0fSksbys9M0QiJztcbiIsbi52YXJpYWJs
ZXx8KG89M0Qid2l0aChvYmp8fHt9KXtcbiIrbysifVxuIiksbz0zRCJ2PQphciBfX3QsX19wPTNE
JycsX19qPTNEQXJyYXkucHJvdG90eXBlLmpvaW4scHJpbnQ9M0RmdW5jdGlvbigpe19fcCs9M0Rf
X2ouY2E9CmxsKGFyZ3VtZW50cywnJyk7fTtcbiIrbysicmV0dXJuIF9fcDtcbiI7dHJ5e3I9M0Ru
ZXcgRnVuY3Rpb24obi52YXJpYWJsZXx8Ij0Kb2JqIiwiXyIsbyl9Y2F0Y2godSl7dGhyb3cgdS5z
b3VyY2U9M0RvLHV9aWYodClyZXR1cm4gcih0LHgpO3ZhciBhPTNEZnVuY3RpPQpvbihlKXtyZXR1
cm4gci5jYWxsKHRoaXMsZSx4KX07cmV0dXJuIGEuc291cmNlPTNEImZ1bmN0aW9uKCIrKG4udmFy
aWFibGV8fCI9Cm9iaiIpKyIpe1xuIitvKyJ9IixhfSx4LmNoYWluPTNEZnVuY3Rpb24oZSl7cmV0
dXJuIHgoZSkuY2hhaW4oKX07dmFyIEY9M0RmdT0KbmN0aW9uKGUpe3JldHVybiB0aGlzLl9jaGFp
bj94KGUpLmNoYWluKCk6ZX07eC5taXhpbih4KSxUKFsicG9wIiwicHVzaCIsInJlPQp2ZXJzZSIs
InNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihlKXt2YXIgdD0zRHJb
ZV07eC5wcm90b3Q9CnlwZVtlXT0zRGZ1bmN0aW9uKCl7dmFyIG49M0R0aGlzLl93cmFwcGVkO3Jl
dHVybiB0LmFwcGx5KG4sYXJndW1lbnRzKSwoZT0zRD0KPTNEInNoaWZ0Inx8ZT0zRD0zRCJzcGxp
Y2UiKSYmbi5sZW5ndGg9M0Q9M0Q9M0QwJiZkZWxldGUgblswXSxGLmNhbGwodGhpcyxuPQopfX0p
LFQoWyJjb25jYXQiLCJqb2luIiwic2xpY2UiXSxmdW5jdGlvbihlKXt2YXIgdD0zRHJbZV07eC5w
cm90b3R5cGVbZV09M0Q9CmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLHQuYXBwbHkodGhp
cy5fd3JhcHBlZCxhcmd1bWVudHMpKX19KSx4LmV4dGVuZD0KKHgucHJvdG90eXBlLHtjaGFpbjpm
dW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGFpbj0zRCEwLHRoaXN9LHZhbHVlOmZ1bmN0aW9uPQoo
KXtyZXR1cm4gdGhpcy5fd3JhcHBlZH19KX0uY2FsbCh0aGlzKSxkZWZpbmUoImxpYnMvdW5kZXJz
Y29yZSIsZnVuY3Rpb24oZSk9CntyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxuO3JldHVybiB0fHxl
Ll99fSh0aGlzKSksZGVmaW5lKCJ1dGlscy91dGlscyIsWyJsaT0KYnMvdW5kZXJzY29yZSJdLGZ1
bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0LHIpe24oIkdFVCIsZSx7fSx0LHIpfWZ1bmN0aW9uIG4o
PQplLHQsbixyLGkpe2lmKGU9M0Q9M0QiR0VUInx8ZT0zRD0zRCJERUxFVEUiKXQuaW5kZXhPZigi
PyIpPTNEPTNELTE/dCs9M0QiPyI9Cjp0Kz0zRCImIix0Kz0zRCQucGFyYW0obik7dmFyIHM9M0Ru
ZXcgWE1MSHR0cFJlcXVlc3Q7cy5vcGVuKGUsdCwhMCkscy5zZXRSZT0KcXVlc3RIZWFkZXIoIkFj
Y2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSxzLnNldFJlcXVlc3RIZWFkZXIoIkNhY2hlLUNvbnRy
b2wiPQosIm5vLWNhY2hlIikscy5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwi
WE1MSHR0cFJlcXVlc3QiKSxzLnNldFI9CmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBw
bGljYXRpb24vanNvbiIpLHMub25sb2FkZW5kPTNEZnVuY3Rpb24oKXt2YT0KciBlPTNEcy5zdGF0
dXM7dHJ5e3Jlc3BvbnNlPTNEalF1ZXJ5LnBhcnNlSlNPTihzLnJlc3BvbnNlVGV4dCl9Y2F0Y2go
dCl7cmVzPQpwb25zZT0zRHMucmVzcG9uc2VUZXh0fWU9M0Q9M0QyMDA/ciYmcihyZXNwb25zZSk6
aSYmaShyZXNwb25zZSl9LGU9M0Q9M0QiR0U9ClQifHxlPTNEPTNEIkRFTEVURSI/cy5zZW5kKCk6
cy5zZW5kKEpTT04uc3RyaW5naWZ5KG4pKX1mdW5jdGlvbiByKGUsdCl7dmFyID0Kbj0zRCQoJzxk
aXYgY2xhc3M9M0QiJytlKyciPjwvZGl2PicpO24uYXBwZW5kVG8oIjplcSgwKSIpO3ZhciByPTNE
bi5jc3ModCk7PQpyZXR1cm4gbi5yZW1vdmUoKSxyfWZ1bmN0aW9uIGkoZSl7JCgnbGlua1tocmVm
Xj0zRCInK2UrJyJdJykubGVuZ3RofHwkKCc8bGk9Cm5rIGhyZWY9M0QiJytnYWxheHlfY29uZmln
LnJvb3QrZSsnIiByZWw9M0Qic3R5bGVzaGVldCI+JykuYXBwZW5kVG8oImhlYWQiKT0KfWZ1bmN0
aW9uIHModCxuKXtyZXR1cm4gdD9lLmRlZmF1bHRzKHQsbik6bn1mdW5jdGlvbiBvKGUsdCl7dmFy
IG49M0QiIjtpZihlPQo+PTNEMWUxMSllLz0zRDFlMTEsbj0zRCJUQiI7ZWxzZSBpZihlPj0zRDFl
OCllLz0zRDFlOCxuPTNEIkdCIjtlbHNlIGlmKGU+PQo9M0QxZTUpZS89M0QxZTUsbj0zRCJNQiI7
ZWxzZSBpZihlPj0zRDEwMCllLz0zRDEwMCxuPTNEIktCIjtlbHNle2lmKCEoZT4wKSk9CnJldHVy
biI8c3Ryb25nPi08L3N0cm9uZz4iO2UqPTNEMTAsbj0zRCJiIn12YXIgcj0zRE1hdGgucm91bmQo
ZSkvMTA7cmV0dXJuID0KdD9yKyIgIituOiI8c3Ryb25nPiIrcisiPC9zdHJvbmc+ICIrbn1mdW5j
dGlvbiB1KCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lPQooKS50b1N0cmluZygzNil9ZnVuY3Rp
b24gYShlKXt2YXIgdD0zRCQoIjxwPjwvcD4iKTtyZXR1cm4gdC5hcHBlbmQoZSksdH1mdW49CmN0
aW9uIGYoKXt2YXIgZT0zRG5ldyBEYXRlLHQ9M0QoZS5nZXRIb3VycygpPDEwPyIwIjoiIikrZS5n
ZXRIb3VycygpLG49M0QoZT0KLmdldE1pbnV0ZXMoKTwxMD8iMCI6IiIpK2UuZ2V0TWludXRlcygp
LHI9M0RlLmdldERhdGUoKSsiLyIrKGUuZ2V0TW9udGgoKSsxPQopKyIvIitlLmdldEZ1bGxZZWFy
KCkrIiwgIit0KyI6IituO3JldHVybiByfXJldHVybntjc3NMb2FkRmlsZTppLGNzc0dldEF0dHI9
CmlidXRlOnIsZ2V0OnQsbWVyZ2U6cyxieXRlc1RvU3RyaW5nOm8sdXVpZDp1LHRpbWU6Zix3cmFw
OmEscmVxdWVzdDpufX0pLGRlZj0KaW5lKCJtdmMvdWkvdWktcG9ydGxldCIsWyJ1dGlscy91dGls
cyJdLGZ1bmN0aW9uKGUpe3ZhciB0PTNEQmFja2JvbmUuVmlldy5lPQp4dGVuZCh7dmlzaWJsZToh
MSxvcHRpb25zRGVmYXVsdDp7dGl0bGU6IiIsaWNvbjoiIixidXR0b25zOm51bGwsYm9keTpudWxs
LHM9CmNyb2xsYWJsZTohMCxub3BhZGRpbmc6ITEsb3BlcmF0aW9uczpudWxsLHBsYWNlbWVudDoi
Ym90dG9tIn0sJHRpdGxlOm51bGwsJD0KY29udGVudDpudWxsLCRidXR0b25zOm51bGwsJG9wZXJh
dGlvbnM6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0PQppb25zPTNEZS5tZXJn
ZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0
aGlzLm89CnB0aW9ucykpLHRoaXMuJGNvbnRlbnQ9M0R0aGlzLiRlbC5maW5kKCIjY29udGVudCIp
LHRoaXMuJHRpdGxlPTNEdGhpcy4kZWwuZj0KaW5kKCIjcG9ydGxldC1oZWFkZXItdGV4dCIpLHRo
aXMub3B0aW9ucy5zY3JvbGxhYmxlfHwodGhpcy5vcHRpb25zLnRpdGxlP3RoPQppcy4kZWwuZmlu
ZCgiI3BvcnRsZXQtY29udGVudCIpLmFkZENsYXNzKCJuby1zY3JvbGwiKTp0aGlzLiRlbC5maW5k
KCIjcG9ydGw9CmV0LWNvbnRlbnQiKS5jc3MoImhlaWdodCIsIjEwMCUiKSksdGhpcy5vcHRpb25z
Lm5vcGFkZGluZyYmKHRoaXMuJGVsLmZpbmQoIj0KI3BvcnRsZXQtY29udGVudCIpLmNzcygicGFk
ZGluZyIsIjBweCIpLHRoaXMuJGVsLmZpbmQoIiNjb250ZW50IikuY3NzKCJwYWRkPQppbmciLCIw
cHgiKSksdGhpcy4kYnV0dG9ucz0zRCQodGhpcy5lbCkuZmluZCgiI2J1dHRvbnMiKTtpZih0aGlz
Lm9wdGlvbnMuYnU9CnR0b25zKXt2YXIgbj0zRHRoaXM7JC5lYWNoKHRoaXMub3B0aW9ucy5idXR0
b25zLGZ1bmN0aW9uKGUsdCl7dC4kZWwucHJvcCgiaT0KZCIsZSksbi4kYnV0dG9ucy5hcHBlbmQo
dC4kZWwpfSl9ZWxzZSB0aGlzLiRidXR0b25zLnJlbW92ZSgpO3RoaXMuJG9wZXJhdGlvPQpucz0z
RCQodGhpcy5lbCkuZmluZCgiI29wZXJhdGlvbnMiKTtpZih0aGlzLm9wdGlvbnMub3BlcmF0aW9u
cyl7dmFyIG49M0R0aGk9CnM7JC5lYWNoKHRoaXMub3B0aW9ucy5vcGVyYXRpb25zLGZ1bmN0aW9u
KGUsdCl7dC4kZWwucHJvcCgiaWQiLGUpLG4uJG9wZXJhdD0KaW9ucy5hcHBlbmQodC4kZWwpfSl9
dGhpcy5vcHRpb25zLmJvZHkmJnRoaXMuYXBwZW5kKHRoaXMub3B0aW9ucy5ib2R5KX0sYXBwPQpl
bmQ6ZnVuY3Rpb24odCl7dGhpcy4kY29udGVudC5hcHBlbmQoZS53cmFwKHQpKX0sY29udGVudDpm
dW5jdGlvbigpe3JldHVybiA9CnRoaXMuJGNvbnRlbnR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLiRl
bC5mYWRlSW4oImZhc3QiKSx0aGlzLnZpc2libGU9M0QhMH0saD0KaWRlOmZ1bmN0aW9uKCl7dGhp
cy4kZWwuZmFkZU91dCgiZmFzdCIpLHRoaXMudmlzaWJsZT0zRCExfSxlbmFibGVCdXR0b246ZnVu
PQpjdGlvbihlKXt0aGlzLiRidXR0b25zLmZpbmQoIiMiK2UpLnByb3AoImRpc2FibGVkIiwhMSl9
LGRpc2FibGVCdXR0b246ZnVuY3Q9CmlvbihlKXt0aGlzLiRidXR0b25zLmZpbmQoIiMiK2UpLnBy
b3AoImRpc2FibGVkIiwhMCl9LGhpZGVPcGVyYXRpb246ZnVuY3Rpbz0KbihlKXt0aGlzLiRvcGVy
YXRpb25zLmZpbmQoIiMiK2UpLmhpZGUoKX0sc2hvd09wZXJhdGlvbjpmdW5jdGlvbihlKXt0aGlz
LiRvPQpwZXJhdGlvbnMuZmluZCgiIyIrZSkuc2hvdygpfSxzZXRPcGVyYXRpb246ZnVuY3Rpb24o
ZSx0KXt2YXIgbj0zRHRoaXMuJG9wZXI9CmF0aW9ucy5maW5kKCIjIitlKTtuLm9mZigiY2xpY2si
KSxuLm9uKCJjbGljayIsdCl9LHRpdGxlOmZ1bmN0aW9uKGUpe3ZhciB0PQo9M0R0aGlzLiR0aXRs
ZTtyZXR1cm4gZSYmdC5odG1sKGUpLHQuaHRtbCgpfSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7dmFy
IHQ9M0Q9Cic8ZGl2IGNsYXNzPTNEInVpLXBvcnRsZXQiPic7cmV0dXJuIGUudGl0bGUmJih0Kz0z
RCc8ZGl2IGlkPTNEInBvcnRsZXQtaGVhZD0KZXIiIGNsYXNzPTNEInBvcnRsZXQtaGVhZGVyIj48
ZGl2IGlkPTNEIm9wZXJhdGlvbnMiIHN0eWxlPTNEImZsb2F0OiByaWdodDsiPQo+PC9kaXY+PGgz
PicsZS5pY29uJiYodCs9M0QnPGkgY2xhc3M9M0QiaWNvbiBmYSAnK2UuaWNvbisnIj4mbmJzcDs8
L2k+JyksdCs9Cj0zRCc8c3BhbiBpZD0zRCJwb3J0bGV0LWhlYWRlci10ZXh0Ij4nK2UudGl0bGUr
Ijwvc3Bhbj4iKyI8L2gzPiIrIjwvZGl2PiIpLD0KdCs9M0QnPGRpdiBpZD0zRCJwb3J0bGV0LWNv
bnRlbnQiIGNsYXNzPTNEInBvcnRsZXQtY29udGVudCI+JyxlLnBsYWNlbWVudD0KPTNEPTNEInRv
cCImJih0Kz0zRCc8ZGl2IGlkPTNEImJ1dHRvbnMiIGNsYXNzPTNEImJ1dHRvbnMiPjwvZGl2Picp
LHQrPTNEJzxkPQppdiBpZD0zRCJjb250ZW50IiBjbGFzcz0zRCJjb250ZW50Ij48L2Rpdj4nLGUu
cGxhY2VtZW50PTNEPTNEImJvdHRvbSImJih0Kz0KPTNEJzxkaXYgaWQ9M0QiYnV0dG9ucyIgY2xh
c3M9M0QiYnV0dG9ucyI+PC9kaXY+JyksdCs9M0QiPC9kaXY+PC9kaXY+Iix0fX0pPQo7cmV0dXJu
e1ZpZXc6dH19KSxkZWZpbmUoInBsdWdpbi9saWJyYXJ5L3VpLXNlbGVjdCIsWyJ1dGlscy91dGls
cyJdLGZ1bmN0aW89Cm4oZSl7dmFyIHQ9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0Rl
ZmF1bHQ6e2lkOiIiLGNsczoiIixlbXB0eToiTm8gZD0KYXRhIGF2YWlsYWJsZSIsdmlzaWJsZToh
MCx3YWl0OiExfSxzZWxlY3RlZDpudWxsLGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpPQpzLm9w
dGlvbnM9M0RlLm1lcmdlKHQsdGhpcy5vcHRpb25zRGVmYXVsdCksdGhpcy5zZWxlY3RlZD0zRHRo
aXMub3B0aW9ucy52YWw9CnVlLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9w
dGlvbnMpKSx0aGlzLiRzZWxlY3Q9M0R0aGlzLiRlbC5maT0KbmQoIiNzZWxlY3QiKSx0aGlzLiRp
Y29uPTNEdGhpcy4kZWwuZmluZCgiI2ljb24iKTt2YXIgbj0zRHRoaXM7dGhpcy4kc2VsZWN0PQou
b24oImNoYW5nZSIsZnVuY3Rpb24oKXtuLnZhbHVlKG4uJHNlbGVjdC52YWwoKSl9KSx0aGlzLm9u
KCJjaGFuZ2UiLGZ1bmN0aW89Cm4oKXtuLm9wdGlvbnMub25jaGFuZ2UmJm4ub3B0aW9ucy5vbmNo
YW5nZShuLnZhbHVlKCkpfSksdGhpcy5fcmVmcmVzaCgpLHRoaT0Kcy5vcHRpb25zLnZpc2libGV8
fHRoaXMuaGlkZSgpLHRoaXMub3B0aW9ucy53YWl0P3RoaXMud2FpdCgpOnRoaXMuc2hvdygpfSx2
PQphbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PTNEdGhpcy5zZWxlY3RlZDtlIT0zRD0zRHVuZGVmaW5l
ZCYmKHRoaXMuc2VsZWN0ZWQ9M0Q9CmUsdGhpcy4kc2VsZWN0LnZhbChlKSk7dmFyIG49M0R0aGlz
LnNlbGVjdGVkO3JldHVybiBuJiZuIT0zRHQmJnRoaXMub3B0aW9ucz0KLm9uY2hhbmdlJiZ0aGlz
Lm9wdGlvbnMub25jaGFuZ2Uobiksbn0sZmlyc3Q6ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXMuJHNl
bGVjPQp0LmZpbmQoIm9wdGlvbiIpO3JldHVybiBlLmxlbmd0aD4wP2UudmFsKCk6dW5kZWZpbmVk
fSx0ZXh0OmZ1bmN0aW9uKCl7cmV0dXI9Cm4gdGhpcy4kc2VsZWN0LmZpbmQoIm9wdGlvbjpzZWxl
Y3RlZCIpLnRleHQoKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuJGljb24ucj0KZW1vdmVDbGFzcygp
LHRoaXMuJGljb24uYWRkQ2xhc3MoImZhIGZhLWNhcmV0LWRvd24iKSx0aGlzLiRzZWxlY3Quc2hv
dygpLHRoPQppcy4kZWwuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy4kZWwuaGlkZSgpfSx3
YWl0OmZ1bmN0aW9uKCl7dGhpcy4kaWNvbi49CnJlbW92ZUNsYXNzKCksdGhpcy4kaWNvbi5hZGRD
bGFzcygiZmEgZmEtc3Bpbm5lciBmYS1zcGluIiksdGhpcy4kc2VsZWN0LmhpZD0KZSgpfSxkaXNh
YmxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWxlY3QuaXMoIjpkaXNhYmxlZCIpfSxlbmFi
bGU6ZnVuY3RpPQpvbigpe3RoaXMuJHNlbGVjdC5wcm9wKCJkaXNhYmxlZCIsITEpfSxkaXNhYmxl
OmZ1bmN0aW9uKCl7dGhpcy4kc2VsZWN0LnByb3A9CigiZGlzYWJsZWQiLCEwKX0sYWRkOmZ1bmN0
aW9uKGUpe3RoaXMuJHNlbGVjdC5hcHBlbmQodGhpcy5fdGVtcGxhdGVPcHRpb24oZT0KKSksdGhp
cy5fcmVmcmVzaCgpfSxkZWw6ZnVuY3Rpb24oZSl7dGhpcy4kc2VsZWN0LmZpbmQoIm9wdGlvblt2
YWx1ZT0zRCIrZSsiPQpdIikucmVtb3ZlKCksdGhpcy4kc2VsZWN0LnRyaWdnZXIoImNoYW5nZSIp
LHRoaXMuX3JlZnJlc2goKX0sdXBkYXRlOmZ1bmN0aW89Cm4oZSl7dGhpcy4kc2VsZWN0LmZpbmQo
Im9wdGlvbiIpLnJlbW92ZSgpO2Zvcih2YXIgdCBpbiBlKXRoaXMuJHNlbGVjdC5hcHBlbj0KZCh0
aGlzLl90ZW1wbGF0ZU9wdGlvbihlW3RdKSk7dGhpcy5fcmVmcmVzaCgpfSxzZXRPbkNoYW5nZTpm
dW5jdGlvbihlKXt0aGlzPQoub3B0aW9ucy5vbmNoYW5nZT0zRGV9LGV4aXN0czpmdW5jdGlvbihl
KXtyZXR1cm4gdGhpcy4kc2VsZWN0LmZpbmQoIm9wdGlvbls9CnZhbHVlPTNEIitlKyJdIikubGVu
Z3RoPjB9LF9yZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy4kc2VsZWN0LmZpbmQoIm9wdGlvblt2YT0K
bHVlPTNEbnVsbF0iKS5yZW1vdmUoKTt2YXIgZT0zRHRoaXMuJHNlbGVjdC5maW5kKCJvcHRpb24i
KS5sZW5ndGg7ZT0zRD0zRDA/PQoodGhpcy5kaXNhYmxlKCksdGhpcy4kc2VsZWN0LmFwcGVuZCh0
aGlzLl90ZW1wbGF0ZU9wdGlvbih7dmFsdWU6Im51bGwiLGxhYmU9Cmw6dGhpcy5vcHRpb25zLmVt
cHR5fSkpKTp0aGlzLmVuYWJsZSgpLHRoaXMuc2VsZWN0ZWQmJnRoaXMuJHNlbGVjdC52YWwodGhp
cz0KLnNlbGVjdGVkKX0sX3RlbXBsYXRlT3B0aW9uOmZ1bmN0aW9uKGUpe3JldHVybic8b3B0aW9u
IHZhbHVlPTNEIicrZS52YWx1ZSsnPQoiPicrZS5sYWJlbCsiPC9vcHRpb24+In0sX3RlbXBsYXRl
OmZ1bmN0aW9uKGUpe3ZhciB0PTNEJzxkaXYgaWQ9M0QiJytlLmlkKyc9CiIgY2xhc3M9M0QidWkt
c2VsZWN0Ij4nKyc8ZGl2IGNsYXNzPTNEImJ1dHRvbiI+JysnPGkgaWQ9M0QiaWNvbiIvPicrIjwv
ZGl2Pj0KIisnPHNlbGVjdCBpZD0zRCJzZWxlY3QiIGNsYXNzPTNEInNlbGVjdCAnK2UuY2xzKyIg
IitlLmlkKyciPic7Zm9yKGtleSBpbiBlPQouZGF0YSl7dmFyIG49M0RlLmRhdGFba2V5XSxyPTNE
IiI7aWYobi52YWx1ZT0zRD0zRGUudmFsdWV8fG4udmFsdWU9M0Q9M0QiIik9CnI9M0Qic2VsZWN0
ZWQiO3QrPTNEJzxvcHRpb24gdmFsdWU9M0QiJytuLnZhbHVlKyciICcrcisiPiIrbi5sYWJlbCsi
PC9vcHRpbz0Kbj4ifXJldHVybiB0Kz0zRCI8L3NlbGVjdD48L2Rpdj4iLHR9fSk7cmV0dXJue1Zp
ZXc6dH19KSxkZWZpbmUoInBsdWdpbi9saWJyPQphcnkvdWkiLFsidXRpbHMvdXRpbHMiLCJwbHVn
aW4vbGlicmFyeS91aS1zZWxlY3QiLCJtdmMvdWkvdWktbW9kYWwiXSxmdW5jdGk9Cm9uKGUsdCxu
KXt2YXIgcj0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dXJsOiIiLGNs
czoiIn0saW5pdD0KaWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRGUubWVyZ2UodCx0
aGlzLm9wdGlvbnNEZWZhdWx0KSx0aGlzLnNldEVsPQplbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlz
Lm9wdGlvbnMpKX0sX3RlbXBsYXRlOmZ1bmN0aW9uKGUpe3JldHVybic8aW1nIGNsYXM9CnM9M0Qi
dWktaW1hZ2UgJytlLmNscysnIiBzcmM9M0QiJytlLnVybCsnIi8+J319KSxpPTNEQmFja2JvbmUu
Vmlldy5leHRlbmQoez0Kb3B0aW9uc0RlZmF1bHQ6e3RpdGxlOiIiLGNsczoiIn0saW5pdGlhbGl6
ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9M0RlLm1lPQpyZ2UodCx0aGlzLm9wdGlvbnNEZWZh
dWx0KSx0aGlzLnNldEVsZW1lbnQodGhpcy5fdGVtcGxhdGUodGhpcy5vcHRpb25zKSl9LHQ9Cml0
bGU6ZnVuY3Rpb24oZSl7dGhpcy4kZWwuaHRtbChlKX0sX3RlbXBsYXRlOmZ1bmN0aW9uKGUpe3Jl
dHVybic8bGFiZWwgY2xhcz0Kcz0zRCJ1aS1sYWJlbCAnK2UuY2xzKyciPicrZS50aXRsZSsiPC9s
YWJlbD4ifSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBvcHRpPQpvbnMudGl0bGV9fSkscz0zREJh
Y2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7aWQ6bnVsbCx0aXRsZToiIiwiZmw9
Cm9hdCI6InJpZ2h0IixjbHM6ImJ0biBidG4tZGVmYXVsdCIsaWNvbjoiIn0saW5pdGlhbGl6ZTpm
dW5jdGlvbih0KXt0aGlzLm9wdD0KaW9ucz0zRGUubWVyZ2UodCx0aGlzLm9wdGlvbnNEZWZhdWx0
KSx0aGlzLnNldEVsZW1lbnQodGhpcy5fdGVtcGxhdGUodGhpcy5vPQpwdGlvbnMpKSwkKHRoaXMu
ZWwpLm9uKCJjbGljayIsdC5vbmNsaWNrKSwkKHRoaXMuZWwpLnRvb2x0aXAoe3RpdGxlOnQudG9v
bHQ9CmlwLHBsYWNlbWVudDoiYm90dG9tIn0pfSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9
M0QnPGJ1dHRvbiBpZD0zRCInK2UuaT0KZCsnIiB0eXBlPTNEInN1Ym1pdCIgc3R5bGU9M0QiZmxv
YXQ6ICcrZS5mbG9hdCsnOyIgdHlwZT0zRCJidXR0b24iIGNsYXNzPTNEPQoidWktYnV0dG9uICcr
ZS5jbHMrJyI+JztyZXR1cm4gZS5pY29uJiYodCs9M0QnPGkgY2xhc3M9M0QiaWNvbiBmYSAnK2Uu
aWNvbis9CiciPjwvaT4mbmJzcDsnKSx0Kz0zRGUudGl0bGUrIjwvYnV0dG9uPiIsdH19KSxvPTNE
QmFja2JvbmUuVmlldy5leHRlbmQoe29wdD0KaW9uc0RlZmF1bHQ6eyJmbG9hdCI6InJpZ2h0Iixp
Y29uOiIiLHRvb2x0aXA6IiIscGxhY2VtZW50OiJib3R0b20iLHRpdGxlOiIiPQosY2xzOiIifSxp
bml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRGUubWVyZ2UodCx0aGlzLm9wdGlv
bnNEZWZhdWw9CnQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9wdGlvbnMp
KSwkKHRoaXMuZWwpLnRvb2x0aXAoe3RpdGxlOj0KdC50b29sdGlwLHBsYWNlbWVudDoiYm90dG9t
In0pfSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuJzxkaXY+PHNwYW4gY2xhPQpzcz0zRCJm
YSAnK2UuaWNvbisnIiBjbGFzcz0zRCJ1aS1pY29uIi8+Jm5ic3A7JytlLnRpdGxlKyI8L2Rpdj4i
fX0pLHU9M0RCYWM9Cmtib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dGl0bGU6IiIs
aWQ6bnVsbCwiZmxvYXQiOiJyaWdodCIsY2xzOiJpYz0Kb24tYnRuIixpY29uOiIiLHRvb2x0aXA6
IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPTNEZS5tZXJnZSh0PQosdGhp
cy5vcHRpb25zRGVmYXVsdCksdGhpcy5zZXRFbGVtZW50KHRoaXMuX3RlbXBsYXRlKHRoaXMub3B0
aW9ucykpLCQodGhpcy49CmVsKS5vbigiY2xpY2siLHQub25jbGljayksJCh0aGlzLmVsKS50b29s
dGlwKHt0aXRsZTp0LnRvb2x0aXAscGxhY2VtZW50OiJibz0KdHRvbSJ9KX0sX3RlbXBsYXRlOmZ1
bmN0aW9uKGUpe3ZhciB0PTNEIiI7ZS50aXRsZSYmKHQ9M0Qid2lkdGg6IGF1dG87Iik7dmFyPQog
bj0zRCc8ZGl2IGlkPTNEIicrZS5pZCsnIiBzdHlsZT0zRCJmbG9hdDogJytlLmZsb2F0KyI7ICIr
dCsnIiBjbGFzcz0zRCJ1aS09CmJ1dHRvbi1pY29uICcrZS5jbHMrJyI+JztyZXR1cm4gZS50aXRs
ZT9uKz0zRCc8ZGl2IGNsYXNzPTNEImJ1dHRvbiI+PGkgY2xhcz0Kcz0zRCJpY29uIGZhICcrZS5p
Y29uKyciLz4mbmJzcDsnKyc8c3BhbiBjbGFzcz0zRCJ0aXRsZSI+JytlLnRpdGxlKyI8L3NwYW4+
PQoiKyI8L2Rpdj4iOm4rPTNEJzxpIGNsYXNzPTNEImljb24gZmEgJytlLmljb24rJyIvPicsbis9
M0QiPC9kaXY+IixufX0pLGE9M0Q9CkJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVs
dDp7dGl0bGU6IiIsY2xzOiIifSxpbml0aWFsaXplOmZ1bmN0aW9uKD0KdCl7dGhpcy5vcHRpb25z
PTNEZS5tZXJnZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90
ZW1wPQpsYXRlKHRoaXMub3B0aW9ucykpLCQodGhpcy5lbCkub24oImNsaWNrIix0Lm9uY2xpY2sp
fSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSk9CntyZXR1cm4nPGRpdj48YSBocmVmPTNEImphdmFzY3Jp
cHQ6dm9pZCgwKSIgY2xhc3M9M0QidWktYW5jaG9yICcrZS5jbHMrJyI+Jz0KK2UudGl0bGUrIjwv
YT48L2Rpdj4ifX0pLGY9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlZmF1bHQ6e21l
c3NhZ2U6PQoiIixzdGF0dXM6ImluZm8iLHBlcnNpc3RlbnQ6ITF9LGluaXRpYWxpemU6ZnVuY3Rp
b24odCl7dGhpcy5vcHRpb25zPTNEZS5tZXI9CmdlKHQsdGhpcy5vcHRpb25zRGVmYXVsdCksdGhp
cy5zZXRFbGVtZW50KCI8ZGl2PjwvZGl2PiIpfSx1cGRhdGU6ZnVuY3Rpb24odD0KKXt0aGlzLm9w
dGlvbnM9M0RlLm1lcmdlKHQsdGhpcy5vcHRpb25zRGVmYXVsdCk7aWYodC5tZXNzYWdlIT0zRCIi
KXt0aGlzLiRlPQpsLmh0bWwodGhpcy5fdGVtcGxhdGUodGhpcy5vcHRpb25zKSksdGhpcy4kZWwu
ZmluZCgiLmFsZXJ0IikuYXBwZW5kKHQubWVzc2E9CmdlKSx0aGlzLiRlbC5mYWRlSW4oKTtpZigh
dC5wZXJzaXN0ZW50KXt2YXIgbj0zRHRoaXM7d2luZG93LnNldFRpbWVvdXQoZnVuYz0KdGlvbigp
e24uJGVsLmlzKCI6dmlzaWJsZSIpP24uJGVsLmZhZGVPdXQoKTpuLiRlbC5oaWRlKCl9LDNlMyl9
fWVsc2UgdGhpcy4kPQplbC5mYWRlT3V0KCl9LF90ZW1wbGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4n
PGRpdiBjbGFzcz0zRCJ1aS1tZXNzYWdlIGFsZXJ0IGE9CmxlcnQtJytlLnN0YXR1cysnIi8+J319
KSxsPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe29wdGlvbnNEZWZhdWx0OntvbmNsaWNrOj0KbnVs
bCxzZWFyY2h3b3JkOiIifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRGUu
bWVyZ2UodCx0aGlzLm9wPQp0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1w
bGF0ZSh0aGlzLm9wdGlvbnMpKTt2YXIgbj0zRHRoaXM7dGg9CmlzLm9wdGlvbnMub25jbGljayYm
dGhpcy4kZWwub24oInN1Ym1pdCIsZnVuY3Rpb24oZSl7dmFyIHQ9M0RuLiRlbC5maW5kKCIjcz0K
ZWFyY2giKTtuLm9wdGlvbnMub25jbGljayh0LnZhbCgpKX0pfSxfdGVtcGxhdGU6ZnVuY3Rpb24o
ZSl7cmV0dXJuJzxkaXYgY2xhPQpzcz0zRCJ1aS1zZWFyY2giPjxmb3JtIG9uc3VibWl0PTNEInJl
dHVybiBmYWxzZTsiPjxpbnB1dCBpZD0zRCJzZWFyY2giIGNsYXM9CnM9M0QiZm9ybS1jb250cm9s
IGlucHV0LXNtIiB0eXBlPTNEInRleHQiIG5hbWU9M0Qic2VhcmNoIiBwbGFjZWhvbGRlcj0zRCJT
ZT0KYXJjaC4uLiIgdmFsdWU9M0QiJytlLnNlYXJjaHdvcmQrJyI+JysnPGJ1dHRvbiB0eXBlPTNE
InN1Ym1pdCIgY2xhc3M9M0QiYnRuPQogc2VhcmNoLWJ0biI+JysnPGkgY2xhc3M9M0QiZmEgZmEt
c2VhcmNoIj48L2k+JysiPC9idXR0b24+IisiPC9mb3JtPiIrIjwvZGk9CnY+In19KSxjPTNEQmFj
a2JvbmUuVmlldy5leHRlbmQoe29wdGlvbnNEZWZhdWx0OntpZDoiIix0aXRsZToiIix0YXJnZXQ6
IiIsaD0KcmVmOiIiLG9udW5sb2FkOm51bGwsb25jbGljazpudWxsLHZpc2libGU6ITAsaWNvbjpu
dWxsLHRhZzoiIn0sJG1lbnU6bnVsbCxpPQpuaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5vcHRp
b25zPTNEZS5tZXJnZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2U9CnRFbGVtZW50KCQo
dGhpcy5fdGVtcGxhdGUodGhpcy5vcHRpb25zKSkpO3ZhciBuPTNEJCh0aGlzLmVsKS5maW5kKCIu
cm9vdCIpLD0Kcj0zRHRoaXM7bi5vbigiY2xpY2siLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1
bHQoKSxyLm9wdGlvbnMub25jbGljayYmci5vPQpwdGlvbnMub25jbGljaygpfSksdGhpcy5vcHRp
b25zLnZpc2libGV8fHRoaXMuaGlkZSgpfSxzaG93OmZ1bmN0aW9uKCl7JCh0aGk9CnMuZWwpLnNo
b3coKX0saGlkZTpmdW5jdGlvbigpeyQodGhpcy5lbCkuaGlkZSgpfSxhZGRNZW51OmZ1bmN0aW9u
KHQpe3ZhciBuPQo9M0R7dGl0bGU6IiIsdGFyZ2V0OiIiLGhyZWY6IiIsb25jbGljazpudWxsLGRp
dmlkZXI6ITEsaWNvbjpudWxsLGNsczoiYnV0dG89Cm4tbWVudSBidG4tZ3JvdXAifTtuPTNEZS5t
ZXJnZSh0LG4pLHRoaXMuJG1lbnV8fCgkKHRoaXMuZWwpLmFwcGVuZCh0aGlzLl90ZT0KbXBsYXRl
TWVudSgpKSx0aGlzLiRtZW51PTNEJCh0aGlzLmVsKS5maW5kKCIubWVudSIpKTt2YXIgcj0zRCQo
dGhpcy5fdGVtcGxhPQp0ZU1lbnVJdGVtKG4pKTtyLm9uKCJjbGljayIsZnVuY3Rpb24oZSl7ZS5w
cmV2ZW50RGVmYXVsdCgpLG4ub25jbGljayYmbi5vbmM9CmxpY2soKX0pLHRoaXMuJG1lbnUuYXBw
ZW5kKHIpLG4uZGl2aWRlciYmdGhpcy4kbWVudS5hcHBlbmQoJCh0aGlzLl90ZW1wbGF0ZT0KRGl2
aWRlcigpKSl9LF90ZW1wbGF0ZU1lbnVJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PTNEJzxsaT48YSBo
cmVmPTNEIicrZS5ocmVmPQorJyIgdGFyZ2V0PTNEIicrZS50YXJnZXQrJyI+JztyZXR1cm4gZS5p
Y29uJiYodCs9M0QnPGkgY2xhc3M9M0QiZmEgJytlLmljb249CisnIj48L2k+JyksdCs9M0QiICIr
ZS50aXRsZSsiPC9hPiIrIjwvbGk+Iix0fSxfdGVtcGxhdGVNZW51OmZ1bmN0aW9uKCl7cmV0dT0K
cm4nPHVsIGNsYXNzPTNEIm1lbnUgZHJvcGRvd24tbWVudSBwdWxsLXJpZ2h0IiByb2xlPTNEIm1l
bnUiPjwvdWw+J30sX3RlbXBsPQphdGVEaXZpZGVyOmZ1bmN0aW9uKCl7cmV0dXJuJzxsaSBjbGFz
cz0zRCJkaXZpZGVyIj48L2xpPid9LF90ZW1wbGF0ZTpmdW5jdGk9Cm9uKGUpe3ZhciB0PTNEJzxk
aXYgaWQ9M0QiJytlLmlkKyciIGNsYXNzPTNEInVpLWJ1dHRvbi1tZW51ICcrZS5jbHMrJyI+Jysn
PD0KYnV0dG9uIHR5cGU9M0QiYnV0dG9uIiBjbGFzcz0zRCJyb290IGJ0biBidG4tZGVmYXVsdCBk
cm9wZG93bi10b2dnbGUiIGRhdGEtPQp0b2dnbGU9M0QiZHJvcGRvd24iPic7cmV0dXJuIGUuaWNv
biYmKHQrPTNEJzxpIGNsYXNzPTNEImZhICcrZS5pY29uKyciPjwvaT49CicpLCI8L2J1dHRvbj48
L2Rpdj4iLHR9fSksaD0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dmFs
dWU6Ij0KIix0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjoiIixkaXNhYmxlZDohMSx2aXNpYmxlOiEw
LGNsczoiZm9ybS1jb250cm9sIn0saW5pPQp0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9u
cz0zRGUubWVyZ2UodCx0aGlzLm9wdGlvbnNEZWZhdWx0KSx0aGlzLnNldEU9CmxlbWVudCh0aGlz
Ll90ZW1wbGF0ZSh0aGlzLm9wdGlvbnMpKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuJGVs
LnByb3AoIj0KZGlzYWJsZWQiLCEwKSx0aGlzLm9wdGlvbnMudmlzaWJsZXx8dGhpcy4kZWwuaGlk
ZSgpO3ZhciBuPTNEdGhpczt0aGlzLiRlbC5vPQpuKCJpbnB1dCIsZnVuY3Rpb24oKXtuLm9wdGlv
bnMub25jaGFuZ2UmJm4ub3B0aW9ucy5vbmNoYW5nZShuLiRlbC52YWwoKSl9KX09Cix2YWx1ZTpm
dW5jdGlvbihlKXtyZXR1cm4gZSE9M0Q9M0R1bmRlZmluZWQmJnRoaXMuJGVsLnZhbChlKSx0aGlz
LiRlbC52YWwoKT0KfSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuJzxpbnB1dCBpZD0zRCIn
K2UuaWQrJyIgdHlwZT0zRCInK2UudHlwZSsnIiB2PQphbHVlPTNEIicrZS52YWx1ZSsnIiBwbGFj
ZWhvbGRlcj0zRCInK2UucGxhY2Vob2xkZXIrJyIgY2xhc3M9M0QidWktaW5wdXQgJys9CmUuY2xz
KyciPid9fSkscD0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dmFsdWU6
IiIsdHlwZToidGV4dD0KIixwbGFjZWhvbGRlcjoiIixkaXNhYmxlZDohMSx2aXNpYmxlOiEwLGNs
czoiIn0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzPQoub3B0aW9ucz0zRGUubWVyZ2UodCx0
aGlzLm9wdGlvbnNEZWZhdWx0KSx0aGlzLnNldEVsZW1lbnQodGhpcy5fdGVtcGxhdGUodGg9Cmlz
Lm9wdGlvbnMpKSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuJGVsLnByb3AoImRpc2FibGVk
IiwhMCksdGhpcy5vcHRpbz0KbnMudmlzaWJsZXx8dGhpcy4kZWwuaGlkZSgpO3ZhciBuPTNEdGhp
czt0aGlzLiRlbC5vbigiaW5wdXQiLGZ1bmN0aW9uKCl7bi5vPQpwdGlvbnMub25jaGFuZ2UmJm4u
b3B0aW9ucy5vbmNoYW5nZShuLiRlbC52YWwoKSl9KX0sdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXI9
Cm4gZSE9M0Q9M0R1bmRlZmluZWQmJnRoaXMuJGVsLnZhbChlKSx0aGlzLiRlbC52YWwoKX0sX3Rl
bXBsYXRlOmZ1bmN0aW9uKGUpez0KcmV0dXJuJzx0ZXh0YXJlYSBpZD0zRCInK2UuaWQrJyIgY2xh
c3M9M0QidWktdGV4dGFyZWEgJytlLmNscysnIiByb3dzPTNEIjUiPQo+PC90ZXh0YXJlYT4nfX0p
O3JldHVybntMYWJlbDppLEJ1dHRvbjpzLEljb246byxCdXR0b25JY29uOnUsSW5wdXQ6aCxBbmNo
b3I9CjphLE1lc3NhZ2U6ZixTZWFyY2hib3g6bCxTZWxlY3Q6dCxCdXR0b25NZW51OmMsTW9kYWw6
bixUZXh0YXJlYTpwLEltYWdlOnJ9fT0KKSxkZWZpbmUoInBsdWdpbi9saWJyYXJ5L2pvYnMiLFsi
dXRpbHMvdXRpbHMiXSxmdW5jdGlvbihlKXtyZXR1cm4gQmFja2JvbmUuPQpNb2RlbC5leHRlbmQo
e2luaXRpYWxpemU6ZnVuY3Rpb24odCxuKXt0aGlzLmFwcD0zRHQsdGhpcy5vcHRpb25zPTNEZS5t
ZXJnZSg9Cm4sdGhpcy5vcHRpb25zRGVmYXVsdCl9LHJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4scixp
KXt2YXIgcz0zRHRoaXM7ZS5zdGF0ZSgidz0KYWl0IiwiUmVxdWVzdGluZyBqb2IgcmVzdWx0cy4u
LiIpO3ZhciBvPTNEZS5nZXQoImRhdGFzZXRfaWRfam9iIik7byE9M0QiIj9zPQouX3dhaXQoZSxy
LGkpOnMuX3N1Ym1pdChlLHQsbixyLGkpfSxjbGVhbnVwOmZ1bmN0aW9uKHQpe3ZhciBuPTNEdGhp
cyxyPTNEdC49CmdldCgiZGF0YXNldF9pZF9qb2IiKTtyIT0zRCIiJiYoZS5yZXF1ZXN0KCJQVVQi
LGNvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzLz0Kbm9uZS9jb250ZW50cy8iK3Ise2RlbGV0ZWQ6
ITB9LGZ1bmN0aW9uKCl7bi5fcmVmcmVzaEhkYXMoKX0pLHQuc2V0KCJkYXRhc2V0PQpfaWRfam9i
IiwiIikpfSxfc3VibWl0OmZ1bmN0aW9uKHQsbixyLGkscyl7dmFyIG89M0R0aGlzLHU9M0R0Lmlk
LGE9M0R0LmdldCg9CiJ0eXBlIiksZj0zRHRoaXMuYXBwLnR5cGVzLmdldChhKTtkYXRhPTNEe3Rv
b2xfaWQ6ImNoYXJ0cyIsaW5wdXRzOntpbnB1dDp7aT0KZDp0LmdldCgiZGF0YXNldF9pZCIpLHNy
YzoiaGRhIn0sbW9kdWxlOmYuZXhlY3V0ZSxjb2x1bW5zOnIsc2V0dGluZ3M6bn19LHQuPQpzdGF0
ZSgid2FpdCIsIlNlbmRpbmcgam9iIHJlcXVlc3QuLi4iKSxlLnJlcXVlc3QoIlBPU1QiLGNvbmZp
Zy5yb290KyJhcGkvdG89Cm9scyIsZGF0YSxmdW5jdGlvbihlKXtpZighZS5vdXRwdXRzfHxlLm91
dHB1dHMubGVuZ3RoPTNEPTNEMCl0LnN0YXRlKCJmYWlsZT0KZCIsIkpvYiBzdWJtaXNzaW9uIGZh
aWxlZC4gTm8gcmVzcG9uc2UuIikscyYmcygpO2Vsc2V7by5fcmVmcmVzaEhkYXMoKTt2YXIgPQpu
PTNEZS5vdXRwdXRzWzBdO3Quc3RhdGUoIndhaXQiLCJZb3VyIGpvYiBoYXMgYmVlbiBxdWV1ZWQu
IFlvdSBtYXkgY2xvc2UgdGg9CmUgYnJvd3NlciB3aW5kb3cuIFRoZSBqb2Igd2lsbCBydW4gaW4g
dGhlIGJhY2tncm91bmQuIiksdC5zZXQoImRhdGFzZXRfaWRfaj0Kb2IiLG4uaWQpLHRoaXMuYXBw
LnN0b3JhZ2Uuc2F2ZSgpLG8uX3dhaXQodCxpLHMpfX0sZnVuY3Rpb24oZSl7dmFyIG49M0QiIjtl
PQomJmUubWVzc2FnZSYmZS5tZXNzYWdlLmRhdGEmJmUubWVzc2FnZS5kYXRhLmlucHV0JiYobj0z
RGUubWVzc2FnZS5kYXRhLmlucHU9CnQrIi4iKSx0LnN0YXRlKCJmYWlsZWQiLCJUaGlzIHZpc3Vh
bGl6YXRpb24gcmVxdWlyZXMgdGhlICdjaGFydHMnIHRvb2wuIFBsZT0KYXNlIG1ha2Ugc3VyZSBp
dCBpcyBpbnN0YWxsZWQuICIrbikscyYmcygpfSl9LF93YWl0OmZ1bmN0aW9uKHQsbixyKXt2YXIg
aT0KPTNEdGhpcztlLnJlcXVlc3QoIkdFVCIsY29uZmlnLnJvb3QrImFwaS9kYXRhc2V0cy8iK3Qu
Z2V0KCJkYXRhc2V0X2lkX2pvYiIpPQose30sZnVuY3Rpb24oZSl7dmFyIHM9M0QhMTtzd2l0Y2go
ZS5zdGF0ZSl7Y2FzZSJvayI6dC5zdGF0ZSgid2FpdCIsIkpvYiBjb209CnBsZXRlZCBzdWNjZXNz
ZnVsbHkuLi4iKSxuJiZuKGUpLHM9M0QhMDticmVhaztjYXNlImVycm9yIjp0LnN0YXRlKCJmYWls
ZWQiLD0KIkpvYiBoYXMgZmFpbGVkLiBQbGVhc2UgY2hlY2sgdGhlIGhpc3RvcnkgZm9yIGRldGFp
bHMuIiksciYmcihlKSxzPTNEITA7YnJlPQphaztjYXNlInJ1bm5pbmciOnQuc3RhdGUoIndhaXQi
LCJZb3VyIGpvYiBpcyBydW5uaW5nLiBZb3UgbWF5IGNsb3NlIHRoZSBicm89CndzZXIgd2luZG93
LiBUaGUgam9iIHdpbGwgY29udGludWUgaW4gdGhlIGJhY2tncm91bmQuIil9c3x8c2V0VGltZW91
dChmdW5jdD0KaW9uKCl7aS5fd2FpdCh0LG4scil9LGkuYXBwLmNvbmZpZy5nZXQoInF1ZXJ5X3Rp
bWVvdXQiKSl9KX0sX3JlZnJlc2hIZGFzOmZ1PQpuY3Rpb24oKXtHYWxheHkmJkdhbGF4eS5jdXJy
SGlzdG9yeVBhbmVsJiZHYWxheHkuY3Vyckhpc3RvcnlQYW5lbC5yZWZyZXNoQ289Cm50ZW50cygp
fX0pfSksZGVmaW5lKCJwbHVnaW4vbGlicmFyeS9kYXRhc2V0cyIsWyJ1dGlscy91dGlscyJdLGZ1
bmN0aW9uKGUpez0KcmV0dXJuIEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtsaXN0Ont9LGNh
Y2hlOnt9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxuPQope3RoaXMuYXBwPTNEdCx0aGlzLm9wdGlv
bnM9M0RlLm1lcmdlKG4sdGhpcy5vcHRpb25zRGVmYXVsdCl9LHJlcXVlc3Q6ZnVuY3Q9Cmlvbihl
LHQsbil7dmFyIHI9M0R0aGlzO2UuZ3JvdXBzP3RoaXMuX2dldF9kYXRhc2V0KGUuaWQsZnVuY3Rp
b24oKXtyLl9nZXQoZT0KLHQpfSk6dGhpcy5fZ2V0X2RhdGFzZXQoZS5pZCx0LG4pfSxfZ2V0X2Rh
dGFzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBpPTNEdGhpPQpzLmxpc3RbdF07aWYoaSl7bihpKTty
ZXR1cm59dmFyIHM9M0R0aGlzO2UucmVxdWVzdCgiR0VUIixjb25maWcucm9vdCsiYXBpL2Q9CmF0
YXNldHMvIit0LHt9LGZ1bmN0aW9uKGUpe3N3aXRjaChlLnN0YXRlKXtjYXNlImVycm9yIjpyJiZy
KGUpO2JyZWFrO2RlZmF1bD0KdDpzLmxpc3RbdF09M0RlLG4oZSl9fSl9LF9ibG9ja19pZDpmdW5j
dGlvbihlLHQpe3JldHVybiBlLmlkKyJfIitlLnN0YXJ0KyJfPQoiK2UuZW5kKyJfIit0fSxfZ2V0
OmZ1bmN0aW9uKGUsdCl7ZS5zdGFydHx8KGUuc3RhcnQ9M0QwKSxlLmVuZHx8KGUuZW5kPTNEdGg9
CmlzLmFwcC5jb25maWcuZ2V0KCJxdWVyeV9saW1pdCIpKTt2YXIgbj0zRFtdLHI9M0R7fSxpPTNE
MDtmb3IodmFyIHMgaW4gZS5ncj0Kb3Vwcyl7dmFyIG89M0RlLmdyb3Vwc1tzXTtmb3IodmFyIHUg
aW4gby5jb2x1bW5zKXt2YXIgYT0zRG8uY29sdW1uc1t1XS5pbmRlPQp4LGY9M0R0aGlzLl9ibG9j
a19pZChlLGEpO2lmKHRoaXMuY2FjaGVbZl18fGE9M0Q9M0Q9M0QiYXV0byIpY29udGludWU7IXJb
YV09CiYmYSE9M0Q9M0R1bmRlZmluZWQmJihyW2FdPTNEaSxuLnB1c2goYSksaSsrKX19aWYobi5s
ZW5ndGg9M0Q9M0QwKXt0aGlzLl9maT0KbGxfZnJvbV9jYWNoZShlKSx0KGUpO3JldHVybn12YXIg
bD0zRHtkYXRhc2V0X2lkOmUuaWQsc3RhcnQ6ZS5zdGFydCxlbmQ6ZS5lPQpuZCxjb2x1bW5zOm59
LGM9M0R0aGlzO3RoaXMuX2ZldGNoKGwsZnVuY3Rpb24ocil7Zm9yKHZhciBpIGluIHIpe3ZhciBz
PTNEbls9CmldLG89M0RjLl9ibG9ja19pZChlLHMpO2MuY2FjaGVbb109M0RyW2ldfWMuX2ZpbGxf
ZnJvbV9jYWNoZShlKSx0KGUpfSl9LF9maT0KbGxfZnJvbV9jYWNoZTpmdW5jdGlvbihlKXtjb25z
b2xlLmRlYnVnKCJEYXRhc2V0czo6X2ZpbGxfZnJvbV9jYWNoZSgpIC0gRmlsPQpsaW5nIHJlcXVl
c3QgZnJvbSBjYWNoZS4iKTt2YXIgdD0zRGUuc3RhcnQsbj0zRDA7Zm9yKHZhciByIGluIGUuZ3Jv
dXBzKXt2YXI9CiBpPTNEZS5ncm91cHNbcl07Zm9yKHZhciBzIGluIGkuY29sdW1ucyl7dmFyIG89
M0RpLmNvbHVtbnNbc10sdT0zRHRoaXMuX2Jsbz0KY2tfaWQoZSxvLmluZGV4KSxhPTNEdGhpcy5j
YWNoZVt1XTthJiYobj0zRE1hdGgubWF4KG4sYS5sZW5ndGgpKX19bj0zRD0zRDAmPQomY29uc29s
ZS5kZWJ1ZygiRkFJTEVEIC0gRGF0YXNldHM6Ol9maWxsX2Zyb21fY2FjaGUoKSAtIEludmFsaWQg
cmFuZ2UuIik7Zm89CnIodmFyIHIgaW4gZS5ncm91cHMpe3ZhciBpPTNEZS5ncm91cHNbcl07aS52
YWx1ZXM9M0RbXTtmb3IodmFyIGY9M0QwO2Y8bjtmKz0KKylpLnZhbHVlc1tmXT0zRHt4OnBhcnNl
SW50KGYpK3R9fWZvcih2YXIgciBpbiBlLmdyb3Vwcyl7dmFyIGk9M0RlLmdyb3Vwc1tyPQpdO2Zv
cih2YXIgcyBpbiBpLmNvbHVtbnMpe3ZhciBvPTNEaS5jb2x1bW5zW3NdO2lmKG8uaW5kZXg9M0Q9
M0QiYXV0byIpZm9yKHY9CmFyIGY9M0QwO2Y8bjtmKyspe3ZhciBsPTNEaS52YWx1ZXNbZl07bFtz
XT0zRHBhcnNlSW50KGYpK3R9ZWxzZXt2YXIgdT0zRHRoaT0Kcy5fYmxvY2tfaWQoZSxvLmluZGV4
KSxhPTNEdGhpcy5jYWNoZVt1XTtmb3IodmFyIGY9M0QwO2Y8bjtmKyspe3ZhciBsPTNEaS52PQph
bHVlc1tmXSxjPTNEYVtmXTtpc05hTihjKSYmIW8uaXNfbGFiZWwmJihjPTNEMCksbFtzXT0zRGN9
fX19fSxfZmV0Y2g6ZnVuY3Q9Cmlvbih0LG4pe3ZhciByPTNEdC5zdGFydD90LnN0YXJ0OjAsaT0z
RE1hdGguYWJzKHQuZW5kLXQuc3RhcnQpLHM9M0R0aGlzLmFwcD0KLmNvbmZpZy5nZXQoInF1ZXJ5
X2xpbWl0Iik7aWYoIWl8fGk+cylpPTNEczt2YXIgbz0zRDA7dC5jb2x1bW5zJiYobz0zRHQuY29s
PQp1bW5zLmxlbmd0aCxjb25zb2xlLmRlYnVnKCJEYXRhc2V0czo6X2ZldGNoKCkgLSBGZXRjaGlu
ZyAiK28rIiBjb2x1bW4ocykiKSk9CixvPTNEPTNEMCYmY29uc29sZS5kZWJ1ZygiRGF0YXNldHM6
Ol9mZXRjaCgpIC0gTm8gY29sdW1ucyByZXF1ZXN0ZWQiKTt2YXIgdT0KPTNEIiI7Zm9yKHZhciBh
IGluIHQuY29sdW1ucyl1Kz0zRHQuY29sdW1uc1thXSsiLCI7dT0zRHUuc3Vic3RyaW5nKDAsdS5s
ZW5nPQp0aC0xKTt2YXIgZj0zRHRoaXM7ZS5yZXF1ZXN0KCJHRVQiLGNvbmZpZy5yb290KyJhcGkv
ZGF0YXNldHMvIit0LmRhdGFzZXRfaWQ9Cix7ZGF0YV90eXBlOiJyYXdfZGF0YSIscHJvdmlkZXI6
ImRhdGFzZXQtY29sdW1uIixsaW1pdDppLG9mZnNldDpyLGluZGVjZXM6dT0KfSxmdW5jdGlvbihl
KXt2YXIgdD0zRG5ldyBBcnJheShvKTtmb3IodmFyIHI9M0QwO3I8bztyKyspdFtyXT0zRFtdO2Zv
cih2YXIgPQpyIGluIGUuZGF0YSl7dmFyIGk9M0RlLmRhdGFbcl07Zm9yKHZhciBzIGluIGkpe3Zh
ciB1PTNEaVtzXTt1IT0zRD0zRHVuZGVmaW49CmVkJiZ1IT0zRDIxNDc0ODM2NDcmJnRbc10ucHVz
aCh1KX19Y29uc29sZS5kZWJ1ZygiRGF0YXNldHM6Ol9mZXRjaCgpIC0gRmV0Yz0KaGluZyBjb21w
bGV0ZS4iKSxuKHQpfSl9fSl9KSxkZWZpbmUoInBsdWdpbi9tb2RlbHMvZ3JvdXAiLFtdLGZ1bmN0
aW9uKCl7cmV0PQp1cm4gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtkZWZhdWx0czp7a2V5OiJEYXRh
IGxhYmVsIixkYXRlOiIifSxyZXNldDpmdW5jdGk9Cm9uKCl7dGhpcy5jbGVhcih7c2lsZW50OiEw
fSkuc2V0KHRoaXMuZGVmYXVsdHMpLHRoaXMudHJpZ2dlcigicmVzZXQiLHRoaXMpfT0KfSl9KSxk
ZWZpbmUoInBsdWdpbi9tb2RlbHMvZ3JvdXBzIixbInBsdWdpbi9tb2RlbHMvZ3JvdXAiXSxmdW5j
dGlvbihlKXtyZXR1PQpybiBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7bW9kZWw6ZX0pfSks
ZGVmaW5lKCJwbHVnaW4vbGlicmFyeS9kZWZlcnJlZCI9CixbInV0aWxzL3V0aWxzIl0sZnVuY3Rp
b24oZSl7cmV0dXJuIEJhY2tib25lLk1vZGVsLmV4dGVuZCh7cXVldWU6W10scHJvY2Vzcz0KOnt9
LGNvdW50ZXI6MCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5vbigicmVmcmVzaCIsZnVuY3Rp
b24oKXtmb3IodmFyIGUgPQppbiB0aGlzLnF1ZXVlKWlmKHRoaXMuY291bnRlcj0zRD0zRDApe3Zh
ciB0PTNEdGhpcy5xdWV1ZVtlXTt0aGlzLnF1ZXVlLnNwbGk9CmNlKGUsMSksdCgpfX0pfSxleGVj
dXRlOmZ1bmN0aW9uKGUpe3RoaXMucXVldWUucHVzaChlKSx0aGlzLnRyaWdnZXIoInJlZnJlcz0K
aCIpfSxyZWdpc3RlcjpmdW5jdGlvbigpe3ZhciB0PTNEZS51dWlkKCk7cmV0dXJuIHRoaXMucHJv
Y2Vzc1t0XT0zRCEwLHRoaXMuPQpjb3VudGVyKyssY29uc29sZS5kZWJ1ZygiRGVmZXJyZWQ6cmVn
aXN0ZXIoKSAtIFJlZ2lzdGVyaW5nICIrdCksdH0sZG9uZTpmdW49CmN0aW9uKGUpe3RoaXMucHJv
Y2Vzc1tlXSYmKGRlbGV0ZSB0aGlzLnByb2Nlc3NbZV0sdGhpcy5jb3VudGVyLS0sY29uc29sZS5k
ZT0KYnVnKCJEZWZlcnJlZDpkb25lKCkgLSBVbnJlZ2lzdGVyaW5nICIrZSksdGhpcy50cmlnZ2Vy
KCJyZWZyZXNoIikpfSxyZWFkeTpmPQp1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY291bnRlcj0zRD0z
RDB9fSl9KTt2YXIgVmlzdWFsaXphdGlvbj0zREJhY2tib25lLk1vZGU9CmwuZXh0ZW5kKHtkZWZh
dWx0czp7Y29uZmlnOnt9fSx1cmxSb290OmZ1bmN0aW9uKCl7dmFyIGU9M0QiL2FwaS92aXN1YWxp
emF0aT0Kb25zIjtyZXR1cm4gd2luZG93LmdhbGF4eV9jb25maWcmJmdhbGF4eV9jb25maWcucm9v
dD9nYWxheHlfY29uZmlnLnJvb3QrZTplPQp9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7Xy5pc09i
amVjdChlLmNvbmZpZykmJl8uaXNPYmplY3QodGhpcy5kZWZhdWx0cy5jb249CmZpZykmJl8uZGVm
YXVsdHMoZS5jb25maWcsdGhpcy5kZWZhdWx0cy5jb25maWcpLHRoaXMuX3NldFVwTGlzdGVuZXJz
KCl9LF9zZT0KdFVwTGlzdGVuZXJzOmZ1bmN0aW9uKCl7fSxzZXQ6ZnVuY3Rpb24oZSx0KXtpZihl
PTNEPTNEPTNEImNvbmZpZyIpe3ZhciBuPTNEPQp0aGlzLmdldCgiY29uZmlnIik7Xy5pc09iamVj
dChuKSYmKHQ9M0RfLmV4dGVuZChfLmNsb25lKG4pLHQpKX1yZXR1cm4gQmFja2I9Cm9uZS5Nb2Rl
bC5wcm90b3R5cGUuc2V0LmNhbGwodGhpcyxlLHQpLHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7
dmFyIGU9M0R0aD0KaXMuZ2V0KCJpZCIpfHwiIjtyZXR1cm4gdGhpcy5nZXQoInRpdGxlIikmJihl
Kz0zRCI6Iit0aGlzLmdldCgidGl0bGUiKSksIlZpPQpzdWFsaXphdGlvbigiK2UrIikifX0pLFZp
c3VhbGl6YXRpb25Db2xsZWN0aW9uPTNEQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQ9Cih7bW9k
ZWw6VmlzdWFsaXphdGlvbix1cmw6ZnVuY3Rpb24oKXtyZXR1cm4gZ2FsYXh5X2NvbmZpZy5yb290
KyJhcGkvdmlzdWFsaT0KemF0aW9ucyJ9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSx0KXt0PTNEdHx8
e319LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPTNEdGhpPQpzO2U9M0RfLm1hcChlLGZ1bmN0aW9u
KGUpe3ZhciB0PTNEbi5nZXQoZS5pZCk7aWYoIXQpcmV0dXJuIGU7dmFyIHI9M0R0LnRvSlM9Ck9O
KCk7cmV0dXJuIF8uZXh0ZW5kKHIsZSkscn0pLEJhY2tib25lLkNvbGxlY3Rpb24ucHJvdG90eXBl
LnNldC5jYWxsKHRoaXMsZT0KLHQpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVyblsiVmlzdWFs
aXphdGlvbkNvbGxlY3Rpb24oIixbdGhpcy5oaXN0b3J5SWQsPQp0aGlzLmxlbmd0aF0uam9pbigp
LCIpIl0uam9pbigiIil9fSk7ZGVmaW5lKCJtdmMvdmlzdWFsaXphdGlvbi92aXN1YWxpemF0aW89
Cm4tbW9kZWwiLGZ1bmN0aW9uKCl7fSksZGVmaW5lKCJwbHVnaW4vbW9kZWxzL2NoYXJ0IixbInBs
dWdpbi9tb2RlbHMvZ3JvdXBzIj0KLCJwbHVnaW4vbGlicmFyeS9kZWZlcnJlZCIsIm12Yy92aXN1
YWxpemF0aW9uL3Zpc3VhbGl6YXRpb24tbW9kZWwiXSxmdW5jdGlvPQpuKGUsdCl7cmV0dXJuIEJh
Y2tib25lLk1vZGVsLmV4dGVuZCh7ZGVmYXVsdHM6e2lkOm51bGwsdGl0bGU6IiIsdHlwZToiIixk
YXQ9CmU6bnVsbCxzdGF0ZToiIixzdGF0ZV9pbmZvOiIiLG1vZGlmaWVkOiExLGRhdGFzZXRfaWQ6
IiIsZGF0YXNldF9pZF9qb2I6IiJ9LD0KaW5pdGlhbGl6ZTpmdW5jdGlvbihuKXt0aGlzLmdyb3Vw
cz0zRG5ldyBlLHRoaXMuc2V0dGluZ3M9M0RuZXcgQmFja2JvbmUuTW9kPQplbCx0aGlzLmRlZmVy
cmVkPTNEbmV3IHR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5jbGVhcih7c2lsZW50OiEwfSkuc2V0
KHRoaXM9Ci5kZWZhdWx0cyksdGhpcy5ncm91cHMucmVzZXQoKSx0aGlzLnNldHRpbmdzLmNsZWFy
KCksdGhpcy50cmlnZ2VyKCJyZXNldCIsdD0KaGlzKX0sY29weTpmdW5jdGlvbihlKXt2YXIgdD0z
RHRoaXM7dC5jbGVhcih7c2lsZW50OiEwfSkuc2V0KHRoaXMuZGVmYXVsdHMpPQosdC5zZXQoZS5h
dHRyaWJ1dGVzKSx0LnNldHRpbmdzPTNEZS5zZXR0aW5ncy5jbG9uZSgpLHQuZ3JvdXBzLnJlc2V0
KCksZS5ncm89CnVwcy5lYWNoKGZ1bmN0aW9uKGUpe3QuZ3JvdXBzLmFkZChlLmNsb25lKCkpfSks
dC50cmlnZ2VyKCJjaGFuZ2UiLHQpfSxzdGF0ZT0KOmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXQoInN0
YXRlIixlKSx0aGlzLnNldCgic3RhdGVfaW5mbyIsdCksdGhpcy50cmlnZ2VyKCJzPQpldDpzdGF0
ZSIpLGNvbnNvbGUuZGVidWcoIkNoYXJ0OnN0YXRlKCkgLSAiK3QrIiAoIitlKyIpIil9fSl9KSxk
ZWZpbmUoInBsdWc9CmluL2xpYnJhcnkvc3RvcmFnZSIsWyJ1dGlscy91dGlscyIsInBsdWdpbi9t
b2RlbHMvY2hhcnQiLCJwbHVnaW4vbW9kZWxzL2dybz0KdXAiXSxmdW5jdGlvbihlLHQsbil7cmV0
dXJuIEJhY2tib25lLk1vZGVsLmV4dGVuZCh7dmlzOm51bGwsaW5pdGlhbGl6ZTpmdW5jPQp0aW9u
KGUpe3RoaXMuYXBwPTNEZSx0aGlzLmNoYXJ0PTNEdGhpcy5hcHAuY2hhcnQsdGhpcy5vcHRpb25z
PTNEdGhpcy5hcHAub3A9CnRpb25zLHRoaXMuaWQ9M0R0aGlzLm9wdGlvbnMuaWQsdGhpcy52aXM9
M0RuZXcgVmlzdWFsaXphdGlvbih7dHlwZToiY2hhcnRzIj0KLGNvbmZpZzp7ZGF0YXNldF9pZDp0
aGlzLm9wdGlvbnMuY29uZmlnLmRhdGFzZXRfaWQsY2hhcnRfZGljdDp7fX19KSx0aGlzLmlkPQom
Jih0aGlzLnZpcy5pZD0zRHRoaXMuaWQpO3ZhciB0PTNEdGhpcy5vcHRpb25zLmNvbmZpZy5jaGFy
dF9kaWN0O3QmJih0aGlzLnY9CmlzLmdldCgiY29uZmlnIikuY2hhcnRfZGljdD0zRHQpfSxzYXZl
OmZ1bmN0aW9uKCl7dmFyIGU9M0R0aGlzLmFwcC5jaGFydDt0aD0KaXMudmlzLmdldCgiY29uZmln
IikuY2hhcnRfZGljdD0zRHt9O3ZhciB0PTNEZS5nZXQoInRpdGxlIik7dCE9M0QiIiYmdGhpcy52
PQppcy5zZXQoInRpdGxlIix0KTt2YXIgbj0zRHthdHRyaWJ1dGVzOmUuYXR0cmlidXRlcyxzZXR0
aW5nczplLnNldHRpbmdzLmF0dHI9CmlidXRlcyxncm91cHM6W119O2UuZ3JvdXBzLmVhY2goZnVu
Y3Rpb24oZSl7bi5ncm91cHMucHVzaChlLmF0dHJpYnV0ZXMpfSksdD0KaGlzLnZpcy5nZXQoImNv
bmZpZyIpLmNoYXJ0X2RpY3Q9M0RuO3ZhciByPTNEdGhpczt0aGlzLnZpcy5zYXZlKCkuZmFpbChm
dW5jPQp0aW9uKGUsdCxuKXtjb25zb2xlLmVycm9yKGUsdCxuKX0pLnRoZW4oZnVuY3Rpb24oZSl7
ZSYmZS5pZCYmKHIuaWQ9M0RlLmlkKX09Cil9LGxvYWQ6ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXMu
dmlzLmdldCgiY29uZmlnIikuY2hhcnRfZGljdDtpZighZS5hdHRyaWJ1dD0KZXMpcmV0dXJuITE7
dmFyIHQ9M0RlLmF0dHJpYnV0ZXMudHlwZTtpZighdClyZXR1cm4gY29uc29sZS5kZWJ1ZygiU3Rv
cmFnZTo6PQpsb2FkKCkgLSBDaGFydCB0eXBlIG5vdCBwcm92aWRlZC4gSW52YWxpZCBmb3JtYXQu
IiksITE7dmFyIHI9M0R0aGlzLmFwcC50eXA9CmVzLmdldCh0KTtpZighcilyZXR1cm4gY29uc29s
ZS5kZWJ1ZygiU3RvcmFnZTo6bG9hZCgpIC0gQ2hhcnQgdHlwZSBub3Qgc3VwcD0Kb3J0ZWQuIFBs
ZWFzZSByZS1jb25maWd1cmUgdGhlIGNoYXJ0LiBSZXNldHRpbmcgY2hhcnQuIiksITE7Y29uc29s
ZS5kZWJ1ZygiPQpTdG9yYWdlOjpsb2FkKCkgLSBMb2FkaW5nIGNoYXJ0IHR5cGUgIit0KyIuIiks
dGhpcy5jaGFydC5zZXQoZS5hdHRyaWJ1dGVzKSw9CnRoaXMuY2hhcnQuc3RhdGUoIm9rIiwiTG9h
ZGluZyBzYXZlZCB2aXN1YWxpemF0aW9uLi4uIiksdGhpcy5jaGFydC5zZXR0aW5ncz0KLnNldChl
LnNldHRpbmdzKTtmb3IodmFyIGkgaW4gZS5ncm91cHMpdGhpcy5jaGFydC5ncm91cHMuYWRkKG5l
dyBuKGUuZ3JvdXBzPQpbaV0pKTtyZXR1cm4gdGhpcy5jaGFydC5zZXQoIm1vZGlmaWVkIiwhMSks
ITB9fSl9KSxkZWZpbmUoInBsdWdpbi9saWJyYXJ5L3M9CmNyZWVuc2hvdCIsWyJsaWJzL3VuZGVy
c2NvcmUiXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCxpKXt2YXIgcz0zRG5ldyBYTT0KTFNl
cmlhbGl6ZXIsbz0zRCIiLHU9M0R0aGlzLGE9M0QwLGY9M0QwO3JldHVybiBlLmZpbmQoInN2ZyIp
LmVhY2goZnVuY3Rpb24oPQope3ZhciBlPTNEJCh0aGlzKTtuKGUpLGE9M0RwYXJzZUludChlLmNz
cygiaGVpZ2h0IikpLGY9M0RwYXJzZUludChlLmNzcygid2k9CmR0aCIpKSxlLmF0dHIoe3ZlcnNp
b246IjEuMSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDpmLGhlaT0K
Z2h0OmF9KSxvKz0zRHMuc2VyaWFsaXplVG9TdHJpbmcodGhpcyl9KSxyKGUsdCx7ZmlsZW5hbWU6
aXx8ImNoYXJ0Iix0eXBlOiJhPQpwcGxpY2F0aW9uL3BkZiIsaGVpZ2h0OmEsd2lkdGg6ZixzY2Fs
ZToyLHN2ZzpvfSksb31mdW5jdGlvbiBuKGUpe2Zvcih2YXIgdCA9CmluIGRvY3VtZW50LnN0eWxl
U2hlZXRzKXt2YXIgbj0zRGRvY3VtZW50LnN0eWxlU2hlZXRzW3RdLHI9M0RuLmNzc1J1bGVzO2lm
KD0Kcilmb3IodmFyIGk9M0QwLHM9M0RyLmxlbmd0aDtpPHM7aSsrKXRyeXtlLmZpbmQocltpXS5z
ZWxlY3RvclRleHQpLmVhY2goZnVuPQpjdGlvbihlLHQpe3Quc3R5bGUuY3NzVGV4dCs9M0RyW2ld
LnN0eWxlLmNzc1RleHR9KX1jYXRjaChvKXt9fX1mdW5jdGlvbiByKGU9Cix0LG4pe3ZhciByPTNE
ZS5maW5kKCIjdmlld3BvcnQtZm9ybSIpO3IubGVuZ3RoPTNEPTNEPTNEMCYmKHI9M0QkKCI8Zm9y
bT4iLD0Ke2lkOiJ2aWV3cG9ydC1mb3JtIixtZXRob2Q6InBvc3QiLGFjdGlvbjp0LGRpc3BsYXk6
Im5vbmUifSksZS5hcHBlbmQocikpLHIuPQplbXB0eSgpO2ZvcihuYW1lIGluIG4pe3ZhciBpPTNE
JCgiPGlucHV0Lz4iLHt0eXBlOiJoaWRkZW4iLG5hbWU6bmFtZSx2YWx1ZTo9Cm5bbmFtZV19KTty
LmFwcGVuZChpKX10cnl7ci5zdWJtaXQoKX1jYXRjaChzKXtjb25zb2xlLmxvZyhzKX19cmV0dXJu
e2NyZWF0ZT0KOnR9fSksZGVmaW5lKCJwbHVnaW4vdmlld3Mvdmlld3BvcnQiLFsibXZjL3VpL3Vp
LXBvcnRsZXQiLCJwbHVnaW4vbGlicmFyeS91PQppIiwicGx1Z2luL2xpYnJhcnkvc2NyZWVuc2hv
dCIsInV0aWxzL3V0aWxzIl0sZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEJhY2s9CmJvbmUuVmll
dy5leHRlbmQoe2NvbnRhaW5lcl9saXN0OltdLGNhbnZhc19saXN0OltdLGluaXRpYWxpemU6ZnVu
Y3Rpb24oZSx0KT0Ke3RoaXMuYXBwPTNEZSx0aGlzLmNoYXJ0PTNEdGhpcy5hcHAuY2hhcnQsdGhp
cy5vcHRpb25zPTNEci5tZXJnZSh0LHRoaXMub3B0PQppb25zRGVmYXVsdCksdGhpcy5zZXRFbGVt
ZW50KCQodGhpcy5fdGVtcGxhdGUoKSkpLHRoaXMuX2Z1bGxzY3JlZW4odGhpcy4kZWw9CiwxMDAp
LHRoaXMuX2NyZWF0ZUNvbnRhaW5lcigiZGl2Iik7dmFyIG49M0R0aGlzO3RoaXMuY2hhcnQub24o
InJlZHJhdyIsZnVuYz0KdGlvbigpe24uX2RyYXcobi5jaGFydCl9KSx0aGlzLmNoYXJ0Lm9uKCJz
ZXQ6c3RhdGUiLGZ1bmN0aW9uKCl7dmFyIGU9M0RuLiRlPQpsLmZpbmQoIiNpbmZvIiksdD0zRG4u
JGVsLmZpbmQoImNvbnRhaW5lciIpLHI9M0RlLmZpbmQoIiNpY29uIik7ci5yZW1vdmVDbGE9CnNz
KCksZS5zaG93KCksZS5maW5kKCIjdGV4dCIpLmh0bWwobi5jaGFydC5nZXQoInN0YXRlX2luZm8i
KSksdC5oaWRlKCk7dmFyID0KaT0zRG4uY2hhcnQuZ2V0KCJzdGF0ZSIpO3N3aXRjaChpKXtjYXNl
Im9rIjplLmhpZGUoKSx0LnNob3coKTticmVhaztjYXNlImZhPQppbGVkIjpyLmFkZENsYXNzKCJp
Y29uIGZhIGZhLXdhcm5pbmciKTticmVhaztkZWZhdWx0OnIuYWRkQ2xhc3MoImljb24gZmEgZmE9
Ci1zcGlubmVyIGZhLXNwaW4iKX19KX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuJGVsLnNob3coKX0s
aGlkZTpmdW5jdGlvbigpe3RoaT0Kcy4kZWwuaGlkZSgpfSxfZnVsbHNjcmVlbjpmdW5jdGlvbihl
LHQpe2UuY3NzKCJoZWlnaHQiLCQod2luZG93KS5oZWlnaHQoKS10PQopLCQod2luZG93KS5yZXNp
emUoZnVuY3Rpb24oKXtlLmNzcygiaGVpZ2h0IiwkKHdpbmRvdykuaGVpZ2h0KCktdCl9KX0sX2Ny
ZWE9CnRlQ29udGFpbmVyOmZ1bmN0aW9uKGUsdCl7dD0zRHR8fDE7Zm9yKHZhciBuIGluIHRoaXMu
Y29udGFpbmVyX2xpc3QpdGhpcy5jbz0KbnRhaW5lcl9saXN0W25dLnJlbW92ZSgpO3RoaXMuY29u
dGFpbmVyX2xpc3Q9M0RbXSx0aGlzLmNhbnZhc19saXN0PTNEW107Zm9yPQoodmFyIG49M0QwO248
dDtuKyspe3ZhciByPTNEJCh0aGlzLl90ZW1wbGF0ZUNvbnRhaW5lcihlLHBhcnNlSW50KDEwMC90
KSkpO3Q9Cmhpcy4kZWwuYXBwZW5kKHIpLHRoaXMuY29udGFpbmVyX2xpc3Rbbl09M0RyLGU9M0Q9
M0Qic3ZnIj90aGlzLmNhbnZhc19saXN0Wz0Kbl09M0RkMy5zZWxlY3Qoci5maW5kKCIjY2FudmFz
IilbMF0pOnRoaXMuY2FudmFzX2xpc3Rbbl09M0RyLmZpbmQoIiNjYW52YXMiPQopfX0sX2RyYXc6
ZnVuY3Rpb24oZSl7dmFyIHQ9M0R0aGlzLG49M0RlLmRlZmVycmVkLnJlZ2lzdGVyKCkscj0zRGUu
Z2V0KCJ0eXA9CmUiKTt0aGlzLmNoYXJ0X3NldHRpbmdzPTNEdGhpcy5hcHAudHlwZXMuZ2V0KHIp
O3ZhciBpPTNEdGhpcy5jaGFydF9zZXR0aW5ncz0KLnVzZV9wYW5lbHMscz0zRDE7aSYmKHM9M0Rl
Lmdyb3Vwcy5sZW5ndGgpLHRoaXMuX2NyZWF0ZUNvbnRhaW5lcih0aGlzLmNoYXJ0PQpfc2V0dGlu
Z3MudGFnLHMpLGUuc3RhdGUoIndhaXQiLCJQbGVhc2Ugd2FpdC4uLiIpO2lmKCF0aGlzLmNoYXJ0
X3NldHRpbmdzLmU9CnhlY3V0ZXx8dGhpcy5jaGFydF9zZXR0aW5ncy5leGVjdXRlJiZlLmdldCgi
bW9kaWZpZWQiKSl0aGlzLmFwcC5qb2JzLmNsZWFudT0KcChlKSxlLnNldCgibW9kaWZpZWQiLCEx
KTt2YXIgdD0zRHRoaXM7cmVxdWlyZShbInBsdWdpbi9jaGFydHMvIit0aGlzLmFwcC5jPQpoYXJ0
UGF0aChyKSsiL3dyYXBwZXIiXSxmdW5jdGlvbihyKXt2YXIgaT0zRG5ldyByKHQuYXBwLHtjYW52
YXM6dC5jYW52YXNfbGk9CnN0fSk7dC5jaGFydF9zZXR0aW5ncy5leGVjdXRlP3QuYXBwLmpvYnMu
cmVxdWVzdChlLHQuX2RlZmF1bHRTZXR0aW5nc1N0cmluZz0KKGUpLHQuX2RlZmF1bHRSZXF1ZXN0
U3RyaW5nKGUpLGZ1bmN0aW9uKCl7aS5kcmF3KG4sZSx0Ll9kZWZhdWx0UmVxdWVzdERpY3RpPQpv
bmFyeShlKSl9LGZ1bmN0aW9uKCl7ZS5kZWZlcnJlZC5kb25lKG4pfSk6aS5kcmF3KG4sZSx0Ll9k
ZWZhdWx0UmVxdWVzdERpY3Q9CmlvbmFyeShlKSl9KX0sX2RlZmF1bHRSZXF1ZXN0U3RyaW5nOmZ1
bmN0aW9uKGUpe3ZhciB0PTNEIiIsbj0zRDAscj0zRHRoaXM7cj0KZXR1cm4gZS5ncm91cHMuZWFj
aChmdW5jdGlvbihlKXtuKys7Zm9yKHZhciBpIGluIHIuY2hhcnRfc2V0dGluZ3MuY29sdW1ucyl0
PQorPTNEaSsiXyIrbisiOiIrKHBhcnNlSW50KGUuZ2V0KGkpKSsxKSsiLCAifSksdC5zdWJzdHJp
bmcoMCx0Lmxlbmd0aC0yKX0sX2Q9CmVmYXVsdFNldHRpbmdzU3RyaW5nOmZ1bmN0aW9uKGUpe3Zh
ciB0PTNEIiI7Zm9yKGtleSBpbiBlLnNldHRpbmdzLmF0dHJpYnV0ZT0Kcyl0Kz0zRGtleSsiOiIr
ZS5zZXR0aW5ncy5nZXQoa2V5KSsiLCAiO3JldHVybiB0LnN1YnN0cmluZygwLHQubGVuZ3RoLTIp
fSxfPQpkZWZhdWx0UmVxdWVzdERpY3Rpb25hcnk6ZnVuY3Rpb24oZSl7dmFyIHQ9M0R7Z3JvdXBz
OltdfTt0aGlzLmNoYXJ0X3NldHRpbmc9CnMuZXhlY3V0ZT90LmlkPTNEZS5nZXQoImRhdGFzZXRf
aWRfam9iIik6dC5pZD0zRGUuZ2V0KCJkYXRhc2V0X2lkIik7dmFyIG49Cj0zRDAscj0zRHRoaXM7
cmV0dXJuIGUuZ3JvdXBzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGk9M0R7fTtmb3IodmFyIHMgaW4g
ci5jaD0KYXJ0X3NldHRpbmdzLmNvbHVtbnMpe3ZhciBvPTNEci5jaGFydF9zZXR0aW5ncy5jb2x1
bW5zW3NdO2lbc109M0R7aW5kZXg6ZS5nPQpldChzKSxpc19sYWJlbDpvLmlzX2xhYmVsfX10Lmdy
b3Vwcy5wdXNoKHtrZXk6KytuKyI6IitlLmdldCgia2V5IiksY29sdW1uczo9Cml9KX0pLHR9LF90
ZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybic8ZGl2IGNsYXNzPTNEImNoYXJ0cy12aWV3cG9ydCI+
PGRpdiBpZD0KPTNEImluZm8iIGNsYXNzPTNEImluZm8iPjxzcGFuIGlkPTNEImljb24iIGNsYXNz
PTNEImljb24iIC8+PHNwYW4gaWQ9M0QidGV4PQp0IiBjbGFzcz0zRCJ0ZXh0IiAvPjwvZGl2Pjwv
ZGl2Pid9LF90ZW1wbGF0ZUNvbnRhaW5lcjpmdW5jdGlvbihlLHQpe3JldHVybic9CjxkaXYgY2xh
c3M9M0QiY2hhcnRzLXZpZXdwb3J0LWNvbnRhaW5lciIgc3R5bGU9M0Qid2lkdGg6Jyt0KyclOyI+
JysnPGRpdiBpZD0KPTNEIm1lbnUiLz4nKyI8IitlKycgaWQ9M0QiY2FudmFzIiBjbGFzcz0zRCJj
aGFydHMtdmlld3BvcnQtY2FudmFzIj4nKyI8L2RpPQp2PiJ9fSl9KSxkZWZpbmUoInBsdWdpbi92
aWV3cy92aWV3ZXIiLFsidXRpbHMvdXRpbHMiLCJwbHVnaW4vbGlicmFyeS91aSIsIm09CnZjL3Vp
L3VpLXBvcnRsZXQiLCJwbHVnaW4vbW9kZWxzL2dyb3VwIiwicGx1Z2luL3ZpZXdzL3ZpZXdwb3J0
IiwicGx1Z2luL2xpYj0KcmFyeS9zY3JlZW5zaG90Il0sZnVuY3Rpb24oZSx0LG4scixpLHMpe3Jl
dHVybiBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7aW5pdGlhPQpsaXplOmZ1bmN0aW9uKGUscil7dGhp
cy5hcHA9M0RlLHRoaXMuY2hhcnQ9M0R0aGlzLmFwcC5jaGFydCx0aGlzLnZpZXdwb3J0X3Y9Cmll
dz0zRG5ldyBpKGUpO3ZhciBvPTNEdGhpczt0aGlzLnBvcnRsZXQ9M0RuZXcgbi5WaWV3KHtpY29u
OiJmYS1iYXItY2hhcnQtbz0KIix0aXRsZToiVmlld3BvcnQiLHNjcm9sbGFibGU6ITEsb3BlcmF0
aW9uczp7ZWRpdF9idXR0b246bmV3IHQuQnV0dG9uSWNvbih7PQppY29uOiJmYS1lZGl0Iix0b29s
dGlwOiJDdXN0b21pemUgdGhpcyBjaGFydCIsdGl0bGU6IkVkaXRvciIsb25jbGljazpmdW5jdGk9
Cm9uKCl7by5fd2FpdChvLmNoYXJ0LGZ1bmN0aW9uKCl7by5hcHAuZ28oImVkaXRvciIpfSl9fSks
cGljdHVyZV9idXR0b246bmV3ID0KdC5CdXR0b25JY29uKHtpY29uOiJmYS1jYW1lcmEiLHRvb2x0
aXA6IkRvd25sb2FkIFBERi1maWxlICgiK28uYXBwLmNvbmZpZy5nPQpldCgic2NyZWVuc2hvdF91
cmwiKSsiKSIsdGl0bGU6IlNjcmVlbnNob3QiLG9uY2xpY2s6ZnVuY3Rpb24oKXtvLl93YWl0KG8u
Y2g9CmFydCxmdW5jdGlvbigpe3MuY3JlYXRlKG8udmlld3BvcnRfdmlldy4kZWwsby5hcHAuY29u
ZmlnLmdldCgic2NyZWVuc2hvdF91cj0KbCIpLG8uY2hhcnQuZ2V0KCJ0aXRsZSIpKX0pfX0pfX0p
LHRoaXMucG9ydGxldC5hcHBlbmQodGhpcy52aWV3cG9ydF92aWV3LiRlPQpsKSx0aGlzLnNldEVs
ZW1lbnQodGhpcy5wb3J0bGV0LiRlbCk7dmFyIG89M0R0aGlzO3RoaXMuY2hhcnQub24oImNoYW5n
ZTp0aXQ9CmxlIixmdW5jdGlvbigpe28uX3JlZnJlc2hUaXRsZSgpfSl9LHNob3c6ZnVuY3Rpb24o
KXt0aGlzLiRlbC5zaG93KCksJCh3aW5kbz0KdykudHJpZ2dlcigicmVzaXplIil9LGhpZGU6ZnVu
Y3Rpb24oKXt0aGlzLiRlbC5oaWRlKCl9LF9yZWZyZXNoVGl0bGU6ZnVuY3RpPQpvbigpe3ZhciBl
PTNEdGhpcy5jaGFydC5nZXQoInRpdGxlIik7dGhpcy5wb3J0bGV0LnRpdGxlKGUpfSxfd2FpdDpm
dW5jdGlvbig9CmUsdCl7aWYoZS5kZWZlcnJlZC5yZWFkeSgpKXQoKTtlbHNle3ZhciBuPTNEdGhp
czt0aGlzLmFwcC5tb2RhbC5zaG93KHt0aXRsZT0KOiJQbGVhc2Ugd2FpdCEiLGJvZHk6IllvdXIg
Y2hhcnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gUGxlYXNlIHdhaXQgPQphbmQgdHJ5
IGFnYWluLiIsYnV0dG9uczp7Q2xvc2U6ZnVuY3Rpb24oKXtuLmFwcC5tb2RhbC5oaWRlKCl9LFJl
dHJ5OmZ1bmN0aW89Cm4oKXtuLmFwcC5tb2RhbC5oaWRlKCksc2V0VGltZW91dChmdW5jdGlvbigp
e24uX3dhaXQoZSx0KX0sbi5hcHAuY29uZmlnLmdldD0KKCJxdWVyeV90aW1lb3V0IikpfX19KX19
fSl9KSxkZWZpbmUoIm12Yy91aS91aS10YWJzIixbInV0aWxzL3V0aWxzIl0sZnVuY3RpPQpvbihl
KXt2YXIgdD0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dGl0bGVfbmV3
OiIiLG9wZXJhdGlvbnM9CjpudWxsLG9ubmV3Om51bGx9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7
dGhpcy52aXNpYmxlPTNEITEsdGhpcy4kbmF2PTNEbnVsbD0KLHRoaXMuJGNvbnRlbnQ9M0RudWxs
LHRoaXMuZmlyc3RfdGFiPTNEbnVsbCx0aGlzLm9wdGlvbnM9M0RlLm1lcmdlKHQsdGhpcy5vPQpw
dGlvbnNEZWZhdWx0KTt2YXIgbj0zRCQodGhpcy5fdGVtcGxhdGUodGhpcy5vcHRpb25zKSk7dGhp
cy4kbmF2PTNEbi5maW5kKCI9Ci50YWItbmF2aWdhdGlvbiIpLHRoaXMuJGNvbnRlbnQ9M0RuLmZp
bmQoIi50YWItY29udGVudCIpLHRoaXMuc2V0RWxlbWVudChuKT0KLHRoaXMubGlzdD0zRHt9O3Zh
ciByPTNEdGhpczt0aGlzLm9wdGlvbnMub3BlcmF0aW9ucyYmJC5lYWNoKHRoaXMub3B0aW9ucy5v
PQpwZXJhdGlvbnMsZnVuY3Rpb24oZSx0KXt0LiRlbC5wcm9wKCJpZCIsZSksci4kbmF2LmZpbmQo
Ii5vcGVyYXRpb25zIikuYXBwZW49CmQodC4kZWwpfSk7aWYodGhpcy5vcHRpb25zLm9ubmV3KXt2
YXIgaT0zRCQodGhpcy5fdGVtcGxhdGVfdGFiX25ldyh0aGlzLm9wdD0KaW9ucykpO3RoaXMuJG5h
di5hcHBlbmQoaSksaS50b29sdGlwKHt0aXRsZToiQWRkIGEgbmV3IHRhYiIscGxhY2VtZW50OiJi
b3R0PQpvbSIsY29udGFpbmVyOnIuJGVsfSksaS5vbigiY2xpY2siLGZ1bmN0aW9uKGUpe2kudG9v
bHRpcCgiaGlkZSIpLHIub3B0aW9ucy49Cm9ubmV3KCl9KX19LGFkZDpmdW5jdGlvbihlKXt2YXIg
dD0zRHRoaXMsbj0zRGUuaWQscj0zRCQodGhpcy5fdGVtcGxhdGVfdGFiKD0KZSkpLGk9M0QkKHRo
aXMuX3RlbXBsYXRlX3RhYl9jb250ZW50KGUpKTt0aGlzLmxpc3Rbbl09M0RlLm9uZGVsPyEwOiEx
LHRoaXMuPQpvcHRpb25zLm9ubmV3P3RoaXMuJG5hdi5maW5kKCIjbmV3LXRhYiIpLmJlZm9yZShy
KTp0aGlzLiRuYXYuYXBwZW5kKHIpLGkuYXA9CnBlbmQoZS4kZWwpLHRoaXMuJGNvbnRlbnQuYXBw
ZW5kKGkpLF8uc2l6ZSh0aGlzLmxpc3QpPTNEPTNEMSYmKHIuYWRkQ2xhc3MoIj0KYWN0aXZlIiks
aS5hZGRDbGFzcygiYWN0aXZlIiksdGhpcy5maXJzdF90YWI9M0RuKTtpZihlLm9uZGVsKXt2YXIg
cz0zRHIuZmluPQpkKCIjZGVsZXRlIik7cy50b29sdGlwKHt0aXRsZToiRGVsZXRlIHRoaXMgdGFi
IixwbGFjZW1lbnQ6ImJvdHRvbSIsY29udGFpbmU9CnI6dC4kZWx9KSxzLm9uKCJjbGljayIsZnVu
Y3Rpb24oKXtyZXR1cm4gcy50b29sdGlwKCJkZXN0cm95IiksdC4kZWwuZmluZCgiLj0KdG9vbHRp
cCIpLnJlbW92ZSgpLGUub25kZWwoKSwhMX0pfXIub24oImNsaWNrIixmdW5jdGlvbihyKXtyLnBy
ZXZlbnREZWZhdWx0PQooKSxlLm9uY2xpY2s/ZS5vbmNsaWNrKCk6dC5zaG93KG4pfSl9LGRlbDpm
dW5jdGlvbihlKXt0aGlzLiRlbC5maW5kKCIjdGFiLSI9CitlKS5yZW1vdmUoKSx0aGlzLiRlbC5m
aW5kKCIjdGFiLWNvbnRlbnQtIitlKS5yZW1vdmUoKSx0aGlzLmZpcnN0X3RhYj0zRD0zRD0KZSYm
KHRoaXMuZmlyc3RfdGFiPTNEbnVsbCksdGhpcy5maXJzdF90YWIhPTNEbnVsbCYmdGhpcy5zaG93
KHRoaXMuZmlyc3RfdGFiPQopfSxkZWxSZW1vdmFibGU6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4g
dGhpcy5saXN0KXRoaXMubGlzdFtlXSYmdGhpcy5kZWwoZSk9Cn0sc2hvdzpmdW5jdGlvbihlKXt0
aGlzLiRlbC5mYWRlSW4oImZhc3QiKSx0aGlzLnZpc2libGU9M0QhMCxlJiYodGhpcy4kZWwuZj0K
aW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHRoaXMuJGVsLmZpbmQoIiN0YWIt
IitlKS5hZGRDbGFzcygiYWN0PQppdmUiKSx0aGlzLiRlbC5maW5kKCIjdGFiLWNvbnRlbnQtIitl
KS5hZGRDbGFzcygiYWN0aXZlIikpfSxoaWRlOmZ1bmN0aW9uKCk9Cnt0aGlzLiRlbC5mYWRlT3V0
KCJmYXN0IiksdGhpcy52aXNpYmxlPTNEITF9LGhpZGVPcGVyYXRpb246ZnVuY3Rpb24oZSl7dGhp
cz0KLiRuYXYuZmluZCgiIyIrZSkuaGlkZSgpfSxzaG93T3BlcmF0aW9uOmZ1bmN0aW9uKGUpe3Ro
aXMuJG5hdi5maW5kKCIjIitlKS5zPQpob3coKX0sc2V0T3BlcmF0aW9uOmZ1bmN0aW9uKGUsdCl7
dmFyIG49M0R0aGlzLiRuYXYuZmluZCgiIyIrZSk7bi5vZmYoImNsaWM9CmsiKSxuLm9uKCJjbGlj
ayIsdCl9LHRpdGxlOmZ1bmN0aW9uKGUsdCl7dmFyIG49M0R0aGlzLiRlbC5maW5kKCIjdGFiLXRp
dGxlLT0KdGV4dC0iK2UpO3JldHVybiB0JiZuLmh0bWwodCksbi5odG1sKCl9LF90ZW1wbGF0ZTpm
dW5jdGlvbihlKXtyZXR1cm4nPGRpdiBjPQpsYXNzPTNEInVpLXRhYnMgdGFiYmFibGUgdGFicy1s
ZWZ0Ij48dWwgaWQ9M0QidGFiLW5hdmlnYXRpb24iIGNsYXNzPTNEInRhYi09Cm5hdmlnYXRpb24g
bmF2IG5hdi10YWJzIj48ZGl2IGNsYXNzPTNEIm9wZXJhdGlvbnMiIHN0eWxlPTNEImZsb2F0OiBy
aWdodDsgbT0KYXJnaW4tYm90dG9tOiA0cHg7Ij48L2Rpdj48L3VsPjxkaXYgaWQ9M0QidGFiLWNv
bnRlbnQiIGNsYXNzPTNEInRhYi1jb250ZW50PQoiLz48L2Rpdj4nfSxfdGVtcGxhdGVfdGFiX25l
dzpmdW5jdGlvbihlKXtyZXR1cm4nPGxpIGlkPTNEIm5ldy10YWIiPjxhIGhyZWY9Cj0zRCJqYXZh
c2NyaXB0OnZvaWQoMCk7Ij48aSBjbGFzcz0zRCJ1aS10YWJzLWFkZCBmYSBmYS1wbHVzLWNpcmNs
ZSIvPicrZS50aT0KdGxlX25ldysiPC9hPiIrIjwvbGk+In0sX3RlbXBsYXRlX3RhYjpmdW5jdGlv
bihlKXt2YXIgdD0zRCc8bGkgaWQ9M0QidGFiLScrPQplLmlkKyciPicrJzxhIGlkPTNEInRhYi10
aXRsZS1saW5rLScrZS5pZCsnIiB0aXRsZT0zRCIiIGhyZWY9M0QiI3RhYi1jb250ZW49CnQtJytl
LmlkKyciIGRhdGEtb3JpZ2luYWwtdGl0bGU9M0QiIj4nKyc8c3BhbiBpZD0zRCJ0YWItdGl0bGUt
dGV4dC0nK2UuaWQrJz0KIj4nK2UudGl0bGUrIjwvc3Bhbj4iO3JldHVybiBlLm9uZGVsJiYodCs9
M0QnPGkgaWQ9M0QiZGVsZXRlIiBjbGFzcz0zRCJ1aS10PQphYnMtZGVsZXRlIGZhIGZhLW1pbnVz
LWNpcmNsZSIvPicpLHQrPTNEIjwvYT48L2xpPiIsdH0sX3RlbXBsYXRlX3RhYl9jb250ZW49CnQ6
ZnVuY3Rpb24oZSl7cmV0dXJuJzxkaXYgaWQ9M0QidGFiLWNvbnRlbnQtJytlLmlkKyciIGNsYXNz
PTNEInRhYi1wYW5lIi8+Jz0KfX0pO3JldHVybntWaWV3OnR9fSksZGVmaW5lKCJwbHVnaW4vbGli
cmFyeS91aS10YWJsZSIsWyJ1dGlscy91dGlscyJdLGZ1bmN0PQppb24oZSl7dmFyIHQ9M0RCYWNr
Ym9uZS5WaWV3LmV4dGVuZCh7cm93Om51bGwscm93X2NvdW50OjAsb3B0aW9uc0RlZmF1bHQ6e2M9
Cm9udGVudDoiTm8gY29udGVudCBhdmFpbGFibGUuIixvbmNoYW5nZTpudWxsLG9uZGJsY2xpY2s6
bnVsbCxvbmNvbmZpcm06bnVsbD0KLGNsczoiZ3JpZCJ9LGV2ZW50czp7Y2xpY2s6Il9vbmNsaWNr
IixkYmxjbGljazoiX29uZGJsY2xpY2sifSxpbml0aWFsaXplOmZ1PQpuY3Rpb24odCl7dGhpcy5v
cHRpb25zPTNEZS5tZXJnZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpO3ZhciBuPTNEJCh0aGlzLl90
ZW09CnBsYXRlKHQpKTt0aGlzLiR0aGVhZD0zRG4uZmluZCgidGhlYWQiKSx0aGlzLiR0Ym9keT0z
RG4uZmluZCgidGJvZHkiKSx0aGlzLj0KJHRtZXNzYWdlPTNEbi5maW5kKCJ0bWVzc2FnZSIpLHRo
aXMuc2V0RWxlbWVudChuKSx0aGlzLnJvdz0zRCQoIjx0cj48L3RyPiIpPQp9LGFkZEhlYWRlcjpm
dW5jdGlvbihlKXt2YXIgdD0zRCQoIjx0aD48L3RoPiIpO3QuYXBwZW5kKGUpLHRoaXMucm93LmFw
cGVuZCg9CnQpfSxhcHBlbmRIZWFkZXI6ZnVuY3Rpb24oKXt0aGlzLiR0aGVhZC5hcHBlbmQodGhp
cy5yb3cpLHRoaXMucm93PTNEJCgiPHRyPj0KPC90cj4iKX0sYWRkOmZ1bmN0aW9uKGUsdCxuKXt2
YXIgcj0zRCQoIjx0ZD48L3RkPiIpO3QmJnIuY3NzKCJ3aWR0aCIsdCksbiYmPQpyLmNzcygidGV4
dC1hbGlnbiIsbiksci5hcHBlbmQoZSksdGhpcy5yb3cuYXBwZW5kKHIpfSxhcHBlbmQ6ZnVuY3Rp
b24oZSl7dGg9CmlzLl9jb21taXQoZSl9LHByZXBlbmQ6ZnVuY3Rpb24oZSl7dGhpcy5fY29tbWl0
KGUsITApfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dT0Kcm4gdGhpcy4kZWwuZmluZCgiIyIrZSl9LGRl
bDpmdW5jdGlvbihlKXt2YXIgdD0zRHRoaXMuJHRib2R5LmZpbmQoIiMiK2UpO3QuPQpsZW5ndGg+
MCYmKHQucmVtb3ZlKCksdGhpcy5yb3dfY291bnQtLSx0aGlzLl9yZWZyZXNoKCkpfSxkZWxBbGw6
ZnVuY3Rpb24oKXs9CnRoaXMuJHRib2R5Lmh0bWwoIiIpLHRoaXMucm93X2NvdW50PTNEMCx0aGlz
Ll9yZWZyZXNoKCl9LHZhbHVlOmZ1bmN0aW9uKGUpez0KdGhpcy5iZWZvcmU9M0R0aGlzLiR0Ym9k
eS5maW5kKCIuY3VycmVudCIpLmF0dHIoImlkIiksZSE9M0Q9M0R1bmRlZmluZWQmJih0PQpoaXMu
JHRib2R5LmZpbmQoInRyIikucmVtb3ZlQ2xhc3MoImN1cnJlbnQiKSxlJiZ0aGlzLiR0Ym9keS5m
aW5kKCIjIitlKS5hZGQ9CkNsYXNzKCJjdXJyZW50IikpO3ZhciB0PTNEdGhpcy4kdGJvZHkuZmlu
ZCgiLmN1cnJlbnQiKS5hdHRyKCJpZCIpO3JldHVybiB0PQo9M0Q9M0Q9M0R1bmRlZmluZWQ/bnVs
bDoodCE9M0R0aGlzLmJlZm9yZSYmdGhpcy5vcHRpb25zLm9uY2hhbmdlJiZ0aGlzLm9wdGk9Cm9u
cy5vbmNoYW5nZShlKSx0KX0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0Ym9keS5maW5k
KCJ0ciIpLmxlbmd0aH0sXz0KY29tbWl0OmZ1bmN0aW9uKGUsdCl7dGhpcy5kZWwoZSksdGhpcy5y
b3cuYXR0cigiaWQiLGUpLHQ/dGhpcy4kdGJvZHkucHJlcGVuPQpkKHRoaXMucm93KTp0aGlzLiR0
Ym9keS5hcHBlbmQodGhpcy5yb3cpLHRoaXMucm93PTNEJCgiPHRyPjwvdHI+IiksdGhpcy5yb3c9
Cl9jb3VudCsrLHRoaXMuX3JlZnJlc2goKX0sX29uY2xpY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9M0R0
aGlzLnZhbHVlKCksbj0zRCQoZT0KLnRhcmdldCkuY2xvc2VzdCgidHIiKS5hdHRyKCJpZCIpO24h
PTNEIiImJm4mJnQhPTNEbiYmKHRoaXMub3B0aW9ucy5vbmNvbmZpPQpybT90aGlzLm9wdGlvbnMu
b25jb25maXJtKG4pOnRoaXMudmFsdWUobikpfSxfb25kYmxjbGljazpmdW5jdGlvbihlKXt2YXIg
dD0KPTNEdGhpcy52YWx1ZSgpO3QmJnRoaXMub3B0aW9ucy5vbmRibGNsaWNrJiZ0aGlzLm9wdGlv
bnMub25kYmxjbGljayh0KX0sX3JlPQpmcmVzaDpmdW5jdGlvbigpe3RoaXMucm93X2NvdW50PTNE
PTNEMD90aGlzLiR0bWVzc2FnZS5zaG93KCk6dGhpcy4kdG1lc3NhZ2U9Ci5oaWRlKCl9LF90ZW1w
bGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4nPGRpdj48dGFibGUgY2xhc3M9M0QiJytlLmNscysnIj4n
KyI8dD0KaGVhZD48L3RoZWFkPiIrJzx0Ym9keSBzdHlsZT0zRCJjdXJzb3I6IHBvaW50ZXI7Ij48
L3Rib2R5PicrIjwvdGFibGU+IisiPHRtPQplc3NhZ2U+IitlLmNvbnRlbnQrIjwvdG1lc3NhZ2U+
IisiPGRpdj4ifX0pO3JldHVybntWaWV3OnR9fSksZGVmaW5lKCJwbHVnaW49Ci92aWV3cy9ncm91
cCIsWyJwbHVnaW4vbGlicmFyeS91aS10YWJsZSIsInBsdWdpbi9saWJyYXJ5L3VpIiwidXRpbHMv
dXRpbHMiXT0KLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gQmFja2JvbmUuVmlldy5leHRlbmQoe2lu
aXRpYWxpemU6ZnVuY3Rpb24ocixpKXt0aGlzPQouYXBwPTNEcjt2YXIgcz0zRHRoaXM7dGhpcy5j
aGFydD0zRHRoaXMuYXBwLmNoYXJ0LHRoaXMuZ3JvdXA9M0RpLmdyb3VwLHRoaXM9Ci5ncm91cF9r
ZXk9M0RuZXcgdC5JbnB1dCh7cGxhY2Vob2xkZXI6IkRhdGEgbGFiZWwiLG9uY2hhbmdlOmZ1bmN0
aW9uKGUpe3MuZz0Kcm91cC5zZXQoImtleSIsZSl9fSksdGhpcy50YWJsZT0zRG5ldyBlLlZpZXco
e2NvbnRlbnQ6Ik5vIGRhdGEgY29sdW1uLiJ9KTt2PQphciBvPTNEJCgiPGRpdi8+Iik7by5hcHBl
bmQobi53cmFwKChuZXcgdC5MYWJlbCh7dGl0bGU6IlByb3ZpZGUgYSBsYWJlbDoifSk9CikuJGVs
KSksby5hcHBlbmQobi53cmFwKHRoaXMuZ3JvdXBfa2V5LiRlbCkpLG8uYXBwZW5kKG4ud3JhcCgo
bmV3IHQuTGFiZWwoez0KdGl0bGU6IlNlbGVjdCBjb2x1bW5zOiJ9KSkuJGVsKSksby5hcHBlbmQo
bi53cmFwKHRoaXMudGFibGUuJGVsKSksdGhpcy5zZXRFPQpsZW1lbnQobyk7dmFyIHM9M0R0aGlz
O3RoaXMuY2hhcnQub24oImNoYW5nZTpkYXRhc2V0X2lkIixmdW5jdGlvbigpe3MuX3JlZnI9CmVz
aFRhYmxlKCl9KSx0aGlzLmNoYXJ0Lm9uKCJjaGFuZ2U6dHlwZSIsZnVuY3Rpb24oKXtzLl9yZWZy
ZXNoVGFibGUoKX0pLHRoaT0Kcy5ncm91cC5vbigiY2hhbmdlOmtleSIsZnVuY3Rpb24oKXtzLl9y
ZWZyZXNoR3JvdXBLZXkoKX0pLHRoaXMuZ3JvdXAub24oImNoPQphbmdlIixmdW5jdGlvbigpe3Mu
X3JlZnJlc2hHcm91cCgpfSksdGhpcy5fcmVmcmVzaFRhYmxlKCksdGhpcy5fcmVmcmVzaEdyb3U9
CnBLZXkoKSx0aGlzLl9yZWZyZXNoR3JvdXAoKX0sX3JlZnJlc2hUYWJsZTpmdW5jdGlvbigpe3Zh
ciBlPTNEdGhpcy5jaGFydC5nZT0KdCgiZGF0YXNldF9pZCIpLG49M0R0aGlzLmNoYXJ0LmdldCgi
dHlwZSIpO2lmKCFlfHwhbilyZXR1cm47dmFyIHI9M0R0aGlzLGk9Cj0zRHRoaXMuYXBwLnR5cGVz
LmdldChuKTt0aGlzLnRhYmxlLmRlbEFsbCgpO3ZhciBzPTNEe307Zm9yKHZhciBvIGluIGkuY29s
dT0KbW5zKXt2YXIgdT0zRGkuY29sdW1uc1tvXTtpZighdSl7Y29uc29sZS5kZWJ1ZygiR3JvdXA6
Ol9yZWZyZXNoVGFibGUoKSAtIFNrPQppcHBpbmcgY29sdW1uIGRlZmluaXRpb24uIik7Y29udGlu
dWV9dmFyIGE9M0RuZXcgdC5TZWxlY3QuVmlldyh7aWQ6InNlbGVjdF89CiIrbyx3YWl0OiEwfSk7
dGhpcy50YWJsZS5hZGQodS50aXRsZSwiMjUlIiksdGhpcy50YWJsZS5hZGQoYS4kZWwpLHRoaXMu
dGFibD0KZS5hcHBlbmQobyksc1tvXT0zRGF9dGhpcy5jaGFydC5zdGF0ZSgid2FpdCIsIkxvYWRp
bmcgbWV0YWRhdGEuLi4iKTt2YXIgZj0KPTNEdGhpcy5jaGFydC5kZWZlcnJlZC5yZWdpc3Rlcigp
O3RoaXMuYXBwLmRhdGFzZXRzLnJlcXVlc3Qoe2lkOmV9LGZ1bmN0aW9uPQooZSl7Zm9yKHZhciB0
IGluIHMpci5fYWRkUm93KHQsZSxzLGkuY29sdW1uc1t0XSk7ci5jaGFydC5zdGF0ZSgib2siLCJN
ZXRhZGE9CnRhIGluaXRpYWxpemVkLi4uIiksci5jaGFydC5kZWZlcnJlZC5kb25lKGYpfSl9LF9h
ZGRSb3c6ZnVuY3Rpb24oZSx0LG4scil7dj0KYXIgaT0zRHRoaXMscz0zRHIuaXNfbGFiZWwsbz0z
RHIuaXNfYXV0byx1PTNEci5pc19udW1lcmljLGE9M0RyLmlzX3VuaXF1ZSxmPQo9M0RbXSxsPTNE
bltlXTtvJiZmLnB1c2goe2xhYmVsOiJDb2x1bW46IFJvdyBOdW1iZXIiLHZhbHVlOiJhdXRvIn0p
O3ZhciBjPQo9M0R0Lm1ldGFkYXRhX2NvbHVtbl90eXBlcztmb3IodmFyIGggaW4gYyl7dmFyIHA9
M0QhMTtjW2hdPTNEPTNEImludCJ8fGNbaF09Cj0zRD0zRCJmbG9hdCI/cD0zRHU6cD0zRHMscCYm
Zi5wdXNoKHtsYWJlbDoiQ29sdW1uOiAiKyhwYXJzZUludChoKSsxKSsiIFsiKz0KY1toXSsiXSIs
dmFsdWU6aH0pfWwudXBkYXRlKGYpO2lmKCFsLmV4aXN0cyh0aGlzLmdyb3VwLmdldChlKSkpe3Zh
ciBkPTNEbC5mPQppcnN0KCk7Y29uc29sZS5kZWJ1ZygnR3JvdXAoKTo6X2FkZFJvdygpIC0gU3dp
dGNoaW5nIG1vZGVsIHZhbHVlIGZyb20gIicrdGg9CmlzLmdyb3VwLmdldChlKSsnIiB0byAiJytk
KyciLicpLHRoaXMuZ3JvdXAuc2V0KGUsZCl9bC52YWx1ZSh0aGlzLmdyb3VwLmdldD0KKGUpKSxs
LnNldE9uQ2hhbmdlKGZ1bmN0aW9uKHQpe2kuZ3JvdXAuc2V0KGUsdCksaS5jaGFydC5zZXQoIm1v
ZGlmaWVkIiwhMCl9PQopLGwuc2hvdygpfSxfcmVmcmVzaEdyb3VwOmZ1bmN0aW9uKCl7dGhpcy5n
cm91cC5zZXQoImRhdGUiLG4udGltZSgpKX0sX3JlZnI9CmVzaEdyb3VwS2V5OmZ1bmN0aW9uKCl7
dmFyIGU9M0R0aGlzLmdyb3VwLmdldCgia2V5Iik7ZT0zRD0zRD0zRHVuZGVmaW5lZCYmKD0KZT0z
RCIiKSx0aGlzLmdyb3VwX2tleS52YWx1ZShlKX19KX0pLGRlZmluZSgicGx1Z2luL2xpYnJhcnkv
dWktdGFibGUtZm9ybSIsPQpbInBsdWdpbi9saWJyYXJ5L3VpLXRhYmxlIiwicGx1Z2luL2xpYnJh
cnkvdWkiLCJ1dGlscy91dGlscyJdLGZ1bmN0aW9uKGUsdCw9Cm4pe3ZhciByPTNEQmFja2JvbmUu
Vmlldy5leHRlbmQoe29wdGlvbnNEZWZhdWx0Ont0aXRsZToiIixjb250ZW50OiIiLG1vZGU6Ij0K
In0sbGlzdDpbXSxpbml0aWFsaXplOmZ1bmN0aW9uKHIpe3RoaXMudGFibGVfdGl0bGU9M0RuZXcg
dC5MYWJlbCh7dGl0bGU6ci50PQppdGxlfSksdGhpcy50YWJsZT0zRG5ldyBlLlZpZXcoe2NvbnRl
bnQ6ci5jb250ZW50fSk7dmFyIGk9M0QkKCI8ZGl2Lz4iKTtpLmE9CnBwZW5kKG4ud3JhcCh0aGlz
LnRhYmxlX3RpdGxlLiRlbCkpLGkuYXBwZW5kKG4ud3JhcCh0aGlzLnRhYmxlLiRlbCkpLHRoaXMu
cz0KZXRFbGVtZW50KGkpfSx0aXRsZTpmdW5jdGlvbihlKXt0aGlzLnRhYmxlX3RpdGxlLnRpdGxl
KGUpfSx1cGRhdGU6ZnVuY3Rpb24oPQplLHQpe3RoaXMudGFibGUuZGVsQWxsKCksdGhpcy5saXN0
PTNEW107Zm9yKHZhciBuIGluIGUpdGhpcy5fYWRkKG4sZVtuXSx0KTs9CmZvcih2YXIgbiBpbiB0
aGlzLmxpc3QpdGhpcy5saXN0W25dLnRyaWdnZXIoImNoYW5nZSIpfSxfYWRkOmZ1bmN0aW9uKGUs
bixyKT0Ke3ZhciBpPTNEdGhpcyxzPTNEbnVsbCxvPTNEbi50eXBlO3N3aXRjaChvKXtjYXNlInRl
eHQiOnM9M0RuZXcgdC5JbnB1dCh7aWQ6PQoiZmllbGRfIitlLHBsYWNlaG9sZGVyOm4ucGxhY2Vo
b2xkZXIsdmFsdWU6ci5nZXQoZSksb25jaGFuZ2U6ZnVuY3Rpb24odCl7ci49CnNldChlLHQpfX0p
O2JyZWFrO2Nhc2Uic2VsZWN0IjpzPTNEbmV3IHQuU2VsZWN0LlZpZXcoe2lkOiJmaWVsZF8iK2Us
ZGF0YTpuLj0KZGF0YSx2YWx1ZTpyLmdldChlKSxvbmNoYW5nZTpmdW5jdGlvbih0KXtyLnNldChl
LHQpO3ZhciBzPTNEXy5maW5kV2hlcmUobi5kPQphdGEse3ZhbHVlOnR9KTtpZihzKXtmb3IodmFy
IG8gaW4gcy5zaG93KXt2YXIgdT0zRHMuc2hvd1tvXTtpLnRhYmxlLmdldCh1KS49CnNob3coKX1m
b3IodmFyIG8gaW4gcy5oaWRlKXt2YXIgdT0zRHMuaGlkZVtvXTtpLnRhYmxlLmdldCh1KS5oaWRl
KCl9fX19KTticj0KZWFrO2Nhc2Uic2VwYXJhdG9yIjpzPTNEJCgiPGRpdi8+Iik7YnJlYWs7ZGVm
YXVsdDpjb25zb2xlLmxvZygidWktdGFibGUtZm9yPQptOl9hZGQiLCJVbmtub3duIHNldHRpbmcg
dHlwZSAoIituLnR5cGUrIikiKTtyZXR1cm59aWYobyE9M0Qic2VwYXJhdG9yIil7ci49CmdldChl
KXx8ci5zZXQoZSxuLmluaXQpLHMudmFsdWUoci5nZXQoZSkpLHRoaXMubGlzdFtlXT0zRHM7dmFy
IHU9M0QkKCI8ZGl2Lz0KPiIpO3UuYXBwZW5kKHMuJGVsKSx1LmFwcGVuZCgnPGRpdiBjbGFzcz0z
RCJ0b29sUGFyYW1IZWxwIiAgc3R5bGU9M0QiZm9udC1zPQppemU6IDAuOWVtOyI+JytuLmluZm8r
IjwvZGl2PiIpLHRoaXMudGFibGUuYWRkKCc8c3BhbiBzdHlsZT0zRCJ3aGl0ZS1zcGFjZTo9CiBu
b3dyYXA7Ij4nK24udGl0bGUrIjwvc3Bhbj4iLCIyNSUiKSx0aGlzLnRhYmxlLmFkZCh1KX1lbHNl
IHRoaXMudGFibGUuYWRkKD0KJzxoNiBzdHlsZT0zRCJ3aGl0ZS1zcGFjZTogbm93cmFwOyI+Jytu
LnRpdGxlKyI6PGg2Lz4iKSx0aGlzLnRhYmxlLmFkZCgkKCI8PQpkaXYvPiIpKTt0aGlzLnRhYmxl
LmFwcGVuZChlKX19KTtyZXR1cm57VmlldzpyfX0pLGRlZmluZSgicGx1Z2luL3ZpZXdzL3NldHQ9
CmluZ3MiLFsicGx1Z2luL2xpYnJhcnkvdWkiLCJwbHVnaW4vbGlicmFyeS91aS10YWJsZS1mb3Jt
IiwidXRpbHMvdXRpbHMiXSxmdT0KbmN0aW9uKGUsdCxuKXtyZXR1cm4gQmFja2JvbmUuVmlldy5l
eHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oZSxuKXt0aGlzLmFwPQpwPTNEZTt2YXIgcj0zRHRo
aXM7dGhpcy5jaGFydD0zRHRoaXMuYXBwLmNoYXJ0LHRoaXMuZm9ybT0zRG5ldyB0LlZpZXcoe3Rp
dGw9CmU6IkNoYXJ0IG9wdGlvbnM6Iixjb250ZW50OiJUaGlzIGNoYXJ0IHR5cGUgZG9lcyBub3Qg
cHJvdmlkZSBhbnkgb3B0aW9ucy4ifT0KKSx0aGlzLnNldEVsZW1lbnQodGhpcy5mb3JtLiRlbCk7
dmFyIHI9M0R0aGlzO3RoaXMuY2hhcnQub24oImNoYW5nZSIsZnVuY3RpPQpvbigpe3IuX3JlZnJl
c2goKX0pfSxfcmVmcmVzaDpmdW5jdGlvbigpe3ZhciBlPTNEdGhpcy5jaGFydC5nZXQoInR5cGUi
KTtpZig9CiFlKXJldHVybjt2YXIgdD0zRHRoaXMuYXBwLnR5cGVzLmdldChlKTt0aGlzLmZvcm0u
dGl0bGUodC5jYXRlZ29yeSsiIC0gIit0Lj0KdGl0bGUrIjoiKSx0aGlzLmZvcm0udXBkYXRlKHQu
c2V0dGluZ3MsdGhpcy5jaGFydC5zZXR0aW5ncyl9fSl9KSxkZWZpbmUoInBsPQp1Z2luL3ZpZXdz
L3R5cGVzIixbInV0aWxzL3V0aWxzIiwicGx1Z2luL2xpYnJhcnkvdWkiXSxmdW5jdGlvbihlLHQp
e3JldHVybiA9CkJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7b25jaGFuZ2U6
bnVsbCxvbmRibGNsaWNrOm51bGx9LGV2ZW50cz0KOntjbGljazoiX29uY2xpY2siLGRibGNsaWNr
OiJfb25kYmxjbGljayJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxuKXt2YXIgcj0KPTNEdGhpczt0
aGlzLmFwcD0zRHQsdGhpcy5vcHRpb25zPTNEZS5tZXJnZShuLHRoaXMub3B0aW9uc0RlZmF1bHQp
O3ZhciBpPTNEPQokKCc8ZGl2IGNsYXNzPTNEImNoYXJ0cy1ncmlkIi8+Jyk7dGhpcy5zZXRFbGVt
ZW50KGkpO3ZhciBzPTNEe30sbz0zRHQudHlwZXM9Ci5hdHRyaWJ1dGVzO2Zvcih2YXIgdSBpbiBv
KXt2YXIgYT0zRG9bdV0sZj0zRGEuY2F0ZWdvcnk7c1tmXXx8KHNbZl09M0R7fSkscz0KW2ZdW3Vd
PTNEYX1mb3IodmFyIGYgaW4gcyl7dmFyIGk9M0QkKCc8ZGl2IHN0eWxlPTNEImNsZWFyOiBib3Ro
OyIvPicpO2kuYXBwPQplbmQoZS53cmFwKHRoaXMuX3RlbXBsYXRlX2hlYWRlcih7dGl0bGU6Zn0p
KSk7Zm9yKHZhciB1IGluIHNbZl0pe3ZhciBhPTNEc1s9CmZdW3VdO2kuYXBwZW5kKGUud3JhcCh0
aGlzLl90ZW1wbGF0ZV9pdGVtKHtpZDp1LHRpdGxlOmEudGl0bGUsdXJsOmNvbmZpZy5hcD0KcF9y
b290KyJjaGFydHMvIityLmFwcC5jaGFydFBhdGgodSkrIi9sb2dvLnBuZyJ9KSkpfXRoaXMuJGVs
LmFwcGVuZChlLndyYXAoPQppKSl9fSx2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0zRHRoaXMuJGVs
LmZpbmQoIi5jdXJyZW50IikuYXR0cigiaWQiKTtlIT0zRD0KPTNEdW5kZWZpbmVkJiYodGhpcy4k
ZWwuZmluZCgiLmN1cnJlbnQiKS5yZW1vdmVDbGFzcygiY3VycmVudCIpLHRoaXMuJGVsLmZpPQpu
ZCgiIyIrZSkuYWRkQ2xhc3MoImN1cnJlbnQiKSk7dmFyIG49M0R0aGlzLiRlbC5maW5kKCIuY3Vy
cmVudCIpLmF0dHIoImlkIik9CjtyZXR1cm4gbj0zRD0zRD0zRHVuZGVmaW5lZD9udWxsOihuIT0z
RHQmJnRoaXMub3B0aW9ucy5vbmNoYW5nZSYmdGhpcy5vcHRpbz0KbnMub25jaGFuZ2UoZSksbil9
LF9vbmNsaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PTNEdGhpcy52YWx1ZSgpLG49M0QkKGUudGFyZ2V0
PQopLmNsb3Nlc3QoIi5pdGVtIikuYXR0cigiaWQiKTtuIT0zRCIiJiZuJiZ0IT0zRG4mJnRoaXMu
dmFsdWUobil9LF9vbmRibGNsaWM9Cms6ZnVuY3Rpb24oZSl7dmFyIHQ9M0R0aGlzLnZhbHVlKCk7
dCYmdGhpcy5vcHRpb25zLm9uZGJsY2xpY2smJnRoaXMub3B0aW9ucz0KLm9uZGJsY2xpY2sodCl9
LF90ZW1wbGF0ZV9oZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuJzxkaXYgY2xhc3M9M0QiaGVhZGVy
Ij4mPQpidWxsOyAnK2UudGl0bGUrIjxkaXY+In0sX3RlbXBsYXRlX2l0ZW06ZnVuY3Rpb24oZSl7
cmV0dXJuJzxkaXYgaWQ9M0QiJytlLmk9CmQrJyIgY2xhc3M9M0QiaXRlbSI+JysnPGltZyBjbGFz
cz0zRCJpbWFnZSIgc3JjPTNEIicrZS51cmwrJyI+JysnPGRpdiBjbGFzcz0KPTNEInRpdGxlIj4n
K2UudGl0bGUrIjwvZGl2PiIrIjxkaXY+In19KX0pLGRlZmluZSgicGx1Z2luL3ZpZXdzL2VkaXRv
ciIsWyJtPQp2Yy91aS91aS10YWJzIiwicGx1Z2luL2xpYnJhcnkvdWkiLCJtdmMvdWkvdWktcG9y
dGxldCIsInV0aWxzL3V0aWxzIiwicGx1Z2k9Cm4vbW9kZWxzL2NoYXJ0IiwicGx1Z2luL21vZGVs
cy9ncm91cCIsInBsdWdpbi92aWV3cy9ncm91cCIsInBsdWdpbi92aWV3cy9zZT0KdHRpbmdzIiwi
cGx1Z2luL3ZpZXdzL3R5cGVzIl0sZnVuY3Rpb24oZSx0LG4scixpLHMsbyx1LGEpe3JldHVybiBC
YWNrYm9uZS5WPQppZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7aGVhZGVyOiEwLGNvbnRlbnQ6
Ik5vIGNvbnRlbnQgYXZhaWxhYmxlLiJ9LGluaXQ9CmlhbGl6ZTpmdW5jdGlvbihpLHMpe3ZhciBv
PTNEdGhpczt0aGlzLmFwcD0zRGksdGhpcy5jaGFydD0zRHRoaXMuYXBwLmNoYXJ0LD0KdGhpcy5v
cHRpb25zPTNEci5tZXJnZShzLHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMucG9ydGxldD0zRG5l
dyBuLlZpZXcoe2ljPQpvbjoiZmEtYmFyLWNoYXJ0LW8iLHRpdGxlOiJFZGl0b3IiLG9wZXJhdGlv
bnM6e3NhdmU6bmV3IHQuQnV0dG9uSWNvbih7aWNvbjo9CiJmYS1zYXZlIix0b29sdGlwOiJEcmF3
IENoYXJ0Iix0aXRsZToiRHJhdyIsb25jbGljazpmdW5jdGlvbigpe28uYXBwLmdvKCJ2aT0KZXdl
ciIpLG8uX3NhdmVDaGFydCgpfX0pLGJhY2s6bmV3IHQuQnV0dG9uSWNvbih7aWNvbjoiZmEtY2Fy
ZXQtbGVmdCIsdG9vbHRpPQpwOiJSZXR1cm4gdG8gVmlld2VyIix0aXRsZToiUmV0dXJuIixvbmNs
aWNrOmZ1bmN0aW9uKCl7by5hcHAuZ28oInZpZXdlciIpLG89Ci5hcHAuc3RvcmFnZS5sb2FkKCl9
fSl9fSksdGhpcy50eXBlcz0zRG5ldyBhKGkse29uY2hhbmdlOmZ1bmN0aW9uKGUpe28uY2hhcj0K
dC5zZXR0aW5ncy5jbGVhcigpLG8uY2hhcnQuc2V0KHt0eXBlOmV9KSxvLmNoYXJ0LnNldCgibW9k
aWZpZWQiLCEwKX0sb25kYmxjPQpsaWNrOmZ1bmN0aW9uKGUpe28uYXBwLmdvKCJ2aWV3ZXIiKSxv
Ll9zYXZlQ2hhcnQoKX19KSx0aGlzLnRhYnM9M0RuZXcgZS5WaWU9Cncoe3RpdGxlX25ldzoiQWRk
IERhdGEiLG9ubmV3OmZ1bmN0aW9uKCl7dmFyIGU9M0RvLl9hZGRHcm91cE1vZGVsKCk7by50YWJz
Lj0Kc2hvdyhlLmlkKX19KSx0aGlzLnRpdGxlPTNEbmV3IHQuSW5wdXQoe3BsYWNlaG9sZGVyOiJD
aGFydCB0aXRsZSIsb25jaGFuZ2U6PQpmdW5jdGlvbigpe28uY2hhcnQuc2V0KCJ0aXRsZSIsby50
aXRsZS52YWx1ZSgpKX19KTt2YXIgZj0zRCQoIjxkaXYvPiIpO2YuYXA9CnBlbmQoci53cmFwKChu
ZXcgdC5MYWJlbCh7dGl0bGU6IlByb3ZpZGUgYSBjaGFydCB0aXRsZToifSkpLiRlbCkpLGYuYXBw
ZW5kKD0Kci53cmFwKHRoaXMudGl0bGUuJGVsKSksZi5hcHBlbmQoci53cmFwKChuZXcgdC5MYWJl
bCh7dGl0bGU6IlNlbGVjdCBhIGNoYXJ0PQogdHlwZToifSkpLiRlbCkpLGYuYXBwZW5kKHIud3Jh
cCh0aGlzLnR5cGVzLiRlbCkpLHRoaXMudGFicy5hZGQoe2lkOiJtYWluIiw9CnRpdGxlOiJTdGFy
dCIsJGVsOmZ9KSx0aGlzLnNldHRpbmdzPTNEbmV3IHUodGhpcy5hcHApLHRoaXMudGFicy5hZGQo
e2lkOiJzZT0KdHRpbmdzIix0aXRsZToiQ29uZmlndXJhdGlvbiIsJGVsOnRoaXMuc2V0dGluZ3Mu
JGVsfSksdGhpcy5wb3J0bGV0LmFwcGVuZCh0PQpoaXMudGFicy4kZWwpLHRoaXMuc2V0RWxlbWVu
dCh0aGlzLnBvcnRsZXQuJGVsKSx0aGlzLnRhYnMuaGlkZU9wZXJhdGlvbigiYmE9CmNrIik7dmFy
IG89M0R0aGlzO3RoaXMuY2hhcnQub24oImNoYW5nZTp0aXRsZSIsZnVuY3Rpb24oZSl7by5fcmVm
cmVzaFRpdGxlKD0KKX0pLHRoaXMuY2hhcnQub24oImNoYW5nZTp0eXBlIixmdW5jdGlvbihlKXtv
LnR5cGVzLnZhbHVlKGUuZ2V0KCJ0eXBlIikpfSksPQp0aGlzLmNoYXJ0Lm9uKCJyZXNldCIsZnVu
Y3Rpb24oZSl7by5fcmVzZXRDaGFydCgpfSksdGhpcy5hcHAuY2hhcnQub24oInJlZHI9CmF3Iixm
dW5jdGlvbihlKXtvLnBvcnRsZXQuc2hvd09wZXJhdGlvbigiYmFjayIpfSksdGhpcy5hcHAuY2hh
cnQuZ3JvdXBzLm9uKD0KImFkZCIsZnVuY3Rpb24oZSl7by5fYWRkR3JvdXAoZSl9KSx0aGlzLmFw
cC5jaGFydC5ncm91cHMub24oInJlbW92ZSIsZnVuY3RpPQpvbihlKXtvLl9yZW1vdmVHcm91cChl
KX0pLHRoaXMuYXBwLmNoYXJ0Lmdyb3Vwcy5vbigicmVzZXQiLGZ1bmN0aW9uKGUpe28uX3I9CmVt
b3ZlQWxsR3JvdXBzKCl9KSx0aGlzLmFwcC5jaGFydC5ncm91cHMub24oImNoYW5nZTprZXkiLGZ1
bmN0aW9uKGUpe28uX3JlZj0KcmVzaEdyb3VwS2V5KCl9KSx0aGlzLl9yZXNldENoYXJ0KCl9LHNo
b3c6ZnVuY3Rpb24oKXt0aGlzLiRlbC5zaG93KCl9LGhpZGU6PQpmdW5jdGlvbigpe3RoaXMuJGVs
LmhpZGUoKX0sX3JlZnJlc2hUaXRsZTpmdW5jdGlvbigpe3ZhciBlPTNEdGhpcy5jaGFydC5nZXQ9
CigidGl0bGUiKTt0aGlzLnBvcnRsZXQudGl0bGUoZSksdGhpcy50aXRsZS52YWx1ZShlKX0sX3Jl
ZnJlc2hHcm91cEtleTpmdW5jdD0KaW9uKCl7dmFyIGU9M0R0aGlzLHQ9M0QwO3RoaXMuY2hhcnQu
Z3JvdXBzLmVhY2goZnVuY3Rpb24obil7dmFyIHI9M0RuLmdldCgiPQprZXkiLCIiKTtyPTNEPTNE
IiImJihyPTNEIkNoYXJ0IGRhdGEiKSxlLnRhYnMudGl0bGUobi5pZCwrK3QrIjogIityKX0pfSxf
YWQ9CmRHcm91cE1vZGVsOmZ1bmN0aW9uKCl7dmFyIGU9M0RuZXcgcyh7aWQ6ci51dWlkKCl9KTty
ZXR1cm4gdGhpcy5jaGFydC5ncm91cD0Kcy5hZGQoZSksZX0sX2FkZEdyb3VwOmZ1bmN0aW9uKGUp
e3ZhciB0PTNEdGhpcyxuPTNEbmV3IG8odGhpcy5hcHAse2dyb3VwOmV9PQopO3RoaXMudGFicy5h
ZGQoe2lkOmUuaWQsJGVsOm4uJGVsLG9uZGVsOmZ1bmN0aW9uKCl7dC5jaGFydC5ncm91cHMucmVt
b3ZlKGU9Ci5pZCl9fSksdGhpcy5fcmVmcmVzaEdyb3VwS2V5KCl9LF9yZW1vdmVHcm91cDpmdW5j
dGlvbihlKXt0aGlzLnRhYnMuZGVsKGUuaT0KZCksdGhpcy5fcmVmcmVzaEdyb3VwS2V5KCksdGhp
cy5jaGFydC5zZXQoIm1vZGlmaWVkIiwhMCl9LF9yZW1vdmVBbGxHcm91cHM6PQpmdW5jdGlvbihl
KXt0aGlzLnRhYnMuZGVsUmVtb3ZhYmxlKCl9LF9yZXNldENoYXJ0OmZ1bmN0aW9uKCl7dGhpcy5j
aGFydC5zZXQ9CigiaWQiLHIudXVpZCgpKSx0aGlzLmNoYXJ0LnNldCgidHlwZSIsIm52ZDNfYmFy
IiksdGhpcy5jaGFydC5zZXQoImRhdGFzZXRfaT0KZCIsdGhpcy5hcHAub3B0aW9ucy5jb25maWcu
ZGF0YXNldF9pZCksdGhpcy5jaGFydC5zZXQoInRpdGxlIiwiTmV3IENoYXJ0IiksPQp0aGlzLnBv
cnRsZXQuaGlkZU9wZXJhdGlvbigiYmFjayIpfSxfc2F2ZUNoYXJ0OmZ1bmN0aW9uKCl7dGhpcy5j
aGFydC5zZXQoe3Q9CnlwZTp0aGlzLnR5cGVzLnZhbHVlKCksdGl0bGU6dGhpcy50aXRsZS52YWx1
ZSgpLGRhdGU6ci50aW1lKCl9KSx0aGlzLmNoYXJ0Lj0KZ3JvdXBzLmxlbmd0aD0zRD0zRDAmJnRo
aXMuX2FkZEdyb3VwTW9kZWwoKTt2YXIgZT0zRHRoaXM7dGhpcy5jaGFydC5kZWZlcnJlPQpkLmV4
ZWN1dGUoZnVuY3Rpb24oKXtlLmFwcC5zdG9yYWdlLnNhdmUoKSxlLmNoYXJ0LnRyaWdnZXIoInJl
ZHJhdyIpfSl9fSl9KSw9CmRlZmluZSgicGx1Z2luL21vZGVscy9jb25maWciLFtdLGZ1bmN0aW9u
KCl7cmV0dXJuIEJhY2tib25lLk1vZGVsLmV4dGVuZCh7ZD0KZWZhdWx0czp7cXVlcnlfbGltaXQ6
MWUzLHF1ZXJ5X3RpbWVvdXQ6MTAwLHNjcmVlbnNob3RfdXJsOiJodHRwOi8vZXhwb3J0LmhpPQpn
aGNoYXJ0cy5jb20vIn19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9udmQzL2NvbW1vbi9jb25m
aWciLFtdLGZ1bmN0aW9uKCk9CntyZXR1cm57dGl0bGU6IiIsY2F0ZWdvcnk6IiIsbGlicmFyeToi
bnZkMy5qcyIsdGFnOiJzdmciLHNldHRpbmdzOntzZXBhcmF0bz0Kcl9sYWJlbDp7dGl0bGU6Ilgg
YXhpcyIsdHlwZToic2VwYXJhdG9yIn0seF9heGlzX2xhYmVsOnt0aXRsZToiQXhpcyBsYWJlbCIs
PQppbmZvOiJQcm92aWRlIGEgbGFiZWwgZm9yIHRoZSBheGlzLiIsdHlwZToidGV4dCIsaW5pdDoi
WC1heGlzIixwbGFjZWhvbGRlcjo9CiJBeGlzIGxhYmVsIn0seF9heGlzX3R5cGU6e3RpdGxlOiJB
eGlzIHZhbHVlIHR5cGUiLGluZm86IlNlbGVjdCB0aGUgdmFsdWUgdD0KeXBlIG9mIHRoZSBheGlz
LiIsdHlwZToic2VsZWN0Iixpbml0OiJhdXRvIixkYXRhOlt7bGFiZWw6Ii0tIERvIG5vdCBzaG93
IHZhPQpsdWVzIC0tIix2YWx1ZToiaGlkZSIsaGlkZTpbInhfYXhpc190aWNrIl19LHtsYWJlbDoi
QXV0byIsdmFsdWU6ImF1dG8iLGhpZGU9CjpbInhfYXhpc190aWNrIl19LHtsYWJlbDoiRmxvYXQi
LHZhbHVlOiJmIixzaG93OlsieF9heGlzX3RpY2siXX0se2xhYmVsOiJFeD0KcG9uZW50Iix2YWx1
ZToiZSIsc2hvdzpbInhfYXhpc190aWNrIl19LHtsYWJlbDoiSW50ZWdlciIsdmFsdWU6ImQiLGhp
ZGU6WyJ4PQpfYXhpc190aWNrIl19LHtsYWJlbDoiUGVyY2VudGFnZSIsdmFsdWU6InAiLHNob3c6
WyJ4X2F4aXNfdGljayJdfSx7bGFiZWw6IlI9Cm91bmRlZCIsdmFsdWU6InIiLHNob3c6WyJ4X2F4
aXNfdGljayJdfSx7bGFiZWw6IlNJLXByZWZpeCIsdmFsdWU6InMiLHNob3c6Wz0KInhfYXhpc190
aWNrIl19XX0seF9heGlzX3RpY2s6e3RpdGxlOiJBeGlzIHRpY2sgZm9ybWF0IixpbmZvOiJTZWxl
Y3QgdGhlIHRpPQpjayBmb3JtYXQgZm9yIHRoZSBheGlzLiIsdHlwZToic2VsZWN0Iixpbml0OiIu
MSIsZGF0YTpbe2xhYmVsOiIwLjAwMDAxIix2YWw9CnVlOiIuNSJ9LHtsYWJlbDoiMC4wMDAxIix2
YWx1ZToiLjQifSx7bGFiZWw6IjAuMDAxIix2YWx1ZToiLjMifSx7bGFiZWw6IjAuMD0KMSIsdmFs
dWU6Ii4yIn0se2xhYmVsOiIwLjEiLHZhbHVlOiIuMSJ9LHtsYWJlbDoiMSIsdmFsdWU6IjEifV19
LHNlcGFyYXRvcl90PQppY2s6e3RpdGxlOiJZIGF4aXMiLHR5cGU6InNlcGFyYXRvciJ9LHlfYXhp
c19sYWJlbDp7dGl0bGU6IkF4aXMgbGFiZWwiLGluZm89CjoiUHJvdmlkZSBhIGxhYmVsIGZvciB0
aGUgYXhpcy4iLHR5cGU6InRleHQiLGluaXQ6IlktYXhpcyIscGxhY2Vob2xkZXI6IkF4aT0KcyBs
YWJlbCJ9LHlfYXhpc190eXBlOnt0aXRsZToiQXhpcyB2YWx1ZSB0eXBlIixpbmZvOiJTZWxlY3Qg
dGhlIHZhbHVlIHR5cGUgPQpvZiB0aGUgYXhpcy4iLHR5cGU6InNlbGVjdCIsaW5pdDoiYXV0byIs
ZGF0YTpbe2xhYmVsOiItLSBEbyBub3Qgc2hvdyB2YWx1ZXM9CiAtLSIsdmFsdWU6ImhpZGUiLGhp
ZGU6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IkF1dG8iLHZhbHVlOiJhdXRvIixoaWRlOlsieT0K
X2F4aXNfdGljayJdfSx7bGFiZWw6IkZsb2F0Iix2YWx1ZToiZiIsc2hvdzpbInlfYXhpc190aWNr
Il19LHtsYWJlbDoiRXhwb25lPQpudCIsdmFsdWU6ImUiLHNob3c6WyJ5X2F4aXNfdGljayJdfSx7
bGFiZWw6IkludGVnZXIiLHZhbHVlOiJkIixoaWRlOlsieV9heGk9CnNfdGljayJdfSx7bGFiZWw6
IlBlcmNlbnRhZ2UiLHZhbHVlOiJwIixzaG93OlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJSb3Vu
ZD0KZWQiLHZhbHVlOiJyIixzaG93OlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJTSS1wcmVmaXgi
LHZhbHVlOiJzIixzaG93OlsieV9hPQp4aXNfdGljayJdfV19LHlfYXhpc190aWNrOnt0aXRsZToi
QXhpcyB0aWNrIGZvcm1hdCIsaW5mbzoiU2VsZWN0IHRoZSB0aWNrIGY9Cm9ybWF0IGZvciB0aGUg
YXhpcy4iLHR5cGU6InNlbGVjdCIsaW5pdDoiLjEiLGRhdGE6W3tsYWJlbDoiMC4wMDAwMSIsdmFs
dWU6Ij0KLjUifSx7bGFiZWw6IjAuMDAwMSIsdmFsdWU6Ii40In0se2xhYmVsOiIwLjAwMSIsdmFs
dWU6Ii4zIn0se2xhYmVsOiIwLjAxIix2PQphbHVlOiIuMiJ9LHtsYWJlbDoiMC4xIix2YWx1ZToi
LjEifSx7bGFiZWw6IjEiLHZhbHVlOiIxIn1dfSxzZXBhcmF0b3JfbGVnZW49CmQ6e3RpdGxlOiJP
dGhlcnMiLHR5cGU6InNlcGFyYXRvciJ9LHNob3dfbGVnZW5kOnt0aXRsZToiU2hvdyBsZWdlbmQi
LGluZm86Ij0KV291bGQgeW91IGxpa2UgdG8gYWRkIGEgbGVnZW5kPyIsdHlwZToic2VsZWN0Iixp
bml0OiJ0cnVlIixkYXRhOlt7bGFiZWw6IlllPQpzIix2YWx1ZToidHJ1ZSJ9LHtsYWJlbDoiTm8i
LHZhbHVlOiJmYWxzZSJ9XX19fX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9udmQ9CjMvYmFyL2Nv
bmZpZyIsWyJwbHVnaW4vY2hhcnRzL252ZDMvY29tbW9uL2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3Jl
dHVybiAkLmV4dD0KZW5kKCEwLHt9LGUse3RpdGxlOiJSZWd1bGFyIixjYXRlZ29yeToiQmFyIGRp
YWdyYW1zIixjb2x1bW5zOnt4Ont0aXRsZToiVmFsPQp1ZXMgZm9yIHgtYXhpcyIsaXNfbGFiZWw6
ITAsaXNfYXV0bzohMH0seTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpc19udW09CmVyaWM6
ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL252ZDMvYmFyX3N0YWNrZWQvY29uZmlnIixb
InBsdWdpbi9jaGFydD0Kcy9udmQzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4g
JC5leHRlbmQoITAse30sZSx7dGl0bGU6IlN0YWNrZWQiPQosY2F0ZWdvcnk6IkJhciBkaWFncmFt
cyIsY29sdW1uczp7eTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpc19udW1lcmljOiE9CjB9
fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL252ZDMvYmFyX2hvcml6b250YWwvY29uZmlnIixb
InBsdWdpbi9jaGFydHMvbj0KdmQzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4g
JC5leHRlbmQoITAse30sZSx7dGl0bGU6Ikhvcml6b250YWwiPQosY2F0ZWdvcnk6IkJhciBkaWFn
cmFtcyIsY29sdW1uczp7eDp7dGl0bGU6IlZhbHVlcyBmb3IgeC1heGlzIixpc19sYWJlbDohMCw9
CmlzX2F1dG86ITB9LHk6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJpYzohMH19
LHNldHRpbmdzOnt4X2F4aXNfdD0KeXBlOntpbml0OiJoaWRlIn19fSl9KSxkZWZpbmUoInBsdWdp
bi9jaGFydHMvbnZkMy9iYXJfaG9yaXpvbnRhbF9zdGFja2VkL2NvPQpuZmlnIixbInBsdWdpbi9j
aGFydHMvbnZkMy9jb21tb24vY29uZmlnIl0sZnVuY3Rpb24oZSl7cmV0dXJuICQuZXh0ZW5kKCEw
LHs9Cn0sZSx7dGl0bGU6IlN0YWNrZWQgaG9yaXpvbnRhbCIsY2F0ZWdvcnk6IkJhciBkaWFncmFt
cyIsc2V0dGluZ3M6e3hfYXhpc190eT0KcGU6e2luaXQ6ImhpZGUifX0sY29sdW1uczp7eTp7dGl0
bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpc19udW1lcmljOiEwfX19KX0pPQosZGVmaW5lKCJwbHVn
aW4vY2hhcnRzL252ZDMvbGluZV9mb2N1cy9jb25maWciLFsicGx1Z2luL2NoYXJ0cy9udmQzL2Nv
bW1vbi89CmNvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXRs
ZToiTGluZSB3aXRoIGZvY3VzIixjYXRlZz0Kb3J5OiJPdGhlcnMiLGNvbHVtbnM6e3k6e3RpdGxl
OiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJpYzohMH19fSl9KSxkZWZpPQpuZSgicGx1Z2lu
L2NoYXJ0cy9udmQzL3BpZS9jb25maWciLFtdLGZ1bmN0aW9uKCl7cmV0dXJuICQuZXh0ZW5kKCEw
LHt9LHt0aXQ9CmxlOiJQaWUgY2hhcnQiLGNhdGVnb3J5OiJBcmVhIGNoYXJ0cyIsdGFnOiJzdmci
LHVzZV9wYW5lbHM6ITAsY29sdW1uczp7bGFiZT0KbDp7dGl0bGU6IkxhYmVscyIsaXNfbGFiZWw6
ITAsaXNfYXV0bzohMH0seTp7dGl0bGU6IlZhbHVlcyIsaXNfbnVtZXJpYzohMH19PQosc2V0dGlu
Z3M6e3Nob3dfbGVnZW5kOnt0aXRsZToiU2hvdyBsZWdlbmQiLGluZm86IldvdWxkIHlvdSBsaWtl
IHRvIGFkZCBhIGw9CmVnZW5kPyIsdHlwZToic2VsZWN0Iixpbml0OiJmYWxzZSIsZGF0YTpbe2xh
YmVsOiJZZXMiLHZhbHVlOiJ0cnVlIn0se2xhYmVsOj0KIk5vIix2YWx1ZToiZmFsc2UifV19LGRv
bnV0X3JhdGlvOnt0aXRsZToiRG9udXQgcmF0aW8iLGluZm86IkRldGVybWluZSBob3cgPQpsYXJn
ZSB0aGUgZG9udXQgaG9sZSB3aWxsIGJlLiIsdHlwZToic2VsZWN0Iixpbml0OiIwLjUiLGRhdGE6
W3tsYWJlbDoiNTAlIiw9CnZhbHVlOiIwLjUifSx7bGFiZWw6IjI1JSIsdmFsdWU6IjAuMjUifSx7
bGFiZWw6IjEwJSIsdmFsdWU6IjAuMTAifSx7bGFiZWw6Ij0KMCUiLHZhbHVlOiIwIn1dfSxsYWJl
bF9zZXBhcmF0b3I6e3R5cGU6InNlcGFyYXRvciIsdGl0bGU6IkxhYmVsIHNldHRpbmdzIn0sPQps
YWJlbF90eXBlOnt0aXRsZToiRG9udXQgbGFiZWwiLGluZm86IldoYXQgd291bGQgeW91IGxpa2Ug
dG8gc2hvdyBmb3IgZWFjaCA9CnNsaWNlPyIsdHlwZToic2VsZWN0Iixpbml0OiJwZXJjZW50Iixk
YXRhOlt7bGFiZWw6Ii0tIE5vdGhpbmcgLS0iLHZhbHVlOiJoaT0KZGUiLGhpZGU6ImxhYmVsX291
dHNpZGUifSx7bGFiZWw6IkxhYmVsIGNvbHVtbiIsdmFsdWU6ImtleSIsc2hvdzoibGFiZWxfb3V0
PQpzaWRlIn0se2xhYmVsOiJWYWx1ZSBjb2x1bW4iLHZhbHVlOiJ2YWx1ZSIsc2hvdzoibGFiZWxf
b3V0c2lkZSJ9LHtsYWJlbDoiUGU9CnJjZW50YWdlIix2YWx1ZToicGVyY2VudCIsc2hvdzoibGFi
ZWxfb3V0c2lkZSJ9XX0sbGFiZWxfb3V0c2lkZTp7dGl0bGU6IlNobz0KdyBvdXRzaWRlIixpbmZv
OiJXb3VsZCB5b3UgbGlrZSB0byBzaG93IGxhYmVscyBvdXRzaWRlIHRoZSBkb251dD8iLHR5cGU6
InNlPQpsZWN0Iixpbml0OiJmYWxzZSIsZGF0YTpbe2xhYmVsOiJZZXMiLHZhbHVlOiJ0cnVlIn0s
e2xhYmVsOiJObyIsdmFsdWU6ImZhbHM9CmUifV19fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRz
L252ZDMvc3RhY2tlZGFyZWFfZnVsbC9jb25maWciLFsicGx1Z2luL2NoYT0KcnRzL252ZDMvY29t
bW9uL2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXRsZToi
RXhwYW5kPQplZCIsY2F0ZWdvcnk6IkFyZWEgY2hhcnRzIixjb2x1bW5zOnt5Ont0aXRsZToiVmFs
dWVzIGZvciB5LWF4aXMiLGlzX251bWVyaWM9CjohMH19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFy
dHMvbnZkMy9zdGFja2VkYXJlYV9zdHJlYW0vY29uZmlnIixbInBsdWdpbi9jaD0KYXJ0cy9udmQz
L2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sZSx7dGl0
bGU6IlN0cmVhPQptIixjYXRlZ29yeToiQXJlYSBjaGFydHMiLGNvbHVtbnM6e3k6e3RpdGxlOiJW
YWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJpYzo9CiEwfX19KX0pLGRlZmluZSgicGx1Z2luL2No
YXJ0cy9udmQzL2hpc3RvZ3JhbS9jb25maWciLFsicGx1Z2luL2NoYXJ0cy9udmQzLz0KY29tbW9u
L2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXRsZToiSGlz
dG9ncmFtIixjYXRlPQpnb3J5OiJEYXRhIHByb2Nlc3NpbmcgKHJlcXVpcmVzICdjaGFydHMnIHRv
b2wgZnJvbSBUb29sc2hlZCkiLGV4ZWN1dGU6Imhpc3Q9Cm9ncmFtIixjb2x1bW5zOnt5Ont0aXRs
ZToiT2JzZXJ2YXRpb25zIixpc19udW1lcmljOiEwfX0sc2V0dGluZ3M6e3hfYXhpc19sYT0KYmVs
Ontpbml0OiJCcmVha3MifSx5X2F4aXNfbGFiZWw6e2luaXQ6IkRlbnNpdHkifSx5X2F4aXNfdHlw
ZTp7aW5pdDoiZiJ9LHlfPQpheGlzX3RpY2s6e2luaXQ6Ii4yIn19fSl9KSxkZWZpbmUoInBsdWdp
bi9jaGFydHMvbnZkMy9oaXN0b2dyYW1fZGlzY3JldGUvY289Cm5maWciLFsicGx1Z2luL2NoYXJ0
cy9udmQzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAsez0K
fSxlLHt0aXRsZToiSGlzdG9ncmFtIChkaXNjcmV0ZSkiLGNhdGVnb3J5OiJEYXRhIHByb2Nlc3Np
bmcgKHJlcXVpcmVzICdjaGFyPQp0cycgdG9vbCBmcm9tIFRvb2xzaGVkKSIsZXhlY3V0ZToiaGlz
dG9ncmFtZGlzY3JldGUiLGNvbHVtbnM6e3g6e3RpdGxlOiJPYnM9CmVydmF0aW9ucyIsaXNfbGFi
ZWw6ITB9fSxzZXR0aW5nczp7eF9heGlzX2xhYmVsOntpbml0OiJCcmVha3MifSx5X2F4aXNfbGFi
ZT0KbDp7aW5pdDoiRGVuc2l0eSJ9LHlfYXhpc190eXBlOntpbml0OiJmIn0seV9heGlzX3RpY2s6
e2luaXQ6Ii4yIn19fSl9KSxkZWZpPQpuZSgicGx1Z2luL2NoYXJ0cy9udmQzL2xpbmUvY29uZmln
IixbInBsdWdpbi9jaGFydHMvbnZkMy9jb21tb24vY29uZmlnIl0sZnU9Cm5jdGlvbihlKXtyZXR1
cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6IkxpbmUgY2hhcnQiLGNhdGVnb3J5OiJPdGhlcnMi
LGNvbD0KdW1uczp7eTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpc19udW1lcmljOiEwfX19
KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0PQpzL252ZDMvc2NhdHRlci9jb25maWciLFsicGx1Z2lu
L2NoYXJ0cy9udmQzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXQ9CnVybiAkLmV4dGVu
ZCghMCx7fSxlLHt0aXRsZToiU2NhdHRlciBwbG90IixjYXRlZ29yeToiT3RoZXJzIixjb2x1bW5z
Ont4Ont0aT0KdGxlOiJWYWx1ZXMgZm9yIHgtYXhpcyIsaXNfbnVtZXJpYzohMH0seTp7dGl0bGU6
IlZhbHVlcyBmb3IgeS1heGlzIixpc19udW1lPQpyaWM6ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4v
Y2hhcnRzL252ZDMvc3RhY2tlZGFyZWEvY29uZmlnIixbInBsdWdpbi9jaGFydHM9Ci9udmQzL2Nv
bW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6
IlJlZ3VsYXIiLD0KY2F0ZWdvcnk6IkFyZWEgY2hhcnRzIixjb2x1bW5zOnt5Ont0aXRsZToiVmFs
dWVzIGZvciB5LWF4aXMiLGlzX251bWVyaWM6ITB9PQp9fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFy
dHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZmlnIixbXSxmdW5jdGlvbigpe3JldHVybns9CnRpdGxl
OiIiLGNhdGVnb3J5OiIiLGxpYnJhcnk6ImhpZ2hjaGFydHMiLHRhZzoiZGl2IixzZXR0aW5nczp7
c2VwYXJhdG9yX2xhYj0KZWw6e3RpdGxlOiJYIGF4aXMiLHR5cGU6InNlcGFyYXRvciJ9LHhfYXhp
c19sYWJlbDp7dGl0bGU6IkF4aXMgbGFiZWwiLGluZm86PQoiUHJvdmlkZSBhIGxhYmVsIGZvciB0
aGUgYXhpcy4iLHR5cGU6InRleHQiLGluaXQ6IlgtYXhpcyIscGxhY2Vob2xkZXI6IkF4aXM9CiBs
YWJlbCJ9LHhfYXhpc190eXBlOnt0aXRsZToiQXhpcyB2YWx1ZSB0eXBlIixpbmZvOiJTZWxlY3Qg
dGhlIHZhbHVlIHR5cGUgbz0KZiB0aGUgYXhpcy4iLHR5cGU6InNlbGVjdCIsaW5pdDoiYXV0byIs
ZGF0YTpbe2xhYmVsOiItLSBEbyBub3Qgc2hvdyB2YWx1ZXMgPQotLSIsdmFsdWU6ImhpZGUiLGhp
ZGU6WyJ4X2F4aXNfdGljayJdfSx7bGFiZWw6IkF1dG8iLHZhbHVlOiJhdXRvIixoaWRlOlsieF89
CmF4aXNfdGljayJdfSx7bGFiZWw6IkZsb2F0Iix2YWx1ZToiZiIsc2hvdzpbInhfYXhpc190aWNr
Il19LHtsYWJlbDoiRXhwb25lbj0KdCIsdmFsdWU6ImUiLHNob3c6WyJ4X2F4aXNfdGljayJdfSx7
bGFiZWw6IkludGVnZXIiLHZhbHVlOiJkIixoaWRlOlsieF9heGlzPQpfdGljayJdfSx7bGFiZWw6
IlBlcmNlbnRhZ2UiLHZhbHVlOiJwIixzaG93OlsieF9heGlzX3RpY2siXX0se2xhYmVsOiJSb3Vu
ZGU9CmQiLHZhbHVlOiJyIixzaG93OlsieF9heGlzX3RpY2siXX0se2xhYmVsOiJTSS1wcmVmaXgi
LHZhbHVlOiJzIixzaG93OlsieF9heD0KaXNfdGljayJdfV19LHhfYXhpc190aWNrOnt0aXRsZToi
QXhpcyB0aWNrIGZvcm1hdCIsaW5mbzoiU2VsZWN0IHRoZSB0aWNrIGZvPQpybWF0IGZvciB0aGUg
YXhpcy4iLHR5cGU6InNlbGVjdCIsaW5pdDoiLjEiLGRhdGE6W3tsYWJlbDoiMC4wMDAwMSIsdmFs
dWU6Ii49CjUifSx7bGFiZWw6IjAuMDAwMSIsdmFsdWU6Ii40In0se2xhYmVsOiIwLjAwMSIsdmFs
dWU6Ii4zIn0se2xhYmVsOiIwLjAxIix2YT0KbHVlOiIuMiJ9LHtsYWJlbDoiMC4xIix2YWx1ZToi
LjEifSx7bGFiZWw6IjEiLHZhbHVlOiIxIn1dfSxzZXBhcmF0b3JfdGljazp7PQp0aXRsZToiWSBh
eGlzIix0eXBlOiJzZXBhcmF0b3IifSx5X2F4aXNfbGFiZWw6e3RpdGxlOiJBeGlzIGxhYmVsIixp
bmZvOiJQcm89CnZpZGUgYSBsYWJlbCBmb3IgdGhlIGF4aXMuIix0eXBlOiJ0ZXh0Iixpbml0OiJZ
LWF4aXMiLHBsYWNlaG9sZGVyOiJBeGlzIGxhYj0KZWwifSx5X2F4aXNfdHlwZTp7dGl0bGU6IkF4
aXMgdmFsdWUgdHlwZSIsaW5mbzoiU2VsZWN0IHRoZSB2YWx1ZSB0eXBlIG9mIHRoPQplIGF4aXMu
Iix0eXBlOiJzZWxlY3QiLGluaXQ6ImF1dG8iLGRhdGE6W3tsYWJlbDoiLS0gRG8gbm90IHNob3cg
dmFsdWVzIC0tIiw9CnZhbHVlOiJoaWRlIixoaWRlOlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJB
dXRvIix2YWx1ZToiYXV0byIsaGlkZTpbInlfYXhpcz0KX3RpY2siXX0se2xhYmVsOiJGbG9hdCIs
dmFsdWU6ImYiLHNob3c6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IkV4cG9uZW50Iix2PQphbHVl
OiJlIixzaG93OlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJJbnRlZ2VyIix2YWx1ZToiZCIsaGlk
ZTpbInlfYXhpc190aWM9CmsiXX0se2xhYmVsOiJQZXJjZW50YWdlIix2YWx1ZToicCIsc2hvdzpb
InlfYXhpc190aWNrIl19LHtsYWJlbDoiUm91bmRlZCIsdj0KYWx1ZToiciIsc2hvdzpbInlfYXhp
c190aWNrIl19LHtsYWJlbDoiU0ktcHJlZml4Iix2YWx1ZToicyIsc2hvdzpbInlfYXhpc190PQpp
Y2siXX1dfSx5X2F4aXNfdGljazp7dGl0bGU6IkF4aXMgdGljayBmb3JtYXQiLGluZm86IlNlbGVj
dCB0aGUgdGljayBmb3JtYXQ9CiBmb3IgdGhlIGF4aXMuIix0eXBlOiJzZWxlY3QiLGluaXQ6Ii4x
IixkYXRhOlt7bGFiZWw6IjAuMDAwMDEiLHZhbHVlOiIuNSJ9LD0Ke2xhYmVsOiIwLjAwMDEiLHZh
bHVlOiIuNCJ9LHtsYWJlbDoiMC4wMDEiLHZhbHVlOiIuMyJ9LHtsYWJlbDoiMC4wMSIsdmFsdWU6
PQoiLjIifSx7bGFiZWw6IjAuMSIsdmFsdWU6Ii4xIn0se2xhYmVsOiIxIix2YWx1ZToiMSJ9XX0s
c2VwYXJhdG9yX2xlZ2VuZDp7dGk9CnRsZToiT3RoZXJzIix0eXBlOiJzZXBhcmF0b3IifSxsZWdl
bmRfZW5hYmxlZDp7dGl0bGU6IlNob3cgbGVnZW5kIixpbmZvOiJXbz0KdWxkIHlvdSBsaWtlIHRv
IGFkZCBhIGxlZ2VuZD8iLHR5cGU6InNlbGVjdCIsaW5pdDoidHJ1ZSIsZGF0YTpbe2xhYmVsOiJZ
ZXMiPQosdmFsdWU6InRydWUifSx7bGFiZWw6Ik5vIix2YWx1ZToiZmFsc2UifV19fX19KSxkZWZp
bmUoInBsdWdpbi9jaGFydHMvaGlnaGM9CmhhcnRzL2Jhci9jb25maWciLFsicGx1Z2luL2NoYXJ0
cy9oaWdoY2hhcnRzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZT0KdHVybiAkLmV4dGVu
ZCghMCx7fSxlLHt0aXRsZToiUmVndWxhciIsY2F0ZWdvcnk6IkJhciBkaWFncmFtcyIsY29sdW1u
czp7eDp7PQp0aXRsZToiVmFsdWVzIGZvciB4LWF4aXMiLGlzX2xhYmVsOiEwLGlzX2F1dG86ITAs
aXNfdW5pcXVlOiEwfSx5Ont0aXRsZToiVmE9Cmx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJpYzoh
MH19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9iYXJfcz0KdGFja2VkL2Nv
bmZpZyIsWyJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uL2NvbmZpZyJdLGZ1bmN0aW9u
KGUpe3JldHVyPQpuICQuZXh0ZW5kKCEwLHt9LGUse3RpdGxlOiJTdGFja2VkIixjYXRlZ29yeToi
QmFyIGRpYWdyYW1zIixjb2x1bW5zOnt4Ont0aXQ9CmxlOiJWYWx1ZXMgZm9yIHgtYXhpcyIsaXNf
bGFiZWw6ITAsaXNfYXV0bzohMH0seTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIj0KLGlzX251
bWVyaWM6ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvYmFyX2hvcml6
b250YWwvY29uZmlnPQoiLFsicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi9jb25maWci
XSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITA9Cix7fSxlLHt0aXRsZToiSG9yaXpvbnRh
bCIsY2F0ZWdvcnk6IkJhciBkaWFncmFtcyIsY29sdW1uczp7eDp7dGl0bGU6IlZhbHVlcz0KIGZv
ciB4LWF4aXMiLGlzX2xhYmVsOiEwLGlzX2F1dG86ITB9LHk6e3RpdGxlOiJWYWx1ZXMgZm9yIHkt
YXhpcyIsaXNfbnVtZXJpPQpjOiEwfX0sc2V0dGluZ3M6e3hfYXhpc190eXBlOntpbml0OiJoaWRl
In19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvaGlnaGM9CmhhcnRzL2Jhcl9ob3Jpem9udGFs
X3N0YWNrZWQvY29uZmlnIixbInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZj0K
aWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6IlN0YWNrZWQg
aG9yaXpvbnRhbCIsY2F0ZWdvPQpyeToiQmFyIGRpYWdyYW1zIixzZXR0aW5nczp7eF9heGlzX3R5
cGU6e2luaXQ6ImhpZGUifX0sY29sdW1uczp7eDp7dGl0bGU6IlY9CmFsdWVzIGZvciB4LWF4aXMi
LGlzX2xhYmVsOiEwLGlzX2F1dG86ITB9LHk6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNf
bj0KdW1lcmljOiEwfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2hpc3Rv
Z3JhbS9jb25maWciLFsicGx1Z2luPQovY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uL2NvbmZpZyJd
LGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXQ9CmxlOiJIaXN0b2dyYW0i
LGNhdGVnb3J5OiJEYXRhIHByb2Nlc3NpbmcgKHJlcXVpcmVzICdjaGFydHMnIHRvb2wgZnJvbSBU
b29scz0KaGVkKSIsZXhlY3V0ZToiaGlzdG9ncmFtIixjb2x1bW5zOnt5Ont0aXRsZToiT2JzZXJ2
YXRpb25zIixpc19udW1lcmljOiEwfX0sPQpzZXR0aW5nczp7eF9heGlzX2xhYmVsOntpbml0OiJC
cmVha3MifSx5X2F4aXNfbGFiZWw6e2luaXQ6IkRlbnNpdHkifSx5X2F4aXM9Cl90eXBlOntpbml0
OiJmIn0seV9heGlzX3RpY2s6e2luaXQ6Ii4yIn19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFydHMv
aGlnaGNoYT0KcnRzL2hpc3RvZ3JhbV9kaXNjcmV0ZS9jb25maWciLFsicGx1Z2luL2NoYXJ0cy9o
aWdoY2hhcnRzL2NvbW1vbi9jb25maWciXSxmPQp1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCgh
MCx7fSxlLHt0aXRsZToiSGlzdG9ncmFtIChEaXNjcmV0ZSkiLGNhdGVnb3J5OiI9CkRhdGEgcHJv
Y2Vzc2luZyAocmVxdWlyZXMgJ2NoYXJ0cycgdG9vbCBmcm9tIFRvb2xzaGVkKSIsZXhlY3V0ZToi
aGlzdG9ncmFtZD0KaXNjcmV0ZSIsY29sdW1uczp7eTp7dGl0bGU6Ik9ic2VydmF0aW9ucyIsaXNf
bGFiZWw6ITB9fSxzZXR0aW5nczp7eF9heGlzX2xhPQpiZWw6e2luaXQ6IkJyZWFrcyJ9LHlfYXhp
c19sYWJlbDp7aW5pdDoiRGVuc2l0eSJ9LHlfYXhpc190eXBlOntpbml0OiJmIn0seV89CmF4aXNf
dGljazp7aW5pdDoiLjIifX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2xp
bmUvY29uZmlnIixbIj0KcGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi9jb25maWciXSxm
dW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sPQplLHt0aXRsZToiTGluZSIsY2F0ZWdv
cnk6Ik90aGVycyIsY29sdW1uczp7eDp7dGl0bGU6IlZhbHVlcyBmb3IgeC1heGlzIixpc189Cmxh
YmVsOiEwLGlzX2F1dG86ITAsaXNfbnVtZXJpYzohMX0seTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1h
eGlzIixpc19udW1lcmljOj0KITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFy
dHMvcGllL2NvbmZpZyIsWyJwbHVnaW4vY2hhcnRzL2hpZ2hjPQpoYXJ0cy9jb21tb24vY29uZmln
Il0sZnVuY3Rpb24oZSl7cmV0dXJuICQuZXh0ZW5kKCEwLHt9LGUse3RpdGxlOiJQaWUgY2hhcnQ9
CiIsY2F0ZWdvcnk6IkFyZWEgY2hhcnRzIix1c2VfcGFuZWxzOiEwLGNvbHVtbnM6e2xhYmVsOnt0
aXRsZToiTGFiZWxzIixpc19sYT0KYmVsOiEwLGlzX2F1dG86ITB9LHk6e3RpdGxlOiJWYWx1ZXMi
LGlzX251bWVyaWM6ITB9fSxzZXR0aW5nczp7c2hvd19sZWdlbmQ6PQp7dGl0bGU6IlNob3cgbGVn
ZW5kIixpbmZvOiJXb3VsZCB5b3UgbGlrZSB0byBhZGQgYSBsZWdlbmQ/Iix0eXBlOiJzZWxlY3Qi
LGk9Cm5pdDoiZmFsc2UiLGRhdGE6W3tsYWJlbDoiWWVzIix2YWx1ZToidHJ1ZSJ9LHtsYWJlbDoi
Tm8iLHZhbHVlOiJmYWxzZSJ9XX0sZD0Kb251dF9yYXRpbzp7dGl0bGU6IkRvbnV0IHJhdGlvIixp
bmZvOiJEZXRlcm1pbmUgaG93IGxhcmdlIHRoZSBkb251dCBob2xlIHdpPQpsbCBiZS4iLHR5cGU6
InNlbGVjdCIsaW5pdDoiMC41IixkYXRhOlt7bGFiZWw6IjUwJSIsdmFsdWU6IjAuNSJ9LHtsYWJl
bDoiMjU9CiUiLHZhbHVlOiIwLjI1In0se2xhYmVsOiIxMCUiLHZhbHVlOiIwLjEwIn0se2xhYmVs
OiIwJSIsdmFsdWU6IjAifV19LGxhYmVsXz0Kc2VwYXJhdG9yOnt0eXBlOiJzZXBhcmF0b3IiLHRp
dGxlOiJMYWJlbCBzZXR0aW5ncyJ9LGxhYmVsX3R5cGU6e3RpdGxlOiJEb251PQp0IGxhYmVsIixp
bmZvOiJXaGF0IHdvdWxkIHlvdSBsaWtlIHRvIHNob3cgZm9yIGVhY2ggc2xpY2U/Iix0eXBlOiJz
ZWxlY3QiLGk9Cm5pdDoicGVyY2VudCIsZGF0YTpbe2xhYmVsOiItLSBOb3RoaW5nIC0tIix2YWx1
ZToiaGlkZSIsaGlkZToibGFiZWxfb3V0c2lkZT0KIn0se2xhYmVsOiJMYWJlbCBjb2x1bW4iLHZh
bHVlOiJrZXkiLHNob3c6ImxhYmVsX291dHNpZGUifSx7bGFiZWw6IlZhbHVlIGNvPQpsdW1uIix2
YWx1ZToidmFsdWUiLHNob3c6ImxhYmVsX291dHNpZGUifSx7bGFiZWw6IlBlcmNlbnRhZ2UiLHZh
bHVlOiJwZXJjZW49CnQiLHNob3c6ImxhYmVsX291dHNpZGUifV19LGxhYmVsX291dHNpZGU6e3Rp
dGxlOiJTaG93IG91dHNpZGUiLGluZm86IldvdWxkID0KeW91IGxpa2UgdG8gc2hvdyBsYWJlbHMg
b3V0c2lkZSB0aGUgZG9udXQ/Iix0eXBlOiJzZWxlY3QiLGluaXQ6ImZhbHNlIixkYXRhPQo6W3ts
YWJlbDoiWWVzIix2YWx1ZToidHJ1ZSJ9LHtsYWJlbDoiTm8iLHZhbHVlOiJmYWxzZSJ9XX19fSl9
KSxkZWZpbmUoInBsdWc9CmluL2NoYXJ0cy9oaWdoY2hhcnRzL3NjYXR0ZXIvY29uZmlnIixbInBs
dWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZj0KaWciXSxmdW5jdGlvbihlKXtyZXR1
cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6IlNjYXR0ZXIgcGxvdCIsY2F0ZWdvcnk6Ik90PQpo
ZXJzIixjb2x1bW5zOnt4Ont0aXRsZToiVmFsdWVzIGZvciB4LWF4aXMiLGlzX251bWVyaWM6ITB9
LHk6e3RpdGxlOiJWYWx1ZXM9CiBmb3IgeS1heGlzIixpc19udW1lcmljOiEwfX19KX0pLGRlZmlu
ZSgicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL3N0YWNrZWRhcj0KZWEvY29uZmlnIixbInBsdWdp
bi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZmlnIl0sZnVuY3Rpb24oZSl7cmV0dXJuICQu
PQpleHRlbmQoITAse30sZSx7dGl0bGU6IlJlZ3VsYXIiLGNhdGVnb3J5OiJBcmVhIGNoYXJ0cyIs
Y29sdW1uczp7eDp7dGl0bGU6IlY9CmFsdWVzIGZvciB4LWF4aXMiLGlzX2xhYmVsOiEwLGlzX2F1
dG86ITAsaXNfbnVtZXJpYzohMX0seTp7dGl0bGU6IlZhbHVlcyBmbz0KciB5LWF4aXMiLGlzX251
bWVyaWM6ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvYm94cGxvdC9j
b25mPQppZyIsW10sZnVuY3Rpb24oKXtyZXR1cm4gJC5leHRlbmQoITAse30se3RpdGxlOiJCb3gg
cGxvdCIsY2F0ZWdvcnk6IkRhdGEgcHI9Cm9jZXNzaW5nIChyZXF1aXJlcyAnY2hhcnRzJyB0b29s
IGZyb20gVG9vbHNoZWQpIixsaWJyYXJ5OiJoaWdoY2hhcnRzLmpzIix0YT0KZzoiZGl2IixleGVj
dXRlOiJib3hwbG90Iixjb2x1bW5zOnt5Ont0aXRsZToiT2JzZXJ2YXRpb25zIixpc19udW1lcmlj
OiEwfX0sPQpzZXR0aW5nczp7c2VwYXJhdG9yX2xhYmVsOnt0aXRsZToiWCBheGlzIix0eXBlOiJz
ZXBhcmF0b3IifSx4X2F4aXNfbGFiZWw6e3Q9Cml0bGU6IkF4aXMgbGFiZWwiLGluZm86IlByb3Zp
ZGUgYSBsYWJlbCBmb3IgdGhlIGF4aXMuIix0eXBlOiJ0ZXh0Iixpbml0OiJYLT0KYXhpcyIscGxh
Y2Vob2xkZXI6IkF4aXMgbGFiZWwifSxzZXBhcmF0b3JfdGljazp7dGl0bGU6IlkgYXhpcyIsdHlw
ZToic2VwYXJhPQp0b3IifSx5X2F4aXNfbGFiZWw6e3RpdGxlOiJBeGlzIGxhYmVsIixpbmZvOiJQ
cm92aWRlIGEgbGFiZWwgZm9yIHRoZSBheGlzLiI9Cix0eXBlOiJ0ZXh0Iixpbml0OiJZLWF4aXMi
LHBsYWNlaG9sZGVyOiJBeGlzIGxhYmVsIn19fSl9KSxkZWZpbmUoInBsdWdpbi9jaD0KYXJ0cy9o
aWdoY2hhcnRzL2hlYXRtYXAvY29uZmlnIixbInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9jb21t
b24vY29uZmlnIl0sPQpmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6
IkhlYXRtYXAiLGNhdGVnb3J5OiJEYXRhIHByb2Nlc3M9CmluZyAocmVxdWlyZXMgJ2NoYXJ0cycg
dG9vbCBmcm9tIFRvb2xzaGVkKSIsZXhlY3V0ZToiaGVhdG1hcCIsdXNlX3BhbmVsczohMD0KLGNv
bHVtbnM6e3Jvd19sYWJlbDp7dGl0bGU6IlJvdyBsYWJlbHMiLGlzX2xhYmVsOiEwfSxjb2xfbGFi
ZWw6e3RpdGxlOiJDb2x1PQptbiBsYWJlbHMiLGlzX2xhYmVsOiEwfSx2YWx1ZTp7dGl0bGU6Ik9i
c2VydmF0aW9ucyIsaXNfbnVtZXJpYzohMH19fSl9KSxkZWY9CmluZSgicGx1Z2luL2NoYXJ0cy90
eXBlcyIsWyJwbHVnaW4vY2hhcnRzL252ZDMvYmFyL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvbj0K
dmQzL2Jhcl9zdGFja2VkL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvbnZkMy9iYXJfaG9yaXpvbnRh
bC9jb25maWciLCJwbHVnaW4vPQpjaGFydHMvbnZkMy9iYXJfaG9yaXpvbnRhbF9zdGFja2VkL2Nv
bmZpZyIsInBsdWdpbi9jaGFydHMvbnZkMy9saW5lX2ZvY3VzL2M9Cm9uZmlnIiwicGx1Z2luL2No
YXJ0cy9udmQzL3BpZS9jb25maWciLCJwbHVnaW4vY2hhcnRzL252ZDMvc3RhY2tlZGFyZWFfZnVs
bD0KL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvbnZkMy9zdGFja2VkYXJlYV9zdHJlYW0vY29uZmln
IiwicGx1Z2luL2NoYXJ0cy9udmQzPQovaGlzdG9ncmFtL2NvbmZpZyIsInBsdWdpbi9jaGFydHMv
bnZkMy9oaXN0b2dyYW1fZGlzY3JldGUvY29uZmlnIiwicGx1Z2luL2M9CmhhcnRzL252ZDMvbGlu
ZS9jb25maWciLCJwbHVnaW4vY2hhcnRzL252ZDMvc2NhdHRlci9jb25maWciLCJwbHVnaW4vY2hh
cnRzLz0KbnZkMy9zdGFja2VkYXJlYS9jb25maWciLCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMv
YmFyL2NvbmZpZyIsInBsdWdpbi9jaGFyPQp0cy9oaWdoY2hhcnRzL2Jhcl9zdGFja2VkL2NvbmZp
ZyIsInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9iYXJfaG9yaXpvbnRhbC89CmNvbmZpZyIsInBs
dWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9iYXJfaG9yaXpvbnRhbF9zdGFja2VkL2NvbmZpZyIsInBs
dWdpbi9jaD0KYXJ0cy9oaWdoY2hhcnRzL2hpc3RvZ3JhbS9jb25maWciLCJwbHVnaW4vY2hhcnRz
L2hpZ2hjaGFydHMvaGlzdG9ncmFtX2Rpc2NyPQpldGUvY29uZmlnIiwicGx1Z2luL2NoYXJ0cy9o
aWdoY2hhcnRzL2xpbmUvY29uZmlnIiwicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnQ9CnMvcGllL2Nv
bmZpZyIsInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9zY2F0dGVyL2NvbmZpZyIsInBsdWdpbi9j
aGFydHMvaGlnaD0KY2hhcnRzL3N0YWNrZWRhcmVhL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvaGln
aGNoYXJ0cy9ib3hwbG90L2NvbmZpZyIsInBsdWdpPQpuL2NoYXJ0cy9oaWdoY2hhcnRzL2hlYXRt
YXAvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4scixpLHMsbyx1LGEsZixsLGMsaCxwLGQ9Cix2LG0s
Zyx5LGIsdyxFLFMseCxUKXtyZXR1cm4gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtkZWZhdWx0czp7
bnZkM19iYXI6ZSxudj0KZDNfYmFyX3N0YWNrZWQ6dCxudmQzX2Jhcl9ob3Jpem9udGFsOm4sbnZk
M19iYXJfaG9yaXpvbnRhbF9zdGFja2VkOnIsbnZkM19sPQppbmVfZm9jdXM6aSxudmQzX3N0YWNr
ZWRhcmVhX2Z1bGw6byxudmQzX3N0YWNrZWRhcmVhX3N0cmVhbTp1LG52ZDNfcGllOnMsbnY9CmQz
X3N0YWNrZWRhcmVhOmgsbnZkM19saW5lOmwsbnZkM19zY2F0dGVyOmMsbnZkM19oaXN0b2dyYW06
YSxudmQzX2hpc3RvZ3JhbT0KX2Rpc2NyZXRlOmYsaGlnaGNoYXJ0c19ib3hwbG90Onh9fSl9KSxk
ZWZpbmUoInBsdWdpbi9hcHAiLFsibXZjL3VpL3VpLW1vZGFsPQoiLCJtdmMvdWkvdWktcG9ydGxl
dCIsInBsdWdpbi9saWJyYXJ5L3VpIiwidXRpbHMvdXRpbHMiLCJwbHVnaW4vbGlicmFyeS9qb2I9
CnMiLCJwbHVnaW4vbGlicmFyeS9kYXRhc2V0cyIsInBsdWdpbi9saWJyYXJ5L3N0b3JhZ2UiLCJw
bHVnaW4vdmlld3Mvdmlld2VyIj0KLCJwbHVnaW4vdmlld3MvZWRpdG9yIiwicGx1Z2luL21vZGVs
cy9jb25maWciLCJwbHVnaW4vbW9kZWxzL2NoYXJ0IiwicGx1Z2luPQovY2hhcnRzL3R5cGVzIl0s
ZnVuY3Rpb24oZSx0LG4scixpLHMsbyx1LGEsZixsLGMpe3JldHVybiBCYWNrYm9uZS5WaWV3LmV4
dGU9Cm5kKHtpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRHQsR2FsYXh5JiZH
YWxheHkubW9kYWw/dGhpcy5tb2RhbD0KPTNER2FsYXh5Lm1vZGFsOnRoaXMubW9kYWw9M0RuZXcg
ZS5WaWV3LHRoaXMuY29uZmlnPTNEbmV3IGYsdGhpcy50eXBlcz0zRG5lPQp3IGMsdGhpcy5jaGFy
dD0zRG5ldyBsLHRoaXMuam9icz0zRG5ldyBpKHRoaXMpLHRoaXMuZGF0YXNldHM9M0RuZXcgcyh0
aGlzKSw9CnRoaXMuc3RvcmFnZT0zRG5ldyBvKHRoaXMpLHRoaXMudmlld2VyX3ZpZXc9M0RuZXcg
dSh0aGlzKSx0aGlzLmVkaXRvcl92aWV3PQo9M0RuZXcgYSh0aGlzKSx0aGlzLiRlbC5hcHBlbmQo
dGhpcy52aWV3ZXJfdmlldy4kZWwpLHRoaXMuJGVsLmFwcGVuZCh0aGlzLmU9CmRpdG9yX3ZpZXcu
JGVsKTtpZighdGhpcy5zdG9yYWdlLmxvYWQoKSl0aGlzLmdvKCJlZGl0b3IiKTtlbHNle3RoaXMu
Z28oInZpZT0Kd2VyIik7dmFyIG49M0R0aGlzO3RoaXMuY2hhcnQuZGVmZXJyZWQuZXhlY3V0ZShm
dW5jdGlvbigpe24uY2hhcnQudHJpZ2dlcigiPQpyZWRyYXciKX0pfX0sZ286ZnVuY3Rpb24oZSl7
JCgiLnRvb2x0aXAiKS5oaWRlKCk7c3dpdGNoKGUpe2Nhc2UiZWRpdG9yIjp0aGk9CnMuZWRpdG9y
X3ZpZXcuc2hvdygpLHRoaXMudmlld2VyX3ZpZXcuaGlkZSgpO2JyZWFrO2Nhc2Uidmlld2VyIjp0
aGlzLmVkaXRvcj0KX3ZpZXcuaGlkZSgpLHRoaXMudmlld2VyX3ZpZXcuc2hvdygpfX0sY2hhcnRQ
YXRoOmZ1bmN0aW9uKGUpe3ZhciB0PTNEZS5zcGxpPQp0KC9fKC4rKS8pO3JldHVybiB0Lmxlbmd0
aD49M0QyP3RbMF0rIi8iK3RbMV06KGNvbnNvbGUuZGVidWcoIkZBSUxFRCBBcHA6Y2g9CmFydFBh
dGgoKSAtIEludmFsaWQgZm9ybWF0OiAiK2UpLHVuZGVmaW5lZCl9LGV4ZWN1dGU6ZnVuY3Rpb24o
ZSl7fSxvbnVubG9hZD0KOmZ1bmN0aW9uKCl7fSxsb2c6ZnVuY3Rpb24oZSx0KXtjb25zb2xlLmxv
ZyhlKyIgIit0KX19KX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZSgibXZj
L3VpL3VpLW1vZGFsIixbXSxmdW5jdGlvbigpe3ZhciBlPTNEQmFja2JvbmUuVmlldy5leHRlbmQo
e2VsTWFpPQpuOiJib2R5IixvcHRpb25zRGVmYXVsdDp7dGl0bGU6InVpLW1vZGFsIixib2R5OiIi
LGJhY2tkcm9wOiEwLGhlaWdodDpudWxsLHc9CmlkdGg6bnVsbCxjbG9zaW5nX2V2ZW50czohMSxj
bG9zaW5nX2NhbGxiYWNrOm51bGx9LGJ1dHRvbkxpc3Q6e30saW5pdGlhbGl6ZT0KOmZ1bmN0aW9u
KGUpe2UmJnRoaXMuX2NyZWF0ZShlKX0sc2hvdzpmdW5jdGlvbihlKXt0aGlzLmluaXRpYWxpemUo
ZSksdGhpcy5vPQpwdGlvbnMuaGVpZ2h0Pyh0aGlzLiRib2R5LmNzcygiaGVpZ2h0Iix0aGlzLm9w
dGlvbnMuaGVpZ2h0KSx0aGlzLiRib2R5LmNzcyg9CiJvdmVyZmxvdyIsImhpZGRlbiIpKTp0aGlz
LiRib2R5LmNzcygibWF4LWhlaWdodCIsJCh3aW5kb3cpLmhlaWdodCgpLzIpLHRoaT0Kcy5vcHRp
b25zLndpZHRoJiZ0aGlzLiRkaWFsb2cuY3NzKCJ3aWR0aCIsdGhpcy5vcHRpb25zLndpZHRoKSx0
aGlzLnZpc2libGU/PQp0aGlzLiRlbC5zaG93KCk6dGhpcy4kZWwuZmFkZUluKCJmYXN0IiksdGhp
cy52aXNpYmxlPTNEITB9LGhpZGU6ZnVuY3Rpb24oKXs9CnRoaXMudmlzaWJsZT0zRCExLHRoaXMu
JGVsLmZhZGVPdXQoImZhc3QiKSx0aGlzLm9wdGlvbnMuY2xvc2luZ19jYWxsYmFjayYmdD0KaGlz
Lm9wdGlvbnMuY2xvc2luZ19jYWxsYmFjaygpfSxlbmFibGVCdXR0b246ZnVuY3Rpb24oZSl7dmFy
IHQ9M0R0aGlzLmJ1dHRvPQpuTGlzdFtlXTt0aGlzLiRidXR0b25zLmZpbmQoIiMiK3QpLnByb3Ao
ImRpc2FibGVkIiwhMSl9LGRpc2FibGVCdXR0b246ZnVuY3Q9CmlvbihlKXt2YXIgdD0zRHRoaXMu
YnV0dG9uTGlzdFtlXTt0aGlzLiRidXR0b25zLmZpbmQoIiMiK3QpLnByb3AoImRpc2FibGVkIj0K
LCEwKX0sc2hvd0J1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD0zRHRoaXMuYnV0dG9uTGlzdFtlXTt0
aGlzLiRidXR0b25zLmZpbmQoPQoiIyIrdCkuc2hvdygpfSxoaWRlQnV0dG9uOmZ1bmN0aW9uKGUp
e3ZhciB0PTNEdGhpcy5idXR0b25MaXN0W2VdO3RoaXMuJGJ1dHQ9Cm9ucy5maW5kKCIjIit0KS5o
aWRlKCl9LGdldEJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD0zRHRoaXMuYnV0dG9uTGlzdFtlXTty
ZT0KdHVybiB0aGlzLiRidXR0b25zLmZpbmQoIiMiK3QpfSxzY3JvbGxUb3A6ZnVuY3Rpb24oKXty
ZXR1cm4gdGhpcy4kYm9keS5zY3JvPQpsbFRvcCgpfSxfY3JlYXRlOmZ1bmN0aW9uKGUpe3ZhciB0
PTNEdGhpczt0aGlzLm9wdGlvbnM9M0RfLmRlZmF1bHRzKGUsdGhpcy49Cm9wdGlvbnNEZWZhdWx0
KSx0aGlzLm9wdGlvbnMuYm9keT0zRD0zRCJwcm9ncmVzcyImJih0aGlzLm9wdGlvbnMuYm9keT0z
RCQoJz0KPGRpdiBjbGFzcz0zRCJwcm9ncmVzcyBwcm9ncmVzcy1zdHJpcGVkIGFjdGl2ZSI+PGRp
diBjbGFzcz0zRCJwcm9ncmVzcy1iYXIgPQpwcm9ncmVzcy1iYXItaW5mbyIgc3R5bGU9M0Qid2lk
dGg6MTAwJSI+PC9kaXY+PC9kaXY+JykpLHRoaXMuJGVsJiYodGhpcy4kZWw9Ci5yZW1vdmUoKSwk
KGRvY3VtZW50KS5vZmYoImtleXVwLnVpLW1vZGFsIikpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90
ZW1wbGF0ZT0KKHRoaXMub3B0aW9ucy50aXRsZSkpLHRoaXMuJGRpYWxvZz0zRHRoaXMuJGVsLmZp
bmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiPQpvZHk9M0R0aGlzLiRlbC5maW5kKCIubW9kYWwt
Ym9keSIpLHRoaXMuJGZvb3Rlcj0zRHRoaXMuJGVsLmZpbmQoIi5tb2RhbC1mb289CnRlciIpLHRo
aXMuJGJ1dHRvbnM9M0R0aGlzLiRlbC5maW5kKCIuYnV0dG9ucyIpLHRoaXMuJGJhY2tkcm9wPTNE
dGhpcy4kZWwuZj0KaW5kKCIubW9kYWwtYmFja2Ryb3AiKSx0aGlzLiRib2R5Lmh0bWwodGhpcy5v
cHRpb25zLmJvZHkpLHRoaXMub3B0aW9ucy5iYWNrPQpkcm9wfHx0aGlzLiRiYWNrZHJvcC5yZW1v
dmVDbGFzcygiaW4iKTtpZih0aGlzLm9wdGlvbnMuYnV0dG9ucyl7dGhpcy5idXR0b249Ckxpc3Q9
M0R7fTt2YXIgbj0zRDA7JC5lYWNoKHRoaXMub3B0aW9ucy5idXR0b25zLGZ1bmN0aW9uKGUscil7
dmFyIGk9M0QiYnV0dD0Kb24tIituKys7dC4kYnV0dG9ucy5hcHBlbmQoJCgnPGJ1dHRvbiBpZD0z
RCInK2krJyI+PC9idXR0b24+JykudGV4dChlKS5jbGljPQprKHIpKS5hcHBlbmQoIiAiKSx0LmJ1
dHRvbkxpc3RbZV09M0RpfSl9ZWxzZSB0aGlzLiRmb290ZXIuaGlkZSgpOyQodGhpcy5lbE09CmFp
bikuYXBwZW5kKCQodGhpcy5lbCkpLHRoaXMub3B0aW9ucy5jbG9zaW5nX2V2ZW50cyYmKCQoZG9j
dW1lbnQpLm9uKCJrZXl1cD0KLnVpLW1vZGFsIixmdW5jdGlvbihlKXtlLmtleUNvZGU9M0Q9M0Qy
NyYmdC5oaWRlKCl9KSx0aGlzLiRlbC5maW5kKCIubW9kYWwtPQpiYWNrZHJvcCIpLm9uKCJjbGlj
ayIsZnVuY3Rpb24oKXt0LmhpZGUoKX0pKX0sX3RlbXBsYXRlOmZ1bmN0aW9uKGUpe3JldHVybic9
CjxkaXYgY2xhc3M9M0QidWktbW9kYWwgbW9kYWwiPjxkaXYgY2xhc3M9M0QibW9kYWwtYmFja2Ry
b3AgZmFkZSBpbiIgc3R5bGU9Cj0zRCJ6LWluZGV4OiAtMTsiPjwvZGl2PjxkaXYgY2xhc3M9M0Qi
bW9kYWwtZGlhbG9nIj48ZGl2IGNsYXNzPTNEIm1vZGFsLWNvbj0KdGVudCI+PGRpdiBjbGFzcz0z
RCJtb2RhbC1oZWFkZXIiPjxidXR0b24gdHlwZT0zRCJidXR0b24iIGNsYXNzPTNEImNsb3NlIiBz
PQp0eWxlPTNEImRpc3BsYXk6IG5vbmU7Ij4mdGltZXM7PC9idXR0b24+PGg0IGNsYXNzPTNEInRp
dGxlIj4nK2UrIjwvaDQ+IisiPC89CmRpdj4iKyc8ZGl2IGNsYXNzPTNEIm1vZGFsLWJvZHkiIHN0
eWxlPTNEInBvc2l0aW9uOiBzdGF0aWM7Ij48L2Rpdj4nKyc8ZGl2ID0KY2xhc3M9M0QibW9kYWwt
Zm9vdGVyIj4nKyc8ZGl2IGNsYXNzPTNEImJ1dHRvbnMiIHN0eWxlPTNEImZsb2F0OiByaWdodDsi
PjwvPQpkaXY+JysiPC9kaXY+IisiPC9kaXYiKyI8L2Rpdj4iKyI8L2Rpdj4ifX0pO3JldHVybntW
aWV3OmV9fSksZnVuY3Rpb24oKXt2YXI9CiBlPTNEdGhpcyx0PTNEZS5fLG49M0R7fSxyPTNEQXJy
YXkucHJvdG90eXBlLGk9M0RPYmplY3QucHJvdG90eXBlLHM9M0RGdW5jdD0KaW9uLnByb3RvdHlw
ZSxvPTNEci5wdXNoLHU9M0RyLnNsaWNlLGE9M0RyLmNvbmNhdCxmPTNEaS50b1N0cmluZyxsPTNE
aS5oYXNPPQp3blByb3BlcnR5LGM9M0RyLmZvckVhY2gsaD0zRHIubWFwLHA9M0RyLnJlZHVjZSxk
PTNEci5yZWR1Y2VSaWdodCx2PTNEci5maWw9CnRlcixtPTNEci5ldmVyeSxnPTNEci5zb21lLHk9
M0RyLmluZGV4T2YsYj0zRHIubGFzdEluZGV4T2Ysdz0zREFycmF5LmlzQXJyYT0KeSxFPTNET2Jq
ZWN0LmtleXMsUz0zRHMuYmluZCx4PTNEZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIHgpcmV0
dXJuIGU7aWYoPQohKHRoaXMgaW5zdGFuY2VvZiB4KSlyZXR1cm4gbmV3IHgoZSk7dGhpcy5fd3Jh
cHBlZD0zRGV9O3R5cGVvZiBleHBvcnRzIT0zRCI9CnVuZGVmaW5lZCI/KHR5cGVvZiBtb2R1bGUh
PTNEInVuZGVmaW5lZCImJm1vZHVsZS5leHBvcnRzJiYoZXhwb3J0cz0zRG1vZHVsZT0KLmV4cG9y
dHM9M0R4KSxleHBvcnRzLl89M0R4KTplLl89M0R4LHguVkVSU0lPTj0zRCIxLjQuNCI7dmFyIFQ9
M0R4LmVhY2g9M0R4PQouZm9yRWFjaD0zRGZ1bmN0aW9uKGUsdCxyKXtpZihlPTNEPTNEbnVsbCly
ZXR1cm47aWYoYyYmZS5mb3JFYWNoPTNEPTNEPTNEYyk9CmUuZm9yRWFjaCh0LHIpO2Vsc2UgaWYo
ZS5sZW5ndGg9M0Q9M0Q9M0QrZS5sZW5ndGgpe2Zvcih2YXIgaT0zRDAscz0zRGUubGVuZz0KdGg7
aTxzO2krKylpZih0LmNhbGwocixlW2ldLGksZSk9M0Q9M0Q9M0RuKXJldHVybn1lbHNlIGZvcih2
YXIgbyBpbiBlKWlmKHguPQpoYXMoZSxvKSYmdC5jYWxsKHIsZVtvXSxvLGUpPTNEPTNEPTNEbily
ZXR1cm59O3gubWFwPTNEeC5jb2xsZWN0PTNEZnVuY3Rpb249CihlLHQsbil7dmFyIHI9M0RbXTty
ZXR1cm4gZT0zRD0zRG51bGw/cjpoJiZlLm1hcD0zRD0zRD0zRGg/ZS5tYXAodCxuKTooVChlLD0K
ZnVuY3Rpb24oZSxpLHMpe3IucHVzaCh0LmNhbGwobixlLGkscykpfSkscil9O3ZhciBOPTNEIlJl
ZHVjZSBvZiBlbXB0eSBhcnJhPQp5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSI7eC5yZWR1Y2U9M0R4
LmZvbGRsPTNEeC5pbmplY3Q9M0RmdW5jdGlvbihlLHQsbixyKXs9CnZhciBpPTNEYXJndW1lbnRz
Lmxlbmd0aD4yO2U9M0Q9M0RudWxsJiYoZT0zRFtdKTtpZihwJiZlLnJlZHVjZT0zRD0zRD0zRHAp
cj0KZXR1cm4gciYmKHQ9M0R4LmJpbmQodCxyKSksaT9lLnJlZHVjZSh0LG4pOmUucmVkdWNlKHQp
O1QoZSxmdW5jdGlvbihlLHMsbyl7PQppP249M0R0LmNhbGwocixuLGUscyxvKToobj0zRGUsaT0z
RCEwKX0pO2lmKCFpKXRocm93IG5ldyBUeXBlRXJyb3IoTik7cmV0dXI9Cm4gbn0seC5yZWR1Y2VS
aWdodD0zRHguZm9sZHI9M0RmdW5jdGlvbihlLHQsbixyKXt2YXIgaT0zRGFyZ3VtZW50cy5sZW5n
dGg+Mj0KO2U9M0Q9M0RudWxsJiYoZT0zRFtdKTtpZihkJiZlLnJlZHVjZVJpZ2h0PTNEPTNEPTNE
ZClyZXR1cm4gciYmKHQ9M0R4LmJpbmQoPQp0LHIpKSxpP2UucmVkdWNlUmlnaHQodCxuKTplLnJl
ZHVjZVJpZ2h0KHQpO3ZhciBzPTNEZS5sZW5ndGg7aWYocyE9M0Q9M0Qrcyk9Cnt2YXIgbz0zRHgu
a2V5cyhlKTtzPTNEby5sZW5ndGh9VChlLGZ1bmN0aW9uKHUsYSxmKXthPTNEbz9vWy0tc106LS1z
LGk/bj0zRD0KdC5jYWxsKHIsbixlW2FdLGEsZik6KG49M0RlW2FdLGk9M0QhMCl9KTtpZighaSl0
aHJvdyBuZXcgVHlwZUVycm9yKE4pO3JldHVyPQpuIG59LHguZmluZD0zRHguZGV0ZWN0PTNEZnVu
Y3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiBDKGUsZnVuY3Rpb24oZSxpLHMpe2k9CmYodC5jYWxs
KG4sZSxpLHMpKXJldHVybiByPTNEZSwhMH0pLHJ9LHguZmlsdGVyPTNEeC5zZWxlY3Q9M0RmdW5j
dGlvbihlLHQsbj0KKXt2YXIgcj0zRFtdO3JldHVybiBlPTNEPTNEbnVsbD9yOnYmJmUuZmlsdGVy
PTNEPTNEPTNEdj9lLmZpbHRlcih0LG4pOihUKGUsPQpmdW5jdGlvbihlLGkscyl7dC5jYWxsKG4s
ZSxpLHMpJiZyLnB1c2goZSl9KSxyKX0seC5yZWplY3Q9M0RmdW5jdGlvbihlLHQsbik9CntyZXR1
cm4geC5maWx0ZXIoZSxmdW5jdGlvbihlLHIsaSl7cmV0dXJuIXQuY2FsbChuLGUscixpKX0sbil9
LHguZXZlcnk9M0R4Lj0KYWxsPTNEZnVuY3Rpb24oZSx0LHIpe3R8fCh0PTNEeC5pZGVudGl0eSk7
dmFyIGk9M0QhMDtyZXR1cm4gZT0zRD0zRG51bGw/aTptPQomJmUuZXZlcnk9M0Q9M0Q9M0RtP2Uu
ZXZlcnkodCxyKTooVChlLGZ1bmN0aW9uKGUscyxvKXtpZighKGk9M0RpJiZ0LmNhbGwociw9CmUs
cyxvKSkpcmV0dXJuIG59KSwhIWkpfTt2YXIgQz0zRHguc29tZT0zRHguYW55PTNEZnVuY3Rpb24o
ZSx0LHIpe3R8fCh0PTNEeD0KLmlkZW50aXR5KTt2YXIgaT0zRCExO3JldHVybiBlPTNEPTNEbnVs
bD9pOmcmJmUuc29tZT0zRD0zRD0zRGc/ZS5zb21lKHQscik6PQooVChlLGZ1bmN0aW9uKGUscyxv
KXtpZihpfHwoaT0zRHQuY2FsbChyLGUscyxvKSkpcmV0dXJuIG59KSwhIWkpfTt4LmNvbnRhaW49
CnM9M0R4LmluY2x1ZGU9M0RmdW5jdGlvbihlLHQpe3JldHVybiBlPTNEPTNEbnVsbD8hMTp5JiZl
LmluZGV4T2Y9M0Q9M0Q9M0R5Pz0KZS5pbmRleE9mKHQpIT0zRC0xOkMoZSxmdW5jdGlvbihlKXty
ZXR1cm4gZT0zRD0zRD0zRHR9KX0seC5pbnZva2U9M0RmdW5jdGlvPQpuKGUsdCl7dmFyIG49M0R1
LmNhbGwoYXJndW1lbnRzLDIpLHI9M0R4LmlzRnVuY3Rpb24odCk7cmV0dXJuIHgubWFwKGUsZnVu
Y3Q9CmlvbihlKXtyZXR1cm4ocj90OmVbdF0pLmFwcGx5KGUsbil9KX0seC5wbHVjaz0zRGZ1bmN0
aW9uKGUsdCl7cmV0dXJuIHgubWFwKD0KZSxmdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0pfSx4Lndo
ZXJlPTNEZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmlzRW1wdHkodCk/PQpuP3ZvaWQgMDpbXTp4
W24/ImZpbmQiOiJmaWx0ZXIiXShlLGZ1bmN0aW9uKGUpe2Zvcih2YXIgbiBpbiB0KWlmKHRbbl0h
PTNEPQo9M0RlW25dKXJldHVybiExO3JldHVybiEwfSl9LHguZmluZFdoZXJlPTNEZnVuY3Rpb24o
ZSx0KXtyZXR1cm4geC53aGVyZShlLHQ9CiwhMCl9LHgubWF4PTNEZnVuY3Rpb24oZSx0LG4pe2lm
KCF0JiZ4LmlzQXJyYXkoZSkmJmVbMF09M0Q9M0Q9M0QrZVswXSYmZS5sZT0Kbmd0aDw2NTUzNSly
ZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCxlKTtpZighdCYmeC5pc0VtcHR5KGUpKXJldHVybi1J
bmZpbml0PQp5O3ZhciByPTNEe2NvbXB1dGVkOi1JbmZpbml0eSx2YWx1ZTotSW5maW5pdHl9O3Jl
dHVybiBUKGUsZnVuY3Rpb24oZSxpLHMpe3Y9CmFyIG89M0R0P3QuY2FsbChuLGUsaSxzKTplO28+
PTNEci5jb21wdXRlZCYmKHI9M0R7dmFsdWU6ZSxjb21wdXRlZDpvfSl9KSxyLj0KdmFsdWV9LHgu
bWluPTNEZnVuY3Rpb24oZSx0LG4pe2lmKCF0JiZ4LmlzQXJyYXkoZSkmJmVbMF09M0Q9M0Q9M0Qr
ZVswXSYmZS5sPQplbmd0aDw2NTUzNSlyZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCxlKTtpZigh
dCYmeC5pc0VtcHR5KGUpKXJldHVybiBJbmZpbmk9CnR5O3ZhciByPTNEe2NvbXB1dGVkOkluZmlu
aXR5LHZhbHVlOkluZmluaXR5fTtyZXR1cm4gVChlLGZ1bmN0aW9uKGUsaSxzKXt2YT0KciBvPTNE
dD90LmNhbGwobixlLGkscyk6ZTtvPHIuY29tcHV0ZWQmJihyPTNEe3ZhbHVlOmUsY29tcHV0ZWQ6
b30pfSksci52YWx1PQplfSx4LnNodWZmbGU9M0RmdW5jdGlvbihlKXt2YXIgdCxuPTNEMCxyPTNE
W107cmV0dXJuIFQoZSxmdW5jdGlvbihlKXt0PTNEeC49CnJhbmRvbShuKyspLHJbbi0xXT0zRHJb
dF0sclt0XT0zRGV9KSxyfTt2YXIgaz0zRGZ1bmN0aW9uKGUpe3JldHVybiB4LmlzRnVuYz0KdGlv
bihlKT9lOmZ1bmN0aW9uKHQpe3JldHVybiB0W2VdfX07eC5zb3J0Qnk9M0RmdW5jdGlvbihlLHQs
bil7dmFyIHI9M0RrKHQpPQo7cmV0dXJuIHgucGx1Y2soeC5tYXAoZSxmdW5jdGlvbihlLHQsaSl7
cmV0dXJue3ZhbHVlOmUsaW5kZXg6dCxjcml0ZXJpYTpyLmM9CmFsbChuLGUsdCxpKX19KS5zb3J0
KGZ1bmN0aW9uKGUsdCl7dmFyIG49M0RlLmNyaXRlcmlhLHI9M0R0LmNyaXRlcmlhO2lmKG4hPQo9
M0Q9M0RyKXtpZihuPnJ8fG49M0Q9M0Q9M0R2b2lkIDApcmV0dXJuIDE7aWYobjxyfHxyPTNEPTNE
PTNEdm9pZCAwKXJldHVybi09CjF9cmV0dXJuIGUuaW5kZXg8dC5pbmRleD8tMToxfSksInZhbHVl
Iil9O3ZhciBMPTNEZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Cj0zRHt9LHM9M0RrKHQ9M0Q9M0Ru
dWxsP3guaWRlbnRpdHk6dCk7cmV0dXJuIFQoZSxmdW5jdGlvbih0LG8pe3ZhciB1PTNEcy5jYT0K
bGwobix0LG8sZSk7cihpLHUsdCl9KSxpfTt4Lmdyb3VwQnk9M0RmdW5jdGlvbihlLHQsbil7cmV0
dXJuIEwoZSx0LG4sZnVuY3RpPQpvbihlLHQsbil7KHguaGFzKGUsdCk/ZVt0XTplW3RdPTNEW10p
LnB1c2gobil9KX0seC5jb3VudEJ5PTNEZnVuY3Rpb24oZSx0LG49Cil7cmV0dXJuIEwoZSx0LG4s
ZnVuY3Rpb24oZSx0KXt4LmhhcyhlLHQpfHwoZVt0XT0zRDApLGVbdF0rK30pfSx4LnNvcnRlZElu
ZD0KZXg9M0RmdW5jdGlvbihlLHQsbixyKXtuPTNEbj0zRD0zRG51bGw/eC5pZGVudGl0eTprKG4p
O3ZhciBpPTNEbi5jYWxsKHIsdCksPQpzPTNEMCxvPTNEZS5sZW5ndGg7d2hpbGUoczxvKXt2YXIg
dT0zRHMrbz4+PjE7bi5jYWxsKHIsZVt1XSk8aT9zPTNEdSsxOm89M0Q9CnV9cmV0dXJuIHN9LHgu
dG9BcnJheT0zRGZ1bmN0aW9uKGUpe3JldHVybiBlP3guaXNBcnJheShlKT91LmNhbGwoZSk6ZS5s
ZW5ndD0KaD0zRD0zRD0zRCtlLmxlbmd0aD94Lm1hcChlLHguaWRlbnRpdHkpOngudmFsdWVzKGUp
OltdfSx4LnNpemU9M0RmdW5jdGlvbihlPQope3JldHVybiBlPTNEPTNEbnVsbD8wOmUubGVuZ3Ro
PTNEPTNEPTNEK2UubGVuZ3RoP2UubGVuZ3RoOngua2V5cyhlKS5sZW5ndGg9Cn0seC5maXJzdD0z
RHguaGVhZD0zRHgudGFrZT0zRGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0zRD0zRG51bGw/dm9p
ZCAwOnQhPQo9M0RudWxsJiYhbj91LmNhbGwoZSwwLHQpOmVbMF19LHguaW5pdGlhbD0zRGZ1bmN0
aW9uKGUsdCxuKXtyZXR1cm4gdS5jYWxsKGU9CiwwLGUubGVuZ3RoLSh0PTNEPTNEbnVsbHx8bj8x
OnQpKX0seC5sYXN0PTNEZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPTNEPTNEbj0KdWxsP3ZvaWQg
MDp0IT0zRG51bGwmJiFuP3UuY2FsbChlLE1hdGgubWF4KGUubGVuZ3RoLXQsMCkpOmVbZS5sZW5n
dGgtMV19LHguPQpyZXN0PTNEeC50YWlsPTNEeC5kcm9wPTNEZnVuY3Rpb24oZSx0LG4pe3JldHVy
biB1LmNhbGwoZSx0PTNEPTNEbnVsbHx8bj8xOnQ9Cil9LHguY29tcGFjdD0zRGZ1bmN0aW9uKGUp
e3JldHVybiB4LmZpbHRlcihlLHguaWRlbnRpdHkpfTt2YXIgQT0zRGZ1bmN0aW9uKD0KZSx0LG4p
e3JldHVybiBUKGUsZnVuY3Rpb24oZSl7eC5pc0FycmF5KGUpP3Q/by5hcHBseShuLGUpOkEoZSx0
LG4pOm4ucHVzaChlPQopfSksbn07eC5mbGF0dGVuPTNEZnVuY3Rpb24oZSx0KXtyZXR1cm4gQShl
LHQsW10pfSx4LndpdGhvdXQ9M0RmdW5jdGlvbihlKXs9CnJldHVybiB4LmRpZmZlcmVuY2UoZSx1
LmNhbGwoYXJndW1lbnRzLDEpKX0seC51bmlxPTNEeC51bmlxdWU9M0RmdW5jdGlvbihlLD0KdCxu
LHIpe3guaXNGdW5jdGlvbih0KSYmKHI9M0RuLG49M0R0LHQ9M0QhMSk7dmFyIGk9M0RuP3gubWFw
KGUsbixyKTplLHM9M0RbPQpdLG89M0RbXTtyZXR1cm4gVChpLGZ1bmN0aW9uKG4scil7aWYodD8h
cnx8b1tvLmxlbmd0aC0xXSE9M0Q9M0RuOiF4LmNvbnRhaW49CnMobyxuKSlvLnB1c2gobikscy5w
dXNoKGVbcl0pfSksc30seC51bmlvbj0zRGZ1bmN0aW9uKCl7cmV0dXJuIHgudW5pcShhLmFwcD0K
bHkocixhcmd1bWVudHMpKX0seC5pbnRlcnNlY3Rpb249M0RmdW5jdGlvbihlKXt2YXIgdD0zRHUu
Y2FsbChhcmd1bWVudHMsMSk7PQpyZXR1cm4geC5maWx0ZXIoeC51bmlxKGUpLGZ1bmN0aW9uKGUp
e3JldHVybiB4LmV2ZXJ5KHQsZnVuY3Rpb24odCl7cmV0dXJuIHg9Ci5pbmRleE9mKHQsZSk+PTNE
MH0pfSl9LHguZGlmZmVyZW5jZT0zRGZ1bmN0aW9uKGUpe3ZhciB0PTNEYS5hcHBseShyLHUuY2Fs
bD0KKGFyZ3VtZW50cywxKSk7cmV0dXJuIHguZmlsdGVyKGUsZnVuY3Rpb24oZSl7cmV0dXJuIXgu
Y29udGFpbnModCxlKX0pfSx4LnppPQpwPTNEZnVuY3Rpb24oKXt2YXIgZT0zRHUuY2FsbChhcmd1
bWVudHMpLHQ9M0R4Lm1heCh4LnBsdWNrKGUsImxlbmd0aCIpKSxuPQo9M0RuZXcgQXJyYXkodCk7
Zm9yKHZhciByPTNEMDtyPHQ7cisrKW5bcl09M0R4LnBsdWNrKGUsIiIrcik7cmV0dXJuIG59LHgu
dW49CnppcD0zRGZ1bmN0aW9uKGUpe3ZhciB0PTNEW107cmV0dXJuIHguZWFjaChlLGZ1bmN0aW9u
KGUsbil7eC5lYWNoKGUsZnVuY3Rpbz0KbihlLHIpe3QubGVuZ3RoPD0zRHImJih0W3JdPTNEW10p
LHRbcl1bbl09M0RlfSl9KSx0fSx4Lm9iamVjdD0zRGZ1bmN0aW9uKGUsPQp0KXtpZihlPTNEPTNE
bnVsbClyZXR1cm57fTt2YXIgbj0zRHt9O2Zvcih2YXIgcj0zRDAsaT0zRGUubGVuZ3RoO3I8aTty
KyspdD89Cm5bZVtyXV09M0R0W3JdOm5bZVtyXVswXV09M0RlW3JdWzFdO3JldHVybiBufSx4Lmlu
ZGV4T2Y9M0RmdW5jdGlvbihlLHQsbil7aT0KZihlPTNEPTNEbnVsbClyZXR1cm4tMTt2YXIgcj0z
RDAsaT0zRGUubGVuZ3RoO2lmKG4pe2lmKHR5cGVvZiBuIT0zRCJudW1iZXIiPQopcmV0dXJuIHI9
M0R4LnNvcnRlZEluZGV4KGUsdCksZVtyXT0zRD0zRD0zRHQ/cjotMTtyPTNEbjwwP01hdGgubWF4
KDAsaStuKTo9Cm59aWYoeSYmZS5pbmRleE9mPTNEPTNEPTNEeSlyZXR1cm4gZS5pbmRleE9mKHQs
bik7Zm9yKDtyPGk7cisrKWlmKGVbcl09M0Q9Cj0zRD0zRHQpcmV0dXJuIHI7cmV0dXJuLTF9LHgu
bGFzdEluZGV4T2Y9M0RmdW5jdGlvbihlLHQsbil7aWYoZT0zRD0zRG51bGwpcj0KZXR1cm4tMTt2
YXIgcj0zRG4hPTNEbnVsbDtpZihiJiZlLmxhc3RJbmRleE9mPTNEPTNEPTNEYilyZXR1cm4gcj9l
Lmxhc3RJbmRlPQp4T2YodCxuKTplLmxhc3RJbmRleE9mKHQpO3ZhciBpPTNEcj9uOmUubGVuZ3Ro
O3doaWxlKGktLSlpZihlW2ldPTNEPTNEPTNEdCk9CnJldHVybiBpO3JldHVybi0xfSx4LnJhbmdl
PTNEZnVuY3Rpb24oZSx0LG4pe2FyZ3VtZW50cy5sZW5ndGg8PTNEMSYmKHQ9M0RlfD0KfDAsZT0z
RDApLG49M0Rhcmd1bWVudHNbMl18fDE7dmFyIHI9M0RNYXRoLm1heChNYXRoLmNlaWwoKHQtZSkv
biksMCksaT0zRDAsPQpzPTNEbmV3IEFycmF5KHIpO3doaWxlKGk8cilzW2krK109M0RlLGUrPTNE
bjtyZXR1cm4gc307dmFyIE89M0RmdW5jdGlvbigpe309Cjt4LmJpbmQ9M0RmdW5jdGlvbihlLHQp
e3ZhciBuLHI7aWYoZS5iaW5kPTNEPTNEPTNEUyYmUylyZXR1cm4gUy5hcHBseShlLHUuYz0KYWxs
KGFyZ3VtZW50cywxKSk7aWYoIXguaXNGdW5jdGlvbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yO3Jl
dHVybiBuPTNEdS5jYWxsPQooYXJndW1lbnRzLDIpLHI9M0RmdW5jdGlvbigpe2lmKHRoaXMgaW5z
dGFuY2VvZiByKXtPLnByb3RvdHlwZT0zRGUucHJvdG90eXA9CmU7dmFyIGk9M0RuZXcgTztPLnBy
b3RvdHlwZT0zRG51bGw7dmFyIHM9M0RlLmFwcGx5KGksbi5jb25jYXQodS5jYWxsKGFyZ3VtZT0K
bnRzKSkpO3JldHVybiBPYmplY3Qocyk9M0Q9M0Q9M0RzP3M6aX1yZXR1cm4gZS5hcHBseSh0LG4u
Y29uY2F0KHUuY2FsbChhcmd1PQptZW50cykpKX19LHgucGFydGlhbD0zRGZ1bmN0aW9uKGUpe3Zh
ciB0PTNEdS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Q9Cmlvbigpe3JldHVybiBlLmFw
cGx5KHRoaXMsdC5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX19LHguYmluZEFsbD0zRGZ1bmN0
aT0Kb24oZSl7dmFyIHQ9M0R1LmNhbGwoYXJndW1lbnRzLDEpO2lmKHQubGVuZ3RoPTNEPTNEPTNE
MCl0aHJvdyBuZXcgRXJyb3IoImJpPQpuZEFsbCBtdXN0IGJlIHBhc3NlZCBmdW5jdGlvbiBuYW1l
cyIpO3JldHVybiBUKHQsZnVuY3Rpb24odCl7ZVt0XT0zRHguYmluZCg9CmVbdF0sZSl9KSxlfSx4
Lm1lbW9pemU9M0RmdW5jdGlvbihlLHQpe3ZhciBuPTNEe307cmV0dXJuIHR8fCh0PTNEeC5pZGVu
dGl0eT0KKSxmdW5jdGlvbigpe3ZhciByPTNEdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJu
IHguaGFzKG4scik/bltyXTpuW3JdPTNEPQplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LHguZGVs
YXk9M0RmdW5jdGlvbihlLHQpe3ZhciBuPTNEdS5jYWxsKGFyZ3VtZW50cyw9CjIpO3JldHVybiBz
ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX0sdCl9LHguZGVmZXI9
M0RmdW5jdD0KaW9uKGUpe3JldHVybiB4LmRlbGF5LmFwcGx5KHgsW2UsMV0uY29uY2F0KHUuY2Fs
bChhcmd1bWVudHMsMSkpKX0seC50aHJvdHRsPQplPTNEZnVuY3Rpb24oZSx0LG4pe3ZhciByLGks
cyxvLHU9M0QwLGE9M0RmdW5jdGlvbigpe3U9M0RuZXcgRGF0ZSxzPTNEbnVsbCw9Cm89M0RlLmFw
cGx5KHIsaSl9O3JldHVybiBmdW5jdGlvbigpe3ZhciBmPTNEbmV3IERhdGU7IXUmJm49M0Q9M0Q9
M0QhMSYmKHU9Cj0zRGYpO3ZhciBsPTNEdC0oZi11KTtyZXR1cm4gcj0zRHRoaXMsaT0zRGFyZ3Vt
ZW50cyxsPD0zRDA/KGNsZWFyVGltZW91dChzKT0KLHM9M0RudWxsLHU9M0RmLG89M0RlLmFwcGx5
KHIsaSkpOnN8fChzPTNEc2V0VGltZW91dChhLGwpKSxvfX0seC5kZWJvdW5jZT0KPTNEZnVuY3Rp
b24oZSx0LG4pe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9M0R0aGlzLG89M0Rhcmd1
bWVudHMsdT0KPTNEZnVuY3Rpb24oKXtyPTNEbnVsbCxufHwoaT0zRGUuYXBwbHkocyxvKSl9LGE9
M0RuJiYhcjtyZXR1cm4gY2xlYXJUaW1lb3V0PQoocikscj0zRHNldFRpbWVvdXQodSx0KSxhJiYo
aT0zRGUuYXBwbHkocyxvKSksaX19LHgub25jZT0zRGZ1bmN0aW9uKGUpe3ZhciA9CnQ9M0QhMSxu
O3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0P246KHQ9M0QhMCxuPTNEZS5hcHBseSh0aGlzLGFy
Z3VtZW50cyksZT0KPTNEbnVsbCxuKX19LHgud3JhcD0zRGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1
bmN0aW9uKCl7dmFyIG49M0RbZV07cmV0dXJuIG8uPQphcHBseShuLGFyZ3VtZW50cyksdC5hcHBs
eSh0aGlzLG4pfX0seC5jb21wb3NlPTNEZnVuY3Rpb24oKXt2YXIgZT0zRGFyZ3VtZW49CnRzO3Jl
dHVybiBmdW5jdGlvbigpe3ZhciB0PTNEYXJndW1lbnRzO2Zvcih2YXIgbj0zRGUubGVuZ3RoLTE7
bj49M0QwO24tLSl0PQo9M0RbZVtuXS5hcHBseSh0aGlzLHQpXTtyZXR1cm4gdFswXX19LHguYWZ0
ZXI9M0RmdW5jdGlvbihlLHQpe3JldHVybiBlPD0zRDA9Cj90KCk6ZnVuY3Rpb24oKXtpZigtLWU8
MSlyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx4LmtleXM9M0RFfHxmdW5jdD0KaW9u
KGUpe2lmKGUhPTNEPTNET2JqZWN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgb2Jq
ZWN0Iik7dmFyIHQ9M0RbPQpdO2Zvcih2YXIgbiBpbiBlKXguaGFzKGUsbikmJnQucHVzaChuKTty
ZXR1cm4gdH0seC52YWx1ZXM9M0RmdW5jdGlvbihlKXt2YXI9CiB0PTNEW107Zm9yKHZhciBuIGlu
IGUpeC5oYXMoZSxuKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fSx4LnBhaXJzPTNEZnVuY3Rpbz0K
bihlKXt2YXIgdD0zRFtdO2Zvcih2YXIgbiBpbiBlKXguaGFzKGUsbikmJnQucHVzaChbbixlW25d
XSk7cmV0dXJuIHR9LHguaW52PQplcnQ9M0RmdW5jdGlvbihlKXt2YXIgdD0zRHt9O2Zvcih2YXIg
biBpbiBlKXguaGFzKGUsbikmJih0W2Vbbl1dPTNEbik7cmV0dXI9Cm4gdH0seC5mdW5jdGlvbnM9
M0R4Lm1ldGhvZHM9M0RmdW5jdGlvbihlKXt2YXIgdD0zRFtdO2Zvcih2YXIgbiBpbiBlKXguaXNG
dT0KbmN0aW9uKGVbbl0pJiZ0LnB1c2gobik7cmV0dXJuIHQuc29ydCgpfSx4LmV4dGVuZD0zRGZ1
bmN0aW9uKGUpe3JldHVybiBUKHUuPQpjYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlvbih0KXtpZih0
KWZvcih2YXIgbiBpbiB0KWVbbl09M0R0W25dfSksZX0seC5waWNrPQo9M0RmdW5jdGlvbihlKXt2
YXIgdD0zRHt9LG49M0RhLmFwcGx5KHIsdS5jYWxsKGFyZ3VtZW50cywxKSk7cmV0dXJuIFQobixm
dW49CmN0aW9uKG4pe24gaW4gZSYmKHRbbl09M0RlW25dKX0pLHR9LHgub21pdD0zRGZ1bmN0aW9u
KGUpe3ZhciB0PTNEe30sbj0zRGEuYT0KcHBseShyLHUuY2FsbChhcmd1bWVudHMsMSkpO2Zvcih2
YXIgaSBpbiBlKXguY29udGFpbnMobixpKXx8KHRbaV09M0RlW2ldKTtyPQpldHVybiB0fSx4LmRl
ZmF1bHRzPTNEZnVuY3Rpb24oZSl7cmV0dXJuIFQodS5jYWxsKGFyZ3VtZW50cywxKSxmdW5jdGlv
bih0KXs9CmlmKHQpZm9yKHZhciBuIGluIHQpZVtuXT0zRD0zRD0zRHZvaWQgMCYmKGVbbl09M0R0
W25dKX0pLGV9LHguY2xvbmU9M0RmdW5jdD0KaW9uKGUpe3JldHVybiB4LmlzT2JqZWN0KGUpP3gu
aXNBcnJheShlKT9lLnNsaWNlKCk6eC5leHRlbmQoe30sZSk6ZX0seC50YXA9Cj0zRGZ1bmN0aW9u
KGUsdCl7cmV0dXJuIHQoZSksZX07dmFyIE09M0RmdW5jdGlvbihlLHQsbixyKXtpZihlPTNEPTNE
PTNEdClyZT0KdHVybiBlIT0zRD0zRDB8fDEvZT0zRD0zRDEvdDtpZihlPTNEPTNEbnVsbHx8dD0z
RD0zRG51bGwpcmV0dXJuIGU9M0Q9M0Q9M0R0PQo7ZSBpbnN0YW5jZW9mIHgmJihlPTNEZS5fd3Jh
cHBlZCksdCBpbnN0YW5jZW9mIHgmJih0PTNEdC5fd3JhcHBlZCk7dmFyIGk9M0Q9CmYuY2FsbChl
KTtpZihpIT0zRGYuY2FsbCh0KSlyZXR1cm4hMTtzd2l0Y2goaSl7Y2FzZSJbb2JqZWN0IFN0cmlu
Z10iOnJldHVybj0KIGU9M0Q9M0RTdHJpbmcodCk7Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVy
biBlIT0zRCtlP3QhPTNEK3Q6ZT0zRD0zRDA/MS9lPQo9M0Q9M0QxL3Q6ZT0zRD0zRCt0O2Nhc2Ui
W29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpyZXR1cm4rZT0zRD0KPTNEK3Q7
Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOnJldHVybiBlLnNvdXJjZT0zRD0zRHQuc291cmNlJiZlLmds
b2JhbD0zRD0zRHQuPQpnbG9iYWwmJmUubXVsdGlsaW5lPTNEPTNEdC5tdWx0aWxpbmUmJmUuaWdu
b3JlQ2FzZT0zRD0zRHQuaWdub3JlQ2FzZX1pZih0eXA9CmVvZiBlIT0zRCJvYmplY3QifHx0eXBl
b2YgdCE9M0Qib2JqZWN0IilyZXR1cm4hMTt2YXIgcz0zRG4ubGVuZ3RoO3doaWxlKHMtLT0KKWlm
KG5bc109M0Q9M0RlKXJldHVybiByW3NdPTNEPTNEdDtuLnB1c2goZSksci5wdXNoKHQpO3ZhciBv
PTNEMCx1PTNEITA7aWYoPQppPTNEPTNEIltvYmplY3QgQXJyYXldIil7bz0zRGUubGVuZ3RoLHU9
M0RvPTNEPTNEdC5sZW5ndGg7aWYodSl3aGlsZShvLS0paWY9CighKHU9M0RNKGVbb10sdFtvXSxu
LHIpKSlicmVha31lbHNle3ZhciBhPTNEZS5jb25zdHJ1Y3RvcixsPTNEdC5jb25zdHJ1Y3Rvcj0K
O2lmKGEhPTNEPTNEbCYmISh4LmlzRnVuY3Rpb24oYSkmJmEgaW5zdGFuY2VvZiBhJiZ4LmlzRnVu
Y3Rpb24obCkmJmwgaW5zdGFuPQpjZW9mIGwpKXJldHVybiExO2Zvcih2YXIgYyBpbiBlKWlmKHgu
aGFzKGUsYykpe28rKztpZighKHU9M0R4Lmhhcyh0LGMpJiZNKGU9CltjXSx0W2NdLG4scikpKWJy
ZWFrfWlmKHUpe2ZvcihjIGluIHQpaWYoeC5oYXModCxjKSYmIShvLS0pKWJyZWFrO3U9M0Qhb319
cj0KZXR1cm4gbi5wb3AoKSxyLnBvcCgpLHV9O3guaXNFcXVhbD0zRGZ1bmN0aW9uKGUsdCl7cmV0
dXJuIE0oZSx0LFtdLFtdKX0seC5pPQpzRW1wdHk9M0RmdW5jdGlvbihlKXtpZihlPTNEPTNEbnVs
bClyZXR1cm4hMDtpZih4LmlzQXJyYXkoZSl8fHguaXNTdHJpbmcoZSk9CilyZXR1cm4gZS5sZW5n
dGg9M0Q9M0Q9M0QwO2Zvcih2YXIgdCBpbiBlKWlmKHguaGFzKGUsdCkpcmV0dXJuITE7cmV0dXJu
ITB9LD0KeC5pc0VsZW1lbnQ9M0RmdW5jdGlvbihlKXtyZXR1cm4hIWUmJmUubm9kZVR5cGU9M0Q9
M0Q9M0QxfSx4LmlzQXJyYXk9M0R3fHxmPQp1bmN0aW9uKGUpe3JldHVybiBmLmNhbGwoZSk9M0Q9
M0QiW29iamVjdCBBcnJheV0ifSx4LmlzT2JqZWN0PTNEZnVuY3Rpb24oZSk9CntyZXR1cm4gZT0z
RD0zRD0zRE9iamVjdChlKX0sVChbIkFyZ3VtZW50cyIsIkZ1bmN0aW9uIiwiU3RyaW5nIiwiTnVt
YmVyIiwiRD0KYXRlIiwiUmVnRXhwIl0sZnVuY3Rpb24oZSl7eFsiaXMiK2VdPTNEZnVuY3Rpb24o
dCl7cmV0dXJuIGYuY2FsbCh0KT0zRD0zRCJbPQpvYmplY3QgIitlKyJdIn19KSx4LmlzQXJndW1l
bnRzKGFyZ3VtZW50cyl8fCh4LmlzQXJndW1lbnRzPTNEZnVuY3Rpb24oZSl7cmU9CnR1cm4hIWUm
JiEheC5oYXMoZSwiY2FsbGVlIil9KSx0eXBlb2YgLy4vIT0zRCJmdW5jdGlvbiImJih4LmlzRnVu
Y3Rpb249M0RmdT0KbmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT0zRD0zRCJmdW5jdGlvbiJ9KSx4
LmlzRmluaXRlPTNEZnVuY3Rpb24oZSl7cmV0dXJuPQogaXNGaW5pdGUoZSkmJiFpc05hTihwYXJz
ZUZsb2F0KGUpKX0seC5pc05hTj0zRGZ1bmN0aW9uKGUpe3JldHVybiB4LmlzTnVtYmU9CnIoZSkm
JmUhPTNEK2V9LHguaXNCb29sZWFuPTNEZnVuY3Rpb24oZSl7cmV0dXJuIGU9M0Q9M0Q9M0QhMHx8
ZT0zRD0zRD0zRCExfD0KfGYuY2FsbChlKT0zRD0zRCJbb2JqZWN0IEJvb2xlYW5dIn0seC5pc051
bGw9M0RmdW5jdGlvbihlKXtyZXR1cm4gZT0zRD0zRD0KPTNEbnVsbH0seC5pc1VuZGVmaW5lZD0z
RGZ1bmN0aW9uKGUpe3JldHVybiBlPTNEPTNEPTNEdm9pZCAwfSx4Lmhhcz0zRGZ1bmN0PQppb24o
ZSx0KXtyZXR1cm4gbC5jYWxsKGUsdCl9LHgubm9Db25mbGljdD0zRGZ1bmN0aW9uKCl7cmV0dXJu
IGUuXz0zRHQsdGhpc309Cix4LmlkZW50aXR5PTNEZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHgudGlt
ZXM9M0RmdW5jdGlvbihlLHQsbil7dmFyIHI9M0RBcnJheT0KKGUpO2Zvcih2YXIgaT0zRDA7aTxl
O2krKylyW2ldPTNEdC5jYWxsKG4saSk7cmV0dXJuIHJ9LHgucmFuZG9tPTNEZnVuY3Rpb24oPQpl
LHQpe3JldHVybiB0PTNEPTNEbnVsbCYmKHQ9M0RlLGU9M0QwKSxlK01hdGguZmxvb3IoTWF0aC5y
YW5kb20oKSoodC1lKzEpKX09Cjt2YXIgXz0zRHtlc2NhcGU6eyImIjoiJmFtcDsiLCI8IjoiJmx0
OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImI3gyNz0KOyIsIi8iOiImI3gyRjsifX07
Xy51bmVzY2FwZT0zRHguaW52ZXJ0KF8uZXNjYXBlKTt2YXIgRD0zRHtlc2NhcGU6bmV3IFJlZ0V4
PQpwKCJbIit4LmtleXMoXy5lc2NhcGUpLmpvaW4oIiIpKyJdIiwiZyIpLHVuZXNjYXBlOm5ldyBS
ZWdFeHAoIigiK3gua2V5cyhfLnU9Cm5lc2NhcGUpLmpvaW4oInwiKSsiKSIsImciKX07eC5lYWNo
KFsiZXNjYXBlIiwidW5lc2NhcGUiXSxmdW5jdGlvbihlKXt4W2VdPQo9M0RmdW5jdGlvbih0KXty
ZXR1cm4gdD0zRD0zRG51bGw/IiI6KCIiK3QpLnJlcGxhY2UoRFtlXSxmdW5jdGlvbih0KXtyZXR1
cm49CiBfW2VdW3RdfSl9fSkseC5yZXN1bHQ9M0RmdW5jdGlvbihlLHQpe2lmKGU9M0Q9M0RudWxs
KXJldHVybiB2b2lkIDA7dmFyIG49Cj0zRGVbdF07cmV0dXJuIHguaXNGdW5jdGlvbihuKT9uLmNh
bGwoZSk6bn0seC5taXhpbj0zRGZ1bmN0aW9uKGUpe1QoeC5mdW5jdD0KaW9ucyhlKSxmdW5jdGlv
bih0KXt2YXIgbj0zRHhbdF09M0RlW3RdO3gucHJvdG90eXBlW3RdPTNEZnVuY3Rpb24oKXt2YXIg
ZT0KPTNEW3RoaXMuX3dyYXBwZWRdO3JldHVybiBvLmFwcGx5KGUsYXJndW1lbnRzKSxGLmNhbGwo
dGhpcyxuLmFwcGx5KHgsZSkpfX0pPQp9O3ZhciBQPTNEMDt4LnVuaXF1ZUlkPTNEZnVuY3Rpb24o
ZSl7dmFyIHQ9M0QrK1ArIiI7cmV0dXJuIGU/ZSt0OnR9LHgudGVtcGw9CmF0ZVNldHRpbmdzPTNE
e2V2YWx1YXRlOi88JShbXHNcU10rPyklPi9nLGludGVycG9sYXRlOi88JT0zRChbXHNcU10rPykl
Pi9nLD0KZXNjYXBlOi88JS0oW1xzXFNdKz8pJT4vZ307dmFyIEg9M0QvKC4pXi8sQj0zRHsiJyI6
IiciLCJcXCI6IlxcIiwiXHIiOiJyIiwiPQpcbiI6Im4iLCIJIjoidCIsIlx1MjAyOCI6InUyMDI4
IiwiXHUyMDI5IjoidTIwMjkifSxqPTNEL1xcfCd8XHJ8XG58XHR8XHUyMDI9Cjh8XHUyMDI5L2c7
eC50ZW1wbGF0ZT0zRGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtuPTNEeC5kZWZhdWx0cyh7fSxuLHgu
dGVtcGxhdD0KZVNldHRpbmdzKTt2YXIgaT0zRG5ldyBSZWdFeHAoWyhuLmVzY2FwZXx8SCkuc291
cmNlLChuLmludGVycG9sYXRlfHxIKS5zb3VyPQpjZSwobi5ldmFsdWF0ZXx8SCkuc291cmNlXS5q
b2luKCJ8IikrInwkIiwiZyIpLHM9M0QwLG89M0QiX19wKz0zRCciO2UucmVwbGE9CmNlKGksZnVu
Y3Rpb24odCxuLHIsaSx1KXtyZXR1cm4gbys9M0RlLnNsaWNlKHMsdSkucmVwbGFjZShqLGZ1bmN0
aW9uKGUpe3JldD0KdXJuIlxcIitCW2VdfSksbiYmKG8rPTNEIicrXG4oKF9fdD0zRCgiK24rIikp
PTNEPTNEbnVsbD8nJzpfLmVzY2FwZShfX3QpKStcPQpuJyIpLHImJihvKz0zRCInK1xuKChfX3Q9
M0QoIityKyIpKT0zRD0zRG51bGw/Jyc6X190KStcbiciKSxpJiYobys9M0QiJztcbiI9CitpKyJc
bl9fcCs9M0QnIikscz0zRHUrdC5sZW5ndGgsdH0pLG8rPTNEIic7XG4iLG4udmFyaWFibGV8fChv
PTNEIndpdGgob2JqfD0KfHt9KXtcbiIrbysifVxuIiksbz0zRCJ2YXIgX190LF9fcD0zRCcnLF9f
aj0zREFycmF5LnByb3RvdHlwZS5qb2luLHByaW50PTNEPQpmdW5jdGlvbigpe19fcCs9M0RfX2ou
Y2FsbChhcmd1bWVudHMsJycpO307XG4iK28rInJldHVybiBfX3A7XG4iO3RyeXtyPTNEbmU9Cncg
RnVuY3Rpb24obi52YXJpYWJsZXx8Im9iaiIsIl8iLG8pfWNhdGNoKHUpe3Rocm93IHUuc291cmNl
PTNEbyx1fWlmKHQpcmV0dT0Kcm4gcih0LHgpO3ZhciBhPTNEZnVuY3Rpb24oZSl7cmV0dXJuIHIu
Y2FsbCh0aGlzLGUseCl9O3JldHVybiBhLnNvdXJjZT0zRCJmPQp1bmN0aW9uKCIrKG4udmFyaWFi
bGV8fCJvYmoiKSsiKXtcbiIrbysifSIsYX0seC5jaGFpbj0zRGZ1bmN0aW9uKGUpe3JldHVybiA9
CngoZSkuY2hhaW4oKX07dmFyIEY9M0RmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fY2hhaW4/eChl
KS5jaGFpbigpOmV9O3gubWl4aT0Kbih4KSxUKFsicG9wIiwicHVzaCIsInJldmVyc2UiLCJzaGlm
dCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sZnVuY3Rpb24oPQplKXt2YXIgdD0zRHJbZV07
eC5wcm90b3R5cGVbZV09M0RmdW5jdGlvbigpe3ZhciBuPTNEdGhpcy5fd3JhcHBlZDtyZXR1cm4g
dC49CmFwcGx5KG4sYXJndW1lbnRzKSwoZT0zRD0zRCJzaGlmdCJ8fGU9M0Q9M0Qic3BsaWNlIikm
Jm4ubGVuZ3RoPTNEPTNEPTNEMCYmZD0KZWxldGUgblswXSxGLmNhbGwodGhpcyxuKX19KSxUKFsi
Y29uY2F0Iiwiam9pbiIsInNsaWNlIl0sZnVuY3Rpb24oZSl7dmFyIHQ9Cj0zRHJbZV07eC5wcm90
b3R5cGVbZV09M0RmdW5jdGlvbigpe3JldHVybiBGLmNhbGwodGhpcyx0LmFwcGx5KHRoaXMuX3dy
YXBwZT0KZCxhcmd1bWVudHMpKX19KSx4LmV4dGVuZCh4LnByb3RvdHlwZSx7Y2hhaW46ZnVuY3Rp
b24oKXtyZXR1cm4gdGhpcy5fY2hhaW49Cj0zRCEwLHRoaXN9LHZhbHVlOmZ1bmN0aW9uKCl7cmV0
dXJuIHRoaXMuX3dyYXBwZWR9fSl9LmNhbGwodGhpcyksZGVmaW5lKCJsaT0KYnMvdW5kZXJzY29y
ZSIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsbjtyZXR1cm4gdHx8ZS5ffX0o
dGhpcykpPQosZGVmaW5lKCJ1dGlscy91dGlscyIsWyJsaWJzL3VuZGVyc2NvcmUiXSxmdW5jdGlv
bihlKXtmdW5jdGlvbiB0KGUsdCxyKXtuKCI9CkdFVCIsZSx7fSx0LHIpfWZ1bmN0aW9uIG4oZSx0
LG4scixpKXtpZihlPTNEPTNEIkdFVCJ8fGU9M0Q9M0QiREVMRVRFIil0LmluZD0KZXhPZigiPyIp
PTNEPTNELTE/dCs9M0QiPyI6dCs9M0QiJiIsdCs9M0QkLnBhcmFtKG4pO3ZhciBzPTNEbmV3IFhN
TEh0dHBSZXF1PQplc3Q7cy5vcGVuKGUsdCwhMCkscy5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQi
LCJhcHBsaWNhdGlvbi9qc29uIikscy5zZXRSZXE9CnVlc3RIZWFkZXIoIkNhY2hlLUNvbnRyb2wi
LCJuby1jYWNoZSIpLHMuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aD0KIiwiWE1M
SHR0cFJlcXVlc3QiKSxzLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0
aW9uL2pzb24iKSxzPQoub25sb2FkZW5kPTNEZnVuY3Rpb24oKXt2YXIgZT0zRHMuc3RhdHVzO3Ry
eXtyZXNwb25zZT0zRGpRdWVyeS5wYXJzZUpTT04ocy49CnJlc3BvbnNlVGV4dCl9Y2F0Y2godCl7
cmVzcG9uc2U9M0RzLnJlc3BvbnNlVGV4dH1lPTNEPTNEMjAwP3ImJnIocmVzcG9uc2UpOj0KaSYm
aShyZXNwb25zZSl9LGU9M0Q9M0QiR0VUInx8ZT0zRD0zRCJERUxFVEUiP3Muc2VuZCgpOnMuc2Vu
ZChKU09OLnN0cmluZ2lmPQp5KG4pKX1mdW5jdGlvbiByKGUsdCl7dmFyIG49M0QkKCc8ZGl2IGNs
YXNzPTNEIicrZSsnIj48L2Rpdj4nKTtuLmFwcGVuZFRvKCI9CjplcSgwKSIpO3ZhciByPTNEbi5j
c3ModCk7cmV0dXJuIG4ucmVtb3ZlKCkscn1mdW5jdGlvbiBpKGUpeyQoJ2xpbmtbaHJlZl49Cj0z
RCInK2UrJyJdJykubGVuZ3RofHwkKCc8bGluayBocmVmPTNEIicrZ2FsYXh5X2NvbmZpZy5yb290
K2UrJyIgcmVsPTNEInN0eT0KbGVzaGVldCI+JykuYXBwZW5kVG8oImhlYWQiKX1mdW5jdGlvbiBz
KHQsbil7cmV0dXJuIHQ/ZS5kZWZhdWx0cyh0LG4pOm59ZnVuPQpjdGlvbiBvKGUsdCl7dmFyIG49
M0QiIjtpZihlPj0zRDFlMTEpZS89M0QxZTExLG49M0QiVEIiO2Vsc2UgaWYoZT49M0QxZTgpZS89
Cj0zRDFlOCxuPTNEIkdCIjtlbHNlIGlmKGU+PTNEMWU1KWUvPTNEMWU1LG49M0QiTUIiO2Vsc2Ug
aWYoZT49M0QxMDApZS89M0QxMD0KMCxuPTNEIktCIjtlbHNle2lmKCEoZT4wKSlyZXR1cm4iPHN0
cm9uZz4tPC9zdHJvbmc+IjtlKj0zRDEwLG49M0QiYiJ9dmFyIHI9Cj0zRE1hdGgucm91bmQoZSkv
MTA7cmV0dXJuIHQ/cisiICIrbjoiPHN0cm9uZz4iK3IrIjwvc3Ryb25nPiAiK259ZnVuY3Rpb24g
dT0KKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIGEo
ZSl7dmFyIHQ9M0QkKCI8cD48L3A+PQoiKTtyZXR1cm4gdC5hcHBlbmQoZSksdH1mdW5jdGlvbiBm
KCl7dmFyIGU9M0RuZXcgRGF0ZSx0PTNEKGUuZ2V0SG91cnMoKTwxMD89CiIwIjoiIikrZS5nZXRI
b3VycygpLG49M0QoZS5nZXRNaW51dGVzKCk8MTA/IjAiOiIiKStlLmdldE1pbnV0ZXMoKSxyPTNE
ZS5nZT0KdERhdGUoKSsiLyIrKGUuZ2V0TW9udGgoKSsxKSsiLyIrZS5nZXRGdWxsWWVhcigpKyIs
ICIrdCsiOiIrbjtyZXR1cm4gcn1yZXR1PQpybntjc3NMb2FkRmlsZTppLGNzc0dldEF0dHJpYnV0
ZTpyLGdldDp0LG1lcmdlOnMsYnl0ZXNUb1N0cmluZzpvLHV1aWQ6dSx0aW09CmU6Zix3cmFwOmEs
cmVxdWVzdDpufX0pLGRlZmluZSgibXZjL3VpL3VpLXBvcnRsZXQiLFsidXRpbHMvdXRpbHMiXSxm
dW5jdGlvbj0KKGUpe3ZhciB0PTNEQmFja2JvbmUuVmlldy5leHRlbmQoe3Zpc2libGU6ITEsb3B0
aW9uc0RlZmF1bHQ6e3RpdGxlOiIiLGljb246PQoiIixidXR0b25zOm51bGwsYm9keTpudWxsLHNj
cm9sbGFibGU6ITAsbm9wYWRkaW5nOiExLG9wZXJhdGlvbnM6bnVsbCxwbGFjZW09CmVudDoiYm90
dG9tIn0sJHRpdGxlOm51bGwsJGNvbnRlbnQ6bnVsbCwkYnV0dG9uczpudWxsLCRvcGVyYXRpb25z
Om51bGwsaW5pdD0KaWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRGUubWVyZ2UodCx0
aGlzLm9wdGlvbnNEZWZhdWx0KSx0aGlzLnNldEVsPQplbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlz
Lm9wdGlvbnMpKSx0aGlzLiRjb250ZW50PTNEdGhpcy4kZWwuZmluZCgiI2NvbnRlbnQ9CiIpLHRo
aXMuJHRpdGxlPTNEdGhpcy4kZWwuZmluZCgiI3BvcnRsZXQtaGVhZGVyLXRleHQiKTt2YXIgbj0z
RHRoaXMuJGVsLmZpbj0KZCgiI3BvcnRsZXQtY29udGVudCIpO3RoaXMub3B0aW9ucy5zY3JvbGxh
YmxlP24uYWRkQ2xhc3MoInNjcm9sbCIpOnRoaXMub3B0PQppb25zLnRpdGxlP24uYWRkQ2xhc3Mo
Im5vLXNjcm9sbCIpOm4uYWRkQ2xhc3MoIm5vLXNjcm9sbC1uby10aXRsZSIpLHRoaXMub3A9CnRp
b25zLm5vcGFkZGluZyYmKG4uY3NzKCJwYWRkaW5nIiwiMHB4IiksdGhpcy4kY29udGVudC5jc3Mo
InBhZGRpbmciLCIwcHgiKT0KKSx0aGlzLiRidXR0b25zPTNEJCh0aGlzLmVsKS5maW5kKCIjYnV0
dG9ucyIpO2lmKHRoaXMub3B0aW9ucy5idXR0b25zKXt2YXIgPQpyPTNEdGhpczskLmVhY2godGhp
cy5vcHRpb25zLmJ1dHRvbnMsZnVuY3Rpb24oZSx0KXt0LiRlbC5wcm9wKCJpZCIsZSksci4kYnU9
CnR0b25zLmFwcGVuZCh0LiRlbCl9KX1lbHNlIHRoaXMuJGJ1dHRvbnMucmVtb3ZlKCk7dGhpcy4k
b3BlcmF0aW9ucz0zRCQodGhpcz0KLmVsKS5maW5kKCIjb3BlcmF0aW9ucyIpO2lmKHRoaXMub3B0
aW9ucy5vcGVyYXRpb25zKXt2YXIgcj0zRHRoaXM7JC5lYWNoKHRoPQppcy5vcHRpb25zLm9wZXJh
dGlvbnMsZnVuY3Rpb24oZSx0KXt0LiRlbC5wcm9wKCJpZCIsZSksci4kb3BlcmF0aW9ucy5hcHBl
bmQ9Cih0LiRlbCl9KX10aGlzLm9wdGlvbnMuYm9keSYmdGhpcy5hcHBlbmQodGhpcy5vcHRpb25z
LmJvZHkpfSxhcHBlbmQ6ZnVuY3Rpbz0Kbih0KXt0aGlzLiRjb250ZW50LmFwcGVuZChlLndyYXAo
dCkpfSxjb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNvbnRlPQpudH0sc2hvdzpmdW5j
dGlvbigpe3RoaXMuJGVsLmZhZGVJbigiZmFzdCIpLHRoaXMudmlzaWJsZT0zRCEwfSxoaWRlOmZ1
bmN0aW89Cm4oKXt0aGlzLiRlbC5mYWRlT3V0KCJmYXN0IiksdGhpcy52aXNpYmxlPTNEITF9LGVu
YWJsZUJ1dHRvbjpmdW5jdGlvbihlKXt0aD0KaXMuJGJ1dHRvbnMuZmluZCgiIyIrZSkucHJvcCgi
ZGlzYWJsZWQiLCExKX0sZGlzYWJsZUJ1dHRvbjpmdW5jdGlvbihlKXt0aGlzPQouJGJ1dHRvbnMu
ZmluZCgiIyIrZSkucHJvcCgiZGlzYWJsZWQiLCEwKX0saGlkZU9wZXJhdGlvbjpmdW5jdGlvbihl
KXt0aGlzLiQ9Cm9wZXJhdGlvbnMuZmluZCgiIyIrZSkuaGlkZSgpfSxzaG93T3BlcmF0aW9uOmZ1
bmN0aW9uKGUpe3RoaXMuJG9wZXJhdGlvbnMuZj0KaW5kKCIjIitlKS5zaG93KCl9LHNldE9wZXJh
dGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPTNEdGhpcy4kb3BlcmF0aW9ucy5maW5kPQooIiMiK2Up
O24ub2ZmKCJjbGljayIpLG4ub24oImNsaWNrIix0KX0sdGl0bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9
M0R0aGlzLiR0aXQ9CmxlO3JldHVybiBlJiZ0Lmh0bWwoZSksdC5odG1sKCl9LF90ZW1wbGF0ZTpm
dW5jdGlvbihlKXt2YXIgdD0zRCc8ZGl2IGNsYXNzPQo9M0QidWktcG9ydGxldCI+JztyZXR1cm4g
ZS50aXRsZSYmKHQrPTNEJzxkaXYgaWQ9M0QicG9ydGxldC1oZWFkZXIiIGNsYXNzPQo9M0QicG9y
dGxldC1oZWFkZXIiPjxkaXYgaWQ9M0Qib3BlcmF0aW9ucyIgc3R5bGU9M0QiZmxvYXQ6IHJpZ2h0
OyI+PC9kaXY+PGg9CjM+JyxlLmljb24mJih0Kz0zRCc8aSBjbGFzcz0zRCJpY29uIGZhICcrZS5p
Y29uKyciPiZuYnNwOzwvaT4nKSx0Kz0zRCc8c3Bhbj0KIGlkPTNEInBvcnRsZXQtaGVhZGVyLXRl
eHQiPicrZS50aXRsZSsiPC9zcGFuPiIrIjwvaDM+IisiPC9kaXY+IiksdCs9M0QnPGRpPQp2IGlk
PTNEInBvcnRsZXQtY29udGVudCIgY2xhc3M9M0QicG9ydGxldC1jb250ZW50Ij4nLGUucGxhY2Vt
ZW50PTNEPTNEInRvcCI9CiYmKHQrPTNEJzxkaXYgaWQ9M0QiYnV0dG9ucyIgY2xhc3M9M0QiYnV0
dG9ucyI+PC9kaXY+JyksdCs9M0QnPGRpdiBpZD0zRCJjbz0KbnRlbnQiIGNsYXNzPTNEImNvbnRl
bnQiPjwvZGl2PicsZS5wbGFjZW1lbnQ9M0Q9M0QiYm90dG9tIiYmKHQrPTNEJzxkaXYgaWQ9Cj0z
RCJidXR0b25zIiBjbGFzcz0zRCJidXR0b25zIj48L2Rpdj4nKSx0Kz0zRCI8L2Rpdj48L2Rpdj4i
LHR9fSk7cmV0dXJue1ZpZT0Kdzp0fX0pLGRlZmluZSgicGx1Z2luL2xpYnJhcnkvdWktc2VsZWN0
IixbInV0aWxzL3V0aWxzIl0sZnVuY3Rpb24oZSl7dmFyIHQ9Cj0zREJhY2tib25lLlZpZXcuZXh0
ZW5kKHtvcHRpb25zRGVmYXVsdDp7aWQ6IiIsY2xzOiIiLGVtcHR5OiJObyBkYXRhIGF2YWlsYT0K
YmxlIix2aXNpYmxlOiEwLHdhaXQ6ITF9LHNlbGVjdGVkOm51bGwsaW5pdGlhbGl6ZTpmdW5jdGlv
bih0KXt0aGlzLm9wdGlvbnM9Cj0zRGUubWVyZ2UodCx0aGlzLm9wdGlvbnNEZWZhdWx0KSx0aGlz
LnNlbGVjdGVkPTNEdGhpcy5vcHRpb25zLnZhbHVlLHRoaXMucz0KZXRFbGVtZW50KHRoaXMuX3Rl
bXBsYXRlKHRoaXMub3B0aW9ucykpLHRoaXMuJHNlbGVjdD0zRHRoaXMuJGVsLmZpbmQoIiNzZWxl
PQpjdCIpLHRoaXMuJGljb249M0R0aGlzLiRlbC5maW5kKCIjaWNvbiIpO3ZhciBuPTNEdGhpczt0
aGlzLiRzZWxlY3Qub24oImNoYW49CmdlIixmdW5jdGlvbigpe24udmFsdWUobi4kc2VsZWN0LnZh
bCgpKX0pLHRoaXMub24oImNoYW5nZSIsZnVuY3Rpb24oKXtuLm9wdD0KaW9ucy5vbmNoYW5nZSYm
bi5vcHRpb25zLm9uY2hhbmdlKG4udmFsdWUoKSl9KSx0aGlzLl9yZWZyZXNoKCksdGhpcy5vcHRp
b25zPQoudmlzaWJsZXx8dGhpcy5oaWRlKCksdGhpcy5vcHRpb25zLndhaXQ/dGhpcy53YWl0KCk6
dGhpcy5zaG93KCl9LHZhbHVlOmZ1bmM9CnRpb24oZSl7dmFyIHQ9M0R0aGlzLnNlbGVjdGVkO2Uh
PTNEPTNEdW5kZWZpbmVkJiYodGhpcy5zZWxlY3RlZD0zRGUsdGhpcy4kcz0KZWxlY3QudmFsKGUp
KTt2YXIgbj0zRHRoaXMuc2VsZWN0ZWQ7cmV0dXJuIG4mJm4hPTNEdCYmdGhpcy5vcHRpb25zLm9u
Y2hhbmdlPQomJnRoaXMub3B0aW9ucy5vbmNoYW5nZShuKSxufSxmaXJzdDpmdW5jdGlvbigpe3Zh
ciBlPTNEdGhpcy4kc2VsZWN0LmZpbmQoIm89CnB0aW9uIik7cmV0dXJuIGUubGVuZ3RoPjA/ZS52
YWwoKTp1bmRlZmluZWR9LHRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcz0KZWxlY3QuZmlu
ZCgib3B0aW9uOnNlbGVjdGVkIikudGV4dCgpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy4kaWNvbi5y
ZW1vdmVDbGFzPQpzKCksdGhpcy4kaWNvbi5hZGRDbGFzcygiZmEgZmEtY2FyZXQtZG93biIpLHRo
aXMuJHNlbGVjdC5zaG93KCksdGhpcy4kZWwuc2g9Cm93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlz
LiRlbC5oaWRlKCl9LHdhaXQ6ZnVuY3Rpb24oKXt0aGlzLiRpY29uLnJlbW92ZUNsYT0Kc3MoKSx0
aGlzLiRpY29uLmFkZENsYXNzKCJmYSBmYS1zcGlubmVyIGZhLXNwaW4iKSx0aGlzLiRzZWxlY3Qu
aGlkZSgpfSxkaXNhPQpibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlbGVjdC5pcygiOmRp
c2FibGVkIil9LGVuYWJsZTpmdW5jdGlvbigpe3RoaXM9Ci4kc2VsZWN0LnByb3AoImRpc2FibGVk
IiwhMSl9LGRpc2FibGU6ZnVuY3Rpb24oKXt0aGlzLiRzZWxlY3QucHJvcCgiZGlzYWJsZT0KZCIs
ITApfSxhZGQ6ZnVuY3Rpb24oZSl7dGhpcy4kc2VsZWN0LmFwcGVuZCh0aGlzLl90ZW1wbGF0ZU9w
dGlvbihlKSksdGhpcy5fPQpyZWZyZXNoKCl9LGRlbDpmdW5jdGlvbihlKXt0aGlzLiRzZWxlY3Qu
ZmluZCgib3B0aW9uW3ZhbHVlPTNEIitlKyJdIikucmVtb3Y9CmUoKSx0aGlzLiRzZWxlY3QudHJp
Z2dlcigiY2hhbmdlIiksdGhpcy5fcmVmcmVzaCgpfSx1cGRhdGU6ZnVuY3Rpb24oZSl7dGhpcz0K
LiRzZWxlY3QuZmluZCgib3B0aW9uIikucmVtb3ZlKCk7Zm9yKHZhciB0IGluIGUpdGhpcy4kc2Vs
ZWN0LmFwcGVuZCh0aGlzLl90PQplbXBsYXRlT3B0aW9uKGVbdF0pKTt0aGlzLl9yZWZyZXNoKCl9
LHNldE9uQ2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucy49Cm9uY2hhbmdlPTNEZX0sZXhp
c3RzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRzZWxlY3QuZmluZCgib3B0aW9uW3ZhbHVlPTNE
Ij0KK2UrIl0iKS5sZW5ndGg+MH0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLiRzZWxlY3QuZmlu
ZCgib3B0aW9uW3ZhbHVlPTNEbnVsPQpsXSIpLnJlbW92ZSgpO3ZhciBlPTNEdGhpcy4kc2VsZWN0
LmZpbmQoIm9wdGlvbiIpLmxlbmd0aDtlPTNEPTNEMD8odGhpcy5kaXM9CmFibGUoKSx0aGlzLiRz
ZWxlY3QuYXBwZW5kKHRoaXMuX3RlbXBsYXRlT3B0aW9uKHt2YWx1ZToibnVsbCIsbGFiZWw6dGhp
cy5vcD0KdGlvbnMuZW1wdHl9KSkpOnRoaXMuZW5hYmxlKCksdGhpcy5zZWxlY3RlZCYmdGhpcy4k
c2VsZWN0LnZhbCh0aGlzLnNlbGVjdGVkPQopfSxfdGVtcGxhdGVPcHRpb246ZnVuY3Rpb24oZSl7
cmV0dXJuJzxvcHRpb24gdmFsdWU9M0QiJytlLnZhbHVlKyciPicrZS5sYWI9CmVsKyI8L29wdGlv
bj4ifSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9M0QnPGRpdiBpZD0zRCInK2UuaWQrJyIg
Y2xhc3M9Cj0zRCJ1aS1zZWxlY3QiPicrJzxkaXYgY2xhc3M9M0QiYnV0dG9uIj4nKyc8aSBpZD0z
RCJpY29uIi8+JysiPC9kaXY+IisnPHNlbD0KZWN0IGlkPTNEInNlbGVjdCIgY2xhc3M9M0Qic2Vs
ZWN0ICcrZS5jbHMrIiAiK2UuaWQrJyI+Jztmb3Ioa2V5IGluIGUuZGF0YSl7PQp2YXIgbj0zRGUu
ZGF0YVtrZXldLHI9M0QiIjtpZihuLnZhbHVlPTNEPTNEZS52YWx1ZXx8bi52YWx1ZT0zRD0zRCIi
KXI9M0Qic2U9CmxlY3RlZCI7dCs9M0QnPG9wdGlvbiB2YWx1ZT0zRCInK24udmFsdWUrJyIgJyty
KyI+IituLmxhYmVsKyI8L29wdGlvbj4ifXJldD0KdXJuIHQrPTNEIjwvc2VsZWN0PjwvZGl2PiIs
dH19KTtyZXR1cm57Vmlldzp0fX0pLGRlZmluZSgicGx1Z2luL2xpYnJhcnkvdWkiPQosWyJ1dGls
cy91dGlscyIsInBsdWdpbi9saWJyYXJ5L3VpLXNlbGVjdCIsIm12Yy91aS91aS1tb2RhbCJdLGZ1
bmN0aW9uKGUsdCw9Cm4pe3ZhciByPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe29wdGlvbnNEZWZh
dWx0Ont1cmw6IiIsY2xzOiIifSxpbml0aWFsaXplOj0KZnVuY3Rpb24odCl7dGhpcy5vcHRpb25z
PTNEZS5tZXJnZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0PQpoaXMu
X3RlbXBsYXRlKHRoaXMub3B0aW9ucykpfSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuJzxp
bWcgY2xhc3M9M0QidWk9Ci1pbWFnZSAnK2UuY2xzKyciIHNyYz0zRCInK2UudXJsKyciLz4nfX0p
LGk9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9ucz0KRGVmYXVsdDp7dGl0bGU6IiIsY2xz
OiIifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRGUubWVyZ2UodCx0PQpo
aXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9w
dGlvbnMpKX0sdGl0bGU6ZnU9Cm5jdGlvbihlKXt0aGlzLiRlbC5odG1sKGUpfSxfdGVtcGxhdGU6
ZnVuY3Rpb24oZSl7cmV0dXJuJzxsYWJlbCBjbGFzcz0zRCJ1aT0KLWxhYmVsICcrZS5jbHMrJyI+
JytlLnRpdGxlKyI8L2xhYmVsPiJ9LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG9wdGlvbnMudGl0
PQpsZX19KSxzPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe29wdGlvbnNEZWZhdWx0OntpZDpudWxs
LHRpdGxlOiIiLCJmbG9hdCI6InI9CmlnaHQiLGNsczoiYnRuIGJ0bi1kZWZhdWx0IixpY29uOiIi
fSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRD0KZS5tZXJnZSh0LHRoaXMu
b3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9wdGlv
bnMpPQopLCQodGhpcy5lbCkub24oImNsaWNrIix0Lm9uY2xpY2spLCQodGhpcy5lbCkudG9vbHRp
cCh7dGl0bGU6dC50b29sdGlwLHBsYWM9CmVtZW50OiJib3R0b20ifSl9LF90ZW1wbGF0ZTpmdW5j
dGlvbihlKXt2YXIgdD0zRCc8YnV0dG9uIGlkPTNEIicrZS5pZCsnIiB0eT0KcGU9M0Qic3VibWl0
IiBzdHlsZT0zRCJmbG9hdDogJytlLmZsb2F0Kyc7IiB0eXBlPTNEImJ1dHRvbiIgY2xhc3M9M0Qi
dWktYnV0PQp0b24gJytlLmNscysnIj4nO3JldHVybiBlLmljb24mJih0Kz0zRCc8aSBjbGFzcz0z
RCJpY29uIGZhICcrZS5pY29uKyciPjwvaT49CiZuYnNwOycpLHQrPTNEZS50aXRsZSsiPC9idXR0
b24+Iix0fX0pLG89M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlZj0KYXVsdDp7ImZs
b2F0IjoicmlnaHQiLGljb246IiIsdG9vbHRpcDoiIixwbGFjZW1lbnQ6ImJvdHRvbSIsdGl0bGU6
IiIsY2xzOiIiPQp9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPTNEZS5tZXJn
ZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXM9Ci5zZXRFbGVtZW50KHRoaXMuX3RlbXBsYXRl
KHRoaXMub3B0aW9ucykpLCQodGhpcy5lbCkudG9vbHRpcCh7dGl0bGU6dC50b29sdD0KaXAscGxh
Y2VtZW50OiJib3R0b20ifSl9LF90ZW1wbGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4nPGRpdj48c3Bh
biBjbGFzcz0zRCJmPQphICcrZS5pY29uKyciIGNsYXNzPTNEInVpLWljb24iLz4mbmJzcDsnK2Uu
dGl0bGUrIjwvZGl2PiJ9fSksdT0zREJhY2tib25lLlY9Cmlldy5leHRlbmQoe29wdGlvbnNEZWZh
dWx0Ont0aXRsZToiIixpZDpudWxsLCJmbG9hdCI6InJpZ2h0IixjbHM6Imljb24tYnRuIj0KLGlj
b246IiIsdG9vbHRpcDoiIn0saW5pdGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9M0Rl
Lm1lcmdlKHQsdGhpcy5vPQpwdGlvbnNEZWZhdWx0KSx0aGlzLnNldEVsZW1lbnQodGhpcy5fdGVt
cGxhdGUodGhpcy5vcHRpb25zKSksJCh0aGlzLmVsKS5vbig9CiJjbGljayIsdC5vbmNsaWNrKSwk
KHRoaXMuZWwpLnRvb2x0aXAoe3RpdGxlOnQudG9vbHRpcCxwbGFjZW1lbnQ6ImJvdHRvbSJ9KT0K
fSxfdGVtcGxhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9M0QiIjtlLnRpdGxlJiYodD0zRCJ3aWR0aDog
YXV0bzsiKTt2YXIgbj0zRCc8PQpkaXYgaWQ9M0QiJytlLmlkKyciIHN0eWxlPTNEImZsb2F0OiAn
K2UuZmxvYXQrIjsgIit0KyciIGNsYXNzPTNEInVpLWJ1dHRvbi09Cmljb24gJytlLmNscysnIj4n
O3JldHVybiBlLnRpdGxlP24rPTNEJzxkaXYgY2xhc3M9M0QiYnV0dG9uIj48aSBjbGFzcz0zRCJp
Yz0Kb24gZmEgJytlLmljb24rJyIvPiZuYnNwOycrJzxzcGFuIGNsYXNzPTNEInRpdGxlIj4nK2Uu
dGl0bGUrIjwvc3Bhbj4iKyI8L2RpPQp2PiI6bis9M0QnPGkgY2xhc3M9M0QiaWNvbiBmYSAnK2Uu
aWNvbisnIi8+JyxuKz0zRCI8L2Rpdj4iLG59fSksYT0zREJhY2tib249CmUuVmlldy5leHRlbmQo
e29wdGlvbnNEZWZhdWx0Ont0aXRsZToiIixjbHM6IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7
dGhpcz0KLm9wdGlvbnM9M0RlLm1lcmdlKHQsdGhpcy5vcHRpb25zRGVmYXVsdCksdGhpcy5zZXRF
bGVtZW50KHRoaXMuX3RlbXBsYXRlKHRoPQppcy5vcHRpb25zKSksJCh0aGlzLmVsKS5vbigiY2xp
Y2siLHQub25jbGljayl9LF90ZW1wbGF0ZTpmdW5jdGlvbihlKXtyZXR1cm49Cic8ZGl2PjxhIGhy
ZWY9M0QiamF2YXNjcmlwdDp2b2lkKDApIiBjbGFzcz0zRCJ1aS1hbmNob3IgJytlLmNscysnIj4n
K2UudGl0bD0KZSsiPC9hPjwvZGl2PiJ9fSksZj0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRp
b25zRGVmYXVsdDp7bWVzc2FnZToiIixzdGF0PQp1czoiaW5mbyIscGVyc2lzdGVudDohMX0saW5p
dGlhbGl6ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9M0RlLm1lcmdlKHQsdGg9CmlzLm9wdGlv
bnNEZWZhdWx0KSx0aGlzLnNldEVsZW1lbnQoIjxkaXY+PC9kaXY+Iil9LHVwZGF0ZTpmdW5jdGlv
bih0KXt0aGlzLj0Kb3B0aW9ucz0zRGUubWVyZ2UodCx0aGlzLm9wdGlvbnNEZWZhdWx0KTtpZih0
Lm1lc3NhZ2UhPTNEIiIpe3RoaXMuJGVsLmh0bWwoPQp0aGlzLl90ZW1wbGF0ZSh0aGlzLm9wdGlv
bnMpKSx0aGlzLiRlbC5maW5kKCIuYWxlcnQiKS5hcHBlbmQodC5tZXNzYWdlKSx0aGk9CnMuJGVs
LmZhZGVJbigpO2lmKCF0LnBlcnNpc3RlbnQpe3ZhciBuPTNEdGhpczt3aW5kb3cuc2V0VGltZW91
dChmdW5jdGlvbigpez0Kbi4kZWwuaXMoIjp2aXNpYmxlIik/bi4kZWwuZmFkZU91dCgpOm4uJGVs
LmhpZGUoKX0sM2UzKX19ZWxzZSB0aGlzLiRlbC5mYWRlPQpPdXQoKX0sX3RlbXBsYXRlOmZ1bmN0
aW9uKGUpe3JldHVybic8ZGl2IGNsYXNzPTNEInVpLW1lc3NhZ2UgYWxlcnQgYWxlcnQtJys9CmUu
c3RhdHVzKyciLz4nfX0pLGw9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlZmF1bHQ6
e29uY2xpY2s6bnVsbCxzZT0KYXJjaHdvcmQ6IiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhp
cy5vcHRpb25zPTNEZS5tZXJnZSh0LHRoaXMub3B0aW9uc0RlPQpmYXVsdCksdGhpcy5zZXRFbGVt
ZW50KHRoaXMuX3RlbXBsYXRlKHRoaXMub3B0aW9ucykpO3ZhciBuPTNEdGhpczt0aGlzLm9wdGk9
Cm9ucy5vbmNsaWNrJiZ0aGlzLiRlbC5vbigic3VibWl0IixmdW5jdGlvbihlKXt2YXIgdD0zRG4u
JGVsLmZpbmQoIiNzZWFyY2giKT0KO24ub3B0aW9ucy5vbmNsaWNrKHQudmFsKCkpfSl9LF90ZW1w
bGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4nPGRpdiBjbGFzcz0zRCJ1PQppLXNlYXJjaCI+PGZvcm0g
b25zdWJtaXQ9M0QicmV0dXJuIGZhbHNlOyI+PGlucHV0IGlkPTNEInNlYXJjaCIgY2xhc3M9M0Qi
Zm89CnJtLWNvbnRyb2wgaW5wdXQtc20iIHR5cGU9M0QidGV4dCIgbmFtZT0zRCJzZWFyY2giIHBs
YWNlaG9sZGVyPTNEIlNlYXJjaC4uLj0KIiB2YWx1ZT0zRCInK2Uuc2VhcmNod29yZCsnIj4nKyc8
YnV0dG9uIHR5cGU9M0Qic3VibWl0IiBjbGFzcz0zRCJidG4gc2VhcmNoPQotYnRuIj4nKyc8aSBj
bGFzcz0zRCJmYSBmYS1zZWFyY2giPjwvaT4nKyI8L2J1dHRvbj4iKyI8L2Zvcm0+IisiPC9kaXY+
In19KSw9CmM9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlZmF1bHQ6e2lkOiIiLHRp
dGxlOiIiLHRhcmdldDoiIixocmVmOiIiLD0Kb251bmxvYWQ6bnVsbCxvbmNsaWNrOm51bGwsdmlz
aWJsZTohMCxpY29uOm51bGwsdGFnOiIifSwkbWVudTpudWxsLGluaXRpYWxpPQp6ZTpmdW5jdGlv
bih0KXt0aGlzLm9wdGlvbnM9M0RlLm1lcmdlKHQsdGhpcy5vcHRpb25zRGVmYXVsdCksdGhpcy5z
ZXRFbGVtZW49CnQoJCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9wdGlvbnMpKSk7dmFyIG49M0QkKHRo
aXMuZWwpLmZpbmQoIi5yb290Iikscj0zRHRoaT0KcztuLm9uKCJjbGljayIsZnVuY3Rpb24oZSl7
ZS5wcmV2ZW50RGVmYXVsdCgpLHIub3B0aW9ucy5vbmNsaWNrJiZyLm9wdGlvbnMuPQpvbmNsaWNr
KCl9KSx0aGlzLm9wdGlvbnMudmlzaWJsZXx8dGhpcy5oaWRlKCl9LHNob3c6ZnVuY3Rpb24oKXsk
KHRoaXMuZWwpLnM9CmhvdygpfSxoaWRlOmZ1bmN0aW9uKCl7JCh0aGlzLmVsKS5oaWRlKCl9LGFk
ZE1lbnU6ZnVuY3Rpb24odCl7dmFyIG49M0R7dGl0bD0KZToiIix0YXJnZXQ6IiIsaHJlZjoiIixv
bmNsaWNrOm51bGwsZGl2aWRlcjohMSxpY29uOm51bGwsY2xzOiJidXR0b24tbWVudSBiPQp0bi1n
cm91cCJ9O249M0RlLm1lcmdlKHQsbiksdGhpcy4kbWVudXx8KCQodGhpcy5lbCkuYXBwZW5kKHRo
aXMuX3RlbXBsYXRlTWU9Cm51KCkpLHRoaXMuJG1lbnU9M0QkKHRoaXMuZWwpLmZpbmQoIi5tZW51
IikpO3ZhciByPTNEJCh0aGlzLl90ZW1wbGF0ZU1lbnVJdD0KZW0obikpO3Iub24oImNsaWNrIixm
dW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksbi5vbmNsaWNrJiZuLm9uY2xpY2soKX0pPQos
dGhpcy4kbWVudS5hcHBlbmQociksbi5kaXZpZGVyJiZ0aGlzLiRtZW51LmFwcGVuZCgkKHRoaXMu
X3RlbXBsYXRlRGl2aWRlcig9CikpKX0sX3RlbXBsYXRlTWVudUl0ZW06ZnVuY3Rpb24oZSl7dmFy
IHQ9M0QnPGxpPjxhIGhyZWY9M0QiJytlLmhyZWYrJyIgdGFyZz0KZXQ9M0QiJytlLnRhcmdldCsn
Ij4nO3JldHVybiBlLmljb24mJih0Kz0zRCc8aSBjbGFzcz0zRCJmYSAnK2UuaWNvbisnIj48L2k+
PQonKSx0Kz0zRCIgIitlLnRpdGxlKyI8L2E+IisiPC9saT4iLHR9LF90ZW1wbGF0ZU1lbnU6ZnVu
Y3Rpb24oKXtyZXR1cm4nPHVsIGM9Cmxhc3M9M0QibWVudSBkcm9wZG93bi1tZW51IHB1bGwtcmln
aHQiIHJvbGU9M0QibWVudSI+PC91bD4nfSxfdGVtcGxhdGVEaXZpZD0KZXI6ZnVuY3Rpb24oKXty
ZXR1cm4nPGxpIGNsYXNzPTNEImRpdmlkZXIiPjwvbGk+J30sX3RlbXBsYXRlOmZ1bmN0aW9uKGUp
e3ZhPQpyIHQ9M0QnPGRpdiBpZD0zRCInK2UuaWQrJyIgY2xhc3M9M0QidWktYnV0dG9uLW1lbnUg
JytlLmNscysnIj4nKyc8YnV0dG9uIHQ9CnlwZT0zRCJidXR0b24iIGNsYXNzPTNEInJvb3QgYnRu
IGJ0bi1kZWZhdWx0IGRyb3Bkb3duLXRvZ2dsZSIgZGF0YS10b2dnbGU9Cj0zRCJkcm9wZG93biI+
JztyZXR1cm4gZS5pY29uJiYodCs9M0QnPGkgY2xhc3M9M0QiZmEgJytlLmljb24rJyI+PC9pPicp
LCI8Lz0KYnV0dG9uPjwvZGl2PiIsdH19KSxoPTNEQmFja2JvbmUuVmlldy5leHRlbmQoe29wdGlv
bnNEZWZhdWx0Ont2YWx1ZToiIix0eXBlPQo6InRleHQiLHBsYWNlaG9sZGVyOiIiLGRpc2FibGVk
OiExLHZpc2libGU6ITAsY2xzOiIifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQ9Cil7dGhpcy5vcHRp
b25zPTNEZS5tZXJnZSh0LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlz
Ll90ZW1wbD0KYXRlKHRoaXMub3B0aW9ucykpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy4k
ZWwucHJvcCgiZGlzYWJsZWQiLCEwKSx0aGlzPQoub3B0aW9ucy52aXNpYmxlfHx0aGlzLiRlbC5o
aWRlKCk7dmFyIG49M0R0aGlzO3RoaXMuJGVsLm9uKCJpbnB1dCIsZnVuY3Rpb249Cigpe24ub3B0
aW9ucy5vbmNoYW5nZSYmbi5vcHRpb25zLm9uY2hhbmdlKG4uJGVsLnZhbCgpKX0pfSx2YWx1ZTpm
dW5jdGlvbihlKT0Ke3JldHVybiBlIT0zRD0zRHVuZGVmaW5lZCYmdGhpcy4kZWwudmFsKGUpLHRo
aXMuJGVsLnZhbCgpfSxfdGVtcGxhdGU6ZnVuY3RpPQpvbihlKXtyZXR1cm4nPGlucHV0IGlkPTNE
IicrZS5pZCsnIiB0eXBlPTNEIicrZS50eXBlKyciIHZhbHVlPTNEIicrZS52YWx1ZSs9CiciIHBs
YWNlaG9sZGVyPTNEIicrZS5wbGFjZWhvbGRlcisnIiBjbGFzcz0zRCJ1aS1pbnB1dCAnK2UuY2xz
KyciPid9fSkscD0zRD0KQmFja2JvbmUuVmlldy5leHRlbmQoe29wdGlvbnNEZWZhdWx0Ont2YWx1
ZToiIix0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjoiIixkPQppc2FibGVkOiExLHZpc2libGU6ITAs
Y2xzOiIifSxpbml0aWFsaXplOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz0zRGUubWVyZ2U9Cih0
LHRoaXMub3B0aW9uc0RlZmF1bHQpLHRoaXMuc2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlz
Lm9wdGlvbnMpKSx0aGlzLj0Kb3B0aW9ucy5kaXNhYmxlZCYmdGhpcy4kZWwucHJvcCgiZGlzYWJs
ZWQiLCEwKSx0aGlzLm9wdGlvbnMudmlzaWJsZXx8dGhpcy4kPQplbC5oaWRlKCk7dmFyIG49M0R0
aGlzO3RoaXMuJGVsLm9uKCJpbnB1dCIsZnVuY3Rpb24oKXtuLm9wdGlvbnMub25jaGFuZ2UmJm49
Ci5vcHRpb25zLm9uY2hhbmdlKG4uJGVsLnZhbCgpKX0pfSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1
cm4gZSE9M0Q9M0R1bmRlZmluZT0KZCYmdGhpcy4kZWwudmFsKGUpLHRoaXMuJGVsLnZhbCgpfSxf
dGVtcGxhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuJzx0ZXh0YXJlYSBpPQpkPTNEIicrZS5pZCsnIiBj
bGFzcz0zRCJ1aS10ZXh0YXJlYSAnK2UuY2xzKyciIHJvd3M9M0QiNSI+PC90ZXh0YXJlYT4nfX0p
LGQ9Cj0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dmFsdWU6IiIsdmlz
aWJsZTohMCxjbHM6IiIsZGF0YTpbXT0KLGlkOmUudXVpZCgpfSxpbml0aWFsaXplOmZ1bmN0aW9u
KHQpe3RoaXMub3B0aW9ucz0zRGUubWVyZ2UodCx0aGlzLm9wdGlvbnNEPQplZmF1bHQpLHRoaXMu
c2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9wdGlvbnMpKSx0aGlzLm9wdGlvbnMudmlz
aWJsZXw9Cnx0aGlzLiRlbC5oaWRlKCksdGhpcy5vcHRpb25zLnZhbHVlJiZ0aGlzLnZhbHVlKHRo
aXMub3B0aW9ucy52YWx1ZSksdGhpcy5jdT0KcnJlbnQ9M0R0aGlzLm9wdGlvbnMudmFsdWU7dmFy
IG49M0R0aGlzO3RoaXMuJGVsLmZpbmQoImlucHV0Iikub24oImNoYW5nZSIsPQpmdW5jdGlvbigp
e24udmFsdWUobi5fZ2V0VmFsdWUoKSl9KX0sdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9M0R0aGlz
LmN1cnJlbnQ9CjtlIT0zRD0zRHVuZGVmaW5lZCYmKHRoaXMuJGVsLmZpbmQoImxhYmVsIikucmVt
b3ZlQ2xhc3MoImFjdGl2ZSIpLHRoaXMuJGVsLj0KZmluZCgnW3ZhbHVlPTNEIicrZSsnIl0nKS5j
bG9zZXN0KCJsYWJlbCIpLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLmN1cnJlbnQ9Cj0zRGUpO3Zh
ciBuPTNEdGhpcy5jdXJyZW50O3JldHVybiBuIT0zRHQmJnRoaXMub3B0aW9ucy5vbmNoYW5nZSYm
dGhpcy5vcHRpbz0KbnMub25jaGFuZ2UodGhpcy5jdXJyZW50KSx0aGlzLmN1cnJlbnR9LF9nZXRW
YWx1ZTpmdW5jdGlvbigpe3ZhciBlPTNEdGhpcy4kPQplbC5maW5kKCI6Y2hlY2tlZCIpLHQ9M0Ru
dWxsO3JldHVybiBlLmxlbmd0aD4wJiYodD0zRGUudmFsKCkpLHR9LF90ZW1wbGF0ZTo9CmZ1bmN0
aW9uKGUpe3ZhciB0PTNEJzxkaXYgY2xhc3M9M0QiYnRuLWdyb3VwIHVpLXJhZGlvYnV0dG9uIiBk
YXRhLXRvZ2dsZT0zRD0KImJ1dHRvbnMiPic7Zm9yKGtleSBpbiBlLmRhdGEpe3ZhciBuPTNEZS5k
YXRhW2tleV07dCs9M0QnPGxhYmVsIGNsYXNzPTNEImJ0PQpuIGJ0bi1kZWZhdWx0Ij48aW5wdXQg
dHlwZT0zRCJyYWRpbyIgbmFtZT0zRCInK2UuaWQrJyIgdmFsdWU9M0QiJytuLnZhbHVlKyc9CiIg
c2VsZWN0ZWQ+JytuLmxhYmVsKyI8L2xhYmVsPiJ9cmV0dXJuIHQrPTNEIjwvZGl2PiIsdH19KTty
ZXR1cm57TGFiZWw6aSxCdT0KdHRvbjpzLEljb246byxCdXR0b25JY29uOnUsSW5wdXQ6aCxBbmNo
b3I6YSxNZXNzYWdlOmYsU2VhcmNoYm94OmwsU2VsZWN0OnQsPQpCdXR0b25NZW51OmMsTW9kYWw6
bixUZXh0YXJlYTpwLEltYWdlOnIsUmFkaW9CdXR0b246ZH19KSxkZWZpbmUoInBsdWdpbi9saWI9
CnJhcnkvam9icyIsWyJ1dGlscy91dGlscyJdLGZ1bmN0aW9uKGUpe3JldHVybiBCYWNrYm9uZS5N
b2RlbC5leHRlbmQoe2luaXRpYT0KbGl6ZTpmdW5jdGlvbih0LG4pe3RoaXMuYXBwPTNEdCx0aGlz
Lm9wdGlvbnM9M0RlLm1lcmdlKG4sdGhpcy5vcHRpb25zRGVmYXVsPQp0KX0scmVxdWVzdDpmdW5j
dGlvbihlLHQsbixyLGkpe3ZhciBzPTNEdGhpcztlLnN0YXRlKCJ3YWl0IiwiUmVxdWVzdGluZyBq
b2I9CiByZXN1bHRzLi4uIik7dmFyIG89M0RlLmdldCgiZGF0YXNldF9pZF9qb2IiKTtvIT0zRCIi
P3MuX3dhaXQoZSxyLGkpOnMuX3N1Yj0KbWl0KGUsdCxuLHIsaSl9LGNsZWFudXA6ZnVuY3Rpb24o
dCl7dmFyIG49M0R0aGlzLHI9M0R0LmdldCgiZGF0YXNldF9pZF9qb2IiPQopO3IhPTNEIiImJihl
LnJlcXVlc3QoIlBVVCIsY29uZmlnLnJvb3QrImFwaS9oaXN0b3JpZXMvbm9uZS9jb250ZW50cy8i
K3Ise2Q9CmVsZXRlZDohMH0sZnVuY3Rpb24oKXtuLl9yZWZyZXNoSGRhcygpfSksdC5zZXQoImRh
dGFzZXRfaWRfam9iIiwiIikpfSxfc3VibT0KaXQ6ZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgbz0z
RHRoaXMsdT0zRHQuaWQsYT0zRHQuZ2V0KCJ0eXBlIiksZj0zRHQuZGVmaW5pPQp0aW9uO2RhdGE9
M0R7dG9vbF9pZDoiY2hhcnRzIixpbnB1dHM6e2lucHV0OntpZDp0LmdldCgiZGF0YXNldF9pZCIp
LHNyYzoiaGQ9CmEifSxtb2R1bGU6Zi5leGVjdXRlLGNvbHVtbnM6cixzZXR0aW5nczpufX0sdC5z
dGF0ZSgid2FpdCIsIlNlbmRpbmcgam9iIHJlcT0KdWVzdC4uLiIpLGUucmVxdWVzdCgiUE9TVCIs
Y29uZmlnLnJvb3QrImFwaS90b29scyIsZGF0YSxmdW5jdGlvbihlKXtpZighZS5vPQp1dHB1dHN8
fGUub3V0cHV0cy5sZW5ndGg9M0Q9M0QwKXQuc3RhdGUoImZhaWxlZCIsIkpvYiBzdWJtaXNzaW9u
IGZhaWxlZC4gTm89CiByZXNwb25zZS4iKSxzJiZzKCk7ZWxzZXtvLl9yZWZyZXNoSGRhcygpO3Zh
ciBuPTNEZS5vdXRwdXRzWzBdO3Quc3RhdGUoIndhaT0KdCIsIllvdXIgam9iIGhhcyBiZWVuIHF1
ZXVlZC4gWW91IG1heSBjbG9zZSB0aGUgYnJvd3NlciB3aW5kb3cuIFRoZSBqb2Igd2lsPQpsIHJ1
biBpbiB0aGUgYmFja2dyb3VuZC4iKSx0LnNldCgiZGF0YXNldF9pZF9qb2IiLG4uaWQpLHRoaXMu
YXBwLnN0b3JhZ2Uuc2E9CnZlKCksby5fd2FpdCh0LGkscyl9fSxmdW5jdGlvbihlKXt2YXIgbj0z
RCIiO2UmJmUubWVzc2FnZSYmZS5tZXNzYWdlLmRhdGEmJj0KZS5tZXNzYWdlLmRhdGEuaW5wdXQm
JihuPTNEZS5tZXNzYWdlLmRhdGEuaW5wdXQrIi4iKSx0LnN0YXRlKCJmYWlsZWQiLCJUaGlzPQog
dmlzdWFsaXphdGlvbiByZXF1aXJlcyB0aGUgJ2NoYXJ0cycgdG9vbC4gUGxlYXNlIG1ha2Ugc3Vy
ZSBpdCBpcyBpbnN0YWxsZWQ9Ci4gIituKSxzJiZzKCl9KX0sX3dhaXQ6ZnVuY3Rpb24odCxuLHIp
e3ZhciBpPTNEdGhpcztlLnJlcXVlc3QoIkdFVCIsY29uZmlnLj0Kcm9vdCsiYXBpL2RhdGFzZXRz
LyIrdC5nZXQoImRhdGFzZXRfaWRfam9iIikse30sZnVuY3Rpb24oZSl7dmFyIHM9M0QhMTtzd2l0
PQpjaChlLnN0YXRlKXtjYXNlIm9rIjp0LnN0YXRlKCJ3YWl0IiwiSm9iIGNvbXBsZXRlZCBzdWNj
ZXNzZnVsbHkuLi4iKSxuJiZuKGU9Cikscz0zRCEwO2JyZWFrO2Nhc2UiZXJyb3IiOnQuc3RhdGUo
ImZhaWxlZCIsIkpvYiBoYXMgZmFpbGVkLiBQbGVhc2UgY2hlY2sgdD0KaGUgaGlzdG9yeSBmb3Ig
ZGV0YWlscy4iKSxyJiZyKGUpLHM9M0QhMDticmVhaztjYXNlInJ1bm5pbmciOnQuc3RhdGUoIndh
aXQiPQosIllvdXIgam9iIGlzIHJ1bm5pbmcuIFlvdSBtYXkgY2xvc2UgdGhlIGJyb3dzZXIgd2lu
ZG93LiBUaGUgam9iIHdpbGwgY29udGk9Cm51ZSBpbiB0aGUgYmFja2dyb3VuZC4iKX1zfHxzZXRU
aW1lb3V0KGZ1bmN0aW9uKCl7aS5fd2FpdCh0LG4scil9LGkuYXBwLmNvbj0KZmlnLmdldCgicXVl
cnlfdGltZW91dCIpKX0pfSxfcmVmcmVzaEhkYXM6ZnVuY3Rpb24oKXtHYWxheHkmJkdhbGF4eS5j
dXJySGlzPQp0b3J5UGFuZWwmJkdhbGF4eS5jdXJySGlzdG9yeVBhbmVsLnJlZnJlc2hDb250ZW50
cygpfX0pfSksZGVmaW5lKCJwbHVnaW4vbGk9CmJyYXJ5L2RhdGFzZXRzIixbInV0aWxzL3V0aWxz
Il0sZnVuY3Rpb24oZSl7cmV0dXJuIEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZT0KbmQoe2xpc3Q6
e30sY2FjaGU6e30saW5pdGlhbGl6ZTpmdW5jdGlvbih0LG4pe3RoaXMuYXBwPTNEdCx0aGlzLm9w
dGlvbnM9M0RlPQoubWVyZ2Uobix0aGlzLm9wdGlvbnNEZWZhdWx0KX0scmVxdWVzdDpmdW5jdGlv
bihlLHQsbil7dmFyIHI9M0R0aGlzO2UuZ3JvdXA9CnM/dGhpcy5fZ2V0X2RhdGFzZXQoZS5pZCxm
dW5jdGlvbigpe3IuX2dldChlLHQpfSk6dGhpcy5fZ2V0X2RhdGFzZXQoZS5pZCx0LD0Kbil9LF9n
ZXRfZGF0YXNldDpmdW5jdGlvbih0LG4scil7dmFyIGk9M0R0aGlzLmxpc3RbdF07aWYoaSl7bihp
KTtyZXR1cm59dmFyPQogcz0zRHRoaXM7ZS5yZXF1ZXN0KCJHRVQiLGNvbmZpZy5yb290KyJhcGkv
ZGF0YXNldHMvIit0LHt9LGZ1bmN0aW9uKGUpe3N3aXQ9CmNoKGUuc3RhdGUpe2Nhc2UiZXJyb3Ii
OnImJnIoZSk7YnJlYWs7ZGVmYXVsdDpzLmxpc3RbdF09M0RlLG4oZSl9fSl9LF9ibG9jaz0KX2lk
OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQrIl8iK2Uuc3RhcnQrIl8iK2UuZW5kKyJfIit0fSxf
Z2V0OmZ1bmN0aW9uKGUsPQp0KXtlLnN0YXJ0fHwoZS5zdGFydD0zRDApLGUuZW5kfHwoZS5lbmQ9
M0R0aGlzLmFwcC5jb25maWcuZ2V0KCJxdWVyeV9saW1pdCI9CikpO3ZhciBuPTNEW10scj0zRHt9
LGk9M0QwO2Zvcih2YXIgcyBpbiBlLmdyb3Vwcyl7dmFyIG89M0RlLmdyb3Vwc1tzXTtmb3Iodj0K
YXIgdSBpbiBvLmNvbHVtbnMpe3ZhciBhPTNEby5jb2x1bW5zW3VdLmluZGV4LGY9M0R0aGlzLl9i
bG9ja19pZChlLGEpO2lmKHRoPQppcy5jYWNoZVtmXXx8YT0zRD0zRD0zRCJhdXRvIiljb250aW51
ZTshclthXSYmYSE9M0Q9M0R1bmRlZmluZWQmJihyW2FdPTNEaSw9Cm4ucHVzaChhKSxpKyspfX1p
ZihuLmxlbmd0aD0zRD0zRDApe3RoaXMuX2ZpbGxfZnJvbV9jYWNoZShlKSx0KGUpO3JldHVybn12
YT0KciBsPTNEe2RhdGFzZXRfaWQ6ZS5pZCxzdGFydDplLnN0YXJ0LGVuZDplLmVuZCxjb2x1bW5z
Om59LGM9M0R0aGlzO3RoaXMuX2ZlPQp0Y2gobCxmdW5jdGlvbihyKXtmb3IodmFyIGkgaW4gcil7
dmFyIHM9M0RuW2ldLG89M0RjLl9ibG9ja19pZChlLHMpO2MuY2FjaGU9CltvXT0zRHJbaV19Yy5f
ZmlsbF9mcm9tX2NhY2hlKGUpLHQoZSl9KX0sX2ZpbGxfZnJvbV9jYWNoZTpmdW5jdGlvbihlKXtj
b25zbz0KbGUuZGVidWcoIkRhdGFzZXRzOjpfZmlsbF9mcm9tX2NhY2hlKCkgLSBGaWxsaW5nIHJl
cXVlc3QgZnJvbSBjYWNoZS4iKTt2YXIgPQp0PTNEZS5zdGFydCxuPTNEMDtmb3IodmFyIHIgaW4g
ZS5ncm91cHMpe3ZhciBpPTNEZS5ncm91cHNbcl07Zm9yKHZhciBzIGluIGk9Ci5jb2x1bW5zKXt2
YXIgbz0zRGkuY29sdW1uc1tzXSx1PTNEdGhpcy5fYmxvY2tfaWQoZSxvLmluZGV4KSxhPTNEdGhp
cy5jYWNoZT0KW3VdO2EmJihuPTNETWF0aC5tYXgobixhLmxlbmd0aCkpfX1uPTNEPTNEMCYmY29u
c29sZS5kZWJ1ZygiRkFJTEVEIC0gRGF0YXNlPQp0czo6X2ZpbGxfZnJvbV9jYWNoZSgpIC0gSW52
YWxpZCByYW5nZS4iKTtmb3IodmFyIHIgaW4gZS5ncm91cHMpe3ZhciBpPTNEZS49Cmdyb3Vwc1ty
XTtpLnZhbHVlcz0zRFtdO2Zvcih2YXIgZj0zRDA7ZjxuO2YrKylpLnZhbHVlc1tmXT0zRHt4OnBh
cnNlSW50KGYpKz0KdH19Zm9yKHZhciByIGluIGUuZ3JvdXBzKXt2YXIgaT0zRGUuZ3JvdXBzW3Jd
O2Zvcih2YXIgcyBpbiBpLmNvbHVtbnMpe3ZhciBvPQo9M0RpLmNvbHVtbnNbc107aWYoby5pbmRl
eD0zRD0zRCJhdXRvIilmb3IodmFyIGY9M0QwO2Y8bjtmKyspe3ZhciBsPTNEaS52YWw9CnVlc1tm
XTtsW3NdPTNEcGFyc2VJbnQoZikrdH1lbHNle3ZhciB1PTNEdGhpcy5fYmxvY2tfaWQoZSxvLmlu
ZGV4KSxhPTNEdGhpcz0KLmNhY2hlW3VdO2Zvcih2YXIgZj0zRDA7ZjxuO2YrKyl7dmFyIGw9M0Rp
LnZhbHVlc1tmXSxjPTNEYVtmXTtpc05hTihjKSYmIW8uPQppc19sYWJlbCYmKGM9M0QwKSxsW3Nd
PTNEY319fX19LF9mZXRjaDpmdW5jdGlvbih0LG4pe3ZhciByPTNEdC5zdGFydD90LnN0YXI9CnQ6
MCxpPTNETWF0aC5hYnModC5lbmQtdC5zdGFydCkscz0zRHRoaXMuYXBwLmNvbmZpZy5nZXQoInF1
ZXJ5X2xpbWl0Iik7aWYoIT0KaXx8aT5zKWk9M0RzO3ZhciBvPTNEMDt0LmNvbHVtbnMmJihvPTNE
dC5jb2x1bW5zLmxlbmd0aCxjb25zb2xlLmRlYnVnKCJEYXRhPQpzZXRzOjpfZmV0Y2goKSAtIEZl
dGNoaW5nICIrbysiIGNvbHVtbihzKSIpKSxvPTNEPTNEMCYmY29uc29sZS5kZWJ1ZygiRGF0YXM9
CmV0czo6X2ZldGNoKCkgLSBObyBjb2x1bW5zIHJlcXVlc3RlZCIpO3ZhciB1PTNEIiI7Zm9yKHZh
ciBhIGluIHQuY29sdW1ucyl1Kz0KPTNEdC5jb2x1bW5zW2FdKyIsIjt1PTNEdS5zdWJzdHJpbmco
MCx1Lmxlbmd0aC0xKTt2YXIgZj0zRHRoaXM7ZS5yZXF1ZXN0KCJHPQpFVCIsY29uZmlnLnJvb3Qr
ImFwaS9kYXRhc2V0cy8iK3QuZGF0YXNldF9pZCx7ZGF0YV90eXBlOiJyYXdfZGF0YSIscHJvdmlk
ZXI9CjoiZGF0YXNldC1jb2x1bW4iLGxpbWl0Omksb2Zmc2V0OnIsaW5kZWNlczp1fSxmdW5jdGlv
bihlKXt2YXIgdD0zRG5ldyBBcnJheT0KKG8pO2Zvcih2YXIgcj0zRDA7cjxvO3IrKyl0W3JdPTNE
W107Zm9yKHZhciByIGluIGUuZGF0YSl7dmFyIGk9M0RlLmRhdGFbcl07PQpmb3IodmFyIHMgaW4g
aSl7dmFyIHU9M0RpW3NdO3UhPTNEPTNEdW5kZWZpbmVkJiZ1IT0zRDIxNDc0ODM2NDcmJnRbc10u
cHVzaCg9CnUpfX1jb25zb2xlLmRlYnVnKCJEYXRhc2V0czo6X2ZldGNoKCkgLSBGZXRjaGluZyBj
b21wbGV0ZS4iKSxuKHQpfSl9fSl9KSxkZT0KZmluZSgicGx1Z2luL21vZGVscy9ncm91cCIsW10s
ZnVuY3Rpb24oKXtyZXR1cm4gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtkZWZhPQp1bHRzOntrZXk6
IkRhdGEgbGFiZWwiLGRhdGU6IiJ9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5jbGVhcih7c2lsZW50
OiEwfSkuc2U9CnQodGhpcy5kZWZhdWx0cyksdGhpcy50cmlnZ2VyKCJyZXNldCIsdGhpcyl9fSl9
KSxkZWZpbmUoInBsdWdpbi9tb2RlbHMvZ3JvdT0KcHMiLFsicGx1Z2luL21vZGVscy9ncm91cCJd
LGZ1bmN0aW9uKGUpe3JldHVybiBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7PQptb2RlbDpl
fSl9KSxkZWZpbmUoInBsdWdpbi9saWJyYXJ5L2RlZmVycmVkIixbInV0aWxzL3V0aWxzIl0sZnVu
Y3Rpb24oZSl7cmU9CnR1cm4gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtxdWV1ZTpbXSxwcm9jZXNz
Ont9LGNvdW50ZXI6MCxpbml0aWFsaXplOmZ1bmN0aT0Kb24oKXt0aGlzLm9uKCJyZWZyZXNoIixm
dW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLnF1ZXVlKWlmKHRoaXMuY291bnRlcj0KPTNEPTNE
MCl7dmFyIHQ9M0R0aGlzLnF1ZXVlW2VdO3RoaXMucXVldWUuc3BsaWNlKGUsMSksdCgpfX0pfSxl
eGVjdXRlOmZ1bmN0PQppb24oZSl7dGhpcy5xdWV1ZS5wdXNoKGUpLHRoaXMudHJpZ2dlcigicmVm
cmVzaCIpfSxyZWdpc3RlcjpmdW5jdGlvbigpe3ZhciA9CnQ9M0RlLnV1aWQoKTtyZXR1cm4gdGhp
cy5wcm9jZXNzW3RdPTNEITAsdGhpcy5jb3VudGVyKyssY29uc29sZS5kZWJ1ZygiRGVmZT0KcnJl
ZDpyZWdpc3RlcigpIC0gUmVnaXN0ZXJpbmcgIit0KSx0fSxkb25lOmZ1bmN0aW9uKGUpe3RoaXMu
cHJvY2Vzc1tlXSYmKGRlPQpsZXRlIHRoaXMucHJvY2Vzc1tlXSx0aGlzLmNvdW50ZXItLSxjb25z
b2xlLmRlYnVnKCJEZWZlcnJlZDpkb25lKCkgLSBVbnJlZ2k9CnN0ZXJpbmcgIitlKSx0aGlzLnRy
aWdnZXIoInJlZnJlc2giKSl9LHJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY291bnRlcj0K
PTNEPTNEMH19KX0pO3ZhciBWaXN1YWxpemF0aW9uPTNEQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtk
ZWZhdWx0czp7Y29uZmlnOnt9PQp9LHVybFJvb3Q6ZnVuY3Rpb24oKXt2YXIgZT0zRCIvYXBpL3Zp
c3VhbGl6YXRpb25zIjtyZXR1cm4gd2luZG93LmdhbGF4eV9jb249CmZpZyYmZ2FsYXh5X2NvbmZp
Zy5yb290P2dhbGF4eV9jb25maWcucm9vdCtlOmV9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7Xy5p
cz0KT2JqZWN0KGUuY29uZmlnKSYmXy5pc09iamVjdCh0aGlzLmRlZmF1bHRzLmNvbmZpZykmJl8u
ZGVmYXVsdHMoZS5jb25maWcsdGhpPQpzLmRlZmF1bHRzLmNvbmZpZyksdGhpcy5fc2V0VXBMaXN0
ZW5lcnMoKX0sX3NldFVwTGlzdGVuZXJzOmZ1bmN0aW9uKCl7fSxzZXQ9CjpmdW5jdGlvbihlLHQp
e2lmKGU9M0Q9M0Q9M0QiY29uZmlnIil7dmFyIG49M0R0aGlzLmdldCgiY29uZmlnIik7Xy5pc09i
amVjdD0KKG4pJiYodD0zRF8uZXh0ZW5kKF8uY2xvbmUobiksdCkpfXJldHVybiBCYWNrYm9uZS5N
b2RlbC5wcm90b3R5cGUuc2V0LmNhbGwoPQp0aGlzLGUsdCksdGhpc30sdG9TdHJpbmc6ZnVuY3Rp
b24oKXt2YXIgZT0zRHRoaXMuZ2V0KCJpZCIpfHwiIjtyZXR1cm4gdGhpcy49CmdldCgidGl0bGUi
KSYmKGUrPTNEIjoiK3RoaXMuZ2V0KCJ0aXRsZSIpKSwiVmlzdWFsaXphdGlvbigiK2UrIikifX0p
LFZpc3VhbD0KaXphdGlvbkNvbGxlY3Rpb249M0RCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7
bW9kZWw6VmlzdWFsaXphdGlvbix1cmw6ZnVuPQpjdGlvbigpe3JldHVybiBnYWxheHlfY29uZmln
LnJvb3QrImFwaS92aXN1YWxpemF0aW9ucyJ9LGluaXRpYWxpemU6ZnVuY3Rpb249CihlLHQpe3Q9
M0R0fHx7fX0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49M0R0aGlzO2U9M0RfLm1hcChlLGZ1bmN0
aW9uKGUpe3Zhcj0KIHQ9M0RuLmdldChlLmlkKTtpZighdClyZXR1cm4gZTt2YXIgcj0zRHQudG9K
U09OKCk7cmV0dXJuIF8uZXh0ZW5kKHIsZSkscn0pPQosQmFja2JvbmUuQ29sbGVjdGlvbi5wcm90
b3R5cGUuc2V0LmNhbGwodGhpcyxlLHQpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHU9CnJuWyJW
aXN1YWxpemF0aW9uQ29sbGVjdGlvbigiLFt0aGlzLmhpc3RvcnlJZCx0aGlzLmxlbmd0aF0uam9p
bigpLCIpIl0uam9pbj0KKCIiKX19KTtkZWZpbmUoIm12Yy92aXN1YWxpemF0aW9uL3Zpc3VhbGl6
YXRpb24tbW9kZWwiLGZ1bmN0aW9uKCl7fSksZGVmaW5lPQooInBsdWdpbi9tb2RlbHMvY2hhcnQi
LFsicGx1Z2luL21vZGVscy9ncm91cHMiLCJwbHVnaW4vbGlicmFyeS9kZWZlcnJlZCIsIm09CnZj
L3Zpc3VhbGl6YXRpb24vdmlzdWFsaXphdGlvbi1tb2RlbCJdLGZ1bmN0aW9uKGUsdCl7cmV0dXJu
IEJhY2tib25lLk1vZGVsLj0KZXh0ZW5kKHtkZWZhdWx0czp7aWQ6bnVsbCx0aXRsZToiIix0eXBl
OiIiLGRhdGU6bnVsbCxzdGF0ZToiIixzdGF0ZV9pbmZvOiIiPQosbW9kaWZpZWQ6ITEsZGF0YXNl
dF9pZDoiIixkYXRhc2V0X2lkX2pvYjoiIn0saW5pdGlhbGl6ZTpmdW5jdGlvbihuKXt0aGlzLmc9
CnJvdXBzPTNEbmV3IGUsdGhpcy5zZXR0aW5ncz0zRG5ldyBCYWNrYm9uZS5Nb2RlbCx0aGlzLmRl
ZmVycmVkPTNEbmV3IHR9LHJlcz0KZXQ6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKHtzaWxlbnQ6ITB9
KS5zZXQodGhpcy5kZWZhdWx0cyksdGhpcy5ncm91cHMucmVzZXQoPQopLHRoaXMuc2V0dGluZ3Mu
Y2xlYXIoKSx0aGlzLnRyaWdnZXIoInJlc2V0Iix0aGlzKX0sY29weTpmdW5jdGlvbihlKXt2YXIg
dD0KPTNEdGhpczt0LmNsZWFyKHtzaWxlbnQ6ITB9KS5zZXQodGhpcy5kZWZhdWx0cyksdC5zZXQo
ZS5hdHRyaWJ1dGVzKSx0LnNldHRpPQpuZ3M9M0RlLnNldHRpbmdzLmNsb25lKCksdC5ncm91cHMu
cmVzZXQoKSxlLmdyb3Vwcy5lYWNoKGZ1bmN0aW9uKGUpe3QuZ3JvdXA9CnMuYWRkKGUuY2xvbmUo
KSl9KSx0LnRyaWdnZXIoImNoYW5nZSIsdCl9LHN0YXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXQo
InN0YT0KdGUiLGUpLHRoaXMuc2V0KCJzdGF0ZV9pbmZvIix0KSx0aGlzLnRyaWdnZXIoInNldDpz
dGF0ZSIpLGNvbnNvbGUuZGVidWcoIkNoPQphcnQ6c3RhdGUoKSAtICIrdCsiICgiK2UrIikiKX19
KX0pLGRlZmluZSgicGx1Z2luL2xpYnJhcnkvc3RvcmFnZSIsWyJ1dGlscy89CnV0aWxzIiwicGx1
Z2luL21vZGVscy9jaGFydCIsInBsdWdpbi9tb2RlbHMvZ3JvdXAiXSxmdW5jdGlvbihlLHQsbil7
cmV0dXJuID0KQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHt2aXM6bnVsbCxpbml0aWFsaXplOmZ1bmN0
aW9uKGUpe3RoaXMuYXBwPTNEZSx0aGlzLmNoPQphcnQ9M0R0aGlzLmFwcC5jaGFydCx0aGlzLm9w
dGlvbnM9M0R0aGlzLmFwcC5vcHRpb25zLHRoaXMuaWQ9M0R0aGlzLm9wdGlvbnM9Ci5pZCx0aGlz
LnZpcz0zRG5ldyBWaXN1YWxpemF0aW9uKHt0eXBlOiJjaGFydHMiLGNvbmZpZzp7ZGF0YXNldF9p
ZDp0aGlzLm9wdD0KaW9ucy5jb25maWcuZGF0YXNldF9pZCxjaGFydF9kaWN0Ont9fX0pLHRoaXMu
aWQmJih0aGlzLnZpcy5pZD0zRHRoaXMuaWQpO3ZhPQpyIHQ9M0R0aGlzLm9wdGlvbnMuY29uZmln
LmNoYXJ0X2RpY3Q7dCYmKHRoaXMudmlzLmdldCgiY29uZmlnIikuY2hhcnRfZGljdD0KPTNEdCl9
LHNhdmU6ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXMuYXBwLmNoYXJ0O3RoaXMudmlzLmdldCgiY29u
ZmlnIikuY2hhcnRfPQpkaWN0PTNEe307dmFyIHQ9M0RlLmdldCgidGl0bGUiKTt0IT0zRCIiJiZ0
aGlzLnZpcy5zZXQoInRpdGxlIix0KTt2YXIgbj0zRHs9CmF0dHJpYnV0ZXM6ZS5hdHRyaWJ1dGVz
LHNldHRpbmdzOmUuc2V0dGluZ3MuYXR0cmlidXRlcyxncm91cHM6W119O2UuZ3JvdXBzLj0KZWFj
aChmdW5jdGlvbihlKXtuLmdyb3Vwcy5wdXNoKGUuYXR0cmlidXRlcyl9KSx0aGlzLnZpcy5nZXQo
ImNvbmZpZyIpLmNoYXJ0PQpfZGljdD0zRG47dmFyIHI9M0R0aGlzO3RoaXMudmlzLnNhdmUoKS5m
YWlsKGZ1bmN0aW9uKGUsdCxuKXtjb25zb2xlLmVycm9yKGU9Cix0LG4pfSkudGhlbihmdW5jdGlv
bihlKXtlJiZlLmlkJiYoci5pZD0zRGUuaWQpfSl9LGxvYWQ6ZnVuY3Rpb24oKXt2YXIgZT0zRD0K
dGhpcy52aXMuZ2V0KCJjb25maWciKS5jaGFydF9kaWN0O2lmKCFlLmF0dHJpYnV0ZXMpcmV0dXJu
ITE7dmFyIHQ9M0RlLmF0dHJpPQpidXRlcy50eXBlO2lmKCF0KXJldHVybiBjb25zb2xlLmRlYnVn
KCJTdG9yYWdlOjpsb2FkKCkgLSBDaGFydCB0eXBlIG5vdCBwcm89CnZpZGVkLiBJbnZhbGlkIGZv
cm1hdC4iKSwhMTt2YXIgcj0zRHRoaXMuYXBwLnR5cGVzLmdldCh0KTtpZighcilyZXR1cm4gY29u
cz0Kb2xlLmRlYnVnKCJTdG9yYWdlOjpsb2FkKCkgLSBDaGFydCB0eXBlIG5vdCBzdXBwb3J0ZWQu
IFBsZWFzZSByZS1jb25maWd1cmUgPQp0aGUgY2hhcnQuIFJlc2V0dGluZyBjaGFydC4iKSwhMTtj
b25zb2xlLmRlYnVnKCJTdG9yYWdlOjpsb2FkKCkgLSBMb2FkaW5nIGM9CmhhcnQgdHlwZSAiK3Qr
Ii4iKSx0aGlzLmNoYXJ0LmRlZmluaXRpb249M0RyLHRoaXMuY2hhcnQuc2V0KGUuYXR0cmlidXRl
cyksdD0KaGlzLmNoYXJ0LnN0YXRlKCJvayIsIkxvYWRpbmcgc2F2ZWQgdmlzdWFsaXphdGlvbi4u
LiIpLHRoaXMuY2hhcnQuc2V0dGluZ3MuPQpzZXQoZS5zZXR0aW5ncyk7Zm9yKHZhciBpIGluIGUu
Z3JvdXBzKXRoaXMuY2hhcnQuZ3JvdXBzLmFkZChuZXcgbihlLmdyb3Vwc1s9CmldKSk7cmV0dXJu
IHRoaXMuY2hhcnQuc2V0KCJtb2RpZmllZCIsITEpLCEwfX0pfSksZGVmaW5lKCJwbHVnaW4vbGli
cmFyeS9zYz0KcmVlbnNob3QiLFsibGlicy91bmRlcnNjb3JlIl0sZnVuY3Rpb24oZSl7ZnVuY3Rp
b24gdChlLHQsaSl7dmFyIHM9M0RuZXcgWE1MPQpTZXJpYWxpemVyLG89M0QiIix1PTNEdGhpcyxh
PTNEMCxmPTNEMDtyZXR1cm4gZS5maW5kKCJzdmciKS5lYWNoKGZ1bmN0aW9uKCk9Cnt2YXIgZT0z
RCQodGhpcyk7bihlKSxhPTNEcGFyc2VJbnQoZS5jc3MoImhlaWdodCIpKSxmPTNEcGFyc2VJbnQo
ZS5jc3MoIndpZD0KdGgiKSksZS5hdHRyKHt2ZXJzaW9uOiIxLjEiLHhtbG5zOiJodHRwOi8vd3d3
LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6ZixoZWlnPQpodDphfSksZS5maW5kKCIuaGlnaGNoYXJ0
cy1idXR0b24iKS5oaWRlKCksbys9M0RzLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMpLGU9Ci5maW5k
KCIuaGlnaGNoYXJ0cy1idXR0b24iKS5zaG93KCl9KSxyKGUsdCx7ZmlsZW5hbWU6aXx8ImNoYXJ0
Iix0eXBlOiJhcHBsaT0KY2F0aW9uL3BkZiIsaGVpZ2h0OmEsd2lkdGg6ZixzY2FsZToyLHN2Zzpv
fSksb31mdW5jdGlvbiBuKGUpe2Zvcih2YXIgdCBpbiBkPQpvY3VtZW50LnN0eWxlU2hlZXRzKXt2
YXIgbj0zRGRvY3VtZW50LnN0eWxlU2hlZXRzW3RdLHI9M0RuLmNzc1J1bGVzO2lmKHIpZm89CnIo
dmFyIGk9M0QwLHM9M0RyLmxlbmd0aDtpPHM7aSsrKXRyeXtlLmZpbmQocltpXS5zZWxlY3RvclRl
eHQpLmVhY2goZnVuY3Rpbz0KbihlLHQpe3Quc3R5bGUuY3NzVGV4dCs9M0RyW2ldLnN0eWxlLmNz
c1RleHR9KX1jYXRjaChvKXt9fX1mdW5jdGlvbiByKGUsdCxuPQope3ZhciByPTNEZS5maW5kKCIj
dmlld3BvcnQtZm9ybSIpO3IubGVuZ3RoPTNEPTNEPTNEMCYmKHI9M0QkKCI8Zm9ybT4iLHtpZDo9
CiJ2aWV3cG9ydC1mb3JtIixtZXRob2Q6InBvc3QiLGFjdGlvbjp0LGRpc3BsYXk6Im5vbmUifSks
ZS5hcHBlbmQocikpLHIuZW1wdD0KeSgpO2ZvcihuYW1lIGluIG4pe3ZhciBpPTNEJCgiPGlucHV0
Lz4iLHt0eXBlOiJoaWRkZW4iLG5hbWU6bmFtZSx2YWx1ZTpuW25hPQptZV19KTtyLmFwcGVuZChp
KX10cnl7ci5zdWJtaXQoKX1jYXRjaChzKXtjb25zb2xlLmxvZyhzKX19cmV0dXJue2NyZWF0ZTp0
fX09CiksZGVmaW5lKCJwbHVnaW4vdmlld3Mvdmlld3BvcnQiLFsibXZjL3VpL3VpLXBvcnRsZXQi
LCJwbHVnaW4vbGlicmFyeS91aSIsIj0KcGx1Z2luL2xpYnJhcnkvc2NyZWVuc2hvdCIsInV0aWxz
L3V0aWxzIl0sZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEJhY2tib25lPQouVmlldy5leHRlbmQo
e2NvbnRhaW5lcl9saXN0OltdLGNhbnZhc19saXN0OltdLGluaXRpYWxpemU6ZnVuY3Rpb24oZSx0
KXt0aGk9CnMuYXBwPTNEZSx0aGlzLmNoYXJ0PTNEdGhpcy5hcHAuY2hhcnQsdGhpcy5vcHRpb25z
PTNEci5tZXJnZSh0LHRoaXMub3B0aW9ucz0KRGVmYXVsdCksdGhpcy5zZXRFbGVtZW50KCQodGhp
cy5fdGVtcGxhdGUoKSkpLHRoaXMuX2Z1bGxzY3JlZW4odGhpcy4kZWwsMTAwPQopLHRoaXMuX2Ny
ZWF0ZUNvbnRhaW5lcigiZGl2Iik7dmFyIG49M0R0aGlzO3RoaXMuY2hhcnQub24oInJlZHJhdyIs
ZnVuY3Rpb249Cigpe24uX2RyYXcobi5jaGFydCl9KSx0aGlzLmNoYXJ0Lm9uKCJzZXQ6c3RhdGUi
LGZ1bmN0aW9uKCl7dmFyIGU9M0RuLiRlbC5maT0KbmQoIiNpbmZvIiksdD0zRG4uJGVsLmZpbmQo
Ii5jaGFydHMtdmlld3BvcnQtY29udGFpbmVyIikscj0zRGUuZmluZCgiI2ljb24iPQopO3IucmVt
b3ZlQ2xhc3MoKSxlLnNob3coKSxlLmZpbmQoIiN0ZXh0IikuaHRtbChuLmNoYXJ0LmdldCgic3Rh
dGVfaW5mbyIpKTs9CnZhciBpPTNEbi5jaGFydC5nZXQoInN0YXRlIik7c3dpdGNoKGkpe2Nhc2Ui
b2siOmUuaGlkZSgpLHQuc2hvdygpO2JyZWFrO2Nhcz0KZSJmYWlsZWQiOnIuYWRkQ2xhc3MoImlj
b24gZmEgZmEtd2FybmluZyIpLHQuaGlkZSgpO2JyZWFrO2RlZmF1bHQ6ci5hZGRDbGFzPQpzKCJp
Y29uIGZhIGZhLXNwaW5uZXIgZmEtc3BpbiIpLHQuc2hvdygpfX0pfSxzaG93OmZ1bmN0aW9uKCl7
dGhpcy4kZWwuc2hvdyg9Cil9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLiRlbC5oaWRlKCl9LF9mdWxs
c2NyZWVuOmZ1bmN0aW9uKGUsdCl7ZS5jc3MoImhlaWdodD0KIiwkKHdpbmRvdykuaGVpZ2h0KCkt
dCksJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbigpe2UuY3NzKCJoZWlnaHQiLCQod2luZG93PQop
LmhlaWdodCgpLXQpfSl9LF9jcmVhdGVDb250YWluZXI6ZnVuY3Rpb24oZSx0KXt0PTNEdHx8MTtm
b3IodmFyIG4gaW4gdGhpcy49CmNvbnRhaW5lcl9saXN0KXRoaXMuY29udGFpbmVyX2xpc3Rbbl0u
cmVtb3ZlKCk7dGhpcy5jb250YWluZXJfbGlzdD0zRFtdLHRoaT0Kcy5jYW52YXNfbGlzdD0zRFtd
O2Zvcih2YXIgbj0zRDA7bjx0O24rKyl7dmFyIHI9M0QkKHRoaXMuX3RlbXBsYXRlQ29udGFpbmVy
PQooZSxwYXJzZUludCgxMDAvdCkpKTt0aGlzLiRlbC5hcHBlbmQociksdGhpcy5jb250YWluZXJf
bGlzdFtuXT0zRHIsZT0zRD0zRCI9CnN2ZyI/dGhpcy5jYW52YXNfbGlzdFtuXT0zRGQzLnNlbGVj
dChyLmZpbmQoIiNjYW52YXMiKVswXSk6dGhpcy5jYW52YXNfbGlzdD0KW25dPTNEci5maW5kKCIj
Y2FudmFzIil9fSxfZHJhdzpmdW5jdGlvbihlKXt2YXIgdD0zRHRoaXMsbj0zRGUuZGVmZXJyZWQu
cmVnPQppc3RlcigpLHI9M0RlLmdldCgidHlwZSIpO3RoaXMuY2hhcnRfZGVmaW5pdGlvbj0zRGUu
ZGVmaW5pdGlvbjt2YXIgaT0zRHRoaXM9Ci5jaGFydF9kZWZpbml0aW9uLnVzZV9wYW5lbHMscz0z
RDE7aSYmKHM9M0RlLmdyb3Vwcy5sZW5ndGgpLHRoaXMuX2NyZWF0ZUNvbj0KdGFpbmVyKHRoaXMu
Y2hhcnRfZGVmaW5pdGlvbi50YWcscyksZS5zdGF0ZSgid2FpdCIsIlBsZWFzZSB3YWl0Li4uIik7
aWYoIXRoPQppcy5jaGFydF9kZWZpbml0aW9uLmV4ZWN1dGV8fHRoaXMuY2hhcnRfZGVmaW5pdGlv
bi5leGVjdXRlJiZlLmdldCgibW9kaWZpZWQ9CiIpKXRoaXMuYXBwLmpvYnMuY2xlYW51cChlKSxl
LnNldCgibW9kaWZpZWQiLCExKTt2YXIgdD0zRHRoaXM7cmVxdWlyZShbInBsdT0KZ2luL2NoYXJ0
cy8iK3RoaXMuYXBwLmNoYXJ0UGF0aChyKSsiL3dyYXBwZXIiXSxmdW5jdGlvbihyKXt2YXIgaT0z
RG5ldyByKHQuPQphcHAse2NhbnZhczp0LmNhbnZhc19saXN0fSk7dC5jaGFydF9kZWZpbml0aW9u
LmV4ZWN1dGU/dC5hcHAuam9icy5yZXF1ZXN0KGU9Cix0Ll9kZWZhdWx0U2V0dGluZ3NTdHJpbmco
ZSksdC5fZGVmYXVsdFJlcXVlc3RTdHJpbmcoZSksZnVuY3Rpb24oKXtpLmRyYXcobj0KLGUsdC5f
ZGVmYXVsdFJlcXVlc3REaWN0aW9uYXJ5KGUpKX0sZnVuY3Rpb24oKXtlLmRlZmVycmVkLmRvbmUo
bil9KTppLmRyYXcoPQpuLGUsdC5fZGVmYXVsdFJlcXVlc3REaWN0aW9uYXJ5KGUpKX0pfSxfZGVm
YXVsdFJlcXVlc3RTdHJpbmc6ZnVuY3Rpb24oZSl7dmE9CnIgdD0zRCIiLG49M0QwLHI9M0R0aGlz
O3JldHVybiBlLmdyb3Vwcy5lYWNoKGZ1bmN0aW9uKGUpe24rKztmb3IodmFyIGkgaW4gcj0KLmNo
YXJ0X2RlZmluaXRpb24uY29sdW1ucyl0Kz0zRGkrIl8iK24rIjoiKyhwYXJzZUludChlLmdldChp
KSkrMSkrIiwgIn0pLHQuPQpzdWJzdHJpbmcoMCx0Lmxlbmd0aC0yKX0sX2RlZmF1bHRTZXR0aW5n
c1N0cmluZzpmdW5jdGlvbihlKXt2YXIgdD0zRCIiO2Zvcig9CmtleSBpbiBlLnNldHRpbmdzLmF0
dHJpYnV0ZXMpdCs9M0RrZXkrIjoiK2Uuc2V0dGluZ3MuZ2V0KGtleSkrIiwgIjtyZXR1cm4gdD0K
LnN1YnN0cmluZygwLHQubGVuZ3RoLTIpfSxfZGVmYXVsdFJlcXVlc3REaWN0aW9uYXJ5OmZ1bmN0
aW9uKGUpe3ZhciB0PTNEe2dyPQpvdXBzOltdfTt0aGlzLmNoYXJ0X2RlZmluaXRpb24uZXhlY3V0
ZT90LmlkPTNEZS5nZXQoImRhdGFzZXRfaWRfam9iIik6dC5pZD0KPTNEZS5nZXQoImRhdGFzZXRf
aWQiKTt2YXIgbj0zRDAsaT0zRHRoaXM7cmV0dXJuIGUuZ3JvdXBzLmVhY2goZnVuY3Rpb24oZSl7
PQp2YXIgcz0zRHt9O2Zvcih2YXIgbyBpbiBpLmNoYXJ0X2RlZmluaXRpb24uY29sdW1ucyl7dmFy
IHU9M0RpLmNoYXJ0X2RlZmluaXQ9Cmlvbi5jb2x1bW5zW29dO3Nbb109M0RyLm1lcmdlKHtpbmRl
eDplLmdldChvKX0sdSl9dC5ncm91cHMucHVzaCh7a2V5OisrbisiOj0KIitlLmdldCgia2V5Iiks
Y29sdW1uczpzfSl9KSx0fSxfdGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4nPGRpdiBjbGFzcz0z
RCJjPQpoYXJ0cy12aWV3cG9ydCI+PGRpdiBpZD0zRCJpbmZvIiBjbGFzcz0zRCJpbmZvIj48c3Bh
biBpZD0zRCJpY29uIiBjbGFzcz0zRCI9Cmljb24iIC8+PHNwYW4gaWQ9M0QidGV4dCIgY2xhc3M9
M0QidGV4dCIgLz48L2Rpdj48L2Rpdj4nfSxfdGVtcGxhdGVDb250YWluZT0KcjpmdW5jdGlvbihl
LHQpe3JldHVybic8ZGl2IGNsYXNzPTNEImNoYXJ0cy12aWV3cG9ydC1jb250YWluZXIiIHN0eWxl
PTNEIndpPQpkdGg6Jyt0KyclOyI+JysnPGRpdiBpZD0zRCJtZW51Ii8+JysiPCIrZSsnIGlkPTNE
ImNhbnZhcyIgY2xhc3M9M0QiY2hhcnRzLXY9Cmlld3BvcnQtY2FudmFzIj4nKyI8L2Rpdj4ifX0p
fSksZGVmaW5lKCJwbHVnaW4vdmlld3Mvdmlld2VyIixbInV0aWxzL3V0aWxzIj0KLCJwbHVnaW4v
bGlicmFyeS91aSIsIm12Yy91aS91aS1wb3J0bGV0IiwicGx1Z2luL21vZGVscy9ncm91cCIsInBs
dWdpbi92aWV3PQpzL3ZpZXdwb3J0IiwicGx1Z2luL2xpYnJhcnkvc2NyZWVuc2hvdCJdLGZ1bmN0
aW9uKGUsdCxuLHIsaSxzKXtyZXR1cm4gQmFja2I9Cm9uZS5WaWV3LmV4dGVuZCh7aW5pdGlhbGl6
ZTpmdW5jdGlvbihlLHIpe3RoaXMuYXBwPTNEZSx0aGlzLmNoYXJ0PTNEdGhpcy5hcD0KcC5jaGFy
dCx0aGlzLnZpZXdwb3J0X3ZpZXc9M0RuZXcgaShlKTt2YXIgbz0zRHRoaXM7dGhpcy5tZXNzYWdl
PTNEbmV3IHQuTWVzPQpzYWdlLHRoaXMucG9ydGxldD0zRG5ldyBuLlZpZXcoe2ljb246ImZhLWJh
ci1jaGFydC1vIix0aXRsZToiVmlld3BvcnQiLHNjcm89CmxsYWJsZTohMSxvcGVyYXRpb25zOntl
ZGl0X2J1dHRvbjpuZXcgdC5CdXR0b25JY29uKHtpY29uOiJmYS1lZGl0Iix0b29sdGlwOj0KIkN1
c3RvbWl6ZSB0aGlzIGNoYXJ0Iix0aXRsZToiRWRpdG9yIixvbmNsaWNrOmZ1bmN0aW9uKCl7by5f
d2FpdChvLmNoYXJ0LGZ1PQpuY3Rpb24oKXtvLmFwcC5nbygiZWRpdG9yIil9KX19KSxwaWN0dXJl
X2J1dHRvbjpuZXcgdC5CdXR0b25JY29uKHtpY29uOiJmYS09CmNhbWVyYSIsdG9vbHRpcDoiRG93
bmxvYWQgUERGLWZpbGUgKCIrby5hcHAuY29uZmlnLmdldCgic2NyZWVuc2hvdF91cmwiKSsiKT0K
Iix0aXRsZToiU2NyZWVuc2hvdCIsb25jbGljazpmdW5jdGlvbigpe28uX3dhaXQoby5jaGFydCxm
dW5jdGlvbigpe3MuY3JlYXRlPQooby52aWV3cG9ydF92aWV3LiRlbCxvLmFwcC5jb25maWcuZ2V0
KCJzY3JlZW5zaG90X3VybCIpLG8uY2hhcnQuZ2V0KCJ0aXRsZSI9CikpfSl9fSl9fSksdGhpcy5w
b3J0bGV0LmFwcGVuZCh0aGlzLm1lc3NhZ2UuJGVsKSx0aGlzLnBvcnRsZXQuYXBwZW5kKHRoaXMu
dj0KaWV3cG9ydF92aWV3LiRlbCksdGhpcy5zZXRFbGVtZW50KHRoaXMucG9ydGxldC4kZWwpO3Zh
ciBvPTNEdGhpczt0aGlzLmNoYXJ0PQoub24oImNoYW5nZTp0aXRsZSIsZnVuY3Rpb24oKXtvLl9y
ZWZyZXNoVGl0bGUoKX0pfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy4kZWw9Ci5zaG93KCksJCh3aW5k
b3cpLnRyaWdnZXIoInJlc2l6ZSIpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy4kZWwuaGlkZSgpfSxf
cmVmcj0KZXNoVGl0bGU6ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXMuY2hhcnQuZ2V0KCJ0aXRsZSIp
O3RoaXMucG9ydGxldC50aXRsZShlKX0sPQpfd2FpdDpmdW5jdGlvbihlLHQpe2UuZGVmZXJyZWQu
cmVhZHkoKT90KCk6dGhpcy5tZXNzYWdlLnVwZGF0ZSh7bWVzc2FnZToiWW89CnVyIGNoYXJ0IGlz
IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFBsZWFzZSB3YWl0IGFuZCB0cnkgYWdhaW4uIn0p
fX0pfSksZD0KZWZpbmUoIm12Yy91aS91aS10YWJzIixbInV0aWxzL3V0aWxzIl0sZnVuY3Rpb24o
ZSl7dmFyIHQ9M0RCYWNrYm9uZS5WaWV3LmV4PQp0ZW5kKHtvcHRpb25zRGVmYXVsdDp7dGl0bGVf
bmV3OiIiLG9wZXJhdGlvbnM6bnVsbCxvbm5ldzpudWxsfSxpbml0aWFsaXplOmY9CnVuY3Rpb24o
dCl7dGhpcy52aXNpYmxlPTNEITEsdGhpcy4kbmF2PTNEbnVsbCx0aGlzLiRjb250ZW50PTNEbnVs
bCx0aGlzLmZpcj0Kc3RfdGFiPTNEbnVsbCx0aGlzLm9wdGlvbnM9M0RlLm1lcmdlKHQsdGhpcy5v
cHRpb25zRGVmYXVsdCk7dmFyIG49M0QkKHRoaXMuPQpfdGVtcGxhdGUodGhpcy5vcHRpb25zKSk7
dGhpcy4kbmF2PTNEbi5maW5kKCIudGFiLW5hdmlnYXRpb24iKSx0aGlzLiRjb250ZW49CnQ9M0Ru
LmZpbmQoIi50YWItY29udGVudCIpLHRoaXMuc2V0RWxlbWVudChuKSx0aGlzLmxpc3Q9M0R7fTt2
YXIgcj0zRHRoaXM7dD0KaGlzLm9wdGlvbnMub3BlcmF0aW9ucyYmJC5lYWNoKHRoaXMub3B0aW9u
cy5vcGVyYXRpb25zLGZ1bmN0aW9uKGUsdCl7dC4kZWwuPQpwcm9wKCJpZCIsZSksci4kbmF2LmZp
bmQoIi5vcGVyYXRpb25zIikuYXBwZW5kKHQuJGVsKX0pO2lmKHRoaXMub3B0aW9ucy5vbm49CmV3
KXt2YXIgaT0zRCQodGhpcy5fdGVtcGxhdGVfdGFiX25ldyh0aGlzLm9wdGlvbnMpKTt0aGlzLiRu
YXYuYXBwZW5kKGkpLGkudD0Kb29sdGlwKHt0aXRsZToiQWRkIGEgbmV3IHRhYiIscGxhY2VtZW50
OiJib3R0b20iLGNvbnRhaW5lcjpyLiRlbH0pLGkub24oImNsPQppY2siLGZ1bmN0aW9uKGUpe2ku
dG9vbHRpcCgiaGlkZSIpLHIub3B0aW9ucy5vbm5ldygpfSl9fSxhZGQ6ZnVuY3Rpb24oZSl7dmE9
CnIgdD0zRHRoaXMsbj0zRGUuaWQscj0zRCQodGhpcy5fdGVtcGxhdGVfdGFiKGUpKSxpPTNEJCh0
aGlzLl90ZW1wbGF0ZV90YWJfYz0Kb250ZW50KGUpKTt0aGlzLmxpc3Rbbl09M0RlLm9uZGVsPyEw
OiExLHRoaXMub3B0aW9ucy5vbm5ldz90aGlzLiRuYXYuZmluZCgiPQojbmV3LXRhYiIpLmJlZm9y
ZShyKTp0aGlzLiRuYXYuYXBwZW5kKHIpLGkuYXBwZW5kKGUuJGVsKSx0aGlzLiRjb250ZW50LmFw
cGU9Cm5kKGkpLF8uc2l6ZSh0aGlzLmxpc3QpPTNEPTNEMSYmKHIuYWRkQ2xhc3MoImFjdGl2ZSIp
LGkuYWRkQ2xhc3MoImFjdGl2ZSIpLD0KdGhpcy5maXJzdF90YWI9M0RuKTtpZihlLm9uZGVsKXt2
YXIgcz0zRHIuZmluZCgiI2RlbGV0ZSIpO3MudG9vbHRpcCh7dGl0bGU6PQoiRGVsZXRlIHRoaXMg
dGFiIixwbGFjZW1lbnQ6ImJvdHRvbSIsY29udGFpbmVyOnQuJGVsfSkscy5vbigiY2xpY2siLGZ1
bmN0aW89Cm4oKXtyZXR1cm4gcy50b29sdGlwKCJkZXN0cm95IiksdC4kZWwuZmluZCgiLnRvb2x0
aXAiKS5yZW1vdmUoKSxlLm9uZGVsKCksIT0KMX0pfXIub24oImNsaWNrIixmdW5jdGlvbihyKXty
LnByZXZlbnREZWZhdWx0KCksZS5vbmNsaWNrP2Uub25jbGljaygpOnQuc2hvPQp3KG4pfSl9LGRl
bDpmdW5jdGlvbihlKXt0aGlzLiRlbC5maW5kKCIjdGFiLSIrZSkucmVtb3ZlKCksdGhpcy4kZWwu
ZmluZCgiI3Q9CmFiLWNvbnRlbnQtIitlKS5yZW1vdmUoKSx0aGlzLmZpcnN0X3RhYj0zRD0zRGUm
Jih0aGlzLmZpcnN0X3RhYj0zRG51bGwpLHRoaT0Kcy5maXJzdF90YWIhPTNEbnVsbCYmdGhpcy5z
aG93KHRoaXMuZmlyc3RfdGFiKX0sZGVsUmVtb3ZhYmxlOmZ1bmN0aW9uKCl7Zm9yPQoodmFyIGUg
aW4gdGhpcy5saXN0KXRoaXMubGlzdFtlXSYmdGhpcy5kZWwoZSl9LHNob3c6ZnVuY3Rpb24oZSl7
dGhpcy4kZWwuZmE9CmRlSW4oImZhc3QiKSx0aGlzLnZpc2libGU9M0QhMCxlJiYodGhpcy4kZWwu
ZmluZCgiLnRhYi1lbGVtZW50IikucmVtb3ZlQ2xhcz0KcygiYWN0aXZlIiksdGhpcy4kZWwuZmlu
ZCgiLnRhYi1wYW5lIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHRoaXMuJGVsLmZpbmQoPQoiI3Rh
Yi0iK2UpLmFkZENsYXNzKCJhY3RpdmUiKSx0aGlzLiRlbC5maW5kKCIjdGFiLWNvbnRlbnQtIitl
KS5hZGRDbGFzcygiYWM9CnRpdmUiKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLiRlbC5mYWRlT3V0
KCJmYXN0IiksdGhpcy52aXNpYmxlPTNEITF9LGhpZGVPcD0KZXJhdGlvbjpmdW5jdGlvbihlKXt0
aGlzLiRuYXYuZmluZCgiIyIrZSkuaGlkZSgpfSxzaG93T3BlcmF0aW9uOmZ1bmN0aW9uKGUpPQp7
dGhpcy4kbmF2LmZpbmQoIiMiK2UpLnNob3coKX0sc2V0T3BlcmF0aW9uOmZ1bmN0aW9uKGUsdCl7
dmFyIG49M0R0aGlzLiRuYXY9Ci5maW5kKCIjIitlKTtuLm9mZigiY2xpY2siKSxuLm9uKCJjbGlj
ayIsdCl9LHRpdGxlOmZ1bmN0aW9uKGUsdCl7dmFyIG49M0R0aD0KaXMuJGVsLmZpbmQoIiN0YWIt
dGl0bGUtdGV4dC0iK2UpO3JldHVybiB0JiZuLmh0bWwodCksbi5odG1sKCl9LF90ZW1wbGF0ZTpm
PQp1bmN0aW9uKGUpe3JldHVybic8ZGl2IGNsYXNzPTNEInVpLXRhYnMgdGFiYmFibGUgdGFicy1s
ZWZ0Ij48dWwgaWQ9M0QidGFiLW49CmF2aWdhdGlvbiIgY2xhc3M9M0QidGFiLW5hdmlnYXRpb24g
bmF2IG5hdi10YWJzIj48ZGl2IGNsYXNzPTNEIm9wZXJhdGlvbnMiID0Kc3R5bGU9M0QiZmxvYXQ6
IHJpZ2h0OyBtYXJnaW4tYm90dG9tOiA0cHg7Ij48L2Rpdj48L3VsPjxkaXYgaWQ9M0QidGFiLWNv
bnRlPQpudCIgY2xhc3M9M0QidGFiLWNvbnRlbnQiLz48L2Rpdj4nfSxfdGVtcGxhdGVfdGFiX25l
dzpmdW5jdGlvbihlKXtyZXR1cm4nPGw9CmkgaWQ9M0QibmV3LXRhYiI+PGEgaHJlZj0zRCJqYXZh
c2NyaXB0OnZvaWQoMCk7Ij48aSBjbGFzcz0zRCJ1aS10YWJzLWFkZCBmYT0KIGZhLXBsdXMtY2ly
Y2xlIi8+JytlLnRpdGxlX25ldysiPC9hPiIrIjwvbGk+In0sX3RlbXBsYXRlX3RhYjpmdW5jdGlv
bihlKXt2PQphciB0PTNEJzxsaSBpZD0zRCJ0YWItJytlLmlkKyciIGNsYXNzPTNEInRhYi1lbGVt
ZW50Ij4nKyc8YSBpZD0zRCJ0YWItdGl0bGU9Ci1saW5rLScrZS5pZCsnIiB0aXRsZT0zRCIiIGhy
ZWY9M0QiI3RhYi1jb250ZW50LScrZS5pZCsnIiBkYXRhLW9yaWdpbmFsLXRpdD0KbGU9M0QiIj4n
Kyc8c3BhbiBpZD0zRCJ0YWItdGl0bGUtdGV4dC0nK2UuaWQrJyI+JytlLnRpdGxlKyI8L3NwYW4+
IjtyZXR1cm4gPQplLm9uZGVsJiYodCs9M0QnPGkgaWQ9M0QiZGVsZXRlIiBjbGFzcz0zRCJ1aS10
YWJzLWRlbGV0ZSBmYSBmYS1taW51cy1jaXJjbGU9CiIvPicpLHQrPTNEIjwvYT48L2xpPiIsdH0s
X3RlbXBsYXRlX3RhYl9jb250ZW50OmZ1bmN0aW9uKGUpe3JldHVybic8ZGl2IGlkPQo9M0QidGFi
LWNvbnRlbnQtJytlLmlkKyciIGNsYXNzPTNEInRhYi1wYW5lIi8+J319KTtyZXR1cm57Vmlldzp0
fX0pLGRlZmluZSg9CiJwbHVnaW4vbGlicmFyeS91aS10YWJsZSIsWyJ1dGlscy91dGlscyJdLGZ1
bmN0aW9uKGUpe3ZhciB0PTNEQmFja2JvbmUuVmlldz0KLmV4dGVuZCh7cm93Om51bGwscm93X2Nv
dW50OjAsb3B0aW9uc0RlZmF1bHQ6e2NvbnRlbnQ6Ik5vIGNvbnRlbnQgYXZhaWxhYmxlPQouIixv
bmNoYW5nZTpudWxsLG9uZGJsY2xpY2s6bnVsbCxvbmNvbmZpcm06bnVsbCxjbHM6IiJ9LGV2ZW50
czp7Y2xpY2s6Il9vbmM9CmxpY2siLGRibGNsaWNrOiJfb25kYmxjbGljayJ9LGluaXRpYWxpemU6
ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPTNEZS5tZXJnZT0KKHQsdGhpcy5vcHRpb25zRGVmYXVs
dCk7dmFyIG49M0QkKHRoaXMuX3RlbXBsYXRlKHQpKTt0aGlzLiR0aGVhZD0zRG4uZmluZCgiPQp0
aGVhZCIpLHRoaXMuJHRib2R5PTNEbi5maW5kKCJ0Ym9keSIpLHRoaXMuJHRtZXNzYWdlPTNEbi5m
aW5kKCJ0bWVzc2FnZSIpLHQ9Cmhpcy5zZXRFbGVtZW50KG4pLHRoaXMucm93PTNEJCgiPHRyPjwv
dHI+Iil9LGFkZEhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdD0zRD0KJCgiPHRoPjwvdGg+Iik7dC5h
cHBlbmQoZSksdGhpcy5yb3cuYXBwZW5kKHQpfSxhcHBlbmRIZWFkZXI6ZnVuY3Rpb24oKXt0aGlz
PQouJHRoZWFkLmFwcGVuZCh0aGlzLnJvdyksdGhpcy5yb3c9M0QkKCI8dHI+PC90cj4iKX0sYWRk
OmZ1bmN0aW9uKGUsdCxuKXt2YXI9CiByPTNEJCgiPHRkPjwvdGQ+Iik7dCYmci5jc3MoIndpZHRo
Iix0KSxuJiZyLmNzcygidGV4dC1hbGlnbiIsbiksci5hcHBlbmQoZT0KKSx0aGlzLnJvdy5hcHBl
bmQocil9LGFwcGVuZDpmdW5jdGlvbihlKXt0aGlzLl9jb21taXQoZSl9LHByZXBlbmQ6ZnVuY3Rp
b24oPQplKXt0aGlzLl9jb21taXQoZSwhMCl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4k
ZWwuZmluZCgiIyIrZSl9LGRlbDpmdW49CmN0aW9uKGUpe3ZhciB0PTNEdGhpcy4kdGJvZHkuZmlu
ZCgiIyIrZSk7dC5sZW5ndGg+MCYmKHQucmVtb3ZlKCksdGhpcy5yb3dfYz0Kb3VudC0tLHRoaXMu
X3JlZnJlc2goKSl9LGRlbEFsbDpmdW5jdGlvbigpe3RoaXMuJHRib2R5Lmh0bWwoIiIpLHRoaXMu
cm93X2NvPQp1bnQ9M0QwLHRoaXMuX3JlZnJlc2goKX0sdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5i
ZWZvcmU9M0R0aGlzLiR0Ym9keS5maW5kKCI9Ci5jdXJyZW50IikuYXR0cigiaWQiKSxlIT0zRD0z
RHVuZGVmaW5lZCYmKHRoaXMuJHRib2R5LmZpbmQoInRyIikucmVtb3ZlQ2xhcz0KcygiY3VycmVu
dCIpLGUmJnRoaXMuJHRib2R5LmZpbmQoIiMiK2UpLmFkZENsYXNzKCJjdXJyZW50IikpO3ZhciB0
PTNEdGhpcy4kPQp0Ym9keS5maW5kKCIuY3VycmVudCIpLmF0dHIoImlkIik7cmV0dXJuIHQ9M0Q9
M0Q9M0R1bmRlZmluZWQ/bnVsbDoodCE9M0R0aGk9CnMuYmVmb3JlJiZ0aGlzLm9wdGlvbnMub25j
aGFuZ2UmJnRoaXMub3B0aW9ucy5vbmNoYW5nZShlKSx0KX0sc2l6ZTpmdW5jdGlvbj0KKCl7cmV0
dXJuIHRoaXMuJHRib2R5LmZpbmQoInRyIikubGVuZ3RofSxfY29tbWl0OmZ1bmN0aW9uKGUsdCl7
dGhpcy5kZWwoZSksPQp0aGlzLnJvdy5hdHRyKCJpZCIsZSksdD90aGlzLiR0Ym9keS5wcmVwZW5k
KHRoaXMucm93KTp0aGlzLiR0Ym9keS5hcHBlbmQodGg9CmlzLnJvdyksdGhpcy5yb3c9M0QkKCI8
dHI+PC90cj4iKSx0aGlzLnJvd19jb3VudCsrLHRoaXMuX3JlZnJlc2goKX0sX29uY2xpYz0Kazpm
dW5jdGlvbihlKXt2YXIgdD0zRHRoaXMudmFsdWUoKSxuPTNEJChlLnRhcmdldCkuY2xvc2VzdCgi
dHIiKS5hdHRyKCJpZCIpPQo7biE9M0QiIiYmbiYmdCE9M0RuJiYodGhpcy5vcHRpb25zLm9uY29u
ZmlybT90aGlzLm9wdGlvbnMub25jb25maXJtKG4pOnRoaXM9Ci52YWx1ZShuKSl9LF9vbmRibGNs
aWNrOmZ1bmN0aW9uKGUpe3ZhciB0PTNEdGhpcy52YWx1ZSgpO3QmJnRoaXMub3B0aW9ucy5vbj0K
ZGJsY2xpY2smJnRoaXMub3B0aW9ucy5vbmRibGNsaWNrKHQpfSxfcmVmcmVzaDpmdW5jdGlvbigp
e3RoaXMucm93X2NvdW50PTNEPQo9M0QwP3RoaXMuJHRtZXNzYWdlLnNob3coKTp0aGlzLiR0bWVz
c2FnZS5oaWRlKCl9LF90ZW1wbGF0ZTpmdW5jdGlvbihlKXtyZXQ9CnVybic8ZGl2Pjx0YWJsZSBj
bGFzcz0zRCJ1aS10YWJsZSAnK2UuY2xzKyciPicrIjx0aGVhZD48L3RoZWFkPiIrJzx0Ym9keSBz
dD0KeWxlPTNEImN1cnNvcjogcG9pbnRlcjsiPjwvdGJvZHk+JysiPC90YWJsZT4iKyI8dG1lc3Nh
Z2U+IitlLmNvbnRlbnQrIjwvdG1lPQpzc2FnZT4iKyI8ZGl2PiJ9fSk7cmV0dXJue1ZpZXc6dH19
KSxkZWZpbmUoInBsdWdpbi92aWV3cy9ncm91cCIsWyJwbHVnaW4vbGk9CmJyYXJ5L3VpLXRhYmxl
IiwicGx1Z2luL2xpYnJhcnkvdWkiLCJ1dGlscy91dGlscyJdLGZ1bmN0aW9uKGUsdCxuKXtyZXR1
cm4gQj0KYWNrYm9uZS5WaWV3LmV4dGVuZCh7aW5pdGlhbGl6ZTpmdW5jdGlvbihyLGkpe3RoaXMu
YXBwPTNEcjt2YXIgcz0zRHRoaXM7dGhpPQpzLmNoYXJ0PTNEdGhpcy5hcHAuY2hhcnQsdGhpcy5n
cm91cD0zRGkuZ3JvdXAsdGhpcy5ncm91cF9rZXk9M0RuZXcgdC5JbnB1dCg9CntwbGFjZWhvbGRl
cjoiRGF0YSBsYWJlbCIsb25jaGFuZ2U6ZnVuY3Rpb24oZSl7cy5ncm91cC5zZXQoImtleSIsZSl9
fSksdGhpcz0KLnRhYmxlPTNEbmV3IGUuVmlldyh7Y29udGVudDoiTm8gZGF0YSBjb2x1bW4uIn0p
O3ZhciBvPTNEJCgiPGRpdi8+Iik7by5hcHBlPQpuZChuLndyYXAoKG5ldyB0LkxhYmVsKHt0aXRs
ZToiUHJvdmlkZSBhIGxhYmVsOiJ9KSkuJGVsKSksby5hcHBlbmQobi53cmFwKHQ9Cmhpcy5ncm91
cF9rZXkuJGVsKSksby5hcHBlbmQobi53cmFwKChuZXcgdC5MYWJlbCh7dGl0bGU6IlNlbGVjdCBj
b2x1bW5zOiJ9KT0KKS4kZWwpKSxvLmFwcGVuZChuLndyYXAodGhpcy50YWJsZS4kZWwpKSx0aGlz
LnNldEVsZW1lbnQobyk7dmFyIHM9M0R0aGlzO3RoPQppcy5jaGFydC5vbigiY2hhbmdlOmRhdGFz
ZXRfaWQiLGZ1bmN0aW9uKCl7cy5fcmVmcmVzaFRhYmxlKCl9KSx0aGlzLmNoYXJ0Lm89Cm4oImNo
YW5nZTp0eXBlIixmdW5jdGlvbigpe3MuX3JlZnJlc2hUYWJsZSgpfSksdGhpcy5ncm91cC5vbigi
Y2hhbmdlOmtleSIsZj0KdW5jdGlvbigpe3MuX3JlZnJlc2hHcm91cEtleSgpfSksdGhpcy5ncm91
cC5vbigiY2hhbmdlIixmdW5jdGlvbigpe3MuX3JlZnJlPQpzaEdyb3VwKCl9KSx0aGlzLl9yZWZy
ZXNoVGFibGUoKSx0aGlzLl9yZWZyZXNoR3JvdXBLZXkoKSx0aGlzLl9yZWZyZXNoR3JvdXA9Cigp
fSxfcmVmcmVzaFRhYmxlOmZ1bmN0aW9uKCl7dmFyIGU9M0R0aGlzLmNoYXJ0LmdldCgiZGF0YXNl
dF9pZCIpLG49M0R0aGlzLj0KY2hhcnQuZ2V0KCJ0eXBlIik7aWYoIWV8fCFuKXJldHVybjt2YXIg
cj0zRHRoaXMsaT0zRHRoaXMuY2hhcnQuZGVmaW5pdGlvbjt0PQpoaXMudGFibGUuZGVsQWxsKCk7
dmFyIHM9M0R7fTtmb3IodmFyIG8gaW4gaS5jb2x1bW5zKXt2YXIgdT0zRGkuY29sdW1uc1tvXTs9
CmlmKCF1KXtjb25zb2xlLmRlYnVnKCJHcm91cDo6X3JlZnJlc2hUYWJsZSgpIC0gU2tpcHBpbmcg
Y29sdW1uIGRlZmluaXRpb24uIj0KKTtjb250aW51ZX12YXIgYT0zRG5ldyB0LlNlbGVjdC5WaWV3
KHtpZDoic2VsZWN0XyIrbyx3YWl0OiEwfSk7dGhpcy50YWJsZS5hPQpkZCh1LnRpdGxlLCIyNSUi
KSx0aGlzLnRhYmxlLmFkZChhLiRlbCksdGhpcy50YWJsZS5hcHBlbmQobyksc1tvXT0zRGF9dGhp
cy49CmNoYXJ0LnN0YXRlKCJ3YWl0IiwiTG9hZGluZyBtZXRhZGF0YS4uLiIpO3ZhciBmPTNEdGhp
cy5jaGFydC5kZWZlcnJlZC5yZWdpcz0KdGVyKCk7dGhpcy5hcHAuZGF0YXNldHMucmVxdWVzdCh7
aWQ6ZX0sZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIHMpci5fYWRkUm93PQoodCxlLHMsaS5jb2x1
bW5zW3RdKTtyLmNoYXJ0LnN0YXRlKCJvayIsIk1ldGFkYXRhIGluaXRpYWxpemVkLi4uIiksci5j
aGFydC49CmRlZmVycmVkLmRvbmUoZil9KX0sX2FkZFJvdzpmdW5jdGlvbihlLHQsbixyKXt2YXIg
aT0zRHRoaXMscz0zRHIuaXNfbGFiZWwsbz0KPTNEci5pc19hdXRvLHU9M0RyLmlzX251bWVyaWMs
YT0zRFtdLGY9M0RuW2VdO28mJmEucHVzaCh7bGFiZWw6IkNvbHVtbjogUm93PQogTnVtYmVyIix2
YWx1ZToiYXV0byJ9KTt2YXIgbD0zRHQubWV0YWRhdGFfY29sdW1uX3R5cGVzO2Zvcih2YXIgYyBp
biBsKXt2YXI9CiBoPTNEITE7bFtjXT0zRD0zRCJpbnQifHxsW2NdPTNEPTNEImZsb2F0Ij9oPTNE
dTpoPTNEcyxoJiZhLnB1c2goe2xhYmVsOiJDbz0KbHVtbjogIisocGFyc2VJbnQoYykrMSkrIiBb
IitsW2NdKyJdIix2YWx1ZTpjfSl9Zi51cGRhdGUoYSk7aWYoIWYuZXhpc3RzKHRoPQppcy5ncm91
cC5nZXQoZSkpKXt2YXIgcD0zRGYuZmlyc3QoKTtjb25zb2xlLmRlYnVnKCdHcm91cCgpOjpfYWRk
Um93KCkgLSBTd2k9CnRjaGluZyBtb2RlbCB2YWx1ZSBmcm9tICInK3RoaXMuZ3JvdXAuZ2V0KGUp
KyciIHRvICInK3ArJyIuJyksdGhpcy5ncm91cC5zZT0KdChlLHApfWYudmFsdWUodGhpcy5ncm91
cC5nZXQoZSkpLGYuc2V0T25DaGFuZ2UoZnVuY3Rpb24odCl7aS5ncm91cC5zZXQoZSx0PQopLGku
Y2hhcnQuc2V0KCJtb2RpZmllZCIsITApfSksZi5zaG93KCl9LF9yZWZyZXNoR3JvdXA6ZnVuY3Rp
b24oKXt0aGlzLmdyb3U9CnAuc2V0KCJkYXRlIixuLnRpbWUoKSl9LF9yZWZyZXNoR3JvdXBLZXk6
ZnVuY3Rpb24oKXt2YXIgZT0zRHRoaXMuZ3JvdXAuZ2V0KD0KImtleSIpO2U9M0Q9M0Q9M0R1bmRl
ZmluZWQmJihlPTNEIiIpLHRoaXMuZ3JvdXBfa2V5LnZhbHVlKGUpfX0pfSksZGVmaW5lKCJwPQps
dWdpbi9saWJyYXJ5L3VpLXRhYmxlLWZvcm0iLFsicGx1Z2luL2xpYnJhcnkvdWktdGFibGUiLCJw
bHVnaW4vbGlicmFyeS91aSI9CiwidXRpbHMvdXRpbHMiXSxmdW5jdGlvbihlLHQsbil7dmFyIHI9
M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlZmF1bD0KdDp7dGl0bGU6IiIsY29udGVu
dDoiIixtb2RlOiIifSxsaXN0OltdLGluaXRpYWxpemU6ZnVuY3Rpb24ocixpKXt0aGlzLmFwcD0K
PTNEcix0aGlzLm9wdGlvbnM9M0RuLm1lcmdlKGksdGhpcy5vcHRpb25zRGVmYXVsdCksdGhpcy50
YWJsZV90aXRsZT0zRG5ldyB0PQouTGFiZWwoe3RpdGxlOnRoaXMub3B0aW9ucy50aXRsZX0pLHRo
aXMudGFibGU9M0RuZXcgZS5WaWV3KHtjb250ZW50OnRoaXMub3A9CnRpb25zLmNvbnRlbnR9KTt2
YXIgcz0zRCQoJzxkaXYgY2xhc3M9M0QidWktdGFibGUtZm9ybSIvPicpO3RoaXMub3B0aW9ucy50
aT0KdGxlJiZzLmFwcGVuZChuLndyYXAodGhpcy50YWJsZV90aXRsZS4kZWwpKSxzLmFwcGVuZChu
LndyYXAodGhpcy50YWJsZS4kZWwpPQopLHRoaXMuc2V0RWxlbWVudChzKX0sdGl0bGU6ZnVuY3Rp
b24oZSl7dGhpcy50YWJsZV90aXRsZS50aXRsZShlKX0sdXBkYXRlOmY9CnVuY3Rpb24oZSx0KXt0
aGlzLnRhYmxlLmRlbEFsbCgpLHRoaXMubGlzdD0zRFtdO2Zvcih2YXIgbiBpbiBlKXRoaXMuX2Fk
ZChlWz0Kbl0uaWR8fG4sZVtuXSx0KTtmb3IodmFyIG4gaW4gdGhpcy5saXN0KXRoaXMubGlzdFtu
XS50cmlnZ2VyKCJjaGFuZ2UiKX0sX2FkPQpkOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT0zRHRoaXMs
cz0zRG51bGwsbz0zRG4udHlwZTtzd2l0Y2gobyl7Y2FzZSJ0ZXh0IjpzPQo9M0RuZXcgdC5JbnB1
dCh7aWQ6ImZpZWxkLSIrZSxwbGFjZWhvbGRlcjpuLnBsYWNlaG9sZGVyLHZhbHVlOnIuZ2V0KGUp
LG9uY2g9CmFuZ2U6ZnVuY3Rpb24odCl7ci5zZXQoZSx0KX19KTticmVhaztjYXNlInJhZGlvYnV0
dG9uIjpzPTNEbmV3IHQuUmFkaW9CdXR0bz0Kbih7aWQ6ImZpZWxkLSIrZSxkYXRhOm4uZGF0YSx2
YWx1ZTpyLmdldChlKSxvbmNoYW5nZTpmdW5jdGlvbih0KXtyLnNldChlLHQpPQo7dmFyIHM9M0Rf
LmZpbmRXaGVyZShuLmRhdGEse3ZhbHVlOnR9KTtpZihzKXtmb3IodmFyIG8gaW4gcy5zaG93KXt2
YXIgdT0zRHM9Ci5zaG93W29dO2kudGFibGUuZ2V0KHUpLnNob3coKX1mb3IodmFyIG8gaW4gcy5o
aWRlKXt2YXIgdT0zRHMuaGlkZVtvXTtpLnRhYj0KbGUuZ2V0KHUpLmhpZGUoKX19fX0pO2JyZWFr
O2Nhc2Uic2VsZWN0IjpzPTNEbmV3IHQuU2VsZWN0LlZpZXcoe2lkOiJmaWVsZC0iPQorZSxkYXRh
Om4uZGF0YSx2YWx1ZTpyLmdldChlKSxvbmNoYW5nZTpmdW5jdGlvbih0KXtyLnNldChlLHQpO3Zh
ciBzPTNEXy5maW49CmRXaGVyZShuLmRhdGEse3ZhbHVlOnR9KTtpZihzKXtmb3IodmFyIG8gaW4g
cy5zaG93KXt2YXIgdT0zRHMuc2hvd1tvXTtpLnRhYj0KbGUuZ2V0KHUpLnNob3coKX1mb3IodmFy
IG8gaW4gcy5oaWRlKXt2YXIgdT0zRHMuaGlkZVtvXTtpLnRhYmxlLmdldCh1KS5oaWRlPQooKX19
fX0pO2JyZWFrO2Nhc2UiZGF0YXNldCI6cz0zRG5ldyB0LlNlbGVjdC5WaWV3KHtpZDoiZmllbGQt
IitlLG9uY2hhbmdlOmY9CnVuY3Rpb24odCl7ci5zZXQoZSx0KX19KSxpLmFwcC5kYXRhc2V0cy5v
bigiYWxsIixmdW5jdGlvbigpe3ZhciB0PTNEW107aS5hcD0KcC5kYXRhc2V0cy5lYWNoKGZ1bmN0
aW9uKGUpe2UuZ2V0KCJkYXRhdHlwZV9pZCIpPTNEPTNEbi5kYXRhJiZ0LnB1c2goe3ZhbHVlPQo6
ZS5nZXQoImlkIiksbGFiZWw6ZS5nZXQoIm5hbWUiKX0pfSkscy51cGRhdGUodCksci5nZXQoZSl8
fHIuc2V0KGUscy5maXJzdCg9CikpLHMudmFsdWUoci5nZXQoZSkpfSksaS5hcHAuZGF0YXNldHMu
dHJpZ2dlcigiYWxsLmRhdGFzZXRzIik7YnJlYWs7Y2FzZSJ0ZT0KeHRhcmVhIjpzPTNEbmV3IHQu
VGV4dGFyZWEoe2lkOiJmaWVsZC0iK2Usb25jaGFuZ2U6ZnVuY3Rpb24oKXtyLnNldChlLHMudmFs
PQp1ZSgpKX19KTticmVhaztjYXNlInNlcGFyYXRvciI6cz0zRCQoIjxkaXYvPiIpO2JyZWFrO2Rl
ZmF1bHQ6cz0zRG5ldyB0LklucHU9CnQoe2lkOiJmaWVsZC0iK2UscGxhY2Vob2xkZXI6bi5wbGFj
ZWhvbGRlcix0eXBlOm4udHlwZSxvbmNoYW5nZTpmdW5jdGlvbigpez0Kci5zZXQoZSxzLnZhbHVl
KCkpfX0pfWlmKG8hPTNEInNlcGFyYXRvciIpe3IuZ2V0KGUpfHxyLnNldChlLG4uaW5pdCkscy52
YWx1PQplKHIuZ2V0KGUpKSx0aGlzLmxpc3RbZV09M0RzO3ZhciB1PTNEJCgiPGRpdi8+Iik7dS5h
cHBlbmQocy4kZWwpLG4uaW5mbyYmdS49CmFwcGVuZCgnPGRpdiBjbGFzcz0zRCJ1aS10YWJsZS1m
b3JtLWluZm8iPicrbi5pbmZvKyI8L2Rpdj4iKSx0aGlzLm9wdGlvbnMucz0KdHlsZT0zRD0zRCJi
b2xkIj8odGhpcy50YWJsZS5hZGQoKG5ldyB0LkxhYmVsKHt0aXRsZTpuLnRpdGxlLGNsczoiZm9y
bS1sYWJlPQpsIn0pKS4kZWwpLHRoaXMudGFibGUuYWRkKHUpKToodGhpcy50YWJsZS5hZGQoJzxz
cGFuIGNsYXNzPTNEInVpLXRhYmxlLWZvcm09Ci10aXRsZSI+JytuLnRpdGxlKyI8L3NwYW4+Iiwi
MjUlIiksdGhpcy50YWJsZS5hZGQodSkpfWVsc2UgdGhpcy50YWJsZS5hZGQoJz0KPGRpdiBjbGFz
cz0zRCJ1aS10YWJsZS1mb3JtLXNlcGFyYXRvciI+JytuLnRpdGxlKyI6PGRpdi8+IiksdGhpcy50
YWJsZS5hZGQoPQokKCI8ZGl2Lz4iKSk7dGhpcy50YWJsZS5hcHBlbmQoZSl9fSk7cmV0dXJue1Zp
ZXc6cn19KSxkZWZpbmUoInBsdWdpbi92aWV3cy89CnNldHRpbmdzIixbInBsdWdpbi9saWJyYXJ5
L3VpIiwicGx1Z2luL2xpYnJhcnkvdWktdGFibGUtZm9ybSIsInV0aWxzL3V0aWxzIj0KXSxmdW5j
dGlvbihlLHQsbil7cmV0dXJuIEJhY2tib25lLlZpZXcuZXh0ZW5kKHtpbml0aWFsaXplOmZ1bmN0
aW9uKGUsbil7dGhpPQpzLmFwcD0zRGU7dmFyIHI9M0R0aGlzO3RoaXMuY2hhcnQ9M0R0aGlzLmFw
cC5jaGFydCx0aGlzLmZvcm09M0RuZXcgdC5WaWV3KHs9CnRpdGxlOiJDaGFydCBvcHRpb25zOiIs
Y29udGVudDoiVGhpcyBjaGFydCB0eXBlIGRvZXMgbm90IHByb3ZpZGUgYW55IG9wdGlvbj0Kcy4i
fSksdGhpcy5zZXRFbGVtZW50KHRoaXMuZm9ybS4kZWwpO3ZhciByPTNEdGhpczt0aGlzLmNoYXJ0
Lm9uKCJjaGFuZ2UiLGZ1PQpuY3Rpb24oKXtyLl9yZWZyZXNoKCl9KX0sX3JlZnJlc2g6ZnVuY3Rp
b24oKXt2YXIgZT0zRHRoaXMuY2hhcnQuZGVmaW5pdGlvbjs9CmlmKCFlKXJldHVybjt0aGlzLmZv
cm0udGl0bGUoZS5jYXRlZ29yeSsiIC0gIitlLnRpdGxlKyI6IiksdGhpcy5mb3JtLnVwZGF0ZT0K
KGUuc2V0dGluZ3MsdGhpcy5jaGFydC5zZXR0aW5ncyl9fSl9KSxkZWZpbmUoInBsdWdpbi92aWV3
cy90eXBlcyIsWyJ1dGlscy91PQp0aWxzIiwicGx1Z2luL2xpYnJhcnkvdWkiXSxmdW5jdGlvbihl
LHQpe3JldHVybiBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW89Cm5zRGVmYXVsdDp7b25jaGFu
Z2U6bnVsbCxvbmRibGNsaWNrOm51bGx9LGV2ZW50czp7Y2xpY2s6Il9vbmNsaWNrIixkYmxjbGlj
az0KOiJfb25kYmxjbGljayJ9LGluaXRpYWxpemU6ZnVuY3Rpb24odCxuKXt2YXIgcj0zRHRoaXM7
dGhpcy5hcHA9M0R0LHRoaXMub3B0PQppb25zPTNEZS5tZXJnZShuLHRoaXMub3B0aW9uc0RlZmF1
bHQpO3ZhciBpPTNEJCgnPGRpdiBjbGFzcz0zRCJjaGFydHMtZ3JpZCI9Ci8+Jyk7dGhpcy5zZXRF
bGVtZW50KGkpLHRoaXMuX3JlbmRlcigpLHRoaXMuX2ZpbHRlcigiZGVmYXVsdCIpfSx2YWx1ZTpm
dW5jdD0KaW9uKGUpe3ZhciB0PTNEdGhpcy4kZWwuZmluZCgiLmN1cnJlbnQiKS5hdHRyKCJpZCIp
O2UhPTNEPTNEdW5kZWZpbmVkJiYodGhpPQpzLiRlbC5maW5kKCIuY3VycmVudCIpLnJlbW92ZUNs
YXNzKCJjdXJyZW50IiksdGhpcy4kZWwuZmluZCgiIyIrZSkuYWRkQ2xhc3M9CigiY3VycmVudCIp
KTt2YXIgbj0zRHRoaXMuJGVsLmZpbmQoIi5jdXJyZW50IikuYXR0cigiaWQiKTtyZXR1cm4gbj0z
RD0zRD0zRD0KdW5kZWZpbmVkP251bGw6KG4hPTNEdCYmdGhpcy5vcHRpb25zLm9uY2hhbmdlJiZ0
aGlzLm9wdGlvbnMub25jaGFuZ2UoZSksbil9PQosX2ZpbHRlcjpmdW5jdGlvbihlKXt2YXIgdD0z
RHRoaXMuYXBwLnR5cGVzLmF0dHJpYnV0ZXM7Zm9yKHZhciBuIGluIHQpe3ZhciA9CnI9M0R0W25d
LGk9M0R0aGlzLiRlbC5maW5kKCIjIituKSxzPTNEci5rZXl3b3Jkc3x8IiI7cy5pbmRleE9mKGUp
PTNEPTNELTEmJj0KZSE9M0QiYWxsIj9pLmhpZGUoKTppLnNob3coKX19LF9yZW5kZXI6ZnVuY3Rp
b24oKXt2YXIgdD0zRHt9LG49M0R0aGlzLmFwcC50PQp5cGVzLmF0dHJpYnV0ZXM7Zm9yKHZhciBy
IGluIG4pe3ZhciBpPTNEbltyXSxzPTNEaS5jYXRlZ29yeTt0W3NdfHwodFtzXT0zRHs9Cn0pLHRb
c11bcl09M0RpfWZvcih2YXIgcyBpbiB0KXt2YXIgbz0zRCQoJzxkaXYgc3R5bGU9M0QiY2xlYXI6
IGJvdGg7Ii8+Jyk7bz0KLmFwcGVuZChlLndyYXAodGhpcy5fdGVtcGxhdGVfaGVhZGVyKHt0aXRs
ZTpzfSkpKTtmb3IodmFyIHIgaW4gdFtzXSl7dmFyIGk9Cj0zRHRbc11bcl07by5hcHBlbmQoZS53
cmFwKHRoaXMuX3RlbXBsYXRlX2l0ZW0oe2lkOnIsdGl0bGU6aS50aXRsZSsiICgiK2kubD0KaWJy
YXJ5KyIpIix1cmw6Y29uZmlnLmFwcF9yb290KyJjaGFydHMvIit0aGlzLmFwcC5jaGFydFBhdGgo
cikrIi9sb2dvLnBuZyJ9PQopKSl9dGhpcy4kZWwuYXBwZW5kKGUud3JhcChvKSl9fSxfb25jbGlj
azpmdW5jdGlvbihlKXt2YXIgdD0zRHRoaXMudmFsdWUoKSw9Cm49M0QkKGUudGFyZ2V0KS5jbG9z
ZXN0KCIuaXRlbSIpLmF0dHIoImlkIik7biE9M0QiIiYmbiYmdCE9M0RuJiZ0aGlzLnZhbHVlKD0K
bil9LF9vbmRibGNsaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PTNEdGhpcy52YWx1ZSgpO3QmJnRoaXMu
b3B0aW9ucy5vbmRibGNsaWNrPQomJnRoaXMub3B0aW9ucy5vbmRibGNsaWNrKHQpfSxfdGVtcGxh
dGVfaGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybic8ZGl2IGNsYXM9CnM9M0QiaGVhZGVyIj4mYnVs
bDsgJytlLnRpdGxlKyI8ZGl2PiJ9LF90ZW1wbGF0ZV9pdGVtOmZ1bmN0aW9uKGUpe3JldHVybic8
ZD0KaXYgaWQ9M0QiJytlLmlkKyciIGNsYXNzPTNEIml0ZW0iPicrJzxpbWcgY2xhc3M9M0QiaW1h
Z2UiIHNyYz0zRCInK2UudXJsKyciPQo+JysnPGRpdiBjbGFzcz0zRCJ0aXRsZSI+JytlLnRpdGxl
KyI8L2Rpdj4iKyI8ZGl2PiJ9fSl9KSxkZWZpbmUoInBsdWdpbi92aWU9CndzL2VkaXRvciIsWyJt
dmMvdWkvdWktdGFicyIsInBsdWdpbi9saWJyYXJ5L3VpIiwibXZjL3VpL3VpLXBvcnRsZXQiLCJ1
dGlscz0KL3V0aWxzIiwicGx1Z2luL21vZGVscy9jaGFydCIsInBsdWdpbi9tb2RlbHMvZ3JvdXAi
LCJwbHVnaW4vdmlld3MvZ3JvdXAiLCJwPQpsdWdpbi92aWV3cy9zZXR0aW5ncyIsInBsdWdpbi92
aWV3cy90eXBlcyJdLGZ1bmN0aW9uKGUsdCxuLHIsaSxzLG8sdSxhKXtyZXQ9CnVybiBCYWNrYm9u
ZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlZmF1bHQ6e2hlYWRlcjohMCxjb250ZW50OiJObyBjb250
ZW50IGF2YT0KaWxhYmxlLiJ9LGluaXRpYWxpemU6ZnVuY3Rpb24oaSxzKXt2YXIgbz0zRHRoaXM7
dGhpcy5hcHA9M0RpLHRoaXMuY2hhcnQ9M0R0PQpoaXMuYXBwLmNoYXJ0LHRoaXMub3B0aW9ucz0z
RHIubWVyZ2Uocyx0aGlzLm9wdGlvbnNEZWZhdWx0KSx0aGlzLm1lc3NhZ2U9M0Q9Cm5ldyB0Lk1l
c3NhZ2UsdGhpcy5wb3J0bGV0PTNEbmV3IG4uVmlldyh7aWNvbjoiZmEtYmFyLWNoYXJ0LW8iLHRp
dGxlOiJFZGl0bz0KciIsb3BlcmF0aW9uczp7c2F2ZTpuZXcgdC5CdXR0b25JY29uKHtpY29uOiJm
YS1zYXZlIix0b29sdGlwOiJEcmF3IENoYXJ0Iix0PQppdGxlOiJEcmF3IixvbmNsaWNrOmZ1bmN0
aW9uKCl7by5fc2F2ZUNoYXJ0KCl9fSksYmFjazpuZXcgdC5CdXR0b25JY29uKHtpY289Cm46ImZh
LWNhcmV0LWxlZnQiLHRvb2x0aXA6IlJldHVybiB0byBWaWV3ZXIiLHRpdGxlOiJDYW5jZWwiLG9u
Y2xpY2s6ZnVuY3Rpbz0Kbigpe28uYXBwLmdvKCJ2aWV3ZXIiKSxvLmFwcC5zdG9yYWdlLmxvYWQo
KX19KX19KSx0aGlzLnR5cGVzPTNEbmV3IGEoaSx7b25jPQpoYW5nZTpmdW5jdGlvbihlKXt2YXIg
dD0zRG8uYXBwLnR5cGVzLmdldChlKTt0fHxjb25zb2xlLmRlYnVnKCJGQUlMRUQgLSBFZGk9CnRv
cjo6b25jaGFuZ2UoKSAtIENoYXJ0IHR5cGUgbm90IHN1cHBvcnRlZC4iKSxvLmNoYXJ0LmRlZmlu
aXRpb249M0R0LG8uY2hhcj0KdC5zZXR0aW5ncy5jbGVhcigpLG8uY2hhcnQuc2V0KHt0eXBlOmV9
KSxvLmNoYXJ0LnNldCgibW9kaWZpZWQiLCEwKSxjb25zb2xlPQouZGVidWcoIkVkaXRvcjo6b25j
aGFuZ2UoKSAtIFN3aXRjaGVkIGNoYXJ0IHR5cGUuIil9LG9uZGJsY2xpY2s6ZnVuY3Rpb24oZSk9
CntvLl9zYXZlQ2hhcnQoKX19KSx0aGlzLnRhYnM9M0RuZXcgZS5WaWV3KHt0aXRsZV9uZXc6IkFk
ZCBEYXRhIixvbm5ldzpmdW5jdD0KaW9uKCl7dmFyIGU9M0RvLl9hZGRHcm91cE1vZGVsKCk7by50
YWJzLnNob3coZS5pZCl9fSksdGhpcy50aXRsZT0zRG5ldyB0LkluPQpwdXQoe3BsYWNlaG9sZGVy
OiJDaGFydCB0aXRsZSIsb25jaGFuZ2U6ZnVuY3Rpb24oKXtvLmNoYXJ0LnNldCgidGl0bGUiLG8u
dGk9CnRsZS52YWx1ZSgpKX19KTt2YXIgZj0zRCQoIjxkaXYvPiIpO2YuYXBwZW5kKHIud3JhcCgo
bmV3IHQuTGFiZWwoe3RpdGxlOiJQcj0Kb3ZpZGUgYSBjaGFydCB0aXRsZToifSkpLiRlbCkpLGYu
YXBwZW5kKHIud3JhcCh0aGlzLnRpdGxlLiRlbCkpLGYuYXBwZW5kKHIuPQp3cmFwKChuZXcgdC5M
YWJlbCh7dGl0bGU6IlNlbGVjdCBhIGNoYXJ0IHR5cGU6In0pKS4kZWwpKSxmLmFwcGVuZChyLndy
YXAodGg9CmlzLnR5cGVzLiRlbCkpLHRoaXMudGFicy5hZGQoe2lkOiJtYWluIix0aXRsZToiU3Rh
cnQiLCRlbDpmfSksdGhpcy5zZXR0aW5ncz0KPTNEbmV3IHUodGhpcy5hcHApLHRoaXMudGFicy5h
ZGQoe2lkOiJzZXR0aW5ncyIsdGl0bGU6IkNvbmZpZ3VyYXRpb24iLCRlbDp0PQpoaXMuc2V0dGlu
Z3MuJGVsfSksdGhpcy5wb3J0bGV0LmFwcGVuZCh0aGlzLm1lc3NhZ2UuJGVsKSx0aGlzLnBvcnRs
ZXQuYXBwZW49CmQodGhpcy50YWJzLiRlbCksdGhpcy5zZXRFbGVtZW50KHRoaXMucG9ydGxldC4k
ZWwpLHRoaXMudGFicy5oaWRlT3BlcmF0aW9uKD0KImJhY2siKTt2YXIgbz0zRHRoaXM7dGhpcy5j
aGFydC5vbigiY2hhbmdlOnRpdGxlIixmdW5jdGlvbihlKXtvLl9yZWZyZXNoVGl0PQpsZSgpfSks
dGhpcy5jaGFydC5vbigiY2hhbmdlOnR5cGUiLGZ1bmN0aW9uKGUpe28udHlwZXMudmFsdWUoZS5n
ZXQoInR5cGUiKSk9Cn0pLHRoaXMuY2hhcnQub24oInJlc2V0IixmdW5jdGlvbihlKXtvLl9yZXNl
dENoYXJ0KCl9KSx0aGlzLmFwcC5jaGFydC5vbigicj0KZWRyYXciLGZ1bmN0aW9uKGUpe28ucG9y
dGxldC5zaG93T3BlcmF0aW9uKCJiYWNrIil9KSx0aGlzLmFwcC5jaGFydC5ncm91cHMuPQpvbigi
YWRkIixmdW5jdGlvbihlKXtvLl9hZGRHcm91cChlKX0pLHRoaXMuYXBwLmNoYXJ0Lmdyb3Vwcy5v
bigicmVtb3ZlIixmdW49CmN0aW9uKGUpe28uX3JlbW92ZUdyb3VwKGUpfSksdGhpcy5hcHAuY2hh
cnQuZ3JvdXBzLm9uKCJyZXNldCIsZnVuY3Rpb24oZSl7bz0KLl9yZW1vdmVBbGxHcm91cHMoKX0p
LHRoaXMuYXBwLmNoYXJ0Lmdyb3Vwcy5vbigiY2hhbmdlOmtleSIsZnVuY3Rpb24oZSl7by5fPQpy
ZWZyZXNoR3JvdXBLZXkoKX0pLHRoaXMuX3Jlc2V0Q2hhcnQoKX0sc2hvdzpmdW5jdGlvbigpe3Ro
aXMuJGVsLnNob3coKX0saGk9CmRlOmZ1bmN0aW9uKCl7dGhpcy4kZWwuaGlkZSgpfSxfcmVmcmVz
aFRpdGxlOmZ1bmN0aW9uKCl7dmFyIGU9M0R0aGlzLmNoYXJ0Lj0KZ2V0KCJ0aXRsZSIpO3RoaXMu
cG9ydGxldC50aXRsZShlKSx0aGlzLnRpdGxlLnZhbHVlKGUpfSxfcmVmcmVzaEdyb3VwS2V5OmZ1
PQpuY3Rpb24oKXt2YXIgZT0zRHRoaXMsdD0zRDA7dGhpcy5jaGFydC5ncm91cHMuZWFjaChmdW5j
dGlvbihuKXt2YXIgcj0zRG4uZ2U9CnQoImtleSIsIiIpO3I9M0Q9M0QiIiYmKHI9M0QiQ2hhcnQg
ZGF0YSIpLGUudGFicy50aXRsZShuLmlkLCsrdCsiOiAiK3IpfSl9LD0KX2FkZEdyb3VwTW9kZWw6
ZnVuY3Rpb24oKXt2YXIgZT0zRG5ldyBzKHtpZDpyLnV1aWQoKX0pO3JldHVybiB0aGlzLmNoYXJ0
LmdyPQpvdXBzLmFkZChlKSxlfSxfYWRkR3JvdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9M0R0aGlzLG49
M0RuZXcgbyh0aGlzLmFwcCx7Z3JvdXA9CjplfSk7dGhpcy50YWJzLmFkZCh7aWQ6ZS5pZCwkZWw6
bi4kZWwsb25kZWw6ZnVuY3Rpb24oKXt0LmNoYXJ0Lmdyb3Vwcy5yZW1vdj0KZShlLmlkKX19KSx0
aGlzLl9yZWZyZXNoR3JvdXBLZXkoKSx0aGlzLmNoYXJ0LnNldCgibW9kaWZpZWQiLCEwKX0sX3Jl
bW92ZUdyPQpvdXA6ZnVuY3Rpb24oZSl7dGhpcy50YWJzLmRlbChlLmlkKSx0aGlzLl9yZWZyZXNo
R3JvdXBLZXkoKSx0aGlzLmNoYXJ0LnNldCg9CiJtb2RpZmllZCIsITApfSxfcmVtb3ZlQWxsR3Jv
dXBzOmZ1bmN0aW9uKGUpe3RoaXMudGFicy5kZWxSZW1vdmFibGUoKX0sX3Jlcz0KZXRDaGFydDpm
dW5jdGlvbigpe3RoaXMuY2hhcnQuc2V0KCJpZCIsci51dWlkKCkpLHRoaXMuY2hhcnQuc2V0KCJ0
eXBlIiwiaGlnPQpoY2hhcnRzX2JhciIpLHRoaXMuY2hhcnQuc2V0KCJkYXRhc2V0X2lkIix0aGlz
LmFwcC5vcHRpb25zLmNvbmZpZy5kYXRhc2V0X2k9CmQpLHRoaXMuY2hhcnQuc2V0KCJ0aXRsZSIs
Ik5ldyBDaGFydCIpLHRoaXMucG9ydGxldC5oaWRlT3BlcmF0aW9uKCJiYWNrIil9LD0KX3NhdmVD
aGFydDpmdW5jdGlvbigpe3RoaXMuY2hhcnQuc2V0KHt0eXBlOnRoaXMudHlwZXMudmFsdWUoKSx0
aXRsZTp0aGlzLnRpPQp0bGUudmFsdWUoKSxkYXRlOnIudGltZSgpfSk7aWYodGhpcy5jaGFydC5n
cm91cHMubGVuZ3RoPTNEPTNEMCl7dGhpcy5tZXNzYWc9CmUudXBkYXRlKHttZXNzYWdlOiJQbGVh
c2Ugc2VsZWN0IGRhdGEgY29sdW1ucyBiZWZvcmUgZHJhd2luZyB0aGUgY2hhcnQuIn0pOz0KdmFy
IGU9M0R0aGlzLl9hZGRHcm91cE1vZGVsKCk7dGhpcy50YWJzLnNob3coZS5pZCk7cmV0dXJufXZh
ciB0PTNEdGhpcyxuPTNEPQohMCxpPTNEdGhpcy5jaGFydC5kZWZpbml0aW9uO3RoaXMuY2hhcnQu
Z3JvdXBzLmVhY2goZnVuY3Rpb24oZSl7aWYoIW4pcmV0dXI9Cm47Zm9yKHZhciByIGluIGkuY29s
dW1ucylpZihlLmF0dHJpYnV0ZXNbcl09M0Q9M0QibnVsbCIpe3QubWVzc2FnZS51cGRhdGUoez0K
c3RhdHVzOiJkYW5nZXIiLG1lc3NhZ2U6IlRoaXMgY2hhcnQgdHlwZSByZXF1aXJlcyBjb2x1bW4g
dHlwZXMgbm90IGZvdW5kIGluPQogeW91ciB0YWJ1bGFyIGZpbGUuIn0pLHQudGFicy5zaG93KGUu
aWQpLG49M0QhMTtyZXR1cm59fSk7aWYoIW4pcmV0dXJuO3RoaXM9Ci5hcHAuZ28oInZpZXdlciIp
O3ZhciB0PTNEdGhpczt0aGlzLmNoYXJ0LmRlZmVycmVkLmV4ZWN1dGUoZnVuY3Rpb24oKXt0LmFw
cD0KLnN0b3JhZ2Uuc2F2ZSgpLHQuY2hhcnQudHJpZ2dlcigicmVkcmF3Iil9KX19KX0pLGRlZmlu
ZSgicGx1Z2luL21vZGVscy9jb25mPQppZyIsW10sZnVuY3Rpb24oKXtyZXR1cm4gQmFja2JvbmUu
TW9kZWwuZXh0ZW5kKHtkZWZhdWx0czp7cXVlcnlfbGltaXQ6MWUzLHE9CnVlcnlfdGltZW91dDox
MDAsc2NyZWVuc2hvdF91cmw6Imh0dHA6Ly9leHBvcnQuaGlnaGNoYXJ0cy5jb20vIn19KX0pLGRl
ZmluZT0KKCJwbHVnaW4vY2hhcnRzL252ZDMvY29tbW9uL2NvbmZpZyIsW10sZnVuY3Rpb24oKXty
ZXR1cm57dGl0bGU6IiIsY2F0ZWdvcnk6PQoiIixsaWJyYXJ5OiJOVkQzIix0YWc6InN2ZyIsa2V5
d29yZHM6ImRlZmF1bHQgbnZkMyIsc2V0dGluZ3M6e3NlcGFyYXRvcl9sYWI9CmVsOnt0aXRsZToi
WCBheGlzIix0eXBlOiJzZXBhcmF0b3IifSx4X2F4aXNfbGFiZWw6e3RpdGxlOiJBeGlzIGxhYmVs
IixpbmZvOj0KIlByb3ZpZGUgYSBsYWJlbCBmb3IgdGhlIGF4aXMuIix0eXBlOiJ0ZXh0Iixpbml0
OiJYLWF4aXMiLHBsYWNlaG9sZGVyOiJBeGlzPQogbGFiZWwifSx4X2F4aXNfdHlwZTp7dGl0bGU6
IkF4aXMgdmFsdWUgdHlwZSIsaW5mbzoiU2VsZWN0IHRoZSB2YWx1ZSB0eXBlIG89CmYgdGhlIGF4
aXMuIix0eXBlOiJzZWxlY3QiLGluaXQ6ImF1dG8iLGRhdGE6W3tsYWJlbDoiLS0gRG8gbm90IHNo
b3cgdmFsdWVzID0KLS0iLHZhbHVlOiJoaWRlIixoaWRlOlsieF9heGlzX3RpY2siXX0se2xhYmVs
OiJBdXRvIix2YWx1ZToiYXV0byIsaGlkZTpbInhfPQpheGlzX3RpY2siXX0se2xhYmVsOiJGbG9h
dCIsdmFsdWU6ImYiLHNob3c6WyJ4X2F4aXNfdGljayJdfSx7bGFiZWw6IkV4cG9uZW49CnQiLHZh
bHVlOiJlIixzaG93OlsieF9heGlzX3RpY2siXX0se2xhYmVsOiJJbnRlZ2VyIix2YWx1ZToiZCIs
aGlkZTpbInhfYXhpcz0KX3RpY2siXX0se2xhYmVsOiJQZXJjZW50YWdlIix2YWx1ZToicCIsc2hv
dzpbInhfYXhpc190aWNrIl19LHtsYWJlbDoiUm91bmRlPQpkIix2YWx1ZToiciIsc2hvdzpbInhf
YXhpc190aWNrIl19LHtsYWJlbDoiU0ktcHJlZml4Iix2YWx1ZToicyIsc2hvdzpbInhfYXg9Cmlz
X3RpY2siXX1dfSx4X2F4aXNfdGljazp7dGl0bGU6IkF4aXMgdGljayBmb3JtYXQiLGluZm86IlNl
bGVjdCB0aGUgdGljayBmbz0Kcm1hdCBmb3IgdGhlIGF4aXMuIix0eXBlOiJzZWxlY3QiLGluaXQ6
Ii4xIixkYXRhOlt7bGFiZWw6IjAuMDAwMDEiLHZhbHVlOiIuPQo1In0se2xhYmVsOiIwLjAwMDEi
LHZhbHVlOiIuNCJ9LHtsYWJlbDoiMC4wMDEiLHZhbHVlOiIuMyJ9LHtsYWJlbDoiMC4wMSIsdmE9
Cmx1ZToiLjIifSx7bGFiZWw6IjAuMSIsdmFsdWU6Ii4xIn0se2xhYmVsOiIxIix2YWx1ZToiMSJ9
XX0sc2VwYXJhdG9yX3RpY2s6ez0KdGl0bGU6IlkgYXhpcyIsdHlwZToic2VwYXJhdG9yIn0seV9h
eGlzX2xhYmVsOnt0aXRsZToiQXhpcyBsYWJlbCIsaW5mbzoiUHJvPQp2aWRlIGEgbGFiZWwgZm9y
IHRoZSBheGlzLiIsdHlwZToidGV4dCIsaW5pdDoiWS1heGlzIixwbGFjZWhvbGRlcjoiQXhpcyBs
YWI9CmVsIn0seV9heGlzX3R5cGU6e3RpdGxlOiJBeGlzIHZhbHVlIHR5cGUiLGluZm86IlNlbGVj
dCB0aGUgdmFsdWUgdHlwZSBvZiB0aD0KZSBheGlzLiIsdHlwZToic2VsZWN0Iixpbml0OiJhdXRv
IixkYXRhOlt7bGFiZWw6Ii0tIERvIG5vdCBzaG93IHZhbHVlcyAtLSIsPQp2YWx1ZToiaGlkZSIs
aGlkZTpbInlfYXhpc190aWNrIl19LHtsYWJlbDoiQXV0byIsdmFsdWU6ImF1dG8iLGhpZGU6WyJ5
X2F4aXM9Cl90aWNrIl19LHtsYWJlbDoiRmxvYXQiLHZhbHVlOiJmIixzaG93OlsieV9heGlzX3Rp
Y2siXX0se2xhYmVsOiJFeHBvbmVudCIsdj0KYWx1ZToiZSIsc2hvdzpbInlfYXhpc190aWNrIl19
LHtsYWJlbDoiSW50ZWdlciIsdmFsdWU6ImQiLGhpZGU6WyJ5X2F4aXNfdGljPQprIl19LHtsYWJl
bDoiUGVyY2VudGFnZSIsdmFsdWU6InAiLHNob3c6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IlJv
dW5kZWQiLHY9CmFsdWU6InIiLHNob3c6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IlNJLXByZWZp
eCIsdmFsdWU6InMiLHNob3c6WyJ5X2F4aXNfdD0KaWNrIl19XX0seV9heGlzX3RpY2s6e3RpdGxl
OiJBeGlzIHRpY2sgZm9ybWF0IixpbmZvOiJTZWxlY3QgdGhlIHRpY2sgZm9ybWF0PQogZm9yIHRo
ZSBheGlzLiIsdHlwZToic2VsZWN0Iixpbml0OiIuMSIsZGF0YTpbe2xhYmVsOiIwLjAwMDAxIix2
YWx1ZToiLjUifSw9CntsYWJlbDoiMC4wMDAxIix2YWx1ZToiLjQifSx7bGFiZWw6IjAuMDAxIix2
YWx1ZToiLjMifSx7bGFiZWw6IjAuMDEiLHZhbHVlOj0KIi4yIn0se2xhYmVsOiIwLjEiLHZhbHVl
OiIuMSJ9LHtsYWJlbDoiMSIsdmFsdWU6IjEifV19LHNlcGFyYXRvcl9sZWdlbmQ6e3RpPQp0bGU6
Ik90aGVycyIsdHlwZToic2VwYXJhdG9yIn0sc2hvd19sZWdlbmQ6e3RpdGxlOiJTaG93IGxlZ2Vu
ZCIsaW5mbzoiV291bGQ9CiB5b3UgbGlrZSB0byBhZGQgYSBsZWdlbmQ/Iix0eXBlOiJyYWRpb2J1
dHRvbiIsaW5pdDoidHJ1ZSIsZGF0YTpbe2xhYmVsOiJZZT0KcyIsdmFsdWU6InRydWUifSx7bGFi
ZWw6Ik5vIix2YWx1ZToiZmFsc2UifV19fX19KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvbnZkPQoz
L2Jhci9jb25maWciLFsicGx1Z2luL2NoYXJ0cy9udmQzL2NvbW1vbi9jb25maWciXSxmdW5jdGlv
bihlKXtyZXR1cm4gJC5leHQ9CmVuZCghMCx7fSxlLHt0aXRsZToiUmVndWxhciIsY2F0ZWdvcnk6
IkJhciBkaWFncmFtcyIsY29sdW1uczp7eDp7dGl0bGU6IlZhbD0KdWVzIGZvciB4LWF4aXMiLGlz
X2xhYmVsOiEwLGlzX2F1dG86ITB9LHk6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVt
PQplcmljOiEwfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9udmQzL2Jhcl9zdGFja2VkL2Nv
bmZpZyIsWyJwbHVnaW4vY2hhcnQ9CnMvbnZkMy9jb21tb24vY29uZmlnIl0sZnVuY3Rpb24oZSl7
cmV0dXJuICQuZXh0ZW5kKCEwLHt9LGUse3RpdGxlOiJTdGFja2VkIj0KLGNhdGVnb3J5OiJCYXIg
ZGlhZ3JhbXMiLGNvbHVtbnM6e3k6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJp
YzohPQowfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9udmQzL2Jhcl9ob3Jpem9udGFsL2Nv
bmZpZyIsWyJwbHVnaW4vY2hhcnRzL249CnZkMy9jb21tb24vY29uZmlnIl0sZnVuY3Rpb24oZSl7
cmV0dXJuICQuZXh0ZW5kKCEwLHt9LGUse3RpdGxlOiJIb3Jpem9udGFsIj0KLGNhdGVnb3J5OiJC
YXIgZGlhZ3JhbXMiLGNvbHVtbnM6e3g6e3RpdGxlOiJWYWx1ZXMgZm9yIHgtYXhpcyIsaXNfbGFi
ZWw6ITAsPQppc19hdXRvOiEwfSx5Ont0aXRsZToiVmFsdWVzIGZvciB5LWF4aXMiLGlzX251bWVy
aWM6ITB9fSxzZXR0aW5nczp7eF9heGlzX3Q9CnlwZTp7aW5pdDoiaGlkZSJ9fX0pfSksZGVmaW5l
KCJwbHVnaW4vY2hhcnRzL252ZDMvYmFyX2hvcml6b250YWxfc3RhY2tlZC9jbz0KbmZpZyIsWyJw
bHVnaW4vY2hhcnRzL252ZDMvY29tbW9uL2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4
dGVuZCghMCx7PQp9LGUse3RpdGxlOiJTdGFja2VkIGhvcml6b250YWwiLGNhdGVnb3J5OiJCYXIg
ZGlhZ3JhbXMiLHNldHRpbmdzOnt4X2F4aXNfdHk9CnBlOntpbml0OiJoaWRlIn19LGNvbHVtbnM6
e3k6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJpYzohMH19fSl9KT0KLGRlZmlu
ZSgicGx1Z2luL2NoYXJ0cy9udmQzL2xpbmVfZm9jdXMvY29uZmlnIixbInBsdWdpbi9jaGFydHMv
bnZkMy9jb21tb24vPQpjb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30s
ZSx7dGl0bGU6IkxpbmUgd2l0aCBmb2N1cyIsY2F0ZWc9Cm9yeToiT3RoZXJzIixrZXl3b3Jkczoi
ZGVmYXVsdCBudmQzIixjb2x1bW5zOnt5Ont0aXRsZToiVmFsdWVzIGZvciB5LWF4aXMiLD0KaXNf
bnVtZXJpYzohMH19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvbnZkMy9waWUvY29uZmlnIixb
XSxmdW5jdGlvbigpe3JlPQp0dXJuICQuZXh0ZW5kKCEwLHt9LHt0aXRsZToiUGllIGNoYXJ0Iixj
YXRlZ29yeToiQXJlYSBjaGFydHMiLGxpYnJhcnk6Ik5WRDM9CiIsdGFnOiJzdmciLGtleXdvcmRz
OiJkZWZhdWx0IG52ZDMiLHVzZV9wYW5lbHM6ITAsY29sdW1uczp7bGFiZWw6e3RpdGxlOiJMYT0K
YmVscyIsaXNfbGFiZWw6ITAsaXNfYXV0bzohMH0seTp7dGl0bGU6IlZhbHVlcyIsaXNfbnVtZXJp
YzohMH19LHNldHRpbmdzOntzPQpob3dfbGVnZW5kOnt0aXRsZToiU2hvdyBsZWdlbmQiLGluZm86
IldvdWxkIHlvdSBsaWtlIHRvIGFkZCBhIGxlZ2VuZD8iLHR5cGU9Cjoic2VsZWN0Iixpbml0OiJm
YWxzZSIsZGF0YTpbe2xhYmVsOiJZZXMiLHZhbHVlOiJ0cnVlIn0se2xhYmVsOiJObyIsdmFsdWU6
Ij0KZmFsc2UifV19LGRvbnV0X3JhdGlvOnt0aXRsZToiRG9udXQgcmF0aW8iLGluZm86IkRldGVy
bWluZSBob3cgbGFyZ2UgdGhlIGRvPQpudXQgaG9sZSB3aWxsIGJlLiIsdHlwZToic2VsZWN0Iixp
bml0OiIwLjUiLGRhdGE6W3tsYWJlbDoiNTAlIix2YWx1ZToiMC41In09Cix7bGFiZWw6IjI1JSIs
dmFsdWU6IjAuMjUifSx7bGFiZWw6IjEwJSIsdmFsdWU6IjAuMTAifSx7bGFiZWw6IjAlIix2YWx1
ZToiMD0KIn1dfSxsYWJlbF9zZXBhcmF0b3I6e3R5cGU6InNlcGFyYXRvciIsdGl0bGU6IkxhYmVs
IHNldHRpbmdzIn0sbGFiZWxfdHlwZTp7PQp0aXRsZToiRG9udXQgbGFiZWwiLGluZm86IldoYXQg
d291bGQgeW91IGxpa2UgdG8gc2hvdyBmb3IgZWFjaCBzbGljZT8iLHR5cGU9Cjoic2VsZWN0Iixp
bml0OiJwZXJjZW50IixkYXRhOlt7bGFiZWw6Ii0tIE5vdGhpbmcgLS0iLHZhbHVlOiJoaWRlIixo
aWRlOiJsYT0KYmVsX291dHNpZGUifSx7bGFiZWw6IkxhYmVsIGNvbHVtbiIsdmFsdWU6ImtleSIs
c2hvdzoibGFiZWxfb3V0c2lkZSJ9LHtsYWJlPQpsOiJWYWx1ZSBjb2x1bW4iLHZhbHVlOiJ2YWx1
ZSIsc2hvdzoibGFiZWxfb3V0c2lkZSJ9LHtsYWJlbDoiUGVyY2VudGFnZSIsdmE9Cmx1ZToicGVy
Y2VudCIsc2hvdzoibGFiZWxfb3V0c2lkZSJ9XX0sbGFiZWxfb3V0c2lkZTp7dGl0bGU6IlNob3cg
b3V0c2lkZSIsaT0KbmZvOiJXb3VsZCB5b3UgbGlrZSB0byBzaG93IGxhYmVscyBvdXRzaWRlIHRo
ZSBkb251dD8iLHR5cGU6InNlbGVjdCIsaW5pdDoiPQpmYWxzZSIsZGF0YTpbe2xhYmVsOiJZZXMi
LHZhbHVlOiJ0cnVlIn0se2xhYmVsOiJObyIsdmFsdWU6ImZhbHNlIn1dfX19KX0pLGQ9CmVmaW5l
KCJwbHVnaW4vY2hhcnRzL252ZDMvc3RhY2tlZGFyZWFfZnVsbC9jb25maWciLFsicGx1Z2luL2No
YXJ0cy9udmQzL2NvbT0KbW9uL2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCgh
MCx7fSxlLHt0aXRsZToiRXhwYW5kZWQiLGNhdGVnb3J5PQo6IkFyZWEgY2hhcnRzIixjb2x1bW5z
Ont5Ont0aXRsZToiVmFsdWVzIGZvciB5LWF4aXMiLGlzX251bWVyaWM6ITB9fX0pfSksZGU9CmZp
bmUoInBsdWdpbi9jaGFydHMvbnZkMy9zdGFja2VkYXJlYV9zdHJlYW0vY29uZmlnIixbInBsdWdp
bi9jaGFydHMvbnZkMy9jbz0KbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRl
bmQoITAse30sZSx7dGl0bGU6IlN0cmVhbSIsY2F0ZWdvcnk6PQoiQXJlYSBjaGFydHMiLGtleXdv
cmRzOiJkZWZhdWx0IG52ZDMiLGNvbHVtbnM6e3k6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpcyI9
Cixpc19udW1lcmljOiEwfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9udmQzL2hpc3RvZ3Jh
bS9jb25maWciLFsicGx1Z2luLz0KY2hhcnRzL252ZDMvY29tbW9uL2NvbmZpZyJdLGZ1bmN0aW9u
KGUpe3JldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXRsZToiSGlzPQp0b2dyYW0iLGNhdGVnb3J5
OiJEYXRhIHByb2Nlc3NpbmcgKHJlcXVpcmVzICdjaGFydHMnIHRvb2wgZnJvbSBUb29sc2hlZCki
LGU9CnhlY3V0ZToiaGlzdG9ncmFtIixjb2x1bW5zOnt5Ont0aXRsZToiT2JzZXJ2YXRpb25zIixp
c19udW1lcmljOiEwfX0sc2V0dGluZz0Kczp7eF9heGlzX2xhYmVsOntpbml0OiJWYWx1ZXMifSx5
X2F4aXNfbGFiZWw6e2luaXQ6IkRlbnNpdHkifSx5X2F4aXNfdHlwZTp7PQppbml0OiJmIn0seV9h
eGlzX3RpY2s6e2luaXQ6Ii4yIn19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvbnZkMy9oaXN0
b2dyYW09Cl9kaXNjcmV0ZS9jb25maWciLFsicGx1Z2luL2NoYXJ0cy9udmQzL2NvbW1vbi9jb25m
aWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJD0KLmV4dGVuZCghMCx7fSxlLHt0aXRsZToiRGlzY3Jl
dGUgSGlzdG9ncmFtIixjYXRlZ29yeToiRGF0YSBwcm9jZXNzaW5nIChyZXF1PQppcmVzICdjaGFy
dHMnIHRvb2wgZnJvbSBUb29sc2hlZCkiLGV4ZWN1dGU6Imhpc3RvZ3JhbWRpc2NyZXRlIixjb2x1
bW5zOnt4Ons9CnRpdGxlOiJPYnNlcnZhdGlvbnMiLGlzX2xhYmVsOiEwfX0sc2V0dGluZ3M6e3hf
YXhpc19sYWJlbDp7aW5pdDoiQnJlYWtzIn0seT0KX2F4aXNfbGFiZWw6e2luaXQ6IkRlbnNpdHki
fSx5X2F4aXNfdHlwZTp7aW5pdDoiZiJ9LHlfYXhpc190aWNrOntpbml0OiIuMiJ9PQp9fSl9KSxk
ZWZpbmUoInBsdWdpbi9jaGFydHMvbnZkMy9saW5lL2NvbmZpZyIsWyJwbHVnaW4vY2hhcnRzL252
ZDMvY29tbW9uL2M9Cm9uZmlnIl0sZnVuY3Rpb24oZSl7cmV0dXJuICQuZXh0ZW5kKCEwLHt9LGUs
e3RpdGxlOiJMaW5lIGNoYXJ0IixjYXRlZ29yeToiTz0KdGhlcnMiLGNvbHVtbnM6e3k6e3RpdGxl
OiJWYWx1ZXMgZm9yIHktYXhpcyIsaXNfbnVtZXJpYzohMH19fSl9KSxkZWZpbmUoInBsPQp1Z2lu
L2NoYXJ0cy9udmQzL3NjYXR0ZXIvY29uZmlnIixbInBsdWdpbi9jaGFydHMvbnZkMy9jb21tb24v
Y29uZmlnIl0sZnVuY3Q9CmlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6IlNj
YXR0ZXIgcGxvdCIsY2F0ZWdvcnk6Ik90aGVycyIsY29sdT0KbW5zOnt4Ont0aXRsZToiVmFsdWVz
IGZvciB4LWF4aXMiLGlzX251bWVyaWM6ITB9LHk6e3RpdGxlOiJWYWx1ZXMgZm9yIHktYXhpPQpz
Iixpc19udW1lcmljOiEwfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9udmQzL3N0YWNrZWRh
cmVhL2NvbmZpZyIsWyJwbHU9Cmdpbi9jaGFydHMvbnZkMy9jb21tb24vY29uZmlnIl0sZnVuY3Rp
b24oZSl7cmV0dXJuICQuZXh0ZW5kKCEwLHt9LGUse3RpdGxlOj0KIlJlZ3VsYXIiLGNhdGVnb3J5
OiJBcmVhIGNoYXJ0cyIsY29sdW1uczp7eTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpc19u
PQp1bWVyaWM6ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9u
L2NvbmZpZyIsW10sZnVuY3Rpb249Cigpe3JldHVybnt0aXRsZToiIixjYXRlZ29yeToiIixsaWJy
YXJ5OiJIaWdoY2hhcnRzIix0YWc6ImRpdiIsa2V5d29yZHM6ImhpZz0KaGNoYXJ0cyIsc2V0dGlu
Z3M6e3NlcGFyYXRvcl9sYWJlbDp7dGl0bGU6IlggYXhpcyIsdHlwZToic2VwYXJhdG9yIn0seF9h
eGlzPQpfbGFiZWw6e3RpdGxlOiJBeGlzIGxhYmVsIixpbmZvOiJQcm92aWRlIGEgbGFiZWwgZm9y
IHRoZSBheGlzLiIsdHlwZToidGV4dCI9Cixpbml0OiJYLWF4aXMiLHBsYWNlaG9sZGVyOiJBeGlz
IGxhYmVsIn0seF9heGlzX3R5cGU6e3RpdGxlOiJBeGlzIHZhbHVlIHR5cD0KZSIsaW5mbzoiU2Vs
ZWN0IHRoZSB2YWx1ZSB0eXBlIG9mIHRoZSBheGlzLiIsdHlwZToic2VsZWN0Iixpbml0OiJhdXRv
IixkYXRhPQo6W3tsYWJlbDoiLS0gRG8gbm90IHNob3cgdmFsdWVzIC0tIix2YWx1ZToiaGlkZSIs
aGlkZTpbInhfYXhpc190aWNrIl19LHtsYWI9CmVsOiJBdXRvIix2YWx1ZToiYXV0byIsaGlkZTpb
InhfYXhpc190aWNrIl19LHtsYWJlbDoiRmxvYXQiLHZhbHVlOiJmIixzaG93Oj0KWyJ4X2F4aXNf
dGljayJdfSx7bGFiZWw6IkV4cG9uZW50Iix2YWx1ZToiZSIsc2hvdzpbInhfYXhpc190aWNrIl19
LHtsYWJlbDoiPQpJbnRlZ2VyIix2YWx1ZToiZCIsaGlkZTpbInhfYXhpc190aWNrIl19LHtsYWJl
bDoiUGVyY2VudGFnZSIsdmFsdWU6InAiLHNob3c9CjpbInhfYXhpc190aWNrIl19LHtsYWJlbDoi
Um91bmRlZCIsdmFsdWU6InIiLHNob3c6WyJ4X2F4aXNfdGljayJdfSx7bGFiZWw6Ij0KU0ktcHJl
Zml4Iix2YWx1ZToicyIsc2hvdzpbInhfYXhpc190aWNrIl19XX0seF9heGlzX3RpY2s6e3RpdGxl
OiJBeGlzIHRpY2sgPQpmb3JtYXQiLGluZm86IlNlbGVjdCB0aGUgdGljayBmb3JtYXQgZm9yIHRo
ZSBheGlzLiIsdHlwZToic2VsZWN0Iixpbml0OiIuMSI9CixkYXRhOlt7bGFiZWw6IjAuMDAwMDEi
LHZhbHVlOiIuNSJ9LHtsYWJlbDoiMC4wMDAxIix2YWx1ZToiLjQifSx7bGFiZWw6IjAuMD0KMDEi
LHZhbHVlOiIuMyJ9LHtsYWJlbDoiMC4wMSIsdmFsdWU6Ii4yIn0se2xhYmVsOiIwLjEiLHZhbHVl
OiIuMSJ9LHtsYWJlbDoiPQoxIix2YWx1ZToiMSJ9XX0seF9heGlzX2dyaWQ6e3RpdGxlOiJBeGlz
IGdyaWQiLGluZm86IldvdWxkIHlvdSBsaWtlIHRvIHNob3c9CiBncmlkIGxpbmVzIGZvciB0aGlz
IGF4aXM/Iix0eXBlOiJyYWRpb2J1dHRvbiIsaW5pdDoiMCIsZGF0YTpbe2xhYmVsOiJPbiIsdj0K
YWx1ZToiMSJ9LHtsYWJlbDoiT2ZmIix2YWx1ZToiMCJ9XX0sc2VwYXJhdG9yX3RpY2s6e3RpdGxl
OiJZIGF4aXMiLHR5cGU6InNlPQpwYXJhdG9yIn0seV9heGlzX2xhYmVsOnt0aXRsZToiQXhpcyBs
YWJlbCIsaW5mbzoiUHJvdmlkZSBhIGxhYmVsIGZvciB0aGUgYXg9CmlzLiIsdHlwZToidGV4dCIs
aW5pdDoiWS1heGlzIixwbGFjZWhvbGRlcjoiQXhpcyBsYWJlbCJ9LHlfYXhpc190eXBlOnt0aXRs
ZT0KOiJBeGlzIHZhbHVlIHR5cGUiLGluZm86IlNlbGVjdCB0aGUgdmFsdWUgdHlwZSBvZiB0aGUg
YXhpcy4iLHR5cGU6InNlbGVjdCIsPQppbml0OiJhdXRvIixkYXRhOlt7bGFiZWw6Ii0tIERvIG5v
dCBzaG93IHZhbHVlcyAtLSIsdmFsdWU6ImhpZGUiLGhpZGU6WyJ5X2E9Cnhpc190aWNrIl19LHts
YWJlbDoiQXV0byIsdmFsdWU6ImF1dG8iLGhpZGU6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IkZs
b2F0Ij0KLHZhbHVlOiJmIixzaG93OlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJFeHBvbmVudCIs
dmFsdWU6ImUiLHNob3c6WyJ5X2F4aXNfPQp0aWNrIl19LHtsYWJlbDoiSW50ZWdlciIsdmFsdWU6
ImQiLGhpZGU6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IlBlcmNlbnRhZ2U9CiIsdmFsdWU6InAi
LHNob3c6WyJ5X2F4aXNfdGljayJdfSx7bGFiZWw6IlJvdW5kZWQiLHZhbHVlOiJyIixzaG93Olsi
eV9heGlzXz0KdGljayJdfSx7bGFiZWw6IlNJLXByZWZpeCIsdmFsdWU6InMiLHNob3c6WyJ5X2F4
aXNfdGljayJdfV19LHlfYXhpc190aWNrOnt0PQppdGxlOiJBeGlzIHRpY2sgZm9ybWF0IixpbmZv
OiJTZWxlY3QgdGhlIHRpY2sgZm9ybWF0IGZvciB0aGUgYXhpcy4iLHR5cGU6InM9CmVsZWN0Iixp
bml0OiIuMSIsZGF0YTpbe2xhYmVsOiIwLjAwMDAxIix2YWx1ZToiLjUifSx7bGFiZWw6IjAuMDAw
MSIsdmFsdWU6Ij0KLjQifSx7bGFiZWw6IjAuMDAxIix2YWx1ZToiLjMifSx7bGFiZWw6IjAuMDEi
LHZhbHVlOiIuMiJ9LHtsYWJlbDoiMC4xIix2YWx1PQplOiIuMSJ9LHtsYWJlbDoiMSIsdmFsdWU6
IjEifV19LHlfYXhpc19ncmlkOnt0aXRsZToiQXhpcyBncmlkIixpbmZvOiJXb3VsZCA9CnlvdSBs
aWtlIHRvIHNob3cgZ3JpZCBsaW5lcyBmb3IgdGhpcyBheGlzPyIsdHlwZToicmFkaW9idXR0b24i
LGluaXQ6IjEiLGRhdD0KYTpbe2xhYmVsOiJPbiIsdmFsdWU6IjEifSx7bGFiZWw6Ik9mZiIsdmFs
dWU6IjAifV19LHNlcGFyYXRvcl9sZWdlbmQ6e3RpdGxlPQo6Ik90aGVycyIsdHlwZToic2VwYXJh
dG9yIn0sbGVnZW5kX2VuYWJsZWQ6e3RpdGxlOiJTaG93IGxlZ2VuZCIsaW5mbzoiV291bGQ9CiB5
b3UgbGlrZSB0byBhZGQgYSBsZWdlbmQ/Iix0eXBlOiJyYWRpb2J1dHRvbiIsaW5pdDoidHJ1ZSIs
ZGF0YTpbe2xhYmVsOiJZZT0KcyIsdmFsdWU6InRydWUifSx7bGFiZWw6Ik5vIix2YWx1ZToiZmFs
c2UifV19fX19KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvaGlnPQpoY2hhcnRzL2Jhci9jb25maWci
LFsicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXs9
CnJldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXRsZToiUmVndWxhciIsY2F0ZWdvcnk6IkJhciBk
aWFncmFtcyIsa2V5d29yZHM6Ij0KaGlnaGNoYXJ0cyIsY29sdW1uczp7eDp7dGl0bGU6IlZhbHVl
cyBmb3IgeC1heGlzIixpc19sYWJlbDohMCxpc19hdXRvOiEwfSx5PQo6e3RpdGxlOiJWYWx1ZXMg
Zm9yIHktYXhpcyIsaXNfbnVtZXJpYzohMH19fSl9KSxkZWZpbmUoInBsdWdpbi9jaGFydHMvaGln
aGM9CmhhcnRzL2Jhcl9zdGFja2VkL2NvbmZpZyIsWyJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMv
Y29tbW9uL2NvbmZpZyJdLGZ1bmN0aT0Kb24oZSl7cmV0dXJuICQuZXh0ZW5kKCEwLHt9LGUse3Rp
dGxlOiJTdGFja2VkIixjYXRlZ29yeToiQmFyIGRpYWdyYW1zIixrZXl3PQpvcmRzOiJoaWdoY2hh
cnRzIixjb2x1bW5zOnt4Ont0aXRsZToiVmFsdWVzIGZvciB4LWF4aXMiLGlzX2xhYmVsOiEwLGlz
X2F1dG89CjohMH0seTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpc19udW1lcmljOiEwfX19
KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cz0KL2hpZ2hjaGFydHMvYmFyX2hvcml6b250YWwvY29u
ZmlnIixbInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZmlnPQoiXSxmdW5jdGlv
bihlKXtyZXR1cm4gJC5leHRlbmQoITAse30sZSx7dGl0bGU6Ikhvcml6b250YWwiLGNhdGVnb3J5
OiJCYXIgZGk9CmFncmFtcyIsa2V5d29yZHM6ImhpZ2hjaGFydHMiLGNvbHVtbnM6e3g6e3RpdGxl
OiJWYWx1ZXMgZm9yIHgtYXhpcyIsaXNfbGFiZT0KbDohMCxpc19hdXRvOiEwfSx5Ont0aXRsZToi
VmFsdWVzIGZvciB5LWF4aXMiLGlzX251bWVyaWM6ITB9fSxzZXR0aW5nczp7eF9hPQp4aXNfdHlw
ZTp7aW5pdDoiaGlkZSJ9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvYmFy
X2hvcml6b250YWw9Cl9zdGFja2VkL2NvbmZpZyIsWyJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMv
Y29tbW9uL2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldD0KdXJuICQuZXh0ZW5kKCEwLHt9LGUse3Rp
dGxlOiJTdGFja2VkIGhvcml6b250YWwiLGNhdGVnb3J5OiJCYXIgZGlhZ3JhbXMiLGtlPQp5d29y
ZHM6ImhpZ2hjaGFydHMiLHNldHRpbmdzOnt4X2F4aXNfdHlwZTp7aW5pdDoiaGlkZSJ9fSxjb2x1
bW5zOnt4Ont0aXRsZTo9CiJWYWx1ZXMgZm9yIHgtYXhpcyIsaXNfbGFiZWw6ITAsaXNfYXV0bzoh
MH0seTp7dGl0bGU6IlZhbHVlcyBmb3IgeS1heGlzIixpcz0KX251bWVyaWM6ITB9fX0pfSksZGVm
aW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvaGlzdG9ncmFtL2NvbmZpZyIsWyJwbHVnPQpp
bi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZmlnIl0sZnVuY3Rpb24oZSl7cmV0dXJuICQu
ZXh0ZW5kKCEwLHt9LGUse3Q9Cml0bGU6Ikhpc3RvZ3JhbSIsY2F0ZWdvcnk6IkRhdGEgcHJvY2Vz
c2luZyAocmVxdWlyZXMgJ2NoYXJ0cycgdG9vbCBmcm9tIFRvbz0KbHNoZWQpIixleGVjdXRlOiJo
aXN0b2dyYW0iLGtleXdvcmRzOiJoaWdoY2hhcnRzIixjb2x1bW5zOnt5Ont0aXRsZToiT2JzZXJ2
PQphdGlvbnMiLGlzX251bWVyaWM6ITB9fSxzZXR0aW5nczp7eF9heGlzX2xhYmVsOntpbml0OiJW
YWx1ZXMifSx5X2F4aXNfbGFiZWw9Cjp7aW5pdDoiRGVuc2l0eSJ9LHlfYXhpc190eXBlOntpbml0
OiJmIn0seV9heGlzX3RpY2s6e2luaXQ6Ii4yIn19fSl9KSxkZWZpbj0KZSgicGx1Z2luL2NoYXJ0
cy9oaWdoY2hhcnRzL2hpc3RvZ3JhbV9kaXNjcmV0ZS9jb25maWciLFsicGx1Z2luL2NoYXJ0cy9o
aWdoPQpjaGFydHMvY29tbW9uL2NvbmZpZyJdLGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCgh
MCx7fSxlLHt0aXRsZToiRGlzY3JldGU9CiBIaXN0b2dyYW0iLGNhdGVnb3J5OiJEYXRhIHByb2Nl
c3NpbmcgKHJlcXVpcmVzICdjaGFydHMnIHRvb2wgZnJvbSBUb29sc2hlZD0KKSIsZXhlY3V0ZToi
aGlzdG9ncmFtZGlzY3JldGUiLGtleXdvcmRzOiJoaWdoY2hhcnRzIixjb2x1bW5zOnt5Ont0aXRs
ZToiT2JzPQplcnZhdGlvbnMiLGlzX2xhYmVsOiEwfX0sc2V0dGluZ3M6e3hfYXhpc19sYWJlbDp7
aW5pdDoiTGFiZWxzIn0seV9heGlzX2xhYmU9Cmw6e2luaXQ6IkRlbnNpdHkifX19KX0pLGRlZmlu
ZSgicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2xpbmUvY29uZmlnIixbInBsdT0KZ2luL2NoYXJ0
cy9oaWdoY2hhcnRzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQo
ITAse30sZSx7PQp0aXRsZToiTGluZSIsY2F0ZWdvcnk6Ik90aGVycyIsa2V5d29yZHM6ImhpZ2hj
aGFydHMiLGNvbHVtbnM6e3g6e3RpdGxlOiJWYWw9CnVlcyBmb3IgeC1heGlzIixpc19sYWJlbDoh
MCxpc19hdXRvOiEwLGlzX251bWVyaWM6ITF9LHk6e3RpdGxlOiJWYWx1ZXMgZm9yID0KeS1heGlz
Iixpc19udW1lcmljOiEwfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL3Bp
ZS9jb25maWciLFsiPQpwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uL2NvbmZpZyJdLGZ1
bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCghMCx7fSw9CmUse3RpdGxlOiJQaWUgY2hhcnQiLGNh
dGVnb3J5OiJBcmVhIGNoYXJ0cyIsa2V5d29yZHM6ImhpZ2hjaGFydHMiLHVzZV9wYW5lbD0Kczoh
MCxjb2x1bW5zOntsYWJlbDp7dGl0bGU6IkxhYmVscyIsaXNfbGFiZWw6ITAsaXNfYXV0bzohMH0s
eTp7dGl0bGU6IlZhbHVlPQpzIixpc19udW1lcmljOiEwfX0sc2V0dGluZ3M6e3Nob3dfbGVnZW5k
Ont0aXRsZToiU2hvdyBsZWdlbmQiLGluZm86IldvdWxkIHk9Cm91IGxpa2UgdG8gYWRkIGEgbGVn
ZW5kPyIsdHlwZToic2VsZWN0Iixpbml0OiJmYWxzZSIsZGF0YTpbe2xhYmVsOiJZZXMiLHZhbD0K
dWU6InRydWUifSx7bGFiZWw6Ik5vIix2YWx1ZToiZmFsc2UifV19LGRvbnV0X3JhdGlvOnt0aXRs
ZToiRG9udXQgcmF0aW8iLGluPQpmbzoiRGV0ZXJtaW5lIGhvdyBsYXJnZSB0aGUgZG9udXQgaG9s
ZSB3aWxsIGJlLiIsdHlwZToic2VsZWN0Iixpbml0OiIwLjUiLGQ9CmF0YTpbe2xhYmVsOiI1MCUi
LHZhbHVlOiIwLjUifSx7bGFiZWw6IjI1JSIsdmFsdWU6IjAuMjUifSx7bGFiZWw6IjEwJSIsdmFs
dT0KZToiMC4xMCJ9LHtsYWJlbDoiMCUiLHZhbHVlOiIwIn1dfSxsYWJlbF9zZXBhcmF0b3I6e3R5
cGU6InNlcGFyYXRvciIsdGl0bGU6PQoiTGFiZWwgc2V0dGluZ3MifSxsYWJlbF90eXBlOnt0aXRs
ZToiRG9udXQgbGFiZWwiLGluZm86IldoYXQgd291bGQgeW91IGxpa2U9CiB0byBzaG93IGZvciBl
YWNoIHNsaWNlPyIsdHlwZToic2VsZWN0Iixpbml0OiJwZXJjZW50IixkYXRhOlt7bGFiZWw6Ii0t
IE5vdD0KaGluZyAtLSIsdmFsdWU6ImhpZGUiLGhpZGU6ImxhYmVsX291dHNpZGUifSx7bGFiZWw6
IkxhYmVsIGNvbHVtbiIsdmFsdWU6ImtlPQp5IixzaG93OiJsYWJlbF9vdXRzaWRlIn0se2xhYmVs
OiJWYWx1ZSBjb2x1bW4iLHZhbHVlOiJ2YWx1ZSIsc2hvdzoibGFiZWxfb3U9CnRzaWRlIn0se2xh
YmVsOiJQZXJjZW50YWdlIix2YWx1ZToicGVyY2VudCIsc2hvdzoibGFiZWxfb3V0c2lkZSJ9XX0s
bGFiZWxfbz0KdXRzaWRlOnt0aXRsZToiU2hvdyBvdXRzaWRlIixpbmZvOiJXb3VsZCB5b3UgbGlr
ZSB0byBzaG93IGxhYmVscyBvdXRzaWRlIHRoPQplIGRvbnV0PyIsdHlwZToic2VsZWN0Iixpbml0
OiJmYWxzZSIsZGF0YTpbe2xhYmVsOiJZZXMiLHZhbHVlOiJ0cnVlIn0se2xhYmU9Cmw6Ik5vIix2
YWx1ZToiZmFsc2UifV19fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvc2Nh
dHRlci9jb25maT0KZyIsWyJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uL2NvbmZpZyJd
LGZ1bmN0aW9uKGUpe3JldHVybiAkLmV4dGVuZCghPQowLHt9LGUse3RpdGxlOiJTY2F0dGVyIHBs
b3QiLGNhdGVnb3J5OiJPdGhlcnMiLGtleXdvcmRzOiJoaWdoY2hhcnRzIixjb2x1bW49CnM6e3g6
e3RpdGxlOiJWYWx1ZXMgZm9yIHgtYXhpcyIsaXNfbnVtZXJpYzohMH0seTp7dGl0bGU6IlZhbHVl
cyBmb3IgeS1heGlzIj0KLGlzX251bWVyaWM6ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRz
L2hpZ2hjaGFydHMvc3RhY2tlZGFyZWEvY29uZmlnIixbPQoicGx1Z2luL2NoYXJ0cy9oaWdoY2hh
cnRzL2NvbW1vbi9jb25maWciXSxmdW5jdGlvbihlKXtyZXR1cm4gJC5leHRlbmQoITAse309Cixl
LHt0aXRsZToiUmVndWxhciIsY2F0ZWdvcnk6IkFyZWEgY2hhcnRzIixrZXl3b3JkczoiaGlnaGNo
YXJ0cyIsY29sdW1uczp7eD0KOnt0aXRsZToiVmFsdWVzIGZvciB4LWF4aXMiLGlzX2xhYmVsOiEw
LGlzX2F1dG86ITAsaXNfbnVtZXJpYzohMX0seTp7dGl0bGU6PQoiVmFsdWVzIGZvciB5LWF4aXMi
LGlzX251bWVyaWM6ITB9fX0pfSksZGVmaW5lKCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvYm89
CnhwbG90L2NvbmZpZyIsWyJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uL2NvbmZpZyJd
LGZ1bmN0aW9uKGUpe3JldHVybj0KICQuZXh0ZW5kKCEwLHt9LHt0aXRsZToiQm94IHBsb3QiLGNh
dGVnb3J5OiJEYXRhIHByb2Nlc3NpbmcgKHJlcXVpcmVzICdjaGFyPQp0cycgdG9vbCBmcm9tIFRv
b2xzaGVkKSIsbGlicmFyeToiSGlnaGNoYXJ0cyIsdGFnOiJkaXYiLGV4ZWN1dGU6ImJveHBsb3Qi
LGs9CmV5d29yZHM6ImhpZ2hjaGFydHMiLGNvbHVtbnM6e3k6e3RpdGxlOiJPYnNlcnZhdGlvbnMi
LGlzX251bWVyaWM6ITB9fSxzZXR0aT0KbmdzOntzZXBhcmF0b3JfbGFiZWw6e3RpdGxlOiJYIGF4
aXMiLHR5cGU6InNlcGFyYXRvciJ9LHhfYXhpc19sYWJlbDp7dGl0bGU6PQoiQXhpcyBsYWJlbCIs
aW5mbzoiUHJvdmlkZSBhIGxhYmVsIGZvciB0aGUgYXhpcy4iLHR5cGU6InRleHQiLGluaXQ6Ilgt
YXhpcyI9CixwbGFjZWhvbGRlcjoiQXhpcyBsYWJlbCJ9LHNlcGFyYXRvcl90aWNrOnt0aXRsZToi
WSBheGlzIix0eXBlOiJzZXBhcmF0b3IifT0KLHlfYXhpc19sYWJlbDp7dGl0bGU6IkF4aXMgbGFi
ZWwiLGluZm86IlByb3ZpZGUgYSBsYWJlbCBmb3IgdGhlIGF4aXMuIix0eXBlPQo6InRleHQiLGlu
aXQ6IlktYXhpcyIscGxhY2Vob2xkZXI6IkF4aXMgbGFiZWwifSx5X2F4aXNfdHlwZTp7dGl0bGU6
IkF4aXMgdmE9Cmx1ZSB0eXBlIixpbmZvOiJTZWxlY3QgdGhlIHZhbHVlIHR5cGUgb2YgdGhlIGF4
aXMuIix0eXBlOiJzZWxlY3QiLGluaXQ6ImF1dD0KbyIsZGF0YTpbe2xhYmVsOiItLSBEbyBub3Qg
c2hvdyB2YWx1ZXMgLS0iLHZhbHVlOiJoaWRlIixoaWRlOlsieV9heGlzX3RpY2siPQpdfSx7bGFi
ZWw6IkF1dG8iLHZhbHVlOiJhdXRvIixoaWRlOlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJGbG9h
dCIsdmFsdWU6ImY9CiIsc2hvdzpbInlfYXhpc190aWNrIl19LHtsYWJlbDoiRXhwb25lbnQiLHZh
bHVlOiJlIixzaG93OlsieV9heGlzX3RpY2siXX0sez0KbGFiZWw6IkludGVnZXIiLHZhbHVlOiJk
IixoaWRlOlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJQZXJjZW50YWdlIix2YWx1ZToiPQpwIixz
aG93OlsieV9heGlzX3RpY2siXX0se2xhYmVsOiJSb3VuZGVkIix2YWx1ZToiciIsc2hvdzpbInlf
YXhpc190aWNrIl19LHs9CmxhYmVsOiJTSS1wcmVmaXgiLHZhbHVlOiJzIixzaG93OlsieV9heGlz
X3RpY2siXX1dfSx5X2F4aXNfdGljazp7dGl0bGU6IkF4aT0KcyB0aWNrIGZvcm1hdCIsaW5mbzoi
U2VsZWN0IHRoZSB0aWNrIGZvcm1hdCBmb3IgdGhlIGF4aXMuIix0eXBlOiJzZWxlY3QiLGluPQpp
dDoiLjEiLGRhdGE6W3tsYWJlbDoiMC4wMDAwMSIsdmFsdWU6Ii41In0se2xhYmVsOiIwLjAwMDEi
LHZhbHVlOiIuNCJ9LHtsYWI9CmVsOiIwLjAwMSIsdmFsdWU6Ii4zIn0se2xhYmVsOiIwLjAxIix2
YWx1ZToiLjIifSx7bGFiZWw6IjAuMSIsdmFsdWU6Ii4xIn0sez0KbGFiZWw6IjEiLHZhbHVlOiIx
In1dfSx5X2F4aXNfZ3JpZDp7dGl0bGU6IkF4aXMgZ3JpZCIsaW5mbzoiV291bGQgeW91IGxpa2Ug
PQp0byBzaG93IGdyaWQgbGluZXMgZm9yIHRoaXMgYXhpcz8iLHR5cGU6InJhZGlvYnV0dG9uIixp
bml0OiIxIixkYXRhOlt7bGFiZWw9CjoiT24iLHZhbHVlOiIxIn0se2xhYmVsOiJPZmYiLHZhbHVl
OiIwIn1dfX19KX0pLGRlZmluZSgicGx1Z2luL2NoYXJ0cy9oaWdoYz0KaGFydHMvaGVhdG1hcC9j
b25maWciLFsicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi9jb25maWciXSxmdW5jdGlv
bihlPQope3JldHVybiAkLmV4dGVuZCghMCx7fSxlLHt0aXRsZToiSGVhdG1hcCIsY2F0ZWdvcnk6
Ik90aGVycyIsdXNlX3BhbmVsczohMCw9CmtleXdvcmRzOiJoaWdoY2hhcnRzIixjb2x1bW5zOnt4
Ont0aXRsZToiQ29sdW1uIGxhYmVscyIsaXNfbGFiZWw6ITAsaXNfbnVtZT0KcmljOiEwfSx5Ont0
aXRsZToiUm93IGxhYmVscyIsaXNfbGFiZWw6ITAsaXNfbnVtZXJpYzohMH0sejp7dGl0bGU6Ik9i
c2VydmF0PQppb25zIixpc19udW1lcmljOiEwfX0sc2V0dGluZ3M6e3lfYXhpc19ncmlkOntpbml0
OiIwIn19fSl9KSxkZWZpbmUoInBsdWdpbi89CmNoYXJ0cy90eXBlcyIsWyJwbHVnaW4vY2hhcnRz
L252ZDMvYmFyL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvbnZkMy9iYXJfc3RhYz0Ka2VkL2NvbmZp
ZyIsInBsdWdpbi9jaGFydHMvbnZkMy9iYXJfaG9yaXpvbnRhbC9jb25maWciLCJwbHVnaW4vY2hh
cnRzL252ZDMvPQpiYXJfaG9yaXpvbnRhbF9zdGFja2VkL2NvbmZpZyIsInBsdWdpbi9jaGFydHMv
bnZkMy9saW5lX2ZvY3VzL2NvbmZpZyIsInBsdWc9CmluL2NoYXJ0cy9udmQzL3BpZS9jb25maWci
LCJwbHVnaW4vY2hhcnRzL252ZDMvc3RhY2tlZGFyZWFfZnVsbC9jb25maWciLCJwbD0KdWdpbi9j
aGFydHMvbnZkMy9zdGFja2VkYXJlYV9zdHJlYW0vY29uZmlnIiwicGx1Z2luL2NoYXJ0cy9udmQz
L2hpc3RvZ3JhbS9jPQpvbmZpZyIsInBsdWdpbi9jaGFydHMvbnZkMy9oaXN0b2dyYW1fZGlzY3Jl
dGUvY29uZmlnIiwicGx1Z2luL2NoYXJ0cy9udmQzL2w9CmluZS9jb25maWciLCJwbHVnaW4vY2hh
cnRzL252ZDMvc2NhdHRlci9jb25maWciLCJwbHVnaW4vY2hhcnRzL252ZDMvc3RhY2tlZD0KYXJl
YS9jb25maWciLCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvYmFyL2NvbmZpZyIsInBsdWdpbi9j
aGFydHMvaGlnaGNoYXJ0PQpzL2Jhcl9zdGFja2VkL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvaGln
aGNoYXJ0cy9iYXJfaG9yaXpvbnRhbC9jb25maWciLCJwbHU9Cmdpbi9jaGFydHMvaGlnaGNoYXJ0
cy9iYXJfaG9yaXpvbnRhbF9zdGFja2VkL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvaGlnaGNoYT0K
cnRzL2hpc3RvZ3JhbS9jb25maWciLCJwbHVnaW4vY2hhcnRzL2hpZ2hjaGFydHMvaGlzdG9ncmFt
X2Rpc2NyZXRlL2NvbmZpZyIsPQoicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2xpbmUvY29uZmln
IiwicGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL3BpZS9jb25maWc9CiIsInBsdWdpbi9jaGFydHMv
aGlnaGNoYXJ0cy9zY2F0dGVyL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9zdGFj
az0KZWRhcmVhL2NvbmZpZyIsInBsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9ib3hwbG90L2NvbmZp
ZyIsInBsdWdpbi9jaGFydHMvaGlnPQpoY2hhcnRzL2hlYXRtYXAvY29uZmlnIl0sZnVuY3Rpb24o
ZSx0LG4scixpLHMsbyx1LGEsZixsLGMsaCxwLGQsdixtLGcseSxiLHc9CixFLFMseCxUKXtyZXR1
cm4gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtkZWZhdWx0czp7bnZkM19iYXI6ZSxudmQzX2Jhcl9z
dGFjaz0KZWQ6dCxudmQzX2Jhcl9ob3Jpem9udGFsOm4sbnZkM19iYXJfaG9yaXpvbnRhbF9zdGFj
a2VkOnIsbnZkM19saW5lX2ZvY3VzOmksPQpudmQzX3N0YWNrZWRhcmVhX2Z1bGw6byxudmQzX3N0
YWNrZWRhcmVhX3N0cmVhbTp1LG52ZDNfcGllOnMsbnZkM19zdGFja2VkYXI9CmVhOmgsbnZkM19s
aW5lOmwsbnZkM19zY2F0dGVyOmMsbnZkM19oaXN0b2dyYW06YSxudmQzX2hpc3RvZ3JhbV9kaXNj
cmV0ZTpmLD0KaGlnaGNoYXJ0c19iYXI6cCxoaWdoY2hhcnRzX2Jhcl9zdGFja2VkOmQsaGlnaGNo
YXJ0c19iYXJfaG9yaXpvbnRhbDp2LGhpZ2hjPQpoYXJ0c19iYXJfaG9yaXpvbnRhbF9zdGFja2Vk
Om0saGlnaGNoYXJ0c19zdGFja2VkYXJlYTpTLGhpZ2hjaGFydHNfcGllOncsaGk9CmdoY2hhcnRz
X2xpbmU6YixoaWdoY2hhcnRzX3NjYXR0ZXI6RSxoaWdoY2hhcnRzX2hpc3RvZ3JhbTpnLGhpZ2hj
aGFydHNfaGlzdD0Kb2dyYW1fZGlzY3JldGU6eSxoaWdoY2hhcnRzX2JveHBsb3Q6eCxoaWdoY2hh
cnRzX2hlYXRtYXA6VH19KX0pLGRlZmluZSgicGx1PQpnaW4vYXBwIixbIm12Yy91aS91aS1tb2Rh
bCIsIm12Yy91aS91aS1wb3J0bGV0IiwicGx1Z2luL2xpYnJhcnkvdWkiLCJ1dGlscy89CnV0aWxz
IiwicGx1Z2luL2xpYnJhcnkvam9icyIsInBsdWdpbi9saWJyYXJ5L2RhdGFzZXRzIiwicGx1Z2lu
L2xpYnJhcnkvc3Rvcj0KYWdlIiwicGx1Z2luL3ZpZXdzL3ZpZXdlciIsInBsdWdpbi92aWV3cy9l
ZGl0b3IiLCJwbHVnaW4vbW9kZWxzL2NvbmZpZyIsInBsPQp1Z2luL21vZGVscy9jaGFydCIsInBs
dWdpbi9jaGFydHMvdHlwZXMiXSxmdW5jdGlvbihlLHQsbixyLGkscyxvLHUsYSxmLGwsYyk9Cnty
ZXR1cm4gQmFja2JvbmUuVmlldy5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCl7dGhpcy5v
cHRpb25zPTNEdCxHYWxheD0KeSYmR2FsYXh5Lm1vZGFsP3RoaXMubW9kYWw9M0RHYWxheHkubW9k
YWw6dGhpcy5tb2RhbD0zRG5ldyBlLlZpZXcsdGhpcy5jb25mPQppZz0zRG5ldyBmLHRoaXMudHlw
ZXM9M0RuZXcgYyx0aGlzLmNoYXJ0PTNEbmV3IGwsdGhpcy5qb2JzPTNEbmV3IGkodGhpcyksdGg9
CmlzLmRhdGFzZXRzPTNEbmV3IHModGhpcyksdGhpcy5zdG9yYWdlPTNEbmV3IG8odGhpcyksdGhp
cy52aWV3ZXJfdmlldz0zRG5ldz0KIHUodGhpcyksdGhpcy5lZGl0b3Jfdmlldz0zRG5ldyBhKHRo
aXMpLHRoaXMuJGVsLmFwcGVuZCh0aGlzLnZpZXdlcl92aWV3LiRlPQpsKSx0aGlzLiRlbC5hcHBl
bmQodGhpcy5lZGl0b3Jfdmlldy4kZWwpO2lmKCF0aGlzLnN0b3JhZ2UubG9hZCgpKXRoaXMuZ28o
ImU9CmRpdG9yIik7ZWxzZXt0aGlzLmdvKCJ2aWV3ZXIiKTt2YXIgbj0zRHRoaXM7dGhpcy5jaGFy
dC5kZWZlcnJlZC5leGVjdXRlKGZ1bj0KY3Rpb24oKXtuLmNoYXJ0LnRyaWdnZXIoInJlZHJhdyIp
fSl9fSxnbzpmdW5jdGlvbihlKXskKCIudG9vbHRpcCIpLmhpZGUoKTtzPQp3aXRjaChlKXtjYXNl
ImVkaXRvciI6dGhpcy5lZGl0b3Jfdmlldy5zaG93KCksdGhpcy52aWV3ZXJfdmlldy5oaWRlKCk7
YnJlYWs9CjtjYXNlInZpZXdlciI6dGhpcy5lZGl0b3Jfdmlldy5oaWRlKCksdGhpcy52aWV3ZXJf
dmlldy5zaG93KCl9fSxjaGFydFBhdGg6Zj0KdW5jdGlvbihlKXt2YXIgdD0zRGUuc3BsaXQoL18o
LispLyk7cmV0dXJuIHQubGVuZ3RoPj0zRDI/dFswXSsiLyIrdFsxXTooY29uPQpzb2xlLmRlYnVn
KCJGQUlMRUQgQXBwOmNoYXJ0UGF0aCgpIC0gSW52YWxpZCBmb3JtYXQ6ICIrZSksdW5kZWZpbmVk
KX0sZXhlY3U9CnRlOmZ1bmN0aW9uKGUpe30sb251bmxvYWQ6ZnVuY3Rpb24oKXt9LGxvZzpmdW5j
dGlvbihlLHQpe2NvbnNvbGUubG9nKGUrIiAiKz0KdCl9fSl9KTsKXCBObyBuZXdsaW5lIGF0IGVu
ZCBvZiBmaWxlCgpkaWZmIC1yIGJmYzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQw
YTMgLXIgYzExMzc3MWRiNmIyZjUwODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9w
bHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9i
YXIvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9z
dGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFyL2Nvbj0KZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVn
aW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFyL2Nv
bj0KZmlnLmpzCkBAIC0zLDEzICszLDEyIEBACiByZXR1cm4gJC5leHRlbmQodHJ1ZSwge30sIGNv
bmZpZywgewogICAgIHRpdGxlICAgICAgIDogJ1JlZ3VsYXInLAogICAgIGNhdGVnb3J5ICAgIDog
J0JhciBkaWFncmFtcycsCi0gICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBoaWdoY2hhcnRzJywK
KyAgICBrZXl3b3JkcyAgICA6ICdoaWdoY2hhcnRzJywKICAgICBjb2x1bW5zICAgICA6IHsKICAg
ICAgICAgeCA6IHsKICAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ1ZhbHVlcyBmb3IgeC1heGlz
JywKICAgICAgICAgICAgIGlzX2xhYmVsICAgIDogdHJ1ZSwKLSAgICAgICAgICAgIGlzX2F1dG8g
ICAgIDogdHJ1ZSwKLSAgICAgICAgICAgIGlzX3VuaXF1ZSAgIDogdHJ1ZQorICAgICAgICAgICAg
aXNfYXV0byAgICAgOiB0cnVlCiAgICAgICAgIH0sCiAgICAgICAgIHkgOiB7CiAgICAgICAgICAg
ICB0aXRsZSAgICAgICA6ICdWYWx1ZXMgZm9yIHktYXhpcycsCgpkaWZmIC1yIGJmYzExYTEzNzQy
N2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3MWRiNmIyZjUwODAwZjA0NWU9
CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9z
dGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9iYXIvd3JhcHBlci5qcwotLS0gYS9jb25maWcvcGx1
Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2Jhci93
cmE9CnBwZXIuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0
YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9iYXIvd3JhPQpwcGVyLmpzCkBAIC0xMiw3ICsxMiw2IEBA
CiAgICAgICAgICAgID0yMAogICAgIC8vIHJlbmRlcgogICAgIGRyYXcgOiBmdW5jdGlvbihwcm9j
ZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KSB7Ci0gICAgICAgIC8vIGRyYXcgY2hh
cnQKICAgICAgICAgdmFyIGhjID0zRCBuZXcgSGlnaGNoYXJ0cyh0aGlzLmFwcCwgdGhpcy5vcHRp
b25zKTsKICAgICAgICAgaGMuZHJhdyhwcm9jZXNzX2lkLCAnY29sdW1uJywgY2hhcnQsIHJlcXVl
c3RfZGljdGlvbmFyeSk7CiAgICAgfQoKZGlmZiAtciBiZmMxMWExMzc0MjdiYjFiMDQ3MWY5N2M1
M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZiMmY1MDgwMGYwNDVlPQo3Yjc0YThkNjUwYzA0
NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9o
aWdoY2g9CmFydHMvYmFyX2hvcml6b250YWwvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5z
L3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFyX2hvcj0K
aXpvbnRhbC9jb25maWcuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hh
cnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9iYXJfaG9yPQppem9udGFsL2NvbmZpZy5qcwpA
QCAtMyw3ICszLDcgQEAKIHJldHVybiAkLmV4dGVuZCh0cnVlLCB7fSwgY29uZmlnLCB7CiAgICAg
dGl0bGUgICAgICAgOiAnSG9yaXpvbnRhbCcsCiAgICAgY2F0ZWdvcnkgICAgOiAnQmFyIGRpYWdy
YW1zJywKLSAgICBrZXl3b3JkcyAgICA6ICdkZWZhdWx0IGhpZ2hjaGFydHMnLAorICAgIGtleXdv
cmRzICAgIDogJ2hpZ2hjaGFydHMnLAogICAgIGNvbHVtbnMgICAgIDogewogICAgICAgICB4IDog
ewogICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnVmFsdWVzIGZvciB4LWF4aXMnLAoKZGlmZiAt
ciBiZmMxMWExMzc0MjdiYjFiMDQ3MWY5N2M1M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZi
MmY1MDgwMGYwNDVlPQo3Yjc0YThkNjUwYzA0NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0
aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2g9CmFydHMvYmFyX2hvcml6b250YWwvd3Jh
cHBlci5qcwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGlj
L2NoYXJ0cy9oaWdoY2hhcnRzL2Jhcl9ob3I9Cml6b250YWwvd3JhcHBlci5qcworKysgYi9jb25m
aWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRz
L2Jhcl9ob3I9Cml6b250YWwvd3JhcHBlci5qcwpAQCAtMTEsMTIgKzExLDcgQEAKICAgICB9LAog
ICAgICAgICAgICA9MjAKICAgICAvLyByZW5kZXIKLSAgICBkcmF3IDogZnVuY3Rpb24ocHJvY2Vz
c19pZCwgY2hhcnQsIHJlcXVlc3RfZGljdGlvbmFyeSkKLSAgICB7Ci0gICAgICAgIC8vIHNldHRp
bmdzCi0gICAgICAgIGNoYXJ0LnNldHRpbmdzLnNldCgneF9heGlzX2NhdGVnb3JpZXMnLCBbXSkK
LSAgICAgICA9MjAKLSAgICAgICAgLy8gZHJhdyBjaGFydAorICAgIGRyYXcgOiBmdW5jdGlvbihw
cm9jZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KSB7CiAgICAgICAgIHZhciBoYyA9
M0QgbmV3IEhpZ2hjaGFydHModGhpcy5hcHAsIHRoaXMub3B0aW9ucyk7CiAgICAgICAgIGhjLmRy
YXcocHJvY2Vzc19pZCwgJ2JhcicsIGNoYXJ0LCByZXF1ZXN0X2RpY3Rpb25hcnkpOwogICAgIH0K
CmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEz
NzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlz
dWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2Jhcl9ob3Jpem9u
dGFsX3N0YWNrZWQvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFyX2hvcj0KaXpvbnRhbF9zdGFja2Vk
L2NvbmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3Rh
dGljL2NoYXJ0cy9oaWdoY2hhcnRzL2Jhcl9ob3I9Cml6b250YWxfc3RhY2tlZC9jb25maWcuanMK
QEAgLTMsNyArMyw3IEBACiByZXR1cm4gJC5leHRlbmQodHJ1ZSwge30sIGNvbmZpZywgewogICAg
IHRpdGxlICAgICAgIDogJ1N0YWNrZWQgaG9yaXpvbnRhbCcsCiAgICAgY2F0ZWdvcnkgICAgOiAn
QmFyIGRpYWdyYW1zJywKLSAgICBrZXl3b3JkcyAgICA6ICdkZWZhdWx0IGhpZ2hjaGFydHMnLAor
ICAgIGtleXdvcmRzICAgIDogJ2hpZ2hjaGFydHMnLAogICAgIHNldHRpbmdzICAgIDogewogICAg
ICAgICB4X2F4aXNfdHlwZSA6IHsKICAgICAgICAgICAgIGluaXQgOiAnaGlkZScKCmRpZmYgLXIg
YmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJm
NTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlv
bnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2Jhcl9ob3Jpem9udGFsX3N0YWNr
ZWQvd3JhcHBlci5qcwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMv
c3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2Jhcl9ob3I9Cml6b250YWxfc3RhY2tlZC93cmFwcGVy
LmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hh
cnRzL2hpZ2hjaGFydHMvYmFyX2hvcj0KaXpvbnRhbF9zdGFja2VkL3dyYXBwZXIuanMKQEAgLTEx
LDggKzExLDcgQEAKICAgICB9LAogICAgICAgICAgICA9MjAKICAgICAvLyByZW5kZXIKLSAgICBk
cmF3IDogZnVuY3Rpb24ocHJvY2Vzc19pZCwgY2hhcnQsIHJlcXVlc3RfZGljdGlvbmFyeSkKLSAg
ICB7CisgICAgZHJhdyA6IGZ1bmN0aW9uKHByb2Nlc3NfaWQsIGNoYXJ0LCByZXF1ZXN0X2RpY3Rp
b25hcnkpIHsKICAgICAgICAgLy8gZmluYWxpemUgY29uZmlndXJhdGlvbgogICAgICAgICBjaGFy
dC5zZXR0aW5ncy5zZXQoJ3Bsb3RvcHRpb25zX3Nlcmllc19zdGFja2luZycsICdub3JtYWwnKTsK
ICAgICAgICA9MjAKCmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1
NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmln
L3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRz
L2Jhcl9zdGFja2VkL2NvbmZpZy5qcwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9u
cy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2Jhcl9zdGE9CmNrZWQvY29uZmlnLmpz
CisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRz
L2hpZ2hjaGFydHMvYmFyX3N0YT0KY2tlZC9jb25maWcuanMKQEAgLTMsNyArMyw3IEBACiByZXR1
cm4gJC5leHRlbmQodHJ1ZSwge30sIGNvbmZpZywgewogICAgIHRpdGxlICAgICAgIDogJ1N0YWNr
ZWQnLAogICAgIGNhdGVnb3J5ICAgIDogJ0JhciBkaWFncmFtcycsCi0gICAga2V5d29yZHMgICAg
OiAnZGVmYXVsdCBoaWdoY2hhcnRzJywKKyAgICBrZXl3b3JkcyAgICA6ICdoaWdoY2hhcnRzJywK
ICAgICBjb2x1bW5zICAgICA6IHsKICAgICAgICAgeCA6IHsKICAgICAgICAgICAgIHRpdGxlICAg
ICAgIDogJ1ZhbHVlcyBmb3IgeC1heGlzJywKCmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFm
OTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1
MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFy
dHMvaGlnaGNoPQphcnRzL2JveHBsb3QvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zp
c3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYm94cGxvdD0KL2Nv
bmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGlj
L2NoYXJ0cy9oaWdoY2hhcnRzL2JveHBsb3Q9Ci9jb25maWcuanMKQEAgLTEsMTIgKzEsMTIgQEAK
IGRlZmluZShbJ3BsdWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZmlnJ10sIGZ1bmN0
aW9uKGNvbmZpZykgewo9MjAKLXJldHVybiAkLmV4dGVuZCh0cnVlLCB7fSwgY29uZmlnLCB7City
ZXR1cm4gJC5leHRlbmQodHJ1ZSwge30sIHsKICAgICB0aXRsZSAgICAgICA6ICdCb3ggcGxvdCcs
CiAgICAgY2F0ZWdvcnkgICAgOiAnRGF0YSBwcm9jZXNzaW5nIChyZXF1aXJlcyBcJ2NoYXJ0c1wn
IHRvb2wgZnJvbSBUb29sc2hlZD0KKScsCiAgICAgbGlicmFyeSAgICAgOiAnSGlnaGNoYXJ0cycs
CiAgICAgdGFnICAgICAgICAgOiAnZGl2JywKICAgICBleGVjdXRlICAgICA6ICdib3hwbG90JywK
LSAgICBrZXl3b3JkcyAgICA6ICdkZWZhdWx0IGhpZ2hjaGFydHMnLAorICAgIGtleXdvcmRzICAg
IDogJ2hpZ2hjaGFydHMnLAogICAgIGNvbHVtbnMgICAgIDogewogICAgICAgICB5IDogewogICAg
ICAgICAgICAgdGl0bGUgICAgICAgOiAnT2JzZXJ2YXRpb25zJywKQEAgLTM1LDYgKzM1LDEwMiBA
QAogICAgICAgICAgICAgdHlwZSAgICAgICAgOiAndGV4dCcsCiAgICAgICAgICAgICBpbml0ICAg
ICAgICA6ICdZLWF4aXMnLAogICAgICAgICAgICAgcGxhY2Vob2xkZXIgOiAnQXhpcyBsYWJlbCcK
KyAgICAgICAgfSwKKyAgICAgICAgeV9heGlzX3R5cGUgOiB7CisgICAgICAgICAgICB0aXRsZSAg
ICAgICA6ICdBeGlzIHZhbHVlIHR5cGUnLAorICAgICAgICAgICAgaW5mbyAgICAgICAgOiAnU2Vs
ZWN0IHRoZSB2YWx1ZSB0eXBlIG9mIHRoZSBheGlzLicsCisgICAgICAgICAgICB0eXBlICAgICAg
ICA6ICdzZWxlY3QnLAorICAgICAgICAgICAgaW5pdCAgICAgICAgOiAnYXV0bycsCisgICAgICAg
ICAgICBkYXRhICAgICAgICA6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
ICAgIGxhYmVsICAgOiAnLS0gRG8gbm90IHNob3cgdmFsdWVzIC0tJywKKyAgICAgICAgICAgICAg
ICAgICAgdmFsdWUgICA6ICdoaWRlJywKKyAgICAgICAgICAgICAgICAgICAgaGlkZSAgICA6IFsn
eV9heGlzX3RpY2snXQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgICAgICBsYWJlbCAgIDogJ0F1dG8nLAorICAgICAgICAgICAgICAgICAgICB2
YWx1ZSAgIDogJ2F1dG8nLAorICAgICAgICAgICAgICAgICAgICBoaWRlICAgIDogWyd5X2F4aXNf
dGljayddCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgICAgIGxhYmVsICAgOiAnRmxvYXQnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSAg
IDogJ2YnLAorICAgICAgICAgICAgICAgICAgICBzaG93ICAgIDogWyd5X2F4aXNfdGljayddCisg
ICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAg
IGxhYmVsICAgOiAnRXhwb25lbnQnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgIDogJ2Un
LAorICAgICAgICAgICAgICAgICAgICBzaG93ICAgIDogWyd5X2F4aXNfdGljayddCisgICAgICAg
ICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxhYmVs
ICAgOiAnSW50ZWdlcicsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgOiAnZCcsCisgICAg
ICAgICAgICAgICAgICAgIGhpZGUgICAgOiBbJ3lfYXhpc190aWNrJ10KKyAgICAgICAgICAgICAg
ICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgICA6ICdQ
ZXJjZW50YWdlJywKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA6ICdwJywKKyAgICAgICAg
ICAgICAgICAgICAgc2hvdyAgICA6IFsneV9heGlzX3RpY2snXQorICAgICAgICAgICAgICAgIH0s
CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYWJlbCAgIDogJ1JvdW5k
ZWQnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgIDogJ3InLAorICAgICAgICAgICAgICAg
ICAgICBzaG93ICAgIDogWyd5X2F4aXNfdGljayddCisgICAgICAgICAgICAgICAgfSwKKyAgICAg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsICAgOiAnU0ktcHJlZml4JywK
KyAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA6ICdzJywKKyAgICAgICAgICAgICAgICAgICAg
c2hvdyAgICA6IFsneV9heGlzX3RpY2snXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IF0KKyAgICAgICAgfSwKKyAgICAgICAgeV9heGlzX3RpY2sgOiB7CisgICAgICAgICAgICB0aXRs
ZSAgICAgICA6ICdBeGlzIHRpY2sgZm9ybWF0JywKKyAgICAgICAgICAgIGluZm8gICAgICAgIDog
J1NlbGVjdCB0aGUgdGljayBmb3JtYXQgZm9yIHRoZSBheGlzLicsCisgICAgICAgICAgICB0eXBl
ICAgICAgICA6ICdzZWxlY3QnLAorICAgICAgICAgICAgaW5pdCAgICAgICAgOiAnLjEnLAorICAg
ICAgICAgICAgZGF0YSAgICAgICAgOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgICAgICBsYWJlbCAgIDogJzAuMDAwMDEnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSAg
IDogJy41JworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgICAgICBsYWJlbCAgIDogJzAuMDAwMScsCisgICAgICAgICAgICAgICAgICAgIHZhbHVl
ICAgOiAnLjQnCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgICAgIGxhYmVsICAgOiAnMC4wMDEnLAorICAgICAgICAgICAgICAgICAgICB2YWx1
ZSAgIDogJy4zJworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgICAgICBsYWJlbCAgIDogJzAuMDEnLAorICAgICAgICAgICAgICAgICAgICB2YWx1
ZSAgIDogJy4yJworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgICAgICBsYWJlbCAgIDogJzAuMScsCisgICAgICAgICAgICAgICAgICAgIHZhbHVl
ICAgOiAnLjEnCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgICAgIGxhYmVsICAgOiAnMScsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlICAg
OiAnMScKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdCisgICAgICAgIH0sCisgICAg
ICAgIHlfYXhpc19ncmlkIDogeworICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnQXhpcyBncmlk
JywKKyAgICAgICAgICAgIGluZm8gICAgICAgIDogJ1dvdWxkIHlvdSBsaWtlIHRvIHNob3cgZ3Jp
ZCBsaW5lcyBmb3IgdGhpcyBheGlzPQo/JywKKyAgICAgICAgICAgIHR5cGUgICAgICAgIDogJ3Jh
ZGlvYnV0dG9uJywKKyAgICAgICAgICAgIGluaXQgICAgICAgIDogJzEnLAorICAgICAgICAgICAg
ZGF0YSAgICAgICAgOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBs
YWJlbCAgIDogJ09uJywKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA6ICcxJworICAgICAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYWJl
bCAgIDogJ09mZicsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgOiAnMCcKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICBdCiAgICAgICAgIH0KICAgICB9CiB9KTsKCmRpZmYgLXIg
YmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJm
NTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlv
bnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2JveHBsb3Qvd3JhcHBlci5qcwot
LS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9o
aWdoY2hhcnRzL2JveHBsb3Q9Ci93cmFwcGVyLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYm94cGxvdD0KL3dyYXBw
ZXIuanMKQEAgLTEsNSArMSw1IEBACiAvLyBkZXBlbmRlbmNpZXMKLWRlZmluZShbJ3BsdWdpbi9j
aGFydHMvaGlnaGNoYXJ0cy9jb21tb24vaGlnaGNoYXJ0cy1jb25maWcnXSwgZnVuY3Rpb24oY29u
PQpmaWdtYWtlcikgeworZGVmaW5lKFsncGx1Z2luL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi9o
aWdoY2hhcnRzLWNvbmZpZycsICdwbHVnaW4vY2hhcnQ9CnMvaGlnaGNoYXJ0cy9jb21tb24vd3Jh
cHBlciddLCBmdW5jdGlvbihjb25maWdtYWtlciwgSGlnaGNoYXJ0cykgewo9MjAKIC8vIHdpZGdl
dAogcmV0dXJuIEJhY2tib25lLlZpZXcuZXh0ZW5kKApAQCAtMTEsOCArMTEsNyBAQAogICAgIH0s
CiAgICAgICAgICAgID0yMAogICAgIC8vIHJlbmRlcgotICAgIGRyYXcgOiBmdW5jdGlvbihwcm9j
ZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5LCBjYWxsYmFjaykKLSAgICB7CisgICAg
ZHJhdyA6IGZ1bmN0aW9uKHByb2Nlc3NfaWQsIGNoYXJ0LCByZXF1ZXN0X2RpY3Rpb25hcnksIGNh
bGxiYWNrKSB7CiAgICAgICAgIC8vIGNvbmZpZ3VyZSByZXF1ZXN0CiAgICAgICAgIHZhciBpbmRl
eCA9M0QgMDsKICAgICAgICAgZm9yICh2YXIgaSBpbiByZXF1ZXN0X2RpY3Rpb25hcnkuZ3JvdXBz
KSB7CkBAIC0zNCw3ICszMyw2IEBACiAgICAgICAgIC8vIHJlcXVlc3QgZGF0YQogICAgICAgICB2
YXIgc2VsZiA9M0QgdGhpczsKICAgICAgICAgdGhpcy5hcHAuZGF0YXNldHMucmVxdWVzdChyZXF1
ZXN0X2RpY3Rpb25hcnksIGZ1bmN0aW9uKCkgewotICAgICAgICAgICA9MjAKICAgICAgICAgICAg
IC8vIHJlc2V0IGRhdGEvY2F0ZWdvcmllcwogICAgICAgICAgICAgdmFyIGRhdGEgPTNEIFtdOwog
ICAgICAgICAgICAgdmFyIGNhdGVnb3JpZXMgPTNEIFtdOwoKZGlmZiAtciBiZmMxMWExMzc0Mjdi
YjFiMDQ3MWY5N2M1M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZiMmY1MDgwMGYwNDVlPQo3
Yjc0YThkNjUwYzA0NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3Rh
dGljL2NoYXJ0cy9oaWdoY2g9CmFydHMvY29tbW9uL2NvbmZpZy5qcwotLS0gYS9jb25maWcvcGx1
Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1v
bi89CmNvbmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMv
c3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi89CmNvbmZpZy5qcwpAQCAtOTksNiArOTks
MjIgQEAKICAgICAgICAgICAgIF0KPTIwCiAgICAgICAgIH0sCisgICAgICAgIHhfYXhpc19ncmlk
IDogeworICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnQXhpcyBncmlkJywKKyAgICAgICAgICAg
IGluZm8gICAgICAgIDogJ1dvdWxkIHlvdSBsaWtlIHRvIHNob3cgZ3JpZCBsaW5lcyBmb3IgdGhp
cyBheGlzPQo/JywKKyAgICAgICAgICAgIHR5cGUgICAgICAgIDogJ3JhZGlvYnV0dG9uJywKKyAg
ICAgICAgICAgIGluaXQgICAgICAgIDogJzAnLAorICAgICAgICAgICAgZGF0YSAgICAgICAgOiBb
CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYWJlbCAgIDogJ09uJywK
KyAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA6ICcxJworICAgICAgICAgICAgICAgIH0sCisg
ICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsYWJlbCAgIDogJ09mZicsCisg
ICAgICAgICAgICAgICAgICAgIHZhbHVlICAgOiAnMCcKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICBdCisgICAgICAgIH0sCiAgICAgICAgIHNlcGFyYXRvcl90aWNrICA6IHsKICAgICAg
ICAgICAgIHRpdGxlICAgICAgIDogJ1kgYXhpcycsCiAgICAgICAgICAgICB0eXBlICAgICAgICA6
ICdzZXBhcmF0b3InCkBAIC0xOTEsNiArMjA3LDIyIEBACiAgICAgICAgICAgICBdCj0yMAogICAg
ICAgICB9LAorICAgICAgICB5X2F4aXNfZ3JpZCA6IHsKKyAgICAgICAgICAgIHRpdGxlICAgICAg
IDogJ0F4aXMgZ3JpZCcsCisgICAgICAgICAgICBpbmZvICAgICAgICA6ICdXb3VsZCB5b3UgbGlr
ZSB0byBzaG93IGdyaWQgbGluZXMgZm9yIHRoaXMgYXhpcz0KPycsCisgICAgICAgICAgICB0eXBl
ICAgICAgICA6ICdyYWRpb2J1dHRvbicsCisgICAgICAgICAgICBpbml0ICAgICAgICA6ICcxJywK
KyAgICAgICAgICAgIGRhdGEgICAgICAgIDogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICAgICAgbGFiZWwgICA6ICdPbicsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlICAg
OiAnMScKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICAgICAgbGFiZWwgICA6ICdPZmYnLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgIDog
JzAnCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICB9LAogICAgICAg
ICBzZXBhcmF0b3JfbGVnZW5kIDogewogICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnT3RoZXJz
JywKICAgICAgICAgICAgIHR5cGUgICAgICAgIDogJ3NlcGFyYXRvcicKCmRpZmYgLXIgYmZjMTFh
MTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBm
MDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hh
cnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2NvbW1vbi9oaWdoY2hhcnRzLWNvbmZpZy5q
cwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0
cy9oaWdoY2hhcnRzL2NvbW1vbi89CmhpZ2hjaGFydHMtY29uZmlnLmpzCisrKyBiL2NvbmZpZy9w
bHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvY29t
bW9uLz0KaGlnaGNoYXJ0cy1jb25maWcuanMKQEAgLTE1LDcgKzE1LDcgQEAKIAkgICAgfSwKIAkg
ICA9MjAKIAkgICAgdGl0bGU6IHsKLQkgICAgICAgIHRleHQgICAgICAgICAgICAgICAgICAgICAg
ICA6IGNoYXJ0LmdldCgndGl0bGUnKQorCSAgICAgICAgdGV4dCAgICAgICAgICAgICAgICAgICAg
ICAgIDogJycKIAkgICAgfSwKIAkgICA9MjAKIAkgICAgbGVnZW5kOiB7CkBAIC0zOSwxNCArMzks
MTUgQEAKICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgbGFiZWxzOiB7CiAgICAgICAg
ICAgICAgICAgZm9ybWF0dGVyICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldCgneF9heGlzX3R5cGUnKSA9M0Q9M0QgJ2F1dG8n
KQorICAgICAgICAgICAgICAgICAgICB2YXIgYXhpc190eXBlID0zRCBzZXR0aW5ncy5nZXQoJ3hf
YXhpc190eXBlJyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChheGlzX3R5cGUgPTNEPTNEICdh
dXRvJyB8fCBheGlzX3R5cGUgPTNEPTNEPTNEIHVuZD0KZWZpbmVkKQogICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmb3Jt
YXQgPTNEIGQzLmZvcm1hdChzZXR0aW5ncy5nZXQoJ3hfYXhpc190aWNrJykgKz0KIHNldHRpbmdz
LmdldCgneF9heGlzX3R5cGUnKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXQgPTNE
IGQzLmZvcm1hdChzZXR0aW5ncy5nZXQoJ3hfYXhpc190aWNrJykgKz0KIGF4aXNfdHlwZSk7CiAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQodGhpcy52YWx1ZSk7CiAgICAgICAgICAg
ICAgICAgfSwKICAgICAgICAgICAgICAgICBlbmFibGVkICAgICAgICAgICAgICAgICA6ICEoc2V0
dGluZ3MuZ2V0KCd4X2F4aXNfdHlwZScpID0KPTNEPTNEICdoaWRlJykKICAgICAgICAgICAgIH0s
Ci0gICAgICAgICAgICB0aWNrUGl4ZWxJbnRlcnZhbCAgICAgICAgICAgOiAxMDAKKyAgICAgICAg
ICAgIGdyaWRMaW5lV2lkdGggICAgICAgICAgICAgICA6IHNldHRpbmdzLmdldCgneF9heGlzX2dy
aWQnKQogICAgICAgICB9LAogICAgICAgID0yMAogICAgICAgICB5QXhpczogewpAQCAtNTUsMTMg
KzU2LDE1IEBACiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgbGFiZWxzOiB7CiAgICAgICAg
ICAgICAgICAgZm9ybWF0dGVyICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldCgneV9heGlzX3R5cGUnKSA9M0Q9M0QgJ2F1dG8n
KQorICAgICAgICAgICAgICAgICAgICB2YXIgYXhpc190eXBlID0zRCBzZXR0aW5ncy5nZXQoJ3lf
YXhpc190eXBlJyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChheGlzX3R5cGUgPTNEPTNEICdh
dXRvJyB8fCBheGlzX3R5cGUgPTNEPTNEPTNEIHVuZD0KZWZpbmVkKQogICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmb3Jt
YXQgPTNEIGQzLmZvcm1hdChzZXR0aW5ncy5nZXQoJ3lfYXhpc190aWNrJykgKz0KIHNldHRpbmdz
LmdldCgneV9heGlzX3R5cGUnKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXQgPTNE
IGQzLmZvcm1hdChzZXR0aW5ncy5nZXQoJ3lfYXhpc190aWNrJykgKz0KIGF4aXNfdHlwZSk7CiAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQodGhpcy52YWx1ZSk7CiAgICAgICAgICAg
ICAgICAgfSwKICAgICAgICAgICAgICAgICBlbmFibGVkICAgICAgICAgICAgICAgICA6ICEoc2V0
dGluZ3MuZ2V0KCd5X2F4aXNfdHlwZScpID0KPTNEPTNEICdoaWRlJykKLSAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBncmlkTGluZVdpZHRoICAgICAgICAgICAgICAg
OiBzZXR0aW5ncy5nZXQoJ3lfYXhpc19ncmlkJykKICAgICAgICAgfSwKICAgICAgICAgcGxvdE9w
dGlvbnM6IHsKICAgICAgICAgICAgIHNlcmllczogewoKZGlmZiAtciBiZmMxMWExMzc0MjdiYjFi
MDQ3MWY5N2M1M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZiMmY1MDgwMGYwNDVlPQo3Yjc0
YThkNjUwYzA0NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGlj
L2NoYXJ0cy9oaWdoY2g9CmFydHMvY29tbW9uL3dyYXBwZXIuanMKLS0tIGEvY29uZmlnL3BsdWdp
bnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24v
PQp3cmFwcGVyLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9z
dGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uLz0Kd3JhcHBlci5qcwpAQCAtMjYsMjcgKzI2
LDIxIEBACiAgICAgICAgIHZhciBzZWxmID0zRCB0aGlzOwogICAgICAgICB0aGlzLmFwcC5kYXRh
c2V0cy5yZXF1ZXN0KHJlcXVlc3RfZGljdGlvbmFyeSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAg
ICAvLyBjaGVjayBpZiB0aGlzIGNoYXJ0IGhhcyBtdWx0aXBsZSBwYW5lbHMKLSAgICAgICAgICAg
IGlmIChzZWxmLm9wdGlvbnMuY2FudmFzLmxlbmd0aCA9M0Q9M0QgMSkgewotICAgICAgICAgICAg
ICAgIC8vIGdyb3VwcworICAgICAgICAgICAgaWYgKCFjaGFydC5kZWZpbml0aW9uLnVzZV9wYW5l
bHMpIHsKKyAgICAgICAgICAgICAgICAvLyBkcmF3IGFsbCBncm91cHMgaW50byBhIHNpbmdsZSBw
YW5lbAogICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kcmF3R3JvdXBzKGhjX3R5cGUsIGNoYXJ0
LCByZXF1ZXN0X2RpY3Rpb25hcnkuZ3I9Cm91cHMsIHNlbGYub3B0aW9ucy5jYW52YXNbMF0sIGNh
bGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgY2hhcnQgc3RhdGUKICAgICAg
ICAgICAgICAgICAgICAgY2hhcnQuc3RhdGUoJ29rJywgJ0NoYXJ0IGRyYXduLicpOwogICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9v
cCB0aHJvdWdoIGRhdGEgZ3JvdXBzCisgICAgICAgICAgICAgICAgLy8gZHJhdyBncm91cHMgaW4g
c2VwYXJhdGUgcGFuZWxzCiAgICAgICAgICAgICAgICAgdmFyIHZhbGlkID0zRCB0cnVlOwogICAg
ICAgICAgICAgICAgIGZvciAodmFyIGdyb3VwX2luZGV4IGluIHJlcXVlc3RfZGljdGlvbmFyeS5n
cm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGdyb3VwCiAgICAgICAgICAgICAg
ICAgICAgIHZhciBncm91cCA9M0QgcmVxdWVzdF9kaWN0aW9uYXJ5Lmdyb3Vwc1tncm91cF9pbmRl
eF07Ci0gICAgICAgICAgICAgICAgICAgPTIwCi0gICAgICAgICAgICAgICAgICAgIC8vIGRyYXcg
Z3JvdXAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLl9kcmF3R3JvdXBzKGhjX3R5cGUs
IGNoYXJ0LCBbZ3JvdXBdLCBzZWxmLm9wPQp0aW9ucy5jYW52YXNbZ3JvdXBfaW5kZXhdLCBjYWxs
YmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0zRCBmYWxzZTsKICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgPTIwCi0gICAgICAgICAgICAgICAgLy8gc2V0IGNo
YXJ0IHN0YXRlCiAgICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAg
ICAgIGNoYXJ0LnN0YXRlKCdvaycsICdNdWx0aS1wYW5lbCBjaGFydCBkcmF3bi4nKTsKICAgICAg
ICAgICAgICAgICB9CkBAIC02MiwxMyArNTYsMTMgQEAKICAgICAgICAgLy8gY3JlYXRlIGNvbmZp
Z3VyYXRpb24KICAgICAgICAgdmFyIGhjX2NvbmZpZyA9M0QgY29uZmlnbWFrZXIoY2hhcnQpOwog
ICAgICAgID0yMAotICAgICAgICAvLyBtYWtlIGN1c3RvbSB3cmFwcGVyIGNhbGxiYWNrCi0gICAg
ICAgIGlmIChjYWxsYmFjaykgewotICAgICAgICAgICAgY2FsbGJhY2soaGNfY29uZmlnKTsKKyAg
ICAgICAgLy8gZml4IHRpdGxlCisgICAgICAgIGlmICghY2hhcnQuZGVmaW5pdGlvbi51c2VfcGFu
ZWxzKSB7CisgICAgICAgICAgICBoY19jb25maWcudGl0bGUudGV4dCA9M0QgY2hhcnQuZ2V0KCd0
aXRsZScpOwogICAgICAgICB9Ci0gICA9MjAKLSAgICAgICAgLy8gcmVzZXQKLSAgICAgICAgaGNf
Y29uZmlnLnNlcmllcyA9M0QgW107CisgICAgICAgPTIwCisgICAgICAgIC8vIGlkZW50aWZ5IGNh
dGVnb3JpZXMKKyAgICAgICAgdGhpcy5fbWFrZUNhdGVnb3JpZXMoY2hhcnQsIGdyb3VwcywgaGNf
Y29uZmlnKTsKICAgICAgICA9MjAKICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGRhdGEgZ3JvdXBz
CiAgICAgICAgIGZvciAodmFyIGtleSBpbiBncm91cHMpIHsKQEAgLTEwMSwxOSArOTUsODMgQEAK
ICAgICAgICAgICAgIGhjX2NvbmZpZy5zZXJpZXMucHVzaChoY19zZXJpZXMpOwogICAgICAgICB9
CiAgICAgICAgPTIwCisgICAgICAgIC8vIG1ha2UgY3VzdG9tIHdyYXBwZXIgY2FsbGJhY2sKKyAg
ICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgICBjYWxsYmFjayhoY19jb25maWcpOwor
ICAgICAgICB9CisKICAgICAgICAgLy8gZHJhdyBwbG90CiAgICAgICAgIHRyeSB7CiAgICAgICAg
ICAgICBjYW52YXMuaGlnaGNoYXJ0cyhoY19jb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CiAgICAgICAgIH0gY2F0Y2ggKGVycikgewotICAgICAgICAgICAgdmFyIHJlZ2V4ID0zRCAv
XHd3d1wuaGlnaGNoYXJ0c1wuY29tKFteJl0rKS87Ci0gICAgICAgICAgICB2YXIgbWF0Y2ggPTNE
IGVyci5tYXRjaChyZWdleCk7Ci0gICAgICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMCkgewot
ICAgICAgICAgICAgICAgIGNoYXJ0LnN0YXRlKCdmYWlsZWQnLCAnSGlnaGNoYXJ0cyBlcnJvcjog
PGEgdGFyZ2V0PTNEIl9ibGE9Cm5rIiBocmVmPTNEImh0dHA6Ly8nICsgbWF0Y2hbMF0gKyAnIj4n
ICsgbWF0Y2hbMF0gKyAnPC9hPicpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBjaGFydC5zdGF0ZSgnZmFpbGVkJywgZXJyKTsKKyAgICAgICAgICAgIHRoaXMuX2hhbmRs
ZUVycm9yKGNoYXJ0LCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgfSwKKyAgID0yMAorICAgIC8vIGNyZWF0ZSBjYXRlZ29yaWVzCisgICAgX21ha2VDYXRl
Z29yaWVzOiBmdW5jdGlvbihjaGFydCwgZ3JvdXBzLCBoY19jb25maWcpIHsKKyAgICAgICAgLy8g
aGFzaGtleXMsIGFycmF5cyBhbmQgY291bnRlciBmb3IgbGFiZWxlZCBjb2x1bW5zCisgICAgICAg
IHZhciBjYXRlZ29yaWVzICA9M0Qge307CisgICAgICAgIHZhciBhcnJheSAgICAgICA9M0Qge307
CisgICAgICAgIHZhciBjb3VudGVyICAgICA9M0Qge307CisgICAgICAgPTIwCisgICAgICAgIC8v
IGlkZW50aWZ5IGxhYmVsIGNvbHVtbnMKKyAgICAgICAgdmFyIGNoYXJ0X2RlZmluaXRpb24gPTNE
IGdyb3Vwc1swXTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIGNoYXJ0X2RlZmluaXRpb24uY29s
dW1ucykgeworICAgICAgICAgICAgdmFyIGNvbHVtbl9kZWYgPTNEIGNoYXJ0X2RlZmluaXRpb24u
Y29sdW1uc1trZXldOworICAgICAgICAgICAgaWYgKGNvbHVtbl9kZWYuaXNfbGFiZWwpIHsKKyAg
ICAgICAgICAgICAgICBjYXRlZ29yaWVzW2tleV0gPTNEIHt9OworICAgICAgICAgICAgICAgIGFy
cmF5W2tleV0gICAgICA9M0QgW107CisgICAgICAgICAgICAgICAgY291bnRlcltrZXldICAgID0z
RCAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgPTIwCisgICAgICAgIC8vIGluZGV4IGFsbCB2YWx1ZXMgY29udGFpbmVkIGluIGxh
YmVsIGNvbHVtbnMgKGZvciBhbGwgZ3JvdXBzKQorICAgICAgICBmb3IgKHZhciBpIGluIGdyb3Vw
cykgeworICAgICAgICAgICAgdmFyIGdyb3VwID0zRCBncm91cHNbaV07CisgICAgICAgICAgICBm
b3IgKHZhciBqIGluIGdyb3VwLnZhbHVlcykgeworICAgICAgICAgICAgICAgIHZhciB2YWx1ZV9k
aWN0ID0zRCBncm91cC52YWx1ZXNbal07CisgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGlu
IGNhdGVnb3JpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0zRCBTdHJpbmco
dmFsdWVfZGljdFtrZXldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXNba2V5
XVt2YWx1ZV0gPTNEPTNEPTNEIHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
Y2F0ZWdvcmllc1trZXldW3ZhbHVlXSA9M0QgY291bnRlcltrZXldKys7CisgICAgICAgICAgICAg
ICAgICAgICAgICBhcnJheVtrZXldLnB1c2godmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
Ly8gY29udmVydCBncm91cCB2YWx1ZXMgaW50byBjYXRlZ29yeSBpbmRlY2VzCisgICAgICAgIGZv
ciAodmFyIGkgaW4gZ3JvdXBzKSB7CisgICAgICAgICAgICB2YXIgZ3JvdXAgPTNEIGdyb3Vwc1tp
XTsKKyAgICAgICAgICAgIGZvciAodmFyIGogaW4gZ3JvdXAudmFsdWVzKSB7CisgICAgICAgICAg
ICAgICAgdmFyIHZhbHVlX2RpY3QgPTNEIGdyb3VwLnZhbHVlc1tqXTsKKyAgICAgICAgICAgICAg
ICBmb3IgKHZhciBrZXkgaW4gY2F0ZWdvcmllcykgeworICAgICAgICAgICAgICAgICAgICB2YXIg
dmFsdWUgPTNEIFN0cmluZyh2YWx1ZV9kaWN0W2tleV0pOworICAgICAgICAgICAgICAgICAgICB2
YWx1ZV9kaWN0W2tleV0gPTNEIGNhdGVnb3JpZXNba2V5XVt2YWx1ZV0KKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc29sZS5sb2coYXJyYXkp
OworICAgICAgICAvLyBhZGQgY2F0ZWdvcmllcyB0byBoaWdoY2hhcnRzIGNvbmZpZ3VyYXRpb24K
KyAgICAgICAgZm9yICh2YXIga2V5IGluIGFycmF5KSB7CisgICAgICAgICAgICB2YXIgYXhpcyA9
M0Qga2V5ICsgJ0F4aXMnOworICAgICAgICAgICAgaWYgKGhjX2NvbmZpZ1theGlzXSkgeworICAg
ICAgICAgICAgICAgIGhjX2NvbmZpZ1theGlzXS5jYXRlZ29yaWVzID0zRCBhcnJheVtrZXldOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgID0yMAorICAgIC8vIGhhbmRsZSBl
cnJvcgorICAgIF9oYW5kbGVFcnJvcjogZnVuY3Rpb24oY2hhcnQsIGVycikgeworICAgICAgICB2
YXIgcmVnZXggPTNEIC9cd3d3XC5oaWdoY2hhcnRzXC5jb20oW14mXSspLzsKKyAgICAgICAgdmFy
IG1hdGNoID0zRCBlcnIubWF0Y2gocmVnZXgpOworICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4g
MCkgeworICAgICAgICAgICAgY2hhcnQuc3RhdGUoJ2ZhaWxlZCcsICdIaWdoY2hhcnRzIGVycm9y
OiA8YSB0YXJnZXQ9M0QiX2JsYW5rIiA9CmhyZWY9M0QiaHR0cDovLycgKyBtYXRjaFswXSArICci
PicgKyBtYXRjaFswXSArICc8L2E+Jyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBj
aGFydC5zdGF0ZSgnZmFpbGVkJywgZXJyKTsKICAgICAgICAgfQogICAgIH0KIH0pOwoKZGlmZiAt
ciBiZmMxMWExMzc0MjdiYjFiMDQ3MWY5N2M1M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZi
MmY1MDgwMGYwNDVlPQo3Yjc0YThkNjUwYzA0NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0
aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2g9CmFydHMvaGVhdG1hcC9jb25maWcuanMK
LS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMv
aGlnaGNoYXJ0cy9oZWF0bWFwPQovY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvaGVhdG1hcD0KL2NvbmZp
Zy5qcwpAQCAtMiwxOCArMiwxNyBAQAo9MjAKIHJldHVybiAkLmV4dGVuZCh0cnVlLCB7fSwgY29u
ZmlnLCB7CiAgICAgdGl0bGUgICAgICAgOiAnSGVhdG1hcCcsCi0gICAgY2F0ZWdvcnkgICAgOiAn
RGF0YSBwcm9jZXNzaW5nIChyZXF1aXJlcyBcJ2NoYXJ0c1wnIHRvb2wgZnJvbSBUb29sc2hlZD0K
KScsCi0gICAgLy9leGVjdXRlICAgICA6ICdoZWF0bWFwJywKKyAgICBjYXRlZ29yeSAgICA6ICdP
dGhlcnMnLAogICAgIHVzZV9wYW5lbHMgIDogdHJ1ZSwKLSAgICBrZXl3b3JkcyAgICA6ICdkZWZh
dWx0IGhpZ2hjaGFydHMnLAorICAgIGtleXdvcmRzICAgIDogJ2hpZ2hjaGFydHMnLAogICAgIGNv
bHVtbnM6IHsKLSAgICAgICAgeTogewotICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnUm93IGxh
YmVscycsCisgICAgICAgIHg6IHsKKyAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ0NvbHVtbiBs
YWJlbHMnLAogICAgICAgICAgICAgaXNfbGFiZWwgICAgOiB0cnVlLAogICAgICAgICAgICAgaXNf
bnVtZXJpYyAgOiB0cnVlCiAgICAgICAgIH0sCi0gICAgICAgIHg6IHsKLSAgICAgICAgICAgIHRp
dGxlICAgICAgIDogJ0NvbHVtbiBsYWJlbHMnLAorICAgICAgICB5OiB7CisgICAgICAgICAgICB0
aXRsZSAgICAgICA6ICdSb3cgbGFiZWxzJywKICAgICAgICAgICAgIGlzX2xhYmVsICAgIDogdHJ1
ZSwKICAgICAgICAgICAgIGlzX251bWVyaWMgIDogdHJ1ZQogICAgICAgICB9LApAQCAtMjEsNiAr
MjAsMTEgQEAKICAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ09ic2VydmF0aW9ucycsCiAgICAg
ICAgICAgICBpc19udW1lcmljICA6IHRydWUKICAgICAgICAgfQorICAgIH0sCisgICAgc2V0dGlu
Z3M6IHsKKyAgICAgICAgeV9heGlzX2dyaWQgOiB7CisgICAgICAgICAgICBpbml0ICAgICAgICA6
ICcwJworICAgICAgICB9CiAgICAgfQogfSk7Cj0yMAoKZGlmZiAtciBiZmMxMWExMzc0MjdiYjFi
MDQ3MWY5N2M1M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZiMmY1MDgwMGYwNDVlPQo3Yjc0
YThkNjUwYzA0NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGlj
L2NoYXJ0cy9oaWdoY2g9CmFydHMvaGVhdG1hcC93cmFwcGVyLmpzCi0tLSBhL2NvbmZpZy9wbHVn
aW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvaGVhdG1h
cD0KL3dyYXBwZXIuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRz
L3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9oZWF0bWFwPQovd3JhcHBlci5qcwpAQCAtMTEsOSAr
MTEsNyBAQAogICAgIH0sCiAgICAgICAgICAgID0yMAogICAgIC8vIHJlbmRlcgotICAgIGRyYXcg
OiBmdW5jdGlvbihwcm9jZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KQotICAgIHsK
LSAgICAgICAgLy8gZHJhdyBjaGFydAorICAgIGRyYXcgOiBmdW5jdGlvbihwcm9jZXNzX2lkLCBj
aGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KSB7CiAgICAgICAgIHZhciBoYyA9M0QgbmV3IEhpZ2hj
aGFydHNXcmFwcGVyKHRoaXMuYXBwLCB0aGlzLm9wdGlvbnMpOwogICAgICAgICBoYy5kcmF3KHBy
b2Nlc3NfaWQsICdoZWF0bWFwJywgY2hhcnQsIHJlcXVlc3RfZGljdGlvbmFyeSwgZnVuY3Rpb249
Cihtb2RlbCkgewogICAgICAgICAgICAgbW9kZWwuY29sb3JBeGlzID0zRCB7CgpkaWZmIC1yIGJm
YzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3MWRiNmIyZjUw
ODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9oaXN0b2dyYW0vY29uZmlnLmpzCi0t
LSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hp
Z2hjaGFydHMvaGlzdG9ncj0KYW0vY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvaGlzdG9ncj0KYW0vY29u
ZmlnLmpzCkBAIC00LDcgKzQsNyBAQAogICAgIHRpdGxlICAgICAgIDogJ0hpc3RvZ3JhbScsCiAg
ICAgY2F0ZWdvcnkgICAgOiAnRGF0YSBwcm9jZXNzaW5nIChyZXF1aXJlcyBcJ2NoYXJ0c1wnIHRv
b2wgZnJvbSBUb29sc2hlZD0KKScsCiAgICAgZXhlY3V0ZSAgICAgOiAnaGlzdG9ncmFtJywKLSAg
ICBrZXl3b3JkcyAgICA6ICdkZWZhdWx0IGhpZ2hjaGFydHMnLAorICAgIGtleXdvcmRzICAgIDog
J2hpZ2hjaGFydHMnLAogICAgIGNvbHVtbnMgICAgIDogewogICAgICAgICB5IDogewogICAgICAg
ICAgICAgdGl0bGUgICAgICAgOiAnT2JzZXJ2YXRpb25zJywKCmRpZmYgLXIgYmZjMTFhMTM3NDI3
YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0K
N2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0
YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2hpc3RvZ3JhbV9kaXNjcmV0ZS9jb25maWcuanMKLS0t
IGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGln
aGNoYXJ0cy9oaXN0b2dyPQphbV9kaXNjcmV0ZS9jb25maWcuanMKKysrIGIvY29uZmlnL3BsdWdp
bnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9oaXN0b2dy
PQphbV9kaXNjcmV0ZS9jb25maWcuanMKQEAgLTQsNyArNCw3IEBACiAgICAgdGl0bGUgICAgICAg
OiAnRGlzY3JldGUgSGlzdG9ncmFtJywKICAgICBjYXRlZ29yeSAgICA6ICdEYXRhIHByb2Nlc3Np
bmcgKHJlcXVpcmVzIFwnY2hhcnRzXCcgdG9vbCBmcm9tIFRvb2xzaGVkPQopJywKICAgICBleGVj
dXRlICAgICA6ICdoaXN0b2dyYW1kaXNjcmV0ZScsCi0gICAga2V5d29yZHMgICAgOiAnZGVmYXVs
dCBoaWdoY2hhcnRzJywKKyAgICBrZXl3b3JkcyAgICA6ICdoaWdoY2hhcnRzJywKICAgICBjb2x1
bW5zICAgICA6IHsKICAgICAgICAgeSA6IHsKICAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ09i
c2VydmF0aW9ucycsCkBAIC0xMywxNiArMTMsMTAgQEAKICAgICB9LAogICAgIHNldHRpbmdzICAg
IDogewogICAgICAgICB4X2F4aXNfbGFiZWwgOiB7Ci0gICAgICAgICAgICBpbml0IDogJ0JyZWFr
cycKKyAgICAgICAgICAgIGluaXQgOiAnTGFiZWxzJwogICAgICAgICB9LAogICAgICAgICB5X2F4
aXNfbGFiZWwgOiB7CiAgICAgICAgICAgICBpbml0IDogJ0RlbnNpdHknCi0gICAgICAgIH0sCi0g
ICAgICAgIHlfYXhpc190eXBlIDogewotICAgICAgICAgICAgaW5pdCA6ICdmJwotICAgICAgICB9
LAotICAgICAgICB5X2F4aXNfdGljayA6IHsKLSAgICAgICAgICAgIGluaXQgOiAnLjInCiAgICAg
ICAgIH0KICAgICB9CiB9KTsKCmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0
ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTgg
Y29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNo
PQphcnRzL2hpc3RvZ3JhbV9kaXNjcmV0ZS93cmFwcGVyLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5z
L3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvaGlzdG9ncj0K
YW1fZGlzY3JldGUvd3JhcHBlci5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9u
cy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2hpc3RvZ3I9CmFtX2Rpc2NyZXRlL3dy
YXBwZXIuanMKQEAgLTM3LDkgKzM3LDYgQEAKICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAg
ICAgICAgPTIwCi0gICAgICAgIC8vIHNldHRpbmdzCi0gICAgICAgIGNoYXJ0LnNldHRpbmdzLnNl
dCgneF9heGlzX2NhdGVnb3JpZXMnLCBbXSkKLSAgID0yMAogICAgICAgICAvLyBkcmF3IGNoYXJ0
CiAgICAgICAgIHZhciBoYyA9M0QgbmV3IEhpZ2hjaGFydHModGhpcy5hcHAsIHRoaXMub3B0aW9u
cyk7CiAgICAgICAgIGhjLmRyYXcocHJvY2Vzc19pZCwgJ2NvbHVtbicsIGNoYXJ0LCB0bXBfZGlj
dCk7CgpkaWZmIC1yIGJmYzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIg
YzExMzc3MWRiNmIyZjUwODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5z
L3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9saW5lL2Nv
bmZpZy5qcwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGlj
L2NoYXJ0cy9oaWdoY2hhcnRzL2xpbmUvY289Cm5maWcuanMKKysrIGIvY29uZmlnL3BsdWdpbnMv
dmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9saW5lL2NvPQpu
ZmlnLmpzCkBAIC0zLDcgKzMsNyBAQAogcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9LCBjb25maWcs
IHsKICAgICB0aXRsZSAgICAgICA6ICdMaW5lJywKICAgICBjYXRlZ29yeSAgICA6ICdPdGhlcnMn
LAotICAgIGtleXdvcmRzICAgIDogJ2RlZmF1bHQgaGlnaGNoYXJ0cycsCisgICAga2V5d29yZHMg
ICAgOiAnaGlnaGNoYXJ0cycsCiAgICAgY29sdW1ucyAgICAgOiB7CiAgICAgICAgIHggOiB7CiAg
ICAgICAgICAgICB0aXRsZSAgICAgICA6ICdWYWx1ZXMgZm9yIHgtYXhpcycsCgpkaWZmIC1yIGJm
YzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3MWRiNmIyZjUw
ODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9saW5lL3dyYXBwZXIuanMKLS0tIGEv
Y29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNo
YXJ0cy9saW5lL3dyPQphcHBlci5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9u
cy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2xpbmUvd3I9CmFwcGVyLmpzCkBAIC0x
MSwxMiArMTEsNyBAQAogICAgIH0sCiAgICAgICAgICAgID0yMAogICAgIC8vIHJlbmRlcgotICAg
IGRyYXcgOiBmdW5jdGlvbihwcm9jZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KQot
ICAgIHsKLSAgICAgICAgLy8gc2V0dGluZ3MKLSAgICAgICAgY2hhcnQuc2V0dGluZ3Muc2V0KCd4
X2F4aXNfY2F0ZWdvcmllcycsIFtdKQotICAgPTIwCi0gICAgICAgIC8vIGRyYXcgY2hhcnQKKyAg
ICBkcmF3IDogZnVuY3Rpb24ocHJvY2Vzc19pZCwgY2hhcnQsIHJlcXVlc3RfZGljdGlvbmFyeSkg
ewogICAgICAgICB2YXIgaGMgPTNEIG5ldyBIaWdoY2hhcnRzKHRoaXMuYXBwLCB0aGlzLm9wdGlv
bnMpOwogICAgICAgICBoYy5kcmF3KHByb2Nlc3NfaWQsICdsaW5lJywgY2hhcnQsIHJlcXVlc3Rf
ZGljdGlvbmFyeSk7CiAgICAgfQoKZGlmZiAtciBiZmMxMWExMzc0MjdiYjFiMDQ3MWY5N2M1M2Q4
YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZiMmY1MDgwMGYwNDVlPQo3Yjc0YThkNjUwYzA0NzRl
OCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdo
Y2g9CmFydHMvcGllL3dyYXBwZXIuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlv
bnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9waWUvd3JhPQpwcGVyLmpzCisrKyBi
L2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hj
aGFydHMvcGllL3dyYT0KcHBlci5qcwpAQCAtMTEsOSArMTEsNyBAQAogICAgIH0sCiAgICAgICAg
ICAgID0yMAogICAgIC8vIHJlbmRlcgotICAgIGRyYXcgOiBmdW5jdGlvbihwcm9jZXNzX2lkLCBj
aGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KQotICAgIHsKLSAgICAgICAgLy8gZHJhdyBjaGFydAor
ICAgIGRyYXcgOiBmdW5jdGlvbihwcm9jZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5
KSB7CiAgICAgICAgIHZhciBoYyA9M0QgbmV3IEhpZ2hjaGFydHModGhpcy5hcHAsIHRoaXMub3B0
aW9ucyk7CiAgICAgICAgIGhjLmRyYXcocHJvY2Vzc19pZCwgJ3BpZScsIGNoYXJ0LCByZXF1ZXN0
X2RpY3Rpb25hcnkpOwogICAgIH0KCmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNk
OGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0
ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGln
aGNoPQphcnRzL3NjYXR0ZXIvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6
YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvc2NhdHRlcj0KL2NvbmZpZy5q
cworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0
cy9oaWdoY2hhcnRzL3NjYXR0ZXI9Ci9jb25maWcuanMKQEAgLTMsNyArMyw3IEBACiByZXR1cm4g
JC5leHRlbmQodHJ1ZSwge30sIGNvbmZpZywgewogICAgIHRpdGxlICAgICAgIDogJ1NjYXR0ZXIg
cGxvdCcsCiAgICAgY2F0ZWdvcnkgICAgOiAnT3RoZXJzJywKLSAgICBrZXl3b3JkcyAgICA6ICdk
ZWZhdWx0IGhpZ2hjaGFydHMnLAorICAgIGtleXdvcmRzICAgIDogJ2hpZ2hjaGFydHMnLAogICAg
IGNvbHVtbnMgICAgIDogewogICAgICAgICB4IDogewogICAgICAgICAgICAgdGl0bGUgICAgICAg
OiAnVmFsdWVzIGZvciB4LWF4aXMnLAoKZGlmZiAtciBiZmMxMWExMzc0MjdiYjFiMDQ3MWY5N2M1
M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZiMmY1MDgwMGYwNDVlPQo3Yjc0YThkNjUwYzA0
NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9o
aWdoY2g9CmFydHMvc2NhdHRlci93cmFwcGVyLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvc2NhdHRlcj0KL3dyYXBw
ZXIuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9j
aGFydHMvaGlnaGNoYXJ0cy9zY2F0dGVyPQovd3JhcHBlci5qcwpAQCAtMTEsOSArMTEsNyBAQAog
ICAgIH0sCiAgICAgICAgICAgID0yMAogICAgIC8vIHJlbmRlcgotICAgIGRyYXcgOiBmdW5jdGlv
bihwcm9jZXNzX2lkLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KQotICAgIHsKLSAgICAgICAg
Ly8gZHJhdyBjaGFydAorICAgIGRyYXcgOiBmdW5jdGlvbihwcm9jZXNzX2lkLCBjaGFydCwgcmVx
dWVzdF9kaWN0aW9uYXJ5KSB7CiAgICAgICAgIHZhciBoYyA9M0QgbmV3IEhpZ2hjaGFydHModGhp
cy5hcHAsIHRoaXMub3B0aW9ucyk7CiAgICAgICAgIGhjLmRyYXcocHJvY2Vzc19pZCwgJ3NjYXR0
ZXInLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KTsKICAgICB9CgpkaWZmIC1yIGJmYzExYTEz
NzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3MWRiNmIyZjUwODAwZjA0
NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0
cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9zdGFja2VkYXJlYS9jb25maWcuanMKLS0tIGEv
Y29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNo
YXJ0cy9zdGFja2VkPQphcmVhL2NvbmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxp
emF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL3N0YWNrZWQ9CmFyZWEvY29u
ZmlnLmpzCkBAIC0zLDcgKzMsNyBAQAogcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9LCBjb25maWcs
IHsKICAgICB0aXRsZSAgICAgICA6ICdSZWd1bGFyJywKICAgICBjYXRlZ29yeSAgICA6ICdBcmVh
IGNoYXJ0cycsCi0gICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBoaWdoY2hhcnRzJywKKyAgICBr
ZXl3b3JkcyAgICA6ICdoaWdoY2hhcnRzJywKICAgICBjb2x1bW5zICAgICA6IHsKICAgICAgICAg
eCA6IHsKICAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ1ZhbHVlcyBmb3IgeC1heGlzJywKCmRp
ZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcx
ZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFs
aXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL3N0YWNrZWRhcmVhL3dy
YXBwZXIuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRp
Yy9jaGFydHMvaGlnaGNoYXJ0cy9zdGFja2VkPQphcmVhL3dyYXBwZXIuanMKKysrIGIvY29uZmln
L3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9z
dGFja2VkPQphcmVhL3dyYXBwZXIuanMKQEAgLTExLDEyICsxMSw3IEBACiAgICAgfSwKICAgICAg
ICAgICAgPTIwCiAgICAgLy8gcmVuZGVyCi0gICAgZHJhdyA6IGZ1bmN0aW9uKHByb2Nlc3NfaWQs
IGNoYXJ0LCByZXF1ZXN0X2RpY3Rpb25hcnkpCi0gICAgewotICAgICAgICAvLyBzZXR0aW5ncwot
ICAgICAgICBjaGFydC5zZXR0aW5ncy5zZXQoJ3hfYXhpc19jYXRlZ29yaWVzJywgW10pCi0gICA9
MjAKLSAgICAgICAgLy8gZHJhdyBjaGFydAorICAgIGRyYXcgOiBmdW5jdGlvbihwcm9jZXNzX2lk
LCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KSB7CiAgICAgICAgIHZhciBoYyA9M0QgbmV3IEhp
Z2hjaGFydHModGhpcy5hcHAsIHRoaXMub3B0aW9ucyk7CiAgICAgICAgIGhjLmRyYXcocHJvY2Vz
c19pZCwgJ2FyZWEnLCBjaGFydCwgcmVxdWVzdF9kaWN0aW9uYXJ5KTsKICAgICB9CgpkaWZmIC1y
IGJmYzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3MWRiNmIy
ZjUwODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRp
b25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvYz0Kb21tb24vY29uZmlnLmpzCi0tLSBhL2Nv
bmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvY29t
bW9uL2NvbmZpZz0KLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0
cy9zdGF0aWMvY2hhcnRzL252ZDMvY29tbW9uL2NvbmZpZz0KLmpzCkBAIC01LDcgKzUsNyBAQAog
ICAgIGNhdGVnb3J5ICAgIDogJycsCiAgICAgbGlicmFyeSAgICAgOiAnTlZEMycsCiAgICAgdGFn
ICAgICAgICAgOiAnc3ZnJywKLSAgICBrZXl3b3JkcyAgICA6ICdudmQzJywKKyAgICBrZXl3b3Jk
cyAgICA6ICdkZWZhdWx0IG52ZDMnLAogICAgIHNldHRpbmdzICAgIDogewogICAgICAgICBzZXBh
cmF0b3JfbGFiZWwgIDogewogICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnWCBheGlzJywKCmRp
ZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcx
ZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFs
aXphdGlvbnMvY2hhcnRzL3N0YXRpYy9wbHVnaW5zL2hpZ2hjPQpoYXJ0cy9oZWF0bWFwLmpzCi0t
LSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvcGx1Z2lucy9o
aWdoY2hhcnRzL2hlYXRtYT0KcC5qcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8q
Ci0gSGlnaGNoYXJ0cyBKUyB2NC4wLjEgKDIwMTQtMDQtMjQpCi0KLSAoYykgMjAxMS0yMDE0IFRv
cnN0ZWluIEhvbnNpCi0KLSBMaWNlbnNlOiB3d3cuaGlnaGNoYXJ0cy5jb20vbGljZW5zZQotKi8K
LShmdW5jdGlvbihnKXt2YXIgaj0zRGcuQXhpcyx4PTNEZy5DaGFydCxvPTNEZy5Db2xvcix5PTNE
Zy5MZWdlbmQscz0zRGcuTGVnPQplbmRTeW1ib2xNaXhpbix0PTNEZy5TZXJpZXMsdT0zRGcuZ2V0
T3B0aW9ucygpLGs9M0RnLmVhY2gscD0zRGcuZXh0ZW5kLHo9M0Q9CmcuZXh0ZW5kQ2xhc3MsbD0z
RGcubWVyZ2UscT0zRGcucGljayx2PTNEZy5udW1iZXJGb3JtYXQsbT0zRGcuc2VyaWVzVHlwZXMs
dz0KPTNEZy53cmFwLG49M0RmdW5jdGlvbigpe30scj0zRGcuQ29sb3JBeGlzPTNEZnVuY3Rpb24o
KXt0aGlzLmlzQ29sb3JBeGlzPTNEPQohMDt0aGlzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMp
fTtwKHIucHJvdG90eXBlLGoucHJvdG90eXBlKTtwKHIucHJvdG90eXA9CmUse2RlZmF1bHRDb2xv
ckF4aXNPcHRpb25zOntsaW5lV2lkdGg6MCxncmlkTGluZVdpZHRoOjEsdGlja1BpeGVsSW50ZXJ2
YWw6Nz0KMixzdGFydE9uVGljazohMCxlbmRPblRpY2s6ITAsb2Zmc2V0OjAsbWFya2VyOnthbmlt
YXRpb246e2R1cmF0aW9uOjUwfSxjb2xvPQpyOiJncmF5Iix3aWR0aDowLjAxfSwKLWxhYmVsczp7
b3ZlcmZsb3c6Imp1c3RpZnkifSxtaW5Db2xvcjoiI0VGRUZGRiIsbWF4Q29sb3I6IiMwMDM4NzUi
LHRpY2tMZW5nPQp0aDo1fSxpbml0OmZ1bmN0aW9uKGIsYSl7dmFyIGQ9M0RiLm9wdGlvbnMubGVn
ZW5kLmxheW91dCE9M0Q9M0QidmVydGljYWwiLGM9CjtjPTNEbCh0aGlzLmRlZmF1bHRDb2xvckF4
aXNPcHRpb25zLHtzaWRlOmQ/MjoxLHJldmVyc2VkOiFkfSxhLHtpc1g6ZCxvcHBvcz0KaXRlOiFk
LHNob3dFbXB0eTohMSx0aXRsZTpudWxsLGlzQ29sb3I6ITB9KTtqLnByb3RvdHlwZS5pbml0LmNh
bGwodGhpcyxiLGMpPQo7YS5kYXRhQ2xhc3NlcyYmdGhpcy5pbml0RGF0YUNsYXNzZXMoYSk7dGhp
cy5pbml0U3RvcHMoYSk7dGhpcy5pc1hBeGlzPTNEITA9Cjt0aGlzLmhvcml6PTNEZDt0aGlzLnpv
b21FbmFibGVkPTNEITF9LHR3ZWVuQ29sb3JzOmZ1bmN0aW9uKGIsYSxkKXt2YXIgYz0zRD0KYS5y
Z2JhWzNdIT0zRD0zRDF8fGIucmdiYVszXSE9M0Q9M0QxO3JldHVybihjPyJyZ2JhKCI6InJnYigi
KStNYXRoLnJvdW5kKGEuPQpyZ2JhWzBdKwotKGIucmdiYVswXS1hLnJnYmFbMF0pKigxLWQpKSsi
LCIrTWF0aC5yb3VuZChhLnJnYmFbMV0rKGIucmdiYVsxXS1hLnJnYmFbMV09CikqKDEtZCkpKyIs
IitNYXRoLnJvdW5kKGEucmdiYVsyXSsoYi5yZ2JhWzJdLWEucmdiYVsyXSkqKDEtZCkpKyhjPyIs
IisoYS5yZz0KYmFbM10rKGIucmdiYVszXS1hLnJnYmFbM10pKigxLWQpKToiIikrIikifSxpbml0
RGF0YUNsYXNzZXM6ZnVuY3Rpb24oYil7dmFyPQogYT0zRHRoaXMsZD0zRHRoaXMuY2hhcnQsYyxl
PTNEMCxoPTNEdGhpcy5vcHRpb25zO3RoaXMuZGF0YUNsYXNzZXM9M0RjPTNEW109CjtrKGIuZGF0
YUNsYXNzZXMsZnVuY3Rpb24oZixpKXt2YXIgZyxmPTNEbChmKTtjLnB1c2goZik7aWYoIWYuY29s
b3IpaC5kYXRhQz0KbGFzc0NvbG9yPTNEPTNEPTNEImNhdGVnb3J5Ij8oZz0zRGQub3B0aW9ucy5j
b2xvcnMsZi5jb2xvcj0zRGdbZSsrXSxlPTNEPTNEPQo9M0RnLmxlbmd0aCYmKGU9M0QwKSk6Zi5j
b2xvcj0zRGEudHdlZW5Db2xvcnMobyhoLm1pbkNvbG9yKSxvKGgubWF4Q29sb3IpLGk9Ci8oYi5k
YXRhQ2xhc3Nlcy5sZW5ndGgtCi0xKSl9KX0saW5pdFN0b3BzOmZ1bmN0aW9uKGIpe3RoaXMuc3Rv
cHM9M0RiLnN0b3BzfHxbWzAsdGhpcy5vcHRpb25zLm1pbkNvbD0Kb3JdLFsxLHRoaXMub3B0aW9u
cy5tYXhDb2xvcl1dO2sodGhpcy5zdG9wcyxmdW5jdGlvbihhKXthLmNvbG9yPTNEbyhhWzFdKX0p
PQp9LHNldE9wdGlvbnM6ZnVuY3Rpb24oYil7ai5wcm90b3R5cGUuc2V0T3B0aW9ucy5jYWxsKHRo
aXMsYik7dGhpcy5vcHRpb25zLmM9CnJvc3NoYWlyPTNEdGhpcy5vcHRpb25zLm1hcmtlcjt0aGlz
LmNvbGw9M0QiY29sb3JBeGlzIn0sc2V0QXhpc1NpemU6ZnVuY3Rpbz0Kbigpe3ZhciBiPTNEdGhp
cy5sZWdlbmRTeW1ib2wsYT0zRHRoaXMuY2hhcnQsZCxjLGU7aWYoYil0aGlzLmxlZnQ9M0RkPTNE
Yi5hPQp0dHIoIngiKSx0aGlzLnRvcD0zRGM9M0RiLmF0dHIoInkiKSx0aGlzLndpZHRoPTNEZT0z
RGIuYXR0cigid2lkdGgiKSx0aGlzLmg9CmVpZ2h0PTNEYj0zRGIuYXR0cigiaGVpZ2h0IiksdGhp
cy5yaWdodD0zRGEuY2hhcnRXaWR0aC1kLWUsdGhpcy5ib3R0b209M0RhLj0KY2hhcnRIZWlnaHQt
Ci1jLWIsdGhpcy5sZW49M0R0aGlzLmhvcml6P2U6Yix0aGlzLnBvcz0zRHRoaXMuaG9yaXo/ZDpj
fSx0b0NvbG9yOmZ1bmN0aW9uKD0KYixhKXt2YXIgZCxjPTNEdGhpcy5zdG9wcyxlLGg9M0R0aGlz
LmRhdGFDbGFzc2VzLGYsaTtpZihoKWZvcihpPTNEaC5sZW5ndGg7PQppLS07KXtpZihmPTNEaFtp
XSxlPTNEZi5mcm9tLGM9M0RmLnRvLChlPTNEPTNEPTNEdm9pZCAwfHxiPj0zRGUpJiYoYz0zRD0z
RD0KPTNEdm9pZCAwfHxiPD0zRGMpKXtkPTNEZi5jb2xvcjtpZihhKWEuZGF0YUNsYXNzPTNEaTti
cmVha319ZWxzZXt0aGlzLmlzTG9nPQomJihiPTNEdGhpcy52YWwybGluKGIpKTtkPTNEMS0odGhp
cy5tYXgtYikvKHRoaXMubWF4LXRoaXMubWluKTtmb3IoaT0zRGMubGU9Cm5ndGg7aS0tOylpZihk
PmNbaV1bMF0pYnJlYWs7ZT0zRGNbaV18fGNbaSsxXTtjPTNEY1tpKzFdfHxlO2Q9M0QxLShjWzBd
LWQpLz0KKGNbMF0tZVswXXx8MSk7ZD0zRHRoaXMudHdlZW5Db2xvcnMoZS5jb2xvcixjLmNvbG9y
LGQpfXJldHVybiBkfSxnZXRPZmZzZXQ6PQpmdW5jdGlvbigpe3ZhciBiPTNEdGhpcy5sZWdlbmRH
cm91cDsKLWlmKGImJihqLnByb3RvdHlwZS5nZXRPZmZzZXQuY2FsbCh0aGlzKSwhdGhpcy5heGlz
R3JvdXAucGFyZW50R3JvdXApKXRoaXMuPQpheGlzR3JvdXAuYWRkKGIpLHRoaXMuZ3JpZEdyb3Vw
LmFkZChiKSx0aGlzLmxhYmVsR3JvdXAuYWRkKGIpLHRoaXMuYWRkZWQ9M0Q9CiEwfSxzZXRMZWdl
bmRDb2xvcjpmdW5jdGlvbigpe3ZhciBiLGE9M0R0aGlzLm9wdGlvbnM7Yj0zRHRoaXMuaG9yaXo/
WzAsMCwxLD0KMF06WzAsMCwwLDFdO3RoaXMubGVnZW5kQ29sb3I9M0R7bGluZWFyR3JhZGllbnQ6
e3gxOmJbMF0seTE6YlsxXSx4MjpiWzJdLHkyPQo6YlszXX0sc3RvcHM6YS5zdG9wc3x8W1swLGEu
bWluQ29sb3JdLFsxLGEubWF4Q29sb3JdXX19LGRyYXdMZWdlbmRTeW1ib2w6ZnU9Cm5jdGlvbihi
LGEpe3ZhciBkPTNEYi5wYWRkaW5nLGM9M0RiLm9wdGlvbnMsZT0zRHRoaXMuaG9yaXosaD0zRHEo
Yy5zeW1ib2xXaT0KZHRoLGU/MjAwOjEyKSxmPTNEcShjLnN5bWJvbEhlaWdodCxlPzEyOjIwMCks
Yz0zRHEoYy5sYWJlbFBhZGRpbmcsZT8xMDozMCk7Ci10aGlzLnNldExlZ2VuZENvbG9yKCk7YS5s
ZWdlbmRTeW1ib2w9M0R0aGlzLmNoYXJ0LnJlbmRlcmVyLnJlY3QoMCxiLmJhc2VsaT0KbmUtMTEs
aCxmKS5hdHRyKHt6SW5kZXg6MX0pLmFkZChhLmxlZ2VuZEdyb3VwKTthLmxlZ2VuZFN5bWJvbC5n
ZXRCQm94KCk7dGhpPQpzLmxlZ2VuZEl0ZW1XaWR0aD0zRGgrZCsoZT8wOmMpO3RoaXMubGVnZW5k
SXRlbUhlaWdodD0zRGYrZCsoZT9jOjApfSxzZXRTdGE9CnRlOm4sdmlzaWJsZTohMCxzZXRWaXNp
YmxlOm4sZ2V0U2VyaWVzRXh0cmVtZXM6ZnVuY3Rpb24oKXt2YXIgYjtpZih0aGlzLnNlcj0KaWVz
Lmxlbmd0aCliPTNEdGhpcy5zZXJpZXNbMF0sdGhpcy5kYXRhTWluPTNEYi52YWx1ZU1pbix0aGlz
LmRhdGFNYXg9M0RiLnZhPQpsdWVNYXh9LGRyYXdDcm9zc2hhaXI6ZnVuY3Rpb24oYixhKXt2YXIg
ZD0zRCF0aGlzLmNyb3NzLGM9M0RhJiZhLnBsb3RYLGU9M0Q9CmEmJmEucGxvdFksaCxmPTNEdGhp
cy5wb3MsaT0zRHRoaXMubGVuO2lmKGEpaD0zRHRoaXMudG9QaXhlbHMoYS52YWx1ZSksaDxmPz0K
aD0zRAotZi0yOmg+ZitpJiYoaD0zRGYraSsyKSxhLnBsb3RYPTNEaCxhLnBsb3RZPTNEdGhpcy5s
ZW4taCxqLnByb3RvdHlwZS5kcmF3Q3I9Cm9zc2hhaXIuY2FsbCh0aGlzLGIsYSksYS5wbG90WD0z
RGMsYS5wbG90WT0zRGUsIWQmJnRoaXMuY3Jvc3MmJnRoaXMuY3Jvc3MuYT0KdHRyKHtmaWxsOnRo
aXMuY3Jvc3NoYWlyLmNvbG9yfSkuYWRkKHRoaXMubGFiZWxHcm91cCl9LGdldFBsb3RMaW5lUGF0
aDpmdW5jPQp0aW9uKGIsYSxkLGMsZSl7cmV0dXJuIGU/dGhpcy5ob3Jpej9bIk0iLGUtNCx0aGlz
LnRvcC02LCJMIixlKzQsdGhpcy50b3AtNiw9CmUsdGhpcy50b3AsIloiXTpbIk0iLHRoaXMubGVm
dCxlLCJMIix0aGlzLmxlZnQtNixlKzYsdGhpcy5sZWZ0LTYsZS02LCJaIl06aj0KLnByb3RvdHlw
ZS5nZXRQbG90TGluZVBhdGguY2FsbCh0aGlzLGIsYSxkLGMpfSx1cGRhdGU6ZnVuY3Rpb24oYixh
KXtrKHRoaXMuPQpzZXJpZXMsZnVuY3Rpb24oYSl7YS5pc0RpcnR5RGF0YT0zRCEwfSk7ai5wcm90
b3R5cGUudXBkYXRlLmNhbGwodGhpcywKLWIsYSk7dGhpcy5sZWdlbmRJdGVtJiYodGhpcy5zZXRM
ZWdlbmRDb2xvcigpLHRoaXMuY2hhcnQubGVnZW5kLmNvbG9yaXplSXRlPQptKHRoaXMsITApKX0s
Z2V0RGF0YUNsYXNzTGVnZW5kU3ltYm9sczpmdW5jdGlvbigpe3ZhciBiPTNEdGhpcyxhPTNEdGhp
cy5jaGE9CnJ0LGQ9M0RbXSxjPTNEYS5vcHRpb25zLmxlZ2VuZCxlPTNEYy52YWx1ZURlY2ltYWxz
LGg9M0RjLnZhbHVlU3VmZml4fHwiIixmOz0Kayh0aGlzLmRhdGFDbGFzc2VzLGZ1bmN0aW9uKGMs
Zyl7dmFyIGo9M0QhMCxsPTNEYy5mcm9tLG09M0RjLnRvO2Y9M0QiIjtsPTNEPQo9M0Q9M0R2b2lk
IDA/Zj0zRCI8ICI6bT0zRD0zRD0zRHZvaWQgMCYmKGY9M0QiPiAiKTtsIT0zRD0zRHZvaWQgMCYm
KGYrPTNEdig9CmwsZSkraCk7bCE9M0Q9M0R2b2lkIDAmJm0hPTNEPTNEdm9pZCAwJiYoZis9M0Qi
IC0gIik7bSE9M0Q9M0R2b2lkIDAmJihmKz0zRD0KdihtLGUpK2gpO2QucHVzaChwKHtjaGFydDph
LG5hbWU6ZixvcHRpb25zOnt9LGRyYXdMZWdlbmRTeW1ib2w6cy5kcmF3UmVjdGFuPQpnbGUsdmlz
aWJsZTohMCxzZXRTdGF0ZTpuLHNldFZpc2libGU6ZnVuY3Rpb24oKXtqPTNECi10aGlzLnZpc2li
bGU9M0QhajtrKGIuc2VyaWVzLGZ1bmN0aW9uKGEpe2soYS5wb2ludHMsZnVuY3Rpb24oYSl7YS5k
YXRhQ2xhcz0Kcz0zRD0zRD0zRGcmJmEuc2V0VmlzaWJsZShqKX0pfSk7YS5sZWdlbmQuY29sb3Jp
emVJdGVtKHRoaXMsail9fSxjKSl9KTtyZXR1PQpybiBkfSxuYW1lOiIifSk7dyh4LnByb3RvdHlw
ZSwiZ2V0QXhlcyIsZnVuY3Rpb24oYil7dmFyIGE9M0R0aGlzLm9wdGlvbnMuY289CmxvckF4aXM7
Yi5jYWxsKHRoaXMpO3RoaXMuY29sb3JBeGlzPTNEW107YSYmbmV3IHIodGhpcyxhKX0pO3coeS5w
cm90b3R5cGUsIj0KZ2V0QWxsSXRlbXMiLGZ1bmN0aW9uKGIpe3ZhciBhPTNEW10sZD0zRHRoaXMu
Y2hhcnQuY29sb3JBeGlzWzBdO2QmJihkLm9wdGlvPQpucy5kYXRhQ2xhc3Nlcz9hPTNEYS5jb25j
YXQoZC5nZXREYXRhQ2xhc3NMZWdlbmRTeW1ib2xzKCkpOmEucHVzaChkKSxrKGQuc2U9CnJpZXMs
ZnVuY3Rpb24oYSl7YS5vcHRpb25zLnNob3dJbkxlZ2VuZD0zRCExfSkpO3JldHVybiBhLmNvbmNh
dChiLmNhbGwodGhpcz0KKSl9KTsKLWc9M0R7cG9pbnRBdHRyVG9PcHRpb25zOntzdHJva2U6ImJv
cmRlckNvbG9yIiwic3Ryb2tlLXdpZHRoIjoiYm9yZGVyV2lkdGgiPQosZmlsbDoiY29sb3IiLGRh
c2hzdHlsZToiZGFzaFN0eWxlIn0scG9pbnRBcnJheU1hcDpbInZhbHVlIl0sYXhpc1R5cGVzOlsi
eEE9CnhpcyIsInlBeGlzIiwiY29sb3JBeGlzIl0sb3B0aW9uYWxBeGlzOiJjb2xvckF4aXMiLHRy
YWNrZXJHcm91cHM6WyJncm91cCIsIj0KbWFya2VyR3JvdXAiLCJkYXRhTGFiZWxzR3JvdXAiXSxn
ZXRTeW1ib2w6bixwYXJhbGxlbEFycmF5czpbIngiLCJ5IiwidmFsdWUiPQpdLHRyYW5zbGF0ZUNv
bG9yczpmdW5jdGlvbigpe3ZhciBiPTNEdGhpcyxhPTNEdGhpcy5vcHRpb25zLm51bGxDb2xvcixk
PTNEdGg9CmlzLmNvbG9yQXhpcztrKHRoaXMuZGF0YSxmdW5jdGlvbihjKXt2YXIgZT0zRGMudmFs
dWU7aWYoZT0zRGU9M0Q9M0Q9M0RudWxsPz0KYTpkP2QudG9Db2xvcihlLGMpOmMuY29sb3J8fGIu
Y29sb3IpYy5jb2xvcj0zRGV9KX19O3UucGxvdE9wdGlvbnMuaGVhdG1hcD0KPTNECi1sKHUucGxv
dE9wdGlvbnMuc2NhdHRlcix7YW5pbWF0aW9uOiExLGJvcmRlcldpZHRoOjAsbnVsbENvbG9yOiIj
RjhGOEY4IixkYT0KdGFMYWJlbHM6e2Zvcm1hdDoie3BvaW50LnZhbHVlfSIsdmVydGljYWxBbGln
bjoibWlkZGxlIixjcm9wOiExLG92ZXJmbG93OiExPQosc3R5bGU6e2NvbG9yOiJ3aGl0ZSIsZm9u
dFdlaWdodDoiYm9sZCIsdGV4dFNoYWRvdzoiMCAwIDVweCBibGFjayJ9fSxtYXJrZXI9CjpudWxs
LHRvb2x0aXA6e3BvaW50Rm9ybWF0OiJ7cG9pbnQueH0sIHtwb2ludC55fToge3BvaW50LnZhbHVl
fTxici8+In0sc3RhdD0KZXM6e25vcm1hbDp7YW5pbWF0aW9uOiEwfSxob3Zlcjp7YnJpZ2h0bmVz
czowLjJ9fX0pO20uaGVhdG1hcD0zRHoobS5zY2F0dGVyPQosbChnLHt0eXBlOiJoZWF0bWFwIixw
b2ludEFycmF5TWFwOlsieSIsInZhbHVlIl0saGFzUG9pbnRTcGVjaWZpY09wdGlvbnM6ITA9Cixz
dXBwb3J0c0RyaWxsZG93bjohMCxnZXRFeHRyZW1lc0Zyb21BbGw6ITAsaW5pdDpmdW5jdGlvbigp
e20uc2NhdHRlci5wcm90bz0KdHlwZS5pbml0LmFwcGx5KHRoaXMsCi1hcmd1bWVudHMpO3RoaXMu
cG9pbnRSYW5nZT0zRHRoaXMub3B0aW9ucy5jb2xzaXplfHwxO3RoaXMueUF4aXMuYXhpc1BvaW50
Uj0KYW5nZT0zRHRoaXMub3B0aW9ucy5yb3dzaXplfHwxfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2
YXIgYj0zRHRoaXMub3B0aW9ucyxhPQo9M0R0aGlzLnhBeGlzLGQ9M0R0aGlzLnlBeGlzO3RoaXMu
Z2VuZXJhdGVQb2ludHMoKTtrKHRoaXMucG9pbnRzLGZ1bmN0aW9uKGM9Cil7dmFyIGU9M0QoYi5j
b2xzaXplfHwxKS8yLGg9M0QoYi5yb3dzaXplfHwxKS8yLGY9M0RNYXRoLnJvdW5kKGEubGVuLWEu
dHJhbj0Kc2xhdGUoYy54LWUsMCwxLDAsMSkpLGU9M0RNYXRoLnJvdW5kKGEubGVuLWEudHJhbnNs
YXRlKGMueCtlLDAsMSwwLDEpKSxnPTNEPQpNYXRoLnJvdW5kKGQudHJhbnNsYXRlKGMueS1oLDAs
MSwwLDEpKSxoPTNETWF0aC5yb3VuZChkLnRyYW5zbGF0ZShjLnkraCwwLDE9CiwwLDEpKTtjLnBs
b3RYPTNEKGYrZSkvMjtjLnBsb3RZPTNEKGcraCkvMjtjLnNoYXBlVHlwZT0zRCJyZWN0IjtjLnNo
YXBlQXJncz0KPTNEe3g6TWF0aC5taW4oZiwKLWUpLHk6TWF0aC5taW4oZyxoKSx3aWR0aDpNYXRo
LmFicyhlLWYpLGhlaWdodDpNYXRoLmFicyhoLWcpfX0pO3RoaXMudHJhbnNsPQphdGVDb2xvcnMo
KX0sZHJhd1BvaW50czptLmNvbHVtbi5wcm90b3R5cGUuZHJhd1BvaW50cyxhbmltYXRlOm4sZ2V0
Qm94Om4sZHI9CmF3TGVnZW5kU3ltYm9sOnMuZHJhd1JlY3RhbmdsZSxnZXRFeHRyZW1lczpmdW5j
dGlvbigpe3QucHJvdG90eXBlLmdldEV4dHJlbT0KZXMuY2FsbCh0aGlzLHRoaXMudmFsdWVEYXRh
KTt0aGlzLnZhbHVlTWluPTNEdGhpcy5kYXRhTWluO3RoaXMudmFsdWVNYXg9M0R0PQpoaXMuZGF0
YU1heDt0LnByb3RvdHlwZS5nZXRFeHRyZW1lcy5jYWxsKHRoaXMpfX0pKX0pKEhpZ2hjaGFydHMp
OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgYmZjMTFhMTM3NDI3YmIxYjA0
NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0KN2I3NGE4
ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9w
bHVnaW5zL2hpZ2hjPQpoYXJ0cy9oaWdoY2hhcnRzLW1vcmUuanMKLS0tIGEvY29uZmlnL3BsdWdp
bnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9wbHVnaW5zL2hpZ2hjaGFydHMvaGlnaGNo
PQphcnRzLW1vcmUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotIEhpZ2hj
aGFydHMgSlMgdjQuMC4xICgyMDE0LTA0LTI0KQotCi0gKGMpIDIwMDktMjAxNCBUb3JzdGVpbiBI
b25zaQotCi0gTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2UKLSovCi0oZnVuY3Rp
b24obSxDKXtmdW5jdGlvbiBLKGEsYixjKXt0aGlzLmluaXQuY2FsbCh0aGlzLGEsYixjKX12YXIg
Tz0zRG0uYXJyYT0KeU1pbixQPTNEbS5hcnJheU1heCxzPTNEbS5lYWNoLEY9M0RtLmV4dGVuZCxv
PTNEbS5tZXJnZSxRPTNEbS5tYXAscT0zRG0ucGljPQprLHg9M0RtLnBJbnQscD0zRG0uZ2V0T3B0
aW9ucygpLnBsb3RPcHRpb25zLGg9M0RtLnNlcmllc1R5cGVzLHU9M0RtLmV4dGVuZEM9Cmxhc3Ms
TD0zRG0uc3BsYXQscj0zRG0ud3JhcCxNPTNEbS5BeGlzLHk9M0RtLlRpY2ssSD0zRG0uUG9pbnQs
Uj0zRG0uUG9pbnRlcj0KLFM9M0RtLkNlbnRlcmVkU2VyaWVzTWl4aW4sej0zRG0uVHJhY2tlck1p
eGluLHQ9M0RtLlNlcmllcyx2PTNETWF0aCxEPTNEdi5yPQpvdW5kLEE9M0R2LmZsb29yLFQ9M0R2
Lm1heCxVPTNEbS5Db2xvcix3PTNEZnVuY3Rpb24oKXt9O0YoSy5wcm90b3R5cGUse2luaXQ9Cjpm
dW5jdGlvbihhLGIsYyl7dmFyIGQ9M0R0aGlzLGU9M0RkLmRlZmF1bHRPcHRpb25zO2QuY2hhcnQ9
M0RiO2lmKGIuYW5ndWxhcj0KKWUuYmFja2dyb3VuZD0zRHt9O2Qub3B0aW9ucz0zRGE9M0RvKGUs
YSk7Ci0oYT0zRGEuYmFja2dyb3VuZCkmJnMoW10uY29uY2F0KEwoYSkpLnJldmVyc2UoKSxmdW5j
dGlvbihhKXt2YXIgZz0zRGEuYmFjaz0KZ3JvdW5kQ29sb3IsYT0zRG8oZC5kZWZhdWx0QmFja2dy
b3VuZE9wdGlvbnMsYSk7aWYoZylhLmJhY2tncm91bmRDb2xvcj0zRGc7PQphLmNvbG9yPTNEYS5i
YWNrZ3JvdW5kQ29sb3I7Yy5vcHRpb25zLnBsb3RCYW5kcy51bnNoaWZ0KGEpfSl9LGRlZmF1bHRP
cHRpb249CnM6e2NlbnRlcjpbIjUwJSIsIjUwJSJdLHNpemU6Ijg1JSIsc3RhcnRBbmdsZTowfSxk
ZWZhdWx0QmFja2dyb3VuZE9wdGlvbnM6ez0Kc2hhcGU6ImNpcmNsZSIsYm9yZGVyV2lkdGg6MSxi
b3JkZXJDb2xvcjoic2lsdmVyIixiYWNrZ3JvdW5kQ29sb3I6e2xpbmVhckdyPQphZGllbnQ6e3gx
OjAseTE6MCx4MjowLHkyOjF9LHN0b3BzOltbMCwiI0ZGRiJdLFsxLCIjREREIl1dfSxmcm9tOk51
bWJlci5NSU49Cl9WQUxVRSxpbm5lclJhZGl1czowLHRvOk51bWJlci5NQVhfVkFMVUUsb3V0ZXJS
YWRpdXM6IjEwNSUifX0pOwotdmFyIEc9M0RNLnByb3RvdHlwZSx5PTNEeS5wcm90b3R5cGUsVj0z
RHtnZXRPZmZzZXQ6dyxyZWRyYXc6ZnVuY3Rpb24oKXt0aGk9CnMuaXNEaXJ0eT0zRCExfSxyZW5k
ZXI6ZnVuY3Rpb24oKXt0aGlzLmlzRGlydHk9M0QhMX0sc2V0U2NhbGU6dyxzZXRDYXRlZ29yaT0K
ZXM6dyxzZXRUaXRsZTp3fSxOPTNEe2lzUmFkaWFsOiEwLGRlZmF1bHRSYWRpYWxHYXVnZU9wdGlv
bnM6e2xhYmVsczp7YWxpZ246PQoiY2VudGVyIix4OjAseTpudWxsfSxtaW5vckdyaWRMaW5lV2lk
dGg6MCxtaW5vclRpY2tJbnRlcnZhbDoiYXV0byIsbWlub3JUaWM9CmtMZW5ndGg6MTAsbWlub3JU
aWNrUG9zaXRpb246Imluc2lkZSIsbWlub3JUaWNrV2lkdGg6MSx0aWNrTGVuZ3RoOjEwLHRpY2tQ
bz0Kc2l0aW9uOiJpbnNpZGUiLHRpY2tXaWR0aDoyLHRpdGxlOntyb3RhdGlvbjowfSx6SW5kZXg6
Mn0sZGVmYXVsdFJhZGlhbFhPcHRpPQpvbnM6e2dyaWRMaW5lV2lkdGg6MSxsYWJlbHM6e2FsaWdu
Om51bGwsZGlzdGFuY2U6MTUseDowLHk6bnVsbH0sCi1tYXhQYWRkaW5nOjAsbWluUGFkZGluZzow
LHNob3dMYXN0TGFiZWw6ITEsdGlja0xlbmd0aDowfSxkZWZhdWx0UmFkaWFsWU9wdD0KaW9uczp7
Z3JpZExpbmVJbnRlcnBvbGF0aW9uOiJjaXJjbGUiLGxhYmVsczp7YWxpZ246InJpZ2h0Iix4Oi0z
LHk6LTJ9LHNob3dMPQphc3RMYWJlbDohMSx0aXRsZTp7eDo0LHRleHQ6bnVsbCxyb3RhdGlvbjo5
MH19LHNldE9wdGlvbnM6ZnVuY3Rpb24oYSl7YT0zRHQ9Cmhpcy5vcHRpb25zPTNEbyh0aGlzLmRl
ZmF1bHRPcHRpb25zLHRoaXMuZGVmYXVsdFJhZGlhbE9wdGlvbnMsYSk7aWYoIWEucGxvdD0KQmFu
ZHMpYS5wbG90QmFuZHM9M0RbXX0sZ2V0T2Zmc2V0OmZ1bmN0aW9uKCl7Ry5nZXRPZmZzZXQuY2Fs
bCh0aGlzKTt0aGlzLmNoPQphcnQuYXhpc09mZnNldFt0aGlzLnNpZGVdPTNEMDt0aGlzLmNlbnRl
cj0zRHRoaXMucGFuZS5jZW50ZXI9M0RTLmdldENlbnRlci49CmNhbGwodGhpcy5wYW5lKX0sZ2V0
TGluZVBhdGg6ZnVuY3Rpb24oYSxiKXt2YXIgYz0zRHRoaXMuY2VudGVyLGI9M0RxKGIsCi1jWzJd
LzItdGhpcy5vZmZzZXQpO3JldHVybiB0aGlzLmNoYXJ0LnJlbmRlcmVyLnN5bWJvbHMuYXJjKHRo
aXMubGVmdCtjWzBdLD0KdGhpcy50b3ArY1sxXSxiLGIse3N0YXJ0OnRoaXMuc3RhcnRBbmdsZVJh
ZCxlbmQ6dGhpcy5lbmRBbmdsZVJhZCxvcGVuOiEwLGluPQpuZXJSOjB9KX0sc2V0QXhpc1RyYW5z
bGF0aW9uOmZ1bmN0aW9uKCl7Ry5zZXRBeGlzVHJhbnNsYXRpb24uY2FsbCh0aGlzKTtpZig9CnRo
aXMuY2VudGVyKXRoaXMudHJhbnNBPTNEdGhpcy5pc0NpcmN1bGFyPyh0aGlzLmVuZEFuZ2xlUmFk
LXRoaXMuc3RhcnRBbmdsZT0KUmFkKS8odGhpcy5tYXgtdGhpcy5taW58fDEpOnRoaXMuY2VudGVy
WzJdLzIvKHRoaXMubWF4LXRoaXMubWlufHwxKSx0aGlzLm1pPQpuUGl4ZWxQYWRkaW5nPTNEdGhp
cy5pc1hBeGlzP3RoaXMudHJhbnNBKnRoaXMubWluUG9pbnRPZmZzZXQ6MH0sYmVmb3JlU2V0VGk9
CmNrUG9zaXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5hdXRvQ29ubmVjdCYmKHRoaXMubWF4Kz0zRHRo
aXMuY2F0ZWdvcmllcyYmCi0xfHx0aGlzLnBvaW50UmFuZ2V8fHRoaXMuY2xvc2VzdFBvaW50UmFu
Z2V8fDApfSxzZXRBeGlzU2l6ZTpmdW5jdGlvbigpe0cucz0KZXRBeGlzU2l6ZS5jYWxsKHRoaXMp
O2lmKHRoaXMuaXNSYWRpYWwpe3RoaXMuY2VudGVyPTNEdGhpcy5wYW5lLmNlbnRlcj0zRG0uPQpD
ZW50ZXJlZFNlcmllc01peGluLmdldENlbnRlci5jYWxsKHRoaXMucGFuZSk7aWYodGhpcy5pc0Np
cmN1bGFyKXRoaXMuc2VjdG89CnI9M0R0aGlzLmVuZEFuZ2xlUmFkLXRoaXMuc3RhcnRBbmdsZVJh
ZDt0aGlzLmxlbj0zRHRoaXMud2lkdGg9M0R0aGlzLmhlaWdodD0KPTNEdGhpcy5jZW50ZXJbMl0q
cSh0aGlzLnNlY3RvciwxKS8yfX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhp
PQpzLnBvc3RUcmFuc2xhdGUodGhpcy5pc0NpcmN1bGFyP3RoaXMudHJhbnNsYXRlKGEpOjAscSh0
aGlzLmlzQ2lyY3VsYXI/Yjp0aGk9CnMudHJhbnNsYXRlKGEpLHRoaXMuY2VudGVyWzJdLzIpLXRo
aXMub2Zmc2V0KX0scG9zdFRyYW5zbGF0ZTpmdW5jdGlvbihhLAotYil7dmFyIGM9M0R0aGlzLmNo
YXJ0LGQ9M0R0aGlzLmNlbnRlcixhPTNEdGhpcy5zdGFydEFuZ2xlUmFkK2E7cmV0dXJue3g6Yy49
CnBsb3RMZWZ0K2RbMF0rTWF0aC5jb3MoYSkqYix5OmMucGxvdFRvcCtkWzFdK01hdGguc2luKGEp
KmJ9fSxnZXRQbG90QmFuZFBhdD0KaDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9M0R0aGlzLmNlbnRl
cixlPTNEdGhpcy5zdGFydEFuZ2xlUmFkLGY9M0RkWzJdLzIsZz0KPTNEW3EoYy5vdXRlclJhZGl1
cywiMTAwJSIpLGMuaW5uZXJSYWRpdXMscShjLnRoaWNrbmVzcywxMCldLGs9M0QvJSQvLGwsbj0K
PTNEdGhpcy5pc0NpcmN1bGFyO3RoaXMub3B0aW9ucy5ncmlkTGluZUludGVycG9sYXRpb249M0Q9
M0Q9M0QicG9seWdvbiI/ZD0KPTNEdGhpcy5nZXRQbG90TGluZVBhdGgoYSkuY29uY2F0KHRoaXMu
Z2V0UGxvdExpbmVQYXRoKGIsITApKToobnx8KGdbMF09M0R0PQpoaXMudHJhbnNsYXRlKGEpLGdb
MV09M0R0aGlzLnRyYW5zbGF0ZShiKSksZz0zRFEoZyxmdW5jdGlvbihhKXtrLnRlc3QoYSkmJig9
CmE9M0R4KGEsMTApKmYvMTAwKTsKLXJldHVybiBhfSksYy5zaGFwZT0zRD0zRD0zRCJjaXJjbGUi
fHwhbj8oYT0zRC1NYXRoLlBJLzIsYj0zRE1hdGguUEkqMS41LGw9Cj0zRCEwKTooYT0zRGUrdGhp
cy50cmFuc2xhdGUoYSksYj0zRGUrdGhpcy50cmFuc2xhdGUoYikpLGQ9M0R0aGlzLmNoYXJ0LnJl
bj0KZGVyZXIuc3ltYm9scy5hcmModGhpcy5sZWZ0K2RbMF0sdGhpcy50b3ArZFsxXSxnWzBdLGdb
MF0se3N0YXJ0OmEsZW5kOmIsaW5uPQplclI6cShnWzFdLGdbMF0tZ1syXSksb3BlbjpsfSkpO3Jl
dHVybiBkfSxnZXRQbG90TGluZVBhdGg6ZnVuY3Rpb24oYSxiKXt2YXI9CiBjPTNEdGhpcyxkPTNE
Yy5jZW50ZXIsZT0zRGMuY2hhcnQsZj0zRGMuZ2V0UG9zaXRpb24oYSksZyxrLGw7Yy5pc0NpcmN1
bGFyPz0KbD0zRFsiTSIsZFswXStlLnBsb3RMZWZ0LGRbMV0rZS5wbG90VG9wLCJMIixmLngsZi55
XTpjLm9wdGlvbnMuZ3JpZExpbmVJbnRlPQpycG9sYXRpb249M0Q9M0Q9M0QiY2lyY2xlIj8oYT0z
RGMudHJhbnNsYXRlKGEpKSYmKGw9M0RjLmdldExpbmVQYXRoKDAsYSkpOig9CnMoZS54QXhpcyxm
dW5jdGlvbihhKXthLnBhbmU9M0Q9M0Q9M0QKLWMucGFuZSYmKGc9M0RhKX0pLGw9M0RbXSxhPTNE
Yy50cmFuc2xhdGUoYSksZD0zRGcudGlja1Bvc2l0aW9ucyxnLmF1dG9Db25uPQplY3QmJihkPTNE
ZC5jb25jYXQoW2RbMF1dKSksYiYmKGQ9M0RbXS5jb25jYXQoZCkucmV2ZXJzZSgpKSxzKGQsZnVu
Y3Rpb24oZiw9CmMpe2s9M0RnLmdldFBvc2l0aW9uKGYsYSk7bC5wdXNoKGM/IkwiOiJNIixrLngs
ay55KX0pKTtyZXR1cm4gbH0sZ2V0VGl0bGVQbz0Kc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9M0R0
aGlzLmNlbnRlcixiPTNEdGhpcy5jaGFydCxjPTNEdGhpcy5vcHRpb25zLnRpdGxlPQo7cmV0dXJu
e3g6Yi5wbG90TGVmdCthWzBdKyhjLnh8fDApLHk6Yi5wbG90VG9wK2FbMV0te2hpZ2g6MC41LG1p
ZGRsZTowLjI1LGw9Cm93OjB9W2MuYWxpZ25dKmFbMl0rKGMueXx8MCl9fX07cihHLCJpbml0Iixm
dW5jdGlvbihhLGIsYyl7dmFyIGk7dmFyIGQ9M0RiLj0KYW5ndWxhcixlPTNEYi5wb2xhcixmPTNE
Yy5pc1gsZz0zRGQmJmYsayxsO2w9M0RiLm9wdGlvbnM7dmFyIG49M0RjLnBhbmV8fDA7PQppZihk
KXtpZihGKHRoaXMsCi1nP1Y6Tiksaz0zRCFmKXRoaXMuZGVmYXVsdFJhZGlhbE9wdGlvbnM9M0R0
aGlzLmRlZmF1bHRSYWRpYWxHYXVnZU9wdGlvbnN9ZT0KbHNlIGlmKGUpRih0aGlzLE4pLHRoaXMu
ZGVmYXVsdFJhZGlhbE9wdGlvbnM9M0Qoaz0zRGYpP3RoaXMuZGVmYXVsdFJhZGlhbFhPPQpwdGlv
bnM6byh0aGlzLmRlZmF1bHRZQXhpc09wdGlvbnMsdGhpcy5kZWZhdWx0UmFkaWFsWU9wdGlvbnMp
O2EuY2FsbCh0aGlzLGI9CixjKTtpZighZyYmKGR8fGUpKXthPTNEdGhpcy5vcHRpb25zO2lmKCFi
LnBhbmVzKWIucGFuZXM9M0RbXTt0aGlzLnBhbmU9M0QoaT0KPTNEYi5wYW5lc1tuXT0zRGIucGFu
ZXNbbl18fG5ldyBLKEwobC5wYW5lKVtuXSxiLHRoaXMpLG49M0RpKTtuPTNEbi5vcHRpb25zPQo7
Yi5pbnZlcnRlZD0zRCExO2wuY2hhcnQuem9vbVR5cGU9M0RudWxsO3RoaXMuc3RhcnRBbmdsZVJh
ZD0zRGI9M0Qobi5zdGFydEE9Cm5nbGUtOTApKk1hdGguUEkvMTgwO3RoaXMuZW5kQW5nbGVSYWQ9
M0RsPTNEKHEobi5lbmRBbmdsZSxuLnN0YXJ0QW5nbGUrMzYwKT0KLTkwKSpNYXRoLlBJLwotMTgw
O3RoaXMub2Zmc2V0PTNEYS5vZmZzZXR8fDA7aWYoKHRoaXMuaXNDaXJjdWxhcj0zRGspJiZjLm1h
eD0zRD0zRD0zREMmJmw9Ci1iPTNEPTNEPTNEMipNYXRoLlBJKXRoaXMuYXV0b0Nvbm5lY3Q9M0Qh
MH19KTtyKHksImdldFBvc2l0aW9uIixmdW5jdGlvbihhLD0KYixjLGQsZSl7dmFyIGY9M0R0aGlz
LmF4aXM7cmV0dXJuIGYuZ2V0UG9zaXRpb24/Zi5nZXRQb3NpdGlvbihjKTphLmNhbGwodGhpPQpz
LGIsYyxkLGUpfSk7cih5LCJnZXRMYWJlbFBvc2l0aW9uIixmdW5jdGlvbihhLGIsYyxkLGUsZixn
LGssbCl7dmFyIG49M0R0aGk9CnMuYXhpcyxqPTNEZi55LGk9M0RmLmFsaWduLGg9M0Qobi50cmFu
c2xhdGUodGhpcy5wb3MpK24uc3RhcnRBbmdsZVJhZCtNYXRoLj0KUEkvMikvTWF0aC5QSSoxODAl
MzYwO24uaXNSYWRpYWw/KGE9M0RuLmdldFBvc2l0aW9uKHRoaXMucG9zLG4uY2VudGVyWzJdLzIr
PQpxKGYuZGlzdGFuY2UsLTI1KSksZi5yb3RhdGlvbj0zRD0zRD0zRCJhdXRvIj9kLmF0dHIoe3Jv
dGF0aW9uOmh9KTpqPTNEPTNEPQo9M0RudWxsJiYoaj0zRG4uY2hhcnQucmVuZGVyZXIuZm9udE1l
dHJpY3MoZC5zdHlsZXMuZm9udFNpemUpLmItCi1kLmdldEJCb3goKS5oZWlnaHQvMiksaT0zRD0z
RD0zRG51bGwmJihpPTNEbi5pc0NpcmN1bGFyP2g+MjAmJmg8MTYwPyJsZWZ0Ij0KOmg+MjAwJiZo
PDM0MD8icmlnaHQiOiJjZW50ZXIiOiJjZW50ZXIiLGQuYXR0cih7YWxpZ246aX0pKSxhLngrPTNE
Zi54LGEueSs9Cj0zRGopOmE9M0RhLmNhbGwodGhpcyxiLGMsZCxlLGYsZyxrLGwpO3JldHVybiBh
fSk7cih5LCJnZXRNYXJrUGF0aCIsZnVuY3Rpbz0KbihhLGIsYyxkLGUsZixnKXt2YXIgaz0zRHRo
aXMuYXhpcztrLmlzUmFkaWFsPyhhPTNEay5nZXRQb3NpdGlvbih0aGlzLnBvcyxrPQouY2VudGVy
WzJdLzIrZCksYj0zRFsiTSIsYixjLCJMIixhLngsYS55XSk6Yj0zRGEuY2FsbCh0aGlzLGIsYyxk
LGUsZixnKTtyZXQ9CnVybiBifSk7cC5hcmVhcmFuZ2U9M0RvKHAuYXJlYSx7bGluZVdpZHRoOjEs
bWFya2VyOm51bGwsdGhyZXNob2xkOm51bGwsdG9vbD0KdGlwOntwb2ludEZvcm1hdDonPHNwYW4g
c3R5bGU9M0QiY29sb3I6e3Nlcmllcy5jb2xvcn0iPj1FMj05Nz04Rjwvc3Bhbj4ge3NlPQpyaWVz
Lm5hbWV9OiA8Yj57cG9pbnQubG93fTwvYj4gLSA8Yj57cG9pbnQuaGlnaH08L2I+PGJyLz4nfSwK
LXRyYWNrQnlBcmVhOiEwLGRhdGFMYWJlbHM6e3ZlcnRpY2FsQWxpZ246bnVsbCx4TG93OjAseEhp
Z2g6MCx5TG93OjAseUhpZ2g6PQowfSxzdGF0ZXM6e2hvdmVyOntoYWxvOiExfX19KTtoLmFyZWFy
YW5nZT0zRHUoaC5hcmVhLHt0eXBlOiJhcmVhcmFuZ2UiLHBvaW49CnRBcnJheU1hcDpbImxvdyIs
ImhpZ2giXSx0b1lEYXRhOmZ1bmN0aW9uKGEpe3JldHVyblthLmxvdyxhLmhpZ2hdfSxwb2ludFZh
bD0KS2V5OiJsb3ciLGdldFNlZ21lbnRzOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzO3MoYS5wb2lu
dHMsZnVuY3Rpb24oYil7aWYoIWEuPQpvcHRpb25zLmNvbm5lY3ROdWxscyYmKGIubG93PTNEPTNE
PTNEbnVsbHx8Yi5oaWdoPTNEPTNEPTNEbnVsbCkpYi55PTNEbnVsbDs9CmVsc2UgaWYoYi5sb3c9
M0Q9M0Q9M0RudWxsJiZiLmhpZ2ghPTNEPTNEbnVsbCliLnk9M0RiLmhpZ2h9KTt0LnByb3RvdHlw
ZS5nZT0KdFNlZ21lbnRzLmNhbGwodGhpcyl9LHRyYW5zbGF0ZTpmdW5jdGlvbigpe3ZhciBhPTNE
dGhpcy55QXhpcztoLmFyZWEucHJvdG90PQp5cGUudHJhbnNsYXRlLmFwcGx5KHRoaXMpOwotcyh0
aGlzLnBvaW50cyxmdW5jdGlvbihiKXt2YXIgYz0zRGIubG93LGQ9M0RiLmhpZ2gsZT0zRGIucGxv
dFk7ZD0zRD0zRD0zRG49CnVsbCYmYz0zRD0zRD0zRG51bGw/Yi55PTNEbnVsbDpjPTNEPTNEPTNE
bnVsbD8oYi5wbG90TG93PTNEYi5wbG90WT0zRG51bGwsYj0KLnBsb3RIaWdoPTNEYS50cmFuc2xh
dGUoZCwwLDEsMCwxKSk6ZD0zRD0zRD0zRG51bGw/KGIucGxvdExvdz0zRGUsYi5wbG90SGlnPQpo
PTNEbnVsbCk6KGIucGxvdExvdz0zRGUsYi5wbG90SGlnaD0zRGEudHJhbnNsYXRlKGQsMCwxLDAs
MSkpfSl9LGdldFNlZ21lbnQ9ClBhdGg6ZnVuY3Rpb24oYSl7dmFyIGIsYz0zRFtdLGQ9M0RhLmxl
bmd0aCxlPTNEdC5wcm90b3R5cGUuZ2V0U2VnbWVudFBhdGgsZj0KLGc7Zz0zRHRoaXMub3B0aW9u
czt2YXIgaz0zRGcuc3RlcDtmb3IoYj0zREhpZ2hjaGFydHNBZGFwdGVyLmdyZXAoYSxmdW5jdGlv
PQpuKGEpe3JldHVybiBhLnBsb3RMb3chPTNEPTNEbnVsbH0pO2QtLTspZj0zRGFbZF0sZi5wbG90
SGlnaCE9M0Q9M0RudWxsJiZjLnA9CnVzaCh7cGxvdFg6Zi5wbG90WCxwbG90WTpmLnBsb3RIaWdo
fSk7YT0zRGUuY2FsbCh0aGlzLAotYik7aWYoaylrPTNEPTNEPTNEITAmJihrPTNEImxlZnQiKSxn
LnN0ZXA9M0R7bGVmdDoicmlnaHQiLGNlbnRlcjoiY2VudGVyIiw9CnJpZ2h0OiJsZWZ0In1ba107
Yz0zRGUuY2FsbCh0aGlzLGMpO2cuc3RlcD0zRGs7Zz0zRFtdLmNvbmNhdChhLGMpO2NbMF09M0Qi
TD0KIjt0aGlzLmFyZWFQYXRoPTNEdGhpcy5hcmVhUGF0aC5jb25jYXQoYSxjKTtyZXR1cm4gZ30s
ZHJhd0RhdGFMYWJlbHM6ZnVuY3RpPQpvbigpe3ZhciBhPTNEdGhpcy5kYXRhLGI9M0RhLmxlbmd0
aCxjLGQ9M0RbXSxlPTNEdC5wcm90b3R5cGUsZj0zRHRoaXMub3B0aW89Cm5zLmRhdGFMYWJlbHMs
ZyxrPTNEdGhpcy5jaGFydC5pbnZlcnRlZDtpZihmLmVuYWJsZWR8fHRoaXMuX2hhc1BvaW50TGFi
ZWxzKT0Ke2ZvcihjPTNEYjtjLS07KWc9M0RhW2NdLGcueT0zRGcuaGlnaCxnLl9wbG90WT0zRGcu
cGxvdFksZy5wbG90WT0zRGcucGxvdEhpPQpnaCxkW2NdPTNEZy5kYXRhTGFiZWwsZy5kYXRhTGFi
ZWw9M0RnLmRhdGFMYWJlbFVwcGVyLGcuYmVsb3c9M0QhMSxrPyhmLmFsaWc9Cm49M0QibGVmdCIs
Zi54PTNEZi54SGlnaCk6Zi55PTNECi1mLnlIaWdoO2UuZHJhd0RhdGFMYWJlbHMmJmUuZHJhd0Rh
dGFMYWJlbHMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2ZvcihjPTNEYj0KO2MtLTspZz0zRGFbY10s
Zy5kYXRhTGFiZWxVcHBlcj0zRGcuZGF0YUxhYmVsLGcuZGF0YUxhYmVsPTNEZFtjXSxnLnk9M0Rn
LmxvPQp3LGcucGxvdFk9M0RnLl9wbG90WSxnLmJlbG93PTNEITAsaz8oZi5hbGlnbj0zRCJyaWdo
dCIsZi54PTNEZi54TG93KTpmLnk9M0Q9CmYueUxvdztlLmRyYXdEYXRhTGFiZWxzJiZlLmRyYXdE
YXRhTGFiZWxzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGFsaWduRGF0YT0KTGFiZWw6ZnVuY3Rp
b24oKXtoLmNvbHVtbi5wcm90b3R5cGUuYWxpZ25EYXRhTGFiZWwuYXBwbHkodGhpcyxhcmd1bWVu
dHMpfSxnPQpldFN5bWJvbDpoLmNvbHVtbi5wcm90b3R5cGUuZ2V0U3ltYm9sLGRyYXdQb2ludHM6
d30pO3AuYXJlYXNwbGluZXJhbmdlPTNEbyg9CnAuYXJlYXJhbmdlKTtoLmFyZWFzcGxpbmVyYW5n
ZT0zRHUoaC5hcmVhcmFuZ2Use3R5cGU6ImFyZWFzcGxpbmVyYW5nZSIsZ2V0UD0Kb2ludFNwbGlu
ZTpoLnNwbGluZS5wcm90b3R5cGUuZ2V0UG9pbnRTcGxpbmV9KTsKLShmdW5jdGlvbigpe3ZhciBh
PTNEaC5jb2x1bW4ucHJvdG90eXBlO3AuY29sdW1ucmFuZ2U9M0RvKHAuY29sdW1uLHAuYXJlYXJh
PQpuZ2Use2xpbmVXaWR0aDoxLHBvaW50UmFuZ2U6bnVsbH0pO2guY29sdW1ucmFuZ2U9M0R1KGgu
YXJlYXJhbmdlLHt0eXBlOiJjb2w9CnVtbnJhbmdlIix0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIg
Yj0zRHRoaXMsYz0zRGIueUF4aXMsZDthLnRyYW5zbGF0ZS5hcHBseT0KKGIpO3MoYi5wb2ludHMs
ZnVuY3Rpb24oYSl7dmFyIGY9M0RhLnNoYXBlQXJncyxnPTNEYi5vcHRpb25zLm1pblBvaW50TGVu
Z3RoPQosazthLnRvb2x0aXBQb3M9M0RudWxsO2EucGxvdEhpZ2g9M0RkPTNEYy50cmFuc2xhdGUo
YS5oaWdoLDAsMSwwLDEpO2EucGxvdEw9Cm93PTNEYS5wbG90WTtrPTNEZDthPTNEYS5wbG90WS1k
O2E8ZyYmKGctPTNEYSxhKz0zRGcsay09M0RnLzIpO2YuaGVpZ2h0PTNEYT0KO2YueT0zRGt9KX0s
dHJhY2tlckdyb3VwczpbImdyb3VwIiwiZGF0YUxhYmVscyJdLGRyYXdHcmFwaDp3LHBvaW50QXR0
clRvT3B0PQppb25zOmEucG9pbnRBdHRyVG9PcHRpb25zLAotZHJhd1BvaW50czphLmRyYXdQb2lu
dHMsZHJhd1RyYWNrZXI6YS5kcmF3VHJhY2tlcixhbmltYXRlOmEuYW5pbWF0ZSxnZXRDb2w9CnVt
bk1ldHJpY3M6YS5nZXRDb2x1bW5NZXRyaWNzfSl9KSgpO3AuZ2F1Z2U9M0RvKHAubGluZSx7ZGF0
YUxhYmVsczp7ZW5hYmxlZD0KOiEwLGRlZmVyOiExLHk6MTUsYm9yZGVyV2lkdGg6MSxib3JkZXJD
b2xvcjoic2lsdmVyIixib3JkZXJSYWRpdXM6Myxjcm9wOiExPQosc3R5bGU6e2ZvbnRXZWlnaHQ6
ImJvbGQifSx2ZXJ0aWNhbEFsaWduOiJ0b3AiLHpJbmRleDoyfSxkaWFsOnt9LHBpdm90Ont9LHQ9
Cm9vbHRpcDp7aGVhZGVyRm9ybWF0OiIifSxzaG93SW5MZWdlbmQ6ITF9KTt6PTNEe3R5cGU6Imdh
dWdlIixwb2ludENsYXNzOnUoSD0KLHtzZXRTdGF0ZTpmdW5jdGlvbihhKXt0aGlzLnN0YXRlPTNE
YX19KSxhbmd1bGFyOiEwLGRyYXdHcmFwaDp3LGZpeGVkQm94OiEwPQosZm9yY2VETDohMCx0cmFj
a2VyR3JvdXBzOlsiZ3JvdXAiLCJkYXRhTGFiZWxzIl0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7dmFy
IGE9Cj0zRAotdGhpcy55QXhpcyxiPTNEdGhpcy5vcHRpb25zLGM9M0RhLmNlbnRlcjt0aGlzLmdl
bmVyYXRlUG9pbnRzKCk7cyh0aGlzLnBvaW49CnRzLGZ1bmN0aW9uKGQpe3ZhciBlPTNEbyhiLmRp
YWwsZC5kaWFsKSxmPTNEeChxKGUucmFkaXVzLDgwKSkqY1syXS8yMDAsZz0zRD0KeChxKGUuYmFz
ZUxlbmd0aCw3MCkpKmYvMTAwLGs9M0R4KHEoZS5yZWFyTGVuZ3RoLDEwKSkqZi8xMDAsbD0zRGUu
YmFzZVdpZHRoPQp8fDMsbj0zRGUudG9wV2lkdGh8fDEsaj0zRGIub3ZlcnNob290LGk9M0RhLnN0
YXJ0QW5nbGVSYWQrYS50cmFuc2xhdGUoZC55LG49CnVsbCxudWxsLG51bGwsITApO2omJnR5cGVv
ZiBqPTNEPTNEPTNEIm51bWJlciI/KGo9M0RqLzE4MCpNYXRoLlBJLGk9M0RNYXRoLj0KbWF4KGEu
c3RhcnRBbmdsZVJhZC1qLE1hdGgubWluKGEuZW5kQW5nbGVSYWQraixpKSkpOmIud3JhcD0zRD0z
RD0zRCExJiYoaT0KPTNETWF0aC5tYXgoYS5zdGFydEFuZ2xlUmFkLE1hdGgubWluKGEuZW5kQW5n
bGVSYWQsaSkpKTtpPTNEaSoxODAvTWF0aC5QSTtkPQouc2hhcGVUeXBlPTNEInBhdGgiO2Quc2hh
cGVBcmdzPTNECi17ZDplLnBhdGh8fFsiTSIsLWssLWwvMiwiTCIsZywtbC8yLGYsLW4vMixmLG4v
MixnLGwvMiwtayxsLzIsInoiXSx0cmFuc2xhdD0KZVg6Y1swXSx0cmFuc2xhdGVZOmNbMV0scm90
YXRpb246aX07ZC5wbG90WD0zRGNbMF07ZC5wbG90WT0zRGNbMV19KX0sZHJhd1BvPQppbnRzOmZ1
bmN0aW9uKCl7dmFyIGE9M0R0aGlzLGI9M0RhLnlBeGlzLmNlbnRlcixjPTNEYS5waXZvdCxkPTNE
YS5vcHRpb25zLGU9Cj0zRGQucGl2b3QsZj0zRGEuY2hhcnQucmVuZGVyZXI7cyhhLnBvaW50cyxm
dW5jdGlvbihjKXt2YXIgYj0zRGMuZ3JhcGhpYyxsPQo9M0RjLnNoYXBlQXJncyxlPTNEbC5kLGo9
M0RvKGQuZGlhbCxjLmRpYWwpO2I/KGIuYW5pbWF0ZShsKSxsLmQ9M0RlKTpjLmdyYXA9CmhpYz0z
RGZbYy5zaGFwZVR5cGVdKGwpLmF0dHIoe3N0cm9rZTpqLmJvcmRlckNvbG9yfHwibm9uZSIsInN0
cm9rZS13aWR0aCI6aj0KLmJvcmRlcldpZHRofHwwLGZpbGw6ai5iYWNrZ3JvdW5kQ29sb3J8fCJi
bGFjayIscm90YXRpb246bC5yb3RhdGlvbn0pLmFkZChhPQouZ3JvdXApfSk7Ci1jP2MuYW5pbWF0
ZSh7dHJhbnNsYXRlWDpiWzBdLHRyYW5zbGF0ZVk6YlsxXX0pOmEucGl2b3Q9M0RmLmNpcmNsZSgw
LDAscShlLj0KcmFkaXVzLDUpKS5hdHRyKHsic3Ryb2tlLXdpZHRoIjplLmJvcmRlcldpZHRofHww
LHN0cm9rZTplLmJvcmRlckNvbG9yfHwic2lsPQp2ZXIiLGZpbGw6ZS5iYWNrZ3JvdW5kQ29sb3J8
fCJibGFjayJ9KS50cmFuc2xhdGUoYlswXSxiWzFdKS5hZGQoYS5ncm91cCl9LGE9Cm5pbWF0ZTpm
dW5jdGlvbihhKXt2YXIgYj0zRHRoaXM7aWYoIWEpcyhiLnBvaW50cyxmdW5jdGlvbihhKXt2YXIg
ZD0zRGEuZ3JhcD0KaGljO2QmJihkLmF0dHIoe3JvdGF0aW9uOmIueUF4aXMuc3RhcnRBbmdsZVJh
ZCoxODAvTWF0aC5QSX0pLGQuYW5pbWF0ZSh7cm90PQphdGlvbjphLnNoYXBlQXJncy5yb3RhdGlv
bn0sYi5vcHRpb25zLmFuaW1hdGlvbikpfSksYi5hbmltYXRlPTNEbnVsbH0scmVuZGU9CnI6ZnVu
Y3Rpb24oKXt0aGlzLmdyb3VwPTNEdGhpcy5wbG90R3JvdXAoImdyb3VwIiwic2VyaWVzIix0aGlz
LnZpc2libGU/Ci0idmlzaWJsZSI6ImhpZGRlbiIsdGhpcy5vcHRpb25zLnpJbmRleCx0aGlzLmNo
YXJ0LnNlcmllc0dyb3VwKTt0LnByb3RvdHlwZT0KLnJlbmRlci5jYWxsKHRoaXMpO3RoaXMuZ3Jv
dXAuY2xpcCh0aGlzLmNoYXJ0LmNsaXBSZWN0KX0sc2V0RGF0YTpmdW5jdGlvbihhPQosYil7dC5w
cm90b3R5cGUuc2V0RGF0YS5jYWxsKHRoaXMsYSwhMSk7dGhpcy5wcm9jZXNzRGF0YSgpO3RoaXMu
Z2VuZXJhdGVQb2k9Cm50cygpO3EoYiwhMCkmJnRoaXMuY2hhcnQucmVkcmF3KCl9LGRyYXdUcmFj
a2VyOnomJnouZHJhd1RyYWNrZXJQb2ludH07aC5nYT0KdWdlPTNEdShoLmxpbmUseik7cC5ib3hw
bG90PTNEbyhwLmNvbHVtbix7ZmlsbENvbG9yOiIjRkZGRkZGIixsaW5lV2lkdGg6MSxtPQplZGlh
bldpZHRoOjIsc3RhdGVzOntob3Zlcjp7YnJpZ2h0bmVzczotMC4zfX0sdGhyZXNob2xkOm51bGws
dG9vbHRpcDp7cG9pbnQ9CkZvcm1hdDonPHNwYW4gc3R5bGU9M0QiY29sb3I6e3Nlcmllcy5jb2xv
cn0iPj1FMj05Nz04Rjwvc3Bhbj48Yj4ge3Nlcmllcy5uYT0KbWV9PC9iPjxici8+TWF4aW11bTog
e3BvaW50LmhpZ2h9PGJyLz5VcHBlciBxdWFydGlsZToge3BvaW50LnEzfTxici8+TWVkaWFuPQo6
IHtwb2ludC5tZWRpYW59PGJyLz5Mb3dlciBxdWFydGlsZToge3BvaW50LnExfTxici8+TWluaW11
bToge3BvaW50Lmxvd308YnI9Ci8+J30sCi13aGlza2VyTGVuZ3RoOiI1MCUiLHdoaXNrZXJXaWR0
aDoyfSk7aC5ib3hwbG90PTNEdShoLmNvbHVtbix7dHlwZToiYm94cGxvdD0KIixwb2ludEFycmF5
TWFwOlsibG93IiwicTEiLCJtZWRpYW4iLCJxMyIsImhpZ2giXSx0b1lEYXRhOmZ1bmN0aW9uKGEp
e3JldHVyPQpuW2EubG93LGEucTEsYS5tZWRpYW4sYS5xMyxhLmhpZ2hdfSxwb2ludFZhbEtleToi
aGlnaCIscG9pbnRBdHRyVG9PcHRpb25zOns9CmZpbGw6ImZpbGxDb2xvciIsc3Ryb2tlOiJjb2xv
ciIsInN0cm9rZS13aWR0aCI6ImxpbmVXaWR0aCJ9LGRyYXdEYXRhTGFiZWxzOj0Kdyx0cmFuc2xh
dGU6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMueUF4aXMsYj0zRHRoaXMucG9pbnRBcnJheU1hcDto
LmNvbHVtbi5wPQpyb3RvdHlwZS50cmFuc2xhdGUuYXBwbHkodGhpcyk7cyh0aGlzLnBvaW50cyxm
dW5jdGlvbihjKXtzKGIsZnVuY3Rpb24oYil7Y1s9CmJdIT0zRD0zRG51bGwmJihjW2IrIlBsb3Qi
XT0zRGEudHJhbnNsYXRlKGNbYl0sMCwxLDAsMSkpfSl9KX0sZHJhd1BvaW50czpmdT0KbmN0aW9u
KCl7dmFyIGE9M0QKLXRoaXMsYj0zRGEucG9pbnRzLGM9M0RhLm9wdGlvbnMsZD0zRGEuY2hhcnQu
cmVuZGVyZXIsZSxmLGcsayxsLG4saixpLGgsbSxwPQosSSxyLG8sSix1LHcsdCx2LHgseix5LEU9
M0RhLmRvUXVhcnRpbGVzIT0zRD0zRCExLEI9M0RwYXJzZUludChhLm9wdGlvbnMud2g9Cmlza2Vy
TGVuZ3RoLDEwKS8xMDA7cyhiLGZ1bmN0aW9uKGIpe2g9M0RiLmdyYXBoaWM7ej0zRGIuc2hhcGVB
cmdzO3A9M0R7fTtvPQo9M0R7fTt1PTNEe307eT0zRGIuY29sb3J8fGEuY29sb3I7aWYoYi5wbG90
WSE9M0Q9M0RDKWlmKGU9M0RiLnBvaW50QXR0cltiLnM9CmVsZWN0ZWQ/InNlbGVjdGVkIjoiIl0s
dz0zRHoud2lkdGgsdD0zREEoei54KSx2PTNEdCt3LHg9M0REKHcvMiksZj0zREEoRT9iLj0KcTFQ
bG90OmIubG93UGxvdCksZz0zREEoRT9iLnEzUGxvdDpiLmxvd1Bsb3QpLGs9M0RBKGIuaGlnaFBs
b3QpLGw9M0RBKGIubG93PQpQbG90KSxwLnN0cm9rZT0zRGIuc3RlbUNvbG9yfHxjLnN0ZW1Db2xv
cnx8eSxwWyJzdHJva2Utd2lkdGgiXT0zRHEoYi5zdGVtV2k9CmR0aCxjLnN0ZW1XaWR0aCxjLmxp
bmVXaWR0aCkscC5kYXNoc3R5bGU9M0QKLWIuc3RlbURhc2hTdHlsZXx8Yy5zdGVtRGFzaFN0eWxl
LG8uc3Ryb2tlPTNEYi53aGlza2VyQ29sb3J8fGMud2hpc2tlckNvbG9yPQp8fHksb1sic3Ryb2tl
LXdpZHRoIl09M0RxKGIud2hpc2tlcldpZHRoLGMud2hpc2tlcldpZHRoLGMubGluZVdpZHRoKSx1
LnN0cm89CmtlPTNEYi5tZWRpYW5Db2xvcnx8Yy5tZWRpYW5Db2xvcnx8eSx1WyJzdHJva2Utd2lk
dGgiXT0zRHEoYi5tZWRpYW5XaWR0aCxjLj0KbWVkaWFuV2lkdGgsYy5saW5lV2lkdGgpLHVbInN0
cm9rZS1saW5lY2FwIl09M0Qicm91bmQiLGo9M0RwWyJzdHJva2Utd2lkdGgiPQpdJTIvMixpPTNE
dCt4K2osbT0zRFsiTSIsaSxnLCJMIixpLGssIk0iLGksZiwiTCIsaSxsXSxFJiYoaj0zRGVbInN0
cm9rZS13aWQ9CnRoIl0lMi8yLGk9M0RBKGkpK2osZj0zREEoZikraixnPTNEQShnKStqLHQrPTNE
aix2Kz0zRGosST0zRFsiTSIsdCxnLCJMIix0LD0KZiwiTCIsdixmLCJMIix2LGcsIkwiLHQsZywi
eiJdKSxCJiYoaj0zRG9bInN0cm9rZS13aWR0aCJdJTIvMixrKz0zRGosbCs9M0RqPQoscj0zRFsi
TSIsaS14KkIsCi1rLCJMIixpK3gqQixrLCJNIixpLXgqQixsLCJMIixpK3gqQixsXSksaj0zRHVb
InN0cm9rZS13aWR0aCJdJTIvMixuPTNERChiLj0KbWVkaWFuUGxvdCkraixKPTNEWyJNIix0LG4s
IkwiLHYsbl0saCliLnN0ZW0uYW5pbWF0ZSh7ZDptfSksQiYmYi53aGlza2Vycy5hPQpuaW1hdGUo
e2Q6cn0pLEUmJmIuYm94LmFuaW1hdGUoe2Q6SX0pLGIubWVkaWFuU2hhcGUuYW5pbWF0ZSh7ZDpK
fSk7ZWxzZXtiLmc9CnJhcGhpYz0zRGg9M0RkLmcoKS5hZGQoYS5ncm91cCk7Yi5zdGVtPTNEZC5w
YXRoKG0pLmF0dHIocCkuYWRkKGgpO2lmKEIpYi53aD0KaXNrZXJzPTNEZC5wYXRoKHIpLmF0dHIo
bykuYWRkKGgpO2lmKEUpYi5ib3g9M0RkLnBhdGgoSSkuYXR0cihlKS5hZGQoaCk7Yi5tPQplZGlh
blNoYXBlPTNEZC5wYXRoKEopLmF0dHIodSkuYWRkKGgpfX0pfX0pO3AuZXJyb3JiYXI9M0RvKHAu
Ym94cGxvdCx7Y29sb3I9CjoiIzAwMDAwMCIsZ3JvdXBpbmc6ITEsbGlua2VkVG86IjpwcmV2aW91
cyIsdG9vbHRpcDp7cG9pbnRGb3JtYXQ6JzxzcGFuIHN0eT0KbGU9M0QiY29sb3I6e3Nlcmllcy5j
b2xvcn0iPj1FMj05Nz04Rjwvc3Bhbj4ge3Nlcmllcy5uYW1lfTogPGI+e3BvaW50Lmxvd308PQov
Yj4gLSA8Yj57cG9pbnQuaGlnaH08L2I+PGJyLz4nfSwKLXdoaXNrZXJXaWR0aDpudWxsfSk7aC5l
cnJvcmJhcj0zRHUoaC5ib3hwbG90LHt0eXBlOiJlcnJvcmJhciIscG9pbnRBcnJheU1hPQpwOlsi
bG93IiwiaGlnaCJdLHRvWURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuW2EubG93LGEuaGlnaF19LHBv
aW50VmFsS2V5OiJoaWc9CmgiLGRvUXVhcnRpbGVzOiExLGRyYXdEYXRhTGFiZWxzOmguYXJlYXJh
bmdlP2guYXJlYXJhbmdlLnByb3RvdHlwZS5kcmF3RGF0YT0KTGFiZWxzOncsZ2V0Q29sdW1uTWV0
cmljczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmtlZFBhcmVudCYmdGhpcy5saW5rZWRQPQph
cmVudC5jb2x1bW5NZXRyaWNzfHxoLmNvbHVtbi5wcm90b3R5cGUuZ2V0Q29sdW1uTWV0cmljcy5j
YWxsKHRoaXMpfX0pO3Aud2E9CnRlcmZhbGw9M0RvKHAuY29sdW1uLHtsaW5lV2lkdGg6MSxsaW5l
Q29sb3I6IiMzMzMiLGRhc2hTdHlsZToiZG90Iixib3JkZXJDbz0KbG9yOiIjMzMzIn0pO2gud2F0
ZXJmYWxsPTNEdShoLmNvbHVtbix7dHlwZToid2F0ZXJmYWxsIix1cENvbG9yUHJvcDoiZmlsbCIs
Ci1wb2ludEFycmF5TWFwOlsibG93IiwieSJdLHBvaW50VmFsS2V5OiJ5Iixpbml0OmZ1bmN0aW9u
KGEsYil7Yi5zdGFja2luZz0zRD0KITA7aC5jb2x1bW4ucHJvdG90eXBlLmluaXQuY2FsbCh0aGlz
LGEsYil9LHRyYW5zbGF0ZTpmdW5jdGlvbigpe3ZhciBhPTNEdGhpPQpzLnlBeGlzLGIsYyxkLGUs
ZixnLGssbCxuO2I9M0R0aGlzLm9wdGlvbnMudGhyZXNob2xkO2guY29sdW1uLnByb3RvdHlwZS50
cmE9Cm5zbGF0ZS5hcHBseSh0aGlzKTtsPTNEYjtkPTNEdGhpcy5wb2ludHM7Zm9yKGM9M0QwLGI9
M0RkLmxlbmd0aDtjPGI7YysrKXtlPQo9M0RkW2NdO2Y9M0RlLnNoYXBlQXJncztnPTNEdGhpcy5n
ZXRTdGFjayhjKTtuPTNEZy5wb2ludHNbdGhpcy5pbmRleCsiLCIrY109CjtpZihpc05hTihlLnkp
KWUueT0zRHRoaXMueURhdGFbY107az0zRFQobCxsK2UueSkrblswXTtmLnk9M0RhLnRyYW5zbGF0
ZShrLD0KMCwxKTtlLmlzU3VtfHxlLmlzSW50ZXJtZWRpYXRlU3VtPyhmLnk9M0RhLnRyYW5zbGF0
ZShuWzFdLDAsMSksZi5oZWlnaHQ9M0RhPQoudHJhbnNsYXRlKG5bMF0sCi0wLDEpLWYueSk6bCs9
M0RnLnRvdGFsO2YuaGVpZ2h0PDAmJihmLnkrPTNEZi5oZWlnaHQsZi5oZWlnaHQqPTNELTEpO2Uu
cGxvdD0KWT0zRGYueT0zREQoZi55KS10aGlzLmJvcmRlcldpZHRoJTIvMjtmLmhlaWdodD0zREQo
Zi5oZWlnaHQpO2UueUJvdHRvbT0zRGYuPQp5K2YuaGVpZ2h0fX0scHJvY2Vzc0RhdGE6ZnVuY3Rp
b24oYSl7dmFyIGI9M0R0aGlzLnlEYXRhLGM9M0R0aGlzLnBvaW50cyxkLGU9Cj0zRGIubGVuZ3Ro
LGY9M0R0aGlzLm9wdGlvbnMudGhyZXNob2xkfHwwLGcsayxsLG4saixpO2s9M0RnPTNEbD0zRG49
M0RmO2Zvcj0KKGk9M0QwO2k8ZTtpKyspaj0zRGJbaV0sZD0zRGMmJmNbaV0/Y1tpXTp7fSxqPTNE
PTNEPTNEInN1bSJ8fGQuaXNTdW0/YltpXT0KPTNEazpqPTNEPTNEPTNEImludGVybWVkaWF0ZVN1
bSJ8fGQuaXNJbnRlcm1lZGlhdGVTdW0/KGJbaV09M0RnLGc9M0RmKTooays9Cj0zRGosZys9M0Rq
KSxsPTNETWF0aC5taW4oayxsKSxuPTNETWF0aC5tYXgoayxuKTt0LnByb3RvdHlwZS5wcm9jZXNz
RGF0YS5jYT0KbGwodGhpcyxhKTt0aGlzLmRhdGFNaW49M0RsO3RoaXMuZGF0YU1heD0zRG59LAot
dG9ZRGF0YTpmdW5jdGlvbihhKXtpZihhLmlzU3VtKXJldHVybiJzdW0iO2Vsc2UgaWYoYS5pc0lu
dGVybWVkaWF0ZVN1bSlyZXQ9CnVybiJpbnRlcm1lZGlhdGVTdW0iO3JldHVybiBhLnl9LGdldEF0
dHJpYnM6ZnVuY3Rpb24oKXtoLmNvbHVtbi5wcm90b3R5cGUuZz0KZXRBdHRyaWJzLmFwcGx5KHRo
aXMsYXJndW1lbnRzKTt2YXIgYT0zRHRoaXMub3B0aW9ucyxiPTNEYS5zdGF0ZXMsYz0zRGEudXBD
PQpvbG9yfHx0aGlzLmNvbG9yLGE9M0RtLkNvbG9yKGMpLmJyaWdodGVuKDAuMSkuZ2V0KCksZD0z
RG8odGhpcy5wb2ludEF0dHIpLGU9Cj0zRHRoaXMudXBDb2xvclByb3A7ZFsiIl1bZV09M0RjO2Qu
aG92ZXJbZV09M0RiLmhvdmVyLnVwQ29sb3J8fGE7ZC5zZWxlY3RbZT0KXT0zRGIuc2VsZWN0LnVw
Q29sb3J8fGM7cyh0aGlzLnBvaW50cyxmdW5jdGlvbihhKXtpZihhLnk+MCYmIWEuY29sb3IpYS5w
b2luPQp0QXR0cj0zRGQsYS5jb2xvcj0zRGN9KX0sZ2V0R3JhcGhQYXRoOmZ1bmN0aW9uKCl7dmFy
IGE9M0R0aGlzLmRhdGEsYj0zRGEubGU9Cm5ndGgsCi1jPTNERCh0aGlzLm9wdGlvbnMubGluZVdp
ZHRoK3RoaXMuYm9yZGVyV2lkdGgpJTIvMixkPTNEW10sZSxmLGc7Zm9yKGc9M0QxOz0KZzxiO2cr
KylmPTNEYVtnXS5zaGFwZUFyZ3MsZT0zRGFbZy0xXS5zaGFwZUFyZ3MsZj0zRFsiTSIsZS54K2Uu
d2lkdGgsZS55K2MsPQoiTCIsZi54LGUueStjXSxhW2ctMV0ueTwwJiYoZlsyXSs9M0RlLmhlaWdo
dCxmWzVdKz0zRGUuaGVpZ2h0KSxkPTNEZC5jb25jYXQ9CihmKTtyZXR1cm4gZH0sZ2V0RXh0cmVt
ZXM6dyxnZXRTdGFjazpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMueUF4aXMuc3RhY2tzLD0KYz0z
RHRoaXMuc3RhY2tLZXk7dGhpcy5wcm9jZXNzZWRZRGF0YVthXTx0aGlzLm9wdGlvbnMudGhyZXNo
b2xkJiYoYz0zRCItIitjPQopO3JldHVybiBiW2NdW2FdfSxkcmF3R3JhcGg6dC5wcm90b3R5cGUu
ZHJhd0dyYXBofSk7cC5idWJibGU9M0RvKHAuc2NhdHRlciw9CntkYXRhTGFiZWxzOntmb3JtYXQ6
Intwb2ludC56fSIsaW5zaWRlOiEwLHN0eWxlOntjb2xvcjoid2hpdGUiLHRleHRTaGFkb3c6Ij0K
MHB4IDBweCAzcHggYmxhY2sifSwKLXZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LG1hcmtlcjp7bGlu
ZUNvbG9yOm51bGwsbGluZVdpZHRoOjF9LG1pblNpemU6OCxtYXhTPQppemU6IjIwJSIsc3RhdGVz
Ontob3Zlcjp7aGFsbzp7c2l6ZTo1fX19LHRvb2x0aXA6e3BvaW50Rm9ybWF0OiIoe3BvaW50Lnh9
LCA9Cntwb2ludC55fSksIFNpemU6IHtwb2ludC56fSJ9LHR1cmJvVGhyZXNob2xkOjAselRocmVz
aG9sZDowfSk7ej0zRHUoSCx7aGFsbz0KUGF0aDpmdW5jdGlvbigpe3JldHVybiBILnByb3RvdHlw
ZS5oYWxvUGF0aC5jYWxsKHRoaXMsdGhpcy5zaGFwZUFyZ3Mucit0aGlzPQouc2VyaWVzLm9wdGlv
bnMuc3RhdGVzLmhvdmVyLmhhbG8uc2l6ZSl9fSk7aC5idWJibGU9M0R1KGguc2NhdHRlcix7dHlw
ZToiYnU9CmJibGUiLHBvaW50Q2xhc3M6eixwb2ludEFycmF5TWFwOlsieSIsInoiXSxwYXJhbGxl
bEFycmF5czpbIngiLCJ5IiwieiJdLHRyYT0KY2tlckdyb3VwczpbImdyb3VwIiwiZGF0YUxhYmVs
c0dyb3VwIl0sYnViYmxlUGFkZGluZzohMCwKLXBvaW50QXR0clRvT3B0aW9uczp7c3Ryb2tlOiJs
aW5lQ29sb3IiLCJzdHJva2Utd2lkdGgiOiJsaW5lV2lkdGgiLGZpbGw6ImZpPQpsbENvbG9yIn0s
YXBwbHlPcGFjaXR5OmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5vcHRpb25zLm1hcmtlcixjPTNE
cShiLmZpbGw9Ck9wYWNpdHksMC41KSxhPTNEYXx8Yi5maWxsQ29sb3J8fHRoaXMuY29sb3I7YyE9
M0Q9M0QxJiYoYT0zRFUoYSkuc2V0T3BhY2l0eT0KKGMpLmdldCgicmdiYSIpKTtyZXR1cm4gYX0s
Y29udmVydEF0dHJpYnM6ZnVuY3Rpb24oKXt2YXIgYT0zRHQucHJvdG90eXBlLmNvPQpudmVydEF0
dHJpYnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EuZmlsbD0zRHRoaXMuYXBwbHlPcGFjaXR5KGEu
ZmlsbCk7cmV0dXI9Cm4gYX0sZ2V0UmFkaWk6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGs9
M0R0aGlzLnpEYXRhLGw9M0RbXSxuPTNEdGhpcy5vcD0KdGlvbnMuc2l6ZUJ5IT0zRD0zRCJ3aWR0
aCI7Zm9yKGY9M0QwLGU9M0RrLmxlbmd0aDtmPGU7ZisrKWc9M0RiLWEsZz0zRGc+MD8oPQprW2Zd
LWEpLyhiLQotYSk6MC41LG4mJmc+PTNEMCYmKGc9M0RNYXRoLnNxcnQoZykpLGwucHVzaCh2LmNl
aWwoYytnKihkLWMpKS8yKTt0aGlzLnJhZGk9Cmk9M0RsfSxhbmltYXRlOmZ1bmN0aW9uKGEpe3Zh
ciBiPTNEdGhpcy5vcHRpb25zLmFuaW1hdGlvbjtpZighYSlzKHRoaXMucG9pbj0KdHMsZnVuY3Rp
b24oYSl7dmFyIGQ9M0RhLmdyYXBoaWMsYT0zRGEuc2hhcGVBcmdzO2QmJmEmJihkLmF0dHIoInIi
LDEpLGQuYW5pPQptYXRlKHtyOmEucn0sYikpfSksdGhpcy5hbmltYXRlPTNEbnVsbH0sdHJhbnNs
YXRlOmZ1bmN0aW9uKCl7dmFyIGEsYj0zRHRoaXM9Ci5kYXRhLGMsZCxlPTNEdGhpcy5yYWRpaTto
LnNjYXR0ZXIucHJvdG90eXBlLnRyYW5zbGF0ZS5jYWxsKHRoaXMpO2ZvcihhPTNEYj0KLmxlbmd0
aDthLS07KWM9M0RiW2FdLGQ9M0RlP2VbYV06MCxjLm5lZ2F0aXZlPTNEYy56PCh0aGlzLm9wdGlv
bnMuelRocmVzaG9sPQpkfHwwKSxkPj0zRHRoaXMubWluUHhTaXplLzI/KGMuc2hhcGVUeXBlPTNE
ImNpcmNsZSIsYy5zaGFwZUFyZ3M9M0R7eDpjLnBsb3Q9ClgseTpjLnBsb3RZLAotcjpkfSxjLmRs
Qm94PTNEe3g6Yy5wbG90WC1kLHk6Yy5wbG90WS1kLHdpZHRoOjIqZCxoZWlnaHQ6MipkfSk6Yy5z
aGFwZUFyZ3M9Cj0zRGMucGxvdFk9M0RjLmRsQm94PTNEQ30sZHJhd0xlZ2VuZFN5bWJvbDpmdW5j
dGlvbihhLGIpe3ZhciBjPTNEeChhLml0ZW1TdD0KeWxlLmZvbnRTaXplKS8yO2IubGVnZW5kU3lt
Ym9sPTNEdGhpcy5jaGFydC5yZW5kZXJlci5jaXJjbGUoYyxhLmJhc2VsaW5lLWMsPQpjKS5hdHRy
KHt6SW5kZXg6M30pLmFkZChiLmxlZ2VuZEdyb3VwKTtiLmxlZ2VuZFN5bWJvbC5pc01hcmtlcj0z
RCEwfSxkcmF3UG89CmludHM6aC5jb2x1bW4ucHJvdG90eXBlLmRyYXdQb2ludHMsYWxpZ25EYXRh
TGFiZWw6aC5jb2x1bW4ucHJvdG90eXBlLmFsaWduRD0KYXRhTGFiZWx9KTtNLnByb3RvdHlwZS5i
ZWZvcmVQYWRkaW5nPTNEZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMsYj0zRHRoaXMubGVuPQosYz0z
RHRoaXMuY2hhcnQsZD0zRDAsZT0zRGIsZj0zRHRoaXMuaXNYQXhpcyxnPTNEZj8ieERhdGEiOiJ5
RGF0YSIsaz0zRHRoaXM9Ci5taW4sbD0zRHt9LAotbj0zRHYubWluKGMucGxvdFdpZHRoLGMucGxv
dEhlaWdodCksaj0zRE51bWJlci5NQVhfVkFMVUUsaT0zRC1OdW1iZXIuTUFYX1Y9CkFMVUUsaD0z
RHRoaXMubWF4LWssbT0zRGIvaCxwPTNEW107dGhpcy50aWNrUG9zaXRpb25zJiYocyh0aGlzLnNl
cmllcyxmdW5jdD0KaW9uKGIpe3ZhciBnPTNEYi5vcHRpb25zO2lmKGIuYnViYmxlUGFkZGluZyYm
KGIudmlzaWJsZXx8IWMub3B0aW9ucy5jaGFydC5pPQpnbm9yZUhpZGRlblNlcmllcykpaWYoYS5h
bGxvd1pvb21PdXRzaWRlPTNEITAscC5wdXNoKGIpLGYpcyhbIm1pblNpemUiLCJtYXg9ClNpemUi
XSxmdW5jdGlvbihhKXt2YXIgYj0zRGdbYV0sZj0zRC8lJC8udGVzdChiKSxiPTNEeChiKTtsW2Fd
PTNEZj9uKmIvMTAwOj0KYn0pLGIubWluUHhTaXplPTNEbC5taW5TaXplLGI9M0RiLnpEYXRhLGIu
bGVuZ3RoJiYoaj0zRHYubWluKGosdi5tYXgoTyhiKSxnPQouZGlzcGxheU5lZ2F0aXZlPTNEPTNE
PTNEITE/Zy56VGhyZXNob2xkOi1OdW1iZXIuTUFYX1ZBTFVFKSksaT0zRHYubWF4KGksUCg9CmIp
KSl9KSxzKHAsZnVuY3Rpb24oYSl7dmFyIGI9M0QKLWFbZ10sYz0zRGIubGVuZ3RoLG47ZiYmYS5n
ZXRSYWRpaShqLGksbC5taW5TaXplLGwubWF4U2l6ZSk7aWYoaD4wKWZvcig7Yy0tPQo7KXR5cGVv
ZiBiW2NdPTNEPTNEPTNEIm51bWJlciImJihuPTNEYS5yYWRpaVtjXSxkPTNETWF0aC5taW4oKGJb
Y10taykqbS1uLGQ9CiksZT0zRE1hdGgubWF4KChiW2NdLWspKm0rbixlKSl9KSxwLmxlbmd0aCYm
aD4wJiZxKHRoaXMub3B0aW9ucy5taW4sdGhpcy51cz0KZXJNaW4pPTNEPTNEPTNEQyYmcSh0aGlz
Lm9wdGlvbnMubWF4LHRoaXMudXNlck1heCk9M0Q9M0Q9M0RDJiYoZS09M0RiLG0qPTNEPQooYitk
LWUpL2IsdGhpcy5taW4rPTNEZC9tLHRoaXMubWF4Kz0zRGUvbSkpfTsoZnVuY3Rpb24oKXtmdW5j
dGlvbiBhKGEsYixjKXs9CmEuY2FsbCh0aGlzLGIsYyk7aWYodGhpcy5jaGFydC5wb2xhcil0aGlz
LmNsb3NlU2VnbWVudD0zRGZ1bmN0aW9uKGEpe3ZhciBiPQo9M0R0aGlzLnhBeGlzLmNlbnRlcjth
LnB1c2goIkwiLGJbMF0sYlsxXSl9LHRoaXMuY2xvc2VkU3RhY2tzPTNEITB9ZnVuY3Rpb249CiBi
KGEsYil7dmFyIGM9M0R0aGlzLmNoYXJ0LAotZD0zRHRoaXMub3B0aW9ucy5hbmltYXRpb24sZT0z
RHRoaXMuZ3JvdXAsaj0zRHRoaXMubWFya2VyR3JvdXAsaT0zRHRoaXMueEE9Cnhpcy5jZW50ZXIs
aD0zRGMucGxvdExlZnQsbT0zRGMucGxvdFRvcDtpZihjLnBvbGFyKXtpZihjLnJlbmRlcmVyLmlz
U1ZHKWQ9Cj0zRD0zRD0zRCEwJiYoZD0zRHt9KSxiPyhjPTNEe3RyYW5zbGF0ZVg6aVswXStoLHRy
YW5zbGF0ZVk6aVsxXSttLHNjYWxlWDowLj0KMDAxLHNjYWxlWTowLjAwMX0sZS5hdHRyKGMpLGom
JmouYXR0cihjKSk6KGM9M0R7dHJhbnNsYXRlWDpoLHRyYW5zbGF0ZVk6bSxzPQpjYWxlWDoxLHNj
YWxlWToxfSxlLmFuaW1hdGUoYyxkKSxqJiZqLmFuaW1hdGUoYyxkKSx0aGlzLmFuaW1hdGU9M0Ru
dWxsKX1lbHM9CmUgYS5jYWxsKHRoaXMsYil9dmFyIGM9M0R0LnByb3RvdHlwZSxkPTNEUi5wcm90
b3R5cGUsZTtjLnRvWFk9M0RmdW5jdGlvbihhKT0Ke3ZhciBiLGM9M0R0aGlzLmNoYXJ0LGQ9M0Rh
LnBsb3RYO2I9M0RhLnBsb3RZO2EucmVjdFBsb3RYPTNEZDthLnJlY3RQbG90WT0KPTNEYjtkPTNE
KGQvTWF0aC5QSSoxODArdGhpcy54QXhpcy5wYW5lLm9wdGlvbnMuc3RhcnRBbmdsZSklCi0zNjA7
ZDwwJiYoZCs9M0QzNjApO2EuY2xpZW50WD0zRGQ7Yj0zRHRoaXMueEF4aXMucG9zdFRyYW5zbGF0
ZShhLnBsb3RYLHRoaT0Kcy55QXhpcy5sZW4tYik7YS5wbG90WD0zRGEucG9sYXJQbG90WD0zRGIu
eC1jLnBsb3RMZWZ0O2EucGxvdFk9M0RhLnBvbGFyUGxvPQp0WT0zRGIueS1jLnBsb3RUb3B9O2Mu
b3JkZXJUb29sdGlwUG9pbnRzPTNEZnVuY3Rpb24oYSl7aWYodGhpcy5jaGFydC5wb2xhciY9CiYo
YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuY2xpZW50WC1iLmNsaWVudFh9KSxhWzBdKSlh
WzBdLndyYXBwZWRDbGllbj0KdFg9M0RhWzBdLmNsaWVudFgrMzYwLGEucHVzaChhWzBdKX07aC5h
cmVhJiZyKGguYXJlYS5wcm90b3R5cGUsImluaXQiLGEpO2guPQphcmVhc3BsaW5lJiZyKGguYXJl
YXNwbGluZS5wcm90b3R5cGUsImluaXQiLGEpO2guc3BsaW5lJiZyKGguc3BsaW5lLnByb3RvdHk9
CnBlLCJnZXRQb2ludFNwbGluZSIsZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsaixpLGgsbSxwLG87
aWYodGhpcy5jaGFydC5wb2xhcj0KKXtlPTNECi1jLnBsb3RYO2o9M0RjLnBsb3RZO2E9M0RiW2Qt
MV07aT0zRGJbZCsxXTt0aGlzLmNvbm5lY3RFbmRzJiYoYXx8KGE9M0RiW2IubD0KZW5ndGgtMl0p
LGl8fChpPTNEYlsxXSkpO2lmKGEmJmkpaD0zRGEucGxvdFgsbT0zRGEucGxvdFksYj0zRGkucGxv
dFgscD0zRGkuPQpwbG90WSxoPTNEKDEuNSplK2gpLzIuNSxtPTNEKDEuNSpqK20pLzIuNSxpPTNE
KDEuNSplK2IpLzIuNSxvPTNEKDEuNSpqK3ApLzI9Ci41LGI9M0RNYXRoLnNxcnQoTWF0aC5wb3co
aC1lLDIpK01hdGgucG93KG0taiwyKSkscD0zRE1hdGguc3FydChNYXRoLnBvdyhpLT0KZSwyKStN
YXRoLnBvdyhvLWosMikpLGg9M0RNYXRoLmF0YW4yKG0taixoLWUpLG09M0RNYXRoLmF0YW4yKG8t
aixpLWUpLG89M0RNPQphdGguUEkvMisoaCttKS8yLE1hdGguYWJzKGgtbyk+TWF0aC5QSS8yJiYo
by09M0RNYXRoLlBJKSxoPTNEZStNYXRoLmNvcyhvKSo9CmIsbT0zRGorTWF0aC5zaW4obykqYixp
PTNEZStNYXRoLmNvcyhNYXRoLlBJK28pKnAsbz0zRGorTWF0aC5zaW4oTWF0aC5QSStvKT0KKnAs
Yy5yaWdodENvbnRYPTNEaSxjLnJpZ2h0Q29udFk9M0QKLW87ZD8oYz0zRFsiQyIsYS5yaWdodENv
bnRYfHxhLnBsb3RYLGEucmlnaHRDb250WXx8YS5wbG90WSxofHxlLG18fGosZSxqXSxhPQoucmln
aHRDb250WD0zRGEucmlnaHRDb250WT0zRG51bGwpOmM9M0RbIk0iLGUsal19ZWxzZSBjPTNEYS5j
YWxsKHRoaXMsYixjLGQ9Cik7cmV0dXJuIGN9KTtyKGMsInRyYW5zbGF0ZSIsZnVuY3Rpb24oYSl7
YS5jYWxsKHRoaXMpO2lmKHRoaXMuY2hhcnQucG9sYXImJj0KIXRoaXMucHJldmVudFBvc3RUcmFu
c2xhdGUpZm9yKHZhciBhPTNEdGhpcy5wb2ludHMsYj0zRGEubGVuZ3RoO2ItLTspdGhpcy50PQpv
WFkoYVtiXSl9KTtyKGMsImdldFNlZ21lbnRQYXRoIixmdW5jdGlvbihhLGIpe3ZhciBjPTNEdGhp
cy5wb2ludHM7aWYodGhpcy49CmNoYXJ0LnBvbGFyJiZ0aGlzLm9wdGlvbnMuY29ubmVjdEVuZHMh
PTNEPTNEITEmJmJbYi5sZW5ndGgtMV09M0Q9M0Q9M0RjW2MubD0KZW5ndGgtMV0mJmNbMF0ueSE9
M0Q9M0RudWxsKXRoaXMuY29ubmVjdEVuZHM9M0QhMCxiPTNEW10uY29uY2F0KGIsW2NbMF1dKTty
PQpldHVybiBhLmNhbGwodGhpcywKLWIpfSk7cihjLCJhbmltYXRlIixiKTtyKGMsInNldFRvb2x0
aXBQb2ludHMiLGZ1bmN0aW9uKGEsYil7dGhpcy5jaGFydC5wb2xhPQpyJiZGKHRoaXMueEF4aXMs
e3Rvb2x0aXBMZW46MzYwfSk7cmV0dXJuIGEuY2FsbCh0aGlzLGIpfSk7aWYoaC5jb2x1bW4pZT0z
RGg9Ci5jb2x1bW4ucHJvdG90eXBlLHIoZSwiYW5pbWF0ZSIsYikscihlLCJ0cmFuc2xhdGUiLGZ1
bmN0aW9uKGEpe3ZhciBiPTNEdGhpcz0KLnhBeGlzLGM9M0R0aGlzLnlBeGlzLmxlbixkPTNEYi5j
ZW50ZXIsZT0zRGIuc3RhcnRBbmdsZVJhZCxoPTNEdGhpcy5jaGFydC5yPQplbmRlcmVyLGksbTt0
aGlzLnByZXZlbnRQb3N0VHJhbnNsYXRlPTNEITA7YS5jYWxsKHRoaXMpO2lmKGIuaXNSYWRpYWwp
e2I9M0Q9CnRoaXMucG9pbnRzO2ZvcihtPTNEYi5sZW5ndGg7bS0tOylpPTNEYlttXSxhPTNEaS5i
YXJYK2UsaS5zaGFwZVR5cGU9M0QicGF0aD0KIixpLnNoYXBlQXJncz0zRHtkOmguc3ltYm9scy5h
cmMoZFswXSxkWzFdLGMtaS5wbG90WSxudWxsLHtzdGFydDphLGVuZDphK2kuPQpwb2ludFdpZHRo
LAotaW5uZXJSOmMtcShpLnlCb3R0b20sYyl9KX0sdGhpcy50b1hZKGkpLGkudG9vbHRpcFBvcz0z
RFtpLnBsb3RYLGkucGxvdFldLGk9Ci50dEJlbG93PTNEaS5wbG90WT5kWzFdfX0pLHIoZSwiYWxp
Z25EYXRhTGFiZWwiLGZ1bmN0aW9uKGEsYixkLGUsaCxqKXtpZih0aD0KaXMuY2hhcnQucG9sYXIp
e2E9M0RiLnJlY3RQbG90WC9NYXRoLlBJKjE4MDtpZihlLmFsaWduPTNEPTNEPTNEbnVsbCllLmFs
aWduPQo9M0RhPjIwJiZhPDE2MD8ibGVmdCI6YT4yMDAmJmE8MzQwPyJyaWdodCI6ImNlbnRlciI7
aWYoZS52ZXJ0aWNhbEFsaWduPTNEPQo9M0Q9M0RudWxsKWUudmVydGljYWxBbGlnbj0zRGE8NDV8
fGE+MzE1PyJib3R0b20iOmE+MTM1JiZhPDIyNT8idG9wIjoibWlkZGw9CmUiO2MuYWxpZ25EYXRh
TGFiZWwuY2FsbCh0aGlzLGIsZCxlLGgsail9ZWxzZSBhLmNhbGwodGhpcyxiLGQsZSxoLGopfSk7
cihkLD0KImdldEluZGV4IixmdW5jdGlvbihhLGIpe3ZhciBjLGQ9M0R0aGlzLmNoYXJ0LGU7ZC5w
b2xhcj8oZT0zRGQueEF4aXNbMF0uY2VuPQp0ZXIsYz0zRAotYi5jaGFydFgtZVswXS1kLnBsb3RM
ZWZ0LGQ9M0RiLmNoYXJ0WS1lWzFdLWQucGxvdFRvcCxjPTNEMTgwLU1hdGgucm91bmQoTWE9CnRo
LmF0YW4yKGMsZCkvTWF0aC5QSSoxODApKTpjPTNEYS5jYWxsKHRoaXMsYik7cmV0dXJuIGN9KTty
KGQsImdldENvb3JkaW5hdD0KZXMiLGZ1bmN0aW9uKGEsYil7dmFyIGM9M0R0aGlzLmNoYXJ0LGQ9
M0R7eEF4aXM6W10seUF4aXM6W119O2MucG9sYXI/cyhjLmF4PQplcyxmdW5jdGlvbihhKXt2YXIg
ZT0zRGEuaXNYQXhpcyxmPTNEYS5jZW50ZXIsaD0zRGIuY2hhcnRYLWZbMF0tYy5wbG90TGVmdCw9
CmY9M0RiLmNoYXJ0WS1mWzFdLWMucGxvdFRvcDtkW2U/InhBeGlzIjoieUF4aXMiXS5wdXNoKHth
eGlzOmEsdmFsdWU6YS50cmFucz0KbGF0ZShlP01hdGguUEktTWF0aC5hdGFuMihoLGYpOk1hdGgu
c3FydChNYXRoLnBvdyhoLDIpK01hdGgucG93KGYsMikpLCEwKX0pPQp9KTpkPTNEYS5jYWxsKHRo
aXMsYik7cmV0dXJuIGR9KX0pKCl9KShIaWdoY2hhcnRzKTsKCmRpZmYgLXIgYmZjMTFhMTM3NDI3
YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4MDBmMDQ1ZT0K
N2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0
YXRpYy9wbHVnaW5zL2hpZ2hjPQpoYXJ0cy9oaWdoY2hhcnRzLmpzCi0tLSBhL2NvbmZpZy9wbHVn
aW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvcGx1Z2lucy9oaWdoY2hhcnRzL2hpZ2hj
aD0KYXJ0cy5qcworKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKgotIEhpZ2hjaGFy
dHMgSlMgdjQuMC4xICgyMDE0LTA0LTI0KQotCi0gKGMpIDIwMDktMjAxNCBUb3JzdGVpbiBIb25z
aQotCi0gTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2UKLSovCi0oZnVuY3Rpb24o
KXtmdW5jdGlvbiBxKGEsYil7dmFyIGM7YXx8KGE9M0R7fSk7Zm9yKGMgaW4gYilhW2NdPTNEYltj
XTtyZXR1cj0KbiBhfWZ1bmN0aW9uIHcoKXt2YXIgYSxiPTNEYXJndW1lbnRzLGMsZD0zRHt9LGU9
M0RmdW5jdGlvbihhLGIpe3ZhciBjLGQ7dHlwPQplb2YgYSE9M0Q9M0Qib2JqZWN0IiYmKGE9M0R7
fSk7Zm9yKGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiYoYz0zRGJbZF0sYVs9CmRdPTNEYyYm
dHlwZW9mIGM9M0Q9M0Q9M0Qib2JqZWN0IiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxs
KGMpIT0zRD0zRD0KIltvYmplY3QgQXJyYXldIiYmZCE9M0Q9M0QicmVuZGVyVG8iJiZ0eXBlb2Yg
Yy5ub2RlVHlwZSE9M0Q9M0QibnVtYmVyIj9lKGFbPQpkXXx8e30sYyk6YltkXSk7cmV0dXJuIGF9
O2JbMF09M0Q9M0Q9M0QhMCYmKGQ9M0RiWzFdLGI9M0RBcnJheS5wcm90b3R5cGUuc2w9CmljZS5j
YWxsKGIsMikpO2M9M0RiLmxlbmd0aDtmb3IoYT0zRDA7YTxjO2ErKylkPTNEZShkLGJbYV0pO3Jl
dHVybiBkfWZ1bmN0aT0Kb24geihhLGIpe3JldHVybiBwYXJzZUludChhLGJ8fAotMTApfWZ1bmN0
aW9uIEZhKGEpe3JldHVybiB0eXBlb2YgYT0zRD0zRD0zRCJzdHJpbmcifWZ1bmN0aW9uIGNhKGEp
e3JldHVybiA9CnR5cGVvZiBhPTNEPTNEPTNEIm9iamVjdCJ9ZnVuY3Rpb24gTGEoYSl7cmV0dXJu
IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYz0KYWxsKGEpPTNEPTNEPTNEIltvYmplY3QgQXJy
YXldIn1mdW5jdGlvbiBoYShhKXtyZXR1cm4gdHlwZW9mIGE9M0Q9M0Q9M0QibnVtPQpiZXIifWZ1
bmN0aW9uIHphKGEpe3JldHVybiBVLmxvZyhhKS9VLkxOMTB9ZnVuY3Rpb24gaWEoYSl7cmV0dXJu
IFUucG93KDEwLGE9Cil9ZnVuY3Rpb24gamEoYSxiKXtmb3IodmFyIGM9M0RhLmxlbmd0aDtjLS07
KWlmKGFbY109M0Q9M0Q9M0RiKXthLnNwbGljZShjLD0KMSk7YnJlYWt9fWZ1bmN0aW9uIHIoYSl7
cmV0dXJuIGEhPTNEPTNEdCYmYSE9M0Q9M0RudWxsfWZ1bmN0aW9uIEgoYSxiLGMpe3ZhPQpyIGQs
ZTtpZihGYShiKSlyKGMpP2Euc2V0QXR0cmlidXRlKGIsYyk6YSYmYS5nZXRBdHRyaWJ1dGUmJihl
PTNEYS5nZXRBdHRyaWI9CnV0ZShiKSk7ZWxzZSBpZihyKGIpJiYKLWNhKGIpKWZvcihkIGluIGIp
YS5zZXRBdHRyaWJ1dGUoZCxiW2RdKTtyZXR1cm4gZX1mdW5jdGlvbiBxYShhKXtyZXR1cm4gTGEo
PQphKT9hOlthXX1mdW5jdGlvbiBtKCl7dmFyIGE9M0Rhcmd1bWVudHMsYixjLGQ9M0RhLmxlbmd0
aDtmb3IoYj0zRDA7YjxkO2IrKyk9CmlmKGM9M0RhW2JdLHR5cGVvZiBjIT0zRD0zRCJ1bmRlZmlu
ZWQiJiZjIT0zRD0zRG51bGwpcmV0dXJuIGN9ZnVuY3Rpb24gRyhhLD0KYil7aWYoQWEmJiFhYSYm
YiYmYi5vcGFjaXR5IT0zRD0zRHQpYi5maWx0ZXI9M0QiYWxwaGEob3BhY2l0eT0zRCIrYi5vcGFj
aXR5PQoqMTAwKyIpIjtxKGEuc3R5bGUsYil9ZnVuY3Rpb24gWShhLGIsYyxkLGUpe2E9M0R5LmNy
ZWF0ZUVsZW1lbnQoYSk7YiYmcShhLGI9Cik7ZSYmRyhhLHtwYWRkaW5nOjAsYm9yZGVyOlEsbWFy
Z2luOjB9KTtjJiZHKGEsYyk7ZCYmZC5hcHBlbmRDaGlsZChhKTtyZXR1cj0KbiBhfWZ1bmN0aW9u
IGthKGEsYil7dmFyIGM9M0RmdW5jdGlvbigpe307Yy5wcm90b3R5cGU9M0RuZXcgYTtxKGMucHJv
dG90eXBlPQosYik7cmV0dXJuIGN9Ci1mdW5jdGlvbiBHYShhLGIsYyxkKXt2YXIgZT0zREUubGFu
ZyxhPTNEK2F8fDAsZj0zRGI9M0Q9M0Q9M0QtMT8oYS50b1N0cmluZz0KKCkuc3BsaXQoIi4iKVsx
XXx8IiIpLmxlbmd0aDppc05hTihiPTNETShiKSk/MjpiLGI9M0RjPTNEPTNEPTNEdm9pZCAwP2Uu
ZGVjPQppbWFsUG9pbnQ6YyxkPTNEZD0zRD0zRD0zRHZvaWQgMD9lLnRob3VzYW5kc1NlcDpkLGU9
M0RhPDA/Ii0iOiIiLGM9M0RTdHJpbmc9Cih6KGE9M0RNKGEpLnRvRml4ZWQoZikpKSxnPTNEYy5s
ZW5ndGg+Mz9jLmxlbmd0aCUzOjA7cmV0dXJuIGUrKGc/Yy5zdWJzdHIoMD0KLGcpK2Q6IiIpK2Mu
c3Vic3RyKGcpLnJlcGxhY2UoLyhcZHszfSkoPz0zRFxkKS9nLCIkMSIrZCkrKGY/YitNKGEtYyku
dG9GaXhlPQpkKGYpLnNsaWNlKDIpOiIiKX1mdW5jdGlvbiBIYShhLGIpe3JldHVybiBBcnJheSgo
Ynx8MikrMS1TdHJpbmcoYSkubGVuZ3RoKS49CmpvaW4oMCkrYX1mdW5jdGlvbiBNYShhLGIsYyl7
dmFyIGQ9M0RhW2JdO2FbYl09M0RmdW5jdGlvbigpe3ZhciBhPTNEQXJyYXkucD0Kcm90b3R5cGUu
c2xpY2UuY2FsbChhcmd1bWVudHMpOwotYS51bnNoaWZ0KGQpO3JldHVybiBjLmFwcGx5KHRoaXMs
YSl9fWZ1bmN0aW9uIElhKGEsYil7Zm9yKHZhciBjPTNEInsiLGQ9M0Q9CiExLGUsZixnLGgsaSxq
PTNEW107KGM9M0RhLmluZGV4T2YoYykpIT0zRD0zRC0xOyl7ZT0zRGEuc2xpY2UoMCxjKTtpZihk
KXtmPQo9M0RlLnNwbGl0KCI6Iik7Zz0zRGYuc2hpZnQoKS5zcGxpdCgiLiIpO2k9M0RnLmxlbmd0
aDtlPTNEYjtmb3IoaD0zRDA7aDxpO2g9CisrKWU9M0RlW2dbaF1dO2lmKGYubGVuZ3RoKWY9M0Rm
LmpvaW4oIjoiKSxnPTNEL1wuKFswLTldKS8saD0zREUubGFuZyxpPTNEdj0Kb2lkIDAsL2YkLy50
ZXN0KGYpPyhpPTNEKGk9M0RmLm1hdGNoKGcpKT9pWzFdOi0xLGUhPTNEPTNEbnVsbCYmKGU9M0RH
YShlLGksPQpoLmRlY2ltYWxQb2ludCxmLmluZGV4T2YoIiwiKT4tMT9oLnRob3VzYW5kc1NlcDoi
IikpKTplPTNEY2IoZixlKX1qLnB1c2goZSk9CjthPTNEYS5zbGljZShjKzEpO2M9M0QoZD0zRCFk
KT8ifSI6InsifWoucHVzaChhKTtyZXR1cm4gai5qb2luKCIiKX1mdW5jdGlvbj0KIG1iKGEpe3Jl
dHVybiBVLnBvdygxMCxUKFUubG9nKGEpLwotVS5MTjEwKSl9ZnVuY3Rpb24gbmIoYSxiLGMsZCl7
dmFyIGUsYz0zRG0oYywxKTtlPTNEYS9jO2J8fChiPTNEWzEsMiwyLjUsNSw9CjEwXSxkJiZkLmFs
bG93RGVjaW1hbHM9M0Q9M0Q9M0QhMSYmKGM9M0Q9M0Q9M0QxP2I9M0RbMSwyLDUsMTBdOmM8PTNE
MC4xJiYoYj0KPTNEWzEvY10pKSk7Zm9yKGQ9M0QwO2Q8Yi5sZW5ndGg7ZCsrKWlmKGE9M0RiW2Rd
LGU8PTNEKGJbZF0rKGJbZCsxXXx8YltkXSkpPQovMilicmVhazthKj0zRGM7cmV0dXJuIGF9ZnVu
Y3Rpb24gQmIoKXt0aGlzLnN5bWJvbD0zRHRoaXMuY29sb3I9M0QwfWZ1bmN0aW89Cm4gb2IoYSxi
KXt2YXIgYz0zRGEubGVuZ3RoLGQsZTtmb3IoZT0zRDA7ZTxjO2UrKylhW2VdLnNzX2k9M0RlO2Eu
c29ydChmdW5jdD0KaW9uKGEsYyl7ZD0zRGIoYSxjKTtyZXR1cm4gZD0zRD0zRD0zRDA/YS5zc19p
LWMuc3NfaTpkfSk7Zm9yKGU9M0QwO2U8YztlKyspPQpkZWxldGUgYVtlXS5zc19pfWZ1bmN0aW9u
IE5hKGEpe2Zvcih2YXIgYj0zRGEubGVuZ3RoLGM9M0RhWzBdO2ItLTspYVtiXTxjJiY9CihjPTNE
YVtiXSk7cmV0dXJuIGN9ZnVuY3Rpb24gQmEoYSl7Zm9yKHZhciBiPTNECi1hLmxlbmd0aCxjPTNE
YVswXTtiLS07KWFbYl0+YyYmKGM9M0RhW2JdKTtyZXR1cm4gY31mdW5jdGlvbiBPYShhLGIpe2Zv
cih2YT0KciBjIGluIGEpYVtjXSYmYVtjXSE9M0Q9M0RiJiZhW2NdLmRlc3Ryb3kmJmFbY10uZGVz
dHJveSgpLGRlbGV0ZSBhW2NdfWZ1bmN0PQppb24gUGEoYSl7ZGJ8fChkYj0zRFkoSmEpKTthJiZk
Yi5hcHBlbmRDaGlsZChhKTtkYi5pbm5lckhUTUw9M0QiIn1mdW5jdGlvbiA9CnJhKGEsYil7dmFy
IGM9M0QiSGlnaGNoYXJ0cyBlcnJvciAjIithKyI6IHd3dy5oaWdoY2hhcnRzLmNvbS9lcnJvcnMv
IithO2lmKD0KYil0aHJvdyBjO2Vsc2UgSS5jb25zb2xlJiZjb25zb2xlLmxvZyhjKX1mdW5jdGlv
biBkYShhKXtyZXR1cm4gcGFyc2VGbG9hdChhPQoudG9QcmVjaXNpb24oMTQpKX1mdW5jdGlvbiBR
YShhLGIpe3ZhPTNEbShhLGIuYW5pbWF0aW9uKX1mdW5jdGlvbiBDYigpe3ZhciA9CmE9M0RFLmds
b2JhbC51c2VVVEMsYj0zRGE/ImdldFVUQyI6ImdldCIsYz0zRGE/InNldFVUQyI6InNldCI7UmE9
M0QoYSYmRS5nbD0Kb2JhbC50aW1lem9uZU9mZnNldHx8Ci0wKSo2RTQ7ZWI9M0RhP0RhdGUuVVRD
OmZ1bmN0aW9uKGEsYixjLGcsaCxpKXtyZXR1cm4obmV3IERhdGUoYSxiLG0oYywxKSxtKD0KZyww
KSxtKGgsMCksbShpLDApKSkuZ2V0VGltZSgpfTtwYj0zRGIrIk1pbnV0ZXMiO3FiPTNEYisiSG91
cnMiO3JiPTNEYisiRGF5PQoiO1hhPTNEYisiRGF0ZSI7ZmI9M0RiKyJNb250aCI7Z2I9M0RiKyJG
dWxsWWVhciI7RGI9M0RjKyJNaW51dGVzIjtFYj0zRGMrIkg9Cm91cnMiO3NiPTNEYysiRGF0ZSI7
RmI9M0RjKyJNb250aCI7R2I9M0RjKyJGdWxsWWVhciJ9ZnVuY3Rpb24gUCgpe31mdW5jdGlvbj0K
IFNhKGEsYixjLGQpe3RoaXMuYXhpcz0zRGE7dGhpcy5wb3M9M0RiO3RoaXMudHlwZT0zRGN8fCIi
O3RoaXMuaXNOZXc9M0QhMDshPQpjJiYhZCYmdGhpcy5hZGRMYWJlbCgpfWZ1bmN0aW9uIGxhKCl7
dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGk9Cm9uIFlhKCl7dGhpcy5pbml0
LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBIYihhLGIsYyxkLGUpe3ZhciBmPTNEYS5j
aD0KYXJ0LmludmVydGVkOwotdGhpcy5heGlzPTNEYTt0aGlzLmlzTmVnYXRpdmU9M0RjO3RoaXMu
b3B0aW9ucz0zRGI7dGhpcy54PTNEZDt0aGlzLnRvdGFsPQo9M0RudWxsO3RoaXMucG9pbnRzPTNE
e307dGhpcy5zdGFjaz0zRGU7dGhpcy5hbGlnbk9wdGlvbnM9M0R7YWxpZ246Yi5hbGlnbnw9Cnwo
Zj9jPyJsZWZ0IjoicmlnaHQiOiJjZW50ZXIiKSx2ZXJ0aWNhbEFsaWduOmIudmVydGljYWxBbGln
bnx8KGY/Im1pZGRsZSI6Yz0KPyJib3R0b20iOiJ0b3AiKSx5Om0oYi55LGY/NDpjPzE0Oi02KSx4
Om0oYi54LGY/Yz8tNjo2OjApfTt0aGlzLnRleHRBbGlnbj0KPTNEYi50ZXh0QWxpZ258fChmP2M/
InJpZ2h0IjoibGVmdCI6ImNlbnRlciIpfXZhciB0LHk9M0Rkb2N1bWVudCxJPTNEd2luZG93PQos
VT0zRE1hdGgsdT0zRFUucm91bmQsVD0zRFUuZmxvb3IsS2E9M0RVLmNlaWwsdj0zRFUubWF4LEM9
M0RVLm1pbixNPTNEVS5hYnM9CixaPTNEVS5jb3MsZWE9M0RVLnNpbixtYT0zRFUuUEksQ2E9M0Rt
YSoyLzM2MCx3YT0zRG5hdmlnYXRvci51c2VyQWdlbnQsSWI9Cj0zREkub3BlcmEsQWE9M0QvbXNp
ZS9pLnRlc3Qod2EpJiYKLSFJYixoYj0zRHkuZG9jdW1lbnRNb2RlPTNEPTNEPTNEOCxpYj0zRC9B
cHBsZVdlYktpdC8udGVzdCh3YSksVGE9M0QvRmlyZWZvPQp4Ly50ZXN0KHdhKSxKYj0zRC8oTW9i
aWxlfEFuZHJvaWR8V2luZG93cyBQaG9uZSkvLnRlc3Qod2EpLHhhPTNEImh0dHA6Ly93d3c9Ci53
My5vcmcvMjAwMC9zdmciLGFhPTNEISF5LmNyZWF0ZUVsZW1lbnROUyYmISF5LmNyZWF0ZUVsZW1l
bnROUyh4YSwic3ZnIikuYz0KcmVhdGVTVkdSZWN0LE5iPTNEVGEmJnBhcnNlSW50KHdhLnNwbGl0
KCJGaXJlZm94LyIpWzFdLDEwKTw0LGZhPTNEIWFhJiYhQWEmPQomISF5LmNyZWF0ZUVsZW1lbnQo
ImNhbnZhcyIpLmdldENvbnRleHQsWmEsJGEsS2I9M0R7fSx0Yj0zRDAsZGIsRSxjYix2YSx1Yiw9
CkEsc2E9M0RmdW5jdGlvbigpe30sVj0zRFtdLGFiPTNEMCxKYT0zRCJkaXYiLFE9M0Qibm9uZSIs
T2I9M0QvXlswLTldKyQvLFBiPQo9M0Qic3Ryb2tlLXdpZHRoIixlYixSYSxwYixxYixyYixYYSxm
YixnYixEYixFYixzYixGYixHYixGPTNEe30sUj0zREkuSGlnaGM9CmhhcnRzPTNESS5IaWdoY2hh
cnRzP3JhKDE2LAotITApOnt9O2NiPTNEZnVuY3Rpb24oYSxiLGMpe2lmKCFyKGIpfHxpc05hTihi
KSlyZXR1cm4iSW52YWxpZCBkYXRlIjt2YXIgYT0KPTNEbShhLCIlWS0lbS0lZCAlSDolTTolUyIp
LGQ9M0RuZXcgRGF0ZShiLVJhKSxlLGY9M0RkW3FiXSgpLGc9M0RkW3JiXSgpLGg9Cj0zRGRbWGFd
KCksaT0zRGRbZmJdKCksaj0zRGRbZ2JdKCksaz0zREUubGFuZyxsPTNEay53ZWVrZGF5cyxkPTNE
cSh7YTpsW2ddLj0Kc3Vic3RyKDAsMyksQTpsW2ddLGQ6SGEoaCksZTpoLGI6ay5zaG9ydE1vbnRo
c1tpXSxCOmsubW9udGhzW2ldLG06SGEoaSsxKSx5PQo6ai50b1N0cmluZygpLnN1YnN0cigyLDIp
LFk6aixIOkhhKGYpLEk6SGEoZiUxMnx8MTIpLGw6ZiUxMnx8MTIsTTpIYShkW3BiXSg9CikpLHA6
ZjwxMj8iQU0iOiJQTSIsUDpmPDEyPyJhbSI6InBtIixTOkhhKGQuZ2V0U2Vjb25kcygpKSxMOkhh
KHUoYiUxRTMpLDMpfT0KLFIuZGF0ZUZvcm1hdHMpO2ZvcihlIGluIGQpZm9yKDthLmluZGV4T2Yo
IiUiK2UpIT0zRD0zRC0xOylhPTNEYS5yZXBsYWNlKCIlPQoiK2UsdHlwZW9mIGRbZV09M0Q9M0Q9
M0QKLSJmdW5jdGlvbiI/ZFtlXShiKTpkW2VdKTtyZXR1cm4gYz9hLnN1YnN0cigwLDEpLnRvVXBw
ZXJDYXNlKCkrYS5zdWJzdHIoMSk6PQphfTtCYi5wcm90b3R5cGU9M0R7d3JhcENvbG9yOmZ1bmN0
aW9uKGEpe2lmKHRoaXMuY29sb3I+PTNEYSl0aGlzLmNvbG9yPTNEMH09Cix3cmFwU3ltYm9sOmZ1
bmN0aW9uKGEpe2lmKHRoaXMuc3ltYm9sPj0zRGEpdGhpcy5zeW1ib2w9M0QwfX07QT0zRGZ1bmN0
aW9uKD0KKXtmb3IodmFyIGE9M0QwLGI9M0Rhcmd1bWVudHMsYz0zRGIubGVuZ3RoLGQ9M0R7fTth
PGM7YSsrKWRbYlthKytdXT0zRGJbYV07PQpyZXR1cm4gZH0oIm1pbGxpc2Vjb25kIiwxLCJzZWNv
bmQiLDFFMywibWludXRlIiw2RTQsImhvdXIiLDM2RTUsImRheSIsODY0RTU9Ciwid2VlayIsNjA0
OEU1LCJtb250aCIsMjY3ODRFNSwieWVhciIsMzE1NTY5NTJFMyk7dWI9M0R7aW5pdDpmdW5jdGlv
bihhLGIsYz0KKXt2YXIgYj0zRGJ8fCIiLGQ9M0RhLnNoaWZ0LGU9M0RiLmluZGV4T2YoIkMiKT4t
MSxmPTNEZT83OjMsZyxiPTNEYi5zcGxpdCgiPQogIiksYz0zRFtdLmNvbmNhdChjKSwKLWgsaSxq
PTNEZnVuY3Rpb24oYSl7Zm9yKGc9M0RhLmxlbmd0aDtnLS07KWFbZ109M0Q9M0Q9M0QiTSImJmEu
c3BsaWNlKGcrMSwwPQosYVtnKzFdLGFbZysyXSxhW2crMV0sYVtnKzJdKX07ZSYmKGooYiksaihj
KSk7YS5pc0FyZWEmJihoPTNEYi5zcGxpY2UoYi5sZW49Cmd0aC02LDYpLGk9M0RjLnNwbGljZShj
Lmxlbmd0aC02LDYpKTtpZihkPD0zRGMubGVuZ3RoL2YmJmIubGVuZ3RoPTNEPTNEPTNEYz0KLmxl
bmd0aClmb3IoO2QtLTspYz0zRFtdLmNvbmNhdChjKS5zcGxpY2UoMCxmKS5jb25jYXQoYyk7YS5z
aGlmdD0zRDA7aWYoYi5sPQplbmd0aClmb3IoYT0zRGMubGVuZ3RoO2IubGVuZ3RoPGE7KWQ9M0Rb
XS5jb25jYXQoYikuc3BsaWNlKGIubGVuZ3RoLWYsZiksZSY9CiYoZFtmLTZdPTNEZFtmLTJdLGRb
Zi01XT0zRGRbZi0xXSksYj0zRGIuY29uY2F0KGQpO2gmJihiPTNEYi5jb25jYXQoaCksYz0zRD0K
Yy5jb25jYXQoaSkpO3JldHVybltiLGNdfSxzdGVwOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPTNE
W10sZj0zRGEubGVuZ3RoO2lmPQooYz0zRD0zRD0zRDEpZT0zRGQ7ZWxzZSBpZihmPTNEPTNEPTNE
Ci1iLmxlbmd0aCYmYzwxKWZvcig7Zi0tOylkPTNEcGFyc2VGbG9hdChhW2ZdKSxlW2ZdPTNEaXNO
YU4oZCk/YVtmXTpjKnBhcnNlRj0KbG9hdChiW2ZdLWQpK2Q7ZWxzZSBlPTNEYjtyZXR1cm4gZX19
OyhmdW5jdGlvbihhKXtJLkhpZ2hjaGFydHNBZGFwdGVyPTNESS5IPQppZ2hjaGFydHNBZGFwdGVy
fHxhJiZ7aW5pdDpmdW5jdGlvbihiKXt2YXIgYz0zRGEuZngsZD0zRGMuc3RlcCxlLGY9M0RhLlR3
ZWU9Cm4sZz0zRGYmJmYucHJvcEhvb2tzO2U9M0RhLmNzc0hvb2tzLm9wYWNpdHk7YS5leHRlbmQo
YS5lYXNpbmcse2Vhc2VPdXRRdWFkOj0KZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4tZCooYi89
M0RlKSooYi0yKStjfX0pO2EuZWFjaChbImN1ciIsIl9kZWZhdWx0IiwiPQp3aWR0aCIsImhlaWdo
dCIsIm9wYWNpdHkiXSxmdW5jdGlvbihhLGIpe3ZhciBlPTNEZCxrO2I9M0Q9M0Q9M0QiY3VyIj9l
PTNEYy49CnByb3RvdHlwZTpiPTNEPTNEPTNEIl9kZWZhdWx0IiYmZiYmKGU9M0RnW2JdLGI9M0Qi
c2V0Iik7KGs9M0RlW2JdKSYmKGVbYl09Cj0zRGZ1bmN0aW9uKGMpe3ZhciBkLGM9M0QKLWE/Yzp0
aGlzO2lmKGMucHJvcCE9M0Q9M0QiYWxpZ24iKXJldHVybiBkPTNEYy5lbGVtLGQuYXR0cj9kLmF0
dHIoYy5wcm9wLGI9Cj0zRD0zRD0zRCJjdXIiP3Q6Yy5ub3cpOmsuYXBwbHkodGhpcyxhcmd1bWVu
dHMpfSl9KTtNYShlLCJnZXQiLGZ1bmN0aW9uKGEsYj0KLGMpe3JldHVybiBiLmF0dHI/Yi5vcGFj
aXR5fHwwOmEuY2FsbCh0aGlzLGIsYyl9KTtlPTNEZnVuY3Rpb24oYSl7dmFyIGM9M0RhPQouZWxl
bSxkO2lmKCFhLnN0YXJ0ZWQpZD0zRGIuaW5pdChjLGMuZCxjLnRvRCksYS5zdGFydD0zRGRbMF0s
YS5lbmQ9M0RkWzFdLGE9Ci5zdGFydGVkPTNEITA7Yy5hdHRyKCJkIixiLnN0ZXAoYS5zdGFydCxh
LmVuZCxhLnBvcyxjLnRvRCkpfTtmP2cuZD0zRHtzZXQ6ZT0KfTpkLmQ9M0RlO3RoaXMuZWFjaD0z
REFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cmV0dXJuIEFycmF5LnByPQpv
dG90eXBlLmZvckVhY2guY2FsbChhLGIpfTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0zRDAsZD0z
RGEubGVuZ3RoO2M8ZDtjKys9CilpZihiLmNhbGwoYVtjXSwKLWFbY10sYyxhKT0zRD0zRD0zRCEx
KXJldHVybiBjfTthLmZuLmhpZ2hjaGFydHM9M0RmdW5jdGlvbigpe3ZhciBhPTNEIkNoYXJ0PQoi
LGI9M0Rhcmd1bWVudHMsYyxkO2lmKHRoaXNbMF0pe0ZhKGJbMF0pJiYoYT0zRGJbMF0sYj0zREFy
cmF5LnByb3RvdHlwZS5zbGk9CmNlLmNhbGwoYiwxKSk7Yz0zRGJbMF07aWYoYyE9M0Q9M0R0KWMu
Y2hhcnQ9M0RjLmNoYXJ0fHx7fSxjLmNoYXJ0LnJlbmRlclRvPQo9M0R0aGlzWzBdLG5ldyBSW2Fd
KGMsYlsxXSksZD0zRHRoaXM7Yz0zRD0zRD0zRHQmJihkPTNEVltIKHRoaXNbMF0sImRhdGEtaGk9
CmdoY2hhcnRzLWNoYXJ0IildKX1yZXR1cm4gZH19LGdldFNjcmlwdDphLmdldFNjcmlwdCxpbkFy
cmF5OmEuaW5BcnJheSxhZGFwdD0KZXJSdW46ZnVuY3Rpb24oYixjKXtyZXR1cm4gYShiKVtjXSgp
fSxncmVwOmEuZ3JlcCxtYXA6ZnVuY3Rpb24oYSxjKXtmb3IodmFyPQogZD0zRFtdLGU9M0QwLGY9
M0RhLmxlbmd0aDtlPGY7ZSsrKWRbZV09M0RjLmNhbGwoYVtlXSxhW2VdLGUsYSk7cmV0dXJuIGR9
LG89CmZmc2V0OmZ1bmN0aW9uKGIpe3JldHVybiBhKGIpLm9mZnNldCgpfSwKLWFkZEV2ZW50OmZ1
bmN0aW9uKGIsYyxkKXthKGIpLmJpbmQoYyxkKX0scmVtb3ZlRXZlbnQ6ZnVuY3Rpb24oYixjLGQp
e3ZhciBlPQo9M0R5LnJlbW92ZUV2ZW50TGlzdGVuZXI/InJlbW92ZUV2ZW50TGlzdGVuZXIiOiJk
ZXRhY2hFdmVudCI7eVtlXSYmYiYmIWJbZV09CiYmKGJbZV09M0RmdW5jdGlvbigpe30pO2EoYiku
dW5iaW5kKGMsZCl9LGZpcmVFdmVudDpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZj0KPTNEYS5FdmVu
dChjKSxnPTNEImRldGFjaGVkIitjLGg7IUFhJiZkJiYoZGVsZXRlIGQubGF5ZXJYLGRlbGV0ZSBk
LmxheWVyWSxkPQplbGV0ZSBkLnJldHVyblZhbHVlKTtxKGYsZCk7YltjXSYmKGJbZ109M0RiW2Nd
LGJbY109M0RudWxsKTthLmVhY2goWyJwcmV2ZW49CnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9u
Il0sZnVuY3Rpb24oYSxiKXt2YXIgYz0zRGZbYl07ZltiXT0zRGZ1bmN0aW9uKCl7dD0Kcnl7Yy5j
YWxsKGYpfWNhdGNoKGEpe2I9M0Q9M0Q9M0QicHJldmVudERlZmF1bHQiJiYoaD0zRCEwKX19fSk7
YShiKS50cmlnZ2VyPQooZik7Ci1iW2ddJiYoYltjXT0zRGJbZ10sYltnXT0zRG51bGwpO2UmJiFm
LmlzRGVmYXVsdFByZXZlbnRlZCgpJiYhaCYmZShmKX0sd2FzaD0KTW91c2VFdmVudDpmdW5jdGlv
bihhKXt2YXIgYz0zRGEub3JpZ2luYWxFdmVudHx8YTtpZihjLnBhZ2VYPTNEPTNEPTNEdCljLnBh
PQpnZVg9M0RhLnBhZ2VYLGMucGFnZVk9M0RhLnBhZ2VZO3JldHVybiBjfSxhbmltYXRlOmZ1bmN0
aW9uKGIsYyxkKXt2YXIgZT0zRGE9CihiKTtpZighYi5zdHlsZSliLnN0eWxlPTNEe307aWYoYy5k
KWIudG9EPTNEYy5kLGMuZD0zRDE7ZS5zdG9wKCk7Yy5vcGFjaXR5IT0KPTNEPTNEdCYmYi5hdHRy
JiYoYy5vcGFjaXR5Kz0zRCJweCIpO2UuYW5pbWF0ZShjLGQpfSxzdG9wOmZ1bmN0aW9uKGIpe2Eo
YikuPQpzdG9wKCl9fX0pKEkualF1ZXJ5KTt2YXIgUz0zREkuSGlnaGNoYXJ0c0FkYXB0ZXIsTj0z
RFN8fHt9O1MmJlMuaW5pdC5jYWxsKFM9Cix1Yik7dmFyIGpiPTNETi5hZGFwdGVyUnVuLFFiPTNE
Ti5nZXRTY3JpcHQsRGE9M0ROLmluQXJyYXkscD0zRE4uZWFjaCx2Yj0zRD0KTi5ncmVwLFJiPTNE
Ti5vZmZzZXQsVWE9M0QKLU4ubWFwLEs9M0ROLmFkZEV2ZW50LFc9M0ROLnJlbW92ZUV2ZW50LEQ9
M0ROLmZpcmVFdmVudCxTYj0zRE4ud2FzaE1vdXNlRXZlPQpudCxrYj0zRE4uYW5pbWF0ZSxiYj0z
RE4uc3RvcCxOPTNEe2VuYWJsZWQ6ITAseDowLHk6MTUsc3R5bGU6e2NvbG9yOiIjNjA2MDY9CjAi
LGN1cnNvcjoiZGVmYXVsdCIsZm9udFNpemU6IjExcHgifX07RT0zRHtjb2xvcnM6IiM3Y2I1ZWMs
IzQzNDM0OCwjOTBlZDdkLD0KI2Y3YTM1YywjODA4NWU5LCNmMTVjODAsI2U0ZDM1NCwjODA4NWU4
LCM4ZDQ2NTMsIzkxZThlMSIuc3BsaXQoIiwiKSxzeW1ib2xzPQo6WyJjaXJjbGUiLCJkaWFtb25k
Iiwic3F1YXJlIiwidHJpYW5nbGUiLCJ0cmlhbmdsZS1kb3duIl0sbGFuZzp7bG9hZGluZzoiTG89
CmFkaW5nLi4uIixtb250aHM6IkphbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUs
SnVseSxBdWd1c3QsU2VwdGVtYj0KZXIsT2N0b2JlcixOb3ZlbWJlcixEZWNlbWJlciIuc3BsaXQo
IiwiKSxzaG9ydE1vbnRoczoiSmFuLEZlYixNYXIsQXByLE1heSxKPQp1bixKdWwsQXVnLFNlcCxP
Y3QsTm92LERlYyIuc3BsaXQoIiwiKSwKLXdlZWtkYXlzOiJTdW5kYXksTW9uZGF5LFR1ZXNkYXks
V2VkbmVzZGF5LFRodXJzZGF5LEZyaWRheSxTYXR1cmRheSIuc3BsaXQoPQoiLCIpLGRlY2ltYWxQ
b2ludDoiLiIsbnVtZXJpY1N5bWJvbHM6ImssTSxHLFQsUCxFIi5zcGxpdCgiLCIpLHJlc2V0Wm9v
bToiUmU9CnNldCB6b29tIixyZXNldFpvb21UaXRsZToiUmVzZXQgem9vbSBsZXZlbCAxOjEiLHRo
b3VzYW5kc1NlcDoiLCJ9LGdsb2JhbDp7dT0Kc2VVVEM6ITAsY2FudmFzVG9vbHNVUkw6Imh0dHA6
Ly9jb2RlLmhpZ2hjaGFydHMuY29tLzQuMC4xL21vZHVsZXMvY2FudmFzLXRvPQpvbHMuanMiLFZN
TFJhZGlhbEdyYWRpZW50VVJMOiJodHRwOi8vY29kZS5oaWdoY2hhcnRzLmNvbS80LjAuMS9nZngv
dm1sLXJhZGk9CmFsLWdyYWRpZW50LnBuZyJ9LGNoYXJ0Ontib3JkZXJDb2xvcjoiIzQ1NzJBNyIs
Ym9yZGVyUmFkaXVzOjAsZGVmYXVsdFNlcmllcz0KVHlwZToibGluZSIsaWdub3JlSGlkZGVuU2Vy
aWVzOiEwLHNwYWNpbmc6WzEwLDEwLDE1LAotMTBdLGJhY2tncm91bmRDb2xvcjoiI0ZGRkZGRiIs
cGxvdEJvcmRlckNvbG9yOiIjQzBDMEMwIixyZXNldFpvb21CdXR0b246e3Q9CmhlbWU6e3pJbmRl
eDoyMH0scG9zaXRpb246e2FsaWduOiJyaWdodCIseDotMTAseToxMH19fSx0aXRsZTp7dGV4dDoi
Q2hhcnQgdD0KaXRsZSIsYWxpZ246ImNlbnRlciIsbWFyZ2luOjE1LHN0eWxlOntjb2xvcjoiIzMz
MzMzMyIsZm9udFNpemU6IjE4cHgifX0sc3ViPQp0aXRsZTp7dGV4dDoiIixhbGlnbjoiY2VudGVy
IixzdHlsZTp7Y29sb3I6IiM1NTU1NTUifX0scGxvdE9wdGlvbnM6e2xpbmU6e2E9Cmxsb3dQb2lu
dFNlbGVjdDohMSxzaG93Q2hlY2tib3g6ITEsYW5pbWF0aW9uOntkdXJhdGlvbjoxRTN9LGV2ZW50
czp7fSxsaW5lVz0KaWR0aDoyLG1hcmtlcjp7bGluZVdpZHRoOjAscmFkaXVzOjQsbGluZUNvbG9y
OiIjRkZGRkZGIixzdGF0ZXM6e2hvdmVyOntlbmFiPQpsZWQ6ITB9LHNlbGVjdDp7ZmlsbENvbG9y
OiIjRkZGRkZGIixsaW5lQ29sb3I6IiMwMDAwMDAiLAotbGluZVdpZHRoOjJ9fX0scG9pbnQ6e2V2
ZW50czp7fX0sZGF0YUxhYmVsczp3KE4se2FsaWduOiJjZW50ZXIiLGVuYWJsZWQ6ITE9Cixmb3Jt
YXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55PTNEPTNEPTNEbnVsbD8iIjpHYSh0aGlzLnks
LTEpfSx2ZXJ0aWNhbD0KQWxpZ246ImJvdHRvbSIseTowfSksY3JvcFRocmVzaG9sZDozMDAscG9p
bnRSYW5nZTowLHN0YXRlczp7aG92ZXI6e21hcmtlcjp7PQp9LGhhbG86e3NpemU6MTAsb3BhY2l0
eTowLjI1fX0sc2VsZWN0OnttYXJrZXI6e319fSxzdGlja3lUcmFja2luZzohMCx0dXJib1Q9Cmhy
ZXNob2xkOjFFM319LGxhYmVsczp7c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsY29sb3I6IiMz
RTU3NkYifX0sbGVnZW5kOj0Ke2VuYWJsZWQ6ITAsYWxpZ246ImNlbnRlciIsbGF5b3V0OiJob3Jp
em9udGFsIixsYWJlbEZvcm1hdHRlcjpmdW5jdGlvbigpe3JlPQp0dXJuIHRoaXMubmFtZX0sYm9y
ZGVyQ29sb3I6IiM5MDkwOTAiLGJvcmRlclJhZGl1czowLG5hdmlnYXRpb246e2FjdGl2ZUNvbG89
CnI6IiMyNzRiNmQiLAotaW5hY3RpdmVDb2xvcjoiI0NDQyJ9LHNoYWRvdzohMSxpdGVtU3R5bGU6
e2NvbG9yOiIjMzMzMzMzIixmb250U2l6ZToiMTJweCI9Cixmb250V2VpZ2h0OiJib2xkIn0saXRl
bUhvdmVyU3R5bGU6e2NvbG9yOiIjMDAwIn0saXRlbUhpZGRlblN0eWxlOntjb2xvcjoiIz0KQ0ND
In0saXRlbUNoZWNrYm94U3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6IjEzcHgiLGhl
aWdodDoiMTNweCJ9LHN5PQptYm9sUGFkZGluZzo1LHZlcnRpY2FsQWxpZ246ImJvdHRvbSIseDow
LHk6MCx0aXRsZTp7c3R5bGU6e2ZvbnRXZWlnaHQ6ImJvbGQ9CiJ9fX0sbG9hZGluZzp7bGFiZWxT
dHlsZTp7Zm9udFdlaWdodDoiYm9sZCIscG9zaXRpb246InJlbGF0aXZlIix0b3A6IjFlbSJ9LD0K
c3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsYmFja2dyb3VuZENvbG9yOiJ3aGl0ZSIsb3BhY2l0
eTowLjUsdGV4dEFsaWduOiJjPQplbnRlciJ9fSx0b29sdGlwOntlbmFibGVkOiEwLGFuaW1hdGlv
bjphYSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMjQ5LCAyNDksIDI9CjQ5LCAuODUpIiwKLWJvcmRl
cldpZHRoOjEsYm9yZGVyUmFkaXVzOjMsZGF0ZVRpbWVMYWJlbEZvcm1hdHM6e21pbGxpc2Vjb25k
OiIlQSwgJWIgJWUsPQogJUg6JU06JVMuJUwiLHNlY29uZDoiJUEsICViICVlLCAlSDolTTolUyIs
bWludXRlOiIlQSwgJWIgJWUsICVIOiVNIixob3VyOiI9CiVBLCAlYiAlZSwgJUg6JU0iLGRheToi
JUEsICViICVlLCAlWSIsd2VlazoiV2VlayBmcm9tICVBLCAlYiAlZSwgJVkiLG1vbnRoOj0KIiVC
ICVZIix5ZWFyOiIlWSJ9LGhlYWRlckZvcm1hdDonPHNwYW4gc3R5bGU9M0QiZm9udC1zaXplOiAx
MHB4Ij57cG9pbnQua2V5PQp9PC9zcGFuPjxici8+Jyxwb2ludEZvcm1hdDonPHNwYW4gc3R5bGU9
M0QiY29sb3I6e3Nlcmllcy5jb2xvcn0iPj1DMz1BMj1FMj0KPTgwPTk0PUMyPThGPC9zcGFuPiB7
c2VyaWVzLm5hbWV9OiA8Yj57cG9pbnQueX08L2I+PGJyLz4nLHNoYWRvdzohMCxzbmFwOkpiPQo/
MjU6MTAsc3R5bGU6e2NvbG9yOiIjMzMzMzMzIixjdXJzb3I6ImRlZmF1bHQiLGZvbnRTaXplOiIx
MnB4IixwYWRkaW5nOiI4cHg9CiIsCi13aGl0ZVNwYWNlOiJub3dyYXAifX0sY3JlZGl0czp7ZW5h
YmxlZDohMCx0ZXh0OiJIaWdoY2hhcnRzLmNvbSIsaHJlZjoiaHR0cD0KOi8vd3d3LmhpZ2hjaGFy
dHMuY29tIixwb3NpdGlvbjp7YWxpZ246InJpZ2h0Iix4Oi0xMCx2ZXJ0aWNhbEFsaWduOiJib3R0
b20iPQoseTotNX0sc3R5bGU6e2N1cnNvcjoicG9pbnRlciIsY29sb3I6IiM5MDkwOTAiLGZvbnRT
aXplOiI5cHgifX19O3ZhciBiYT0zREU9Ci5wbG90T3B0aW9ucyxTPTNEYmEubGluZTtDYigpO3Zh
ciBUYj0zRC9yZ2JhXChccyooWzAtOV17MSwzfSlccyosXHMqKFswLTldez0KMSwzfSlccyosXHMq
KFswLTldezEsM30pXHMqLFxzKihbMC05XT8oPzpcLlswLTldKyk/KVxzKlwpLyxVYj0zRC8jKFth
LWZBLUYwPQotOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkvLFZiPTNEL3Jn
YlwoXHMqKFswLTldezEsM30pXHMqLFxzKig9ClswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9
KVxzKlwpLyx5YT0zRGZ1bmN0aW9uKGEpe3ZhciBiPTNEW10sYywKLWQ7KGZ1bmN0aW9uKGEpe2Em
JmEuc3RvcHM/ZD0zRFVhKGEuc3RvcHMsZnVuY3Rpb24oYSl7cmV0dXJuIHlhKGFbMV0pfSk6KGM9
Cj0zRFRiLmV4ZWMoYSkpP2I9M0RbeihjWzFdKSx6KGNbMl0pLHooY1szXSkscGFyc2VGbG9hdChj
WzRdLDEwKV06KGM9M0RVYi5leD0KZWMoYSkpP2I9M0RbeihjWzFdLDE2KSx6KGNbMl0sMTYpLHoo
Y1szXSwxNiksMV06KGM9M0RWYi5leGVjKGEpKSYmKGI9M0RbeihjPQpbMV0pLHooY1syXSkseihj
WzNdKSwxXSl9KShhKTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBmO2Q/KGY9M0R3KGEpLGYu
c3Q9Cm9wcz0zRFtdLmNvbmNhdChmLnN0b3BzKSxwKGQsZnVuY3Rpb24oYSxiKXtmLnN0b3BzW2Jd
PTNEW2Yuc3RvcHNbYl1bMF0sYS5nZT0KdChjKV19KSk6Zj0zRGImJiFpc05hTihiWzBdKT9jPTNE
PTNEPTNEInJnYiI/InJnYigiK2JbMF0rIiwiK2JbMV0rIiwiK2JbMl0rPQoiKSI6Yz0zRD0zRD0z
RCJhIj9iWzNdOiJyZ2JhKCIrYi5qb2luKCIsIikrIikiOmE7cmV0dXJuIGZ9LGJyaWdodGVuOmZ1
bmN0aW89Cm4oYSl7aWYoZClwKGQsCi1mdW5jdGlvbihiKXtiLmJyaWdodGVuKGEpfSk7ZWxzZSBp
ZihoYShhKSYmYSE9M0Q9M0QwKXt2YXIgYztmb3IoYz0zRDA7YzwzOz0KYysrKWJbY10rPTNEeihh
KjI1NSksYltjXTwwJiYoYltjXT0zRDApLGJbY10+MjU1JiYoYltjXT0zRDI1NSl9cmV0dXJuIHRo
aXN9PQoscmdiYTpiLHNldE9wYWNpdHk6ZnVuY3Rpb24oYSl7YlszXT0zRGE7cmV0dXJuIHRoaXN9
fX07UC5wcm90b3R5cGU9M0R7aW5pdDo9CmZ1bmN0aW9uKGEsYil7dGhpcy5lbGVtZW50PTNEYj0z
RD0zRD0zRCJzcGFuIj9ZKGIpOnkuY3JlYXRlRWxlbWVudE5TKHhhLGIpOz0KdGhpcy5yZW5kZXJl
cj0zRGF9LG9wYWNpdHk6MSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjKXtiPTNEbShiLHZhLCEwKTti
Yih0aGlzPQopO2lmKGIpe2I9M0R3KGIse30pO2lmKGMpYi5jb21wbGV0ZT0zRGM7a2IodGhpcyxh
LGIpfWVsc2UgdGhpcy5hdHRyKGEpLGMmJmM9CigpfSxjb2xvckdyYWRpZW50OmZ1bmN0aW9uKGEs
YixjKXt2YXIgZD0zRHRoaXMucmVuZGVyZXIsZSxmLGcsaCxpLGosayxsLG8sbj0KLHM9M0RbXTth
LmxpbmVhckdyYWRpZW50PwotZj0zRCJsaW5lYXJHcmFkaWVudCI6YS5yYWRpYWxHcmFkaWVudCYm
KGY9M0QicmFkaWFsR3JhZGllbnQiKTtpZihmKXtnPTNEYVs9CmZdO2g9M0RkLmdyYWRpZW50cztq
PTNEYS5zdG9wcztvPTNEYy5yYWRpYWxSZWZlcmVuY2U7TGEoZykmJihhW2ZdPTNEZz0zRHt4MT0K
OmdbMF0seTE6Z1sxXSx4MjpnWzJdLHkyOmdbM10sZ3JhZGllbnRVbml0czoidXNlclNwYWNlT25V
c2UifSk7Zj0zRD0zRD0zRCJyPQphZGlhbEdyYWRpZW50IiYmbyYmIXIoZy5ncmFkaWVudFVuaXRz
KSYmKGc9M0R3KGcse2N4Om9bMF0tb1syXS8yK2cuY3gqb1syXSw9CmN5Om9bMV0tb1syXS8yK2cu
Y3kqb1syXSxyOmcucipvWzJdLGdyYWRpZW50VW5pdHM6InVzZXJTcGFjZU9uVXNlIn0pKTtmb3Io
bj0KIGluIGcpbiE9M0Q9M0QiaWQiJiZzLnB1c2gobixnW25dKTtmb3IobiBpbiBqKXMucHVzaChq
W25dKTtzPTNEcy5qb2luKCIsIik7PQpoW3NdP2E9M0RoW3NdLmF0dHIoImlkIik6KGcuaWQ9M0Rh
PTNEImhpZ2hjaGFydHMtIit0YisrLGhbc109M0RpPTNEZC5jcmVhdGU9CkVsZW1lbnQoZikuYXR0
cihnKS5hZGQoZC5kZWZzKSwKLWkuc3RvcHM9M0RbXSxwKGosZnVuY3Rpb24oYSl7YVsxXS5pbmRl
eE9mKCJyZ2JhIik9M0Q9M0Q9M0QwPyhlPTNEeWEoYVsxXSksPQprPTNEZS5nZXQoInJnYiIpLGw9
M0RlLmdldCgiYSIpKTooaz0zRGFbMV0sbD0zRDEpO2E9M0RkLmNyZWF0ZUVsZW1lbnQoInN0b3A9
CiIpLmF0dHIoe29mZnNldDphWzBdLCJzdG9wLWNvbG9yIjprLCJzdG9wLW9wYWNpdHkiOmx9KS5h
ZGQoaSk7aS5zdG9wcy5wdXNoKD0KYSl9KSk7Yy5zZXRBdHRyaWJ1dGUoYiwidXJsKCIrZC51cmwr
IiMiK2ErIikiKX19LGF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPQosZT0zRHRoaXMuZWxlbWVu
dCxmLGc9M0R0aGlzLGg7dHlwZW9mIGE9M0Q9M0Q9M0Qic3RyaW5nIiYmYiE9M0Q9M0R0JiYoYz0z
RGE9CixhPTNEe30sYVtjXT0zRGIpO2lmKHR5cGVvZiBhPTNEPTNEPTNEInN0cmluZyIpZz0zRCh0
aGlzW2ErIkdldHRlciJdfHx0aGlzLj0KX2RlZmF1bHRHZXR0ZXIpLmNhbGwodGhpcyxhLGUpO2Vs
c2V7Zm9yKGMgaW4gYSl7ZD0zRGFbY107aD0zRCExO3RoaXMuc3ltYm9sPQpOYW1lJiYvXih4fHl8
d2lkdGh8aGVpZ2h0fHJ8c3RhcnR8ZW5kfGlubmVyUnxhbmNob3JYfGFuY2hvclkpLy50ZXN0KGMp
JiYKLShmfHwodGhpcy5zeW1ib2xBdHRyKGEpLGY9M0QhMCksaD0zRCEwKTtpZih0aGlzLnJvdGF0
aW9uJiYoYz0zRD0zRD0zRCJ4Inx8PQpjPTNEPTNEPTNEInkiKSl0aGlzLmRvVHJhbnNmb3JtPTNE
ITA7aHx8KHRoaXNbYysiU2V0dGVyIl18fHRoaXMuX2RlZmF1bHRTZXQ9CnRlcikuY2FsbCh0aGlz
LGQsYyxlKTt0aGlzLnNoYWRvd3MmJi9eKHdpZHRofGhlaWdodHx2aXNpYmlsaXR5fHh8eXxkfHRy
YW5zZj0Kb3JtfGN4fGN5fHIpJC8udGVzdChjKSYmdGhpcy51cGRhdGVTaGFkb3dzKGMsZCl9aWYo
dGhpcy5kb1RyYW5zZm9ybSl0aGlzLnVwPQpkYXRlVHJhbnNmb3JtKCksdGhpcy5kb1RyYW5zZm9y
bT0zRCExfXJldHVybiBnfSx1cGRhdGVTaGFkb3dzOmZ1bmN0aW9uKGEsYik9Cntmb3IodmFyIGM9
M0R0aGlzLnNoYWRvd3MsZD0zRGMubGVuZ3RoO2QtLTspY1tkXS5zZXRBdHRyaWJ1dGUoYSxhPTNE
PTNEPTNEIj0KaGVpZ2h0Ij92KGItKGNbZF0uY3V0SGVpZ2h0fHwwKSwwKTphPTNEPTNEPTNEImQi
P3RoaXMuZDpiKX0sYWRkQ2xhc3M6ZnVuY3RpPQpvbihhKXt2YXIgYj0zRHRoaXMuZWxlbWVudCwK
LWM9M0RIKGIsImNsYXNzIil8fCIiO2MuaW5kZXhPZihhKT0zRD0zRD0zRC0xJiZIKGIsImNsYXNz
IixjKyIgIithKTtyZXR1cm4gPQp0aGlzfSxzeW1ib2xBdHRyOmZ1bmN0aW9uKGEpe3ZhciBiPTNE
dGhpcztwKCJ4LHkscixzdGFydCxlbmQsd2lkdGgsaGVpZ2h0LGk9Cm5uZXJSLGFuY2hvclgsYW5j
aG9yWSIuc3BsaXQoIiwiKSxmdW5jdGlvbihjKXtiW2NdPTNEbShhW2NdLGJbY10pfSk7Yi5hdHRy
KD0Ke2Q6Yi5yZW5kZXJlci5zeW1ib2xzW2Iuc3ltYm9sTmFtZV0oYi54LGIueSxiLndpZHRoLGIu
aGVpZ2h0LGIpfSl9LGNsaXA6ZnVuPQpjdGlvbihhKXtyZXR1cm4gdGhpcy5hdHRyKCJjbGlwLXBh
dGgiLGE/InVybCgiK3RoaXMucmVuZGVyZXIudXJsKyIjIithLmlkKyI9CikiOlEpfSxjcmlzcDpm
dW5jdGlvbihhKXt2YXIgYixjPTNEe30sZCxlPTNEYS5zdHJva2VXaWR0aHx8dGhpcy5zdHJva2VX
aWR0aD0KfHx0aGlzLmF0dHImJnRoaXMuYXR0cigic3Ryb2tlLXdpZHRoIil8fDA7ZD0zRHUoZSkl
Mi8yO2EueD0zRFQoYS54fHx0aGlzLnh8fAotMCkrZDthLnk9M0RUKGEueXx8dGhpcy55fHwwKStk
O2Eud2lkdGg9M0RUKChhLndpZHRofHx0aGlzLndpZHRofHwwKS0yKmQpO2E9Ci5oZWlnaHQ9M0RU
KChhLmhlaWdodHx8dGhpcy5oZWlnaHR8fDApLTIqZCk7YS5zdHJva2VXaWR0aD0zRGU7Zm9yKGIg
aW4gYSl0aD0KaXNbYl0hPTNEPTNEYVtiXSYmKHRoaXNbYl09M0RjW2JdPTNEYVtiXSk7cmV0dXJu
IGN9LGNzczpmdW5jdGlvbihhKXt2YXIgYj0KPTNEdGhpcy5zdHlsZXMsYz0zRHt9LGQ9M0R0aGlz
LmVsZW1lbnQsZSxmLGc9M0QiIjtlPTNEIWI7aWYoYSYmYS5jb2xvcilhLmZpPQpsbD0zRGEuY29s
b3I7aWYoYilmb3IoZiBpbiBhKWFbZl0hPTNEPTNEYltmXSYmKGNbZl09M0RhW2ZdLGU9M0QhMCk7
aWYoZSl7ZT0KPTNEdGhpcy50ZXh0V2lkdGg9M0RhJiZhLndpZHRoJiZkLm5vZGVOYW1lLnRvTG93
ZXJDYXNlKCk9M0Q9M0Q9M0QidGV4dCImJnooPQphLndpZHRoKTtiJiYoYT0zRHEoYixjKSk7dGhp
cy5zdHlsZXM9M0RhO2UmJihmYXx8IWFhJiZ0aGlzLnJlbmRlcmVyLmZvckV4cG89CnJ0KSYmZGVs
ZXRlIGEud2lkdGg7aWYoQWEmJiFhYSlHKHRoaXMuZWxlbWVudCwKLWEpO2Vsc2V7Yj0zRGZ1bmN0
aW9uKGEsYil7cmV0dXJuIi0iK2IudG9Mb3dlckNhc2UoKX07Zm9yKGYgaW4gYSlnKz0zRGYucmVw
PQpsYWNlKC8oW0EtWl0pL2csYikrIjoiK2FbZl0rIjsiO0goZCwic3R5bGUiLGcpfWUmJnRoaXMu
YWRkZWQmJnRoaXMucmVuZGVyZXI9Ci5idWlsZFRleHQodGhpcyl9cmV0dXJuIHRoaXN9LG9uOmZ1
bmN0aW9uKGEsYil7dmFyIGM9M0R0aGlzLGQ9M0RjLmVsZW1lbnQ7JD0KYSYmYT0zRD0zRD0zRCJj
bGljayI/KGQub250b3VjaHN0YXJ0PTNEZnVuY3Rpb24oYSl7Yy50b3VjaEV2ZW50RmlyZWQ9M0RE
YXRlPQoubm93KCk7YS5wcmV2ZW50RGVmYXVsdCgpO2IuY2FsbChkLGEpfSxkLm9uY2xpY2s9M0Rm
dW5jdGlvbihhKXsod2EuaW5kZXhPZig9CiJBbmRyb2lkIik9M0Q9M0Q9M0QtMXx8RGF0ZS5ub3co
KS0oYy50b3VjaEV2ZW50RmlyZWR8fDApPjExMDApJiZiLmNhbGwoZCxhKT0KfSk6ZFsib24iK2Fd
PTNEYjtyZXR1cm4gdGhpc30sc2V0UmFkaWFsUmVmZXJlbmNlOmZ1bmN0aW9uKGEpe3RoaXMuZWxl
bWVudC5yPQphZGlhbFJlZmVyZW5jZT0zRAotYTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0
aW9uKGEsYil7cmV0dXJuIHRoaXMuYXR0cih7dHJhbnNsYXRlWDphLHRyYW49CnNsYXRlWTpifSl9
LGludmVydDpmdW5jdGlvbigpe3RoaXMuaW52ZXJ0ZWQ9M0QhMDt0aGlzLnVwZGF0ZVRyYW5zZm9y
bSgpO3JldD0KdXJuIHRoaXN9LHVwZGF0ZVRyYW5zZm9ybTpmdW5jdGlvbigpe3ZhciBhPTNEdGhp
cy50cmFuc2xhdGVYfHwwLGI9M0R0aGlzLnRyPQphbnNsYXRlWXx8MCxjPTNEdGhpcy5zY2FsZVgs
ZD0zRHRoaXMuc2NhbGVZLGU9M0R0aGlzLmludmVydGVkLGY9M0R0aGlzLnJvdGE9CnRpb24sZz0z
RHRoaXMuZWxlbWVudDtlJiYoYSs9M0R0aGlzLmF0dHIoIndpZHRoIiksYis9M0R0aGlzLmF0dHIo
ImhlaWdodCIpKT0KO2E9M0RbInRyYW5zbGF0ZSgiK2ErIiwiK2IrIikiXTtlP2EucHVzaCgicm90
YXRlKDkwKSBzY2FsZSgtMSwxKSIpOmYmJmEucHVzPQpoKCJyb3RhdGUoIitmKyIgIisoZy5nZXRB
dHRyaWJ1dGUoIngiKXx8MCkrIiAiKyhnLmdldEF0dHJpYnV0ZSgieSIpfHwwKSsiKSI9Cik7Ci0o
cihjKXx8cihkKSkmJmEucHVzaCgic2NhbGUoIittKGMsMSkrIiAiK20oZCwxKSsiKSIpO2EubGVu
Z3RoJiZnLnNldEF0dHJpYj0KdXRlKCJ0cmFuc2Zvcm0iLGEuam9pbigiICIpKX0sdG9Gcm9udDpm
dW5jdGlvbigpe3ZhciBhPTNEdGhpcy5lbGVtZW50O2EucGFyPQplbnROb2RlLmFwcGVuZENoaWxk
KGEpO3JldHVybiB0aGlzfSxhbGlnbjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD0zRHs9
Cn07ZT0zRHRoaXMucmVuZGVyZXI7Zj0zRGUuYWxpZ25lZE9iamVjdHM7aWYoYSl7aWYodGhpcy5h
bGlnbk9wdGlvbnM9M0RhLHRoaT0Kcy5hbGlnbkJ5VHJhbnNsYXRlPTNEYiwhY3x8RmEoYykpdGhp
cy5hbGlnblRvPTNEZD0zRGN8fCJyZW5kZXJlciIsamEoZix0aGlzPQopLGYucHVzaCh0aGlzKSxj
PTNEbnVsbH1lbHNlIGE9M0R0aGlzLmFsaWduT3B0aW9ucyxiPTNEdGhpcy5hbGlnbkJ5VHJhbnNs
YXQ9CmUsZD0zRHRoaXMuYWxpZ25UbztjPTNEbShjLGVbZF0sZSk7ZD0zRGEuYWxpZ247ZT0zRGEu
dmVydGljYWxBbGlnbjtmPTNEKGMueD0KfHwwKSsoYS54fHwKLTApO2c9M0QoYy55fHwwKSsoYS55
fHwwKTtpZihkPTNEPTNEPTNEInJpZ2h0Inx8ZD0zRD0zRD0zRCJjZW50ZXIiKWYrPTNEKGMuPQp3
aWR0aC0oYS53aWR0aHx8MCkpL3tyaWdodDoxLGNlbnRlcjoyfVtkXTtoW2I/InRyYW5zbGF0ZVgi
OiJ4Il09M0R1KGYpO2lmKGU9Cj0zRD0zRD0zRCJib3R0b20ifHxlPTNEPTNEPTNEIm1pZGRsZSIp
Zys9M0QoYy5oZWlnaHQtKGEuaGVpZ2h0fHwwKSkvKHtib3R0bz0KbToxLG1pZGRsZToyfVtlXXx8
MSk7aFtiPyJ0cmFuc2xhdGVZIjoieSJdPTNEdShnKTt0aGlzW3RoaXMucGxhY2VkPyJhbmltYXRl
PQoiOiJhdHRyIl0oaCk7dGhpcy5wbGFjZWQ9M0QhMDt0aGlzLmFsaWduQXR0cj0zRGg7cmV0dXJu
IHRoaXN9LGdldEJCb3g6ZnVuY3Q9Cmlvbigpe3ZhciBhPTNEdGhpcy5iQm94LGI9M0R0aGlzLnJl
bmRlcmVyLGMsZCxlPTNEdGhpcy5yb3RhdGlvbjtjPTNEdGhpcy5lbD0KZW1lbnQ7dmFyIGY9M0R0
aGlzLnN0eWxlcyxnPTNEZSpDYTtkPTNEdGhpcy50ZXh0U3RyO3ZhciBoO2lmKGQ9M0Q9M0Q9M0Qi
Inx8PQpPYi50ZXN0KGQpKWg9M0QibnVtLiIrZC50b1N0cmluZygpLmxlbmd0aCsKLShmPyJ8Iitm
LmZvbnRTaXplKyJ8IitmLmZvbnRGYW1pbHk6IiIpO2gmJihhPTNEYi5jYWNoZVtoXSk7aWYoIWEp
e2lmKGMubmFtPQplc3BhY2VVUkk9M0Q9M0Q9M0R4YXx8Yi5mb3JFeHBvcnQpe3RyeXthPTNEYy5n
ZXRCQm94P3Eoe30sYy5nZXRCQm94KCkpOnt3aWQ9CnRoOmMub2Zmc2V0V2lkdGgsaGVpZ2h0OmMu
b2Zmc2V0SGVpZ2h0fX1jYXRjaChpKXt9aWYoIWF8fGEud2lkdGg8MClhPTNEe3dpZD0KdGg6MCxo
ZWlnaHQ6MH19ZWxzZSBhPTNEdGhpcy5odG1sR2V0QkJveCgpO2lmKGIuaXNTVkcpe2M9M0RhLndp
ZHRoO2Q9M0RhLmhlPQppZ2h0O2lmKEFhJiZmJiZmLmZvbnRTaXplPTNEPTNEPTNEIjExcHgiJiZk
LnRvUHJlY2lzaW9uKDMpPTNEPTNEPTNEIjE2LjkiKWE9Ci5oZWlnaHQ9M0RkPTNEMTQ7aWYoZSlh
LndpZHRoPTNETShkKmVhKGcpKStNKGMqWihnKSksYS5oZWlnaHQ9M0RNKGQqWihnKSkrTT0KKGMq
ZWEoZykpfXRoaXMuYkJveD0zRGE7aCYmKGIuY2FjaGVbaF09M0RhKX1yZXR1cm4gYX0sc2hvdzpm
dW5jdGlvbihhKXtyZXR1PQpybiBhJiZ0aGlzLmVsZW1lbnQubmFtZXNwYWNlVVJJPTNEPTNEPTNE
Ci14YT8odGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgidmlzaWJpbGl0eSIpLHRoaXMpOnRo
aXMuYXR0cih7dmlzaWJpbGl0eT0KOmE/ImluaGVyaXQiOiJ2aXNpYmxlIn0pfSxoaWRlOmZ1bmN0
aW9uKCl7cmV0dXJuIHRoaXMuYXR0cih7dmlzaWJpbGl0eToiaGlkPQpkZW4ifSl9LGZhZGVPdXQ6
ZnVuY3Rpb24oYSl7dmFyIGI9M0R0aGlzO2IuYW5pbWF0ZSh7b3BhY2l0eTowfSx7ZHVyYXRpb246
YXw9CnwxNTAsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmhpZGUoKX19KX0sYWRkOmZ1bmN0aW9uKGEp
e3ZhciBiPTNEdGhpcy5yZW5kZXJlcj0KLGM9M0RhfHxiLGQ9M0RjLmVsZW1lbnR8fGIuYm94LGU9
M0R0aGlzLmVsZW1lbnQsZj0zRHRoaXMuekluZGV4LGcsaDtpZihhKXRoPQppcy5wYXJlbnRHcm91
cD0zRGE7dGhpcy5wYXJlbnRJbnZlcnRlZD0zRGEmJmEuaW52ZXJ0ZWQ7dGhpcy50ZXh0U3RyIT0z
RD0zRHY9Cm9pZCAwJiZiLmJ1aWxkVGV4dCh0aGlzKTtpZihmKWMuaGFuZGxlWj0zRCEwLGY9M0R6
KGYpO2lmKGMuaGFuZGxlWil7YT0zRGQuYz0KaGlsZE5vZGVzOwotZm9yKGc9M0QwO2c8YS5sZW5n
dGg7ZysrKWlmKGI9M0RhW2ddLGM9M0RIKGIsInpJbmRleCIpLGIhPTNEPTNEZSYmKHooYyk+Znw9
CnwhcihmKSYmcihjKSkpe2QuaW5zZXJ0QmVmb3JlKGUsYik7aD0zRCEwO2JyZWFrfX1ofHxkLmFw
cGVuZENoaWxkKGUpO3RoaXMuYT0KZGRlZD0zRCEwO2lmKHRoaXMub25BZGQpdGhpcy5vbkFkZCgp
O3JldHVybiB0aGlzfSxzYWZlUmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oPQphKXt2YXIgYj0zRGEucGFy
ZW50Tm9kZTtiJiZiLnJlbW92ZUNoaWxkKGEpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9M0R0
aGk9CnMsYj0zRGEuZWxlbWVudHx8e30sYz0zRGEuc2hhZG93cyxkPTNEYS5yZW5kZXJlci5pc1NW
RyYmYi5ub2RlTmFtZT0zRD0zRD0zRD0KIlNQQU4iJiZhLnBhcmVudEdyb3VwLGUsZjtiLm9uY2xp
Y2s9M0RiLm9ubW91c2VvdXQ9M0RiLm9ubW91c2VvdmVyPTNEYi5vbm1vPQp1c2Vtb3ZlPTNEYi5w
b2ludD0zRG51bGw7YmIoYSk7aWYoYS5jbGlwUGF0aClhLmNsaXBQYXRoPTNEYS5jbGlwUGF0aC5k
ZXN0cm89CnkoKTtpZihhLnN0b3BzKXtmb3IoZj0zRAotMDtmPGEuc3RvcHMubGVuZ3RoO2YrKylh
LnN0b3BzW2ZdPTNEYS5zdG9wc1tmXS5kZXN0cm95KCk7YS5zdG9wcz0zRG51bGx9YS49CnNhZmVS
ZW1vdmVDaGlsZChiKTtmb3IoYyYmcChjLGZ1bmN0aW9uKGIpe2Euc2FmZVJlbW92ZUNoaWxkKGIp
fSk7ZCYmZC5kaXYuYz0KaGlsZE5vZGVzLmxlbmd0aD0zRD0zRD0zRDA7KWI9M0RkLnBhcmVudEdy
b3VwLGEuc2FmZVJlbW92ZUNoaWxkKGQuZGl2KSxkZWxlPQp0ZSBkLmRpdixkPTNEYjthLmFsaWdu
VG8mJmphKGEucmVuZGVyZXIuYWxpZ25lZE9iamVjdHMsYSk7Zm9yKGUgaW4gYSlkZWxldGU9CiBh
W2VdO3JldHVybiBudWxsfSxzaGFkb3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTNEW10sZSxmLGc9
M0R0aGlzLmVsZW1lbnQsaD0KLGksaixrO2lmKGEpe2k9M0RtKGEud2lkdGgsMyk7aj0zRChhLm9w
YWNpdHl8fDAuMTUpL2k7az0zRHRoaXMucGFyZW50SW52ZXJ0PQplZD8iKC0xLC0xKSI6IigiK20o
YS5vZmZzZXRYLDEpKyIsICIrbShhLm9mZnNldFksMSkrIikiO2ZvcihlPTNEMTtlPD0zRGk7ZSs9
Cispe2Y9M0QKLWcuY2xvbmVOb2RlKDApO2g9M0RpKjIrMS0yKmU7SChmLHtpc1NoYWRvdzoidHJ1
ZSIsc3Ryb2tlOmEuY29sb3J8fCJibGFjayIsPQoic3Ryb2tlLW9wYWNpdHkiOmoqZSwic3Ryb2tl
LXdpZHRoIjpoLHRyYW5zZm9ybToidHJhbnNsYXRlIitrLGZpbGw6UX0pO2lmKGM9CilIKGYsImhl
aWdodCIsdihIKGYsImhlaWdodCIpLWgsMCkpLGYuY3V0SGVpZ2h0PTNEaDtiP2IuZWxlbWVudC5h
cHBlbmRDaGlsZD0KKGYpOmcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZixnKTtkLnB1c2goZil9
dGhpcy5zaGFkb3dzPTNEZH1yZXR1cm4gdGhpc30sPQp4R2V0dGVyOmZ1bmN0aW9uKGEpe3RoaXMu
ZWxlbWVudC5ub2RlTmFtZT0zRD0zRD0zRCJjaXJjbGUiJiYoYT0zRHt4OiJjeCIseTo9CiJjeSJ9
W2FdfHxhKTtyZXR1cm4gdGhpcy5fZGVmYXVsdEdldHRlcihhKX0sX2RlZmF1bHRHZXR0ZXI6ZnVu
Y3Rpb24oYSl7YT0zRD0KbSh0aGlzW2FdLHRoaXMuZWxlbWVudD90aGlzLmVsZW1lbnQuZ2V0QXR0
cmlidXRlKGEpOm51bGwsMCk7L15bMC05XC5dKyQvLnRlPQpzdChhKSYmCi0oYT0zRHBhcnNlRmxv
YXQoYSkpO3JldHVybiBhfSxkU2V0dGVyOmZ1bmN0aW9uKGEsYixjKXthJiZhLmpvaW4mJihhPTNE
YS5qbz0KaW4oIiAiKSk7LyhOYU58IHsyfXxeJCkvLnRlc3QoYSkmJihhPTNEIk0gMCAwIik7Yy5z
ZXRBdHRyaWJ1dGUoYixhKTt0aGlzW2JdPQo9M0RhfSxkYXNoc3R5bGVTZXR0ZXI6ZnVuY3Rpb24o
YSl7dmFyIGI7aWYoYT0zRGEmJmEudG9Mb3dlckNhc2UoKSl7YT0zRGEucmU9CnBsYWNlKCJzaG9y
dGRhc2hkb3Rkb3QiLCIzLDEsMSwxLDEsMSwiKS5yZXBsYWNlKCJzaG9ydGRhc2hkb3QiLCIzLDEs
MSwxIikucj0KZXBsYWNlKCJzaG9ydGRvdCIsIjEsMSwiKS5yZXBsYWNlKCJzaG9ydGRhc2giLCIz
LDEsIikucmVwbGFjZSgibG9uZ2Rhc2giLCI4PQosMywiKS5yZXBsYWNlKC9kb3QvZywiMSwzLCIp
LnJlcGxhY2UoImRhc2giLCI0LDMsIikucmVwbGFjZSgvLCQvLCIiKS5zcGxpdCg9CiIsIik7Zm9y
KGI9M0RhLmxlbmd0aDtiLS07KWFbYl09M0R6KGFbYl0pKnRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1
dGUoInN0cm9rZT0KLXdpZHRoIik7Ci1hPTNEYS5qb2luKCIsIik7dGhpcy5lbGVtZW50LnNldEF0
dHJpYnV0ZSgic3Ryb2tlLWRhc2hhcnJheSIsYSl9fSxhbGlnblNldD0KdGVyOmZ1bmN0aW9uKGEp
e3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIix7bGVmdDoic3RhcnQiLGNl
bnRlPQpyOiJtaWRkbGUiLHJpZ2h0OiJlbmQifVthXSl9LG9wYWNpdHlTZXR0ZXI6ZnVuY3Rpb24o
YSxiLGMpe3RoaXNbYl09M0RhO2Muc2U9CnRBdHRyaWJ1dGUoYixhKX0sInN0cm9rZS13aWR0aFNl
dHRlciI6ZnVuY3Rpb24oYSxiLGMpe2E9M0Q9M0Q9M0QwJiYoYT0zRDEuMD0KRS01KTt0aGlzLnN0
cm9rZVdpZHRoPTNEYTtjLnNldEF0dHJpYnV0ZShiLGEpfSx0aXRsZVNldHRlcjpmdW5jdGlvbihh
KXt2YXIgPQpiPTNEdGhpcy5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aXRsZSIpWzBd
O2J8fChiPTNEeS5jcmVhdGVFbGVtZW50TlM9Cih4YSwidGl0bGUiKSx0aGlzLmVsZW1lbnQuYXBw
ZW5kQ2hpbGQoYikpO2IudGV4dENvbnRlbnQ9M0RhfSx0ZXh0U2V0dGVyOmZ1bj0KY3Rpb24oYSl7
aWYoYSE9M0Q9M0QKLXRoaXMudGV4dFN0cilkZWxldGUgdGhpcy5iQm94LHRoaXMudGV4dFN0cj0z
RGEsdGhpcy5hZGRlZCYmdGhpcy5yZW5kZXJlci5iPQp1aWxkVGV4dCh0aGlzKX0sZmlsbFNldHRl
cjpmdW5jdGlvbihhLGIsYyl7dHlwZW9mIGE9M0Q9M0Q9M0Qic3RyaW5nIj9jLnNldEE9CnR0cmli
dXRlKGIsYSk6YSYmdGhpcy5jb2xvckdyYWRpZW50KGEsYixjKX0sekluZGV4U2V0dGVyOmZ1bmN0
aW9uKGEsYixjKXtjLj0Kc2V0QXR0cmlidXRlKGIsYSk7dGhpc1tiXT0zRGF9LF9kZWZhdWx0U2V0
dGVyOmZ1bmN0aW9uKGEsYixjKXtjLnNldEF0dHJpYnV0PQplKGIsYSl9fTtQLnByb3RvdHlwZS55
R2V0dGVyPTNEUC5wcm90b3R5cGUueEdldHRlcjtQLnByb3RvdHlwZS50cmFuc2xhdGVYU2U9CnR0
ZXI9M0RQLnByb3RvdHlwZS50cmFuc2xhdGVZU2V0dGVyPTNEUC5wcm90b3R5cGUucm90YXRpb25T
ZXR0ZXI9M0RQLnByb3RvdD0KeXBlLnZlcnRpY2FsQWxpZ25TZXR0ZXI9M0RQLnByb3RvdHlwZS5z
Y2FsZVhTZXR0ZXI9M0RQLnByb3RvdHlwZS5zY2FsZVlTZXR0PQplcj0zRAotZnVuY3Rpb24oYSxi
KXt0aGlzW2JdPTNEYTt0aGlzLmRvVHJhbnNmb3JtPTNEITB9O1AucHJvdG90eXBlLnN0cm9rZVNl
dHRlcj0KPTNEUC5wcm90b3R5cGUuZmlsbFNldHRlcjt2YXIgdGE9M0RmdW5jdGlvbigpe3RoaXMu
aW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50PQpzKX07dGEucHJvdG90eXBlPTNEe0VsZW1lbnQ6UCxp
bml0OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9M0Rsb2NhdGlvbixnLGQ9Cj0zRHRoaXMuY3Jl
YXRlRWxlbWVudCgic3ZnIikuYXR0cih7dmVyc2lvbjoiMS4xIn0pLmNzcyh0aGlzLmdldFN0eWxl
KGQpKTtnPQo9M0RkLmVsZW1lbnQ7YS5hcHBlbmRDaGlsZChnKTthLmlubmVySFRNTC5pbmRleE9m
KCJ4bWxucyIpPTNEPTNEPTNELTEmJkgoZyw9CiJ4bWxucyIseGEpO3RoaXMuaXNTVkc9M0QhMDt0
aGlzLmJveD0zRGc7dGhpcy5ib3hXcmFwcGVyPTNEZDt0aGlzLmFsaWduZWRPYj0KamVjdHM9M0Rb
XTt0aGlzLnVybD0zRChUYXx8aWIpJiZ5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJiYXNlIikubGVu
Z3RoP2YuaHJlPQpmLnJlcGxhY2UoLyMuKj8kLywKLSIiKS5yZXBsYWNlKC8oW1woJ1wpXSkvZywi
XFwkMSIpLnJlcGxhY2UoLyAvZywiJTIwIik6IiI7dGhpcy5jcmVhdGVFbGVtZW50PQooImRlc2Mi
KS5hZGQoKS5lbGVtZW50LmFwcGVuZENoaWxkKHkuY3JlYXRlVGV4dE5vZGUoIkNyZWF0ZWQgd2l0
aCBIaWdoY2hhcnQ9CnMgNC4wLjEiKSk7dGhpcy5kZWZzPTNEdGhpcy5jcmVhdGVFbGVtZW50KCJk
ZWZzIikuYWRkKCk7dGhpcy5mb3JFeHBvcnQ9M0RlOz0KdGhpcy5ncmFkaWVudHM9M0R7fTt0aGlz
LmNhY2hlPTNEe307dGhpcy5zZXRTaXplKGIsYywhMSk7dmFyIGg7aWYoVGEmJmEuZ2V0PQpCb3Vu
ZGluZ0NsaWVudFJlY3QpdGhpcy5zdWJQaXhlbEZpeD0zRGI9M0RmdW5jdGlvbigpe0coYSx7bGVm
dDowLHRvcDowfSk7aD0KPTNEYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtHKGEse2xlZnQ6S2Eo
aC5sZWZ0KS1oLmxlZnQrInB4Iix0b3A6S2EoaC50b3ApPQotaC50b3ArInB4In0pfSxiKCksSyhJ
LCJyZXNpemUiLGIpfSxnZXRTdHlsZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdHlsZT0KPTNE
Ci1xKHtmb250RmFtaWx5OiciTHVjaWRhIEdyYW5kZSIsICJMdWNpZGEgU2FucyBVbmljb2RlIiwg
QXJpYWwsIEhlbHZldGljYSwgcz0KYW5zLXNlcmlmJyxmb250U2l6ZToiMTJweCJ9LGEpfSxpc0hp
ZGRlbjpmdW5jdGlvbigpe3JldHVybiF0aGlzLmJveFdyYXBwZXIuPQpnZXRCQm94KCkud2lkdGh9
LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMuZGVmczt0aGlzLmJveD0zRG51bGw7dGhp
cy49CmJveFdyYXBwZXI9M0R0aGlzLmJveFdyYXBwZXIuZGVzdHJveSgpO09hKHRoaXMuZ3JhZGll
bnRzfHx7fSk7dGhpcy5ncmFkaWVudD0Kcz0zRG51bGw7aWYoYSl0aGlzLmRlZnM9M0RhLmRlc3Ry
b3koKTt0aGlzLnN1YlBpeGVsRml4JiZXKEksInJlc2l6ZSIsdGhpcy5zPQp1YlBpeGVsRml4KTty
ZXR1cm4gdGhpcy5hbGlnbmVkT2JqZWN0cz0zRG51bGx9LGNyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24o
YSl7dmE9CnIgYj0zRG5ldyB0aGlzLkVsZW1lbnQ7Yi5pbml0KHRoaXMsYSk7cmV0dXJuIGJ9LGRy
YXc6ZnVuY3Rpb24oKXt9LAotYnVpbGRUZXh0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0zRGEuZWxl
bWVudCxjPTNEdGhpcyxkPTNEYy5mb3JFeHBvcnQsZT0zRG09CihhLnRleHRTdHIsIiIpLnRvU3Ry
aW5nKCksZj0zRGUuaW5kZXhPZigiPCIpIT0zRD0zRC0xLGc9M0RiLmNoaWxkTm9kZXMsaCxpLD0K
aj0zREgoYiwieCIpLGs9M0RhLnN0eWxlcyxsPTNEYS50ZXh0V2lkdGgsbz0zRGsmJmsubGluZUhl
aWdodCxuPTNEZy5sZW5ndGgsPQpzPTNEZnVuY3Rpb24oYSl7cmV0dXJuIG8/eihvKTpjLmZvbnRN
ZXRyaWNzKC8ocHh8ZW0pJC8udGVzdChhJiZhLnN0eWxlLmZvbnQ9ClNpemUpP2Euc3R5bGUuZm9u
dFNpemU6ayYmay5mb250U2l6ZXx8Yy5zdHlsZS5mb250U2l6ZXx8MTIpLmh9O24tLTspYi5yZW1v
dj0KZUNoaWxkKGdbbl0pOyFmJiZlLmluZGV4T2YoIiAiKT0zRD0zRD0zRC0xP2IuYXBwZW5kQ2hp
bGQoeS5jcmVhdGVUZXh0Tm9kZShlPQopKTooaD0zRC88LipzdHlsZT0zRCIoW14iXSspIi4qPi8s
aT0zRC88LipocmVmPTNEIihodHRwW14iXSspIi4qPi8sbCYmIWEuYWQ9CmRlZCYmdGhpcy5ib3gu
YXBwZW5kQ2hpbGQoYiksCi1lPTNEZj9lLnJlcGxhY2UoLzwoYnxzdHJvbmcpPi9nLCc8c3BhbiBz
dHlsZT0zRCJmb250LXdlaWdodDpib2xkIj4nKS5yZXBsYT0KY2UoLzwoaXxlbSk+L2csJzxzcGFu
IHN0eWxlPTNEImZvbnQtc3R5bGU6aXRhbGljIj4nKS5yZXBsYWNlKC88YS9nLCI8c3BhbiIpPQou
cmVwbGFjZSgvPFwvKGJ8c3Ryb25nfGl8ZW18YSk+L2csIjwvc3Bhbj4iKS5zcGxpdCgvPGJyLio/
Pi9nKTpbZV0sZVtlLmxlbmc9CnRoLTFdPTNEPTNEPTNEIiImJmUucG9wKCkscChlLGZ1bmN0aW9u
KGUsZil7dmFyIGcsbj0zRDAsZT0zRGUucmVwbGFjZSgvPHNwYT0Kbi9nLCJ8fHw8c3BhbiIpLnJl
cGxhY2UoLzxcL3NwYW4+L2csIjwvc3Bhbj58fHwiKTtnPTNEZS5zcGxpdCgifHx8Iik7cChnLGZ1
PQpuY3Rpb24oZSl7aWYoZSE9M0Q9M0QiInx8Zy5sZW5ndGg9M0Q9M0Q9M0QxKXt2YXIgbz0zRHt9
LG09M0R5LmNyZWF0ZUVsZW1lbnQ9Ck5TKHhhLCJ0c3BhbiIpLHA7aC50ZXN0KGUpJiYocD0zRGUu
bWF0Y2goaClbMV0ucmVwbGFjZSgvKDt8IHxeKWNvbG9yKFsgOl0pLz0KLCIkMWZpbGwkMiIpLAot
SChtLCJzdHlsZSIscCkpO2kudGVzdChlKSYmIWQmJihIKG0sIm9uY2xpY2siLCdsb2NhdGlvbi5o
cmVmPTNEIicrZS5tYXRjaCg9CmkpWzFdKyciJyksRyhtLHtjdXJzb3I6InBvaW50ZXIifSkpO2U9
M0QoZS5yZXBsYWNlKC88KC58XG4pKj8+L2csIiIpfHwiICIpLj0KcmVwbGFjZSgvJmx0Oy9nLCI8
IikucmVwbGFjZSgvJmd0Oy9nLCI+Iik7aWYoZSE9M0Q9M0QiICIpe20uYXBwZW5kQ2hpbGQoeS5j
PQpyZWF0ZVRleHROb2RlKGUpKTtpZihuKW8uZHg9M0QwO2Vsc2UgaWYoZiYmaiE9M0Q9M0RudWxs
KW8ueD0zRGo7SChtLG8pOyFuJiY9CmYmJighYWEmJmQmJkcobSx7ZGlzcGxheToiYmxvY2sifSks
SChtLCJkeSIscyhtKSxpYiYmbS5vZmZzZXRIZWlnaHQpKTtiLmFwcD0KZW5kQ2hpbGQobSk7bisr
O2lmKGwpZm9yKHZhciBlPTNEZS5yZXBsYWNlKC8oW15cXl0pLS9nLCIkMS0gIikuc3BsaXQoIiAi
KSxvPQo9M0RlLmxlbmd0aD4xJiZrLndoaXRlU3BhY2UhPTNEPTNEIm5vd3JhcCIsJCxyLEI9M0Rh
Ll9jbGlwSGVpZ2h0LHE9M0RbXSx2PQo9M0RzKCksdD0zRAotMTtvJiYoZS5sZW5ndGh8fHEubGVu
Z3RoKTspZGVsZXRlIGEuYkJveCwkPTNEYS5nZXRCQm94KCkscj0zRCQud2lkdGgsIWFhJiY9CmMu
Zm9yRXhwb3J0JiYocj0zRGMubWVhc3VyZVNwYW5XaWR0aChtLmZpcnN0Q2hpbGQuZGF0YSxhLnN0
eWxlcykpLCQ9M0RyPmwsIT0KJHx8ZS5sZW5ndGg9M0Q9M0Q9M0QxPyhlPTNEcSxxPTNEW10sZS5s
ZW5ndGgmJih0KyssQiYmdCp2PkI/KGU9M0RbIi4uLiJdLGEuPQphdHRyKCJ0aXRsZSIsYS50ZXh0
U3RyKSk6KG09M0R5LmNyZWF0ZUVsZW1lbnROUyh4YSwidHNwYW4iKSxIKG0se2R5OnYseDpqfSk9
CixwJiZIKG0sInN0eWxlIixwKSxiLmFwcGVuZENoaWxkKG0pLHI+bCYmKGw9M0RyKSkpKToobS5y
ZW1vdmVDaGlsZChtLmZpcnN0Qz0KaGlsZCkscS51bnNoaWZ0KGUucG9wKCkpKSxlLmxlbmd0aCYm
bS5hcHBlbmRDaGlsZCh5LmNyZWF0ZVRleHROb2RlKGUuam9pbigiPQogIikucmVwbGFjZSgvLSAv
ZywiLSIpKSl9fX0pfSkpfSxidXR0b246ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciBq
PQo9M0R0aGlzLmxhYmVsKGEsCi1iLGMsaSxudWxsLG51bGwsbnVsbCxudWxsLCJidXR0b24iKSxr
PTNEMCxsLG8sbixzLG0scCxhPTNEe3gxOjAseTE6MCx4MjowLD0KeTI6MX0sZT0zRHcoeyJzdHJv
a2Utd2lkdGgiOjEsc3Ryb2tlOiIjQ0NDQ0NDIixmaWxsOntsaW5lYXJHcmFkaWVudDphLHN0b3Bz
PQo6W1swLCIjRkVGRUZFIl0sWzEsIiNGNkY2RjYiXV19LHI6MixwYWRkaW5nOjUsc3R5bGU6e2Nv
bG9yOiJibGFjayJ9fSxlKTtuPQo9M0RlLnN0eWxlO2RlbGV0ZSBlLnN0eWxlO2Y9M0R3KGUse3N0
cm9rZToiIzY4QSIsZmlsbDp7bGluZWFyR3JhZGllbnQ6YSxzdG89CnBzOltbMCwiI0ZGRiJdLFsx
LCIjQUNGIl1dfX0sZik7cz0zRGYuc3R5bGU7ZGVsZXRlIGYuc3R5bGU7Zz0zRHcoZSx7c3Ryb2tl
Oj0KIiM2OEEiLGZpbGw6e2xpbmVhckdyYWRpZW50OmEsc3RvcHM6W1swLCIjOUJEIl0sWzEsIiND
REYiXV19fSxnKTttPTNEZy5zdHlsPQplO2RlbGV0ZSBnLnN0eWxlO2g9M0R3KGUse3N0eWxlOntj
b2xvcjoiI0NDQyJ9fSxoKTtwPTNEaC5zdHlsZTtkZWxldGUgaC5zdHk9CmxlOwotSyhqLmVsZW1l
bnQsQWE/Im1vdXNlb3ZlciI6Im1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7ayE9M0Q9M0QzJiZqLmF0
dHIoZikuY3M9CnMocyl9KTtLKGouZWxlbWVudCxBYT8ibW91c2VvdXQiOiJtb3VzZWxlYXZlIixm
dW5jdGlvbigpe2shPTNEPTNEMyYmKGw9M0RbZT0KLGYsZ11ba10sbz0zRFtuLHMsbV1ba10sai5h
dHRyKGwpLmNzcyhvKSl9KTtqLnNldFN0YXRlPTNEZnVuY3Rpb24oYSl7KGouc3RhPQp0ZT0zRGs9
M0RhKT9hPTNEPTNEPTNEMj9qLmF0dHIoZykuY3NzKG0pOmE9M0Q9M0Q9M0QzJiZqLmF0dHIoaCku
Y3NzKHApOmouYXQ9CnRyKGUpLmNzcyhuKX07cmV0dXJuIGoub24oImNsaWNrIixmdW5jdGlvbigp
e2shPTNEPTNEMyYmZC5jYWxsKGopfSkuYXR0cihlKT0KLmNzcyhxKHtjdXJzb3I6ImRlZmF1bHQi
fSxuKSl9LGNyaXNwTGluZTpmdW5jdGlvbihhLGIpe2FbMV09M0Q9M0Q9M0RhWzRdJiYoPQphWzFd
PTNEYVs0XT0zRHUoYVsxXSktYiUyLzIpO2FbMl09M0Q9M0Q9M0RhWzVdJiYoYVsyXT0zRGFbNV09
M0R1KGFbMl0pK2IlMi89CjIpO3JldHVybiBhfSxwYXRoOmZ1bmN0aW9uKGEpe3ZhciBiPTNECi17
ZmlsbDpRfTtMYShhKT9iLmQ9M0RhOmNhKGEpJiZxKGIsYSk7cmV0dXJuIHRoaXMuY3JlYXRlRWxl
bWVudCgicGF0aCIpLmF0dD0KcihiKX0sY2lyY2xlOmZ1bmN0aW9uKGEsYixjKXthPTNEY2EoYSk/
YTp7eDphLHk6YixyOmN9O2I9M0R0aGlzLmNyZWF0ZUVsZW1lPQpudCgiY2lyY2xlIik7Yi54U2V0
dGVyPTNEZnVuY3Rpb24oYSl7dGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgiY3giLGEpfTtiLnk9
ClNldHRlcj0zRGZ1bmN0aW9uKGEpe3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImN5IixhKX07
cmV0dXJuIGIuYXR0cihhKX0sYT0KcmM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKGNhKGEpKWI9
M0RhLnksYz0zRGEucixkPTNEYS5pbm5lclIsZT0zRGEuc3RhcnQsPQpmPTNEYS5lbmQsYT0zRGEu
eDthPTNEdGhpcy5zeW1ib2woImFyYyIsYXx8MCxifHwwLGN8fDAsY3x8MCx7aW5uZXJSOmR8fDAs
c3Q9CmFydDplfHwwLGVuZDpmfHwwfSk7YS5yPTNEYztyZXR1cm4gYX0scmVjdDpmdW5jdGlvbihh
LGIsYyxkLGUsZil7dmFyIGU9M0RjYT0KKGEpP2EucjoKLWUsZz0zRHRoaXMuY3JlYXRlRWxlbWVu
dCgicmVjdCIpLGE9M0RjYShhKT9hOmE9M0Q9M0Q9M0R0P3t9Ont4OmEseTpiLHdpZHRoPQo6dihj
LDApLGhlaWdodDp2KGQsMCl9O2lmKGYhPTNEPTNEdClhLnN0cm9rZVdpZHRoPTNEZixhPTNEZy5j
cmlzcChhKTtpZihlKWE9Ci5yPTNEZTtnLnJTZXR0ZXI9M0RmdW5jdGlvbihhKXtIKHRoaXMuZWxl
bWVudCx7cng6YSxyeTphfSl9O3JldHVybiBnLmF0dHIoYT0KKX0sc2V0U2l6ZTpmdW5jdGlvbihh
LGIsYyl7dmFyIGQ9M0R0aGlzLmFsaWduZWRPYmplY3RzLGU9M0RkLmxlbmd0aDt0aGlzLndpPQpk
dGg9M0RhO3RoaXMuaGVpZ2h0PTNEYjtmb3IodGhpcy5ib3hXcmFwcGVyW20oYywhMCk/ImFuaW1h
dGUiOiJhdHRyIl0oe3dpZHQ9Cmg6YSxoZWlnaHQ6Yn0pO2UtLTspZFtlXS5hbGlnbigpfSxnOmZ1
bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5jcmVhdGVFbGVtZW50KD0KImciKTtyZXR1cm4gcihhKT9i
LmF0dHIoeyJjbGFzcyI6ImhpZ2hjaGFydHMtIithfSk6Yn0saW1hZ2U6ZnVuY3Rpb24oYSxiLGMs
PQpkLGUpe3ZhciBmPTNECi17cHJlc2VydmVBc3BlY3RSYXRpbzpRfTthcmd1bWVudHMubGVuZ3Ro
PjEmJnEoZix7eDpiLHk6Yyx3aWR0aDpkLGhlaWdodDplfT0KKTtmPTNEdGhpcy5jcmVhdGVFbGVt
ZW50KCJpbWFnZSIpLmF0dHIoZik7Zi5lbGVtZW50LnNldEF0dHJpYnV0ZU5TP2YuZWxlbWVuPQp0
LnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwiaHJlZiIsYSk6
Zi5lbGVtZW50LnNldEF0dHI9CmlidXRlKCJoYy1zdmctaHJlZiIsYSk7cmV0dXJuIGZ9LHN5bWJv
bDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGcsaD0zRHRoaT0Kcy5zeW1ib2xzW2FdLGg9M0Ro
JiZoKHUoYiksdShjKSxkLGUsZiksaT0zRC9edXJsXCgoLio/KVwpJC8saixrO2lmKGgpZz0zRHRo
PQppcy5wYXRoKGgpLHEoZyx7c3ltYm9sTmFtZTphLHg6Yix5OmMsd2lkdGg6ZCxoZWlnaHQ6ZX0p
LGYmJnEoZyxmKTtlbHNlIGlmKGk9Ci50ZXN0KGEpKWs9M0RmdW5jdGlvbihhLGIpe2EuZWxlbWVu
dCYmKGEuYXR0cih7d2lkdGg6YlswXSxoZWlnaHQ6YlsxXX0pLAotYS5hbGlnbkJ5VHJhbnNsYXRl
fHxhLnRyYW5zbGF0ZSh1KChkLWJbMF0pLzIpLHUoKGUtYlsxXSkvMikpKX0saj0zRGEubWF0Y2g9
CihpKVsxXSxhPTNES2Jbal0sZz0zRHRoaXMuaW1hZ2UoaikuYXR0cih7eDpiLHk6Y30pLGcuaXNJ
bWc9M0QhMCxhP2soZyxhKTooZz0KLmF0dHIoe3dpZHRoOjAsaGVpZ2h0OjB9KSxZKCJpbWciLHtv
bmxvYWQ6ZnVuY3Rpb24oKXtrKGcsS2Jbal09M0RbdGhpcy53aWR0PQpoLHRoaXMuaGVpZ2h0XSl9
LHNyYzpqfSkpO3JldHVybiBnfSxzeW1ib2xzOntjaXJjbGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
IGU9Cj0zRDAuMTY2KmM7cmV0dXJuWyJNIixhK2MvMixiLCJDIixhK2MrZSxiLGErYytlLGIrZCxh
K2MvMixiK2QsIkMiLGEtZSxiK2QsYT0KLWUsYixhK2MvMixiLCJaIl19LHNxdWFyZTpmdW5jdGlv
bihhLGIsYyxkKXtyZXR1cm5bIk0iLGEsYiwiTCIsYStjLGIsYStjLGIrPQpkLGEsYitkLCJaIl19
LHRyaWFuZ2xlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVyblsiTSIsYStjLzIsYiwiTCIsCi1hK2Ms
YitkLGEsYitkLCJaIl19LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5b
Ik0iLGEsYiwiTCIsYT0KK2MsYixhK2MvMixiK2QsIloiXX0sZGlhbW9uZDpmdW5jdGlvbihhLGIs
YyxkKXtyZXR1cm5bIk0iLGErYy8yLGIsIkwiLGErYyxiPQorZC8yLGErYy8yLGIrZCxhLGIrZC8y
LCJaIl19LGFyYzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTNEZS5zdGFydCxjPTNEZS49CnJ8
fGN8fGQsZz0zRGUuZW5kLTAuMDAxLGQ9M0RlLmlubmVyUixoPTNEZS5vcGVuLGk9M0RaKGYpLGo9
M0RlYShmKSxrPTNEWihnKT0KLGc9M0RlYShnKSxlPTNEZS5lbmQtZjxtYT8wOjE7cmV0dXJuWyJN
IixhK2MqaSxiK2MqaiwiQSIsYyxjLDAsZSwxLGErYyprLGIrPQpjKmcsaD8iTSI6IkwiLGErZCpr
LGIrZCpnLCJBIixkLGQsMCxlLDAsYStkKmksYitkKmosaD8iIjoiWiJdfSxjYWxsb3V0OmZ1bmM9
CnRpb24oYSxiLGMsZCxlKXt2YXIgZj0zREMoZSYmZS5yfHwwLGMsZCksZz0zRGYrNixoPTNEZSYm
ZS5hbmNob3JYLGk9M0RlJiZlLj0KYW5jaG9yWSwKLWU9M0R1KGUuc3Ryb2tlV2lkdGh8fDApJTIv
MjthKz0zRGU7Yis9M0RlO2U9M0RbIk0iLGErZixiLCJMIixhK2MtZixiLCJDIixhPQorYyxiLGEr
YyxiLGErYyxiK2YsIkwiLGErYyxiK2QtZiwiQyIsYStjLGIrZCxhK2MsYitkLGErYy1mLGIrZCwi
TCIsYStmLGIrZCw9CiJDIixhLGIrZCxhLGIrZCxhLGIrZC1mLCJMIixhLGIrZiwiQyIsYSxiLGEs
YixhK2YsYl07aCYmaD5jJiZpPmIrZyYmaTxiK2QtZz0KP2Uuc3BsaWNlKDEzLDMsIkwiLGErYyxp
LTYsYStjKzYsaSxhK2MsaSs2LGErYyxiK2QtZik6aCYmaDwwJiZpPmIrZyYmaTxiK2QtPQpnP2Uu
c3BsaWNlKDMzLDMsIkwiLGEsaSs2LGEtNixpLGEsaS02LGEsYitmKTppJiZpPmQmJmg+YStnJiZo
PGErYy1nP2Uuc3BsaWM9CmUoMjMsMywiTCIsaCs2LGIrZCxoLGIrZCs2LGgtNixiK2QsYStmLGIr
ZCk6aSYmaTwwJiZoPmErZyYmaDxhK2MtZyYmZS5zcGxpYz0KZSgzLDMsIkwiLGgtNixiLGgsYi02
LGgrNixiLGMtZixiKTtyZXR1cm4gZX19LGNsaXBSZWN0OmZ1bmN0aW9uKGEsCi1iLGMsZCl7dmFy
IGU9M0QiaGlnaGNoYXJ0cy0iK3RiKyssZj0zRHRoaXMuY3JlYXRlRWxlbWVudCgiY2xpcFBhdGgi
KS5hdHRyKD0Ke2lkOmV9KS5hZGQodGhpcy5kZWZzKSxhPTNEdGhpcy5yZWN0KGEsYixjLGQsMCku
YWRkKGYpO2EuaWQ9M0RlO2EuY2xpcFBhdGg9Cj0zRGY7cmV0dXJuIGF9LHRleHQ6ZnVuY3Rpb24o
YSxiLGMsZCl7dmFyIGU9M0RmYXx8IWFhJiZ0aGlzLmZvckV4cG9ydCxmPTNEez0KfTtpZihkJiYh
dGhpcy5mb3JFeHBvcnQpcmV0dXJuIHRoaXMuaHRtbChhLGIsYyk7Zi54PTNETWF0aC5yb3VuZChi
fHwwKTtpZihjPQopZi55PTNETWF0aC5yb3VuZChjKTtpZihhfHxhPTNEPTNEPTNEMClmLnRleHQ9
M0RhO2E9M0R0aGlzLmNyZWF0ZUVsZW1lbnQoInQ9CmV4dCIpLmF0dHIoZik7ZSYmYS5jc3Moe3Bv
c2l0aW9uOiJhYnNvbHV0ZSJ9KTtpZighZClhLnhTZXR0ZXI9M0RmdW5jdGlvbihhLD0KYixjKXt2
YXIgZD0zRGMuY2hpbGROb2RlcyxlLGY7Zm9yKGY9M0QxO2Y8ZC5sZW5ndGg7ZisrKWU9M0RkW2Zd
LGUuZ2V0QXR0cmliPQp1dGUoIngiKT0zRD0zRD0zRGMuZ2V0QXR0cmlidXRlKCJ4IikmJgotZS5z
ZXRBdHRyaWJ1dGUoIngiLGEpO2Muc2V0QXR0cmlidXRlKGIsYSl9O3JldHVybiBhfSxmb250TWV0
cmljczpmdW5jdGlvbig9CmEpe3ZhciBhPTNEYXx8dGhpcy5zdHlsZS5mb250U2l6ZSxhPTNEL3B4
Ly50ZXN0KGEpP3ooYSk6L2VtLy50ZXN0KGEpP3BhcnNlRj0KbG9hdChhKSoxMjoxMixhPTNEYTwy
ND9hKzQ6dShhKjEuMiksYj0zRHUoYSowLjgpO3JldHVybntoOmEsYjpifX0sbGFiZWw6ZnVuPQpj
dGlvbihhLGIsYyxkLGUsZixnLGgsaSl7ZnVuY3Rpb24gaigpe3ZhciBhLGI7YT0zRHMuZWxlbWVu
dC5zdHlsZTtKPTNEKFZhPQo9M0Q9M0Q9M0R2b2lkIDB8fHdiPTNEPTNEPTNEdm9pZCAwfHxuLnN0
eWxlcy50ZXh0QWxpZ24pJiZzLnRleHRTdHImJnMuZ2V0QkI9Cm94KCk7bi53aWR0aD0zRChWYXx8
Si53aWR0aHx8MCkrMip4K3Y7bi5oZWlnaHQ9M0Qod2J8fEouaGVpZ2h0fHwwKSsyKng7bmE9Cj0z
RHgrby5mb250TWV0cmljcyhhJiZhLmZvbnRTaXplKS5iO2lmKHope2lmKCFtKWE9M0R1KC1MKngp
LGI9M0RoPy1uYTowLG4uYj0Kb3g9M0RtPTNEZD9vLnN5bWJvbChkLAotYSxiLG4ud2lkdGgsbi5o
ZWlnaHQsQik6by5yZWN0KGEsYixuLndpZHRoLG4uaGVpZ2h0LDAsQltQYl0pLG0uYXR0cigiZmls
bCI9CixRKS5hZGQobik7bS5pc0ltZ3x8bS5hdHRyKHEoe3dpZHRoOnUobi53aWR0aCksaGVpZ2h0
OnUobi5oZWlnaHQpfSxCKSk7Qj0zRD0KbnVsbH19ZnVuY3Rpb24gaygpe3ZhciBhPTNEbi5zdHls
ZXMsYT0zRGEmJmEudGV4dEFsaWduLGI9M0R2K3gqKDEtTCksYztjPTNEPQpoPzA6bmE7aWYocihW
YSkmJkomJihhPTNEPTNEPTNEImNlbnRlciJ8fGE9M0Q9M0Q9M0QicmlnaHQiKSliKz0zRHtjZW50
ZXI6MC49CjUscmlnaHQ6MX1bYV0qKFZhLUoud2lkdGgpO2lmKGIhPTNEPTNEcy54fHxjIT0zRD0z
RHMueSlzLmF0dHIoIngiLGIpLGMhPTNEPQo9M0R0JiZzLmF0dHIoInkiLGMpO3MueD0zRGI7cy55
PTNEY31mdW5jdGlvbiBsKGEsYil7bT9tLmF0dHIoYSxiKTpCW2FdPTNEYn09CnZhciBvPTNEdGhp
cyxuPTNEby5nKGkpLHM9M0RvLnRleHQoIiIsMCwwLGcpLmF0dHIoe3pJbmRleDoxfSksbSxKLEw9
M0QwLHg9Cj0zRDMsdj0zRDAsVmEsd2IseGIseWIseT0zRDAsQj0zRHt9LG5hLAotejtuLm9uQWRk
PTNEZnVuY3Rpb24oKXtzLmFkZChuKTtuLmF0dHIoe3RleHQ6YXx8IiIseDpiLHk6Y30pO20mJnIo
ZSkmJm4uYXQ9CnRyKHthbmNob3JYOmUsYW5jaG9yWTpmfSl9O24ud2lkdGhTZXR0ZXI9M0RmdW5j
dGlvbihhKXtWYT0zRGF9O24uaGVpZ2h0U2V0dD0KZXI9M0RmdW5jdGlvbihhKXt3Yj0zRGF9O24u
cGFkZGluZ1NldHRlcj0zRGZ1bmN0aW9uKGEpe3IoYSkmJmEhPTNEPTNEeCYmKHg9Cj0zRGEsaygp
KX07bi5wYWRkaW5nTGVmdFNldHRlcj0zRGZ1bmN0aW9uKGEpe3IoYSkmJmEhPTNEPTNEdiYmKHY9
M0RhLGsoKSl9Oz0Kbi5hbGlnblNldHRlcj0zRGZ1bmN0aW9uKGEpe0w9M0R7bGVmdDowLGNlbnRl
cjowLjUscmlnaHQ6MX1bYV19O24udGV4dFNldHRlPQpyPTNEZnVuY3Rpb24oYSl7YSE9M0Q9M0R0
JiZzLnRleHRTZXR0ZXIoYSk7aigpO2soKX07blsic3Ryb2tlLXdpZHRoU2V0dGVyIl09Cj0zRGZ1
bmN0aW9uKGEsYil7YSYmKHo9M0QhMCk7eT0zRGElMi8yO2woYixhKX07bi5zdHJva2VTZXR0ZXI9
M0RuLmZpbGxTZXR0ZT0Kcj0zRG4uclNldHRlcj0zRGZ1bmN0aW9uKGEsCi1iKXtiPTNEPTNEPTNE
ImZpbGwiJiZhJiYoej0zRCEwKTtsKGIsYSl9O24uYW5jaG9yWFNldHRlcj0zRGZ1bmN0aW9uKGEs
Yil7ZT0KPTNEYTtsKGIsYSt5LXhiKX07bi5hbmNob3JZU2V0dGVyPTNEZnVuY3Rpb24oYSxiKXtm
PTNEYTtsKGIsYS15Yil9O24ueFNldHRlPQpyPTNEZnVuY3Rpb24oYSl7bi54PTNEYTtMJiYoYS09
M0RMKigoVmF8fEoud2lkdGgpK3gpKTt4Yj0zRHUoYSk7bi5hdHRyKCJ0cmE9Cm5zbGF0ZVgiLHhi
KX07bi55U2V0dGVyPTNEZnVuY3Rpb24oYSl7eWI9M0RuLnk9M0R1KGEpO24uYXR0cigidHJhbnNs
YXRlWSIseT0KYil9O3ZhciBBPTNEbi5jc3M7cmV0dXJuIHEobix7Y3NzOmZ1bmN0aW9uKGEpe2lm
KGEpe3ZhciBiPTNEe30sYT0zRHcoYSk7cCgiPQpmb250U2l6ZSxmb250V2VpZ2h0LGZvbnRGYW1p
bHksY29sb3IsbGluZUhlaWdodCx3aWR0aCx0ZXh0RGVjb3JhdGlvbix0ZXh0U2g9CmFkb3ciLnNw
bGl0KCIsIiksZnVuY3Rpb24oYyl7YVtjXSE9M0Q9M0R0JiYoYltjXT0zRGFbY10sZGVsZXRlIGFb
Y10pfSk7cy5jcz0KcyhiKX1yZXR1cm4gQS5jYWxsKG4sCi1hKX0sZ2V0QkJveDpmdW5jdGlvbigp
e3JldHVybnt3aWR0aDpKLndpZHRoKzIqeCxoZWlnaHQ6Si5oZWlnaHQrMip4LHg6Si54LT0KeCx5
OkoueS14fX0sc2hhZG93OmZ1bmN0aW9uKGEpe20mJm0uc2hhZG93KGEpO3JldHVybiBufSxkZXN0
cm95OmZ1bmN0aW9uKCl7PQpXKG4uZWxlbWVudCwibW91c2VlbnRlciIpO1cobi5lbGVtZW50LCJt
b3VzZWxlYXZlIik7cyYmKHM9M0RzLmRlc3Ryb3koKSk7bSY9CiYobT0zRG0uZGVzdHJveSgpKTtQ
LnByb3RvdHlwZS5kZXN0cm95LmNhbGwobik7bj0zRG89M0RqPTNEaz0zRGw9M0RudWxsfX0pfT0K
fTtaYT0zRHRhO3EoUC5wcm90b3R5cGUse2h0bWxDc3M6ZnVuY3Rpb24oYSl7dmFyIGI9M0R0aGlz
LmVsZW1lbnQ7aWYoYj0zRGEmPQomYi50YWdOYW1lPTNEPTNEPTNEIlNQQU4iJiZhLndpZHRoKWRl
bGV0ZSBhLndpZHRoLHRoaXMudGV4dFdpZHRoPTNEYix0aGlzLnU9CnBkYXRlVHJhbnNmb3JtKCk7
dGhpcy5zdHlsZXM9M0RxKHRoaXMuc3R5bGVzLGEpO0codGhpcy5lbGVtZW50LGEpO3JldHVybiB0
aD0KaXN9LGh0bWxHZXRCQm94OmZ1bmN0aW9uKCl7dmFyIGE9M0QKLXRoaXMuZWxlbWVudCxiPTNE
dGhpcy5iQm94O2lmKCFiKXtpZihhLm5vZGVOYW1lPTNEPTNEPTNEInRleHQiKWEuc3R5bGUucG9z
PQppdGlvbj0zRCJhYnNvbHV0ZSI7Yj0zRHRoaXMuYkJveD0zRHt4OmEub2Zmc2V0TGVmdCx5OmEu
b2Zmc2V0VG9wLHdpZHRoOmEub2Y9CmZzZXRXaWR0aCxoZWlnaHQ6YS5vZmZzZXRIZWlnaHR9fXJl
dHVybiBifSxodG1sVXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKCl7aT0KZih0aGlzLmFkZGVkKXt2
YXIgYT0zRHRoaXMucmVuZGVyZXIsYj0zRHRoaXMuZWxlbWVudCxjPTNEdGhpcy50cmFuc2xhdGVY
fHwwPQosZD0zRHRoaXMudHJhbnNsYXRlWXx8MCxlPTNEdGhpcy54fHwwLGY9M0R0aGlzLnl8fDAs
Zz0zRHRoaXMudGV4dEFsaWdufHwibGU9CmZ0IixoPTNEe2xlZnQ6MCxjZW50ZXI6MC41LHJpZ2h0
OjF9W2ddLGk9M0R0aGlzLnNoYWRvd3M7RyhiLHttYXJnaW5MZWZ0OmMsbT0KYXJnaW5Ub3A6ZH0p
O2kmJnAoaSxmdW5jdGlvbihhKXtHKGEse21hcmdpbkxlZnQ6YysxLG1hcmdpblRvcDpkKzF9KX0p
O3RoaXMuPQppbnZlcnRlZCYmCi1wKGIuY2hpbGROb2RlcyxmdW5jdGlvbihjKXthLmludmVydENo
aWxkKGMsYil9KTtpZihiLnRhZ05hbWU9M0Q9M0Q9M0QiU1BBTj0KIil7dmFyIGo9M0R0aGlzLnJv
dGF0aW9uLGssbD0zRHoodGhpcy50ZXh0V2lkdGgpLG89M0RbaixnLGIuaW5uZXJIVE1MLHRoaXMu
PQp0ZXh0V2lkdGhdLmpvaW4oIiwiKTtpZihvIT0zRD0zRHRoaXMuY1RUKXtrPTNEYS5mb250TWV0
cmljcyhiLnN0eWxlLmZvbnRTaXo9CmUpLmI7cihqKSYmdGhpcy5zZXRTcGFuUm90YXRpb24oaixo
LGspO2k9M0RtKHRoaXMuZWxlbVdpZHRoLGIub2Zmc2V0V2lkdGgpOz0KaWYoaT5sJiYvWyBcLV0v
LnRlc3QoYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHQpKUcoYix7d2lkdGg6bCsicHgiLGRpc3Bs
YXk6PQoiYmxvY2siLHdoaXRlU3BhY2U6Im5vcm1hbCJ9KSxpPTNEbDt0aGlzLmdldFNwYW5Db3Jy
ZWN0aW9uKGksayxoLGosZyl9RyhiLHs9CmxlZnQ6ZSsodGhpcy54Q29ycnx8MCkrInB4Iix0b3A6
ZisodGhpcy55Q29ycnx8MCkrInB4In0pO2lmKGliKWs9M0RiLm9mZnNldD0KSGVpZ2h0OwotdGhp
cy5jVFQ9M0RvfX1lbHNlIHRoaXMuYWxpZ25PbkFkZD0zRCEwfSxzZXRTcGFuUm90YXRpb246ZnVu
Y3Rpb24oYSxiLGMpe3Y9CmFyIGQ9M0R7fSxlPTNEQWE/Ii1tcy10cmFuc2Zvcm0iOmliPyItd2Vi
a2l0LXRyYW5zZm9ybSI6VGE/Ik1velRyYW5zZm9ybSI6ST0KYj8iLW8tdHJhbnNmb3JtIjoiIjtk
W2VdPTNEZC50cmFuc2Zvcm09M0Qicm90YXRlKCIrYSsiZGVnKSI7ZFtlKyhUYT8iT3JpZ2luPQoi
OiItb3JpZ2luIildPTNEZC50cmFuc2Zvcm1PcmlnaW49M0RiKjEwMCsiJSAiK2MrInB4IjtHKHRo
aXMuZWxlbWVudCxkKX0sZ2U9CnRTcGFuQ29ycmVjdGlvbjpmdW5jdGlvbihhLGIsYyl7dGhpcy54
Q29ycj0zRC1hKmM7dGhpcy55Q29ycj0zRC1ifX0pO3EodGEucD0Kcm90b3R5cGUse2h0bWw6ZnVu
Y3Rpb24oYSxiLGMpe3ZhciBkPTNEdGhpcy5jcmVhdGVFbGVtZW50KCJzcGFuIiksZT0zRGQuZWxl
PQptZW50LGY9M0RkLnJlbmRlcmVyO2QudGV4dFNldHRlcj0zRGZ1bmN0aW9uKGEpe2EhPTNEPTNE
ZS5pbm5lckhUTUwmJmRlbGV0ZSA9CnRoaXMuYkJveDsKLWUuaW5uZXJIVE1MPTNEdGhpcy50ZXh0
U3RyPTNEYX07ZC54U2V0dGVyPTNEZC55U2V0dGVyPTNEZC5hbGlnblNldHRlcj0zRGQuPQpyb3Rh
dGlvblNldHRlcj0zRGZ1bmN0aW9uKGEsYil7Yj0zRD0zRD0zRCJhbGlnbiImJihiPTNEInRleHRB
bGlnbiIpO2RbYl09M0Q9CmE7ZC5odG1sVXBkYXRlVHJhbnNmb3JtKCl9O2QuYXR0cih7dGV4dDph
LHg6dShiKSx5OnUoYyl9KS5jc3Moe3Bvc2l0aW9uOiJhYj0Kc29sdXRlIix3aGl0ZVNwYWNlOiJu
b3dyYXAiLGZvbnRGYW1pbHk6dGhpcy5zdHlsZS5mb250RmFtaWx5LGZvbnRTaXplOnRoaXMuPQpz
dHlsZS5mb250U2l6ZX0pO2QuY3NzPTNEZC5odG1sQ3NzO2lmKGYuaXNTVkcpZC5hZGQ9M0RmdW5j
dGlvbihhKXt2YXIgYixjPQo9M0RmLmJveC5wYXJlbnROb2RlLGo9M0RbXTtpZih0aGlzLnBhcmVu
dEdyb3VwPTNEYSl7aWYoYj0zRGEuZGl2LCFiKXtmb3IoO2E9Cjspai5wdXNoKGEpLGE9M0RhLnBh
cmVudEdyb3VwO3Aoai5yZXZlcnNlKCksZnVuY3Rpb24oYSl7dmFyIGQ7Yj0zRGEuZGl2PTNEYT0K
LmRpdnx8WShKYSx7Y2xhc3NOYW1lOkgoYS5lbGVtZW50LAotImNsYXNzIil9LHtwb3NpdGlvbjoi
YWJzb2x1dGUiLGxlZnQ6KGEudHJhbnNsYXRlWHx8MCkrInB4Iix0b3A6KGEudHJhbnNsYXQ9CmVZ
fHwwKSsicHgifSxifHxjKTtkPTNEYi5zdHlsZTtxKGEse3RyYW5zbGF0ZVhTZXR0ZXI6ZnVuY3Rp
b24oYixjKXtkLmxlZnQ9Cj0zRGIrInB4IjthW2NdPTNEYjthLmRvVHJhbnNmb3JtPTNEITB9LHRy
YW5zbGF0ZVlTZXR0ZXI6ZnVuY3Rpb24oYixjKXtkLnRvcD0KPTNEYisicHgiO2FbY109M0RiO2Eu
ZG9UcmFuc2Zvcm09M0QhMH0sdmlzaWJpbGl0eVNldHRlcjpmdW5jdGlvbihhLGIpe2RbYl09Cj0z
RGF9fSl9KX19ZWxzZSBiPTNEYztiLmFwcGVuZENoaWxkKGUpO2QuYWRkZWQ9M0QhMDtkLmFsaWdu
T25BZGQmJmQuaHRtbFVwZD0KYXRlVHJhbnNmb3JtKCk7cmV0dXJuIGR9O3JldHVybiBkfX0pO3Zh
ciBYO2lmKCFhYSYmIWZhKXtSLlZNTEVsZW1lbnQ9M0RYPTNEPQp7aW5pdDpmdW5jdGlvbihhLGIp
e3ZhciBjPTNEWyI8IixiLCcgZmlsbGVkPTNEImYiIHN0cm9rZWQ9M0QiZiInXSxkPTNEWyJwb3M9
Cml0aW9uOiAiLCJhYnNvbHV0ZSIsCi0iOyJdLGU9M0RiPTNEPTNEPTNESmE7KGI9M0Q9M0Q9M0Qi
c2hhcGUifHxlKSYmZC5wdXNoKCJsZWZ0OjA7dG9wOjA7d2lkdGg6MT0KcHg7aGVpZ2h0OjFweDsi
KTtkLnB1c2goInZpc2liaWxpdHk6ICIsZT8iaGlkZGVuIjoidmlzaWJsZSIpO2MucHVzaCgnIHN0
eWxlPQo9M0QiJyxkLmpvaW4oIiIpLCciLz4nKTtpZihiKWM9M0RlfHxiPTNEPTNEPTNEInNwYW4i
fHxiPTNEPTNEPTNEImltZyI/Yy5qb2k9Cm4oIiIpOmEucHJlcFZNTChjKSx0aGlzLmVsZW1lbnQ9
M0RZKGMpO3RoaXMucmVuZGVyZXI9M0RhfSxhZGQ6ZnVuY3Rpb24oYSl7dj0KYXIgYj0zRHRoaXMu
cmVuZGVyZXIsYz0zRHRoaXMuZWxlbWVudCxkPTNEYi5ib3gsZD0zRGE/YS5lbGVtZW50fHxhOmQ7
YSYmYS5pPQpudmVydGVkJiZiLmludmVydENoaWxkKGMsZCk7ZC5hcHBlbmRDaGlsZChjKTt0aGlz
LmFkZGVkPTNEITA7dGhpcy5hbGlnbk9uQWQ9CmQmJiF0aGlzLmRlZmVyVXBkYXRlVHJhbnNmb3Jt
JiZ0aGlzLnVwZGF0ZVRyYW5zZm9ybSgpO2lmKHRoaXMub25BZGQpdGhpcy5vbj0KQWRkKCk7cmV0
dXJuIHRoaXN9LHVwZGF0ZVRyYW5zZm9ybTpQLnByb3RvdHlwZS5odG1sVXBkYXRlVHJhbnNmb3Jt
LAotc2V0U3BhblJvdGF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLnJvdGF0aW9uLGI9M0Ra
KGEqQ2EpLGM9M0RlYShhKkNhKTs9CkcodGhpcy5lbGVtZW50LHtmaWx0ZXI6YT9bInByb2dpZDpE
WEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoTTExPTNEIj0KLGIsIiwgTTEyPTNEIiwt
YywiLCBNMjE9M0QiLGMsIiwgTTIyPTNEIixiLCIsIHNpemluZ01ldGhvZD0zRCdhdXRvIGV4cGFu
ZCcpPQoiXS5qb2luKCIiKTpRfSl9LGdldFNwYW5Db3JyZWN0aW9uOmZ1bmN0aW9uKGEsYixjLGQs
ZSl7dmFyIGY9M0RkP1ooZCpDYSk6MSw9Cmc9M0RkP2VhKGQqQ2EpOjAsaD0zRG0odGhpcy5lbGVt
SGVpZ2h0LHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQpLGk7dGhpcy54Qz0Kb3JyPTNEZjwwJiYt
YTt0aGlzLnlDb3JyPTNEZzwwJiYtaDtpPTNEZipnPDA7dGhpcy54Q29ycis9M0RnKmIqKGk/MS1j
OmMpO3RoPQppcy55Q29yci09M0RmKmIqKGQ/aT9jOjEtYzoxKTtlJiZlIT0zRD0zRCJsZWZ0IiYm
KHRoaXMueENvcnItPTNEYSpjKihmPDA/LTE9CjoxKSxkJiYodGhpcy55Q29yci09M0QKLWgqYyoo
ZzwwPy0xOjEpKSxHKHRoaXMuZWxlbWVudCx7dGV4dEFsaWduOmV9KSl9LHBhdGhUb1ZNTDpmdW5j
dGlvbihhKXtmb3IoPQp2YXIgYj0zRGEubGVuZ3RoLGM9M0RbXTtiLS07KWlmKGhhKGFbYl0pKWNb
Yl09M0R1KGFbYl0qMTApLTU7ZWxzZSBpZihhW2JdPQo9M0Q9M0Q9M0QiWiIpY1tiXT0zRCJ4Ijtl
bHNlIGlmKGNbYl09M0RhW2JdLGEuaXNBcmMmJihhW2JdPTNEPTNEPTNEIndhInx8YVs9CmJdPTNE
PTNEPTNEImF0IikpY1tiKzVdPTNEPTNEPTNEY1tiKzddJiYoY1tiKzddKz0zRGFbYis3XT5hW2Ir
NV0/MTotMSksY1tiKz0KNl09M0Q9M0Q9M0RjW2IrOF0mJihjW2IrOF0rPTNEYVtiKzhdPmFbYis2
XT8xOi0xKTtyZXR1cm4gYy5qb2luKCIgIil8fCJ4In0sPQpjbGlwOmZ1bmN0aW9uKGEpe3ZhciBi
PTNEdGhpcyxjO2E/KGM9M0RhLm1lbWJlcnMsamEoYyxiKSxjLnB1c2goYiksYi5kZXN0cm89CnlD
bGlwPTNEZnVuY3Rpb24oKXtqYShjLGIpfSxhPTNEYS5nZXRDU1MoYikpOihiLmRlc3Ryb3lDbGlw
JiZiLmRlc3Ryb3lDbGlwKD0KKSxhPTNEe2NsaXA6aGI/ImluaGVyaXQiOiJyZWN0KGF1dG8pIn0p
OwotcmV0dXJuIGIuY3NzKGEpfSxjc3M6UC5wcm90b3R5cGUuaHRtbENzcyxzYWZlUmVtb3ZlQ2hp
bGQ6ZnVuY3Rpb24oYSl7YS5wYXI9CmVudE5vZGUmJlBhKGEpfSxkZXN0cm95OmZ1bmN0aW9uKCl7
dGhpcy5kZXN0cm95Q2xpcCYmdGhpcy5kZXN0cm95Q2xpcCgpO3JldD0KdXJuIFAucHJvdG90eXBl
LmRlc3Ryb3kuYXBwbHkodGhpcyl9LG9uOmZ1bmN0aW9uKGEsYil7dGhpcy5lbGVtZW50WyJvbiIr
YV09Cj0zRGZ1bmN0aW9uKCl7dmFyIGE9M0RJLmV2ZW50O2EudGFyZ2V0PTNEYS5zcmNFbGVtZW50
O2IoYSl9O3JldHVybiB0aGlzfSxjdT0KdE9mZlBhdGg6ZnVuY3Rpb24oYSxiKXt2YXIgYyxhPTNE
YS5zcGxpdCgvWyAsXS8pO2M9M0RhLmxlbmd0aDtpZihjPTNEPTNEPTNEPQo5fHxjPTNEPTNEPTNE
MTEpYVtjLTRdPTNEYVtjLTJdPTNEeihhW2MtMl0pLTEwKmI7cmV0dXJuIGEuam9pbigiICIpfSxz
aGFkb3c9CjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9M0RbXSxlLGY9M0R0aGlzLmVsZW1lbnQsZz0z
RHRoaXMucmVuZGVyZXIsaCxpPTNEZi5zdD0KeWxlLGosaz0zRGYucGF0aCwKLWwsbyxuLHM7ayYm
dHlwZW9mIGsudmFsdWUhPTNEPTNEInN0cmluZyImJihrPTNEIngiKTtvPTNEaztpZihhKXtuPTNE
bShhLndpPQpkdGgsMyk7cz0zRChhLm9wYWNpdHl8fDAuMTUpL247Zm9yKGU9M0QxO2U8PTNEMztl
Kyspe2w9M0RuKjIrMS0yKmU7YyYmKG89M0Q9CnRoaXMuY3V0T2ZmUGF0aChrLnZhbHVlLGwrMC41
KSk7aj0zRFsnPHNoYXBlIGlzU2hhZG93PTNEInRydWUiIHN0cm9rZXdlaWdodD0KPTNEIicsbCwn
IiBmaWxsZWQ9M0QiZmFsc2UiIHBhdGg9M0QiJyxvLCciIGNvb3Jkc2l6ZT0zRCIxMCAxMCIgc3R5
bGU9M0QiJyxmPQouc3R5bGUuY3NzVGV4dCwnIiAvPiddO2g9M0RZKGcucHJlcFZNTChqKSxudWxs
LHtsZWZ0OnooaS5sZWZ0KSttKGEub2Zmc2V0WCw9CjEpLHRvcDp6KGkudG9wKSttKGEub2Zmc2V0
WSwxKX0pO2lmKGMpaC5jdXRPZmY9M0RsKzE7aj0zRFsnPHN0cm9rZSBjb2xvcj0zRD0KIicsYS5j
b2xvcnx8ImJsYWNrIiwnIiBvcGFjaXR5PTNEIicscyplLCciLz4nXTtZKGcucHJlcFZNTChqKSxu
dWxsLG51bGwsaCk7PQpiP2IuZWxlbWVudC5hcHBlbmRDaGlsZChoKToKLWYucGFyZW50Tm9kZS5p
bnNlcnRCZWZvcmUoaCxmKTtkLnB1c2goaCl9dGhpcy5zaGFkb3dzPTNEZH1yZXR1cm4gdGhpc30s
dXBkPQphdGVTaGFkb3dzOnNhLHNldEF0dHI6ZnVuY3Rpb24oYSxiKXtoYj90aGlzLmVsZW1lbnRb
YV09M0RiOnRoaXMuZWxlbWVudC5zZXQ9CkF0dHJpYnV0ZShhLGIpfSxjbGFzc1NldHRlcjpmdW5j
dGlvbihhKXt0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPTNEYX0sZGFzaHN0eT0KbGVTZXR0ZXI6ZnVu
Y3Rpb24oYSxiLGMpeyhjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHJva2UiKVswXXx8WSh0aGlz
LnJlbmRlPQpyZXIucHJlcFZNTChbIjxzdHJva2UvPiJdKSxudWxsLG51bGwsYykpW2JdPTNEYXx8
InNvbGlkIjt0aGlzW2JdPTNEYX0sZFNldHQ9CmVyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0zRHRo
aXMuc2hhZG93cyxhPTNEYXx8W107dGhpcy5kPTNEYS5qb2luKCIgIik7Yy5wYT0KdGg9M0RhPTNE
dGhpcy5wYXRoVG9WTUwoYSk7aWYoZClmb3IoYz0zRGQubGVuZ3RoO2MtLTspZFtjXS5wYXRoPTNE
ZFtjXS5jdXRPPQpmZj8KLXRoaXMuY3V0T2ZmUGF0aChhLGRbY10uY3V0T2ZmKTphO3RoaXMuc2V0
QXR0cihiLGEpfSxmaWxsU2V0dGVyOmZ1bmN0aW9uKGEsPQpiLGMpe3ZhciBkPTNEYy5ub2RlTmFt
ZTtpZihkPTNEPTNEPTNEIlNQQU4iKWMuc3R5bGUuY29sb3I9M0RhO2Vsc2UgaWYoZCE9M0Q9Cj0z
RCJJTUciKWMuZmlsbGVkPTNEYSE9M0Q9M0RRLHRoaXMuc2V0QXR0cigiZmlsbGNvbG9yIix0aGlz
LnJlbmRlcmVyLmNvbG9yKD0KYSxjLGIsdGhpcykpfSxvcGFjaXR5U2V0dGVyOnNhLHJvdGF0aW9u
U2V0dGVyOmZ1bmN0aW9uKGEsYixjKXtjPTNEYy5zdHlsZTt0PQpoaXNbYl09M0RjW2JdPTNEYTtj
LmxlZnQ9M0QtdShlYShhKkNhKSsxKSsicHgiO2MudG9wPTNEdShaKGEqQ2EpKSsicHgifSxzdHI9
Cm9rZVNldHRlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5zZXRBdHRyKCJzdHJva2Vjb2xvciIsdGhp
cy5yZW5kZXJlci5jb2xvcihhLD0KYyxiKSl9LCJzdHJva2Utd2lkdGhTZXR0ZXIiOmZ1bmN0aW9u
KGEsYixjKXtjLnN0cm9rZWQ9M0QhIWE7dGhpc1tiXT0zRGE7aGEoPQphKSYmKGErPTNEInB4Iik7
Ci10aGlzLnNldEF0dHIoInN0cm9rZXdlaWdodCIsYSl9LHRpdGxlU2V0dGVyOmZ1bmN0aW9uKGEs
Yil7dGhpcy5zZXRBdHRyKGIsYT0KKX0sdmlzaWJpbGl0eVNldHRlcjpmdW5jdGlvbihhLGIsYyl7
YT0zRD0zRD0zRCJpbmhlcml0IiYmKGE9M0QidmlzaWJsZSIpO3RoPQppcy5zaGFkb3dzJiZwKHRo
aXMuc2hhZG93cyxmdW5jdGlvbihjKXtjLnN0eWxlW2JdPTNEYX0pO2Mubm9kZU5hbWU9M0Q9M0Q9
M0Q9CiJESVYiJiYoYT0zRGE9M0Q9M0Q9M0QiaGlkZGVuIj8iLTk5OWVtIjowLGhifHwoYy5zdHls
ZVtiXT0zRGE/InZpc2libGUiOiJoaT0KZGRlbiIpLGI9M0QidG9wIik7Yy5zdHlsZVtiXT0zRGF9
LHhTZXR0ZXI6ZnVuY3Rpb24oYSxiLGMpe3RoaXNbYl09M0RhO2I9M0Q9Cj0zRD0zRCJ4Ij9iPTNE
ImxlZnQiOmI9M0Q9M0Q9M0QieSImJihiPTNEInRvcCIpO3RoaXMudXBkYXRlQ2xpcHBpbmc/KHRo
aXNbYj0KXT0zRGEsdGhpcy51cGRhdGVDbGlwcGluZygpKTpjLnN0eWxlW2JdPTNEYX0sekluZGV4
U2V0dGVyOmZ1bmN0aW9uKGEsYixjKXtjPQouc3R5bGVbYl09M0RhfX07WD0zRGthKFAsWCk7WC5w
cm90b3R5cGUueVNldHRlcj0zRAotWC5wcm90b3R5cGUud2lkdGhTZXR0ZXI9M0RYLnByb3RvdHlw
ZS5oZWlnaHRTZXR0ZXI9M0RYLnByb3RvdHlwZS54U2V0dGVyO3Y9CmFyIGdhPTNEe0VsZW1lbnQ6
WCxpc0lFODp3YS5pbmRleE9mKCJNU0lFIDguMCIpPi0xLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCl7
dj0KYXIgZTt0aGlzLmFsaWduZWRPYmplY3RzPTNEW107ZD0zRHRoaXMuY3JlYXRlRWxlbWVudChK
YSkuY3NzKHEodGhpcy5nZXRTdHlsPQplKGQpLHtwb3NpdGlvbjoicmVsYXRpdmUifSkpO2U9M0Rk
LmVsZW1lbnQ7YS5hcHBlbmRDaGlsZChkLmVsZW1lbnQpO3RoaXMuaXM9ClZNTD0zRCEwO3RoaXMu
Ym94PTNEZTt0aGlzLmJveFdyYXBwZXI9M0RkO3RoaXMuY2FjaGU9M0R7fTt0aGlzLnNldFNpemUo
YixjLD0KITEpO2lmKCF5Lm5hbWVzcGFjZXMuaGN2KXt5Lm5hbWVzcGFjZXMuYWRkKCJoY3YiLCJ1
cm46c2NoZW1hcy1taWNyb3NvZnQtY29tPQo6dm1sIik7dHJ5e3kuY3JlYXRlU3R5bGVTaGVldCgp
LmNzc1RleHQ9M0QiaGN2XFw6ZmlsbCwgaGN2XFw6cGF0aCwgaGN2XFw6c2g9CmFwZSwgaGN2XFw6
c3Ryb2tleyBiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTsgZGlzcGxheTogaW5saW5lLWJsb2Nr
OyB9ICJ9Yz0KYXRjaChmKXt5LnN0eWxlU2hlZXRzWzBdLmNzc1RleHQrPTNECi0iaGN2XFw6Zmls
bCwgaGN2XFw6cGF0aCwgaGN2XFw6c2hhcGUsIGhjdlxcOnN0cm9rZXsgYmVoYXZpb3I6dXJsKCNk
ZWZhdWx0Iz0KVk1MKTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9ICJ9fX0saXNIaWRkZW46ZnVu
Y3Rpb24oKXtyZXR1cm4hdGhpcy5ib3gub2ZmPQpzZXRXaWR0aH0sY2xpcFJlY3Q6ZnVuY3Rpb24o
YSxiLGMsZCl7dmFyIGU9M0R0aGlzLmNyZWF0ZUVsZW1lbnQoKSxmPTNEY2EoYSk9CjtyZXR1cm4g
cShlLHttZW1iZXJzOltdLGxlZnQ6KGY/YS54OmEpKzEsdG9wOihmP2EueTpiKSsxLHdpZHRoOihm
P2Eud2lkdGg6Yz0KKS0xLGhlaWdodDooZj9hLmhlaWdodDpkKS0xLGdldENTUzpmdW5jdGlvbihh
KXt2YXIgYj0zRGEuZWxlbWVudCxjPTNEYi5ub2RlPQpOYW1lLGE9M0RhLmludmVydGVkLGQ9M0R0
aGlzLnRvcC0oYz0zRD0zRD0zRCJzaGFwZSI/Yi5vZmZzZXRUb3A6MCksZT0zRHRoaXM9Ci5sZWZ0
LGI9M0RlK3RoaXMud2lkdGgsZj0zRGQrdGhpcy5oZWlnaHQsZD0zRHtjbGlwOiJyZWN0KCIrdShh
P2U6ZCkrInB4LCIrdT0KKGE/Ci1mOmIpKyJweCwiK3UoYT9iOmYpKyJweCwiK3UoYT9kOmUpKyJw
eCkifTshYSYmaGImJmM9M0Q9M0Q9M0QiRElWIiYmcShkLHt3aT0KZHRoOmIrInB4IixoZWlnaHQ6
ZisicHgifSk7cmV0dXJuIGR9LHVwZGF0ZUNsaXBwaW5nOmZ1bmN0aW9uKCl7cChlLm1lbWJlcnMs
PQpmdW5jdGlvbihhKXthLmVsZW1lbnQmJmEuY3NzKGUuZ2V0Q1NTKGEpKX0pfX0pfSxjb2xvcjpm
dW5jdGlvbihhLGIsYyxkKXt2YXI9CiBlPTNEdGhpcyxmLGc9M0QvXnJnYmEvLGgsaSxqPTNEUTth
JiZhLmxpbmVhckdyYWRpZW50P2k9M0QiZ3JhZGllbnQiOmEmJmEucj0KYWRpYWxHcmFkaWVudCYm
KGk9M0QicGF0dGVybiIpO2lmKGkpe3ZhciBrLGwsbz0zRGEubGluZWFyR3JhZGllbnR8fGEucmFk
aWFsPQpHcmFkaWVudCxuLHMsbSxKLEwseD0zRCIiLGE9M0RhLnN0b3BzLHIsdj0zRFtdLHE9M0Rm
dW5jdGlvbigpe2g9M0RbJzxmaWxsIGM9Cm9sb3JzPTNEIicrdi5qb2luKCIsIikrJyIgb3BhY2l0
eT0zRCInLG0sJyIgbzpvcGFjaXR5Mj0zRCInLHMsJyIgdHlwZT0zRCInLD0KaSwnIiAnLHgsJ2Zv
Y3VzPTNEIjEwMCUiIG1ldGhvZD0zRCJhbnkiIC8+J107Ci1ZKGUucHJlcFZNTChoKSxudWxsLG51
bGwsYil9O249M0RhWzBdO3I9M0RhW2EubGVuZ3RoLTFdO25bMF0+MCYmYS51bnNoaWZ0KD0KWzAs
blsxXV0pO3JbMF08MSYmYS5wdXNoKFsxLHJbMV1dKTtwKGEsZnVuY3Rpb24oYSxiKXtnLnRlc3Qo
YVsxXSk/KGY9M0R5YShhPQpbMV0pLGs9M0RmLmdldCgicmdiIiksbD0zRGYuZ2V0KCJhIikpOihr
PTNEYVsxXSxsPTNEMSk7di5wdXNoKGFbMF0qMTAwKyIlICI9CitrKTtiPyhtPTNEbCxKPTNEayk6
KHM9M0RsLEw9M0RrKX0pO2lmKGM9M0Q9M0Q9M0QiZmlsbCIpaWYoaT0zRD0zRD0zRCJncmFkaT0K
ZW50IiljPTNEby54MXx8b1swXXx8MCxhPTNEby55MXx8b1sxXXx8MCxuPTNEby54Mnx8b1syXXx8
MCxvPTNEby55Mnx8b1szXXx8PQowLHg9M0QnYW5nbGU9M0QiJysoOTAtVS5hdGFuKChvLWEpLyhu
LWMpKSoxODAvbWEpKyciJyxxKCk7ZWxzZXt2YXIgaj0zRG8uciw9CnQ9M0RqKjIsdT0zRGoqMix5
PTNEby5jeCxCPTNEby5jeSxuYT0zRGIucmFkaWFsUmVmZXJlbmNlLHcsaj0zRGZ1bmN0aW9uKCl7
bj0KYSYmKHc9M0RkLmdldEJCb3goKSx5Kz0zRChuYVswXS13LngpL3cud2lkdGgtCi0wLjUsQis9
M0QobmFbMV0tdy55KS93LmhlaWdodC0wLjUsdCo9M0RuYVsyXS93LndpZHRoLHUqPTNEbmFbMl0v
dy5oZWlnaHQpOz0KeD0zRCdzcmM9M0QiJytFLmdsb2JhbC5WTUxSYWRpYWxHcmFkaWVudFVSTCsn
IiBzaXplPTNEIicrdCsiLCIrdSsnIiBvcmlnaW49Cj0zRCIwLjUsMC41IiBwb3NpdGlvbj0zRCIn
K3krIiwiK0IrJyIgY29sb3IyPTNEIicrTCsnIiAnO3EoKX07ZC5hZGRlZD9qKCk6ZD0KLm9uQWRk
PTNEajtqPTNESn1lbHNlIGo9M0RrfWVsc2UgaWYoZy50ZXN0KGEpJiZiLnRhZ05hbWUhPTNEPTNE
IklNRyIpZj0zRHlhPQooYSksaD0zRFsiPCIsYywnIG9wYWNpdHk9M0QiJyxmLmdldCgiYSIpLCci
Lz4nXSxZKHRoaXMucHJlcFZNTChoKSxudWxsLG51bGw9CixiKSxqPTNEZi5nZXQoInJnYiIpO2Vs
c2V7aj0zRGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYyk7aWYoai5sZW5ndGgpalswXS5vcD0KYWNp
dHk9M0QxLGpbMF0udHlwZT0zRCJzb2xpZCI7aj0zRGF9cmV0dXJuIGp9LHByZXBWTUw6ZnVuY3Rp
b24oYSl7dmFyIGI9M0R0PQpoaXMuaXNJRTgsYT0zRGEuam9pbigiIik7Yj8KLShhPTNEYS5yZXBs
YWNlKCIvPiIsJyB4bWxucz0zRCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgLz4nKSxh
PTNEYS5pPQpuZGV4T2YoJ3N0eWxlPTNEIicpPTNEPTNEPTNELTE/YS5yZXBsYWNlKCIvPiIsJyBz
dHlsZT0zRCJkaXNwbGF5OmlubGluZS1ibG89CmNrO2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwp
OyIgLz4nKTphLnJlcGxhY2UoJ3N0eWxlPTNEIicsJ3N0eWxlPTNEImRpc3BsYT0KeTppbmxpbmUt
YmxvY2s7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7JykpOmE9M0RhLnJlcGxhY2UoIjwiLCI8
aGN2OiIpO3JlPQp0dXJuIGF9LHRleHQ6dGEucHJvdG90eXBlLmh0bWwscGF0aDpmdW5jdGlvbihh
KXt2YXIgYj0zRHtjb29yZHNpemU6IjEwIDEwIn09CjtMYShhKT9iLmQ9M0RhOmNhKGEpJiZxKGIs
YSk7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudCgic2hhcGUiKS5hdHRyKGIpfSxjaT0KcmNsZTpm
dW5jdGlvbihhLGIsYyl7dmFyIGQ9M0R0aGlzLnN5bWJvbCgiY2lyY2xlIik7aWYoY2EoYSkpYz0z
RGEucixiPTNEYS55PQosYT0zRGEueDtkLmlzQ2lyY2xlPTNECi0hMDtkLnI9M0RjO3JldHVybiBk
LmF0dHIoe3g6YSx5OmJ9KX0sZzpmdW5jdGlvbihhKXt2YXIgYjthJiYoYj0zRHtjbGFzc05hbT0K
ZToiaGlnaGNoYXJ0cy0iK2EsImNsYXNzIjoiaGlnaGNoYXJ0cy0iK2F9KTtyZXR1cm4gdGhpcy5j
cmVhdGVFbGVtZW50KEphKS5hPQp0dHIoYil9LGltYWdlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFy
IGY9M0R0aGlzLmNyZWF0ZUVsZW1lbnQoImltZyIpLmF0dHIoe3M9CnJjOmF9KTthcmd1bWVudHMu
bGVuZ3RoPjEmJmYuYXR0cih7eDpiLHk6Yyx3aWR0aDpkLGhlaWdodDplfSk7cmV0dXJuIGZ9LGNy
ZT0KYXRlRWxlbWVudDpmdW5jdGlvbihhKXtyZXR1cm4gYT0zRD0zRD0zRCJyZWN0Ij90aGlzLnN5
bWJvbChhKTp0YS5wcm90b3R5cGUuPQpjcmVhdGVFbGVtZW50LmNhbGwodGhpcyxhKX0saW52ZXJ0
Q2hpbGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz0zRHRoaXMsZD0zRGIuc3Q9CnlsZSxlPTNEYS50YWdO
YW1lPTNEPTNEPTNEIklNRyImJmEuc3R5bGU7RyhhLHtmbGlwOiJ4IixsZWZ0OnooZC53aWR0aCkt
KGU/ej0KKGUudG9wKToKLTEpLHRvcDp6KGQuaGVpZ2h0KS0oZT96KGUubGVmdCk6MSkscm90YXRp
b246LTkwfSk7cChhLmNoaWxkTm9kZXMsZnVuY3Rpb24oPQpiKXtjLmludmVydENoaWxkKGIsYSl9
KX0sc3ltYm9sczp7YXJjOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9M0RlLnN0YXJ0LGc9Cj0z
RGUuZW5kLGg9M0RlLnJ8fGN8fGQsYz0zRGUuaW5uZXJSLGQ9M0RaKGYpLGk9M0RlYShmKSxqPTNE
WihnKSxrPTNEZWEoZyk7aT0KZihnLWY9M0Q9M0Q9M0QwKXJldHVyblsieCJdO2Y9M0RbIndhIixh
LWgsYi1oLGEraCxiK2gsYStoKmQsYitoKmksYStoKmosYitoPQoqa107ZS5vcGVuJiYhYyYmZi5w
dXNoKCJlIiwiTSIsYSxiKTtmLnB1c2goImF0IixhLWMsYi1jLGErYyxiK2MsYStjKmosYitjKms9
CixhK2MqZCxiK2MqaSwieCIsImUiKTtmLmlzQXJjPTNEITA7cmV0dXJuIGZ9LGNpcmNsZTpmdW5j
dGlvbihhLGIsYyxkLGUpe2UmJj0KKGM9M0RkPTNEMiplLnIpO2UmJmUuaXNDaXJjbGUmJihhLT0z
RGMvMixiLT0zRGQvMik7cmV0dXJuWyJ3YSIsYSxiLGErYyxiK2QsPQphK2MsYitkLzIsYSsKLWMs
YitkLzIsImUiXX0scmVjdDpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiB0YS5wcm90b3R5cGUu
c3ltYm9sc1shcihlKXx8PQohZS5yPyJzcXVhcmUiOiJjYWxsb3V0Il0uY2FsbCgwLGEsYixjLGQs
ZSl9fX07Ui5WTUxSZW5kZXJlcj0zRFg9M0RmdW5jdGlvbig9Cil7dGhpcy5pbml0LmFwcGx5KHRo
aXMsYXJndW1lbnRzKX07WC5wcm90b3R5cGU9M0R3KHRhLnByb3RvdHlwZSxnYSk7WmE9M0RYfT0K
dGEucHJvdG90eXBlLm1lYXN1cmVTcGFuV2lkdGg9M0RmdW5jdGlvbihhLGIpe3ZhciBjPTNEeS5j
cmVhdGVFbGVtZW50KCJzcGFuPQoiKSxkO2Q9M0R5LmNyZWF0ZVRleHROb2RlKGEpO2MuYXBwZW5k
Q2hpbGQoZCk7RyhjLGIpO3RoaXMuYm94LmFwcGVuZENoaWxkKGM9Cik7ZD0zRGMub2Zmc2V0V2lk
dGg7UGEoYyk7cmV0dXJuIGR9O3ZhciBMYjtpZihmYSlSLkNhblZHUmVuZGVyZXI9M0RYPTNEZnVu
Yz0KdGlvbigpe3hhPTNEImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwifSxYLnByb3RvdHlw
ZS5zeW1ib2xzPTNEe30sTGI9M0RmPQp1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3ZhciBhPTNECi1i
Lmxlbmd0aCxkO2ZvcihkPTNEMDtkPGE7ZCsrKWJbZF0oKTtiPTNEW119dmFyIGI9M0RbXTtyZXR1
cm57cHVzaDpmdW5jdGlvbj0KKGMsZCl7Yi5sZW5ndGg9M0Q9M0Q9M0QwJiZRYihkLGEpO2IucHVz
aChjKX19fSgpLFphPTNEWDtTYS5wcm90b3R5cGU9M0R7YWRkPQpMYWJlbDpmdW5jdGlvbigpe3Zh
ciBhPTNEdGhpcy5heGlzLGI9M0RhLm9wdGlvbnMsYz0zRGEuY2hhcnQsZD0zRGEuaG9yaXosZT0K
PTNEYS5jYXRlZ29yaWVzLGY9M0RhLm5hbWVzLGc9M0R0aGlzLnBvcyxoPTNEYi5sYWJlbHMsaT0z
RGEudGlja1Bvc2l0aW9ucyxkPQo9M0RkJiZlJiYhaC5zdGVwJiYhaC5zdGFnZ2VyTGluZXMmJiFo
LnJvdGF0aW9uJiZjLnBsb3RXaWR0aC9pLmxlbmd0aHx8IWQmJig9CmMubWFyZ2luWzNdfHxjLmNo
YXJ0V2lkdGgqMC4zMyksaj0zRGc9M0Q9M0Q9M0RpWzBdLGs9M0RnPTNEPTNEPTNEaVtpLmxlbmd0
aD0KLTFdLGwsZj0zRGU/bShlW2ddLGZbZ10sZyk6ZyxlPTNEdGhpcy5sYWJlbCxvPTNEaS5pbmZv
O2EuaXNEYXRldGltZUF4aXMmJm8mPQomKGw9M0RiLmRhdGVUaW1lTGFiZWxGb3JtYXRzW28uaGln
aGVyUmFua3NbZ118fAotby51bml0TmFtZV0pO3RoaXMuaXNGaXJzdD0zRGo7dGhpcy5pc0xhc3Q9
M0RrO2I9M0RhLmxhYmVsRm9ybWF0dGVyLmNhbGwoe2E9CnhpczphLGNoYXJ0OmMsaXNGaXJzdDpq
LGlzTGFzdDprLGRhdGVUaW1lTGFiZWxGb3JtYXQ6bCx2YWx1ZTphLmlzTG9nP2RhKGlhKD0KZikp
OmZ9KTtnPTNEZCYme3dpZHRoOnYoMSx1KGQtMiooaC5wYWRkaW5nfHwxMCkpKSsicHgifTtnPTNE
cShnLGguc3R5bGUpO2lmPQoocihlKSllJiZlLmF0dHIoe3RleHQ6Yn0pLmNzcyhnKTtlbHNle2w9
M0R7YWxpZ246YS5sYWJlbEFsaWdufTtpZihoYShoLnJvdGE9CnRpb24pKWwucm90YXRpb249M0Ro
LnJvdGF0aW9uO2lmKGQmJmguZWxsaXBzaXMpbC5fY2xpcEhlaWdodD0zRGEubGVuL2kubGVuZz0K
dGg7dGhpcy5sYWJlbD0zRHIoYikmJmguZW5hYmxlZD9jLnJlbmRlcmVyLnRleHQoYiwwLDAsaC51
c2VIVE1MKS5hdHRyKGwpLmNzPQpzKGcpLmFkZChhLmxhYmVsR3JvdXApOm51bGx9fSxnZXRMYWJl
bFNpemU6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMubGFiZWwsCi1iPTNEdGhpcy5heGlzO3JldHVy
biBhP2EuZ2V0QkJveCgpW2IuaG9yaXo/ImhlaWdodCI6IndpZHRoIl06MH0sZ2V0TGFiZWxTaT0K
ZGVzOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLmxhYmVsLmdldEJCb3goKSxiPTNEdGhpcy5heGlz
LGM9M0RiLmhvcml6LGQ9M0RiPQoub3B0aW9ucy5sYWJlbHMsYT0zRGM/YS53aWR0aDphLmhlaWdo
dCxiPTNEYz9kLngtYSp7bGVmdDowLGNlbnRlcjowLjUscmlnaHQ9CjoxfVtiLmxhYmVsQWxpZ25d
OjA7cmV0dXJuW2IsYz9hK2I6YV19LGhhbmRsZU92ZXJmbG93OmZ1bmN0aW9uKGEsYil7dmFyIGM9
Cj0zRCEwLGQ9M0R0aGlzLmF4aXMsZT0zRHRoaXMuaXNGaXJzdCxmPTNEdGhpcy5pc0xhc3QsZz0z
RGQuaG9yaXo/Yi54OmIueSxoPQo9M0RkLnJldmVyc2VkLGk9M0RkLnRpY2tQb3NpdGlvbnMsaj0z
RHRoaXMuZ2V0TGFiZWxTaWRlcygpLGs9M0RqWzBdLGo9M0RqWzE9Cl0sbCxvLG4scz0zRHRoaXMu
bGFiZWwubGluZXx8MDtsPTNEZC5sYWJlbEVkZ2U7bz0zRGQuanVzdGlmeUxhYmVscyYmKGV8fGYp
Oz0KbFtzXT0zRD0zRD0zRHR8fGcraz5sW3NdP2xbc109M0QKLWcrajpvfHwoYz0zRCExKTtpZihv
KXtsPTNEKG89M0RkLmp1c3RpZnlUb1Bsb3QpP2QucG9zOjA7bz0zRG8/bCtkLmxlbjpkLmNoPQph
cnQuY2hhcnRXaWR0aDtkbyBhKz0zRGU/MTotMSxuPTNEZC50aWNrc1tpW2FdXTt3aGlsZShpW2Fd
JiYoIW58fG4ubGFiZWwubGk9Cm5lIT0zRD0zRHMpKTtkPTNEbiYmbi5sYWJlbC54eSYmbi5sYWJl
bC54eS54K24uZ2V0TGFiZWxTaWRlcygpW2U/MDoxXTtlJiYhaD0KfHxmJiZoP2crazxsJiYoZz0z
RGwtayxuJiZnK2o+ZCYmKGM9M0QhMSkpOmcraj5vJiYoZz0zRG8taixuJiZnK2s8ZCYmKGM9M0Qh
PQoxKSk7Yi54PTNEZ31yZXR1cm4gY30sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
IGU9M0R0aGlzLmF4aXMsZj0zRGU9Ci5jaGFydCxnPTNEZCYmZi5vbGRDaGFydEhlaWdodHx8Zi5j
aGFydEhlaWdodDtyZXR1cm57eDphP2UudHJhbnNsYXRlKGIrYyxudT0KbGwsbnVsbCxkKStlLnRy
YW5zQjplLmxlZnQrZS5vZmZzZXQrKGUub3Bwb3NpdGU/KGQmJmYub2xkQ2hhcnRXaWR0aHx8Zi5j
aGFyPQp0V2lkdGgpLWUucmlnaHQtCi1lLmxlZnQ6MCkseTphP2ctZS5ib3R0b20rZS5vZmZzZXQt
KGUub3Bwb3NpdGU/ZS5oZWlnaHQ6MCk6Zy1lLnRyYW5zbGF0ZShiKz0KYyxudWxsLG51bGwsZCkt
ZS50cmFuc0J9fSxnZXRMYWJlbFBvc2l0aW9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7dmFy
IGk9Cj0zRHRoaXMuYXhpcyxqPTNEaS50cmFuc0Esaz0zRGkucmV2ZXJzZWQsbD0zRGkuc3RhZ2dl
ckxpbmVzLG89M0RpLmNoYXJ0LnJlbj0KZGVyZXIuZm9udE1ldHJpY3MoZS5zdHlsZS5mb250U2l6
ZSkuYixuPTNEZS5yb3RhdGlvbixhPTNEYStlLngtKGYmJmQ/ZipqKihrPQo/LTE6MSk6MCksYj0z
RGIrZS55LShmJiYhZD9mKmoqKGs/MTotMSk6MCk7biYmaS5zaWRlPTNEPTNEPTNEMiYmKGItPTNE
by1vKlo9CihuKkNhKSk7IXIoZS55KSYmIW4mJihiKz0zRG8tYy5nZXRCQm94KCkuaGVpZ2h0LzIp
O2lmKGwpYy5saW5lPTNEZy8oaHx8MSklbD0KLGIrPTNEYy5saW5lKihpLmxhYmVsT2Zmc2V0L2wp
O3JldHVybnt4OmEseTpifX0sZ2V0TWFya1BhdGg6ZnVuY3Rpb24oYSxiLGMsPQpkLGUsZil7cmV0
dXJuIGYuY3Jpc3BMaW5lKFsiTSIsCi1hLGIsIkwiLGErKGU/MDotYyksYisoZT9jOjApXSxkKX0s
cmVuZGVyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0zRHRoaXMuYXhpcz0KLGU9M0RkLm9wdGlvbnMs
Zj0zRGQuY2hhcnQucmVuZGVyZXIsZz0zRGQuaG9yaXosaD0zRHRoaXMudHlwZSxpPTNEdGhpcy5s
YWJlPQpsLGo9M0R0aGlzLnBvcyxrPTNEZS5sYWJlbHMsbD0zRHRoaXMuZ3JpZExpbmUsbz0zRGg/
aCsiR3JpZCI6ImdyaWQiLG49M0RoP2g9CisiVGljayI6InRpY2siLHM9M0RlW28rIkxpbmVXaWR0
aCJdLHA9M0RlW28rIkxpbmVDb2xvciJdLEo9M0RlW28rIkxpbmVEYXNoUz0KdHlsZSJdLEw9M0Rl
W24rIkxlbmd0aCJdLG89M0RlW24rIldpZHRoIl18fDAseD0zRGVbbisiQ29sb3IiXSxyPTNEZVtu
KyJQb3NpPQp0aW9uIl0sbj0zRHRoaXMubWFyayx2PTNEay5zdGVwLHE9M0QhMCx1PTNEZC50aWNr
bWFya09mZnNldCx3PTNEdGhpcy5nZXRQb3M9Cml0aW9uKGcsaix1LGIpLHk9M0R3Lngsdz0zRHcu
eSxCPTNEZyYmeT0zRD0zRD0zRGQucG9zK2QubGVufHwhZyYmdz0zRD0zRD0zRD0KZC5wb3M/LTE6
MTt0aGlzLmlzQWN0aXZlPTNEITA7aWYocyl7aj0zRGQuZ2V0UGxvdExpbmVQYXRoKGorCi11LHMq
QixiLCEwKTtpZihsPTNEPTNEPTNEdCl7bD0zRHtzdHJva2U6cCwic3Ryb2tlLXdpZHRoIjpzfTtp
ZihKKWwuZGFzaHN0eT0KbGU9M0RKO2lmKCFoKWwuekluZGV4PTNEMTtpZihiKWwub3BhY2l0eT0z
RDA7dGhpcy5ncmlkTGluZT0zRGw9M0RzP2YucGF0aChqPQopLmF0dHIobCkuYWRkKGQuZ3JpZEdy
b3VwKTpudWxsfWlmKCFiJiZsJiZqKWxbdGhpcy5pc05ldz8iYXR0ciI6ImFuaW1hdGUiXSg9Cntk
Omosb3BhY2l0eTpjfSl9aWYobyYmTClyPTNEPTNEPTNEImluc2lkZSImJihMPTNELUwpLGQub3Bw
b3NpdGUmJihMPTNELUwpLD0KaD0zRHRoaXMuZ2V0TWFya1BhdGgoeSx3LEwsbypCLGcsZiksbj9u
LmFuaW1hdGUoe2Q6aCxvcGFjaXR5OmN9KTp0aGlzLm1hcms9Cj0zRGYucGF0aChoKS5hdHRyKHtz
dHJva2U6eCwic3Ryb2tlLXdpZHRoIjpvLG9wYWNpdHk6Y30pLmFkZChkLmF4aXNHcm91cCk7aT0K
ZihpJiYhaXNOYU4oeSkpaS54eT0zRHc9M0R0aGlzLmdldExhYmVsUG9zaXRpb24oeSx3LGksZyxr
LHUsYSx2KSx0aGlzLmlzRmlyPQpzdCYmIXRoaXMuaXNMYXN0JiYKLSFtKGUuc2hvd0ZpcnN0TGFi
ZWwsMSl8fHRoaXMuaXNMYXN0JiYhdGhpcy5pc0ZpcnN0JiYhbShlLnNob3dMYXN0TGFiZWwsMSk/
PQpxPTNEITE6IWQuaXNSYWRpYWwmJiFrLnN0ZXAmJiFrLnJvdGF0aW9uJiYhYiYmYyE9M0Q9M0Qw
JiYocT0zRHRoaXMuaGFuZGxlT3Y9CmVyZmxvdyhhLHcpKSx2JiZhJXYmJihxPTNEITEpLHEmJiFp
c05hTih3LnkpPyh3Lm9wYWNpdHk9M0RjLGlbdGhpcy5pc05ldz8iYT0KdHRyIjoiYW5pbWF0ZSJd
KHcpLHRoaXMuaXNOZXc9M0QhMSk6aS5hdHRyKCJ5IiwtOTk5OSl9LGRlc3Ryb3k6ZnVuY3Rpb24o
KXtPPQphKHRoaXMsdGhpcy5heGlzKX19O1IuUGxvdExpbmVPckJhbmQ9M0RmdW5jdGlvbihhLGIp
e3RoaXMuYXhpcz0zRGE7aWYoYil0aGk9CnMub3B0aW9ucz0zRGIsdGhpcy5pZD0zRGIuaWR9O1Iu
UGxvdExpbmVPckJhbmQucHJvdG90eXBlPTNEe3JlbmRlcjpmdW5jdGlvbj0KKCl7dmFyIGE9M0R0
aGlzLGI9M0RhLmF4aXMsYz0zRGIuaG9yaXosZD0zRChiLnBvaW50UmFuZ2V8fDApLzIsZT0zRGEu
b3B0aW9uPQpzLGY9M0RlLmxhYmVsLAotZz0zRGEubGFiZWwsaD0zRGUud2lkdGgsaT0zRGUudG8s
aj0zRGUuZnJvbSxrPTNEcihqKSYmcihpKSxsPTNEZS52YWx1ZSxvPQo9M0RlLmRhc2hTdHlsZSxu
PTNEYS5zdmdFbGVtLHM9M0RbXSxwLEo9M0RlLmNvbG9yLEw9M0RlLnpJbmRleCx4PTNEZS5ldmVu
dHM9CixxPTNEe30sdD0zRGIuY2hhcnQucmVuZGVyZXI7Yi5pc0xvZyYmKGo9M0R6YShqKSxpPTNE
emEoaSksbD0zRHphKGwpKTtpZihoKT0Ke2lmKHM9M0RiLmdldFBsb3RMaW5lUGF0aChsLGgpLHE9
M0R7c3Ryb2tlOkosInN0cm9rZS13aWR0aCI6aH0sbylxLmRhc2hzdHlsPQplPTNEb31lbHNlIGlm
KGspe2o9M0R2KGosYi5taW4tZCk7aT0zREMoaSxiLm1heCtkKTtzPTNEYi5nZXRQbG90QmFuZFBh
dGgoaiw9CmksZSk7aWYoSilxLmZpbGw9M0RKO2lmKGUuYm9yZGVyV2lkdGgpcS5zdHJva2U9M0Rl
LmJvcmRlckNvbG9yLHFbInN0cm9rZS13aT0KZHRoIl09M0RlLmJvcmRlcldpZHRofWVsc2UgcmV0
dXJuO2lmKHIoTCkpcS56SW5kZXg9M0RMO2lmKG4paWYocyluLmFuaW1hdGUoPQp7ZDpzfSxudWxs
LG4ub25HZXRQYXRoKTtlbHNle2lmKG4uaGlkZSgpLAotbi5vbkdldFBhdGg9M0RmdW5jdGlvbigp
e24uc2hvdygpfSxnKWEubGFiZWw9M0RnPTNEZy5kZXN0cm95KCl9ZWxzZSBpZihzJiY9CnMubGVu
Z3RoJiYoYS5zdmdFbGVtPTNEbj0zRHQucGF0aChzKS5hdHRyKHEpLmFkZCgpLHgpKWZvcihwIGlu
IGQ9M0RmdW5jdGlvbj0KKGIpe24ub24oYixmdW5jdGlvbihjKXt4W2JdLmFwcGx5KGEsW2NdKX0p
fSx4KWQocCk7aWYoZiYmcihmLnRleHQpJiZzJiZzLmxlPQpuZ3RoJiZiLndpZHRoPjAmJmIuaGVp
Z2h0PjApe2Y9M0R3KHthbGlnbjpjJiZrJiYiY2VudGVyIix4OmM/IWsmJjQ6MTAsdmVydGk9CmNh
bEFsaWduOiFjJiZrJiYibWlkZGxlIix5OmM/az8xNjoxMDprPzY6LTQscm90YXRpb246YyYmIWsm
JjkwfSxmKTtpZighZyl7cT0KPTNEe2FsaWduOmYudGV4dEFsaWdufHxmLmFsaWduLHJvdGF0aW9u
OmYucm90YXRpb259O2lmKHIoTCkpcS56SW5kZXg9M0RMO2EuPQpsYWJlbD0zRGc9M0R0LnRleHQo
Zi50ZXh0LDAsMCxmLnVzZUhUTUwpLmF0dHIocSkuY3NzKGYuc3R5bGUpLmFkZCgpfWI9M0Rbc1s9
CjFdLAotc1s0XSxtKHNbNl0sc1sxXSldO3M9M0Rbc1syXSxzWzVdLG0oc1s3XSxzWzJdKV07Yz0z
RE5hKGIpO2s9M0ROYShzKTtnLmFsaWc9Cm4oZiwhMSx7eDpjLHk6ayx3aWR0aDpCYShiKS1jLGhl
aWdodDpCYShzKS1rfSk7Zy5zaG93KCl9ZWxzZSBnJiZnLmhpZGUoKTtyZT0KdHVybiBhfSxkZXN0
cm95OmZ1bmN0aW9uKCl7amEodGhpcy5heGlzLnBsb3RMaW5lc0FuZEJhbmRzLHRoaXMpO2RlbGV0
ZSB0aGlzPQouYXhpcztPYSh0aGlzKX19O2xhLnByb3RvdHlwZT0zRHtkZWZhdWx0T3B0aW9uczp7
ZGF0ZVRpbWVMYWJlbEZvcm1hdHM6e21pbGw9CmlzZWNvbmQ6IiVIOiVNOiVTLiVMIixzZWNvbmQ6
IiVIOiVNOiVTIixtaW51dGU6IiVIOiVNIixob3VyOiIlSDolTSIsZGF5OiIlZT0KLiAlYiIsd2Vl
azoiJWUuICViIixtb250aDoiJWIgJyV5Iix5ZWFyOiIlWSJ9LGVuZE9uVGljazohMSxncmlkTGlu
ZUNvbG9yOiIjPQpDMEMwQzAiLGxhYmVsczpOLGxpbmVDb2xvcjoiI0MwRDBFMCIsbGluZVdpZHRo
OjEsbWluUGFkZGluZzowLjAxLAotbWF4UGFkZGluZzowLjAxLG1pbm9yR3JpZExpbmVDb2xvcjoi
I0UwRTBFMCIsbWlub3JHcmlkTGluZVdpZHRoOjEsbWlub3JUaWM9CmtDb2xvcjoiI0EwQTBBMCIs
bWlub3JUaWNrTGVuZ3RoOjIsbWlub3JUaWNrUG9zaXRpb246Im91dHNpZGUiLHN0YXJ0T2ZXZWVr
Oj0KMSxzdGFydE9uVGljazohMSx0aWNrQ29sb3I6IiNDMEQwRTAiLHRpY2tMZW5ndGg6MTAsdGlj
a21hcmtQbGFjZW1lbnQ6ImJldHdlPQplbiIsdGlja1BpeGVsSW50ZXJ2YWw6MTAwLHRpY2tQb3Np
dGlvbjoib3V0c2lkZSIsdGlja1dpZHRoOjEsdGl0bGU6e2FsaWduOiI9Cm1pZGRsZSIsc3R5bGU6
e2NvbG9yOiIjNzA3MDcwIn19LHR5cGU6ImxpbmVhciJ9LGRlZmF1bHRZQXhpc09wdGlvbnM6e2Vu
ZE9uVD0KaWNrOiEwLGdyaWRMaW5lV2lkdGg6MSx0aWNrUGl4ZWxJbnRlcnZhbDo3MixzaG93TGFz
dExhYmVsOiEwLGxhYmVsczp7eDotOCx5PQo6M30sbGluZVdpZHRoOjAsbWF4UGFkZGluZzowLjA1
LG1pblBhZGRpbmc6MC4wNSxzdGFydE9uVGljazohMCwKLXRpY2tXaWR0aDowLHRpdGxlOntyb3Rh
dGlvbjoyNzAsdGV4dDoiVmFsdWVzIn0sc3RhY2tMYWJlbHM6e2VuYWJsZWQ6ITEsZm9yPQptYXR0
ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gR2EodGhpcy50b3RhbCwtMSl9LHN0eWxlOk4uc3R5bGV9fSxk
ZWZhdWx0TGVmdEF4aXM9Ck9wdGlvbnM6e2xhYmVsczp7eDotMTUseTpudWxsfSx0aXRsZTp7cm90
YXRpb246MjcwfX0sZGVmYXVsdFJpZ2h0QXhpc09wdGlvbj0Kczp7bGFiZWxzOnt4OjE1LHk6bnVs
bH0sdGl0bGU6e3JvdGF0aW9uOjkwfX0sZGVmYXVsdEJvdHRvbUF4aXNPcHRpb25zOntsYWJlPQps
czp7eDowLHk6MjB9LHRpdGxlOntyb3RhdGlvbjowfX0sZGVmYXVsdFRvcEF4aXNPcHRpb25zOnts
YWJlbHM6e3g6MCx5Oi0xNX09Cix0aXRsZTp7cm90YXRpb246MH19LGluaXQ6ZnVuY3Rpb24oYSxi
KXt2YXIgYz0zRGIuaXNYO3RoaXMuaG9yaXo9M0RhLmludmVydD0KZWQ/IWM6Yzt0aGlzLmNvbGw9
M0QodGhpcy5pc1hBeGlzPTNEYyk/InhBeGlzIjoieUF4aXMiO3RoaXMub3Bwb3NpdGU9M0QKLWIu
b3Bwb3NpdGU7dGhpcy5zaWRlPTNEYi5zaWRlfHwodGhpcy5ob3Jpej90aGlzLm9wcG9zaXRlPzA6
Mjp0aGlzLm9wcG9zaXRlPQo/MTozKTt0aGlzLnNldE9wdGlvbnMoYik7dmFyIGQ9M0R0aGlzLm9w
dGlvbnMsZT0zRGQudHlwZTt0aGlzLmxhYmVsRm9ybWF0dGU9CnI9M0RkLmxhYmVscy5mb3JtYXR0
ZXJ8fHRoaXMuZGVmYXVsdExhYmVsRm9ybWF0dGVyO3RoaXMudXNlck9wdGlvbnM9M0RiO3RoaT0K
cy5taW5QaXhlbFBhZGRpbmc9M0QwO3RoaXMuY2hhcnQ9M0RhO3RoaXMucmV2ZXJzZWQ9M0RkLnJl
dmVyc2VkO3RoaXMuem9vbUVuPQphYmxlZD0zRGQuem9vbUVuYWJsZWQhPTNEPTNEITE7dGhpcy5j
YXRlZ29yaWVzPTNEZC5jYXRlZ29yaWVzfHxlPTNEPTNEPTNEImM9CmF0ZWdvcnkiO3RoaXMubmFt
ZXM9M0RbXTt0aGlzLmlzTG9nPTNEZT0zRD0zRD0zRCJsb2dhcml0aG1pYyI7dGhpcy5pc0RhdGV0
aT0KbWVBeGlzPTNEZT0zRD0zRD0zRCJkYXRldGltZSI7dGhpcy5pc0xpbmtlZD0zRHIoZC5saW5r
ZWRUbyk7dGhpcy50aWNrbWFya09mPQpmc2V0PTNEdGhpcy5jYXRlZ29yaWVzJiZkLnRpY2ttYXJr
UGxhY2VtZW50PTNEPTNEPTNECi0iYmV0d2VlbiI/MC41OjA7dGhpcy50aWNrcz0zRHt9O3RoaXMu
bGFiZWxFZGdlPTNEW107dGhpcy5taW5vclRpY2tzPTNEe307dD0KaGlzLnBsb3RMaW5lc0FuZEJh
bmRzPTNEW107dGhpcy5hbHRlcm5hdGVCYW5kcz0zRHt9O3RoaXMubGVuPTNEMDt0aGlzLm1pblJh
PQpuZ2U9M0R0aGlzLnVzZXJNaW5SYW5nZT0zRGQubWluUmFuZ2V8fGQubWF4Wm9vbTt0aGlzLnJh
bmdlPTNEZC5yYW5nZTt0aGlzLm89CmZmc2V0PTNEZC5vZmZzZXR8fDA7dGhpcy5zdGFja3M9M0R7
fTt0aGlzLm9sZFN0YWNrcz0zRHt9O3RoaXMubWluPTNEdGhpcy5tYT0KeD0zRG51bGw7dGhpcy5j
cm9zc2hhaXI9M0RtKGQuY3Jvc3NoYWlyLHFhKGEub3B0aW9ucy50b29sdGlwLmNyb3NzaGFpcnMp
W2M/PQowOjFdLCExKTt2YXIgZixkPTNEdGhpcy5vcHRpb25zLmV2ZW50cztEYSh0aGlzLGEuYXhl
cyk9M0Q9M0Q9M0QtMSYmKGMmJiF0aGk9CnMuaXNDb2xvckF4aXM/YS5heGVzLnNwbGljZShhLnhB
eGlzLmxlbmd0aCwwLHRoaXMpOmEuYXhlcy5wdXNoKHRoaXMpLGFbdGhpcz0KLmNvbGxdLnB1c2go
dGhpcykpOwotdGhpcy5zZXJpZXM9M0R0aGlzLnNlcmllc3x8W107aWYoYS5pbnZlcnRlZCYmYyYm
dGhpcy5yZXZlcnNlZD0zRD0zRD0zRHQpdGg9CmlzLnJldmVyc2VkPTNEITA7dGhpcy5yZW1vdmVQ
bG90TGluZT0zRHRoaXMucmVtb3ZlUGxvdEJhbmQ9M0R0aGlzLnJlbW92ZVBsbz0KdEJhbmRPckxp
bmU7Zm9yKGYgaW4gZClLKHRoaXMsZixkW2ZdKTtpZih0aGlzLmlzTG9nKXRoaXMudmFsMmxpbj0z
RHphLHRoaXMuPQpsaW4ydmFsPTNEaWF9LHNldE9wdGlvbnM6ZnVuY3Rpb24oYSl7dGhpcy5vcHRp
b25zPTNEdyh0aGlzLmRlZmF1bHRPcHRpb25zLHQ9Cmhpcy5pc1hBeGlzP3t9OnRoaXMuZGVmYXVs
dFlBeGlzT3B0aW9ucyxbdGhpcy5kZWZhdWx0VG9wQXhpc09wdGlvbnMsdGhpcy5kZT0KZmF1bHRS
aWdodEF4aXNPcHRpb25zLHRoaXMuZGVmYXVsdEJvdHRvbUF4aXNPcHRpb25zLHRoaXMuZGVmYXVs
dExlZnRBeGlzT3B0PQppb25zXVt0aGlzLnNpZGVdLHcoRVt0aGlzLmNvbGxdLGEpKX0sZGVmYXVs
dExhYmVsRm9ybWF0dGVyOmZ1bmN0aW9uKCl7dmFyIGE9Cj0zRAotdGhpcy5heGlzLGI9M0R0aGlz
LnZhbHVlLGM9M0RhLmNhdGVnb3JpZXMsZD0zRHRoaXMuZGF0ZVRpbWVMYWJlbEZvcm1hdCxlPQo9
M0RFLmxhbmcubnVtZXJpY1N5bWJvbHMsZj0zRGUmJmUubGVuZ3RoLGcsaD0zRGEub3B0aW9ucy5s
YWJlbHMuZm9ybWF0LGE9M0Q9CmEuaXNMb2c/YjphLnRpY2tJbnRlcnZhbDtpZihoKWc9M0RJYSho
LHRoaXMpO2Vsc2UgaWYoYylnPTNEYjtlbHNlIGlmKGQpZz0zRD0KY2IoZCxiKTtlbHNlIGlmKGYm
JmE+PTNEMUUzKWZvcig7Zi0tJiZnPTNEPTNEPTNEdDspYz0zRE1hdGgucG93KDFFMyxmKzEpLGE+
PQo9M0RjJiZlW2ZdIT0zRD0zRG51bGwmJihnPTNER2EoYi9jLC0xKStlW2ZdKTtnPTNEPTNEPTNE
dCYmKGc9M0RNKGIpPj0zRDFFND89CkdhKGIsMCk6R2EoYiwtMSx0LCIiKSk7cmV0dXJuIGd9LGdl
dFNlcmllc0V4dHJlbWVzOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLD0KYj0zRGEuY2hhcnQ7YS5o
YXNWaXNpYmxlU2VyaWVzPTNEITE7YS5kYXRhTWluPTNEYS5kYXRhTWF4PTNEbnVsbDthLmJ1aWxk
U3RhPQpja3MmJmEuYnVpbGRTdGFja3MoKTtwKGEuc2VyaWVzLGZ1bmN0aW9uKGMpe2lmKGMudmlz
aWJsZXx8Ci0hYi5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcyl7dmFyIGQ7ZD0zRGMu
b3B0aW9ucy50aHJlc2hvbGQ7dmFyIGU7YT0KLmhhc1Zpc2libGVTZXJpZXM9M0QhMDthLmlzTG9n
JiZkPD0zRDAmJihkPTNEbnVsbCk7aWYoYS5pc1hBeGlzKXtpZihkPTNEYy54PQpEYXRhLGQubGVu
Z3RoKWEuZGF0YU1pbj0zREMobShhLmRhdGFNaW4sZFswXSksTmEoZCkpLGEuZGF0YU1heD0zRHYo
bShhLmRhdGE9Ck1heCxkWzBdKSxCYShkKSl9ZWxzZXtjLmdldEV4dHJlbWVzKCk7ZT0zRGMuZGF0
YU1heDtjPTNEYy5kYXRhTWluO2lmKHIoYykmJj0KcihlKSlhLmRhdGFNaW49M0RDKG0oYS5kYXRh
TWluLGMpLGMpLGEuZGF0YU1heD0zRHYobShhLmRhdGFNYXgsZSksZSk7aWYocihkPQopKWlmKGEu
ZGF0YU1pbj49M0RkKWEuZGF0YU1pbj0zRGQsYS5pZ25vcmVNaW5QYWRkaW5nPTNEITA7ZWxzZSBp
ZihhLmRhdGFNYXg9CjxkKWEuZGF0YU1heD0zRGQsYS5pZ25vcmVNYXhQYWRkaW5nPTNEITB9fX0p
fSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxiLGMsZCxlLD0KZil7dmFyIGc9M0QKLTEsaD0zRDAsaT0z
RGQ/dGhpcy5vbGRUcmFuc0E6dGhpcy50cmFuc0EsZD0zRGQ/dGhpcy5vbGRNaW46dGhpcy5taW4s
aj0zRHRoPQppcy5taW5QaXhlbFBhZGRpbmcsZT0zRCh0aGlzLm9wdGlvbnMub3JkaW5hbHx8dGhp
cy5pc0xvZyYmZSkmJnRoaXMubGluMnZhbDs9CmlmKCFpKWk9M0R0aGlzLnRyYW5zQTtpZihjKWcq
PTNELTEsaD0zRHRoaXMubGVuO3RoaXMucmV2ZXJzZWQmJihnKj0zRC0xLGgtPQo9M0RnKih0aGlz
LnNlY3Rvcnx8dGhpcy5sZW4pKTtiPyhhPTNEYSpnK2gsYS09M0RqLGE9M0RhL2krZCxlJiYoYT0z
RHRoaXMubGk9Cm4ydmFsKGEpKSk6KGUmJihhPTNEdGhpcy52YWwybGluKGEpKSxmPTNEPTNEPTNE
ImJldHdlZW4iJiYoZj0zRDAuNSksYT0zRGcqKD0KYS1kKSppK2grZypqKyhoYShmKT9pKmYqdGhp
cy5wb2ludFJhbmdlOjApKTtyZXR1cm4gYX0sdG9QaXhlbHM6ZnVuY3Rpb24oYSxiPQope3JldHVy
biB0aGlzLnRyYW5zbGF0ZShhLCExLCF0aGlzLmhvcml6LG51bGwsITApKyhiPzA6dGhpcy5wb3Mp
fSx0b1ZhbHVlOmY9CnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYS0KLShiPzA6
dGhpcy5wb3MpLCEwLCF0aGlzLmhvcml6LG51bGwsITApfSxnZXRQbG90TGluZVBhdGg6ZnVuY3Rp
b24oYSxiLGMsZCxlPQope3ZhciBmPTNEdGhpcy5jaGFydCxnPTNEdGhpcy5sZWZ0LGg9M0R0aGlz
LnRvcCxpLGosaz0zRGMmJmYub2xkQ2hhcnRIZWlnaHQ9Cnx8Zi5jaGFydEhlaWdodCxsPTNEYyYm
Zi5vbGRDaGFydFdpZHRofHxmLmNoYXJ0V2lkdGgsbztpPTNEdGhpcy50cmFuc0I7ZT0zRD0KbShl
LHRoaXMudHJhbnNsYXRlKGEsbnVsbCxudWxsLGMpKTthPTNEYz0zRHUoZStpKTtpPTNEaj0zRHUo
ay1lLWkpO2lmKGlzTmFOPQooZSkpbz0zRCEwO2Vsc2UgaWYodGhpcy5ob3Jpeil7aWYoaT0zRGgs
aj0zRGstdGhpcy5ib3R0b20sYTxnfHxhPmcrdGhpcy53aWQ9CnRoKW89M0QhMH1lbHNlIGlmKGE9
M0RnLGM9M0RsLXRoaXMucmlnaHQsaTxofHxpPmgrdGhpcy5oZWlnaHQpbz0zRCEwO3JldHVybj0K
IG8mJiFkP251bGw6Zi5yZW5kZXJlci5jcmlzcExpbmUoWyJNIixhLGksIkwiLGMsal0sYnx8MSl9
LGdldExpbmVhclRpY2tQb3NpPQp0aW9uczpmdW5jdGlvbihhLAotYixjKXt2YXIgZCxlPTNEZGEo
VChiL2EpKmEpLGY9M0RkYShLYShjL2EpKmEpLGc9M0RbXTtpZihiPTNEPTNEPTNEYyYmaGEoYik9
CilyZXR1cm5bYl07Zm9yKGI9M0RlO2I8PTNEZjspe2cucHVzaChiKTtiPTNEZGEoYithKTtpZihi
PTNEPTNEPTNEZClicmVhaztkPQo9M0RifXJldHVybiBnfSxnZXRNaW5vclRpY2tQb3NpdGlvbnM6
ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMub3B0aW9ucyxiPTNEdGg9CmlzLnRpY2tQb3NpdGlvbnMs
Yz0zRHRoaXMubWlub3JUaWNrSW50ZXJ2YWwsZD0zRFtdLGU7aWYodGhpcy5pc0xvZyl7ZT0zRGIu
bD0KZW5ndGg7Zm9yKGE9M0QxO2E8ZTthKyspZD0zRGQuY29uY2F0KHRoaXMuZ2V0TG9nVGlja1Bv
c2l0aW9ucyhjLGJbYS0xXSxiW2FdPQosITApKX1lbHNlIGlmKHRoaXMuaXNEYXRldGltZUF4aXMm
JmEubWlub3JUaWNrSW50ZXJ2YWw9M0Q9M0Q9M0QiYXV0byIpZD0zRGQ9Ci5jb25jYXQodGhpcy5n
ZXRUaW1lVGlja3ModGhpcy5ub3JtYWxpemVUaW1lVGlja0ludGVydmFsKGMpLHRoaXMubWluLHRo
aXMubT0KYXgsYS5zdGFydE9mV2VlaykpLGRbMF08dGhpcy5taW4mJgotZC5zaGlmdCgpO2Vsc2Ug
Zm9yKGI9M0R0aGlzLm1pbisoYlswXS10aGlzLm1pbiklYztiPD0zRHRoaXMubWF4O2IrPTNEYylk
LnA9CnVzaChiKTtyZXR1cm4gZH0sYWRqdXN0Rm9yTWluUmFuZ2U6ZnVuY3Rpb24oKXt2YXIgYT0z
RHRoaXMub3B0aW9ucyxiPTNEdGhpcz0KLm1pbixjPTNEdGhpcy5tYXgsZCxlPTNEdGhpcy5kYXRh
TWF4LXRoaXMuZGF0YU1pbj49M0R0aGlzLm1pblJhbmdlLGYsZyxoLGksPQpqO2lmKHRoaXMuaXNY
QXhpcyYmdGhpcy5taW5SYW5nZT0zRD0zRD0zRHQmJiF0aGlzLmlzTG9nKXIoYS5taW4pfHxyKGEu
bWF4KT89CnRoaXMubWluUmFuZ2U9M0RudWxsOihwKHRoaXMuc2VyaWVzLGZ1bmN0aW9uKGEpe2k9
M0RhLnhEYXRhO2ZvcihnPTNEaj0zRGEueD0KSW5jcmVtZW50PzE6aS5sZW5ndGgtMTtnPjA7Zy0t
KWlmKGg9M0RpW2ddLWlbZy0xXSxmPTNEPTNEPTNEdHx8aDxmKWY9M0RofSksPQp0aGlzLm1pblJh
bmdlPTNEQyhmKjUsdGhpcy5kYXRhTWF4LXRoaXMuZGF0YU1pbikpO2lmKGMtYjx0aGlzLm1pblJh
bmdlKXt2YXI9CiBrPTNEdGhpcy5taW5SYW5nZTtkPTNECi0oay1jK2IpLzI7ZD0zRFtiLWQsbShh
Lm1pbixiLWQpXTtpZihlKWRbMl09M0R0aGlzLmRhdGFNaW47Yj0zREJhKGQpO2M9M0RbYj0KK2ss
bShhLm1heCxiK2spXTtpZihlKWNbMl09M0R0aGlzLmRhdGFNYXg7Yz0zRE5hKGMpO2MtYjxrJiYo
ZFswXT0zRGMtayxkWzFdPQo9M0RtKGEubWluLGMtayksYj0zREJhKGQpKX10aGlzLm1pbj0zRGI7
dGhpcy5tYXg9M0RjfSxzZXRBeGlzVHJhbnNsYXRpb246ZnU9Cm5jdGlvbihhKXt2YXIgYj0zRHRo
aXMsYz0zRGIubWF4LWIubWluLGQ9M0RiLmF4aXNQb2ludFJhbmdlfHwwLGUsZj0zRDAsZz0zRD0K
MCxoPTNEYi5saW5rZWRQYXJlbnQsaT0zRCEhYi5jYXRlZ29yaWVzLGo9M0RiLnRyYW5zQTtpZihi
LmlzWEF4aXN8fGl8fGQpaD8oPQpmPTNEaC5taW5Qb2ludE9mZnNldCxnPTNEaC5wb2ludFJhbmdl
UGFkZGluZyk6cChiLnNlcmllcyxmdW5jdGlvbihhKXt2YXIgaD0KPTNEaT8xOmIuaXNYQXhpcz9h
LnBvaW50UmFuZ2U6Yi5heGlzUG9pbnRSYW5nZXx8MCxqPTNEYS5vcHRpb25zLnBvaW50UGxhY2Vt
PQplbnQsbj0zRGEuY2xvc2VzdFBvaW50UmFuZ2U7Ci1oPmMmJihoPTNEMCk7ZD0zRHYoZCxoKTtm
PTNEdihmLEZhKGopPzA6aC8yKTtnPTNEdihnLGo9M0Q9M0Q9M0Qib24iPzA6aCk7IT0KYS5ub1No
YXJlZFRvb2x0aXAmJnIobikmJihlPTNEcihlKT9DKGUsbik6bil9KSxoPTNEYi5vcmRpbmFsU2xv
cGUmJmU/Yi5vcmRpPQpuYWxTbG9wZS9lOjEsYi5taW5Qb2ludE9mZnNldD0zRGYqPTNEaCxiLnBv
aW50UmFuZ2VQYWRkaW5nPTNEZyo9M0RoLGIucG9pbnQ9ClJhbmdlPTNEQyhkLGMpLGIuY2xvc2Vz
dFBvaW50UmFuZ2U9M0RlO2lmKGEpYi5vbGRUcmFuc0E9M0RqO2IudHJhbnNsYXRpb25TbD0Kb3Bl
PTNEYi50cmFuc0E9M0RqPTNEYi5sZW4vKGMrZ3x8MSk7Yi50cmFuc0I9M0RiLmhvcml6P2IubGVm
dDpiLmJvdHRvbTtiLm1pPQpuUGl4ZWxQYWRkaW5nPTNEaipmfSxzZXRUaWNrUG9zaXRpb25zOmZ1
bmN0aW9uKGEpe3ZhciBiPTNEdGhpcyxjPTNEYi5jaGFydCw9CmQ9M0RiLm9wdGlvbnMsZT0zRGIu
aXNMb2csZj0zRGIuaXNEYXRldGltZUF4aXMsZz0zRGIuaXNYQXhpcyxoPTNEYi5pc0xpbmtlZD0K
LGk9M0RiLm9wdGlvbnMudGlja1Bvc2l0aW9uZXIsaj0zRGQubWF4UGFkZGluZywKLWs9M0RkLm1p
blBhZGRpbmcsbD0zRGQudGlja0ludGVydmFsLG89M0RkLm1pblRpY2tJbnRlcnZhbCxuPTNEZC50
aWNrUGl4ZWxJPQpudGVydmFsLHMsJD0zRGIuY2F0ZWdvcmllcztoPyhiLmxpbmtlZFBhcmVudD0z
RGNbYi5jb2xsXVtkLmxpbmtlZFRvXSxjPTNEYi49CmxpbmtlZFBhcmVudC5nZXRFeHRyZW1lcygp
LGIubWluPTNEbShjLm1pbixjLmRhdGFNaW4pLGIubWF4PTNEbShjLm1heCxjLmRhdD0KYU1heCks
ZC50eXBlIT0zRD0zRGIubGlua2VkUGFyZW50Lm9wdGlvbnMudHlwZSYmcmEoMTEsMSkpOihiLm1p
bj0zRG0oYi51c2VyPQpNaW4sZC5taW4sYi5kYXRhTWluKSxiLm1heD0zRG0oYi51c2VyTWF4LGQu
bWF4LGIuZGF0YU1heCkpO2lmKGUpIWEmJkMoYi5taW49CixtKGIuZGF0YU1pbixiLm1pbikpPD0z
RDAmJnJhKDEwLDEpLGIubWluPTNEZGEoemEoYi5taW4pKSxiLm1heD0zRGRhKHphKGIubT0KYXgp
KTtpZihiLnJhbmdlJiZyKGIubWF4KSliLnVzZXJNaW49M0RiLm1pbj0zRHYoYi5taW4sYi5tYXgt
Yi5yYW5nZSksYi51c2VyPQpNYXg9M0RiLm1heCxiLnJhbmdlPTNECi1udWxsO2IuYmVmb3JlUGFk
ZGluZyYmYi5iZWZvcmVQYWRkaW5nKCk7Yi5hZGp1c3RGb3JNaW5SYW5nZSgpO2lmKCEkJiYhYi5h
eD0KaXNQb2ludFJhbmdlJiYhYi51c2VQZXJjZW50YWdlJiYhaCYmcihiLm1pbikmJnIoYi5tYXgp
JiYoYz0zRGIubWF4LWIubWluKSl7PQppZighcihkLm1pbikmJiFyKGIudXNlck1pbikmJmsmJihi
LmRhdGFNaW48MHx8IWIuaWdub3JlTWluUGFkZGluZykpYi5taW4tPQo9M0RjKms7aWYoIXIoZC5t
YXgpJiYhcihiLnVzZXJNYXgpJiZqJiYoYi5kYXRhTWF4PjB8fCFiLmlnbm9yZU1heFBhZGRpbmcp
KWI9Ci5tYXgrPTNEYypqfWlmKGhhKGQuZmxvb3IpKWIubWluPTNEdihiLm1pbixkLmZsb29yKTtp
ZihoYShkLmNlaWxpbmcpKWIubWF4PQo9M0RDKGIubWF4LGQuY2VpbGluZyk7Yi5taW49M0Q9M0Q9
M0RiLm1heHx8Yi5taW49M0Q9M0Q9M0R2b2lkIDB8fGIubWF4PTNEPQo9M0Q9M0R2b2lkIDA/Yi50
aWNrSW50ZXJ2YWw9M0QxOmgmJiFsJiZuPTNEPTNEPTNEYi5saW5rZWRQYXJlbnQub3B0aW9ucy50
aWM9CmtQaXhlbEludGVydmFsP2IudGlja0ludGVydmFsPTNECi1iLmxpbmtlZFBhcmVudC50aWNr
SW50ZXJ2YWw6KGIudGlja0ludGVydmFsPTNEbShsLCQ/MTooYi5tYXgtYi5taW4pKm4vdihiLj0K
bGVuLG4pKSwhcihsKSYmYi5sZW48biYmIXRoaXMuaXNSYWRpYWwmJiF0aGlzLmlzTG9nJiYhJCYm
ZC5zdGFydE9uVGljayYmZC5lPQpuZE9uVGljayYmKHM9M0QhMCxiLnRpY2tJbnRlcnZhbC89M0Q0
KSk7ZyYmIWEmJnAoYi5zZXJpZXMsZnVuY3Rpb24oYSl7YS5wcm89CmNlc3NEYXRhKGIubWluIT0z
RD0zRGIub2xkTWlufHxiLm1heCE9M0Q9M0RiLm9sZE1heCl9KTtiLnNldEF4aXNUcmFuc2xhdGlv
bj0KKCEwKTtiLmJlZm9yZVNldFRpY2tQb3NpdGlvbnMmJmIuYmVmb3JlU2V0VGlja1Bvc2l0aW9u
cygpO2lmKGIucG9zdFByb2Nlc3NUPQppY2tJbnRlcnZhbCliLnRpY2tJbnRlcnZhbD0zRGIucG9z
dFByb2Nlc3NUaWNrSW50ZXJ2YWwoYi50aWNrSW50ZXJ2YWwpO2lmKGI9Ci5wb2ludFJhbmdlKWIu
dGlja0ludGVydmFsPTNEdihiLnBvaW50UmFuZ2UsYi50aWNrSW50ZXJ2YWwpO2lmKCFsJiZiLnRp
Y2tJbj0KdGVydmFsPAotbyliLnRpY2tJbnRlcnZhbD0zRG87aWYoIWYmJiFlJiYhbCliLnRpY2tJ
bnRlcnZhbD0zRG5iKGIudGlja0ludGVydmFsLG51bGw9CixtYihiLnRpY2tJbnRlcnZhbCksZCk7
Yi5taW5vclRpY2tJbnRlcnZhbD0zRGQubWlub3JUaWNrSW50ZXJ2YWw9M0Q9M0Q9M0QiYT0KdXRv
IiYmYi50aWNrSW50ZXJ2YWw/Yi50aWNrSW50ZXJ2YWwvNTpkLm1pbm9yVGlja0ludGVydmFsO2Iu
dGlja1Bvc2l0aW9ucz0KPTNEYT0zRGQudGlja1Bvc2l0aW9ucz9bXS5jb25jYXQoZC50aWNrUG9z
aXRpb25zKTppJiZpLmFwcGx5KGIsW2IubWluLGIubWF4PQpdKTtpZighYSkhYi5vcmRpbmFsUG9z
aXRpb25zJiYoYi5tYXgtYi5taW4pL2IudGlja0ludGVydmFsPnYoMipiLmxlbiwyMDApJiY9CnJh
KDE5LCEwKSxhPTNEZj9iLmdldFRpbWVUaWNrcyhiLm5vcm1hbGl6ZVRpbWVUaWNrSW50ZXJ2YWwo
Yi50aWNrSW50ZXJ2YWwsZD0KLnVuaXRzKSxiLm1pbixiLm1heCxkLnN0YXJ0T2ZXZWVrLGIub3Jk
aW5hbFBvc2l0aW9ucyxiLmNsb3Nlc3RQb2ludFJhbmdlLAotITApOmU/Yi5nZXRMb2dUaWNrUG9z
aXRpb25zKGIudGlja0ludGVydmFsLGIubWluLGIubWF4KTpiLmdldExpbmVhclRpY2tQb3M9Cml0
aW9ucyhiLnRpY2tJbnRlcnZhbCxiLm1pbixiLm1heCkscyYmYS5zcGxpY2UoMSxhLmxlbmd0aC0y
KSxiLnRpY2tQb3NpdGlvbj0Kcz0zRGE7aWYoIWgpZT0zRGFbMF0sZj0zRGFbYS5sZW5ndGgtMV0s
aD0zRGIubWluUG9pbnRPZmZzZXR8fDAsZC5zdGFydE9uVGljPQprP2IubWluPTNEZTpiLm1pbi1o
PmUmJmEuc2hpZnQoKSxkLmVuZE9uVGljaz9iLm1heD0zRGY6Yi5tYXgraDxmJiZhLnBvcCgpLGE9
Ci5sZW5ndGg9M0Q9M0Q9M0QxJiYoZD0zRE0oYi5tYXgpPjFFMTM/MTowLjAwMSxiLm1pbi09M0Rk
LGIubWF4Kz0zRGQpfSxzZXRNYT0KeFRpY2tzOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLmNoYXJ0
LGI9M0RhLm1heFRpY2tzfHx7fSxjPTNEdGhpcy50aWNrUG9zaXRpPQpvbnMsZD0zRHRoaXMuX21h
eFRpY2tzS2V5PTNEW3RoaXMuY29sbCx0aGlzLnBvcyx0aGlzLmxlbl0uam9pbigiLSIpO2lmKCF0
aGk9CnMuaXNMaW5rZWQmJgotIXRoaXMuaXNEYXRldGltZUF4aXMmJmMmJmMubGVuZ3RoPihiW2Rd
fHwwKSYmdGhpcy5vcHRpb25zLmFsaWduVGlja3MhPTNEPQo9M0QhMSliW2RdPTNEYy5sZW5ndGg7
YS5tYXhUaWNrcz0zRGJ9LGFkanVzdFRpY2tBbW91bnQ6ZnVuY3Rpb24oKXt2YXIgYT0zRHQ9Cmhp
cy5fbWF4VGlja3NLZXksYj0zRHRoaXMudGlja1Bvc2l0aW9ucyxjPTNEdGhpcy5jaGFydC5tYXhU
aWNrcztpZihjJiZjW2FdJj0KJiF0aGlzLmlzRGF0ZXRpbWVBeGlzJiYhdGhpcy5jYXRlZ29yaWVz
JiYhdGhpcy5pc0xpbmtlZCYmdGhpcy5vcHRpb25zLmFsaWduPQpUaWNrcyE9M0Q9M0QhMSYmdGhp
cy5taW4hPTNEPTNEdCl7dmFyIGQ9M0R0aGlzLnRpY2tBbW91bnQsZT0zRGIubGVuZ3RoO3RoaXM9
Ci50aWNrQW1vdW50PTNEYT0zRGNbYV07aWYoZTxhKXtmb3IoO2IubGVuZ3RoPGE7KWIucHVzaChk
YShiW2IubGVuZ3RoLTFdK3RoaT0Kcy50aWNrSW50ZXJ2YWwpKTt0aGlzLnRyYW5zQSo9M0QoZS0x
KS8oYS0xKTt0aGlzLm1heD0zRGJbYi5sZW5ndGgtMV19aWYocihkPQopJiZhIT0zRD0zRGQpdGhp
cy5pc0RpcnR5PTNECi0hMH19LHNldFNjYWxlOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLnN0YWNr
cyxiLGMsZCxlO3RoaXMub2xkTWluPTNEdGhpcy5taT0Kbjt0aGlzLm9sZE1heD0zRHRoaXMubWF4
O3RoaXMub2xkQXhpc0xlbmd0aD0zRHRoaXMubGVuO3RoaXMuc2V0QXhpc1NpemUoKTtlPQo9M0R0
aGlzLmxlbiE9M0Q9M0R0aGlzLm9sZEF4aXNMZW5ndGg7cCh0aGlzLnNlcmllcyxmdW5jdGlvbihh
KXtpZihhLmlzRGlydHk9CkRhdGF8fGEuaXNEaXJ0eXx8YS54QXhpcy5pc0RpcnR5KWQ9M0QhMH0p
O2lmKGV8fGR8fHRoaXMuaXNMaW5rZWR8fHRoaXMuZm9yYz0KZVJlZHJhd3x8dGhpcy51c2VyTWlu
IT0zRD0zRHRoaXMub2xkVXNlck1pbnx8dGhpcy51c2VyTWF4IT0zRD0zRHRoaXMub2xkVXNlPQpy
TWF4KXtpZighdGhpcy5pc1hBeGlzKWZvcihiIGluIGEpZm9yKGMgaW4gYVtiXSlhW2JdW2NdLnRv
dGFsPTNEbnVsbCxhW2JdW2M9Cl0uY3VtPTNEMDt0aGlzLmZvcmNlUmVkcmF3PTNEITE7dGhpcy5n
ZXRTZXJpZXNFeHRyZW1lcygpO3RoaXMuc2V0VGlja1Bvc2l0aT0Kb25zKCk7dGhpcy5vbGRVc2Vy
TWluPTNECi10aGlzLnVzZXJNaW47dGhpcy5vbGRVc2VyTWF4PTNEdGhpcy51c2VyTWF4O2lmKCF0
aGlzLmlzRGlydHkpdGhpcy5pc0RpcnR5PQo9M0RlfHx0aGlzLm1pbiE9M0Q9M0R0aGlzLm9sZE1p
bnx8dGhpcy5tYXghPTNEPTNEdGhpcy5vbGRNYXh9ZWxzZSBpZighdGhpcy49CmlzWEF4aXMpe2lm
KHRoaXMub2xkU3RhY2tzKWE9M0R0aGlzLnN0YWNrcz0zRHRoaXMub2xkU3RhY2tzO2ZvcihiIGlu
IGEpZm9yKD0KYyBpbiBhW2JdKWFbYl1bY10uY3VtPTNEYVtiXVtjXS50b3RhbH10aGlzLnNldE1h
eFRpY2tzKCl9LHNldEV4dHJlbWVzOmZ1bmN0PQppb24oYSxiLGMsZCxlKXt2YXIgZj0zRHRoaXMs
Zz0zRGYuY2hhcnQsYz0zRG0oYywhMCksZT0zRHEoZSx7bWluOmEsbWF4OmJ9KTs9CkQoZiwic2V0
RXh0cmVtZXMiLGUsZnVuY3Rpb24oKXtmLnVzZXJNaW49M0RhO2YudXNlck1heD0zRGI7Zi5ldmVu
dEFyZ3M9M0RlOz0KZi5pc0RpcnR5RXh0cmVtZXM9M0QhMDtjJiZnLnJlZHJhdyhkKX0pfSx6b29t
OmZ1bmN0aW9uKGEsYil7dmFyIGM9M0R0aGlzLmRhPQp0YU1pbixkPTNEdGhpcy5kYXRhTWF4LAot
ZT0zRHRoaXMub3B0aW9uczt0aGlzLmFsbG93Wm9vbU91dHNpZGV8fChyKGMpJiZhPD0zREMoYyxt
KGUubWluLGMpKSYmKGE9M0Q9CnQpLHIoZCkmJmI+PTNEdihkLG0oZS5tYXgsZCkpJiYoYj0zRHQp
KTt0aGlzLmRpc3BsYXlCdG49M0RhIT0zRD0zRHR8fGIhPTNEPQo9M0R0O3RoaXMuc2V0RXh0cmVt
ZXMoYSxiLCExLHQse3RyaWdnZXI6Inpvb20ifSk7cmV0dXJuITB9LHNldEF4aXNTaXplOmZ1bmM9
CnRpb24oKXt2YXIgYT0zRHRoaXMuY2hhcnQsYj0zRHRoaXMub3B0aW9ucyxjPTNEYi5vZmZzZXRM
ZWZ0fHwwLGQ9M0R0aGlzLmhvcj0KaXosZT0zRG0oYi53aWR0aCxhLnBsb3RXaWR0aC1jKyhiLm9m
ZnNldFJpZ2h0fHwwKSksZj0zRG0oYi5oZWlnaHQsYS5wbG90SGVpPQpnaHQpLGc9M0RtKGIudG9w
LGEucGxvdFRvcCksYj0zRG0oYi5sZWZ0LGEucGxvdExlZnQrYyksYz0zRC8lJC87Yy50ZXN0KGYp
JiY9CihmPTNEcGFyc2VJbnQoZiwxMCkvMTAwKmEucGxvdEhlaWdodCk7Yy50ZXN0KGcpJiYoZz0z
RHBhcnNlSW50KGcsMTApLzEwMCphLj0KcGxvdEhlaWdodCthLnBsb3RUb3ApOwotdGhpcy5sZWZ0
PTNEYjt0aGlzLnRvcD0zRGc7dGhpcy53aWR0aD0zRGU7dGhpcy5oZWlnaHQ9M0RmO3RoaXMuYm90
dG9tPTNEYS49CmNoYXJ0SGVpZ2h0LWYtZzt0aGlzLnJpZ2h0PTNEYS5jaGFydFdpZHRoLWUtYjt0
aGlzLmxlbj0zRHYoZD9lOmYsMCk7dGhpcy5wbz0Kcz0zRGQ/YjpnfSxnZXRFeHRyZW1lczpmdW5j
dGlvbigpe3ZhciBhPTNEdGhpcy5pc0xvZztyZXR1cm57bWluOmE/ZGEoaWEodGhpPQpzLm1pbikp
OnRoaXMubWluLG1heDphP2RhKGlhKHRoaXMubWF4KSk6dGhpcy5tYXgsZGF0YU1pbjp0aGlzLmRh
dGFNaW4sZGF0YU09CmF4OnRoaXMuZGF0YU1heCx1c2VyTWluOnRoaXMudXNlck1pbix1c2VyTWF4
OnRoaXMudXNlck1heH19LGdldFRocmVzaG9sZDpmdT0KbmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5p
c0xvZyxjPTNEYj9pYSh0aGlzLm1pbik6dGhpcy5taW4sYj0zRGI/aWEodGhpcy5tYXgpPQo6dGhp
cy5tYXg7Yz5hfHxhPTNEPTNEPTNEbnVsbD9hPTNEYzpiPGEmJihhPTNEYik7cmV0dXJuIHRoaXMu
dHJhbnNsYXRlKGEsMCw9CjEsMCwxKX0sYXV0b0xhYmVsQWxpZ246ZnVuY3Rpb24oYSl7YT0zRAot
KG0oYSwwKS10aGlzLnNpZGUqOTArNzIwKSUzNjA7cmV0dXJuIGE+MTUmJmE8MTY1PyJyaWdodCI6
YT4xOTUmJmE8MzQ1PyJsZWY9CnQiOiJjZW50ZXIifSxnZXRPZmZzZXQ6ZnVuY3Rpb24oKXt2YXIg
YT0zRHRoaXMsYj0zRGEuY2hhcnQsYz0zRGIucmVuZGVyZXIsZD0KPTNEYS5vcHRpb25zLGU9M0Rh
LnRpY2tQb3NpdGlvbnMsZj0zRGEudGlja3MsZz0zRGEuaG9yaXosaD0zRGEuc2lkZSxpPTNEYi5p
PQpudmVydGVkP1sxLDAsMywyXVtoXTpoLGosaz0zRDAsbCxvPTNEMCxuPTNEZC50aXRsZSxzPTNE
ZC5sYWJlbHMsJD0zRDAsSj0zRGI9Ci5heGlzT2Zmc2V0LEw9M0RiLmNsaXBPZmZzZXQseD0zRFst
MSwxLDEsLTFdW2hdLHEsdT0zRDEsdz0zRG0ocy5tYXhTdGFnZ2VyTD0KaW5lcyw1KSx5LHosQSxC
LG5hPTNEaD0zRD0zRD0zRDI/Yy5mb250TWV0cmljcyhzLnN0eWxlLmZvbnRTaXplKS5iOjA7YS5o
YXNEPQphdGE9M0RqPTNEYS5oYXNWaXNpYmxlU2VyaWVzfHxyKGEubWluKSYmcihhLm1heCkmJiEh
ZTthLnNob3dBeGlzPTNEYj0zRGp8fG09CihkLnNob3dFbXB0eSwhMCk7YS5zdGFnZ2VyTGluZXM9
M0QKLWEuaG9yaXomJnMuc3RhZ2dlckxpbmVzO2lmKCFhLmF4aXNHcm91cClhLmdyaWRHcm91cD0z
RGMuZygiZ3JpZCIpLmF0dHIoe3pJPQpuZGV4OmQuZ3JpZFpJbmRleHx8MX0pLmFkZCgpLGEuYXhp
c0dyb3VwPTNEYy5nKCJheGlzIikuYXR0cih7ekluZGV4OmQuekluZGU9Cnh8fDJ9KS5hZGQoKSxh
LmxhYmVsR3JvdXA9M0RjLmcoImF4aXMtbGFiZWxzIikuYXR0cih7ekluZGV4OnMuekluZGV4fHw3
fSkuYT0KZGRDbGFzcygiaGlnaGNoYXJ0cy0iK2EuY29sbC50b0xvd2VyQ2FzZSgpKyItbGFiZWxz
IikuYWRkKCk7aWYoanx8YS5pc0xpbmtlPQpkKXthLmxhYmVsQWxpZ249M0RtKHMuYWxpZ258fGEu
YXV0b0xhYmVsQWxpZ24ocy5yb3RhdGlvbikpO3AoZSxmdW5jdGlvbihiKXs9CmZbYl0/ZltiXS5h
ZGRMYWJlbCgpOmZbYl09M0RuZXcgU2EoYSxiKX0pO2lmKGEuaG9yaXomJiFhLnN0YWdnZXJMaW5l
cyYmdyYmIT0Kcy5yb3RhdGlvbil7Zm9yKHE9M0RhLnJldmVyc2VkP1tdLmNvbmNhdChlKS5yZXZl
cnNlKCk6ZTt1PHc7KXtqPTNECi1bXTt5PTNEITE7Zm9yKHM9M0QwO3M8cS5sZW5ndGg7cysrKXo9
M0RxW3NdLEE9M0QoQT0zRGZbel0ubGFiZWwmJmZbel0ubGFiZT0KbC5nZXRCQm94KCkpP0Eud2lk
dGg6MCxCPTNEcyV1LEEmJih6PTNEYS50cmFuc2xhdGUoeiksaltCXSE9M0Q9M0R0JiZ6PGpbQl0m
PQomKHk9M0QhMCksaltCXT0zRHorQSk7aWYoeSl1Kys7ZWxzZSBicmVha31pZih1PjEpYS5zdGFn
Z2VyTGluZXM9M0R1fXAoZSxmdW49CmN0aW9uKGIpe2lmKGg9M0Q9M0Q9M0QwfHxoPTNEPTNEPTNE
Mnx8ezE6ImxlZnQiLDM6InJpZ2h0In1baF09M0Q9M0Q9M0RhLmxhYj0KZWxBbGlnbikkPTNEdihm
W2JdLmdldExhYmVsU2l6ZSgpLCQpfSk7aWYoYS5zdGFnZ2VyTGluZXMpJCo9M0RhLnN0YWdnZXJM
aW5lPQpzLGEubGFiZWxPZmZzZXQ9M0QkfWVsc2UgZm9yKHEgaW4gZilmW3FdLmRlc3Ryb3koKSxk
ZWxldGUgZltxXTtpZihuJiZuLnRleHQ9CiYmbi5lbmFibGVkIT0zRD0zRCExKXtpZighYS5heGlz
VGl0bGUpYS5heGlzVGl0bGU9M0RjLnRleHQobi50ZXh0LDAsMCxuLnVzZT0KSFRNTCkuYXR0cih7
ekluZGV4Ojcscm90YXRpb246bi5yb3RhdGlvbnx8Ci0wLGFsaWduOm4udGV4dEFsaWdufHx7bG93
OiJsZWZ0IixtaWRkbGU6ImNlbnRlciIsaGlnaDoicmlnaHQifVtuLmFsaWduXX0pLj0KYWRkQ2xh
c3MoImhpZ2hjaGFydHMtIit0aGlzLmNvbGwudG9Mb3dlckNhc2UoKSsiLXRpdGxlIikuY3NzKG4u
c3R5bGUpLmFkZChhPQouYXhpc0dyb3VwKSxhLmF4aXNUaXRsZS5pc05ldz0zRCEwO2lmKGIpaz0z
RGEuYXhpc1RpdGxlLmdldEJCb3goKVtnPyJoZWlnaHQ9CiI6IndpZHRoIl0sbz0zRG0obi5tYXJn
aW4sZz81OjEwKSxsPTNEbi5vZmZzZXQ7YS5heGlzVGl0bGVbYj8ic2hvdyI6ImhpZGUiXT0KKCl9
YS5vZmZzZXQ9M0R4Km0oZC5vZmZzZXQsSltoXSk7YS5heGlzVGl0bGVNYXJnaW49M0RtKGwsJCtv
KygkJiZ4KmQubGFiZWxzPQpbZz8ieSI6IngiXS1uYSkpO0pbaF09M0R2KEpbaF0sYS5heGlzVGl0
bGVNYXJnaW4rayt4KmEub2Zmc2V0KTtMW2ldPTNEdihMW2k9Cl0sVChkLmxpbmVXaWR0aC8yKSoy
KX0sZ2V0TGluZVBhdGg6ZnVuY3Rpb24oYSl7dmFyIGI9M0R0aGlzLmNoYXJ0LGM9M0R0aGlzLj0K
b3Bwb3NpdGUsCi1kPTNEdGhpcy5vZmZzZXQsZT0zRHRoaXMuaG9yaXosZj0zRHRoaXMubGVmdCso
Yz90aGlzLndpZHRoOjApK2QsZD0zRGIuY2hhcj0KdEhlaWdodC10aGlzLmJvdHRvbS0oYz90aGlz
LmhlaWdodDowKStkO2MmJihhKj0zRC0xKTtyZXR1cm4gYi5yZW5kZXJlci5jcmlzPQpwTGluZShb
Ik0iLGU/dGhpcy5sZWZ0OmYsZT9kOnRoaXMudG9wLCJMIixlP2IuY2hhcnRXaWR0aC10aGlzLnJp
Z2h0OmYsZT9kOmI9Ci5jaGFydEhlaWdodC10aGlzLmJvdHRvbV0sYSl9LGdldFRpdGxlUG9zaXRp
b246ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMuaG9yaT0KeixiPTNEdGhpcy5sZWZ0LGM9M0R0aGlz
LnRvcCxkPTNEdGhpcy5sZW4sZT0zRHRoaXMub3B0aW9ucy50aXRsZSxmPTNEYT9iOmMsPQpnPTNE
dGhpcy5vcHBvc2l0ZSxoPTNEdGhpcy5vZmZzZXQsaT0zRHooZS5zdHlsZS5mb250U2l6ZXx8MTIp
LGQ9M0R7bG93OmYrKGE9Cj8wOmQpLG1pZGRsZTpmK2QvMixoaWdoOmYrKGE/ZDowKX1bZS5hbGln
bl0sYj0zRChhP2MrdGhpcy5oZWlnaHQ6YikrKGE/MTotMT0KKSooZz8tMToxKSoKLXRoaXMuYXhp
c1RpdGxlTWFyZ2luKyh0aGlzLnNpZGU9M0Q9M0Q9M0QyP2k6MCk7cmV0dXJue3g6YT9kOmIrKGc/
dGhpcy53aWR0PQpoOjApK2grKGUueHx8MCkseTphP2ItKGc/dGhpcy5oZWlnaHQ6MCkraDpkKyhl
Lnl8fDApfX0scmVuZGVyOmZ1bmN0aW9uKCl7dmE9CnIgYT0zRHRoaXMsYj0zRGEuaG9yaXosYz0z
RGEucmV2ZXJzZWQsZD0zRGEuY2hhcnQsZT0zRGQucmVuZGVyZXIsZj0zRGEub3B0aT0Kb25zLGc9
M0RhLmlzTG9nLGg9M0RhLmlzTGlua2VkLGk9M0RhLnRpY2tQb3NpdGlvbnMsaixrPTNEYS5heGlz
VGl0bGUsbD0zRGEuPQp0aWNrcyxvPTNEYS5taW5vclRpY2tzLG49M0RhLmFsdGVybmF0ZUJhbmRz
LHM9M0RmLnN0YWNrTGFiZWxzLG09M0RmLmFsdGVybmE9CnRlR3JpZENvbG9yLEo9M0RhLnRpY2tt
YXJrT2Zmc2V0LEw9M0RmLmxpbmVXaWR0aCx4PTNEZC5oYXNSZW5kZXJlZCYmcihhLm9sZD0KTWlu
KSYmIWlzTmFOKGEub2xkTWluKSxxPTNEYS5oYXNEYXRhLHY9M0RhLnNob3dBeGlzLHUsdz0zRGYu
bGFiZWxzLm92ZXJmbG93PQoseT0zRGEuanVzdGlmeUxhYmVscz0zRGImJnchPTNEPTNECi0hMSx6
O2EubGFiZWxFZGdlLmxlbmd0aD0zRDA7YS5qdXN0aWZ5VG9QbG90PTNEdz0zRD0zRD0zRCJqdXN0
aWZ5IjtwKFtsLG8sbj0KXSxmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlhW2JdLmlzQWN0aXZl
PTNEITF9KTtpZihxfHxoKWlmKGEubWlub3JUaWNrSW50PQplcnZhbCYmIWEuY2F0ZWdvcmllcyYm
cChhLmdldE1pbm9yVGlja1Bvc2l0aW9ucygpLGZ1bmN0aW9uKGIpe29bYl18fChvW2JdPQo9M0Ru
ZXcgU2EoYSxiLCJtaW5vciIpKTt4JiZvW2JdLmlzTmV3JiZvW2JdLnJlbmRlcihudWxsLCEwKTtv
W2JdLnJlbmRlcihudWw9CmwsITEsMSl9KSxpLmxlbmd0aCYmKGo9M0RpLnNsaWNlKCksKGImJmN8
fCFiJiYhYykmJmoucmV2ZXJzZSgpLHkmJihqPTNEai5zbD0KaWNlKDEpLmNvbmNhdChbalswXV0p
KSxwKGosZnVuY3Rpb24oYixjKXt5JiYoYz0zRGM9M0Q9M0Q9M0RqLmxlbmd0aC0xPzA6YysxPQop
O2lmKCFofHxiPj0zRGEubWluJiZiPD0zRGEubWF4KWxbYl18fChsW2JdPTNEbmV3IFNhKGEsYikp
LHgmJmxbYl0uaXNOZXcmJmw9CltiXS5yZW5kZXIoYywKLSEwLDAuMSksbFtiXS5yZW5kZXIoYywh
MSwxKX0pLEomJmEubWluPTNEPTNEPTNEMCYmKGxbLTFdfHwobFstMV09M0RuZXcgU2EoPQphLC0x
LG51bGwsITApKSxsWy0xXS5yZW5kZXIoLTEpKSksbSYmcChpLGZ1bmN0aW9uKGIsYyl7aWYoYyUy
PTNEPTNEPTNEMCYmYjw9CmEubWF4KW5bYl18fChuW2JdPTNEbmV3IFIuUGxvdExpbmVPckJhbmQo
YSkpLHU9M0RiK0osej0zRGlbYysxXSE9M0Q9M0R0P2lbYz0KKzFdK0o6YS5tYXgsbltiXS5vcHRp
b25zPTNEe2Zyb206Zz9pYSh1KTp1LHRvOmc/aWEoeik6eixjb2xvcjptfSxuW2JdLnJlbmRlPQpy
KCksbltiXS5pc0FjdGl2ZT0zRCEwfSksIWEuX2FkZGVkUGxvdExCKXAoKGYucGxvdExpbmVzfHxb
XSkuY29uY2F0KGYucGxvdEI9CmFuZHN8fFtdKSxmdW5jdGlvbihiKXthLmFkZFBsb3RCYW5kT3JM
aW5lKGIpfSksYS5fYWRkZWRQbG90TEI9M0QhMDtwKFtsLG8sbj0KXSxmdW5jdGlvbihhKXt2YXIg
YixjLGU9M0RbXSxmPTNEdmE/dmEuZHVyYXRpb258fDUwMDowLGc9M0RmdW5jdGlvbigpe2Zvcihj
PQo9M0RlLmxlbmd0aDtjLS07KWFbZVtjXV0mJgotIWFbZVtjXV0uaXNBY3RpdmUmJihhW2VbY11d
LmRlc3Ryb3koKSxkZWxldGUgYVtlW2NdXSl9O2ZvcihiIGluIGEpaWYoIWFbYl09Ci5pc0FjdGl2
ZSlhW2JdLnJlbmRlcihiLCExLDApLGFbYl0uaXNBY3RpdmU9M0QhMSxlLnB1c2goYik7YT0zRD0z
RD0zRG58fCFkLj0KaGFzUmVuZGVyZWR8fCFmP2coKTpmJiZzZXRUaW1lb3V0KGcsZil9KTtpZihM
KWI9M0RhLmdldExpbmVQYXRoKEwpLGEuYXhpc0xpPQpuZT9hLmF4aXNMaW5lLmFuaW1hdGUoe2Q6
Yn0pOmEuYXhpc0xpbmU9M0RlLnBhdGgoYikuYXR0cih7c3Ryb2tlOmYubGluZUNvbG89CnIsInN0
cm9rZS13aWR0aCI6TCx6SW5kZXg6N30pLmFkZChhLmF4aXNHcm91cCksYS5heGlzTGluZVt2PyJz
aG93IjoiaGlkZSJdKD0KKTtpZihrJiZ2KWtbay5pc05ldz8iYXR0ciI6ImFuaW1hdGUiXShhLmdl
dFRpdGxlUG9zaXRpb24oKSksay5pc05ldz0zRCExO3MmPQomcy5lbmFibGVkJiZhLnJlbmRlclN0
YWNrVG90YWxzKCk7YS5pc0RpcnR5PTNEITF9LHJlZHJhdzpmdW5jdGlvbigpe3ZhciBhPQo9M0QK
LXRoaXMuY2hhcnQucG9pbnRlcjthJiZhLnJlc2V0KCEwKTt0aGlzLnJlbmRlcigpO3AodGhpcy5w
bG90TGluZXNBbmRCYW5kcyxmPQp1bmN0aW9uKGEpe2EucmVuZGVyKCl9KTtwKHRoaXMuc2VyaWVz
LGZ1bmN0aW9uKGEpe2EuaXNEaXJ0eT0zRCEwfSl9LGRlc3Ryb3k9CjpmdW5jdGlvbihhKXt2YXIg
Yj0zRHRoaXMsYz0zRGIuc3RhY2tzLGQsZT0zRGIucGxvdExpbmVzQW5kQmFuZHM7YXx8VyhiKTtm
bz0KcihkIGluIGMpT2EoY1tkXSksY1tkXT0zRG51bGw7cChbYi50aWNrcyxiLm1pbm9yVGlja3Ms
Yi5hbHRlcm5hdGVCYW5kc10sZnVuPQpjdGlvbihhKXtPYShhKX0pO2ZvcihhPTNEZS5sZW5ndGg7
YS0tOyllW2FdLmRlc3Ryb3koKTtwKCJzdGFja1RvdGFsR3JvdXAsYXg9CmlzTGluZSxheGlzVGl0
bGUsYXhpc0dyb3VwLGNyb3NzLGdyaWRHcm91cCxsYWJlbEdyb3VwIi5zcGxpdCgiLCIpLGZ1bmN0
aW9uKD0KYSl7YlthXSYmKGJbYV09M0RiW2FdLmRlc3Ryb3koKSl9KTt0aGlzLmNyb3NzJiZ0aGlz
LmNyb3NzLmRlc3Ryb3koKX0sCi1kcmF3Q3Jvc3NoYWlyOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5j
cm9zc2hhaXIpaWYoKHIoYil8fCFtKHRoaXMuY3Jvc3NoYWlyLj0Kc25hcCwhMCkpPTNEPTNEPTNE
ITEpdGhpcy5oaWRlQ3Jvc3NoYWlyKCk7ZWxzZXt2YXIgYyxkPTNEdGhpcy5jcm9zc2hhaXIsZT0K
PTNEZC5hbmltYXRpb247bShkLnNuYXAsITApP3IoYikmJihjPTNEdGhpcy5jaGFydC5pbnZlcnRl
ZCE9M0R0aGlzLmhvcml6P2IuPQpwbG90WDp0aGlzLmxlbi1iLnBsb3RZKTpjPTNEdGhpcy5ob3Jp
ej9hLmNoYXJ0WC10aGlzLnBvczp0aGlzLmxlbi1hLmNoYXJ0WSs9CnRoaXMucG9zO2M9M0R0aGlz
LmlzUmFkaWFsP3RoaXMuZ2V0UGxvdExpbmVQYXRoKHRoaXMuaXNYQXhpcz9iLng6bShiLnN0YWNr
WT0KLGIueSkpOnRoaXMuZ2V0UGxvdExpbmVQYXRoKG51bGwsbnVsbCxudWxsLG51bGwsYyk7aWYo
Yz0zRD0zRD0zRG51bGwpdGhpcy5oPQppZGVDcm9zc2hhaXIoKTtlbHNlIGlmKHRoaXMuY3Jvc3Mp
dGhpcy5jcm9zcy5hdHRyKHt2aXNpYmlsaXR5OiJ2aXNpYmxlIn0pW2U9Cj8iYW5pbWF0ZSI6Ci0i
YXR0ciJdKHtkOmN9LGUpO2Vsc2V7ZT0zRHsic3Ryb2tlLXdpZHRoIjpkLndpZHRofHwxLHN0cm9r
ZTpkLmNvbG9yfHwiI0MwQz0KMEMwIix6SW5kZXg6ZC56SW5kZXh8fDJ9O2lmKGQuZGFzaFN0eWxl
KWUuZGFzaHN0eWxlPTNEZC5kYXNoU3R5bGU7dGhpcy5jcm9zPQpzPTNEdGhpcy5jaGFydC5yZW5k
ZXJlci5wYXRoKGMpLmF0dHIoZSkuYWRkKCl9fX0saGlkZUNyb3NzaGFpcjpmdW5jdGlvbigpe3Q9
Cmhpcy5jcm9zcyYmdGhpcy5jcm9zcy5oaWRlKCl9fTtxKGxhLnByb3RvdHlwZSx7Z2V0UGxvdEJh
bmRQYXRoOmZ1bmN0aW9uKGEsYj0KKXt2YXIgYz0zRHRoaXMuZ2V0UGxvdExpbmVQYXRoKGIpLGQ9
M0R0aGlzLmdldFBsb3RMaW5lUGF0aChhKTtkJiZjP2QucHVzaChjPQpbNF0sY1s1XSxjWzFdLGNb
Ml0pOmQ9M0RudWxsO3JldHVybiBkfSxhZGRQbG90QmFuZDpmdW5jdGlvbihhKXt0aGlzLmFkZFBs
b3Q9CkJhbmRPckxpbmUoYSwicGxvdEJhbmRzIil9LGFkZFBsb3RMaW5lOmZ1bmN0aW9uKGEpe3Ro
aXMuYWRkUGxvdEJhbmRPckxpbmUoYSwKLSJwbG90TGluZXMiKX0sYWRkUGxvdEJhbmRPckxpbmU6
ZnVuY3Rpb24oYSxiKXt2YXIgYz0zRChuZXcgUi5QbG90TGluZU9yQmFuPQpkKHRoaXMsYSkpLnJl
bmRlcigpLGQ9M0R0aGlzLnVzZXJPcHRpb25zO2MmJihiJiYoZFtiXT0zRGRbYl18fFtdLGRbYl0u
cHVzaCg9CmEpKSx0aGlzLnBsb3RMaW5lc0FuZEJhbmRzLnB1c2goYykpO3JldHVybiBjfSxyZW1v
dmVQbG90QmFuZE9yTGluZTpmdW5jdGlvbj0KKGEpe2Zvcih2YXIgYj0zRHRoaXMucGxvdExpbmVz
QW5kQmFuZHMsYz0zRHRoaXMub3B0aW9ucyxkPTNEdGhpcy51c2VyT3B0aW9uPQpzLGU9M0RiLmxl
bmd0aDtlLS07KWJbZV0uaWQ9M0Q9M0Q9M0RhJiZiW2VdLmRlc3Ryb3koKTtwKFtjLnBsb3RMaW5l
c3x8W10sZC49CnBsb3RMaW5lc3x8W10sYy5wbG90QmFuZHN8fFtdLGQucGxvdEJhbmRzfHxbXV0s
ZnVuY3Rpb24oYil7Zm9yKGU9M0RiLmxlbmd0aD0KO2UtLTspYltlXS5pZD0zRD0zRD0zRGEmJmph
KGIsYltlXSl9KX19KTtsYS5wcm90b3R5cGUuZ2V0VGltZVRpY2tzPTNEZnVuY3RpPQpvbihhLGIs
Ci1jLGQpe3ZhciBlPTNEW10sZj0zRHt9LGc9M0RFLmdsb2JhbC51c2VVVEMsaCxpPTNEbmV3IERh
dGUoYi1SYSksaj0zRGEudW5pdD0KUmFuZ2Usaz0zRGEuY291bnQ7aWYocihiKSl7aj49M0RBLnNl
Y29uZCYmKGkuc2V0TWlsbGlzZWNvbmRzKDApLGkuc2V0U2Vjb25kPQpzKGo+PTNEQS5taW51dGU/
MDprKlQoaS5nZXRTZWNvbmRzKCkvaykpKTtpZihqPj0zREEubWludXRlKWlbRGJdKGo+PTNEQS5o
b3U9CnI/MDprKlQoaVtwYl0oKS9rKSk7aWYoaj49M0RBLmhvdXIpaVtFYl0oaj49M0RBLmRheT8w
OmsqVChpW3FiXSgpL2spKTtpZihqPj0KPTNEQS5kYXkpaVtzYl0oaj49M0RBLm1vbnRoPzE6aypU
KGlbWGFdKCkvaykpO2o+PTNEQS5tb250aCYmKGlbRmJdKGo+PTNEQS55PQplYXI/MDprKlQoaVtm
Yl0oKS9rKSksaD0zRGlbZ2JdKCkpO2o+PTNEQS55ZWFyJiYoaC09M0RoJWssaVtHYl0oaCkpO2lm
KGo9M0Q9Cj0zRD0zREEud2VlaylpW3NiXShpW1hhXSgpLWlbcmJdKCkrbShkLDEpKTtiPTNEMTtS
YSYmKGk9M0RuZXcgRGF0ZShpLmdldFRpbT0KZSgpK1JhKSk7aD0zRGlbZ2JdKCk7Zm9yKHZhciBk
PTNECi1pLmdldFRpbWUoKSxsPTNEaVtmYl0oKSxvPTNEaVtYYV0oKSxuPTNEZz9SYTooODY0RTUr
aS5nZXRUaW1lem9uZU9mZnNldCgpKj0KNkU0KSU4NjRFNTtkPGM7KWUucHVzaChkKSxqPTNEPTNE
PTNEQS55ZWFyP2Q9M0RlYihoK2IqaywwKTpqPTNEPTNEPTNEQS5tb250PQpoP2Q9M0RlYihoLGwr
YiprKTohZyYmKGo9M0Q9M0Q9M0RBLmRheXx8aj0zRD0zRD0zREEud2Vlayk/ZD0zRGViKGgsbCxv
K2Iqayo9CihqPTNEPTNEPTNEQS5kYXk/MTo3KSk6ZCs9M0RqKmssYisrO2UucHVzaChkKTtwKHZi
KGUsZnVuY3Rpb24oYSl7cmV0dXJuIGo8PQo9M0RBLmhvdXImJmElQS5kYXk9M0Q9M0Q9M0RufSks
ZnVuY3Rpb24oYSl7ZlthXT0zRCJkYXkifSl9ZS5pbmZvPTNEcShhLHtoaWc9CmhlclJhbmtzOmYs
dG90YWxSYW5nZTpqKmt9KTtyZXR1cm4gZX07bGEucHJvdG90eXBlLm5vcm1hbGl6ZVRpbWVUaWNr
SW50ZXJ2YT0KbD0zRGZ1bmN0aW9uKGEsYil7dmFyIGM9M0RifHxbWyJtaWxsaXNlY29uZCIsWzEs
Miw1LDEwLDIwLDI1LDUwLDEwMCwyMDAsNTAwPQpdXSxbInNlY29uZCIsWzEsMiw1LDEwLDE1LDMw
XV0sWyJtaW51dGUiLAotWzEsMiw1LDEwLDE1LDMwXV0sWyJob3VyIixbMSwyLDMsNCw2LDgsMTJd
XSxbImRheSIsWzEsMl1dLFsid2VlayIsWzEsMl1dLFs9CiJtb250aCIsWzEsMiwzLDQsNl1dLFsi
eWVhciIsbnVsbF1dLGQ9M0RjW2MubGVuZ3RoLTFdLGU9M0RBW2RbMF1dLGY9M0RkWzFdLD0KZztm
b3IoZz0zRDA7ZzxjLmxlbmd0aDtnKyspaWYoZD0zRGNbZ10sZT0zREFbZFswXV0sZj0zRGRbMV0s
Y1tnKzFdJiZhPD0zRChlPQoqZltmLmxlbmd0aC0xXStBW2NbZysxXVswXV0pLzIpYnJlYWs7ZT0z
RD0zRD0zREEueWVhciYmYTw1KmUmJihmPTNEWzEsMiw1XSk9CjtjPTNEbmIoYS9lLGYsZFswXT0z
RD0zRD0zRCJ5ZWFyIj92KG1iKGEvZSksMSk6MSk7cmV0dXJue3VuaXRSYW5nZTplLGNvdW50Oj0K
Yyx1bml0TmFtZTpkWzBdfX07bGEucHJvdG90eXBlLmdldExvZ1RpY2tQb3NpdGlvbnM9M0RmdW5j
dGlvbihhLGIsYyxkKXt2YXIgPQplPTNEdGhpcy5vcHRpb25zLGY9M0R0aGlzLmxlbixnPTNEW107
aWYoIWQpdGhpcy5fbWlub3JBdXRvSW50ZXJ2YWw9M0RudWxsO2k9CmYoYT49M0QwLjUpYT0zRHUo
YSksZz0zRHRoaXMuZ2V0TGluZWFyVGlja1Bvc2l0aW9ucyhhLAotYixjKTtlbHNlIGlmKGE+PTNE
MC4wOClmb3IodmFyIGY9M0RUKGIpLGgsaSxqLGssbCxlPTNEYT4wLjM/WzEsMiw0XTphPjAuMTU9
Cj9bMSwyLDQsNiw4XTpbMSwyLDMsNCw1LDYsNyw4LDldO2Y8YysxJiYhbDtmKyspe2k9M0RlLmxl
bmd0aDtmb3IoaD0zRDA7aDxpJj0KJiFsO2grKylqPTNEemEoaWEoZikqZVtoXSksaj5iJiYoIWR8
fGs8PTNEYykmJmcucHVzaChrKSxrPmMmJihsPTNEITApLGs9M0RqPQp9ZWxzZSBpZihiPTNEaWEo
YiksYz0zRGlhKGMpLGE9M0RlW2Q/Im1pbm9yVGlja0ludGVydmFsIjoidGlja0ludGVydmFsIl0s
YT0KPTNEbShhPTNEPTNEPTNEImF1dG8iP251bGw6YSx0aGlzLl9taW5vckF1dG9JbnRlcnZhbCwo
Yy1iKSooZS50aWNrUGl4ZWxJbnRlPQpydmFsLyhkPzU6MSkpLygoZD9mL3RoaXMudGlja1Bvc2l0
aW9ucy5sZW5ndGg6Zil8fDEpKSxhPTNEbmIoYSxudWxsLG1iKGEpKSw9Cmc9M0RVYSh0aGlzLmdl
dExpbmVhclRpY2tQb3NpdGlvbnMoYSxiLGMpLHphKSwhZCl0aGlzLl9taW5vckF1dG9JbnRlcnZh
bD0zRD0KYS81O2lmKCFkKXRoaXMudGlja0ludGVydmFsPTNECi1hO3JldHVybiBnfTt2YXIgTWI9
M0RSLlRvb2x0aXA9M0RmdW5jdGlvbigpe3RoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cz0K
KX07TWIucHJvdG90eXBlPTNEe2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz0zRGIuYm9yZGVyV2lk
dGgsZD0zRGIuc3R5bGUsZT0KPTNEeihkLnBhZGRpbmcpO3RoaXMuY2hhcnQ9M0RhO3RoaXMub3B0
aW9ucz0zRGI7dGhpcy5jcm9zc2hhaXJzPTNEW107dGhpcy5uPQpvdz0zRHt4OjAseTowfTt0aGlz
LmlzSGlkZGVuPTNEITA7dGhpcy5sYWJlbD0zRGEucmVuZGVyZXIubGFiZWwoIiIsMCwwLGIuc2g9
CmFwZXx8ImNhbGxvdXQiLG51bGwsbnVsbCxiLnVzZUhUTUwsbnVsbCwidG9vbHRpcCIpLmF0dHIo
e3BhZGRpbmc6ZSxmaWxsOmIuYj0KYWNrZ3JvdW5kQ29sb3IsInN0cm9rZS13aWR0aCI6YyxyOmIu
Ym9yZGVyUmFkaXVzLHpJbmRleDo4fSkuY3NzKGQpLmNzcyh7cGFkPQpkaW5nOjB9KS5hZGQoKS5h
dHRyKHt5Oi05OTk5fSk7ZmF8fHRoaXMubGFiZWwuc2hhZG93KGIuc2hhZG93KTt0aGlzLnNoYXJl
ZD0KPTNEYi5zaGFyZWR9LAotZGVzdHJveTpmdW5jdGlvbigpe2lmKHRoaXMubGFiZWwpdGhpcy5s
YWJlbD0zRHRoaXMubGFiZWwuZGVzdHJveSgpO2NsZWFyVGk9Cm1lb3V0KHRoaXMuaGlkZVRpbWVy
KTtjbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCl9LG1vdmU6ZnVuY3Rpb24oYSxiLD0K
YyxkKXt2YXIgZT0zRHRoaXMsZj0zRGUubm93LGc9M0RlLm9wdGlvbnMuYW5pbWF0aW9uIT0zRD0z
RCExJiYhZS5pc0hpZGRlbixoPQo9M0RlLmZvbGxvd1BvaW50ZXJ8fGUubGVuPjE7cShmLHt4Omc/
KDIqZi54K2EpLzM6YSx5Omc/KGYueStiKS8yOmIsYW5jaG9yWDo9Cmg/dDpnPygyKmYuYW5jaG9y
WCtjKS8zOmMsYW5jaG9yWTpoP3Q6Zz8oZi5hbmNob3JZK2QpLzI6ZH0pO2UubGFiZWwuYXR0cihm
KT0KO2lmKGcmJihNKGEtZi54KT4xfHxNKGItZi55KT4xKSljbGVhclRpbWVvdXQodGhpcy50b29s
dGlwVGltZW91dCksdGhpcy50b29sPQp0aXBUaW1lb3V0PTNEc2V0VGltZW91dChmdW5jdGlvbigp
e2UmJmUubW92ZShhLGIsYyxkKX0sMzIpfSxoaWRlOmZ1bmN0aW9uKCk9Cnt2YXIgYT0zRAotdGhp
cyxiO2NsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lcik7aWYoIXRoaXMuaXNIaWRkZW4pYj0zRHRo
aXMuY2hhcnQuaG92ZXI9ClBvaW50cyx0aGlzLmhpZGVUaW1lcj0zRHNldFRpbWVvdXQoZnVuY3Rp
b24oKXthLmxhYmVsLmZhZGVPdXQoKTthLmlzSGlkZGVuPQo9M0QhMH0sbSh0aGlzLm9wdGlvbnMu
aGlkZURlbGF5LDUwMCkpLGImJnAoYixmdW5jdGlvbihhKXthLnNldFN0YXRlKCl9KSx0aGk9CnMu
Y2hhcnQuaG92ZXJQb2ludHM9M0RudWxsfSxnZXRBbmNob3I6ZnVuY3Rpb24oYSxiKXt2YXIgYyxk
PTNEdGhpcy5jaGFydCxlPQo9M0RkLmludmVydGVkLGY9M0RkLnBsb3RUb3AsZz0zRDAsaD0zRDAs
aSxhPTNEcWEoYSk7Yz0zRGFbMF0udG9vbHRpcFBvczt0aGk9CnMuZm9sbG93UG9pbnRlciYmYiYm
KGIuY2hhcnRYPTNEPTNEPTNEdCYmKGI9M0RkLnBvaW50ZXIubm9ybWFsaXplKGIpKSxjPTNEWz0K
Yi5jaGFydFgtZC5wbG90TGVmdCxiLmNoYXJ0WS1mXSk7Y3x8KHAoYSxmdW5jdGlvbihhKXtpPTNE
YS5zZXJpZXMueUF4aXM7Zys9Cj0zRGEucGxvdFg7aCs9M0QoYS5wbG90TG93PwotKGEucGxvdExv
dythLnBsb3RIaWdoKS8yOmEucGxvdFkpKyghZSYmaT9pLnRvcC1mOjApfSksZy89M0RhLmxlbmd0
aCxoLz0zRGE9Ci5sZW5ndGgsYz0zRFtlP2QucGxvdFdpZHRoLWg6Zyx0aGlzLnNoYXJlZCYmIWUm
JmEubGVuZ3RoPjEmJmI/Yi5jaGFydFktZjplPz0KZC5wbG90SGVpZ2h0LWc6aF0pO3JldHVybiBV
YShjLHUpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9M0R0aGlzPQouY2hhcnQs
ZT0zRHRoaXMuZGlzdGFuY2UsZj0zRHt9LGcsaD0zRFsieSIsZC5jaGFydEhlaWdodCxiLGMucGxv
dFkrZC5wbG90VG89CnBdLGk9M0RbIngiLGQuY2hhcnRXaWR0aCxhLGMucGxvdFgrZC5wbG90TGVm
dF0saj0zRGMudHRCZWxvd3x8ZC5pbnZlcnRlZCYmIT0KYy5uZWdhdGl2ZXx8IWQuaW52ZXJ0ZWQm
JmMubmVnYXRpdmUsaz0zRGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBnPTNEYzxkLWUsYj0KPTNEZCtl
K2M8YixjPTNEZC1lLWM7ZCs9M0RlO2lmKGomJmIpZlthXT0zRGQ7ZWxzZSBpZighaiYmZylmW2Fd
PTNEYztlbHNlIGlmPQooZylmW2FdPTNEYztlbHNlIGlmKGIpZlthXT0zRAotZDtlbHNlIHJldHVy
biExfSxsPTNEZnVuY3Rpb24oYSxiLGMsZCl7aWYoZDxlfHxkPmItZSlyZXR1cm4hMTtlbHNlIGZb
YV09M0Q9CmQ8Yy8yPzE6ZD5iLWMvMj9iLWMtMjpkLWMvMn0sbz0zRGZ1bmN0aW9uKGEpe3ZhciBi
PTNEaDtoPTNEaTtpPTNEYjtnPTNEYX0sbj0KPTNEZnVuY3Rpb24oKXtrLmFwcGx5KDAsaCkhPTNE
PTNEITE/bC5hcHBseSgwLGkpPTNEPTNEPTNEITEmJiFnJiYobyghMCksbigpPQopOmc/Zi54PTNE
Zi55PTNEMDoobyghMCksbigpKX07KGQuaW52ZXJ0ZWR8fHRoaXMubGVuPjEpJiZvKCk7bigpO3Jl
dHVybiBmfSw9CmRlZmF1bHRGb3JtYXR0ZXI6ZnVuY3Rpb24oYSl7dmFyIGI9M0R0aGlzLnBvaW50
c3x8cWEodGhpcyksYz0zRGJbMF0uc2VyaWVzLD0KZDtkPTNEW2EudG9vbHRpcEhlYWRlckZvcm1h
dHRlcihiWzBdKV07cChiLGZ1bmN0aW9uKGEpe2M9M0RhLnNlcmllcztkLnB1c2goPQpjLnRvb2x0
aXBGb3JtYXR0ZXImJmMudG9vbHRpcEZvcm1hdHRlcihhKXx8YS5wb2ludC50b29sdGlwRm9ybWF0
dGVyKGMudG9vbHQ9CmlwT3B0aW9ucy5wb2ludEZvcm1hdCkpfSk7Ci1kLnB1c2goYS5vcHRpb25z
LmZvb3RlckZvcm1hdHx8IiIpO3JldHVybiBkLmpvaW4oIiIpfSxyZWZyZXNoOmZ1bmN0aW9uKGEs
Yj0KKXt2YXIgYz0zRHRoaXMuY2hhcnQsZD0zRHRoaXMubGFiZWwsZT0zRHRoaXMub3B0aW9ucyxm
LGcsaD0zRHt9LGksaj0zRFtdO2k9Cj0zRGUuZm9ybWF0dGVyfHx0aGlzLmRlZmF1bHRGb3JtYXR0
ZXI7dmFyIGg9M0RjLmhvdmVyUG9pbnRzLGssbD0zRHRoaXMuc2hhcj0KZWQ7Y2xlYXJUaW1lb3V0
KHRoaXMuaGlkZVRpbWVyKTt0aGlzLmZvbGxvd1BvaW50ZXI9M0RxYShhKVswXS5zZXJpZXMudG9v
bHRpPQpwT3B0aW9ucy5mb2xsb3dQb2ludGVyO2c9M0R0aGlzLmdldEFuY2hvcihhLGIpO2Y9M0Rn
WzBdO2c9M0RnWzFdO2wmJighYS5zZXI9Cmllc3x8IWEuc2VyaWVzLm5vU2hhcmVkVG9vbHRpcCk/
KGMuaG92ZXJQb2ludHM9M0RhLGgmJnAoaCxmdW5jdGlvbihhKXthLnNldD0KU3RhdGUoKX0pLHAo
YSxmdW5jdGlvbihhKXthLnNldFN0YXRlKCJob3ZlciIpO2oucHVzaChhLmdldExhYmVsQ29uZmln
KCkpfSksPQpoPTNEe3g6YVswXS5jYXRlZ29yeSwKLXk6YVswXS55fSxoLnBvaW50cz0zRGosdGhp
cy5sZW49M0RqLmxlbmd0aCxhPTNEYVswXSk6aD0zRGEuZ2V0TGFiZWxDb25maWcoPQopO2k9M0Rp
LmNhbGwoaCx0aGlzKTtoPTNEYS5zZXJpZXM7dGhpcy5kaXN0YW5jZT0zRG0oaC50b29sdGlwT3B0
aW9ucy5kaXN0YW49CmNlLDE2KTtpPTNEPTNEPTNEITE/dGhpcy5oaWRlKCk6KHRoaXMuaXNIaWRk
ZW4mJihiYihkKSxkLmF0dHIoIm9wYWNpdHkiLDEpLj0Kc2hvdygpKSxkLmF0dHIoe3RleHQ6aX0p
LGs9M0RlLmJvcmRlckNvbG9yfHxhLmNvbG9yfHxoLmNvbG9yfHwiIzYwNjA2MCIsZC5hPQp0dHIo
e3N0cm9rZTprfSksdGhpcy51cGRhdGVQb3NpdGlvbih7cGxvdFg6ZixwbG90WTpnLG5lZ2F0aXZl
OmEubmVnYXRpdmUsdHQ9CkJlbG93OmEudHRCZWxvd30pLHRoaXMuaXNIaWRkZW49M0QhMSk7RChj
LCJ0b29sdGlwUmVmcmVzaCIse3RleHQ6aSx4OmYrYy5wbD0Kb3RMZWZ0LHk6ZytjLnBsb3RUb3As
Ym9yZGVyQ29sb3I6a30pfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj0zRHRoPQpp
cy5jaGFydCwKLWM9M0R0aGlzLmxhYmVsLGM9M0QodGhpcy5vcHRpb25zLnBvc2l0aW9uZXJ8fHRo
aXMuZ2V0UG9zaXRpb24pLmNhbGwodGhpcyxjPQoud2lkdGgsYy5oZWlnaHQsYSk7dGhpcy5tb3Zl
KHUoYy54KSx1KGMueSksYS5wbG90WCtiLnBsb3RMZWZ0LGEucGxvdFkrYi5wbG89CnRUb3ApfSx0
b29sdGlwSGVhZGVyRm9ybWF0dGVyOmZ1bmN0aW9uKGEpe3ZhciBiPTNEYS5zZXJpZXMsYz0zRGIu
dG9vbHRpcE9wdD0KaW9ucyxkPTNEYy5kYXRlVGltZUxhYmVsRm9ybWF0cyxlPTNEYy54RGF0ZUZv
cm1hdCxmPTNEYi54QXhpcyxnPTNEZiYmZi5vcHRpPQpvbnMudHlwZT0zRD0zRD0zRCJkYXRldGlt
ZSImJmhhKGEua2V5KSxjPTNEYy5oZWFkZXJGb3JtYXQsZj0zRGYmJmYuY2xvc2VzdFA9Cm9pbnRS
YW5nZSxoO2lmKGcmJiFlKXtpZihmKWZvcihoIGluIEEpe2lmKEFbaF0+PTNEZnx8QVtoXTw9M0RB
LmRheSYmYS5rZXklQT0KW2hdPjApe2U9M0RkW2hdO2JyZWFrfX1lbHNlIGU9M0RkLmRheTtlPTNE
ZXx8ZC55ZWFyfWcmJmUmJihjPTNEYy5yZXBsYWNlKCJ7PQpwb2ludC5rZXl9Iiwie3BvaW50Lmtl
eToiKwotZSsifSIpKTtyZXR1cm4gSWEoYyx7cG9pbnQ6YSxzZXJpZXM6Yn0pfX07dmFyIG9hOyRh
PTNEeS5kb2N1bWVudEVsZW1lbnQub249CnRvdWNoc3RhcnQhPTNEPTNEdDt2YXIgV2E9M0RSLlBv
aW50ZXI9M0RmdW5jdGlvbihhLGIpe3RoaXMuaW5pdChhLGIpfTtXYS5wcj0Kb3RvdHlwZT0zRHtp
bml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9M0RiLmNoYXJ0LGQ9M0RjLmV2ZW50cyxlPTNEZmE/IiI6
Yy56b29tPQpUeXBlLGM9M0RhLmludmVydGVkLGY7dGhpcy5vcHRpb25zPTNEYjt0aGlzLmNoYXJ0
PTNEYTt0aGlzLnpvb21YPTNEZj0zRC94Ly49CnRlc3QoZSk7dGhpcy56b29tWT0zRGU9M0QveS8u
dGVzdChlKTt0aGlzLnpvb21Ib3I9M0RmJiYhY3x8ZSYmYzt0aGlzLnpvb21WZT0KcnQ9M0RlJiYh
Y3x8ZiYmYzt0aGlzLmhhc1pvb209M0RmfHxlO3RoaXMucnVuQ2hhcnRDbGljaz0zRGQmJiEhZC5j
bGljazt0aGlzPQoucGluY2hEb3duPTNEW107dGhpcy5sYXN0VmFsaWRUb3VjaD0zRHt9O2lmKFIu
VG9vbHRpcCYmYi50b29sdGlwLmVuYWJsZWQpYS49CnRvb2x0aXA9M0RuZXcgTWIoYSxiLnRvb2x0
aXApLAotdGhpcy5mb2xsb3dUb3VjaE1vdmU9M0RiLnRvb2x0aXAuZm9sbG93VG91Y2hNb3ZlO3Ro
aXMuc2V0RE9NRXZlbnRzKCl9LG5vcm09CmFsaXplOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxhPTNE
YXx8d2luZG93LmV2ZW50LGE9M0RTYihhKTtpZighYS50YXJnZXQpYS50YT0KcmdldD0zRGEuc3Jj
RWxlbWVudDtkPTNEYS50b3VjaGVzP2EudG91Y2hlcy5sZW5ndGg/YS50b3VjaGVzLml0ZW0oMCk6
YS5jaGFuPQpnZWRUb3VjaGVzWzBdOmE7aWYoIWIpdGhpcy5jaGFydFBvc2l0aW9uPTNEYj0zRFJi
KHRoaXMuY2hhcnQuY29udGFpbmVyKTtkLnA9CmFnZVg9M0Q9M0Q9M0R0PyhjPTNEdihhLngsYS5j
bGllbnRYLWIubGVmdCksZD0zRGEueSk6KGM9M0RkLnBhZ2VYLWIubGVmdCxkPQo9M0RkLnBhZ2VZ
LWIudG9wKTtyZXR1cm4gcShhLHtjaGFydFg6dShjKSxjaGFydFk6dShkKX0pfSxnZXRDb29yZGlu
YXRlczpmdW49CmN0aW9uKGEpe3ZhciBiPTNEe3hBeGlzOltdLHlBeGlzOltdfTtwKHRoaXMuY2hh
cnQuYXhlcyxmdW5jdGlvbihjKXtiW2MuaXNYQT0KeGlzPyJ4QXhpcyI6Ci0ieUF4aXMiXS5wdXNo
KHtheGlzOmMsdmFsdWU6Yy50b1ZhbHVlKGFbYy5ob3Jpej8iY2hhcnRYIjoiY2hhcnRZIl0pfSl9
KTtyZT0KdHVybiBifSxnZXRJbmRleDpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMuY2hhcnQ7cmV0
dXJuIGIuaW52ZXJ0ZWQ/Yi5wbG90SGVpPQpnaHQrYi5wbG90VG9wLWEuY2hhcnRZOmEuY2hhcnRY
LWIucGxvdExlZnR9LHJ1blBvaW50QWN0aW9uczpmdW5jdGlvbihhKXt2YXI9CiBiPTNEdGhpcy5j
aGFydCxjPTNEYi5zZXJpZXMsZD0zRGIudG9vbHRpcCxlLGYsZz0zRGIuaG92ZXJQb2ludCxoPTNE
Yi5ob3Zlcj0KU2VyaWVzLGksaixrPTNEYi5jaGFydFdpZHRoLGw9M0R0aGlzLmdldEluZGV4KGEp
O2lmKGQmJnRoaXMub3B0aW9ucy50b29sdGlwPQouc2hhcmVkJiYoIWh8fCFoLm5vU2hhcmVkVG9v
bHRpcCkpe2Y9M0RbXTtpPTNEYy5sZW5ndGg7Zm9yKGo9M0QwO2o8aTtqKyspaWY9CihjW2pdLnZp
c2libGUmJmNbal0ub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nIT0zRD0zRCExJiYhY1tqXS5u
b1NoYXJlZFRvbz0KbHRpcCYmCi1jW2pdLnNpbmd1bGFyVG9vbHRpcHMhPTNEPTNEITAmJmNbal0u
dG9vbHRpcFBvaW50cy5sZW5ndGgmJihlPTNEY1tqXS50b29sdD0KaXBQb2ludHNbbF0pJiZlLnNl
cmllcyllLl9kaXN0PTNETShsLWUuY2xpZW50WCksaz0zREMoayxlLl9kaXN0KSxmLnB1c2goZSk7
PQpmb3IoaT0zRGYubGVuZ3RoO2ktLTspZltpXS5fZGlzdD5rJiZmLnNwbGljZShpLDEpO2lmKGYu
bGVuZ3RoJiZmWzBdLmNsaWVudFg9CiE9M0Q9M0R0aGlzLmhvdmVyWClkLnJlZnJlc2goZixhKSx0
aGlzLmhvdmVyWD0zRGZbMF0uY2xpZW50WH1jPTNEaCYmaC50b29sdD0KaXBPcHRpb25zLmZvbGxv
d1BvaW50ZXI7aWYoaCYmaC50cmFja2VyJiYhYyl7aWYoKGU9M0RoLnRvb2x0aXBQb2ludHNbbF0p
JiZlPQohPTNEPTNEZyllLm9uTW91c2VPdmVyKGEpfWVsc2UgZCYmYyYmIWQuaXNIaWRkZW4mJiho
PTNEZC5nZXRBbmNob3IoW3t9XSxhKSw9CmQudXBkYXRlUG9zaXRpb24oe3Bsb3RYOmhbMF0scGxv
dFk6aFsxXX0pKTtpZihkJiYhdGhpcy5fb25Eb2N1bWVudE1vdXNlTW92ZT0KKXRoaXMuX29uRG9j
dW1lbnRNb3VzZU1vdmU9M0QKLWZ1bmN0aW9uKGEpe2lmKFZbb2FdKVZbb2FdLnBvaW50ZXIub25E
b2N1bWVudE1vdXNlTW92ZShhKX0sSyh5LCJtb3VzZW1vdmUiPQosdGhpcy5fb25Eb2N1bWVudE1v
dXNlTW92ZSk7cChiLmF4ZXMsZnVuY3Rpb24oYil7Yi5kcmF3Q3Jvc3NoYWlyKGEsbShlLGcpKX09
Cil9LHJlc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5jaGFydCxjPTNEYi5ob3ZlclNlcmll
cyxkPTNEYi5ob3ZlclBvaW50LD0KZT0zRGIudG9vbHRpcCxmPTNEZSYmZS5zaGFyZWQ/Yi5ob3Zl
clBvaW50czpkOyhhPTNEYSYmZSYmZikmJnFhKGYpWzBdLnBsb3RYPQo9M0Q9M0Q9M0R0JiYoYT0z
RCExKTtpZihhKWUucmVmcmVzaChmKSxkJiZkLnNldFN0YXRlKGQuc3RhdGUsITApO2Vsc2V7aWYo
ZCk9CmQub25Nb3VzZU91dCgpO2lmKGMpYy5vbk1vdXNlT3V0KCk7ZSYmZS5oaWRlKCk7aWYodGhp
cy5fb25Eb2N1bWVudE1vdXNlTW92ZT0KKVcoeSwibW91c2Vtb3ZlIix0aGlzLl9vbkRvY3VtZW50
TW91c2VNb3ZlKSx0aGlzLl9vbkRvY3VtZW50TW91c2VNb3ZlPTNEbnVsPQpsOwotcChiLmF4ZXMs
ZnVuY3Rpb24oYSl7YS5oaWRlQ3Jvc3NoYWlyKCl9KTt0aGlzLmhvdmVyWD0zRG51bGx9fSxzY2Fs
ZUdyb3Vwczo9CmZ1bmN0aW9uKGEsYil7dmFyIGM9M0R0aGlzLmNoYXJ0LGQ7cChjLnNlcmllcyxm
dW5jdGlvbihlKXtkPTNEYXx8ZS5nZXRQbG90Qj0Kb3goKTtlLnhBeGlzJiZlLnhBeGlzLnpvb21F
bmFibGVkJiYoZS5ncm91cC5hdHRyKGQpLGUubWFya2VyR3JvdXAmJihlLm1hcmtlPQpyR3JvdXAu
YXR0cihkKSxlLm1hcmtlckdyb3VwLmNsaXAoYj9jLmNsaXBSZWN0Om51bGwpKSxlLmRhdGFMYWJl
bHNHcm91cCYmZS49CmRhdGFMYWJlbHNHcm91cC5hdHRyKGQpKX0pO2MuY2xpcFJlY3QuYXR0cihi
fHxjLmNsaXBCb3gpfSxkcmFnU3RhcnQ6ZnVuY3Rpbz0KbihhKXt2YXIgYj0zRHRoaXMuY2hhcnQ7
Yi5tb3VzZUlzRG93bj0zRGEudHlwZTtiLmNhbmNlbENsaWNrPTNEITE7Yi5tb3VzZURvPQp3blg9
M0R0aGlzLm1vdXNlRG93blg9M0RhLmNoYXJ0WDtiLm1vdXNlRG93blk9M0R0aGlzLm1vdXNlRG93
blk9M0RhLmNoYXJ0WX0sCi1kcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5jaGFydCxjPTNE
Yi5vcHRpb25zLmNoYXJ0LGQ9M0RhLmNoYXJ0WCxlPTNEYT0KLmNoYXJ0WSxmPTNEdGhpcy56b29t
SG9yLGc9M0R0aGlzLnpvb21WZXJ0LGg9M0RiLnBsb3RMZWZ0LGk9M0RiLnBsb3RUb3Asaj0KPTNE
Yi5wbG90V2lkdGgsaz0zRGIucGxvdEhlaWdodCxsLG89M0R0aGlzLm1vdXNlRG93blgsbj0zRHRo
aXMubW91c2VEb3duWTtkPQo8aD9kPTNEaDpkPmgraiYmKGQ9M0RoK2opO2U8aT9lPTNEaTplPmkr
ayYmKGU9M0RpK2spO3RoaXMuaGFzRHJhZ2dlZD0zRE1hdGg9Ci5zcXJ0KE1hdGgucG93KG8tZCwy
KStNYXRoLnBvdyhuLWUsMikpO2lmKHRoaXMuaGFzRHJhZ2dlZD4xMCl7bD0zRGIuaXNJbnNpZD0K
ZVBsb3Qoby1oLG4taSk7aWYoYi5oYXNDYXJ0ZXNpYW5TZXJpZXMmJih0aGlzLnpvb21YfHx0aGlz
Lnpvb21ZKSYmbCYmIXRoaXMuPQpzZWxlY3Rpb25NYXJrZXIpdGhpcy5zZWxlY3Rpb25NYXJrZXI9
M0RiLnJlbmRlcmVyLnJlY3QoaCxpLGY/MTpqLGc/MTprLDApLmE9CnR0cih7ZmlsbDpjLnNlbGVj
dGlvbk1hcmtlckZpbGx8fAotInJnYmEoNjksMTE0LDE2NywwLjI1KSIsekluZGV4Ojd9KS5hZGQo
KTt0aGlzLnNlbGVjdGlvbk1hcmtlciYmZiYmKGQtPTNEbyw9CnRoaXMuc2VsZWN0aW9uTWFya2Vy
LmF0dHIoe3dpZHRoOk0oZCkseDooZD4wPzA6ZCkrb30pKTt0aGlzLnNlbGVjdGlvbk1hcmtlcj0K
JiZnJiYoZD0zRGUtbix0aGlzLnNlbGVjdGlvbk1hcmtlci5hdHRyKHtoZWlnaHQ6TShkKSx5Oihk
PjA/MDpkKStufSkpO2wmJiF0PQpoaXMuc2VsZWN0aW9uTWFya2VyJiZjLnBhbm5pbmcmJmIucGFu
KGEsYy5wYW5uaW5nKX19LGRyb3A6ZnVuY3Rpb24oYSl7dmFyIGI9Cj0zRHRoaXMuY2hhcnQsYz0z
RHRoaXMuaGFzUGluY2hlZDtpZih0aGlzLnNlbGVjdGlvbk1hcmtlcil7dmFyIGQ9M0R7eEF4aXM6
Wz0KXSx5QXhpczpbXSxvcmlnaW5hbEV2ZW50OmEub3JpZ2luYWxFdmVudHx8YX0sYT0zRHRoaXMu
c2VsZWN0aW9uTWFya2VyLGU9M0RhPQouYXR0cj9hLmF0dHIoIngiKTphLngsZj0zRGEuYXR0cj9h
LmF0dHIoInkiKTphLnksZz0zRGEuYXR0cj9hLmF0dHIoIndpZHRoIik6Ci1hLndpZHRoLGg9M0Rh
LmF0dHI/YS5hdHRyKCJoZWlnaHQiKTphLmhlaWdodCxpO2lmKHRoaXMuaGFzRHJhZ2dlZHx8Yylw
KGIuYT0KeGVzLGZ1bmN0aW9uKGEpe2lmKGEuem9vbUVuYWJsZWQpe3ZhciBiPTNEYS5ob3Jpeixj
PTNEYS50b1ZhbHVlKGI/ZTpmKSxiPTNEPQphLnRvVmFsdWUoYj9lK2c6ZitoKTshaXNOYU4oYykm
JiFpc05hTihiKSYmKGRbYS5jb2xsXS5wdXNoKHtheGlzOmEsbWluOkMoYyw9CmIpLG1heDp2KGMs
Yil9KSxpPTNEITApfX0pLGkmJkQoYiwic2VsZWN0aW9uIixkLGZ1bmN0aW9uKGEpe2Iuem9vbShx
KGEsYz97YT0KbmltYXRpb246ITF9Om51bGwpKX0pO3RoaXMuc2VsZWN0aW9uTWFya2VyPTNEdGhp
cy5zZWxlY3Rpb25NYXJrZXIuZGVzdHJveSgpPQo7YyYmdGhpcy5zY2FsZUdyb3VwcygpfWlmKGIp
RyhiLmNvbnRhaW5lcix7Y3Vyc29yOmIuX2N1cnNvcn0pLGIuY2FuY2VsQ2xpY2s9Cj0zRHRoaXMu
aGFzRHJhZ2dlZD4xMCxiLm1vdXNlSXNEb3duPTNEdGhpcy5oYXNEcmFnZ2VkPTNEdGhpcy5oYXNQ
aW5jaGVkPTNECi0hMSx0aGlzLnBpbmNoRG93bj0zRFtdfSxvbkNvbnRhaW5lck1vdXNlRG93bjpm
dW5jdGlvbihhKXthPTNEdGhpcy5ub3JtYWxpej0KZShhKTthLnByZXZlbnREZWZhdWx0JiZhLnBy
ZXZlbnREZWZhdWx0KCk7dGhpcy5kcmFnU3RhcnQoYSl9LG9uRG9jdW1lbnRNb3VzPQplVXA6ZnVu
Y3Rpb24oYSl7VltvYV0mJlZbb2FdLnBvaW50ZXIuZHJvcChhKX0sb25Eb2N1bWVudE1vdXNlTW92
ZTpmdW5jdGlvbig9CmEpe3ZhciBiPTNEdGhpcy5jaGFydCxjPTNEdGhpcy5jaGFydFBvc2l0aW9u
LGQ9M0RiLmhvdmVyU2VyaWVzLGE9M0R0aGlzLm5vcj0KbWFsaXplKGEsYyk7YyYmZCYmIXRoaXMu
aW5DbGFzcyhhLnRhcmdldCwiaGlnaGNoYXJ0cy10cmFja2VyIikmJiFiLmlzSW5zaWRlPQpQbG90
KGEuY2hhcnRYLWIucGxvdExlZnQsYS5jaGFydFktYi5wbG90VG9wKSYmdGhpcy5yZXNldCgpfSxv
bkNvbnRhaW5lck1vdXM9CmVMZWF2ZTpmdW5jdGlvbigpe3ZhciBhPTNEVltvYV07aWYoYSlhLnBv
aW50ZXIucmVzZXQoKSxhLnBvaW50ZXIuY2hhcnRQb3NpdD0KaW9uPTNECi1udWxsfSxvbkNvbnRh
aW5lck1vdXNlTW92ZTpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMuY2hhcnQ7b2E9M0RiLmluZGV4
O2E9Cj0zRHRoaXMubm9ybWFsaXplKGEpO2IubW91c2VJc0Rvd249M0Q9M0Q9M0QibW91c2Vkb3du
IiYmdGhpcy5kcmFnKGEpOyh0aGlzLj0KaW5DbGFzcyhhLnRhcmdldCwiaGlnaGNoYXJ0cy10cmFj
a2VyIil8fGIuaXNJbnNpZGVQbG90KGEuY2hhcnRYLWIucGxvdExlZnQsPQphLmNoYXJ0WS1iLnBs
b3RUb3ApKSYmIWIub3Blbk1lbnUmJnRoaXMucnVuUG9pbnRBY3Rpb25zKGEpfSxpbkNsYXNzOmZ1
bmN0aW89Cm4oYSxiKXtmb3IodmFyIGM7YTspe2lmKGM9M0RIKGEsImNsYXNzIikpaWYoYy5pbmRl
eE9mKGIpIT0zRD0zRC0xKXJldHVybiEwOz0KZWxzZSBpZihjLmluZGV4T2YoImhpZ2hjaGFydHMt
Y29udGFpbmVyIikhPTNEPTNELTEpcmV0dXJuITE7YT0zRGEucGFyZW50Tm9kPQplfX0sb25UcmFj
a2VyTW91c2VPdXQ6ZnVuY3Rpb24oYSl7dmFyIGI9M0R0aGlzLmNoYXJ0LmhvdmVyU2VyaWVzLGM9
M0QoYT0zRGE9Ci5yZWxhdGVkVGFyZ2V0fHwKLWEudG9FbGVtZW50KSYmYS5wb2ludCYmYS5wb2lu
dC5zZXJpZXM7aWYoYiYmIWIub3B0aW9ucy5zdGlja3lUcmFja2luZyYmIXRoPQppcy5pbkNsYXNz
KGEsImhpZ2hjaGFydHMtdG9vbHRpcCIpJiZjIT0zRD0zRGIpYi5vbk1vdXNlT3V0KCl9LG9uQ29u
dGFpbmVyQ2w9CmljazpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMuY2hhcnQsYz0zRGIuaG92ZXJQ
b2ludCxkPTNEYi5wbG90TGVmdCxlPTNEYi5wbD0Kb3RUb3AsYT0zRHRoaXMubm9ybWFsaXplKGEp
O2EuY2FuY2VsQnViYmxlPTNEITA7Yi5jYW5jZWxDbGlja3x8KGMmJnRoaXMuaW5DPQpsYXNzKGEu
dGFyZ2V0LCJoaWdoY2hhcnRzLXRyYWNrZXIiKT8oRChjLnNlcmllcywiY2xpY2siLHEoYSx7cG9p
bnQ6Y30pKSxiLmg9Cm92ZXJQb2ludCYmYy5maXJlUG9pbnRFdmVudCgiY2xpY2siLGEpKToocShh
LHRoaXMuZ2V0Q29vcmRpbmF0ZXMoYSkpLGIuaXNJbj0Kc2lkZVBsb3QoYS5jaGFydFgtZCxhLmNo
YXJ0WS1lKSYmRChiLCJjbGljayIsYSkpKX0sc2V0RE9NRXZlbnRzOmZ1bmN0aW9uKCl7PQp2YXIg
YT0zRAotdGhpcyxiPTNEYS5jaGFydC5jb250YWluZXI7Yi5vbm1vdXNlZG93bj0zRGZ1bmN0aW9u
KGIpe2Eub25Db250YWluZXJNb3VzZUQ9Cm93bihiKX07Yi5vbm1vdXNlbW92ZT0zRGZ1bmN0aW9u
KGIpe2Eub25Db250YWluZXJNb3VzZU1vdmUoYil9O2Iub25jbGljaz0zRD0KZnVuY3Rpb24oYil7
YS5vbkNvbnRhaW5lckNsaWNrKGIpfTtLKGIsIm1vdXNlbGVhdmUiLGEub25Db250YWluZXJNb3Vz
ZUxlYXZlPQopO2FiPTNEPTNEPTNEMSYmSyh5LCJtb3VzZXVwIixhLm9uRG9jdW1lbnRNb3VzZVVw
KTtpZigkYSliLm9udG91Y2hzdGFydD0zRGY9CnVuY3Rpb24oYil7YS5vbkNvbnRhaW5lclRvdWNo
U3RhcnQoYil9LGIub250b3VjaG1vdmU9M0RmdW5jdGlvbihiKXthLm9uQ29udD0KYWluZXJUb3Vj
aE1vdmUoYil9LGFiPTNEPTNEPTNEMSYmSyh5LCJ0b3VjaGVuZCIsYS5vbkRvY3VtZW50VG91Y2hF
bmQpfSxkZXN0PQpyb3k6ZnVuY3Rpb24oKXt2YXIgYTtXKHRoaXMuY2hhcnQuY29udGFpbmVyLCJt
b3VzZWxlYXZlIix0aGlzLm9uQ29udGFpbmVyTW89CnVzZUxlYXZlKTsKLWFifHwoVyh5LCJtb3Vz
ZXVwIix0aGlzLm9uRG9jdW1lbnRNb3VzZVVwKSxXKHksInRvdWNoZW5kIix0aGlzLm9uRG9jdW1l
bnRUPQpvdWNoRW5kKSk7Y2xlYXJJbnRlcnZhbCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtmb3IoYSBp
biB0aGlzKXRoaXNbYV09M0RudWxsfX09CjtxKFIuUG9pbnRlci5wcm90b3R5cGUse3BpbmNoVHJh
bnNsYXRlOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXsodGhpcy56b29tSG9yfD0KfHRoaXMucGluY2hI
b3IpJiZ0aGlzLnBpbmNoVHJhbnNsYXRlRGlyZWN0aW9uKCEwLGEsYixjLGQsZSxmKTsodGhpcy56
b29tVmVyPQp0fHx0aGlzLnBpbmNoVmVydCkmJnRoaXMucGluY2hUcmFuc2xhdGVEaXJlY3Rpb24o
ITEsYSxiLGMsZCxlLGYpfSxwaW5jaFRyYW49CnNsYXRlRGlyZWN0aW9uOmZ1bmN0aW9uKGEsYixj
LGQsZSxmLGcsaCl7dmFyIGk9M0R0aGlzLmNoYXJ0LGo9M0RhPyJ4IjoieSIsaz0KPTNEYT8iWCI6
IlkiLGw9M0QiY2hhcnQiK2ssbz0zRGE/IndpZHRoIjoiaGVpZ2h0IixuPTNEaVsicGxvdCIrKGE/
Ci0iTGVmdCI6IlRvcCIpXSxzLG0scD0zRGh8fDEscT0zRGkuaW52ZXJ0ZWQseD0zRGkuYm91bmRz
W2E/ImgiOiJ2Il0scj0zRGIubD0KZW5ndGg9M0Q9M0Q9M0QxLHY9M0RiWzBdW2xdLHU9M0RjWzBd
W2xdLHQ9M0QhciYmYlsxXVtsXSx3PTNEIXImJmNbMV1bbF0seSxjPQo9M0RmdW5jdGlvbigpeyFy
JiZNKHYtdCk+MjAmJihwPTNEaHx8TSh1LXcpL00odi10KSk7bT0zRChuLXUpL3ArdjtzPTNEaVsi
cGw9Cm90IisoYT8iV2lkdGgiOiJIZWlnaHQiKV0vcH07YygpO2I9M0RtO2I8eC5taW4/KGI9M0R4
Lm1pbix5PTNEITApOmIrcz54Lm1heD0KJiYoYj0zRHgubWF4LXMseT0zRCEwKTt5Pyh1LT0zRDAu
OCoodS1nW2pdWzBdKSxyfHwody09M0QwLjgqKHctZ1tqXVsxXSkpLGMoPQopKTpnW2pdPTNEW3Us
d107cXx8KGZbal09M0RtLW4sZltvXT0zRHMpO2Y9M0RxPzEvcDpwO2Vbb109M0RzO2Vbal09M0Ri
O2RbcT89CmE/InNjYWxlWSI6InNjYWxlWCI6InNjYWxlIitrXT0zRHA7ZFsidHJhbnNsYXRlIitr
XT0zRGYqbisodS1mKnYpfSxwaW5jaDpmdT0KbmN0aW9uKGEpe3ZhciBiPTNEdGhpcyxjPTNEYi5j
aGFydCxkPTNEYi5waW5jaERvd24sCi1lPTNEYi5mb2xsb3dUb3VjaE1vdmUsZj0zRGEudG91Y2hl
cyxnPTNEZi5sZW5ndGgsaD0zRGIubGFzdFZhbGlkVG91Y2gsaT0zRD0KYi5oYXNab29tLGo9M0Ri
LnNlbGVjdGlvbk1hcmtlcixrPTNEe30sbD0zRGc9M0Q9M0Q9M0QxJiYoYi5pbkNsYXNzKGEudGFy
Z2V0PQosImhpZ2hjaGFydHMtdHJhY2tlciIpJiZjLnJ1blRyYWNrZXJDbGlja3x8Yy5ydW5DaGFy
dENsaWNrKSxvPTNEe307KGl8fGUpJiY9CiFsJiZhLnByZXZlbnREZWZhdWx0KCk7VWEoZixmdW5j
dGlvbihhKXtyZXR1cm4gYi5ub3JtYWxpemUoYSl9KTtpZihhLnR5cGU9Cj0zRD0zRD0zRCJ0b3Vj
aHN0YXJ0IilwKGYsZnVuY3Rpb24oYSxiKXtkW2JdPTNEe2NoYXJ0WDphLmNoYXJ0WCxjaGFydFk6
YS5jaD0KYXJ0WX19KSxoLng9M0RbZFswXS5jaGFydFgsZFsxXSYmZFsxXS5jaGFydFhdLGgueT0z
RFtkWzBdLmNoYXJ0WSxkWzFdJiZkWzFdPQouY2hhcnRZXSxwKGMuYXhlcyxmdW5jdGlvbihhKXtp
ZihhLnpvb21FbmFibGVkKXt2YXIgYj0zRGMuYm91bmRzW2EuaG9yaXo/Img9CiI6InYiXSxkPTNE
YS5taW5QaXhlbFBhZGRpbmcsCi1lPTNEYS50b1BpeGVscyhhLmRhdGFNaW4pLGY9M0RhLnRvUGl4
ZWxzKGEuZGF0YU1heCksZz0zREMoZSxmKSxlPTNEdihlLGYpOz0KYi5taW49M0RDKGEucG9zLGct
ZCk7Yi5tYXg9M0R2KGEucG9zK2EubGVuLGUrZCl9fSk7ZWxzZSBpZihkLmxlbmd0aCl7aWYoIWop
PQpiLnNlbGVjdGlvbk1hcmtlcj0zRGo9M0RxKHtkZXN0cm95OnNhfSxjLnBsb3RCb3gpO2IucGlu
Y2hUcmFuc2xhdGUoZCxmLGssaiw9Cm8saCk7Yi5oYXNQaW5jaGVkPTNEaTtiLnNjYWxlR3JvdXBz
KGssbyk7IWkmJmUmJmc9M0Q9M0Q9M0QxJiZ0aGlzLnJ1blBvaW50QT0KY3Rpb25zKGIubm9ybWFs
aXplKGEpKX19LG9uQ29udGFpbmVyVG91Y2hTdGFydDpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMu
Y2hhPQpydDtvYT0zRGIuaW5kZXg7YS50b3VjaGVzLmxlbmd0aD0zRD0zRD0zRDE/KGE9M0R0aGlz
Lm5vcm1hbGl6ZShhKSxiLmlzSW5zaWQ9CmVQbG90KGEuY2hhcnRYLWIucGxvdExlZnQsYS5jaGFy
dFktYi5wbG90VG9wKT8odGhpcy5ydW5Qb2ludEFjdGlvbnMoYSksdGhpcz0KLnBpbmNoKGEpKTp0
aGlzLnJlc2V0KCkpOgotYS50b3VjaGVzLmxlbmd0aD0zRD0zRD0zRDImJnRoaXMucGluY2goYSl9
LG9uQ29udGFpbmVyVG91Y2hNb3ZlOmZ1bmN0aW9uKGE9Cil7KGEudG91Y2hlcy5sZW5ndGg9M0Q9
M0Q9M0QxfHxhLnRvdWNoZXMubGVuZ3RoPTNEPTNEPTNEMikmJnRoaXMucGluY2goYSl9LD0Kb25E
b2N1bWVudFRvdWNoRW5kOmZ1bmN0aW9uKGEpe1Zbb2FdJiZWW29hXS5wb2ludGVyLmRyb3AoYSl9
fSk7aWYoSS5Qb2ludGVyPQpFdmVudHx8SS5NU1BvaW50ZXJFdmVudCl7dmFyIHVhPTNEe30semI9
M0QhIUkuUG9pbnRlckV2ZW50LFdiPTNEZnVuY3Rpb24oKXs9CnZhciBhLGI9M0RbXTtiLml0ZW09
M0RmdW5jdGlvbihhKXtyZXR1cm4gdGhpc1thXX07Zm9yKGEgaW4gdWEpdWEuaGFzT3duUHJvcD0K
ZXJ0eShhKSYmYi5wdXNoKHtwYWdlWDp1YVthXS5wYWdlWCxwYWdlWTp1YVthXS5wYWdlWSx0YXJn
ZXQ6dWFbYV0udGFyZ2V0fSk7PQpyZXR1cm4gYn0sQWI9M0RmdW5jdGlvbihhLGIsYyxkKXthPTNE
YS5vcmlnaW5hbEV2ZW50fHxhO2lmKChhLnBvaW50ZXJUeXBlPQo9M0Q9M0Q9M0QidG91Y2gifHwK
LWEucG9pbnRlclR5cGU9M0Q9M0Q9M0RhLk1TUE9JTlRFUl9UWVBFX1RPVUNIKSYmVltvYV0pZChh
KSxkPTNEVltvYV0ucG9pbnRlPQpyLGRbYl0oe3R5cGU6Yyx0YXJnZXQ6YS5jdXJyZW50VGFyZ2V0
LHByZXZlbnREZWZhdWx0OnNhLHRvdWNoZXM6V2IoKX0pfTtxKFc9CmEucHJvdG90eXBlLHtvbkNv
bnRhaW5lclBvaW50ZXJEb3duOmZ1bmN0aW9uKGEpe0FiKGEsIm9uQ29udGFpbmVyVG91Y2hTdGFy
dD0KIiwidG91Y2hzdGFydCIsZnVuY3Rpb24oYSl7dWFbYS5wb2ludGVySWRdPTNEe3BhZ2VYOmEu
cGFnZVgscGFnZVk6YS5wYWdlWSx0PQphcmdldDphLmN1cnJlbnRUYXJnZXR9fSl9LG9uQ29udGFp
bmVyUG9pbnRlck1vdmU6ZnVuY3Rpb24oYSl7QWIoYSwib25Db250YWk9Cm5lclRvdWNoTW92ZSIs
InRvdWNobW92ZSIsZnVuY3Rpb24oYSl7dWFbYS5wb2ludGVySWRdPTNEe3BhZ2VYOmEucGFnZVgs
cGFnZT0KWTphLnBhZ2VZfTtpZighdWFbYS5wb2ludGVySWRdLnRhcmdldCl1YVthLnBvaW50ZXJJ
ZF0udGFyZ2V0PTNEYS5jdXJyZW50VGFyPQpnZXR9KX0sCi1vbkRvY3VtZW50UG9pbnRlclVwOmZ1
bmN0aW9uKGEpe0FiKGEsIm9uQ29udGFpbmVyVG91Y2hFbmQiLCJ0b3VjaGVuZCIsZnVuYz0KdGlv
bihhKXtkZWxldGUgdWFbYS5wb2ludGVySWRdfSl9LGJhdGNoTVNFdmVudHM6ZnVuY3Rpb24oYSl7
YSh0aGlzLmNoYXJ0LmNvPQpudGFpbmVyLHpiPyJwb2ludGVyZG93biI6Ik1TUG9pbnRlckRvd24i
LHRoaXMub25Db250YWluZXJQb2ludGVyRG93bik7YSh0aGk9CnMuY2hhcnQuY29udGFpbmVyLHpi
PyJwb2ludGVybW92ZSI6Ik1TUG9pbnRlck1vdmUiLHRoaXMub25Db250YWluZXJQb2ludGVyTT0K
b3ZlKTthKHksemI/InBvaW50ZXJ1cCI6Ik1TUG9pbnRlclVwIix0aGlzLm9uRG9jdW1lbnRQb2lu
dGVyVXApfX0pO01hKFdhLnByPQpvdG90eXBlLCJpbml0IixmdW5jdGlvbihhLGIsYyl7YS5jYWxs
KHRoaXMsYixjKTsodGhpcy5oYXNab29tfHx0aGlzLmZvbGxvd1Q9Cm91Y2hNb3ZlKSYmRyhiLmNv
bnRhaW5lcix7Ii1tcy10b3VjaC1hY3Rpb24iOlEsInRvdWNoLWFjdGlvbiI6UX0pfSk7Ci1NYShX
YS5wcm90b3R5cGUsInNldERPTUV2ZW50cyIsZnVuY3Rpb24oYSl7YS5hcHBseSh0aGlzKTsodGhp
cy5oYXNab29tfHx0aD0KaXMuZm9sbG93VG91Y2hNb3ZlKSYmdGhpcy5iYXRjaE1TRXZlbnRzKEsp
fSk7TWEoV2EucHJvdG90eXBlLCJkZXN0cm95IixmdW5jPQp0aW9uKGEpe3RoaXMuYmF0Y2hNU0V2
ZW50cyhXKTthLmNhbGwodGhpcyl9KX12YXIgbGI9M0RSLkxlZ2VuZD0zRGZ1bmN0aW9uKGE9Cixi
KXt0aGlzLmluaXQoYSxiKX07bGIucHJvdG90eXBlPTNEe2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIg
Yz0zRHRoaXMsZD0zRGIuaT0KdGVtU3R5bGUsZT0zRG0oYi5wYWRkaW5nLDgpLGY9M0RiLml0ZW1N
YXJnaW5Ub3B8fDA7dGhpcy5vcHRpb25zPTNEYjtpZihiLmVuPQphYmxlZCljLmJhc2VsaW5lPTNE
eihkLmZvbnRTaXplKSszK2YsYy5pdGVtU3R5bGU9M0RkLGMuaXRlbUhpZGRlblN0eWxlPTNEdyg9
CmQsYi5pdGVtSGlkZGVuU3R5bGUpLGMuaXRlbU1hcmdpblRvcD0zRGYsYy5wYWRkaW5nPTNEZSxj
LmluaXRpYWxJdGVtWD0zRGUsYz0KLmluaXRpYWxJdGVtWT0zRAotZS01LGMubWF4SXRlbVdpZHRo
PTNEMCxjLmNoYXJ0PTNEYSxjLml0ZW1IZWlnaHQ9M0QwLGMubGFzdExpbmVIZWlnaHQ9M0QwLGM9
Ci5zeW1ib2xXaWR0aD0zRG0oYi5zeW1ib2xXaWR0aCwxNiksYy5wYWdlcz0zRFtdLGMucmVuZGVy
KCksSyhjLmNoYXJ0LCJlbmRSZT0Kc2l6ZSIsZnVuY3Rpb24oKXtjLnBvc2l0aW9uQ2hlY2tib3hl
cygpfSl9LGNvbG9yaXplSXRlbTpmdW5jdGlvbihhLGIpe3ZhciBjPQo9M0R0aGlzLm9wdGlvbnMs
ZD0zRGEubGVnZW5kSXRlbSxlPTNEYS5sZWdlbmRMaW5lLGY9M0RhLmxlZ2VuZFN5bWJvbCxnPTNE
dGg9CmlzLml0ZW1IaWRkZW5TdHlsZS5jb2xvcixjPTNEYj9jLml0ZW1TdHlsZS5jb2xvcjpnLGg9
M0RiP2EubGVnZW5kQ29sb3J8fGEuYz0Kb2xvcnx8IiNDQ0MiOmcsZz0zRGEub3B0aW9ucyYmYS5v
cHRpb25zLm1hcmtlcixpPTNEe2ZpbGw6aH0sajtkJiZkLmNzcyh7ZmlsPQpsOmMsY29sb3I6Y30p
O2UmJmUuYXR0cih7c3Ryb2tlOmh9KTtpZihmKXtpZihnJiZmLmlzTWFya2VyKWZvcihqIGluIGku
c3Ryb2s9CmU9M0RoLGc9M0RhLmNvbnZlcnRBdHRyaWJzKGcpLAotZylkPTNEZ1tqXSxkIT0zRD0z
RHQmJihpW2pdPTNEZCk7Zi5hdHRyKGkpfX0scG9zaXRpb25JdGVtOmZ1bmN0aW9uKGEpe3ZhciA9
CmI9M0R0aGlzLm9wdGlvbnMsYz0zRGIuc3ltYm9sUGFkZGluZyxiPTNEIWIucnRsLGQ9M0RhLl9s
ZWdlbmRJdGVtUG9zLGU9M0RkWz0KMF0sZD0zRGRbMV0sZj0zRGEuY2hlY2tib3g7YS5sZWdlbmRH
cm91cCYmYS5sZWdlbmRHcm91cC50cmFuc2xhdGUoYj9lOnRoaXMuPQpsZWdlbmRXaWR0aC1lLTIq
Yy00LGQpO2lmKGYpZi54PTNEZSxmLnk9M0RkfSxkZXN0cm95SXRlbTpmdW5jdGlvbihhKXt2YXIg
Yj0KPTNEYS5jaGVja2JveDtwKFsibGVnZW5kSXRlbSIsImxlZ2VuZExpbmUiLCJsZWdlbmRTeW1i
b2wiLCJsZWdlbmRHcm91cCJdLGZ1PQpuY3Rpb24oYil7YVtiXSYmKGFbYl09M0RhW2JdLmRlc3Ry
b3koKSl9KTtiJiZQYShhLmNoZWNrYm94KX0sZGVzdHJveTpmdW5jdGk9Cm9uKCl7dmFyIGE9M0R0
aGlzLmdyb3VwLGI9M0R0aGlzLmJveDtpZihiKXRoaXMuYm94PTNEYi5kZXN0cm95KCk7aWYoYSl0
aGlzLj0KZ3JvdXA9M0RhLmRlc3Ryb3koKX0sCi1wb3NpdGlvbkNoZWNrYm94ZXM6ZnVuY3Rpb24o
YSl7dmFyIGI9M0R0aGlzLmdyb3VwLmFsaWduQXR0cixjLGQ9M0R0aGlzLmNsaT0KcEhlaWdodHx8
dGhpcy5sZWdlbmRIZWlnaHQ7aWYoYiljPTNEYi50cmFuc2xhdGVZLHAodGhpcy5hbGxJdGVtcyxm
dW5jdGlvbihlPQope3ZhciBmPTNEZS5jaGVja2JveCxnO2YmJihnPTNEYytmLnkrKGF8fDApKzMs
RyhmLHtsZWZ0OmIudHJhbnNsYXRlWCtlLmNoZWM9Cmtib3hPZmZzZXQrZi54LTIwKyJweCIsdG9w
OmcrInB4IixkaXNwbGF5Omc+Yy02JiZnPGMrZC02PyIiOlF9KSl9KX0scmVuZGVyVD0KaXRsZTpm
dW5jdGlvbigpe3ZhciBhPTNEdGhpcy5wYWRkaW5nLGI9M0R0aGlzLm9wdGlvbnMudGl0bGUsYz0z
RDA7aWYoYi50ZXh0PQope2lmKCF0aGlzLnRpdGxlKXRoaXMudGl0bGU9M0R0aGlzLmNoYXJ0LnJl
bmRlcmVyLmxhYmVsKGIudGV4dCxhLTMsYS00LG51bGw9CixudWxsLG51bGwsbnVsbCxudWxsLCJs
ZWdlbmQtdGl0bGUiKS5hdHRyKHt6SW5kZXg6MX0pLmNzcyhiLnN0eWxlKS5hZGQodGhpcz0KLmdy
b3VwKTsKLWE9M0R0aGlzLnRpdGxlLmdldEJCb3goKTtjPTNEYS5oZWlnaHQ7dGhpcy5vZmZzZXRX
aWR0aD0zRGEud2lkdGg7dGhpcy5jb250PQplbnRHcm91cC5hdHRyKHt0cmFuc2xhdGVZOmN9KX10
aGlzLnRpdGxlSGVpZ2h0PTNEY30scmVuZGVySXRlbTpmdW5jdGlvbihhKXs9CnZhciBiPTNEdGhp
cy5jaGFydCxjPTNEYi5yZW5kZXJlcixkPTNEdGhpcy5vcHRpb25zLGU9M0RkLmxheW91dD0zRD0z
RD0zRCJobz0Kcml6b250YWwiLGY9M0R0aGlzLnN5bWJvbFdpZHRoLGc9M0RkLnN5bWJvbFBhZGRp
bmcsaD0zRHRoaXMuaXRlbVN0eWxlLGk9M0R0PQpoaXMuaXRlbUhpZGRlblN0eWxlLGo9M0R0aGlz
LnBhZGRpbmcsaz0zRGU/bShkLml0ZW1EaXN0YW5jZSwyMCk6MCxsPTNEIWQucnQ9Cmwsbz0zRGQu
d2lkdGgsbj0zRGQuaXRlbU1hcmdpbkJvdHRvbXx8MCxzPTNEdGhpcy5pdGVtTWFyZ2luVG9wLHA9
M0R0aGlzLmluaT0KdGlhbEl0ZW1YLHE9M0RhLmxlZ2VuZEl0ZW0scj0zRGEuc2VyaWVzJiZhLnNl
cmllcy5kcmF3TGVnZW5kU3ltYm9sP2Euc2VyaWVzPQo6YSx4PTNEci5vcHRpb25zLHg9M0R0aGlz
LmNyZWF0ZUNoZWNrYm94Rm9ySXRlbSYmCi14JiZ4LnNob3dDaGVja2JveCx0PTNEZC51c2VIVE1M
O2lmKCFxKWEubGVnZW5kR3JvdXA9M0RjLmcoImxlZ2VuZC1pdGVtIikuYT0KdHRyKHt6SW5kZXg6
MX0pLmFkZCh0aGlzLnNjcm9sbEdyb3VwKSxyLmRyYXdMZWdlbmRTeW1ib2wodGhpcyxhKSxhLmxl
Z2VuZEl0PQplbT0zRHE9M0RjLnRleHQoZC5sYWJlbEZvcm1hdD9JYShkLmxhYmVsRm9ybWF0LGEp
OmQubGFiZWxGb3JtYXR0ZXIuY2FsbChhKSw9Cmw/ZitnOi1nLHRoaXMuYmFzZWxpbmUsdCkuY3Nz
KHcoYS52aXNpYmxlP2g6aSkpLmF0dHIoe2FsaWduOmw/ImxlZnQiOiJyaWdodD0KIix6SW5kZXg6
Mn0pLmFkZChhLmxlZ2VuZEdyb3VwKSx0aGlzLnNldEl0ZW1FdmVudHMmJnRoaXMuc2V0SXRlbUV2
ZW50cyhhLHEsPQp0LGgsaSksdGhpcy5jb2xvcml6ZUl0ZW0oYSxhLnZpc2libGUpLHgmJnRoaXMu
Y3JlYXRlQ2hlY2tib3hGb3JJdGVtKGEpO2M9M0Q9CnEuZ2V0QkJveCgpO2Y9M0RhLmNoZWNrYm94
T2Zmc2V0PTNEZC5pdGVtV2lkdGh8fGEubGVnZW5kSXRlbVdpZHRofHwKLWYrZytjLndpZHRoK2sr
KHg/MjA6MCk7dGhpcy5pdGVtSGVpZ2h0PTNEZz0zRHUoYS5sZWdlbmRJdGVtSGVpZ2h0fHxjLmhl
aWdoPQp0KTtpZihlJiZ0aGlzLml0ZW1YLXArZj4ob3x8Yi5jaGFydFdpZHRoLTIqai1wLWQueCkp
dGhpcy5pdGVtWD0zRHAsdGhpcy5pdGU9Cm1ZKz0zRHMrdGhpcy5sYXN0TGluZUhlaWdodCtuLHRo
aXMubGFzdExpbmVIZWlnaHQ9M0QwO3RoaXMubWF4SXRlbVdpZHRoPTNEdj0KKHRoaXMubWF4SXRl
bVdpZHRoLGYpO3RoaXMubGFzdEl0ZW1ZPTNEcyt0aGlzLml0ZW1ZK247dGhpcy5sYXN0TGluZUhl
aWdodD0KPTNEdihnLHRoaXMubGFzdExpbmVIZWlnaHQpO2EuX2xlZ2VuZEl0ZW1Qb3M9M0RbdGhp
cy5pdGVtWCx0aGlzLml0ZW1ZXTtlP3RoPQppcy5pdGVtWCs9M0RmOih0aGlzLml0ZW1ZKz0zRHMr
ZytuLHRoaXMubGFzdExpbmVIZWlnaHQ9M0RnKTt0aGlzLm9mZnNldFdpZHQ9Cmg9M0RvfHx2KChl
P3RoaXMuaXRlbVgtcC1rOmYpK2osdGhpcy5vZmZzZXRXaWR0aCl9LGdldEFsbEl0ZW1zOmZ1bmN0
aW9uKCl7dj0KYXIgYT0zRAotW107cCh0aGlzLmNoYXJ0LnNlcmllcyxmdW5jdGlvbihiKXt2YXIg
Yz0zRGIub3B0aW9ucztpZihtKGMuc2hvd0luTGVnZW5kLCE9CnIoYy5saW5rZWRUbyk/dDohMSwh
MCkpYT0zRGEuY29uY2F0KGIubGVnZW5kSXRlbXN8fChjLmxlZ2VuZFR5cGU9M0Q9M0Q9M0QicD0K
b2ludCI/Yi5kYXRhOmIpKX0pO3JldHVybiBhfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgYT0zRHRo
aXMsYj0zRGEuY2hhcnQsYz0KPTNEYi5yZW5kZXJlcixkPTNEYS5ncm91cCxlLGYsZyxoLGk9M0Rh
LmJveCxqPTNEYS5vcHRpb25zLGs9M0RhLnBhZGRpbmcsbD0KPTNEai5ib3JkZXJXaWR0aCxvPTNE
ai5iYWNrZ3JvdW5kQ29sb3I7YS5pdGVtWD0zRGEuaW5pdGlhbEl0ZW1YO2EuaXRlbVk9M0RhPQou
aW5pdGlhbEl0ZW1ZO2Eub2Zmc2V0V2lkdGg9M0QwO2EubGFzdEl0ZW1ZPTNEMDtpZighZClhLmdy
b3VwPTNEZD0zRGMuZygibGU9CmdlbmQiKS5hdHRyKHt6SW5kZXg6N30pLmFkZCgpLGEuY29udGVu
dEdyb3VwPTNEYy5nKCkuYXR0cih7ekluZGV4OjF9KS5hZGQoZD0KKSxhLnNjcm9sbEdyb3VwPTNE
Yy5nKCkuYWRkKGEuY29udGVudEdyb3VwKTsKLWEucmVuZGVyVGl0bGUoKTtlPTNEYS5nZXRBbGxJ
dGVtcygpO29iKGUsZnVuY3Rpb24oYSxiKXtyZXR1cm4oYS5vcHRpb25zJiZhPQoub3B0aW9ucy5s
ZWdlbmRJbmRleHx8MCktKGIub3B0aW9ucyYmYi5vcHRpb25zLmxlZ2VuZEluZGV4fHwwKX0pO2ou
cmV2ZXJzZWQ9CiYmZS5yZXZlcnNlKCk7YS5hbGxJdGVtcz0zRGU7YS5kaXNwbGF5PTNEZj0zRCEh
ZS5sZW5ndGg7cChlLGZ1bmN0aW9uKGIpe2Eucj0KZW5kZXJJdGVtKGIpfSk7Zz0zRGoud2lkdGh8
fGEub2Zmc2V0V2lkdGg7aD0zRGEubGFzdEl0ZW1ZK2EubGFzdExpbmVIZWlnaHQrPQphLnRpdGxl
SGVpZ2h0O2g9M0RhLmhhbmRsZU92ZXJmbG93KGgpO2lmKGx8fG8pe2crPTNEaztoKz0zRGs7aWYo
aSl7aWYoZz4wJiY9Cmg+MClpW2kuaXNOZXc/ImF0dHIiOiJhbmltYXRlIl0oaS5jcmlzcCh7d2lk
dGg6ZyxoZWlnaHQ6aH0pKSxpLmlzTmV3PTNEITF9ZT0KbHNlIGEuYm94PTNEaT0zRGMucmVjdCgw
LDAsZyxoLGouYm9yZGVyUmFkaXVzLGx8fDApLmF0dHIoe3N0cm9rZTpqLmJvcmRlckNvPQpsb3Is
Ci0ic3Ryb2tlLXdpZHRoIjpsfHwwLGZpbGw6b3x8UX0pLmFkZChkKS5zaGFkb3coai5zaGFkb3cp
LGkuaXNOZXc9M0QhMDtpW2Y/Ij0Kc2hvdyI6ImhpZGUiXSgpfWEubGVnZW5kV2lkdGg9M0RnO2Eu
bGVnZW5kSGVpZ2h0PTNEaDtwKGUsZnVuY3Rpb24oYil7YS5wb3NpPQp0aW9uSXRlbShiKX0pO2Ym
JmQuYWxpZ24ocSh7d2lkdGg6ZyxoZWlnaHQ6aH0saiksITAsInNwYWNpbmdCb3giKTtiLmlzUmVz
aXo9CmluZ3x8dGhpcy5wb3NpdGlvbkNoZWNrYm94ZXMoKX0saGFuZGxlT3ZlcmZsb3c6ZnVuY3Rp
b24oYSl7dmFyIGI9M0R0aGlzLGM9Cj0zRHRoaXMuY2hhcnQsZD0zRGMucmVuZGVyZXIsZT0zRHRo
aXMub3B0aW9ucyxmPTNEZS55LGY9M0RjLnNwYWNpbmdCb3guaGVpZz0KaHQrKGUudmVydGljYWxB
bGlnbj0zRD0zRD0zRCJ0b3AiPy1mOmYpLXRoaXMucGFkZGluZyxnPTNEZS5tYXhIZWlnaHQsaCxp
PTNEPQp0aGlzLmNsaXBSZWN0LGo9M0RlLm5hdmlnYXRpb24saz0zRG0oai5hbmltYXRpb24sITAp
LGw9M0RqLmFycm93U2l6ZXx8MTIsbz0KPTNEdGhpcy5uYXYsbj0zRHRoaXMucGFnZXMsCi1zLHE9
M0R0aGlzLmFsbEl0ZW1zO2UubGF5b3V0PTNEPTNEPTNEImhvcml6b250YWwiJiYoZi89M0QyKTtn
JiYoZj0zREMoZixnKT0KKTtuLmxlbmd0aD0zRDA7aWYoYT5mJiYhZS51c2VIVE1MKXt0aGlzLmNs
aXBIZWlnaHQ9M0RoPTNEZi0yMC10aGlzLnRpdGxlSGVpPQpnaHQtdGhpcy5wYWRkaW5nO3RoaXMu
Y3VycmVudFBhZ2U9M0RtKHRoaXMuY3VycmVudFBhZ2UsMSk7dGhpcy5mdWxsSGVpZ2h0PQo9M0Rh
O3AocSxmdW5jdGlvbihhLGIpe3ZhciBjPTNEYS5fbGVnZW5kSXRlbVBvc1sxXSxkPTNEdShhLmxl
Z2VuZEl0ZW0uZ2V0QkI9Cm94KCkuaGVpZ2h0KSxlPTNEbi5sZW5ndGg7aWYoIWV8fGMtbltlLTFd
PmgmJihzfHxjKSE9M0Q9M0RuW2UtMV0pbi5wdXNoKHN8fD0KYyksZSsrO2I9M0Q9M0Q9M0RxLmxl
bmd0aC0xJiZjK2QtbltlLTFdPmgmJm4ucHVzaChjKTtjIT0zRD0zRHMmJihzPTNEYyl9KTtpPQpm
KCFpKWk9M0RiLmNsaXBSZWN0PTNEZC5jbGlwUmVjdCgwLHRoaXMucGFkZGluZyw5OTk5LDApLGIu
Y29udGVudEdyb3VwLmNsaXA9CihpKTtpLmF0dHIoe2hlaWdodDpofSk7aWYoIW8pdGhpcy5uYXY9
M0QKLW89M0RkLmcoKS5hdHRyKHt6SW5kZXg6MX0pLmFkZCh0aGlzLmdyb3VwKSx0aGlzLnVwPTNE
ZC5zeW1ib2woInRyaWFuZ2xlIiwwPQosMCxsLGwpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtiLnNj
cm9sbCgtMSxrKX0pLmFkZChvKSx0aGlzLnBhZ2VyPTNEZC50ZXh0KCI9CiIsMTUsMTApLmNzcyhq
LnN0eWxlKS5hZGQobyksdGhpcy5kb3duPTNEZC5zeW1ib2woInRyaWFuZ2xlLWRvd24iLDAsMCxs
LGwpLj0Kb24oImNsaWNrIixmdW5jdGlvbigpe2Iuc2Nyb2xsKDEsayl9KS5hZGQobyk7Yi5zY3Jv
bGwoMCk7YT0zRGZ9ZWxzZSBpZihvKWkuPQphdHRyKHtoZWlnaHQ6Yy5jaGFydEhlaWdodH0pLG8u
aGlkZSgpLHRoaXMuc2Nyb2xsR3JvdXAuYXR0cih7dHJhbnNsYXRlWToxfSk9Cix0aGlzLmNsaXBI
ZWlnaHQ9M0QwO3JldHVybiBhfSxzY3JvbGw6ZnVuY3Rpb24oYSxiKXt2YXIgYz0zRHRoaXMucGFn
ZXMsZD0zRD0KYy5sZW5ndGgsZT0zRHRoaXMuY3VycmVudFBhZ2UrYSxmPTNEdGhpcy5jbGlwSGVp
Z2h0LGc9M0R0aGlzLm9wdGlvbnMubmF2aWdhPQp0aW9uLAotaD0zRGcuYWN0aXZlQ29sb3IsZz0z
RGcuaW5hY3RpdmVDb2xvcixpPTNEdGhpcy5wYWdlcixqPTNEdGhpcy5wYWRkaW5nO2U+ZCY9CiYo
ZT0zRGQpO2lmKGU+MCliIT0zRD0zRHQmJlFhKGIsdGhpcy5jaGFydCksdGhpcy5uYXYuYXR0cih7
dHJhbnNsYXRlWDpqLHRyYT0KbnNsYXRlWTpmK3RoaXMucGFkZGluZys3K3RoaXMudGl0bGVIZWln
aHQsdmlzaWJpbGl0eToidmlzaWJsZSJ9KSx0aGlzLnVwLmF0PQp0cih7ZmlsbDplPTNEPTNEPTNE
MT9nOmh9KS5jc3Moe2N1cnNvcjplPTNEPTNEPTNEMT8iZGVmYXVsdCI6InBvaW50ZXIifSksaS49
CmF0dHIoe3RleHQ6ZSsiLyIrZH0pLHRoaXMuZG93bi5hdHRyKHt4OjE4K3RoaXMucGFnZXIuZ2V0
QkJveCgpLndpZHRoLGZpbGw6ZT0KPTNEPTNEPTNEZD9nOmh9KS5jc3Moe2N1cnNvcjplPTNEPTNE
PTNEZD8iZGVmYXVsdCI6InBvaW50ZXIifSksYz0zRC1jW2UtMV0rPQp0aGlzLmluaXRpYWxJdGVt
WSx0aGlzLnNjcm9sbEdyb3VwLmFuaW1hdGUoe3RyYW5zbGF0ZVk6Y30pLHRoaXMuY3VycmVudFBh
Z2U9Cj0zRGUsdGhpcy5wb3NpdGlvbkNoZWNrYm94ZXMoYyl9fTsKLU49M0RSLkxlZ2VuZFN5bWJv
bE1peGluPTNEe2RyYXdSZWN0YW5nbGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0zRGEub3B0aW9ucy5z
PQp5bWJvbEhlaWdodHx8MTI7Yi5sZWdlbmRTeW1ib2w9M0R0aGlzLmNoYXJ0LnJlbmRlcmVyLnJl
Y3QoMCxhLmJhc2VsaW5lLTUtYy89CjIsYS5zeW1ib2xXaWR0aCxjLGEub3B0aW9ucy5zeW1ib2xS
YWRpdXN8fDApLmF0dHIoe3pJbmRleDozfSkuYWRkKGIubGVnZW5kRz0Kcm91cCl9LGRyYXdMaW5l
TWFya2VyOmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5vcHRpb25zLGM9M0RiLm1hcmtlcixkO2Q9
M0RhPQouc3ltYm9sV2lkdGg7dmFyIGU9M0R0aGlzLmNoYXJ0LnJlbmRlcmVyLGY9M0R0aGlzLmxl
Z2VuZEdyb3VwLGE9M0RhLmJhc2VsaW49CmUtdShlLmZvbnRNZXRyaWNzKGEub3B0aW9ucy5pdGVt
U3R5bGUuZm9udFNpemUpLmIqMC4zKSxnO2lmKGIubGluZVdpZHRoKXtnPQo9M0R7InN0cm9rZS13
aWR0aCI6Yi5saW5lV2lkdGh9O2lmKGIuZGFzaFN0eWxlKWcuZGFzaHN0eWxlPTNEYi5kYXNoU3R5
bGU7dGg9CmlzLmxlZ2VuZExpbmU9M0QKLWUucGF0aChbIk0iLDAsYSwiTCIsZCxhXSkuYXR0cihn
KS5hZGQoZil9aWYoYyYmYy5lbmFibGVkIT0zRD0zRCExKWI9M0RjLnJhPQpkaXVzLHRoaXMubGVn
ZW5kU3ltYm9sPTNEZD0zRGUuc3ltYm9sKHRoaXMuc3ltYm9sLGQvMi1iLGEtYiwyKmIsMipiKS5h
ZGQoZik9CixkLmlzTWFya2VyPTNEITB9fTsoL1RyaWRlbnRcLzdcLjAvLnRlc3Qod2EpfHxUYSkm
Jk1hKGxiLnByb3RvdHlwZSwicG9zaXRpbz0Kbkl0ZW0iLGZ1bmN0aW9uKGEsYil7dmFyIGM9M0R0
aGlzLGQ9M0RmdW5jdGlvbigpe2IuX2xlZ2VuZEl0ZW1Qb3MmJmEuY2FsbChjPQosYil9O2QoKTtz
ZXRUaW1lb3V0KGQpfSk7WWEucHJvdG90eXBlPTNEe2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxk
PTNEYS5zZXI9CmllczthLnNlcmllcz0zRG51bGw7Yz0zRHcoRSxhKTtjLnNlcmllcz0zRGEuc2Vy
aWVzPTNEZDt0aGlzLnVzZXJPcHRpb25zPTNEYT0KO2Q9M0RjLmNoYXJ0O3RoaXMubWFyZ2luPTNE
dGhpcy5zcGxhc2hBcnJheSgibWFyZ2luIixkKTt0aGlzLnNwYWNpbmc9M0R0aGlzPQouc3BsYXNo
QXJyYXkoInNwYWNpbmciLAotZCk7dmFyIGU9M0RkLmV2ZW50czt0aGlzLmJvdW5kcz0zRHtoOnt9
LHY6e319O3RoaXMuY2FsbGJhY2s9M0RiO3RoaXMuaXNSZXM9Cml6aW5nPTNEMDt0aGlzLm9wdGlv
bnM9M0RjO3RoaXMuYXhlcz0zRFtdO3RoaXMuc2VyaWVzPTNEW107dGhpcy5oYXNDYXJ0ZXNpYT0K
blNlcmllcz0zRGQuc2hvd0F4ZXM7dmFyIGY9M0R0aGlzLGc7Zi5pbmRleD0zRFYubGVuZ3RoO1Yu
cHVzaChmKTthYisrO2QucmVmPQpsb3chPTNEPTNEITEmJksoZiwibG9hZCIsZnVuY3Rpb24oKXtm
LmluaXRSZWZsb3coKX0pO2lmKGUpZm9yKGcgaW4gZSlLKGYsZyw9CmVbZ10pO2YueEF4aXM9M0Rb
XTtmLnlBeGlzPTNEW107Zi5hbmltYXRpb249M0RmYT8hMTptKGQuYW5pbWF0aW9uLCEwKTtmLnBv
aT0KbnRDb3VudD0zRDA7Zi5jb3VudGVycz0zRG5ldyBCYjtmLmZpcnN0UmVuZGVyKCl9LGluaXRT
ZXJpZXM6ZnVuY3Rpb24oYSl7dmFyPQogYj0zRHRoaXMub3B0aW9ucy5jaGFydDsoYj0zREZbYS50
eXBlfHxiLnR5cGV8fGIuZGVmYXVsdFNlcmllc1R5cGVdKXx8cmEoMTc9CiwhMCk7Yj0zRG5ldyBi
O2IuaW5pdCh0aGlzLAotYSk7cmV0dXJuIGJ9LGlzSW5zaWRlUGxvdDpmdW5jdGlvbihhLGIsYyl7
dmFyIGQ9M0RjP2I6YSxhPTNEYz9hOmI7cmV0dXJuIGQ9Cj49M0QwJiZkPD0zRHRoaXMucGxvdFdp
ZHRoJiZhPj0zRDAmJmE8PTNEdGhpcy5wbG90SGVpZ2h0fSxhZGp1c3RUaWNrQW1vdW50cz0KOmZ1
bmN0aW9uKCl7dGhpcy5vcHRpb25zLmNoYXJ0LmFsaWduVGlja3MhPTNEPTNEITEmJnAodGhpcy5h
eGVzLGZ1bmN0aW9uKGEpPQp7YS5hZGp1c3RUaWNrQW1vdW50KCl9KTt0aGlzLm1heFRpY2tzPTNE
bnVsbH0scmVkcmF3OmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGg9CmlzLmF4ZXMsYz0zRHRoaXMuc2Vy
aWVzLGQ9M0R0aGlzLnBvaW50ZXIsZT0zRHRoaXMubGVnZW5kLGY9M0R0aGlzLmlzRGlydHlMZT0K
Z2VuZCxnLGgsaT0zRHRoaXMuaXNEaXJ0eUJveCxqPTNEYy5sZW5ndGgsaz0zRGosbD0zRHRoaXMu
cmVuZGVyZXIsbz0zRGwuaXNIPQppZGRlbigpLG49M0RbXTtRYShhLHRoaXMpO28mJnRoaXMuY2xv
bmVSZW5kZXJUbygpO2Zvcih0aGlzLmxheU91dFRpdGxlcygpO2s9Ci0tOylpZihhPTNEY1trXSxh
Lm9wdGlvbnMuc3RhY2tpbmcmJgotKGc9M0QhMCxhLmlzRGlydHkpKXtoPTNEITA7YnJlYWt9aWYo
aClmb3Ioaz0zRGo7ay0tOylpZihhPTNEY1trXSxhLm9wdGlvbnM9Ci5zdGFja2luZylhLmlzRGly
dHk9M0QhMDtwKGMsZnVuY3Rpb24oYSl7YS5pc0RpcnR5JiZhLm9wdGlvbnMubGVnZW5kVHlwZT0z
RD0KPTNEPTNEInBvaW50IiYmKGY9M0QhMCl9KTtpZihmJiZlLm9wdGlvbnMuZW5hYmxlZCllLnJl
bmRlcigpLHRoaXMuaXNEaXJ0eUxlPQpnZW5kPTNEITE7ZyYmdGhpcy5nZXRTdGFja3MoKTtpZih0
aGlzLmhhc0NhcnRlc2lhblNlcmllcyl7aWYoIXRoaXMuaXNSZXNpemk9Cm5nKXRoaXMubWF4VGlj
a3M9M0RudWxsLHAoYixmdW5jdGlvbihhKXthLnNldFNjYWxlKCl9KTt0aGlzLmFkanVzdFRpY2tB
bW91bj0KdHMoKTt0aGlzLmdldE1hcmdpbnMoKTtwKGIsZnVuY3Rpb24oYSl7YS5pc0RpcnR5JiYo
aT0zRCEwKX0pO3AoYixmdW5jdGlvbihhPQope2lmKGEuaXNEaXJ0eUV4dHJlbWVzKWEuaXNEaXJ0
eUV4dHJlbWVzPTNEITEsbi5wdXNoKGZ1bmN0aW9uKCl7RChhLCJhZnRlclM9CmV0RXh0cmVtZXMi
LAotcShhLmV2ZW50QXJncyxhLmdldEV4dHJlbWVzKCkpKTtkZWxldGUgYS5ldmVudEFyZ3N9KTso
aXx8ZykmJmEucmVkcmF3KCl9KX09CmkmJnRoaXMuZHJhd0NoYXJ0Qm94KCk7cChjLGZ1bmN0aW9u
KGEpe2EuaXNEaXJ0eSYmYS52aXNpYmxlJiYoIWEuaXNDYXJ0ZXNpYT0Kbnx8YS54QXhpcykmJmEu
cmVkcmF3KCl9KTtkJiZkLnJlc2V0KCEwKTtsLmRyYXcoKTtEKHRoaXMsInJlZHJhdyIpO28mJnRo
aXMuPQpjbG9uZVJlbmRlclRvKCEwKTtwKG4sZnVuY3Rpb24oYSl7YS5jYWxsKCl9KX0sZ2V0OmZ1
bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy49CmF4ZXMsYz0zRHRoaXMuc2VyaWVzLGQsZTtmb3IoZD0z
RDA7ZDxiLmxlbmd0aDtkKyspaWYoYltkXS5vcHRpb25zLmlkPTNEPTNEPQo9M0RhKXJldHVybiBi
W2RdO2ZvcihkPTNEMDtkPGMubGVuZ3RoO2QrKylpZihjW2RdLm9wdGlvbnMuaWQ9M0Q9M0Q9M0Rh
KXJldHU9CnJuIGNbZF07Zm9yKGQ9M0QwO2Q8Yy5sZW5ndGg7ZCsrKXtlPTNEY1tkXS5wb2ludHN8
fFtdO2ZvcihiPTNEMDtiPGUubGVuZ3RoOz0KYisrKWlmKGVbYl0uaWQ9M0Q9M0Q9M0QKLWEpcmV0
dXJuIGVbYl19cmV0dXJuIG51bGx9LGdldEF4ZXM6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMsYj0z
RHRoaXMub3B0aW9uPQpzLGM9M0RiLnhBeGlzPTNEcWEoYi54QXhpc3x8e30pLGI9M0RiLnlBeGlz
PTNEcWEoYi55QXhpc3x8e30pO3AoYyxmdW5jdGlvbig9CmEsYil7YS5pbmRleD0zRGI7YS5pc1g9
M0QhMH0pO3AoYixmdW5jdGlvbihhLGIpe2EuaW5kZXg9M0RifSk7Yz0zRGMuY29uY2F0KD0KYik7
cChjLGZ1bmN0aW9uKGIpe25ldyBsYShhLGIpfSk7YS5hZGp1c3RUaWNrQW1vdW50cygpfSxnZXRT
ZWxlY3RlZFBvaW50czpmPQp1bmN0aW9uKCl7dmFyIGE9M0RbXTtwKHRoaXMuc2VyaWVzLGZ1bmN0
aW9uKGIpe2E9M0RhLmNvbmNhdCh2YihiLnBvaW50c3x8W109CixmdW5jdGlvbihhKXtyZXR1cm4g
YS5zZWxlY3RlZH0pKX0pO3JldHVybiBhfSxnZXRTZWxlY3RlZFNlcmllczpmdW5jdGlvbigpez0K
cmV0dXJuIHZiKHRoaXMuc2VyaWVzLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVjdGVkfSl9LGdl
dFN0YWNrczpmdW5jdGlvbigpPQp7dmFyIGE9M0QKLXRoaXM7cChhLnlBeGlzLGZ1bmN0aW9uKGEp
e2lmKGEuc3RhY2tzJiZhLmhhc1Zpc2libGVTZXJpZXMpYS5vbGRTdGFja3M9M0RhPQouc3RhY2tz
fSk7cChhLnNlcmllcyxmdW5jdGlvbihiKXtpZihiLm9wdGlvbnMuc3RhY2tpbmcmJihiLnZpc2li
bGU9M0Q9M0Q9M0Q9CiEwfHxhLm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzPTNEPTNE
PTNEITEpKWIuc3RhY2tLZXk9M0RiLnR5cGUrbShiLj0Kb3B0aW9ucy5zdGFjaywiIil9KX0sc2V0
VGl0bGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBnO3ZhciBkPTNEdGhpcyxlPTNEZC5vcHRpPQpvbnMs
ZjtmPTNEZS50aXRsZT0zRHcoZS50aXRsZSxhKTtnPTNEZS5zdWJ0aXRsZT0zRHcoZS5zdWJ0aXRs
ZSxiKSxlPTNEZztwKFs9ClsidGl0bGUiLGEsZl0sWyJzdWJ0aXRsZSIsYixlXV0sZnVuY3Rpb24o
YSl7dmFyIGI9M0RhWzBdLGM9M0RkW2JdLGU9M0RhWzFdLD0KYT0zRGFbMl07YyYmZSYmKGRbYl09
M0RjPTNEYy5kZXN0cm95KCkpO2EmJmEudGV4dCYmIWMmJihkW2JdPTNEZC5yZW5kZXJlci50PQpl
eHQoYS50ZXh0LDAsMCxhLnVzZUhUTUwpLmF0dHIoe2FsaWduOmEuYWxpZ24sCi0iY2xhc3MiOiJo
aWdoY2hhcnRzLSIrYix6SW5kZXg6YS56SW5kZXh8fDR9KS5jc3MoYS5zdHlsZSkuYWRkKCkpfSk7
ZC5sYXlPdT0KdFRpdGxlcyhjKX0sbGF5T3V0VGl0bGVzOmZ1bmN0aW9uKGEpe3ZhciBiPTNEMCxj
PTNEdGhpcy50aXRsZSxkPTNEdGhpcy5zdWJ0PQppdGxlLGU9M0R0aGlzLm9wdGlvbnMsZj0zRGUu
dGl0bGUsZT0zRGUuc3VidGl0bGUsZz0zRHRoaXMuc3BhY2luZ0JveC53aWR0aC09CjQ0O2lmKGMm
JihjLmNzcyh7d2lkdGg6KGYud2lkdGh8fGcpKyJweCJ9KS5hbGlnbihxKHt5OjE1fSxmKSwhMSwi
c3BhY2luZ0JveD0KIiksIWYuZmxvYXRpbmcmJiFmLnZlcnRpY2FsQWxpZ24pKWI9M0RjLmdldEJC
b3goKS5oZWlnaHQ7ZCYmKGQuY3NzKHt3aWR0aDooPQplLndpZHRofHxnKSsicHgifSkuYWxpZ24o
cSh7eTpiK2YubWFyZ2lufSxlKSwhMSwic3BhY2luZ0JveCIpLCFlLmZsb2F0aW5nJiY9CiFlLnZl
cnRpY2FsQWxpZ24mJihiPTNES2EoYitkLmdldEJCb3goKS5oZWlnaHQpKSk7Yz0zRHRoaXMudGl0
bGVPZmZzZXQhPTNEPQo9M0QKLWI7dGhpcy50aXRsZU9mZnNldD0zRGI7aWYoIXRoaXMuaXNEaXJ0
eUJveCYmYyl0aGlzLmlzRGlydHlCb3g9M0RjLHRoaXMuaGFzPQpSZW5kZXJlZCYmbShhLCEwKSYm
dGhpcy5pc0RpcnR5Qm94JiZ0aGlzLnJlZHJhdygpfSxnZXRDaGFydFNpemU6ZnVuY3Rpb24oKXs9
CnZhciBhPTNEdGhpcy5vcHRpb25zLmNoYXJ0LGI9M0RhLndpZHRoLGE9M0RhLmhlaWdodCxjPTNE
dGhpcy5yZW5kZXJUb0Nsb25lfD0KfHRoaXMucmVuZGVyVG87aWYoIXIoYikpdGhpcy5jb250YWlu
ZXJXaWR0aD0zRGpiKGMsIndpZHRoIik7aWYoIXIoYSkpdGhpcy5jPQpvbnRhaW5lckhlaWdodD0z
RGpiKGMsImhlaWdodCIpO3RoaXMuY2hhcnRXaWR0aD0zRHYoMCxifHx0aGlzLmNvbnRhaW5lcldp
ZHQ9Cmh8fDYwMCk7dGhpcy5jaGFydEhlaWdodD0zRHYoMCxtKGEsdGhpcy5jb250YWluZXJIZWln
aHQ+MTk/dGhpcy5jb250YWluZXJIZT0KaWdodDo0MDApKX0sY2xvbmVSZW5kZXJUbzpmdW5jdGlv
bihhKXt2YXIgYj0zRHRoaXMucmVuZGVyVG9DbG9uZSxjPTNEdGhpcy5jPQpvbnRhaW5lcjsKLWE/
YiYmKHRoaXMucmVuZGVyVG8uYXBwZW5kQ2hpbGQoYyksUGEoYiksZGVsZXRlIHRoaXMucmVuZGVy
VG9DbG9uZSk6KGMmJmMuPQpwYXJlbnROb2RlPTNEPTNEPTNEdGhpcy5yZW5kZXJUbyYmdGhpcy5y
ZW5kZXJUby5yZW1vdmVDaGlsZChjKSx0aGlzLnJlbmRlclQ9Cm9DbG9uZT0zRGI9M0R0aGlzLnJl
bmRlclRvLmNsb25lTm9kZSgwKSxHKGIse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiItOTk5OT0K
cHgiLGRpc3BsYXk6ImJsb2NrIn0pLGIuc3R5bGUuc2V0UHJvcGVydHkmJmIuc3R5bGUuc2V0UHJv
cGVydHkoImRpc3BsYXkiLCJiPQpsb2NrIiwiaW1wb3J0YW50IikseS5ib2R5LmFwcGVuZENoaWxk
KGIpLGMmJmIuYXBwZW5kQ2hpbGQoYykpfSxnZXRDb250YWluZXI9CjpmdW5jdGlvbigpe3ZhciBh
LGI9M0R0aGlzLm9wdGlvbnMuY2hhcnQsYyxkLGU7dGhpcy5yZW5kZXJUbz0zRGE9M0RiLnJlbmRl
cj0KVG87ZT0zRCJoaWdoY2hhcnRzLSIrdGIrKztpZihGYShhKSl0aGlzLnJlbmRlclRvPTNEYT0z
RHkuZ2V0RWxlbWVudEJ5SWQoYSk7Ci1hfHxyYSgxMywhMCk7Yz0zRHooSChhLCJkYXRhLWhpZ2hj
aGFydHMtY2hhcnQiKSk7IWlzTmFOKGMpJiZWW2NdJiZWW2NdLmhhcz0KUmVuZGVyZWQmJlZbY10u
ZGVzdHJveSgpO0goYSwiZGF0YS1oaWdoY2hhcnRzLWNoYXJ0Iix0aGlzLmluZGV4KTthLmlubmVy
SFRNPQpMPTNEIiI7IWIuc2tpcENsb25lJiYhYS5vZmZzZXRXaWR0aCYmdGhpcy5jbG9uZVJlbmRl
clRvKCk7dGhpcy5nZXRDaGFydFNpemU9CigpO2M9M0R0aGlzLmNoYXJ0V2lkdGg7ZD0zRHRoaXMu
Y2hhcnRIZWlnaHQ7dGhpcy5jb250YWluZXI9M0RhPTNEWShKYSx7Y2xhcz0Kc05hbWU6ImhpZ2hj
aGFydHMtY29udGFpbmVyIisoYi5jbGFzc05hbWU/IiAiK2IuY2xhc3NOYW1lOiIiKSxpZDplfSxx
KHtwb3NpPQp0aW9uOiJyZWxhdGl2ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6YysicHgiLGhl
aWdodDpkKyJweCIsdGV4dEFsaWduOiJsZWY9CnQiLGxpbmVIZWlnaHQ6Im5vcm1hbCIsekluZGV4
OjAsIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciI6InJnYmEoMCwwLDAsMD0KKSJ9LAotYi5z
dHlsZSksdGhpcy5yZW5kZXJUb0Nsb25lfHxhKTt0aGlzLl9jdXJzb3I9M0RhLnN0eWxlLmN1cnNv
cjt0aGlzLnJlbmRlcmU9CnI9M0RiLmZvckV4cG9ydD9uZXcgdGEoYSxjLGQsYi5zdHlsZSwhMCk6
bmV3IFphKGEsYyxkLGIuc3R5bGUpO2ZhJiZ0aGlzLnJlbj0KZGVyZXIuY3JlYXRlKHRoaXMsYSxj
LGQpfSxnZXRNYXJnaW5zOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLnNwYWNpbmcsYixjPTNEPQp0
aGlzLmxlZ2VuZCxkPTNEdGhpcy5tYXJnaW4sZT0zRHRoaXMub3B0aW9ucy5sZWdlbmQsZj0zRG0o
ZS5tYXJnaW4sMjApLGc9M0Q9CmUueCxoPTNEZS55LGk9M0RlLmFsaWduLGo9M0RlLnZlcnRpY2Fs
QWxpZ24saz0zRHRoaXMudGl0bGVPZmZzZXQ7dGhpcy5yZXNldD0KTWFyZ2lucygpO2I9M0R0aGlz
LmF4aXNPZmZzZXQ7aWYoayYmIXIoZFswXSkpdGhpcy5wbG90VG9wPTNEdih0aGlzLnBsb3RUb3As
PQprK3RoaXMub3B0aW9ucy50aXRsZS5tYXJnaW4rYVswXSk7aWYoYy5kaXNwbGF5JiYhZS5mbG9h
dGluZylpZihpPTNEPTNEPTNEInI9CmlnaHQiKXtpZighcihkWzFdKSl0aGlzLm1hcmdpblJpZ2h0
PTNECi12KHRoaXMubWFyZ2luUmlnaHQsYy5sZWdlbmRXaWR0aC1nK2YrYVsxXSl9ZWxzZSBpZihp
PTNEPTNEPTNEImxlZnQiKXtpZighcj0KKGRbM10pKXRoaXMucGxvdExlZnQ9M0R2KHRoaXMucGxv
dExlZnQsYy5sZWdlbmRXaWR0aCtnK2YrYVszXSl9ZWxzZSBpZihqPTNEPQo9M0Q9M0QidG9wIil7
aWYoIXIoZFswXSkpdGhpcy5wbG90VG9wPTNEdih0aGlzLnBsb3RUb3AsYy5sZWdlbmRIZWlnaHQr
aCtmK2E9ClswXSl9ZWxzZSBpZihqPTNEPTNEPTNEImJvdHRvbSImJiFyKGRbMl0pKXRoaXMubWFy
Z2luQm90dG9tPTNEdih0aGlzLm1hcmdpbj0KQm90dG9tLGMubGVnZW5kSGVpZ2h0LWgrZithWzJd
KTt0aGlzLmV4dHJhQm90dG9tTWFyZ2luJiYodGhpcy5tYXJnaW5Cb3R0b20rPQo9M0R0aGlzLmV4
dHJhQm90dG9tTWFyZ2luKTt0aGlzLmV4dHJhVG9wTWFyZ2luJiYodGhpcy5wbG90VG9wKz0zRHRo
aXMuZXh0cmE9ClRvcE1hcmdpbik7dGhpcy5oYXNDYXJ0ZXNpYW5TZXJpZXMmJnAodGhpcy5heGVz
LGZ1bmN0aW9uKGEpe2EuZ2V0T2Zmc2V0KCl9KT0KO3IoZFszXSl8fAotKHRoaXMucGxvdExlZnQr
PTNEYlszXSk7cihkWzBdKXx8KHRoaXMucGxvdFRvcCs9M0RiWzBdKTtyKGRbMl0pfHwodGhpcy5t
YXI9CmdpbkJvdHRvbSs9M0RiWzJdKTtyKGRbMV0pfHwodGhpcy5tYXJnaW5SaWdodCs9M0RiWzFd
KTt0aGlzLnNldENoYXJ0U2l6ZSgpfT0KLHJlZmxvdzpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMs
Yz0zRGIub3B0aW9ucy5jaGFydCxkPTNEYi5yZW5kZXJUbyxlPTNEYy53PQppZHRofHxqYihkLCJ3
aWR0aCIpLGY9M0RjLmhlaWdodHx8amIoZCwiaGVpZ2h0IiksYz0zRGE/YS50YXJnZXQ6SSxkPTNE
ZnVuY3Q9Cmlvbigpe2lmKGIuY29udGFpbmVyKWIuc2V0U2l6ZShlLGYsITEpLGIuaGFzVXNlclNp
emU9M0RudWxsfTtpZighYi5oYXNVc2VyUz0KaXplJiZlJiZmJiYoYz0zRD0zRD0zREl8fGM9M0Q9
M0Q9M0R5KSl7aWYoZSE9M0Q9M0RiLmNvbnRhaW5lcldpZHRofHxmIT0zRD0KPTNEYi5jb250YWlu
ZXJIZWlnaHQpY2xlYXJUaW1lb3V0KGIucmVmbG93VGltZW91dCksYT9iLnJlZmxvd1RpbWVvdXQ9
M0RzZXRUPQppbWVvdXQoZCwxMDApOmQoKTtiLmNvbnRhaW5lcldpZHRoPTNECi1lO2IuY29udGFp
bmVySGVpZ2h0PTNEZn19LGluaXRSZWZsb3c6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMsYj0zRGZ1
bmN0aW9uKD0KYil7YS5yZWZsb3coYil9O0soSSwicmVzaXplIixiKTtLKGEsImRlc3Ryb3kiLGZ1
bmN0aW9uKCl7VyhJLCJyZXNpemUiLGIpfSl9PQosc2V0U2l6ZTpmdW5jdGlvbihhLGIsYyl7dmFy
IGQ9M0R0aGlzLGUsZixnO2QuaXNSZXNpemluZys9M0QxO2c9M0RmdW5jdGlvbig9Cil7ZCYmRChk
LCJlbmRSZXNpemUiLG51bGwsZnVuY3Rpb24oKXtkLmlzUmVzaXppbmctPTNEMX0pfTtRYShjLGQp
O2Qub2xkQ2hhcj0KdEhlaWdodD0zRGQuY2hhcnRIZWlnaHQ7ZC5vbGRDaGFydFdpZHRoPTNEZC5j
aGFydFdpZHRoO2lmKHIoYSkpZC5jaGFydFdpZHRoPQo9M0RlPTNEdigwLHUoYSkpLGQuaGFzVXNl
clNpemU9M0QhIWU7aWYocihiKSlkLmNoYXJ0SGVpZ2h0PTNEZj0zRHYoMCx1KGIpKTs9Cih2YT9r
YjpHKShkLmNvbnRhaW5lcix7d2lkdGg6ZSsicHgiLGhlaWdodDpmKyJweCJ9LHZhKTtkLnNldENo
YXJ0U2l6ZSghMCk7ZD0KLnJlbmRlcmVyLnNldFNpemUoZSwKLWYsYyk7ZC5tYXhUaWNrcz0zRG51
bGw7cChkLmF4ZXMsZnVuY3Rpb24oYSl7YS5pc0RpcnR5PTNEITA7YS5zZXRTY2FsZSgpfSk7PQpw
KGQuc2VyaWVzLGZ1bmN0aW9uKGEpe2EuaXNEaXJ0eT0zRCEwfSk7ZC5pc0RpcnR5TGVnZW5kPTNE
ITA7ZC5pc0RpcnR5Qm94PQo9M0QhMDtkLmxheU91dFRpdGxlcygpO2QuZ2V0TWFyZ2lucygpO2Qu
cmVkcmF3KGMpO2Qub2xkQ2hhcnRIZWlnaHQ9M0RudWxsO0Q9CihkLCJyZXNpemUiKTt2YT0zRD0z
RD0zRCExP2coKTpzZXRUaW1lb3V0KGcsdmEmJnZhLmR1cmF0aW9ufHw1MDApfSxzZXRDaGFydD0K
U2l6ZTpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMuaW52ZXJ0ZWQsYz0zRHRoaXMucmVuZGVyZXIs
ZD0zRHRoaXMuY2hhcnRXaWR0PQpoLGU9M0R0aGlzLmNoYXJ0SGVpZ2h0LGY9M0R0aGlzLm9wdGlv
bnMuY2hhcnQsZz0zRHRoaXMuc3BhY2luZyxoPTNEdGhpcy5jbGk9CnBPZmZzZXQsaSxqLGssbDt0
aGlzLnBsb3RMZWZ0PTNEaT0zRHUodGhpcy5wbG90TGVmdCk7dGhpcy5wbG90VG9wPTNEaj0zRHUo
dD0KaGlzLnBsb3RUb3ApO3RoaXMucGxvdFdpZHRoPTNECi1rPTNEdigwLHUoZC1pLXRoaXMubWFy
Z2luUmlnaHQpKTt0aGlzLnBsb3RIZWlnaHQ9M0RsPTNEdigwLHUoZS1qLXRoaXMubWFyZz0KaW5C
b3R0b20pKTt0aGlzLnBsb3RTaXplWD0zRGI/bDprO3RoaXMucGxvdFNpemVZPTNEYj9rOmw7dGhp
cy5wbG90Qm9yZGVyV2lkPQp0aD0zRGYucGxvdEJvcmRlcldpZHRofHwwO3RoaXMuc3BhY2luZ0Jv
eD0zRGMuc3BhY2luZ0JveD0zRHt4OmdbM10seTpnWzBdLHc9CmlkdGg6ZC1nWzNdLWdbMV0saGVp
Z2h0OmUtZ1swXS1nWzJdfTt0aGlzLnBsb3RCb3g9M0RjLnBsb3RCb3g9M0R7eDppLHk6aix3aT0K
ZHRoOmssaGVpZ2h0Omx9O2Q9M0QyKlQodGhpcy5wbG90Qm9yZGVyV2lkdGgvMik7Yj0zREthKHYo
ZCxoWzNdKS8yKTtjPTNES2EoPQp2KGQsaFswXSkvMik7dGhpcy5jbGlwQm94PTNEe3g6Yix5OmMs
d2lkdGg6VCh0aGlzLnBsb3RTaXplWC12KGQsaFsxXSkvMi1iKSw9CmhlaWdodDpUKHRoaXMucGxv
dFNpemVZLXYoZCxoWzJdKS8yLWMpfTthfHxwKHRoaXMuYXhlcyxmdW5jdGlvbihhKXthLnNldEF4
aT0Kc1NpemUoKTsKLWEuc2V0QXhpc1RyYW5zbGF0aW9uKCl9KX0scmVzZXRNYXJnaW5zOmZ1bmN0
aW9uKCl7dmFyIGE9M0R0aGlzLnNwYWNpbmcsYj0KPTNEdGhpcy5tYXJnaW47dGhpcy5wbG90VG9w
PTNEbShiWzBdLGFbMF0pO3RoaXMubWFyZ2luUmlnaHQ9M0RtKGJbMV0sYVsxXSk7PQp0aGlzLm1h
cmdpbkJvdHRvbT0zRG0oYlsyXSxhWzJdKTt0aGlzLnBsb3RMZWZ0PTNEbShiWzNdLGFbM10pO3Ro
aXMuYXhpc09mZnM9CmV0PTNEWzAsMCwwLDBdO3RoaXMuY2xpcE9mZnNldD0zRFswLDAsMCwwXX0s
ZHJhd0NoYXJ0Qm94OmZ1bmN0aW9uKCl7dmFyIGE9Cj0zRHRoaXMub3B0aW9ucy5jaGFydCxiPTNE
dGhpcy5yZW5kZXJlcixjPTNEdGhpcy5jaGFydFdpZHRoLGQ9M0R0aGlzLmNoYXJ0SD0KZWlnaHQs
ZT0zRHRoaXMuY2hhcnRCYWNrZ3JvdW5kLGY9M0R0aGlzLnBsb3RCYWNrZ3JvdW5kLGc9M0R0aGlz
LnBsb3RCb3JkZXIsPQpoPTNEdGhpcy5wbG90QkdJbWFnZSxpPTNEYS5ib3JkZXJXaWR0aHx8MCxq
PTNEYS5iYWNrZ3JvdW5kQ29sb3Isaz0zRGEucGxvdEI9CmFja2dyb3VuZENvbG9yLGw9M0RhLnBs
b3RCYWNrZ3JvdW5kSW1hZ2UsCi1vPTNEYS5wbG90Qm9yZGVyV2lkdGh8fDAsbixzPTNEdGhpcy5w
bG90TGVmdCxtPTNEdGhpcy5wbG90VG9wLHA9M0R0aGlzLnBsbz0KdFdpZHRoLHE9M0R0aGlzLnBs
b3RIZWlnaHQscj0zRHRoaXMucGxvdEJveCx2PTNEdGhpcy5jbGlwUmVjdCx1PTNEdGhpcy5jbGlw
PQpCb3g7bj0zRGkrKGEuc2hhZG93Pzg6MCk7aWYoaXx8ailpZihlKWUuYW5pbWF0ZShlLmNyaXNw
KHt3aWR0aDpjLW4saGVpZ2h0OmQ9Ci1ufSkpO2Vsc2V7ZT0zRHtmaWxsOmp8fFF9O2lmKGkpZS5z
dHJva2U9M0RhLmJvcmRlckNvbG9yLGVbInN0cm9rZS13aWR0aCJdPQo9M0RpO3RoaXMuY2hhcnRC
YWNrZ3JvdW5kPTNEYi5yZWN0KG4vMixuLzIsYy1uLGQtbixhLmJvcmRlclJhZGl1cyxpKS5hdHRy
KGU9CikuYWRkQ2xhc3MoImhpZ2hjaGFydHMtYmFja2dyb3VuZCIpLmFkZCgpLnNoYWRvdyhhLnNo
YWRvdyl9aWYoaylmP2YuYW5pbWF0ZT0KKHIpOnRoaXMucGxvdEJhY2tncm91bmQ9M0RiLnJlY3Qo
cyxtLHAscSwwKS5hdHRyKHtmaWxsOmt9KS5hZGQoKS5zaGFkb3coYS5wPQpsb3RTaGFkb3cpOwot
aWYobCloP2guYW5pbWF0ZShyKTp0aGlzLnBsb3RCR0ltYWdlPTNEYi5pbWFnZShsLHMsbSxwLHEp
LmFkZCgpO3Y/di5hbmltYXQ9CmUoe3dpZHRoOnUud2lkdGgsaGVpZ2h0OnUuaGVpZ2h0fSk6dGhp
cy5jbGlwUmVjdD0zRGIuY2xpcFJlY3QodSk7aWYobylnP2cuYT0KbmltYXRlKGcuY3Jpc3Aoe3g6
cyx5Om0sd2lkdGg6cCxoZWlnaHQ6cX0pKTp0aGlzLnBsb3RCb3JkZXI9M0RiLnJlY3QocyxtLHAs
PQpxLDAsLW8pLmF0dHIoe3N0cm9rZTphLnBsb3RCb3JkZXJDb2xvciwic3Ryb2tlLXdpZHRoIjpv
LGZpbGw6USx6SW5kZXg6MX0pLmE9CmRkKCk7dGhpcy5pc0RpcnR5Qm94PTNEITF9LHByb3BGcm9t
U2VyaWVzOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLGI9M0RhLm9wdD0KaW9ucy5jaGFydCxjLGQ9
M0RhLm9wdGlvbnMuc2VyaWVzLGUsZjtwKFsiaW52ZXJ0ZWQiLCJhbmd1bGFyIiwicG9sYXIiXSxm
dW5jPQp0aW9uKGcpe2M9M0RGW2IudHlwZXx8Yi5kZWZhdWx0U2VyaWVzVHlwZV07Zj0zRGFbZ118
fGJbZ118fGMmJmMucHJvdG90eXBlW2c9Cl07Ci1mb3IoZT0zRGQmJmQubGVuZ3RoOyFmJiZlLS07
KShjPTNERltkW2VdLnR5cGVdKSYmYy5wcm90b3R5cGVbZ10mJihmPTNEITApOz0KYVtnXT0zRGZ9
KX0sbGlua1NlcmllczpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcyxiPTNEYS5zZXJpZXM7cChiLGZ1
bmN0aW9uKGEpPQp7YS5saW5rZWRTZXJpZXMubGVuZ3RoPTNEMH0pO3AoYixmdW5jdGlvbihiKXt2
YXIgZD0zRGIub3B0aW9ucy5saW5rZWRUbztpZig9CkZhKGQpJiYoZD0zRGQ9M0Q9M0Q9M0QiOnBy
ZXZpb3VzIj9hLnNlcmllc1tiLmluZGV4LTFdOmEuZ2V0KGQpKSlkLmxpbmtlZFNlcj0KaWVzLnB1
c2goYiksYi5saW5rZWRQYXJlbnQ9M0RkfSl9LHJlbmRlclNlcmllczpmdW5jdGlvbigpe3AodGhp
cy5zZXJpZXMsZnVuPQpjdGlvbihhKXthLnRyYW5zbGF0ZSgpO2Euc2V0VG9vbHRpcFBvaW50cyYm
YS5zZXRUb29sdGlwUG9pbnRzKCk7YS5yZW5kZXIoKX09Cil9LHJlbmRlcjpmdW5jdGlvbigpe3Zh
ciBhPTNEdGhpcyxiPTNEYS5heGVzLGM9M0RhLnJlbmRlcmVyLGQ9M0RhLm9wdGlvbnMsZT0KPTNE
ZC5sYWJlbHMsZj0zRAotZC5jcmVkaXRzLGc7YS5zZXRUaXRsZSgpO2EubGVnZW5kPTNEbmV3IGxi
KGEsZC5sZWdlbmQpO2EuZ2V0U3RhY2tzKCk7cChiLGY9CnVuY3Rpb24oYSl7YS5zZXRTY2FsZSgp
fSk7YS5nZXRNYXJnaW5zKCk7YS5tYXhUaWNrcz0zRG51bGw7cChiLGZ1bmN0aW9uKGEpez0KYS5z
ZXRUaWNrUG9zaXRpb25zKCEwKTthLnNldE1heFRpY2tzKCl9KTthLmFkanVzdFRpY2tBbW91bnRz
KCk7YS5nZXRNYXJnaW5zPQooKTthLmRyYXdDaGFydEJveCgpO2EuaGFzQ2FydGVzaWFuU2VyaWVz
JiZwKGIsZnVuY3Rpb24oYSl7YS5yZW5kZXIoKX0pO2lmKCE9CmEuc2VyaWVzR3JvdXApYS5zZXJp
ZXNHcm91cD0zRGMuZygic2VyaWVzLWdyb3VwIikuYXR0cih7ekluZGV4OjN9KS5hZGQoKTthLj0K
cmVuZGVyU2VyaWVzKCk7ZS5pdGVtcyYmcChlLml0ZW1zLGZ1bmN0aW9uKGIpe3ZhciBkPTNEcShl
LnN0eWxlLGIuc3R5bGUpLGY9Cj0zRHooZC5sZWZ0KSthLnBsb3RMZWZ0LGc9M0R6KGQudG9wKSth
LnBsb3RUb3ArMTI7ZGVsZXRlIGQubGVmdDtkZWxldGUgZC50bz0KcDsKLWMudGV4dChiLmh0bWws
ZixnKS5hdHRyKHt6SW5kZXg6Mn0pLmNzcyhkKS5hZGQoKX0pO2lmKGYuZW5hYmxlZCYmIWEuY3Jl
ZGl0PQpzKWc9M0RmLmhyZWYsYS5jcmVkaXRzPTNEYy50ZXh0KGYudGV4dCwwLDApLm9uKCJjbGlj
ayIsZnVuY3Rpb24oKXtpZihnKWxvY2E9CnRpb24uaHJlZj0zRGd9KS5hdHRyKHthbGlnbjpmLnBv
c2l0aW9uLmFsaWduLHpJbmRleDo4fSkuY3NzKGYuc3R5bGUpLmFkZCgpLj0KYWxpZ24oZi5wb3Np
dGlvbik7YS5oYXNSZW5kZXJlZD0zRCEwfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlz
LGI9M0RhPQouYXhlcyxjPTNEYS5zZXJpZXMsZD0zRGEuY29udGFpbmVyLGUsZj0zRGQmJmQucGFy
ZW50Tm9kZTtEKGEsImRlc3Ryb3kiKTtWW2E9Ci5pbmRleF09M0R0O2FiLS07YS5yZW5kZXJUby5y
ZW1vdmVBdHRyaWJ1dGUoImRhdGEtaGlnaGNoYXJ0cy1jaGFydCIpO1coYSk7Zj0Kb3IoZT0zRGIu
bGVuZ3RoO2UtLTspYltlXT0zRGJbZV0uZGVzdHJveSgpO2ZvcihlPTNEYy5sZW5ndGg7ZS0tOylj
W2VdPTNEY1tlPQpdLmRlc3Ryb3koKTsKLXAoInRpdGxlLHN1YnRpdGxlLGNoYXJ0QmFja2dyb3Vu
ZCxwbG90QmFja2dyb3VuZCxwbG90QkdJbWFnZSxwbG90Qm9yZGVyLHNlPQpyaWVzR3JvdXAsY2xp
cFJlY3QsY3JlZGl0cyxwb2ludGVyLHNjcm9sbGVyLHJhbmdlU2VsZWN0b3IsbGVnZW5kLHJlc2V0
Wm9vbUI9CnV0dG9uLHRvb2x0aXAscmVuZGVyZXIiLnNwbGl0KCIsIiksZnVuY3Rpb24oYil7dmFy
IGM9M0RhW2JdO2MmJmMuZGVzdHJveSYmKD0KYVtiXT0zRGMuZGVzdHJveSgpKX0pO2lmKGQpZC5p
bm5lckhUTUw9M0QiIixXKGQpLGYmJlBhKGQpO2ZvcihlIGluIGEpZGVsZXRlPQogYVtlXX0saXNS
ZWFkeVRvUmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzO3JldHVybiFhYSYmST0zRD0zREku
dG9wJiZ5LnI9CmVhZHlTdGF0ZSE9M0Q9M0QiY29tcGxldGUifHxmYSYmIUkuY2Fudmc/KGZhP0xi
LnB1c2goZnVuY3Rpb24oKXthLmZpcnN0UmVuZD0KZXIoKX0sYS5vcHRpb25zLmdsb2JhbC5jYW52
YXNUb29sc1VSTCk6eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwKLWZ1bmN0aW9u
KCl7eS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixhLmZpcnN0UmVuZGVyKTt5LnJl
YWR5U3RhdGU9Cj0zRD0zRD0zRCJjb21wbGV0ZSImJmEuZmlyc3RSZW5kZXIoKX0pLCExKTohMH0s
Zmlyc3RSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgYT0KPTNEdGhpcyxiPTNEYS5vcHRpb25zLGM9M0Rh
LmNhbGxiYWNrO2lmKGEuaXNSZWFkeVRvUmVuZGVyKCkpe2EuZ2V0Q29udGFpbmVyPQooKTtEKGEs
ImluaXQiKTthLnJlc2V0TWFyZ2lucygpO2Euc2V0Q2hhcnRTaXplKCk7YS5wcm9wRnJvbVNlcmll
cygpO2EuZ2V0QXg9CmVzKCk7cChiLnNlcmllc3x8W10sZnVuY3Rpb24oYil7YS5pbml0U2VyaWVz
KGIpfSk7YS5saW5rU2VyaWVzKCk7RChhLCJiZWZvcj0KZVJlbmRlciIpO2lmKFIuUG9pbnRlcilh
LnBvaW50ZXI9M0RuZXcgV2EoYSxiKTthLnJlbmRlcigpO2EucmVuZGVyZXIuZHJhdygpPQo7YyYm
Yy5hcHBseShhLFthXSk7cChhLmNhbGxiYWNrcyxmdW5jdGlvbihiKXtiLmFwcGx5KGEsW2FdKX0p
O2EuY2xvbmVSZW5kZXI9ClRvKCEwKTsKLUQoYSwibG9hZCIpfX0sc3BsYXNoQXJyYXk6ZnVuY3Rp
b24oYSxiKXt2YXIgYz0zRGJbYV0sYz0zRGNhKGMpP2M6W2MsYyxjLGNdPQo7cmV0dXJuW20oYlth
KyJUb3AiXSxjWzBdKSxtKGJbYSsiUmlnaHQiXSxjWzFdKSxtKGJbYSsiQm90dG9tIl0sY1syXSks
bShiW2E9CisiTGVmdCJdLGNbM10pXX19O1lhLnByb3RvdHlwZS5jYWxsYmFja3M9M0RbXTtYPTNE
Ui5DZW50ZXJlZFNlcmllc01peGluPTNEez0KZ2V0Q2VudGVyOmZ1bmN0aW9uKCl7dmFyIGE9M0R0
aGlzLm9wdGlvbnMsYj0zRHRoaXMuY2hhcnQsYz0zRDIqKGEuc2xpY2VkT2ZmPQpzZXR8fDApLGQs
ZT0zRGIucGxvdFdpZHRoLTIqYyxmPTNEYi5wbG90SGVpZ2h0LTIqYyxiPTNEYS5jZW50ZXIsYT0z
RFttKGJbMF09CiwiNTAlIiksbShiWzFdLCI1MCUiKSxhLnNpemV8fCIxMDAlIixhLmlubmVyU2l6
ZXx8MF0sZz0zREMoZSxmKSxoO3JldHVybiBVYT0KKGEsZnVuY3Rpb24oYSxiKXtoPTNELyUkLy50
ZXN0KGEpO2Q9M0RiPDJ8fGI9M0Q9M0Q9M0QyJiZoO3JldHVybihoP1tlLGYsZyxnPQpdW2JdKnoo
YSkvMTAwOgotYSkrKGQ/YzowKX0pfX07dmFyIEVhPTNEZnVuY3Rpb24oKXt9O0VhLnByb3RvdHlw
ZT0zRHtpbml0OmZ1bmN0aW9uKGEsYixjKXs9CnRoaXMuc2VyaWVzPTNEYTt0aGlzLmFwcGx5T3B0
aW9ucyhiLGMpO3RoaXMucG9pbnRBdHRyPTNEe307aWYoYS5vcHRpb25zLmNvbD0Kb3JCeVBvaW50
JiYoYj0zRGEub3B0aW9ucy5jb2xvcnN8fGEuY2hhcnQub3B0aW9ucy5jb2xvcnMsdGhpcy5jb2xv
cj0zRHRoaXMuPQpjb2xvcnx8YlthLmNvbG9yQ291bnRlcisrXSxhLmNvbG9yQ291bnRlcj0zRD0z
RD0zRGIubGVuZ3RoKSlhLmNvbG9yQ291bnRlcj0KPTNEMDthLmNoYXJ0LnBvaW50Q291bnQrKzty
ZXR1cm4gdGhpc30sYXBwbHlPcHRpb25zOmZ1bmN0aW9uKGEsYil7dmFyIGM9M0R0PQpoaXMuc2Vy
aWVzLGQ9M0RjLnBvaW50VmFsS2V5LGE9M0RFYS5wcm90b3R5cGUub3B0aW9uc1RvT2JqZWN0LmNh
bGwodGhpcyxhKTs9CnEodGhpcyxhKTt0aGlzLm9wdGlvbnM9M0R0aGlzLm9wdGlvbnM/cSh0aGlz
Lm9wdGlvbnMsYSk6YTtpZihkKXRoaXMueT0zRHRoaT0Kc1tkXTtpZih0aGlzLng9M0Q9M0Q9M0QK
LXQmJmMpdGhpcy54PTNEYj0zRD0zRD0zRHQ/Yy5hdXRvSW5jcmVtZW50KCk6YjtyZXR1cm4gdGhp
c30sb3B0aW9uc1RvT2JqZWN0PQo6ZnVuY3Rpb24oYSl7dmFyIGI9M0R7fSxjPTNEdGhpcy5zZXJp
ZXMsZD0zRGMucG9pbnRBcnJheU1hcHx8WyJ5Il0sZT0zRGQubGU9Cm5ndGgsZj0zRDAsZz0zRDA7
aWYodHlwZW9mIGE9M0Q9M0Q9M0QibnVtYmVyInx8YT0zRD0zRD0zRG51bGwpYltkWzBdXT0zRGE7
ZT0KbHNlIGlmKExhKGEpKXtpZihhLmxlbmd0aD5lKXtjPTNEdHlwZW9mIGFbMF07aWYoYz0zRD0z
RD0zRCJzdHJpbmciKWIubmFtZT0KPTNEYVswXTtlbHNlIGlmKGM9M0Q9M0Q9M0QibnVtYmVyIili
Lng9M0RhWzBdO2YrK31mb3IoO2c8ZTspYltkW2crK11dPTNEYVtmPQorK119ZWxzZSBpZih0eXBl
b2YgYT0zRD0zRD0zRCJvYmplY3QiKXtiPTNEYTtpZihhLmRhdGFMYWJlbHMpYy5faGFzUG9pbnRM
YWI9CmVscz0zRCEwO2lmKGEubWFya2VyKWMuX2hhc1BvaW50TWFya2Vycz0zRCEwfXJldHVybiBi
fSxkZXN0cm95OmZ1bmN0aW9uKCl7dj0KYXIgYT0zRHRoaXMuc2VyaWVzLmNoYXJ0LGI9M0RhLmhv
dmVyUG9pbnRzLGM7YS5wb2ludENvdW50LS07Ci1pZihiJiYodGhpcy5zZXRTdGF0ZSgpLGphKGIs
dGhpcyksIWIubGVuZ3RoKSlhLmhvdmVyUG9pbnRzPTNEbnVsbDtpZih0aGlzPQo9M0Q9M0Q9M0Rh
LmhvdmVyUG9pbnQpdGhpcy5vbk1vdXNlT3V0KCk7aWYodGhpcy5ncmFwaGljfHx0aGlzLmRhdGFM
YWJlbClXKHQ9CmhpcyksdGhpcy5kZXN0cm95RWxlbWVudHMoKTt0aGlzLmxlZ2VuZEl0ZW0mJmEu
bGVnZW5kLmRlc3Ryb3lJdGVtKHRoaXMpO2Zvcj0KKGMgaW4gdGhpcyl0aGlzW2NdPTNEbnVsbH0s
ZGVzdHJveUVsZW1lbnRzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTNEImdyYXBoaWMsPQpkYXRhTGFi
ZWwsZGF0YUxhYmVsVXBwZXIsZ3JvdXAsY29ubmVjdG9yLHNoYWRvd0dyb3VwIi5zcGxpdCgiLCIp
LGIsYz0zRDY7Yy09Ci07KWI9M0RhW2NdLHRoaXNbYl0mJih0aGlzW2JdPTNEdGhpc1tiXS5kZXN0
cm95KCkpfSxnZXRMYWJlbENvbmZpZzpmdW5jdGlvbj0KKCl7cmV0dXJue3g6dGhpcy5jYXRlZ29y
eSx5OnRoaXMueSxrZXk6dGhpcy5uYW1lfHx0aGlzLmNhdGVnb3J5LHNlcmllczp0aGlzPQouc2Vy
aWVzLAotcG9pbnQ6dGhpcyxwZXJjZW50YWdlOnRoaXMucGVyY2VudGFnZSx0b3RhbDp0aGlzLnRv
dGFsfHx0aGlzLnN0YWNrVG90YWx9fSw9CnRvb2x0aXBGb3JtYXR0ZXI6ZnVuY3Rpb24oYSl7dmFy
IGI9M0R0aGlzLnNlcmllcyxjPTNEYi50b29sdGlwT3B0aW9ucyxkPTNEbT0KKGMudmFsdWVEZWNp
bWFscywiIiksZT0zRGMudmFsdWVQcmVmaXh8fCIiLGY9M0RjLnZhbHVlU3VmZml4fHwiIjtwKGIu
cG9pbnRBPQpycmF5TWFwfHxbInkiXSxmdW5jdGlvbihiKXtiPTNEIntwb2ludC4iK2I7aWYoZXx8
ZilhPTNEYS5yZXBsYWNlKGIrIn0iLGUrYis9CiJ9IitmKTthPTNEYS5yZXBsYWNlKGIrIn0iLGIr
IjosLiIrZCsiZn0iKX0pO3JldHVybiBJYShhLHtwb2ludDp0aGlzLHNlcmllcz0KOnRoaXMuc2Vy
aWVzfSl9LGZpcmVQb2ludEV2ZW50OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0zRHRoaXMsZT0zRHRo
aXMuc2VyaWVzPQoub3B0aW9uczsoZS5wb2ludC5ldmVudHNbYV18fGQub3B0aW9ucyYmZC5vcHRp
b25zLmV2ZW50cyYmZC5vcHRpb25zLmV2ZW50c1s9CmFdKSYmCi10aGlzLmltcG9ydEV2ZW50cygp
O2E9M0Q9M0Q9M0QiY2xpY2siJiZlLmFsbG93UG9pbnRTZWxlY3QmJihjPTNEZnVuY3Rpb24oYT0K
KXtkLnNlbGVjdChudWxsLGEuY3RybEtleXx8YS5tZXRhS2V5fHxhLnNoaWZ0S2V5KX0pO0QodGhp
cyxhLGIsYyl9fTt2YXIgTz0KPTNEZnVuY3Rpb24oKXt9O08ucHJvdG90eXBlPTNEe2lzQ2FydGVz
aWFuOiEwLHR5cGU6ImxpbmUiLHBvaW50Q2xhc3M6RWEsc29yPQp0ZWQ6ITAscmVxdWlyZVNvcnRp
bmc6ITAscG9pbnRBdHRyVG9PcHRpb25zOntzdHJva2U6ImxpbmVDb2xvciIsInN0cm9rZS13aWQ9
CnRoIjoibGluZVdpZHRoIixmaWxsOiJmaWxsQ29sb3IiLHI6InJhZGl1cyJ9LGF4aXNUeXBlczpb
InhBeGlzIiwieUF4aXMiXSxjbz0KbG9yQ291bnRlcjowLHBhcmFsbGVsQXJyYXlzOlsieCIsInki
XSxpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9M0R0aGlzLGQsZSxmPQo9M0RhLnNlcmllcyxnPTNE
ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLm9wdGlvbnMuaW5kZXgsYS5faSktbShiLm9wdGlvbnMu
aW49CmRleCwKLWIuX2kpfTtjLmNoYXJ0PTNEYTtjLm9wdGlvbnM9M0RiPTNEYy5zZXRPcHRpb25z
KGIpO2MubGlua2VkU2VyaWVzPTNEW107Yy5iPQppbmRBeGVzKCk7cShjLHtuYW1lOmIubmFtZSxz
dGF0ZToiIixwb2ludEF0dHI6e30sdmlzaWJsZTpiLnZpc2libGUhPTNEPTNEITE9CixzZWxlY3Rl
ZDpiLnNlbGVjdGVkPTNEPTNEPTNEITB9KTtpZihmYSliLmFuaW1hdGlvbj0zRCExO2U9M0RiLmV2
ZW50cztmb3IoZD0KIGluIGUpSyhjLGQsZVtkXSk7aWYoZSYmZS5jbGlja3x8Yi5wb2ludCYmYi5w
b2ludC5ldmVudHMmJmIucG9pbnQuZXZlbnRzLmNsPQppY2t8fGIuYWxsb3dQb2ludFNlbGVjdClh
LnJ1blRyYWNrZXJDbGljaz0zRCEwO2MuZ2V0Q29sb3IoKTtjLmdldFN5bWJvbCgpO3A9CihjLnBh
cmFsbGVsQXJyYXlzLGZ1bmN0aW9uKGEpe2NbYSsiRGF0YSJdPTNEW119KTtjLnNldERhdGEoYi5k
YXRhLCExKTtpZihjLj0KaXNDYXJ0ZXNpYW4pYS5oYXNDYXJ0ZXNpYW5TZXJpZXM9M0QhMDtmLnB1
c2goYyk7Yy5faT0zRGYubGVuZ3RoLTE7b2IoZixnKTt0PQpoaXMueUF4aXMmJgotb2IodGhpcy55
QXhpcy5zZXJpZXMsZyk7cChmLGZ1bmN0aW9uKGEsYil7YS5pbmRleD0zRGI7YS5uYW1lPTNEYS5u
YW1lfHwiU2U9CnJpZXMgIisoYisxKX0pfSxiaW5kQXhlczpmdW5jdGlvbigpe3ZhciBhPTNEdGhp
cyxiPTNEYS5vcHRpb25zLGM9M0RhLmNoYXJ0LD0KZDtwKGEuYXhpc1R5cGVzfHxbXSxmdW5jdGlv
bihlKXtwKGNbZV0sZnVuY3Rpb24oYyl7ZD0zRGMub3B0aW9ucztpZihiW2VdPTNEPQo9M0Q9M0Rk
LmluZGV4fHxiW2VdIT0zRD0zRHQmJmJbZV09M0Q9M0Q9M0RkLmlkfHxiW2VdPTNEPTNEPTNEdCYm
ZC5pbmRleD0zRD0KPTNEPTNEMCljLnNlcmllcy5wdXNoKGEpLGFbZV09M0RjLGMuaXNEaXJ0eT0z
RCEwfSk7IWFbZV0mJmEub3B0aW9uYWxBeGlzIT0KPTNEPTNEZSYmcmEoMTgsITApfSl9LHVwZGF0
ZVBhcmFsbGVsQXJyYXlzOmZ1bmN0aW9uKGEsYil7dmFyIGM9M0RhLnNlcmllcyxkPQo9M0Rhcmd1
bWVudHM7cChjLnBhcmFsbGVsQXJyYXlzLHR5cGVvZiBiPTNEPTNEPTNEIm51bWJlciI/ZnVuY3Rp
b24oZCl7dmFyIGY9Cj0zRGQ9M0Q9M0Q9M0QieSImJmMudG9ZRGF0YT9jLnRvWURhdGEoYSk6YVtk
XTsKLWNbZCsiRGF0YSJdW2JdPTNEZn06ZnVuY3Rpb24oYSl7QXJyYXkucHJvdG90eXBlW2JdLmFw
cGx5KGNbYSsiRGF0YSJdLEFycmF5PQoucHJvdG90eXBlLnNsaWNlLmNhbGwoZCwyKSl9KX0sYXV0
b0luY3JlbWVudDpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcy5vcHRpb249CnMsYj0zRHRoaXMueElu
Y3JlbWVudCxiPTNEbShiLGEucG9pbnRTdGFydCwwKTt0aGlzLnBvaW50SW50ZXJ2YWw9M0RtKHRo
aXMucD0Kb2ludEludGVydmFsLGEucG9pbnRJbnRlcnZhbCwxKTt0aGlzLnhJbmNyZW1lbnQ9M0Ri
K3RoaXMucG9pbnRJbnRlcnZhbDtyZXR1PQpybiBifSxnZXRTZWdtZW50czpmdW5jdGlvbigpe3Zh
ciBhPTNELTEsYj0zRFtdLGMsZD0zRHRoaXMucG9pbnRzLGU9M0RkLmxlbmc9CnRoO2lmKGUpaWYo
dGhpcy5vcHRpb25zLmNvbm5lY3ROdWxscyl7Zm9yKGM9M0RlO2MtLTspZFtjXS55PTNEPTNEPTNE
bnVsbCYmZD0KLnNwbGljZShjLDEpO2QubGVuZ3RoJiYoYj0zRFtkXSl9ZWxzZSBwKGQsZnVuY3Rp
b24oYyxnKXtjLnk9M0Q9M0Q9M0RudWxsPyhnPQo+YSsxJiZiLnB1c2goZC5zbGljZShhKwotMSxn
KSksYT0zRGcpOmc9M0Q9M0Q9M0RlLTEmJmIucHVzaChkLnNsaWNlKGErMSxnKzEpKX0pO3RoaXMu
c2VnbWVudHM9M0RifSw9CnNldE9wdGlvbnM6ZnVuY3Rpb24oYSl7dmFyIGI9M0R0aGlzLmNoYXJ0
LGM9M0RiLm9wdGlvbnMucGxvdE9wdGlvbnMsYj0zRGIudT0Kc2VyT3B0aW9uc3x8e30sZD0zRGIu
cGxvdE9wdGlvbnN8fHt9LGU9M0RjW3RoaXMudHlwZV07dGhpcy51c2VyT3B0aW9ucz0zRGE7PQpj
PTNEdyhlLGMuc2VyaWVzLGEpO3RoaXMudG9vbHRpcE9wdGlvbnM9M0R3KEUudG9vbHRpcCxFLnBs
b3RPcHRpb25zW3RoaXMudHk9CnBlXS50b29sdGlwLGIudG9vbHRpcCxkLnNlcmllcyYmZC5zZXJp
ZXMudG9vbHRpcCxkW3RoaXMudHlwZV0mJmRbdGhpcy50eXBlXT0KLnRvb2x0aXAsYS50b29sdGlw
KTtlLm1hcmtlcj0zRD0zRD0zRG51bGwmJmRlbGV0ZSBjLm1hcmtlcjtyZXR1cm4gY30sZ2V0Q29s
PQpvcjpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcy5vcHRpb25zLGI9M0R0aGlzLnVzZXJPcHRpb25z
LGM9M0R0aGlzLmNoYXJ0Lm9wdGk9Cm9ucy5jb2xvcnMsZD0zRHRoaXMuY2hhcnQuY291bnRlcnMs
Ci1lO2U9M0RhLmNvbG9yfHxiYVt0aGlzLnR5cGVdLmNvbG9yO2lmKCFlJiYhYS5jb2xvckJ5UG9p
bnQpcihiLl9jb2xvckluZGV4KT0KP2E9M0RiLl9jb2xvckluZGV4OihiLl9jb2xvckluZGV4PTNE
ZC5jb2xvcixhPTNEZC5jb2xvcisrKSxlPTNEY1thXTt0aGlzLmNvPQpsb3I9M0RlO2Qud3JhcENv
bG9yKGMubGVuZ3RoKX0sZ2V0U3ltYm9sOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLnVzZXJPcHRp
b249CnMsYj0zRHRoaXMub3B0aW9ucy5tYXJrZXIsYz0zRHRoaXMuY2hhcnQsZD0zRGMub3B0aW9u
cy5zeW1ib2xzLGM9M0RjLmNvdW50ZT0KcnM7dGhpcy5zeW1ib2w9M0RiLnN5bWJvbDtpZighdGhp
cy5zeW1ib2wpcihhLl9zeW1ib2xJbmRleCk/YT0zRGEuX3N5bWJvbEluPQpkZXg6KGEuX3N5bWJv
bEluZGV4PTNEYy5zeW1ib2wsYT0zRGMuc3ltYm9sKyspLHRoaXMuc3ltYm9sPTNEZFthXTtpZigv
XnVybC89Ci50ZXN0KHRoaXMuc3ltYm9sKSliLnJhZGl1cz0zRDA7Yy53cmFwU3ltYm9sKGQubGVu
Z3RoKX0sZHJhd0xlZ2VuZFN5bWJvbDpOLj0KZHJhd0xpbmVNYXJrZXIsCi1zZXREYXRhOmZ1bmN0
aW9uKGEsYixjLGQpe3ZhciBlPTNEdGhpcyxmPTNEZS5wb2ludHMsZz0zRGYmJmYubGVuZ3RofHww
LGgsaT0KPTNEZS5vcHRpb25zLGo9M0RlLmNoYXJ0LGs9M0RudWxsLGw9M0RlLnhBeGlzLG89M0Rs
JiYhIWwuY2F0ZWdvcmllcyxuPTNEZS50PQpvb2x0aXBQb2ludHMscz0zRGkudHVyYm9UaHJlc2hv
bGQscT0zRHRoaXMueERhdGEscj0zRHRoaXMueURhdGEsdj0zRChoPTNEZS49CnBvaW50QXJyYXlN
YXApJiZoLmxlbmd0aCxhPTNEYXx8W107aD0zRGEubGVuZ3RoO2I9M0RtKGIsITApO2lmKGQhPTNE
PTNEITEmJj0KaCYmZz0zRD0zRD0zRGgmJiFlLmNyb3BwZWQmJiFlLmhhc0dyb3VwZWREYXRhKXAo
YSxmdW5jdGlvbihhLGIpe2ZbYl0udXBkYXRlPQooYSwhMSl9KTtlbHNle2UueEluY3JlbWVudD0z
RG51bGw7ZS5wb2ludFJhbmdlPTNEbz8xOmkucG9pbnRSYW5nZTtlLmNvbG9yQ289CnVudGVyPTNE
MDtwKHRoaXMucGFyYWxsZWxBcnJheXMsZnVuY3Rpb24oYSl7ZVthKyJEYXRhIl0ubGVuZ3RoPTNE
MH0pO2lmKHMmJj0KaD5zKXtmb3IoYz0zRDA7az0zRD0zRD0zRG51bGwmJmM8aDspaz0zRAotYVtj
XSxjKys7aWYoaGEoaykpe289M0RtKGkucG9pbnRTdGFydCwwKTtpPTNEbShpLnBvaW50SW50ZXJ2
YWwsMSk7Zm9yKGM9M0Q9CjA7YzxoO2MrKylxW2NdPTNEbyxyW2NdPTNEYVtjXSxvKz0zRGk7ZS54
SW5jcmVtZW50PTNEb31lbHNlIGlmKExhKGspKWlmKHYpZj0Kb3IoYz0zRDA7YzxoO2MrKylpPTNE
YVtjXSxxW2NdPTNEaVswXSxyW2NdPTNEaS5zbGljZSgxLHYrMSk7ZWxzZSBmb3IoYz0zRDA7PQpj
PGg7YysrKWk9M0RhW2NdLHFbY109M0RpWzBdLHJbY109M0RpWzFdO2Vsc2UgcmEoMTIpfWVsc2Ug
Zm9yKGM9M0QwO2M8aDtjKys9CilpZihhW2NdIT0zRD0zRHQmJihpPTNEe3NlcmllczplfSxlLnBv
aW50Q2xhc3MucHJvdG90eXBlLmFwcGx5T3B0aW9ucy5hcHBseT0KKGksW2FbY11dKSxlLnVwZGF0
ZVBhcmFsbGVsQXJyYXlzKGksYyksbyYmaS5uYW1lKSlsLm5hbWVzW2kueF09M0RpLm5hbWU7RmEo
PQpyWzBdKSYmcmEoMTQsITApO2UuZGF0YT0zRFtdO2Uub3B0aW9ucy5kYXRhPTNEYTtmb3IoYz0z
RGc7Yy0tOylmW2NdJiZmW2NdLmQ9CmVzdHJveSYmZltjXS5kZXN0cm95KCk7Ci1pZihuKW4ubGVu
Z3RoPTNEMDtpZihsKWwubWluUmFuZ2U9M0RsLnVzZXJNaW5SYW5nZTtlLmlzRGlydHk9M0RlLmlz
RGlydHlEYT0KdGE9M0RqLmlzRGlydHlCb3g9M0QhMDtjPTNEITF9YiYmai5yZWRyYXcoYyl9LHBy
b2Nlc3NEYXRhOmZ1bmN0aW9uKGEpe3ZhciBiPQo9M0R0aGlzLnhEYXRhLGM9M0R0aGlzLnlEYXRh
LGQ9M0RiLmxlbmd0aCxlO2U9M0QwO3ZhciBmLGcsaD0zRHRoaXMueEF4aXMsaT0KPTNEdGhpcy5v
cHRpb25zLGo9M0RpLmNyb3BUaHJlc2hvbGQsaz0zRDAsbD0zRHRoaXMuaXNDYXJ0ZXNpYW4sbyxu
O2lmKGwmJiF0PQpoaXMuaXNEaXJ0eSYmIWguaXNEaXJ0eSYmIXRoaXMueUF4aXMuaXNEaXJ0eSYm
IWEpcmV0dXJuITE7aWYobCYmdGhpcy5zb3J0ZWQ9CiYmKCFqfHxkPmp8fHRoaXMuZm9yY2VDcm9w
KSlpZihvPTNEaC5taW4sbj0zRGgubWF4LGJbZC0xXTxvfHxiWzBdPm4pYj0zRFtdLD0KYz0zRFtd
O2Vsc2UgaWYoYlswXTxvfHxiW2QtMV0+billPTNEdGhpcy5jcm9wRGF0YSh0aGlzLnhEYXRhLHRo
aXMueURhdGEsbyxuPQopLGI9M0RlLnhEYXRhLGM9M0RlLnlEYXRhLAotZT0zRGUuc3RhcnQsZj0z
RCEwLGs9M0RiLmxlbmd0aDtmb3IoZD0zRGIubGVuZ3RoLTE7ZD49M0QwO2QtLSlhPTNEYltkXS1i
W2Q9Ci0xXSwhZiYmYltkXT5vJiZiW2RdPG4mJmsrKyxhPjAmJihnPTNEPTNEPTNEdHx8YTxnKT9n
PTNEYTphPDAmJnRoaXMucmVxdWlyZT0KU29ydGluZyYmcmEoMTUpO3RoaXMuY3JvcHBlZD0zRGY7
dGhpcy5jcm9wU3RhcnQ9M0RlO3RoaXMucHJvY2Vzc2VkWERhdGE9M0RiPQo7dGhpcy5wcm9jZXNz
ZWRZRGF0YT0zRGM7dGhpcy5hY3RpdmVQb2ludENvdW50PTNEaztpZihpLnBvaW50UmFuZ2U9M0Q9
M0Q9M0Q9Cm51bGwpdGhpcy5wb2ludFJhbmdlPTNEZ3x8MTt0aGlzLmNsb3Nlc3RQb2ludFJhbmdl
PTNEZ30sY3JvcERhdGE6ZnVuY3Rpb24oYT0KLGIsYyxkKXt2YXIgZT0zRGEubGVuZ3RoLGY9M0Qw
LGc9M0RlLGg9M0RtKHRoaXMuY3JvcFNob3VsZGVyLDEpLGk7Zm9yKGk9M0QwPQo7aTxlO2krKylp
ZihhW2ldPj0zRGMpe2Y9M0R2KDAsaS1oKTticmVha31mb3IoO2k8ZTtpKyspaWYoYVtpXT5kKXtn
PTNEaStoO2I9CnJlYWt9cmV0dXJue3hEYXRhOmEuc2xpY2UoZixnKSx5RGF0YTpiLnNsaWNlKGYs
Ci1nKSxzdGFydDpmLGVuZDpnfX0sZ2VuZXJhdGVQb2ludHM6ZnVuY3Rpb24oKXt2YXIgYT0zRHRo
aXMub3B0aW9ucy5kYXRhLGI9Cj0zRHRoaXMuZGF0YSxjLGQ9M0R0aGlzLnByb2Nlc3NlZFhEYXRh
LGU9M0R0aGlzLnByb2Nlc3NlZFlEYXRhLGY9M0R0aGlzLnBvaT0KbnRDbGFzcyxnPTNEZC5sZW5n
dGgsaD0zRHRoaXMuY3JvcFN0YXJ0fHwwLGksaj0zRHRoaXMuaGFzR3JvdXBlZERhdGEsayxsPTNE
PQpbXSxvO2lmKCFiJiYhailiPTNEW10sYi5sZW5ndGg9M0RhLmxlbmd0aCxiPTNEdGhpcy5kYXRh
PTNEYjtmb3Iobz0zRDA7bzxnO289CisrKWk9M0RoK28saj9sW29dPTNEKG5ldyBmKS5pbml0KHRo
aXMsW2Rbb11dLmNvbmNhdChxYShlW29dKSkpOihiW2ldP2s9M0RiWz0KaV06YVtpXSE9M0Q9M0R0
JiYoYltpXT0zRGs9M0QobmV3IGYpLmluaXQodGhpcyxhW2ldLGRbb10pKSxsW29dPTNEayk7aWYo
YiYmPQooZyE9M0Q9M0QoYz0zRGIubGVuZ3RoKXx8aikpZm9yKG89M0QwO288YztvKyspaWYobz0z
RD0zRD0zRGgmJiFqJiYobys9M0RnKSw9CmJbb10pYltvXS5kZXN0cm95RWxlbWVudHMoKSxiW29d
LnBsb3RYPTNECi10O3RoaXMuZGF0YT0zRGI7dGhpcy5wb2ludHM9M0RsfSxnZXRFeHRyZW1lczpm
dW5jdGlvbihhKXt2YXIgYj0zRHRoaXMueUF4aT0KcyxjPTNEdGhpcy5wcm9jZXNzZWRYRGF0YSxk
LGU9M0RbXSxmPTNEMDtkPTNEdGhpcy54QXhpcy5nZXRFeHRyZW1lcygpO3ZhciBnPQo9M0RkLm1p
bixoPTNEZC5tYXgsaSxqLGssbCxhPTNEYXx8dGhpcy5zdGFja2VkWURhdGF8fHRoaXMucHJvY2Vz
c2VkWURhdGE7ZD0KPTNEYS5sZW5ndGg7Zm9yKGw9M0QwO2w8ZDtsKyspaWYoaj0zRGNbbF0saz0z
RGFbbF0saT0zRGshPTNEPTNEbnVsbCYmayE9M0Q9Cj0zRHQmJighYi5pc0xvZ3x8ay5sZW5ndGh8
fGs+MCksaj0zRHRoaXMuZ2V0RXh0cmVtZXNGcm9tQWxsfHx0aGlzLmNyb3BwZWR8fD0KKGNbbCsx
XXx8aik+PTNEZyYmKGNbbC0xXXx8aik8PTNEaCxpJiZqKWlmKGk9M0RrLmxlbmd0aClmb3IoO2kt
LTspa1tpXSE9M0Q9Cj0zRG51bGwmJihlW2YrK109M0RrW2ldKTtlbHNlIGVbZisrXT0zRGs7dGhp
cy5kYXRhTWluPTNEbSh2b2lkIDAsTmEoZSkpO3RoaT0Kcy5kYXRhTWF4PTNEbSh2b2lkIDAsQmEo
ZSkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt0aGlzLnByb2Nlc3NlZFhEYXRhfHwKLXRoaXMucHJv
Y2Vzc0RhdGEoKTt0aGlzLmdlbmVyYXRlUG9pbnRzKCk7Zm9yKHZhciBhPTNEdGhpcy5vcHRpb25z
LGI9M0RhLnN0PQphY2tpbmcsYz0zRHRoaXMueEF4aXMsZD0zRGMuY2F0ZWdvcmllcyxlPTNEdGhp
cy55QXhpcyxmPTNEdGhpcy5wb2ludHMsZz0zRGY9Ci5sZW5ndGgsaD0zRCEhdGhpcy5tb2RpZnlW
YWx1ZSxpPTNEYS5wb2ludFBsYWNlbWVudCxqPTNEaT0zRD0zRD0zRCJiZXR3ZWVuIj0KfHxoYShp
KSxrPTNEYS50aHJlc2hvbGQsYT0zRDA7YTxnO2ErKyl7dmFyIGw9M0RmW2FdLG89M0RsLngsbj0z
RGwueSxzPTNEbC5sPQpvdyxwPTNEYiYmZS5zdGFja3NbKHRoaXMubmVnU3RhY2tzJiZuPGs/Ii0i
OiIiKSt0aGlzLnN0YWNrS2V5XTtpZihlLmlzTG9nJiY9Cm48PTNEMClsLnk9M0RuPTNEbnVsbDts
LnBsb3RYPTNEYy50cmFuc2xhdGUobywwLDAsMCwxLGksdGhpcy50eXBlPTNEPTNEPTNEIj0KZmxh
Z3MiKTtpZihiJiZ0aGlzLnZpc2libGUmJnAmJnBbb10pcD0zRHBbb10sbj0zRHAucG9pbnRzW3Ro
aXMuaW5kZXgrIiwiK2FdPQoscz0zRG5bMF0sbj0zRG5bMV0scz0zRD0zRD0zRDAmJihzPTNEbShr
LGUubWluKSksCi1lLmlzTG9nJiZzPD0zRDAmJihzPTNEbnVsbCksbC50b3RhbD0zRGwuc3RhY2tU
b3RhbD0zRHAudG90YWwsbC5wZXJjZW50YWdlPQo9M0RwLnRvdGFsJiZsLnkvcC50b3RhbCoxMDAs
bC5zdGFja1k9M0RuLHAuc2V0T2Zmc2V0KHRoaXMucG9pbnRYT2Zmc2V0fHwwLHQ9Cmhpcy5iYXJX
fHwwKTtsLnlCb3R0b209M0RyKHMpP2UudHJhbnNsYXRlKHMsMCwxLDAsMSk6bnVsbDtoJiYobj0z
RHRoaXMubW9kaT0KZnlWYWx1ZShuLGwpKTtsLnBsb3RZPTNEdHlwZW9mIG49M0Q9M0Q9M0QibnVt
YmVyIiYmbiE9M0Q9M0RJbmZpbml0eT9lLnRyYW5zPQpsYXRlKG4sMCwxLDAsMSk6dDtsLmNsaWVu
dFg9M0RqP2MudHJhbnNsYXRlKG8sMCwwLDAsMSk6bC5wbG90WDtsLm5lZ2F0aXZlPQo9M0RsLnk8
KGt8fDApO2wuY2F0ZWdvcnk9M0RkJiZkW2wueF0hPTNEPTNEdD9kW2wueF06bC54fXRoaXMuZ2V0
U2VnbWVudHMoKX09CixhbmltYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5jaGFydCxjPTNE
Yi5yZW5kZXJlcixkO2Q9M0R0aGlzLm9wdGlvbnMuYT0KbmltYXRpb247dmFyIGU9M0R0aGlzLmNs
aXBCb3h8fAotYi5jbGlwQm94LGY9M0RiLmludmVydGVkLGc7aWYoZCYmIWNhKGQpKWQ9M0RiYVt0
aGlzLnR5cGVdLmFuaW1hdGlvbjtnPTNEWyI9Cl9zaGFyZWRDbGlwIixkLmR1cmF0aW9uLGQuZWFz
aW5nLGUuaGVpZ2h0XS5qb2luKCIsIik7YT8oYT0zRGJbZ10sZD0zRGJbZysibT0KIl0sYXx8KGJb
Z109M0RhPTNEYy5jbGlwUmVjdChxKGUse3dpZHRoOjB9KSksYltnKyJtIl09M0RkPTNEYy5jbGlw
UmVjdCgtOTksPQpmPy1iLnBsb3RMZWZ0Oi1iLnBsb3RUb3AsOTksZj9iLmNoYXJ0V2lkdGg6Yi5j
aGFydEhlaWdodCkpLHRoaXMuZ3JvdXAuY2xpcCg9CmEpLHRoaXMubWFya2VyR3JvdXAuY2xpcChk
KSx0aGlzLnNoYXJlZENsaXBLZXk9M0RnKTooKGE9M0RiW2ddKSYmYS5hbmltYXRlKD0Ke3dpZHRo
OmIucGxvdFNpemVYfSxkKSxiW2crIm0iXSYmYltnKyJtIl0uYW5pbWF0ZSh7d2lkdGg6Yi5wbG90
U2l6ZVgrOTl9LGQpPQosdGhpcy5hbmltYXRlPTNEbnVsbCl9LGFmdGVyQW5pbWF0ZTpmdW5jdGlv
bigpe3ZhciBhPTNEdGhpcy5jaGFydCxiPTNEdGhpcy49CnNoYXJlZENsaXBLZXksCi1jPTNEdGhp
cy5ncm91cCxkPTNEdGhpcy5jbGlwQm94O2lmKGMmJnRoaXMub3B0aW9ucy5jbGlwIT0zRD0zRCEx
KXtpZighYnx8IT0KZCljLmNsaXAoZD9hLnJlbmRlcmVyLmNsaXBSZWN0KGQpOmEuY2xpcFJlY3Qp
O3RoaXMubWFya2VyR3JvdXAuY2xpcCgpfUQodGhpPQpzLCJhZnRlckFuaW1hdGUiKTtzZXRUaW1l
b3V0KGZ1bmN0aW9uKCl7YiYmYVtiXSYmKGR8fChhW2JdPTNEYVtiXS5kZXN0cm95KCk9CiksYVti
KyJtIl0mJihhW2IrIm0iXT0zRGFbYisibSJdLmRlc3Ryb3koKSkpfSwxMDApfSxkcmF3UG9pbnRz
OmZ1bmN0aW9uKCl7dj0KYXIgYSxiPTNEdGhpcy5wb2ludHMsYz0zRHRoaXMuY2hhcnQsZCxlLGYs
ZyxoLGksaixrO2Q9M0R0aGlzLm9wdGlvbnMubWFya2VyPQo7dmFyIGw9M0R0aGlzLnBvaW50QXR0
clsiIl0sbyxuPTNEdGhpcy5tYXJrZXJHcm91cCxzPTNEbShkLmVuYWJsZWQsdGhpcy5hY3Q9Cml2
ZVBvaW50Q291bnQ8MC41KnRoaXMueEF4aXMubGVuL2QucmFkaXVzKTtpZihkLmVuYWJsZWQhPTNE
PTNEITF8fHRoaXMuX2hhcz0KUG9pbnRNYXJrZXJzKWZvcihmPTNECi1iLmxlbmd0aDtmLS07KWlm
KGc9M0RiW2ZdLGQ9M0RUKGcucGxvdFgpLGU9M0RnLnBsb3RZLGs9M0RnLmdyYXBoaWMsaT0zRGcu
bT0KYXJrZXJ8fHt9LGE9M0RzJiZpLmVuYWJsZWQ9M0Q9M0Q9M0R0fHxpLmVuYWJsZWQsbz0zRGMu
aXNJbnNpZGVQbG90KHUoZCksZSxjPQouaW52ZXJ0ZWQpLGEmJmUhPTNEPTNEdCYmIWlzTmFOKGUp
JiZnLnkhPTNEPTNEbnVsbClpZihhPTNEZy5wb2ludEF0dHJbZy5zZWw9CmVjdGVkPyJzZWxlY3Qi
OiIiXXx8bCxoPTNEYS5yLGk9M0RtKGkuc3ltYm9sLHRoaXMuc3ltYm9sKSxqPTNEaS5pbmRleE9m
KCJ1cj0KbCIpPTNEPTNEPTNEMCxrKWtbbz8ic2hvdyI6ImhpZGUiXSghMCkuYW5pbWF0ZShxKHt4
OmQtaCx5OmUtaH0say5zeW1ib2xOYW1lPQo/e3dpZHRoOjIqaCxoZWlnaHQ6MipofTp7fSkpO2Vs
c2V7aWYobyYmKGg+MHx8aikpZy5ncmFwaGljPTNEYy5yZW5kZXJlci5zeW09CmJvbChpLGQtaCxl
LWgsMipoLDIqaCkuYXR0cihhKS5hZGQobil9ZWxzZSBpZihrKWcuZ3JhcGhpYz0zRGsuZGVzdHJv
eSgpfSxjbz0KbnZlcnRBdHRyaWJzOmZ1bmN0aW9uKGEsCi1iLGMsZCl7dmFyIGU9M0R0aGlzLnBv
aW50QXR0clRvT3B0aW9ucyxmLGcsaD0zRHt9LGE9M0RhfHx7fSxiPTNEYnx8e30sYz0zRD0KY3x8
e30sZD0zRGR8fHt9O2ZvcihmIGluIGUpZz0zRGVbZl0saFtmXT0zRG0oYVtnXSxiW2ZdLGNbZl0s
ZFtmXSk7cmV0dXJuIGh9PQosZ2V0QXR0cmliczpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcyxiPTNE
YS5vcHRpb25zLGM9M0RiYVthLnR5cGVdLm1hcmtlcj9iLm09CmFya2VyOmIsZD0zRGMuc3RhdGVz
LGU9M0RkLmhvdmVyLGYsZz0zRGEuY29sb3I7Zj0zRHtzdHJva2U6ZyxmaWxsOmd9O3ZhciBoPQo9
M0RhLnBvaW50c3x8W10saSxqPTNEW10sayxsPTNEYS5wb2ludEF0dHJUb09wdGlvbnM7az0zRGEu
aGFzUG9pbnRTcGVjaWZpY089CnB0aW9uczt2YXIgbz0zRGIubmVnYXRpdmVDb2xvcixuPTNEYy5s
aW5lQ29sb3Iscz0zRGMuZmlsbENvbG9yO2k9M0RiLnR1cmJvVD0KaHJlc2hvbGQ7dmFyIG07Yi5t
YXJrZXI/KGUucmFkaXVzPTNEZS5yYWRpdXN8fGMucmFkaXVzKzIsZS5saW5lV2lkdGg9M0RlLmxp
PQpuZVdpZHRofHxjLmxpbmVXaWR0aCsxKTplLmNvbG9yPTNECi1lLmNvbG9yfHx5YShlLmNvbG9y
fHxnKS5icmlnaHRlbihlLmJyaWdodG5lc3MpLmdldCgpO2pbIiJdPTNEYS5jb252ZXJ0QXR0cj0K
aWJzKGMsZik7cChbImhvdmVyIiwic2VsZWN0Il0sZnVuY3Rpb24oYil7altiXT0zRGEuY29udmVy
dEF0dHJpYnMoZFtiXSxqWyIiPQpdKX0pO2EucG9pbnRBdHRyPTNEajtnPTNEaC5sZW5ndGg7aWYo
IWl8fGc8aXx8aylmb3IoO2ctLTspe2k9M0RoW2ddO2lmKChjPQo9M0RpLm9wdGlvbnMmJmkub3B0
aW9ucy5tYXJrZXJ8fGkub3B0aW9ucykmJmMuZW5hYmxlZD0zRD0zRD0zRCExKWMucmFkaXVzPQo9
M0QwO2lmKGkubmVnYXRpdmUmJm8paS5jb2xvcj0zRGkuZmlsbENvbG9yPTNEbztrPTNEYi5jb2xv
ckJ5UG9pbnR8fGkuY29sb3I9CjtpZihpLm9wdGlvbnMpZm9yKG0gaW4gbClyKGNbbFttXV0pJiYo
az0zRCEwKTtpZihrKXtjPTNEY3x8e307az0zRFtdO2Q9M0RjLj0Kc3RhdGVzfHx7fTtmPTNEZC5o
b3Zlcj0zRGQuaG92ZXJ8fHt9O2lmKCFiLm1hcmtlcilmLmNvbG9yPTNEZi5jb2xvcnx8IWkub3B0
PQppb25zLmNvbG9yJiZlLmNvbG9yfHwKLXlhKGkuY29sb3IpLmJyaWdodGVuKGYuYnJpZ2h0bmVz
c3x8ZS5icmlnaHRuZXNzKS5nZXQoKTtmPTNEe2NvbG9yOmkuY29sb3J9PQo7aWYoIXMpZi5maWxs
Q29sb3I9M0RpLmNvbG9yO2lmKCFuKWYubGluZUNvbG9yPTNEaS5jb2xvcjtrWyIiXT0zRGEuY29u
dmVydEE9CnR0cmlicyhxKGYsYyksalsiIl0pO2suaG92ZXI9M0RhLmNvbnZlcnRBdHRyaWJzKGQu
aG92ZXIsai5ob3ZlcixrWyIiXSk7ay5zZT0KbGVjdD0zRGEuY29udmVydEF0dHJpYnMoZC5zZWxl
Y3Qsai5zZWxlY3Qsa1siIl0pfWVsc2Ugaz0zRGo7aS5wb2ludEF0dHI9M0RrPQp9fSxkZXN0cm95
OmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLGI9M0RhLmNoYXJ0LGM9M0QvQXBwbGVXZWJLaXRcLzUz
My8udGVzdCg9CndhKSxkLGUsZj0zRGEuZGF0YXx8W10sZyxoLGk7RChhLCJkZXN0cm95Iik7Vyhh
KTtwKGEuYXhpc1R5cGVzfHxbXSxmdW5jdGlvbj0KKGIpe2lmKGk9M0RhW2JdKWphKGkuc2VyaWVz
LGEpLGkuaXNEaXJ0eT0zRGkuZm9yY2VSZWRyYXc9M0QhMH0pO2EubGVnZW5kSXRlPQptJiZhLmNo
YXJ0LmxlZ2VuZC5kZXN0cm95SXRlbShhKTsKLWZvcihlPTNEZi5sZW5ndGg7ZS0tOykoZz0zRGZb
ZV0pJiZnLmRlc3Ryb3kmJmcuZGVzdHJveSgpO2EucG9pbnRzPTNEbnVsbDtjPQpsZWFyVGltZW91
dChhLmFuaW1hdGlvblRpbWVvdXQpO3AoImFyZWEsZ3JhcGgsZGF0YUxhYmVsc0dyb3VwLGdyb3Vw
LG1hcmtlckc9CnJvdXAsdHJhY2tlcixncmFwaE5lZyxhcmVhTmVnLHBvc0NsaXAsbmVnQ2xpcCIu
c3BsaXQoIiwiKSxmdW5jdGlvbihiKXthW2JdJj0KJihkPTNEYyYmYj0zRD0zRD0zRCJncm91cCI/
ImhpZGUiOiJkZXN0cm95IixhW2JdW2RdKCkpfSk7aWYoYi5ob3ZlclNlcmllcz0KPTNEPTNEPTNE
YSliLmhvdmVyU2VyaWVzPTNEbnVsbDtqYShiLnNlcmllcyxhKTtmb3IoaCBpbiBhKWRlbGV0ZSBh
W2hdfSxnZXRTPQplZ21lbnRQYXRoOmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcyxjPTNEW10sZD0z
RGIub3B0aW9ucy5zdGVwO3AoYSxmdW5jdGlvbig9CmUsZil7dmFyIGc9M0RlLnBsb3RYLGg9M0Rl
LnBsb3RZLGk7Yi5nZXRQb2ludFNwbGluZT9jLnB1c2guYXBwbHkoYyxiLmdldFBvaT0KbnRTcGxp
bmUoYSwKLWUsZikpOihjLnB1c2goZj8iTCI6Ik0iKSxkJiZmJiYoaT0zRGFbZi0xXSxkPTNEPTNE
PTNEInJpZ2h0Ij9jLnB1c2goaS5wbG90PQpYLGgpOmQ9M0Q9M0Q9M0QiY2VudGVyIj9jLnB1c2go
KGkucGxvdFgrZykvMixpLnBsb3RZLChpLnBsb3RYK2cpLzIsaCk6Yy5wdXM9CmgoZyxpLnBsb3RZ
KSksYy5wdXNoKGUucGxvdFgsZS5wbG90WSkpfSk7cmV0dXJuIGN9LGdldEdyYXBoUGF0aDpmdW5j
dGlvbigpez0KdmFyIGE9M0R0aGlzLGI9M0RbXSxjLGQ9M0RbXTtwKGEuc2VnbWVudHMsZnVuY3Rp
b24oZSl7Yz0zRGEuZ2V0U2VnbWVudFBhdGgoPQplKTtlLmxlbmd0aD4xP2I9M0RiLmNvbmNhdChj
KTpkLnB1c2goZVswXSl9KTthLnNpbmdsZVBvaW50cz0zRGQ7cmV0dXJuIGEuZ3I9CmFwaFBhdGg9
M0RifSxkcmF3R3JhcGg6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMsYj0zRHRoaXMub3B0aW9ucyxj
PTNEW1siZ3JhcD0KaCIsYi5saW5lQ29sb3J8fHRoaXMuY29sb3JdXSxkPTNEYi5saW5lV2lkdGgs
ZT0zRGIuZGFzaFN0eWxlLGY9M0RiLmxpbmVjYXAhPQo9M0Q9M0Qic3F1YXJlIixnPTNEdGhpcy5n
ZXRHcmFwaFBhdGgoKSwKLWg9M0RiLm5lZ2F0aXZlQ29sb3I7aCYmYy5wdXNoKFsiZ3JhcGhOZWci
LGhdKTtwKGMsZnVuY3Rpb24oYyxoKXt2YXIgaz0zRGNbPQowXSxsPTNEYVtrXTtpZihsKWJiKGwp
LGwuYW5pbWF0ZSh7ZDpnfSk7ZWxzZSBpZihkJiZnLmxlbmd0aClsPTNEe3N0cm9rZTpjWzE9Cl0s
InN0cm9rZS13aWR0aCI6ZCxmaWxsOlEsekluZGV4OjF9LGU/bC5kYXNoc3R5bGU9M0RlOmYmJihs
WyJzdHJva2UtbGluZWNhcD0KIl09M0RsWyJzdHJva2UtbGluZWpvaW4iXT0zRCJyb3VuZCIpLGFb
a109M0RhLmNoYXJ0LnJlbmRlcmVyLnBhdGgoZykuYXR0cihsPQopLmFkZChhLmdyb3VwKS5zaGFk
b3coIWgmJmIuc2hhZG93KX0pfSxjbGlwTmVnOmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLm9wdGk9
Cm9ucyxiPTNEdGhpcy5jaGFydCxjPTNEYi5yZW5kZXJlcixkPTNEYS5uZWdhdGl2ZUNvbG9yfHxh
Lm5lZ2F0aXZlRmlsbENvbG9yLD0KZSxmPTNEdGhpcy5ncmFwaCxnPTNEdGhpcy5hcmVhLGg9M0R0
aGlzLnBvc0NsaXAsaT0zRHRoaXMubmVnQ2xpcDtlPTNEYi5jaGFyPQp0V2lkdGg7dmFyIGo9M0QK
LWIuY2hhcnRIZWlnaHQsaz0zRHYoZSxqKSxsPTNEdGhpcy55QXhpcztpZihkJiYoZnx8Zykpe2Q9
M0R1KGwudG9QaXhlbHMoYS50PQpocmVzaG9sZHx8MCwhMCkpO2Q8MCYmKGstPTNEZCk7YT0zRHt4
OjAseTowLHdpZHRoOmssaGVpZ2h0OmR9O2s9M0R7eDowLHk6ZCw9CndpZHRoOmssaGVpZ2h0Omt9
O2lmKGIuaW52ZXJ0ZWQpYS5oZWlnaHQ9M0RrLnk9M0RiLnBsb3RXaWR0aC1kLGMuaXNWTUwmJihh
PQo9M0R7eDpiLnBsb3RXaWR0aC1kLWIucGxvdExlZnQseTowLHdpZHRoOmUsaGVpZ2h0Omp9LGs9
M0R7eDpkK2IucGxvdExlZnQtZSw9Cnk6MCx3aWR0aDpiLnBsb3RMZWZ0K2QsaGVpZ2h0OmV9KTts
LnJldmVyc2VkPyhiPTNEayxlPTNEYSk6KGI9M0RhLGU9M0RrKTtoPz0KKGguYW5pbWF0ZShiKSxp
LmFuaW1hdGUoZSkpOih0aGlzLnBvc0NsaXA9M0RoPTNEYy5jbGlwUmVjdChiKSx0aGlzLm5lZ0Ns
aXA9Cj0zRGk9M0RjLmNsaXBSZWN0KGUpLGYmJnRoaXMuZ3JhcGhOZWcmJihmLmNsaXAoaCksdGhp
cy5ncmFwaE5lZy5jbGlwKGkpKSxnJj0KJihnLmNsaXAoaCksdGhpcy5hcmVhTmVnLmNsaXAoaSkp
KX19LAotaW52ZXJ0R3JvdXBzOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3ZhciBhPTNEe3dpZHRo
OmIueUF4aXMubGVuLGhlaWdodDpiLng9CkF4aXMubGVufTtwKFsiZ3JvdXAiLCJtYXJrZXJHcm91
cCJdLGZ1bmN0aW9uKGMpe2JbY10mJmJbY10uYXR0cihhKS5pbnZlcnQoKT0KfSl9dmFyIGI9M0R0
aGlzLGM9M0RiLmNoYXJ0O2lmKGIueEF4aXMpSyhjLCJyZXNpemUiLGEpLEsoYiwiZGVzdHJveSIs
ZnVuY3RpPQpvbigpe1coYywicmVzaXplIixhKX0pLGEoKSxiLmludmVydEdyb3Vwcz0zRGF9LHBs
b3RHcm91cDpmdW5jdGlvbihhLGIsYyxkLGU9Cil7dmFyIGY9M0R0aGlzW2FdLGc9M0QhZjtnJiYo
dGhpc1thXT0zRGY9M0R0aGlzLmNoYXJ0LnJlbmRlcmVyLmcoYikuYXR0cih7dj0KaXNpYmlsaXR5
OmMsekluZGV4OmR8fDAuMX0pLmFkZChlKSk7ZltnPyJhdHRyIjoiYW5pbWF0ZSJdKHRoaXMuZ2V0
UGxvdEJveCgpPQopO3JldHVybiBmfSxnZXRQbG90Qm94OmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlz
LmNoYXJ0LGI9M0R0aGlzLnhBeGlzLGM9M0R0aGk9CnMueUF4aXM7Ci1pZihhLmludmVydGVkKWI9
M0RjLGM9M0R0aGlzLnhBeGlzO3JldHVybnt0cmFuc2xhdGVYOmI/Yi5sZWZ0OmEucGxvdExlZnQs
dD0KcmFuc2xhdGVZOmM/Yy50b3A6YS5wbG90VG9wLHNjYWxlWDoxLHNjYWxlWToxfX0scmVuZGVy
OmZ1bmN0aW9uKCl7dmFyIGE9M0R0PQpoaXMsYj0zRGEuY2hhcnQsYyxkPTNEYS5vcHRpb25zLGU9
M0QoYz0zRGQuYW5pbWF0aW9uKSYmISFhLmFuaW1hdGUmJmIucmVuZGU9CnJlci5pc1NWRyYmbShj
LmR1cmF0aW9uLDUwMCl8fDAsZj0zRGEudmlzaWJsZT8idmlzaWJsZSI6ImhpZGRlbiIsZz0zRGQu
ekluZD0KZXgsaD0zRGEuaGFzUmVuZGVyZWQsaT0zRGIuc2VyaWVzR3JvdXA7Yz0zRGEucGxvdEdy
b3VwKCJncm91cCIsInNlcmllcyIsZixnPQosaSk7YS5tYXJrZXJHcm91cD0zRGEucGxvdEdyb3Vw
KCJtYXJrZXJHcm91cCIsIm1hcmtlcnMiLGYsZyxpKTtlJiZhLmFuaW1hdGU9CighMCk7YS5nZXRB
dHRyaWJzKCk7Yy5pbnZlcnRlZD0zRGEuaXNDYXJ0ZXNpYW4/Yi5pbnZlcnRlZDohMTthLmRyYXdH
cmFwaCYmKD0KYS5kcmF3R3JhcGgoKSwKLWEuY2xpcE5lZygpKTthLmRyYXdEYXRhTGFiZWxzJiZh
LmRyYXdEYXRhTGFiZWxzKCk7YS52aXNpYmxlJiZhLmRyYXdQb2ludHMoPQopO2EuZHJhd1RyYWNr
ZXImJmEub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nIT0zRD0zRCExJiZhLmRyYXdUcmFja2Vy
KCk7Yi49CmludmVydGVkJiZhLmludmVydEdyb3VwcygpO2QuY2xpcCE9M0Q9M0QhMSYmIWEuc2hh
cmVkQ2xpcEtleSYmIWgmJmMuY2xpcChiLj0KY2xpcFJlY3QpO2UmJmEuYW5pbWF0ZSgpO2lmKCFo
KWU/YS5hbmltYXRpb25UaW1lb3V0PTNEc2V0VGltZW91dChmdW5jdGlvbigpPQp7YS5hZnRlckFu
aW1hdGUoKX0sZSk6YS5hZnRlckFuaW1hdGUoKTthLmlzRGlydHk9M0RhLmlzRGlydHlEYXRhPTNE
ITE7YS5oYXM9ClJlbmRlcmVkPTNEITB9LHJlZHJhdzpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcy5j
aGFydCxiPTNEdGhpcy5pc0RpcnR5RGF0YSxjPQo9M0R0aGlzLmdyb3VwLGQ9M0R0aGlzLnhBeGlz
LGU9M0R0aGlzLnlBeGlzO2MmJihhLmludmVydGVkJiZjLmF0dHIoe3dpZHRoOmE9Ci5wbG90V2lk
dGgsCi1oZWlnaHQ6YS5wbG90SGVpZ2h0fSksYy5hbmltYXRlKHt0cmFuc2xhdGVYOm0oZCYmZC5s
ZWZ0LGEucGxvdExlZnQpLHRyYW5zbD0KYXRlWTptKGUmJmUudG9wLGEucGxvdFRvcCl9KSk7dGhp
cy50cmFuc2xhdGUoKTt0aGlzLnNldFRvb2x0aXBQb2ludHMmJnRoaXMuPQpzZXRUb29sdGlwUG9p
bnRzKCEwKTt0aGlzLnJlbmRlcigpO2ImJkQodGhpcywidXBkYXRlZERhdGEiKX19O0hiLnByb3Rv
dHlwZT0KPTNEe2Rlc3Ryb3k6ZnVuY3Rpb24oKXtPYSh0aGlzLHRoaXMuYXhpcyl9LHJlbmRlcjpm
dW5jdGlvbihhKXt2YXIgYj0zRHRoaXMuPQpvcHRpb25zLGM9M0RiLmZvcm1hdCxjPTNEYz9JYShj
LHRoaXMpOmIuZm9ybWF0dGVyLmNhbGwodGhpcyk7dGhpcy5sYWJlbD90aGk9CnMubGFiZWwuYXR0
cih7dGV4dDpjLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTp0aGlzLmxhYmVsPTNEdGhpcy5heGlzLmNo
YXJ0LnJlbj0KZGVyZXIudGV4dChjLG51bGwsbnVsbCxiLnVzZUhUTUwpLmNzcyhiLnN0eWxlKS5h
dHRyKHthbGlnbjp0aGlzLnRleHRBbGlnbiwKLXJvdGF0aW9uOmIucm90YXRpb24sdmlzaWJpbGl0
eToiaGlkZGVuIn0pLmFkZChhKX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYil7PQp2YXIgYz0zRHRo
aXMuYXhpcyxkPTNEYy5jaGFydCxlPTNEZC5pbnZlcnRlZCxmPTNEdGhpcy5pc05lZ2F0aXZlLGc9
M0RjLnRyYW49CnNsYXRlKGMudXNlUGVyY2VudGFnZT8xMDA6dGhpcy50b3RhbCwwLDAsMCwxKSxj
PTNEYy50cmFuc2xhdGUoMCksYz0zRE0oZy1jKT0KLGg9M0RkLnhBeGlzWzBdLnRyYW5zbGF0ZSh0
aGlzLngpK2EsaT0zRGQucGxvdEhlaWdodCxmPTNEe3g6ZT9mP2c6Zy1jOmgseTplPQo/aS1oLWI6
Zj9pLWctYzppLWcsd2lkdGg6ZT9jOmIsaGVpZ2h0OmU/YjpjfTtpZihlPTNEdGhpcy5sYWJlbCll
LmFsaWduKHRoaXM9Ci5hbGlnbk9wdGlvbnMsbnVsbCxmKSxmPTNEZS5hbGlnbkF0dHIsZVt0aGlz
Lm9wdGlvbnMuY3JvcD0zRD0zRD0zRCExfHxkLmlzST0KbnNpZGVQbG90KGYueCxmLnkpPyJzaG93
IjoiaGlkZSJdKCEwKX19O2xhLnByb3RvdHlwZS5idWlsZFN0YWNrcz0zRGZ1bmN0aW9uPQooKXt2
YXIgYT0zRAotdGhpcy5zZXJpZXMsYj0zRG0odGhpcy5vcHRpb25zLnJldmVyc2VkU3RhY2tzLCEw
KSxjPTNEYS5sZW5ndGg7aWYoIXRoaXMuaXM9ClhBeGlzKXtmb3IodGhpcy51c2VQZXJjZW50YWdl
PTNEITE7Yy0tOylhW2I/YzphLmxlbmd0aC1jLTFdLnNldFN0YWNrZWRQb2ludD0KcygpO2lmKHRo
aXMudXNlUGVyY2VudGFnZSlmb3IoYz0zRDA7YzxhLmxlbmd0aDtjKyspYVtjXS5zZXRQZXJjZW50
U3RhY2tzKCl9PQp9O2xhLnByb3RvdHlwZS5yZW5kZXJTdGFja1RvdGFscz0zRGZ1bmN0aW9uKCl7
dmFyIGE9M0R0aGlzLmNoYXJ0LGI9M0RhLnJlbmQ9CmVyZXIsYz0zRHRoaXMuc3RhY2tzLGQsZSxm
PTNEdGhpcy5zdGFja1RvdGFsR3JvdXA7aWYoIWYpdGhpcy5zdGFja1RvdGFsR3JvdT0KcD0zRGY9
M0RiLmcoInN0YWNrLWxhYmVscyIpLmF0dHIoe3Zpc2liaWxpdHk6InZpc2libGUiLHpJbmRleDo2
fSkuYWRkKCk7Zi50PQpyYW5zbGF0ZShhLnBsb3RMZWZ0LGEucGxvdFRvcCk7Zm9yKGQgaW4gYylm
b3IoZSBpbiBhPTNEY1tkXSxhKWFbZV0ucmVuZGVyKGY9Cil9OwotTy5wcm90b3R5cGUuc2V0U3Rh
Y2tlZFBvaW50cz0zRGZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLnN0YWNraW5nJiYhKHRoaXM9
Ci52aXNpYmxlIT0zRD0zRCEwJiZ0aGlzLmNoYXJ0Lm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVu
U2VyaWVzIT0zRD0zRCExKSl7dj0KYXIgYT0zRHRoaXMucHJvY2Vzc2VkWERhdGEsYj0zRHRoaXMu
cHJvY2Vzc2VkWURhdGEsYz0zRFtdLGQ9M0RiLmxlbmd0aCxlPTNEPQp0aGlzLm9wdGlvbnMsZj0z
RGUudGhyZXNob2xkLGc9M0RlLnN0YWNrLGU9M0RlLnN0YWNraW5nLGg9M0R0aGlzLnN0YWNrS2V5
LGk9Cj0zRCItIitoLGo9M0R0aGlzLm5lZ1N0YWNrcyxrPTNEdGhpcy55QXhpcyxsPTNEay5zdGFj
a3Msbz0zRGsub2xkU3RhY2tzLG4sbT0KLHAscSxyLHU7Zm9yKHE9M0QwO3E8ZDtxKyspe3I9M0Rh
W3FdO3U9M0RiW3FdO3A9M0R0aGlzLmluZGV4KyIsIitxO209M0Qobj0KPTNEaiYmdTxmKT9pOmg7
bFttXXx8KGxbbV09M0R7fSk7aWYoIWxbbV1bcl0pb1ttXSYmb1ttXVtyXT8obFttXVtyXT0zRG9b
bV1bPQpyXSxsW21dW3JdLnRvdGFsPTNEbnVsbCk6bFttXVtyXT0zRG5ldyBIYihrLAotay5vcHRp
b25zLnN0YWNrTGFiZWxzLG4scixnKTttPTNEbFttXVtyXTttLnBvaW50c1twXT0zRFttLmN1bXx8
MF07ZT0zRD0zRD0KPTNEInBlcmNlbnQiPyhuPTNEbj9oOmksaiYmbFtuXSYmbFtuXVtyXT8obj0z
RGxbbl1bcl0sbS50b3RhbD0zRG4udG90YWw9M0R2PQoobi50b3RhbCxtLnRvdGFsKStNKHUpfHww
KTptLnRvdGFsPTNEZGEobS50b3RhbCsoTSh1KXx8MCkpKTptLnRvdGFsPTNEZGEobS49CnRvdGFs
Kyh1fHwwKSk7bS5jdW09M0QobS5jdW18fDApKyh1fHwwKTttLnBvaW50c1twXS5wdXNoKG0uY3Vt
KTtjW3FdPTNEbS5jdT0KbX1pZihlPTNEPTNEPTNEInBlcmNlbnQiKWsudXNlUGVyY2VudGFnZT0z
RCEwO3RoaXMuc3RhY2tlZFlEYXRhPTNEYztrLm9sZFN0PQphY2tzPTNEe319fTtPLnByb3RvdHlw
ZS5zZXRQZXJjZW50U3RhY2tzPTNEZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMsYj0zRGEuc3Q9CmFj
a0tleSxjPTNEYS55QXhpcy5zdGFja3MsZD0zRGEucHJvY2Vzc2VkWERhdGE7cChbYiwiLSIrYl0s
ZnVuY3Rpb24oYil7dmFyID0KZTtmb3IodmFyIGY9M0RkLmxlbmd0aCxnLGg7Zi0tOylpZihnPTNE
Ci1kW2ZdLGU9M0QoaD0zRGNbYl0mJmNbYl1bZ10pJiZoLnBvaW50c1thLmluZGV4KyIsIitmXSxn
PTNEZSloPTNEaC50b3RhbD8xMD0KMC9oLnRvdGFsOjAsZ1swXT0zRGRhKGdbMF0qaCksZ1sxXT0z
RGRhKGdbMV0qaCksYS5zdGFja2VkWURhdGFbZl09M0RnWzFdfSl9PQo7cShZYS5wcm90b3R5cGUs
e2FkZFNlcmllczpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT0zRHRoaXM7YSYmKGI9M0RtKGIsITAp
LEQ9CihlLCJhZGRTZXJpZXMiLHtvcHRpb25zOmF9LGZ1bmN0aW9uKCl7ZD0zRGUuaW5pdFNlcmll
cyhhKTtlLmlzRGlydHlMZWdlbmQ9Cj0zRCEwO2UubGlua1NlcmllcygpO2ImJmUucmVkcmF3KGMp
fSkpO3JldHVybiBkfSxhZGRBeGlzOmZ1bmN0aW9uKGEsYixjLGQpez0KdmFyIGU9M0RiPyJ4QXhp
cyI6InlBeGlzIixmPTNEdGhpcy5vcHRpb25zO25ldyBsYSh0aGlzLHcoYSx7aW5kZXg6dGhpc1tl
XS5sPQplbmd0aCxpc1g6Yn0pKTtmW2VdPTNEcWEoZltlXXx8e30pO2ZbZV0ucHVzaChhKTttKGMs
ITApJiZ0aGlzLnJlZHJhdyhkKX0sc2g9Cm93TG9hZGluZzpmdW5jdGlvbihhKXt2YXIgYj0zRAot
dGhpcy5vcHRpb25zLGM9M0R0aGlzLmxvYWRpbmdEaXYsZD0zRGIubG9hZGluZztpZighYyl0aGlz
LmxvYWRpbmdEaXY9M0RjPQo9M0RZKEphLHtjbGFzc05hbWU6ImhpZ2hjaGFydHMtbG9hZGluZyJ9
LHEoZC5zdHlsZSx7ekluZGV4OjEwLGRpc3BsYXk6UX0pLHQ9Cmhpcy5jb250YWluZXIpLHRoaXMu
bG9hZGluZ1NwYW49M0RZKCJzcGFuIixudWxsLGQubGFiZWxTdHlsZSxjKTt0aGlzLmxvYWRpbj0K
Z1NwYW4uaW5uZXJIVE1MPTNEYXx8Yi5sYW5nLmxvYWRpbmc7aWYoIXRoaXMubG9hZGluZ1Nob3du
KUcoYyx7b3BhY2l0eTowLGRpPQpzcGxheToiIixsZWZ0OnRoaXMucGxvdExlZnQrInB4Iix0b3A6
dGhpcy5wbG90VG9wKyJweCIsd2lkdGg6dGhpcy5wbG90V2lkdGg9CisicHgiLGhlaWdodDp0aGlz
LnBsb3RIZWlnaHQrInB4In0pLGtiKGMse29wYWNpdHk6ZC5zdHlsZS5vcGFjaXR5fSx7ZHVyYXRp
bz0KbjpkLnNob3dEdXJhdGlvbnx8MH0pLHRoaXMubG9hZGluZ1Nob3duPTNEITB9LGhpZGVMb2Fk
aW5nOmZ1bmN0aW9uKCl7dmFyIGE9Cj0zRAotdGhpcy5vcHRpb25zLGI9M0R0aGlzLmxvYWRpbmdE
aXY7YiYma2IoYix7b3BhY2l0eTowfSx7ZHVyYXRpb246YS5sb2FkaW5nLmg9CmlkZUR1cmF0aW9u
fHwxMDAsY29tcGxldGU6ZnVuY3Rpb24oKXtHKGIse2Rpc3BsYXk6UX0pfX0pO3RoaXMubG9hZGlu
Z1Nob3duPQo9M0QhMX19KTtxKEVhLnByb3RvdHlwZSx7dXBkYXRlOmZ1bmN0aW9uKGEsYixjKXt2
YXIgZD0zRHRoaXMsZT0zRGQuc2VyaWVzLGY9Cj0zRGQuZ3JhcGhpYyxnLGg9M0RlLmRhdGEsaT0z
RGUuY2hhcnQsaj0zRGUub3B0aW9ucyxiPTNEbShiLCEwKTtkLmZpcmVQb2ludD0KRXZlbnQoInVw
ZGF0ZSIse29wdGlvbnM6YX0sZnVuY3Rpb24oKXtkLmFwcGx5T3B0aW9ucyhhKTtpZihjYShhKSl7
ZS5nZXRBdHRyPQppYnMoKTtpZihmKWEmJmEubWFya2VyJiZhLm1hcmtlci5zeW1ib2w/ZC5ncmFw
aGljPTNEZi5kZXN0cm95KCk6Zi5hdHRyKGQucG89CmludEF0dHJbZC5zdGF0ZXx8IiJdKTtpZihh
JiZhLmRhdGFMYWJlbHMmJmQuZGF0YUxhYmVsKWQuZGF0YUxhYmVsPTNEZC5kYXRhTD0KYWJlbC5k
ZXN0cm95KCl9Zz0zRAotRGEoZCxoKTtlLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKGQsZyk7ai5kYXRh
W2ddPTNEZC5vcHRpb25zO2UuaXNEaXJ0eT0zRGUuaXM9CkRpcnR5RGF0YT0zRCEwO2lmKCFlLmZp
eGVkQm94JiZlLmhhc0NhcnRlc2lhblNlcmllcylpLmlzRGlydHlCb3g9M0QhMDtqLmxlZz0KZW5k
VHlwZT0zRD0zRD0zRCJwb2ludCImJmkubGVnZW5kLmRlc3Ryb3lJdGVtKGQpO2ImJmkucmVkcmF3
KGMpfSl9LHJlbW92ZTpmPQp1bmN0aW9uKGEsYil7dmFyIGM9M0R0aGlzLGQ9M0RjLnNlcmllcyxl
PTNEZC5wb2ludHMsZj0zRGQuY2hhcnQsZyxoPTNEZC5kYXQ9CmE7UWEoYixmKTthPTNEbShhLCEw
KTtjLmZpcmVQb2ludEV2ZW50KCJyZW1vdmUiLG51bGwsZnVuY3Rpb24oKXtnPTNERGEoYyxoKT0K
O2gubGVuZ3RoPTNEPTNEPTNEZS5sZW5ndGgmJmUuc3BsaWNlKGcsMSk7aC5zcGxpY2UoZywxKTtk
Lm9wdGlvbnMuZGF0YS5zcGxpPQpjZShnLDEpO2QudXBkYXRlUGFyYWxsZWxBcnJheXMoYywic3Bs
aWNlIixnLDEpO2MuZGVzdHJveSgpO2QuaXNEaXJ0eT0zRCEwO2Q9Ci5pc0RpcnR5RGF0YT0zRAot
ITA7YSYmZi5yZWRyYXcoKX0pfX0pO3EoTy5wcm90b3R5cGUse2FkZFBvaW50OmZ1bmN0aW9uKGEs
YixjLGQpe3ZhciBlPTNEdGg9CmlzLm9wdGlvbnMsZj0zRHRoaXMuZGF0YSxnPTNEdGhpcy5ncmFw
aCxoPTNEdGhpcy5hcmVhLGk9M0R0aGlzLmNoYXJ0LGo9M0R0aD0KaXMueEF4aXMmJnRoaXMueEF4
aXMubmFtZXMsaz0zRGcmJmcuc2hpZnR8fDAsbD0zRGUuZGF0YSxvLG49M0R0aGlzLnhEYXRhO1Fh
PQooZCxpKTtjJiZwKFtnLGgsdGhpcy5ncmFwaE5lZyx0aGlzLmFyZWFOZWddLGZ1bmN0aW9uKGEp
e2lmKGEpYS5zaGlmdD0zRGsrMX09Cik7aWYoaCloLmlzQXJlYT0zRCEwO2I9M0RtKGIsITApO2Q9
M0R7c2VyaWVzOnRoaXN9O3RoaXMucG9pbnRDbGFzcy5wcm90b3R5cD0KZS5hcHBseU9wdGlvbnMu
YXBwbHkoZCxbYV0pO2c9M0RkLng7aD0zRG4ubGVuZ3RoO2lmKHRoaXMucmVxdWlyZVNvcnRpbmcm
Jmc8PQpuW2gtMV0pZm9yKG89M0QhMDtoJiZuW2gtMV0+ZzspaC0tO3RoaXMudXBkYXRlUGFyYWxs
ZWxBcnJheXMoZCwic3BsaWNlIixoLDA9CiwwKTt0aGlzLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKGQs
Ci1oKTtpZihqKWpbZ109M0RkLm5hbWU7bC5zcGxpY2UoaCwwLGEpO28mJih0aGlzLmRhdGEuc3Bs
aWNlKGgsMCxudWxsKSx0aGlzLj0KcHJvY2Vzc0RhdGEoKSk7ZS5sZWdlbmRUeXBlPTNEPTNEPTNE
InBvaW50IiYmdGhpcy5nZW5lcmF0ZVBvaW50cygpO2MmJihmWzBdPQomJmZbMF0ucmVtb3ZlP2Zb
MF0ucmVtb3ZlKCExKTooZi5zaGlmdCgpLHRoaXMudXBkYXRlUGFyYWxsZWxBcnJheXMoZCwic2hp
ZnQ9CiIpLGwuc2hpZnQoKSkpO3RoaXMuaXNEaXJ0eURhdGE9M0R0aGlzLmlzRGlydHk9M0QhMDti
JiYodGhpcy5nZXRBdHRyaWJzKCksaT0KLnJlZHJhdygpKX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7
dmFyIGM9M0R0aGlzLGQ9M0RjLmNoYXJ0LGE9M0RtKGEsITApO2lmKCFjPQouaXNSZW1vdmluZylj
LmlzUmVtb3Zpbmc9M0QhMCxEKGMsInJlbW92ZSIsbnVsbCxmdW5jdGlvbigpe2MuZGVzdHJveSgp
O2QuaXM9CkRpcnR5TGVnZW5kPTNEZC5pc0RpcnR5Qm94PTNEITA7ZC5saW5rU2VyaWVzKCk7YSYm
ZC5yZWRyYXcoYil9KTtjLmlzUmVtb3Zpbj0KZz0zRAotITF9LHVwZGF0ZTpmdW5jdGlvbihhLGIp
e3ZhciBjPTNEdGhpcy5jaGFydCxkPTNEdGhpcy50eXBlLGU9M0RGW2RdLnByb3RvdHk9CnBlLGYs
YT0zRHcodGhpcy51c2VyT3B0aW9ucyx7YW5pbWF0aW9uOiExLGluZGV4OnRoaXMuaW5kZXgscG9p
bnRTdGFydDp0aGlzLj0KeERhdGFbMF19LHtkYXRhOnRoaXMub3B0aW9ucy5kYXRhfSxhKTt0aGlz
LnJlbW92ZSghMSk7Zm9yKGYgaW4gZSllLmhhc093blByPQpvcGVydHkoZikmJih0aGlzW2ZdPTNE
dCk7cSh0aGlzLEZbYS50eXBlfHxkXS5wcm90b3R5cGUpO3RoaXMuaW5pdChjLGEpO20oYiw9CiEw
KSYmYy5yZWRyYXcoITEpfX0pO3EobGEucHJvdG90eXBlLHt1cGRhdGU6ZnVuY3Rpb24oYSxiKXt2
YXIgYz0zRHRoaXMuY2hhcj0KdCxhPTNEYy5vcHRpb25zW3RoaXMuY29sbF1bdGhpcy5vcHRpb25z
LmluZGV4XT0zRHcodGhpcy51c2VyT3B0aW9ucyxhKTt0aGlzPQouZGVzdHJveSghMCk7dGhpcy5f
YWRkZWRQbG90TEI9M0R0O3RoaXMuaW5pdChjLHEoYSx7ZXZlbnRzOnR9KSk7Yy5pc0RpcnR5Qm89
Cng9M0QKLSEwO20oYiwhMCkmJmMucmVkcmF3KCl9LHJlbW92ZTpmdW5jdGlvbihhKXtmb3IodmFy
IGI9M0R0aGlzLmNoYXJ0LGM9M0R0aGlzPQouY29sbCxkPTNEdGhpcy5zZXJpZXMsZT0zRGQubGVu
Z3RoO2UtLTspZFtlXSYmZFtlXS5yZW1vdmUoITEpO2phKGIuYXhlcyx0aGk9CnMpO2phKGJbY10s
dGhpcyk7Yi5vcHRpb25zW2NdLnNwbGljZSh0aGlzLm9wdGlvbnMuaW5kZXgsMSk7cChiW2NdLGZ1
bmN0aW9uKD0KYSxiKXthLm9wdGlvbnMuaW5kZXg9M0RifSk7dGhpcy5kZXN0cm95KCk7Yi5pc0Rp
cnR5Qm94PTNEITA7bShhLCEwKSYmYi5yZWRyPQphdygpfSxzZXRUaXRsZTpmdW5jdGlvbihhLGIp
e3RoaXMudXBkYXRlKHt0aXRsZTphfSxiKX0sc2V0Q2F0ZWdvcmllczpmdW5jdGk9Cm9uKGEsYil7
dGhpcy51cGRhdGUoe2NhdGVnb3JpZXM6YX0sYil9fSk7Z2E9M0RrYShPKTtGLmxpbmU9M0RnYTti
YS5hcmVhPTNEdz0KKFMse3RocmVzaG9sZDowfSk7dmFyIHBhPTNEa2EoTyx7dHlwZToiYXJlYSIs
Z2V0U2VnbWVudHM6ZnVuY3Rpb24oKXt2YXIgYT0KPTNECi1bXSxiPTNEW10sYz0zRFtdLGQ9M0R0
aGlzLnhBeGlzLGU9M0R0aGlzLnlBeGlzLGY9M0RlLnN0YWNrc1t0aGlzLnN0YWNrS2V5XT0KLGc9
M0R7fSxoLGksaj0zRHRoaXMucG9pbnRzLGs9M0R0aGlzLm9wdGlvbnMuY29ubmVjdE51bGxzLGws
byxuO2lmKHRoaXMub3B0PQppb25zLnN0YWNraW5nJiYhdGhpcy5jcm9wcGVkKXtmb3Iobz0zRDA7
bzxqLmxlbmd0aDtvKyspZ1tqW29dLnhdPTNEaltvXTtmb3I9CihuIGluIGYpZltuXS50b3RhbCE9
M0Q9M0RudWxsJiZjLnB1c2goK24pO2Muc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWJ9KT0K
O3AoYyxmdW5jdGlvbihhKXtpZigha3x8Z1thXSYmZ1thXS55IT0zRD0zRG51bGwpZ1thXT9iLnB1
c2goZ1thXSk6KGg9M0RkLnRyPQphbnNsYXRlKGEpLGw9M0RmW2FdLnBlcmNlbnQ/ZlthXS50b3Rh
bD9mW2FdLmN1bSoxMDAvZlthXS50b3RhbDowOmZbYV0uY3VtLGk9Cj0zRGUudG9QaXhlbHMobCwh
MCksYi5wdXNoKHt5Om51bGwscGxvdFg6aCxjbGllbnRYOmgscGxvdFk6aSx5Qm90dG9tOmksb25N
bz0KdXNlT3ZlcjpzYX0pKX0pOwotYi5sZW5ndGgmJmEucHVzaChiKX1lbHNlIE8ucHJvdG90eXBl
LmdldFNlZ21lbnRzLmNhbGwodGhpcyksYT0zRHRoaXMuc2VnbWU9Cm50czt0aGlzLnNlZ21lbnRz
PTNEYX0sZ2V0U2VnbWVudFBhdGg6ZnVuY3Rpb24oYSl7dmFyIGI9M0RPLnByb3RvdHlwZS5nZXRT
ZT0KZ21lbnRQYXRoLmNhbGwodGhpcyxhKSxjPTNEW10uY29uY2F0KGIpLGQsZT0zRHRoaXMub3B0
aW9ucztkPTNEYi5sZW5ndGg7dmFyPQogZj0zRHRoaXMueUF4aXMuZ2V0VGhyZXNob2xkKGUudGhy
ZXNob2xkKSxnO2Q9M0Q9M0Q9M0QzJiZjLnB1c2goIkwiLGJbMV0sYls9CjJdKTtpZihlLnN0YWNr
aW5nJiYhdGhpcy5jbG9zZWRTdGFja3MpZm9yKGQ9M0RhLmxlbmd0aC0xO2Q+PTNEMDtkLS0pZz0z
RG0oYT0KW2RdLnlCb3R0b20sZiksZDxhLmxlbmd0aC0xJiZlLnN0ZXAmJmMucHVzaChhW2QrMV0u
cGxvdFgsZyksYy5wdXNoKGFbZF0ucGxvPQp0WCxnKTtlbHNlIHRoaXMuY2xvc2VTZWdtZW50KGMs
YSxmKTt0aGlzLmFyZWFQYXRoPTNEdGhpcy5hcmVhUGF0aC5jb25jYXQoYyk9CjtyZXR1cm4gYn0s
Ci1jbG9zZVNlZ21lbnQ6ZnVuY3Rpb24oYSxiLGMpe2EucHVzaCgiTCIsYltiLmxlbmd0aC0xXS5w
bG90WCxjLCJMIixiWzBdLnBsbz0KdFgsYyl9LGRyYXdHcmFwaDpmdW5jdGlvbigpe3RoaXMuYXJl
YVBhdGg9M0RbXTtPLnByb3RvdHlwZS5kcmF3R3JhcGguYXBwbHkoPQp0aGlzKTt2YXIgYT0zRHRo
aXMsYj0zRHRoaXMuYXJlYVBhdGgsYz0zRHRoaXMub3B0aW9ucyxkPTNEYy5uZWdhdGl2ZUNvbG9y
LGU9Cj0zRGMubmVnYXRpdmVGaWxsQ29sb3IsZj0zRFtbImFyZWEiLHRoaXMuY29sb3IsYy5maWxs
Q29sb3JdXTsoZHx8ZSkmJmYucHVzaD0KKFsiYXJlYU5lZyIsZCxlXSk7cChmLGZ1bmN0aW9uKGQp
e3ZhciBlPTNEZFswXSxmPTNEYVtlXTtmP2YuYW5pbWF0ZSh7ZDpifSk6PQphW2VdPTNEYS5jaGFy
dC5yZW5kZXJlci5wYXRoKGIpLmF0dHIoe2ZpbGw6bShkWzJdLHlhKGRbMV0pLnNldE9wYWNpdHko
bShjLmY9CmlsbE9wYWNpdHksMC43NSkpLmdldCgpKSx6SW5kZXg6MH0pLmFkZChhLmdyb3VwKX0p
fSxkcmF3TGVnZW5kU3ltYm9sOk4uZHJhdz0KUmVjdGFuZ2xlfSk7Ci1GLmFyZWE9M0RwYTtiYS5z
cGxpbmU9M0R3KFMpO2dhPTNEa2EoTyx7dHlwZToic3BsaW5lIixnZXRQb2ludFNwbGluZTpmdW5j
dD0KaW9uKGEsYixjKXt2YXIgZD0zRGIucGxvdFgsZT0zRGIucGxvdFksZj0zRGFbYy0xXSxnPTNE
YVtjKzFdLGgsaSxqLGs7aWYoZiYmPQpnKXthPTNEZi5wbG90WTtqPTNEZy5wbG90WDt2YXIgZz0z
RGcucGxvdFksbDtoPTNEKDEuNSpkK2YucGxvdFgpLzIuNTtpPTNEKDE9Ci41KmUrYSkvMi41O2o9
M0QoMS41KmQraikvMi41O2s9M0QoMS41KmUrZykvMi41O2w9M0Qoay1pKSooai1kKS8oai1oKStl
LWs7aT0KKz0zRGw7ays9M0RsO2k+YSYmaT5lPyhpPTNEdihhLGUpLGs9M0QyKmUtaSk6aTxhJiZp
PGUmJihpPTNEQyhhLGUpLGs9M0QyKmUtPQppKTtrPmcmJms+ZT8oaz0zRHYoZyxlKSxpPTNEMipl
LWspOms8ZyYmazxlJiYoaz0zREMoZyxlKSxpPTNEMiplLWspO2IucmlnaHQ9CkNvbnRYPTNEajti
LnJpZ2h0Q29udFk9M0RrfWM/KGI9M0RbIkMiLGYucmlnaHRDb250WHx8Zi5wbG90WCxmLnJpZ2h0
Q29udFl8fD0KZi5wbG90WSxofHxkLGl8fGUsZCxlXSxmLnJpZ2h0Q29udFg9M0QKLWYucmlnaHRD
b250WT0zRG51bGwpOmI9M0RbIk0iLGQsZV07cmV0dXJuIGJ9fSk7Ri5zcGxpbmU9M0RnYTtiYS5h
cmVhc3BsaW5lPQo9M0R3KGJhLmFyZWEpO3BhPTNEcGEucHJvdG90eXBlO2dhPTNEa2EoZ2Ese3R5
cGU6ImFyZWFzcGxpbmUiLGNsb3NlZFN0YWNrczo9CiEwLGdldFNlZ21lbnRQYXRoOnBhLmdldFNl
Z21lbnRQYXRoLGNsb3NlU2VnbWVudDpwYS5jbG9zZVNlZ21lbnQsZHJhd0dyYXBoOj0KcGEuZHJh
d0dyYXBoLGRyYXdMZWdlbmRTeW1ib2w6Ti5kcmF3UmVjdGFuZ2xlfSk7Ri5hcmVhc3BsaW5lPTNE
Z2E7YmEuY29sdW1uPQo9M0R3KFMse2JvcmRlckNvbG9yOiIjRkZGRkZGIixib3JkZXJSYWRpdXM6
MCxncm91cFBhZGRpbmc6MC4yLG1hcmtlcjpudWxsLHA9Cm9pbnRQYWRkaW5nOjAuMSxtaW5Qb2lu
dExlbmd0aDowLGNyb3BUaHJlc2hvbGQ6NTAscG9pbnRSYW5nZTpudWxsLHN0YXRlczp7aD0Kb3Zl
cjp7YnJpZ2h0bmVzczowLjEsc2hhZG93OiExLGhhbG86ITF9LHNlbGVjdDp7Y29sb3I6IiNDMEMw
QzAiLGJvcmRlckNvbG9yPQo6IiMwMDAwMDAiLAotc2hhZG93OiExfX0sZGF0YUxhYmVsczp7YWxp
Z246bnVsbCx2ZXJ0aWNhbEFsaWduOm51bGwseTpudWxsfSxzdGlja3lUcmFja2k9Cm5nOiExLHRv
b2x0aXA6e2Rpc3RhbmNlOjZ9LHRocmVzaG9sZDowfSk7Z2E9M0RrYShPLHt0eXBlOiJjb2x1bW4i
LHBvaW50QXR0cj0KVG9PcHRpb25zOntzdHJva2U6ImJvcmRlckNvbG9yIixmaWxsOiJjb2xvciIs
cjoiYm9yZGVyUmFkaXVzIn0sY3JvcFNob3VsZGVyPQo6MCx0cmFja2VyR3JvdXBzOlsiZ3JvdXAi
LCJkYXRhTGFiZWxzR3JvdXAiXSxuZWdTdGFja3M6ITAsaW5pdDpmdW5jdGlvbigpe089Ci5wcm90
b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGE9M0R0aGlzLGI9M0RhLmNoYXJ0
O2IuaGFzUmVuZGVyZT0KZCYmcChiLnNlcmllcyxmdW5jdGlvbihiKXtpZihiLnR5cGU9M0Q9M0Q9
M0RhLnR5cGUpYi5pc0RpcnR5PTNEITB9KX0sZ2V0Q29sPQp1bW5NZXRyaWNzOmZ1bmN0aW9uKCl7
dmFyIGE9M0R0aGlzLGI9M0RhLm9wdGlvbnMsYz0zRGEueEF4aXMsZD0zRGEueUF4aXMsZT0KPTNE
Ci1jLnJldmVyc2VkLGYsZz0zRHt9LGgsaT0zRDA7Yi5ncm91cGluZz0zRD0zRD0zRCExP2k9M0Qx
OnAoYS5jaGFydC5zZXJpZXMsZj0KdW5jdGlvbihiKXt2YXIgYz0zRGIub3B0aW9ucyxlPTNEYi55
QXhpcztpZihiLnR5cGU9M0Q9M0Q9M0RhLnR5cGUmJmIudmlzaWJsPQplJiZkLmxlbj0zRD0zRD0z
RGUubGVuJiZkLnBvcz0zRD0zRD0zRGUucG9zKWMuc3RhY2tpbmc/KGY9M0RiLnN0YWNrS2V5LGdb
Zl09Cj0zRD0zRD0zRHQmJihnW2ZdPTNEaSsrKSxoPTNEZ1tmXSk6Yy5ncm91cGluZyE9M0Q9M0Qh
MSYmKGg9M0RpKyspLGIuY29sdW1uST0KbmRleD0zRGh9KTt2YXIgYz0zREMoTShjLnRyYW5zQSkq
KGMub3JkaW5hbFNsb3BlfHxiLnBvaW50UmFuZ2V8fGMuY2xvc2VzdFBvPQppbnRSYW5nZXx8Yy50
aWNrSW50ZXJ2YWx8fDEpLGMubGVuKSxqPTNEYypiLmdyb3VwUGFkZGluZyxrPTNEKGMtMipqKS9p
LGw9M0Q9CmIucG9pbnRXaWR0aCxiPTNEcihsKT8oay1sKS8yOmsqYi5wb2ludFBhZGRpbmcsbD0z
RG0obCxrLTIqYik7cmV0dXJuIGEuY29sdT0KbW5NZXRyaWNzPTNEe3dpZHRoOmwsb2Zmc2V0OmIr
KGorKChlP2ktKGEuY29sdW1uSW5kZXh8fAotMCk6YS5jb2x1bW5JbmRleCl8fDApKmstYy8yKSoo
ZT8tMToxKX19LHRyYW5zbGF0ZTpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcyw9CmI9M0RhLmNoYXJ0
LGM9M0RhLm9wdGlvbnMsZD0zRGEuYm9yZGVyV2lkdGg9M0RtKGMuYm9yZGVyV2lkdGgsYS5hY3Rp
dmVQb2ludD0KQ291bnQ+MC41KmEueEF4aXMubGVuPzA6MSksZT0zRGEueUF4aXMsZj0zRGEudHJh
bnNsYXRlZFRocmVzaG9sZD0zRGUuZ2V0VGhyPQplc2hvbGQoYy50aHJlc2hvbGQpLGc9M0RtKGMu
bWluUG9pbnRMZW5ndGgsNSksYz0zRGEuZ2V0Q29sdW1uTWV0cmljcygpLGg9M0Q9CmMud2lkdGgs
aT0zRGEuYmFyVz0zREthKHYoaCwxKzIqZCkpLGo9M0RhLnBvaW50WE9mZnNldD0zRGMub2Zmc2V0
LGs9M0QtKGQlMj0KPzAuNTowKSxsPTNEZCUyPzAuNToxO2IucmVuZGVyZXIuaXNWTUwmJmIuaW52
ZXJ0ZWQmJihsKz0zRDEpO08ucHJvdG90eXBlLnRyPQphbnNsYXRlLmFwcGx5KGEpO3AoYS5wb2lu
dHMsZnVuY3Rpb24oYyl7dmFyIGQ9M0RtKGMueUJvdHRvbSxmKSxwPTNEQyh2KC05OTk9Ci1kLGMu
cGxvdFkpLGUubGVuKwotOTk5K2QpLHE9M0RjLnBsb3RYK2oscj0zRGksdD0zREMocCxkKSx4O3g9
M0R2KHAsZCktdDtNKHgpPGcmJmcmJih4PTNEZyx0PQo9M0R1KE0odC1mKT5nP2QtZzpmLShlLnRy
YW5zbGF0ZShjLnksMCwxLDAsMSk8PTNEZj9nOjApKSk7Yy5iYXJYPTNEcTtjLnBvaW49CnRXaWR0
aD0zRGg7Yy50b29sdGlwUG9zPTNEYi5pbnZlcnRlZD9bZS5sZW4tcCxhLnhBeGlzLmxlbi1xLXIv
Ml06W3Erci8yLHBdOz0KZD0zRE0ocSk8MC41O3I9M0R1KHErcikraztxPTNEdShxKStrO3ItPTNE
cTtwPTNETSh0KTwwLjU7eD0zRHUodCt4KStsO3Q9M0R1PQoodCkrbDt4LT0zRHQ7ZCYmKHErPTNE
MSxyLT0zRDEpO3AmJih0LT0zRDEseCs9M0QxKTtjLnNoYXBlVHlwZT0zRCJyZWN0IjtjLnM9Cmhh
cGVBcmdzPTNEe3g6cSx5OnQsd2lkdGg6cixoZWlnaHQ6eH19KX0sZ2V0U3ltYm9sOnNhLGRyYXdM
ZWdlbmRTeW1ib2w6Ti5kcj0KYXdSZWN0YW5nbGUsZHJhd0dyYXBoOnNhLGRyYXdQb2ludHM6ZnVu
Y3Rpb24oKXt2YXIgYT0zRHRoaXMsYj0zRHRoaXMuY2hhcnQsPQpjPTNEYS5vcHRpb25zLGQ9M0Ri
LnJlbmRlcmVyLGU9M0RjLmFuaW1hdGlvbkxpbWl0fHwKLTI1MCxmLGcsaDtwKGEucG9pbnRzLGZ1
bmN0aW9uKGkpe3ZhciBqPTNEaS5wbG90WSxrPTNEaS5ncmFwaGljO2lmKGohPTNEPTNEPQp0JiYh
aXNOYU4oaikmJmkueSE9M0Q9M0RudWxsKWY9M0RpLnNoYXBlQXJncyxoPTNEcihhLmJvcmRlcldp
ZHRoKT97InN0cm9rZS09CndpZHRoIjphLmJvcmRlcldpZHRofTp7fSxnPTNEaS5wb2ludEF0dHJb
aS5zZWxlY3RlZD8ic2VsZWN0IjoiIl18fGEucG9pbnRBdD0KdHJbIiJdLGs/KGJiKGspLGsuYXR0
cihoKVtiLnBvaW50Q291bnQ8ZT8iYW5pbWF0ZSI6ImF0dHIiXSh3KGYpKSk6aS5ncmFwaGljPQo9
M0RkW2kuc2hhcGVUeXBlXShmKS5hdHRyKGcpLmF0dHIoaCkuYWRkKGEuZ3JvdXApLnNoYWRvdyhj
LnNoYWRvdyxudWxsLGMuc3Q9CmFja2luZyYmIWMuYm9yZGVyUmFkaXVzKTtlbHNlIGlmKGspaS5n
cmFwaGljPTNEay5kZXN0cm95KCl9KX0sYW5pbWF0ZTpmdW5jdD0KaW9uKGEpe3ZhciBiPTNEdGhp
cy55QXhpcyxjPTNEdGhpcy5vcHRpb25zLGQ9M0R0aGlzLmNoYXJ0LmludmVydGVkLGU9M0R7fTtp
PQpmKGFhKWE/Ci0oZS5zY2FsZVk9M0QwLjAwMSxhPTNEQyhiLnBvcytiLmxlbix2KGIucG9zLGIu
dG9QaXhlbHMoYy50aHJlc2hvbGQpKSksZD9lLj0KdHJhbnNsYXRlWD0zRGEtYi5sZW46ZS50cmFu
c2xhdGVZPTNEYSx0aGlzLmdyb3VwLmF0dHIoZSkpOihlLnNjYWxlWT0zRDEsZVtkPQo/InRyYW5z
bGF0ZVgiOiJ0cmFuc2xhdGVZIl09M0RiLnBvcyx0aGlzLmdyb3VwLmFuaW1hdGUoZSx0aGlzLm9w
dGlvbnMuYW5pbWE9CnRpb24pLHRoaXMuYW5pbWF0ZT0zRG51bGwpfSxyZW1vdmU6ZnVuY3Rpb24o
KXt2YXIgYT0zRHRoaXMsYj0zRGEuY2hhcnQ7Yi5oYT0Kc1JlbmRlcmVkJiZwKGIuc2VyaWVzLGZ1
bmN0aW9uKGIpe2lmKGIudHlwZT0zRD0zRD0zRGEudHlwZSliLmlzRGlydHk9M0QhMH0pPQo7Ty5w
cm90b3R5cGUucmVtb3ZlLmFwcGx5KGEsYXJndW1lbnRzKX19KTtGLmNvbHVtbj0zRGdhO2JhLmJh
cj0zRHcoYmEuY29sdW09Cm4pO3BhPTNEa2EoZ2Ese3R5cGU6ImJhciIsaW52ZXJ0ZWQ6ITB9KTtG
LmJhcj0zRHBhO2JhLnNjYXR0ZXI9M0R3KFMse2xpbmVXaT0KZHRoOjAsdG9vbHRpcDp7aGVhZGVy
Rm9ybWF0Oic8c3BhbiBzdHlsZT0zRCJjb2xvcjp7c2VyaWVzLmNvbG9yfSI+PUMzPUEyPUUyPQo9
ODA9OTQ9QzI9OEY8L3NwYW4+PHNwYW4gc3R5bGU9M0QiZm9udC1zaXplOiAxMHB4OyI+IHtzZXJp
ZXMubmFtZX08L3NwYW4+PGI9CnIvPicsCi1wb2ludEZvcm1hdDoieDogPGI+e3BvaW50Lnh9PC9i
Pjxici8+eTogPGI+e3BvaW50Lnl9PC9iPjxici8+In0sc3RpY2t5VHJhYz0Ka2luZzohMX0pO3Bh
PTNEa2EoTyx7dHlwZToic2NhdHRlciIsc29ydGVkOiExLHJlcXVpcmVTb3J0aW5nOiExLG5vU2hh
cmVkVG9vPQpsdGlwOiEwLHRyYWNrZXJHcm91cHM6WyJtYXJrZXJHcm91cCJdLHRha2VPcmRpbmFs
UG9zaXRpb246ITEsc2luZ3VsYXJUb29sdGk9CnBzOiEwLGRyYXdHcmFwaDpmdW5jdGlvbigpe3Ro
aXMub3B0aW9ucy5saW5lV2lkdGgmJk8ucHJvdG90eXBlLmRyYXdHcmFwaC5jYT0KbGwodGhpcyl9
fSk7Ri5zY2F0dGVyPTNEcGE7YmEucGllPTNEdyhTLHtib3JkZXJDb2xvcjoiI0ZGRkZGRiIsYm9y
ZGVyV2lkdGg6PQoxLGNlbnRlcjpbbnVsbCxudWxsXSxjbGlwOiExLGNvbG9yQnlQb2ludDohMCxk
YXRhTGFiZWxzOntkaXN0YW5jZTozMCxlbmFibGU9CmQ6ITAsZm9ybWF0dGVyOmZ1bmN0aW9uKCl7
cmV0dXJuIHRoaXMucG9pbnQubmFtZX19LGlnbm9yZUhpZGRlblBvaW50OiEwLAotbGVnZW5kVHlw
ZToicG9pbnQiLG1hcmtlcjpudWxsLHNpemU6bnVsbCxzaG93SW5MZWdlbmQ6ITEsc2xpY2VkT2Zm
c2V0OjEwLHM9CnRhdGVzOntob3Zlcjp7YnJpZ2h0bmVzczowLjEsc2hhZG93OiExfX0sc3RpY2t5
VHJhY2tpbmc6ITEsdG9vbHRpcDp7Zm9sbG93UD0Kb2ludGVyOiEwfX0pO1M9M0R7dHlwZToicGll
Iixpc0NhcnRlc2lhbjohMSxwb2ludENsYXNzOmthKEVhLHtpbml0OmZ1bmN0aW9uPQooKXtFYS5w
cm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGE9M0R0aGlzLGI7aWYoYS55
PDApYS55PTNEbnU9CmxsO3EoYSx7dmlzaWJsZTphLnZpc2libGUhPTNEPTNEITEsbmFtZTptKGEu
bmFtZSwiU2xpY2UiKX0pO2I9M0RmdW5jdGlvbihiKT0Ke2Euc2xpY2UoYi50eXBlPTNEPTNEPTNE
InNlbGVjdCIpfTtLKGEsInNlbGVjdCIsYik7SyhhLCJ1bnNlbGVjdCIsYik7cmV0dXJuPQogYX0s
c2V0VmlzaWJsZTpmdW5jdGlvbihhKXt2YXIgYj0zRHRoaXMsYz0zRGIuc2VyaWVzLGQ9M0RjLmNo
YXJ0O2IudmlzaWJsZT0KPTNEYi5vcHRpb25zLnZpc2libGU9M0QKLWE9M0RhPTNEPTNEPTNEdD8h
Yi52aXNpYmxlOmE7Yy5vcHRpb25zLmRhdGFbRGEoYixjLmRhdGEpXT0zRGIub3B0aW9ucztwKFsi
PQpncmFwaGljIiwiZGF0YUxhYmVsIiwiY29ubmVjdG9yIiwic2hhZG93R3JvdXAiXSxmdW5jdGlv
bihjKXtpZihiW2NdKWJbY11bYT89CiJzaG93IjoiaGlkZSJdKCEwKX0pO2IubGVnZW5kSXRlbSYm
ZC5sZWdlbmQuY29sb3JpemVJdGVtKGIsYSk7aWYoIWMuaXNEaXJ0eT0KJiZjLm9wdGlvbnMuaWdu
b3JlSGlkZGVuUG9pbnQpYy5pc0RpcnR5PTNEITAsZC5yZWRyYXcoKX0sc2xpY2U6ZnVuY3Rpb24o
YSxiPQosYyl7dmFyIGQ9M0R0aGlzLnNlcmllcztRYShjLGQuY2hhcnQpO20oYiwhMCk7dGhpcy5z
bGljZWQ9M0R0aGlzLm9wdGlvbnMuc2w9CmljZWQ9M0RhPTNEcihhKT9hOiF0aGlzLnNsaWNlZDtk
Lm9wdGlvbnMuZGF0YVtEYSh0aGlzLGQuZGF0YSldPTNEdGhpcy5vcHRpbz0KbnM7YT0zRGE/dGhp
cy5zbGljZWRUcmFuc2xhdGlvbjp7dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MH07dGhpcy5ncmFw
aGljLmFuPQppbWF0ZShhKTsKLXRoaXMuc2hhZG93R3JvdXAmJnRoaXMuc2hhZG93R3JvdXAuYW5p
bWF0ZShhKX0saGFsb1BhdGg6ZnVuY3Rpb24oYSl7dmFyIGI9Cj0zRHRoaXMuc2hhcGVBcmdzLGM9
M0R0aGlzLnNlcmllcy5jaGFydDtyZXR1cm4gdGhpcy5zZXJpZXMuY2hhcnQucmVuZGVyZXIucz0K
eW1ib2xzLmFyYyhjLnBsb3RMZWZ0K2IueCxjLnBsb3RUb3ArYi55LGIucithLGIucithLHtpbm5l
clI6dGhpcy5zaGFwZUFyZ3MuPQpyLHN0YXJ0OmIuc3RhcnQsZW5kOmIuZW5kfSl9fSkscmVxdWly
ZVNvcnRpbmc6ITEsbm9TaGFyZWRUb29sdGlwOiEwLHRyYWNrZXI9Ckdyb3VwczpbImdyb3VwIiwi
ZGF0YUxhYmVsc0dyb3VwIl0sYXhpc1R5cGVzOltdLHBvaW50QXR0clRvT3B0aW9uczp7c3Ryb2tl
Oj0KImJvcmRlckNvbG9yIiwic3Ryb2tlLXdpZHRoIjoiYm9yZGVyV2lkdGgiLGZpbGw6ImNvbG9y
In0sc2luZ3VsYXJUb29sdGlwczohPQowLGdldENvbG9yOnNhLGFuaW1hdGU6ZnVuY3Rpb24oYSl7
dmFyIGI9M0R0aGlzLGM9M0RiLnBvaW50cyxkPTNECi1iLnN0YXJ0QW5nbGVSYWQ7aWYoIWEpcChj
LGZ1bmN0aW9uKGEpe3ZhciBjPTNEYS5ncmFwaGljLGE9M0RhLnNoYXBlQXJncztjJj0KJihjLmF0
dHIoe3I6Yi5jZW50ZXJbM10vMixzdGFydDpkLGVuZDpkfSksYy5hbmltYXRlKHtyOmEucixzdGFy
dDphLnN0YXJ0LGVuPQpkOmEuZW5kfSxiLm9wdGlvbnMuYW5pbWF0aW9uKSl9KSxiLmFuaW1hdGU9
M0RudWxsfSxzZXREYXRhOmZ1bmN0aW9uKGEsYixjLGQ9Cil7Ty5wcm90b3R5cGUuc2V0RGF0YS5j
YWxsKHRoaXMsYSwhMSxjLGQpO3RoaXMucHJvY2Vzc0RhdGEoKTt0aGlzLmdlbmVyYXRlUD0Kb2lu
dHMoKTttKGIsITApJiZ0aGlzLmNoYXJ0LnJlZHJhdyhjKX0sZ2VuZXJhdGVQb2ludHM6ZnVuY3Rp
b24oKXt2YXIgYSxiPTNEPQowLGMsZCxlLGY9M0R0aGlzLm9wdGlvbnMuaWdub3JlSGlkZGVuUG9p
bnQ7Ty5wcm90b3R5cGUuZ2VuZXJhdGVQb2ludHMuY2FsbCg9CnRoaXMpO2M9M0R0aGlzLnBvaW50
cztkPTNEYy5sZW5ndGg7Zm9yKGE9M0QwO2E8ZDthKyspZT0zRGNbYV0sYis9M0RmJiYhZS52aT0K
c2libGU/Ci0wOmUueTt0aGlzLnRvdGFsPTNEYjtmb3IoYT0zRDA7YTxkO2ErKyllPTNEY1thXSxl
LnBlcmNlbnRhZ2U9M0RiPjA/ZS55L2IqMT0KMDA6MCxlLnRvdGFsPTNEYn0sdHJhbnNsYXRlOmZ1
bmN0aW9uKGEpe3RoaXMuZ2VuZXJhdGVQb2ludHMoKTt2YXIgYj0zRDAsYz0KPTNEdGhpcy5vcHRp
b25zLGQ9M0RjLnNsaWNlZE9mZnNldCxlPTNEZCtjLmJvcmRlcldpZHRoLGYsZyxoLGk9M0RjLnN0
YXJ0QW5nPQpsZXx8MCxqPTNEdGhpcy5zdGFydEFuZ2xlUmFkPTNEbWEvMTgwKihpLTkwKSxpPTNE
KHRoaXMuZW5kQW5nbGVSYWQ9M0RtYS8xODA9CioobShjLmVuZEFuZ2xlLGkrMzYwKS05MCkpLWos
az0zRHRoaXMucG9pbnRzLGw9M0RjLmRhdGFMYWJlbHMuZGlzdGFuY2UsYz0zRD0KYy5pZ25vcmVI
aWRkZW5Qb2ludCxvLG49M0RrLmxlbmd0aCxwO2lmKCFhKXRoaXMuY2VudGVyPTNEYT0zRHRoaXMu
Z2V0Q2VudGVyPQooKTt0aGlzLmdldFg9M0RmdW5jdGlvbihiLGMpe2g9M0RVLmFzaW4oQygoYi1h
WzFdKS8oYVsyXS8yK2wpLDEpKTtyZXR1cm4gYVs9CjBdKyhjPy0xOjEpKlooaCkqKGFbMl0vCi0y
K2wpfTtmb3Iobz0zRDA7bzxuO28rKyl7cD0zRGtbb107Zj0zRGorYippO2lmKCFjfHxwLnZpc2li
bGUpYis9M0RwLnBlcmNlbj0KdGFnZS8xMDA7Zz0zRGorYippO3Auc2hhcGVUeXBlPTNEImFyYyI7
cC5zaGFwZUFyZ3M9M0R7eDphWzBdLHk6YVsxXSxyOmFbMl0vPQoyLGlubmVyUjphWzNdLzIsc3Rh
cnQ6dShmKjFFMykvMUUzLGVuZDp1KGcqMUUzKS8xRTN9O2g9M0QoZytmKS8yO2g+MS41Km1hP2g9
Ci09M0QyKm1hOmg8LW1hLzImJihoKz0zRDIqbWEpO3Auc2xpY2VkVHJhbnNsYXRpb249M0R7dHJh
bnNsYXRlWDp1KFooaCkqZCksdD0KcmFuc2xhdGVZOnUoZWEoaCkqZCl9O2Y9M0RaKGgpKmFbMl0v
MjtnPTNEZWEoaCkqYVsyXS8yO3AudG9vbHRpcFBvcz0zRFthWzBdPQorZiowLjcsYVsxXStnKjAu
N107cC5oYWxmPTNEaDwtbWEvMnx8aD5tYS8yPzE6MDtwLmFuZ2xlPTNEaDtlPTNEQyhlLGwvMik7
cC49CmxhYmVsUG9zPTNEW2FbMF0rZitaKGgpKmwsYVsxXStnK2VhKGgpKmwsYVswXStmK1ooaCkq
ZSxhWzFdK2crZWEoaCkqZSxhWzBdKz0KZixhWzFdK2csbDwwPwotImNlbnRlciI6cC5oYWxmPyJy
aWdodCI6ImxlZnQiLGhdfX0sZHJhd0dyYXBoOm51bGwsZHJhd1BvaW50czpmdW5jdGlvbigpe3Y9
CmFyIGE9M0R0aGlzLGI9M0RhLmNoYXJ0LnJlbmRlcmVyLGMsZCxlPTNEYS5vcHRpb25zLnNoYWRv
dyxmLGc7aWYoZSYmIWEuc2hhZD0Kb3dHcm91cClhLnNoYWRvd0dyb3VwPTNEYi5nKCJzaGFkb3ci
KS5hZGQoYS5ncm91cCk7cChhLnBvaW50cyxmdW5jdGlvbihoKXtkPQo9M0RoLmdyYXBoaWM7Zz0z
RGguc2hhcGVBcmdzO2Y9M0RoLnNoYWRvd0dyb3VwO2lmKGUmJiFmKWY9M0RoLnNoYWRvd0dyb3Vw
PQo9M0RiLmcoInNoYWRvdyIpLmFkZChhLnNoYWRvd0dyb3VwKTtjPTNEaC5zbGljZWQ/aC5zbGlj
ZWRUcmFuc2xhdGlvbjp7dHJhbnM9CmxhdGVYOjAsdHJhbnNsYXRlWTowfTtmJiZmLmF0dHIoYyk7
ZD9kLmFuaW1hdGUocShnLGMpKTpoLmdyYXBoaWM9M0RkPTNEYltoLj0Kc2hhcGVUeXBlXShnKS5z
ZXRSYWRpYWxSZWZlcmVuY2UoYS5jZW50ZXIpLmF0dHIoaC5wb2ludEF0dHJbaC5zZWxlY3RlZD8i
c2VsPQplY3QiOgotIiJdKS5hdHRyKHsic3Ryb2tlLWxpbmVqb2luIjoicm91bmQifSkuYXR0cihj
KS5hZGQoYS5ncm91cCkuc2hhZG93KGUsZik7aC49CnZpc2libGUhPTNEPTNEdm9pZCAwJiZoLnNl
dFZpc2libGUoaC52aXNpYmxlKX0pfSxzb3J0QnlBbmdsZTpmdW5jdGlvbihhLGIpez0KYS5zb3J0
KGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGEuYW5nbGUhPTNEPTNEdm9pZCAwJiYoZC5hbmdsZS1hLmFu
Z2xlKSpifSl9LGRyPQphd0xlZ2VuZFN5bWJvbDpOLmRyYXdSZWN0YW5nbGUsZ2V0Q2VudGVyOlgu
Z2V0Q2VudGVyLGdldFN5bWJvbDpzYX07Uz0zRGthKE89CixTKTtGLnBpZT0zRFM7Ty5wcm90b3R5
cGUuZHJhd0RhdGFMYWJlbHM9M0RmdW5jdGlvbigpe3ZhciBhPTNEdGhpcyxiPTNEYS5vcD0KdGlv
bnMsYz0zRGIuY3Vyc29yLGQ9M0RiLmRhdGFMYWJlbHMsZT0zRGEucG9pbnRzLGYsZyxoLGk7aWYo
ZC5lbmFibGVkfHxhLl9oPQphc1BvaW50TGFiZWxzKWEuZGxQcm9jZXNzT3B0aW9ucyYmYS5kbFBy
b2Nlc3NPcHRpb25zKGQpLGk9M0RhLnBsb3RHcm91cCgiZGE9CnRhTGFiZWxzR3JvdXAiLAotImRh
dGEtbGFiZWxzIiwiaGlkZGVuIixkLnpJbmRleHx8NiksIWEuaGFzUmVuZGVyZWQmJm0oZC5kZWZl
ciwhMCkmJihpLmF0dHI9Cih7b3BhY2l0eTowfSksSyhhLCJhZnRlckFuaW1hdGUiLGZ1bmN0aW9u
KCl7YS5kYXRhTGFiZWxzR3JvdXAuc2hvdygpW2IuYW5pbT0KYXRpb24/ImFuaW1hdGUiOiJhdHRy
Il0oe29wYWNpdHk6MX0se2R1cmF0aW9uOjIwMH0pfSkpLGc9M0RkLHAoZSxmdW5jdGlvbihiPQop
e3ZhciBlLGw9M0RiLmRhdGFMYWJlbCxvLG4scD0zRGIuY29ubmVjdG9yLHU9M0QhMDtmPTNEYi5v
cHRpb25zJiZiLm9wdGlvbnM9Ci5kYXRhTGFiZWxzO2U9M0RtKGYmJmYuZW5hYmxlZCxnLmVuYWJs
ZWQpO2lmKGwmJiFlKWIuZGF0YUxhYmVsPTNEbC5kZXN0cm95KD0KKTtlbHNlIGlmKGUpe2Q9M0R3
KGcsZik7ZT0zRGQucm90YXRpb247bz0zRGIuZ2V0TGFiZWxDb25maWcoKTtoPTNEZC5mb3JtYXQ/
PQpJYShkLmZvcm1hdCxvKTpkLmZvcm1hdHRlci5jYWxsKG8sZCk7ZC5zdHlsZS5jb2xvcj0zRG0o
ZC5jb2xvcixkLnN0eWxlLmNvbG89CnIsCi1hLmNvbG9yLCJibGFjayIpO2lmKGwpaWYocihoKSls
LmF0dHIoe3RleHQ6aH0pLHU9M0QhMTtlbHNle2lmKGIuZGF0YUxhYmVsPQo9M0RsPTNEbC5kZXN0
cm95KCkscCliLmNvbm5lY3Rvcj0zRHAuZGVzdHJveSgpfWVsc2UgaWYocihoKSl7bD0zRHtmaWxs
OmQuYmE9CmNrZ3JvdW5kQ29sb3Isc3Ryb2tlOmQuYm9yZGVyQ29sb3IsInN0cm9rZS13aWR0aCI6
ZC5ib3JkZXJXaWR0aCxyOmQuYm9yZGVyUj0KYWRpdXN8fDAscm90YXRpb246ZSxwYWRkaW5nOmQu
cGFkZGluZyx6SW5kZXg6MX07Zm9yKG4gaW4gbClsW25dPTNEPTNEPTNEdCYmPQpkZWxldGUgbFtu
XTtsPTNEYi5kYXRhTGFiZWw9M0RhLmNoYXJ0LnJlbmRlcmVyW2U/InRleHQiOiJsYWJlbCJdKGgs
MCwtOTk5LG49CnVsbCxudWxsLG51bGwsZC51c2VIVE1MKS5hdHRyKGwpLmNzcyhxKGQuc3R5bGUs
YyYme2N1cnNvcjpjfSkpLmFkZChpKS5zaGFkbz0KdyhkLnNoYWRvdyl9bCYmYS5hbGlnbkRhdGFM
YWJlbChiLGwsZCxudWxsLHUpfX0pfTtPLnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlPQpsPTNECi1m
dW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTNEdGhpcy5jaGFydCxnPTNEZi5pbnZlcnRlZCxoPTNE
bShhLnBsb3RYLC05OTkpLD0KaT0zRG0oYS5wbG90WSwtOTk5KSxqPTNEYi5nZXRCQm94KCk7aWYo
YT0zRHRoaXMudmlzaWJsZSYmKGEuc2VyaWVzLmZvcmNlREx8PQp8Zi5pc0luc2lkZVBsb3QoaCx1
KGkpLGcpfHxkJiZmLmlzSW5zaWRlUGxvdChoLGc/ZC54KzE6ZC55K2QuaGVpZ2h0LTEsZykpKWQ9
Cj0zRHEoe3g6Zz9mLnBsb3RXaWR0aC1pOmgseTp1KGc/Zi5wbG90SGVpZ2h0LWg6aSksd2lkdGg6
MCxoZWlnaHQ6MH0sZCkscShjLD0Ke3dpZHRoOmoud2lkdGgsaGVpZ2h0OmouaGVpZ2h0fSksYy5y
b3RhdGlvbj8oZz0zRHthbGlnbjpjLmFsaWduLHg6ZC54K2MueCtkPQoud2lkdGgvMix5OmQueStj
LnkrZC5oZWlnaHQvMn0sYltlPyJhdHRyIjoiYW5pbWF0ZSJdKGcpKTooYi5hbGlnbihjLG51bGws
ZCk9CixnPTNEYi5hbGlnbkF0dHIsbShjLm92ZXJmbG93LCJqdXN0aWZ5Iik9M0Q9M0Q9M0QianVz
dGlmeSI/dGhpcy5qdXN0aWZ5RGF0YT0KTGFiZWwoYiwKLWMsZyxqLGQsZSk6bShjLmNyb3AsITAp
JiYoYT0zRGYuaXNJbnNpZGVQbG90KGcueCxnLnkpJiZmLmlzSW5zaWRlUGxvdChnLngrPQpqLndp
ZHRoLGcueStqLmhlaWdodCkpKTtpZighYSliLmF0dHIoe3k6LTk5OX0pLGIucGxhY2VkPTNEITF9
O08ucHJvdG90eXBlLmo9CnVzdGlmeURhdGFMYWJlbD0zRGZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2
YXIgZz0zRHRoaXMuY2hhcnQsaD0zRGIuYWxpZ24saT0zRD0KYi52ZXJ0aWNhbEFsaWduLGosaztq
PTNEYy54O2lmKGo8MCloPTNEPTNEPTNEInJpZ2h0Ij9iLmFsaWduPTNEImxlZnQiOmIueD0KPTNE
LWosaz0zRCEwO2o9M0RjLngrZC53aWR0aDtpZihqPmcucGxvdFdpZHRoKWg9M0Q9M0Q9M0QibGVm
dCI/Yi5hbGlnbj0zRCJyPQppZ2h0IjpiLng9M0RnLnBsb3RXaWR0aC1qLGs9M0QhMDtqPTNEYy55
O2lmKGo8MClpPTNEPTNEPTNEImJvdHRvbSI/Yi52ZXJ0aWM9CmFsQWxpZ249M0QidG9wIjpiLnk9
M0QtaixrPTNEITA7aj0zRGMueStkLmhlaWdodDtpZihqPmcucGxvdEhlaWdodClpPTNEPTNEPQo9
M0QidG9wIj9iLnZlcnRpY2FsQWxpZ249M0QiYm90dG9tIjpiLnk9M0RnLnBsb3RIZWlnaHQtCi1q
LGs9M0QhMDtpZihrKWEucGxhY2VkPTNEIWYsYS5hbGlnbihiLG51bGwsZSl9O2lmKEYucGllKUYu
cGllLnByb3RvdHlwZS5kcj0KYXdEYXRhTGFiZWxzPTNEZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMs
Yj0zRGEuZGF0YSxjLGQ9M0RhLmNoYXJ0LGU9M0RhLm9wdGlvPQpucy5kYXRhTGFiZWxzLGY9M0Rt
KGUuY29ubmVjdG9yUGFkZGluZywxMCksZz0zRG0oZS5jb25uZWN0b3JXaWR0aCwxKSxoPTNEZC49
CnBsb3RXaWR0aCxkPTNEZC5wbG90SGVpZ2h0LGksaixrPTNEbShlLnNvZnRDb25uZWN0b3IsITAp
LGw9M0RlLmRpc3RhbmNlLG89Cj0zRGEuY2VudGVyLG49M0RvWzJdLzIscT0zRG9bMV0scj0zRGw+
MCx0LHcseCx5LHo9M0RbW10sW11dLEEsQyxHLEQsQixGPTNEWz0KMCwwLDAsMF0sTj0zRGZ1bmN0
aW9uKGEsYil7cmV0dXJuIGIueS1hLnl9O2lmKGEudmlzaWJsZSYmKGUuZW5hYmxlZHx8YS5faGFz
PQpQb2ludExhYmVscykpe08ucHJvdG90eXBlLmRyYXdEYXRhTGFiZWxzLmFwcGx5KGEpO3AoYixm
dW5jdGlvbihhKXthLmRhdGFMYWI9CmVsJiZhLnZpc2libGUmJnpbYS5oYWxmXS5wdXNoKGEpfSk7
Ci1mb3IoRD0zRDA7IXkmJmJbRF07KXk9M0RiW0RdJiZiW0RdLmRhdGFMYWJlbCYmKGJbRF0uZGF0
YUxhYmVsLmdldEJCb3goKS5oZT0KaWdodHx8MjEpLEQrKztmb3IoRD0zRDI7RC0tOyl7dmFyIGI9
M0RbXSxLPTNEW10sSD0zRHpbRF0sST0zREgubGVuZ3RoLEU7YS5zPQpvcnRCeUFuZ2xlKEgsRC0w
LjUpO2lmKGw+MCl7Zm9yKEI9M0RxLW4tbDtCPD0zRHErbitsO0IrPTNEeSliLnB1c2goQik7dz0z
RGI9Ci5sZW5ndGg7aWYoST53KXtjPTNEW10uY29uY2F0KEgpO2Muc29ydChOKTtmb3IoQj0zREk7
Qi0tOyljW0JdLnJhbms9M0RCO2Zvcj0KKEI9M0RJO0ItLTspSFtCXS5yYW5rPj0zRHcmJkguc3Bs
aWNlKEIsMSk7ST0zREgubGVuZ3RofWZvcihCPTNEMDtCPEk7QisrKXtjPQo9M0RIW0JdO3g9M0Rj
LmxhYmVsUG9zO2M9M0Q5OTk5O3ZhciBRLFA7Zm9yKFA9M0QwO1A8dztQKyspUT0zRE0oYltQXS14
WzFdKSw9ClE8YyYmKGM9M0RRLEU9M0RQKTtpZihFPEImJmJbQl0hPTNEPTNEbnVsbClFPTNEQjtl
bHNlIGZvcih3PEktQitFJiZiW0JdIT0zRD0KPTNEbnVsbCYmKEU9M0R3LUkrQik7YltFXT0zRD0z
RD0zRG51bGw7KUUrKztLLnB1c2goe2k6RSwKLXk6YltFXX0pO2JbRV09M0RudWxsfUsuc29ydChO
KX1mb3IoQj0zRDA7QjxJO0IrKyl7Yz0zREhbQl07eD0zRGMubGFiZWxQb3M7PQp0PTNEYy5kYXRh
TGFiZWw7Rz0zRGMudmlzaWJsZT0zRD0zRD0zRCExPyJoaWRkZW4iOiJ2aXNpYmxlIjtjPTNEeFsx
XTtpZihsPjA9Cil7aWYodz0zREsucG9wKCksRT0zRHcuaSxDPTNEdy55LGM+QyYmYltFKzFdIT0z
RD0zRG51bGx8fGM8QyYmYltFLTFdIT0zRD0zRD0KbnVsbClDPTNEY31lbHNlIEM9M0RjO0E9M0Rl
Lmp1c3RpZnk/b1swXSsoRD8tMToxKSoobitsKTphLmdldFgoRT0zRD0zRD0zRDB8PQp8RT0zRD0z
RD0zRGIubGVuZ3RoLTE/YzpDLEQpO3QuX2F0dHI9M0R7dmlzaWJpbGl0eTpHLGFsaWduOnhbNl19
O3QuX3Bvcz0zRHs9Cng6QStlLngrKHtsZWZ0OmYscmlnaHQ6LWZ9W3hbNl1dfHwwKSx5OkMrZS55
LTEwfTt0LmNvbm5YPTNEQTt0LmNvbm5ZPTNEQztpZj0KKHRoaXMub3B0aW9ucy5zaXplPTNEPTNE
PTNEbnVsbCl3PTNEdC53aWR0aCxBLXc8Zj9GWzNdPTNEdih1KHctQStmKSxGWzNdKTpBPQordz5o
LWYmJihGWzFdPTNEdih1KEErdy1oK2YpLEZbMV0pKSxDLXkvMjwwP0ZbMF09M0QKLXYodSgtQyt5
LzIpLEZbMF0pOkMreS8yPmQmJihGWzJdPTNEdih1KEMreS8yLWQpLEZbMl0pKX19aWYoQmEoRik9
M0Q9M0Q9M0QwPQp8fHRoaXMudmVyaWZ5RGF0YUxhYmVsT3ZlcmZsb3coRikpdGhpcy5wbGFjZURh
dGFMYWJlbHMoKSxyJiZnJiZwKHRoaXMucG9pbnQ9CnMsZnVuY3Rpb24oYil7aT0zRGIuY29ubmVj
dG9yO3g9M0RiLmxhYmVsUG9zO2lmKCh0PTNEYi5kYXRhTGFiZWwpJiZ0Ll9wb3MpRz0KPTNEdC5f
YXR0ci52aXNpYmlsaXR5LEE9M0R0LmNvbm5YLEM9M0R0LmNvbm5ZLGo9M0RrP1siTSIsQSsoeFs2
XT0zRD0zRD0zRCJsPQplZnQiPzU6LTUpLEMsIkMiLEEsQywyKnhbMl0teFs0XSwyKnhbM10teFs1
XSx4WzJdLHhbM10sIkwiLHhbNF0seFs1XV06WyJNIiw9CkErKHhbNl09M0Q9M0Q9M0QibGVmdCI/
NTotNSksQywiTCIseFsyXSx4WzNdLCJMIix4WzRdLHhbNV1dLGk/KGkuYW5pbWF0ZSh7ZD0KOmp9
KSxpLmF0dHIoInZpc2liaWxpdHkiLEcpKTpiLmNvbm5lY3Rvcj0zRGk9M0RhLmNoYXJ0LnJlbmRl
cmVyLnBhdGgoaikuYXR0PQpyKHsic3Ryb2tlLXdpZHRoIjpnLAotc3Ryb2tlOmUuY29ubmVjdG9y
Q29sb3J8fGIuY29sb3J8fCIjNjA2MDYwIix2aXNpYmlsaXR5Okd9KS5hZGQoYS5kYXRhTGFiZWw9
CnNHcm91cCk7ZWxzZSBpZihpKWIuY29ubmVjdG9yPTNEaS5kZXN0cm95KCl9KX19LEYucGllLnBy
b3RvdHlwZS5wbGFjZURhdGFMYT0KYmVscz0zRGZ1bmN0aW9uKCl7cCh0aGlzLnBvaW50cyxmdW5j
dGlvbihhKXt2YXIgYT0zRGEuZGF0YUxhYmVsLGI7aWYoYSkoYj0KPTNEYS5fcG9zKT8oYS5hdHRy
KGEuX2F0dHIpLGFbYS5tb3ZlZD8iYW5pbWF0ZSI6ImF0dHIiXShiKSxhLm1vdmVkPTNEITApOmEm
PQomYS5hdHRyKHt5Oi05OTl9KX0pfSxGLnBpZS5wcm90b3R5cGUuYWxpZ25EYXRhTGFiZWw9M0Rz
YSxGLnBpZS5wcm90b3R5cGUudmU9CnJpZnlEYXRhTGFiZWxPdmVyZmxvdz0zRGZ1bmN0aW9uKGEp
e3ZhciBiPTNEdGhpcy5jZW50ZXIsYz0zRHRoaXMub3B0aW9ucyxkPQo9M0RjLmNlbnRlcixlPTNE
Yz0zRGMubWluU2l6ZXx8ODAsZjtkWzBdIT0zRD0zRG51bGw/ZT0zRHYoYlsyXS12KGFbMV0sYVsz
XSk9CixjKTooZT0zRHYoYlsyXS0KLWFbMV0tYVszXSxjKSxiWzBdKz0zRChhWzNdLWFbMV0pLzIp
O2RbMV0hPTNEPTNEbnVsbD9lPTNEdihDKGUsYlsyXS12KGFbMF0sPQphWzJdKSksYyk6KGU9M0R2
KEMoZSxiWzJdLWFbMF0tYVsyXSksYyksYlsxXSs9M0QoYVswXS1hWzJdKS8yKTtlPGJbMl0/KGJb
Ml09Cj0zRGUsdGhpcy50cmFuc2xhdGUoYikscCh0aGlzLnBvaW50cyxmdW5jdGlvbihhKXtpZihh
LmRhdGFMYWJlbClhLmRhdGFMYWJlbD0KLl9wb3M9M0RudWxsfSksdGhpcy5kcmF3RGF0YUxhYmVs
cyYmdGhpcy5kcmF3RGF0YUxhYmVscygpKTpmPTNEITA7cmV0dXJuIGZ9PQo7aWYoRi5jb2x1bW4p
Ri5jb2x1bW4ucHJvdG90eXBlLmFsaWduRGF0YUxhYmVsPTNEZnVuY3Rpb24oYSxiLGMsZCxlKXt2
YXIgZj0KPTNEdGhpcy5jaGFydCxnPTNEZi5pbnZlcnRlZCxoPTNEYS5kbEJveHx8YS5zaGFwZUFy
Z3MsaT0zRGEuYmVsb3d8fGEucGxvdFk+PQptKHRoaXMudHJhbnNsYXRlZFRocmVzaG9sZCxmLnBs
b3RTaXplWSksaj0zRG0oYy5pbnNpZGUsISF0aGlzLm9wdGlvbnMuc3RhY2s9CmluZyk7aWYoaCYm
Ci0oZD0zRHcoaCksZyYmKGQ9M0R7eDpmLnBsb3RXaWR0aC1kLnktZC5oZWlnaHQseTpmLnBsb3RI
ZWlnaHQtZC54LWQud2lkdGgsdz0KaWR0aDpkLmhlaWdodCxoZWlnaHQ6ZC53aWR0aH0pLCFqKSln
PyhkLngrPTNEaT8wOmQud2lkdGgsZC53aWR0aD0zRDApOihkLnkrPQo9M0RpP2QuaGVpZ2h0OjAs
ZC5oZWlnaHQ9M0QwKTtjLmFsaWduPTNEbShjLmFsaWduLCFnfHxqPyJjZW50ZXIiOmk/InJpZ2h0
Ijo9CiJsZWZ0Iik7Yy52ZXJ0aWNhbEFsaWduPTNEbShjLnZlcnRpY2FsQWxpZ24sZ3x8aj8ibWlk
ZGxlIjppPyJ0b3AiOiJib3R0b20iKT0KO08ucHJvdG90eXBlLmFsaWduRGF0YUxhYmVsLmNhbGwo
dGhpcyxhLGIsYyxkLGUpfTtTPTNEUi5UcmFja2VyTWl4aW49M0R7ZHJhPQp3VHJhY2tlclBvaW50
OmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLGI9M0RhLmNoYXJ0LGM9M0RiLnBvaW50ZXIsZD0zRGEu
b3B0aW89Cm5zLmN1cnNvcixlPTNEZCYme2N1cnNvcjpkfSxmPTNEZnVuY3Rpb24oYyl7dmFyIGQ9
M0RjLnRhcmdldCxlO2lmKGIuaG92ZXJTZT0KcmllcyE9M0Q9M0RhKWEub25Nb3VzZU92ZXIoKTsK
LWZvcig7ZCYmIWU7KWU9M0RkLnBvaW50LGQ9M0RkLnBhcmVudE5vZGU7aWYoZSE9M0Q9M0R0JiZl
IT0zRD0zRGIuaG92ZXJQb2luPQp0KWUub25Nb3VzZU92ZXIoYyl9O3AoYS5wb2ludHMsZnVuY3Rp
b24oYSl7aWYoYS5ncmFwaGljKWEuZ3JhcGhpYy5lbGVtZW50LnA9Cm9pbnQ9M0RhO2lmKGEuZGF0
YUxhYmVsKWEuZGF0YUxhYmVsLmVsZW1lbnQucG9pbnQ9M0RhfSk7aWYoIWEuX2hhc1RyYWNraW5n
KT0KcChhLnRyYWNrZXJHcm91cHMsZnVuY3Rpb24oYil7aWYoYVtiXSYmKGFbYl0uYWRkQ2xhc3Mo
ImhpZ2hjaGFydHMtdHJhY2tlciIpPQoub24oIm1vdXNlb3ZlciIsZikub24oIm1vdXNlb3V0Iixm
dW5jdGlvbihhKXtjLm9uVHJhY2tlck1vdXNlT3V0KGEpfSkuY3NzKGU9CiksJGEpKWFbYl0ub24o
InRvdWNoc3RhcnQiLGYpfSksYS5faGFzVHJhY2tpbmc9M0QhMH0sZHJhd1RyYWNrZXJHcmFwaDpm
dW5jdD0KaW9uKCl7dmFyIGE9M0R0aGlzLGI9M0RhLm9wdGlvbnMsYz0zRGIudHJhY2tCeUFyZWEs
ZD0zRFtdLmNvbmNhdChjP2EuYXJlYVBhPQp0aDoKLWEuZ3JhcGhQYXRoKSxlPTNEZC5sZW5ndGgs
Zj0zRGEuY2hhcnQsZz0zRGYucG9pbnRlcixoPTNEZi5yZW5kZXJlcixpPTNEZi5vPQpwdGlvbnMu
dG9vbHRpcC5zbmFwLGo9M0RhLnRyYWNrZXIsaz0zRGIuY3Vyc29yLGw9M0RrJiZ7Y3Vyc29yOmt9
LGs9M0RhLnNpbmc9CmxlUG9pbnRzLG0sbj0zRGZ1bmN0aW9uKCl7aWYoZi5ob3ZlclNlcmllcyE9
M0Q9M0RhKWEub25Nb3VzZU92ZXIoKX0scT0zRCJyZz0KYmEoMTkyLDE5MiwxOTIsIisoYWE/MS4w
RS00OjAuMDAyKSsiKSI7aWYoZSYmIWMpZm9yKG09M0RlKzE7bS0tOylkW21dPTNEPTNEPQo9M0Qi
TSImJmQuc3BsaWNlKG0rMSwwLGRbbSsxXS1pLGRbbSsyXSwiTCIpLChtJiZkW21dPTNEPTNEPTNE
Ik0ifHxtPTNEPTNEPQo9M0RlKSYmZC5zcGxpY2UobSwwLCJMIixkW20tMl0raSxkW20tMV0pO2Zv
cihtPTNEMDttPGsubGVuZ3RoO20rKyllPTNEa1ttXSw9CmQucHVzaCgiTSIsZS5wbG90WC1pLGUu
cGxvdFksIkwiLGUucGxvdFgraSxlLnBsb3RZKTtqP2ouYXR0cih7ZDpkfSk6KGEudHJhYz0Ka2Vy
PTNEaC5wYXRoKGQpLmF0dHIoeyJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsCi12aXNpYmlsaXR5
OmEudmlzaWJsZT8idmlzaWJsZSI6ImhpZGRlbiIsc3Ryb2tlOnEsZmlsbDpjP3E6USwic3Ryb2tl
LXdpZHRoIj0KOmIubGluZVdpZHRoKyhjPzA6MippKSx6SW5kZXg6Mn0pLmFkZChhLmdyb3VwKSxw
KFthLnRyYWNrZXIsYS5tYXJrZXJHcm91cF0sPQpmdW5jdGlvbihhKXthLmFkZENsYXNzKCJoaWdo
Y2hhcnRzLXRyYWNrZXIiKS5vbigibW91c2VvdmVyIixuKS5vbigibW91c2VvdXQ9CiIsZnVuY3Rp
b24oYSl7Zy5vblRyYWNrZXJNb3VzZU91dChhKX0pLmNzcyhsKTtpZigkYSlhLm9uKCJ0b3VjaHN0
YXJ0IixuKX0pKT0KfX07aWYoRi5jb2x1bW4pZ2EucHJvdG90eXBlLmRyYXdUcmFja2VyPTNEUy5k
cmF3VHJhY2tlclBvaW50O2lmKEYucGllKUYucGllPQoucHJvdG90eXBlLmRyYXdUcmFja2VyPTNE
Uy5kcmF3VHJhY2tlclBvaW50O2lmKEYuc2NhdHRlcilwYS5wcm90b3R5cGUuZHJhd1Q9CnJhY2tl
cj0zRFMuZHJhd1RyYWNrZXJQb2ludDtxKGxiLnByb3RvdHlwZSx7c2V0SXRlbUV2ZW50czpmdW5j
dGlvbihhLAotYixjLGQsZSl7dmFyIGY9M0R0aGlzOyhjP2I6YS5sZWdlbmRHcm91cCkub24oIm1v
dXNlb3ZlciIsZnVuY3Rpb24oKXthLnNldFM9CnRhdGUoImhvdmVyIik7Yi5jc3MoZi5vcHRpb25z
Lml0ZW1Ib3ZlclN0eWxlKX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXtiLj0KY3NzKGEudmlz
aWJsZT9kOmUpO2Euc2V0U3RhdGUoKX0pLm9uKCJjbGljayIsZnVuY3Rpb24oYil7dmFyIGM9M0Rm
dW5jdGlvbigpPQp7YS5zZXRWaXNpYmxlKCl9LGI9M0R7YnJvd3NlckV2ZW50OmJ9O2EuZmlyZVBv
aW50RXZlbnQ/YS5maXJlUG9pbnRFdmVudCgibGU9CmdlbmRJdGVtQ2xpY2siLGIsYyk6RChhLCJs
ZWdlbmRJdGVtQ2xpY2siLGIsYyl9KX0sY3JlYXRlQ2hlY2tib3hGb3JJdGVtOmZ1bj0KY3Rpb24o
YSl7YS5jaGVja2JveD0zRFkoImlucHV0Iix7dHlwZToiY2hlY2tib3giLGNoZWNrZWQ6YS5zZWxl
Y3RlZCxkZWZhdWx0PQpDaGVja2VkOmEuc2VsZWN0ZWR9LHRoaXMub3B0aW9ucy5pdGVtQ2hlY2ti
b3hTdHlsZSx0aGlzLmNoYXJ0LmNvbnRhaW5lcik7Ci1LKGEuY2hlY2tib3gsImNsaWNrIixmdW5j
dGlvbihiKXtEKGEsImNoZWNrYm94Q2xpY2siLHtjaGVja2VkOmIudGFyZ2V0LmNoZT0KY2tlZH0s
ZnVuY3Rpb24oKXthLnNlbGVjdCgpfSl9KX19KTtFLmxlZ2VuZC5pdGVtU3R5bGUuY3Vyc29yPTNE
InBvaW50ZXIiO3EoPQpZYS5wcm90b3R5cGUse3Nob3dSZXNldFpvb206ZnVuY3Rpb24oKXt2YXIg
YT0zRHRoaXMsYj0zREUubGFuZyxjPTNEYS5vcHRpb249CnMuY2hhcnQucmVzZXRab29tQnV0dG9u
LGQ9M0RjLnRoZW1lLGU9M0RkLnN0YXRlcyxmPTNEYy5yZWxhdGl2ZVRvPTNEPTNEPTNEIj0KY2hh
cnQiP251bGw6InBsb3RCb3giO3RoaXMucmVzZXRab29tQnV0dG9uPTNEYS5yZW5kZXJlci5idXR0
b24oYi5yZXNldFpvb20sPQpudWxsLG51bGwsZnVuY3Rpb24oKXthLnpvb21PdXQoKX0sZCxlJiZl
LmhvdmVyKS5hdHRyKHthbGlnbjpjLnBvc2l0aW9uLmFsaWc9Cm4sdGl0bGU6Yi5yZXNldFpvb21U
aXRsZX0pLmFkZCgpLmFsaWduKGMucG9zaXRpb24sITEsZil9LHpvb21PdXQ6ZnVuY3Rpb24oKT0K
e3ZhciBhPTNECi10aGlzO0QoYSwic2VsZWN0aW9uIix7cmVzZXRTZWxlY3Rpb246ITB9LGZ1bmN0
aW9uKCl7YS56b29tKCl9KX0sem9vbTpmdW5jdD0KaW9uKGEpe3ZhciBiLGM9M0R0aGlzLnBvaW50
ZXIsZD0zRCExLGU7IWF8fGEucmVzZXRTZWxlY3Rpb24/cCh0aGlzLmF4ZXMsZnVuPQpjdGlvbihh
KXtiPTNEYS56b29tKCl9KTpwKGEueEF4aXMuY29uY2F0KGEueUF4aXMpLGZ1bmN0aW9uKGEpe3Zh
ciBlPTNEYS5heGk9CnMsaD0zRGUuaXNYQXhpcztpZihjW2g/Inpvb21YIjoiem9vbVkiXXx8Y1to
PyJwaW5jaFgiOiJwaW5jaFkiXSliPTNEZS56b29tKD0KYS5taW4sYS5tYXgpLGUuZGlzcGxheUJ0
biYmKGQ9M0QhMCl9KTtlPTNEdGhpcy5yZXNldFpvb21CdXR0b247aWYoZCYmIWUpdGhpPQpzLnNo
b3dSZXNldFpvb20oKTtlbHNlIGlmKCFkJiZjYShlKSl0aGlzLnJlc2V0Wm9vbUJ1dHRvbj0zRGUu
ZGVzdHJveSgpO2ImJnQ9Cmhpcy5yZWRyYXcobSh0aGlzLm9wdGlvbnMuY2hhcnQuYW5pbWF0aW9u
LGEmJmEuYW5pbWF0aW9uLHRoaXMucG9pbnRDb3VudDwKLTEwMCkpfSxwYW46ZnVuY3Rpb24oYSxi
KXt2YXIgYz0zRHRoaXMsZD0zRGMuaG92ZXJQb2ludHMsZTtkJiZwKGQsZnVuY3Rpb24oPQphKXth
LnNldFN0YXRlKCl9KTtwKGI9M0Q9M0Q9M0QieHkiP1sxLDBdOlsxXSxmdW5jdGlvbihiKXt2YXIg
ZD0zRGFbYj8iY2hhcnQ9ClgiOiJjaGFydFkiXSxoPTNEY1tiPyJ4QXhpcyI6InlBeGlzIl1bMF0s
aT0zRGNbYj8ibW91c2VEb3duWCI6Im1vdXNlRG93blkiXT0KLGo9M0QoaC5wb2ludFJhbmdlfHww
KS8yLGs9M0RoLmdldEV4dHJlbWVzKCksbD0zRGgudG9WYWx1ZShpLWQsITApK2osaT0zRGguPQp0
b1ZhbHVlKGkrY1tiPyJwbG90V2lkdGgiOiJwbG90SGVpZ2h0Il0tZCwhMCktajtoLnNlcmllcy5s
ZW5ndGgmJmw+QyhrLmRhdGE9Ck1pbixrLm1pbikmJmk8dihrLmRhdGFNYXgsay5tYXgpJiYoaC5z
ZXRFeHRyZW1lcyhsLGksITEsITEse3RyaWdnZXI6InBhbiJ9KT0KLGU9M0QhMCk7Y1tiPyJtb3Vz
ZURvd25YIjoibW91c2VEb3duWSJdPTNEZH0pO2UmJmMucmVkcmF3KCExKTtHKGMuY29udGFpbmVy
PQose2N1cnNvcjoibW92ZSJ9KX19KTsKLXEoRWEucHJvdG90eXBlLHtzZWxlY3Q6ZnVuY3Rpb24o
YSxiKXt2YXIgYz0zRHRoaXMsZD0zRGMuc2VyaWVzLGU9M0RkLmNoYXJ0PQosYT0zRG0oYSwhYy5z
ZWxlY3RlZCk7Yy5maXJlUG9pbnRFdmVudChhPyJzZWxlY3QiOiJ1bnNlbGVjdCIse2FjY3VtdWxh
dGU6Yn09CixmdW5jdGlvbigpe2Muc2VsZWN0ZWQ9M0RjLm9wdGlvbnMuc2VsZWN0ZWQ9M0RhO2Qu
b3B0aW9ucy5kYXRhW0RhKGMsZC5kYXRhKT0KXT0zRGMub3B0aW9ucztjLnNldFN0YXRlKGEmJiJz
ZWxlY3QiKTtifHxwKGUuZ2V0U2VsZWN0ZWRQb2ludHMoKSxmdW5jdGlvbihhPQope2lmKGEuc2Vs
ZWN0ZWQmJmEhPTNEPTNEYylhLnNlbGVjdGVkPTNEYS5vcHRpb25zLnNlbGVjdGVkPTNEITEsZC5v
cHRpb25zLmQ9CmF0YVtEYShhLGQuZGF0YSldPTNEYS5vcHRpb25zLGEuc2V0U3RhdGUoIiIpLGEu
ZmlyZVBvaW50RXZlbnQoInVuc2VsZWN0Iil9KT0KfSl9LG9uTW91c2VPdmVyOmZ1bmN0aW9uKGEp
e3ZhciBiPTNEdGhpcy5zZXJpZXMsYz0zRGIuY2hhcnQsZD0zRGMudG9vbHRpcCxlPQo9M0RjLmhv
dmVyUG9pbnQ7Ci1pZihlJiZlIT0zRD0zRHRoaXMpZS5vbk1vdXNlT3V0KCk7dGhpcy5maXJlUG9p
bnRFdmVudCgibW91c2VPdmVyIik7ZCYmKCFkLj0Kc2hhcmVkfHxiLm5vU2hhcmVkVG9vbHRpcCkm
JmQucmVmcmVzaCh0aGlzLGEpO3RoaXMuc2V0U3RhdGUoImhvdmVyIik7Yy5ob3ZlPQpyUG9pbnQ9
M0R0aGlzfSxvbk1vdXNlT3V0OmZ1bmN0aW9uKCl7dmFyIGE9M0R0aGlzLnNlcmllcy5jaGFydCxi
PTNEYS5ob3ZlclA9Cm9pbnRzO2lmKCFifHxEYSh0aGlzLGIpPTNEPTNEPTNELTEpdGhpcy5maXJl
UG9pbnRFdmVudCgibW91c2VPdXQiKSx0aGlzLnNldD0KU3RhdGUoKSxhLmhvdmVyUG9pbnQ9M0Ru
dWxsfSxpbXBvcnRFdmVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNJbXBvcnRlZEV2PQplbnRz
KXt2YXIgYT0zRHcodGhpcy5zZXJpZXMub3B0aW9ucy5wb2ludCx0aGlzLm9wdGlvbnMpLmV2ZW50
cyxiO3RoaXMuZXZlbnQ9CnM9M0RhO2ZvcihiIGluIGEpSyh0aGlzLGIsYVtiXSk7dGhpcy5oYXNJ
bXBvcnRlZEV2ZW50cz0zRCEwfX0sc2V0U3RhdGU6ZnVuYz0KdGlvbihhLAotYil7dmFyIGM9M0R0
aGlzLnBsb3RYLGQ9M0R0aGlzLnBsb3RZLGU9M0R0aGlzLnNlcmllcyxmPTNEZS5vcHRpb25zLnN0
YXRlcyw9Cmc9M0RiYVtlLnR5cGVdLm1hcmtlciYmZS5vcHRpb25zLm1hcmtlcixoPTNEZyYmIWcu
ZW5hYmxlZCxpPTNEZyYmZy5zdGF0ZXNbYT0KXSxqPTNEaSYmaS5lbmFibGVkPTNEPTNEPTNEITEs
az0zRGUuc3RhdGVNYXJrZXJHcmFwaGljLGw9M0R0aGlzLm1hcmtlcnx8e30sPQptPTNEZS5jaGFy
dCxuPTNEZS5oYWxvLHAsYT0zRGF8fCIiO3A9M0R0aGlzLnBvaW50QXR0clthXXx8ZS5wb2ludEF0
dHJbYV07aWY9CighKGE9M0Q9M0Q9M0R0aGlzLnN0YXRlJiYhYnx8dGhpcy5zZWxlY3RlZCYmYSE9
M0Q9M0Qic2VsZWN0Inx8ZlthXSYmZlthXS5lbj0KYWJsZWQ9M0Q9M0Q9M0QhMXx8YSYmKGp8fGgm
JmkuZW5hYmxlZD0zRD0zRD0zRCExKXx8YSYmbC5zdGF0ZXMmJmwuc3RhdGVzW2FdPQomJmwuc3Rh
dGVzW2FdLmVuYWJsZWQ9M0Q9M0Q9M0QhMSkpe2lmKHRoaXMuZ3JhcGhpYylnPTNEZyYmdGhpcy5n
cmFwaGljLnN5bWI9Cm9sTmFtZSYmcC5yLHRoaXMuZ3JhcGhpYy5hdHRyKHcocCxnP3t4OmMtCi1n
LHk6ZC1nLHdpZHRoOjIqZyxoZWlnaHQ6MipnfTp7fSkpLGsmJmsuaGlkZSgpO2Vsc2V7aWYoYSYm
aSlpZihnPTNEaS5yYWRpdT0KcyxsPTNEbC5zeW1ib2x8fGUuc3ltYm9sLGsmJmsuY3VycmVudFN5
bWJvbCE9M0Q9M0RsJiYoaz0zRGsuZGVzdHJveSgpKSxrKWtbPQpiPyJhbmltYXRlIjoiYXR0ciJd
KHt4OmMtZyx5OmQtZ30pO2Vsc2UgaWYobCllLnN0YXRlTWFya2VyR3JhcGhpYz0zRGs9M0RtLnI9
CmVuZGVyZXIuc3ltYm9sKGwsYy1nLGQtZywyKmcsMipnKS5hdHRyKHApLmFkZChlLm1hcmtlckdy
b3VwKSxrLmN1cnJlbnRTeW1ibz0KbD0zRGw7aWYoaylrW2EmJm0uaXNJbnNpZGVQbG90KGMsZCxt
LmludmVydGVkKT8ic2hvdyI6ImhpZGUiXSgpfWlmKChjPTNEZlthPQpdJiZmW2FdLmhhbG8pJiZj
LnNpemUpe2lmKCFuKWUuaGFsbz0zRG49M0RtLnJlbmRlcmVyLnBhdGgoKS5hZGQoZS5zZXJpZXNH
cm89CnVwKTtuLmF0dHIocSh7ZmlsbDp5YSh0aGlzLmNvbG9yfHxlLmNvbG9yKS5zZXRPcGFjaXR5
KGMub3BhY2l0eSkuZ2V0KCl9LGMuYT0KdHRyaWJ1dGVzKSlbYj8KLSJhbmltYXRlIjoiYXR0ciJd
KHtkOnRoaXMuaGFsb1BhdGgoYy5zaXplKX0pfWVsc2UgbiYmbi5hdHRyKHtkOltdfSk7dGhpcy5z
PQp0YXRlPTNEYX19LGhhbG9QYXRoOmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcy5zZXJpZXMsYz0z
RGIuY2hhcnQsZD0zRGIuZ2V0UGw9Cm90Qm94KCksZT0zRGMuaW52ZXJ0ZWQ7cmV0dXJuIGMucmVu
ZGVyZXIuc3ltYm9scy5jaXJjbGUoZC50cmFuc2xhdGVYKyhlP2IueT0KQXhpcy5sZW4tdGhpcy5w
bG90WTp0aGlzLnBsb3RYKS1hLGQudHJhbnNsYXRlWSsoZT9iLnhBeGlzLmxlbi10aGlzLnBsb3RY
OnRoPQppcy5wbG90WSktYSxhKjIsYSoyKX19KTtxKE8ucHJvdG90eXBlLHtvbk1vdXNlT3Zlcjpm
dW5jdGlvbigpe3ZhciBhPTNEdGhpcy49CmNoYXJ0LGI9M0RhLmhvdmVyU2VyaWVzO2lmKGImJmIh
PTNEPTNEdGhpcyliLm9uTW91c2VPdXQoKTt0aGlzLm9wdGlvbnMuZXZlbj0KdHMubW91c2VPdmVy
JiZEKHRoaXMsIm1vdXNlT3ZlciIpO3RoaXMuc2V0U3RhdGUoImhvdmVyIik7YS5ob3ZlclNlcmll
cz0zRAotdGhpc30sb25Nb3VzZU91dDpmdW5jdGlvbigpe3ZhciBhPTNEdGhpcy5vcHRpb25zLGI9
M0R0aGlzLmNoYXJ0LGM9M0RiLnRvb2w9CnRpcCxkPTNEYi5ob3ZlclBvaW50O2lmKGQpZC5vbk1v
dXNlT3V0KCk7dGhpcyYmYS5ldmVudHMubW91c2VPdXQmJkQodGhpcywibT0Kb3VzZU91dCIpO2Mm
JiFhLnN0aWNreVRyYWNraW5nJiYoIWMuc2hhcmVkfHx0aGlzLm5vU2hhcmVkVG9vbHRpcCkmJmMu
aGlkZSgpPQo7dGhpcy5zZXRTdGF0ZSgpO2IuaG92ZXJTZXJpZXM9M0RudWxsfSxzZXRTdGF0ZTpm
dW5jdGlvbihhKXt2YXIgYj0zRHRoaXMub3A9CnRpb25zLGM9M0R0aGlzLmdyYXBoLGQ9M0R0aGlz
LmdyYXBoTmVnLGU9M0RiLnN0YXRlcyxiPTNEYi5saW5lV2lkdGgsYT0zRGF8fD0KIiI7aWYodGhp
cy5zdGF0ZSE9M0Q9M0RhKXRoaXMuc3RhdGU9M0RhLGVbYV0mJmVbYV0uZW5hYmxlZD0zRD0zRD0z
RCExfHwoYSYmPQooYj0zRGVbYV0ubGluZVdpZHRofHxiKzEpLGMmJiFjLmRhc2hzdHlsZSYmKGE9
M0R7InN0cm9rZS13aWR0aCI6Yn0sYy5hdHRyKGE9CiksZCYmZC5hdHRyKGEpKSl9LAotc2V0Vmlz
aWJsZTpmdW5jdGlvbihhLGIpe3ZhciBjPTNEdGhpcyxkPTNEYy5jaGFydCxlPTNEYy5sZWdlbmRJ
dGVtLGYsZz0zRGQ9Ci5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcyxoPTNEYy52aXNp
YmxlO2Y9M0QoYy52aXNpYmxlPTNEYT0zRGMudXNlcj0KT3B0aW9ucy52aXNpYmxlPTNEYT0zRD0z
RD0zRHQ/IWg6YSk/InNob3ciOiJoaWRlIjtwKFsiZ3JvdXAiLCJkYXRhTGFiZWxzR3JvPQp1cCIs
Im1hcmtlckdyb3VwIiwidHJhY2tlciJdLGZ1bmN0aW9uKGEpe2lmKGNbYV0pY1thXVtmXSgpfSk7
aWYoZC5ob3ZlclNlcmk9CmVzPTNEPTNEPTNEYyljLm9uTW91c2VPdXQoKTtlJiZkLmxlZ2VuZC5j
b2xvcml6ZUl0ZW0oYyxhKTtjLmlzRGlydHk9M0QhMDtjLj0Kb3B0aW9ucy5zdGFja2luZyYmcChk
LnNlcmllcyxmdW5jdGlvbihhKXtpZihhLm9wdGlvbnMuc3RhY2tpbmcmJmEudmlzaWJsZSlhPQou
aXNEaXJ0eT0zRCEwfSk7cChjLmxpbmtlZFNlcmllcyxmdW5jdGlvbihiKXtiLnNldFZpc2libGUo
YSwhMSl9KTtpZihnKWQuaXM9CkRpcnR5Qm94PTNEITA7Ci1iIT0zRD0zRCExJiZkLnJlZHJhdygp
O0QoYyxmKX0sc2V0VG9vbHRpcFBvaW50czpmdW5jdGlvbihhKXt2YXIgYj0zRFtdLGMsZD0KLGU9
M0R0aGlzLnhBeGlzLGY9M0RlJiZlLmdldEV4dHJlbWVzKCksZz0zRGU/ZS50b29sdGlwTGVufHxl
Lmxlbjp0aGlzLmNoYXJ0PQoucGxvdFNpemVYLGgsaSxqPTNEW107aWYoISh0aGlzLm9wdGlvbnMu
ZW5hYmxlTW91c2VUcmFja2luZz0zRD0zRD0zRCExfHx0aGk9CnMuc2luZ3VsYXJUb29sdGlwcykp
e2lmKGEpdGhpcy50b29sdGlwUG9pbnRzPTNEbnVsbDtwKHRoaXMuc2VnbWVudHN8fHRoaXMucD0K
b2ludHMsZnVuY3Rpb24oYSl7Yj0zRGIuY29uY2F0KGEpfSk7ZSYmZS5yZXZlcnNlZCYmKGI9M0Ri
LnJldmVyc2UoKSk7dGhpcy5vPQpyZGVyVG9vbHRpcFBvaW50cyYmdGhpcy5vcmRlclRvb2x0aXBQ
b2ludHMoYik7YT0zRGIubGVuZ3RoO2ZvcihpPTNEMDtpPGE7aSs9CispaWYoZT0zRGJbaV0sYz0z
RGUueCxjPj0zRGYubWluJiZjPD0zRGYubWF4KXtoPTNEYltpKzFdO2M9M0RkPTNEPTNEPTNEdD8w
Oj0KZCsxO2ZvcihkPTNEYltpKzFdP0ModigwLFQoKGUuY2xpZW50WCsKLShoP2gud3JhcHBlZENs
aWVudFh8fGguY2xpZW50WDpnKSkvMikpLGcpOmc7Yz49M0QwJiZjPD0zRGQ7KWpbYysrXT0zRGV9
dGhpPQpzLnRvb2x0aXBQb2ludHM9M0RqfX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuc2V0VmlzaWJs
ZSghMCl9LGhpZGU6ZnVuY3Rpb24oKXs9CnRoaXMuc2V0VmlzaWJsZSghMSl9LHNlbGVjdDpmdW5j
dGlvbihhKXt0aGlzLnNlbGVjdGVkPTNEYT0zRGE9M0Q9M0Q9M0R0PyF0aD0KaXMuc2VsZWN0ZWQ6
YTtpZih0aGlzLmNoZWNrYm94KXRoaXMuY2hlY2tib3guY2hlY2tlZD0zRGE7RCh0aGlzLGE/InNl
bGVjdCI6PQoidW5zZWxlY3QiKX0sZHJhd1RyYWNrZXI6Uy5kcmF3VHJhY2tlckdyYXBofSk7cShS
LHtBeGlzOmxhLENoYXJ0OllhLENvbG9yOnk9CmEsUG9pbnQ6RWEsVGljazpTYSxSZW5kZXJlcjpa
YSxTZXJpZXM6TyxTVkdFbGVtZW50OlAsU1ZHUmVuZGVyZXI6dGEsYXJyYXlNaT0KbjpOYSxhcnJh
eU1heDpCYSxjaGFydHM6VixkYXRlRm9ybWF0OmNiLGZvcm1hdDpJYSxwYXRoQW5pbTp1YixnZXRP
cHRpb25zOmZ1PQpuY3Rpb24oKXtyZXR1cm4gRX0sCi1oYXNCaWRpQnVnOk5iLGlzVG91Y2hEZXZp
Y2U6SmIsbnVtYmVyRm9ybWF0OkdhLHNlcmllc1R5cGVzOkYsc2V0T3B0aW9uczpmdT0KbmN0aW9u
KGEpe0U9M0R3KCEwLEUsYSk7Q2IoKTtyZXR1cm4gRX0sYWRkRXZlbnQ6SyxyZW1vdmVFdmVudDpX
LGNyZWF0ZUVsZW1lPQpudDpZLGRpc2NhcmRFbGVtZW50OlBhLGNzczpHLGVhY2g6cCxleHRlbmQ6
cSxtYXA6VWEsbWVyZ2U6dyxwaWNrOm0sc3BsYXQ6cWE9CixleHRlbmRDbGFzczprYSxwSW50Onos
d3JhcDpNYSxzdmc6YWEsY2FudmFzOmZhLHZtbDohYWEmJiFmYSxwcm9kdWN0OiJIaWdoYz0KaGFy
dHMiLHZlcnNpb246IjQuMC4xIn0pfSkoKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpk
aWZmIC1yIGJmYzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3
MWRiNmIyZjUwODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvdmlld3MvZ3JvdXAuanMKLS0tIGEvY29uZmlnL3BsdWdp
bnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy92aWV3cy9ncm91cC5qcworKysgYi9jb25m
aWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL3ZpZXdzL2dyb3VwLmpzCkBA
IC0xMzQsOCArMTM0LDcgQEAKICAgICAgICAgdmFyIGlzX2xhYmVsICAgID0zRCBjb2x1bW5fZGVm
aW5pdGlvbi5pc19sYWJlbDsKICAgICAgICAgdmFyIGlzX2F1dG8gICAgID0zRCBjb2x1bW5fZGVm
aW5pdGlvbi5pc19hdXRvOwogICAgICAgICB2YXIgaXNfbnVtZXJpYyAgPTNEIGNvbHVtbl9kZWZp
bml0aW9uLmlzX251bWVyaWM7Ci0gICAgICAgIHZhciBpc191bmlxdWUgICA9M0QgY29sdW1uX2Rl
ZmluaXRpb24uaXNfdW5pcXVlOwotCisgICAgICAgPTIwCiAgICAgICAgIC8vIGNvbmZpZ3VyZSBj
b2x1bW5zCiAgICAgICAgIHZhciBjb2x1bW5zID0zRCBbXTsKICAgICAgICA9MjAKQEAgLTE4Nywy
NSArMTg2LDkgQEAKICAgICAgICAgfQogICAgICAgICBzZWxlY3QudmFsdWUodGhpcy5ncm91cC5n
ZXQoaWQpKTsKICAgICAgICA9MjAKLSAgICAgICAgLyovIGxpbmsgZ3JvdXAgd2l0aCBzZWxlY3Qg
ZmllbGQKLSAgICAgICAgdGhpcy5ncm91cC5vbignY2hhbmdlOicgKyBpZCwgZnVuY3Rpb24oKXsK
LSAgICAgICAgICAgIHNlbGVjdC52YWx1ZShzZWxmLmdyb3VwLmdldChpZCkpOwotICAgICAgICB9
KTsqLwotICAgICAgID0yMAogICAgICAgICAvLyBsaW5rIHNlbGVjdCBmaWVsZCB3aXRoIGdyb3Vw
CiAgICAgICAgIHNlbGVjdC5zZXRPbkNoYW5nZShmdW5jdGlvbih2YWx1ZSkgewotICAgICAgICAg
ICAgLyovIHVwZGF0ZSBtb2RlbCB2YWx1ZQotICAgICAgICAgICAgaWYgKGlzX3VuaXF1ZSkgewot
ICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhbGwgZ3JvdXBzCi0gICAgICAgICAgICAgICAgc2Vs
Zi5jaGFydC5ncm91cHMuZWFjaChmdW5jdGlvbihncm91cCkgewotICAgICAgICAgICAgICAgICAg
ICBncm91cC5zZXQoaWQsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAg
IH0gZWxzZSB7Ki8KLSAgICAgICAgICAgICAgICAvLyBvbmx5IGNoYW5nZSB0aGlzIGdyb3VwCi0g
ICAgICAgICAgICAgICAgc2VsZi5ncm91cC5zZXQoaWQsIHZhbHVlKTsKLSAgICAgICAgICAgIC8v
fQotICAgICAgICAgICA9MjAKLSAgICAgICAgICAgIC8vIHNldCBtb2RpZmllZCBmbGFnCisgICAg
ICAgICAgICBzZWxmLmdyb3VwLnNldChpZCwgdmFsdWUpOwogICAgICAgICAgICAgc2VsZi5jaGFy
dC5zZXQoJ21vZGlmaWVkJywgdHJ1ZSk7CiAgICAgICAgIH0pOwogICAgICAgID0yMAoKZGlmZiAt
ciBiZmMxMWExMzc0MjdiYjFiMDQ3MWY5N2M1M2Q4YzRkMmVhMDU0MGEzIC1yIGMxMTM3NzFkYjZi
MmY1MDgwMGYwNDVlPQo3Yjc0YThkNjUwYzA0NzRlOCBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0
aW9ucy9jaGFydHMvc3RhdGljL3ZpZXdzL3R5cGVzLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zp
c3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvdmlld3MvdHlwZXMuanMKKysrIGIvY29uZmlnL3Bs
dWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy92aWV3cy90eXBlcy5qcwpAQCAtMjks
MjQgKzI5LDE0IEBACiAgICAgICAgIC8vIGNyZWF0ZSBuZXcgZWxlbWVudAogICAgICAgICB2YXIg
JGVsID0zRCAkKCc8ZGl2IGNsYXNzPTNEImNoYXJ0cy1ncmlkIi8+Jyk7CiAgICAgICAgPTIwCi0g
ICAgICAgIC8vIGNvbnN0cnVjdCBjaGFydCB0eXBlIHN1YnNldCBzZWxlY3Rpb24gYnV0dG9ucwot
ICAgICAgICB0aGlzLmxpYnJhcnkgPTNEIG5ldyBVaS5SYWRpb0J1dHRvbih7Ci0gICAgICAgICAg
ICBkYXRhICAgIDogWyB7IGxhYmVsOiAnRGVmYXVsdCcsIHZhbHVlOiAnZGVmYXVsdCcgfSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdDbGFzc2ljJywgdmFsdWU6ICdudmQzJyB9
LAotICAgICAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogJ1pvb21hYmxlJywgdmFsdWU6ICdo
aWdoY2hhcnRzJyB9XSwKLSAgICAgICAgICAgIG9uY2hhbmdlOiBmdW5jdGlvbih2YWx1ZSkgewot
ICAgICAgICAgICAgICAgIHNlbGYuX2ZpbHRlcih2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0pOwotICAgICAgICAkZWwuYXBwZW5kKFV0aWxzLndyYXAodGhpcy5saWJyYXJ5LiRlbCkp
OwotICAgICAgID0yMAogICAgICAgICAvLyBzZXQgZWxlbWVudAogICAgICAgICB0aGlzLnNldEVs
ZW1lbnQoJGVsKTsKICAgICAgICA9MjAKICAgICAgICAgLy8gcmVuZGVyCiAgICAgICAgIHRoaXMu
X3JlbmRlcigpOwogICAgICAgID0yMAotICAgICAgICB0aGlzLmxpYnJhcnkudmFsdWUoJ2RlZmF1
bHQnKTsKKyAgICAgICAgLy8gc2hvdyBvbmx5IGRlZmF1bHQgY2hhcnQgdHlwZXMKKyAgICAgICAg
dGhpcy5fZmlsdGVyKCdkZWZhdWx0Jyk7CiAgICAgfSwKICAgID0yMAogICAgIC8vIHZhbHVlCgpk
aWZmIC1yIGJmYzExYTEzNzQyN2JiMWIwNDcxZjk3YzUzZDhjNGQyZWEwNTQwYTMgLXIgYzExMzc3
MWRiNmIyZjUwODAwZjA0NWU9CjdiNzRhOGQ2NTBjMDQ3NGU4IGNvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvdmlld3Mvdmlld3Bvcj0KdC5qcwotLS0gYS9jb25maWcv
cGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL3ZpZXdzL3ZpZXdwb3J0LmpzCisr
KyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvdmlld3Mvdmll
d3BvcnQuanMKQEAgLTI1NCwxMCArMjU0LDkgQEAKICAgICAgICAgICAgICAgICB2YXIgY29sdW1u
X3NldHRpbmdzID0zRCBzZWxmLmNoYXJ0X2RlZmluaXRpb24uY29sdW1uc1tjb2x1PQptbl9rZXld
OwogICAgICAgICAgICAgICAgPTIwCiAgICAgICAgICAgICAgICAgLy8gYWRkIHRvIGNvbHVtbnMK
LSAgICAgICAgICAgICAgICBjb2x1bW5zW2NvbHVtbl9rZXldID0zRCB7Ci0gICAgICAgICAgICAg
ICAgICAgIGluZGV4ICAgICAgIDogZ3JvdXAuZ2V0KGNvbHVtbl9rZXkpLAotICAgICAgICAgICAg
ICAgICAgICBpc19sYWJlbCAgICA6IGNvbHVtbl9zZXR0aW5ncy5pc19sYWJlbAotICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2x1bW5zW2NvbHVtbl9rZXldID0zRCBVdGlscy5t
ZXJnZSAoeworICAgICAgICAgICAgICAgICAgICBpbmRleCA6IGdyb3VwLmdldChjb2x1bW5fa2V5
KQorICAgICAgICAgICAgICAgIH0sIGNvbHVtbl9zZXR0aW5ncyk7CiAgICAgICAgICAgICB9CiAg
ICAgICAgICAgID0yMAogICAgICAgICAgICAgLy8gYWRkIGdyb3VwIGRhdGEKCmRpZmYgLXIgYmZj
MTFhMTM3NDI3YmIxYjA0NzFmOTdjNTNkOGM0ZDJlYTA1NDBhMyAtciBjMTEzNzcxZGI2YjJmNTA4
MDBmMDQ1ZT0KN2I3NGE4ZDY1MGMwNDc0ZTggY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMv
Y2hhcnRzL3RlbXBsYXRlcy9jaGFydHMubWFrbwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxp
emF0aW9ucy9jaGFydHMvdGVtcGxhdGVzL2NoYXJ0cy5tYWtvCisrKyBiL2NvbmZpZy9wbHVnaW5z
L3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy90ZW1wbGF0ZXMvY2hhcnRzLm1ha28KQEAgLTI2LDkgKzI2
LDggQEAKICAgICAgICAgJHtoLnN0eWxlc2hlZXRfbGluayggYXBwX3Jvb3QgKyAicGx1Z2lucy9u
dmQzL252LmQzLmNzcyIgKX0KPTIwCiAgICAgICAgICMjIGluc3RhbGwgaGlnaGNoYXJ0cyBtb2R1
bGUKLSAgICAgICAgJHtoLmphdmFzY3JpcHRfbGluayggYXBwX3Jvb3QgKyAicGx1Z2lucy9oaWdo
Y2hhcnRzL2hpZ2hjaGFydHMuanMiPQogKX0KLSAgICAgICAgJHtoLmphdmFzY3JpcHRfbGluaygg
YXBwX3Jvb3QgKyAicGx1Z2lucy9oaWdoY2hhcnRzL2hpZ2hjaGFydHMtbW9yPQplLmpzIiApfQot
ICAgICAgICAke2guamF2YXNjcmlwdF9saW5rKCBhcHBfcm9vdCArICJwbHVnaW5zL2hpZ2hjaGFy
dHMvaGVhdG1hcC5qcyIgKX0KKyAgICAgICAgJHtoLmphdmFzY3JpcHRfbGluayggImh0dHA6Ly9j
b2RlLmhpZ2hjaGFydHMuY29tL2hpZ2hjaGFydHMuanMiICl9CisgICAgICAgICR7aC5qYXZhc2Ny
aXB0X2xpbmsoICJodHRwOi8vY29kZS5oaWdoY2hhcnRzLmNvbS9tb2R1bGVzL2hlYXRtYXAuaj0K
cyIgKX0KICAgICAgICA9MjAKICAgICAgICAgIyMgaW5zdGFsbCBib3hwbG90IG1vZHVsZQogICAg
ICAgICAjIyR7aC5qYXZhc2NyaXB0X2xpbmsoIGFwcF9yb290ICsgInBsdWdpbnMvYm94LmpzIiAp
fQoKUmVwb3NpdG9yeSBVUkw6IGh0dHBzOi8vYml0YnVja2V0Lm9yZy9nYWxheHkvZ2FsYXh5LWNl
bnRyYWwvCgotLQoKVGhpcyBpcyBhIGNvbW1pdCBub3RpZmljYXRpb24gZnJvbSBiaXRidWNrZXQu
b3JnLiBZb3UgYXJlIHJlY2VpdmluZwp0aGlzIGJlY2F1c2UgeW91IGhhdmUgdGhlIHNlcnZpY2Ug
ZW5hYmxlZCwgYWRkcmVzc2luZyB0aGUgcmVjaXBpZW50IG9mCnRoaXMgZW1haWwuCg
1
0
commit/galaxy-central: dannon: Update amqp_internal_connection sqlite default in universe_sample to be correct.
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/bfc11a137427/
Changeset: bfc11a137427
User: dannon
Date: 2014-06-06 18:08:16
Summary: Update amqp_internal_connection sqlite default in universe_sample to be correct.
Affected #: 1 file
diff -r b45044f8372a282065af34175c465f3f9c1c671e -r bfc11a137427bb1b0471f97c53d8c4d2ea0540a3 universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -845,7 +845,7 @@
# will automatically create and use a separate sqlite database located in your
# <galaxy>/database folder (indicated in the commented out line below).
-#amqp_internal_connection = sqlite:///./database/control.sqlite?isolation_level=IMMEDIATE
+#amqp_internal_connection = sqlalchemy+sqlite:///./database/control.sqlite?isolation_level=IMMEDIATE
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix for getting updates to an installed repository that has a dependency on a Tool dependency definition repository that also has available updates.
by commits-noreply@bitbucket.org 06 Jun '14
by commits-noreply@bitbucket.org 06 Jun '14
06 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b45044f8372a/
Changeset: b45044f8372a
User: greg
Date: 2014-06-06 15:45:37
Summary: Fix for getting updates to an installed repository that has a dependency on a Tool dependency definition repository that also has available updates.
Affected #: 6 files
diff -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 -r b45044f8372a282065af34175c465f3f9c1c671e lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -517,7 +517,7 @@
tmp_clone_url = common_util.url_join( tool_shed_url, 'repos', owner, name )
tmp_repo_info_tuple = ( None, tmp_clone_url, latest_downloadable_revision, None, owner, None, None )
installed_repository, installed_changeset_revision = \
- suc.repository_was_previously_installed( trans, tool_shed_url, name, tmp_repo_info_tuple )
+ suc.repository_was_previously_installed( trans, tool_shed_url, name, tmp_repo_info_tuple, from_tip=False )
if installed_repository:
current_changeset_revision = str( installed_repository.changeset_revision )
message = 'Revision <b>%s</b> of repository <b>%s</b> owned by <b>%s</b> has already been installed.' % \
@@ -1854,6 +1854,10 @@
name,
owner,
changeset_revision )
+ original_metadata_dict = repository.metadata
+ original_repository_dependencies_dict = original_metadata_dict.get( 'repository_dependencies', {} )
+ original_repository_dependencies = original_repository_dependencies_dict.get( 'repository_dependencies', [] )
+ original_tool_dependencies_dict = original_metadata_dict.get( 'tool_dependencies', {} )
if changeset_revision and latest_changeset_revision and latest_ctx_rev:
if changeset_revision == latest_changeset_revision:
message = "The installed repository named '%s' is current, there are no updates available. " % name
@@ -1910,32 +1914,80 @@
repository,
repository_tools_tups )
if 'repository_dependencies' in metadata_dict or 'tool_dependencies' in metadata_dict:
- if 'repository_dependencies' in metadata_dict:
- # Updates received include newly defined repository dependencies, so allow the user
- # the option of installting them. We cannot update the repository with the changes
- # until that happens, so we have to send them along.
- new_kwd = dict( tool_shed_url=tool_shed_url,
- updating_repository_id=trans.security.encode_id( repository.id ),
+ new_repository_dependencies_dict = metadata_dict.get( 'repository_dependencies', {} )
+ new_repository_dependencies = new_repository_dependencies_dict.get( 'repository_dependencies', [] )
+ new_tool_dependencies_dict = metadata_dict.get( 'tool_dependencies', {} )
+ if new_repository_dependencies:
+ # [[http://localhost:9009', package_picard_1_56_0', devteam', 910b0b056666', False', False']]
+ proceed_to_install = False
+ if new_repository_dependencies == original_repository_dependencies:
+ for new_repository_tup in new_repository_dependencies:
+ # Make sure all dependencies are installed.
+ # TODO: Repository dependencies that are not installed should be displayed to to the user,
+ # giving them the option to install them or now. This is the same behavior as when initially
+ # installing and when re-installing.
+ new_tool_shed, new_name, new_owner, new_changeset_revision, new_pir, new_oicct = \
+ common_util.parse_repository_dependency_tuple( new_repository_tup )
+ # Mock up a repo_info_tupe that has the information needed to see if the repository dependency
+ # was previously installed.
+ repo_info_tuple = ( '', new_tool_shed, new_changeset_revision, '', new_owner, [], [] )
+ # Since the value of new_changeset_revision came from a repository dependency
+ # definition, it may occur earlier in the Tool Shed's repository changelog than
+ # the Galaxy tool_shed_repository.installed_changeset_revision record value, so
+ # we set from_tip to True to make sure we get the entire set of changeset revisions
+ # from the Tool Shed.
+ new_repository_db_record, installed_changeset_revision = \
+ suc.repository_was_previously_installed( trans,
+ tool_shed_url,
+ new_name,
+ repo_info_tuple,
+ from_tip=True )
+ if new_repository_db_record:
+ if new_repository_db_record.status in [ trans.install_model.ToolShedRepository.installation_status.ERROR,
+ trans.install_model.ToolShedRepository.installation_status.NEW,
+ trans.install_model.ToolShedRepository.installation_status.UNINSTALLED ]:
+ proceed_to_install = True
+ break
+ else:
+ proceed_to_install = True
+ break
+ if proceed_to_install:
+ # Updates received include newly defined repository dependencies, so allow the user
+ # the option of installting them. We cannot update the repository with the changes
+ # until that happens, so we have to send them along.
+ new_kwd = dict( tool_shed_url=tool_shed_url,
+ updating_repository_id=trans.security.encode_id( repository.id ),
+ updating_to_ctx_rev=latest_ctx_rev,
+ updating_to_changeset_revision=latest_changeset_revision,
+ encoded_updated_metadata=encoding_util.tool_shed_encode( metadata_dict ),
+ updating=True )
+ return self.prepare_for_install( trans, **new_kwd )
+ # Updates received did not include any newly defined repository dependencies but did include
+ # newly defined tool dependencies. If the newly defined tool dependencies are not the same
+ # as the originally defined tool dependencies, we need to install them.
+ proceed_to_install = False
+ for new_key, new_val in new_tool_dependencies_dict.items():
+ if new_key not in original_tool_dependencies_dict:
+ proceed_to_install = True
+ break
+ original_val = original_tool_dependencies_dict[ new_key ]
+ if new_val != original_val:
+ proceed_to_install = True
+ break
+ if proceed_to_install:
+ encoded_tool_dependencies_dict = encoding_util.tool_shed_encode( metadata_dict.get( 'tool_dependencies', {} ) )
+ encoded_relative_install_dir = encoding_util.tool_shed_encode( relative_install_dir )
+ new_kwd = dict( updating_repository_id=trans.security.encode_id( repository.id ),
updating_to_ctx_rev=latest_ctx_rev,
updating_to_changeset_revision=latest_changeset_revision,
encoded_updated_metadata=encoding_util.tool_shed_encode( metadata_dict ),
- updating=True )
- return self.prepare_for_install( trans, **new_kwd )
- # Updates received did not include any newly defined repository dependencies but did include
- # newly defined tool dependencies.
- encoded_tool_dependencies_dict = encoding_util.tool_shed_encode( metadata_dict.get( 'tool_dependencies', {} ) )
- encoded_relative_install_dir = encoding_util.tool_shed_encode( relative_install_dir )
- new_kwd = dict( updating_repository_id=trans.security.encode_id( repository.id ),
- updating_to_ctx_rev=latest_ctx_rev,
- updating_to_changeset_revision=latest_changeset_revision,
- encoded_updated_metadata=encoding_util.tool_shed_encode( metadata_dict ),
- encoded_relative_install_dir=encoded_relative_install_dir,
- encoded_tool_dependencies_dict=encoded_tool_dependencies_dict,
- message=message,
- status = status )
- return self.install_tool_dependencies_with_update( trans, **new_kwd )
+ encoded_relative_install_dir=encoded_relative_install_dir,
+ encoded_tool_dependencies_dict=encoded_tool_dependencies_dict,
+ message=message,
+ status = status )
+ return self.install_tool_dependencies_with_update( trans, **new_kwd )
# Updates received did not include any newly defined repository dependencies or newly defined
- # tool dependencies.
+ # tool dependencies that need to be installed.
repository = repository_util.update_repository_record( trans,
repository=repository,
updated_metadata_dict=metadata_dict,
diff -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 -r b45044f8372a282065af34175c465f3f9c1c671e lib/galaxy/webapps/tool_shed/controllers/repository.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -2594,31 +2594,44 @@
status=status )
@web.expose
- def previous_changeset_revisions( self, trans, **kwd ):
+ def previous_changeset_revisions( self, trans, from_tip=False, **kwd ):
"""
- Handle a request from a local Galaxy instance. This method will handle the case where the repository was previously installed using an
- older changeset_revsion, but later the repository was updated in the tool shed and the Galaxy admin is trying to install the latest
- changeset revision of the same repository instead of updating the one that was previously installed.
+ Handle a request from a local Galaxy instance. This method will handle two scenarios: (1) the
+ repository was previously installed using an older changeset_revsion, but later the repository
+ was updated in the tool shed and the Galaxy admin is trying to install the latest changeset
+ revision of the same repository instead of updating the one that was previously installed. (2)
+ the admin is attempting to get updates for an installed repository that has a repository dependency
+ and both the repository and its dependency have available updates. In this case, the from_tip
+ parameter will be True because the repository dependency definition may define a changeset hash
+ for the dependency that is newer than the installed changeset revision of the dependency (this is
+ due to the behavior of "Tool dependency definition" repositories, whose metadata is always the tip),
+ so the complete list of changset hashes in the changelog must be returned.
"""
name = kwd.get( 'name', None )
owner = kwd.get( 'owner', None )
- changeset_revision = kwd.get( 'changeset_revision', None )
- repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
- repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False )
- # Get the lower bound changeset revision.
- lower_bound_changeset_revision = metadata_util.get_previous_metadata_changeset_revision( repository,
- repo,
- changeset_revision,
- downloadable=True )
- # Build the list of changeset revision hashes.
- changeset_hashes = []
- for changeset in hg_util.reversed_lower_upper_bounded_changelog( repo,
- lower_bound_changeset_revision,
- changeset_revision ):
- changeset_hashes.append( str( repo.changectx( changeset ) ) )
- if changeset_hashes:
- changeset_hashes_str = ','.join( changeset_hashes )
- return changeset_hashes_str
+ if name is not None and owner is not None:
+ repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
+ from_tip = util.string_as_bool( from_tip )
+ if from_tip:
+ changeset_revision = repository.tip( trans.app )
+ else:
+ changeset_revision = kwd.get( 'changeset_revision', None )
+ if changeset_revision is not None:
+ repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False )
+ # Get the lower bound changeset revision.
+ lower_bound_changeset_revision = metadata_util.get_previous_metadata_changeset_revision( repository,
+ repo,
+ changeset_revision,
+ downloadable=True )
+ # Build the list of changeset revision hashes.
+ changeset_hashes = []
+ for changeset in hg_util.reversed_lower_upper_bounded_changelog( repo,
+ lower_bound_changeset_revision,
+ changeset_revision ):
+ changeset_hashes.append( str( repo.changectx( changeset ) ) )
+ if changeset_hashes:
+ changeset_hashes_str = ','.join( changeset_hashes )
+ return changeset_hashes_str
return ''
@web.expose
diff -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 -r b45044f8372a282065af34175c465f3f9c1c671e lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -264,7 +264,8 @@
repository, installed_changeset_revision = suc.repository_was_previously_installed( trans,
tool_shed,
name,
- tmp_repo_info_tuple )
+ tmp_repo_info_tuple,
+ from_tip=False )
if repository:
new_rd_tup = [ tool_shed,
name,
diff -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 -r b45044f8372a282065af34175c465f3f9c1c671e lib/tool_shed/util/repository_dependency_util.py
--- a/lib/tool_shed/util/repository_dependency_util.py
+++ b/lib/tool_shed/util/repository_dependency_util.py
@@ -75,6 +75,10 @@
# Make sure required_repository is in the repository_dependency table.
repository_dependency = get_repository_dependency_by_repository_id( trans, required_repository.id )
if not repository_dependency:
+ log.debug( 'Creating new repository_dependency record for installed revision %s of repository: %s owned by %s.' % \
+ ( str( required_repository.installed_changeset_revision ),
+ str( required_repository.name ),
+ str( required_repository.owner ) ) )
repository_dependency = trans.install_model.RepositoryDependency( tool_shed_repository_id=required_repository.id )
trans.install_model.context.add( repository_dependency )
trans.install_model.context.flush()
@@ -129,7 +133,7 @@
for repo_info_dict in all_repo_info_dicts:
# If the user elected to install repository dependencies, all items in the all_repo_info_dicts list will
# be processed. However, if repository dependencies are not to be installed, only those items contained
- # in the received repo_info_dicts list will be processed but the the all_repo_info_dicts list will be used
+ # in the received repo_info_dicts list will be processed but the all_repo_info_dicts list will be used
# to create all defined repository dependency relationships.
if is_in_repo_info_dicts( repo_info_dict, repo_info_dicts ) or install_repository_dependencies:
for name, repo_info_tuple in repo_info_dict.items():
@@ -138,7 +142,7 @@
suc.get_repo_info_tuple_contents( repo_info_tuple )
# See if the repository has an existing record in the database.
repository_db_record, installed_changeset_revision = \
- suc.repository_was_previously_installed( trans, tool_shed_url, name, repo_info_tuple )
+ suc.repository_was_previously_installed( trans, tool_shed_url, name, repo_info_tuple, from_tip=False )
if repository_db_record:
if repository_db_record.status in [ trans.install_model.ToolShedRepository.installation_status.INSTALLED,
trans.install_model.ToolShedRepository.installation_status.CLONING,
diff -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 -r b45044f8372a282065af34175c465f3f9c1c671e lib/tool_shed/util/shed_util_common.py
--- a/lib/tool_shed/util/shed_util_common.py
+++ b/lib/tool_shed/util/shed_util_common.py
@@ -1352,7 +1352,7 @@
folder_contents.append( node )
return folder_contents
-def repository_was_previously_installed( trans, tool_shed_url, repository_name, repo_info_tuple ):
+def repository_was_previously_installed( trans, tool_shed_url, repository_name, repo_info_tuple, from_tip=False ):
"""
Find out if a repository is already installed into Galaxy - there are several scenarios where this
is necessary. For example, this method will handle the case where the repository was previously
@@ -1375,10 +1375,11 @@
return tool_shed_repository, changeset_revision
# Get all previous changeset revisions from the tool shed for the repository back to, but excluding,
# the previous valid changeset revision to see if it was previously installed using one of them.
- params = '?galaxy_url=%s&name=%s&owner=%s&changeset_revision=%s' % ( url_for( '/', qualified=True ),
- str( repository_name ),
- str( repository_owner ),
- changeset_revision )
+ params = '?galaxy_url=%s&name=%s&owner=%s&changeset_revision=%s&from_tip=%s' % ( url_for( '/', qualified=True ),
+ str( repository_name ),
+ str( repository_owner ),
+ changeset_revision,
+ str( from_tip ) )
url = common_util.url_join( tool_shed_url,
'repository/previous_changeset_revisions%s' % params )
text = common_util.tool_shed_get( trans.app, tool_shed_url, url )
diff -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 -r b45044f8372a282065af34175c465f3f9c1c671e lib/tool_shed/util/tool_dependency_util.py
--- a/lib/tool_shed/util/tool_dependency_util.py
+++ b/lib/tool_shed/util/tool_dependency_util.py
@@ -617,7 +617,7 @@
tool_dependencies=tool_dependencies )
# The required_repository may have been installed with a different changeset revision.
required_repository, installed_changeset_revision = \
- suc.repository_was_previously_installed( trans, tool_shed_url, name, repo_info_tuple )
+ suc.repository_was_previously_installed( trans, tool_shed_url, name, repo_info_tuple, from_tip=False )
if required_repository:
required_repository_installed_tool_dependencies, required_repository_missing_tool_dependencies = \
get_installed_and_missing_tool_dependencies_for_installed_repository( trans, required_repository, tool_dependencies )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Another fix for remotely populated metadata FileParameters.
by commits-noreply@bitbucket.org 05 Jun '14
by commits-noreply@bitbucket.org 05 Jun '14
05 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e56736a7d9ba/
Changeset: e56736a7d9ba
User: jmchilton
Date: 2014-06-06 00:08:24
Summary: Another fix for remotely populated metadata FileParameters.
Requires update to remote LWR as well.
Affected #: 3 files
diff -r 5449a8b1c9d531ee2347b2b219ffb7a2e0946590 -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 lib/galaxy/datatypes/metadata.py
--- a/lib/galaxy/datatypes/metadata.py
+++ b/lib/galaxy/datatypes/metadata.py
@@ -126,13 +126,18 @@
rval[key] = self.spec[key].param.make_copy( value, target_context=self, source_context=to_copy )
return rval
- def from_JSON_dict( self, filename ):
+ def from_JSON_dict( self, filename, path_rewriter=None ):
dataset = self.parent
log.debug( 'loading metadata from file for: %s %s' % ( dataset.__class__.__name__, dataset.id ) )
JSONified_dict = json.load( open( filename ) )
for name, spec in self.spec.items():
if name in JSONified_dict:
- dataset._metadata[ name ] = spec.param.from_external_value( JSONified_dict[ name ], dataset )
+ from_ext_kwds = {}
+ external_value = JSONified_dict[ name ]
+ param = spec.param
+ if isinstance( param, FileParameter ):
+ from_ext_kwds[ 'path_rewriter' ] = path_rewriter
+ dataset._metadata[ name ] = param.from_external_value( external_value, dataset, **from_ext_kwds )
elif name in dataset._metadata:
#if the metadata value is not found in our externally set metadata but it has a value in the 'old'
#metadata associated with our dataset, we'll delete it from our dataset's metadata dict
@@ -521,7 +526,7 @@
value = value.id
return value
- def from_external_value( self, value, parent ):
+ def from_external_value( self, value, parent, path_rewriter=None ):
"""
Turns a value read from a external dict into its value to be pushed directly into the metadata dict.
"""
@@ -532,8 +537,13 @@
if mf is None:
mf = self.new_file( dataset = parent, **value.kwds )
# Ensure the metadata file gets updated with content
- parent.dataset.object_store.update_from_file( mf, file_name=value.file_name, extra_dir='_metadata_files', extra_dir_at_root=True, alt_name=os.path.basename(mf.file_name) )
- os.unlink( value.file_name )
+ file_name = value.file_name
+ if path_rewriter:
+ # Job may have run with a different (non-local) tmp/working
+ # directory. Correct.
+ file_name = path_rewriter( file_name )
+ parent.dataset.object_store.update_from_file( mf, file_name=file_name, extra_dir='_metadata_files', extra_dir_at_root=True, alt_name=os.path.basename(mf.file_name) )
+ os.unlink( file_name )
value = mf.id
return value
diff -r 5449a8b1c9d531ee2347b2b219ffb7a2e0946590 -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -952,7 +952,7 @@
self.sa_session.add(job)
self.sa_session.flush()
- def finish( self, stdout, stderr, tool_exit_code=None ):
+ def finish( self, stdout, stderr, tool_exit_code=None, remote_working_directory=None ):
"""
Called to indicate that the associated command has been run. Updates
the output datasets based on stderr and stdout from the command, and
@@ -1070,7 +1070,14 @@
#since if it is edited, the metadata changed on the running output will no longer match
#the metadata that was stored to disk for use via the external process,
#and the changes made by the user will be lost, without warning or notice
- dataset.metadata.from_JSON_dict( self.external_output_metadata.get_output_filenames_by_dataset( dataset, self.sa_session ).filename_out )
+ output_filename = self.external_output_metadata.get_output_filenames_by_dataset( dataset, self.sa_session ).filename_out
+
+ def path_rewriter( path ):
+ if remote_working_directory and path and path.startswith( remote_working_directory ):
+ return path.replace( remote_working_directory, self.working_directory, 1 )
+ return path
+
+ dataset.metadata.from_JSON_dict( output_filename, path_rewriter=path_rewriter )
try:
assert context.get( 'line_count', None ) is not None
if ( not dataset.datatype.composite_type and dataset.dataset.is_multi_byte() ) or self.tool.is_multi_byte:
diff -r 5449a8b1c9d531ee2347b2b219ffb7a2e0946590 -r e56736a7d9bafb3fe40379e192634f9ce8eb6d09 lib/galaxy/jobs/runners/lwr.py
--- a/lib/galaxy/jobs/runners/lwr.py
+++ b/lib/galaxy/jobs/runners/lwr.py
@@ -301,7 +301,7 @@
try:
client = self.get_client_from_state(job_state)
run_results = client.full_status()
-
+ remote_working_directory = run_results.get("working_directory", None)
stdout = run_results.get('stdout', '')
stderr = run_results.get('stderr', '')
exit_code = run_results.get('returncode', None)
@@ -330,7 +330,12 @@
self._handle_metadata_externally( job_wrapper, resolve_requirements=True )
# Finish the job
try:
- job_wrapper.finish( stdout, stderr, exit_code )
+ job_wrapper.finish(
+ stdout,
+ stderr,
+ exit_code,
+ remote_working_directory=remote_working_directory
+ )
except Exception:
log.exception("Job wrapper finish method failed")
job_wrapper.fail("Unable to finish job", exception=True)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Allow hiding tools from the toolbox config.
by commits-noreply@bitbucket.org 05 Jun '14
by commits-noreply@bitbucket.org 05 Jun '14
05 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5449a8b1c9d5/
Changeset: 5449a8b1c9d5
User: natefoo
Date: 2014-06-05 20:46:56
Summary: Allow hiding tools from the toolbox config.
Affected #: 1 file
diff -r 3ecffd889d5c97478630cd127c8ac4681ec49872 -r 5449a8b1c9d531ee2347b2b219ffb7a2e0946590 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -563,6 +563,8 @@
# a new repository, so any included tools can be loaded into the tool panel.
can_load_into_panel_dict = True
tool = self.load_tool( os.path.join( tool_path, path ), guid=guid, repository_id=repository_id )
+ if string_as_bool(elem.get( 'hidden', False )):
+ tool.hidden = True
key = 'tool_%s' % str( tool.id )
if can_load_into_panel_dict:
if guid is not None:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0