@prisma/studio-core-licensed 0.0.0-dev.202512242115 → 0.0.0-dev.202512250000

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.
Files changed (43) hide show
  1. package/dist/chunk-LNOFYMEV.js +10 -0
  2. package/dist/chunk-PKLRFKIE.js +10 -0
  3. package/dist/data/accelerate/index.d.cts +1 -1
  4. package/dist/data/accelerate/index.d.ts +1 -1
  5. package/dist/data/bff/index.d.cts +1 -1
  6. package/dist/data/bff/index.d.ts +1 -1
  7. package/dist/data/index.d.cts +1 -1
  8. package/dist/data/index.d.ts +1 -1
  9. package/dist/data/mysql-core/index.cjs +2 -2
  10. package/dist/data/mysql-core/index.d.cts +1 -1
  11. package/dist/data/mysql-core/index.d.ts +1 -1
  12. package/dist/data/mysql-core/index.js +3 -3
  13. package/dist/data/mysql2/index.d.cts +1 -1
  14. package/dist/data/mysql2/index.d.ts +1 -1
  15. package/dist/data/node-sqlite/index.d.cts +1 -1
  16. package/dist/data/node-sqlite/index.d.ts +1 -1
  17. package/dist/data/pglite/index.cjs +2 -2
  18. package/dist/data/pglite/index.d.cts +1 -1
  19. package/dist/data/pglite/index.d.ts +1 -1
  20. package/dist/data/pglite/index.js +1 -1
  21. package/dist/data/postgres-core/index.cjs +2 -2
  22. package/dist/data/postgres-core/index.d.cts +13 -1
  23. package/dist/data/postgres-core/index.d.ts +13 -1
  24. package/dist/data/postgres-core/index.js +1 -1
  25. package/dist/data/postgresjs/index.d.cts +1 -1
  26. package/dist/data/postgresjs/index.d.ts +1 -1
  27. package/dist/data/ppg/index.d.cts +1 -1
  28. package/dist/data/ppg/index.d.ts +1 -1
  29. package/dist/data/sqlite-core/index.cjs +2 -2
  30. package/dist/data/sqlite-core/index.d.cts +1 -1
  31. package/dist/data/sqlite-core/index.d.ts +1 -1
  32. package/dist/data/sqlite-core/index.js +2 -2
  33. package/dist/{index-CqM65jmE.d.cts → index-rgorTaJw.d.cts} +1 -0
  34. package/dist/{index-CqM65jmE.d.ts → index-rgorTaJw.d.ts} +1 -0
  35. package/dist/metafile-cjs.json +1 -1
  36. package/dist/metafile-esm.json +1 -1
  37. package/dist/ui/index.cjs +1 -1
  38. package/dist/ui/index.d.cts +1 -1
  39. package/dist/ui/index.d.ts +1 -1
  40. package/dist/ui/index.js +1 -1
  41. package/package.json +1 -1
  42. package/dist/chunk-OIVTTVFY.js +0 -10
  43. package/dist/chunk-RMMVUGJM.js +0 -10
@@ -1,4 +1,4 @@
1
- import { d as AdapterRequirements, S as SequenceExecutor, A as Adapter, T as Table, F as FilterOperator, Q as Query, f as AdapterDeleteDetails, B as BuilderRequirements, h as AdapterUpdateDetails, e as AdapterQueryDetails } from '../../index-CqM65jmE.cjs';
1
+ import { d as AdapterRequirements, S as SequenceExecutor, A as Adapter, T as Table, F as FilterOperator, Q as Query, f as AdapterDeleteDetails, B as BuilderRequirements, h as AdapterUpdateDetails, e as AdapterQueryDetails } from '../../index-rgorTaJw.cjs';
2
2
  import { OkPacketParams } from 'mysql2';
3
3
  import * as kysely from 'kysely';
4
4
 
@@ -1,4 +1,4 @@
1
- import { d as AdapterRequirements, S as SequenceExecutor, A as Adapter, T as Table, F as FilterOperator, Q as Query, f as AdapterDeleteDetails, B as BuilderRequirements, h as AdapterUpdateDetails, e as AdapterQueryDetails } from '../../index-CqM65jmE.js';
1
+ import { d as AdapterRequirements, S as SequenceExecutor, A as Adapter, T as Table, F as FilterOperator, Q as Query, f as AdapterDeleteDetails, B as BuilderRequirements, h as AdapterUpdateDetails, e as AdapterQueryDetails } from '../../index-rgorTaJw.js';
2
2
  import { OkPacketParams } from 'mysql2';
3
3
  import * as kysely from 'kysely';
4
4
 
