@dockstat/outline-sync 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +13 -13
  2. package/dist/cli.js +14 -14
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # outline-sync — `@dockstat/outline-sync`
2
2
 
3
3
  Sync Outline (app.getoutline.com) collections ↔ Markdown in your repo.
4
- Designed for Bun (`bunx`) and multi-collection pipelines.
4
+ Designed for multi-collection pipelines.
5
5
  Features:
6
6
 
7
7
  * Two-way sync (pull / push / timestamp-based sync)
8
8
  * Multi-collection support (`--collection` repeatable)
9
- * Folder-based default storage (each page → `<slug>/index.md`, children inherit folders)
9
+ * Folder-based default storage (each page → `<slug>/README.md`, children inherit folders)
10
10
  * Per-collection mapping file for custom paths
11
11
  * Config-driven: `configs/outline-sync.json`, `<collection>.config.json`, `<collection>.pages.json`
12
12
  * Whitespace/newline-agnostic diffs (formatting-only changes are ignored)
@@ -54,7 +54,7 @@ This creates/updates:
54
54
  * `configs/outline-sync.json` — top-level config listing collections
55
55
  * `configs/<collection-id>.config.json` — per-collection mapping config
56
56
  * `configs/<collection-id>.pages.json` — assembled manifest of pages (used by sync)
57
- * `docs/...` — markdown files saved folder-based (`<slug>/index.md`)
57
+ * `docs/...` — markdown files saved folder-based (`<slug>/README.md`)
58
58
 
59
59
  4. Run a dry-run sync:
60
60
 
@@ -143,11 +143,11 @@ docs/ # markdown files (default saveDir)
143
143
  "mappings": [
144
144
  {
145
145
  "match": { "id": "doc-id-123" },
146
- "path": "guides/setup/" // directory mapping → will place doc as guides/setup/index.md
146
+ "path": "guides/setup/" // directory mapping → will place doc as guides/setup/README.md
147
147
  },
148
148
  {
149
149
  "match": { "title": "API Reference" },
150
- "path": "reference/index.md" // explicit filename mapping
150
+ "path": "reference/README.md" // explicit filename mapping
151
151
  }
152
152
  ]
153
153
  }
@@ -158,8 +158,8 @@ Rules:
158
158
  * Match by `id` (preferred) or `title` (exact match).
159
159
  * `path` can be:
160
160
 
161
- * directory-like (`guides/setup/` or any path without `.md`) → page becomes `<path>/index.md` and children inherit that directory,
162
- * explicit file (`reference/index.md`) → used verbatim (relative to project root unless you give an absolute path),
161
+ * directory-like (`guides/setup/` or any path without `.md`) → page becomes `<path>/README.md` and children inherit that directory,
162
+ * explicit file (`reference/README.md`) → used verbatim (relative to project root unless you give an absolute path),
163
163
  * bare filename → placed under parent directory or `saveDir`.
164
164
 
165
165
  ## `configs/<collection_id>.pages.json` (generated)
