@prisma/studio-core 0.19.1 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,5 +6,5 @@ function require(mod) {
6
6
  if (mod === 'react-dom') return ___react_dom___;
7
7
  throw new Error(`Unknown module ${mod}`);
8
8
  }
9
- import{a as m}from"./chunk-UQDXNCLC.js";import{c as $,d as B}from"./chunk-DTFJIWXL.js";import{a as w,b as q,d as C,e as z,h as D,i as L,j as Q,k as N,l as F}from"./chunk-PI3N7ZW6.js";import{a as G}from"./chunk-N6ZIYSZ5.js";import{A as I,C as O,D as Y,p as U,q as p,t as H,u as j,x as v,y as P,z as k}from"./chunk-TB3YFW43.js";var J={bool:{group:"boolean"},boolean:{group:"boolean"},bytea:{group:"string"},char:{group:"string"},citext:{group:"string"},date:{format:"YYYY-MM-DD",group:"datetime"},interval:{group:"string"},name:{group:"string"},varchar:{group:"string"},text:{group:"string"},time:{format:"HH:mm:ss.SSS",group:"time"},timestamp:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},timestamptz:{format:"YYYY-MM-DD HH:mm:ss.SSSZZ",group:"datetime"},"timestamp without time zone":{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},"timestamp with time zone":{format:"YYYY-MM-DD HH:mm:ss.SSSZZ",group:"datetime"},timetz:{format:"HH:mm:ss.SSSZZ",group:"time"},"time without time zone":{format:"HH:mm:ss.SSS",group:"time"},"time with time zone":{format:"HH:mm:ss.SSSZZ",group:"time"},uuid:{format:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",group:"raw"},int2:{group:"numeric"},int4:{group:"numeric"},int8:{group:"numeric"},smallint:{group:"numeric"},integer:{group:"numeric"},bigint:{group:"numeric"},decimal:{group:"numeric"},numeric:{group:"numeric"},real:{group:"numeric"},float4:{group:"numeric"},float8:{group:"numeric"},"double precision":{group:"numeric"},json:{group:"json"},jsonb:{group:"json"}};function T(r){return v({...r,Adapter:j,QueryCompiler:H})}function K(r){let e=N(r),n=e.normalizedSearchTerm;if(n.length<2)return e;let o=new Set(e.predicates.flatMap(l=>l.kind==="text-like"?[l.column]:[])),i=64-o.size;if(i<=0)return e;let u=`%${ie(n)}%`,a=[];for(let l of Object.values(r.table.columns))if(!o.has(l.name)&&(a.push({column:l.name,kind:"text-like",pattern:u}),a.length>=i))break;return a.length===0?e:{...e,predicates:[...e.predicates,...a]}}function ie(r){return r.replaceAll("%","\\%").replaceAll("_","\\_")}function Z(r,e){let{rows:n,table:{columns:o,name:i,schema:u}}=r,a=T(e);return k(a.withSchema(u).insertInto(i).values(O({columns:o,context:"insert",supportsDefaultKeyword:!0,values:n})).returning(Object.keys(o)).returning(M().as("__ps_inserted_at__")))}function W(r,e){let{filter:n={after:"and",filters:[],kind:"FilterGroup"},fullTableSearchTerm:o,pageIndex:i,pageSize:u,sortOrder:a,table:{columns:l,name:t,schema:s}}=r,_=T(e),g=Y(n.filters,l),y=K({searchTerm:o,table:r.table}),b=y.predicates.length>0?c=>c.and([g(c),F(y,{dialect:"postgres"})(c)]):g,h="__ps_agg__",A="__ps_count__",x="__ps_search_guardrails__";if(L(o))return k(_.with(x,c=>c.selectNoFrom(d=>[d.fn("set_config",[p.lit("statement_timeout"),p.lit(`${5e3}ms`),p.lit(!0)]).as("__ps_statement_timeout__"),d.fn("set_config",[p.lit("lock_timeout"),p.lit(`${100}ms`),p.lit(!0)]).as("__ps_lock_timeout__")])).with(h,c=>c.withSchema(s).selectFrom(t).innerJoin(p.table(x).as(x),d=>d.onTrue()).where(b).select(d=>d.cast(d.fn.coalesce(d.fn.countAll(),p.lit(0)),"text").as(A))).withSchema(s).selectFrom(t).innerJoin(x,c=>c.onTrue()).innerJoin(h,c=>c.onTrue()).where(b).select(`${h}.${A}`).select(Object.keys(l)).$call(c=>a.reduce((d,f)=>{let S=l[f.column];return S?.datatype.group==="numeric"&&!S.datatype.isArray?d.orderBy(p`cast(${p.ref(f.column)} as numeric)`,f.direction):d.orderBy(f.column,f.direction)},c)).limit(u).offset(p.lit(BigInt(i)*BigInt(u))));let E=_.withSchema(s).selectFrom(t).where(b).select(c=>c.cast(c.fn.coalesce(c.fn.countAll(),p.lit(0)),"text").as(A));return k(_.with(h,()=>E).withSchema(s).selectFrom(t).innerJoin(h,c=>c.onTrue()).where(b).select(`${h}.${A}`).select(Object.keys(l)).$call(c=>a.reduce((d,f)=>{let S=l[f.column];return S?.datatype.group==="numeric"&&!S.datatype.isArray?d.orderBy(p`cast(${p.ref(f.column)} as numeric)`,f.direction):d.orderBy(f.column,f.direction)},c)).limit(u).offset(p.lit(BigInt(i)*BigInt(u))))}function De(){return[{created_at:new Date("2025-01-26T21:56:12.345Z"),deleted_at:null,id:1,name:"John Doe",__ps_count__:"2",role:"admin",name_role:"Jonn Doe - admin"},{created_at:new Date("2025-01-26T20:56:12.345Z"),deleted_at:null,id:2,name:"Jane Doe",__ps_count__:"2",role:"poweruser",name_role:"Jane Doe - poweruser"}]}function V(r,e){let{changes:n,row:o,table:{columns:i,name:u,schema:a}}=r,l=T(e);return k(l.withSchema(a).updateTable(u).set(O({columns:i,context:"update",supportsDefaultKeyword:!0,values:n})).$call(I([o],i)).returning(Object.keys(i)).returning(M().as("__ps_updated_at__")))}function X(r,e){let{rows:n,table:{columns:o,name:i,schema:u}}=r,a=T(e);return k(a.withSchema(u).deleteFrom(i).$call(I(n,o)).returning(Object.keys(o)).returning(M().as("__ps_deleted_at__")))}function M(){let r=U();return r.cast(r.fn("floor",[r(r.fn("extract",[p`epoch from now()`]),"*",1e3)]),"text")}function ee(r){return p`(select coalesce(json_agg(agg), '[]') from ${r} as agg)`}var ue="r",ce="v",pe=[ue,ce];function te(r){return k(T(r).selectFrom("pg_catalog.pg_class as cls").innerJoin("pg_catalog.pg_namespace as ns","cls.relnamespace","ns.oid").$call(me).where("cls.relkind","in",pe).select(e=>["ns.nspname as schema","cls.relname as name",ee(e.selectFrom("pg_catalog.pg_attribute as att").innerJoin("pg_catalog.pg_type as typ","typ.oid","att.atttypid").innerJoin("pg_catalog.pg_namespace as tns","tns.oid","typ.typnamespace").leftJoin("pg_catalog.pg_constraint as pk_con",n=>n.on("pk_con.contype","=","p").onRef("pk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("pk_con.conkey")))).leftJoin("pg_catalog.pg_constraint as fk_con",n=>n.on("fk_con.contype","=","f").onRef("fk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("fk_con.conkey")))).leftJoin("pg_catalog.pg_class as fk_cls","fk_cls.oid","fk_con.confrelid").leftJoin("pg_catalog.pg_namespace as fk_ns","fk_ns.oid","fk_cls.relnamespace").leftJoin("pg_catalog.pg_attribute as fk_att",n=>n.onRef("fk_att.attrelid","=","fk_cls.oid").on(o=>o("fk_att.attnum","=",o.fn.any("fk_con.confkey")))).leftJoin("pg_catalog.pg_attrdef as def",n=>n.onRef("def.adrelid","=","att.attrelid").onRef("def.adnum","=","att.attnum")).whereRef("att.attrelid","=","cls.oid").where("att.attnum",">=",0).where("att.attisdropped","!=",!0).select(["att.attname as name","fk_att.attname as fk_column","fk_cls.relname as fk_table","fk_ns.nspname as fk_schema","tns.nspname as datatype_schema","typ.typname as datatype"]).select(n=>[n("att.attidentity","!=","").or(n("def.adbin","is not",null).and(n.fn("pg_get_expr",["def.adbin","def.adrelid"]),"like","nextval(%")).$castTo().as("autoinc"),n("att.attgenerated","!=","").$castTo().as("computed"),n.fn("pg_get_expr",["def.adbin","def.adrelid"]).as("default"),n("att.attnotnull","!=",!0).$castTo().as("nullable"),n.fn.coalesce(n.selectFrom("pg_catalog.pg_enum as enm").whereRef("enm.enumtypid","=","typ.oid").select(o=>o.fn.jsonAgg(o.ref("enm.enumlabel")).as("o")),p`'[]'`).as("options"),n.fn("array_position",["pk_con.conkey","att.attnum"]).as("pk")])).as("columns")]))}function re(){return[{schema:"zoo",name:"animals",columns:[{autoinc:!0,computed:!1,datatype:"int4",datatype_schema:"pg_catalog",default:"nextval('zoo.animals_id_seq'::regclass)",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:null}]},{schema:"public",name:"users",columns:[{autoinc:!0,computed:!1,datatype:"int4",datatype_schema:"pg_catalog",default:"nextval('users_id_seq'::regclass)",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:"CURRENT_TIMESTAMP",fk_column:null,fk_schema:null,fk_table:null,name:"created_at",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"deleted_at",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"varchar",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"role",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"varchar",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!0,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name_role",nullable:!1,options:[],pk:null}]},{schema:"public",name:"composite_pk",columns:[{autoinc:!1,computed:!1,datatype:"uuid",datatype_schema:"pg_catalog",default:"gen_random_uuid()",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:2},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:"now()",fk_column:null,fk_schema:null,fk_table:null,name:"created_at",nullable:!0,options:[],pk:null}]}]}function ae(){let r=T();return k(r.selectNoFrom(r.fn("current_setting",[p.lit("timezone")]).as("timezone")))}function ne(){return[{timezone:"UTC"}]}function me(r){return r.where("ns.nspname","!~","^pg_").where("ns.nspname","!=","information_schema")}function $e(r){let{executor:e,...n}=r,o=D(),i=typeof e.lintSql=="function";async function u(a){try{let l=te(n),t=ae(),[[s,_],[g,y]]=await Promise.all([e.execute(l,a),e.execute(t,a)]);if(s)return m({error:s,query:l});if(g)return m({error:g,query:t});let b=y[0]?.timezone;return b?[null,se({query:l,tables:_,timezone:b})]:m({error:new Error("Timezone not found"),query:t})}catch(l){return m({error:l})}}return{defaultSchema:"public",capabilities:{fullTableSearch:!0,sqlDialect:"postgresql",sqlEditorAutocomplete:!0,sqlEditorLint:!0},async introspect(a){return await u(a)},async query(a,l){try{let t=W(a,n),[s,_]=await Q({executor:e,options:l,query:t,searchTerm:a.fullTableSearchTerm,state:o});return s?m({error:s,query:t}):[null,{filteredRowCount:_[0]?.__ps_count__||"0",rows:_,query:t}]}catch(t){return m({error:t})}},async raw(a,l){return await fe(e,a,l)},async sqlSchema(a,l){let[t,s]=await u(l);return t?[t]:[null,G({defaultSchema:"public",dialect:"postgresql",introspection:s})]},async sqlLint(a,l){if(i&&typeof e.lintSql=="function")try{let[t,s]=await e.lintSql(a,l);if(!t)return[null,s];if(!oe(t))return m({error:t});le(t)&&(i=!1)}catch(t){if(!oe(t))return m({error:t});le(t)&&(i=!1)}return await de(e,a,l)},async insert(a,l){try{let t=Z(a,n),[s,_]=await e.execute(t,l);return s?m({error:s,query:t}):[null,{rows:_,query:t}]}catch(t){return m({error:t})}},async update(a,l){try{let t=V(a,n),[s,_]=await e.execute(t,l);if(s)return m({error:s,query:t});let[g]=_;return g?[null,{row:g,query:t}]:m({error:new Error("Update failed"),query:t})}catch(t){return m({error:t})}},async delete(a,l){try{let t=X(a,n),[s]=await e.execute(t,l);return s?m({error:s,query:t}):[null,{...a,query:t}]}catch(t){return m({error:t})}}}}function oe(r){if(!(r instanceof Error))return!1;let e=r.message.toLowerCase();return e.includes("invalid procedure")||e.includes("unexpected server error")||e.includes("internal server error")||e.includes("bad gateway")||e.includes("service unavailable")||e.includes("not supported")||e.includes("method not allowed")}function le(r){if(!(r instanceof Error))return!1;let e=r.message.toLowerCase();return e.includes("invalid procedure")||e.includes("unexpected server error")||e.includes("internal server error")||e.includes("not supported")||e.includes("method not allowed")}async function de(r,e,n){let o=$(e.sql);if(!o.ok)return[null,{diagnostics:[o.diagnostic],schemaVersion:e.schemaVersion}];let i=[];for(let u of o.statements)try{let a=P(`EXPLAIN (FORMAT JSON) ${u.statement}`),[l]=await r.execute(a,n);if(!l)continue;i.push(...B({error:l,positionOffset:u.from,sql:u.statement}))}catch(a){i.push(...B({error:a,positionOffset:u.from,sql:u.statement}))}return[null,{diagnostics:i,schemaVersion:e.schemaVersion}]}async function fe(r,e,n){try{let o=P(e.sql),[i,u]=await r.execute(o,n);return i?m({error:i,query:o}):[null,{query:o,rowCount:u.length,rows:u}]}catch(o){return m({error:o})}}function se(r){let{query:e,tables:n,timezone:o}=r;return n.reduce((i,u)=>{let{schemas:a}=i,{columns:l,name:t,schema:s}=u,_=l.reduce((g,y)=>{let{autoinc:b,computed:h,datatype:A,datatype_schema:x,default:R,name:E,options:c,nullable:d}=y,f=A.startsWith("_"),S=f?A.slice(1):A;return{...g,[E]:{datatype:{...J[S]||{group:c.length>0?"enum":"raw"},isArray:f,isNative:x==="pg_catalog",name:f?`${S}[]`:S,options:c,schema:x},defaultValue:R,fkColumn:y.fk_column,fkSchema:y.fk_schema,fkTable:y.fk_table,isAutoincrement:b,isComputed:h,isRequired:!d&&!b&&!h&&R==null,name:E,nullable:d,pkPosition:y.pk,schema:s,table:t}}},{});return a[s]===void 0&&(a[s]={name:s,tables:{}}),a[s].tables[t]={columns:_,name:t,schema:s},i},{filterOperators:_e,query:e,schemas:{public:{name:"public",tables:{}}},timezone:o})}var _e=["=","!=",">",">=","<","<=","is","is not","like","not like","ilike","not ilike"];function Je(){let r=re(),[{timezone:e}]=ne();return se({tables:r,timezone:e,query:{parameters:[],sql:"<mocked>"}})}export{K as a,Z as b,W as c,De as d,V as e,X as f,te as g,re as h,ae as i,ne as j,$e as k,Je as l};
10
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2RhdGF0eXBlLnRzIiwgIi4uL2RhdGEvcG9zdGdyZXMtY29yZS9idWlsZGVyLnRzIiwgIi4uL2RhdGEvcG9zdGdyZXMtY29yZS9mdWxsLXRhYmxlLXNlYXJjaC50cyIsICIuLi9kYXRhL3Bvc3RncmVzLWNvcmUvZG1sLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2hlbHBlcnMvcG9zdGdyZXMuanMiLCAiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2ludHJvc3BlY3Rpb24udHMiLCAiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2FkYXB0ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgUGljazxEYXRhVHlwZSwgXCJmb3JtYXRcIiB8IFwiZ3JvdXBcIj5cbj4gPSB7XG4gIGJvb2w6IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJ5dGVhOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgY2l0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCdcbiAgICovXG4gIGRhdGU6IHtcbiAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMSBkYXkgMiBob3VycydcbiAgICovXG4gIGludGVydmFsOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG5hbWU6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdmFyY2hhcjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lIHdpdGhvdXQgdGltZSB6b25lYC5cbiAgICpcbiAgICogQGV4YW1wbGUgJzE0OjMwOjAwJ1xuICAgKi9cbiAgdGltZToge1xuICAgIGZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIHRpbWVzdGFtcDoge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1wiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCswMCdcbiAgICovXG4gIHRpbWVzdGFtcHR6OiB7XG4gICAgZm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW06c3MuU1NTWlpcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1lc3RhbXBgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCI6IHtcbiAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1lc3RhbXB0emAuXG4gICAqXG4gICAqIEBleGFtcGxlICcyMDI1LTA0LTE0IDE0OjMwOjAwKzAwJ1xuICAgKi9cbiAgXCJ0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVcIjoge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1paXCIsXG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgLyoqXG4gICAqIHNob3J0IGZvcm0gb2YgYHRpbWUgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMTQ6MzA6MDArMDAnXG4gICAqL1xuICB0aW1ldHo6IHtcbiAgICBmb3JtYXQ6IFwiSEg6bW06c3MuU1NTWlpcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBsb25nIGZvcm0gb2YgYHRpbWVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMTQ6MzA6MDAnXG4gICAqL1xuICBcInRpbWUgd2l0aG91dCB0aW1lIHpvbmVcIjoge1xuICAgIGZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBsb25nIGZvcm0gb2YgYHRpbWV0emAuXG4gICAqXG4gICAqIEBleGFtcGxlICcxNDozMDowMCswMCdcbiAgICovXG4gIFwidGltZSB3aXRoIHRpbWUgem9uZVwiOiB7XG4gICAgZm9ybWF0OiBcIkhIOm1tOnNzLlNTU1paXCIsXG4gICAgZ3JvdXA6IFwidGltZVwiLFxuICB9LFxuICB1dWlkOiB7XG4gICAgZm9ybWF0OiBcInh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eFwiLFxuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBpbnQyOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnQ0OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnQ4OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBzbWFsbGludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgaW50ZWdlcjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgYmlnaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkZWNpbWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBudW1lcmljOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICByZWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBmbG9hdDQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGZsb2F0ODoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgXCJkb3VibGUgcHJlY2lzaW9uXCI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGpzb246IHtcbiAgICBncm91cDogXCJqc29uXCIsXG4gIH0sXG4gIGpzb25iOiB7XG4gICAgZ3JvdXA6IFwianNvblwiLFxuICB9LFxufTtcbiIsICJpbXBvcnQgeyB0eXBlIEt5c2VseSwgUG9zdGdyZXNBZGFwdGVyLCBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgZ2V0QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc3RncmVTUUxCdWlsZGVyPERhdGFiYXNlID0gYW55PihcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbik6IEt5c2VseTxEYXRhYmFzZT4ge1xuICByZXR1cm4gZ2V0QnVpbGRlcih7XG4gICAgLi4ucmVxdWlyZW1lbnRzLFxuICAgIEFkYXB0ZXI6IFBvc3RncmVzQWRhcHRlcixcbiAgICBRdWVyeUNvbXBpbGVyOiBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIsXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuIGFzIGJ1aWxkQmFzZUZ1bGxUYWJsZVNlYXJjaFBsYW4sXG4gIGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlLFxuICBleGVjdXRlUXVlcnlXaXRoRnVsbFRhYmxlU2VhcmNoR3VhcmRyYWlscyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTUFYX1RFWFRfQ09MVU1OUyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTUlOX1FVRVJZX0xFTkdUSCxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTVlTUUxfTE9DS19XQUlUX1RJTUVPVVRfU0VDT05EUyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfUE9TVEdSRVNfTE9DS19USU1FT1VUX01TLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01FU1NBR0UsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTVMsXG4gIHR5cGUgRnVsbFRhYmxlU2VhcmNoUGxhbixcbiAgdHlwZSBGdWxsVGFibGVTZWFyY2hQcmVkaWNhdGUsXG4gIEZ1bGxUYWJsZVNlYXJjaFRpbWVvdXRFcnJvcixcbiAgZ2V0RnVsbFRhYmxlU2VhcmNoRXhwcmVzc2lvbixcbiAgaXNGdWxsVGFibGVTZWFyY2hSZXF1ZXN0LFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcblxuZXhwb3J0IHtcbiAgY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUsXG4gIGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NQVhfVEVYVF9DT0xVTU5TLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NSU5fUVVFUllfTEVOR1RILFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NWVNRTF9MT0NLX1dBSVRfVElNRU9VVF9TRUNPTkRTLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9QT1NUR1JFU19MT0NLX1RJTUVPVVRfTVMsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTUVTU0FHRSxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfVElNRU9VVF9NUyxcbiAgRnVsbFRhYmxlU2VhcmNoVGltZW91dEVycm9yLFxuICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uLFxuICBpc0Z1bGxUYWJsZVNlYXJjaFJlcXVlc3QsXG59O1xuZXhwb3J0IHR5cGUge1xuICBGdWxsVGFibGVTZWFyY2hEaWFsZWN0LFxuICBGdWxsVGFibGVTZWFyY2hFeGVjdXRpb25TdGF0ZSxcbiAgRnVsbFRhYmxlU2VhcmNoUHJlZGljYXRlLFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbihhcmdzOiB7XG4gIHNlYXJjaFRlcm06IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGFibGU6IFRhYmxlO1xufSk6IEZ1bGxUYWJsZVNlYXJjaFBsYW4ge1xuICBjb25zdCBiYXNlUGxhbiA9IGJ1aWxkQmFzZUZ1bGxUYWJsZVNlYXJjaFBsYW4oYXJncyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2hUZXJtID0gYmFzZVBsYW4ubm9ybWFsaXplZFNlYXJjaFRlcm07XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZWFyY2hUZXJtLmxlbmd0aCA8IEZVTExfVEFCTEVfU0VBUkNIX01JTl9RVUVSWV9MRU5HVEgpIHtcbiAgICByZXR1cm4gYmFzZVBsYW47XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1RleHRDb2x1bW5zID0gbmV3IFNldChcbiAgICBiYXNlUGxhbi5wcmVkaWNhdGVzLmZsYXRNYXAoKHByZWRpY2F0ZSkgPT5cbiAgICAgIHByZWRpY2F0ZS5raW5kID09PSBcInRleHQtbGlrZVwiID8gW3ByZWRpY2F0ZS5jb2x1bW5dIDogW10sXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgcmVtYWluaW5nVGV4dFNsb3RzID1cbiAgICBGVUxMX1RBQkxFX1NFQVJDSF9NQVhfVEVYVF9DT0xVTU5TIC0gZXhpc3RpbmdUZXh0Q29sdW1ucy5zaXplO1xuXG4gIGlmIChyZW1haW5pbmdUZXh0U2xvdHMgPD0gMCkge1xuICAgIHJldHVybiBiYXNlUGxhbjtcbiAgfVxuXG4gIGNvbnN0IHBhdHRlcm4gPSBgJSR7ZXNjYXBlTGlrZVBhdHRlcm4obm9ybWFsaXplZFNlYXJjaFRlcm0pfSVgO1xuICBjb25zdCBzdXBwbGVtZW50YWxQcmVkaWNhdGVzOiBGdWxsVGFibGVTZWFyY2hQcmVkaWNhdGVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoYXJncy50YWJsZS5jb2x1bW5zKSkge1xuICAgIGlmIChleGlzdGluZ1RleHRDb2x1bW5zLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN1cHBsZW1lbnRhbFByZWRpY2F0ZXMucHVzaCh7XG4gICAgICBjb2x1bW46IGNvbHVtbi5uYW1lLFxuICAgICAga2luZDogXCJ0ZXh0LWxpa2VcIixcbiAgICAgIHBhdHRlcm4sXG4gICAgfSk7XG5cbiAgICBpZiAoc3VwcGxlbWVudGFsUHJlZGljYXRlcy5sZW5ndGggPj0gcmVtYWluaW5nVGV4dFNsb3RzKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcGxlbWVudGFsUHJlZGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYmFzZVBsYW47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmJhc2VQbGFuLFxuICAgIHByZWRpY2F0ZXM6IFsuLi5iYXNlUGxhbi5wcmVkaWNhdGVzLCAuLi5zdXBwbGVtZW50YWxQcmVkaWNhdGVzXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlTGlrZVBhdHRlcm4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKFwiJVwiLCBcIlxcXFwlXCIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXFxcXF9cIik7XG59XG4iLCAiaW1wb3J0IHtcbiAgZXhwcmVzc2lvbkJ1aWxkZXIsXG4gIHR5cGUgSW5mZXJSZXN1bHQsXG4gIHR5cGUgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbixcbiAgc3FsLFxufSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIEFkYXB0ZXJJbnNlcnREZXRhaWxzLFxuICBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzLFxuICBhcHBseVRyYW5zZm9ybWF0aW9ucyxcbiAgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLFxuICBjb21waWxlLFxuICBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uLFxufSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgQmlnSW50U3RyaW5nIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IGdldFBvc3RncmVTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9QT1NUR1JFU19MT0NLX1RJTUVPVVRfTVMsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTVMsXG4gIGdldEZ1bGxUYWJsZVNlYXJjaEV4cHJlc3Npb24sXG4gIGlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdCxcbn0gZnJvbSBcIi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG4vKipcbiAqIEluc2VydHMgb25lIG9yIG1vcmUgcm93cyBpbnRvIGEgdGFibGUgYW5kIHJldHVybnMgdGhlIGluc2VydGVkIHJvd3MgYWxvbmcgd2l0aCB0aGVpciBgY3RpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckluc2VydERldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgIC5pbnNlcnRJbnRvKHRhYmxlTmFtZSlcbiAgICAgIC52YWx1ZXMoXG4gICAgICAgIGFwcGx5VHJhbnNmb3JtYXRpb25zKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbnRleHQ6IFwiaW5zZXJ0XCIsXG4gICAgICAgICAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZXM6IHJvd3MsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnJldHVybmluZyhPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpLmFzKFwiX19wc19pbnNlcnRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBzZWxlY3RzIGFsbCBjb2x1bW5zIGZyb20gYSB0YWJsZSwgYWxvbmcgd2l0aCBhbiB1bmJvdW5kIHJvdyBjb3VudCBhcyBgX19wc19jb3VudF9fYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBmaWx0ZXIgPSB7IGFmdGVyOiBcImFuZFwiLCBmaWx0ZXJzOiBbXSwga2luZDogXCJGaWx0ZXJHcm91cFwiIH0sXG4gICAgZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPVxuICAgIGdldFBvc3RncmVTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbiA9IGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oXG4gICAgZmlsdGVyLmZpbHRlcnMsXG4gICAgY29sdW1ucyxcbiAgKTtcbiAgY29uc3QgZnVsbFRhYmxlU2VhcmNoUGxhbiA9IGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbih7XG4gICAgc2VhcmNoVGVybTogZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICB0YWJsZTogZGV0YWlscy50YWJsZSxcbiAgfSk7XG4gIGNvbnN0IGNvbWJpbmVkV2hlcmVFeHByZXNzaW9uID1cbiAgICBmdWxsVGFibGVTZWFyY2hQbGFuLnByZWRpY2F0ZXMubGVuZ3RoID4gMFxuICAgICAgPyAoZWI6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbj4+WzBdKSA9PlxuICAgICAgICAgIGViLmFuZChbXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbihlYiksXG4gICAgICAgICAgICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uKGZ1bGxUYWJsZVNlYXJjaFBsYW4sIHtcbiAgICAgICAgICAgICAgZGlhbGVjdDogXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgICAgfSkoZWIpLFxuICAgICAgICAgIF0pXG4gICAgICA6IGFwcGxpZWRGaWx0ZXJFeHByZXNzaW9uO1xuXG4gIGNvbnN0IEFHR19OQU1FID0gXCJfX3BzX2FnZ19fXCI7XG4gIGNvbnN0IENPVU5UX1JFRiA9IFwiX19wc19jb3VudF9fXCI7XG4gIGNvbnN0IFNFQVJDSF9HVUFSRFJBSUxTX05BTUUgPSBcIl9fcHNfc2VhcmNoX2d1YXJkcmFpbHNfX1wiO1xuICBjb25zdCBzaG91bGRBcHBseVNlYXJjaEd1YXJkcmFpbHMgPVxuICAgIGlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdChmdWxsVGFibGVTZWFyY2hUZXJtKTtcbiAgaWYgKHNob3VsZEFwcGx5U2VhcmNoR3VhcmRyYWlscykge1xuICAgIHJldHVybiBjb21waWxlKFxuICAgICAgYnVpbGRlclxuICAgICAgICAud2l0aChTRUFSQ0hfR1VBUkRSQUlMU19OQU1FLCAocWIpID0+XG4gICAgICAgICAgcWIuc2VsZWN0Tm9Gcm9tKChlYikgPT4gW1xuICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgLmZuPHN0cmluZz4oXCJzZXRfY29uZmlnXCIsIFtcbiAgICAgICAgICAgICAgICBzcWwubGl0KFwic3RhdGVtZW50X3RpbWVvdXRcIiksXG4gICAgICAgICAgICAgICAgc3FsLmxpdChgJHtGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01TfW1zYCksXG4gICAgICAgICAgICAgICAgc3FsLmxpdCh0cnVlKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmFzKFwiX19wc19zdGF0ZW1lbnRfdGltZW91dF9fXCIpLFxuICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgLmZuPHN0cmluZz4oXCJzZXRfY29uZmlnXCIsIFtcbiAgICAgICAgICAgICAgICBzcWwubGl0KFwibG9ja190aW1lb3V0XCIpLFxuICAgICAgICAgICAgICAgIHNxbC5saXQoYCR7RlVMTF9UQUJMRV9TRUFSQ0hfUE9TVEdSRVNfTE9DS19USU1FT1VUX01TfW1zYCksXG4gICAgICAgICAgICAgICAgc3FsLmxpdCh0cnVlKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmFzKFwiX19wc19sb2NrX3RpbWVvdXRfX1wiKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKVxuICAgICAgICAud2l0aChBR0dfTkFNRSwgKHFiKSA9PlxuICAgICAgICAgIHFiXG4gICAgICAgICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAgICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFxuICAgICAgICAgICAgICBzcWwudGFibGUoU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSkuYXMoU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSksXG4gICAgICAgICAgICAgIChqYikgPT4gamIub25UcnVlKCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAuY2FzdDxCaWdJbnRTdHJpbmc+KFxuICAgICAgICAgICAgICAgICAgZWIuZm4uY29hbGVzY2UoZWIuZm4uY291bnRBbGwoKSwgc3FsLmxpdCgwKSksXG4gICAgICAgICAgICAgICAgICBcInRleHRcIixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFzKENPVU5UX1JFRiksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgICAgLnNlbGVjdEZyb20odGFibGVOYW1lKVxuICAgICAgICAuaW5uZXJKb2luKFNFQVJDSF9HVUFSRFJBSUxTX05BTUUsIChqYikgPT4gamIub25UcnVlKCkpXG4gICAgICAgIC5pbm5lckpvaW4oQUdHX05BTUUsIChqYikgPT4gamIub25UcnVlKCkpXG4gICAgICAgIC8vIFRPRE86IGN1cnNvciBwYWdpbmF0aW9uP1xuICAgICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAgIC5zZWxlY3QoXG4gICAgICAgICAgYCR7QUdHX05BTUV9LiR7Q09VTlRfUkVGfWAgc2F0aXNmaWVzIFNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb248XG4gICAgICAgICAgICB7IFtBR0dfTkFNRV06IHsgW0NPVU5UX1JFRl06IEJpZ0ludFN0cmluZyB9IH0sXG4gICAgICAgICAgICB0eXBlb2YgQUdHX05BTUVcbiAgICAgICAgICA+LFxuICAgICAgICApXG4gICAgICAgIC5zZWxlY3QoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAgIC4kY2FsbCgocWIpID0+IHtcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyLnJlZHVjZSgoY3VycmVudFF1ZXJ5LCBpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zW2l0ZW0uY29sdW1uXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjb2x1bW4/LmRhdGF0eXBlLmdyb3VwID09PSBcIm51bWVyaWNcIiAmJlxuICAgICAgICAgICAgICAhY29sdW1uLmRhdGF0eXBlLmlzQXJyYXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoXG4gICAgICAgICAgICAgICAgc3FsYGNhc3QoJHtzcWwucmVmKGl0ZW0uY29sdW1uKX0gYXMgbnVtZXJpYylgLFxuICAgICAgICAgICAgICAgIGl0ZW0uZGlyZWN0aW9uLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoaXRlbS5jb2x1bW4sIGl0ZW0uZGlyZWN0aW9uKTtcbiAgICAgICAgICB9LCBxYik7XG4gICAgICAgIH0pXG4gICAgICAgIC5saW1pdChwYWdlU2l6ZSlcbiAgICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvdW50UXVlcnkgPSBidWlsZGVyXG4gICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgLnNlbGVjdCgoZWIpID0+XG4gICAgICBlYlxuICAgICAgICAuY2FzdDxCaWdJbnRTdHJpbmc+KFxuICAgICAgICAgIGViLmZuLmNvYWxlc2NlKGViLmZuLmNvdW50QWxsKCksIHNxbC5saXQoMCkpLFxuICAgICAgICAgIFwidGV4dFwiLFxuICAgICAgICApXG4gICAgICAgIC5hcyhDT1VOVF9SRUYpLFxuICAgICk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoQUdHX05BTUUsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAuaW5uZXJKb2luKEFHR19OQU1FLCAoamIpID0+IGpiLm9uVHJ1ZSgpKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAuc2VsZWN0KFxuICAgICAgICBgJHtBR0dfTkFNRX0uJHtDT1VOVF9SRUZ9YCBzYXRpc2ZpZXMgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbjxcbiAgICAgICAgICB7IFtBR0dfTkFNRV06IEluZmVyUmVzdWx0PHR5cGVvZiBjb3VudFF1ZXJ5PltudW1iZXJdIH0sXG4gICAgICAgICAgdHlwZW9mIEFHR19OQU1FXG4gICAgICAgID4sXG4gICAgICApXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLiRjYWxsKChxYikgPT4ge1xuICAgICAgICByZXR1cm4gc29ydE9yZGVyLnJlZHVjZSgoY3VycmVudFF1ZXJ5LCBpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1tpdGVtLmNvbHVtbl07XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2x1bW4/LmRhdGF0eXBlLmdyb3VwID09PSBcIm51bWVyaWNcIiAmJlxuICAgICAgICAgICAgIWNvbHVtbi5kYXRhdHlwZS5pc0FycmF5XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoXG4gICAgICAgICAgICAgIHNxbGBjYXN0KCR7c3FsLnJlZihpdGVtLmNvbHVtbil9IGFzIG51bWVyaWMpYCxcbiAgICAgICAgICAgICAgaXRlbS5kaXJlY3Rpb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjdXJyZW50UXVlcnkub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pO1xuICAgICAgICB9LCBxYik7XG4gICAgICB9KVxuICAgICAgLmxpbWl0KHBhZ2VTaXplKVxuICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgLm9mZnNldChzcWwubGl0KEJpZ0ludChwYWdlSW5kZXgpICogQmlnSW50KHBhZ2VTaXplKSkpLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1NlbGVjdFF1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKFwiMjAyNS0wMS0yNlQyMTo1NjoxMi4zNDVaXCIpLFxuICAgICAgZGVsZXRlZF9hdDogbnVsbCxcbiAgICAgIGlkOiAxLFxuICAgICAgbmFtZTogXCJKb2huIERvZVwiLFxuICAgICAgX19wc19jb3VudF9fOiBcIjJcIixcbiAgICAgIHJvbGU6IFwiYWRtaW5cIixcbiAgICAgIG5hbWVfcm9sZTogXCJKb25uIERvZSAtIGFkbWluXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShcIjIwMjUtMDEtMjZUMjA6NTY6MTIuMzQ1WlwiKSxcbiAgICAgIGRlbGV0ZWRfYXQ6IG51bGwsXG4gICAgICBpZDogMixcbiAgICAgIG5hbWU6IFwiSmFuZSBEb2VcIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgICByb2xlOiBcInBvd2VydXNlclwiLFxuICAgICAgbmFtZV9yb2xlOiBcIkphbmUgRG9lIC0gcG93ZXJ1c2VyXCIsXG4gICAgfSxcbiAgXSBhcyBjb25zdCBzYXRpc2ZpZXMge1xuICAgIC8vIGJlc3QgZWZmb3J0IG5vIG5lZWQgdG8gZ28gb3ZlcmJvYXJkXG4gICAgW0sgaW5cbiAgICAgIHwgUmV0dXJuVHlwZTx0eXBlb2YgbW9ja1RhYmxlc1F1ZXJ5PlsxXVtcImNvbHVtbnNcIl1bbnVtYmVyXVtcIm5hbWVcIl1cbiAgICAgIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCB1cGRhdGVzIGEgZ2l2ZW4gcm93IGluIGEgdGFibGUgd2l0aCBnaXZlbiBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIHJvdyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID1cbiAgICBnZXRQb3N0Z3JlU1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoXG4gICAgICAgIGFwcGx5VHJhbnNmb3JtYXRpb25zKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbnRleHQ6IFwidXBkYXRlXCIsXG4gICAgICAgICAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZXM6IGNoYW5nZXMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFtyb3ddLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfdXBkYXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBkZWxldGVzIGEgZ2l2ZW4gc2V0IG9mIHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgIC5kZWxldGVGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfZGVsZXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpIHtcbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcigpO1xuXG4gIHJldHVybiBlYi5jYXN0PEJpZ0ludFN0cmluZz4oXG4gICAgZWIuZm4oXCJmbG9vclwiLCBbZWIoZWIuZm4oXCJleHRyYWN0XCIsIFtzcWxgZXBvY2ggZnJvbSBub3coKWBdKSwgXCIqXCIsIDFfMDAwKV0pLFxuICAgIFwidGV4dFwiLFxuICApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wb3N0Z3Jlcy5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG4vKipcbiAqIEEgcG9zdGdyZXMgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IChvciBvdGhlciBleHByZXNzaW9uKSBpbnRvIGEgSlNPTkIgYXJyYXkuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogPCEtLSBzaXRlRXhhbXBsZShcInNlbGVjdFwiLCBcIk5lc3RlZCBhcnJheVwiLCAxMTApIC0tPlxuICpcbiAqIFdoaWxlIGt5c2VseSBpcyBub3QgYW4gT1JNIGFuZCBpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2YgcmVsYXRpb25zLCB3ZSBkbyBwcm92aWRlXG4gKiBoZWxwZXJzIGZvciBmZXRjaGluZyBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzIGluIGEgc2luZ2xlIHF1ZXJ5LiBJbiB0aGlzIGV4YW1wbGUgd2VcbiAqIHVzZSB0aGUgYGpzb25BcnJheUZyb21gIGhlbHBlciB0byBmZXRjaCBwZXJzb24ncyBwZXRzIGFsb25nIHdpdGggdGhlIHBlcnNvbidzIGlkLlxuICpcbiAqIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgaGVscGVycyB1bmRlciB0aGUgYGt5c2VseS9oZWxwZXJzYCBmb2xkZXIsIGluY2x1ZGluZ1xuICogYGpzb25BcnJheUZyb21gLCBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayB3aXRoIHRoaXJkIHBhcnR5IGRpYWxlY3RzLiBJbiBvcmRlciBmb3JcbiAqIHRoZW0gdG8gd29yaywgdGhlIGRpYWxlY3QgbXVzdCBhdXRvbWF0aWNhbGx5IHBhcnNlIHRoZSBganNvbmAgZGF0YSB0eXBlIGludG9cbiAqIEphdmFTY3JpcHQgSlNPTiB2YWx1ZXMgbGlrZSBvYmplY3RzIGFuZCBhcnJheXMuIFNvbWUgZGlhbGVjdHMgbWlnaHQgc2ltcGx5IHJldHVyblxuICogdGhlIGRhdGEgYXMgYSBKU09OIHN0cmluZy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYFxuICogdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9wb3N0Z3JlcydcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25BcnJheUZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC5vcmRlckJ5KCdwZXQubmFtZScpXG4gKiAgICAgKS5hcygncGV0cycpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIChcbiAqICAgc2VsZWN0IGNvYWxlc2NlKGpzb25fYWdnKGFnZyksICdbXScpIGZyb20gKFxuICogICAgIHNlbGVjdCBcInBldFwiLlwiaWRcIiBhcyBcInBldF9pZFwiLCBcInBldFwiLlwibmFtZVwiXG4gKiAgICAgZnJvbSBcInBldFwiXG4gKiAgICAgd2hlcmUgXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICogICAgIG9yZGVyIGJ5IFwicGV0XCIuXCJuYW1lXCJcbiAqICAgKSBhcyBhZ2dcbiAqICkgYXMgXCJwZXRzXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQXJyYXlGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGNvYWxlc2NlKGpzb25fYWdnKGFnZyksICdbXScpIGZyb20gJHtleHByfSBhcyBhZ2cpYDtcbn1cbi8qKlxuICogQSBwb3N0Z3JlcyBoZWxwZXIgZm9yIHR1cm5pbmcgYSBzdWJxdWVyeSAob3Igb3RoZXIgZXhwcmVzc2lvbikgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIFRoZSBzdWJxdWVyeSBtdXN0IG9ubHkgcmV0dXJuIG9uZSByb3cuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogPCEtLSBzaXRlRXhhbXBsZShcInNlbGVjdFwiLCBcIk5lc3RlZCBvYmplY3RcIiwgMTIwKSAtLT5cbiAqXG4gKiBXaGlsZSBreXNlbHkgaXMgbm90IGFuIE9STSBhbmQgaXQgZG9lc24ndCBoYXZlIHRoZSBjb25jZXB0IG9mIHJlbGF0aW9ucywgd2UgZG8gcHJvdmlkZVxuICogaGVscGVycyBmb3IgZmV0Y2hpbmcgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cyBpbiBhIHNpbmdsZSBxdWVyeS4gSW4gdGhpcyBleGFtcGxlIHdlXG4gKiB1c2UgdGhlIGBqc29uT2JqZWN0RnJvbWAgaGVscGVyIHRvIGZldGNoIHBlcnNvbidzIGZhdm9yaXRlIHBldCBhbG9uZyB3aXRoIHRoZSBwZXJzb24ncyBpZC5cbiAqXG4gKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGhlbHBlcnMgdW5kZXIgdGhlIGBreXNlbHkvaGVscGVyc2AgZm9sZGVyLCBpbmNsdWRpbmdcbiAqIGBqc29uT2JqZWN0RnJvbWAsIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGggdGhpcmQtcGFydHkgZGlhbGVjdHMuIEluIG9yZGVyIGZvclxuICogdGhlbSB0byB3b3JrLCB0aGUgZGlhbGVjdCBtdXN0IGF1dG9tYXRpY2FsbHkgcGFyc2UgdGhlIGBqc29uYCBkYXRhIHR5cGUgaW50b1xuICogSmF2YVNjcmlwdCBKU09OIHZhbHVlcyBsaWtlIG9iamVjdHMgYW5kIGFycmF5cy4gU29tZSBkaWFsZWN0cyBtaWdodCBzaW1wbHkgcmV0dXJuXG4gKiB0aGUgZGF0YSBhcyBhIEpTT04gc3RyaW5nLiBJbiB0aGVzZSBjYXNlcyB5b3UgY2FuIHVzZSB0aGUgYnVpbHQgaW4gYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gXG4gKiB0byBwYXJzZSB0aGUgcmVzdWx0cy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsganNvbk9iamVjdEZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9wb3N0Z3JlcydcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25PYmplY3RGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAud2hlcmUoJ3BldC5pc19mYXZvcml0ZScsICc9JywgdHJ1ZSlcbiAqICAgICApLmFzKCdmYXZvcml0ZV9wZXQnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gKlxuICogYGBgc3FsXG4gKiBzZWxlY3QgXCJpZFwiLCAoXG4gKiAgIHNlbGVjdCB0b19qc29uKG9iaikgZnJvbSAoXG4gKiAgICAgc2VsZWN0IFwicGV0XCIuXCJpZFwiIGFzIFwicGV0X2lkXCIsIFwicGV0XCIuXCJuYW1lXCJcbiAqICAgICBmcm9tIFwicGV0XCJcbiAqICAgICB3aGVyZSBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gKiAgICAgYW5kIFwicGV0XCIuXCJpc19mYXZvcml0ZVwiID0gJDFcbiAqICAgKSBhcyBvYmpcbiAqICkgYXMgXCJmYXZvcml0ZV9wZXRcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25PYmplY3RGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IHRvX2pzb24ob2JqKSBmcm9tICR7ZXhwcn0gYXMgb2JqKWA7XG59XG4vKipcbiAqIFRoZSBQb3N0Z3JlU1FMIGBqc29uX2J1aWxkX29iamVjdGAgZnVuY3Rpb24uXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYFBvc3RncmVzRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgUG9zdGdyZVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB7IGpzb25CdWlsZE9iamVjdCB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBzcWw8c3RyaW5nPmBmaXJzdF9uYW1lIHx8XHUwMEEwJyAnIHx8IGxhc3RfbmFtZWBcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwganNvbl9idWlsZF9vYmplY3QoXG4gKiAgICdmaXJzdCcsIGZpcnN0X25hbWUsXG4gKiAgICdsYXN0JywgbGFzdF9uYW1lLFxuICogICAnZnVsbCcsIGZpcnN0X25hbWUgfHwgJyAnIHx8IGxhc3RfbmFtZVxuICogKSBhcyBcIm5hbWVcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25CdWlsZE9iamVjdChvYmopIHtcbiAgICByZXR1cm4gc3FsIGBqc29uX2J1aWxkX29iamVjdCgke3NxbC5qb2luKE9iamVjdC5rZXlzKG9iaikuZmxhdE1hcCgoaykgPT4gW3NxbC5saXQoayksIG9ialtrXV0pKX0pYDtcbn1cbi8qKlxuICogVGhlIFBvc3RncmVTUUwgYG1lcmdlX2FjdGlvbmAgZnVuY3Rpb24uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGByZXR1cm5pbmdgIGNsYXVzZSB0byBnZXQgdGhlIGFjdGlvbiB0aGF0IHdhc1xuICogcGVyZm9ybWVkIGluIGEgYG1lcmdlSW50b2AgcXVlcnkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gKiBzdHJpbmdzOiBgJ0lOU0VSVCdgLCBgJ1VQREFURSdgLCBvciBgJ0RFTEVURSdgLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtZXJnZUFjdGlvbiB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5tZXJnZUludG8oJ3BlcnNvbiBhcyBwJylcbiAqICAgLnVzaW5nKCdwZXJzb25fYmFja3VwIGFzIHBiJywgJ3AuaWQnLCAncGIuaWQnKVxuICogICAud2hlbk1hdGNoZWQoKVxuICogICAudGhlblVwZGF0ZVNldCgoeyByZWYgfSkgPT4gKHtcbiAqICAgICBmaXJzdF9uYW1lOiByZWYoJ3BiLmZpcnN0X25hbWUnKSxcbiAqICAgICB1cGRhdGVkX2F0OiByZWYoJ3BiLnVwZGF0ZWRfYXQnKS4kY2FzdFRvPHN0cmluZyB8IG51bGw+KCksXG4gKiAgIH0pKVxuICogICAud2hlbk5vdE1hdGNoZWQoKVxuICogICAudGhlbkluc2VydFZhbHVlcygoeyByZWZ9KSA9PiAoe1xuICogICAgIGlkOiByZWYoJ3BiLmlkJyksXG4gKiAgICAgZmlyc3RfbmFtZTogcmVmKCdwYi5maXJzdF9uYW1lJyksXG4gKiAgICAgY3JlYXRlZF9hdDogcmVmKCdwYi51cGRhdGVkX2F0JyksXG4gKiAgICAgdXBkYXRlZF9hdDogcmVmKCdwYi51cGRhdGVkX2F0JykuJGNhc3RUbzxzdHJpbmcgfCBudWxsPigpLFxuICogICB9KSlcbiAqICAgLnJldHVybmluZyhbbWVyZ2VBY3Rpb24oKS5hcygnYWN0aW9uJyksICdwLmlkJywgJ3AudXBkYXRlZF9hdCddKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdLmFjdGlvblxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogbWVyZ2UgaW50byBcInBlcnNvblwiIGFzIFwicFwiXG4gKiB1c2luZyBcInBlcnNvbl9iYWNrdXBcIiBhcyBcInBiXCIgb24gXCJwXCIuXCJpZFwiID0gXCJwYlwiLlwiaWRcIlxuICogd2hlbiBtYXRjaGVkIHRoZW4gdXBkYXRlIHNldFxuICogICBcImZpcnN0X25hbWVcIiA9IFwicGJcIi5cImZpcnN0X25hbWVcIixcbiAqICAgXCJ1cGRhdGVkX2F0XCIgPSBcInBiXCIuXCJ1cGRhdGVkX2F0XCI6OnRleHRcbiAqIHdoZW4gbm90IG1hdGNoZWQgdGhlbiBpbnNlcnQgdmFsdWVzIChcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImNyZWF0ZWRfYXRcIiwgXCJ1cGRhdGVkX2F0XCIpXG4gKiB2YWx1ZXMgKFwicGJcIi5cImlkXCIsIFwicGJcIi5cImZpcnN0X25hbWVcIiwgXCJwYlwiLlwidXBkYXRlZF9hdFwiLCBcInBiXCIuXCJ1cGRhdGVkX2F0XCIpXG4gKiByZXR1cm5pbmcgbWVyZ2VfYWN0aW9uKCkgYXMgXCJhY3Rpb25cIiwgXCJwXCIuXCJpZFwiLCBcInBcIi5cInVwZGF0ZWRfYXRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFjdGlvbigpIHtcbiAgICByZXR1cm4gc3FsIGBtZXJnZV9hY3Rpb24oKWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBTZWxlY3RRdWVyeUJ1aWxkZXIsIHNxbCB9IGZyb20gXCJreXNlbHlcIjtcbmltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tIFwia3lzZWx5L2hlbHBlcnMvcG9zdGdyZXNcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBjb21waWxlLCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBnZXRQb3N0Z3JlU1FMQnVpbGRlciB9IGZyb20gXCIuL2J1aWxkZXJcIjtcblxuY29uc3QgUkVHVUxBUl9UQUJMRV9LSU5EID0gXCJyXCI7XG5jb25zdCBWSUVXX1RBQkxFX0tJTkQgPSBcInZcIjtcbmNvbnN0IFRBQkxFX0tJTkRTID0gW1JFR1VMQVJfVEFCTEVfS0lORCwgVklFV19UQUJMRV9LSU5EXSBhcyBjb25zdDtcbnR5cGUgVGFibGVLaW5kID0gKHR5cGVvZiBUQUJMRV9LSU5EUylbbnVtYmVyXTtcblxuaW50ZXJmYWNlIERhdGFiYXNlIHtcbiAgLyoqIGNvbHVtbiBkZWZhdWx0cyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmRlZlwiOiB7XG4gICAgLyoqIGRlZmF1bHQgZXhwcmVzc2lvbiBhcyBhIG5vZGUgdHJlZSwgdXNlIHBnX2dldF9leHByKGFkYmluLCBhZHJlbGlkKSAqL1xuICAgIGFkYmluOiBzdHJpbmc7XG4gICAgLyoqIGNvbHVtbiBudW1iZXIgKi9cbiAgICBhZG51bTogbnVtYmVyO1xuICAgIC8qKiB0YWJsZSBpZGVudGlmaWVyICovXG4gICAgYWRyZWxpZDogbnVtYmVyO1xuICB9O1xuICAvKiogY29sdW1ucyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmlidXRlXCI6IHtcbiAgICAvKipcbiAgICAgKiBnZW5lcmF0aW9uIGZsYWcgZm9yIGNvbXB1dGVkIGNvbHVtbnM6XG4gICAgICogJycgKGVtcHR5KSBmb3IgcmVndWxhciBjb2x1bW5zLFxuICAgICAqICdzJyBmb3IgU1RPUkVEIGdlbmVyYXRlZCBjb2x1bW5zIChQb3N0Z3JlcyBHRU5FUkFURUQgQUxXQVlTIEFTKS5cbiAgICAgKi9cbiAgICBhdHRnZW5lcmF0ZWQ6IFwiXCIgfCBcInNcIjtcbiAgICAvKipcbiAgICAgKiBpZGVudGl0eSBjb2x1bW4gZmxhZzpcbiAgICAgKiAnJyAoZW1wdHkpIGZvciByZWd1bGFyIGNvbHVtbnMsXG4gICAgICogJ2EnIGZvciBBTFdBWVMgKEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkpLFxuICAgICAqICdkJyBmb3IgQlkgREVGQVVMVCAoR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkpLlxuICAgICAqL1xuICAgIGF0dGlkZW50aXR5OiBcIlwiIHwgXCJhXCIgfCBcImRcIjtcbiAgICAvKiogd2FzIHRoZSBjb2x1bW4gZHJvcHBlZC4gZHJvcHBlZCBjb2x1bW5zIG1pZ2h0IG5vdCBiZSAxMDAlIHJlbW92ZWQgaW1tZWRpYXRlbHkuICovXG4gICAgYXR0aXNkcm9wcGVkOiBib29sZWFuO1xuICAgIC8qKiBjb2x1bW4gbmFtZSAqL1xuICAgIGF0dG5hbWU6IHN0cmluZztcbiAgICAvKiogTk9UIE5VTEwgY29uc3RyYWludDogdHJ1ZSBpZiB0aGUgY29sdW1uIGhhcyBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgKi9cbiAgICBhdHRub3RudWxsOiBib29sZWFuO1xuICAgIC8qKiBjb2x1bW4gb3JkZXIgbnVtYmVyIGluIGl0cyB0YWJsZSAqL1xuICAgIGF0dG51bTogbnVtYmVyO1xuICAgIC8qKiB0YWJsZS92aWV3IGlkZW50aWZpZXIgKi9cbiAgICBhdHRyZWxpZDogc3RyaW5nO1xuICAgIC8qKiBjb2x1bW4gZGF0YXR5cGUgaWRlbnRpZmllciAqL1xuICAgIGF0dHR5cGlkOiBzdHJpbmc7XG4gIH07XG4gIC8qKiByZXNvdXJjZXMsIGUuZy4gdGFibGVzLCBzZXF1ZW5jZXMsIGV0Yy4gKi9cbiAgXCJwZ19jYXRhbG9nLnBnX2NsYXNzXCI6IHtcbiAgICAvKiogcmVzb3VyY2UgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogcmVzb3VyY2Uga2luZDogcmVndWxhciB0YWJsZSwgdmlldyAqL1xuICAgIHJlbGtpbmQ6IFRhYmxlS2luZDtcbiAgICAvKiogcmVzb3VyY2UgbmFtZSAqL1xuICAgIHJlbG5hbWU6IHN0cmluZztcbiAgICAvKiogc2NoZW1hIGlkICovXG4gICAgcmVsbmFtZXNwYWNlOiBudW1iZXI7XG4gIH07XG4gIC8qKiBjb25zdHJhaW50cyAqL1xuICBcInBnX2NhdGFsb2cucGdfY29uc3RyYWludFwiOiB7XG4gICAgLyoqIGlmIGEgZm9yZWlnbiBrZXksIHRoZSByZWZlcmVuY2VkIGNvbHVtbnMgKi9cbiAgICBjb25ma2V5OiBudW1iZXJbXTtcbiAgICAvKiogaWYgYSBmb3JlaWduIGtleSwgdGhlIHJlZmVyZW5jZWQgdGFibGUgKi9cbiAgICBjb25mcmVsaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBhbiBvcmRlcmVkIGFycmF5IG9mIGNvbHVtbnMgaW5jbHVkZWQgaW4gdGhlIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiB0aGUgY29sdW1ucyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgb3JkaW5hbCBudW1iZXIgKGBhdHRudW1gKSBpbiB0aGVpciByZWxhdGlvbiAodGFibGUpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgYCd7MSwzfSdgIC0gYSBjb25zdHJhaW50IHdpdGggMiBjb2x1bW5zLCB0aGUgMXN0ICYgM3JkIGluIHRoZWlyIHRhYmxlLlxuICAgICAqL1xuICAgIGNvbmtleTogbnVtYmVyW107XG4gICAgLyoqIHJlbGF0aW9uICh0YWJsZSkgaWQgd2hpY2ggdGhpcyBjb25zdHJhaW50IHdhcyBjcmVhdGVkIGZvciAqL1xuICAgIGNvbnJlbGlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogY29uc3RyYWludCB0eXBlLlxuICAgICAqXG4gICAgICogYCdwJ2AgLSBwcmltYXJ5IGtleSBjb25zdHJhaW50LlxuICAgICAqIGAnZidgIC0gZm9yZWlnbiBrZXkgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBjb250eXBlOiBcInBcIiB8IFwiZlwiIHwgKHN0cmluZyAmIHt9KTtcbiAgfTtcbiAgLyoqIGVudW0gdHlwZXMnIHZhbHVlcyAqL1xuICBcInBnX2NhdGFsb2cucGdfZW51bVwiOiB7XG4gICAgLyoqIGVudW0gdmFsdWUgKi9cbiAgICBlbnVtbGFiZWw6IHN0cmluZztcbiAgICAvKiogZW51bSdzIHR5cGUgaWQgKi9cbiAgICBlbnVtdHlwaWQ6IG51bWJlcjtcbiAgfTtcbiAgLyoqIHNjaGVtYXMgKi9cbiAgXCJwZ19jYXRhbG9nLnBnX25hbWVzcGFjZVwiOiB7XG4gICAgLyoqIHNjaGVtYSBuYW1lICovXG4gICAgbnNwbmFtZTogc3RyaW5nO1xuICAgIC8qKiBzY2hlbWEgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgfTtcbiAgLyoqIGRhdGF0eXBlcyAqL1xuICBcInBnX2NhdGFsb2cucGdfdHlwZVwiOiB7XG4gICAgLyoqIHR5cGUgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogdHlwZSBuYW1lICovXG4gICAgdHlwbmFtZTogc3RyaW5nO1xuICAgIC8qKiB0eXBlJ3Mgc2NoZW1hIChha2EgbmFtZXNwYWNlKSBpZCAqL1xuICAgIHR5cG5hbWVzcGFjZTogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IHJldHVybnMgbWV0YWRhdGEgZm9yIGFsbCB1c2VyLWRlZmluZWQgdGFibGVzIGFuZCB2aWV3cyBpbiB0aGUgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZXNRdWVyeShcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICByZXR1cm4gY29tcGlsZShcbiAgICBnZXRQb3N0Z3JlU1FMQnVpbGRlcjxEYXRhYmFzZT4ocmVxdWlyZW1lbnRzKVxuICAgICAgLnNlbGVjdEZyb20oXCJwZ19jYXRhbG9nLnBnX2NsYXNzIGFzIGNsc1wiKVxuICAgICAgLmlubmVySm9pbihcInBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGFzIG5zXCIsIFwiY2xzLnJlbG5hbWVzcGFjZVwiLCBcIm5zLm9pZFwiKVxuICAgICAgLiRjYWxsKGV4Y2x1ZGVTeXN0ZW1UYWJsZXMpXG4gICAgICAvLyByZWd1bGFyIHRhYmxlcyBvciB2aWV3c1xuICAgICAgLndoZXJlKFwiY2xzLnJlbGtpbmRcIiwgXCJpblwiLCBUQUJMRV9LSU5EUylcbiAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgIFwibnMubnNwbmFtZSBhcyBzY2hlbWFcIixcbiAgICAgICAgXCJjbHMucmVsbmFtZSBhcyBuYW1lXCIsXG4gICAgICAgIGpzb25BcnJheUZyb20oXG4gICAgICAgICAgZWJcbiAgICAgICAgICAgIC5zZWxlY3RGcm9tKFwicGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYXMgYXR0XCIpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFwicGdfY2F0YWxvZy5wZ190eXBlIGFzIHR5cFwiLCBcInR5cC5vaWRcIiwgXCJhdHQuYXR0dHlwaWRcIilcbiAgICAgICAgICAgIC5pbm5lckpvaW4oXG4gICAgICAgICAgICAgIFwicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgYXMgdG5zXCIsXG4gICAgICAgICAgICAgIFwidG5zLm9pZFwiLFxuICAgICAgICAgICAgICBcInR5cC50eXBuYW1lc3BhY2VcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5sZWZ0Sm9pbihcInBnX2NhdGFsb2cucGdfY29uc3RyYWludCBhcyBwa19jb25cIiwgKGpiKSA9PlxuICAgICAgICAgICAgICBqYlxuICAgICAgICAgICAgICAgIC5vbihcInBrX2Nvbi5jb250eXBlXCIsIFwiPVwiLCBcInBcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJwa19jb24uY29ucmVsaWRcIiwgXCI9XCIsIFwiY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC5vbigoZWIpID0+IGViKFwiYXR0LmF0dG51bVwiLCBcIj1cIiwgZWIuZm4uYW55KFwicGtfY29uLmNvbmtleVwiKSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19jb25zdHJhaW50IGFzIGZrX2NvblwiLCAoamIpID0+XG4gICAgICAgICAgICAgIGpiXG4gICAgICAgICAgICAgICAgLm9uKFwiZmtfY29uLmNvbnR5cGVcIiwgXCI9XCIsIFwiZlwiKVxuICAgICAgICAgICAgICAgIC5vblJlZihcImZrX2Nvbi5jb25yZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAgICAgLm9uKChlYikgPT4gZWIoXCJhdHQuYXR0bnVtXCIsIFwiPVwiLCBlYi5mbi5hbnkoXCJma19jb24uY29ua2V5XCIpKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXG4gICAgICAgICAgICAgIFwicGdfY2F0YWxvZy5wZ19jbGFzcyBhcyBma19jbHNcIixcbiAgICAgICAgICAgICAgXCJma19jbHMub2lkXCIsXG4gICAgICAgICAgICAgIFwiZmtfY29uLmNvbmZyZWxpZFwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFxuICAgICAgICAgICAgICBcInBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGFzIGZrX25zXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMub2lkXCIsXG4gICAgICAgICAgICAgIFwiZmtfY2xzLnJlbG5hbWVzcGFjZVwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYXMgZmtfYXR0XCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJma19hdHQuYXR0cmVsaWRcIiwgXCI9XCIsIFwiZmtfY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC8vIFVzZSBhIGNhbGxiYWNrIGZvciB0aGUgLm9uKCkgY29uZGl0aW9uIHRvIGVuc3VyZSBjb3JyZWN0IGNvbnRleHQgZm9yIHR5cGVzXG4gICAgICAgICAgICAgICAgLm9uKChvbl9lYikgPT5cbiAgICAgICAgICAgICAgICAgIG9uX2ViKFwiZmtfYXR0LmF0dG51bVwiLCBcIj1cIiwgb25fZWIuZm4uYW55KFwiZmtfY29uLmNvbmZrZXlcIikpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJwZ19jYXRhbG9nLnBnX2F0dHJkZWYgYXMgZGVmXCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJkZWYuYWRyZWxpZFwiLCBcIj1cIiwgXCJhdHQuYXR0cmVsaWRcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJkZWYuYWRudW1cIiwgXCI9XCIsIFwiYXR0LmF0dG51bVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC53aGVyZVJlZihcImF0dC5hdHRyZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAvLyBleGNsdWRlIHN5c3RlbSBjb2x1bW5zXG4gICAgICAgICAgICAud2hlcmUoXCJhdHQuYXR0bnVtXCIsIFwiPj1cIiwgMClcbiAgICAgICAgICAgIC53aGVyZShcImF0dC5hdHRpc2Ryb3BwZWRcIiwgXCIhPVwiLCB0cnVlKVxuICAgICAgICAgICAgLnNlbGVjdChbXG4gICAgICAgICAgICAgIFwiYXR0LmF0dG5hbWUgYXMgbmFtZVwiLFxuICAgICAgICAgICAgICBcImZrX2F0dC5hdHRuYW1lIGFzIGZrX2NvbHVtblwiLFxuICAgICAgICAgICAgICBcImZrX2Nscy5yZWxuYW1lIGFzIGZrX3RhYmxlXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMubnNwbmFtZSBhcyBma19zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJ0bnMubnNwbmFtZSBhcyBkYXRhdHlwZV9zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJ0eXAudHlwbmFtZSBhcyBkYXRhdHlwZVwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgICAgICAgIGViKFwiYXR0LmF0dGlkZW50aXR5XCIsIFwiIT1cIiwgXCJcIilcbiAgICAgICAgICAgICAgICAub3IoXG4gICAgICAgICAgICAgICAgICBlYihcImRlZi5hZGJpblwiLCBcImlzIG5vdFwiLCBudWxsKS5hbmQoXG4gICAgICAgICAgICAgICAgICAgIGViLmZuKFwicGdfZ2V0X2V4cHJcIiwgW1wiZGVmLmFkYmluXCIsIFwiZGVmLmFkcmVsaWRcIl0pLFxuICAgICAgICAgICAgICAgICAgICBcImxpa2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJuZXh0dmFsKCVcIixcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC4kY2FzdFRvPGJvb2xlYW4+KClcbiAgICAgICAgICAgICAgICAuYXMoXCJhdXRvaW5jXCIpLFxuICAgICAgICAgICAgICBlYihcImF0dC5hdHRnZW5lcmF0ZWRcIiwgXCIhPVwiLCBcIlwiKVxuICAgICAgICAgICAgICAgIC4kY2FzdFRvPGJvb2xlYW4+KClcbiAgICAgICAgICAgICAgICAuYXMoXCJjb21wdXRlZFwiKSxcbiAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAuZm48c3RyaW5nIHwgbnVsbD4oXCJwZ19nZXRfZXhwclwiLCBbXCJkZWYuYWRiaW5cIiwgXCJkZWYuYWRyZWxpZFwiXSlcbiAgICAgICAgICAgICAgICAuYXMoXCJkZWZhdWx0XCIpLFxuICAgICAgICAgICAgICBlYihcImF0dC5hdHRub3RudWxsXCIsIFwiIT1cIiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAuJGNhc3RUbzxib29sZWFuPigpXG4gICAgICAgICAgICAgICAgLmFzKFwibnVsbGFibGVcIiksXG4gICAgICAgICAgICAgIGViLmZuXG4gICAgICAgICAgICAgICAgLmNvYWxlc2NlKFxuICAgICAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEZyb20oXCJwZ19jYXRhbG9nLnBnX2VudW0gYXMgZW5tXCIpXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZVJlZihcImVubS5lbnVtdHlwaWRcIiwgXCI9XCIsIFwidHlwLm9pZFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgICAgICAgICAgICAgICBlYi5mbi5qc29uQWdnKGViLnJlZihcImVubS5lbnVtbGFiZWxcIikpLmFzKFwib1wiKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHNxbDxzdHJpbmdbXT5gJ1tdJ2AsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hcyhcIm9wdGlvbnNcIiksXG4gICAgICAgICAgICAgIGViXG4gICAgICAgICAgICAgICAgLmZuPFxuICAgICAgICAgICAgICAgICAgbnVtYmVyIHwgbnVsbFxuICAgICAgICAgICAgICAgID4oXCJhcnJheV9wb3NpdGlvblwiLCBbXCJwa19jb24uY29ua2V5XCIsIFwiYXR0LmF0dG51bVwiXSlcbiAgICAgICAgICAgICAgICAuYXMoXCJwa1wiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApLmFzKFwiY29sdW1uc1wiKSxcbiAgICAgIF0pLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RhYmxlc1F1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHNjaGVtYTogXCJ6b29cIixcbiAgICAgIG5hbWU6IFwiYW5pbWFsc1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogdHJ1ZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiaW50NFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJuZXh0dmFsKCd6b28uYW5pbWFsc19pZF9zZXEnOjpyZWdjbGFzcylcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNjaGVtYTogXCJwdWJsaWNcIixcbiAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmM6IHRydWUsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludDRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwibmV4dHZhbCgndXNlcnNfaWRfc2VxJzo6cmVnY2xhc3MpXCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgZGF0YXR5cGVfc2NoZW1hOiBcInBnX2NhdGFsb2dcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJkZWxldGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhclwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwicm9sZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmM6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiB0cnVlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVfcm9sZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzY2hlbWE6IFwicHVibGljXCIsXG4gICAgICBuYW1lOiBcImNvbXBvc2l0ZV9wa1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInV1aWRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiZ2VuX3JhbmRvbV91dWlkKClcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiAyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJub3coKVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCB0aW1lem9uZSBzZXR0aW5nIG9mIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVRdWVyeSgpIHtcbiAgY29uc3QgYnVpbGRlciA9IGdldFBvc3RncmVTUUxCdWlsZGVyKCk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlci5zZWxlY3ROb0Zyb20oXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5mbjxzdHJpbmc+KFwiY3VycmVudF9zZXR0aW5nXCIsIFtzcWwubGl0KFwidGltZXpvbmVcIildKVxuICAgICAgICAuYXMoXCJ0aW1lem9uZVwiKSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RpbWV6b25lUXVlcnkoKSB7XG4gIHJldHVybiBbeyB0aW1lem9uZTogXCJVVENcIiB9XSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8XG4gICAgdHlwZW9mIGdldFRpbWV6b25lUXVlcnlcbiAgPjtcbn1cblxuLyoqXG4gKiBXZSBkb24ndCB3YW50IFBvc3RncmVTUUwgaW50ZXJuYWxzIGluIGludHJvc3BlY3Rpb24gcmVzdWx0cy4gVG8gYmUgdXNlZCBpbiBgJGNhbGxgLlxuICovXG5mdW5jdGlvbiBleGNsdWRlU3lzdGVtVGFibGVzPFxuICBUIGV4dGVuZHMgU2VsZWN0UXVlcnlCdWlsZGVyPFxuICAgIERhdGFiYXNlICYge1xuICAgICAgbnM6IERhdGFiYXNlW1wicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2VcIl07XG4gICAgICBjbHM6IERhdGFiYXNlW1wicGdfY2F0YWxvZy5wZ19jbGFzc1wiXTtcbiAgICB9LFxuICAgIFwibnNcIiB8IFwiY2xzXCIsXG4gICAgb2JqZWN0XG4gID4sXG4+KHFiOiBUKTogVCB7XG4gIHJldHVybiBxYlxuICAgIC53aGVyZShgbnMubnNwbmFtZWAsIGAhfmAsIGBecGdfYClcbiAgICAud2hlcmUoYG5zLm5zcG5hbWVgLCBgIT1gLCBgaW5mb3JtYXRpb25fc2NoZW1hYCkgYXMgbmV2ZXI7XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJEZWxldGVSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckVycm9yLFxuICB0eXBlIEFkYXB0ZXJJbnNlcnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJSYXdEZXRhaWxzLFxuICB0eXBlIEFkYXB0ZXJSYXdSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclJlcXVpcmVtZW50cyxcbiAgdHlwZSBBZGFwdGVyU3FsTGludERldGFpbHMsXG4gIHR5cGUgQWRhcHRlclNxbExpbnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclNxbFNjaGVtYVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyVXBkYXRlUmVzdWx0LFxuICB0eXBlIENvbHVtbixcbiAgY3JlYXRlQWRhcHRlckVycm9yLFxuICB0eXBlIEZpbHRlck9wZXJhdG9yLFxuICB0eXBlIFRhYmxlLFxufSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUsXG4gIGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzLFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcbmltcG9ydCB7IGFzUXVlcnksIHR5cGUgUXVlcnksIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBjcmVhdGVTcWxFZGl0b3JTY2hlbWFGcm9tSW50cm9zcGVjdGlvbiB9IGZyb20gXCIuLi9zcWwtZWRpdG9yLXNjaGVtYVwiO1xuaW1wb3J0IHR5cGUgeyBFaXRoZXIgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIH0gZnJvbSBcIi4vZGF0YXR5cGVcIjtcbmltcG9ydCB7XG4gIGdldERlbGV0ZVF1ZXJ5LFxuICBnZXRJbnNlcnRRdWVyeSxcbiAgZ2V0U2VsZWN0UXVlcnksXG4gIGdldFVwZGF0ZVF1ZXJ5LFxufSBmcm9tIFwiLi9kbWxcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlc1F1ZXJ5LFxuICBnZXRUaW1lem9uZVF1ZXJ5LFxuICBtb2NrVGFibGVzUXVlcnksXG4gIG1vY2tUaW1lem9uZVF1ZXJ5LFxufSBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5pbXBvcnQge1xuICBjcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcixcbiAgdmFsaWRhdGVTcWxGb3JMaW50LFxufSBmcm9tIFwiLi9zcWwtbGludFwiO1xuXG5leHBvcnQgdHlwZSBQb3N0Z3Jlc0FkYXB0ZXJSZXF1aXJlbWVudHMgPSBBZGFwdGVyUmVxdWlyZW1lbnRzO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9zdGdyZXNBZGFwdGVyKFxuICByZXF1aXJlbWVudHM6IFBvc3RncmVzQWRhcHRlclJlcXVpcmVtZW50cyxcbik6IEFkYXB0ZXIge1xuICBjb25zdCB7IGV4ZWN1dG9yLCAuLi5vdGhlclJlcXVpcmVtZW50cyB9ID0gcmVxdWlyZW1lbnRzO1xuICBjb25zdCBmdWxsVGFibGVTZWFyY2hTdGF0ZSA9IGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlKCk7XG4gIGxldCBjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgPSB0eXBlb2YgZXhlY3V0b3IubGludFNxbCA9PT0gXCJmdW5jdGlvblwiO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGludHJvc3BlY3REYXRhYmFzZShcbiAgICBvcHRpb25zOiBQYXJhbWV0ZXJzPEFkYXB0ZXJbXCJpbnRyb3NwZWN0XCJdPlswXSxcbiAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFibGVzUXVlcnkgPSBnZXRUYWJsZXNRdWVyeShvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICBjb25zdCB0aW1lem9uZVF1ZXJ5ID0gZ2V0VGltZXpvbmVRdWVyeSgpO1xuXG4gICAgICBjb25zdCBbW3RhYmxlc0Vycm9yLCB0YWJsZXNdLCBbdGltZXpvbmVFcnJvciwgdGltZXpvbmVzXV0gPVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YWJsZXNRdWVyeSwgb3B0aW9ucyksXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0aW1lem9uZVF1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgXSk7XG5cbiAgICAgIGlmICh0YWJsZXNFcnJvcikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRhYmxlc0Vycm9yLCBxdWVyeTogdGFibGVzUXVlcnkgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lem9uZUVycm9yKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgIGVycm9yOiB0aW1lem9uZUVycm9yLFxuICAgICAgICAgIHF1ZXJ5OiB0aW1lem9uZVF1ZXJ5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZXpvbmUgPSB0aW1lem9uZXNbMF0/LnRpbWV6b25lO1xuXG4gICAgICBpZiAoIXRpbWV6b25lKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJUaW1lem9uZSBub3QgZm91bmRcIiksXG4gICAgICAgICAgcXVlcnk6IHRpbWV6b25lUXVlcnksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW1xuICAgICAgICBudWxsLFxuICAgICAgICBjcmVhdGVJbnRyb3NwZWN0aW9uKHsgcXVlcnk6IHRhYmxlc1F1ZXJ5LCB0YWJsZXMsIHRpbWV6b25lIH0pLFxuICAgICAgXTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlZmF1bHRTY2hlbWE6IFwicHVibGljXCIsXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICBmdWxsVGFibGVTZWFyY2g6IHRydWUsXG4gICAgICBzcWxEaWFsZWN0OiBcInBvc3RncmVzcWxcIixcbiAgICAgIHNxbEVkaXRvckF1dG9jb21wbGV0ZTogdHJ1ZSxcbiAgICAgIHNxbEVkaXRvckxpbnQ6IHRydWUsXG4gICAgfSxcblxuICAgIGFzeW5jIGludHJvc3BlY3QoXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgaW50cm9zcGVjdERhdGFiYXNlKG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBxdWVyeShcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0c10gPVxuICAgICAgICAgIGF3YWl0IGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzKHtcbiAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoVGVybTogZGV0YWlscy5mdWxsVGFibGVTZWFyY2hUZXJtLFxuICAgICAgICAgICAgc3RhdGU6IGZ1bGxUYWJsZVNlYXJjaFN0YXRlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIG51bGwsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsdGVyZWRSb3dDb3VudDogcmVzdWx0c1swXT8uX19wc19jb3VudF9fIHx8IFwiMFwiLFxuICAgICAgICAgICAgcm93czogcmVzdWx0cyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByYXcoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJSYXdSZXN1bHQ+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVJhd1F1ZXJ5KGV4ZWN1dG9yLCBkZXRhaWxzLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3FsU2NoZW1hKFxuICAgICAgX2RldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclNxbFNjaGVtYVJlc3VsdD4+IHtcbiAgICAgIGNvbnN0IFtlcnJvciwgaW50cm9zcGVjdGlvbl0gPSBhd2FpdCBpbnRyb3NwZWN0RGF0YWJhc2Uob3B0aW9ucyk7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY3JlYXRlU3FsRWRpdG9yU2NoZW1hRnJvbUludHJvc3BlY3Rpb24oe1xuICAgICAgICAgIGRlZmF1bHRTY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgZGlhbGVjdDogXCJwb3N0Z3Jlc3FsXCIsXG4gICAgICAgICAgaW50cm9zcGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgIH0sXG5cbiAgICBhc3luYyBzcWxMaW50KFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyU3FsTGludFJlc3VsdD4+IHtcbiAgICAgIGlmIChjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgJiYgdHlwZW9mIGV4ZWN1dG9yLmxpbnRTcWwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmxpbnRTcWwoZGV0YWlscywgb3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzaG91bGRGYWxsYmFja1RvRXhwbGFpbkxpbnQoZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZERpc2FibGVMaW50VHJhbnNwb3J0KGVycm9yKSkge1xuICAgICAgICAgICAgY2FuVXNlRXhlY3V0b3JMaW50VHJhbnNwb3J0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmICghc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2hvdWxkRGlzYWJsZUxpbnRUcmFuc3BvcnQoZXJyb3IpKSB7XG4gICAgICAgICAgICBjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGxpbnRXaXRoRXhwbGFpbkZhbGxiYWNrKGV4ZWN1dG9yLCBkZXRhaWxzLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaW5zZXJ0KFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW5zZXJ0UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRJbnNlcnRRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByb3dzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93cywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGUoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJVcGRhdGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFVwZGF0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtyb3ddID0gcmVzdWx0cztcblxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlVwZGF0ZSBmYWlsZWRcIiksXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyByb3csIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyRGVsZXRlUmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXREZWxldGVRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgLi4uZGV0YWlscywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZhbGxiYWNrVG9FeHBsYWluTGludChlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW52YWxpZCBwcm9jZWR1cmVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwidW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3JcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW50ZXJuYWwgc2VydmVyIGVycm9yXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImJhZCBnYXRld2F5XCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcInNlcnZpY2UgdW5hdmFpbGFibGVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwibm90IHN1cHBvcnRlZFwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJtZXRob2Qgbm90IGFsbG93ZWRcIilcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGlzYWJsZUxpbnRUcmFuc3BvcnQoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiAoXG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImludmFsaWQgcHJvY2VkdXJlXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcInVuZXhwZWN0ZWQgc2VydmVyIGVycm9yXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImludGVybmFsIHNlcnZlciBlcnJvclwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJub3Qgc3VwcG9ydGVkXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIm1ldGhvZCBub3QgYWxsb3dlZFwiKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaW50V2l0aEV4cGxhaW5GYWxsYmFjayhcbiAgZXhlY3V0b3I6IEFkYXB0ZXJSZXF1aXJlbWVudHNbXCJleGVjdXRvclwiXSxcbiAgZGV0YWlsczogQWRhcHRlclNxbExpbnREZXRhaWxzLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPEFkYXB0ZXJbXCJzcWxMaW50XCJdPj5bMV0sXG4pOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJTcWxMaW50UmVzdWx0Pj4ge1xuICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVTcWxGb3JMaW50KGRldGFpbHMuc3FsKTtcblxuICBpZiAoIXZhbGlkYXRpb24ub2spIHtcbiAgICByZXR1cm4gW1xuICAgICAgbnVsbCxcbiAgICAgIHtcbiAgICAgICAgZGlhZ25vc3RpY3M6IFt2YWxpZGF0aW9uLmRpYWdub3N0aWNdLFxuICAgICAgICBzY2hlbWFWZXJzaW9uOiBkZXRhaWxzLnNjaGVtYVZlcnNpb24sXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBjb25zdCBkaWFnbm9zdGljczogQWRhcHRlclNxbExpbnRSZXN1bHRbXCJkaWFnbm9zdGljc1wiXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHZhbGlkYXRpb24uc3RhdGVtZW50cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleHBsYWluUXVlcnkgPSBhc1F1ZXJ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgYEVYUExBSU4gKEZPUk1BVCBKU09OKSAke3N0YXRlbWVudC5zdGF0ZW1lbnR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShleHBsYWluUXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICAuLi5jcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcih7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcG9zaXRpb25PZmZzZXQ6IHN0YXRlbWVudC5mcm9tLFxuICAgICAgICAgIHNxbDogc3RhdGVtZW50LnN0YXRlbWVudCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBkaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICAuLi5jcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcih7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcG9zaXRpb25PZmZzZXQ6IHN0YXRlbWVudC5mcm9tLFxuICAgICAgICAgIHNxbDogc3RhdGVtZW50LnN0YXRlbWVudCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbXG4gICAgbnVsbCxcbiAgICB7XG4gICAgICBkaWFnbm9zdGljcyxcbiAgICAgIHNjaGVtYVZlcnNpb246IGRldGFpbHMuc2NoZW1hVmVyc2lvbixcbiAgICB9LFxuICBdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlUmF3UXVlcnkoXG4gIGV4ZWN1dG9yOiBBZGFwdGVyUmVxdWlyZW1lbnRzW1wiZXhlY3V0b3JcIl0sXG4gIGRldGFpbHM6IEFkYXB0ZXJSYXdEZXRhaWxzLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPEFkYXB0ZXJbXCJyYXdcIl0+WzFdLFxuKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyUmF3UmVzdWx0Pj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYXNRdWVyeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZGV0YWlscy5zcWwpO1xuICAgIGNvbnN0IFtlcnJvciwgcm93c10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgbnVsbCxcbiAgICAgIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgICAgcm93czogcm93cyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUludHJvc3BlY3Rpb24oYXJnczoge1xuICBxdWVyeTogUXVlcnk7XG4gIHRhYmxlczogUXVlcnlSZXN1bHQ8dHlwZW9mIGdldFRhYmxlc1F1ZXJ5PjtcbiAgdGltZXpvbmU6IHN0cmluZztcbn0pOiBBZGFwdGVySW50cm9zcGVjdFJlc3VsdCB7XG4gIGNvbnN0IHsgcXVlcnksIHRhYmxlcywgdGltZXpvbmUgfSA9IGFyZ3M7XG5cbiAgcmV0dXJuIHRhYmxlcy5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgdGFibGUpID0+IHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hcyB9ID0gcmVzdWx0O1xuICAgICAgY29uc3QgeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9ID0gdGFibGU7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnNSZWNvcmQgPSBjb2x1bW5zLnJlZHVjZShcbiAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGF1dG9pbmMsXG4gICAgICAgICAgICBjb21wdXRlZCxcbiAgICAgICAgICAgIGRhdGF0eXBlLFxuICAgICAgICAgICAgZGF0YXR5cGVfc2NoZW1hLFxuICAgICAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgbmFtZTogY29sdW1uTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBudWxsYWJsZSxcbiAgICAgICAgICB9ID0gY29sdW1uO1xuXG4gICAgICAgICAgY29uc3QgaXNBcnJheSA9IGRhdGF0eXBlLnN0YXJ0c1dpdGgoXCJfXCIpO1xuICAgICAgICAgIGNvbnN0IHN0cmlwcGVkRGF0YVR5cGUgPSBpc0FycmF5ID8gZGF0YXR5cGUuc2xpY2UoMSkgOiBkYXRhdHlwZTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgW2NvbHVtbk5hbWVdOiB7XG4gICAgICAgICAgICAgIGRhdGF0eXBlOiB7XG4gICAgICAgICAgICAgICAgLi4uKFBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQVtzdHJpcHBlZERhdGFUeXBlXSB8fCB7XG4gICAgICAgICAgICAgICAgICBncm91cDogb3B0aW9ucy5sZW5ndGggPiAwID8gXCJlbnVtXCIgOiBcInJhd1wiLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgICAgICAgaXNOYXRpdmU6IGRhdGF0eXBlX3NjaGVtYSA9PT0gXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogaXNBcnJheSA/IGAke3N0cmlwcGVkRGF0YVR5cGV9W11gIDogc3RyaXBwZWREYXRhVHlwZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogZGF0YXR5cGVfc2NoZW1hLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgIGZrQ29sdW1uOiBjb2x1bW4uZmtfY29sdW1uLFxuICAgICAgICAgICAgICBma1NjaGVtYTogY29sdW1uLmZrX3NjaGVtYSxcbiAgICAgICAgICAgICAgZmtUYWJsZTogY29sdW1uLmZrX3RhYmxlLFxuICAgICAgICAgICAgICBpc0F1dG9pbmNyZW1lbnQ6IGF1dG9pbmMsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IGNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc1JlcXVpcmVkOlxuICAgICAgICAgICAgICAgICFudWxsYWJsZSAmJiAhYXV0b2luYyAmJiAhY29tcHV0ZWQgJiYgZGVmYXVsdFZhbHVlID09IG51bGwsXG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgIG51bGxhYmxlLFxuICAgICAgICAgICAgICBwa1Bvc2l0aW9uOiBjb2x1bW4ucGssXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgIH0gYXMgY29uc3Qgc2F0aXNmaWVzIENvbHVtbixcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICApO1xuXG4gICAgICBpZiAoc2NoZW1hc1tzY2hlbWFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NoZW1hc1tzY2hlbWFdID0geyBuYW1lOiBzY2hlbWEsIHRhYmxlczoge30gfTtcbiAgICAgIH1cblxuICAgICAgc2NoZW1hc1tzY2hlbWFdLnRhYmxlc1t0YWJsZU5hbWVdID0ge1xuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zUmVjb3JkLFxuICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICB7XG4gICAgICBmaWx0ZXJPcGVyYXRvcnMsXG4gICAgICBxdWVyeSxcbiAgICAgIHNjaGVtYXM6IHsgcHVibGljOiB7IG5hbWU6IFwicHVibGljXCIsIHRhYmxlczoge30gfSB9LFxuICAgICAgdGltZXpvbmUsXG4gICAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQgYXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gICk7XG59XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuICBcImlsaWtlXCIsXG4gIFwibm90IGlsaWtlXCIsXG5dIHNhdGlzZmllcyBGaWx0ZXJPcGVyYXRvcltdO1xuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja0ludHJvc3BlY3QoKSB7XG4gIGNvbnN0IHRhYmxlcyA9IG1vY2tUYWJsZXNRdWVyeSgpO1xuICBjb25zdCBbeyB0aW1lem9uZSB9XSA9IG1vY2tUaW1lem9uZVF1ZXJ5KCk7XG4gIGNvbnN0IHF1ZXJ5ID0geyBwYXJhbWV0ZXJzOiBbXSwgc3FsOiBcIjxtb2NrZWQ+XCIgfSBhcyBRdWVyeTtcblxuICByZXR1cm4gY3JlYXRlSW50cm9zcGVjdGlvbih7IHRhYmxlcywgdGltZXpvbmUsIHF1ZXJ5IH0pIGFzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCwgbm8gbmVlZCBnbyBvdmVyYm9hcmQuXG4gICAgc2NoZW1hczoge1xuICAgICAgW0sgaW4gKHR5cGVvZiB0YWJsZXMpW251bWJlcl1bXCJzY2hlbWFcIl1dOiB7XG4gICAgICAgIG5hbWU6IEs7XG4gICAgICAgIHRhYmxlczoge1xuICAgICAgICAgIFtUIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wibmFtZVwiXV06IFRhYmxlO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRpbWV6b25lOiB0eXBlb2YgdGltZXpvbmU7XG4gICAgZmlsdGVyT3BlcmF0b3JzOiBGaWx0ZXJPcGVyYXRvcltdO1xuICAgIHF1ZXJ5OiBRdWVyeTtcbiAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztzVUFFTyxJQUFNQSxFQUdULENBQ0YsS0FBTSxDQUNKLE1BQU8sU0FDVCxFQUNBLFFBQVMsQ0FDUCxNQUFPLFNBQ1QsRUFDQSxNQUFPLENBQ0wsTUFBTyxRQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sUUFD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QixLQUN4RCxLQUFNQyxFQUNOLFNBQUFDLEVBQ0EsV0FBWVAsRUFBTyxHQUNuQixPQUFBRixFQUNBLE1BQU9ELENBQ1QsQ0FDRixDQUNGLEVBQ0EsQ0FBQyxDQUNILEVBRUEsT0FBSUYsRUFBUUcsQ0FBTSxJQUFNLFNBQ3RCSCxFQUFRRyxDQUFNLEVBQUksQ0FBRSxLQUFNQSxFQUFRLE9BQVEsQ0FBQyxDQUFFLEdBRy9DSCxFQUFRRyxDQUFNLEVBQUUsT0FBT0QsQ0FBUyxFQUFJLENBQ2xDLFFBQVNFLEVBQ1QsS0FBTUYsRUFDTixPQUFBQyxDQUNGLEVBRU90QixDQUNULEVBQ0EsQ0FDRSxnQkFBQW1DLEdBQ0EsTUFBQTNDLEVBQ0EsUUFBUyxDQUFFLE9BQVEsQ0FBRSxLQUFNLFNBQVUsT0FBUSxDQUFDLENBQUUsQ0FBRSxFQUNsRCxTQUFBSixDQUNGLENBQ0YsQ0FDRixDQUVBLElBQU0rQyxHQUFrQixDQUN0QixJQUNBLEtBQ0EsSUFDQSxLQUNBLElBQ0EsS0FDQSxLQUNBLFNBQ0EsT0FDQSxXQUNBLFFBQ0EsV0FDRixFQUtPLFNBQVNDLElBQWlCLENBQy9CLElBQU1wRCxFQUFTcUQsR0FBZ0IsRUFDekIsQ0FBQyxDQUFFLFNBQUFqRCxDQUFTLENBQUMsRUFBSWtELEdBQWtCLEVBR3pDLE9BQU9qRCxHQUFvQixDQUFFLE9BQUFMLEVBQVEsU0FBQUksRUFBVSxNQUZqQyxDQUFFLFdBQVksQ0FBQyxFQUFHLElBQUssVUFBVyxDQUVLLENBQUMsQ0FjeEQiLAogICJuYW1lcyI6IFsiUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIiwgImdldFBvc3RncmVTUUxCdWlsZGVyIiwgInJlcXVpcmVtZW50cyIsICJnZXRCdWlsZGVyIiwgIlBvc3RncmVzQWRhcHRlciIsICJQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIiLCAiYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuIiwgImFyZ3MiLCAiYmFzZVBsYW4iLCAibm9ybWFsaXplZFNlYXJjaFRlcm0iLCAiZXhpc3RpbmdUZXh0Q29sdW1ucyIsICJwcmVkaWNhdGUiLCAicmVtYWluaW5nVGV4dFNsb3RzIiwgInBhdHRlcm4iLCAiZXNjYXBlTGlrZVBhdHRlcm4iLCAic3VwcGxlbWVudGFsUHJlZGljYXRlcyIsICJjb2x1bW4iLCAidmFsdWUiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAiZGV0YWlscyIsICJyZXF1aXJlbWVudHMiLCAicm93cyIsICJjb2x1bW5zIiwgInRhYmxlTmFtZSIsICJzY2hlbWEiLCAiYnVpbGRlciIsICJnZXRQb3N0Z3JlU1FMQnVpbGRlciIsICJjb21waWxlIiwgImFwcGx5VHJhbnNmb3JtYXRpb25zIiwgImdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMiLCAiZ2V0U2VsZWN0UXVlcnkiLCAiZmlsdGVyIiwgImZ1bGxUYWJsZVNlYXJjaFRlcm0iLCAicGFnZUluZGV4IiwgInBhZ2VTaXplIiwgInNvcnRPcmRlciIsICJhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbiIsICJnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uIiwgImZ1bGxUYWJsZVNlYXJjaFBsYW4iLCAiYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuIiwgImNvbWJpbmVkV2hlcmVFeHByZXNzaW9uIiwgImViIiwgImdldEZ1bGxUYWJsZVNlYXJjaEV4cHJlc3Npb24iLCAiQUdHX05BTUUiLCAiQ09VTlRfUkVGIiwgIlNFQVJDSF9HVUFSRFJBSUxTX05BTUUiLCAiaXNGdWxsVGFibGVTZWFyY2hSZXF1ZXN0IiwgInFiIiwgInNxbCIsICJqYiIsICJjdXJyZW50UXVlcnkiLCAiaXRlbSIsICJjb2x1bW4iLCAiY291bnRRdWVyeSIsICJtb2NrU2VsZWN0UXVlcnkiLCAiZ2V0VXBkYXRlUXVlcnkiLCAiY2hhbmdlcyIsICJyb3ciLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAiZ2V0RGVsZXRlUXVlcnkiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAianNvbkFycmF5RnJvbSIsICJleHByIiwgInNxbCIsICJSRUdVTEFSX1RBQkxFX0tJTkQiLCAiVklFV19UQUJMRV9LSU5EIiwgIlRBQkxFX0tJTkRTIiwgImdldFRhYmxlc1F1ZXJ5IiwgInJlcXVpcmVtZW50cyIsICJjb21waWxlIiwgImdldFBvc3RncmVTUUxCdWlsZGVyIiwgImV4Y2x1ZGVTeXN0ZW1UYWJsZXMiLCAiZWIiLCAianNvbkFycmF5RnJvbSIsICJqYiIsICJvbl9lYiIsICJzcWwiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgImdldFRpbWV6b25lUXVlcnkiLCAiYnVpbGRlciIsICJtb2NrVGltZXpvbmVRdWVyeSIsICJxYiIsICJjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXIiLCAicmVxdWlyZW1lbnRzIiwgImV4ZWN1dG9yIiwgIm90aGVyUmVxdWlyZW1lbnRzIiwgImZ1bGxUYWJsZVNlYXJjaFN0YXRlIiwgImNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlIiwgImNhblVzZUV4ZWN1dG9yTGludFRyYW5zcG9ydCIsICJpbnRyb3NwZWN0RGF0YWJhc2UiLCAib3B0aW9ucyIsICJ0YWJsZXNRdWVyeSIsICJnZXRUYWJsZXNRdWVyeSIsICJ0aW1lem9uZVF1ZXJ5IiwgImdldFRpbWV6b25lUXVlcnkiLCAidGFibGVzRXJyb3IiLCAidGFibGVzIiwgInRpbWV6b25lRXJyb3IiLCAidGltZXpvbmVzIiwgImNyZWF0ZUFkYXB0ZXJFcnJvciIsICJ0aW1lem9uZSIsICJjcmVhdGVJbnRyb3NwZWN0aW9uIiwgImVycm9yIiwgImRldGFpbHMiLCAicXVlcnkiLCAiZ2V0U2VsZWN0UXVlcnkiLCAicmVzdWx0cyIsICJleGVjdXRlUXVlcnlXaXRoRnVsbFRhYmxlU2VhcmNoR3VhcmRyYWlscyIsICJleGVjdXRlUmF3UXVlcnkiLCAiX2RldGFpbHMiLCAiaW50cm9zcGVjdGlvbiIsICJjcmVhdGVTcWxFZGl0b3JTY2hlbWFGcm9tSW50cm9zcGVjdGlvbiIsICJyZXN1bHQiLCAic2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50IiwgInNob3VsZERpc2FibGVMaW50VHJhbnNwb3J0IiwgImxpbnRXaXRoRXhwbGFpbkZhbGxiYWNrIiwgImdldEluc2VydFF1ZXJ5IiwgInJvd3MiLCAiZ2V0VXBkYXRlUXVlcnkiLCAicm93IiwgImdldERlbGV0ZVF1ZXJ5IiwgIm1lc3NhZ2UiLCAidmFsaWRhdGlvbiIsICJ2YWxpZGF0ZVNxbEZvckxpbnQiLCAiZGlhZ25vc3RpY3MiLCAic3RhdGVtZW50IiwgImV4cGxhaW5RdWVyeSIsICJhc1F1ZXJ5IiwgImNyZWF0ZUxpbnREaWFnbm9zdGljc0Zyb21Qb3N0Z3Jlc0Vycm9yIiwgImFyZ3MiLCAidGFibGUiLCAic2NoZW1hcyIsICJjb2x1bW5zIiwgInRhYmxlTmFtZSIsICJzY2hlbWEiLCAiY29sdW1uc1JlY29yZCIsICJjb2x1bW4iLCAiYXV0b2luYyIsICJjb21wdXRlZCIsICJkYXRhdHlwZSIsICJkYXRhdHlwZV9zY2hlbWEiLCAiZGVmYXVsdFZhbHVlIiwgImNvbHVtbk5hbWUiLCAibnVsbGFibGUiLCAiaXNBcnJheSIsICJzdHJpcHBlZERhdGFUeXBlIiwgIlBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJmaWx0ZXJPcGVyYXRvcnMiLCAibW9ja0ludHJvc3BlY3QiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgIm1vY2tUaW1lem9uZVF1ZXJ5Il0KfQo=
9
+ import{a as m}from"./chunk-UQDXNCLC.js";import{a as w,b as q,d as C,e as z,h as D,i as L,j as Q,k as U,l as F}from"./chunk-PI3N7ZW6.js";import{a as G}from"./chunk-N6ZIYSZ5.js";import{c as $,d as O}from"./chunk-DTFJIWXL.js";import{A as I,C as B,D as Y,p as N,q as p,t as H,u as j,x as v,y as P,z as k}from"./chunk-TB3YFW43.js";var J={bool:{group:"boolean"},boolean:{group:"boolean"},bytea:{group:"string"},char:{group:"string"},citext:{group:"string"},date:{format:"YYYY-MM-DD",group:"datetime"},interval:{group:"string"},name:{group:"string"},varchar:{group:"string"},text:{group:"string"},time:{format:"HH:mm:ss.SSS",group:"time"},timestamp:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},timestamptz:{format:"YYYY-MM-DD HH:mm:ss.SSSZZ",group:"datetime"},"timestamp without time zone":{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},"timestamp with time zone":{format:"YYYY-MM-DD HH:mm:ss.SSSZZ",group:"datetime"},timetz:{format:"HH:mm:ss.SSSZZ",group:"time"},"time without time zone":{format:"HH:mm:ss.SSS",group:"time"},"time with time zone":{format:"HH:mm:ss.SSSZZ",group:"time"},uuid:{format:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",group:"raw"},int2:{group:"numeric"},int4:{group:"numeric"},int8:{group:"numeric"},smallint:{group:"numeric"},integer:{group:"numeric"},bigint:{group:"numeric"},decimal:{group:"numeric"},numeric:{group:"numeric"},real:{group:"numeric"},float4:{group:"numeric"},float8:{group:"numeric"},"double precision":{group:"numeric"},json:{group:"json"},jsonb:{group:"json"}};function T(r){return v({...r,Adapter:j,QueryCompiler:H})}function K(r){let e=U(r),n=e.normalizedSearchTerm;if(n.length<2)return e;let o=new Set(e.predicates.flatMap(l=>l.kind==="text-like"?[l.column]:[])),i=64-o.size;if(i<=0)return e;let u=`%${ie(n)}%`,a=[];for(let l of Object.values(r.table.columns))if(!o.has(l.name)&&(a.push({column:l.name,kind:"text-like",pattern:u}),a.length>=i))break;return a.length===0?e:{...e,predicates:[...e.predicates,...a]}}function ie(r){return r.replaceAll("%","\\%").replaceAll("_","\\_")}function Z(r,e){let{rows:n,table:{columns:o,name:i,schema:u}}=r,a=T(e);return k(a.withSchema(u).insertInto(i).values(B({columns:o,context:"insert",supportsDefaultKeyword:!0,values:n})).returning(Object.keys(o)).returning(M().as("__ps_inserted_at__")))}function W(r,e){let{filter:n={after:"and",filters:[],kind:"FilterGroup"},fullTableSearchTerm:o,pageIndex:i,pageSize:u,sortOrder:a,table:{columns:l,name:t,schema:s}}=r,_=T(e),g=Y(n.filters,l),y=K({searchTerm:o,table:r.table}),b=y.predicates.length>0?c=>c.and([g(c),F(y,{dialect:"postgres"})(c)]):g,h="__ps_agg__",A="__ps_count__",x="__ps_search_guardrails__";if(L(o))return k(_.with(x,c=>c.selectNoFrom(d=>[d.fn("set_config",[p.lit("statement_timeout"),p.lit(`${5e3}ms`),p.lit(!0)]).as("__ps_statement_timeout__"),d.fn("set_config",[p.lit("lock_timeout"),p.lit(`${100}ms`),p.lit(!0)]).as("__ps_lock_timeout__")])).with(h,c=>c.withSchema(s).selectFrom(t).innerJoin(p.table(x).as(x),d=>d.onTrue()).where(b).select(d=>d.cast(d.fn.coalesce(d.fn.countAll(),p.lit(0)),"text").as(A))).withSchema(s).selectFrom(t).innerJoin(x,c=>c.onTrue()).innerJoin(h,c=>c.onTrue()).where(b).select(`${h}.${A}`).select(Object.keys(l)).$call(c=>a.reduce((d,f)=>{let S=l[f.column];return S?.datatype.group==="numeric"&&!S.datatype.isArray?d.orderBy(p`cast(${p.ref(f.column)} as numeric)`,f.direction):d.orderBy(f.column,f.direction)},c)).limit(u).offset(p.lit(BigInt(i)*BigInt(u))));let E=_.withSchema(s).selectFrom(t).where(b).select(c=>c.cast(c.fn.coalesce(c.fn.countAll(),p.lit(0)),"text").as(A));return k(_.with(h,()=>E).withSchema(s).selectFrom(t).innerJoin(h,c=>c.onTrue()).where(b).select(`${h}.${A}`).select(Object.keys(l)).$call(c=>a.reduce((d,f)=>{let S=l[f.column];return S?.datatype.group==="numeric"&&!S.datatype.isArray?d.orderBy(p`cast(${p.ref(f.column)} as numeric)`,f.direction):d.orderBy(f.column,f.direction)},c)).limit(u).offset(p.lit(BigInt(i)*BigInt(u))))}function De(){return[{created_at:new Date("2025-01-26T21:56:12.345Z"),deleted_at:null,id:1,name:"John Doe",__ps_count__:"2",role:"admin",name_role:"Jonn Doe - admin"},{created_at:new Date("2025-01-26T20:56:12.345Z"),deleted_at:null,id:2,name:"Jane Doe",__ps_count__:"2",role:"poweruser",name_role:"Jane Doe - poweruser"}]}function V(r,e){let{changes:n,row:o,table:{columns:i,name:u,schema:a}}=r,l=T(e);return k(l.withSchema(a).updateTable(u).set(B({columns:i,context:"update",supportsDefaultKeyword:!0,values:n})).$call(I([o],i)).returning(Object.keys(i)).returning(M().as("__ps_updated_at__")))}function X(r,e){let{rows:n,table:{columns:o,name:i,schema:u}}=r,a=T(e);return k(a.withSchema(u).deleteFrom(i).$call(I(n,o)).returning(Object.keys(o)).returning(M().as("__ps_deleted_at__")))}function M(){let r=N();return r.cast(r.fn("floor",[r(r.fn("extract",[p`epoch from now()`]),"*",1e3)]),"text")}function ee(r){return p`(select coalesce(json_agg(agg), '[]') from ${r} as agg)`}var ue="r",ce="v",pe=[ue,ce];function te(r){return k(T(r).selectFrom("pg_catalog.pg_class as cls").innerJoin("pg_catalog.pg_namespace as ns","cls.relnamespace","ns.oid").$call(me).where("cls.relkind","in",pe).select(e=>["ns.nspname as schema","cls.relname as name",ee(e.selectFrom("pg_catalog.pg_attribute as att").innerJoin("pg_catalog.pg_type as typ","typ.oid","att.atttypid").innerJoin("pg_catalog.pg_namespace as tns","tns.oid","typ.typnamespace").leftJoin("pg_catalog.pg_constraint as pk_con",n=>n.on("pk_con.contype","=","p").onRef("pk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("pk_con.conkey")))).leftJoin("pg_catalog.pg_constraint as fk_con",n=>n.on("fk_con.contype","=","f").onRef("fk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("fk_con.conkey")))).leftJoin("pg_catalog.pg_class as fk_cls","fk_cls.oid","fk_con.confrelid").leftJoin("pg_catalog.pg_namespace as fk_ns","fk_ns.oid","fk_cls.relnamespace").leftJoin("pg_catalog.pg_attribute as fk_att",n=>n.onRef("fk_att.attrelid","=","fk_cls.oid").on(o=>o("fk_att.attnum","=",o.fn.any("fk_con.confkey")))).leftJoin("pg_catalog.pg_attrdef as def",n=>n.onRef("def.adrelid","=","att.attrelid").onRef("def.adnum","=","att.attnum")).whereRef("att.attrelid","=","cls.oid").where("att.attnum",">=",0).where("att.attisdropped","!=",!0).select(["att.attname as name","fk_att.attname as fk_column","fk_cls.relname as fk_table","fk_ns.nspname as fk_schema","tns.nspname as datatype_schema","typ.typname as datatype"]).select(n=>[n("att.attidentity","!=","").or(n("def.adbin","is not",null).and(n.fn("pg_get_expr",["def.adbin","def.adrelid"]),"like","nextval(%")).$castTo().as("autoinc"),n("att.attgenerated","!=","").$castTo().as("computed"),n.fn("pg_get_expr",["def.adbin","def.adrelid"]).as("default"),n("att.attnotnull","!=",!0).$castTo().as("nullable"),n.fn.coalesce(n.selectFrom("pg_catalog.pg_enum as enm").whereRef("enm.enumtypid","=","typ.oid").select(o=>o.fn.jsonAgg(o.ref("enm.enumlabel")).as("o")),p`'[]'`).as("options"),n.fn("array_position",["pk_con.conkey","att.attnum"]).as("pk")])).as("columns")]))}function re(){return[{schema:"zoo",name:"animals",columns:[{autoinc:!0,computed:!1,datatype:"int4",datatype_schema:"pg_catalog",default:"nextval('zoo.animals_id_seq'::regclass)",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:null}]},{schema:"public",name:"users",columns:[{autoinc:!0,computed:!1,datatype:"int4",datatype_schema:"pg_catalog",default:"nextval('users_id_seq'::regclass)",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:"CURRENT_TIMESTAMP",fk_column:null,fk_schema:null,fk_table:null,name:"created_at",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"deleted_at",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"varchar",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"role",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"varchar",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!0,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name_role",nullable:!1,options:[],pk:null}]},{schema:"public",name:"composite_pk",columns:[{autoinc:!1,computed:!1,datatype:"uuid",datatype_schema:"pg_catalog",default:"gen_random_uuid()",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:2},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:"now()",fk_column:null,fk_schema:null,fk_table:null,name:"created_at",nullable:!0,options:[],pk:null}]}]}function ae(){let r=T();return k(r.selectNoFrom(r.fn("current_setting",[p.lit("timezone")]).as("timezone")))}function ne(){return[{timezone:"UTC"}]}function me(r){return r.where("ns.nspname","!~","^pg_").where("ns.nspname","!=","information_schema")}function $e(r){let{executor:e,...n}=r,o=D(),i=typeof e.lintSql=="function";async function u(a){try{let l=te(n),t=ae(),[[s,_],[g,y]]=await Promise.all([e.execute(l,a),e.execute(t,a)]);if(s)return m({error:s,query:l});if(g)return m({error:g,query:t});let b=y[0]?.timezone;return b?[null,se({query:l,tables:_,timezone:b})]:m({error:new Error("Timezone not found"),query:t})}catch(l){return m({error:l})}}return{defaultSchema:"public",capabilities:{fullTableSearch:!0,sqlDialect:"postgresql",sqlEditorAutocomplete:!0,sqlEditorLint:!0},async introspect(a){return await u(a)},async query(a,l){try{let t=W(a,n),[s,_]=await Q({executor:e,options:l,query:t,searchTerm:a.fullTableSearchTerm,state:o});return s?m({error:s,query:t}):[null,{filteredRowCount:_[0]?.__ps_count__||"0",rows:_,query:t}]}catch(t){return m({error:t})}},async raw(a,l){return await fe(e,a,l)},async sqlSchema(a,l){let[t,s]=await u(l);return t?[t]:[null,G({defaultSchema:"public",dialect:"postgresql",introspection:s})]},async sqlLint(a,l){if(i&&typeof e.lintSql=="function")try{let[t,s]=await e.lintSql(a,l);if(!t)return[null,s];if(!oe(t))return m({error:t});le(t)&&(i=!1)}catch(t){if(!oe(t))return m({error:t});le(t)&&(i=!1)}return await de(e,a,l)},async insert(a,l){try{let t=Z(a,n),[s,_]=await e.execute(t,l);return s?m({error:s,query:t}):[null,{rows:_,query:t}]}catch(t){return m({error:t})}},async update(a,l){try{let t=V(a,n),[s,_]=await e.execute(t,l);if(s)return m({error:s,query:t});let[g]=_;return g?[null,{row:g,query:t}]:m({error:new Error("Update failed"),query:t})}catch(t){return m({error:t})}},async delete(a,l){try{let t=X(a,n),[s]=await e.execute(t,l);return s?m({error:s,query:t}):[null,{...a,query:t}]}catch(t){return m({error:t})}}}}function oe(r){if(!(r instanceof Error))return!1;let e=r.message.toLowerCase();return e.includes("invalid procedure")||e.includes("unexpected server error")||e.includes("internal server error")||e.includes("bad gateway")||e.includes("service unavailable")||e.includes("not supported")||e.includes("method not allowed")}function le(r){if(!(r instanceof Error))return!1;let e=r.message.toLowerCase();return e.includes("invalid procedure")||e.includes("unexpected server error")||e.includes("internal server error")||e.includes("not supported")||e.includes("method not allowed")}async function de(r,e,n){let o=$(e.sql);if(!o.ok)return[null,{diagnostics:[o.diagnostic],schemaVersion:e.schemaVersion}];let i=[];for(let u of o.statements)try{let a=P(`EXPLAIN ${u.statement}`),[l]=await r.execute(a,n);if(!l)continue;i.push(...O({error:l,positionOffset:u.from,sql:u.statement}))}catch(a){i.push(...O({error:a,positionOffset:u.from,sql:u.statement}))}return[null,{diagnostics:i,schemaVersion:e.schemaVersion}]}async function fe(r,e,n){try{let o=P(e.sql),[i,u]=await r.execute(o,n);return i?m({error:i,query:o}):[null,{query:o,rowCount:u.length,rows:u}]}catch(o){return m({error:o})}}function se(r){let{query:e,tables:n,timezone:o}=r;return n.reduce((i,u)=>{let{schemas:a}=i,{columns:l,name:t,schema:s}=u,_=l.reduce((g,y)=>{let{autoinc:b,computed:h,datatype:A,datatype_schema:x,default:R,name:E,options:c,nullable:d}=y,f=A.startsWith("_"),S=f?A.slice(1):A;return{...g,[E]:{datatype:{...J[S]||{group:c.length>0?"enum":"raw"},isArray:f,isNative:x==="pg_catalog",name:f?`${S}[]`:S,options:c,schema:x},defaultValue:R,fkColumn:y.fk_column,fkSchema:y.fk_schema,fkTable:y.fk_table,isAutoincrement:b,isComputed:h,isRequired:!d&&!b&&!h&&R==null,name:E,nullable:d,pkPosition:y.pk,schema:s,table:t}}},{});return a[s]===void 0&&(a[s]={name:s,tables:{}}),a[s].tables[t]={columns:_,name:t,schema:s},i},{filterOperators:_e,query:e,schemas:{public:{name:"public",tables:{}}},timezone:o})}var _e=["=","!=",">",">=","<","<=","is","is not","like","not like","ilike","not ilike"];function Je(){let r=re(),[{timezone:e}]=ne();return se({tables:r,timezone:e,query:{parameters:[],sql:"<mocked>"}})}export{K as a,Z as b,W as c,De as d,V as e,X as f,te as g,re as h,ae as i,ne as j,$e as k,Je as l};
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2RhdGF0eXBlLnRzIiwgIi4uL2RhdGEvcG9zdGdyZXMtY29yZS9idWlsZGVyLnRzIiwgIi4uL2RhdGEvcG9zdGdyZXMtY29yZS9mdWxsLXRhYmxlLXNlYXJjaC50cyIsICIuLi9kYXRhL3Bvc3RncmVzLWNvcmUvZG1sLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2hlbHBlcnMvcG9zdGdyZXMuanMiLCAiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2ludHJvc3BlY3Rpb24udHMiLCAiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2FkYXB0ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgUGljazxEYXRhVHlwZSwgXCJmb3JtYXRcIiB8IFwiZ3JvdXBcIj5cbj4gPSB7XG4gIGJvb2w6IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJ5dGVhOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgY2l0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCdcbiAgICovXG4gIGRhdGU6IHtcbiAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMSBkYXkgMiBob3VycydcbiAgICovXG4gIGludGVydmFsOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG5hbWU6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdmFyY2hhcjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lIHdpdGhvdXQgdGltZSB6b25lYC5cbiAgICpcbiAgICogQGV4YW1wbGUgJzE0OjMwOjAwJ1xuICAgKi9cbiAgdGltZToge1xuICAgIGZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIHRpbWVzdGFtcDoge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1wiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCswMCdcbiAgICovXG4gIHRpbWVzdGFtcHR6OiB7XG4gICAgZm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW06c3MuU1NTWlpcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1lc3RhbXBgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCI6IHtcbiAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1lc3RhbXB0emAuXG4gICAqXG4gICAqIEBleGFtcGxlICcyMDI1LTA0LTE0IDE0OjMwOjAwKzAwJ1xuICAgKi9cbiAgXCJ0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVcIjoge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1paXCIsXG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgLyoqXG4gICAqIHNob3J0IGZvcm0gb2YgYHRpbWUgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMTQ6MzA6MDArMDAnXG4gICAqL1xuICB0aW1ldHo6IHtcbiAgICBmb3JtYXQ6IFwiSEg6bW06c3MuU1NTWlpcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBsb25nIGZvcm0gb2YgYHRpbWVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMTQ6MzA6MDAnXG4gICAqL1xuICBcInRpbWUgd2l0aG91dCB0aW1lIHpvbmVcIjoge1xuICAgIGZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBsb25nIGZvcm0gb2YgYHRpbWV0emAuXG4gICAqXG4gICAqIEBleGFtcGxlICcxNDozMDowMCswMCdcbiAgICovXG4gIFwidGltZSB3aXRoIHRpbWUgem9uZVwiOiB7XG4gICAgZm9ybWF0OiBcIkhIOm1tOnNzLlNTU1paXCIsXG4gICAgZ3JvdXA6IFwidGltZVwiLFxuICB9LFxuICB1dWlkOiB7XG4gICAgZm9ybWF0OiBcInh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eFwiLFxuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBpbnQyOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnQ0OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnQ4OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBzbWFsbGludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgaW50ZWdlcjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgYmlnaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkZWNpbWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBudW1lcmljOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICByZWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBmbG9hdDQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGZsb2F0ODoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgXCJkb3VibGUgcHJlY2lzaW9uXCI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGpzb246IHtcbiAgICBncm91cDogXCJqc29uXCIsXG4gIH0sXG4gIGpzb25iOiB7XG4gICAgZ3JvdXA6IFwianNvblwiLFxuICB9LFxufTtcbiIsICJpbXBvcnQgeyB0eXBlIEt5c2VseSwgUG9zdGdyZXNBZGFwdGVyLCBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgZ2V0QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc3RncmVTUUxCdWlsZGVyPERhdGFiYXNlID0gYW55PihcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbik6IEt5c2VseTxEYXRhYmFzZT4ge1xuICByZXR1cm4gZ2V0QnVpbGRlcih7XG4gICAgLi4ucmVxdWlyZW1lbnRzLFxuICAgIEFkYXB0ZXI6IFBvc3RncmVzQWRhcHRlcixcbiAgICBRdWVyeUNvbXBpbGVyOiBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIsXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuIGFzIGJ1aWxkQmFzZUZ1bGxUYWJsZVNlYXJjaFBsYW4sXG4gIGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlLFxuICBleGVjdXRlUXVlcnlXaXRoRnVsbFRhYmxlU2VhcmNoR3VhcmRyYWlscyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTUFYX1RFWFRfQ09MVU1OUyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTUlOX1FVRVJZX0xFTkdUSCxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTVlTUUxfTE9DS19XQUlUX1RJTUVPVVRfU0VDT05EUyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfUE9TVEdSRVNfTE9DS19USU1FT1VUX01TLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01FU1NBR0UsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTVMsXG4gIHR5cGUgRnVsbFRhYmxlU2VhcmNoUGxhbixcbiAgdHlwZSBGdWxsVGFibGVTZWFyY2hQcmVkaWNhdGUsXG4gIEZ1bGxUYWJsZVNlYXJjaFRpbWVvdXRFcnJvcixcbiAgZ2V0RnVsbFRhYmxlU2VhcmNoRXhwcmVzc2lvbixcbiAgaXNGdWxsVGFibGVTZWFyY2hSZXF1ZXN0LFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcblxuZXhwb3J0IHtcbiAgY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUsXG4gIGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NQVhfVEVYVF9DT0xVTU5TLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NSU5fUVVFUllfTEVOR1RILFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NWVNRTF9MT0NLX1dBSVRfVElNRU9VVF9TRUNPTkRTLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9QT1NUR1JFU19MT0NLX1RJTUVPVVRfTVMsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTUVTU0FHRSxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfVElNRU9VVF9NUyxcbiAgRnVsbFRhYmxlU2VhcmNoVGltZW91dEVycm9yLFxuICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uLFxuICBpc0Z1bGxUYWJsZVNlYXJjaFJlcXVlc3QsXG59O1xuZXhwb3J0IHR5cGUge1xuICBGdWxsVGFibGVTZWFyY2hEaWFsZWN0LFxuICBGdWxsVGFibGVTZWFyY2hFeGVjdXRpb25TdGF0ZSxcbiAgRnVsbFRhYmxlU2VhcmNoUHJlZGljYXRlLFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbihhcmdzOiB7XG4gIHNlYXJjaFRlcm06IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGFibGU6IFRhYmxlO1xufSk6IEZ1bGxUYWJsZVNlYXJjaFBsYW4ge1xuICBjb25zdCBiYXNlUGxhbiA9IGJ1aWxkQmFzZUZ1bGxUYWJsZVNlYXJjaFBsYW4oYXJncyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2hUZXJtID0gYmFzZVBsYW4ubm9ybWFsaXplZFNlYXJjaFRlcm07XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZWFyY2hUZXJtLmxlbmd0aCA8IEZVTExfVEFCTEVfU0VBUkNIX01JTl9RVUVSWV9MRU5HVEgpIHtcbiAgICByZXR1cm4gYmFzZVBsYW47XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1RleHRDb2x1bW5zID0gbmV3IFNldChcbiAgICBiYXNlUGxhbi5wcmVkaWNhdGVzLmZsYXRNYXAoKHByZWRpY2F0ZSkgPT5cbiAgICAgIHByZWRpY2F0ZS5raW5kID09PSBcInRleHQtbGlrZVwiID8gW3ByZWRpY2F0ZS5jb2x1bW5dIDogW10sXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgcmVtYWluaW5nVGV4dFNsb3RzID1cbiAgICBGVUxMX1RBQkxFX1NFQVJDSF9NQVhfVEVYVF9DT0xVTU5TIC0gZXhpc3RpbmdUZXh0Q29sdW1ucy5zaXplO1xuXG4gIGlmIChyZW1haW5pbmdUZXh0U2xvdHMgPD0gMCkge1xuICAgIHJldHVybiBiYXNlUGxhbjtcbiAgfVxuXG4gIGNvbnN0IHBhdHRlcm4gPSBgJSR7ZXNjYXBlTGlrZVBhdHRlcm4obm9ybWFsaXplZFNlYXJjaFRlcm0pfSVgO1xuICBjb25zdCBzdXBwbGVtZW50YWxQcmVkaWNhdGVzOiBGdWxsVGFibGVTZWFyY2hQcmVkaWNhdGVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoYXJncy50YWJsZS5jb2x1bW5zKSkge1xuICAgIGlmIChleGlzdGluZ1RleHRDb2x1bW5zLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN1cHBsZW1lbnRhbFByZWRpY2F0ZXMucHVzaCh7XG4gICAgICBjb2x1bW46IGNvbHVtbi5uYW1lLFxuICAgICAga2luZDogXCJ0ZXh0LWxpa2VcIixcbiAgICAgIHBhdHRlcm4sXG4gICAgfSk7XG5cbiAgICBpZiAoc3VwcGxlbWVudGFsUHJlZGljYXRlcy5sZW5ndGggPj0gcmVtYWluaW5nVGV4dFNsb3RzKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcGxlbWVudGFsUHJlZGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYmFzZVBsYW47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmJhc2VQbGFuLFxuICAgIHByZWRpY2F0ZXM6IFsuLi5iYXNlUGxhbi5wcmVkaWNhdGVzLCAuLi5zdXBwbGVtZW50YWxQcmVkaWNhdGVzXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlTGlrZVBhdHRlcm4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKFwiJVwiLCBcIlxcXFwlXCIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXFxcXF9cIik7XG59XG4iLCAiaW1wb3J0IHtcbiAgZXhwcmVzc2lvbkJ1aWxkZXIsXG4gIHR5cGUgSW5mZXJSZXN1bHQsXG4gIHR5cGUgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbixcbiAgc3FsLFxufSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIEFkYXB0ZXJJbnNlcnREZXRhaWxzLFxuICBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzLFxuICBhcHBseVRyYW5zZm9ybWF0aW9ucyxcbiAgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLFxuICBjb21waWxlLFxuICBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uLFxufSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgQmlnSW50U3RyaW5nIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IGdldFBvc3RncmVTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9QT1NUR1JFU19MT0NLX1RJTUVPVVRfTVMsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTVMsXG4gIGdldEZ1bGxUYWJsZVNlYXJjaEV4cHJlc3Npb24sXG4gIGlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdCxcbn0gZnJvbSBcIi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG4vKipcbiAqIEluc2VydHMgb25lIG9yIG1vcmUgcm93cyBpbnRvIGEgdGFibGUgYW5kIHJldHVybnMgdGhlIGluc2VydGVkIHJvd3MgYWxvbmcgd2l0aCB0aGVpciBgY3RpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckluc2VydERldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgIC5pbnNlcnRJbnRvKHRhYmxlTmFtZSlcbiAgICAgIC52YWx1ZXMoXG4gICAgICAgIGFwcGx5VHJhbnNmb3JtYXRpb25zKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbnRleHQ6IFwiaW5zZXJ0XCIsXG4gICAgICAgICAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZXM6IHJvd3MsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnJldHVybmluZyhPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpLmFzKFwiX19wc19pbnNlcnRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBzZWxlY3RzIGFsbCBjb2x1bW5zIGZyb20gYSB0YWJsZSwgYWxvbmcgd2l0aCBhbiB1bmJvdW5kIHJvdyBjb3VudCBhcyBgX19wc19jb3VudF9fYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBmaWx0ZXIgPSB7IGFmdGVyOiBcImFuZFwiLCBmaWx0ZXJzOiBbXSwga2luZDogXCJGaWx0ZXJHcm91cFwiIH0sXG4gICAgZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPVxuICAgIGdldFBvc3RncmVTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbiA9IGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oXG4gICAgZmlsdGVyLmZpbHRlcnMsXG4gICAgY29sdW1ucyxcbiAgKTtcbiAgY29uc3QgZnVsbFRhYmxlU2VhcmNoUGxhbiA9IGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbih7XG4gICAgc2VhcmNoVGVybTogZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICB0YWJsZTogZGV0YWlscy50YWJsZSxcbiAgfSk7XG4gIGNvbnN0IGNvbWJpbmVkV2hlcmVFeHByZXNzaW9uID1cbiAgICBmdWxsVGFibGVTZWFyY2hQbGFuLnByZWRpY2F0ZXMubGVuZ3RoID4gMFxuICAgICAgPyAoZWI6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbj4+WzBdKSA9PlxuICAgICAgICAgIGViLmFuZChbXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbihlYiksXG4gICAgICAgICAgICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uKGZ1bGxUYWJsZVNlYXJjaFBsYW4sIHtcbiAgICAgICAgICAgICAgZGlhbGVjdDogXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgICAgfSkoZWIpLFxuICAgICAgICAgIF0pXG4gICAgICA6IGFwcGxpZWRGaWx0ZXJFeHByZXNzaW9uO1xuXG4gIGNvbnN0IEFHR19OQU1FID0gXCJfX3BzX2FnZ19fXCI7XG4gIGNvbnN0IENPVU5UX1JFRiA9IFwiX19wc19jb3VudF9fXCI7XG4gIGNvbnN0IFNFQVJDSF9HVUFSRFJBSUxTX05BTUUgPSBcIl9fcHNfc2VhcmNoX2d1YXJkcmFpbHNfX1wiO1xuICBjb25zdCBzaG91bGRBcHBseVNlYXJjaEd1YXJkcmFpbHMgPVxuICAgIGlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdChmdWxsVGFibGVTZWFyY2hUZXJtKTtcbiAgaWYgKHNob3VsZEFwcGx5U2VhcmNoR3VhcmRyYWlscykge1xuICAgIHJldHVybiBjb21waWxlKFxuICAgICAgYnVpbGRlclxuICAgICAgICAud2l0aChTRUFSQ0hfR1VBUkRSQUlMU19OQU1FLCAocWIpID0+XG4gICAgICAgICAgcWIuc2VsZWN0Tm9Gcm9tKChlYikgPT4gW1xuICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgLmZuPHN0cmluZz4oXCJzZXRfY29uZmlnXCIsIFtcbiAgICAgICAgICAgICAgICBzcWwubGl0KFwic3RhdGVtZW50X3RpbWVvdXRcIiksXG4gICAgICAgICAgICAgICAgc3FsLmxpdChgJHtGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01TfW1zYCksXG4gICAgICAgICAgICAgICAgc3FsLmxpdCh0cnVlKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmFzKFwiX19wc19zdGF0ZW1lbnRfdGltZW91dF9fXCIpLFxuICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgLmZuPHN0cmluZz4oXCJzZXRfY29uZmlnXCIsIFtcbiAgICAgICAgICAgICAgICBzcWwubGl0KFwibG9ja190aW1lb3V0XCIpLFxuICAgICAgICAgICAgICAgIHNxbC5saXQoYCR7RlVMTF9UQUJMRV9TRUFSQ0hfUE9TVEdSRVNfTE9DS19USU1FT1VUX01TfW1zYCksXG4gICAgICAgICAgICAgICAgc3FsLmxpdCh0cnVlKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmFzKFwiX19wc19sb2NrX3RpbWVvdXRfX1wiKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKVxuICAgICAgICAud2l0aChBR0dfTkFNRSwgKHFiKSA9PlxuICAgICAgICAgIHFiXG4gICAgICAgICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAgICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFxuICAgICAgICAgICAgICBzcWwudGFibGUoU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSkuYXMoU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSksXG4gICAgICAgICAgICAgIChqYikgPT4gamIub25UcnVlKCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAuY2FzdDxCaWdJbnRTdHJpbmc+KFxuICAgICAgICAgICAgICAgICAgZWIuZm4uY29hbGVzY2UoZWIuZm4uY291bnRBbGwoKSwgc3FsLmxpdCgwKSksXG4gICAgICAgICAgICAgICAgICBcInRleHRcIixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFzKENPVU5UX1JFRiksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgICAgLnNlbGVjdEZyb20odGFibGVOYW1lKVxuICAgICAgICAuaW5uZXJKb2luKFNFQVJDSF9HVUFSRFJBSUxTX05BTUUsIChqYikgPT4gamIub25UcnVlKCkpXG4gICAgICAgIC5pbm5lckpvaW4oQUdHX05BTUUsIChqYikgPT4gamIub25UcnVlKCkpXG4gICAgICAgIC8vIFRPRE86IGN1cnNvciBwYWdpbmF0aW9uP1xuICAgICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAgIC5zZWxlY3QoXG4gICAgICAgICAgYCR7QUdHX05BTUV9LiR7Q09VTlRfUkVGfWAgc2F0aXNmaWVzIFNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb248XG4gICAgICAgICAgICB7IFtBR0dfTkFNRV06IHsgW0NPVU5UX1JFRl06IEJpZ0ludFN0cmluZyB9IH0sXG4gICAgICAgICAgICB0eXBlb2YgQUdHX05BTUVcbiAgICAgICAgICA+LFxuICAgICAgICApXG4gICAgICAgIC5zZWxlY3QoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAgIC4kY2FsbCgocWIpID0+IHtcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyLnJlZHVjZSgoY3VycmVudFF1ZXJ5LCBpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zW2l0ZW0uY29sdW1uXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjb2x1bW4/LmRhdGF0eXBlLmdyb3VwID09PSBcIm51bWVyaWNcIiAmJlxuICAgICAgICAgICAgICAhY29sdW1uLmRhdGF0eXBlLmlzQXJyYXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoXG4gICAgICAgICAgICAgICAgc3FsYGNhc3QoJHtzcWwucmVmKGl0ZW0uY29sdW1uKX0gYXMgbnVtZXJpYylgLFxuICAgICAgICAgICAgICAgIGl0ZW0uZGlyZWN0aW9uLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoaXRlbS5jb2x1bW4sIGl0ZW0uZGlyZWN0aW9uKTtcbiAgICAgICAgICB9LCBxYik7XG4gICAgICAgIH0pXG4gICAgICAgIC5saW1pdChwYWdlU2l6ZSlcbiAgICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvdW50UXVlcnkgPSBidWlsZGVyXG4gICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgLnNlbGVjdCgoZWIpID0+XG4gICAgICBlYlxuICAgICAgICAuY2FzdDxCaWdJbnRTdHJpbmc+KFxuICAgICAgICAgIGViLmZuLmNvYWxlc2NlKGViLmZuLmNvdW50QWxsKCksIHNxbC5saXQoMCkpLFxuICAgICAgICAgIFwidGV4dFwiLFxuICAgICAgICApXG4gICAgICAgIC5hcyhDT1VOVF9SRUYpLFxuICAgICk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoQUdHX05BTUUsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAuaW5uZXJKb2luKEFHR19OQU1FLCAoamIpID0+IGpiLm9uVHJ1ZSgpKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAuc2VsZWN0KFxuICAgICAgICBgJHtBR0dfTkFNRX0uJHtDT1VOVF9SRUZ9YCBzYXRpc2ZpZXMgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbjxcbiAgICAgICAgICB7IFtBR0dfTkFNRV06IEluZmVyUmVzdWx0PHR5cGVvZiBjb3VudFF1ZXJ5PltudW1iZXJdIH0sXG4gICAgICAgICAgdHlwZW9mIEFHR19OQU1FXG4gICAgICAgID4sXG4gICAgICApXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLiRjYWxsKChxYikgPT4ge1xuICAgICAgICByZXR1cm4gc29ydE9yZGVyLnJlZHVjZSgoY3VycmVudFF1ZXJ5LCBpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1tpdGVtLmNvbHVtbl07XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2x1bW4/LmRhdGF0eXBlLmdyb3VwID09PSBcIm51bWVyaWNcIiAmJlxuICAgICAgICAgICAgIWNvbHVtbi5kYXRhdHlwZS5pc0FycmF5XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoXG4gICAgICAgICAgICAgIHNxbGBjYXN0KCR7c3FsLnJlZihpdGVtLmNvbHVtbil9IGFzIG51bWVyaWMpYCxcbiAgICAgICAgICAgICAgaXRlbS5kaXJlY3Rpb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjdXJyZW50UXVlcnkub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pO1xuICAgICAgICB9LCBxYik7XG4gICAgICB9KVxuICAgICAgLmxpbWl0KHBhZ2VTaXplKVxuICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgLm9mZnNldChzcWwubGl0KEJpZ0ludChwYWdlSW5kZXgpICogQmlnSW50KHBhZ2VTaXplKSkpLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1NlbGVjdFF1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKFwiMjAyNS0wMS0yNlQyMTo1NjoxMi4zNDVaXCIpLFxuICAgICAgZGVsZXRlZF9hdDogbnVsbCxcbiAgICAgIGlkOiAxLFxuICAgICAgbmFtZTogXCJKb2huIERvZVwiLFxuICAgICAgX19wc19jb3VudF9fOiBcIjJcIixcbiAgICAgIHJvbGU6IFwiYWRtaW5cIixcbiAgICAgIG5hbWVfcm9sZTogXCJKb25uIERvZSAtIGFkbWluXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShcIjIwMjUtMDEtMjZUMjA6NTY6MTIuMzQ1WlwiKSxcbiAgICAgIGRlbGV0ZWRfYXQ6IG51bGwsXG4gICAgICBpZDogMixcbiAgICAgIG5hbWU6IFwiSmFuZSBEb2VcIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgICByb2xlOiBcInBvd2VydXNlclwiLFxuICAgICAgbmFtZV9yb2xlOiBcIkphbmUgRG9lIC0gcG93ZXJ1c2VyXCIsXG4gICAgfSxcbiAgXSBhcyBjb25zdCBzYXRpc2ZpZXMge1xuICAgIC8vIGJlc3QgZWZmb3J0IG5vIG5lZWQgdG8gZ28gb3ZlcmJvYXJkXG4gICAgW0sgaW5cbiAgICAgIHwgUmV0dXJuVHlwZTx0eXBlb2YgbW9ja1RhYmxlc1F1ZXJ5PlsxXVtcImNvbHVtbnNcIl1bbnVtYmVyXVtcIm5hbWVcIl1cbiAgICAgIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCB1cGRhdGVzIGEgZ2l2ZW4gcm93IGluIGEgdGFibGUgd2l0aCBnaXZlbiBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIHJvdyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID1cbiAgICBnZXRQb3N0Z3JlU1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoXG4gICAgICAgIGFwcGx5VHJhbnNmb3JtYXRpb25zKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbnRleHQ6IFwidXBkYXRlXCIsXG4gICAgICAgICAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZXM6IGNoYW5nZXMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFtyb3ddLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfdXBkYXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBkZWxldGVzIGEgZ2l2ZW4gc2V0IG9mIHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgIC5kZWxldGVGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfZGVsZXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpIHtcbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcigpO1xuXG4gIHJldHVybiBlYi5jYXN0PEJpZ0ludFN0cmluZz4oXG4gICAgZWIuZm4oXCJmbG9vclwiLCBbZWIoZWIuZm4oXCJleHRyYWN0XCIsIFtzcWxgZXBvY2ggZnJvbSBub3coKWBdKSwgXCIqXCIsIDFfMDAwKV0pLFxuICAgIFwidGV4dFwiLFxuICApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wb3N0Z3Jlcy5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG4vKipcbiAqIEEgcG9zdGdyZXMgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IChvciBvdGhlciBleHByZXNzaW9uKSBpbnRvIGEgSlNPTkIgYXJyYXkuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogPCEtLSBzaXRlRXhhbXBsZShcInNlbGVjdFwiLCBcIk5lc3RlZCBhcnJheVwiLCAxMTApIC0tPlxuICpcbiAqIFdoaWxlIGt5c2VseSBpcyBub3QgYW4gT1JNIGFuZCBpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2YgcmVsYXRpb25zLCB3ZSBkbyBwcm92aWRlXG4gKiBoZWxwZXJzIGZvciBmZXRjaGluZyBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzIGluIGEgc2luZ2xlIHF1ZXJ5LiBJbiB0aGlzIGV4YW1wbGUgd2VcbiAqIHVzZSB0aGUgYGpzb25BcnJheUZyb21gIGhlbHBlciB0byBmZXRjaCBwZXJzb24ncyBwZXRzIGFsb25nIHdpdGggdGhlIHBlcnNvbidzIGlkLlxuICpcbiAqIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgaGVscGVycyB1bmRlciB0aGUgYGt5c2VseS9oZWxwZXJzYCBmb2xkZXIsIGluY2x1ZGluZ1xuICogYGpzb25BcnJheUZyb21gLCBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayB3aXRoIHRoaXJkIHBhcnR5IGRpYWxlY3RzLiBJbiBvcmRlciBmb3JcbiAqIHRoZW0gdG8gd29yaywgdGhlIGRpYWxlY3QgbXVzdCBhdXRvbWF0aWNhbGx5IHBhcnNlIHRoZSBganNvbmAgZGF0YSB0eXBlIGludG9cbiAqIEphdmFTY3JpcHQgSlNPTiB2YWx1ZXMgbGlrZSBvYmplY3RzIGFuZCBhcnJheXMuIFNvbWUgZGlhbGVjdHMgbWlnaHQgc2ltcGx5IHJldHVyblxuICogdGhlIGRhdGEgYXMgYSBKU09OIHN0cmluZy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYFxuICogdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9wb3N0Z3JlcydcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25BcnJheUZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC5vcmRlckJ5KCdwZXQubmFtZScpXG4gKiAgICAgKS5hcygncGV0cycpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIChcbiAqICAgc2VsZWN0IGNvYWxlc2NlKGpzb25fYWdnKGFnZyksICdbXScpIGZyb20gKFxuICogICAgIHNlbGVjdCBcInBldFwiLlwiaWRcIiBhcyBcInBldF9pZFwiLCBcInBldFwiLlwibmFtZVwiXG4gKiAgICAgZnJvbSBcInBldFwiXG4gKiAgICAgd2hlcmUgXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICogICAgIG9yZGVyIGJ5IFwicGV0XCIuXCJuYW1lXCJcbiAqICAgKSBhcyBhZ2dcbiAqICkgYXMgXCJwZXRzXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQXJyYXlGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGNvYWxlc2NlKGpzb25fYWdnKGFnZyksICdbXScpIGZyb20gJHtleHByfSBhcyBhZ2cpYDtcbn1cbi8qKlxuICogQSBwb3N0Z3JlcyBoZWxwZXIgZm9yIHR1cm5pbmcgYSBzdWJxdWVyeSAob3Igb3RoZXIgZXhwcmVzc2lvbikgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIFRoZSBzdWJxdWVyeSBtdXN0IG9ubHkgcmV0dXJuIG9uZSByb3cuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogPCEtLSBzaXRlRXhhbXBsZShcInNlbGVjdFwiLCBcIk5lc3RlZCBvYmplY3RcIiwgMTIwKSAtLT5cbiAqXG4gKiBXaGlsZSBreXNlbHkgaXMgbm90IGFuIE9STSBhbmQgaXQgZG9lc24ndCBoYXZlIHRoZSBjb25jZXB0IG9mIHJlbGF0aW9ucywgd2UgZG8gcHJvdmlkZVxuICogaGVscGVycyBmb3IgZmV0Y2hpbmcgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cyBpbiBhIHNpbmdsZSBxdWVyeS4gSW4gdGhpcyBleGFtcGxlIHdlXG4gKiB1c2UgdGhlIGBqc29uT2JqZWN0RnJvbWAgaGVscGVyIHRvIGZldGNoIHBlcnNvbidzIGZhdm9yaXRlIHBldCBhbG9uZyB3aXRoIHRoZSBwZXJzb24ncyBpZC5cbiAqXG4gKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGhlbHBlcnMgdW5kZXIgdGhlIGBreXNlbHkvaGVscGVyc2AgZm9sZGVyLCBpbmNsdWRpbmdcbiAqIGBqc29uT2JqZWN0RnJvbWAsIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGggdGhpcmQtcGFydHkgZGlhbGVjdHMuIEluIG9yZGVyIGZvclxuICogdGhlbSB0byB3b3JrLCB0aGUgZGlhbGVjdCBtdXN0IGF1dG9tYXRpY2FsbHkgcGFyc2UgdGhlIGBqc29uYCBkYXRhIHR5cGUgaW50b1xuICogSmF2YVNjcmlwdCBKU09OIHZhbHVlcyBsaWtlIG9iamVjdHMgYW5kIGFycmF5cy4gU29tZSBkaWFsZWN0cyBtaWdodCBzaW1wbHkgcmV0dXJuXG4gKiB0aGUgZGF0YSBhcyBhIEpTT04gc3RyaW5nLiBJbiB0aGVzZSBjYXNlcyB5b3UgY2FuIHVzZSB0aGUgYnVpbHQgaW4gYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gXG4gKiB0byBwYXJzZSB0aGUgcmVzdWx0cy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsganNvbk9iamVjdEZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9wb3N0Z3JlcydcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25PYmplY3RGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAud2hlcmUoJ3BldC5pc19mYXZvcml0ZScsICc9JywgdHJ1ZSlcbiAqICAgICApLmFzKCdmYXZvcml0ZV9wZXQnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gKlxuICogYGBgc3FsXG4gKiBzZWxlY3QgXCJpZFwiLCAoXG4gKiAgIHNlbGVjdCB0b19qc29uKG9iaikgZnJvbSAoXG4gKiAgICAgc2VsZWN0IFwicGV0XCIuXCJpZFwiIGFzIFwicGV0X2lkXCIsIFwicGV0XCIuXCJuYW1lXCJcbiAqICAgICBmcm9tIFwicGV0XCJcbiAqICAgICB3aGVyZSBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gKiAgICAgYW5kIFwicGV0XCIuXCJpc19mYXZvcml0ZVwiID0gJDFcbiAqICAgKSBhcyBvYmpcbiAqICkgYXMgXCJmYXZvcml0ZV9wZXRcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25PYmplY3RGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IHRvX2pzb24ob2JqKSBmcm9tICR7ZXhwcn0gYXMgb2JqKWA7XG59XG4vKipcbiAqIFRoZSBQb3N0Z3JlU1FMIGBqc29uX2J1aWxkX29iamVjdGAgZnVuY3Rpb24uXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYFBvc3RncmVzRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgUG9zdGdyZVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB7IGpzb25CdWlsZE9iamVjdCB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBzcWw8c3RyaW5nPmBmaXJzdF9uYW1lIHx8XHUwMEEwJyAnIHx8IGxhc3RfbmFtZWBcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwganNvbl9idWlsZF9vYmplY3QoXG4gKiAgICdmaXJzdCcsIGZpcnN0X25hbWUsXG4gKiAgICdsYXN0JywgbGFzdF9uYW1lLFxuICogICAnZnVsbCcsIGZpcnN0X25hbWUgfHwgJyAnIHx8IGxhc3RfbmFtZVxuICogKSBhcyBcIm5hbWVcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25CdWlsZE9iamVjdChvYmopIHtcbiAgICByZXR1cm4gc3FsIGBqc29uX2J1aWxkX29iamVjdCgke3NxbC5qb2luKE9iamVjdC5rZXlzKG9iaikuZmxhdE1hcCgoaykgPT4gW3NxbC5saXQoayksIG9ialtrXV0pKX0pYDtcbn1cbi8qKlxuICogVGhlIFBvc3RncmVTUUwgYG1lcmdlX2FjdGlvbmAgZnVuY3Rpb24uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGByZXR1cm5pbmdgIGNsYXVzZSB0byBnZXQgdGhlIGFjdGlvbiB0aGF0IHdhc1xuICogcGVyZm9ybWVkIGluIGEgYG1lcmdlSW50b2AgcXVlcnkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gKiBzdHJpbmdzOiBgJ0lOU0VSVCdgLCBgJ1VQREFURSdgLCBvciBgJ0RFTEVURSdgLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtZXJnZUFjdGlvbiB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5tZXJnZUludG8oJ3BlcnNvbiBhcyBwJylcbiAqICAgLnVzaW5nKCdwZXJzb25fYmFja3VwIGFzIHBiJywgJ3AuaWQnLCAncGIuaWQnKVxuICogICAud2hlbk1hdGNoZWQoKVxuICogICAudGhlblVwZGF0ZVNldCgoeyByZWYgfSkgPT4gKHtcbiAqICAgICBmaXJzdF9uYW1lOiByZWYoJ3BiLmZpcnN0X25hbWUnKSxcbiAqICAgICB1cGRhdGVkX2F0OiByZWYoJ3BiLnVwZGF0ZWRfYXQnKS4kY2FzdFRvPHN0cmluZyB8IG51bGw+KCksXG4gKiAgIH0pKVxuICogICAud2hlbk5vdE1hdGNoZWQoKVxuICogICAudGhlbkluc2VydFZhbHVlcygoeyByZWZ9KSA9PiAoe1xuICogICAgIGlkOiByZWYoJ3BiLmlkJyksXG4gKiAgICAgZmlyc3RfbmFtZTogcmVmKCdwYi5maXJzdF9uYW1lJyksXG4gKiAgICAgY3JlYXRlZF9hdDogcmVmKCdwYi51cGRhdGVkX2F0JyksXG4gKiAgICAgdXBkYXRlZF9hdDogcmVmKCdwYi51cGRhdGVkX2F0JykuJGNhc3RUbzxzdHJpbmcgfCBudWxsPigpLFxuICogICB9KSlcbiAqICAgLnJldHVybmluZyhbbWVyZ2VBY3Rpb24oKS5hcygnYWN0aW9uJyksICdwLmlkJywgJ3AudXBkYXRlZF9hdCddKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdLmFjdGlvblxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogbWVyZ2UgaW50byBcInBlcnNvblwiIGFzIFwicFwiXG4gKiB1c2luZyBcInBlcnNvbl9iYWNrdXBcIiBhcyBcInBiXCIgb24gXCJwXCIuXCJpZFwiID0gXCJwYlwiLlwiaWRcIlxuICogd2hlbiBtYXRjaGVkIHRoZW4gdXBkYXRlIHNldFxuICogICBcImZpcnN0X25hbWVcIiA9IFwicGJcIi5cImZpcnN0X25hbWVcIixcbiAqICAgXCJ1cGRhdGVkX2F0XCIgPSBcInBiXCIuXCJ1cGRhdGVkX2F0XCI6OnRleHRcbiAqIHdoZW4gbm90IG1hdGNoZWQgdGhlbiBpbnNlcnQgdmFsdWVzIChcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImNyZWF0ZWRfYXRcIiwgXCJ1cGRhdGVkX2F0XCIpXG4gKiB2YWx1ZXMgKFwicGJcIi5cImlkXCIsIFwicGJcIi5cImZpcnN0X25hbWVcIiwgXCJwYlwiLlwidXBkYXRlZF9hdFwiLCBcInBiXCIuXCJ1cGRhdGVkX2F0XCIpXG4gKiByZXR1cm5pbmcgbWVyZ2VfYWN0aW9uKCkgYXMgXCJhY3Rpb25cIiwgXCJwXCIuXCJpZFwiLCBcInBcIi5cInVwZGF0ZWRfYXRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFjdGlvbigpIHtcbiAgICByZXR1cm4gc3FsIGBtZXJnZV9hY3Rpb24oKWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBTZWxlY3RRdWVyeUJ1aWxkZXIsIHNxbCB9IGZyb20gXCJreXNlbHlcIjtcbmltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tIFwia3lzZWx5L2hlbHBlcnMvcG9zdGdyZXNcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBjb21waWxlLCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBnZXRQb3N0Z3JlU1FMQnVpbGRlciB9IGZyb20gXCIuL2J1aWxkZXJcIjtcblxuY29uc3QgUkVHVUxBUl9UQUJMRV9LSU5EID0gXCJyXCI7XG5jb25zdCBWSUVXX1RBQkxFX0tJTkQgPSBcInZcIjtcbmNvbnN0IFRBQkxFX0tJTkRTID0gW1JFR1VMQVJfVEFCTEVfS0lORCwgVklFV19UQUJMRV9LSU5EXSBhcyBjb25zdDtcbnR5cGUgVGFibGVLaW5kID0gKHR5cGVvZiBUQUJMRV9LSU5EUylbbnVtYmVyXTtcblxuaW50ZXJmYWNlIERhdGFiYXNlIHtcbiAgLyoqIGNvbHVtbiBkZWZhdWx0cyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmRlZlwiOiB7XG4gICAgLyoqIGRlZmF1bHQgZXhwcmVzc2lvbiBhcyBhIG5vZGUgdHJlZSwgdXNlIHBnX2dldF9leHByKGFkYmluLCBhZHJlbGlkKSAqL1xuICAgIGFkYmluOiBzdHJpbmc7XG4gICAgLyoqIGNvbHVtbiBudW1iZXIgKi9cbiAgICBhZG51bTogbnVtYmVyO1xuICAgIC8qKiB0YWJsZSBpZGVudGlmaWVyICovXG4gICAgYWRyZWxpZDogbnVtYmVyO1xuICB9O1xuICAvKiogY29sdW1ucyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmlidXRlXCI6IHtcbiAgICAvKipcbiAgICAgKiBnZW5lcmF0aW9uIGZsYWcgZm9yIGNvbXB1dGVkIGNvbHVtbnM6XG4gICAgICogJycgKGVtcHR5KSBmb3IgcmVndWxhciBjb2x1bW5zLFxuICAgICAqICdzJyBmb3IgU1RPUkVEIGdlbmVyYXRlZCBjb2x1bW5zIChQb3N0Z3JlcyBHRU5FUkFURUQgQUxXQVlTIEFTKS5cbiAgICAgKi9cbiAgICBhdHRnZW5lcmF0ZWQ6IFwiXCIgfCBcInNcIjtcbiAgICAvKipcbiAgICAgKiBpZGVudGl0eSBjb2x1bW4gZmxhZzpcbiAgICAgKiAnJyAoZW1wdHkpIGZvciByZWd1bGFyIGNvbHVtbnMsXG4gICAgICogJ2EnIGZvciBBTFdBWVMgKEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkpLFxuICAgICAqICdkJyBmb3IgQlkgREVGQVVMVCAoR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkpLlxuICAgICAqL1xuICAgIGF0dGlkZW50aXR5OiBcIlwiIHwgXCJhXCIgfCBcImRcIjtcbiAgICAvKiogd2FzIHRoZSBjb2x1bW4gZHJvcHBlZC4gZHJvcHBlZCBjb2x1bW5zIG1pZ2h0IG5vdCBiZSAxMDAlIHJlbW92ZWQgaW1tZWRpYXRlbHkuICovXG4gICAgYXR0aXNkcm9wcGVkOiBib29sZWFuO1xuICAgIC8qKiBjb2x1bW4gbmFtZSAqL1xuICAgIGF0dG5hbWU6IHN0cmluZztcbiAgICAvKiogTk9UIE5VTEwgY29uc3RyYWludDogdHJ1ZSBpZiB0aGUgY29sdW1uIGhhcyBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgKi9cbiAgICBhdHRub3RudWxsOiBib29sZWFuO1xuICAgIC8qKiBjb2x1bW4gb3JkZXIgbnVtYmVyIGluIGl0cyB0YWJsZSAqL1xuICAgIGF0dG51bTogbnVtYmVyO1xuICAgIC8qKiB0YWJsZS92aWV3IGlkZW50aWZpZXIgKi9cbiAgICBhdHRyZWxpZDogc3RyaW5nO1xuICAgIC8qKiBjb2x1bW4gZGF0YXR5cGUgaWRlbnRpZmllciAqL1xuICAgIGF0dHR5cGlkOiBzdHJpbmc7XG4gIH07XG4gIC8qKiByZXNvdXJjZXMsIGUuZy4gdGFibGVzLCBzZXF1ZW5jZXMsIGV0Yy4gKi9cbiAgXCJwZ19jYXRhbG9nLnBnX2NsYXNzXCI6IHtcbiAgICAvKiogcmVzb3VyY2UgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogcmVzb3VyY2Uga2luZDogcmVndWxhciB0YWJsZSwgdmlldyAqL1xuICAgIHJlbGtpbmQ6IFRhYmxlS2luZDtcbiAgICAvKiogcmVzb3VyY2UgbmFtZSAqL1xuICAgIHJlbG5hbWU6IHN0cmluZztcbiAgICAvKiogc2NoZW1hIGlkICovXG4gICAgcmVsbmFtZXNwYWNlOiBudW1iZXI7XG4gIH07XG4gIC8qKiBjb25zdHJhaW50cyAqL1xuICBcInBnX2NhdGFsb2cucGdfY29uc3RyYWludFwiOiB7XG4gICAgLyoqIGlmIGEgZm9yZWlnbiBrZXksIHRoZSByZWZlcmVuY2VkIGNvbHVtbnMgKi9cbiAgICBjb25ma2V5OiBudW1iZXJbXTtcbiAgICAvKiogaWYgYSBmb3JlaWduIGtleSwgdGhlIHJlZmVyZW5jZWQgdGFibGUgKi9cbiAgICBjb25mcmVsaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBhbiBvcmRlcmVkIGFycmF5IG9mIGNvbHVtbnMgaW5jbHVkZWQgaW4gdGhlIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiB0aGUgY29sdW1ucyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgb3JkaW5hbCBudW1iZXIgKGBhdHRudW1gKSBpbiB0aGVpciByZWxhdGlvbiAodGFibGUpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgYCd7MSwzfSdgIC0gYSBjb25zdHJhaW50IHdpdGggMiBjb2x1bW5zLCB0aGUgMXN0ICYgM3JkIGluIHRoZWlyIHRhYmxlLlxuICAgICAqL1xuICAgIGNvbmtleTogbnVtYmVyW107XG4gICAgLyoqIHJlbGF0aW9uICh0YWJsZSkgaWQgd2hpY2ggdGhpcyBjb25zdHJhaW50IHdhcyBjcmVhdGVkIGZvciAqL1xuICAgIGNvbnJlbGlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogY29uc3RyYWludCB0eXBlLlxuICAgICAqXG4gICAgICogYCdwJ2AgLSBwcmltYXJ5IGtleSBjb25zdHJhaW50LlxuICAgICAqIGAnZidgIC0gZm9yZWlnbiBrZXkgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBjb250eXBlOiBcInBcIiB8IFwiZlwiIHwgKHN0cmluZyAmIHt9KTtcbiAgfTtcbiAgLyoqIGVudW0gdHlwZXMnIHZhbHVlcyAqL1xuICBcInBnX2NhdGFsb2cucGdfZW51bVwiOiB7XG4gICAgLyoqIGVudW0gdmFsdWUgKi9cbiAgICBlbnVtbGFiZWw6IHN0cmluZztcbiAgICAvKiogZW51bSdzIHR5cGUgaWQgKi9cbiAgICBlbnVtdHlwaWQ6IG51bWJlcjtcbiAgfTtcbiAgLyoqIHNjaGVtYXMgKi9cbiAgXCJwZ19jYXRhbG9nLnBnX25hbWVzcGFjZVwiOiB7XG4gICAgLyoqIHNjaGVtYSBuYW1lICovXG4gICAgbnNwbmFtZTogc3RyaW5nO1xuICAgIC8qKiBzY2hlbWEgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgfTtcbiAgLyoqIGRhdGF0eXBlcyAqL1xuICBcInBnX2NhdGFsb2cucGdfdHlwZVwiOiB7XG4gICAgLyoqIHR5cGUgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogdHlwZSBuYW1lICovXG4gICAgdHlwbmFtZTogc3RyaW5nO1xuICAgIC8qKiB0eXBlJ3Mgc2NoZW1hIChha2EgbmFtZXNwYWNlKSBpZCAqL1xuICAgIHR5cG5hbWVzcGFjZTogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IHJldHVybnMgbWV0YWRhdGEgZm9yIGFsbCB1c2VyLWRlZmluZWQgdGFibGVzIGFuZCB2aWV3cyBpbiB0aGUgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZXNRdWVyeShcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICByZXR1cm4gY29tcGlsZShcbiAgICBnZXRQb3N0Z3JlU1FMQnVpbGRlcjxEYXRhYmFzZT4ocmVxdWlyZW1lbnRzKVxuICAgICAgLnNlbGVjdEZyb20oXCJwZ19jYXRhbG9nLnBnX2NsYXNzIGFzIGNsc1wiKVxuICAgICAgLmlubmVySm9pbihcInBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGFzIG5zXCIsIFwiY2xzLnJlbG5hbWVzcGFjZVwiLCBcIm5zLm9pZFwiKVxuICAgICAgLiRjYWxsKGV4Y2x1ZGVTeXN0ZW1UYWJsZXMpXG4gICAgICAvLyByZWd1bGFyIHRhYmxlcyBvciB2aWV3c1xuICAgICAgLndoZXJlKFwiY2xzLnJlbGtpbmRcIiwgXCJpblwiLCBUQUJMRV9LSU5EUylcbiAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgIFwibnMubnNwbmFtZSBhcyBzY2hlbWFcIixcbiAgICAgICAgXCJjbHMucmVsbmFtZSBhcyBuYW1lXCIsXG4gICAgICAgIGpzb25BcnJheUZyb20oXG4gICAgICAgICAgZWJcbiAgICAgICAgICAgIC5zZWxlY3RGcm9tKFwicGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYXMgYXR0XCIpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFwicGdfY2F0YWxvZy5wZ190eXBlIGFzIHR5cFwiLCBcInR5cC5vaWRcIiwgXCJhdHQuYXR0dHlwaWRcIilcbiAgICAgICAgICAgIC5pbm5lckpvaW4oXG4gICAgICAgICAgICAgIFwicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgYXMgdG5zXCIsXG4gICAgICAgICAgICAgIFwidG5zLm9pZFwiLFxuICAgICAgICAgICAgICBcInR5cC50eXBuYW1lc3BhY2VcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5sZWZ0Sm9pbihcInBnX2NhdGFsb2cucGdfY29uc3RyYWludCBhcyBwa19jb25cIiwgKGpiKSA9PlxuICAgICAgICAgICAgICBqYlxuICAgICAgICAgICAgICAgIC5vbihcInBrX2Nvbi5jb250eXBlXCIsIFwiPVwiLCBcInBcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJwa19jb24uY29ucmVsaWRcIiwgXCI9XCIsIFwiY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC5vbigoZWIpID0+IGViKFwiYXR0LmF0dG51bVwiLCBcIj1cIiwgZWIuZm4uYW55KFwicGtfY29uLmNvbmtleVwiKSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19jb25zdHJhaW50IGFzIGZrX2NvblwiLCAoamIpID0+XG4gICAgICAgICAgICAgIGpiXG4gICAgICAgICAgICAgICAgLm9uKFwiZmtfY29uLmNvbnR5cGVcIiwgXCI9XCIsIFwiZlwiKVxuICAgICAgICAgICAgICAgIC5vblJlZihcImZrX2Nvbi5jb25yZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAgICAgLm9uKChlYikgPT4gZWIoXCJhdHQuYXR0bnVtXCIsIFwiPVwiLCBlYi5mbi5hbnkoXCJma19jb24uY29ua2V5XCIpKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXG4gICAgICAgICAgICAgIFwicGdfY2F0YWxvZy5wZ19jbGFzcyBhcyBma19jbHNcIixcbiAgICAgICAgICAgICAgXCJma19jbHMub2lkXCIsXG4gICAgICAgICAgICAgIFwiZmtfY29uLmNvbmZyZWxpZFwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFxuICAgICAgICAgICAgICBcInBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGFzIGZrX25zXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMub2lkXCIsXG4gICAgICAgICAgICAgIFwiZmtfY2xzLnJlbG5hbWVzcGFjZVwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYXMgZmtfYXR0XCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJma19hdHQuYXR0cmVsaWRcIiwgXCI9XCIsIFwiZmtfY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC8vIFVzZSBhIGNhbGxiYWNrIGZvciB0aGUgLm9uKCkgY29uZGl0aW9uIHRvIGVuc3VyZSBjb3JyZWN0IGNvbnRleHQgZm9yIHR5cGVzXG4gICAgICAgICAgICAgICAgLm9uKChvbl9lYikgPT5cbiAgICAgICAgICAgICAgICAgIG9uX2ViKFwiZmtfYXR0LmF0dG51bVwiLCBcIj1cIiwgb25fZWIuZm4uYW55KFwiZmtfY29uLmNvbmZrZXlcIikpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJwZ19jYXRhbG9nLnBnX2F0dHJkZWYgYXMgZGVmXCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJkZWYuYWRyZWxpZFwiLCBcIj1cIiwgXCJhdHQuYXR0cmVsaWRcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJkZWYuYWRudW1cIiwgXCI9XCIsIFwiYXR0LmF0dG51bVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC53aGVyZVJlZihcImF0dC5hdHRyZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAvLyBleGNsdWRlIHN5c3RlbSBjb2x1bW5zXG4gICAgICAgICAgICAud2hlcmUoXCJhdHQuYXR0bnVtXCIsIFwiPj1cIiwgMClcbiAgICAgICAgICAgIC53aGVyZShcImF0dC5hdHRpc2Ryb3BwZWRcIiwgXCIhPVwiLCB0cnVlKVxuICAgICAgICAgICAgLnNlbGVjdChbXG4gICAgICAgICAgICAgIFwiYXR0LmF0dG5hbWUgYXMgbmFtZVwiLFxuICAgICAgICAgICAgICBcImZrX2F0dC5hdHRuYW1lIGFzIGZrX2NvbHVtblwiLFxuICAgICAgICAgICAgICBcImZrX2Nscy5yZWxuYW1lIGFzIGZrX3RhYmxlXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMubnNwbmFtZSBhcyBma19zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJ0bnMubnNwbmFtZSBhcyBkYXRhdHlwZV9zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJ0eXAudHlwbmFtZSBhcyBkYXRhdHlwZVwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgICAgICAgIGViKFwiYXR0LmF0dGlkZW50aXR5XCIsIFwiIT1cIiwgXCJcIilcbiAgICAgICAgICAgICAgICAub3IoXG4gICAgICAgICAgICAgICAgICBlYihcImRlZi5hZGJpblwiLCBcImlzIG5vdFwiLCBudWxsKS5hbmQoXG4gICAgICAgICAgICAgICAgICAgIGViLmZuKFwicGdfZ2V0X2V4cHJcIiwgW1wiZGVmLmFkYmluXCIsIFwiZGVmLmFkcmVsaWRcIl0pLFxuICAgICAgICAgICAgICAgICAgICBcImxpa2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJuZXh0dmFsKCVcIixcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC4kY2FzdFRvPGJvb2xlYW4+KClcbiAgICAgICAgICAgICAgICAuYXMoXCJhdXRvaW5jXCIpLFxuICAgICAgICAgICAgICBlYihcImF0dC5hdHRnZW5lcmF0ZWRcIiwgXCIhPVwiLCBcIlwiKVxuICAgICAgICAgICAgICAgIC4kY2FzdFRvPGJvb2xlYW4+KClcbiAgICAgICAgICAgICAgICAuYXMoXCJjb21wdXRlZFwiKSxcbiAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAuZm48c3RyaW5nIHwgbnVsbD4oXCJwZ19nZXRfZXhwclwiLCBbXCJkZWYuYWRiaW5cIiwgXCJkZWYuYWRyZWxpZFwiXSlcbiAgICAgICAgICAgICAgICAuYXMoXCJkZWZhdWx0XCIpLFxuICAgICAgICAgICAgICBlYihcImF0dC5hdHRub3RudWxsXCIsIFwiIT1cIiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAuJGNhc3RUbzxib29sZWFuPigpXG4gICAgICAgICAgICAgICAgLmFzKFwibnVsbGFibGVcIiksXG4gICAgICAgICAgICAgIGViLmZuXG4gICAgICAgICAgICAgICAgLmNvYWxlc2NlKFxuICAgICAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEZyb20oXCJwZ19jYXRhbG9nLnBnX2VudW0gYXMgZW5tXCIpXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZVJlZihcImVubS5lbnVtdHlwaWRcIiwgXCI9XCIsIFwidHlwLm9pZFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgICAgICAgICAgICAgICBlYi5mbi5qc29uQWdnKGViLnJlZihcImVubS5lbnVtbGFiZWxcIikpLmFzKFwib1wiKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHNxbDxzdHJpbmdbXT5gJ1tdJ2AsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hcyhcIm9wdGlvbnNcIiksXG4gICAgICAgICAgICAgIGViXG4gICAgICAgICAgICAgICAgLmZuPFxuICAgICAgICAgICAgICAgICAgbnVtYmVyIHwgbnVsbFxuICAgICAgICAgICAgICAgID4oXCJhcnJheV9wb3NpdGlvblwiLCBbXCJwa19jb24uY29ua2V5XCIsIFwiYXR0LmF0dG51bVwiXSlcbiAgICAgICAgICAgICAgICAuYXMoXCJwa1wiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApLmFzKFwiY29sdW1uc1wiKSxcbiAgICAgIF0pLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RhYmxlc1F1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHNjaGVtYTogXCJ6b29cIixcbiAgICAgIG5hbWU6IFwiYW5pbWFsc1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogdHJ1ZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiaW50NFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJuZXh0dmFsKCd6b28uYW5pbWFsc19pZF9zZXEnOjpyZWdjbGFzcylcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNjaGVtYTogXCJwdWJsaWNcIixcbiAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmM6IHRydWUsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludDRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwibmV4dHZhbCgndXNlcnNfaWRfc2VxJzo6cmVnY2xhc3MpXCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgZGF0YXR5cGVfc2NoZW1hOiBcInBnX2NhdGFsb2dcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJkZWxldGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhclwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwicm9sZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmM6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiB0cnVlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVfcm9sZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzY2hlbWE6IFwicHVibGljXCIsXG4gICAgICBuYW1lOiBcImNvbXBvc2l0ZV9wa1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInV1aWRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiZ2VuX3JhbmRvbV91dWlkKClcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiAyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJub3coKVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCB0aW1lem9uZSBzZXR0aW5nIG9mIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVRdWVyeSgpIHtcbiAgY29uc3QgYnVpbGRlciA9IGdldFBvc3RncmVTUUxCdWlsZGVyKCk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlci5zZWxlY3ROb0Zyb20oXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5mbjxzdHJpbmc+KFwiY3VycmVudF9zZXR0aW5nXCIsIFtzcWwubGl0KFwidGltZXpvbmVcIildKVxuICAgICAgICAuYXMoXCJ0aW1lem9uZVwiKSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RpbWV6b25lUXVlcnkoKSB7XG4gIHJldHVybiBbeyB0aW1lem9uZTogXCJVVENcIiB9XSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8XG4gICAgdHlwZW9mIGdldFRpbWV6b25lUXVlcnlcbiAgPjtcbn1cblxuLyoqXG4gKiBXZSBkb24ndCB3YW50IFBvc3RncmVTUUwgaW50ZXJuYWxzIGluIGludHJvc3BlY3Rpb24gcmVzdWx0cy4gVG8gYmUgdXNlZCBpbiBgJGNhbGxgLlxuICovXG5mdW5jdGlvbiBleGNsdWRlU3lzdGVtVGFibGVzPFxuICBUIGV4dGVuZHMgU2VsZWN0UXVlcnlCdWlsZGVyPFxuICAgIERhdGFiYXNlICYge1xuICAgICAgbnM6IERhdGFiYXNlW1wicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2VcIl07XG4gICAgICBjbHM6IERhdGFiYXNlW1wicGdfY2F0YWxvZy5wZ19jbGFzc1wiXTtcbiAgICB9LFxuICAgIFwibnNcIiB8IFwiY2xzXCIsXG4gICAgb2JqZWN0XG4gID4sXG4+KHFiOiBUKTogVCB7XG4gIHJldHVybiBxYlxuICAgIC53aGVyZShgbnMubnNwbmFtZWAsIGAhfmAsIGBecGdfYClcbiAgICAud2hlcmUoYG5zLm5zcG5hbWVgLCBgIT1gLCBgaW5mb3JtYXRpb25fc2NoZW1hYCkgYXMgbmV2ZXI7XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJEZWxldGVSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckVycm9yLFxuICB0eXBlIEFkYXB0ZXJJbnNlcnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJSYXdEZXRhaWxzLFxuICB0eXBlIEFkYXB0ZXJSYXdSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclJlcXVpcmVtZW50cyxcbiAgdHlwZSBBZGFwdGVyU3FsTGludERldGFpbHMsXG4gIHR5cGUgQWRhcHRlclNxbExpbnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclNxbFNjaGVtYVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyVXBkYXRlUmVzdWx0LFxuICB0eXBlIENvbHVtbixcbiAgY3JlYXRlQWRhcHRlckVycm9yLFxuICB0eXBlIEZpbHRlck9wZXJhdG9yLFxuICB0eXBlIFRhYmxlLFxufSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUsXG4gIGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzLFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcbmltcG9ydCB7IGFzUXVlcnksIHR5cGUgUXVlcnksIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBjcmVhdGVTcWxFZGl0b3JTY2hlbWFGcm9tSW50cm9zcGVjdGlvbiB9IGZyb20gXCIuLi9zcWwtZWRpdG9yLXNjaGVtYVwiO1xuaW1wb3J0IHR5cGUgeyBFaXRoZXIgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIH0gZnJvbSBcIi4vZGF0YXR5cGVcIjtcbmltcG9ydCB7XG4gIGdldERlbGV0ZVF1ZXJ5LFxuICBnZXRJbnNlcnRRdWVyeSxcbiAgZ2V0U2VsZWN0UXVlcnksXG4gIGdldFVwZGF0ZVF1ZXJ5LFxufSBmcm9tIFwiLi9kbWxcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlc1F1ZXJ5LFxuICBnZXRUaW1lem9uZVF1ZXJ5LFxuICBtb2NrVGFibGVzUXVlcnksXG4gIG1vY2tUaW1lem9uZVF1ZXJ5LFxufSBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5pbXBvcnQge1xuICBjcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcixcbiAgdmFsaWRhdGVTcWxGb3JMaW50LFxufSBmcm9tIFwiLi9zcWwtbGludFwiO1xuXG5leHBvcnQgdHlwZSBQb3N0Z3Jlc0FkYXB0ZXJSZXF1aXJlbWVudHMgPSBBZGFwdGVyUmVxdWlyZW1lbnRzO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9zdGdyZXNBZGFwdGVyKFxuICByZXF1aXJlbWVudHM6IFBvc3RncmVzQWRhcHRlclJlcXVpcmVtZW50cyxcbik6IEFkYXB0ZXIge1xuICBjb25zdCB7IGV4ZWN1dG9yLCAuLi5vdGhlclJlcXVpcmVtZW50cyB9ID0gcmVxdWlyZW1lbnRzO1xuICBjb25zdCBmdWxsVGFibGVTZWFyY2hTdGF0ZSA9IGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlKCk7XG4gIGxldCBjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgPSB0eXBlb2YgZXhlY3V0b3IubGludFNxbCA9PT0gXCJmdW5jdGlvblwiO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGludHJvc3BlY3REYXRhYmFzZShcbiAgICBvcHRpb25zOiBQYXJhbWV0ZXJzPEFkYXB0ZXJbXCJpbnRyb3NwZWN0XCJdPlswXSxcbiAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFibGVzUXVlcnkgPSBnZXRUYWJsZXNRdWVyeShvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICBjb25zdCB0aW1lem9uZVF1ZXJ5ID0gZ2V0VGltZXpvbmVRdWVyeSgpO1xuXG4gICAgICBjb25zdCBbW3RhYmxlc0Vycm9yLCB0YWJsZXNdLCBbdGltZXpvbmVFcnJvciwgdGltZXpvbmVzXV0gPVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YWJsZXNRdWVyeSwgb3B0aW9ucyksXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0aW1lem9uZVF1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgXSk7XG5cbiAgICAgIGlmICh0YWJsZXNFcnJvcikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRhYmxlc0Vycm9yLCBxdWVyeTogdGFibGVzUXVlcnkgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lem9uZUVycm9yKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgIGVycm9yOiB0aW1lem9uZUVycm9yLFxuICAgICAgICAgIHF1ZXJ5OiB0aW1lem9uZVF1ZXJ5LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZXpvbmUgPSB0aW1lem9uZXNbMF0/LnRpbWV6b25lO1xuXG4gICAgICBpZiAoIXRpbWV6b25lKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJUaW1lem9uZSBub3QgZm91bmRcIiksXG4gICAgICAgICAgcXVlcnk6IHRpbWV6b25lUXVlcnksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW1xuICAgICAgICBudWxsLFxuICAgICAgICBjcmVhdGVJbnRyb3NwZWN0aW9uKHsgcXVlcnk6IHRhYmxlc1F1ZXJ5LCB0YWJsZXMsIHRpbWV6b25lIH0pLFxuICAgICAgXTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlZmF1bHRTY2hlbWE6IFwicHVibGljXCIsXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICBmdWxsVGFibGVTZWFyY2g6IHRydWUsXG4gICAgICBzcWxEaWFsZWN0OiBcInBvc3RncmVzcWxcIixcbiAgICAgIHNxbEVkaXRvckF1dG9jb21wbGV0ZTogdHJ1ZSxcbiAgICAgIHNxbEVkaXRvckxpbnQ6IHRydWUsXG4gICAgfSxcblxuICAgIGFzeW5jIGludHJvc3BlY3QoXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgaW50cm9zcGVjdERhdGFiYXNlKG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBxdWVyeShcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0c10gPVxuICAgICAgICAgIGF3YWl0IGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzKHtcbiAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoVGVybTogZGV0YWlscy5mdWxsVGFibGVTZWFyY2hUZXJtLFxuICAgICAgICAgICAgc3RhdGU6IGZ1bGxUYWJsZVNlYXJjaFN0YXRlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIG51bGwsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsdGVyZWRSb3dDb3VudDogcmVzdWx0c1swXT8uX19wc19jb3VudF9fIHx8IFwiMFwiLFxuICAgICAgICAgICAgcm93czogcmVzdWx0cyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByYXcoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJSYXdSZXN1bHQ+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVJhd1F1ZXJ5KGV4ZWN1dG9yLCBkZXRhaWxzLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3FsU2NoZW1hKFxuICAgICAgX2RldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclNxbFNjaGVtYVJlc3VsdD4+IHtcbiAgICAgIGNvbnN0IFtlcnJvciwgaW50cm9zcGVjdGlvbl0gPSBhd2FpdCBpbnRyb3NwZWN0RGF0YWJhc2Uob3B0aW9ucyk7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY3JlYXRlU3FsRWRpdG9yU2NoZW1hRnJvbUludHJvc3BlY3Rpb24oe1xuICAgICAgICAgIGRlZmF1bHRTY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgZGlhbGVjdDogXCJwb3N0Z3Jlc3FsXCIsXG4gICAgICAgICAgaW50cm9zcGVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICBdO1xuICAgIH0sXG5cbiAgICBhc3luYyBzcWxMaW50KFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyU3FsTGludFJlc3VsdD4+IHtcbiAgICAgIGlmIChjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgJiYgdHlwZW9mIGV4ZWN1dG9yLmxpbnRTcWwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmxpbnRTcWwoZGV0YWlscywgb3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzaG91bGRGYWxsYmFja1RvRXhwbGFpbkxpbnQoZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZERpc2FibGVMaW50VHJhbnNwb3J0KGVycm9yKSkge1xuICAgICAgICAgICAgY2FuVXNlRXhlY3V0b3JMaW50VHJhbnNwb3J0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmICghc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2hvdWxkRGlzYWJsZUxpbnRUcmFuc3BvcnQoZXJyb3IpKSB7XG4gICAgICAgICAgICBjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGxpbnRXaXRoRXhwbGFpbkZhbGxiYWNrKGV4ZWN1dG9yLCBkZXRhaWxzLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaW5zZXJ0KFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW5zZXJ0UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRJbnNlcnRRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByb3dzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93cywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGUoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJVcGRhdGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFVwZGF0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtyb3ddID0gcmVzdWx0cztcblxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlVwZGF0ZSBmYWlsZWRcIiksXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyByb3csIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyRGVsZXRlUmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXREZWxldGVRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgLi4uZGV0YWlscywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZhbGxiYWNrVG9FeHBsYWluTGludChlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW52YWxpZCBwcm9jZWR1cmVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwidW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3JcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW50ZXJuYWwgc2VydmVyIGVycm9yXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImJhZCBnYXRld2F5XCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcInNlcnZpY2UgdW5hdmFpbGFibGVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwibm90IHN1cHBvcnRlZFwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJtZXRob2Qgbm90IGFsbG93ZWRcIilcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGlzYWJsZUxpbnRUcmFuc3BvcnQoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiAoXG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImludmFsaWQgcHJvY2VkdXJlXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcInVuZXhwZWN0ZWQgc2VydmVyIGVycm9yXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImludGVybmFsIHNlcnZlciBlcnJvclwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJub3Qgc3VwcG9ydGVkXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIm1ldGhvZCBub3QgYWxsb3dlZFwiKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaW50V2l0aEV4cGxhaW5GYWxsYmFjayhcbiAgZXhlY3V0b3I6IEFkYXB0ZXJSZXF1aXJlbWVudHNbXCJleGVjdXRvclwiXSxcbiAgZGV0YWlsczogQWRhcHRlclNxbExpbnREZXRhaWxzLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPEFkYXB0ZXJbXCJzcWxMaW50XCJdPj5bMV0sXG4pOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJTcWxMaW50UmVzdWx0Pj4ge1xuICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVTcWxGb3JMaW50KGRldGFpbHMuc3FsKTtcblxuICBpZiAoIXZhbGlkYXRpb24ub2spIHtcbiAgICByZXR1cm4gW1xuICAgICAgbnVsbCxcbiAgICAgIHtcbiAgICAgICAgZGlhZ25vc3RpY3M6IFt2YWxpZGF0aW9uLmRpYWdub3N0aWNdLFxuICAgICAgICBzY2hlbWFWZXJzaW9uOiBkZXRhaWxzLnNjaGVtYVZlcnNpb24sXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBjb25zdCBkaWFnbm9zdGljczogQWRhcHRlclNxbExpbnRSZXN1bHRbXCJkaWFnbm9zdGljc1wiXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHZhbGlkYXRpb24uc3RhdGVtZW50cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleHBsYWluUXVlcnkgPSBhc1F1ZXJ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgICAgYEVYUExBSU4gJHtzdGF0ZW1lbnQuc3RhdGVtZW50fWAsXG4gICAgICApO1xuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUoZXhwbGFpblF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGlhZ25vc3RpY3MucHVzaChcbiAgICAgICAgLi4uY3JlYXRlTGludERpYWdub3N0aWNzRnJvbVBvc3RncmVzRXJyb3Ioe1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0OiBzdGF0ZW1lbnQuZnJvbSxcbiAgICAgICAgICBzcWw6IHN0YXRlbWVudC5zdGF0ZW1lbnQsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgZGlhZ25vc3RpY3MucHVzaChcbiAgICAgICAgLi4uY3JlYXRlTGludERpYWdub3N0aWNzRnJvbVBvc3RncmVzRXJyb3Ioe1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0OiBzdGF0ZW1lbnQuZnJvbSxcbiAgICAgICAgICBzcWw6IHN0YXRlbWVudC5zdGF0ZW1lbnQsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW1xuICAgIG51bGwsXG4gICAge1xuICAgICAgZGlhZ25vc3RpY3MsXG4gICAgICBzY2hlbWFWZXJzaW9uOiBkZXRhaWxzLnNjaGVtYVZlcnNpb24sXG4gICAgfSxcbiAgXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJhd1F1ZXJ5KFxuICBleGVjdXRvcjogQWRhcHRlclJlcXVpcmVtZW50c1tcImV4ZWN1dG9yXCJdLFxuICBkZXRhaWxzOiBBZGFwdGVyUmF3RGV0YWlscyxcbiAgb3B0aW9uczogUGFyYW1ldGVyczxBZGFwdGVyW1wicmF3XCJdPlsxXSxcbik6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclJhd1Jlc3VsdD4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBxdWVyeSA9IGFzUXVlcnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGRldGFpbHMuc3FsKTtcbiAgICBjb25zdCBbZXJyb3IsIHJvd3NdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgIG51bGwsXG4gICAgICB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHJvd3M6IHJvd3MsXG4gICAgICB9LFxuICAgIF07XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRyb3NwZWN0aW9uKGFyZ3M6IHtcbiAgcXVlcnk6IFF1ZXJ5O1xuICB0YWJsZXM6IFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59KTogQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBjb25zdCB7IHF1ZXJ5LCB0YWJsZXMsIHRpbWV6b25lIH0gPSBhcmdzO1xuXG4gIHJldHVybiB0YWJsZXMucmVkdWNlKFxuICAgIChyZXN1bHQsIHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYXMgfSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSA9IHRhYmxlO1xuXG4gICAgICBjb25zdCBjb2x1bW5zUmVjb3JkID0gY29sdW1ucy5yZWR1Y2UoXG4gICAgICAgIChjb2x1bW5zLCBjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBhdXRvaW5jLFxuICAgICAgICAgICAgY29tcHV0ZWQsXG4gICAgICAgICAgICBkYXRhdHlwZSxcbiAgICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgbnVsbGFibGUsXG4gICAgICAgICAgfSA9IGNvbHVtbjtcblxuICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBkYXRhdHlwZS5zdGFydHNXaXRoKFwiX1wiKTtcbiAgICAgICAgICBjb25zdCBzdHJpcHBlZERhdGFUeXBlID0gaXNBcnJheSA/IGRhdGF0eXBlLnNsaWNlKDEpIDogZGF0YXR5cGU7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY29sdW1ucyxcbiAgICAgICAgICAgIFtjb2x1bW5OYW1lXToge1xuICAgICAgICAgICAgICBkYXRhdHlwZToge1xuICAgICAgICAgICAgICAgIC4uLihQT1NUR1JFU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEFbc3RyaXBwZWREYXRhVHlwZV0gfHwge1xuICAgICAgICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnMubGVuZ3RoID4gMCA/IFwiZW51bVwiIDogXCJyYXdcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgICAgICAgIGlzTmF0aXZlOiBkYXRhdHlwZV9zY2hlbWEgPT09IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGlzQXJyYXkgPyBgJHtzdHJpcHBlZERhdGFUeXBlfVtdYCA6IHN0cmlwcGVkRGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IGRhdGF0eXBlX3NjaGVtYSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICBma0NvbHVtbjogY29sdW1uLmZrX2NvbHVtbixcbiAgICAgICAgICAgICAgZmtTY2hlbWE6IGNvbHVtbi5ma19zY2hlbWEsXG4gICAgICAgICAgICAgIGZrVGFibGU6IGNvbHVtbi5ma190YWJsZSxcbiAgICAgICAgICAgICAgaXNBdXRvaW5jcmVtZW50OiBhdXRvaW5jLFxuICAgICAgICAgICAgICBpc0NvbXB1dGVkOiBjb21wdXRlZCxcbiAgICAgICAgICAgICAgaXNSZXF1aXJlZDpcbiAgICAgICAgICAgICAgICAhbnVsbGFibGUgJiYgIWF1dG9pbmMgJiYgIWNvbXB1dGVkICYmIGRlZmF1bHRWYWx1ZSA9PSBudWxsLFxuICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICBudWxsYWJsZSxcbiAgICAgICAgICAgICAgcGtQb3NpdGlvbjogY29sdW1uLnBrLFxuICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICB9IGFzIGNvbnN0IHNhdGlzZmllcyBDb2x1bW4sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgVGFibGVbXCJjb2x1bW5zXCJdLFxuICAgICAgKTtcblxuICAgICAgaWYgKHNjaGVtYXNbc2NoZW1hXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjaGVtYXNbc2NoZW1hXSA9IHsgbmFtZTogc2NoZW1hLCB0YWJsZXM6IHt9IH07XG4gICAgICB9XG5cbiAgICAgIHNjaGVtYXNbc2NoZW1hXS50YWJsZXNbdGFibGVOYW1lXSA9IHtcbiAgICAgICAgY29sdW1uczogY29sdW1uc1JlY29yZCxcbiAgICAgICAgbmFtZTogdGFibGVOYW1lLFxuICAgICAgICBzY2hlbWEsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgZmlsdGVyT3BlcmF0b3JzLFxuICAgICAgcXVlcnksXG4gICAgICBzY2hlbWFzOiB7IHB1YmxpYzogeyBuYW1lOiBcInB1YmxpY1wiLCB0YWJsZXM6IHt9IH0gfSxcbiAgICAgIHRpbWV6b25lLFxuICAgIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0IGFzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0LFxuICApO1xufVxuXG5jb25zdCBmaWx0ZXJPcGVyYXRvcnMgPSBbXG4gIFwiPVwiLFxuICBcIiE9XCIsXG4gIFwiPlwiLFxuICBcIj49XCIsXG4gIFwiPFwiLFxuICBcIjw9XCIsXG4gIFwiaXNcIixcbiAgXCJpcyBub3RcIixcbiAgXCJsaWtlXCIsXG4gIFwibm90IGxpa2VcIixcbiAgXCJpbGlrZVwiLFxuICBcIm5vdCBpbGlrZVwiLFxuXSBzYXRpc2ZpZXMgRmlsdGVyT3BlcmF0b3JbXTtcblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tJbnRyb3NwZWN0KCkge1xuICBjb25zdCB0YWJsZXMgPSBtb2NrVGFibGVzUXVlcnkoKTtcbiAgY29uc3QgW3sgdGltZXpvbmUgfV0gPSBtb2NrVGltZXpvbmVRdWVyeSgpO1xuICBjb25zdCBxdWVyeSA9IHsgcGFyYW1ldGVyczogW10sIHNxbDogXCI8bW9ja2VkPlwiIH0gYXMgUXVlcnk7XG5cbiAgcmV0dXJuIGNyZWF0ZUludHJvc3BlY3Rpb24oeyB0YWJsZXMsIHRpbWV6b25lLCBxdWVyeSB9KSBhcyB7XG4gICAgLy8gYmVzdCBlZmZvcnQsIG5vIG5lZWQgZ28gb3ZlcmJvYXJkLlxuICAgIHNjaGVtYXM6IHtcbiAgICAgIFtLIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wic2NoZW1hXCJdXToge1xuICAgICAgICBuYW1lOiBLO1xuICAgICAgICB0YWJsZXM6IHtcbiAgICAgICAgICBbVCBpbiAodHlwZW9mIHRhYmxlcylbbnVtYmVyXVtcIm5hbWVcIl1dOiBUYWJsZTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aW1lem9uZTogdHlwZW9mIHRpbWV6b25lO1xuICAgIGZpbHRlck9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXTtcbiAgICBxdWVyeTogUXVlcnk7XG4gIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7c1VBRU8sSUFBTUEsRUFHVCxDQUNGLEtBQU0sQ0FDSixNQUFPLFNBQ1QsRUFDQSxRQUFTLENBQ1AsTUFBTyxTQUNULEVBQ0EsTUFBTyxDQUNMLE1BQU8sUUFDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFDQSxPQUFRLENB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Q04sU0FBQUMsRUFDQSxXQUFZUCxFQUFPLEdBQ25CLE9BQUFGLEVBQ0EsTUFBT0QsQ0FDVCxDQUNGLENBQ0YsRUFDQSxDQUFDLENBQ0gsRUFFQSxPQUFJRixFQUFRRyxDQUFNLElBQU0sU0FDdEJILEVBQVFHLENBQU0sRUFBSSxDQUFFLEtBQU1BLEVBQVEsT0FBUSxDQUFDLENBQUUsR0FHL0NILEVBQVFHLENBQU0sRUFBRSxPQUFPRCxDQUFTLEVBQUksQ0FDbEMsUUFBU0UsRUFDVCxLQUFNRixFQUNOLE9BQUFDLENBQ0YsRUFFT3RCLENBQ1QsRUFDQSxDQUNFLGdCQUFBbUMsR0FDQSxNQUFBM0MsRUFDQSxRQUFTLENBQUUsT0FBUSxDQUFFLEtBQU0sU0FBVSxPQUFRLENBQUMsQ0FBRSxDQUFFLEVBQ2xELFNBQUFKLENBQ0YsQ0FDRixDQUNGLENBRUEsSUFBTStDLEdBQWtCLENBQ3RCLElBQ0EsS0FDQSxJQUNBLEtBQ0EsSUFDQSxLQUNBLEtBQ0EsU0FDQSxPQUNBLFdBQ0EsUUFDQSxXQUNGLEVBS08sU0FBU0MsSUFBaUIsQ0FDL0IsSUFBTXBELEVBQVNxRCxHQUFnQixFQUN6QixDQUFDLENBQUUsU0FBQWpELENBQVMsQ0FBQyxFQUFJa0QsR0FBa0IsRUFHekMsT0FBT2pELEdBQW9CLENBQUUsT0FBQUwsRUFBUSxTQUFBSSxFQUFVLE1BRmpDLENBQUUsV0FBWSxDQUFDLEVBQUcsSUFBSyxVQUFXLENBRUssQ0FBQyxDQWN4RCIsCiAgIm5hbWVzIjogWyJQT1NUR1JFU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEEiLCAiZ2V0UG9zdGdyZVNRTEJ1aWxkZXIiLCAicmVxdWlyZW1lbnRzIiwgImdldEJ1aWxkZXIiLCAiUG9zdGdyZXNBZGFwdGVyIiwgIlBvc3RncmVzUXVlcnlDb21waWxlciIsICJidWlsZEZ1bGxUYWJsZVNlYXJjaFBsYW4iLCAiYXJncyIsICJiYXNlUGxhbiIsICJub3JtYWxpemVkU2VhcmNoVGVybSIsICJleGlzdGluZ1RleHRDb2x1bW5zIiwgInByZWRpY2F0ZSIsICJyZW1haW5pbmdUZXh0U2xvdHMiLCAicGF0dGVybiIsICJlc2NhcGVMaWtlUGF0dGVybiIsICJzdXBwbGVtZW50YWxQcmVkaWNhdGVzIiwgImNvbHVtbiIsICJ2YWx1ZSIsICJnZXRJbnNlcnRRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJyb3dzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgInNjaGVtYSIsICJidWlsZGVyIiwgImdldFBvc3RncmVTUUxCdWlsZGVyIiwgImNvbXBpbGUiLCAiYXBwbHlUcmFuc2Zvcm1hdGlvbnMiLCAiZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcyIsICJnZXRTZWxlY3RRdWVyeSIsICJmaWx0ZXIiLCAiZnVsbFRhYmxlU2VhcmNoVGVybSIsICJwYWdlSW5kZXgiLCAicGFnZVNpemUiLCAic29ydE9yZGVyIiwgImFwcGxpZWRGaWx0ZXJFeHByZXNzaW9uIiwgImdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24iLCAiZnVsbFRhYmxlU2VhcmNoUGxhbiIsICJidWlsZEZ1bGxUYWJsZVNlYXJjaFBsYW4iLCAiY29tYmluZWRXaGVyZUV4cHJlc3Npb24iLCAiZWIiLCAiZ2V0RnVsbFRhYmxlU2VhcmNoRXhwcmVzc2lvbiIsICJBR0dfTkFNRSIsICJDT1VOVF9SRUYiLCAiU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSIsICJpc0Z1bGxUYWJsZVNlYXJjaFJlcXVlc3QiLCAicWIiLCAic3FsIiwgImpiIiwgImN1cnJlbnRRdWVyeSIsICJpdGVtIiwgImNvbHVtbiIsICJjb3VudFF1ZXJ5IiwgIm1vY2tTZWxlY3RRdWVyeSIsICJnZXRVcGRhdGVRdWVyeSIsICJjaGFuZ2VzIiwgInJvdyIsICJhcHBseUluZmVycmVkUm93RmlsdGVycyIsICJnZXREZWxldGVRdWVyeSIsICJleHByZXNzaW9uQnVpbGRlciIsICJqc29uQXJyYXlGcm9tIiwgImV4cHIiLCAic3FsIiwgIlJFR1VMQVJfVEFCTEVfS0lORCIsICJWSUVXX1RBQkxFX0tJTkQiLCAiVEFCTEVfS0lORFMiLCAiZ2V0VGFibGVzUXVlcnkiLCAicmVxdWlyZW1lbnRzIiwgImNvbXBpbGUiLCAiZ2V0UG9zdGdyZVNRTEJ1aWxkZXIiLCAiZXhjbHVkZVN5c3RlbVRhYmxlcyIsICJlYiIsICJqc29uQXJyYXlGcm9tIiwgImpiIiwgIm9uX2ViIiwgInNxbCIsICJtb2NrVGFibGVzUXVlcnkiLCAiZ2V0VGltZXpvbmVRdWVyeSIsICJidWlsZGVyIiwgIm1vY2tUaW1lem9uZVF1ZXJ5IiwgInFiIiwgImNyZWF0ZVBvc3RncmVzQWRhcHRlciIsICJyZXF1aXJlbWVudHMiLCAiZXhlY3V0b3IiLCAib3RoZXJSZXF1aXJlbWVudHMiLCAiZnVsbFRhYmxlU2VhcmNoU3RhdGUiLCAiY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUiLCAiY2FuVXNlRXhlY3V0b3JMaW50VHJhbnNwb3J0IiwgImludHJvc3BlY3REYXRhYmFzZSIsICJvcHRpb25zIiwgInRhYmxlc1F1ZXJ5IiwgImdldFRhYmxlc1F1ZXJ5IiwgInRpbWV6b25lUXVlcnkiLCAiZ2V0VGltZXpvbmVRdWVyeSIsICJ0YWJsZXNFcnJvciIsICJ0YWJsZXMiLCAidGltZXpvbmVFcnJvciIsICJ0aW1lem9uZXMiLCAiY3JlYXRlQWRhcHRlckVycm9yIiwgInRpbWV6b25lIiwgImNyZWF0ZUludHJvc3BlY3Rpb24iLCAiZXJyb3IiLCAiZGV0YWlscyIsICJxdWVyeSIsICJnZXRTZWxlY3RRdWVyeSIsICJyZXN1bHRzIiwgImV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzIiwgImV4ZWN1dGVSYXdRdWVyeSIsICJfZGV0YWlscyIsICJpbnRyb3NwZWN0aW9uIiwgImNyZWF0ZVNxbEVkaXRvclNjaGVtYUZyb21JbnRyb3NwZWN0aW9uIiwgInJlc3VsdCIsICJzaG91bGRGYWxsYmFja1RvRXhwbGFpbkxpbnQiLCAic2hvdWxkRGlzYWJsZUxpbnRUcmFuc3BvcnQiLCAibGludFdpdGhFeHBsYWluRmFsbGJhY2siLCAiZ2V0SW5zZXJ0UXVlcnkiLCAicm93cyIsICJnZXRVcGRhdGVRdWVyeSIsICJyb3ciLCAiZ2V0RGVsZXRlUXVlcnkiLCAibWVzc2FnZSIsICJ2YWxpZGF0aW9uIiwgInZhbGlkYXRlU3FsRm9yTGludCIsICJkaWFnbm9zdGljcyIsICJzdGF0ZW1lbnQiLCAiZXhwbGFpblF1ZXJ5IiwgImFzUXVlcnkiLCAiY3JlYXRlTGludERpYWdub3N0aWNzRnJvbVBvc3RncmVzRXJyb3IiLCAiYXJncyIsICJ0YWJsZSIsICJzY2hlbWFzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgInNjaGVtYSIsICJjb2x1bW5zUmVjb3JkIiwgImNvbHVtbiIsICJhdXRvaW5jIiwgImNvbXB1dGVkIiwgImRhdGF0eXBlIiwgImRhdGF0eXBlX3NjaGVtYSIsICJkZWZhdWx0VmFsdWUiLCAiY29sdW1uTmFtZSIsICJudWxsYWJsZSIsICJpc0FycmF5IiwgInN0cmlwcGVkRGF0YVR5cGUiLCAiUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIiwgImZpbHRlck9wZXJhdG9ycyIsICJtb2NrSW50cm9zcGVjdCIsICJtb2NrVGFibGVzUXVlcnkiLCAibW9ja1RpbWV6b25lUXVlcnkiXQp9Cg==