@@ -6,6 +6,6 @@ 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 $}from"../../chunk-HL3RVO3Q.js";import{a as ue}from"../../chunk-ZUEQ555M.js";import{a as i}from"../../chunk-RMMVUGJM.js";import{i as _,n as P,o as j,p as F,r as b,s as M,t as Y,u as B,v as z}from"../../chunk-I2RENVNB.js";import{e as d}from"../../chunk-GDQBQ7MK.js";d();d();d();var G={bigint:{group:"numeric"},binary:{group:"string"},bit:{group:"raw"},blob:{group:"string"},char:{group:"string"},"char binary":{group:"string"},date:{group:"datetime"},datetime:{group:"datetime"},dec:{group:"numeric"},decimal:{group:"numeric"},double:{group:"numeric"},"double precision":{group:"numeric"},enum:{group:"enum"},fixed:{group:"numeric"},float:{group:"numeric"},geometry:{group:"raw"},geometrycollection:{group:"raw"},int:{group:"numeric"},integer:{group:"numeric"},json:{group:"json"},linestring:{group:"raw"},long:{group:"string"},"long varchar":{group:"string"},longblob:{group:"string"},longtext:{group:"string"},longvarbinary:{group:"string"},longvarchar:{group:"string"},mediumblob:{group:"string"},mediumint:{group:"numeric"},mediumtext:{group:"string"},multilinestring:{group:"raw"},multipoint:{group:"raw"},multipolygon:{group:"raw"},numeric:{group:"numeric"},point:{group:"raw"},polygon:{group:"raw"},real:{group:"numeric"},set:{group:"raw"},smallint:{group:"numeric"},text:{group:"string"},time:{group:"time"},timestamp:{group:"datetime"},tinyblob:{group:"string"},tinyint:{group:"numeric"},tinytext:{group:"string"},varbinary:{group:"string"},varchar:{group:"string"},"varchar binary":{group:"string"},vector:{group:"raw"},year:{group:"numeric"}};d();d();function R(o){return F({...o,Adapter:j,QueryCompiler:P})}function H(o,t){let{rows:r,table:{columns:s,name:n}}=o,e=R(t);return b(e.deleteFrom(n).$call(M(r,s)).$castTo())}function L(o,t){let{rows:r,table:{columns:s,name:n}}=o,e=R(t);return b(e.insertInto(n).values(B("insert",r,s)).$castTo())}function I(o,t){let{criteria:r,table:{columns:s,name:n}}=o,e=R(t);return b(e.selectFrom(n).$call(M(r,s)).select(Object.keys(s)).select(J().as("__ps_inserted_at__")))}function v(o,t){let{changes:r,row:s,table:{columns:n,name:e}}=o,u=R(t);return b(u.selectFrom(e).$call(M([{...s,...r}],n)).select(Object.keys(n)).select(J().as("__ps_updated_at__")))}function K(o,t){let{filter:r={after:"and",filters:[],kind:"FilterGroup"},pageIndex:s,pageSize:n,sortOrder:e,table:{columns:u,name:p}}=o,y=R(t),c=z(r.filters,u),A="__ps_agg__",f="__ps_count__",E=y.selectFrom(p).where(c).select(l=>l.cast(l.fn.coalesce(l.fn.countAll(),_.lit(0)),"char").as(f));return b(y.with(A,()=>E).selectFrom(p).innerJoin(A,l=>l.onTrue()).where(c).select(`${A}.${f}`).select(Object.keys(u)).$call(l=>e.reduce((T,a)=>T.orderBy(a.column,a.direction),l)).limit(n).offset(_.lit(BigInt(s)*BigInt(n))))}function Ae(){return[]}function V(o,t){let{changes:r,row:s,table:{columns:n,name:e,schema:u}}=o,p=R(t);return b(p.withSchema(u).updateTable(e).set(B("update",r,n)).$call(M([s],n)).$castTo())}function J(){return _`cast(unix_timestamp(now(3)) * 1000 as unsigned)`}d();d();function W(o){return _`(select cast(coalesce(json_arrayagg(json_object(${_.join(oe(o.toOperationNode(),"agg"))})), '[]') as json) from ${o} as agg)`}function oe(o,t){try{return $(o,t)}catch{throw new Error("MySQL jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}function X(o){return b(R(o).selectFrom("information_schema.tables as t").where("t.TABLE_SCHEMA","=",_`database()`).where("t.TABLE_TYPE","in",["BASE TABLE","VIEW"]).select(["t.TABLE_SCHEMA as schema","t.TABLE_NAME as name","t.TABLE_TYPE as type"]).$narrowType().select(t=>W(t.selectFrom("information_schema.columns as c").leftJoin("information_schema.KEY_COLUMN_USAGE as kcu",r=>r.onRef("kcu.TABLE_SCHEMA","=","c.TABLE_SCHEMA").onRef("kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("kcu.POSITION_IN_UNIQUE_CONSTRAINT","is not",null)).leftJoin("information_schema.KEY_COLUMN_USAGE as pk_kcu",r=>r.onRef("pk_kcu.TABLE_SCHEMA","=","c.TABLE_SCHEMA").onRef("pk_kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("pk_kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("pk_kcu.CONSTRAINT_NAME","=","PRIMARY")).whereRef("c.TABLE_SCHEMA","=","t.TABLE_SCHEMA").whereRef("c.TABLE_NAME","=","t.TABLE_NAME").select(["c.COLUMN_NAME as name","c.COLUMN_TYPE as datatype","c.ORDINAL_POSITION as position","kcu.REFERENCED_TABLE_NAME as fk_table","kcu.REFERENCED_COLUMN_NAME as fk_column","pk_kcu.ORDINAL_POSITION as pk"]).select(r=>[r("c.EXTRA","=","auto_increment").as("autoincrement"),r("c.EXTRA","in",["on update CURRENT_TIMESTAMP","STORED GENERATED","VIRTUAL GENERATED"]).as("computed"),r("c.IS_NULLABLE","=","YES").as("nullable")])).as("columns")).orderBy("t.TABLE_SCHEMA").orderBy("t.TABLE_NAME").orderBy("t.TABLE_TYPE"))}function Z(){return[{columns:[{autoincrement:1,computed:0,datatype:"int",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"binary(16)",fk_column:null,fk_table:null,name:"uuid",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"varchar(255)",fk_column:null,fk_table:null,name:"name",nullable:1,pk:null,position:3},{autoincrement:0,computed:1,datatype:"text",fk_column:null,fk_table:null,name:"id_name",nullable:1,pk:null,position:4}],name:"animals",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:1,computed:0,datatype:"int",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"timestamp",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"enum('admin','maintainer','member')",fk_column:null,fk_table:null,name:"role",nullable:0,pk:null,position:3},{autoincrement:0,computed:0,datatype:"int",fk_column:"id",fk_table:"animals",name:"animal_id",nullable:1,pk:null,position:4}],name:"users",schema:"studio",type:"BASE TABLE"}]}function ee(o){let t=R(o),r=_`@@session.time_zone`;return b(t.selectNoFrom(t.case().when(r,"=","SYSTEM").then(_`@@system_time_zone`).else(r).end().as("timezone")).$narrowType())}function re(){return[{timezone:"UTC"}]}function Ie(o){let{executor:t,...r}=o;return{async delete(s,n){try{let e=H(s,r),[u]=await t.execute(e,n);return u?i({error:u,query:e}):[null,{...s,query:e}]}catch(e){return i({error:e})}},async insert(s,n){try{let{rows:e,table:u}=s,{columns:p}=u,y=Object.values(p).find(a=>a.isAutoincrement),c=e.map(a=>Y(a,p)),A=c.some(a=>{let m=Object.values(a);return m.length===0||m.some(g=>g==null)});if(!y&&A)return i({error:new Error("Cannot proceed with the insertion, some rows cannot be refetched after insertion."),query:L(s,r)});if(!A){let a=L(s,r),m=I({criteria:c,table:u},r),g=[a,m],[[S],h]=await t.executeSequence(g,n),N=Q(g);if(S)return i({error:S,query:N});let[w,O]=h;return w?i({error:new Error("Failed to refetch inserted rows - please refresh.",{cause:w}),query:N}):[null,{rows:O,query:N}]}let f=await Promise.all(e.map(async a=>{let m=L({rows:[a],table:u},r),[g,S]=await t.execute(m,n);if(g)return i({error:g,query:m});let{name:h}=y,N=a[h]||S[0]?.insertId;if(!N)return i({error:new Error("Could not determine value for autoincrement column to refetch inserted row."),query:m});let w=I({criteria:[{[h]:N}],table:{...u,columns:Object.values(p).reduce((x,U)=>{let{name:D}=U;return x[D]={...U,pkPosition:D===h?1:null},x},{})}},r),[O,ne]=await t.execute(w,n),C=Q([m,w]);if(O)return console.error("Error refetching inserted row:",O),i({error:new Error("Failed to refetch inserted row - please refresh.",{cause:O}),query:C});let[q]=ne;return q?[null,{row:q,query:C}]:i({error:new Error("Refetch query returned no results for inserted row."),query:C})})),E=[],l=null,T=[];for(let a=0;a<f.length;a++){let[m,g]=f[a];m?(T.push([a,m]),m.query&&(l=l?Q([l,m.query]):m.query)):(E.push(g.row),g.query&&(l=l?Q([l,g.query]):g.query))}return T.length>0?i({error:new AggregateError(T.map(([,a])=>a),`Row${T.length>1?"s":""} ${T.map(([a])=>a).join(", ")} could not be inserted or refetched.`),query:l}):[null,{rows:E,query:l}]}catch(e){return i({error:e})}},async introspect(s){try{let n=X(o),e=ee(o),[[u,p],[y,c]]=await Promise.all([t.execute(n,s),t.execute(e,s)]);if(u)return i({error:u,query:n});if(y)return i({error:y,query:e});let A=c[0]?.timezone;return A?[null,te({query:n,tables:p,timezone:A})]:i({error:new Error("Timezone not found"),query:e})}catch(n){return i({error:n})}},async query(s,n){try{let e=K(s,r),[u,p]=await t.execute(e,n);return u?i({error:u,query:e}):[null,{filteredRowCount:p[0]?.__ps_count__||"0",rows:p,query:e}]}catch(e){return i({error:e})}},async update(s,n){try{let e=V(s,r),u=v(s,r),[[p],y]=await t.executeSequence([e,u],n);if(p)return i({error:p,query:e});let[c,A]=y;if(c)return i({error:c,query:e});let[f]=A;return f?[null,{row:f,query:e}]:i({error:new Error("Updated row not found"),query:e})}catch(e){return i({error:e})}}}}function te(o){let{query:t,tables:r,timezone:s}=o;return r.reduce((n,e)=>{let{schemas:u}=n,{columns:p,name:y,schema:c}=e,A=p.sort((f,E)=>f.position-E.position).reduce((f,E)=>{let{datatype:l,name:T}=E,a=l.indexOf("("),m=(a>-1?l.substring(0,a):l).trim().toLowerCase();return{...f,[T]:{datatype:{...G[m]||{group:"raw"},isArray:!1,isNative:!0,name:m,options:m==="enum"?l.slice(6,-2).split("','"):[],schema:c},fkColumn:E.fk_column,fkSchema:c,fkTable:E.fk_table,isAutoincrement:!!E.autoincrement,isComputed:!!E.computed,name:T,nullable:!!E.nullable,pkPosition:E.pk,schema:c,table:y}}},{});return u[c]===void 0&&(u[c]={name:c,tables:{}}),u[c].tables[y]={columns:A,name:y,schema:c},n},{filterOperators:se,query:t,schemas:{},timezone:s})}var se=["=","!=",">",">=","<","<=","is","is not","like","not like"];function qe(){let o=Z(),[{timezone:t}]=re();return te({tables:o,timezone:t,query:{parameters:[],sql:"<mocked>"}})}function Q(o){let[t,r]=o;return{parameters:t.parameters.concat(r.parameters),sql:`${t.sql};
10
- ${r.sql}`}}export{Ie as createMySQLAdapter,ue as getCancelQuery,H as getDeleteQuery,L as getInsertQuery,I as getInsertRefetchQuery,K as getSelectQuery,X as getTablesQuery,ee as getTimezoneQuery,V as getUpdateQuery,v as getUpdateRefetchQuery,qe as mockIntrospect,Ae as mockSelectQuery,Z as mockTablesQuery,re as mockTimezoneQuery};
11
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9teXNxbC1jb3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9hZGFwdGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9kYXRhdHlwZS50cyIsICIuLi8uLi8uLi9kYXRhL215c3FsLWNvcmUvZG1sLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9idWlsZGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9pbnRyb3NwZWN0aW9uLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vaGVscGVycy9teXNxbC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZG1sXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsaXR5XCI7XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJEZWxldGVSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckVycm9yLFxuICB0eXBlIEFkYXB0ZXJJbnNlcnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJSZXF1aXJlbWVudHMsXG4gIHR5cGUgQWRhcHRlclVwZGF0ZVJlc3VsdCxcbiAgdHlwZSBDb2x1bW4sXG4gIGNyZWF0ZUFkYXB0ZXJFcnJvcixcbiAgdHlwZSBGaWx0ZXJPcGVyYXRvcixcbiAgdHlwZSBUYWJsZSxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VxdWVuY2VFeGVjdXRvciB9IGZyb20gXCIuLi9leGVjdXRvclwiO1xuaW1wb3J0IHsgaW5mZXJGaWx0ZXJPYmplY3QsIHR5cGUgUXVlcnksIHR5cGUgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgRWl0aGVyIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IE1ZU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEEgfSBmcm9tIFwiLi9kYXRhdHlwZVwiO1xuaW1wb3J0IHtcbiAgZ2V0RGVsZXRlUXVlcnksXG4gIGdldEluc2VydFF1ZXJ5LFxuICBnZXRJbnNlcnRSZWZldGNoUXVlcnksXG4gIGdldFNlbGVjdFF1ZXJ5LFxuICBnZXRVcGRhdGVRdWVyeSxcbiAgZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5LFxufSBmcm9tIFwiLi9kbWxcIjtcbmltcG9ydCB7IGdldFRhYmxlc1F1ZXJ5LCBnZXRUaW1lem9uZVF1ZXJ5LCBtb2NrVGFibGVzUXVlcnksIG1vY2tUaW1lem9uZVF1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgdHlwZSBNeVNRTEFkYXB0ZXJSZXF1aXJlbWVudHMgPSBPbWl0PEFkYXB0ZXJSZXF1aXJlbWVudHMsIFwiZXhlY3V0b3JcIj4gJiB7XG4gIGV4ZWN1dG9yOiBTZXF1ZW5jZUV4ZWN1dG9yO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU15U1FMQWRhcHRlcihyZXF1aXJlbWVudHM6IE15U1FMQWRhcHRlclJlcXVpcmVtZW50cyk6IEFkYXB0ZXIge1xuICBjb25zdCB7IGV4ZWN1dG9yLCAuLi5vdGhlclJlcXVpcmVtZW50cyB9ID0gcmVxdWlyZW1lbnRzO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZGVsZXRlKGRldGFpbHMsIG9wdGlvbnMpOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJEZWxldGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldERlbGV0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyAuLi5kZXRhaWxzLCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGluc2VydChkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW5zZXJ0UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyByb3dzLCB0YWJsZSB9ID0gZGV0YWlscztcbiAgICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSB0YWJsZTtcblxuICAgICAgICBjb25zdCBhdXRvaW5jcmVtZW50Q29sdW1uOiBDb2x1bW4gfCB1bmRlZmluZWQgPSBPYmplY3QudmFsdWVzKGNvbHVtbnMpLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlzQXV0b2luY3JlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyT2JqZWN0cyA9IHJvd3MubWFwKChyb3cpID0+IGluZmVyRmlsdGVyT2JqZWN0KHJvdywgY29sdW1ucykpO1xuXG4gICAgICAgIGNvbnN0IGhhc1BhcnRpYWxGaWx0ZXJPYmplY3RzID0gZmlsdGVyT2JqZWN0cy5zb21lKChmaWx0ZXJPYmplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZXMgPSBPYmplY3QudmFsdWVzKGZpbHRlck9iamVjdCk7XG5cbiAgICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWVzLmxlbmd0aCA9PT0gMCB8fCBmaWx0ZXJWYWx1ZXMuc29tZSgodmFsdWUpID0+IHZhbHVlID09IG51bGwpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgY2xhc3NpYyBwYXJ0aWFsIGZpbHRlciBvYmplY3QgY2FzZXMgKGUuZy4gdXVpZCkgaGVyZSBvciBiZWZvcmUgcmVxdWVzdGluZyBmcm9tIGFkYXB0ZXIuXG4gICAgICAgIGlmICghYXV0b2luY3JlbWVudENvbHVtbiAmJiBoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIGluc2VydGlvbiwgc29tZSByb3dzIGNhbm5vdCBiZSByZWZldGNoZWQgYWZ0ZXIgaW5zZXJ0aW9uLlwiKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBnZXRJbnNlcnRRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc1BhcnRpYWxGaWx0ZXJPYmplY3RzKSB7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0UXVlcnkgPSBnZXRJbnNlcnRRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgICAgY29uc3QgcmVmZXRjaFF1ZXJ5ID0gZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5KHsgY3JpdGVyaWE6IGZpbHRlck9iamVjdHMsIHRhYmxlIH0sIG90aGVyUmVxdWlyZW1lbnRzKTtcbiAgICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IFtpbnNlcnRRdWVyeSwgcmVmZXRjaFF1ZXJ5XSBhcyBjb25zdDtcblxuICAgICAgICAgIGNvbnN0IFtbaW5zZXJ0RXJyb3JdLCBtYXliZVJlZmV0Y2hSZXN1bHRdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZVNlcXVlbmNlKHNlcXVlbmNlLCBvcHRpb25zKTtcblxuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gam9pblNlcXVlbmNlKHNlcXVlbmNlKTtcblxuICAgICAgICAgIGlmIChpbnNlcnRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBpbnNlcnRFcnJvciwgcXVlcnkgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gbWF5YmVSZWZldGNoUmVzdWx0ITtcblxuICAgICAgICAgIGlmIChyZWZldGNoRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93cyAtIHBsZWFzZSByZWZyZXNoLlwiLCB7IGNhdXNlOiByZWZldGNoRXJyb3IgfSksXG4gICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvd3M6IHJlZmV0Y2hSZXN1bHRzLCBxdWVyeSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhcyBhdXRvaW5jcmVtZW50IGNvbHVtbiAtIGluc2VydCByb3dzIG9uZSBieSBvbmUgYW5kIHJlZmV0Y2gsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYGluc2VydElkYCBpZiBpbnNlcnRlZCByb3cgaGFzIG5vIHZhbHVlIGZvciB0aGlzIGNvbHVtbi5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJvd3MubWFwKGFzeW5jIChyb3cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFF1ZXJ5ID0gZ2V0SW5zZXJ0UXVlcnkoeyByb3dzOiBbcm93XSwgdGFibGUgfSwgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKGluc2VydFF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnk6IGluc2VydFF1ZXJ5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7IG5hbWU6IGF1dG9pbmNyZW1lbnRDb2x1bW5OYW1lIH0gPSBhdXRvaW5jcmVtZW50Q29sdW1uITtcblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbYXV0b2luY3JlbWVudENvbHVtbk5hbWVdIHx8IHJlc3VsdFswXT8uaW5zZXJ0SWQ7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBkZXRlcm1pbmUgdmFsdWUgZm9yIGF1dG9pbmNyZW1lbnQgY29sdW1uIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93LlwiKSxcbiAgICAgICAgICAgICAgICBxdWVyeTogaW5zZXJ0UXVlcnksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRJbnNlcnRSZWZldGNoUXVlcnkoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjcml0ZXJpYTogW3sgW2F1dG9pbmNyZW1lbnRDb2x1bW5OYW1lXTogdmFsdWUgfV0sXG4gICAgICAgICAgICAgICAgdGFibGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGRpcnR5IGhhY2sgdG8gbWFyayBhdXRvaW5jcmVtZW50IGNvbHVtbiBhcyBUSEUgcHJpbWFyeSBrZXkgZm9yIHJlZmV0Y2hpbmcuXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zOiBPYmplY3QudmFsdWVzKGNvbHVtbnMpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGFjYywgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lOiBjb2x1bW5OYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgICAgICAgICAgICAgICAgICBhY2NbY29sdW1uTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBwa1Bvc2l0aW9uOiBjb2x1bW5OYW1lID09PSBhdXRvaW5jcmVtZW50Q29sdW1uTmFtZSA/IDEgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG90aGVyUmVxdWlyZW1lbnRzLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShyZWZldGNoUXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IGpvaW5TZXF1ZW5jZShbaW5zZXJ0UXVlcnksIHJlZmV0Y2hRdWVyeV0pO1xuXG4gICAgICAgICAgICBpZiAocmVmZXRjaEVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWZldGNoaW5nIGluc2VydGVkIHJvdzpcIiwgcmVmZXRjaEVycm9yKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93IC0gcGxlYXNlIHJlZnJlc2guXCIsIHsgY2F1c2U6IHJlZmV0Y2hFcnJvciB9KSxcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtyZWZldGNoZWRSb3ddID0gcmVmZXRjaFJlc3VsdHM7XG5cbiAgICAgICAgICAgIGlmICghcmVmZXRjaGVkUm93KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJSZWZldGNoIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdHMgZm9yIGluc2VydGVkIHJvdy5cIiksXG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW251bGwsIHsgcm93OiByZWZldGNoZWRSb3csIHF1ZXJ5IH1dIGFzIGNvbnN0O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGluc2VydGVkUm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgICBsZXQgcXVlcnk6IFF1ZXJ5PHVua25vd24+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGVycm9yczogW251bWJlciwgQWRhcHRlckVycm9yXVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRdID0gcmVzdWx0c1tpXSE7XG5cbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFtpLCBlcnJvcl0pO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3IucXVlcnkpIHtcbiAgICAgICAgICAgICAgcXVlcnkgPSAhcXVlcnkgPyBlcnJvci5xdWVyeSA6IGpvaW5TZXF1ZW5jZShbcXVlcnksIGVycm9yLnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc2VydGVkUm93cy5wdXNoKHJlc3VsdC5yb3cpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgIHF1ZXJ5ID0gIXF1ZXJ5ID8gcmVzdWx0LnF1ZXJ5IDogam9pblNlcXVlbmNlKFtxdWVyeSwgcmVzdWx0LnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgICBlcnJvcnMubWFwKChbLCBlcnJvcl0pID0+IGVycm9yKSxcbiAgICAgICAgICAgICAgYFJvdyR7ZXJyb3JzLmxlbmd0aCA+IDEgPyBcInNcIiA6IFwiXCJ9ICR7ZXJyb3JzLm1hcCgoW2luZGV4XSkgPT4gaW5kZXgpLmpvaW4oXCIsIFwiKX0gY291bGQgbm90IGJlIGluc2VydGVkIG9yIHJlZmV0Y2hlZC5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93czogaW5zZXJ0ZWRSb3dzLCBxdWVyeTogcXVlcnkhIH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaW50cm9zcGVjdChvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhYmxlc1F1ZXJ5ID0gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzKTtcbiAgICAgICAgY29uc3QgdGltZXpvbmVRdWVyeSA9IGdldFRpbWV6b25lUXVlcnkocmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbW3RhYmxlc0Vycm9yLCB0YWJsZXNdLCBbdGltZXpvbmVFcnJvciwgdGltZXpvbmVzXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YWJsZXNRdWVyeSwgb3B0aW9ucyksXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0aW1lem9uZVF1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHRhYmxlc0Vycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiB0YWJsZXNFcnJvciwgcXVlcnk6IHRhYmxlc1F1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWV6b25lRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRpbWV6b25lRXJyb3IsIHF1ZXJ5OiB0aW1lem9uZVF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZXpvbmUgPSB0aW1lem9uZXNbMF0/LnRpbWV6b25lO1xuXG4gICAgICAgIGlmICghdGltZXpvbmUpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IG5ldyBFcnJvcihcIlRpbWV6b25lIG5vdCBmb3VuZFwiKSwgcXVlcnk6IHRpbWV6b25lUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeTogdGFibGVzUXVlcnksIHRhYmxlcywgdGltZXpvbmUgfSldO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcXVlcnkoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgZmlsdGVyZWRSb3dDb3VudDogcmVzdWx0c1swXT8uX19wc19jb3VudF9fIHx8IFwiMFwiLCByb3dzOiByZXN1bHRzLCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBwcm9wZXJseVxuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGUoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclVwZGF0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5ID0gZ2V0VXBkYXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRVcGRhdGVSZWZldGNoUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtbdXBkYXRlRXJyb3JdLCByZWZldGNoUmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGVTZXF1ZW5jZShbdXBkYXRlUXVlcnksIHJlZmV0Y2hRdWVyeV0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh1cGRhdGVFcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogdXBkYXRlRXJyb3IsIHF1ZXJ5OiB1cGRhdGVRdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtyZWZldGNoRXJyb3IsIHJlc3VsdHNdID0gcmVmZXRjaFJlc3VsdCE7XG5cbiAgICAgICAgaWYgKHJlZmV0Y2hFcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogcmVmZXRjaEVycm9yLCBxdWVyeTogdXBkYXRlUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IG5ldyBFcnJvcihcIlVwZGF0ZWQgcm93IG5vdCBmb3VuZFwiKSwgcXVlcnk6IHVwZGF0ZVF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvdywgcXVlcnk6IHVwZGF0ZVF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRyb3NwZWN0aW9uKGFyZ3M6IHtcbiAgcXVlcnk6IFF1ZXJ5O1xuICB0YWJsZXM6IFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59KTogQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBjb25zdCB7IHF1ZXJ5LCB0YWJsZXMsIHRpbWV6b25lIH0gPSBhcmdzO1xuXG4gIHJldHVybiB0YWJsZXMucmVkdWNlKFxuICAgIChyZXN1bHQsIHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYXMgfSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSA9IHRhYmxlO1xuXG4gICAgICBjb25zdCBjb2x1bW5zUmVjb3JkID0gY29sdW1uc1xuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5wb3NpdGlvbiAtIGIucG9zaXRpb24pXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhdHlwZSwgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgICAgICAgICBjb25zdCBpbmRleE9mUGFyZW50aGVzaXMgPSBkYXRhdHlwZS5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmlwcGVkRGF0YVR5cGUgPSAoaW5kZXhPZlBhcmVudGhlc2lzID4gLTEgPyBkYXRhdHlwZS5zdWJzdHJpbmcoMCwgaW5kZXhPZlBhcmVudGhlc2lzKSA6IGRhdGF0eXBlKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgICBbY29sdW1uTmFtZV06IHtcbiAgICAgICAgICAgICAgICBkYXRhdHlwZToge1xuICAgICAgICAgICAgICAgICAgLi4uKE1ZU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEFbc3RyaXBwZWREYXRhVHlwZV0gfHwgeyBncm91cDogXCJyYXdcIiB9KSxcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNOYXRpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBzdHJpcHBlZERhdGFUeXBlLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWREYXRhVHlwZSA9PT0gXCJlbnVtXCIgPyBkYXRhdHlwZS5zbGljZShgZW51bSgnYC5sZW5ndGgsIC1gJylgLmxlbmd0aCkuc3BsaXQoYCcsJ2ApIDogW10sXG4gICAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBma0NvbHVtbjogY29sdW1uLmZrX2NvbHVtbixcbiAgICAgICAgICAgICAgICBma1NjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgIGZrVGFibGU6IGNvbHVtbi5ma190YWJsZSxcbiAgICAgICAgICAgICAgICBpc0F1dG9pbmNyZW1lbnQ6IEJvb2xlYW4oY29sdW1uLmF1dG9pbmNyZW1lbnQpLFxuICAgICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IEJvb2xlYW4oY29sdW1uLmNvbXB1dGVkKSxcbiAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiBCb29sZWFuKGNvbHVtbi5udWxsYWJsZSksXG4gICAgICAgICAgICAgICAgcGtQb3NpdGlvbjogY29sdW1uLnBrLFxuICAgICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICB9IGFzIGNvbnN0IHNhdGlzZmllcyBDb2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgVGFibGVbXCJjb2x1bW5zXCJdLFxuICAgICAgICApO1xuXG4gICAgICBpZiAoc2NoZW1hc1tzY2hlbWFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NoZW1hc1tzY2hlbWFdID0geyBuYW1lOiBzY2hlbWEsIHRhYmxlczoge30gfTtcbiAgICAgIH1cblxuICAgICAgc2NoZW1hc1tzY2hlbWFdLnRhYmxlc1t0YWJsZU5hbWVdID0geyBjb2x1bW5zOiBjb2x1bW5zUmVjb3JkLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgeyBmaWx0ZXJPcGVyYXRvcnMsIHF1ZXJ5LCBzY2hlbWFzOiB7fSwgdGltZXpvbmUgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQgYXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gICk7XG59XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuXSBzYXRpc2ZpZXMgRmlsdGVyT3BlcmF0b3JbXTtcblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tJbnRyb3NwZWN0KCkge1xuICBjb25zdCB0YWJsZXMgPSBtb2NrVGFibGVzUXVlcnkoKTtcbiAgY29uc3QgW3sgdGltZXpvbmUgfV0gPSBtb2NrVGltZXpvbmVRdWVyeSgpO1xuICBjb25zdCBxdWVyeSA9IHsgcGFyYW1ldGVyczogW10sIHNxbDogXCI8bW9ja2VkPlwiIH0gYXMgUXVlcnk7XG5cbiAgcmV0dXJuIGNyZWF0ZUludHJvc3BlY3Rpb24oeyB0YWJsZXMsIHRpbWV6b25lLCBxdWVyeSB9KSBhcyB7XG4gICAgLy8gYmVzdCBlZmZvcnQsIG5vIG5lZWQgZ28gb3ZlcmJvYXJkLlxuICAgIHNjaGVtYXM6IHtcbiAgICAgIFtLIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wic2NoZW1hXCJdXToge1xuICAgICAgICBuYW1lOiBLO1xuICAgICAgICB0YWJsZXM6IHtcbiAgICAgICAgICBbVCBpbiAodHlwZW9mIHRhYmxlcylbbnVtYmVyXVtcIm5hbWVcIl1dOiBUYWJsZTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aW1lem9uZTogdHlwZW9mIHRpbWV6b25lO1xuICAgIGZpbHRlck9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXTtcbiAgICBxdWVyeTogUXVlcnk7XG4gIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0O1xufVxuXG5mdW5jdGlvbiBqb2luU2VxdWVuY2Uoc2VxdWVuY2U6IHJlYWRvbmx5IFtRdWVyeTx1bmtub3duPiwgUXVlcnk8dW5rbm93bj5dKTogUXVlcnk8dW5rbm93bj4ge1xuICBjb25zdCBbcXVlcnkwLCBxdWVyeTFdID0gc2VxdWVuY2U7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJhbWV0ZXJzOiBxdWVyeTAucGFyYW1ldGVycy5jb25jYXQocXVlcnkxLnBhcmFtZXRlcnMpLFxuICAgIHNxbDogYCR7cXVlcnkwLnNxbH07XFxuJHtxdWVyeTEuc3FsfWAsXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEYXRhVHlwZSB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5cbmV4cG9ydCBjb25zdCBNWVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBOiBSZWNvcmQ8c3RyaW5nLCBQaWNrPERhdGFUeXBlLCBcImdyb3VwXCI+PiA9IHtcbiAgYmlnaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBiaW5hcnk6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgYml0OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIGJsb2I6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgY2hhcjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBcImNoYXIgYmluYXJ5XCI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgZGF0ZToge1xuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIGRhdGV0aW1lOiB7XG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgZGVjOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkZWNpbWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkb3VibGU6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIFwiZG91YmxlIHByZWNpc2lvblwiOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBlbnVtOiB7XG4gICAgZ3JvdXA6IFwiZW51bVwiLFxuICB9LFxuICBmaXhlZDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZmxvYXQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGdlb21ldHJ5OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIGdlb21ldHJ5Y29sbGVjdGlvbjoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBpbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGludGVnZXI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGpzb246IHtcbiAgICBncm91cDogXCJqc29uXCIsXG4gIH0sXG4gIGxpbmVzdHJpbmc6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgbG9uZzoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBcImxvbmcgdmFyY2hhclwiOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmdibG9iOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmd0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmd2YXJiaW5hcnk6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbG9uZ3ZhcmNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbWVkaXVtYmxvYjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBtZWRpdW1pbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIG1lZGl1bXRleHQ6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbXVsdGlsaW5lc3RyaW5nOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIG11bHRpcG9pbnQ6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgbXVsdGlwb2x5Z29uOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIG51bWVyaWM6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIHBvaW50OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHBvbHlnb246IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgcmVhbDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgLyoqXG4gICAqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzkuNS9lbi9zZXQuaHRtbFxuICAgKi9cbiAgc2V0OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHNtYWxsaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICB0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHRpbWU6IHtcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIHRpbWVzdGFtcDoge1xuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIHRpbnlibG9iOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHRpbnlpbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIHRpbnl0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHZhcmJpbmFyeToge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB2YXJjaGFyOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIFwidmFyY2hhciBiaW5hcnlcIjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICAvKipcbiAgICogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOS41L2VuL3ZlY3Rvci5odG1sXG4gICAqL1xuICB2ZWN0b3I6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgeWVhcjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbn07XG4iLCAiaW1wb3J0IHsgdHlwZSBJbmZlclJlc3VsdCwgdHlwZSBTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uLCBzcWwgfSBmcm9tIFwia3lzZWx5XCI7XG5pbXBvcnQgdHlwZSB7IE9rUGFja2V0UGFyYW1zIH0gZnJvbSBcIm15c3FsMlwiO1xuXG5pbXBvcnQgdHlwZSB7IEFkYXB0ZXJEZWxldGVEZXRhaWxzLCBBZGFwdGVyUXVlcnlEZXRhaWxzLCBBZGFwdGVyVXBkYXRlRGV0YWlscywgVGFibGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMsXG4gIGFwcGx5VHJhbnNmb3JtYXRpb25zLFxuICB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsXG4gIGNvbXBpbGUsXG4gIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24sXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJEZWxldGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICByb3dzLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICByZXR1cm4gY29tcGlsZShidWlsZGVyLmRlbGV0ZUZyb20odGFibGVOYW1lKS4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSkuJGNhc3RUbzxPa1BhY2tldFBhcmFtcz4oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRRdWVyeShcbiAgZGV0YWlsczogeyByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyB0YWJsZTogVGFibGUgfSxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgcm93cyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLmluc2VydEludG8odGFibGVOYW1lKVxuICAgICAgLnZhbHVlcyhhcHBseVRyYW5zZm9ybWF0aW9ucyhcImluc2VydFwiLCByb3dzLCBjb2x1bW5zKSlcbiAgICAgIC4kY2FzdFRvPE9rUGFja2V0UGFyYW1zPigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiB7IGNyaXRlcmlhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyB0YWJsZTogVGFibGUgfSxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY3JpdGVyaWEsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhjcml0ZXJpYSwgY29sdW1ucykpXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX2luc2VydGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhbeyAuLi5yb3csIC4uLmNoYW5nZXMgfV0sIGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5zZWxlY3QoZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpLmFzKFwiX19wc191cGRhdGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0UXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJRdWVyeURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIGZpbHRlciA9IHsgYWZ0ZXI6IFwiYW5kXCIsIGZpbHRlcnM6IFtdLCBraW5kOiBcIkZpbHRlckdyb3VwXCIgfSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBmaWx0ZXJFeHByZXNzaW9uID0gZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbihmaWx0ZXIuZmlsdGVycywgY29sdW1ucyk7XG5cbiAgY29uc3QgQUdHX05BTUUgPSBcIl9fcHNfYWdnX19cIjtcbiAgY29uc3QgQ09VTlRfUkVGID0gXCJfX3BzX2NvdW50X19cIjtcblxuICBjb25zdCBjb3VudFF1ZXJ5ID0gYnVpbGRlclxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoZmlsdGVyRXhwcmVzc2lvbilcbiAgICAuc2VsZWN0KChlYikgPT4gZWIuY2FzdDxCaWdJbnRTdHJpbmc+KGViLmZuLmNvYWxlc2NlKGViLmZuLmNvdW50QWxsKCksIHNxbC5saXQoMCkpLCBcImNoYXJcIikuYXMoQ09VTlRfUkVGKSk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoQUdHX05BTUUsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAuaW5uZXJKb2luKEFHR19OQU1FLCAoamIpID0+IGpiLm9uVHJ1ZSgpKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoZmlsdGVyRXhwcmVzc2lvbilcbiAgICAgIC5zZWxlY3QoXG4gICAgICAgIGAke0FHR19OQU1FfS4ke0NPVU5UX1JFRn1gIHNhdGlzZmllcyBTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uPFxuICAgICAgICAgIHsgW0FHR19OQU1FXTogSW5mZXJSZXN1bHQ8dHlwZW9mIGNvdW50UXVlcnk+W251bWJlcl0gfSxcbiAgICAgICAgICB0eXBlb2YgQUdHX05BTUVcbiAgICAgICAgPixcbiAgICAgIClcbiAgICAgIC5zZWxlY3QoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAuJGNhbGwoKHFiKSA9PiBzb3J0T3JkZXIucmVkdWNlKChxYiwgaXRlbSkgPT4gcWIub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pLCBxYikpXG4gICAgICAubGltaXQocGFnZVNpemUpXG4gICAgICAvLyB3ZSdyZSBpbmplY3RpbmcgdGhlIG9mZnNldCB2YWx1ZSBoZXJlIHRvIGF2b2lkIHNlcmlhbGl6YXRpb24gY29tcGxleGl0eSAoYGJpZ2ludGAgaXMgYSBuby1nbyBmb3IgYEpTT04uc3RyaW5naWZ5YCkuXG4gICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrU2VsZWN0UXVlcnkoKSB7XG4gIC8vIFRPRE86IC4uLlxuICByZXR1cm4gW10gYXMgY29uc3Qgc2F0aXNmaWVzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCBubyBuZWVkIHRvIGdvIG92ZXJib2FyZFxuICAgIFtLIGluIFJldHVyblR5cGU8dHlwZW9mIG1vY2tUYWJsZXNRdWVyeT5bMV1bXCJjb2x1bW5zXCJdW251bWJlcl1bXCJuYW1lXCJdIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoYXBwbHlUcmFuc2Zvcm1hdGlvbnMoXCJ1cGRhdGVcIiwgY2hhbmdlcywgY29sdW1ucykpXG4gICAgICAuJGNhbGwoYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMoW3Jvd10sIGNvbHVtbnMpKVxuICAgICAgLiRjYXN0VG88T2tQYWNrZXRQYXJhbXM+KCksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKSB7XG4gIHJldHVybiBzcWw8bnVtYmVyIHwgc3RyaW5nPmBjYXN0KHVuaXhfdGltZXN0YW1wKG5vdygzKSkgKiAxMDAwIGFzIHVuc2lnbmVkKWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBLeXNlbHksIE15c3FsQWRhcHRlciwgTXlzcWxRdWVyeUNvbXBpbGVyIH0gZnJvbSBcImt5c2VseVwiO1xuXG5pbXBvcnQgeyB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsIGdldEJ1aWxkZXIgfSBmcm9tIFwiLi4vcXVlcnlcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRNeVNRTEJ1aWxkZXI8RGF0YWJhc2UgPSBhbnk+KFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKTogS3lzZWx5PERhdGFiYXNlPiB7XG4gIHJldHVybiBnZXRCdWlsZGVyKHsgLi4ucmVxdWlyZW1lbnRzLCBBZGFwdGVyOiBNeXNxbEFkYXB0ZXIsIFF1ZXJ5Q29tcGlsZXI6IE15c3FsUXVlcnlDb21waWxlciB9KTtcbn1cbiIsICJpbXBvcnQgeyBzcWwgfSBmcm9tIFwia3lzZWx5XCI7XG5pbXBvcnQgeyBqc29uQXJyYXlGcm9tIH0gZnJvbSBcImt5c2VseS9oZWxwZXJzL215c3FsXCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgY29tcGlsZSwgdHlwZSBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2Uge1xuICAvKiogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOC40L2VuL2luZm9ybWF0aW9uLXNjaGVtYS1jb2x1bW5zLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1uc1wiOiB7XG4gICAgVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIENPTFVNTl9OQU1FOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgdGFibGUuIE9SRElOQUxfUE9TSVRJT04gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgeW91IG1pZ2h0IHdhbnQgdG8gc2F5IE9SREVSIEJZIE9SRElOQUxfUE9TSVRJT04uIFVubGlrZSBTSE9XIENPTFVNTlMsIFNFTEVDVCBmcm9tIHRoZSBDT0xVTU5TIHRhYmxlIGRvZXMgbm90IGhhdmUgYXV0b21hdGljIG9yZGVyaW5nLiAqL1xuICAgIE9SRElOQUxfUE9TSVRJT046IG51bWJlcjtcbiAgICAvKiogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4uIFRoaXMgaXMgTlVMTCBpZiB0aGUgY29sdW1uIGhhcyBhbiBleHBsaWNpdCBkZWZhdWx0IG9mIE5VTEwsIG9yIGlmIHRoZSBjb2x1bW4gZGVmaW5pdGlvbiBpbmNsdWRlcyBubyBERUZBVUxUIGNsYXVzZS4gKi9cbiAgICBDT0xVTU5fREVGQVVMVDogdW5rbm93bjtcbiAgICBJU19OVUxMQUJMRTogXCJZRVNcIiB8IFwiTk9cIjtcbiAgICAvKiogQ29udGFpbnMgdGhlIHR5cGUgbmFtZSBhbmQgcG9zc2libHkgb3RoZXIgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcHJlY2lzaW9uIG9yIGxlbmd0aC4gKi9cbiAgICBDT0xVTU5fVFlQRTogc3RyaW5nO1xuICAgIC8qKiBlbXB0eSAtIG5vdCBpbmRleGVkIG9yIGlzIHNlY29uZGFyeSBjb2x1bW4gaW4gYSBtdWx0aS1jb2x1bW4gbm9udW5pcXVlIGluZGV4LiBQUkkgLSBwYXJ0IG9mIGEgcHJpbWFyeSBrZXkuIFVOSSAtIGZpcnN0IGNvbHVtbiBvZiBhIHVuaXF1ZSBpbmRleC4gTVVMIC0gZmlyc3QgY29sdW1uIG9mIGEgbm9udW5pcXVlIGluZGV4ICovXG4gICAgQ09MVU1OX0tFWTogXCJcIiB8IFwiUFJJXCIgfCBcIlVOSVwiIHwgXCJNVUxcIjtcbiAgICAvKiogRXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbHVtbi4gUG9zc2libGUgdmFsdWVzIGFyZSAqL1xuICAgIEVYVFJBOlxuICAgICAgfCBcIlwiXG4gICAgICB8IFwiYXV0b19pbmNyZW1lbnRcIlxuICAgICAgfCBcIm9uIHVwZGF0ZSBDVVJSRU5UX1RJTUVTVEFNUFwiXG4gICAgICB8IFwiU1RPUkVEIEdFTkVSQVRFRFwiXG4gICAgICB8IFwiVklSVFVBTCBHRU5FUkFURURcIlxuICAgICAgfCBcIkRFRkFVTFQgR0VORVJBVEVEXCI7XG4gICAgLyoqIEZvciBnZW5lcmF0ZWQgY29sdW1ucywgZGlzcGxheXMgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBjb21wdXRlIGNvbHVtbiB2YWx1ZXMuIEVtcHR5IGZvciBub25nZW5lcmF0ZWQgY29sdW1ucy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGdlbmVyYXRlZCBjb2x1bW5zLCBzZWUgU2VjdGlvbiAxNS4xLjIwLjgsIFx1MjAxQ0NSRUFURSBUQUJMRSBhbmQgR2VuZXJhdGVkIENvbHVtbnNcdTIwMUQuICovXG4gICAgR0VORVJBVElPTl9FWFBSRVNTSU9OOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEtdGFibGVzLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzXCI6IHtcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSAoZGF0YWJhc2UpIHRvIHdoaWNoIHRoZSB0YWJsZSBiZWxvbmdzLiAqL1xuICAgIFRBQkxFX1NDSEVNQTogc3RyaW5nO1xuICAgIFRBQkxFX05BTUU6IHN0cmluZztcbiAgICAvKiogQkFTRSBUQUJMRSBmb3IgYSB0YWJsZSwgVklFVyBmb3IgYSB2aWV3LCBvciBTWVNURU0gVklFVyBmb3IgYW4gSU5GT1JNQVRJT05fU0NIRU1BIHRhYmxlLiAqL1xuICAgIFRBQkxFX1RZUEU6IFwiQkFTRSBUQUJMRVwiIHwgXCJWSUVXXCIgfCBcIlNZU1RFTSBWSUVXXCI7XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEta2V5LWNvbHVtbi11c2FnZS10YWJsZS5odG1sICovXG4gIFwiaW5mb3JtYXRpb25fc2NoZW1hLktFWV9DT0xVTU5fVVNBR0VcIjoge1xuICAgIENPTlNUUkFJTlRfU0NIRU1BOiBzdHJpbmc7XG4gICAgQ09OU1RSQUlOVF9OQU1FOiBzdHJpbmc7XG4gICAgVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIENPTFVNTl9OQU1FOiBzdHJpbmc7XG4gICAgT1JESU5BTF9QT1NJVElPTjogbnVtYmVyO1xuICAgIC8qKiBudWxsIC0gd2hlbiB1bmlxdWUgb3IgcHJpbWFyeSBrZXkgY29uc3RyYWludC4gMS1uIC0gd2hlbiBmb3JlaWduIGtleSBjb25zdHJhaW50ICovXG4gICAgUE9TSVRJT05fSU5fVU5JUVVFX0NPTlNUUkFJTlQ6IG51bWJlciB8IG51bGw7XG4gICAgUkVGRVJFTkNFRF9UQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICBSRUZFUkVOQ0VEX1RBQkxFX05BTUU6IHN0cmluZztcbiAgICBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEtdGFibGUtY29uc3RyYWludHMtdGFibGUuaHRtbCAqL1xuICBcImluZm9ybWF0aW9uX3NjaGVtYS5UQUJMRV9DT05TVFJBSU5UU1wiOiB7XG4gICAgQ09OU1RSQUlOVF9TQ0hFTUE6IHN0cmluZztcbiAgICBDT05TVFJBSU5UX05BTUU6IHN0cmluZztcbiAgICBUQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICBUQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgQ09OU1RSQUlOVF9UWVBFOiBcIlBSSU1BUlkgS0VZXCIgfCBcIkZPUkVJR04gS0VZXCIgfCBcIlVOSVFVRVwiIHwgXCJDSEVDS1wiO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPikge1xuICByZXR1cm4gY29tcGlsZShcbiAgICBnZXRNeVNRTEJ1aWxkZXI8RGF0YWJhc2U+KHJlcXVpcmVtZW50cylcbiAgICAgIC5zZWxlY3RGcm9tKFwiaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBhcyB0XCIpXG4gICAgICAud2hlcmUoXCJ0LlRBQkxFX1NDSEVNQVwiLCBcIj1cIiwgc3FsPHN0cmluZz5gZGF0YWJhc2UoKWApXG4gICAgICAud2hlcmUoXCJ0LlRBQkxFX1RZUEVcIiwgXCJpblwiLCBbXCJCQVNFIFRBQkxFXCIsIFwiVklFV1wiXSlcbiAgICAgIC5zZWxlY3QoW1widC5UQUJMRV9TQ0hFTUEgYXMgc2NoZW1hXCIsIFwidC5UQUJMRV9OQU1FIGFzIG5hbWVcIiwgXCJ0LlRBQkxFX1RZUEUgYXMgdHlwZVwiXSlcbiAgICAgIC4kbmFycm93VHlwZTx7IHR5cGU6IFwiQkFTRSBUQUJMRVwiIHwgXCJWSUVXXCIgfT4oKVxuICAgICAgLnNlbGVjdCgoZWIpID0+XG4gICAgICAgIC8vIGBqc29uX2FycmF5YWdnYCBpZ25vcmVzIGBvcmRlciBieWAgaW5zaWRlIHRoZSBzdWJxdWVyeSwgc28gd2UgbmVlZCB0byBvcmRlciBhZnRlciBhZ2dyZWdhdGlvbi5cbiAgICAgICAganNvbkFycmF5RnJvbShcbiAgICAgICAgICBlYlxuICAgICAgICAgICAgLnNlbGVjdEZyb20oXCJpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBhcyBjXCIpXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJpbmZvcm1hdGlvbl9zY2hlbWEuS0VZX0NPTFVNTl9VU0FHRSBhcyBrY3VcIiwgKGpiKSA9PlxuICAgICAgICAgICAgICBqYlxuICAgICAgICAgICAgICAgIC5vblJlZihcImtjdS5UQUJMRV9TQ0hFTUFcIiwgXCI9XCIsIFwiYy5UQUJMRV9TQ0hFTUFcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJrY3UuVEFCTEVfTkFNRVwiLCBcIj1cIiwgXCJjLlRBQkxFX05BTUVcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJrY3UuQ09MVU1OX05BTUVcIiwgXCI9XCIsIFwiYy5DT0xVTU5fTkFNRVwiKVxuICAgICAgICAgICAgICAgIC8vIG9ubHkgZ2V0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgLm9uKFwia2N1LlBPU0lUSU9OX0lOX1VOSVFVRV9DT05TVFJBSU5UXCIsIFwiaXMgbm90XCIsIG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwiaW5mb3JtYXRpb25fc2NoZW1hLktFWV9DT0xVTU5fVVNBR0UgYXMgcGtfa2N1XCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJwa19rY3UuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBcImMuVEFCTEVfU0NIRU1BXCIpXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwicGtfa2N1LlRBQkxFX05BTUVcIiwgXCI9XCIsIFwiYy5UQUJMRV9OQU1FXCIpXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwicGtfa2N1LkNPTFVNTl9OQU1FXCIsIFwiPVwiLCBcImMuQ09MVU1OX05BTUVcIilcbiAgICAgICAgICAgICAgICAvLyBvbmx5IGdldCBwcmltYXJ5IGtleSBjb25zdHJhaW50IC0gZ3VhcmFudGVlZCB0byBiZSBcIlBSSU1BUllcIiBldmVuIGlmIGEgbmFtZSB3YXMgZ2l2ZW4gZHVyaW5nIGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgLm9uKFwicGtfa2N1LkNPTlNUUkFJTlRfTkFNRVwiLCBcIj1cIiwgXCJQUklNQVJZXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLndoZXJlUmVmKFwiYy5UQUJMRV9TQ0hFTUFcIiwgXCI9XCIsIFwidC5UQUJMRV9TQ0hFTUFcIilcbiAgICAgICAgICAgIC53aGVyZVJlZihcImMuVEFCTEVfTkFNRVwiLCBcIj1cIiwgXCJ0LlRBQkxFX05BTUVcIilcbiAgICAgICAgICAgIC5zZWxlY3QoW1xuICAgICAgICAgICAgICBcImMuQ09MVU1OX05BTUUgYXMgbmFtZVwiLFxuICAgICAgICAgICAgICBcImMuQ09MVU1OX1RZUEUgYXMgZGF0YXR5cGVcIixcbiAgICAgICAgICAgICAgXCJjLk9SRElOQUxfUE9TSVRJT04gYXMgcG9zaXRpb25cIixcbiAgICAgICAgICAgICAgXCJrY3UuUkVGRVJFTkNFRF9UQUJMRV9OQU1FIGFzIGZrX3RhYmxlXCIsXG4gICAgICAgICAgICAgIFwia2N1LlJFRkVSRU5DRURfQ09MVU1OX05BTUUgYXMgZmtfY29sdW1uXCIsXG4gICAgICAgICAgICAgIFwicGtfa2N1Lk9SRElOQUxfUE9TSVRJT04gYXMgcGtcIixcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAgICAgICAgICBlYihcImMuRVhUUkFcIiwgXCI9XCIsIFwiYXV0b19pbmNyZW1lbnRcIikuYXMoXCJhdXRvaW5jcmVtZW50XCIpLFxuICAgICAgICAgICAgICBlYihcImMuRVhUUkFcIiwgXCJpblwiLCBbXCJvbiB1cGRhdGUgQ1VSUkVOVF9USU1FU1RBTVBcIiwgXCJTVE9SRUQgR0VORVJBVEVEXCIsIFwiVklSVFVBTCBHRU5FUkFURURcIl0pLmFzKFxuICAgICAgICAgICAgICAgIFwiY29tcHV0ZWRcIixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZWIoXCJjLklTX05VTExBQkxFXCIsIFwiPVwiLCBcIllFU1wiKS5hcyhcIm51bGxhYmxlXCIpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICkuYXMoXCJjb2x1bW5zXCIpLFxuICAgICAgKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX1NDSEVNQVwiKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX05BTUVcIilcbiAgICAgIC5vcmRlckJ5KFwidC5UQUJMRV9UWVBFXCIpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RhYmxlc1F1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDEsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiaW50XCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBwb3NpdGlvbjogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiYmluYXJ5KDE2KVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcInV1aWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhcigyNTUpXCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiAzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luY3JlbWVudDogMCxcbiAgICAgICAgICBjb21wdXRlZDogMSxcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRfbmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiA0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG5hbWU6IFwiYW5pbWFsc1wiLFxuICAgICAgc2NoZW1hOiBcInN0dWRpb1wiLFxuICAgICAgdHlwZTogXCJCQVNFIFRBQkxFXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgcG9zaXRpb246IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiZW51bSgnYWRtaW4nLCdtYWludGFpbmVyJywnbWVtYmVyJylcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJyb2xlXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IDMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogXCJpZFwiLFxuICAgICAgICAgIGZrX3RhYmxlOiBcImFuaW1hbHNcIixcbiAgICAgICAgICBuYW1lOiBcImFuaW1hbF9pZFwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiA0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgIHNjaGVtYTogXCJzdHVkaW9cIixcbiAgICAgIHR5cGU6IFwiQkFTRSBUQUJMRVwiLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZVF1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcihyZXF1aXJlbWVudHMpO1xuXG4gIGNvbnN0IHNlc3Npb25UeiA9IHNxbDxcIlNZU1RFTVwiIHwgKHN0cmluZyAmIHt9KT5gQEBzZXNzaW9uLnRpbWVfem9uZWA7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLnNlbGVjdE5vRnJvbShcbiAgICAgICAgYnVpbGRlclxuICAgICAgICAgIC5jYXNlKClcbiAgICAgICAgICAud2hlbihzZXNzaW9uVHosIFwiPVwiLCBcIlNZU1RFTVwiKVxuICAgICAgICAgIC50aGVuKHNxbDxzdHJpbmc+YEBAc3lzdGVtX3RpbWVfem9uZWApXG4gICAgICAgICAgLmVsc2Uoc2Vzc2lvblR6KVxuICAgICAgICAgIC5lbmQoKVxuICAgICAgICAgIC5hcyhcInRpbWV6b25lXCIpLFxuICAgICAgKVxuICAgICAgLiRuYXJyb3dUeXBlPHsgdGltZXpvbmU6IHN0cmluZyB9PigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RpbWV6b25lUXVlcnkoKSB7XG4gIHJldHVybiBbeyB0aW1lem9uZTogXCJVVENcIiB9XSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8dHlwZW9mIGdldFRpbWV6b25lUXVlcnk+O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9teXNxbC5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG5pbXBvcnQgeyBnZXRKc29uT2JqZWN0QXJncyB9IGZyb20gJy4uL3V0aWwvanNvbi1vYmplY3QtYXJncy5qcyc7XG4vKipcbiAqIEEgTXlTUUwgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IGludG8gYSBKU09OIGFycmF5LlxuICpcbiAqIE5PVEU6IFRoaXMgaGVscGVyIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBmdWxseSB3b3JrIHdpdGggdGhlIGJ1aWx0LWluIGBNeXNxbERpYWxlY3RgLlxuICogV2hpbGUgdGhlIHByb2R1Y2VkIFNRTCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIE15U1FMIGRhdGFiYXNlcywgc29tZSB0aGlyZC1wYXJ0eSBkaWFsZWN0c1xuICogbWF5IG5vdCBwYXJzZSB0aGUgbmVzdGVkIEpTT04gaW50byBhcnJheXMuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpblxuICogYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uQXJyYXlGcm9tIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvbXlzcWwnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQXJyYXlGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAub3JkZXJCeSgncGV0Lm5hbWUnKVxuICogICAgICkuYXMoJ3BldHMnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdPy5pZFxuICogcmVzdWx0WzBdPy5wZXRzWzBdPy5wZXRfaWRcbiAqIHJlc3VsdFswXT8ucGV0c1swXT8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBgaWRgLCAoXG4gKiAgIHNlbGVjdCBjYXN0KGNvYWxlc2NlKGpzb25fYXJyYXlhZ2coanNvbl9vYmplY3QoXG4gKiAgICAgJ3BldF9pZCcsIGBhZ2dgLmBwZXRfaWRgLFxuICogICAgICduYW1lJywgYGFnZ2AuYG5hbWVgXG4gKiAgICkpLCAnW10nKSBhcyBqc29uKSBmcm9tIChcbiAqICAgICBzZWxlY3QgYHBldGAuYGlkYCBhcyBgcGV0X2lkYCwgYHBldGAuYG5hbWVgXG4gKiAgICAgZnJvbSBgcGV0YFxuICogICAgIHdoZXJlIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gKiAgICAgb3JkZXIgYnkgYHBldGAuYG5hbWVgXG4gKiAgICkgYXMgYGFnZ2BcbiAqICkgYXMgYHBldHNgXG4gKiBmcm9tIGBwZXJzb25gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25BcnJheUZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QgY2FzdChjb2FsZXNjZShqc29uX2FycmF5YWdnKGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0TXlzcWxKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnYWdnJykpfSkpLCAnW10nKSBhcyBqc29uKSBmcm9tICR7ZXhwcn0gYXMgYWdnKWA7XG59XG4vKipcbiAqIEEgTXlTUUwgaGVscGVyIGZvciB0dXJuaW5nIGEgc3VicXVlcnkgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIFRoZSBzdWJxdWVyeSBtdXN0IG9ubHkgcmV0dXJuIG9uZSByb3cuXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYE15c3FsRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgTXlTUUwgZGF0YWJhc2VzLCBzb21lIHRoaXJkLXBhcnR5IGRpYWxlY3RzXG4gKiBtYXkgbm90IHBhcnNlIHRoZSBuZXN0ZWQgSlNPTiBpbnRvIG9iamVjdHMuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpblxuICogYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uT2JqZWN0RnJvbSB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL215c3FsJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbk9iamVjdEZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC53aGVyZSgncGV0LmlzX2Zhdm9yaXRlJywgJz0nLCB0cnVlKVxuICogICAgICkuYXMoJ2Zhdm9yaXRlX3BldCcpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ucGV0X2lkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBgaWRgLCAoXG4gKiAgIHNlbGVjdCBqc29uX29iamVjdChcbiAqICAgICAncGV0X2lkJywgYG9iamAuYHBldF9pZGAsXG4gKiAgICAgJ25hbWUnLCBgb2JqYC5gbmFtZWBcbiAqICAgKSBmcm9tIChcbiAqICAgICBzZWxlY3QgYHBldGAuYGlkYCBhcyBgcGV0X2lkYCwgYHBldGAuYG5hbWVgXG4gKiAgICAgZnJvbSBgcGV0YFxuICogICAgIHdoZXJlIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gKiAgICAgYW5kIGBwZXRgLmBpc19mYXZvcml0ZWAgPSA/XG4gKiAgICkgYXMgb2JqXG4gKiApIGFzIGBmYXZvcml0ZV9wZXRgXG4gKiBmcm9tIGBwZXJzb25gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25PYmplY3RGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0TXlzcWxKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnb2JqJykpfSkgZnJvbSAke2V4cHJ9IGFzIG9iailgO1xufVxuLyoqXG4gKiBUaGUgTXlTUUwgYGpzb25fb2JqZWN0YCBmdW5jdGlvbi5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZnVsbHkgd29yayB3aXRoIHRoZSBidWlsdC1pbiBgTXlzcWxEaWFsZWN0YC5cbiAqIFdoaWxlIHRoZSBwcm9kdWNlZCBTUUwgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBNeVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBlYi5mbignY29uY2F0JywgWydmaXJzdF9uYW1lJywgZWIudmFsKCcgJyksICdsYXN0X25hbWUnXSlcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIGpzb25fb2JqZWN0KFxuICogICAnZmlyc3QnLCBmaXJzdF9uYW1lLFxuICogICAnbGFzdCcsIGxhc3RfbmFtZSxcbiAqICAgJ2Z1bGwnLCBjb25jYXQoYGZpcnN0X25hbWVgLCA/LCBgbGFzdF9uYW1lYClcbiAqICkgYXMgXCJuYW1lXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQnVpbGRPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHNxbCBganNvbl9vYmplY3QoJHtzcWwuam9pbihPYmplY3Qua2V5cyhvYmopLmZsYXRNYXAoKGspID0+IFtzcWwubGl0KGspLCBvYmpba11dKSl9KWA7XG59XG5mdW5jdGlvbiBnZXRNeXNxbEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ015U1FMIGpzb25BcnJheUZyb20gYW5kIGpzb25PYmplY3RGcm9tIGZ1bmN0aW9ucyBjYW4gb25seSBoYW5kbGUgZXhwbGljaXQgc2VsZWN0aW9ucyBkdWUgdG8gbGltaXRhdGlvbnMgb2YgdGhlIGpzb25fb2JqZWN0IGZ1bmN0aW9uLiBzZWxlY3RBbGwoKSBpcyBub3QgYWxsb3dlZCBpbiB0aGUgc3VicXVlcnkuJyk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7cVJBQUFBLElDQUFDLElDQUFDLElBRU8sSUFBTUMsRUFBd0UsQ0FDbkYsT0FBUSxDQUNOLE1BQU8sU0FDVCxFQUNBLE9BQVEsQ0FDTixNQUFPLFFBQ1QsRUFDQSxJQUFLLENBQ0gsTUFBTyxLQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sUUFDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFDQSxjQUFlLENBQ2IsTUFBTyxRQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sVUFDVCxFQUNBLFNBQVUsQ0FDUixNQUFPLFVBQ1QsRUFDQSxJQUFLLENBQ0gsTUFBTyxTQUNULEVBQ0EsUUFBUyxDQUNQLE1BQU8sU0FDVCxFQUNBLE9BQVEsQ0FDTixNQUFPLFNBQ1QsRUFDQSxtQkFBb0IsQ0FDbEIsTUFBTyxTQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sTUFDVCxFQUNBLE1BQU8sQ0FDTCxNQUFPLFNBQ1QsRUFDQSxNQUFPLENBQ0wsTUFBTyxTQUNULEVBQ0EsU0FBVSxDQUNSLE1BQU8sS0FDVCxFQUNBLG1CQUFv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LENBQUMrQyxFQUFRQyxDQUFNLEVBQUloRCxFQUV6QixNQUFPLENBQ0wsV0FBWStDLEVBQU8sV0FBVyxPQUFPQyxFQUFPLFVBQVUsRUFDdEQsSUFBSyxHQUFHRCxFQUFPLEdBQUc7QUFBQSxFQUFNQyxFQUFPLEdBQUcsRUFDcEMsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJNWVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImdldE15U1FMQnVpbGRlciIsICJyZXF1aXJlbWVudHMiLCAiZ2V0QnVpbGRlciIsICJNeXNxbEFkYXB0ZXIiLCAiTXlzcWxRdWVyeUNvbXBpbGVyIiwgImdldERlbGV0ZVF1ZXJ5IiwgImRldGFpbHMiLCAicmVxdWlyZW1lbnRzIiwgInJvd3MiLCAiY29sdW1ucyIsICJ0YWJsZU5hbWUiLCAiYnVpbGRlciIsICJnZXRNeVNRTEJ1aWxkZXIiLCAiY29tcGlsZSIsICJhcHBseUluZmVycmVkUm93RmlsdGVycyIsICJnZXRJbnNlcnRRdWVyeSIsICJhcHBseVRyYW5zZm9ybWF0aW9ucyIsICJnZXRJbnNlcnRSZWZldGNoUXVlcnkiLCAiY3JpdGVyaWEiLCAiZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcyIsICJnZXRVcGRhdGVSZWZldGNoUXVlcnkiLCAiY2hhbmdlcyIsICJyb3ciLCAiZ2V0U2VsZWN0UXVlcnkiLCAiZmlsdGVyIiwgInBhZ2VJbmRleCIsICJwYWdlU2l6ZSIsICJzb3J0T3JkZXIiLCAiZmlsdGVyRXhwcmVzc2lvbiIsICJnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uIiwgIkFHR19OQU1FIiwgIkNPVU5UX1JFRiIsICJjb3VudFF1ZXJ5IiwgImViIiwgInNxbCIsICJqYiIsICJxYiIsICJpdGVtIiwgIm1vY2tTZWxlY3RRdWVyeSIsICJnZXRVcGRhdGVRdWVyeSIsICJzY2hlbWEiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAianNvbkFycmF5RnJvbSIsICJleHByIiwgInNxbCIsICJnZXRNeXNxbEpzb25PYmplY3RBcmdzIiwgImdldE15c3FsSnNvbk9iamVjdEFyZ3MiLCAibm9kZSIsICJ0YWJsZSIsICJnZXRKc29uT2JqZWN0QXJncyIsICJnZXRUYWJsZXNRdWVyeSIsICJyZXF1aXJlbWVudHMiLCAiY29tcGlsZSIsICJnZXRNeVNRTEJ1aWxkZXIiLCAic3FsIiwgImViIiwgImpzb25BcnJheUZyb20iLCAiamIiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgImdldFRpbWV6b25lUXVlcnkiLCAiYnVpbGRlciIsICJzZXNzaW9uVHoiLCAibW9ja1RpbWV6b25lUXVlcnkiLCAiY3JlYXRlTXlTUUxBZGFwdGVyIiwgInJlcXVpcmVtZW50cyIsICJleGVjdXRvciIsICJvdGhlclJlcXVpcmVtZW50cyIsICJkZXRhaWxzIiwgIm9wdGlvbnMiLCAicXVlcnkiLCAiZ2V0RGVsZXRlUXVlcnkiLCAiZXJyb3IiLCAiY3JlYXRlQWRhcHRlckVycm9yIiwgInJvd3MiLCAidGFibGUiLCAiY29sdW1ucyIsICJhdXRvaW5jcmVtZW50Q29sdW1uIiwgImNvbHVtbiIsICJmaWx0ZXJPYmplY3RzIiwgInJvdyIsICJpbmZlckZpbHRlck9iamVjdCIsICJoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cyIsICJmaWx0ZXJPYmplY3QiLCAiZmlsdGVyVmFsdWVzIiwgInZhbHVlIiwgImdldEluc2VydFF1ZXJ5IiwgImluc2VydFF1ZXJ5IiwgInJlZmV0Y2hRdWVyeSIsICJnZXRJbnNlcnRSZWZldGNoUXVlcnkiLCAic2VxdWVuY2UiLCAiaW5zZXJ0RXJyb3IiLCAibWF5YmVSZWZldGNoUmVzdWx0IiwgImpvaW5TZXF1ZW5jZSIsICJyZWZldGNoRXJyb3IiLCAicmVmZXRjaFJlc3VsdHMiLCAicmVzdWx0cyIsICJyZXN1bHQiLCAiYXV0b2luY3JlbWVudENvbHVtbk5hbWUiLCAiYWNjIiwgImNvbHVtbk5hbWUiLCAicmVmZXRjaGVkUm93IiwgImluc2VydGVkUm93cyIsICJlcnJvcnMiLCAiaSIsICJpbmRleCIsICJ0YWJsZXNRdWVyeSIsICJnZXRUYWJsZXNRdWVyeSIsICJ0aW1lem9uZVF1ZXJ5IiwgImdldFRpbWV6b25lUXVlcnkiLCAidGFibGVzRXJyb3IiLCAidGFibGVzIiwgInRpbWV6b25lRXJyb3IiLCAidGltZXpvbmVzIiwgInRpbWV6b25lIiwgImNyZWF0ZUludHJvc3BlY3Rpb24iLCAiZ2V0U2VsZWN0UXVlcnkiLCAidXBkYXRlUXVlcnkiLCAiZ2V0VXBkYXRlUXVlcnkiLCAiZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5IiwgInVwZGF0ZUVycm9yIiwgInJlZmV0Y2hSZXN1bHQiLCAiYXJncyIsICJzY2hlbWFzIiwgInRhYmxlTmFtZSIsICJzY2hlbWEiLCAiY29sdW1uc1JlY29yZCIsICJhIiwgImIiLCAiZGF0YXR5cGUiLCAiaW5kZXhPZlBhcmVudGhlc2lzIiwgInN0cmlwcGVkRGF0YVR5cGUiLCAiTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJmaWx0ZXJPcGVyYXRvcnMiLCAibW9ja0ludHJvc3BlY3QiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgIm1vY2tUaW1lem9uZVF1ZXJ5IiwgInF1ZXJ5MCIsICJxdWVyeTEiXQp9Cg==
9
+ import{a as $}from"../../chunk-HL3RVO3Q.js";import{a as ue}from"../../chunk-ZUEQ555M.js";import{a as i}from"../../chunk-PKLRFKIE.js";import{i as _,n as P,o as j,p as F,r as b,s as M,t as Y,u as B,v as z}from"../../chunk-I2RENVNB.js";import{e as d}from"../../chunk-GDQBQ7MK.js";d();d();d();var G={bigint:{group:"numeric"},binary:{group:"string"},bit:{group:"raw"},blob:{group:"string"},char:{group:"string"},"char binary":{group:"string"},date:{group:"datetime"},datetime:{group:"datetime"},dec:{group:"numeric"},decimal:{group:"numeric"},double:{group:"numeric"},"double precision":{group:"numeric"},enum:{group:"enum"},fixed:{group:"numeric"},float:{group:"numeric"},geometry:{group:"raw"},geometrycollection:{group:"raw"},int:{group:"numeric"},integer:{group:"numeric"},json:{group:"json"},linestring:{group:"raw"},long:{group:"string"},"long varchar":{group:"string"},longblob:{group:"string"},longtext:{group:"string"},longvarbinary:{group:"string"},longvarchar:{group:"string"},mediumblob:{group:"string"},mediumint:{group:"numeric"},mediumtext:{group:"string"},multilinestring:{group:"raw"},multipoint:{group:"raw"},multipolygon:{group:"raw"},numeric:{group:"numeric"},point:{group:"raw"},polygon:{group:"raw"},real:{group:"numeric"},set:{group:"raw"},smallint:{group:"numeric"},text:{group:"string"},time:{group:"time"},timestamp:{group:"datetime"},tinyblob:{group:"string"},tinyint:{group:"numeric"},tinytext:{group:"string"},varbinary:{group:"string"},varchar:{group:"string"},"varchar binary":{group:"string"},vector:{group:"raw"},year:{group:"numeric"}};d();d();function R(o){return F({...o,Adapter:j,QueryCompiler:P})}function H(o,t){let{rows:r,table:{columns:s,name:n}}=o,e=R(t);return b(e.deleteFrom(n).$call(M(r,s)).$castTo())}function L(o,t){let{rows:r,table:{columns:s,name:n}}=o,e=R(t);return b(e.insertInto(n).values(B("insert",r,s)).$castTo())}function I(o,t){let{criteria:r,table:{columns:s,name:n}}=o,e=R(t);return b(e.selectFrom(n).$call(M(r,s)).select(Object.keys(s)).select(J().as("__ps_inserted_at__")))}function v(o,t){let{changes:r,row:s,table:{columns:n,name:e}}=o,u=R(t);return b(u.selectFrom(e).$call(M([{...s,...r}],n)).select(Object.keys(n)).select(J().as("__ps_updated_at__")))}function K(o,t){let{filter:r={after:"and",filters:[],kind:"FilterGroup"},pageIndex:s,pageSize:n,sortOrder:e,table:{columns:u,name:p}}=o,y=R(t),c=z(r.filters,u),f="__ps_agg__",A="__ps_count__",E=y.selectFrom(p).where(c).select(l=>l.cast(l.fn.coalesce(l.fn.countAll(),_.lit(0)),"char").as(A));return b(y.with(f,()=>E).selectFrom(p).innerJoin(f,l=>l.onTrue()).where(c).select(`${f}.${A}`).select(Object.keys(u)).$call(l=>e.reduce((T,a)=>T.orderBy(a.column,a.direction),l)).limit(n).offset(_.lit(BigInt(s)*BigInt(n))))}function fe(){return[]}function V(o,t){let{changes:r,row:s,table:{columns:n,name:e,schema:u}}=o,p=R(t);return b(p.withSchema(u).updateTable(e).set(B("update",r,n)).$call(M([s],n)).$castTo())}function J(){return _`cast(unix_timestamp(now(3)) * 1000 as unsigned)`}d();d();function W(o){return _`(select cast(coalesce(json_arrayagg(json_object(${_.join(oe(o.toOperationNode(),"agg"))})), '[]') as json) from ${o} as agg)`}function oe(o,t){try{return $(o,t)}catch{throw new Error("MySQL jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}function X(o){return b(R(o).selectFrom("information_schema.tables as t").where("t.TABLE_SCHEMA","=",_`database()`).where("t.TABLE_TYPE","in",["BASE TABLE","VIEW"]).select(["t.TABLE_SCHEMA as schema","t.TABLE_NAME as name","t.TABLE_TYPE as type"]).$narrowType().select(t=>W(t.selectFrom("information_schema.columns as c").leftJoin("information_schema.KEY_COLUMN_USAGE as kcu",r=>r.onRef("kcu.TABLE_SCHEMA","=","c.TABLE_SCHEMA").onRef("kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("kcu.POSITION_IN_UNIQUE_CONSTRAINT","is not",null)).leftJoin("information_schema.KEY_COLUMN_USAGE as pk_kcu",r=>r.onRef("pk_kcu.TABLE_SCHEMA","=","c.TABLE_SCHEMA").onRef("pk_kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("pk_kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("pk_kcu.CONSTRAINT_NAME","=","PRIMARY")).whereRef("c.TABLE_SCHEMA","=","t.TABLE_SCHEMA").whereRef("c.TABLE_NAME","=","t.TABLE_NAME").select(["c.COLUMN_NAME as name","c.COLUMN_TYPE as datatype","c.ORDINAL_POSITION as position","kcu.REFERENCED_TABLE_NAME as fk_table","kcu.REFERENCED_COLUMN_NAME as fk_column","pk_kcu.ORDINAL_POSITION as pk"]).select(r=>[r("c.EXTRA","=","auto_increment").as("autoincrement"),r("c.EXTRA","in",["on update CURRENT_TIMESTAMP","STORED GENERATED","VIRTUAL GENERATED"]).as("computed"),r("c.IS_NULLABLE","=","YES").as("nullable")])).as("columns")).orderBy("t.TABLE_SCHEMA").orderBy("t.TABLE_NAME").orderBy("t.TABLE_TYPE"))}function Z(){return[{columns:[{autoincrement:1,computed:0,datatype:"int",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"binary(16)",fk_column:null,fk_table:null,name:"uuid",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"varchar(255)",fk_column:null,fk_table:null,name:"name",nullable:1,pk:null,position:3},{autoincrement:0,computed:1,datatype:"text",fk_column:null,fk_table:null,name:"id_name",nullable:1,pk:null,position:4}],name:"animals",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:1,computed:0,datatype:"int",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"timestamp",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"enum('admin','maintainer','member')",fk_column:null,fk_table:null,name:"role",nullable:0,pk:null,position:3},{autoincrement:0,computed:0,datatype:"int",fk_column:"id",fk_table:"animals",name:"animal_id",nullable:1,pk:null,position:4}],name:"users",schema:"studio",type:"BASE TABLE"}]}function ee(o){let t=R(o),r=_`@@session.time_zone`;return b(t.selectNoFrom(t.case().when(r,"=","SYSTEM").then(_`@@system_time_zone`).else(r).end().as("timezone")).$narrowType())}function re(){return[{timezone:"UTC"}]}function Ie(o){let{executor:t,...r}=o;return{async delete(s,n){try{let e=H(s,r),[u]=await t.execute(e,n);return u?i({error:u,query:e}):[null,{...s,query:e}]}catch(e){return i({error:e})}},async insert(s,n){try{let{rows:e,table:u}=s,{columns:p}=u,y=Object.values(p).find(a=>a.isAutoincrement),c=e.map(a=>Y(a,p)),f=c.some(a=>{let m=Object.values(a);return m.length===0||m.some(g=>g==null)});if(!y&&f)return i({error:new Error("Cannot proceed with the insertion, some rows cannot be refetched after insertion."),query:L(s,r)});if(!f){let a=L(s,r),m=I({criteria:c,table:u},r),g=[a,m],[[S],h]=await t.executeSequence(g,n),N=Q(g);if(S)return i({error:S,query:N});let[w,O]=h;return w?i({error:new Error("Failed to refetch inserted rows - please refresh.",{cause:w}),query:N}):[null,{rows:O,query:N}]}let A=await Promise.all(e.map(async a=>{let m=L({rows:[a],table:u},r),[g,S]=await t.execute(m,n);if(g)return i({error:g,query:m});let{name:h}=y,N=a[h]||S[0]?.insertId;if(!N)return i({error:new Error("Could not determine value for autoincrement column to refetch inserted row."),query:m});let w=I({criteria:[{[h]:N}],table:{...u,columns:Object.values(p).reduce((x,U)=>{let{name:D}=U;return x[D]={...U,pkPosition:D===h?1:null},x},{})}},r),[O,ne]=await t.execute(w,n),C=Q([m,w]);if(O)return console.error("Error refetching inserted row:",O),i({error:new Error("Failed to refetch inserted row - please refresh.",{cause:O}),query:C});let[q]=ne;return q?[null,{row:q,query:C}]:i({error:new Error("Refetch query returned no results for inserted row."),query:C})})),E=[],l=null,T=[];for(let a=0;a<A.length;a++){let[m,g]=A[a];m?(T.push([a,m]),m.query&&(l=l?Q([l,m.query]):m.query)):(E.push(g.row),g.query&&(l=l?Q([l,g.query]):g.query))}return T.length>0?i({error:new AggregateError(T.map(([,a])=>a),`Row${T.length>1?"s":""} ${T.map(([a])=>a).join(", ")} could not be inserted or refetched.`),query:l}):[null,{rows:E,query:l}]}catch(e){return i({error:e})}},async introspect(s){try{let n=X(o),e=ee(o),[[u,p],[y,c]]=await Promise.all([t.execute(n,s),t.execute(e,s)]);if(u)return i({error:u,query:n});if(y)return i({error:y,query:e});let f=c[0]?.timezone;return f?[null,te({query:n,tables:p,timezone:f})]:i({error:new Error("Timezone not found"),query:e})}catch(n){return i({error:n})}},async query(s,n){try{let e=K(s,r),[u,p]=await t.execute(e,n);return u?i({error:u,query:e}):[null,{filteredRowCount:p[0]?.__ps_count__||"0",rows:p,query:e}]}catch(e){return i({error:e})}},async update(s,n){try{let e=V(s,r),u=v(s,r),[[p],y]=await t.executeSequence([e,u],n);if(p)return i({error:p,query:e});let[c,f]=y;if(c)return i({error:c,query:e});let[A]=f;return A?[null,{row:A,query:e}]:i({error:new Error("Updated row not found"),query:e})}catch(e){return i({error:e})}}}}function te(o){let{query:t,tables:r,timezone:s}=o;return r.reduce((n,e)=>{let{schemas:u}=n,{columns:p,name:y,schema:c}=e,f=p.sort((A,E)=>A.position-E.position).reduce((A,E)=>{let{datatype:l,name:T}=E,a=l.indexOf("("),m=(a>-1?l.substring(0,a):l).trim().toLowerCase();return{...A,[T]:{datatype:{...G[m]||{group:"raw"},isArray:!1,isNative:!0,name:m,options:m==="enum"?l.slice(6,-2).split("','"):[],schema:c},defaultValue:null,fkColumn:E.fk_column,fkSchema:c,fkTable:E.fk_table,isAutoincrement:!!E.autoincrement,isComputed:!!E.computed,name:T,nullable:!!E.nullable,pkPosition:E.pk,schema:c,table:y}}},{});return u[c]===void 0&&(u[c]={name:c,tables:{}}),u[c].tables[y]={columns:f,name:y,schema:c},n},{filterOperators:se,query:t,schemas:{},timezone:s})}var se=["=","!=",">",">=","<","<=","is","is not","like","not like"];function qe(){let o=Z(),[{timezone:t}]=re();return te({tables:o,timezone:t,query:{parameters:[],sql:"<mocked>"}})}function Q(o){let[t,r]=o;return{parameters:t.parameters.concat(r.parameters),sql:`${t.sql};
10
+ ${r.sql}`}}export{Ie as createMySQLAdapter,ue as getCancelQuery,H as getDeleteQuery,L as getInsertQuery,I as getInsertRefetchQuery,K as getSelectQuery,X as getTablesQuery,ee as getTimezoneQuery,V as getUpdateQuery,v as getUpdateRefetchQuery,qe as mockIntrospect,fe as mockSelectQuery,Z as mockTablesQuery,re as mockTimezoneQuery};
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9teXNxbC1jb3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9hZGFwdGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9kYXRhdHlwZS50cyIsICIuLi8uLi8uLi9kYXRhL215c3FsLWNvcmUvZG1sLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9idWlsZGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9pbnRyb3NwZWN0aW9uLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vaGVscGVycy9teXNxbC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZG1sXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsaXR5XCI7XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJEZWxldGVSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckVycm9yLFxuICB0eXBlIEFkYXB0ZXJJbnNlcnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJSZXF1aXJlbWVudHMsXG4gIHR5cGUgQWRhcHRlclVwZGF0ZVJlc3VsdCxcbiAgdHlwZSBDb2x1bW4sXG4gIGNyZWF0ZUFkYXB0ZXJFcnJvcixcbiAgdHlwZSBGaWx0ZXJPcGVyYXRvcixcbiAgdHlwZSBUYWJsZSxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VxdWVuY2VFeGVjdXRvciB9IGZyb20gXCIuLi9leGVjdXRvclwiO1xuaW1wb3J0IHsgaW5mZXJGaWx0ZXJPYmplY3QsIHR5cGUgUXVlcnksIHR5cGUgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgRWl0aGVyIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IE1ZU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEEgfSBmcm9tIFwiLi9kYXRhdHlwZVwiO1xuaW1wb3J0IHtcbiAgZ2V0RGVsZXRlUXVlcnksXG4gIGdldEluc2VydFF1ZXJ5LFxuICBnZXRJbnNlcnRSZWZldGNoUXVlcnksXG4gIGdldFNlbGVjdFF1ZXJ5LFxuICBnZXRVcGRhdGVRdWVyeSxcbiAgZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5LFxufSBmcm9tIFwiLi9kbWxcIjtcbmltcG9ydCB7IGdldFRhYmxlc1F1ZXJ5LCBnZXRUaW1lem9uZVF1ZXJ5LCBtb2NrVGFibGVzUXVlcnksIG1vY2tUaW1lem9uZVF1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgdHlwZSBNeVNRTEFkYXB0ZXJSZXF1aXJlbWVudHMgPSBPbWl0PEFkYXB0ZXJSZXF1aXJlbWVudHMsIFwiZXhlY3V0b3JcIj4gJiB7XG4gIGV4ZWN1dG9yOiBTZXF1ZW5jZUV4ZWN1dG9yO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU15U1FMQWRhcHRlcihyZXF1aXJlbWVudHM6IE15U1FMQWRhcHRlclJlcXVpcmVtZW50cyk6IEFkYXB0ZXIge1xuICBjb25zdCB7IGV4ZWN1dG9yLCAuLi5vdGhlclJlcXVpcmVtZW50cyB9ID0gcmVxdWlyZW1lbnRzO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZGVsZXRlKGRldGFpbHMsIG9wdGlvbnMpOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJEZWxldGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldERlbGV0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyAuLi5kZXRhaWxzLCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGluc2VydChkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW5zZXJ0UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyByb3dzLCB0YWJsZSB9ID0gZGV0YWlscztcbiAgICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSB0YWJsZTtcblxuICAgICAgICBjb25zdCBhdXRvaW5jcmVtZW50Q29sdW1uOiBDb2x1bW4gfCB1bmRlZmluZWQgPSBPYmplY3QudmFsdWVzKGNvbHVtbnMpLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlzQXV0b2luY3JlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyT2JqZWN0cyA9IHJvd3MubWFwKChyb3cpID0+IGluZmVyRmlsdGVyT2JqZWN0KHJvdywgY29sdW1ucykpO1xuXG4gICAgICAgIGNvbnN0IGhhc1BhcnRpYWxGaWx0ZXJPYmplY3RzID0gZmlsdGVyT2JqZWN0cy5zb21lKChmaWx0ZXJPYmplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZXMgPSBPYmplY3QudmFsdWVzKGZpbHRlck9iamVjdCk7XG5cbiAgICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWVzLmxlbmd0aCA9PT0gMCB8fCBmaWx0ZXJWYWx1ZXMuc29tZSgodmFsdWUpID0+IHZhbHVlID09IG51bGwpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgY2xhc3NpYyBwYXJ0aWFsIGZpbHRlciBvYmplY3QgY2FzZXMgKGUuZy4gdXVpZCkgaGVyZSBvciBiZWZvcmUgcmVxdWVzdGluZyBmcm9tIGFkYXB0ZXIuXG4gICAgICAgIGlmICghYXV0b2luY3JlbWVudENvbHVtbiAmJiBoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIGluc2VydGlvbiwgc29tZSByb3dzIGNhbm5vdCBiZSByZWZldGNoZWQgYWZ0ZXIgaW5zZXJ0aW9uLlwiKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBnZXRJbnNlcnRRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc1BhcnRpYWxGaWx0ZXJPYmplY3RzKSB7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0UXVlcnkgPSBnZXRJbnNlcnRRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgICAgY29uc3QgcmVmZXRjaFF1ZXJ5ID0gZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5KHsgY3JpdGVyaWE6IGZpbHRlck9iamVjdHMsIHRhYmxlIH0sIG90aGVyUmVxdWlyZW1lbnRzKTtcbiAgICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IFtpbnNlcnRRdWVyeSwgcmVmZXRjaFF1ZXJ5XSBhcyBjb25zdDtcblxuICAgICAgICAgIGNvbnN0IFtbaW5zZXJ0RXJyb3JdLCBtYXliZVJlZmV0Y2hSZXN1bHRdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZVNlcXVlbmNlKHNlcXVlbmNlLCBvcHRpb25zKTtcblxuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gam9pblNlcXVlbmNlKHNlcXVlbmNlKTtcblxuICAgICAgICAgIGlmIChpbnNlcnRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBpbnNlcnRFcnJvciwgcXVlcnkgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gbWF5YmVSZWZldGNoUmVzdWx0ITtcblxuICAgICAgICAgIGlmIChyZWZldGNoRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93cyAtIHBsZWFzZSByZWZyZXNoLlwiLCB7IGNhdXNlOiByZWZldGNoRXJyb3IgfSksXG4gICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvd3M6IHJlZmV0Y2hSZXN1bHRzLCBxdWVyeSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhcyBhdXRvaW5jcmVtZW50IGNvbHVtbiAtIGluc2VydCByb3dzIG9uZSBieSBvbmUgYW5kIHJlZmV0Y2gsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYGluc2VydElkYCBpZiBpbnNlcnRlZCByb3cgaGFzIG5vIHZhbHVlIGZvciB0aGlzIGNvbHVtbi5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJvd3MubWFwKGFzeW5jIChyb3cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFF1ZXJ5ID0gZ2V0SW5zZXJ0UXVlcnkoeyByb3dzOiBbcm93XSwgdGFibGUgfSwgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKGluc2VydFF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnk6IGluc2VydFF1ZXJ5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7IG5hbWU6IGF1dG9pbmNyZW1lbnRDb2x1bW5OYW1lIH0gPSBhdXRvaW5jcmVtZW50Q29sdW1uITtcblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbYXV0b2luY3JlbWVudENvbHVtbk5hbWVdIHx8IHJlc3VsdFswXT8uaW5zZXJ0SWQ7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBkZXRlcm1pbmUgdmFsdWUgZm9yIGF1dG9pbmNyZW1lbnQgY29sdW1uIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93LlwiKSxcbiAgICAgICAgICAgICAgICBxdWVyeTogaW5zZXJ0UXVlcnksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRJbnNlcnRSZWZldGNoUXVlcnkoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjcml0ZXJpYTogW3sgW2F1dG9pbmNyZW1lbnRDb2x1bW5OYW1lXTogdmFsdWUgfV0sXG4gICAgICAgICAgICAgICAgdGFibGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGRpcnR5IGhhY2sgdG8gbWFyayBhdXRvaW5jcmVtZW50IGNvbHVtbiBhcyBUSEUgcHJpbWFyeSBrZXkgZm9yIHJlZmV0Y2hpbmcuXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zOiBPYmplY3QudmFsdWVzKGNvbHVtbnMpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGFjYywgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lOiBjb2x1bW5OYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgICAgICAgICAgICAgICAgICBhY2NbY29sdW1uTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBwa1Bvc2l0aW9uOiBjb2x1bW5OYW1lID09PSBhdXRvaW5jcmVtZW50Q29sdW1uTmFtZSA/IDEgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG90aGVyUmVxdWlyZW1lbnRzLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShyZWZldGNoUXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IGpvaW5TZXF1ZW5jZShbaW5zZXJ0UXVlcnksIHJlZmV0Y2hRdWVyeV0pO1xuXG4gICAgICAgICAgICBpZiAocmVmZXRjaEVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWZldGNoaW5nIGluc2VydGVkIHJvdzpcIiwgcmVmZXRjaEVycm9yKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93IC0gcGxlYXNlIHJlZnJlc2guXCIsIHsgY2F1c2U6IHJlZmV0Y2hFcnJvciB9KSxcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtyZWZldGNoZWRSb3ddID0gcmVmZXRjaFJlc3VsdHM7XG5cbiAgICAgICAgICAgIGlmICghcmVmZXRjaGVkUm93KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJSZWZldGNoIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdHMgZm9yIGluc2VydGVkIHJvdy5cIiksXG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW251bGwsIHsgcm93OiByZWZldGNoZWRSb3csIHF1ZXJ5IH1dIGFzIGNvbnN0O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGluc2VydGVkUm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgICBsZXQgcXVlcnk6IFF1ZXJ5PHVua25vd24+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGVycm9yczogW251bWJlciwgQWRhcHRlckVycm9yXVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRdID0gcmVzdWx0c1tpXSE7XG5cbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFtpLCBlcnJvcl0pO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3IucXVlcnkpIHtcbiAgICAgICAgICAgICAgcXVlcnkgPSAhcXVlcnkgPyBlcnJvci5xdWVyeSA6IGpvaW5TZXF1ZW5jZShbcXVlcnksIGVycm9yLnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc2VydGVkUm93cy5wdXNoKHJlc3VsdC5yb3cpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgIHF1ZXJ5ID0gIXF1ZXJ5ID8gcmVzdWx0LnF1ZXJ5IDogam9pblNlcXVlbmNlKFtxdWVyeSwgcmVzdWx0LnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgICBlcnJvcnMubWFwKChbLCBlcnJvcl0pID0+IGVycm9yKSxcbiAgICAgICAgICAgICAgYFJvdyR7ZXJyb3JzLmxlbmd0aCA+IDEgPyBcInNcIiA6IFwiXCJ9ICR7ZXJyb3JzLm1hcCgoW2luZGV4XSkgPT4gaW5kZXgpLmpvaW4oXCIsIFwiKX0gY291bGQgbm90IGJlIGluc2VydGVkIG9yIHJlZmV0Y2hlZC5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93czogaW5zZXJ0ZWRSb3dzLCBxdWVyeTogcXVlcnkhIH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaW50cm9zcGVjdChvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhYmxlc1F1ZXJ5ID0gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzKTtcbiAgICAgICAgY29uc3QgdGltZXpvbmVRdWVyeSA9IGdldFRpbWV6b25lUXVlcnkocmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbW3RhYmxlc0Vycm9yLCB0YWJsZXNdLCBbdGltZXpvbmVFcnJvciwgdGltZXpvbmVzXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YWJsZXNRdWVyeSwgb3B0aW9ucyksXG4gICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0aW1lem9uZVF1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHRhYmxlc0Vycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiB0YWJsZXNFcnJvciwgcXVlcnk6IHRhYmxlc1F1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWV6b25lRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRpbWV6b25lRXJyb3IsIHF1ZXJ5OiB0aW1lem9uZVF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZXpvbmUgPSB0aW1lem9uZXNbMF0/LnRpbWV6b25lO1xuXG4gICAgICAgIGlmICghdGltZXpvbmUpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IG5ldyBFcnJvcihcIlRpbWV6b25lIG5vdCBmb3VuZFwiKSwgcXVlcnk6IHRpbWV6b25lUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeTogdGFibGVzUXVlcnksIHRhYmxlcywgdGltZXpvbmUgfSldO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcXVlcnkoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgZmlsdGVyZWRSb3dDb3VudDogcmVzdWx0c1swXT8uX19wc19jb3VudF9fIHx8IFwiMFwiLCByb3dzOiByZXN1bHRzLCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBwcm9wZXJseVxuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGUoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclVwZGF0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5ID0gZ2V0VXBkYXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRVcGRhdGVSZWZldGNoUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtbdXBkYXRlRXJyb3JdLCByZWZldGNoUmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGVTZXF1ZW5jZShbdXBkYXRlUXVlcnksIHJlZmV0Y2hRdWVyeV0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh1cGRhdGVFcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogdXBkYXRlRXJyb3IsIHF1ZXJ5OiB1cGRhdGVRdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtyZWZldGNoRXJyb3IsIHJlc3VsdHNdID0gcmVmZXRjaFJlc3VsdCE7XG5cbiAgICAgICAgaWYgKHJlZmV0Y2hFcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogcmVmZXRjaEVycm9yLCBxdWVyeTogdXBkYXRlUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IG5ldyBFcnJvcihcIlVwZGF0ZWQgcm93IG5vdCBmb3VuZFwiKSwgcXVlcnk6IHVwZGF0ZVF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvdywgcXVlcnk6IHVwZGF0ZVF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRyb3NwZWN0aW9uKGFyZ3M6IHtcbiAgcXVlcnk6IFF1ZXJ5O1xuICB0YWJsZXM6IFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59KTogQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBjb25zdCB7IHF1ZXJ5LCB0YWJsZXMsIHRpbWV6b25lIH0gPSBhcmdzO1xuXG4gIHJldHVybiB0YWJsZXMucmVkdWNlKFxuICAgIChyZXN1bHQsIHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYXMgfSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSA9IHRhYmxlO1xuXG4gICAgICBjb25zdCBjb2x1bW5zUmVjb3JkID0gY29sdW1uc1xuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5wb3NpdGlvbiAtIGIucG9zaXRpb24pXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhdHlwZSwgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgICAgICAgICBjb25zdCBpbmRleE9mUGFyZW50aGVzaXMgPSBkYXRhdHlwZS5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmlwcGVkRGF0YVR5cGUgPSAoaW5kZXhPZlBhcmVudGhlc2lzID4gLTEgPyBkYXRhdHlwZS5zdWJzdHJpbmcoMCwgaW5kZXhPZlBhcmVudGhlc2lzKSA6IGRhdGF0eXBlKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgICBbY29sdW1uTmFtZV06IHtcbiAgICAgICAgICAgICAgICBkYXRhdHlwZToge1xuICAgICAgICAgICAgICAgICAgLi4uKE1ZU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEFbc3RyaXBwZWREYXRhVHlwZV0gfHwgeyBncm91cDogXCJyYXdcIiB9KSxcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNOYXRpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBzdHJpcHBlZERhdGFUeXBlLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWREYXRhVHlwZSA9PT0gXCJlbnVtXCIgPyBkYXRhdHlwZS5zbGljZShgZW51bSgnYC5sZW5ndGgsIC1gJylgLmxlbmd0aCkuc3BsaXQoYCcsJ2ApIDogW10sXG4gICAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbnRyb3NwZWN0IG15c3FsIGRlZmF1bHQgdmFsdWVzLlxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBma0NvbHVtbjogY29sdW1uLmZrX2NvbHVtbixcbiAgICAgICAgICAgICAgICBma1NjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgIGZrVGFibGU6IGNvbHVtbi5ma190YWJsZSxcbiAgICAgICAgICAgICAgICBpc0F1dG9pbmNyZW1lbnQ6IEJvb2xlYW4oY29sdW1uLmF1dG9pbmNyZW1lbnQpLFxuICAgICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IEJvb2xlYW4oY29sdW1uLmNvbXB1dGVkKSxcbiAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiBCb29sZWFuKGNvbHVtbi5udWxsYWJsZSksXG4gICAgICAgICAgICAgICAgcGtQb3NpdGlvbjogY29sdW1uLnBrLFxuICAgICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICB9IGFzIGNvbnN0IHNhdGlzZmllcyBDb2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgVGFibGVbXCJjb2x1bW5zXCJdLFxuICAgICAgICApO1xuXG4gICAgICBpZiAoc2NoZW1hc1tzY2hlbWFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NoZW1hc1tzY2hlbWFdID0geyBuYW1lOiBzY2hlbWEsIHRhYmxlczoge30gfTtcbiAgICAgIH1cblxuICAgICAgc2NoZW1hc1tzY2hlbWFdLnRhYmxlc1t0YWJsZU5hbWVdID0geyBjb2x1bW5zOiBjb2x1bW5zUmVjb3JkLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgeyBmaWx0ZXJPcGVyYXRvcnMsIHF1ZXJ5LCBzY2hlbWFzOiB7fSwgdGltZXpvbmUgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQgYXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gICk7XG59XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuXSBzYXRpc2ZpZXMgRmlsdGVyT3BlcmF0b3JbXTtcblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tJbnRyb3NwZWN0KCkge1xuICBjb25zdCB0YWJsZXMgPSBtb2NrVGFibGVzUXVlcnkoKTtcbiAgY29uc3QgW3sgdGltZXpvbmUgfV0gPSBtb2NrVGltZXpvbmVRdWVyeSgpO1xuICBjb25zdCBxdWVyeSA9IHsgcGFyYW1ldGVyczogW10sIHNxbDogXCI8bW9ja2VkPlwiIH0gYXMgUXVlcnk7XG5cbiAgcmV0dXJuIGNyZWF0ZUludHJvc3BlY3Rpb24oeyB0YWJsZXMsIHRpbWV6b25lLCBxdWVyeSB9KSBhcyB7XG4gICAgLy8gYmVzdCBlZmZvcnQsIG5vIG5lZWQgZ28gb3ZlcmJvYXJkLlxuICAgIHNjaGVtYXM6IHtcbiAgICAgIFtLIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wic2NoZW1hXCJdXToge1xuICAgICAgICBuYW1lOiBLO1xuICAgICAgICB0YWJsZXM6IHtcbiAgICAgICAgICBbVCBpbiAodHlwZW9mIHRhYmxlcylbbnVtYmVyXVtcIm5hbWVcIl1dOiBUYWJsZTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aW1lem9uZTogdHlwZW9mIHRpbWV6b25lO1xuICAgIGZpbHRlck9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXTtcbiAgICBxdWVyeTogUXVlcnk7XG4gIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0O1xufVxuXG5mdW5jdGlvbiBqb2luU2VxdWVuY2Uoc2VxdWVuY2U6IHJlYWRvbmx5IFtRdWVyeTx1bmtub3duPiwgUXVlcnk8dW5rbm93bj5dKTogUXVlcnk8dW5rbm93bj4ge1xuICBjb25zdCBbcXVlcnkwLCBxdWVyeTFdID0gc2VxdWVuY2U7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJhbWV0ZXJzOiBxdWVyeTAucGFyYW1ldGVycy5jb25jYXQocXVlcnkxLnBhcmFtZXRlcnMpLFxuICAgIHNxbDogYCR7cXVlcnkwLnNxbH07XFxuJHtxdWVyeTEuc3FsfWAsXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEYXRhVHlwZSB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5cbmV4cG9ydCBjb25zdCBNWVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBOiBSZWNvcmQ8c3RyaW5nLCBQaWNrPERhdGFUeXBlLCBcImdyb3VwXCI+PiA9IHtcbiAgYmlnaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBiaW5hcnk6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgYml0OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIGJsb2I6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgY2hhcjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBcImNoYXIgYmluYXJ5XCI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgZGF0ZToge1xuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIGRhdGV0aW1lOiB7XG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgZGVjOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkZWNpbWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkb3VibGU6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIFwiZG91YmxlIHByZWNpc2lvblwiOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBlbnVtOiB7XG4gICAgZ3JvdXA6IFwiZW51bVwiLFxuICB9LFxuICBmaXhlZDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZmxvYXQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGdlb21ldHJ5OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIGdlb21ldHJ5Y29sbGVjdGlvbjoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBpbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGludGVnZXI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGpzb246IHtcbiAgICBncm91cDogXCJqc29uXCIsXG4gIH0sXG4gIGxpbmVzdHJpbmc6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgbG9uZzoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBcImxvbmcgdmFyY2hhclwiOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmdibG9iOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmd0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmd2YXJiaW5hcnk6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbG9uZ3ZhcmNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbWVkaXVtYmxvYjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBtZWRpdW1pbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIG1lZGl1bXRleHQ6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbXVsdGlsaW5lc3RyaW5nOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIG11bHRpcG9pbnQ6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgbXVsdGlwb2x5Z29uOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIG51bWVyaWM6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIHBvaW50OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHBvbHlnb246IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgcmVhbDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgLyoqXG4gICAqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzkuNS9lbi9zZXQuaHRtbFxuICAgKi9cbiAgc2V0OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHNtYWxsaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICB0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHRpbWU6IHtcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIHRpbWVzdGFtcDoge1xuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIHRpbnlibG9iOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHRpbnlpbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIHRpbnl0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHZhcmJpbmFyeToge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB2YXJjaGFyOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIFwidmFyY2hhciBiaW5hcnlcIjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICAvKipcbiAgICogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOS41L2VuL3ZlY3Rvci5odG1sXG4gICAqL1xuICB2ZWN0b3I6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgeWVhcjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbn07XG4iLCAiaW1wb3J0IHsgdHlwZSBJbmZlclJlc3VsdCwgdHlwZSBTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uLCBzcWwgfSBmcm9tIFwia3lzZWx5XCI7XG5pbXBvcnQgdHlwZSB7IE9rUGFja2V0UGFyYW1zIH0gZnJvbSBcIm15c3FsMlwiO1xuXG5pbXBvcnQgdHlwZSB7IEFkYXB0ZXJEZWxldGVEZXRhaWxzLCBBZGFwdGVyUXVlcnlEZXRhaWxzLCBBZGFwdGVyVXBkYXRlRGV0YWlscywgVGFibGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMsXG4gIGFwcGx5VHJhbnNmb3JtYXRpb25zLFxuICB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsXG4gIGNvbXBpbGUsXG4gIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24sXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJEZWxldGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICByb3dzLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICByZXR1cm4gY29tcGlsZShidWlsZGVyLmRlbGV0ZUZyb20odGFibGVOYW1lKS4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSkuJGNhc3RUbzxPa1BhY2tldFBhcmFtcz4oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRRdWVyeShcbiAgZGV0YWlsczogeyByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyB0YWJsZTogVGFibGUgfSxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgcm93cyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLmluc2VydEludG8odGFibGVOYW1lKVxuICAgICAgLnZhbHVlcyhhcHBseVRyYW5zZm9ybWF0aW9ucyhcImluc2VydFwiLCByb3dzLCBjb2x1bW5zKSlcbiAgICAgIC4kY2FzdFRvPE9rUGFja2V0UGFyYW1zPigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiB7IGNyaXRlcmlhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyB0YWJsZTogVGFibGUgfSxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY3JpdGVyaWEsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhjcml0ZXJpYSwgY29sdW1ucykpXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX2luc2VydGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhbeyAuLi5yb3csIC4uLmNoYW5nZXMgfV0sIGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5zZWxlY3QoZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpLmFzKFwiX19wc191cGRhdGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0UXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJRdWVyeURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIGZpbHRlciA9IHsgYWZ0ZXI6IFwiYW5kXCIsIGZpbHRlcnM6IFtdLCBraW5kOiBcIkZpbHRlckdyb3VwXCIgfSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBmaWx0ZXJFeHByZXNzaW9uID0gZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbihmaWx0ZXIuZmlsdGVycywgY29sdW1ucyk7XG5cbiAgY29uc3QgQUdHX05BTUUgPSBcIl9fcHNfYWdnX19cIjtcbiAgY29uc3QgQ09VTlRfUkVGID0gXCJfX3BzX2NvdW50X19cIjtcblxuICBjb25zdCBjb3VudFF1ZXJ5ID0gYnVpbGRlclxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoZmlsdGVyRXhwcmVzc2lvbilcbiAgICAuc2VsZWN0KChlYikgPT4gZWIuY2FzdDxCaWdJbnRTdHJpbmc+KGViLmZuLmNvYWxlc2NlKGViLmZuLmNvdW50QWxsKCksIHNxbC5saXQoMCkpLCBcImNoYXJcIikuYXMoQ09VTlRfUkVGKSk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoQUdHX05BTUUsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAuaW5uZXJKb2luKEFHR19OQU1FLCAoamIpID0+IGpiLm9uVHJ1ZSgpKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoZmlsdGVyRXhwcmVzc2lvbilcbiAgICAgIC5zZWxlY3QoXG4gICAgICAgIGAke0FHR19OQU1FfS4ke0NPVU5UX1JFRn1gIHNhdGlzZmllcyBTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uPFxuICAgICAgICAgIHsgW0FHR19OQU1FXTogSW5mZXJSZXN1bHQ8dHlwZW9mIGNvdW50UXVlcnk+W251bWJlcl0gfSxcbiAgICAgICAgICB0eXBlb2YgQUdHX05BTUVcbiAgICAgICAgPixcbiAgICAgIClcbiAgICAgIC5zZWxlY3QoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAuJGNhbGwoKHFiKSA9PiBzb3J0T3JkZXIucmVkdWNlKChxYiwgaXRlbSkgPT4gcWIub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pLCBxYikpXG4gICAgICAubGltaXQocGFnZVNpemUpXG4gICAgICAvLyB3ZSdyZSBpbmplY3RpbmcgdGhlIG9mZnNldCB2YWx1ZSBoZXJlIHRvIGF2b2lkIHNlcmlhbGl6YXRpb24gY29tcGxleGl0eSAoYGJpZ2ludGAgaXMgYSBuby1nbyBmb3IgYEpTT04uc3RyaW5naWZ5YCkuXG4gICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrU2VsZWN0UXVlcnkoKSB7XG4gIC8vIFRPRE86IC4uLlxuICByZXR1cm4gW10gYXMgY29uc3Qgc2F0aXNmaWVzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCBubyBuZWVkIHRvIGdvIG92ZXJib2FyZFxuICAgIFtLIGluIFJldHVyblR5cGU8dHlwZW9mIG1vY2tUYWJsZXNRdWVyeT5bMV1bXCJjb2x1bW5zXCJdW251bWJlcl1bXCJuYW1lXCJdIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoYXBwbHlUcmFuc2Zvcm1hdGlvbnMoXCJ1cGRhdGVcIiwgY2hhbmdlcywgY29sdW1ucykpXG4gICAgICAuJGNhbGwoYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMoW3Jvd10sIGNvbHVtbnMpKVxuICAgICAgLiRjYXN0VG88T2tQYWNrZXRQYXJhbXM+KCksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKSB7XG4gIHJldHVybiBzcWw8bnVtYmVyIHwgc3RyaW5nPmBjYXN0KHVuaXhfdGltZXN0YW1wKG5vdygzKSkgKiAxMDAwIGFzIHVuc2lnbmVkKWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBLeXNlbHksIE15c3FsQWRhcHRlciwgTXlzcWxRdWVyeUNvbXBpbGVyIH0gZnJvbSBcImt5c2VseVwiO1xuXG5pbXBvcnQgeyB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsIGdldEJ1aWxkZXIgfSBmcm9tIFwiLi4vcXVlcnlcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRNeVNRTEJ1aWxkZXI8RGF0YWJhc2UgPSBhbnk+KFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKTogS3lzZWx5PERhdGFiYXNlPiB7XG4gIHJldHVybiBnZXRCdWlsZGVyKHsgLi4ucmVxdWlyZW1lbnRzLCBBZGFwdGVyOiBNeXNxbEFkYXB0ZXIsIFF1ZXJ5Q29tcGlsZXI6IE15c3FsUXVlcnlDb21waWxlciB9KTtcbn1cbiIsICJpbXBvcnQgeyBzcWwgfSBmcm9tIFwia3lzZWx5XCI7XG5pbXBvcnQgeyBqc29uQXJyYXlGcm9tIH0gZnJvbSBcImt5c2VseS9oZWxwZXJzL215c3FsXCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgY29tcGlsZSwgdHlwZSBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2Uge1xuICAvKiogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOC40L2VuL2luZm9ybWF0aW9uLXNjaGVtYS1jb2x1bW5zLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1uc1wiOiB7XG4gICAgVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIENPTFVNTl9OQU1FOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgdGFibGUuIE9SRElOQUxfUE9TSVRJT04gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgeW91IG1pZ2h0IHdhbnQgdG8gc2F5IE9SREVSIEJZIE9SRElOQUxfUE9TSVRJT04uIFVubGlrZSBTSE9XIENPTFVNTlMsIFNFTEVDVCBmcm9tIHRoZSBDT0xVTU5TIHRhYmxlIGRvZXMgbm90IGhhdmUgYXV0b21hdGljIG9yZGVyaW5nLiAqL1xuICAgIE9SRElOQUxfUE9TSVRJT046IG51bWJlcjtcbiAgICAvKiogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4uIFRoaXMgaXMgTlVMTCBpZiB0aGUgY29sdW1uIGhhcyBhbiBleHBsaWNpdCBkZWZhdWx0IG9mIE5VTEwsIG9yIGlmIHRoZSBjb2x1bW4gZGVmaW5pdGlvbiBpbmNsdWRlcyBubyBERUZBVUxUIGNsYXVzZS4gKi9cbiAgICBDT0xVTU5fREVGQVVMVDogdW5rbm93bjtcbiAgICBJU19OVUxMQUJMRTogXCJZRVNcIiB8IFwiTk9cIjtcbiAgICAvKiogQ29udGFpbnMgdGhlIHR5cGUgbmFtZSBhbmQgcG9zc2libHkgb3RoZXIgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcHJlY2lzaW9uIG9yIGxlbmd0aC4gKi9cbiAgICBDT0xVTU5fVFlQRTogc3RyaW5nO1xuICAgIC8qKiBlbXB0eSAtIG5vdCBpbmRleGVkIG9yIGlzIHNlY29uZGFyeSBjb2x1bW4gaW4gYSBtdWx0aS1jb2x1bW4gbm9udW5pcXVlIGluZGV4LiBQUkkgLSBwYXJ0IG9mIGEgcHJpbWFyeSBrZXkuIFVOSSAtIGZpcnN0IGNvbHVtbiBvZiBhIHVuaXF1ZSBpbmRleC4gTVVMIC0gZmlyc3QgY29sdW1uIG9mIGEgbm9udW5pcXVlIGluZGV4ICovXG4gICAgQ09MVU1OX0tFWTogXCJcIiB8IFwiUFJJXCIgfCBcIlVOSVwiIHwgXCJNVUxcIjtcbiAgICAvKiogRXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbHVtbi4gUG9zc2libGUgdmFsdWVzIGFyZSAqL1xuICAgIEVYVFJBOlxuICAgICAgfCBcIlwiXG4gICAgICB8IFwiYXV0b19pbmNyZW1lbnRcIlxuICAgICAgfCBcIm9uIHVwZGF0ZSBDVVJSRU5UX1RJTUVTVEFNUFwiXG4gICAgICB8IFwiU1RPUkVEIEdFTkVSQVRFRFwiXG4gICAgICB8IFwiVklSVFVBTCBHRU5FUkFURURcIlxuICAgICAgfCBcIkRFRkFVTFQgR0VORVJBVEVEXCI7XG4gICAgLyoqIEZvciBnZW5lcmF0ZWQgY29sdW1ucywgZGlzcGxheXMgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBjb21wdXRlIGNvbHVtbiB2YWx1ZXMuIEVtcHR5IGZvciBub25nZW5lcmF0ZWQgY29sdW1ucy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGdlbmVyYXRlZCBjb2x1bW5zLCBzZWUgU2VjdGlvbiAxNS4xLjIwLjgsIFx1MjAxQ0NSRUFURSBUQUJMRSBhbmQgR2VuZXJhdGVkIENvbHVtbnNcdTIwMUQuICovXG4gICAgR0VORVJBVElPTl9FWFBSRVNTSU9OOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEtdGFibGVzLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzXCI6IHtcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSAoZGF0YWJhc2UpIHRvIHdoaWNoIHRoZSB0YWJsZSBiZWxvbmdzLiAqL1xuICAgIFRBQkxFX1NDSEVNQTogc3RyaW5nO1xuICAgIFRBQkxFX05BTUU6IHN0cmluZztcbiAgICAvKiogQkFTRSBUQUJMRSBmb3IgYSB0YWJsZSwgVklFVyBmb3IgYSB2aWV3LCBvciBTWVNURU0gVklFVyBmb3IgYW4gSU5GT1JNQVRJT05fU0NIRU1BIHRhYmxlLiAqL1xuICAgIFRBQkxFX1RZUEU6IFwiQkFTRSBUQUJMRVwiIHwgXCJWSUVXXCIgfCBcIlNZU1RFTSBWSUVXXCI7XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEta2V5LWNvbHVtbi11c2FnZS10YWJsZS5odG1sICovXG4gIFwiaW5mb3JtYXRpb25fc2NoZW1hLktFWV9DT0xVTU5fVVNBR0VcIjoge1xuICAgIENPTlNUUkFJTlRfU0NIRU1BOiBzdHJpbmc7XG4gICAgQ09OU1RSQUlOVF9OQU1FOiBzdHJpbmc7XG4gICAgVEFCTEVfU0NIRU1BOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIENPTFVNTl9OQU1FOiBzdHJpbmc7XG4gICAgT1JESU5BTF9QT1NJVElPTjogbnVtYmVyO1xuICAgIC8qKiBudWxsIC0gd2hlbiB1bmlxdWUgb3IgcHJpbWFyeSBrZXkgY29uc3RyYWludC4gMS1uIC0gd2hlbiBmb3JlaWduIGtleSBjb25zdHJhaW50ICovXG4gICAgUE9TSVRJT05fSU5fVU5JUVVFX0NPTlNUUkFJTlQ6IG51bWJlciB8IG51bGw7XG4gICAgUkVGRVJFTkNFRF9UQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICBSRUZFUkVOQ0VEX1RBQkxFX05BTUU6IHN0cmluZztcbiAgICBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEtdGFibGUtY29uc3RyYWludHMtdGFibGUuaHRtbCAqL1xuICBcImluZm9ybWF0aW9uX3NjaGVtYS5UQUJMRV9DT05TVFJBSU5UU1wiOiB7XG4gICAgQ09OU1RSQUlOVF9TQ0hFTUE6IHN0cmluZztcbiAgICBDT05TVFJBSU5UX05BTUU6IHN0cmluZztcbiAgICBUQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICBUQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgQ09OU1RSQUlOVF9UWVBFOiBcIlBSSU1BUlkgS0VZXCIgfCBcIkZPUkVJR04gS0VZXCIgfCBcIlVOSVFVRVwiIHwgXCJDSEVDS1wiO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPikge1xuICByZXR1cm4gY29tcGlsZShcbiAgICBnZXRNeVNRTEJ1aWxkZXI8RGF0YWJhc2U+KHJlcXVpcmVtZW50cylcbiAgICAgIC5zZWxlY3RGcm9tKFwiaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBhcyB0XCIpXG4gICAgICAud2hlcmUoXCJ0LlRBQkxFX1NDSEVNQVwiLCBcIj1cIiwgc3FsPHN0cmluZz5gZGF0YWJhc2UoKWApXG4gICAgICAud2hlcmUoXCJ0LlRBQkxFX1RZUEVcIiwgXCJpblwiLCBbXCJCQVNFIFRBQkxFXCIsIFwiVklFV1wiXSlcbiAgICAgIC5zZWxlY3QoW1widC5UQUJMRV9TQ0hFTUEgYXMgc2NoZW1hXCIsIFwidC5UQUJMRV9OQU1FIGFzIG5hbWVcIiwgXCJ0LlRBQkxFX1RZUEUgYXMgdHlwZVwiXSlcbiAgICAgIC4kbmFycm93VHlwZTx7IHR5cGU6IFwiQkFTRSBUQUJMRVwiIHwgXCJWSUVXXCIgfT4oKVxuICAgICAgLnNlbGVjdCgoZWIpID0+XG4gICAgICAgIC8vIGBqc29uX2FycmF5YWdnYCBpZ25vcmVzIGBvcmRlciBieWAgaW5zaWRlIHRoZSBzdWJxdWVyeSwgc28gd2UgbmVlZCB0byBvcmRlciBhZnRlciBhZ2dyZWdhdGlvbi5cbiAgICAgICAganNvbkFycmF5RnJvbShcbiAgICAgICAgICBlYlxuICAgICAgICAgICAgLnNlbGVjdEZyb20oXCJpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBhcyBjXCIpXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJpbmZvcm1hdGlvbl9zY2hlbWEuS0VZX0NPTFVNTl9VU0FHRSBhcyBrY3VcIiwgKGpiKSA9PlxuICAgICAgICAgICAgICBqYlxuICAgICAgICAgICAgICAgIC5vblJlZihcImtjdS5UQUJMRV9TQ0hFTUFcIiwgXCI9XCIsIFwiYy5UQUJMRV9TQ0hFTUFcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJrY3UuVEFCTEVfTkFNRVwiLCBcIj1cIiwgXCJjLlRBQkxFX05BTUVcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJrY3UuQ09MVU1OX05BTUVcIiwgXCI9XCIsIFwiYy5DT0xVTU5fTkFNRVwiKVxuICAgICAgICAgICAgICAgIC8vIG9ubHkgZ2V0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgLm9uKFwia2N1LlBPU0lUSU9OX0lOX1VOSVFVRV9DT05TVFJBSU5UXCIsIFwiaXMgbm90XCIsIG51bGwpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwiaW5mb3JtYXRpb25fc2NoZW1hLktFWV9DT0xVTU5fVVNBR0UgYXMgcGtfa2N1XCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJwa19rY3UuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBcImMuVEFCTEVfU0NIRU1BXCIpXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwicGtfa2N1LlRBQkxFX05BTUVcIiwgXCI9XCIsIFwiYy5UQUJMRV9OQU1FXCIpXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwicGtfa2N1LkNPTFVNTl9OQU1FXCIsIFwiPVwiLCBcImMuQ09MVU1OX05BTUVcIilcbiAgICAgICAgICAgICAgICAvLyBvbmx5IGdldCBwcmltYXJ5IGtleSBjb25zdHJhaW50IC0gZ3VhcmFudGVlZCB0byBiZSBcIlBSSU1BUllcIiBldmVuIGlmIGEgbmFtZSB3YXMgZ2l2ZW4gZHVyaW5nIGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgLm9uKFwicGtfa2N1LkNPTlNUUkFJTlRfTkFNRVwiLCBcIj1cIiwgXCJQUklNQVJZXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLndoZXJlUmVmKFwiYy5UQUJMRV9TQ0hFTUFcIiwgXCI9XCIsIFwidC5UQUJMRV9TQ0hFTUFcIilcbiAgICAgICAgICAgIC53aGVyZVJlZihcImMuVEFCTEVfTkFNRVwiLCBcIj1cIiwgXCJ0LlRBQkxFX05BTUVcIilcbiAgICAgICAgICAgIC5zZWxlY3QoW1xuICAgICAgICAgICAgICBcImMuQ09MVU1OX05BTUUgYXMgbmFtZVwiLFxuICAgICAgICAgICAgICBcImMuQ09MVU1OX1RZUEUgYXMgZGF0YXR5cGVcIixcbiAgICAgICAgICAgICAgXCJjLk9SRElOQUxfUE9TSVRJT04gYXMgcG9zaXRpb25cIixcbiAgICAgICAgICAgICAgXCJrY3UuUkVGRVJFTkNFRF9UQUJMRV9OQU1FIGFzIGZrX3RhYmxlXCIsXG4gICAgICAgICAgICAgIFwia2N1LlJFRkVSRU5DRURfQ09MVU1OX05BTUUgYXMgZmtfY29sdW1uXCIsXG4gICAgICAgICAgICAgIFwicGtfa2N1Lk9SRElOQUxfUE9TSVRJT04gYXMgcGtcIixcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAgICAgICAgICBlYihcImMuRVhUUkFcIiwgXCI9XCIsIFwiYXV0b19pbmNyZW1lbnRcIikuYXMoXCJhdXRvaW5jcmVtZW50XCIpLFxuICAgICAgICAgICAgICBlYihcImMuRVhUUkFcIiwgXCJpblwiLCBbXCJvbiB1cGRhdGUgQ1VSUkVOVF9USU1FU1RBTVBcIiwgXCJTVE9SRUQgR0VORVJBVEVEXCIsIFwiVklSVFVBTCBHRU5FUkFURURcIl0pLmFzKFxuICAgICAgICAgICAgICAgIFwiY29tcHV0ZWRcIixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgZWIoXCJjLklTX05VTExBQkxFXCIsIFwiPVwiLCBcIllFU1wiKS5hcyhcIm51bGxhYmxlXCIpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICkuYXMoXCJjb2x1bW5zXCIpLFxuICAgICAgKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX1NDSEVNQVwiKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX05BTUVcIilcbiAgICAgIC5vcmRlckJ5KFwidC5UQUJMRV9UWVBFXCIpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RhYmxlc1F1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDEsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiaW50XCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBwb3NpdGlvbjogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiYmluYXJ5KDE2KVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcInV1aWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhcigyNTUpXCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiAzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luY3JlbWVudDogMCxcbiAgICAgICAgICBjb21wdXRlZDogMSxcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRfbmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiA0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG5hbWU6IFwiYW5pbWFsc1wiLFxuICAgICAgc2NoZW1hOiBcInN0dWRpb1wiLFxuICAgICAgdHlwZTogXCJCQVNFIFRBQkxFXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgcG9zaXRpb246IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiZW51bSgnYWRtaW4nLCdtYWludGFpbmVyJywnbWVtYmVyJylcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJyb2xlXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IDMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogXCJpZFwiLFxuICAgICAgICAgIGZrX3RhYmxlOiBcImFuaW1hbHNcIixcbiAgICAgICAgICBuYW1lOiBcImFuaW1hbF9pZFwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiA0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgIHNjaGVtYTogXCJzdHVkaW9cIixcbiAgICAgIHR5cGU6IFwiQkFTRSBUQUJMRVwiLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZVF1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgY29uc3QgYnVpbGRlciA9IGdldE15U1FMQnVpbGRlcihyZXF1aXJlbWVudHMpO1xuXG4gIGNvbnN0IHNlc3Npb25UeiA9IHNxbDxcIlNZU1RFTVwiIHwgKHN0cmluZyAmIHt9KT5gQEBzZXNzaW9uLnRpbWVfem9uZWA7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLnNlbGVjdE5vRnJvbShcbiAgICAgICAgYnVpbGRlclxuICAgICAgICAgIC5jYXNlKClcbiAgICAgICAgICAud2hlbihzZXNzaW9uVHosIFwiPVwiLCBcIlNZU1RFTVwiKVxuICAgICAgICAgIC50aGVuKHNxbDxzdHJpbmc+YEBAc3lzdGVtX3RpbWVfem9uZWApXG4gICAgICAgICAgLmVsc2Uoc2Vzc2lvblR6KVxuICAgICAgICAgIC5lbmQoKVxuICAgICAgICAgIC5hcyhcInRpbWV6b25lXCIpLFxuICAgICAgKVxuICAgICAgLiRuYXJyb3dUeXBlPHsgdGltZXpvbmU6IHN0cmluZyB9PigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RpbWV6b25lUXVlcnkoKSB7XG4gIHJldHVybiBbeyB0aW1lem9uZTogXCJVVENcIiB9XSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8dHlwZW9mIGdldFRpbWV6b25lUXVlcnk+O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9teXNxbC5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG5pbXBvcnQgeyBnZXRKc29uT2JqZWN0QXJncyB9IGZyb20gJy4uL3V0aWwvanNvbi1vYmplY3QtYXJncy5qcyc7XG4vKipcbiAqIEEgTXlTUUwgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IGludG8gYSBKU09OIGFycmF5LlxuICpcbiAqIE5PVEU6IFRoaXMgaGVscGVyIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBmdWxseSB3b3JrIHdpdGggdGhlIGJ1aWx0LWluIGBNeXNxbERpYWxlY3RgLlxuICogV2hpbGUgdGhlIHByb2R1Y2VkIFNRTCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIE15U1FMIGRhdGFiYXNlcywgc29tZSB0aGlyZC1wYXJ0eSBkaWFsZWN0c1xuICogbWF5IG5vdCBwYXJzZSB0aGUgbmVzdGVkIEpTT04gaW50byBhcnJheXMuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpblxuICogYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uQXJyYXlGcm9tIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvbXlzcWwnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQXJyYXlGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAub3JkZXJCeSgncGV0Lm5hbWUnKVxuICogICAgICkuYXMoJ3BldHMnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdPy5pZFxuICogcmVzdWx0WzBdPy5wZXRzWzBdPy5wZXRfaWRcbiAqIHJlc3VsdFswXT8ucGV0c1swXT8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBgaWRgLCAoXG4gKiAgIHNlbGVjdCBjYXN0KGNvYWxlc2NlKGpzb25fYXJyYXlhZ2coanNvbl9vYmplY3QoXG4gKiAgICAgJ3BldF9pZCcsIGBhZ2dgLmBwZXRfaWRgLFxuICogICAgICduYW1lJywgYGFnZ2AuYG5hbWVgXG4gKiAgICkpLCAnW10nKSBhcyBqc29uKSBmcm9tIChcbiAqICAgICBzZWxlY3QgYHBldGAuYGlkYCBhcyBgcGV0X2lkYCwgYHBldGAuYG5hbWVgXG4gKiAgICAgZnJvbSBgcGV0YFxuICogICAgIHdoZXJlIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gKiAgICAgb3JkZXIgYnkgYHBldGAuYG5hbWVgXG4gKiAgICkgYXMgYGFnZ2BcbiAqICkgYXMgYHBldHNgXG4gKiBmcm9tIGBwZXJzb25gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25BcnJheUZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QgY2FzdChjb2FsZXNjZShqc29uX2FycmF5YWdnKGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0TXlzcWxKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnYWdnJykpfSkpLCAnW10nKSBhcyBqc29uKSBmcm9tICR7ZXhwcn0gYXMgYWdnKWA7XG59XG4vKipcbiAqIEEgTXlTUUwgaGVscGVyIGZvciB0dXJuaW5nIGEgc3VicXVlcnkgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIFRoZSBzdWJxdWVyeSBtdXN0IG9ubHkgcmV0dXJuIG9uZSByb3cuXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYE15c3FsRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgTXlTUUwgZGF0YWJhc2VzLCBzb21lIHRoaXJkLXBhcnR5IGRpYWxlY3RzXG4gKiBtYXkgbm90IHBhcnNlIHRoZSBuZXN0ZWQgSlNPTiBpbnRvIG9iamVjdHMuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpblxuICogYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uT2JqZWN0RnJvbSB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL215c3FsJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbk9iamVjdEZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC53aGVyZSgncGV0LmlzX2Zhdm9yaXRlJywgJz0nLCB0cnVlKVxuICogICAgICkuYXMoJ2Zhdm9yaXRlX3BldCcpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ucGV0X2lkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBgaWRgLCAoXG4gKiAgIHNlbGVjdCBqc29uX29iamVjdChcbiAqICAgICAncGV0X2lkJywgYG9iamAuYHBldF9pZGAsXG4gKiAgICAgJ25hbWUnLCBgb2JqYC5gbmFtZWBcbiAqICAgKSBmcm9tIChcbiAqICAgICBzZWxlY3QgYHBldGAuYGlkYCBhcyBgcGV0X2lkYCwgYHBldGAuYG5hbWVgXG4gKiAgICAgZnJvbSBgcGV0YFxuICogICAgIHdoZXJlIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gKiAgICAgYW5kIGBwZXRgLmBpc19mYXZvcml0ZWAgPSA/XG4gKiAgICkgYXMgb2JqXG4gKiApIGFzIGBmYXZvcml0ZV9wZXRgXG4gKiBmcm9tIGBwZXJzb25gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25PYmplY3RGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0TXlzcWxKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnb2JqJykpfSkgZnJvbSAke2V4cHJ9IGFzIG9iailgO1xufVxuLyoqXG4gKiBUaGUgTXlTUUwgYGpzb25fb2JqZWN0YCBmdW5jdGlvbi5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZnVsbHkgd29yayB3aXRoIHRoZSBidWlsdC1pbiBgTXlzcWxEaWFsZWN0YC5cbiAqIFdoaWxlIHRoZSBwcm9kdWNlZCBTUUwgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBNeVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBlYi5mbignY29uY2F0JywgWydmaXJzdF9uYW1lJywgZWIudmFsKCcgJyksICdsYXN0X25hbWUnXSlcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIGpzb25fb2JqZWN0KFxuICogICAnZmlyc3QnLCBmaXJzdF9uYW1lLFxuICogICAnbGFzdCcsIGxhc3RfbmFtZSxcbiAqICAgJ2Z1bGwnLCBjb25jYXQoYGZpcnN0X25hbWVgLCA/LCBgbGFzdF9uYW1lYClcbiAqICkgYXMgXCJuYW1lXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQnVpbGRPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHNxbCBganNvbl9vYmplY3QoJHtzcWwuam9pbihPYmplY3Qua2V5cyhvYmopLmZsYXRNYXAoKGspID0+IFtzcWwubGl0KGspLCBvYmpba11dKSl9KWA7XG59XG5mdW5jdGlvbiBnZXRNeXNxbEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ015U1FMIGpzb25BcnJheUZyb20gYW5kIGpzb25PYmplY3RGcm9tIGZ1bmN0aW9ucyBjYW4gb25seSBoYW5kbGUgZXhwbGljaXQgc2VsZWN0aW9ucyBkdWUgdG8gbGltaXRhdGlvbnMgb2YgdGhlIGpzb25fb2JqZWN0IGZ1bmN0aW9uLiBzZWxlY3RBbGwoKSBpcyBub3QgYWxsb3dlZCBpbiB0aGUgc3VicXVlcnkuJyk7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7cVJBQUFBLElDQUFDLElDQUFDLElBRU8sSUFBTUMsRUFBd0UsQ0FDbkYsT0FBUSxDQUNOLE1BQU8sU0FDVCxFQUNBLE9BQVEsQ0FDTixNQUFPLFFBQ1QsRUFDQSxJQUFLLENBQ0gsTUFBTyxLQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sUUFDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFDQSxjQUFlLENBQ2IsTUFBTyxRQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sVUFDVCxFQUNBLFNBQVUsQ0FDUixNQUFPLFVBQ1QsRUFDQSxJQUFLLENBQ0gsTUFBTyxTQUNULEVBQ0EsUUFBUyxDQUNQLE1BQU8sU0FDVCxFQUNBLE9BQVEsQ0FDTixNQUFPLFNBQ1QsRUFDQSxtQkFBb0IsQ0FDbEIsTUFBTyxTQUNULEVBQ0EsS0FBTSxDQUNK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QUFKLEVBQVEsU0FBQUcsRUFBVSxNQUZqQyxDQUFFLFdBQVksQ0FBQyxFQUFHLElBQUssVUFBVyxDQUVLLENBQUMsQ0FjeEQsQ0FFQSxTQUFTckIsRUFBYUgsRUFBcUUsQ0FDekYsR0FBTSxDQUFDK0MsRUFBUUMsQ0FBTSxFQUFJaEQsRUFFekIsTUFBTyxDQUNMLFdBQVkrQyxFQUFPLFdBQVcsT0FBT0MsRUFBTyxVQUFVLEVBQ3RELElBQUssR0FBR0QsRUFBTyxHQUFHO0FBQUEsRUFBTUMsRUFBTyxHQUFHLEVBQ3BDLENBQ0YiLAogICJuYW1lcyI6IFsiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiaW5pdF9kZWZpbmVfQUNDRUxFUkFURV9TQ0hFTUFfQllfUFJPVklERVIiLCAiTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJnZXRNeVNRTEJ1aWxkZXIiLCAicmVxdWlyZW1lbnRzIiwgImdldEJ1aWxkZXIiLCAiTXlzcWxBZGFwdGVyIiwgIk15c3FsUXVlcnlDb21waWxlciIsICJnZXREZWxldGVRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJyb3dzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgImJ1aWxkZXIiLCAiZ2V0TXlTUUxCdWlsZGVyIiwgImNvbXBpbGUiLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAiYXBwbHlUcmFuc2Zvcm1hdGlvbnMiLCAiZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5IiwgImNyaXRlcmlhIiwgImdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMiLCAiZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5IiwgImNoYW5nZXMiLCAicm93IiwgImdldFNlbGVjdFF1ZXJ5IiwgImZpbHRlciIsICJwYWdlSW5kZXgiLCAicGFnZVNpemUiLCAic29ydE9yZGVyIiwgImZpbHRlckV4cHJlc3Npb24iLCAiZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiIsICJBR0dfTkFNRSIsICJDT1VOVF9SRUYiLCAiY291bnRRdWVyeSIsICJlYiIsICJzcWwiLCAiamIiLCAicWIiLCAiaXRlbSIsICJtb2NrU2VsZWN0UXVlcnkiLCAiZ2V0VXBkYXRlUXVlcnkiLCAic2NoZW1hIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImpzb25BcnJheUZyb20iLCAiZXhwciIsICJzcWwiLCAiZ2V0TXlzcWxKc29uT2JqZWN0QXJncyIsICJnZXRNeXNxbEpzb25PYmplY3RBcmdzIiwgIm5vZGUiLCAidGFibGUiLCAiZ2V0SnNvbk9iamVjdEFyZ3MiLCAiZ2V0VGFibGVzUXVlcnkiLCAicmVxdWlyZW1lbnRzIiwgImNvbXBpbGUiLCAiZ2V0TXlTUUxCdWlsZGVyIiwgInNxbCIsICJlYiIsICJqc29uQXJyYXlGcm9tIiwgImpiIiwgIm1vY2tUYWJsZXNRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgImJ1aWxkZXIiLCAic2Vzc2lvblR6IiwgIm1vY2tUaW1lem9uZVF1ZXJ5IiwgImNyZWF0ZU15U1FMQWRhcHRlciIsICJyZXF1aXJlbWVudHMiLCAiZXhlY3V0b3IiLCAib3RoZXJSZXF1aXJlbWVudHMiLCAiZGV0YWlscyIsICJvcHRpb25zIiwgInF1ZXJ5IiwgImdldERlbGV0ZVF1ZXJ5IiwgImVycm9yIiwgImNyZWF0ZUFkYXB0ZXJFcnJvciIsICJyb3dzIiwgInRhYmxlIiwgImNvbHVtbnMiLCAiYXV0b2luY3JlbWVudENvbHVtbiIsICJjb2x1bW4iLCAiZmlsdGVyT2JqZWN0cyIsICJyb3ciLCAiaW5mZXJGaWx0ZXJPYmplY3QiLCAiaGFzUGFydGlhbEZpbHRlck9iamVjdHMiLCAiZmlsdGVyT2JqZWN0IiwgImZpbHRlclZhbHVlcyIsICJ2YWx1ZSIsICJnZXRJbnNlcnRRdWVyeSIsICJpbnNlcnRRdWVyeSIsICJyZWZldGNoUXVlcnkiLCAiZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5IiwgInNlcXVlbmNlIiwgImluc2VydEVycm9yIiwgIm1heWJlUmVmZXRjaFJlc3VsdCIsICJqb2luU2VxdWVuY2UiLCAicmVmZXRjaEVycm9yIiwgInJlZmV0Y2hSZXN1bHRzIiwgInJlc3VsdHMiLCAicmVzdWx0IiwgImF1dG9pbmNyZW1lbnRDb2x1bW5OYW1lIiwgImFjYyIsICJjb2x1bW5OYW1lIiwgInJlZmV0Y2hlZFJvdyIsICJpbnNlcnRlZFJvd3MiLCAiZXJyb3JzIiwgImkiLCAiaW5kZXgiLCAidGFibGVzUXVlcnkiLCAiZ2V0VGFibGVzUXVlcnkiLCAidGltZXpvbmVRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgInRhYmxlc0Vycm9yIiwgInRhYmxlcyIsICJ0aW1lem9uZUVycm9yIiwgInRpbWV6b25lcyIsICJ0aW1lem9uZSIsICJjcmVhdGVJbnRyb3NwZWN0aW9uIiwgImdldFNlbGVjdFF1ZXJ5IiwgInVwZGF0ZVF1ZXJ5IiwgImdldFVwZGF0ZVF1ZXJ5IiwgImdldFVwZGF0ZVJlZmV0Y2hRdWVyeSIsICJ1cGRhdGVFcnJvciIsICJyZWZldGNoUmVzdWx0IiwgImFyZ3MiLCAic2NoZW1hcyIsICJ0YWJsZU5hbWUiLCAic2NoZW1hIiwgImNvbHVtbnNSZWNvcmQiLCAiYSIsICJiIiwgImRhdGF0eXBlIiwgImluZGV4T2ZQYXJlbnRoZXNpcyIsICJzdHJpcHBlZERhdGFUeXBlIiwgIk1ZU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEEiLCAiZmlsdGVyT3BlcmF0b3JzIiwgIm1vY2tJbnRyb3NwZWN0IiwgIm1vY2tUYWJsZXNRdWVyeSIsICJtb2NrVGltZXpvbmVRdWVyeSIsICJxdWVyeTAiLCAicXVlcnkxIl0KfQo=
@@ -1,5 +1,5 @@
1
1
  import { Pool } from 'mysql2/promise';
