1(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(acdlreq,module,exports){ 2(function (global){ 3/** 4 * @license 5 * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE 6 * Build: `lodash exports="node" include="cloneDeep,cloneDeepWith,find,get,has,includes,isEmpty,isEqual,isNull,isPlainObject,isObject,merge,mergeWith,omit,reject" -p -o custom-lodash.js` 7 */ 8;(function(){function t(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function e(t,e){for(var n=-1,r=null==t?0:t.length;++n<r&&false!==e(t[n],n,t););}function n(t,e){for(var n=-1,r=null==t?0:t.length,o=0,u=[];++n<r;){var c=t[n];e(c,n,t)&&(u[o++]=c)}return u}function r(t,e){for(var n=-1,r=null==t?0:t.length,o=Array(r);++n<r;)o[n]=e(t[n],n,t);return o}function o(t,e){for(var n=-1,r=e.length,o=t.length;++n<r;)t[o+n]=e[n]; 9return t}function u(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(e(t[n],n,t))return true;return false}function c(t,e,n){var r=t.length;for(n+=-1;++n<r;)if(e(t[n],n,t))return n;return-1}function i(t){return t!==t}function a(t){return function(e){return null==e?re:e[t]}}function f(t){return function(e){return t(e)}}function l(t,e){return r(e,function(e){return t[e]})}function s(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function b(t){var e=Object;return function(n){return t(e(n)); 10}}function h(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}function p(){}function y(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function j(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function _(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function g(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new _;++e<n;)this.add(t[e])}function v(t){ 11this.size=(this.__data__=new j(t)).size}function d(t,e){var n=xn(t),r=!n&&zn(t),o=!n&&!r&&En(t),u=!n&&!r&&!o&&Mn(t);if(n=n||r||o||u){for(var r=t.length,c=String,i=-1,a=Array(r);++i<r;)a[i]=c(i);r=a}else r=[];var f,c=r.length;for(f in t)!e&&!Ue.call(t,f)||n&&("length"==f||o&&("offset"==f||"parent"==f)||u&&("buffer"==f||"byteLength"==f||"byteOffset"==f)||vt(f,c))||r.push(f);return r}function A(t,e,n){(n===re||Ft(t[e],n))&&(n!==re||e in t)||k(t,e,n)}function w(t,e,n){var r=t[e];Ue.call(t,e)&&Ft(r,n)&&(n!==re||e in t)||k(t,e,n); 12}function m(t,e){for(var n=t.length;n--;)if(Ft(t[n][0],e))return n;return-1}function O(t,e){return t&&et(e,Jt(e),t)}function S(t,e){return t&&et(e,Kt(e),t)}function k(t,e,n){"__proto__"==e&&Qe?Qe(t,e,{configurable:true,enumerable:true,value:n,writable:true}):t[e]=n}function z(t,n,r,o,u,c){var i,a=1&n,f=2&n,l=4&n;if(r&&(i=u?r(t,o,u,c):r(t)),i!==re)return i;if(!Bt(t))return t;if(o=xn(t)){if(i=yt(t),!a)return tt(t,i)}else{var s=mn(t),b="[object Function]"==s||"[object GeneratorFunction]"==s;if(En(t))return X(t,a); 13if("[object Object]"==s||"[object Arguments]"==s||b&&!u){if(i=f||b?{}:jt(t),!a)return f?rt(t,S(i,t)):nt(t,O(i,t))}else{if(!ge[s])return u?t:{};i=_t(t,s,a)}}if(c||(c=new v),u=c.get(t))return u;if(c.set(t,i),Fn(t))return t.forEach(function(e){i.add(z(e,n,r,e,t,c))}),i;if(In(t))return t.forEach(function(e,o){i.set(o,z(e,n,r,o,t,c))}),i;var f=l?f?ft:at:f?Kt:Jt,h=o?re:f(t);return e(h||t,function(e,o){h&&(o=e,e=t[o]),w(i,o,z(e,n,r,o,t,c))}),i}function x(t,e){var n=[];return gn(t,function(t,r,o){e(t,r,o)&&n.push(t); 14}),n}function E(t,e,n,r,u){var c=-1,i=t.length;for(n||(n=gt),u||(u=[]);++c<i;){var a=t[c];0<e&&n(a)?1<e?E(a,e-1,n,r,u):o(u,a):r||(u[u.length]=a)}return u}function I(t,e){e=Q(e,t);for(var n=0,r=e.length;null!=t&&n<r;)t=t[Ot(e[n++])];return n&&n==r?t:re}function F(t,e,n){return e=e(t),xn(t)?e:o(e,n(t))}
14function M(t){if(null==t)t=t===re?"[object Undefined]":"[object Null]";else if(Ke&&Ke in Object(t)){var e=Ue.call(t,Ke),n=t[Ke];try{t[Ke]=re;var r=true}catch(t){}var o=Pe.call(t);r&&(e?t[Ke]=n:delete t[Ke]), 15t=o}else t=Pe.call(t);return t}function $(t,e){return null!=t&&Ue.call(t,e)}function D(t,e){return null!=t&&e in Object(t)}function U(t){return Pt(t)&&"[object Arguments]"==M(t)}function B(t,e,n,r,o){if(t===e)e=true;else if(null==t||null==e||!Pt(t)&&!Pt(e))e=t!==t&&e!==e;else t:{var u=xn(t),c=xn(e),i=u?"[object Array]":mn(t),a=c?"[object Array]":mn(e),i="[object Arguments]"==i?"[object Object]":i,a="[object Arguments]"==a?"[object Object]":a,f="[object Object]"==i,c="[object Object]"==a;if((a=i==a)&&En(t)){ 16if(!En(e)){e=false;break t}u=true,f=false}if(a&&!f)o||(o=new v),e=u||Mn(t)?ct(t,e,n,r,B,o):it(t,e,i,n,r,B,o);else{if(!(1&n)&&(u=f&&Ue.call(t,"__wrapped__"),i=c&&Ue.call(e,"__wrapped__"),u||i)){t=u?t.value():t,e=i?e.value():e,o||(o=new v),e=B(t,e,n,r,o);break t}if(a)e:if(o||(o=new v),u=1&n,i=at(t),c=i.length,a=at(e).length,c==a||u){for(f=c;f--;){var l=i[f];if(!(u?l in e:Ue.call(e,l))){e=false;break e}}if((a=o.get(t))&&o.get(e))e=a==e;else{a=true,o.set(t,e),o.set(e,t);for(var s=u;++f<c;){var l=i[f],b=t[l],h=e[l]; 17if(r)var p=u?r(h,b,l,e,t,o):r(b,h,l,t,e,o);if(p===re?b!==h&&!B(b,h,n,r,o):!p){a=false;break}s||(s="constructor"==l)}a&&!s&&(n=t.constructor,r=e.constructor,n!=r&&"constructor"in t&&"constructor"in e&&!(typeof n=="function"&&n instanceof n&&typeof r=="function"&&r instanceof r)&&(a=false)),o.delete(t),o.delete(e),e=a}}else e=false;else e=false}}return e}function P(t){return Pt(t)&&"[object Map]"==mn(t)}function L(t,e){var n=e.length,r=n;if(null==t)return!r;for(t=Object(t);n--;){var o=e[n];if(o[2]?o[1]!==t[o[0]]:!(o[0]in t))return false; 18}for(;++n<r;){var o=e[n],u=o[0],c=t[u],i=o[1];if(o[2]){if(c===re&&!(u in t))return false}else if(o=new v,void 0===re?!B(i,c,3,void 0,o):1)return false}return true}function N(t){return Pt(t)&&"[object Set]"==mn(t)}function C(t){return Pt(t)&&Ut(t.length)&&!!_e[M(t)]}function T(t){return typeof t=="function"?t:null==t?Yt:typeof t=="object"?xn(t)?W(t[0],t[1]):R(t):te(t)}function V(t){if(!At(t))return Ze(t);var e,n=[];for(e in Object(t))Ue.call(t,e)&&"constructor"!=e&&n.push(e);return n}function R(t){var e=bt(t); 19return 1==e.length&&e[0][2]?wt(e[0][0],e[0][1]):function(n){return n===t||L(n,e)}}function W(t,e){return dt(t)&&e===e&&!Bt(e)?wt(Ot(t),e):function(n){var r=Gt(n,t);return r===re&&r===e?Ht(n,t):B(e,r,3)}}function q(t,e,n,r,o){t!==e&&vn(e,function(u,c){if(Bt(u)){o||(o=new v);var i=o,a="__proto__"==c?re:t[c],f="__proto__"==c?re:e[c],l=i.get(f);if(l)A(t,c,l);else{var l=r?r(a,f,c+"",t,e,i):re,s=l===re;if(s){var b=xn(f),h=!b&&En(f),p=!b&&!h&&Mn(f),l=f;b||h||p?xn(a)?l=a:$t(a)?l=tt(a):h?(s=false,l=X(f,true)):p?(s=false, 20l=Z(f,true)):l=[]:Lt(f)||zn(f)?(l=a,zn(a)?l=Wt(a):(!Bt(a)||n&&Dt(a))&&(l=jt(f))):s=false}s&&(i.set(f,l),q(l,f,n,r,i),i.delete(f)),A(t,c,l)}}else i=r?r("__proto__"==c?re:t[c],u,c+"",t,e,o):re,i===re&&(i=u),A(t,c,i)},Kt)}function G(t){return function(e){return I(e,t)}}function H(t){return On(mt(t,void 0,Yt),t+"")}function J(t){if(typeof t=="string")return t;if(xn(t))return r(t,J)+"";if(Ct(t))return jn?jn.call(t):"";var e=t+"";return"0"==e&&1/t==-oe?"-0":e}function K(t,e){e=Q(e,t);var n;if(2>e.length)n=t;else{ 21n=e;var r=0,o=-1,u=-1,c=n.length;for(0>r&&(r=-r>c?0:c+r),o=o>c?c:o,0>o&&(o+=c),c=r>o?0:o-r>>>0,r>>>=0,o=Array(c);++u<c;)o[u]=n[u+r];n=I(t,o)}t=n,null==t||delete t[Ot(xt(e))]}function Q(t,e){return xn(t)?t:dt(t,e)?[t]:Sn(qt(t))}function X(t,e){if(e)return t.slice();var n=t.length,n=Re?Re(n):new t.constructor(n);return t.copy(n),n}function Y(t){var e=new t.constructor(t.byteLength);return new Ve(e).set(new Ve(t)),e}function Z(t,e){return new t.constructor(e?Y(t.buffer):t.buffer,t.byteOffset,t.length); 22}function tt(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n<r;)e[n]=t[n];return e}function et(t,e,n){var r=!n;n||(n={});for(var o=-1,u=e.length;++o<u;){var c=e[o],i=re;i===re&&(i=t[c]),r?k(n,c,i):w(n,c,i)}return n}function nt(t,e){return et(t,An(t),e)}function rt(t,e){return et(t,wn(t),e)}function ot(t){return H(function(e,n){var r,o=-1,u=n.length,c=1<u?n[u-1]:re,i=2<u?n[2]:re,c=3<t.length&&typeof c=="function"?(u--,c):re;if(r=i){r=n[0];var a=n[1];if(Bt(i)){var f=typeof a;r=!!("number"==f?Mt(i)&&vt(a,i.length):"string"==f&&a in i)&&Ft(i[a],r); 23}else r=false}for(r&&(c=3>u?re:c,u=1),e=Object(e);++o<u;)(i=n[o])&&t(e,i,o,c);return e})}function ut(t){return Lt(t)?re:t}function ct(t,e,n,r,o,c){var i=1&n,a=t.length,f=e.length;if(a!=f&&!(i&&f>a))return false;if((f=c.get(t))&&c.get(e))return f==e;var f=-1,l=true,s=2&n?new g:re;
23for(c.set(t,e),c.set(e,t);++f<a;){var b=t[f],h=e[f];if(r)var p=i?r(h,b,f,e,t,c):r(b,h,f,t,e,c);if(p!==re){if(p)continue;l=false;break}if(s){if(!u(e,function(t,e){if(!s.has(e)&&(b===t||o(b,t,n,r,c)))return s.push(e)})){l=false;break}}else if(b!==h&&!o(b,h,n,r,c)){ 24l=false;break}}return c.delete(t),c.delete(e),l}function it(t,e,n,r,o,u,c){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)break;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":if(t.byteLength!=e.byteLength||!u(new Ve(t),new Ve(e)))break;return true;case"[object Boolean]":case"[object Date]":case"[object Number]":return Ft(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]": 25var i=s;case"[object Set]":if(i||(i=h),t.size!=e.size&&!(1&r))break;return(n=c.get(t))?n==e:(r|=2,c.set(t,e),e=ct(i(t),i(e),r,o,u,c),c.delete(t),e);case"[object Symbol]":if(yn)return yn.call(t)==yn.call(e)}return false}function at(t){return F(t,Jt,An)}function ft(t){return F(t,Kt,wn)}function lt(){var t=p.iteratee||Zt,t=t===Zt?T:t;return arguments.length?t(arguments[0],arguments[1]):t}function st(t,e){var n=t.__data__,r=typeof e;return("string"==r||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==e:null===e)?n[typeof e=="string"?"string":"hash"]:n.map; 26}function bt(t){for(var e=Jt(t),n=e.length;n--;){var r=e[n],o=t[r];e[n]=[r,o,o===o&&!Bt(o)]}return e}function ht(t,e){var n=null==t?re:t[e];return(!Bt(n)||Be&&Be in n?0:(Dt(n)?Ne:pe).test(St(n)))?n:re}function pt(t,e,n){e=Q(e,t);for(var r=-1,o=e.length,u=false;++r<o;){var c=Ot(e[r]);if(!(u=null!=t&&n(t,c)))break;t=t[c]}return u||++r!=o?u:(o=null==t?0:t.length,!!o&&Ut(o)&&vt(c,o)&&(xn(t)||zn(t)))}function yt(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&Ue.call(t,"index")&&(n.index=t.index, 27n.input=t.input),n}function jt(t){return typeof t.constructor!="function"||At(t)?{}:_n(We(t))}function _t(t,e,n){var r=t.constructor;switch(e){case"[object ArrayBuffer]":return Y(t);case"[object Boolean]":case"[object Date]":return new r(+t);case"[object DataView]":return e=n?Y(t.buffer):t.buffer,new t.constructor(e,t.byteOffset,t.byteLength);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]": 28case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Z(t,n);case"[object Map]":return new r;case"[object Number]":case"[object String]":return new r(t);case"[object RegExp]":return e=new t.constructor(t.source,se.exec(t)),e.lastIndex=t.lastIndex,e;case"[object Set]":return new r;case"[object Symbol]":return yn?Object(yn.call(t)):{}}}function gt(t){return xn(t)||zn(t)||!!(Je&&t&&t[Je])}function vt(t,e){var n=typeof t;return e=null==e?9007199254740991:e,!!e&&("number"==n||"symbol"!=n&&je.test(t))&&-1<t&&0==t%1&&t<e; 29}function dt(t,e){if(xn(t))return false;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!Ct(t))||(ie.test(t)||!ce.test(t)||null!=e&&t in Object(e))}function At(t){var e=t&&t.constructor;return t===(typeof e=="function"&&e.prototype||Me)}function wt(t,e){return function(n){return null!=n&&(n[t]===e&&(e!==re||t in Object(n)))}}function mt(e,n,r){return n=tn(n===re?e.length-1:n,0),function(){for(var o=arguments,u=-1,c=tn(o.length-n,0),i=Array(c);++u<c;)i[u]=o[n+u];for(u=-1,c=Array(n+1);++u<n;)c[u]=o[u]; 30return c[n]=r(i),t(e,this,c)}}function Ot(t){if(typeof t=="string"||Ct(t))return t;var e=t+"";return"0"==e&&1/t==-oe?"-0":e}function St(t){if(null!=t){try{return De.call(t)}catch(t){}return t+""}return""}function kt(t,e,n){var r=null==t?0:t.length;return r?(n=null==n?0:Vt(n),0>n&&(n=tn(r+n,0)),c(t,lt(e,3),n)):-1}function zt(t){return(null==t?0:t.length)?E(t,1):[]}function xt(t){var e=null==t?0:t.length;return e?t[e-1]:re}function Et(t,e){function n(){var r=arguments,o=e?e.apply(this,r):r[0],u=n.cache; 31return u.has(o)?u.get(o):(r=t.apply(this,r),n.cache=u.set(o,r)||u,r)}if(typeof t!="function"||null!=e&&typeof e!="function")throw new TypeError("Expected a function");return n.cache=new(Et.Cache||_),n}function It(t){if(typeof t!="function")throw new TypeError("Expected a function");return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function Ft(t,e){ 32return t===e||t!==t&&e!==e}function Mt(t){return null!=t&&Ut(t.length)&&!Dt(t)}function $t(t){return Pt(t)&&Mt(t)}function Dt(t){return!!Bt(t)&&(t=M(t),"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t)}function Ut(t){return typeof t=="number"&&-1<t&&0==t%1&&9007199254740991>=t}function Bt(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Pt(t){return null!=t&&typeof t=="object"}function Lt(t){return!(!Pt(t)||"[object Object]"!=M(t))&&(t=We(t), 33null===t||(t=Ue.call(t,"constructor")&&t.constructor,typeof t=="function"&&t instanceof t&&De.call(t)==Le))}function Nt(t){return typeof t=="string"||!xn(t)&&Pt(t)&&"[object String]"==M(t)}function Ct(t){return typeof t=="symbol"||Pt(t)&&"[object Symbol]"==M(t)}function Tt(t){return t?(t=Rt(t),t===oe||t===-oe?1.7976931348623157e308*(0>t?-1:1):t===t?t:0):0===t?t:0}function Vt(t){t=Tt(t);var e=t%1;return t===t?e?t-e:t:0}function Rt(t){if(typeof t=="number")return t;if(Ct(t))return ue;if(Bt(t)&&(t=typeof t.valueOf=="function"?t.valueOf():t, 34t=Bt(t)?t+"":t),typeof t!="string")return 0===t?t:+t;t=t.replace(fe,"");var e=he.test(t);return e||ye.test(t)?de(t.slice(2),e?2:8):be.test(t)?ue:+t}function Wt(t){return et(t,Kt(t))}function qt(t){return null==t?"":J(t)}function Gt(t,e,n){return t=null==t?re:I(t,e),t===re?n:t}function Ht(t,e){return null!=t&&pt(t,e,D)}function Jt(t){return Mt(t)?d(t):V(t)}function Kt(t){if(Mt(t))t=d(t,true);else if(Bt(t)){var e,n=At(t),r=[];for(e in t)("constructor"!=e||!n&&Ue.call(t,e))&&r.push(e);t=r}else{if(e=[], 35null!=t)for(n in Object(t))e.push(n);t=e}return t}function Qt(t){return null==t?[]:l(t,Jt(t))}function Xt(t){return function(){return t}}function Yt(t){return t}function Zt(t){return T(typeof t=="function"?t:z(t,1))}function te(t){return dt(t)?a(Ot(t)):G(t)}function ee(){return[]}function ne(){return false}
35var re,oe=1/0,ue=NaN,ce=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ie=/^\w*$/,ae=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fe=/^\s+|\s+$/g,le=/\\(\\)?/g,se=/\w*$/,be=/^[-+]0x[0-9a-f]+$/i,he=/^0b[01]+$/i,pe=/^\[object .+?Constructor\]$/,ye=/^0o[0-7]+$/i,je=/^(?:0|[1-9]\d*)$/,_e={}; 36_e["[object Float32Array]"]=_e["[object Float64Array]"]=_e["[object Int8Array]"]=_e["[object Int16Array]"]=_e["[object Int32Array]"]=_e["[object Uint8Array]"]=_e["[object Uint8ClampedArray]"]=_e["[object Uint16Array]"]=_e["[object Uint32Array]"]=true,_e["[object Arguments]"]=_e["[object Array]"]=_e["[object ArrayBuffer]"]=_e["[object Boolean]"]=_e["[object DataView]"]=_e["[object Date]"]=_e["[object Error]"]=_e["[object Function]"]=_e["[object Map]"]=_e["[object Number]"]=_e["[object Object]"]=_e["[object RegExp]"]=_e["[object Set]"]=_e["[object String]"]=_e["[object WeakMap]"]=false; 37var ge={};ge["[object Arguments]"]=ge["[object Array]"]=ge["[object ArrayBuffer]"]=ge["[object DataView]"]=ge["[object Boolean]"]=ge["[object Date]"]=ge["[object Float32Array]"]=ge["[object Float64Array]"]=ge["[object Int8Array]"]=ge["[object Int16Array]"]=ge["[object Int32Array]"]=ge["[object Map]"]=ge["[object Number]"]=ge["[object Object]"]=ge["[object RegExp]"]=ge["[object Set]"]=ge["[object String]"]=ge["[object Symbol]"]=ge["[object Uint8Array]"]=ge["[object Uint8ClampedArray]"]=ge["[object Uint16Array]"]=ge["[object Uint32Array]"]=true, 38ge["[object Error]"]=ge["[object Function]"]=ge["[object WeakMap]"]=false;var ve,de=parseInt,Ae=typeof global=="object"&&global&&global.Object===Object&&global,we=typeof self=="object"&&self&&self.Object===Object&&self,me=Ae||we||Function("return this")(),Oe=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Se=Oe&&typeof module=="object"&&module&&!module.nodeType&&module,ke=Se&&Se.exports===Oe,ze=ke&&Ae.process;t:{try{ve=ze&&ze.binding&&ze.binding("util");break t}catch(t){}ve=void 0}var xe=ve&&ve.isMap,Ee=ve&&ve.isSet,Ie=ve&&ve.isTypedArray,Fe=Array.prototype,Me=Object.prototype,$e=me["__core-js_shared__"],De=Function.prototype.toString,Ue=Me.hasOwnProperty,Be=function(){ 39var t=/[^.]+$/.exec($e&&$e.keys&&$e.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),Pe=Me.toString,Le=De.call(Object),Ne=RegExp("^"+De.call(Ue).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ce=ke?me.Buffer:re,Te=me.Symbol,Ve=me.Uint8Array,Re=Ce?Ce.a:re,We=b(Object.getPrototypeOf),qe=Object.create,Ge=Me.propertyIsEnumerable,He=Fe.splice,Je=Te?Te.isConcatSpreadable:re,Ke=Te?Te.toStringTag:re,Qe=function(){try{var t=ht(Object,"defineProperty"); 40return t({},"",{}),t}catch(t){}}(),Xe=Object.getOwnPropertySymbols,Ye=Ce?Ce.isBuffer:re,Ze=b(Object.keys),tn=Math.max,en=Date.now,nn=ht(me,"DataView"),rn=ht(me,"Map"),on=ht(me,"Promise"),un=ht(me,"Set"),cn=ht(me,"WeakMap"),an=ht(Object,"create"),fn=St(nn),ln=St(rn),sn=St(on),bn=St(un),hn=St(cn),pn=Te?Te.prototype:re,yn=pn?pn.valueOf:re,jn=pn?pn.toString:re,_n=function(){function t(){}return function(e){return Bt(e)?qe?qe(e):(t.prototype=e,e=new t,t.prototype=re,e):{}}}();y.prototype.clear=function(){ 41this.__data__=an?an(null):{},this.size=0},y.prototype.delete=function(t){return t=this.has(t)&&delete this.__data__[t],this.size-=t?1:0,t},y.prototype.get=function(t){var e=this.__data__;return an?(t=e[t],"__lodash_hash_undefined__"===t?re:t):Ue.call(e,t)?e[t]:re},y.prototype.has=function(t){var e=this.__data__;return an?e[t]!==re:Ue.call(e,t)},y.prototype.set=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=an&&e===re?"__lodash_hash_undefined__":e,this},j.prototype.clear=function(){ 42this.__data__=[],this.size=0},j.prototype.delete=function(t){var e=this.__data__;return t=m(e,t),!(0>t)&&(t==e.length-1?e.pop():He.call(e,t,1),--this.size,true)},j.prototype.get=function(t){var e=this.__data__;return t=m(e,t),0>t?re:e[t][1]},j.prototype.has=function(t){return-1<m(this.__data__,t)},j.prototype.set=function(t,e){var n=this.__data__,r=m(n,t);return 0>r?(++this.size,n.push([t,e])):n[r][1]=e,this},_.prototype.clear=function(){this.size=0,this.__data__={hash:new y,map:new(rn||j),string:new y 43}},_.prototype.delete=function(t){return t=st(this,t).delete(t),this.size-=t?1:0,t},_.prototype.get=function(t){return st(this,t).get(t)},_.prototype.has=function(t){return st(this,t).has(t)},_.prototype.set=function(t,e){var n=st(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},g.prototype.add=g.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},g.prototype.has=function(t){return this.__data__.has(t)},v.prototype.clear=function(){this.__data__=new j, 44this.size=0},v.prototype.delete=function(t){var e=this.__data__;return t=e.delete(t),this.size=e.size,t},v.prototype.get=function(t){return this.__data__.get(t)},v.prototype.has=function(t){return this.__data__.has(t)},v.prototype.set=function(t,e){var n=this.__data__;if(n instanceof j){var r=n.__data__;if(!rn||199>r.length)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new _(r)}return n.set(t,e),this.size=n.size,this};var gn=function(t,e){return function(n,r){if(null==n)return n;if(!Mt(n))return t(n,r); 45for(var o=n.length,u=e?o:-1,c=Object(n);
45(e?u--:++u<o)&&false!==r(c[u],u,c););return n}}(function(t,e){return t&&vn(t,e,Jt)}),vn=function(t){return function(e,n,r){var o=-1,u=Object(e);r=r(e);for(var c=r.length;c--;){var i=r[t?c:++o];if(false===n(u[i],i,u))break}return e}}(),dn=Qe?function(t,e){return Qe(t,"toString",{configurable:true,enumerable:false,value:Xt(e),writable:true})}:Yt,An=Xe?function(t){return null==t?[]:(t=Object(t),n(Xe(t),function(e){return Ge.call(t,e)}))}:ee,wn=Xe?function(t){for(var e=[];t;)o(e,An(t)), 46t=We(t);return e}:ee,mn=M;(nn&&"[object DataView]"!=mn(new nn(new ArrayBuffer(1)))||rn&&"[object Map]"!=mn(new rn)||on&&"[object Promise]"!=mn(on.resolve())||un&&"[object Set]"!=mn(new un)||cn&&"[object WeakMap]"!=mn(new cn))&&(mn=function(t){var e=M(t);if(t=(t="[object Object]"==e?t.constructor:re)?St(t):"")switch(t){case fn:return"[object DataView]";case ln:return"[object Map]";case sn:return"[object Promise]";case bn:return"[object Set]";case hn:return"[object WeakMap]"}return e});var On=function(t){ 47var e=0,n=0;return function(){var r=en(),o=16-(r-n);if(n=r,0<o){if(800<=++e)return arguments[0]}else e=0;return t.apply(re,arguments)}}(dn),Sn=function(t){t=Et(t,function(t){return 500===e.size&&e.clear(),t});var e=t.cache;return t}(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(ae,function(t,n,r,o){e.push(r?o.replace(le,"$1"):n||t)}),e}),kn=function(t){return function(e,n,r){var o=Object(e);if(!Mt(e)){var u=lt(n,3);e=Jt(e),n=function(t){return u(o[t],t,o)}}return n=t(e,n,r), 48-1<n?o[u?e[n]:n]:re}}(kt);Et.Cache=_;var zn=U(function(){return arguments}())?U:function(t){return Pt(t)&&Ue.call(t,"callee")&&!Ge.call(t,"callee")},xn=Array.isArray,En=Ye||ne,In=xe?f(xe):P,Fn=Ee?f(Ee):N,Mn=Ie?f(Ie):C,$n=ot(function(t,e,n){q(t,e,n)}),Dn=ot(function(t,e,n,r){q(t,e,n,r)}),Un=function(t){return On(mt(t,re,zt),t+"")}(function(t,e){var n={};if(null==t)return n;var o=false;e=r(e,function(e){return e=Q(e,t),o||(o=1<e.length),e}),et(t,ft(t),n),o&&(n=z(n,7,ut));for(var u=e.length;u--;)K(n,e[u]); 49return n});p.constant=Xt,p.flatten=zt,p.iteratee=Zt,p.keys=Jt,p.keysIn=Kt,p.memoize=Et,p.merge=$n,p.mergeWith=Dn,p.negate=It,p.omit=Un,p.property=te,p.reject=function(t,e){return(xn(t)?n:x)(t,It(lt(e,3)))},p.toPlainObject=Wt,p.values=Qt,p.cloneDeep=function(t){return z(t,5)},p.cloneDeepWith=function(t,e){return e=typeof e=="function"?e:re,z(t,5,e)},p.eq=Ft,p.find=kn,p.findIndex=kt,p.get=Gt,p.has=function(t,e){return null!=t&&pt(t,e,$)},p.hasIn=Ht,p.identity=Yt,p.includes=function(t,e,n,r){if(t=Mt(t)?t:Qt(t), 50n=n&&!r?Vt(n):0,r=t.length,0>n&&(n=tn(r+n,0)),Nt(t))t=n<=r&&-1<t.indexOf(e,n);else{if(r=!!r){if(e===e)t:{for(n-=1,r=t.length;++n<r;)if(t[n]===e){t=n;break t}t=-1}else t=c(t,i,n);r=-1<t}t=r}return t},p.isArguments=zn,p.isArray=xn,p.isArrayLike=Mt,p.isArrayLikeObject=$t,p.isBuffer=En,p.isEmpty=function(t){if(null==t)return true;if(Mt(t)&&(xn(t)||typeof t=="string"||typeof t.splice=="function"||En(t)||Mn(t)||zn(t)))return!t.length;var e=mn(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(At(t))return!V(t).length; 51for(var n in t)if(Ue.call(t,n))return false;return true},p.isEqual=function(t,e){return B(t,e)},p.isFunction=Dt,p.isLength=Ut,p.isMap=In,p.isNull=function(t){return null===t},p.isObject=Bt,p.isObjectLike=Pt,p.isPlainObject=Lt,p.isSet=Fn,p.isString=Nt,p.isSymbol=Ct,p.isTypedArray=Mn,p.last=xt,p.stubArray=ee,p.stubFalse=ne,p.toFinite=Tt,p.toInteger=Vt,p.toNumber=Rt,p.toString=qt,p.VERSION="4.17.5",Se&&((Se.exports=p)._=p,Oe._=p)}).call(this); 52}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 53 54},{}],2:[function(acdlreq,module,exports){ 55/* 56Copyright 2020 Adobe. All rights reserved. 57This file is licensed to you under the Apache License, Version 2.0 (the "License"); 58you may not use this file except in compliance with the License. You may obtain a copy 59of the License at http://www.apache.org/licenses/LICENSE-2.0 60 61Unless required by applicable law or agreed to in writing, software distributed under 62the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 63OF ANY KIND, either express or implied. See the License for the specific language 64governing permissions and limitations under the License. 65*/ 66const CONSTANTS = { 67 /** 68 * @typedef {String} ItemType 69 **/ 70 71 /** 72 * Enumeration of data layer item types. 73 * 74 * @enum {ItemType} 75 * @readonly 76 */ 77 itemType: { 78 /** Represents an item of type data */ 79 DATA: 'data', 80 /** Represents an item of type function */ 81 FCTN: 'fctn', 82 /** Represents an item of type event */ 83 EVENT: 'event', 84 /** Represents an item of type listener on */ 85 LISTENER_ON: 'listenerOn', 86 /** Represents an item of type listener off */ 87 LISTENER_OFF: 'listenerOff' 88 }, 89 90 /** 91 * @typedef {String} DataLayerEvent 92 **/ 93 94 /** 95 * Enumeration of data layer events. 96 * 97 * @enum {DataLayerEvent} 98 * @readonly 99 */ 100 dataLayerEvent: { 101 /** Represents an event triggered for any change in the data layer state */ 102 CHANGE: 'adobeDataLayer:change', 103 /** Represents an event triggered for any event push to the data layer */ 104 EVENT: 'adobeDataLayer:event' 105 }, 106 107 /** 108 * @typedef {String} ListenerScope 109 **/ 110 111 /** 112 * Enumeration of listener scopes. 113 * 114 * @enum {ListenerScope} 115 * @readonly 116 */ 117 listenerScope: { 118 /** Past events only */ 119 PAST: 'past', 120 /** Future events only */ 121 FUTURE: 'future', 122 /** All events, past and future */ 123 ALL: 'all' 124 } 125}; 126 127module.exports = CONSTANTS; 128 129},{}],3:[function(acdlreq,module,exports){ 130/* 131Copyright 2020 Adobe. All rights reserved. 132This file is licensed to you under the Apache License, Version 2.0 (the "License"); 133you may not use this file except in compliance with the License. You may obtain a copy 134of the License at http://www.apache.org/licenses/LICENSE-2.0 135 136Unless required by applicable law or agreed to in writing, softw
136are distributed under 137the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 138OF ANY KIND, either express or implied. See the License for the specific language 139governing permissions and limitations under the License. 140*/ 141 142const _ = acdlreq('../custom-lodash'); 143const version = acdlreq('../version.json').version; 144const cloneDeep = _.cloneDeep; 145const get = _.get; 146 147const Item = acdlreq('./item'); 148const Listener = acdlreq('./listener'); 149const ListenerManager = acdlreq('./listenerManager'); 150const CONSTANTS = acdlreq('./constants'); 151const customMerge = acdlreq('./utils/customMerge'); 152 153/** 154 * Manager 155 * 156 * @class Manager 157 * @classdesc Data Layer manager that augments the passed data layer array and handles eventing. 158 * @param {Object} config The Data Layer manager configuration. 159 */ 160module.exports = function(config) { 161 const _config = config || {}; 162 let _dataLayer = []; 163 let _preLoadedItems = []; 164 let _state = {}; 165 let _listenerManager; 166 167 const DataLayerManager = { 168 getState: function() { 169 return _state; 170 }, 171 getDataLayer: function() { 172 return _dataLayer; 173 } 174 }; 175 176 _initialize(); 177 _augment(); 178 _processItems(); 179 180 /** 181 * Initializes the data layer. 182 * 183 * @private 184 */ 185 function _initialize() { 186 if (!Array.isArray(_config.dataLayer)) { 187 _config.dataLayer = []; 188 } 189 190 // Remove preloaded items from the data layer array and add those to the array of preloaded items 191 _preLoadedItems = _config.dataLayer.splice(0, _config.dataLayer.length); 192 _dataLayer = _config.dataLayer; 193 _dataLayer.version = version; 194 _state = {}; 195 _listenerManager = ListenerManager(DataLayerManager); 196 }; 197 198 /** 199 * Updates the state with the item. 200 * 201 * @param {Item} item The item. 202 * @private 203 */ 204 function _updateState(item) { 205 _state = customMerge(_state, item.data); 206 }; 207 208 /** 209 * Augments the data layer Array Object, overriding: push() and adding getState(), addEventListener and removeEventListener. 210 * 211 * @private 212 */ 213 function _augment() { 214 /** 215 * Pushes one or more items to the data layer. 216 * 217 * @param {...ItemConfig} var_args The items to add to the data layer. 218 * @returns {Number} The length of the data layer following push. 219 */ 220 _dataLayer.push = function(var_args) { /* eslint-disable-line camelcase */ 221 const pushArguments = arguments; 222 const filteredArguments = arguments; 223 224 Object.keys(pushArguments).forEach(function(key) { 225 const itemConfig = pushArguments[key]; 226 const item = Item(itemConfig); 227 228 if (!item.valid) { 229 _logInvalidItemError(item); 230 delete filteredArguments[key]; 231 } 232 switch (item.type) { 233 case CONSTANTS.itemType.DATA: 234 case CONSTANTS.itemType.EVENT: { 235 _processItem(item); 236 break; 237 } 238 case CONSTANTS.itemType.FCTN: { 239 delete filteredArguments[key]; 240 _processItem(item); 241 break; 242 } 243 case CONSTANTS.itemType.LISTENER_ON: 244 case CONSTANTS.itemType.LISTENER_OFF: { 245 delete filteredArguments[key]; 246 } 247 } 248 }); 249 250 if (filteredArguments[0]) { 251 return Array.prototype.push.apply(this, filteredArguments); 252 } 253 }; 254 255 /** 256 * Returns a deep copy of the data layer state or of the object defined by the path. 257 * 258 * @param {Array|String} path The path of the property to get. 259 * @returns {*} Returns a deep copy of the resolved value if a path is passed, a deep copy of the data layer state otherwise. 260 */ 261 _dataLayer.getState = function(path) { 262 if (path) { 263 return get(cloneDeep(_state), path); 264 } 265 return cloneDeep(_state); 266 }; 267 268 /** 269 * Event listener callback. 270 * 271 * @callback eventListenerCallback A function that is called when the event of the specified type occurs. 272 * @this {DataLayer} 273 * @param {Object} event The event object pushed to the data layer that triggered the callback. 274 */ 275 276 /** 277 * Sets up a function that will be called whenever the specified event is triggered. 278 * 279 * @param {String} type A case-sensitive string representing the event type to listen for. 280 * @param {eventListenerCallback} callback A function that is called when the event of the specified type occurs. 281 * @param {Object} [options] Optional characteristics of the event listener. 282 * @param {String} [options.path] The path in the state object to filter the listening to. 283 * @param {('past'|'future'|'all')} [options.scope] The timing to filter the listening to: 284 * - {String} past The listener is triggered for past events only. 285 * - {String} future The listener is triggered for future events only. 286 * - {String} all The listener is triggered for both past and future events (default value). 287 */ 288 _dataLayer.addEventListener = function(type, callback, options) { 289 const eventListenerItem = Item({ 290 on: type, 291 handler: callback, 292 scope: options && options.scope, 293 path: options && options.path 294 }); 295 296 _processItem(eventListenerItem); 297 }; 298 299 /** 300 * Removes an event listener previously registered with addEventListener(). 301 * 302 * @param {String} type A case-sensitive string representing the event type to listen for. 303 * @param {Function} [listener] Optional function that is to be removed. 304 */ 305 _dataLayer.removeEventListener = function(type, listener) { 306 const eventListenerItem = Item({ 307 off: type, 308 handler: listener 309 }); 310 311 _processItem(eventListenerItem); 312 }; 313 }; 314 315 /** 316 * Processes all items that already exist on the stack. 317 * 318 * @private 319 */ 320 function _processItems() { 321 for (let i = 0; i < _preLoadedItems.length; i++) { 322 _dataLayer.push(_preLoadedItems[i]); 323 } 324 }; 325 326 /** 327 * Processes an item pushed to the stack. 328 * 329 * @param {Item} item The item to process. 330 * @private 331 */ 332 function _processItem(item) { 333 if (!item.valid) { 334 _logInvalidItemError(item); 335 return; 336 } 337 338 /** 339 * Returns all items before the provided one. 340 * 341 * @param {Item} item The item. 342 * @returns {Array<Item>} The items before. 343 * @private 344 */ 345 function _getBefore(item) { 346 if (!(_dataLayer.length === 0 || item.index > _dataLayer.length - 1)) { 347 return _dataLayer.slice(0, item.index).map(itemConfig => Item(itemConfig)); 348 } 349 return []; 350 } 351 352 const typeProcessors = { 353 data: function(item) { 354 _updateState(item); 355 _listenerManager.triggerListeners(item); 356 }, 357 fctn: function(item) { 358 item.config.call(_dataLayer, _dataLayer); 359 }, 360 event: function(item) { 361 if (item.data) { 362 _updateState(item); 363 } 364 _listenerManager.triggerListeners(item); 365 }, 366 listenerOn: function(item) { 367 const listener = Listener(item); 368 switch (listener.scope) { 369 case CONSTANTS.listenerScope.PAST: { 370 for (const registeredItem of _getBefore(item)) { 371 _listenerManager.triggerListener(listener, registeredItem); 372 } 373 break; 374 } 375 case CONSTANTS.listenerScope.FUTURE: { 376 _listenerManager.register(listener); 377 break; 378 } 379 case CONSTANTS.listenerScope.ALL: { 380 const registered = _listenerManager.register(listener); 381 if (registered) { 382 for (const registeredItem of _getBefore(item)) { 383 _listenerManager.triggerListener(listener, registeredItem); 384 } 385 } 386 } 387 } 388 }, 389 listenerOff: function(item) { 390 _listenerManager.unregister(Listener(item)); 391 } 392 }; 393 394 typeProcessors[item.type](item); 395 }; 396 397 /** 398 * Logs error for invalid item pushed to the data layer. 399 * 400 * @param {Item} item The invalid item. 401 * @private 402 */ 403 function _logInvalidItemError(item) { 404 const message = 'The following item cannot be handled by the data layer ' + 405 'because it does not have a valid format: ' + 406 JSON.stringify(item.config); 407 console.error(message); 408 }; 409 410 return DataLayerManager; 411}; 412 413},{"../custom-lodash":1,"../version.json":14,"./constants":2,"./item":5,"./listener":7,"./listenerManager":8,"./utils/customMerge":10}],4:[function(acdlreq,module,exports){ 414/* 415Copyright 2020 Adobe. All rights reserved. 416This file is licensed to you under the Apache License, Version 2.0 (the "License"); 417you may not use this file except in compliance with the License. You may obtain a copy 418of the License at http://www.apache.org/licenses/LICENSE-2.0 419 420Unless required by applicable law or agreed to in writing, softw
420are distributed under 421the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 422OF ANY KIND, either express or implied. See the License for the specific language 423governing permissions and limitations under the License. 424*/ 425 426const DataLayerManager = acdlreq('./dataLayerManager'); 427 428/** 429 * Data Layer. 430 * 431 * @type {Object} 432 */ 433const DataLayer = { 434 Manager: DataLayerManager 435}; 436 437window.adobeDataLayer = window.adobeDataLayer || []; 438 439// If data layer has already been initialized, do not re-initialize. 440if (window.adobeDataLayer.version) { 441 console.warn( 442 `Adobe Client Data Layer v${window.adobeDataLayer.version} has already been imported/initialized on this page. You may be erroneously loading it a second time.` 443 ); 444} else { 445 DataLayer.Manager({ 446 dataLayer: window.adobeDataLayer 447 }); 448} 449 450/** 451 * @typedef {Object} ListenerOnConfig 452 * @property {String} on Name of the event to bind to. 453 * @property {String} [path] Object key in the state to bind to. 454 * @property {ListenerScope} [scope] Scope of the listener. 455 * @property {Function} handler Handler to execute when the bound event is triggered. 456 */ 457 458/** 459 * @typedef {Object} ListenerOffConfig 460 * @property {String} off Name of the event to unbind. 461 * @property {String} [path] Object key in the state to bind to. 462 * @property {ListenerScope} [scope] Scope of the listener. 463 * @property {Function} [handler] Handler for a previously attached event to unbind. 464 */ 465 466/** 467 * @typedef {Object} DataConfig 468 * @property {Object} data Data to be updated in the state. 469 */ 470 471/** 472 * @typedef {Object} EventConfig 473 * @property {String} event Name of the event. 474 * @property {Object} [eventInfo] Additional information to pass to the event handler. 475 * @property {DataConfig.data} [data] Data to be updated in the state. 476 */ 477 478/** 479 * @typedef {DataConfig | EventConfig | ListenerOnConfig | ListenerOffConfig} ItemConfig 480 */ 481 482/** 483 * Triggered when there is change in the data layer state. 484 * 485 * @event DataLayerEvent.CHANGE 486 * @type {Object} 487 * @property {Object} data Data pushed that caused a change in the data layer state. 488 */ 489 490/** 491 * Triggered when an event is pushed to the data layer. 492 * 493 * @event DataLayerEvent.EVENT 494 * @type {Object} 495 * @property {String} name Name of the committed event. 496 * @property {Object} eventInfo Additional information passed with the committed event. 497 * @property {Object} data Data that was pushed alongside the event. 498 */ 499 500/** 501 * Triggered when an arbitrary event is pushed to the data layer. 502 * 503 * @event <custom> 504 * @type {Object} 505 * @property {String} name Name of the committed event. 506 * @property {Object} eventInfo Additional information passed with the committed event. 507 * @property {Object} data Data that was pushed alongside the event. 508 */ 509 510module.exports = DataLayer; 511 512},{"./dataLayerManager":3}],5:[function(acdlreq,module,exports){ 513/* 514Copyright 2020 Adobe. All rights reserved. 515This file is licensed to you under the Apache License, Version 2.0 (the "License"); 516you may not use this file except in compliance with the License. You may obtain a copy 517of the License at http://www.apache.org/licenses/LICENSE-2.0 518 519Unless required by applicable law or agreed to in writing, software distributed under 520the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 521OF ANY KIND, either express or implied. See the License for the specific language 522governing permissions and limitations under the License. 523*/ 524 525const _ = acdlreq('../custom-lodash'); 526const isPlainObject = _.isPlainObject; 527const isEmpty = _.isEmpty; 528const omit = _.omit; 529const find = _.find; 530 531const dataMatchesContraints = acdlreq('./utils/dataMatchesContraints'); 532const ITEM_CONSTRAINTS = acdlreq('./itemConstraints'); 533const CONSTANTS = acdlreq('./constants'); 534 535/** 536 * Constructs a data layer item. 537 * 538 * @param {ItemConfig} itemConfig The data layer item configuration. 539 * @param {Number} index The item index in the array of existing items. 540 */ 541 542module.exports = function(itemConfig, index) { 543 const _config = itemConfig; 544 const _index = index; 545 const _type = getType(); 546 const _data = getData(); 547 const _valid = !!_type; 548 549 function getType() { 550 return find(Object.keys(ITEM_CONSTRAINTS), key => dataMatchesContraints(_config, ITEM_CONSTRAINTS[key])) || 551 (typeof _config === 'function' && CONSTANTS.itemType.FCTN) || 552 (isPlainObject(_config) && CONSTANTS.itemType.DATA); 553 } 554 555 function getData() { 556 const data = omit(_config, Object.keys(ITEM_CONSTRAINTS.event)); 557 if (!isEmpty(data)) { 558 return data; 559 } 560 } 561 562 return { 563 /** 564 * Returns the item configuration. 565 * 566 * @returns {ItemConfig} The item configuration. 567 */ 568 config: _config, 569 570 /** 571 * Returns the item type. 572 * 573 * @returns {itemType} The item type. 574 */ 575 type: _type, 576 577 /** 578 * Returns the item data. 579 * 580 * @returns {DataConfig} The item data. 581 */ 582 data: _data, 583 584 /** 585 * Indicates whether the item is valid. 586 * 587 * @returns {Boolean} true if the item is valid, false otherwise. 588 */ 589 valid: _valid, 590 591 /** 592 * Returns the index of the item in the array of existing items (added with the standard Array.prototype.push()) 593 * 594 * @returns {Number} The index of the item in the array of existing items if it exists, -1 otherwise. 595 */ 596 index: _index 597 }; 598}; 599 600},{"../custom-lodash":1,"./constants":2,"./itemConstraints":6,"./utils/dataMatchesContraints":11}],6:[function(acdlreq,module,exports){ 601/* 602Copyright 2020 Adobe. All rights reserved. 603This file is licensed to you under the Apache License, Version 2.0 (the "License"); 604you may not use this file except in compliance with the License. You may obtain a copy 605of the License at http://www.apache.org/licenses/LICENSE-2.0 606 607Unless required by applicable law or agreed to in writing, softw
607are distributed under 608the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 609OF ANY KIND, either express or implied. See the License for the specific language 610governing permissions and limitations under the License. 611*/ 612 613/** 614 * Constraints for each type of the item configuration. 615 */ 616 617const itemConstraints = { 618 event: { 619 event: { 620 type: 'string' 621 }, 622 eventInfo: { 623 optional: true 624 } 625 }, 626 listenerOn: { 627 on: { 628 type: 'string' 629 }, 630 handler: { 631 type: 'function' 632 }, 633 scope: { 634 type: 'string', 635 values: ['past', 'future', 'all'], 636 optional: true 637 }, 638 path: { 639 type: 'string', 640 optional: true 641 } 642 }, 643 listenerOff: { 644 off: { 645 type: 'string' 646 }, 647 handler: { 648 type: 'function', 649 optional: true 650 }, 651 scope: { 652 type: 'string', 653 values: ['past', 'future', 'all'], 654 optional: true 655 }, 656 path: { 657 type: 'string', 658 optional: true 659 } 660 } 661}; 662 663module.exports = itemConstraints; 664 665},{}],7:[function(acdlreq,module,exports){ 666/* 667Copyright 2020 Adobe. All rights reserved. 668This file is licensed to you under the Apache License, Version 2.0 (the "License"); 669you may not use this file except in compliance with the License. You may obtain a copy 670of the License at http://www.apache.org/licenses/LICENSE-2.0 671 672Unless required by applicable law or agreed to in writing, software distributed under 673the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 674OF ANY KIND, either express or implied. See the License for the specific language 675governing permissions and limitations under the License. 676*/ 677 678const CONSTANTS = acdlreq('./constants'); 679 680/** 681 * Constructs a data layer listener. 682 * 683 * @param {Item} item The item from which to construct the listener. 684 */ 685 686module.exports = function(item) { 687 const _event = item.config.on || item.config.off; 688 const _handler = item.config.handler || null; 689 const _scope = item.config.scope || (item.config.on && CONSTANTS.listenerScope.ALL) || null; 690 const _path = item.config.path || null; 691 692 return { 693 /** 694 * Returns the listener event name. 695 * 696 * @returns {String} The listener event name. 697 */ 698 event: _event, 699 700 /** 701 * Returns the listener handler. 702 * 703 * @returns {(Function|null)} The listener handler. 704 */ 705 handler: _handler, 706 707 /** 708 * Returns the listener scope. 709 * 710 * @returns {(String|null)} The listener scope. 711 */ 712 scope: _scope, 713 714 /** 715 * Returns the listener path. 716 * 717 * @returns {(String|null)} The listener path. 718 */ 719 path: _path 720 }; 721}; 722 723},{"./constants":2}],8:[function(acdlreq,module,exports){ 724/* 725Copyright 2020 Adobe. All rights reserved. 726This file is licensed to you under the Apache License, Version 2.0 (the "License"); 727you may not use this file except in compliance with the License. You may obtain a copy 728of the License at http://www.apache.org/licenses/LICENSE-2.0 729 730Unless required by applicable law or agreed to in writing, software distributed under 731the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 732OF ANY KIND, either express or implied. See the License for the specific language 733governing permissions and limitations under the License. 734*/ 735 736const _ = acdlreq('../custom-lodash'); 737const cloneDeep = _.cloneDeep; 738 739const constants = acdlreq('./constants'); 740const listenerMatch = acdlreq('./utils/listenerMatch'); 741const indexOfListener = acdlreq('./utils/indexOfListener'); 742 743/** 744 * Creates a listener manager. 745 * 746 * @param {Manager} dataLayerManager The data layer manager. 747 * @returns {ListenerManager} A listener manager. 748 */ 749module.exports = function(dataLayerManager) { 750 const _listeners = {}; 751 const _dataLayerManager = dataLayerManager; 752 753 /** 754 * Find index of listener in listeners object. 755 */ 756 const _indexOfListener = indexOfListener.bind(null, _listeners); 757 758 const ListenerManager = { 759 /** 760 * Registers a listener. 761 * 762 * @function 763 * @param {Listener} listener The listener to register. 764 * @returns {Boolean} true if the listener was registered, false otherwise. 765 */ 766 register: function(listener) { 767 const event = listener.event; 768 769 if (Object.prototype.hasOwnProperty.call(_listeners, event)) { 770 if (_indexOfListener(listener) === -1) { 771 _listeners[listener.event].push(listener); 772 return true; 773 } 774 } else { 775 _listeners[listener.event] = [listener]; 776 return true; 777 } 778 return false;
779 }, 780 /** 781 * Unregisters a listener. 782 * 783 * @function 784 * @param {Listener} listener The listener to unregister. 785 */ 786 unregister: function(listener) { 787 const event = listener.event; 788 789 if (Object.prototype.hasOwnProperty.call(_listeners, event)) { 790 if (!(listener.handler || listener.scope || listener.path)) { 791 _listeners[event] = []; 792 } else { 793 const index = _indexOfListener(listener); 794 if (index > -1) { 795 _listeners[event].splice(index, 1); 796 } 797 } 798 } 799 }, 800 /** 801 * Triggers listeners related to the passed item. 802 * 803 * @function 804 * @param {Item} item Item to trigger listener for. 805 */ 806 triggerListeners: function(item) { 807 const triggeredEvents = _getTriggeredEvents(item); 808 triggeredEvents.forEach(function(event) { 809 if (Object.prototype.hasOwnProperty.call(_listeners, event)) { 810 for (const listener of _listeners[event]) { 811 _callHandler(listener, item); 812 } 813 } 814 }); 815 }, 816 /** 817 * Triggers a single listener on the passed item. 818 * 819 * @function 820 * @param {Listener} listener Listener to call. 821 * @param {Item} item Item to call the listener with. 822 */ 823 triggerListener: function(listener, item) { 824 _callHandler(listener, item); 825 } 826 }; 827 828 /** 829 * Calls the listener handler on the item if a match is found. 830 * 831 * @param {Listener} listener The listener. 832 * @param {Item} item The item. 833 * @private 834 */ 835 function _callHandler(listener, item) { 836 if (listenerMatch(listener, item)) { 837 const callbackArgs = [cloneDeep(item.config)]; 838 listener.handler.apply(_dataLayerManager.getDataLayer(), callbackArgs); 839 } 840 } 841 842 /** 843 * Returns the names of the events that are triggered for this item. 844 * 845 * @param {Item} item The item. 846 * @returns {Array<String>} The names of the events that are triggered for this item. 847 * @private 848 */ 849 function _getTriggeredEvents(item) { 850 const triggeredEvents = []; 851 852 switch (item.type) { 853 case constants.itemType.DATA: { 854 triggeredEvents.push(constants.dataLayerEvent.CHANGE); 855 break; 856 } 857 case constants.itemType.EVENT: { 858 triggeredEvents.push(constants.dataLayerEvent.EVENT); 859 if (item.data) triggeredEvents.push(constants.dataLayerEvent.CHANGE); 860 if (item.config.event !== constants.dataLayerEvent.CHANGE) { 861 triggeredEvents.push(item.config.event); 862 } 863 break; 864 } 865 } 866 return triggeredEvents; 867 } 868 869 return ListenerManager; 870}; 871 872},{"../custom-lodash":1,"./constants":2,"./utils/indexOfListener":12,"./utils/listenerMatch":13}],9:[function(acdlreq,module,exports){ 873/* 874Copyright 2020 Adobe. All rights reserved. 875This file is licensed to you under the Apache License, Version 2.0 (the "License"); 876you may not use this file except in compliance with the License. You may obtain a copy 877of the License at http://www.apache.org/licenses/LICENSE-2.0 878 879Unless required by applicable law or agreed to in writing, software distributed under 880the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 881OF ANY KIND, either express or implied. See the License for the specific language 882governing permissions and limitations under the License. 883*/ 884 885const _ = acdlreq('../../custom-lodash'); 886const has = _.has; 887const get = _.get; 888 889/** 890 * Checks if the object contains an ancestor that is set to null or undefined. 891 * 892 * @param {Object} object The object to check. 893 * @param {String} path The path to check. 894 * @returns {Boolean} true if the object contains an ancestor that is set to null or undefined, false otherwise. 895 * @private 896 */ 897module.exports = function(object, path) { 898 let ancestorPath = path.substring(0, path.lastIndexOf('.')); 899 while (ancestorPath) { 900 if (has(object, ancestorPath)) { 901 const ancestorValue = get(object, ancestorPath); 902 if (ancestorValue === null || ancestorValue === undefined) { 903 return true; 904 } 905 } 906 ancestorPath = ancestorPath.substring(0, ancestorPath.lastIndexOf('.')); 907 } 908 909 return false;
910}; 911 912},{"../../custom-lodash":1}],10:[function(acdlreq,module,exports){ 913/* 914Copyright 2020 Adobe. All rights reserved. 915This file is licensed to you under the Apache License, Version 2.0 (the "License"); 916you may not use this file except in compliance with the License. You may obtain a copy 917of the License at http://www.apache.org/licenses/LICENSE-2.0 918 919Unless required by applicable law or agreed to in writing, software distributed under 920the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 921OF ANY KIND, either express or implied. See the License for the specific language 922governing permissions and limitations under the License. 923*/ 924 925const _ = acdlreq('../../custom-lodash'); 926const cloneDeepWith = _.cloneDeepWith; 927const isObject = _.isObject; 928const isArray = _.isArray; 929const reject = _.reject; 930const mergeWith = _.mergeWith; 931const isNull = _.isNull; 932 933/** 934 * Merges the source into the object and sets objects as 'undefined' if they are 'undefined' in the source object. 935 * 936 * @param {Object} object The object into which to merge. 937 * @param {Object} source The source to merge with. 938 * @returns {Object} The object into which source was merged in. 939 */ 940module.exports = function(object, source) { 941 const makeOmittingCloneDeepCustomizer = function(predicate) { 942 return function omittingCloneDeepCustomizer(value, key, object, stack) { 943 if (isObject(value)) { 944 if (isArray(value)) { 945 return reject(value, predicate).map(item => cloneDeepWith(item, omittingCloneDeepCustomizer)); 946 } 947 948 const clone = {}; 949 for (const subKey of Object.keys(value)) { 950 if (!predicate(value[subKey])) { 951 clone[subKey] = cloneDeepWith(value[subKey], omittingCloneDeepCustomizer); 952 } 953 } 954 return clone; 955 } 956 return undefined; 957 }; 958 }; 959 960 const customizer = function(objValue, srcValue, key, object) { 961 if (typeof srcValue === 'undefined' || srcValue === null) { 962 return null; 963 } 964 }; 965 966 const omitDeep = function(value, predicate = (val) => !val) { 967 return cloneDeepWith(value, makeOmittingCloneDeepCustomizer(predicate)); 968 }; 969 970 mergeWith(object, source, customizer); 971 972 // Remove null or undefined objects 973 object = omitDeep(object, isNull); 974 975 return object; 976}; 977 978},{"../../custom-lodash":1}],11:[function(acdlreq,module,exports){ 979/* 980Copyright 2020 Adobe. All rights reserved. 981This file is licensed to you under the Apache License, Version 2.0 (the "License"); 982you may not use this file except in compliance with the License. You may obtain a copy 983of the License at http://www.apache.org/licenses/LICENSE-2.0 984 985Unless required by applicable law or agreed to in writing, software distributed under 986the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 987OF ANY KIND, either express or implied. See the License for the specific language 988governing permissions and limitations under the License. 989*/ 990 991const _ = acdlreq('../../custom-lodash'); 992const find = _.find; 993const includes = _.includes; 994 995module.exports = function(data, constraints) { 996 // Go through all constraints and find one which does not match the data 997 const foundObjection = find(Object.keys(constraints), key => { 998 const type = constraints[key].type; 999 const supportedValues = key && constraints[key].values; 1000 const mandatory = !constraints[key].optional; 1001 const value = data[key]; 1002 const valueType = typeof value; 1003 const incorrectType = type && valueType !== type; 1004 const noMatchForSupportedValues = supportedValues && !includes(supportedValues, value); 1005 if (mandatory) { 1006 return !value || incorrectType || noMatchForSupportedValues; 1007 } else { 1008 return value && (incorrectType || noMatchForSupportedValues); 1009 } 1010 }); 1011 // If no objections found then data matches contraints 1012 return typeof foundObjection === 'undefined'; 1013}; 1014 1015},{"../../custom-lodash":1}],12:[function(acdlreq,module,exports){ 1016/* 1017Copyright 2020 Adobe. All rights reserved. 1018This file is licensed to you under the Apache License, Version 2.0 (the "License"); 1019you may not use this file except in compliance with the License. You may obtain a copy 1020of the License at http://www.apache.org/licenses/LICENSE-2.0 1021 1022Unless required by applicable law or agreed to in writing, softw
1022are distributed under 1023the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 1024OF ANY KIND, either express or implied. See the License for the specific language 1025governing permissions and limitations under the License. 1026*/ 1027 1028const _ = acdlreq('../../custom-lodash'); 1029const isEqual = _.isEqual; 1030 1031module.exports = function(listeners, listener) { 1032 const event = listener.event; 1033 1034 if (Object.prototype.hasOwnProperty.call(listeners, event)) { 1035 for (const [index, registeredListener] of listeners[event].entries()) { 1036 if (isEqual(registeredListener.handler, listener.handler)) { 1037 return index; 1038 } 1039 } 1040 } 1041 return -1; 1042}; 1043 1044},{"../../custom-lodash":1}],13:[function(acdlreq,module,exports){ 1045/* 1046Copyright 2020 Adobe. All rights reserved. 1047This file is licensed to you under the Apache License, Version 2.0 (the "License"); 1048you may not use this file except in compliance with the License. You may obtain a copy 1049of the License at http://www.apache.org/licenses/LICENSE-2.0 1050 1051Unless required by applicable law or agreed to in writing, software distributed under 1052the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 1053OF ANY KIND, either express or implied. See the License for the specific language 1054governing permissions and limitations under the License. 1055*/ 1056 1057const _ = acdlreq('../../custom-lodash'); 1058const has = _.has; 1059 1060const CONSTANTS = acdlreq('../constants'); 1061const ancestorRemoved = acdlreq('./ancestorRemoved'); 1062 1063/** 1064 * Checks if the listener matches the item. 1065 * 1066 * @param {Listener} listener The listener. 1067 * @param {Item} item The item. 1068 * @returns {Boolean} true if listener matches the item, false otherwise. 1069 */ 1070function listenerMatch(listener, item) { 1071 const event = listener.event; 1072 const itemConfig = item.config; 1073 let matches = false; 1074 1075 if (item.type === CONSTANTS.itemType.DATA) { 1076 if (event === CONSTANTS.dataLayerEvent.CHANGE) { 1077 matches = selectorMatches(listener, item); 1078 } 1079 } else if (item.type === CONSTANTS.itemType.EVENT) { 1080 if (event === CONSTANTS.dataLayerEvent.EVENT || event === itemConfig.event) { 1081 matches = selectorMatches(listener, item); 1082 } 1083 if (item.data && event === CONSTANTS.dataLayerEvent.CHANGE) { 1084 matches = selectorMatches(listener, item); 1085 } 1086 } 1087 1088 return matches; 1089} 1090 1091/** 1092 * Checks if a listener has a selector that points to an object in the data payload of an item. 1093 * 1094 * @param {Listener} listener The listener to extract the selector from. 1095 * @param {Item} item The item. 1096 * @returns {Boolean} true if a selector is not provided or if the given selector is matching, false otherwise. 1097 * @private 1098 */ 1099function selectorMatches(listener, item) { 1100 if (item.data && listener.path) { 1101 return has(item.data, listener.path) || ancestorRemoved(item.data, listener.path); 1102 } 1103 1104 return true; 1105} 1106 1107module.exports = listenerMatch; 1108 1109},{"../../custom-lodash":1,"../constants":2,"./ancestorRemoved":9}],14:[function(acdlreq,module,exports){ 1110module.exports={ 1111 "version": "2.0.2" 1112} 1113 1114},{}]},{},[4]) 1115//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjdXN0b20tbG9kYXNoLmpzIiwic3JjL2NvbnN0YW50cy5qcyIsInNyYy9kYXRhTGF5ZXJNYW5hZ2VyLmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2l0ZW0uanMiLCJzcmMvaXRlbUNvbnN0cmFpbnRzLmpzIiwic3JjL2xpc3RlbmVyLmpzIiwic3JjL2xpc3RlbmVyTWFuYWdlci5qcyIsInNyYy91dGlscy9hbmNlc3RvclJlbW92ZWQuanMiLCJzcmMvdXRpbHMvY3VzdG9tTWVyZ2UuanMiLCJzcmMvdXRpbHMvZGF0YU1hdGNoZXNDb250cmFpbnRzLmpzIiwic3JjL3V0aWxzL2luZGV4T2ZMaXN0ZW5lci5qcyIsInNyYy91dGlscy9saXN0ZW5lck1hdGNoLmpzIiwidmVyc2lvbi5qc29uIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybi
1115B1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCAoQ3VzdG9tIEJ1aWxkKSBsb2Rhc2guY29tL2xpY2Vuc2UgfCBVbmRlcnNjb3JlLmpzIDEuOC4zIHVuZGVyc2NvcmVqcy5vcmcvTElDRU5TRVxuICogQnVpbGQ6IGBsb2Rhc2ggZXhwb3J0cz1cIm5vZGVcIiBpbmNsdWRlPVwiY2xvbmVEZWVwLGNsb25lRGVlcFdpdGgsZmluZCxnZXQsaGFzLGluY2x1ZGVzLGlzRW1wdHksaXNFcXVhbCxpc051bGwsaXNQbGFpbk9iamVjdCxpc09iamVjdCxtZXJnZSxtZXJnZVdpdGgsb21pdCxyZWplY3RcIiAtcCAtbyBjdXN0b20tbG9kYXNoLmpzYFxuICovXG47KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHImJmZhbHNlIT09ZSh0W25dLG4sdCk7KTt9ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPTAsdT1bXTsrK248cjspe3ZhciBjPXRbbl07ZShjLG4sdCkmJih1W28rK109Yyl9cmV0dXJuIHV9ZnVuY3Rpb24gcih0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPUFycmF5KHIpOysrbjxyOylvW25dPWUodFtuXSxuLHQpO3JldHVybiBvfWZ1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxvPXQubGVuZ3RoOysrbjxyOyl0W28rbl09ZVtuXTtcbnJldHVybiB0fWZ1bmN0aW9uIHUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX1mdW5jdGlvbiBjKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDtmb3Iobis9LTE7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQhPT10fWZ1bmN0aW9uIGEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3JlOmVbdF19fWZ1bmN0aW9uIGYodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHIoZSxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pfWZ1bmN0aW9uIHModCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCxyKXtuWysrZV09W3IsdF19KSxufWZ1bmN0aW9uIGIodCl7dmFyIGU9T2JqZWN0O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKTtcbn19ZnVuY3Rpb24gaCh0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtuWysrZV09dH0pLG59ZnVuY3Rpb24gcCgpe31mdW5jdGlvbiB5KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIGoodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gXyh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBnKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBfOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1mdW5jdGlvbiB2KHQpe1xudGhpcy5zaXplPSh0aGlzLl9fZGF0YV9fPW5ldyBqKHQpKS5zaXplfWZ1bmN0aW9uIGQodCxlKXt2YXIgbj14bih0KSxyPSFuJiZ6bih0KSxvPSFuJiYhciYmRW4odCksdT0hbiYmIXImJiFvJiZNbih0KTtpZihuPW58fHJ8fG98fHUpe2Zvcih2YXIgcj10Lmxlbmd0aCxjPVN0cmluZyxpPS0xLGE9QXJyYXkocik7KytpPHI7KWFbaV09YyhpKTtyPWF9ZWxzZSByPVtdO3ZhciBmLGM9ci5sZW5ndGg7Zm9yKGYgaW4gdCkhZSYmIVVlLmNhbGwodCxmKXx8biYmKFwibGVuZ3RoXCI9PWZ8fG8mJihcIm9mZnNldFwiPT1mfHxcInBhcmVudFwiPT1mKXx8dSYmKFwiYnVmZmVyXCI9PWZ8fFwiYnl0ZUxlbmd0aFwiPT1mfHxcImJ5dGVPZmZzZXRcIj09Zil8fHZ0KGYsYykpfHxyLnB1c2goZik7cmV0dXJuIHJ9ZnVuY3Rpb24gQSh0LGUsbil7KG49PT1yZXx8RnQodFtlXSxuKSkmJihuIT09cmV8fGUgaW4gdCl8fGsodCxlLG4pfWZ1bmN0aW9uIHcodCxlLG4pe3ZhciByPXRbZV07VWUuY2FsbCh0LGUpJiZGdChyLG4pJiYobiE9PXJlfHxlIGluIHQpfHxrKHQsZSxuKTtcbn1mdW5jdGlvbiBtKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYoRnQodFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBPKHQsZSl7cmV0dXJuIHQmJmV0KGUsSnQoZSksdCl9ZnVuY3Rpb24gUyh0LGUpe3JldHVybiB0JiZldChlLEt0KGUpLHQpfWZ1bmN0aW9uIGsodCxlLG4pe1wiX19wcm90b19fXCI9PWUmJlFlP1FlKHQsZSx7Y29uZmlndXJhYmxlOnRydWUsZW51bWVyYWJsZTp0cnVlLHZhbHVlOm4sd3JpdGFibGU6dHJ1ZX0pOnRbZV09bn1mdW5jdGlvbiB6KHQsbixyLG8sdSxjKXt2YXIgaSxhPTEmbixmPTImbixsPTQmbjtpZihyJiYoaT11P3IodCxvLHUsYyk6cih0KSksaSE9PXJlKXJldHVybi
1115BpO2lmKCFCdCh0KSlyZXR1cm4gdDtpZihvPXhuKHQpKXtpZihpPXl0KHQpLCFhKXJldHVybiB0dCh0LGkpfWVsc2V7dmFyIHM9bW4odCksYj1cIltvYmplY3QgRnVuY3Rpb25dXCI9PXN8fFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIj09cztpZihFbih0KSlyZXR1cm4gWCh0LGEpO1xuaWYoXCJbb2JqZWN0IE9iamVjdF1cIj09c3x8XCJbb2JqZWN0IEFyZ3VtZW50c11cIj09c3x8YiYmIXUpe2lmKGk9Znx8Yj97fTpqdCh0KSwhYSlyZXR1cm4gZj9ydCh0LFMoaSx0KSk6bnQodCxPKGksdCkpfWVsc2V7aWYoIWdlW3NdKXJldHVybiB1P3Q6e307aT1fdCh0LHMsYSl9fWlmKGN8fChjPW5ldyB2KSx1PWMuZ2V0KHQpKXJldHVybiB1O2lmKGMuc2V0KHQsaSksRm4odCkpcmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihlKXtpLmFkZCh6KGUsbixyLGUsdCxjKSl9KSxpO2lmKEluKHQpKXJldHVybiB0LmZvckVhY2goZnVuY3Rpb24oZSxvKXtpLnNldChvLHooZSxuLHIsbyx0LGMpKX0pLGk7dmFyIGY9bD9mP2Z0OmF0OmY/S3Q6SnQsaD1vP3JlOmYodCk7cmV0dXJuIGUoaHx8dCxmdW5jdGlvbihlLG8pe2gmJihvPWUsZT10W29dKSx3KGksbyx6KGUsbixyLG8sdCxjKSl9KSxpfWZ1bmN0aW9uIHgodCxlKXt2YXIgbj1bXTtyZXR1cm4gZ24odCxmdW5jdGlvbih0LHIsbyl7ZSh0LHIsbykmJm4ucHVzaCh0KTtcbn0pLG59ZnVuY3Rpb24gRSh0LGUsbixyLHUpe3ZhciBjPS0xLGk9dC5sZW5ndGg7Zm9yKG58fChuPWd0KSx1fHwodT1bXSk7KytjPGk7KXt2YXIgYT10W2NdOzA8ZSYmbihhKT8xPGU/RShhLGUtMSxuLHIsdSk6byh1LGEpOnJ8fCh1W3UubGVuZ3RoXT1hKX1yZXR1cm4gdX1mdW5jdGlvbiBJKHQsZSl7ZT1RKGUsdCk7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtudWxsIT10JiZuPHI7KXQ9dFtPdChlW24rK10pXTtyZXR1cm4gbiYmbj09cj90OnJlfWZ1bmN0aW9uIEYodCxlLG4pe3JldHVybiBlPWUodCkseG4odCk/ZTpvKGUsbih0KSl9ZnVuY3Rpb24gTSh0KXtpZihudWxsPT10KXQ9dD09PXJlP1wiW29iamVjdCBVbmRlZmluZWRdXCI6XCJbb2JqZWN0IE51bGxdXCI7ZWxzZSBpZihLZSYmS2UgaW4gT2JqZWN0KHQpKXt2YXIgZT1VZS5jYWxsKHQsS2UpLG49dFtLZV07dHJ5e3RbS2VdPXJlO3ZhciByPXRydWV9Y2F0Y2godCl7fXZhciBvPVBlLmNhbGwodCk7ciYmKGU/dFtLZV09bjpkZWxldGUgdFtLZV0pLFxudD1vfWVsc2UgdD1QZS5jYWxsKHQpO3JldHVybiB0fWZ1bmN0aW9uICQodCxlKXtyZXR1cm4gbnVsbCE9dCYmVWUuY2FsbCh0LGUpfWZ1bmN0aW9uIEQodCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gVSh0KXtyZXR1cm4gUHQodCkmJlwiW29iamVjdCBBcmd1bWVudHNdXCI9PU0odCl9ZnVuY3Rpb24gQih0LGUsbixyLG8pe2lmKHQ9PT1lKWU9dHJ1ZTtlbHNlIGlmKG51bGw9PXR8fG51bGw9PWV8fCFQdCh0KSYmIVB0KGUpKWU9dCE9PXQmJmUhPT1lO2Vsc2UgdDp7dmFyIHU9eG4odCksYz14bihlKSxpPXU/XCJbb2JqZWN0IEFycmF5XVwiOm1uKHQpLGE9Yz9cIltvYmplY3QgQXJyYXldXCI6bW4oZSksaT1cIltvYmplY3QgQXJndW1lbnRzXVwiPT1pP1wiW29iamVjdCBPYmplY3RdXCI6aSxhPVwiW29iamVjdCBBcmd1bWVudHNdXCI9PWE/XCJbb2JqZWN0IE9iamVjdF1cIjphLGY9XCJbb2JqZWN0IE9iamVjdF1cIj09aSxjPVwiW29iamVjdCBPYmplY3RdXCI9PWE7aWYoKGE9aT09YSkmJkVuKHQpKXtcbmlmKCFFbihlKSl7ZT1mYWxzZTticmVhayB0fXU9dHJ1ZSxmPWZhbHNlfWlmKGEmJiFmKW98fChvPW5ldyB2KSxlPXV8fE1uKHQpP2N0KHQsZSxuLHIsQixvKTppdCh0LGUsaSxuLHIsQixvKTtlbHNle2lmKCEoMSZuKSYmKHU9ZiYmVWUuY2FsbCh0LFwiX193cmFwcGVkX19cIiksaT1jJiZVZS5jYWxsKGUsXCJfX3dyYXBwZWRfX1wiKSx1fHxpKSl7dD11P3QudmFsdWUoKTp0LGU9aT9lLnZhbHVlKCk6ZSxvfHwobz1uZXcgdiksZT1CKHQsZSxuLHIsbyk7YnJlYWsgdH1pZihhKWU6aWYob3x8KG89bmV3IHYpLHU9MSZuLGk9YXQodCksYz1pLmxlbmd0aCxhPWF0KGUpLmxlbmd0aCxjPT1hfHx1KXtmb3IoZj1jO2YtLTspe3ZhciBsPWlbZl07aWYoISh1P2wgaW4gZTpVZS5jYWxsKGUsbCkpKXtlPWZhbHNlO2JyZWFrIGV9fWlmKChhPW8uZ2V0KHQpKSYmby5nZXQoZSkpZT1hPT1lO2Vsc2V7YT10cnVlLG8uc2V0KHQsZSksby5zZXQoZSx0KTtmb3IodmFyIHM9dTsrK2Y8Yzspe3ZhciBsPWlbZl0sYj10W2xdLGg9ZVtsXTtcbmlmKHIpdmFyIHA9dT9yKGgsYixsLGUsdCxvKTpyKGIsaCxsLHQsZSxvKTtpZihwPT09cmU/YiE9PWgmJiFCKGIsaCxuLHIsbyk6IXApe2E9ZmFsc2U7YnJlYWt9c3x8KHM9XCJjb25zdHJ1Y3RvclwiPT1sKX1hJiYhcyYmKG49dC5jb25zdHJ1Y3RvcixyPWUuY29uc3RydWN0b3IsbiE9ciYmXCJjb25zdHJ1Y3RvclwiaW4gdCYmXCJjb25zdHJ1Y3RvclwiaW4gZSYmISh0eXBlb2Ygbj09XCJmdW5jdGlvblwiJiZuIGluc3RhbmNlb2YgbiYmdHlwZW9mIHI9PVwiZnVuY3Rpb25cIiYmciBpbnN0YW5jZW9mIHIpJiYoYT1mYWxzZSkpLG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGU9YX19ZWxzZSBlPWZhbHNlO2Vsc2UgZT1mYWxzZX19cmV0dXJuIGV9ZnVuY3Rpb24gUCh0KXtyZXR1cm4gUHQodCkmJlwiW29iamVjdCBNYXBdXCI9PW1uKHQpfWZ1bmN0aW9uIEwodCxlKXt2YXIgbj1lLmxlbmd0aCxyPW47aWYobnVsbD09dClyZXR1cm4hcjtmb3IodD1PYmplY3QodCk7bi0tOyl7dmFyIG89ZVtuXTtpZihvWzJdP29bMV0hPT10W29bMF1dOiEob1swXWluIHQpKXJldHVybiBmYWxzZTtcbn1mb3IoOysrbjxyOyl7dmFyIG89ZVtuXSx1PW9bMF0sYz10W3VdLGk9b1sxXTtpZihvWzJdKXtpZihjPT09cmUmJiEodSBpbiB0KSlyZXR1cm4gZmFsc2V9ZWxzZSBpZihvPW5ldyB2LHZvaWQgMD09PXJlPyFCKGksYywzLHZvaWQgMCxvKToxKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBOKHQpe3JldHVybiBQdCh0KSYmXCJbb2JqZWN0IFNldF1cIj09bW4odCl9ZnVuY3Rpb24gQyh0KXtyZXR1cm4gUHQodCkmJlV0KHQubGVuZ3RoKSYmISFfZVtNKHQpXX1mdW5jdGlvbiBUKHQpe3JldHVybiB0eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6bnVsbD09dD9ZdDp0eXBlb2YgdD09XCJvYmplY3RcIj94bih0KT9XKHRbMF0sdFsxXSk6Uih0KTp0ZSh0KX1mdW5jdGlvbiBWKHQpe2lmKCFBdCh0KSlyZXR1cm4gWmUodCk7dmFyIGUsbj1bXTtmb3IoZSBpbiBPYmplY3QodCkpVWUuY2FsbCh0LGUpJiZcImNvbnN0cnVjdG9yXCIhPWUmJm4ucHVzaChlKTtyZXR1cm4gbn1mdW5jdGlvbiBSKHQpe3ZhciBlPWJ0KHQpO1xucmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP3d0KGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT10fHxMKG4sZSl9fWZ1bmN0aW9uIFcodCxlKXtyZXR1cm4gZHQodCkmJmU9PT1lJiYhQnQoZSk/d3QoT3QodCksZSk6ZnVuY3Rpb24obil7dmFyIHI9R3Qobix0KTtyZXR1cm4gcj09PXJlJiZyPT09ZT9IdChuLHQpOkIoZSxyLDMpfX1mdW5jdGlvbiBxKHQsZSxuLHIsbyl7dCE9PWUmJnZuKGUsZnVuY3Rpb24odSxjKXtpZihCdCh1KSl7b3x8KG89bmV3IHYpO3ZhciBpPW8sYT1cIl9fcHJvdG9fX1wiPT1jP3JlOnRbY10sZj1cIl9fcHJvdG9fX1wiPT1jP3JlOmVbY10sbD1pLmdldChmKTtpZihsKUEodCxjLGwpO2Vsc2V7dmFyIGw9cj9yKGEsZixjK1wiXCIsdCxlLGkpOnJlLHM9bD09PXJlO2lmKHMpe3ZhciBiPXhuKGYpLGg9IWImJkVuKGYpLHA9IWImJiFoJiZNbihmKSxsPWY7Ynx8aHx8cD94bihhKT9sPWE6JHQoYSk/bD10dChhKTpoPyhzPWZhbHNlLGw9WChmLHRydWUpKTpwPyhzPWZhbHNlLFxubD1aKGYsdHJ1ZSkpOmw9W106THQoZil8fHpuKGYpPyhsPWEsem4oYSk/bD1XdChhKTooIUJ0KGEpfHxuJiZEdChhKSkmJihsPWp0KGYpKSk6cz1mYWxzZX1zJiYoaS5zZXQoZixsKSxxKGwsZixuLHIsaSksaS5kZWxldGUoZikpLEEodCxjLGwpfX1lbHNlIGk9cj9yKFwiX19wcm90b19fXCI9PWM/cmU6dFtjXSx1LGMrXCJcIix0LGUsbyk6cmUsaT09PXJlJiYoaT11KSxBKHQsYyxpKX0sS3QpfWZ1bmN0aW9uIEcodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBJKGUsdCl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIE9uKG10KHQsdm9pZCAwLFl0KSx0K1wiXCIpfWZ1bmN0aW9uIEoodCl7aWYodHlwZW9mIHQ9PVwic3RyaW5nXCIpcmV0dXJuIHQ7aWYoeG4odCkpcmV0dXJuIHIodCxKKStcIlwiO2lmKEN0KHQpKXJldHVybi
1115Bqbj9qbi5jYWxsKHQpOlwiXCI7dmFyIGU9dCtcIlwiO3JldHVyblwiMFwiPT1lJiYxL3Q9PS1vZT9cIi0wXCI6ZX1mdW5jdGlvbiBLKHQsZSl7ZT1RKGUsdCk7dmFyIG47aWYoMj5lLmxlbmd0aCluPXQ7ZWxzZXtcbm49ZTt2YXIgcj0wLG89LTEsdT0tMSxjPW4ubGVuZ3RoO2ZvcigwPnImJihyPS1yPmM/MDpjK3IpLG89bz5jP2M6bywwPm8mJihvKz1jKSxjPXI+bz8wOm8tcj4+PjAscj4+Pj0wLG89QXJyYXkoYyk7Kyt1PGM7KW9bdV09blt1K3JdO249SSh0LG8pfXQ9bixudWxsPT10fHxkZWxldGUgdFtPdCh4dChlKSldfWZ1bmN0aW9uIFEodCxlKXtyZXR1cm4geG4odCk/dDpkdCh0LGUpP1t0XTpTbihxdCh0KSl9ZnVuY3Rpb24gWCh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxuPVJlP1JlKG4pOm5ldyB0LmNvbnN0cnVjdG9yKG4pO3JldHVybiB0LmNvcHkobiksbn1mdW5jdGlvbiBZKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBWZShlKS5zZXQobmV3IFZlKHQpKSxlfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZT9ZKHQuYnVmZmVyKTp0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpO1xufWZ1bmN0aW9uIHR0KHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gZXQodCxlLG4pe3ZhciByPSFuO258fChuPXt9KTtmb3IodmFyIG89LTEsdT1lLmxlbmd0aDsrK288dTspe3ZhciBjPWVbb10saT1yZTtpPT09cmUmJihpPXRbY10pLHI/ayhuLGMsaSk6dyhuLGMsaSl9cmV0dXJuIG59ZnVuY3Rpb24gbnQodCxlKXtyZXR1cm4gZXQodCxBbih0KSxlKX1mdW5jdGlvbiBydCh0LGUpe3JldHVybiBldCh0LHduKHQpLGUpfWZ1bmN0aW9uIG90KHQpe3JldHVybiBIKGZ1bmN0aW9uKGUsbil7dmFyIHIsbz0tMSx1PW4ubGVuZ3RoLGM9MTx1P25bdS0xXTpyZSxpPTI8dT9uWzJdOnJlLGM9Mzx0Lmxlbmd0aCYmdHlwZW9mIGM9PVwiZnVuY3Rpb25cIj8odS0tLGMpOnJlO2lmKHI9aSl7cj1uWzBdO3ZhciBhPW5bMV07aWYoQnQoaSkpe3ZhciBmPXR5cGVvZiBhO3I9ISEoXCJudW1iZXJcIj09Zj9NdChpKSYmdnQoYSxpLmxlbmd0aCk6XCJzdHJpbmdcIj09ZiYmYSBpbiBpKSYmRnQoaVthXSxyKTtcbn1lbHNlIHI9ZmFsc2V9Zm9yKHImJihjPTM+dT9yZTpjLHU9MSksZT1PYmplY3QoZSk7KytvPHU7KShpPW5bb10pJiZ0KGUsaSxvLGMpO3JldHVybiBlfSl9ZnVuY3Rpb24gdXQodCl7cmV0dXJuIEx0KHQpP3JlOnR9ZnVuY3Rpb24gY3QodCxlLG4scixvLGMpe3ZhciBpPTEmbixhPXQubGVuZ3RoLGY9ZS5sZW5ndGg7aWYoYSE9ZiYmIShpJiZmPmEpKXJldHVybiBmYWxzZTtpZigoZj1jLmdldCh0KSkmJmMuZ2V0KGUpKXJldHVybiBmPT1lO3ZhciBmPS0xLGw9dHJ1ZSxzPTImbj9uZXcgZzpyZTtmb3IoYy5zZXQodCxlKSxjLnNldChlLHQpOysrZjxhOyl7dmFyIGI9dFtmXSxoPWVbZl07aWYocil2YXIgcD1pP3IoaCxiLGYsZSx0LGMpOnIoYixoLGYsdCxlLGMpO2lmKHAhPT1yZSl7aWYocCljb250aW51ZTtsPWZhbHNlO2JyZWFrfWlmKHMpe2lmKCF1KGUsZnVuY3Rpb24odCxlKXtpZighcy5oYXMoZSkmJihiPT09dHx8byhiLHQsbixyLGMpKSlyZXR1cm4gcy5wdXNoKGUpfSkpe2w9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoYiE9PWgmJiFvKGIsaCxuLHIsYykpe1xubD1mYWxzZTticmVha319cmV0dXJuIGMuZGVsZXRlKHQpLGMuZGVsZXRlKGUpLGx9ZnVuY3Rpb24gaXQodCxlLG4scixvLHUsYyl7c3dpdGNoKG4pe2Nhc2VcIltvYmplY3QgRGF0YVZpZXddXCI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KWJyZWFrO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhdShuZXcgVmUodCksbmV3IFZlKGUpKSlicmVhaztyZXR1cm4gdHJ1ZTtjYXNlXCJbb2JqZWN0IEJvb2xlYW5dXCI6Y2FzZVwiW29iamVjdCBEYXRlXVwiOmNhc2VcIltvYmplY3QgTnVtYmVyXVwiOnJldHVybiBGdCgrdCwrZSk7Y2FzZVwiW29iamVjdCBFcnJvcl1cIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2VcIltvYmplY3QgUmVnRXhwXVwiOmNhc2VcIltvYmplY3QgU3RyaW5nXVwiOnJldHVybiB0PT1lK1wiXCI7Y2FzZVwiW29iamVjdCBNYXBdXCI6XG52YXIgaT1zO2Nhc2VcIltvYmplY3QgU2V0XVwiOmlmKGl8fChpPWgpLHQuc2l6ZSE9ZS5zaXplJiYhKDEmcikpYnJlYWs7cmV0dXJuKG49Yy5nZXQodCkpP249PWU6KHJ8PTIsYy5zZXQodCxlKSxlPWN0KGkodCksaShlKSxyLG8sdSxjKSxjLmRlbGV0ZSh0KSxlKTtjYXNlXCJbb2JqZWN0IFN5bWJvbF1cIjppZih5bilyZXR1cm4geW4uY2FsbCh0KT09eW4uY2FsbChlKX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXQodCl7cmV0dXJuIEYodCxKdCxBbil9ZnVuY3Rpb24gZnQodCl7cmV0dXJuIEYodCxLdCx3bil9ZnVuY3Rpb24gbHQoKXt2YXIgdD1wLml0ZXJhdGVlfHxadCx0PXQ9PT1adD9UOnQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0fWZ1bmN0aW9uIHN0KHQsZSl7dmFyIG49dC5fX2RhdGFfXyxyPXR5cGVvZiBlO3JldHVybihcInN0cmluZ1wiPT1yfHxcIm51bWJlclwiPT1yfHxcInN5bWJvbFwiPT1yfHxcImJvb2xlYW5cIj09cj9cIl9fcHJvdG9fX1wiIT09ZTpudWxsPT09ZSk/blt0eXBlb2YgZT09XCJzdHJpbmdcIj9cInN0cmluZ1wiOlwiaGFzaFwiXTpuLm1hcDtcbn1mdW5jdGlvbiBidCh0KXtmb3IodmFyIGU9SnQodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLG89dFtyXTtlW25dPVtyLG8sbz09PW8mJiFCdChvKV19cmV0dXJuIGV9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj1udWxsPT10P3JlOnRbZV07cmV0dXJuKCFCdChuKXx8QmUmJkJlIGluIG4/MDooRHQobik/TmU6cGUpLnRlc3QoU3QobikpKT9uOnJlfWZ1bmN0aW9uIHB0KHQsZSxuKXtlPVEoZSx0KTtmb3IodmFyIHI9LTEsbz1lLmxlbmd0aCx1PWZhbHNlOysrcjxvO
1115yl7dmFyIGM9T3QoZVtyXSk7aWYoISh1PW51bGwhPXQmJm4odCxjKSkpYnJlYWs7dD10W2NdfXJldHVybiB1fHwrK3IhPW8/dToobz1udWxsPT10PzA6dC5sZW5ndGgsISFvJiZVdChvKSYmdnQoYyxvKSYmKHhuKHQpfHx6bih0KSkpfWZ1bmN0aW9uIHl0KHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJlwic3RyaW5nXCI9PXR5cGVvZiB0WzBdJiZVZS5jYWxsKHQsXCJpbmRleFwiKSYmKG4uaW5kZXg9dC5pbmRleCxcbm4uaW5wdXQ9dC5pbnB1dCksbn1mdW5jdGlvbiBqdCh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3IhPVwiZnVuY3Rpb25cInx8QXQodCk/e306X24oV2UodCkpfWZ1bmN0aW9uIF90KHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiOnJldHVybiBZKHQpO2Nhc2VcIltvYmplY3QgQm9vbGVhbl1cIjpjYXNlXCJbb2JqZWN0IERhdGVdXCI6cmV0dXJuIG5ldyByKCt0KTtjYXNlXCJbb2JqZWN0IERhdGFWaWV3XVwiOnJldHVybiBlPW4/WSh0LmJ1ZmZlcik6dC5idWZmZXIsbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTtjYXNlXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEludDhBcnJheV1cIjpjYXNlXCJbb2JqZWN0IEludDE2QXJyYXldXCI6Y2FzZVwiW29iamVjdCBJbnQzMkFycmF5XVwiOmNhc2VcIltvYmplY3QgVWludDhBcnJheV1cIjpcbmNhc2VcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCI6Y2FzZVwiW29iamVjdCBVaW50MTZBcnJheV1cIjpjYXNlXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiOnJldHVybiBaKHQsbik7Y2FzZVwiW29iamVjdCBNYXBdXCI6cmV0dXJuIG5ldyByO2Nhc2VcIltvYmplY3QgTnVtYmVyXVwiOmNhc2VcIltvYmplY3QgU3RyaW5nXVwiOnJldHVybiBuZXcgcih0KTtjYXNlXCJbb2JqZWN0IFJlZ0V4cF1cIjpyZXR1cm4gZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxzZS5leGVjKHQpKSxlLmxhc3RJbmRleD10Lmxhc3RJbmRleCxlO2Nhc2VcIltvYmplY3QgU2V0XVwiOnJldHVybiBuZXcgcjtjYXNlXCJbb2JqZWN0IFN5bWJvbF1cIjpyZXR1cm4geW4/T2JqZWN0KHluLmNhbGwodCkpOnt9fX1mdW5jdGlvbiBndCh0KXtyZXR1cm4geG4odCl8fHpuKHQpfHwhIShKZSYmdCYmdFtKZV0pfWZ1bmN0aW9uIHZ0KHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUsISFlJiYoXCJudW1iZXJcIj09bnx8XCJzeW1ib2xcIiE9biYmamUudGVzdCh0KSkmJi0xPHQmJjA9PXQlMSYmdDxlO1xufWZ1bmN0aW9uIGR0KHQsZSl7aWYoeG4odCkpcmV0dXJuIGZhbHNlO3ZhciBuPXR5cGVvZiB0O3JldHVybiEoXCJudW1iZXJcIiE9biYmXCJzeW1ib2xcIiE9biYmXCJib29sZWFuXCIhPW4mJm51bGwhPXQmJiFDdCh0KSl8fChpZS50ZXN0KHQpfHwhY2UudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfWZ1bmN0aW9uIEF0KHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0odHlwZW9mIGU9PVwiZnVuY3Rpb25cIiYmZS5wcm90b3R5cGV8fE1lKX1mdW5jdGlvbiB3dCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmKG5bdF09PT1lJiYoZSE9PXJlfHx0IGluIE9iamVjdChuKSkpfX1mdW5jdGlvbiBtdChlLG4scil7cmV0dXJuIG49dG4obj09PXJlP2UubGVuZ3RoLTE6biwwKSxmdW5jdGlvbigpe2Zvcih2YXIgbz1hcmd1bWVudHMsdT0tMSxjPXRuKG8ubGVuZ3RoLW4sMCksaT1BcnJheShjKTsrK3U8YzspaVt1XT1vW24rdV07Zm9yKHU9LTEsYz1BcnJheShuKzEpOysrdTxuOyljW3VdPW9bdV07XG5yZXR1cm4gY1tuXT1yKGkpLHQoZSx0aGlzLGMpfX1mdW5jdGlvbiBPdCh0KXtpZih0eXBlb2YgdD09XCJzdHJpbmdcInx8Q3QodCkpcmV0dXJuIHQ7dmFyIGU9dCtcIlwiO3JldHVyblwiMFwiPT1lJiYxL3Q9PS1vZT9cIi0wXCI6ZX1mdW5jdGlvbiBTdCh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIERlLmNhbGwodCl9Y2F0Y2godCl7fXJldHVybiB0K1wiXCJ9cmV0dXJuXCJcIn1mdW5jdGlvbiBrdCh0LGUsbil7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiByPyhuPW51bGw9PW4/MDpWdChuKSwwPm4mJihuPXRuKHIrbiwwKSksYyh0LGx0KGUsMyksbikpOi0xfWZ1bmN0aW9uIHp0KHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP0UodCwxKTpbXX1mdW5jdGlvbiB4dCh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOnJlfWZ1bmN0aW9uIEV0KHQsZSl7ZnVuY3Rpb24gbigpe3ZhciByPWFyZ3VtZW50cyxvPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sdT1uLmNhY2hlO1xucmV0dXJuIHUuaGFzKG8pP3UuZ2V0KG8pOihyPXQuYXBwbHkodGhpcyxyKSxuLmNhY2hlPXUuc2V0KG8scil8fHUscil9aWYodHlwZW9mIHQhPVwiZnVuY3Rpb25cInx8bnVsbCE9ZSYmdHlwZW9mIGUhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtyZXR1cm4gbi5jYWNoZT1uZXcoRXQuQ2FjaGV8fF8pLG59ZnVuY3Rpb24gSXQodCl7aWYodHlwZW9mIHQhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3d
1115pdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXQuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0pO2Nhc2UgMjpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSxlWzJdKX1yZXR1cm4hdC5hcHBseSh0aGlzLGUpfX1mdW5jdGlvbiBGdCh0LGUpe1xucmV0dXJuIHQ9PT1lfHx0IT09dCYmZSE9PWV9ZnVuY3Rpb24gTXQodCl7cmV0dXJuIG51bGwhPXQmJlV0KHQubGVuZ3RoKSYmIUR0KHQpfWZ1bmN0aW9uICR0KHQpe3JldHVybiBQdCh0KSYmTXQodCl9ZnVuY3Rpb24gRHQodCl7cmV0dXJuISFCdCh0KSYmKHQ9TSh0KSxcIltvYmplY3QgRnVuY3Rpb25dXCI9PXR8fFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIj09dHx8XCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dXCI9PXR8fFwiW29iamVjdCBQcm94eV1cIj09dCl9ZnVuY3Rpb24gVXQodCl7cmV0dXJuIHR5cGVvZiB0PT1cIm51bWJlclwiJiYtMTx0JiYwPT10JTEmJjkwMDcxOTkyNTQ3NDA5OTE+PXR9ZnVuY3Rpb24gQnQodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJihcIm9iamVjdFwiPT1lfHxcImZ1bmN0aW9uXCI9PWUpfWZ1bmN0aW9uIFB0KHQpe3JldHVybiBudWxsIT10JiZ0eXBlb2YgdD09XCJvYmplY3RcIn1mdW5jdGlvbiBMdCh0KXtyZXR1cm4hKCFQdCh0KXx8XCJbb2JqZWN0IE9iamVjdF1cIiE9TSh0KSkmJih0PVdlKHQpLFxubnVsbD09PXR8fCh0PVVlLmNhbGwodCxcImNvbnN0cnVjdG9yXCIpJiZ0LmNvbnN0cnVjdG9yLHR5cGVvZiB0PT1cImZ1bmN0aW9uXCImJnQgaW5zdGFuY2VvZiB0JiZEZS5jYWxsKHQpPT1MZSkpfWZ1bmN0aW9uIE50KHQpe3JldHVybiB0eXBlb2YgdD09XCJzdHJpbmdcInx8IXhuKHQpJiZQdCh0KSYmXCJbb2JqZWN0IFN0cmluZ11cIj09TSh0KX1mdW5jdGlvbiBDdCh0KXtyZXR1cm4gdHlwZW9mIHQ9PVwic3ltYm9sXCJ8fFB0KHQpJiZcIltvYmplY3QgU3ltYm9sXVwiPT1NKHQpfWZ1bmN0aW9uIFR0KHQpe3JldHVybiB0Pyh0PVJ0KHQpLHQ9PT1vZXx8dD09PS1vZT8xLjc5NzY5MzEzNDg2MjMxNTdlMzA4KigwPnQ/LTE6MSk6dD09PXQ/dDowKTowPT09dD90OjB9ZnVuY3Rpb24gVnQodCl7dD1UdCh0KTt2YXIgZT10JTE7cmV0dXJuIHQ9PT10P2U/dC1lOnQ6MH1mdW5jdGlvbiBSdCh0KXtpZih0eXBlb2YgdD09XCJudW1iZXJcIilyZXR1cm4gdDtpZihDdCh0KSlyZXR1cm4gdWU7aWYoQnQodCkmJih0PXR5cGVvZiB0LnZhbHVlT2Y9PVwiZnVuY3Rpb25cIj90LnZhbHVlT2YoKTp0LFxudD1CdCh0KT90K1wiXCI6dCksdHlwZW9mIHQhPVwic3RyaW5nXCIpcmV0dXJuIDA9PT10P3Q6K3Q7dD10LnJlcGxhY2UoZmUsXCJcIik7dmFyIGU9aGUudGVzdCh0KTtyZXR1cm4gZXx8eWUudGVzdCh0KT9kZSh0LnNsaWNlKDIpLGU/Mjo4KTpiZS50ZXN0KHQpP3VlOit0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiBldCh0LEt0KHQpKX1mdW5jdGlvbiBxdCh0KXtyZXR1cm4gbnVsbD09dD9cIlwiOkoodCl9ZnVuY3Rpb24gR3QodCxlLG4pe3JldHVybiB0PW51bGw9PXQ/cmU6SSh0LGUpLHQ9PT1yZT9uOnR9ZnVuY3Rpb24gSHQodCxlKXtyZXR1cm4gbnVsbCE9dCYmcHQodCxlLEQpfWZ1bmN0aW9uIEp0KHQpe3JldHVybiBNdCh0KT9kKHQpOlYodCl9ZnVuY3Rpb24gS3QodCl7aWYoTXQodCkpdD1kKHQsdHJ1ZSk7ZWxzZSBpZihCdCh0KSl7dmFyIGUsbj1BdCh0KSxyPVtdO2ZvcihlIGluIHQpKFwiY29uc3RydWN0b3JcIiE9ZXx8IW4mJlVlLmNhbGwodCxlKSkmJnIucHVzaChlKTt0PXJ9ZWxzZXtpZihlPVtdLFxubnVsbCE9dClmb3IobiBpbiBPYmplY3QodCkpZS5wdXNoKG4pO3Q9ZX1yZXR1cm4gdH1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gbnVsbD09dD9bXTpsKHQsSnQodCkpfWZ1bmN0aW9uIFh0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBadCh0KXtyZXR1cm4gVCh0eXBlb2YgdD09XCJmdW5jdGlvblwiP3Q6eih0LDEpKX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gZHQodCk/YShPdCh0KSk6Ryh0KX1mdW5jdGlvbiBlZSgpe3JldHVybltdfWZ1bmN0aW9uIG5lKCl7cmV0dXJuIGZhbHNlfXZhciByZSxvZT0xLzAsdWU9TmFOLGNlPS9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8saWU9L15cXHcqJC8sYWU9L1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89K
1115D86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nLGZlPS9eXFxzK3xcXHMrJC9nLGxlPS9cXFxcKFxcXFwpPy9nLHNlPS9cXHcqJC8sYmU9L15bLStdMHhbMC05YS1mXSskL2ksaGU9L14wYlswMV0rJC9pLHBlPS9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC8seWU9L14wb1swLTddKyQvaSxqZT0vXig/OjB8WzEtOV1cXGQqKSQvLF9lPXt9O1xuX2VbXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIl09X2VbXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cIl09X2VbXCJbb2JqZWN0IEludDhBcnJheV1cIl09X2VbXCJbb2JqZWN0IEludDE2QXJyYXldXCJdPV9lW1wiW29iamVjdCBJbnQzMkFycmF5XVwiXT1fZVtcIltvYmplY3QgVWludDhBcnJheV1cIl09X2VbXCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVwiXT1fZVtcIltvYmplY3QgVWludDE2QXJyYXldXCJdPV9lW1wiW29iamVjdCBVaW50MzJBcnJheV1cIl09dHJ1ZSxfZVtcIltvYmplY3QgQXJndW1lbnRzXVwiXT1fZVtcIltvYmplY3QgQXJyYXldXCJdPV9lW1wiW29iamVjdCBBcnJheUJ1ZmZlcl1cIl09X2VbXCJbb2JqZWN0IEJvb2xlYW5dXCJdPV9lW1wiW29iamVjdCBEYXRhVmlld11cIl09X2VbXCJbb2JqZWN0IERhdGVdXCJdPV9lW1wiW29iamVjdCBFcnJvcl1cIl09X2VbXCJbb2JqZWN0IEZ1bmN0aW9uXVwiXT1fZVtcIltvYmplY3QgTWFwXVwiXT1fZVtcIltvYmplY3QgTnVtYmVyXVwiXT1fZVtcIltvYmplY3QgT2JqZWN0XVwiXT1fZVtcIltvYmplY3QgUmVnRXhwXVwiXT1fZVtcIltvYmplY3QgU2V0XVwiXT1fZVtcIltvYmplY3QgU3RyaW5nXVwiXT1fZVtcIltvYmplY3QgV2Vha01hcF1cIl09ZmFsc2U7XG52YXIgZ2U9e307Z2VbXCJbb2JqZWN0IEFyZ3VtZW50c11cIl09Z2VbXCJbb2JqZWN0IEFycmF5XVwiXT1nZVtcIltvYmplY3QgQXJyYXlCdWZmZXJdXCJdPWdlW1wiW29iamVjdCBEYXRhVmlld11cIl09Z2VbXCJbb2JqZWN0IEJvb2xlYW5dXCJdPWdlW1wiW29iamVjdCBEYXRlXVwiXT1nZVtcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiXT1nZVtcIltvYmplY3QgRmxvYXQ2NEFycmF5XVwiXT1nZVtcIltvYmplY3QgSW50OEFycmF5XVwiXT1nZVtcIltvYmplY3QgSW50MTZBcnJheV1cIl09Z2VbXCJbb2JqZWN0IEludDMyQXJyYXldXCJdPWdlW1wiW29iamVjdCBNYXBdXCJdPWdlW1wiW29iamVjdCBOdW1iZXJdXCJdPWdlW1wiW29iamVjdCBPYmplY3RdXCJdPWdlW1wiW29iamVjdCBSZWdFeHBdXCJdPWdlW1wiW29iamVjdCBTZXRdXCJdPWdlW1wiW29iamVjdCBTdHJpbmddXCJdPWdlW1wiW29iamVjdCBTeW1ib2xdXCJdPWdlW1wiW29iamVjdCBVaW50OEFycmF5XVwiXT1nZVtcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCJdPWdlW1wiW29iamVjdCBVaW50MTZBcnJheV1cIl09Z2VbXCJbb2JqZWN0IFVpbnQzMkFycmF5XVwiXT10cnVlLFxuZ2VbXCJbb2JqZWN0IEVycm9yXVwiXT1nZVtcIltvYmplY3QgRnVuY3Rpb25dXCJdPWdlW1wiW29iamVjdCBXZWFrTWFwXVwiXT1mYWxzZTt2YXIgdmUsZGU9cGFyc2VJbnQsQWU9dHlwZW9mIGdsb2JhbD09XCJvYmplY3RcIiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsd2U9dHlwZW9mIHNlbGY9PVwib2JqZWN0XCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLG1lPUFlfHx3ZXx8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpLE9lPXR5cGVvZiBleHBvcnRzPT1cIm9iamVjdFwiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxTZT1PZSYmdHlwZW9mIG1vZHVsZT09XCJvYmplY3RcIiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsa2U9U2UmJlNlLmV4cG9ydHM9PT1PZSx6ZT1rZSYmQWUucHJvY2Vzczt0Ont0cnl7dmU9emUmJnplLmJpbmRpbmcmJnplLmJpbmRpbmcoXCJ1dGlsXCIpO2JyZWFrIHR9Y2F0Y2godCl7fXZlPXZvaWQgMH12YXIgeGU9dmUmJnZlLmlzTWFwLEVlPXZlJiZ2ZS5pc1NldCxJZT12ZSYmdmUuaXNUeXBlZEFycmF5LEZlPUFycmF5LnByb3RvdHlwZSxNZT1PYmplY3QucHJvdG90eXBlLCRlPW1lW1wiX19jb3JlLWpzX3NoYXJlZF9fXCJdLERlPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyxVZT1NZS5oYXNPd25Qcm9wZXJ0eSxCZT1mdW5jdGlvbigpe1xudmFyIHQ9L1teLl0rJC8uZXhlYygkZSYmJGUua2V5cyYmJGUua2V5cy5JRV9QUk9UT3x8XCJcIik7cmV0dXJuIHQ/XCJTeW1ib2woc3JjKV8xLlwiK3Q6XCJcIn0oKSxQZT1NZS50b1N0cmluZyxMZT1EZS5jYWxsKE9iamVjdCksTmU9UmVnRXhwKFwiXlwiK0RlLmNhbGwoVWUpLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLFwiXFxcXCQmXCIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csXCIkMS4qP1wiKStcIiRcIiksQ2U9a2U/bWUuQnVmZmVyOnJlLFRlPW1lLlN5bWJvbCxWZT1tZS5VaW50OEFycmF5LFJlPUNlP0NlLmE6cmUsV2U9YihPYmplY3QuZ2V0UHJvdG90eXBlT2YpLHFlPU9iamVjdC5jcmVhdGUsR2U9TWUucHJvcGVydHlJc0VudW1lcmFibGUsSGU9RmUuc3BsaWNlLEplPVRlP1RlLmlzQ29uY2F0U3ByZWFkYWJsZTpyZSxLZT1UZT9UZS50b1N0cmluZ1RhZzpyZSxRZT1mdW5jdGlvbigpe3RyeXt2YXIgdD1odChPYmplY3QsXCJkZWZpbmVQcm9wZXJ0eVwiKTtcbnJldHVybiB0KHt9LFwiXCIse30pLHR9Y2F0Y2godCl7fX0oKSxYZT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFllPUNlP0NlLmlzQnVmZmVyOnJlLFplPWIoT2JqZWN0LmtleXMpLHRuPU1hdGgubWF4LGVuPURhdGUubm93LG5uPWh0KG1lLFwiRGF0YVZpZXdcIikscm49aHQobWUsXCJNYXBcIiksb249aHQobWUsXCJQcm9taXNlXCIpLHVuPWh0KG1lLFwiU2V0XCIpLGNuPWh0KG1lLFwiV2Vha01hcFwiKSxhbj1odChPYmplY3QsXCJjcmVhdGVcIiksZm49U3Qobm4pLGxuPVN0KHJuKSxzbj1TdChvbiksYm49U3QodW4pLGhuPVN0KGNu
1115KSxwbj1UZT9UZS5wcm90b3R5cGU6cmUseW49cG4/cG4udmFsdWVPZjpyZSxqbj1wbj9wbi50b1N0cmluZzpyZSxfbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBCdChlKT9xZT9xZShlKToodC5wcm90b3R5cGU9ZSxlPW5ldyB0LHQucHJvdG90eXBlPXJlLGUpOnt9fX0oKTt5LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe1xudGhpcy5fX2RhdGFfXz1hbj9hbihudWxsKTp7fSx0aGlzLnNpemU9MH0seS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XSx0aGlzLnNpemUtPXQ/MTowLHR9LHkucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBhbj8odD1lW3RdLFwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfX1wiPT09dD9yZTp0KTpVZS5jYWxsKGUsdCk/ZVt0XTpyZX0seS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIGFuP2VbdF0hPT1yZTpVZS5jYWxsKGUsdCl9LHkucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09YW4mJmU9PT1yZT9cIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX19cIjplLHRoaXN9LGoucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7XG50aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxqLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gdD1tKGUsdCksISgwPnQpJiYodD09ZS5sZW5ndGgtMT9lLnBvcCgpOkhlLmNhbGwoZSx0LDEpLC0tdGhpcy5zaXplLHRydWUpfSxqLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gdD1tKGUsdCksMD50P3JlOmVbdF1bMV19LGoucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4tMTxtKHRoaXMuX19kYXRhX18sdCl9LGoucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1tKG4sdCk7cmV0dXJuIDA+cj8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9LF8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgeSxtYXA6bmV3KHJufHxqKSxzdHJpbmc6bmV3IHlcbn19LF8ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD1zdCh0aGlzLHQpLmRlbGV0ZSh0KSx0aGlzLnNpemUtPXQ/MTowLHR9LF8ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gc3QodGhpcyx0KS5nZXQodCl9LF8ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gc3QodGhpcyx0KS5oYXModCl9LF8ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXN0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9LGcucHJvdG90eXBlLmFkZD1nLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LFwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfX1wiKSx0aGlzfSxnLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSx2LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IGosXG50aGlzLnNpemU9MH0sdi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHQ9ZS5kZWxldGUodCksdGhpcy5zaXplPWUuc2l6ZSx0fSx2LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSx2LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSx2LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBqKXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFybnx8MTk5PnIubGVuZ3RoKXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgXyhyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O3ZhciBnbj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIU10KG4pKXJldHVybiB0KG4scik7XG5mb3IodmFyIG89bi5sZW5ndGgsdT1lP286LTEsYz1PYmplY3Qobik7KGU/dS0tOisrdTxvKSYmZmFsc2UhPT1yKGNbdV0sdSxjKTspO3JldHVybiBufX0oZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdm4odCxlLEp0KX0pLHZuPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7dmFyIG89LTEsdT1PYmplY3QoZSk7cj1yKGUpO2Zvcih2YXIgYz1yLmxlbmd0aDtjLS07KXt2YXIgaT1yW3Q/YzorK29dO2lmKGZhbHNlPT09bih1W2ldLGksdSkpYnJlYWt9cmV0dXJuIGV9fSgpLGRuPVFlP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFFlKHQsXCJ0b1N0cmluZ1wiLHtjb25maWd1cmFibGU6dHJ1ZSxlbnVtZXJhYmxlOmZhbHNlLHZhbHVlOlh0KGUpLHdyaXRhYmxlOnRydWV9KX06WXQsQW49WGU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLG4oWGUodCksZnVuY3Rpb24oZSl7cmV0dXJuIEdlLmNhbGwodCxlKX0pKX06ZWUsd249WGU/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KW8oZSxBbih0KSksXG50PVdlKHQpO3JldHVybiBlfTplZSxtbj1NOyhubiYmXCJbb2JqZWN0IERhdGFWaWV3XVwiIT1tbihuZXcgbm4obmV3IEFycmF5QnVmZmVyKDEpKSl8fHJuJiZcIltvYmplY3QgTWFwXVwiIT1tbihuZXcgcm4pfHxvbiYmXCJbb2JqZWN0IFByb21pc2VdXCIhPW1uKG9uLnJlc29sdmUoKSl8fHVuJiZcIltvYmplY3QgU2V0XVwiIT1tbihuZXcgdW4pfHxjbiYmXCJbb2JqZWN0IFdlYWtNYXBdXCIhPW1uKG5ldyBjbikpJiYobW49ZnVuY3Rpb24odCl7dmFyIGU9TSh0KTtpZih0PSh0PVwiW29iamVjdCBPYmplY3RdXCI9PWU/dC5jb25zdHJ1Y3RvcjpyZSk/U3QodCk6XCJcIilzd2l0Y2godCl7Y2FzZSBmbjpyZXR1cm5cIltvYmplY3QgRGF0YVZpZXddXCI7Y2FzZSBsbjpyZXR1cm5cIltvYmplY3QgTWFwXVwiO2Nhc2Ugc246cmV0dXJuXCJbb2JqZWN0IFByb21pc2VdXCI7Y2FzZSBibjpyZXR1cm5cIltvYmplY3QgU2V0XVwiO2Nhc2UgaG46cmV0dXJuXCJbb2JqZWN0IFdlYWtNYXBdXCJ9cmV0dXJuIGV9KTt2YXIgT249ZnVuY3Rpb24odCl7XG52YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lbigpLG89MTYtKHItbik7aWYobj1yLDA8byl7aWYoODAwPD0rK2UpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseShyZSxhcmd1bWVudHMpfX0oZG4pLFNuPWZ1bmN0aW9uKHQpe3Q9RXQodCxmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ZS5zaXplJiZlLmNsZWFyKCksdH0pO3Z
1115hciBlPXQuY2FjaGU7cmV0dXJuIHR9KGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKFwiXCIpLHQucmVwbGFjZShhZSxmdW5jdGlvbih0LG4scixvKXtlLnB1c2gocj9vLnJlcGxhY2UobGUsXCIkMVwiKTpufHx0KX0pLGV9KSxrbj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3ZhciBvPU9iamVjdChlKTtpZighTXQoZSkpe3ZhciB1PWx0KG4sMyk7ZT1KdChlKSxuPWZ1bmN0aW9uKHQpe3JldHVybiB1KG9bdF0sdCxvKX19cmV0dXJuIG49dChlLG4sciksXG4tMTxuP29bdT9lW25dOm5dOnJlfX0oa3QpO0V0LkNhY2hlPV87dmFyIHpuPVUoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9VOmZ1bmN0aW9uKHQpe3JldHVybiBQdCh0KSYmVWUuY2FsbCh0LFwiY2FsbGVlXCIpJiYhR2UuY2FsbCh0LFwiY2FsbGVlXCIpfSx4bj1BcnJheS5pc0FycmF5LEVuPVllfHxuZSxJbj14ZT9mKHhlKTpQLEZuPUVlP2YoRWUpOk4sTW49SWU/ZihJZSk6Qywkbj1vdChmdW5jdGlvbih0LGUsbil7cSh0LGUsbil9KSxEbj1vdChmdW5jdGlvbih0LGUsbixyKXtxKHQsZSxuLHIpfSksVW49ZnVuY3Rpb24odCl7cmV0dXJuIE9uKG10KHQscmUsenQpLHQrXCJcIil9KGZ1bmN0aW9uKHQsZSl7dmFyIG49e307aWYobnVsbD09dClyZXR1cm4gbjt2YXIgbz1mYWxzZTtlPXIoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT1RKGUsdCksb3x8KG89MTxlLmxlbmd0aCksZX0pLGV0KHQsZnQodCksbiksbyYmKG49eihuLDcsdXQpKTtmb3IodmFyIHU9ZS5sZW5ndGg7dS0tOylLKG4sZVt1XSk7XG5yZXR1cm4gbn0pO3AuY29uc3RhbnQ9WHQscC5mbGF0dGVuPXp0LHAuaXRlcmF0ZWU9WnQscC5rZXlzPUp0LHAua2V5c0luPUt0LHAubWVtb2l6ZT1FdCxwLm1lcmdlPSRuLHAubWVyZ2VXaXRoPURuLHAubmVnYXRlPUl0LHAub21pdD1VbixwLnByb3BlcnR5PXRlLHAucmVqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHhuKHQpP246eCkodCxJdChsdChlLDMpKSl9LHAudG9QbGFpbk9iamVjdD1XdCxwLnZhbHVlcz1RdCxwLmNsb25lRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4geih0LDUpfSxwLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT10eXBlb2YgZT09XCJmdW5jdGlvblwiP2U6cmUseih0LDUsZSl9LHAuZXE9RnQscC5maW5kPWtuLHAuZmluZEluZGV4PWt0LHAuZ2V0PUd0LHAuaGFzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnB0KHQsZSwkKX0scC5oYXNJbj1IdCxwLmlkZW50aXR5PVl0LHAuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4scil7aWYodD1NdCh0KT90OlF0KHQpLFxubj1uJiYhcj9WdChuKTowLHI9dC5sZW5ndGgsMD5uJiYobj10bihyK24sMCkpLE50KHQpKXQ9bjw9ciYmLTE8dC5pbmRleE9mKGUsbik7ZWxzZXtpZihyPSEhcil7aWYoZT09PWUpdDp7Zm9yKG4tPTEscj10Lmxlbmd0aDsrK248cjspaWYodFtuXT09PWUpe3Q9bjticmVhayB0fXQ9LTF9ZWxzZSB0PWModCxpLG4pO3I9LTE8dH10PXJ9cmV0dXJuIHR9LHAuaXNBcmd1bWVudHM9em4scC5pc0FycmF5PXhuLHAuaXNBcnJheUxpa2U9TXQscC5pc0FycmF5TGlrZU9iamVjdD0kdCxwLmlzQnVmZmVyPUVuLHAuaXNFbXB0eT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0cnVlO2lmKE10KHQpJiYoeG4odCl8fHR5cGVvZiB0PT1cInN0cmluZ1wifHx0eXBlb2YgdC5zcGxpY2U9PVwiZnVuY3Rpb25cInx8RW4odCl8fE1uKHQpfHx6bih0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciBlPW1uKHQpO2lmKFwiW29iamVjdCBNYXBdXCI9PWV8fFwiW29iamVjdCBTZXRdXCI9PWUpcmV0dXJuIXQuc2l6ZTtpZihBdCh0KSlyZXR1cm4hVih0KS5sZW5ndGg7XG5mb3IodmFyIG4gaW4gdClpZihVZS5jYWxsKHQsbikpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxwLmlzRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQih0LGUpfSxwLmlzRnVuY3Rpb249RHQscC5pc0xlbmd0aD1VdCxwLmlzTWFwPUluLHAuaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0scC5pc09iamVjdD1CdCxwLmlzT2JqZWN0TGlrZT1QdCxwLmlzUGxhaW5PYmplY3Q9THQscC5pc1NldD1GbixwLmlzU3RyaW5nPU50LHAuaXNTeW1ib2w9Q3QscC5pc1R5cGVkQXJyYXk9TW4scC5sYXN0PXh0LHAuc3R1YkFycmF5PWVlLHAuc3R1YkZhbHNlPW5lLHAudG9GaW5pdGU9VHQscC50b0ludGVnZXI9VnQscC50b051bWJlcj1SdCxwLnRvU3RyaW5nPXF0LHAuVkVSU0lPTj1cIjQuMTcuNVwiLFNlJiYoKFNlLmV4cG9ydHM9cCkuXz1wLE9lLl89cCl9KS5jYWxsKHRoaXMpOyIsIi8qXG5Db3B5cmlnaHQgMjAyMCBBZG9iZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5XG5vZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxudGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG5PRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbmdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuY29uc3QgQ09OU1RBTlRTID0ge1xuICAvKipcbiAgICogQHR5cGVkZWYge1N0cmluZ30gSXRlbVR5cGVcbiAgICoqL1xuXG4gIC8qKlxuICAgKiBFbnVtZXJhdGlvbiBvZiBkYXRhIGxheWVyIGl0ZW0gdHlwZXMuXG4gICAqXG4gICAqIEBlbnVtIHtJdGVtVHlwZX1cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBpdGVtVHlwZToge1xuICAgIC8qKiBSZXByZXNlbnRzIGFuIGl0ZW0gb2YgdHlwZSBkYXRhICovXG4gICAgREFUQTogJ2RhdGEnLFxuICAgIC8qKiBSZXByZXNlbnRzIGFuIGl0ZW0gb2YgdHlwZSBmdW5jdGlvbiAqL1xuICAgIEZDVE46ICdmY3RuJyxcbiAgICAvKiogUmVwcmVzZW50cyBhbiBpdGVtIG9mIHR5cGUgZXZlbnQgKi9cbiAgICBFVkVOVDogJ2V2ZW50JyxcbiAgICAvKiogUmVwcmVzZW50cyBhbiBpdGVtIG9mIHR5cGUgbGlzdGVuZXIgb24gKi9cbiAgICBMSVNURU5FUl9PTjogJ2xpc3RlbmVyT24nLFxuICAgIC8qKiBSZXByZXNlbnRzIGFuIGl0ZW0gb2YgdHlwZSBsaXN0ZW5lciBvZmYgKi9cbiAgICBMSVNURU5FUl9PRkY6ICdsaXN0ZW5lck9mZidcbiAgfSxcblxuICAvKipcbiAgICogQHR5cGVkZWYge1N0cmluZ30gRGF0YUxheWVyRXZlbnRcbiAgICoqL1xuXG4gIC8qKlxuICAgKiBFbnVtZXJhdGlvbiBvZiBkYXRhIGxheWVyIGV2ZW50cy5cbiAgICpcbiAgICogQGVudW0ge0RhdGFMYXllckV2ZW50fVxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIGRhdGFMYXllckV2ZW50OiB7XG4gICAgLyoqIFJlcHJlc2VudHMgYW4gZXZlbnQgdHJpZ2dlcmVkIGZvciBhbnkgY2hhbmdlIGluIHRoZSBkYXRhIGxheWVyIHN0YXRlICovXG4gICAgQ0hBTkdFOiAnYWRvYmVEYXRhTGF5ZXI6Y2hhbmdlJyxcbiAgICAvKiogUmVwcmVzZW50cyBhbiBldmVudCB0cmlnZ2VyZWQgZm9yIGFueSBldmVudCBwdXNoIHRvIHRoZSBkYXRhIGxheWVyICovXG4gICAgRVZFTlQ6ICdhZG9iZURhdGFMYXllcjpldmVudCdcbiAgfSxcblxuICAvKipcbiAgICogQHR5cGVkZWYge1N0cmluZ30gTGlzdGVuZXJTY29wZVxuICAgKiovXG5cbiAgLyoqXG4gICAqIEVudW1lcmF0aW9uIG9mIGxpc3RlbmVyIHNjb3Blcy5cbiAgICpcbiAgICogQGVudW0ge0xpc3RlbmVyU2NvcGV9XG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgbGlzdGVuZXJTY29wZToge1xuICAgIC8qKiBQYXN0IGV2ZW50cyBvbmx5ICovXG4gICAgUEFTVDogJ3Bhc3QnLFxuICAgIC8qKiBGdXR1cmUgZXZlbnRzIG9ubHkgKi9cbiAgICBGVVRVUkU6ICdmdXR1cmUnLFxuICAgIC8qKiBBbGwgZXZlbnRzLCBwYXN0IGFuZCBmdXR1cmUgKi9cbiAgICBBTEw6ICdhbGwnXG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ09OU1RBTlRTO1xuIiwiLypcbkNvcHlyaWdodCAyMDIwIEFkb2JlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcbm9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyXG50aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlNcbk9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZVxuZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmNvbnN0IF8gPSByZXF1aXJlKCcuLi9jdXN0b20tbG9kYXNoJyk7XG5jb25zdCB2ZXJzaW9uID0gcmVxdWlyZSgnLi4vdmVyc2lvbi5qc29uJykudmVyc2lvbjtcbmNvbnN0IGNsb25lRGVlcCA9IF8uY2xvbmVEZWVwO1xuY29uc3QgZ2V0ID0gXy5nZXQ7XG5cbmNvbnN0IEl0ZW0gPSByZXF1aXJlKCcuL2l0ZW0nKTtcbmNvbnN0IExpc3RlbmVyID0gcmVxdWlyZSgnLi9saXN0ZW5lcicpO1xuY29uc3QgTGlzdGVuZXJNYW5hZ2VyID0gcmVxdWlyZSgnLi9saXN0ZW5lck1hbmFnZXInKTtcbmNvbnN0IENPTlNUQU5UUyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5jb25zdCBjdXN0b21NZXJnZSA9IHJlcXVpcmUoJy4vdXRpbHMvY3VzdG9tTWVyZ2UnKTtcblxuLyoqXG4gKiBNYW5hZ2VyXG4gKlxuICogQGNsYXNzIE1hbmFnZXJcbiAqIEBjbGFzc2Rlc2MgRGF0YSBMYXllciBtYW5hZ2VyIHR
1115oYXQgYXVnbWVudHMgdGhlIHBhc3NlZCBkYXRhIGxheWVyIGFycmF5IGFuZCBoYW5kbGVzIGV2ZW50aW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgRGF0YSBMYXllciBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gIGNvbnN0IF9jb25maWcgPSBjb25maWcgfHwge307XG4gIGxldCBfZGF0YUxheWVyID0gW107XG4gIGxldCBfcHJlTG9hZGVkSXRlbXMgPSBbXTtcbiAgbGV0IF9zdGF0ZSA9IHt9O1xuICBsZXQgX2xpc3RlbmVyTWFuYWdlcjtcblxuICBjb25zdCBEYXRhTGF5ZXJNYW5hZ2VyID0ge1xuICAgIGdldFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfc3RhdGU7XG4gICAgfSxcbiAgICBnZXREYXRhTGF5ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF9kYXRhTGF5ZXI7XG4gICAgfVxuICB9O1xuXG4gIF9pbml0aWFsaXplKCk7XG4gIF9hdWdtZW50KCk7XG4gIF9wcm9jZXNzSXRlbXMoKTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGRhdGEgbGF5ZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBfaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoX2NvbmZpZy5kYXRhTGF5ZXIpKSB7XG4gICAgICBfY29uZmlnLmRhdGFMYXllciA9IFtdO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBwcmVsb2FkZWQgaXRlbXMgZnJvbSB0aGUgZGF0YSBsYXllciBhcnJheSBhbmQgYWRkIHRob3NlIHRvIHRoZSBhcnJheSBvZiBwcmVsb2FkZWQgaXRlbXNcbiAgICBfcHJlTG9hZGVkSXRlbXMgPSBfY29uZmlnLmRhdGFMYXllci5zcGxpY2UoMCwgX2NvbmZpZy5kYXRhTGF5ZXIubGVuZ3RoKTtcbiAgICBfZGF0YUxheWVyID0gX2NvbmZpZy5kYXRhTGF5ZXI7XG4gICAgX2RhdGFMYXllci52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICBfc3RhdGUgPSB7fTtcbiAgICBfbGlzdGVuZXJNYW5hZ2VyID0gTGlzdGVuZXJNYW5hZ2VyKERhdGFMYXllck1hbmFnZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSB3aXRoIHRoZSBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gVGhlIGl0ZW0uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBfdXBkYXRlU3RhdGUoaXRlbSkge1xuICAgIF9zdGF0ZSA9IGN1c3RvbU1lcmdlKF9zdGF0ZSwgaXRlbS5kYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogQXVnbWVudHMgdGhlIGRhdGEgbGF5ZXIgQXJyYXkgT2JqZWN0LCBvdmVycmlkaW5nOiBwdXNoKCkgYW5kIGFkZGluZyBnZXRTdGF0ZSgpLCBhZGRFdmVudExpc3RlbmVyIGFuZCByZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gX2F1Z21lbnQoKSB7XG4gICAgLyoqXG4gICAgICogUHVzaGVzIG9uZSBvciBtb3JlIGl0ZW1zIHRvIHRoZSBkYXRhIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsuLi5JdGVtQ29uZmlnfSB2YXJfYXJncyBUaGUgaXRlbXMgdG8gYWRkIHRvIHRoZSBkYXRhIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgbGF5ZXIgZm9sbG93aW5nIHB1c2guXG4gICAgICovXG4gICAgX2RhdGFMYXllci5wdXNoID0gZnVuY3Rpb24odmFyX2FyZ3MpIHsgLyogZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2UgKi9cbiAgICAgIGNvbnN0IHB1c2hBcmd1bWVudHMgPSBhcmd1bWVudHM7XG4gICAgICBjb25zdCBmaWx0ZXJlZEFyZ3VtZW50cyA9IGFyZ3VtZW50cztcblxuICAgICAgT2JqZWN0LmtleXMocHVzaEFyZ3VtZW50cykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IHB1c2hBcmd1bWVudHNba2V5XTtcbiAgICAgICAgY29uc3QgaXRlbSA9IEl0ZW0oaXRlbUNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFpdGVtLnZhbGlkKSB7XG4gICAgICAgICAgX2xvZ0ludmFsaWRJdGVtRXJyb3IoaXRlbSk7XG4gICAgICAgICAgZGVsZXRlIGZpbHRlcmVkQXJndW1lbnRzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIENPTlNUQU5UUy5pdGVtVHlwZS5EQVRBOlxuICAgICAgICAgIGNhc2UgQ09OU1RBTlRTLml0ZW1UeXBlLkVWRU5UOiB7XG4gICAgICAgICAgICBfcHJvY2Vzc0l0ZW0oaXRlbSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDT05TVEFOVFMuaXRlbVR5cGUuRkNUTjoge1xuICAgICAgICAgICAgZGVsZXRlIGZpbHRlcmVkQXJndW1lbnRzW2tleV07XG4gICAgICAgICAgICBfcHJvY2Vzc0l0ZW0oaXRlbSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDT05TVEFOVFMuaXRlbVR5cGUuTElTVEVORVJfT046XG4gICAgICAgICAgY2FzZSBDT05TVEFOVFMuaXRlbVR5cGUuTElTVEVORVJfT0ZGOiB7XG4gICAgICAgICAgICBkZWxldGUgZmlsdGVyZWRBcmd1bWVudHNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmlsdGVyZWRBcmd1bWVudHNbMF0pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMsIGZpbHRlcmVkQXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZGF0YSBsYXllciBzdGF0ZSBvciBvZiB0aGUgb2JqZWN0IGRlZmluZWQgYnkgdGhlIHBhdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSByZXNvbHZlZCB2YWx1ZSBpZiBhIHBhdGggaXMgcGFzc2VkLCBhIGRlZXAgY29weSBvZiB0aGUgZGF0YSBsYXllciBzdGF0ZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgX2RhdGFMYXllci5nZXRTdGF0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgI
1115HJldHVybiBnZXQoY2xvbmVEZWVwKF9zdGF0ZSksIHBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lRGVlcChfc3RhdGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBjYWxsYmFjayBldmVudExpc3RlbmVyQ2FsbGJhY2sgQSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb2NjdXJzLlxuICAgICAqIEB0aGlzIHtEYXRhTGF5ZXJ9XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCBvYmplY3QgcHVzaGVkIHRvIHRoZSBkYXRhIGxheWVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBjYWxsYmFjay5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQSBjYXNlLXNlbnNpdGl2ZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0eXBlIHRvIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtldmVudExpc3RlbmVyQ2FsbGJhY2t9IGNhbGxiYWNrIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9jY3Vycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbmFsIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhdGhdIFRoZSBwYXRoIGluIHRoZSBzdGF0ZSBvYmplY3QgdG8gZmlsdGVyIHRoZSBsaXN0ZW5pbmcgdG8uXG4gICAgICogQHBhcmFtIHsoJ3Bhc3QnfCdmdXR1cmUnfCdhbGwnKX0gW29wdGlvbnMuc2NvcGVdIFRoZSB0aW1pbmcgdG8gZmlsdGVyIHRoZSBsaXN0ZW5pbmcgdG86XG4gICAgICogICAgICAtIHtTdHJpbmd9IHBhc3QgVGhlIGxpc3RlbmVyIGlzIHRyaWdnZXJlZCBmb3IgcGFzdCBldmVudHMgb25seS5cbiAgICAgKiAgICAgIC0ge1N0cmluZ30gZnV0dXJlIFRoZSBsaXN0ZW5lciBpcyB0cmlnZ2VyZWQgZm9yIGZ1dHVyZSBldmVudHMgb25seS5cbiAgICAgKiAgICAgIC0ge1N0cmluZ30gYWxsIFRoZSBsaXN0ZW5lciBpcyB0cmlnZ2VyZWQgZm9yIGJvdGggcGFzdCBhbmQgZnV0dXJlIGV2ZW50cyAoZGVmYXVsdCB2YWx1ZSkuXG4gICAgICovXG4gICAgX2RhdGFMYXllci5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJJdGVtID0gSXRlbSh7XG4gICAgICAgIG9uOiB0eXBlLFxuICAgICAgICBoYW5kbGVyOiBjYWxsYmFjayxcbiAgICAgICAgc2NvcGU6IG9wdGlvbnMgJiYgb3B0aW9ucy5zY29wZSxcbiAgICAgICAgcGF0aDogb3B0aW9ucyAmJiBvcHRpb25zLnBhdGhcbiAgICAgIH0pO1xuXG4gICAgICBfcHJvY2Vzc0l0ZW0oZXZlbnRMaXN0ZW5lckl0ZW0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIGFkZEV2ZW50TGlzdGVuZXIoKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgY2FzZS1zZW5zaXRpdmUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtsaXN0ZW5lcl0gT3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyB0byBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIF9kYXRhTGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVySXRlbSA9IEl0ZW0oe1xuICAgICAgICBvZmY6IHR5cGUsXG4gICAgICAgIGhhbmRsZXI6IGxpc3RlbmVyXG4gICAgICB9KTtcblxuICAgICAgX3Byb2Nlc3NJdGVtKGV2ZW50TGlzdGVuZXJJdGVtKTtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYWxsIGl0ZW1zIHRoYXQgYWxyZWFkeSBleGlzdCBvbiB0aGUgc3RhY2suXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBfcHJvY2Vzc0l0ZW1zKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX3ByZUxvYWRlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfZGF0YUxheWVyLnB1c2goX3ByZUxvYWRlZEl0ZW1zW2ldKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhbiBpdGVtIHB1c2hlZCB0byB0aGUgc3RhY2suXG4gICAqXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSBUaGUgaXRlbSB0byBwcm9jZXNzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gX3Byb2Nlc3NJdGVtKGl0ZW0pIHtcbiAgICBpZiAoIWl0ZW0udmFsaWQpIHtcbiAgICAgIF9sb2dJbnZhbGlkSXRlbUVycm9yKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGl0ZW1zIGJlZm9yZSB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJdGVtfSBpdGVtIFRoZSBpdGVtLlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxJdGVtPn0gVGhlIGl0ZW1zIGJlZm9yZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9nZXRCZWZvcmUoaXRlbSkge1xuICAgICAgaWYgKCEoX2RhdGFMYXllci5sZW5ndGggPT09IDAgfHwgaXRlbS5pbmRleCA+IF9kYXRhTGF5ZXIubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgcmV0dXJuIF9kYXRhTGF5ZXIuc2xpY2UoMCwgaXRlbS5pbmRleCkubWFwKGl0ZW1Db25maWcgPT4gSXRlbShpdGVtQ29uZmlnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZVByb2Nlc3NvcnMgPSB7XG4gICAgICBkYXRhOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIF91cGRhdGVTdGF0ZShpdGVtKTtcbiAgICAgICAgX2xpc3RlbmVyTWFuYWdlci50cmlnZ2VyTGlzdGVuZXJzKGl0ZW0pO1xuICAgICAgfSxcbiAgICAgIGZjdG46IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaXRlbS5jb25maWcuY2FsbChfZGF0YUxheWVyLCBfZGF0YUxheWVyKTtcbiAgICAgIH0sXG4gICAgICBldmVudDogZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbS5kYXRhKSB7XG4gICAgICAgICAgX3VwZGF0ZVN0YXRlKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIF9saXN0ZW5lck1hbmFnZXIudHJpZ2dlckxpc3RlbmVycyhpdGVtKTtcbiAgICAgIH0sXG4gICAgICBsaXN0ZW5lck9uOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gTGlzdGVuZXIoaXRlbSk7XG4gICAgICAgI
1115HN3aXRjaCAobGlzdGVuZXIuc2NvcGUpIHtcbiAgICAgICAgICBjYXNlIENPTlNUQU5UUy5saXN0ZW5lclNjb3BlLlBBU1Q6IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZEl0ZW0gb2YgX2dldEJlZm9yZShpdGVtKSkge1xuICAgICAgICAgICAgICBfbGlzdGVuZXJNYW5hZ2VyLnRyaWdnZXJMaXN0ZW5lcihsaXN0ZW5lciwgcmVnaXN0ZXJlZEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQ09OU1RBTlRTLmxpc3RlbmVyU2NvcGUuRlVUVVJFOiB7XG4gICAgICAgICAgICBfbGlzdGVuZXJNYW5hZ2VyLnJlZ2lzdGVyKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIENPTlNUQU5UUy5saXN0ZW5lclNjb3BlLkFMTDoge1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IF9saXN0ZW5lck1hbmFnZXIucmVnaXN0ZXIobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCByZWdpc3RlcmVkSXRlbSBvZiBfZ2V0QmVmb3JlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgX2xpc3RlbmVyTWFuYWdlci50cmlnZ2VyTGlzdGVuZXIobGlzdGVuZXIsIHJlZ2lzdGVyZWRJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3RlbmVyT2ZmOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIF9saXN0ZW5lck1hbmFnZXIudW5yZWdpc3RlcihMaXN0ZW5lcihpdGVtKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHR5cGVQcm9jZXNzb3JzW2l0ZW0udHlwZV0oaXRlbSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvZ3MgZXJyb3IgZm9yIGludmFsaWQgaXRlbSBwdXNoZWQgdG8gdGhlIGRhdGEgbGF5ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSBUaGUgaW52YWxpZCBpdGVtLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gX2xvZ0ludmFsaWRJdGVtRXJyb3IoaXRlbSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSAnVGhlIGZvbGxvd2luZyBpdGVtIGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSBkYXRhIGxheWVyICcgK1xuICAgICAgJ2JlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdDogJyArXG4gICAgICBKU09OLnN0cmluZ2lmeShpdGVtLmNvbmZpZyk7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfTtcblxuICByZXR1cm4gRGF0YUxheWVyTWFuYWdlcjtcbn07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMjAgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxub2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbnRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG5nb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuY29uc3QgRGF0YUxheWVyTWFuYWdlciA9IHJlcXVpcmUoJy4vZGF0YUxheWVyTWFuYWdlcicpO1xuXG4vKipcbiAqIERhdGEgTGF5ZXIuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuY29uc3QgRGF0YUxheWVyID0ge1xuICBNYW5hZ2VyOiBEYXRhTGF5ZXJNYW5hZ2VyXG59O1xuXG53aW5kb3cuYWRvYmVEYXRhTGF5ZXIgPSB3aW5kb3cuYWRvYmVEYXRhTGF5ZXIgfHwgW107XG5cbi8vIElmIGRhdGEgbGF5ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgZG8gbm90IHJlLWluaXRpYWxpemUuXG5pZiAod2luZG93LmFkb2JlRGF0YUxheWVyLnZlcnNpb24pIHtcbiAgY29uc29sZS53YXJuKFxuICAgIGBBZG9iZSBDbGllbnQgRGF0YSBMYXllciB2JHt3aW5kb3cuYWRvYmVEYXRhTGF5ZXIudmVyc2lvbn0gaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZC9pbml0aWFsaXplZCBvbiB0aGlzIHBhZ2UuIFlvdSBtYXkgYmUgZXJyb25lb3VzbHkgbG9hZGluZyBpdCBhIHNlY29uZCB0aW1lLmBcbiAgKTtcbn0gZWxzZSB7XG4gIERhdGFMYXllci5NYW5hZ2VyKHtcbiAgICBkYXRhTGF5ZXI6IHdpbmRvdy5hZG9iZURhdGFMYXllclxuICB9KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiAge09iamVjdH0gTGlzdGVuZXJPbkNvbmZpZ1xuICogQHByb3BlcnR5IHtTdHJpbmd9IG9uIE5hbWUgb2YgdGhlIGV2ZW50IHRvIGJpbmQgdG8uXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3BhdGhdIE9iamVjdCBrZXkgaW4gdGhlIHN0YXRlIHRvIGJpbmQgdG8uXG4gKiBAcHJvcGVydHkge0xpc3RlbmVyU2NvcGV9IFtzY29wZV0gU2NvcGUgb2YgdGhlIGxpc3RlbmVyLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gaGFuZGxlciBIYW5kbGVyIHRvIGV4ZWN1dGUgd2hlbiB0aGUgYm91bmQgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgIHtPYmplY3R9IExpc3RlbmVyT2ZmQ29uZmlnXG4gKiBAcHJvcGVydHkge1N0cmluZ30gb2ZmIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHVuYmluZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbcGF0aF0gT2JqZWN0IGtleSBpbiB0aGUgc3RhdGUgdG8gYmluZCB0by5cbiAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJTY29wZX0gW3Njb3BlXSBTY29wZSBvZiB0aGUgbGlzdGVuZXIuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBbaGFuZGxlcl0gSGFuZGxlciBmb3IgYSBwcmV2aW91c2x5IGF0dGFjaGVkIGV2ZW50IHRvIHVuYmluZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERhdGFDb25maWdcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhIERhdGEgdG8gYmUgdXBkYXRlZCBpbiB0aGUgc3RhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudENvbmZpZ1xuICogQHByb3BlcnR5IHtTdHJpbmd9IGV2ZW50IE5hbWUgb2YgdGhlIGV2ZW50LlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtldmVudEluZm9dIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gcGFzcyB0byB0aGUgZXZlbnQgaGFuZGxlci5cbiAqIEBwcm9wZXJ0eSB7RGF0YUNvbmZpZy5kYXRhfSBbZGF0YV0gRGF0YSB0byBiZSB1cGRhdGVkIGluIHRoZSBzdGF0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtEYXRhQ29uZmlnIHwgRXZlbnRDb25maWcgfCBMaXN0ZW5lck9uQ29uZmlnIHwgTGlzdGVuZXJPZmZDb25maWd9IEl0ZW1Db25maWdcbiAqL1xuXG4vKipcbiAqIFRyaWdnZXJlZCB3aGVuIHRoZXJlIGlzIGNoYW5nZSBpbiB0aGUgZGF0YSBsYXllciBzdGF0ZS5cbiAqXG4gKiBAZXZlbnQgRGF0YUxheWVyRXZlbnQuQ0hBTkdFXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByb3BlcnR5IHtPYmplY3R9IGRhdGEgRGF0YSBwdXNoZWQgdGhhdCBjYXVzZWQgYSBjaGFuZ2UgaW4gdGhlIGRhdGEgbGF5ZXIgc3RhdGUuXG4gKi9cblxuLyoqXG4gKiBUcmlnZ2VyZWQgd2hlbiBhbiBldmVudCBpcyBwdXNoZWQgdG8gdGhlIGRhdGEgbGF5ZXIuXG4gKlxuICogQGV2ZW50IERhdGFMYXllckV2ZW50LkVWRU5UXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgY29tbWl0dGVkIGV2ZW50LlxuICogQHByb3BlcnR5IHtPYmplY3R9IGV2ZW50SW5mbyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHBhc3NlZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnQuXG4gKiBAcHJvcGVydHkge09iamVjdH0gZGF0YSBEYXRhIHRoYXQgd2FzIHB1c2hlZCBhbG9uZ3NpZGUgdGhlIGV2ZW50LlxuICovXG5cbi8qKlxuICogVHJpZ2dlcmVkIHdoZW4gYW4gYXJi
1115aXRyYXJ5IGV2ZW50IGlzIHB1c2hlZCB0byB0aGUgZGF0YSBsYXllci5cbiAqXG4gKiBAZXZlbnQgPGN1c3RvbT5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBjb21taXR0ZWQgZXZlbnQuXG4gKiBAcHJvcGVydHkge09iamVjdH0gZXZlbnRJbmZvIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcGFzc2VkIHdpdGggdGhlIGNvbW1pdHRlZCBldmVudC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhIERhdGEgdGhhdCB3YXMgcHVzaGVkIGFsb25nc2lkZSB0aGUgZXZlbnQuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhTGF5ZXI7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMjAgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxub2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbnRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG5nb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuY29uc3QgXyA9IHJlcXVpcmUoJy4uL2N1c3RvbS1sb2Rhc2gnKTtcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSBfLmlzUGxhaW5PYmplY3Q7XG5jb25zdCBpc0VtcHR5ID0gXy5pc0VtcHR5O1xuY29uc3Qgb21pdCA9IF8ub21pdDtcbmNvbnN0IGZpbmQgPSBfLmZpbmQ7XG5cbmNvbnN0IGRhdGFNYXRjaGVzQ29udHJhaW50cyA9IHJlcXVpcmUoJy4vdXRpbHMvZGF0YU1hdGNoZXNDb250cmFpbnRzJyk7XG5jb25zdCBJVEVNX0NPTlNUUkFJTlRTID0gcmVxdWlyZSgnLi9pdGVtQ29uc3RyYWludHMnKTtcbmNvbnN0IENPTlNUQU5UUyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIGRhdGEgbGF5ZXIgaXRlbS5cbiAqXG4gKiBAcGFyYW0ge0l0ZW1Db25maWd9IGl0ZW1Db25maWcgVGhlIGRhdGEgbGF5ZXIgaXRlbSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFRoZSBpdGVtIGluZGV4IGluIHRoZSBhcnJheSBvZiBleGlzdGluZyBpdGVtcy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZW1Db25maWcsIGluZGV4KSB7XG4gIGNvbnN0IF9jb25maWcgPSBpdGVtQ29uZmlnO1xuICBjb25zdCBfaW5kZXggPSBpbmRleDtcbiAgY29uc3QgX3R5cGUgPSBnZXRUeXBlKCk7XG4gIGNvbnN0IF9kYXRhID0gZ2V0RGF0YSgpO1xuICBjb25zdCBfdmFsaWQgPSAhIV90eXBlO1xuXG4gIGZ1bmN0aW9uIGdldFR5cGUoKSB7XG4gICAgcmV0dXJuIGZpbmQoT2JqZWN0LmtleXMoSVRFTV9DT05TVFJBSU5UUyksIGtleSA9PiBkYXRhTWF0Y2hlc0NvbnRyYWludHMoX2NvbmZpZywgSVRFTV9DT05TVFJBSU5UU1trZXldKSkgfHxcbiAgICAgICh0eXBlb2YgX2NvbmZpZyA9PT0gJ2Z1bmN0aW9uJyAmJiBDT05TVEFOVFMuaXRlbVR5cGUuRkNUTikgfHxcbiAgICAgIChpc1BsYWluT2JqZWN0KF9jb25maWcpICYmIENPTlNUQU5UUy5pdGVtVHlwZS5EQVRBKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERhdGEoKSB7XG4gICAgY29uc3QgZGF0YSA9IG9taXQoX2NvbmZpZywgT2JqZWN0LmtleXMoSVRFTV9DT05TVFJBSU5UUy5ldmVudCkpO1xuICAgIGlmICghaXNFbXB0eShkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SXRlbUNvbmZpZ30gVGhlIGl0ZW0gY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBjb25maWc6IF9jb25maWcsXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7aXRlbVR5cGV9IFRoZSBpdGVtIHR5cGUuXG4gICAgICovXG4gICAgdHlwZTogX3R5cGUsXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RGF0YUNvbmZpZ30gVGhlIGl0ZW0gZGF0YS5cbiAgICAgKi9cbiAgICBkYXRhOiBfZGF0YSxcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHR
1115oZSBpdGVtIGlzIHZhbGlkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB2YWxpZDogX3ZhbGlkLFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGFycmF5IG9mIGV4aXN0aW5nIGl0ZW1zIChhZGRlZCB3aXRoIHRoZSBzdGFuZGFyZCBBcnJheS5wcm90b3R5cGUucHVzaCgpKVxuICAgICAqXG4gICAgICogQHJldHVybnMge051bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBhcnJheSBvZiBleGlzdGluZyBpdGVtcyBpZiBpdCBleGlzdHMsIC0xIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpbmRleDogX2luZGV4XG4gIH07XG59O1xuIiwiLypcbkNvcHlyaWdodCAyMDIwIEFkb2JlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcbm9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyXG50aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlNcbk9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZVxuZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbi8qKlxuICogQ29uc3RyYWludHMgZm9yIGVhY2ggdHlwZSBvZiB0aGUgaXRlbSBjb25maWd1cmF0aW9uLlxuICovXG5cbmNvbnN0IGl0ZW1Db25zdHJhaW50cyA9IHtcbiAgZXZlbnQ6IHtcbiAgICBldmVudDoge1xuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9LFxuICAgIGV2ZW50SW5mbzoge1xuICAgICAgb3B0aW9uYWw6IHRydWVcbiAgICB9XG4gIH0sXG4gIGxpc3RlbmVyT246IHtcbiAgICBvbjoge1xuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9LFxuICAgIGhhbmRsZXI6IHtcbiAgICAgIHR5cGU6ICdmdW5jdGlvbidcbiAgICB9LFxuICAgIHNjb3BlOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHZhbHVlczogWydwYXN0JywgJ2Z1dHVyZScsICdhbGwnXSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgfSxcbiAgICBwYXRoOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgfVxuICB9LFxuICBsaXN0ZW5lck9mZjoge1xuICAgIG9mZjoge1xuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9LFxuICAgIGhhbmRsZXI6IHtcbiAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICBvcHRpb25hbDogdHJ1ZVxuICAgIH0sXG4gICAgc2NvcGU6IHtcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgdmFsdWVzOiBbJ3Bhc3QnLCAnZnV0dXJlJywgJ2FsbCddLFxuICAgICAgb3B0aW9uYWw6IHRydWVcbiAgICB9LFxuICAgIHBhdGg6IHtcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgb3B0aW9uYWw6IHRydWVcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXRlbUNvbnN0cmFpbnRzO1xuIiwiLypcbkNvcHlyaWdodCAyMDIwIEFkb2JlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcbm9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyXG50aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlNcbk9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZVxuZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmNvbnN0IENPTlNUQU5UUyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIGRhdGEgbGF5ZXIgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtJdGVtfSBpdGVtIFRoZSBpdGVtIGZyb20gd2hpY2ggdG8gY29uc3RydWN0IHRoZSBsaXN0ZW5lci5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY29uc3QgX2V2ZW50ID0gaXRlbS5jb25maWcub24gfHwgaXRlbS5jb25maWcub2ZmO1xuICBjb25zdCBfaGFuZGxlciA9IGl0ZW0uY29uZmlnLmhhbmRsZXIgfHwgbnVsbDtcbiAgY29uc3QgX3Njb3BlID0gaXRlbS5jb25maWcuc2NvcGUgfHwgKGl0ZW0uY29uZmlnLm9uICYmIENPTlNUQU5UUy5saXN0ZW5lclNjb3BlLkFMTCkgfHwgbnVsbDtcbiAgY29uc3QgX3BhdGggPSBpdGVtLmNvbmZpZy5wYXRoIHx8IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0ZW5lciBldmVudCBuYW1lLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIGxpc3RlbmVyIGV2ZW50IG5hbWUuXG4gICAgICovXG4gICAgZXZlbnQ6IF9ldmVudCxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7KEZ1bmN0aW9ufG51bGwpfSBUaGUgbGlzdGVuZXIgaGFuZGxlci5cbiAgICAgKi9cbiAgICBoYW5kbGVyOiBfaGFuZGxlcixcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpc3RlbmVyIHNjb3BlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyhTd
1115HJpbmd8bnVsbCl9IFRoZSBsaXN0ZW5lciBzY29wZS5cbiAgICAgKi9cbiAgICBzY29wZTogX3Njb3BlLFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdGVuZXIgcGF0aC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHsoU3RyaW5nfG51bGwpfSBUaGUgbGlzdGVuZXIgcGF0aC5cbiAgICAgKi9cbiAgICBwYXRoOiBfcGF0aFxuICB9O1xufTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAyMCBBZG9iZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5XG5vZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxudGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG5PRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbmdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5jb25zdCBfID0gcmVxdWlyZSgnLi4vY3VzdG9tLWxvZGFzaCcpO1xuY29uc3QgY2xvbmVEZWVwID0gXy5jbG9uZURlZXA7XG5cbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5jb25zdCBsaXN0ZW5lck1hdGNoID0gcmVxdWlyZSgnLi91dGlscy9saXN0ZW5lck1hdGNoJyk7XG5jb25zdCBpbmRleE9mTGlzdGVuZXIgPSByZXF1aXJlKCcuL3V0aWxzL2luZGV4T2ZMaXN0ZW5lcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBsaXN0ZW5lciBtYW5hZ2VyLlxuICpcbiAqIEBwYXJhbSB7TWFuYWdlcn0gZGF0YUxheWVyTWFuYWdlciBUaGUgZGF0YSBsYXllciBtYW5hZ2VyLlxuICogQHJldHVybnMge0xpc3RlbmVyTWFuYWdlcn0gQSBsaXN0ZW5lciBtYW5hZ2VyLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGFMYXllck1hbmFnZXIpIHtcbiAgY29uc3QgX2xpc3RlbmVycyA9IHt9O1xuICBjb25zdCBfZGF0YUxheWVyTWFuYWdlciA9IGRhdGFMYXllck1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEZpbmQgaW5kZXggb2YgbGlzdGVuZXIgaW4gbGlzdGVuZXJzIG9iamVjdC5cbiAgICovXG4gIGNvbnN0IF9pbmRleE9mTGlzdGVuZXIgPSBpbmRleE9mTGlzdGVuZXIuYmluZChudWxsLCBfbGlzdGVuZXJzKTtcblxuICBjb25zdCBMaXN0ZW5lck1hbmFnZXIgPSB7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIuXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0xpc3RlbmVyfSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIuXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGxpc3RlbmVyIHdhcyByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICBjb25zdCBldmVudCA9IGxpc3RlbmVyLmV2ZW50O1xuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9saXN0ZW5lcnMsIGV2ZW50KSkge1xuICAgICAgICBpZiAoX2luZGV4T2ZMaXN0ZW5lcihsaXN0ZW5lcikgPT09IC0xKSB7XG4gICAgICAgICAgX2xpc3RlbmVyc1tsaXN0ZW5lci5ldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9saXN0ZW5lcnNbbGlzdGVuZXIuZXZlbnRdID0gW2xpc3RlbmVyXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhIGxpc3RlbmVyLlxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHVucmVnaXN0ZXIuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcjogZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbGlzdGVuZXIuZXZlbnQ7XG5cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX2xpc3RlbmVycywgZXZlbnQpKSB7XG4gICAgICAgIGlmICghKGxpc3RlbmVyLmhhbmRsZXIgfHwgbGlzdGVuZXIuc2NvcGUgfHwgbGlzdGVuZXIucGF0aCkpIHtcbiAgICAgICAgICBfbGlzdGVuZXJzW2V2ZW50XSA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gX2luZGV4T2ZMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIF9saXN0ZW5lcnNbZXZlbnRdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBsaXN0ZW5lcnMgcmVsYXRlZCB0byB0aGUgcGFzc2VkIGl0ZW0uXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gSXRlbSB0byB0cmlnZ2VyIGxpc3RlbmVyIGZvci5cbiAgICAgKi9cbiAgICB0cmlnZ2VyTGlzdGVuZXJzOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyZWRFdmVudHMgPSBfZ2V0VHJpZ2dlcmVkRXZlbnRzKGl0ZW0pO1xuICAgICAgdHJpZ2dlcmVkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfbGlzdGVuZXJzLCBldmVudCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIF9saXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICBfY2FsbEhhbmRsZXIobGlzdGVuZXIsIGl0ZW0pO1xuICAgICAgICAgI
1115H1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBhIHNpbmdsZSBsaXN0ZW5lciBvbiB0aGUgcGFzc2VkIGl0ZW0uXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0xpc3RlbmVyfSBsaXN0ZW5lciBMaXN0ZW5lciB0byBjYWxsLlxuICAgICAqIEBwYXJhbSB7SXRlbX0gaXRlbSBJdGVtIHRvIGNhbGwgdGhlIGxpc3RlbmVyIHdpdGguXG4gICAgICovXG4gICAgdHJpZ2dlckxpc3RlbmVyOiBmdW5jdGlvbihsaXN0ZW5lciwgaXRlbSkge1xuICAgICAgX2NhbGxIYW5kbGVyKGxpc3RlbmVyLCBpdGVtKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBsaXN0ZW5lciBoYW5kbGVyIG9uIHRoZSBpdGVtIGlmIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdGVuZXJ9IGxpc3RlbmVyIFRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIFRoZSBpdGVtLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gX2NhbGxIYW5kbGVyKGxpc3RlbmVyLCBpdGVtKSB7XG4gICAgaWYgKGxpc3RlbmVyTWF0Y2gobGlzdGVuZXIsIGl0ZW0pKSB7XG4gICAgICBjb25zdCBjYWxsYmFja0FyZ3MgPSBbY2xvbmVEZWVwKGl0ZW0uY29uZmlnKV07XG4gICAgICBsaXN0ZW5lci5oYW5kbGVyLmFwcGx5KF9kYXRhTGF5ZXJNYW5hZ2VyLmdldERhdGFMYXllcigpLCBjYWxsYmFja0FyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZXZlbnRzIHRoYXQgYXJlIHRyaWdnZXJlZCBmb3IgdGhpcyBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gVGhlIGl0ZW0uXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgbmFtZXMgb2YgdGhlIGV2ZW50cyB0aGF0IGFyZSB0cmlnZ2VyZWQgZm9yIHRoaXMgaXRlbS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIF9nZXRUcmlnZ2VyZWRFdmVudHMoaXRlbSkge1xuICAgIGNvbnN0IHRyaWdnZXJlZEV2ZW50cyA9IFtdO1xuXG4gICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgIGNhc2UgY29uc3RhbnRzLml0ZW1UeXBlLkRBVEE6IHtcbiAgICAgICAgdHJpZ2dlcmVkRXZlbnRzLnB1c2goY29uc3RhbnRzLmRhdGFMYXllckV2ZW50LkNIQU5HRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBjb25zdGFudHMuaXRlbVR5cGUuRVZFTlQ6IHtcbiAgICAgICAgdHJpZ2dlcmVkRXZlbnRzLnB1c2goY29uc3RhbnRzLmRhdGFMYXllckV2ZW50LkVWRU5UKTtcbiAgICAgICAgaWYgKGl0ZW0uZGF0YSkgdHJpZ2dlcmVkRXZlbnRzLnB1c2goY29uc3RhbnRzLmRhdGFMYXllckV2ZW50LkNIQU5HRSk7XG4gICAgICAgIGlmIChpdGVtLmNvbmZpZy5ldmVudCAhPT0gY29uc3RhbnRzLmRhdGFMYXllckV2ZW50LkNIQU5HRSkge1xuICAgICAgICAgIHRyaWdnZXJlZEV2ZW50cy5wdXNoKGl0ZW0uY29uZmlnLmV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJlZEV2ZW50cztcbiAgfVxuXG4gIHJldHVybiBMaXN0ZW5lck1hbmFnZXI7XG59O1xuIiwiLypcbkNvcHlyaWdodCAyMDIwIEFkb2JlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHlcbm9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyXG50aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlNcbk9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZVxuZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmNvbnN0IF8gPSByZXF1aXJlKCcuLi8uLi9jdXN0b20tbG9kYXNoJyk7XG5jb25zdCBoYXMgPSBfLmhhcztcbmNvbnN0IGdldCA9IF8uZ2V0O1xuXG4vKipcbiAgKiBDaGVja3MgaWYgdGhlIG9iamVjdCBjb250YWlucyBhbiBhbmNlc3RvciB0aGF0IGlzIHNldCB0byBudWxsIG9yIHVuZGVmaW5lZC5cbiAgKlxuICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay5cbiAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGNvbnRhaW5zIGFuIGFuY2VzdG9yIHRoYXQgaXMgc2V0IHRvIG51bGwgb3IgdW5kZWZpbmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICogQHByaXZhdGVcbiAgKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBwYXRoKSB7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKCcuJykpO1xuICB3aGlsZSAoYW5jZXN0b3JQYXRoKSB7XG4gICAgaWYgKGhhcyhvYmplY3QsIGFuY2VzdG9yUGF0aCkpIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yVmFsdWUgPSBnZXQob2JqZWN0LCBhbmNlc3RvclBhdGgpO1xuICAgICAgaWYgKGFuY2VzdG9yVmFsdWUgPT09IG51bGwgfHwgYW5jZXN0b3JWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBhbmNlc3RvclBhdGggPSBhbmNlc3RvclBhdGguc3Vic3RyaW5nKDAsIGFuY2VzdG9yUGF0aC5sYXN0SW5kZXhPZignLicpKTtcbiAgfVxuXG4gIHJldHVybi
1115BmYWxzZTtcbn07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMjAgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxub2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbnRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG5nb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuY29uc3QgXyA9IHJlcXVpcmUoJy4uLy4uL2N1c3RvbS1sb2Rhc2gnKTtcbmNvbnN0IGNsb25lRGVlcFdpdGggPSBfLmNsb25lRGVlcFdpdGg7XG5jb25zdCBpc09iamVjdCA9IF8uaXNPYmplY3Q7XG5jb25zdCBpc0FycmF5ID0gXy5pc0FycmF5O1xuY29uc3QgcmVqZWN0ID0gXy5yZWplY3Q7XG5jb25zdCBtZXJnZVdpdGggPSBfLm1lcmdlV2l0aDtcbmNvbnN0IGlzTnVsbCA9IF8uaXNOdWxsO1xuXG4vKipcbiAqIE1lcmdlcyB0aGUgc291cmNlIGludG8gdGhlIG9iamVjdCBhbmQgc2V0cyBvYmplY3RzIGFzICd1bmRlZmluZWQnIGlmIHRoZXkgYXJlICd1bmRlZmluZWQnIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBpbnRvIHdoaWNoIHRvIG1lcmdlLlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1lcmdlIHdpdGguXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgb2JqZWN0IGludG8gd2hpY2ggc291cmNlIHdhcyBtZXJnZWQgaW4uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgY29uc3QgbWFrZU9taXR0aW5nQ2xvbmVEZWVwQ3VzdG9taXplciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBvbWl0dGluZ0Nsb25lRGVlcEN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KHZhbHVlLCBwcmVkaWNhdGUpLm1hcChpdGVtID0+IGNsb25lRGVlcFdpdGgoaXRlbSwgb21pdHRpbmdDbG9uZURlZXBDdXN0b21pemVyKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHN1YktleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoIXByZWRpY2F0ZSh2YWx1ZVtzdWJLZXldKSkge1xuICAgICAgICAgICAgY2xvbmVbc3ViS2V5XSA9IGNsb25lRGVlcFdpdGgodmFsdWVbc3ViS2V5XSwgb21pdHRpbmdDbG9uZURlZXBDdXN0b21pemVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGN1c3RvbWl6ZXIgPSBmdW5jdGlvbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgaWYgKHR5cGVvZiBzcmNWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc3JjVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBvbWl0RGVlcCA9IGZ1bmN0aW9uKHZhbHVlLCBwcmVkaWNhdGUgPSAodmFsKSA9PiAhdmFsKSB7XG4gICAgcmV0dXJuIGNsb25lRGVlcFdpdGgodmFsdWUsIG1ha2VPbWl0dGluZ0Nsb25lRGVlcEN1c3RvbWl6ZXIocHJlZGljYXRlKSk7XG4gIH07XG5cbiAgbWVyZ2VXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcblxuICAvLyBSZW1vdmUgbnVsbCBvciB1bmRlZmluZWQgb2JqZWN0c1xuICBvYmplY3QgPSBvbWl0RGVlcChvYmplY3QsIGlzTnVsbCk7XG5cbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMjAgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxub2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbnRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG5nb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuY29uc3QgXyA9IHJlcXVpcmUoJy4uLy4uL2N1c3RvbS1sb2Rhc2gnKTtcbmNvbnN0IGZpbmQgPSBfLmZpbmQ7XG5jb25zdCBpbmNsdWRlcyA9IF8uaW5jbHVkZXM7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZGF0YSwgY29uc3RyYWludHMpIHtcbiAgLy8gR28gdGhyb3VnaCBhbGwgY29uc3RyYWludHMgYW5kIGZpbmQgb25lIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBkYXRhXG4gIGNvbnN0IGZvdW5kT2JqZWN0aW9uID0gZmluZChPYmplY3Qua2V5cyhjb25zdHJhaW50cyksIGtleSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGNvbnN0cmFpbnRzW2tleV0udHlwZTtcbiAgICBjb25zdCBzdXBwb3J0ZWRWYWx1ZXMgPSBrZXkgJiYgY29uc3RyYWludHNba2V5XS52YWx1ZXM7XG4gICAgY29uc3QgbWFuZGF0b3J5ID0gIWNvbnN0cmFpbnRzW2tleV0ub3B0aW9uYWw7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XG4gICAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGNvbnN0IGluY29ycmVjdFR5cGUgPSB0eXBlICYmIHZhbHVlVHlwZSAhPT0gdHlwZTtcbiAgICBjb25zdCBub01hdGNoRm9yU3VwcG9ydGVkVmFsdWVzID0gc3VwcG9ydGVkVmFsdWVzICYmICFpbmNsdWRlcyhzdXBwb3J0ZWRWYWx1ZXMsIHZhbHVlKTtcbiAgICBpZiAobWFuZGF0b3J5KSB7XG4gICAgICByZXR1cm4gIXZhbHVlIHx8IGluY29ycmVjdFR5cGUgfHwgbm9NYXRjaEZvclN1cHBvcnRlZFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlICYmIChpbmNvcnJlY3RUeXBlIHx8IG5vTWF0Y2hGb3JTdXBwb3J0ZWRWYWx1ZXMpO1xuICAgIH1cbiAgfSk7XG4gIC8vIElmIG5vIG9iamVjdGlvbnMgZm91bmQgdGhlbiBkYXRhIG1hdGNoZXMgY29udHJhaW50c1xuICByZXR1cm4gdHlwZW9mIGZvdW5kT2JqZWN0aW9uID09PSAndW5kZWZpbmVkJztcbn07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMjAgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiA
1115yLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxub2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbnRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OU1xuT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlXG5nb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuY29uc3QgXyA9IHJlcXVpcmUoJy4uLy4uL2N1c3RvbS1sb2Rhc2gnKTtcbmNvbnN0IGlzRXF1YWwgPSBfLmlzRXF1YWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obGlzdGVuZXJzLCBsaXN0ZW5lcikge1xuICBjb25zdCBldmVudCA9IGxpc3RlbmVyLmV2ZW50O1xuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGlzdGVuZXJzLCBldmVudCkpIHtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVnaXN0ZXJlZExpc3RlbmVyXSBvZiBsaXN0ZW5lcnNbZXZlbnRdLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGlzRXF1YWwocmVnaXN0ZXJlZExpc3RlbmVyLmhhbmRsZXIsIGxpc3RlbmVyLmhhbmRsZXIpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAyMCBBZG9iZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgZmlsZSBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5XG5vZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxudGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG5PRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbmdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5jb25zdCBfID0gcmVxdWlyZSgnLi4vLi4vY3VzdG9tLWxvZGFzaCcpO1xuY29uc3QgaGFzID0gXy5oYXM7XG5cbmNvbnN0IENPTlNUQU5UUyA9IHJlcXVpcmUoJy4uL2NvbnN0YW50cycpO1xuY29uc3QgYW5jZXN0b3JSZW1vdmVkID0gcmVxdWlyZSgnLi9hbmNlc3RvclJlbW92ZWQnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGxpc3RlbmVyIG1hdGNoZXMgdGhlIGl0ZW0uXG4gKlxuICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIHtJdGVtfSBpdGVtIFRoZSBpdGVtLlxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgbGlzdGVuZXIgbWF0Y2hlcyB0aGUgaXRlbSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBsaXN0ZW5lck1hdGNoKGxpc3RlbmVyLCBpdGVtKSB7XG4gIGNvbnN0IGV2ZW50ID0gbGlzdGVuZXIuZXZlbnQ7XG4gIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLmNvbmZpZztcbiAgbGV0IG1hdGNoZXMgPSBmYWxzZTtcblxuICBpZiAoaXRlbS50eXBlID09PSBDT05TVEFOVFMuaXRlbVR5cGUuREFUQSkge1xuICAgIGlmIChldmVudCA9PT0gQ09OU1RBTlRTLmRhdGFMYXllckV2ZW50LkNIQU5HRSkge1xuICAgICAgbWF0Y2hlcyA9IHNlbGVjdG9yTWF0Y2hlcyhsaXN0ZW5lciwgaXRlbSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gQ09OU1RBTlRTLml0ZW1UeXBlLkVWRU5UKSB7XG4gICAgaWYgKGV2ZW50ID09PSBDT05TVEFOVFMuZGF0YUxheWVyRXZlbnQuRVZFTlQgfHwgZXZlbnQgPT09IGl0ZW1Db25maWcuZXZlbnQpIHtcbiAgICAgIG1hdGNoZXMgPSBzZWxlY3Rvck1hdGNoZXMobGlzdGVuZXIsIGl0ZW0pO1xuICAgIH1cbiAgICBpZiAoaXRlbS5kYXRhICYmIGV2ZW50ID09PSBDT05TVEFOVFMuZGF0YUxheWVyRXZlbnQuQ0hBTkdFKSB7XG4gICAgICBtYXRjaGVzID0gc2VsZWN0b3JNYXRjaGVzKGxpc3RlbmVyLCBpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0ZW5lciBoYXMgYSBzZWxlY3RvciB0aGF0IHBvaW50cyB0byBhbiBvYmplY3QgaW4gdGhlIGRhdGEgcGF5bG9hZCBvZiBhbiBpdGVtLlxuICpcbiAqIEBwYXJhbSB7TGlzdGVuZXJ9IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBleHRyYWN0IHRoZSBzZWxlY3RvciBmcm9tLlxuICogQHBhcmFtIHtJdGVtfSBpdGVtIFRoZSBpdGVtLlxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYSBzZWxlY3RvciBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhlIGdpdmVuIHNlbGVjdG9yIGlzIG1hdGNoaW5nLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZWxlY3Rvck1hdGNoZXMobGlzdGVuZXIsIGl0ZW0pIHtcbiAgaWYgKGl0ZW0uZGF0YSAmJiBsaXN0ZW5lci5wYXRoKSB7XG4gICAgcmV0dXJuIGhhcyhpdGVtLmRhdGEsIGxpc3RlbmVyLnBhdGgpIHx8IGFuY2VzdG9yUmVtb3ZlZChpdGVtLmRhdGEsIGxpc3RlbmVyLnBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdGVuZXJNYXRjaDtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjJcIlxufVxuIl19
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.