@@ -172,12 +172,12 @@ This is a manifest of pages used by the sync engine. Example:
172
172
  "pages": [
173
173
  {
174
174
  "title": "Product",
175
- "file": "docs/product/index.md",
175
+ "file": "docs/product/README.md",
176
176
  "id": "doc-product-id",
177
177
  "children": [
178
178
  {
179
179
  "title": "Getting Started",
180
- "file": "docs/product/getting-started/index.md",
180
+ "file": "docs/product/getting-started/README.md",
181
181
  "id": "doc-getting-started-id",
182
182
  "children": []
183
183
  }
@@ -208,7 +208,7 @@ Default behavior: folder-based.
208
208
  For each page:
209
209
 
210
210
  ```
211
- <saveDir>/<ancestor-slug>/<page-slug>/index.md
211
+ <saveDir>/<ancestor-slug>/<page-slug>/README.md
212
212
  ```
213
213
 
214
214
  Example Outline structure:
@@ -222,9 +222,9 @@ Example Outline structure:
222
222
  Results in:
223
223
 
224
224
  ```
225
- docs/product/index.md
226
- docs/product/getting-started/index.md
227
- docs/product/getting-started/install/index.md
225
+ docs/product/README.md
226
+ docs/product/getting-started/README.md
227
+ docs/product/getting-started/install/README.md
228
228
  ```
229
229
 
230
230
  You can override per-page locations in the `<collection_id>.config.json` mappings (see above).
package/dist/cli.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var vj=Object.defineProperty;var f=(u,$)=>{for(var j in $)vj(u,j,{get:$[j],enumerable:!0,configurable:!0,set:(J)=>$[j]=()=>J})};var b=(u,$)=>()=>(u&&($=u(u=0)),$);var $j={};f($j,{sleep:()=>Gj,saveTopConfig:()=>xj,saveCollectionConfig:()=>_j,loadTopConfig:()=>d,loadCollectionConfig:()=>Oj,getCollectionTopConfig:()=>Nj,getCollectionFilesBase:()=>p,ensureConfigDir:()=>g,TOP_CONFIG_FILE:()=>P,CONFIG_DIR:()=>L});import G from"node:fs/promises";import{existsSync as s}from"node:fs";import S from"node:path";async function g(){if(!s(L))await G.mkdir(L,{recursive:!0})}async function d(){if(!s(P))return null;let u=await G.readFile(P,"utf8");return JSON.parse(u)}async function xj(u){await g(),await G.writeFile(P,`${JSON.stringify(u,null,2)}
4
- `,"utf8")}async function p(u){let $=await d();if(!$||!$.collections)return{pagesFile:S.join(L,`${u}.pages.json`),configFile:S.join(L,`${u}.config.json`),saveDir:"docs"};let j=$.collections.find((J)=>J.id===u);if(!j)return{pagesFile:S.join(L,`${u}.pages.json`),configFile:S.join(L,`${u}.config.json`),saveDir:"docs"};return{pagesFile:j.pagesFile||S.join(L,`${u}.pages.json`),configFile:j.configFile||S.join(L,`${u}.config.json`),saveDir:j.saveDir||"docs"}}async function Oj(u){let{configFile:$}=await p(u);if(!s($))return null;let j=await G.readFile($,"utf8");return JSON.parse(j)}async function Nj(u){let $=await d();if(!$||!$.collections)return null;return $.collections.find((j)=>j.id===u)||null}async function _j(u){await g();let{configFile:$}=await p(u.collectionId);await G.writeFile($,`${JSON.stringify(u,null,2)}
5
- `,"utf8")}var L="configs",P,Gj=(u)=>new Promise(($)=>setTimeout($,u));var wj=b(()=>{P=S.join("outline-sync.json")});async function x(u,$,j=3){let J=`${qj}/api/${u}`;for(let w=0;w<j;w++)try{let q=await fetch(J,{method:"POST",headers:Pj,body:JSON.stringify($)});if(q.status===429){let E=1000*(w+1);console.warn(`Rate limited. backing off ${E}ms`),await new Promise((Z)=>setTimeout(Z,E));continue}let A=await q.json();if(!q.ok)throw console.error(`[Outline@${qj}/api/${u}] ${q.status} ${u} payload=`,$,"response=",A),new Error(`Outline API error ${q.status}: ${JSON.stringify(A)}`);return A}catch(q){if(w===j-1)throw q;console.warn(`Request failed (attempt ${w+1}): ${q}. Retrying...`),await new Promise((A)=>setTimeout(A,500*(w+1)))}throw new Error("outlineRequest: unreachable")}async function Jj(){let u=[],$=0,j=100;while(!0){let w=(await x("collections.list",{offset:$,limit:j})).data||[];for(let q of w)u.push({id:q.id,name:q.name});if(w.length<j)break;$+=w.length}return u}async function Kj(u){let $=[],j=0,J=100;while(!0){let q=(await x("documents.list",{collectionId:u,offset:j,limit:J})).data||[];for(let A of q)$.push(A);if(q.length<J)break;j+=q.length}return $}async function Ej(u){return(await x("documents.info",{id:u})).data??null}async function Hj(u,$,j,J){return(await x("documents.create",{title:u,text:$,collectionId:j,parentDocumentId:J||null,publish:!0})).data}async function c(u,$,j){let J={id:u,text:j,publish:!0};if($)J.title=$;return(await x("documents.update",J)).data}var qj,Rj,Pj;var n=b(()=>{qj=process.env.OUTLINE_BASE_URL||"https://app.getoutline.com",Rj=process.env.OUTLINE_API_KEY||"",Pj={Authorization:`Bearer ${Rj}`,"Content-Type":"application/json"}});import T from"node:fs/promises";import{existsSync as t}from"node:fs";import M from"node:path";async function m(){if(!t(U))await T.mkdir(U,{recursive:!0})}async function D(){if(!t(a))return null;let u=await T.readFile(a,"utf8");return JSON.parse(u)}async function i(u){await m(),await T.writeFile(a,`${JSON.stringify(u,null,2)}
6
- `,"utf8")}async function y(u){let $=await D();if(!$||!$.collections)return{pagesFile:M.join(U,`${u}.pages.json`),configFile:M.join(U,`${u}.config.json`),saveDir:"docs"};let j=$.collections.find((J)=>J.id===u);if(!j)return{pagesFile:M.join(U,`${u}.pages.json`),configFile:M.join(U,`${u}.config.json`),saveDir:"docs"};return{pagesFile:j.pagesFile||M.join(U,`${u}.pages.json`),configFile:j.configFile||M.join(U,`${u}.config.json`),saveDir:j.saveDir||"docs"}}async function Aj(u){let{configFile:$}=await y(u);if(!t($))return null;let j=await T.readFile($,"utf8");return JSON.parse(j)}var U="configs",a;var l=b(()=>{a=M.join("outline-sync.json")});import F from"node:fs/promises";import{existsSync as Tj}from"node:fs";import Qj from"node:path";import{spawnSync as mj}from"node:child_process";function o(u){return u.replace(/\s+/g,"")}function O(u){return u.toString().normalize("NFKD").replace(/\p{M}/gu,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)+/g,"").slice(0,120)}function Dj(u){try{let $=Qj.resolve(u),j=mj("git",["log","-1","--format=%ct","--",$],{cwd:process.cwd(),encoding:"utf8"});if(j.status!==0)return null;let J=(j.stdout||"").trim();if(!J)return null;let w=Number(J);if(Number.isNaN(w))return null;return w*1000}catch{return null}}async function Vj(u){let $=Dj(u);if($)return $;return(await F.stat(u)).mtimeMs}async function h(u,$,j=!1){if(Tj(u)){let J=`${u}.outline-sync.bak.${Date.now()}`;if(!j)await F.copyFile(u,J);console.log(`Backed up existing file to ${J}`)}else if(!j)await F.mkdir(Qj.dirname(u),{recursive:!0});if(!j)await F.writeFile(u,$,"utf8");else console.log(`[dry-run] would write file ${u} (${$.length} bytes)`)}var e=()=>{};var Zj={};f(Zj,{question:()=>Xj,listCollectionsPrompt:()=>hj,bootstrapCollection:()=>Cj});import C from"node:fs/promises";import{existsSync as Fj}from"node:fs";import v from"node:path";async function hj(u){let $=await Jj();if(!$.length){console.log("No collections found for this API key.");return}if(console.log("Collections:"),$.forEach((E,Z)=>console.log(`${Z+1}) ${E.id} ${E.name}`)),u.nonInteractive)return;let j=await Xj("Select a collection by number (or press Enter to cancel): "),J=Number(j.trim());if(!J||J<1||J>$.length){console.log("Cancelled.");return}let w=$[J-1];console.log(`You chose: ${w.name} (${w.id})`),await m();let q=await D()||{collections:[]};if(!q.collections.find((E)=>E.id===w.id))q.collections.unshift({id:w.id,name:w.name,saveDir:"docs",pagesFile:v.join("configs",`${w.id}.pages.json`),configFile:v.join("configs",`${w.id}.config.json`)}),await i(q),console.log(`Added collection to ${v.join("configs","outline-sync.json")}`);else console.log("Collection already configured.")}function Xj(u){return new Promise(($)=>{process.stdout.write(u),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.once("data",(j)=>{process.stdin.pause(),$(j.toString())})})}async function Cj(u){let{collectionId:$,dryRun:j=!1}=u;console.log(`Bootstrapping collection ${$} (dryRun=${j})...`);let J=await Kj($);console.log(`Fetched ${J.length} documents from Outline.`);let w=new Map;for(let K of J)w.set(K.id,{title:K.title,file:"",id:K.id,children:[],raw:K});let q=[];for(let K of w.values()){let z=K.raw||{},W=z.parentDocumentId??z.parentId??null;if(W&&w.has(W))w.get(W).children.push(K);else q.push(K)}let{saveDir:A}=await y($);function E(K,z){let W=O(K.title||"untitled"),I=v.join(z,W),yj=v.join(I,"index.md");if(K.file=yj,K.children?.length)for(let bj of K.children)E(bj,I)}for(let K of q)E(K,A);for(let K of w.values()){let z=K.file,W=K.raw?.text??`# ${K.title}
3
+ var Gj=Object.defineProperty;var f=($,u)=>{for(var j in u)Gj($,j,{get:u[j],enumerable:!0,configurable:!0,set:(w)=>u[j]=()=>w})};var y=($,u)=>()=>($&&(u=$($=0)),u);var wj={};f(wj,{sleep:()=>Oj,saveTopConfig:()=>Nj,saveCollectionConfig:()=>Rj,loadTopConfig:()=>s,loadCollectionConfig:()=>_j,getCollectionTopConfig:()=>xj,getCollectionFilesBase:()=>g,ensureConfigDirs:()=>uj,ensureConfigDir:()=>$j,TOP_CONFIG_FILE:()=>T});import b from"node:fs/promises";import{existsSync as m}from"node:fs";import U from"node:path";async function $j($){if(!m($))await b.mkdir($,{recursive:!0})}async function uj($){let u=$.collections;for(let j of u){let w=j.configDir;if(!m(w))await b.mkdir(w,{recursive:!0})}}async function s(){if(!m(T))return null;let $=await b.readFile(T,"utf8");return JSON.parse($)}async function Nj($){await uj($),await b.writeFile(T,`${JSON.stringify($,null,2)}
4
+ `,"utf8")}async function g($){let u=await s(),j=u.collections.find((J)=>J.id===$).configDir;if(!u||!u.collections)return{pagesFile:U.join(j,`${$}.pages.json`),configFile:U.join(j,`${$}.config.json`),saveDir:"docs",configDir:j};let w=u.collections.find((J)=>J.id===$);if(!w)return{pagesFile:U.join(j,`${$}.pages.json`),configFile:U.join(j,`${$}.config.json`),saveDir:"docs",configDir:".config"};return{pagesFile:w.pagesFile||U.join(j,`${$}.pages.json`),configFile:w.configFile||U.join(j,`${$}.config.json`),saveDir:w.saveDir||"docs",configDir:w.configFile||".config"}}async function _j($){let{configFile:u}=await g($);if(!m(u))return null;let j=await b.readFile(u,"utf8");return JSON.parse(j)}async function xj($){let u=await s();if(!u||!u.collections)return null;return u.collections.find((j)=>j.id===$)||null}async function Rj($){let{configFile:u,configDir:j}=await g($.collectionId);await $j(j),await b.writeFile(u,`${JSON.stringify($,null,2)}
5
+ `,"utf8")}var T,Oj=($)=>new Promise((u)=>setTimeout(u,$));var Jj=y(()=>{T=U.join("outline-sync.json")});async function G($,u,j=3){let w=`${Kj}/api/${$}`;for(let J=0;J<j;J++)try{let K=await fetch(w,{method:"POST",headers:Tj,body:JSON.stringify(u)});if(K.status===429){let H=1000*(J+1);console.warn(`Rate limited. backing off ${H}ms`),await new Promise((V)=>setTimeout(V,H));continue}let A=await K.json();if(!K.ok)throw console.error(`[Outline@${Kj}/api/${$}] ${K.status} ${$} payload=`,u,"response=",A),new Error(`Outline API error ${K.status}: ${JSON.stringify(A)}`);return A}catch(K){if(J===j-1)throw K;console.warn(`Request failed (attempt ${J+1}): ${K}. Retrying...`),await new Promise((A)=>setTimeout(A,500*(J+1)))}throw new Error("outlineRequest: unreachable")}async function qj(){let $=[],u=0,j=100;while(!0){let J=(await G("collections.list",{offset:u,limit:j})).data||[];for(let K of J)$.push({id:K.id,name:K.name});if(J.length<j)break;u+=J.length}return $}async function Ej($){let u=[],j=0,w=100;while(!0){let K=(await G("documents.list",{collectionId:$,offset:j,limit:w})).data||[];for(let A of K)u.push(A);if(K.length<w)break;j+=K.length}return u}async function Hj($){return(await G("documents.info",{id:$})).data??null}async function Aj($,u,j,w){return(await G("documents.create",{title:$,text:u,collectionId:j,parentDocumentId:w||null,publish:!0})).data}async function d($,u,j){let w={id:$,text:j,publish:!0};if(u)w.title=u;return(await G("documents.update",w)).data}var Kj,Pj,Tj;var p=y(()=>{Kj=process.env.OUTLINE_BASE_URL||"https://app.getoutline.com",Pj=process.env.OUTLINE_API_KEY||"",Tj={Authorization:`Bearer ${Pj}`,"Content-Type":"application/json"}});import O from"node:fs/promises";import{existsSync as D}from"node:fs";import M from"node:path";async function Qj($){if(!D($))await O.mkdir($,{recursive:!0})}async function t($){let u=$.collections;for(let j of u){let w=j.configDir;if(!D(w))await O.mkdir(w,{recursive:!0})}}async function N(){if(!D(a))return null;let $=await O.readFile(a,"utf8");return JSON.parse($)}async function n($){await t($),await O.writeFile(a,`${JSON.stringify($,null,2)}
6
+ `,"utf8")}async function S($){let u=await N(),j=u.collections.find((J)=>J.id===$).configDir;if(!u||!u.collections)return{pagesFile:M.join(j,`${$}.pages.json`),configFile:M.join(j,`${$}.config.json`),saveDir:"docs",configDir:j};let w=u.collections.find((J)=>J.id===$);if(!w)return{pagesFile:M.join(j,`${$}.pages.json`),configFile:M.join(j,`${$}.config.json`),saveDir:"docs",configDir:".config"};return{pagesFile:w.pagesFile||M.join(j,`${$}.pages.json`),configFile:w.configFile||M.join(j,`${$}.config.json`),saveDir:w.saveDir||"docs",configDir:w.configFile||".config"}}async function Vj($){let{configFile:u}=await S($);if(!D(u))return null;let j=await O.readFile(u,"utf8");return JSON.parse(j)}var a;var c=y(()=>{a=M.join("outline-sync.json")});import F from"node:fs/promises";import{existsSync as mj}from"node:fs";import Xj from"node:path";import{spawnSync as Dj}from"node:child_process";function i($){return $.replace(/\s+/g,"")}function _($){return $.toString().normalize("NFKD").replace(/\p{M}/gu,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)+/g,"").slice(0,120)}function Fj($){try{let u=Xj.resolve($),j=Dj("git",["log","-1","--format=%ct","--",u],{cwd:process.cwd(),encoding:"utf8"});if(j.status!==0)return null;let w=(j.stdout||"").trim();if(!w)return null;let J=Number(w);if(Number.isNaN(J))return null;return J*1000}catch{return null}}async function Zj($){let u=Fj($);if(u)return u;return(await F.stat($)).mtimeMs}async function h($,u,j=!1){if(mj($)){let w=`${$}.outline-sync.bak.${Date.now()}`;if(!j)await F.copyFile($,w);console.log(`Backed up existing file to ${w}`)}else if(!j)await F.mkdir(Xj.dirname($),{recursive:!0});if(!j)await F.writeFile($,u,"utf8");else console.log(`[dry-run] would write file ${$} (${u.length} bytes)`)}var l=()=>{};var zj={};f(zj,{question:()=>o,listCollectionsPrompt:()=>Cj,bootstrapCollection:()=>Ij});import C from"node:fs/promises";import{existsSync as hj}from"node:fs";import v from"node:path";async function Cj($){let u=await qj();if(!u.length){console.log("No collections found for this API key.");return}if(console.log("Collections:"),u.forEach((V,Q)=>console.log(`${Q+1}) ${V.id} ${V.name}`)),$.nonInteractive)return;let j=await o("Select a collection by number (or press Enter to cancel): "),w=Number(j.trim());if(!w||w<1||w>u.length){console.log("Cancelled.");return}let J=u[w-1];console.log(`You chose: ${J.name} (${J.id})`),await t(await N());let K=await N()||{collections:[]},A=K.collections.find((V)=>V.id===J.id),H=await o("Enter a base folder path for the collections config files (or press enter for default `.config`): ");if(H.trim().length<=1)H=".config";if(!A)K.collections.unshift({id:J.id,name:J.name,configDir:H,saveDir:"docs",pagesFile:v.join("configs",`${J.id}.pages.json`),configFile:v.join("configs",`${J.id}.config.json`)}),await n(K),console.log(`Added collection to ${v.join("configs","outline-sync.json")}`);else console.log("Collection already configured.")}function o($){return new Promise((u)=>{process.stdout.write($),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.once("data",(j)=>{process.stdin.pause(),u(j.toString())})})}async function Ij($){let{collectionId:u,dryRun:j=!1}=$;console.log(`Bootstrapping collection ${u} (dryRun=${j})...`);let w=await Ej(u);console.log(`Fetched ${w.length} documents from Outline.`);let J=new Map;for(let q of w)J.set(q.id,{title:q.title,file:"",id:q.id,children:[],raw:q});let K=[];for(let q of J.values()){let L=q.raw||{},W=L.parentDocumentId??L.parentId??null;if(W&&J.has(W))J.get(W).children.push(q);else K.push(q)}let{saveDir:A}=await S(u);function H(q,L){let W=_(q.title||"untitled"),r=v.join(L,W),bj=v.join(r,"README.md");if(q.file=bj,q.children?.length)for(let vj of q.children)H(vj,r)}for(let q of K)H(q,A);for(let q of J.values()){let L=q.file,W=q.raw?.text??`# ${q.title}
7
7
 
8
- `;if(!j)await C.mkdir(v.dirname(z),{recursive:!0}),await C.writeFile(z,W,"utf8");else console.log(`[dry-run] would write ${z} (${W.length} bytes)`)}function Z(K){return{title:K.title,file:K.file,id:K.id,children:(K.children||[]).map(Z)}}let Q={collectionId:$,pages:q.map(Z)};await m();let{pagesFile:H,configFile:X,saveDir:k}=await y($);if(!j){if(await C.writeFile(H,`${JSON.stringify(Q,null,2)}
9
- `,"utf8"),!Fj(X))await C.writeFile(X,`${JSON.stringify({collectionId:$,saveDir:k,mappings:[]},null,2)}
10
- `,"utf8");let K=await D()||{collections:[]};if(!K.collections.find((W)=>W.id===$))K.collections.unshift({id:$,saveDir:k,pagesFile:H,configFile:X}),await i(K)}else console.log(`[dry-run] would save pages to ${H} and config to ${X}`);console.log(`Bootstrap complete: wrote ${H} and ${X}`)}var zj=b(()=>{n();l();e()});var kj={};f(kj,{syncPage:()=>jj,runSync:()=>rj,persistPagesManifest:()=>Yj,loadPagesManifest:()=>Wj,contentsEqualIgnoringWhitespace:()=>N,applyMappingsToManifest:()=>Lj});import _ from"node:fs/promises";import{existsSync as Bj}from"node:fs";import V from"node:path";async function Wj(u){let{pagesFile:$}=await y(u);if(!Bj($))throw new Error(`${$} not found. Run init/setup to create it`);let j=await _.readFile($,"utf8");return JSON.parse(j)}async function Yj(u,$,j=!1){let{pagesFile:J}=await y(u);if(j){console.log(`[dry-run] would persist manifest to ${J}`);return}await _.writeFile(J,`${JSON.stringify($,null,2)}
11
- `,"utf8")}function Lj(u,$){let j=$?.mappings||[];function J(q){if(!q)return!1;if(q.endsWith("/")||q.endsWith(V.sep))return!0;return V.extname(q).toLowerCase()!==".md"}function w(q,A){let E=!1;for(let Q of j)if(Q.match?.id&&q.id===Q.match.id){let H=Q.path;if(J(H)){let X=H.endsWith("/")?H:H;q.file=V.join(X,"index.md")}else q.file=H;E=!0;break}if(!E){for(let Q of j)if(Q.match?.title&&q.title===Q.match.title){let H=Q.path;if(J(H)){let X=H.endsWith("/")?H:H;q.file=V.join(X,"index.md")}else q.file=H;E=!0;break}}if(!q.file){let Q=O(q.title||"untitled"),H=A?V.join(A,Q):V.join($?.saveDir||"docs",Q);q.file=V.join(H,"index.md")}else if(!(V.dirname(q.file)&&V.dirname(q.file)!==".")){let H=A||$?.saveDir||"docs";q.file=V.join(H,q.file)}let Z=V.dirname(q.file);if(q.children?.length)for(let Q of q.children)w(Q,Z)}for(let q of u.pages)w(q,null);return u}function N(u,$){return o(u)===o($)}async function jj(u,$,j,J,w){let q=j.file,A=V.resolve(q),E=Bj(A),Z=0;if(E)try{Z=await Vj(A)}catch{Z=0}let Q=null;if(j.id)try{Q=await Ej(j.id)}catch(K){console.warn(`Failed to fetch remote info for ${j.title} (${j.id}): ${K}`),Q=null}let H=Q?.text??null,X=Q?.updatedAt?new Date(Q.updatedAt).getTime():0;if(!E){if(w.mode==="pull"||w.mode==="sync"||w.mode==="push"){let K=H!=null?H:`# ${j.title}
8
+ `;if(!j)await C.mkdir(v.dirname(L),{recursive:!0}),await C.writeFile(L,W,"utf8");else console.log(`[dry-run] would write ${L} (${W.length} bytes)`)}function V(q){return{title:q.title,file:q.file,id:q.id,children:(q.children||[]).map(V)}}let Q={collectionId:u,pages:K.map(V)},{pagesFile:E,configFile:Z,saveDir:k,configDir:z}=await S(u);if(await Qj(z),!j){if(await C.writeFile(E,`${JSON.stringify(Q,null,2)}
9
+ `,"utf8"),!hj(Z))await C.writeFile(Z,`${JSON.stringify({collectionId:u,saveDir:k,mappings:[]},null,2)}
10
+ `,"utf8");let q=await N()||{collections:[]};if(!q.collections.find((W)=>W.id===u))q.collections.unshift({id:u,saveDir:k,pagesFile:E,configFile:Z}),await n(q)}else console.log(`[dry-run] would save pages to ${E} and config to ${Z}`);console.log(`Bootstrap complete: wrote ${E} and ${Z}`)}var Bj=y(()=>{p();c();l()});var Uj={};f(Uj,{syncPage:()=>e,runSync:()=>rj,persistPagesManifest:()=>Lj,loadPagesManifest:()=>Yj,contentsEqualIgnoringWhitespace:()=>x,applyMappingsToManifest:()=>kj});import R from"node:fs/promises";import{existsSync as Wj}from"node:fs";import X from"node:path";async function Yj($){let{pagesFile:u}=await S($);if(!Wj(u))throw new Error(`${u} not found. Run init/setup to create it`);let j=await R.readFile(u,"utf8");return JSON.parse(j)}async function Lj($,u,j=!1){let{pagesFile:w}=await S($);if(j){console.log(`[dry-run] would persist manifest to ${w}`);return}await R.writeFile(w,`${JSON.stringify(u,null,2)}
11
+ `,"utf8")}function kj($,u){let j=u?.mappings||[];function w(K){if(!K)return!1;if(K.endsWith("/")||K.endsWith(X.sep))return!0;return X.extname(K).toLowerCase()!==".md"}function J(K,A){let H=!1;for(let Q of j)if(Q.match?.id&&K.id===Q.match.id){let E=Q.path;if(w(E)){let Z=E.endsWith("/")?E:E;K.file=X.join(Z,"README.md")}else K.file=E;H=!0;break}if(!H){for(let Q of j)if(Q.match?.title&&K.title===Q.match.title){let E=Q.path;if(w(E)){let Z=E.endsWith("/")?E:E;K.file=X.join(Z,"README.md")}else K.file=E;H=!0;break}}if(!K.file){let Q=_(K.title||"untitled"),E=A?X.join(A,Q):X.join(u?.saveDir||"docs",Q);K.file=X.join(E,"README.md")}else if(!(X.dirname(K.file)&&X.dirname(K.file)!==".")){let E=A||u?.saveDir||"docs";K.file=X.join(E,K.file)}let V=X.dirname(K.file);if(K.children?.length)for(let Q of K.children)J(Q,V)}for(let K of $.pages)J(K,null);return $}function x($,u){return i($)===i(u)}async function e($,u,j,w,J){let K=j.file,A=X.resolve(K),H=Wj(A),V=0;if(H)try{V=await Zj(A)}catch{V=0}let Q=null;if(j.id)try{Q=await Hj(j.id)}catch(z){console.warn(`Failed to fetch remote info for ${j.title} (${j.id}): ${z}`),Q=null}let E=Q?.text??null,Z=Q?.updatedAt?new Date(Q.updatedAt).getTime():0;if(!H){if(J.mode==="pull"||J.mode==="sync"||J.mode==="push"){let z=E!=null?E:`# ${j.title}
12
12
 
13
- `;await h(A,K,w.dryRun||!1)}}if(!j.id){let K=await _.readFile(A,"utf8");if(w.dryRun)console.log(`[dry-run][CREATE] Would create remote doc for "${j.title}" in collection ${u}`);else try{let z=await Hj(j.title,K,u,J);j.id=z?.id??j.id,console.log(`[CREATE] Created remote "${j.title}" id=${j.id}`)}catch(z){console.error(`[CREATE] Failed to create remote for ${j.title}: ${z}`)}}else{let K=await _.readFile(A,"utf8");if(w.mode==="pull")if(H!=null&&!N(K,H))console.log(`[PULL] Remote applied to local for "${j.title}"`),await h(A,H??"",w.dryRun||!1);else console.log(`[SKIP] No change (pull) for "${j.title}"`);else if(w.mode==="push")if(H==null||!N(K,H))if(w.dryRun)console.log(`[dry-run][PUSH] Would update remote "${j.title}" id=${j.id}`);else try{await c(j.id,j.title,K),console.log(`[PUSH] Updated remote "${j.title}" id=${j.id}`)}catch(z){console.error(`[PUSH] Failed to update remote for ${j.title}: ${z}`)}else console.log(`[SKIP] No change (push) for "${j.title}"`);else if(X>Z+500)if(!N(K,H??""))console.log(`[PULL] Remote newer -> overwrite local for "${j.title}"`),await h(A,H??"",w.dryRun||!1);else console.log(`[SKIP] equal after normalizing (remote newer timestamp but content same) "${j.title}"`);else if(Z>X+500)if(!N(K,H??""))if(console.log(`[PUSH] Local newer -> update remote for "${j.title}"`),w.dryRun)console.log(`[dry-run] would update remote ${j.title}`);else try{await c(j.id,j.title,K),console.log(`[PUSH] Updated remote "${j.title}" id=${j.id}`)}catch(z){console.error(`[PUSH] Failed to update remote for ${j.title}: ${z}`)}else console.log(`[SKIP] equal after normalizing (local newer timestamp but content same) "${j.title}"`);else console.log(`[SKIP] No changes for "${j.title}"`)}let k=j.id||J;if(j.children?.length)for(let K of j.children)await jj(u,$,K,k,w)}async function rj(u){let{collectionId:$,mode:j,dryRun:J=!1}=u;console.log(`Starting ${j} for collection ${$} (dryRun=${J})`);let w=await Wj($),q=await Aj($)||{saveDir:"docs",mappings:[]};Lj(w,q);async function A(E,Z){if(!E.file){let X=O(E.title||"untitled"),k=Z?V.join(Z,X):V.join(q.saveDir||"docs",X);E.file=V.join(k,"index.md")}else{let X=V.dirname(E.file);if(!X||X==="."){let k=Z||q.saveDir||"docs";E.file=V.join(k,E.file)}}let Q=V.dirname(E.file);if(!J)try{await _.mkdir(Q,{recursive:!0})}catch{}else console.log(`[dry-run] would ensure directory ${Q}`);let H=V.dirname(E.file);if(E.children?.length)for(let X of E.children)await A(X,H)}for(let E of w.pages)await A(E,null);for(let E of w.pages)await jj($,w,E,null,{mode:j,dryRun:J});await Yj($,w,J),console.log("Done.")}var Uj=b(()=>{l();e();n()});var uj=process.argv.slice(2),B={},r=[];for(let u=0;u<uj.length;u++){let $=uj[u];if($==="--help"||$==="-h")r.push("--help");else if($.startsWith("--collection=")||$.startsWith("--collection:")){let j=$.split(/[:=]/)[1]||"";if(!B.collection)B.collection=[];B.collection.push(j)}else if($==="--collection"){let j=uj[u+1];if(j&&!j.startsWith("--")){if(!B.collection)B.collection=[];B.collection.push(j),u++}}else if($.startsWith("--")){let[j,J]=$.replace(/^--/,"").split("=");B[j]=J===void 0?!0:J}else r.push($)}if(B["api-key"])process.env.OUTLINE_API_KEY=String(B["api-key"]);if(B["base-url"])process.env.OUTLINE_BASE_URL=String(B["base-url"]);if(r.includes("--help")||B.help||B.h)console.log(`
13
+ `;await h(A,z,J.dryRun||!1)}}if(!j.id){let z=await R.readFile(A,"utf8");if(J.dryRun)console.log(`[dry-run][CREATE] Would create remote doc for "${j.title}" in collection ${$}`);else try{let q=await Aj(j.title,z,$,w);j.id=q?.id??j.id,console.log(`[CREATE] Created remote "${j.title}" id=${j.id}`)}catch(q){console.error(`[CREATE] Failed to create remote for ${j.title}: ${q}`)}}else{let z=await R.readFile(A,"utf8");if(J.mode==="pull")if(E!=null&&!x(z,E))console.log(`[PULL] Remote applied to local for "${j.title}"`),await h(A,E??"",J.dryRun||!1);else console.log(`[SKIP] No change (pull) for "${j.title}"`);else if(J.mode==="push")if(E==null||!x(z,E))if(J.dryRun)console.log(`[dry-run][PUSH] Would update remote "${j.title}" id=${j.id}`);else try{await d(j.id,j.title,z),console.log(`[PUSH] Updated remote "${j.title}" id=${j.id}`)}catch(q){console.error(`[PUSH] Failed to update remote for ${j.title}: ${q}`)}else console.log(`[SKIP] No change (push) for "${j.title}"`);else if(Z>V+500)if(!x(z,E??""))console.log(`[PULL] Remote newer -> overwrite local for "${j.title}"`),await h(A,E??"",J.dryRun||!1);else console.log(`[SKIP] equal after normalizing (remote newer timestamp but content same) "${j.title}"`);else if(V>Z+500)if(!x(z,E??""))if(console.log(`[PUSH] Local newer -> update remote for "${j.title}"`),J.dryRun)console.log(`[dry-run] would update remote ${j.title}`);else try{await d(j.id,j.title,z),console.log(`[PUSH] Updated remote "${j.title}" id=${j.id}`)}catch(q){console.error(`[PUSH] Failed to update remote for ${j.title}: ${q}`)}else console.log(`[SKIP] equal after normalizing (local newer timestamp but content same) "${j.title}"`);else console.log(`[SKIP] No changes for "${j.title}"`)}let k=j.id||w;if(j.children?.length)for(let z of j.children)await e($,u,z,k,J)}async function rj($){let{collectionId:u,mode:j,dryRun:w=!1}=$;console.log(`Starting ${j} for collection ${u} (dryRun=${w})`);let J=await Yj(u),K=await Vj(u)||{saveDir:"docs",mappings:[]};kj(J,K);async function A(H,V){if(!H.file){let Z=_(H.title||"untitled"),k=V?X.join(V,Z):X.join(K.saveDir||"docs",Z);H.file=X.join(k,"README.md")}else{let Z=X.dirname(H.file);if(!Z||Z==="."){let k=V||K.saveDir||"docs";H.file=X.join(k,H.file)}}let Q=X.dirname(H.file);if(!w)try{await R.mkdir(Q,{recursive:!0})}catch{}else console.log(`[dry-run] would ensure directory ${Q}`);let E=X.dirname(H.file);if(H.children?.length)for(let Z of H.children)await A(Z,E)}for(let H of J.pages)await A(H,null);for(let H of J.pages)await e(u,J,H,null,{mode:j,dryRun:w});await Lj(u,J,w),console.log("Done.")}var Mj=y(()=>{c();l();p()});var jj=process.argv.slice(2),B={},I=[];for(let $=0;$<jj.length;$++){let u=jj[$];if(u==="--help"||u==="-h")I.push("--help");else if(u.startsWith("--collection=")||u.startsWith("--collection:")){let j=u.split(/[:=]/)[1]||"";if(!B.collection)B.collection=[];B.collection.push(j)}else if(u==="--collection"){let j=jj[$+1];if(j&&!j.startsWith("--")){if(!B.collection)B.collection=[];B.collection.push(j),$++}}else if(u.startsWith("--")){let[j,w]=u.replace(/^--/,"").split("=");B[j]=w===void 0?!0:w}else I.push(u)}if(B["api-key"])process.env.OUTLINE_API_KEY=String(B["api-key"]);if(B["base-url"])process.env.OUTLINE_BASE_URL=String(B["base-url"]);if(I.includes("--help")||B.help||B.h)console.log(`
14
14
  Usage:
15
15
  OUTLINE_API_KEY=... bun run bin/cli.ts [command] [--collection=ID]... [--dry-run] [--api-key="..."]
16
16
 
@@ -31,9 +31,9 @@ Flags:
31
31
  Examples:
32
32
  OUTLINE_API_KEY=... bunx @dockstat/outline-sync --collection="id1" --collection="id2" sync --dry-run
33
33
  bun run bin/cli.ts sync --api-key="sk_xxx" --collection="id1"
34
- `),process.exit(0);var{loadTopConfig:Ij}=await Promise.resolve().then(() => (wj(),$j)),{listCollectionsPrompt:Sj,bootstrapCollection:fj}=await Promise.resolve().then(() => (zj(),Zj)),{runSync:sj}=await Promise.resolve().then(() => (Uj(),kj)),Y=r[0]||"sync",R=Boolean(B["dry-run"]),Mj=B.collection??[];try{let u=await Ij()||{collections:[]},$=()=>{if(Mj.length>0)return Mj;if(u.collections&&u.collections.length>0)return u.collections.map((j)=>j.id);return[]};if(Y==="list-collections")await Sj({dryRun:R,nonInteractive:!1}),process.exit(0);if(Y==="setup")await Sj({dryRun:R,nonInteractive:!1}),process.exit(0);if(Y==="init"){let j=$();if(!j.length)throw new Error("Init requires at least one collection. Provide --collection or run setup.");for(let J of j)console.log(`
35
- ==> bootstrapping collection ${J} (dryRun=${R})`),await fj({collectionId:J,dryRun:R});process.exit(0)}if(Y==="pull"||Y==="push"||Y==="sync"){let j=$();if(!j.length)throw new Error(`Command "${Y}" requires at least one collection id. Provide with --collection=ID or run setup.`);let J=Y==="pull"?"pull":Y==="push"?"push":"sync";for(let w of j)console.log(`
36
- ==> Running ${J} for collection ${w}`),await sj({collectionId:w,mode:J,dryRun:R});process.exit(0)}console.error("Unknown command:",Y),process.exit(1)}catch(u){console.error("ERROR:",u?.message||u),process.exit(1)}
34
+ `),process.exit(0);var{loadTopConfig:fj}=await Promise.resolve().then(() => (Jj(),wj)),{listCollectionsPrompt:Sj,bootstrapCollection:sj}=await Promise.resolve().then(() => (Bj(),zj)),{runSync:gj}=await Promise.resolve().then(() => (Mj(),Uj)),Y=I[0]||"sync",P=Boolean(B["dry-run"]),yj=B.collection??[];try{let $=await fj()||{collections:[]},u=()=>{if(yj.length>0)return yj;if($.collections&&$.collections.length>0)return $.collections.map((j)=>j.id);return[]};if(Y==="list-collections")await Sj({dryRun:P,nonInteractive:!1}),process.exit(0);if(Y==="setup")await Sj({dryRun:P,nonInteractive:!1}),process.exit(0);if(Y==="init"){let j=u();if(!j.length)throw new Error("Init requires at least one collection. Provide --collection or run setup.");for(let w of j)console.log(`
35
+ ==> bootstrapping collection ${w} (dryRun=${P})`),await sj({collectionId:w,dryRun:P});process.exit(0)}if(Y==="pull"||Y==="push"||Y==="sync"){let j=u();if(!j.length)throw new Error(`Command "${Y}" requires at least one collection id. Provide with --collection=ID or run setup.`);let w=Y==="pull"?"pull":Y==="push"?"push":"sync";for(let J of j)console.log(`
36
+ ==> Running ${w} for collection ${J}`),await gj({collectionId:J,mode:w,dryRun:P});process.exit(0)}console.error("Unknown command:",Y),process.exit(1)}catch($){console.error("ERROR:",$?.message||$),process.exit(1)}
37
37
 
38
- //# debugId=75840388D048D53764756E2164756E21
39
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2NvbmZpZy50cyIsICIuLi9saWIvb3V0bGluZUFwaS50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi91dGlscy50cyIsICIuLi9saWIvaW5pdC50cyIsICIuLi9saWIvc3luY0VuZ2luZS50cyIsICIuLi9iaW4vY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFRvcENvbmZpZywgVG9wQ29sbGVjdGlvbkNvbmZpZywgQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfRElSID0gXCJjb25maWdzXCI7XG5leHBvcnQgY29uc3QgVE9QX0NPTkZJR19GSUxFID0gcGF0aC5qb2luKFwib3V0bGluZS1zeW5jLmpzb25cIik7XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29uZmlnRGlyKCkge1xuICBpZiAoIWV4aXN0c1N5bmMoQ09ORklHX0RJUikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihDT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRvcENvbmZpZygpOiBQcm9taXNlPFRvcENvbmZpZyB8IG51bGw+IHtcbiAgaWYgKCFleGlzdHNTeW5jKFRPUF9DT05GSUdfRklMRSkpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShUT1BfQ09ORklHX0ZJTEUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUb3BDb25maWc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVG9wQ29uZmlnKGNmZzogVG9wQ29uZmlnKSB7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0RpcigpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgVE9QX0NPTkZJR19GSUxFLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KGNmZywgbnVsbCwgMil9XFxuYCxcbiAgICBcInV0ZjhcIixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgcGFnZXNGaWxlOiBzdHJpbmc7XG4gIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgc2F2ZURpcjogc3RyaW5nO1xufT4ge1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG5cbiAgLy8gSWYgbm8gdG9wIGNvbmZpZyBleGlzdHMsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZXNGaWxlOiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgICBjb25maWdGaWxlOiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5jb25maWcuanNvbmApLFxuICAgICAgc2F2ZURpcjogXCJkb2NzXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNvbGxlY3Rpb24gY29uZmlndXJhdGlvblxuICBjb25zdCBjb2xsZWN0aW9uQ29uZmlnID0gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmZpbmQoXG4gICAgKGMpID0+IGMuaWQgPT09IGNvbGxlY3Rpb25JZCxcbiAgKTtcblxuICAvLyBJZiBubyBzcGVjaWZpYyBjb2xsZWN0aW9uIGNvbmZpZyBmb3VuZCwgdXNlIGRlZmF1bHQgcGF0aHNcbiAgaWYgKCFjb2xsZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgIH07XG4gIH1cblxuICAvLyBVc2UgY3VzdG9tIHBhdGhzIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGRlZmF1bHRzXG4gIHJldHVybiB7XG4gICAgcGFnZXNGaWxlOlxuICAgICAgY29sbGVjdGlvbkNvbmZpZy5wYWdlc0ZpbGUgfHxcbiAgICAgIHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICBjb25maWdGaWxlOlxuICAgICAgY29sbGVjdGlvbkNvbmZpZy5jb25maWdGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5jb25maWcuanNvbmApLFxuICAgIHNhdmVEaXI6IGNvbGxlY3Rpb25Db25maWcuc2F2ZURpciB8fCBcImRvY3NcIixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uQ29uZmlnKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbik6IFByb21pc2U8Q29sbGVjdGlvbkNvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgeyBjb25maWdGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmICghZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKGNvbmZpZ0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDb2xsZWN0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblRvcENvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRvcENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGNvbnN0IHRvcENvbmZpZyA9IGF3YWl0IGxvYWRUb3BDb25maWcoKTtcbiAgaWYgKCF0b3BDb25maWcgfHwgIXRvcENvbmZpZy5jb2xsZWN0aW9ucykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKSB8fCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbGxlY3Rpb25Db25maWcoYzogQ29sbGVjdGlvbkNvbmZpZykge1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXIoKTtcbiAgY29uc3QgeyBjb25maWdGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGMuY29sbGVjdGlvbklkKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGNvbmZpZ0ZpbGUsIGAke0pTT04uc3RyaW5naWZ5KGMsIG51bGwsIDIpfVxcbmAsIFwidXRmOFwiKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi9jb25maWdcIjtcbmNvbnN0IEJBU0VfVVJMID0gcHJvY2Vzcy5lbnYuT1VUTElORV9CQVNFX1VSTCB8fCBcImh0dHBzOi8vYXBwLmdldG91dGxpbmUuY29tXCI7XG5jb25zdCBBUElfS0VZID0gcHJvY2Vzcy5lbnYuT1VUTElORV9BUElfS0VZIHx8IFwiXCI7XG5jb25zdCBIRUFERVJTID0ge1xuICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7QVBJX0tFWX1gLFxuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIG91dGxpbmVSZXF1ZXN0KFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBib2R5OiBhbnksXG4gIHJldHJpZXMgPSAzLFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgdXJsID0gYCR7QkFTRV9VUkx9L2FwaS8ke2VuZHBvaW50fWA7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiBIRUFERVJTLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBjb25zdCBiYWNrb2ZmID0gMTAwMCAqIChhdHRlbXB0ICsgMSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmF0ZSBsaW1pdGVkLiBiYWNraW5nIG9mZiAke2JhY2tvZmZ9bXNgKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgYmFja29mZikpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW091dGxpbmVAJHtCQVNFX1VSTH0vYXBpLyR7ZW5kcG9pbnR9XSAke3Jlcy5zdGF0dXN9ICR7ZW5kcG9pbnR9IHBheWxvYWQ9YCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIFwicmVzcG9uc2U9XCIsXG4gICAgICAgICAganNvbixcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBPdXRsaW5lIEFQSSBlcnJvciAke3Jlcy5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KGpzb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzIC0gMSkgdGhyb3cgZXJyO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgUmVxdWVzdCBmYWlsZWQgKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0pOiAke2Vycn0uIFJldHJ5aW5nLi4uYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MDAgKiAoYXR0ZW1wdCArIDEpKSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIm91dGxpbmVSZXF1ZXN0OiB1bnJlYWNoYWJsZVwiKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RDb2xsZWN0aW9uc1BhZ2VkKCk6IFByb21pc2U8XG4gIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXVxuPiB7XG4gIGNvbnN0IG91dDogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIGxldCBvZmZzZXQgPSAwO1xuICBjb25zdCBsaW1pdCA9IDEwMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJjb2xsZWN0aW9ucy5saXN0XCIsIHsgb2Zmc2V0LCBsaW1pdCB9KTtcbiAgICBjb25zdCBkYXRhID0ganNvbi5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiBkYXRhKSBvdXQucHVzaCh7IGlkOiBjLmlkLCBuYW1lOiBjLm5hbWUgfSk7XG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgbGltaXQpIGJyZWFrO1xuICAgIG9mZnNldCArPSBkYXRhLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdERvY3VtZW50c0luQ29sbGVjdGlvbihcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IG91dDogYW55W10gPSBbXTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IGxpbWl0ID0gMTAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCBvdXRsaW5lUmVxdWVzdChcImRvY3VtZW50cy5saXN0XCIsIHtcbiAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgIG9mZnNldCxcbiAgICAgIGxpbWl0LFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBqc29uLmRhdGEgfHwgW107XG4gICAgZm9yIChjb25zdCBkIG9mIGRhdGEpIG91dC5wdXNoKGQpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IGxpbWl0KSBicmVhaztcbiAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRG9jdW1lbnRJbmZvKGRvY3VtZW50SWQ6IHN0cmluZykge1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMuaW5mb1wiLCB7IGlkOiBkb2N1bWVudElkIH0pO1xuICByZXR1cm4ganNvbi5kYXRhID8/IG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEb2N1bWVudChcbiAgdGl0bGU6IHN0cmluZyxcbiAgdGV4dDogc3RyaW5nLFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgcGFyZW50RG9jdW1lbnRJZDogc3RyaW5nIHwgbnVsbCxcbikge1xuICBjb25zdCBwYXlsb2FkID0ge1xuICAgIHRpdGxlLFxuICAgIHRleHQsXG4gICAgY29sbGVjdGlvbklkLFxuICAgIHBhcmVudERvY3VtZW50SWQ6IHBhcmVudERvY3VtZW50SWQgfHwgbnVsbCxcbiAgICBwdWJsaXNoOiB0cnVlLFxuICB9O1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMuY3JlYXRlXCIsIHBheWxvYWQpO1xuICByZXR1cm4ganNvbi5kYXRhO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRG9jdW1lbnQoXG4gIGlkOiBzdHJpbmcsXG4gIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRleHQ6IHN0cmluZyxcbikge1xuICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7IGlkLCB0ZXh0LCBwdWJsaXNoOiB0cnVlIH07XG4gIGlmICh0aXRsZSkgcGF5bG9hZC50aXRsZSA9IHRpdGxlO1xuICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMudXBkYXRlXCIsIHBheWxvYWQpO1xuICByZXR1cm4ganNvbi5kYXRhO1xufVxuIiwKICAgICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBUb3BDb25maWcsIFRvcENvbGxlY3Rpb25Db25maWcsIENvbGxlY3Rpb25Db25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ORklHX0RJUiA9IFwiY29uZmlnc1wiO1xuZXhwb3J0IGNvbnN0IFRPUF9DT05GSUdfRklMRSA9IHBhdGguam9pbihcIm91dGxpbmUtc3luYy5qc29uXCIpO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcigpIHtcbiAgaWYgKCFleGlzdHNTeW5jKENPTkZJR19ESVIpKSB7XG4gICAgYXdhaXQgZnMubWtkaXIoQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUb3BDb25maWcoKTogUHJvbWlzZTxUb3BDb25maWcgfCBudWxsPiB7XG4gIGlmICghZXhpc3RzU3luYyhUT1BfQ09ORklHX0ZJTEUpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoVE9QX0NPTkZJR19GSUxFLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVG9wQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRvcENvbmZpZyhjZmc6IFRvcENvbmZpZykge1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXIoKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIFRPUF9DT05GSUdfRklMRSxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShjZmcsIG51bGwsIDIpfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7XG4gIHBhZ2VzRmlsZTogc3RyaW5nO1xuICBjb25maWdGaWxlOiBzdHJpbmc7XG4gIHNhdmVEaXI6IHN0cmluZztcbn0+IHtcbiAgY29uc3QgdG9wQ29uZmlnID0gYXdhaXQgbG9hZFRvcENvbmZpZygpO1xuXG4gIC8vIElmIG5vIHRvcCBjb25maWcgZXhpc3RzLCB1c2UgZGVmYXVsdCBwYXRoc1xuICBpZiAoIXRvcENvbmZpZyB8fCAhdG9wQ29uZmlnLmNvbGxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgIH07XG4gIH1cblxuICAvLyBGaW5kIHRoZSBjb2xsZWN0aW9uIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgY29sbGVjdGlvbkNvbmZpZyA9IHRvcENvbmZpZy5jb2xsZWN0aW9ucy5maW5kKFxuICAgIChjKSA9PiBjLmlkID09PSBjb2xsZWN0aW9uSWQsXG4gICk7XG5cbiAgLy8gSWYgbm8gc3BlY2lmaWMgY29sbGVjdGlvbiBjb25maWcgZm91bmQsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghY29sbGVjdGlvbkNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICB9O1xuICB9XG5cbiAgLy8gVXNlIGN1c3RvbSBwYXRocyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBkZWZhdWx0c1xuICByZXR1cm4ge1xuICAgIHBhZ2VzRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcucGFnZXNGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgY29uZmlnRmlsZTpcbiAgICAgIGNvbGxlY3Rpb25Db25maWcuY29uZmlnRmlsZSB8fFxuICAgICAgcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICBzYXZlRGlyOiBjb2xsZWN0aW9uQ29uZmlnLnNhdmVEaXIgfHwgXCJkb2NzXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkQ29sbGVjdGlvbkNvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShjb25maWdGaWxlLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ29sbGVjdGlvbkNvbmZpZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbGxlY3Rpb25Ub3BDb25maWcoXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuKTogUHJvbWlzZTxUb3BDb2xsZWN0aW9uQ29uZmlnIHwgbnVsbD4ge1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG4gIGlmICghdG9wQ29uZmlnIHx8ICF0b3BDb25maWcuY29sbGVjdGlvbnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmZpbmQoKGMpID0+IGMuaWQgPT09IGNvbGxlY3Rpb25JZCkgfHwgbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVDb2xsZWN0aW9uQ29uZmlnKGM6IENvbGxlY3Rpb25Db25maWcpIHtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKCk7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjLmNvbGxlY3Rpb25JZCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShjb25maWdGaWxlLCBgJHtKU09OLnN0cmluZ2lmeShjLCBudWxsLCAyKX1cXG5gLCBcInV0ZjhcIik7XG59XG4iLAogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbi8qKlxuICogUmVtb3ZlIEFMTCB3aGl0ZXNwYWNlIChzcGFjZSwgdGFiLCBuZXdsaW5lLCBDUikgZm9yIGNvbXBhcmlzb24uXG4gKiBUaGlzIG1ha2VzIGRpZmZzIHRvbGVyYW50IHRvIGZvcm1hdHRpbmcgZGlmZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZShzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFxzKy9nLCBcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnlUaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gIHJldHVybiB0aXRsZVxuICAgIC50b1N0cmluZygpXG4gICAgLm5vcm1hbGl6ZShcIk5GS0RcIilcbiAgICAucmVwbGFjZSgvXFxwe019L2d1LCBcIlwiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgLnJlcGxhY2UoLyheLXwtJCkrL2csIFwiXCIpXG4gICAgLnNsaWNlKDAsIDEyMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHaXRUaW1lc3RhbXBNcyhmaWxlUGF0aDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IG91dCA9IHNwYXduU3luYyhcbiAgICAgIFwiZ2l0XCIsXG4gICAgICBbXCJsb2dcIiwgXCItMVwiLCBcIi0tZm9ybWF0PSVjdFwiLCBcIi0tXCIsIHJlc29sdmVkXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKG91dC5zdGF0dXMgIT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHR4dCA9IChvdXQuc3Rkb3V0IHx8IFwiXCIpLnRyaW0oKTtcbiAgICBpZiAoIXR4dCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2VjID0gTnVtYmVyKHR4dCk7XG4gICAgaWYgKE51bWJlci5pc05hTihzZWMpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gc2VjICogMTAwMDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExvY2FsVGltZXN0YW1wTXMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGdpdFRzID0gZ2V0R2l0VGltZXN0YW1wTXMoZmlsZVBhdGgpO1xuICBpZiAoZ2l0VHMpIHJldHVybiBnaXRUcztcbiAgY29uc3Qgc3QgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgcmV0dXJuIHN0Lm10aW1lTXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlV3JpdGVGaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRyeVJ1biA9IGZhbHNlLFxuKSB7XG4gIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNvbnN0IGJhayA9IGAke2ZpbGVQYXRofS5vdXRsaW5lLXN5bmMuYmFrLiR7RGF0ZS5ub3coKX1gO1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShmaWxlUGF0aCwgYmFrKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYEJhY2tlZCB1cCBleGlzdGluZyBmaWxlIHRvICR7YmFrfWApO1xuICB9IGVsc2Uge1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFkcnlSdW4pIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIFwidXRmOFwiKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbZHJ5LXJ1bl0gd291bGQgd3JpdGUgZmlsZSAke2ZpbGVQYXRofSAoJHtjb250ZW50Lmxlbmd0aH0gYnl0ZXMpYCxcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IGxpc3RDb2xsZWN0aW9uc1BhZ2VkLCBsaXN0RG9jdW1lbnRzSW5Db2xsZWN0aW9uIH0gZnJvbSBcIi4vb3V0bGluZUFwaVwiO1xuaW1wb3J0IHtcbiAgbG9hZFRvcENvbmZpZyxcbiAgc2F2ZVRvcENvbmZpZyxcbiAgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZSxcbiAgc2F2ZUNvbGxlY3Rpb25Db25maWcsXG4gIGVuc3VyZUNvbmZpZ0Rpcixcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgc2x1Z2lmeVRpdGxlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUVudHJ5LCBNYW5pZmVzdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUHJvbXB0IGhlbHBlciAoc2ltcGxlKTogcHJpbnRzIG51bWJlcmVkIGxpc3QgYW5kIHJlYWRzIGEgbGluZSBmcm9tIHN0ZGluLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdENvbGxlY3Rpb25zUHJvbXB0KG9wdHM6IHtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgbm9uSW50ZXJhY3RpdmU/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBjb2xzID0gYXdhaXQgbGlzdENvbGxlY3Rpb25zUGFnZWQoKTtcbiAgaWYgKCFjb2xzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUubG9nKFwiTm8gY29sbGVjdGlvbnMgZm91bmQgZm9yIHRoaXMgQVBJIGtleS5cIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUubG9nKFwiQ29sbGVjdGlvbnM6XCIpO1xuICBjb2xzLmZvckVhY2goKGMsIGkpID0+IGNvbnNvbGUubG9nKGAke2kgKyAxfSkgJHtjLmlkfVxcdCR7Yy5uYW1lfWApKTtcbiAgaWYgKG9wdHMubm9uSW50ZXJhY3RpdmUpIHJldHVybjtcbiAgY29uc3Qgc2VsZWN0aW9uID0gYXdhaXQgcXVlc3Rpb24oXG4gICAgXCJTZWxlY3QgYSBjb2xsZWN0aW9uIGJ5IG51bWJlciAob3IgcHJlc3MgRW50ZXIgdG8gY2FuY2VsKTogXCIsXG4gICk7XG4gIGNvbnN0IGlkeCA9IE51bWJlcihzZWxlY3Rpb24udHJpbSgpKTtcbiAgaWYgKCFpZHggfHwgaWR4IDwgMSB8fCBpZHggPiBjb2xzLmxlbmd0aCkge1xuICAgIGNvbnNvbGUubG9nKFwiQ2FuY2VsbGVkLlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY2hvc2VuID0gY29sc1tpZHggLSAxXTtcbiAgY29uc29sZS5sb2coYFlvdSBjaG9zZTogJHtjaG9zZW4ubmFtZX0gKCR7Y2hvc2VuLmlkfSlgKTtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKCk7XG4gIGNvbnN0IHRvcCA9IChhd2FpdCBsb2FkVG9wQ29uZmlnKCkpIHx8IHsgY29sbGVjdGlvbnM6IFtdIH07XG4gIGNvbnN0IGV4aXN0cyA9IHRvcC5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjaG9zZW4uaWQpO1xuICBpZiAoIWV4aXN0cykge1xuICAgIGNvbnN0IGRlZmF1bHRTYXZlRGlyID0gXCJkb2NzXCI7XG4gICAgdG9wLmNvbGxlY3Rpb25zLnVuc2hpZnQoe1xuICAgICAgaWQ6IGNob3Nlbi5pZCxcbiAgICAgIG5hbWU6IGNob3Nlbi5uYW1lLFxuICAgICAgc2F2ZURpcjogZGVmYXVsdFNhdmVEaXIsXG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihcImNvbmZpZ3NcIiwgYCR7Y2hvc2VuLmlkfS5wYWdlcy5qc29uYCksXG4gICAgICBjb25maWdGaWxlOiBwYXRoLmpvaW4oXCJjb25maWdzXCIsIGAke2Nob3Nlbi5pZH0uY29uZmlnLmpzb25gKSxcbiAgICB9KTtcbiAgICBhd2FpdCBzYXZlVG9wQ29uZmlnKHRvcCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgQWRkZWQgY29sbGVjdGlvbiB0byAke3BhdGguam9pbihcImNvbmZpZ3NcIiwgXCJvdXRsaW5lLXN5bmMuanNvblwiKX1gLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXCJDb2xsZWN0aW9uIGFscmVhZHkgY29uZmlndXJlZC5cIik7XG4gIH1cbn1cblxuLyoqXG4gKiBTaW1wbGUgc3RkaW4gbGluZSByZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXN0aW9uKHByb21wdFRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHByb21wdFRleHQpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbmNlKFwiZGF0YVwiLCAoZGF0YSkgPT4ge1xuICAgICAgcHJvY2Vzcy5zdGRpbi5wYXVzZSgpO1xuICAgICAgcmVzb2x2ZShkYXRhLnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCb290c3RyYXA6IGZldGNoIGRvY3VtZW50cyBmcm9tIGNvbGxlY3Rpb24sIGNyZWF0ZSBwYWdlcy5qc29uIGFuZCB3cml0ZSBtYXJrZG93biBmaWxlcy5cbiAqIE5vdzogZm9sZGVyLWJhc2VkIHN0cnVjdHVyZSBieSBpbmhlcml0YW5jZS4gRWFjaCBwYWdlIGdldHMgYSBkaXJlY3RvcnkgbmFtZWQgZnJvbSB0aGUgc2x1ZyxcbiAqIGFuZCB0aGUgcGFnZSBpdHNlbGYgaXMgc2F2ZWQgYXMgYGluZGV4Lm1kYCBpbnNpZGUgdGhhdCBkaXJlY3RvcnkuIENoaWxkcmVuIGJlY29tZSBzdWJkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcENvbGxlY3Rpb24ob3B0czoge1xuICBjb2xsZWN0aW9uSWQ6IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBjb2xsZWN0aW9uSWQsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRzO1xuICBjb25zb2xlLmxvZyhgQm9vdHN0cmFwcGluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbklkfSAoZHJ5UnVuPSR7ZHJ5UnVufSkuLi5gKTtcbiAgY29uc3QgZG9jcyA9IGF3YWl0IGxpc3REb2N1bWVudHNJbkNvbGxlY3Rpb24oY29sbGVjdGlvbklkKTtcbiAgY29uc29sZS5sb2coYEZldGNoZWQgJHtkb2NzLmxlbmd0aH0gZG9jdW1lbnRzIGZyb20gT3V0bGluZS5gKTtcblxuICAvLyAxKSBidWlsZCBmbGF0IG1hcCBvZiBub2RlcyB3aXRoIHJhd1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfT4oKTtcbiAgZm9yIChjb25zdCBkIG9mIGRvY3MpIHtcbiAgICBtYXAuc2V0KGQuaWQsIHtcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgZmlsZTogXCJcIixcbiAgICAgIGlkOiBkLmlkLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgcmF3OiBkLFxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIC8vIDIpIGF0dGFjaCBjaGlsZHJlbiB1c2luZyBwYXJlbnREb2N1bWVudElkIG9yIHBhcmVudElkXG4gIGNvbnN0IHJvb3RzOiAoUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfSlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgY29uc3QgcmF3ID0gbm9kZS5yYXcgfHwge307XG4gICAgY29uc3QgcGFyZW50SWQgPSByYXcucGFyZW50RG9jdW1lbnRJZCA/PyByYXcucGFyZW50SWQgPz8gbnVsbDtcbiAgICBpZiAocGFyZW50SWQgJiYgbWFwLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IG1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gMykgYXNzaWduIGZvbGRlci1iYXNlZCBmaWxlIHBhdGhzIHJlY3Vyc2l2ZWx5XG4gIC8vIHBhdHRlcm46IDxzYXZlRGlyPi88YW5jZXN0b3Itc2x1Zy0xPi88YW5jZXN0b3Itc2x1Zy0yPi88dGhpcy1zbHVnPi9pbmRleC5tZFxuICAvLyBHZXQgdGhlIGNvbmZpZ3VyZWQgc2F2ZURpclxuICBjb25zdCB7IHNhdmVEaXIgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcblxuICBmdW5jdGlvbiBhc3NpZ25QYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHNsdWdpZnlUaXRsZShub2RlLnRpdGxlIHx8IFwidW50aXRsZWRcIik7XG4gICAgY29uc3QgZGlyID0gcGF0aC5qb2luKHBhcmVudERpciwgc2x1Zyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcImluZGV4Lm1kXCIpO1xuICAgIG5vZGUuZmlsZSA9IGZpbGVQYXRoO1xuICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGFzc2lnblBhdGhzKGMsIGRpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCByIG9mIHJvb3RzKSB7XG4gICAgYXNzaWduUGF0aHMociwgc2F2ZURpcik7XG4gIH1cblxuICAvLyA0KSB3cml0ZSBmaWxlcyB0byBkaXNrXG4gIGZvciAoY29uc3QgbiBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG4uZmlsZTtcbiAgICBjb25zdCBjb250ZW50ID0gbi5yYXc/LnRleHQgPz8gYCMgJHtuLnRpdGxlfVxcblxcbmA7XG4gICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50LCBcInV0ZjhcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW2RyeS1ydW5dIHdvdWxkIHdyaXRlICR7ZmlsZVBhdGh9ICgke2NvbnRlbnQubGVuZ3RofSBieXRlcylgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyA1KSBzdHJpcCByYXcgYW5kIGJ1aWxkIG1hbmlmZXN0XG4gIGZ1bmN0aW9uIHN0cmlwKG46IGFueSk6IFBhZ2VFbnRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiBuLnRpdGxlLFxuICAgICAgZmlsZTogbi5maWxlLFxuICAgICAgaWQ6IG4uaWQsXG4gICAgICBjaGlsZHJlbjogKG4uY2hpbGRyZW4gfHwgW10pLm1hcChzdHJpcCksXG4gICAgfTtcbiAgfVxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QgPSB7IGNvbGxlY3Rpb25JZCwgcGFnZXM6IHJvb3RzLm1hcChzdHJpcCkgfTtcblxuICAvLyBzYXZlIG1hbmlmZXN0IGFuZCBjb25maWcgZmlsZXNcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKCk7XG4gIGNvbnN0IHtcbiAgICBwYWdlc0ZpbGUsXG4gICAgY29uZmlnRmlsZSxcbiAgICBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpcixcbiAgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcbiAgaWYgKCFkcnlSdW4pIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICBwYWdlc0ZpbGUsXG4gICAgICBgJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMil9XFxuYCxcbiAgICAgIFwidXRmOFwiLFxuICAgICk7XG4gICAgaWYgKCFleGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHsgY29sbGVjdGlvbklkLCBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpciwgbWFwcGluZ3M6IFtdIH0sIG51bGwsIDIpfVxcbmAsXG4gICAgICAgIFwidXRmOFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdG9wID0gKGF3YWl0IGxvYWRUb3BDb25maWcoKSkgfHwgeyBjb2xsZWN0aW9uczogW10gfTtcbiAgICBjb25zdCBleGlzdHNUb3AgPSB0b3AuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKTtcbiAgICBpZiAoIWV4aXN0c1RvcCkge1xuICAgICAgdG9wLmNvbGxlY3Rpb25zLnVuc2hpZnQoe1xuICAgICAgICBpZDogY29sbGVjdGlvbklkLFxuICAgICAgICBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpcixcbiAgICAgICAgcGFnZXNGaWxlLFxuICAgICAgICBjb25maWdGaWxlLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBzYXZlVG9wQ29uZmlnKHRvcCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkcnktcnVuXSB3b3VsZCBzYXZlIHBhZ2VzIHRvICR7cGFnZXNGaWxlfSBhbmQgY29uZmlnIHRvICR7Y29uZmlnRmlsZX1gLFxuICAgICk7XG4gIH1cbiAgY29uc29sZS5sb2coYEJvb3RzdHJhcCBjb21wbGV0ZTogd3JvdGUgJHtwYWdlc0ZpbGV9IGFuZCAke2NvbmZpZ0ZpbGV9YCk7XG59XG4iLAogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge1xuICBsb2FkVG9wQ29uZmlnLFxuICBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlLFxuICBsb2FkQ29sbGVjdGlvbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQge1xuICBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZSxcbiAgZ2V0TG9jYWxUaW1lc3RhbXBNcyxcbiAgc2FmZVdyaXRlRmlsZSxcbiAgc2x1Z2lmeVRpdGxlLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZmV0Y2hEb2N1bWVudEluZm8sXG4gIHVwZGF0ZURvY3VtZW50LFxuICBjcmVhdGVEb2N1bWVudCxcbn0gZnJvbSBcIi4vb3V0bGluZUFwaVwiO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdCwgUGFnZUVudHJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBMb2FkIHBhZ2VzLmpzb24gZm9yIGEgY29sbGVjdGlvbiAoaWYgbWlzc2luZywgZXJyb3IvYXNrIHRvIGluaXQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUGFnZXNNYW5pZmVzdChcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPE1hbmlmZXN0PiB7XG4gIGNvbnN0IHsgcGFnZXNGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmICghZXhpc3RzU3luYyhwYWdlc0ZpbGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhZ2VzRmlsZX0gbm90IGZvdW5kLiBSdW4gaW5pdC9zZXR1cCB0byBjcmVhdGUgaXRgKTtcbiAgfVxuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShwYWdlc0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBNYW5pZmVzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RQYWdlc01hbmlmZXN0KFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBkcnlSdW4gPSBmYWxzZSxcbikge1xuICBjb25zdCB7IHBhZ2VzRmlsZSB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQpO1xuICBpZiAoZHJ5UnVuKSB7XG4gICAgY29uc29sZS5sb2coYFtkcnktcnVuXSB3b3VsZCBwZXJzaXN0IG1hbmlmZXN0IHRvICR7cGFnZXNGaWxlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgcGFnZXNGaWxlLFxuICAgIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gLFxuICAgIFwidXRmOFwiLFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZGVzdGluYXRpb24gZmlsZSBwYXRoIGZvciBhIGRvY3VtZW50IHVzaW5nIGNvbGxlY3Rpb24gY29uZmlnIG1hcHBpbmdzLlxuICpcbiAqIFJ1bGVzOlxuICogLSBtYXBwaW5nIHdpdGggaWQgZXhhY3QgbWF0Y2ggd2luc1xuICogLSBtYXBwaW5nIHdpdGggdGl0bGUgZXhhY3QgbWF0Y2ggbmV4dFxuICogLSBtYXBwaW5nLnBhdGggbWF5IGJlOlxuICogICAgLSBhIGZpbGUgcGF0aCAoZW5kaW5nIHdpdGggYC5tZGApIC0+IHNldCBub2RlLmZpbGUgdG8gdGhhdCBwYXRoXG4gKiAgICAtIGEgZGlyZWN0b3J5IHBhdGggKGVuZHMgd2l0aCBgL2Agb3Igbm8gZXh0ZW5zaW9uKSAtPiBwbGFjZSBub2RlIGluIHRoYXQgZGlyIGFzIGluZGV4Lm1kXG4gKiAtIGlmIG5vIG1hcHBpbmcsIGZhbGwgYmFjayB0byBpbmhlcml0ZWQgZm9sZGVyIGFwcHJvYWNoOlxuICogICAgcGFyZW50RGlyICsgc2x1Zy9pbmRleC5tZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYXBwaW5nc1RvTWFuaWZlc3QoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdCxcbiAgY29sbGVjdGlvbkNvbmZpZzogYW55LFxuKSB7XG4gIGNvbnN0IHJ1bGVzID0gKGNvbGxlY3Rpb25Db25maWc/Lm1hcHBpbmdzIHx8IFtdKSBhcyB7XG4gICAgbWF0Y2g6IGFueTtcbiAgICBwYXRoOiBzdHJpbmc7XG4gIH1bXTtcblxuICBmdW5jdGlvbiBpc0RpclBhdGgocDogc3RyaW5nKSB7XG4gICAgLy8gdHJlYXQgdHJhaWxpbmcgc2xhc2ggYXMgZGlyZWN0b3J5IE9SIGxhY2sgb2YgLm1kIGV4dGVuc2lvbiBhcyBkaXJlY3RvcnlcbiAgICBpZiAoIXApIHJldHVybiBmYWxzZTtcbiAgICBpZiAocC5lbmRzV2l0aChcIi9cIikgfHwgcC5lbmRzV2l0aChwYXRoLnNlcCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBwYXRoLmV4dG5hbWUocCkudG9Mb3dlckNhc2UoKSAhPT0gXCIubWRcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5VG9Ob2RlKG5vZGU6IGFueSwgcGFyZW50RGlyOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgLy8gdHJ5IGlkIG1hdGNoIHRoZW4gdGl0bGUgbWF0Y2hcbiAgICBsZXQgbWF0Y2hlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgciBvZiBydWxlcykge1xuICAgICAgaWYgKHIubWF0Y2g/LmlkICYmIG5vZGUuaWQgPT09IHIubWF0Y2guaWQpIHtcbiAgICAgICAgY29uc3QgcCA9IHIucGF0aDtcbiAgICAgICAgaWYgKGlzRGlyUGF0aChwKSkge1xuICAgICAgICAgIGNvbnN0IGRpciA9IHAuZW5kc1dpdGgoXCIvXCIpID8gcCA6IHA7XG4gICAgICAgICAgbm9kZS5maWxlID0gcGF0aC5qb2luKGRpciwgXCJpbmRleC5tZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLmZpbGUgPSBwO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHtcbiAgICAgICAgaWYgKHIubWF0Y2g/LnRpdGxlICYmIG5vZGUudGl0bGUgPT09IHIubWF0Y2gudGl0bGUpIHtcbiAgICAgICAgICBjb25zdCBwID0gci5wYXRoO1xuICAgICAgICAgIGlmIChpc0RpclBhdGgocCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IHAuZW5kc1dpdGgoXCIvXCIpID8gcCA6IHA7XG4gICAgICAgICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oZGlyLCBcImluZGV4Lm1kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmZpbGUgPSBwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHN0aWxsIG5vdCBhc3NpZ25lZCwgaW5oZXJpdCBmcm9tIHBhcmVudERpciBieSB1c2luZyBzbHVnIC0+IGluZGV4Lm1kXG4gICAgaWYgKCFub2RlLmZpbGUpIHtcbiAgICAgIGNvbnN0IHNsdWcgPSBzbHVnaWZ5VGl0bGUobm9kZS50aXRsZSB8fCBcInVudGl0bGVkXCIpO1xuICAgICAgY29uc3QgZGlyID0gcGFyZW50RGlyXG4gICAgICAgID8gcGF0aC5qb2luKHBhcmVudERpciwgc2x1ZylcbiAgICAgICAgOiBwYXRoLmpvaW4oY29sbGVjdGlvbkNvbmZpZz8uc2F2ZURpciB8fCBcImRvY3NcIiwgc2x1Zyk7XG4gICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oZGlyLCBcImluZGV4Lm1kXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub2RlLmZpbGUgaXMgYSBiYXJlIGZpbGVuYW1lIChubyBkaXJlY3RvcnkpID0+IHB1dCB1bmRlciBwYXJlbnREaXIgb3Igc2F2ZURpclxuICAgICAgY29uc3QgaGFzRGlyID0gcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSkgJiYgcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSkgIT09IFwiLlwiO1xuICAgICAgaWYgKCFoYXNEaXIpIHtcbiAgICAgICAgY29uc3QgYmFzZURpciA9IHBhcmVudERpciB8fCBjb2xsZWN0aW9uQ29uZmlnPy5zYXZlRGlyIHx8IFwiZG9jc1wiO1xuICAgICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oYmFzZURpciwgbm9kZS5maWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIG1hcHBpbmcgcHJvdmlkZWQgYSBkaXJlY3RvcnktbGlrZSBwYXRoIChubyAubWQpIHdlIGFscmVhZHkgaGFuZGxlZDsgb3RoZXJ3aXNlIHBhdGggbWF5IGJlIHJlbGF0aXZlLCBrZWVwIGFzLWlzXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSB0aGlzIG5vZGUncyBkaXIgdG8gcGFzcyB0byBjaGlsZHJlbiAoZGlyZWN0b3J5IGNvbnRhaW5pbmcgaW5kZXgubWQpXG4gICAgY29uc3Qgbm9kZURpciA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgYXBwbHlUb05vZGUoYywgbm9kZURpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwIG9mIG1hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXBwbHlUb05vZGUocCBhcyBhbnksIG51bGwpO1xuICB9XG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBDb21wYXJlIGNvbnRlbnQgaWdub3Jpbmcgd2hpdGVzcGFjZS9uZXdsaW5lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlKGEpID09PSBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZShiKVxuICApO1xufVxuXG4vKipcbiAqIERlY2lkZSB3aGV0aGVyIHRvIHB1bGwgb3IgcHVzaCBvciBza2lwIGZvciBvbmUgcGFnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmNQYWdlKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBwYWdlOiBQYWdlRW50cnksXG4gIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICBvcHRzOiB7IG1vZGU6IFwicHVsbFwiIHwgXCJwdXNoXCIgfCBcInN5bmNcIjsgZHJ5UnVuPzogYm9vbGVhbiB9LFxuKSB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGFnZS5maWxlO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcbiAgY29uc3QgZmlsZUV4aXN0cyA9IGV4aXN0c1N5bmMoYWJzUGF0aCk7XG5cbiAgbGV0IGxvY2FsVHMgPSAwO1xuICBpZiAoZmlsZUV4aXN0cykge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFRzID0gYXdhaXQgZ2V0TG9jYWxUaW1lc3RhbXBNcyhhYnNQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvY2FsVHMgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGxldCByZW1vdGVEb2M6IGFueSA9IG51bGw7XG4gIGlmIChwYWdlLmlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbW90ZURvYyA9IGF3YWl0IGZldGNoRG9jdW1lbnRJbmZvKHBhZ2UuaWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIHJlbW90ZSBpbmZvIGZvciAke3BhZ2UudGl0bGV9ICgke3BhZ2UuaWR9KTogJHtlcnJ9YCxcbiAgICAgICk7XG4gICAgICByZW1vdGVEb2MgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbW90ZVRleHQgPSByZW1vdGVEb2M/LnRleHQgPz8gbnVsbDtcbiAgY29uc3QgcmVtb3RlVXBkYXRlZEF0ID0gcmVtb3RlRG9jPy51cGRhdGVkQXRcbiAgICA/IG5ldyBEYXRlKHJlbW90ZURvYy51cGRhdGVkQXQpLmdldFRpbWUoKVxuICAgIDogMDtcblxuICAvLyBlbnN1cmUgbG9jYWwgZmlsZSBleGlzdHMgd2hlbiBuZWVkZWQgLSBjcmVhdGUgcGFyZW50IGRpcnNcbiAgaWYgKCFmaWxlRXhpc3RzKSB7XG4gICAgaWYgKG9wdHMubW9kZSA9PT0gXCJwdWxsXCIgfHwgb3B0cy5tb2RlID09PSBcInN5bmNcIiB8fCBvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBjb25zdCBkYXRhVG9Xcml0ZSA9XG4gICAgICAgIHJlbW90ZVRleHQgIT0gbnVsbCA/IHJlbW90ZVRleHQgOiBgIyAke3BhZ2UudGl0bGV9XFxuXFxuYDtcbiAgICAgIGF3YWl0IHNhZmVXcml0ZUZpbGUoYWJzUGF0aCwgZGF0YVRvV3JpdGUsIG9wdHMuZHJ5UnVuIHx8IGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgcmVtb3RlIGlmIG1pc3NpbmdcbiAgaWYgKCFwYWdlLmlkKSB7XG4gICAgY29uc3QgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYWJzUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGlmIChvcHRzLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbZHJ5LXJ1bl1bQ1JFQVRFXSBXb3VsZCBjcmVhdGUgcmVtb3RlIGRvYyBmb3IgXCIke3BhZ2UudGl0bGV9XCIgaW4gY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KFxuICAgICAgICAgIHBhZ2UudGl0bGUsXG4gICAgICAgICAgbG9jYWxDb250ZW50LFxuICAgICAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgKTtcbiAgICAgICAgcGFnZS5pZCA9IGNyZWF0ZWQ/LmlkID8/IHBhZ2UuaWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbQ1JFQVRFXSBDcmVhdGVkIHJlbW90ZSBcIiR7cGFnZS50aXRsZX1cIiBpZD0ke3BhZ2UuaWR9YCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW0NSRUFURV0gRmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgZm9yICR7cGFnZS50aXRsZX06ICR7ZXJyfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxvY2FsQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGFic1BhdGgsIFwidXRmOFwiKTtcbiAgICBpZiAob3B0cy5tb2RlID09PSBcInB1bGxcIikge1xuICAgICAgaWYgKFxuICAgICAgICByZW1vdGVUZXh0ICE9IG51bGwgJiZcbiAgICAgICAgIWNvbnRlbnRzRXF1YWxJZ25vcmluZ1doaXRlc3BhY2UobG9jYWxDb250ZW50LCByZW1vdGVUZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbUFVMTF0gUmVtb3RlIGFwcGxpZWQgdG8gbG9jYWwgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICAgIGF3YWl0IHNhZmVXcml0ZUZpbGUoYWJzUGF0aCwgcmVtb3RlVGV4dCA/PyBcIlwiLCBvcHRzLmRyeVJ1biB8fCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVsbCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlbW90ZVRleHQgPT0gbnVsbCB8fFxuICAgICAgICAhY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQpXG4gICAgICApIHtcbiAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW2RyeS1ydW5dW1BVU0hdIFdvdWxkIHVwZGF0ZSByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdXBkYXRlRG9jdW1lbnQocGFnZS5pZCwgcGFnZS50aXRsZSwgbG9jYWxDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbUFVTSF0gVXBkYXRlZCByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVzaCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN5bmM6IHRpbWVzdGFtcC1iYXNlZCBidXQgc2tpcCBpZiBvbmx5IHdoaXRlc3BhY2UgZGlmZmVyc1xuICAgICAgaWYgKHJlbW90ZVVwZGF0ZWRBdCA+IGxvY2FsVHMgKyA1MDApIHtcbiAgICAgICAgaWYgKCFjb250ZW50c0VxdWFsSWdub3JpbmdXaGl0ZXNwYWNlKGxvY2FsQ29udGVudCwgcmVtb3RlVGV4dCA/PyBcIlwiKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtQVUxMXSBSZW1vdGUgbmV3ZXIgLT4gb3ZlcndyaXRlIGxvY2FsIGZvciBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzYWZlV3JpdGVGaWxlKGFic1BhdGgsIHJlbW90ZVRleHQgPz8gXCJcIiwgb3B0cy5kcnlSdW4gfHwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTS0lQXSBlcXVhbCBhZnRlciBub3JtYWxpemluZyAocmVtb3RlIG5ld2VyIHRpbWVzdGFtcCBidXQgY29udGVudCBzYW1lKSBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb2NhbFRzID4gcmVtb3RlVXBkYXRlZEF0ICsgNTAwKSB7XG4gICAgICAgIGlmICghY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQgPz8gXCJcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbUFVTSF0gTG9jYWwgbmV3ZXIgLT4gdXBkYXRlIHJlbW90ZSBmb3IgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW2RyeS1ydW5dIHdvdWxkIHVwZGF0ZSByZW1vdGUgJHtwYWdlLnRpdGxlfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVEb2N1bWVudChwYWdlLmlkLCBwYWdlLnRpdGxlLCBsb2NhbENvbnRlbnQpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBgW1BVU0hdIFVwZGF0ZWQgcmVtb3RlIFwiJHtwYWdlLnRpdGxlfVwiIGlkPSR7cGFnZS5pZH1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1NLSVBdIGVxdWFsIGFmdGVyIG5vcm1hbGl6aW5nIChsb2NhbCBuZXdlciB0aW1lc3RhbXAgYnV0IGNvbnRlbnQgc2FtZSkgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU0tJUF0gTm8gY2hhbmdlcyBmb3IgXCIke3BhZ2UudGl0bGV9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByZWN1cnNlIHRocm91Z2ggY2hpbGRyZW5cbiAgY29uc3QgbmV4dFBhcmVudElkID0gcGFnZS5pZCB8fCBwYXJlbnRJZDtcbiAgaWYgKHBhZ2UuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFnZS5jaGlsZHJlbikge1xuICAgICAgYXdhaXQgc3luY1BhZ2UoY29sbGVjdGlvbklkLCBtYW5pZmVzdCwgY2hpbGQsIG5leHRQYXJlbnRJZCwgb3B0cyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUnVuIHN5bmMgZm9yIGEgY29sbGVjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU3luYyhvcHRzOiB7XG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nO1xuICBtb2RlOiBcInB1bGxcIiB8IFwicHVzaFwiIHwgXCJzeW5jXCI7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IHsgY29sbGVjdGlvbklkLCBtb2RlLCBkcnlSdW4gPSBmYWxzZSB9ID0gb3B0cztcbiAgY29uc29sZS5sb2coXG4gICAgYFN0YXJ0aW5nICR7bW9kZX0gZm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9uSWR9IChkcnlSdW49JHtkcnlSdW59KWAsXG4gICk7XG4gIGNvbnN0IHBhZ2VzTWFuaWZlc3QgPSBhd2FpdCBsb2FkUGFnZXNNYW5pZmVzdChjb2xsZWN0aW9uSWQpO1xuICBjb25zdCBjb2xsQ2ZnID0gKGF3YWl0IGxvYWRDb2xsZWN0aW9uQ29uZmlnKGNvbGxlY3Rpb25JZCkpIHx8IHtcbiAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICBtYXBwaW5nczogW10sXG4gIH07XG5cbiAgLy8gYXBwbHkgbWFwcGluZ3MgKHRoaXMgd2lsbCBzZXQgZm9sZGVyLWJhc2VkIGBmaWxlYCBmaWVsZHMpXG4gIGFwcGx5TWFwcGluZ3NUb01hbmlmZXN0KHBhZ2VzTWFuaWZlc3QsIGNvbGxDZmcpO1xuXG4gIC8vIGVuc3VyZSBsb2NhbCBmaWxlcy9mb2xkZXJzIGV4aXN0IGFuZCBub3JtYWxpemUgYW55IHJlbGF0aXZlIGZpbGVuYW1lc1xuICBhc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nIHwgbnVsbCkge1xuICAgIC8vIGlmIG5vZGUuZmlsZSBpcyBhYnNlbnQsIGFwcGx5IGluaGVyaXRhbmNlIChhcHBseU1hcHBpbmdzVG9NYW5pZmVzdCBzaG91bGQgaGF2ZSBzZXQgaXQpXG4gICAgaWYgKCFub2RlLmZpbGUpIHtcbiAgICAgIGNvbnN0IHNsdWcgPSBzbHVnaWZ5VGl0bGUobm9kZS50aXRsZSB8fCBcInVudGl0bGVkXCIpO1xuICAgICAgY29uc3QgZGlyID0gcGFyZW50RGlyXG4gICAgICAgID8gcGF0aC5qb2luKHBhcmVudERpciwgc2x1ZylcbiAgICAgICAgOiBwYXRoLmpvaW4oY29sbENmZy5zYXZlRGlyIHx8IFwiZG9jc1wiLCBzbHVnKTtcbiAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiaW5kZXgubWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vZGUuZmlsZSBpcyBiYXJlIGZpbGVuYW1lIHdpdGhvdXQgZGlyIC0+IHB1dCBpbnRvIHBhcmVudERpciBvciBzYXZlRGlyXG4gICAgICBjb25zdCBkaXJuYW1lT2ZGaWxlID0gcGF0aC5kaXJuYW1lKG5vZGUuZmlsZSk7XG4gICAgICBpZiAoIWRpcm5hbWVPZkZpbGUgfHwgZGlybmFtZU9mRmlsZSA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29uc3QgYmFzZURpciA9IHBhcmVudERpciB8fCBjb2xsQ2ZnLnNhdmVEaXIgfHwgXCJkb2NzXCI7XG4gICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihiYXNlRGlyLCBub2RlLmZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBkaXJlY3RvcnkgaWYgbmVlZGVkIChub3Qgd3JpdGluZyBmaWxlIGNvbnRlbnRzIGhlcmUsIGp1c3QgZW5zdXJpbmcgc3RydWN0dXJlKVxuICAgIGNvbnN0IGRpclRvTWFrZSA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5ta2RpcihkaXJUb01ha2UsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW2RyeS1ydW5dIHdvdWxkIGVuc3VyZSBkaXJlY3RvcnkgJHtkaXJUb01ha2V9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZURpciA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuICAgIGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGF3YWl0IG5vcm1hbGl6ZVBhdGhzKGMsIG5vZGVEaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vcm1hbGl6ZSBmb3IgZWFjaCByb290XG4gIGZvciAoY29uc3Qgcm9vdCBvZiBwYWdlc01hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXdhaXQgbm9ybWFsaXplUGF0aHMocm9vdCBhcyBhbnksIG51bGwpO1xuICB9XG5cbiAgLy8gcnVuIHN5bmMgcmVjdXJzaW9uXG4gIGZvciAoY29uc3QgcCBvZiBwYWdlc01hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXdhaXQgc3luY1BhZ2UoY29sbGVjdGlvbklkLCBwYWdlc01hbmlmZXN0LCBwLCBudWxsLCB7IG1vZGUsIGRyeVJ1biB9KTtcbiAgfVxuXG4gIC8vIHBlcnNpc3QgbWFuaWZlc3QgKHdyaXRlIGFueSBjcmVhdGVkIGlkcyBiYWNrKVxuICBhd2FpdCBwZXJzaXN0UGFnZXNNYW5pZmVzdChjb2xsZWN0aW9uSWQsIHBhZ2VzTWFuaWZlc3QsIGRyeVJ1bik7XG4gIGNvbnNvbGUubG9nKFwiRG9uZS5cIik7XG59XG4iLAogICAgIiMhL3Vzci9iaW4vZW52IGJ1blxuXG4vKiBiaW4vY2xpLnRzXG4gICAtIFBhcnNlIENMSSBmbGFncyBmaXJzdCAoc28gLS1hcGkta2V5IGlzIGFwcGxpZWQgYmVmb3JlIG1vZHVsZXMgaW1wb3J0IGVudilcbiAgIC0gU3VwcG9ydCByZXBlYXRhYmxlIC0tY29sbGVjdGlvbiBmbGFnc1xuICAgLSBUaGVuIGR5bmFtaWNhbGx5IGltcG9ydCB0aGUgcmVzdCBvZiB0aGUgYXBwXG4qL1xuXG5jb25zdCByYXdBcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuXG4vLyBwYXJzZSBmbGFncyAocmVwZWF0YWJsZSAtLWNvbGxlY3Rpb24pXG5jb25zdCBmbGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiA9IHt9O1xuY29uc3QgcG9zaXRpb25hbHM6IHN0cmluZ1tdID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IHJhd0FyZ3MubGVuZ3RoOyBpKyspIHtcbiAgY29uc3QgYSA9IHJhd0FyZ3NbaV07XG4gIGlmIChhID09PSBcIi0taGVscFwiIHx8IGEgPT09IFwiLWhcIikge1xuICAgIHBvc2l0aW9uYWxzLnB1c2goXCItLWhlbHBcIik7XG4gIH0gZWxzZSBpZiAoYS5zdGFydHNXaXRoKFwiLS1jb2xsZWN0aW9uPVwiKSB8fCBhLnN0YXJ0c1dpdGgoXCItLWNvbGxlY3Rpb246XCIpKSB7XG4gICAgY29uc3QgdmFsID0gYS5zcGxpdCgvWzo9XS8pWzFdIHx8IFwiXCI7XG4gICAgaWYgKCFmbGFncy5jb2xsZWN0aW9uKSBmbGFncy5jb2xsZWN0aW9uID0gW107XG4gICAgKGZsYWdzLmNvbGxlY3Rpb24gYXMgc3RyaW5nW10pLnB1c2godmFsKTtcbiAgfSBlbHNlIGlmIChhID09PSBcIi0tY29sbGVjdGlvblwiKSB7XG4gICAgLy8gc3VwcG9ydCBgLS1jb2xsZWN0aW9uIDx2YWx1ZT5gXG4gICAgY29uc3QgdmFsID0gcmF3QXJnc1tpICsgMV07XG4gICAgaWYgKHZhbCAmJiAhdmFsLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgaWYgKCFmbGFncy5jb2xsZWN0aW9uKSBmbGFncy5jb2xsZWN0aW9uID0gW107XG4gICAgICAoZmxhZ3MuY29sbGVjdGlvbiBhcyBzdHJpbmdbXSkucHVzaCh2YWwpO1xuICAgICAgaSsrOyAvLyBjb25zdW1lIG5leHQgYXJnXG4gICAgfVxuICB9IGVsc2UgaWYgKGEuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgY29uc3QgW2ssIHZdID0gYS5yZXBsYWNlKC9eLS0vLCBcIlwiKS5zcGxpdChcIj1cIik7XG4gICAgZmxhZ3Nba10gPSB2ID09PSB1bmRlZmluZWQgPyB0cnVlIDogdjtcbiAgfSBlbHNlIHtcbiAgICBwb3NpdGlvbmFscy5wdXNoKGEpO1xuICB9XG59XG5cbi8vIElmIHVzZXIgcGFzc2VkIC0tYXBpLWtleSBvciAtLWJhc2UtdXJsLCBzZXQgdGhlbSBpbW1lZGlhdGVseSBzbyBkeW5hbWljIGltcG9ydHMgc2VlIHRoZW0uXG5pZiAoZmxhZ3NbXCJhcGkta2V5XCJdKSB7XG4gIC8vIGRvIE5PVCBsb2cgdGhlIGtleSB0byBhdm9pZCBhY2NpZGVudGFsIGxlYWthZ2UgaW4gbG9nc1xuICBwcm9jZXNzLmVudi5PVVRMSU5FX0FQSV9LRVkgPSBTdHJpbmcoZmxhZ3NbXCJhcGkta2V5XCJdKTtcbn1cbmlmIChmbGFnc1tcImJhc2UtdXJsXCJdKSB7XG4gIHByb2Nlc3MuZW52Lk9VVExJTkVfQkFTRV9VUkwgPSBTdHJpbmcoZmxhZ3NbXCJiYXNlLXVybFwiXSk7XG59XG5cbmlmIChwb3NpdGlvbmFscy5pbmNsdWRlcyhcIi0taGVscFwiKSB8fCBmbGFncy5oZWxwIHx8IGZsYWdzLmgpIHtcbiAgY29uc29sZS5sb2coYFxuVXNhZ2U6XG4gIE9VVExJTkVfQVBJX0tFWT0uLi4gYnVuIHJ1biBiaW4vY2xpLnRzIFtjb21tYW5kXSBbLS1jb2xsZWN0aW9uPUlEXS4uLiBbLS1kcnktcnVuXSBbLS1hcGkta2V5PVwiLi4uXCJdXG5cbkNvbW1hbmRzOlxuICBzZXR1cCAgICAgICAgICAgICAgICAgICAgLSBpbnRlcmFjdGl2ZSBzZXR1cDogbGlzdCBjb2xsZWN0aW9ucywgY2hvb3NlIG9uZVxuICBsaXN0LWNvbGxlY3Rpb25zICAgICAgICAgLSBwcmludCBjb2xsZWN0aW9uc1xuICBpbml0IC0tY29sbGVjdGlvbj1JRCAgICAgLSBib290c3RyYXAgcGFnZXMuanNvbiArIG1hcmtkb3duIChyZXBlYXRhYmxlKVxuICBwdWxsIC0tY29sbGVjdGlvbj1JRCAgICAgLSBwdWxsIHJlbW90ZSBjaGFuZ2VzIChyZXBlYXRhYmxlKVxuICBwdXNoIC0tY29sbGVjdGlvbj1JRCAgICAgLSBwdXNoIGxvY2FsIGNoYW5nZXMgKHJlcGVhdGFibGUpXG4gIHN5bmMgLS1jb2xsZWN0aW9uPUlEICAgICAtIGJpZGlyZWN0aW9uYWwgc3luYyAocmVwZWF0YWJsZSlcblxuRmxhZ3M6XG4gIC0tY29sbGVjdGlvbj1JRCAgICAgICAgICBSZXBlYXRhYmxlOyBydW4gY29tbWFuZCBhZ2FpbnN0IG11bHRpcGxlIGNvbGxlY3Rpb25zXG4gIC0tYXBpLWtleT1cIi4uLlwiICAgICAgICAgIFByb3ZpZGUgT3V0bGluZSBBUEkga2V5IChvdmVycmlkZXMgZW52IHZhcilcbiAgLS1iYXNlLXVybD1cIi4uLlwiICAgICAgICAgUHJvdmlkZSBPdXRsaW5lIGJhc2UgVVJMIChvdmVycmlkZXMgZW52IHZhcilcbiAgLS1kcnktcnVuICAgICAgICAgICAgICAgIFByZXZpZXcgb25seVxuICAtLWhlbHAsIC1oXG5FeGFtcGxlczpcbiAgT1VUTElORV9BUElfS0VZPS4uLiBidW54IEBkb2Nrc3RhdC9vdXRsaW5lLXN5bmMgLS1jb2xsZWN0aW9uPVwiaWQxXCIgLS1jb2xsZWN0aW9uPVwiaWQyXCIgc3luYyAtLWRyeS1ydW5cbiAgYnVuIHJ1biBiaW4vY2xpLnRzIHN5bmMgLS1hcGkta2V5PVwic2tfeHh4XCIgLS1jb2xsZWN0aW9uPVwiaWQxXCJcbmApO1xuICBwcm9jZXNzLmV4aXQoMCk7XG59XG5cbmNvbnN0IHsgbG9hZFRvcENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbGliL2NvbmZpZ1wiKTtcbmNvbnN0IHsgbGlzdENvbGxlY3Rpb25zUHJvbXB0LCBib290c3RyYXBDb2xsZWN0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXG4gIFwiLi4vbGliL2luaXRcIlxuKTtcbmNvbnN0IHsgcnVuU3luYyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbGliL3N5bmNFbmdpbmVcIik7XG5cbmNvbnN0IGNtZCA9IHBvc2l0aW9uYWxzWzBdIHx8IFwic3luY1wiO1xuY29uc3QgRFJZX1JVTiA9IEJvb2xlYW4oZmxhZ3NbXCJkcnktcnVuXCJdKTtcbmNvbnN0IGNvbGxlY3Rpb25zRnJvbUNsaSA9IChmbGFncy5jb2xsZWN0aW9uIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcblxudHJ5IHtcbiAgY29uc3QgdG9wQ29uZmlnID0gKGF3YWl0IGxvYWRUb3BDb25maWcoKSkgfHwgeyBjb2xsZWN0aW9uczogW10gfTtcblxuICBjb25zdCByZXNvbHZlVGFyZ2V0cyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKGNvbGxlY3Rpb25zRnJvbUNsaS5sZW5ndGggPiAwKSByZXR1cm4gY29sbGVjdGlvbnNGcm9tQ2xpO1xuICAgIGlmICh0b3BDb25maWcuY29sbGVjdGlvbnMgJiYgdG9wQ29uZmlnLmNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMubWFwKChjKSA9PiBjLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIGlmIChjbWQgPT09IFwibGlzdC1jb2xsZWN0aW9uc1wiKSB7XG4gICAgYXdhaXQgbGlzdENvbGxlY3Rpb25zUHJvbXB0KHsgZHJ5UnVuOiBEUllfUlVOLCBub25JbnRlcmFjdGl2ZTogZmFsc2UgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgaWYgKGNtZCA9PT0gXCJzZXR1cFwiKSB7XG4gICAgYXdhaXQgbGlzdENvbGxlY3Rpb25zUHJvbXB0KHsgZHJ5UnVuOiBEUllfUlVOLCBub25JbnRlcmFjdGl2ZTogZmFsc2UgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgaWYgKGNtZCA9PT0gXCJpbml0XCIpIHtcbiAgICBjb25zdCB0YXJnZXRzID0gcmVzb2x2ZVRhcmdldHMoKTtcbiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkluaXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbGxlY3Rpb24uIFByb3ZpZGUgLS1jb2xsZWN0aW9uIG9yIHJ1biBzZXR1cC5cIixcbiAgICAgICk7XG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uSWQgb2YgdGFyZ2V0cykge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcXG49PT4gYm9vdHN0cmFwcGluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbklkfSAoZHJ5UnVuPSR7RFJZX1JVTn0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBib290c3RyYXBDb2xsZWN0aW9uKHsgY29sbGVjdGlvbklkLCBkcnlSdW46IERSWV9SVU4gfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwicHVsbFwiIHx8IGNtZCA9PT0gXCJwdXNoXCIgfHwgY21kID09PSBcInN5bmNcIikge1xuICAgIGNvbnN0IHRhcmdldHMgPSByZXNvbHZlVGFyZ2V0cygpO1xuICAgIGlmICghdGFyZ2V0cy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21tYW5kIFwiJHtjbWR9XCIgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGNvbGxlY3Rpb24gaWQuIFByb3ZpZGUgd2l0aCAtLWNvbGxlY3Rpb249SUQgb3IgcnVuIHNldHVwLmAsXG4gICAgICApO1xuICAgIGNvbnN0IG1vZGUgPSBjbWQgPT09IFwicHVsbFwiID8gXCJwdWxsXCIgOiBjbWQgPT09IFwicHVzaFwiID8gXCJwdXNoXCIgOiBcInN5bmNcIjtcbiAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb25JZCBvZiB0YXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuPT0+IFJ1bm5pbmcgJHttb2RlfSBmb3IgY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gKTtcbiAgICAgIGF3YWl0IHJ1blN5bmMoeyBjb2xsZWN0aW9uSWQsIG1vZGU6IG1vZGUgYXMgYW55LCBkcnlSdW46IERSWV9SVU4gfSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoXCJVbmtub3duIGNvbW1hbmQ6XCIsIGNtZCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0gY2F0Y2ggKGVycjogYW55KSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJFUlJPUjpcIiwgZXJyPy5tZXNzYWdlIHx8IGVycik7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZXhwb3J0IHt9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7MlpBQUEsZ0NBQ0EscUJBQVMsZ0JBQ1QseUJBUUEsZUFBc0IsQ0FBZSxFQUFHLENBQ3RDLElBQUssRUFBVyxDQUFVLEVBQ3hCLE1BQU0sRUFBRyxNQUFNLEVBQVksQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUlsRCxlQUFzQixDQUFhLEVBQThCLENBQy9ELElBQUssRUFBVyxDQUFlLEVBQUcsT0FBTyxLQUN6QyxJQUFNLEVBQU0sTUFBTSxFQUFHLFNBQVMsRUFBaUIsTUFBTSxFQUNyRCxPQUFPLEtBQUssTUFBTSxDQUFHLEVBR3ZCLGVBQXNCLEVBQWEsQ0FBQyxFQUFnQixDQUNsRCxNQUFNLEVBQWdCLEVBQ3RCLE1BQU0sRUFBRyxVQUNQLEVBQ0EsR0FBRyxLQUFLLFVBQVUsRUFBSyxLQUFNLENBQUM7QUFBQSxFQUM5QixNQUNGLEVBR0YsZUFBc0IsQ0FBc0IsQ0FBQyxFQUkxQyxDQUNELElBQU0sRUFBWSxNQUFNLEVBQWMsRUFHdEMsSUFBSyxJQUFjLEVBQVUsWUFDM0IsTUFBTyxDQUNMLFVBQVcsRUFBSyxLQUFLLEVBQVksR0FBRyxjQUF5QixFQUM3RCxXQUFZLEVBQUssS0FBSyxFQUFZLEdBQUcsZUFBMEIsRUFDL0QsUUFBUyxNQUNYLEVBSUYsSUFBTSxFQUFtQixFQUFVLFlBQVksS0FDN0MsQ0FBQyxJQUFNLEVBQUUsS0FBTyxDQUNsQixFQUdBLElBQUssRUFDSCxNQUFPLENBQ0wsVUFBVyxFQUFLLEtBQUssRUFBWSxHQUFHLGNBQXlC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LGFBQXdCLElBQzVELEVBQ0EsTUFBTSxHQUFvQixDQUFFLGVBQWMsT0FBUSxDQUFRLENBQUMsRUFFN0QsUUFBUSxLQUFLLENBQUMsRUFHaEIsR0FBSSxJQUFRLFFBQVUsSUFBUSxRQUFVLElBQVEsT0FBUSxDQUN0RCxJQUFNLEVBQVUsRUFBZSxFQUMvQixJQUFLLEVBQVEsT0FDWCxNQUFNLElBQUksTUFDUixZQUFZLG9GQUNkLEVBQ0YsSUFBTSxFQUFPLElBQVEsT0FBUyxPQUFTLElBQVEsT0FBUyxPQUFTLE9BQ2pFLFFBQVcsS0FBZ0IsRUFDekIsUUFBUSxJQUFJO0FBQUEsY0FBaUIsb0JBQXVCLEdBQWMsRUFDbEUsTUFBTSxHQUFRLENBQUUsZUFBYyxLQUFNLEVBQWEsT0FBUSxDQUFRLENBQUMsRUFFcEUsUUFBUSxLQUFLLENBQUMsRUFHaEIsUUFBUSxNQUFNLG1CQUFvQixDQUFHLEVBQ3JDLFFBQVEsS0FBSyxDQUFDLEVBQ2QsTUFBTyxFQUFVLENBQ2pCLFFBQVEsTUFBTSxTQUFVLEdBQUssU0FBVyxDQUFHLEVBQzNDLFFBQVEsS0FBSyxDQUFDIiwKICAiZGVidWdJZCI6ICI3NTg0MDM4OEQwNDhENTM3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
38
+ //# debugId=FD181150AA38169B64756E2164756E21
39
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2NvbmZpZy50cyIsICIuLi9saWIvb3V0bGluZUFwaS50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi91dGlscy50cyIsICIuLi9saWIvaW5pdC50cyIsICIuLi9saWIvc3luY0VuZ2luZS50cyIsICIuLi9iaW4vY2xpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFRvcENvbmZpZywgVG9wQ29sbGVjdGlvbkNvbmZpZywgQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBUT1BfQ09ORklHX0ZJTEUgPSBwYXRoLmpvaW4oXCJvdXRsaW5lLXN5bmMuanNvblwiKTtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDb25maWdEaXIoZGlyOiBzdHJpbmcpIHtcbiAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDb25maWdEaXJzKGNmZzogVG9wQ29uZmlnKSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25zID0gY2ZnLmNvbGxlY3Rpb25zO1xuICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gb2YgY29sbGVjdGlvbnMpIHtcbiAgICBjb25zdCBkaXIgPSBjb2xsZWN0aW9uLmNvbmZpZ0RpcjtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUb3BDb25maWcoKTogUHJvbWlzZTxUb3BDb25maWcgfCBudWxsPiB7XG4gIGlmICghZXhpc3RzU3luYyhUT1BfQ09ORklHX0ZJTEUpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoVE9QX0NPTkZJR19GSUxFLCBcInV0ZjhcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVG9wQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVRvcENvbmZpZyhjZmc6IFRvcENvbmZpZykge1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXJzKGNmZyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBUT1BfQ09ORklHX0ZJTEUsXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkoY2ZnLCBudWxsLCAyKX1cXG5gLFxuICAgIFwidXRmOFwiLFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShjb2xsZWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8e1xuICBwYWdlc0ZpbGU6IHN0cmluZztcbiAgY29uZmlnRmlsZTogc3RyaW5nO1xuICBzYXZlRGlyOiBzdHJpbmc7XG4gIGNvbmZpZ0Rpcjogc3RyaW5nO1xufT4ge1xuICBjb25zdCB0b3BDb25maWcgPSBhd2FpdCBsb2FkVG9wQ29uZmlnKCk7XG4gIGNvbnN0IENPTkZJR19ESVIgPSB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZChcbiAgICAoY29sbGVjdGlvbikgPT4gY29sbGVjdGlvbi5pZCA9PT0gY29sbGVjdGlvbklkLFxuICApLmNvbmZpZ0RpcjtcblxuICAvLyBJZiBubyB0b3AgY29uZmlnIGV4aXN0cywgdXNlIGRlZmF1bHQgcGF0aHNcbiAgaWYgKCF0b3BDb25maWcgfHwgIXRvcENvbmZpZy5jb2xsZWN0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICAgIGNvbmZpZ0RpcjogQ09ORklHX0RJUixcbiAgICB9O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgY29sbGVjdGlvbiBjb25maWd1cmF0aW9uXG4gIGNvbnN0IGNvbGxlY3Rpb25Db25maWcgPSB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZChcbiAgICAoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkLFxuICApO1xuXG4gIC8vIElmIG5vIHNwZWNpZmljIGNvbGxlY3Rpb24gY29uZmlnIGZvdW5kLCB1c2UgZGVmYXVsdCBwYXRoc1xuICBpZiAoIWNvbGxlY3Rpb25Db25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZXNGaWxlOiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5wYWdlcy5qc29uYCksXG4gICAgICBjb25maWdGaWxlOiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5jb25maWcuanNvbmApLFxuICAgICAgc2F2ZURpcjogXCJkb2NzXCIsXG4gICAgICBjb25maWdEaXI6IFwiLmNvbmZpZ1wiLFxuICAgIH07XG4gIH1cblxuICAvLyBVc2UgY3VzdG9tIHBhdGhzIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGRlZmF1bHRzXG4gIHJldHVybiB7XG4gICAgcGFnZXNGaWxlOlxuICAgICAgY29sbGVjdGlvbkNvbmZpZy5wYWdlc0ZpbGUgfHxcbiAgICAgIHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICBjb25maWdGaWxlOlxuICAgICAgY29sbGVjdGlvbkNvbmZpZy5jb25maWdGaWxlIHx8XG4gICAgICBwYXRoLmpvaW4oQ09ORklHX0RJUiwgYCR7Y29sbGVjdGlvbklkfS5jb25maWcuanNvbmApLFxuICAgIHNhdmVEaXI6IGNvbGxlY3Rpb25Db25maWcuc2F2ZURpciB8fCBcImRvY3NcIixcbiAgICBjb25maWdEaXI6IGNvbGxlY3Rpb25Db25maWcuY29uZmlnRmlsZSB8fCBcIi5jb25maWdcIixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uQ29uZmlnKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbik6IFByb21pc2U8Q29sbGVjdGlvbkNvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgeyBjb25maWdGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmICghZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKGNvbmZpZ0ZpbGUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDb2xsZWN0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblRvcENvbmZpZyhcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPFRvcENvbGxlY3Rpb25Db25maWcgfCBudWxsPiB7XG4gIGNvbnN0IHRvcENvbmZpZyA9IGF3YWl0IGxvYWRUb3BDb25maWcoKTtcbiAgaWYgKCF0b3BDb25maWcgfHwgIXRvcENvbmZpZy5jb2xsZWN0aW9ucykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0b3BDb25maWcuY29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY29sbGVjdGlvbklkKSB8fCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbGxlY3Rpb25Db25maWcoYzogQ29sbGVjdGlvbkNvbmZpZykge1xuICBjb25zdCB7IGNvbmZpZ0ZpbGUsIGNvbmZpZ0RpciB9ID0gYXdhaXQgZ2V0Q29sbGVjdGlvbkZpbGVzQmFzZShcbiAgICBjLmNvbGxlY3Rpb25JZCxcbiAgKTtcbiAgYXdhaXQgZW5zdXJlQ29uZmlnRGlyKGNvbmZpZ0Rpcik7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShjb25maWdGaWxlLCBgJHtKU09OLnN0cmluZ2lmeShjLCBudWxsLCAyKX1cXG5gLCBcInV0ZjhcIik7XG59XG4iLAogICAgImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5jb25zdCBCQVNFX1VSTCA9IHByb2Nlc3MuZW52Lk9VVExJTkVfQkFTRV9VUkwgfHwgXCJodHRwczovL2FwcC5nZXRvdXRsaW5lLmNvbVwiO1xuY29uc3QgQVBJX0tFWSA9IHByb2Nlc3MuZW52Lk9VVExJTkVfQVBJX0tFWSB8fCBcIlwiO1xuY29uc3QgSEVBREVSUyA9IHtcbiAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke0FQSV9LRVl9YCxcbiAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG59O1xuXG5hc3luYyBmdW5jdGlvbiBvdXRsaW5lUmVxdWVzdChcbiAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgYm9keTogYW55LFxuICByZXRyaWVzID0gMyxcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IHVybCA9IGAke0JBU0VfVVJMfS9hcGkvJHtlbmRwb2ludH1gO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogSEVBREVSUyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgYmFja29mZiA9IDEwMDAgKiAoYXR0ZW1wdCArIDEpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFJhdGUgbGltaXRlZC4gYmFja2luZyBvZmYgJHtiYWNrb2ZmfW1zYCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIGJhY2tvZmYpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtPdXRsaW5lQCR7QkFTRV9VUkx9L2FwaS8ke2VuZHBvaW50fV0gJHtyZXMuc3RhdHVzfSAke2VuZHBvaW50fSBwYXlsb2FkPWAsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBcInJlc3BvbnNlPVwiLFxuICAgICAgICAgIGpzb24sXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgT3V0bGluZSBBUEkgZXJyb3IgJHtyZXMuc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShqc29uKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGpzb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gcmV0cmllcyAtIDEpIHRocm93IGVycjtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFJlcXVlc3QgZmFpbGVkIChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9KTogJHtlcnJ9LiBSZXRyeWluZy4uLmAsXG4gICAgICApO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgNTAwICogKGF0dGVtcHQgKyAxKSkpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJvdXRsaW5lUmVxdWVzdDogdW5yZWFjaGFibGVcIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q29sbGVjdGlvbnNQYWdlZCgpOiBQcm9taXNlPFxuICB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W11cbj4ge1xuICBjb25zdCBvdXQ6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgY29uc3QgbGltaXQgPSAxMDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IG91dGxpbmVSZXF1ZXN0KFwiY29sbGVjdGlvbnMubGlzdFwiLCB7IG9mZnNldCwgbGltaXQgfSk7XG4gICAgY29uc3QgZGF0YSA9IGpzb24uZGF0YSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YSkgb3V0LnB1c2goeyBpZDogYy5pZCwgbmFtZTogYy5uYW1lIH0pO1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IGxpbWl0KSBicmVhaztcbiAgICBvZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3REb2N1bWVudHNJbkNvbGxlY3Rpb24oXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnlbXT4ge1xuICBjb25zdCBvdXQ6IGFueVtdID0gW107XG4gIGxldCBvZmZzZXQgPSAwO1xuICBjb25zdCBsaW1pdCA9IDEwMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgb3V0bGluZVJlcXVlc3QoXCJkb2N1bWVudHMubGlzdFwiLCB7XG4gICAgICBjb2xsZWN0aW9uSWQsXG4gICAgICBvZmZzZXQsXG4gICAgICBsaW1pdCxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0ganNvbi5kYXRhIHx8IFtdO1xuICAgIGZvciAoY29uc3QgZCBvZiBkYXRhKSBvdXQucHVzaChkKTtcbiAgICBpZiAoZGF0YS5sZW5ndGggPCBsaW1pdCkgYnJlYWs7XG4gICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaERvY3VtZW50SW5mbyhkb2N1bWVudElkOiBzdHJpbmcpIHtcbiAgY29uc3QganNvbiA9IGF3YWl0IG91dGxpbmVSZXF1ZXN0KFwiZG9jdW1lbnRzLmluZm9cIiwgeyBpZDogZG9jdW1lbnRJZCB9KTtcbiAgcmV0dXJuIGpzb24uZGF0YSA/PyBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRG9jdW1lbnQoXG4gIHRpdGxlOiBzdHJpbmcsXG4gIHRleHQ6IHN0cmluZyxcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gIHBhcmVudERvY3VtZW50SWQ6IHN0cmluZyB8IG51bGwsXG4pIHtcbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICB0aXRsZSxcbiAgICB0ZXh0LFxuICAgIGNvbGxlY3Rpb25JZCxcbiAgICBwYXJlbnREb2N1bWVudElkOiBwYXJlbnREb2N1bWVudElkIHx8IG51bGwsXG4gICAgcHVibGlzaDogdHJ1ZSxcbiAgfTtcbiAgY29uc3QganNvbiA9IGF3YWl0IG91dGxpbmVSZXF1ZXN0KFwiZG9jdW1lbnRzLmNyZWF0ZVwiLCBwYXlsb2FkKTtcbiAgcmV0dXJuIGpzb24uZGF0YTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURvY3VtZW50KFxuICBpZDogc3RyaW5nLFxuICB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0ZXh0OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgcGF5bG9hZDogYW55ID0geyBpZCwgdGV4dCwgcHVibGlzaDogdHJ1ZSB9O1xuICBpZiAodGl0bGUpIHBheWxvYWQudGl0bGUgPSB0aXRsZTtcbiAgY29uc3QganNvbiA9IGF3YWl0IG91dGxpbmVSZXF1ZXN0KFwiZG9jdW1lbnRzLnVwZGF0ZVwiLCBwYXlsb2FkKTtcbiAgcmV0dXJuIGpzb24uZGF0YTtcbn1cbiIsCiAgICAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgVG9wQ29uZmlnLCBUb3BDb2xsZWN0aW9uQ29uZmlnLCBDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IFRPUF9DT05GSUdfRklMRSA9IHBhdGguam9pbihcIm91dGxpbmUtc3luYy5qc29uXCIpO1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcihkaXI6IHN0cmluZykge1xuICBpZiAoIWV4aXN0c1N5bmMoZGlyKSkge1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUNvbmZpZ0RpcnMoY2ZnOiBUb3BDb25maWcpIHtcbiAgY29uc3QgY29sbGVjdGlvbnMgPSBjZmcuY29sbGVjdGlvbnM7XG4gIGZvciAoY29uc3QgY29sbGVjdGlvbiBvZiBjb2xsZWN0aW9ucykge1xuICAgIGNvbnN0IGRpciA9IGNvbGxlY3Rpb24uY29uZmlnRGlyO1xuICAgIGlmICghZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRvcENvbmZpZygpOiBQcm9taXNlPFRvcENvbmZpZyB8IG51bGw+IHtcbiAgaWYgKCFleGlzdHNTeW5jKFRPUF9DT05GSUdfRklMRSkpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBhd2FpdCBmcy5yZWFkRmlsZShUT1BfQ09ORklHX0ZJTEUsIFwidXRmOFwiKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUb3BDb25maWc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVG9wQ29uZmlnKGNmZzogVG9wQ29uZmlnKSB7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0RpcnMoY2ZnKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIFRPUF9DT05GSUdfRklMRSxcbiAgICBgJHtKU09OLnN0cmluZ2lmeShjZmcsIG51bGwsIDIpfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7XG4gIHBhZ2VzRmlsZTogc3RyaW5nO1xuICBjb25maWdGaWxlOiBzdHJpbmc7XG4gIHNhdmVEaXI6IHN0cmluZztcbiAgY29uZmlnRGlyOiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IHRvcENvbmZpZyA9IGF3YWl0IGxvYWRUb3BDb25maWcoKTtcbiAgY29uc3QgQ09ORklHX0RJUiA9IHRvcENvbmZpZy5jb2xsZWN0aW9ucy5maW5kKFxuICAgIChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLmlkID09PSBjb2xsZWN0aW9uSWQsXG4gICkuY29uZmlnRGlyO1xuXG4gIC8vIElmIG5vIHRvcCBjb25maWcgZXhpc3RzLCB1c2UgZGVmYXVsdCBwYXRoc1xuICBpZiAoIXRvcENvbmZpZyB8fCAhdG9wQ29uZmlnLmNvbGxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgICAgY29uZmlnRmlsZTogcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0uY29uZmlnLmpzb25gKSxcbiAgICAgIHNhdmVEaXI6IFwiZG9jc1wiLFxuICAgICAgY29uZmlnRGlyOiBDT05GSUdfRElSLFxuICAgIH07XG4gIH1cblxuICAvLyBGaW5kIHRoZSBjb2xsZWN0aW9uIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgY29sbGVjdGlvbkNvbmZpZyA9IHRvcENvbmZpZy5jb2xsZWN0aW9ucy5maW5kKFxuICAgIChjKSA9PiBjLmlkID09PSBjb2xsZWN0aW9uSWQsXG4gICk7XG5cbiAgLy8gSWYgbm8gc3BlY2lmaWMgY29sbGVjdGlvbiBjb25maWcgZm91bmQsIHVzZSBkZWZhdWx0IHBhdGhzXG4gIGlmICghY29sbGVjdGlvbkNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlc0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICAgIGNvbmZpZ0RpcjogXCIuY29uZmlnXCIsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFVzZSBjdXN0b20gcGF0aHMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gZGVmYXVsdHNcbiAgcmV0dXJuIHtcbiAgICBwYWdlc0ZpbGU6XG4gICAgICBjb2xsZWN0aW9uQ29uZmlnLnBhZ2VzRmlsZSB8fFxuICAgICAgcGF0aC5qb2luKENPTkZJR19ESVIsIGAke2NvbGxlY3Rpb25JZH0ucGFnZXMuanNvbmApLFxuICAgIGNvbmZpZ0ZpbGU6XG4gICAgICBjb2xsZWN0aW9uQ29uZmlnLmNvbmZpZ0ZpbGUgfHxcbiAgICAgIHBhdGguam9pbihDT05GSUdfRElSLCBgJHtjb2xsZWN0aW9uSWR9LmNvbmZpZy5qc29uYCksXG4gICAgc2F2ZURpcjogY29sbGVjdGlvbkNvbmZpZy5zYXZlRGlyIHx8IFwiZG9jc1wiLFxuICAgIGNvbmZpZ0RpcjogY29sbGVjdGlvbkNvbmZpZy5jb25maWdGaWxlIHx8IFwiLmNvbmZpZ1wiLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbGxlY3Rpb25Db25maWcoXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuKTogUHJvbWlzZTxDb2xsZWN0aW9uQ29uZmlnIHwgbnVsbD4ge1xuICBjb25zdCB7IGNvbmZpZ0ZpbGUgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcbiAgaWYgKCFleGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoY29uZmlnRmlsZSwgXCJ1dGY4XCIpO1xuICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIENvbGxlY3Rpb25Db25maWc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uVG9wQ29uZmlnKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbik6IFByb21pc2U8VG9wQ29sbGVjdGlvbkNvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgdG9wQ29uZmlnID0gYXdhaXQgbG9hZFRvcENvbmZpZygpO1xuICBpZiAoIXRvcENvbmZpZyB8fCAhdG9wQ29uZmlnLmNvbGxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHRvcENvbmZpZy5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjb2xsZWN0aW9uSWQpIHx8IG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlQ29sbGVjdGlvbkNvbmZpZyhjOiBDb2xsZWN0aW9uQ29uZmlnKSB7XG4gIGNvbnN0IHsgY29uZmlnRmlsZSwgY29uZmlnRGlyIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKFxuICAgIGMuY29sbGVjdGlvbklkLFxuICApO1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXIoY29uZmlnRGlyKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGNvbmZpZ0ZpbGUsIGAke0pTT04uc3RyaW5naWZ5KGMsIG51bGwsIDIpfVxcbmAsIFwidXRmOFwiKTtcbn1cbiIsCiAgICAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuLyoqXG4gKiBSZW1vdmUgQUxMIHdoaXRlc3BhY2UgKHNwYWNlLCB0YWIsIG5ld2xpbmUsIENSKSBmb3IgY29tcGFyaXNvbi5cbiAqIFRoaXMgbWFrZXMgZGlmZnMgdG9sZXJhbnQgdG8gZm9ybWF0dGluZyBkaWZmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlKHM6IHN0cmluZykge1xuICByZXR1cm4gcy5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeVRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHRpdGxlXG4gICAgLnRvU3RyaW5nKClcbiAgICAubm9ybWFsaXplKFwiTkZLRFwiKVxuICAgIC5yZXBsYWNlKC9cXHB7TX0vZ3UsIFwiXCIpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIi1cIilcbiAgICAucmVwbGFjZSgvKF4tfC0kKSsvZywgXCJcIilcbiAgICAuc2xpY2UoMCwgMTIwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdFRpbWVzdGFtcE1zKGZpbGVQYXRoOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG4gICAgY29uc3Qgb3V0ID0gc3Bhd25TeW5jKFxuICAgICAgXCJnaXRcIixcbiAgICAgIFtcImxvZ1wiLCBcIi0xXCIsIFwiLS1mb3JtYXQ9JWN0XCIsIFwiLS1cIiwgcmVzb2x2ZWRdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAob3V0LnN0YXR1cyAhPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdHh0ID0gKG91dC5zdGRvdXQgfHwgXCJcIikudHJpbSgpO1xuICAgIGlmICghdHh0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzZWMgPSBOdW1iZXIodHh0KTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHNlYykpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBzZWMgKiAxMDAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYWxUaW1lc3RhbXBNcyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZ2l0VHMgPSBnZXRHaXRUaW1lc3RhbXBNcyhmaWxlUGF0aCk7XG4gIGlmIChnaXRUcykgcmV0dXJuIGdpdFRzO1xuICBjb25zdCBzdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICByZXR1cm4gc3QubXRpbWVNcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVXcml0ZUZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZHJ5UnVuID0gZmFsc2UsXG4pIHtcbiAgaWYgKGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgY29uc3QgYmFrID0gYCR7ZmlsZVBhdGh9Lm91dGxpbmUtc3luYy5iYWsuJHtEYXRlLm5vdygpfWA7XG4gICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKGZpbGVQYXRoLCBiYWspO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgQmFja2VkIHVwIGV4aXN0aW5nIGZpbGUgdG8gJHtiYWt9YCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIWRyeVJ1bikge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCwgXCJ1dGY4XCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtkcnktcnVuXSB3b3VsZCB3cml0ZSBmaWxlICR7ZmlsZVBhdGh9ICgke2NvbnRlbnQubGVuZ3RofSBieXRlcylgLFxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgbGlzdENvbGxlY3Rpb25zUGFnZWQsIGxpc3REb2N1bWVudHNJbkNvbGxlY3Rpb24gfSBmcm9tIFwiLi9vdXRsaW5lQXBpXCI7XG5pbXBvcnQge1xuICBsb2FkVG9wQ29uZmlnLFxuICBzYXZlVG9wQ29uZmlnLFxuICBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlLFxuICBzYXZlQ29sbGVjdGlvbkNvbmZpZyxcbiAgZW5zdXJlQ29uZmlnRGlyLFxuICBlbnN1cmVDb25maWdEaXJzLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzbHVnaWZ5VGl0bGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWdlRW50cnksIE1hbmlmZXN0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBQcm9tcHQgaGVscGVyIChzaW1wbGUpOiBwcmludHMgbnVtYmVyZWQgbGlzdCBhbmQgcmVhZHMgYSBsaW5lIGZyb20gc3RkaW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q29sbGVjdGlvbnNQcm9tcHQob3B0czoge1xuICBkcnlSdW4/OiBib29sZWFuO1xuICBub25JbnRlcmFjdGl2ZT86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IGNvbHMgPSBhd2FpdCBsaXN0Q29sbGVjdGlvbnNQYWdlZCgpO1xuICBpZiAoIWNvbHMubGVuZ3RoKSB7XG4gICAgY29uc29sZS5sb2coXCJObyBjb2xsZWN0aW9ucyBmb3VuZCBmb3IgdGhpcyBBUEkga2V5LlwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5sb2coXCJDb2xsZWN0aW9uczpcIik7XG4gIGNvbHMuZm9yRWFjaCgoYywgaSkgPT4gY29uc29sZS5sb2coYCR7aSArIDF9KSAke2MuaWR9XFx0JHtjLm5hbWV9YCkpO1xuICBpZiAob3B0cy5ub25JbnRlcmFjdGl2ZSkgcmV0dXJuO1xuICBjb25zdCBzZWxlY3Rpb24gPSBhd2FpdCBxdWVzdGlvbihcbiAgICBcIlNlbGVjdCBhIGNvbGxlY3Rpb24gYnkgbnVtYmVyIChvciBwcmVzcyBFbnRlciB0byBjYW5jZWwpOiBcIixcbiAgKTtcbiAgY29uc3QgaWR4ID0gTnVtYmVyKHNlbGVjdGlvbi50cmltKCkpO1xuICBpZiAoIWlkeCB8fCBpZHggPCAxIHx8IGlkeCA+IGNvbHMubGVuZ3RoKSB7XG4gICAgY29uc29sZS5sb2coXCJDYW5jZWxsZWQuXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjaG9zZW4gPSBjb2xzW2lkeCAtIDFdO1xuICBjb25zb2xlLmxvZyhgWW91IGNob3NlOiAke2Nob3Nlbi5uYW1lfSAoJHtjaG9zZW4uaWR9KWApO1xuICBhd2FpdCBlbnN1cmVDb25maWdEaXJzKGF3YWl0IGxvYWRUb3BDb25maWcoKSk7XG4gIGNvbnN0IHRvcCA9IChhd2FpdCBsb2FkVG9wQ29uZmlnKCkpIHx8IHsgY29sbGVjdGlvbnM6IFtdIH07XG4gIGNvbnN0IGV4aXN0cyA9IHRvcC5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjaG9zZW4uaWQpO1xuICBsZXQgY29uZmlnRGlyID0gYXdhaXQgcXVlc3Rpb24oXG4gICAgXCJFbnRlciBhIGJhc2UgZm9sZGVyIHBhdGggZm9yIHRoZSBjb2xsZWN0aW9ucyBjb25maWcgZmlsZXMgKG9yIHByZXNzIGVudGVyIGZvciBkZWZhdWx0IGAuY29uZmlnYCk6IFwiLFxuICApO1xuXG4gIGlmIChjb25maWdEaXIudHJpbSgpLmxlbmd0aCA8PSAxKSB7XG4gICAgY29uZmlnRGlyID0gXCIuY29uZmlnXCI7XG4gIH1cblxuICBpZiAoIWV4aXN0cykge1xuICAgIGNvbnN0IGRlZmF1bHRTYXZlRGlyID0gXCJkb2NzXCI7XG4gICAgdG9wLmNvbGxlY3Rpb25zLnVuc2hpZnQoe1xuICAgICAgaWQ6IGNob3Nlbi5pZCxcbiAgICAgIG5hbWU6IGNob3Nlbi5uYW1lLFxuICAgICAgY29uZmlnRGlyOiBjb25maWdEaXIsXG4gICAgICBzYXZlRGlyOiBkZWZhdWx0U2F2ZURpcixcbiAgICAgIHBhZ2VzRmlsZTogcGF0aC5qb2luKFwiY29uZmlnc1wiLCBgJHtjaG9zZW4uaWR9LnBhZ2VzLmpzb25gKSxcbiAgICAgIGNvbmZpZ0ZpbGU6IHBhdGguam9pbihcImNvbmZpZ3NcIiwgYCR7Y2hvc2VuLmlkfS5jb25maWcuanNvbmApLFxuICAgIH0pO1xuICAgIGF3YWl0IHNhdmVUb3BDb25maWcodG9wKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBBZGRlZCBjb2xsZWN0aW9uIHRvICR7cGF0aC5qb2luKFwiY29uZmlnc1wiLCBcIm91dGxpbmUtc3luYy5qc29uXCIpfWAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcIkNvbGxlY3Rpb24gYWxyZWFkeSBjb25maWd1cmVkLlwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFNpbXBsZSBzdGRpbiBsaW5lIHJlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlc3Rpb24ocHJvbXB0VGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocHJvbXB0VGV4dCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgICBwcm9jZXNzLnN0ZGluLm9uY2UoXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICBwcm9jZXNzLnN0ZGluLnBhdXNlKCk7XG4gICAgICByZXNvbHZlKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJvb3RzdHJhcDogZmV0Y2ggZG9jdW1lbnRzIGZyb20gY29sbGVjdGlvbiwgY3JlYXRlIHBhZ2VzLmpzb24gYW5kIHdyaXRlIG1hcmtkb3duIGZpbGVzLlxuICogTm93OiBmb2xkZXItYmFzZWQgc3RydWN0dXJlIGJ5IGluaGVyaXRhbmNlLiBFYWNoIHBhZ2UgZ2V0cyBhIGRpcmVjdG9yeSBuYW1lZCBmcm9tIHRoZSBzbHVnLFxuICogYW5kIHRoZSBwYWdlIGl0c2VsZiBpcyBzYXZlZCBhcyBgUkVBRE1FLm1kYCBpbnNpZGUgdGhhdCBkaXJlY3RvcnkuIENoaWxkcmVuIGJlY29tZSBzdWJkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcENvbGxlY3Rpb24ob3B0czoge1xuICBjb2xsZWN0aW9uSWQ6IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBjb2xsZWN0aW9uSWQsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRzO1xuICBjb25zb2xlLmxvZyhgQm9vdHN0cmFwcGluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbklkfSAoZHJ5UnVuPSR7ZHJ5UnVufSkuLi5gKTtcbiAgY29uc3QgZG9jcyA9IGF3YWl0IGxpc3REb2N1bWVudHNJbkNvbGxlY3Rpb24oY29sbGVjdGlvbklkKTtcbiAgY29uc29sZS5sb2coYEZldGNoZWQgJHtkb2NzLmxlbmd0aH0gZG9jdW1lbnRzIGZyb20gT3V0bGluZS5gKTtcblxuICAvLyAxKSBidWlsZCBmbGF0IG1hcCBvZiBub2RlcyB3aXRoIHJhd1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUGFnZUVudHJ5ICYgeyByYXc/OiBhbnkgfT4oKTtcbiAgZm9yIChjb25zdCBkIG9mIGRvY3MpIHtcbiAgICBtYXAuc2V0KGQuaWQsIHtcbiAgICAgIHRpdGxlOiBkLnRpdGxlLFxuICAgICAgZmlsZTogXCJcIixcbiAgICAgIGlkOiBkLmlkLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgcmF3OiBkLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gMikgYXR0YWNoIGNoaWxkcmVuIHVzaW5nIHBhcmVudERvY3VtZW50SWQgb3IgcGFyZW50SWRcbiAgY29uc3Qgcm9vdHM6IChQYWdlRW50cnkgJiB7IHJhdz86IGFueSB9KVtdID0gW107XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICBjb25zdCByYXcgPSBub2RlLnJhdyB8fCB7fTtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHJhdy5wYXJlbnREb2N1bWVudElkID8/IHJhdy5wYXJlbnRJZCA/PyBudWxsO1xuICAgIGlmIChwYXJlbnRJZCAmJiBtYXAuaGFzKHBhcmVudElkKSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gbWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdHMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyAzKSBhc3NpZ24gZm9sZGVyLWJhc2VkIGZpbGUgcGF0aHMgcmVjdXJzaXZlbHlcbiAgLy8gcGF0dGVybjogPHNhdmVEaXI+LzxhbmNlc3Rvci1zbHVnLTE+LzxhbmNlc3Rvci1zbHVnLTI+Lzx0aGlzLXNsdWc+L1JFQURNRS5tZFxuICAvLyBHZXQgdGhlIGNvbmZpZ3VyZWQgc2F2ZURpclxuICBjb25zdCB7IHNhdmVEaXIgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcblxuICBmdW5jdGlvbiBhc3NpZ25QYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHNsdWdpZnlUaXRsZShub2RlLnRpdGxlIHx8IFwidW50aXRsZWRcIik7XG4gICAgY29uc3QgZGlyID0gcGF0aC5qb2luKHBhcmVudERpciwgc2x1Zyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcIlJFQURNRS5tZFwiKTtcbiAgICBub2RlLmZpbGUgPSBmaWxlUGF0aDtcbiAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBhc3NpZ25QYXRocyhjLCBkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgciBvZiByb290cykge1xuICAgIGFzc2lnblBhdGhzKHIsIHNhdmVEaXIpO1xuICB9XG5cbiAgLy8gNCkgd3JpdGUgZmlsZXMgdG8gZGlza1xuICBmb3IgKGNvbnN0IG4gb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBuLmZpbGU7XG4gICAgY29uc3QgY29udGVudCA9IG4ucmF3Py50ZXh0ID8/IGAjICR7bi50aXRsZX1cXG5cXG5gO1xuICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCwgXCJ1dGY4XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtkcnktcnVuXSB3b3VsZCB3cml0ZSAke2ZpbGVQYXRofSAoJHtjb250ZW50Lmxlbmd0aH0gYnl0ZXMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gNSkgc3RyaXAgcmF3IGFuZCBidWlsZCBtYW5pZmVzdFxuICBmdW5jdGlvbiBzdHJpcChuOiBhbnkpOiBQYWdlRW50cnkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogbi50aXRsZSxcbiAgICAgIGZpbGU6IG4uZmlsZSxcbiAgICAgIGlkOiBuLmlkLFxuICAgICAgY2hpbGRyZW46IChuLmNoaWxkcmVuIHx8IFtdKS5tYXAoc3RyaXApLFxuICAgIH07XG4gIH1cbiAgY29uc3QgbWFuaWZlc3Q6IE1hbmlmZXN0ID0geyBjb2xsZWN0aW9uSWQsIHBhZ2VzOiByb290cy5tYXAoc3RyaXApIH07XG5cbiAgLy8gc2F2ZSBtYW5pZmVzdCBhbmQgY29uZmlnIGZpbGVzXG4gIGNvbnN0IHtcbiAgICBwYWdlc0ZpbGUsXG4gICAgY29uZmlnRmlsZSxcbiAgICBzYXZlRGlyOiBjb25maWd1cmVkU2F2ZURpcixcbiAgICBjb25maWdEaXIsXG4gIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGF3YWl0IGVuc3VyZUNvbmZpZ0Rpcihjb25maWdEaXIpO1xuICBpZiAoIWRyeVJ1bikge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIHBhZ2VzRmlsZSxcbiAgICAgIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gLFxuICAgICAgXCJ1dGY4XCIsXG4gICAgKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgY29uZmlnRmlsZSxcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoeyBjb2xsZWN0aW9uSWQsIHNhdmVEaXI6IGNvbmZpZ3VyZWRTYXZlRGlyLCBtYXBwaW5nczogW10gfSwgbnVsbCwgMil9XFxuYCxcbiAgICAgICAgXCJ1dGY4XCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0b3AgPSAoYXdhaXQgbG9hZFRvcENvbmZpZygpKSB8fCB7IGNvbGxlY3Rpb25zOiBbXSB9O1xuICAgIGNvbnN0IGV4aXN0c1RvcCA9IHRvcC5jb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLmlkID09PSBjb2xsZWN0aW9uSWQpO1xuICAgIGlmICghZXhpc3RzVG9wKSB7XG4gICAgICB0b3AuY29sbGVjdGlvbnMudW5zaGlmdCh7XG4gICAgICAgIGlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgIHNhdmVEaXI6IGNvbmZpZ3VyZWRTYXZlRGlyLFxuICAgICAgICBwYWdlc0ZpbGUsXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHNhdmVUb3BDb25maWcodG9wKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW2RyeS1ydW5dIHdvdWxkIHNhdmUgcGFnZXMgdG8gJHtwYWdlc0ZpbGV9IGFuZCBjb25maWcgdG8gJHtjb25maWdGaWxlfWAsXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmxvZyhgQm9vdHN0cmFwIGNvbXBsZXRlOiB3cm90ZSAke3BhZ2VzRmlsZX0gYW5kICR7Y29uZmlnRmlsZX1gKTtcbn1cbiIsCiAgICAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIGxvYWRUb3BDb25maWcsXG4gIGdldENvbGxlY3Rpb25GaWxlc0Jhc2UsXG4gIGxvYWRDb2xsZWN0aW9uQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlLFxuICBnZXRMb2NhbFRpbWVzdGFtcE1zLFxuICBzYWZlV3JpdGVGaWxlLFxuICBzbHVnaWZ5VGl0bGUsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBmZXRjaERvY3VtZW50SW5mbyxcbiAgdXBkYXRlRG9jdW1lbnQsXG4gIGNyZWF0ZURvY3VtZW50LFxufSBmcm9tIFwiLi9vdXRsaW5lQXBpXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0LCBQYWdlRW50cnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIExvYWQgcGFnZXMuanNvbiBmb3IgYSBjb2xsZWN0aW9uIChpZiBtaXNzaW5nLCBlcnJvci9hc2sgdG8gaW5pdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQYWdlc01hbmlmZXN0KFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbik6IFByb21pc2U8TWFuaWZlc3Q+IHtcbiAgY29uc3QgeyBwYWdlc0ZpbGUgfSA9IGF3YWl0IGdldENvbGxlY3Rpb25GaWxlc0Jhc2UoY29sbGVjdGlvbklkKTtcbiAgaWYgKCFleGlzdHNTeW5jKHBhZ2VzRmlsZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGFnZXNGaWxlfSBub3QgZm91bmQuIFJ1biBpbml0L3NldHVwIHRvIGNyZWF0ZSBpdGApO1xuICB9XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhZ2VzRmlsZSwgXCJ1dGY4XCIpO1xuICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIE1hbmlmZXN0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdFBhZ2VzTWFuaWZlc3QoXG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICBtYW5pZmVzdDogTWFuaWZlc3QsXG4gIGRyeVJ1biA9IGZhbHNlLFxuKSB7XG4gIGNvbnN0IHsgcGFnZXNGaWxlIH0gPSBhd2FpdCBnZXRDb2xsZWN0aW9uRmlsZXNCYXNlKGNvbGxlY3Rpb25JZCk7XG4gIGlmIChkcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZyhgW2RyeS1ydW5dIHdvdWxkIHBlcnNpc3QgbWFuaWZlc3QgdG8gJHtwYWdlc0ZpbGV9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBwYWdlc0ZpbGUsXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpfVxcbmAsXG4gICAgXCJ1dGY4XCIsXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBkZXN0aW5hdGlvbiBmaWxlIHBhdGggZm9yIGEgZG9jdW1lbnQgdXNpbmcgY29sbGVjdGlvbiBjb25maWcgbWFwcGluZ3MuXG4gKlxuICogUnVsZXM6XG4gKiAtIG1hcHBpbmcgd2l0aCBpZCBleGFjdCBtYXRjaCB3aW5zXG4gKiAtIG1hcHBpbmcgd2l0aCB0aXRsZSBleGFjdCBtYXRjaCBuZXh0XG4gKiAtIG1hcHBpbmcucGF0aCBtYXkgYmU6XG4gKiAgICAtIGEgZmlsZSBwYXRoIChlbmRpbmcgd2l0aCBgLm1kYCkgLT4gc2V0IG5vZGUuZmlsZSB0byB0aGF0IHBhdGhcbiAqICAgIC0gYSBkaXJlY3RvcnkgcGF0aCAoZW5kcyB3aXRoIGAvYCBvciBubyBleHRlbnNpb24pIC0+IHBsYWNlIG5vZGUgaW4gdGhhdCBkaXIgYXMgUkVBRE1FLm1kXG4gKiAtIGlmIG5vIG1hcHBpbmcsIGZhbGwgYmFjayB0byBpbmhlcml0ZWQgZm9sZGVyIGFwcHJvYWNoOlxuICogICAgcGFyZW50RGlyICsgc2x1Zy9SRUFETUUubWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWFwcGluZ3NUb01hbmlmZXN0KFxuICBtYW5pZmVzdDogTWFuaWZlc3QsXG4gIGNvbGxlY3Rpb25Db25maWc6IGFueSxcbikge1xuICBjb25zdCBydWxlcyA9IChjb2xsZWN0aW9uQ29uZmlnPy5tYXBwaW5ncyB8fCBbXSkgYXMge1xuICAgIG1hdGNoOiBhbnk7XG4gICAgcGF0aDogc3RyaW5nO1xuICB9W107XG5cbiAgZnVuY3Rpb24gaXNEaXJQYXRoKHA6IHN0cmluZykge1xuICAgIC8vIHRyZWF0IHRyYWlsaW5nIHNsYXNoIGFzIGRpcmVjdG9yeSBPUiBsYWNrIG9mIC5tZCBleHRlbnNpb24gYXMgZGlyZWN0b3J5XG4gICAgaWYgKCFwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHAuZW5kc1dpdGgoXCIvXCIpIHx8IHAuZW5kc1dpdGgocGF0aC5zZXApKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gcGF0aC5leHRuYW1lKHApLnRvTG93ZXJDYXNlKCkgIT09IFwiLm1kXCI7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVRvTm9kZShub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nIHwgbnVsbCkge1xuICAgIC8vIHRyeSBpZCBtYXRjaCB0aGVuIHRpdGxlIG1hdGNoXG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcnVsZXMpIHtcbiAgICAgIGlmIChyLm1hdGNoPy5pZCAmJiBub2RlLmlkID09PSByLm1hdGNoLmlkKSB7XG4gICAgICAgIGNvbnN0IHAgPSByLnBhdGg7XG4gICAgICAgIGlmIChpc0RpclBhdGgocCkpIHtcbiAgICAgICAgICBjb25zdCBkaXIgPSBwLmVuZHNXaXRoKFwiL1wiKSA/IHAgOiBwO1xuICAgICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiUkVBRE1FLm1kXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUuZmlsZSA9IHA7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiBydWxlcykge1xuICAgICAgICBpZiAoci5tYXRjaD8udGl0bGUgJiYgbm9kZS50aXRsZSA9PT0gci5tYXRjaC50aXRsZSkge1xuICAgICAgICAgIGNvbnN0IHAgPSByLnBhdGg7XG4gICAgICAgICAgaWYgKGlzRGlyUGF0aChwKSkge1xuICAgICAgICAgICAgY29uc3QgZGlyID0gcC5lbmRzV2l0aChcIi9cIikgPyBwIDogcDtcbiAgICAgICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiUkVBRE1FLm1kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmZpbGUgPSBwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHN0aWxsIG5vdCBhc3NpZ25lZCwgaW5oZXJpdCBmcm9tIHBhcmVudERpciBieSB1c2luZyBzbHVnIC0+IFJFQURNRS5tZFxuICAgIGlmICghbm9kZS5maWxlKSB7XG4gICAgICBjb25zdCBzbHVnID0gc2x1Z2lmeVRpdGxlKG5vZGUudGl0bGUgfHwgXCJ1bnRpdGxlZFwiKTtcbiAgICAgIGNvbnN0IGRpciA9IHBhcmVudERpclxuICAgICAgICA/IHBhdGguam9pbihwYXJlbnREaXIsIHNsdWcpXG4gICAgICAgIDogcGF0aC5qb2luKGNvbGxlY3Rpb25Db25maWc/LnNhdmVEaXIgfHwgXCJkb2NzXCIsIHNsdWcpO1xuICAgICAgbm9kZS5maWxlID0gcGF0aC5qb2luKGRpciwgXCJSRUFETUUubWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vZGUuZmlsZSBpcyBhIGJhcmUgZmlsZW5hbWUgKG5vIGRpcmVjdG9yeSkgPT4gcHV0IHVuZGVyIHBhcmVudERpciBvciBzYXZlRGlyXG4gICAgICBjb25zdCBoYXNEaXIgPSBwYXRoLmRpcm5hbWUobm9kZS5maWxlKSAmJiBwYXRoLmRpcm5hbWUobm9kZS5maWxlKSAhPT0gXCIuXCI7XG4gICAgICBpZiAoIWhhc0Rpcikge1xuICAgICAgICBjb25zdCBiYXNlRGlyID0gcGFyZW50RGlyIHx8IGNvbGxlY3Rpb25Db25maWc/LnNhdmVEaXIgfHwgXCJkb2NzXCI7XG4gICAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihiYXNlRGlyLCBub2RlLmZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgbWFwcGluZyBwcm92aWRlZCBhIGRpcmVjdG9yeS1saWtlIHBhdGggKG5vIC5tZCkgd2UgYWxyZWFkeSBoYW5kbGVkOyBvdGhlcndpc2UgcGF0aCBtYXkgYmUgcmVsYXRpdmUsIGtlZXAgYXMtaXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb21wdXRlIHRoaXMgbm9kZSdzIGRpciB0byBwYXNzIHRvIGNoaWxkcmVuIChkaXJlY3RvcnkgY29udGFpbmluZyBSRUFETUUubWQpXG4gICAgY29uc3Qgbm9kZURpciA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgYXBwbHlUb05vZGUoYywgbm9kZURpcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwIG9mIG1hbmlmZXN0LnBhZ2VzKSB7XG4gICAgYXBwbHlUb05vZGUocCBhcyBhbnksIG51bGwpO1xuICB9XG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBDb21wYXJlIGNvbnRlbnQgaWdub3Jpbmcgd2hpdGVzcGFjZS9uZXdsaW5lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZUNvbnRlbnRJZ25vcmVXaGl0ZXNwYWNlKGEpID09PSBub3JtYWxpemVDb250ZW50SWdub3JlV2hpdGVzcGFjZShiKVxuICApO1xufVxuXG4vKipcbiAqIERlY2lkZSB3aGV0aGVyIHRvIHB1bGwgb3IgcHVzaCBvciBza2lwIGZvciBvbmUgcGFnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmNQYWdlKFxuICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LFxuICBwYWdlOiBQYWdlRW50cnksXG4gIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxuICBvcHRzOiB7IG1vZGU6IFwicHVsbFwiIHwgXCJwdXNoXCIgfCBcInN5bmNcIjsgZHJ5UnVuPzogYm9vbGVhbiB9LFxuKSB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGFnZS5maWxlO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcbiAgY29uc3QgZmlsZUV4aXN0cyA9IGV4aXN0c1N5bmMoYWJzUGF0aCk7XG5cbiAgbGV0IGxvY2FsVHMgPSAwO1xuICBpZiAoZmlsZUV4aXN0cykge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFRzID0gYXdhaXQgZ2V0TG9jYWxUaW1lc3RhbXBNcyhhYnNQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvY2FsVHMgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGxldCByZW1vdGVEb2M6IGFueSA9IG51bGw7XG4gIGlmIChwYWdlLmlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlbW90ZURvYyA9IGF3YWl0IGZldGNoRG9jdW1lbnRJbmZvKHBhZ2UuaWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIHJlbW90ZSBpbmZvIGZvciAke3BhZ2UudGl0bGV9ICgke3BhZ2UuaWR9KTogJHtlcnJ9YCxcbiAgICAgICk7XG4gICAgICByZW1vdGVEb2MgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbW90ZVRleHQgPSByZW1vdGVEb2M/LnRleHQgPz8gbnVsbDtcbiAgY29uc3QgcmVtb3RlVXBkYXRlZEF0ID0gcmVtb3RlRG9jPy51cGRhdGVkQXRcbiAgICA/IG5ldyBEYXRlKHJlbW90ZURvYy51cGRhdGVkQXQpLmdldFRpbWUoKVxuICAgIDogMDtcblxuICAvLyBlbnN1cmUgbG9jYWwgZmlsZSBleGlzdHMgd2hlbiBuZWVkZWQgLSBjcmVhdGUgcGFyZW50IGRpcnNcbiAgaWYgKCFmaWxlRXhpc3RzKSB7XG4gICAgaWYgKG9wdHMubW9kZSA9PT0gXCJwdWxsXCIgfHwgb3B0cy5tb2RlID09PSBcInN5bmNcIiB8fCBvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBjb25zdCBkYXRhVG9Xcml0ZSA9XG4gICAgICAgIHJlbW90ZVRleHQgIT0gbnVsbCA/IHJlbW90ZVRleHQgOiBgIyAke3BhZ2UudGl0bGV9XFxuXFxuYDtcbiAgICAgIGF3YWl0IHNhZmVXcml0ZUZpbGUoYWJzUGF0aCwgZGF0YVRvV3JpdGUsIG9wdHMuZHJ5UnVuIHx8IGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgcmVtb3RlIGlmIG1pc3NpbmdcbiAgaWYgKCFwYWdlLmlkKSB7XG4gICAgY29uc3QgbG9jYWxDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYWJzUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGlmIChvcHRzLmRyeVJ1bikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbZHJ5LXJ1bl1bQ1JFQVRFXSBXb3VsZCBjcmVhdGUgcmVtb3RlIGRvYyBmb3IgXCIke3BhZ2UudGl0bGV9XCIgaW4gY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KFxuICAgICAgICAgIHBhZ2UudGl0bGUsXG4gICAgICAgICAgbG9jYWxDb250ZW50LFxuICAgICAgICAgIGNvbGxlY3Rpb25JZCxcbiAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgKTtcbiAgICAgICAgcGFnZS5pZCA9IGNyZWF0ZWQ/LmlkID8/IHBhZ2UuaWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbQ1JFQVRFXSBDcmVhdGVkIHJlbW90ZSBcIiR7cGFnZS50aXRsZX1cIiBpZD0ke3BhZ2UuaWR9YCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW0NSRUFURV0gRmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgZm9yICR7cGFnZS50aXRsZX06ICR7ZXJyfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxvY2FsQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGFic1BhdGgsIFwidXRmOFwiKTtcbiAgICBpZiAob3B0cy5tb2RlID09PSBcInB1bGxcIikge1xuICAgICAgaWYgKFxuICAgICAgICByZW1vdGVUZXh0ICE9IG51bGwgJiZcbiAgICAgICAgIWNvbnRlbnRzRXF1YWxJZ25vcmluZ1doaXRlc3BhY2UobG9jYWxDb250ZW50LCByZW1vdGVUZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbUFVMTF0gUmVtb3RlIGFwcGxpZWQgdG8gbG9jYWwgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICAgIGF3YWl0IHNhZmVXcml0ZUZpbGUoYWJzUGF0aCwgcmVtb3RlVGV4dCA/PyBcIlwiLCBvcHRzLmRyeVJ1biB8fCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVsbCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLm1vZGUgPT09IFwicHVzaFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlbW90ZVRleHQgPT0gbnVsbCB8fFxuICAgICAgICAhY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQpXG4gICAgICApIHtcbiAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW2RyeS1ydW5dW1BVU0hdIFdvdWxkIHVwZGF0ZSByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdXBkYXRlRG9jdW1lbnQocGFnZS5pZCwgcGFnZS50aXRsZSwgbG9jYWxDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbUFVTSF0gVXBkYXRlZCByZW1vdGUgXCIke3BhZ2UudGl0bGV9XCIgaWQ9JHtwYWdlLmlkfWApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NLSVBdIE5vIGNoYW5nZSAocHVzaCkgZm9yIFwiJHtwYWdlLnRpdGxlfVwiYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN5bmM6IHRpbWVzdGFtcC1iYXNlZCBidXQgc2tpcCBpZiBvbmx5IHdoaXRlc3BhY2UgZGlmZmVyc1xuICAgICAgaWYgKHJlbW90ZVVwZGF0ZWRBdCA+IGxvY2FsVHMgKyA1MDApIHtcbiAgICAgICAgaWYgKCFjb250ZW50c0VxdWFsSWdub3JpbmdXaGl0ZXNwYWNlKGxvY2FsQ29udGVudCwgcmVtb3RlVGV4dCA/PyBcIlwiKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtQVUxMXSBSZW1vdGUgbmV3ZXIgLT4gb3ZlcndyaXRlIGxvY2FsIGZvciBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzYWZlV3JpdGVGaWxlKGFic1BhdGgsIHJlbW90ZVRleHQgPz8gXCJcIiwgb3B0cy5kcnlSdW4gfHwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTS0lQXSBlcXVhbCBhZnRlciBub3JtYWxpemluZyAocmVtb3RlIG5ld2VyIHRpbWVzdGFtcCBidXQgY29udGVudCBzYW1lKSBcIiR7cGFnZS50aXRsZX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb2NhbFRzID4gcmVtb3RlVXBkYXRlZEF0ICsgNTAwKSB7XG4gICAgICAgIGlmICghY29udGVudHNFcXVhbElnbm9yaW5nV2hpdGVzcGFjZShsb2NhbENvbnRlbnQsIHJlbW90ZVRleHQgPz8gXCJcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbUFVTSF0gTG9jYWwgbmV3ZXIgLT4gdXBkYXRlIHJlbW90ZSBmb3IgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9wdHMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW2RyeS1ydW5dIHdvdWxkIHVwZGF0ZSByZW1vdGUgJHtwYWdlLnRpdGxlfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVEb2N1bWVudChwYWdlLmlkLCBwYWdlLnRpdGxlLCBsb2NhbENvbnRlbnQpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBgW1BVU0hdIFVwZGF0ZWQgcmVtb3RlIFwiJHtwYWdlLnRpdGxlfVwiIGlkPSR7cGFnZS5pZH1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFtQVVNIXSBGYWlsZWQgdG8gdXBkYXRlIHJlbW90ZSBmb3IgJHtwYWdlLnRpdGxlfTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW1NLSVBdIGVxdWFsIGFmdGVyIG5vcm1hbGl6aW5nIChsb2NhbCBuZXdlciB0aW1lc3RhbXAgYnV0IGNvbnRlbnQgc2FtZSkgXCIke3BhZ2UudGl0bGV9XCJgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU0tJUF0gTm8gY2hhbmdlcyBmb3IgXCIke3BhZ2UudGl0bGV9XCJgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByZWN1cnNlIHRocm91Z2ggY2hpbGRyZW5cbiAgY29uc3QgbmV4dFBhcmVudElkID0gcGFnZS5pZCB8fCBwYXJlbnRJZDtcbiAgaWYgKHBhZ2UuY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFnZS5jaGlsZHJlbikge1xuICAgICAgYXdhaXQgc3luY1BhZ2UoY29sbGVjdGlvbklkLCBtYW5pZmVzdCwgY2hpbGQsIG5leHRQYXJlbnRJZCwgb3B0cyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUnVuIHN5bmMgZm9yIGEgY29sbGVjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU3luYyhvcHRzOiB7XG4gIGNvbGxlY3Rpb25JZDogc3RyaW5nO1xuICBtb2RlOiBcInB1bGxcIiB8IFwicHVzaFwiIHwgXCJzeW5jXCI7XG4gIGRyeVJ1bj86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IHsgY29sbGVjdGlvbklkLCBtb2RlLCBkcnlSdW4gPSBmYWxzZSB9ID0gb3B0cztcbiAgY29uc29sZS5sb2coXG4gICAgYFN0YXJ0aW5nICR7bW9kZX0gZm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9uSWR9IChkcnlSdW49JHtkcnlSdW59KWAsXG4gICk7XG4gIGNvbnN0IHBhZ2VzTWFuaWZlc3QgPSBhd2FpdCBsb2FkUGFnZXNNYW5pZmVzdChjb2xsZWN0aW9uSWQpO1xuICBjb25zdCBjb2xsQ2ZnID0gKGF3YWl0IGxvYWRDb2xsZWN0aW9uQ29uZmlnKGNvbGxlY3Rpb25JZCkpIHx8IHtcbiAgICBzYXZlRGlyOiBcImRvY3NcIixcbiAgICBtYXBwaW5nczogW10sXG4gIH07XG5cbiAgLy8gYXBwbHkgbWFwcGluZ3MgKHRoaXMgd2lsbCBzZXQgZm9sZGVyLWJhc2VkIGBmaWxlYCBmaWVsZHMpXG4gIGFwcGx5TWFwcGluZ3NUb01hbmlmZXN0KHBhZ2VzTWFuaWZlc3QsIGNvbGxDZmcpO1xuXG4gIC8vIGVuc3VyZSBsb2NhbCBmaWxlcy9mb2xkZXJzIGV4aXN0IGFuZCBub3JtYWxpemUgYW55IHJlbGF0aXZlIGZpbGVuYW1lc1xuICBhc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYXRocyhub2RlOiBhbnksIHBhcmVudERpcjogc3RyaW5nIHwgbnVsbCkge1xuICAgIC8vIGlmIG5vZGUuZmlsZSBpcyBhYnNlbnQsIGFwcGx5IGluaGVyaXRhbmNlIChhcHBseU1hcHBpbmdzVG9NYW5pZmVzdCBzaG91bGQgaGF2ZSBzZXQgaXQpXG4gICAgaWYgKCFub2RlLmZpbGUpIHtcbiAgICAgIGNvbnN0IHNsdWcgPSBzbHVnaWZ5VGl0bGUobm9kZS50aXRsZSB8fCBcInVudGl0bGVkXCIpO1xuICAgICAgY29uc3QgZGlyID0gcGFyZW50RGlyXG4gICAgICAgID8gcGF0aC5qb2luKHBhcmVudERpciwgc2x1ZylcbiAgICAgICAgOiBwYXRoLmpvaW4oY29sbENmZy5zYXZlRGlyIHx8IFwiZG9jc1wiLCBzbHVnKTtcbiAgICAgIG5vZGUuZmlsZSA9IHBhdGguam9pbihkaXIsIFwiUkVBRE1FLm1kXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub2RlLmZpbGUgaXMgYmFyZSBmaWxlbmFtZSB3aXRob3V0IGRpciAtPiBwdXQgaW50byBwYXJlbnREaXIgb3Igc2F2ZURpclxuICAgICAgY29uc3QgZGlybmFtZU9mRmlsZSA9IHBhdGguZGlybmFtZShub2RlLmZpbGUpO1xuICAgICAgaWYgKCFkaXJuYW1lT2ZGaWxlIHx8IGRpcm5hbWVPZkZpbGUgPT09IFwiLlwiKSB7XG4gICAgICAgIGNvbnN0IGJhc2VEaXIgPSBwYXJlbnREaXIgfHwgY29sbENmZy5zYXZlRGlyIHx8IFwiZG9jc1wiO1xuICAgICAgICBub2RlLmZpbGUgPSBwYXRoLmpvaW4oYmFzZURpciwgbm9kZS5maWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgZGlyZWN0b3J5IGlmIG5lZWRlZCAobm90IHdyaXRpbmcgZmlsZSBjb250ZW50cyBoZXJlLCBqdXN0IGVuc3VyaW5nIHN0cnVjdHVyZSlcbiAgICBjb25zdCBkaXJUb01ha2UgPSBwYXRoLmRpcm5hbWUobm9kZS5maWxlKTtcbiAgICBpZiAoIWRyeVJ1bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZGlyVG9NYWtlLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYFtkcnktcnVuXSB3b3VsZCBlbnN1cmUgZGlyZWN0b3J5ICR7ZGlyVG9NYWtlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVEaXIgPSBwYXRoLmRpcm5hbWUobm9kZS5maWxlKTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBhd2FpdCBub3JtYWxpemVQYXRocyhjLCBub2RlRGlyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3JtYWxpemUgZm9yIGVhY2ggcm9vdFxuICBmb3IgKGNvbnN0IHJvb3Qgb2YgcGFnZXNNYW5pZmVzdC5wYWdlcykge1xuICAgIGF3YWl0IG5vcm1hbGl6ZVBhdGhzKHJvb3QgYXMgYW55LCBudWxsKTtcbiAgfVxuXG4gIC8vIHJ1biBzeW5jIHJlY3Vyc2lvblxuICBmb3IgKGNvbnN0IHAgb2YgcGFnZXNNYW5pZmVzdC5wYWdlcykge1xuICAgIGF3YWl0IHN5bmNQYWdlKGNvbGxlY3Rpb25JZCwgcGFnZXNNYW5pZmVzdCwgcCwgbnVsbCwgeyBtb2RlLCBkcnlSdW4gfSk7XG4gIH1cblxuICAvLyBwZXJzaXN0IG1hbmlmZXN0ICh3cml0ZSBhbnkgY3JlYXRlZCBpZHMgYmFjaylcbiAgYXdhaXQgcGVyc2lzdFBhZ2VzTWFuaWZlc3QoY29sbGVjdGlvbklkLCBwYWdlc01hbmlmZXN0LCBkcnlSdW4pO1xuICBjb25zb2xlLmxvZyhcIkRvbmUuXCIpO1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cblxuLyogYmluL2NsaS50c1xuICAgLSBQYXJzZSBDTEkgZmxhZ3MgZmlyc3QgKHNvIC0tYXBpLWtleSBpcyBhcHBsaWVkIGJlZm9yZSBtb2R1bGVzIGltcG9ydCBlbnYpXG4gICAtIFN1cHBvcnQgcmVwZWF0YWJsZSAtLWNvbGxlY3Rpb24gZmxhZ3NcbiAgIC0gVGhlbiBkeW5hbWljYWxseSBpbXBvcnQgdGhlIHJlc3Qgb2YgdGhlIGFwcFxuKi9cblxuY29uc3QgcmF3QXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcblxuLy8gcGFyc2UgZmxhZ3MgKHJlcGVhdGFibGUgLS1jb2xsZWN0aW9uKVxuY29uc3QgZmxhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gPSB7fTtcbmNvbnN0IHBvc2l0aW9uYWxzOiBzdHJpbmdbXSA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCByYXdBcmdzLmxlbmd0aDsgaSsrKSB7XG4gIGNvbnN0IGEgPSByYXdBcmdzW2ldO1xuICBpZiAoYSA9PT0gXCItLWhlbHBcIiB8fCBhID09PSBcIi1oXCIpIHtcbiAgICBwb3NpdGlvbmFscy5wdXNoKFwiLS1oZWxwXCIpO1xuICB9IGVsc2UgaWYgKGEuc3RhcnRzV2l0aChcIi0tY29sbGVjdGlvbj1cIikgfHwgYS5zdGFydHNXaXRoKFwiLS1jb2xsZWN0aW9uOlwiKSkge1xuICAgIGNvbnN0IHZhbCA9IGEuc3BsaXQoL1s6PV0vKVsxXSB8fCBcIlwiO1xuICAgIGlmICghZmxhZ3MuY29sbGVjdGlvbikgZmxhZ3MuY29sbGVjdGlvbiA9IFtdO1xuICAgIChmbGFncy5jb2xsZWN0aW9uIGFzIHN0cmluZ1tdKS5wdXNoKHZhbCk7XG4gIH0gZWxzZSBpZiAoYSA9PT0gXCItLWNvbGxlY3Rpb25cIikge1xuICAgIC8vIHN1cHBvcnQgYC0tY29sbGVjdGlvbiA8dmFsdWU+YFxuICAgIGNvbnN0IHZhbCA9IHJhd0FyZ3NbaSArIDFdO1xuICAgIGlmICh2YWwgJiYgIXZhbC5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgIGlmICghZmxhZ3MuY29sbGVjdGlvbikgZmxhZ3MuY29sbGVjdGlvbiA9IFtdO1xuICAgICAgKGZsYWdzLmNvbGxlY3Rpb24gYXMgc3RyaW5nW10pLnB1c2godmFsKTtcbiAgICAgIGkrKzsgLy8gY29uc3VtZSBuZXh0IGFyZ1xuICAgIH1cbiAgfSBlbHNlIGlmIChhLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgIGNvbnN0IFtrLCB2XSA9IGEucmVwbGFjZSgvXi0tLywgXCJcIikuc3BsaXQoXCI9XCIpO1xuICAgIGZsYWdzW2tdID0gdiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHY7XG4gIH0gZWxzZSB7XG4gICAgcG9zaXRpb25hbHMucHVzaChhKTtcbiAgfVxufVxuXG4vLyBJZiB1c2VyIHBhc3NlZCAtLWFwaS1rZXkgb3IgLS1iYXNlLXVybCwgc2V0IHRoZW0gaW1tZWRpYXRlbHkgc28gZHluYW1pYyBpbXBvcnRzIHNlZSB0aGVtLlxuaWYgKGZsYWdzW1wiYXBpLWtleVwiXSkge1xuICAvLyBkbyBOT1QgbG9nIHRoZSBrZXkgdG8gYXZvaWQgYWNjaWRlbnRhbCBsZWFrYWdlIGluIGxvZ3NcbiAgcHJvY2Vzcy5lbnYuT1VUTElORV9BUElfS0VZID0gU3RyaW5nKGZsYWdzW1wiYXBpLWtleVwiXSk7XG59XG5pZiAoZmxhZ3NbXCJiYXNlLXVybFwiXSkge1xuICBwcm9jZXNzLmVudi5PVVRMSU5FX0JBU0VfVVJMID0gU3RyaW5nKGZsYWdzW1wiYmFzZS11cmxcIl0pO1xufVxuXG5pZiAocG9zaXRpb25hbHMuaW5jbHVkZXMoXCItLWhlbHBcIikgfHwgZmxhZ3MuaGVscCB8fCBmbGFncy5oKSB7XG4gIGNvbnNvbGUubG9nKGBcblVzYWdlOlxuICBPVVRMSU5FX0FQSV9LRVk9Li4uIGJ1biBydW4gYmluL2NsaS50cyBbY29tbWFuZF0gWy0tY29sbGVjdGlvbj1JRF0uLi4gWy0tZHJ5LXJ1bl0gWy0tYXBpLWtleT1cIi4uLlwiXVxuXG5Db21tYW5kczpcbiAgc2V0dXAgICAgICAgICAgICAgICAgICAgIC0gaW50ZXJhY3RpdmUgc2V0dXA6IGxpc3QgY29sbGVjdGlvbnMsIGNob29zZSBvbmVcbiAgbGlzdC1jb2xsZWN0aW9ucyAgICAgICAgIC0gcHJpbnQgY29sbGVjdGlvbnNcbiAgaW5pdCAtLWNvbGxlY3Rpb249SUQgICAgIC0gYm9vdHN0cmFwIHBhZ2VzLmpzb24gKyBtYXJrZG93biAocmVwZWF0YWJsZSlcbiAgcHVsbCAtLWNvbGxlY3Rpb249SUQgICAgIC0gcHVsbCByZW1vdGUgY2hhbmdlcyAocmVwZWF0YWJsZSlcbiAgcHVzaCAtLWNvbGxlY3Rpb249SUQgICAgIC0gcHVzaCBsb2NhbCBjaGFuZ2VzIChyZXBlYXRhYmxlKVxuICBzeW5jIC0tY29sbGVjdGlvbj1JRCAgICAgLSBiaWRpcmVjdGlvbmFsIHN5bmMgKHJlcGVhdGFibGUpXG5cbkZsYWdzOlxuICAtLWNvbGxlY3Rpb249SUQgICAgICAgICAgUmVwZWF0YWJsZTsgcnVuIGNvbW1hbmQgYWdhaW5zdCBtdWx0aXBsZSBjb2xsZWN0aW9uc1xuICAtLWFwaS1rZXk9XCIuLi5cIiAgICAgICAgICBQcm92aWRlIE91dGxpbmUgQVBJIGtleSAob3ZlcnJpZGVzIGVudiB2YXIpXG4gIC0tYmFzZS11cmw9XCIuLi5cIiAgICAgICAgIFByb3ZpZGUgT3V0bGluZSBiYXNlIFVSTCAob3ZlcnJpZGVzIGVudiB2YXIpXG4gIC0tZHJ5LXJ1biAgICAgICAgICAgICAgICBQcmV2aWV3IG9ubHlcbiAgLS1oZWxwLCAtaFxuRXhhbXBsZXM6XG4gIE9VVExJTkVfQVBJX0tFWT0uLi4gYnVueCBAZG9ja3N0YXQvb3V0bGluZS1zeW5jIC0tY29sbGVjdGlvbj1cImlkMVwiIC0tY29sbGVjdGlvbj1cImlkMlwiIHN5bmMgLS1kcnktcnVuXG4gIGJ1biBydW4gYmluL2NsaS50cyBzeW5jIC0tYXBpLWtleT1cInNrX3h4eFwiIC0tY29sbGVjdGlvbj1cImlkMVwiXG5gKTtcbiAgcHJvY2Vzcy5leGl0KDApO1xufVxuXG5jb25zdCB7IGxvYWRUb3BDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xpYi9jb25maWdcIik7XG5jb25zdCB7IGxpc3RDb2xsZWN0aW9uc1Byb21wdCwgYm9vdHN0cmFwQ29sbGVjdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFxuICBcIi4uL2xpYi9pbml0XCJcbik7XG5jb25zdCB7IHJ1blN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xpYi9zeW5jRW5naW5lXCIpO1xuXG5jb25zdCBjbWQgPSBwb3NpdGlvbmFsc1swXSB8fCBcInN5bmNcIjtcbmNvbnN0IERSWV9SVU4gPSBCb29sZWFuKGZsYWdzW1wiZHJ5LXJ1blwiXSk7XG5jb25zdCBjb2xsZWN0aW9uc0Zyb21DbGkgPSAoZmxhZ3MuY29sbGVjdGlvbiBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG5cbnRyeSB7XG4gIGNvbnN0IHRvcENvbmZpZyA9IChhd2FpdCBsb2FkVG9wQ29uZmlnKCkpIHx8IHsgY29sbGVjdGlvbnM6IFtdIH07XG5cbiAgY29uc3QgcmVzb2x2ZVRhcmdldHMgPSAoKTogc3RyaW5nW10gPT4ge1xuICAgIGlmIChjb2xsZWN0aW9uc0Zyb21DbGkubGVuZ3RoID4gMCkgcmV0dXJuIGNvbGxlY3Rpb25zRnJvbUNsaTtcbiAgICBpZiAodG9wQ29uZmlnLmNvbGxlY3Rpb25zICYmIHRvcENvbmZpZy5jb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdG9wQ29uZmlnLmNvbGxlY3Rpb25zLm1hcCgoYykgPT4gYy5pZCk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICBpZiAoY21kID09PSBcImxpc3QtY29sbGVjdGlvbnNcIikge1xuICAgIGF3YWl0IGxpc3RDb2xsZWN0aW9uc1Byb21wdCh7IGRyeVJ1bjogRFJZX1JVTiwgbm9uSW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwic2V0dXBcIikge1xuICAgIGF3YWl0IGxpc3RDb2xsZWN0aW9uc1Byb21wdCh7IGRyeVJ1bjogRFJZX1JVTiwgbm9uSW50ZXJhY3RpdmU6IGZhbHNlIH0pO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGlmIChjbWQgPT09IFwiaW5pdFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IHJlc29sdmVUYXJnZXRzKCk7XG4gICAgaWYgKCF0YXJnZXRzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbml0IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjb2xsZWN0aW9uLiBQcm92aWRlIC0tY29sbGVjdGlvbiBvciBydW4gc2V0dXAuXCIsXG4gICAgICApO1xuICAgIGZvciAoY29uc3QgY29sbGVjdGlvbklkIG9mIHRhcmdldHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgXFxuPT0+IGJvb3RzdHJhcHBpbmcgY29sbGVjdGlvbiAke2NvbGxlY3Rpb25JZH0gKGRyeVJ1bj0ke0RSWV9SVU59KWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgYm9vdHN0cmFwQ29sbGVjdGlvbih7IGNvbGxlY3Rpb25JZCwgZHJ5UnVuOiBEUllfUlVOIH0pO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH1cblxuICBpZiAoY21kID09PSBcInB1bGxcIiB8fCBjbWQgPT09IFwicHVzaFwiIHx8IGNtZCA9PT0gXCJzeW5jXCIpIHtcbiAgICBjb25zdCB0YXJnZXRzID0gcmVzb2x2ZVRhcmdldHMoKTtcbiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBcIiR7Y21kfVwiIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBjb2xsZWN0aW9uIGlkLiBQcm92aWRlIHdpdGggLS1jb2xsZWN0aW9uPUlEIG9yIHJ1biBzZXR1cC5gLFxuICAgICAgKTtcbiAgICBjb25zdCBtb2RlID0gY21kID09PSBcInB1bGxcIiA/IFwicHVsbFwiIDogY21kID09PSBcInB1c2hcIiA/IFwicHVzaFwiIDogXCJzeW5jXCI7XG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uSWQgb2YgdGFyZ2V0cykge1xuICAgICAgY29uc29sZS5sb2coYFxcbj09PiBSdW5uaW5nICR7bW9kZX0gZm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9uSWR9YCk7XG4gICAgICBhd2FpdCBydW5TeW5jKHsgY29sbGVjdGlvbklkLCBtb2RlOiBtb2RlIGFzIGFueSwgZHJ5UnVuOiBEUllfUlVOIH0pO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKFwiVW5rbm93biBjb21tYW5kOlwiLCBjbWQpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59IGNhdGNoIChlcnI6IGFueSkge1xuICBjb25zb2xlLmVycm9yKFwiRVJST1I6XCIsIGVycj8ubWVzc2FnZSB8fCBlcnIpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmV4cG9ydCB7fTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7O21hQUFBLGdDQUNBLHFCQUFTLGdCQUNULHlCQU9BLGVBQXNCLEVBQWUsQ0FBQyxFQUFhLENBQ2pELElBQUssRUFBVyxDQUFHLEVBQ2pCLE1BQU0sRUFBRyxNQUFNLEVBQUssQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUkzQyxlQUFzQixFQUFnQixDQUFDLEVBQWdCLENBQ3JE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QUFLLENBQUMsRUFHaEIsR0FBSSxJQUFRLFFBQ1YsTUFBTSxHQUFzQixDQUFFLE9BQVEsRUFBUyxlQUFnQixFQUFNLENBQUMsRUFDdEUsUUFBUSxLQUFLLENBQUMsRUFHaEIsR0FBSSxJQUFRLE9BQVEsQ0FDbEIsSUFBTSxFQUFVLEVBQWUsRUFDL0IsSUFBSyxFQUFRLE9BQ1gsTUFBTSxJQUFJLE1BQ1IsMkVBQ0YsRUFDRixRQUFXLEtBQWdCLEVBQ3pCLFFBQVEsSUFDTjtBQUFBLCtCQUFrQyxhQUF3QixJQUM1RCxFQUNBLE1BQU0sR0FBb0IsQ0FBRSxlQUFjLE9BQVEsQ0FBUSxDQUFDLEVBRTdELFFBQVEsS0FBSyxDQUFDLEVBR2hCLEdBQUksSUFBUSxRQUFVLElBQVEsUUFBVSxJQUFRLE9BQVEsQ0FDdEQsSUFBTSxFQUFVLEVBQWUsRUFDL0IsSUFBSyxFQUFRLE9BQ1gsTUFBTSxJQUFJLE1BQ1IsWUFBWSxvRkFDZCxFQUNGLElBQU0sRUFBTyxJQUFRLE9BQVMsT0FBUyxJQUFRLE9BQVMsT0FBUyxPQUNqRSxRQUFXLEtBQWdCLEVBQ3pCLFFBQVEsSUFBSTtBQUFBLGNBQWlCLG9CQUF1QixHQUFjLEVBQ2xFLE1BQU0sR0FBUSxDQUFFLGVBQWMsS0FBTSxFQUFhLE9BQVEsQ0FBUSxDQUFDLEVBRXBFLFFBQVEsS0FBSyxDQUFDLEVBR2hCLFFBQVEsTUFBTSxtQkFBb0IsQ0FBRyxFQUNyQyxRQUFRLEtBQUssQ0FBQyxFQUNkLE1BQU8sRUFBVSxDQUNqQixRQUFRLE1BQU0sU0FBVSxHQUFLLFNBQVcsQ0FBRyxFQUMzQyxRQUFRLEtBQUssQ0FBQyIsCiAgImRlYnVnSWQiOiAiRkQxODExNTBBQTM4MTY5QjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dockstat/outline-sync",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "A simple outline git-sync library",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",