2
- import { S as SequenceExecutor } from '../../index-CqM65jmE.cjs';
2
+ import { S as SequenceExecutor } from '../../index-rgorTaJw.cjs';
3
3
  import 'kysely';
4
4
 
5
5
  declare function createMySQL2Executor(pool: Pool): SequenceExecutor;
@@ -1,5 +1,5 @@
1
1
  import { Pool } from 'mysql2/promise';
2
- import { S as SequenceExecutor } from '../../index-CqM65jmE.js';
2
+ import { S as SequenceExecutor } from '../../index-rgorTaJw.js';
3
3
  import 'kysely';
4
4
 
5
5
  declare function createMySQL2Executor(pool: Pool): SequenceExecutor;
@@ -1,5 +1,5 @@
1
1
  import { DatabaseSync } from 'node:sqlite';
2
- import { c as Executor } from '../../index-CqM65jmE.cjs';
2
+ import { c as Executor } from '../../index-rgorTaJw.cjs';
3
3
  import 'kysely';
4
4
 
5
5
  declare function createNodeSQLiteExecutor(database: DatabaseSync): Executor;
@@ -1,5 +1,5 @@
1
1
  import { DatabaseSync } from 'node:sqlite';
2
- import { c as Executor } from '../../index-CqM65jmE.js';
2
+ import { c as Executor } from '../../index-rgorTaJw.js';
3
3
  import 'kysely';
4
4
 
5
5
  declare function createNodeSQLiteExecutor(database: DatabaseSync): Executor;