From 98489fc07698ed48a6cb92efb1efb3c0670a3ea1 Mon Sep 17 00:00:00 2001 From: vveerrgg Date: Fri, 12 Jun 2026 23:25:47 -0700 Subject: [PATCH 1/3] fix: prevent storage.sync data loss and harden key/backup flows Sync merge: - Match profiles by pubKey, not array index, so a reordered or partial sync can no longer overwrite one identity's key material with another's. - Treat bunker/remote-signer profiles (privKey:'' but a real identity) as identities in fresh-install detection, so they aren't wiped as blanks. - Stop syncing isEncrypted: the verifier is never synced, so adopting a remote isEncrypted=true permanently locked the second device out. - Add startup self-heal that clears a bogus isEncrypted flag when no password verifier and no encrypted blobs exist. - Extract pure computeMergeUpdates() so the merge rules are unit-testable. Key/backup flows: - savePrivateKey now replies via sendResponse + return true (MV3 does not deliver Promise returns), so imported keys can't silently fail. - Roll back the half-created profile when a key fails to persist. - Backup export encrypts with a supplied backup password instead of the session key, so users with no master password can export, even locked. Tests: add sync-merge and backup-password regression suites (+13). --- distros/safari/api-keys/api-keys.build.js | 797 +- distros/safari/background.build.js | 10695 +++++++++++++++- distros/safari/background.js | 41 +- distros/safari/content.build.js | 368 +- .../event_history/event_history.build.js | 5440 +++++++- .../safari/experimental/experimental.build.js | 252 +- distros/safari/nostr-keys/nostr-keys.build.js | 5584 +++++++- distros/safari/nostr.build.js | 114 +- distros/safari/options.build.css | 1908 ++- distros/safari/options.build.js | 8726 ++++++++++++- distros/safari/options.js | 17 +- distros/safari/permission/permission.build.js | 5013 +++++++- distros/safari/popup.build.js | 7272 ++++++++++- distros/safari/profiles/profiles.build.js | 5090 +++++++- distros/safari/security/security.build.js | 540 +- distros/safari/sidepanel.build.js | 8678 ++++++++++++- distros/safari/sidepanel.html | 13 +- distros/safari/vault/vault.build.js | 688 +- package-lock.json | 4 +- src/background.js | 41 +- src/nostr-keys/nostr-keys.js | 11 +- src/options.js | 17 +- src/sidepanel.html | 13 +- src/sidepanel.js | 59 +- src/utilities/sync-manager.js | 78 +- src/utilities/utils.js | 6 +- test/backup-password.test.js | 66 + test/sync-merge.test.js | 156 + 28 files changed, 61503 insertions(+), 184 deletions(-) create mode 100644 test/backup-password.test.js create mode 100644 test/sync-merge.test.js diff --git a/distros/safari/api-keys/api-keys.build.js b/distros/safari/api-keys/api-keys.build.js index 49aba0e..2089fa5 100644 --- a/distros/safari/api-keys/api-keys.build.js +++ b/distros/safari/api-keys/api-keys.build.js @@ -1,12 +1,493 @@ -(()=>{var r=typeof browser<"u"?browser:typeof chrome<"u"?chrome:null;if(!r)throw new Error("browser-polyfill: No extension API namespace found (neither browser nor chrome).");var d=typeof browser>"u"&&typeof chrome<"u";function y(e,t){return(...a)=>{try{let s=t.apply(e,a);if(s&&typeof s.then=="function")return s}catch{}return new Promise((s,o)=>{t.apply(e,[...a,(...c)=>{r.runtime&&r.runtime.lastError?o(new Error(r.runtime.lastError.message)):s(c.length<=1?c[0]:c)}])})}}var u={};u.runtime={sendMessage(...e){return d?y(r.runtime,r.runtime.sendMessage)(...e):r.runtime.sendMessage(...e)},onMessage:r.runtime.onMessage,getURL(e){return r.runtime.getURL(e)},openOptionsPage(){return d?y(r.runtime,r.runtime.openOptionsPage)():r.runtime.openOptionsPage()},get id(){return r.runtime.id}};u.storage={local:{get(...e){return d?y(r.storage.local,r.storage.local.get)(...e):r.storage.local.get(...e)},set(...e){return d?y(r.storage.local,r.storage.local.set)(...e):r.storage.local.set(...e)},clear(...e){return d?y(r.storage.local,r.storage.local.clear)(...e):r.storage.local.clear(...e)},remove(...e){return d?y(r.storage.local,r.storage.local.remove)(...e):r.storage.local.remove(...e)}},sync:r.storage?.sync?{get(...e){return d?y(r.storage.sync,r.storage.sync.get)(...e):r.storage.sync.get(...e)},set(...e){return d?y(r.storage.sync,r.storage.sync.set)(...e):r.storage.sync.set(...e)},remove(...e){return d?y(r.storage.sync,r.storage.sync.remove)(...e):r.storage.sync.remove(...e)},clear(...e){return d?y(r.storage.sync,r.storage.sync.clear)(...e):r.storage.sync.clear(...e)},getBytesInUse(...e){return r.storage.sync.getBytesInUse?d?y(r.storage.sync,r.storage.sync.getBytesInUse)(...e):r.storage.sync.getBytesInUse(...e):Promise.resolve(0)}}:null,onChanged:r.storage?.onChanged||null};u.tabs={create(...e){return d?y(r.tabs,r.tabs.create)(...e):r.tabs.create(...e)},query(...e){return d?y(r.tabs,r.tabs.query)(...e):r.tabs.query(...e)},remove(...e){return d?y(r.tabs,r.tabs.remove)(...e):r.tabs.remove(...e)},update(...e){return d?y(r.tabs,r.tabs.update)(...e):r.tabs.update(...e)},get(...e){return d?y(r.tabs,r.tabs.get)(...e):r.tabs.get(...e)},getCurrent(...e){return d?y(r.tabs,r.tabs.getCurrent)(...e):r.tabs.getCurrent(...e)},sendMessage(...e){return d?y(r.tabs,r.tabs.sendMessage)(...e):r.tabs.sendMessage(...e)}};u.alarms=r.alarms?{create(...e){let t=r.alarms.create(...e);return t&&typeof t.then=="function"?t:Promise.resolve()},clear(...e){return d?y(r.alarms,r.alarms.clear)(...e):r.alarms.clear(...e)},onAlarm:r.alarms.onAlarm}:null;var D=102400,J=8192,ee=512,te="_chunk:",V="_sync_meta",_="platformSyncEnabled";var E={P1_PROFILES:1,P2_SETTINGS:2,P3_APIKEYS:3,P4_VAULT:4},B=u.storage.local,K=null;function ne(e,t){let a=[];for(let o=0;o{let{hosts:k,...f}=c;return f}),o=JSON.stringify(s);t.push({key:"profiles",jsonString:o,priority:E.P1_PROFILES,size:o.length})}if(e.profileIndex!=null){let s=JSON.stringify(e.profileIndex);t.push({key:"profileIndex",jsonString:s,priority:E.P1_PROFILES,size:s.length})}if(e.isEncrypted!=null){let s=JSON.stringify(e.isEncrypted);t.push({key:"isEncrypted",jsonString:s,priority:E.P1_PROFILES,size:s.length})}let a=["autoLockMinutes","version","protocol_handler",_];for(let s of a)if(e[s]!=null){let o=JSON.stringify(e[s]);t.push({key:s,jsonString:o,priority:E.P2_SETTINGS,size:o.length})}for(let s of Object.keys(e))if(s.startsWith("feature:")){let o=JSON.stringify(e[s]);t.push({key:s,jsonString:o,priority:E.P2_SETTINGS,size:o.length})}if(e.apiKeyVault){let s=JSON.stringify(e.apiKeyVault);t.push({key:"apiKeyVault",jsonString:s,priority:E.P3_APIKEYS,size:s.length})}if(e.vaultDocs&&typeof e.vaultDocs=="object"){let s=Object.values(e.vaultDocs).sort((o,c)=>(c.updatedAt||0)-(o.updatedAt||0));for(let o of s){let c=`vaultDoc:${o.path}`,k=JSON.stringify(o);t.push({key:c,jsonString:k,priority:E.P4_VAULT,size:k.length})}}return t}async function se(){if(!(!u.storage.sync||!await ae()))try{let t=await re();t.sort((S,g)=>S.priority-g.priority);let a=0,s=0,o={},c=[],k=!1;for(let S of t){if(k)break;let g=ne(S.key,S.jsonString),m=0;for(let b of g)m+=b.key.length+(typeof b.value=="string"?b.value.length:JSON.stringify(b.value).length);if((a+m>D-500||s+g.length>ee-5)&&!(S.priority<=E.P3_APIKEYS)){k=!0;break}for(let b of g)o[b.key]=b.value,c.push(b.key);a+=m,s+=g.length}let f={lastWrittenAt:Date.now(),keys:c};o[V]=JSON.stringify(f),await u.storage.sync.set(o);try{let S=await u.storage.sync.get(null),g=Object.keys(S).filter(m=>m!==V&&!c.includes(m));g.length>0&&await u.storage.sync.remove(g)}catch{}}catch{}}function q(){u.storage.sync&&(K&&clearTimeout(K),K=setTimeout(()=>{K=null,se()},2e3))}async function ae(){return(await B.get({[_]:!0}))[_]}var Y=u.storage.local,P="apiKeyVault",F={keys:{},syncEnabled:!0,eventId:null,relayCreatedAt:null,syncStatus:"synced"};async function w(){let e=await Y.get({[P]:F});return{...F,...e[P]}}async function I(e){await Y.set({[P]:e}),q()}async function C(){return w()}async function j(e,t,a){let s=await w(),o=Math.floor(Date.now()/1e3),c=s.keys[e];return s.keys[e]={id:e,label:t,secret:a,createdAt:c?.createdAt||o,updatedAt:o,profileScope:c?.profileScope??null},await I(s),s.keys[e]}async function z(e){let t=await w();delete t.keys[e],await I(t)}async function x(){let e=await w();return Object.values(e.keys).sort((t,a)=>t.label.toLowerCase().localeCompare(a.label.toLowerCase()))}async function H(e){let t=await w();t.syncEnabled=e,await I(t)}async function G(){return(await w()).syncEnabled}async function A(e,t=null,a=null){let s=await w();s.syncStatus=e,t!==null&&(s.eventId=t),a!==null&&(s.relayCreatedAt=a),await I(s)}async function W(){return(await w()).keys}async function O(e){let t=await w();for(let[a,s]of Object.entries(e))t.keys[a]=s;await I(t)}var n={keys:[],newLabel:"",newSecret:"",editingId:null,editLabel:"",editSecret:"",copiedId:null,revealedId:null,syncEnabled:!0,globalSyncStatus:"idle",syncError:"",saving:!1,toast:"",relayInfo:{read:[],write:[]}};function l(e){return document.getElementById(e)}function L(){return n.relayInfo.read.length>0||n.relayInfo.write.length>0}function oe(){return[...n.keys].sort((e,t)=>e.label.toLowerCase().localeCompare(t.label.toLowerCase()))}function ie(e){return e?e.length<=8?"\u2022".repeat(e.length):e.slice(0,4)+"\u2022".repeat(4)+e.slice(-4):""}function v(e){n.toast=e,p(),setTimeout(()=>{n.toast="",p()},2e3)}function ce(e){return e==="idle"?"bg-green-500":e==="syncing"?"bg-yellow-500 animate-pulse":"bg-red-500"}function le(){return n.globalSyncStatus==="syncing"?"Syncing...":n.globalSyncStatus==="error"?n.syncError:n.syncEnabled?"Synced":"Local only"}function p(){let e=l("sync-dot"),t=l("sync-text"),a=l("sync-btn"),s=l("sync-toggle"),o=l("key-count");e&&(e.className=`inline-block w-3 h-3 rounded-full ${ce(n.globalSyncStatus)}`),t&&(t.textContent=le()),a&&(a.disabled=n.globalSyncStatus==="syncing"||!L()||!n.syncEnabled),s&&(s.checked=n.syncEnabled),o&&(o.textContent=n.keys.length+" key"+(n.keys.length!==1?"s":""));let c=l("key-table-container"),k=l("no-keys"),f=l("key-table-body");if(c&&(c.style.display=n.keys.length>0?"block":"none"),k&&(k.style.display=n.keys.length===0?"block":"none"),f){let Q=oe();f.innerHTML=Q.map(i=>{if(n.editingId===i.id)return` +(() => { + // src/utilities/browser-polyfill.js + var _browser = typeof browser !== "undefined" ? browser : typeof chrome !== "undefined" ? chrome : null; + if (!_browser) { + throw new Error("browser-polyfill: No extension API namespace found (neither browser nor chrome)."); + } + var isChrome = typeof browser === "undefined" && typeof chrome !== "undefined"; + function promisify(context, method) { + return (...args) => { + try { + const result = method.apply(context, args); + if (result && typeof result.then === "function") { + return result; + } + } catch (_) { + } + return new Promise((resolve, reject) => { + method.apply(context, [ + ...args, + (...cbArgs) => { + if (_browser.runtime && _browser.runtime.lastError) { + reject(new Error(_browser.runtime.lastError.message)); + } else { + resolve(cbArgs.length <= 1 ? cbArgs[0] : cbArgs); + } + } + ]); + }); + }; + } + var api = {}; + api.runtime = { + /** + * sendMessage – always returns a Promise. + */ + sendMessage(...args) { + if (!isChrome) { + return _browser.runtime.sendMessage(...args); + } + return promisify(_browser.runtime, _browser.runtime.sendMessage)(...args); + }, + /** + * onMessage – thin wrapper so callers use a consistent reference. + * The listener signature is (message, sender, sendResponse). + * On Chrome the listener can return `true` to keep the channel open, + * or return a Promise (MV3). Safari / Firefox expect a Promise return. + */ + onMessage: _browser.runtime.onMessage, + /** + * getURL – synchronous on all browsers. + */ + getURL(path) { + return _browser.runtime.getURL(path); + }, + /** + * openOptionsPage + */ + openOptionsPage() { + if (!isChrome) { + return _browser.runtime.openOptionsPage(); + } + return promisify(_browser.runtime, _browser.runtime.openOptionsPage)(); + }, + /** + * Expose the id for convenience. + */ + get id() { + return _browser.runtime.id; + } + }; + api.storage = { + local: { + get(...args) { + if (!isChrome) { + return _browser.storage.local.get(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.get)(...args); + }, + set(...args) { + if (!isChrome) { + return _browser.storage.local.set(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.set)(...args); + }, + clear(...args) { + if (!isChrome) { + return _browser.storage.local.clear(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.clear)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.storage.local.remove(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.remove)(...args); + } + }, + // --- storage.sync ---------------------------------------------------------- + // Null when the browser doesn't support sync (older Safari, etc.) + sync: _browser.storage?.sync ? { + get(...args) { + if (!isChrome) { + return _browser.storage.sync.get(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.get)(...args); + }, + set(...args) { + if (!isChrome) { + return _browser.storage.sync.set(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.set)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.storage.sync.remove(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.remove)(...args); + }, + clear(...args) { + if (!isChrome) { + return _browser.storage.sync.clear(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.clear)(...args); + }, + getBytesInUse(...args) { + if (!_browser.storage.sync.getBytesInUse) { + return Promise.resolve(0); + } + if (!isChrome) { + return _browser.storage.sync.getBytesInUse(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.getBytesInUse)(...args); + } + } : null, + // --- storage.onChanged ----------------------------------------------------- + onChanged: _browser.storage?.onChanged || null + }; + api.tabs = { + create(...args) { + if (!isChrome) { + return _browser.tabs.create(...args); + } + return promisify(_browser.tabs, _browser.tabs.create)(...args); + }, + query(...args) { + if (!isChrome) { + return _browser.tabs.query(...args); + } + return promisify(_browser.tabs, _browser.tabs.query)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.tabs.remove(...args); + } + return promisify(_browser.tabs, _browser.tabs.remove)(...args); + }, + update(...args) { + if (!isChrome) { + return _browser.tabs.update(...args); + } + return promisify(_browser.tabs, _browser.tabs.update)(...args); + }, + get(...args) { + if (!isChrome) { + return _browser.tabs.get(...args); + } + return promisify(_browser.tabs, _browser.tabs.get)(...args); + }, + getCurrent(...args) { + if (!isChrome) { + return _browser.tabs.getCurrent(...args); + } + return promisify(_browser.tabs, _browser.tabs.getCurrent)(...args); + }, + sendMessage(...args) { + if (!isChrome) { + return _browser.tabs.sendMessage(...args); + } + return promisify(_browser.tabs, _browser.tabs.sendMessage)(...args); + } + }; + api.alarms = _browser.alarms ? { + create(...args) { + const result = _browser.alarms.create(...args); + return result && typeof result.then === "function" ? result : Promise.resolve(); + }, + clear(...args) { + if (!isChrome) { + return _browser.alarms.clear(...args); + } + return promisify(_browser.alarms, _browser.alarms.clear)(...args); + }, + onAlarm: _browser.alarms.onAlarm + } : null; + + // src/utilities/sync-manager.js + var SYNC_QUOTA = 102400; + var MAX_ITEM = 8192; + var MAX_ITEMS = 512; + var CHUNK_PREFIX = "_chunk:"; + var SYNC_META_KEY = "_sync_meta"; + var LOCAL_ENABLED_KEY = "platformSyncEnabled"; + var PRIORITY = { + P1_PROFILES: 1, + P2_SETTINGS: 2, + P3_APIKEYS: 3, + P4_VAULT: 4 + }; + var storage = api.storage.local; + var pushTimer = null; + function chunkValue(key, jsonString) { + const chunks = []; + for (let i = 0; i < jsonString.length; i += MAX_ITEM - 100) { + chunks.push(jsonString.slice(i, i + MAX_ITEM - 100)); + } + if (chunks.length === 1) { + return [{ key, value: jsonString }]; + } + const entries = []; + for (let i = 0; i < chunks.length; i++) { + entries.push({ key: `${CHUNK_PREFIX}${key}:${i}`, value: chunks[i] }); + } + entries.push({ key, value: JSON.stringify({ __chunked: true, count: chunks.length }) }); + return entries; + } + async function buildSyncPayload() { + const all = await storage.get(null); + const entries = []; + if (all.profiles) { + const cleanProfiles = all.profiles.map((p) => { + const { hosts, ...rest } = p; + return rest; + }); + const json = JSON.stringify(cleanProfiles); + entries.push({ key: "profiles", jsonString: json, priority: PRIORITY.P1_PROFILES, size: json.length }); + } + if (all.profileIndex != null) { + const json = JSON.stringify(all.profileIndex); + entries.push({ key: "profileIndex", jsonString: json, priority: PRIORITY.P1_PROFILES, size: json.length }); + } + const settingsKeys = ["autoLockMinutes", "version", "protocol_handler", LOCAL_ENABLED_KEY]; + for (const k of settingsKeys) { + if (all[k] != null) { + const json = JSON.stringify(all[k]); + entries.push({ key: k, jsonString: json, priority: PRIORITY.P2_SETTINGS, size: json.length }); + } + } + for (const k of Object.keys(all)) { + if (k.startsWith("feature:")) { + const json = JSON.stringify(all[k]); + entries.push({ key: k, jsonString: json, priority: PRIORITY.P2_SETTINGS, size: json.length }); + } + } + if (all.apiKeyVault) { + const json = JSON.stringify(all.apiKeyVault); + entries.push({ key: "apiKeyVault", jsonString: json, priority: PRIORITY.P3_APIKEYS, size: json.length }); + } + if (all.vaultDocs && typeof all.vaultDocs === "object") { + const docs = Object.values(all.vaultDocs).sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); + for (const doc of docs) { + const docKey = `vaultDoc:${doc.path}`; + const json = JSON.stringify(doc); + entries.push({ key: docKey, jsonString: json, priority: PRIORITY.P4_VAULT, size: json.length }); + } + } + return entries; + } + async function pushToSync() { + if (!api.storage.sync) return; + const enabled = await isSyncEnabled(); + if (!enabled) return; + try { + const entries = await buildSyncPayload(); + entries.sort((a, b) => a.priority - b.priority); + let usedBytes = 0; + let usedItems = 0; + const syncPayload = {}; + const allSyncKeys = []; + let budgetExhausted = false; + for (const entry of entries) { + if (budgetExhausted) break; + const chunks = chunkValue(entry.key, entry.jsonString); + let entrySize = 0; + for (const c of chunks) { + entrySize += c.key.length + (typeof c.value === "string" ? c.value.length : JSON.stringify(c.value).length); + } + if (usedBytes + entrySize > SYNC_QUOTA - 500 || usedItems + chunks.length > MAX_ITEMS - 5) { + if (entry.priority <= PRIORITY.P3_APIKEYS) { + } else { + console.warn(`[SyncManager] Budget exhausted at priority ${entry.priority}, skipping remaining entries`); + budgetExhausted = true; + break; + } + } + for (const c of chunks) { + syncPayload[c.key] = c.value; + allSyncKeys.push(c.key); + } + usedBytes += entrySize; + usedItems += chunks.length; + } + const meta = { + lastWrittenAt: Date.now(), + keys: allSyncKeys + }; + syncPayload[SYNC_META_KEY] = JSON.stringify(meta); + await api.storage.sync.set(syncPayload); + try { + const existing = await api.storage.sync.get(null); + const orphanKeys = Object.keys(existing).filter( + (k) => k !== SYNC_META_KEY && !allSyncKeys.includes(k) + ); + if (orphanKeys.length > 0) { + await api.storage.sync.remove(orphanKeys); + } + } catch { + } + console.log(`[SyncManager] Pushed ${allSyncKeys.length} entries (${usedBytes} bytes) to sync storage`); + } catch (e) { + console.error("[SyncManager] pushToSync error:", e); + } + } + function scheduleSyncPush() { + if (!api.storage.sync) return; + if (pushTimer) clearTimeout(pushTimer); + pushTimer = setTimeout(() => { + pushTimer = null; + pushToSync(); + }, 2e3); + } + async function isSyncEnabled() { + const data = await storage.get({ [LOCAL_ENABLED_KEY]: true }); + return data[LOCAL_ENABLED_KEY]; + } + + // src/utilities/api-key-store.js + var storage2 = api.storage.local; + var STORAGE_KEY = "apiKeyVault"; + var DEFAULT_STORE = { + keys: {}, + syncEnabled: true, + eventId: null, + relayCreatedAt: null, + syncStatus: "synced" + }; + async function getStore() { + const data = await storage2.get({ [STORAGE_KEY]: DEFAULT_STORE }); + return { ...DEFAULT_STORE, ...data[STORAGE_KEY] }; + } + async function setStore(store) { + await storage2.set({ [STORAGE_KEY]: store }); + scheduleSyncPush(); + } + async function getApiKeyStore() { + return getStore(); + } + async function saveApiKey(id, label, secret) { + const store = await getStore(); + const now = Math.floor(Date.now() / 1e3); + const existing = store.keys[id]; + store.keys[id] = { + id, + label, + secret, + createdAt: existing?.createdAt || now, + updatedAt: now, + profileScope: existing?.profileScope ?? null + }; + await setStore(store); + return store.keys[id]; + } + async function deleteApiKey(id) { + const store = await getStore(); + delete store.keys[id]; + await setStore(store); + } + async function listApiKeys() { + const store = await getStore(); + return Object.values(store.keys).sort( + (a, b) => a.label.toLowerCase().localeCompare(b.label.toLowerCase()) + ); + } + async function setSyncEnabled(enabled) { + const store = await getStore(); + store.syncEnabled = enabled; + await setStore(store); + } + async function isSyncEnabled2() { + const store = await getStore(); + return store.syncEnabled; + } + async function updateStoreSyncState(syncStatus, eventId = null, relayCreatedAt = null) { + const store = await getStore(); + store.syncStatus = syncStatus; + if (eventId !== null) store.eventId = eventId; + if (relayCreatedAt !== null) store.relayCreatedAt = relayCreatedAt; + await setStore(store); + } + async function exportStore() { + const store = await getStore(); + return store.keys; + } + async function importStore(keys) { + const store = await getStore(); + for (const [id, key] of Object.entries(keys)) { + store.keys[id] = key; + } + await setStore(store); + } + + // src/api-keys/api-keys.js + var state = { + keys: [], + newLabel: "", + newSecret: "", + editingId: null, + editLabel: "", + editSecret: "", + copiedId: null, + revealedId: null, + syncEnabled: true, + globalSyncStatus: "idle", + syncError: "", + saving: false, + toast: "", + relayInfo: { read: [], write: [] } + }; + function $(id) { + return document.getElementById(id); + } + function hasRelays() { + return state.relayInfo.read.length > 0 || state.relayInfo.write.length > 0; + } + function sortedKeys() { + return [...state.keys].sort( + (a, b) => a.label.toLowerCase().localeCompare(b.label.toLowerCase()) + ); + } + function maskSecret(secret) { + if (!secret) return ""; + if (secret.length <= 8) return "\u2022".repeat(secret.length); + return secret.slice(0, 4) + "\u2022".repeat(4) + secret.slice(-4); + } + function showToast(msg) { + state.toast = msg; + render(); + setTimeout(() => { + state.toast = ""; + render(); + }, 2e3); + } + function syncStatusClass(status) { + if (status === "idle") return "bg-green-500"; + if (status === "syncing") return "bg-yellow-500 animate-pulse"; + return "bg-red-500"; + } + function syncStatusText() { + if (state.globalSyncStatus === "syncing") return "Syncing..."; + if (state.globalSyncStatus === "error") return state.syncError; + return state.syncEnabled ? "Synced" : "Local only"; + } + function render() { + const syncDot = $("sync-dot"); + const syncText = $("sync-text"); + const syncBtn = $("sync-btn"); + const syncToggle = $("sync-toggle"); + const keyCount = $("key-count"); + if (syncDot) syncDot.className = `inline-block w-3 h-3 rounded-full ${syncStatusClass(state.globalSyncStatus)}`; + if (syncText) syncText.textContent = syncStatusText(); + if (syncBtn) syncBtn.disabled = state.globalSyncStatus === "syncing" || !hasRelays() || !state.syncEnabled; + if (syncToggle) syncToggle.checked = state.syncEnabled; + if (keyCount) keyCount.textContent = state.keys.length + " key" + (state.keys.length !== 1 ? "s" : ""); + const keyTableContainer = $("key-table-container"); + const noKeysMsg = $("no-keys"); + const keyTableBody = $("key-table-body"); + if (keyTableContainer) keyTableContainer.style.display = state.keys.length > 0 ? "block" : "none"; + if (noKeysMsg) noKeysMsg.style.display = state.keys.length === 0 ? "block" : "none"; + if (keyTableBody) { + const sorted = sortedKeys(); + keyTableBody.innerHTML = sorted.map((key) => { + if (state.editingId === key.id) { + return ` @@ -15,8 +496,8 @@ class="input text-xs font-mono w-full" autocomplete="off" spellcheck="false" - data-edit-secret="${i.id}" - value="${X(n.editSecret)}" + data-edit-secret="${key.id}" + value="${escapeAttr(state.editSecret)}" /> @@ -24,17 +505,311 @@ - `;let h=n.revealedId===i.id?N(i.secret):N(ie(i.secret)),Z=n.copiedId===i.id?"Copied!":"Copy";return` + `; + } + const displaySecret = state.revealedId === key.id ? escapeHtml(key.secret) : escapeHtml(maskSecret(key.secret)); + const copyLabel = state.copiedId === key.id ? "Copied!" : "Copy"; + return ` - ${N(i.label)} + ${escapeHtml(key.label)} - ${h} + ${displaySecret} - - + + - `}).join(""),f.querySelectorAll('[data-action="start-edit"]').forEach(i=>{i.addEventListener("click",()=>de(i.dataset.keyId))}),f.querySelectorAll('[data-action="toggle-reveal"]').forEach(i=>{i.addEventListener("click",()=>{n.revealedId=n.revealedId===i.dataset.keyId?null:i.dataset.keyId,p()})}),f.querySelectorAll('[data-action="copy-secret"]').forEach(i=>{i.addEventListener("click",()=>fe(i.dataset.keyId))}),f.querySelectorAll('[data-action="delete-key"]').forEach(i=>{i.addEventListener("click",()=>ye(i.dataset.keyId))}),f.querySelectorAll('[data-action="save-edit"]').forEach(i=>{i.addEventListener("click",$)}),f.querySelectorAll('[data-action="cancel-edit"]').forEach(i=>{i.addEventListener("click",R)}),f.querySelectorAll("[data-edit-label]").forEach(i=>{i.addEventListener("input",h=>{n.editLabel=h.target.value}),i.addEventListener("keyup",h=>{h.key==="Enter"&&$(),h.key==="Escape"&&R()})}),f.querySelectorAll("[data-edit-secret]").forEach(i=>{i.addEventListener("input",h=>{n.editSecret=h.target.value}),i.addEventListener("keyup",h=>{h.key==="Enter"&&$(),h.key==="Escape"&&R()})})}let S=l("new-label"),g=l("new-secret"),m=l("add-key-btn");S&&document.activeElement!==S&&(S.value=n.newLabel),g&&document.activeElement!==g&&(g.value=n.newSecret),m&&(m.disabled=n.saving||n.newLabel.trim().length===0||n.newSecret.trim().length===0,m.textContent=n.saving?"Saving...":"Save");let b=l("toast");b&&(b.textContent=n.toast,b.style.display=n.toast?"block":"none")}function N(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function X(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}async function ue(){let e=n.newLabel.trim(),t=n.newSecret.trim();if(!e||!t)return;n.saving=!0,p();let a=crypto.randomUUID();await j(a,e,t),n.keys=await x(),n.newLabel="",n.newSecret="",n.syncEnabled&&L()&&await M(),n.saving=!1,v("Key added")}function de(e){let t=n.keys.find(a=>a.id===e);t&&(n.editingId=t.id,n.editLabel=t.label,n.editSecret=t.secret,p())}async function $(){if(!n.editingId)return;let e=n.editLabel.trim(),t=n.editSecret.trim();!e||!t||(await j(n.editingId,e,t),n.keys=await x(),n.editingId=null,n.editLabel="",n.editSecret="",n.syncEnabled&&L()&&await M(),v("Key updated"))}function R(){n.editingId=null,n.editLabel="",n.editSecret="",p()}async function ye(e){let t=n.keys.find(a=>a.id===e);t&&confirm(`Delete "${t.label}"?`)&&(await z(e),n.keys=await x(),n.syncEnabled&&L()&&await M(),v("Key deleted"))}async function fe(e){let t=n.keys.find(a=>a.id===e);t&&(await navigator.clipboard.writeText(t.secret),n.copiedId=e,p(),setTimeout(()=>{n.copiedId=null,p()},2e3),setTimeout(()=>{navigator.clipboard.writeText("").catch(()=>{})},3e4))}async function M(){try{let e=await C(),t=await u.runtime.sendMessage({kind:"apikeys.publish",payload:{keys:e.keys}});return t.success&&await A("synced",t.eventId,t.createdAt),t}catch(e){return await A("local-only"),{success:!1,error:e.message}}}async function U(){n.globalSyncStatus="syncing",n.syncError="",p();try{let e=await u.runtime.sendMessage({kind:"apikeys.fetch"});if(!e.success){n.globalSyncStatus="error",n.syncError=e.error||"Sync failed",p();return}if(e.keys){let t=await C(),a=t.keys;Object.keys(a).length===0?await O(e.keys):(!t.relayCreatedAt||e.createdAt>t.relayCreatedAt)&&await O(e.keys),await A("synced",e.eventId,e.createdAt),n.keys=await x()}n.globalSyncStatus="idle"}catch(e){n.globalSyncStatus="error",n.syncError=e.message||"Sync failed"}p()}async function pe(){await H(n.syncEnabled),n.syncEnabled&&L()&&await U()}async function ge(){let e=await W(),t=JSON.stringify(e,null,2),a=await u.runtime.sendMessage({kind:"apikeys.encrypt",payload:{plainText:t}});if(!a.success){v("Export failed: "+(a.error||"unknown"));return}let s=new Blob([JSON.stringify({encrypted:!0,data:a.cipherText})],{type:"application/json"}),o=URL.createObjectURL(s),c=document.createElement("a");c.href=o,c.download="nostrkey-api-keys-backup.json",c.click(),URL.revokeObjectURL(o),v("Exported")}async function be(e){let t=e.target.files?.[0];if(t){try{let a=await t.text(),s=JSON.parse(a),o;if(s.encrypted&&s.data){let c=await u.runtime.sendMessage({kind:"apikeys.decrypt",payload:{cipherText:s.data}});if(!c.success){v("Decrypt failed: "+(c.error||"unknown"));return}o=JSON.parse(c.plainText)}else o=s;await O(o),n.keys=await x(),n.syncEnabled&&L()&&await M(),v("Imported "+Object.keys(o).length+" keys")}catch(a){v("Import failed: "+a.message)}e.target.value=""}}function Se(){l("sync-btn")?.addEventListener("click",U),l("add-key-btn")?.addEventListener("click",ue),l("export-btn")?.addEventListener("click",ge),l("import-file")?.addEventListener("change",be),l("close-btn")?.addEventListener("click",()=>window.close()),l("sync-toggle")?.addEventListener("change",e=>{n.syncEnabled=e.target.checked,pe()}),l("new-label")?.addEventListener("input",e=>{n.newLabel=e.target.value,p()}),l("new-secret")?.addEventListener("input",e=>{n.newSecret=e.target.value,p()})}async function he(){let e=await u.runtime.sendMessage({kind:"isEncrypted"}),t=l("vault-locked-gate"),a=l("vault-main-content");if(!e){t&&(t.style.display="block"),a&&(a.style.display="none"),l("gate-security-btn")?.addEventListener("click",()=>{let o=u.runtime.getURL("security/security.html");window.open(o,"nostrkey-options")});return}t&&(t.style.display="none"),a&&(a.style.display="block");let s=await u.runtime.sendMessage({kind:"vault.getRelays"});n.relayInfo=s||{read:[],write:[]},n.syncEnabled=await G(),n.keys=await x(),Se(),p(),n.syncEnabled&&L()&&await U()}document.addEventListener("DOMContentLoaded",he);})(); + `; + }).join(""); + keyTableBody.querySelectorAll('[data-action="start-edit"]').forEach((el) => { + el.addEventListener("click", () => startEdit(el.dataset.keyId)); + }); + keyTableBody.querySelectorAll('[data-action="toggle-reveal"]').forEach((el) => { + el.addEventListener("click", () => { + state.revealedId = state.revealedId === el.dataset.keyId ? null : el.dataset.keyId; + render(); + }); + }); + keyTableBody.querySelectorAll('[data-action="copy-secret"]').forEach((el) => { + el.addEventListener("click", () => copySecret(el.dataset.keyId)); + }); + keyTableBody.querySelectorAll('[data-action="delete-key"]').forEach((el) => { + el.addEventListener("click", () => deleteKey(el.dataset.keyId)); + }); + keyTableBody.querySelectorAll('[data-action="save-edit"]').forEach((el) => { + el.addEventListener("click", saveEdit); + }); + keyTableBody.querySelectorAll('[data-action="cancel-edit"]').forEach((el) => { + el.addEventListener("click", cancelEdit); + }); + keyTableBody.querySelectorAll("[data-edit-label]").forEach((el) => { + el.addEventListener("input", (e) => { + state.editLabel = e.target.value; + }); + el.addEventListener("keyup", (e) => { + if (e.key === "Enter") saveEdit(); + if (e.key === "Escape") cancelEdit(); + }); + }); + keyTableBody.querySelectorAll("[data-edit-secret]").forEach((el) => { + el.addEventListener("input", (e) => { + state.editSecret = e.target.value; + }); + el.addEventListener("keyup", (e) => { + if (e.key === "Enter") saveEdit(); + if (e.key === "Escape") cancelEdit(); + }); + }); + } + const newLabelInput = $("new-label"); + const newSecretInput = $("new-secret"); + const addKeyBtn = $("add-key-btn"); + if (newLabelInput && document.activeElement !== newLabelInput) newLabelInput.value = state.newLabel; + if (newSecretInput && document.activeElement !== newSecretInput) newSecretInput.value = state.newSecret; + if (addKeyBtn) { + addKeyBtn.disabled = state.saving || state.newLabel.trim().length === 0 || state.newSecret.trim().length === 0; + addKeyBtn.textContent = state.saving ? "Saving..." : "Save"; + } + const toast = $("toast"); + if (toast) { + toast.textContent = state.toast; + toast.style.display = state.toast ? "block" : "none"; + } + } + function escapeHtml(str) { + const div = document.createElement("div"); + div.textContent = str; + return div.innerHTML; + } + function escapeAttr(str) { + return str.replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); + } + async function addKey() { + const label = state.newLabel.trim(); + const secret = state.newSecret.trim(); + if (!label || !secret) return; + state.saving = true; + render(); + const id = crypto.randomUUID(); + await saveApiKey(id, label, secret); + state.keys = await listApiKeys(); + state.newLabel = ""; + state.newSecret = ""; + if (state.syncEnabled && hasRelays()) { + await publishToRelay(); + } + state.saving = false; + showToast("Key added"); + } + function startEdit(id) { + const key = state.keys.find((k) => k.id === id); + if (!key) return; + state.editingId = key.id; + state.editLabel = key.label; + state.editSecret = key.secret; + render(); + } + async function saveEdit() { + if (!state.editingId) return; + const label = state.editLabel.trim(); + const secret = state.editSecret.trim(); + if (!label || !secret) return; + await saveApiKey(state.editingId, label, secret); + state.keys = await listApiKeys(); + state.editingId = null; + state.editLabel = ""; + state.editSecret = ""; + if (state.syncEnabled && hasRelays()) { + await publishToRelay(); + } + showToast("Key updated"); + } + function cancelEdit() { + state.editingId = null; + state.editLabel = ""; + state.editSecret = ""; + render(); + } + async function deleteKey(id) { + const key = state.keys.find((k) => k.id === id); + if (!key) return; + if (!confirm(`Delete "${key.label}"?`)) return; + await deleteApiKey(id); + state.keys = await listApiKeys(); + if (state.syncEnabled && hasRelays()) { + await publishToRelay(); + } + showToast("Key deleted"); + } + async function copySecret(id) { + const key = state.keys.find((k) => k.id === id); + if (!key) return; + await navigator.clipboard.writeText(key.secret); + state.copiedId = id; + render(); + setTimeout(() => { + state.copiedId = null; + render(); + }, 2e3); + setTimeout(() => { + navigator.clipboard.writeText("").catch(() => { + }); + }, 3e4); + } + async function publishToRelay() { + try { + const store = await getApiKeyStore(); + const result = await api.runtime.sendMessage({ + kind: "apikeys.publish", + payload: { keys: store.keys } + }); + if (result.success) { + await updateStoreSyncState("synced", result.eventId, result.createdAt); + } + return result; + } catch (e) { + await updateStoreSyncState("local-only"); + return { success: false, error: e.message }; + } + } + async function syncAll() { + state.globalSyncStatus = "syncing"; + state.syncError = ""; + render(); + try { + const result = await api.runtime.sendMessage({ kind: "apikeys.fetch" }); + if (!result.success) { + state.globalSyncStatus = "error"; + state.syncError = result.error || "Sync failed"; + render(); + return; + } + if (result.keys) { + const store = await getApiKeyStore(); + const localKeys = store.keys; + const localCount = Object.keys(localKeys).length; + if (localCount === 0) { + await importStore(result.keys); + } else if (!store.relayCreatedAt || result.createdAt > store.relayCreatedAt) { + await importStore(result.keys); + } + await updateStoreSyncState("synced", result.eventId, result.createdAt); + state.keys = await listApiKeys(); + } + state.globalSyncStatus = "idle"; + } catch (e) { + state.globalSyncStatus = "error"; + state.syncError = e.message || "Sync failed"; + } + render(); + } + async function toggleSync() { + await setSyncEnabled(state.syncEnabled); + if (state.syncEnabled && hasRelays()) { + await syncAll(); + } + } + async function exportKeys() { + const keys = await exportStore(); + const plainText = JSON.stringify(keys, null, 2); + const result = await api.runtime.sendMessage({ + kind: "apikeys.encrypt", + payload: { plainText } + }); + if (!result.success) { + showToast("Export failed: " + (result.error || "unknown")); + return; + } + const blob = new Blob( + [JSON.stringify({ encrypted: true, data: result.cipherText })], + { type: "application/json" } + ); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = "nostrkey-api-keys-backup.json"; + a.click(); + URL.revokeObjectURL(url); + showToast("Exported"); + } + async function importKeys(event) { + const file = event.target.files?.[0]; + if (!file) return; + try { + const text = await file.text(); + const parsed = JSON.parse(text); + let keys; + if (parsed.encrypted && parsed.data) { + const result = await api.runtime.sendMessage({ + kind: "apikeys.decrypt", + payload: { cipherText: parsed.data } + }); + if (!result.success) { + showToast("Decrypt failed: " + (result.error || "unknown")); + return; + } + keys = JSON.parse(result.plainText); + } else { + keys = parsed; + } + await importStore(keys); + state.keys = await listApiKeys(); + if (state.syncEnabled && hasRelays()) { + await publishToRelay(); + } + showToast("Imported " + Object.keys(keys).length + " keys"); + } catch (e) { + showToast("Import failed: " + e.message); + } + event.target.value = ""; + } + function bindEvents() { + $("sync-btn")?.addEventListener("click", syncAll); + $("add-key-btn")?.addEventListener("click", addKey); + $("export-btn")?.addEventListener("click", exportKeys); + $("import-file")?.addEventListener("change", importKeys); + $("close-btn")?.addEventListener("click", () => window.close()); + $("sync-toggle")?.addEventListener("change", (e) => { + state.syncEnabled = e.target.checked; + toggleSync(); + }); + $("new-label")?.addEventListener("input", (e) => { + state.newLabel = e.target.value; + render(); + }); + $("new-secret")?.addEventListener("input", (e) => { + state.newSecret = e.target.value; + render(); + }); + } + async function init() { + const isEncrypted = await api.runtime.sendMessage({ kind: "isEncrypted" }); + const gate = $("vault-locked-gate"); + const main = $("vault-main-content"); + if (!isEncrypted) { + if (gate) gate.style.display = "block"; + if (main) main.style.display = "none"; + $("gate-security-btn")?.addEventListener("click", () => { + const url = api.runtime.getURL("security/security.html"); + window.open(url, "nostrkey-options"); + }); + return; + } + if (gate) gate.style.display = "none"; + if (main) main.style.display = "block"; + const relays = await api.runtime.sendMessage({ kind: "vault.getRelays" }); + state.relayInfo = relays || { read: [], write: [] }; + state.syncEnabled = await isSyncEnabled2(); + state.keys = await listApiKeys(); + bindEvents(); + render(); + if (state.syncEnabled && hasRelays()) { + await syncAll(); + } + } + document.addEventListener("DOMContentLoaded", init); +})(); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxpdGllcy9icm93c2VyLXBvbHlmaWxsLmpzIiwgIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvc3luYy1tYW5hZ2VyLmpzIiwgIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvYXBpLWtleS1zdG9yZS5qcyIsICIuLi8uLi8uLi9zcmMvYXBpLWtleXMvYXBpLWtleXMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQnJvd3NlciBBUEkgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgQ2hyb21lIC8gU2FmYXJpIC8gRmlyZWZveC5cbiAqXG4gKiBTYWZhcmkgYW5kIEZpcmVmb3ggZXhwb3NlIGBicm93c2VyLipgIChQcm9taXNlLWJhc2VkLCBXZWJFeHRlbnNpb24gc3RhbmRhcmQpLlxuICogQ2hyb21lIGV4cG9zZXMgYGNocm9tZS4qYCAoY2FsbGJhY2stYmFzZWQgaGlzdG9yaWNhbGx5LCBidXQgTVYzIHN1cHBvcnRzXG4gKiBwcm9taXNlcyBvbiBtb3N0IEFQSXMpLiBJbiBhIHNlcnZpY2Utd29ya2VyIGNvbnRleHQgYGJyb3dzZXJgIGlzIHVuZGVmaW5lZFxuICogb24gQ2hyb21lLCBzbyB3ZSBub3JtYWxpc2UgZXZlcnl0aGluZyBoZXJlLlxuICpcbiAqIFVzYWdlOiAgaW1wb3J0IHsgYXBpIH0gZnJvbSAnLi91dGlsaXRpZXMvYnJvd3Nlci1wb2x5ZmlsbCc7XG4gKiAgICAgICAgIGFwaS5ydW50aW1lLnNlbmRNZXNzYWdlKC4uLilcbiAqXG4gKiBUaGUgZXhwb3J0ZWQgYGFwaWAgb2JqZWN0IG1pcnJvcnMgdGhlIHN1YnNldCBvZiB0aGUgV2ViRXh0ZW5zaW9uIEFQSSB0aGF0XG4gKiBOb3N0cktleSBhY3R1YWxseSB1c2VzLCB3aXRoIGV2ZXJ5IG1ldGhvZCByZXR1cm5pbmcgYSBQcm9taXNlLlxuICovXG5cbi8vIERldGVjdCB3aGljaCBnbG9iYWwgbmFtZXNwYWNlIGlzIGF2YWlsYWJsZS5cbmNvbnN0IF9icm93c2VyID1cbiAgICB0eXBlb2YgYnJvd3NlciAhPT0gJ3VuZGVmaW5lZCcgPyBicm93c2VyIDpcbiAgICB0eXBlb2YgY2hyb21lICAhPT0gJ3VuZGVmaW5lZCcgPyBjaHJvbWUgIDpcbiAgICBudWxsO1xuXG5pZiAoIV9icm93c2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyLXBvbHlmaWxsOiBObyBleHRlbnNpb24gQVBJIG5hbWVzcGFjZSBmb3VuZCAobmVpdGhlciBicm93c2VyIG5vciBjaHJvbWUpLicpO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBydW5uaW5nIG9uIENocm9tZSAob3IgYW55IENocm9taXVtLWJhc2VkIGJyb3dzZXIgdGhhdCBvbmx5XG4gKiBleHBvc2VzIHRoZSBgY2hyb21lYCBuYW1lc3BhY2UpLlxuICovXG5jb25zdCBpc0Nocm9tZSA9IHR5cGVvZiBicm93c2VyID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY2hyb21lICE9PSAndW5kZWZpbmVkJztcblxuLyoqXG4gKiBXcmFwIGEgQ2hyb21lIGNhbGxiYWNrLXN0eWxlIG1ldGhvZCBzbyBpdCByZXR1cm5zIGEgUHJvbWlzZS5cbiAqIElmIHRoZSBtZXRob2QgYWxyZWFkeSByZXR1cm5zIGEgcHJvbWlzZSAoTVYzKSB3ZSBqdXN0IHBhc3MgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gcHJvbWlzaWZ5KGNvbnRleHQsIG1ldGhvZCkge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICAvLyBNVjMgQ2hyb21lIEFQSXMgcmV0dXJuIHByb21pc2VzIHdoZW4gbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuXG4gICAgICAgIC8vIFdlIHRyeSB0aGUgcHJvbWlzZSBwYXRoIGZpcnN0OyBpZiB0aGUgcnVudGltZSBzaWduYWxzIGFuIGVycm9yXG4gICAgICAgIC8vIHZpYSBjaHJvbWUucnVudGltZS5sYXN0RXJyb3IgaW5zaWRlIGEgY2FsbGJhY2sgd2UgY2F0Y2ggdGhhdCB0b28uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBtZXRob2QuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBjYWxsYmFjayB3cmFwcGluZ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1ldGhvZC5hcHBseShjb250ZXh0LCBbXG4gICAgICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgICAgICAoLi4uY2JBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYnJvd3Nlci5ydW50aW1lICYmIF9icm93c2VyLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKF9icm93c2VyLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2JBcmdzLmxlbmd0aCA8PSAxID8gY2JBcmdzWzBdIDogY2JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdWlsZCB0aGUgdW5pZmllZCBgYXBpYCBvYmplY3Rcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBhcGkgPSB7fTtcblxuLy8gLS0tIHJ1bnRpbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5hcGkucnVudGltZSA9IHtcbiAgICAvKipcbiAgICAgKiBzZW5kTWVzc2FnZSBcdTIwMTMgYWx3YXlzIHJldHVybnMgYSBQcm9taXNlLlxuICAgICAqL1xuICAgIHNlbmRNZXNzYWdlKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5ydW50aW1lLCBfYnJvd3Nlci5ydW50aW1lLnNlbmRNZXNzYWdlKSguLi5hcmdzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogb25NZXNzYWdlIFx1MjAxMyB0aGluIHdyYXBwZXIgc28gY2FsbGVycyB1c2UgYSBjb25zaXN0ZW50IHJlZmVyZW5jZS5cbiAgICAgKiBUaGUgbGlzdGVuZXIgc2lnbmF0dXJlIGlzIChtZXNzYWdlLCBzZW5kZXIsIHNlbmRSZXNwb25zZSkuXG4gICAgICogT24gQ2hyb21lIHRoZSBsaXN0ZW5lciBjYW4gcmV0dXJuIGB0cnVlYCB0byBrZWVwIHRoZSBjaGFubmVsIG9wZW4sXG4gICAgICogb3IgcmV0dXJuIGEgUHJvbWlzZSAoTVYzKS4gIFNhZmFyaSAvIEZpcmVmb3ggZXhwZWN0IGEgUHJvbWlzZSByZXR1cm4uXG4gICAgICovXG4gICAgb25NZXNzYWdlOiBfYnJvd3Nlci5ydW50aW1lLm9uTWVzc2FnZSxcblxuICAgIC8qKlxuICAgICAqIGdldFVSTCBcdTIwMTMgc3luY2hyb25vdXMgb24gYWxsIGJyb3dzZXJzLlxuICAgICAqL1xuICAgIGdldFVSTChwYXRoKSB7XG4gICAgICAgIHJldHVybiBfYnJvd3Nlci5ydW50aW1lLmdldFVSTChwYXRoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogb3Blbk9wdGlvbnNQYWdlXG4gICAgICovXG4gICAgb3Blbk9wdGlvbnNQYWdlKCkge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIucnVudGltZS5vcGVuT3B0aW9uc1BhZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnJ1bnRpbWUsIF9icm93c2VyLnJ1bnRpbWUub3Blbk9wdGlvbnNQYWdlKSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFeHBvc2UgdGhlIGlkIGZvciBjb252ZW5pZW5jZS5cbiAgICAgKi9cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiBfYnJvd3Nlci5ydW50aW1lLmlkO1xuICAgIH0sXG59O1xuXG4vLyAtLS0gc3RvcmFnZS5sb2NhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmFwaS5zdG9yYWdlID0ge1xuICAgIGxvY2FsOiB7XG4gICAgICAgIGdldCguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2UubG9jYWwuZ2V0KC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLCBfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLmdldCkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2UubG9jYWwuc2V0KC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLCBfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLnNldCkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsZWFyKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5sb2NhbC5jbGVhciguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIuc3RvcmFnZS5sb2NhbCwgX2Jyb3dzZXIuc3RvcmFnZS5sb2NhbC5jbGVhcikoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2UubG9jYWwucmVtb3ZlKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLCBfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLnJlbW92ZSkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIC0tLSBzdG9yYWdlLnN5bmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIE51bGwgd2hlbiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgc3luYyAob2xkZXIgU2FmYXJpLCBldGMuKVxuICAgIHN5bmM6IF9icm93c2VyLnN0b3JhZ2U/LnN5bmMgPyB7XG4gICAgICAgIGdldCguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2Uuc3luYy5nZXQoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2Uuc3luYywgX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLmdldCkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2Uuc3luYy5zZXQoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2Uuc3luYywgX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLnNldCkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2Uuc3luYy5yZW1vdmUoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2Uuc3luYywgX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLnJlbW92ZSkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsZWFyKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLmNsZWFyKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5zdG9yYWdlLnN5bmMsIF9icm93c2VyLnN0b3JhZ2Uuc3luYy5jbGVhcikoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEJ5dGVzSW5Vc2UoLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKCFfYnJvd3Nlci5zdG9yYWdlLnN5bmMuZ2V0Qnl0ZXNJblVzZSkge1xuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgZ2V0Qnl0ZXNJblVzZSBcdTIwMTQgcmV0dXJuIDBcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci5zdG9yYWdlLnN5bmMuZ2V0Qnl0ZXNJblVzZSguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLCBfYnJvd3Nlci5zdG9yYWdlLnN5bmMuZ2V0Qnl0ZXNJblVzZSkoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgfSA6IG51bGwsXG5cbiAgICAvLyAtLS0gc3RvcmFnZS5vbkNoYW5nZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBvbkNoYW5nZWQ6IF9icm93c2VyLnN0b3JhZ2U/Lm9uQ2hhbmdlZCB8fCBudWxsLFxufTtcblxuLy8gLS0tIHRhYnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5hcGkudGFicyA9IHtcbiAgICBjcmVhdGUoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIudGFicy5jcmVhdGUoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci50YWJzLCBfYnJvd3Nlci50YWJzLmNyZWF0ZSkoLi4uYXJncyk7XG4gICAgfSxcbiAgICBxdWVyeSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci50YWJzLnF1ZXJ5KC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIudGFicywgX2Jyb3dzZXIudGFicy5xdWVyeSkoLi4uYXJncyk7XG4gICAgfSxcbiAgICByZW1vdmUoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIudGFicy5yZW1vdmUoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci50YWJzLCBfYnJvd3Nlci50YWJzLnJlbW92ZSkoLi4uYXJncyk7XG4gICAgfSxcbiAgICB1cGRhdGUoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIudGFicy51cGRhdGUoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci50YWJzLCBfYnJvd3Nlci50YWJzLnVwZGF0ZSkoLi4uYXJncyk7XG4gICAgfSxcbiAgICBnZXQoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIudGFicy5nZXQoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci50YWJzLCBfYnJvd3Nlci50YWJzLmdldCkoLi4uYXJncyk7XG4gICAgfSxcbiAgICBnZXRDdXJyZW50KC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnRhYnMuZ2V0Q3VycmVudCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnRhYnMsIF9icm93c2VyLnRhYnMuZ2V0Q3VycmVudCkoLi4uYXJncyk7XG4gICAgfSxcbiAgICBzZW5kTWVzc2FnZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci50YWJzLnNlbmRNZXNzYWdlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIudGFicywgX2Jyb3dzZXIudGFicy5zZW5kTWVzc2FnZSkoLi4uYXJncyk7XG4gICAgfSxcbn07XG5cbi8vIC0tLSBhbGFybXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gY2hyb21lLmFsYXJtcyBzdXJ2aXZlcyBNVjMgc2VydmljZS13b3JrZXIgZXZpY3Rpb247IHNldFRpbWVvdXQgZG9lcyBub3QuXG5hcGkuYWxhcm1zID0gX2Jyb3dzZXIuYWxhcm1zID8ge1xuICAgIGNyZWF0ZSguLi5hcmdzKSB7XG4gICAgICAgIC8vIGFsYXJtcy5jcmVhdGUgaXMgc3luY2hyb25vdXMgb24gQ2hyb21lLCByZXR1cm5zIFByb21pc2Ugb24gRmlyZWZveC9TYWZhcmlcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gX2Jyb3dzZXIuYWxhcm1zLmNyZWF0ZSguLi5hcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicgPyByZXN1bHQgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9LFxuICAgIGNsZWFyKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLmFsYXJtcy5jbGVhciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLmFsYXJtcywgX2Jyb3dzZXIuYWxhcm1zLmNsZWFyKSguLi5hcmdzKTtcbiAgICB9LFxuICAgIG9uQWxhcm06IF9icm93c2VyLmFsYXJtcy5vbkFsYXJtLFxufSA6IG51bGw7XG5cbmV4cG9ydCB7IGFwaSwgaXNDaHJvbWUgfTtcbiIsICIvKipcbiAqIFN5bmMgTWFuYWdlciBcdTIwMTQgUGxhdGZvcm0gc3luYyB2aWEgc3RvcmFnZS5zeW5jIChDaHJvbWUgXHUyMTkyIEdvb2dsZSwgU2FmYXJpIFx1MjE5MiBpQ2xvdWQpXG4gKlxuICogQXJjaGl0ZWN0dXJlOlxuICogICBXcml0ZTogYXBwIFx1MjE5MiBzdG9yYWdlLmxvY2FsIFx1MjE5MiBzY2hlZHVsZVN5bmNQdXNoKCkgXHUyMTkyIHN0b3JhZ2Uuc3luY1xuICogICBSZWFkOiAgcHVsbEZyb21TeW5jKCkgb24gc3RhcnR1cCBcdTIxOTIgbWVyZ2UgaW50byBzdG9yYWdlLmxvY2FsXG4gKiAgIExpc3Rlbjogc3RvcmFnZS5vbkNoYW5nZWQoXCJzeW5jXCIpIFx1MjE5MiBtZXJnZSByZW1vdGUgY2hhbmdlcyBpbnRvIGxvY2FsXG4gKlxuICogc3RvcmFnZS5sb2NhbCByZW1haW5zIHRoZSBzb3VyY2Ugb2YgdHJ1dGguIHN0b3JhZ2Uuc3luYyBpcyBhIGJlc3QtZWZmb3J0IG1pcnJvci5cbiAqL1xuXG5pbXBvcnQgeyBhcGkgfSBmcm9tICcuL2Jyb3dzZXItcG9seWZpbGwnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBTWU5DX1FVT1RBID0gMTAyXzQwMDsgICAgICAgLy8gMTAwIEtCIHRvdGFsXG5jb25zdCBNQVhfSVRFTSA9IDhfMTkyOyAgICAgICAgICAgLy8gOCBLQiBwZXIgaXRlbVxuY29uc3QgTUFYX0lURU1TID0gNTEyO1xuY29uc3QgQ0hVTktfUFJFRklYID0gJ19jaHVuazonO1xuY29uc3QgU1lOQ19NRVRBX0tFWSA9ICdfc3luY19tZXRhJztcbmNvbnN0IExPQ0FMX0VOQUJMRURfS0VZID0gJ3BsYXRmb3JtU3luY0VuYWJsZWQnO1xuXG4vLyBLZXlzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIHN5bmNlZFxuY29uc3QgRVhDTFVERURfS0VZUyA9IFtcbiAgICAnYnVua2VyU2Vzc2lvbnMnLFxuICAgICdpZ25vcmVJbnN0YWxsSG9vaycsXG4gICAgJ3Bhc3N3b3JkSGFzaCcsXG4gICAgJ3Bhc3N3b3JkU2FsdCcsXG5dO1xuXG4vLyBQcmlvcml0eSB0aWVycyBmb3IgYnVkZ2V0IGFsbG9jYXRpb25cbmNvbnN0IFBSSU9SSVRZID0ge1xuICAgIFAxX1BST0ZJTEVTOiAxLFxuICAgIFAyX1NFVFRJTkdTOiAyLFxuICAgIFAzX0FQSUtFWVM6IDMsXG4gICAgUDRfVkFVTFQ6IDQsXG59O1xuXG5jb25zdCBzdG9yYWdlID0gYXBpLnN0b3JhZ2UubG9jYWw7XG5sZXQgcHVzaFRpbWVyID0gbnVsbDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaHVua2luZyBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTcGxpdCBhIEpTT04tc2VyaWFsaXNlZCB2YWx1ZSBpbnRvIDw9OEtCIGNodW5rcy5cbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgeyBrZXksIHZhbHVlIH0gcGFpcnMgcmVhZHkgZm9yIHN0b3JhZ2Uuc3luYy5zZXQoKS5cbiAqL1xuZnVuY3Rpb24gY2h1bmtWYWx1ZShrZXksIGpzb25TdHJpbmcpIHtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25TdHJpbmcubGVuZ3RoOyBpICs9IE1BWF9JVEVNIC0gMTAwKSB7XG4gICAgICAgIC8vIFJlc2VydmUgfjEwMCBieXRlcyBmb3IgdGhlIGtleSBvdmVyaGVhZCBpbiB0aGUgc3RvcmVkIGl0ZW1cbiAgICAgICAgY2h1bmtzLnB1c2goanNvblN0cmluZy5zbGljZShpLCBpICsgTUFYX0lURU0gLSAxMDApKTtcbiAgICB9XG4gICAgaWYgKGNodW5rcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRml0cyBpbiBhIHNpbmdsZSBpdGVtIFx1MjAxNCBzdG9yZSBkaXJlY3RseVxuICAgICAgICByZXR1cm4gW3sga2V5LCB2YWx1ZToganNvblN0cmluZyB9XTtcbiAgICB9XG4gICAgLy8gTXVsdGlwbGUgY2h1bmtzXG4gICAgY29uc3QgZW50cmllcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IGtleTogYCR7Q0hVTktfUFJFRklYfSR7a2V5fToke2l9YCwgdmFsdWU6IGNodW5rc1tpXSB9KTtcbiAgICB9XG4gICAgLy8gU3RvcmUgYSBtZXRhZGF0YSBlbnRyeSBzbyB3ZSBrbm93IGhvdyBtYW55IGNodW5rcyB0aGVyZSBhcmVcbiAgICBlbnRyaWVzLnB1c2goeyBrZXksIHZhbHVlOiBKU09OLnN0cmluZ2lmeSh7IF9fY2h1bmtlZDogdHJ1ZSwgY291bnQ6IGNodW5rcy5sZW5ndGggfSkgfSk7XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogUmVhc3NlbWJsZSBjaHVua2VkIGRhdGEgZnJvbSBhIHN5bmMgZGF0YSBvYmplY3QuXG4gKiBSZXR1cm5zIHRoZSBwYXJzZWQgSlNPTiB2YWx1ZSwgb3IgbnVsbCBvbiBlcnJvci5cbiAqL1xuZnVuY3Rpb24gcmVhc3NlbWJsZUZyb21TeW5jRGF0YShrZXksIHN5bmNEYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHR5cGVvZiBzeW5jRGF0YVtrZXldID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc3luY0RhdGFba2V5XSkgOiBzeW5jRGF0YVtrZXldO1xuICAgICAgICBpZiAoIW1ldGEgfHwgIW1ldGEuX19jaHVua2VkKSB7XG4gICAgICAgICAgICAvLyBOb3QgY2h1bmtlZCBcdTIwMTQgcGFyc2UgZGlyZWN0bHlcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygc3luY0RhdGFba2V5XSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHN5bmNEYXRhW2tleV0pIDogc3luY0RhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29tYmluZWQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhLmNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rS2V5ID0gYCR7Q0hVTktfUFJFRklYfSR7a2V5fToke2l9YDtcbiAgICAgICAgICAgIGlmIChzeW5jRGF0YVtjaHVua0tleV0gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb21iaW5lZCArPSBzeW5jRGF0YVtjaHVua0tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29tYmluZWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQnVpbGQgc3luYyBwYXlsb2FkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZWFkIGFsbCBsb2NhbCBkYXRhIGFuZCBidWlsZCBhIHByaW9yaXRpc2VkIGxpc3Qgb2YgZW50cmllcyB0byBzeW5jLlxuICogUmV0dXJucyB7IGVudHJpZXM6IFt7IGtleSwganNvblN0cmluZywgcHJpb3JpdHksIHNpemUgfV0sIHRvdGFsU2l6ZSB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3luY1BheWxvYWQoKSB7XG4gICAgY29uc3QgYWxsID0gYXdhaXQgc3RvcmFnZS5nZXQobnVsbCk7XG4gICAgY29uc3QgZW50cmllcyA9IFtdO1xuXG4gICAgLy8gUDE6IFByb2ZpbGVzIChzdHJpcCBgaG9zdHNgIHRvIHNhdmUgc3BhY2UpICsgcHJvZmlsZUluZGV4XG4gICAgaWYgKGFsbC5wcm9maWxlcykge1xuICAgICAgICBjb25zdCBjbGVhblByb2ZpbGVzID0gYWxsLnByb2ZpbGVzLm1hcChwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgaG9zdHMsIC4uLnJlc3QgfSA9IHA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShjbGVhblByb2ZpbGVzKTtcbiAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiAncHJvZmlsZXMnLCBqc29uU3RyaW5nOiBqc29uLCBwcmlvcml0eTogUFJJT1JJVFkuUDFfUFJPRklMRVMsIHNpemU6IGpzb24ubGVuZ3RoIH0pO1xuICAgIH1cbiAgICBpZiAoYWxsLnByb2ZpbGVJbmRleCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShhbGwucHJvZmlsZUluZGV4KTtcbiAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiAncHJvZmlsZUluZGV4JywganNvblN0cmluZzoganNvbiwgcHJpb3JpdHk6IFBSSU9SSVRZLlAxX1BST0ZJTEVTLCBzaXplOiBqc29uLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgLy8gTk9URTogYGlzRW5jcnlwdGVkYCBpcyBpbnRlbnRpb25hbGx5IE5PVCBzeW5jZWQuIFRoZSBwYXNzd29yZCB2ZXJpZmllclxuICAgIC8vIChwYXNzd29yZEhhc2gvcGFzc3dvcmRTYWx0KSBpcyBleGNsdWRlZCBmcm9tIHN5bmMgZm9yIHNlY3VyaXR5LCBzbyBhIGRldmljZVxuICAgIC8vIHRoYXQgcmVjZWl2ZWQgaXNFbmNyeXB0ZWQ9dHJ1ZSB3aXRoIG5vIGhhc2ggd291bGQgYmUgcGVybWFuZW50bHkgbG9ja2VkIG91dFxuICAgIC8vIChjaGVja1Bhc3N3b3JkIGFsd2F5cyBmYWlscykuIEVuY3J5cHRpb24gc3RhdGUgaXMgc3RyaWN0bHkgZGV2aWNlLWxvY2FsLlxuXG4gICAgLy8gUDI6IFNldHRpbmdzXG4gICAgY29uc3Qgc2V0dGluZ3NLZXlzID0gWydhdXRvTG9ja01pbnV0ZXMnLCAndmVyc2lvbicsICdwcm90b2NvbF9oYW5kbGVyJywgTE9DQUxfRU5BQkxFRF9LRVldO1xuICAgIGZvciAoY29uc3QgayBvZiBzZXR0aW5nc0tleXMpIHtcbiAgICAgICAgaWYgKGFsbFtrXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYWxsW2tdKTtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGtleTogaywganNvblN0cmluZzoganNvbiwgcHJpb3JpdHk6IFBSSU9SSVRZLlAyX1NFVFRJTkdTLCBzaXplOiBqc29uLmxlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGZWF0dXJlIGZsYWdzXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGFsbCkpIHtcbiAgICAgICAgaWYgKGsuc3RhcnRzV2l0aCgnZmVhdHVyZTonKSkge1xuICAgICAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGFsbFtrXSk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyBrZXk6IGssIGpzb25TdHJpbmc6IGpzb24sIHByaW9yaXR5OiBQUklPUklUWS5QMl9TRVRUSU5HUywgc2l6ZToganNvbi5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQMzogQVBJIGtleSB2YXVsdFxuICAgIGlmIChhbGwuYXBpS2V5VmF1bHQpIHtcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGFsbC5hcGlLZXlWYXVsdCk7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IGtleTogJ2FwaUtleVZhdWx0JywganNvblN0cmluZzoganNvbiwgcHJpb3JpdHk6IFBSSU9SSVRZLlAzX0FQSUtFWVMsIHNpemU6IGpzb24ubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIC8vIFA0OiBWYXVsdCBkb2NzIChpbmRpdmlkdWFsbHksIG5ld2VzdCBmaXJzdClcbiAgICBpZiAoYWxsLnZhdWx0RG9jcyAmJiB0eXBlb2YgYWxsLnZhdWx0RG9jcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgZG9jcyA9IE9iamVjdC52YWx1ZXMoYWxsLnZhdWx0RG9jcykuc29ydCgoYSwgYikgPT4gKGIudXBkYXRlZEF0IHx8IDApIC0gKGEudXBkYXRlZEF0IHx8IDApKTtcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgY29uc3QgZG9jS2V5ID0gYHZhdWx0RG9jOiR7ZG9jLnBhdGh9YDtcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkb2MpO1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBkb2NLZXksIGpzb25TdHJpbmc6IGpzb24sIHByaW9yaXR5OiBQUklPUklUWS5QNF9WQVVMVCwgc2l6ZToganNvbi5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdXNoIHRvIHN5bmNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hc3luYyBmdW5jdGlvbiBwdXNoVG9TeW5jKCkge1xuICAgIGlmICghYXBpLnN0b3JhZ2Uuc3luYykgcmV0dXJuO1xuXG4gICAgY29uc3QgZW5hYmxlZCA9IGF3YWl0IGlzU3luY0VuYWJsZWQoKTtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBidWlsZFN5bmNQYXlsb2FkKCk7XG5cbiAgICAgICAgLy8gU29ydCBieSBwcmlvcml0eSAoYXNjZW5kaW5nID0gbW9zdCBpbXBvcnRhbnQgZmlyc3QpXG4gICAgICAgIGVudHJpZXMuc29ydCgoYSwgYikgPT4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBzeW5jIHBheWxvYWQgcmVzcGVjdGluZyBidWRnZXRcbiAgICAgICAgbGV0IHVzZWRCeXRlcyA9IDA7XG4gICAgICAgIGxldCB1c2VkSXRlbXMgPSAwO1xuICAgICAgICBjb25zdCBzeW5jUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCBhbGxTeW5jS2V5cyA9IFtdO1xuICAgICAgICBsZXQgYnVkZ2V0RXhoYXVzdGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoYnVkZ2V0RXhoYXVzdGVkKSBicmVhaztcblxuICAgICAgICAgICAgY29uc3QgY2h1bmtzID0gY2h1bmtWYWx1ZShlbnRyeS5rZXksIGVudHJ5Lmpzb25TdHJpbmcpO1xuICAgICAgICAgICAgbGV0IGVudHJ5U2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2h1bmtzKSB7XG4gICAgICAgICAgICAgICAgZW50cnlTaXplICs9IGMua2V5Lmxlbmd0aCArICh0eXBlb2YgYy52YWx1ZSA9PT0gJ3N0cmluZycgPyBjLnZhbHVlLmxlbmd0aCA6IEpTT04uc3RyaW5naWZ5KGMudmFsdWUpLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1c2VkQnl0ZXMgKyBlbnRyeVNpemUgPiBTWU5DX1FVT1RBIC0gNTAwIHx8IHVzZWRJdGVtcyArIGNodW5rcy5sZW5ndGggPiBNQVhfSVRFTVMgLSA1KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnByaW9yaXR5IDw9IFBSSU9SSVRZLlAzX0FQSUtFWVMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JpdGljYWwgZGF0YSBcdTIwMTQgdHJ5IGFueXdheSwgbGV0IHRoZSBBUEkgdGhyb3cgaWYgdHJ1bHkgb3ZlclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgW1N5bmNNYW5hZ2VyXSBCdWRnZXQgZXhoYXVzdGVkIGF0IHByaW9yaXR5ICR7ZW50cnkucHJpb3JpdHl9LCBza2lwcGluZyByZW1haW5pbmcgZW50cmllc2ApO1xuICAgICAgICAgICAgICAgICAgICBidWRnZXRFeGhhdXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjaHVua3MpIHtcbiAgICAgICAgICAgICAgICBzeW5jUGF5bG9hZFtjLmtleV0gPSBjLnZhbHVlO1xuICAgICAgICAgICAgICAgIGFsbFN5bmNLZXlzLnB1c2goYy5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXNlZEJ5dGVzICs9IGVudHJ5U2l6ZTtcbiAgICAgICAgICAgIHVzZWRJdGVtcyArPSBjaHVua3MubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHN5bmMgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgbWV0YSA9IHtcbiAgICAgICAgICAgIGxhc3RXcml0dGVuQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBrZXlzOiBhbGxTeW5jS2V5cyxcbiAgICAgICAgfTtcbiAgICAgICAgc3luY1BheWxvYWRbU1lOQ19NRVRBX0tFWV0gPSBKU09OLnN0cmluZ2lmeShtZXRhKTtcblxuICAgICAgICAvLyBXcml0ZSB0byBzeW5jIHN0b3JhZ2VcbiAgICAgICAgYXdhaXQgYXBpLnN0b3JhZ2Uuc3luYy5zZXQoc3luY1BheWxvYWQpO1xuXG4gICAgICAgIC8vIENsZWFuIG9ycGhhbmVkIGNodW5rczogcmVhZCBleGlzdGluZyBzeW5jIGtleXMgYW5kIHJlbW92ZSBhbnkgbm90IGluIG91ciBwYXlsb2FkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGFwaS5zdG9yYWdlLnN5bmMuZ2V0KG51bGwpO1xuICAgICAgICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IE9iamVjdC5rZXlzKGV4aXN0aW5nKS5maWx0ZXIoayA9PlxuICAgICAgICAgICAgICAgIGsgIT09IFNZTkNfTUVUQV9LRVkgJiYgIWFsbFN5bmNLZXlzLmluY2x1ZGVzKGspXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG9ycGhhbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5zdG9yYWdlLnN5bmMucmVtb3ZlKG9ycGhhbktleXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIE5vbi1jcml0aWNhbCBjbGVhbnVwXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgW1N5bmNNYW5hZ2VyXSBQdXNoZWQgJHthbGxTeW5jS2V5cy5sZW5ndGh9IGVudHJpZXMgKCR7dXNlZEJ5dGVzfSBieXRlcykgdG8gc3luYyBzdG9yYWdlYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU3luY01hbmFnZXJdIHB1c2hUb1N5bmMgZXJyb3I6JywgZSk7XG4gICAgICAgIC8vIExvY2FsIHN0b3JhZ2UgaXMgdW5hZmZlY3RlZCBcdTIwMTQgZ3JhY2VmdWwgZGVncmFkYXRpb25cbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVsbCBmcm9tIHN5bmNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlYWQgYWxsIGRhdGEgZnJvbSBzeW5jIHN0b3JhZ2UgYW5kIHJldHVybiBhcyBhIHBsYWluIG9iamVjdCB3aXRoXG4gKiByZWFzc2VtYmxlZCBjaHVua2VkIHZhbHVlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVsbEZyb21TeW5jKCkge1xuICAgIGlmICghYXBpLnN0b3JhZ2Uuc3luYykgcmV0dXJuIG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBhcGkuc3RvcmFnZS5zeW5jLmdldChudWxsKTtcbiAgICAgICAgaWYgKCFyYXcgfHwgT2JqZWN0LmtleXMocmF3KS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG1ldGFTdHIgPSByYXdbU1lOQ19NRVRBX0tFWV07XG4gICAgICAgIGlmICghbWV0YVN0cikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG1ldGE7XG4gICAgICAgIHRyeSB7IG1ldGEgPSBKU09OLnBhcnNlKG1ldGFTdHIpOyB9IGNhdGNoIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgLy8gQ29sbGVjdCB0aGUgbm9uLWNodW5rLCBub24tbWV0YSBrZXlzXG4gICAgICAgIGNvbnN0IGRhdGFLZXlzID0gbWV0YS5rZXlzLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoQ0hVTktfUFJFRklYKSAmJiBrICE9PSBTWU5DX01FVEFfS0VZKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBkYXRhS2V5cykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWFzc2VtYmxlRnJvbVN5bmNEYXRhKGtleSwgcmF3KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5fc3luY01ldGEgPSBtZXRhO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1N5bmNNYW5hZ2VyXSBwdWxsRnJvbVN5bmMgZXJyb3I6JywgZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNZXJnZSBsb2dpY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogTWVyZ2Ugc3luYyBkYXRhIGludG8gbG9jYWwgc3RvcmFnZSB3aXRoIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1lcmdlSW50b0xvY2FsKHN5bmNEYXRhKSB7XG4gICAgaWYgKCFzeW5jRGF0YSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbG9jYWwgPSBhd2FpdCBzdG9yYWdlLmdldChudWxsKTtcbiAgICBjb25zdCB7IHVwZGF0ZXMsIGNoYW5nZWQgfSA9IGNvbXB1dGVNZXJnZVVwZGF0ZXMobG9jYWwsIHN5bmNEYXRhKTtcblxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHVwZGF0ZXMpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1N5bmNNYW5hZ2VyXSBNZXJnZWQgc3luYyBkYXRhIGludG8gbG9jYWw6JywgT2JqZWN0LmtleXModXBkYXRlcykpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQdXJlIG1lcmdlOiBnaXZlbiB0aGUgY3VycmVudCBsb2NhbCBzdGF0ZSBhbmQgYW4gaW5jb21pbmcgc3luYyBwYXlsb2FkLFxuICogY29tcHV0ZSB0aGUgc3RvcmFnZSB1cGRhdGVzIHRvIGFwcGx5LiBObyBJL08gXHUyMDE0IGV4cG9ydGVkIHNvIHRoZSBtZXJnZSBydWxlc1xuICogKGZyZXNoLWluc3RhbGwgZGV0ZWN0aW9uLCBwdWJrZXkta2V5ZWQgcHJvZmlsZSBtYXRjaGluZywgZW5jcnlwdGlvbi1zdGF0ZVxuICogZXhjbHVzaW9uKSBjYW4gYmUgcmVncmVzc2lvbi10ZXN0ZWQgZGlyZWN0bHkuXG4gKlxuICogQHJldHVybnMge3sgdXBkYXRlczogT2JqZWN0LCBjaGFuZ2VkOiBib29sZWFuIH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlTWVyZ2VVcGRhdGVzKGxvY2FsLCBzeW5jRGF0YSkge1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmICghc3luY0RhdGEpIHJldHVybiB7IHVwZGF0ZXMsIGNoYW5nZWQgfTtcblxuICAgIC8vIERldGVjdCBmcmVzaCBpbnN0YWxsOiBubyBwcm9maWxlcywgb3Igb25seSBwcm9maWxlKHMpIHRoYXQgY2Fycnkgbm9cbiAgICAvLyBpZGVudGl0eSBhdCBhbGwgKG5vIHByaXZhdGUga2V5LCBubyBjYWNoZWQgcHVia2V5LCBub3QgYSBidW5rZXIvcmVtb3RlXG4gICAgLy8gc2lnbmVyKS4gQSBidW5rZXIgcHJvZmlsZSBsZWdpdGltYXRlbHkgaGFzIHByaXZLZXk6JycgYnV0IElTIGEgcmVhbFxuICAgIC8vIGlkZW50aXR5IFx1MjAxNCBpdCBtdXN0IG5vdCBiZSB0cmVhdGVkIGFzIGEgYmxhbmsgaW5zdGFsbCBhbmQgd2lwZWQuXG4gICAgY29uc3QgaGFzSWRlbnRpdHkgPSAocCkgPT5cbiAgICAgICAgISEocC5wcml2S2V5IHx8IHAucHViS2V5IHx8IHAudHlwZSA9PT0gJ2J1bmtlcicgfHwgcC5idW5rZXJVcmwgfHwgcC5yZW1vdGVQdWJrZXkpO1xuICAgIGNvbnN0IGlzRnJlc2ggPSAhbG9jYWwucHJvZmlsZXMgfHxcbiAgICAgICAgbG9jYWwucHJvZmlsZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICFsb2NhbC5wcm9maWxlcy5zb21lKGhhc0lkZW50aXR5KTtcblxuICAgIC8vIC0tLSBQcm9maWxlcyAoUDEpIC0tLVxuICAgIGlmIChzeW5jRGF0YS5wcm9maWxlcykge1xuICAgICAgICBpZiAoaXNGcmVzaCkge1xuICAgICAgICAgICAgLy8gRnJlc2ggaW5zdGFsbCBcdTIwMTQgYWRvcHQgc3luYyBwcm9maWxlcyBlbnRpcmVseVxuICAgICAgICAgICAgdXBkYXRlcy5wcm9maWxlcyA9IHN5bmNEYXRhLnByb2ZpbGVzO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWwucHJvZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIE1hdGNoIHByb2ZpbGVzIGJ5IHB1YmtleSAoc3RhYmxlIGlkZW50aXR5KSwgTk9UIGFycmF5IGluZGV4IFx1MjAxNFxuICAgICAgICAgICAgLy8gcmVvcmRlcmluZyBvciBpbnNlcnRpbmcgYSBwcm9maWxlIG9uIG9uZSBkZXZpY2UgbXVzdCBuZXZlciBjYXVzZVxuICAgICAgICAgICAgLy8gb25lIGlkZW50aXR5J3Mga2V5IG1hdGVyaWFsIHRvIG92ZXJ3cml0ZSBhbiB1bnJlbGF0ZWQgcHJvZmlsZS5cbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IFsuLi5sb2NhbC5wcm9maWxlc107XG4gICAgICAgICAgICBjb25zdCBpbmRleEJ5UHVia2V5ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgbWVyZ2VkLmZvckVhY2goKHAsIGkpID0+IHsgaWYgKHAucHViS2V5KSBpbmRleEJ5UHVia2V5LnNldChwLnB1YktleSwgaSk7IH0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bmNQcm9maWxlIG9mIHN5bmNEYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxJZHggPSBzeW5jUHJvZmlsZS5wdWJLZXkgIT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICA/IGluZGV4QnlQdWJrZXkuZ2V0KHN5bmNQcm9maWxlLnB1YktleSlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobG9jYWxJZHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBsb2NhbCBwcm9maWxlIHdpdGggdGhpcyBwdWJrZXkgXHUyMDE0IGl0J3MgYSBuZXcgb25lIGZyb20gc3luYy5cbiAgICAgICAgICAgICAgICAgICAgLy8gKFByb2ZpbGVzIHdpdGhvdXQgYSBwdWJrZXkgY2FuJ3QgYmUgc2FmZWx5IG1hdGNoZWQsIHNvIHdlIGFkZFxuICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiByaXNrIGNsb2JiZXJpbmcgYW4gdW5yZWxhdGVkIGxvY2FsIHByb2ZpbGUuKVxuICAgICAgICAgICAgICAgICAgICBtZXJnZWQucHVzaChzeW5jUHJvZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW5jUHJvZmlsZS5wdWJLZXkpIGluZGV4QnlQdWJrZXkuc2V0KHN5bmNQcm9maWxlLnB1YktleSwgbWVyZ2VkLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFByb2ZpbGUgPSBtZXJnZWRbbG9jYWxJZHhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzeW5jVGltZSA9IHN5bmNQcm9maWxlLnVwZGF0ZWRBdCB8fCAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFRpbWUgPSBsb2NhbFByb2ZpbGUudXBkYXRlZEF0IHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW5jVGltZSA+IGxvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3luYyBpcyBuZXdlciBcdTIwMTQgbWVyZ2UgYnV0IHByZXNlcnZlIGxvY2FsIGhvc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRbbG9jYWxJZHhdID0geyAuLi5zeW5jUHJvZmlsZSwgaG9zdHM6IGxvY2FsUHJvZmlsZS5ob3N0cyB8fCB7fSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkgdXBkYXRlcy5wcm9maWxlcyA9IG1lcmdlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBQcm9maWxlIGluZGV4IChQMSkgLS0tXG4gICAgaWYgKHN5bmNEYXRhLnByb2ZpbGVJbmRleCAhPSBudWxsICYmIGlzRnJlc2gpIHtcbiAgICAgICAgdXBkYXRlcy5wcm9maWxlSW5kZXggPSBzeW5jRGF0YS5wcm9maWxlSW5kZXg7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIC0tLSBFbmNyeXB0aW9uIHN0YXRlIChQMSkgLS0tXG4gICAgLy8gSW50ZW50aW9uYWxseSBOT1QgbWVyZ2VkIGZyb20gc3luYy4gU2VlIGJ1aWxkU3luY1BheWxvYWQoKTogdGhlIHBhc3N3b3JkXG4gICAgLy8gdmVyaWZpZXIgaXMgbmV2ZXIgc3luY2VkLCBzbyB0cnVzdGluZyBhIHN5bmNlZCBpc0VuY3J5cHRlZD10cnVlIHdvdWxkIGxvY2tcbiAgICAvLyB0aGUgdXNlciBvdXQgcGVybWFuZW50bHkuIEVuY3J5cHRpb24gc3RhdGUgc3RheXMgZGV2aWNlLWxvY2FsLlxuXG4gICAgLy8gLS0tIFNldHRpbmdzIChQMikgXHUyMDE0IGxhc3Qtd3JpdGUtd2lucyAtLS1cbiAgICBjb25zdCBzeW5jTWV0YSA9IHN5bmNEYXRhLl9zeW5jTWV0YSB8fCB7fTtcbiAgICBjb25zdCBzZXR0aW5nc0tleXMgPSBbJ2F1dG9Mb2NrTWludXRlcycsICd2ZXJzaW9uJywgJ3Byb3RvY29sX2hhbmRsZXInLCBMT0NBTF9FTkFCTEVEX0tFWV07XG4gICAgZm9yIChjb25zdCBrZXkgb2Ygc2V0dGluZ3NLZXlzKSB7XG4gICAgICAgIGlmIChzeW5jRGF0YVtrZXldICE9IG51bGwgJiYgc3luY0RhdGFba2V5XSAhPT0gbG9jYWxba2V5XSkge1xuICAgICAgICAgICAgLy8gRm9yIHZlcnNpb24sIG9ubHkgYWNjZXB0IGhpZ2hlclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3ZlcnNpb24nICYmIGxvY2FsLnZlcnNpb24gJiYgc3luY0RhdGEudmVyc2lvbiA8PSBsb2NhbC52ZXJzaW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgIHVwZGF0ZXNba2V5XSA9IHN5bmNEYXRhW2tleV07XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGZWF0dXJlIGZsYWdzXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3luY0RhdGEpKSB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnZmVhdHVyZTonKSAmJiBzeW5jRGF0YVtrZXldICE9PSBsb2NhbFtrZXldKSB7XG4gICAgICAgICAgICB1cGRhdGVzW2tleV0gPSBzeW5jRGF0YVtrZXldO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gQVBJIEtleSBWYXVsdCAoUDMpIC0tLVxuICAgIGlmIChzeW5jRGF0YS5hcGlLZXlWYXVsdCkge1xuICAgICAgICBpZiAoIWxvY2FsLmFwaUtleVZhdWx0IHx8IGlzRnJlc2gpIHtcbiAgICAgICAgICAgIHVwZGF0ZXMuYXBpS2V5VmF1bHQgPSBzeW5jRGF0YS5hcGlLZXlWYXVsdDtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTWVyZ2UgaW5kaXZpZHVhbCBrZXlzIGJ5IHVwZGF0ZWRBdFxuICAgICAgICAgICAgY29uc3QgbG9jYWxLZXlzID0gbG9jYWwuYXBpS2V5VmF1bHQua2V5cyB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHN5bmNLZXlzID0gc3luY0RhdGEuYXBpS2V5VmF1bHQua2V5cyB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4ubG9jYWxLZXlzIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgc3luY0tleV0gb2YgT2JqZWN0LmVudHJpZXMoc3luY0tleXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxLZXkgPSBtZXJnZWRbaWRdO1xuICAgICAgICAgICAgICAgIGlmICghbG9jYWxLZXkgfHwgKHN5bmNLZXkudXBkYXRlZEF0IHx8IDApID4gKGxvY2FsS2V5LnVwZGF0ZWRBdCB8fCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBtZXJnZWRbaWRdID0gc3luY0tleTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVzLmFwaUtleVZhdWx0ID0geyAuLi5sb2NhbC5hcGlLZXlWYXVsdCwga2V5czogbWVyZ2VkIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gVmF1bHQgZG9jcyAoUDQpIC0tLVxuICAgIGNvbnN0IGxvY2FsRG9jcyA9IGxvY2FsLnZhdWx0RG9jcyB8fCB7fTtcbiAgICBsZXQgZG9jc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBtZXJnZWREb2NzID0geyAuLi5sb2NhbERvY3MgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzeW5jRGF0YSkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgndmF1bHREb2M6JykpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBkb2MgPSBzeW5jRGF0YVtrZXldO1xuICAgICAgICBpZiAoIWRvYyB8fCAhZG9jLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsb2NhbERvYyA9IG1lcmdlZERvY3NbZG9jLnBhdGhdO1xuICAgICAgICBpZiAoIWxvY2FsRG9jIHx8IChkb2MudXBkYXRlZEF0IHx8IDApID4gKGxvY2FsRG9jLnVwZGF0ZWRBdCB8fCAwKSkge1xuICAgICAgICAgICAgbWVyZ2VkRG9jc1tkb2MucGF0aF0gPSBkb2M7XG4gICAgICAgICAgICBkb2NzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRvY3NDaGFuZ2VkKSB7XG4gICAgICAgIHVwZGF0ZXMudmF1bHREb2NzID0gbWVyZ2VkRG9jcztcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdXBkYXRlcywgY2hhbmdlZCB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlYm91bmNlZCBwdXNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIHN5bmMgcHVzaCB3aXRoIGEgMi1zZWNvbmQgZGVib3VuY2UuXG4gKiBFeHBvcnRlZCBmb3IgdXNlIGJ5IHN0b3JlcyBhbmQgdGhlIHN0b3JhZ2UgaW50ZXJjZXB0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZVN5bmNQdXNoKCkge1xuICAgIGlmICghYXBpLnN0b3JhZ2Uuc3luYykgcmV0dXJuO1xuICAgIGlmIChwdXNoVGltZXIpIGNsZWFyVGltZW91dChwdXNoVGltZXIpO1xuICAgIHB1c2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBwdXNoVGltZXIgPSBudWxsO1xuICAgICAgICBwdXNoVG9TeW5jKCk7XG4gICAgfSwgMjAwMCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5hYmxlIC8gZGlzYWJsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1N5bmNFbmFibGVkKCkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzdG9yYWdlLmdldCh7IFtMT0NBTF9FTkFCTEVEX0tFWV06IHRydWUgfSk7XG4gICAgcmV0dXJuIGRhdGFbTE9DQUxfRU5BQkxFRF9LRVldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0U3luY0VuYWJsZWQoZW5hYmxlZCkge1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgW0xPQ0FMX0VOQUJMRURfS0VZXTogZW5hYmxlZCB9KTtcbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICBzY2hlZHVsZVN5bmNQdXNoKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEluaXRpYWxpc2F0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYWxsZWQgb25jZSBvbiBzdGFydHVwIChmcm9tIGJhY2tncm91bmQuanMpLlxuICogUHVsbHMgZnJvbSBzeW5jLCBtZXJnZXMsIHRoZW4gbGlzdGVucyBmb3IgcmVtb3RlIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0U3luYygpIHtcbiAgICBpZiAoIWFwaS5zdG9yYWdlLnN5bmMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTeW5jTWFuYWdlcl0gc3RvcmFnZS5zeW5jIG5vdCBhdmFpbGFibGUgXHUyMDE0IHNraXBwaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgaXNTeW5jRW5hYmxlZCgpO1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1N5bmNNYW5hZ2VyXSBQbGF0Zm9ybSBzeW5jIGRpc2FibGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQdWxsICsgbWVyZ2VcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzeW5jRGF0YSA9IGF3YWl0IHB1bGxGcm9tU3luYygpO1xuICAgICAgICBpZiAoc3luY0RhdGEpIHtcbiAgICAgICAgICAgIGF3YWl0IG1lcmdlSW50b0xvY2FsKHN5bmNEYXRhKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbU3luY01hbmFnZXJdIEluaXRpYWwgcHVsbCttZXJnZSBjb21wbGV0ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTeW5jTWFuYWdlcl0gTm8gc3luYyBkYXRhIGZvdW5kIFx1MjAxNCBmcmVzaCBzeW5jJyk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTeW5jTWFuYWdlcl0gSW5pdGlhbCBwdWxsIGZhaWxlZDonLCBlKTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHJlbW90ZSBjaGFuZ2VzXG4gICAgaWYgKGFwaS5zdG9yYWdlLm9uQ2hhbmdlZCkge1xuICAgICAgICBhcGkuc3RvcmFnZS5vbkNoYW5nZWQuYWRkTGlzdGVuZXIoKGNoYW5nZXMsIGFyZWFOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXJlYU5hbWUgIT09ICdzeW5jJykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTeW5jTWFuYWdlcl0gUmVtb3RlIHN5bmMgY2hhbmdlIGRldGVjdGVkJyk7XG4gICAgICAgICAgICAvLyBSZS1wdWxsIGFuZCBtZXJnZSB0aGUgZnVsbCBzeW5jIGRhdGEgdG8gaGFuZGxlIGNodW5rZWQgdmFsdWVzIGNvcnJlY3RseVxuICAgICAgICAgICAgcHVsbEZyb21TeW5jKCkudGhlbihzeW5jRGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN5bmNEYXRhKSBtZXJnZUludG9Mb2NhbChzeW5jRGF0YSk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbU3luY01hbmFnZXJdIFJlbW90ZSBtZXJnZSBlcnJvcjonLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEbyBhbiBpbml0aWFsIHB1c2ggc28gbG9jYWwgZGF0YSBpcyBtaXJyb3JlZFxuICAgIHNjaGVkdWxlU3luY1B1c2goKTtcbn1cbiIsICIvKipcbiAqIEFQSSBLZXkgU3RvcmUgXHUyMDE0IExvY2FsIGNhY2hlIGZvciBlbmNyeXB0ZWQgQVBJIGtleXNcbiAqXG4gKiBTdG9yYWdlIHNjaGVtYSBpbiBicm93c2VyLnN0b3JhZ2UubG9jYWw6XG4gKiAgIGFwaUtleVZhdWx0OiB7XG4gKiAgICAga2V5czoge1xuICogICAgICAgXCI8dXVpZD5cIjogeyBpZCwgbGFiZWwsIHNlY3JldCwgY3JlYXRlZEF0LCB1cGRhdGVkQXQsIHByb2ZpbGVTY29wZSB9XG4gKiAgICAgfSxcbiAqICAgICBzeW5jRW5hYmxlZDogdHJ1ZSxcbiAqICAgICBldmVudElkOiBudWxsLFxuICogICAgIHJlbGF5Q3JlYXRlZEF0OiBudWxsLFxuICogICAgIHN5bmNTdGF0dXM6IFwic3luY2VkXCIgICAgLy8gc3luY2VkIHwgbG9jYWwtb25seSB8IGNvbmZsaWN0XG4gKiAgIH1cbiAqXG4gKiBwcm9maWxlU2NvcGU6IG51bGwgKGFsbCBwcm9maWxlcykgfCBudW1iZXJbXSAoc3BlY2lmaWMgcHJvZmlsZSBpbmRpY2VzKVxuICovXG5cbmltcG9ydCB7IGFwaSB9IGZyb20gJy4vYnJvd3Nlci1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBzY2hlZHVsZVN5bmNQdXNoIH0gZnJvbSAnLi9zeW5jLW1hbmFnZXInO1xuXG5jb25zdCBzdG9yYWdlID0gYXBpLnN0b3JhZ2UubG9jYWw7XG5jb25zdCBTVE9SQUdFX0tFWSA9ICdhcGlLZXlWYXVsdCc7XG5cbmNvbnN0IERFRkFVTFRfU1RPUkUgPSB7XG4gICAga2V5czoge30sXG4gICAgc3luY0VuYWJsZWQ6IHRydWUsXG4gICAgZXZlbnRJZDogbnVsbCxcbiAgICByZWxheUNyZWF0ZWRBdDogbnVsbCxcbiAgICBzeW5jU3RhdHVzOiAnc3luY2VkJyxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFN0b3JlKCkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzdG9yYWdlLmdldCh7IFtTVE9SQUdFX0tFWV06IERFRkFVTFRfU1RPUkUgfSk7XG4gICAgcmV0dXJuIHsgLi4uREVGQVVMVF9TVE9SRSwgLi4uZGF0YVtTVE9SQUdFX0tFWV0gfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0U3RvcmUoc3RvcmUpIHtcbiAgICBhd2FpdCBzdG9yYWdlLnNldCh7IFtTVE9SQUdFX0tFWV06IHN0b3JlIH0pO1xuICAgIHNjaGVkdWxlU3luY1B1c2goKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgQVBJIGtleSBzdG9yZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcGlLZXlTdG9yZSgpIHtcbiAgICByZXR1cm4gZ2V0U3RvcmUoKTtcbn1cblxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgQVBJIGtleSBieSBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0fG51bGw+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXBpS2V5KGlkKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBhd2FpdCBnZXRTdG9yZSgpO1xuICAgIHJldHVybiBzdG9yZS5rZXlzW2lkXSB8fCBudWxsO1xufVxuXG4vKipcbiAqIFVwc2VydCBhbiBBUEkga2V5LiBDcmVhdGVzIGlmIG5ldywgdXBkYXRlcyBpZiBleGlzdGluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFVVSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZUFwaUtleShpZCwgbGFiZWwsIHNlY3JldCkge1xuICAgIGNvbnN0IHN0b3JlID0gYXdhaXQgZ2V0U3RvcmUoKTtcbiAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHN0b3JlLmtleXNbaWRdO1xuICAgIHN0b3JlLmtleXNbaWRdID0ge1xuICAgICAgICBpZCxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHNlY3JldCxcbiAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZz8uY3JlYXRlZEF0IHx8IG5vdyxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgIHByb2ZpbGVTY29wZTogZXhpc3Rpbmc/LnByb2ZpbGVTY29wZSA/PyBudWxsLFxuICAgIH07XG4gICAgYXdhaXQgc2V0U3RvcmUoc3RvcmUpO1xuICAgIHJldHVybiBzdG9yZS5rZXlzW2lkXTtcbn1cblxuLyoqXG4gKiBEZWxldGUgYW4gQVBJIGtleSBieSBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFwaUtleShpZCkge1xuICAgIGNvbnN0IHN0b3JlID0gYXdhaXQgZ2V0U3RvcmUoKTtcbiAgICBkZWxldGUgc3RvcmUua2V5c1tpZF07XG4gICAgYXdhaXQgc2V0U3RvcmUoc3RvcmUpO1xufVxuXG4vKipcbiAqIExpc3QgYWxsIEFQSSBrZXlzIHNvcnRlZCBieSBsYWJlbCAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheT59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QXBpS2V5cygpIHtcbiAgICBjb25zdCBzdG9yZSA9IGF3YWl0IGdldFN0b3JlKCk7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoc3RvcmUua2V5cykuc29ydCgoYSwgYikgPT5cbiAgICAgICAgYS5sYWJlbC50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5sYWJlbC50b0xvd2VyQ2FzZSgpKSxcbiAgICApO1xufVxuXG4vKipcbiAqIFNldCB0aGUgcmVsYXkgc3luYyB0b2dnbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRTeW5jRW5hYmxlZChlbmFibGVkKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBhd2FpdCBnZXRTdG9yZSgpO1xuICAgIHN0b3JlLnN5bmNFbmFibGVkID0gZW5hYmxlZDtcbiAgICBhd2FpdCBzZXRTdG9yZShzdG9yZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgcmVsYXkgc3luYyBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNTeW5jRW5hYmxlZCgpIHtcbiAgICBjb25zdCBzdG9yZSA9IGF3YWl0IGdldFN0b3JlKCk7XG4gICAgcmV0dXJuIHN0b3JlLnN5bmNFbmFibGVkO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBzeW5jIHN0YXRlIGFmdGVyIGEgcmVsYXkgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlU3RvcmVTeW5jU3RhdGUoc3luY1N0YXR1cywgZXZlbnRJZCA9IG51bGwsIHJlbGF5Q3JlYXRlZEF0ID0gbnVsbCkge1xuICAgIGNvbnN0IHN0b3JlID0gYXdhaXQgZ2V0U3RvcmUoKTtcbiAgICBzdG9yZS5zeW5jU3RhdHVzID0gc3luY1N0YXR1cztcbiAgICBpZiAoZXZlbnRJZCAhPT0gbnVsbCkgc3RvcmUuZXZlbnRJZCA9IGV2ZW50SWQ7XG4gICAgaWYgKHJlbGF5Q3JlYXRlZEF0ICE9PSBudWxsKSBzdG9yZS5yZWxheUNyZWF0ZWRBdCA9IHJlbGF5Q3JlYXRlZEF0O1xuICAgIGF3YWl0IHNldFN0b3JlKHN0b3JlKTtcbn1cblxuLyoqXG4gKiBFeHBvcnQgdGhlIGtleXMgb2JqZWN0IChmb3IgZW5jcnlwdGVkIGJhY2t1cCkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBNYXAgb2YgaWQgLT4ga2V5IGRhdGFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydFN0b3JlKCkge1xuICAgIGNvbnN0IHN0b3JlID0gYXdhaXQgZ2V0U3RvcmUoKTtcbiAgICByZXR1cm4gc3RvcmUua2V5cztcbn1cblxuLyoqXG4gKiBJbXBvcnQga2V5cyBpbnRvIHRoZSBzdG9yZSAobWVyZ2UgXHUyMDE0IGV4aXN0aW5nIGtleXMgd2l0aCBzYW1lIGlkIGFyZSBvdmVyd3JpdHRlbikuXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5cyAtIE1hcCBvZiBpZCAtPiB7IGlkLCBsYWJlbCwgc2VjcmV0LCBjcmVhdGVkQXQsIHVwZGF0ZWRBdCB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTdG9yZShrZXlzKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBhd2FpdCBnZXRTdG9yZSgpO1xuICAgIGZvciAoY29uc3QgW2lkLCBrZXldIG9mIE9iamVjdC5lbnRyaWVzKGtleXMpKSB7XG4gICAgICAgIHN0b3JlLmtleXNbaWRdID0ga2V5O1xuICAgIH1cbiAgICBhd2FpdCBzZXRTdG9yZShzdG9yZSk7XG59XG4iLCAiaW1wb3J0IHsgYXBpIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2Jyb3dzZXItcG9seWZpbGwnO1xuaW1wb3J0IHtcbiAgICBnZXRBcGlLZXlTdG9yZSxcbiAgICBzYXZlQXBpS2V5LFxuICAgIGRlbGV0ZUFwaUtleSxcbiAgICBsaXN0QXBpS2V5cyxcbiAgICBzZXRTeW5jRW5hYmxlZCxcbiAgICBpc1N5bmNFbmFibGVkLFxuICAgIHVwZGF0ZVN0b3JlU3luY1N0YXRlLFxuICAgIGV4cG9ydFN0b3JlLFxuICAgIGltcG9ydFN0b3JlLFxufSBmcm9tICcuLi91dGlsaXRpZXMvYXBpLWtleS1zdG9yZSc7XG5cbmNvbnN0IHN0YXRlID0ge1xuICAgIGtleXM6IFtdLFxuICAgIG5ld0xhYmVsOiAnJyxcbiAgICBuZXdTZWNyZXQ6ICcnLFxuICAgIGVkaXRpbmdJZDogbnVsbCxcbiAgICBlZGl0TGFiZWw6ICcnLFxuICAgIGVkaXRTZWNyZXQ6ICcnLFxuICAgIGNvcGllZElkOiBudWxsLFxuICAgIHJldmVhbGVkSWQ6IG51bGwsXG4gICAgc3luY0VuYWJsZWQ6IHRydWUsXG4gICAgZ2xvYmFsU3luY1N0YXR1czogJ2lkbGUnLFxuICAgIHN5bmNFcnJvcjogJycsXG4gICAgc2F2aW5nOiBmYWxzZSxcbiAgICB0b2FzdDogJycsXG4gICAgcmVsYXlJbmZvOiB7IHJlYWQ6IFtdLCB3cml0ZTogW10gfSxcbn07XG5cbmZ1bmN0aW9uICQoaWQpIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfVxuXG5mdW5jdGlvbiBoYXNSZWxheXMoKSB7XG4gICAgcmV0dXJuIHN0YXRlLnJlbGF5SW5mby5yZWFkLmxlbmd0aCA+IDAgfHwgc3RhdGUucmVsYXlJbmZvLndyaXRlLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIHNvcnRlZEtleXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5rZXlzXS5zb3J0KChhLCBiKSA9PlxuICAgICAgICBhLmxhYmVsLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLmxhYmVsLnRvTG93ZXJDYXNlKCkpLFxuICAgICk7XG59XG5cbmZ1bmN0aW9uIG1hc2tTZWNyZXQoc2VjcmV0KSB7XG4gICAgaWYgKCFzZWNyZXQpIHJldHVybiAnJztcbiAgICBpZiAoc2VjcmV0Lmxlbmd0aCA8PSA4KSByZXR1cm4gJ1xcdTIwMjInLnJlcGVhdChzZWNyZXQubGVuZ3RoKTtcbiAgICByZXR1cm4gc2VjcmV0LnNsaWNlKDAsIDQpICsgJ1xcdTIwMjInLnJlcGVhdCg0KSArIHNlY3JldC5zbGljZSgtNCk7XG59XG5cbmZ1bmN0aW9uIHNob3dUb2FzdChtc2cpIHtcbiAgICBzdGF0ZS50b2FzdCA9IG1zZztcbiAgICByZW5kZXIoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgc3RhdGUudG9hc3QgPSAnJzsgcmVuZGVyKCk7IH0sIDIwMDApO1xufVxuXG5mdW5jdGlvbiBzeW5jU3RhdHVzQ2xhc3Moc3RhdHVzKSB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2lkbGUnKSByZXR1cm4gJ2JnLWdyZWVuLTUwMCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ3N5bmNpbmcnKSByZXR1cm4gJ2JnLXllbGxvdy01MDAgYW5pbWF0ZS1wdWxzZSc7XG4gICAgcmV0dXJuICdiZy1yZWQtNTAwJztcbn1cblxuZnVuY3Rpb24gc3luY1N0YXR1c1RleHQoKSB7XG4gICAgaWYgKHN0YXRlLmdsb2JhbFN5bmNTdGF0dXMgPT09ICdzeW5jaW5nJykgcmV0dXJuICdTeW5jaW5nLi4uJztcbiAgICBpZiAoc3RhdGUuZ2xvYmFsU3luY1N0YXR1cyA9PT0gJ2Vycm9yJykgcmV0dXJuIHN0YXRlLnN5bmNFcnJvcjtcbiAgICByZXR1cm4gc3RhdGUuc3luY0VuYWJsZWQgPyAnU3luY2VkJyA6ICdMb2NhbCBvbmx5Jztcbn1cblxuLy8gLS0tIFJlbmRlciAtLS1cblxuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIC8vIFN5bmMgYmFyXG4gICAgY29uc3Qgc3luY0RvdCA9ICQoJ3N5bmMtZG90Jyk7XG4gICAgY29uc3Qgc3luY1RleHQgPSAkKCdzeW5jLXRleHQnKTtcbiAgICBjb25zdCBzeW5jQnRuID0gJCgnc3luYy1idG4nKTtcbiAgICBjb25zdCBzeW5jVG9nZ2xlID0gJCgnc3luYy10b2dnbGUnKTtcbiAgICBjb25zdCBrZXlDb3VudCA9ICQoJ2tleS1jb3VudCcpO1xuXG4gICAgaWYgKHN5bmNEb3QpIHN5bmNEb3QuY2xhc3NOYW1lID0gYGlubGluZS1ibG9jayB3LTMgaC0zIHJvdW5kZWQtZnVsbCAke3N5bmNTdGF0dXNDbGFzcyhzdGF0ZS5nbG9iYWxTeW5jU3RhdHVzKX1gO1xuICAgIGlmIChzeW5jVGV4dCkgc3luY1RleHQudGV4dENvbnRlbnQgPSBzeW5jU3RhdHVzVGV4dCgpO1xuICAgIGlmIChzeW5jQnRuKSBzeW5jQnRuLmRpc2FibGVkID0gc3RhdGUuZ2xvYmFsU3luY1N0YXR1cyA9PT0gJ3N5bmNpbmcnIHx8ICFoYXNSZWxheXMoKSB8fCAhc3RhdGUuc3luY0VuYWJsZWQ7XG4gICAgaWYgKHN5bmNUb2dnbGUpIHN5bmNUb2dnbGUuY2hlY2tlZCA9IHN0YXRlLnN5bmNFbmFibGVkO1xuICAgIGlmIChrZXlDb3VudCkga2V5Q291bnQudGV4dENvbnRlbnQgPSBzdGF0ZS5rZXlzLmxlbmd0aCArICcga2V5JyArIChzdGF0ZS5rZXlzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnKTtcblxuICAgIC8vIEtleSB0YWJsZVxuICAgIGNvbnN0IGtleVRhYmxlQ29udGFpbmVyID0gJCgna2V5LXRhYmxlLWNvbnRhaW5lcicpO1xuICAgIGNvbnN0IG5vS2V5c01zZyA9ICQoJ25vLWtleXMnKTtcbiAgICBjb25zdCBrZXlUYWJsZUJvZHkgPSAkKCdrZXktdGFibGUtYm9keScpO1xuXG4gICAgaWYgKGtleVRhYmxlQ29udGFpbmVyKSBrZXlUYWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gc3RhdGUua2V5cy5sZW5ndGggPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBpZiAobm9LZXlzTXNnKSBub0tleXNNc2cuc3R5bGUuZGlzcGxheSA9IHN0YXRlLmtleXMubGVuZ3RoID09PSAwID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgIGlmIChrZXlUYWJsZUJvZHkpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkID0gc29ydGVkS2V5cygpO1xuICAgICAgICBrZXlUYWJsZUJvZHkuaW5uZXJIVE1MID0gc29ydGVkLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmVkaXRpbmdJZCA9PT0ga2V5LmlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiYm9yZGVyLWIgYm9yZGVyLW1vbm9rYWktYmctbGlnaHRlciBob3ZlcjpiZy1tb25va2FpLWJnLWxpZ2h0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgdGV4dC1zbSB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWVkaXQtbGFiZWw9XCIke2tleS5pZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlQXR0cihzdGF0ZS5lZGl0TGFiZWwpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTIgZm9udC1tb25vIHRleHQteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0IHRleHQteHMgZm9udC1tb25vIHctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtZWRpdC1zZWNyZXQ9XCIke2tleS5pZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7ZXNjYXBlQXR0cihzdGF0ZS5lZGl0U2VjcmV0KX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicC0yIHRleHQtcmlnaHQgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIHRleHQteHNcIiBkYXRhLWFjdGlvbj1cInNhdmUtZWRpdFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIHRleHQteHNcIiBkYXRhLWFjdGlvbj1cImNhbmNlbC1lZGl0XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5U2VjcmV0ID0gc3RhdGUucmV2ZWFsZWRJZCA9PT0ga2V5LmlkID8gZXNjYXBlSHRtbChrZXkuc2VjcmV0KSA6IGVzY2FwZUh0bWwobWFza1NlY3JldChrZXkuc2VjcmV0KSk7XG4gICAgICAgICAgICBjb25zdCBjb3B5TGFiZWwgPSBzdGF0ZS5jb3BpZWRJZCA9PT0ga2V5LmlkID8gJ0NvcGllZCEnIDogJ0NvcHknO1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJib3JkZXItYiBib3JkZXItbW9ub2thaS1iZy1saWdodGVyIGhvdmVyOmJnLW1vbm9rYWktYmctbGlnaHRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgaG92ZXI6dW5kZXJsaW5lXCIgZGF0YS1hY3Rpb249XCJzdGFydC1lZGl0XCIgZGF0YS1rZXktaWQ9XCIke2tleS5pZH1cIj4ke2VzY2FwZUh0bWwoa2V5LmxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInAtMiBmb250LW1vbm8gdGV4dC14c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIGRhdGEtYWN0aW9uPVwidG9nZ2xlLXJldmVhbFwiIGRhdGEta2V5LWlkPVwiJHtrZXkuaWR9XCI+JHtkaXNwbGF5U2VjcmV0fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicC0yIHRleHQtcmlnaHQgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gdGV4dC14c1wiIGRhdGEtYWN0aW9uPVwiY29weS1zZWNyZXRcIiBkYXRhLWtleS1pZD1cIiR7a2V5LmlkfVwiPiR7Y29weUxhYmVsfTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiB0ZXh0LXhzXCIgZGF0YS1hY3Rpb249XCJkZWxldGUta2V5XCIgZGF0YS1rZXktaWQ9XCIke2tleS5pZH1cIj5EZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgYDtcbiAgICAgICAgfSkuam9pbignJyk7XG5cbiAgICAgICAgLy8gQmluZCB0YWJsZSBldmVudHNcbiAgICAgICAga2V5VGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFjdGlvbj1cInN0YXJ0LWVkaXRcIl0nKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3RhcnRFZGl0KGVsLmRhdGFzZXQua2V5SWQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGtleVRhYmxlQm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hY3Rpb249XCJ0b2dnbGUtcmV2ZWFsXCJdJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5yZXZlYWxlZElkID0gc3RhdGUucmV2ZWFsZWRJZCA9PT0gZWwuZGF0YXNldC5rZXlJZCA/IG51bGwgOiBlbC5kYXRhc2V0LmtleUlkO1xuICAgICAgICAgICAgICAgIHJlbmRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBrZXlUYWJsZUJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYWN0aW9uPVwiY29weS1zZWNyZXRcIl0nKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29weVNlY3JldChlbC5kYXRhc2V0LmtleUlkKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBrZXlUYWJsZUJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYWN0aW9uPVwiZGVsZXRlLWtleVwiXScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBkZWxldGVLZXkoZWwuZGF0YXNldC5rZXlJZCkpO1xuICAgICAgICB9KTtcbiAgICAgICAga2V5VGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFjdGlvbj1cInNhdmUtZWRpdFwiXScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlRWRpdCk7XG4gICAgICAgIH0pO1xuICAgICAgICBrZXlUYWJsZUJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYWN0aW9uPVwiY2FuY2VsLWVkaXRcIl0nKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FuY2VsRWRpdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEJpbmQgZWRpdCBpbnB1dCBldmVudHNcbiAgICAgICAga2V5VGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWVkaXQtbGFiZWxdJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7IHN0YXRlLmVkaXRMYWJlbCA9IGUudGFyZ2V0LnZhbHVlOyB9KTtcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHNhdmVFZGl0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2FuY2VsRWRpdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBrZXlUYWJsZUJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZWRpdC1zZWNyZXRdJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7IHN0YXRlLmVkaXRTZWNyZXQgPSBlLnRhcmdldC52YWx1ZTsgfSk7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBzYXZlRWRpdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNhbmNlbEVkaXQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQga2V5IGZvcm1cbiAgICBjb25zdCBuZXdMYWJlbElucHV0ID0gJCgnbmV3LWxhYmVsJyk7XG4gICAgY29uc3QgbmV3U2VjcmV0SW5wdXQgPSAkKCduZXctc2VjcmV0Jyk7XG4gICAgY29uc3QgYWRkS2V5QnRuID0gJCgnYWRkLWtleS1idG4nKTtcblxuICAgIGlmIChuZXdMYWJlbElucHV0ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IG5ld0xhYmVsSW5wdXQpIG5ld0xhYmVsSW5wdXQudmFsdWUgPSBzdGF0ZS5uZXdMYWJlbDtcbiAgICBpZiAobmV3U2VjcmV0SW5wdXQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gbmV3U2VjcmV0SW5wdXQpIG5ld1NlY3JldElucHV0LnZhbHVlID0gc3RhdGUubmV3U2VjcmV0O1xuICAgIGlmIChhZGRLZXlCdG4pIHtcbiAgICAgICAgYWRkS2V5QnRuLmRpc2FibGVkID0gc3RhdGUuc2F2aW5nIHx8IHN0YXRlLm5ld0xhYmVsLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgc3RhdGUubmV3U2VjcmV0LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgIGFkZEtleUJ0bi50ZXh0Q29udGVudCA9IHN0YXRlLnNhdmluZyA/ICdTYXZpbmcuLi4nIDogJ1NhdmUnO1xuICAgIH1cblxuICAgIC8vIFRvYXN0XG4gICAgY29uc3QgdG9hc3QgPSAkKCd0b2FzdCcpO1xuICAgIGlmICh0b2FzdCkge1xuICAgICAgICB0b2FzdC50ZXh0Q29udGVudCA9IHN0YXRlLnRvYXN0O1xuICAgICAgICB0b2FzdC5zdHlsZS5kaXNwbGF5ID0gc3RhdGUudG9hc3QgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlSHRtbChzdHIpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUF0dHIoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xufVxuXG4vLyAtLS0gQ1JVRCAtLS1cblxuYXN5bmMgZnVuY3Rpb24gYWRkS2V5KCkge1xuICAgIGNvbnN0IGxhYmVsID0gc3RhdGUubmV3TGFiZWwudHJpbSgpO1xuICAgIGNvbnN0IHNlY3JldCA9IHN0YXRlLm5ld1NlY3JldC50cmltKCk7XG4gICAgaWYgKCFsYWJlbCB8fCAhc2VjcmV0KSByZXR1cm47XG5cbiAgICBzdGF0ZS5zYXZpbmcgPSB0cnVlO1xuICAgIHJlbmRlcigpO1xuXG4gICAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIGF3YWl0IHNhdmVBcGlLZXkoaWQsIGxhYmVsLCBzZWNyZXQpO1xuICAgIHN0YXRlLmtleXMgPSBhd2FpdCBsaXN0QXBpS2V5cygpO1xuICAgIHN0YXRlLm5ld0xhYmVsID0gJyc7XG4gICAgc3RhdGUubmV3U2VjcmV0ID0gJyc7XG5cbiAgICBpZiAoc3RhdGUuc3luY0VuYWJsZWQgJiYgaGFzUmVsYXlzKCkpIHtcbiAgICAgICAgYXdhaXQgcHVibGlzaFRvUmVsYXkoKTtcbiAgICB9XG5cbiAgICBzdGF0ZS5zYXZpbmcgPSBmYWxzZTtcbiAgICBzaG93VG9hc3QoJ0tleSBhZGRlZCcpO1xufVxuXG5mdW5jdGlvbiBzdGFydEVkaXQoaWQpIHtcbiAgICBjb25zdCBrZXkgPSBzdGF0ZS5rZXlzLmZpbmQoayA9PiBrLmlkID09PSBpZCk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBzdGF0ZS5lZGl0aW5nSWQgPSBrZXkuaWQ7XG4gICAgc3RhdGUuZWRpdExhYmVsID0ga2V5LmxhYmVsO1xuICAgIHN0YXRlLmVkaXRTZWNyZXQgPSBrZXkuc2VjcmV0O1xuICAgIHJlbmRlcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlRWRpdCgpIHtcbiAgICBpZiAoIXN0YXRlLmVkaXRpbmdJZCkgcmV0dXJuO1xuICAgIGNvbnN0IGxhYmVsID0gc3RhdGUuZWRpdExhYmVsLnRyaW0oKTtcbiAgICBjb25zdCBzZWNyZXQgPSBzdGF0ZS5lZGl0U2VjcmV0LnRyaW0oKTtcbiAgICBpZiAoIWxhYmVsIHx8ICFzZWNyZXQpIHJldHVybjtcblxuICAgIGF3YWl0IHNhdmVBcGlLZXkoc3RhdGUuZWRpdGluZ0lkLCBsYWJlbCwgc2VjcmV0KTtcbiAgICBzdGF0ZS5rZXlzID0gYXdhaXQgbGlzdEFwaUtleXMoKTtcbiAgICBzdGF0ZS5lZGl0aW5nSWQgPSBudWxsO1xuICAgIHN0YXRlLmVkaXRMYWJlbCA9ICcnO1xuICAgIHN0YXRlLmVkaXRTZWNyZXQgPSAnJztcblxuICAgIGlmIChzdGF0ZS5zeW5jRW5hYmxlZCAmJiBoYXNSZWxheXMoKSkge1xuICAgICAgICBhd2FpdCBwdWJsaXNoVG9SZWxheSgpO1xuICAgIH1cblxuICAgIHNob3dUb2FzdCgnS2V5IHVwZGF0ZWQnKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsRWRpdCgpIHtcbiAgICBzdGF0ZS5lZGl0aW5nSWQgPSBudWxsO1xuICAgIHN0YXRlLmVkaXRMYWJlbCA9ICcnO1xuICAgIHN0YXRlLmVkaXRTZWNyZXQgPSAnJztcbiAgICByZW5kZXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlS2V5KGlkKSB7XG4gICAgY29uc3Qga2V5ID0gc3RhdGUua2V5cy5maW5kKGsgPT4gay5pZCA9PT0gaWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgaWYgKCFjb25maXJtKGBEZWxldGUgXCIke2tleS5sYWJlbH1cIj9gKSkgcmV0dXJuO1xuXG4gICAgYXdhaXQgZGVsZXRlQXBpS2V5KGlkKTtcbiAgICBzdGF0ZS5rZXlzID0gYXdhaXQgbGlzdEFwaUtleXMoKTtcblxuICAgIGlmIChzdGF0ZS5zeW5jRW5hYmxlZCAmJiBoYXNSZWxheXMoKSkge1xuICAgICAgICBhd2FpdCBwdWJsaXNoVG9SZWxheSgpO1xuICAgIH1cblxuICAgIHNob3dUb2FzdCgnS2V5IGRlbGV0ZWQnKTtcbn1cblxuLy8gLS0tIENsaXBib2FyZCAtLS1cblxuYXN5bmMgZnVuY3Rpb24gY29weVNlY3JldChpZCkge1xuICAgIGNvbnN0IGtleSA9IHN0YXRlLmtleXMuZmluZChrID0+IGsuaWQgPT09IGlkKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGtleS5zZWNyZXQpO1xuICAgIHN0YXRlLmNvcGllZElkID0gaWQ7XG4gICAgcmVuZGVyKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHN0YXRlLmNvcGllZElkID0gbnVsbDsgcmVuZGVyKCk7IH0sIDIwMDApO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCgnJykuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0sIDMwMDAwKTtcbn1cblxuLy8gLS0tIFN5bmMgLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hUb1JlbGF5KCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gYXdhaXQgZ2V0QXBpS2V5U3RvcmUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgICAga2luZDogJ2FwaWtleXMucHVibGlzaCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7IGtleXM6IHN0b3JlLmtleXMgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgYXdhaXQgdXBkYXRlU3RvcmVTeW5jU3RhdGUoJ3N5bmNlZCcsIHJlc3VsdC5ldmVudElkLCByZXN1bHQuY3JlYXRlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlU3RvcmVTeW5jU3RhdGUoJ2xvY2FsLW9ubHknKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNBbGwoKSB7XG4gICAgc3RhdGUuZ2xvYmFsU3luY1N0YXR1cyA9ICdzeW5jaW5nJztcbiAgICBzdGF0ZS5zeW5jRXJyb3IgPSAnJztcbiAgICByZW5kZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaS5ydW50aW1lLnNlbmRNZXNzYWdlKHsga2luZDogJ2FwaWtleXMuZmV0Y2gnIH0pO1xuXG4gICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHN0YXRlLmdsb2JhbFN5bmNTdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICAgICAgc3RhdGUuc3luY0Vycm9yID0gcmVzdWx0LmVycm9yIHx8ICdTeW5jIGZhaWxlZCc7XG4gICAgICAgICAgICByZW5kZXIoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQua2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBhd2FpdCBnZXRBcGlLZXlTdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgbG9jYWxLZXlzID0gc3RvcmUua2V5cztcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsQ291bnQgPSBPYmplY3Qua2V5cyhsb2NhbEtleXMpLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKGxvY2FsQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbXBvcnRTdG9yZShyZXN1bHQua2V5cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdG9yZS5yZWxheUNyZWF0ZWRBdCB8fCByZXN1bHQuY3JlYXRlZEF0ID4gc3RvcmUucmVsYXlDcmVhdGVkQXQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbXBvcnRTdG9yZShyZXN1bHQua2V5cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVN0b3JlU3luY1N0YXRlKCdzeW5jZWQnLCByZXN1bHQuZXZlbnRJZCwgcmVzdWx0LmNyZWF0ZWRBdCk7XG4gICAgICAgICAgICBzdGF0ZS5rZXlzID0gYXdhaXQgbGlzdEFwaUtleXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmdsb2JhbFN5bmNTdGF0dXMgPSAnaWRsZSc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdGF0ZS5nbG9iYWxTeW5jU3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgc3RhdGUuc3luY0Vycm9yID0gZS5tZXNzYWdlIHx8ICdTeW5jIGZhaWxlZCc7XG4gICAgfVxuXG4gICAgcmVuZGVyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVN5bmMoKSB7XG4gICAgYXdhaXQgc2V0U3luY0VuYWJsZWQoc3RhdGUuc3luY0VuYWJsZWQpO1xuICAgIGlmIChzdGF0ZS5zeW5jRW5hYmxlZCAmJiBoYXNSZWxheXMoKSkge1xuICAgICAgICBhd2FpdCBzeW5jQWxsKCk7XG4gICAgfVxufVxuXG4vLyAtLS0gSW1wb3J0IC8gRXhwb3J0IC0tLVxuXG5hc3luYyBmdW5jdGlvbiBleHBvcnRLZXlzKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBleHBvcnRTdG9yZSgpO1xuICAgIGNvbnN0IHBsYWluVGV4dCA9IEpTT04uc3RyaW5naWZ5KGtleXMsIG51bGwsIDIpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBraW5kOiAnYXBpa2V5cy5lbmNyeXB0JyxcbiAgICAgICAgcGF5bG9hZDogeyBwbGFpblRleHQgfSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd1RvYXN0KCdFeHBvcnQgZmFpbGVkOiAnICsgKHJlc3VsdC5lcnJvciB8fCAndW5rbm93bicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihcbiAgICAgICAgW0pTT04uc3RyaW5naWZ5KHsgZW5jcnlwdGVkOiB0cnVlLCBkYXRhOiByZXN1bHQuY2lwaGVyVGV4dCB9KV0sXG4gICAgICAgIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgKTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSAnbm9zdHJrZXktYXBpLWtleXMtYmFja3VwLmpzb24nO1xuICAgIGEuY2xpY2soKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgc2hvd1RvYXN0KCdFeHBvcnRlZCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbXBvcnRLZXlzKGV2ZW50KSB7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlcz8uWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuXG4gICAgICAgIGxldCBrZXlzO1xuICAgICAgICBpZiAocGFyc2VkLmVuY3J5cHRlZCAmJiBwYXJzZWQuZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdhcGlrZXlzLmRlY3J5cHQnLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgY2lwaGVyVGV4dDogcGFyc2VkLmRhdGEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnRGVjcnlwdCBmYWlsZWQ6ICcgKyAocmVzdWx0LmVycm9yIHx8ICd1bmtub3duJykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleXMgPSBKU09OLnBhcnNlKHJlc3VsdC5wbGFpblRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5cyA9IHBhcnNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGltcG9ydFN0b3JlKGtleXMpO1xuICAgICAgICBzdGF0ZS5rZXlzID0gYXdhaXQgbGlzdEFwaUtleXMoKTtcblxuICAgICAgICBpZiAoc3RhdGUuc3luY0VuYWJsZWQgJiYgaGFzUmVsYXlzKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHB1Ymxpc2hUb1JlbGF5KCk7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93VG9hc3QoJ0ltcG9ydGVkICcgKyBPYmplY3Qua2V5cyhrZXlzKS5sZW5ndGggKyAnIGtleXMnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dUb2FzdCgnSW1wb3J0IGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG59XG5cbi8vIC0tLSBFdmVudCBiaW5kaW5nIC0tLVxuXG5mdW5jdGlvbiBiaW5kRXZlbnRzKCkge1xuICAgICQoJ3N5bmMtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3luY0FsbCk7XG4gICAgJCgnYWRkLWtleS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRLZXkpO1xuICAgICQoJ2V4cG9ydC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleHBvcnRLZXlzKTtcbiAgICAkKCdpbXBvcnQtZmlsZScpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBpbXBvcnRLZXlzKTtcbiAgICAkKCdjbG9zZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3cuY2xvc2UoKSk7XG5cbiAgICAkKCdzeW5jLXRvZ2dsZScpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBzdGF0ZS5zeW5jRW5hYmxlZCA9IGUudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgIHRvZ2dsZVN5bmMoKTtcbiAgICB9KTtcblxuICAgICQoJ25ldy1sYWJlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICAgIHN0YXRlLm5ld0xhYmVsID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgIHJlbmRlcigpO1xuICAgIH0pO1xuXG4gICAgJCgnbmV3LXNlY3JldCcpPy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICAgIHN0YXRlLm5ld1NlY3JldCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICByZW5kZXIoKTtcbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAvLyBHYXRlOiByZXF1aXJlIG1hc3RlciBwYXNzd29yZCBiZWZvcmUgYWxsb3dpbmcgYWNjZXNzXG4gICAgY29uc3QgaXNFbmNyeXB0ZWQgPSBhd2FpdCBhcGkucnVudGltZS5zZW5kTWVzc2FnZSh7IGtpbmQ6ICdpc0VuY3J5cHRlZCcgfSk7XG4gICAgY29uc3QgZ2F0ZSA9ICQoJ3ZhdWx0LWxvY2tlZC1nYXRlJyk7XG4gICAgY29uc3QgbWFpbiA9ICQoJ3ZhdWx0LW1haW4tY29udGVudCcpO1xuXG4gICAgaWYgKCFpc0VuY3J5cHRlZCkge1xuICAgICAgICBpZiAoZ2F0ZSkgZ2F0ZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgaWYgKG1haW4pIG1haW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgJCgnZ2F0ZS1zZWN1cml0eS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBhcGkucnVudGltZS5nZXRVUkwoJ3NlY3VyaXR5L3NlY3VyaXR5Lmh0bWwnKTtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ25vc3Rya2V5LW9wdGlvbnMnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZ2F0ZSkgZ2F0ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChtYWluKSBtYWluLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgY29uc3QgcmVsYXlzID0gYXdhaXQgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBraW5kOiAndmF1bHQuZ2V0UmVsYXlzJyB9KTtcbiAgICBzdGF0ZS5yZWxheUluZm8gPSByZWxheXMgfHwgeyByZWFkOiBbXSwgd3JpdGU6IFtdIH07XG4gICAgc3RhdGUuc3luY0VuYWJsZWQgPSBhd2FpdCBpc1N5bmNFbmFibGVkKCk7XG4gICAgc3RhdGUua2V5cyA9IGF3YWl0IGxpc3RBcGlLZXlzKCk7XG5cbiAgICBiaW5kRXZlbnRzKCk7XG4gICAgcmVuZGVyKCk7XG5cbiAgICBpZiAoc3RhdGUuc3luY0VuYWJsZWQgJiYgaGFzUmVsYXlzKCkpIHtcbiAgICAgICAgYXdhaXQgc3luY0FsbCgpO1xuICAgIH1cbn1cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpO1xu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 diff --git a/distros/safari/background.build.js b/distros/safari/background.build.js index aff78a2..34d995b 100644 --- a/distros/safari/background.build.js +++ b/distros/safari/background.build.js @@ -1,5 +1,7172 @@ -(()=>{var Qa=Object.create;var kn=Object.defineProperty;var ec=Object.getOwnPropertyDescriptor;var tc=Object.getOwnPropertyNames;var rc=Object.getPrototypeOf,nc=Object.prototype.hasOwnProperty;var oc=(t,e)=>()=>(t&&(e=t(t=0)),e);var bt=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),An=(t,e)=>{for(var r in e)kn(t,r,{get:e[r],enumerable:!0})},ic=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of tc(e))!nc.call(t,o)&&o!==r&&kn(t,o,{get:()=>e[o],enumerable:!(n=ec(e,o))||n.enumerable});return t};var er=(t,e,r)=>(r=t!=null?Qa(rc(t)):{},ic(e||!t||!t.__esModule?kn(r,"default",{value:t,enumerable:!0}):r,t));var R,b=oc(()=>{R={env:{NODE_ENV:"production",LOG_LEVEL:"warn"},browser:!0,version:"",stdout:null,stderr:null,nextTick:function(t){var e=Array.prototype.slice.call(arguments,1);Promise.resolve().then(function(){t.apply(null,e)})}}});var es=bt((kd,Qi)=>{"use strict";b();function _c(t){try{return JSON.stringify(t)}catch{return'"[Circular]"'}}Qi.exports=Lc;function Lc(t,e,r){var n=r&&r.stringify||_c,o=1;if(typeof t=="object"&&t!==null){var i=e.length+o;if(i===1)return t;var s=new Array(i);s[0]=n(t);for(var a=1;a-1?u:0,t.charCodeAt(d+1)){case 100:case 102:if(f>=c||e[f]==null)break;u=c||e[f]==null)break;u=c||e[f]===void 0)break;u",u=d+2,d++;break}l+=n(e[f]),u=d+2,d++;break;case 115:if(f>=c)break;u{"use strict";b();var ts=es();Mr.exports=rt;var cr=jc().console||{},Uc={mapHttpRequest:Dr,mapHttpResponse:Dr,wrapRequestSerializer:Jn,wrapResponseSerializer:Jn,wrapErrorSerializer:Jn,req:Dr,res:Dr,err:ns,errWithCause:ns};function ht(t,e){return t==="silent"?1/0:e.levels.values[t]}var eo=Symbol("pino.logFuncs"),Xn=Symbol("pino.hierarchy"),Pc={error:"log",fatal:"error",warn:"error",info:"log",debug:"log",trace:"log"};function rs(t,e){let r={logger:e,parent:t[Xn]};e[Xn]=r}function Rc(t,e,r){let n={};e.forEach(o=>{n[o]=r[o]?r[o]:cr[o]||cr[Pc[o]||"log"]||Vt}),t[eo]=n}function Cc(t,e){return Array.isArray(t)?t.filter(function(n){return n!=="!stdSerializers.err"}):t===!0?Object.keys(e):!1}function rt(t){t=t||{},t.browser=t.browser||{};let e=t.browser.transmit;if(e&&typeof e.send!="function")throw Error("pino: transmit option must have a send function");let r=t.browser.write||cr;t.browser.write&&(t.browser.asObject=!0);let n=t.serializers||{},o=Cc(t.browser.serialize,n),i=t.browser.serialize;Array.isArray(t.browser.serialize)&&t.browser.serialize.indexOf("!stdSerializers.err")>-1&&(i=!1);let s=Object.keys(t.customLevels||{}),a=["error","fatal","warn","info","debug","trace"].concat(s);typeof r=="function"&&a.forEach(function(p){r[p]=r}),(t.enabled===!1||t.browser.disabled)&&(t.level="silent");let c=t.level||"info",l=Object.create(r);l.log||(l.log=Vt),Rc(l,a,r),rs({},l),Object.defineProperty(l,"levelVal",{get:u}),Object.defineProperty(l,"level",{get:h,set:d});let f={transmit:e,serialize:o,asObject:t.browser.asObject,asObjectBindingsOnly:t.browser.asObjectBindingsOnly,formatters:t.browser.formatters,reportCaller:t.browser.reportCaller,levels:a,timestamp:Fc(t),messageKey:t.messageKey||"msg",onChild:t.onChild||Vt};l.levels=Oc(t),l.level=c,l.isLevelEnabled=function(p){return this.levels.values[p]?this.levels.values[p]>=this.levels.values[this.level]:!1},l.setMaxListeners=l.getMaxListeners=l.emit=l.addListener=l.on=l.prependListener=l.once=l.prependOnceListener=l.removeListener=l.removeAllListeners=l.listeners=l.listenerCount=l.eventNames=l.write=l.flush=Vt,l.serializers=n,l._serialize=o,l._stdErrSerialize=i,l.child=function(...p){return y.call(this,f,...p)},e&&(l._logEvent=Qn());function u(){return ht(this.level,this)}function h(){return this._level}function d(p){if(p!=="silent"&&!this.levels.values[p])throw Error("unknown level "+p);this._level=p,At(this,f,l,"error"),At(this,f,l,"fatal"),At(this,f,l,"warn"),At(this,f,l,"info"),At(this,f,l,"debug"),At(this,f,l,"trace"),s.forEach(w=>{At(this,f,l,w)})}function y(p,w,k){if(!w)throw new Error("missing bindings for child Pino");k=k||{},o&&w.serializers&&(k.serializers=w.serializers);let O=k.serializers;if(o&&O){var D=Object.assign({},n,O),H=t.browser.serialize===!0?Object.keys(D):o;delete w.serializers,to([w],H,D,this._stdErrSerialize)}function X(q){this._childLevel=(q._childLevel|0)+1,this.bindings=w,D&&(this.serializers=D,this._serialize=H),e&&(this._logEvent=Qn([].concat(q._logEvent.bindings,w)))}X.prototype=this;let M=new X(this);return rs(this,M),M.child=function(...q){return y.call(this,p,...q)},M.level=k.level||this.level,p.onChild(M),M}return l}function Oc(t){let e=t.customLevels||{},r=Object.assign({},rt.levels.values,e),n=Object.assign({},rt.levels.labels,Nc(e));return{values:r,labels:n}}function Nc(t){let e={};return Object.keys(t).forEach(function(r){e[t[r]]=r}),e}rt.levels={values:{fatal:60,error:50,warn:40,info:30,debug:20,trace:10},labels:{10:"trace",20:"debug",30:"info",40:"warn",50:"error",60:"fatal"}};rt.stdSerializers=Uc;rt.stdTimeFunctions=Object.assign({},{nullTime:is,epochTime:ss,unixTime:$c,isoTime:qc});function Dc(t){let e=[];t.bindings&&e.push(t.bindings);let r=t[Xn];for(;r.parent;)r=r.parent,r.logger.bindings&&e.push(r.logger.bindings);return e.reverse()}function At(t,e,r,n){if(Object.defineProperty(t,n,{value:ht(t.level,r)>ht(n,r)?Vt:r[eo][n],writable:!0,enumerable:!0,configurable:!0}),t[n]===Vt){if(!e.transmit)return;let i=e.transmit.level||t.level,s=ht(i,r);if(ht(n,r)0&&u[0]&&typeof u[0]=="object")try{let h=os();h&&(u[0].caller=h)}catch{}o.call(c,...u)}else{if(e.reportCaller)try{let u=os();u&&a.push(u)}catch{}o.apply(c,a)}if(e.transmit){let u=e.transmit.level||t._level,h=ht(u,r),d=ht(n,r);if(du}=o.formatters||{},a=r.slice(),c=a[0],l={},f=(t._childLevel|0)+1;if(f<1&&(f=1),n&&(l.time=n),i){let u=i(e,t.levels.values[e]);Object.assign(l,u)}else l.level=t.levels.values[e];if(o.asObjectBindingsOnly){if(c!==null&&typeof c=="object")for(;f--&&typeof a[0]=="object";)Object.assign(l,a.shift());return[s(l),...a]}else{if(c!==null&&typeof c=="object"){for(;f--&&typeof a[0]=="object";)Object.assign(l,a.shift());c=a.length?ts(a.shift(),a):void 0}else typeof c=="string"&&(c=ts(a.shift(),a));return c!==void 0&&(l[o.messageKey]=c),[s(l)]}}function to(t,e,r,n){for(let o in t)if(n&&t[o]instanceof Error)t[o]=rt.stdSerializers.err(t[o]);else if(typeof t[o]=="object"&&!Array.isArray(t[o])&&e)for(let i in t[o])e.indexOf(i)>-1&&i in r&&(t[o][i]=r[i](t[o][i]))}function Vc(t,e,r,n=!1){let o=e.send,i=e.ts,s=e.methodLevel,a=e.methodValue,c=e.val,l=t._logEvent.bindings;n||to(r,t._serialize||Object.keys(t.serializers),t.serializers,t._stdErrSerialize===void 0?!0:t._stdErrSerialize),t._logEvent.ts=i,t._logEvent.messages=r.filter(function(f){return l.indexOf(f)===-1}),t._logEvent.level.label=s,t._logEvent.level.value=a,o(s,t._logEvent,c),t._logEvent=Qn(l)}function Qn(t){return{ts:0,messages:[],bindings:t||[],level:{label:"",value:0}}}function ns(t){let e={type:t.constructor.name,msg:t.message,stack:t.stack};for(let r in t)e[r]===void 0&&(e[r]=t[r]);return e}function Fc(t){return typeof t.timestamp=="function"?t.timestamp:t.timestamp===!1?is:ss}function Dr(){return{}}function Jn(t){return t}function Vt(){}function is(){return!1}function ss(){return Date.now()}function $c(){return Math.round(Date.now()/1e3)}function qc(){return new Date(Date.now()).toISOString()}function jc(){function t(e){return typeof e<"u"&&e}try{return typeof globalThis<"u"||Object.defineProperty(Object.prototype,"globalThis",{get:function(){return delete Object.prototype.globalThis,this.globalThis=this},configurable:!0}),globalThis}catch{return t(self)||t(window)||t(this)||{}}}Mr.exports.default=rt;Mr.exports.pino=rt;function os(){let t=new Error().stack;if(!t)return null;let e=t.split(` -`);for(let r=1;r{b();us.exports={}});var bs=bt($t=>{"use strict";b();Object.defineProperty($t,"__esModule",{value:!0});$t.bech32m=$t.bech32=void 0;var Vr="qpzry9x8gf2tvdw0s3jn54khce6mua7l",ms={};for(let t=0;t>25;return(t&33554431)<<5^-(e>>0&1)&996825010^-(e>>1&1)&642813549^-(e>>2&1)&513874426^-(e>>3&1)&1027748829^-(e>>4&1)&705979059}function gs(t){let e=1;for(let r=0;r126)return"Invalid prefix ("+t+")";e=Ft(e)^n>>5}e=Ft(e);for(let r=0;r=r;)i-=r,a.push(o>>i&s);if(n)i>0&&a.push(o<=e)return"Excess padding";if(o<c)throw new TypeError("Exceeds length limit");s=s.toLowerCase();let l=gs(s);if(typeof l=="string")throw new Error(l);let f=s+"1";for(let u=0;u>5!==0)throw new Error("Non 5-bit word");l=Ft(l)^h,f+=Vr.charAt(h)}for(let u=0;u<6;++u)l=Ft(l);l^=e;for(let u=0;u<6;++u){let h=l>>(5-u)*5&31;f+=Vr.charAt(h)}return f}function n(s,a){if(a=a||90,s.length<8)return s+" too short";if(s.length>a)return"Exceeds length limit";let c=s.toLowerCase(),l=s.toUpperCase();if(s!==c&&s!==l)return"Mixed-case string "+s;s=c;let f=s.lastIndexOf("1");if(f===-1)return"No separator character for "+s;if(f===0)return"Missing prefix for "+s;let u=s.slice(0,f),h=s.slice(f+1);if(h.length<6)return"Data too short";let d=gs(u);if(typeof d=="string")return d;let y=[];for(let p=0;p=h.length)&&y.push(k)}return d!==e?"Invalid checksum for "+s:{prefix:u,words:y}}function o(s,a){let c=n(s,a);if(typeof c=="object")return c}function i(s,a){let c=n(s,a);if(typeof c=="object")return c;throw new Error(c)}return{decodeUnsafe:o,decode:i,encode:r,toWords:tl,fromWordsUnsafe:rl,fromWords:nl}}$t.bech32=ws("bech32");$t.bech32m=ws("bech32m")});var vs=bt(Fr=>{"use strict";b();Fr.byteLength=il;Fr.toByteArray=al;Fr.fromByteArray=ul;var ze=[],Ce=[],ol=typeof Uint8Array<"u"?Uint8Array:Array,ao="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(Bt=0,xs=ao.length;Bt0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");r===-1&&(r=e);var n=r===e?0:4-r%4;return[r,n]}function il(t){var e=Es(t),r=e[0],n=e[1];return(r+n)*3/4-n}function sl(t,e,r){return(e+r)*3/4-r}function al(t){var e,r=Es(t),n=r[0],o=r[1],i=new ol(sl(t,n,o)),s=0,a=o>0?n-4:n,c;for(c=0;c>16&255,i[s++]=e>>8&255,i[s++]=e&255;return o===2&&(e=Ce[t.charCodeAt(c)]<<2|Ce[t.charCodeAt(c+1)]>>4,i[s++]=e&255),o===1&&(e=Ce[t.charCodeAt(c)]<<10|Ce[t.charCodeAt(c+1)]<<4|Ce[t.charCodeAt(c+2)]>>2,i[s++]=e>>8&255,i[s++]=e&255),i}function cl(t){return ze[t>>18&63]+ze[t>>12&63]+ze[t>>6&63]+ze[t&63]}function ll(t,e,r){for(var n,o=[],i=e;ia?a:s+i));return n===1?(e=t[r-1],o.push(ze[e>>2]+ze[e<<4&63]+"==")):n===2&&(e=(t[r-2]<<8)+t[r-1],o.push(ze[e>>10]+ze[e>>4&63]+ze[e<<2&63]+"=")),o.join("")}});var ks=bt(co=>{b();co.read=function(t,e,r,n,o){var i,s,a=o*8-n-1,c=(1<>1,f=-7,u=r?o-1:0,h=r?-1:1,d=t[e+u];for(u+=h,i=d&(1<<-f)-1,d>>=-f,f+=a;f>0;i=i*256+t[e+u],u+=h,f-=8);for(s=i&(1<<-f)-1,i>>=-f,f+=n;f>0;s=s*256+t[e+u],u+=h,f-=8);if(i===0)i=1-l;else{if(i===c)return s?NaN:(d?-1:1)*(1/0);s=s+Math.pow(2,n),i=i-l}return(d?-1:1)*s*Math.pow(2,i-n)};co.write=function(t,e,r,n,o,i){var s,a,c,l=i*8-o-1,f=(1<>1,h=o===23?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:i-1,y=n?1:-1,p=e<0||e===0&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=f):(s=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-s))<1&&(s--,c*=2),s+u>=1?e+=h/c:e+=h*Math.pow(2,1-u),e*c>=2&&(s++,c/=2),s+u>=f?(a=0,s=f):s+u>=1?(a=(e*c-1)*Math.pow(2,o),s=s+u):(a=e*Math.pow(2,u-1)*Math.pow(2,o),s=0));o>=8;t[r+d]=a&255,d+=y,a/=256,o-=8);for(s=s<0;t[r+d]=s&255,d+=y,s/=256,l-=8);t[r+d-y]|=p*128}});var Ks=bt(Wt=>{"use strict";b();var lo=vs(),jt=ks(),As=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;Wt.Buffer=g;Wt.SlowBuffer=gl;Wt.INSPECT_MAX_BYTES=50;var $r=2147483647;Wt.kMaxLength=$r;g.TYPED_ARRAY_SUPPORT=fl();!g.TYPED_ARRAY_SUPPORT&&typeof console<"u";function fl(){try{let t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),t.foo()===42}catch{return!1}}Object.defineProperty(g.prototype,"parent",{enumerable:!0,get:function(){if(g.isBuffer(this))return this.buffer}});Object.defineProperty(g.prototype,"offset",{enumerable:!0,get:function(){if(g.isBuffer(this))return this.byteOffset}});function nt(t){if(t>$r)throw new RangeError('The value "'+t+'" is invalid for option "size"');let e=new Uint8Array(t);return Object.setPrototypeOf(e,g.prototype),e}function g(t,e,r){if(typeof t=="number"){if(typeof e=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return po(t)}return Ts(t,e,r)}g.poolSize=8192;function Ts(t,e,r){if(typeof t=="string")return hl(t,e);if(ArrayBuffer.isView(t))return pl(t);if(t==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(We(t,ArrayBuffer)||t&&We(t.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(We(t,SharedArrayBuffer)||t&&We(t.buffer,SharedArrayBuffer)))return fo(t,e,r);if(typeof t=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let n=t.valueOf&&t.valueOf();if(n!=null&&n!==t)return g.from(n,e,r);let o=yl(t);if(o)return o;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof t[Symbol.toPrimitive]=="function")return g.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}g.from=function(t,e,r){return Ts(t,e,r)};Object.setPrototypeOf(g.prototype,Uint8Array.prototype);Object.setPrototypeOf(g,Uint8Array);function _s(t){if(typeof t!="number")throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function dl(t,e,r){return _s(t),t<=0?nt(t):e!==void 0?typeof r=="string"?nt(t).fill(e,r):nt(t).fill(e):nt(t)}g.alloc=function(t,e,r){return dl(t,e,r)};function po(t){return _s(t),nt(t<0?0:yo(t)|0)}g.allocUnsafe=function(t){return po(t)};g.allocUnsafeSlow=function(t){return po(t)};function hl(t,e){if((typeof e!="string"||e==="")&&(e="utf8"),!g.isEncoding(e))throw new TypeError("Unknown encoding: "+e);let r=Ls(t,e)|0,n=nt(r),o=n.write(t,e);return o!==r&&(n=n.slice(0,o)),n}function uo(t){let e=t.length<0?0:yo(t.length)|0,r=nt(e);for(let n=0;n=$r)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+$r.toString(16)+" bytes");return t|0}function gl(t){return+t!=t&&(t=0),g.alloc(+t)}g.isBuffer=function(e){return e!=null&&e._isBuffer===!0&&e!==g.prototype};g.compare=function(e,r){if(We(e,Uint8Array)&&(e=g.from(e,e.offset,e.byteLength)),We(r,Uint8Array)&&(r=g.from(r,r.offset,r.byteLength)),!g.isBuffer(e)||!g.isBuffer(r))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(e===r)return 0;let n=e.length,o=r.length;for(let i=0,s=Math.min(n,o);io.length?(g.isBuffer(s)||(s=g.from(s)),s.copy(o,i)):Uint8Array.prototype.set.call(o,s,i);else if(g.isBuffer(s))s.copy(o,i);else throw new TypeError('"list" argument must be an Array of Buffers');i+=s.length}return o};function Ls(t,e){if(g.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||We(t,ArrayBuffer))return t.byteLength;if(typeof t!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);let r=t.length,n=arguments.length>2&&arguments[2]===!0;if(!n&&r===0)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return ho(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return r*2;case"hex":return r>>>1;case"base64":return Hs(t).length;default:if(o)return n?-1:ho(t).length;e=(""+e).toLowerCase(),o=!0}}g.byteLength=Ls;function ml(t,e,r){let n=!1;if((e===void 0||e<0)&&(e=0),e>this.length||((r===void 0||r>this.length)&&(r=this.length),r<=0)||(r>>>=0,e>>>=0,r<=e))return"";for(t||(t="utf8");;)switch(t){case"hex":return Il(this,e,r);case"utf8":case"utf-8":return Ps(this,e,r);case"ascii":return Bl(this,e,r);case"latin1":case"binary":return Sl(this,e,r);case"base64":return kl(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Tl(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}g.prototype._isBuffer=!0;function St(t,e,r){let n=t[e];t[e]=t[r],t[r]=n}g.prototype.swap16=function(){let e=this.length;if(e%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let r=0;rr&&(e+=" ... "),""};As&&(g.prototype[As]=g.prototype.inspect);g.prototype.compare=function(e,r,n,o,i){if(We(e,Uint8Array)&&(e=g.from(e,e.offset,e.byteLength)),!g.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(r===void 0&&(r=0),n===void 0&&(n=e?e.length:0),o===void 0&&(o=0),i===void 0&&(i=this.length),r<0||n>e.length||o<0||i>this.length)throw new RangeError("out of range index");if(o>=i&&r>=n)return 0;if(o>=i)return-1;if(r>=n)return 1;if(r>>>=0,n>>>=0,o>>>=0,i>>>=0,this===e)return 0;let s=i-o,a=n-r,c=Math.min(s,a),l=this.slice(o,i),f=e.slice(r,n);for(let u=0;u2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,mo(r)&&(r=o?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(o)return-1;r=t.length-1}else if(r<0)if(o)r=0;else return-1;if(typeof e=="string"&&(e=g.from(e,n)),g.isBuffer(e))return e.length===0?-1:Bs(t,e,r,n,o);if(typeof e=="number")return e=e&255,typeof Uint8Array.prototype.indexOf=="function"?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):Bs(t,[e],r,n,o);throw new TypeError("val must be string, number or Buffer")}function Bs(t,e,r,n,o){let i=1,s=t.length,a=e.length;if(n!==void 0&&(n=String(n).toLowerCase(),n==="ucs2"||n==="ucs-2"||n==="utf16le"||n==="utf-16le")){if(t.length<2||e.length<2)return-1;i=2,s/=2,a/=2,r/=2}function c(f,u){return i===1?f[u]:f.readUInt16BE(u*i)}let l;if(o){let f=-1;for(l=r;ls&&(r=s-a),l=r;l>=0;l--){let f=!0;for(let u=0;uo&&(n=o)):n=o;let i=e.length;n>i/2&&(n=i/2);let s;for(s=0;s>>0,isFinite(n)?(n=n>>>0,o===void 0&&(o="utf8")):(o=n,n=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let i=this.length-r;if((n===void 0||n>i)&&(n=i),e.length>0&&(n<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");let s=!1;for(;;)switch(o){case"hex":return wl(this,e,r,n);case"utf8":case"utf-8":return bl(this,e,r,n);case"ascii":case"latin1":case"binary":return xl(this,e,r,n);case"base64":return El(this,e,r,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return vl(this,e,r,n);default:if(s)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),s=!0}};g.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function kl(t,e,r){return e===0&&r===t.length?lo.fromByteArray(t):lo.fromByteArray(t.slice(e,r))}function Ps(t,e,r){r=Math.min(t.length,r);let n=[],o=e;for(;o239?4:i>223?3:i>191?2:1;if(o+a<=r){let c,l,f,u;switch(a){case 1:i<128&&(s=i);break;case 2:c=t[o+1],(c&192)===128&&(u=(i&31)<<6|c&63,u>127&&(s=u));break;case 3:c=t[o+1],l=t[o+2],(c&192)===128&&(l&192)===128&&(u=(i&15)<<12|(c&63)<<6|l&63,u>2047&&(u<55296||u>57343)&&(s=u));break;case 4:c=t[o+1],l=t[o+2],f=t[o+3],(c&192)===128&&(l&192)===128&&(f&192)===128&&(u=(i&15)<<18|(c&63)<<12|(l&63)<<6|f&63,u>65535&&u<1114112&&(s=u))}}s===null?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|s&1023),n.push(s),o+=a}return Al(n)}var Ss=4096;function Al(t){let e=t.length;if(e<=Ss)return String.fromCharCode.apply(String,t);let r="",n=0;for(;nn)&&(r=n);let o="";for(let i=e;in&&(e=n),r<0?(r+=n,r<0&&(r=0)):r>n&&(r=n),rr)throw new RangeError("Trying to access beyond buffer length")}g.prototype.readUintLE=g.prototype.readUIntLE=function(e,r,n){e=e>>>0,r=r>>>0,n||le(e,r,this.length);let o=this[e],i=1,s=0;for(;++s>>0,r=r>>>0,n||le(e,r,this.length);let o=this[e+--r],i=1;for(;r>0&&(i*=256);)o+=this[e+--r]*i;return o};g.prototype.readUint8=g.prototype.readUInt8=function(e,r){return e=e>>>0,r||le(e,1,this.length),this[e]};g.prototype.readUint16LE=g.prototype.readUInt16LE=function(e,r){return e=e>>>0,r||le(e,2,this.length),this[e]|this[e+1]<<8};g.prototype.readUint16BE=g.prototype.readUInt16BE=function(e,r){return e=e>>>0,r||le(e,2,this.length),this[e]<<8|this[e+1]};g.prototype.readUint32LE=g.prototype.readUInt32LE=function(e,r){return e=e>>>0,r||le(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+this[e+3]*16777216};g.prototype.readUint32BE=g.prototype.readUInt32BE=function(e,r){return e=e>>>0,r||le(e,4,this.length),this[e]*16777216+(this[e+1]<<16|this[e+2]<<8|this[e+3])};g.prototype.readBigUInt64LE=yt(function(e){e=e>>>0,zt(e,"offset");let r=this[e],n=this[e+7];(r===void 0||n===void 0)&&ur(e,this.length-8);let o=r+this[++e]*2**8+this[++e]*2**16+this[++e]*2**24,i=this[++e]+this[++e]*2**8+this[++e]*2**16+n*2**24;return BigInt(o)+(BigInt(i)<>>0,zt(e,"offset");let r=this[e],n=this[e+7];(r===void 0||n===void 0)&&ur(e,this.length-8);let o=r*2**24+this[++e]*2**16+this[++e]*2**8+this[++e],i=this[++e]*2**24+this[++e]*2**16+this[++e]*2**8+n;return(BigInt(o)<>>0,r=r>>>0,n||le(e,r,this.length);let o=this[e],i=1,s=0;for(;++s=i&&(o-=Math.pow(2,8*r)),o};g.prototype.readIntBE=function(e,r,n){e=e>>>0,r=r>>>0,n||le(e,r,this.length);let o=r,i=1,s=this[e+--o];for(;o>0&&(i*=256);)s+=this[e+--o]*i;return i*=128,s>=i&&(s-=Math.pow(2,8*r)),s};g.prototype.readInt8=function(e,r){return e=e>>>0,r||le(e,1,this.length),this[e]&128?(255-this[e]+1)*-1:this[e]};g.prototype.readInt16LE=function(e,r){e=e>>>0,r||le(e,2,this.length);let n=this[e]|this[e+1]<<8;return n&32768?n|4294901760:n};g.prototype.readInt16BE=function(e,r){e=e>>>0,r||le(e,2,this.length);let n=this[e+1]|this[e]<<8;return n&32768?n|4294901760:n};g.prototype.readInt32LE=function(e,r){return e=e>>>0,r||le(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24};g.prototype.readInt32BE=function(e,r){return e=e>>>0,r||le(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]};g.prototype.readBigInt64LE=yt(function(e){e=e>>>0,zt(e,"offset");let r=this[e],n=this[e+7];(r===void 0||n===void 0)&&ur(e,this.length-8);let o=this[e+4]+this[e+5]*2**8+this[e+6]*2**16+(n<<24);return(BigInt(o)<>>0,zt(e,"offset");let r=this[e],n=this[e+7];(r===void 0||n===void 0)&&ur(e,this.length-8);let o=(r<<24)+this[++e]*2**16+this[++e]*2**8+this[++e];return(BigInt(o)<>>0,r||le(e,4,this.length),jt.read(this,e,!0,23,4)};g.prototype.readFloatBE=function(e,r){return e=e>>>0,r||le(e,4,this.length),jt.read(this,e,!1,23,4)};g.prototype.readDoubleLE=function(e,r){return e=e>>>0,r||le(e,8,this.length),jt.read(this,e,!0,52,8)};g.prototype.readDoubleBE=function(e,r){return e=e>>>0,r||le(e,8,this.length),jt.read(this,e,!1,52,8)};function ve(t,e,r,n,o,i){if(!g.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}g.prototype.writeUintLE=g.prototype.writeUIntLE=function(e,r,n,o){if(e=+e,r=r>>>0,n=n>>>0,!o){let a=Math.pow(2,8*n)-1;ve(this,e,r,n,a,0)}let i=1,s=0;for(this[r]=e&255;++s>>0,n=n>>>0,!o){let a=Math.pow(2,8*n)-1;ve(this,e,r,n,a,0)}let i=n-1,s=1;for(this[r+i]=e&255;--i>=0&&(s*=256);)this[r+i]=e/s&255;return r+n};g.prototype.writeUint8=g.prototype.writeUInt8=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,1,255,0),this[r]=e&255,r+1};g.prototype.writeUint16LE=g.prototype.writeUInt16LE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,2,65535,0),this[r]=e&255,this[r+1]=e>>>8,r+2};g.prototype.writeUint16BE=g.prototype.writeUInt16BE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,2,65535,0),this[r]=e>>>8,this[r+1]=e&255,r+2};g.prototype.writeUint32LE=g.prototype.writeUInt32LE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,4,4294967295,0),this[r+3]=e>>>24,this[r+2]=e>>>16,this[r+1]=e>>>8,this[r]=e&255,r+4};g.prototype.writeUint32BE=g.prototype.writeUInt32BE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,4,4294967295,0),this[r]=e>>>24,this[r+1]=e>>>16,this[r+2]=e>>>8,this[r+3]=e&255,r+4};function Rs(t,e,r,n,o){Ms(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r++]=i,i=i>>8,t[r++]=i,i=i>>8,t[r++]=i,i=i>>8,t[r++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s=s>>8,t[r++]=s,s=s>>8,t[r++]=s,s=s>>8,t[r++]=s,r}function Cs(t,e,r,n,o){Ms(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r+7]=i,i=i>>8,t[r+6]=i,i=i>>8,t[r+5]=i,i=i>>8,t[r+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s=s>>8,t[r+2]=s,s=s>>8,t[r+1]=s,s=s>>8,t[r]=s,r+8}g.prototype.writeBigUInt64LE=yt(function(e,r=0){return Rs(this,e,r,BigInt(0),BigInt("0xffffffffffffffff"))});g.prototype.writeBigUInt64BE=yt(function(e,r=0){return Cs(this,e,r,BigInt(0),BigInt("0xffffffffffffffff"))});g.prototype.writeIntLE=function(e,r,n,o){if(e=+e,r=r>>>0,!o){let c=Math.pow(2,8*n-1);ve(this,e,r,n,c-1,-c)}let i=0,s=1,a=0;for(this[r]=e&255;++i>0)-a&255;return r+n};g.prototype.writeIntBE=function(e,r,n,o){if(e=+e,r=r>>>0,!o){let c=Math.pow(2,8*n-1);ve(this,e,r,n,c-1,-c)}let i=n-1,s=1,a=0;for(this[r+i]=e&255;--i>=0&&(s*=256);)e<0&&a===0&&this[r+i+1]!==0&&(a=1),this[r+i]=(e/s>>0)-a&255;return r+n};g.prototype.writeInt8=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,1,127,-128),e<0&&(e=255+e+1),this[r]=e&255,r+1};g.prototype.writeInt16LE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,2,32767,-32768),this[r]=e&255,this[r+1]=e>>>8,r+2};g.prototype.writeInt16BE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,2,32767,-32768),this[r]=e>>>8,this[r+1]=e&255,r+2};g.prototype.writeInt32LE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,4,2147483647,-2147483648),this[r]=e&255,this[r+1]=e>>>8,this[r+2]=e>>>16,this[r+3]=e>>>24,r+4};g.prototype.writeInt32BE=function(e,r,n){return e=+e,r=r>>>0,n||ve(this,e,r,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[r]=e>>>24,this[r+1]=e>>>16,this[r+2]=e>>>8,this[r+3]=e&255,r+4};g.prototype.writeBigInt64LE=yt(function(e,r=0){return Rs(this,e,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});g.prototype.writeBigInt64BE=yt(function(e,r=0){return Cs(this,e,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function Os(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function Ns(t,e,r,n,o){return e=+e,r=r>>>0,o||Os(t,e,r,4,34028234663852886e22,-34028234663852886e22),jt.write(t,e,r,n,23,4),r+4}g.prototype.writeFloatLE=function(e,r,n){return Ns(this,e,r,!0,n)};g.prototype.writeFloatBE=function(e,r,n){return Ns(this,e,r,!1,n)};function Ds(t,e,r,n,o){return e=+e,r=r>>>0,o||Os(t,e,r,8,17976931348623157e292,-17976931348623157e292),jt.write(t,e,r,n,52,8),r+8}g.prototype.writeDoubleLE=function(e,r,n){return Ds(this,e,r,!0,n)};g.prototype.writeDoubleBE=function(e,r,n){return Ds(this,e,r,!1,n)};g.prototype.copy=function(e,r,n,o){if(!g.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),!o&&o!==0&&(o=this.length),r>=e.length&&(r=e.length),r||(r=0),o>0&&o=this.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),e.length-r>>0,n=n===void 0?this.length:n>>>0,e||(e=0);let i;if(typeof e=="number")for(i=r;i2**32?o=Is(String(r)):typeof r=="bigint"&&(o=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(o=Is(o)),o+="n"),n+=` It must be ${e}. Received ${o}`,n},RangeError);function Is(t){let e="",r=t.length,n=t[0]==="-"?1:0;for(;r>=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function _l(t,e,r){zt(e,"offset"),(t[e]===void 0||t[e+r]===void 0)&&ur(e,t.length-(r+1))}function Ms(t,e,r,n,o,i){if(t>r||t3?e===0||e===BigInt(0)?a=`>= 0${s} and < 2${s} ** ${(i+1)*8}${s}`:a=`>= -(2${s} ** ${(i+1)*8-1}${s}) and < 2 ** ${(i+1)*8-1}${s}`:a=`>= ${e}${s} and <= ${r}${s}`,new qt.ERR_OUT_OF_RANGE("value",a,t)}_l(n,o,i)}function zt(t,e){if(typeof t!="number")throw new qt.ERR_INVALID_ARG_TYPE(e,"number",t)}function ur(t,e,r){throw Math.floor(t)!==t?(zt(t,r),new qt.ERR_OUT_OF_RANGE(r||"offset","an integer",t)):e<0?new qt.ERR_BUFFER_OUT_OF_BOUNDS:new qt.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${e}`,t)}var Ll=/[^+/0-9A-Za-z-_]/g;function Ul(t){if(t=t.split("=")[0],t=t.trim().replace(Ll,""),t.length<2)return"";for(;t.length%4!==0;)t=t+"=";return t}function ho(t,e){e=e||1/0;let r,n=t.length,o=null,i=[];for(let s=0;s55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}else if(s+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=(o-55296<<10|r-56320)+65536}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,r&63|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,r&63|128)}else if(r<1114112){if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,r&63|128)}else throw new Error("Invalid code point")}return i}function Pl(t){let e=[];for(let r=0;r>8,o=r%256,i.push(o),i.push(n);return i}function Hs(t){return lo.toByteArray(Ul(t))}function qr(t,e,r,n){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function We(t,e){return t instanceof e||t!=null&&t.constructor!=null&&t.constructor.name!=null&&t.constructor.name===e.name}function mo(t){return t!==t}var Cl=(function(){let t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){let n=r*16;for(let o=0;o<16;++o)e[n+o]=t[r]+t[o]}return e})();function yt(t){return typeof BigInt>"u"?Ol:t}function Ol(){throw new Error("BigInt not supported")}});b();b();b();b();var di;(function(t){t[t.SET_METADATA=0]="SET_METADATA",t[t.TEXT_NOTE=1]="TEXT_NOTE",t[t.RECOMMEND_SERVER=2]="RECOMMEND_SERVER",t[t.CONTACTS=3]="CONTACTS",t[t.ENCRYPTED_DIRECT_MESSAGE=4]="ENCRYPTED_DIRECT_MESSAGE",t[t.EVENT_DELETION=5]="EVENT_DELETION",t[t.REPOST=6]="REPOST",t[t.REACTION=7]="REACTION",t[t.CHANNEL_CREATION=40]="CHANNEL_CREATION",t[t.CHANNEL_METADATA=41]="CHANNEL_METADATA",t[t.CHANNEL_MESSAGE=42]="CHANNEL_MESSAGE",t[t.CHANNEL_HIDE_MESSAGE=43]="CHANNEL_HIDE_MESSAGE",t[t.CHANNEL_MUTE_USER=44]="CHANNEL_MUTE_USER",t[t.AUTH=22242]="AUTH",t[t.AUTH_RESPONSE=22243]="AUTH_RESPONSE"})(di||(di={}));var Er;(function(t){t.EVENT="EVENT",t.NOTICE="NOTICE",t.OK="OK",t.EOSE="EOSE",t.REQ="REQ",t.CLOSE="CLOSE",t.AUTH="AUTH"})(Er||(Er={}));b();b();b();b();var vr;(function(t){t.CONNECT="connect",t.PING="ping",t.GET_PUBLIC_KEY="get_public_key",t.SIGN_EVENT="sign_event",t.NIP04_ENCRYPT="nip04_encrypt",t.NIP04_DECRYPT="nip04_decrypt",t.NIP44_ENCRYPT="nip44_encrypt",t.NIP44_DECRYPT="nip44_decrypt",t.GET_RELAYS="get_relays"})(vr||(vr={}));var Bn;(function(t){t[t.SET_METADATA=0]="SET_METADATA",t[t.TEXT_NOTE=1]="TEXT_NOTE",t[t.RECOMMEND_SERVER=2]="RECOMMEND_SERVER",t[t.CONTACT_LIST=3]="CONTACT_LIST",t[t.ENCRYPTED_DIRECT_MESSAGE=4]="ENCRYPTED_DIRECT_MESSAGE",t[t.DELETE=5]="DELETE",t[t.REPOST=6]="REPOST",t[t.REACTION=7]="REACTION",t[t.BADGE_AWARD=8]="BADGE_AWARD",t[t.CHANNEL_CREATE=40]="CHANNEL_CREATE",t[t.CHANNEL_METADATA=41]="CHANNEL_METADATA",t[t.CHANNEL_MESSAGE=42]="CHANNEL_MESSAGE",t[t.CHANNEL_HIDE_MESSAGE=43]="CHANNEL_HIDE_MESSAGE",t[t.CHANNEL_MUTE_USER=44]="CHANNEL_MUTE_USER",t[t.CHANNEL_RESERVE=45]="CHANNEL_RESERVE",t[t.REPORTING=1984]="REPORTING",t[t.ZAP_REQUEST=9734]="ZAP_REQUEST",t[t.ZAP=9735]="ZAP",t[t.MUTE_LIST=1e4]="MUTE_LIST",t[t.PIN_LIST=10001]="PIN_LIST",t[t.RELAY_LIST_METADATA=10002]="RELAY_LIST_METADATA",t[t.CLIENT_AUTH=22242]="CLIENT_AUTH",t[t.AUTH_RESPONSE=22243]="AUTH_RESPONSE",t[t.NOSTR_CONNECT=24133]="NOSTR_CONNECT",t[t.CATEGORIZED_PEOPLE=3e4]="CATEGORIZED_PEOPLE",t[t.CATEGORIZED_BOOKMARKS=30001]="CATEGORIZED_BOOKMARKS",t[t.PROFILE_BADGES=30008]="PROFILE_BADGES",t[t.BADGE_DEFINITION=30009]="BADGE_DEFINITION",t[t.LONG_FORM=30023]="LONG_FORM",t[t.APPLICATION_SPECIFIC=30078]="APPLICATION_SPECIFIC"})(Bn||(Bn={}));b();b();b();b();b();function tr(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function te(t,e=""){if(!Number.isSafeInteger(t)||t<0){let r=e&&`"${e}" `;throw new Error(`${r}expected integer >= 0, got ${t}`)}}function F(t,e,r=""){let n=tr(t),o=t?.length,i=e!==void 0;if(!n||i&&o!==e){let s=r&&`"${r}" `,a=i?` of length ${e}`:"",c=n?`length=${o}`:`type=${typeof t}`;throw new Error(s+"expected Uint8Array"+a+", got "+c)}return t}function Qe(t){if(typeof t!="function"||typeof t.create!="function")throw new Error("Hash must wrapped by utils.createHasher");te(t.outputLen),te(t.blockLen)}function Ot(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function pi(t,e){F(t,void 0,"digestInto() output");let r=e.outputLen;if(t.length='+r)}function kr(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function Be(...t){for(let e=0;e>>e}function j(t,e){return t<>>32-e>>>0}var sc=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function ac(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}function cc(t){for(let e=0;et:cc,yi=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",lc=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function Ee(t){if(F(t),yi)return t.toHex();let e="";for(let r=0;r=Xe._0&&t<=Xe._9)return t-Xe._0;if(t>=Xe.A&&t<=Xe.F)return t-(Xe.A-10);if(t>=Xe.a&&t<=Xe.f)return t-(Xe.a-10)}function oe(t){if(typeof t!="string")throw new Error("hex string expected, got "+typeof t);if(yi)return Uint8Array.fromHex(t);let e=t.length,r=e/2;if(e%2)throw new Error("hex string expected, got unpadded hex of length "+e);let n=new Uint8Array(r);for(let o=0,i=0;ot(i).update(o).digest(),n=t(void 0);return r.outputLen=n.outputLen,r.blockLen=n.blockLen,r.create=o=>t(o),Object.assign(r,e),Object.freeze(r)}function ge(t=32){let e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof e?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");return e.getRandomValues(new Uint8Array(t))}var mi=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});function wi(t,e,r){return t&e^~t&r}function bi(t,e,r){return t&e^t&r^e&r}var Br=class{blockLen;outputLen;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,r,n,o){this.blockLen=e,this.outputLen=r,this.padOffset=n,this.isLE=o,this.buffer=new Uint8Array(e),this.view=Nt(this.buffer)}update(e){Ot(this),F(e);let{view:r,buffer:n,blockLen:o}=this,i=e.length;for(let s=0;so-s&&(this.process(n,0),s=0);for(let u=s;uf.length)throw new Error("_sha2: outputLen bigger than state");for(let u=0;u>>3,p=Ke(d,17)^Ke(d,19)^d>>>10;ut[u]=p+ut[u-7]+y+ut[u-16]|0}let{A:n,B:o,C:i,D:s,E:a,F:c,G:l,H:f}=this;for(let u=0;u<64;u++){let h=Ke(a,6)^Ke(a,11)^Ke(a,25),d=f+h+wi(a,c,l)+fc[u]+ut[u]|0,p=(Ke(n,2)^Ke(n,13)^Ke(n,22))+bi(n,o,i)|0;f=l,l=c,c=a,a=s+d|0,s=i,i=o,o=n,n=d+p|0}n=n+this.A|0,o=o+this.B|0,i=i+this.C|0,s=s+this.D|0,a=a+this.E|0,c=c+this.F|0,l=l+this.G|0,f=f+this.H|0,this.set(n,o,i,s,a,c,l,f)}roundClean(){Be(ut)}destroy(){this.set(0,0,0,0,0,0,0,0),Be(this.buffer)}},_n=class extends Tn{A=et[0]|0;B=et[1]|0;C=et[2]|0;D=et[3]|0;E=et[4]|0;F=et[5]|0;G=et[6]|0;H=et[7]|0;constructor(){super(32)}};var pe=gi(()=>new _n,mi(1));b();b();var Un=BigInt(0),Ln=BigInt(1);function rr(t,e=""){if(typeof t!="boolean"){let r=e&&`"${e}" `;throw new Error(r+"expected boolean, got type="+typeof t)}return t}function xi(t){if(typeof t=="bigint"){if(!Sr(t))throw new Error("positive bigint expected, got "+t)}else te(t);return t}function nr(t){let e=xi(t).toString(16);return e.length&1?"0"+e:e}function Ei(t){if(typeof t!="string")throw new Error("hex string expected, got "+typeof t);return t===""?Un:BigInt("0x"+t)}function ft(t){return Ei(Ee(t))}function Pn(t){return Ei(Ee(dc(F(t)).reverse()))}function Ir(t,e){te(e),t=xi(t);let r=oe(t.toString(16).padStart(e*2,"0"));if(r.length!==e)throw new Error("number too large");return r}function Rn(t,e){return Ir(t,e).reverse()}function dc(t){return Uint8Array.from(t)}function vi(t){return Uint8Array.from(t,(e,r)=>{let n=e.charCodeAt(0);if(e.length!==1||n>127)throw new Error(`string contains non-ASCII character "${t[r]}" with code ${n} at position ${r}`);return n})}var Sr=t=>typeof t=="bigint"&&Un<=t;function hc(t,e,r){return Sr(t)&&Sr(e)&&Sr(r)&&e<=t&&tUn;t>>=Ln,e+=1);return e}var or=t=>(Ln<new Uint8Array(w),o=Uint8Array.of(),i=Uint8Array.of(0),s=Uint8Array.of(1),a=1e3,c=n(t),l=n(t),f=0,u=()=>{c.fill(1),l.fill(0),f=0},h=(...w)=>r(l,ie(c,...w)),d=(w=o)=>{l=h(i,w),c=h(),w.length!==0&&(l=h(s,w),c=h())},y=()=>{if(f++>=a)throw new Error("drbg: tried max amount of iterations");let w=0,k=[];for(;w{u(),d(w);let O;for(;!(O=k(y()));)d();return u(),O}}function ir(t,e={},r={}){if(!t||typeof t!="object")throw new Error("expected valid options object");function n(i,s,a){let c=t[i];if(a&&c===void 0)return;let l=typeof c;if(l!==s||c===null)throw new Error(`param "${i}" is invalid: expected ${s}, got ${l}`)}let o=(i,s)=>Object.entries(i).forEach(([a,c])=>n(a,c,s));o(e,!1),o(r,!0)}function On(t){let e=new WeakMap;return(r,...n)=>{let o=e.get(r);if(o!==void 0)return o;let i=t(r,...n);return e.set(r,i),i}}b();var me=BigInt(0),ye=BigInt(1),xt=BigInt(2),Ii=BigInt(3),Ti=BigInt(4),_i=BigInt(5),pc=BigInt(7),Li=BigInt(8),yc=BigInt(9),Ui=BigInt(16);function Ve(t,e){let r=t%e;return r>=me?r:e+r}function Se(t,e,r){let n=t;for(;e-- >me;)n*=n,n%=r;return n}function Bi(t,e){if(t===me)throw new Error("invert: expected non-zero number");if(e<=me)throw new Error("invert: expected positive modulus, got "+e);let r=Ve(t,e),n=e,o=me,i=ye,s=ye,a=me;for(;r!==me;){let l=n/r,f=n%r,u=o-s*l,h=i-a*l;n=r,r=f,o=s,i=a,s=u,a=h}if(n!==ye)throw new Error("invert: does not exist");return Ve(o,e)}function Dn(t,e,r){if(!t.eql(t.sqr(e),r))throw new Error("Cannot find square root")}function Pi(t,e){let r=(t.ORDER+ye)/Ti,n=t.pow(e,r);return Dn(t,n,e),n}function gc(t,e){let r=(t.ORDER-_i)/Li,n=t.mul(e,xt),o=t.pow(n,r),i=t.mul(e,o),s=t.mul(t.mul(i,xt),o),a=t.mul(i,t.sub(s,t.ONE));return Dn(t,a,e),a}function mc(t){let e=Dt(t),r=Ri(t),n=r(e,e.neg(e.ONE)),o=r(e,n),i=r(e,e.neg(n)),s=(t+pc)/Ui;return(a,c)=>{let l=a.pow(c,s),f=a.mul(l,n),u=a.mul(l,o),h=a.mul(l,i),d=a.eql(a.sqr(f),c),y=a.eql(a.sqr(u),c);l=a.cmov(l,f,d),f=a.cmov(h,u,y);let p=a.eql(a.sqr(f),c),w=a.cmov(l,f,p);return Dn(a,w,c),w}}function Ri(t){if(t1e3)throw new Error("Cannot find square root: probably non-prime P");if(r===1)return Pi;let i=o.pow(n,e),s=(e+ye)/xt;return function(c,l){if(c.is0(l))return l;if(Si(c,l)!==1)throw new Error("Cannot find square root");let f=r,u=c.mul(c.ONE,i),h=c.pow(l,e),d=c.pow(l,s);for(;!c.eql(h,c.ONE);){if(c.is0(h))return c.ZERO;let y=1,p=c.sqr(h);for(;!c.eql(p,c.ONE);)if(y++,p=c.sqr(p),y===f)throw new Error("Cannot find square root");let w=ye<(n[o]="function",n),e);return ir(t,r),t}function xc(t,e,r){if(rme;)r&ye&&(n=t.mul(n,o)),o=t.sqr(o),r>>=ye;return n}function Tr(t,e,r=!1){let n=new Array(e.length).fill(r?t.ZERO:void 0),o=e.reduce((s,a,c)=>t.is0(a)?s:(n[c]=s,t.mul(s,a)),t.ONE),i=t.inv(o);return e.reduceRight((s,a,c)=>t.is0(a)?s:(n[c]=t.mul(s,n[c]),t.mul(s,a)),i),n}function Si(t,e){let r=(t.ORDER-ye)/xt,n=t.pow(e,r),o=t.eql(n,t.ONE),i=t.eql(n,t.ZERO),s=t.eql(n,t.neg(t.ONE));if(!o&&!i&&!s)throw new Error("invalid Legendre symbol result");return o?1:i?0:-1}function Ec(t,e){e!==void 0&&te(e);let r=e!==void 0?e:t.toString(2).length,n=Math.ceil(r/8);return{nBitLength:r,nByteLength:n}}var Nn=class{ORDER;BITS;BYTES;isLE;ZERO=me;ONE=ye;_lengths;_sqrt;_mod;constructor(e,r={}){if(e<=me)throw new Error("invalid field: expected ORDER > 0, got "+e);let n;this.isLE=!1,r!=null&&typeof r=="object"&&(typeof r.BITS=="number"&&(n=r.BITS),typeof r.sqrt=="function"&&(this.sqrt=r.sqrt),typeof r.isLE=="boolean"&&(this.isLE=r.isLE),r.allowedLengths&&(this._lengths=r.allowedLengths?.slice()),typeof r.modFromBytes=="boolean"&&(this._mod=r.modFromBytes));let{nBitLength:o,nByteLength:i}=Ec(e,n);if(i>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=o,this.BYTES=i,this._sqrt=void 0,Object.preventExtensions(this)}create(e){return Ve(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new Error("invalid field element: expected bigint, got "+typeof e);return me<=e&&eo)throw new Error("Field.fromBytes: expected "+n+" bytes, got "+e.length);let l=new Uint8Array(o);l.set(e,i?0:l.length-e.length),e=l}if(e.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let c=i?Pn(e):ft(e);if(a&&(c=Ve(c,s)),!r&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(e){return Tr(this,e)}cmov(e,r,n){return n?r:e}};function Dt(t,e={}){return new Nn(t,e)}function Ci(t){if(typeof t!="bigint")throw new Error("field order must be bigint");let e=t.toString(2).length;return Math.ceil(e/8)}function Hn(t){let e=Ci(t);return e+Math.ceil(e/2)}function _r(t,e,r=!1){F(t);let n=t.length,o=Ci(e),i=Hn(e);if(n<16||n1024)throw new Error("expected "+i+"-1024 bytes of input, got "+n);let s=r?Pn(t):ft(t),a=Ve(s,e-ye)+ye;return r?Rn(a,o):Ir(a,o)}var Mt=BigInt(0),Et=BigInt(1);function sr(t,e){let r=e.negate();return t?r:e}function $n(t,e){let r=Tr(t.Fp,e.map(n=>n.Z));return e.map((n,o)=>t.fromAffine(n.toAffine(r[o])))}function Mi(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function Kn(t,e){Mi(t,e);let r=Math.ceil(e/t)+1,n=2**(t-1),o=2**t,i=or(t),s=BigInt(t);return{windows:r,windowSize:n,mask:i,maxNumber:o,shiftBy:s}}function Oi(t,e,r){let{windowSize:n,mask:o,maxNumber:i,shiftBy:s}=r,a=Number(t&o),c=t>>s;a>n&&(a-=i,c+=Et);let l=e*n,f=l+Math.abs(a)-1,u=a===0,h=a<0,d=e%2!==0;return{nextN:c,offset:f,isZero:u,isNeg:h,isNegF:d,offsetF:l}}var Vn=new WeakMap,Hi=new WeakMap;function Fn(t){return Hi.get(t)||1}function Ni(t){if(t!==Mt)throw new Error("invalid wNAF")}var Lr=class{BASE;ZERO;Fn;bits;constructor(e,r){this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=r}_unsafeLadder(e,r,n=this.ZERO){let o=e;for(;r>Mt;)r&Et&&(n=n.add(o)),o=o.double(),r>>=Et;return n}precomputeWindow(e,r){let{windows:n,windowSize:o}=Kn(r,this.bits),i=[],s=e,a=s;for(let c=0;cMt||n>Mt;)r&Et&&(i=i.add(o)),n&Et&&(s=s.add(o)),o=o.double(),r>>=Et,n>>=Et;return{p1:i,p2:s}}function Di(t,e,r){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Mn(e),e}else return Dt(t,{isLE:r})}function Vi(t,e,r={},n){if(n===void 0&&(n=t==="edwards"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(let c of["p","n","h"]){let l=e[c];if(!(typeof l=="bigint"&&l>Mt))throw new Error(`CURVE.${c} must be positive bigint`)}let o=Di(e.p,r.Fp,n),i=Di(e.n,r.Fn,n),a=["Gx","Gy","a",t==="weierstrass"?"b":"d"];for(let c of a)if(!o.isValid(e[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return e=Object.freeze(Object.assign({},e)),{CURVE:e,Fp:o,Fn:i}}function Ur(t,e){return function(n){let o=t(n);return{secretKey:o,publicKey:e(o)}}}b();b();var Pr=class{oHash;iHash;blockLen;outputLen;finished=!1;destroyed=!1;constructor(e,r){if(Qe(e),F(r,void 0,"key"),this.iHash=e.create(),typeof this.iHash.update!="function")throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let n=this.blockLen,o=new Uint8Array(n);o.set(r.length>n?e.create().update(r).digest():r);for(let i=0;inew Pr(t,e).update(r).digest();Fe.create=(t,e)=>new Pr(t,e);var Fi=(t,e)=>(t+(t>=0?e:-e)/$i)/e;function vc(t,e,r){let[[n,o],[i,s]]=e,a=Fi(s*t,r),c=Fi(-o*t,r),l=t-a*n-c*i,f=-a*o-c*s,u=l=d||f=d)throw new Error("splitScalar (endomorphism): failed, k="+t);return{k1neg:u,k1:l,k2neg:h,k2:f}}function jn(t){if(!["compact","recovered","der"].includes(t))throw new Error('Signature format must be "compact", "recovered", or "der"');return t}function qn(t,e){let r={};for(let n of Object.keys(e))r[n]=t[n]===void 0?e[n]:t[n];return rr(r.lowS,"lowS"),rr(r.prehash,"prehash"),r.format!==void 0&&jn(r.format),r}var zn=class extends Error{constructor(e=""){super(e)}},dt={Err:zn,_tlv:{encode:(t,e)=>{let{Err:r}=dt;if(t<0||t>256)throw new r("tlv.encode: wrong tag");if(e.length&1)throw new r("tlv.encode: unpadded data");let n=e.length/2,o=nr(n);if(o.length/2&128)throw new r("tlv.encode: long form length too big");let i=n>127?nr(o.length/2|128):"";return nr(t)+i+o+e},decode(t,e){let{Err:r}=dt,n=0;if(t<0||t>256)throw new r("tlv.encode: wrong tag");if(e.length<2||e[n++]!==t)throw new r("tlv.decode: wrong tlv");let o=e[n++],i=!!(o&128),s=0;if(!i)s=o;else{let c=o&127;if(!c)throw new r("tlv.decode(long): indefinite length not supported");if(c>4)throw new r("tlv.decode(long): byte length is too big");let l=e.subarray(n,n+c);if(l.length!==c)throw new r("tlv.decode: length bytes not complete");if(l[0]===0)throw new r("tlv.decode(long): zero leftmost byte");for(let f of l)s=s<<8|f;if(n+=c,s<128)throw new r("tlv.decode(long): not minimal encoding")}let a=e.subarray(n,n+s);if(a.length!==s)throw new r("tlv.decode: wrong value length");return{v:a,l:e.subarray(n+s)}}},_int:{encode(t){let{Err:e}=dt;if(t{let{X:x,Y:m,Z:A}=P;if(n.eql(A,n.ONE))return{x,y:m};let S=P.is0();E==null&&(E=S?n.ONE:n.inv(A));let I=n.mul(x,E),v=n.mul(m,E),B=n.mul(A,E);if(S)return{x:n.ZERO,y:n.ZERO};if(!n.eql(B,n.ONE))throw new Error("invZ was invalid");return{x:I,y:v}}),q=On(P=>{if(P.is0()){if(e.allowInfinityPoint&&!n.is0(P.Y))return;throw new Error("bad point: ZERO")}let{x:E,y:x}=P.toAffine();if(!n.isValid(E)||!n.isValid(x))throw new Error("bad point: x or y not field elements");if(!w(E,x))throw new Error("bad point: equation left != right");if(!P.isTorsionFree())throw new Error("bad point: not in prime-order subgroup");return!0});function G(P,E,x,m,A){return x=new C(n.mul(x.X,P),x.Y,x.Z),E=sr(m,E),x=sr(A,x),E.add(x)}class C{static BASE=new C(i.Gx,i.Gy,n.ONE);static ZERO=new C(n.ZERO,n.ONE,n.ZERO);static Fp=n;static Fn=o;X;Y;Z;constructor(E,x,m){this.X=D("x",E),this.Y=D("y",x,!0),this.Z=D("z",m),Object.freeze(this)}static CURVE(){return i}static fromAffine(E){let{x,y:m}=E||{};if(!E||!n.isValid(x)||!n.isValid(m))throw new Error("invalid affine point");if(E instanceof C)throw new Error("projective point not allowed");return n.is0(x)&&n.is0(m)?C.ZERO:new C(x,m,n.ONE)}static fromBytes(E){let x=C.fromAffine(y(F(E,void 0,"point")));return x.assertValidity(),x}static fromHex(E){return C.fromBytes(oe(E))}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(E=8,x=!0){return K.createCache(this,E),x||this.multiply(Rr),this}assertValidity(){q(this)}hasEvenY(){let{y:E}=this.toAffine();if(!n.isOdd)throw new Error("Field doesn't support isOdd");return!n.isOdd(E)}equals(E){H(E);let{X:x,Y:m,Z:A}=this,{X:S,Y:I,Z:v}=E,B=n.eql(n.mul(x,v),n.mul(S,A)),T=n.eql(n.mul(m,v),n.mul(I,A));return B&&T}negate(){return new C(this.X,n.neg(this.Y),this.Z)}double(){let{a:E,b:x}=i,m=n.mul(x,Rr),{X:A,Y:S,Z:I}=this,v=n.ZERO,B=n.ZERO,T=n.ZERO,L=n.mul(A,A),Y=n.mul(S,S),z=n.mul(I,I),V=n.mul(A,S);return V=n.add(V,V),T=n.mul(A,I),T=n.add(T,T),v=n.mul(E,T),B=n.mul(m,z),B=n.add(v,B),v=n.sub(Y,B),B=n.add(Y,B),B=n.mul(v,B),v=n.mul(V,v),T=n.mul(m,T),z=n.mul(E,z),V=n.sub(L,z),V=n.mul(E,V),V=n.add(V,T),T=n.add(L,L),L=n.add(T,L),L=n.add(L,z),L=n.mul(L,V),B=n.add(B,L),z=n.mul(S,I),z=n.add(z,z),L=n.mul(z,V),v=n.sub(v,L),T=n.mul(z,Y),T=n.add(T,T),T=n.add(T,T),new C(v,B,T)}add(E){H(E);let{X:x,Y:m,Z:A}=this,{X:S,Y:I,Z:v}=E,B=n.ZERO,T=n.ZERO,L=n.ZERO,Y=i.a,z=n.mul(i.b,Rr),V=n.mul(x,S),Z=n.mul(m,I),ee=n.mul(A,v),fe=n.add(x,m),J=n.add(S,I);fe=n.mul(fe,J),J=n.add(V,Z),fe=n.sub(fe,J),J=n.add(x,A);let he=n.add(S,v);return J=n.mul(J,he),he=n.add(V,ee),J=n.sub(J,he),he=n.add(m,A),B=n.add(I,v),he=n.mul(he,B),B=n.add(Z,ee),he=n.sub(he,B),L=n.mul(Y,J),B=n.mul(z,ee),L=n.add(B,L),B=n.sub(Z,L),L=n.add(Z,L),T=n.mul(B,L),Z=n.add(V,V),Z=n.add(Z,V),ee=n.mul(Y,ee),J=n.mul(z,J),Z=n.add(Z,ee),ee=n.sub(V,ee),ee=n.mul(Y,ee),J=n.add(J,ee),V=n.mul(Z,J),T=n.add(T,V),V=n.mul(he,J),B=n.mul(fe,B),B=n.sub(B,V),V=n.mul(fe,Z),L=n.mul(he,L),L=n.add(L,V),new C(B,T,L)}subtract(E){return this.add(E.negate())}is0(){return this.equals(C.ZERO)}multiply(E){let{endo:x}=e;if(!o.isValidNot0(E))throw new Error("invalid scalar: out of range");let m,A,S=I=>K.cached(this,I,v=>$n(C,v));if(x){let{k1neg:I,k1:v,k2neg:B,k2:T}=X(E),{p:L,f:Y}=S(v),{p:z,f:V}=S(T);A=Y.add(V),m=G(x.beta,L,z,I,B)}else{let{p:I,f:v}=S(E);m=I,A=v}return $n(C,[m,A])[0]}multiplyUnsafe(E){let{endo:x}=e,m=this;if(!o.isValid(E))throw new Error("invalid scalar: out of range");if(E===tt||m.is0())return C.ZERO;if(E===Ht)return m;if(K.hasCache(this))return this.multiply(E);if(x){let{k1neg:A,k1:S,k2neg:I,k2:v}=X(E),{p1:B,p2:T}=Ki(C,m,S,v);return G(x.beta,B,T,A,I)}else return K.unsafe(m,E)}toAffine(E){return M(this,E)}isTorsionFree(){let{isTorsionFree:E}=e;return s===Ht?!0:E?E(C,this):K.unsafe(this,a).is0()}clearCofactor(){let{clearCofactor:E}=e;return s===Ht?this:E?E(C,this):this.multiplyUnsafe(s)}isSmallOrder(){return this.multiplyUnsafe(s).is0()}toBytes(E=!0){return rr(E,"isCompressed"),this.assertValidity(),d(C,this,E)}toHex(E=!0){return Ee(this.toBytes(E))}toString(){return``}}let $=o.BITS,K=new Lr(C,e.endo?Math.ceil($/2):$);return C.BASE.precompute(8),C}function ji(t){return Uint8Array.of(t?2:3)}function zi(t,e){return{secretKey:e.BYTES,publicKey:1+t.BYTES,publicKeyUncompressed:1+2*t.BYTES,publicKeyHasPrefix:!0,signature:2*e.BYTES}}function Ac(t,e={}){let{Fn:r}=t,n=e.randomBytes||ge,o=Object.assign(zi(t.Fp,r),{seed:Hn(r.ORDER)});function i(d){try{let y=r.fromBytes(d);return r.isValidNot0(y)}catch{return!1}}function s(d,y){let{publicKey:p,publicKeyUncompressed:w}=o;try{let k=d.length;return y===!0&&k!==p||y===!1&&k!==w?!1:!!t.fromBytes(d)}catch{return!1}}function a(d=n(o.seed)){return _r(F(d,o.seed,"seed"),r.ORDER)}function c(d,y=!0){return t.BASE.multiply(r.fromBytes(d)).toBytes(y)}function l(d){let{secretKey:y,publicKey:p,publicKeyUncompressed:w}=o;if(!tr(d)||"_lengths"in r&&r._lengths||y===p)return;let k=F(d,void 0,"key").length;return k===p||k===w}function f(d,y,p=!0){if(l(d)===!0)throw new Error("first arg must be private key");if(l(y)===!1)throw new Error("second arg must be public key");let w=r.fromBytes(d);return t.fromBytes(y).multiply(w).toBytes(p)}let u={isValidSecretKey:i,isValidPublicKey:s,randomSecretKey:a},h=Ur(a,c);return Object.freeze({getPublicKey:c,getSharedSecret:f,keygen:h,Point:t,utils:u,lengths:o})}function Wi(t,e,r={}){Qe(e),ir(r,{},{hmac:"function",lowS:"boolean",randomBytes:"function",bits2int:"function",bits2int_modN:"function"}),r=Object.assign({},r);let n=r.randomBytes||ge,o=r.hmac||((x,m)=>Fe(e,x,m)),{Fp:i,Fn:s}=t,{ORDER:a,BITS:c}=s,{keygen:l,getPublicKey:f,getSharedSecret:u,utils:h,lengths:d}=Ac(t,r),y={prehash:!0,lowS:typeof r.lowS=="boolean"?r.lowS:!0,format:"compact",extraEntropy:!1},p=a*$i>Ht;return x>m}function k(x,m){if(!s.isValidNot0(m))throw new Error(`invalid signature ${x}: out of range 1..Point.Fn.ORDER`);return m}function O(){if(p)throw new Error('"recovered" sig type is not supported for cofactor >2 curves')}function D(x,m){jn(m);let A=d.signature,S=m==="compact"?A:m==="recovered"?A+1:void 0;return F(x,S)}class H{r;s;recovery;constructor(m,A,S){if(this.r=k("r",m),this.s=k("s",A),S!=null){if(O(),![0,1,2,3].includes(S))throw new Error("invalid recovery id");this.recovery=S}Object.freeze(this)}static fromBytes(m,A=y.format){D(m,A);let S;if(A==="der"){let{r:T,s:L}=dt.toSig(F(m));return new H(T,L)}A==="recovered"&&(S=m[0],A="compact",m=m.subarray(1));let I=d.signature/2,v=m.subarray(0,I),B=m.subarray(I,I*2);return new H(s.fromBytes(v),s.fromBytes(B),S)}static fromHex(m,A){return this.fromBytes(oe(m),A)}assertRecovery(){let{recovery:m}=this;if(m==null)throw new Error("invalid recovery id: must be present");return m}addRecoveryBit(m){return new H(this.r,this.s,m)}recoverPublicKey(m){let{r:A,s:S}=this,I=this.assertRecovery(),v=I===2||I===3?A+a:A;if(!i.isValid(v))throw new Error("invalid recovery id: sig.r+curve.n != R.x");let B=i.toBytes(v),T=t.fromBytes(ie(ji((I&1)===0),B)),L=s.inv(v),Y=M(F(m,void 0,"msgHash")),z=s.create(-Y*L),V=s.create(S*L),Z=t.BASE.multiplyUnsafe(z).add(T.multiplyUnsafe(V));if(Z.is0())throw new Error("invalid recovery: point at infinify");return Z.assertValidity(),Z}hasHighS(){return w(this.s)}toBytes(m=y.format){if(jn(m),m==="der")return oe(dt.hexFromSig(this));let{r:A,s:S}=this,I=s.toBytes(A),v=s.toBytes(S);return m==="recovered"?(O(),ie(Uint8Array.of(this.assertRecovery()),I,v)):ie(I,v)}toHex(m){return Ee(this.toBytes(m))}}let X=r.bits2int||function(m){if(m.length>8192)throw new Error("input is too large");let A=ft(m),S=m.length*8-c;return S>0?A>>BigInt(S):A},M=r.bits2int_modN||function(m){return s.create(X(m))},q=or(c);function G(x){return ki("num < 2^"+c,x,tt,q),s.toBytes(x)}function C(x,m){return F(x,void 0,"message"),m?F(e(x),void 0,"prehashed message"):x}function $(x,m,A){let{lowS:S,prehash:I,extraEntropy:v}=qn(A,y);x=C(x,I);let B=M(x),T=s.fromBytes(m);if(!s.isValidNot0(T))throw new Error("invalid private key");let L=[G(T),G(B)];if(v!=null&&v!==!1){let Z=v===!0?n(d.secretKey):v;L.push(F(Z,void 0,"extraEntropy"))}let Y=ie(...L),z=B;function V(Z){let ee=X(Z);if(!s.isValidNot0(ee))return;let fe=s.inv(ee),J=t.BASE.multiply(ee).toAffine(),he=s.create(J.x);if(he===tt)return;let xr=s.create(fe*s.create(z+he*T));if(xr===tt)return;let ui=(J.x===he?0:2)|Number(J.y&Ht),fi=xr;return S&&w(xr)&&(fi=s.neg(xr),ui^=1),new H(he,fi,p?void 0:ui)}return{seed:Y,k2sig:V}}function K(x,m,A={}){let{seed:S,k2sig:I}=$(x,m,A);return Ai(e.outputLen,s.BYTES,o)(S,I).toBytes(A.format)}function P(x,m,A,S={}){let{lowS:I,prehash:v,format:B}=qn(S,y);if(A=F(A,void 0,"publicKey"),m=C(m,v),!tr(x)){let T=x instanceof H?", use sig.toBytes()":"";throw new Error("verify expects Uint8Array signature"+T)}D(x,B);try{let T=H.fromBytes(x,B),L=t.fromBytes(A);if(I&&T.hasHighS())return!1;let{r:Y,s:z}=T,V=M(m),Z=s.inv(z),ee=s.create(V*Z),fe=s.create(Y*Z),J=t.BASE.multiplyUnsafe(ee).add(L.multiplyUnsafe(fe));return J.is0()?!1:s.create(J.x)===Y}catch{return!1}}function E(x,m,A={}){let{prehash:S}=qn(A,y);return m=C(m,S),H.fromBytes(x,"recovered").recoverPublicKey(m).toBytes()}return Object.freeze({keygen:l,getPublicKey:f,getSharedSecret:u,utils:h,lengths:d,Point:t,sign:K,verify:P,recoverPublicKey:E,Signature:H,hash:e})}var Nr={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},Bc={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},Sc=BigInt(0),Wn=BigInt(2);function Ic(t){let e=Nr.p,r=BigInt(3),n=BigInt(6),o=BigInt(11),i=BigInt(22),s=BigInt(23),a=BigInt(44),c=BigInt(88),l=t*t*t%e,f=l*l*t%e,u=Se(f,r,e)*f%e,h=Se(u,r,e)*f%e,d=Se(h,Wn,e)*l%e,y=Se(d,o,e)*d%e,p=Se(y,i,e)*y%e,w=Se(p,a,e)*p%e,k=Se(w,c,e)*w%e,O=Se(k,a,e)*p%e,D=Se(O,r,e)*f%e,H=Se(D,s,e)*y%e,X=Se(H,n,e)*l%e,M=Se(X,Wn,e);if(!Cr.eql(Cr.sqr(M),t))throw new Error("Cannot find square root");return M}var Cr=Dt(Nr.p,{sqrt:Ic}),vt=qi(Nr,{Fp:Cr,endo:Bc}),kt=Wi(vt,pe),Gi={};function Or(t,...e){let r=Gi[t];if(r===void 0){let n=pe(vi(t));r=ie(n,n),Gi[t]=r}return pe(ie(r,...e))}var Yn=t=>t.toBytes(!0).slice(1),Zn=t=>t%Wn===Sc;function Gn(t){let{Fn:e,BASE:r}=vt,n=e.fromBytes(t),o=r.multiply(n);return{scalar:Zn(o.y)?n:e.neg(n),bytes:Yn(o)}}function Zi(t){let e=Cr;if(!e.isValidNot0(t))throw new Error("invalid x: Fail if x \u2265 p");let r=e.create(t*t),n=e.create(r*t+BigInt(7)),o=e.sqrt(n);Zn(o)||(o=e.neg(o));let i=vt.fromAffine({x:t,y:o});return i.assertValidity(),i}var ar=ft;function Ji(...t){return vt.Fn.create(ar(Or("BIP0340/challenge",...t)))}function Yi(t){return Gn(t).bytes}function Tc(t,e,r=ge(32)){let{Fn:n}=vt,o=F(t,void 0,"message"),{bytes:i,scalar:s}=Gn(e),a=F(r,32,"auxRand"),c=n.toBytes(s^ar(Or("BIP0340/aux",a))),l=Or("BIP0340/nonce",c,i,o),{bytes:f,scalar:u}=Gn(l),h=Ji(f,i,o),d=new Uint8Array(64);if(d.set(f,0),d.set(n.toBytes(n.create(u+h*s)),32),!Xi(d,o,i))throw new Error("sign: Invalid signature produced");return d}function Xi(t,e,r){let{Fp:n,Fn:o,BASE:i}=vt,s=F(t,64,"signature"),a=F(e,void 0,"message"),c=F(r,32,"publicKey");try{let l=Zi(ar(c)),f=ar(s.subarray(0,32));if(!n.isValidNot0(f))return!1;let u=ar(s.subarray(32,64));if(!o.isValidNot0(u))return!1;let h=Ji(o.toBytes(f),Yn(l),a),d=i.multiplyUnsafe(u).add(l.multiplyUnsafe(o.neg(h))),{x:y,y:p}=d.toAffine();return!(d.is0()||!Zn(p)||y!==f)}catch{return!1}}var Kt=(()=>{let r=(n=ge(48))=>_r(n,Nr.n);return{keygen:Ur(r,Yi),getPublicKey:Yi,sign:Tc,verify:Xi,Point:vt,utils:{randomSecretKey:r,taggedHash:Or,lift_x:Zi,pointToBytes:Yn},lengths:{secretKey:32,publicKey:32,publicKeyHasPrefix:!1,signature:64,seed:48}}})();b();var ls=er(as()),cs;(function(t){t[t.DEBUG=0]="DEBUG",t[t.INFO=1]="INFO",t[t.WARN=2]="WARN",t[t.ERROR=3]="ERROR"})(cs||(cs={}));var Ie=(0,ls.default)({name:"nostr-crypto-utils",level:R.env.LOG_LEVEL||"info",transport:void 0,formatters:{level:t=>({level:t.toUpperCase()}),log:t=>{if(t&&typeof t=="object"&&"err"in t){let e={...t};if(e.err instanceof Error){let r=e.err;e.err={message:r.message,stack:r.stack,name:r.name}}return e}return t}}});b();function zc(t){try{return!!t.match(/^[A-Za-z0-9+/]*={0,2}$/)}catch{return!1}}function Hr(t){let e="";for(let r=0;r{if(typeof window<"u"&&window.crypto)return window.crypto;if(typeof globalThis<"u"&&globalThis.crypto)return globalThis.crypto;try{let t=await Promise.resolve().then(()=>er(ro()));if(t.webcrypto)return t.webcrypto}catch{Ie.debug("Node crypto not available")}throw new Error("No WebCrypto implementation available")},no=class{cryptoInstance=null;initPromise;constructor(){this.initPromise=this.initialize()}async initialize(){this.cryptoInstance=await Wc()}async ensureInitialized(){if(await this.initPromise,!this.cryptoInstance)throw new Error("Crypto implementation not initialized");return this.cryptoInstance}async getSubtle(){return(await this.ensureInitialized()).subtle}async getRandomValues(e){return(await this.ensureInitialized()).getRandomValues(e)}},Md=new no,Gc=Kt.sign,Yc=Kt.verify;async function oo(){let t=ge(32),e=Ee(t);t.fill(0);let r=await fs(e);return{privateKey:e,publicKey:r}}async function fs(t){try{let e=oe(t),r=Kt.getPublicKey(e);return{hex:Ee(r),bytes:r}}catch(e){throw Ie.error({error:e},"Failed to get public key"),e}}function Zc(t){return t instanceof Uint8Array?Ee(t):t}async function ds(t,e){try{let r=Zc(e),n=JSON.stringify([0,t.pubkey,t.created_at,t.kind,t.tags,t.content]),o=pe(new TextEncoder().encode(n)),i=oe(r),s=Kt.sign(o,i);return{...t,id:Ee(o),sig:Ee(s)}}catch(r){throw Ie.error({error:r},"Failed to sign event"),r}}function Pe(t){let e=t instanceof Uint8Array?t:oe(t),r=Kt.getPublicKey(e);return Ee(r)}async function Re(t,e){let r=t.pubkey||Pe(e),n=t.created_at||Math.floor(Date.now()/1e3),o={kind:t.kind||1,created_at:n,tags:t.tags||[],content:t.content||"",pubkey:r};return ds(o,e)}b();b();b();b();var pt={};An(pt,{computeSharedSecret:()=>ys,decryptMessage:()=>ps,encryptMessage:()=>hs,generateSharedSecret:()=>ys});b();var Qc=async()=>{if(typeof window<"u"&&window.crypto)return window.crypto;if(typeof globalThis<"u"&&globalThis.crypto)return globalThis.crypto;try{let t=await Promise.resolve().then(()=>er(ro()));if(t.webcrypto)return t.webcrypto}catch{Ie.debug("Node crypto not available")}throw new Error("No WebCrypto implementation available")},io=class{cryptoInstance=null;initPromise;constructor(){this.initPromise=this.initialize()}async initialize(){this.cryptoInstance=await Qc()}async ensureInitialized(){if(await this.initPromise,!this.cryptoInstance)throw new Error("Crypto implementation not initialized");return this.cryptoInstance}async getSubtle(){return(await this.ensureInitialized()).subtle}async getRandomValues(e){return(await this.ensureInitialized()).getRandomValues(e)}},lr=new io;async function hs(t,e,r){try{if(!t||!e||!r)throw new Error("Invalid input parameters");if(!/^[0-9a-f]{64}$/i.test(e))throw new Error("Invalid private key format");let n=r.startsWith("02")||r.startsWith("03")?r:"02"+r,o=kt.getSharedSecret(oe(e),oe(n)),i=o.slice(1,33),s=await(await lr.getSubtle()).importKey("raw",i.buffer,{name:"AES-CBC",length:256},!1,["encrypt"]);i.fill(0),o.fill(0);let a=new Uint8Array(16);await lr.getRandomValues(a);let c=new TextEncoder().encode(t),l=await(await lr.getSubtle()).encrypt({name:"AES-CBC",iv:a},s,c.buffer),f=Hr(new Uint8Array(l)),u=Hr(a);return f+"?iv="+u}catch(n){throw Ie.error({error:n},"Failed to encrypt message"),n}}async function ps(t,e,r){try{if(!t||!e||!r)throw new Error("Invalid input parameters");if(!/^[0-9a-f]{64}$/i.test(e))throw new Error("Invalid private key format");let n=r.startsWith("02")||r.startsWith("03")?r:"02"+r,o=kt.getSharedSecret(oe(e),oe(n)),i=o.slice(1,33),s=await(await lr.getSubtle()).importKey("raw",i.buffer,{name:"AES-CBC",length:256},!1,["decrypt"]);i.fill(0),o.fill(0);let a,c;if(t.includes("?iv=")){let[f,u]=t.split("?iv=");c=Kr(f),a=Kr(u)}else{let f=oe(t);a=f.slice(0,16),c=f.slice(16)}let l=await(await lr.getSubtle()).decrypt({name:"AES-CBC",iv:a},s,c.buffer);return new TextDecoder().decode(l)}catch(n){throw Ie.error({error:n},"Failed to decrypt message"),n}}function ys(t,e){try{if(!t||!e)throw new Error("Invalid input parameters");if(!/^[0-9a-f]{64}$/i.test(t))throw new Error("Invalid private key format");let r=e.startsWith("02")||e.startsWith("03")?e:"02"+e;return{sharedSecret:kt.getSharedSecret(oe(t),oe(r)).slice(1,33)}}catch(r){throw Ie.error({error:r},"Failed to generate shared secret"),r}}b();var Te={};An(Te,{decode:()=>ql,naddrEncode:()=>Fl,neventEncode:()=>Vl,noteEncode:()=>Hl,nprofileEncode:()=>Kl,npubEncode:()=>Dl,nrelayEncode:()=>$l,nsecEncode:()=>Ml});b();var we=er(bs()),Oe=er(Ks()),Nl=["npub","nsec","note","nprofile","nevent","naddr","nrelay"],Ge={SPECIAL:0,RELAY:1,AUTHOR:2,KIND:3,IDENTIFIER:4};function Dl(t){Ye(t,64);let e=Oe.Buffer.from(t,"hex"),r=we.bech32.toWords(e);return we.bech32.encode("npub",r,1e3)}function Ml(t){Ye(t,64);let e=Oe.Buffer.from(t,"hex"),r=we.bech32.toWords(e);return we.bech32.encode("nsec",r,1e3)}function Hl(t){Ye(t,64);let e=Oe.Buffer.from(t,"hex"),r=we.bech32.toWords(e);return we.bech32.encode("note",r,1e3)}function Kl(t,e){Ye(t,64),e&&e.forEach(Gt);let r=wo({type:"nprofile",data:t,relays:e});return we.bech32.encode("nprofile",r,1e3)}function Vl(t,e,r,n){if(Ye(t,64),e&&e.forEach(Gt),r&&Ye(r,64),n!==void 0&&!Number.isInteger(n))throw new Error("Invalid event kind");let o=wo({type:"nevent",data:t,relays:e,author:r,kind:n});return we.bech32.encode("nevent",o,1e3)}function Fl(t,e,r,n){if(Ye(t,64),!Number.isInteger(e))throw new Error("Invalid event kind");if(!r)throw new Error("Identifier is required");n&&n.forEach(Gt);let o=wo({type:"naddr",data:t,kind:e,identifier:r,relays:n});return we.bech32.encode("naddr",o,1e3)}function $l(t){Gt(t);let e=Oe.Buffer.from(t,"utf8"),r=we.bech32.toWords(e);return we.bech32.encode("nrelay",r,1e3)}function ql(t){if(!t.includes("1"))throw new Error("Invalid bech32 string");let e=t.split("1")[0].toLowerCase();if(!Nl.includes(e))throw new Error("Unknown prefix");try{let r=we.bech32.decode(t,1e3),n=Oe.Buffer.from(we.bech32.fromWords(r.words)),o,i;switch(r.prefix){case"npub":case"nsec":case"note":return Ye(n.toString("hex"),64),{type:r.prefix,data:n.toString("hex")};case"nrelay":return o=n.toString("utf8"),Gt(o),{type:"nrelay",data:o};case"nprofile":case"nevent":case"naddr":return i=jl(r.prefix,n),i;default:throw new Error("Unknown prefix")}}catch(r){throw r instanceof Error?r:new Error("Invalid bech32 string")}}function Ye(t,e){if(!/^[0-9a-fA-F]+$/.test(t))throw new Error("Invalid hex string");if(e&&t.length!==e)throw new Error(`Invalid hex string length (expected ${e})`)}function Gt(t){try{let e=new URL(t);if(!["ws:","wss:"].includes(e.protocol))throw new Error("Invalid relay URL protocol")}catch{throw new Error("Invalid relay URL")}}function wo(t){let e=[],r=Oe.Buffer.from(t.data,"hex");if(e.push(Ge.SPECIAL,r.length),e.push(...r),t.relays?.length)for(let n of t.relays){let o=Oe.Buffer.from(n,"utf8");e.push(Ge.RELAY,o.length),e.push(...o)}if(t.author){let n=Oe.Buffer.from(t.author,"hex");e.push(Ge.AUTHOR,n.length),e.push(...n)}if(t.kind!==void 0){let n=Oe.Buffer.alloc(4);n.writeUInt32BE(t.kind),e.push(Ge.KIND,n.length),e.push(...n)}if(t.identifier){let n=Oe.Buffer.from(t.identifier,"utf8");e.push(Ge.IDENTIFIER,n.length),e.push(...n)}return we.bech32.toWords(Oe.Buffer.from(e))}function jl(t,e){let r={type:t,data:"",relays:[]},n=0,o;for(;ne.length)throw new Error("Invalid TLV data");let a=e.slice(n+2,n+2+s);switch(i){case Ge.SPECIAL:r.data=a.toString("hex"),Ye(r.data,64);break;case Ge.RELAY:o=a.toString("utf8"),Gt(o),r.relays=r.relays||[],r.relays.push(o);break;case Ge.AUTHOR:r.author=a.toString("hex"),Ye(r.author,64);break;case Ge.KIND:r.kind=a.readUInt32BE();break;case Ge.IDENTIFIER:r.identifier=a.toString("utf8");break;default:break}n+=2+s}return r}b();var st={};An(st,{calcPaddedLen:()=>tn,decrypt:()=>Do,encrypt:()=>No,getConversationKey:()=>Oo,v2:()=>ke});b();b();b();b();function Wl(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function jr(t){if(typeof t!="boolean")throw new Error(`boolean expected, not ${t}`)}function zr(t){if(!Number.isSafeInteger(t)||t<0)throw new Error("positive integer expected, got "+t)}function ue(t,e,r=""){let n=Wl(t),o=t?.length,i=e!==void 0;if(!n||i&&o!==e){let s=r&&`"${r}" `,a=i?` of length ${e}`:"",c=n?`length=${o}`:`type=${typeof t}`;throw new Error(s+"expected Uint8Array"+a+", got "+c)}return t}function bo(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function Vs(t,e){ue(t,void 0,"output");let r=e.outputLen;if(t.length{function r(n,...o){if(ue(n,void 0,"key"),!Yl)throw new Error("Non little-endian hardware is not yet supported");if(t.nonceLength!==void 0){let f=o[0];ue(f,t.varSizeNonce?void 0:t.nonceLength,"nonce")}let i=t.tagLength;i&&o[1]!==void 0&&ue(o[1],void 0,"AAD");let s=e(n,...o),a=(f,u)=>{if(u!==void 0){if(f!==2)throw new Error("cipher output not supported");ue(u,void 0,"output")}},c=!1;return{encrypt(f,u){if(c)throw new Error("cannot encrypt() twice with same key + nonce");return c=!0,ue(f),a(s.encrypt.length,u),s.encrypt(f,u)},decrypt(f,u){if(ue(f),i&&f.lengthUint8Array.from(t.split(""),e=>e.charCodeAt(0)),Jl=js("expand 16-byte k"),Xl=js("expand 32-byte k"),Ql=ot(Jl),eu=ot(Xl);function U(t,e){return t<>>32-e}function vo(t){return t.byteOffset%4===0}var Gr=64,tu=16,zs=2**32-1,qs=Uint32Array.of();function ru(t,e,r,n,o,i,s,a){let c=o.length,l=new Uint8Array(Gr),f=ot(l),u=vo(o)&&vo(i),h=u?ot(o):qs,d=u?ot(i):qs;for(let y=0;y=zs)throw new Error("arx: counter overflow");let p=Math.min(Gr,c-y);if(u&&p===Gr){let w=y/4;if(y%4!==0)throw new Error("arx: invalid block position");for(let k=0,O;k{ue(a,void 0,"key"),ue(c,void 0,"nonce"),ue(l,void 0,"data");let h=l.length;if(f===void 0&&(f=new Uint8Array(h)),ue(f,void 0,"output"),zr(u),u<0||u>=zs)throw new Error("arx: counter overflow");if(f.length>>13|n<<3)&8191,this.r[2]=(n>>>10|o<<6)&7939,this.r[3]=(o>>>7|i<<9)&8191,this.r[4]=(i>>>4|s<<12)&255,this.r[5]=s>>>1&8190,this.r[6]=(s>>>14|a<<2)&8191,this.r[7]=(a>>>11|c<<5)&8065,this.r[8]=(c>>>8|l<<8)&8191,this.r[9]=l>>>5&127;for(let f=0;f<8;f++)this.pad[f]=de(e,16+2*f)}process(e,r,n=!1){let o=n?0:2048,{h:i,r:s}=this,a=s[0],c=s[1],l=s[2],f=s[3],u=s[4],h=s[5],d=s[6],y=s[7],p=s[8],w=s[9],k=de(e,r+0),O=de(e,r+2),D=de(e,r+4),H=de(e,r+6),X=de(e,r+8),M=de(e,r+10),q=de(e,r+12),G=de(e,r+14),C=i[0]+(k&8191),$=i[1]+((k>>>13|O<<3)&8191),K=i[2]+((O>>>10|D<<6)&8191),P=i[3]+((D>>>7|H<<9)&8191),E=i[4]+((H>>>4|X<<12)&8191),x=i[5]+(X>>>1&8191),m=i[6]+((X>>>14|M<<2)&8191),A=i[7]+((M>>>11|q<<5)&8191),S=i[8]+((q>>>8|G<<8)&8191),I=i[9]+(G>>>5|o),v=0,B=v+C*a+$*(5*w)+K*(5*p)+P*(5*y)+E*(5*d);v=B>>>13,B&=8191,B+=x*(5*h)+m*(5*u)+A*(5*f)+S*(5*l)+I*(5*c),v+=B>>>13,B&=8191;let T=v+C*c+$*a+K*(5*w)+P*(5*p)+E*(5*y);v=T>>>13,T&=8191,T+=x*(5*d)+m*(5*h)+A*(5*u)+S*(5*f)+I*(5*l),v+=T>>>13,T&=8191;let L=v+C*l+$*c+K*a+P*(5*w)+E*(5*p);v=L>>>13,L&=8191,L+=x*(5*y)+m*(5*d)+A*(5*h)+S*(5*u)+I*(5*f),v+=L>>>13,L&=8191;let Y=v+C*f+$*l+K*c+P*a+E*(5*w);v=Y>>>13,Y&=8191,Y+=x*(5*p)+m*(5*y)+A*(5*d)+S*(5*h)+I*(5*u),v+=Y>>>13,Y&=8191;let z=v+C*u+$*f+K*l+P*c+E*a;v=z>>>13,z&=8191,z+=x*(5*w)+m*(5*p)+A*(5*y)+S*(5*d)+I*(5*h),v+=z>>>13,z&=8191;let V=v+C*h+$*u+K*f+P*l+E*c;v=V>>>13,V&=8191,V+=x*a+m*(5*w)+A*(5*p)+S*(5*y)+I*(5*d),v+=V>>>13,V&=8191;let Z=v+C*d+$*h+K*u+P*f+E*l;v=Z>>>13,Z&=8191,Z+=x*c+m*a+A*(5*w)+S*(5*p)+I*(5*y),v+=Z>>>13,Z&=8191;let ee=v+C*y+$*d+K*h+P*u+E*f;v=ee>>>13,ee&=8191,ee+=x*l+m*c+A*a+S*(5*w)+I*(5*p),v+=ee>>>13,ee&=8191;let fe=v+C*p+$*y+K*d+P*h+E*u;v=fe>>>13,fe&=8191,fe+=x*f+m*l+A*c+S*a+I*(5*w),v+=fe>>>13,fe&=8191;let J=v+C*w+$*p+K*y+P*d+E*h;v=J>>>13,J&=8191,J+=x*u+m*f+A*l+S*c+I*a,v+=J>>>13,J&=8191,v=(v<<2)+v|0,v=v+B|0,B=v&8191,v=v>>>13,T+=v,i[0]=B,i[1]=T,i[2]=L,i[3]=Y,i[4]=z,i[5]=V,i[6]=Z,i[7]=ee,i[8]=fe,i[9]=J}finalize(){let{h:e,pad:r}=this,n=new Uint16Array(10),o=e[1]>>>13;e[1]&=8191;for(let a=2;a<10;a++)e[a]+=o,o=e[a]>>>13,e[a]&=8191;e[0]+=o*5,o=e[0]>>>13,e[0]&=8191,e[1]+=o,o=e[1]>>>13,e[1]&=8191,e[2]+=o,n[0]=e[0]+5,o=n[0]>>>13,n[0]&=8191;for(let a=1;a<10;a++)n[a]=e[a]+o,o=n[a]>>>13,n[a]&=8191;n[9]-=8192;let i=(o^1)-1;for(let a=0;a<10;a++)n[a]&=i;i=~i;for(let a=0;a<10;a++)e[a]=e[a]&i|n[a];e[0]=(e[0]|e[1]<<13)&65535,e[1]=(e[1]>>>3|e[2]<<10)&65535,e[2]=(e[2]>>>6|e[3]<<7)&65535,e[3]=(e[3]>>>9|e[4]<<4)&65535,e[4]=(e[4]>>>12|e[5]<<1|e[6]<<14)&65535,e[5]=(e[6]>>>2|e[7]<<11)&65535,e[6]=(e[7]>>>5|e[8]<<8)&65535,e[7]=(e[8]>>>8|e[9]<<5)&65535;let s=e[0]+r[0];e[0]=s&65535;for(let a=1;a<8;a++)s=(e[a]+r[a]|0)+(s>>>16)|0,e[a]=s&65535;it(n)}update(e){bo(this),ue(e),e=Yt(e);let{buffer:r,blockLen:n}=this,o=e.length;for(let i=0;i>>0,e[i++]=n[s]>>>8;return e}digest(){let{buffer:e,outputLen:r}=this;this.digestInto(e);let n=e.slice(0,r);return this.destroy(),n}};function nu(t){let e=(n,o)=>t(o).update(n).digest(),r=t(new Uint8Array(32));return e.outputLen=r.outputLen,e.blockLen=r.blockLen,e.create=n=>t(n),e}var Ws=nu(t=>new Ao(t));function Zs(t,e,r,n,o,i=20){let s=t[0],a=t[1],c=t[2],l=t[3],f=e[0],u=e[1],h=e[2],d=e[3],y=e[4],p=e[5],w=e[6],k=e[7],O=o,D=r[0],H=r[1],X=r[2],M=s,q=a,G=c,C=l,$=f,K=u,P=h,E=d,x=y,m=p,A=w,S=k,I=O,v=D,B=H,T=X;for(let Y=0;Y{t.update(e);let r=e.length%16;r&&t.update(su.subarray(r))},au=new Uint8Array(32);function Ys(t,e,r,n,o){o!==void 0&&ue(o,void 0,"AAD");let i=t(e,r,au),s=$s(n.length,o?o.length:0,!0),a=Ws.create(i);o&&Gs(a,o),Gs(a,n),a.update(s);let c=a.digest();return it(i,s),c}var Js=t=>(e,r,n)=>({encrypt(i,s){let a=i.length;s=Eo(a+16,s,!1),s.set(i);let c=s.subarray(0,-16);t(e,r,c,c,1);let l=Ys(t,e,r,c,n);return s.set(l,a),it(l),s},decrypt(i,s){s=Eo(i.length-16,s,!1);let a=i.subarray(0,-16),c=i.subarray(-16),l=Ys(t,e,r,a,n);if(!Wr(c,l))throw new Error("invalid tag");return s.set(i.subarray(0,-16)),t(e,r,s,s,1),it(l),s}}),Vh=xo({blockSize:64,nonceLength:12,tagLength:16},Js(Yr)),Bo=xo({blockSize:64,nonceLength:24,tagLength:16},Js(iu));b();function Qs(t,e,r){return Qe(t),r===void 0&&(r=new Uint8Array(t.outputLen)),Fe(t,r,e)}var So=Uint8Array.of(0),Xs=Uint8Array.of();function ea(t,e,r,n=32){Qe(t),te(n,"length");let o=t.outputLen;if(n>255*o)throw new Error("Length must be <= 255*HashLen");let i=Math.ceil(n/o);r===void 0?r=Xs:F(r,void 0,"info");let s=new Uint8Array(i*o),a=Fe.create(t,e),c=a._cloneInto(),l=new Uint8Array(a.outputLen);for(let f=0;ftypeof r=="string"):e.every(r=>Number.isSafeInteger(r)):!1}function ia(t){if(typeof t!="function")throw new Error("function expected");return!0}function It(t,e){if(typeof e!="string")throw new Error(`${t}: string expected`);return!0}function Jt(t){if(!Number.isSafeInteger(t))throw new Error(`invalid integer: ${t}`)}function Jr(t){if(!Array.isArray(t))throw new Error("array expected")}function Xr(t,e){if(!oa(!0,e))throw new Error(`${t}: array of strings expected`)}function _o(t,e){if(!oa(!1,e))throw new Error(`${t}: array of numbers expected`)}function Lo(...t){let e=i=>i,r=(i,s)=>a=>i(s(a)),n=t.map(i=>i.encode).reduceRight(r,e),o=t.map(i=>i.decode).reduce(r,e);return{encode:n,decode:o}}function Uo(t){let e=typeof t=="string"?t.split(""):t,r=e.length;Xr("alphabet",e);let n=new Map(e.map((o,i)=>[o,i]));return{encode:o=>(Jr(o),o.map(i=>{if(!Number.isSafeInteger(i)||i<0||i>=r)throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${t}`);return e[i]})),decode:o=>(Jr(o),o.map(i=>{It("alphabet.decode",i);let s=n.get(i);if(s===void 0)throw new Error(`Unknown letter: "${i}". Allowed: ${t}`);return s}))}}function Po(t=""){return It("join",t),{encode:e=>(Xr("join.decode",e),e.join(t)),decode:e=>(It("join.decode",e),e.split(t))}}function sa(t,e="="){return Jt(t),It("padding",e),{encode(r){for(Xr("padding.encode",r);r.length*t%8;)r.push(e);return r},decode(r){Xr("padding.decode",r);let n=r.length;if(n*t%8)throw new Error("padding: invalid, string should have whole number of bytes");for(;n>0&&r[n-1]===e;n--)if((n-1)*t%8===0)throw new Error("padding: invalid, string has too much padding");return r.slice(0,n)}}}function Io(t,e,r){if(e<2)throw new Error(`convertRadix: invalid from=${e}, base cannot be less than 2`);if(r<2)throw new Error(`convertRadix: invalid to=${r}, base cannot be less than 2`);if(Jr(t),!t.length)return[];let n=0,o=[],i=Array.from(t,a=>{if(Jt(a),a<0||a>=e)throw new Error(`invalid integer: ${a}`);return a}),s=i.length;for(;;){let a=0,c=!0;for(let l=n;le===0?t:aa(e,t%e),Qr=(t,e)=>t+(e-aa(t,e)),Zr=(()=>{let t=[];for(let e=0;e<40;e++)t.push(2**e);return t})();function en(t,e,r,n){if(Jr(t),e<=0||e>32)throw new Error(`convertRadix2: wrong from=${e}`);if(r<=0||r>32)throw new Error(`convertRadix2: wrong to=${r}`);if(Qr(e,r)>32)throw new Error(`convertRadix2: carry overflow from=${e} to=${r} carryBits=${Qr(e,r)}`);let o=0,i=0,s=Zr[e],a=Zr[r]-1,c=[];for(let l of t){if(Jt(l),l>=s)throw new Error(`convertRadix2: invalid data word=${l} from=${e}`);if(o=o<32)throw new Error(`convertRadix2: carry overflow pos=${i} from=${e}`);for(i+=e;i>=r;i-=r)c.push((o>>i-r&a)>>>0);let f=Zr[i];if(f===void 0)throw new Error("invalid carry");o&=f-1}if(o=o<=e)throw new Error("Excess padding");if(!n&&o>0)throw new Error(`Non-zero padding: ${o}`);return n&&i>0&&c.push(o>>>0),c}function lu(t){Jt(t);let e=2**8;return{encode:r=>{if(!Zt(r))throw new Error("radix.encode input should be Uint8Array");return Io(Array.from(r),e,t)},decode:r=>(_o("radix.decode",r),Uint8Array.from(Io(r,t,e)))}}function Ro(t,e=!1){if(Jt(t),t<=0||t>32)throw new Error("radix2: bits should be in (0..32]");if(Qr(8,t)>32||Qr(t,8)>32)throw new Error("radix2: carry overflow");return{encode:r=>{if(!Zt(r))throw new Error("radix2.encode input should be Uint8Array");return en(Array.from(r),8,t,!e)},decode:r=>(_o("radix2.decode",r),Uint8Array.from(en(r,t,8,e)))}}function ta(t){return ia(t),function(...e){try{return t.apply(null,e)}catch{}}}function uu(t,e){return Jt(t),ia(e),{encode(r){if(!Zt(r))throw new Error("checksum.encode: input should be Uint8Array");let n=e(r).slice(0,t),o=new Uint8Array(r.length+t);return o.set(r),o.set(n,r.length),o},decode(r){if(!Zt(r))throw new Error("checksum.decode: input should be Uint8Array");let n=r.slice(0,-t),o=r.slice(-t),i=e(n).slice(0,t);for(let s=0;s{It("base64",t);let r=e?/^[A-Za-z0-9=_-]+$/:/^[A-Za-z0-9=+/]+$/,n=e?"base64url":"base64";if(t.length>0&&!r.test(t))throw new Error("invalid base64");return Uint8Array.fromBase64(t,{alphabet:n,lastChunkHandling:"strict"})},Co=fu?{encode(t){return cu(t),t.toBase64()},decode(t){return du(t,!1)}}:Lo(Ro(6),Uo("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),sa(6),Po(""));var To=Lo(Uo("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),Po("")),ra=[996825010,642813549,513874426,1027748829,705979059];function fr(t){let e=t>>25,r=(t&33554431)<<5;for(let n=0;n>n&1)===1&&(r^=ra[n]);return r}function na(t,e,r=1){let n=t.length,o=1;for(let i=0;i126)throw new Error(`Invalid prefix (${t})`);o=fr(o)^s>>5}o=fr(o);for(let i=0;id)throw new TypeError(`Length ${p} exceeds limit ${d}`);let w=u.toLowerCase(),k=na(w,h,e);return`${w}1${To.encode(h)}${k}`}function a(u,h=90){It("bech32.decode input",u);let d=u.length;if(d<8||h!==!1&&d>h)throw new TypeError(`invalid string length: ${d} (${u}). Expected (8..${h})`);let y=u.toLowerCase();if(u!==y&&u!==u.toUpperCase())throw new Error("String must be lowercase or uppercase");let p=y.lastIndexOf("1");if(p===0||p===-1)throw new Error('Letter "1" must be present between prefix and data only');let w=y.slice(0,p),k=y.slice(p+1);if(k.length<6)throw new Error("Data must be at least 6 characters long");let O=To.decode(k).slice(0,-6),D=na(w,O,e);if(!k.endsWith(D))throw new Error(`Invalid checksum in ${u}: expected "${D}"`);return{prefix:w,words:O}}let c=ta(a);function l(u){let{prefix:h,words:d}=a(u,!1);return{prefix:h,words:d,bytes:n(d)}}function f(u,h){return s(u,o(h))}return{encode:s,decode:a,encodeFromBytes:f,decodeToBytes:l,decodeUnsafe:c,fromWords:n,fromWordsUnsafe:i,toWords:o}}var hr=hu("bech32");var ca=new TextEncoder,pu=new TextDecoder,la=1,ua=65535;function tn(t){if(!Number.isSafeInteger(t)||t<1)throw new Error("expected positive integer");if(t<=32)return 32;let e=1<ua)throw new Error("invalid plaintext length: must be between 1 and 65535 bytes");let n=new Uint8Array(2);new DataView(n.buffer).setUint16(0,r,!1);let o=new Uint8Array(tn(r)-r);return ie(n,e,o)}function gu(t){let e=new DataView(t.buffer,t.byteOffset).getUint16(0,!1),r=t.subarray(2,2+e);if(eua||r.length!==e||t.length!==2+tn(e))throw new Error("invalid padding");return pu.decode(r)}function Oo(t,e){let n=kt.getSharedSecret(t,oe("02"+e)).subarray(1,33);return Qs(pe,n,ca.encode("nip44-v2"))}function fa(t,e){let r=ea(pe,t,e,76);return{chacha_key:r.subarray(0,32),chacha_nonce:r.subarray(32,44),hmac_key:r.subarray(44,76)}}function No(t,e,r=ge(32)){let{chacha_key:n,chacha_nonce:o,hmac_key:i}=fa(e,r),s=yu(t),a=Yr(n,o,s),c=Fe(pe,i,ie(r,a));return Co.encode(ie(new Uint8Array([2]),r,a,c))}function Do(t,e){let r=Co.decode(t),n=r[0];if(n!==2)throw new Error(`unknown encryption version: ${n}`);if(r.length<99||r.length>65603)throw new Error("invalid payload size");let o=r.subarray(1,33),i=r.subarray(33,r.length-32),s=r.subarray(r.length-32),{chacha_key:a,chacha_nonce:c,hmac_key:l}=fa(e,o),f=Fe(pe,l,ie(o,i));if(!Wr(s,f))throw new Error("invalid MAC");let u=Yr(a,c,i);return gu(u)}var ke={utils:{getConversationKey:Oo,calcPaddedLen:tn},encrypt:No,decrypt:Do};b();b();b();b();function bu(t,e,r,n){Qe(t);let o=Ar({dkLen:32,asyncTick:10},n),{c:i,dkLen:s,asyncTick:a}=o;if(te(i,"c"),te(s,"dkLen"),te(a,"asyncTick"),i<1)throw new Error("iterations (c) must be >= 1");let c=In(e,"password"),l=In(r,"salt"),f=new Uint8Array(s),u=Fe.create(t,c),h=u._cloneInto().update(l);return{c:i,dkLen:s,asyncTick:a,DK:f,PRF:u,PRFSalt:h}}function xu(t,e,r,n,o){return t.destroy(),e.destroy(),n&&n.destroy(),Be(o),r}function Mo(t,e,r,n){let{c:o,dkLen:i,DK:s,PRF:a,PRFSalt:c}=bu(t,e,r,n),l,f=new Uint8Array(4),u=Nt(f),h=new Uint8Array(a.outputLen);for(let d=1,y=0;y0&&(s+=16),da(r,i,t,e+=16,r,s)}function Eu(t,e,r){let n=Ar({dkLen:32,asyncTick:10,maxmem:1073742848},r),{N:o,r:i,p:s,dkLen:a,asyncTick:c,maxmem:l,onProgress:f}=n;if(te(o,"N"),te(i,"r"),te(s,"p"),te(a,"dkLen"),te(c,"asyncTick"),te(l,"maxmem"),f!==void 0&&typeof f!="function")throw new Error("progressCb must be a function");let u=128*i,h=u/4,d=Math.pow(2,32);if(o<=1||(o&o-1)!==0||o>d)throw new Error('"N" expected a power of 2, and 2^1 <= N <= 2^32');if(s<1||s>(d-1)*32/u)throw new Error('"p" expected integer 1..((2^32 - 1) * 32) / (128 * r)');if(a<1||a>(d-1)*32)throw new Error('"dkLen" expected integer 1..(2^32 - 1) * 32');if(u*(o+s)>l)throw new Error('"maxmem" limit was hit, expected 128*r*(N+p) <= "maxmem"='+l);let p=Mo(pe,t,e,{c:1,dkLen:u*s}),w=kr(p),k=kr(new Uint8Array(u*o)),O=kr(new Uint8Array(u)),D=()=>{};if(f){let H=2*o*s,X=Math.max(Math.floor(H/1e4),1),M=0;D=()=>{M++,f&&(!(M%X)||M===H)&&f(M/H)}}return{N:o,r:i,p:s,dkLen:a,blockSize32:h,V:k,B32:w,B:p,tmp:O,blockMixCb:D,asyncTick:c}}function vu(t,e,r,n,o){let i=Mo(pe,t,r,{c:1,dkLen:e});return Be(r,n,o),i}function Ko(t,e,r){let{N:n,r:o,p:i,dkLen:s,blockSize32:a,V:c,B32:l,B:f,tmp:u,blockMixCb:h}=Eu(t,e,r);Sn(l);for(let d=0;d>>0;for(let k=0;ke.toString(16).padStart(2,"0")).join("")}b();b();var Au=t=>t[0]==="\u3042\u3044\u3053\u304F\u3057\u3093";function Bu(t){if(typeof t!="string")throw new TypeError("invalid mnemonic type: "+typeof t);return t.normalize("NFKD")}function Su(t){let e=Bu(t),r=e.split(" ");if(![12,15,18,21,24].includes(r.length))throw new Error("Invalid mnemonic");return{nfkd:e,words:r}}function ya(t){if(F(t),![16,20,24,28,32].includes(t.length))throw new Error("invalid entropy length")}var Iu=t=>{let e=8-t.length/4;return new Uint8Array([pe(t)[0]>>e<{if(typeof e!="string")throw new Error("wordlist: non-string element: "+e)}),dr.chain(dr.checksum(1,Iu),dr.radix2(11,!0),dr.alphabet(t))}function Vo(t,e){let{words:r}=Su(t),n=ga(e).decode(r);return ya(n),n}function ma(t,e){return ya(t),ga(e).encode(t).join(Au(e)?"\u3000":" ")}function wa(t,e){try{Vo(t,e)}catch{return!1}return!0}b();var rn=`abandon +(() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; + }; + var __commonJS = (cb, mod2) => function __require() { + return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; + }; + var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target, + mod2 + )); + + // src/shims/process.js + var process; + var init_process = __esm({ + "src/shims/process.js"() { + process = { + env: { NODE_ENV: "production", LOG_LEVEL: "warn" }, + browser: true, + version: "", + stdout: null, + stderr: null, + nextTick: function(fn) { + var args = Array.prototype.slice.call(arguments, 1); + Promise.resolve().then(function() { + fn.apply(null, args); + }); + } + }; + } + }); + + // node_modules/quick-format-unescaped/index.js + var require_quick_format_unescaped = __commonJS({ + "node_modules/quick-format-unescaped/index.js"(exports, module) { + "use strict"; + init_process(); + function tryStringify(o) { + try { + return JSON.stringify(o); + } catch (e) { + return '"[Circular]"'; + } + } + module.exports = format; + function format(f, args, opts) { + var ss = opts && opts.stringify || tryStringify; + var offset = 1; + if (typeof f === "object" && f !== null) { + var len = args.length + offset; + if (len === 1) return f; + var objects = new Array(len); + objects[0] = ss(f); + for (var index = 1; index < len; index++) { + objects[index] = ss(args[index]); + } + return objects.join(" "); + } + if (typeof f !== "string") { + return f; + } + var argLen = args.length; + if (argLen === 0) return f; + var str = ""; + var a = 1 - offset; + var lastPos = -1; + var flen = f && f.length || 0; + for (var i = 0; i < flen; ) { + if (f.charCodeAt(i) === 37 && i + 1 < flen) { + lastPos = lastPos > -1 ? lastPos : 0; + switch (f.charCodeAt(i + 1)) { + case 100: + // 'd' + case 102: + if (a >= argLen) + break; + if (args[a] == null) break; + if (lastPos < i) + str += f.slice(lastPos, i); + str += Number(args[a]); + lastPos = i + 2; + i++; + break; + case 105: + if (a >= argLen) + break; + if (args[a] == null) break; + if (lastPos < i) + str += f.slice(lastPos, i); + str += Math.floor(Number(args[a])); + lastPos = i + 2; + i++; + break; + case 79: + // 'O' + case 111: + // 'o' + case 106: + if (a >= argLen) + break; + if (args[a] === void 0) break; + if (lastPos < i) + str += f.slice(lastPos, i); + var type = typeof args[a]; + if (type === "string") { + str += "'" + args[a] + "'"; + lastPos = i + 2; + i++; + break; + } + if (type === "function") { + str += args[a].name || ""; + lastPos = i + 2; + i++; + break; + } + str += ss(args[a]); + lastPos = i + 2; + i++; + break; + case 115: + if (a >= argLen) + break; + if (lastPos < i) + str += f.slice(lastPos, i); + str += String(args[a]); + lastPos = i + 2; + i++; + break; + case 37: + if (lastPos < i) + str += f.slice(lastPos, i); + str += "%"; + lastPos = i + 2; + i++; + a--; + break; + } + ++a; + } + ++i; + } + if (lastPos === -1) + return f; + else if (lastPos < flen) { + str += f.slice(lastPos); + } + return str; + } + } + }); + + // node_modules/pino/browser.js + var require_browser = __commonJS({ + "node_modules/pino/browser.js"(exports, module) { + "use strict"; + init_process(); + var format = require_quick_format_unescaped(); + module.exports = pino2; + var _console = pfGlobalThisOrFallback().console || {}; + var stdSerializers = { + mapHttpRequest: mock, + mapHttpResponse: mock, + wrapRequestSerializer: passthrough, + wrapResponseSerializer: passthrough, + wrapErrorSerializer: passthrough, + req: mock, + res: mock, + err: asErrValue, + errWithCause: asErrValue + }; + function levelToValue(level, logger2) { + return level === "silent" ? Infinity : logger2.levels.values[level]; + } + var baseLogFunctionSymbol = /* @__PURE__ */ Symbol("pino.logFuncs"); + var hierarchySymbol = /* @__PURE__ */ Symbol("pino.hierarchy"); + var logFallbackMap = { + error: "log", + fatal: "error", + warn: "error", + info: "log", + debug: "log", + trace: "log" + }; + function appendChildLogger(parentLogger, childLogger) { + const newEntry = { + logger: childLogger, + parent: parentLogger[hierarchySymbol] + }; + childLogger[hierarchySymbol] = newEntry; + } + function setupBaseLogFunctions(logger2, levels, proto) { + const logFunctions = {}; + levels.forEach((level) => { + logFunctions[level] = proto[level] ? proto[level] : _console[level] || _console[logFallbackMap[level] || "log"] || noop; + }); + logger2[baseLogFunctionSymbol] = logFunctions; + } + function shouldSerialize(serialize, serializers) { + if (Array.isArray(serialize)) { + const hasToFilter = serialize.filter(function(k) { + return k !== "!stdSerializers.err"; + }); + return hasToFilter; + } else if (serialize === true) { + return Object.keys(serializers); + } + return false; + } + function pino2(opts) { + opts = opts || {}; + opts.browser = opts.browser || {}; + const transmit2 = opts.browser.transmit; + if (transmit2 && typeof transmit2.send !== "function") { + throw Error("pino: transmit option must have a send function"); + } + const proto = opts.browser.write || _console; + if (opts.browser.write) opts.browser.asObject = true; + const serializers = opts.serializers || {}; + const serialize = shouldSerialize(opts.browser.serialize, serializers); + let stdErrSerialize = opts.browser.serialize; + if (Array.isArray(opts.browser.serialize) && opts.browser.serialize.indexOf("!stdSerializers.err") > -1) stdErrSerialize = false; + const customLevels = Object.keys(opts.customLevels || {}); + const levels = ["error", "fatal", "warn", "info", "debug", "trace"].concat(customLevels); + if (typeof proto === "function") { + levels.forEach(function(level2) { + proto[level2] = proto; + }); + } + if (opts.enabled === false || opts.browser.disabled) opts.level = "silent"; + const level = opts.level || "info"; + const logger2 = Object.create(proto); + if (!logger2.log) logger2.log = noop; + setupBaseLogFunctions(logger2, levels, proto); + appendChildLogger({}, logger2); + Object.defineProperty(logger2, "levelVal", { + get: getLevelVal + }); + Object.defineProperty(logger2, "level", { + get: getLevel, + set: setLevel + }); + const setOpts = { + transmit: transmit2, + serialize, + asObject: opts.browser.asObject, + asObjectBindingsOnly: opts.browser.asObjectBindingsOnly, + formatters: opts.browser.formatters, + reportCaller: opts.browser.reportCaller, + levels, + timestamp: getTimeFunction(opts), + messageKey: opts.messageKey || "msg", + onChild: opts.onChild || noop + }; + logger2.levels = getLevels(opts); + logger2.level = level; + logger2.isLevelEnabled = function(level2) { + if (!this.levels.values[level2]) { + return false; + } + return this.levels.values[level2] >= this.levels.values[this.level]; + }; + logger2.setMaxListeners = logger2.getMaxListeners = logger2.emit = logger2.addListener = logger2.on = logger2.prependListener = logger2.once = logger2.prependOnceListener = logger2.removeListener = logger2.removeAllListeners = logger2.listeners = logger2.listenerCount = logger2.eventNames = logger2.write = logger2.flush = noop; + logger2.serializers = serializers; + logger2._serialize = serialize; + logger2._stdErrSerialize = stdErrSerialize; + logger2.child = function(...args) { + return child.call(this, setOpts, ...args); + }; + if (transmit2) logger2._logEvent = createLogEventShape(); + function getLevelVal() { + return levelToValue(this.level, this); + } + function getLevel() { + return this._level; + } + function setLevel(level2) { + if (level2 !== "silent" && !this.levels.values[level2]) { + throw Error("unknown level " + level2); + } + this._level = level2; + set(this, setOpts, logger2, "error"); + set(this, setOpts, logger2, "fatal"); + set(this, setOpts, logger2, "warn"); + set(this, setOpts, logger2, "info"); + set(this, setOpts, logger2, "debug"); + set(this, setOpts, logger2, "trace"); + customLevels.forEach((level3) => { + set(this, setOpts, logger2, level3); + }); + } + function child(setOpts2, bindings, childOptions) { + if (!bindings) { + throw new Error("missing bindings for child Pino"); + } + childOptions = childOptions || {}; + if (serialize && bindings.serializers) { + childOptions.serializers = bindings.serializers; + } + const childOptionsSerializers = childOptions.serializers; + if (serialize && childOptionsSerializers) { + var childSerializers = Object.assign({}, serializers, childOptionsSerializers); + var childSerialize = opts.browser.serialize === true ? Object.keys(childSerializers) : serialize; + delete bindings.serializers; + applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize); + } + function Child(parent) { + this._childLevel = (parent._childLevel | 0) + 1; + this.bindings = bindings; + if (childSerializers) { + this.serializers = childSerializers; + this._serialize = childSerialize; + } + if (transmit2) { + this._logEvent = createLogEventShape( + [].concat(parent._logEvent.bindings, bindings) + ); + } + } + Child.prototype = this; + const newLogger = new Child(this); + appendChildLogger(this, newLogger); + newLogger.child = function(...args) { + return child.call(this, setOpts2, ...args); + }; + newLogger.level = childOptions.level || this.level; + setOpts2.onChild(newLogger); + return newLogger; + } + return logger2; + } + function getLevels(opts) { + const customLevels = opts.customLevels || {}; + const values = Object.assign({}, pino2.levels.values, customLevels); + const labels = Object.assign({}, pino2.levels.labels, invertObject(customLevels)); + return { + values, + labels + }; + } + function invertObject(obj) { + const inverted = {}; + Object.keys(obj).forEach(function(key) { + inverted[obj[key]] = key; + }); + return inverted; + } + pino2.levels = { + values: { + fatal: 60, + error: 50, + warn: 40, + info: 30, + debug: 20, + trace: 10 + }, + labels: { + 10: "trace", + 20: "debug", + 30: "info", + 40: "warn", + 50: "error", + 60: "fatal" + } + }; + pino2.stdSerializers = stdSerializers; + pino2.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime }); + function getBindingChain(logger2) { + const bindings = []; + if (logger2.bindings) { + bindings.push(logger2.bindings); + } + let hierarchy = logger2[hierarchySymbol]; + while (hierarchy.parent) { + hierarchy = hierarchy.parent; + if (hierarchy.logger.bindings) { + bindings.push(hierarchy.logger.bindings); + } + } + return bindings.reverse(); + } + function set(self2, opts, rootLogger, level) { + Object.defineProperty(self2, level, { + value: levelToValue(self2.level, rootLogger) > levelToValue(level, rootLogger) ? noop : rootLogger[baseLogFunctionSymbol][level], + writable: true, + enumerable: true, + configurable: true + }); + if (self2[level] === noop) { + if (!opts.transmit) return; + const transmitLevel = opts.transmit.level || self2.level; + const transmitValue = levelToValue(transmitLevel, rootLogger); + const methodValue = levelToValue(level, rootLogger); + if (methodValue < transmitValue) return; + } + self2[level] = createWrap(self2, opts, rootLogger, level); + const bindings = getBindingChain(self2); + if (bindings.length === 0) { + return; + } + self2[level] = prependBindingsInArguments(bindings, self2[level]); + } + function prependBindingsInArguments(bindings, logFunc) { + return function() { + return logFunc.apply(this, [...bindings, ...arguments]); + }; + } + function createWrap(self2, opts, rootLogger, level) { + return /* @__PURE__ */ (function(write) { + return function LOG() { + const ts = opts.timestamp(); + const args = new Array(arguments.length); + const proto = Object.getPrototypeOf && Object.getPrototypeOf(this) === _console ? _console : this; + for (var i = 0; i < args.length; i++) args[i] = arguments[i]; + var argsIsSerialized = false; + if (opts.serialize) { + applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize); + argsIsSerialized = true; + } + if (opts.asObject || opts.formatters) { + const out = asObject(this, level, args, ts, opts); + if (opts.reportCaller && out && out.length > 0 && out[0] && typeof out[0] === "object") { + try { + const caller = getCallerLocation(); + if (caller) out[0].caller = caller; + } catch (e) { + } + } + write.call(proto, ...out); + } else { + if (opts.reportCaller) { + try { + const caller = getCallerLocation(); + if (caller) args.push(caller); + } catch (e) { + } + } + write.apply(proto, args); + } + if (opts.transmit) { + const transmitLevel = opts.transmit.level || self2._level; + const transmitValue = levelToValue(transmitLevel, rootLogger); + const methodValue = levelToValue(level, rootLogger); + if (methodValue < transmitValue) return; + transmit(this, { + ts, + methodLevel: level, + methodValue, + transmitLevel, + transmitValue: rootLogger.levels.values[opts.transmit.level || self2._level], + send: opts.transmit.send, + val: levelToValue(self2._level, rootLogger) + }, args, argsIsSerialized); + } + }; + })(self2[baseLogFunctionSymbol][level]); + } + function asObject(logger2, level, args, ts, opts) { + const { + level: levelFormatter, + log: logObjectFormatter = (obj) => obj + } = opts.formatters || {}; + const argsCloned = args.slice(); + let msg = argsCloned[0]; + const logObject = {}; + let lvl = (logger2._childLevel | 0) + 1; + if (lvl < 1) lvl = 1; + if (ts) { + logObject.time = ts; + } + if (levelFormatter) { + const formattedLevel = levelFormatter(level, logger2.levels.values[level]); + Object.assign(logObject, formattedLevel); + } else { + logObject.level = logger2.levels.values[level]; + } + if (opts.asObjectBindingsOnly) { + if (msg !== null && typeof msg === "object") { + while (lvl-- && typeof argsCloned[0] === "object") { + Object.assign(logObject, argsCloned.shift()); + } + } + const formattedLogObject = logObjectFormatter(logObject); + return [formattedLogObject, ...argsCloned]; + } else { + if (msg !== null && typeof msg === "object") { + while (lvl-- && typeof argsCloned[0] === "object") { + Object.assign(logObject, argsCloned.shift()); + } + msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : void 0; + } else if (typeof msg === "string") msg = format(argsCloned.shift(), argsCloned); + if (msg !== void 0) logObject[opts.messageKey] = msg; + const formattedLogObject = logObjectFormatter(logObject); + return [formattedLogObject]; + } + } + function applySerializers(args, serialize, serializers, stdErrSerialize) { + for (const i in args) { + if (stdErrSerialize && args[i] instanceof Error) { + args[i] = pino2.stdSerializers.err(args[i]); + } else if (typeof args[i] === "object" && !Array.isArray(args[i]) && serialize) { + for (const k in args[i]) { + if (serialize.indexOf(k) > -1 && k in serializers) { + args[i][k] = serializers[k](args[i][k]); + } + } + } + } + } + function transmit(logger2, opts, args, argsIsSerialized = false) { + const send = opts.send; + const ts = opts.ts; + const methodLevel = opts.methodLevel; + const methodValue = opts.methodValue; + const val = opts.val; + const bindings = logger2._logEvent.bindings; + if (!argsIsSerialized) { + applySerializers( + args, + logger2._serialize || Object.keys(logger2.serializers), + logger2.serializers, + logger2._stdErrSerialize === void 0 ? true : logger2._stdErrSerialize + ); + } + logger2._logEvent.ts = ts; + logger2._logEvent.messages = args.filter(function(arg) { + return bindings.indexOf(arg) === -1; + }); + logger2._logEvent.level.label = methodLevel; + logger2._logEvent.level.value = methodValue; + send(methodLevel, logger2._logEvent, val); + logger2._logEvent = createLogEventShape(bindings); + } + function createLogEventShape(bindings) { + return { + ts: 0, + messages: [], + bindings: bindings || [], + level: { label: "", value: 0 } + }; + } + function asErrValue(err) { + const obj = { + type: err.constructor.name, + msg: err.message, + stack: err.stack + }; + for (const key in err) { + if (obj[key] === void 0) { + obj[key] = err[key]; + } + } + return obj; + } + function getTimeFunction(opts) { + if (typeof opts.timestamp === "function") { + return opts.timestamp; + } + if (opts.timestamp === false) { + return nullTime; + } + return epochTime; + } + function mock() { + return {}; + } + function passthrough(a) { + return a; + } + function noop() { + } + function nullTime() { + return false; + } + function epochTime() { + return Date.now(); + } + function unixTime() { + return Math.round(Date.now() / 1e3); + } + function isoTime() { + return new Date(Date.now()).toISOString(); + } + function pfGlobalThisOrFallback() { + function defd(o) { + return typeof o !== "undefined" && o; + } + try { + if (typeof globalThis !== "undefined") return globalThis; + Object.defineProperty(Object.prototype, "globalThis", { + get: function() { + delete Object.prototype.globalThis; + return this.globalThis = this; + }, + configurable: true + }); + return globalThis; + } catch (e) { + return defd(self) || defd(window) || defd(this) || {}; + } + } + module.exports.default = pino2; + module.exports.pino = pino2; + function getCallerLocation() { + const stack = new Error().stack; + if (!stack) return null; + const lines = stack.split("\n"); + for (let i = 1; i < lines.length; i++) { + const l = lines[i].trim(); + if (/(^at\s+)?(createWrap|LOG|set\s*\(|asObject|Object\.apply|Function\.apply)/.test(l)) continue; + if (l.indexOf("browser.js") !== -1) continue; + if (l.indexOf("node:internal") !== -1) continue; + if (l.indexOf("node_modules") !== -1) continue; + let m = l.match(/\((.*?):(\d+):(\d+)\)/); + if (!m) m = l.match(/at\s+(.*?):(\d+):(\d+)/); + if (m) { + const file = m[1]; + const line = m[2]; + const col = m[3]; + return file + ":" + line + ":" + col; + } + } + return null; + } + } + }); + + // node-stub:crypto + var require_crypto = __commonJS({ + "node-stub:crypto"(exports, module) { + init_process(); + module.exports = {}; + } + }); + + // node_modules/bech32/dist/index.js + var require_dist = __commonJS({ + "node_modules/bech32/dist/index.js"(exports) { + "use strict"; + init_process(); + Object.defineProperty(exports, "__esModule", { value: true }); + exports.bech32m = exports.bech32 = void 0; + var ALPHABET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; + var ALPHABET_MAP = {}; + for (let z = 0; z < ALPHABET.length; z++) { + const x = ALPHABET.charAt(z); + ALPHABET_MAP[x] = z; + } + function polymodStep(pre) { + const b = pre >> 25; + return (pre & 33554431) << 5 ^ -(b >> 0 & 1) & 996825010 ^ -(b >> 1 & 1) & 642813549 ^ -(b >> 2 & 1) & 513874426 ^ -(b >> 3 & 1) & 1027748829 ^ -(b >> 4 & 1) & 705979059; + } + function prefixChk(prefix) { + let chk = 1; + for (let i = 0; i < prefix.length; ++i) { + const c = prefix.charCodeAt(i); + if (c < 33 || c > 126) + return "Invalid prefix (" + prefix + ")"; + chk = polymodStep(chk) ^ c >> 5; + } + chk = polymodStep(chk); + for (let i = 0; i < prefix.length; ++i) { + const v = prefix.charCodeAt(i); + chk = polymodStep(chk) ^ v & 31; + } + return chk; + } + function convert(data, inBits, outBits, pad2) { + let value = 0; + let bits = 0; + const maxV = (1 << outBits) - 1; + const result = []; + for (let i = 0; i < data.length; ++i) { + value = value << inBits | data[i]; + bits += inBits; + while (bits >= outBits) { + bits -= outBits; + result.push(value >> bits & maxV); + } + } + if (pad2) { + if (bits > 0) { + result.push(value << outBits - bits & maxV); + } + } else { + if (bits >= inBits) + return "Excess padding"; + if (value << outBits - bits & maxV) + return "Non-zero padding"; + } + return result; + } + function toWords(bytes) { + return convert(bytes, 8, 5, true); + } + function fromWordsUnsafe(words) { + const res = convert(words, 5, 8, false); + if (Array.isArray(res)) + return res; + } + function fromWords(words) { + const res = convert(words, 5, 8, false); + if (Array.isArray(res)) + return res; + throw new Error(res); + } + function getLibraryFromEncoding(encoding) { + let ENCODING_CONST; + if (encoding === "bech32") { + ENCODING_CONST = 1; + } else { + ENCODING_CONST = 734539939; + } + function encode(prefix, words, LIMIT) { + LIMIT = LIMIT || 90; + if (prefix.length + 7 + words.length > LIMIT) + throw new TypeError("Exceeds length limit"); + prefix = prefix.toLowerCase(); + let chk = prefixChk(prefix); + if (typeof chk === "string") + throw new Error(chk); + let result = prefix + "1"; + for (let i = 0; i < words.length; ++i) { + const x = words[i]; + if (x >> 5 !== 0) + throw new Error("Non 5-bit word"); + chk = polymodStep(chk) ^ x; + result += ALPHABET.charAt(x); + } + for (let i = 0; i < 6; ++i) { + chk = polymodStep(chk); + } + chk ^= ENCODING_CONST; + for (let i = 0; i < 6; ++i) { + const v = chk >> (5 - i) * 5 & 31; + result += ALPHABET.charAt(v); + } + return result; + } + function __decode(str, LIMIT) { + LIMIT = LIMIT || 90; + if (str.length < 8) + return str + " too short"; + if (str.length > LIMIT) + return "Exceeds length limit"; + const lowered = str.toLowerCase(); + const uppered = str.toUpperCase(); + if (str !== lowered && str !== uppered) + return "Mixed-case string " + str; + str = lowered; + const split = str.lastIndexOf("1"); + if (split === -1) + return "No separator character for " + str; + if (split === 0) + return "Missing prefix for " + str; + const prefix = str.slice(0, split); + const wordChars = str.slice(split + 1); + if (wordChars.length < 6) + return "Data too short"; + let chk = prefixChk(prefix); + if (typeof chk === "string") + return chk; + const words = []; + for (let i = 0; i < wordChars.length; ++i) { + const c = wordChars.charAt(i); + const v = ALPHABET_MAP[c]; + if (v === void 0) + return "Unknown character " + c; + chk = polymodStep(chk) ^ v; + if (i + 6 >= wordChars.length) + continue; + words.push(v); + } + if (chk !== ENCODING_CONST) + return "Invalid checksum for " + str; + return { prefix, words }; + } + function decodeUnsafe(str, LIMIT) { + const res = __decode(str, LIMIT); + if (typeof res === "object") + return res; + } + function decode2(str, LIMIT) { + const res = __decode(str, LIMIT); + if (typeof res === "object") + return res; + throw new Error(res); + } + return { + decodeUnsafe, + decode: decode2, + encode, + toWords, + fromWordsUnsafe, + fromWords + }; + } + exports.bech32 = getLibraryFromEncoding("bech32"); + exports.bech32m = getLibraryFromEncoding("bech32m"); + } + }); + + // node_modules/base64-js/index.js + var require_base64_js = __commonJS({ + "node_modules/base64-js/index.js"(exports) { + "use strict"; + init_process(); + exports.byteLength = byteLength; + exports.toByteArray = toByteArray; + exports.fromByteArray = fromByteArray; + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array; + var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + for (i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + var i; + var len; + revLookup["-".charCodeAt(0)] = 62; + revLookup["_".charCodeAt(0)] = 63; + function getLens(b64) { + var len2 = b64.length; + if (len2 % 4 > 0) { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len2; + var placeHoldersLen = validLen === len2 ? 0 : 4 - validLen % 4; + return [validLen, placeHoldersLen]; + } + function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; + } + function _byteLength(b64, validLen, placeHoldersLen) { + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; + } + function toByteArray(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); + var curByte = 0; + var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen; + var i2; + for (i2 = 0; i2 < len2; i2 += 4) { + tmp = revLookup[b64.charCodeAt(i2)] << 18 | revLookup[b64.charCodeAt(i2 + 1)] << 12 | revLookup[b64.charCodeAt(i2 + 2)] << 6 | revLookup[b64.charCodeAt(i2 + 3)]; + arr[curByte++] = tmp >> 16 & 255; + arr[curByte++] = tmp >> 8 & 255; + arr[curByte++] = tmp & 255; + } + if (placeHoldersLen === 2) { + tmp = revLookup[b64.charCodeAt(i2)] << 2 | revLookup[b64.charCodeAt(i2 + 1)] >> 4; + arr[curByte++] = tmp & 255; + } + if (placeHoldersLen === 1) { + tmp = revLookup[b64.charCodeAt(i2)] << 10 | revLookup[b64.charCodeAt(i2 + 1)] << 4 | revLookup[b64.charCodeAt(i2 + 2)] >> 2; + arr[curByte++] = tmp >> 8 & 255; + arr[curByte++] = tmp & 255; + } + return arr; + } + function tripletToBase64(num2) { + return lookup[num2 >> 18 & 63] + lookup[num2 >> 12 & 63] + lookup[num2 >> 6 & 63] + lookup[num2 & 63]; + } + function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + for (var i2 = start; i2 < end; i2 += 3) { + tmp = (uint8[i2] << 16 & 16711680) + (uint8[i2 + 1] << 8 & 65280) + (uint8[i2 + 2] & 255); + output.push(tripletToBase64(tmp)); + } + return output.join(""); + } + function fromByteArray(uint8) { + var tmp; + var len2 = uint8.length; + var extraBytes = len2 % 3; + var parts = []; + var maxChunkLength = 16383; + for (var i2 = 0, len22 = len2 - extraBytes; i2 < len22; i2 += maxChunkLength) { + parts.push(encodeChunk(uint8, i2, i2 + maxChunkLength > len22 ? len22 : i2 + maxChunkLength)); + } + if (extraBytes === 1) { + tmp = uint8[len2 - 1]; + parts.push( + lookup[tmp >> 2] + lookup[tmp << 4 & 63] + "==" + ); + } else if (extraBytes === 2) { + tmp = (uint8[len2 - 2] << 8) + uint8[len2 - 1]; + parts.push( + lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + "=" + ); + } + return parts.join(""); + } + } + }); + + // node_modules/ieee754/index.js + var require_ieee754 = __commonJS({ + "node_modules/ieee754/index.js"(exports) { + init_process(); + exports.read = function(buffer, offset, isLE3, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE3 ? nBytes - 1 : 0; + var d = isLE3 ? -1 : 1; + var s = buffer[offset + i]; + i += d; + e = s & (1 << -nBits) - 1; + s >>= -nBits; + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) { + } + m = e & (1 << -nBits) - 1; + e >>= -nBits; + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) { + } + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : (s ? -1 : 1) * Infinity; + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen); + }; + exports.write = function(buffer, value, offset, isLE3, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; + var i = isLE3 ? 0 : nBytes - 1; + var d = isLE3 ? 1 : -1; + var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; + value = Math.abs(value); + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + for (; mLen >= 8; buffer[offset + i] = m & 255, i += d, m /= 256, mLen -= 8) { + } + e = e << mLen | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 255, i += d, e /= 256, eLen -= 8) { + } + buffer[offset + i - d] |= s * 128; + }; + } + }); + + // node_modules/buffer/index.js + var require_buffer = __commonJS({ + "node_modules/buffer/index.js"(exports) { + "use strict"; + init_process(); + var base642 = require_base64_js(); + var ieee754 = require_ieee754(); + var customInspectSymbol = typeof Symbol === "function" && typeof Symbol["for"] === "function" ? Symbol["for"]("nodejs.util.inspect.custom") : null; + exports.Buffer = Buffer3; + exports.SlowBuffer = SlowBuffer; + exports.INSPECT_MAX_BYTES = 50; + var K_MAX_LENGTH = 2147483647; + exports.kMaxLength = K_MAX_LENGTH; + Buffer3.TYPED_ARRAY_SUPPORT = typedArraySupport(); + if (!Buffer3.TYPED_ARRAY_SUPPORT && typeof console !== "undefined" && typeof console.error === "function") { + console.error( + "This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support." + ); + } + function typedArraySupport() { + try { + const arr = new Uint8Array(1); + const proto = { foo: function() { + return 42; + } }; + Object.setPrototypeOf(proto, Uint8Array.prototype); + Object.setPrototypeOf(arr, proto); + return arr.foo() === 42; + } catch (e) { + return false; + } + } + Object.defineProperty(Buffer3.prototype, "parent", { + enumerable: true, + get: function() { + if (!Buffer3.isBuffer(this)) return void 0; + return this.buffer; + } + }); + Object.defineProperty(Buffer3.prototype, "offset", { + enumerable: true, + get: function() { + if (!Buffer3.isBuffer(this)) return void 0; + return this.byteOffset; + } + }); + function createBuffer(length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"'); + } + const buf = new Uint8Array(length); + Object.setPrototypeOf(buf, Buffer3.prototype); + return buf; + } + function Buffer3(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + if (typeof encodingOrOffset === "string") { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ); + } + return allocUnsafe(arg); + } + return from(arg, encodingOrOffset, length); + } + Buffer3.poolSize = 8192; + function from(value, encodingOrOffset, length) { + if (typeof value === "string") { + return fromString(value, encodingOrOffset); + } + if (ArrayBuffer.isView(value)) { + return fromArrayView(value); + } + if (value == null) { + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value + ); + } + if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + if (typeof SharedArrayBuffer !== "undefined" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + if (typeof value === "number") { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ); + } + const valueOf = value.valueOf && value.valueOf(); + if (valueOf != null && valueOf !== value) { + return Buffer3.from(valueOf, encodingOrOffset, length); + } + const b = fromObject(value); + if (b) return b; + if (typeof Symbol !== "undefined" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === "function") { + return Buffer3.from(value[Symbol.toPrimitive]("string"), encodingOrOffset, length); + } + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value + ); + } + Buffer3.from = function(value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length); + }; + Object.setPrototypeOf(Buffer3.prototype, Uint8Array.prototype); + Object.setPrototypeOf(Buffer3, Uint8Array); + function assertSize(size) { + if (typeof size !== "number") { + throw new TypeError('"size" argument must be of type number'); + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"'); + } + } + function alloc(size, fill, encoding) { + assertSize(size); + if (size <= 0) { + return createBuffer(size); + } + if (fill !== void 0) { + return typeof encoding === "string" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill); + } + return createBuffer(size); + } + Buffer3.alloc = function(size, fill, encoding) { + return alloc(size, fill, encoding); + }; + function allocUnsafe(size) { + assertSize(size); + return createBuffer(size < 0 ? 0 : checked(size) | 0); + } + Buffer3.allocUnsafe = function(size) { + return allocUnsafe(size); + }; + Buffer3.allocUnsafeSlow = function(size) { + return allocUnsafe(size); + }; + function fromString(string, encoding) { + if (typeof encoding !== "string" || encoding === "") { + encoding = "utf8"; + } + if (!Buffer3.isEncoding(encoding)) { + throw new TypeError("Unknown encoding: " + encoding); + } + const length = byteLength(string, encoding) | 0; + let buf = createBuffer(length); + const actual = buf.write(string, encoding); + if (actual !== length) { + buf = buf.slice(0, actual); + } + return buf; + } + function fromArrayLike(array) { + const length = array.length < 0 ? 0 : checked(array.length) | 0; + const buf = createBuffer(length); + for (let i = 0; i < length; i += 1) { + buf[i] = array[i] & 255; + } + return buf; + } + function fromArrayView(arrayView) { + if (isInstance(arrayView, Uint8Array)) { + const copy = new Uint8Array(arrayView); + return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength); + } + return fromArrayLike(arrayView); + } + function fromArrayBuffer(array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds'); + } + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds'); + } + let buf; + if (byteOffset === void 0 && length === void 0) { + buf = new Uint8Array(array); + } else if (length === void 0) { + buf = new Uint8Array(array, byteOffset); + } else { + buf = new Uint8Array(array, byteOffset, length); + } + Object.setPrototypeOf(buf, Buffer3.prototype); + return buf; + } + function fromObject(obj) { + if (Buffer3.isBuffer(obj)) { + const len = checked(obj.length) | 0; + const buf = createBuffer(len); + if (buf.length === 0) { + return buf; + } + obj.copy(buf, 0, 0, len); + return buf; + } + if (obj.length !== void 0) { + if (typeof obj.length !== "number" || numberIsNaN(obj.length)) { + return createBuffer(0); + } + return fromArrayLike(obj); + } + if (obj.type === "Buffer" && Array.isArray(obj.data)) { + return fromArrayLike(obj.data); + } + } + function checked(length) { + if (length >= K_MAX_LENGTH) { + throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + K_MAX_LENGTH.toString(16) + " bytes"); + } + return length | 0; + } + function SlowBuffer(length) { + if (+length != length) { + length = 0; + } + return Buffer3.alloc(+length); + } + Buffer3.isBuffer = function isBuffer(b) { + return b != null && b._isBuffer === true && b !== Buffer3.prototype; + }; + Buffer3.compare = function compare(a, b) { + if (isInstance(a, Uint8Array)) a = Buffer3.from(a, a.offset, a.byteLength); + if (isInstance(b, Uint8Array)) b = Buffer3.from(b, b.offset, b.byteLength); + if (!Buffer3.isBuffer(a) || !Buffer3.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ); + } + if (a === b) return 0; + let x = a.length; + let y = b.length; + for (let i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + Buffer3.isEncoding = function isEncoding(encoding) { + switch (String(encoding).toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "latin1": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return true; + default: + return false; + } + }; + Buffer3.concat = function concat(list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + if (list.length === 0) { + return Buffer3.alloc(0); + } + let i; + if (length === void 0) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + const buffer = Buffer3.allocUnsafe(length); + let pos = 0; + for (i = 0; i < list.length; ++i) { + let buf = list[i]; + if (isInstance(buf, Uint8Array)) { + if (pos + buf.length > buffer.length) { + if (!Buffer3.isBuffer(buf)) buf = Buffer3.from(buf); + buf.copy(buffer, pos); + } else { + Uint8Array.prototype.set.call( + buffer, + buf, + pos + ); + } + } else if (!Buffer3.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } else { + buf.copy(buffer, pos); + } + pos += buf.length; + } + return buffer; + }; + function byteLength(string, encoding) { + if (Buffer3.isBuffer(string)) { + return string.length; + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength; + } + if (typeof string !== "string") { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string + ); + } + const len = string.length; + const mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; + let loweredCase = false; + for (; ; ) { + switch (encoding) { + case "ascii": + case "latin1": + case "binary": + return len; + case "utf8": + case "utf-8": + return utf8ToBytes3(string).length; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return len * 2; + case "hex": + return len >>> 1; + case "base64": + return base64ToBytes2(string).length; + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes3(string).length; + } + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer3.byteLength = byteLength; + function slowToString(encoding, start, end) { + let loweredCase = false; + if (start === void 0 || start < 0) { + start = 0; + } + if (start > this.length) { + return ""; + } + if (end === void 0 || end > this.length) { + end = this.length; + } + if (end <= 0) { + return ""; + } + end >>>= 0; + start >>>= 0; + if (end <= start) { + return ""; + } + if (!encoding) encoding = "utf8"; + while (true) { + switch (encoding) { + case "hex": + return hexSlice(this, start, end); + case "utf8": + case "utf-8": + return utf8Slice(this, start, end); + case "ascii": + return asciiSlice(this, start, end); + case "latin1": + case "binary": + return latin1Slice(this, start, end); + case "base64": + return base64Slice(this, start, end); + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return utf16leSlice(this, start, end); + default: + if (loweredCase) throw new TypeError("Unknown encoding: " + encoding); + encoding = (encoding + "").toLowerCase(); + loweredCase = true; + } + } + } + Buffer3.prototype._isBuffer = true; + function swap(b, n, m) { + const i = b[n]; + b[n] = b[m]; + b[m] = i; + } + Buffer3.prototype.swap16 = function swap16() { + const len = this.length; + if (len % 2 !== 0) { + throw new RangeError("Buffer size must be a multiple of 16-bits"); + } + for (let i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this; + }; + Buffer3.prototype.swap32 = function swap32() { + const len = this.length; + if (len % 4 !== 0) { + throw new RangeError("Buffer size must be a multiple of 32-bits"); + } + for (let i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this; + }; + Buffer3.prototype.swap64 = function swap64() { + const len = this.length; + if (len % 8 !== 0) { + throw new RangeError("Buffer size must be a multiple of 64-bits"); + } + for (let i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this; + }; + Buffer3.prototype.toString = function toString() { + const length = this.length; + if (length === 0) return ""; + if (arguments.length === 0) return utf8Slice(this, 0, length); + return slowToString.apply(this, arguments); + }; + Buffer3.prototype.toLocaleString = Buffer3.prototype.toString; + Buffer3.prototype.equals = function equals(b) { + if (!Buffer3.isBuffer(b)) throw new TypeError("Argument must be a Buffer"); + if (this === b) return true; + return Buffer3.compare(this, b) === 0; + }; + Buffer3.prototype.inspect = function inspect() { + let str = ""; + const max = exports.INSPECT_MAX_BYTES; + str = this.toString("hex", 0, max).replace(/(.{2})/g, "$1 ").trim(); + if (this.length > max) str += " ... "; + return ""; + }; + if (customInspectSymbol) { + Buffer3.prototype[customInspectSymbol] = Buffer3.prototype.inspect; + } + Buffer3.prototype.compare = function compare(target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer3.from(target, target.offset, target.byteLength); + } + if (!Buffer3.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target + ); + } + if (start === void 0) { + start = 0; + } + if (end === void 0) { + end = target ? target.length : 0; + } + if (thisStart === void 0) { + thisStart = 0; + } + if (thisEnd === void 0) { + thisEnd = this.length; + } + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError("out of range index"); + } + if (thisStart >= thisEnd && start >= end) { + return 0; + } + if (thisStart >= thisEnd) { + return -1; + } + if (start >= end) { + return 1; + } + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + if (this === target) return 0; + let x = thisEnd - thisStart; + let y = end - start; + const len = Math.min(x, y); + const thisCopy = this.slice(thisStart, thisEnd); + const targetCopy = target.slice(start, end); + for (let i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break; + } + } + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { + if (buffer.length === 0) return -1; + if (typeof byteOffset === "string") { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 2147483647) { + byteOffset = 2147483647; + } else if (byteOffset < -2147483648) { + byteOffset = -2147483648; + } + byteOffset = +byteOffset; + if (numberIsNaN(byteOffset)) { + byteOffset = dir ? 0 : buffer.length - 1; + } + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1; + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1; + } + if (typeof val === "string") { + val = Buffer3.from(val, encoding); + } + if (Buffer3.isBuffer(val)) { + if (val.length === 0) { + return -1; + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir); + } else if (typeof val === "number") { + val = val & 255; + if (typeof Uint8Array.prototype.indexOf === "function") { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); + } + } + return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); + } + throw new TypeError("val must be string, number or Buffer"); + } + function arrayIndexOf(arr, val, byteOffset, encoding, dir) { + let indexSize = 1; + let arrLength = arr.length; + let valLength = val.length; + if (encoding !== void 0) { + encoding = String(encoding).toLowerCase(); + if (encoding === "ucs2" || encoding === "ucs-2" || encoding === "utf16le" || encoding === "utf-16le") { + if (arr.length < 2 || val.length < 2) { + return -1; + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + function read(buf, i2) { + if (indexSize === 1) { + return buf[i2]; + } else { + return buf.readUInt16BE(i2 * indexSize); + } + } + let i; + if (dir) { + let foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + let found = true; + for (let j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break; + } + } + if (found) return i; + } + } + return -1; + } + Buffer3.prototype.includes = function includes(val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1; + }; + Buffer3.prototype.indexOf = function indexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true); + }; + Buffer3.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false); + }; + function hexWrite(buf, string, offset, length) { + offset = Number(offset) || 0; + const remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + const strLen = string.length; + if (length > strLen / 2) { + length = strLen / 2; + } + let i; + for (i = 0; i < length; ++i) { + const parsed = parseInt(string.substr(i * 2, 2), 16); + if (numberIsNaN(parsed)) return i; + buf[offset + i] = parsed; + } + return i; + } + function utf8Write(buf, string, offset, length) { + return blitBuffer(utf8ToBytes3(string, buf.length - offset), buf, offset, length); + } + function asciiWrite(buf, string, offset, length) { + return blitBuffer(asciiToBytes2(string), buf, offset, length); + } + function base64Write(buf, string, offset, length) { + return blitBuffer(base64ToBytes2(string), buf, offset, length); + } + function ucs2Write(buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length); + } + Buffer3.prototype.write = function write(string, offset, length, encoding) { + if (offset === void 0) { + encoding = "utf8"; + length = this.length; + offset = 0; + } else if (length === void 0 && typeof offset === "string") { + encoding = offset; + length = this.length; + offset = 0; + } else if (isFinite(offset)) { + offset = offset >>> 0; + if (isFinite(length)) { + length = length >>> 0; + if (encoding === void 0) encoding = "utf8"; + } else { + encoding = length; + length = void 0; + } + } else { + throw new Error( + "Buffer.write(string, encoding, offset[, length]) is no longer supported" + ); + } + const remaining = this.length - offset; + if (length === void 0 || length > remaining) length = remaining; + if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) { + throw new RangeError("Attempt to write outside buffer bounds"); + } + if (!encoding) encoding = "utf8"; + let loweredCase = false; + for (; ; ) { + switch (encoding) { + case "hex": + return hexWrite(this, string, offset, length); + case "utf8": + case "utf-8": + return utf8Write(this, string, offset, length); + case "ascii": + case "latin1": + case "binary": + return asciiWrite(this, string, offset, length); + case "base64": + return base64Write(this, string, offset, length); + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return ucs2Write(this, string, offset, length); + default: + if (loweredCase) throw new TypeError("Unknown encoding: " + encoding); + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + Buffer3.prototype.toJSON = function toJSON() { + return { + type: "Buffer", + data: Array.prototype.slice.call(this._arr || this, 0) + }; + }; + function base64Slice(buf, start, end) { + if (start === 0 && end === buf.length) { + return base642.fromByteArray(buf); + } else { + return base642.fromByteArray(buf.slice(start, end)); + } + } + function utf8Slice(buf, start, end) { + end = Math.min(buf.length, end); + const res = []; + let i = start; + while (i < end) { + const firstByte = buf[i]; + let codePoint = null; + let bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1; + if (i + bytesPerSequence <= end) { + let secondByte, thirdByte, fourthByte, tempCodePoint; + switch (bytesPerSequence) { + case 1: + if (firstByte < 128) { + codePoint = firstByte; + } + break; + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 192) === 128) { + tempCodePoint = (firstByte & 31) << 6 | secondByte & 63; + if (tempCodePoint > 127) { + codePoint = tempCodePoint; + } + } + break; + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) { + tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63; + if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) { + codePoint = tempCodePoint; + } + } + break; + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) { + tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63; + if (tempCodePoint > 65535 && tempCodePoint < 1114112) { + codePoint = tempCodePoint; + } + } + } + } + if (codePoint === null) { + codePoint = 65533; + bytesPerSequence = 1; + } else if (codePoint > 65535) { + codePoint -= 65536; + res.push(codePoint >>> 10 & 1023 | 55296); + codePoint = 56320 | codePoint & 1023; + } + res.push(codePoint); + i += bytesPerSequence; + } + return decodeCodePointsArray(res); + } + var MAX_ARGUMENTS_LENGTH = 4096; + function decodeCodePointsArray(codePoints) { + const len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints); + } + let res = ""; + let i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ); + } + return res; + } + function asciiSlice(buf, start, end) { + let ret = ""; + end = Math.min(buf.length, end); + for (let i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 127); + } + return ret; + } + function latin1Slice(buf, start, end) { + let ret = ""; + end = Math.min(buf.length, end); + for (let i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret; + } + function hexSlice(buf, start, end) { + const len = buf.length; + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + let out = ""; + for (let i = start; i < end; ++i) { + out += hexSliceLookupTable[buf[i]]; + } + return out; + } + function utf16leSlice(buf, start, end) { + const bytes = buf.slice(start, end); + let res = ""; + for (let i = 0; i < bytes.length - 1; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res; + } + Buffer3.prototype.slice = function slice(start, end) { + const len = this.length; + start = ~~start; + end = end === void 0 ? len : ~~end; + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + if (end < start) end = start; + const newBuf = this.subarray(start, end); + Object.setPrototypeOf(newBuf, Buffer3.prototype); + return newBuf; + }; + function checkOffset(offset, ext, length) { + if (offset % 1 !== 0 || offset < 0) throw new RangeError("offset is not uint"); + if (offset + ext > length) throw new RangeError("Trying to access beyond buffer length"); + } + Buffer3.prototype.readUintLE = Buffer3.prototype.readUIntLE = function readUIntLE(offset, byteLength2, noAssert) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset, byteLength2, this.length); + let val = this[offset]; + let mul = 1; + let i = 0; + while (++i < byteLength2 && (mul *= 256)) { + val += this[offset + i] * mul; + } + return val; + }; + Buffer3.prototype.readUintBE = Buffer3.prototype.readUIntBE = function readUIntBE(offset, byteLength2, noAssert) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + checkOffset(offset, byteLength2, this.length); + } + let val = this[offset + --byteLength2]; + let mul = 1; + while (byteLength2 > 0 && (mul *= 256)) { + val += this[offset + --byteLength2] * mul; + } + return val; + }; + Buffer3.prototype.readUint8 = Buffer3.prototype.readUInt8 = function readUInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset]; + }; + Buffer3.prototype.readUint16LE = Buffer3.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | this[offset + 1] << 8; + }; + Buffer3.prototype.readUint16BE = Buffer3.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] << 8 | this[offset + 1]; + }; + Buffer3.prototype.readUint32LE = Buffer3.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 16777216; + }; + Buffer3.prototype.readUint32BE = Buffer3.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] * 16777216 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]); + }; + Buffer3.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const lo = first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 24; + const hi = this[++offset] + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + last * 2 ** 24; + return BigInt(lo) + (BigInt(hi) << BigInt(32)); + }); + Buffer3.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const hi = first * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + this[++offset]; + const lo = this[++offset] * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + last; + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }); + Buffer3.prototype.readIntLE = function readIntLE(offset, byteLength2, noAssert) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset, byteLength2, this.length); + let val = this[offset]; + let mul = 1; + let i = 0; + while (++i < byteLength2 && (mul *= 256)) { + val += this[offset + i] * mul; + } + mul *= 128; + if (val >= mul) val -= Math.pow(2, 8 * byteLength2); + return val; + }; + Buffer3.prototype.readIntBE = function readIntBE(offset, byteLength2, noAssert) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset, byteLength2, this.length); + let i = byteLength2; + let mul = 1; + let val = this[offset + --i]; + while (i > 0 && (mul *= 256)) { + val += this[offset + --i] * mul; + } + mul *= 128; + if (val >= mul) val -= Math.pow(2, 8 * byteLength2); + return val; + }; + Buffer3.prototype.readInt8 = function readInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 128)) return this[offset]; + return (255 - this[offset] + 1) * -1; + }; + Buffer3.prototype.readInt16LE = function readInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + const val = this[offset] | this[offset + 1] << 8; + return val & 32768 ? val | 4294901760 : val; + }; + Buffer3.prototype.readInt16BE = function readInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + const val = this[offset + 1] | this[offset] << 8; + return val & 32768 ? val | 4294901760 : val; + }; + Buffer3.prototype.readInt32LE = function readInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24; + }; + Buffer3.prototype.readInt32BE = function readInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]; + }; + Buffer3.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const val = this[offset + 4] + this[offset + 5] * 2 ** 8 + this[offset + 6] * 2 ** 16 + (last << 24); + return (BigInt(val) << BigInt(32)) + BigInt(first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 24); + }); + Buffer3.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const val = (first << 24) + // Overflow + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + this[++offset]; + return (BigInt(val) << BigInt(32)) + BigInt(this[++offset] * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + last); + }); + Buffer3.prototype.readFloatLE = function readFloatLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, true, 23, 4); + }; + Buffer3.prototype.readFloatBE = function readFloatBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, false, 23, 4); + }; + Buffer3.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, true, 52, 8); + }; + Buffer3.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, false, 52, 8); + }; + function checkInt(buf, value, offset, ext, max, min) { + if (!Buffer3.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance'); + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds'); + if (offset + ext > buf.length) throw new RangeError("Index out of range"); + } + Buffer3.prototype.writeUintLE = Buffer3.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength2, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + const maxBytes = Math.pow(2, 8 * byteLength2) - 1; + checkInt(this, value, offset, byteLength2, maxBytes, 0); + } + let mul = 1; + let i = 0; + this[offset] = value & 255; + while (++i < byteLength2 && (mul *= 256)) { + this[offset + i] = value / mul & 255; + } + return offset + byteLength2; + }; + Buffer3.prototype.writeUintBE = Buffer3.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength2, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + const maxBytes = Math.pow(2, 8 * byteLength2) - 1; + checkInt(this, value, offset, byteLength2, maxBytes, 0); + } + let i = byteLength2 - 1; + let mul = 1; + this[offset + i] = value & 255; + while (--i >= 0 && (mul *= 256)) { + this[offset + i] = value / mul & 255; + } + return offset + byteLength2; + }; + Buffer3.prototype.writeUint8 = Buffer3.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 255, 0); + this[offset] = value & 255; + return offset + 1; + }; + Buffer3.prototype.writeUint16LE = Buffer3.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 65535, 0); + this[offset] = value & 255; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + Buffer3.prototype.writeUint16BE = Buffer3.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 65535, 0); + this[offset] = value >>> 8; + this[offset + 1] = value & 255; + return offset + 2; + }; + Buffer3.prototype.writeUint32LE = Buffer3.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 4294967295, 0); + this[offset + 3] = value >>> 24; + this[offset + 2] = value >>> 16; + this[offset + 1] = value >>> 8; + this[offset] = value & 255; + return offset + 4; + }; + Buffer3.prototype.writeUint32BE = Buffer3.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 4294967295, 0); + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 255; + return offset + 4; + }; + function wrtBigUInt64LE(buf, value, offset, min, max) { + checkIntBI(value, min, max, buf, offset, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + let hi = Number(value >> BigInt(32) & BigInt(4294967295)); + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + return offset; + } + function wrtBigUInt64BE(buf, value, offset, min, max) { + checkIntBI(value, min, max, buf, offset, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset + 7] = lo; + lo = lo >> 8; + buf[offset + 6] = lo; + lo = lo >> 8; + buf[offset + 5] = lo; + lo = lo >> 8; + buf[offset + 4] = lo; + let hi = Number(value >> BigInt(32) & BigInt(4294967295)); + buf[offset + 3] = hi; + hi = hi >> 8; + buf[offset + 2] = hi; + hi = hi >> 8; + buf[offset + 1] = hi; + hi = hi >> 8; + buf[offset] = hi; + return offset + 8; + } + Buffer3.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE(value, offset = 0) { + return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt("0xffffffffffffffff")); + }); + Buffer3.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE(value, offset = 0) { + return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt("0xffffffffffffffff")); + }); + Buffer3.prototype.writeIntLE = function writeIntLE(value, offset, byteLength2, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + const limit = Math.pow(2, 8 * byteLength2 - 1); + checkInt(this, value, offset, byteLength2, limit - 1, -limit); + } + let i = 0; + let mul = 1; + let sub = 0; + this[offset] = value & 255; + while (++i < byteLength2 && (mul *= 256)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = (value / mul >> 0) - sub & 255; + } + return offset + byteLength2; + }; + Buffer3.prototype.writeIntBE = function writeIntBE(value, offset, byteLength2, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + const limit = Math.pow(2, 8 * byteLength2 - 1); + checkInt(this, value, offset, byteLength2, limit - 1, -limit); + } + let i = byteLength2 - 1; + let mul = 1; + let sub = 0; + this[offset + i] = value & 255; + while (--i >= 0 && (mul *= 256)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = (value / mul >> 0) - sub & 255; + } + return offset + byteLength2; + }; + Buffer3.prototype.writeInt8 = function writeInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 127, -128); + if (value < 0) value = 255 + value + 1; + this[offset] = value & 255; + return offset + 1; + }; + Buffer3.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 32767, -32768); + this[offset] = value & 255; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + Buffer3.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 32767, -32768); + this[offset] = value >>> 8; + this[offset + 1] = value & 255; + return offset + 2; + }; + Buffer3.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 2147483647, -2147483648); + this[offset] = value & 255; + this[offset + 1] = value >>> 8; + this[offset + 2] = value >>> 16; + this[offset + 3] = value >>> 24; + return offset + 4; + }; + Buffer3.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 2147483647, -2147483648); + if (value < 0) value = 4294967295 + value + 1; + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 255; + return offset + 4; + }; + Buffer3.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE(value, offset = 0) { + return wrtBigUInt64LE(this, value, offset, -BigInt("0x8000000000000000"), BigInt("0x7fffffffffffffff")); + }); + Buffer3.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE(value, offset = 0) { + return wrtBigUInt64BE(this, value, offset, -BigInt("0x8000000000000000"), BigInt("0x7fffffffffffffff")); + }); + function checkIEEE754(buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError("Index out of range"); + if (offset < 0) throw new RangeError("Index out of range"); + } + function writeFloat(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 34028234663852886e22, -34028234663852886e22); + } + ieee754.write(buf, value, offset, littleEndian, 23, 4); + return offset + 4; + } + Buffer3.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert); + }; + Buffer3.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert); + }; + function writeDouble(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 17976931348623157e292, -17976931348623157e292); + } + ieee754.write(buf, value, offset, littleEndian, 52, 8); + return offset + 8; + } + Buffer3.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert); + }; + Buffer3.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert); + }; + Buffer3.prototype.copy = function copy(target, targetStart, start, end) { + if (!Buffer3.isBuffer(target)) throw new TypeError("argument should be a Buffer"); + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + if (end === start) return 0; + if (target.length === 0 || this.length === 0) return 0; + if (targetStart < 0) { + throw new RangeError("targetStart out of bounds"); + } + if (start < 0 || start >= this.length) throw new RangeError("Index out of range"); + if (end < 0) throw new RangeError("sourceEnd out of bounds"); + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + const len = end - start; + if (this === target && typeof Uint8Array.prototype.copyWithin === "function") { + this.copyWithin(targetStart, start, end); + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ); + } + return len; + }; + Buffer3.prototype.fill = function fill(val, start, end, encoding) { + if (typeof val === "string") { + if (typeof start === "string") { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === "string") { + encoding = end; + end = this.length; + } + if (encoding !== void 0 && typeof encoding !== "string") { + throw new TypeError("encoding must be a string"); + } + if (typeof encoding === "string" && !Buffer3.isEncoding(encoding)) { + throw new TypeError("Unknown encoding: " + encoding); + } + if (val.length === 1) { + const code = val.charCodeAt(0); + if (encoding === "utf8" && code < 128 || encoding === "latin1") { + val = code; + } + } + } else if (typeof val === "number") { + val = val & 255; + } else if (typeof val === "boolean") { + val = Number(val); + } + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError("Out of range index"); + } + if (end <= start) { + return this; + } + start = start >>> 0; + end = end === void 0 ? this.length : end >>> 0; + if (!val) val = 0; + let i; + if (typeof val === "number") { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + const bytes = Buffer3.isBuffer(val) ? val : Buffer3.from(val, encoding); + const len = bytes.length; + if (len === 0) { + throw new TypeError('The value "' + val + '" is invalid for argument "value"'); + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + return this; + }; + var errors = {}; + function E(sym, getMessage, Base) { + errors[sym] = class NodeError extends Base { + constructor() { + super(); + Object.defineProperty(this, "message", { + value: getMessage.apply(this, arguments), + writable: true, + configurable: true + }); + this.name = `${this.name} [${sym}]`; + this.stack; + delete this.name; + } + get code() { + return sym; + } + set code(value) { + Object.defineProperty(this, "code", { + configurable: true, + enumerable: true, + value, + writable: true + }); + } + toString() { + return `${this.name} [${sym}]: ${this.message}`; + } + }; + } + E( + "ERR_BUFFER_OUT_OF_BOUNDS", + function(name) { + if (name) { + return `${name} is outside of buffer bounds`; + } + return "Attempt to access memory outside buffer bounds"; + }, + RangeError + ); + E( + "ERR_INVALID_ARG_TYPE", + function(name, actual) { + return `The "${name}" argument must be of type number. Received type ${typeof actual}`; + }, + TypeError + ); + E( + "ERR_OUT_OF_RANGE", + function(str, range, input) { + let msg = `The value of "${str}" is out of range.`; + let received = input; + if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { + received = addNumericalSeparator(String(input)); + } else if (typeof input === "bigint") { + received = String(input); + if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) { + received = addNumericalSeparator(received); + } + received += "n"; + } + msg += ` It must be ${range}. Received ${received}`; + return msg; + }, + RangeError + ); + function addNumericalSeparator(val) { + let res = ""; + let i = val.length; + const start = val[0] === "-" ? 1 : 0; + for (; i >= start + 4; i -= 3) { + res = `_${val.slice(i - 3, i)}${res}`; + } + return `${val.slice(0, i)}${res}`; + } + function checkBounds(buf, offset, byteLength2) { + validateNumber(offset, "offset"); + if (buf[offset] === void 0 || buf[offset + byteLength2] === void 0) { + boundsError(offset, buf.length - (byteLength2 + 1)); + } + } + function checkIntBI(value, min, max, buf, offset, byteLength2) { + if (value > max || value < min) { + const n = typeof min === "bigint" ? "n" : ""; + let range; + if (byteLength2 > 3) { + if (min === 0 || min === BigInt(0)) { + range = `>= 0${n} and < 2${n} ** ${(byteLength2 + 1) * 8}${n}`; + } else { + range = `>= -(2${n} ** ${(byteLength2 + 1) * 8 - 1}${n}) and < 2 ** ${(byteLength2 + 1) * 8 - 1}${n}`; + } + } else { + range = `>= ${min}${n} and <= ${max}${n}`; + } + throw new errors.ERR_OUT_OF_RANGE("value", range, value); + } + checkBounds(buf, offset, byteLength2); + } + function validateNumber(value, name) { + if (typeof value !== "number") { + throw new errors.ERR_INVALID_ARG_TYPE(name, "number", value); + } + } + function boundsError(value, length, type) { + if (Math.floor(value) !== value) { + validateNumber(value, type); + throw new errors.ERR_OUT_OF_RANGE(type || "offset", "an integer", value); + } + if (length < 0) { + throw new errors.ERR_BUFFER_OUT_OF_BOUNDS(); + } + throw new errors.ERR_OUT_OF_RANGE( + type || "offset", + `>= ${type ? 1 : 0} and <= ${length}`, + value + ); + } + var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + function base64clean(str) { + str = str.split("=")[0]; + str = str.trim().replace(INVALID_BASE64_RE, ""); + if (str.length < 2) return ""; + while (str.length % 4 !== 0) { + str = str + "="; + } + return str; + } + function utf8ToBytes3(string, units) { + units = units || Infinity; + let codePoint; + const length = string.length; + let leadSurrogate = null; + const bytes = []; + for (let i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + if (codePoint > 55295 && codePoint < 57344) { + if (!leadSurrogate) { + if (codePoint > 56319) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + continue; + } else if (i + 1 === length) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + continue; + } + leadSurrogate = codePoint; + continue; + } + if (codePoint < 56320) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + leadSurrogate = codePoint; + continue; + } + codePoint = (leadSurrogate - 55296 << 10 | codePoint - 56320) + 65536; + } else if (leadSurrogate) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + } + leadSurrogate = null; + if (codePoint < 128) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 2048) { + if ((units -= 2) < 0) break; + bytes.push( + codePoint >> 6 | 192, + codePoint & 63 | 128 + ); + } else if (codePoint < 65536) { + if ((units -= 3) < 0) break; + bytes.push( + codePoint >> 12 | 224, + codePoint >> 6 & 63 | 128, + codePoint & 63 | 128 + ); + } else if (codePoint < 1114112) { + if ((units -= 4) < 0) break; + bytes.push( + codePoint >> 18 | 240, + codePoint >> 12 & 63 | 128, + codePoint >> 6 & 63 | 128, + codePoint & 63 | 128 + ); + } else { + throw new Error("Invalid code point"); + } + } + return bytes; + } + function asciiToBytes2(str) { + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + byteArray.push(str.charCodeAt(i) & 255); + } + return byteArray; + } + function utf16leToBytes(str, units) { + let c, hi, lo; + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + return byteArray; + } + function base64ToBytes2(str) { + return base642.toByteArray(base64clean(str)); + } + function blitBuffer(src, dst, offset, length) { + let i; + for (i = 0; i < length; ++i) { + if (i + offset >= dst.length || i >= src.length) break; + dst[i + offset] = src[i]; + } + return i; + } + function isInstance(obj, type) { + return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name; + } + function numberIsNaN(obj) { + return obj !== obj; + } + var hexSliceLookupTable = (function() { + const alphabet2 = "0123456789abcdef"; + const table = new Array(256); + for (let i = 0; i < 16; ++i) { + const i16 = i * 16; + for (let j = 0; j < 16; ++j) { + table[i16 + j] = alphabet2[i] + alphabet2[j]; + } + } + return table; + })(); + function defineBigIntMethod(fn) { + return typeof BigInt === "undefined" ? BufferBigIntNotDefined : fn; + } + function BufferBigIntNotDefined() { + throw new Error("BigInt not supported"); + } + } + }); + + // src/background.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/index.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/types/index.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/types/base.js + init_process(); + var NostrEventKind; + (function(NostrEventKind3) { + NostrEventKind3[NostrEventKind3["SET_METADATA"] = 0] = "SET_METADATA"; + NostrEventKind3[NostrEventKind3["TEXT_NOTE"] = 1] = "TEXT_NOTE"; + NostrEventKind3[NostrEventKind3["RECOMMEND_SERVER"] = 2] = "RECOMMEND_SERVER"; + NostrEventKind3[NostrEventKind3["CONTACTS"] = 3] = "CONTACTS"; + NostrEventKind3[NostrEventKind3["ENCRYPTED_DIRECT_MESSAGE"] = 4] = "ENCRYPTED_DIRECT_MESSAGE"; + NostrEventKind3[NostrEventKind3["EVENT_DELETION"] = 5] = "EVENT_DELETION"; + NostrEventKind3[NostrEventKind3["REPOST"] = 6] = "REPOST"; + NostrEventKind3[NostrEventKind3["REACTION"] = 7] = "REACTION"; + NostrEventKind3[NostrEventKind3["CHANNEL_CREATION"] = 40] = "CHANNEL_CREATION"; + NostrEventKind3[NostrEventKind3["CHANNEL_METADATA"] = 41] = "CHANNEL_METADATA"; + NostrEventKind3[NostrEventKind3["CHANNEL_MESSAGE"] = 42] = "CHANNEL_MESSAGE"; + NostrEventKind3[NostrEventKind3["CHANNEL_HIDE_MESSAGE"] = 43] = "CHANNEL_HIDE_MESSAGE"; + NostrEventKind3[NostrEventKind3["CHANNEL_MUTE_USER"] = 44] = "CHANNEL_MUTE_USER"; + NostrEventKind3[NostrEventKind3["AUTH"] = 22242] = "AUTH"; + NostrEventKind3[NostrEventKind3["AUTH_RESPONSE"] = 22243] = "AUTH_RESPONSE"; + })(NostrEventKind || (NostrEventKind = {})); + var NostrMessageType; + (function(NostrMessageType2) { + NostrMessageType2["EVENT"] = "EVENT"; + NostrMessageType2["NOTICE"] = "NOTICE"; + NostrMessageType2["OK"] = "OK"; + NostrMessageType2["EOSE"] = "EOSE"; + NostrMessageType2["REQ"] = "REQ"; + NostrMessageType2["CLOSE"] = "CLOSE"; + NostrMessageType2["AUTH"] = "AUTH"; + })(NostrMessageType || (NostrMessageType = {})); + + // node_modules/nostr-crypto-utils/dist/esm/types/protocol.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/types/messages.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/types/guards.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/types/nip46.js + init_process(); + var Nip46Method; + (function(Nip46Method2) { + Nip46Method2["CONNECT"] = "connect"; + Nip46Method2["PING"] = "ping"; + Nip46Method2["GET_PUBLIC_KEY"] = "get_public_key"; + Nip46Method2["SIGN_EVENT"] = "sign_event"; + Nip46Method2["NIP04_ENCRYPT"] = "nip04_encrypt"; + Nip46Method2["NIP04_DECRYPT"] = "nip04_decrypt"; + Nip46Method2["NIP44_ENCRYPT"] = "nip44_encrypt"; + Nip46Method2["NIP44_DECRYPT"] = "nip44_decrypt"; + Nip46Method2["GET_RELAYS"] = "get_relays"; + })(Nip46Method || (Nip46Method = {})); + + // node_modules/nostr-crypto-utils/dist/esm/types/index.js + var NostrEventKind2; + (function(NostrEventKind3) { + NostrEventKind3[NostrEventKind3["SET_METADATA"] = 0] = "SET_METADATA"; + NostrEventKind3[NostrEventKind3["TEXT_NOTE"] = 1] = "TEXT_NOTE"; + NostrEventKind3[NostrEventKind3["RECOMMEND_SERVER"] = 2] = "RECOMMEND_SERVER"; + NostrEventKind3[NostrEventKind3["CONTACT_LIST"] = 3] = "CONTACT_LIST"; + NostrEventKind3[NostrEventKind3["ENCRYPTED_DIRECT_MESSAGE"] = 4] = "ENCRYPTED_DIRECT_MESSAGE"; + NostrEventKind3[NostrEventKind3["DELETE"] = 5] = "DELETE"; + NostrEventKind3[NostrEventKind3["REPOST"] = 6] = "REPOST"; + NostrEventKind3[NostrEventKind3["REACTION"] = 7] = "REACTION"; + NostrEventKind3[NostrEventKind3["BADGE_AWARD"] = 8] = "BADGE_AWARD"; + NostrEventKind3[NostrEventKind3["CHANNEL_CREATE"] = 40] = "CHANNEL_CREATE"; + NostrEventKind3[NostrEventKind3["CHANNEL_METADATA"] = 41] = "CHANNEL_METADATA"; + NostrEventKind3[NostrEventKind3["CHANNEL_MESSAGE"] = 42] = "CHANNEL_MESSAGE"; + NostrEventKind3[NostrEventKind3["CHANNEL_HIDE_MESSAGE"] = 43] = "CHANNEL_HIDE_MESSAGE"; + NostrEventKind3[NostrEventKind3["CHANNEL_MUTE_USER"] = 44] = "CHANNEL_MUTE_USER"; + NostrEventKind3[NostrEventKind3["CHANNEL_RESERVE"] = 45] = "CHANNEL_RESERVE"; + NostrEventKind3[NostrEventKind3["REPORTING"] = 1984] = "REPORTING"; + NostrEventKind3[NostrEventKind3["ZAP_REQUEST"] = 9734] = "ZAP_REQUEST"; + NostrEventKind3[NostrEventKind3["ZAP"] = 9735] = "ZAP"; + NostrEventKind3[NostrEventKind3["MUTE_LIST"] = 1e4] = "MUTE_LIST"; + NostrEventKind3[NostrEventKind3["PIN_LIST"] = 10001] = "PIN_LIST"; + NostrEventKind3[NostrEventKind3["RELAY_LIST_METADATA"] = 10002] = "RELAY_LIST_METADATA"; + NostrEventKind3[NostrEventKind3["CLIENT_AUTH"] = 22242] = "CLIENT_AUTH"; + NostrEventKind3[NostrEventKind3["AUTH_RESPONSE"] = 22243] = "AUTH_RESPONSE"; + NostrEventKind3[NostrEventKind3["NOSTR_CONNECT"] = 24133] = "NOSTR_CONNECT"; + NostrEventKind3[NostrEventKind3["CATEGORIZED_PEOPLE"] = 3e4] = "CATEGORIZED_PEOPLE"; + NostrEventKind3[NostrEventKind3["CATEGORIZED_BOOKMARKS"] = 30001] = "CATEGORIZED_BOOKMARKS"; + NostrEventKind3[NostrEventKind3["PROFILE_BADGES"] = 30008] = "PROFILE_BADGES"; + NostrEventKind3[NostrEventKind3["BADGE_DEFINITION"] = 30009] = "BADGE_DEFINITION"; + NostrEventKind3[NostrEventKind3["LONG_FORM"] = 30023] = "LONG_FORM"; + NostrEventKind3[NostrEventKind3["APPLICATION_SPECIFIC"] = 30078] = "APPLICATION_SPECIFIC"; + })(NostrEventKind2 || (NostrEventKind2 = {})); + + // node_modules/nostr-crypto-utils/dist/esm/crypto.js + init_process(); + + // node_modules/@noble/curves/secp256k1.js + init_process(); + + // node_modules/@noble/hashes/sha2.js + init_process(); + + // node_modules/@noble/hashes/_md.js + init_process(); + + // node_modules/@noble/hashes/utils.js + init_process(); + function isBytes(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; + } + function anumber(n, title = "") { + if (!Number.isSafeInteger(n) || n < 0) { + const prefix = title && `"${title}" `; + throw new Error(`${prefix}expected integer >= 0, got ${n}`); + } + } + function abytes(value, length, title = "") { + const bytes = isBytes(value); + const len = value?.length; + const needsLen = length !== void 0; + if (!bytes || needsLen && len !== length) { + const prefix = title && `"${title}" `; + const ofLen = needsLen ? ` of length ${length}` : ""; + const got = bytes ? `length=${len}` : `type=${typeof value}`; + throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got); + } + return value; + } + function ahash(h) { + if (typeof h !== "function" || typeof h.create !== "function") + throw new Error("Hash must wrapped by utils.createHasher"); + anumber(h.outputLen); + anumber(h.blockLen); + } + function aexists(instance, checkFinished = true) { + if (instance.destroyed) + throw new Error("Hash instance has been destroyed"); + if (checkFinished && instance.finished) + throw new Error("Hash#digest() has already been called"); + } + function aoutput(out, instance) { + abytes(out, void 0, "digestInto() output"); + const min = instance.outputLen; + if (out.length < min) { + throw new Error('"digestInto() output" expected to be of length >=' + min); + } + } + function u32(arr) { + return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4)); + } + function clean(...arrays) { + for (let i = 0; i < arrays.length; i++) { + arrays[i].fill(0); + } + } + function createView(arr) { + return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); + } + function rotr(word, shift) { + return word << 32 - shift | word >>> shift; + } + function rotl(word, shift) { + return word << shift | word >>> 32 - shift >>> 0; + } + var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)(); + function byteSwap(word) { + return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255; + } + function byteSwap32(arr) { + for (let i = 0; i < arr.length; i++) { + arr[i] = byteSwap(arr[i]); + } + return arr; + } + var swap32IfBE = isLE ? (u) => u : byteSwap32; + var hasHexBuiltin = /* @__PURE__ */ (() => ( + // @ts-ignore + typeof Uint8Array.from([]).toHex === "function" && typeof Uint8Array.fromHex === "function" + ))(); + var hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); + function bytesToHex(bytes) { + abytes(bytes); + if (hasHexBuiltin) + return bytes.toHex(); + let hex = ""; + for (let i = 0; i < bytes.length; i++) { + hex += hexes[bytes[i]]; + } + return hex; + } + var asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; + function asciiToBase16(ch) { + if (ch >= asciis._0 && ch <= asciis._9) + return ch - asciis._0; + if (ch >= asciis.A && ch <= asciis.F) + return ch - (asciis.A - 10); + if (ch >= asciis.a && ch <= asciis.f) + return ch - (asciis.a - 10); + return; + } + function hexToBytes(hex) { + if (typeof hex !== "string") + throw new Error("hex string expected, got " + typeof hex); + if (hasHexBuiltin) + return Uint8Array.fromHex(hex); + const hl = hex.length; + const al = hl / 2; + if (hl % 2) + throw new Error("hex string expected, got unpadded hex of length " + hl); + const array = new Uint8Array(al); + for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) { + const n1 = asciiToBase16(hex.charCodeAt(hi)); + const n2 = asciiToBase16(hex.charCodeAt(hi + 1)); + if (n1 === void 0 || n2 === void 0) { + const char = hex[hi] + hex[hi + 1]; + throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi); + } + array[ai] = n1 * 16 + n2; + } + return array; + } + function utf8ToBytes(str) { + if (typeof str !== "string") + throw new Error("string expected"); + return new Uint8Array(new TextEncoder().encode(str)); + } + function kdfInputToBytes(data, errorTitle = "") { + if (typeof data === "string") + return utf8ToBytes(data); + return abytes(data, void 0, errorTitle); + } + function concatBytes(...arrays) { + let sum = 0; + for (let i = 0; i < arrays.length; i++) { + const a = arrays[i]; + abytes(a); + sum += a.length; + } + const res = new Uint8Array(sum); + for (let i = 0, pad2 = 0; i < arrays.length; i++) { + const a = arrays[i]; + res.set(a, pad2); + pad2 += a.length; + } + return res; + } + function checkOpts(defaults, opts) { + if (opts !== void 0 && {}.toString.call(opts) !== "[object Object]") + throw new Error("options must be object or undefined"); + const merged = Object.assign(defaults, opts); + return merged; + } + function createHasher(hashCons, info = {}) { + const hashC = (msg, opts) => hashCons(opts).update(msg).digest(); + const tmp = hashCons(void 0); + hashC.outputLen = tmp.outputLen; + hashC.blockLen = tmp.blockLen; + hashC.create = (opts) => hashCons(opts); + Object.assign(hashC, info); + return Object.freeze(hashC); + } + function randomBytes(bytesLength = 32) { + const cr = typeof globalThis === "object" ? globalThis.crypto : null; + if (typeof cr?.getRandomValues !== "function") + throw new Error("crypto.getRandomValues must be defined"); + return cr.getRandomValues(new Uint8Array(bytesLength)); + } + var oidNist = (suffix) => ({ + oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix]) + }); + + // node_modules/@noble/hashes/_md.js + function Chi(a, b, c) { + return a & b ^ ~a & c; + } + function Maj(a, b, c) { + return a & b ^ a & c ^ b & c; + } + var HashMD = class { + blockLen; + outputLen; + padOffset; + isLE; + // For partial updates less than block size + buffer; + view; + finished = false; + length = 0; + pos = 0; + destroyed = false; + constructor(blockLen, outputLen, padOffset, isLE3) { + this.blockLen = blockLen; + this.outputLen = outputLen; + this.padOffset = padOffset; + this.isLE = isLE3; + this.buffer = new Uint8Array(blockLen); + this.view = createView(this.buffer); + } + update(data) { + aexists(this); + abytes(data); + const { view, buffer, blockLen } = this; + const len = data.length; + for (let pos = 0; pos < len; ) { + const take = Math.min(blockLen - this.pos, len - pos); + if (take === blockLen) { + const dataView = createView(data); + for (; blockLen <= len - pos; pos += blockLen) + this.process(dataView, pos); + continue; + } + buffer.set(data.subarray(pos, pos + take), this.pos); + this.pos += take; + pos += take; + if (this.pos === blockLen) { + this.process(view, 0); + this.pos = 0; + } + } + this.length += data.length; + this.roundClean(); + return this; + } + digestInto(out) { + aexists(this); + aoutput(out, this); + this.finished = true; + const { buffer, view, blockLen, isLE: isLE3 } = this; + let { pos } = this; + buffer[pos++] = 128; + clean(this.buffer.subarray(pos)); + if (this.padOffset > blockLen - pos) { + this.process(view, 0); + pos = 0; + } + for (let i = pos; i < blockLen; i++) + buffer[i] = 0; + view.setBigUint64(blockLen - 8, BigInt(this.length * 8), isLE3); + this.process(view, 0); + const oview = createView(out); + const len = this.outputLen; + if (len % 4) + throw new Error("_sha2: outputLen must be aligned to 32bit"); + const outLen = len / 4; + const state = this.get(); + if (outLen > state.length) + throw new Error("_sha2: outputLen bigger than state"); + for (let i = 0; i < outLen; i++) + oview.setUint32(4 * i, state[i], isLE3); + } + digest() { + const { buffer, outputLen } = this; + this.digestInto(buffer); + const res = buffer.slice(0, outputLen); + this.destroy(); + return res; + } + _cloneInto(to) { + to ||= new this.constructor(); + to.set(...this.get()); + const { blockLen, buffer, length, finished, destroyed, pos } = this; + to.destroyed = destroyed; + to.finished = finished; + to.length = length; + to.pos = pos; + if (length % blockLen) + to.buffer.set(buffer); + return to; + } + clone() { + return this._cloneInto(); + } + }; + var SHA256_IV = /* @__PURE__ */ Uint32Array.from([ + 1779033703, + 3144134277, + 1013904242, + 2773480762, + 1359893119, + 2600822924, + 528734635, + 1541459225 + ]); + + // node_modules/@noble/hashes/sha2.js + var SHA256_K = /* @__PURE__ */ Uint32Array.from([ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]); + var SHA256_W = /* @__PURE__ */ new Uint32Array(64); + var SHA2_32B = class extends HashMD { + constructor(outputLen) { + super(64, outputLen, 8, false); + } + get() { + const { A, B, C, D, E, F, G, H } = this; + return [A, B, C, D, E, F, G, H]; + } + // prettier-ignore + set(A, B, C, D, E, F, G, H) { + this.A = A | 0; + this.B = B | 0; + this.C = C | 0; + this.D = D | 0; + this.E = E | 0; + this.F = F | 0; + this.G = G | 0; + this.H = H | 0; + } + process(view, offset) { + for (let i = 0; i < 16; i++, offset += 4) + SHA256_W[i] = view.getUint32(offset, false); + for (let i = 16; i < 64; i++) { + const W15 = SHA256_W[i - 15]; + const W2 = SHA256_W[i - 2]; + const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ W15 >>> 3; + const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ W2 >>> 10; + SHA256_W[i] = s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16] | 0; + } + let { A, B, C, D, E, F, G, H } = this; + for (let i = 0; i < 64; i++) { + const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25); + const T1 = H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i] | 0; + const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22); + const T2 = sigma0 + Maj(A, B, C) | 0; + H = G; + G = F; + F = E; + E = D + T1 | 0; + D = C; + C = B; + B = A; + A = T1 + T2 | 0; + } + A = A + this.A | 0; + B = B + this.B | 0; + C = C + this.C | 0; + D = D + this.D | 0; + E = E + this.E | 0; + F = F + this.F | 0; + G = G + this.G | 0; + H = H + this.H | 0; + this.set(A, B, C, D, E, F, G, H); + } + roundClean() { + clean(SHA256_W); + } + destroy() { + this.set(0, 0, 0, 0, 0, 0, 0, 0); + clean(this.buffer); + } + }; + var _SHA256 = class extends SHA2_32B { + // We cannot use array here since array allows indexing by variable + // which means optimizer/compiler cannot use registers. + A = SHA256_IV[0] | 0; + B = SHA256_IV[1] | 0; + C = SHA256_IV[2] | 0; + D = SHA256_IV[3] | 0; + E = SHA256_IV[4] | 0; + F = SHA256_IV[5] | 0; + G = SHA256_IV[6] | 0; + H = SHA256_IV[7] | 0; + constructor() { + super(32); + } + }; + var sha256 = /* @__PURE__ */ createHasher( + () => new _SHA256(), + /* @__PURE__ */ oidNist(1) + ); + + // node_modules/@noble/curves/abstract/curve.js + init_process(); + + // node_modules/@noble/curves/utils.js + init_process(); + var _0n = /* @__PURE__ */ BigInt(0); + var _1n = /* @__PURE__ */ BigInt(1); + function abool(value, title = "") { + if (typeof value !== "boolean") { + const prefix = title && `"${title}" `; + throw new Error(prefix + "expected boolean, got type=" + typeof value); + } + return value; + } + function abignumber(n) { + if (typeof n === "bigint") { + if (!isPosBig(n)) + throw new Error("positive bigint expected, got " + n); + } else + anumber(n); + return n; + } + function numberToHexUnpadded(num2) { + const hex = abignumber(num2).toString(16); + return hex.length & 1 ? "0" + hex : hex; + } + function hexToNumber(hex) { + if (typeof hex !== "string") + throw new Error("hex string expected, got " + typeof hex); + return hex === "" ? _0n : BigInt("0x" + hex); + } + function bytesToNumberBE(bytes) { + return hexToNumber(bytesToHex(bytes)); + } + function bytesToNumberLE(bytes) { + return hexToNumber(bytesToHex(copyBytes(abytes(bytes)).reverse())); + } + function numberToBytesBE(n, len) { + anumber(len); + n = abignumber(n); + const res = hexToBytes(n.toString(16).padStart(len * 2, "0")); + if (res.length !== len) + throw new Error("number too large"); + return res; + } + function numberToBytesLE(n, len) { + return numberToBytesBE(n, len).reverse(); + } + function copyBytes(bytes) { + return Uint8Array.from(bytes); + } + function asciiToBytes(ascii) { + return Uint8Array.from(ascii, (c, i) => { + const charCode = c.charCodeAt(0); + if (c.length !== 1 || charCode > 127) { + throw new Error(`string contains non-ASCII character "${ascii[i]}" with code ${charCode} at position ${i}`); + } + return charCode; + }); + } + var isPosBig = (n) => typeof n === "bigint" && _0n <= n; + function inRange(n, min, max) { + return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max; + } + function aInRange(title, n, min, max) { + if (!inRange(n, min, max)) + throw new Error("expected valid " + title + ": " + min + " <= n < " + max + ", got " + n); + } + function bitLen(n) { + let len; + for (len = 0; n > _0n; n >>= _1n, len += 1) + ; + return len; + } + var bitMask = (n) => (_1n << BigInt(n)) - _1n; + function createHmacDrbg(hashLen, qByteLen, hmacFn) { + anumber(hashLen, "hashLen"); + anumber(qByteLen, "qByteLen"); + if (typeof hmacFn !== "function") + throw new Error("hmacFn must be a function"); + const u8n = (len) => new Uint8Array(len); + const NULL = Uint8Array.of(); + const byte0 = Uint8Array.of(0); + const byte1 = Uint8Array.of(1); + const _maxDrbgIters = 1e3; + let v = u8n(hashLen); + let k = u8n(hashLen); + let i = 0; + const reset = () => { + v.fill(1); + k.fill(0); + i = 0; + }; + const h = (...msgs) => hmacFn(k, concatBytes(v, ...msgs)); + const reseed = (seed = NULL) => { + k = h(byte0, seed); + v = h(); + if (seed.length === 0) + return; + k = h(byte1, seed); + v = h(); + }; + const gen = () => { + if (i++ >= _maxDrbgIters) + throw new Error("drbg: tried max amount of iterations"); + let len = 0; + const out = []; + while (len < qByteLen) { + v = h(); + const sl = v.slice(); + out.push(sl); + len += v.length; + } + return concatBytes(...out); + }; + const genUntil = (seed, pred) => { + reset(); + reseed(seed); + let res = void 0; + while (!(res = pred(gen()))) + reseed(); + reset(); + return res; + }; + return genUntil; + } + function validateObject(object, fields = {}, optFields = {}) { + if (!object || typeof object !== "object") + throw new Error("expected valid options object"); + function checkField(fieldName, expectedType, isOpt) { + const val = object[fieldName]; + if (isOpt && val === void 0) + return; + const current = typeof val; + if (current !== expectedType || val === null) + throw new Error(`param "${fieldName}" is invalid: expected ${expectedType}, got ${current}`); + } + const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt)); + iter(fields, false); + iter(optFields, true); + } + function memoized(fn) { + const map = /* @__PURE__ */ new WeakMap(); + return (arg, ...args) => { + const val = map.get(arg); + if (val !== void 0) + return val; + const computed = fn(arg, ...args); + map.set(arg, computed); + return computed; + }; + } + + // node_modules/@noble/curves/abstract/modular.js + init_process(); + var _0n2 = /* @__PURE__ */ BigInt(0); + var _1n2 = /* @__PURE__ */ BigInt(1); + var _2n = /* @__PURE__ */ BigInt(2); + var _3n = /* @__PURE__ */ BigInt(3); + var _4n = /* @__PURE__ */ BigInt(4); + var _5n = /* @__PURE__ */ BigInt(5); + var _7n = /* @__PURE__ */ BigInt(7); + var _8n = /* @__PURE__ */ BigInt(8); + var _9n = /* @__PURE__ */ BigInt(9); + var _16n = /* @__PURE__ */ BigInt(16); + function mod(a, b) { + const result = a % b; + return result >= _0n2 ? result : b + result; + } + function pow2(x, power, modulo) { + let res = x; + while (power-- > _0n2) { + res *= res; + res %= modulo; + } + return res; + } + function invert(number, modulo) { + if (number === _0n2) + throw new Error("invert: expected non-zero number"); + if (modulo <= _0n2) + throw new Error("invert: expected positive modulus, got " + modulo); + let a = mod(number, modulo); + let b = modulo; + let x = _0n2, y = _1n2, u = _1n2, v = _0n2; + while (a !== _0n2) { + const q = b / a; + const r = b % a; + const m = x - u * q; + const n = y - v * q; + b = a, a = r, x = u, y = v, u = m, v = n; + } + const gcd2 = b; + if (gcd2 !== _1n2) + throw new Error("invert: does not exist"); + return mod(x, modulo); + } + function assertIsSquare(Fp, root, n) { + if (!Fp.eql(Fp.sqr(root), n)) + throw new Error("Cannot find square root"); + } + function sqrt3mod4(Fp, n) { + const p1div4 = (Fp.ORDER + _1n2) / _4n; + const root = Fp.pow(n, p1div4); + assertIsSquare(Fp, root, n); + return root; + } + function sqrt5mod8(Fp, n) { + const p5div8 = (Fp.ORDER - _5n) / _8n; + const n2 = Fp.mul(n, _2n); + const v = Fp.pow(n2, p5div8); + const nv = Fp.mul(n, v); + const i = Fp.mul(Fp.mul(nv, _2n), v); + const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); + assertIsSquare(Fp, root, n); + return root; + } + function sqrt9mod16(P) { + const Fp_ = Field(P); + const tn = tonelliShanks(P); + const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); + const c2 = tn(Fp_, c1); + const c3 = tn(Fp_, Fp_.neg(c1)); + const c4 = (P + _7n) / _16n; + return (Fp, n) => { + let tv1 = Fp.pow(n, c4); + let tv2 = Fp.mul(tv1, c1); + const tv3 = Fp.mul(tv1, c2); + const tv4 = Fp.mul(tv1, c3); + const e1 = Fp.eql(Fp.sqr(tv2), n); + const e2 = Fp.eql(Fp.sqr(tv3), n); + tv1 = Fp.cmov(tv1, tv2, e1); + tv2 = Fp.cmov(tv4, tv3, e2); + const e3 = Fp.eql(Fp.sqr(tv2), n); + const root = Fp.cmov(tv1, tv2, e3); + assertIsSquare(Fp, root, n); + return root; + }; + } + function tonelliShanks(P) { + if (P < _3n) + throw new Error("sqrt is not defined for small field"); + let Q = P - _1n2; + let S = 0; + while (Q % _2n === _0n2) { + Q /= _2n; + S++; + } + let Z = _2n; + const _Fp = Field(P); + while (FpLegendre(_Fp, Z) === 1) { + if (Z++ > 1e3) + throw new Error("Cannot find square root: probably non-prime P"); + } + if (S === 1) + return sqrt3mod4; + let cc = _Fp.pow(Z, Q); + const Q1div2 = (Q + _1n2) / _2n; + return function tonelliSlow(Fp, n) { + if (Fp.is0(n)) + return n; + if (FpLegendre(Fp, n) !== 1) + throw new Error("Cannot find square root"); + let M = S; + let c = Fp.mul(Fp.ONE, cc); + let t = Fp.pow(n, Q); + let R = Fp.pow(n, Q1div2); + while (!Fp.eql(t, Fp.ONE)) { + if (Fp.is0(t)) + return Fp.ZERO; + let i = 1; + let t_tmp = Fp.sqr(t); + while (!Fp.eql(t_tmp, Fp.ONE)) { + i++; + t_tmp = Fp.sqr(t_tmp); + if (i === M) + throw new Error("Cannot find square root"); + } + const exponent = _1n2 << BigInt(M - i - 1); + const b = Fp.pow(c, exponent); + M = i; + c = Fp.sqr(b); + t = Fp.mul(t, c); + R = Fp.mul(R, b); + } + return R; + }; + } + function FpSqrt(P) { + if (P % _4n === _3n) + return sqrt3mod4; + if (P % _8n === _5n) + return sqrt5mod8; + if (P % _16n === _9n) + return sqrt9mod16(P); + return tonelliShanks(P); + } + var FIELD_FIELDS = [ + "create", + "isValid", + "is0", + "neg", + "inv", + "sqrt", + "sqr", + "eql", + "add", + "sub", + "mul", + "pow", + "div", + "addN", + "subN", + "mulN", + "sqrN" + ]; + function validateField(field) { + const initial = { + ORDER: "bigint", + BYTES: "number", + BITS: "number" + }; + const opts = FIELD_FIELDS.reduce((map, val) => { + map[val] = "function"; + return map; + }, initial); + validateObject(field, opts); + return field; + } + function FpPow(Fp, num2, power) { + if (power < _0n2) + throw new Error("invalid exponent, negatives unsupported"); + if (power === _0n2) + return Fp.ONE; + if (power === _1n2) + return num2; + let p = Fp.ONE; + let d = num2; + while (power > _0n2) { + if (power & _1n2) + p = Fp.mul(p, d); + d = Fp.sqr(d); + power >>= _1n2; + } + return p; + } + function FpInvertBatch(Fp, nums, passZero = false) { + const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : void 0); + const multipliedAcc = nums.reduce((acc, num2, i) => { + if (Fp.is0(num2)) + return acc; + inverted[i] = acc; + return Fp.mul(acc, num2); + }, Fp.ONE); + const invertedAcc = Fp.inv(multipliedAcc); + nums.reduceRight((acc, num2, i) => { + if (Fp.is0(num2)) + return acc; + inverted[i] = Fp.mul(acc, inverted[i]); + return Fp.mul(acc, num2); + }, invertedAcc); + return inverted; + } + function FpLegendre(Fp, n) { + const p1mod2 = (Fp.ORDER - _1n2) / _2n; + const powered = Fp.pow(n, p1mod2); + const yes = Fp.eql(powered, Fp.ONE); + const zero = Fp.eql(powered, Fp.ZERO); + const no = Fp.eql(powered, Fp.neg(Fp.ONE)); + if (!yes && !zero && !no) + throw new Error("invalid Legendre symbol result"); + return yes ? 1 : zero ? 0 : -1; + } + function nLength(n, nBitLength) { + if (nBitLength !== void 0) + anumber(nBitLength); + const _nBitLength = nBitLength !== void 0 ? nBitLength : n.toString(2).length; + const nByteLength = Math.ceil(_nBitLength / 8); + return { nBitLength: _nBitLength, nByteLength }; + } + var _Field = class { + ORDER; + BITS; + BYTES; + isLE; + ZERO = _0n2; + ONE = _1n2; + _lengths; + _sqrt; + // cached sqrt + _mod; + constructor(ORDER, opts = {}) { + if (ORDER <= _0n2) + throw new Error("invalid field: expected ORDER > 0, got " + ORDER); + let _nbitLength = void 0; + this.isLE = false; + if (opts != null && typeof opts === "object") { + if (typeof opts.BITS === "number") + _nbitLength = opts.BITS; + if (typeof opts.sqrt === "function") + this.sqrt = opts.sqrt; + if (typeof opts.isLE === "boolean") + this.isLE = opts.isLE; + if (opts.allowedLengths) + this._lengths = opts.allowedLengths?.slice(); + if (typeof opts.modFromBytes === "boolean") + this._mod = opts.modFromBytes; + } + const { nBitLength, nByteLength } = nLength(ORDER, _nbitLength); + if (nByteLength > 2048) + throw new Error("invalid field: expected ORDER of <= 2048 bytes"); + this.ORDER = ORDER; + this.BITS = nBitLength; + this.BYTES = nByteLength; + this._sqrt = void 0; + Object.preventExtensions(this); + } + create(num2) { + return mod(num2, this.ORDER); + } + isValid(num2) { + if (typeof num2 !== "bigint") + throw new Error("invalid field element: expected bigint, got " + typeof num2); + return _0n2 <= num2 && num2 < this.ORDER; + } + is0(num2) { + return num2 === _0n2; + } + // is valid and invertible + isValidNot0(num2) { + return !this.is0(num2) && this.isValid(num2); + } + isOdd(num2) { + return (num2 & _1n2) === _1n2; + } + neg(num2) { + return mod(-num2, this.ORDER); + } + eql(lhs, rhs) { + return lhs === rhs; + } + sqr(num2) { + return mod(num2 * num2, this.ORDER); + } + add(lhs, rhs) { + return mod(lhs + rhs, this.ORDER); + } + sub(lhs, rhs) { + return mod(lhs - rhs, this.ORDER); + } + mul(lhs, rhs) { + return mod(lhs * rhs, this.ORDER); + } + pow(num2, power) { + return FpPow(this, num2, power); + } + div(lhs, rhs) { + return mod(lhs * invert(rhs, this.ORDER), this.ORDER); + } + // Same as above, but doesn't normalize + sqrN(num2) { + return num2 * num2; + } + addN(lhs, rhs) { + return lhs + rhs; + } + subN(lhs, rhs) { + return lhs - rhs; + } + mulN(lhs, rhs) { + return lhs * rhs; + } + inv(num2) { + return invert(num2, this.ORDER); + } + sqrt(num2) { + if (!this._sqrt) + this._sqrt = FpSqrt(this.ORDER); + return this._sqrt(this, num2); + } + toBytes(num2) { + return this.isLE ? numberToBytesLE(num2, this.BYTES) : numberToBytesBE(num2, this.BYTES); + } + fromBytes(bytes, skipValidation = false) { + abytes(bytes); + const { _lengths: allowedLengths, BYTES, isLE: isLE3, ORDER, _mod: modFromBytes } = this; + if (allowedLengths) { + if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) { + throw new Error("Field.fromBytes: expected " + allowedLengths + " bytes, got " + bytes.length); + } + const padded = new Uint8Array(BYTES); + padded.set(bytes, isLE3 ? 0 : padded.length - bytes.length); + bytes = padded; + } + if (bytes.length !== BYTES) + throw new Error("Field.fromBytes: expected " + BYTES + " bytes, got " + bytes.length); + let scalar = isLE3 ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes); + if (modFromBytes) + scalar = mod(scalar, ORDER); + if (!skipValidation) { + if (!this.isValid(scalar)) + throw new Error("invalid field element: outside of range 0..ORDER"); + } + return scalar; + } + // TODO: we don't need it here, move out to separate fn + invertBatch(lst) { + return FpInvertBatch(this, lst); + } + // We can't move this out because Fp6, Fp12 implement it + // and it's unclear what to return in there. + cmov(a, b, condition) { + return condition ? b : a; + } + }; + function Field(ORDER, opts = {}) { + return new _Field(ORDER, opts); + } + function getFieldBytesLength(fieldOrder) { + if (typeof fieldOrder !== "bigint") + throw new Error("field order must be bigint"); + const bitLength = fieldOrder.toString(2).length; + return Math.ceil(bitLength / 8); + } + function getMinHashLength(fieldOrder) { + const length = getFieldBytesLength(fieldOrder); + return length + Math.ceil(length / 2); + } + function mapHashToField(key, fieldOrder, isLE3 = false) { + abytes(key); + const len = key.length; + const fieldLen = getFieldBytesLength(fieldOrder); + const minLen = getMinHashLength(fieldOrder); + if (len < 16 || len < minLen || len > 1024) + throw new Error("expected " + minLen + "-1024 bytes of input, got " + len); + const num2 = isLE3 ? bytesToNumberLE(key) : bytesToNumberBE(key); + const reduced = mod(num2, fieldOrder - _1n2) + _1n2; + return isLE3 ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen); + } + + // node_modules/@noble/curves/abstract/curve.js + var _0n3 = /* @__PURE__ */ BigInt(0); + var _1n3 = /* @__PURE__ */ BigInt(1); + function negateCt(condition, item) { + const neg = item.negate(); + return condition ? neg : item; + } + function normalizeZ(c, points) { + const invertedZs = FpInvertBatch(c.Fp, points.map((p) => p.Z)); + return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i]))); + } + function validateW(W, bits) { + if (!Number.isSafeInteger(W) || W <= 0 || W > bits) + throw new Error("invalid window size, expected [1.." + bits + "], got W=" + W); + } + function calcWOpts(W, scalarBits) { + validateW(W, scalarBits); + const windows = Math.ceil(scalarBits / W) + 1; + const windowSize = 2 ** (W - 1); + const maxNumber = 2 ** W; + const mask = bitMask(W); + const shiftBy = BigInt(W); + return { windows, windowSize, mask, maxNumber, shiftBy }; + } + function calcOffsets(n, window2, wOpts) { + const { windowSize, mask, maxNumber, shiftBy } = wOpts; + let wbits = Number(n & mask); + let nextN = n >> shiftBy; + if (wbits > windowSize) { + wbits -= maxNumber; + nextN += _1n3; + } + const offsetStart = window2 * windowSize; + const offset = offsetStart + Math.abs(wbits) - 1; + const isZero = wbits === 0; + const isNeg = wbits < 0; + const isNegF = window2 % 2 !== 0; + const offsetF = offsetStart; + return { nextN, offset, isZero, isNeg, isNegF, offsetF }; + } + var pointPrecomputes = /* @__PURE__ */ new WeakMap(); + var pointWindowSizes = /* @__PURE__ */ new WeakMap(); + function getW(P) { + return pointWindowSizes.get(P) || 1; + } + function assert0(n) { + if (n !== _0n3) + throw new Error("invalid wNAF"); + } + var wNAF = class { + BASE; + ZERO; + Fn; + bits; + // Parametrized with a given Point class (not individual point) + constructor(Point, bits) { + this.BASE = Point.BASE; + this.ZERO = Point.ZERO; + this.Fn = Point.Fn; + this.bits = bits; + } + // non-const time multiplication ladder + _unsafeLadder(elm, n, p = this.ZERO) { + let d = elm; + while (n > _0n3) { + if (n & _1n3) + p = p.add(d); + d = d.double(); + n >>= _1n3; + } + return p; + } + /** + * Creates a wNAF precomputation window. Used for caching. + * Default window size is set by `utils.precompute()` and is equal to 8. + * Number of precomputed points depends on the curve size: + * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where: + * - 𝑊 is the window size + * - 𝑛 is the bitlength of the curve order. + * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. + * @param point Point instance + * @param W window size + * @returns precomputed point tables flattened to a single array + */ + precomputeWindow(point, W) { + const { windows, windowSize } = calcWOpts(W, this.bits); + const points = []; + let p = point; + let base = p; + for (let window2 = 0; window2 < windows; window2++) { + base = p; + points.push(base); + for (let i = 1; i < windowSize; i++) { + base = base.add(p); + points.push(base); + } + p = base.double(); + } + return points; + } + /** + * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. + * More compact implementation: + * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541 + * @returns real and fake (for const-time) points + */ + wNAF(W, precomputes, n) { + if (!this.Fn.isValid(n)) + throw new Error("invalid scalar"); + let p = this.ZERO; + let f = this.BASE; + const wo = calcWOpts(W, this.bits); + for (let window2 = 0; window2 < wo.windows; window2++) { + const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window2, wo); + n = nextN; + if (isZero) { + f = f.add(negateCt(isNegF, precomputes[offsetF])); + } else { + p = p.add(negateCt(isNeg, precomputes[offset])); + } + } + assert0(n); + return { p, f }; + } + /** + * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form. + * @param acc accumulator point to add result of multiplication + * @returns point + */ + wNAFUnsafe(W, precomputes, n, acc = this.ZERO) { + const wo = calcWOpts(W, this.bits); + for (let window2 = 0; window2 < wo.windows; window2++) { + if (n === _0n3) + break; + const { nextN, offset, isZero, isNeg } = calcOffsets(n, window2, wo); + n = nextN; + if (isZero) { + continue; + } else { + const item = precomputes[offset]; + acc = acc.add(isNeg ? item.negate() : item); + } + } + assert0(n); + return acc; + } + getPrecomputes(W, point, transform) { + let comp = pointPrecomputes.get(point); + if (!comp) { + comp = this.precomputeWindow(point, W); + if (W !== 1) { + if (typeof transform === "function") + comp = transform(comp); + pointPrecomputes.set(point, comp); + } + } + return comp; + } + cached(point, scalar, transform) { + const W = getW(point); + return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar); + } + unsafe(point, scalar, transform, prev) { + const W = getW(point); + if (W === 1) + return this._unsafeLadder(point, scalar, prev); + return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev); + } + // We calculate precomputes for elliptic curve point multiplication + // using windowed method. This specifies window size and + // stores precomputed values. Usually only base point would be precomputed. + createCache(P, W) { + validateW(W, this.bits); + pointWindowSizes.set(P, W); + pointPrecomputes.delete(P); + } + hasCache(elm) { + return getW(elm) !== 1; + } + }; + function mulEndoUnsafe(Point, point, k1, k2) { + let acc = point; + let p1 = Point.ZERO; + let p2 = Point.ZERO; + while (k1 > _0n3 || k2 > _0n3) { + if (k1 & _1n3) + p1 = p1.add(acc); + if (k2 & _1n3) + p2 = p2.add(acc); + acc = acc.double(); + k1 >>= _1n3; + k2 >>= _1n3; + } + return { p1, p2 }; + } + function createField(order, field, isLE3) { + if (field) { + if (field.ORDER !== order) + throw new Error("Field.ORDER must match order: Fp == p, Fn == n"); + validateField(field); + return field; + } else { + return Field(order, { isLE: isLE3 }); + } + } + function createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) { + if (FpFnLE === void 0) + FpFnLE = type === "edwards"; + if (!CURVE || typeof CURVE !== "object") + throw new Error(`expected valid ${type} CURVE object`); + for (const p of ["p", "n", "h"]) { + const val = CURVE[p]; + if (!(typeof val === "bigint" && val > _0n3)) + throw new Error(`CURVE.${p} must be positive bigint`); + } + const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE); + const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE); + const _b = type === "weierstrass" ? "b" : "d"; + const params = ["Gx", "Gy", "a", _b]; + for (const p of params) { + if (!Fp.isValid(CURVE[p])) + throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`); + } + CURVE = Object.freeze(Object.assign({}, CURVE)); + return { CURVE, Fp, Fn }; + } + function createKeygen(randomSecretKey, getPublicKey2) { + return function keygen(seed) { + const secretKey = randomSecretKey(seed); + return { secretKey, publicKey: getPublicKey2(secretKey) }; + }; + } + + // node_modules/@noble/curves/abstract/weierstrass.js + init_process(); + + // node_modules/@noble/hashes/hmac.js + init_process(); + var _HMAC = class { + oHash; + iHash; + blockLen; + outputLen; + finished = false; + destroyed = false; + constructor(hash, key) { + ahash(hash); + abytes(key, void 0, "key"); + this.iHash = hash.create(); + if (typeof this.iHash.update !== "function") + throw new Error("Expected instance of class which extends utils.Hash"); + this.blockLen = this.iHash.blockLen; + this.outputLen = this.iHash.outputLen; + const blockLen = this.blockLen; + const pad2 = new Uint8Array(blockLen); + pad2.set(key.length > blockLen ? hash.create().update(key).digest() : key); + for (let i = 0; i < pad2.length; i++) + pad2[i] ^= 54; + this.iHash.update(pad2); + this.oHash = hash.create(); + for (let i = 0; i < pad2.length; i++) + pad2[i] ^= 54 ^ 92; + this.oHash.update(pad2); + clean(pad2); + } + update(buf) { + aexists(this); + this.iHash.update(buf); + return this; + } + digestInto(out) { + aexists(this); + abytes(out, this.outputLen, "output"); + this.finished = true; + this.iHash.digestInto(out); + this.oHash.update(out); + this.oHash.digestInto(out); + this.destroy(); + } + digest() { + const out = new Uint8Array(this.oHash.outputLen); + this.digestInto(out); + return out; + } + _cloneInto(to) { + to ||= Object.create(Object.getPrototypeOf(this), {}); + const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this; + to = to; + to.finished = finished; + to.destroyed = destroyed; + to.blockLen = blockLen; + to.outputLen = outputLen; + to.oHash = oHash._cloneInto(to.oHash); + to.iHash = iHash._cloneInto(to.iHash); + return to; + } + clone() { + return this._cloneInto(); + } + destroy() { + this.destroyed = true; + this.oHash.destroy(); + this.iHash.destroy(); + } + }; + var hmac = (hash, key, message) => new _HMAC(hash, key).update(message).digest(); + hmac.create = (hash, key) => new _HMAC(hash, key); + + // node_modules/@noble/curves/abstract/weierstrass.js + var divNearest = (num2, den) => (num2 + (num2 >= 0 ? den : -den) / _2n2) / den; + function _splitEndoScalar(k, basis, n) { + const [[a1, b1], [a2, b2]] = basis; + const c1 = divNearest(b2 * k, n); + const c2 = divNearest(-b1 * k, n); + let k1 = k - c1 * a1 - c2 * a2; + let k2 = -c1 * b1 - c2 * b2; + const k1neg = k1 < _0n4; + const k2neg = k2 < _0n4; + if (k1neg) + k1 = -k1; + if (k2neg) + k2 = -k2; + const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n4; + if (k1 < _0n4 || k1 >= MAX_NUM || k2 < _0n4 || k2 >= MAX_NUM) { + throw new Error("splitScalar (endomorphism): failed, k=" + k); + } + return { k1neg, k1, k2neg, k2 }; + } + function validateSigFormat(format) { + if (!["compact", "recovered", "der"].includes(format)) + throw new Error('Signature format must be "compact", "recovered", or "der"'); + return format; + } + function validateSigOpts(opts, def) { + const optsn = {}; + for (let optName of Object.keys(def)) { + optsn[optName] = opts[optName] === void 0 ? def[optName] : opts[optName]; + } + abool(optsn.lowS, "lowS"); + abool(optsn.prehash, "prehash"); + if (optsn.format !== void 0) + validateSigFormat(optsn.format); + return optsn; + } + var DERErr = class extends Error { + constructor(m = "") { + super(m); + } + }; + var DER = { + // asn.1 DER encoding utils + Err: DERErr, + // Basic building block is TLV (Tag-Length-Value) + _tlv: { + encode: (tag, data) => { + const { Err: E } = DER; + if (tag < 0 || tag > 256) + throw new E("tlv.encode: wrong tag"); + if (data.length & 1) + throw new E("tlv.encode: unpadded data"); + const dataLen = data.length / 2; + const len = numberToHexUnpadded(dataLen); + if (len.length / 2 & 128) + throw new E("tlv.encode: long form length too big"); + const lenLen = dataLen > 127 ? numberToHexUnpadded(len.length / 2 | 128) : ""; + const t = numberToHexUnpadded(tag); + return t + lenLen + len + data; + }, + // v - value, l - left bytes (unparsed) + decode(tag, data) { + const { Err: E } = DER; + let pos = 0; + if (tag < 0 || tag > 256) + throw new E("tlv.encode: wrong tag"); + if (data.length < 2 || data[pos++] !== tag) + throw new E("tlv.decode: wrong tlv"); + const first = data[pos++]; + const isLong = !!(first & 128); + let length = 0; + if (!isLong) + length = first; + else { + const lenLen = first & 127; + if (!lenLen) + throw new E("tlv.decode(long): indefinite length not supported"); + if (lenLen > 4) + throw new E("tlv.decode(long): byte length is too big"); + const lengthBytes = data.subarray(pos, pos + lenLen); + if (lengthBytes.length !== lenLen) + throw new E("tlv.decode: length bytes not complete"); + if (lengthBytes[0] === 0) + throw new E("tlv.decode(long): zero leftmost byte"); + for (const b of lengthBytes) + length = length << 8 | b; + pos += lenLen; + if (length < 128) + throw new E("tlv.decode(long): not minimal encoding"); + } + const v = data.subarray(pos, pos + length); + if (v.length !== length) + throw new E("tlv.decode: wrong value length"); + return { v, l: data.subarray(pos + length) }; + } + }, + // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag, + // since we always use positive integers here. It must always be empty: + // - add zero byte if exists + // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding) + _int: { + encode(num2) { + const { Err: E } = DER; + if (num2 < _0n4) + throw new E("integer: negative integers are not allowed"); + let hex = numberToHexUnpadded(num2); + if (Number.parseInt(hex[0], 16) & 8) + hex = "00" + hex; + if (hex.length & 1) + throw new E("unexpected DER parsing assertion: unpadded hex"); + return hex; + }, + decode(data) { + const { Err: E } = DER; + if (data[0] & 128) + throw new E("invalid signature integer: negative"); + if (data[0] === 0 && !(data[1] & 128)) + throw new E("invalid signature integer: unnecessary leading zero"); + return bytesToNumberBE(data); + } + }, + toSig(bytes) { + const { Err: E, _int: int, _tlv: tlv } = DER; + const data = abytes(bytes, void 0, "signature"); + const { v: seqBytes, l: seqLeftBytes } = tlv.decode(48, data); + if (seqLeftBytes.length) + throw new E("invalid signature: left bytes after parsing"); + const { v: rBytes, l: rLeftBytes } = tlv.decode(2, seqBytes); + const { v: sBytes, l: sLeftBytes } = tlv.decode(2, rLeftBytes); + if (sLeftBytes.length) + throw new E("invalid signature: left bytes after parsing"); + return { r: int.decode(rBytes), s: int.decode(sBytes) }; + }, + hexFromSig(sig) { + const { _tlv: tlv, _int: int } = DER; + const rs = tlv.encode(2, int.encode(sig.r)); + const ss = tlv.encode(2, int.encode(sig.s)); + const seq = rs + ss; + return tlv.encode(48, seq); + } + }; + var _0n4 = BigInt(0); + var _1n4 = BigInt(1); + var _2n2 = BigInt(2); + var _3n2 = BigInt(3); + var _4n2 = BigInt(4); + function weierstrass(params, extraOpts = {}) { + const validated = createCurveFields("weierstrass", params, extraOpts); + const { Fp, Fn } = validated; + let CURVE = validated.CURVE; + const { h: cofactor, n: CURVE_ORDER } = CURVE; + validateObject(extraOpts, {}, { + allowInfinityPoint: "boolean", + clearCofactor: "function", + isTorsionFree: "function", + fromBytes: "function", + toBytes: "function", + endo: "object" + }); + const { endo } = extraOpts; + if (endo) { + if (!Fp.is0(CURVE.a) || typeof endo.beta !== "bigint" || !Array.isArray(endo.basises)) { + throw new Error('invalid endo: expected "beta": bigint and "basises": array'); + } + } + const lengths = getWLengths(Fp, Fn); + function assertCompressionIsSupported() { + if (!Fp.isOdd) + throw new Error("compression is not supported: Field does not have .isOdd()"); + } + function pointToBytes2(_c, point, isCompressed) { + const { x, y } = point.toAffine(); + const bx = Fp.toBytes(x); + abool(isCompressed, "isCompressed"); + if (isCompressed) { + assertCompressionIsSupported(); + const hasEvenY = !Fp.isOdd(y); + return concatBytes(pprefix(hasEvenY), bx); + } else { + return concatBytes(Uint8Array.of(4), bx, Fp.toBytes(y)); + } + } + function pointFromBytes(bytes) { + abytes(bytes, void 0, "Point"); + const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; + const length = bytes.length; + const head = bytes[0]; + const tail = bytes.subarray(1); + if (length === comp && (head === 2 || head === 3)) { + const x = Fp.fromBytes(tail); + if (!Fp.isValid(x)) + throw new Error("bad point: is not on curve, wrong x"); + const y2 = weierstrassEquation(x); + let y; + try { + y = Fp.sqrt(y2); + } catch (sqrtError) { + const err = sqrtError instanceof Error ? ": " + sqrtError.message : ""; + throw new Error("bad point: is not on curve, sqrt error" + err); + } + assertCompressionIsSupported(); + const evenY = Fp.isOdd(y); + const evenH = (head & 1) === 1; + if (evenH !== evenY) + y = Fp.neg(y); + return { x, y }; + } else if (length === uncomp && head === 4) { + const L = Fp.BYTES; + const x = Fp.fromBytes(tail.subarray(0, L)); + const y = Fp.fromBytes(tail.subarray(L, L * 2)); + if (!isValidXY(x, y)) + throw new Error("bad point: is not on curve"); + return { x, y }; + } else { + throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`); + } + } + const encodePoint = extraOpts.toBytes || pointToBytes2; + const decodePoint = extraOpts.fromBytes || pointFromBytes; + function weierstrassEquation(x) { + const x2 = Fp.sqr(x); + const x3 = Fp.mul(x2, x); + return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); + } + function isValidXY(x, y) { + const left = Fp.sqr(y); + const right = weierstrassEquation(x); + return Fp.eql(left, right); + } + if (!isValidXY(CURVE.Gx, CURVE.Gy)) + throw new Error("bad curve params: generator point"); + const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n2), _4n2); + const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27)); + if (Fp.is0(Fp.add(_4a3, _27b2))) + throw new Error("bad curve params: a or b"); + function acoord(title, n, banZero = false) { + if (!Fp.isValid(n) || banZero && Fp.is0(n)) + throw new Error(`bad point coordinate ${title}`); + return n; + } + function aprjpoint(other) { + if (!(other instanceof Point)) + throw new Error("Weierstrass Point expected"); + } + function splitEndoScalarN(k) { + if (!endo || !endo.basises) + throw new Error("no endo"); + return _splitEndoScalar(k, endo.basises, Fn.ORDER); + } + const toAffineMemo = memoized((p, iz) => { + const { X, Y, Z } = p; + if (Fp.eql(Z, Fp.ONE)) + return { x: X, y: Y }; + const is0 = p.is0(); + if (iz == null) + iz = is0 ? Fp.ONE : Fp.inv(Z); + const x = Fp.mul(X, iz); + const y = Fp.mul(Y, iz); + const zz = Fp.mul(Z, iz); + if (is0) + return { x: Fp.ZERO, y: Fp.ZERO }; + if (!Fp.eql(zz, Fp.ONE)) + throw new Error("invZ was invalid"); + return { x, y }; + }); + const assertValidMemo = memoized((p) => { + if (p.is0()) { + if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) + return; + throw new Error("bad point: ZERO"); + } + const { x, y } = p.toAffine(); + if (!Fp.isValid(x) || !Fp.isValid(y)) + throw new Error("bad point: x or y not field elements"); + if (!isValidXY(x, y)) + throw new Error("bad point: equation left != right"); + if (!p.isTorsionFree()) + throw new Error("bad point: not in prime-order subgroup"); + return true; + }); + function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) { + k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z); + k1p = negateCt(k1neg, k1p); + k2p = negateCt(k2neg, k2p); + return k1p.add(k2p); + } + class Point { + // base / generator point + static BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE); + // zero / infinity / identity point + static ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); + // 0, 1, 0 + // math field + static Fp = Fp; + // scalar field + static Fn = Fn; + X; + Y; + Z; + /** Does NOT validate if the point is valid. Use `.assertValidity()`. */ + constructor(X, Y, Z) { + this.X = acoord("x", X); + this.Y = acoord("y", Y, true); + this.Z = acoord("z", Z); + Object.freeze(this); + } + static CURVE() { + return CURVE; + } + /** Does NOT validate if the point is valid. Use `.assertValidity()`. */ + static fromAffine(p) { + const { x, y } = p || {}; + if (!p || !Fp.isValid(x) || !Fp.isValid(y)) + throw new Error("invalid affine point"); + if (p instanceof Point) + throw new Error("projective point not allowed"); + if (Fp.is0(x) && Fp.is0(y)) + return Point.ZERO; + return new Point(x, y, Fp.ONE); + } + static fromBytes(bytes) { + const P = Point.fromAffine(decodePoint(abytes(bytes, void 0, "point"))); + P.assertValidity(); + return P; + } + static fromHex(hex) { + return Point.fromBytes(hexToBytes(hex)); + } + get x() { + return this.toAffine().x; + } + get y() { + return this.toAffine().y; + } + /** + * + * @param windowSize + * @param isLazy true will defer table computation until the first multiplication + * @returns + */ + precompute(windowSize = 8, isLazy = true) { + wnaf.createCache(this, windowSize); + if (!isLazy) + this.multiply(_3n2); + return this; + } + // TODO: return `this` + /** A point on curve is valid if it conforms to equation. */ + assertValidity() { + assertValidMemo(this); + } + hasEvenY() { + const { y } = this.toAffine(); + if (!Fp.isOdd) + throw new Error("Field doesn't support isOdd"); + return !Fp.isOdd(y); + } + /** Compare one point to another. */ + equals(other) { + aprjpoint(other); + const { X: X1, Y: Y1, Z: Z1 } = this; + const { X: X2, Y: Y2, Z: Z2 } = other; + const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1)); + const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1)); + return U1 && U2; + } + /** Flips point to one corresponding to (x, -y) in Affine coordinates. */ + negate() { + return new Point(this.X, Fp.neg(this.Y), this.Z); + } + // Renes-Costello-Batina exception-free doubling formula. + // There is 30% faster Jacobian formula, but it is not complete. + // https://eprint.iacr.org/2015/1060, algorithm 3 + // Cost: 8M + 3S + 3*a + 2*b3 + 15add. + double() { + const { a, b } = CURVE; + const b3 = Fp.mul(b, _3n2); + const { X: X1, Y: Y1, Z: Z1 } = this; + let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; + let t0 = Fp.mul(X1, X1); + let t1 = Fp.mul(Y1, Y1); + let t2 = Fp.mul(Z1, Z1); + let t3 = Fp.mul(X1, Y1); + t3 = Fp.add(t3, t3); + Z3 = Fp.mul(X1, Z1); + Z3 = Fp.add(Z3, Z3); + X3 = Fp.mul(a, Z3); + Y3 = Fp.mul(b3, t2); + Y3 = Fp.add(X3, Y3); + X3 = Fp.sub(t1, Y3); + Y3 = Fp.add(t1, Y3); + Y3 = Fp.mul(X3, Y3); + X3 = Fp.mul(t3, X3); + Z3 = Fp.mul(b3, Z3); + t2 = Fp.mul(a, t2); + t3 = Fp.sub(t0, t2); + t3 = Fp.mul(a, t3); + t3 = Fp.add(t3, Z3); + Z3 = Fp.add(t0, t0); + t0 = Fp.add(Z3, t0); + t0 = Fp.add(t0, t2); + t0 = Fp.mul(t0, t3); + Y3 = Fp.add(Y3, t0); + t2 = Fp.mul(Y1, Z1); + t2 = Fp.add(t2, t2); + t0 = Fp.mul(t2, t3); + X3 = Fp.sub(X3, t0); + Z3 = Fp.mul(t2, t1); + Z3 = Fp.add(Z3, Z3); + Z3 = Fp.add(Z3, Z3); + return new Point(X3, Y3, Z3); + } + // Renes-Costello-Batina exception-free addition formula. + // There is 30% faster Jacobian formula, but it is not complete. + // https://eprint.iacr.org/2015/1060, algorithm 1 + // Cost: 12M + 0S + 3*a + 3*b3 + 23add. + add(other) { + aprjpoint(other); + const { X: X1, Y: Y1, Z: Z1 } = this; + const { X: X2, Y: Y2, Z: Z2 } = other; + let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; + const a = CURVE.a; + const b3 = Fp.mul(CURVE.b, _3n2); + let t0 = Fp.mul(X1, X2); + let t1 = Fp.mul(Y1, Y2); + let t2 = Fp.mul(Z1, Z2); + let t3 = Fp.add(X1, Y1); + let t4 = Fp.add(X2, Y2); + t3 = Fp.mul(t3, t4); + t4 = Fp.add(t0, t1); + t3 = Fp.sub(t3, t4); + t4 = Fp.add(X1, Z1); + let t5 = Fp.add(X2, Z2); + t4 = Fp.mul(t4, t5); + t5 = Fp.add(t0, t2); + t4 = Fp.sub(t4, t5); + t5 = Fp.add(Y1, Z1); + X3 = Fp.add(Y2, Z2); + t5 = Fp.mul(t5, X3); + X3 = Fp.add(t1, t2); + t5 = Fp.sub(t5, X3); + Z3 = Fp.mul(a, t4); + X3 = Fp.mul(b3, t2); + Z3 = Fp.add(X3, Z3); + X3 = Fp.sub(t1, Z3); + Z3 = Fp.add(t1, Z3); + Y3 = Fp.mul(X3, Z3); + t1 = Fp.add(t0, t0); + t1 = Fp.add(t1, t0); + t2 = Fp.mul(a, t2); + t4 = Fp.mul(b3, t4); + t1 = Fp.add(t1, t2); + t2 = Fp.sub(t0, t2); + t2 = Fp.mul(a, t2); + t4 = Fp.add(t4, t2); + t0 = Fp.mul(t1, t4); + Y3 = Fp.add(Y3, t0); + t0 = Fp.mul(t5, t4); + X3 = Fp.mul(t3, X3); + X3 = Fp.sub(X3, t0); + t0 = Fp.mul(t3, t1); + Z3 = Fp.mul(t5, Z3); + Z3 = Fp.add(Z3, t0); + return new Point(X3, Y3, Z3); + } + subtract(other) { + return this.add(other.negate()); + } + is0() { + return this.equals(Point.ZERO); + } + /** + * Constant time multiplication. + * Uses wNAF method. Windowed method may be 10% faster, + * but takes 2x longer to generate and consumes 2x memory. + * Uses precomputes when available. + * Uses endomorphism for Koblitz curves. + * @param scalar by which the point would be multiplied + * @returns New point + */ + multiply(scalar) { + const { endo: endo2 } = extraOpts; + if (!Fn.isValidNot0(scalar)) + throw new Error("invalid scalar: out of range"); + let point, fake; + const mul = (n) => wnaf.cached(this, n, (p) => normalizeZ(Point, p)); + if (endo2) { + const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar); + const { p: k1p, f: k1f } = mul(k1); + const { p: k2p, f: k2f } = mul(k2); + fake = k1f.add(k2f); + point = finishEndo(endo2.beta, k1p, k2p, k1neg, k2neg); + } else { + const { p, f } = mul(scalar); + point = p; + fake = f; + } + return normalizeZ(Point, [point, fake])[0]; + } + /** + * Non-constant-time multiplication. Uses double-and-add algorithm. + * It's faster, but should only be used when you don't care about + * an exposed secret key e.g. sig verification, which works over *public* keys. + */ + multiplyUnsafe(sc) { + const { endo: endo2 } = extraOpts; + const p = this; + if (!Fn.isValid(sc)) + throw new Error("invalid scalar: out of range"); + if (sc === _0n4 || p.is0()) + return Point.ZERO; + if (sc === _1n4) + return p; + if (wnaf.hasCache(this)) + return this.multiply(sc); + if (endo2) { + const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc); + const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); + return finishEndo(endo2.beta, p1, p2, k1neg, k2neg); + } else { + return wnaf.unsafe(p, sc); + } + } + /** + * Converts Projective point to affine (x, y) coordinates. + * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch + */ + toAffine(invertedZ) { + return toAffineMemo(this, invertedZ); + } + /** + * Checks whether Point is free of torsion elements (is in prime subgroup). + * Always torsion-free for cofactor=1 curves. + */ + isTorsionFree() { + const { isTorsionFree } = extraOpts; + if (cofactor === _1n4) + return true; + if (isTorsionFree) + return isTorsionFree(Point, this); + return wnaf.unsafe(this, CURVE_ORDER).is0(); + } + clearCofactor() { + const { clearCofactor } = extraOpts; + if (cofactor === _1n4) + return this; + if (clearCofactor) + return clearCofactor(Point, this); + return this.multiplyUnsafe(cofactor); + } + isSmallOrder() { + return this.multiplyUnsafe(cofactor).is0(); + } + toBytes(isCompressed = true) { + abool(isCompressed, "isCompressed"); + this.assertValidity(); + return encodePoint(Point, this, isCompressed); + } + toHex(isCompressed = true) { + return bytesToHex(this.toBytes(isCompressed)); + } + toString() { + return ``; + } + } + const bits = Fn.BITS; + const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits); + Point.BASE.precompute(8); + return Point; + } + function pprefix(hasEvenY) { + return Uint8Array.of(hasEvenY ? 2 : 3); + } + function getWLengths(Fp, Fn) { + return { + secretKey: Fn.BYTES, + publicKey: 1 + Fp.BYTES, + publicKeyUncompressed: 1 + 2 * Fp.BYTES, + publicKeyHasPrefix: true, + signature: 2 * Fn.BYTES + }; + } + function ecdh(Point, ecdhOpts = {}) { + const { Fn } = Point; + const randomBytes_ = ecdhOpts.randomBytes || randomBytes; + const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) }); + function isValidSecretKey(secretKey) { + try { + const num2 = Fn.fromBytes(secretKey); + return Fn.isValidNot0(num2); + } catch (error) { + return false; + } + } + function isValidPublicKey(publicKey, isCompressed) { + const { publicKey: comp, publicKeyUncompressed } = lengths; + try { + const l = publicKey.length; + if (isCompressed === true && l !== comp) + return false; + if (isCompressed === false && l !== publicKeyUncompressed) + return false; + return !!Point.fromBytes(publicKey); + } catch (error) { + return false; + } + } + function randomSecretKey(seed = randomBytes_(lengths.seed)) { + return mapHashToField(abytes(seed, lengths.seed, "seed"), Fn.ORDER); + } + function getPublicKey2(secretKey, isCompressed = true) { + return Point.BASE.multiply(Fn.fromBytes(secretKey)).toBytes(isCompressed); + } + function isProbPub(item) { + const { secretKey, publicKey, publicKeyUncompressed } = lengths; + if (!isBytes(item)) + return void 0; + if ("_lengths" in Fn && Fn._lengths || secretKey === publicKey) + return void 0; + const l = abytes(item, void 0, "key").length; + return l === publicKey || l === publicKeyUncompressed; + } + function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) { + if (isProbPub(secretKeyA) === true) + throw new Error("first arg must be private key"); + if (isProbPub(publicKeyB) === false) + throw new Error("second arg must be public key"); + const s = Fn.fromBytes(secretKeyA); + const b = Point.fromBytes(publicKeyB); + return b.multiply(s).toBytes(isCompressed); + } + const utils2 = { + isValidSecretKey, + isValidPublicKey, + randomSecretKey + }; + const keygen = createKeygen(randomSecretKey, getPublicKey2); + return Object.freeze({ getPublicKey: getPublicKey2, getSharedSecret, keygen, Point, utils: utils2, lengths }); + } + function ecdsa(Point, hash, ecdsaOpts = {}) { + ahash(hash); + validateObject(ecdsaOpts, {}, { + hmac: "function", + lowS: "boolean", + randomBytes: "function", + bits2int: "function", + bits2int_modN: "function" + }); + ecdsaOpts = Object.assign({}, ecdsaOpts); + const randomBytes3 = ecdsaOpts.randomBytes || randomBytes; + const hmac2 = ecdsaOpts.hmac || ((key, msg) => hmac(hash, key, msg)); + const { Fp, Fn } = Point; + const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn; + const { keygen, getPublicKey: getPublicKey2, getSharedSecret, utils: utils2, lengths } = ecdh(Point, ecdsaOpts); + const defaultSigOpts = { + prehash: true, + lowS: typeof ecdsaOpts.lowS === "boolean" ? ecdsaOpts.lowS : true, + format: "compact", + extraEntropy: false + }; + const hasLargeCofactor = CURVE_ORDER * _2n2 < Fp.ORDER; + function isBiggerThanHalfOrder(number) { + const HALF = CURVE_ORDER >> _1n4; + return number > HALF; + } + function validateRS(title, num2) { + if (!Fn.isValidNot0(num2)) + throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`); + return num2; + } + function assertSmallCofactor() { + if (hasLargeCofactor) + throw new Error('"recovered" sig type is not supported for cofactor >2 curves'); + } + function validateSigLength(bytes, format) { + validateSigFormat(format); + const size = lengths.signature; + const sizer = format === "compact" ? size : format === "recovered" ? size + 1 : void 0; + return abytes(bytes, sizer); + } + class Signature { + r; + s; + recovery; + constructor(r, s, recovery) { + this.r = validateRS("r", r); + this.s = validateRS("s", s); + if (recovery != null) { + assertSmallCofactor(); + if (![0, 1, 2, 3].includes(recovery)) + throw new Error("invalid recovery id"); + this.recovery = recovery; + } + Object.freeze(this); + } + static fromBytes(bytes, format = defaultSigOpts.format) { + validateSigLength(bytes, format); + let recid; + if (format === "der") { + const { r: r2, s: s2 } = DER.toSig(abytes(bytes)); + return new Signature(r2, s2); + } + if (format === "recovered") { + recid = bytes[0]; + format = "compact"; + bytes = bytes.subarray(1); + } + const L = lengths.signature / 2; + const r = bytes.subarray(0, L); + const s = bytes.subarray(L, L * 2); + return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid); + } + static fromHex(hex, format) { + return this.fromBytes(hexToBytes(hex), format); + } + assertRecovery() { + const { recovery } = this; + if (recovery == null) + throw new Error("invalid recovery id: must be present"); + return recovery; + } + addRecoveryBit(recovery) { + return new Signature(this.r, this.s, recovery); + } + recoverPublicKey(messageHash) { + const { r, s } = this; + const recovery = this.assertRecovery(); + const radj = recovery === 2 || recovery === 3 ? r + CURVE_ORDER : r; + if (!Fp.isValid(radj)) + throw new Error("invalid recovery id: sig.r+curve.n != R.x"); + const x = Fp.toBytes(radj); + const R = Point.fromBytes(concatBytes(pprefix((recovery & 1) === 0), x)); + const ir = Fn.inv(radj); + const h = bits2int_modN(abytes(messageHash, void 0, "msgHash")); + const u1 = Fn.create(-h * ir); + const u2 = Fn.create(s * ir); + const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2)); + if (Q.is0()) + throw new Error("invalid recovery: point at infinify"); + Q.assertValidity(); + return Q; + } + // Signatures should be low-s, to prevent malleability. + hasHighS() { + return isBiggerThanHalfOrder(this.s); + } + toBytes(format = defaultSigOpts.format) { + validateSigFormat(format); + if (format === "der") + return hexToBytes(DER.hexFromSig(this)); + const { r, s } = this; + const rb = Fn.toBytes(r); + const sb = Fn.toBytes(s); + if (format === "recovered") { + assertSmallCofactor(); + return concatBytes(Uint8Array.of(this.assertRecovery()), rb, sb); + } + return concatBytes(rb, sb); + } + toHex(format) { + return bytesToHex(this.toBytes(format)); + } + } + const bits2int = ecdsaOpts.bits2int || function bits2int_def(bytes) { + if (bytes.length > 8192) + throw new Error("input is too large"); + const num2 = bytesToNumberBE(bytes); + const delta = bytes.length * 8 - fnBits; + return delta > 0 ? num2 >> BigInt(delta) : num2; + }; + const bits2int_modN = ecdsaOpts.bits2int_modN || function bits2int_modN_def(bytes) { + return Fn.create(bits2int(bytes)); + }; + const ORDER_MASK = bitMask(fnBits); + function int2octets(num2) { + aInRange("num < 2^" + fnBits, num2, _0n4, ORDER_MASK); + return Fn.toBytes(num2); + } + function validateMsgAndHash(message, prehash) { + abytes(message, void 0, "message"); + return prehash ? abytes(hash(message), void 0, "prehashed message") : message; + } + function prepSig(message, secretKey, opts) { + const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts); + message = validateMsgAndHash(message, prehash); + const h1int = bits2int_modN(message); + const d = Fn.fromBytes(secretKey); + if (!Fn.isValidNot0(d)) + throw new Error("invalid private key"); + const seedArgs = [int2octets(d), int2octets(h1int)]; + if (extraEntropy != null && extraEntropy !== false) { + const e = extraEntropy === true ? randomBytes3(lengths.secretKey) : extraEntropy; + seedArgs.push(abytes(e, void 0, "extraEntropy")); + } + const seed = concatBytes(...seedArgs); + const m = h1int; + function k2sig(kBytes) { + const k = bits2int(kBytes); + if (!Fn.isValidNot0(k)) + return; + const ik = Fn.inv(k); + const q = Point.BASE.multiply(k).toAffine(); + const r = Fn.create(q.x); + if (r === _0n4) + return; + const s = Fn.create(ik * Fn.create(m + r * d)); + if (s === _0n4) + return; + let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n4); + let normS = s; + if (lowS && isBiggerThanHalfOrder(s)) { + normS = Fn.neg(s); + recovery ^= 1; + } + return new Signature(r, normS, hasLargeCofactor ? void 0 : recovery); + } + return { seed, k2sig }; + } + function sign(message, secretKey, opts = {}) { + const { seed, k2sig } = prepSig(message, secretKey, opts); + const drbg = createHmacDrbg(hash.outputLen, Fn.BYTES, hmac2); + const sig = drbg(seed, k2sig); + return sig.toBytes(opts.format); + } + function verify(signature, message, publicKey, opts = {}) { + const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts); + publicKey = abytes(publicKey, void 0, "publicKey"); + message = validateMsgAndHash(message, prehash); + if (!isBytes(signature)) { + const end = signature instanceof Signature ? ", use sig.toBytes()" : ""; + throw new Error("verify expects Uint8Array signature" + end); + } + validateSigLength(signature, format); + try { + const sig = Signature.fromBytes(signature, format); + const P = Point.fromBytes(publicKey); + if (lowS && sig.hasHighS()) + return false; + const { r, s } = sig; + const h = bits2int_modN(message); + const is = Fn.inv(s); + const u1 = Fn.create(h * is); + const u2 = Fn.create(r * is); + const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); + if (R.is0()) + return false; + const v = Fn.create(R.x); + return v === r; + } catch (e) { + return false; + } + } + function recoverPublicKey(signature, message, opts = {}) { + const { prehash } = validateSigOpts(opts, defaultSigOpts); + message = validateMsgAndHash(message, prehash); + return Signature.fromBytes(signature, "recovered").recoverPublicKey(message).toBytes(); + } + return Object.freeze({ + keygen, + getPublicKey: getPublicKey2, + getSharedSecret, + utils: utils2, + lengths, + Point, + sign, + verify, + recoverPublicKey, + Signature, + hash + }); + } + + // node_modules/@noble/curves/secp256k1.js + var secp256k1_CURVE = { + p: BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"), + n: BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"), + h: BigInt(1), + a: BigInt(0), + b: BigInt(7), + Gx: BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"), + Gy: BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") + }; + var secp256k1_ENDO = { + beta: BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"), + basises: [ + [BigInt("0x3086d221a7d46bcde86c90e49284eb15"), -BigInt("0xe4437ed6010e88286f547fa90abfe4c3")], + [BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"), BigInt("0x3086d221a7d46bcde86c90e49284eb15")] + ] + }; + var _0n5 = /* @__PURE__ */ BigInt(0); + var _2n3 = /* @__PURE__ */ BigInt(2); + function sqrtMod(y) { + const P = secp256k1_CURVE.p; + const _3n3 = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22); + const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88); + const b2 = y * y * y % P; + const b3 = b2 * b2 * y % P; + const b6 = pow2(b3, _3n3, P) * b3 % P; + const b9 = pow2(b6, _3n3, P) * b3 % P; + const b11 = pow2(b9, _2n3, P) * b2 % P; + const b22 = pow2(b11, _11n, P) * b11 % P; + const b44 = pow2(b22, _22n, P) * b22 % P; + const b88 = pow2(b44, _44n, P) * b44 % P; + const b176 = pow2(b88, _88n, P) * b88 % P; + const b220 = pow2(b176, _44n, P) * b44 % P; + const b223 = pow2(b220, _3n3, P) * b3 % P; + const t1 = pow2(b223, _23n, P) * b22 % P; + const t2 = pow2(t1, _6n, P) * b2 % P; + const root = pow2(t2, _2n3, P); + if (!Fpk1.eql(Fpk1.sqr(root), y)) + throw new Error("Cannot find square root"); + return root; + } + var Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod }); + var Pointk1 = /* @__PURE__ */ weierstrass(secp256k1_CURVE, { + Fp: Fpk1, + endo: secp256k1_ENDO + }); + var secp256k1 = /* @__PURE__ */ ecdsa(Pointk1, sha256); + var TAGGED_HASH_PREFIXES = {}; + function taggedHash(tag, ...messages) { + let tagP = TAGGED_HASH_PREFIXES[tag]; + if (tagP === void 0) { + const tagH = sha256(asciiToBytes(tag)); + tagP = concatBytes(tagH, tagH); + TAGGED_HASH_PREFIXES[tag] = tagP; + } + return sha256(concatBytes(tagP, ...messages)); + } + var pointToBytes = (point) => point.toBytes(true).slice(1); + var hasEven = (y) => y % _2n3 === _0n5; + function schnorrGetExtPubKey(priv) { + const { Fn, BASE } = Pointk1; + const d_ = Fn.fromBytes(priv); + const p = BASE.multiply(d_); + const scalar = hasEven(p.y) ? d_ : Fn.neg(d_); + return { scalar, bytes: pointToBytes(p) }; + } + function lift_x(x) { + const Fp = Fpk1; + if (!Fp.isValidNot0(x)) + throw new Error("invalid x: Fail if x \u2265 p"); + const xx = Fp.create(x * x); + const c = Fp.create(xx * x + BigInt(7)); + let y = Fp.sqrt(c); + if (!hasEven(y)) + y = Fp.neg(y); + const p = Pointk1.fromAffine({ x, y }); + p.assertValidity(); + return p; + } + var num = bytesToNumberBE; + function challenge(...args) { + return Pointk1.Fn.create(num(taggedHash("BIP0340/challenge", ...args))); + } + function schnorrGetPublicKey(secretKey) { + return schnorrGetExtPubKey(secretKey).bytes; + } + function schnorrSign(message, secretKey, auxRand = randomBytes(32)) { + const { Fn } = Pointk1; + const m = abytes(message, void 0, "message"); + const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); + const a = abytes(auxRand, 32, "auxRand"); + const t = Fn.toBytes(d ^ num(taggedHash("BIP0340/aux", a))); + const rand = taggedHash("BIP0340/nonce", t, px, m); + const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand); + const e = challenge(rx, px, m); + const sig = new Uint8Array(64); + sig.set(rx, 0); + sig.set(Fn.toBytes(Fn.create(k + e * d)), 32); + if (!schnorrVerify(sig, m, px)) + throw new Error("sign: Invalid signature produced"); + return sig; + } + function schnorrVerify(signature, message, publicKey) { + const { Fp, Fn, BASE } = Pointk1; + const sig = abytes(signature, 64, "signature"); + const m = abytes(message, void 0, "message"); + const pub = abytes(publicKey, 32, "publicKey"); + try { + const P = lift_x(num(pub)); + const r = num(sig.subarray(0, 32)); + if (!Fp.isValidNot0(r)) + return false; + const s = num(sig.subarray(32, 64)); + if (!Fn.isValidNot0(s)) + return false; + const e = challenge(Fn.toBytes(r), pointToBytes(P), m); + const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e))); + const { x, y } = R.toAffine(); + if (R.is0() || !hasEven(y) || x !== r) + return false; + return true; + } catch (error) { + return false; + } + } + var schnorr = /* @__PURE__ */ (() => { + const size = 32; + const seedLength = 48; + const randomSecretKey = (seed = randomBytes(seedLength)) => { + return mapHashToField(seed, secp256k1_CURVE.n); + }; + return { + keygen: createKeygen(randomSecretKey, schnorrGetPublicKey), + getPublicKey: schnorrGetPublicKey, + sign: schnorrSign, + verify: schnorrVerify, + Point: Pointk1, + utils: { + randomSecretKey, + taggedHash, + lift_x, + pointToBytes + }, + lengths: { + secretKey: size, + publicKey: size, + publicKeyHasPrefix: false, + signature: size * 2, + seed: seedLength + } + }; + })(); + + // node_modules/nostr-crypto-utils/dist/esm/utils/logger.js + init_process(); + var import_pino = __toESM(require_browser()); + var LogLevel; + (function(LogLevel2) { + LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG"; + LogLevel2[LogLevel2["INFO"] = 1] = "INFO"; + LogLevel2[LogLevel2["WARN"] = 2] = "WARN"; + LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR"; + })(LogLevel || (LogLevel = {})); + var logger = (0, import_pino.default)({ + name: "nostr-crypto-utils", + level: process.env.LOG_LEVEL || "info", + transport: true ? { + target: "pino-pretty", + options: { + colorize: true, + translateTime: "HH:MM:ss", + ignore: "pid,hostname" + } + } : void 0, + formatters: { + level: (label) => { + return { level: label.toUpperCase() }; + }, + log: (obj) => { + if (obj && typeof obj === "object" && "err" in obj) { + const newObj = { ...obj }; + if (newObj.err instanceof Error) { + const err = newObj.err; + newObj.err = { + message: err.message, + stack: err.stack, + name: err.name + }; + } + return newObj; + } + return obj; + } + } + }); + + // node_modules/nostr-crypto-utils/dist/esm/encoding/base64.js + init_process(); + function isValidBase64(base642) { + try { + return Boolean(base642.match(/^[A-Za-z0-9+/]*={0,2}$/)); + } catch { + return false; + } + } + function bytesToBase64(bytes) { + let binary = ""; + for (let i = 0; i < bytes.length; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); + } + function base64ToBytes(base642) { + if (!isValidBase64(base642)) { + throw new Error("Invalid base64 string"); + } + const binary = atob(base642); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; + } + + // node_modules/nostr-crypto-utils/dist/esm/crypto.js + var getCrypto = async () => { + if (typeof window !== "undefined" && window.crypto) { + return window.crypto; + } + if (typeof globalThis !== "undefined" && globalThis.crypto) { + return globalThis.crypto; + } + try { + const cryptoModule = await Promise.resolve().then(() => __toESM(require_crypto())); + if (cryptoModule.webcrypto) { + return cryptoModule.webcrypto; + } + } catch { + logger.debug("Node crypto not available"); + } + throw new Error("No WebCrypto implementation available"); + }; + var CustomCrypto = class { + cryptoInstance = null; + initPromise; + constructor() { + this.initPromise = this.initialize(); + } + async initialize() { + this.cryptoInstance = await getCrypto(); + } + async ensureInitialized() { + await this.initPromise; + if (!this.cryptoInstance) { + throw new Error("Crypto implementation not initialized"); + } + return this.cryptoInstance; + } + async getSubtle() { + const crypto2 = await this.ensureInitialized(); + return crypto2.subtle; + } + async getRandomValues(array) { + const crypto2 = await this.ensureInitialized(); + return crypto2.getRandomValues(array); + } + }; + var customCrypto = new CustomCrypto(); + var signSchnorr = schnorr.sign; + var verifySchnorrSignature = schnorr.verify; + async function generateKeyPair() { + const privateKeyBytes = randomBytes(32); + const privateKey = bytesToHex(privateKeyBytes); + privateKeyBytes.fill(0); + const publicKey = await getPublicKey(privateKey); + return { + privateKey, + publicKey + }; + } + async function getPublicKey(privateKey) { + try { + const privateKeyBytes = hexToBytes(privateKey); + const publicKeyBytes = schnorr.getPublicKey(privateKeyBytes); + return { + hex: bytesToHex(publicKeyBytes), + bytes: publicKeyBytes + }; + } catch (error) { + logger.error({ error }, "Failed to get public key"); + throw error; + } + } + function normalizePrivateKey(privateKey) { + if (privateKey instanceof Uint8Array) { + return bytesToHex(privateKey); + } + return privateKey; + } + async function signEvent(event, privateKey) { + try { + const privateKeyHex = normalizePrivateKey(privateKey); + const serialized = JSON.stringify([ + 0, + event.pubkey, + event.created_at, + event.kind, + event.tags, + event.content + ]); + const eventHash = sha256(new TextEncoder().encode(serialized)); + const privateKeyBytes = hexToBytes(privateKeyHex); + const signatureBytes = schnorr.sign(eventHash, privateKeyBytes); + return { + ...event, + id: bytesToHex(eventHash), + sig: bytesToHex(signatureBytes) + }; + } catch (error) { + logger.error({ error }, "Failed to sign event"); + throw error; + } + } + function getPublicKeySync(privateKey) { + const privateKeyBytes = privateKey instanceof Uint8Array ? privateKey : hexToBytes(privateKey); + const publicKeyBytes = schnorr.getPublicKey(privateKeyBytes); + return bytesToHex(publicKeyBytes); + } + async function finalizeEvent(event, privateKey) { + const pubkey = event.pubkey || getPublicKeySync(privateKey); + const timestamp = event.created_at || Math.floor(Date.now() / 1e3); + const fullEvent = { + kind: event.kind || 1, + created_at: timestamp, + tags: event.tags || [], + content: event.content || "", + pubkey + }; + return signEvent(fullEvent, privateKey); + } + + // node_modules/nostr-crypto-utils/dist/esm/validation/index.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/event/index.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/event/creation.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/event/signing.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-04.js + var nip_04_exports = {}; + __export(nip_04_exports, { + computeSharedSecret: () => generateSharedSecret, + decryptMessage: () => decryptMessage, + encryptMessage: () => encryptMessage, + generateSharedSecret: () => generateSharedSecret + }); + init_process(); + var getCrypto2 = async () => { + if (typeof window !== "undefined" && window.crypto) { + return window.crypto; + } + if (typeof globalThis !== "undefined" && globalThis.crypto) { + return globalThis.crypto; + } + try { + const cryptoModule = await Promise.resolve().then(() => __toESM(require_crypto())); + if (cryptoModule.webcrypto) { + return cryptoModule.webcrypto; + } + } catch { + logger.debug("Node crypto not available"); + } + throw new Error("No WebCrypto implementation available"); + }; + var CryptoImplementation = class { + cryptoInstance = null; + initPromise; + constructor() { + this.initPromise = this.initialize(); + } + async initialize() { + this.cryptoInstance = await getCrypto2(); + } + async ensureInitialized() { + await this.initPromise; + if (!this.cryptoInstance) { + throw new Error("Crypto implementation not initialized"); + } + return this.cryptoInstance; + } + async getSubtle() { + const crypto2 = await this.ensureInitialized(); + return crypto2.subtle; + } + async getRandomValues(array) { + const crypto2 = await this.ensureInitialized(); + return crypto2.getRandomValues(array); + } + }; + var cryptoImpl = new CryptoImplementation(); + async function encryptMessage(message, senderPrivKey, recipientPubKey) { + try { + if (!message || !senderPrivKey || !recipientPubKey) { + throw new Error("Invalid input parameters"); + } + if (!/^[0-9a-f]{64}$/i.test(senderPrivKey)) { + throw new Error("Invalid private key format"); + } + const pubKeyHex = recipientPubKey.startsWith("02") || recipientPubKey.startsWith("03") ? recipientPubKey : "02" + recipientPubKey; + const sharedPoint = secp256k1.getSharedSecret(hexToBytes(senderPrivKey), hexToBytes(pubKeyHex)); + const sharedX = sharedPoint.slice(1, 33); + const sharedKey = await (await cryptoImpl.getSubtle()).importKey("raw", sharedX.buffer, { name: "AES-CBC", length: 256 }, false, ["encrypt"]); + sharedX.fill(0); + sharedPoint.fill(0); + const iv = new Uint8Array(16); + await cryptoImpl.getRandomValues(iv); + const encoded = new TextEncoder().encode(message); + const encrypted = await (await cryptoImpl.getSubtle()).encrypt({ name: "AES-CBC", iv }, sharedKey, encoded.buffer); + const ciphertextBase64 = bytesToBase64(new Uint8Array(encrypted)); + const ivBase64 = bytesToBase64(iv); + return ciphertextBase64 + "?iv=" + ivBase64; + } catch (error) { + logger.error({ error }, "Failed to encrypt message"); + throw error; + } + } + async function decryptMessage(encryptedMessage, recipientPrivKey, senderPubKey) { + try { + if (!encryptedMessage || !recipientPrivKey || !senderPubKey) { + throw new Error("Invalid input parameters"); + } + if (!/^[0-9a-f]{64}$/i.test(recipientPrivKey)) { + throw new Error("Invalid private key format"); + } + const pubKeyHex = senderPubKey.startsWith("02") || senderPubKey.startsWith("03") ? senderPubKey : "02" + senderPubKey; + const sharedPoint = secp256k1.getSharedSecret(hexToBytes(recipientPrivKey), hexToBytes(pubKeyHex)); + const sharedX = sharedPoint.slice(1, 33); + const sharedKey = await (await cryptoImpl.getSubtle()).importKey("raw", sharedX.buffer, { name: "AES-CBC", length: 256 }, false, ["decrypt"]); + sharedX.fill(0); + sharedPoint.fill(0); + let iv; + let ciphertext; + if (encryptedMessage.includes("?iv=")) { + const [ciphertextBase64, ivBase64] = encryptedMessage.split("?iv="); + ciphertext = base64ToBytes(ciphertextBase64); + iv = base64ToBytes(ivBase64); + } else { + const encrypted = hexToBytes(encryptedMessage); + iv = encrypted.slice(0, 16); + ciphertext = encrypted.slice(16); + } + const decrypted = await (await cryptoImpl.getSubtle()).decrypt({ name: "AES-CBC", iv }, sharedKey, ciphertext.buffer); + return new TextDecoder().decode(decrypted); + } catch (error) { + logger.error({ error }, "Failed to decrypt message"); + throw error; + } + } + function generateSharedSecret(privateKey, publicKey) { + try { + if (!privateKey || !publicKey) { + throw new Error("Invalid input parameters"); + } + if (!/^[0-9a-f]{64}$/i.test(privateKey)) { + throw new Error("Invalid private key format"); + } + const pubKeyHex = publicKey.startsWith("02") || publicKey.startsWith("03") ? publicKey : "02" + publicKey; + const sharedPoint = secp256k1.getSharedSecret(hexToBytes(privateKey), hexToBytes(pubKeyHex)); + return { sharedSecret: sharedPoint.slice(1, 33) }; + } catch (error) { + logger.error({ error }, "Failed to generate shared secret"); + throw error; + } + } + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-01.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-19.js + var nip_19_exports = {}; + __export(nip_19_exports, { + decode: () => decode, + naddrEncode: () => naddrEncode, + neventEncode: () => neventEncode, + noteEncode: () => noteEncode, + nprofileEncode: () => nprofileEncode, + npubEncode: () => npubEncode, + nrelayEncode: () => nrelayEncode, + nsecEncode: () => nsecEncode + }); + init_process(); + var import_bech32 = __toESM(require_dist()); + var import_buffer = __toESM(require_buffer()); + var VALID_PREFIXES = ["npub", "nsec", "note", "nprofile", "nevent", "naddr", "nrelay"]; + var TLV_TYPES = { + SPECIAL: 0, + // Main data (hex) + RELAY: 1, + // Relay URL (utf8) + AUTHOR: 2, + // Author pubkey (hex) + KIND: 3, + // Event kind (uint8) + IDENTIFIER: 4 + // Identifier (utf8) + }; + function npubEncode(pubkey) { + validateHexString(pubkey, 64); + const data = import_buffer.Buffer.from(pubkey, "hex"); + const words = import_bech32.bech32.toWords(data); + return import_bech32.bech32.encode("npub", words, 1e3); + } + function nsecEncode(privkey) { + validateHexString(privkey, 64); + const data = import_buffer.Buffer.from(privkey, "hex"); + const words = import_bech32.bech32.toWords(data); + return import_bech32.bech32.encode("nsec", words, 1e3); + } + function noteEncode(eventId) { + validateHexString(eventId, 64); + const data = import_buffer.Buffer.from(eventId, "hex"); + const words = import_bech32.bech32.toWords(data); + return import_bech32.bech32.encode("note", words, 1e3); + } + function nprofileEncode(pubkey, relays) { + validateHexString(pubkey, 64); + if (relays) { + relays.forEach(validateRelayUrl); + } + const data = encodeTLV({ + type: "nprofile", + data: pubkey, + relays + }); + return import_bech32.bech32.encode("nprofile", data, 1e3); + } + function neventEncode(eventId, relays, author, kind) { + validateHexString(eventId, 64); + if (relays) { + relays.forEach(validateRelayUrl); + } + if (author) { + validateHexString(author, 64); + } + if (kind !== void 0 && !Number.isInteger(kind)) { + throw new Error("Invalid event kind"); + } + const data = encodeTLV({ + type: "nevent", + data: eventId, + relays, + author, + kind + }); + return import_bech32.bech32.encode("nevent", data, 1e3); + } + function naddrEncode(pubkey, kind, identifier, relays) { + validateHexString(pubkey, 64); + if (!Number.isInteger(kind)) { + throw new Error("Invalid event kind"); + } + if (!identifier) { + throw new Error("Identifier is required"); + } + if (relays) { + relays.forEach(validateRelayUrl); + } + const data = encodeTLV({ + type: "naddr", + data: pubkey, + kind, + identifier, + relays + }); + return import_bech32.bech32.encode("naddr", data, 1e3); + } + function nrelayEncode(url) { + validateRelayUrl(url); + const data = import_buffer.Buffer.from(url, "utf8"); + const words = import_bech32.bech32.toWords(data); + return import_bech32.bech32.encode("nrelay", words, 1e3); + } + function decode(str) { + if (!str.includes("1")) { + throw new Error("Invalid bech32 string"); + } + const prefix = str.split("1")[0].toLowerCase(); + if (!VALID_PREFIXES.includes(prefix)) { + throw new Error("Unknown prefix"); + } + try { + const decoded = import_bech32.bech32.decode(str, 1e3); + const data = import_buffer.Buffer.from(import_bech32.bech32.fromWords(decoded.words)); + let url; + let decodedData; + switch (decoded.prefix) { + case "npub": + case "nsec": + case "note": + validateHexString(data.toString("hex"), 64); + return { + type: decoded.prefix, + data: data.toString("hex") + }; + case "nrelay": + url = data.toString("utf8"); + validateRelayUrl(url); + return { + type: "nrelay", + data: url + }; + case "nprofile": + case "nevent": + case "naddr": + decodedData = decodeTLV(decoded.prefix, data); + return decodedData; + default: + throw new Error("Unknown prefix"); + } + } catch (error) { + if (error instanceof Error) { + throw error; + } + throw new Error("Invalid bech32 string"); + } + } + function validateHexString(str, length) { + if (!/^[0-9a-fA-F]+$/.test(str)) { + throw new Error("Invalid hex string"); + } + if (length && str.length !== length) { + throw new Error(`Invalid hex string length (expected ${length})`); + } + } + function validateRelayUrl(url) { + try { + const parsed = new URL(url); + if (!["ws:", "wss:"].includes(parsed.protocol)) { + throw new Error("Invalid relay URL protocol"); + } + } catch { + throw new Error("Invalid relay URL"); + } + } + function encodeTLV(data) { + const result = []; + const bytes = import_buffer.Buffer.from(data.data, "hex"); + result.push(TLV_TYPES.SPECIAL, bytes.length); + result.push(...bytes); + if (data.relays?.length) { + for (const relay of data.relays) { + const relayBytes = import_buffer.Buffer.from(relay, "utf8"); + result.push(TLV_TYPES.RELAY, relayBytes.length); + result.push(...relayBytes); + } + } + if (data.author) { + const authorBytes = import_buffer.Buffer.from(data.author, "hex"); + result.push(TLV_TYPES.AUTHOR, authorBytes.length); + result.push(...authorBytes); + } + if (data.kind !== void 0) { + const kindBytes = import_buffer.Buffer.alloc(4); + kindBytes.writeUInt32BE(data.kind); + result.push(TLV_TYPES.KIND, kindBytes.length); + result.push(...kindBytes); + } + if (data.identifier) { + const identifierBytes = import_buffer.Buffer.from(data.identifier, "utf8"); + result.push(TLV_TYPES.IDENTIFIER, identifierBytes.length); + result.push(...identifierBytes); + } + return import_bech32.bech32.toWords(import_buffer.Buffer.from(result)); + } + function decodeTLV(prefix, data) { + const result = { + type: prefix, + data: "", + relays: [] + }; + let i = 0; + let relay; + while (i < data.length) { + const type = data[i]; + const length = data[i + 1]; + if (i + 2 + length > data.length) { + throw new Error("Invalid TLV data"); + } + const value = data.slice(i + 2, i + 2 + length); + switch (type) { + case TLV_TYPES.SPECIAL: + result.data = value.toString("hex"); + validateHexString(result.data, 64); + break; + case TLV_TYPES.RELAY: + relay = value.toString("utf8"); + validateRelayUrl(relay); + result.relays = result.relays || []; + result.relays.push(relay); + break; + case TLV_TYPES.AUTHOR: + result.author = value.toString("hex"); + validateHexString(result.author, 64); + break; + case TLV_TYPES.KIND: + result.kind = value.readUInt32BE(); + break; + case TLV_TYPES.IDENTIFIER: + result.identifier = value.toString("utf8"); + break; + default: + break; + } + i += 2 + length; + } + return result; + } + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-26.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-44.js + var nip_44_exports = {}; + __export(nip_44_exports, { + calcPaddedLen: () => calcPaddedLen, + decrypt: () => decrypt, + encrypt: () => encrypt, + getConversationKey: () => getConversationKey, + v2: () => v2 + }); + init_process(); + + // node_modules/@noble/ciphers/chacha.js + init_process(); + + // node_modules/@noble/ciphers/_arx.js + init_process(); + + // node_modules/@noble/ciphers/utils.js + init_process(); + function isBytes2(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; + } + function abool2(b) { + if (typeof b !== "boolean") + throw new Error(`boolean expected, not ${b}`); + } + function anumber2(n) { + if (!Number.isSafeInteger(n) || n < 0) + throw new Error("positive integer expected, got " + n); + } + function abytes2(value, length, title = "") { + const bytes = isBytes2(value); + const len = value?.length; + const needsLen = length !== void 0; + if (!bytes || needsLen && len !== length) { + const prefix = title && `"${title}" `; + const ofLen = needsLen ? ` of length ${length}` : ""; + const got = bytes ? `length=${len}` : `type=${typeof value}`; + throw new Error(prefix + "expected Uint8Array" + ofLen + ", got " + got); + } + return value; + } + function aexists2(instance, checkFinished = true) { + if (instance.destroyed) + throw new Error("Hash instance has been destroyed"); + if (checkFinished && instance.finished) + throw new Error("Hash#digest() has already been called"); + } + function aoutput2(out, instance) { + abytes2(out, void 0, "output"); + const min = instance.outputLen; + if (out.length < min) { + throw new Error("digestInto() expects output buffer of length at least " + min); + } + } + function u322(arr) { + return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4)); + } + function clean2(...arrays) { + for (let i = 0; i < arrays.length; i++) { + arrays[i].fill(0); + } + } + function createView2(arr) { + return new DataView(arr.buffer, arr.byteOffset, arr.byteLength); + } + var isLE2 = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)(); + function checkOpts2(defaults, opts) { + if (opts == null || typeof opts !== "object") + throw new Error("options must be defined"); + const merged = Object.assign(defaults, opts); + return merged; + } + function equalBytes(a, b) { + if (a.length !== b.length) + return false; + let diff = 0; + for (let i = 0; i < a.length; i++) + diff |= a[i] ^ b[i]; + return diff === 0; + } + var wrapCipher = /* @__NO_SIDE_EFFECTS__ */ (params, constructor) => { + function wrappedCipher(key, ...args) { + abytes2(key, void 0, "key"); + if (!isLE2) + throw new Error("Non little-endian hardware is not yet supported"); + if (params.nonceLength !== void 0) { + const nonce = args[0]; + abytes2(nonce, params.varSizeNonce ? void 0 : params.nonceLength, "nonce"); + } + const tagl = params.tagLength; + if (tagl && args[1] !== void 0) + abytes2(args[1], void 0, "AAD"); + const cipher = constructor(key, ...args); + const checkOutput = (fnLength, output) => { + if (output !== void 0) { + if (fnLength !== 2) + throw new Error("cipher output not supported"); + abytes2(output, void 0, "output"); + } + }; + let called = false; + const wrCipher = { + encrypt(data, output) { + if (called) + throw new Error("cannot encrypt() twice with same key + nonce"); + called = true; + abytes2(data); + checkOutput(cipher.encrypt.length, output); + return cipher.encrypt(data, output); + }, + decrypt(data, output) { + abytes2(data); + if (tagl && data.length < tagl) + throw new Error('"ciphertext" expected length bigger than tagLength=' + tagl); + checkOutput(cipher.decrypt.length, output); + return cipher.decrypt(data, output); + } + }; + return wrCipher; + } + Object.assign(wrappedCipher, params); + return wrappedCipher; + }; + function getOutput(expectedLength, out, onlyAligned = true) { + if (out === void 0) + return new Uint8Array(expectedLength); + if (out.length !== expectedLength) + throw new Error('"output" expected Uint8Array of length ' + expectedLength + ", got: " + out.length); + if (onlyAligned && !isAligned32(out)) + throw new Error("invalid output, must be aligned"); + return out; + } + function u64Lengths(dataLength, aadLength, isLE3) { + abool2(isLE3); + const num2 = new Uint8Array(16); + const view = createView2(num2); + view.setBigUint64(0, BigInt(aadLength), isLE3); + view.setBigUint64(8, BigInt(dataLength), isLE3); + return num2; + } + function isAligned32(bytes) { + return bytes.byteOffset % 4 === 0; + } + function copyBytes2(bytes) { + return Uint8Array.from(bytes); + } + + // node_modules/@noble/ciphers/_arx.js + var encodeStr = (str) => Uint8Array.from(str.split(""), (c) => c.charCodeAt(0)); + var sigma16 = encodeStr("expand 16-byte k"); + var sigma32 = encodeStr("expand 32-byte k"); + var sigma16_32 = u322(sigma16); + var sigma32_32 = u322(sigma32); + function rotl2(a, b) { + return a << b | a >>> 32 - b; + } + function isAligned322(b) { + return b.byteOffset % 4 === 0; + } + var BLOCK_LEN = 64; + var BLOCK_LEN32 = 16; + var MAX_COUNTER = 2 ** 32 - 1; + var U32_EMPTY = Uint32Array.of(); + function runCipher(core, sigma, key, nonce, data, output, counter, rounds) { + const len = data.length; + const block = new Uint8Array(BLOCK_LEN); + const b32 = u322(block); + const isAligned = isAligned322(data) && isAligned322(output); + const d32 = isAligned ? u322(data) : U32_EMPTY; + const o32 = isAligned ? u322(output) : U32_EMPTY; + for (let pos = 0; pos < len; counter++) { + core(sigma, key, nonce, b32, counter, rounds); + if (counter >= MAX_COUNTER) + throw new Error("arx: counter overflow"); + const take = Math.min(BLOCK_LEN, len - pos); + if (isAligned && take === BLOCK_LEN) { + const pos32 = pos / 4; + if (pos % 4 !== 0) + throw new Error("arx: invalid block position"); + for (let j = 0, posj; j < BLOCK_LEN32; j++) { + posj = pos32 + j; + o32[posj] = d32[posj] ^ b32[j]; + } + pos += BLOCK_LEN; + continue; + } + for (let j = 0, posj; j < take; j++) { + posj = pos + j; + output[posj] = data[posj] ^ block[j]; + } + pos += take; + } + } + function createCipher(core, opts) { + const { allowShortKeys, extendNonceFn, counterLength, counterRight, rounds } = checkOpts2({ allowShortKeys: false, counterLength: 8, counterRight: false, rounds: 20 }, opts); + if (typeof core !== "function") + throw new Error("core must be a function"); + anumber2(counterLength); + anumber2(rounds); + abool2(counterRight); + abool2(allowShortKeys); + return (key, nonce, data, output, counter = 0) => { + abytes2(key, void 0, "key"); + abytes2(nonce, void 0, "nonce"); + abytes2(data, void 0, "data"); + const len = data.length; + if (output === void 0) + output = new Uint8Array(len); + abytes2(output, void 0, "output"); + anumber2(counter); + if (counter < 0 || counter >= MAX_COUNTER) + throw new Error("arx: counter overflow"); + if (output.length < len) + throw new Error(`arx: output (${output.length}) is shorter than data (${len})`); + const toClean = []; + let l = key.length; + let k; + let sigma; + if (l === 32) { + toClean.push(k = copyBytes2(key)); + sigma = sigma32_32; + } else if (l === 16 && allowShortKeys) { + k = new Uint8Array(32); + k.set(key); + k.set(key, 16); + sigma = sigma16_32; + toClean.push(k); + } else { + abytes2(key, 32, "arx key"); + throw new Error("invalid key size"); + } + if (!isAligned322(nonce)) + toClean.push(nonce = copyBytes2(nonce)); + const k32 = u322(k); + if (extendNonceFn) { + if (nonce.length !== 24) + throw new Error(`arx: extended nonce must be 24 bytes`); + extendNonceFn(sigma, k32, u322(nonce.subarray(0, 16)), k32); + nonce = nonce.subarray(16); + } + const nonceNcLen = 16 - counterLength; + if (nonceNcLen !== nonce.length) + throw new Error(`arx: nonce must be ${nonceNcLen} or 16 bytes`); + if (nonceNcLen !== 12) { + const nc = new Uint8Array(12); + nc.set(nonce, counterRight ? 0 : 12 - nonce.length); + nonce = nc; + toClean.push(nonce); + } + const n32 = u322(nonce); + runCipher(core, sigma, k32, n32, data, output, counter, rounds); + clean2(...toClean); + return output; + }; + } + + // node_modules/@noble/ciphers/_poly1305.js + init_process(); + function u8to16(a, i) { + return a[i++] & 255 | (a[i++] & 255) << 8; + } + var Poly1305 = class { + blockLen = 16; + outputLen = 16; + buffer = new Uint8Array(16); + r = new Uint16Array(10); + // Allocating 1 array with .subarray() here is slower than 3 + h = new Uint16Array(10); + pad = new Uint16Array(8); + pos = 0; + finished = false; + // Can be speed-up using BigUint64Array, at the cost of complexity + constructor(key) { + key = copyBytes2(abytes2(key, 32, "key")); + const t0 = u8to16(key, 0); + const t1 = u8to16(key, 2); + const t2 = u8to16(key, 4); + const t3 = u8to16(key, 6); + const t4 = u8to16(key, 8); + const t5 = u8to16(key, 10); + const t6 = u8to16(key, 12); + const t7 = u8to16(key, 14); + this.r[0] = t0 & 8191; + this.r[1] = (t0 >>> 13 | t1 << 3) & 8191; + this.r[2] = (t1 >>> 10 | t2 << 6) & 7939; + this.r[3] = (t2 >>> 7 | t3 << 9) & 8191; + this.r[4] = (t3 >>> 4 | t4 << 12) & 255; + this.r[5] = t4 >>> 1 & 8190; + this.r[6] = (t4 >>> 14 | t5 << 2) & 8191; + this.r[7] = (t5 >>> 11 | t6 << 5) & 8065; + this.r[8] = (t6 >>> 8 | t7 << 8) & 8191; + this.r[9] = t7 >>> 5 & 127; + for (let i = 0; i < 8; i++) + this.pad[i] = u8to16(key, 16 + 2 * i); + } + process(data, offset, isLast = false) { + const hibit = isLast ? 0 : 1 << 11; + const { h, r } = this; + const r0 = r[0]; + const r1 = r[1]; + const r2 = r[2]; + const r3 = r[3]; + const r4 = r[4]; + const r5 = r[5]; + const r6 = r[6]; + const r7 = r[7]; + const r8 = r[8]; + const r9 = r[9]; + const t0 = u8to16(data, offset + 0); + const t1 = u8to16(data, offset + 2); + const t2 = u8to16(data, offset + 4); + const t3 = u8to16(data, offset + 6); + const t4 = u8to16(data, offset + 8); + const t5 = u8to16(data, offset + 10); + const t6 = u8to16(data, offset + 12); + const t7 = u8to16(data, offset + 14); + let h0 = h[0] + (t0 & 8191); + let h1 = h[1] + ((t0 >>> 13 | t1 << 3) & 8191); + let h2 = h[2] + ((t1 >>> 10 | t2 << 6) & 8191); + let h3 = h[3] + ((t2 >>> 7 | t3 << 9) & 8191); + let h4 = h[4] + ((t3 >>> 4 | t4 << 12) & 8191); + let h5 = h[5] + (t4 >>> 1 & 8191); + let h6 = h[6] + ((t4 >>> 14 | t5 << 2) & 8191); + let h7 = h[7] + ((t5 >>> 11 | t6 << 5) & 8191); + let h8 = h[8] + ((t6 >>> 8 | t7 << 8) & 8191); + let h9 = h[9] + (t7 >>> 5 | hibit); + let c = 0; + let d0 = c + h0 * r0 + h1 * (5 * r9) + h2 * (5 * r8) + h3 * (5 * r7) + h4 * (5 * r6); + c = d0 >>> 13; + d0 &= 8191; + d0 += h5 * (5 * r5) + h6 * (5 * r4) + h7 * (5 * r3) + h8 * (5 * r2) + h9 * (5 * r1); + c += d0 >>> 13; + d0 &= 8191; + let d1 = c + h0 * r1 + h1 * r0 + h2 * (5 * r9) + h3 * (5 * r8) + h4 * (5 * r7); + c = d1 >>> 13; + d1 &= 8191; + d1 += h5 * (5 * r6) + h6 * (5 * r5) + h7 * (5 * r4) + h8 * (5 * r3) + h9 * (5 * r2); + c += d1 >>> 13; + d1 &= 8191; + let d2 = c + h0 * r2 + h1 * r1 + h2 * r0 + h3 * (5 * r9) + h4 * (5 * r8); + c = d2 >>> 13; + d2 &= 8191; + d2 += h5 * (5 * r7) + h6 * (5 * r6) + h7 * (5 * r5) + h8 * (5 * r4) + h9 * (5 * r3); + c += d2 >>> 13; + d2 &= 8191; + let d3 = c + h0 * r3 + h1 * r2 + h2 * r1 + h3 * r0 + h4 * (5 * r9); + c = d3 >>> 13; + d3 &= 8191; + d3 += h5 * (5 * r8) + h6 * (5 * r7) + h7 * (5 * r6) + h8 * (5 * r5) + h9 * (5 * r4); + c += d3 >>> 13; + d3 &= 8191; + let d4 = c + h0 * r4 + h1 * r3 + h2 * r2 + h3 * r1 + h4 * r0; + c = d4 >>> 13; + d4 &= 8191; + d4 += h5 * (5 * r9) + h6 * (5 * r8) + h7 * (5 * r7) + h8 * (5 * r6) + h9 * (5 * r5); + c += d4 >>> 13; + d4 &= 8191; + let d5 = c + h0 * r5 + h1 * r4 + h2 * r3 + h3 * r2 + h4 * r1; + c = d5 >>> 13; + d5 &= 8191; + d5 += h5 * r0 + h6 * (5 * r9) + h7 * (5 * r8) + h8 * (5 * r7) + h9 * (5 * r6); + c += d5 >>> 13; + d5 &= 8191; + let d6 = c + h0 * r6 + h1 * r5 + h2 * r4 + h3 * r3 + h4 * r2; + c = d6 >>> 13; + d6 &= 8191; + d6 += h5 * r1 + h6 * r0 + h7 * (5 * r9) + h8 * (5 * r8) + h9 * (5 * r7); + c += d6 >>> 13; + d6 &= 8191; + let d7 = c + h0 * r7 + h1 * r6 + h2 * r5 + h3 * r4 + h4 * r3; + c = d7 >>> 13; + d7 &= 8191; + d7 += h5 * r2 + h6 * r1 + h7 * r0 + h8 * (5 * r9) + h9 * (5 * r8); + c += d7 >>> 13; + d7 &= 8191; + let d8 = c + h0 * r8 + h1 * r7 + h2 * r6 + h3 * r5 + h4 * r4; + c = d8 >>> 13; + d8 &= 8191; + d8 += h5 * r3 + h6 * r2 + h7 * r1 + h8 * r0 + h9 * (5 * r9); + c += d8 >>> 13; + d8 &= 8191; + let d9 = c + h0 * r9 + h1 * r8 + h2 * r7 + h3 * r6 + h4 * r5; + c = d9 >>> 13; + d9 &= 8191; + d9 += h5 * r4 + h6 * r3 + h7 * r2 + h8 * r1 + h9 * r0; + c += d9 >>> 13; + d9 &= 8191; + c = (c << 2) + c | 0; + c = c + d0 | 0; + d0 = c & 8191; + c = c >>> 13; + d1 += c; + h[0] = d0; + h[1] = d1; + h[2] = d2; + h[3] = d3; + h[4] = d4; + h[5] = d5; + h[6] = d6; + h[7] = d7; + h[8] = d8; + h[9] = d9; + } + finalize() { + const { h, pad: pad2 } = this; + const g = new Uint16Array(10); + let c = h[1] >>> 13; + h[1] &= 8191; + for (let i = 2; i < 10; i++) { + h[i] += c; + c = h[i] >>> 13; + h[i] &= 8191; + } + h[0] += c * 5; + c = h[0] >>> 13; + h[0] &= 8191; + h[1] += c; + c = h[1] >>> 13; + h[1] &= 8191; + h[2] += c; + g[0] = h[0] + 5; + c = g[0] >>> 13; + g[0] &= 8191; + for (let i = 1; i < 10; i++) { + g[i] = h[i] + c; + c = g[i] >>> 13; + g[i] &= 8191; + } + g[9] -= 1 << 13; + let mask = (c ^ 1) - 1; + for (let i = 0; i < 10; i++) + g[i] &= mask; + mask = ~mask; + for (let i = 0; i < 10; i++) + h[i] = h[i] & mask | g[i]; + h[0] = (h[0] | h[1] << 13) & 65535; + h[1] = (h[1] >>> 3 | h[2] << 10) & 65535; + h[2] = (h[2] >>> 6 | h[3] << 7) & 65535; + h[3] = (h[3] >>> 9 | h[4] << 4) & 65535; + h[4] = (h[4] >>> 12 | h[5] << 1 | h[6] << 14) & 65535; + h[5] = (h[6] >>> 2 | h[7] << 11) & 65535; + h[6] = (h[7] >>> 5 | h[8] << 8) & 65535; + h[7] = (h[8] >>> 8 | h[9] << 5) & 65535; + let f = h[0] + pad2[0]; + h[0] = f & 65535; + for (let i = 1; i < 8; i++) { + f = (h[i] + pad2[i] | 0) + (f >>> 16) | 0; + h[i] = f & 65535; + } + clean2(g); + } + update(data) { + aexists2(this); + abytes2(data); + data = copyBytes2(data); + const { buffer, blockLen } = this; + const len = data.length; + for (let pos = 0; pos < len; ) { + const take = Math.min(blockLen - this.pos, len - pos); + if (take === blockLen) { + for (; blockLen <= len - pos; pos += blockLen) + this.process(data, pos); + continue; + } + buffer.set(data.subarray(pos, pos + take), this.pos); + this.pos += take; + pos += take; + if (this.pos === blockLen) { + this.process(buffer, 0, false); + this.pos = 0; + } + } + return this; + } + destroy() { + clean2(this.h, this.r, this.buffer, this.pad); + } + digestInto(out) { + aexists2(this); + aoutput2(out, this); + this.finished = true; + const { buffer, h } = this; + let { pos } = this; + if (pos) { + buffer[pos++] = 1; + for (; pos < 16; pos++) + buffer[pos] = 0; + this.process(buffer, 0, true); + } + this.finalize(); + let opos = 0; + for (let i = 0; i < 8; i++) { + out[opos++] = h[i] >>> 0; + out[opos++] = h[i] >>> 8; + } + return out; + } + digest() { + const { buffer, outputLen } = this; + this.digestInto(buffer); + const res = buffer.slice(0, outputLen); + this.destroy(); + return res; + } + }; + function wrapConstructorWithKey(hashCons) { + const hashC = (msg, key) => hashCons(key).update(msg).digest(); + const tmp = hashCons(new Uint8Array(32)); + hashC.outputLen = tmp.outputLen; + hashC.blockLen = tmp.blockLen; + hashC.create = (key) => hashCons(key); + return hashC; + } + var poly1305 = /* @__PURE__ */ (() => wrapConstructorWithKey((key) => new Poly1305(key)))(); + + // node_modules/@noble/ciphers/chacha.js + function chachaCore(s, k, n, out, cnt, rounds = 20) { + let y00 = s[0], y01 = s[1], y02 = s[2], y03 = s[3], y04 = k[0], y05 = k[1], y06 = k[2], y07 = k[3], y08 = k[4], y09 = k[5], y10 = k[6], y11 = k[7], y12 = cnt, y13 = n[0], y14 = n[1], y15 = n[2]; + let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15; + for (let r = 0; r < rounds; r += 2) { + x00 = x00 + x04 | 0; + x12 = rotl2(x12 ^ x00, 16); + x08 = x08 + x12 | 0; + x04 = rotl2(x04 ^ x08, 12); + x00 = x00 + x04 | 0; + x12 = rotl2(x12 ^ x00, 8); + x08 = x08 + x12 | 0; + x04 = rotl2(x04 ^ x08, 7); + x01 = x01 + x05 | 0; + x13 = rotl2(x13 ^ x01, 16); + x09 = x09 + x13 | 0; + x05 = rotl2(x05 ^ x09, 12); + x01 = x01 + x05 | 0; + x13 = rotl2(x13 ^ x01, 8); + x09 = x09 + x13 | 0; + x05 = rotl2(x05 ^ x09, 7); + x02 = x02 + x06 | 0; + x14 = rotl2(x14 ^ x02, 16); + x10 = x10 + x14 | 0; + x06 = rotl2(x06 ^ x10, 12); + x02 = x02 + x06 | 0; + x14 = rotl2(x14 ^ x02, 8); + x10 = x10 + x14 | 0; + x06 = rotl2(x06 ^ x10, 7); + x03 = x03 + x07 | 0; + x15 = rotl2(x15 ^ x03, 16); + x11 = x11 + x15 | 0; + x07 = rotl2(x07 ^ x11, 12); + x03 = x03 + x07 | 0; + x15 = rotl2(x15 ^ x03, 8); + x11 = x11 + x15 | 0; + x07 = rotl2(x07 ^ x11, 7); + x00 = x00 + x05 | 0; + x15 = rotl2(x15 ^ x00, 16); + x10 = x10 + x15 | 0; + x05 = rotl2(x05 ^ x10, 12); + x00 = x00 + x05 | 0; + x15 = rotl2(x15 ^ x00, 8); + x10 = x10 + x15 | 0; + x05 = rotl2(x05 ^ x10, 7); + x01 = x01 + x06 | 0; + x12 = rotl2(x12 ^ x01, 16); + x11 = x11 + x12 | 0; + x06 = rotl2(x06 ^ x11, 12); + x01 = x01 + x06 | 0; + x12 = rotl2(x12 ^ x01, 8); + x11 = x11 + x12 | 0; + x06 = rotl2(x06 ^ x11, 7); + x02 = x02 + x07 | 0; + x13 = rotl2(x13 ^ x02, 16); + x08 = x08 + x13 | 0; + x07 = rotl2(x07 ^ x08, 12); + x02 = x02 + x07 | 0; + x13 = rotl2(x13 ^ x02, 8); + x08 = x08 + x13 | 0; + x07 = rotl2(x07 ^ x08, 7); + x03 = x03 + x04 | 0; + x14 = rotl2(x14 ^ x03, 16); + x09 = x09 + x14 | 0; + x04 = rotl2(x04 ^ x09, 12); + x03 = x03 + x04 | 0; + x14 = rotl2(x14 ^ x03, 8); + x09 = x09 + x14 | 0; + x04 = rotl2(x04 ^ x09, 7); + } + let oi = 0; + out[oi++] = y00 + x00 | 0; + out[oi++] = y01 + x01 | 0; + out[oi++] = y02 + x02 | 0; + out[oi++] = y03 + x03 | 0; + out[oi++] = y04 + x04 | 0; + out[oi++] = y05 + x05 | 0; + out[oi++] = y06 + x06 | 0; + out[oi++] = y07 + x07 | 0; + out[oi++] = y08 + x08 | 0; + out[oi++] = y09 + x09 | 0; + out[oi++] = y10 + x10 | 0; + out[oi++] = y11 + x11 | 0; + out[oi++] = y12 + x12 | 0; + out[oi++] = y13 + x13 | 0; + out[oi++] = y14 + x14 | 0; + out[oi++] = y15 + x15 | 0; + } + function hchacha(s, k, i, out) { + let x00 = s[0], x01 = s[1], x02 = s[2], x03 = s[3], x04 = k[0], x05 = k[1], x06 = k[2], x07 = k[3], x08 = k[4], x09 = k[5], x10 = k[6], x11 = k[7], x12 = i[0], x13 = i[1], x14 = i[2], x15 = i[3]; + for (let r = 0; r < 20; r += 2) { + x00 = x00 + x04 | 0; + x12 = rotl2(x12 ^ x00, 16); + x08 = x08 + x12 | 0; + x04 = rotl2(x04 ^ x08, 12); + x00 = x00 + x04 | 0; + x12 = rotl2(x12 ^ x00, 8); + x08 = x08 + x12 | 0; + x04 = rotl2(x04 ^ x08, 7); + x01 = x01 + x05 | 0; + x13 = rotl2(x13 ^ x01, 16); + x09 = x09 + x13 | 0; + x05 = rotl2(x05 ^ x09, 12); + x01 = x01 + x05 | 0; + x13 = rotl2(x13 ^ x01, 8); + x09 = x09 + x13 | 0; + x05 = rotl2(x05 ^ x09, 7); + x02 = x02 + x06 | 0; + x14 = rotl2(x14 ^ x02, 16); + x10 = x10 + x14 | 0; + x06 = rotl2(x06 ^ x10, 12); + x02 = x02 + x06 | 0; + x14 = rotl2(x14 ^ x02, 8); + x10 = x10 + x14 | 0; + x06 = rotl2(x06 ^ x10, 7); + x03 = x03 + x07 | 0; + x15 = rotl2(x15 ^ x03, 16); + x11 = x11 + x15 | 0; + x07 = rotl2(x07 ^ x11, 12); + x03 = x03 + x07 | 0; + x15 = rotl2(x15 ^ x03, 8); + x11 = x11 + x15 | 0; + x07 = rotl2(x07 ^ x11, 7); + x00 = x00 + x05 | 0; + x15 = rotl2(x15 ^ x00, 16); + x10 = x10 + x15 | 0; + x05 = rotl2(x05 ^ x10, 12); + x00 = x00 + x05 | 0; + x15 = rotl2(x15 ^ x00, 8); + x10 = x10 + x15 | 0; + x05 = rotl2(x05 ^ x10, 7); + x01 = x01 + x06 | 0; + x12 = rotl2(x12 ^ x01, 16); + x11 = x11 + x12 | 0; + x06 = rotl2(x06 ^ x11, 12); + x01 = x01 + x06 | 0; + x12 = rotl2(x12 ^ x01, 8); + x11 = x11 + x12 | 0; + x06 = rotl2(x06 ^ x11, 7); + x02 = x02 + x07 | 0; + x13 = rotl2(x13 ^ x02, 16); + x08 = x08 + x13 | 0; + x07 = rotl2(x07 ^ x08, 12); + x02 = x02 + x07 | 0; + x13 = rotl2(x13 ^ x02, 8); + x08 = x08 + x13 | 0; + x07 = rotl2(x07 ^ x08, 7); + x03 = x03 + x04 | 0; + x14 = rotl2(x14 ^ x03, 16); + x09 = x09 + x14 | 0; + x04 = rotl2(x04 ^ x09, 12); + x03 = x03 + x04 | 0; + x14 = rotl2(x14 ^ x03, 8); + x09 = x09 + x14 | 0; + x04 = rotl2(x04 ^ x09, 7); + } + let oi = 0; + out[oi++] = x00; + out[oi++] = x01; + out[oi++] = x02; + out[oi++] = x03; + out[oi++] = x12; + out[oi++] = x13; + out[oi++] = x14; + out[oi++] = x15; + } + var chacha20 = /* @__PURE__ */ createCipher(chachaCore, { + counterRight: false, + counterLength: 4, + allowShortKeys: false + }); + var xchacha20 = /* @__PURE__ */ createCipher(chachaCore, { + counterRight: false, + counterLength: 8, + extendNonceFn: hchacha, + allowShortKeys: false + }); + var ZEROS16 = /* @__PURE__ */ new Uint8Array(16); + var updatePadded = (h, msg) => { + h.update(msg); + const leftover = msg.length % 16; + if (leftover) + h.update(ZEROS16.subarray(leftover)); + }; + var ZEROS32 = /* @__PURE__ */ new Uint8Array(32); + function computeTag(fn, key, nonce, ciphertext, AAD) { + if (AAD !== void 0) + abytes2(AAD, void 0, "AAD"); + const authKey = fn(key, nonce, ZEROS32); + const lengths = u64Lengths(ciphertext.length, AAD ? AAD.length : 0, true); + const h = poly1305.create(authKey); + if (AAD) + updatePadded(h, AAD); + updatePadded(h, ciphertext); + h.update(lengths); + const res = h.digest(); + clean2(authKey, lengths); + return res; + } + var _poly1305_aead = (xorStream) => (key, nonce, AAD) => { + const tagLength = 16; + return { + encrypt(plaintext, output) { + const plength = plaintext.length; + output = getOutput(plength + tagLength, output, false); + output.set(plaintext); + const oPlain = output.subarray(0, -tagLength); + xorStream(key, nonce, oPlain, oPlain, 1); + const tag = computeTag(xorStream, key, nonce, oPlain, AAD); + output.set(tag, plength); + clean2(tag); + return output; + }, + decrypt(ciphertext, output) { + output = getOutput(ciphertext.length - tagLength, output, false); + const data = ciphertext.subarray(0, -tagLength); + const passedTag = ciphertext.subarray(-tagLength); + const tag = computeTag(xorStream, key, nonce, data, AAD); + if (!equalBytes(passedTag, tag)) + throw new Error("invalid tag"); + output.set(ciphertext.subarray(0, -tagLength)); + xorStream(key, nonce, output, output, 1); + clean2(tag); + return output; + } + }; + }; + var chacha20poly1305 = /* @__PURE__ */ wrapCipher({ blockSize: 64, nonceLength: 12, tagLength: 16 }, _poly1305_aead(chacha20)); + var xchacha20poly1305 = /* @__PURE__ */ wrapCipher({ blockSize: 64, nonceLength: 24, tagLength: 16 }, _poly1305_aead(xchacha20)); + + // node_modules/@noble/hashes/hkdf.js + init_process(); + function extract(hash, ikm, salt) { + ahash(hash); + if (salt === void 0) + salt = new Uint8Array(hash.outputLen); + return hmac(hash, salt, ikm); + } + var HKDF_COUNTER = /* @__PURE__ */ Uint8Array.of(0); + var EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of(); + function expand(hash, prk, info, length = 32) { + ahash(hash); + anumber(length, "length"); + const olen = hash.outputLen; + if (length > 255 * olen) + throw new Error("Length must be <= 255*HashLen"); + const blocks = Math.ceil(length / olen); + if (info === void 0) + info = EMPTY_BUFFER; + else + abytes(info, void 0, "info"); + const okm = new Uint8Array(blocks * olen); + const HMAC = hmac.create(hash, prk); + const HMACTmp = HMAC._cloneInto(); + const T = new Uint8Array(HMAC.outputLen); + for (let counter = 0; counter < blocks; counter++) { + HKDF_COUNTER[0] = counter + 1; + HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T).update(info).update(HKDF_COUNTER).digestInto(T); + okm.set(T, olen * counter); + HMAC._cloneInto(HMACTmp); + } + HMAC.destroy(); + HMACTmp.destroy(); + clean(T, HKDF_COUNTER); + return okm.slice(0, length); + } + + // node_modules/@scure/base/index.js + init_process(); + function isBytes3(a) { + return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array"; + } + function abytes3(b) { + if (!isBytes3(b)) + throw new Error("Uint8Array expected"); + } + function isArrayOf(isString, arr) { + if (!Array.isArray(arr)) + return false; + if (arr.length === 0) + return true; + if (isString) { + return arr.every((item) => typeof item === "string"); + } else { + return arr.every((item) => Number.isSafeInteger(item)); + } + } + function afn(input) { + if (typeof input !== "function") + throw new Error("function expected"); + return true; + } + function astr(label, input) { + if (typeof input !== "string") + throw new Error(`${label}: string expected`); + return true; + } + function anumber3(n) { + if (!Number.isSafeInteger(n)) + throw new Error(`invalid integer: ${n}`); + } + function aArr(input) { + if (!Array.isArray(input)) + throw new Error("array expected"); + } + function astrArr(label, input) { + if (!isArrayOf(true, input)) + throw new Error(`${label}: array of strings expected`); + } + function anumArr(label, input) { + if (!isArrayOf(false, input)) + throw new Error(`${label}: array of numbers expected`); + } + // @__NO_SIDE_EFFECTS__ + function chain(...args) { + const id = (a) => a; + const wrap2 = (a, b) => (c) => a(b(c)); + const encode = args.map((x) => x.encode).reduceRight(wrap2, id); + const decode2 = args.map((x) => x.decode).reduce(wrap2, id); + return { encode, decode: decode2 }; + } + // @__NO_SIDE_EFFECTS__ + function alphabet(letters) { + const lettersA = typeof letters === "string" ? letters.split("") : letters; + const len = lettersA.length; + astrArr("alphabet", lettersA); + const indexes = new Map(lettersA.map((l, i) => [l, i])); + return { + encode: (digits) => { + aArr(digits); + return digits.map((i) => { + if (!Number.isSafeInteger(i) || i < 0 || i >= len) + throw new Error(`alphabet.encode: digit index outside alphabet "${i}". Allowed: ${letters}`); + return lettersA[i]; + }); + }, + decode: (input) => { + aArr(input); + return input.map((letter) => { + astr("alphabet.decode", letter); + const i = indexes.get(letter); + if (i === void 0) + throw new Error(`Unknown letter: "${letter}". Allowed: ${letters}`); + return i; + }); + } + }; + } + // @__NO_SIDE_EFFECTS__ + function join(separator = "") { + astr("join", separator); + return { + encode: (from) => { + astrArr("join.decode", from); + return from.join(separator); + }, + decode: (to) => { + astr("join.decode", to); + return to.split(separator); + } + }; + } + // @__NO_SIDE_EFFECTS__ + function padding(bits, chr = "=") { + anumber3(bits); + astr("padding", chr); + return { + encode(data) { + astrArr("padding.encode", data); + while (data.length * bits % 8) + data.push(chr); + return data; + }, + decode(input) { + astrArr("padding.decode", input); + let end = input.length; + if (end * bits % 8) + throw new Error("padding: invalid, string should have whole number of bytes"); + for (; end > 0 && input[end - 1] === chr; end--) { + const last = end - 1; + const byte = last * bits; + if (byte % 8 === 0) + throw new Error("padding: invalid, string has too much padding"); + } + return input.slice(0, end); + } + }; + } + function convertRadix(data, from, to) { + if (from < 2) + throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`); + if (to < 2) + throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`); + aArr(data); + if (!data.length) + return []; + let pos = 0; + const res = []; + const digits = Array.from(data, (d) => { + anumber3(d); + if (d < 0 || d >= from) + throw new Error(`invalid integer: ${d}`); + return d; + }); + const dlen = digits.length; + while (true) { + let carry = 0; + let done = true; + for (let i = pos; i < dlen; i++) { + const digit = digits[i]; + const fromCarry = from * carry; + const digitBase = fromCarry + digit; + if (!Number.isSafeInteger(digitBase) || fromCarry / from !== carry || digitBase - digit !== fromCarry) { + throw new Error("convertRadix: carry overflow"); + } + const div = digitBase / to; + carry = digitBase % to; + const rounded = Math.floor(div); + digits[i] = rounded; + if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase) + throw new Error("convertRadix: carry overflow"); + if (!done) + continue; + else if (!rounded) + pos = i; + else + done = false; + } + res.push(carry); + if (done) + break; + } + for (let i = 0; i < data.length - 1 && data[i] === 0; i++) + res.push(0); + return res.reverse(); + } + var gcd = (a, b) => b === 0 ? a : gcd(b, a % b); + var radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to)); + var powers = /* @__PURE__ */ (() => { + let res = []; + for (let i = 0; i < 40; i++) + res.push(2 ** i); + return res; + })(); + function convertRadix2(data, from, to, padding2) { + aArr(data); + if (from <= 0 || from > 32) + throw new Error(`convertRadix2: wrong from=${from}`); + if (to <= 0 || to > 32) + throw new Error(`convertRadix2: wrong to=${to}`); + if (/* @__PURE__ */ radix2carry(from, to) > 32) { + throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${/* @__PURE__ */ radix2carry(from, to)}`); + } + let carry = 0; + let pos = 0; + const max = powers[from]; + const mask = powers[to] - 1; + const res = []; + for (const n of data) { + anumber3(n); + if (n >= max) + throw new Error(`convertRadix2: invalid data word=${n} from=${from}`); + carry = carry << from | n; + if (pos + from > 32) + throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`); + pos += from; + for (; pos >= to; pos -= to) + res.push((carry >> pos - to & mask) >>> 0); + const pow = powers[pos]; + if (pow === void 0) + throw new Error("invalid carry"); + carry &= pow - 1; + } + carry = carry << to - pos & mask; + if (!padding2 && pos >= from) + throw new Error("Excess padding"); + if (!padding2 && carry > 0) + throw new Error(`Non-zero padding: ${carry}`); + if (padding2 && pos > 0) + res.push(carry >>> 0); + return res; + } + // @__NO_SIDE_EFFECTS__ + function radix(num2) { + anumber3(num2); + const _256 = 2 ** 8; + return { + encode: (bytes) => { + if (!isBytes3(bytes)) + throw new Error("radix.encode input should be Uint8Array"); + return convertRadix(Array.from(bytes), _256, num2); + }, + decode: (digits) => { + anumArr("radix.decode", digits); + return Uint8Array.from(convertRadix(digits, num2, _256)); + } + }; + } + // @__NO_SIDE_EFFECTS__ + function radix2(bits, revPadding = false) { + anumber3(bits); + if (bits <= 0 || bits > 32) + throw new Error("radix2: bits should be in (0..32]"); + if (/* @__PURE__ */ radix2carry(8, bits) > 32 || /* @__PURE__ */ radix2carry(bits, 8) > 32) + throw new Error("radix2: carry overflow"); + return { + encode: (bytes) => { + if (!isBytes3(bytes)) + throw new Error("radix2.encode input should be Uint8Array"); + return convertRadix2(Array.from(bytes), 8, bits, !revPadding); + }, + decode: (digits) => { + anumArr("radix2.decode", digits); + return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding)); + } + }; + } + function unsafeWrapper(fn) { + afn(fn); + return function(...args) { + try { + return fn.apply(null, args); + } catch (e) { + } + }; + } + function checksum(len, fn) { + anumber3(len); + afn(fn); + return { + encode(data) { + if (!isBytes3(data)) + throw new Error("checksum.encode: input should be Uint8Array"); + const sum = fn(data).slice(0, len); + const res = new Uint8Array(data.length + len); + res.set(data); + res.set(sum, data.length); + return res; + }, + decode(data) { + if (!isBytes3(data)) + throw new Error("checksum.decode: input should be Uint8Array"); + const payload = data.slice(0, -len); + const oldChecksum = data.slice(-len); + const newChecksum = fn(payload).slice(0, len); + for (let i = 0; i < len; i++) + if (newChecksum[i] !== oldChecksum[i]) + throw new Error("Invalid checksum"); + return payload; + } + }; + } + var utils = { + alphabet, + chain, + checksum, + convertRadix, + convertRadix2, + radix, + radix2, + join, + padding + }; + var hasBase64Builtin = /* @__PURE__ */ (() => typeof Uint8Array.from([]).toBase64 === "function" && typeof Uint8Array.fromBase64 === "function")(); + var decodeBase64Builtin = (s, isUrl) => { + astr("base64", s); + const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/; + const alphabet2 = isUrl ? "base64url" : "base64"; + if (s.length > 0 && !re.test(s)) + throw new Error("invalid base64"); + return Uint8Array.fromBase64(s, { alphabet: alphabet2, lastChunkHandling: "strict" }); + }; + var base64 = hasBase64Builtin ? { + encode(b) { + abytes3(b); + return b.toBase64(); + }, + decode(s) { + return decodeBase64Builtin(s, false); + } + } : /* @__PURE__ */ chain(/* @__PURE__ */ radix2(6), /* @__PURE__ */ alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"), /* @__PURE__ */ padding(6), /* @__PURE__ */ join("")); + var BECH_ALPHABET = /* @__PURE__ */ chain(/* @__PURE__ */ alphabet("qpzry9x8gf2tvdw0s3jn54khce6mua7l"), /* @__PURE__ */ join("")); + var POLYMOD_GENERATORS = [996825010, 642813549, 513874426, 1027748829, 705979059]; + function bech32Polymod(pre) { + const b = pre >> 25; + let chk = (pre & 33554431) << 5; + for (let i = 0; i < POLYMOD_GENERATORS.length; i++) { + if ((b >> i & 1) === 1) + chk ^= POLYMOD_GENERATORS[i]; + } + return chk; + } + function bechChecksum(prefix, words, encodingConst = 1) { + const len = prefix.length; + let chk = 1; + for (let i = 0; i < len; i++) { + const c = prefix.charCodeAt(i); + if (c < 33 || c > 126) + throw new Error(`Invalid prefix (${prefix})`); + chk = bech32Polymod(chk) ^ c >> 5; + } + chk = bech32Polymod(chk); + for (let i = 0; i < len; i++) + chk = bech32Polymod(chk) ^ prefix.charCodeAt(i) & 31; + for (let v of words) + chk = bech32Polymod(chk) ^ v; + for (let i = 0; i < 6; i++) + chk = bech32Polymod(chk); + chk ^= encodingConst; + return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]], 30, 5, false)); + } + // @__NO_SIDE_EFFECTS__ + function genBech32(encoding) { + const ENCODING_CONST = encoding === "bech32" ? 1 : 734539939; + const _words = /* @__PURE__ */ radix2(5); + const fromWords = _words.decode; + const toWords = _words.encode; + const fromWordsUnsafe = unsafeWrapper(fromWords); + function encode(prefix, words, limit = 90) { + astr("bech32.encode prefix", prefix); + if (isBytes3(words)) + words = Array.from(words); + anumArr("bech32.encode", words); + const plen = prefix.length; + if (plen === 0) + throw new TypeError(`Invalid prefix length ${plen}`); + const actualLength = plen + 7 + words.length; + if (limit !== false && actualLength > limit) + throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`); + const lowered = prefix.toLowerCase(); + const sum = bechChecksum(lowered, words, ENCODING_CONST); + return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`; + } + function decode2(str, limit = 90) { + astr("bech32.decode input", str); + const slen = str.length; + if (slen < 8 || limit !== false && slen > limit) + throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`); + const lowered = str.toLowerCase(); + if (str !== lowered && str !== str.toUpperCase()) + throw new Error(`String must be lowercase or uppercase`); + const sepIndex = lowered.lastIndexOf("1"); + if (sepIndex === 0 || sepIndex === -1) + throw new Error(`Letter "1" must be present between prefix and data only`); + const prefix = lowered.slice(0, sepIndex); + const data = lowered.slice(sepIndex + 1); + if (data.length < 6) + throw new Error("Data must be at least 6 characters long"); + const words = BECH_ALPHABET.decode(data).slice(0, -6); + const sum = bechChecksum(prefix, words, ENCODING_CONST); + if (!data.endsWith(sum)) + throw new Error(`Invalid checksum in ${str}: expected "${sum}"`); + return { prefix, words }; + } + const decodeUnsafe = unsafeWrapper(decode2); + function decodeToBytes(str) { + const { prefix, words } = decode2(str, false); + return { prefix, words, bytes: fromWords(words) }; + } + function encodeFromBytes(prefix, bytes) { + return encode(prefix, toWords(bytes)); + } + return { + encode, + decode: decode2, + encodeFromBytes, + decodeToBytes, + decodeUnsafe, + fromWords, + fromWordsUnsafe, + toWords + }; + } + var bech322 = /* @__PURE__ */ genBech32("bech32"); + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-44.js + var utf8Encoder = new TextEncoder(); + var utf8Decoder = new TextDecoder(); + var minPlaintextSize = 1; + var maxPlaintextSize = 65535; + function calcPaddedLen(len) { + if (!Number.isSafeInteger(len) || len < 1) + throw new Error("expected positive integer"); + if (len <= 32) + return 32; + const nextPower = 1 << Math.floor(Math.log2(len - 1)) + 1; + const chunk = nextPower <= 256 ? 32 : nextPower / 8; + return chunk * (Math.floor((len - 1) / chunk) + 1); + } + function pad(plaintext) { + const unpadded = utf8Encoder.encode(plaintext); + const unpaddedLen = unpadded.length; + if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize) + throw new Error("invalid plaintext length: must be between 1 and 65535 bytes"); + const prefix = new Uint8Array(2); + new DataView(prefix.buffer).setUint16(0, unpaddedLen, false); + const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen); + return concatBytes(prefix, unpadded, suffix); + } + function unpad(padded) { + const unpaddedLen = new DataView(padded.buffer, padded.byteOffset).getUint16(0, false); + const unpadded = padded.subarray(2, 2 + unpaddedLen); + if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize || unpadded.length !== unpaddedLen || padded.length !== 2 + calcPaddedLen(unpaddedLen)) { + throw new Error("invalid padding"); + } + return utf8Decoder.decode(unpadded); + } + function getConversationKey(privkeyA, pubkeyB) { + const sharedPoint = secp256k1.getSharedSecret(privkeyA, hexToBytes("02" + pubkeyB)); + const sharedX = sharedPoint.subarray(1, 33); + return extract(sha256, sharedX, utf8Encoder.encode("nip44-v2")); + } + function getMessageKeys(conversationKey, nonce) { + const keys = expand(sha256, conversationKey, nonce, 76); + return { + chacha_key: keys.subarray(0, 32), + chacha_nonce: keys.subarray(32, 44), + hmac_key: keys.subarray(44, 76) + }; + } + function encrypt(plaintext, conversationKey, nonce = randomBytes(32)) { + const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce); + const padded = pad(plaintext); + const ciphertext = chacha20(chacha_key, chacha_nonce, padded); + const mac = hmac(sha256, hmac_key, concatBytes(nonce, ciphertext)); + return base64.encode(concatBytes(new Uint8Array([2]), nonce, ciphertext, mac)); + } + function decrypt(payload, conversationKey) { + const data = base64.decode(payload); + const version = data[0]; + if (version !== 2) + throw new Error(`unknown encryption version: ${version}`); + if (data.length < 99 || data.length > 65603) + throw new Error("invalid payload size"); + const nonce = data.subarray(1, 33); + const ciphertext = data.subarray(33, data.length - 32); + const mac = data.subarray(data.length - 32); + const { chacha_key, chacha_nonce, hmac_key } = getMessageKeys(conversationKey, nonce); + const expectedMac = hmac(sha256, hmac_key, concatBytes(nonce, ciphertext)); + if (!equalBytes(mac, expectedMac)) + throw new Error("invalid MAC"); + const padded = chacha20(chacha_key, chacha_nonce, ciphertext); + return unpad(padded); + } + var v2 = { + utils: { + getConversationKey, + calcPaddedLen + }, + encrypt, + decrypt + }; + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-46.js + init_process(); + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-49.js + init_process(); + + // node_modules/@noble/hashes/scrypt.js + init_process(); + + // node_modules/@noble/hashes/pbkdf2.js + init_process(); + function pbkdf2Init(hash, _password, _salt, _opts) { + ahash(hash); + const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts); + const { c, dkLen, asyncTick } = opts; + anumber(c, "c"); + anumber(dkLen, "dkLen"); + anumber(asyncTick, "asyncTick"); + if (c < 1) + throw new Error("iterations (c) must be >= 1"); + const password = kdfInputToBytes(_password, "password"); + const salt = kdfInputToBytes(_salt, "salt"); + const DK = new Uint8Array(dkLen); + const PRF = hmac.create(hash, password); + const PRFSalt = PRF._cloneInto().update(salt); + return { c, dkLen, asyncTick, DK, PRF, PRFSalt }; + } + function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) { + PRF.destroy(); + PRFSalt.destroy(); + if (prfW) + prfW.destroy(); + clean(u); + return DK; + } + function pbkdf2(hash, password, salt, opts) { + const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts); + let prfW; + const arr = new Uint8Array(4); + const view = createView(arr); + const u = new Uint8Array(PRF.outputLen); + for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) { + const Ti = DK.subarray(pos, pos + PRF.outputLen); + view.setInt32(0, ti, false); + (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u); + Ti.set(u.subarray(0, Ti.length)); + for (let ui = 1; ui < c; ui++) { + PRF._cloneInto(prfW).update(u).digestInto(u); + for (let i = 0; i < Ti.length; i++) + Ti[i] ^= u[i]; + } + } + return pbkdf2Output(PRF, PRFSalt, DK, prfW, u); + } + + // node_modules/@noble/hashes/scrypt.js + function XorAndSalsa(prev, pi, input, ii, out, oi) { + let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++]; + let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++]; + let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++]; + let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++]; + let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++]; + let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++]; + let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++]; + let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++]; + let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15; + for (let i = 0; i < 8; i += 2) { + x04 ^= rotl(x00 + x12 | 0, 7); + x08 ^= rotl(x04 + x00 | 0, 9); + x12 ^= rotl(x08 + x04 | 0, 13); + x00 ^= rotl(x12 + x08 | 0, 18); + x09 ^= rotl(x05 + x01 | 0, 7); + x13 ^= rotl(x09 + x05 | 0, 9); + x01 ^= rotl(x13 + x09 | 0, 13); + x05 ^= rotl(x01 + x13 | 0, 18); + x14 ^= rotl(x10 + x06 | 0, 7); + x02 ^= rotl(x14 + x10 | 0, 9); + x06 ^= rotl(x02 + x14 | 0, 13); + x10 ^= rotl(x06 + x02 | 0, 18); + x03 ^= rotl(x15 + x11 | 0, 7); + x07 ^= rotl(x03 + x15 | 0, 9); + x11 ^= rotl(x07 + x03 | 0, 13); + x15 ^= rotl(x11 + x07 | 0, 18); + x01 ^= rotl(x00 + x03 | 0, 7); + x02 ^= rotl(x01 + x00 | 0, 9); + x03 ^= rotl(x02 + x01 | 0, 13); + x00 ^= rotl(x03 + x02 | 0, 18); + x06 ^= rotl(x05 + x04 | 0, 7); + x07 ^= rotl(x06 + x05 | 0, 9); + x04 ^= rotl(x07 + x06 | 0, 13); + x05 ^= rotl(x04 + x07 | 0, 18); + x11 ^= rotl(x10 + x09 | 0, 7); + x08 ^= rotl(x11 + x10 | 0, 9); + x09 ^= rotl(x08 + x11 | 0, 13); + x10 ^= rotl(x09 + x08 | 0, 18); + x12 ^= rotl(x15 + x14 | 0, 7); + x13 ^= rotl(x12 + x15 | 0, 9); + x14 ^= rotl(x13 + x12 | 0, 13); + x15 ^= rotl(x14 + x13 | 0, 18); + } + out[oi++] = y00 + x00 | 0; + out[oi++] = y01 + x01 | 0; + out[oi++] = y02 + x02 | 0; + out[oi++] = y03 + x03 | 0; + out[oi++] = y04 + x04 | 0; + out[oi++] = y05 + x05 | 0; + out[oi++] = y06 + x06 | 0; + out[oi++] = y07 + x07 | 0; + out[oi++] = y08 + x08 | 0; + out[oi++] = y09 + x09 | 0; + out[oi++] = y10 + x10 | 0; + out[oi++] = y11 + x11 | 0; + out[oi++] = y12 + x12 | 0; + out[oi++] = y13 + x13 | 0; + out[oi++] = y14 + x14 | 0; + out[oi++] = y15 + x15 | 0; + } + function BlockMix(input, ii, out, oi, r) { + let head = oi + 0; + let tail = oi + 16 * r; + for (let i = 0; i < 16; i++) + out[tail + i] = input[ii + (2 * r - 1) * 16 + i]; + for (let i = 0; i < r; i++, head += 16, ii += 16) { + XorAndSalsa(out, tail, input, ii, out, head); + if (i > 0) + tail += 16; + XorAndSalsa(out, head, input, ii += 16, out, tail); + } + } + function scryptInit(password, salt, _opts) { + const opts = checkOpts({ + dkLen: 32, + asyncTick: 10, + maxmem: 1024 ** 3 + 1024 + }, _opts); + const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = opts; + anumber(N, "N"); + anumber(r, "r"); + anumber(p, "p"); + anumber(dkLen, "dkLen"); + anumber(asyncTick, "asyncTick"); + anumber(maxmem, "maxmem"); + if (onProgress !== void 0 && typeof onProgress !== "function") + throw new Error("progressCb must be a function"); + const blockSize = 128 * r; + const blockSize32 = blockSize / 4; + const pow32 = Math.pow(2, 32); + if (N <= 1 || (N & N - 1) !== 0 || N > pow32) + throw new Error('"N" expected a power of 2, and 2^1 <= N <= 2^32'); + if (p < 1 || p > (pow32 - 1) * 32 / blockSize) + throw new Error('"p" expected integer 1..((2^32 - 1) * 32) / (128 * r)'); + if (dkLen < 1 || dkLen > (pow32 - 1) * 32) + throw new Error('"dkLen" expected integer 1..(2^32 - 1) * 32'); + const memUsed = blockSize * (N + p); + if (memUsed > maxmem) + throw new Error('"maxmem" limit was hit, expected 128*r*(N+p) <= "maxmem"=' + maxmem); + const B = pbkdf2(sha256, password, salt, { c: 1, dkLen: blockSize * p }); + const B32 = u32(B); + const V = u32(new Uint8Array(blockSize * N)); + const tmp = u32(new Uint8Array(blockSize)); + let blockMixCb = () => { + }; + if (onProgress) { + const totalBlockMix = 2 * N * p; + const callbackPer = Math.max(Math.floor(totalBlockMix / 1e4), 1); + let blockMixCnt = 0; + blockMixCb = () => { + blockMixCnt++; + if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix)) + onProgress(blockMixCnt / totalBlockMix); + }; + } + return { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick }; + } + function scryptOutput(password, dkLen, B, V, tmp) { + const res = pbkdf2(sha256, password, B, { c: 1, dkLen }); + clean(B, V, tmp); + return res; + } + function scrypt(password, salt, opts) { + const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(password, salt, opts); + swap32IfBE(B32); + for (let pi = 0; pi < p; pi++) { + const Pi = blockSize32 * pi; + for (let i = 0; i < blockSize32; i++) + V[i] = B32[Pi + i]; + for (let i = 0, pos = 0; i < N - 1; i++) { + BlockMix(V, pos, V, pos += blockSize32, r); + blockMixCb(); + } + BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); + blockMixCb(); + for (let i = 0; i < N; i++) { + const j = (B32[Pi + blockSize32 - 16] & N - 1) >>> 0; + for (let k = 0; k < blockSize32; k++) + tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k]; + BlockMix(tmp, 0, B32, Pi, r); + blockMixCb(); + } + } + swap32IfBE(B32); + return scryptOutput(password, dkLen, B, V, tmp); + } + + // node_modules/nostr-crypto-utils/dist/esm/nips/nip-49.js + function encrypt2(sec, password, logn = 16, ksb = 2) { + const salt = randomBytes(16); + const n = 2 ** logn; + const normalizedPassword = password.normalize("NFKC"); + const key = scrypt(normalizedPassword, salt, { N: n, r: 8, p: 1, dkLen: 32 }); + const nonce = randomBytes(24); + const aad = Uint8Array.from([ksb]); + const cipher = xchacha20poly1305(key, nonce, aad); + const ciphertext = cipher.encrypt(sec); + const payload = concatBytes(Uint8Array.from([2]), Uint8Array.from([logn]), salt, nonce, aad, ciphertext); + const words = bech322.toWords(payload); + return bech322.encode("ncryptsec", words, 200); + } + function decrypt2(ncryptsec, password) { + const { prefix, words } = bech322.decode(ncryptsec, 200); + if (prefix !== "ncryptsec") + throw new Error("invalid ncryptsec prefix"); + const data = new Uint8Array(bech322.fromWords(words)); + const version = data[0]; + if (version !== 2) + throw new Error(`unknown ncryptsec version: ${version}`); + const logn = data[1]; + const salt = data.subarray(2, 18); + const nonce = data.subarray(18, 42); + const ksb = data[42]; + const ciphertext = data.subarray(43); + const n = 2 ** logn; + const normalizedPassword = password.normalize("NFKC"); + const key = scrypt(normalizedPassword, salt, { N: n, r: 8, p: 1, dkLen: 32 }); + const aad = Uint8Array.from([ksb]); + const cipher = xchacha20poly1305(key, nonce, aad); + return cipher.decrypt(ciphertext); + } + + // node_modules/nostr-crypto-utils/dist/esm/utils/encoding.js + init_process(); + function hexToBytes2(hex) { + const bytes = new Uint8Array(hex.length / 2); + for (let i = 0; i < hex.length; i += 2) { + bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16); + } + return bytes; + } + function bytesToHex3(bytes) { + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); + } + + // src/utilities/seedphrase.js + init_process(); + + // node_modules/@scure/bip39/index.js + init_process(); + var isJapanese = (wordlist2) => wordlist2[0] === "\u3042\u3044\u3053\u304F\u3057\u3093"; + function nfkd(str) { + if (typeof str !== "string") + throw new TypeError("invalid mnemonic type: " + typeof str); + return str.normalize("NFKD"); + } + function normalize(str) { + const norm = nfkd(str); + const words = norm.split(" "); + if (![12, 15, 18, 21, 24].includes(words.length)) + throw new Error("Invalid mnemonic"); + return { nfkd: norm, words }; + } + function aentropy(ent) { + abytes(ent); + if (![16, 20, 24, 28, 32].includes(ent.length)) + throw new Error("invalid entropy length"); + } + var calcChecksum = (entropy) => { + const bitsLeft = 8 - entropy.length / 4; + return new Uint8Array([sha256(entropy)[0] >> bitsLeft << bitsLeft]); + }; + function getCoder(wordlist2) { + if (!Array.isArray(wordlist2) || wordlist2.length !== 2048 || typeof wordlist2[0] !== "string") + throw new Error("Wordlist: expected array of 2048 strings"); + wordlist2.forEach((i) => { + if (typeof i !== "string") + throw new Error("wordlist: non-string element: " + i); + }); + return utils.chain(utils.checksum(1, calcChecksum), utils.radix2(11, true), utils.alphabet(wordlist2)); + } + function mnemonicToEntropy(mnemonic, wordlist2) { + const { words } = normalize(mnemonic); + const entropy = getCoder(wordlist2).decode(words); + aentropy(entropy); + return entropy; + } + function entropyToMnemonic(entropy, wordlist2) { + aentropy(entropy); + const words = getCoder(wordlist2).encode(entropy); + return words.join(isJapanese(wordlist2) ? "\u3000" : " "); + } + function validateMnemonic(mnemonic, wordlist2) { + try { + mnemonicToEntropy(mnemonic, wordlist2); + } catch (e) { + return false; + } + return true; + } + + // node_modules/@scure/bip39/wordlists/english.js + init_process(); + var wordlist = `abandon ability able about @@ -2046,8 +9213,3527 @@ youth zebra zero zone -zoo`.split(` -`);function ba(t){let e=at(t);return ma(e,rn)}function xa(t){let e=Vo(t.trim().toLowerCase(),rn),r=Ae(e),n=Pe(r);return{hexKey:r,pubKey:n}}function Fo(t){try{return wa(t.trim().toLowerCase(),rn)}catch{return!1}}b();async function nn(){let t=await oo();return{privateKey:t.privateKey,publicKey:t.publicKey.hex}}b();var ly=new Error("timeout while waiting for mutex to become available"),uy=new Error("mutex already locked"),Tu=new Error("request for lock canceled"),_u=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(s){s(i)})}return new(r||(r=Promise))(function(i,s){function a(f){try{l(n.next(f))}catch(u){s(u)}}function c(f){try{l(n.throw(f))}catch(u){s(u)}}function l(f){f.done?i(f.value):o(f.value).then(a,c)}l((n=n.apply(t,e||[])).next())})},$o=class{constructor(e,r=Tu){this._value=e,this._cancelError=r,this._queue=[],this._weightedWaiters=[]}acquire(e=1,r=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((n,o)=>{let i={resolve:n,reject:o,weight:e,priority:r},s=Ea(this._queue,a=>r<=a.priority);s===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(s+1,0,i)})}runExclusive(e){return _u(this,arguments,void 0,function*(r,n=1,o=0){let[i,s]=yield this.acquire(n,o);try{return yield r(i)}finally{s()}})}waitForUnlock(e=1,r=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,r)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),Lu(this._weightedWaiters[e-1],{resolve:n,priority:r})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let r=this._value;this._value-=e.weight,e.resolve([r,this._newReleaser(e.weight)])}_newReleaser(e){let r=!1;return()=>{r||(r=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let r=this._weightedWaiters[e-1];r&&(r.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let r=this._value;r>0;r--){let n=this._weightedWaiters[r-1];if(!n)continue;let o=n.findIndex(i=>i.priority<=e);(o===-1?n:n.splice(0,o)).forEach((i=>i.resolve()))}}}_couldLockImmediately(e,r){return(this._queue.length===0||this._queue[0].prioritye.priority<=n.priority);t.splice(r+1,0,e)}function Ea(t,e){for(let r=t.length-1;r>=0;r--)if(e(t[r]))return r;return-1}var Uu=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(s){s(i)})}return new(r||(r=Promise))(function(i,s){function a(f){try{l(n.next(f))}catch(u){s(u)}}function c(f){try{l(n.throw(f))}catch(u){s(u)}}function l(f){f.done?i(f.value):o(f.value).then(a,c)}l((n=n.apply(t,e||[])).next())})},pr=class{constructor(e){this._semaphore=new $o(1,e)}acquire(){return Uu(this,arguments,void 0,function*(e=0){let[,r]=yield this._semaphore.acquire(1,e);return r})}runExclusive(e,r=0){return this._semaphore.runExclusive(()=>e(),1,r)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}};b();b();var _=typeof browser<"u"?browser:typeof chrome<"u"?chrome:null;if(!_)throw new Error("browser-polyfill: No extension API namespace found (neither browser nor chrome).");var ae=typeof browser>"u"&&typeof chrome<"u";function ce(t,e){return(...r)=>{try{let n=e.apply(t,r);if(n&&typeof n.then=="function")return n}catch{}return new Promise((n,o)=>{e.apply(t,[...r,(...i)=>{_.runtime&&_.runtime.lastError?o(new Error(_.runtime.lastError.message)):n(i.length<=1?i[0]:i)}])})}}var N={};N.runtime={sendMessage(...t){return ae?ce(_.runtime,_.runtime.sendMessage)(...t):_.runtime.sendMessage(...t)},onMessage:_.runtime.onMessage,getURL(t){return _.runtime.getURL(t)},openOptionsPage(){return ae?ce(_.runtime,_.runtime.openOptionsPage)():_.runtime.openOptionsPage()},get id(){return _.runtime.id}};N.storage={local:{get(...t){return ae?ce(_.storage.local,_.storage.local.get)(...t):_.storage.local.get(...t)},set(...t){return ae?ce(_.storage.local,_.storage.local.set)(...t):_.storage.local.set(...t)},clear(...t){return ae?ce(_.storage.local,_.storage.local.clear)(...t):_.storage.local.clear(...t)},remove(...t){return ae?ce(_.storage.local,_.storage.local.remove)(...t):_.storage.local.remove(...t)}},sync:_.storage?.sync?{get(...t){return ae?ce(_.storage.sync,_.storage.sync.get)(...t):_.storage.sync.get(...t)},set(...t){return ae?ce(_.storage.sync,_.storage.sync.set)(...t):_.storage.sync.set(...t)},remove(...t){return ae?ce(_.storage.sync,_.storage.sync.remove)(...t):_.storage.sync.remove(...t)},clear(...t){return ae?ce(_.storage.sync,_.storage.sync.clear)(...t):_.storage.sync.clear(...t)},getBytesInUse(...t){return _.storage.sync.getBytesInUse?ae?ce(_.storage.sync,_.storage.sync.getBytesInUse)(...t):_.storage.sync.getBytesInUse(...t):Promise.resolve(0)}}:null,onChanged:_.storage?.onChanged||null};N.tabs={create(...t){return ae?ce(_.tabs,_.tabs.create)(...t):_.tabs.create(...t)},query(...t){return ae?ce(_.tabs,_.tabs.query)(...t):_.tabs.query(...t)},remove(...t){return ae?ce(_.tabs,_.tabs.remove)(...t):_.tabs.remove(...t)},update(...t){return ae?ce(_.tabs,_.tabs.update)(...t):_.tabs.update(...t)},get(...t){return ae?ce(_.tabs,_.tabs.get)(...t):_.tabs.get(...t)},getCurrent(...t){return ae?ce(_.tabs,_.tabs.getCurrent)(...t):_.tabs.getCurrent(...t)},sendMessage(...t){return ae?ce(_.tabs,_.tabs.sendMessage)(...t):_.tabs.sendMessage(...t)}};N.alarms=_.alarms?{create(...t){let e=_.alarms.create(...t);return e&&typeof e.then=="function"?e:Promise.resolve()},clear(...t){return ae?ce(_.alarms,_.alarms.clear)(...t):_.alarms.clear(...t)},onAlarm:_.alarms.onAlarm}:null;b();function gt(t){let e=new Uint8Array(t),r="";for(let n=0;ne.some(r=>t instanceof r),Ta,_a;function Ru(){return Ta||(Ta=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Cu(){return _a||(_a=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var Jo=new WeakMap,Go=new WeakMap,ln=new WeakMap;function Ou(t){let e=new Promise((r,n)=>{let o=()=>{t.removeEventListener("success",i),t.removeEventListener("error",s)},i=()=>{r(_t(t.result)),o()},s=()=>{n(t.error),o()};t.addEventListener("success",i),t.addEventListener("error",s)});return ln.set(e,t),e}function Nu(t){if(Jo.has(t))return;let e=new Promise((r,n)=>{let o=()=>{t.removeEventListener("complete",i),t.removeEventListener("error",s),t.removeEventListener("abort",s)},i=()=>{r(),o()},s=()=>{n(t.error||new DOMException("AbortError","AbortError")),o()};t.addEventListener("complete",i),t.addEventListener("error",s),t.addEventListener("abort",s)});Jo.set(t,e)}var Xo={get(t,e,r){if(t instanceof IDBTransaction){if(e==="done")return Jo.get(t);if(e==="store")return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return _t(t[e])},set(t,e,r){return t[e]=r,!0},has(t,e){return t instanceof IDBTransaction&&(e==="done"||e==="store")?!0:e in t}};function Ra(t){Xo=t(Xo)}function Du(t){return Cu().includes(t)?function(...e){return t.apply(Qo(this),e),_t(this.request)}:function(...e){return _t(t.apply(Qo(this),e))}}function Mu(t){return typeof t=="function"?Du(t):(t instanceof IDBTransaction&&Nu(t),Zo(t,Ru())?new Proxy(t,Xo):t)}function _t(t){if(t instanceof IDBRequest)return Ou(t);if(Go.has(t))return Go.get(t);let e=Mu(t);return e!==t&&(Go.set(t,e),ln.set(e,t)),e}var Qo=t=>ln.get(t);function Ca(t,e,{blocked:r,upgrade:n,blocking:o,terminated:i}={}){let s=indexedDB.open(t,e),a=_t(s);return n&&s.addEventListener("upgradeneeded",c=>{n(_t(s.result),c.oldVersion,c.newVersion,_t(s.transaction),c)}),r&&s.addEventListener("blocked",c=>r(c.oldVersion,c.newVersion,c)),a.then(c=>{i&&c.addEventListener("close",()=>i()),o&&c.addEventListener("versionchange",l=>o(l.oldVersion,l.newVersion,l))}).catch(()=>{}),a}var Hu=["get","getKey","getAll","getAllKeys","count"],Ku=["put","add","delete","clear"],Yo=new Map;function La(t,e){if(!(t instanceof IDBDatabase&&!(e in t)&&typeof e=="string"))return;if(Yo.get(e))return Yo.get(e);let r=e.replace(/FromIndex$/,""),n=e!==r,o=Ku.includes(r);if(!(r in(n?IDBIndex:IDBObjectStore).prototype)||!(o||Hu.includes(r)))return;let i=async function(s,...a){let c=this.transaction(s,o?"readwrite":"readonly"),l=c.store;return n&&(l=l.index(a.shift())),(await Promise.all([l[r](...a),o&&c.done]))[0]};return Yo.set(e,i),i}Ra(t=>({...t,get:(e,r,n)=>La(e,r)||t.get(e,r,n),has:(e,r)=>!!La(e,r)||t.has(e,r)}));var Vu=["continue","continuePrimaryKey","advance"],Ua={},ei=new WeakMap,Oa=new WeakMap,Fu={get(t,e){if(!Vu.includes(e))return t[e];let r=Ua[e];return r||(r=Ua[e]=function(...n){ei.set(this,Oa.get(this)[e](...n))}),r}};async function*$u(...t){let e=this;if(e instanceof IDBCursor||(e=await e.openCursor(...t)),!e)return;e=e;let r=new Proxy(e,Fu);for(Oa.set(r,e),ln.set(r,Qo(e));e;)yield r,e=await(ei.get(r)||e.continue()),ei.delete(r)}function Pa(t,e){return e===Symbol.asyncIterator&&Zo(t,[IDBIndex,IDBObjectStore,IDBCursor])||e==="iterate"&&Zo(t,[IDBIndex,IDBObjectStore])}Ra(t=>({...t,get(e,r,n){return Pa(e,r)?$u:t.get(e,r,n)},has(e,r){return Pa(e,r)||t.has(e,r)}}));async function qu(){return await Ca("events",1,{upgrade(t){let e=t.createObjectStore("events",{keyPath:"event.id"});e.createIndex("pubkey","event.pubkey"),e.createIndex("created_at","event.created_at"),e.createIndex("kind","event.kind"),e.createIndex("host","metadata.host")}})}async function Na(t){return(await qu()).put("events",t)}b();var ju=102400,Da=8192,zu=512,ti="_chunk:",fn="_sync_meta",dn="platformSyncEnabled";var mt={P1_PROFILES:1,P2_SETTINGS:2,P3_APIKEYS:3,P4_VAULT:4},hn=N.storage.local,un=null;function Wu(t,e){let r=[];for(let o=0;o{let{hosts:s,...a}=i;return a}),o=JSON.stringify(n);e.push({key:"profiles",jsonString:o,priority:mt.P1_PROFILES,size:o.length})}if(t.profileIndex!=null){let n=JSON.stringify(t.profileIndex);e.push({key:"profileIndex",jsonString:n,priority:mt.P1_PROFILES,size:n.length})}if(t.isEncrypted!=null){let n=JSON.stringify(t.isEncrypted);e.push({key:"isEncrypted",jsonString:n,priority:mt.P1_PROFILES,size:n.length})}let r=["autoLockMinutes","version","protocol_handler",dn];for(let n of r)if(t[n]!=null){let o=JSON.stringify(t[n]);e.push({key:n,jsonString:o,priority:mt.P2_SETTINGS,size:o.length})}for(let n of Object.keys(t))if(n.startsWith("feature:")){let o=JSON.stringify(t[n]);e.push({key:n,jsonString:o,priority:mt.P2_SETTINGS,size:o.length})}if(t.apiKeyVault){let n=JSON.stringify(t.apiKeyVault);e.push({key:"apiKeyVault",jsonString:n,priority:mt.P3_APIKEYS,size:n.length})}if(t.vaultDocs&&typeof t.vaultDocs=="object"){let n=Object.values(t.vaultDocs).sort((o,i)=>(i.updatedAt||0)-(o.updatedAt||0));for(let o of n){let i=`vaultDoc:${o.path}`,s=JSON.stringify(o);e.push({key:i,jsonString:s,priority:mt.P4_VAULT,size:s.length})}}return e}async function Zu(){if(!(!N.storage.sync||!await Ka()))try{let e=await Yu();e.sort((c,l)=>c.priority-l.priority);let r=0,n=0,o={},i=[],s=!1;for(let c of e){if(s)break;let l=Wu(c.key,c.jsonString),f=0;for(let u of l)f+=u.key.length+(typeof u.value=="string"?u.value.length:JSON.stringify(u.value).length);if((r+f>ju-500||n+l.length>zu-5)&&!(c.priority<=mt.P3_APIKEYS)){s=!0;break}for(let u of l)o[u.key]=u.value,i.push(u.key);r+=f,n+=l.length}let a={lastWrittenAt:Date.now(),keys:i};o[fn]=JSON.stringify(a),await N.storage.sync.set(o);try{let c=await N.storage.sync.get(null),l=Object.keys(c).filter(f=>f!==fn&&!i.includes(f));l.length>0&&await N.storage.sync.remove(l)}catch{}}catch{}}async function Ma(){if(!N.storage.sync)return null;try{let t=await N.storage.sync.get(null);if(!t||Object.keys(t).length===0)return null;let e=t[fn];if(!e)return null;let r;try{r=JSON.parse(e)}catch{return null}let n={},o=r.keys.filter(i=>!i.startsWith(ti)&&i!==fn);for(let i of o){let s=Gu(i,t);s!=null&&(n[i]=s)}return n._syncMeta=r,n}catch{return null}}async function Ha(t){if(!t)return;let e=await hn.get(null),r={},n=!1,o=!e.profiles||e.profiles.length===0||e.profiles.length===1&&!e.profiles[0].privKey;if(t.profiles){if(o)r.profiles=t.profiles,n=!0;else if(e.profiles){let f=[...e.profiles];for(let u=0;u=f.length)f.push(h),n=!0;else{let d=f[u],y=h.updatedAt||0,p=d.updatedAt||0;y>p&&(f[u]={...h,hosts:d.hosts||{}},n=!0)}}n&&(r.profiles=f)}}t.profileIndex!=null&&o&&(r.profileIndex=t.profileIndex,n=!0),t.isEncrypted===!0&&!e.isEncrypted&&(r.isEncrypted=!0,n=!0);let i=t._syncMeta||{},s=["autoLockMinutes","version","protocol_handler",dn];for(let f of s)if(t[f]!=null&&t[f]!==e[f]){if(f==="version"&&e.version&&t.version<=e.version)continue;r[f]=t[f],n=!0}for(let f of Object.keys(t))f.startsWith("feature:")&&t[f]!==e[f]&&(r[f]=t[f],n=!0);if(t.apiKeyVault)if(!e.apiKeyVault||o)r.apiKeyVault=t.apiKeyVault,n=!0;else{let f=e.apiKeyVault.keys||{},u=t.apiKeyVault.keys||{},h={...f};for(let[d,y]of Object.entries(u)){let p=h[d];(!p||(y.updatedAt||0)>(p.updatedAt||0))&&(h[d]=y,n=!0)}n&&(r.apiKeyVault={...e.apiKeyVault,keys:h})}let a=e.vaultDocs||{},c=!1,l={...a};for(let f of Object.keys(t)){if(!f.startsWith("vaultDoc:"))continue;let u=t[f];if(!u||!u.path)continue;let h=l[u.path];(!h||(u.updatedAt||0)>(h.updatedAt||0))&&(l[u.path]=u,c=!0)}c&&(r.vaultDocs=l,n=!0),n&&await hn.set(r)}function ri(){N.storage.sync&&(un&&clearTimeout(un),un=setTimeout(()=>{un=null,Zu()},2e3))}async function Ka(){return(await hn.get({[dn]:!0}))[dn]}async function Va(){if(!(!N.storage.sync||!await Ka())){try{let e=await Ma();e&&await Ha(e)}catch{}N.storage.onChanged&&N.storage.onChanged.addListener((e,r)=>{r==="sync"&&Ma().then(n=>{n&&Ha(n)}).catch(n=>{})}),ri()}}b();var gr=N.storage.local,_e=t=>{},Le=new Map;function Fa(t){if(!t.startsWith("bunker://"))throw new Error("Invalid bunker URL: must start with bunker://");let e=new URL(t),r=e.hostname||e.pathname.replace("//","");if(!/^[0-9a-f]{64}$/i.test(r))throw new Error("Invalid bunker URL: pubkey must be 64 hex characters");let n=e.searchParams.getAll("relay");if(n.length===0)throw new Error("Invalid bunker URL: at least one relay is required");for(let i of n)try{let s=new URL(i);if(s.protocol!=="wss:"&&s.protocol!=="ws:")throw new Error(`Invalid relay protocol: ${s.protocol}`)}catch{throw new Error(`Invalid relay URL: ${i}`)}let o=e.searchParams.get("secret")||null;return{remotePubkey:r,relays:n,secret:o}}var Lt=class{constructor(e){this.url=e,this.ws=null,this.subscriptions=new Map,this.eoseCallbacks=new Map,this.connected=!1,this.reconnectTimer=null,this.reconnectAttempts=0,this.maxReconnectAttempts=5}connect(){return new Promise((e,r)=>{try{this.ws=new WebSocket(this.url)}catch(o){r(new Error(`Failed to create WebSocket: ${o.message}`));return}let n=setTimeout(()=>{this.ws?.close(),r(new Error(`Connection timeout: ${this.url}`))},1e4);this.ws.onopen=()=>{clearTimeout(n),this.connected=!0,this.reconnectAttempts=0,_e(`Connected to ${this.url}`),e()},this.ws.onerror=o=>{clearTimeout(n),_e(`WebSocket error: ${this.url}`),r(new Error(`WebSocket error: ${this.url}`))},this.ws.onclose=()=>{this.connected=!1,_e(`Disconnected from ${this.url}`),this.scheduleReconnect()},this.ws.onmessage=o=>{try{let i=JSON.parse(o.data);this.handleMessage(i)}catch(i){_e(`Failed to parse message: ${i.message}`)}}})}handleMessage(e){let[r,n,...o]=e;if(r==="EVENT"&&n&&o[0]){let i=o[0],s=this.subscriptions.get(n);s&&s(i)}else if(r==="EOSE"&&n){let i=this.eoseCallbacks.get(n);i&&(this.eoseCallbacks.delete(n),i())}else r==="OK"||r==="NOTICE"&&_e(`Relay notice: ${o[0]}`)}subscribe(e,r,n,o=null){if(!this.connected||!this.ws)throw new Error("Not connected");this.subscriptions.set(e,n),o&&this.eoseCallbacks.set(e,o),this.ws.send(JSON.stringify(["REQ",e,...r]))}unsubscribe(e){this.ws&&this.connected&&this.ws.send(JSON.stringify(["CLOSE",e])),this.subscriptions.delete(e),this.eoseCallbacks.delete(e)}publish(e){if(!this.connected||!this.ws)throw new Error("Not connected");this.ws.send(JSON.stringify(["EVENT",e]))}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){_e(`Max reconnect attempts reached for ${this.url}`);return}let e=Math.min(1e3*Math.pow(2,this.reconnectAttempts),3e4);this.reconnectAttempts++,this.reconnectTimer=setTimeout(()=>{_e(`Reconnecting to ${this.url} (attempt ${this.reconnectAttempts})`),this.connect().catch(()=>{})},e)}close(){clearTimeout(this.reconnectTimer),this.maxReconnectAttempts=0,this.subscriptions.clear(),this.eoseCallbacks.clear(),this.ws&&(this.ws.close(),this.ws=null),this.connected=!1}},pn=class{constructor({remotePubkey:e,relays:r,secret:n}){this.remotePubkey=e,this.relayUrls=r,this.secret=n,this.sessionPrivkey=null,this.sessionPubkey=null,this.conversationKey=null,this.relays=[],this.pendingRequests=new Map,this.connected=!1,this.subId=`nostrkey-${crypto.randomUUID().slice(0,8)}`}async init(){if(this.sessionPrivkey)return;let e=await nn();this.sessionPrivkey=at(e.privateKey),this.sessionPubkey=e.publicKey,this.conversationKey=ke.utils.getConversationKey(this.sessionPrivkey,this.remotePubkey)}async connect(){await this.init();let e=this.relayUrls.map(o=>{let i=new Lt(o);return i.connect().then(()=>(this.relays.push(i),i))}),n=(await Promise.allSettled(e)).filter(o=>o.status==="fulfilled");if(n.length===0)throw new Error("Failed to connect to any relay");_e(`Connected to ${n.length}/${this.relayUrls.length} relays`);for(let o of this.relays)o.subscribe(this.subId,[{kinds:[24133],"#p":[this.sessionPubkey]}],i=>this.handleResponse(i));this.connected=!0,this.secret?await this.sendRequest("connect",[this.remotePubkey,this.secret]):await this.sendRequest("connect",[this.remotePubkey])}handleResponse(e){if(e.pubkey!==this.remotePubkey){_e(`Ignoring event from unknown pubkey: ${e.pubkey}`);return}try{let r=ke.decrypt(e.content,this.conversationKey),n=JSON.parse(r);_e(`Response: ${n.id} -> ${n.result?"ok":n.error}`);let o=this.pendingRequests.get(n.id);o&&(this.pendingRequests.delete(n.id),n.error?o.reject(new Error(n.error)):o.resolve(n.result))}catch(r){_e(`Failed to handle response: ${r.message}`)}}async sendRequest(e,r=[]){if(!this.connected&&e!=="connect")throw new Error("Not connected to bunker");let n=crypto.randomUUID(),o=JSON.stringify({id:n,method:e,params:r}),i=ke.encrypt(o,this.conversationKey),s=await Re({kind:24133,content:i,tags:[["p",this.remotePubkey]],created_at:Math.floor(Date.now()/1e3)},this.sessionPrivkey);for(let a of this.relays)try{a.publish(s)}catch(c){_e(`Failed to publish to ${a.url}: ${c.message}`)}return new Promise((a,c)=>{let l=setTimeout(()=>{this.pendingRequests.delete(n),c(new Error(`Request timeout: ${e}`))},3e4);this.pendingRequests.set(n,{resolve:f=>{clearTimeout(l),a(f)},reject:f=>{clearTimeout(l),c(f)}})})}async getPublicKey(){return await this.sendRequest("get_public_key")}async signEvent(e){let r=await this.sendRequest("sign_event",[JSON.stringify(e)]);return JSON.parse(r)}async nip04Encrypt(e,r){return await this.sendRequest("nip04_encrypt",[e,r])}async nip04Decrypt(e,r){return await this.sendRequest("nip04_decrypt",[e,r])}async nip44Encrypt(e,r){return await this.sendRequest("nip44_encrypt",[e,r])}async nip44Decrypt(e,r){return await this.sendRequest("nip44_decrypt",[e,r])}async ping(){return await this.sendRequest("ping")}getSessionInfo(){return{remotePubkey:this.remotePubkey,relayUrls:this.relayUrls,secret:this.secret,sessionPrivkey:Ae(this.sessionPrivkey),sessionPubkey:this.sessionPubkey}}disconnect(){for(let e of this.relays)e.unsubscribe(this.subId),e.close();this.relays=[],this.pendingRequests.clear(),this.connected=!1,_e("Disconnected from bunker")}};function Ju(t){let e=new pn({remotePubkey:t.remotePubkey,relays:t.relayUrls,secret:t.secret});return e.sessionPrivkey=at(t.sessionPrivkey),e.sessionPubkey=t.sessionPubkey,e.conversationKey=ke.utils.getConversationKey(e.sessionPrivkey,e.remotePubkey),e}async function De(t){if(Le.has(t)){let o=Le.get(t);if(o.connected)return o;o.disconnect(),Le.delete(t)}let r=(await gr.get({bunkerSessions:{}})).bunkerSessions?.[t];if(!r)throw new Error("No bunker session configured for this profile");let n=Ju(r);return await n.connect(),Le.set(t,n),n}async function $a(t,e){Le.has(t)&&(Le.get(t).disconnect(),Le.delete(t));let r=Fa(e),n=new pn(r);await n.connect();let i=(await gr.get({bunkerSessions:{}})).bunkerSessions||{};return i[t]=n.getSessionInfo(),await gr.set({bunkerSessions:i}),Le.set(t,n),n}async function qa(t){Le.has(t)&&(Le.get(t).disconnect(),Le.delete(t));let r=(await gr.get({bunkerSessions:{}})).bunkerSessions||{};delete r[t],await gr.set({bunkerSessions:r})}function ja(t){return Le.has(t)&&Le.get(t).connected}function za(t){try{return Fa(t),{valid:!0,error:null}}catch(e){return{valid:!1,error:e.message}}}b();var qe=t=>{},yn=class{constructor({relayUrls:e,userPubkey:r,secret:n}){this.relayUrls=e,this.userPubkey=r,this.secret=n,this.relays=[],this.authenticatedClients=new Set,this.subId=`bunker-srv-${crypto.randomUUID().slice(0,8)}`,this.active=!1,this._getPrivKey=null}async start({getPrivKey:e}){this._getPrivKey=e;let r=this.relayUrls.map(i=>{let s=new Lt(i);return s.connect().then(()=>(this.relays.push(s),s))}),o=(await Promise.allSettled(r)).filter(i=>i.status==="fulfilled");if(o.length===0)throw new Error("Failed to connect to any relay");qe(`Connected to ${o.length}/${this.relayUrls.length} relays`);for(let i of this.relays)i.subscribe(this.subId,[{kinds:[24133],"#p":[this.userPubkey],since:Math.floor(Date.now()/1e3)-5}],s=>this._handleRequest(s));this.active=!0,qe("Bunker server started")}stop(){for(let e of this.relays)e.unsubscribe(this.subId),e.close();this.relays=[],this.authenticatedClients.clear(),this.active=!1,this._getPrivKey=null,qe("Bunker server stopped")}getConnectionString(){let e=this.relayUrls.map(r=>`relay=${encodeURIComponent(r)}`).join("&");return`bunker://${this.userPubkey}?${e}&secret=${this.secret}`}async _handleRequest(e){let r=e.pubkey,n;try{n=await this._getPrivKey()}catch(u){qe(`Cannot get private key (locked?): ${u.message}`);return}let o;try{o=ke.utils.getConversationKey(n,r)}catch(u){qe(`Failed to derive conversation key: ${u.message}`);return}let i;try{let u=ke.decrypt(e.content,o);i=JSON.parse(u)}catch(u){qe(`Failed to decrypt request: ${u.message}`);return}let{id:s,method:a,params:c}=i;if(qe(`Request: ${a} (id=${s}) from ${r.slice(0,8)}...`),a!=="connect"&&!this.authenticatedClients.has(r)){await this._sendResponse(n,r,o,{id:s,result:null,error:"Unauthorized: send connect first"});return}let l=null,f=null;try{switch(a){case"connect":{let u=c[1];this.secret&&u!==this.secret?f="Invalid secret":(this.authenticatedClients.add(r),l="ack",qe(`Client authenticated: ${r.slice(0,8)}...`));break}case"get_public_key":l=this.userPubkey;break;case"sign_event":{let u=JSON.parse(c[0]),h=await Re(u,n);l=JSON.stringify(h);break}case"nip44_encrypt":{let u=c[0],h=c[1],d=ke.utils.getConversationKey(n,u);l=ke.encrypt(h,d);break}case"nip44_decrypt":{let u=c[0],h=c[1],d=ke.utils.getConversationKey(n,u);l=ke.decrypt(h,d);break}case"nip04_encrypt":{let u=c[0],h=c[1];l=await pt.encryptMessage(h,Ae(n),u);break}case"nip04_decrypt":{let u=c[0],h=c[1];l=await pt.decryptMessage(h,Ae(n),u);break}case"ping":l="pong";break;default:f=`Unsupported method: ${a}`}}catch(u){f=u.message,qe(`Error handling ${a}: ${u.message}`)}await this._sendResponse(n,r,o,{id:s,result:l,error:f})}async _sendResponse(e,r,n,o){let i=ke.encrypt(JSON.stringify(o),n),s=await Re({kind:24133,content:i,tags:[["p",r]],created_at:Math.floor(Date.now()/1e3)},e);for(let a of this.relays)try{a.publish(s)}catch(c){qe(`Failed to publish response to ${a.url}: ${c.message}`)}qe(`Response sent: ${o.id} ${o.error?"ERROR":"OK"}`)}};b();var gn="nostrkey:",Xu="nostrkey";function ni(t,e){return{kind:30078,content:e,tags:[["d",`${gn}${t}`],["client",Xu]],created_at:Math.floor(Date.now()/1e3)}}function oi(t,e){return{kind:5,content:"vault document deleted",tags:[["e",t],["a",`30078::${gn}${e}`]],created_at:Math.floor(Date.now()/1e3)}}function Wa(t){return{kinds:[30078],authors:[t]}}function Ga(t){if(t.kind!==30078)return null;let e=t.tags?.find(n=>n[0]==="d");if(!e||!e[1]?.startsWith(gn))return null;let r=e[1].slice(gn.length);return r?{path:r,content:t.content,createdAt:t.created_at,eventId:t.id}:null}var mn=N.storage.local,re={get:(...t)=>mn.get(...t),set:(...t)=>{let e=mn.set(...t);return e.then(()=>ri()).catch(()=>{}),e},clear:(...t)=>mn.clear(...t),remove:(...t)=>mn.remove(...t)},W=t=>{},xe={},He={mutex:new pr,release:null,tabId:null},Ct={total:0,processed:0},Je=null;function Q(t,e){e().then(r=>t(r)).catch(r=>{t(void 0)})}var ii=new Map,Qu=5,ef=1e4;function tf(t){let e=Date.now(),r=ii.get(t)||[];return r=r.filter(n=>e-n=Qu?(ii.set(t,r),!0):(r.push(e),ii.set(t,r),!1)}var be=new Map,lt=null,Pt=null,Ue=!0,Me=!1,Qt=900*1e3,Rt=null,wt=!1,wr=!0,mr=0,wn=0,Ya=new Map;(async()=>{W("[STARTUP] Reading persisted state...");let t=await re.get({autoLockMinutes:15,isEncrypted:!1,passwordHash:null,nostrAccessWhileLocked:!1,blockCrossOriginFrames:!0});W(`[STARTUP] isEncrypted=${t.isEncrypted}, passwordHash=${t.passwordHash?"EXISTS":"null"}, autoLockMinutes=${t.autoLockMinutes}`),Qt=t.autoLockMinutes*60*1e3,!t.isEncrypted&&t.passwordHash&&(W("[STARTUP] Self-healing: passwordHash exists but isEncrypted=false \u2192 fixing"),await re.set({isEncrypted:!0}),t.isEncrypted=!0),Me=t.isEncrypted,wt=!!t.nostrAccessWhileLocked,wr=t.blockCrossOriginFrames!==!1,Ue=Me,W(`[STARTUP] Final state: encryptionEnabled=${Me}, locked=${Ue}`);try{await Va(),W("[STARTUP] Platform sync initialized")}catch(e){W(`[STARTUP] Platform sync init error (non-fatal): ${e.message}`)}try{if(typeof browser<"u"&&browser.runtime.sendNativeMessage){let e=await browser.runtime.sendNativeMessage("com.nostrkey.Extension",{action:"getSharedProfiles"});if(e&&e.profiles&&e.profiles.length>0){let r=await re.get({profiles:[]}),n=rf(r.profiles,e.profiles);n.changed&&(await re.set({profiles:n.profiles}),W(`[STARTUP] Merged ${e.profiles.length} shared profile(s) from iOS app`))}}}catch(e){W(`[STARTUP] Shared profiles check skipped: ${e.message}`)}})();function rf(t,e){let r=!1,n=[...t];for(let o of e){if(!o.pubKey)continue;let i=n.findIndex(s=>s.pubKey===o.pubKey);if(i===-1)n.push({name:o.name||"Shared Profile",privKey:o.privKey||"",pubKey:o.pubKey,hosts:{},relays:o.relays||[],type:"local",updatedAt:o.lastSyncedAt?new Date(o.lastSyncedAt).getTime():Date.now()}),r=!0;else{let s=n[i],a=s.updatedAt||0,c=o.lastSyncedAt?new Date(o.lastSyncedAt).getTime():0;c>a&&o.privKey&&!s.privKey&&(n[i]={...s,privKey:o.privKey,name:o.name||s.name,relays:o.relays||s.relays,updatedAt:c},r=!0)}}return{profiles:n,changed:r}}var ai="nostrkey-auto-lock";function Ut(){if(Rt&&(clearTimeout(Rt),Rt=null),Ue||Qt<=0){N.alarms?.clear(ai).catch(()=>{});return}N.alarms?N.alarms.create(ai,{delayInMinutes:Qt/6e4}):Rt=setTimeout(()=>{li()},Qt)}N.alarms?.onAlarm&&N.alarms.onAlarm.addListener(t=>{t.name===ai&&li()});var Za=new pr;async function li(){let t=await Za.acquire();try{wt||be.clear(),lt=null,Pt=null,Ue=!0,Rt&&(clearTimeout(Rt),Rt=null),W(`Session locked. Keys retained: ${wt&&be.size>0}`)}finally{t()}}async function si(t){let e=await Za.acquire();try{let r=Date.now();if(r=3){let a=3e4*Math.pow(2,Math.floor((mr-3)/3));wn=Date.now()+a,W(`[SECURITY] ${mr} failed attempts. Cooldown: ${a/1e3}s`)}return{success:!1,error:"Invalid password"}}mr=0,wn=0;let o=await $e(),i=!1;for(let a=0;a{if(W(t),nf.has(t.kind)&&!of(e))return W(`[SECURITY] Blocked ${t.kind} from non-extension sender`),r({success:!1,error:"Unauthorized sender"}),!0;let n=crypto.randomUUID(),o;switch(t.kind){case"closePrompt":return He.release?.(),r(!0),!0;case"allowed":return Ut(),ci(t),r(!0),!0;case"denied":return En(t),r(!0),!0;case"generatePrivateKey":return(async()=>{try{let i=await af();r(i)}catch{r(null)}})(),!0;case"savePrivateKey":return Ut(),uf(t.payload);case"getNpub":return(async()=>{try{let i=await ff(t.payload);r(i)}catch{r(null)}})(),!0;case"getNsec":return Ut(),(async()=>{try{let i=await Xa(t.payload);r(i)}catch{r(null)}})(),!0;case"calcPubKey":return r(Pe(t.payload)),!0;case"npubEncode":return r(Te.npubEncode(t.payload)),!0;case"copy":return typeof navigator<"u"&&navigator.clipboard?.writeText?navigator.clipboard.writeText(t.payload).then(()=>r(!0)).catch(()=>r(!1)):r(!1),!0;case"isLocked":return(async()=>{try{let i=await Ja();W(`[isLocked] Sending response: ${i}`),r(i)}catch(i){W(`[isLocked] Error: ${i.message}`),r(!1)}})(),!0;case"isEncrypted":return(async()=>{try{let i=await re.get({isEncrypted:!1,passwordHash:null});W(`[isEncrypted] storage: isEncrypted=${i.isEncrypted}, passwordHash=${i.passwordHash?"EXISTS":"null"}`),!i.isEncrypted&&i.passwordHash&&(W("[isEncrypted] Self-healing: passwordHash exists but flag=false"),await re.set({isEncrypted:!0}),i.isEncrypted=!0),Me=i.isEncrypted,W(`[isEncrypted] Sending response: ${Me}`),r(Me)}catch(i){W(`[isEncrypted] Error: ${i.message}`),r(!1)}})(),!0;case"hasEncryptedData":return(async()=>{try{let i=await re.get({passwordHash:null,profiles:[]}),s=!!i.passwordHash,a=0;if(W(`[hasEncryptedData] passwordHash=${s}, profiles=${Array.isArray(i.profiles)?i.profiles.length:"not-array"}`),Array.isArray(i.profiles))for(let l=0;l0;W(`[hasEncryptedData] Result: found=${c}, hasPasswordHash=${s}, encryptedProfiles=${a}`),c&&!Me&&(W("[hasEncryptedData] Self-healing: setting isEncrypted=true, locked=true"),await re.set({isEncrypted:!0}),Me=!0,Ue=!0),r({found:c,hasPasswordHash:s,encryptedProfiles:a})}catch{r({found:!1,hasPasswordHash:!1,encryptedProfiles:0})}})(),!0;case"unlock":return Q(r,()=>si(t.payload)),!0;case"lock":return li().then(()=>r(!0)),!0;case"setPassword":return(async()=>{try{await lf(),await Ba(t.payload),Me=!0;let i=await si(t.payload);N.runtime.sendMessage({kind:"passwordStateChanged",hasPassword:!0}).catch(()=>{}),N.runtime.sendMessage({kind:"backupNeeded"}).catch(()=>{}),r(i)}catch(i){r({success:!1,error:i.message})}})(),!0;case"changePassword":return(async()=>{try{let{oldPassword:i,newPassword:s}=t.payload;if(!await cn(i)){r({success:!1,error:"Invalid current password"});return}await Sa(i,s);let c=await si(s);N.runtime.sendMessage({kind:"passwordStateChanged",hasPassword:!0}).catch(()=>{}),N.runtime.sendMessage({kind:"backupNeeded"}).catch(()=>{}),r(c)}catch(i){r({success:!1,error:i.message})}})(),!0;case"removePassword":return(async()=>{try{await Aa(t.payload),be.clear(),lt=null,Pt=null,Ue=!1,Me=!1,N.runtime.sendMessage({kind:"passwordStateChanged",hasPassword:!1}).catch(()=>{}),r({success:!0})}catch(i){r({success:!1,error:i.message})}})(),!0;case"resetAllData":return(async()=>{try{await re.clear(),be.clear(),lt=null,Pt=null,Ue=!1,Me=!1,wt=!1,wr=!0,await re.set({profiles:[{name:"Default Nostr Profile",privKey:"",pubKey:""}],profileIndex:0,isEncrypted:!1,passwordHash:null,passwordSalt:null}),N.runtime.sendMessage({kind:"dataReset"}).catch(()=>{}),r({success:!0})}catch(i){r({success:!1,error:i.message})}})(),!0;case"setAutoLockTimeout":{let i=[0,5,15,30,60,90,180],s=Number(t.payload);return i.includes(s)?(Qt=s*60*1e3,re.set({autoLockMinutes:s}),Ut(),r(!0),!0):(r(!1),!0)}case"getAutoLockTimeout":return Q(r,async()=>{let{autoLockMinutes:i}=await re.get({autoLockMinutes:15});return i}),!0;case"resetAutoLock":return Ut(),r(!0),!0;case"getNostrAccessWhileLocked":return r(wt),!0;case"setNostrAccessWhileLocked":return wt=!!t.payload,re.set({nostrAccessWhileLocked:!!t.payload}),!t.payload&&Ue&&be.clear(),r(!0),!0;case"getBlockCrossOriginFrames":return r(wr),!0;case"setBlockCrossOriginFrames":return wr=!!t.payload,re.set({blockCrossOriginFrames:!!t.payload}),r(!0),!0;case"getActiveProfileInfo":return(async()=>{try{let i=await ne(),a=(await $e())[i];if(!a){W("[getActiveProfileInfo] No profile found at index "+i),r({name:"Unknown",npub:"",hasKeys:!1});return}let c="";a.type==="bunker"&&a.remotePubkey?c=Te.npubEncode(a.remotePubkey):a.pubKey&&(c=Te.npubEncode(a.pubKey));let l={name:a.name||"Unnamed Profile",npub:c,hasKeys:be.has(i),isBunker:a.type==="bunker"};W("[getActiveProfileInfo] Sending: "+JSON.stringify(l)),r(l)}catch(i){W("[getActiveProfileInfo] Error: "+i.message),r({name:"Error",npub:"",hasKeys:!1})}})(),!0;case"ncryptsec.decrypt":return Q(r,async()=>{try{let{ncryptsec:i,password:s}=t.payload;return{success:!0,hexKey:Ae(pa(i,s))}}catch(i){return{success:!1,error:i.message||"Decryption failed"}}}),!0;case"ncryptsec.encrypt":return Q(r,async()=>{try{let{profileIndex:i,password:s}=t.payload,a=await se(i);if(a?.type==="bunker")return{success:!1,error:"Cannot export bunker profile as ncryptsec"};let c=await br(i,a);return{success:!0,ncryptsec:ha(at(c),s)}}catch(i){return{success:!1,error:i.message||"Encryption failed"}}}),!0;case"seedPhrase.fromKey":return Q(r,async()=>{try{let i=t.payload,s=await se(i);if(s?.type==="bunker")return{success:!1,error:"Cannot export bunker profile as seed phrase"};let a=await br(i,s);return{success:!0,seedPhrase:ba(a)}}catch(i){return{success:!1,error:i.message||"Failed to generate seed phrase"}}}),!0;case"seedPhrase.toKey":return Q(r,async()=>{try{let{hexKey:i,pubKey:s}=xa(t.payload);return{success:!0,hexKey:i,pubKey:s}}catch(i){return{success:!1,error:i.message||"Invalid seed phrase"}}}),!0;case"seedPhrase.validate":return r(Fo(t.payload)),!0;case"getProfileType":return Q(r,async()=>{let i=t.payload??await ne();return(await se(i))?.type||"local"}),!0;case"bunker.connect":return Q(r,async()=>{try{let{profileIndex:i,bunkerUrl:s}=t.payload,c=await(await $a(i,s)).getPublicKey(),l=await $e();return l[i].remotePubkey=c,l[i].bunkerUrl=s,await re.set({profiles:l}),{success:!0,remotePubkey:c}}catch(i){return{success:!1,error:i.message}}}),!0;case"bunker.disconnect":return Q(r,async()=>{try{let i=t.payload;return await qa(i),{success:!0}}catch(i){return{success:!1,error:i.message}}}),!0;case"bunker.status":return Q(r,async()=>{let i=t.payload??await ne();return{connected:ja(i)}}),!0;case"bunker.ping":return Q(r,async()=>{try{let i=t.payload??await ne();return{success:!0,result:await(await De(i)).ping()}}catch(i){return{success:!1,error:i.message}}}),!0;case"bunker.validateUrl":return r(za(t.payload)),!0;case"bunkerServer.start":return Q(r,async()=>{try{Je&&(Je.stop(),Je=null);let i=await ct(),s=t.payload?.relayUrls||["wss://relay.nostrkey.com"],a=crypto.randomUUID().replace(/-/g,"").slice(0,16),c=new yn({relayUrls:s,userPubkey:i,secret:a});return await c.start({getPrivKey:je}),Je=c,{success:!0,uri:c.getConnectionString()}}catch(i){return{success:!1,error:i.message}}}),!0;case"bunkerServer.stop":return Q(r,async()=>(Je&&(Je.stop(),Je=null),{success:!0})),!0;case"bunkerServer.status":return r({active:!!Je?.active,uri:Je?.getConnectionString()||null,clientCount:Je?.authenticatedClients.size||0}),!0;case"vault.publish":return Q(r,async()=>{try{let{path:i,content:s}=t.payload,a=await ct(),c=await bn({pubKey:a,plainText:s}),l=ni(i,c),f=await ne(),u=await se(f),h;if(u.type==="bunker")h=await(await De(f)).signEvent(l);else{let d=await je();h=await Re(l,d)}return await Xt("write",async d=>{for(let y of d)try{y.publish(h)}catch{}}),{success:!0,eventId:h.id,createdAt:h.created_at}}catch(i){return{success:!1,error:i.message}}}),!0;case"vault.fetch":return Q(r,async()=>{try{let i=await ct(),s=Wa(i),a=[];await Xt("read",async u=>{let h=u.map(d=>new Promise(y=>{let p=`vault-${crypto.randomUUID().slice(0,8)}`,w=setTimeout(()=>{try{d.unsubscribe(p)}catch{}y()},15e3);d.subscribe(p,[s],k=>{a.push(k)},()=>{clearTimeout(w);try{d.unsubscribe(p)}catch{}y()})}));await Promise.all(h)});let c=new Map;for(let u of a){let h=Ga(u);if(!h)continue;let d=c.get(h.path);(!d||h.createdAt>d.createdAt)&&c.set(h.path,{event:u,parsed:h})}let l=[],f=await ct();for(let{event:u,parsed:h}of c.values())try{let d=await xn({pubKey:f,cipherText:u.content});l.push({path:h.path,content:d,createdAt:h.createdAt,eventId:h.eventId})}catch{}return{success:!0,documents:l}}catch(i){return{success:!1,error:i.message}}}),!0;case"vault.delete":return Q(r,async()=>{try{let{path:i,eventId:s}=t.payload,a=oi(s,i),c=await ne(),l=await se(c),f;if(l.type==="bunker")f=await(await De(c)).signEvent(a);else{let u=await je();f=await Re(a,u)}return await Xt("write",async u=>{for(let h of u)try{h.publish(f)}catch{}}),{success:!0}}catch(i){return{success:!1,error:i.message}}}),!0;case"vault.getRelays":return Q(r,async()=>{try{let s=(await vn()).relays||[],a=s.filter(l=>l.read).map(l=>l.url),c=s.filter(l=>l.write).map(l=>l.url);return{read:a,write:c}}catch{return{read:[],write:[]}}}),!0;case"apikeys.publish":return Q(r,async()=>{try{let{keys:i}=t.payload,s=await ct(),a=JSON.stringify(i),c=await bn({pubKey:s,plainText:a}),l=ni("vault/api-keys",c),f=await ne(),u=await se(f),h;if(u.type==="bunker")h=await(await De(f)).signEvent(l);else{let d=await je();h=await Re(l,d)}return await Xt("write",async d=>{for(let y of d)try{y.publish(h)}catch{}}),{success:!0,eventId:h.id,createdAt:h.created_at}}catch(i){return{success:!1,error:i.message}}}),!0;case"apikeys.fetch":return Q(r,async()=>{try{let i=await ct(),s={kinds:[30078],authors:[i],"#d":["nostrkey:vault/api-keys"]},a=[];await Xt("read",async u=>{let h=u.map(d=>new Promise(y=>{let p=`apikeys-${crypto.randomUUID().slice(0,8)}`,w=setTimeout(()=>{try{d.unsubscribe(p)}catch{}y()},15e3);d.subscribe(p,[s],k=>{a.push(k)},()=>{clearTimeout(w);try{d.unsubscribe(p)}catch{}y()})}));await Promise.all(h)});let c=null;for(let u of a)(!c||u.created_at>c.created_at)&&(c=u);if(!c)return{success:!0,keys:null,eventId:null,createdAt:null};let l=await xn({pubKey:i,cipherText:c.content});return{success:!0,keys:JSON.parse(l),eventId:c.id,createdAt:c.created_at}}catch(i){return{success:!1,error:i.message}}}),!0;case"apikeys.delete":return Q(r,async()=>{try{let{eventId:i}=t.payload,s=oi(i,"vault/api-keys"),a=await ne(),c=await se(a),l;if(c.type==="bunker")l=await(await De(a)).signEvent(s);else{let f=await je();l=await Re(s,f)}return await Xt("write",async f=>{for(let u of f)try{u.publish(l)}catch{}}),{success:!0}}catch(i){return{success:!1,error:i.message}}}),!0;case"apikeys.encrypt":return Q(r,async()=>{try{let{plainText:i}=t.payload,s=await ct();return{success:!0,cipherText:await bn({pubKey:s,plainText:i})}}catch(i){return{success:!1,error:i.message}}}),!0;case"apikeys.decrypt":return Q(r,async()=>{try{let{cipherText:i}=t.payload,s=await ct();return{success:!0,plainText:await xn({pubKey:s,cipherText:i})}}catch(i){return{success:!1,error:i.message}}}),!0;case"backup.export":return Q(r,async()=>{if(!lt)return{success:!1,error:"Extension must be unlocked to create a backup"};let i=await re.get({profiles:[],profileIndex:0,isEncrypted:!1,passwordHash:null,passwordSalt:null,apiKeyVault:null,vaultDocs:null,nostrAccessWhileLocked:!1,blockCrossOriginFrames:!0,autoLockMinutes:15,version:null}),s=JSON.stringify(i),a=await qo(s,lt,Pt),c=N.runtime.getManifest?.()?.version||"unknown";return{success:!0,envelope:{format:"nostrkey-backup",version:1,createdAt:new Date().toISOString(),extensionVersion:c,profileCount:Array.isArray(i.profiles)?i.profiles.length:0,payload:JSON.parse(a)}}}),!0;case"backup.import":return Q(r,async()=>{try{let{envelope:i,password:s}=t.payload;if(!i||i.format!=="nostrkey-backup")return{success:!1,error:"Not a valid NostrKey backup file"};if(typeof i.version!="number"||i.version>1)return{success:!1,error:"Backup version not supported. Update NostrKey and try again."};let a=JSON.stringify(i.payload),c;try{c=await Tt(a,s)}catch{return{success:!1,error:"Wrong password \u2014 could not decrypt backup"}}let l=JSON.parse(c);await re.set(l),Me=!!l.isEncrypted,Ue=!1;let f=crypto.getRandomValues(new Uint8Array(16));if(lt=await yr(s,f),Pt=f,wt=l.nostrAccessWhileLocked!==!1,wr=l.blockCrossOriginFrames!==!1,typeof l.autoLockMinutes=="number"&&(Qt=l.autoLockMinutes*60*1e3),be.clear(),Array.isArray(l.profiles))for(let h=0;h{let{protocol_handler:i}=await re.get(["protocol_handler"]);if(!i)return!1;let{url:s}=t.payload,a=s.split("nostr:")[1];if(!a)return!1;try{let c=Te.decode(a),{type:l,data:f}=c,u={raw:a,hrp:l,hex:l==="naddr"?c.author||a:f||a,p_or_e:{npub:"p",note:"e",nprofile:"p",nevent:"e",naddr:"a"}[l]||"",u_or_n:{npub:"u",note:"n",nprofile:"u",nevent:"n",naddr:"n"}[l]||"",relay0:c.relays?.[0]||"",relay1:c.relays?.[1]||"",relay2:c.relays?.[2]||""},h=i;for(let[d,y]of Object.entries(u))h=h.replace(new RegExp(`\\{ *${d} *\\}`,"g"),y);return h}catch{return!1}}),!0;case"getPubKey":case"signEvent":case"nip04.encrypt":case"nip04.decrypt":case"nip44.encrypt":case"nip44.decrypt":case"getRelays":case"addRelay":case"exportProfile":return xe[n]=r,Object.keys(xe).length===1&&(Ct={total:0,processed:0}),Ct.total++,cf(n,t),setTimeout(()=>{xe[n]&&En({payload:n,origKind:t.kind,host:t.host}),He.release?.()},1e4),!0;default:return!1}});async function sf(){if(He.tabId!==null)try{await N.tabs.get(He.tabId)}catch{He.release?.(),He.tabId=null}}async function af(){return(await nn()).privateKey}async function cf(t,{kind:e,host:r,payload:n}){if(r){let p=Date.now(),w=Ya.get(r)||{count:0,resetAt:p+6e4};if(p>w.resetAt&&(w.count=0,w.resetAt=p+6e4),w.count++,Ya.set(r,w),w.count>5){W(`[SECURITY] Rate limited ${r} \u2014 ${w.count} requests in 60s`);let k=xe[t];delete xe[t],k?.({error:"rate_limited",message:"Too many requests. Please wait a moment."});return}}let o=await ne();if(!((await se(o))?.type==="bunker")&&(e!=="getPubKey"&&e!=="getRelays"&&e!=="addRelay"&&e!=="exportProfile")&&await Ja()&&!(wt&&be.has(o))){let w=be.size===0;try{let[O]=await N.tabs.query({active:!0,currentWindow:!0});O?.id&&N.tabs.sendMessage(O.id,{kind:"showLockedSheet",firstUnlock:w}).catch(()=>{})}catch{}let k=xe[t];delete xe[t],k?.({error:"locked",message:"Extension is locked. Please unlock with your master password."});return}if(tf(r)){let p=xe[t];delete xe[t],p?.({error:"rate_limited",message:"Too many requests. Please wait."}),W(`Rate limited: ${r}`);return}await sf(),He.release=await He.mutex.acquire(),Ct.processed++;let c=Ct.processed,l=Ct.total,f=e==="signEvent"?`signEvent:${n.kind}`:e,u=await ka(r,f);if(u==="allow"){ci({payload:t,origKind:e,event:n,remember:!1,host:r}),He.release();return}if(u==="deny"){En({payload:t,origKind:e,host:r}),He.release();return}try{let[p]=await N.tabs.query({active:!0,currentWindow:!0});if(p?.id){let w=await N.tabs.sendMessage(p.id,{kind:"showPermissionSheet",host:r,permissionKind:e,queuePosition:c,queueTotal:l});if(w){w.allowed?ci({payload:t,origKind:e,event:n,remember:w.remember,host:r}):En({payload:t,origKind:e,event:n,remember:w.remember,host:r}),He.release();return}}}catch(p){W("Bottom sheet unavailable, falling back to tab:",p.message)}let h=new URLSearchParams({uuid:t,kind:e,host:r,payload:JSON.stringify(n||!1),queuePosition:c,queueTotal:l}),d=await N.tabs.getCurrent(),y=await N.tabs.create({url:N.runtime.getURL(`permission/permission.html?${h.toString()}`),openerTabId:d?.id});return He.tabId=y.id,!0}function ci({payload:t,origKind:e,event:r,remember:n,host:o}){let i=xe[t];if(delete xe[t],Object.keys(xe).length===0&&(Ct={total:0,processed:0}),n){let s=e==="signEvent"?`signEvent:${r.kind}`:e;zo(o,s,"allow")}if(i){let s=a=>{W(`Error in ${e}: ${a.message}`),i({error:"bunker_error",message:a.message})};switch(e){case"getPubKey":ct().then(a=>i(a)).catch(s);break;case"signEvent":df(r,o).then(a=>i(a)).catch(s);break;case"nip04.encrypt":hf(r).then(a=>i(a)).catch(s);break;case"nip04.decrypt":pf(r).then(a=>i(a)).catch(s);break;case"nip44.encrypt":bn(r).then(a=>i(a)).catch(s);break;case"nip44.decrypt":xn(r).then(a=>i(a)).catch(s);break;case"getRelays":yf().then(a=>i(a)).catch(s);break;case"addRelay":gf(r.url).then(a=>i(a)).catch(s);break;case"exportProfile":mf().then(a=>i(a)).catch(s);break}}}function En({origKind:t,host:e,payload:r,remember:n,event:o}){let i=xe[r];if(delete xe[r],Object.keys(xe).length===0&&(Ct={total:0,processed:0}),n){let s=t==="signEvent"?`signEvent:${o.kind}`:t;zo(e,s,"deny")}return i?.(void 0),!1}async function lf(){let t=await $e(),e=!1;for(let r=0;r=o.length)throw new Error("Invalid profile index");let i=Pe(n);return o[t].pubKey=i,await Wo()&<?(o[t].privKey=await qo(n,lt,Pt),be.set(t,n)):o[t].privKey=n,await re.set({profiles:o}),!0}async function Xa(t){let e=await se(t);if(e.type==="bunker")return null;let r=await br(t,e);return Te.nsecEncode(r)}async function ff(t){let e=await se(t);if(!e)return null;if(e.type==="bunker")return e.remotePubkey?Te.npubEncode(e.remotePubkey):null;if(e.pubKey)return Te.npubEncode(e.pubKey);try{let r=await br(t,e);if(!r||typeof r!="string"||r.length!==64)return null;let n=Pe(r);return Te.npubEncode(n)}catch{return null}}async function br(t,e){if(Ze(e.privKey)){if(be.has(t))return be.get(t);throw new Error("Extension is locked \u2014 cannot access private key")}return e.privKey}async function je(){let t=await ne(),e=await vn(),r=await br(t,e);return at(r)}async function ct(){let t=await ne(),e=await se(t);if(e.type==="bunker"){if(e.remotePubkey)return e.remotePubkey;let i=await(await De(t)).getPublicKey(),s=await an("profiles");return s[t].remotePubkey=i,await re.set({profiles:s}),i}if(e.pubKey)return e.pubKey;let r=await je();return Pe(Ae(r))}async function vn(){let t=await ne();return(await an("profiles"))[t]}async function df(t,e){t=JSON.parse(JSON.stringify(t));let r=await ne();if((await se(r)).type==="bunker")t=await(await De(r)).signEvent(t);else{let o=await je();t=await Re(t,o)}return Na({event:t,metadata:{host:e,signed_at:Math.round(Date.now()/1e3)}}),t}async function hf({pubKey:t,plainText:e}){let r=await ne();if((await se(r)).type==="bunker")return(await De(r)).nip04Encrypt(t,e);let o=await je();return pt.encryptMessage(e,Ae(o),t)}async function pf({pubKey:t,cipherText:e}){let r=await ne();if((await se(r)).type==="bunker")return(await De(r)).nip04Decrypt(t,e);let o=await je();return pt.decryptMessage(e,Ae(o),t)}async function bn({pubKey:t,plainText:e}){let r=await ne();if((await se(r)).type==="bunker")return(await De(r)).nip44Encrypt(t,e);let o=await je(),i=st.v2.utils.getConversationKey(o,t);return st.v2.encrypt(e,i)}async function xn({pubKey:t,cipherText:e}){let r=await ne();if((await se(r)).type==="bunker")return(await De(r)).nip44Decrypt(t,e);let o=await je(),i=st.v2.utils.getConversationKey(o,t);return st.v2.decrypt(e,i)}async function yf(){let e=(await vn()).relays,r={};return e.forEach(n=>{let{url:o,read:i,write:s}=n;r[o]={read:i,write:s}}),r}async function gf(t){let e;try{e=new URL(t)}catch{throw new Error("Invalid URL")}if(e.protocol!=="wss:")throw new Error("Must be a wss:// URL");let r=await $e(),n=await ne(),o=r[n];return o.relays||(o.relays=[]),o.relays.some(i=>i.url===e.href)?{success:!0,message:"Relay already exists"}:(o.relays.push({url:e.href,read:!0,write:!0}),o.updatedAt=Math.floor(Date.now()/1e3),await re.set({profiles:r}),{success:!0,message:"Relay added"})}async function mf(){let t=await ne(),e=await se(t);if(!e)throw new Error("No active profile");if(e.type==="bunker")return{name:e.name,type:"bunker",bunkerUrl:e.bunkerUrl||"",exportedAt:new Date().toISOString(),source:"NostrKey"};let r="";e.pubKey&&(r=Te.npubEncode(e.pubKey));let n="";try{n=await Xa(t)}catch{throw new Error("Cannot export while locked. Please unlock first.")}return{name:e.name,npub:r,nsec:n,relays:(e.relays||[]).map(o=>o.url),exportedAt:new Date().toISOString(),source:"NostrKey"}}async function Xt(t,e){let o=((await vn()).relays||[]).filter(a=>t==="read"?a.read:a.write).map(a=>a.url);if(o.length===0)throw new Error("No relays configured");let i=[],s=o.map(async a=>{let c=new Lt(a);try{await c.connect(),i.push(c)}catch{}});if(await Promise.allSettled(s),i.length===0)throw new Error("Failed to connect to any relay");try{await e(i)}finally{for(let a of i)a.close()}}})(); +zoo`.split("\n"); + + // src/utilities/seedphrase.js + function keyToSeedPhrase(hexKey) { + const bytes = hexToBytes2(hexKey); + return entropyToMnemonic(bytes, wordlist); + } + function seedPhraseToKey(phrase) { + const entropy = mnemonicToEntropy(phrase.trim().toLowerCase(), wordlist); + const hexKey = bytesToHex3(entropy); + const pubKey = getPublicKeySync(hexKey); + return { hexKey, pubKey }; + } + function isValidSeedPhrase(phrase) { + try { + return validateMnemonic(phrase.trim().toLowerCase(), wordlist); + } catch { + return false; + } + } + + // src/utilities/keys.js + init_process(); + async function generateKeyPair2() { + const keyPair = await generateKeyPair(); + return { + privateKey: keyPair.privateKey, + publicKey: keyPair.publicKey.hex + }; + } + + // node_modules/async-mutex/index.mjs + init_process(); + var E_TIMEOUT = new Error("timeout while waiting for mutex to become available"); + var E_ALREADY_LOCKED = new Error("mutex already locked"); + var E_CANCELED = new Error("request for lock canceled"); + var __awaiter$2 = function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var Semaphore = class { + constructor(_value, _cancelError = E_CANCELED) { + this._value = _value; + this._cancelError = _cancelError; + this._queue = []; + this._weightedWaiters = []; + } + acquire(weight = 1, priority = 0) { + if (weight <= 0) + throw new Error(`invalid weight ${weight}: must be positive`); + return new Promise((resolve, reject) => { + const task = { resolve, reject, weight, priority }; + const i = findIndexFromEnd(this._queue, (other) => priority <= other.priority); + if (i === -1 && weight <= this._value) { + this._dispatchItem(task); + } else { + this._queue.splice(i + 1, 0, task); + } + }); + } + runExclusive(callback_1) { + return __awaiter$2(this, arguments, void 0, function* (callback, weight = 1, priority = 0) { + const [value, release] = yield this.acquire(weight, priority); + try { + return yield callback(value); + } finally { + release(); + } + }); + } + waitForUnlock(weight = 1, priority = 0) { + if (weight <= 0) + throw new Error(`invalid weight ${weight}: must be positive`); + if (this._couldLockImmediately(weight, priority)) { + return Promise.resolve(); + } else { + return new Promise((resolve) => { + if (!this._weightedWaiters[weight - 1]) + this._weightedWaiters[weight - 1] = []; + insertSorted(this._weightedWaiters[weight - 1], { resolve, priority }); + }); + } + } + isLocked() { + return this._value <= 0; + } + getValue() { + return this._value; + } + setValue(value) { + this._value = value; + this._dispatchQueue(); + } + release(weight = 1) { + if (weight <= 0) + throw new Error(`invalid weight ${weight}: must be positive`); + this._value += weight; + this._dispatchQueue(); + } + cancel() { + this._queue.forEach((entry) => entry.reject(this._cancelError)); + this._queue = []; + } + _dispatchQueue() { + this._drainUnlockWaiters(); + while (this._queue.length > 0 && this._queue[0].weight <= this._value) { + this._dispatchItem(this._queue.shift()); + this._drainUnlockWaiters(); + } + } + _dispatchItem(item) { + const previousValue = this._value; + this._value -= item.weight; + item.resolve([previousValue, this._newReleaser(item.weight)]); + } + _newReleaser(weight) { + let called = false; + return () => { + if (called) + return; + called = true; + this.release(weight); + }; + } + _drainUnlockWaiters() { + if (this._queue.length === 0) { + for (let weight = this._value; weight > 0; weight--) { + const waiters = this._weightedWaiters[weight - 1]; + if (!waiters) + continue; + waiters.forEach((waiter) => waiter.resolve()); + this._weightedWaiters[weight - 1] = []; + } + } else { + const queuedPriority = this._queue[0].priority; + for (let weight = this._value; weight > 0; weight--) { + const waiters = this._weightedWaiters[weight - 1]; + if (!waiters) + continue; + const i = waiters.findIndex((waiter) => waiter.priority <= queuedPriority); + (i === -1 ? waiters : waiters.splice(0, i)).forEach(((waiter) => waiter.resolve())); + } + } + } + _couldLockImmediately(weight, priority) { + return (this._queue.length === 0 || this._queue[0].priority < priority) && weight <= this._value; + } + }; + function insertSorted(a, v) { + const i = findIndexFromEnd(a, (other) => v.priority <= other.priority); + a.splice(i + 1, 0, v); + } + function findIndexFromEnd(a, predicate) { + for (let i = a.length - 1; i >= 0; i--) { + if (predicate(a[i])) { + return i; + } + } + return -1; + } + var __awaiter$1 = function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var Mutex = class { + constructor(cancelError) { + this._semaphore = new Semaphore(1, cancelError); + } + acquire() { + return __awaiter$1(this, arguments, void 0, function* (priority = 0) { + const [, releaser] = yield this._semaphore.acquire(1, priority); + return releaser; + }); + } + runExclusive(callback, priority = 0) { + return this._semaphore.runExclusive(() => callback(), 1, priority); + } + isLocked() { + return this._semaphore.isLocked(); + } + waitForUnlock(priority = 0) { + return this._semaphore.waitForUnlock(1, priority); + } + release() { + if (this._semaphore.isLocked()) + this._semaphore.release(); + } + cancel() { + return this._semaphore.cancel(); + } + }; + + // src/utilities/utils.js + init_process(); + + // src/utilities/browser-polyfill.js + init_process(); + var _browser = typeof browser !== "undefined" ? browser : typeof chrome !== "undefined" ? chrome : null; + if (!_browser) { + throw new Error("browser-polyfill: No extension API namespace found (neither browser nor chrome)."); + } + var isChrome = typeof browser === "undefined" && typeof chrome !== "undefined"; + function promisify(context, method) { + return (...args) => { + try { + const result = method.apply(context, args); + if (result && typeof result.then === "function") { + return result; + } + } catch (_) { + } + return new Promise((resolve, reject) => { + method.apply(context, [ + ...args, + (...cbArgs) => { + if (_browser.runtime && _browser.runtime.lastError) { + reject(new Error(_browser.runtime.lastError.message)); + } else { + resolve(cbArgs.length <= 1 ? cbArgs[0] : cbArgs); + } + } + ]); + }); + }; + } + var api = {}; + api.runtime = { + /** + * sendMessage – always returns a Promise. + */ + sendMessage(...args) { + if (!isChrome) { + return _browser.runtime.sendMessage(...args); + } + return promisify(_browser.runtime, _browser.runtime.sendMessage)(...args); + }, + /** + * onMessage – thin wrapper so callers use a consistent reference. + * The listener signature is (message, sender, sendResponse). + * On Chrome the listener can return `true` to keep the channel open, + * or return a Promise (MV3). Safari / Firefox expect a Promise return. + */ + onMessage: _browser.runtime.onMessage, + /** + * getURL – synchronous on all browsers. + */ + getURL(path) { + return _browser.runtime.getURL(path); + }, + /** + * openOptionsPage + */ + openOptionsPage() { + if (!isChrome) { + return _browser.runtime.openOptionsPage(); + } + return promisify(_browser.runtime, _browser.runtime.openOptionsPage)(); + }, + /** + * Expose the id for convenience. + */ + get id() { + return _browser.runtime.id; + } + }; + api.storage = { + local: { + get(...args) { + if (!isChrome) { + return _browser.storage.local.get(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.get)(...args); + }, + set(...args) { + if (!isChrome) { + return _browser.storage.local.set(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.set)(...args); + }, + clear(...args) { + if (!isChrome) { + return _browser.storage.local.clear(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.clear)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.storage.local.remove(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.remove)(...args); + } + }, + // --- storage.sync ---------------------------------------------------------- + // Null when the browser doesn't support sync (older Safari, etc.) + sync: _browser.storage?.sync ? { + get(...args) { + if (!isChrome) { + return _browser.storage.sync.get(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.get)(...args); + }, + set(...args) { + if (!isChrome) { + return _browser.storage.sync.set(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.set)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.storage.sync.remove(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.remove)(...args); + }, + clear(...args) { + if (!isChrome) { + return _browser.storage.sync.clear(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.clear)(...args); + }, + getBytesInUse(...args) { + if (!_browser.storage.sync.getBytesInUse) { + return Promise.resolve(0); + } + if (!isChrome) { + return _browser.storage.sync.getBytesInUse(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.getBytesInUse)(...args); + } + } : null, + // --- storage.onChanged ----------------------------------------------------- + onChanged: _browser.storage?.onChanged || null + }; + api.tabs = { + create(...args) { + if (!isChrome) { + return _browser.tabs.create(...args); + } + return promisify(_browser.tabs, _browser.tabs.create)(...args); + }, + query(...args) { + if (!isChrome) { + return _browser.tabs.query(...args); + } + return promisify(_browser.tabs, _browser.tabs.query)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.tabs.remove(...args); + } + return promisify(_browser.tabs, _browser.tabs.remove)(...args); + }, + update(...args) { + if (!isChrome) { + return _browser.tabs.update(...args); + } + return promisify(_browser.tabs, _browser.tabs.update)(...args); + }, + get(...args) { + if (!isChrome) { + return _browser.tabs.get(...args); + } + return promisify(_browser.tabs, _browser.tabs.get)(...args); + }, + getCurrent(...args) { + if (!isChrome) { + return _browser.tabs.getCurrent(...args); + } + return promisify(_browser.tabs, _browser.tabs.getCurrent)(...args); + }, + sendMessage(...args) { + if (!isChrome) { + return _browser.tabs.sendMessage(...args); + } + return promisify(_browser.tabs, _browser.tabs.sendMessage)(...args); + } + }; + api.alarms = _browser.alarms ? { + create(...args) { + const result = _browser.alarms.create(...args); + return result && typeof result.then === "function" ? result : Promise.resolve(); + }, + clear(...args) { + if (!isChrome) { + return _browser.alarms.clear(...args); + } + return promisify(_browser.alarms, _browser.alarms.clear)(...args); + }, + onAlarm: _browser.alarms.onAlarm + } : null; + + // src/utilities/crypto.js + init_process(); + var PBKDF2_ITERATIONS = 6e5; + var SALT_BYTES = 16; + var IV_BYTES = 12; + function arrayBufferToBase64(buffer) { + const bytes = new Uint8Array(buffer); + let binary = ""; + for (let i = 0; i < bytes.length; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); + } + function base64ToArrayBuffer(base642) { + const binary = atob(base642); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes.buffer; + } + async function deriveKey(password, salt) { + const enc = new TextEncoder(); + const keyMaterial = await crypto.subtle.importKey( + "raw", + enc.encode(password), + "PBKDF2", + false, + ["deriveKey"] + ); + return crypto.subtle.deriveKey( + { + name: "PBKDF2", + salt: salt instanceof Uint8Array ? salt : new Uint8Array(salt), + iterations: PBKDF2_ITERATIONS, + hash: "SHA-256" + }, + keyMaterial, + { name: "AES-GCM", length: 256 }, + false, + ["encrypt", "decrypt"] + ); + } + async function encryptWithKey(plaintext, key, salt) { + const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES)); + const enc = new TextEncoder(); + const ciphertext = await crypto.subtle.encrypt( + { name: "AES-GCM", iv }, + key, + enc.encode(plaintext) + ); + return JSON.stringify({ + salt: arrayBufferToBase64(salt), + iv: arrayBufferToBase64(iv), + ciphertext: arrayBufferToBase64(ciphertext) + }); + } + async function encrypt4(plaintext, password) { + const salt = crypto.getRandomValues(new Uint8Array(SALT_BYTES)); + const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES)); + const key = await deriveKey(password, salt); + const enc = new TextEncoder(); + const ciphertext = await crypto.subtle.encrypt( + { name: "AES-GCM", iv }, + key, + enc.encode(plaintext) + ); + return JSON.stringify({ + salt: arrayBufferToBase64(salt), + iv: arrayBufferToBase64(iv), + ciphertext: arrayBufferToBase64(ciphertext) + }); + } + async function decrypt4(encryptedData, password) { + const { salt, iv, ciphertext } = JSON.parse(encryptedData); + const saltBuf = new Uint8Array(base64ToArrayBuffer(salt)); + const ivBuf = new Uint8Array(base64ToArrayBuffer(iv)); + const ctBuf = base64ToArrayBuffer(ciphertext); + const key = await deriveKey(password, saltBuf); + const plainBuf = await crypto.subtle.decrypt( + { name: "AES-GCM", iv: ivBuf }, + key, + ctBuf + ); + const dec = new TextDecoder(); + return dec.decode(plainBuf); + } + async function hashPassword(password, salt) { + if (!salt) { + salt = crypto.getRandomValues(new Uint8Array(SALT_BYTES)); + } else if (typeof salt === "string") { + salt = new Uint8Array(base64ToArrayBuffer(salt)); + } + const enc = new TextEncoder(); + const keyMaterial = await crypto.subtle.importKey( + "raw", + enc.encode(password), + "PBKDF2", + false, + ["deriveBits"] + ); + const hashBits = await crypto.subtle.deriveBits( + { + name: "PBKDF2", + salt, + iterations: PBKDF2_ITERATIONS, + hash: "SHA-256" + }, + keyMaterial, + 256 + ); + return { + hash: arrayBufferToBase64(hashBits), + salt: arrayBufferToBase64(salt) + }; + } + async function verifyPassword(password, storedHash, storedSalt) { + const { hash } = await hashPassword(password, storedSalt); + return hash === storedHash; + } + + // src/utilities/utils.js + var storage = api.storage.local; + var RECOMMENDED_RELAYS = [ + new URL("wss://relay.damus.io"), + new URL("wss://relay.primal.net"), + new URL("wss://relay.snort.social"), + new URL("wss://relay.getalby.com/v1"), + new URL("wss://nos.lol") + ]; + async function getProfiles() { + let profiles = await storage.get({ profiles: [] }); + return profiles.profiles; + } + async function getProfile(index) { + let profiles = await getProfiles(); + return profiles[index]; + } + async function getProfileIndex() { + const index = await storage.get({ profileIndex: 0 }); + return index.profileIndex; + } + async function get(item) { + return (await storage.get(item))[item]; + } + async function getPermission(host, action) { + let index = await getProfileIndex(); + let profile = await getProfile(index); + return profile?.hosts?.[host]?.[action] || "ask"; + } + async function setPermission(host, action, perm, index = null) { + let profiles = await getProfiles(); + if (!index) { + index = await getProfileIndex(); + } + let profile = profiles[index]; + let newPerms = profile.hosts[host] || {}; + newPerms = { ...newPerms, [action]: perm }; + profile.hosts[host] = newPerms; + profile.updatedAt = Math.floor(Date.now() / 1e3); + profiles[index] = profile; + await storage.set({ profiles }); + } + async function isEncrypted() { + const data = await storage.get({ isEncrypted: false, passwordHash: null, profiles: [] }); + if (data.isEncrypted) return true; + if (data.passwordHash) { + await storage.set({ isEncrypted: true }); + return true; + } + for (const profile of data.profiles) { + if (isEncryptedBlob(profile.privKey)) { + await storage.set({ isEncrypted: true }); + return true; + } + } + return false; + } + async function setPasswordHash(password) { + const { hash, salt } = await hashPassword(password); + await storage.set({ + passwordHash: hash, + passwordSalt: salt, + isEncrypted: true + }); + } + async function checkPassword(password) { + const data = await storage.get({ + passwordHash: null, + passwordSalt: null + }); + if (!data.passwordHash || !data.passwordSalt) return false; + return verifyPassword(password, data.passwordHash, data.passwordSalt); + } + async function removePasswordProtection(password) { + const valid = await checkPassword(password); + if (!valid) throw new Error("Invalid password"); + let profiles = await getProfiles(); + for (let i = 0; i < profiles.length; i++) { + if (profiles[i].type === "bunker") continue; + if (isEncryptedBlob(profiles[i].privKey)) { + profiles[i].privKey = await decrypt4(profiles[i].privKey, password); + } + } + await storage.set({ + profiles, + isEncrypted: false, + passwordHash: null, + passwordSalt: null + }); + } + async function encryptAllKeys(password) { + let profiles = await getProfiles(); + for (let i = 0; i < profiles.length; i++) { + if (profiles[i].type === "bunker") continue; + if (!isEncryptedBlob(profiles[i].privKey)) { + profiles[i].privKey = await encrypt4(profiles[i].privKey, password); + } + } + await setPasswordHash(password); + await storage.set({ profiles }); + } + async function changePasswordForKeys(oldPassword, newPassword) { + let profiles = await getProfiles(); + for (let i = 0; i < profiles.length; i++) { + if (profiles[i].type === "bunker") continue; + let hex = profiles[i].privKey; + if (isEncryptedBlob(hex)) { + hex = await decrypt4(hex, oldPassword); + } + profiles[i].privKey = await encrypt4(hex, newPassword); + } + const { hash, salt } = await hashPassword(newPassword); + await storage.set({ + profiles, + passwordHash: hash, + passwordSalt: salt, + isEncrypted: true + }); + } + async function getDecryptedPrivKey(profile, password) { + if (profile.type === "bunker") return ""; + if (isEncryptedBlob(profile.privKey)) { + return decrypt4(profile.privKey, password); + } + return profile.privKey; + } + function isEncryptedBlob(value) { + if (typeof value !== "string") return false; + try { + const parsed = JSON.parse(value); + return !!(parsed.salt && parsed.iv && parsed.ciphertext); + } catch { + return false; + } + } + + // src/utilities/db.js + init_process(); + + // node_modules/idb/build/index.js + init_process(); + var instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c); + var idbProxyableTypes; + var cursorAdvanceMethods; + function getIdbProxyableTypes() { + return idbProxyableTypes || (idbProxyableTypes = [ + IDBDatabase, + IDBObjectStore, + IDBIndex, + IDBCursor, + IDBTransaction + ]); + } + function getCursorAdvanceMethods() { + return cursorAdvanceMethods || (cursorAdvanceMethods = [ + IDBCursor.prototype.advance, + IDBCursor.prototype.continue, + IDBCursor.prototype.continuePrimaryKey + ]); + } + var transactionDoneMap = /* @__PURE__ */ new WeakMap(); + var transformCache = /* @__PURE__ */ new WeakMap(); + var reverseTransformCache = /* @__PURE__ */ new WeakMap(); + function promisifyRequest(request) { + const promise = new Promise((resolve, reject) => { + const unlisten = () => { + request.removeEventListener("success", success); + request.removeEventListener("error", error); + }; + const success = () => { + resolve(wrap(request.result)); + unlisten(); + }; + const error = () => { + reject(request.error); + unlisten(); + }; + request.addEventListener("success", success); + request.addEventListener("error", error); + }); + reverseTransformCache.set(promise, request); + return promise; + } + function cacheDonePromiseForTransaction(tx) { + if (transactionDoneMap.has(tx)) + return; + const done = new Promise((resolve, reject) => { + const unlisten = () => { + tx.removeEventListener("complete", complete2); + tx.removeEventListener("error", error); + tx.removeEventListener("abort", error); + }; + const complete2 = () => { + resolve(); + unlisten(); + }; + const error = () => { + reject(tx.error || new DOMException("AbortError", "AbortError")); + unlisten(); + }; + tx.addEventListener("complete", complete2); + tx.addEventListener("error", error); + tx.addEventListener("abort", error); + }); + transactionDoneMap.set(tx, done); + } + var idbProxyTraps = { + get(target, prop, receiver) { + if (target instanceof IDBTransaction) { + if (prop === "done") + return transactionDoneMap.get(target); + if (prop === "store") { + return receiver.objectStoreNames[1] ? void 0 : receiver.objectStore(receiver.objectStoreNames[0]); + } + } + return wrap(target[prop]); + }, + set(target, prop, value) { + target[prop] = value; + return true; + }, + has(target, prop) { + if (target instanceof IDBTransaction && (prop === "done" || prop === "store")) { + return true; + } + return prop in target; + } + }; + function replaceTraps(callback) { + idbProxyTraps = callback(idbProxyTraps); + } + function wrapFunction(func) { + if (getCursorAdvanceMethods().includes(func)) { + return function(...args) { + func.apply(unwrap(this), args); + return wrap(this.request); + }; + } + return function(...args) { + return wrap(func.apply(unwrap(this), args)); + }; + } + function transformCachableValue(value) { + if (typeof value === "function") + return wrapFunction(value); + if (value instanceof IDBTransaction) + cacheDonePromiseForTransaction(value); + if (instanceOfAny(value, getIdbProxyableTypes())) + return new Proxy(value, idbProxyTraps); + return value; + } + function wrap(value) { + if (value instanceof IDBRequest) + return promisifyRequest(value); + if (transformCache.has(value)) + return transformCache.get(value); + const newValue = transformCachableValue(value); + if (newValue !== value) { + transformCache.set(value, newValue); + reverseTransformCache.set(newValue, value); + } + return newValue; + } + var unwrap = (value) => reverseTransformCache.get(value); + function openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) { + const request = indexedDB.open(name, version); + const openPromise = wrap(request); + if (upgrade) { + request.addEventListener("upgradeneeded", (event) => { + upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event); + }); + } + if (blocked) { + request.addEventListener("blocked", (event) => blocked( + // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405 + event.oldVersion, + event.newVersion, + event + )); + } + openPromise.then((db) => { + if (terminated) + db.addEventListener("close", () => terminated()); + if (blocking) { + db.addEventListener("versionchange", (event) => blocking(event.oldVersion, event.newVersion, event)); + } + }).catch(() => { + }); + return openPromise; + } + var readMethods = ["get", "getKey", "getAll", "getAllKeys", "count"]; + var writeMethods = ["put", "add", "delete", "clear"]; + var cachedMethods = /* @__PURE__ */ new Map(); + function getMethod(target, prop) { + if (!(target instanceof IDBDatabase && !(prop in target) && typeof prop === "string")) { + return; + } + if (cachedMethods.get(prop)) + return cachedMethods.get(prop); + const targetFuncName = prop.replace(/FromIndex$/, ""); + const useIndex = prop !== targetFuncName; + const isWrite = writeMethods.includes(targetFuncName); + if ( + // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge. + !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) || !(isWrite || readMethods.includes(targetFuncName)) + ) { + return; + } + const method = async function(storeName, ...args) { + const tx = this.transaction(storeName, isWrite ? "readwrite" : "readonly"); + let target2 = tx.store; + if (useIndex) + target2 = target2.index(args.shift()); + return (await Promise.all([ + target2[targetFuncName](...args), + isWrite && tx.done + ]))[0]; + }; + cachedMethods.set(prop, method); + return method; + } + replaceTraps((oldTraps) => ({ + ...oldTraps, + get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver), + has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop) + })); + var advanceMethodProps = ["continue", "continuePrimaryKey", "advance"]; + var methodMap = {}; + var advanceResults = /* @__PURE__ */ new WeakMap(); + var ittrProxiedCursorToOriginalProxy = /* @__PURE__ */ new WeakMap(); + var cursorIteratorTraps = { + get(target, prop) { + if (!advanceMethodProps.includes(prop)) + return target[prop]; + let cachedFunc = methodMap[prop]; + if (!cachedFunc) { + cachedFunc = methodMap[prop] = function(...args) { + advanceResults.set(this, ittrProxiedCursorToOriginalProxy.get(this)[prop](...args)); + }; + } + return cachedFunc; + } + }; + async function* iterate(...args) { + let cursor = this; + if (!(cursor instanceof IDBCursor)) { + cursor = await cursor.openCursor(...args); + } + if (!cursor) + return; + cursor = cursor; + const proxiedCursor = new Proxy(cursor, cursorIteratorTraps); + ittrProxiedCursorToOriginalProxy.set(proxiedCursor, cursor); + reverseTransformCache.set(proxiedCursor, unwrap(cursor)); + while (cursor) { + yield proxiedCursor; + cursor = await (advanceResults.get(proxiedCursor) || cursor.continue()); + advanceResults.delete(proxiedCursor); + } + } + function isIteratorProp(target, prop) { + return prop === Symbol.asyncIterator && instanceOfAny(target, [IDBIndex, IDBObjectStore, IDBCursor]) || prop === "iterate" && instanceOfAny(target, [IDBIndex, IDBObjectStore]); + } + replaceTraps((oldTraps) => ({ + ...oldTraps, + get(target, prop, receiver) { + if (isIteratorProp(target, prop)) + return iterate; + return oldTraps.get(target, prop, receiver); + }, + has(target, prop) { + return isIteratorProp(target, prop) || oldTraps.has(target, prop); + } + })); + + // src/utilities/db.js + async function openEventsDb() { + return await openDB("events", 1, { + upgrade(db) { + const events = db.createObjectStore("events", { + keyPath: "event.id" + }); + events.createIndex("pubkey", "event.pubkey"); + events.createIndex("created_at", "event.created_at"); + events.createIndex("kind", "event.kind"); + events.createIndex("host", "metadata.host"); + } + }); + } + async function saveEvent(event) { + let db = await openEventsDb(); + return db.put("events", event); + } + + // src/utilities/sync-manager.js + init_process(); + var SYNC_QUOTA = 102400; + var MAX_ITEM = 8192; + var MAX_ITEMS = 512; + var CHUNK_PREFIX = "_chunk:"; + var SYNC_META_KEY = "_sync_meta"; + var LOCAL_ENABLED_KEY = "platformSyncEnabled"; + var PRIORITY = { + P1_PROFILES: 1, + P2_SETTINGS: 2, + P3_APIKEYS: 3, + P4_VAULT: 4 + }; + var storage2 = api.storage.local; + var pushTimer = null; + function chunkValue(key, jsonString) { + const chunks = []; + for (let i = 0; i < jsonString.length; i += MAX_ITEM - 100) { + chunks.push(jsonString.slice(i, i + MAX_ITEM - 100)); + } + if (chunks.length === 1) { + return [{ key, value: jsonString }]; + } + const entries = []; + for (let i = 0; i < chunks.length; i++) { + entries.push({ key: `${CHUNK_PREFIX}${key}:${i}`, value: chunks[i] }); + } + entries.push({ key, value: JSON.stringify({ __chunked: true, count: chunks.length }) }); + return entries; + } + function reassembleFromSyncData(key, syncData) { + try { + const meta = typeof syncData[key] === "string" ? JSON.parse(syncData[key]) : syncData[key]; + if (!meta || !meta.__chunked) { + return typeof syncData[key] === "string" ? JSON.parse(syncData[key]) : syncData[key]; + } + let combined = ""; + for (let i = 0; i < meta.count; i++) { + const chunkKey = `${CHUNK_PREFIX}${key}:${i}`; + if (syncData[chunkKey] == null) return null; + combined += syncData[chunkKey]; + } + return JSON.parse(combined); + } catch { + return null; + } + } + async function buildSyncPayload() { + const all = await storage2.get(null); + const entries = []; + if (all.profiles) { + const cleanProfiles = all.profiles.map((p) => { + const { hosts, ...rest } = p; + return rest; + }); + const json = JSON.stringify(cleanProfiles); + entries.push({ key: "profiles", jsonString: json, priority: PRIORITY.P1_PROFILES, size: json.length }); + } + if (all.profileIndex != null) { + const json = JSON.stringify(all.profileIndex); + entries.push({ key: "profileIndex", jsonString: json, priority: PRIORITY.P1_PROFILES, size: json.length }); + } + const settingsKeys = ["autoLockMinutes", "version", "protocol_handler", LOCAL_ENABLED_KEY]; + for (const k of settingsKeys) { + if (all[k] != null) { + const json = JSON.stringify(all[k]); + entries.push({ key: k, jsonString: json, priority: PRIORITY.P2_SETTINGS, size: json.length }); + } + } + for (const k of Object.keys(all)) { + if (k.startsWith("feature:")) { + const json = JSON.stringify(all[k]); + entries.push({ key: k, jsonString: json, priority: PRIORITY.P2_SETTINGS, size: json.length }); + } + } + if (all.apiKeyVault) { + const json = JSON.stringify(all.apiKeyVault); + entries.push({ key: "apiKeyVault", jsonString: json, priority: PRIORITY.P3_APIKEYS, size: json.length }); + } + if (all.vaultDocs && typeof all.vaultDocs === "object") { + const docs = Object.values(all.vaultDocs).sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); + for (const doc of docs) { + const docKey = `vaultDoc:${doc.path}`; + const json = JSON.stringify(doc); + entries.push({ key: docKey, jsonString: json, priority: PRIORITY.P4_VAULT, size: json.length }); + } + } + return entries; + } + async function pushToSync() { + if (!api.storage.sync) return; + const enabled = await isSyncEnabled(); + if (!enabled) return; + try { + const entries = await buildSyncPayload(); + entries.sort((a, b) => a.priority - b.priority); + let usedBytes = 0; + let usedItems = 0; + const syncPayload = {}; + const allSyncKeys = []; + let budgetExhausted = false; + for (const entry of entries) { + if (budgetExhausted) break; + const chunks = chunkValue(entry.key, entry.jsonString); + let entrySize = 0; + for (const c of chunks) { + entrySize += c.key.length + (typeof c.value === "string" ? c.value.length : JSON.stringify(c.value).length); + } + if (usedBytes + entrySize > SYNC_QUOTA - 500 || usedItems + chunks.length > MAX_ITEMS - 5) { + if (entry.priority <= PRIORITY.P3_APIKEYS) { + } else { + console.warn(`[SyncManager] Budget exhausted at priority ${entry.priority}, skipping remaining entries`); + budgetExhausted = true; + break; + } + } + for (const c of chunks) { + syncPayload[c.key] = c.value; + allSyncKeys.push(c.key); + } + usedBytes += entrySize; + usedItems += chunks.length; + } + const meta = { + lastWrittenAt: Date.now(), + keys: allSyncKeys + }; + syncPayload[SYNC_META_KEY] = JSON.stringify(meta); + await api.storage.sync.set(syncPayload); + try { + const existing = await api.storage.sync.get(null); + const orphanKeys = Object.keys(existing).filter( + (k) => k !== SYNC_META_KEY && !allSyncKeys.includes(k) + ); + if (orphanKeys.length > 0) { + await api.storage.sync.remove(orphanKeys); + } + } catch { + } + console.log(`[SyncManager] Pushed ${allSyncKeys.length} entries (${usedBytes} bytes) to sync storage`); + } catch (e) { + console.error("[SyncManager] pushToSync error:", e); + } + } + async function pullFromSync() { + if (!api.storage.sync) return null; + try { + const raw = await api.storage.sync.get(null); + if (!raw || Object.keys(raw).length === 0) return null; + const metaStr = raw[SYNC_META_KEY]; + if (!metaStr) return null; + let meta; + try { + meta = JSON.parse(metaStr); + } catch { + return null; + } + const result = {}; + const dataKeys = meta.keys.filter((k) => !k.startsWith(CHUNK_PREFIX) && k !== SYNC_META_KEY); + for (const key of dataKeys) { + const value = reassembleFromSyncData(key, raw); + if (value != null) { + result[key] = value; + } + } + result._syncMeta = meta; + return result; + } catch (e) { + console.error("[SyncManager] pullFromSync error:", e); + return null; + } + } + async function mergeIntoLocal(syncData) { + if (!syncData) return; + const local = await storage2.get(null); + const { updates, changed } = computeMergeUpdates(local, syncData); + if (changed) { + await storage2.set(updates); + console.log("[SyncManager] Merged sync data into local:", Object.keys(updates)); + } + } + function computeMergeUpdates(local, syncData) { + const updates = {}; + let changed = false; + if (!syncData) return { updates, changed }; + const hasIdentity = (p) => !!(p.privKey || p.pubKey || p.type === "bunker" || p.bunkerUrl || p.remotePubkey); + const isFresh = !local.profiles || local.profiles.length === 0 || !local.profiles.some(hasIdentity); + if (syncData.profiles) { + if (isFresh) { + updates.profiles = syncData.profiles; + changed = true; + } else if (local.profiles) { + const merged = [...local.profiles]; + const indexByPubkey = /* @__PURE__ */ new Map(); + merged.forEach((p, i) => { + if (p.pubKey) indexByPubkey.set(p.pubKey, i); + }); + for (const syncProfile of syncData.profiles) { + const localIdx = syncProfile.pubKey != null ? indexByPubkey.get(syncProfile.pubKey) : void 0; + if (localIdx === void 0) { + merged.push(syncProfile); + if (syncProfile.pubKey) indexByPubkey.set(syncProfile.pubKey, merged.length - 1); + changed = true; + } else { + const localProfile = merged[localIdx]; + const syncTime = syncProfile.updatedAt || 0; + const localTime = localProfile.updatedAt || 0; + if (syncTime > localTime) { + merged[localIdx] = { ...syncProfile, hosts: localProfile.hosts || {} }; + changed = true; + } + } + } + if (changed) updates.profiles = merged; + } + } + if (syncData.profileIndex != null && isFresh) { + updates.profileIndex = syncData.profileIndex; + changed = true; + } + const syncMeta = syncData._syncMeta || {}; + const settingsKeys = ["autoLockMinutes", "version", "protocol_handler", LOCAL_ENABLED_KEY]; + for (const key of settingsKeys) { + if (syncData[key] != null && syncData[key] !== local[key]) { + if (key === "version" && local.version && syncData.version <= local.version) continue; + updates[key] = syncData[key]; + changed = true; + } + } + for (const key of Object.keys(syncData)) { + if (key.startsWith("feature:") && syncData[key] !== local[key]) { + updates[key] = syncData[key]; + changed = true; + } + } + if (syncData.apiKeyVault) { + if (!local.apiKeyVault || isFresh) { + updates.apiKeyVault = syncData.apiKeyVault; + changed = true; + } else { + const localKeys = local.apiKeyVault.keys || {}; + const syncKeys = syncData.apiKeyVault.keys || {}; + const merged = { ...localKeys }; + for (const [id, syncKey] of Object.entries(syncKeys)) { + const localKey = merged[id]; + if (!localKey || (syncKey.updatedAt || 0) > (localKey.updatedAt || 0)) { + merged[id] = syncKey; + changed = true; + } + } + if (changed) { + updates.apiKeyVault = { ...local.apiKeyVault, keys: merged }; + } + } + } + const localDocs = local.vaultDocs || {}; + let docsChanged = false; + const mergedDocs = { ...localDocs }; + for (const key of Object.keys(syncData)) { + if (!key.startsWith("vaultDoc:")) continue; + const doc = syncData[key]; + if (!doc || !doc.path) continue; + const localDoc = mergedDocs[doc.path]; + if (!localDoc || (doc.updatedAt || 0) > (localDoc.updatedAt || 0)) { + mergedDocs[doc.path] = doc; + docsChanged = true; + } + } + if (docsChanged) { + updates.vaultDocs = mergedDocs; + changed = true; + } + return { updates, changed }; + } + function scheduleSyncPush() { + if (!api.storage.sync) return; + if (pushTimer) clearTimeout(pushTimer); + pushTimer = setTimeout(() => { + pushTimer = null; + pushToSync(); + }, 2e3); + } + async function isSyncEnabled() { + const data = await storage2.get({ [LOCAL_ENABLED_KEY]: true }); + return data[LOCAL_ENABLED_KEY]; + } + async function initSync() { + if (!api.storage.sync) { + console.log("[SyncManager] storage.sync not available \u2014 skipping"); + return; + } + const enabled = await isSyncEnabled(); + if (!enabled) { + console.log("[SyncManager] Platform sync disabled"); + return; + } + try { + const syncData = await pullFromSync(); + if (syncData) { + await mergeIntoLocal(syncData); + console.log("[SyncManager] Initial pull+merge complete"); + } else { + console.log("[SyncManager] No sync data found \u2014 fresh sync"); + } + } catch (e) { + console.error("[SyncManager] Initial pull failed:", e); + } + if (api.storage.onChanged) { + api.storage.onChanged.addListener((changes, areaName) => { + if (areaName !== "sync") return; + console.log("[SyncManager] Remote sync change detected"); + pullFromSync().then((syncData) => { + if (syncData) mergeIntoLocal(syncData); + }).catch((e) => { + console.error("[SyncManager] Remote merge error:", e); + }); + }); + } + scheduleSyncPush(); + } + + // src/utilities/nip46.js + init_process(); + var storage3 = api.storage.local; + var log = (msg) => console.log("NIP-46: ", msg); + var sessions = /* @__PURE__ */ new Map(); + function parseBunkerUrl(url) { + if (!url.startsWith("bunker://")) { + throw new Error("Invalid bunker URL: must start with bunker://"); + } + const parsed = new URL(url); + const remotePubkey = parsed.hostname || parsed.pathname.replace("//", ""); + if (!/^[0-9a-f]{64}$/i.test(remotePubkey)) { + throw new Error("Invalid bunker URL: pubkey must be 64 hex characters"); + } + const relays = parsed.searchParams.getAll("relay"); + if (relays.length === 0) { + throw new Error("Invalid bunker URL: at least one relay is required"); + } + for (const relay of relays) { + try { + const r = new URL(relay); + if (r.protocol !== "wss:" && r.protocol !== "ws:") { + throw new Error(`Invalid relay protocol: ${r.protocol}`); + } + } catch (e) { + throw new Error(`Invalid relay URL: ${relay}`); + } + } + const secret = parsed.searchParams.get("secret") || null; + return { remotePubkey, relays, secret }; + } + var RelayConnection = class { + constructor(url) { + this.url = url; + this.ws = null; + this.subscriptions = /* @__PURE__ */ new Map(); + this.eoseCallbacks = /* @__PURE__ */ new Map(); + this.connected = false; + this.reconnectTimer = null; + this.reconnectAttempts = 0; + this.maxReconnectAttempts = 5; + } + connect() { + return new Promise((resolve, reject) => { + try { + this.ws = new WebSocket(this.url); + } catch (e) { + reject(new Error(`Failed to create WebSocket: ${e.message}`)); + return; + } + const timeout = setTimeout(() => { + this.ws?.close(); + reject(new Error(`Connection timeout: ${this.url}`)); + }, 1e4); + this.ws.onopen = () => { + clearTimeout(timeout); + this.connected = true; + this.reconnectAttempts = 0; + log(`Connected to ${this.url}`); + resolve(); + }; + this.ws.onerror = (err) => { + clearTimeout(timeout); + log(`WebSocket error: ${this.url}`); + reject(new Error(`WebSocket error: ${this.url}`)); + }; + this.ws.onclose = () => { + this.connected = false; + log(`Disconnected from ${this.url}`); + this.scheduleReconnect(); + }; + this.ws.onmessage = (msg) => { + try { + const data = JSON.parse(msg.data); + this.handleMessage(data); + } catch (e) { + log(`Failed to parse message: ${e.message}`); + } + }; + }); + } + handleMessage(data) { + const [type, subId, ...rest] = data; + if (type === "EVENT" && subId && rest[0]) { + const event = rest[0]; + const handler = this.subscriptions.get(subId); + if (handler) { + handler(event); + } + } else if (type === "EOSE" && subId) { + const eoseHandler = this.eoseCallbacks.get(subId); + if (eoseHandler) { + this.eoseCallbacks.delete(subId); + eoseHandler(); + } + } else if (type === "OK") { + } else if (type === "NOTICE") { + log(`Relay notice: ${rest[0]}`); + } + } + subscribe(subId, filters, onEvent, onEose = null) { + if (!this.connected || !this.ws) { + throw new Error("Not connected"); + } + this.subscriptions.set(subId, onEvent); + if (onEose) { + this.eoseCallbacks.set(subId, onEose); + } + this.ws.send(JSON.stringify(["REQ", subId, ...filters])); + } + unsubscribe(subId) { + if (this.ws && this.connected) { + this.ws.send(JSON.stringify(["CLOSE", subId])); + } + this.subscriptions.delete(subId); + this.eoseCallbacks.delete(subId); + } + publish(event) { + if (!this.connected || !this.ws) { + throw new Error("Not connected"); + } + this.ws.send(JSON.stringify(["EVENT", event])); + } + scheduleReconnect() { + if (this.reconnectAttempts >= this.maxReconnectAttempts) { + log(`Max reconnect attempts reached for ${this.url}`); + return; + } + const delay = Math.min(1e3 * Math.pow(2, this.reconnectAttempts), 3e4); + this.reconnectAttempts++; + this.reconnectTimer = setTimeout(() => { + log(`Reconnecting to ${this.url} (attempt ${this.reconnectAttempts})`); + this.connect().catch(() => { + }); + }, delay); + } + close() { + clearTimeout(this.reconnectTimer); + this.maxReconnectAttempts = 0; + this.subscriptions.clear(); + this.eoseCallbacks.clear(); + if (this.ws) { + this.ws.close(); + this.ws = null; + } + this.connected = false; + } + }; + var BunkerSession = class { + constructor({ remotePubkey, relays, secret }) { + this.remotePubkey = remotePubkey; + this.relayUrls = relays; + this.secret = secret; + this.sessionPrivkey = null; + this.sessionPubkey = null; + this.conversationKey = null; + this.relays = []; + this.pendingRequests = /* @__PURE__ */ new Map(); + this.connected = false; + this.subId = `nostrkey-${crypto.randomUUID().slice(0, 8)}`; + } + /** + * Initialize the ephemeral session keypair (async) + */ + async init() { + if (this.sessionPrivkey) return; + const keyPair = await generateKeyPair2(); + this.sessionPrivkey = hexToBytes2(keyPair.privateKey); + this.sessionPubkey = keyPair.publicKey; + this.conversationKey = v2.utils.getConversationKey( + this.sessionPrivkey, + this.remotePubkey + ); + } + /** + * Connect to all relays and subscribe for responses + */ + async connect() { + await this.init(); + const connections = this.relayUrls.map((url) => { + const relay = new RelayConnection(url); + return relay.connect().then(() => { + this.relays.push(relay); + return relay; + }); + }); + const results = await Promise.allSettled(connections); + const connected = results.filter((r) => r.status === "fulfilled"); + if (connected.length === 0) { + throw new Error("Failed to connect to any relay"); + } + log(`Connected to ${connected.length}/${this.relayUrls.length} relays`); + for (const relay of this.relays) { + relay.subscribe( + this.subId, + [{ kinds: [24133], "#p": [this.sessionPubkey] }], + (event) => this.handleResponse(event) + ); + } + this.connected = true; + if (this.secret) { + await this.sendRequest("connect", [this.remotePubkey, this.secret]); + } else { + await this.sendRequest("connect", [this.remotePubkey]); + } + } + /** + * Handle an incoming NIP-46 response event + */ + handleResponse(event) { + if (event.pubkey !== this.remotePubkey) { + log(`Ignoring event from unknown pubkey: ${event.pubkey}`); + return; + } + try { + const plaintext = v2.decrypt(event.content, this.conversationKey); + const response = JSON.parse(plaintext); + log(`Response: ${response.id} -> ${response.result ? "ok" : response.error}`); + const pending = this.pendingRequests.get(response.id); + if (pending) { + this.pendingRequests.delete(response.id); + if (response.error) { + pending.reject(new Error(response.error)); + } else { + pending.resolve(response.result); + } + } + } catch (e) { + log(`Failed to handle response: ${e.message}`); + } + } + /** + * Send an encrypted NIP-46 request to the bunker + */ + async sendRequest(method, params = []) { + if (!this.connected && method !== "connect") { + throw new Error("Not connected to bunker"); + } + const id = crypto.randomUUID(); + const request = JSON.stringify({ id, method, params }); + const encrypted = v2.encrypt(request, this.conversationKey); + const event = await finalizeEvent({ + kind: 24133, + content: encrypted, + tags: [["p", this.remotePubkey]], + created_at: Math.floor(Date.now() / 1e3) + }, this.sessionPrivkey); + for (const relay of this.relays) { + try { + relay.publish(event); + } catch (e) { + log(`Failed to publish to ${relay.url}: ${e.message}`); + } + } + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + this.pendingRequests.delete(id); + reject(new Error(`Request timeout: ${method}`)); + }, 3e4); + this.pendingRequests.set(id, { + resolve: (result) => { + clearTimeout(timeout); + resolve(result); + }, + reject: (error) => { + clearTimeout(timeout); + reject(error); + } + }); + }); + } + /** + * NIP-46 Methods + */ + async getPublicKey() { + return await this.sendRequest("get_public_key"); + } + async signEvent(event) { + const result = await this.sendRequest("sign_event", [JSON.stringify(event)]); + return JSON.parse(result); + } + async nip04Encrypt(thirdPartyPubkey, plaintext) { + return await this.sendRequest("nip04_encrypt", [thirdPartyPubkey, plaintext]); + } + async nip04Decrypt(thirdPartyPubkey, ciphertext) { + return await this.sendRequest("nip04_decrypt", [thirdPartyPubkey, ciphertext]); + } + async nip44Encrypt(thirdPartyPubkey, plaintext) { + return await this.sendRequest("nip44_encrypt", [thirdPartyPubkey, plaintext]); + } + async nip44Decrypt(thirdPartyPubkey, ciphertext) { + return await this.sendRequest("nip44_decrypt", [thirdPartyPubkey, ciphertext]); + } + async ping() { + return await this.sendRequest("ping"); + } + /** + * Get session info for persistence + */ + getSessionInfo() { + return { + remotePubkey: this.remotePubkey, + relayUrls: this.relayUrls, + secret: this.secret, + sessionPrivkey: bytesToHex3(this.sessionPrivkey), + sessionPubkey: this.sessionPubkey + }; + } + /** + * Disconnect from all relays + */ + disconnect() { + for (const relay of this.relays) { + relay.unsubscribe(this.subId); + relay.close(); + } + this.relays = []; + this.pendingRequests.clear(); + this.connected = false; + log("Disconnected from bunker"); + } + }; + function restoreSession(sessionInfo) { + const session = new BunkerSession({ + remotePubkey: sessionInfo.remotePubkey, + relays: sessionInfo.relayUrls, + secret: sessionInfo.secret + }); + session.sessionPrivkey = hexToBytes2(sessionInfo.sessionPrivkey); + session.sessionPubkey = sessionInfo.sessionPubkey; + session.conversationKey = v2.utils.getConversationKey( + session.sessionPrivkey, + session.remotePubkey + ); + return session; + } + async function getOrCreateSession(profileIndex) { + if (sessions.has(profileIndex)) { + const session2 = sessions.get(profileIndex); + if (session2.connected) { + return session2; + } + session2.disconnect(); + sessions.delete(profileIndex); + } + const data = await storage3.get({ bunkerSessions: {} }); + const sessionInfo = data.bunkerSessions?.[profileIndex]; + if (!sessionInfo) { + throw new Error("No bunker session configured for this profile"); + } + const session = restoreSession(sessionInfo); + await session.connect(); + sessions.set(profileIndex, session); + return session; + } + async function createSession(profileIndex, bunkerUrl) { + if (sessions.has(profileIndex)) { + sessions.get(profileIndex).disconnect(); + sessions.delete(profileIndex); + } + const config = parseBunkerUrl(bunkerUrl); + const session = new BunkerSession(config); + await session.connect(); + const data = await storage3.get({ bunkerSessions: {} }); + const bunkerSessions = data.bunkerSessions || {}; + bunkerSessions[profileIndex] = session.getSessionInfo(); + await storage3.set({ bunkerSessions }); + sessions.set(profileIndex, session); + return session; + } + async function disconnectSession(profileIndex) { + if (sessions.has(profileIndex)) { + sessions.get(profileIndex).disconnect(); + sessions.delete(profileIndex); + } + const data = await storage3.get({ bunkerSessions: {} }); + const bunkerSessions = data.bunkerSessions || {}; + delete bunkerSessions[profileIndex]; + await storage3.set({ bunkerSessions }); + } + function isSessionActive(profileIndex) { + return sessions.has(profileIndex) && sessions.get(profileIndex).connected; + } + function validateBunkerUrl(url) { + try { + parseBunkerUrl(url); + return { valid: true, error: null }; + } catch (e) { + return { valid: false, error: e.message }; + } + } + + // src/utilities/bunker-server.js + init_process(); + var log2 = (msg) => console.log("BunkerServer: ", msg); + var BunkerServer = class { + /** + * @param {Object} opts + * @param {string[]} opts.relayUrls - relay URLs to connect to + * @param {string} opts.userPubkey - hex pubkey of the local user + * @param {string} opts.secret - shared secret for connect handshake + */ + constructor({ relayUrls, userPubkey, secret }) { + this.relayUrls = relayUrls; + this.userPubkey = userPubkey; + this.secret = secret; + this.relays = []; + this.authenticatedClients = /* @__PURE__ */ new Set(); + this.subId = `bunker-srv-${crypto.randomUUID().slice(0, 8)}`; + this.active = false; + this._getPrivKey = null; + } + /** + * Start the bunker server. + * @param {Object} opts + * @param {Function} opts.getPrivKey - async () => Uint8Array (user's private key) + */ + async start({ getPrivKey: getPrivKey2 }) { + this._getPrivKey = getPrivKey2; + const connections = this.relayUrls.map((url) => { + const relay = new RelayConnection(url); + return relay.connect().then(() => { + this.relays.push(relay); + return relay; + }); + }); + const results = await Promise.allSettled(connections); + const connected = results.filter((r) => r.status === "fulfilled"); + if (connected.length === 0) { + throw new Error("Failed to connect to any relay"); + } + log2(`Connected to ${connected.length}/${this.relayUrls.length} relays`); + for (const relay of this.relays) { + relay.subscribe( + this.subId, + [{ kinds: [24133], "#p": [this.userPubkey], since: Math.floor(Date.now() / 1e3) - 5 }], + (event) => this._handleRequest(event) + ); + } + this.active = true; + log2("Bunker server started"); + } + /** + * Stop the bunker server. + */ + stop() { + for (const relay of this.relays) { + relay.unsubscribe(this.subId); + relay.close(); + } + this.relays = []; + this.authenticatedClients.clear(); + this.active = false; + this._getPrivKey = null; + log2("Bunker server stopped"); + } + /** + * Generate the bunker:// connection string. + */ + getConnectionString() { + const relayParams = this.relayUrls.map((u) => `relay=${encodeURIComponent(u)}`).join("&"); + return `bunker://${this.userPubkey}?${relayParams}&secret=${this.secret}`; + } + /** + * Handle an incoming NIP-46 request event. + */ + async _handleRequest(event) { + const clientPubkey = event.pubkey; + let privKey; + try { + privKey = await this._getPrivKey(); + } catch (e) { + log2(`Cannot get private key (locked?): ${e.message}`); + return; + } + let conversationKey; + try { + conversationKey = v2.utils.getConversationKey(privKey, clientPubkey); + } catch (e) { + log2(`Failed to derive conversation key: ${e.message}`); + return; + } + let request; + try { + const plaintext = v2.decrypt(event.content, conversationKey); + request = JSON.parse(plaintext); + } catch (e) { + log2(`Failed to decrypt request: ${e.message}`); + return; + } + const { id, method, params } = request; + log2(`Request: ${method} (id=${id}) from ${clientPubkey.slice(0, 8)}...`); + if (method !== "connect" && !this.authenticatedClients.has(clientPubkey)) { + await this._sendResponse(privKey, clientPubkey, conversationKey, { + id, + result: null, + error: "Unauthorized: send connect first" + }); + return; + } + let result = null; + let error = null; + try { + switch (method) { + case "connect": { + const clientSecret = params[1]; + if (this.secret && clientSecret !== this.secret) { + error = "Invalid secret"; + } else { + this.authenticatedClients.add(clientPubkey); + result = "ack"; + log2(`Client authenticated: ${clientPubkey.slice(0, 8)}...`); + } + break; + } + case "get_public_key": + result = this.userPubkey; + break; + case "sign_event": { + const unsigned = JSON.parse(params[0]); + const signed = await finalizeEvent(unsigned, privKey); + result = JSON.stringify(signed); + break; + } + case "nip44_encrypt": { + const thirdPartyPubkey = params[0]; + const plaintext = params[1]; + const ck = v2.utils.getConversationKey(privKey, thirdPartyPubkey); + result = v2.encrypt(plaintext, ck); + break; + } + case "nip44_decrypt": { + const thirdPartyPubkey = params[0]; + const ciphertext = params[1]; + const ck = v2.utils.getConversationKey(privKey, thirdPartyPubkey); + result = v2.decrypt(ciphertext, ck); + break; + } + case "nip04_encrypt": { + const thirdPartyPubkey = params[0]; + const plaintext = params[1]; + result = await nip_04_exports.encryptMessage(plaintext, bytesToHex3(privKey), thirdPartyPubkey); + break; + } + case "nip04_decrypt": { + const thirdPartyPubkey = params[0]; + const ciphertext = params[1]; + result = await nip_04_exports.decryptMessage(ciphertext, bytesToHex3(privKey), thirdPartyPubkey); + break; + } + case "ping": + result = "pong"; + break; + default: + error = `Unsupported method: ${method}`; + } + } catch (e) { + error = e.message; + log2(`Error handling ${method}: ${e.message}`); + } + await this._sendResponse(privKey, clientPubkey, conversationKey, { id, result, error }); + } + /** + * Encrypt and publish a NIP-46 response. + */ + async _sendResponse(privKey, clientPubkey, conversationKey, response) { + const encrypted = v2.encrypt(JSON.stringify(response), conversationKey); + const event = await finalizeEvent({ + kind: 24133, + content: encrypted, + tags: [["p", clientPubkey]], + created_at: Math.floor(Date.now() / 1e3) + }, privKey); + for (const relay of this.relays) { + try { + relay.publish(event); + } catch (e) { + log2(`Failed to publish response to ${relay.url}: ${e.message}`); + } + } + log2(`Response sent: ${response.id} ${response.error ? "ERROR" : "OK"}`); + } + }; + + // src/utilities/nip78.js + init_process(); + var KIND_APP_DATA = 30078; + var KIND_DELETION = 5; + var DTAG_PREFIX = "nostrkey:"; + var CLIENT_TAG = "nostrkey"; + function buildVaultEvent(path, encryptedContent) { + return { + kind: KIND_APP_DATA, + content: encryptedContent, + tags: [ + ["d", `${DTAG_PREFIX}${path}`], + ["client", CLIENT_TAG] + ], + created_at: Math.floor(Date.now() / 1e3) + }; + } + function buildVaultDeletion(eventId, path) { + return { + kind: KIND_DELETION, + content: "vault document deleted", + tags: [ + ["e", eventId], + ["a", `${KIND_APP_DATA}::${DTAG_PREFIX}${path}`] + ], + created_at: Math.floor(Date.now() / 1e3) + }; + } + function buildVaultFilter(pubkey) { + return { + kinds: [KIND_APP_DATA], + authors: [pubkey] + }; + } + function parseVaultEvent(event) { + if (event.kind !== KIND_APP_DATA) return null; + const dTag = event.tags?.find((t) => t[0] === "d"); + if (!dTag || !dTag[1]?.startsWith(DTAG_PREFIX)) return null; + const path = dTag[1].slice(DTAG_PREFIX.length); + if (!path) return null; + return { + path, + content: event.content, + createdAt: event.created_at, + eventId: event.id + }; + } + + // src/background.js + var _rawStorage = api.storage.local; + var storage4 = { + get: (...args) => _rawStorage.get(...args), + set: (...args) => { + const result = _rawStorage.set(...args); + result.then(() => scheduleSyncPush()).catch(() => { + }); + return result; + }, + clear: (...args) => _rawStorage.clear(...args), + remove: (...args) => _rawStorage.remove(...args) + }; + var log3 = (msg) => console.log("Background: ", msg); + var validations = {}; + var prompt = { mutex: new Mutex(), release: null, tabId: null }; + var pendingQueue = { total: 0, processed: 0 }; + var activeBunkerServer = null; + function reply(sendResponse, fn) { + fn().then((r) => sendResponse(r)).catch((e) => { + console.error("reply() error:", e); + sendResponse(void 0); + }); + } + var rateLimits = /* @__PURE__ */ new Map(); + var RATE_LIMIT_MAX = 5; + var RATE_LIMIT_WINDOW = 1e4; + function isRateLimited(host) { + const now = Date.now(); + let timestamps = rateLimits.get(host) || []; + timestamps = timestamps.filter((t) => now - t < RATE_LIMIT_WINDOW); + if (timestamps.length >= RATE_LIMIT_MAX) { + rateLimits.set(host, timestamps); + return true; + } + timestamps.push(now); + rateLimits.set(host, timestamps); + return false; + } + var sessionKeys = /* @__PURE__ */ new Map(); + var sessionCryptoKey = null; + var sessionKeySalt = null; + var locked = true; + var encryptionEnabled = false; + var autoLockTimeout = 15 * 60 * 1e3; + var autoLockTimer = null; + var nostrAccessWhileLocked = false; + var blockCrossOriginFrames = true; + var unlockAttempts = 0; + var unlockCooldownUntil = 0; + var permissionRateMap = /* @__PURE__ */ new Map(); + (async () => { + log3("[STARTUP] Reading persisted state..."); + const data = await storage4.get({ autoLockMinutes: 15, isEncrypted: false, passwordHash: null, nostrAccessWhileLocked: false, blockCrossOriginFrames: true }); + log3(`[STARTUP] isEncrypted=${data.isEncrypted}, passwordHash=${data.passwordHash ? "EXISTS" : "null"}, autoLockMinutes=${data.autoLockMinutes}`); + autoLockTimeout = data.autoLockMinutes * 60 * 1e3; + if (!data.isEncrypted && data.passwordHash) { + log3("[STARTUP] Self-healing: passwordHash exists but isEncrypted=false \u2192 fixing"); + await storage4.set({ isEncrypted: true }); + data.isEncrypted = true; + } + if (data.isEncrypted && !data.passwordHash) { + const { profiles = [] } = await storage4.get({ profiles: [] }); + const hasEncryptedBlob = profiles.some((p) => isEncryptedBlob(p.privKey)); + if (!hasEncryptedBlob) { + log3("[STARTUP] Lockout recovery: isEncrypted=true with no passwordHash and no encrypted blobs \u2192 clearing bogus encryption flag"); + await storage4.set({ isEncrypted: false }); + data.isEncrypted = false; + } + } + encryptionEnabled = data.isEncrypted; + nostrAccessWhileLocked = !!data.nostrAccessWhileLocked; + blockCrossOriginFrames = data.blockCrossOriginFrames !== false; + locked = encryptionEnabled; + log3(`[STARTUP] Final state: encryptionEnabled=${encryptionEnabled}, locked=${locked}`); + try { + await initSync(); + log3("[STARTUP] Platform sync initialized"); + } catch (e) { + log3(`[STARTUP] Platform sync init error (non-fatal): ${e.message}`); + } + try { + if (typeof browser !== "undefined" && browser.runtime.sendNativeMessage) { + const response = await browser.runtime.sendNativeMessage( + "com.nostrkey.Extension", + { action: "getSharedProfiles" } + ); + if (response && response.profiles && response.profiles.length > 0) { + const local = await storage4.get({ profiles: [] }); + const merged = mergeSharedProfiles(local.profiles, response.profiles); + if (merged.changed) { + await storage4.set({ profiles: merged.profiles }); + log3(`[STARTUP] Merged ${response.profiles.length} shared profile(s) from iOS app`); + } + } + } + } catch (e) { + log3(`[STARTUP] Shared profiles check skipped: ${e.message}`); + } + })(); + function mergeSharedProfiles(localProfiles, sharedProfiles) { + let changed = false; + const profiles = [...localProfiles]; + for (const shared of sharedProfiles) { + if (!shared.pubKey) continue; + const localIndex = profiles.findIndex((p) => p.pubKey === shared.pubKey); + if (localIndex === -1) { + profiles.push({ + name: shared.name || "Shared Profile", + privKey: shared.privKey || "", + pubKey: shared.pubKey, + hosts: {}, + relays: shared.relays || [], + type: "local", + updatedAt: shared.lastSyncedAt ? new Date(shared.lastSyncedAt).getTime() : Date.now() + }); + changed = true; + } else { + const local = profiles[localIndex]; + const localTime = local.updatedAt || 0; + const sharedTime = shared.lastSyncedAt ? new Date(shared.lastSyncedAt).getTime() : 0; + if (sharedTime > localTime && shared.privKey && !local.privKey) { + profiles[localIndex] = { + ...local, + privKey: shared.privKey, + name: shared.name || local.name, + relays: shared.relays || local.relays, + updatedAt: sharedTime + }; + changed = true; + } + } + } + return { profiles, changed }; + } + var AUTO_LOCK_ALARM = "nostrkey-auto-lock"; + function resetAutoLock() { + if (autoLockTimer) { + clearTimeout(autoLockTimer); + autoLockTimer = null; + } + if (locked || autoLockTimeout <= 0) { + api.alarms?.clear(AUTO_LOCK_ALARM).catch(() => { + }); + return; + } + if (api.alarms) { + api.alarms.create(AUTO_LOCK_ALARM, { delayInMinutes: autoLockTimeout / 6e4 }); + } else { + autoLockTimer = setTimeout(() => { + lockSession(); + }, autoLockTimeout); + } + } + if (api.alarms?.onAlarm) { + api.alarms.onAlarm.addListener((alarm) => { + if (alarm.name === AUTO_LOCK_ALARM) { + lockSession(); + } + }); + } + var sessionMutex = new Mutex(); + async function lockSession() { + const release = await sessionMutex.acquire(); + try { + if (!nostrAccessWhileLocked) { + sessionKeys.clear(); + } + sessionCryptoKey = null; + sessionKeySalt = null; + locked = true; + if (autoLockTimer) { + clearTimeout(autoLockTimer); + autoLockTimer = null; + } + log3(`Session locked. Keys retained: ${nostrAccessWhileLocked && sessionKeys.size > 0}`); + } finally { + release(); + } + } + async function unlockSession(password) { + const release = await sessionMutex.acquire(); + try { + const now = Date.now(); + if (now < unlockCooldownUntil) { + const waitSec = Math.ceil((unlockCooldownUntil - now) / 1e3); + return { success: false, error: `Too many attempts. Try again in ${waitSec} seconds.` }; + } + const valid = await checkPassword(password); + if (!valid) { + unlockAttempts++; + if (unlockAttempts >= 3) { + const cooldownMs = 3e4 * Math.pow(2, Math.floor((unlockAttempts - 3) / 3)); + unlockCooldownUntil = Date.now() + cooldownMs; + log3(`[SECURITY] ${unlockAttempts} failed attempts. Cooldown: ${cooldownMs / 1e3}s`); + } + return { success: false, error: "Invalid password" }; + } + unlockAttempts = 0; + unlockCooldownUntil = 0; + const profiles = await getProfiles(); + let needsSave = false; + for (let i = 0; i < profiles.length; i++) { + if (profiles[i].type === "bunker") continue; + const hex = await getDecryptedPrivKey(profiles[i], password); + sessionKeys.set(i, hex); + if (!profiles[i].pubKey && hex) { + try { + profiles[i].pubKey = getPublicKeySync(hex); + needsSave = true; + } catch (e) { + console.error(`Failed to cache pubKey for profile ${i}:`, e); + } + } + } + if (needsSave) { + await storage4.set({ profiles }); + } + const salt = crypto.getRandomValues(new Uint8Array(16)); + sessionCryptoKey = await deriveKey(password, salt); + sessionKeySalt = salt; + locked = false; + resetAutoLock(); + log3("Session unlocked."); + return { success: true }; + } finally { + release(); + } + } + async function checkLockState() { + const encrypted = await isEncrypted(); + log3(`[checkLockState] isEncrypted()=${encrypted}, locked=${locked}`); + if (!encrypted) { + locked = false; + return false; + } + return locked; + } + var SENSITIVE_KINDS = /* @__PURE__ */ new Set([ + "setPassword", + "changePassword", + "removePassword", + "resetAllData", + "setAutoLockTimeout", + "setNostrAccessWhileLocked", + "setBlockCrossOriginFrames", + "backup.export", + "backup.import", + "unlock" + ]); + function isExtensionSender(sender) { + if (sender.id !== api.runtime.id) return false; + if (sender.tab) { + const extOrigin = `chrome-extension://${api.runtime.id}`; + const url = sender.tab.url || sender.url || ""; + return url.startsWith(extOrigin) || url.startsWith("moz-extension://"); + } + return true; + } + api.runtime.onMessage.addListener((message, _sender, sendResponse) => { + log3(message); + if (SENSITIVE_KINDS.has(message.kind) && !isExtensionSender(_sender)) { + log3(`[SECURITY] Blocked ${message.kind} from non-extension sender`); + sendResponse({ success: false, error: "Unauthorized sender" }); + return true; + } + let uuid = crypto.randomUUID(); + let sr; + switch (message.kind) { + // General + case "closePrompt": + prompt.release?.(); + sendResponse(true); + return true; + case "allowed": + resetAutoLock(); + complete(message); + sendResponse(true); + return true; + case "denied": + deny(message); + sendResponse(true); + return true; + case "generatePrivateKey": + (async () => { + try { + const result = await generatePrivateKey_(); + sendResponse(result); + } catch (e) { + console.error("generatePrivateKey error:", e); + sendResponse(null); + } + })(); + return true; + // Keep message channel open for async sendResponse + case "savePrivateKey": + resetAutoLock(); + (async () => { + try { + await savePrivateKey(message.payload); + sendResponse({ success: true }); + } catch (e) { + console.error("savePrivateKey error:", e); + sendResponse({ success: false, error: e.message || "Failed to save key" }); + } + })(); + return true; + case "getNpub": + (async () => { + try { + const result = await getNpub(message.payload); + sendResponse(result); + } catch (e) { + console.error("getNpub error:", e); + sendResponse(null); + } + })(); + return true; + case "getNsec": + resetAutoLock(); + (async () => { + try { + const result = await getNsec(message.payload); + sendResponse(result); + } catch (e) { + console.error("getNsec error:", e); + sendResponse(null); + } + })(); + return true; + case "calcPubKey": + sendResponse(getPublicKeySync(message.payload)); + return true; + case "npubEncode": + sendResponse(nip_19_exports.npubEncode(message.payload)); + return true; + case "copy": + if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) { + navigator.clipboard.writeText(message.payload).then(() => sendResponse(true)).catch(() => sendResponse(false)); + } else { + sendResponse(false); + } + return true; + // --- Master password / lock handlers --- + // NOTE: These use sendResponse + return true (callback pattern) because + // Chrome MV3 does not reliably deliver Promise-return values from + // onMessage listeners to sendMessage callers. + case "isLocked": + (async () => { + try { + const result = await checkLockState(); + log3(`[isLocked] Sending response: ${result}`); + sendResponse(result); + } catch (e) { + log3(`[isLocked] Error: ${e.message}`); + sendResponse(false); + } + })(); + return true; + case "isEncrypted": + (async () => { + try { + const data = await storage4.get({ isEncrypted: false, passwordHash: null }); + log3(`[isEncrypted] storage: isEncrypted=${data.isEncrypted}, passwordHash=${data.passwordHash ? "EXISTS" : "null"}`); + if (!data.isEncrypted && data.passwordHash) { + log3("[isEncrypted] Self-healing: passwordHash exists but flag=false"); + await storage4.set({ isEncrypted: true }); + data.isEncrypted = true; + } + encryptionEnabled = data.isEncrypted; + log3(`[isEncrypted] Sending response: ${encryptionEnabled}`); + sendResponse(encryptionEnabled); + } catch (e) { + log3(`[isEncrypted] Error: ${e.message}`); + sendResponse(false); + } + })(); + return true; + case "hasEncryptedData": + (async () => { + try { + const data = await storage4.get({ passwordHash: null, profiles: [] }); + const hasPasswordHash = !!data.passwordHash; + let encryptedProfiles = 0; + log3(`[hasEncryptedData] passwordHash=${hasPasswordHash}, profiles=${Array.isArray(data.profiles) ? data.profiles.length : "not-array"}`); + if (Array.isArray(data.profiles)) { + for (let i = 0; i < data.profiles.length; i++) { + const p = data.profiles[i]; + const isEnc = p.privKey ? isEncryptedBlob(p.privKey) : false; + log3(`[hasEncryptedData] profile[${i}] name="${p.name}" privKey=${p.privKey ? isEnc ? "ENCRYPTED" : "PLAINTEXT" : "EMPTY"}`); + if (isEnc) encryptedProfiles++; + } + } + const found = hasPasswordHash || encryptedProfiles > 0; + log3(`[hasEncryptedData] Result: found=${found}, hasPasswordHash=${hasPasswordHash}, encryptedProfiles=${encryptedProfiles}`); + if (found && !encryptionEnabled) { + log3("[hasEncryptedData] Self-healing: setting isEncrypted=true, locked=true"); + await storage4.set({ isEncrypted: true }); + encryptionEnabled = true; + locked = true; + } + sendResponse({ found, hasPasswordHash, encryptedProfiles }); + } catch (e) { + console.error("hasEncryptedData error:", e); + sendResponse({ found: false, hasPasswordHash: false, encryptedProfiles: 0 }); + } + })(); + return true; + case "unlock": + reply(sendResponse, () => unlockSession(message.payload)); + return true; + case "lock": + lockSession().then(() => sendResponse(true)); + return true; + case "setPassword": + (async () => { + try { + await cachePubKeysForAllProfiles(); + await encryptAllKeys(message.payload); + encryptionEnabled = true; + const result = await unlockSession(message.payload); + api.runtime.sendMessage({ kind: "passwordStateChanged", hasPassword: true }).catch(() => { + }); + api.runtime.sendMessage({ kind: "backupNeeded" }).catch(() => { + }); + sendResponse(result); + } catch (e) { + sendResponse({ success: false, error: e.message }); + } + })(); + return true; + case "changePassword": + (async () => { + try { + const { oldPassword, newPassword } = message.payload; + const valid = await checkPassword(oldPassword); + if (!valid) { + sendResponse({ success: false, error: "Invalid current password" }); + return; + } + await changePasswordForKeys(oldPassword, newPassword); + const result = await unlockSession(newPassword); + api.runtime.sendMessage({ kind: "passwordStateChanged", hasPassword: true }).catch(() => { + }); + api.runtime.sendMessage({ kind: "backupNeeded" }).catch(() => { + }); + sendResponse(result); + } catch (e) { + sendResponse({ success: false, error: e.message }); + } + })(); + return true; + case "removePassword": + (async () => { + try { + await removePasswordProtection(message.payload); + sessionKeys.clear(); + sessionCryptoKey = null; + sessionKeySalt = null; + locked = false; + encryptionEnabled = false; + api.runtime.sendMessage({ kind: "passwordStateChanged", hasPassword: false }).catch(() => { + }); + sendResponse({ success: true }); + } catch (e) { + sendResponse({ success: false, error: e.message }); + } + })(); + return true; + case "resetAllData": + (async () => { + try { + await storage4.clear(); + sessionKeys.clear(); + sessionCryptoKey = null; + sessionKeySalt = null; + locked = false; + encryptionEnabled = false; + nostrAccessWhileLocked = false; + blockCrossOriginFrames = true; + await storage4.set({ + profiles: [{ name: "Default Nostr Profile", privKey: "", pubKey: "" }], + profileIndex: 0, + isEncrypted: false, + passwordHash: null, + passwordSalt: null + }); + api.runtime.sendMessage({ kind: "dataReset" }).catch(() => { + }); + sendResponse({ success: true }); + } catch (e) { + sendResponse({ success: false, error: e.message }); + } + })(); + return true; + case "setAutoLockTimeout": { + const ALLOWED_LOCK_MINUTES = [0, 5, 15, 30, 60, 90, 180]; + const mins = Number(message.payload); + if (!ALLOWED_LOCK_MINUTES.includes(mins)) { + sendResponse(false); + return true; + } + autoLockTimeout = mins * 60 * 1e3; + storage4.set({ autoLockMinutes: mins }); + resetAutoLock(); + sendResponse(true); + return true; + } + case "getAutoLockTimeout": + reply(sendResponse, async () => { + const { autoLockMinutes } = await storage4.get({ autoLockMinutes: 15 }); + return autoLockMinutes; + }); + return true; + case "resetAutoLock": + resetAutoLock(); + sendResponse(true); + return true; + // --- Nostr access while locked --- + case "getNostrAccessWhileLocked": + sendResponse(nostrAccessWhileLocked); + return true; + case "setNostrAccessWhileLocked": + nostrAccessWhileLocked = !!message.payload; + storage4.set({ nostrAccessWhileLocked: !!message.payload }); + if (!message.payload && locked) { + sessionKeys.clear(); + } + sendResponse(true); + return true; + case "getBlockCrossOriginFrames": + sendResponse(blockCrossOriginFrames); + return true; + case "setBlockCrossOriginFrames": + blockCrossOriginFrames = !!message.payload; + storage4.set({ blockCrossOriginFrames: !!message.payload }); + sendResponse(true); + return true; + case "getActiveProfileInfo": + (async () => { + try { + const pi = await getProfileIndex(); + const profiles = await getProfiles(); + const profile = profiles[pi]; + if (!profile) { + log3("[getActiveProfileInfo] No profile found at index " + pi); + sendResponse({ name: "Unknown", npub: "", hasKeys: false }); + return; + } + let npub = ""; + if (profile.type === "bunker" && profile.remotePubkey) { + npub = nip_19_exports.npubEncode(profile.remotePubkey); + } else if (profile.pubKey) { + npub = nip_19_exports.npubEncode(profile.pubKey); + } + const result = { + name: profile.name || "Unnamed Profile", + npub, + hasKeys: sessionKeys.has(pi), + isBunker: profile.type === "bunker" + }; + log3("[getActiveProfileInfo] Sending: " + JSON.stringify(result)); + sendResponse(result); + } catch (e) { + log3("[getActiveProfileInfo] Error: " + e.message); + sendResponse({ name: "Error", npub: "", hasKeys: false }); + } + })(); + return true; + // --- NIP-49 ncryptsec handlers --- + case "ncryptsec.decrypt": + reply(sendResponse, async () => { + try { + const { ncryptsec, password } = message.payload; + const hexKey = bytesToHex3(decrypt2(ncryptsec, password)); + return { success: true, hexKey }; + } catch (e) { + return { success: false, error: e.message || "Decryption failed" }; + } + }); + return true; + case "ncryptsec.encrypt": + reply(sendResponse, async () => { + try { + const { profileIndex: ei, password } = message.payload; + const profile = await getProfile(ei); + if (profile?.type === "bunker") { + return { success: false, error: "Cannot export bunker profile as ncryptsec" }; + } + const hexKey = await getPlaintextPrivKey(ei, profile); + const ncryptsec = encrypt2(hexToBytes2(hexKey), password); + return { success: true, ncryptsec }; + } catch (e) { + return { success: false, error: e.message || "Encryption failed" }; + } + }); + return true; + // --- BIP39 Seed Phrase handlers --- + case "seedPhrase.fromKey": + reply(sendResponse, async () => { + try { + const ei = message.payload; + const profile = await getProfile(ei); + if (profile?.type === "bunker") { + return { success: false, error: "Cannot export bunker profile as seed phrase" }; + } + const hexKey = await getPlaintextPrivKey(ei, profile); + const seedPhrase = keyToSeedPhrase(hexKey); + return { success: true, seedPhrase }; + } catch (e) { + return { success: false, error: e.message || "Failed to generate seed phrase" }; + } + }); + return true; + case "seedPhrase.toKey": + reply(sendResponse, async () => { + try { + const { hexKey, pubKey } = seedPhraseToKey(message.payload); + return { success: true, hexKey, pubKey }; + } catch (e) { + return { success: false, error: e.message || "Invalid seed phrase" }; + } + }); + return true; + case "seedPhrase.validate": + sendResponse(isValidSeedPhrase(message.payload)); + return true; + // --- NIP-46 Bunker handlers --- + case "getProfileType": + reply(sendResponse, async () => { + const pi = message.payload ?? await getProfileIndex(); + const profile = await getProfile(pi); + return profile?.type || "local"; + }); + return true; + case "bunker.connect": + reply(sendResponse, async () => { + try { + const { profileIndex: bi, bunkerUrl } = message.payload; + const session = await createSession(bi, bunkerUrl); + const remotePubkey = await session.getPublicKey(); + const profiles = await getProfiles(); + profiles[bi].remotePubkey = remotePubkey; + profiles[bi].bunkerUrl = bunkerUrl; + await storage4.set({ profiles }); + return { success: true, remotePubkey }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "bunker.disconnect": + reply(sendResponse, async () => { + try { + const bi = message.payload; + await disconnectSession(bi); + return { success: true }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "bunker.status": + reply(sendResponse, async () => { + const bi = message.payload ?? await getProfileIndex(); + return { connected: isSessionActive(bi) }; + }); + return true; + case "bunker.ping": + reply(sendResponse, async () => { + try { + const bi = message.payload ?? await getProfileIndex(); + const session = await getOrCreateSession(bi); + const result = await session.ping(); + return { success: true, result }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "bunker.validateUrl": + sendResponse(validateBunkerUrl(message.payload)); + return true; + // --- Bunker Server handlers (extension acts as NIP-46 signer) --- + case "bunkerServer.start": + reply(sendResponse, async () => { + try { + if (activeBunkerServer) { + activeBunkerServer.stop(); + activeBunkerServer = null; + } + const pubkey = await getPubKey(); + const relayUrls = message.payload?.relayUrls || ["wss://relay.nostrkey.com"]; + const secret = crypto.randomUUID().replace(/-/g, "").slice(0, 16); + const server = new BunkerServer({ relayUrls, userPubkey: pubkey, secret }); + await server.start({ getPrivKey }); + activeBunkerServer = server; + return { success: true, uri: server.getConnectionString() }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "bunkerServer.stop": + reply(sendResponse, async () => { + if (activeBunkerServer) { + activeBunkerServer.stop(); + activeBunkerServer = null; + } + return { success: true }; + }); + return true; + case "bunkerServer.status": + sendResponse({ + active: !!activeBunkerServer?.active, + uri: activeBunkerServer?.getConnectionString() || null, + clientCount: activeBunkerServer?.authenticatedClients.size || 0 + }); + return true; + // --- Vault handlers --- + case "vault.publish": + reply(sendResponse, async () => { + try { + const { path, content } = message.payload; + const pubkey = await getPubKey(); + const encrypted = await nip44Encrypt({ pubKey: pubkey, plainText: content }); + const unsigned = buildVaultEvent(path, encrypted); + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + let signed; + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + signed = await session.signEvent(unsigned); + } else { + const sk = await getPrivKey(); + signed = await finalizeEvent(unsigned, sk); + } + await withRelays("write", async (relays) => { + for (const relay of relays) { + try { + relay.publish(signed); + } catch (_) { + } + } + }); + return { success: true, eventId: signed.id, createdAt: signed.created_at }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "vault.fetch": + reply(sendResponse, async () => { + try { + const pubkey = await getPubKey(); + const filter = buildVaultFilter(pubkey); + const allEvents = []; + await withRelays("read", async (relays) => { + const perRelay = relays.map((relay) => new Promise((resolve) => { + const subId = `vault-${crypto.randomUUID().slice(0, 8)}`; + const timeout = setTimeout(() => { + try { + relay.unsubscribe(subId); + } catch (_) { + } + resolve(); + }, 15e3); + relay.subscribe( + subId, + [filter], + (event) => { + allEvents.push(event); + }, + () => { + clearTimeout(timeout); + try { + relay.unsubscribe(subId); + } catch (_) { + } + resolve(); + } + ); + })); + await Promise.all(perRelay); + }); + const byDtag = /* @__PURE__ */ new Map(); + for (const event of allEvents) { + const parsed = parseVaultEvent(event); + if (!parsed) continue; + const existing = byDtag.get(parsed.path); + if (!existing || parsed.createdAt > existing.createdAt) { + byDtag.set(parsed.path, { event, parsed }); + } + } + const documents = []; + const pubkey_ = await getPubKey(); + for (const { event, parsed } of byDtag.values()) { + try { + const decrypted = await nip44Decrypt({ pubKey: pubkey_, cipherText: event.content }); + documents.push({ + path: parsed.path, + content: decrypted, + createdAt: parsed.createdAt, + eventId: parsed.eventId + }); + } catch (_) { + } + } + return { success: true, documents }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "vault.delete": + reply(sendResponse, async () => { + try { + const { path, eventId } = message.payload; + const unsigned = buildVaultDeletion(eventId, path); + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + let signed; + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + signed = await session.signEvent(unsigned); + } else { + const sk = await getPrivKey(); + signed = await finalizeEvent(unsigned, sk); + } + await withRelays("write", async (relays) => { + for (const relay of relays) { + try { + relay.publish(signed); + } catch (_) { + } + } + }); + return { success: true }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "vault.getRelays": + reply(sendResponse, async () => { + try { + const profile = await currentProfile(); + const relays = profile.relays || []; + const read = relays.filter((r) => r.read).map((r) => r.url); + const write = relays.filter((r) => r.write).map((r) => r.url); + return { read, write }; + } catch (e) { + return { read: [], write: [] }; + } + }); + return true; + // --- API Key Vault handlers --- + case "apikeys.publish": + reply(sendResponse, async () => { + try { + const { keys } = message.payload; + const pubkey = await getPubKey(); + const plainText = JSON.stringify(keys); + const encrypted = await nip44Encrypt({ pubKey: pubkey, plainText }); + const unsigned = buildVaultEvent("vault/api-keys", encrypted); + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + let signed; + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + signed = await session.signEvent(unsigned); + } else { + const sk = await getPrivKey(); + signed = await finalizeEvent(unsigned, sk); + } + await withRelays("write", async (relays) => { + for (const relay of relays) { + try { + relay.publish(signed); + } catch (_) { + } + } + }); + return { success: true, eventId: signed.id, createdAt: signed.created_at }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "apikeys.fetch": + reply(sendResponse, async () => { + try { + const pubkey = await getPubKey(); + const filter = { + kinds: [30078], + authors: [pubkey], + "#d": ["nostrkey:vault/api-keys"] + }; + const allEvents = []; + await withRelays("read", async (relays) => { + const perRelay = relays.map((relay) => new Promise((resolve) => { + const subId = `apikeys-${crypto.randomUUID().slice(0, 8)}`; + const timeout = setTimeout(() => { + try { + relay.unsubscribe(subId); + } catch (_) { + } + resolve(); + }, 15e3); + relay.subscribe( + subId, + [filter], + (event) => { + allEvents.push(event); + }, + () => { + clearTimeout(timeout); + try { + relay.unsubscribe(subId); + } catch (_) { + } + resolve(); + } + ); + })); + await Promise.all(perRelay); + }); + let latest = null; + for (const event of allEvents) { + if (!latest || event.created_at > latest.created_at) { + latest = event; + } + } + if (!latest) { + return { success: true, keys: null, eventId: null, createdAt: null }; + } + const decrypted = await nip44Decrypt({ pubKey: pubkey, cipherText: latest.content }); + const keys = JSON.parse(decrypted); + return { success: true, keys, eventId: latest.id, createdAt: latest.created_at }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "apikeys.delete": + reply(sendResponse, async () => { + try { + const { eventId } = message.payload; + const unsigned = buildVaultDeletion(eventId, "vault/api-keys"); + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + let signed; + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + signed = await session.signEvent(unsigned); + } else { + const sk = await getPrivKey(); + signed = await finalizeEvent(unsigned, sk); + } + await withRelays("write", async (relays) => { + for (const relay of relays) { + try { + relay.publish(signed); + } catch (_) { + } + } + }); + return { success: true }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "apikeys.encrypt": + reply(sendResponse, async () => { + try { + const { plainText } = message.payload; + const pubkey = await getPubKey(); + const cipherText = await nip44Encrypt({ pubKey: pubkey, plainText }); + return { success: true, cipherText }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + case "apikeys.decrypt": + reply(sendResponse, async () => { + try { + const { cipherText } = message.payload; + const pubkey = await getPubKey(); + const plainText = await nip44Decrypt({ pubKey: pubkey, cipherText }); + return { success: true, plainText }; + } catch (e) { + return { success: false, error: e.message }; + } + }); + return true; + // --- Encrypted vault backup / restore --- + case "backup.export": + reply(sendResponse, async () => { + const password = message.payload?.password; + if (typeof password !== "string" || password.length < 8) { + return { success: false, error: "A backup password of at least 8 characters is required" }; + } + const data = await storage4.get({ + profiles: [], + profileIndex: 0, + isEncrypted: false, + passwordHash: null, + passwordSalt: null, + apiKeyVault: null, + vaultDocs: null, + nostrAccessWhileLocked: false, + blockCrossOriginFrames: true, + autoLockMinutes: 15, + version: null + }); + const plaintext = JSON.stringify(data); + const encrypted = await encrypt4(plaintext, password); + const version = api.runtime.getManifest?.()?.version || "unknown"; + return { + success: true, + envelope: { + format: "nostrkey-backup", + version: 1, + createdAt: (/* @__PURE__ */ new Date()).toISOString(), + extensionVersion: version, + profileCount: Array.isArray(data.profiles) ? data.profiles.length : 0, + payload: JSON.parse(encrypted) + } + }; + }); + return true; + case "backup.import": + reply(sendResponse, async () => { + try { + const { envelope, password } = message.payload; + if (!envelope || envelope.format !== "nostrkey-backup") { + return { success: false, error: "Not a valid NostrKey backup file" }; + } + if (typeof envelope.version !== "number" || envelope.version > 1) { + return { success: false, error: "Backup version not supported. Update NostrKey and try again." }; + } + const payloadStr = JSON.stringify(envelope.payload); + let plaintext; + try { + plaintext = await decrypt4(payloadStr, password); + } catch (_) { + return { success: false, error: "Wrong password \u2014 could not decrypt backup" }; + } + const data = JSON.parse(plaintext); + await storage4.set(data); + encryptionEnabled = !!data.isEncrypted; + locked = false; + const importSalt = crypto.getRandomValues(new Uint8Array(16)); + sessionCryptoKey = await deriveKey(password, importSalt); + sessionKeySalt = importSalt; + nostrAccessWhileLocked = data.nostrAccessWhileLocked !== false; + blockCrossOriginFrames = data.blockCrossOriginFrames !== false; + if (typeof data.autoLockMinutes === "number") { + autoLockTimeout = data.autoLockMinutes * 60 * 1e3; + } + sessionKeys.clear(); + if (Array.isArray(data.profiles)) { + for (let i = 0; i < data.profiles.length; i++) { + const p = data.profiles[i]; + if (p.type === "bunker" || !p.privKey) continue; + if (isEncryptedBlob(p.privKey)) { + try { + const hex = await decrypt4(p.privKey, password); + sessionKeys.set(i, hex); + } catch (_) { + } + } else { + sessionKeys.set(i, p.privKey); + } + } + } + resetAutoLock(); + const profileCount = Array.isArray(data.profiles) ? data.profiles.length : 0; + return { success: true, profileCount }; + } catch (e) { + return { success: false, error: e.message || "Restore failed" }; + } + }); + return true; + // nostr: protocol URL handler — no key access needed, no permission prompt + case "replaceURL": + reply(sendResponse, async () => { + const { protocol_handler } = await storage4.get(["protocol_handler"]); + if (!protocol_handler) return false; + const { url } = message.payload; + const raw = url.split("nostr:")[1]; + if (!raw) return false; + try { + const decoded = nip_19_exports.decode(raw); + const { type, data } = decoded; + const replacements = { + raw, + hrp: type, + hex: type === "naddr" ? decoded.author || raw : data || raw, + p_or_e: { npub: "p", note: "e", nprofile: "p", nevent: "e", naddr: "a" }[type] || "", + u_or_n: { npub: "u", note: "n", nprofile: "u", nevent: "n", naddr: "n" }[type] || "", + relay0: decoded.relays?.[0] || "", + relay1: decoded.relays?.[1] || "", + relay2: decoded.relays?.[2] || "" + }; + let result = protocol_handler; + for (const [pattern, value] of Object.entries(replacements)) { + result = result.replace(new RegExp(`\\{ *${pattern} *\\}`, "g"), value); + } + return result; + } catch { + return false; + } + }); + return true; + // window.nostr + case "getPubKey": + case "signEvent": + case "nip04.encrypt": + case "nip04.decrypt": + case "nip44.encrypt": + case "nip44.decrypt": + case "getRelays": + case "addRelay": + case "exportProfile": + validations[uuid] = sendResponse; + if (Object.keys(validations).length === 1) { + pendingQueue = { total: 0, processed: 0 }; + } + pendingQueue.total++; + ask(uuid, message); + setTimeout(() => { + if (validations[uuid]) { + deny({ payload: uuid, origKind: message.kind, host: message.host }); + } + prompt.release?.(); + }, 1e4); + return true; + default: + return false; + } + }); + async function forceRelease() { + if (prompt.tabId !== null) { + try { + await api.tabs.get(prompt.tabId); + } catch (error) { + prompt.release?.(); + prompt.tabId = null; + } + } + } + async function generatePrivateKey_() { + const keyPair = await generateKeyPair2(); + return keyPair.privateKey; + } + async function ask(uuid, { kind, host, payload }) { + if (host) { + const now = Date.now(); + const rateEntry = permissionRateMap.get(host) || { count: 0, resetAt: now + 6e4 }; + if (now > rateEntry.resetAt) { + rateEntry.count = 0; + rateEntry.resetAt = now + 6e4; + } + rateEntry.count++; + permissionRateMap.set(host, rateEntry); + if (rateEntry.count > 5) { + log3(`[SECURITY] Rate limited ${host} \u2014 ${rateEntry.count} requests in 60s`); + const sendResponse = validations[uuid]; + delete validations[uuid]; + sendResponse?.({ error: "rate_limited", message: "Too many requests. Please wait a moment." }); + return; + } + } + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + const isBunker = profile?.type === "bunker"; + const needsPrivateKey = kind !== "getPubKey" && kind !== "getRelays" && kind !== "addRelay" && kind !== "exportProfile"; + if (!isBunker && needsPrivateKey) { + const isLocked = await checkLockState(); + if (isLocked) { + if (!(nostrAccessWhileLocked && sessionKeys.has(pi))) { + const isFirstUnlock = sessionKeys.size === 0; + try { + const [activeTab] = await api.tabs.query({ active: true, currentWindow: true }); + if (activeTab?.id) { + api.tabs.sendMessage(activeTab.id, { kind: "showLockedSheet", firstUnlock: isFirstUnlock }).catch(() => { + }); + } + } catch (_) { + } + const sendResponse = validations[uuid]; + delete validations[uuid]; + sendResponse?.({ error: "locked", message: "Extension is locked. Please unlock with your master password." }); + return; + } + } + } + if (isRateLimited(host)) { + const sendResponse = validations[uuid]; + delete validations[uuid]; + sendResponse?.({ error: "rate_limited", message: "Too many requests. Please wait." }); + log3(`Rate limited: ${host}`); + return; + } + await forceRelease(); + prompt.release = await prompt.mutex.acquire(); + pendingQueue.processed++; + const queuePosition = pendingQueue.processed; + const queueTotal = pendingQueue.total; + let mKind = kind === "signEvent" ? `signEvent:${payload.kind}` : kind; + let permission = await getPermission(host, mKind); + if (permission === "allow") { + complete({ + payload: uuid, + origKind: kind, + event: payload, + remember: false, + host + }); + prompt.release(); + return; + } + if (permission === "deny") { + deny({ payload: uuid, origKind: kind, host }); + prompt.release(); + return; + } + try { + const [activeTab] = await api.tabs.query({ active: true, currentWindow: true }); + if (activeTab?.id) { + const result = await api.tabs.sendMessage(activeTab.id, { + kind: "showPermissionSheet", + host, + permissionKind: kind, + queuePosition, + queueTotal + }); + if (result) { + if (result.allowed) { + complete({ + payload: uuid, + origKind: kind, + event: payload, + remember: result.remember, + host + }); + } else { + deny({ + payload: uuid, + origKind: kind, + event: payload, + remember: result.remember, + host + }); + } + prompt.release(); + return; + } + } + } catch (e) { + log3("Bottom sheet unavailable, falling back to tab:", e.message); + } + let qs = new URLSearchParams({ + uuid, + kind, + host, + payload: JSON.stringify(payload || false), + queuePosition, + queueTotal + }); + let tab = await api.tabs.getCurrent(); + let p = await api.tabs.create({ + url: api.runtime.getURL(`permission/permission.html?${qs.toString()}`), + openerTabId: tab?.id + }); + prompt.tabId = p.id; + return true; + } + function complete({ payload, origKind, event, remember, host }) { + const sendResponse = validations[payload]; + delete validations[payload]; + if (Object.keys(validations).length === 0) { + pendingQueue = { total: 0, processed: 0 }; + } + if (remember) { + let mKind = origKind === "signEvent" ? `signEvent:${event.kind}` : origKind; + setPermission(host, mKind, "allow"); + } + if (sendResponse) { + const onError = (e) => { + log3(`Error in ${origKind}: ${e.message}`); + sendResponse({ error: "bunker_error", message: e.message }); + }; + switch (origKind) { + case "getPubKey": + getPubKey().then((pk) => sendResponse(pk)).catch(onError); + break; + case "signEvent": + signEvent_(event, host).then((e) => sendResponse(e)).catch(onError); + break; + case "nip04.encrypt": + nip04Encrypt(event).then((e) => sendResponse(e)).catch(onError); + break; + case "nip04.decrypt": + nip04Decrypt(event).then((e) => sendResponse(e)).catch(onError); + break; + case "nip44.encrypt": + nip44Encrypt(event).then((e) => sendResponse(e)).catch(onError); + break; + case "nip44.decrypt": + nip44Decrypt(event).then((e) => sendResponse(e)).catch(onError); + break; + case "getRelays": + getRelays().then((e) => sendResponse(e)).catch(onError); + break; + case "addRelay": + addRelay(event.url).then((e) => sendResponse(e)).catch(onError); + break; + case "exportProfile": + exportProfileData().then((e) => sendResponse(e)).catch(onError); + break; + } + } + } + function deny({ origKind, host, payload, remember, event }) { + const sendResponse = validations[payload]; + delete validations[payload]; + if (Object.keys(validations).length === 0) { + pendingQueue = { total: 0, processed: 0 }; + } + if (remember) { + let mKind = origKind === "signEvent" ? `signEvent:${event.kind}` : origKind; + setPermission(host, mKind, "deny"); + } + sendResponse?.(void 0); + return false; + } + async function cachePubKeysForAllProfiles() { + const profiles = await getProfiles(); + let updated = false; + for (let i = 0; i < profiles.length; i++) { + const profile = profiles[i]; + if (profile.type === "bunker") continue; + if (profile.pubKey) continue; + if (!profile.privKey || isEncryptedBlob(profile.privKey)) continue; + try { + const pubKey = getPublicKeySync(profile.privKey); + profiles[i].pubKey = pubKey; + updated = true; + } catch (e) { + console.error(`Failed to cache pubKey for profile ${i}:`, e); + } + } + if (updated) { + await storage4.set({ profiles }); + } + } + async function savePrivateKey([index, privKey]) { + const profile = await getProfile(index); + if (profile?.type === "bunker") { + throw new Error("Cannot set private key on a bunker profile"); + } + if (typeof privKey !== "string" || privKey.length === 0) { + throw new Error("Invalid private key: must be a non-empty string"); + } + let hexKey; + if (privKey.startsWith("nsec")) { + try { + hexKey = nip_19_exports.decode(privKey).data; + } catch (e) { + throw new Error("Invalid nsec key"); + } + } else { + hexKey = privKey; + } + if (!/^[0-9a-f]{64}$/i.test(hexKey)) { + throw new Error("Invalid private key: must be 64 hex characters or valid nsec"); + } + let profiles = await get("profiles"); + if (!profiles || index < 0 || index >= profiles.length) { + throw new Error("Invalid profile index"); + } + const pubKey = getPublicKeySync(hexKey); + profiles[index].pubKey = pubKey; + const encrypted = await isEncrypted(); + if (encrypted && sessionCryptoKey) { + profiles[index].privKey = await encryptWithKey(hexKey, sessionCryptoKey, sessionKeySalt); + sessionKeys.set(index, hexKey); + } else { + profiles[index].privKey = hexKey; + } + await storage4.set({ profiles }); + return true; + } + async function getNsec(index) { + let profile = await getProfile(index); + if (profile.type === "bunker") return null; + let hexKey = await getPlaintextPrivKey(index, profile); + let nsec = nip_19_exports.nsecEncode(hexKey); + return nsec; + } + async function getNpub(index) { + let profile = await getProfile(index); + if (!profile) return null; + if (profile.type === "bunker") { + if (profile.remotePubkey) return nip_19_exports.npubEncode(profile.remotePubkey); + return null; + } + if (profile.pubKey) { + return nip_19_exports.npubEncode(profile.pubKey); + } + try { + let hexKey = await getPlaintextPrivKey(index, profile); + if (!hexKey || typeof hexKey !== "string" || hexKey.length !== 64) { + return null; + } + let pubKey = getPublicKeySync(hexKey); + let npub = nip_19_exports.npubEncode(pubKey); + return npub; + } catch (e) { + console.error("getNpub error:", e); + return null; + } + } + async function getPlaintextPrivKey(index, profile) { + if (isEncryptedBlob(profile.privKey)) { + if (sessionKeys.has(index)) { + return sessionKeys.get(index); + } + throw new Error("Extension is locked \u2014 cannot access private key"); + } + return profile.privKey; + } + async function getPrivKey() { + let index = await getProfileIndex(); + let profile = await currentProfile(); + let hexKey = await getPlaintextPrivKey(index, profile); + return hexToBytes2(hexKey); + } + async function getPubKey() { + let pi = await getProfileIndex(); + let profile = await getProfile(pi); + if (profile.type === "bunker") { + if (profile.remotePubkey) return profile.remotePubkey; + const session = await getOrCreateSession(pi); + const pubkey = await session.getPublicKey(); + const profiles = await get("profiles"); + profiles[pi].remotePubkey = pubkey; + await storage4.set({ profiles }); + return pubkey; + } + if (profile.pubKey) return profile.pubKey; + let privKey = await getPrivKey(); + let pubKey = getPublicKeySync(bytesToHex3(privKey)); + return pubKey; + } + async function currentProfile() { + let index = await getProfileIndex(); + let profiles = await get("profiles"); + return profiles[index]; + } + async function signEvent_(event, host) { + event = JSON.parse(JSON.stringify(event)); + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + event = await session.signEvent(event); + } else { + let sk = await getPrivKey(); + event = await finalizeEvent(event, sk); + } + saveEvent({ + event, + metadata: { host, signed_at: Math.round(Date.now() / 1e3) } + }); + return event; + } + async function nip04Encrypt({ pubKey, plainText }) { + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + return session.nip04Encrypt(pubKey, plainText); + } + let privKey = await getPrivKey(); + return nip_04_exports.encryptMessage(plainText, bytesToHex3(privKey), pubKey); + } + async function nip04Decrypt({ pubKey, cipherText }) { + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + return session.nip04Decrypt(pubKey, cipherText); + } + let privKey = await getPrivKey(); + return nip_04_exports.decryptMessage(cipherText, bytesToHex3(privKey), pubKey); + } + async function nip44Encrypt({ pubKey, plainText }) { + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + return session.nip44Encrypt(pubKey, plainText); + } + let privKey = await getPrivKey(); + let conversationKey = nip_44_exports.v2.utils.getConversationKey(privKey, pubKey); + return nip_44_exports.v2.encrypt(plainText, conversationKey); + } + async function nip44Decrypt({ pubKey, cipherText }) { + const pi = await getProfileIndex(); + const profile = await getProfile(pi); + if (profile.type === "bunker") { + const session = await getOrCreateSession(pi); + return session.nip44Decrypt(pubKey, cipherText); + } + let privKey = await getPrivKey(); + let conversationKey = nip_44_exports.v2.utils.getConversationKey(privKey, pubKey); + return nip_44_exports.v2.decrypt(cipherText, conversationKey); + } + async function getRelays() { + let profile = await currentProfile(); + let relays = profile.relays; + let relayObj = {}; + relays.forEach((relay) => { + let { url, read, write } = relay; + relayObj[url] = { read, write }; + }); + return relayObj; + } + async function addRelay(url) { + let parsed; + try { + parsed = new URL(url); + } catch { + throw new Error("Invalid URL"); + } + if (parsed.protocol !== "wss:") { + throw new Error("Must be a wss:// URL"); + } + let profiles = await getProfiles(); + let pi = await getProfileIndex(); + let profile = profiles[pi]; + if (!profile.relays) profile.relays = []; + if (profile.relays.some((r) => r.url === parsed.href)) { + return { success: true, message: "Relay already exists" }; + } + profile.relays.push({ url: parsed.href, read: true, write: true }); + profile.updatedAt = Math.floor(Date.now() / 1e3); + await storage4.set({ profiles }); + return { success: true, message: "Relay added" }; + } + async function exportProfileData() { + let pi = await getProfileIndex(); + let profile = await getProfile(pi); + if (!profile) throw new Error("No active profile"); + if (profile.type === "bunker") { + return { + name: profile.name, + type: "bunker", + bunkerUrl: profile.bunkerUrl || "", + exportedAt: (/* @__PURE__ */ new Date()).toISOString(), + source: "NostrKey" + }; + } + let npub = ""; + if (profile.pubKey) { + npub = nip_19_exports.npubEncode(profile.pubKey); + } + let nsec = ""; + try { + nsec = await getNsec(pi); + } catch { + throw new Error("Cannot export while locked. Please unlock first."); + } + return { + name: profile.name, + npub, + nsec, + relays: (profile.relays || []).map((r) => r.url), + exportedAt: (/* @__PURE__ */ new Date()).toISOString(), + source: "NostrKey" + }; + } + async function withRelays(mode, callback) { + const profile = await currentProfile(); + const relayList = profile.relays || []; + const urls = relayList.filter((r) => mode === "read" ? r.read : r.write).map((r) => r.url); + if (urls.length === 0) { + throw new Error("No relays configured"); + } + const connections = []; + const connectPromises = urls.map(async (url) => { + const relay = new RelayConnection(url); + try { + await relay.connect(); + connections.push(relay); + } catch (_) { + } + }); + await Promise.allSettled(connectPromises); + if (connections.length === 0) { + throw new Error("Failed to connect to any relay"); + } + try { + await callback(connections); + } finally { + for (const relay of connections) { + relay.close(); + } + } + } +})(); /*! Bundled license information: ieee754/index.js: @@ -2080,3 +12766,4 @@ buffer/index.js: @scure/bip39/index.js: (*! scure-bip39 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) *) */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NoaW1zL3Byb2Nlc3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3F1aWNrLWZvcm1hdC11bmVzY2FwZWQvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Bpbm8vYnJvd3Nlci5qcyIsICJub2RlLXN0dWI6Y3J5cHRvIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9iZWNoMzIvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCAiLi4vLi4vc3JjL2JhY2tncm91bmQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvdHlwZXMvYmFzZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy90eXBlcy9wcm90b2NvbC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL2Rpc3QvZXNtL3R5cGVzL21lc3NhZ2VzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9ub3N0ci1jcnlwdG8tdXRpbHMvc3JjL3R5cGVzL2d1YXJkcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy90eXBlcy9uaXA0Ni50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy9jcnlwdG8udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2JsZS9jdXJ2ZXMvc3JjL3NlY3AyNTZrMS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9zcmMvc2hhMi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9zcmMvX21kLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL3NyYy91dGlscy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2N1cnZlcy9zcmMvYWJzdHJhY3QvY3VydmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2JsZS9jdXJ2ZXMvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL3NyYy9hYnN0cmFjdC9tb2R1bGFyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL3NyYy9hYnN0cmFjdC93ZWllcnN0cmFzcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9zcmMvaG1hYy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy91dGlscy9sb2dnZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvZW5jb2RpbmcvYmFzZTY0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9ub3N0ci1jcnlwdG8tdXRpbHMvc3JjL3ZhbGlkYXRpb24vaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvZXZlbnQvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvZXZlbnQvY3JlYXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvZXZlbnQvc2lnbmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy9uaXBzL25pcC0wNC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy9uaXBzL25pcC0wMS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy9uaXBzL25pcC0xOS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy9uaXBzL25pcC0yNi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbm9zdHItY3J5cHRvLXV0aWxzL3NyYy9uaXBzL25pcC00NC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2NpcGhlcnMvc3JjL2NoYWNoYS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2NpcGhlcnMvc3JjL19hcngudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2JsZS9jaXBoZXJzL3NyYy91dGlscy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2NpcGhlcnMvc3JjL19wb2x5MTMwNS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9zcmMvaGtkZi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHNjdXJlL2Jhc2UvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvbmlwcy9uaXAtNDYudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vc3RyLWNyeXB0by11dGlscy9zcmMvbmlwcy9uaXAtNDkudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bub2JsZS9oYXNoZXMvc3JjL3NjcnlwdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9zcmMvcGJrZGYyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9ub3N0ci1jcnlwdG8tdXRpbHMvc3JjL3V0aWxzL2VuY29kaW5nLnRzIiwgIi4uLy4uL3NyYy91dGlsaXRpZXMvc2VlZHBocmFzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHNjdXJlL2JpcDM5L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9Ac2N1cmUvYmlwMzkvd29yZGxpc3RzL2VuZ2xpc2guanMiLCAiLi4vLi4vc3JjL3V0aWxpdGllcy9rZXlzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9hc3luYy1tdXRleC9pbmRleC5tanMiLCAiLi4vLi4vc3JjL3V0aWxpdGllcy91dGlscy5qcyIsICIuLi8uLi9zcmMvdXRpbGl0aWVzL2Jyb3dzZXItcG9seWZpbGwuanMiLCAiLi4vLi4vc3JjL3V0aWxpdGllcy9jcnlwdG8uanMiLCAiLi4vLi4vc3JjL3V0aWxpdGllcy9kYi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaWRiL2J1aWxkL2luZGV4LmpzIiwgIi4uLy4uL3NyYy91dGlsaXRpZXMvc3luYy1tYW5hZ2VyLmpzIiwgIi4uLy4uL3NyYy91dGlsaXRpZXMvbmlwNDYuanMiLCAiLi4vLi4vc3JjL3V0aWxpdGllcy9idW5rZXItc2VydmVyLmpzIiwgIi4uLy4uL3NyYy91dGlsaXRpZXMvbmlwNzguanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogTWluaW1hbCBwcm9jZXNzIHNoaW0gZm9yIGJyb3dzZXIgY29udGV4dC5cbiAqIE5vZGUuanMgbGlicmFyaWVzIGJ1bmRsZWQgdmlhIG5vc3RyLWNyeXB0by11dGlscyAoY3J5cHRvLWJyb3dzZXJpZnksXG4gKiByZWFkYWJsZS1zdHJlYW0sIGV0Yy4pIHJlZmVyZW5jZSB0aGUgZ2xvYmFsIGBwcm9jZXNzYCBvYmplY3QuXG4gKiBUaGlzIHByb3ZpZGVzIGp1c3QgZW5vdWdoIGZvciB0aGVtIHRvIHdvcmsgaW4gYSBicm93c2VyIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IHZhciBwcm9jZXNzID0ge1xuICAgIGVudjogeyBOT0RFX0VOVjogJ3Byb2R1Y3Rpb24nLCBMT0dfTEVWRUw6ICd3YXJuJyB9LFxuICAgIGJyb3dzZXI6IHRydWUsXG4gICAgdmVyc2lvbjogJycsXG4gICAgc3Rkb3V0OiBudWxsLFxuICAgIHN0ZGVycjogbnVsbCxcbiAgICBuZXh0VGljazogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IGZuLmFwcGx5KG51bGwsIGFyZ3MpOyB9KTtcbiAgICB9LFxufTtcbiIsICIndXNlIHN0cmljdCdcbmZ1bmN0aW9uIHRyeVN0cmluZ2lmeSAobykge1xuICB0cnkgeyByZXR1cm4gSlNPTi5zdHJpbmdpZnkobykgfSBjYXRjaChlKSB7IHJldHVybiAnXCJbQ2lyY3VsYXJdXCInIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JtYXRcblxuZnVuY3Rpb24gZm9ybWF0KGYsIGFyZ3MsIG9wdHMpIHtcbiAgdmFyIHNzID0gKG9wdHMgJiYgb3B0cy5zdHJpbmdpZnkpIHx8IHRyeVN0cmluZ2lmeVxuICB2YXIgb2Zmc2V0ID0gMVxuICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnICYmIGYgIT09IG51bGwpIHtcbiAgICB2YXIgbGVuID0gYXJncy5sZW5ndGggKyBvZmZzZXRcbiAgICBpZiAobGVuID09PSAxKSByZXR1cm4gZlxuICAgIHZhciBvYmplY3RzID0gbmV3IEFycmF5KGxlbilcbiAgICBvYmplY3RzWzBdID0gc3MoZilcbiAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7XG4gICAgICBvYmplY3RzW2luZGV4XSA9IHNzKGFyZ3NbaW5kZXhdKVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJylcbiAgfVxuICBpZiAodHlwZW9mIGYgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZcbiAgfVxuICB2YXIgYXJnTGVuID0gYXJncy5sZW5ndGhcbiAgaWYgKGFyZ0xlbiA9PT0gMCkgcmV0dXJuIGZcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBhID0gMSAtIG9mZnNldFxuICB2YXIgbGFzdFBvcyA9IC0xXG4gIHZhciBmbGVuID0gKGYgJiYgZi5sZW5ndGgpIHx8IDBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGVuOykge1xuICAgIGlmIChmLmNoYXJDb2RlQXQoaSkgPT09IDM3ICYmIGkgKyAxIDwgZmxlbikge1xuICAgICAgbGFzdFBvcyA9IGxhc3RQb3MgPiAtMSA/IGxhc3RQb3MgOiAwXG4gICAgICBzd2l0Y2ggKGYuY2hhckNvZGVBdChpICsgMSkpIHtcbiAgICAgICAgY2FzZSAxMDA6IC8vICdkJ1xuICAgICAgICBjYXNlIDEwMjogLy8gJ2YnXG4gICAgICAgICAgaWYgKGEgPj0gYXJnTGVuKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBpZiAoYXJnc1thXSA9PSBudWxsKSAgYnJlYWtcbiAgICAgICAgICBpZiAobGFzdFBvcyA8IGkpXG4gICAgICAgICAgICBzdHIgKz0gZi5zbGljZShsYXN0UG9zLCBpKVxuICAgICAgICAgIHN0ciArPSBOdW1iZXIoYXJnc1thXSlcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDJcbiAgICAgICAgICBpKytcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDEwNTogLy8gJ2knXG4gICAgICAgICAgaWYgKGEgPj0gYXJnTGVuKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBpZiAoYXJnc1thXSA9PSBudWxsKSAgYnJlYWtcbiAgICAgICAgICBpZiAobGFzdFBvcyA8IGkpXG4gICAgICAgICAgICBzdHIgKz0gZi5zbGljZShsYXN0UG9zLCBpKVxuICAgICAgICAgIHN0ciArPSBNYXRoLmZsb29yKE51bWJlcihhcmdzW2FdKSlcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDJcbiAgICAgICAgICBpKytcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDc5OiAvLyAnTydcbiAgICAgICAgY2FzZSAxMTE6IC8vICdvJ1xuICAgICAgICBjYXNlIDEwNjogLy8gJ2onXG4gICAgICAgICAgaWYgKGEgPj0gYXJnTGVuKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBpZiAoYXJnc1thXSA9PT0gdW5kZWZpbmVkKSBicmVha1xuICAgICAgICAgIGlmIChsYXN0UG9zIDwgaSlcbiAgICAgICAgICAgIHN0ciArPSBmLnNsaWNlKGxhc3RQb3MsIGkpXG4gICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgYXJnc1thXVxuICAgICAgICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3RyICs9ICdcXCcnICsgYXJnc1thXSArICdcXCcnXG4gICAgICAgICAgICBsYXN0UG9zID0gaSArIDJcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0ciArPSBhcmdzW2FdLm5hbWUgfHwgJzxhbm9ueW1vdXM+J1xuICAgICAgICAgICAgbGFzdFBvcyA9IGkgKyAyXG4gICAgICAgICAgICBpKytcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ciArPSBzcyhhcmdzW2FdKVxuICAgICAgICAgIGxhc3RQb3MgPSBpICsgMlxuICAgICAgICAgIGkrK1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMTE1OiAvLyAncydcbiAgICAgICAgICBpZiAoYSA+PSBhcmdMZW4pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGlmIChsYXN0UG9zIDwgaSlcbiAgICAgICAgICAgIHN0ciArPSBmLnNsaWNlKGxhc3RQb3MsIGkpXG4gICAgICAgICAgc3RyICs9IFN0cmluZyhhcmdzW2FdKVxuICAgICAgICAgIGxhc3RQb3MgPSBpICsgMlxuICAgICAgICAgIGkrK1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzc6IC8vICclJ1xuICAgICAgICAgIGlmIChsYXN0UG9zIDwgaSlcbiAgICAgICAgICAgIHN0ciArPSBmLnNsaWNlKGxhc3RQb3MsIGkpXG4gICAgICAgICAgc3RyICs9ICclJ1xuICAgICAgICAgIGxhc3RQb3MgPSBpICsgMlxuICAgICAgICAgIGkrK1xuICAgICAgICAgIGEtLVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICArK2FcbiAgICB9XG4gICAgKytpXG4gIH1cbiAgaWYgKGxhc3RQb3MgPT09IC0xKVxuICAgIHJldHVybiBmXG4gIGVsc2UgaWYgKGxhc3RQb3MgPCBmbGVuKSB7XG4gICAgc3RyICs9IGYuc2xpY2UobGFzdFBvcylcbiAgfVxuXG4gIHJldHVybiBzdHJcbn1cbiIsICIndXNlIHN0cmljdCdcblxuY29uc3QgZm9ybWF0ID0gcmVxdWlyZSgncXVpY2stZm9ybWF0LXVuZXNjYXBlZCcpXG5cbm1vZHVsZS5leHBvcnRzID0gcGlub1xuXG5jb25zdCBfY29uc29sZSA9IHBmR2xvYmFsVGhpc09yRmFsbGJhY2soKS5jb25zb2xlIHx8IHt9XG5jb25zdCBzdGRTZXJpYWxpemVycyA9IHtcbiAgbWFwSHR0cFJlcXVlc3Q6IG1vY2ssXG4gIG1hcEh0dHBSZXNwb25zZTogbW9jayxcbiAgd3JhcFJlcXVlc3RTZXJpYWxpemVyOiBwYXNzdGhyb3VnaCxcbiAgd3JhcFJlc3BvbnNlU2VyaWFsaXplcjogcGFzc3Rocm91Z2gsXG4gIHdyYXBFcnJvclNlcmlhbGl6ZXI6IHBhc3N0aHJvdWdoLFxuICByZXE6IG1vY2ssXG4gIHJlczogbW9jayxcbiAgZXJyOiBhc0VyclZhbHVlLFxuICBlcnJXaXRoQ2F1c2U6IGFzRXJyVmFsdWVcbn1cbmZ1bmN0aW9uIGxldmVsVG9WYWx1ZSAobGV2ZWwsIGxvZ2dlcikge1xuICByZXR1cm4gbGV2ZWwgPT09ICdzaWxlbnQnXG4gICAgPyBJbmZpbml0eVxuICAgIDogbG9nZ2VyLmxldmVscy52YWx1ZXNbbGV2ZWxdXG59XG5jb25zdCBiYXNlTG9nRnVuY3Rpb25TeW1ib2wgPSBTeW1ib2woJ3Bpbm8ubG9nRnVuY3MnKVxuY29uc3QgaGllcmFyY2h5U3ltYm9sID0gU3ltYm9sKCdwaW5vLmhpZXJhcmNoeScpXG5cbmNvbnN0IGxvZ0ZhbGxiYWNrTWFwID0ge1xuICBlcnJvcjogJ2xvZycsXG4gIGZhdGFsOiAnZXJyb3InLFxuICB3YXJuOiAnZXJyb3InLFxuICBpbmZvOiAnbG9nJyxcbiAgZGVidWc6ICdsb2cnLFxuICB0cmFjZTogJ2xvZydcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRMb2dnZXIgKHBhcmVudExvZ2dlciwgY2hpbGRMb2dnZXIpIHtcbiAgY29uc3QgbmV3RW50cnkgPSB7XG4gICAgbG9nZ2VyOiBjaGlsZExvZ2dlcixcbiAgICBwYXJlbnQ6IHBhcmVudExvZ2dlcltoaWVyYXJjaHlTeW1ib2xdXG4gIH1cbiAgY2hpbGRMb2dnZXJbaGllcmFyY2h5U3ltYm9sXSA9IG5ld0VudHJ5XG59XG5cbmZ1bmN0aW9uIHNldHVwQmFzZUxvZ0Z1bmN0aW9ucyAobG9nZ2VyLCBsZXZlbHMsIHByb3RvKSB7XG4gIGNvbnN0IGxvZ0Z1bmN0aW9ucyA9IHt9XG4gIGxldmVscy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICBsb2dGdW5jdGlvbnNbbGV2ZWxdID0gcHJvdG9bbGV2ZWxdID8gcHJvdG9bbGV2ZWxdIDogKF9jb25zb2xlW2xldmVsXSB8fCBfY29uc29sZVtsb2dGYWxsYmFja01hcFtsZXZlbF0gfHwgJ2xvZyddIHx8IG5vb3ApXG4gIH0pXG4gIGxvZ2dlcltiYXNlTG9nRnVuY3Rpb25TeW1ib2xdID0gbG9nRnVuY3Rpb25zXG59XG5cbmZ1bmN0aW9uIHNob3VsZFNlcmlhbGl6ZSAoc2VyaWFsaXplLCBzZXJpYWxpemVycykge1xuICBpZiAoQXJyYXkuaXNBcnJheShzZXJpYWxpemUpKSB7XG4gICAgY29uc3QgaGFzVG9GaWx0ZXIgPSBzZXJpYWxpemUuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gayAhPT0gJyFzdGRTZXJpYWxpemVycy5lcnInXG4gICAgfSlcbiAgICByZXR1cm4gaGFzVG9GaWx0ZXJcbiAgfSBlbHNlIGlmIChzZXJpYWxpemUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2VyaWFsaXplcnMpXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gcGlubyAob3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICBvcHRzLmJyb3dzZXIgPSBvcHRzLmJyb3dzZXIgfHwge31cblxuICBjb25zdCB0cmFuc21pdCA9IG9wdHMuYnJvd3Nlci50cmFuc21pdFxuICBpZiAodHJhbnNtaXQgJiYgdHlwZW9mIHRyYW5zbWl0LnNlbmQgIT09ICdmdW5jdGlvbicpIHsgdGhyb3cgRXJyb3IoJ3Bpbm86IHRyYW5zbWl0IG9wdGlvbiBtdXN0IGhhdmUgYSBzZW5kIGZ1bmN0aW9uJykgfVxuXG4gIGNvbnN0IHByb3RvID0gb3B0cy5icm93c2VyLndyaXRlIHx8IF9jb25zb2xlXG4gIGlmIChvcHRzLmJyb3dzZXIud3JpdGUpIG9wdHMuYnJvd3Nlci5hc09iamVjdCA9IHRydWVcbiAgY29uc3Qgc2VyaWFsaXplcnMgPSBvcHRzLnNlcmlhbGl6ZXJzIHx8IHt9XG4gIGNvbnN0IHNlcmlhbGl6ZSA9IHNob3VsZFNlcmlhbGl6ZShvcHRzLmJyb3dzZXIuc2VyaWFsaXplLCBzZXJpYWxpemVycylcbiAgbGV0IHN0ZEVyclNlcmlhbGl6ZSA9IG9wdHMuYnJvd3Nlci5zZXJpYWxpemVcblxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShvcHRzLmJyb3dzZXIuc2VyaWFsaXplKSAmJlxuICAgIG9wdHMuYnJvd3Nlci5zZXJpYWxpemUuaW5kZXhPZignIXN0ZFNlcmlhbGl6ZXJzLmVycicpID4gLTFcbiAgKSBzdGRFcnJTZXJpYWxpemUgPSBmYWxzZVxuXG4gIGNvbnN0IGN1c3RvbUxldmVscyA9IE9iamVjdC5rZXlzKG9wdHMuY3VzdG9tTGV2ZWxzIHx8IHt9KVxuICBjb25zdCBsZXZlbHMgPSBbJ2Vycm9yJywgJ2ZhdGFsJywgJ3dhcm4nLCAnaW5mbycsICdkZWJ1ZycsICd0cmFjZSddLmNvbmNhdChjdXN0b21MZXZlbHMpXG5cbiAgaWYgKHR5cGVvZiBwcm90byA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxldmVscy5mb3JFYWNoKGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgcHJvdG9bbGV2ZWxdID0gcHJvdG9cbiAgICB9KVxuICB9XG4gIGlmIChvcHRzLmVuYWJsZWQgPT09IGZhbHNlIHx8IG9wdHMuYnJvd3Nlci5kaXNhYmxlZCkgb3B0cy5sZXZlbCA9ICdzaWxlbnQnXG4gIGNvbnN0IGxldmVsID0gb3B0cy5sZXZlbCB8fCAnaW5mbydcbiAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmNyZWF0ZShwcm90bylcbiAgaWYgKCFsb2dnZXIubG9nKSBsb2dnZXIubG9nID0gbm9vcFxuXG4gIHNldHVwQmFzZUxvZ0Z1bmN0aW9ucyhsb2dnZXIsIGxldmVscywgcHJvdG8pXG4gIC8vIHNldHVwIHJvb3QgaGllcmFyY2h5IGVudHJ5XG4gIGFwcGVuZENoaWxkTG9nZ2VyKHt9LCBsb2dnZXIpXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxvZ2dlciwgJ2xldmVsVmFsJywge1xuICAgIGdldDogZ2V0TGV2ZWxWYWxcbiAgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxvZ2dlciwgJ2xldmVsJywge1xuICAgIGdldDogZ2V0TGV2ZWwsXG4gICAgc2V0OiBzZXRMZXZlbFxuICB9KVxuXG4gIGNvbnN0IHNldE9wdHMgPSB7XG4gICAgdHJhbnNtaXQsXG4gICAgc2VyaWFsaXplLFxuICAgIGFzT2JqZWN0OiBvcHRzLmJyb3dzZXIuYXNPYmplY3QsXG4gICAgYXNPYmplY3RCaW5kaW5nc09ubHk6IG9wdHMuYnJvd3Nlci5hc09iamVjdEJpbmRpbmdzT25seSxcbiAgICBmb3JtYXR0ZXJzOiBvcHRzLmJyb3dzZXIuZm9ybWF0dGVycyxcbiAgICByZXBvcnRDYWxsZXI6IG9wdHMuYnJvd3Nlci5yZXBvcnRDYWxsZXIsXG4gICAgbGV2ZWxzLFxuICAgIHRpbWVzdGFtcDogZ2V0VGltZUZ1bmN0aW9uKG9wdHMpLFxuICAgIG1lc3NhZ2VLZXk6IG9wdHMubWVzc2FnZUtleSB8fCAnbXNnJyxcbiAgICBvbkNoaWxkOiBvcHRzLm9uQ2hpbGQgfHwgbm9vcFxuICB9XG4gIGxvZ2dlci5sZXZlbHMgPSBnZXRMZXZlbHMob3B0cylcbiAgbG9nZ2VyLmxldmVsID0gbGV2ZWxcblxuICBsb2dnZXIuaXNMZXZlbEVuYWJsZWQgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICBpZiAoIXRoaXMubGV2ZWxzLnZhbHVlc1tsZXZlbF0pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxldmVscy52YWx1ZXNbbGV2ZWxdID49IHRoaXMubGV2ZWxzLnZhbHVlc1t0aGlzLmxldmVsXVxuICB9XG4gIGxvZ2dlci5zZXRNYXhMaXN0ZW5lcnMgPSBsb2dnZXIuZ2V0TWF4TGlzdGVuZXJzID1cbiAgbG9nZ2VyLmVtaXQgPSBsb2dnZXIuYWRkTGlzdGVuZXIgPSBsb2dnZXIub24gPVxuICBsb2dnZXIucHJlcGVuZExpc3RlbmVyID0gbG9nZ2VyLm9uY2UgPVxuICBsb2dnZXIucHJlcGVuZE9uY2VMaXN0ZW5lciA9IGxvZ2dlci5yZW1vdmVMaXN0ZW5lciA9XG4gIGxvZ2dlci5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBsb2dnZXIubGlzdGVuZXJzID1cbiAgbG9nZ2VyLmxpc3RlbmVyQ291bnQgPSBsb2dnZXIuZXZlbnROYW1lcyA9XG4gIGxvZ2dlci53cml0ZSA9IGxvZ2dlci5mbHVzaCA9IG5vb3BcbiAgbG9nZ2VyLnNlcmlhbGl6ZXJzID0gc2VyaWFsaXplcnNcbiAgbG9nZ2VyLl9zZXJpYWxpemUgPSBzZXJpYWxpemVcbiAgbG9nZ2VyLl9zdGRFcnJTZXJpYWxpemUgPSBzdGRFcnJTZXJpYWxpemVcbiAgbG9nZ2VyLmNoaWxkID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHsgcmV0dXJuIGNoaWxkLmNhbGwodGhpcywgc2V0T3B0cywgLi4uYXJncykgfVxuXG4gIGlmICh0cmFuc21pdCkgbG9nZ2VyLl9sb2dFdmVudCA9IGNyZWF0ZUxvZ0V2ZW50U2hhcGUoKVxuXG4gIGZ1bmN0aW9uIGdldExldmVsVmFsICgpIHtcbiAgICByZXR1cm4gbGV2ZWxUb1ZhbHVlKHRoaXMubGV2ZWwsIHRoaXMpXG4gIH1cblxuICBmdW5jdGlvbiBnZXRMZXZlbCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsXG4gIH1cbiAgZnVuY3Rpb24gc2V0TGV2ZWwgKGxldmVsKSB7XG4gICAgaWYgKGxldmVsICE9PSAnc2lsZW50JyAmJiAhdGhpcy5sZXZlbHMudmFsdWVzW2xldmVsXSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3Vua25vd24gbGV2ZWwgJyArIGxldmVsKVxuICAgIH1cbiAgICB0aGlzLl9sZXZlbCA9IGxldmVsXG5cbiAgICBzZXQodGhpcywgc2V0T3B0cywgbG9nZ2VyLCAnZXJyb3InKSAvLyA8LS0gbXVzdCBzdGF5IGZpcnN0XG4gICAgc2V0KHRoaXMsIHNldE9wdHMsIGxvZ2dlciwgJ2ZhdGFsJylcbiAgICBzZXQodGhpcywgc2V0T3B0cywgbG9nZ2VyLCAnd2FybicpXG4gICAgc2V0KHRoaXMsIHNldE9wdHMsIGxvZ2dlciwgJ2luZm8nKVxuICAgIHNldCh0aGlzLCBzZXRPcHRzLCBsb2dnZXIsICdkZWJ1ZycpXG4gICAgc2V0KHRoaXMsIHNldE9wdHMsIGxvZ2dlciwgJ3RyYWNlJylcblxuICAgIGN1c3RvbUxldmVscy5mb3JFYWNoKChsZXZlbCkgPT4ge1xuICAgICAgc2V0KHRoaXMsIHNldE9wdHMsIGxvZ2dlciwgbGV2ZWwpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNoaWxkIChzZXRPcHRzLCBiaW5kaW5ncywgY2hpbGRPcHRpb25zKSB7XG4gICAgaWYgKCFiaW5kaW5ncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJpbmRpbmdzIGZvciBjaGlsZCBQaW5vJylcbiAgICB9XG4gICAgY2hpbGRPcHRpb25zID0gY2hpbGRPcHRpb25zIHx8IHt9XG4gICAgaWYgKHNlcmlhbGl6ZSAmJiBiaW5kaW5ncy5zZXJpYWxpemVycykge1xuICAgICAgY2hpbGRPcHRpb25zLnNlcmlhbGl6ZXJzID0gYmluZGluZ3Muc2VyaWFsaXplcnNcbiAgICB9XG4gICAgY29uc3QgY2hpbGRPcHRpb25zU2VyaWFsaXplcnMgPSBjaGlsZE9wdGlvbnMuc2VyaWFsaXplcnNcbiAgICBpZiAoc2VyaWFsaXplICYmIGNoaWxkT3B0aW9uc1NlcmlhbGl6ZXJzKSB7XG4gICAgICB2YXIgY2hpbGRTZXJpYWxpemVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNlcmlhbGl6ZXJzLCBjaGlsZE9wdGlvbnNTZXJpYWxpemVycylcbiAgICAgIHZhciBjaGlsZFNlcmlhbGl6ZSA9IG9wdHMuYnJvd3Nlci5zZXJpYWxpemUgPT09IHRydWVcbiAgICAgICAgPyBPYmplY3Qua2V5cyhjaGlsZFNlcmlhbGl6ZXJzKVxuICAgICAgICA6IHNlcmlhbGl6ZVxuICAgICAgZGVsZXRlIGJpbmRpbmdzLnNlcmlhbGl6ZXJzXG4gICAgICBhcHBseVNlcmlhbGl6ZXJzKFtiaW5kaW5nc10sIGNoaWxkU2VyaWFsaXplLCBjaGlsZFNlcmlhbGl6ZXJzLCB0aGlzLl9zdGRFcnJTZXJpYWxpemUpXG4gICAgfVxuICAgIGZ1bmN0aW9uIENoaWxkIChwYXJlbnQpIHtcbiAgICAgIHRoaXMuX2NoaWxkTGV2ZWwgPSAocGFyZW50Ll9jaGlsZExldmVsIHwgMCkgKyAxXG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBiaW5kaW5ncyBhcmUgYXZhaWxhYmxlIGluIHRoZSBgc2V0YCBmdW5jdGlvblxuICAgICAgdGhpcy5iaW5kaW5ncyA9IGJpbmRpbmdzXG5cbiAgICAgIGlmIChjaGlsZFNlcmlhbGl6ZXJzKSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplcnMgPSBjaGlsZFNlcmlhbGl6ZXJzXG4gICAgICAgIHRoaXMuX3NlcmlhbGl6ZSA9IGNoaWxkU2VyaWFsaXplXG4gICAgICB9XG4gICAgICBpZiAodHJhbnNtaXQpIHtcbiAgICAgICAgdGhpcy5fbG9nRXZlbnQgPSBjcmVhdGVMb2dFdmVudFNoYXBlKFxuICAgICAgICAgIFtdLmNvbmNhdChwYXJlbnQuX2xvZ0V2ZW50LmJpbmRpbmdzLCBiaW5kaW5ncylcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICBDaGlsZC5wcm90b3R5cGUgPSB0aGlzXG4gICAgY29uc3QgbmV3TG9nZ2VyID0gbmV3IENoaWxkKHRoaXMpXG5cbiAgICAvLyBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlIGxldmVsIGlzIGFzc2lnbmVkXG4gICAgYXBwZW5kQ2hpbGRMb2dnZXIodGhpcywgbmV3TG9nZ2VyKVxuICAgIG5ld0xvZ2dlci5jaGlsZCA9IGZ1bmN0aW9uICguLi5hcmdzKSB7IHJldHVybiBjaGlsZC5jYWxsKHRoaXMsIHNldE9wdHMsIC4uLmFyZ3MpIH1cbiAgICAvLyByZXF1aXJlZCB0byBhY3R1YWxseSBpbml0aWFsaXplIHRoZSBsb2dnZXIgZnVuY3Rpb25zIGZvciBhbnkgZ2l2ZW4gY2hpbGRcbiAgICBuZXdMb2dnZXIubGV2ZWwgPSBjaGlsZE9wdGlvbnMubGV2ZWwgfHwgdGhpcy5sZXZlbCAvLyBhbGxvdyBsZXZlbCB0byBiZSBzZXQgYnkgY2hpbGRPcHRpb25zXG4gICAgc2V0T3B0cy5vbkNoaWxkKG5ld0xvZ2dlcilcblxuICAgIHJldHVybiBuZXdMb2dnZXJcbiAgfVxuICByZXR1cm4gbG9nZ2VyXG59XG5cbmZ1bmN0aW9uIGdldExldmVscyAob3B0cykge1xuICBjb25zdCBjdXN0b21MZXZlbHMgPSBvcHRzLmN1c3RvbUxldmVscyB8fCB7fVxuXG4gIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5hc3NpZ24oe30sIHBpbm8ubGV2ZWxzLnZhbHVlcywgY3VzdG9tTGV2ZWxzKVxuICBjb25zdCBsYWJlbHMgPSBPYmplY3QuYXNzaWduKHt9LCBwaW5vLmxldmVscy5sYWJlbHMsIGludmVydE9iamVjdChjdXN0b21MZXZlbHMpKVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWVzLFxuICAgIGxhYmVsc1xuICB9XG59XG5cbmZ1bmN0aW9uIGludmVydE9iamVjdCAob2JqKSB7XG4gIGNvbnN0IGludmVydGVkID0ge31cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpbnZlcnRlZFtvYmpba2V5XV0gPSBrZXlcbiAgfSlcbiAgcmV0dXJuIGludmVydGVkXG59XG5cbnBpbm8ubGV2ZWxzID0ge1xuICB2YWx1ZXM6IHtcbiAgICBmYXRhbDogNjAsXG4gICAgZXJyb3I6IDUwLFxuICAgIHdhcm46IDQwLFxuICAgIGluZm86IDMwLFxuICAgIGRlYnVnOiAyMCxcbiAgICB0cmFjZTogMTBcbiAgfSxcbiAgbGFiZWxzOiB7XG4gICAgMTA6ICd0cmFjZScsXG4gICAgMjA6ICdkZWJ1ZycsXG4gICAgMzA6ICdpbmZvJyxcbiAgICA0MDogJ3dhcm4nLFxuICAgIDUwOiAnZXJyb3InLFxuICAgIDYwOiAnZmF0YWwnXG4gIH1cbn1cblxucGluby5zdGRTZXJpYWxpemVycyA9IHN0ZFNlcmlhbGl6ZXJzXG5waW5vLnN0ZFRpbWVGdW5jdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7IG51bGxUaW1lLCBlcG9jaFRpbWUsIHVuaXhUaW1lLCBpc29UaW1lIH0pXG5cbmZ1bmN0aW9uIGdldEJpbmRpbmdDaGFpbiAobG9nZ2VyKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gW11cbiAgaWYgKGxvZ2dlci5iaW5kaW5ncykge1xuICAgIGJpbmRpbmdzLnB1c2gobG9nZ2VyLmJpbmRpbmdzKVxuICB9XG5cbiAgLy8gdHJhdmVyc2UgdXAgdGhlIHRyZWUgdG8gZ2V0IGFsbCBiaW5kaW5nc1xuICBsZXQgaGllcmFyY2h5ID0gbG9nZ2VyW2hpZXJhcmNoeVN5bWJvbF1cbiAgd2hpbGUgKGhpZXJhcmNoeS5wYXJlbnQpIHtcbiAgICBoaWVyYXJjaHkgPSBoaWVyYXJjaHkucGFyZW50XG4gICAgaWYgKGhpZXJhcmNoeS5sb2dnZXIuYmluZGluZ3MpIHtcbiAgICAgIGJpbmRpbmdzLnB1c2goaGllcmFyY2h5LmxvZ2dlci5iaW5kaW5ncylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmluZGluZ3MucmV2ZXJzZSgpXG59XG5cbmZ1bmN0aW9uIHNldCAoc2VsZiwgb3B0cywgcm9vdExvZ2dlciwgbGV2ZWwpIHtcbiAgLy8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgbG9nIGZ1bmN0aW9ucyB3aXRoIGVpdGhlciBgbm9vcGAgb3IgdGhlIGJhc2UgbG9nIGZ1bmN0aW9uXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBsZXZlbCwge1xuICAgIHZhbHVlOiAobGV2ZWxUb1ZhbHVlKHNlbGYubGV2ZWwsIHJvb3RMb2dnZXIpID4gbGV2ZWxUb1ZhbHVlKGxldmVsLCByb290TG9nZ2VyKVxuICAgICAgPyBub29wXG4gICAgICA6IHJvb3RMb2dnZXJbYmFzZUxvZ0Z1bmN0aW9uU3ltYm9sXVtsZXZlbF0pLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgaWYgKHNlbGZbbGV2ZWxdID09PSBub29wKSB7XG4gICAgaWYgKCFvcHRzLnRyYW5zbWl0KSByZXR1cm5cblxuICAgIGNvbnN0IHRyYW5zbWl0TGV2ZWwgPSBvcHRzLnRyYW5zbWl0LmxldmVsIHx8IHNlbGYubGV2ZWxcbiAgICBjb25zdCB0cmFuc21pdFZhbHVlID0gbGV2ZWxUb1ZhbHVlKHRyYW5zbWl0TGV2ZWwsIHJvb3RMb2dnZXIpXG4gICAgY29uc3QgbWV0aG9kVmFsdWUgPSBsZXZlbFRvVmFsdWUobGV2ZWwsIHJvb3RMb2dnZXIpXG4gICAgaWYgKG1ldGhvZFZhbHVlIDwgdHJhbnNtaXRWYWx1ZSkgcmV0dXJuXG4gIH1cblxuICAvLyBtYWtlIHN1cmUgdGhlIGxvZyBmb3JtYXQgaXMgY29ycmVjdFxuICBzZWxmW2xldmVsXSA9IGNyZWF0ZVdyYXAoc2VsZiwgb3B0cywgcm9vdExvZ2dlciwgbGV2ZWwpXG5cbiAgLy8gcHJlcGVuZCBiaW5kaW5ncyBpZiBpdCBpcyBub3QgdGhlIHJvb3QgbG9nZ2VyXG4gIGNvbnN0IGJpbmRpbmdzID0gZ2V0QmluZGluZ0NoYWluKHNlbGYpXG4gIGlmIChiaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBlYXJseSBleGl0IGluIGNhc2UgZm9yIHJvb3RMb2dnZXJcbiAgICByZXR1cm5cbiAgfVxuICBzZWxmW2xldmVsXSA9IHByZXBlbmRCaW5kaW5nc0luQXJndW1lbnRzKGJpbmRpbmdzLCBzZWxmW2xldmVsXSlcbn1cblxuZnVuY3Rpb24gcHJlcGVuZEJpbmRpbmdzSW5Bcmd1bWVudHMgKGJpbmRpbmdzLCBsb2dGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvZ0Z1bmMuYXBwbHkodGhpcywgWy4uLmJpbmRpbmdzLCAuLi5hcmd1bWVudHNdKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdyYXAgKHNlbGYsIG9wdHMsIHJvb3RMb2dnZXIsIGxldmVsKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gKHdyaXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIExPRyAoKSB7XG4gICAgICBjb25zdCB0cyA9IG9wdHMudGltZXN0YW1wKClcbiAgICAgIGNvbnN0IGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICAgIGNvbnN0IHByb3RvID0gKE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgPT09IF9jb25zb2xlKSA/IF9jb25zb2xlIDogdGhpc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG5cbiAgICAgIHZhciBhcmdzSXNTZXJpYWxpemVkID0gZmFsc2VcbiAgICAgIGlmIChvcHRzLnNlcmlhbGl6ZSkge1xuICAgICAgICBhcHBseVNlcmlhbGl6ZXJzKGFyZ3MsIHRoaXMuX3NlcmlhbGl6ZSwgdGhpcy5zZXJpYWxpemVycywgdGhpcy5fc3RkRXJyU2VyaWFsaXplKVxuICAgICAgICBhcmdzSXNTZXJpYWxpemVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG9wdHMuYXNPYmplY3QgfHwgb3B0cy5mb3JtYXR0ZXJzKSB7XG4gICAgICAgIGNvbnN0IG91dCA9IGFzT2JqZWN0KHRoaXMsIGxldmVsLCBhcmdzLCB0cywgb3B0cylcbiAgICAgICAgaWYgKG9wdHMucmVwb3J0Q2FsbGVyICYmIG91dCAmJiBvdXQubGVuZ3RoID4gMCAmJiBvdXRbMF0gJiYgdHlwZW9mIG91dFswXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2FsbGVyID0gZ2V0Q2FsbGVyTG9jYXRpb24oKVxuICAgICAgICAgICAgaWYgKGNhbGxlcikgb3V0WzBdLmNhbGxlciA9IGNhbGxlclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGUuY2FsbChwcm90bywgLi4ub3V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdHMucmVwb3J0Q2FsbGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxlciA9IGdldENhbGxlckxvY2F0aW9uKClcbiAgICAgICAgICAgIGlmIChjYWxsZXIpIGFyZ3MucHVzaChjYWxsZXIpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuICAgICAgICB3cml0ZS5hcHBseShwcm90bywgYXJncylcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudHJhbnNtaXQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNtaXRMZXZlbCA9IG9wdHMudHJhbnNtaXQubGV2ZWwgfHwgc2VsZi5fbGV2ZWxcbiAgICAgICAgY29uc3QgdHJhbnNtaXRWYWx1ZSA9IGxldmVsVG9WYWx1ZSh0cmFuc21pdExldmVsLCByb290TG9nZ2VyKVxuICAgICAgICBjb25zdCBtZXRob2RWYWx1ZSA9IGxldmVsVG9WYWx1ZShsZXZlbCwgcm9vdExvZ2dlcilcbiAgICAgICAgaWYgKG1ldGhvZFZhbHVlIDwgdHJhbnNtaXRWYWx1ZSkgcmV0dXJuXG4gICAgICAgIHRyYW5zbWl0KHRoaXMsIHtcbiAgICAgICAgICB0cyxcbiAgICAgICAgICBtZXRob2RMZXZlbDogbGV2ZWwsXG4gICAgICAgICAgbWV0aG9kVmFsdWUsXG4gICAgICAgICAgdHJhbnNtaXRMZXZlbCxcbiAgICAgICAgICB0cmFuc21pdFZhbHVlOiByb290TG9nZ2VyLmxldmVscy52YWx1ZXNbb3B0cy50cmFuc21pdC5sZXZlbCB8fCBzZWxmLl9sZXZlbF0sXG4gICAgICAgICAgc2VuZDogb3B0cy50cmFuc21pdC5zZW5kLFxuICAgICAgICAgIHZhbDogbGV2ZWxUb1ZhbHVlKHNlbGYuX2xldmVsLCByb290TG9nZ2VyKVxuICAgICAgICB9LCBhcmdzLCBhcmdzSXNTZXJpYWxpemVkKVxuICAgICAgfVxuICAgIH1cbiAgfSkoc2VsZltiYXNlTG9nRnVuY3Rpb25TeW1ib2xdW2xldmVsXSlcbn1cblxuZnVuY3Rpb24gYXNPYmplY3QgKGxvZ2dlciwgbGV2ZWwsIGFyZ3MsIHRzLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBsZXZlbDogbGV2ZWxGb3JtYXR0ZXIsXG4gICAgbG9nOiBsb2dPYmplY3RGb3JtYXR0ZXIgPSAob2JqKSA9PiBvYmpcbiAgfSA9IG9wdHMuZm9ybWF0dGVycyB8fCB7fVxuICBjb25zdCBhcmdzQ2xvbmVkID0gYXJncy5zbGljZSgpXG4gIGxldCBtc2cgPSBhcmdzQ2xvbmVkWzBdXG4gIGNvbnN0IGxvZ09iamVjdCA9IHt9XG5cbiAgbGV0IGx2bCA9IChsb2dnZXIuX2NoaWxkTGV2ZWwgfCAwKSArIDFcbiAgaWYgKGx2bCA8IDEpIGx2bCA9IDFcblxuICBpZiAodHMpIHtcbiAgICBsb2dPYmplY3QudGltZSA9IHRzXG4gIH1cblxuICBpZiAobGV2ZWxGb3JtYXR0ZXIpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWRMZXZlbCA9IGxldmVsRm9ybWF0dGVyKGxldmVsLCBsb2dnZXIubGV2ZWxzLnZhbHVlc1tsZXZlbF0pXG4gICAgT2JqZWN0LmFzc2lnbihsb2dPYmplY3QsIGZvcm1hdHRlZExldmVsKVxuICB9IGVsc2Uge1xuICAgIGxvZ09iamVjdC5sZXZlbCA9IGxvZ2dlci5sZXZlbHMudmFsdWVzW2xldmVsXVxuICB9XG5cbiAgaWYgKG9wdHMuYXNPYmplY3RCaW5kaW5nc09ubHkpIHtcbiAgICBpZiAobXNnICE9PSBudWxsICYmIHR5cGVvZiBtc2cgPT09ICdvYmplY3QnKSB7XG4gICAgICB3aGlsZSAobHZsLS0gJiYgdHlwZW9mIGFyZ3NDbG9uZWRbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obG9nT2JqZWN0LCBhcmdzQ2xvbmVkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0dGVkTG9nT2JqZWN0ID0gbG9nT2JqZWN0Rm9ybWF0dGVyKGxvZ09iamVjdClcbiAgICByZXR1cm4gW2Zvcm1hdHRlZExvZ09iamVjdCwgLi4uYXJnc0Nsb25lZF1cbiAgfSBlbHNlIHtcbiAgICAvLyBkZWxpYmVyYXRlLCBjYXRjaGluZyBvYmplY3RzLCBhcnJheXNcbiAgICBpZiAobXNnICE9PSBudWxsICYmIHR5cGVvZiBtc2cgPT09ICdvYmplY3QnKSB7XG4gICAgICB3aGlsZSAobHZsLS0gJiYgdHlwZW9mIGFyZ3NDbG9uZWRbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obG9nT2JqZWN0LCBhcmdzQ2xvbmVkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgICBtc2cgPSBhcmdzQ2xvbmVkLmxlbmd0aCA/IGZvcm1hdChhcmdzQ2xvbmVkLnNoaWZ0KCksIGFyZ3NDbG9uZWQpIDogdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykgbXNnID0gZm9ybWF0KGFyZ3NDbG9uZWQuc2hpZnQoKSwgYXJnc0Nsb25lZClcbiAgICBpZiAobXNnICE9PSB1bmRlZmluZWQpIGxvZ09iamVjdFtvcHRzLm1lc3NhZ2VLZXldID0gbXNnXG5cbiAgICBjb25zdCBmb3JtYXR0ZWRMb2dPYmplY3QgPSBsb2dPYmplY3RGb3JtYXR0ZXIobG9nT2JqZWN0KVxuICAgIHJldHVybiBbZm9ybWF0dGVkTG9nT2JqZWN0XVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5U2VyaWFsaXplcnMgKGFyZ3MsIHNlcmlhbGl6ZSwgc2VyaWFsaXplcnMsIHN0ZEVyclNlcmlhbGl6ZSkge1xuICBmb3IgKGNvbnN0IGkgaW4gYXJncykge1xuICAgIGlmIChzdGRFcnJTZXJpYWxpemUgJiYgYXJnc1tpXSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhcmdzW2ldID0gcGluby5zdGRTZXJpYWxpemVycy5lcnIoYXJnc1tpXSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzW2ldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmdzW2ldKSAmJiBzZXJpYWxpemUpIHtcbiAgICAgIGZvciAoY29uc3QgayBpbiBhcmdzW2ldKSB7XG4gICAgICAgIGlmIChzZXJpYWxpemUuaW5kZXhPZihrKSA+IC0xICYmIGsgaW4gc2VyaWFsaXplcnMpIHtcbiAgICAgICAgICBhcmdzW2ldW2tdID0gc2VyaWFsaXplcnNba10oYXJnc1tpXVtrXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc21pdCAobG9nZ2VyLCBvcHRzLCBhcmdzLCBhcmdzSXNTZXJpYWxpemVkID0gZmFsc2UpIHtcbiAgY29uc3Qgc2VuZCA9IG9wdHMuc2VuZFxuICBjb25zdCB0cyA9IG9wdHMudHNcbiAgY29uc3QgbWV0aG9kTGV2ZWwgPSBvcHRzLm1ldGhvZExldmVsXG4gIGNvbnN0IG1ldGhvZFZhbHVlID0gb3B0cy5tZXRob2RWYWx1ZVxuICBjb25zdCB2YWwgPSBvcHRzLnZhbFxuICBjb25zdCBiaW5kaW5ncyA9IGxvZ2dlci5fbG9nRXZlbnQuYmluZGluZ3NcblxuICBpZiAoIWFyZ3NJc1NlcmlhbGl6ZWQpIHtcbiAgICBhcHBseVNlcmlhbGl6ZXJzKFxuICAgICAgYXJncyxcbiAgICAgIGxvZ2dlci5fc2VyaWFsaXplIHx8IE9iamVjdC5rZXlzKGxvZ2dlci5zZXJpYWxpemVycyksXG4gICAgICBsb2dnZXIuc2VyaWFsaXplcnMsXG4gICAgICBsb2dnZXIuX3N0ZEVyclNlcmlhbGl6ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGxvZ2dlci5fc3RkRXJyU2VyaWFsaXplXG4gICAgKVxuICB9XG5cbiAgbG9nZ2VyLl9sb2dFdmVudC50cyA9IHRzXG4gIGxvZ2dlci5fbG9nRXZlbnQubWVzc2FnZXMgPSBhcmdzLmZpbHRlcihmdW5jdGlvbiAoYXJnKSB7XG4gICAgLy8gYmluZGluZ3MgY2FuIG9ubHkgYmUgb2JqZWN0cywgc28gcmVmZXJlbmNlIGVxdWFsaXR5IGNoZWNrIHZpYSBpbmRleE9mIGlzIGZpbmVcbiAgICByZXR1cm4gYmluZGluZ3MuaW5kZXhPZihhcmcpID09PSAtMVxuICB9KVxuXG4gIGxvZ2dlci5fbG9nRXZlbnQubGV2ZWwubGFiZWwgPSBtZXRob2RMZXZlbFxuICBsb2dnZXIuX2xvZ0V2ZW50LmxldmVsLnZhbHVlID0gbWV0aG9kVmFsdWVcblxuICBzZW5kKG1ldGhvZExldmVsLCBsb2dnZXIuX2xvZ0V2ZW50LCB2YWwpXG5cbiAgbG9nZ2VyLl9sb2dFdmVudCA9IGNyZWF0ZUxvZ0V2ZW50U2hhcGUoYmluZGluZ3MpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvZ0V2ZW50U2hhcGUgKGJpbmRpbmdzKSB7XG4gIHJldHVybiB7XG4gICAgdHM6IDAsXG4gICAgbWVzc2FnZXM6IFtdLFxuICAgIGJpbmRpbmdzOiBiaW5kaW5ncyB8fCBbXSxcbiAgICBsZXZlbDogeyBsYWJlbDogJycsIHZhbHVlOiAwIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc0VyclZhbHVlIChlcnIpIHtcbiAgY29uc3Qgb2JqID0ge1xuICAgIHR5cGU6IGVyci5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIG1zZzogZXJyLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVyci5zdGFja1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGVycikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYmpba2V5XSA9IGVycltrZXldXG4gICAgfVxuICB9XG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gZ2V0VGltZUZ1bmN0aW9uIChvcHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0cy50aW1lc3RhbXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb3B0cy50aW1lc3RhbXBcbiAgfVxuICBpZiAob3B0cy50aW1lc3RhbXAgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxUaW1lXG4gIH1cbiAgcmV0dXJuIGVwb2NoVGltZVxufVxuXG5mdW5jdGlvbiBtb2NrICgpIHsgcmV0dXJuIHt9IH1cbmZ1bmN0aW9uIHBhc3N0aHJvdWdoIChhKSB7IHJldHVybiBhIH1cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gbnVsbFRpbWUgKCkgeyByZXR1cm4gZmFsc2UgfVxuZnVuY3Rpb24gZXBvY2hUaW1lICgpIHsgcmV0dXJuIERhdGUubm93KCkgfVxuZnVuY3Rpb24gdW5peFRpbWUgKCkgeyByZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMC4wKSB9XG5mdW5jdGlvbiBpc29UaW1lICgpIHsgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCkgfSAvLyB1c2luZyBEYXRlLm5vdygpIGZvciB0ZXN0YWJpbGl0eVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIHBmR2xvYmFsVGhpc09yRmFsbGJhY2sgKCkge1xuICBmdW5jdGlvbiBkZWZkIChvKSB7IHJldHVybiB0eXBlb2YgbyAhPT0gJ3VuZGVmaW5lZCcgJiYgbyB9XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGdsb2JhbFRoaXNcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ2dsb2JhbFRoaXMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuZ2xvYmFsVGhpc1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2xvYmFsVGhpcyA9IHRoaXMpXG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgICByZXR1cm4gZ2xvYmFsVGhpc1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRlZmQoc2VsZikgfHwgZGVmZCh3aW5kb3cpIHx8IGRlZmQodGhpcykgfHwge31cbiAgfVxufVxuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gcGlub1xubW9kdWxlLmV4cG9ydHMucGlubyA9IHBpbm9cblxuLy8gQXR0ZW1wdCB0byBleHRyYWN0IHRoZSB1c2VyIGNhbGxzaXRlIChmaWxlOmxpbmU6Y29sdW1uKVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGdldENhbGxlckxvY2F0aW9uICgpIHtcbiAgY29uc3Qgc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrXG4gIGlmICghc3RhY2spIHJldHVybiBudWxsXG4gIGNvbnN0IGxpbmVzID0gc3RhY2suc3BsaXQoJ1xcbicpXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsID0gbGluZXNbaV0udHJpbSgpXG4gICAgLy8gc2tpcCBmcmFtZXMgZnJvbSB0aGlzIGZpbGUgYW5kIGludGVybmFsc1xuICAgIGlmICgvKF5hdFxccyspPyhjcmVhdGVXcmFwfExPR3xzZXRcXHMqXFwofGFzT2JqZWN0fE9iamVjdFxcLmFwcGx5fEZ1bmN0aW9uXFwuYXBwbHkpLy50ZXN0KGwpKSBjb250aW51ZVxuICAgIGlmIChsLmluZGV4T2YoJ2Jyb3dzZXIuanMnKSAhPT0gLTEpIGNvbnRpbnVlXG4gICAgaWYgKGwuaW5kZXhPZignbm9kZTppbnRlcm5hbCcpICE9PSAtMSkgY29udGludWVcbiAgICBpZiAobC5pbmRleE9mKCdub2RlX21vZHVsZXMnKSAhPT0gLTEpIGNvbnRpbnVlXG4gICAgLy8gdHJ5IGZvcm1hdHMgbGlrZTogYXQgZnVuYyAoZmlsZTpsaW5lOmNvbCkgb3IgYXQgZmlsZTpsaW5lOmNvbFxuICAgIGxldCBtID0gbC5tYXRjaCgvXFwoKC4qPyk6KFxcZCspOihcXGQrKVxcKS8pXG4gICAgaWYgKCFtKSBtID0gbC5tYXRjaCgvYXRcXHMrKC4qPyk6KFxcZCspOihcXGQrKS8pXG4gICAgaWYgKG0pIHtcbiAgICAgIGNvbnN0IGZpbGUgPSBtWzFdXG4gICAgICBjb25zdCBsaW5lID0gbVsyXVxuICAgICAgY29uc3QgY29sID0gbVszXVxuICAgICAgcmV0dXJuIGZpbGUgKyAnOicgKyBsaW5lICsgJzonICsgY29sXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCAiJ3VzZSBzdHJpY3QnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5iZWNoMzJtID0gZXhwb3J0cy5iZWNoMzIgPSB2b2lkIDA7XG5jb25zdCBBTFBIQUJFVCA9ICdxcHpyeTl4OGdmMnR2ZHcwczNqbjU0a2hjZTZtdWE3bCc7XG5jb25zdCBBTFBIQUJFVF9NQVAgPSB7fTtcbmZvciAobGV0IHogPSAwOyB6IDwgQUxQSEFCRVQubGVuZ3RoOyB6KyspIHtcbiAgICBjb25zdCB4ID0gQUxQSEFCRVQuY2hhckF0KHopO1xuICAgIEFMUEhBQkVUX01BUFt4XSA9IHo7XG59XG5mdW5jdGlvbiBwb2x5bW9kU3RlcChwcmUpIHtcbiAgICBjb25zdCBiID0gcHJlID4+IDI1O1xuICAgIHJldHVybiAoKChwcmUgJiAweDFmZmZmZmYpIDw8IDUpIF5cbiAgICAgICAgKC0oKGIgPj4gMCkgJiAxKSAmIDB4M2I2YTU3YjIpIF5cbiAgICAgICAgKC0oKGIgPj4gMSkgJiAxKSAmIDB4MjY1MDhlNmQpIF5cbiAgICAgICAgKC0oKGIgPj4gMikgJiAxKSAmIDB4MWVhMTE5ZmEpIF5cbiAgICAgICAgKC0oKGIgPj4gMykgJiAxKSAmIDB4M2Q0MjMzZGQpIF5cbiAgICAgICAgKC0oKGIgPj4gNCkgJiAxKSAmIDB4MmExNDYyYjMpKTtcbn1cbmZ1bmN0aW9uIHByZWZpeENoayhwcmVmaXgpIHtcbiAgICBsZXQgY2hrID0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjID0gcHJlZml4LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMzMgfHwgYyA+IDEyNilcbiAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBwcmVmaXggKCcgKyBwcmVmaXggKyAnKSc7XG4gICAgICAgIGNoayA9IHBvbHltb2RTdGVwKGNoaykgXiAoYyA+PiA1KTtcbiAgICB9XG4gICAgY2hrID0gcG9seW1vZFN0ZXAoY2hrKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCB2ID0gcHJlZml4LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGNoayA9IHBvbHltb2RTdGVwKGNoaykgXiAodiAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gY2hrO1xufVxuZnVuY3Rpb24gY29udmVydChkYXRhLCBpbkJpdHMsIG91dEJpdHMsIHBhZCkge1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgbGV0IGJpdHMgPSAwO1xuICAgIGNvbnN0IG1heFYgPSAoMSA8PCBvdXRCaXRzKSAtIDE7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IGluQml0cykgfCBkYXRhW2ldO1xuICAgICAgICBiaXRzICs9IGluQml0cztcbiAgICAgICAgd2hpbGUgKGJpdHMgPj0gb3V0Qml0cykge1xuICAgICAgICAgICAgYml0cyAtPSBvdXRCaXRzO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKHZhbHVlID4+IGJpdHMpICYgbWF4Vik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhZCkge1xuICAgICAgICBpZiAoYml0cyA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCh2YWx1ZSA8PCAob3V0Qml0cyAtIGJpdHMpKSAmIG1heFYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYml0cyA+PSBpbkJpdHMpXG4gICAgICAgICAgICByZXR1cm4gJ0V4Y2VzcyBwYWRkaW5nJztcbiAgICAgICAgaWYgKCh2YWx1ZSA8PCAob3V0Qml0cyAtIGJpdHMpKSAmIG1heFYpXG4gICAgICAgICAgICByZXR1cm4gJ05vbi16ZXJvIHBhZGRpbmcnO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9Xb3JkcyhieXRlcykge1xuICAgIHJldHVybiBjb252ZXJ0KGJ5dGVzLCA4LCA1LCB0cnVlKTtcbn1cbmZ1bmN0aW9uIGZyb21Xb3Jkc1Vuc2FmZSh3b3Jkcykge1xuICAgIGNvbnN0IHJlcyA9IGNvbnZlcnQod29yZHMsIDUsIDgsIGZhbHNlKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKVxuICAgICAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZnJvbVdvcmRzKHdvcmRzKSB7XG4gICAgY29uc3QgcmVzID0gY29udmVydCh3b3JkcywgNSwgOCwgZmFsc2UpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlcyk7XG59XG5mdW5jdGlvbiBnZXRMaWJyYXJ5RnJvbUVuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgbGV0IEVOQ09ESU5HX0NPTlNUO1xuICAgIGlmIChlbmNvZGluZyA9PT0gJ2JlY2gzMicpIHtcbiAgICAgICAgRU5DT0RJTkdfQ09OU1QgPSAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgRU5DT0RJTkdfQ09OU1QgPSAweDJiYzgzMGEzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbmNvZGUocHJlZml4LCB3b3JkcywgTElNSVQpIHtcbiAgICAgICAgTElNSVQgPSBMSU1JVCB8fCA5MDtcbiAgICAgICAgaWYgKHByZWZpeC5sZW5ndGggKyA3ICsgd29yZHMubGVuZ3RoID4gTElNSVQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeGNlZWRzIGxlbmd0aCBsaW1pdCcpO1xuICAgICAgICBwcmVmaXggPSBwcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gZGV0ZXJtaW5lIGNoayBtb2RcbiAgICAgICAgbGV0IGNoayA9IHByZWZpeENoayhwcmVmaXgpO1xuICAgICAgICBpZiAodHlwZW9mIGNoayA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY2hrKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHByZWZpeCArICcxJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgeCA9IHdvcmRzW2ldO1xuICAgICAgICAgICAgaWYgKHggPj4gNSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbiA1LWJpdCB3b3JkJyk7XG4gICAgICAgICAgICBjaGsgPSBwb2x5bW9kU3RlcChjaGspIF4geDtcbiAgICAgICAgICAgIHJlc3VsdCArPSBBTFBIQUJFVC5jaGFyQXQoeCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgICAgIGNoayA9IHBvbHltb2RTdGVwKGNoayk7XG4gICAgICAgIH1cbiAgICAgICAgY2hrIF49IEVOQ09ESU5HX0NPTlNUO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IChjaGsgPj4gKCg1IC0gaSkgKiA1KSkgJiAweDFmO1xuICAgICAgICAgICAgcmVzdWx0ICs9IEFMUEhBQkVULmNoYXJBdCh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBfX2RlY29kZShzdHIsIExJTUlUKSB7XG4gICAgICAgIExJTUlUID0gTElNSVQgfHwgOTA7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoIDwgOClcbiAgICAgICAgICAgIHJldHVybiBzdHIgKyAnIHRvbyBzaG9ydCc7XG4gICAgICAgIGlmIChzdHIubGVuZ3RoID4gTElNSVQpXG4gICAgICAgICAgICByZXR1cm4gJ0V4Y2VlZHMgbGVuZ3RoIGxpbWl0JztcbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgbWl4ZWQgY2FzZVxuICAgICAgICBjb25zdCBsb3dlcmVkID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHVwcGVyZWQgPSBzdHIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKHN0ciAhPT0gbG93ZXJlZCAmJiBzdHIgIT09IHVwcGVyZWQpXG4gICAgICAgICAgICByZXR1cm4gJ01peGVkLWNhc2Ugc3RyaW5nICcgKyBzdHI7XG4gICAgICAgIHN0ciA9IGxvd2VyZWQ7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gc3RyLmxhc3RJbmRleE9mKCcxJyk7XG4gICAgICAgIGlmIChzcGxpdCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gJ05vIHNlcGFyYXRvciBjaGFyYWN0ZXIgZm9yICcgKyBzdHI7XG4gICAgICAgIGlmIChzcGxpdCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAnTWlzc2luZyBwcmVmaXggZm9yICcgKyBzdHI7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHN0ci5zbGljZSgwLCBzcGxpdCk7XG4gICAgICAgIGNvbnN0IHdvcmRDaGFycyA9IHN0ci5zbGljZShzcGxpdCArIDEpO1xuICAgICAgICBpZiAod29yZENoYXJzLmxlbmd0aCA8IDYpXG4gICAgICAgICAgICByZXR1cm4gJ0RhdGEgdG9vIHNob3J0JztcbiAgICAgICAgbGV0IGNoayA9IHByZWZpeENoayhwcmVmaXgpO1xuICAgICAgICBpZiAodHlwZW9mIGNoayA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gY2hrO1xuICAgICAgICBjb25zdCB3b3JkcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRDaGFycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgYyA9IHdvcmRDaGFycy5jaGFyQXQoaSk7XG4gICAgICAgICAgICBjb25zdCB2ID0gQUxQSEFCRVRfTUFQW2NdO1xuICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1Vua25vd24gY2hhcmFjdGVyICcgKyBjO1xuICAgICAgICAgICAgY2hrID0gcG9seW1vZFN0ZXAoY2hrKSBeIHY7XG4gICAgICAgICAgICAvLyBub3QgaW4gdGhlIGNoZWNrc3VtP1xuICAgICAgICAgICAgaWYgKGkgKyA2ID49IHdvcmRDaGFycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB3b3Jkcy5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGsgIT09IEVOQ09ESU5HX0NPTlNUKVxuICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIGNoZWNrc3VtIGZvciAnICsgc3RyO1xuICAgICAgICByZXR1cm4geyBwcmVmaXgsIHdvcmRzIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlY29kZVVuc2FmZShzdHIsIExJTUlUKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IF9fZGVjb2RlKHN0ciwgTElNSVQpO1xuICAgICAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNvZGUoc3RyLCBMSU1JVCkge1xuICAgICAgICBjb25zdCByZXMgPSBfX2RlY29kZShzdHIsIExJTUlUKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRlY29kZVVuc2FmZSxcbiAgICAgICAgZGVjb2RlLFxuICAgICAgICBlbmNvZGUsXG4gICAgICAgIHRvV29yZHMsXG4gICAgICAgIGZyb21Xb3Jkc1Vuc2FmZSxcbiAgICAgICAgZnJvbVdvcmRzLFxuICAgIH07XG59XG5leHBvcnRzLmJlY2gzMiA9IGdldExpYnJhcnlGcm9tRW5jb2RpbmcoJ2JlY2gzMicpO1xuZXhwb3J0cy5iZWNoMzJtID0gZ2V0TGlicmFyeUZyb21FbmNvZGluZygnYmVjaDMybScpO1xuIiwgIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwgIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCAiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbmNvbnN0IGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbmNvbnN0IGN1c3RvbUluc3BlY3RTeW1ib2wgPVxuICAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sWydmb3InXSA9PT0gJ2Z1bmN0aW9uJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA/IFN5bWJvbFsnZm9yJ10oJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkb3Qtbm90YXRpb25cbiAgICA6IG51bGxcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG5jb25zdCBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGNvbnN0IHByb3RvID0geyBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFyciwgcHJvdG8pXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcbiAgcmV0dXJuIGJ1ZlxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKGFyZylcbiAgfVxuICByZXR1cm4gZnJvbShhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheVZpZXcodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIChpc0luc3RhbmNlKHZhbHVlLCBTaGFyZWRBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgU2hhcmVkQXJyYXlCdWZmZXIpKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgKVxuICB9XG5cbiAgY29uc3QgdmFsdWVPZiA9IHZhbHVlLnZhbHVlT2YgJiYgdmFsdWUudmFsdWVPZigpXG4gIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgY29uc3QgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1Zzpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvMTQ4XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpXG5PYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLCBVaW50OEFycmF5KVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICBjb25zdCBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICBsZXQgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICBjb25zdCBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICBjb25zdCBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheVZpZXcgKGFycmF5Vmlldykge1xuICBpZiAoaXNJbnN0YW5jZShhcnJheVZpZXcsIFVpbnQ4QXJyYXkpKSB7XG4gICAgY29uc3QgY29weSA9IG5ldyBVaW50OEFycmF5KGFycmF5VmlldylcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKGNvcHkuYnVmZmVyLCBjb3B5LmJ5dGVPZmZzZXQsIGNvcHkuYnl0ZUxlbmd0aClcbiAgfVxuICByZXR1cm4gZnJvbUFycmF5TGlrZShhcnJheVZpZXcpXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBsZXQgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIGNvbnN0IGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIGxldCB4ID0gYS5sZW5ndGhcbiAgbGV0IHkgPSBiLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgbGV0IGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICBsZXQgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGxldCBidWYgPSBsaXN0W2ldXG4gICAgaWYgKGlzSW5zdGFuY2UoYnVmLCBVaW50OEFycmF5KSkge1xuICAgICAgaWYgKHBvcyArIGJ1Zi5sZW5ndGggPiBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICAgICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgYnVmLFxuICAgICAgICAgIHBvc1xuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIH1cbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArXG4gICAgICAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgY29uc3QgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJjaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgY29uc3QgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgbGV0IHN0ciA9ICcnXG4gIGNvbnN0IG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5pZiAoY3VzdG9tSW5zcGVjdFN5bWJvbCkge1xuICBCdWZmZXIucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIGxldCB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICBsZXQgeSA9IGVuZCAtIHN0YXJ0XG4gIGNvbnN0IGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgY29uc3QgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgY29uc3QgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIGxldCBpbmRleFNpemUgPSAxXG4gIGxldCBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIGxldCB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIGxldCBpXG4gIGlmIChkaXIpIHtcbiAgICBsZXQgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIGNvbnN0IHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgY29uc3QgcmVzID0gW11cblxuICBsZXQgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgY29uc3QgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgbGV0IGNvZGVQb2ludCA9IG51bGxcbiAgICBsZXQgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKVxuICAgICAgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKVxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpXG4gICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIGxldCBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbmNvbnN0IE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICBjb25zdCBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICBsZXQgb3V0ID0gJydcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gaGV4U2xpY2VMb29rdXBUYWJsZVtidWZbaV1dXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICBsZXQgcmVzID0gJydcbiAgLy8gSWYgYnl0ZXMubGVuZ3RoIGlzIG9kZCwgdGhlIGxhc3QgOCBiaXRzIG11c3QgYmUgaWdub3JlZCAoc2FtZSBhcyBub2RlLmpzKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICBjb25zdCBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdCdWYsIEJ1ZmZlci5wcm90b3R5cGUpXG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludExFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0XVxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIGxldCBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDMyQkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NExFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgbG8gPSBmaXJzdCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDI0XG5cbiAgY29uc3QgaGkgPSB0aGlzWysrb2Zmc2V0XSArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgbGFzdCAqIDIgKiogMjRcblxuICByZXR1cm4gQmlnSW50KGxvKSArIChCaWdJbnQoaGkpIDw8IEJpZ0ludCgzMikpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnVUludDY0QkUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCBoaSA9IGZpcnN0ICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICBjb25zdCBsbyA9IHRoaXNbKytvZmZzZXRdICogMiAqKiAyNCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgbGFzdFxuXG4gIHJldHVybiAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChsbylcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgaSA9IGJ5dGVMZW5ndGhcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiByZWFkQmlnSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgNF0gK1xuICAgIHRoaXNbb2Zmc2V0ICsgNV0gKiAyICoqIDggK1xuICAgIHRoaXNbb2Zmc2V0ICsgNl0gKiAyICoqIDE2ICtcbiAgICAobGFzdCA8PCAyNCkgLy8gT3ZlcmZsb3dcblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQoZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNClcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSAoZmlyc3QgPDwgMjQpICsgLy8gT3ZlcmZsb3dcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XVxuXG4gIHJldHVybiAoQmlnSW50KHZhbCkgPDwgQmlnSW50KDMyKSkgK1xuICAgIEJpZ0ludCh0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3QpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgbXVsID0gMVxuICBsZXQgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjb25zdCBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OCA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyTEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NExFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsZXQgaGkgPSBOdW1iZXIodmFsdWUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIHJldHVybiBvZmZzZXRcbn1cblxuZnVuY3Rpb24gd3J0QmlnVUludDY0QkUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbWluLCBtYXgpIHtcbiAgY2hlY2tJbnRCSSh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCA3KVxuXG4gIGxldCBsbyA9IE51bWJlcih2YWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSlcbiAgYnVmW29mZnNldCArIDddID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA2XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNV0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDRdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyAzXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0ICsgMl0gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDFdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXRdID0gaGlcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0TEUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRMRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdVSW50NjRCRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NEJFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIEJpZ0ludCgwKSwgQmlnSW50KCcweGZmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgbGV0IGkgPSAwXG4gIGxldCBtdWwgPSAxXG4gIGxldCBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoIC0gMVxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAtQmlnSW50KCcweDgwMDAwMDAwMDAwMDAwMDAnKSwgQmlnSW50KCcweDdmZmZmZmZmZmZmZmZmZmYnKSlcbn0pXG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICBjb25zdCBsZW4gPSBlbmQgLSBzdGFydFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgdGhpcy5jb3B5V2l0aGluKHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICB2YWwgPSBOdW1iZXIodmFsKVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIGxldCBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICBjb25zdCBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIENVU1RPTSBFUlJPUlNcbi8vID09PT09PT09PT09PT1cblxuLy8gU2ltcGxpZmllZCB2ZXJzaW9ucyBmcm9tIE5vZGUsIGNoYW5nZWQgZm9yIEJ1ZmZlci1vbmx5IHVzYWdlXG5jb25zdCBlcnJvcnMgPSB7fVxuZnVuY3Rpb24gRSAoc3ltLCBnZXRNZXNzYWdlLCBCYXNlKSB7XG4gIGVycm9yc1tzeW1dID0gY2xhc3MgTm9kZUVycm9yIGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgc3VwZXIoKVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NhZ2UnLCB7XG4gICAgICAgIHZhbHVlOiBnZXRNZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIC8vIEFkZCB0aGUgZXJyb3IgY29kZSB0byB0aGUgbmFtZSB0byBpbmNsdWRlIGl0IGluIHRoZSBzdGFjayB0cmFjZS5cbiAgICAgIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7c3ltfV1gXG4gICAgICAvLyBBY2Nlc3MgdGhlIHN0YWNrIHRvIGdlbmVyYXRlIHRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGluZyB0aGUgZXJyb3IgY29kZVxuICAgICAgLy8gZnJvbSB0aGUgbmFtZS5cbiAgICAgIHRoaXMuc3RhY2sgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgIC8vIFJlc2V0IHRoZSBuYW1lIHRvIHRoZSBhY3R1YWwgbmFtZS5cbiAgICAgIGRlbGV0ZSB0aGlzLm5hbWVcbiAgICB9XG5cbiAgICBnZXQgY29kZSAoKSB7XG4gICAgICByZXR1cm4gc3ltXG4gICAgfVxuXG4gICAgc2V0IGNvZGUgKHZhbHVlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvZGUnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRvU3RyaW5nICgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3N5bX1dOiAke3RoaXMubWVzc2FnZX1gXG4gICAgfVxuICB9XG59XG5cbkUoJ0VSUl9CVUZGRVJfT1VUX09GX0JPVU5EUycsXG4gIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHNgXG4gICAgfVxuXG4gICAgcmV0dXJuICdBdHRlbXB0IHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSBidWZmZXIgYm91bmRzJ1xuICB9LCBSYW5nZUVycm9yKVxuRSgnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBmdW5jdGlvbiAobmFtZSwgYWN0dWFsKSB7XG4gICAgcmV0dXJuIGBUaGUgXCIke25hbWV9XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9YFxuICB9LCBUeXBlRXJyb3IpXG5FKCdFUlJfT1VUX09GX1JBTkdFJyxcbiAgZnVuY3Rpb24gKHN0ciwgcmFuZ2UsIGlucHV0KSB7XG4gICAgbGV0IG1zZyA9IGBUaGUgdmFsdWUgb2YgXCIke3N0cn1cIiBpcyBvdXQgb2YgcmFuZ2UuYFxuICAgIGxldCByZWNlaXZlZCA9IGlucHV0XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW5wdXQpICYmIE1hdGguYWJzKGlucHV0KSA+IDIgKiogMzIpIHtcbiAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKFN0cmluZyhpbnB1dCkpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdiaWdpbnQnKSB7XG4gICAgICByZWNlaXZlZCA9IFN0cmluZyhpbnB1dClcbiAgICAgIGlmIChpbnB1dCA+IEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpIHx8IGlucHV0IDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpIHtcbiAgICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IocmVjZWl2ZWQpXG4gICAgICB9XG4gICAgICByZWNlaXZlZCArPSAnbidcbiAgICB9XG4gICAgbXNnICs9IGAgSXQgbXVzdCBiZSAke3JhbmdlfS4gUmVjZWl2ZWQgJHtyZWNlaXZlZH1gXG4gICAgcmV0dXJuIG1zZ1xuICB9LCBSYW5nZUVycm9yKVxuXG5mdW5jdGlvbiBhZGROdW1lcmljYWxTZXBhcmF0b3IgKHZhbCkge1xuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSB2YWwubGVuZ3RoXG4gIGNvbnN0IHN0YXJ0ID0gdmFsWzBdID09PSAnLScgPyAxIDogMFxuICBmb3IgKDsgaSA+PSBzdGFydCArIDQ7IGkgLT0gMykge1xuICAgIHJlcyA9IGBfJHt2YWwuc2xpY2UoaSAtIDMsIGkpfSR7cmVzfWBcbiAgfVxuICByZXR1cm4gYCR7dmFsLnNsaWNlKDAsIGkpfSR7cmVzfWBcbn1cblxuLy8gQ0hFQ0sgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gY2hlY2tCb3VuZHMgKGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGlmIChidWZbb2Zmc2V0XSA9PT0gdW5kZWZpbmVkIHx8IGJ1ZltvZmZzZXQgKyBieXRlTGVuZ3RoXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCBidWYubGVuZ3RoIC0gKGJ5dGVMZW5ndGggKyAxKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0ludEJJICh2YWx1ZSwgbWluLCBtYXgsIGJ1Ziwgb2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikge1xuICAgIGNvbnN0IG4gPSB0eXBlb2YgbWluID09PSAnYmlnaW50JyA/ICduJyA6ICcnXG4gICAgbGV0IHJhbmdlXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAzKSB7XG4gICAgICBpZiAobWluID09PSAwIHx8IG1pbiA9PT0gQmlnSW50KDApKSB7XG4gICAgICAgIHJhbmdlID0gYD49IDAke259IGFuZCA8IDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDh9JHtufWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmdlID0gYD49IC0oMiR7bn0gKiogJHsoYnl0ZUxlbmd0aCArIDEpICogOCAtIDF9JHtufSkgYW5kIDwgMiAqKiBgICtcbiAgICAgICAgICAgICAgICBgJHsoYnl0ZUxlbmd0aCArIDEpICogOCAtIDF9JHtufWBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UgPSBgPj0gJHttaW59JHtufSBhbmQgPD0gJHttYXh9JHtufWBcbiAgICB9XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKCd2YWx1ZScsIHJhbmdlLCB2YWx1ZSlcbiAgfVxuICBjaGVja0JvdW5kcyhidWYsIG9mZnNldCwgYnl0ZUxlbmd0aClcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIgKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnbnVtYmVyJywgdmFsdWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gYm91bmRzRXJyb3IgKHZhbHVlLCBsZW5ndGgsIHR5cGUpIHtcbiAgaWYgKE1hdGguZmxvb3IodmFsdWUpICE9PSB2YWx1ZSkge1xuICAgIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCB0eXBlKVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSh0eXBlIHx8ICdvZmZzZXQnLCAnYW4gaW50ZWdlcicsIHZhbHVlKVxuICB9XG5cbiAgaWYgKGxlbmd0aCA8IDApIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUygpXG4gIH1cblxuICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA+PSAke3R5cGUgPyAxIDogMH0gYW5kIDw9ICR7bGVuZ3RofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSlcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG5jb25zdCBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgbGV0IGNvZGVQb2ludFxuICBjb25zdCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIGxldCBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIGNvbnN0IGJ5dGVBcnJheSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgbGV0IGMsIGhpLCBsb1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGxldCBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG4vLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzSW5zdGFuY2UgKG9iaiwgdHlwZSkge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmXG4gICAgICBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lKVxufVxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gIHJldHVybiBvYmogIT09IG9iaiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG4vLyBDcmVhdGUgbG9va3VwIHRhYmxlIGZvciBgdG9TdHJpbmcoJ2hleCcpYFxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMjE5XG5jb25zdCBoZXhTbGljZUxvb2t1cFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYWxwaGFiZXQgPSAnMDEyMzQ1Njc4OWFiY2RlZidcbiAgY29uc3QgdGFibGUgPSBuZXcgQXJyYXkoMjU2KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBjb25zdCBpMTYgPSBpICogMTZcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaV0gKyBhbHBoYWJldFtqXVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFibGVcbn0pKClcblxuLy8gUmV0dXJuIG5vdCBmdW5jdGlvbiB3aXRoIEVycm9yIGlmIEJpZ0ludCBub3Qgc3VwcG9ydGVkXG5mdW5jdGlvbiBkZWZpbmVCaWdJbnRNZXRob2QgKGZuKSB7XG4gIHJldHVybiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IEJ1ZmZlckJpZ0ludE5vdERlZmluZWQgOiBmblxufVxuXG5mdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdCaWdJbnQgbm90IHN1cHBvcnRlZCcpXG59XG4iLCAiaW1wb3J0IHtcbiAgICBuaXAwNCxcbiAgICBuaXA0NCxcbiAgICBuaXAxOSxcbiAgICBnZXRQdWJsaWNLZXlTeW5jLFxuICAgIGZpbmFsaXplRXZlbnQsXG4gICAgYnl0ZXNUb0hleCxcbiAgICBoZXhUb0J5dGVzLFxufSBmcm9tICdub3N0ci1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgZW5jcnlwdCBhcyBuaXA0OUVuY3J5cHQsIGRlY3J5cHQgYXMgbmlwNDlEZWNyeXB0IH0gZnJvbSAnbm9zdHItY3J5cHRvLXV0aWxzL25pcDQ5JztcbmltcG9ydCB7IGtleVRvU2VlZFBocmFzZSwgc2VlZFBocmFzZVRvS2V5LCBpc1ZhbGlkU2VlZFBocmFzZSB9IGZyb20gJy4vdXRpbGl0aWVzL3NlZWRwaHJhc2UuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVLZXlQYWlyIH0gZnJvbSAnLi91dGlsaXRpZXMva2V5cy5qcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcbmltcG9ydCB7XG4gICAgZ2V0UHJvZmlsZUluZGV4LFxuICAgIGdldCxcbiAgICBnZXRQcm9maWxlLFxuICAgIGdldFByb2ZpbGVzLFxuICAgIGdldFBlcm1pc3Npb24sXG4gICAgc2V0UGVybWlzc2lvbixcbiAgICBpc0VuY3J5cHRlZCxcbiAgICBjaGVja1Bhc3N3b3JkLFxuICAgIGVuY3J5cHRBbGxLZXlzLFxuICAgIGNoYW5nZVBhc3N3b3JkRm9yS2V5cyxcbiAgICByZW1vdmVQYXNzd29yZFByb3RlY3Rpb24sXG4gICAgZ2V0RGVjcnlwdGVkUHJpdktleSxcbiAgICBpc0VuY3J5cHRlZEJsb2IsXG59IGZyb20gJy4vdXRpbGl0aWVzL3V0aWxzJztcbmltcG9ydCB7IGVuY3J5cHQgYXMgZW5jcnlwdEJsb2IsIGRlY3J5cHQgYXMgZGVjcnlwdEJsb2IsIGVuY3J5cHRXaXRoS2V5LCBkZXJpdmVLZXkgfSBmcm9tICcuL3V0aWxpdGllcy9jcnlwdG8nO1xuaW1wb3J0IHsgc2F2ZUV2ZW50IH0gZnJvbSAnLi91dGlsaXRpZXMvZGInO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSAnLi91dGlsaXRpZXMvYnJvd3Nlci1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBpbml0U3luYywgc2NoZWR1bGVTeW5jUHVzaCB9IGZyb20gJy4vdXRpbGl0aWVzL3N5bmMtbWFuYWdlcic7XG5pbXBvcnQge1xuICAgIFJlbGF5Q29ubmVjdGlvbixcbiAgICBnZXRPckNyZWF0ZVNlc3Npb24sXG4gICAgY3JlYXRlU2Vzc2lvbixcbiAgICBkaXNjb25uZWN0U2Vzc2lvbixcbiAgICBpc1Nlc3Npb25BY3RpdmUsXG4gICAgdmFsaWRhdGVCdW5rZXJVcmwsXG59IGZyb20gJy4vdXRpbGl0aWVzL25pcDQ2JztcbmltcG9ydCB7IEJ1bmtlclNlcnZlciB9IGZyb20gJy4vdXRpbGl0aWVzL2J1bmtlci1zZXJ2ZXInO1xuaW1wb3J0IHtcbiAgICBidWlsZFZhdWx0RXZlbnQsXG4gICAgYnVpbGRWYXVsdERlbGV0aW9uLFxuICAgIGJ1aWxkVmF1bHRGaWx0ZXIsXG4gICAgcGFyc2VWYXVsdEV2ZW50LFxufSBmcm9tICcuL3V0aWxpdGllcy9uaXA3OCc7XG5cbi8vIFdyYXAgc3RvcmFnZS5sb2NhbCB3aXRoIGFuIGludGVyY2VwdG9yIHRoYXQgYXV0by10cmlnZ2VycyBzeW5jIHB1c2ggb24gd3JpdGVzXG5jb25zdCBfcmF3U3RvcmFnZSA9IGFwaS5zdG9yYWdlLmxvY2FsO1xuY29uc3Qgc3RvcmFnZSA9IHtcbiAgICBnZXQ6ICguLi5hcmdzKSA9PiBfcmF3U3RvcmFnZS5nZXQoLi4uYXJncyksXG4gICAgc2V0OiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBfcmF3U3RvcmFnZS5zZXQoLi4uYXJncyk7XG4gICAgICAgIHJlc3VsdC50aGVuKCgpID0+IHNjaGVkdWxlU3luY1B1c2goKSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgY2xlYXI6ICguLi5hcmdzKSA9PiBfcmF3U3RvcmFnZS5jbGVhciguLi5hcmdzKSxcbiAgICByZW1vdmU6ICguLi5hcmdzKSA9PiBfcmF3U3RvcmFnZS5yZW1vdmUoLi4uYXJncyksXG59O1xuY29uc3QgbG9nID0gbXNnID0+IGNvbnNvbGUubG9nKCdCYWNrZ3JvdW5kOiAnLCBtc2cpO1xuY29uc3QgdmFsaWRhdGlvbnMgPSB7fTtcbmxldCBwcm9tcHQgPSB7IG11dGV4OiBuZXcgTXV0ZXgoKSwgcmVsZWFzZTogbnVsbCwgdGFiSWQ6IG51bGwgfTtcbmxldCBwZW5kaW5nUXVldWUgPSB7IHRvdGFsOiAwLCBwcm9jZXNzZWQ6IDAgfTtcbmxldCBhY3RpdmVCdW5rZXJTZXJ2ZXIgPSBudWxsO1xuXG4vKipcbiAqIEhlbHBlcjogcnVuIGFuIGFzeW5jIGZ1bmN0aW9uIGFuZCBkZWxpdmVyIHRoZSByZXN1bHQgdmlhIHNlbmRSZXNwb25zZS5cbiAqIENocm9tZSBNVjMgZG9lcyBub3QgcmVsaWFibHkgZGVsaXZlciBQcm9taXNlLXJldHVybiB2YWx1ZXMgZnJvbSBvbk1lc3NhZ2VcbiAqIGxpc3RlbmVycyBcdTIwMTQgb25seSB0aGUgc2VuZFJlc3BvbnNlIGNhbGxiYWNrIHBhdHRlcm4gd29ya3MuICBVc2UgdGhpcyB3aXRoXG4gKiBgcmV0dXJuIHRydWU7YCBpbiB0aGUgc3dpdGNoIGNhc2UgdG8ga2VlcCB0aGUgbWVzc2FnZSBjaGFubmVsIG9wZW4uXG4gKi9cbmZ1bmN0aW9uIHJlcGx5KHNlbmRSZXNwb25zZSwgZm4pIHtcbiAgICBmbigpLnRoZW4ociA9PiBzZW5kUmVzcG9uc2UocikpLmNhdGNoKGUgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdyZXBseSgpIGVycm9yOicsIGUpO1xuICAgICAgICBzZW5kUmVzcG9uc2UodW5kZWZpbmVkKTtcbiAgICB9KTtcbn1cblxuLy8gUmF0ZSBsaW1pdGVyOiBtYXggNSBwZXJtaXNzaW9uIHByb21wdHMgcGVyIGhvc3QgcGVyIDEwLXNlY29uZCB3aW5kb3dcbmNvbnN0IHJhdGVMaW1pdHMgPSBuZXcgTWFwKCk7XG5jb25zdCBSQVRFX0xJTUlUX01BWCA9IDU7XG5jb25zdCBSQVRFX0xJTUlUX1dJTkRPVyA9IDEwMDAwO1xuXG5mdW5jdGlvbiBpc1JhdGVMaW1pdGVkKGhvc3QpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCB0aW1lc3RhbXBzID0gcmF0ZUxpbWl0cy5nZXQoaG9zdCkgfHwgW107XG4gICAgdGltZXN0YW1wcyA9IHRpbWVzdGFtcHMuZmlsdGVyKHQgPT4gbm93IC0gdCA8IFJBVEVfTElNSVRfV0lORE9XKTtcbiAgICBpZiAodGltZXN0YW1wcy5sZW5ndGggPj0gUkFURV9MSU1JVF9NQVgpIHtcbiAgICAgICAgcmF0ZUxpbWl0cy5zZXQoaG9zdCwgdGltZXN0YW1wcyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aW1lc3RhbXBzLnB1c2gobm93KTtcbiAgICByYXRlTGltaXRzLnNldChob3N0LCB0aW1lc3RhbXBzKTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIC0tLSBTZXNzaW9uIHN0YXRlIGZvciBtYXN0ZXIgcGFzc3dvcmQgZW5jcnlwdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlY3J5cHRlZCBrZXlzIGFyZSBoZWxkIGluIG1lbW9yeSBvbmx5IHdoaWxlIHVubG9ja2VkLlxuLy8gTWFwIG9mIHByb2ZpbGVJbmRleCAtPiBoZXggcHJpdmF0ZSBrZXkgc3RyaW5nXG5jb25zdCBzZXNzaW9uS2V5cyA9IG5ldyBNYXAoKTtcbmxldCBzZXNzaW9uQ3J5cHRvS2V5ID0gbnVsbDsgLy8gZGVyaXZlZCBBRVMtMjU2LUdDTSBrZXkgKG9wYXF1ZSBDcnlwdG9LZXksIG5vdCByYXcgcGFzc3dvcmQpXG5sZXQgc2Vzc2lvbktleVNhbHQgPSBudWxsOyAgIC8vIHNhbHQgdXNlZCB0byBkZXJpdmUgc2Vzc2lvbkNyeXB0b0tleVxubGV0IGxvY2tlZCA9IHRydWU7IC8vIHN0YXJ0IGxvY2tlZDsgZGV0ZXJtaW5lZCBvbiBmaXJzdCBpc0xvY2tlZCBjaGVja1xubGV0IGVuY3J5cHRpb25FbmFibGVkID0gZmFsc2U7IC8vIGNhY2hlZCBlbmNyeXB0aW9uIHN0YXRlIGZvciBmYXN0IGxvb2t1cHNcbmxldCBhdXRvTG9ja1RpbWVvdXQgPSAxNSAqIDYwICogMTAwMDsgLy8gMTUgbWludXRlcyBkZWZhdWx0XG5sZXQgYXV0b0xvY2tUaW1lciA9IG51bGw7XG5sZXQgbm9zdHJBY2Nlc3NXaGlsZUxvY2tlZCA9IGZhbHNlO1xuXG5sZXQgYmxvY2tDcm9zc09yaWdpbkZyYW1lcyA9IHRydWU7XG5cbi8vIEJydXRlLWZvcmNlIHByb3RlY3Rpb24gZm9yIHVubG9jayBhdHRlbXB0c1xubGV0IHVubG9ja0F0dGVtcHRzID0gMDtcbmxldCB1bmxvY2tDb29sZG93blVudGlsID0gMDtcblxuLy8gUGVybWlzc2lvbiByZXF1ZXN0IHJhdGUgbGltaXRpbmcgcGVyIG9yaWdpblxuY29uc3QgcGVybWlzc2lvblJhdGVNYXAgPSBuZXcgTWFwKCk7IC8vIGhvc3QgXHUyMTkyIHsgY291bnQsIHJlc2V0QXQgfVxuXG4vLyBMb2FkIHBlcnNpc3RlZCBzdGF0ZSBvbiBzdGFydHVwXG4oYXN5bmMgKCkgPT4ge1xuICAgIGxvZygnW1NUQVJUVVBdIFJlYWRpbmcgcGVyc2lzdGVkIHN0YXRlLi4uJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgYXV0b0xvY2tNaW51dGVzOiAxNSwgaXNFbmNyeXB0ZWQ6IGZhbHNlLCBwYXNzd29yZEhhc2g6IG51bGwsIG5vc3RyQWNjZXNzV2hpbGVMb2NrZWQ6IGZhbHNlLCBibG9ja0Nyb3NzT3JpZ2luRnJhbWVzOiB0cnVlIH0pO1xuICAgIGxvZyhgW1NUQVJUVVBdIGlzRW5jcnlwdGVkPSR7ZGF0YS5pc0VuY3J5cHRlZH0sIHBhc3N3b3JkSGFzaD0ke2RhdGEucGFzc3dvcmRIYXNoID8gJ0VYSVNUUycgOiAnbnVsbCd9LCBhdXRvTG9ja01pbnV0ZXM9JHtkYXRhLmF1dG9Mb2NrTWludXRlc31gKTtcbiAgICBhdXRvTG9ja1RpbWVvdXQgPSBkYXRhLmF1dG9Mb2NrTWludXRlcyAqIDYwICogMTAwMDtcbiAgICAvLyBEZWZlbnNpdmU6IGlmIHBhc3N3b3JkSGFzaCBleGlzdHMgYnV0IGZsYWcgaXMgc3RhbGUsIHNlbGYtaGVhbFxuICAgIGlmICghZGF0YS5pc0VuY3J5cHRlZCAmJiBkYXRhLnBhc3N3b3JkSGFzaCkge1xuICAgICAgICBsb2coJ1tTVEFSVFVQXSBTZWxmLWhlYWxpbmc6IHBhc3N3b3JkSGFzaCBleGlzdHMgYnV0IGlzRW5jcnlwdGVkPWZhbHNlIFx1MjE5MiBmaXhpbmcnKTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBpc0VuY3J5cHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgZGF0YS5pc0VuY3J5cHRlZCA9IHRydWU7XG4gICAgfVxuICAgIC8vIExvY2tvdXQgcmVjb3Zlcnk6IGlmIGlzRW5jcnlwdGVkPXRydWUgYnV0IHRoZXJlIGlzIE5PIHBhc3N3b3JkIHZlcmlmaWVyIEFORFxuICAgIC8vIG5vIGFjdHVhbGx5LWVuY3J5cHRlZCBrZXkgYmxvYnMsIGVuY3J5cHRpb24gaXMgYm9ndXMgKGUuZy4gYSBzdGFsZSBmbGFnXG4gICAgLy8gcmVjZWl2ZWQgZnJvbSBhbiBvbGRlciBidWdneSBzeW5jKS4gQ2xlYXJpbmcgaXQgcHJldmVudHMgYSBwZXJtYW5lbnQgbG9ja291dFxuICAgIC8vIHdoZXJlIHRoZSB1c2VyIGNhbiBuZXZlciB1bmxvY2sgYmVjYXVzZSBjaGVja1Bhc3N3b3JkKCkgYWx3YXlzIGZhaWxzLlxuICAgIC8vIFdlIE9OTFkgY2xlYXIgd2hlbiBubyBlbmNyeXB0ZWQgYmxvYnMgZXhpc3QgXHUyMDE0IG5ldmVyIHdoZW4gcmVhbCBjaXBoZXJ0ZXh0IGlzXG4gICAgLy8gcHJlc2VudCAodGhhdCB3b3VsZCBjb3JydXB0IGVuY3J5cHRlZCBrZXlzIGludG8gXCJwbGFpbnRleHRcIikuXG4gICAgaWYgKGRhdGEuaXNFbmNyeXB0ZWQgJiYgIWRhdGEucGFzc3dvcmRIYXNoKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvZmlsZXMgPSBbXSB9ID0gYXdhaXQgc3RvcmFnZS5nZXQoeyBwcm9maWxlczogW10gfSk7XG4gICAgICAgIGNvbnN0IGhhc0VuY3J5cHRlZEJsb2IgPSBwcm9maWxlcy5zb21lKHAgPT4gaXNFbmNyeXB0ZWRCbG9iKHAucHJpdktleSkpO1xuICAgICAgICBpZiAoIWhhc0VuY3J5cHRlZEJsb2IpIHtcbiAgICAgICAgICAgIGxvZygnW1NUQVJUVVBdIExvY2tvdXQgcmVjb3Zlcnk6IGlzRW5jcnlwdGVkPXRydWUgd2l0aCBubyBwYXNzd29yZEhhc2ggYW5kIG5vIGVuY3J5cHRlZCBibG9icyBcdTIxOTIgY2xlYXJpbmcgYm9ndXMgZW5jcnlwdGlvbiBmbGFnJyk7XG4gICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNldCh7IGlzRW5jcnlwdGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGRhdGEuaXNFbmNyeXB0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmNyeXB0aW9uRW5hYmxlZCA9IGRhdGEuaXNFbmNyeXB0ZWQ7XG4gICAgbm9zdHJBY2Nlc3NXaGlsZUxvY2tlZCA9ICEhZGF0YS5ub3N0ckFjY2Vzc1doaWxlTG9ja2VkO1xuICAgIGJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXMgPSBkYXRhLmJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXMgIT09IGZhbHNlO1xuICAgIC8vIElmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgd2Ugc3RhcnQgbG9ja2VkXG4gICAgbG9ja2VkID0gZW5jcnlwdGlvbkVuYWJsZWQ7XG4gICAgbG9nKGBbU1RBUlRVUF0gRmluYWwgc3RhdGU6IGVuY3J5cHRpb25FbmFibGVkPSR7ZW5jcnlwdGlvbkVuYWJsZWR9LCBsb2NrZWQ9JHtsb2NrZWR9YCk7XG5cbiAgICAvLyBJbml0aWFsaXplIHBsYXRmb3JtIHN5bmMgKHB1bGwgZnJvbSBzeW5jLCByZWdpc3RlciBsaXN0ZW5lcilcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBpbml0U3luYygpO1xuICAgICAgICBsb2coJ1tTVEFSVFVQXSBQbGF0Zm9ybSBzeW5jIGluaXRpYWxpemVkJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2coYFtTVEFSVFVQXSBQbGF0Zm9ybSBzeW5jIGluaXQgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBwcm9maWxlcyBzaGFyZWQgZnJvbSB0aGUgaU9TIGFwcCB2aWEgQXBwIEdyb3VwcyAoU2FmYXJpIG9ubHkpXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyAmJiBicm93c2VyLnJ1bnRpbWUuc2VuZE5hdGl2ZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYnJvd3Nlci5ydW50aW1lLnNlbmROYXRpdmVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICdjb20ubm9zdHJrZXkuRXh0ZW5zaW9uJyxcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ2dldFNoYXJlZFByb2ZpbGVzJyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnByb2ZpbGVzICYmIHJlc3BvbnNlLnByb2ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbCA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgcHJvZmlsZXM6IFtdIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlU2hhcmVkUHJvZmlsZXMobG9jYWwucHJvZmlsZXMsIHJlc3BvbnNlLnByb2ZpbGVzKTtcbiAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlczogbWVyZ2VkLnByb2ZpbGVzIH0pO1xuICAgICAgICAgICAgICAgICAgICBsb2coYFtTVEFSVFVQXSBNZXJnZWQgJHtyZXNwb25zZS5wcm9maWxlcy5sZW5ndGh9IHNoYXJlZCBwcm9maWxlKHMpIGZyb20gaU9TIGFwcGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTm90IFNhZmFyaSwgb3Igc2hhcmVkIHN0b3JhZ2UgdW5hdmFpbGFibGUgXHUyMDE0IGlnbm9yZVxuICAgICAgICBsb2coYFtTVEFSVFVQXSBTaGFyZWQgcHJvZmlsZXMgY2hlY2sgc2tpcHBlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxufSkoKTtcblxuLyoqXG4gKiBNZXJnZSBwcm9maWxlcyBzaGFyZWQgZnJvbSB0aGUgaU9TIGFwcCBpbnRvIHRoZSBsb2NhbCBwcm9maWxlIGxpc3QuXG4gKiBGb3IgZWFjaCBzaGFyZWQgcHJvZmlsZSwgaWYgbm8gbG9jYWwgcHJvZmlsZSBoYXMgdGhlIHNhbWUgcHViS2V5LCBhZGQgaXQuXG4gKiBJZiBhIGxvY2FsIHByb2ZpbGUgaGFzIHRoZSBzYW1lIHB1YktleSwga2VlcCB0aGUgb25lIHdpdGggdGhlIG5ld2VyIHVwZGF0ZWRBdC5cbiAqIEByZXR1cm5zIHt7IHByb2ZpbGVzOiBBcnJheSwgY2hhbmdlZDogYm9vbGVhbiB9fVxuICovXG5mdW5jdGlvbiBtZXJnZVNoYXJlZFByb2ZpbGVzKGxvY2FsUHJvZmlsZXMsIHNoYXJlZFByb2ZpbGVzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBwcm9maWxlcyA9IFsuLi5sb2NhbFByb2ZpbGVzXTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmVkIG9mIHNoYXJlZFByb2ZpbGVzKSB7XG4gICAgICAgIGlmICghc2hhcmVkLnB1YktleSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgbG9jYWxJbmRleCA9IHByb2ZpbGVzLmZpbmRJbmRleChwID0+IHAucHViS2V5ID09PSBzaGFyZWQucHViS2V5KTtcblxuICAgICAgICBpZiAobG9jYWxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIE5ldyBwcm9maWxlIGZyb20gYXBwIFx1MjAxNCBhZGQgaXRcbiAgICAgICAgICAgIHByb2ZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IHNoYXJlZC5uYW1lIHx8ICdTaGFyZWQgUHJvZmlsZScsXG4gICAgICAgICAgICAgICAgcHJpdktleTogc2hhcmVkLnByaXZLZXkgfHwgJycsXG4gICAgICAgICAgICAgICAgcHViS2V5OiBzaGFyZWQucHViS2V5LFxuICAgICAgICAgICAgICAgIGhvc3RzOiB7fSxcbiAgICAgICAgICAgICAgICByZWxheXM6IHNoYXJlZC5yZWxheXMgfHwgW10sXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xvY2FsJyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IHNoYXJlZC5sYXN0U3luY2VkQXQgPyBuZXcgRGF0ZShzaGFyZWQubGFzdFN5bmNlZEF0KS5nZXRUaW1lKCkgOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEV4aXN0aW5nIHByb2ZpbGUgXHUyMDE0IHVwZGF0ZSBpZiBzaGFyZWQgaXMgbmV3ZXIgYW5kIGhhcyBhIGtleSB3ZSBkb24ndFxuICAgICAgICAgICAgY29uc3QgbG9jYWwgPSBwcm9maWxlc1tsb2NhbEluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVGltZSA9IGxvY2FsLnVwZGF0ZWRBdCB8fCAwO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVGltZSA9IHNoYXJlZC5sYXN0U3luY2VkQXQgPyBuZXcgRGF0ZShzaGFyZWQubGFzdFN5bmNlZEF0KS5nZXRUaW1lKCkgOiAwO1xuXG4gICAgICAgICAgICBpZiAoc2hhcmVkVGltZSA+IGxvY2FsVGltZSAmJiBzaGFyZWQucHJpdktleSAmJiAhbG9jYWwucHJpdktleSkge1xuICAgICAgICAgICAgICAgIHByb2ZpbGVzW2xvY2FsSW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5sb2NhbCxcbiAgICAgICAgICAgICAgICAgICAgcHJpdktleTogc2hhcmVkLnByaXZLZXksXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHNoYXJlZC5uYW1lIHx8IGxvY2FsLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbGF5czogc2hhcmVkLnJlbGF5cyB8fCBsb2NhbC5yZWxheXMsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogc2hhcmVkVGltZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJvZmlsZXMsIGNoYW5nZWQgfTtcbn1cblxuLyoqXG4gKiBSZXNldCB0aGUgYXV0by1sb2NrIGluYWN0aXZpdHkgdGltZXIuXG4gKi9cbmNvbnN0IEFVVE9fTE9DS19BTEFSTSA9ICdub3N0cmtleS1hdXRvLWxvY2snO1xuXG5mdW5jdGlvbiByZXNldEF1dG9Mb2NrKCkge1xuICAgIC8vIENsZWFyIGFueSBleGlzdGluZyB0aW1lciAoc2V0VGltZW91dCBmYWxsYmFjaylcbiAgICBpZiAoYXV0b0xvY2tUaW1lcikgeyBjbGVhclRpbWVvdXQoYXV0b0xvY2tUaW1lcik7IGF1dG9Mb2NrVGltZXIgPSBudWxsOyB9XG5cbiAgICBpZiAobG9ja2VkIHx8IGF1dG9Mb2NrVGltZW91dCA8PSAwKSB7XG4gICAgICAgIC8vIE5vIHRpbWVyIG5lZWRlZCBcdTIwMTQgYWxzbyBjbGVhciBhbnkgcGVuZGluZyBhbGFybVxuICAgICAgICBhcGkuYWxhcm1zPy5jbGVhcihBVVRPX0xPQ0tfQUxBUk0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByZWZlciBjaHJvbWUuYWxhcm1zIChzdXJ2aXZlcyBNVjMgc2VydmljZS13b3JrZXIgZXZpY3Rpb24pXG4gICAgaWYgKGFwaS5hbGFybXMpIHtcbiAgICAgICAgYXBpLmFsYXJtcy5jcmVhdGUoQVVUT19MT0NLX0FMQVJNLCB7IGRlbGF5SW5NaW51dGVzOiBhdXRvTG9ja1RpbWVvdXQgLyA2MDAwMCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgYWxhcm1zIEFQSSAoU2FmYXJpIGJhY2tncm91bmQgcGFnZSlcbiAgICAgICAgYXV0b0xvY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4geyBsb2NrU2Vzc2lvbigpOyB9LCBhdXRvTG9ja1RpbWVvdXQpO1xuICAgIH1cbn1cblxuLy8gTGlzdGVuIGZvciB0aGUgYWxhcm0gdG8gZmlyZVxuaWYgKGFwaS5hbGFybXM/Lm9uQWxhcm0pIHtcbiAgICBhcGkuYWxhcm1zLm9uQWxhcm0uYWRkTGlzdGVuZXIoKGFsYXJtKSA9PiB7XG4gICAgICAgIGlmIChhbGFybS5uYW1lID09PSBBVVRPX0xPQ0tfQUxBUk0pIHtcbiAgICAgICAgICAgIGxvY2tTZXNzaW9uKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBNdXRleCB0aGF0IHNlcmlhbGl6ZXMgbG9ja1Nlc3Npb24gLyB1bmxvY2tTZXNzaW9uIHNvIHRoZSBhdXRvLWxvY2tcbiAqIHRpbWVyIGNhbGxiYWNrIGNhbm5vdCBpbnRlcmxlYXZlIHdpdGggYW4gaW4tcHJvZ3Jlc3MgdW5sb2NrLlxuICovXG5jb25zdCBzZXNzaW9uTXV0ZXggPSBuZXcgTXV0ZXgoKTtcblxuLyoqXG4gKiBMb2NrIHRoZSBzZXNzaW9uIFx1MjAxNCBjbGVhciBhbGwgZGVjcnlwdGVkIGtleXMgZnJvbSBtZW1vcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvY2tTZXNzaW9uKCkge1xuICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBzZXNzaW9uTXV0ZXguYWNxdWlyZSgpO1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghbm9zdHJBY2Nlc3NXaGlsZUxvY2tlZCkge1xuICAgICAgICAgICAgc2Vzc2lvbktleXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXNzaW9uQ3J5cHRvS2V5ID0gbnVsbDtcbiAgICAgICAgc2Vzc2lvbktleVNhbHQgPSBudWxsO1xuICAgICAgICBsb2NrZWQgPSB0cnVlO1xuICAgICAgICBpZiAoYXV0b0xvY2tUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGF1dG9Mb2NrVGltZXIpO1xuICAgICAgICAgICAgYXV0b0xvY2tUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBTZXNzaW9uIGxvY2tlZC4gS2V5cyByZXRhaW5lZDogJHtub3N0ckFjY2Vzc1doaWxlTG9ja2VkICYmIHNlc3Npb25LZXlzLnNpemUgPiAwfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbGVhc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogVW5sb2NrIHRoZSBzZXNzaW9uIFx1MjAxNCB2ZXJpZnkgcGFzc3dvcmQgYW5kIGRlY3J5cHQgYWxsIGtleXMgaW50byBtZW1vcnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVubG9ja1Nlc3Npb24ocGFzc3dvcmQpIHtcbiAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgc2Vzc2lvbk11dGV4LmFjcXVpcmUoKTtcbiAgICB0cnkge1xuICAgICAgICAvLyBCcnV0ZS1mb3JjZSBwcm90ZWN0aW9uOiBjb29sZG93biBhZnRlciAzIGZhaWxlZCBhdHRlbXB0c1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IDwgdW5sb2NrQ29vbGRvd25VbnRpbCkge1xuICAgICAgICAgICAgY29uc3Qgd2FpdFNlYyA9IE1hdGguY2VpbCgodW5sb2NrQ29vbGRvd25VbnRpbCAtIG5vdykgLyAxMDAwKTtcbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogYFRvbyBtYW55IGF0dGVtcHRzLiBUcnkgYWdhaW4gaW4gJHt3YWl0U2VjfSBzZWNvbmRzLmAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkID0gYXdhaXQgY2hlY2tQYXNzd29yZChwYXNzd29yZCk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICAgIHVubG9ja0F0dGVtcHRzKys7XG4gICAgICAgICAgICBpZiAodW5sb2NrQXR0ZW1wdHMgPj0gMykge1xuICAgICAgICAgICAgICAgIC8vIENvb2xkb3duOiAzMHMgYWZ0ZXIgMywgNjBzIGFmdGVyIDYsIDEyMHMgYWZ0ZXIgOSwgZXRjLlxuICAgICAgICAgICAgICAgIGNvbnN0IGNvb2xkb3duTXMgPSAzMDAwMCAqIE1hdGgucG93KDIsIE1hdGguZmxvb3IoKHVubG9ja0F0dGVtcHRzIC0gMykgLyAzKSk7XG4gICAgICAgICAgICAgICAgdW5sb2NrQ29vbGRvd25VbnRpbCA9IERhdGUubm93KCkgKyBjb29sZG93bk1zO1xuICAgICAgICAgICAgICAgIGxvZyhgW1NFQ1VSSVRZXSAke3VubG9ja0F0dGVtcHRzfSBmYWlsZWQgYXR0ZW1wdHMuIENvb2xkb3duOiAke2Nvb2xkb3duTXMgLyAxMDAwfXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0ludmFsaWQgcGFzc3dvcmQnIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIHVubG9ja1xuICAgICAgICB1bmxvY2tBdHRlbXB0cyA9IDA7XG4gICAgICAgIHVubG9ja0Nvb2xkb3duVW50aWwgPSAwO1xuXG4gICAgICAgIGNvbnN0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICAgICAgbGV0IG5lZWRzU2F2ZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocHJvZmlsZXNbaV0udHlwZSA9PT0gJ2J1bmtlcicpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgaGV4ID0gYXdhaXQgZ2V0RGVjcnlwdGVkUHJpdktleShwcm9maWxlc1tpXSwgcGFzc3dvcmQpO1xuICAgICAgICAgICAgc2Vzc2lvbktleXMuc2V0KGksIGhleCk7XG4gICAgICAgICAgICAvLyBDYWNoZSBwdWJLZXkgaWYgbm90IGFscmVhZHkgY2FjaGVkIChmb3IgcHJvZmlsZXMgZW5jcnlwdGVkIGJlZm9yZSB0aGlzIGZpeClcbiAgICAgICAgICAgIGlmICghcHJvZmlsZXNbaV0ucHViS2V5ICYmIGhleCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzW2ldLnB1YktleSA9IGdldFB1YmxpY0tleVN5bmMoaGV4KTtcbiAgICAgICAgICAgICAgICAgICAgbmVlZHNTYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjYWNoZSBwdWJLZXkgZm9yIHByb2ZpbGUgJHtpfTpgLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRzU2F2ZSkge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlcyB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZXJpdmUgYSBzZXNzaW9uIENyeXB0b0tleSBzbyB3ZSBuZXZlciBob2xkIHRoZSByYXcgcGFzc3dvcmQgaW4gbWVtb3J5LlxuICAgICAgICAvLyBUaGUgc2FsdCBpcyByYW5kb20gcGVyIHNlc3Npb247IGRlY3J5cHQoKSBzdGlsbCB1c2VzIHRoZSBwYXNzd29yZCBhdFxuICAgICAgICAvLyBuZXh0IHVubG9jayB0byByZS1kZXJpdmUgZnJvbSB3aGF0ZXZlciBzYWx0IHdhcyBzdG9yZWQgaW4gZWFjaCBibG9iLlxuICAgICAgICBjb25zdCBzYWx0ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xuICAgICAgICBzZXNzaW9uQ3J5cHRvS2V5ID0gYXdhaXQgZGVyaXZlS2V5KHBhc3N3b3JkLCBzYWx0KTtcbiAgICAgICAgc2Vzc2lvbktleVNhbHQgPSBzYWx0O1xuICAgICAgICAvLyBwYXNzd29yZCBpcyBub3cgb25seSBvbiB0aGUgY2FsbCBzdGFjayBhbmQgd2lsbCBiZSBHQydkXG4gICAgICAgIGxvY2tlZCA9IGZhbHNlO1xuICAgICAgICByZXNldEF1dG9Mb2NrKCk7XG4gICAgICAgIGxvZygnU2Vzc2lvbiB1bmxvY2tlZC4nKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbGVhc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZXh0ZW5zaW9uIGlzIGN1cnJlbnRseSBpbiBhIGxvY2tlZCBzdGF0ZS5cbiAqIElmIG5vIHBhc3N3b3JkIGlzIHNldCwgd2UgYXJlIG5ldmVyIGxvY2tlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tMb2NrU3RhdGUoKSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgaXNFbmNyeXB0ZWQoKTtcbiAgICBsb2coYFtjaGVja0xvY2tTdGF0ZV0gaXNFbmNyeXB0ZWQoKT0ke2VuY3J5cHRlZH0sIGxvY2tlZD0ke2xvY2tlZH1gKTtcbiAgICBpZiAoIWVuY3J5cHRlZCkge1xuICAgICAgICBsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbG9ja2VkO1xufVxuXG4vLyAtLS0gU2VuZGVyIHZhbGlkYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTRU5TSVRJVkVfS0lORFMgPSBuZXcgU2V0KFtcbiAgICAnc2V0UGFzc3dvcmQnLCAnY2hhbmdlUGFzc3dvcmQnLCAncmVtb3ZlUGFzc3dvcmQnLCAncmVzZXRBbGxEYXRhJyxcbiAgICAnc2V0QXV0b0xvY2tUaW1lb3V0JywgJ3NldE5vc3RyQWNjZXNzV2hpbGVMb2NrZWQnLCAnc2V0QmxvY2tDcm9zc09yaWdpbkZyYW1lcycsXG4gICAgJ2JhY2t1cC5leHBvcnQnLCAnYmFja3VwLmltcG9ydCcsICd1bmxvY2snLFxuXSk7XG5cbmZ1bmN0aW9uIGlzRXh0ZW5zaW9uU2VuZGVyKHNlbmRlcikge1xuICAgIC8vIE1lc3NhZ2VzIGZyb20gZXh0ZW5zaW9uIHBhZ2VzIChwb3B1cCwgc2lkZXBhbmVsLCBvcHRpb25zLCB2YXVsdCkgaGF2ZSBvdXIgSUQuXG4gICAgLy8gQ29udGVudCBzY3JpcHRzIGluamVjdCBpbnRvIHdlYiBwYWdlcyBcdTIwMTQgdGhleSBoYXZlIHNlbmRlci50YWIgYnV0IHRoZWlyIFVSTFxuICAgIC8vIGlzIHRoZSB3ZWIgcGFnZSBVUkwsIG5vdCBvdXIgZXh0ZW5zaW9uIFVSTC4gRXh0ZW5zaW9uIHBhZ2VzIG9wZW5lZCBpbiB0YWJzXG4gICAgLy8gKGxpa2UgdmF1bHQuaHRtbCkgYWxzbyBoYXZlIHNlbmRlci50YWIgYnV0IHRoZWlyIFVSTCBzdGFydHMgd2l0aCBvdXIgb3JpZ2luLlxuICAgIGlmIChzZW5kZXIuaWQgIT09IGFwaS5ydW50aW1lLmlkKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gSWYgb3BlbmVkIGluIGEgdGFiLCBjaGVjayB0aGUgVVJMIGlzIGFjdHVhbGx5IG91ciBleHRlbnNpb24gKG5vdCBhIGNvbnRlbnQgc2NyaXB0KVxuICAgIGlmIChzZW5kZXIudGFiKSB7XG4gICAgICAgIGNvbnN0IGV4dE9yaWdpbiA9IGBjaHJvbWUtZXh0ZW5zaW9uOi8vJHthcGkucnVudGltZS5pZH1gO1xuICAgICAgICBjb25zdCB1cmwgPSBzZW5kZXIudGFiLnVybCB8fCBzZW5kZXIudXJsIHx8ICcnO1xuICAgICAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoZXh0T3JpZ2luKSB8fCB1cmwuc3RhcnRzV2l0aCgnbW96LWV4dGVuc2lvbjovLycpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gLS0tIE1lc3NhZ2UgaGFuZGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5hcGkucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoKG1lc3NhZ2UsIF9zZW5kZXIsIHNlbmRSZXNwb25zZSkgPT4ge1xuICAgIGxvZyhtZXNzYWdlKTtcblxuICAgIC8vIEJsb2NrIHNlbnNpdGl2ZSBvcGVyYXRpb25zIGZyb20gbm9uLWV4dGVuc2lvbiBjb250ZXh0c1xuICAgIGlmIChTRU5TSVRJVkVfS0lORFMuaGFzKG1lc3NhZ2Uua2luZCkgJiYgIWlzRXh0ZW5zaW9uU2VuZGVyKF9zZW5kZXIpKSB7XG4gICAgICAgIGxvZyhgW1NFQ1VSSVRZXSBCbG9ja2VkICR7bWVzc2FnZS5raW5kfSBmcm9tIG5vbi1leHRlbnNpb24gc2VuZGVyYCk7XG4gICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VuYXV0aG9yaXplZCBzZW5kZXInIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgdXVpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgbGV0IHNyO1xuXG4gICAgc3dpdGNoIChtZXNzYWdlLmtpbmQpIHtcbiAgICAgICAgLy8gR2VuZXJhbFxuICAgICAgICBjYXNlICdjbG9zZVByb21wdCc6XG4gICAgICAgICAgICBwcm9tcHQucmVsZWFzZT8uKCk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWxsb3dlZCc6XG4gICAgICAgICAgICByZXNldEF1dG9Mb2NrKCk7XG4gICAgICAgICAgICBjb21wbGV0ZShtZXNzYWdlKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdkZW5pZWQnOlxuICAgICAgICAgICAgZGVueShtZXNzYWdlKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdnZW5lcmF0ZVByaXZhdGVLZXknOlxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZVByaXZhdGVLZXlfKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZ2VuZXJhdGVQcml2YXRlS2V5IGVycm9yOicsIGUpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIG1lc3NhZ2UgY2hhbm5lbCBvcGVuIGZvciBhc3luYyBzZW5kUmVzcG9uc2VcbiAgICAgICAgY2FzZSAnc2F2ZVByaXZhdGVLZXknOlxuICAgICAgICAgICAgcmVzZXRBdXRvTG9jaygpO1xuICAgICAgICAgICAgLy8gTXVzdCB1c2Ugc2VuZFJlc3BvbnNlICsgcmV0dXJuIHRydWUgKG5vdCBhIFByb21pc2UgcmV0dXJuKTogQ2hyb21lIE1WM1xuICAgICAgICAgICAgLy8gZG9lcyBub3QgZGVsaXZlciBQcm9taXNlLXJldHVybiB2YWx1ZXMgdG8gc2VuZE1lc3NhZ2UgY2FsbGVycywgc28gdGhlXG4gICAgICAgICAgICAvLyBjYWxsZXIgY291bGQgbm90IHRlbGwgd2hldGhlciB0aGUga2V5IHdhcyBhY3R1YWxseSBzYXZlZCAob3Igd2hldGhlciBpdFxuICAgICAgICAgICAgLy8gdGhyZXcpLiBUaGF0IG1hZGUgaW1wb3J0ZWQga2V5cyBzaWxlbnRseSBmYWlsIHdoaWxlIHRoZSBVSSBzaG93ZWQgc3VjY2Vzcy5cbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2F2ZVByaXZhdGVLZXkobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NhdmVQcml2YXRlS2V5IGVycm9yOicsIGUpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHNhdmUga2V5JyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2dldE5wdWInOlxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXROcHViKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZ2V0TnB1YiBlcnJvcjonLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnZ2V0TnNlYyc6XG4gICAgICAgICAgICByZXNldEF1dG9Mb2NrKCk7XG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldE5zZWMobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdnZXROc2VjIGVycm9yOicsIGUpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdjYWxjUHViS2V5JzpcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZShnZXRQdWJsaWNLZXlTeW5jKG1lc3NhZ2UucGF5bG9hZCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ25wdWJFbmNvZGUnOlxuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKG5pcDE5Lm5wdWJFbmNvZGUobWVzc2FnZS5wYXlsb2FkKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgICAgICAvLyBuYXZpZ2F0b3IuY2xpcGJvYXJkIGlzIHVuYXZhaWxhYmxlIGluIENocm9tZSBzZXJ2aWNlIHdvcmtlcnMuXG4gICAgICAgICAgICAvLyBUaGUgY2FsbGVyIChwb3B1cC9vcHRpb25zKSBzaG91bGQgaGFuZGxlIGNsaXBib2FyZCBkaXJlY3RseSB3aGVuXG4gICAgICAgICAgICAvLyBwb3NzaWJsZTsgdGhpcyBwYXRoIGlzIGtlcHQgZm9yIFNhZmFyaSBiYWNrZ3JvdW5kLXBhZ2UgY29tcGF0LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlVGV4dCkge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KG1lc3NhZ2UucGF5bG9hZCkudGhlbigoKSA9PiBzZW5kUmVzcG9uc2UodHJ1ZSkpLmNhdGNoKCgpID0+IHNlbmRSZXNwb25zZShmYWxzZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gLS0tIE1hc3RlciBwYXNzd29yZCAvIGxvY2sgaGFuZGxlcnMgLS0tXG4gICAgICAgIC8vIE5PVEU6IFRoZXNlIHVzZSBzZW5kUmVzcG9uc2UgKyByZXR1cm4gdHJ1ZSAoY2FsbGJhY2sgcGF0dGVybikgYmVjYXVzZVxuICAgICAgICAvLyBDaHJvbWUgTVYzIGRvZXMgbm90IHJlbGlhYmx5IGRlbGl2ZXIgUHJvbWlzZS1yZXR1cm4gdmFsdWVzIGZyb21cbiAgICAgICAgLy8gb25NZXNzYWdlIGxpc3RlbmVycyB0byBzZW5kTWVzc2FnZSBjYWxsZXJzLlxuICAgICAgICBjYXNlICdpc0xvY2tlZCc6XG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrTG9ja1N0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgW2lzTG9ja2VkXSBTZW5kaW5nIHJlc3BvbnNlOiAke3Jlc3VsdH1gKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2coYFtpc0xvY2tlZF0gRXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnaXNFbmNyeXB0ZWQnOlxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgc3RvcmFnZS5nZXQoeyBpc0VuY3J5cHRlZDogZmFsc2UsIHBhc3N3b3JkSGFzaDogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGBbaXNFbmNyeXB0ZWRdIHN0b3JhZ2U6IGlzRW5jcnlwdGVkPSR7ZGF0YS5pc0VuY3J5cHRlZH0sIHBhc3N3b3JkSGFzaD0ke2RhdGEucGFzc3dvcmRIYXNoID8gJ0VYSVNUUycgOiAnbnVsbCd9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5pc0VuY3J5cHRlZCAmJiBkYXRhLnBhc3N3b3JkSGFzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdbaXNFbmNyeXB0ZWRdIFNlbGYtaGVhbGluZzogcGFzc3dvcmRIYXNoIGV4aXN0cyBidXQgZmxhZz1mYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBpc0VuY3J5cHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuaXNFbmNyeXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25FbmFibGVkID0gZGF0YS5pc0VuY3J5cHRlZDtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGBbaXNFbmNyeXB0ZWRdIFNlbmRpbmcgcmVzcG9uc2U6ICR7ZW5jcnlwdGlvbkVuYWJsZWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShlbmNyeXB0aW9uRW5hYmxlZCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2coYFtpc0VuY3J5cHRlZF0gRXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnaGFzRW5jcnlwdGVkRGF0YSc6XG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzdG9yYWdlLmdldCh7IHBhc3N3b3JkSGFzaDogbnVsbCwgcHJvZmlsZXM6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNQYXNzd29yZEhhc2ggPSAhIWRhdGEucGFzc3dvcmRIYXNoO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5jcnlwdGVkUHJvZmlsZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsb2coYFtoYXNFbmNyeXB0ZWREYXRhXSBwYXNzd29yZEhhc2g9JHtoYXNQYXNzd29yZEhhc2h9LCBwcm9maWxlcz0ke0FycmF5LmlzQXJyYXkoZGF0YS5wcm9maWxlcykgPyBkYXRhLnByb2ZpbGVzLmxlbmd0aCA6ICdub3QtYXJyYXknfWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnByb2ZpbGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnByb2ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGRhdGEucHJvZmlsZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFbmMgPSBwLnByaXZLZXkgPyBpc0VuY3J5cHRlZEJsb2IocC5wcml2S2V5KSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhgW2hhc0VuY3J5cHRlZERhdGFdIHByb2ZpbGVbJHtpfV0gbmFtZT1cIiR7cC5uYW1lfVwiIHByaXZLZXk9JHtwLnByaXZLZXkgPyAoaXNFbmMgPyAnRU5DUllQVEVEJyA6ICdQTEFJTlRFWFQnKSA6ICdFTVBUWSd9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW5jKSBlbmNyeXB0ZWRQcm9maWxlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gaGFzUGFzc3dvcmRIYXNoIHx8IGVuY3J5cHRlZFByb2ZpbGVzID4gMDtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGBbaGFzRW5jcnlwdGVkRGF0YV0gUmVzdWx0OiBmb3VuZD0ke2ZvdW5kfSwgaGFzUGFzc3dvcmRIYXNoPSR7aGFzUGFzc3dvcmRIYXNofSwgZW5jcnlwdGVkUHJvZmlsZXM9JHtlbmNyeXB0ZWRQcm9maWxlc31gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICYmICFlbmNyeXB0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdbaGFzRW5jcnlwdGVkRGF0YV0gU2VsZi1oZWFsaW5nOiBzZXR0aW5nIGlzRW5jcnlwdGVkPXRydWUsIGxvY2tlZD10cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNldCh7IGlzRW5jcnlwdGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbkVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBmb3VuZCwgaGFzUGFzc3dvcmRIYXNoLCBlbmNyeXB0ZWRQcm9maWxlcyB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2hhc0VuY3J5cHRlZERhdGEgZXJyb3I6JywgZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IGZvdW5kOiBmYWxzZSwgaGFzUGFzc3dvcmRIYXNoOiBmYWxzZSwgZW5jcnlwdGVkUHJvZmlsZXM6IDAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICd1bmxvY2snOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCAoKSA9PiB1bmxvY2tTZXNzaW9uKG1lc3NhZ2UucGF5bG9hZCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2xvY2snOlxuICAgICAgICAgICAgbG9ja1Nlc3Npb24oKS50aGVuKCgpID0+IHNlbmRSZXNwb25zZSh0cnVlKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnc2V0UGFzc3dvcmQnOlxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSBwdWJLZXlzIGJlZm9yZSBlbmNyeXB0aW9uIChuZWVkIHBsYWludGV4dCBrZXlzKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWNoZVB1YktleXNGb3JBbGxQcm9maWxlcygpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbmNyeXB0QWxsS2V5cyhtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVubG9ja1Nlc3Npb24obWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHBhc3N3b3JkIHN0YXRlIGNoYW5nZSB0byBhbGwgdmlld3NcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBraW5kOiAncGFzc3dvcmRTdGF0ZUNoYW5nZWQnLCBoYXNQYXNzd29yZDogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGFwaS5ydW50aW1lLnNlbmRNZXNzYWdlKHsga2luZDogJ2JhY2t1cE5lZWRlZCcgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnY2hhbmdlUGFzc3dvcmQnOlxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IGNoZWNrUGFzc3dvcmQob2xkUGFzc3dvcmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdJbnZhbGlkIGN1cnJlbnQgcGFzc3dvcmQnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNoYW5nZVBhc3N3b3JkRm9yS2V5cyhvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmxvY2tTZXNzaW9uKG5ld1Bhc3N3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHBhc3N3b3JkIHN0YXRlIGNoYW5nZSB0byBhbGwgdmlld3NcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBraW5kOiAncGFzc3dvcmRTdGF0ZUNoYW5nZWQnLCBoYXNQYXNzd29yZDogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGFwaS5ydW50aW1lLnNlbmRNZXNzYWdlKHsga2luZDogJ2JhY2t1cE5lZWRlZCcgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncmVtb3ZlUGFzc3dvcmQnOlxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVQYXNzd29yZFByb3RlY3Rpb24obWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbktleXMuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNyeXB0b0tleSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25LZXlTYWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJyb2FkY2FzdCBwYXNzd29yZCBzdGF0ZSBjaGFuZ2UgdG8gYWxsIHZpZXdzXG4gICAgICAgICAgICAgICAgICAgIGFwaS5ydW50aW1lLnNlbmRNZXNzYWdlKHsga2luZDogJ3Bhc3N3b3JkU3RhdGVDaGFuZ2VkJywgaGFzUGFzc3dvcmQ6IGZhbHNlIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncmVzZXRBbGxEYXRhJzpcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGV4dGVuc2lvbiBkYXRhIGFuZCByZXNldCB0byBmcmVzaCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdG9yYWdlLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25LZXlzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25DcnlwdG9LZXkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uS2V5U2FsdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBub3N0ckFjY2Vzc1doaWxlTG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZS1pbml0aWFsaXplIHdpdGggZGVmYXVsdCBwcm9maWxlXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzOiBbeyBuYW1lOiAnRGVmYXVsdCBOb3N0ciBQcm9maWxlJywgcHJpdktleTogJycsIHB1YktleTogJycgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0VuY3J5cHRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhhc2g6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZFNhbHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhcGkucnVudGltZS5zZW5kTWVzc2FnZSh7IGtpbmQ6ICdkYXRhUmVzZXQnIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnc2V0QXV0b0xvY2tUaW1lb3V0Jzoge1xuICAgICAgICAgICAgY29uc3QgQUxMT1dFRF9MT0NLX01JTlVURVMgPSBbMCwgNSwgMTUsIDMwLCA2MCwgOTAsIDE4MF07XG4gICAgICAgICAgICBjb25zdCBtaW5zID0gTnVtYmVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgICBpZiAoIUFMTE9XRURfTE9DS19NSU5VVEVTLmluY2x1ZGVzKG1pbnMpKSB7XG4gICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF1dG9Mb2NrVGltZW91dCA9IG1pbnMgKiA2MCAqIDEwMDA7XG4gICAgICAgICAgICBzdG9yYWdlLnNldCh7IGF1dG9Mb2NrTWludXRlczogbWlucyB9KTtcbiAgICAgICAgICAgIHJlc2V0QXV0b0xvY2soKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dldEF1dG9Mb2NrVGltZW91dCc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGF1dG9Mb2NrTWludXRlcyB9ID0gYXdhaXQgc3RvcmFnZS5nZXQoeyBhdXRvTG9ja01pbnV0ZXM6IDE1IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhdXRvTG9ja01pbnV0ZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdyZXNldEF1dG9Mb2NrJzpcbiAgICAgICAgICAgIHJlc2V0QXV0b0xvY2soKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIC0tLSBOb3N0ciBhY2Nlc3Mgd2hpbGUgbG9ja2VkIC0tLVxuICAgICAgICBjYXNlICdnZXROb3N0ckFjY2Vzc1doaWxlTG9ja2VkJzpcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZShub3N0ckFjY2Vzc1doaWxlTG9ja2VkKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdzZXROb3N0ckFjY2Vzc1doaWxlTG9ja2VkJzpcbiAgICAgICAgICAgIG5vc3RyQWNjZXNzV2hpbGVMb2NrZWQgPSAhIW1lc3NhZ2UucGF5bG9hZDtcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0KHsgbm9zdHJBY2Nlc3NXaGlsZUxvY2tlZDogISFtZXNzYWdlLnBheWxvYWQgfSk7XG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2UucGF5bG9hZCAmJiBsb2NrZWQpIHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uS2V5cy5jbGVhcigpOyAgLy8gVHVybmluZyBPRkYgd2hpbGUgbG9ja2VkID0gY2xlYXIga2V5cyBpbW1lZGlhdGVseVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2dldEJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXMnOlxuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKGJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3NldEJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXMnOlxuICAgICAgICAgICAgYmxvY2tDcm9zc09yaWdpbkZyYW1lcyA9ICEhbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgc3RvcmFnZS5zZXQoeyBibG9ja0Nyb3NzT3JpZ2luRnJhbWVzOiAhIW1lc3NhZ2UucGF5bG9hZCB9KTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdnZXRBY3RpdmVQcm9maWxlSW5mbyc6XG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IHByb2ZpbGVzW3BpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1tnZXRBY3RpdmVQcm9maWxlSW5mb10gTm8gcHJvZmlsZSBmb3VuZCBhdCBpbmRleCAnICsgcGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgbmFtZTogJ1Vua25vd24nLCBucHViOiAnJywgaGFzS2V5czogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG5wdWIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicgJiYgcHJvZmlsZS5yZW1vdGVQdWJrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5wdWIgPSBuaXAxOS5ucHViRW5jb2RlKHByb2ZpbGUucmVtb3RlUHVia2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlLnB1YktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnB1YiA9IG5pcDE5Lm5wdWJFbmNvZGUocHJvZmlsZS5wdWJLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHByb2ZpbGUubmFtZSB8fCAnVW5uYW1lZCBQcm9maWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5wdWIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNLZXlzOiBzZXNzaW9uS2V5cy5oYXMocGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNCdW5rZXI6IHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxvZygnW2dldEFjdGl2ZVByb2ZpbGVJbmZvXSBTZW5kaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdbZ2V0QWN0aXZlUHJvZmlsZUluZm9dIEVycm9yOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgbmFtZTogJ0Vycm9yJywgbnB1YjogJycsIGhhc0tleXM6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyAtLS0gTklQLTQ5IG5jcnlwdHNlYyBoYW5kbGVycyAtLS1cbiAgICAgICAgY2FzZSAnbmNyeXB0c2VjLmRlY3J5cHQnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuY3J5cHRzZWMsIHBhc3N3b3JkIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhleEtleSA9IGJ5dGVzVG9IZXgobmlwNDlEZWNyeXB0KG5jcnlwdHNlYywgcGFzc3dvcmQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgaGV4S2V5IH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB8fCAnRGVjcnlwdGlvbiBmYWlsZWQnIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnbmNyeXB0c2VjLmVuY3J5cHQnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9maWxlSW5kZXg6IGVpLCBwYXNzd29yZCB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShlaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlPy50eXBlID09PSAnYnVua2VyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnQ2Fubm90IGV4cG9ydCBidW5rZXIgcHJvZmlsZSBhcyBuY3J5cHRzZWMnIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGV4S2V5ID0gYXdhaXQgZ2V0UGxhaW50ZXh0UHJpdktleShlaSwgcHJvZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5jcnlwdHNlYyA9IG5pcDQ5RW5jcnlwdChoZXhUb0J5dGVzKGhleEtleSksIHBhc3N3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgbmNyeXB0c2VjIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB8fCAnRW5jcnlwdGlvbiBmYWlsZWQnIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyAtLS0gQklQMzkgU2VlZCBQaHJhc2UgaGFuZGxlcnMgLS0tXG4gICAgICAgIGNhc2UgJ3NlZWRQaHJhc2UuZnJvbUtleSc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlaSA9IG1lc3NhZ2UucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoZWkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZT8udHlwZSA9PT0gJ2J1bmtlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0Nhbm5vdCBleHBvcnQgYnVua2VyIHByb2ZpbGUgYXMgc2VlZCBwaHJhc2UnIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGV4S2V5ID0gYXdhaXQgZ2V0UGxhaW50ZXh0UHJpdktleShlaSwgcHJvZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZWRQaHJhc2UgPSBrZXlUb1NlZWRQaHJhc2UoaGV4S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgc2VlZFBocmFzZSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBnZW5lcmF0ZSBzZWVkIHBocmFzZScgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdzZWVkUGhyYXNlLnRvS2V5JzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaGV4S2V5LCBwdWJLZXkgfSA9IHNlZWRQaHJhc2VUb0tleShtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBoZXhLZXksIHB1YktleSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfHwgJ0ludmFsaWQgc2VlZCBwaHJhc2UnIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnc2VlZFBocmFzZS52YWxpZGF0ZSc6XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoaXNWYWxpZFNlZWRQaHJhc2UobWVzc2FnZS5wYXlsb2FkKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyAtLS0gTklQLTQ2IEJ1bmtlciBoYW5kbGVycyAtLS1cbiAgICAgICAgY2FzZSAnZ2V0UHJvZmlsZVR5cGUnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGkgPSBtZXNzYWdlLnBheWxvYWQgPz8gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocGkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlPy50eXBlIHx8ICdsb2NhbCc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdidW5rZXIuY29ubmVjdCc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHByb2ZpbGVJbmRleDogYmksIGJ1bmtlclVybCB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgY3JlYXRlU2Vzc2lvbihiaSwgYnVua2VyVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3RlUHVia2V5ID0gYXdhaXQgc2Vzc2lvbi5nZXRQdWJsaWNLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhd2FpdCBnZXRQcm9maWxlcygpO1xuICAgICAgICAgICAgICAgICAgICBwcm9maWxlc1tiaV0ucmVtb3RlUHVia2V5ID0gcmVtb3RlUHVia2V5O1xuICAgICAgICAgICAgICAgICAgICBwcm9maWxlc1tiaV0uYnVua2VyVXJsID0gYnVua2VyVXJsO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNldCh7IHByb2ZpbGVzIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCByZW1vdGVQdWJrZXkgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYnVua2VyLmRpc2Nvbm5lY3QnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmkgPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc2Nvbm5lY3RTZXNzaW9uKGJpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdidW5rZXIuc3RhdHVzJzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpID0gbWVzc2FnZS5wYXlsb2FkID8/IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGNvbm5lY3RlZDogaXNTZXNzaW9uQWN0aXZlKGJpKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYnVua2VyLnBpbmcnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmkgPSBtZXNzYWdlLnBheWxvYWQgPz8gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRPckNyZWF0ZVNlc3Npb24oYmkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLnBpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0IH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2J1bmtlci52YWxpZGF0ZVVybCc6XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UodmFsaWRhdGVCdW5rZXJVcmwobWVzc2FnZS5wYXlsb2FkKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyAtLS0gQnVua2VyIFNlcnZlciBoYW5kbGVycyAoZXh0ZW5zaW9uIGFjdHMgYXMgTklQLTQ2IHNpZ25lcikgLS0tXG4gICAgICAgIGNhc2UgJ2J1bmtlclNlcnZlci5zdGFydCc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlQnVua2VyU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVCdW5rZXJTZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQnVua2VyU2VydmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWJrZXkgPSBhd2FpdCBnZXRQdWJLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXlVcmxzID0gbWVzc2FnZS5wYXlsb2FkPy5yZWxheVVybHMgfHwgWyd3c3M6Ly9yZWxheS5ub3N0cmtleS5jb20nXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjcmV0ID0gY3J5cHRvLnJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csICcnKS5zbGljZSgwLCAxNik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlciA9IG5ldyBCdW5rZXJTZXJ2ZXIoeyByZWxheVVybHMsIHVzZXJQdWJrZXk6IHB1YmtleSwgc2VjcmV0IH0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoeyBnZXRQcml2S2V5IH0pO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVCdW5rZXJTZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHVyaTogc2VydmVyLmdldENvbm5lY3Rpb25TdHJpbmcoKSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdidW5rZXJTZXJ2ZXIuc3RvcCc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlQnVua2VyU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJ1bmtlclNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJ1bmtlclNlcnZlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2J1bmtlclNlcnZlci5zdGF0dXMnOlxuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6ICEhYWN0aXZlQnVua2VyU2VydmVyPy5hY3RpdmUsXG4gICAgICAgICAgICAgICAgdXJpOiBhY3RpdmVCdW5rZXJTZXJ2ZXI/LmdldENvbm5lY3Rpb25TdHJpbmcoKSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGNsaWVudENvdW50OiBhY3RpdmVCdW5rZXJTZXJ2ZXI/LmF1dGhlbnRpY2F0ZWRDbGllbnRzLnNpemUgfHwgMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gLS0tIFZhdWx0IGhhbmRsZXJzIC0tLVxuICAgICAgICBjYXNlICd2YXVsdC5wdWJsaXNoJzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcGF0aCwgY29udGVudCB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWJrZXkgPSBhd2FpdCBnZXRQdWJLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgbmlwNDRFbmNyeXB0KHsgcHViS2V5OiBwdWJrZXksIHBsYWluVGV4dDogY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgPSBidWlsZFZhdWx0RXZlbnQocGF0aCwgZW5jcnlwdGVkKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaSA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShwaSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWduZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0T3JDcmVhdGVTZXNzaW9uKHBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCA9IGF3YWl0IHNlc3Npb24uc2lnbkV2ZW50KHVuc2lnbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrID0gYXdhaXQgZ2V0UHJpdktleSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkID0gYXdhaXQgZmluYWxpemVFdmVudCh1bnNpZ25lZCwgc2spO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd2l0aFJlbGF5cygnd3JpdGUnLCBhc3luYyAocmVsYXlzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF5IG9mIHJlbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbGF5LnB1Ymxpc2goc2lnbmVkKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGV2ZW50SWQ6IHNpZ25lZC5pZCwgY3JlYXRlZEF0OiBzaWduZWQuY3JlYXRlZF9hdCB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICd2YXVsdC5mZXRjaCc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWJrZXkgPSBhd2FpdCBnZXRQdWJLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gYnVpbGRWYXVsdEZpbHRlcihwdWJrZXkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxFdmVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3aXRoUmVsYXlzKCdyZWFkJywgYXN5bmMgKHJlbGF5cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyUmVsYXkgPSByZWxheXMubWFwKHJlbGF5ID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViSWQgPSBgdmF1bHQtJHtjcnlwdG8ucmFuZG9tVVVJRCgpLnNsaWNlKDAsIDgpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyByZWxheS51bnN1YnNjcmliZShzdWJJZCk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxNTAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxheS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50KSA9PiB7IGFsbEV2ZW50cy5wdXNoKGV2ZW50KTsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVsYXkudW5zdWJzY3JpYmUoc3ViSWQpOyB9IGNhdGNoIChfKSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHBlclJlbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGUgYnkgZC10YWcgXHUyMDE0IGxhdGVzdCBjcmVhdGVkX2F0IHdpbnMgKE5JUC0zMylcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnlEdGFnID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGFsbEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VWYXVsdEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYnlEdGFnLmdldChwYXJzZWQucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IHBhcnNlZC5jcmVhdGVkQXQgPiBleGlzdGluZy5jcmVhdGVkQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieUR0YWcuc2V0KHBhcnNlZC5wYXRoLCB7IGV2ZW50LCBwYXJzZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWNyeXB0IGVhY2ggZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHB1YmtleV8gPSBhd2FpdCBnZXRQdWJLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IGV2ZW50LCBwYXJzZWQgfSBvZiBieUR0YWcudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgbmlwNDREZWNyeXB0KHsgcHViS2V5OiBwdWJrZXlfLCBjaXBoZXJUZXh0OiBldmVudC5jb250ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcGFyc2VkLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGRlY3J5cHRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBwYXJzZWQuY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBwYXJzZWQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGRvY3VtZW50cyB3ZSBjYW4ndCBkZWNyeXB0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZG9jdW1lbnRzIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3ZhdWx0LmRlbGV0ZSc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHBhdGgsIGV2ZW50SWQgfSA9IG1lc3NhZ2UucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgPSBidWlsZFZhdWx0RGVsZXRpb24oZXZlbnRJZCwgcGF0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGkgPSBhd2FpdCBnZXRQcm9maWxlSW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocGkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2lnbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS50eXBlID09PSAnYnVua2VyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldE9yQ3JlYXRlU2Vzc2lvbihwaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgPSBhd2FpdCBzZXNzaW9uLnNpZ25FdmVudCh1bnNpZ25lZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzayA9IGF3YWl0IGdldFByaXZLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCA9IGF3YWl0IGZpbmFsaXplRXZlbnQodW5zaWduZWQsIHNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdpdGhSZWxheXMoJ3dyaXRlJywgYXN5bmMgKHJlbGF5cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxheSBvZiByZWxheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyByZWxheS5wdWJsaXNoKHNpZ25lZCk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3ZhdWx0LmdldFJlbGF5cyc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgY3VycmVudFByb2ZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXlzID0gcHJvZmlsZS5yZWxheXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWQgPSByZWxheXMuZmlsdGVyKHIgPT4gci5yZWFkKS5tYXAociA9PiByLnVybCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlID0gcmVsYXlzLmZpbHRlcihyID0+IHIud3JpdGUpLm1hcChyID0+IHIudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVhZCwgd3JpdGUgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlYWQ6IFtdLCB3cml0ZTogW10gfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIC0tLSBBUEkgS2V5IFZhdWx0IGhhbmRsZXJzIC0tLVxuICAgICAgICBjYXNlICdhcGlrZXlzLnB1Ymxpc2gnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBrZXlzIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IGdldFB1YktleSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFpblRleHQgPSBKU09OLnN0cmluZ2lmeShrZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgbmlwNDRFbmNyeXB0KHsgcHViS2V5OiBwdWJrZXksIHBsYWluVGV4dCB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgPSBidWlsZFZhdWx0RXZlbnQoJ3ZhdWx0L2FwaS1rZXlzJywgZW5jcnlwdGVkKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaSA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShwaSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWduZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0T3JDcmVhdGVTZXNzaW9uKHBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCA9IGF3YWl0IHNlc3Npb24uc2lnbkV2ZW50KHVuc2lnbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrID0gYXdhaXQgZ2V0UHJpdktleSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkID0gYXdhaXQgZmluYWxpemVFdmVudCh1bnNpZ25lZCwgc2spO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd2l0aFJlbGF5cygnd3JpdGUnLCBhc3luYyAocmVsYXlzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF5IG9mIHJlbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbGF5LnB1Ymxpc2goc2lnbmVkKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGV2ZW50SWQ6IHNpZ25lZC5pZCwgY3JlYXRlZEF0OiBzaWduZWQuY3JlYXRlZF9hdCB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhcGlrZXlzLmZldGNoJzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IGdldFB1YktleSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kczogWzMwMDc4XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcnM6IFtwdWJrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgJyNkJzogWydub3N0cmtleTp2YXVsdC9hcGkta2V5cyddLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxFdmVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3aXRoUmVsYXlzKCdyZWFkJywgYXN5bmMgKHJlbGF5cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyUmVsYXkgPSByZWxheXMubWFwKHJlbGF5ID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViSWQgPSBgYXBpa2V5cy0ke2NyeXB0by5yYW5kb21VVUlEKCkuc2xpY2UoMCwgOCl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbGF5LnVuc3Vic2NyaWJlKHN1YklkKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDE1MDAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF5LnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IHsgYWxsRXZlbnRzLnB1c2goZXZlbnQpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyByZWxheS51bnN1YnNjcmliZShzdWJJZCk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGVyUmVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIGxhdGVzdCBieSBjcmVhdGVkX2F0IChzaW5nbGUgZC10YWcsIE5JUC0zMyBkZWR1cClcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhdGVzdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgYWxsRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhdGVzdCB8fCBldmVudC5jcmVhdGVkX2F0ID4gbGF0ZXN0LmNyZWF0ZWRfYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF0ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBrZXlzOiBudWxsLCBldmVudElkOiBudWxsLCBjcmVhdGVkQXQ6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IG5pcDQ0RGVjcnlwdCh7IHB1YktleTogcHVia2V5LCBjaXBoZXJUZXh0OiBsYXRlc3QuY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IEpTT04ucGFyc2UoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwga2V5cywgZXZlbnRJZDogbGF0ZXN0LmlkLCBjcmVhdGVkQXQ6IGxhdGVzdC5jcmVhdGVkX2F0IH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2FwaWtleXMuZGVsZXRlJzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZXZlbnRJZCB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCA9IGJ1aWxkVmF1bHREZWxldGlvbihldmVudElkLCAndmF1bHQvYXBpLWtleXMnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaSA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShwaSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWduZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0T3JDcmVhdGVTZXNzaW9uKHBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCA9IGF3YWl0IHNlc3Npb24uc2lnbkV2ZW50KHVuc2lnbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrID0gYXdhaXQgZ2V0UHJpdktleSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkID0gYXdhaXQgZmluYWxpemVFdmVudCh1bnNpZ25lZCwgc2spO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd2l0aFJlbGF5cygnd3JpdGUnLCBhc3luYyAocmVsYXlzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF5IG9mIHJlbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IHJlbGF5LnB1Ymxpc2goc2lnbmVkKTsgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYXBpa2V5cy5lbmNyeXB0JzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcGxhaW5UZXh0IH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IGdldFB1YktleSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaXBoZXJUZXh0ID0gYXdhaXQgbmlwNDRFbmNyeXB0KHsgcHViS2V5OiBwdWJrZXksIHBsYWluVGV4dCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgY2lwaGVyVGV4dCB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhcGlrZXlzLmRlY3J5cHQnOlxuICAgICAgICAgICAgcmVwbHkoc2VuZFJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBjaXBoZXJUZXh0IH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IGdldFB1YktleSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFpblRleHQgPSBhd2FpdCBuaXA0NERlY3J5cHQoeyBwdWJLZXk6IHB1YmtleSwgY2lwaGVyVGV4dCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgcGxhaW5UZXh0IH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gLS0tIEVuY3J5cHRlZCB2YXVsdCBiYWNrdXAgLyByZXN0b3JlIC0tLVxuICAgICAgICBjYXNlICdiYWNrdXAuZXhwb3J0JzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEJhY2t1cHMgYXJlIGVuY3J5cHRlZCB3aXRoIGEgZGVkaWNhdGVkIGJhY2t1cCBwYXNzd29yZCBzdXBwbGllZCBhdFxuICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB0aW1lIFx1MjAxNCBOT1QgdGhlIGluLW1lbW9yeSBzZXNzaW9uIGtleS4gVGhpcyBsZXRzIHVzZXJzIHdpdGggbm9cbiAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgcGFzc3dvcmQgY3JlYXRlIGJhY2t1cHMsIGFuZCB3b3JrcyBldmVuIHdoaWxlIGxvY2tlZCAodGhlXG4gICAgICAgICAgICAgICAgLy8gc3RvcmVkIGtleSBibG9icyBzdGF5IGVuY3J5cHRlZCBhbmQgZ2V0IHdyYXBwZWQgYWdhaW4gaGVyZSkuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFzc3dvcmQgPSBtZXNzYWdlLnBheWxvYWQ/LnBhc3N3b3JkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICdzdHJpbmcnIHx8IHBhc3N3b3JkLmxlbmd0aCA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnQSBiYWNrdXAgcGFzc3dvcmQgb2YgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGlzIHJlcXVpcmVkJyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgc3RvcmFnZS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBwcm9maWxlczogW10sXG4gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVJbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgaXNFbmNyeXB0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhhc2g6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkU2FsdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYXBpS2V5VmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhdWx0RG9jczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbm9zdHJBY2Nlc3NXaGlsZUxvY2tlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrQ3Jvc3NPcmlnaW5GcmFtZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9Mb2NrTWludXRlczogMTUsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhaW50ZXh0ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgZW5jcnlwdEJsb2IocGxhaW50ZXh0LCBwYXNzd29yZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IGFwaS5ydW50aW1lLmdldE1hbmlmZXN0Py4oKT8udmVyc2lvbiB8fCAndW5rbm93bic7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ25vc3Rya2V5LWJhY2t1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25WZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUNvdW50OiBBcnJheS5pc0FycmF5KGRhdGEucHJvZmlsZXMpID8gZGF0YS5wcm9maWxlcy5sZW5ndGggOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogSlNPTi5wYXJzZShlbmNyeXB0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdiYWNrdXAuaW1wb3J0JzpcbiAgICAgICAgICAgIHJlcGx5KHNlbmRSZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZW52ZWxvcGUsIHBhc3N3b3JkIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW52ZWxvcGUgfHwgZW52ZWxvcGUuZm9ybWF0ICE9PSAnbm9zdHJrZXktYmFja3VwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnTm90IGEgdmFsaWQgTm9zdHJLZXkgYmFja3VwIGZpbGUnIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnZlbG9wZS52ZXJzaW9uICE9PSAnbnVtYmVyJyB8fCBlbnZlbG9wZS52ZXJzaW9uID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnQmFja3VwIHZlcnNpb24gbm90IHN1cHBvcnRlZC4gVXBkYXRlIE5vc3RyS2V5IGFuZCB0cnkgYWdhaW4uJyB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWRTdHIgPSBKU09OLnN0cmluZ2lmeShlbnZlbG9wZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYWludGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dCA9IGF3YWl0IGRlY3J5cHRCbG9iKHBheWxvYWRTdHIsIHBhc3N3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnV3JvbmcgcGFzc3dvcmQgXHUyMDE0IGNvdWxkIG5vdCBkZWNyeXB0IGJhY2t1cCcgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShwbGFpbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSBhbGwgYmFja2VkLXVwIGtleXMgdG8gc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNldChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGluLW1lbW9yeSBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uRW5hYmxlZCA9ICEhZGF0YS5pc0VuY3J5cHRlZDtcbiAgICAgICAgICAgICAgICAgICAgbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlcml2ZSBzZXNzaW9uIGtleSBmcm9tIHBhc3N3b3JkLCB0aGVuIGxldCBwYXNzd29yZCBmYWxsIG91dCBvZiBzY29wZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRTYWx0ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpO1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ3J5cHRvS2V5ID0gYXdhaXQgZGVyaXZlS2V5KHBhc3N3b3JkLCBpbXBvcnRTYWx0KTtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbktleVNhbHQgPSBpbXBvcnRTYWx0O1xuICAgICAgICAgICAgICAgICAgICBub3N0ckFjY2Vzc1doaWxlTG9ja2VkID0gZGF0YS5ub3N0ckFjY2Vzc1doaWxlTG9ja2VkICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tDcm9zc09yaWdpbkZyYW1lcyA9IGRhdGEuYmxvY2tDcm9zc09yaWdpbkZyYW1lcyAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5hdXRvTG9ja01pbnV0ZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvTG9ja1RpbWVvdXQgPSBkYXRhLmF1dG9Mb2NrTWludXRlcyAqIDYwICogMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBQb3B1bGF0ZSBzZXNzaW9uIGtleSBjYWNoZVxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uS2V5cy5jbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnByb2ZpbGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnByb2ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGRhdGEucHJvZmlsZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gJ2J1bmtlcicgfHwgIXAucHJpdktleSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW5jcnlwdGVkQmxvYihwLnByaXZLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZXggPSBhd2FpdCBkZWNyeXB0QmxvYihwLnByaXZLZXksIHBhc3N3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25LZXlzLnNldChpLCBoZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25LZXlzLnNldChpLCBwLnByaXZLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNldEF1dG9Mb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVDb3VudCA9IEFycmF5LmlzQXJyYXkoZGF0YS5wcm9maWxlcykgPyBkYXRhLnByb2ZpbGVzLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHByb2ZpbGVDb3VudCB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfHwgJ1Jlc3RvcmUgZmFpbGVkJyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gbm9zdHI6IHByb3RvY29sIFVSTCBoYW5kbGVyIFx1MjAxNCBubyBrZXkgYWNjZXNzIG5lZWRlZCwgbm8gcGVybWlzc2lvbiBwcm9tcHRcbiAgICAgICAgY2FzZSAncmVwbGFjZVVSTCc6XG4gICAgICAgICAgICByZXBseShzZW5kUmVzcG9uc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByb3RvY29sX2hhbmRsZXIgfSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KFsncHJvdG9jb2xfaGFuZGxlciddKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3RvY29sX2hhbmRsZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHVybC5zcGxpdCgnbm9zdHI6JylbMV07XG4gICAgICAgICAgICAgICAgaWYgKCFyYXcpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gbmlwMTkuZGVjb2RlKHJhdyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZGVjb2RlZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnRzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgICAgICAgICAgICAgaHJwOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGV4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT09ICduYWRkcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZGVjb2RlZC5hdXRob3IgfHwgcmF3KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChkYXRhIHx8IHJhdyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwX29yX2U6IHsgbnB1YjogJ3AnLCBub3RlOiAnZScsIG5wcm9maWxlOiAncCcsIG5ldmVudDogJ2UnLCBuYWRkcjogJ2EnIH1bdHlwZV0gfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1X29yX246IHsgbnB1YjogJ3UnLCBub3RlOiAnbicsIG5wcm9maWxlOiAndScsIG5ldmVudDogJ24nLCBuYWRkcjogJ24nIH1bdHlwZV0gfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxheTA6IGRlY29kZWQucmVsYXlzPy5bMF0gfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxheTE6IGRlY29kZWQucmVsYXlzPy5bMV0gfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxheTI6IGRlY29kZWQucmVsYXlzPy5bMl0gfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBwcm90b2NvbF9oYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVwbGFjZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHsgKiR7cGF0dGVybn0gKlxcXFx9YCwgJ2cnKSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIHdpbmRvdy5ub3N0clxuICAgICAgICBjYXNlICdnZXRQdWJLZXknOlxuICAgICAgICBjYXNlICdzaWduRXZlbnQnOlxuICAgICAgICBjYXNlICduaXAwNC5lbmNyeXB0JzpcbiAgICAgICAgY2FzZSAnbmlwMDQuZGVjcnlwdCc6XG4gICAgICAgIGNhc2UgJ25pcDQ0LmVuY3J5cHQnOlxuICAgICAgICBjYXNlICduaXA0NC5kZWNyeXB0JzpcbiAgICAgICAgY2FzZSAnZ2V0UmVsYXlzJzpcbiAgICAgICAgY2FzZSAnYWRkUmVsYXknOlxuICAgICAgICBjYXNlICdleHBvcnRQcm9maWxlJzpcbiAgICAgICAgICAgIHZhbGlkYXRpb25zW3V1aWRdID0gc2VuZFJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbGlkYXRpb25zKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nUXVldWUgPSB7IHRvdGFsOiAwLCBwcm9jZXNzZWQ6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlbmRpbmdRdWV1ZS50b3RhbCsrO1xuICAgICAgICAgICAgYXNrKHV1aWQsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSDQgZml4OiBkZW55IHBlbmRpbmcgcmVxdWVzdCBvbiB0aW1lb3V0IGluc3RlYWQgb2Ygc2lsZW50bHkgcmVsZWFzaW5nXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25zW3V1aWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbnkoeyBwYXlsb2FkOiB1dWlkLCBvcmlnS2luZDogbWVzc2FnZS5raW5kLCBob3N0OiBtZXNzYWdlLmhvc3QgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb21wdC5yZWxlYXNlPy4oKTtcbiAgICAgICAgICAgIH0sIDEwXzAwMCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gZm9yY2VSZWxlYXNlKCkge1xuICAgIGlmIChwcm9tcHQudGFiSWQgIT09IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBwcm9tcHQgaXMgc3RpbGwgb3BlbiwgdGhlbiB0aGlzIHdvbid0IGRvIGFueXRoaW5nLlxuICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgb3BlbiwgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciBhbmQgZ2V0IGNhdWdodC5cbiAgICAgICAgICAgIGF3YWl0IGFwaS50YWJzLmdldChwcm9tcHQudGFiSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHRhYiBpcyBjbG9zZWQsIGJ1dCBzb21laG93IGVzY2FwZWQgb3VyIGV2ZW50IGhhbmRsaW5nLCB3ZSBjYW4gY2xlYW4gaXQgdXAgaGVyZVxuICAgICAgICAgICAgLy8gYmVmb3JlIGF0dGVtcHRpbmcgdG8gb3BlbiB0aGUgbmV4dCB0YWIuXG4gICAgICAgICAgICBwcm9tcHQucmVsZWFzZT8uKCk7XG4gICAgICAgICAgICBwcm9tcHQudGFiSWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByaXZhdGVLZXlfKCkge1xuICAgIGNvbnN0IGtleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUtleVBhaXIoKTtcbiAgICByZXR1cm4ga2V5UGFpci5wcml2YXRlS2V5O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc2sodXVpZCwgeyBraW5kLCBob3N0LCBwYXlsb2FkIH0pIHtcbiAgICAvLyBSYXRlIGxpbWl0IHBlcm1pc3Npb24gcmVxdWVzdHMgcGVyIG9yaWdpbiBcdTIwMTQgcHJldmVudCBzcGFtIGZyb20gbWFsaWNpb3VzIHBhZ2VzXG4gICAgaWYgKGhvc3QpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmF0ZUVudHJ5ID0gcGVybWlzc2lvblJhdGVNYXAuZ2V0KGhvc3QpIHx8IHsgY291bnQ6IDAsIHJlc2V0QXQ6IG5vdyArIDYwMDAwIH07XG4gICAgICAgIGlmIChub3cgPiByYXRlRW50cnkucmVzZXRBdCkge1xuICAgICAgICAgICAgcmF0ZUVudHJ5LmNvdW50ID0gMDtcbiAgICAgICAgICAgIHJhdGVFbnRyeS5yZXNldEF0ID0gbm93ICsgNjAwMDA7XG4gICAgICAgIH1cbiAgICAgICAgcmF0ZUVudHJ5LmNvdW50Kys7XG4gICAgICAgIHBlcm1pc3Npb25SYXRlTWFwLnNldChob3N0LCByYXRlRW50cnkpO1xuXG4gICAgICAgIGlmIChyYXRlRW50cnkuY291bnQgPiA1KSB7XG4gICAgICAgICAgICBsb2coYFtTRUNVUklUWV0gUmF0ZSBsaW1pdGVkICR7aG9zdH0gXHUyMDE0ICR7cmF0ZUVudHJ5LmNvdW50fSByZXF1ZXN0cyBpbiA2MHNgKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbmRSZXNwb25zZSA9IHZhbGlkYXRpb25zW3V1aWRdO1xuICAgICAgICAgICAgZGVsZXRlIHZhbGlkYXRpb25zW3V1aWRdO1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlPy4oeyBlcnJvcjogJ3JhdGVfbGltaXRlZCcsIG1lc3NhZ2U6ICdUb28gbWFueSByZXF1ZXN0cy4gUGxlYXNlIHdhaXQgYSBtb21lbnQuJyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1bmtlciBwcm9maWxlcyBkb24ndCBuZWVkIGxvY2FsIGtleSBkZWNyeXB0aW9uIFx1MjAxNCBza2lwIGxvY2sgY2hlY2tcbiAgICBjb25zdCBwaSA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQcm9maWxlKHBpKTtcbiAgICBjb25zdCBpc0J1bmtlciA9IHByb2ZpbGU/LnR5cGUgPT09ICdidW5rZXInO1xuXG4gICAgLy8gUmVhZC1vbmx5IG9wZXJhdGlvbnMgKGdldFB1YktleSwgZ2V0UmVsYXlzKSB3b3JrIGZyb20gY2FjaGVkIGRhdGEgYW5kXG4gICAgLy8gZG9uJ3QgbmVlZCB0aGUgcHJpdmF0ZSBrZXksIHNvIHRoZXkgYnlwYXNzIHRoZSBsb2NrIGNoZWNrIGVudGlyZWx5LlxuICAgIC8vIFRoaXMgYWxzbyBmaXhlcyBTYWZhcmkncyBub24tcGVyc2lzdGVudCBiYWNrZ3JvdW5kIHBhZ2UgbG9zaW5nIHNlc3Npb25cbiAgICAvLyBrZXlzIG9uIHJlbG9hZCBcdTIwMTQgdGhlc2Ugb3BlcmF0aW9ucyBzdGlsbCB3b3JrIHdpdGhvdXQgcmUtdW5sb2NraW5nLlxuICAgIGNvbnN0IG5lZWRzUHJpdmF0ZUtleSA9IGtpbmQgIT09ICdnZXRQdWJLZXknICYmIGtpbmQgIT09ICdnZXRSZWxheXMnICYmIGtpbmQgIT09ICdhZGRSZWxheScgJiYga2luZCAhPT0gJ2V4cG9ydFByb2ZpbGUnO1xuXG4gICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBpcyBsb2NrZWQsIHJlamVjdCBzaWduaW5nL2VuY3J5cHRpb24gcmVxdWVzdHMgKGxvY2FsIHByb2ZpbGVzIG9ubHkpXG4gICAgaWYgKCFpc0J1bmtlciAmJiBuZWVkc1ByaXZhdGVLZXkpIHtcbiAgICAgICAgY29uc3QgaXNMb2NrZWQgPSBhd2FpdCBjaGVja0xvY2tTdGF0ZSgpO1xuICAgICAgICBpZiAoaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIGlmICghKG5vc3RyQWNjZXNzV2hpbGVMb2NrZWQgJiYgc2Vzc2lvbktleXMuaGFzKHBpKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBObyBrZXlzIGF2YWlsYWJsZSBcdTIwMTQgc2hvdyBsb2NrZWQgbm90aWZpY2F0aW9uIGFuZCByZWplY3RcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZpcnN0VW5sb2NrID0gc2Vzc2lvbktleXMuc2l6ZSA9PT0gMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbYWN0aXZlVGFiXSA9IGF3YWl0IGFwaS50YWJzLnF1ZXJ5KHsgYWN0aXZlOiB0cnVlLCBjdXJyZW50V2luZG93OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVGFiPy5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnRhYnMuc2VuZE1lc3NhZ2UoYWN0aXZlVGFiLmlkLCB7IGtpbmQ6ICdzaG93TG9ja2VkU2hlZXQnLCBmaXJzdFVubG9jazogaXNGaXJzdFVubG9jayB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRSZXNwb25zZSA9IHZhbGlkYXRpb25zW3V1aWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1t1dWlkXTtcbiAgICAgICAgICAgICAgICBzZW5kUmVzcG9uc2U/Lih7IGVycm9yOiAnbG9ja2VkJywgbWVzc2FnZTogJ0V4dGVuc2lvbiBpcyBsb2NrZWQuIFBsZWFzZSB1bmxvY2sgd2l0aCB5b3VyIG1hc3RlciBwYXNzd29yZC4nIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEtleXMgYXZhaWxhYmxlIGRlc3BpdGUgbG9jayBcdTIwMTQgcHJvY2VlZCB3aXRoIHBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJhdGUgbGltaXQgcGVybWlzc2lvbiBwcm9tcHRzIHBlciBob3N0XG4gICAgaWYgKGlzUmF0ZUxpbWl0ZWQoaG9zdCkpIHtcbiAgICAgICAgY29uc3Qgc2VuZFJlc3BvbnNlID0gdmFsaWRhdGlvbnNbdXVpZF07XG4gICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1t1dWlkXTtcbiAgICAgICAgc2VuZFJlc3BvbnNlPy4oeyBlcnJvcjogJ3JhdGVfbGltaXRlZCcsIG1lc3NhZ2U6ICdUb28gbWFueSByZXF1ZXN0cy4gUGxlYXNlIHdhaXQuJyB9KTtcbiAgICAgICAgbG9nKGBSYXRlIGxpbWl0ZWQ6ICR7aG9zdH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGZvcmNlUmVsZWFzZSgpOyAvLyBDbGVhbiB1cCBwcmV2aW91cyB0YWIgaWYgaXQgY2xvc2VkIHdpdGhvdXQgY2xlYW5pbmcgaXRzZWxmIHVwXG4gICAgcHJvbXB0LnJlbGVhc2UgPSBhd2FpdCBwcm9tcHQubXV0ZXguYWNxdWlyZSgpO1xuXG4gICAgcGVuZGluZ1F1ZXVlLnByb2Nlc3NlZCsrO1xuICAgIGNvbnN0IHF1ZXVlUG9zaXRpb24gPSBwZW5kaW5nUXVldWUucHJvY2Vzc2VkO1xuICAgIGNvbnN0IHF1ZXVlVG90YWwgPSBwZW5kaW5nUXVldWUudG90YWw7XG5cbiAgICBsZXQgbUtpbmQgPSBraW5kID09PSAnc2lnbkV2ZW50JyA/IGBzaWduRXZlbnQ6JHtwYXlsb2FkLmtpbmR9YCA6IGtpbmQ7XG4gICAgbGV0IHBlcm1pc3Npb24gPSBhd2FpdCBnZXRQZXJtaXNzaW9uKGhvc3QsIG1LaW5kKTtcbiAgICBpZiAocGVybWlzc2lvbiA9PT0gJ2FsbG93Jykge1xuICAgICAgICBjb21wbGV0ZSh7XG4gICAgICAgICAgICBwYXlsb2FkOiB1dWlkLFxuICAgICAgICAgICAgb3JpZ0tpbmQ6IGtpbmQsXG4gICAgICAgICAgICBldmVudDogcGF5bG9hZCxcbiAgICAgICAgICAgIHJlbWVtYmVyOiBmYWxzZSxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgIH0pO1xuICAgICAgICBwcm9tcHQucmVsZWFzZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBlcm1pc3Npb24gPT09ICdkZW55Jykge1xuICAgICAgICBkZW55KHsgcGF5bG9hZDogdXVpZCwgb3JpZ0tpbmQ6IGtpbmQsIGhvc3QgfSk7XG4gICAgICAgIHByb21wdC5yZWxlYXNlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gc2hvdyBib3R0b20gc2hlZXQgaW4gdGhlIGFjdGl2ZSB0YWIncyBjb250ZW50IHNjcmlwdFxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFthY3RpdmVUYWJdID0gYXdhaXQgYXBpLnRhYnMucXVlcnkoeyBhY3RpdmU6IHRydWUsIGN1cnJlbnRXaW5kb3c6IHRydWUgfSk7XG4gICAgICAgIGlmIChhY3RpdmVUYWI/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGkudGFicy5zZW5kTWVzc2FnZShhY3RpdmVUYWIuaWQsIHtcbiAgICAgICAgICAgICAgICBraW5kOiAnc2hvd1Blcm1pc3Npb25TaGVldCcsXG4gICAgICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uS2luZDoga2luZCxcbiAgICAgICAgICAgICAgICBxdWV1ZVBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHF1ZXVlVG90YWwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB1dWlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ0tpbmQ6IGtpbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyOiByZXN1bHQucmVtZW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZW55KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHV1aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnS2luZDoga2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBwYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXI6IHJlc3VsdC5yZW1lbWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9tcHQucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ29udGVudCBzY3JpcHQgbm90IGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIHRhYlxuICAgICAgICBsb2coJ0JvdHRvbSBzaGVldCB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIHRhYjonLCBlLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHBlcm1pc3Npb24gdGFiXG4gICAgbGV0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIHV1aWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQgfHwgZmFsc2UpLFxuICAgICAgICBxdWV1ZVBvc2l0aW9uLFxuICAgICAgICBxdWV1ZVRvdGFsLFxuICAgIH0pO1xuICAgIGxldCB0YWIgPSBhd2FpdCBhcGkudGFicy5nZXRDdXJyZW50KCk7XG4gICAgbGV0IHAgPSBhd2FpdCBhcGkudGFicy5jcmVhdGUoe1xuICAgICAgICB1cmw6IGFwaS5ydW50aW1lLmdldFVSTChgcGVybWlzc2lvbi9wZXJtaXNzaW9uLmh0bWw/JHtxcy50b1N0cmluZygpfWApLFxuICAgICAgICBvcGVuZXJUYWJJZDogdGFiPy5pZCxcbiAgICB9KTtcbiAgICBwcm9tcHQudGFiSWQgPSBwLmlkO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZSh7IHBheWxvYWQsIG9yaWdLaW5kLCBldmVudCwgcmVtZW1iZXIsIGhvc3QgfSkge1xuICAgIGNvbnN0IHNlbmRSZXNwb25zZSA9IHZhbGlkYXRpb25zW3BheWxvYWRdO1xuICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1twYXlsb2FkXTtcbiAgICBpZiAoT2JqZWN0LmtleXModmFsaWRhdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwZW5kaW5nUXVldWUgPSB7IHRvdGFsOiAwLCBwcm9jZXNzZWQ6IDAgfTtcbiAgICB9XG5cbiAgICBpZiAocmVtZW1iZXIpIHtcbiAgICAgICAgbGV0IG1LaW5kID1cbiAgICAgICAgICAgIG9yaWdLaW5kID09PSAnc2lnbkV2ZW50JyA/IGBzaWduRXZlbnQ6JHtldmVudC5raW5kfWAgOiBvcmlnS2luZDtcbiAgICAgICAgc2V0UGVybWlzc2lvbihob3N0LCBtS2luZCwgJ2FsbG93Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNlbmRSZXNwb25zZSkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgIGxvZyhgRXJyb3IgaW4gJHtvcmlnS2luZH06ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgZXJyb3I6ICdidW5rZXJfZXJyb3InLCBtZXNzYWdlOiBlLm1lc3NhZ2UgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChvcmlnS2luZCkge1xuICAgICAgICAgICAgY2FzZSAnZ2V0UHViS2V5JzpcbiAgICAgICAgICAgICAgICBnZXRQdWJLZXkoKS50aGVuKHBrID0+IHNlbmRSZXNwb25zZShwaykpLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2lnbkV2ZW50JzpcbiAgICAgICAgICAgICAgICBzaWduRXZlbnRfKGV2ZW50LCBob3N0KS50aGVuKGUgPT4gc2VuZFJlc3BvbnNlKGUpKS5jYXRjaChvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25pcDA0LmVuY3J5cHQnOlxuICAgICAgICAgICAgICAgIG5pcDA0RW5jcnlwdChldmVudCkudGhlbihlID0+IHNlbmRSZXNwb25zZShlKSkuY2F0Y2gob25FcnJvcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICduaXAwNC5kZWNyeXB0JzpcbiAgICAgICAgICAgICAgICBuaXAwNERlY3J5cHQoZXZlbnQpLnRoZW4oZSA9PiBzZW5kUmVzcG9uc2UoZSkpLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbmlwNDQuZW5jcnlwdCc6XG4gICAgICAgICAgICAgICAgbmlwNDRFbmNyeXB0KGV2ZW50KS50aGVuKGUgPT4gc2VuZFJlc3BvbnNlKGUpKS5jYXRjaChvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25pcDQ0LmRlY3J5cHQnOlxuICAgICAgICAgICAgICAgIG5pcDQ0RGVjcnlwdChldmVudCkudGhlbihlID0+IHNlbmRSZXNwb25zZShlKSkuY2F0Y2gob25FcnJvcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdnZXRSZWxheXMnOlxuICAgICAgICAgICAgICAgIGdldFJlbGF5cygpLnRoZW4oZSA9PiBzZW5kUmVzcG9uc2UoZSkpLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYWRkUmVsYXknOlxuICAgICAgICAgICAgICAgIGFkZFJlbGF5KGV2ZW50LnVybCkudGhlbihlID0+IHNlbmRSZXNwb25zZShlKSkuY2F0Y2gob25FcnJvcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdleHBvcnRQcm9maWxlJzpcbiAgICAgICAgICAgICAgICBleHBvcnRQcm9maWxlRGF0YSgpLnRoZW4oZSA9PiBzZW5kUmVzcG9uc2UoZSkpLmNhdGNoKG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZW55KHsgb3JpZ0tpbmQsIGhvc3QsIHBheWxvYWQsIHJlbWVtYmVyLCBldmVudCB9KSB7XG4gICAgY29uc3Qgc2VuZFJlc3BvbnNlID0gdmFsaWRhdGlvbnNbcGF5bG9hZF07XG4gICAgZGVsZXRlIHZhbGlkYXRpb25zW3BheWxvYWRdO1xuICAgIGlmIChPYmplY3Qua2V5cyh2YWxpZGF0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBlbmRpbmdRdWV1ZSA9IHsgdG90YWw6IDAsIHByb2Nlc3NlZDogMCB9O1xuICAgIH1cblxuICAgIGlmIChyZW1lbWJlcikge1xuICAgICAgICBsZXQgbUtpbmQgPVxuICAgICAgICAgICAgb3JpZ0tpbmQgPT09ICdzaWduRXZlbnQnID8gYHNpZ25FdmVudDoke2V2ZW50LmtpbmR9YCA6IG9yaWdLaW5kO1xuICAgICAgICBzZXRQZXJtaXNzaW9uKGhvc3QsIG1LaW5kLCAnZGVueScpO1xuICAgIH1cblxuICAgIHNlbmRSZXNwb25zZT8uKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENhY2hlIHB1YktleXMgZm9yIGFsbCBsb2NhbCBwcm9maWxlcyAoY2FsbCBiZWZvcmUgZW5jcnlwdGluZyBrZXlzKS5cbiAqIFRoaXMgZW5zdXJlcyBucHViIGlzIGF2YWlsYWJsZSBldmVuIHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBsb2NrZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhY2hlUHViS2V5c0ZvckFsbFByb2ZpbGVzKCkge1xuICAgIGNvbnN0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IHByb2ZpbGVzW2ldO1xuICAgICAgICBpZiAocHJvZmlsZS50eXBlID09PSAnYnVua2VyJykgY29udGludWU7XG4gICAgICAgIGlmIChwcm9maWxlLnB1YktleSkgY29udGludWU7IC8vIEFscmVhZHkgY2FjaGVkXG4gICAgICAgIGlmICghcHJvZmlsZS5wcml2S2V5IHx8IGlzRW5jcnlwdGVkQmxvYihwcm9maWxlLnByaXZLZXkpKSBjb250aW51ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHB1YktleSA9IGdldFB1YmxpY0tleVN5bmMocHJvZmlsZS5wcml2S2V5KTtcbiAgICAgICAgICAgIHByb2ZpbGVzW2ldLnB1YktleSA9IHB1YktleTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY2FjaGUgcHViS2V5IGZvciBwcm9maWxlICR7aX06YCwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlcyB9KTtcbiAgICB9XG59XG5cbi8vIE9wdGlvbnNcbmFzeW5jIGZ1bmN0aW9uIHNhdmVQcml2YXRlS2V5KFtpbmRleCwgcHJpdktleV0pIHtcbiAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShpbmRleCk7XG4gICAgaWYgKHByb2ZpbGU/LnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBwcml2YXRlIGtleSBvbiBhIGJ1bmtlciBwcm9maWxlJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcml2S2V5ICE9PSAnc3RyaW5nJyB8fCBwcml2S2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpdmF0ZSBrZXk6IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgbGV0IGhleEtleTtcbiAgICBpZiAocHJpdktleS5zdGFydHNXaXRoKCduc2VjJykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGhleEtleSA9IG5pcDE5LmRlY29kZShwcml2S2V5KS5kYXRhO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbnNlYyBrZXknKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFscmVhZHkgYSBoZXggc3RyaW5nXG4gICAgICAgIGhleEtleSA9IHByaXZLZXk7XG4gICAgfVxuXG4gICAgaWYgKCEvXlswLTlhLWZdezY0fSQvaS50ZXN0KGhleEtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5OiBtdXN0IGJlIDY0IGhleCBjaGFyYWN0ZXJzIG9yIHZhbGlkIG5zZWMnKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXQoJ3Byb2ZpbGVzJyk7XG5cbiAgICBpZiAoIXByb2ZpbGVzIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwcm9maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByb2ZpbGUgaW5kZXgnKTtcbiAgICB9XG5cbiAgICAvLyBDYWNoZSB0aGUgcHVibGljIGtleSBzbyBpdCdzIGF2YWlsYWJsZSBldmVuIHdoZW4gbG9ja2VkXG4gICAgY29uc3QgcHViS2V5ID0gZ2V0UHVibGljS2V5U3luYyhoZXhLZXkpO1xuICAgIHByb2ZpbGVzW2luZGV4XS5wdWJLZXkgPSBwdWJLZXk7XG5cbiAgICAvLyBJZiBlbmNyeXB0aW9uIGlzIGFjdGl2ZSwgcmUtZW5jcnlwdCB0aGUgbmV3IGtleSB1c2luZyB0aGUgc2Vzc2lvbiBrZXlcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBpc0VuY3J5cHRlZCgpO1xuICAgIGlmIChlbmNyeXB0ZWQgJiYgc2Vzc2lvbkNyeXB0b0tleSkge1xuICAgICAgICBwcm9maWxlc1tpbmRleF0ucHJpdktleSA9IGF3YWl0IGVuY3J5cHRXaXRoS2V5KGhleEtleSwgc2Vzc2lvbkNyeXB0b0tleSwgc2Vzc2lvbktleVNhbHQpO1xuICAgICAgICBzZXNzaW9uS2V5cy5zZXQoaW5kZXgsIGhleEtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZmlsZXNbaW5kZXhdLnByaXZLZXkgPSBoZXhLZXk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlcyB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TnNlYyhpbmRleCkge1xuICAgIGxldCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShpbmRleCk7XG5cbiAgICBpZiAocHJvZmlsZS50eXBlID09PSAnYnVua2VyJykgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgaGV4S2V5ID0gYXdhaXQgZ2V0UGxhaW50ZXh0UHJpdktleShpbmRleCwgcHJvZmlsZSk7XG4gICAgbGV0IG5zZWMgPSBuaXAxOS5uc2VjRW5jb2RlKGhleEtleSk7XG4gICAgcmV0dXJuIG5zZWM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5wdWIoaW5kZXgpIHtcbiAgICBsZXQgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUoaW5kZXgpO1xuXG4gICAgaWYgKCFwcm9maWxlKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChwcm9maWxlLnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgIGlmIChwcm9maWxlLnJlbW90ZVB1YmtleSkgcmV0dXJuIG5pcDE5Lm5wdWJFbmNvZGUocHJvZmlsZS5yZW1vdGVQdWJrZXkpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY2FjaGVkIHB1YktleSBpZiBhdmFpbGFibGUgKHdvcmtzIGV2ZW4gd2hlbiBsb2NrZWQpXG4gICAgaWYgKHByb2ZpbGUucHViS2V5KSB7XG4gICAgICAgIHJldHVybiBuaXAxOS5ucHViRW5jb2RlKHByb2ZpbGUucHViS2V5KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogZGVyaXZlIGZyb20gcHJpdmF0ZSBrZXkgKHJlcXVpcmVzIHVubG9ja2VkIHN0YXRlKVxuICAgIHRyeSB7XG4gICAgICAgIGxldCBoZXhLZXkgPSBhd2FpdCBnZXRQbGFpbnRleHRQcml2S2V5KGluZGV4LCBwcm9maWxlKTtcbiAgICAgICAgaWYgKCFoZXhLZXkgfHwgdHlwZW9mIGhleEtleSAhPT0gJ3N0cmluZycgfHwgaGV4S2V5Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwdWJLZXkgPSBnZXRQdWJsaWNLZXlTeW5jKGhleEtleSk7XG4gICAgICAgIGxldCBucHViID0gbmlwMTkubnB1YkVuY29kZShwdWJLZXkpO1xuICAgICAgICByZXR1cm4gbnB1YjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2dldE5wdWIgZXJyb3I6JywgZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBsYWludGV4dCBoZXggcHJpdmF0ZSBrZXkgZm9yIGEgcHJvZmlsZS5cbiAqIFVzZXMgc2Vzc2lvbiBjYWNoZSBpZiBlbmNyeXB0aW9uIGlzIGFjdGl2ZSwgb3RoZXJ3aXNlIHJlYWRzIGZyb20gc3RvcmFnZSBkaXJlY3RseS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UGxhaW50ZXh0UHJpdktleShpbmRleCwgcHJvZmlsZSkge1xuICAgIGlmIChpc0VuY3J5cHRlZEJsb2IocHJvZmlsZS5wcml2S2V5KSkge1xuICAgICAgICAvLyBLZXkgaXMgZW5jcnlwdGVkIFx1MjAxNCBtdXN0IHVzZSBzZXNzaW9uIGNhY2hlXG4gICAgICAgIGlmIChzZXNzaW9uS2V5cy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbktleXMuZ2V0KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4dGVuc2lvbiBpcyBsb2NrZWQgXHUyMDE0IGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2ZpbGUucHJpdktleTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJpdktleSgpIHtcbiAgICBsZXQgaW5kZXggPSBhd2FpdCBnZXRQcm9maWxlSW5kZXgoKTtcbiAgICBsZXQgcHJvZmlsZSA9IGF3YWl0IGN1cnJlbnRQcm9maWxlKCk7XG4gICAgbGV0IGhleEtleSA9IGF3YWl0IGdldFBsYWludGV4dFByaXZLZXkoaW5kZXgsIHByb2ZpbGUpO1xuICAgIHJldHVybiBoZXhUb0J5dGVzKGhleEtleSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1YktleSgpIHtcbiAgICBsZXQgcGkgPSBhd2FpdCBnZXRQcm9maWxlSW5kZXgoKTtcbiAgICBsZXQgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocGkpO1xuXG4gICAgaWYgKHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicpIHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlZCByZW1vdGVQdWJrZXksIG9yIGxpdmUtcXVlcnkgYW5kIGNhY2hlXG4gICAgICAgIGlmIChwcm9maWxlLnJlbW90ZVB1YmtleSkgcmV0dXJuIHByb2ZpbGUucmVtb3RlUHVia2V5O1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0T3JDcmVhdGVTZXNzaW9uKHBpKTtcbiAgICAgICAgY29uc3QgcHVia2V5ID0gYXdhaXQgc2Vzc2lvbi5nZXRQdWJsaWNLZXkoKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhd2FpdCBnZXQoJ3Byb2ZpbGVzJyk7XG4gICAgICAgIHByb2ZpbGVzW3BpXS5yZW1vdGVQdWJrZXkgPSBwdWJrZXk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG4gICAgICAgIHJldHVybiBwdWJrZXk7XG4gICAgfVxuXG4gICAgLy8gVXNlIGNhY2hlZCBwdWJLZXkgaWYgYXZhaWxhYmxlICh3b3JrcyBldmVuIHdoZW4gbG9ja2VkKVxuICAgIGlmIChwcm9maWxlLnB1YktleSkgcmV0dXJuIHByb2ZpbGUucHViS2V5O1xuXG4gICAgLy8gRmFsbGJhY2s6IGRlcml2ZSBmcm9tIHByaXZhdGUga2V5IChyZXF1aXJlcyB1bmxvY2tlZCBzdGF0ZSlcbiAgICBsZXQgcHJpdktleSA9IGF3YWl0IGdldFByaXZLZXkoKTtcbiAgICBsZXQgcHViS2V5ID0gZ2V0UHVibGljS2V5U3luYyhieXRlc1RvSGV4KHByaXZLZXkpKTtcbiAgICByZXR1cm4gcHViS2V5O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjdXJyZW50UHJvZmlsZSgpIHtcbiAgICBsZXQgaW5kZXggPSBhd2FpdCBnZXRQcm9maWxlSW5kZXgoKTtcbiAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXQoJ3Byb2ZpbGVzJyk7XG4gICAgcmV0dXJuIHByb2ZpbGVzW2luZGV4XTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2lnbkV2ZW50XyhldmVudCwgaG9zdCkge1xuICAgIGV2ZW50ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldmVudCkpO1xuXG4gICAgY29uc3QgcGkgPSBhd2FpdCBnZXRQcm9maWxlSW5kZXgoKTtcbiAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShwaSk7XG5cbiAgICBpZiAocHJvZmlsZS50eXBlID09PSAnYnVua2VyJykge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0T3JDcmVhdGVTZXNzaW9uKHBpKTtcbiAgICAgICAgZXZlbnQgPSBhd2FpdCBzZXNzaW9uLnNpZ25FdmVudChldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHNrID0gYXdhaXQgZ2V0UHJpdktleSgpO1xuICAgICAgICBldmVudCA9IGF3YWl0IGZpbmFsaXplRXZlbnQoZXZlbnQsIHNrKTtcbiAgICB9XG5cbiAgICBzYXZlRXZlbnQoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgbWV0YWRhdGE6IHsgaG9zdCwgc2lnbmVkX2F0OiBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKSB9LFxuICAgIH0pO1xuICAgIHJldHVybiBldmVudDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmlwMDRFbmNyeXB0KHsgcHViS2V5LCBwbGFpblRleHQgfSkge1xuICAgIGNvbnN0IHBpID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocGkpO1xuXG4gICAgaWYgKHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldE9yQ3JlYXRlU2Vzc2lvbihwaSk7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLm5pcDA0RW5jcnlwdChwdWJLZXksIHBsYWluVGV4dCk7XG4gICAgfVxuXG4gICAgbGV0IHByaXZLZXkgPSBhd2FpdCBnZXRQcml2S2V5KCk7XG4gICAgcmV0dXJuIG5pcDA0LmVuY3J5cHRNZXNzYWdlKHBsYWluVGV4dCwgYnl0ZXNUb0hleChwcml2S2V5KSwgcHViS2V5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmlwMDREZWNyeXB0KHsgcHViS2V5LCBjaXBoZXJUZXh0IH0pIHtcbiAgICBjb25zdCBwaSA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQcm9maWxlKHBpKTtcblxuICAgIGlmIChwcm9maWxlLnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRPckNyZWF0ZVNlc3Npb24ocGkpO1xuICAgICAgICByZXR1cm4gc2Vzc2lvbi5uaXAwNERlY3J5cHQocHViS2V5LCBjaXBoZXJUZXh0KTtcbiAgICB9XG5cbiAgICBsZXQgcHJpdktleSA9IGF3YWl0IGdldFByaXZLZXkoKTtcbiAgICByZXR1cm4gbmlwMDQuZGVjcnlwdE1lc3NhZ2UoY2lwaGVyVGV4dCwgYnl0ZXNUb0hleChwcml2S2V5KSwgcHViS2V5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmlwNDRFbmNyeXB0KHsgcHViS2V5LCBwbGFpblRleHQgfSkge1xuICAgIGNvbnN0IHBpID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocGkpO1xuXG4gICAgaWYgKHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldE9yQ3JlYXRlU2Vzc2lvbihwaSk7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLm5pcDQ0RW5jcnlwdChwdWJLZXksIHBsYWluVGV4dCk7XG4gICAgfVxuXG4gICAgbGV0IHByaXZLZXkgPSBhd2FpdCBnZXRQcml2S2V5KCk7XG4gICAgbGV0IGNvbnZlcnNhdGlvbktleSA9IG5pcDQ0LnYyLnV0aWxzLmdldENvbnZlcnNhdGlvbktleShwcml2S2V5LCBwdWJLZXkpO1xuICAgIHJldHVybiBuaXA0NC52Mi5lbmNyeXB0KHBsYWluVGV4dCwgY29udmVyc2F0aW9uS2V5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmlwNDREZWNyeXB0KHsgcHViS2V5LCBjaXBoZXJUZXh0IH0pIHtcbiAgICBjb25zdCBwaSA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZXRQcm9maWxlKHBpKTtcblxuICAgIGlmIChwcm9maWxlLnR5cGUgPT09ICdidW5rZXInKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRPckNyZWF0ZVNlc3Npb24ocGkpO1xuICAgICAgICByZXR1cm4gc2Vzc2lvbi5uaXA0NERlY3J5cHQocHViS2V5LCBjaXBoZXJUZXh0KTtcbiAgICB9XG5cbiAgICBsZXQgcHJpdktleSA9IGF3YWl0IGdldFByaXZLZXkoKTtcbiAgICBsZXQgY29udmVyc2F0aW9uS2V5ID0gbmlwNDQudjIudXRpbHMuZ2V0Q29udmVyc2F0aW9uS2V5KHByaXZLZXksIHB1YktleSk7XG4gICAgcmV0dXJuIG5pcDQ0LnYyLmRlY3J5cHQoY2lwaGVyVGV4dCwgY29udmVyc2F0aW9uS2V5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVsYXlzKCkge1xuICAgIGxldCBwcm9maWxlID0gYXdhaXQgY3VycmVudFByb2ZpbGUoKTtcbiAgICBsZXQgcmVsYXlzID0gcHJvZmlsZS5yZWxheXM7XG4gICAgbGV0IHJlbGF5T2JqID0ge307XG4gICAgLy8gVGhlIGdldFJlbGF5cyBjYWxsIGV4cGVjdHMgdGhpcyB0byBiZSByZXR1cm5lZCBhcyBhbiBvYmplY3QsIG5vdCBhcnJheVxuICAgIHJlbGF5cy5mb3JFYWNoKHJlbGF5ID0+IHtcbiAgICAgICAgbGV0IHsgdXJsLCByZWFkLCB3cml0ZSB9ID0gcmVsYXk7XG4gICAgICAgIHJlbGF5T2JqW3VybF0gPSB7IHJlYWQsIHdyaXRlIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlbGF5T2JqO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRSZWxheSh1cmwpIHtcbiAgICAvLyBWYWxpZGF0ZSBVUkxcbiAgICBsZXQgcGFyc2VkO1xuICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFVSTCcpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnd3NzOicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGEgd3NzOi8vIFVSTCcpO1xuICAgIH1cblxuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgbGV0IHBpID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgbGV0IHByb2ZpbGUgPSBwcm9maWxlc1twaV07XG4gICAgaWYgKCFwcm9maWxlLnJlbGF5cykgcHJvZmlsZS5yZWxheXMgPSBbXTtcblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGVzXG4gICAgaWYgKHByb2ZpbGUucmVsYXlzLnNvbWUociA9PiByLnVybCA9PT0gcGFyc2VkLmhyZWYpKSB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG1lc3NhZ2U6ICdSZWxheSBhbHJlYWR5IGV4aXN0cycgfTtcbiAgICB9XG5cbiAgICBwcm9maWxlLnJlbGF5cy5wdXNoKHsgdXJsOiBwYXJzZWQuaHJlZiwgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfSk7XG4gICAgcHJvZmlsZS51cGRhdGVkQXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldCh7IHByb2ZpbGVzIH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgbWVzc2FnZTogJ1JlbGF5IGFkZGVkJyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHBvcnRQcm9maWxlRGF0YSgpIHtcbiAgICBsZXQgcGkgPSBhd2FpdCBnZXRQcm9maWxlSW5kZXgoKTtcbiAgICBsZXQgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocGkpO1xuXG4gICAgaWYgKCFwcm9maWxlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGFjdGl2ZSBwcm9maWxlJyk7XG4gICAgaWYgKHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicpIHtcbiAgICAgICAgLy8gQnVua2VyIHByb2ZpbGVzIGRvbid0IGhhdmUgbG9jYWwga2V5cyB0byBleHBvcnRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHByb2ZpbGUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdidW5rZXInLFxuICAgICAgICAgICAgYnVua2VyVXJsOiBwcm9maWxlLmJ1bmtlclVybCB8fCAnJyxcbiAgICAgICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIHNvdXJjZTogJ05vc3RyS2V5JyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgbnB1YiA9ICcnO1xuICAgIGlmIChwcm9maWxlLnB1YktleSkge1xuICAgICAgICBucHViID0gbmlwMTkubnB1YkVuY29kZShwcm9maWxlLnB1YktleSk7XG4gICAgfVxuXG4gICAgbGV0IG5zZWMgPSAnJztcbiAgICB0cnkge1xuICAgICAgICBuc2VjID0gYXdhaXQgZ2V0TnNlYyhwaSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEtleSBtYXkgYmUgZW5jcnlwdGVkIGFuZCBsb2NrZWRcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXhwb3J0IHdoaWxlIGxvY2tlZC4gUGxlYXNlIHVubG9jayBmaXJzdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBwcm9maWxlLm5hbWUsXG4gICAgICAgIG5wdWIsXG4gICAgICAgIG5zZWMsXG4gICAgICAgIHJlbGF5czogKHByb2ZpbGUucmVsYXlzIHx8IFtdKS5tYXAociA9PiByLnVybCksXG4gICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc291cmNlOiAnTm9zdHJLZXknLFxuICAgIH07XG59XG5cbi8qKlxuICogT3BlbiBlcGhlbWVyYWwgcmVsYXkgY29ubmVjdGlvbnMsIGV4ZWN1dGUgY2FsbGJhY2ssIHRoZW4gZGlzY29ubmVjdC5cbiAqIENvcnJlY3QgZm9yIENocm9tZSBNVjMgc2VydmljZSB3b3JrZXIgbGlmZWN5Y2xlIChubyBwZXJzaXN0ZW50IHBvb2wpLlxuICpcbiAqIEBwYXJhbSB7J3JlYWQnfCd3cml0ZSd9IG1vZGUgLSBXaGljaCByZWxheSBzdWJzZXQgdG8gY29ubmVjdCB0b1xuICogQHBhcmFtIHtmdW5jdGlvbihSZWxheUNvbm5lY3Rpb25bXSk6IFByb21pc2V9IGNhbGxiYWNrXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhSZWxheXMobW9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgY3VycmVudFByb2ZpbGUoKTtcbiAgICBjb25zdCByZWxheUxpc3QgPSBwcm9maWxlLnJlbGF5cyB8fCBbXTtcbiAgICBjb25zdCB1cmxzID0gcmVsYXlMaXN0XG4gICAgICAgIC5maWx0ZXIociA9PiBtb2RlID09PSAncmVhZCcgPyByLnJlYWQgOiByLndyaXRlKVxuICAgICAgICAubWFwKHIgPT4gci51cmwpO1xuXG4gICAgaWYgKHVybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVsYXlzIGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGNvbm5lY3RQcm9taXNlcyA9IHVybHMubWFwKGFzeW5jICh1cmwpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXkgPSBuZXcgUmVsYXlDb25uZWN0aW9uKHVybCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCByZWxheS5jb25uZWN0KCk7XG4gICAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKHJlbGF5KTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgLy8gU2tpcCByZWxheXMgdGhhdCBmYWlsIHRvIGNvbm5lY3RcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNvbm5lY3RQcm9taXNlcyk7XG5cbiAgICBpZiAoY29ubmVjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbm5lY3QgdG8gYW55IHJlbGF5Jyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2FsbGJhY2soY29ubmVjdGlvbnMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVsYXkgb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgICAgICAgIHJlbGF5LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAbW9kdWxlIG5vc3RyLWNyeXB0by11dGlsc1xuICogQGRlc2NyaXB0aW9uIENvcmUgY3J5cHRvZ3JhcGhpYyB1dGlsaXRpZXMgZm9yIE5vc3RyIHByb3RvY29sXG4gKi9cblxuLy8gQ29yZSB0eXBlc1xuZXhwb3J0IHR5cGUge1xuICBOb3N0ckV2ZW50LFxuICBVbnNpZ25lZE5vc3RyRXZlbnQsXG4gIFNpZ25lZE5vc3RyRXZlbnQsXG4gIE5vc3RyRmlsdGVyLFxuICBOb3N0clN1YnNjcmlwdGlvbixcbiAgUHVibGljS2V5LFxuICBLZXlQYWlyLFxuICBOb3N0ck1lc3NhZ2VUdXBsZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIEV2ZW50IGtpbmRzLCBtZXNzYWdlIHR5cGVzLCBhbmQgTklQLTQ2IHR5cGVzXG5leHBvcnQgeyBOb3N0ckV2ZW50S2luZCwgTm9zdHJNZXNzYWdlVHlwZSwgTmlwNDZNZXRob2QgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB0eXBlIHtcbiAgTmlwNDZSZXF1ZXN0LFxuICBOaXA0NlJlc3BvbnNlLFxuICBOaXA0NlNlc3Npb24sXG4gIE5pcDQ2U2Vzc2lvbkluZm8sXG4gIEJ1bmtlclVSSSxcbiAgQnVua2VyVmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIENvcmUgY3J5cHRvIGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgZ2VuZXJhdGVLZXlQYWlyLFxuICBnZXRQdWJsaWNLZXksXG4gIGdldFB1YmxpY0tleVN5bmMsXG4gIHZhbGlkYXRlS2V5UGFpcixcbiAgY3JlYXRlRXZlbnQsXG4gIHNpZ25FdmVudCxcbiAgZmluYWxpemVFdmVudCxcbiAgdmVyaWZ5U2lnbmF0dXJlLFxuICBlbmNyeXB0LFxuICBkZWNyeXB0LFxufSBmcm9tICcuL2NyeXB0byc7XG5cbi8vIFZhbGlkYXRpb24gZnVuY3Rpb25zXG5leHBvcnQge1xuICB2YWxpZGF0ZUV2ZW50LFxuICB2YWxpZGF0ZUV2ZW50SWQsXG4gIHZhbGlkYXRlRXZlbnRTaWduYXR1cmUsXG4gIHZhbGlkYXRlU2lnbmVkRXZlbnQsXG4gIHZhbGlkYXRlRXZlbnRCYXNlLFxuICB2YWxpZGF0ZUZpbHRlcixcbiAgdmFsaWRhdGVTdWJzY3JpcHRpb24sXG4gIHZhbGlkYXRlUmVzcG9uc2UsXG59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbi8vIEV2ZW50IGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgY2FsY3VsYXRlRXZlbnRJZCxcbn0gZnJvbSAnLi9ldmVudCc7XG5cbi8vIE5JUC0wNCBlbmNyeXB0aW9uXG5leHBvcnQge1xuICBjb21wdXRlU2hhcmVkU2VjcmV0LFxuICBlbmNyeXB0TWVzc2FnZSxcbiAgZGVjcnlwdE1lc3NhZ2UsXG59IGZyb20gJy4vbmlwcy9uaXAtMDQnO1xuXG4vLyBSZS1leHBvcnQgTklQc1xuZXhwb3J0ICogYXMgbmlwMDEgZnJvbSAnLi9uaXBzL25pcC0wMSc7XG5leHBvcnQgKiBhcyBuaXAwNCBmcm9tICcuL25pcHMvbmlwLTA0JztcbmV4cG9ydCAqIGFzIG5pcDE5IGZyb20gJy4vbmlwcy9uaXAtMTknO1xuZXhwb3J0ICogYXMgbmlwMjYgZnJvbSAnLi9uaXBzL25pcC0yNic7XG5leHBvcnQgKiBhcyBuaXA0NCBmcm9tICcuL25pcHMvbmlwLTQ0JztcbmV4cG9ydCAqIGFzIG5pcDQ2IGZyb20gJy4vbmlwcy9uaXAtNDYnO1xuZXhwb3J0ICogYXMgbmlwNDkgZnJvbSAnLi9uaXBzL25pcC00OSc7XG5cbi8vIFV0aWxzXG5leHBvcnQge1xuICBoZXhUb0J5dGVzLFxuICBieXRlc1RvSGV4LFxuICB1dGY4VG9CeXRlcyxcbiAgYnl0ZXNUb1V0ZjgsXG59IGZyb20gJy4vdXRpbHMvZW5jb2RpbmcnO1xuIiwgIi8qKlxuICogQG1vZHVsZSB0eXBlc1xuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbnMgZm9yIE5vc3RyXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNLZXlEZXRhaWxzIHtcbiAgaGV4OiBzdHJpbmc7XG4gIGJ5dGVzOiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleVBhaXIge1xuICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIHB1YmxpY0tleTogUHVibGljS2V5RGV0YWlscztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3N0ckV2ZW50IHtcbiAga2luZDogbnVtYmVyO1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG4gIHRhZ3M6IHN0cmluZ1tdW107XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgcHVia2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVkTm9zdHJFdmVudCBleHRlbmRzIE5vc3RyRXZlbnQge1xuICBpZDogc3RyaW5nO1xuICBzaWc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNLZXkge1xuICBoZXg6IHN0cmluZztcbiAgYnl0ZXM/OiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gTm9zdHJFdmVudEtpbmQge1xuICBTRVRfTUVUQURBVEEgPSAwLFxuICBURVhUX05PVEUgPSAxLFxuICBSRUNPTU1FTkRfU0VSVkVSID0gMixcbiAgQ09OVEFDVF9MSVNUID0gMyxcbiAgRU5DUllQVEVEX0RJUkVDVF9NRVNTQUdFID0gNCxcbiAgREVMRVRFID0gNSxcbiAgUkVQT1NUID0gNixcbiAgUkVBQ1RJT04gPSA3LFxuICBCQURHRV9BV0FSRCA9IDgsXG4gIENIQU5ORUxfQ1JFQVRFID0gNDAsXG4gIENIQU5ORUxfTUVUQURBVEEgPSA0MSxcbiAgQ0hBTk5FTF9NRVNTQUdFID0gNDIsXG4gIENIQU5ORUxfSElERV9NRVNTQUdFID0gNDMsXG4gIENIQU5ORUxfTVVURV9VU0VSID0gNDQsXG4gIENIQU5ORUxfUkVTRVJWRSA9IDQ1LFxuICBSRVBPUlRJTkcgPSAxOTg0LFxuICBaQVBfUkVRVUVTVCA9IDk3MzQsXG4gIFpBUCA9IDk3MzUsXG4gIE1VVEVfTElTVCA9IDEwMDAwLFxuICBQSU5fTElTVCA9IDEwMDAxLFxuICBSRUxBWV9MSVNUX01FVEFEQVRBID0gMTAwMDIsXG4gIENMSUVOVF9BVVRIID0gMjIyNDIsXG4gIEFVVEhfUkVTUE9OU0UgPSAyMjI0MyxcbiAgTk9TVFJfQ09OTkVDVCA9IDI0MTMzLFxuICBDQVRFR09SSVpFRF9QRU9QTEUgPSAzMDAwMCxcbiAgQ0FURUdPUklaRURfQk9PS01BUktTID0gMzAwMDEsXG4gIFBST0ZJTEVfQkFER0VTID0gMzAwMDgsXG4gIEJBREdFX0RFRklOSVRJT04gPSAzMDAwOSxcbiAgTE9OR19GT1JNID0gMzAwMjMsXG4gIEFQUExJQ0FUSU9OX1NQRUNJRklDID0gMzAwNzhcbn1cblxuLyoqXG4gKiBSZS1leHBvcnQgYWxsIHR5cGVzIGZyb20gYmFzZSBtb2R1bGVcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5leHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuXG4vKiogUmUtZXhwb3J0IHByb3RvY29sIHR5cGVzICovXG5leHBvcnQgKiBmcm9tICcuL3Byb3RvY29sJztcblxuLyoqIFJlLWV4cG9ydCBtZXNzYWdlIHR5cGVzICovXG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2VzJztcblxuLyoqIFJlLWV4cG9ydCB0eXBlIGd1YXJkcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9ndWFyZHMnO1xuXG4vLyBSZS1leHBvcnQgTklQLTE5IHR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIE5pcDE5RGF0YVR5cGVcbn0gZnJvbSAnLi4vbmlwcy9uaXAtMTknO1xuXG4vKiogUmUtZXhwb3J0IE5JUC00NiB0eXBlcyAqL1xuZXhwb3J0ICogZnJvbSAnLi9uaXA0Nic7XG4iLCAiLyoqXG4gKiBAbW9kdWxlIHR5cGVzL2Jhc2VcbiAqIEBkZXNjcmlwdGlvbiBDb3JlIHR5cGUgZGVmaW5pdGlvbnMgZm9yIE5vc3RyIHByb3RvY29sXG4gKi9cblxuLy8gS2V5IFR5cGVzXG5leHBvcnQgdHlwZSBQdWJsaWNLZXlIZXggPSBzdHJpbmc7XG5leHBvcnQgdHlwZSBQcml2YXRlS2V5SGV4ID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY0tleURldGFpbHMge1xuICAvKiogUHVibGljIGtleSBpbiBoZXggZm9ybWF0ICovXG4gIGhleDogc3RyaW5nO1xuICAvKiogTklQLTA1IGlkZW50aWZpZXIgKi9cbiAgbmlwMDU6IHN0cmluZztcbiAgLyoqIFB1YmxpYyBrZXkgaW4gYnl0ZXMgZm9ybWF0ICovXG4gIGJ5dGVzOiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgdHlwZSBQdWJsaWNLZXkgPSBQdWJsaWNLZXlIZXggfCBQdWJsaWNLZXlEZXRhaWxzO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleVBhaXIge1xuICAvKiogUHJpdmF0ZSBrZXkgaW4gaGV4IGZvcm1hdCAqL1xuICBwcml2YXRlS2V5OiBQcml2YXRlS2V5SGV4O1xuICAvKiogUHVibGljIGtleSBkZXRhaWxzICovXG4gIHB1YmxpY0tleTogUHVibGljS2V5RGV0YWlscztcbn1cblxuLy8gRXZlbnQgVHlwZXNcbmV4cG9ydCBlbnVtIE5vc3RyRXZlbnRLaW5kIHtcbiAgLy8gTklQLTAxOiBDb3JlIFByb3RvY29sXG4gIFNFVF9NRVRBREFUQSA9IDAsXG4gIFRFWFRfTk9URSA9IDEsXG4gIFJFQ09NTUVORF9TRVJWRVIgPSAyLFxuICBDT05UQUNUUyA9IDMsXG4gIEVOQ1JZUFRFRF9ESVJFQ1RfTUVTU0FHRSA9IDQsXG4gIEVWRU5UX0RFTEVUSU9OID0gNSxcbiAgUkVQT1NUID0gNixcbiAgUkVBQ1RJT04gPSA3LFxuXG4gIC8vIE5JUC0yODogUHVibGljIENoYXRcbiAgQ0hBTk5FTF9DUkVBVElPTiA9IDQwLFxuICBDSEFOTkVMX01FVEFEQVRBID0gNDEsXG4gIENIQU5ORUxfTUVTU0FHRSA9IDQyLFxuICBDSEFOTkVMX0hJREVfTUVTU0FHRSA9IDQzLFxuICBDSEFOTkVMX01VVEVfVVNFUiA9IDQ0LFxuXG4gIC8vIE5JUC00MjogQXV0aGVudGljYXRpb25cbiAgQVVUSCA9IDIyMjQyLFxuICBBVVRIX1JFU1BPTlNFID0gMjIyNDNcbn1cblxuLyoqIEJhc2UgaW50ZXJmYWNlIGZvciBhbGwgTm9zdHIgZXZlbnRzICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VOb3N0ckV2ZW50IHtcbiAgLyoqIEV2ZW50IGtpbmQgYXMgZGVmaW5lZCBpbiBOSVBzICovXG4gIGtpbmQ6IG51bWJlcjtcbiAgLyoqIENvbnRlbnQgb2YgdGhlIGV2ZW50ICovXG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgLyoqIEFycmF5IG9mIHRhZ3MgKi9cbiAgdGFnczogc3RyaW5nW11bXTtcbiAgLyoqIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xufVxuXG4vKiogSW50ZXJmYWNlIGZvciBldmVudHMgdGhhdCBoYXZlbid0IGJlZW4gc2lnbmVkIHlldCAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnNpZ25lZE5vc3RyRXZlbnQgZXh0ZW5kcyBCYXNlTm9zdHJFdmVudCB7XG4gIC8qKiBPcHRpb25hbCBwdWJsaWMga2V5ICovXG4gIHB1YmtleT86IHN0cmluZztcbn1cblxuLyoqIEludGVyZmFjZSBmb3Igc2lnbmVkIGV2ZW50cyAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduZWROb3N0ckV2ZW50IGV4dGVuZHMgQmFzZU5vc3RyRXZlbnQge1xuICAvKiogUHVibGljIGtleSBvZiB0aGUgZXZlbnQgY3JlYXRvciAqL1xuICBwdWJrZXk6IHN0cmluZztcbiAgLyoqIEV2ZW50IElEIChzaGEyNTYgb2YgdGhlIHNlcmlhbGl6ZWQgZXZlbnQpICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBTY2hub3JyIHNpZ25hdHVyZSBvZiB0aGUgZXZlbnQgSUQgKi9cbiAgc2lnOiBzdHJpbmc7XG59XG5cbi8qKiBBbGlhcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqL1xuZXhwb3J0IHR5cGUgTm9zdHJFdmVudCA9IFNpZ25lZE5vc3RyRXZlbnQ7XG5cbi8qKiBUeXBlIGZvciBjcmVhdGluZyBuZXcgZXZlbnRzICovXG5leHBvcnQgdHlwZSBVbnNpZ25lZEV2ZW50ID0gT21pdDxOb3N0ckV2ZW50LCAnaWQnIHwgJ3NpZyc+O1xuXG4vLyBGaWx0ZXIgVHlwZXNcbmV4cG9ydCBpbnRlcmZhY2UgTm9zdHJGaWx0ZXIge1xuICBpZHM/OiBzdHJpbmdbXTtcbiAgYXV0aG9ycz86IHN0cmluZ1tdO1xuICBraW5kcz86IE5vc3RyRXZlbnRLaW5kW107XG4gIHNpbmNlPzogbnVtYmVyO1xuICB1bnRpbD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gICcjZSc/OiBzdHJpbmdbXTtcbiAgJyNwJz86IHN0cmluZ1tdO1xuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8qKiBTdXBwb3J0IGZvciBhcmJpdHJhcnkgdGFncyAoTklQLTEyKSAqL1xuICBba2V5OiBgIyR7c3RyaW5nfWBdOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3N0clN1YnNjcmlwdGlvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIGZpbHRlcnM6IE5vc3RyRmlsdGVyW107XG59XG5cbi8vIE1lc3NhZ2UgVHlwZXNcbmV4cG9ydCBlbnVtIE5vc3RyTWVzc2FnZVR5cGUge1xuICBFVkVOVCA9ICdFVkVOVCcsXG4gIE5PVElDRSA9ICdOT1RJQ0UnLFxuICBPSyA9ICdPSycsXG4gIEVPU0UgPSAnRU9TRScsXG4gIFJFUSA9ICdSRVEnLFxuICBDTE9TRSA9ICdDTE9TRScsXG4gIEFVVEggPSAnQVVUSCdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3N0ck1lc3NhZ2Uge1xuICB0eXBlOiBOb3N0ck1lc3NhZ2VUeXBlO1xuICBldmVudD86IFNpZ25lZE5vc3RyRXZlbnQ7XG4gIHN1YnNjcmlwdGlvbklkPzogc3RyaW5nO1xuICBmaWx0ZXJzPzogTm9zdHJGaWx0ZXJbXTtcbiAgZXZlbnRJZD86IHN0cmluZztcbiAgYWNjZXB0ZWQ/OiBib29sZWFuO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBjb3VudD86IG51bWJlcjtcbiAgcGF5bG9hZD86IHN0cmluZyB8IChzdHJpbmcgfCBib29sZWFuKVtdOyAgXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9zdHJSZXNwb25zZSB7XG4gIHR5cGU6IE5vc3RyTWVzc2FnZVR5cGU7XG4gIGV2ZW50PzogU2lnbmVkTm9zdHJFdmVudDtcbiAgc3Vic2NyaXB0aW9uSWQ/OiBzdHJpbmc7XG4gIGZpbHRlcnM/OiBOb3N0ckZpbHRlcltdO1xuICBldmVudElkPzogc3RyaW5nO1xuICBhY2NlcHRlZD86IGJvb2xlYW47XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIGNvdW50PzogbnVtYmVyO1xufVxuXG4vLyBVdGlsaXR5IFR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb3N0ckVycm9yIHtcbiAgY29kZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cbiIsICIvKipcbiAqIEBtb2R1bGUgdHlwZXMvcHJvdG9jb2xcbiAqIEBkZXNjcmlwdGlvbiBOb3N0ciBwcm90b2NvbCB0eXBlc1xuICovXG5cbmltcG9ydCB0eXBlIHsgXG4gIE5vc3RyRmlsdGVyLCBcbiAgUHVibGljS2V5LFxuICBOb3N0ck1lc3NhZ2VUeXBlLFxuICBOb3N0clN1YnNjcmlwdGlvbixcbiAgTm9zdHJSZXNwb25zZSxcbiAgTm9zdHJFcnJvclxufSBmcm9tICcuL2Jhc2UuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZnJvbSBiYXNlIHRoYXQgYXJlIHVzZWQgaW4gdGhpcyBtb2R1bGVcbmV4cG9ydCB0eXBlIHsgXG4gIE5vc3RyRmlsdGVyLCBcbiAgUHVibGljS2V5LFxuICBOb3N0ck1lc3NhZ2VUeXBlLFxuICBOb3N0clN1YnNjcmlwdGlvbixcbiAgTm9zdHJSZXNwb25zZSxcbiAgTm9zdHJFcnJvclxufTtcbiIsICJleHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlcy5qcy5tYXAiLCAiLyoqXG4gKiBAbW9kdWxlIHR5cGVzL2d1YXJkc1xuICogQGRlc2NyaXB0aW9uIFR5cGUgZ3VhcmQgZnVuY3Rpb25zIGZvciBOb3N0ciB0eXBlc1xuICovXG5cbmltcG9ydCB7IE5vc3RyRXZlbnQsIFNpZ25lZE5vc3RyRXZlbnQsIE5vc3RyRmlsdGVyLCBOb3N0clN1YnNjcmlwdGlvbiwgTm9zdHJSZXNwb25zZSwgTm9zdHJFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgTm9zdHJFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb3N0ckV2ZW50KGV2ZW50OiB1bmtub3duKTogZXZlbnQgaXMgTm9zdHJFdmVudCB7XG4gIGlmICh0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8IGV2ZW50ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdmFsaWRFdmVudCA9IGV2ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFJlcXVpcmVkIGZpZWxkc1xuICBpZiAodHlwZW9mIHZhbGlkRXZlbnQua2luZCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIodmFsaWRFdmVudC5raW5kKSB8fCB2YWxpZEV2ZW50LmtpbmQgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWxpZEV2ZW50LmNvbnRlbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWxpZEV2ZW50LmNyZWF0ZWRfYXQgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbGlkRXZlbnQuY3JlYXRlZF9hdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBwdWJrZXkgc3RydWN0dXJlXG4gIGlmICh2YWxpZEV2ZW50LnB1YmtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiB2YWxpZEV2ZW50LnB1YmtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghdmFsaWRFdmVudC5wdWJrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbGlkRXZlbnQucHVia2V5ID09PSAnb2JqZWN0JyAmJiB2YWxpZEV2ZW50LnB1YmtleSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcHVia2V5ID0gdmFsaWRFdmVudC5wdWJrZXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBpZiAodHlwZW9mIHB1YmtleS5oZXggIT09ICdzdHJpbmcnIHx8ICFwdWJrZXkuaGV4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHRhZ3MgYXJyYXlcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbGlkRXZlbnQudGFncykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayB0YWcgYXJyYXkgZWxlbWVudHNcbiAgaWYgKCF2YWxpZEV2ZW50LnRhZ3MuZXZlcnkodGFnID0+IEFycmF5LmlzQXJyYXkodGFnKSAmJiB0YWcuZXZlcnkoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIFNpZ25lZE5vc3RyRXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2lnbmVkTm9zdHJFdmVudChldmVudDogdW5rbm93bik6IGV2ZW50IGlzIFNpZ25lZE5vc3RyRXZlbnQge1xuICBpZiAoIWV2ZW50IHx8IHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzaWduZWRFdmVudCA9IGV2ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIENoZWNrIHJlcXVpcmVkIGZpZWxkcyBmcm9tIE5vc3RyRXZlbnRcbiAgaWYgKCFpc05vc3RyRXZlbnQoZXZlbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgcHVia2V5IGlzIHByZXNlbnQgYW5kIHZhbGlkXG4gIGlmICh0eXBlb2Ygc2lnbmVkRXZlbnQucHVia2V5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghc2lnbmVkRXZlbnQucHVia2V5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzaWduZWRFdmVudC5wdWJrZXkgPT09ICdvYmplY3QnICYmIHNpZ25lZEV2ZW50LnB1YmtleSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHB1YmtleSA9IHNpZ25lZEV2ZW50LnB1YmtleSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIHB1YmtleS5oZXggIT09ICdzdHJpbmcnIHx8ICFwdWJrZXkuaGV4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlkIGZpZWxkXG4gIGlmICh0eXBlb2Ygc2lnbmVkRXZlbnQuaWQgIT09ICdzdHJpbmcnIHx8ICFzaWduZWRFdmVudC5pZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHNpZyBmaWVsZFxuICBpZiAodHlwZW9mIHNpZ25lZEV2ZW50LnNpZyAhPT0gJ3N0cmluZycgfHwgIXNpZ25lZEV2ZW50LnNpZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIE5vc3RyRmlsdGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vc3RyRmlsdGVyKGZpbHRlcjogdW5rbm93bik6IGZpbHRlciBpcyBOb3N0ckZpbHRlciB7XG4gIGlmICh0eXBlb2YgZmlsdGVyICE9PSAnb2JqZWN0JyB8fCBmaWx0ZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2YWxpZEZpbHRlciA9IGZpbHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdmFsaWRLZXlzID0gWydpZHMnLCAnYXV0aG9ycycsICdraW5kcycsICdzaW5jZScsICd1bnRpbCcsICdsaW1pdCcsICcjZScsICcjcCcsICcjdCddO1xuICBjb25zdCBmaWx0ZXJLZXlzID0gT2JqZWN0LmtleXModmFsaWRGaWx0ZXIpO1xuXG4gIC8vIENoZWNrIGlmIGFsbCBrZXlzIGluIHRoZSBmaWx0ZXIgYXJlIHZhbGlkXG4gIGlmICghZmlsdGVyS2V5cy5ldmVyeShrZXkgPT4gdmFsaWRLZXlzLmluY2x1ZGVzKGtleSkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgYXJyYXkgZmllbGRzXG4gIGlmICh2YWxpZEZpbHRlci5pZHMgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkodmFsaWRGaWx0ZXIuaWRzKSB8fCAhdmFsaWRGaWx0ZXIuaWRzLmV2ZXJ5KGlkID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodmFsaWRGaWx0ZXIuYXV0aG9ycyAhPT0gdW5kZWZpbmVkICYmICghQXJyYXkuaXNBcnJheSh2YWxpZEZpbHRlci5hdXRob3JzKSB8fCAhdmFsaWRGaWx0ZXIuYXV0aG9ycy5ldmVyeShhdXRob3IgPT4gdHlwZW9mIGF1dGhvciA9PT0gJ3N0cmluZycpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodmFsaWRGaWx0ZXIua2luZHMgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkodmFsaWRGaWx0ZXIua2luZHMpIHx8ICF2YWxpZEZpbHRlci5raW5kcy5ldmVyeShraW5kID0+IHR5cGVvZiBraW5kID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGtpbmQpICYmIGtpbmQgPj0gMCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWxpZEZpbHRlclsnI2UnXSAhPT0gdW5kZWZpbmVkICYmICghQXJyYXkuaXNBcnJheSh2YWxpZEZpbHRlclsnI2UnXSkgfHwgIXZhbGlkRmlsdGVyWycjZSddLmV2ZXJ5KGUgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbGlkRmlsdGVyWycjcCddICE9PSB1bmRlZmluZWQgJiYgKCFBcnJheS5pc0FycmF5KHZhbGlkRmlsdGVyWycjcCddKSB8fCAhdmFsaWRGaWx0ZXJbJyNwJ10uZXZlcnkocCA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodmFsaWRGaWx0ZXJbJyN0J10gIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkodmFsaWRGaWx0ZXJbJyN0J10pIHx8ICF2YWxpZEZpbHRlclsnI3QnXS5ldmVyeSh0ID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJykpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgbnVtYmVyIGZpZWxkc1xuICBpZiAodmFsaWRGaWx0ZXIuc2luY2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsaWRGaWx0ZXIuc2luY2UgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG4gIGlmICh2YWxpZEZpbHRlci51bnRpbCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWxpZEZpbHRlci51bnRpbCAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbGlkRmlsdGVyLmxpbWl0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbGlkRmlsdGVyLmxpbWl0ICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIE5vc3RyU3Vic2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vc3RyU3Vic2NyaXB0aW9uKHN1YjogdW5rbm93bik6IHN1YiBpcyBOb3N0clN1YnNjcmlwdGlvbiB7XG4gIGlmICh0eXBlb2Ygc3ViICE9PSAnb2JqZWN0JyB8fCBzdWIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2YWxpZFN1YiA9IHN1YiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAodHlwZW9mIHZhbGlkU3ViLmlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWxpZFN1Yi5maWx0ZXJzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghdmFsaWRTdWIuZmlsdGVycy5ldmVyeShmaWx0ZXIgPT4gaXNOb3N0ckZpbHRlcihmaWx0ZXIpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIE5vc3RyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9zdHJSZXNwb25zZShyZXNwb25zZTogdW5rbm93bik6IHJlc3BvbnNlIGlzIE5vc3RyUmVzcG9uc2Uge1xuICBpZiAodHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCByZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHZhbGlkUmVzcG9uc2UgPSByZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAodHlwZW9mIHZhbGlkUmVzcG9uc2UudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodmFsaWRSZXNwb25zZS5zdWJzY3JpcHRpb25JZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWxpZFJlc3BvbnNlLnN1YnNjcmlwdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh2YWxpZFJlc3BvbnNlLmV2ZW50ICE9PSB1bmRlZmluZWQgJiYgIWlzU2lnbmVkTm9zdHJFdmVudCh2YWxpZFJlc3BvbnNlLmV2ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh2YWxpZFJlc3BvbnNlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsaWRSZXNwb25zZS5tZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIE5vc3RyRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9zdHJFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vc3RyRXJyb3Ige1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHZhbGlkRXJyb3IgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWxpZEVycm9yLnR5cGUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIHZhbGlkRXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZydcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBtb2R1bGUgdHlwZXMvbmlwNDZcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb25zIGZvciBOSVAtNDYgKE5vc3RyIENvbm5lY3QgLyBSZW1vdGUgU2lnbmluZylcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNDYubWRcbiAqL1xuXG4vKipcbiAqIE5JUC00NiByZW1vdGUgc2lnbmluZyBtZXRob2RzXG4gKi9cbmV4cG9ydCBlbnVtIE5pcDQ2TWV0aG9kIHtcbiAgQ09OTkVDVCA9ICdjb25uZWN0JyxcbiAgUElORyA9ICdwaW5nJyxcbiAgR0VUX1BVQkxJQ19LRVkgPSAnZ2V0X3B1YmxpY19rZXknLFxuICBTSUdOX0VWRU5UID0gJ3NpZ25fZXZlbnQnLFxuICBOSVAwNF9FTkNSWVBUID0gJ25pcDA0X2VuY3J5cHQnLFxuICBOSVAwNF9ERUNSWVBUID0gJ25pcDA0X2RlY3J5cHQnLFxuICBOSVA0NF9FTkNSWVBUID0gJ25pcDQ0X2VuY3J5cHQnLFxuICBOSVA0NF9ERUNSWVBUID0gJ25pcDQ0X2RlY3J5cHQnLFxuICBHRVRfUkVMQVlTID0gJ2dldF9yZWxheXMnLFxufVxuXG4vKipcbiAqIFBhcnNlZCBidW5rZXI6Ly8gVVJJXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVua2VyVVJJIHtcbiAgLyoqIFJlbW90ZSBzaWduZXIncyBwdWJsaWMga2V5IChoZXgpICovXG4gIHJlbW90ZVB1YmtleTogc3RyaW5nO1xuICAvKiogUmVsYXkgVVJMcyBmb3IgY29tbXVuaWNhdGlvbiAqL1xuICByZWxheXM6IHN0cmluZ1tdO1xuICAvKiogT3B0aW9uYWwgc2VjcmV0IGZvciBpbml0aWFsIGNvbm5lY3Rpb24gKi9cbiAgc2VjcmV0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5JUC00NiBKU09OLVJQQyByZXF1ZXN0IChjbGllbnQgLT4gc2lnbmVyKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pcDQ2UmVxdWVzdCB7XG4gIGlkOiBzdHJpbmc7XG4gIG1ldGhvZDogTmlwNDZNZXRob2QgfCBzdHJpbmc7XG4gIHBhcmFtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogTklQLTQ2IEpTT04tUlBDIHJlc3BvbnNlIChzaWduZXIgLT4gY2xpZW50KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pcDQ2UmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICByZXN1bHQ/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgTklQLTQ2IHNlc3Npb24gY29udGFpbmluZyB0aGUgZXBoZW1lcmFsIGtleXBhaXIgYW5kIGNvbnZlcnNhdGlvbiBrZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaXA0NlNlc3Npb24ge1xuICAvKiogQ2xpZW50J3MgZXBoZW1lcmFsIHByaXZhdGUga2V5IChoZXgpICovXG4gIGNsaWVudFNlY3JldEtleTogc3RyaW5nO1xuICAvKiogQ2xpZW50J3MgZXBoZW1lcmFsIHB1YmxpYyBrZXkgKGhleCkgKi9cbiAgY2xpZW50UHVia2V5OiBzdHJpbmc7XG4gIC8qKiBSZW1vdGUgc2lnbmVyJ3MgcHVibGljIGtleSAoaGV4KSAqL1xuICByZW1vdGVQdWJrZXk6IHN0cmluZztcbiAgLyoqIE5JUC00NCBjb252ZXJzYXRpb24ga2V5IChkZXJpdmVkIGZyb20gRUNESCkgKi9cbiAgY29udmVyc2F0aW9uS2V5OiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIFB1YmxpYyBzZXNzaW9uIGluZm8gKHNhZmUgdG8gZXhwb3NlOyBleGNsdWRlcyBwcml2YXRlIGtleSBhbmQgY29udmVyc2F0aW9uIGtleSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaXA0NlNlc3Npb25JbmZvIHtcbiAgY2xpZW50UHVia2V5OiBzdHJpbmc7XG4gIHJlbW90ZVB1YmtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB2YWxpZGF0aW5nIGEgYnVua2VyOi8vIFVSSVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmtlclZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgdXJpPzogQnVua2VyVVJJO1xufVxuIiwgIi8qKlxuICogQG1vZHVsZSBjcnlwdG9cbiAqIEBkZXNjcmlwdGlvbiBDcnlwdG9ncmFwaGljIHV0aWxpdGllcyBmb3IgTm9zdHJcbiAqIFxuICogSU1QT1JUQU5UOiBOb3N0ciBQcm90b2NvbCBDcnlwdG9ncmFwaGljIFJlcXVpcmVtZW50c1xuICogV2hpbGUgc2VjcDI1NmsxIGlzIHRoZSB1bmRlcmx5aW5nIGVsbGlwdGljIGN1cnZlIHVzZWQgYnkgTm9zdHIsIHRoZSBwcm90b2NvbCBzcGVjaWZpY2FsbHlcbiAqIHJlcXVpcmVzIHNjaG5vcnIgc2lnbmF0dXJlcyBhcyBkZWZpbmVkIGluIE5JUC0wMS4gVGhpcyBtZWFuczpcbiAqIFxuICogMS4gQWx3YXlzIHVzZSBzY2hub3JyLXNwZWNpZmljIGZ1bmN0aW9uczpcbiAqICAgIC0gc2Nobm9yci5nZXRQdWJsaWNLZXkoKSBmb3IgcHVibGljIGtleSBnZW5lcmF0aW9uXG4gKiAgICAtIHNjaG5vcnIuc2lnbigpIGZvciBzaWduaW5nXG4gKiAgICAtIHNjaG5vcnIudmVyaWZ5KCkgZm9yIHZlcmlmaWNhdGlvblxuICogXG4gKiAyLiBBdm9pZCB1c2luZyBzZWNwMjU2azEgZnVuY3Rpb25zIGRpcmVjdGx5OlxuICogICAgLSBET04nVCB1c2Ugc2VjcDI1NmsxLmdldFB1YmxpY0tleSgpXG4gKiAgICAtIERPTidUIHVzZSBzZWNwMjU2azEuc2lnbigpXG4gKiAgICAtIERPTidUIHVzZSBzZWNwMjU2azEudmVyaWZ5KClcbiAqIFxuICogV2hpbGUgYm90aCBtaWdodCB3b3JrIGluIHNvbWUgY2FzZXMgKGFzIHRoZXkgdXNlIHRoZSBzYW1lIGN1cnZlKSwgdGhlIHNjaG5vcnIgc2lnbmF0dXJlXG4gKiBzY2hlbWUgaGFzIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3Iga2V5IGFuZCBzaWduYXR1cmUgZm9ybWF0cyB0aGF0IGFyZW4ndCBndWFyYW50ZWVkXG4gKiB3aGVuIHVzaW5nIHRoZSBsb3dlci1sZXZlbCBzZWNwMjU2azEgZnVuY3Rpb25zIGRpcmVjdGx5LlxuICovXG5cbmltcG9ydCB7IHNjaG5vcnIsIHNlY3AyNTZrMSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvc2VjcDI1NmsxLmpzJztcbmltcG9ydCB7IGJ5dGVzVG9IZXgsIGhleFRvQnl0ZXMsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscy5qcyc7XG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTIuanMnO1xuaW1wb3J0IHsgS2V5UGFpciwgUHVibGljS2V5RGV0YWlscywgTm9zdHJFdmVudCwgU2lnbmVkTm9zdHJFdmVudCwgUHVibGljS2V5IH0gZnJvbSAnLi90eXBlcy9pbmRleCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0LCBiYXNlNjRUb0J5dGVzIH0gZnJvbSAnLi9lbmNvZGluZy9iYXNlNjQnO1xuXG5cbi8qKlxuICogQ3VzdG9tIGNyeXB0byBpbnRlcmZhY2UgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcnlwdG9TdWJ0bGUge1xuICBzdWJ0bGU6IHtcbiAgICBnZW5lcmF0ZUtleShcbiAgICAgIGFsZ29yaXRobTogUnNhSGFzaGVkS2V5R2VuUGFyYW1zIHwgRWNLZXlHZW5QYXJhbXMsXG4gICAgICBleHRyYWN0YWJsZTogYm9vbGVhbixcbiAgICAgIGtleVVzYWdlczogcmVhZG9ubHkgS2V5VXNhZ2VbXVxuICAgICk6IFByb21pc2U8Q3J5cHRvS2V5UGFpcj47XG4gICAgaW1wb3J0S2V5KFxuICAgICAgZm9ybWF0OiAncmF3JyB8ICdwa2NzOCcgfCAnc3BraScsXG4gICAgICBrZXlEYXRhOiBBcnJheUJ1ZmZlcixcbiAgICAgIGFsZ29yaXRobTogUnNhSGFzaGVkSW1wb3J0UGFyYW1zIHwgRWNLZXlJbXBvcnRQYXJhbXMgfCBBZXNLZXlBbGdvcml0aG0sXG4gICAgICBleHRyYWN0YWJsZTogYm9vbGVhbixcbiAgICAgIGtleVVzYWdlczogcmVhZG9ubHkgS2V5VXNhZ2VbXVxuICAgICk6IFByb21pc2U8Q3J5cHRvS2V5PjtcbiAgICBlbmNyeXB0KFxuICAgICAgYWxnb3JpdGhtOiB7IG5hbWU6IHN0cmluZzsgaXY6IFVpbnQ4QXJyYXkgfSxcbiAgICAgIGtleTogQ3J5cHRvS2V5LFxuICAgICAgZGF0YTogQXJyYXlCdWZmZXJcbiAgICApOiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBkZWNyeXB0KFxuICAgICAgYWxnb3JpdGhtOiB7IG5hbWU6IHN0cmluZzsgaXY6IFVpbnQ4QXJyYXkgfSxcbiAgICAgIGtleTogQ3J5cHRvS2V5LFxuICAgICAgZGF0YTogQXJyYXlCdWZmZXJcbiAgICApOiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgfTtcbiAgZ2V0UmFuZG9tVmFsdWVzPFQgZXh0ZW5kcyBVaW50OEFycmF5IHwgSW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBJbnQxNkFycmF5IHwgVWludDMyQXJyYXkgfCBJbnQzMkFycmF5PihhcnJheTogVCk6IFQ7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgY3J5cHRvOiBDcnlwdG9TdWJ0bGU7XG4gIH1cbiAgaW50ZXJmYWNlIEdsb2JhbCB7XG4gICAgY3J5cHRvOiBDcnlwdG9TdWJ0bGU7XG4gIH1cbn1cblxuLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBjcnlwdG8gaW1wbGVtZW50YXRpb25cbmNvbnN0IGdldENyeXB0byA9IGFzeW5jICgpOiBQcm9taXNlPENyeXB0b1N1YnRsZT4gPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0bykge1xuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiAoZ2xvYmFsIGFzIEdsb2JhbCkuY3J5cHRvKSB7XG4gICAgcmV0dXJuIChnbG9iYWwgYXMgR2xvYmFsKS5jcnlwdG87XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjcnlwdG9Nb2R1bGUgPSBhd2FpdCBpbXBvcnQoJ2NyeXB0bycpO1xuICAgIGlmIChjcnlwdG9Nb2R1bGUud2ViY3J5cHRvKSB7XG4gICAgICByZXR1cm4gY3J5cHRvTW9kdWxlLndlYmNyeXB0byBhcyBDcnlwdG9TdWJ0bGU7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIuZGVidWcoJ05vZGUgY3J5cHRvIG5vdCBhdmFpbGFibGUnKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gV2ViQ3J5cHRvIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZScpO1xufTtcblxuLyoqXG4gKiBDcnlwdG8gaW1wbGVtZW50YXRpb24gdGhhdCB3b3JrcyBpbiBib3RoIE5vZGUuanMgYW5kIGJyb3dzZXIgZW52aXJvbm1lbnRzXG4gKi9cbmNsYXNzIEN1c3RvbUNyeXB0byB7XG4gIHByaXZhdGUgY3J5cHRvSW5zdGFuY2U6IENyeXB0b1N1YnRsZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5pdFByb21pc2UgPSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNyeXB0b0luc3RhbmNlID0gYXdhaXQgZ2V0Q3J5cHRvKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8Q3J5cHRvU3VidGxlPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICBpZiAoIXRoaXMuY3J5cHRvSW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3J5cHRvIGltcGxlbWVudGF0aW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcnlwdG9JbnN0YW5jZTtcbiAgfVxuXG4gIGFzeW5jIGdldFN1YnRsZSgpOiBQcm9taXNlPENyeXB0b1N1YnRsZVsnc3VidGxlJ10+IHtcbiAgICBjb25zdCBjcnlwdG8gPSBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIGNyeXB0by5zdWJ0bGU7XG4gIH1cblxuICBhc3luYyBnZXRSYW5kb21WYWx1ZXM8VCBleHRlbmRzIFVpbnQ4QXJyYXkgfCBJbnQ4QXJyYXkgfCBVaW50MTZBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MzJBcnJheSB8IEludDMyQXJyYXk+KGFycmF5OiBUKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY3J5cHRvID0gYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgfVxufVxuXG4vLyBDcmVhdGUgYW5kIGV4cG9ydCBkZWZhdWx0IGluc3RhbmNlXG5leHBvcnQgY29uc3QgY3VzdG9tQ3J5cHRvID0gbmV3IEN1c3RvbUNyeXB0bygpO1xuXG4vLyBFeHBvcnQgc2Nobm9yciBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBzaWduU2Nobm9yciA9IHNjaG5vcnIuc2lnbjtcbmV4cG9ydCBjb25zdCB2ZXJpZnlTY2hub3JyU2lnbmF0dXJlID0gc2Nobm9yci52ZXJpZnk7XG5cbi8qKlxuICogR2V0cyB0aGUgY29tcHJlc3NlZCBwdWJsaWMga2V5ICgzMyBieXRlcyB3aXRoIHByZWZpeClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXByZXNzZWRQdWJsaWNLZXkocHJpdmF0ZUtleUJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIHJldHVybiBzZWNwMjU2azEuZ2V0UHVibGljS2V5KHByaXZhdGVLZXlCeXRlcywgdHJ1ZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2Nobm9yciBwdWJsaWMga2V5ICgzMiBieXRlcyB4LWNvb3JkaW5hdGUpIGFzIHBlciBCSVAzNDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaG5vcnJQdWJsaWNLZXkocHJpdmF0ZUtleUJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIHJldHVybiBzY2hub3JyLmdldFB1YmxpY0tleShwcml2YXRlS2V5Qnl0ZXMpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG5ldyBrZXkgcGFpclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVLZXlQYWlyKCk6IFByb21pc2U8S2V5UGFpcj4ge1xuICBjb25zdCBwcml2YXRlS2V5Qnl0ZXMgPSByYW5kb21CeXRlcygzMik7XG4gIGNvbnN0IHByaXZhdGVLZXkgPSBieXRlc1RvSGV4KHByaXZhdGVLZXlCeXRlcyk7XG4gIHByaXZhdGVLZXlCeXRlcy5maWxsKDApOyAvLyB6ZXJvIHNvdXJjZSBtYXRlcmlhbFxuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBnZXRQdWJsaWNLZXkocHJpdmF0ZUtleSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcml2YXRlS2V5LFxuICAgIHB1YmxpY0tleVxuICB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBwdWJsaWMga2V5IGZyb20gYSBwcml2YXRlIGtleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljS2V5KHByaXZhdGVLZXk6IHN0cmluZyk6IFByb21pc2U8UHVibGljS2V5RGV0YWlscz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHByaXZhdGVLZXlCeXRlcyA9IGhleFRvQnl0ZXMocHJpdmF0ZUtleSk7XG4gICAgY29uc3QgcHVibGljS2V5Qnl0ZXMgPSBzY2hub3JyLmdldFB1YmxpY0tleShwcml2YXRlS2V5Qnl0ZXMpO1xuICAgIHJldHVybiB7XG4gICAgICBoZXg6IGJ5dGVzVG9IZXgocHVibGljS2V5Qnl0ZXMpLFxuICAgICAgYnl0ZXM6IHB1YmxpY0tleUJ5dGVzXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIGdldCBwdWJsaWMga2V5Jyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBrZXkgcGFpclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVLZXlQYWlyKGtleVBhaXI6IEtleVBhaXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkZXJpdmVkUHViS2V5ID0gYXdhaXQgZ2V0UHVibGljS2V5KGtleVBhaXIucHJpdmF0ZUtleSk7XG4gICAgcmV0dXJuIGRlcml2ZWRQdWJLZXkuaGV4ID09PSBrZXlQYWlyLnB1YmxpY0tleS5oZXg7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKHsgZXJyb3IgfSwgJ0ZhaWxlZCB0byB2YWxpZGF0ZSBrZXkgcGFpcicpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KGV2ZW50OiBQYXJ0aWFsPE5vc3RyRXZlbnQ+KTogTm9zdHJFdmVudCB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uZXZlbnQsXG4gICAgY3JlYXRlZF9hdDogZXZlbnQuY3JlYXRlZF9hdCB8fCB0aW1lc3RhbXAsXG4gICAgdGFnczogZXZlbnQudGFncyB8fCBbXSxcbiAgICBjb250ZW50OiBldmVudC5jb250ZW50IHx8ICcnLFxuICAgIGtpbmQ6IGV2ZW50LmtpbmQgfHwgMVxuICB9IGFzIE5vc3RyRXZlbnQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcHJpdmF0ZSBrZXkgdG8gaGV4IHN0cmluZyAoYWNjZXB0cyBib3RoIGhleCBzdHJpbmcgYW5kIFVpbnQ4QXJyYXkpXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByaXZhdGVLZXkocHJpdmF0ZUtleTogc3RyaW5nIHwgVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGlmIChwcml2YXRlS2V5IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiBieXRlc1RvSGV4KHByaXZhdGVLZXkpO1xuICB9XG4gIHJldHVybiBwcml2YXRlS2V5O1xufVxuXG4vKipcbiAqIFNpZ25zIGFuIGV2ZW50XG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudCB0byBzaWduXG4gKiBAcGFyYW0gcHJpdmF0ZUtleSAtIFByaXZhdGUga2V5IGFzIGhleCBzdHJpbmcgb3IgVWludDhBcnJheVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkV2ZW50KGV2ZW50OiBOb3N0ckV2ZW50LCBwcml2YXRlS2V5OiBzdHJpbmcgfCBVaW50OEFycmF5KTogUHJvbWlzZTxTaWduZWROb3N0ckV2ZW50PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJpdmF0ZUtleUhleCA9IG5vcm1hbGl6ZVByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG5cbiAgICAvLyBTZXJpYWxpemUgZXZlbnQgZm9yIHNpZ25pbmcgKE5JUC0wMSBmb3JtYXQpXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KFtcbiAgICAgIDAsXG4gICAgICBldmVudC5wdWJrZXksXG4gICAgICBldmVudC5jcmVhdGVkX2F0LFxuICAgICAgZXZlbnQua2luZCxcbiAgICAgIGV2ZW50LnRhZ3MsXG4gICAgICBldmVudC5jb250ZW50XG4gICAgXSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgZXZlbnQgaGFzaFxuICAgIGNvbnN0IGV2ZW50SGFzaCA9IHNoYTI1NihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplZCkpO1xuXG4gICAgLy8gQ29udmVydCBwcml2YXRlIGtleSB0byBieXRlcyBhbmQgc2lnblxuICAgIGNvbnN0IHByaXZhdGVLZXlCeXRlcyA9IGhleFRvQnl0ZXMocHJpdmF0ZUtleUhleCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBzY2hub3JyLnNpZ24oZXZlbnRIYXNoLCBwcml2YXRlS2V5Qnl0ZXMpO1xuXG4gICAgLy8gQ3JlYXRlIHNpZ25lZCBldmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGlkOiBieXRlc1RvSGV4KGV2ZW50SGFzaCksXG4gICAgICBzaWc6IGJ5dGVzVG9IZXgoc2lnbmF0dXJlQnl0ZXMpXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHNpZ24gZXZlbnQnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSBwdWJsaWMga2V5IGhleCBzdHJpbmcgZnJvbSBhIHByaXZhdGUga2V5IChzeW5jaHJvbm91cylcbiAqIEBwYXJhbSBwcml2YXRlS2V5IC0gUHJpdmF0ZSBrZXkgYXMgaGV4IHN0cmluZyBvciBVaW50OEFycmF5XG4gKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBwdWJsaWMga2V5ICgzMi1ieXRlIHgtb25seSBzY2hub3JyIGtleSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFB1YmxpY0tleVN5bmMocHJpdmF0ZUtleTogc3RyaW5nIHwgVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IHByaXZhdGVLZXlCeXRlcyA9IHByaXZhdGVLZXkgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgPyBwcml2YXRlS2V5XG4gICAgOiBoZXhUb0J5dGVzKHByaXZhdGVLZXkpO1xuICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IHNjaG5vcnIuZ2V0UHVibGljS2V5KHByaXZhdGVLZXlCeXRlcyk7XG4gIHJldHVybiBieXRlc1RvSGV4KHB1YmxpY0tleUJ5dGVzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzLCBoYXNoZXMsIGFuZCBzaWducyBhIE5vc3RyIGV2ZW50IGluIG9uZSBzdGVwXG4gKiBAcGFyYW0gZXZlbnQgLSBQYXJ0aWFsIGV2ZW50IChraW5kLCBjb250ZW50LCB0YWdzIHJlcXVpcmVkOyBwdWJrZXkgZGVyaXZlZCBpZiBtaXNzaW5nKVxuICogQHBhcmFtIHByaXZhdGVLZXkgLSBQcml2YXRlIGtleSBhcyBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXlcbiAqIEByZXR1cm5zIEZ1bGx5IHNpZ25lZCBldmVudCB3aXRoIGlkLCBwdWJrZXksIGFuZCBzaWdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplRXZlbnQoXG4gIGV2ZW50OiBQYXJ0aWFsPE5vc3RyRXZlbnQ+LFxuICBwcml2YXRlS2V5OiBzdHJpbmcgfCBVaW50OEFycmF5XG4pOiBQcm9taXNlPFNpZ25lZE5vc3RyRXZlbnQ+IHtcbiAgY29uc3QgcHVia2V5ID0gZXZlbnQucHVia2V5IHx8IGdldFB1YmxpY0tleVN5bmMocHJpdmF0ZUtleSk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IGV2ZW50LmNyZWF0ZWRfYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgY29uc3QgZnVsbEV2ZW50OiBOb3N0ckV2ZW50ID0ge1xuICAgIGtpbmQ6IGV2ZW50LmtpbmQgfHwgMSxcbiAgICBjcmVhdGVkX2F0OiB0aW1lc3RhbXAsXG4gICAgdGFnczogZXZlbnQudGFncyB8fCBbXSxcbiAgICBjb250ZW50OiBldmVudC5jb250ZW50IHx8ICcnLFxuICAgIHB1YmtleSxcbiAgfTtcblxuICByZXR1cm4gc2lnbkV2ZW50KGZ1bGxFdmVudCwgcHJpdmF0ZUtleSk7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgYW4gZXZlbnQgc2lnbmF0dXJlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoZXZlbnQ6IFNpZ25lZE5vc3RyRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBTZXJpYWxpemUgZXZlbnQgZm9yIHZlcmlmaWNhdGlvbiAoTklQLTAxIGZvcm1hdClcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoW1xuICAgICAgMCxcbiAgICAgIGV2ZW50LnB1YmtleSxcbiAgICAgIGV2ZW50LmNyZWF0ZWRfYXQsXG4gICAgICBldmVudC5raW5kLFxuICAgICAgZXZlbnQudGFncyxcbiAgICAgIGV2ZW50LmNvbnRlbnRcbiAgICBdKTtcblxuICAgIC8vIENhbGN1bGF0ZSBldmVudCBoYXNoXG4gICAgY29uc3QgZXZlbnRIYXNoID0gc2hhMjU2KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzZXJpYWxpemVkKSk7XG5cbiAgICAvLyBWZXJpZnkgZXZlbnQgSURcbiAgICBjb25zdCBjYWxjdWxhdGVkSWQgPSBieXRlc1RvSGV4KGV2ZW50SGFzaCk7XG4gICAgaWYgKGNhbGN1bGF0ZWRJZCAhPT0gZXZlbnQuaWQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXZlbnQgSUQgbWlzbWF0Y2gnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGhleCBzdHJpbmdzIHRvIGJ5dGVzXG4gICAgY29uc3Qgc2lnbmF0dXJlQnl0ZXMgPSBoZXhUb0J5dGVzKGV2ZW50LnNpZyk7XG4gICAgY29uc3QgcHVia2V5Qnl0ZXMgPSBoZXhUb0J5dGVzKGV2ZW50LnB1YmtleSk7XG5cbiAgICAvLyBWZXJpZnkgc2lnbmF0dXJlXG4gICAgcmV0dXJuIHNjaG5vcnIudmVyaWZ5KHNpZ25hdHVyZUJ5dGVzLCBldmVudEhhc2gsIHB1YmtleUJ5dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHZlcmlmeSBzaWduYXR1cmUnKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNyeXB0cyBhIG1lc3NhZ2UgdXNpbmcgTklQLTA0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIHJlY2lwaWVudFB1YktleTogUHVibGljS2V5IHwgc3RyaW5nLFxuICBzZW5kZXJQcml2S2V5OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVjaXBpZW50UHViS2V5SGV4ID0gdHlwZW9mIHJlY2lwaWVudFB1YktleSA9PT0gJ3N0cmluZycgPyByZWNpcGllbnRQdWJLZXkgOiByZWNpcGllbnRQdWJLZXkuaGV4O1xuICAgIGNvbnN0IHNoYXJlZFBvaW50ID0gc2VjcDI1NmsxLmdldFNoYXJlZFNlY3JldChoZXhUb0J5dGVzKHNlbmRlclByaXZLZXkpLCBoZXhUb0J5dGVzKHJlY2lwaWVudFB1YktleUhleCkpO1xuICAgIGNvbnN0IHNoYXJlZFggPSBzaGFyZWRQb2ludC5zbGljZSgxLCAzMyk7XG5cbiAgICAvLyBHZW5lcmF0ZSByYW5kb20gSVZcbiAgICBjb25zdCBpdiA9IHJhbmRvbUJ5dGVzKDE2KTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjdXN0b21DcnlwdG8uZ2V0U3VidGxlKCkudGhlbigoc3VidGxlKSA9PiBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgJ3JhdycsXG4gICAgICBzaGFyZWRYLmJ1ZmZlcixcbiAgICAgIHsgbmFtZTogJ0FFUy1DQkMnLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2VuY3J5cHQnXVxuICAgICkpO1xuXG4gICAgLy8gWmVybyBzaGFyZWQgc2VjcmV0IG1hdGVyaWFsIG5vdyB0aGF0IEFFUyBrZXkgaXMgaW1wb3J0ZWRcbiAgICBzaGFyZWRYLmZpbGwoMCk7XG4gICAgc2hhcmVkUG9pbnQuZmlsbCgwKTtcblxuICAgIC8vIEVuY3J5cHQgdGhlIG1lc3NhZ2VcbiAgICBjb25zdCBkYXRhID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGN1c3RvbUNyeXB0by5nZXRTdWJ0bGUoKS50aGVuKChzdWJ0bGUpID0+IHN1YnRsZS5lbmNyeXB0KFxuICAgICAgeyBuYW1lOiAnQUVTLUNCQycsIGl2IH0sXG4gICAgICBrZXksXG4gICAgICBkYXRhLmJ1ZmZlclxuICAgICkpO1xuXG4gICAgLy8gTklQLTA0IHN0YW5kYXJkIGZvcm1hdDogYmFzZTY0KGNpcGhlcnRleHQpICsgXCI/aXY9XCIgKyBiYXNlNjQoaXYpXG4gICAgY29uc3QgY2lwaGVydGV4dEJhc2U2NCA9IGJ5dGVzVG9CYXNlNjQobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgY29uc3QgaXZCYXNlNjQgPSBieXRlc1RvQmFzZTY0KGl2KTtcblxuICAgIHJldHVybiBjaXBoZXJ0ZXh0QmFzZTY0ICsgJz9pdj0nICsgaXZCYXNlNjQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKHsgZXJyb3IgfSwgJ0ZhaWxlZCB0byBlbmNyeXB0IG1lc3NhZ2UnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIERlY3J5cHRzIGEgbWVzc2FnZSB1c2luZyBOSVAtMDRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQoXG4gIGVuY3J5cHRlZE1lc3NhZ2U6IHN0cmluZyxcbiAgc2VuZGVyUHViS2V5OiBQdWJsaWNLZXkgfCBzdHJpbmcsXG4gIHJlY2lwaWVudFByaXZLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZW5kZXJQdWJLZXlIZXggPSB0eXBlb2Ygc2VuZGVyUHViS2V5ID09PSAnc3RyaW5nJyA/IHNlbmRlclB1YktleSA6IHNlbmRlclB1YktleS5oZXg7XG4gICAgY29uc3Qgc2hhcmVkUG9pbnQgPSBzZWNwMjU2azEuZ2V0U2hhcmVkU2VjcmV0KGhleFRvQnl0ZXMocmVjaXBpZW50UHJpdktleSksIGhleFRvQnl0ZXMoc2VuZGVyUHViS2V5SGV4KSk7XG4gICAgY29uc3Qgc2hhcmVkWCA9IHNoYXJlZFBvaW50LnNsaWNlKDEsIDMzKTtcblxuICAgIC8vIFBhcnNlIE5JUC0wNCBzdGFuZGFyZCBmb3JtYXQ6IGJhc2U2NChjaXBoZXJ0ZXh0KSArIFwiP2l2PVwiICsgYmFzZTY0KGl2KVxuICAgIC8vIEFsc28gc3VwcG9ydCBsZWdhY3kgaGV4IGZvcm1hdCAoaXYgKyBjaXBoZXJ0ZXh0IGNvbmNhdGVuYXRlZCkgYXMgZmFsbGJhY2tcbiAgICBsZXQgaXY6IFVpbnQ4QXJyYXk7XG4gICAgbGV0IGNpcGhlcnRleHQ6IFVpbnQ4QXJyYXk7XG5cbiAgICBpZiAoZW5jcnlwdGVkTWVzc2FnZS5pbmNsdWRlcygnP2l2PScpKSB7XG4gICAgICAvLyBOSVAtMDQgc3RhbmRhcmQgZm9ybWF0XG4gICAgICBjb25zdCBbY2lwaGVydGV4dEJhc2U2NCwgaXZCYXNlNjRdID0gZW5jcnlwdGVkTWVzc2FnZS5zcGxpdCgnP2l2PScpO1xuICAgICAgY2lwaGVydGV4dCA9IGJhc2U2NFRvQnl0ZXMoY2lwaGVydGV4dEJhc2U2NCk7XG4gICAgICBpdiA9IGJhc2U2NFRvQnl0ZXMoaXZCYXNlNjQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWdhY3kgaGV4IGZvcm1hdCBmYWxsYmFjazogZmlyc3QgMTYgYnl0ZXMgYXJlIElWLCByZXN0IGlzIGNpcGhlcnRleHRcbiAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGhleFRvQnl0ZXMoZW5jcnlwdGVkTWVzc2FnZSk7XG4gICAgICBpdiA9IGVuY3J5cHRlZC5zbGljZSgwLCAxNik7XG4gICAgICBjaXBoZXJ0ZXh0ID0gZW5jcnlwdGVkLnNsaWNlKDE2KTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjdXN0b21DcnlwdG8uZ2V0U3VidGxlKCkudGhlbigoc3VidGxlKSA9PiBzdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgJ3JhdycsXG4gICAgICBzaGFyZWRYLmJ1ZmZlcixcbiAgICAgIHsgbmFtZTogJ0FFUy1DQkMnLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2RlY3J5cHQnXVxuICAgICkpO1xuXG4gICAgLy8gWmVybyBzaGFyZWQgc2VjcmV0IG1hdGVyaWFsIG5vdyB0aGF0IEFFUyBrZXkgaXMgaW1wb3J0ZWRcbiAgICBzaGFyZWRYLmZpbGwoMCk7XG4gICAgc2hhcmVkUG9pbnQuZmlsbCgwKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGN1c3RvbUNyeXB0by5nZXRTdWJ0bGUoKS50aGVuKChzdWJ0bGUpID0+IHN1YnRsZS5kZWNyeXB0KFxuICAgICAgeyBuYW1lOiAnQUVTLUNCQycsIGl2IH0sXG4gICAgICBrZXksXG4gICAgICBjaXBoZXJ0ZXh0LmJ1ZmZlciBhcyBBcnJheUJ1ZmZlclxuICAgICkpO1xuXG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNyeXB0ZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gZGVjcnlwdCBtZXNzYWdlJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiIsICIvKipcbiAqIFNFQ0cgc2VjcDI1NmsxLiBTZWUgW3BkZl0oaHR0cHM6Ly93d3cuc2VjZy5vcmcvc2VjMi12Mi5wZGYpLlxuICpcbiAqIEJlbG9uZ3MgdG8gS29ibGl0eiBjdXJ2ZXM6IGl0IGhhcyBlZmZpY2llbnRseS1jb21wdXRhYmxlIEdMViBlbmRvbW9ycGhpc20gXHUwM0M4LFxuICogY2hlY2sgb3V0IHtAbGluayBFbmRvbW9ycGhpc21PcHRzfS4gU2VlbXMgdG8gYmUgcmlnaWQgKG5vdCBiYWNrZG9vcmVkKS5cbiAqIEBtb2R1bGVcbiAqL1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyLmpzJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVLZXlnZW4sIHR5cGUgQ3VydmVMZW5ndGhzIH0gZnJvbSAnLi9hYnN0cmFjdC9jdXJ2ZS50cyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoZXIsIHR5cGUgSDJDSGFzaGVyLCBpc29nZW55TWFwIH0gZnJvbSAnLi9hYnN0cmFjdC9oYXNoLXRvLWN1cnZlLnRzJztcbmltcG9ydCB7IEZpZWxkLCBtYXBIYXNoVG9GaWVsZCwgcG93MiB9IGZyb20gJy4vYWJzdHJhY3QvbW9kdWxhci50cyc7XG5pbXBvcnQge1xuICB0eXBlIEVDRFNBLFxuICBlY2RzYSxcbiAgdHlwZSBFbmRvbW9ycGhpc21PcHRzLFxuICBtYXBUb0N1cnZlU2ltcGxlU1dVLFxuICB0eXBlIFdlaWVyc3RyYXNzUG9pbnQgYXMgUG9pbnRUeXBlLFxuICB3ZWllcnN0cmFzcyxcbiAgdHlwZSBXZWllcnN0cmFzc09wdHMsXG4gIHR5cGUgV2VpZXJzdHJhc3NQb2ludENvbnMsXG59IGZyb20gJy4vYWJzdHJhY3Qvd2VpZXJzdHJhc3MudHMnO1xuaW1wb3J0IHsgYWJ5dGVzLCBhc2NpaVRvQnl0ZXMsIGJ5dGVzVG9OdW1iZXJCRSwgY29uY2F0Qnl0ZXMgfSBmcm9tICcuL3V0aWxzLnRzJztcblxuLy8gU2VlbXMgbGlrZSBnZW5lcmF0b3Igd2FzIHByb2R1Y2VkIGZyb20gc29tZSBzZWVkOlxuLy8gYFBvaW50azEuQkFTRS5tdWx0aXBseShQb2ludGsxLkZuLmludigybiwgTikpLnRvQWZmaW5lKCkueGBcbi8vIC8vIGdpdmVzIHNob3J0IHggMHgzYjc4Y2U1NjNmODlhMGVkOTQxNGY1YWEyOGFkMGQ5NmQ2Nzk1ZjljNjNuXG5jb25zdCBzZWNwMjU2azFfQ1VSVkU6IFdlaWVyc3RyYXNzT3B0czxiaWdpbnQ+ID0ge1xuICBwOiBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVmZmZmZmMyZicpLFxuICBuOiBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmViYWFlZGNlNmFmNDhhMDNiYmZkMjVlOGNkMDM2NDE0MScpLFxuICBoOiBCaWdJbnQoMSksXG4gIGE6IEJpZ0ludCgwKSxcbiAgYjogQmlnSW50KDcpLFxuICBHeDogQmlnSW50KCcweDc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OTgnKSxcbiAgR3k6IEJpZ0ludCgnMHg0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4JyksXG59O1xuXG5jb25zdCBzZWNwMjU2azFfRU5ETzogRW5kb21vcnBoaXNtT3B0cyA9IHtcbiAgYmV0YTogQmlnSW50KCcweDdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnKSxcbiAgYmFzaXNlczogW1xuICAgIFtCaWdJbnQoJzB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnKSwgLUJpZ0ludCgnMHhlNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMycpXSxcbiAgICBbQmlnSW50KCcweDExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOCcpLCBCaWdJbnQoJzB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnKV0sXG4gIF0sXG59O1xuXG5jb25zdCBfMG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDApO1xuY29uc3QgXzJuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgyKTtcblxuLyoqXG4gKiBcdTIyMUFuID0gbl4oKHArMSkvNCkgZm9yIGZpZWxkcyBwID0gMyBtb2QgNC4gV2UgdW53cmFwIHRoZSBsb29wIGFuZCBtdWx0aXBseSBiaXQtYnktYml0LlxuICogKFArMW4vNG4pLnRvU3RyaW5nKDIpIHdvdWxkIHByb2R1Y2UgYml0cyBbMjIzeCAxLCAwLCAyMnggMSwgNHggMCwgMTEsIDAwXVxuICovXG5mdW5jdGlvbiBzcXJ0TW9kKHk6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIGNvbnN0IFAgPSBzZWNwMjU2azFfQ1VSVkUucDtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IF8zbiA9IEJpZ0ludCgzKSwgXzZuID0gQmlnSW50KDYpLCBfMTFuID0gQmlnSW50KDExKSwgXzIybiA9IEJpZ0ludCgyMik7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBjb25zdCBfMjNuID0gQmlnSW50KDIzKSwgXzQ0biA9IEJpZ0ludCg0NCksIF84OG4gPSBCaWdJbnQoODgpO1xuICBjb25zdCBiMiA9ICh5ICogeSAqIHkpICUgUDsgLy8geF4zLCAxMVxuICBjb25zdCBiMyA9IChiMiAqIGIyICogeSkgJSBQOyAvLyB4XjdcbiAgY29uc3QgYjYgPSAocG93MihiMywgXzNuLCBQKSAqIGIzKSAlIFA7XG4gIGNvbnN0IGI5ID0gKHBvdzIoYjYsIF8zbiwgUCkgKiBiMykgJSBQO1xuICBjb25zdCBiMTEgPSAocG93MihiOSwgXzJuLCBQKSAqIGIyKSAlIFA7XG4gIGNvbnN0IGIyMiA9IChwb3cyKGIxMSwgXzExbiwgUCkgKiBiMTEpICUgUDtcbiAgY29uc3QgYjQ0ID0gKHBvdzIoYjIyLCBfMjJuLCBQKSAqIGIyMikgJSBQO1xuICBjb25zdCBiODggPSAocG93MihiNDQsIF80NG4sIFApICogYjQ0KSAlIFA7XG4gIGNvbnN0IGIxNzYgPSAocG93MihiODgsIF84OG4sIFApICogYjg4KSAlIFA7XG4gIGNvbnN0IGIyMjAgPSAocG93MihiMTc2LCBfNDRuLCBQKSAqIGI0NCkgJSBQO1xuICBjb25zdCBiMjIzID0gKHBvdzIoYjIyMCwgXzNuLCBQKSAqIGIzKSAlIFA7XG4gIGNvbnN0IHQxID0gKHBvdzIoYjIyMywgXzIzbiwgUCkgKiBiMjIpICUgUDtcbiAgY29uc3QgdDIgPSAocG93Mih0MSwgXzZuLCBQKSAqIGIyKSAlIFA7XG4gIGNvbnN0IHJvb3QgPSBwb3cyKHQyLCBfMm4sIFApO1xuICBpZiAoIUZwazEuZXFsKEZwazEuc3FyKHJvb3QpLCB5KSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuICByZXR1cm4gcm9vdDtcbn1cblxuY29uc3QgRnBrMSA9IEZpZWxkKHNlY3AyNTZrMV9DVVJWRS5wLCB7IHNxcnQ6IHNxcnRNb2QgfSk7XG5jb25zdCBQb2ludGsxID0gLyogQF9fUFVSRV9fICovIHdlaWVyc3RyYXNzKHNlY3AyNTZrMV9DVVJWRSwge1xuICBGcDogRnBrMSxcbiAgZW5kbzogc2VjcDI1NmsxX0VORE8sXG59KTtcblxuLyoqXG4gKiBzZWNwMjU2azEgY3VydmU6IEVDRFNBIGFuZCBFQ0RIIG1ldGhvZHMuXG4gKlxuICogVXNlcyBzaGEyNTYgdG8gaGFzaCBtZXNzYWdlcy4gVG8gdXNlIGEgZGlmZmVyZW50IGhhc2gsXG4gKiBwYXNzIGB7IHByZWhhc2g6IGZhbHNlIH1gIHRvIHNpZ24gLyB2ZXJpZnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBzZWNwMjU2azEgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMS5qcyc7XG4gKiBjb25zdCB7IHNlY3JldEtleSwgcHVibGljS2V5IH0gPSBzZWNwMjU2azEua2V5Z2VuKCk7XG4gKiAvLyBjb25zdCBwdWJsaWNLZXkgPSBzZWNwMjU2azEuZ2V0UHVibGljS2V5KHNlY3JldEtleSk7XG4gKiBjb25zdCBtc2cgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ2hlbGxvIG5vYmxlJyk7XG4gKiBjb25zdCBzaWcgPSBzZWNwMjU2azEuc2lnbihtc2csIHNlY3JldEtleSk7XG4gKiBjb25zdCBpc1ZhbGlkID0gc2VjcDI1NmsxLnZlcmlmeShzaWcsIG1zZywgcHVibGljS2V5KTtcbiAqIC8vIGNvbnN0IHNpZ0tlY2NhayA9IHNlY3AyNTZrMS5zaWduKGtlY2NhazI1Nihtc2cpLCBzZWNyZXRLZXksIHsgcHJlaGFzaDogZmFsc2UgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHNlY3AyNTZrMTogRUNEU0EgPSAvKiBAX19QVVJFX18gKi8gZWNkc2EoUG9pbnRrMSwgc2hhMjU2KTtcblxuLy8gU2Nobm9yciBzaWduYXR1cmVzIGFyZSBzdXBlcmlvciB0byBFQ0RTQSBmcm9tIGFib3ZlLiBCZWxvdyBpcyBTY2hub3JyLXNwZWNpZmljIEJJUDAzNDAgY29kZS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vKiogQW4gb2JqZWN0IG1hcHBpbmcgdGFncyB0byB0aGVpciB0YWdnZWQgaGFzaCBwcmVmaXggb2YgW1NIQTI1Nih0YWcpIHwgU0hBMjU2KHRhZyldICovXG5jb25zdCBUQUdHRURfSEFTSF9QUkVGSVhFUzogeyBbdGFnOiBzdHJpbmddOiBVaW50OEFycmF5IH0gPSB7fTtcbmZ1bmN0aW9uIHRhZ2dlZEhhc2godGFnOiBzdHJpbmcsIC4uLm1lc3NhZ2VzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgbGV0IHRhZ1AgPSBUQUdHRURfSEFTSF9QUkVGSVhFU1t0YWddO1xuICBpZiAodGFnUCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdGFnSCA9IHNoYTI1Nihhc2NpaVRvQnl0ZXModGFnKSk7XG4gICAgdGFnUCA9IGNvbmNhdEJ5dGVzKHRhZ0gsIHRhZ0gpO1xuICAgIFRBR0dFRF9IQVNIX1BSRUZJWEVTW3RhZ10gPSB0YWdQO1xuICB9XG4gIHJldHVybiBzaGEyNTYoY29uY2F0Qnl0ZXModGFnUCwgLi4ubWVzc2FnZXMpKTtcbn1cblxuLy8gRUNEU0EgY29tcGFjdCBwb2ludHMgYXJlIDMzLWJ5dGUuIFNjaG5vcnIgaXMgMzI6IHdlIHN0cmlwIGZpcnN0IGJ5dGUgMHgwMiBvciAweDAzXG5jb25zdCBwb2ludFRvQnl0ZXMgPSAocG9pbnQ6IFBvaW50VHlwZTxiaWdpbnQ+KSA9PiBwb2ludC50b0J5dGVzKHRydWUpLnNsaWNlKDEpO1xuY29uc3QgaGFzRXZlbiA9ICh5OiBiaWdpbnQpID0+IHkgJSBfMm4gPT09IF8wbjtcblxuLy8gQ2FsY3VsYXRlIHBvaW50LCBzY2FsYXIgYW5kIGJ5dGVzXG5mdW5jdGlvbiBzY2hub3JyR2V0RXh0UHViS2V5KHByaXY6IFVpbnQ4QXJyYXkpIHtcbiAgY29uc3QgeyBGbiwgQkFTRSB9ID0gUG9pbnRrMTtcbiAgY29uc3QgZF8gPSBGbi5mcm9tQnl0ZXMocHJpdik7XG4gIGNvbnN0IHAgPSBCQVNFLm11bHRpcGx5KGRfKTsgLy8gUCA9IGQnXHUyMkM1RzsgMCA8IGQnIDwgbiBjaGVjayBpcyBkb25lIGluc2lkZVxuICBjb25zdCBzY2FsYXIgPSBoYXNFdmVuKHAueSkgPyBkXyA6IEZuLm5lZyhkXyk7XG4gIHJldHVybiB7IHNjYWxhciwgYnl0ZXM6IHBvaW50VG9CeXRlcyhwKSB9O1xufVxuLyoqXG4gKiBsaWZ0X3ggZnJvbSBCSVAzNDAuIENvbnZlcnQgMzItYnl0ZSB4IGNvb3JkaW5hdGUgdG8gZWxsaXB0aWMgY3VydmUgcG9pbnQuXG4gKiBAcmV0dXJucyB2YWxpZCBwb2ludCBjaGVja2VkIGZvciBiZWluZyBvbi1jdXJ2ZVxuICovXG5mdW5jdGlvbiBsaWZ0X3goeDogYmlnaW50KTogUG9pbnRUeXBlPGJpZ2ludD4ge1xuICBjb25zdCBGcCA9IEZwazE7XG4gIGlmICghRnAuaXNWYWxpZE5vdDAoeCkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB4OiBGYWlsIGlmIHggXHUyMjY1IHAnKTtcbiAgY29uc3QgeHggPSBGcC5jcmVhdGUoeCAqIHgpO1xuICBjb25zdCBjID0gRnAuY3JlYXRlKHh4ICogeCArIEJpZ0ludCg3KSk7IC8vIExldCBjID0geFx1MDBCMyArIDcgbW9kIHAuXG4gIGxldCB5ID0gRnAuc3FydChjKTsgLy8gTGV0IHkgPSBjXihwKzEpLzQgbW9kIHAuIFNhbWUgYXMgc3FydCgpLlxuICAvLyBSZXR1cm4gdGhlIHVuaXF1ZSBwb2ludCBQIHN1Y2ggdGhhdCB4KFApID0geCBhbmRcbiAgLy8geShQKSA9IHkgaWYgeSBtb2QgMiA9IDAgb3IgeShQKSA9IHAteSBvdGhlcndpc2UuXG4gIGlmICghaGFzRXZlbih5KSkgeSA9IEZwLm5lZyh5KTtcbiAgY29uc3QgcCA9IFBvaW50azEuZnJvbUFmZmluZSh7IHgsIHkgfSk7XG4gIHAuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgcmV0dXJuIHA7XG59XG5jb25zdCBudW0gPSBieXRlc1RvTnVtYmVyQkU7XG4vKipcbiAqIENyZWF0ZSB0YWdnZWQgaGFzaCwgY29udmVydCBpdCB0byBiaWdpbnQsIHJlZHVjZSBtb2R1bG8tbi5cbiAqL1xuZnVuY3Rpb24gY2hhbGxlbmdlKC4uLmFyZ3M6IFVpbnQ4QXJyYXlbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBQb2ludGsxLkZuLmNyZWF0ZShudW0odGFnZ2VkSGFzaCgnQklQMDM0MC9jaGFsbGVuZ2UnLCAuLi5hcmdzKSkpO1xufVxuXG4vKipcbiAqIFNjaG5vcnIgcHVibGljIGtleSBpcyBqdXN0IGB4YCBjb29yZGluYXRlIG9mIFBvaW50IGFzIHBlciBCSVAzNDAuXG4gKi9cbmZ1bmN0aW9uIHNjaG5vcnJHZXRQdWJsaWNLZXkoc2VjcmV0S2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIHJldHVybiBzY2hub3JyR2V0RXh0UHViS2V5KHNlY3JldEtleSkuYnl0ZXM7IC8vIGQnPWludChzaykuIEZhaWwgaWYgZCc9MCBvciBkJ1x1MjI2NW4uIFJldCBieXRlcyhkJ1x1MjJDNUcpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBTY2hub3JyIHNpZ25hdHVyZSBhcyBwZXIgQklQMzQwLiBWZXJpZmllcyBpdHNlbGYgYmVmb3JlIHJldHVybmluZyBhbnl0aGluZy5cbiAqIGF1eFJhbmQgaXMgb3B0aW9uYWwgYW5kIGlzIG5vdCB0aGUgc29sZSBzb3VyY2Ugb2YgayBnZW5lcmF0aW9uOiBiYWQgQ1NQUk5HIHdvbid0IGJlIGRhbmdlcm91cy5cbiAqL1xuZnVuY3Rpb24gc2Nobm9yclNpZ24oXG4gIG1lc3NhZ2U6IFVpbnQ4QXJyYXksXG4gIHNlY3JldEtleTogVWludDhBcnJheSxcbiAgYXV4UmFuZDogVWludDhBcnJheSA9IHJhbmRvbUJ5dGVzKDMyKVxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHsgRm4gfSA9IFBvaW50azE7XG4gIGNvbnN0IG0gPSBhYnl0ZXMobWVzc2FnZSwgdW5kZWZpbmVkLCAnbWVzc2FnZScpO1xuICBjb25zdCB7IGJ5dGVzOiBweCwgc2NhbGFyOiBkIH0gPSBzY2hub3JyR2V0RXh0UHViS2V5KHNlY3JldEtleSk7IC8vIGNoZWNrcyBmb3IgaXNXaXRoaW5DdXJ2ZU9yZGVyXG4gIGNvbnN0IGEgPSBhYnl0ZXMoYXV4UmFuZCwgMzIsICdhdXhSYW5kJyk7IC8vIEF1eGlsaWFyeSByYW5kb20gZGF0YSBhOiBhIDMyLWJ5dGUgYXJyYXlcbiAgY29uc3QgdCA9IEZuLnRvQnl0ZXMoZCBeIG51bSh0YWdnZWRIYXNoKCdCSVAwMzQwL2F1eCcsIGEpKSk7IC8vIExldCB0IGJlIHRoZSBieXRlLXdpc2UgeG9yIG9mIGJ5dGVzKGQpIGFuZCBoYXNoL2F1eChhKVxuICBjb25zdCByYW5kID0gdGFnZ2VkSGFzaCgnQklQMDM0MC9ub25jZScsIHQsIHB4LCBtKTsgLy8gTGV0IHJhbmQgPSBoYXNoL25vbmNlKHQgfHwgYnl0ZXMoUCkgfHwgbSlcbiAgLy8gTGV0IGsnID0gaW50KHJhbmQpIG1vZCBuLiBGYWlsIGlmIGsnID0gMC4gTGV0IFIgPSBrJ1x1MjJDNUdcbiAgY29uc3QgeyBieXRlczogcngsIHNjYWxhcjogayB9ID0gc2Nobm9yckdldEV4dFB1YktleShyYW5kKTtcbiAgY29uc3QgZSA9IGNoYWxsZW5nZShyeCwgcHgsIG0pOyAvLyBMZXQgZSA9IGludChoYXNoL2NoYWxsZW5nZShieXRlcyhSKSB8fCBieXRlcyhQKSB8fCBtKSkgbW9kIG4uXG4gIGNvbnN0IHNpZyA9IG5ldyBVaW50OEFycmF5KDY0KTsgLy8gTGV0IHNpZyA9IGJ5dGVzKFIpIHx8IGJ5dGVzKChrICsgZWQpIG1vZCBuKS5cbiAgc2lnLnNldChyeCwgMCk7XG4gIHNpZy5zZXQoRm4udG9CeXRlcyhGbi5jcmVhdGUoayArIGUgKiBkKSksIDMyKTtcbiAgLy8gSWYgVmVyaWZ5KGJ5dGVzKFApLCBtLCBzaWcpIChzZWUgYmVsb3cpIHJldHVybnMgZmFpbHVyZSwgYWJvcnRcbiAgaWYgKCFzY2hub3JyVmVyaWZ5KHNpZywgbSwgcHgpKSB0aHJvdyBuZXcgRXJyb3IoJ3NpZ246IEludmFsaWQgc2lnbmF0dXJlIHByb2R1Y2VkJyk7XG4gIHJldHVybiBzaWc7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgU2Nobm9yciBzaWduYXR1cmUuXG4gKiBXaWxsIHN3YWxsb3cgZXJyb3JzICYgcmV0dXJuIGZhbHNlIGV4Y2VwdCBmb3IgaW5pdGlhbCB0eXBlIHZhbGlkYXRpb24gb2YgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiBzY2hub3JyVmVyaWZ5KHNpZ25hdHVyZTogVWludDhBcnJheSwgbWVzc2FnZTogVWludDhBcnJheSwgcHVibGljS2V5OiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgRnAsIEZuLCBCQVNFIH0gPSBQb2ludGsxO1xuICBjb25zdCBzaWcgPSBhYnl0ZXMoc2lnbmF0dXJlLCA2NCwgJ3NpZ25hdHVyZScpO1xuICBjb25zdCBtID0gYWJ5dGVzKG1lc3NhZ2UsIHVuZGVmaW5lZCwgJ21lc3NhZ2UnKTtcbiAgY29uc3QgcHViID0gYWJ5dGVzKHB1YmxpY0tleSwgMzIsICdwdWJsaWNLZXknKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBQID0gbGlmdF94KG51bShwdWIpKTsgLy8gUCA9IGxpZnRfeChpbnQocGspKTsgZmFpbCBpZiB0aGF0IGZhaWxzXG4gICAgY29uc3QgciA9IG51bShzaWcuc3ViYXJyYXkoMCwgMzIpKTsgLy8gTGV0IHIgPSBpbnQoc2lnWzA6MzJdKTsgZmFpbCBpZiByIFx1MjI2NSBwLlxuICAgIGlmICghRnAuaXNWYWxpZE5vdDAocikpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzID0gbnVtKHNpZy5zdWJhcnJheSgzMiwgNjQpKTsgLy8gTGV0IHMgPSBpbnQoc2lnWzMyOjY0XSk7IGZhaWwgaWYgcyBcdTIyNjUgbi5cbiAgICBpZiAoIUZuLmlzVmFsaWROb3QwKHMpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlID0gY2hhbGxlbmdlKEZuLnRvQnl0ZXMociksIHBvaW50VG9CeXRlcyhQKSwgbSk7IC8vIGludChjaGFsbGVuZ2UoYnl0ZXMocil8fGJ5dGVzKFApfHxtKSklblxuICAgIC8vIFIgPSBzXHUyMkM1RyAtIGVcdTIyQzVQLCB3aGVyZSAtZVAgPT0gKG4tZSlQXG4gICAgY29uc3QgUiA9IEJBU0UubXVsdGlwbHlVbnNhZmUocykuYWRkKFAubXVsdGlwbHlVbnNhZmUoRm4ubmVnKGUpKSk7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBSLnRvQWZmaW5lKCk7XG4gICAgLy8gRmFpbCBpZiBpc19pbmZpbml0ZShSKSAvIG5vdCBoYXNfZXZlbl95KFIpIC8geChSKSBcdTIyNjAgci5cbiAgICBpZiAoUi5pczAoKSB8fCAhaGFzRXZlbih5KSB8fCB4ICE9PSByKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFNlY3BTY2hub3JyID0ge1xuICBrZXlnZW46IChzZWVkPzogVWludDhBcnJheSkgPT4geyBzZWNyZXRLZXk6IFVpbnQ4QXJyYXk7IHB1YmxpY0tleTogVWludDhBcnJheSB9O1xuICBnZXRQdWJsaWNLZXk6IHR5cGVvZiBzY2hub3JyR2V0UHVibGljS2V5O1xuICBzaWduOiB0eXBlb2Ygc2Nobm9yclNpZ247XG4gIHZlcmlmeTogdHlwZW9mIHNjaG5vcnJWZXJpZnk7XG4gIFBvaW50OiBXZWllcnN0cmFzc1BvaW50Q29uczxiaWdpbnQ+O1xuICB1dGlsczoge1xuICAgIHJhbmRvbVNlY3JldEtleTogKHNlZWQ/OiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xuICAgIHBvaW50VG9CeXRlczogKHBvaW50OiBQb2ludFR5cGU8YmlnaW50PikgPT4gVWludDhBcnJheTtcbiAgICBsaWZ0X3g6IHR5cGVvZiBsaWZ0X3g7XG4gICAgdGFnZ2VkSGFzaDogdHlwZW9mIHRhZ2dlZEhhc2g7XG4gIH07XG4gIGxlbmd0aHM6IEN1cnZlTGVuZ3Rocztcbn07XG4vKipcbiAqIFNjaG5vcnIgc2lnbmF0dXJlcyBvdmVyIHNlY3AyNTZrMS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGltcG9ydCB7IHNjaG5vcnIgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMS5qcyc7XG4gKiBjb25zdCB7IHNlY3JldEtleSwgcHVibGljS2V5IH0gPSBzY2hub3JyLmtleWdlbigpO1xuICogLy8gY29uc3QgcHVibGljS2V5ID0gc2Nobm9yci5nZXRQdWJsaWNLZXkoc2VjcmV0S2V5KTtcbiAqIGNvbnN0IG1zZyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgnaGVsbG8nKTtcbiAqIGNvbnN0IHNpZyA9IHNjaG5vcnIuc2lnbihtc2csIHNlY3JldEtleSk7XG4gKiBjb25zdCBpc1ZhbGlkID0gc2Nobm9yci52ZXJpZnkoc2lnLCBtc2csIHB1YmxpY0tleSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHNjaG5vcnI6IFNlY3BTY2hub3JyID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGNvbnN0IHNpemUgPSAzMjtcbiAgY29uc3Qgc2VlZExlbmd0aCA9IDQ4O1xuICBjb25zdCByYW5kb21TZWNyZXRLZXkgPSAoc2VlZCA9IHJhbmRvbUJ5dGVzKHNlZWRMZW5ndGgpKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIG1hcEhhc2hUb0ZpZWxkKHNlZWQsIHNlY3AyNTZrMV9DVVJWRS5uKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBrZXlnZW46IGNyZWF0ZUtleWdlbihyYW5kb21TZWNyZXRLZXksIHNjaG5vcnJHZXRQdWJsaWNLZXkpLFxuICAgIGdldFB1YmxpY0tleTogc2Nobm9yckdldFB1YmxpY0tleSxcbiAgICBzaWduOiBzY2hub3JyU2lnbixcbiAgICB2ZXJpZnk6IHNjaG5vcnJWZXJpZnksXG4gICAgUG9pbnQ6IFBvaW50azEsXG4gICAgdXRpbHM6IHtcbiAgICAgIHJhbmRvbVNlY3JldEtleSxcbiAgICAgIHRhZ2dlZEhhc2gsXG4gICAgICBsaWZ0X3gsXG4gICAgICBwb2ludFRvQnl0ZXMsXG4gICAgfSxcbiAgICBsZW5ndGhzOiB7XG4gICAgICBzZWNyZXRLZXk6IHNpemUsXG4gICAgICBwdWJsaWNLZXk6IHNpemUsXG4gICAgICBwdWJsaWNLZXlIYXNQcmVmaXg6IGZhbHNlLFxuICAgICAgc2lnbmF0dXJlOiBzaXplICogMixcbiAgICAgIHNlZWQ6IHNlZWRMZW5ndGgsXG4gICAgfSxcbiAgfTtcbn0pKCk7XG5cbmNvbnN0IGlzb01hcCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT5cbiAgaXNvZ2VueU1hcChcbiAgICBGcGsxLFxuICAgIFtcbiAgICAgIC8vIHhOdW1cbiAgICAgIFtcbiAgICAgICAgJzB4OGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGRhYWFhYThjNycsXG4gICAgICAgICcweDdkM2Q0YzgwYmMzMjFkNWI5ZjMxNWNlYTdmZDQ0YzVkNTk1ZDJmYzBiZjYzYjkyZGZmZjEwNDRmMTdjNjU4MScsXG4gICAgICAgICcweDUzNGMzMjhkMjNmMjM0ZTZlMmE0MTNkZWNhMjVjYWVjZTQ1MDYxNDQwMzdjNDAzMTRlY2JkMGI1M2Q5ZGQyNjInLFxuICAgICAgICAnMHg4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZGFhYWFhODhjJyxcbiAgICAgIF0sXG4gICAgICAvLyB4RGVuXG4gICAgICBbXG4gICAgICAgICcweGQzNTc3MTE5M2Q5NDkxOGE5Y2EzNGNjYmI3YjY0MGRkODZjZDQwOTU0MmY4NDg3ZDlmZTZiNzQ1NzgxZWI0OWInLFxuICAgICAgICAnMHhlZGFkYzZmNjQzODNkYzFkZjdjNGIyZDUxYjU0MjI1NDA2ZDM2YjY0MWY1ZTQxYmJjNTJhNTY2MTJhOGM2ZDE0JyxcbiAgICAgICAgJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScsIC8vIExBU1QgMVxuICAgICAgXSxcbiAgICAgIC8vIHlOdW1cbiAgICAgIFtcbiAgICAgICAgJzB4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGI4ZTM4ZTIzYycsXG4gICAgICAgICcweGM3NWUwYzMyZDVjYjdjMGZhOWQwYTU0YjEyYTBhNmQ1NjQ3YWIwNDZkNjg2ZGE2ZmRmZmM5MGZjMjAxZDcxYTMnLFxuICAgICAgICAnMHgyOWE2MTk0NjkxZjkxYTczNzE1MjA5ZWY2NTEyZTU3NjcyMjgzMGEyMDFiZTIwMThhNzY1ZTg1YTllY2VlOTMxJyxcbiAgICAgICAgJzB4MmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmYzOGUzOGQ4NCcsXG4gICAgICBdLFxuICAgICAgLy8geURlblxuICAgICAgW1xuICAgICAgICAnMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZmOTNiJyxcbiAgICAgICAgJzB4N2EwNjUzNGJiOGJkYjQ5ZmQ1ZTllNjYzMjcyMmMyOTg5NDY3YzFiZmM4ZThkOTc4ZGZiNDI1ZDI2ODVjMjU3MycsXG4gICAgICAgICcweDY0ODRhYTcxNjU0NWNhMmNmM2E3MGMzZmE4ZmUzMzdlMGEzZDIxMTYyZjBkNjI5OWE3YmY4MTkyYmZkMmE3NmYnLFxuICAgICAgICAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgLy8gTEFTVCAxXG4gICAgICBdLFxuICAgIF0ubWFwKChpKSA9PiBpLm1hcCgoaikgPT4gQmlnSW50KGopKSkgYXMgW2JpZ2ludFtdLCBiaWdpbnRbXSwgYmlnaW50W10sIGJpZ2ludFtdXVxuICApKSgpO1xuY29uc3QgbWFwU1dVID0gLyogQF9fUFVSRV9fICovICgoKSA9PlxuICBtYXBUb0N1cnZlU2ltcGxlU1dVKEZwazEsIHtcbiAgICBBOiBCaWdJbnQoJzB4M2Y4NzMxYWJkZDY2MWFkY2EwOGE1NTU4ZjBmNWQyNzJlOTUzZDM2M2NiNmYwZTVkNDA1NDQ3YzAxYTQ0NDUzMycpLFxuICAgIEI6IEJpZ0ludCgnMTc3MScpLFxuICAgIFo6IEZwazEuY3JlYXRlKEJpZ0ludCgnLTExJykpLFxuICB9KSkoKTtcblxuLyoqIEhhc2hpbmcgLyBlbmNvZGluZyB0byBzZWNwMjU2azEgcG9pbnRzIC8gZmllbGQuIFJGQyA5MzgwIG1ldGhvZHMuICovXG5leHBvcnQgY29uc3Qgc2VjcDI1NmsxX2hhc2hlcjogSDJDSGFzaGVyPFdlaWVyc3RyYXNzUG9pbnRDb25zPGJpZ2ludD4+ID0gLyogQF9fUFVSRV9fICovICgoKSA9PlxuICBjcmVhdGVIYXNoZXIoXG4gICAgUG9pbnRrMSxcbiAgICAoc2NhbGFyczogYmlnaW50W10pID0+IHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gbWFwU1dVKEZwazEuY3JlYXRlKHNjYWxhcnNbMF0pKTtcbiAgICAgIHJldHVybiBpc29NYXAoeCwgeSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBEU1Q6ICdzZWNwMjU2azFfWE1EOlNIQS0yNTZfU1NXVV9ST18nLFxuICAgICAgZW5jb2RlRFNUOiAnc2VjcDI1NmsxX1hNRDpTSEEtMjU2X1NTV1VfTlVfJyxcbiAgICAgIHA6IEZwazEuT1JERVIsXG4gICAgICBtOiAxLFxuICAgICAgazogMTI4LFxuICAgICAgZXhwYW5kOiAneG1kJyxcbiAgICAgIGhhc2g6IHNoYTI1NixcbiAgICB9XG4gICkpKCk7XG4iLCAiLyoqXG4gKiBTSEEyIGhhc2ggZnVuY3Rpb24uIEEuay5hLiBzaGEyNTYsIHNoYTM4NCwgc2hhNTEyLCBzaGE1MTJfMjI0LCBzaGE1MTJfMjU2LlxuICogU0hBMjU2IGlzIHRoZSBmYXN0ZXN0IGhhc2ggaW1wbGVtZW50YWJsZSBpbiBKUywgZXZlbiBmYXN0ZXIgdGhhbiBCbGFrZTMuXG4gKiBDaGVjayBvdXQgW1JGQyA0NjM0XShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNDYzNCkgYW5kXG4gKiBbRklQUyAxODAtNF0oaHR0cHM6Ly9udmxwdWJzLm5pc3QuZ292L25pc3RwdWJzL0ZJUFMvTklTVC5GSVBTLjE4MC00LnBkZikuXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IENoaSwgSGFzaE1ELCBNYWosIFNIQTIyNF9JViwgU0hBMjU2X0lWLCBTSEEzODRfSVYsIFNIQTUxMl9JViB9IGZyb20gJy4vX21kLnRzJztcbmltcG9ydCAqIGFzIHU2NCBmcm9tICcuL191NjQudHMnO1xuaW1wb3J0IHsgdHlwZSBDSGFzaCwgY2xlYW4sIGNyZWF0ZUhhc2hlciwgb2lkTmlzdCwgcm90ciB9IGZyb20gJy4vdXRpbHMudHMnO1xuXG4vKipcbiAqIFJvdW5kIGNvbnN0YW50czpcbiAqIEZpcnN0IDMyIGJpdHMgb2YgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgY3ViZSByb290cyBvZiB0aGUgZmlyc3QgNjQgcHJpbWVzIDIuLjMxMSlcbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBTSEEyNTZfSyA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXSk7XG5cbi8qKiBSZXVzYWJsZSB0ZW1wb3JhcnkgYnVmZmVyLiBcIldcIiBjb21lcyBzdHJhaWdodCBmcm9tIHNwZWMuICovXG5jb25zdCBTSEEyNTZfVyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVWludDMyQXJyYXkoNjQpO1xuXG4vKiogSW50ZXJuYWwgMzItYnl0ZSBiYXNlIFNIQTIgaGFzaCBjbGFzcy4gKi9cbmFic3RyYWN0IGNsYXNzIFNIQTJfMzJCPFQgZXh0ZW5kcyBTSEEyXzMyQjxUPj4gZXh0ZW5kcyBIYXNoTUQ8VD4ge1xuICAvLyBXZSBjYW5ub3QgdXNlIGFycmF5IGhlcmUgc2luY2UgYXJyYXkgYWxsb3dzIGluZGV4aW5nIGJ5IHZhcmlhYmxlXG4gIC8vIHdoaWNoIG1lYW5zIG9wdGltaXplci9jb21waWxlciBjYW5ub3QgdXNlIHJlZ2lzdGVycy5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IEE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEI6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEU6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEY6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEc6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRMZW46IG51bWJlcikge1xuICAgIHN1cGVyKDY0LCBvdXRwdXRMZW4sIDgsIGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0KCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IHsgQSwgQiwgQywgRCwgRSwgRiwgRywgSCB9ID0gdGhpcztcbiAgICByZXR1cm4gW0EsIEIsIEMsIEQsIEUsIEYsIEcsIEhdO1xuICB9XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBwcm90ZWN0ZWQgc2V0KFxuICAgIEE6IG51bWJlciwgQjogbnVtYmVyLCBDOiBudW1iZXIsIEQ6IG51bWJlciwgRTogbnVtYmVyLCBGOiBudW1iZXIsIEc6IG51bWJlciwgSDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIHRoaXMuQSA9IEEgfCAwO1xuICAgIHRoaXMuQiA9IEIgfCAwO1xuICAgIHRoaXMuQyA9IEMgfCAwO1xuICAgIHRoaXMuRCA9IEQgfCAwO1xuICAgIHRoaXMuRSA9IEUgfCAwO1xuICAgIHRoaXMuRiA9IEYgfCAwO1xuICAgIHRoaXMuRyA9IEcgfCAwO1xuICAgIHRoaXMuSCA9IEggfCAwO1xuICB9XG4gIHByb3RlY3RlZCBwcm9jZXNzKHZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEV4dGVuZCB0aGUgZmlyc3QgMTYgd29yZHMgaW50byB0aGUgcmVtYWluaW5nIDQ4IHdvcmRzIHdbMTYuLjYzXSBvZiB0aGUgbWVzc2FnZSBzY2hlZHVsZSBhcnJheVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKywgb2Zmc2V0ICs9IDQpIFNIQTI1Nl9XW2ldID0gdmlldy5nZXRVaW50MzIob2Zmc2V0LCBmYWxzZSk7XG4gICAgZm9yIChsZXQgaSA9IDE2OyBpIDwgNjQ7IGkrKykge1xuICAgICAgY29uc3QgVzE1ID0gU0hBMjU2X1dbaSAtIDE1XTtcbiAgICAgIGNvbnN0IFcyID0gU0hBMjU2X1dbaSAtIDJdO1xuICAgICAgY29uc3QgczAgPSByb3RyKFcxNSwgNykgXiByb3RyKFcxNSwgMTgpIF4gKFcxNSA+Pj4gMyk7XG4gICAgICBjb25zdCBzMSA9IHJvdHIoVzIsIDE3KSBeIHJvdHIoVzIsIDE5KSBeIChXMiA+Pj4gMTApO1xuICAgICAgU0hBMjU2X1dbaV0gPSAoczEgKyBTSEEyNTZfV1tpIC0gN10gKyBzMCArIFNIQTI1Nl9XW2kgLSAxNl0pIHwgMDtcbiAgICB9XG4gICAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24gbWFpbiBsb29wLCA2NCByb3VuZHNcbiAgICBsZXQgeyBBLCBCLCBDLCBELCBFLCBGLCBHLCBIIH0gPSB0aGlzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgY29uc3Qgc2lnbWExID0gcm90cihFLCA2KSBeIHJvdHIoRSwgMTEpIF4gcm90cihFLCAyNSk7XG4gICAgICBjb25zdCBUMSA9IChIICsgc2lnbWExICsgQ2hpKEUsIEYsIEcpICsgU0hBMjU2X0tbaV0gKyBTSEEyNTZfV1tpXSkgfCAwO1xuICAgICAgY29uc3Qgc2lnbWEwID0gcm90cihBLCAyKSBeIHJvdHIoQSwgMTMpIF4gcm90cihBLCAyMik7XG4gICAgICBjb25zdCBUMiA9IChzaWdtYTAgKyBNYWooQSwgQiwgQykpIHwgMDtcbiAgICAgIEggPSBHO1xuICAgICAgRyA9IEY7XG4gICAgICBGID0gRTtcbiAgICAgIEUgPSAoRCArIFQxKSB8IDA7XG4gICAgICBEID0gQztcbiAgICAgIEMgPSBCO1xuICAgICAgQiA9IEE7XG4gICAgICBBID0gKFQxICsgVDIpIHwgMDtcbiAgICB9XG4gICAgLy8gQWRkIHRoZSBjb21wcmVzc2VkIGNodW5rIHRvIHRoZSBjdXJyZW50IGhhc2ggdmFsdWVcbiAgICBBID0gKEEgKyB0aGlzLkEpIHwgMDtcbiAgICBCID0gKEIgKyB0aGlzLkIpIHwgMDtcbiAgICBDID0gKEMgKyB0aGlzLkMpIHwgMDtcbiAgICBEID0gKEQgKyB0aGlzLkQpIHwgMDtcbiAgICBFID0gKEUgKyB0aGlzLkUpIHwgMDtcbiAgICBGID0gKEYgKyB0aGlzLkYpIHwgMDtcbiAgICBHID0gKEcgKyB0aGlzLkcpIHwgMDtcbiAgICBIID0gKEggKyB0aGlzLkgpIHwgMDtcbiAgICB0aGlzLnNldChBLCBCLCBDLCBELCBFLCBGLCBHLCBIKTtcbiAgfVxuICBwcm90ZWN0ZWQgcm91bmRDbGVhbigpOiB2b2lkIHtcbiAgICBjbGVhbihTSEEyNTZfVyk7XG4gIH1cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldCgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTtcbiAgICBjbGVhbih0aGlzLmJ1ZmZlcik7XG4gIH1cbn1cblxuLyoqIEludGVybmFsIFNIQTItMjU2IGhhc2ggY2xhc3MuICovXG5leHBvcnQgY2xhc3MgX1NIQTI1NiBleHRlbmRzIFNIQTJfMzJCPF9TSEEyNTY+IHtcbiAgLy8gV2UgY2Fubm90IHVzZSBhcnJheSBoZXJlIHNpbmNlIGFycmF5IGFsbG93cyBpbmRleGluZyBieSB2YXJpYWJsZVxuICAvLyB3aGljaCBtZWFucyBvcHRpbWl6ZXIvY29tcGlsZXIgY2Fubm90IHVzZSByZWdpc3RlcnMuXG4gIHByb3RlY3RlZCBBOiBudW1iZXIgPSBTSEEyNTZfSVZbMF0gfCAwO1xuICBwcm90ZWN0ZWQgQjogbnVtYmVyID0gU0hBMjU2X0lWWzFdIHwgMDtcbiAgcHJvdGVjdGVkIEM6IG51bWJlciA9IFNIQTI1Nl9JVlsyXSB8IDA7XG4gIHByb3RlY3RlZCBEOiBudW1iZXIgPSBTSEEyNTZfSVZbM10gfCAwO1xuICBwcm90ZWN0ZWQgRTogbnVtYmVyID0gU0hBMjU2X0lWWzRdIHwgMDtcbiAgcHJvdGVjdGVkIEY6IG51bWJlciA9IFNIQTI1Nl9JVls1XSB8IDA7XG4gIHByb3RlY3RlZCBHOiBudW1iZXIgPSBTSEEyNTZfSVZbNl0gfCAwO1xuICBwcm90ZWN0ZWQgSDogbnVtYmVyID0gU0hBMjU2X0lWWzddIHwgMDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoMzIpO1xuICB9XG59XG5cbi8qKiBJbnRlcm5hbCBTSEEyLTIyNCBoYXNoIGNsYXNzLiAqL1xuZXhwb3J0IGNsYXNzIF9TSEEyMjQgZXh0ZW5kcyBTSEEyXzMyQjxfU0hBMjI0PiB7XG4gIHByb3RlY3RlZCBBOiBudW1iZXIgPSBTSEEyMjRfSVZbMF0gfCAwO1xuICBwcm90ZWN0ZWQgQjogbnVtYmVyID0gU0hBMjI0X0lWWzFdIHwgMDtcbiAgcHJvdGVjdGVkIEM6IG51bWJlciA9IFNIQTIyNF9JVlsyXSB8IDA7XG4gIHByb3RlY3RlZCBEOiBudW1iZXIgPSBTSEEyMjRfSVZbM10gfCAwO1xuICBwcm90ZWN0ZWQgRTogbnVtYmVyID0gU0hBMjI0X0lWWzRdIHwgMDtcbiAgcHJvdGVjdGVkIEY6IG51bWJlciA9IFNIQTIyNF9JVls1XSB8IDA7XG4gIHByb3RlY3RlZCBHOiBudW1iZXIgPSBTSEEyMjRfSVZbNl0gfCAwO1xuICBwcm90ZWN0ZWQgSDogbnVtYmVyID0gU0hBMjI0X0lWWzddIHwgMDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoMjgpO1xuICB9XG59XG5cbi8vIFNIQTItNTEyIGlzIHNsb3dlciB0aGFuIHNoYTI1NiBpbiBqcyBiZWNhdXNlIHU2NCBvcGVyYXRpb25zIGFyZSBzbG93LlxuXG4vLyBSb3VuZCBjb250YW50c1xuLy8gRmlyc3QgMzIgYml0cyBvZiB0aGUgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgY3ViZSByb290cyBvZiB0aGUgZmlyc3QgODAgcHJpbWVzIDIuLjQwOVxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBLNTEyID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB1NjQuc3BsaXQoW1xuICAnMHg0MjhhMmY5OGQ3MjhhZTIyJywgJzB4NzEzNzQ0OTEyM2VmNjVjZCcsICcweGI1YzBmYmNmZWM0ZDNiMmYnLCAnMHhlOWI1ZGJhNTgxODlkYmJjJyxcbiAgJzB4Mzk1NmMyNWJmMzQ4YjUzOCcsICcweDU5ZjExMWYxYjYwNWQwMTknLCAnMHg5MjNmODJhNGFmMTk0ZjliJywgJzB4YWIxYzVlZDVkYTZkODExOCcsXG4gICcweGQ4MDdhYTk4YTMwMzAyNDInLCAnMHgxMjgzNWIwMTQ1NzA2ZmJlJywgJzB4MjQzMTg1YmU0ZWU0YjI4YycsICcweDU1MGM3ZGMzZDVmZmI0ZTInLFxuICAnMHg3MmJlNWQ3NGYyN2I4OTZmJywgJzB4ODBkZWIxZmUzYjE2OTZiMScsICcweDliZGMwNmE3MjVjNzEyMzUnLCAnMHhjMTliZjE3NGNmNjkyNjk0JyxcbiAgJzB4ZTQ5YjY5YzE5ZWYxNGFkMicsICcweGVmYmU0Nzg2Mzg0ZjI1ZTMnLCAnMHgwZmMxOWRjNjhiOGNkNWI1JywgJzB4MjQwY2ExY2M3N2FjOWM2NScsXG4gICcweDJkZTkyYzZmNTkyYjAyNzUnLCAnMHg0YTc0ODRhYTZlYTZlNDgzJywgJzB4NWNiMGE5ZGNiZDQxZmJkNCcsICcweDc2Zjk4OGRhODMxMTUzYjUnLFxuICAnMHg5ODNlNTE1MmVlNjZkZmFiJywgJzB4YTgzMWM2NmQyZGI0MzIxMCcsICcweGIwMDMyN2M4OThmYjIxM2YnLCAnMHhiZjU5N2ZjN2JlZWYwZWU0JyxcbiAgJzB4YzZlMDBiZjMzZGE4OGZjMicsICcweGQ1YTc5MTQ3OTMwYWE3MjUnLCAnMHgwNmNhNjM1MWUwMDM4MjZmJywgJzB4MTQyOTI5NjcwYTBlNmU3MCcsXG4gICcweDI3YjcwYTg1NDZkMjJmZmMnLCAnMHgyZTFiMjEzODVjMjZjOTI2JywgJzB4NGQyYzZkZmM1YWM0MmFlZCcsICcweDUzMzgwZDEzOWQ5NWIzZGYnLFxuICAnMHg2NTBhNzM1NDhiYWY2M2RlJywgJzB4NzY2YTBhYmIzYzc3YjJhOCcsICcweDgxYzJjOTJlNDdlZGFlZTYnLCAnMHg5MjcyMmM4NTE0ODIzNTNiJyxcbiAgJzB4YTJiZmU4YTE0Y2YxMDM2NCcsICcweGE4MWE2NjRiYmM0MjMwMDEnLCAnMHhjMjRiOGI3MGQwZjg5NzkxJywgJzB4Yzc2YzUxYTMwNjU0YmUzMCcsXG4gICcweGQxOTJlODE5ZDZlZjUyMTgnLCAnMHhkNjk5MDYyNDU1NjVhOTEwJywgJzB4ZjQwZTM1ODU1NzcxMjAyYScsICcweDEwNmFhMDcwMzJiYmQxYjgnLFxuICAnMHgxOWE0YzExNmI4ZDJkMGM4JywgJzB4MWUzNzZjMDg1MTQxYWI1MycsICcweDI3NDg3NzRjZGY4ZWViOTknLCAnMHgzNGIwYmNiNWUxOWI0OGE4JyxcbiAgJzB4MzkxYzBjYjNjNWM5NWE2MycsICcweDRlZDhhYTRhZTM0MThhY2InLCAnMHg1YjljY2E0Zjc3NjNlMzczJywgJzB4NjgyZTZmZjNkNmIyYjhhMycsXG4gICcweDc0OGY4MmVlNWRlZmIyZmMnLCAnMHg3OGE1NjM2ZjQzMTcyZjYwJywgJzB4ODRjODc4MTRhMWYwYWI3MicsICcweDhjYzcwMjA4MWE2NDM5ZWMnLFxuICAnMHg5MGJlZmZmYTIzNjMxZTI4JywgJzB4YTQ1MDZjZWJkZTgyYmRlOScsICcweGJlZjlhM2Y3YjJjNjc5MTUnLCAnMHhjNjcxNzhmMmUzNzI1MzJiJyxcbiAgJzB4Y2EyNzNlY2VlYTI2NjE5YycsICcweGQxODZiOGM3MjFjMGMyMDcnLCAnMHhlYWRhN2RkNmNkZTBlYjFlJywgJzB4ZjU3ZDRmN2ZlZTZlZDE3OCcsXG4gICcweDA2ZjA2N2FhNzIxNzZmYmEnLCAnMHgwYTYzN2RjNWEyYzg5OGE2JywgJzB4MTEzZjk4MDRiZWY5MGRhZScsICcweDFiNzEwYjM1MTMxYzQ3MWInLFxuICAnMHgyOGRiNzdmNTIzMDQ3ZDg0JywgJzB4MzJjYWFiN2I0MGM3MjQ5MycsICcweDNjOWViZTBhMTVjOWJlYmMnLCAnMHg0MzFkNjdjNDljMTAwZDRjJyxcbiAgJzB4NGNjNWQ0YmVjYjNlNDJiNicsICcweDU5N2YyOTljZmM2NTdlMmEnLCAnMHg1ZmNiNmZhYjNhZDZmYWVjJywgJzB4NmM0NDE5OGM0YTQ3NTgxNydcbl0ubWFwKG4gPT4gQmlnSW50KG4pKSkpKCk7XG5jb25zdCBTSEE1MTJfS2ggPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IEs1MTJbMF0pKCk7XG5jb25zdCBTSEE1MTJfS2wgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IEs1MTJbMV0pKCk7XG5cbi8vIFJldXNhYmxlIHRlbXBvcmFyeSBidWZmZXJzXG5jb25zdCBTSEE1MTJfV19IID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg4MCk7XG5jb25zdCBTSEE1MTJfV19MID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg4MCk7XG5cbi8qKiBJbnRlcm5hbCA2NC1ieXRlIGJhc2UgU0hBMiBoYXNoIGNsYXNzLiAqL1xuYWJzdHJhY3QgY2xhc3MgU0hBMl82NEI8VCBleHRlbmRzIFNIQTJfNjRCPFQ+PiBleHRlbmRzIEhhc2hNRDxUPiB7XG4gIC8vIFdlIGNhbm5vdCB1c2UgYXJyYXkgaGVyZSBzaW5jZSBhcnJheSBhbGxvd3MgaW5kZXhpbmcgYnkgdmFyaWFibGVcbiAgLy8gd2hpY2ggbWVhbnMgb3B0aW1pemVyL2NvbXBpbGVyIGNhbm5vdCB1c2UgcmVnaXN0ZXJzLlxuICAvLyBoIC0tIGhpZ2ggMzIgYml0cywgbCAtLSBsb3cgMzIgYml0c1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEFsOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBCaDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgQmw6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IENoOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBDbDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgRGg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IERsOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBFaDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgRWw6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEZoOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBGbDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgR2g6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IEdsOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBIaDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgSGw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRMZW46IG51bWJlcikge1xuICAgIHN1cGVyKDEyOCwgb3V0cHV0TGVuLCAxNiwgZmFsc2UpO1xuICB9XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBwcm90ZWN0ZWQgZ2V0KCk6IFtcbiAgICBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcixcbiAgICBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlclxuICBdIHtcbiAgICBjb25zdCB7IEFoLCBBbCwgQmgsIEJsLCBDaCwgQ2wsIERoLCBEbCwgRWgsIEVsLCBGaCwgRmwsIEdoLCBHbCwgSGgsIEhsIH0gPSB0aGlzO1xuICAgIHJldHVybiBbQWgsIEFsLCBCaCwgQmwsIENoLCBDbCwgRGgsIERsLCBFaCwgRWwsIEZoLCBGbCwgR2gsIEdsLCBIaCwgSGxdO1xuICB9XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBwcm90ZWN0ZWQgc2V0KFxuICAgIEFoOiBudW1iZXIsIEFsOiBudW1iZXIsIEJoOiBudW1iZXIsIEJsOiBudW1iZXIsIENoOiBudW1iZXIsIENsOiBudW1iZXIsIERoOiBudW1iZXIsIERsOiBudW1iZXIsXG4gICAgRWg6IG51bWJlciwgRWw6IG51bWJlciwgRmg6IG51bWJlciwgRmw6IG51bWJlciwgR2g6IG51bWJlciwgR2w6IG51bWJlciwgSGg6IG51bWJlciwgSGw6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICB0aGlzLkFoID0gQWggfCAwO1xuICAgIHRoaXMuQWwgPSBBbCB8IDA7XG4gICAgdGhpcy5CaCA9IEJoIHwgMDtcbiAgICB0aGlzLkJsID0gQmwgfCAwO1xuICAgIHRoaXMuQ2ggPSBDaCB8IDA7XG4gICAgdGhpcy5DbCA9IENsIHwgMDtcbiAgICB0aGlzLkRoID0gRGggfCAwO1xuICAgIHRoaXMuRGwgPSBEbCB8IDA7XG4gICAgdGhpcy5FaCA9IEVoIHwgMDtcbiAgICB0aGlzLkVsID0gRWwgfCAwO1xuICAgIHRoaXMuRmggPSBGaCB8IDA7XG4gICAgdGhpcy5GbCA9IEZsIHwgMDtcbiAgICB0aGlzLkdoID0gR2ggfCAwO1xuICAgIHRoaXMuR2wgPSBHbCB8IDA7XG4gICAgdGhpcy5IaCA9IEhoIHwgMDtcbiAgICB0aGlzLkhsID0gSGwgfCAwO1xuICB9XG4gIHByb3RlY3RlZCBwcm9jZXNzKHZpZXc6IERhdGFWaWV3LCBvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEV4dGVuZCB0aGUgZmlyc3QgMTYgd29yZHMgaW50byB0aGUgcmVtYWluaW5nIDY0IHdvcmRzIHdbMTYuLjc5XSBvZiB0aGUgbWVzc2FnZSBzY2hlZHVsZSBhcnJheVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKywgb2Zmc2V0ICs9IDQpIHtcbiAgICAgIFNIQTUxMl9XX0hbaV0gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQpO1xuICAgICAgU0hBNTEyX1dfTFtpXSA9IHZpZXcuZ2V0VWludDMyKChvZmZzZXQgKz0gNCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMTY7IGkgPCA4MDsgaSsrKSB7XG4gICAgICAvLyBzMCA6PSAod1tpLTE1XSByaWdodHJvdGF0ZSAxKSB4b3IgKHdbaS0xNV0gcmlnaHRyb3RhdGUgOCkgeG9yICh3W2ktMTVdIHJpZ2h0c2hpZnQgNylcbiAgICAgIGNvbnN0IFcxNWggPSBTSEE1MTJfV19IW2kgLSAxNV0gfCAwO1xuICAgICAgY29uc3QgVzE1bCA9IFNIQTUxMl9XX0xbaSAtIDE1XSB8IDA7XG4gICAgICBjb25zdCBzMGggPSB1NjQucm90clNIKFcxNWgsIFcxNWwsIDEpIF4gdTY0LnJvdHJTSChXMTVoLCBXMTVsLCA4KSBeIHU2NC5zaHJTSChXMTVoLCBXMTVsLCA3KTtcbiAgICAgIGNvbnN0IHMwbCA9IHU2NC5yb3RyU0woVzE1aCwgVzE1bCwgMSkgXiB1NjQucm90clNMKFcxNWgsIFcxNWwsIDgpIF4gdTY0LnNoclNMKFcxNWgsIFcxNWwsIDcpO1xuICAgICAgLy8gczEgOj0gKHdbaS0yXSByaWdodHJvdGF0ZSAxOSkgeG9yICh3W2ktMl0gcmlnaHRyb3RhdGUgNjEpIHhvciAod1tpLTJdIHJpZ2h0c2hpZnQgNilcbiAgICAgIGNvbnN0IFcyaCA9IFNIQTUxMl9XX0hbaSAtIDJdIHwgMDtcbiAgICAgIGNvbnN0IFcybCA9IFNIQTUxMl9XX0xbaSAtIDJdIHwgMDtcbiAgICAgIGNvbnN0IHMxaCA9IHU2NC5yb3RyU0goVzJoLCBXMmwsIDE5KSBeIHU2NC5yb3RyQkgoVzJoLCBXMmwsIDYxKSBeIHU2NC5zaHJTSChXMmgsIFcybCwgNik7XG4gICAgICBjb25zdCBzMWwgPSB1NjQucm90clNMKFcyaCwgVzJsLCAxOSkgXiB1NjQucm90ckJMKFcyaCwgVzJsLCA2MSkgXiB1NjQuc2hyU0woVzJoLCBXMmwsIDYpO1xuICAgICAgLy8gU0hBMjU2X1dbaV0gPSBzMCArIHMxICsgU0hBMjU2X1dbaSAtIDddICsgU0hBMjU2X1dbaSAtIDE2XTtcbiAgICAgIGNvbnN0IFNVTWwgPSB1NjQuYWRkNEwoczBsLCBzMWwsIFNIQTUxMl9XX0xbaSAtIDddLCBTSEE1MTJfV19MW2kgLSAxNl0pO1xuICAgICAgY29uc3QgU1VNaCA9IHU2NC5hZGQ0SChTVU1sLCBzMGgsIHMxaCwgU0hBNTEyX1dfSFtpIC0gN10sIFNIQTUxMl9XX0hbaSAtIDE2XSk7XG4gICAgICBTSEE1MTJfV19IW2ldID0gU1VNaCB8IDA7XG4gICAgICBTSEE1MTJfV19MW2ldID0gU1VNbCB8IDA7XG4gICAgfVxuICAgIGxldCB7IEFoLCBBbCwgQmgsIEJsLCBDaCwgQ2wsIERoLCBEbCwgRWgsIEVsLCBGaCwgRmwsIEdoLCBHbCwgSGgsIEhsIH0gPSB0aGlzO1xuICAgIC8vIENvbXByZXNzaW9uIGZ1bmN0aW9uIG1haW4gbG9vcCwgODAgcm91bmRzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG4gICAgICAvLyBTMSA6PSAoZSByaWdodHJvdGF0ZSAxNCkgeG9yIChlIHJpZ2h0cm90YXRlIDE4KSB4b3IgKGUgcmlnaHRyb3RhdGUgNDEpXG4gICAgICBjb25zdCBzaWdtYTFoID0gdTY0LnJvdHJTSChFaCwgRWwsIDE0KSBeIHU2NC5yb3RyU0goRWgsIEVsLCAxOCkgXiB1NjQucm90ckJIKEVoLCBFbCwgNDEpO1xuICAgICAgY29uc3Qgc2lnbWExbCA9IHU2NC5yb3RyU0woRWgsIEVsLCAxNCkgXiB1NjQucm90clNMKEVoLCBFbCwgMTgpIF4gdTY0LnJvdHJCTChFaCwgRWwsIDQxKTtcbiAgICAgIC8vY29uc3QgVDEgPSAoSCArIHNpZ21hMSArIENoaShFLCBGLCBHKSArIFNIQTI1Nl9LW2ldICsgU0hBMjU2X1dbaV0pIHwgMDtcbiAgICAgIGNvbnN0IENISWggPSAoRWggJiBGaCkgXiAofkVoICYgR2gpO1xuICAgICAgY29uc3QgQ0hJbCA9IChFbCAmIEZsKSBeICh+RWwgJiBHbCk7XG4gICAgICAvLyBUMSA9IEggKyBzaWdtYTEgKyBDaGkoRSwgRiwgRykgKyBTSEE1MTJfS1tpXSArIFNIQTUxMl9XW2ldXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IFQxbGwgPSB1NjQuYWRkNUwoSGwsIHNpZ21hMWwsIENISWwsIFNIQTUxMl9LbFtpXSwgU0hBNTEyX1dfTFtpXSk7XG4gICAgICBjb25zdCBUMWggPSB1NjQuYWRkNUgoVDFsbCwgSGgsIHNpZ21hMWgsIENISWgsIFNIQTUxMl9LaFtpXSwgU0hBNTEyX1dfSFtpXSk7XG4gICAgICBjb25zdCBUMWwgPSBUMWxsIHwgMDtcbiAgICAgIC8vIFMwIDo9IChhIHJpZ2h0cm90YXRlIDI4KSB4b3IgKGEgcmlnaHRyb3RhdGUgMzQpIHhvciAoYSByaWdodHJvdGF0ZSAzOSlcbiAgICAgIGNvbnN0IHNpZ21hMGggPSB1NjQucm90clNIKEFoLCBBbCwgMjgpIF4gdTY0LnJvdHJCSChBaCwgQWwsIDM0KSBeIHU2NC5yb3RyQkgoQWgsIEFsLCAzOSk7XG4gICAgICBjb25zdCBzaWdtYTBsID0gdTY0LnJvdHJTTChBaCwgQWwsIDI4KSBeIHU2NC5yb3RyQkwoQWgsIEFsLCAzNCkgXiB1NjQucm90ckJMKEFoLCBBbCwgMzkpO1xuICAgICAgY29uc3QgTUFKaCA9IChBaCAmIEJoKSBeIChBaCAmIENoKSBeIChCaCAmIENoKTtcbiAgICAgIGNvbnN0IE1BSmwgPSAoQWwgJiBCbCkgXiAoQWwgJiBDbCkgXiAoQmwgJiBDbCk7XG4gICAgICBIaCA9IEdoIHwgMDtcbiAgICAgIEhsID0gR2wgfCAwO1xuICAgICAgR2ggPSBGaCB8IDA7XG4gICAgICBHbCA9IEZsIHwgMDtcbiAgICAgIEZoID0gRWggfCAwO1xuICAgICAgRmwgPSBFbCB8IDA7XG4gICAgICAoeyBoOiBFaCwgbDogRWwgfSA9IHU2NC5hZGQoRGggfCAwLCBEbCB8IDAsIFQxaCB8IDAsIFQxbCB8IDApKTtcbiAgICAgIERoID0gQ2ggfCAwO1xuICAgICAgRGwgPSBDbCB8IDA7XG4gICAgICBDaCA9IEJoIHwgMDtcbiAgICAgIENsID0gQmwgfCAwO1xuICAgICAgQmggPSBBaCB8IDA7XG4gICAgICBCbCA9IEFsIHwgMDtcbiAgICAgIGNvbnN0IEFsbCA9IHU2NC5hZGQzTChUMWwsIHNpZ21hMGwsIE1BSmwpO1xuICAgICAgQWggPSB1NjQuYWRkM0goQWxsLCBUMWgsIHNpZ21hMGgsIE1BSmgpO1xuICAgICAgQWwgPSBBbGwgfCAwO1xuICAgIH1cbiAgICAvLyBBZGQgdGhlIGNvbXByZXNzZWQgY2h1bmsgdG8gdGhlIGN1cnJlbnQgaGFzaCB2YWx1ZVxuICAgICh7IGg6IEFoLCBsOiBBbCB9ID0gdTY0LmFkZCh0aGlzLkFoIHwgMCwgdGhpcy5BbCB8IDAsIEFoIHwgMCwgQWwgfCAwKSk7XG4gICAgKHsgaDogQmgsIGw6IEJsIH0gPSB1NjQuYWRkKHRoaXMuQmggfCAwLCB0aGlzLkJsIHwgMCwgQmggfCAwLCBCbCB8IDApKTtcbiAgICAoeyBoOiBDaCwgbDogQ2wgfSA9IHU2NC5hZGQodGhpcy5DaCB8IDAsIHRoaXMuQ2wgfCAwLCBDaCB8IDAsIENsIHwgMCkpO1xuICAgICh7IGg6IERoLCBsOiBEbCB9ID0gdTY0LmFkZCh0aGlzLkRoIHwgMCwgdGhpcy5EbCB8IDAsIERoIHwgMCwgRGwgfCAwKSk7XG4gICAgKHsgaDogRWgsIGw6IEVsIH0gPSB1NjQuYWRkKHRoaXMuRWggfCAwLCB0aGlzLkVsIHwgMCwgRWggfCAwLCBFbCB8IDApKTtcbiAgICAoeyBoOiBGaCwgbDogRmwgfSA9IHU2NC5hZGQodGhpcy5GaCB8IDAsIHRoaXMuRmwgfCAwLCBGaCB8IDAsIEZsIHwgMCkpO1xuICAgICh7IGg6IEdoLCBsOiBHbCB9ID0gdTY0LmFkZCh0aGlzLkdoIHwgMCwgdGhpcy5HbCB8IDAsIEdoIHwgMCwgR2wgfCAwKSk7XG4gICAgKHsgaDogSGgsIGw6IEhsIH0gPSB1NjQuYWRkKHRoaXMuSGggfCAwLCB0aGlzLkhsIHwgMCwgSGggfCAwLCBIbCB8IDApKTtcbiAgICB0aGlzLnNldChBaCwgQWwsIEJoLCBCbCwgQ2gsIENsLCBEaCwgRGwsIEVoLCBFbCwgRmgsIEZsLCBHaCwgR2wsIEhoLCBIbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJvdW5kQ2xlYW4oKTogdm9pZCB7XG4gICAgY2xlYW4oU0hBNTEyX1dfSCwgU0hBNTEyX1dfTCk7XG4gIH1cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBjbGVhbih0aGlzLmJ1ZmZlcik7XG4gICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gIH1cbn1cblxuLyoqIEludGVybmFsIFNIQTItNTEyIGhhc2ggY2xhc3MuICovXG5leHBvcnQgY2xhc3MgX1NIQTUxMiBleHRlbmRzIFNIQTJfNjRCPF9TSEE1MTI+IHtcbiAgcHJvdGVjdGVkIEFoOiBudW1iZXIgPSBTSEE1MTJfSVZbMF0gfCAwO1xuICBwcm90ZWN0ZWQgQWw6IG51bWJlciA9IFNIQTUxMl9JVlsxXSB8IDA7XG4gIHByb3RlY3RlZCBCaDogbnVtYmVyID0gU0hBNTEyX0lWWzJdIHwgMDtcbiAgcHJvdGVjdGVkIEJsOiBudW1iZXIgPSBTSEE1MTJfSVZbM10gfCAwO1xuICBwcm90ZWN0ZWQgQ2g6IG51bWJlciA9IFNIQTUxMl9JVls0XSB8IDA7XG4gIHByb3RlY3RlZCBDbDogbnVtYmVyID0gU0hBNTEyX0lWWzVdIHwgMDtcbiAgcHJvdGVjdGVkIERoOiBudW1iZXIgPSBTSEE1MTJfSVZbNl0gfCAwO1xuICBwcm90ZWN0ZWQgRGw6IG51bWJlciA9IFNIQTUxMl9JVls3XSB8IDA7XG4gIHByb3RlY3RlZCBFaDogbnVtYmVyID0gU0hBNTEyX0lWWzhdIHwgMDtcbiAgcHJvdGVjdGVkIEVsOiBudW1iZXIgPSBTSEE1MTJfSVZbOV0gfCAwO1xuICBwcm90ZWN0ZWQgRmg6IG51bWJlciA9IFNIQTUxMl9JVlsxMF0gfCAwO1xuICBwcm90ZWN0ZWQgRmw6IG51bWJlciA9IFNIQTUxMl9JVlsxMV0gfCAwO1xuICBwcm90ZWN0ZWQgR2g6IG51bWJlciA9IFNIQTUxMl9JVlsxMl0gfCAwO1xuICBwcm90ZWN0ZWQgR2w6IG51bWJlciA9IFNIQTUxMl9JVlsxM10gfCAwO1xuICBwcm90ZWN0ZWQgSGg6IG51bWJlciA9IFNIQTUxMl9JVlsxNF0gfCAwO1xuICBwcm90ZWN0ZWQgSGw6IG51bWJlciA9IFNIQTUxMl9JVlsxNV0gfCAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKDY0KTtcbiAgfVxufVxuXG4vKiogSW50ZXJuYWwgU0hBMi0zODQgaGFzaCBjbGFzcy4gKi9cbmV4cG9ydCBjbGFzcyBfU0hBMzg0IGV4dGVuZHMgU0hBMl82NEI8X1NIQTM4ND4ge1xuICBwcm90ZWN0ZWQgQWg6IG51bWJlciA9IFNIQTM4NF9JVlswXSB8IDA7XG4gIHByb3RlY3RlZCBBbDogbnVtYmVyID0gU0hBMzg0X0lWWzFdIHwgMDtcbiAgcHJvdGVjdGVkIEJoOiBudW1iZXIgPSBTSEEzODRfSVZbMl0gfCAwO1xuICBwcm90ZWN0ZWQgQmw6IG51bWJlciA9IFNIQTM4NF9JVlszXSB8IDA7XG4gIHByb3RlY3RlZCBDaDogbnVtYmVyID0gU0hBMzg0X0lWWzRdIHwgMDtcbiAgcHJvdGVjdGVkIENsOiBudW1iZXIgPSBTSEEzODRfSVZbNV0gfCAwO1xuICBwcm90ZWN0ZWQgRGg6IG51bWJlciA9IFNIQTM4NF9JVls2XSB8IDA7XG4gIHByb3RlY3RlZCBEbDogbnVtYmVyID0gU0hBMzg0X0lWWzddIHwgMDtcbiAgcHJvdGVjdGVkIEVoOiBudW1iZXIgPSBTSEEzODRfSVZbOF0gfCAwO1xuICBwcm90ZWN0ZWQgRWw6IG51bWJlciA9IFNIQTM4NF9JVls5XSB8IDA7XG4gIHByb3RlY3RlZCBGaDogbnVtYmVyID0gU0hBMzg0X0lWWzEwXSB8IDA7XG4gIHByb3RlY3RlZCBGbDogbnVtYmVyID0gU0hBMzg0X0lWWzExXSB8IDA7XG4gIHByb3RlY3RlZCBHaDogbnVtYmVyID0gU0hBMzg0X0lWWzEyXSB8IDA7XG4gIHByb3RlY3RlZCBHbDogbnVtYmVyID0gU0hBMzg0X0lWWzEzXSB8IDA7XG4gIHByb3RlY3RlZCBIaDogbnVtYmVyID0gU0hBMzg0X0lWWzE0XSB8IDA7XG4gIHByb3RlY3RlZCBIbDogbnVtYmVyID0gU0hBMzg0X0lWWzE1XSB8IDA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoNDgpO1xuICB9XG59XG5cbi8qKlxuICogVHJ1bmNhdGVkIFNIQTUxMi8yNTYgYW5kIFNIQTUxMi8yMjQuXG4gKiBTSEE1MTJfSVYgaXMgWE9SZWQgd2l0aCAweGE1YTVhNWE1YTVhNWE1YTUsIHRoZW4gdXNlZCBhcyBcImludGVybWVkaWFyeVwiIElWIG9mIFNIQTUxMi90LlxuICogVGhlbiB0IGhhc2hlcyBzdHJpbmcgdG8gcHJvZHVjZSByZXN1bHQgSVYuXG4gKiBTZWUgYHRlc3QvbWlzYy9zaGEyLWdlbi1pdi5qc2AuXG4gKi9cblxuLyoqIFNIQTUxMi8yMjQgSVYgKi9cbmNvbnN0IFQyMjRfSVYgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDB4OGMzZDM3YzgsIDB4MTk1NDRkYTIsIDB4NzNlMTk5NjYsIDB4ODlkY2Q0ZDYsIDB4MWRmYWI3YWUsIDB4MzJmZjljODIsIDB4Njc5ZGQ1MTQsIDB4NTgyZjlmY2YsXG4gIDB4MGY2ZDJiNjksIDB4N2JkNDRkYTgsIDB4NzdlMzZmNzMsIDB4MDRjNDg5NDIsIDB4M2Y5ZDg1YTgsIDB4NmExZDM2YzgsIDB4MTExMmU2YWQsIDB4OTFkNjkyYTEsXG5dKTtcblxuLyoqIFNIQTUxMi8yNTYgSVYgKi9cbmNvbnN0IFQyNTZfSVYgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDB4MjIzMTIxOTQsIDB4ZmMyYmY3MmMsIDB4OWY1NTVmYTMsIDB4Yzg0YzY0YzIsIDB4MjM5M2I4NmIsIDB4NmY1M2IxNTEsIDB4OTYzODc3MTksIDB4NTk0MGVhYmQsXG4gIDB4OTYyODNlZTIsIDB4YTg4ZWZmZTMsIDB4YmU1ZTFlMjUsIDB4NTM4NjM5OTIsIDB4MmIwMTk5ZmMsIDB4MmM4NWI4YWEsIDB4MGViNzJkZGMsIDB4ODFjNTJjYTIsXG5dKTtcblxuLyoqIEludGVybmFsIFNIQTItNTEyLzIyNCBoYXNoIGNsYXNzLiAqL1xuZXhwb3J0IGNsYXNzIF9TSEE1MTJfMjI0IGV4dGVuZHMgU0hBMl82NEI8X1NIQTUxMl8yMjQ+IHtcbiAgcHJvdGVjdGVkIEFoOiBudW1iZXIgPSBUMjI0X0lWWzBdIHwgMDtcbiAgcHJvdGVjdGVkIEFsOiBudW1iZXIgPSBUMjI0X0lWWzFdIHwgMDtcbiAgcHJvdGVjdGVkIEJoOiBudW1iZXIgPSBUMjI0X0lWWzJdIHwgMDtcbiAgcHJvdGVjdGVkIEJsOiBudW1iZXIgPSBUMjI0X0lWWzNdIHwgMDtcbiAgcHJvdGVjdGVkIENoOiBudW1iZXIgPSBUMjI0X0lWWzRdIHwgMDtcbiAgcHJvdGVjdGVkIENsOiBudW1iZXIgPSBUMjI0X0lWWzVdIHwgMDtcbiAgcHJvdGVjdGVkIERoOiBudW1iZXIgPSBUMjI0X0lWWzZdIHwgMDtcbiAgcHJvdGVjdGVkIERsOiBudW1iZXIgPSBUMjI0X0lWWzddIHwgMDtcbiAgcHJvdGVjdGVkIEVoOiBudW1iZXIgPSBUMjI0X0lWWzhdIHwgMDtcbiAgcHJvdGVjdGVkIEVsOiBudW1iZXIgPSBUMjI0X0lWWzldIHwgMDtcbiAgcHJvdGVjdGVkIEZoOiBudW1iZXIgPSBUMjI0X0lWWzEwXSB8IDA7XG4gIHByb3RlY3RlZCBGbDogbnVtYmVyID0gVDIyNF9JVlsxMV0gfCAwO1xuICBwcm90ZWN0ZWQgR2g6IG51bWJlciA9IFQyMjRfSVZbMTJdIHwgMDtcbiAgcHJvdGVjdGVkIEdsOiBudW1iZXIgPSBUMjI0X0lWWzEzXSB8IDA7XG4gIHByb3RlY3RlZCBIaDogbnVtYmVyID0gVDIyNF9JVlsxNF0gfCAwO1xuICBwcm90ZWN0ZWQgSGw6IG51bWJlciA9IFQyMjRfSVZbMTVdIHwgMDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigyOCk7XG4gIH1cbn1cblxuLyoqIEludGVybmFsIFNIQTItNTEyLzI1NiBoYXNoIGNsYXNzLiAqL1xuZXhwb3J0IGNsYXNzIF9TSEE1MTJfMjU2IGV4dGVuZHMgU0hBMl82NEI8X1NIQTUxMl8yNTY+IHtcbiAgcHJvdGVjdGVkIEFoOiBudW1iZXIgPSBUMjU2X0lWWzBdIHwgMDtcbiAgcHJvdGVjdGVkIEFsOiBudW1iZXIgPSBUMjU2X0lWWzFdIHwgMDtcbiAgcHJvdGVjdGVkIEJoOiBudW1iZXIgPSBUMjU2X0lWWzJdIHwgMDtcbiAgcHJvdGVjdGVkIEJsOiBudW1iZXIgPSBUMjU2X0lWWzNdIHwgMDtcbiAgcHJvdGVjdGVkIENoOiBudW1iZXIgPSBUMjU2X0lWWzRdIHwgMDtcbiAgcHJvdGVjdGVkIENsOiBudW1iZXIgPSBUMjU2X0lWWzVdIHwgMDtcbiAgcHJvdGVjdGVkIERoOiBudW1iZXIgPSBUMjU2X0lWWzZdIHwgMDtcbiAgcHJvdGVjdGVkIERsOiBudW1iZXIgPSBUMjU2X0lWWzddIHwgMDtcbiAgcHJvdGVjdGVkIEVoOiBudW1iZXIgPSBUMjU2X0lWWzhdIHwgMDtcbiAgcHJvdGVjdGVkIEVsOiBudW1iZXIgPSBUMjU2X0lWWzldIHwgMDtcbiAgcHJvdGVjdGVkIEZoOiBudW1iZXIgPSBUMjU2X0lWWzEwXSB8IDA7XG4gIHByb3RlY3RlZCBGbDogbnVtYmVyID0gVDI1Nl9JVlsxMV0gfCAwO1xuICBwcm90ZWN0ZWQgR2g6IG51bWJlciA9IFQyNTZfSVZbMTJdIHwgMDtcbiAgcHJvdGVjdGVkIEdsOiBudW1iZXIgPSBUMjU2X0lWWzEzXSB8IDA7XG4gIHByb3RlY3RlZCBIaDogbnVtYmVyID0gVDI1Nl9JVlsxNF0gfCAwO1xuICBwcm90ZWN0ZWQgSGw6IG51bWJlciA9IFQyNTZfSVZbMTVdIHwgMDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigzMik7XG4gIH1cbn1cblxuLyoqXG4gKiBTSEEyLTI1NiBoYXNoIGZ1bmN0aW9uIGZyb20gUkZDIDQ2MzQuIEluIEpTIGl0J3MgdGhlIGZhc3Rlc3Q6IGV2ZW4gZmFzdGVyIHRoYW4gQmxha2UzLiBTb21lIGluZm86XG4gKlxuICogLSBUcnlpbmcgMl4xMjggaGFzaGVzIHdvdWxkIGdldCA1MCUgY2hhbmNlIG9mIGNvbGxpc2lvbiwgdXNpbmcgYmlydGhkYXkgYXR0YWNrLlxuICogLSBCVEMgbmV0d29yayBpcyBkb2luZyAyXjcwIGhhc2hlcy9zZWMgKDJeOTUgaGFzaGVzL3llYXIpIGFzIHBlciAyMDI1LlxuICogLSBFYWNoIHNoYTI1NiBoYXNoIGlzIGV4ZWN1dGluZyAyXjE4IGJpdCBvcGVyYXRpb25zLlxuICogLSBHb29kIDIwMjQgQVNJQ3MgY2FuIGRvIDIwMFRoL3NlYyB3aXRoIDM1MDAgd2F0dHMgb2YgcG93ZXIsIGNvcnJlc3BvbmRpbmcgdG8gMl4zNiBoYXNoZXMvam91bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBzaGEyNTY6IENIYXNoPF9TSEEyNTY+ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUhhc2hlcihcbiAgKCkgPT4gbmV3IF9TSEEyNTYoKSxcbiAgLyogQF9fUFVSRV9fICovIG9pZE5pc3QoMHgwMSlcbik7XG4vKiogU0hBMi0yMjQgaGFzaCBmdW5jdGlvbiBmcm9tIFJGQyA0NjM0ICovXG5leHBvcnQgY29uc3Qgc2hhMjI0OiBDSGFzaDxfU0hBMjI0PiA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVIYXNoZXIoXG4gICgpID0+IG5ldyBfU0hBMjI0KCksXG4gIC8qIEBfX1BVUkVfXyAqLyBvaWROaXN0KDB4MDQpXG4pO1xuXG4vKiogU0hBMi01MTIgaGFzaCBmdW5jdGlvbiBmcm9tIFJGQyA0NjM0LiAqL1xuZXhwb3J0IGNvbnN0IHNoYTUxMjogQ0hhc2g8X1NIQTUxMj4gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSGFzaGVyKFxuICAoKSA9PiBuZXcgX1NIQTUxMigpLFxuICAvKiBAX19QVVJFX18gKi8gb2lkTmlzdCgweDAzKVxuKTtcbi8qKiBTSEEyLTM4NCBoYXNoIGZ1bmN0aW9uIGZyb20gUkZDIDQ2MzQuICovXG5leHBvcnQgY29uc3Qgc2hhMzg0OiBDSGFzaDxfU0hBMzg0PiA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVIYXNoZXIoXG4gICgpID0+IG5ldyBfU0hBMzg0KCksXG4gIC8qIEBfX1BVUkVfXyAqLyBvaWROaXN0KDB4MDIpXG4pO1xuXG4vKipcbiAqIFNIQTItNTEyLzI1NiBcInRydW5jYXRlZFwiIGhhc2ggZnVuY3Rpb24sIHdpdGggaW1wcm92ZWQgcmVzaXN0YW5jZSB0byBsZW5ndGggZXh0ZW5zaW9uIGF0dGFja3MuXG4gKiBTZWUgdGhlIHBhcGVyIG9uIFt0cnVuY2F0ZWQgU0hBNTEyXShodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDEwLzU0OC5wZGYpLlxuICovXG5leHBvcnQgY29uc3Qgc2hhNTEyXzI1NjogQ0hhc2g8X1NIQTUxMl8yNTY+ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUhhc2hlcihcbiAgKCkgPT4gbmV3IF9TSEE1MTJfMjU2KCksXG4gIC8qIEBfX1BVUkVfXyAqLyBvaWROaXN0KDB4MDYpXG4pO1xuLyoqXG4gKiBTSEEyLTUxMi8yMjQgXCJ0cnVuY2F0ZWRcIiBoYXNoIGZ1bmN0aW9uLCB3aXRoIGltcHJvdmVkIHJlc2lzdGFuY2UgdG8gbGVuZ3RoIGV4dGVuc2lvbiBhdHRhY2tzLlxuICogU2VlIHRoZSBwYXBlciBvbiBbdHJ1bmNhdGVkIFNIQTUxMl0oaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMC81NDgucGRmKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNoYTUxMl8yMjQ6IENIYXNoPF9TSEE1MTJfMjI0PiA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVIYXNoZXIoXG4gICgpID0+IG5ldyBfU0hBNTEyXzIyNCgpLFxuICAvKiBAX19QVVJFX18gKi8gb2lkTmlzdCgweDA1KVxuKTtcbiIsICIvKipcbiAqIEludGVybmFsIE1lcmtsZS1EYW1nYXJkIGhhc2ggdXRpbHMuXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGFieXRlcywgYWV4aXN0cywgYW91dHB1dCwgY2xlYW4sIGNyZWF0ZVZpZXcsIHR5cGUgSGFzaCB9IGZyb20gJy4vdXRpbHMudHMnO1xuXG4vKiogQ2hvaWNlOiBhID8gYiA6IGMgKi9cbmV4cG9ydCBmdW5jdGlvbiBDaGkoYTogbnVtYmVyLCBiOiBudW1iZXIsIGM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoYSAmIGIpIF4gKH5hICYgYyk7XG59XG5cbi8qKiBNYWpvcml0eSBmdW5jdGlvbiwgdHJ1ZSBpZiBhbnkgdHdvIGlucHV0cyBpcyB0cnVlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1haihhOiBudW1iZXIsIGI6IG51bWJlciwgYzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChhICYgYikgXiAoYSAmIGMpIF4gKGIgJiBjKTtcbn1cblxuLyoqXG4gKiBNZXJrbGUtRGFtZ2FyZCBoYXNoIGNvbnN0cnVjdGlvbiBiYXNlIGNsYXNzLlxuICogQ291bGQgYmUgdXNlZCB0byBjcmVhdGUgTUQ1LCBSSVBFTUQsIFNIQTEsIFNIQTIuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIYXNoTUQ8VCBleHRlbmRzIEhhc2hNRDxUPj4gaW1wbGVtZW50cyBIYXNoPFQ+IHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByb2Nlc3MoYnVmOiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiB2b2lkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0KCk6IG51bWJlcltdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0KC4uLmFyZ3M6IG51bWJlcltdKTogdm9pZDtcbiAgYWJzdHJhY3QgZGVzdHJveSgpOiB2b2lkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgcm91bmRDbGVhbigpOiB2b2lkO1xuXG4gIHJlYWRvbmx5IGJsb2NrTGVuOiBudW1iZXI7XG4gIHJlYWRvbmx5IG91dHB1dExlbjogbnVtYmVyO1xuICByZWFkb25seSBwYWRPZmZzZXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaXNMRTogYm9vbGVhbjtcblxuICAvLyBGb3IgcGFydGlhbCB1cGRhdGVzIGxlc3MgdGhhbiBibG9jayBzaXplXG4gIHByb3RlY3RlZCBidWZmZXI6IFVpbnQ4QXJyYXk7XG4gIHByb3RlY3RlZCB2aWV3OiBEYXRhVmlldztcbiAgcHJvdGVjdGVkIGZpbmlzaGVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBsZW5ndGggPSAwO1xuICBwcm90ZWN0ZWQgcG9zID0gMDtcbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGJsb2NrTGVuOiBudW1iZXIsIG91dHB1dExlbjogbnVtYmVyLCBwYWRPZmZzZXQ6IG51bWJlciwgaXNMRTogYm9vbGVhbikge1xuICAgIHRoaXMuYmxvY2tMZW4gPSBibG9ja0xlbjtcbiAgICB0aGlzLm91dHB1dExlbiA9IG91dHB1dExlbjtcbiAgICB0aGlzLnBhZE9mZnNldCA9IHBhZE9mZnNldDtcbiAgICB0aGlzLmlzTEUgPSBpc0xFO1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW4pO1xuICAgIHRoaXMudmlldyA9IGNyZWF0ZVZpZXcodGhpcy5idWZmZXIpO1xuICB9XG4gIHVwZGF0ZShkYXRhOiBVaW50OEFycmF5KTogdGhpcyB7XG4gICAgYWV4aXN0cyh0aGlzKTtcbiAgICBhYnl0ZXMoZGF0YSk7XG4gICAgY29uc3QgeyB2aWV3LCBidWZmZXIsIGJsb2NrTGVuIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IGxlbjsgKSB7XG4gICAgICBjb25zdCB0YWtlID0gTWF0aC5taW4oYmxvY2tMZW4gLSB0aGlzLnBvcywgbGVuIC0gcG9zKTtcbiAgICAgIC8vIEZhc3QgcGF0aDogd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmxvY2sgaW4gaW5wdXQsIGNhc3QgaXQgdG8gdmlldyBhbmQgcHJvY2Vzc1xuICAgICAgaWYgKHRha2UgPT09IGJsb2NrTGVuKSB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gY3JlYXRlVmlldyhkYXRhKTtcbiAgICAgICAgZm9yICg7IGJsb2NrTGVuIDw9IGxlbiAtIHBvczsgcG9zICs9IGJsb2NrTGVuKSB0aGlzLnByb2Nlc3MoZGF0YVZpZXcsIHBvcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnVmZmVyLnNldChkYXRhLnN1YmFycmF5KHBvcywgcG9zICsgdGFrZSksIHRoaXMucG9zKTtcbiAgICAgIHRoaXMucG9zICs9IHRha2U7XG4gICAgICBwb3MgKz0gdGFrZTtcbiAgICAgIGlmICh0aGlzLnBvcyA9PT0gYmxvY2tMZW4pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzKHZpZXcsIDApO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMucm91bmRDbGVhbigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRpZ2VzdEludG8ob3V0OiBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgYWV4aXN0cyh0aGlzKTtcbiAgICBhb3V0cHV0KG91dCwgdGhpcyk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgLy8gUGFkZGluZ1xuICAgIC8vIFdlIGNhbiBhdm9pZCBhbGxvY2F0aW9uIG9mIGJ1ZmZlciBmb3IgcGFkZGluZyBjb21wbGV0ZWx5IGlmIGl0XG4gICAgLy8gd2FzIHByZXZpb3VzbHkgbm90IGFsbG9jYXRlZCBoZXJlLiBCdXQgaXQgd29uJ3QgY2hhbmdlIHBlcmZvcm1hbmNlLlxuICAgIGNvbnN0IHsgYnVmZmVyLCB2aWV3LCBibG9ja0xlbiwgaXNMRSB9ID0gdGhpcztcbiAgICBsZXQgeyBwb3MgfSA9IHRoaXM7XG4gICAgLy8gYXBwZW5kIHRoZSBiaXQgJzEnIHRvIHRoZSBtZXNzYWdlXG4gICAgYnVmZmVyW3BvcysrXSA9IDBiMTAwMDAwMDA7XG4gICAgY2xlYW4odGhpcy5idWZmZXIuc3ViYXJyYXkocG9zKSk7XG4gICAgLy8gd2UgaGF2ZSBsZXNzIHRoYW4gcGFkT2Zmc2V0IGxlZnQgaW4gYnVmZmVyLCBzbyB3ZSBjYW5ub3QgcHV0IGxlbmd0aCBpblxuICAgIC8vIGN1cnJlbnQgYmxvY2ssIG5lZWQgcHJvY2VzcyBpdCBhbmQgcGFkIGFnYWluXG4gICAgaWYgKHRoaXMucGFkT2Zmc2V0ID4gYmxvY2tMZW4gLSBwb3MpIHtcbiAgICAgIHRoaXMucHJvY2Vzcyh2aWV3LCAwKTtcbiAgICAgIHBvcyA9IDA7XG4gICAgfVxuICAgIC8vIFBhZCB1bnRpbCBmdWxsIGJsb2NrIGJ5dGUgd2l0aCB6ZXJvc1xuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBibG9ja0xlbjsgaSsrKSBidWZmZXJbaV0gPSAwO1xuICAgIC8vIE5vdGU6IHNoYTUxMiByZXF1aXJlcyBsZW5ndGggdG8gYmUgMTI4Yml0IGludGVnZXIsIGJ1dCBsZW5ndGggaW4gSlMgd2lsbCBvdmVyZmxvdyBiZWZvcmUgdGhhdFxuICAgIC8vIFlvdSBuZWVkIHRvIHdyaXRlIGFyb3VuZCAyIGV4YWJ5dGVzICh1NjRfbWF4IC8gOCAvICgxMDI0Kio2KSkgZm9yIHRoaXMgdG8gaGFwcGVuLlxuICAgIC8vIFNvIHdlIGp1c3Qgd3JpdGUgbG93ZXN0IDY0IGJpdHMgb2YgdGhhdCB2YWx1ZS5cbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChibG9ja0xlbiAtIDgsIEJpZ0ludCh0aGlzLmxlbmd0aCAqIDgpLCBpc0xFKTtcbiAgICB0aGlzLnByb2Nlc3ModmlldywgMCk7XG4gICAgY29uc3Qgb3ZpZXcgPSBjcmVhdGVWaWV3KG91dCk7XG4gICAgY29uc3QgbGVuID0gdGhpcy5vdXRwdXRMZW47XG4gICAgLy8gTk9URTogd2UgZG8gZGl2aXNpb24gYnkgNCBsYXRlciwgd2hpY2ggbXVzdCBiZSBmdXNlZCBpbiBzaW5nbGUgb3Agd2l0aCBtb2R1bG8gYnkgSklUXG4gICAgaWYgKGxlbiAlIDQpIHRocm93IG5ldyBFcnJvcignX3NoYTI6IG91dHB1dExlbiBtdXN0IGJlIGFsaWduZWQgdG8gMzJiaXQnKTtcbiAgICBjb25zdCBvdXRMZW4gPSBsZW4gLyA0O1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXQoKTtcbiAgICBpZiAob3V0TGVuID4gc3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ19zaGEyOiBvdXRwdXRMZW4gYmlnZ2VyIHRoYW4gc3RhdGUnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dExlbjsgaSsrKSBvdmlldy5zZXRVaW50MzIoNCAqIGksIHN0YXRlW2ldLCBpc0xFKTtcbiAgfVxuICBkaWdlc3QoKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgeyBidWZmZXIsIG91dHB1dExlbiB9ID0gdGhpcztcbiAgICB0aGlzLmRpZ2VzdEludG8oYnVmZmVyKTtcbiAgICBjb25zdCByZXMgPSBidWZmZXIuc2xpY2UoMCwgb3V0cHV0TGVuKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIF9jbG9uZUludG8odG8/OiBUKTogVCB7XG4gICAgdG8gfHw9IG5ldyAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpKCkgYXMgVDtcbiAgICB0by5zZXQoLi4udGhpcy5nZXQoKSk7XG4gICAgY29uc3QgeyBibG9ja0xlbiwgYnVmZmVyLCBsZW5ndGgsIGZpbmlzaGVkLCBkZXN0cm95ZWQsIHBvcyB9ID0gdGhpcztcbiAgICB0by5kZXN0cm95ZWQgPSBkZXN0cm95ZWQ7XG4gICAgdG8uZmluaXNoZWQgPSBmaW5pc2hlZDtcbiAgICB0by5sZW5ndGggPSBsZW5ndGg7XG4gICAgdG8ucG9zID0gcG9zO1xuICAgIGlmIChsZW5ndGggJSBibG9ja0xlbikgdG8uYnVmZmVyLnNldChidWZmZXIpO1xuICAgIHJldHVybiB0byBhcyB1bmtub3duIGFzIGFueTtcbiAgfVxuICBjbG9uZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvbmVJbnRvKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsIFNIQS0yIHN0YXRlOiBmcmFjdGlvbmFsIHBhcnRzIG9mIHNxdWFyZSByb290cyBvZiBmaXJzdCAxNiBwcmltZXMgMi4uNTMuXG4gKiBDaGVjayBvdXQgYHRlc3QvbWlzYy9zaGEyLWdlbi1pdi5qc2AgZm9yIHJlY29tcHV0YXRpb24gZ3VpZGUuXG4gKi9cblxuLyoqIEluaXRpYWwgU0hBMjU2IHN0YXRlLiBCaXRzIDAuLjMyIG9mIGZyYWMgcGFydCBvZiBzcXJ0IG9mIHByaW1lcyAyLi4xOSAqL1xuZXhwb3J0IGNvbnN0IFNIQTI1Nl9JVjogVWludDMyQXJyYXkgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTksXG5dKTtcblxuLyoqIEluaXRpYWwgU0hBMjI0IHN0YXRlLiBCaXRzIDMyLi42NCBvZiBmcmFjIHBhcnQgb2Ygc3FydCBvZiBwcmltZXMgMjMuLjUzICovXG5leHBvcnQgY29uc3QgU0hBMjI0X0lWOiBVaW50MzJBcnJheSA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSwgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCxcbl0pO1xuXG4vKiogSW5pdGlhbCBTSEEzODQgc3RhdGUuIEJpdHMgMC4uNjQgb2YgZnJhYyBwYXJ0IG9mIHNxcnQgb2YgcHJpbWVzIDIzLi41MyAqL1xuZXhwb3J0IGNvbnN0IFNIQTM4NF9JVjogVWludDMyQXJyYXkgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgsIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsIDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcsIDB4MTUyZmVjZDgsIDB4ZjcwZTU5MzksXG4gIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsIDB4OGViNDRhODcsIDB4Njg1ODE1MTEsIDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcsIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQsXG5dKTtcblxuLyoqIEluaXRpYWwgU0hBNTEyIHN0YXRlLiBCaXRzIDAuLjY0IG9mIGZyYWMgcGFydCBvZiBzcXJ0IG9mIHByaW1lcyAyLi4xOSAqL1xuZXhwb3J0IGNvbnN0IFNIQTUxMl9JVjogVWludDMyQXJyYXkgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgsIDB4YmI2N2FlODUsIDB4ODRjYWE3M2IsIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsIDB4YTU0ZmY1M2EsIDB4NWYxZDM2ZjEsXG4gIDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEsIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsIDB4MWY4M2Q5YWIsIDB4ZmI0MWJkNmIsIDB4NWJlMGNkMTksIDB4MTM3ZTIxNzksXG5dKTtcbiIsICIvKipcbiAqIFV0aWxpdGllcyBmb3IgaGV4LCBieXRlcywgQ1NQUk5HLlxuICogQG1vZHVsZVxuICovXG4vKiEgbm9ibGUtaGFzaGVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG4vKiogQ2hlY2tzIGlmIHNvbWV0aGluZyBpcyBVaW50OEFycmF5LiBCZSBjYXJlZnVsOiBub2RlanMgQnVmZmVyIHdpbGwgcmV0dXJuIHRydWUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCeXRlcyhhOiB1bmtub3duKTogYSBpcyBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGEgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgYS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnVWludDhBcnJheScpO1xufVxuXG4vKiogQXNzZXJ0cyBzb21ldGhpbmcgaXMgcG9zaXRpdmUgaW50ZWdlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbnVtYmVyKG46IG51bWJlciwgdGl0bGU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobikgfHwgbiA8IDApIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aXRsZSAmJiBgXCIke3RpdGxlfVwiIGA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3ByZWZpeH1leHBlY3RlZCBpbnRlZ2VyID49IDAsIGdvdCAke259YCk7XG4gIH1cbn1cblxuLyoqIEFzc2VydHMgc29tZXRoaW5nIGlzIFVpbnQ4QXJyYXkuICovXG5leHBvcnQgZnVuY3Rpb24gYWJ5dGVzKHZhbHVlOiBVaW50OEFycmF5LCBsZW5ndGg/OiBudW1iZXIsIHRpdGxlOiBzdHJpbmcgPSAnJyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBieXRlcyA9IGlzQnl0ZXModmFsdWUpO1xuICBjb25zdCBsZW4gPSB2YWx1ZT8ubGVuZ3RoO1xuICBjb25zdCBuZWVkc0xlbiA9IGxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICBpZiAoIWJ5dGVzIHx8IChuZWVkc0xlbiAmJiBsZW4gIT09IGxlbmd0aCkpIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aXRsZSAmJiBgXCIke3RpdGxlfVwiIGA7XG4gICAgY29uc3Qgb2ZMZW4gPSBuZWVkc0xlbiA/IGAgb2YgbGVuZ3RoICR7bGVuZ3RofWAgOiAnJztcbiAgICBjb25zdCBnb3QgPSBieXRlcyA/IGBsZW5ndGg9JHtsZW59YCA6IGB0eXBlPSR7dHlwZW9mIHZhbHVlfWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByZWZpeCArICdleHBlY3RlZCBVaW50OEFycmF5JyArIG9mTGVuICsgJywgZ290ICcgKyBnb3QpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIEFzc2VydHMgc29tZXRoaW5nIGlzIGhhc2ggKi9cbmV4cG9ydCBmdW5jdGlvbiBhaGFzaChoOiBDSGFzaCk6IHZvaWQge1xuICBpZiAodHlwZW9mIGggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGguY3JlYXRlICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignSGFzaCBtdXN0IHdyYXBwZWQgYnkgdXRpbHMuY3JlYXRlSGFzaGVyJyk7XG4gIGFudW1iZXIoaC5vdXRwdXRMZW4pO1xuICBhbnVtYmVyKGguYmxvY2tMZW4pO1xufVxuXG4vKiogQXNzZXJ0cyBhIGhhc2ggaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGRlc3Ryb3llZCAvIGZpbmlzaGVkICovXG5leHBvcnQgZnVuY3Rpb24gYWV4aXN0cyhpbnN0YW5jZTogYW55LCBjaGVja0ZpbmlzaGVkID0gdHJ1ZSk6IHZvaWQge1xuICBpZiAoaW5zdGFuY2UuZGVzdHJveWVkKSB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkJyk7XG4gIGlmIChjaGVja0ZpbmlzaGVkICYmIGluc3RhbmNlLmZpbmlzaGVkKSB0aHJvdyBuZXcgRXJyb3IoJ0hhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQnKTtcbn1cblxuLyoqIEFzc2VydHMgb3V0cHV0IGlzIHByb3Blcmx5LXNpemVkIGJ5dGUgYXJyYXkgKi9cbmV4cG9ydCBmdW5jdGlvbiBhb3V0cHV0KG91dDogYW55LCBpbnN0YW5jZTogYW55KTogdm9pZCB7XG4gIGFieXRlcyhvdXQsIHVuZGVmaW5lZCwgJ2RpZ2VzdEludG8oKSBvdXRwdXQnKTtcbiAgY29uc3QgbWluID0gaW5zdGFuY2Uub3V0cHV0TGVuO1xuICBpZiAob3V0Lmxlbmd0aCA8IG1pbikge1xuICAgIHRocm93IG5ldyBFcnJvcignXCJkaWdlc3RJbnRvKCkgb3V0cHV0XCIgZXhwZWN0ZWQgdG8gYmUgb2YgbGVuZ3RoID49JyArIG1pbik7XG4gIH1cbn1cblxuLyoqIEdlbmVyaWMgdHlwZSBlbmNvbXBhc3NpbmcgOC8xNi8zMi1ieXRlIGFycmF5cyAtIGJ1dCBub3QgNjQtYnl0ZS4gKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHR5cGUgVHlwZWRBcnJheSA9IEludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5IHwgVWludDhBcnJheSB8XG4gIFVpbnQxNkFycmF5IHwgSW50MTZBcnJheSB8IFVpbnQzMkFycmF5IHwgSW50MzJBcnJheTtcblxuLyoqIENhc3QgdTggLyB1MTYgLyB1MzIgdG8gdTguICovXG5leHBvcnQgZnVuY3Rpb24gdTgoYXJyOiBUeXBlZEFycmF5KTogVWludDhBcnJheSB7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgYXJyLmJ5dGVMZW5ndGgpO1xufVxuXG4vKiogQ2FzdCB1OCAvIHUxNiAvIHUzMiB0byB1MzIuICovXG5leHBvcnQgZnVuY3Rpb24gdTMyKGFycjogVHlwZWRBcnJheSk6IFVpbnQzMkFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgTWF0aC5mbG9vcihhcnIuYnl0ZUxlbmd0aCAvIDQpKTtcbn1cblxuLyoqIFplcm9pemUgYSBieXRlIGFycmF5LiBXYXJuaW5nOiBKUyBwcm92aWRlcyBubyBndWFyYW50ZWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuKC4uLmFycmF5czogVHlwZWRBcnJheVtdKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgYXJyYXlzW2ldLmZpbGwoMCk7XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBEYXRhVmlldyBvZiBhbiBhcnJheSBmb3IgZWFzeSBieXRlLWxldmVsIG1hbmlwdWxhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWaWV3KGFycjogVHlwZWRBcnJheSk6IERhdGFWaWV3IHtcbiAgcmV0dXJuIG5ldyBEYXRhVmlldyhhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgYXJyLmJ5dGVMZW5ndGgpO1xufVxuXG4vKiogVGhlIHJvdGF0ZSByaWdodCAoY2lyY3VsYXIgcmlnaHQgc2hpZnQpIG9wZXJhdGlvbiBmb3IgdWludDMyICovXG5leHBvcnQgZnVuY3Rpb24gcm90cih3b3JkOiBudW1iZXIsIHNoaWZ0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKHdvcmQgPDwgKDMyIC0gc2hpZnQpKSB8ICh3b3JkID4+PiBzaGlmdCk7XG59XG5cbi8qKiBUaGUgcm90YXRlIGxlZnQgKGNpcmN1bGFyIGxlZnQgc2hpZnQpIG9wZXJhdGlvbiBmb3IgdWludDMyICovXG5leHBvcnQgZnVuY3Rpb24gcm90bCh3b3JkOiBudW1iZXIsIHNoaWZ0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKHdvcmQgPDwgc2hpZnQpIHwgKCh3b3JkID4+PiAoMzIgLSBzaGlmdCkpID4+PiAwKTtcbn1cblxuLyoqIElzIGN1cnJlbnQgcGxhdGZvcm0gbGl0dGxlLWVuZGlhbj8gTW9zdCBhcmUuIEJpZy1FbmRpYW4gcGxhdGZvcm06IElCTSAqL1xuZXhwb3J0IGNvbnN0IGlzTEU6IGJvb2xlYW4gPSAvKiBAX19QVVJFX18gKi8gKCgpID0+XG4gIG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMHgxMTIyMzM0NF0pLmJ1ZmZlcilbMF0gPT09IDB4NDQpKCk7XG5cbi8qKiBUaGUgYnl0ZSBzd2FwIG9wZXJhdGlvbiBmb3IgdWludDMyICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZVN3YXAod29yZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChcbiAgICAoKHdvcmQgPDwgMjQpICYgMHhmZjAwMDAwMCkgfFxuICAgICgod29yZCA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgKCh3b3JkID4+PiA4KSAmIDB4ZmYwMCkgfFxuICAgICgod29yZCA+Pj4gMjQpICYgMHhmZilcbiAgKTtcbn1cbi8qKiBDb25kaXRpb25hbGx5IGJ5dGUgc3dhcCBpZiBvbiBhIGJpZy1lbmRpYW4gcGxhdGZvcm0gKi9cbmV4cG9ydCBjb25zdCBzd2FwOElmQkU6IChuOiBudW1iZXIpID0+IG51bWJlciA9IGlzTEVcbiAgPyAobjogbnVtYmVyKSA9PiBuXG4gIDogKG46IG51bWJlcikgPT4gYnl0ZVN3YXAobik7XG5cbi8qKiBJbiBwbGFjZSBieXRlIHN3YXAgZm9yIFVpbnQzMkFycmF5ICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZVN3YXAzMihhcnI6IFVpbnQzMkFycmF5KTogVWludDMyQXJyYXkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IGJ5dGVTd2FwKGFycltpXSk7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuZXhwb3J0IGNvbnN0IHN3YXAzMklmQkU6ICh1OiBVaW50MzJBcnJheSkgPT4gVWludDMyQXJyYXkgPSBpc0xFXG4gID8gKHU6IFVpbnQzMkFycmF5KSA9PiB1XG4gIDogYnl0ZVN3YXAzMjtcblxuLy8gQnVpbHQtaW4gaGV4IGNvbnZlcnNpb24gaHR0cHM6Ly9jYW5pdXNlLmNvbS9tZG4tamF2YXNjcmlwdF9idWlsdGluc191aW50OGFycmF5X2Zyb21oZXhcbmNvbnN0IGhhc0hleEJ1aWx0aW46IGJvb2xlYW4gPSAvKiBAX19QVVJFX18gKi8gKCgpID0+XG4gIC8vIEB0cy1pZ25vcmVcbiAgdHlwZW9mIFVpbnQ4QXJyYXkuZnJvbShbXSkudG9IZXggPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFVpbnQ4QXJyYXkuZnJvbUhleCA9PT0gJ2Z1bmN0aW9uJykoKTtcblxuLy8gQXJyYXkgd2hlcmUgaW5kZXggMHhmMCAoMjQwKSBpcyBtYXBwZWQgdG8gc3RyaW5nICdmMCdcbmNvbnN0IGhleGVzID0gLyogQF9fUFVSRV9fICovIEFycmF5LmZyb20oeyBsZW5ndGg6IDI1NiB9LCAoXywgaSkgPT5cbiAgaS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuKTtcblxuLyoqXG4gKiBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gaGV4IHN0cmluZy4gVXNlcyBidWlsdC1pbiBmdW5jdGlvbiwgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhhbXBsZSBieXRlc1RvSGV4KFVpbnQ4QXJyYXkuZnJvbShbMHhjYSwgMHhmZSwgMHgwMSwgMHgyM10pKSAvLyAnY2FmZTAxMjMnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvSGV4KGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgYWJ5dGVzKGJ5dGVzKTtcbiAgLy8gQHRzLWlnbm9yZVxuICBpZiAoaGFzSGV4QnVpbHRpbikgcmV0dXJuIGJ5dGVzLnRvSGV4KCk7XG4gIC8vIHByZS1jYWNoaW5nIGltcHJvdmVzIHRoZSBzcGVlZCA2eFxuICBsZXQgaGV4ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBoZXggKz0gaGV4ZXNbYnl0ZXNbaV1dO1xuICB9XG4gIHJldHVybiBoZXg7XG59XG5cbi8vIFdlIHVzZSBvcHRpbWl6ZWQgdGVjaG5pcXVlIHRvIGNvbnZlcnQgaGV4IHN0cmluZyB0byBieXRlIGFycmF5XG5jb25zdCBhc2NpaXMgPSB7IF8wOiA0OCwgXzk6IDU3LCBBOiA2NSwgRjogNzAsIGE6IDk3LCBmOiAxMDIgfSBhcyBjb25zdDtcbmZ1bmN0aW9uIGFzY2lpVG9CYXNlMTYoY2g6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChjaCA+PSBhc2NpaXMuXzAgJiYgY2ggPD0gYXNjaWlzLl85KSByZXR1cm4gY2ggLSBhc2NpaXMuXzA7IC8vICcyJyA9PiA1MC00OFxuICBpZiAoY2ggPj0gYXNjaWlzLkEgJiYgY2ggPD0gYXNjaWlzLkYpIHJldHVybiBjaCAtIChhc2NpaXMuQSAtIDEwKTsgLy8gJ0InID0+IDY2LSg2NS0xMClcbiAgaWYgKGNoID49IGFzY2lpcy5hICYmIGNoIDw9IGFzY2lpcy5mKSByZXR1cm4gY2ggLSAoYXNjaWlzLmEgLSAxMCk7IC8vICdiJyA9PiA5OC0oOTctMTApXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGhleCBzdHJpbmcgdG8gYnl0ZSBhcnJheS4gVXNlcyBidWlsdC1pbiBmdW5jdGlvbiwgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhhbXBsZSBoZXhUb0J5dGVzKCdjYWZlMDEyMycpIC8vIFVpbnQ4QXJyYXkuZnJvbShbMHhjYSwgMHhmZSwgMHgwMSwgMHgyM10pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb0J5dGVzKGhleDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGlmICh0eXBlb2YgaGV4ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgJyArIHR5cGVvZiBoZXgpO1xuICAvLyBAdHMtaWdub3JlXG4gIGlmIChoYXNIZXhCdWlsdGluKSByZXR1cm4gVWludDhBcnJheS5mcm9tSGV4KGhleCk7XG4gIGNvbnN0IGhsID0gaGV4Lmxlbmd0aDtcbiAgY29uc3QgYWwgPSBobCAvIDI7XG4gIGlmIChobCAlIDIpIHRocm93IG5ldyBFcnJvcignaGV4IHN0cmluZyBleHBlY3RlZCwgZ290IHVucGFkZGVkIGhleCBvZiBsZW5ndGggJyArIGhsKTtcbiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShhbCk7XG4gIGZvciAobGV0IGFpID0gMCwgaGkgPSAwOyBhaSA8IGFsOyBhaSsrLCBoaSArPSAyKSB7XG4gICAgY29uc3QgbjEgPSBhc2NpaVRvQmFzZTE2KGhleC5jaGFyQ29kZUF0KGhpKSk7XG4gICAgY29uc3QgbjIgPSBhc2NpaVRvQmFzZTE2KGhleC5jaGFyQ29kZUF0KGhpICsgMSkpO1xuICAgIGlmIChuMSA9PT0gdW5kZWZpbmVkIHx8IG4yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBoZXhbaGldICsgaGV4W2hpICsgMV07XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCBub24taGV4IGNoYXJhY3RlciBcIicgKyBjaGFyICsgJ1wiIGF0IGluZGV4ICcgKyBoaSk7XG4gICAgfVxuICAgIGFycmF5W2FpXSA9IG4xICogMTYgKyBuMjsgLy8gbXVsdGlwbHkgZmlyc3Qgb2N0ZXQsIGUuZy4gJ2EzJyA9PiAxMCoxNiszID0+IDE2MCArIDMgPT4gMTYzXG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFRoZXJlIGlzIG5vIHNldEltbWVkaWF0ZSBpbiBicm93c2VyIGFuZCBzZXRUaW1lb3V0IGlzIHNsb3cuXG4gKiBDYWxsIG9mIGFzeW5jIGZuIHdpbGwgcmV0dXJuIFByb21pc2UsIHdoaWNoIHdpbGwgYmUgZnVsbGZpbGVkIG9ubHkgb25cbiAqIG5leHQgc2NoZWR1bGVyIHF1ZXVlIHByb2Nlc3Npbmcgc3RlcCBhbmQgdGhpcyBpcyBleGFjdGx5IHdoYXQgd2UgbmVlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5leHRUaWNrID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge307XG5cbi8qKiBSZXR1cm5zIGNvbnRyb2wgdG8gdGhyZWFkIGVhY2ggJ3RpY2snIG1zIHRvIGF2b2lkIGJsb2NraW5nLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jTG9vcChcbiAgaXRlcnM6IG51bWJlcixcbiAgdGljazogbnVtYmVyLFxuICBjYjogKGk6IG51bWJlcikgPT4gdm9pZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCB0cyA9IERhdGUubm93KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcnM7IGkrKykge1xuICAgIGNiKGkpO1xuICAgIC8vIERhdGUubm93KCkgaXMgbm90IG1vbm90b25pYywgc28gaW4gY2FzZSBpZiBjbG9jayBnb2VzIGJhY2t3YXJkcyB3ZSByZXR1cm4gcmV0dXJuIGNvbnRyb2wgdG9vXG4gICAgY29uc3QgZGlmZiA9IERhdGUubm93KCkgLSB0cztcbiAgICBpZiAoZGlmZiA+PSAwICYmIGRpZmYgPCB0aWNrKSBjb250aW51ZTtcbiAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgIHRzICs9IGRpZmY7XG4gIH1cbn1cblxuLy8gR2xvYmFsIHN5bWJvbHMsIGJ1dCB0cyBkb2Vzbid0IHNlZSB0aGVtOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxNTM1XG5kZWNsYXJlIGNvbnN0IFRleHRFbmNvZGVyOiBhbnk7XG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIGJ5dGVzIHVzaW5nIFVURjggZW5jb2RpbmcuXG4gKiBCdWlsdC1pbiBkb2Vzbid0IHZhbGlkYXRlIGlucHV0IHRvIGJlIHN0cmluZzogd2UgZG8gdGhlIGNoZWNrLlxuICogQGV4YW1wbGUgdXRmOFRvQnl0ZXMoJ2FiYycpIC8vIFVpbnQ4QXJyYXkuZnJvbShbOTcsIDk4LCA5OV0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dGY4VG9CeXRlcyhzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGV4cGVjdGVkJyk7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKSk7IC8vIGh0dHBzOi8vYnVnemlsLmxhLzE2ODE4MDlcbn1cblxuLyoqIEtERnMgY2FuIGFjY2VwdCBzdHJpbmcgb3IgVWludDhBcnJheSBmb3IgdXNlciBjb252ZW5pZW5jZS4gKi9cbmV4cG9ydCB0eXBlIEtERklucHV0ID0gc3RyaW5nIHwgVWludDhBcnJheTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIEtERnM6IGNvbnN1bWVzIHVpbnQ4YXJyYXkgb3Igc3RyaW5nLlxuICogV2hlbiBzdHJpbmcgaXMgcGFzc2VkLCBkb2VzIHV0ZjggZGVjb2RpbmcsIHVzaW5nIFRleHREZWNvZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24ga2RmSW5wdXRUb0J5dGVzKGRhdGE6IEtERklucHV0LCBlcnJvclRpdGxlID0gJycpOiBVaW50OEFycmF5IHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgcmV0dXJuIHV0ZjhUb0J5dGVzKGRhdGEpO1xuICByZXR1cm4gYWJ5dGVzKGRhdGEsIHVuZGVmaW5lZCwgZXJyb3JUaXRsZSk7XG59XG5cbi8qKiBDb3BpZXMgc2V2ZXJhbCBVaW50OEFycmF5cyBpbnRvIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRCeXRlcyguLi5hcnJheXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXkge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhID0gYXJyYXlzW2ldO1xuICAgIGFieXRlcyhhKTtcbiAgICBzdW0gKz0gYS5sZW5ndGg7XG4gIH1cbiAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoc3VtKTtcbiAgZm9yIChsZXQgaSA9IDAsIHBhZCA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhID0gYXJyYXlzW2ldO1xuICAgIHJlcy5zZXQoYSwgcGFkKTtcbiAgICBwYWQgKz0gYS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudHlwZSBFbXB0eU9iaiA9IHt9O1xuLyoqIE1lcmdlcyBkZWZhdWx0IG9wdGlvbnMgYW5kIHBhc3NlZCBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrT3B0czxUMSBleHRlbmRzIEVtcHR5T2JqLCBUMiBleHRlbmRzIEVtcHR5T2JqPihcbiAgZGVmYXVsdHM6IFQxLFxuICBvcHRzPzogVDJcbik6IFQxICYgVDIge1xuICBpZiAob3B0cyAhPT0gdW5kZWZpbmVkICYmIHt9LnRvU3RyaW5nLmNhbGwob3B0cykgIT09ICdbb2JqZWN0IE9iamVjdF0nKVxuICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucyBtdXN0IGJlIG9iamVjdCBvciB1bmRlZmluZWQnKTtcbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbihkZWZhdWx0cywgb3B0cyk7XG4gIHJldHVybiBtZXJnZWQgYXMgVDEgJiBUMjtcbn1cblxuLyoqIENvbW1vbiBpbnRlcmZhY2UgZm9yIGFsbCBoYXNoZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc2g8VD4ge1xuICBibG9ja0xlbjogbnVtYmVyOyAvLyBCeXRlcyBwZXIgYmxvY2tcbiAgb3V0cHV0TGVuOiBudW1iZXI7IC8vIEJ5dGVzIGluIG91dHB1dFxuICB1cGRhdGUoYnVmOiBVaW50OEFycmF5KTogdGhpcztcbiAgZGlnZXN0SW50byhidWY6IFVpbnQ4QXJyYXkpOiB2b2lkO1xuICBkaWdlc3QoKTogVWludDhBcnJheTtcbiAgZGVzdHJveSgpOiB2b2lkO1xuICBfY2xvbmVJbnRvKHRvPzogVCk6IFQ7XG4gIGNsb25lKCk6IFQ7XG59XG5cbi8qKiBQc2V1ZG9SYW5kb20gKG51bWJlcikgR2VuZXJhdG9yICovXG5leHBvcnQgaW50ZXJmYWNlIFBSRyB7XG4gIGFkZEVudHJvcHkoc2VlZDogVWludDhBcnJheSk6IHZvaWQ7XG4gIHJhbmRvbUJ5dGVzKGxlbmd0aDogbnVtYmVyKTogVWludDhBcnJheTtcbiAgY2xlYW4oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBYT0Y6IHN0cmVhbWluZyBBUEkgdG8gcmVhZCBkaWdlc3QgaW4gY2h1bmtzLlxuICogU2FtZSBhcyAnc3F1ZWV6ZScgaW4ga2VjY2FrL2sxMiBhbmQgJ3NlZWsnIGluIGJsYWtlMywgYnV0IG1vcmUgZ2VuZXJpYyBuYW1lLlxuICogV2hlbiBoYXNoIHVzZWQgaW4gWE9GIG1vZGUgaXQgaXMgdXAgdG8gdXNlciB0byBjYWxsICcuZGVzdHJveScgYWZ0ZXJ3YXJkcywgc2luY2Ugd2UgY2Fubm90XG4gKiBkZXN0cm95IHN0YXRlLCBuZXh0IGNhbGwgY2FuIHJlcXVpcmUgbW9yZSBieXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgSGFzaFhPRjxUIGV4dGVuZHMgSGFzaDxUPj4gPSBIYXNoPFQ+ICYge1xuICB4b2YoYnl0ZXM6IG51bWJlcik6IFVpbnQ4QXJyYXk7IC8vIFJlYWQgJ2J5dGVzJyBieXRlcyBmcm9tIGRpZ2VzdCBzdHJlYW1cbiAgeG9mSW50byhidWY6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5OyAvLyByZWFkIGJ1Zi5sZW5ndGggYnl0ZXMgZnJvbSBkaWdlc3Qgc3RyZWFtIGludG8gYnVmXG59O1xuXG4vKiogSGFzaCBjb25zdHJ1Y3RvciAqL1xuZXhwb3J0IHR5cGUgSGFzaGVyQ29uczxULCBPcHRzID0gdW5kZWZpbmVkPiA9IE9wdHMgZXh0ZW5kcyB1bmRlZmluZWQgPyAoKSA9PiBUIDogKG9wdHM/OiBPcHRzKSA9PiBUO1xuLyoqIE9wdGlvbmFsIGhhc2ggcGFyYW1zLiAqL1xuZXhwb3J0IHR5cGUgSGFzaEluZm8gPSB7XG4gIG9pZD86IFVpbnQ4QXJyYXk7IC8vIERFUiBlbmNvZGVkIE9JRCBpbiBieXRlc1xufTtcbi8qKiBIYXNoIGZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBDSGFzaDxUIGV4dGVuZHMgSGFzaDxUPiA9IEhhc2g8YW55PiwgT3B0cyA9IHVuZGVmaW5lZD4gPSB7XG4gIG91dHB1dExlbjogbnVtYmVyO1xuICBibG9ja0xlbjogbnVtYmVyO1xufSAmIEhhc2hJbmZvICZcbiAgKE9wdHMgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHtcbiAgICAgICAgKG1zZzogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNyZWF0ZSgpOiBUO1xuICAgICAgfVxuICAgIDoge1xuICAgICAgICAobXNnOiBVaW50OEFycmF5LCBvcHRzPzogT3B0cyk6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNyZWF0ZShvcHRzPzogT3B0cyk6IFQ7XG4gICAgICB9KTtcbi8qKiBYT0Ygd2l0aCBvdXRwdXQgKi9cbmV4cG9ydCB0eXBlIENIYXNoWE9GPFQgZXh0ZW5kcyBIYXNoWE9GPFQ+ID0gSGFzaFhPRjxhbnk+LCBPcHRzID0gdW5kZWZpbmVkPiA9IENIYXNoPFQsIE9wdHM+O1xuXG4vKiogQ3JlYXRlcyBmdW5jdGlvbiB3aXRoIG91dHB1dExlbiwgYmxvY2tMZW4sIGNyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gYSBjbGFzcyBjb25zdHJ1Y3Rvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIYXNoZXI8VCBleHRlbmRzIEhhc2g8VD4sIE9wdHMgPSB1bmRlZmluZWQ+KFxuICBoYXNoQ29uczogSGFzaGVyQ29uczxULCBPcHRzPixcbiAgaW5mbzogSGFzaEluZm8gPSB7fVxuKTogQ0hhc2g8VCwgT3B0cz4ge1xuICBjb25zdCBoYXNoQzogYW55ID0gKG1zZzogVWludDhBcnJheSwgb3B0cz86IE9wdHMpID0+IGhhc2hDb25zKG9wdHMpLnVwZGF0ZShtc2cpLmRpZ2VzdCgpO1xuICBjb25zdCB0bXAgPSBoYXNoQ29ucyh1bmRlZmluZWQpO1xuICBoYXNoQy5vdXRwdXRMZW4gPSB0bXAub3V0cHV0TGVuO1xuICBoYXNoQy5ibG9ja0xlbiA9IHRtcC5ibG9ja0xlbjtcbiAgaGFzaEMuY3JlYXRlID0gKG9wdHM/OiBPcHRzKSA9PiBoYXNoQ29ucyhvcHRzKTtcbiAgT2JqZWN0LmFzc2lnbihoYXNoQywgaW5mbyk7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKGhhc2hDKTtcbn1cblxuLyoqIENyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBQUk5HLiBVc2VzIGludGVybmFsIE9TLWxldmVsIGBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21CeXRlcyhieXRlc0xlbmd0aCA9IDMyKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNyID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnID8gKGdsb2JhbFRoaXMgYXMgYW55KS5jcnlwdG8gOiBudWxsO1xuICBpZiAodHlwZW9mIGNyPy5nZXRSYW5kb21WYWx1ZXMgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzIG11c3QgYmUgZGVmaW5lZCcpO1xuICByZXR1cm4gY3IuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGJ5dGVzTGVuZ3RoKSk7XG59XG5cbi8qKiBDcmVhdGVzIE9JRCBvcHRzIGZvciBOSVNUIGhhc2hlcywgd2l0aCBwcmVmaXggMDYgMDkgNjAgODYgNDggMDEgNjUgMDMgMDQgMDIuICovXG5leHBvcnQgY29uc3Qgb2lkTmlzdCA9IChzdWZmaXg6IG51bWJlcik6IFJlcXVpcmVkPEhhc2hJbmZvPiA9PiAoe1xuICBvaWQ6IFVpbnQ4QXJyYXkuZnJvbShbMHgwNiwgMHgwOSwgMHg2MCwgMHg4NiwgMHg0OCwgMHgwMSwgMHg2NSwgMHgwMywgMHgwNCwgMHgwMiwgc3VmZml4XSksXG59KTtcbiIsICIvKipcbiAqIE1ldGhvZHMgZm9yIGVsbGlwdGljIGN1cnZlIG11bHRpcGxpY2F0aW9uIGJ5IHNjYWxhcnMuXG4gKiBDb250YWlucyB3TkFGLCBwaXBwZW5nZXIuXG4gKiBAbW9kdWxlXG4gKi9cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmltcG9ydCB7IGJpdExlbiwgYml0TWFzaywgdHlwZSBTaWduZXIgfSBmcm9tICcuLi91dGlscy50cyc7XG5pbXBvcnQgeyBGaWVsZCwgRnBJbnZlcnRCYXRjaCwgdmFsaWRhdGVGaWVsZCwgdHlwZSBJRmllbGQgfSBmcm9tICcuL21vZHVsYXIudHMnO1xuXG5jb25zdCBfMG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDApO1xuY29uc3QgXzFuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgxKTtcblxuZXhwb3J0IHR5cGUgQWZmaW5lUG9pbnQ8VD4gPSB7XG4gIHg6IFQ7XG4gIHk6IFQ7XG59ICYgeyBaPzogbmV2ZXIgfTtcblxuLy8gV2UgY2FuJ3QgXCJhYnN0cmFjdCBvdXRcIiBjb29yZGluYXRlcyAoWCwgWSwgWjsgYW5kIFQgaW4gRWR3YXJkcyk6IGFyZ3VtZW50IG5hbWVzIG9mIGNvbnN0cnVjdG9yXG4vLyBhcmUgbm90IGFjY2Vzc2libGUuIFNlZSBUeXBlc2NyaXB0IGdoLTU2MDkzLCBnaC00MTU5NC5cbi8vXG4vLyBXZSBoYXZlIHRvIHVzZSByZWN1cnNpdmUgdHlwZXMsIHNvIGl0IHdpbGwgcmV0dXJuIGFjdHVhbCBwb2ludCwgbm90IGNvbnN0YWluZWQgYEN1cnZlUG9pbnRgLlxuLy8gSWYsIGF0IGFueSBwb2ludCwgUCBpcyBgYW55YCwgaXQgd2lsbCBlcmFzZSBhbGwgdHlwZXMgYW5kIHJlcGxhY2UgaXRcbi8vIHdpdGggYGFueWAsIGJlY2F1c2Ugb2YgcmVjdXJzaW9uLCBgYW55IGltcGxlbWVudHMgQ3VydmVQb2ludGAsXG4vLyBidXQgd2UgbG9zZSBhbGwgY29uc3RyYWlucyBvbiBtZXRob2RzLlxuXG4vKiogQmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBlbGxpcHRpYyBjdXJ2ZSBQb2ludHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1cnZlUG9pbnQ8RiwgUCBleHRlbmRzIEN1cnZlUG9pbnQ8RiwgUD4+IHtcbiAgLyoqIEFmZmluZSB4IGNvb3JkaW5hdGUuIERpZmZlcmVudCBmcm9tIHByb2plY3RpdmUgLyBleHRlbmRlZCBYIGNvb3JkaW5hdGUuICovXG4gIHg6IEY7XG4gIC8qKiBBZmZpbmUgeSBjb29yZGluYXRlLiBEaWZmZXJlbnQgZnJvbSBwcm9qZWN0aXZlIC8gZXh0ZW5kZWQgWSBjb29yZGluYXRlLiAqL1xuICB5OiBGO1xuICBaPzogRjtcbiAgZG91YmxlKCk6IFA7XG4gIG5lZ2F0ZSgpOiBQO1xuICBhZGQob3RoZXI6IFApOiBQO1xuICBzdWJ0cmFjdChvdGhlcjogUCk6IFA7XG4gIGVxdWFscyhvdGhlcjogUCk6IGJvb2xlYW47XG4gIG11bHRpcGx5KHNjYWxhcjogYmlnaW50KTogUDtcbiAgYXNzZXJ0VmFsaWRpdHkoKTogdm9pZDtcbiAgY2xlYXJDb2ZhY3RvcigpOiBQO1xuICBpczAoKTogYm9vbGVhbjtcbiAgaXNUb3JzaW9uRnJlZSgpOiBib29sZWFuO1xuICBpc1NtYWxsT3JkZXIoKTogYm9vbGVhbjtcbiAgbXVsdGlwbHlVbnNhZmUoc2NhbGFyOiBiaWdpbnQpOiBQO1xuICAvKipcbiAgICogTWFzc2l2ZWx5IHNwZWVkcyB1cCBgcC5tdWx0aXBseShuKWAgYnkgdXNpbmcgcHJlY29tcHV0ZSB0YWJsZXMgKGNhY2hpbmcpLiBTZWUge0BsaW5rIHdOQUZ9LlxuICAgKiBAcGFyYW0gaXNMYXp5IGNhbGN1bGF0ZSBjYWNoZSBub3cuIERlZmF1bHQgKHRydWUpIGVuc3VyZXMgaXQncyBkZWZlcnJlZCB0byBmaXJzdCBgbXVsdGlwbHkoKWBcbiAgICovXG4gIHByZWNvbXB1dGUod2luZG93U2l6ZT86IG51bWJlciwgaXNMYXp5PzogYm9vbGVhbik6IFA7XG4gIC8qKiBDb252ZXJ0cyBwb2ludCB0byAyRCB4eSBhZmZpbmUgY29vcmRpbmF0ZXMgKi9cbiAgdG9BZmZpbmUoaW52ZXJ0ZWRaPzogRik6IEFmZmluZVBvaW50PEY+O1xuICB0b0J5dGVzKCk6IFVpbnQ4QXJyYXk7XG4gIHRvSGV4KCk6IHN0cmluZztcbn1cblxuLyoqIEJhc2UgaW50ZXJmYWNlIGZvciBhbGwgZWxsaXB0aWMgY3VydmUgUG9pbnQgY29uc3RydWN0b3JzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXJ2ZVBvaW50Q29uczxQIGV4dGVuZHMgQ3VydmVQb2ludDxhbnksIFA+PiB7XG4gIFtTeW1ib2wuaGFzSW5zdGFuY2VdOiAoaXRlbTogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgQkFTRTogUDtcbiAgWkVSTzogUDtcbiAgLyoqIEZpZWxkIGZvciBiYXNpYyBjdXJ2ZSBtYXRoICovXG4gIEZwOiBJRmllbGQ8UF9GPFA+PjtcbiAgLyoqIFNjYWxhciBmaWVsZCwgZm9yIHNjYWxhcnMgaW4gbXVsdGlwbHkgYW5kIG90aGVycyAqL1xuICBGbjogSUZpZWxkPGJpZ2ludD47XG4gIC8qKiBDcmVhdGVzIHBvaW50IGZyb20geCwgeS4gRG9lcyBOT1QgdmFsaWRhdGUgaWYgdGhlIHBvaW50IGlzIHZhbGlkLiBVc2UgYC5hc3NlcnRWYWxpZGl0eSgpYC4gKi9cbiAgZnJvbUFmZmluZShwOiBBZmZpbmVQb2ludDxQX0Y8UD4+KTogUDtcbiAgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5KTogUDtcbiAgZnJvbUhleChoZXg6IHN0cmluZyk6IFA7XG59XG5cbi8vIFR5cGUgaW5mZXJlbmNlIGhlbHBlcnM6IFBDIC0gUG9pbnRDb25zdHJ1Y3RvciwgUCAtIFBvaW50LCBGcCAtIEZpZWxkIGVsZW1lbnRcbi8vIFNob3J0IG5hbWVzLCBiZWNhdXNlIHdlIHVzZSB0aGVtIGEgbG90IGluIHJlc3VsdCB0eXBlczpcbi8vICogd2UgY2FuJ3QgZG8gJ1AgPSBHZXRDdXJ2ZVBvaW50PFBDPic6IHRoaXMgaXMgZGVmYXVsdCB2YWx1ZSBhbmQgZG9lc24ndCBjb25zdHJhaW4gYW55dGhpbmdcbi8vICogd2UgY2FuJ3QgZG8gJ3R5cGUgWCA9IEdldEN1cnZlUG9pbnQ8UEM+JzogaXQgd29uJ3QgYmUgYWNjZXNpYmxlIGZvciBhcmd1bWVudHMvcmV0dXJuIHR5cGVzXG4vLyAqIGBDdXJ2ZVBvaW50Q29uczxQIGV4dGVuZHMgQ3VydmVQb2ludDxhbnksIFA+PmAgY29uc3RyYWludHMgZnJvbSBpbnRlcmZhY2UgZGVmaW5pdGlvblxuLy8gICB3b24ndCBwcm9wYWdhdGUsIGlmIGBQQyBleHRlbmRzIEN1cnZlUG9pbnRDb25zPGFueT5gOiB0aGUgUCB3b3VsZCBiZSAnYW55Jywgd2hpY2ggaXMgaW5jb3JyZWN0XG4vLyAqIFBDIGNvdWxkIGJlIHN1cGVyIHNwZWNpZmljIHdpdGggc3VwZXIgc3BlY2lmaWMgUCwgd2hpY2ggaW1wbGVtZW50cyBDdXJ2ZVBvaW50PGFueSwgUD4uXG4vLyAgIHRoaXMgbWVhbnMgd2UgbmVlZCB0byBkbyBzdHVmZiBsaWtlXG4vLyAgIGBmdW5jdGlvbiB0ZXN0PFAgZXh0ZW5kcyBDdXJ2ZVBvaW50PGFueSwgUD4sIFBDIGV4dGVuZHMgQ3VydmVQb2ludENvbnM8UD4+KGBcbi8vICAgaWYgd2Ugd2FudCB0eXBlIHNhZmV0eSBhcm91bmQgUCwgb3RoZXJ3aXNlIFBDX1A8UEM+IHdpbGwgYmUgYW55XG5cbi8qKiBSZXR1cm5zIEZwIHR5cGUgZnJvbSBQb2ludCAoUF9GPFA+ID09IFAuRikgKi9cbmV4cG9ydCB0eXBlIFBfRjxQIGV4dGVuZHMgQ3VydmVQb2ludDxhbnksIFA+PiA9IFAgZXh0ZW5kcyBDdXJ2ZVBvaW50PGluZmVyIEYsIFA+ID8gRiA6IG5ldmVyO1xuLyoqIFJldHVybnMgRnAgdHlwZSBmcm9tIFBvaW50Q29ucyAoUENfRjxQQz4gPT0gUEMuUC5GKSAqL1xuZXhwb3J0IHR5cGUgUENfRjxQQyBleHRlbmRzIEN1cnZlUG9pbnRDb25zPEN1cnZlUG9pbnQ8YW55LCBhbnk+Pj4gPSBQQ1snRnAnXVsnWkVSTyddO1xuLyoqIFJldHVybnMgUG9pbnQgdHlwZSBmcm9tIFBvaW50Q29ucyAoUENfUDxQQz4gPT0gUEMuUCkgKi9cbmV4cG9ydCB0eXBlIFBDX1A8UEMgZXh0ZW5kcyBDdXJ2ZVBvaW50Q29uczxDdXJ2ZVBvaW50PGFueSwgYW55Pj4+ID0gUENbJ1pFUk8nXTtcblxuLy8gVWdseSBoYWNrIHRvIGdldCBwcm9wZXIgdHlwZSBpbmZlcmVuY2UsIGJlY2F1c2UgaW4gdHlwZXNjcmlwdCBmYWlscyB0byBpbmZlciByZXN1cnNpdmVseS5cbi8vIFRoZSBoYWNrIGFsbG93cyB0byBkbyB1cCB0byAxMCBjaGFpbmVkIG9wZXJhdGlvbnMgd2l0aG91dCBhcHBseWluZyB0eXBlIGVyYXN1cmUuXG4vL1xuLy8gVHlwZXMgd2hpY2ggd29uJ3Qgd29yazpcbi8vICogYEN1cnZlUG9pbnRDb25zPEN1cnZlUG9pbnQ8YW55LCBhbnk+PmAsIHdpbGwgcmV0dXJuIGBhbnlgIGFmdGVyIDEgb3BlcmF0aW9uXG4vLyAqIGBDdXJ2ZVBvaW50Q29uczxhbnk+OiBXZWllcnN0cmFzc1BvaW50Q29uczxiaWdpbnQ+IGV4dGVuZHMgQ3VydmVQb2ludENvbnM8YW55PiA9IGZhbHNlYFxuLy8gKiBgUCBleHRlbmRzIEN1cnZlUG9pbnQsIFBDIGV4dGVuZHMgQ3VydmVQb2ludENvbnM8UD5gXG4vLyAgICAgKiBJdCBjYW4ndCBpbmZlciBQIGZyb20gUEMgYWxvbmVcbi8vICAgICAqIFRvbyBtYW55IHJlbGF0aW9ucyBiZXR3ZWVuIEYsIFAgJiBQQ1xuLy8gICAgICogSXQgd2lsbCBpbmZlciBQL0YgaWYgYGFyZzogQ3VydmVQb2ludENvbnM8RiwgUD5gLCBidXQgd2lsbCBmYWlsIGlmIFBDIGlzIGdlbmVyaWNcbi8vICAgICAqIEl0IHdpbGwgd29yayBjb3JyZWN0bHkgaWYgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBhcmd1bWVudCBvZiB0eXBlIFBcbi8vICAgICAqIEJ1dCBnZW5lcmFsbHksIHdlIGRvbid0IHdhbnQgdG8gcGFyYW1ldHJpemUgYEN1cnZlUG9pbnRDb25zYCBvdmVyIGBGYDogaXQgd2lsbCBjb21wbGljYXRlXG4vLyAgICAgICB0eXBlcywgbWFraW5nIHRoZW0gdW4taW5mZXJhYmxlXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB0eXBlIFBDX0FOWSA9IEN1cnZlUG9pbnRDb25zPFxuICBDdXJ2ZVBvaW50PGFueSxcbiAgQ3VydmVQb2ludDxhbnksXG4gIEN1cnZlUG9pbnQ8YW55LFxuICBDdXJ2ZVBvaW50PGFueSxcbiAgQ3VydmVQb2ludDxhbnksXG4gIEN1cnZlUG9pbnQ8YW55LFxuICBDdXJ2ZVBvaW50PGFueSxcbiAgQ3VydmVQb2ludDxhbnksXG4gIEN1cnZlUG9pbnQ8YW55LFxuICBDdXJ2ZVBvaW50PGFueSwgYW55PlxuICA+Pj4+Pj4+Pj5cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VydmVMZW5ndGhzIHtcbiAgc2VjcmV0S2V5PzogbnVtYmVyO1xuICBwdWJsaWNLZXk/OiBudW1iZXI7XG4gIHB1YmxpY0tleVVuY29tcHJlc3NlZD86IG51bWJlcjtcbiAgcHVibGljS2V5SGFzUHJlZml4PzogYm9vbGVhbjtcbiAgc2lnbmF0dXJlPzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBNYXBwZXI8VD4gPSAoaTogVFtdKSA9PiBUW107XG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGVDdDxUIGV4dGVuZHMgeyBuZWdhdGU6ICgpID0+IFQgfT4oY29uZGl0aW9uOiBib29sZWFuLCBpdGVtOiBUKTogVCB7XG4gIGNvbnN0IG5lZyA9IGl0ZW0ubmVnYXRlKCk7XG4gIHJldHVybiBjb25kaXRpb24gPyBuZWcgOiBpdGVtO1xufVxuXG4vKipcbiAqIFRha2VzIGEgYnVuY2ggb2YgUHJvamVjdGl2ZSBQb2ludHMgYnV0IGV4ZWN1dGVzIG9ubHkgb25lXG4gKiBpbnZlcnNpb24gb24gYWxsIG9mIHRoZW0uIEludmVyc2lvbiBpcyB2ZXJ5IHNsb3cgb3BlcmF0aW9uLFxuICogc28gdGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBtYXNzaXZlbHkuXG4gKiBPcHRpbWl6YXRpb246IGNvbnZlcnRzIGEgbGlzdCBvZiBwcm9qZWN0aXZlIHBvaW50cyB0byBhIGxpc3Qgb2YgaWRlbnRpY2FsIHBvaW50cyB3aXRoIFo9MS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVo8UCBleHRlbmRzIEN1cnZlUG9pbnQ8YW55LCBQPiwgUEMgZXh0ZW5kcyBDdXJ2ZVBvaW50Q29uczxQPj4oXG4gIGM6IFBDLFxuICBwb2ludHM6IFBbXVxuKTogUFtdIHtcbiAgY29uc3QgaW52ZXJ0ZWRacyA9IEZwSW52ZXJ0QmF0Y2goXG4gICAgYy5GcCxcbiAgICBwb2ludHMubWFwKChwKSA9PiBwLlohKVxuICApO1xuICByZXR1cm4gcG9pbnRzLm1hcCgocCwgaSkgPT4gYy5mcm9tQWZmaW5lKHAudG9BZmZpbmUoaW52ZXJ0ZWRac1tpXSkpKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXKFc6IG51bWJlciwgYml0czogbnVtYmVyKSB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoVykgfHwgVyA8PSAwIHx8IFcgPiBiaXRzKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3aW5kb3cgc2l6ZSwgZXhwZWN0ZWQgWzEuLicgKyBiaXRzICsgJ10sIGdvdCBXPScgKyBXKTtcbn1cblxuLyoqIEludGVybmFsIHdOQUYgb3B0cyBmb3Igc3BlY2lmaWMgVyBhbmQgc2NhbGFyQml0cyAqL1xudHlwZSBXT3B0cyA9IHtcbiAgd2luZG93czogbnVtYmVyO1xuICB3aW5kb3dTaXplOiBudW1iZXI7XG4gIG1hc2s6IGJpZ2ludDtcbiAgbWF4TnVtYmVyOiBudW1iZXI7XG4gIHNoaWZ0Qnk6IGJpZ2ludDtcbn07XG5cbmZ1bmN0aW9uIGNhbGNXT3B0cyhXOiBudW1iZXIsIHNjYWxhckJpdHM6IG51bWJlcik6IFdPcHRzIHtcbiAgdmFsaWRhdGVXKFcsIHNjYWxhckJpdHMpO1xuICBjb25zdCB3aW5kb3dzID0gTWF0aC5jZWlsKHNjYWxhckJpdHMgLyBXKSArIDE7IC8vIFc9OCAzMy4gTm90IDMyLCBiZWNhdXNlIHdlIHNraXAgemVyb1xuICBjb25zdCB3aW5kb3dTaXplID0gMiAqKiAoVyAtIDEpOyAvLyBXPTggMTI4LiBOb3QgMjU2LCBiZWNhdXNlIHdlIHNraXAgemVyb1xuICBjb25zdCBtYXhOdW1iZXIgPSAyICoqIFc7IC8vIFc9OCAyNTZcbiAgY29uc3QgbWFzayA9IGJpdE1hc2soVyk7IC8vIFc9OCAyNTUgPT0gbWFzayAwYjExMTExMTExXG4gIGNvbnN0IHNoaWZ0QnkgPSBCaWdJbnQoVyk7IC8vIFc9OCA4XG4gIHJldHVybiB7IHdpbmRvd3MsIHdpbmRvd1NpemUsIG1hc2ssIG1heE51bWJlciwgc2hpZnRCeSB9O1xufVxuXG5mdW5jdGlvbiBjYWxjT2Zmc2V0cyhuOiBiaWdpbnQsIHdpbmRvdzogbnVtYmVyLCB3T3B0czogV09wdHMpIHtcbiAgY29uc3QgeyB3aW5kb3dTaXplLCBtYXNrLCBtYXhOdW1iZXIsIHNoaWZ0QnkgfSA9IHdPcHRzO1xuICBsZXQgd2JpdHMgPSBOdW1iZXIobiAmIG1hc2spOyAvLyBleHRyYWN0IFcgYml0cy5cbiAgbGV0IG5leHROID0gbiA+PiBzaGlmdEJ5OyAvLyBzaGlmdCBudW1iZXIgYnkgVyBiaXRzLlxuXG4gIC8vIFdoYXQgYWN0dWFsbHkgaGFwcGVucyBoZXJlOlxuICAvLyBjb25zdCBoaWdoZXN0Qml0ID0gTnVtYmVyKG1hc2sgXiAobWFzayA+PiAxbikpO1xuICAvLyBsZXQgd2JpdHMyID0gd2JpdHMgLSAxOyAvLyBza2lwIHplcm9cbiAgLy8gaWYgKHdiaXRzMiAmIGhpZ2hlc3RCaXQpIHsgd2JpdHMyIF49IE51bWJlcihtYXNrKTsgLy8gKH4pO1xuXG4gIC8vIHNwbGl0IGlmIGJpdHMgPiBtYXg6ICsyMjQgPT4gMjU2LTMyXG4gIGlmICh3Yml0cyA+IHdpbmRvd1NpemUpIHtcbiAgICAvLyB3ZSBza2lwIHplcm8sIHdoaWNoIG1lYW5zIGluc3RlYWQgb2YgYD49IHNpemUtMWAsIHdlIGRvIGA+IHNpemVgXG4gICAgd2JpdHMgLT0gbWF4TnVtYmVyOyAvLyAtMzIsIGNhbiBiZSBtYXhOdW1iZXIgLSB3Yml0cywgYnV0IHRoZW4gd2UgbmVlZCB0byBzZXQgaXNOZWcgaGVyZS5cbiAgICBuZXh0TiArPSBfMW47IC8vICsyNTYgKGNhcnJ5KVxuICB9XG4gIGNvbnN0IG9mZnNldFN0YXJ0ID0gd2luZG93ICogd2luZG93U2l6ZTtcbiAgY29uc3Qgb2Zmc2V0ID0gb2Zmc2V0U3RhcnQgKyBNYXRoLmFicyh3Yml0cykgLSAxOyAvLyAtMSBiZWNhdXNlIHdlIHNraXAgemVyb1xuICBjb25zdCBpc1plcm8gPSB3Yml0cyA9PT0gMDsgLy8gaXMgY3VycmVudCB3aW5kb3cgc2xpY2UgYSAwP1xuICBjb25zdCBpc05lZyA9IHdiaXRzIDwgMDsgLy8gaXMgY3VycmVudCB3aW5kb3cgc2xpY2UgbmVnYXRpdmU/XG4gIGNvbnN0IGlzTmVnRiA9IHdpbmRvdyAlIDIgIT09IDA7IC8vIGZha2UgcmFuZG9tIHN0YXRlbWVudCBmb3Igbm9pc2VcbiAgY29uc3Qgb2Zmc2V0RiA9IG9mZnNldFN0YXJ0OyAvLyBmYWtlIG9mZnNldCBmb3Igbm9pc2VcbiAgcmV0dXJuIHsgbmV4dE4sIG9mZnNldCwgaXNaZXJvLCBpc05lZywgaXNOZWdGLCBvZmZzZXRGIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTVNNUG9pbnRzKHBvaW50czogYW55W10sIGM6IGFueSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSkgdGhyb3cgbmV3IEVycm9yKCdhcnJheSBleHBlY3RlZCcpO1xuICBwb2ludHMuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgIGlmICghKHAgaW5zdGFuY2VvZiBjKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50IGF0IGluZGV4ICcgKyBpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU1TTVNjYWxhcnMoc2NhbGFyczogYW55W10sIGZpZWxkOiBhbnkpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjYWxhcnMpKSB0aHJvdyBuZXcgRXJyb3IoJ2FycmF5IG9mIHNjYWxhcnMgZXhwZWN0ZWQnKTtcbiAgc2NhbGFycy5mb3JFYWNoKChzLCBpKSA9PiB7XG4gICAgaWYgKCFmaWVsZC5pc1ZhbGlkKHMpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2NhbGFyIGF0IGluZGV4ICcgKyBpKTtcbiAgfSk7XG59XG5cbi8vIFNpbmNlIHBvaW50cyBpbiBkaWZmZXJlbnQgZ3JvdXBzIGNhbm5vdCBiZSBlcXVhbCAoZGlmZmVyZW50IG9iamVjdCBjb25zdHJ1Y3RvciksXG4vLyB3ZSBjYW4gaGF2ZSBzaW5nbGUgcGxhY2UgdG8gc3RvcmUgcHJlY29tcHV0ZXMuXG4vLyBBbGxvd3MgdG8gbWFrZSBwb2ludHMgZnJvemVuIC8gaW1tdXRhYmxlLlxuY29uc3QgcG9pbnRQcmVjb21wdXRlcyA9IG5ldyBXZWFrTWFwPGFueSwgYW55W10+KCk7XG5jb25zdCBwb2ludFdpbmRvd1NpemVzID0gbmV3IFdlYWtNYXA8YW55LCBudW1iZXI+KCk7XG5cbmZ1bmN0aW9uIGdldFcoUDogYW55KTogbnVtYmVyIHtcbiAgLy8gVG8gZGlzYWJsZSBwcmVjb21wdXRlczpcbiAgLy8gcmV0dXJuIDE7XG4gIHJldHVybiBwb2ludFdpbmRvd1NpemVzLmdldChQKSB8fCAxO1xufVxuXG5mdW5jdGlvbiBhc3NlcnQwKG46IGJpZ2ludCk6IHZvaWQge1xuICBpZiAobiAhPT0gXzBuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd05BRicpO1xufVxuXG4vKipcbiAqIEVsbGlwdGljIGN1cnZlIG11bHRpcGxpY2F0aW9uIG9mIFBvaW50IGJ5IHNjYWxhci4gRnJhZ2lsZS5cbiAqIFRhYmxlIGdlbmVyYXRpb24gdGFrZXMgKiozME1CIG9mIHJhbSBhbmQgMTBtcyBvbiBoaWdoLWVuZCBDUFUqKixcbiAqIGJ1dCBtYXkgdGFrZSBtdWNoIGxvbmdlciBvbiBzbG93IGRldmljZXMuIEFjdHVhbCBnZW5lcmF0aW9uIHdpbGwgaGFwcGVuIG9uXG4gKiBmaXJzdCBjYWxsIG9mIGBtdWx0aXBseSgpYC4gQnkgZGVmYXVsdCwgYEJBU0VgIHBvaW50IGlzIHByZWNvbXB1dGVkLlxuICpcbiAqIFNjYWxhcnMgc2hvdWxkIGFsd2F5cyBiZSBsZXNzIHRoYW4gY3VydmUgb3JkZXI6IHRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgaW5zaWRlIG9mIGEgY3VydmUgaXRzZWxmLlxuICogQ3JlYXRlcyBwcmVjb21wdXRhdGlvbiB0YWJsZXMgZm9yIGZhc3QgbXVsdGlwbGljYXRpb246XG4gKiAtIHByaXZhdGUgc2NhbGFyIGlzIHNwbGl0IGJ5IGZpeGVkIHNpemUgd2luZG93cyBvZiBXIGJpdHNcbiAqIC0gZXZlcnkgd2luZG93IHBvaW50IGlzIGNvbGxlY3RlZCBmcm9tIHdpbmRvdydzIHRhYmxlICYgYWRkZWQgdG8gYWNjdW11bGF0b3JcbiAqIC0gc2luY2Ugd2luZG93cyBhcmUgZGlmZmVyZW50LCBzYW1lIHBvaW50IGluc2lkZSB0YWJsZXMgd29uJ3QgYmUgYWNjZXNzZWQgbW9yZSB0aGFuIG9uY2UgcGVyIGNhbGNcbiAqIC0gZWFjaCBtdWx0aXBsaWNhdGlvbiBpcyAnTWF0aC5jZWlsKENVUlZFX09SREVSIC8gXHVEODM1XHVEQzRBKSArIDEnIHBvaW50IGFkZGl0aW9ucyAoZml4ZWQgZm9yIGFueSBzY2FsYXIpXG4gKiAtICsxIHdpbmRvdyBpcyBuZWNjZXNzYXJ5IGZvciB3TkFGXG4gKiAtIHdOQUYgcmVkdWNlcyB0YWJsZSBzaXplOiAyeCBsZXNzIG1lbW9yeSArIDJ4IGZhc3RlciBnZW5lcmF0aW9uLCBidXQgMTAlIHNsb3dlciBtdWx0aXBsaWNhdGlvblxuICpcbiAqIEB0b2RvIFJlc2VhcmNoIHJldHVybmluZyAyZCBKUyBhcnJheSBvZiB3aW5kb3dzLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIHdpbmRvdy5cbiAqIFRoaXMgd291bGQgYWxsb3cgd2luZG93cyB0byBiZSBpbiBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3Mgd05BRjxQQyBleHRlbmRzIFBDX0FOWT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IEJBU0U6IFBDX1A8UEM+O1xuICBwcml2YXRlIHJlYWRvbmx5IFpFUk86IFBDX1A8UEM+O1xuICBwcml2YXRlIHJlYWRvbmx5IEZuOiBQQ1snRm4nXTtcbiAgcmVhZG9ubHkgYml0czogbnVtYmVyO1xuXG4gIC8vIFBhcmFtZXRyaXplZCB3aXRoIGEgZ2l2ZW4gUG9pbnQgY2xhc3MgKG5vdCBpbmRpdmlkdWFsIHBvaW50KVxuICBjb25zdHJ1Y3RvcihQb2ludDogUEMsIGJpdHM6IG51bWJlcikge1xuICAgIHRoaXMuQkFTRSA9IFBvaW50LkJBU0U7XG4gICAgdGhpcy5aRVJPID0gUG9pbnQuWkVSTztcbiAgICB0aGlzLkZuID0gUG9pbnQuRm47XG4gICAgdGhpcy5iaXRzID0gYml0cztcbiAgfVxuXG4gIC8vIG5vbi1jb25zdCB0aW1lIG11bHRpcGxpY2F0aW9uIGxhZGRlclxuICBfdW5zYWZlTGFkZGVyKGVsbTogUENfUDxQQz4sIG46IGJpZ2ludCwgcDogUENfUDxQQz4gPSB0aGlzLlpFUk8pOiBQQ19QPFBDPiB7XG4gICAgbGV0IGQ6IFBDX1A8UEM+ID0gZWxtO1xuICAgIHdoaWxlIChuID4gXzBuKSB7XG4gICAgICBpZiAobiAmIF8xbikgcCA9IHAuYWRkKGQpO1xuICAgICAgZCA9IGQuZG91YmxlKCk7XG4gICAgICBuID4+PSBfMW47XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB3TkFGIHByZWNvbXB1dGF0aW9uIHdpbmRvdy4gVXNlZCBmb3IgY2FjaGluZy5cbiAgICogRGVmYXVsdCB3aW5kb3cgc2l6ZSBpcyBzZXQgYnkgYHV0aWxzLnByZWNvbXB1dGUoKWAgYW5kIGlzIGVxdWFsIHRvIDguXG4gICAqIE51bWJlciBvZiBwcmVjb21wdXRlZCBwb2ludHMgZGVwZW5kcyBvbiB0aGUgY3VydmUgc2l6ZTpcbiAgICogMl4oXHVEODM1XHVEQzRBXHUyMjEyMSkgKiAoTWF0aC5jZWlsKFx1RDgzNVx1REM1QiAvIFx1RDgzNVx1REM0QSkgKyAxKSwgd2hlcmU6XG4gICAqIC0gXHVEODM1XHVEQzRBIGlzIHRoZSB3aW5kb3cgc2l6ZVxuICAgKiAtIFx1RDgzNVx1REM1QiBpcyB0aGUgYml0bGVuZ3RoIG9mIHRoZSBjdXJ2ZSBvcmRlci5cbiAgICogRm9yIGEgMjU2LWJpdCBjdXJ2ZSBhbmQgd2luZG93IHNpemUgOCwgdGhlIG51bWJlciBvZiBwcmVjb21wdXRlZCBwb2ludHMgaXMgMTI4ICogMzMgPSA0MjI0LlxuICAgKiBAcGFyYW0gcG9pbnQgUG9pbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIFcgd2luZG93IHNpemVcbiAgICogQHJldHVybnMgcHJlY29tcHV0ZWQgcG9pbnQgdGFibGVzIGZsYXR0ZW5lZCB0byBhIHNpbmdsZSBhcnJheVxuICAgKi9cbiAgcHJpdmF0ZSBwcmVjb21wdXRlV2luZG93KHBvaW50OiBQQ19QPFBDPiwgVzogbnVtYmVyKTogUENfUDxQQz5bXSB7XG4gICAgY29uc3QgeyB3aW5kb3dzLCB3aW5kb3dTaXplIH0gPSBjYWxjV09wdHMoVywgdGhpcy5iaXRzKTtcbiAgICBjb25zdCBwb2ludHM6IFBDX1A8UEM+W10gPSBbXTtcbiAgICBsZXQgcDogUENfUDxQQz4gPSBwb2ludDtcbiAgICBsZXQgYmFzZSA9IHA7XG4gICAgZm9yIChsZXQgd2luZG93ID0gMDsgd2luZG93IDwgd2luZG93czsgd2luZG93KyspIHtcbiAgICAgIGJhc2UgPSBwO1xuICAgICAgcG9pbnRzLnB1c2goYmFzZSk7XG4gICAgICAvLyBpPTEsIGJjIHdlIHNraXAgMFxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB3aW5kb3dTaXplOyBpKyspIHtcbiAgICAgICAgYmFzZSA9IGJhc2UuYWRkKHApO1xuICAgICAgICBwb2ludHMucHVzaChiYXNlKTtcbiAgICAgIH1cbiAgICAgIHAgPSBiYXNlLmRvdWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgZWMgbXVsdGlwbGljYXRpb24gdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGFuZCB3LWFyeSBub24tYWRqYWNlbnQgZm9ybS5cbiAgICogTW9yZSBjb21wYWN0IGltcGxlbWVudGF0aW9uOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL25vYmxlLXNlY3AyNTZrMS9ibG9iLzQ3Y2IxNjY5YjZlNTA2YWQ2NmIzNWZlN2Q3NjEzMmFlOTc0NjVkYTIvaW5kZXgudHMjTDUwMi1MNTQxXG4gICAqIEByZXR1cm5zIHJlYWwgYW5kIGZha2UgKGZvciBjb25zdC10aW1lKSBwb2ludHNcbiAgICovXG4gIHByaXZhdGUgd05BRihXOiBudW1iZXIsIHByZWNvbXB1dGVzOiBQQ19QPFBDPltdLCBuOiBiaWdpbnQpOiB7IHA6IFBDX1A8UEM+OyBmOiBQQ19QPFBDPiB9IHtcbiAgICAvLyBTY2FsYXIgc2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBmaWVsZCBvcmRlclxuICAgIGlmICghdGhpcy5Gbi5pc1ZhbGlkKG4pKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2NhbGFyJyk7XG4gICAgLy8gQWNjdW11bGF0b3JzXG4gICAgbGV0IHAgPSB0aGlzLlpFUk87XG4gICAgbGV0IGYgPSB0aGlzLkJBU0U7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBmaXJzdCB3cml0dGVuIHdpdGggYXNzdW1wdGlvbiB0aGF0ICdmJyBhbmQgJ3AnIHdpbGwgbmV2ZXIgYmUgaW5maW5pdHkgcG9pbnQ6XG4gICAgLy8gc2luY2UgZWFjaCBhZGRpdGlvbiBpcyBtdWx0aXBsaWVkIGJ5IDIgKiogVywgaXQgY2Fubm90IGNhbmNlbCBlYWNoIG90aGVyLiBIb3dldmVyLFxuICAgIC8vIHRoZXJlIGlzIG5lZ2F0ZSBub3c6IGl0IGlzIHBvc3NpYmxlIHRoYXQgbmVnYXRlZCBlbGVtZW50IGZyb20gbG93IHZhbHVlXG4gICAgLy8gd291bGQgYmUgdGhlIHNhbWUgYXMgaGlnaCBlbGVtZW50LCB3aGljaCB3aWxsIGNyZWF0ZSBjYXJyeSBpbnRvIG5leHQgd2luZG93LlxuICAgIC8vIEl0J3Mgbm90IG9idmlvdXMgaG93IHRoaXMgY2FuIGZhaWwsIGJ1dCBzdGlsbCB3b3J0aCBpbnZlc3RpZ2F0aW5nIGxhdGVyLlxuICAgIGNvbnN0IHdvID0gY2FsY1dPcHRzKFcsIHRoaXMuYml0cyk7XG4gICAgZm9yIChsZXQgd2luZG93ID0gMDsgd2luZG93IDwgd28ud2luZG93czsgd2luZG93KyspIHtcbiAgICAgIC8vIChuID09PSBfMG4pIGlzIGhhbmRsZWQgYW5kIG5vdCBlYXJseS1leGl0ZWQuIGlzRXZlbiBhbmQgb2Zmc2V0RiBhcmUgdXNlZCBmb3Igbm9pc2VcbiAgICAgIGNvbnN0IHsgbmV4dE4sIG9mZnNldCwgaXNaZXJvLCBpc05lZywgaXNOZWdGLCBvZmZzZXRGIH0gPSBjYWxjT2Zmc2V0cyhuLCB3aW5kb3csIHdvKTtcbiAgICAgIG4gPSBuZXh0TjtcbiAgICAgIGlmIChpc1plcm8pIHtcbiAgICAgICAgLy8gYml0cyBhcmUgMDogYWRkIGdhcmJhZ2UgdG8gZmFrZSBwb2ludFxuICAgICAgICAvLyBJbXBvcnRhbnQgcGFydCBmb3IgY29uc3QtdGltZSBnZXRQdWJsaWNLZXk6IGFkZCByYW5kb20gXCJub2lzZVwiIHBvaW50IHRvIGYuXG4gICAgICAgIGYgPSBmLmFkZChuZWdhdGVDdChpc05lZ0YsIHByZWNvbXB1dGVzW29mZnNldEZdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBiaXRzIGFyZSAxOiBhZGQgdG8gcmVzdWx0IHBvaW50XG4gICAgICAgIHAgPSBwLmFkZChuZWdhdGVDdChpc05lZywgcHJlY29tcHV0ZXNbb2Zmc2V0XSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnQwKG4pO1xuICAgIC8vIFJldHVybiBib3RoIHJlYWwgYW5kIGZha2UgcG9pbnRzOiBKSVQgd29uJ3QgZWxpbWluYXRlIGYuXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGVyZSBpcyBhIHdheSB0byBGIGJlIGluZmluaXR5LXBvaW50IGV2ZW4gaWYgcCBpcyBub3QsXG4gICAgLy8gd2hpY2ggbWFrZXMgaXQgbGVzcyBjb25zdC10aW1lOiBhcm91bmQgMSBiaWdpbnQgbXVsdGlwbHkuXG4gICAgcmV0dXJuIHsgcCwgZiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgZWMgdW5zYWZlIChub24gY29uc3QtdGltZSkgbXVsdGlwbGljYXRpb24gdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGFuZCB3LWFyeSBub24tYWRqYWNlbnQgZm9ybS5cbiAgICogQHBhcmFtIGFjYyBhY2N1bXVsYXRvciBwb2ludCB0byBhZGQgcmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uXG4gICAqIEByZXR1cm5zIHBvaW50XG4gICAqL1xuICBwcml2YXRlIHdOQUZVbnNhZmUoXG4gICAgVzogbnVtYmVyLFxuICAgIHByZWNvbXB1dGVzOiBQQ19QPFBDPltdLFxuICAgIG46IGJpZ2ludCxcbiAgICBhY2M6IFBDX1A8UEM+ID0gdGhpcy5aRVJPXG4gICk6IFBDX1A8UEM+IHtcbiAgICBjb25zdCB3byA9IGNhbGNXT3B0cyhXLCB0aGlzLmJpdHMpO1xuICAgIGZvciAobGV0IHdpbmRvdyA9IDA7IHdpbmRvdyA8IHdvLndpbmRvd3M7IHdpbmRvdysrKSB7XG4gICAgICBpZiAobiA9PT0gXzBuKSBicmVhazsgLy8gRWFybHktZXhpdCwgc2tpcCAwIHZhbHVlXG4gICAgICBjb25zdCB7IG5leHROLCBvZmZzZXQsIGlzWmVybywgaXNOZWcgfSA9IGNhbGNPZmZzZXRzKG4sIHdpbmRvdywgd28pO1xuICAgICAgbiA9IG5leHROO1xuICAgICAgaWYgKGlzWmVybykge1xuICAgICAgICAvLyBXaW5kb3cgYml0cyBhcmUgMDogc2tpcCBwcm9jZXNzaW5nLlxuICAgICAgICAvLyBNb3ZlIHRvIG5leHQgd2luZG93LlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBwcmVjb21wdXRlc1tvZmZzZXRdO1xuICAgICAgICBhY2MgPSBhY2MuYWRkKGlzTmVnID8gaXRlbS5uZWdhdGUoKSA6IGl0ZW0pOyAvLyBSZS11c2luZyBhY2MgYWxsb3dzIHRvIHNhdmUgYWRkcyBpbiBNU01cbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0MChuKTtcbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVjb21wdXRlcyhXOiBudW1iZXIsIHBvaW50OiBQQ19QPFBDPiwgdHJhbnNmb3JtPzogTWFwcGVyPFBDX1A8UEM+Pik6IFBDX1A8UEM+W10ge1xuICAgIC8vIENhbGN1bGF0ZSBwcmVjb21wdXRlcyBvbiBhIGZpcnN0IHJ1biwgcmV1c2UgdGhlbSBhZnRlclxuICAgIGxldCBjb21wID0gcG9pbnRQcmVjb21wdXRlcy5nZXQocG9pbnQpO1xuICAgIGlmICghY29tcCkge1xuICAgICAgY29tcCA9IHRoaXMucHJlY29tcHV0ZVdpbmRvdyhwb2ludCwgVykgYXMgUENfUDxQQz5bXTtcbiAgICAgIGlmIChXICE9PSAxKSB7XG4gICAgICAgIC8vIERvaW5nIHRyYW5zZm9ybSBvdXRzaWRlIG9mIGlmIGJyaW5ncyAxNSUgcGVyZiBoaXRcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIGNvbXAgPSB0cmFuc2Zvcm0oY29tcCk7XG4gICAgICAgIHBvaW50UHJlY29tcHV0ZXMuc2V0KHBvaW50LCBjb21wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG4gIH1cblxuICBjYWNoZWQoXG4gICAgcG9pbnQ6IFBDX1A8UEM+LFxuICAgIHNjYWxhcjogYmlnaW50LFxuICAgIHRyYW5zZm9ybT86IE1hcHBlcjxQQ19QPFBDPj5cbiAgKTogeyBwOiBQQ19QPFBDPjsgZjogUENfUDxQQz4gfSB7XG4gICAgY29uc3QgVyA9IGdldFcocG9pbnQpO1xuICAgIHJldHVybiB0aGlzLndOQUYoVywgdGhpcy5nZXRQcmVjb21wdXRlcyhXLCBwb2ludCwgdHJhbnNmb3JtKSwgc2NhbGFyKTtcbiAgfVxuXG4gIHVuc2FmZShwb2ludDogUENfUDxQQz4sIHNjYWxhcjogYmlnaW50LCB0cmFuc2Zvcm0/OiBNYXBwZXI8UENfUDxQQz4+LCBwcmV2PzogUENfUDxQQz4pOiBQQ19QPFBDPiB7XG4gICAgY29uc3QgVyA9IGdldFcocG9pbnQpO1xuICAgIGlmIChXID09PSAxKSByZXR1cm4gdGhpcy5fdW5zYWZlTGFkZGVyKHBvaW50LCBzY2FsYXIsIHByZXYpOyAvLyBGb3IgVz0xIGxhZGRlciBpcyB+eDIgZmFzdGVyXG4gICAgcmV0dXJuIHRoaXMud05BRlVuc2FmZShXLCB0aGlzLmdldFByZWNvbXB1dGVzKFcsIHBvaW50LCB0cmFuc2Zvcm0pLCBzY2FsYXIsIHByZXYpO1xuICB9XG5cbiAgLy8gV2UgY2FsY3VsYXRlIHByZWNvbXB1dGVzIGZvciBlbGxpcHRpYyBjdXJ2ZSBwb2ludCBtdWx0aXBsaWNhdGlvblxuICAvLyB1c2luZyB3aW5kb3dlZCBtZXRob2QuIFRoaXMgc3BlY2lmaWVzIHdpbmRvdyBzaXplIGFuZFxuICAvLyBzdG9yZXMgcHJlY29tcHV0ZWQgdmFsdWVzLiBVc3VhbGx5IG9ubHkgYmFzZSBwb2ludCB3b3VsZCBiZSBwcmVjb21wdXRlZC5cbiAgY3JlYXRlQ2FjaGUoUDogUENfUDxQQz4sIFc6IG51bWJlcik6IHZvaWQge1xuICAgIHZhbGlkYXRlVyhXLCB0aGlzLmJpdHMpO1xuICAgIHBvaW50V2luZG93U2l6ZXMuc2V0KFAsIFcpO1xuICAgIHBvaW50UHJlY29tcHV0ZXMuZGVsZXRlKFApO1xuICB9XG5cbiAgaGFzQ2FjaGUoZWxtOiBQQ19QPFBDPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRXKGVsbSkgIT09IDE7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmRvbW9ycGhpc20tc3BlY2lmaWMgbXVsdGlwbGljYXRpb24gZm9yIEtvYmxpdHogY3VydmVzLlxuICogQ29zdDogMTI4IGRibCwgMC0yNTYgYWRkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bEVuZG9VbnNhZmU8UCBleHRlbmRzIEN1cnZlUG9pbnQ8YW55LCBQPiwgUEMgZXh0ZW5kcyBDdXJ2ZVBvaW50Q29uczxQPj4oXG4gIFBvaW50OiBQQyxcbiAgcG9pbnQ6IFAsXG4gIGsxOiBiaWdpbnQsXG4gIGsyOiBiaWdpbnRcbik6IHsgcDE6IFA7IHAyOiBQIH0ge1xuICBsZXQgYWNjID0gcG9pbnQ7XG4gIGxldCBwMSA9IFBvaW50LlpFUk87XG4gIGxldCBwMiA9IFBvaW50LlpFUk87XG4gIHdoaWxlIChrMSA+IF8wbiB8fCBrMiA+IF8wbikge1xuICAgIGlmIChrMSAmIF8xbikgcDEgPSBwMS5hZGQoYWNjKTtcbiAgICBpZiAoazIgJiBfMW4pIHAyID0gcDIuYWRkKGFjYyk7XG4gICAgYWNjID0gYWNjLmRvdWJsZSgpO1xuICAgIGsxID4+PSBfMW47XG4gICAgazIgPj49IF8xbjtcbiAgfVxuICByZXR1cm4geyBwMSwgcDIgfTtcbn1cblxuLyoqXG4gKiBQaXBwZW5nZXIgYWxnb3JpdGhtIGZvciBtdWx0aS1zY2FsYXIgbXVsdGlwbGljYXRpb24gKE1TTSwgUGEgKyBRYiArIFJjICsgLi4uKS5cbiAqIDMweCBmYXN0ZXIgdnMgbmFpdmUgYWRkaXRpb24gb24gTD00MDk2LCAxMHggZmFzdGVyIHRoYW4gcHJlY29tcHV0ZXMuXG4gKiBGb3IgTj0yNTRiaXQsIEw9MSwgaXQgZG9lczogMTAyNCBBREQgKyAyNTQgREJMLiBGb3IgTD01OiAxNTM2IEFERCArIDI1NCBEQkwuXG4gKiBBbGdvcml0aG1pY2FsbHkgY29uc3RhbnQtdGltZSAoZm9yIHNhbWUgTCksIGV2ZW4gd2hlbiAxIHBvaW50ICsgc2NhbGFyLCBvciB3aGVuIHNjYWxhciA9IDAuXG4gKiBAcGFyYW0gYyBDdXJ2ZSBQb2ludCBjb25zdHJ1Y3RvclxuICogQHBhcmFtIGZpZWxkTiBmaWVsZCBvdmVyIENVUlZFLk4gLSBpbXBvcnRhbnQgdGhhdCBpdCdzIG5vdCBvdmVyIENVUlZFLlBcbiAqIEBwYXJhbSBwb2ludHMgYXJyYXkgb2YgTCBjdXJ2ZSBwb2ludHNcbiAqIEBwYXJhbSBzY2FsYXJzIGFycmF5IG9mIEwgc2NhbGFycyAoYWthIHNlY3JldCBrZXlzIC8gYmlnaW50cylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpcHBlbmdlcjxQIGV4dGVuZHMgQ3VydmVQb2ludDxhbnksIFA+LCBQQyBleHRlbmRzIEN1cnZlUG9pbnRDb25zPFA+PihcbiAgYzogUEMsXG4gIHBvaW50czogUFtdLFxuICBzY2FsYXJzOiBiaWdpbnRbXVxuKTogUCB7XG4gIC8vIElmIHdlIHNwbGl0IHNjYWxhcnMgYnkgc29tZSB3aW5kb3cgKGxldCdzIHNheSA4IGJpdHMpLCBldmVyeSBjaHVuayB3aWxsIG9ubHlcbiAgLy8gdGFrZSAyNTYgYnVja2V0cyBldmVuIGlmIHRoZXJlIGFyZSA0MDk2IHNjYWxhcnMsIGFsc28gcmUtdXNlcyBkb3VibGUuXG4gIC8vIFRPRE86XG4gIC8vIC0gaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAyNC83NTAucGRmXG4gIC8vIC0gaHR0cHM6Ly90Y2hlcy5pYWNyLm9yZy9pbmRleC5waHAvVENIRVMvYXJ0aWNsZS92aWV3LzEwMjg3XG4gIC8vIDAgaXMgYWNjZXB0ZWQgaW4gc2NhbGFyc1xuICBjb25zdCBmaWVsZE4gPSBjLkZuO1xuICB2YWxpZGF0ZU1TTVBvaW50cyhwb2ludHMsIGMpO1xuICB2YWxpZGF0ZU1TTVNjYWxhcnMoc2NhbGFycywgZmllbGROKTtcbiAgY29uc3QgcGxlbmd0aCA9IHBvaW50cy5sZW5ndGg7XG4gIGNvbnN0IHNsZW5ndGggPSBzY2FsYXJzLmxlbmd0aDtcbiAgaWYgKHBsZW5ndGggIT09IHNsZW5ndGgpIHRocm93IG5ldyBFcnJvcignYXJyYXlzIG9mIHBvaW50cyBhbmQgc2NhbGFycyBtdXN0IGhhdmUgZXF1YWwgbGVuZ3RoJyk7XG4gIC8vIGlmIChwbGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2FycmF5IG11c3QgYmUgb2YgbGVuZ3RoID49IDInKTtcbiAgY29uc3QgemVybyA9IGMuWkVSTztcbiAgY29uc3Qgd2JpdHMgPSBiaXRMZW4oQmlnSW50KHBsZW5ndGgpKTtcbiAgbGV0IHdpbmRvd1NpemUgPSAxOyAvLyBiaXRzXG4gIGlmICh3Yml0cyA+IDEyKSB3aW5kb3dTaXplID0gd2JpdHMgLSAzO1xuICBlbHNlIGlmICh3Yml0cyA+IDQpIHdpbmRvd1NpemUgPSB3Yml0cyAtIDI7XG4gIGVsc2UgaWYgKHdiaXRzID4gMCkgd2luZG93U2l6ZSA9IDI7XG4gIGNvbnN0IE1BU0sgPSBiaXRNYXNrKHdpbmRvd1NpemUpO1xuICBjb25zdCBidWNrZXRzID0gbmV3IEFycmF5KE51bWJlcihNQVNLKSArIDEpLmZpbGwoemVybyk7IC8vICsxIGZvciB6ZXJvIGFycmF5XG4gIGNvbnN0IGxhc3RCaXRzID0gTWF0aC5mbG9vcigoZmllbGROLkJJVFMgLSAxKSAvIHdpbmRvd1NpemUpICogd2luZG93U2l6ZTtcbiAgbGV0IHN1bSA9IHplcm87XG4gIGZvciAobGV0IGkgPSBsYXN0Qml0czsgaSA+PSAwOyBpIC09IHdpbmRvd1NpemUpIHtcbiAgICBidWNrZXRzLmZpbGwoemVybyk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBzbGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHNjYWxhciA9IHNjYWxhcnNbal07XG4gICAgICBjb25zdCB3Yml0cyA9IE51bWJlcigoc2NhbGFyID4+IEJpZ0ludChpKSkgJiBNQVNLKTtcbiAgICAgIGJ1Y2tldHNbd2JpdHNdID0gYnVja2V0c1t3Yml0c10uYWRkKHBvaW50c1tqXSk7XG4gICAgfVxuICAgIGxldCByZXNJID0gemVybzsgLy8gbm90IHVzaW5nIHRoaXMgd2lsbCBkbyBzbWFsbCBzcGVlZC11cCwgYnV0IHdpbGwgbG9zZSBjdFxuICAgIC8vIFNraXAgZmlyc3QgYnVja2V0LCBiZWNhdXNlIGl0IGlzIHplcm9cbiAgICBmb3IgKGxldCBqID0gYnVja2V0cy5sZW5ndGggLSAxLCBzdW1JID0gemVybzsgaiA+IDA7IGotLSkge1xuICAgICAgc3VtSSA9IHN1bUkuYWRkKGJ1Y2tldHNbal0pO1xuICAgICAgcmVzSSA9IHJlc0kuYWRkKHN1bUkpO1xuICAgIH1cbiAgICBzdW0gPSBzdW0uYWRkKHJlc0kpO1xuICAgIGlmIChpICE9PSAwKSBmb3IgKGxldCBqID0gMDsgaiA8IHdpbmRvd1NpemU7IGorKykgc3VtID0gc3VtLmRvdWJsZSgpO1xuICB9XG4gIHJldHVybiBzdW0gYXMgUDtcbn1cbi8qKlxuICogUHJlY29tcHV0ZWQgbXVsdGktc2NhbGFyIG11bHRpcGxpY2F0aW9uIChNU00sIFBhICsgUWIgKyBSYyArIC4uLikuXG4gKiBAcGFyYW0gYyBDdXJ2ZSBQb2ludCBjb25zdHJ1Y3RvclxuICogQHBhcmFtIGZpZWxkTiBmaWVsZCBvdmVyIENVUlZFLk4gLSBpbXBvcnRhbnQgdGhhdCBpdCdzIG5vdCBvdmVyIENVUlZFLlBcbiAqIEBwYXJhbSBwb2ludHMgYXJyYXkgb2YgTCBjdXJ2ZSBwb2ludHNcbiAqIEByZXR1cm5zIGZ1bmN0aW9uIHdoaWNoIG11bHRpcGxpZXMgcG9pbnRzIHdpdGggc2NhYXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb21wdXRlTVNNVW5zYWZlPFAgZXh0ZW5kcyBDdXJ2ZVBvaW50PGFueSwgUD4sIFBDIGV4dGVuZHMgQ3VydmVQb2ludENvbnM8UD4+KFxuICBjOiBQQyxcbiAgcG9pbnRzOiBQW10sXG4gIHdpbmRvd1NpemU6IG51bWJlclxuKTogKHNjYWxhcnM6IGJpZ2ludFtdKSA9PiBQIHtcbiAgLyoqXG4gICAqIFBlcmZvcm1hbmNlIEFuYWx5c2lzIG9mIFdpbmRvdy1iYXNlZCBQcmVjb21wdXRhdGlvblxuICAgKlxuICAgKiBCYXNlIENhc2UgKDI1Ni1iaXQgc2NhbGFyLCA4LWJpdCB3aW5kb3cpOlxuICAgKiAtIFN0YW5kYXJkIHByZWNvbXB1dGF0aW9uIHJlcXVpcmVzOlxuICAgKiAgIC0gMzEgYWRkaXRpb25zIHBlciBzY2FsYXIgXHUwMEQ3IDI1NiBzY2FsYXJzID0gNyw5MzYgb3BzXG4gICAqICAgLSBQbHVzIDI1NSBzdW1tYXJ5IGFkZGl0aW9ucyA9IDgsMTkxIHRvdGFsIG9wc1xuICAgKiAgIE5vdGU6IFN1bW1hcnkgYWRkaXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQgdmlhIGFjY3VtdWxhdG9yXG4gICAqXG4gICAqIENodW5rZWQgUHJlY29tcHV0YXRpb24gQW5hbHlzaXM6XG4gICAqIC0gVXNpbmcgMzIgY2h1bmtzIHJlcXVpcmVzOlxuICAgKiAgIC0gMjU1IGFkZGl0aW9ucyBwZXIgY2h1bmtcbiAgICogICAtIDI1NiBkb3VibGluZ3NcbiAgICogICAtIFRvdGFsOiAoMjU1IFx1MDBENyAzMikgKyAyNTYgPSA4LDQxNiBvcHNcbiAgICpcbiAgICogTWVtb3J5IFVzYWdlIENvbXBhcmlzb246XG4gICAqIFdpbmRvdyBTaXplIHwgU3RhbmRhcmQgUG9pbnRzIHwgQ2h1bmtlZCBQb2ludHNcbiAgICogLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLVxuICAgKiAgICAgNC1iaXQgICB8ICAgICA1MjAgICAgICAgICB8ICAgICAgMTVcbiAgICogICAgIDgtYml0ICAgfCAgICA0LDIyNCAgICAgICAgfCAgICAgMjU1XG4gICAqICAgIDEwLWJpdCAgIHwgICAxMyw4MjQgICAgICAgIHwgICAxLDAyM1xuICAgKiAgICAxNi1iaXQgICB8ICA1NTcsMDU2ICAgICAgICB8ICA2NSw1MzVcbiAgICpcbiAgICogS2V5IEFkdmFudGFnZXM6XG4gICAqIDEuIEVuYWJsZXMgbGFyZ2VyIHdpbmRvdyBzaXplcyBkdWUgdG8gcmVkdWNlZCBtZW1vcnkgb3ZlcmhlYWRcbiAgICogMi4gTW9yZSBlZmZpY2llbnQgZm9yIHNtYWxsZXIgc2NhbGFyIGNvdW50czpcbiAgICogICAgLSAxNiBjaHVua3M6ICgxNiBcdTAwRDcgMjU1KSArIDI1NiA9IDQsMzM2IG9wc1xuICAgKiAgICAtIH4yeCBmYXN0ZXIgdGhhbiBzdGFuZGFyZCA4LDE5MSBvcHNcbiAgICpcbiAgICogTGltaXRhdGlvbnM6XG4gICAqIC0gTm90IHN1aXRhYmxlIGZvciBwbGFpbiBwcmVjb21wdXRlcyAocmVxdWlyZXMgMjU2IGNvbnN0YW50IGRvdWJsaW5ncylcbiAgICogLSBQZXJmb3JtYW5jZSBkZWdyYWRlcyB3aXRoIGxhcmdlciBzY2FsYXIgY291bnRzOlxuICAgKiAgIC0gT3B0aW1hbCBmb3IgfjI1NiBzY2FsYXJzXG4gICAqICAgLSBMZXNzIGVmZmljaWVudCBmb3IgNDA5Nisgc2NhbGFycyAoUGlwcGVuZ2VyIHByZWZlcnJlZClcbiAgICovXG4gIGNvbnN0IGZpZWxkTiA9IGMuRm47XG4gIHZhbGlkYXRlVyh3aW5kb3dTaXplLCBmaWVsZE4uQklUUyk7XG4gIHZhbGlkYXRlTVNNUG9pbnRzKHBvaW50cywgYyk7XG4gIGNvbnN0IHplcm8gPSBjLlpFUk87XG4gIGNvbnN0IHRhYmxlU2l6ZSA9IDIgKiogd2luZG93U2l6ZSAtIDE7IC8vIHRhYmxlIHNpemUgKHdpdGhvdXQgemVybylcbiAgY29uc3QgY2h1bmtzID0gTWF0aC5jZWlsKGZpZWxkTi5CSVRTIC8gd2luZG93U2l6ZSk7IC8vIGNodW5rcyBvZiBpdGVtXG4gIGNvbnN0IE1BU0sgPSBiaXRNYXNrKHdpbmRvd1NpemUpO1xuICBjb25zdCB0YWJsZXMgPSBwb2ludHMubWFwKChwOiBQKSA9PiB7XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGFjYyA9IHA7IGkgPCB0YWJsZVNpemU7IGkrKykge1xuICAgICAgcmVzLnB1c2goYWNjKTtcbiAgICAgIGFjYyA9IGFjYy5hZGQocCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0pO1xuICByZXR1cm4gKHNjYWxhcnM6IGJpZ2ludFtdKTogUCA9PiB7XG4gICAgdmFsaWRhdGVNU01TY2FsYXJzKHNjYWxhcnMsIGZpZWxkTik7XG4gICAgaWYgKHNjYWxhcnMubGVuZ3RoID4gcG9pbnRzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXJyYXkgb2Ygc2NhbGFycyBtdXN0IGJlIHNtYWxsZXIgdGhhbiBhcnJheSBvZiBwb2ludHMnKTtcbiAgICBsZXQgcmVzID0gemVybztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rczsgaSsrKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIGRvdWJsZSBpZiBhY2N1bXVsYXRvciBpcyBzdGlsbCB6ZXJvLlxuICAgICAgaWYgKHJlcyAhPT0gemVybykgZm9yIChsZXQgaiA9IDA7IGogPCB3aW5kb3dTaXplOyBqKyspIHJlcyA9IHJlcy5kb3VibGUoKTtcbiAgICAgIGNvbnN0IHNoaWZ0QnkgPSBCaWdJbnQoY2h1bmtzICogd2luZG93U2l6ZSAtIChpICsgMSkgKiB3aW5kb3dTaXplKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2NhbGFycy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBuID0gc2NhbGFyc1tqXTtcbiAgICAgICAgY29uc3QgY3VyciA9IE51bWJlcigobiA+PiBzaGlmdEJ5KSAmIE1BU0spO1xuICAgICAgICBpZiAoIWN1cnIpIGNvbnRpbnVlOyAvLyBza2lwIHplcm8gc2NhbGFycyBjaHVua3NcbiAgICAgICAgcmVzID0gcmVzLmFkZCh0YWJsZXNbal1bY3VyciAtIDFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRDdXJ2ZVBhcmFtczxUPiA9IHtcbiAgcDogYmlnaW50O1xuICBuOiBiaWdpbnQ7XG4gIGg6IGJpZ2ludDtcbiAgYTogVDtcbiAgYj86IFQ7XG4gIGQ/OiBUO1xuICBHeDogVDtcbiAgR3k6IFQ7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVGaWVsZDxUPihvcmRlcjogYmlnaW50LCBmaWVsZD86IElGaWVsZDxUPiwgaXNMRT86IGJvb2xlYW4pOiBJRmllbGQ8VD4ge1xuICBpZiAoZmllbGQpIHtcbiAgICBpZiAoZmllbGQuT1JERVIgIT09IG9yZGVyKSB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkLk9SREVSIG11c3QgbWF0Y2ggb3JkZXI6IEZwID09IHAsIEZuID09IG4nKTtcbiAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIEZpZWxkKG9yZGVyLCB7IGlzTEUgfSkgYXMgdW5rbm93biBhcyBJRmllbGQ8VD47XG4gIH1cbn1cbmV4cG9ydCB0eXBlIEZwRm48VD4gPSB7IEZwOiBJRmllbGQ8VD47IEZuOiBJRmllbGQ8YmlnaW50PiB9O1xuXG4vKiogVmFsaWRhdGVzIENVUlZFIG9wdHMgYW5kIGNyZWF0ZXMgZmllbGRzICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3VydmVGaWVsZHM8VD4oXG4gIHR5cGU6ICd3ZWllcnN0cmFzcycgfCAnZWR3YXJkcycsXG4gIENVUlZFOiBWYWxpZEN1cnZlUGFyYW1zPFQ+LFxuICBjdXJ2ZU9wdHM6IFBhcnRpYWw8RnBGbjxUPj4gPSB7fSxcbiAgRnBGbkxFPzogYm9vbGVhblxuKTogRnBGbjxUPiAmIHsgQ1VSVkU6IFZhbGlkQ3VydmVQYXJhbXM8VD4gfSB7XG4gIGlmIChGcEZuTEUgPT09IHVuZGVmaW5lZCkgRnBGbkxFID0gdHlwZSA9PT0gJ2Vkd2FyZHMnO1xuICBpZiAoIUNVUlZFIHx8IHR5cGVvZiBDVVJWRSAhPT0gJ29iamVjdCcpIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgdmFsaWQgJHt0eXBlfSBDVVJWRSBvYmplY3RgKTtcbiAgZm9yIChjb25zdCBwIG9mIFsncCcsICduJywgJ2gnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbCA9IENVUlZFW3BdO1xuICAgIGlmICghKHR5cGVvZiB2YWwgPT09ICdiaWdpbnQnICYmIHZhbCA+IF8wbikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENVUlZFLiR7cH0gbXVzdCBiZSBwb3NpdGl2ZSBiaWdpbnRgKTtcbiAgfVxuICBjb25zdCBGcCA9IGNyZWF0ZUZpZWxkKENVUlZFLnAsIGN1cnZlT3B0cy5GcCwgRnBGbkxFKTtcbiAgY29uc3QgRm4gPSBjcmVhdGVGaWVsZChDVVJWRS5uLCBjdXJ2ZU9wdHMuRm4sIEZwRm5MRSk7XG4gIGNvbnN0IF9iOiAnYicgfCAnZCcgPSB0eXBlID09PSAnd2VpZXJzdHJhc3MnID8gJ2InIDogJ2QnO1xuICBjb25zdCBwYXJhbXMgPSBbJ0d4JywgJ0d5JywgJ2EnLCBfYl0gYXMgY29uc3Q7XG4gIGZvciAoY29uc3QgcCBvZiBwYXJhbXMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCFGcC5pc1ZhbGlkKENVUlZFW3BdKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ1VSVkUuJHtwfSBtdXN0IGJlIHZhbGlkIGZpZWxkIGVsZW1lbnQgb2YgQ1VSVkUuRnBgKTtcbiAgfVxuICBDVVJWRSA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmFzc2lnbih7fSwgQ1VSVkUpKTtcbiAgcmV0dXJuIHsgQ1VSVkUsIEZwLCBGbiB9O1xufVxuXG50eXBlIEtleWdlbkZuID0gKFxuICBzZWVkPzogVWludDhBcnJheSxcbiAgaXNDb21wcmVzc2VkPzogYm9vbGVhblxuKSA9PiB7IHNlY3JldEtleTogVWludDhBcnJheTsgcHVibGljS2V5OiBVaW50OEFycmF5IH07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlS2V5Z2VuKFxuICByYW5kb21TZWNyZXRLZXk6IEZ1bmN0aW9uLFxuICBnZXRQdWJsaWNLZXk6IFNpZ25lclsnZ2V0UHVibGljS2V5J11cbik6IEtleWdlbkZuIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleWdlbihzZWVkPzogVWludDhBcnJheSkge1xuICAgIGNvbnN0IHNlY3JldEtleSA9IHJhbmRvbVNlY3JldEtleShzZWVkKTtcbiAgICByZXR1cm4geyBzZWNyZXRLZXksIHB1YmxpY0tleTogZ2V0UHVibGljS2V5KHNlY3JldEtleSkgfTtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEhleCwgYnl0ZXMgYW5kIG51bWJlciB1dGlsaXRpZXMuXG4gKiBAbW9kdWxlXG4gKi9cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmltcG9ydCB7XG4gIGFieXRlcyBhcyBhYnl0ZXNfLFxuICBhbnVtYmVyLFxuICBieXRlc1RvSGV4IGFzIGJ5dGVzVG9IZXhfLFxuICBjb25jYXRCeXRlcyBhcyBjb25jYXRCeXRlc18sXG4gIGhleFRvQnl0ZXMgYXMgaGV4VG9CeXRlc18sXG59IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMuanMnO1xuZXhwb3J0IHtcbiAgYWJ5dGVzLFxuICBhbnVtYmVyLFxuICBieXRlc1RvSGV4LFxuICBjb25jYXRCeXRlcyxcbiAgaGV4VG9CeXRlcyxcbiAgaXNCeXRlcyxcbiAgcmFuZG9tQnl0ZXMsXG59IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMuanMnO1xuY29uc3QgXzBuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgwKTtcbmNvbnN0IF8xbiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMSk7XG5cbmV4cG9ydCB0eXBlIENIYXNoID0ge1xuICAobWVzc2FnZTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG4gIGJsb2NrTGVuOiBudW1iZXI7XG4gIG91dHB1dExlbjogbnVtYmVyO1xuICBjcmVhdGUob3B0cz86IHsgZGtMZW4/OiBudW1iZXIgfSk6IGFueTsgLy8gRm9yIHNoYWtlXG59O1xuZXhwb3J0IHR5cGUgRkhhc2ggPSAobWVzc2FnZTogVWludDhBcnJheSkgPT4gVWludDhBcnJheTtcbmV4cG9ydCBmdW5jdGlvbiBhYm9vbCh2YWx1ZTogYm9vbGVhbiwgdGl0bGU6IHN0cmluZyA9ICcnKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgIGNvbnN0IHByZWZpeCA9IHRpdGxlICYmIGBcIiR7dGl0bGV9XCIgYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4ICsgJ2V4cGVjdGVkIGJvb2xlYW4sIGdvdCB0eXBlPScgKyB0eXBlb2YgdmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gVXNlZCBpbiB3ZWllcnN0cmFzcywgZGVyXG5mdW5jdGlvbiBhYmlnbnVtYmVyKG46IG51bWJlciB8IGJpZ2ludCkge1xuICBpZiAodHlwZW9mIG4gPT09ICdiaWdpbnQnKSB7XG4gICAgaWYgKCFpc1Bvc0JpZyhuKSkgdGhyb3cgbmV3IEVycm9yKCdwb3NpdGl2ZSBiaWdpbnQgZXhwZWN0ZWQsIGdvdCAnICsgbik7XG4gIH0gZWxzZSBhbnVtYmVyKG4pO1xuICByZXR1cm4gbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzYWZlbnVtYmVyKHZhbHVlOiBudW1iZXIsIHRpdGxlOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSkge1xuICAgIGNvbnN0IHByZWZpeCA9IHRpdGxlICYmIGBcIiR7dGl0bGV9XCIgYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4ICsgJ2V4cGVjdGVkIHNhZmUgaW50ZWdlciwgZ290IHR5cGU9JyArIHR5cGVvZiB2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvSGV4VW5wYWRkZWQobnVtOiBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcge1xuICBjb25zdCBoZXggPSBhYmlnbnVtYmVyKG51bSkudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gaGV4Lmxlbmd0aCAmIDEgPyAnMCcgKyBoZXggOiBoZXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb051bWJlcihoZXg6IHN0cmluZyk6IGJpZ2ludCB7XG4gIGlmICh0eXBlb2YgaGV4ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgJyArIHR5cGVvZiBoZXgpO1xuICByZXR1cm4gaGV4ID09PSAnJyA/IF8wbiA6IEJpZ0ludCgnMHgnICsgaGV4KTsgLy8gQmlnIEVuZGlhblxufVxuXG4vLyBCRTogQmlnIEVuZGlhbiwgTEU6IExpdHRsZSBFbmRpYW5cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvTnVtYmVyQkUoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICByZXR1cm4gaGV4VG9OdW1iZXIoYnl0ZXNUb0hleF8oYnl0ZXMpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvTnVtYmVyTEUoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICByZXR1cm4gaGV4VG9OdW1iZXIoYnl0ZXNUb0hleF8oY29weUJ5dGVzKGFieXRlc18oYnl0ZXMpKS5yZXZlcnNlKCkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvQnl0ZXNCRShuOiBudW1iZXIgfCBiaWdpbnQsIGxlbjogbnVtYmVyKTogVWludDhBcnJheSB7XG4gIGFudW1iZXIobGVuKTtcbiAgbiA9IGFiaWdudW1iZXIobik7XG4gIGNvbnN0IHJlcyA9IGhleFRvQnl0ZXNfKG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KGxlbiAqIDIsICcwJykpO1xuICBpZiAocmVzLmxlbmd0aCAhPT0gbGVuKSB0aHJvdyBuZXcgRXJyb3IoJ251bWJlciB0b28gbGFyZ2UnKTtcbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb0J5dGVzTEUobjogbnVtYmVyIHwgYmlnaW50LCBsZW46IG51bWJlcik6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbnVtYmVyVG9CeXRlc0JFKG4sIGxlbikucmV2ZXJzZSgpO1xufVxuLy8gVW5wYWRkZWQsIHJhcmVseSB1c2VkXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9WYXJCeXRlc0JFKG46IG51bWJlciB8IGJpZ2ludCk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gaGV4VG9CeXRlc18obnVtYmVyVG9IZXhVbnBhZGRlZChhYmlnbnVtYmVyKG4pKSk7XG59XG5cbi8vIENvbXBhcmVzIDIgdThhLXMgaW4ga2luZGEgY29uc3RhbnQgdGltZVxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsQnl0ZXMoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGxldCBkaWZmID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBkaWZmIHw9IGFbaV0gXiBiW2ldO1xuICByZXR1cm4gZGlmZiA9PT0gMDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgVWludDhBcnJheS4gV2UgY2FuJ3QgdXNlIHU4YS5zbGljZSgpLCBiZWNhdXNlIHU4YSBjYW4gYmUgQnVmZmVyLFxuICogYW5kIEJ1ZmZlciNzbGljZSBjcmVhdGVzIG11dGFibGUgY29weS4gTmV2ZXIgdXNlIEJ1ZmZlcnMhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Qnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShieXRlcyk7XG59XG5cbi8qKlxuICogRGVjb2RlcyA3LWJpdCBBU0NJSSBzdHJpbmcgdG8gVWludDhBcnJheSwgdGhyb3dzIG9uIG5vbi1hc2NpaSBzeW1ib2xzXG4gKiBTaG91bGQgYmUgc2FmZSB0byB1c2UgZm9yIHRoaW5ncyBleHBlY3RlZCB0byBiZSBBU0NJSS5cbiAqIFJldHVybnMgZXhhY3Qgc2FtZSByZXN1bHQgYXMgYFRleHRFbmNvZGVyYCBmb3IgQVNDSUkgb3IgdGhyb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNjaWlUb0J5dGVzKGFzY2lpOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhc2NpaSwgKGMsIGkpID0+IHtcbiAgICBjb25zdCBjaGFyQ29kZSA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoYy5sZW5ndGggIT09IDEgfHwgY2hhckNvZGUgPiAxMjcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHN0cmluZyBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVyIFwiJHthc2NpaVtpXX1cIiB3aXRoIGNvZGUgJHtjaGFyQ29kZX0gYXQgcG9zaXRpb24gJHtpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfSk7XG59XG5cbi8vIElzIHBvc2l0aXZlIGJpZ2ludFxuY29uc3QgaXNQb3NCaWcgPSAobjogYmlnaW50KSA9PiB0eXBlb2YgbiA9PT0gJ2JpZ2ludCcgJiYgXzBuIDw9IG47XG5cbmV4cG9ydCBmdW5jdGlvbiBpblJhbmdlKG46IGJpZ2ludCwgbWluOiBiaWdpbnQsIG1heDogYmlnaW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Bvc0JpZyhuKSAmJiBpc1Bvc0JpZyhtaW4pICYmIGlzUG9zQmlnKG1heCkgJiYgbWluIDw9IG4gJiYgbiA8IG1heDtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIG1pbiA8PSBuIDwgbWF4LiBOT1RFOiBJdCdzIDwgbWF4IGFuZCBub3QgPD0gbWF4LlxuICogQGV4YW1wbGVcbiAqIGFJblJhbmdlKCd4JywgeCwgMW4sIDI1Nm4pOyAvLyB3b3VsZCBhc3N1bWUgeCBpcyBpbiAoMW4uLjI1NW4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhSW5SYW5nZSh0aXRsZTogc3RyaW5nLCBuOiBiaWdpbnQsIG1pbjogYmlnaW50LCBtYXg6IGJpZ2ludCk6IHZvaWQge1xuICAvLyBXaHkgbWluIDw9IG4gPCBtYXggYW5kIG5vdCBhIChtaW4gPCBuIDwgbWF4KSBPUiBiIChtaW4gPD0gbiA8PSBtYXgpP1xuICAvLyBjb25zaWRlciBQPTI1Nm4sIG1pbj0wbiwgbWF4PVBcbiAgLy8gLSBhIGZvciBtaW49MCB3b3VsZCByZXF1aXJlIC0xOiAgICAgICAgICBgaW5SYW5nZSgneCcsIHgsIC0xbiwgUClgXG4gIC8vIC0gYiB3b3VsZCBjb21tb25seSByZXF1aXJlIHN1YnRyYWN0aW9uOiAgYGluUmFuZ2UoJ3gnLCB4LCAwbiwgUCAtIDFuKWBcbiAgLy8gLSBvdXIgd2F5IGlzIHRoZSBjbGVhbmVzdDogICAgICAgICAgICAgICBgaW5SYW5nZSgneCcsIHgsIDBuLCBQKVxuICBpZiAoIWluUmFuZ2UobiwgbWluLCBtYXgpKVxuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgdmFsaWQgJyArIHRpdGxlICsgJzogJyArIG1pbiArICcgPD0gbiA8ICcgKyBtYXggKyAnLCBnb3QgJyArIG4pO1xufVxuXG4vLyBCaXQgb3BlcmF0aW9uc1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgYW1vdW50IG9mIGJpdHMgaW4gYSBiaWdpbnQuXG4gKiBTYW1lIGFzIGBuLnRvU3RyaW5nKDIpLmxlbmd0aGBcbiAqIFRPRE86IG1lcmdlIHdpdGggbkxlbmd0aCBpbiBtb2R1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaXRMZW4objogYmlnaW50KTogbnVtYmVyIHtcbiAgbGV0IGxlbjtcbiAgZm9yIChsZW4gPSAwOyBuID4gXzBuOyBuID4+PSBfMW4sIGxlbiArPSAxKTtcbiAgcmV0dXJuIGxlbjtcbn1cblxuLyoqXG4gKiBHZXRzIHNpbmdsZSBiaXQgYXQgcG9zaXRpb24uXG4gKiBOT1RFOiBmaXJzdCBiaXQgcG9zaXRpb24gaXMgMCAoc2FtZSBhcyBhcnJheXMpXG4gKiBTYW1lIGFzIGAhIStBcnJheS5mcm9tKG4udG9TdHJpbmcoMikpLnJldmVyc2UoKVtwb3NdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYml0R2V0KG46IGJpZ2ludCwgcG9zOiBudW1iZXIpOiBiaWdpbnQge1xuICByZXR1cm4gKG4gPj4gQmlnSW50KHBvcykpICYgXzFuO1xufVxuXG4vKipcbiAqIFNldHMgc2luZ2xlIGJpdCBhdCBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpdFNldChuOiBiaWdpbnQsIHBvczogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IGJpZ2ludCB7XG4gIHJldHVybiBuIHwgKCh2YWx1ZSA/IF8xbiA6IF8wbikgPDwgQmlnSW50KHBvcykpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBtYXNrIGZvciBOIGJpdHMuIE5vdCB1c2luZyAqKiBvcGVyYXRvciB3aXRoIGJpZ2ludHMgYmVjYXVzZSBvZiBvbGQgZW5naW5lcy5cbiAqIFNhbWUgYXMgQmlnSW50KGAwYiR7QXJyYXkoaSkuZmlsbCgnMScpLmpvaW4oJycpfWApXG4gKi9cbmV4cG9ydCBjb25zdCBiaXRNYXNrID0gKG46IG51bWJlcik6IGJpZ2ludCA9PiAoXzFuIDw8IEJpZ0ludChuKSkgLSBfMW47XG5cbi8vIERSQkdcblxudHlwZSBQcmVkPFQ+ID0gKHY6IFVpbnQ4QXJyYXkpID0+IFQgfCB1bmRlZmluZWQ7XG4vKipcbiAqIE1pbmltYWwgSE1BQy1EUkJHIGZyb20gTklTVCA4MDAtOTAgZm9yIFJGQzY5Nzkgc2lncy5cbiAqIEByZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIERSQkcgdW50aWwgMm5kIGFyZyByZXR1cm5zIHNvbWV0aGluZyBtZWFuaW5nZnVsXG4gKiBAZXhhbXBsZVxuICogICBjb25zdCBkcmJnID0gY3JlYXRlSG1hY0RSQkc8S2V5PigzMiwgMzIsIGhtYWMpO1xuICogICBkcmJnKHNlZWQsIGJ5dGVzVG9LZXkpOyAvLyBieXRlc1RvS2V5IG11c3QgcmV0dXJuIEtleSBvciB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhtYWNEcmJnPFQ+KFxuICBoYXNoTGVuOiBudW1iZXIsXG4gIHFCeXRlTGVuOiBudW1iZXIsXG4gIGhtYWNGbjogKGtleTogVWludDhBcnJheSwgbWVzc2FnZTogVWludDhBcnJheSkgPT4gVWludDhBcnJheVxuKTogKHNlZWQ6IFVpbnQ4QXJyYXksIHByZWRpY2F0ZTogUHJlZDxUPikgPT4gVCB7XG4gIGFudW1iZXIoaGFzaExlbiwgJ2hhc2hMZW4nKTtcbiAgYW51bWJlcihxQnl0ZUxlbiwgJ3FCeXRlTGVuJyk7XG4gIGlmICh0eXBlb2YgaG1hY0ZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ2htYWNGbiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgY29uc3QgdThuID0gKGxlbjogbnVtYmVyKTogVWludDhBcnJheSA9PiBuZXcgVWludDhBcnJheShsZW4pOyAvLyBjcmVhdGVzIFVpbnQ4QXJyYXlcbiAgY29uc3QgTlVMTCA9IFVpbnQ4QXJyYXkub2YoKTtcbiAgY29uc3QgYnl0ZTAgPSBVaW50OEFycmF5Lm9mKDB4MDApO1xuICBjb25zdCBieXRlMSA9IFVpbnQ4QXJyYXkub2YoMHgwMSk7XG4gIGNvbnN0IF9tYXhEcmJnSXRlcnMgPSAxMDAwO1xuXG4gIC8vIFN0ZXAgQiwgU3RlcCBDOiBzZXQgaGFzaExlbiB0byA4KmNlaWwoaGxlbi84KVxuICBsZXQgdiA9IHU4bihoYXNoTGVuKTsgLy8gTWluaW1hbCBub24tZnVsbC1zcGVjIEhNQUMtRFJCRyBmcm9tIE5JU1QgODAwLTkwIGZvciBSRkM2OTc5IHNpZ3MuXG4gIGxldCBrID0gdThuKGhhc2hMZW4pOyAvLyBTdGVwcyBCIGFuZCBDIG9mIFJGQzY5NzkgMy4yOiBzZXQgaGFzaExlbiwgaW4gb3VyIGNhc2UgYWx3YXlzIHNhbWVcbiAgbGV0IGkgPSAwOyAvLyBJdGVyYXRpb25zIGNvdW50ZXIsIHdpbGwgdGhyb3cgd2hlbiBvdmVyIDEwMDBcbiAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgdi5maWxsKDEpO1xuICAgIGsuZmlsbCgwKTtcbiAgICBpID0gMDtcbiAgfTtcbiAgY29uc3QgaCA9ICguLi5tc2dzOiBVaW50OEFycmF5W10pID0+IGhtYWNGbihrLCBjb25jYXRCeXRlc18odiwgLi4ubXNncykpOyAvLyBobWFjKGspKHYsIC4uLnZhbHVlcylcbiAgY29uc3QgcmVzZWVkID0gKHNlZWQ6IFVpbnQ4QXJyYXkgPSBOVUxMKSA9PiB7XG4gICAgLy8gSE1BQy1EUkJHIHJlc2VlZCgpIGZ1bmN0aW9uLiBTdGVwcyBELUdcbiAgICBrID0gaChieXRlMCwgc2VlZCk7IC8vIGsgPSBobWFjKGsgfHwgdiB8fCAweDAwIHx8IHNlZWQpXG4gICAgdiA9IGgoKTsgLy8gdiA9IGhtYWMoayB8fCB2KVxuICAgIGlmIChzZWVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGsgPSBoKGJ5dGUxLCBzZWVkKTsgLy8gayA9IGhtYWMoayB8fCB2IHx8IDB4MDEgfHwgc2VlZClcbiAgICB2ID0gaCgpOyAvLyB2ID0gaG1hYyhrIHx8IHYpXG4gIH07XG4gIGNvbnN0IGdlbiA9ICgpID0+IHtcbiAgICAvLyBITUFDLURSQkcgZ2VuZXJhdGUoKSBmdW5jdGlvblxuICAgIGlmIChpKysgPj0gX21heERyYmdJdGVycykgdGhyb3cgbmV3IEVycm9yKCdkcmJnOiB0cmllZCBtYXggYW1vdW50IG9mIGl0ZXJhdGlvbnMnKTtcbiAgICBsZXQgbGVuID0gMDtcbiAgICBjb25zdCBvdXQ6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIHdoaWxlIChsZW4gPCBxQnl0ZUxlbikge1xuICAgICAgdiA9IGgoKTtcbiAgICAgIGNvbnN0IHNsID0gdi5zbGljZSgpO1xuICAgICAgb3V0LnB1c2goc2wpO1xuICAgICAgbGVuICs9IHYubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gY29uY2F0Qnl0ZXNfKC4uLm91dCk7XG4gIH07XG4gIGNvbnN0IGdlblVudGlsID0gKHNlZWQ6IFVpbnQ4QXJyYXksIHByZWQ6IFByZWQ8VD4pOiBUID0+IHtcbiAgICByZXNldCgpO1xuICAgIHJlc2VlZChzZWVkKTsgLy8gU3RlcHMgRC1HXG4gICAgbGV0IHJlczogVCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDsgLy8gU3RlcCBIOiBncmluZCB1bnRpbCBrIGlzIGluIFsxLi5uLTFdXG4gICAgd2hpbGUgKCEocmVzID0gcHJlZChnZW4oKSkpKSByZXNlZWQoKTtcbiAgICByZXNldCgpO1xuICAgIHJldHVybiByZXM7XG4gIH07XG4gIHJldHVybiBnZW5VbnRpbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KFxuICBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICBvcHRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuKTogdm9pZCB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHZhbGlkIG9wdGlvbnMgb2JqZWN0Jyk7XG4gIHR5cGUgSXRlbSA9IGtleW9mIHR5cGVvZiBvYmplY3Q7XG4gIGZ1bmN0aW9uIGNoZWNrRmllbGQoZmllbGROYW1lOiBJdGVtLCBleHBlY3RlZFR5cGU6IHN0cmluZywgaXNPcHQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB2YWwgPSBvYmplY3RbZmllbGROYW1lXTtcbiAgICBpZiAoaXNPcHQgJiYgdmFsID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50ID0gdHlwZW9mIHZhbDtcbiAgICBpZiAoY3VycmVudCAhPT0gZXhwZWN0ZWRUeXBlIHx8IHZhbCA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcGFyYW0gXCIke2ZpZWxkTmFtZX1cIiBpcyBpbnZhbGlkOiBleHBlY3RlZCAke2V4cGVjdGVkVHlwZX0sIGdvdCAke2N1cnJlbnR9YCk7XG4gIH1cbiAgY29uc3QgaXRlciA9IChmOiB0eXBlb2YgZmllbGRzLCBpc09wdDogYm9vbGVhbikgPT5cbiAgICBPYmplY3QuZW50cmllcyhmKS5mb3JFYWNoKChbaywgdl0pID0+IGNoZWNrRmllbGQoaywgdiwgaXNPcHQpKTtcbiAgaXRlcihmaWVsZHMsIGZhbHNlKTtcbiAgaXRlcihvcHRGaWVsZHMsIHRydWUpO1xufVxuXG4vKipcbiAqIHRocm93cyBub3QgaW1wbGVtZW50ZWQgZXJyb3JcbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEltcGxlbWVudGVkID0gKCk6IG5ldmVyID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbi8qKlxuICogTWVtb2l6ZXMgKGNhY2hlcykgY29tcHV0YXRpb24gcmVzdWx0LlxuICogVXNlcyBXZWFrTWFwOiB0aGUgdmFsdWUgaXMgZ29pbmcgYXV0by1jbGVhbmVkIGJ5IEdDIGFmdGVyIGxhc3QgcmVmZXJlbmNlIGlzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplZDxUIGV4dGVuZHMgb2JqZWN0LCBSLCBPIGV4dGVuZHMgYW55W10+KFxuICBmbjogKGFyZzogVCwgLi4uYXJnczogTykgPT4gUlxuKTogKGFyZzogVCwgLi4uYXJnczogTykgPT4gUiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBXZWFrTWFwPFQsIFI+KCk7XG4gIHJldHVybiAoYXJnOiBULCAuLi5hcmdzOiBPKTogUiA9PiB7XG4gICAgY29uc3QgdmFsID0gbWFwLmdldChhcmcpO1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBjb21wdXRlZCA9IGZuKGFyZywgLi4uYXJncyk7XG4gICAgbWFwLnNldChhcmcsIGNvbXB1dGVkKTtcbiAgICByZXR1cm4gY29tcHV0ZWQ7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3J5cHRvS2V5cyB7XG4gIGxlbmd0aHM6IHsgc2VlZD86IG51bWJlcjsgcHVibGljPzogbnVtYmVyOyBzZWNyZXQ/OiBudW1iZXIgfTtcbiAga2V5Z2VuOiAoc2VlZD86IFVpbnQ4QXJyYXkpID0+IHsgc2VjcmV0S2V5OiBVaW50OEFycmF5OyBwdWJsaWNLZXk6IFVpbnQ4QXJyYXkgfTtcbiAgZ2V0UHVibGljS2V5OiAoc2VjcmV0S2V5OiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xufVxuXG4vKiogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIHNpZ25hdHVyZXMuIEhhcyBrZXlnZW4sIHNpZ24gYW5kIHZlcmlmeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVyIGV4dGVuZHMgQ3J5cHRvS2V5cyB7XG4gIC8vIEludGVyZmFjZXMgYXJlIGZ1bi4gV2UgY2Fubm90IGp1c3QgYWRkIG5ldyBmaWVsZHMgd2l0aG91dCBjb3B5aW5nIG9sZCBvbmVzLlxuICBsZW5ndGhzOiB7XG4gICAgc2VlZD86IG51bWJlcjtcbiAgICBwdWJsaWM/OiBudW1iZXI7XG4gICAgc2VjcmV0PzogbnVtYmVyO1xuICAgIHNpZ25SYW5kPzogbnVtYmVyO1xuICAgIHNpZ25hdHVyZT86IG51bWJlcjtcbiAgfTtcbiAgc2lnbjogKG1zZzogVWludDhBcnJheSwgc2VjcmV0S2V5OiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xuICB2ZXJpZnk6IChzaWc6IFVpbnQ4QXJyYXksIG1zZzogVWludDhBcnJheSwgcHVibGljS2V5OiBVaW50OEFycmF5KSA9PiBib29sZWFuO1xufVxuIiwgIi8qKlxuICogVXRpbHMgZm9yIG1vZHVsYXIgZGl2aXNpb24gYW5kIGZpZWxkcy5cbiAqIEZpZWxkIG92ZXIgMTEgaXMgYSBmaW5pdGUgKEdhbG9pcykgZmllbGQgaXMgaW50ZWdlciBudW1iZXIgb3BlcmF0aW9ucyBgbW9kIDExYC5cbiAqIFRoZXJlIGlzIG5vIGRpdmlzaW9uOiBpdCBpcyByZXBsYWNlZCBieSBtb2R1bGFyIG11bHRpcGxpY2F0aXZlIGludmVyc2UuXG4gKiBAbW9kdWxlXG4gKi9cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmltcG9ydCB7XG4gIGFieXRlcyxcbiAgYW51bWJlcixcbiAgYnl0ZXNUb051bWJlckJFLFxuICBieXRlc1RvTnVtYmVyTEUsXG4gIG51bWJlclRvQnl0ZXNCRSxcbiAgbnVtYmVyVG9CeXRlc0xFLFxuICB2YWxpZGF0ZU9iamVjdCxcbn0gZnJvbSAnLi4vdXRpbHMudHMnO1xuXG4vLyBOdW1iZXJzIGFyZW4ndCB1c2VkIGluIHgyNTUxOSAvIHg0NDggYnVpbGRzXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IF8wbiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMCksIF8xbiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMSksIF8ybiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMik7XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IF8zbiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMyksIF80biA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoNCksIF81biA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoNSk7XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IF83biA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoNyksIF84biA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoOCksIF85biA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoOSk7XG5jb25zdCBfMTZuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgxNik7XG5cbi8vIENhbGN1bGF0ZXMgYSBtb2R1bG8gYlxuZXhwb3J0IGZ1bmN0aW9uIG1vZChhOiBiaWdpbnQsIGI6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIGNvbnN0IHJlc3VsdCA9IGEgJSBiO1xuICByZXR1cm4gcmVzdWx0ID49IF8wbiA/IHJlc3VsdCA6IGIgKyByZXN1bHQ7XG59XG4vKipcbiAqIEVmZmljaWVudGx5IHJhaXNlIG51bSB0byBwb3dlciBhbmQgZG8gbW9kdWxhciBkaXZpc2lvbi5cbiAqIFVuc2FmZSBpbiBzb21lIGNvbnRleHRzOiB1c2VzIGxhZGRlciwgc28gY2FuIGV4cG9zZSBiaWdpbnQgYml0cy5cbiAqIEBleGFtcGxlXG4gKiBwb3coMm4sIDZuLCAxMW4pIC8vIDY0biAlIDExbiA9PSA5blxuICovXG5leHBvcnQgZnVuY3Rpb24gcG93KG51bTogYmlnaW50LCBwb3dlcjogYmlnaW50LCBtb2R1bG86IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBGcFBvdyhGaWVsZChtb2R1bG8pLCBudW0sIHBvd2VyKTtcbn1cblxuLyoqIERvZXMgYHheKDJecG93ZXIpYCBtb2QgcC4gYHBvdzIoMzAsIDQpYCA9PSBgMzBeKDJeNClgICovXG5leHBvcnQgZnVuY3Rpb24gcG93Mih4OiBiaWdpbnQsIHBvd2VyOiBiaWdpbnQsIG1vZHVsbzogYmlnaW50KTogYmlnaW50IHtcbiAgbGV0IHJlcyA9IHg7XG4gIHdoaWxlIChwb3dlci0tID4gXzBuKSB7XG4gICAgcmVzICo9IHJlcztcbiAgICByZXMgJT0gbW9kdWxvO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogSW52ZXJzZXMgbnVtYmVyIG92ZXIgbW9kdWxvLlxuICogSW1wbGVtZW50ZWQgdXNpbmcgW0V1Y2xpZGVhbiBHQ0RdKGh0dHBzOi8vYnJpbGxpYW50Lm9yZy93aWtpL2V4dGVuZGVkLWV1Y2xpZGVhbi1hbGdvcml0aG0vKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydChudW1iZXI6IGJpZ2ludCwgbW9kdWxvOiBiaWdpbnQpOiBiaWdpbnQge1xuICBpZiAobnVtYmVyID09PSBfMG4pIHRocm93IG5ldyBFcnJvcignaW52ZXJ0OiBleHBlY3RlZCBub24temVybyBudW1iZXInKTtcbiAgaWYgKG1vZHVsbyA8PSBfMG4pIHRocm93IG5ldyBFcnJvcignaW52ZXJ0OiBleHBlY3RlZCBwb3NpdGl2ZSBtb2R1bHVzLCBnb3QgJyArIG1vZHVsbyk7XG4gIC8vIEZlcm1hdCdzIGxpdHRsZSB0aGVvcmVtIFwiQ1QtbGlrZVwiIHZlcnNpb24gaW52KG4pID0gbl4obS0yKSBtb2QgbSBpcyAzMHggc2xvd2VyLlxuICBsZXQgYSA9IG1vZChudW1iZXIsIG1vZHVsbyk7XG4gIGxldCBiID0gbW9kdWxvO1xuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgbGV0IHggPSBfMG4sIHkgPSBfMW4sIHUgPSBfMW4sIHYgPSBfMG47XG4gIHdoaWxlIChhICE9PSBfMG4pIHtcbiAgICAvLyBKSVQgYXBwbGllcyBvcHRpbWl6YXRpb24gaWYgdGhvc2UgdHdvIGxpbmVzIGZvbGxvdyBlYWNoIG90aGVyXG4gICAgY29uc3QgcSA9IGIgLyBhO1xuICAgIGNvbnN0IHIgPSBiICUgYTtcbiAgICBjb25zdCBtID0geCAtIHUgKiBxO1xuICAgIGNvbnN0IG4gPSB5IC0gdiAqIHE7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgYiA9IGEsIGEgPSByLCB4ID0gdSwgeSA9IHYsIHUgPSBtLCB2ID0gbjtcbiAgfVxuICBjb25zdCBnY2QgPSBiO1xuICBpZiAoZ2NkICE9PSBfMW4pIHRocm93IG5ldyBFcnJvcignaW52ZXJ0OiBkb2VzIG5vdCBleGlzdCcpO1xuICByZXR1cm4gbW9kKHgsIG1vZHVsbyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzU3F1YXJlPFQ+KEZwOiBJRmllbGQ8VD4sIHJvb3Q6IFQsIG46IFQpOiB2b2lkIHtcbiAgaWYgKCFGcC5lcWwoRnAuc3FyKHJvb3QpLCBuKSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xufVxuXG4vLyBOb3QgYWxsIHJvb3RzIGFyZSBwb3NzaWJsZSEgRXhhbXBsZSB3aGljaCB3aWxsIHRocm93OlxuLy8gY29uc3QgTlVNID1cbi8vIG4gPSA3MjA1NzU5NDAzNzkyNzgxNm47XG4vLyBGcCA9IEZpZWxkKEJpZ0ludCgnMHgxYTAxMTFlYTM5N2ZlNjlhNGIxYmE3YjY0MzRiYWNkNzY0Nzc0Yjg0ZjM4NTEyYmY2NzMwZDJhMGY2YjBmNjI0MWVhYmZmZmViMTUzZmZmZmI5ZmVmZmZmZmZmZmFhYWInKSk7XG5mdW5jdGlvbiBzcXJ0M21vZDQ8VD4oRnA6IElGaWVsZDxUPiwgbjogVCkge1xuICBjb25zdCBwMWRpdjQgPSAoRnAuT1JERVIgKyBfMW4pIC8gXzRuO1xuICBjb25zdCByb290ID0gRnAucG93KG4sIHAxZGl2NCk7XG4gIGFzc2VydElzU3F1YXJlKEZwLCByb290LCBuKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbmZ1bmN0aW9uIHNxcnQ1bW9kODxUPihGcDogSUZpZWxkPFQ+LCBuOiBUKSB7XG4gIGNvbnN0IHA1ZGl2OCA9IChGcC5PUkRFUiAtIF81bikgLyBfOG47XG4gIGNvbnN0IG4yID0gRnAubXVsKG4sIF8ybik7XG4gIGNvbnN0IHYgPSBGcC5wb3cobjIsIHA1ZGl2OCk7XG4gIGNvbnN0IG52ID0gRnAubXVsKG4sIHYpO1xuICBjb25zdCBpID0gRnAubXVsKEZwLm11bChudiwgXzJuKSwgdik7XG4gIGNvbnN0IHJvb3QgPSBGcC5tdWwobnYsIEZwLnN1YihpLCBGcC5PTkUpKTtcbiAgYXNzZXJ0SXNTcXVhcmUoRnAsIHJvb3QsIG4pO1xuICByZXR1cm4gcm9vdDtcbn1cblxuLy8gQmFzZWQgb24gUkZDOTM4MCwgS29uZyBhbGdvcml0aG1cbi8vIHByZXR0aWVyLWlnbm9yZVxuZnVuY3Rpb24gc3FydDltb2QxNihQOiBiaWdpbnQpOiA8VD4oRnA6IElGaWVsZDxUPiwgbjogVCkgPT4gVCB7XG4gIGNvbnN0IEZwXyA9IEZpZWxkKFApO1xuICBjb25zdCB0biA9IHRvbmVsbGlTaGFua3MoUCk7XG4gIGNvbnN0IGMxID0gdG4oRnBfLCBGcF8ubmVnKEZwXy5PTkUpKTsvLyAgMS4gYzEgPSBzcXJ0KC0xKSBpbiBGLCBpLmUuLCAoYzFeMikgPT0gLTEgaW4gRlxuICBjb25zdCBjMiA9IHRuKEZwXywgYzEpOyAgICAgICAgICAgICAgLy8gIDIuIGMyID0gc3FydChjMSkgaW4gRiwgaS5lLiwgKGMyXjIpID09IGMxIGluIEZcbiAgY29uc3QgYzMgPSB0bihGcF8sIEZwXy5uZWcoYzEpKTsgICAgIC8vICAzLiBjMyA9IHNxcnQoLWMxKSBpbiBGLCBpLmUuLCAoYzNeMikgPT0gLWMxIGluIEZcbiAgY29uc3QgYzQgPSAoUCArIF83bikgLyBfMTZuOyAgICAgICAgIC8vICA0LiBjNCA9IChxICsgNykgLyAxNiAgICAgICAgIyBJbnRlZ2VyIGFyaXRobWV0aWNcbiAgcmV0dXJuIDxUPihGcDogSUZpZWxkPFQ+LCBuOiBUKSA9PiB7XG4gICAgbGV0IHR2MSA9IEZwLnBvdyhuLCBjNCk7ICAgICAgICAgICAvLyAgMS4gdHYxID0geF5jNFxuICAgIGxldCB0djIgPSBGcC5tdWwodHYxLCBjMSk7ICAgICAgICAgLy8gIDIuIHR2MiA9IGMxICogdHYxXG4gICAgY29uc3QgdHYzID0gRnAubXVsKHR2MSwgYzIpOyAgICAgICAvLyAgMy4gdHYzID0gYzIgKiB0djFcbiAgICBjb25zdCB0djQgPSBGcC5tdWwodHYxLCBjMyk7ICAgICAgIC8vICA0LiB0djQgPSBjMyAqIHR2MVxuICAgIGNvbnN0IGUxID0gRnAuZXFsKEZwLnNxcih0djIpLCBuKTsgLy8gIDUuICBlMSA9ICh0djJeMikgPT0geFxuICAgIGNvbnN0IGUyID0gRnAuZXFsKEZwLnNxcih0djMpLCBuKTsgLy8gIDYuICBlMiA9ICh0djNeMikgPT0geFxuICAgIHR2MSA9IEZwLmNtb3YodHYxLCB0djIsIGUxKTsgICAgICAgLy8gIDcuIHR2MSA9IENNT1YodHYxLCB0djIsIGUxKSAgIyBTZWxlY3QgdHYyIGlmICh0djJeMikgPT0geFxuICAgIHR2MiA9IEZwLmNtb3YodHY0LCB0djMsIGUyKTsgICAgICAgLy8gIDguIHR2MiA9IENNT1YodHY0LCB0djMsIGUyKSAgIyBTZWxlY3QgdHYzIGlmICh0djNeMikgPT0geFxuICAgIGNvbnN0IGUzID0gRnAuZXFsKEZwLnNxcih0djIpLCBuKTsgLy8gIDkuICBlMyA9ICh0djJeMikgPT0geFxuICAgIGNvbnN0IHJvb3QgPSBGcC5jbW92KHR2MSwgdHYyLCBlMyk7Ly8gMTAuICB6ID0gQ01PVih0djEsIHR2MiwgZTMpICAgIyBTZWxlY3Qgc3FydCBmcm9tIHR2MSAmIHR2MlxuICAgIGFzc2VydElzU3F1YXJlKEZwLCByb290LCBuKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUb25lbGxpLVNoYW5rcyBzcXVhcmUgcm9vdCBzZWFyY2ggYWxnb3JpdGhtLlxuICogMS4gaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMi82ODUucGRmIChwYWdlIDEyKVxuICogMi4gU3F1YXJlIFJvb3RzIGZyb20gMTsgMjQsIDUxLCAxMCB0byBEYW4gU2hhbmtzXG4gKiBAcGFyYW0gUCBmaWVsZCBvcmRlclxuICogQHJldHVybnMgZnVuY3Rpb24gdGhhdCB0YWtlcyBmaWVsZCBGcCAoY3JlYXRlZCBmcm9tIFApIGFuZCBudW1iZXIgblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9uZWxsaVNoYW5rcyhQOiBiaWdpbnQpOiA8VD4oRnA6IElGaWVsZDxUPiwgbjogVCkgPT4gVCB7XG4gIC8vIEluaXRpYWxpemF0aW9uIChwcmVjb21wdXRhdGlvbikuXG4gIC8vIENhY2hpbmcgaW5pdGlhbGl6YXRpb24gY291bGQgYm9vc3QgcGVyZiBieSA3JS5cbiAgaWYgKFAgPCBfM24pIHRocm93IG5ldyBFcnJvcignc3FydCBpcyBub3QgZGVmaW5lZCBmb3Igc21hbGwgZmllbGQnKTtcbiAgLy8gRmFjdG9yIFAgLSAxID0gUSAqIDJeUywgd2hlcmUgUSBpcyBvZGRcbiAgbGV0IFEgPSBQIC0gXzFuO1xuICBsZXQgUyA9IDA7XG4gIHdoaWxlIChRICUgXzJuID09PSBfMG4pIHtcbiAgICBRIC89IF8ybjtcbiAgICBTKys7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBmaXJzdCBxdWFkcmF0aWMgbm9uLXJlc2lkdWUgWiA+PSAyXG4gIGxldCBaID0gXzJuO1xuICBjb25zdCBfRnAgPSBGaWVsZChQKTtcbiAgd2hpbGUgKEZwTGVnZW5kcmUoX0ZwLCBaKSA9PT0gMSkge1xuICAgIC8vIEJhc2ljIHByaW1hbGl0eSB0ZXN0IGZvciBQLiBBZnRlciB4IGl0ZXJhdGlvbnMsIGNoYW5jZSBvZlxuICAgIC8vIG5vdCBmaW5kaW5nIHF1YWRyYXRpYyBub24tcmVzaWR1ZSBpcyAyXngsIHNvIDJeMTAwMC5cbiAgICBpZiAoWisrID4gMTAwMCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdDogcHJvYmFibHkgbm9uLXByaW1lIFAnKTtcbiAgfVxuICAvLyBGYXN0LXBhdGg7IHVzdWFsbHkgZG9uZSBiZWZvcmUgWiwgYnV0IHdlIGRvIFwicHJpbWFsaXR5IHRlc3RcIi5cbiAgaWYgKFMgPT09IDEpIHJldHVybiBzcXJ0M21vZDQ7XG5cbiAgLy8gU2xvdy1wYXRoXG4gIC8vIFRPRE86IHRlc3Qgb24gRnAyIGFuZCBvdGhlcnNcbiAgbGV0IGNjID0gX0ZwLnBvdyhaLCBRKTsgLy8gYyA9IHpeUVxuICBjb25zdCBRMWRpdjIgPSAoUSArIF8xbikgLyBfMm47XG4gIHJldHVybiBmdW5jdGlvbiB0b25lbGxpU2xvdzxUPihGcDogSUZpZWxkPFQ+LCBuOiBUKTogVCB7XG4gICAgaWYgKEZwLmlzMChuKSkgcmV0dXJuIG47XG4gICAgLy8gQ2hlY2sgaWYgbiBpcyBhIHF1YWRyYXRpYyByZXNpZHVlIHVzaW5nIExlZ2VuZHJlIHN5bWJvbFxuICAgIGlmIChGcExlZ2VuZHJlKEZwLCBuKSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIHRoZSBtYWluIGxvb3BcbiAgICBsZXQgTSA9IFM7XG4gICAgbGV0IGMgPSBGcC5tdWwoRnAuT05FLCBjYyk7IC8vIGMgPSB6XlEsIG1vdmUgY2MgZnJvbSBmaWVsZCBfRnAgaW50byBmaWVsZCBGcFxuICAgIGxldCB0ID0gRnAucG93KG4sIFEpOyAvLyB0ID0gbl5RLCBmaXJzdCBndWVzcyBhdCB0aGUgZnVkZ2UgZmFjdG9yXG4gICAgbGV0IFIgPSBGcC5wb3cobiwgUTFkaXYyKTsgLy8gUiA9IG5eKChRKzEpLzIpLCBmaXJzdCBndWVzcyBhdCB0aGUgc3F1YXJlIHJvb3RcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIC8vIHdoaWxlIHQgIT0gMVxuICAgIHdoaWxlICghRnAuZXFsKHQsIEZwLk9ORSkpIHtcbiAgICAgIGlmIChGcC5pczAodCkpIHJldHVybiBGcC5aRVJPOyAvLyBpZiB0PTAgcmV0dXJuIFI9MFxuICAgICAgbGV0IGkgPSAxO1xuXG4gICAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCBpID49IDEgc3VjaCB0aGF0IHReKDJeaSkgXHUyMjYxIDEgKG1vZCBQKVxuICAgICAgbGV0IHRfdG1wID0gRnAuc3FyKHQpOyAvLyB0XigyXjEpXG4gICAgICB3aGlsZSAoIUZwLmVxbCh0X3RtcCwgRnAuT05FKSkge1xuICAgICAgICBpKys7XG4gICAgICAgIHRfdG1wID0gRnAuc3FyKHRfdG1wKTsgLy8gdF4oMl4yKS4uLlxuICAgICAgICBpZiAoaSA9PT0gTSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGV4cG9uZW50IGZvciBiOiAyXihNIC0gaSAtIDEpXG4gICAgICBjb25zdCBleHBvbmVudCA9IF8xbiA8PCBCaWdJbnQoTSAtIGkgLSAxKTsgLy8gYmlnaW50IGlzIGltcG9ydGFudFxuICAgICAgY29uc3QgYiA9IEZwLnBvdyhjLCBleHBvbmVudCk7IC8vIGIgPSAyXihNIC0gaSAtIDEpXG5cbiAgICAgIC8vIFVwZGF0ZSB2YXJpYWJsZXNcbiAgICAgIE0gPSBpO1xuICAgICAgYyA9IEZwLnNxcihiKTsgLy8gYyA9IGJeMlxuICAgICAgdCA9IEZwLm11bCh0LCBjKTsgLy8gdCA9ICh0ICogYl4yKVxuICAgICAgUiA9IEZwLm11bChSLCBiKTsgLy8gUiA9IFIqYlxuICAgIH1cbiAgICByZXR1cm4gUjtcbiAgfTtcbn1cblxuLyoqXG4gKiBTcXVhcmUgcm9vdCBmb3IgYSBmaW5pdGUgZmllbGQuIFdpbGwgdHJ5IG9wdGltaXplZCB2ZXJzaW9ucyBmaXJzdDpcbiAqXG4gKiAxLiBQIFx1MjI2MSAzIChtb2QgNClcbiAqIDIuIFAgXHUyMjYxIDUgKG1vZCA4KVxuICogMy4gUCBcdTIyNjEgOSAobW9kIDE2KVxuICogNC4gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtXG4gKlxuICogRGlmZmVyZW50IGFsZ29yaXRobXMgY2FuIGdpdmUgZGlmZmVyZW50IHJvb3RzLCBpdCBpcyB1cCB0byB1c2VyIHRvIGRlY2lkZSB3aGljaCBvbmUgdGhleSB3YW50LlxuICogRm9yIGV4YW1wbGUgdGhlcmUgaXMgRnBTcXJ0T2RkL0ZwU3FydEV2ZW4gdG8gY2hvaWNlIHJvb3QgYmFzZWQgb24gb2RkbmVzcyAodXNlZCBmb3IgaGFzaC10by1jdXJ2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGcFNxcnQoUDogYmlnaW50KTogPFQ+KEZwOiBJRmllbGQ8VD4sIG46IFQpID0+IFQge1xuICAvLyBQIFx1MjI2MSAzIChtb2QgNCkgPT4gXHUyMjFBbiA9IG5eKChQKzEpLzQpXG4gIGlmIChQICUgXzRuID09PSBfM24pIHJldHVybiBzcXJ0M21vZDQ7XG4gIC8vIFAgXHUyMjYxIDUgKG1vZCA4KSA9PiBBdGtpbiBhbGdvcml0aG0sIHBhZ2UgMTAgb2YgaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMi82ODUucGRmXG4gIGlmIChQICUgXzhuID09PSBfNW4pIHJldHVybiBzcXJ0NW1vZDg7XG4gIC8vIFAgXHUyMjYxIDkgKG1vZCAxNikgPT4gS29uZyBhbGdvcml0aG0sIHBhZ2UgMTEgb2YgaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMi82ODUucGRmIChhbGdvcml0aG0gNClcbiAgaWYgKFAgJSBfMTZuID09PSBfOW4pIHJldHVybiBzcXJ0OW1vZDE2KFApO1xuICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG1cbiAgcmV0dXJuIHRvbmVsbGlTaGFua3MoUCk7XG59XG5cbi8vIExpdHRsZS1lbmRpYW4gY2hlY2sgZm9yIGZpcnN0IExFIGJpdCAobGFzdCBCRSBiaXQpO1xuZXhwb3J0IGNvbnN0IGlzTmVnYXRpdmVMRSA9IChudW06IGJpZ2ludCwgbW9kdWxvOiBiaWdpbnQpOiBib29sZWFuID0+XG4gIChtb2QobnVtLCBtb2R1bG8pICYgXzFuKSA9PT0gXzFuO1xuXG4vKiogRmllbGQgaXMgbm90IGFsd2F5cyBvdmVyIHByaW1lOiBmb3IgZXhhbXBsZSwgRnAyIGhhcyBPUkRFUihxKT1wXm0uICovXG5leHBvcnQgaW50ZXJmYWNlIElGaWVsZDxUPiB7XG4gIE9SREVSOiBiaWdpbnQ7XG4gIEJZVEVTOiBudW1iZXI7XG4gIEJJVFM6IG51bWJlcjtcbiAgaXNMRTogYm9vbGVhbjtcbiAgWkVSTzogVDtcbiAgT05FOiBUO1xuICAvLyAxLWFyZ1xuICBjcmVhdGU6IChudW06IFQpID0+IFQ7XG4gIGlzVmFsaWQ6IChudW06IFQpID0+IGJvb2xlYW47XG4gIGlzMDogKG51bTogVCkgPT4gYm9vbGVhbjtcbiAgaXNWYWxpZE5vdDA6IChudW06IFQpID0+IGJvb2xlYW47XG4gIG5lZyhudW06IFQpOiBUO1xuICBpbnYobnVtOiBUKTogVDtcbiAgc3FydChudW06IFQpOiBUO1xuICBzcXIobnVtOiBUKTogVDtcbiAgLy8gMi1hcmdzXG4gIGVxbChsaHM6IFQsIHJoczogVCk6IGJvb2xlYW47XG4gIGFkZChsaHM6IFQsIHJoczogVCk6IFQ7XG4gIHN1YihsaHM6IFQsIHJoczogVCk6IFQ7XG4gIG11bChsaHM6IFQsIHJoczogVCB8IGJpZ2ludCk6IFQ7XG4gIHBvdyhsaHM6IFQsIHBvd2VyOiBiaWdpbnQpOiBUO1xuICBkaXYobGhzOiBULCByaHM6IFQgfCBiaWdpbnQpOiBUO1xuICAvLyBOIGZvciBOb25Ob3JtYWxpemVkIChmb3Igbm93KVxuICBhZGROKGxoczogVCwgcmhzOiBUKTogVDtcbiAgc3ViTihsaHM6IFQsIHJoczogVCk6IFQ7XG4gIG11bE4obGhzOiBULCByaHM6IFQgfCBiaWdpbnQpOiBUO1xuICBzcXJOKG51bTogVCk6IFQ7XG5cbiAgLy8gT3B0aW9uYWxcbiAgLy8gU2hvdWxkIGJlIHNhbWUgYXMgc2duMCBmdW5jdGlvbiBpblxuICAvLyBbUkZDOTM4MF0oaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkzODAjc2VjdGlvbi00LjEpLlxuICAvLyBOT1RFOiBzZ24wIGlzICduZWdhdGl2ZSBpbiBMRScsIHdoaWNoIGlzIHNhbWUgYXMgb2RkLiBBbmQgbmVnYXRpdmUgaW4gTEUgaXMga2luZGEgc3RyYW5nZSBkZWZpbml0aW9uIGFueXdheS5cbiAgaXNPZGQ/KG51bTogVCk6IGJvb2xlYW47IC8vIE9kZCBpbnN0ZWFkIG9mIGV2ZW4gc2luY2Ugd2UgaGF2ZSBpdCBmb3IgRnAyXG4gIC8vIGxlZ2VuZHJlPyhudW06IFQpOiBUO1xuICBpbnZlcnRCYXRjaDogKGxzdDogVFtdKSA9PiBUW107XG4gIHRvQnl0ZXMobnVtOiBUKTogVWludDhBcnJheTtcbiAgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5LCBza2lwVmFsaWRhdGlvbj86IGJvb2xlYW4pOiBUO1xuICAvLyBJZiBjIGlzIEZhbHNlLCBDTU9WIHJldHVybnMgYSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYi5cbiAgY21vdihhOiBULCBiOiBULCBjOiBib29sZWFuKTogVDtcbn1cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgRklFTERfRklFTERTID0gW1xuICAnY3JlYXRlJywgJ2lzVmFsaWQnLCAnaXMwJywgJ25lZycsICdpbnYnLCAnc3FydCcsICdzcXInLFxuICAnZXFsJywgJ2FkZCcsICdzdWInLCAnbXVsJywgJ3BvdycsICdkaXYnLFxuICAnYWRkTicsICdzdWJOJywgJ211bE4nLCAnc3FyTidcbl0gYXMgY29uc3Q7XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWVsZDxUPihmaWVsZDogSUZpZWxkPFQ+KTogSUZpZWxkPFQ+IHtcbiAgY29uc3QgaW5pdGlhbCA9IHtcbiAgICBPUkRFUjogJ2JpZ2ludCcsXG4gICAgQllURVM6ICdudW1iZXInLFxuICAgIEJJVFM6ICdudW1iZXInLFxuICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IG9wdHMgPSBGSUVMRF9GSUVMRFMucmVkdWNlKChtYXAsIHZhbDogc3RyaW5nKSA9PiB7XG4gICAgbWFwW3ZhbF0gPSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiBtYXA7XG4gIH0sIGluaXRpYWwpO1xuICB2YWxpZGF0ZU9iamVjdChmaWVsZCwgb3B0cyk7XG4gIC8vIGNvbnN0IG1heCA9IDE2Mzg0O1xuICAvLyBpZiAoZmllbGQuQllURVMgPCAxIHx8IGZpZWxkLkJZVEVTID4gbWF4KSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmllbGQnKTtcbiAgLy8gaWYgKGZpZWxkLkJJVFMgPCAxIHx8IGZpZWxkLkJJVFMgPiA4ICogbWF4KSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmllbGQnKTtcbiAgcmV0dXJuIGZpZWxkO1xufVxuXG4vLyBHZW5lcmljIGZpZWxkIGZ1bmN0aW9uc1xuXG4vKipcbiAqIFNhbWUgYXMgYHBvd2AgYnV0IGZvciBGcDogbm9uLWNvbnN0YW50LXRpbWUuXG4gKiBVbnNhZmUgaW4gc29tZSBjb250ZXh0czogdXNlcyBsYWRkZXIsIHNvIGNhbiBleHBvc2UgYmlnaW50IGJpdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGcFBvdzxUPihGcDogSUZpZWxkPFQ+LCBudW06IFQsIHBvd2VyOiBiaWdpbnQpOiBUIHtcbiAgaWYgKHBvd2VyIDwgXzBuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZXhwb25lbnQsIG5lZ2F0aXZlcyB1bnN1cHBvcnRlZCcpO1xuICBpZiAocG93ZXIgPT09IF8wbikgcmV0dXJuIEZwLk9ORTtcbiAgaWYgKHBvd2VyID09PSBfMW4pIHJldHVybiBudW07XG4gIGxldCBwID0gRnAuT05FO1xuICBsZXQgZCA9IG51bTtcbiAgd2hpbGUgKHBvd2VyID4gXzBuKSB7XG4gICAgaWYgKHBvd2VyICYgXzFuKSBwID0gRnAubXVsKHAsIGQpO1xuICAgIGQgPSBGcC5zcXIoZCk7XG4gICAgcG93ZXIgPj49IF8xbjtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuLyoqXG4gKiBFZmZpY2llbnRseSBpbnZlcnQgYW4gYXJyYXkgb2YgRmllbGQgZWxlbWVudHMuXG4gKiBFeGNlcHRpb24tZnJlZS4gV2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgZm9yIDAgZWxlbWVudHMuXG4gKiBAcGFyYW0gcGFzc1plcm8gbWFwIDAgdG8gMCAoaW5zdGVhZCBvZiB1bmRlZmluZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGcEludmVydEJhdGNoPFQ+KEZwOiBJRmllbGQ8VD4sIG51bXM6IFRbXSwgcGFzc1plcm8gPSBmYWxzZSk6IFRbXSB7XG4gIGNvbnN0IGludmVydGVkID0gbmV3IEFycmF5KG51bXMubGVuZ3RoKS5maWxsKHBhc3NaZXJvID8gRnAuWkVSTyA6IHVuZGVmaW5lZCk7XG4gIC8vIFdhbGsgZnJvbSBmaXJzdCB0byBsYXN0LCBtdWx0aXBseSB0aGVtIGJ5IGVhY2ggb3RoZXIgTU9EIHBcbiAgY29uc3QgbXVsdGlwbGllZEFjYyA9IG51bXMucmVkdWNlKChhY2MsIG51bSwgaSkgPT4ge1xuICAgIGlmIChGcC5pczAobnVtKSkgcmV0dXJuIGFjYztcbiAgICBpbnZlcnRlZFtpXSA9IGFjYztcbiAgICByZXR1cm4gRnAubXVsKGFjYywgbnVtKTtcbiAgfSwgRnAuT05FKTtcbiAgLy8gSW52ZXJ0IGxhc3QgZWxlbWVudFxuICBjb25zdCBpbnZlcnRlZEFjYyA9IEZwLmludihtdWx0aXBsaWVkQWNjKTtcbiAgLy8gV2FsayBmcm9tIGxhc3QgdG8gZmlyc3QsIG11bHRpcGx5IHRoZW0gYnkgaW52ZXJ0ZWQgZWFjaCBvdGhlciBNT0QgcFxuICBudW1zLnJlZHVjZVJpZ2h0KChhY2MsIG51bSwgaSkgPT4ge1xuICAgIGlmIChGcC5pczAobnVtKSkgcmV0dXJuIGFjYztcbiAgICBpbnZlcnRlZFtpXSA9IEZwLm11bChhY2MsIGludmVydGVkW2ldKTtcbiAgICByZXR1cm4gRnAubXVsKGFjYywgbnVtKTtcbiAgfSwgaW52ZXJ0ZWRBY2MpO1xuICByZXR1cm4gaW52ZXJ0ZWQ7XG59XG5cbi8vIFRPRE86IHJlbW92ZVxuZXhwb3J0IGZ1bmN0aW9uIEZwRGl2PFQ+KEZwOiBJRmllbGQ8VD4sIGxoczogVCwgcmhzOiBUIHwgYmlnaW50KTogVCB7XG4gIHJldHVybiBGcC5tdWwobGhzLCB0eXBlb2YgcmhzID09PSAnYmlnaW50JyA/IGludmVydChyaHMsIEZwLk9SREVSKSA6IEZwLmludihyaHMpKTtcbn1cblxuLyoqXG4gKiBMZWdlbmRyZSBzeW1ib2wuXG4gKiBMZWdlbmRyZSBjb25zdGFudCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBMZWdlbmRyZSBzeW1ib2wgKGEgfCBwKVxuICogd2hpY2ggZGVub3RlcyB0aGUgdmFsdWUgb2YgYV4oKHAtMSkvMikgKG1vZCBwKS5cbiAqXG4gKiAqIChhIHwgcCkgXHUyMjYxIDEgICAgaWYgYSBpcyBhIHNxdWFyZSAobW9kIHApLCBxdWFkcmF0aWMgcmVzaWR1ZVxuICogKiAoYSB8IHApIFx1MjI2MSAtMSAgIGlmIGEgaXMgbm90IGEgc3F1YXJlIChtb2QgcCksIHF1YWRyYXRpYyBub24gcmVzaWR1ZVxuICogKiAoYSB8IHApIFx1MjI2MSAwICAgIGlmIGEgXHUyMjYxIDAgKG1vZCBwKVxuICovXG5leHBvcnQgZnVuY3Rpb24gRnBMZWdlbmRyZTxUPihGcDogSUZpZWxkPFQ+LCBuOiBUKTogLTEgfCAwIHwgMSB7XG4gIC8vIFdlIGNhbiB1c2UgM3JkIGFyZ3VtZW50IGFzIG9wdGlvbmFsIGNhY2hlIG9mIHRoaXMgdmFsdWVcbiAgLy8gYnV0IHNlZW1zIHVubmVlZGVkIGZvciBub3cuIFRoZSBvcGVyYXRpb24gaXMgdmVyeSBmYXN0LlxuICBjb25zdCBwMW1vZDIgPSAoRnAuT1JERVIgLSBfMW4pIC8gXzJuO1xuICBjb25zdCBwb3dlcmVkID0gRnAucG93KG4sIHAxbW9kMik7XG4gIGNvbnN0IHllcyA9IEZwLmVxbChwb3dlcmVkLCBGcC5PTkUpO1xuICBjb25zdCB6ZXJvID0gRnAuZXFsKHBvd2VyZWQsIEZwLlpFUk8pO1xuICBjb25zdCBubyA9IEZwLmVxbChwb3dlcmVkLCBGcC5uZWcoRnAuT05FKSk7XG4gIGlmICgheWVzICYmICF6ZXJvICYmICFubykgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIExlZ2VuZHJlIHN5bWJvbCByZXN1bHQnKTtcbiAgcmV0dXJuIHllcyA/IDEgOiB6ZXJvID8gMCA6IC0xO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVHJ1ZSB3aGVuZXZlciB0aGUgdmFsdWUgeCBpcyBhIHNxdWFyZSBpbiB0aGUgZmllbGQgRi5cbmV4cG9ydCBmdW5jdGlvbiBGcElzU3F1YXJlPFQ+KEZwOiBJRmllbGQ8VD4sIG46IFQpOiBib29sZWFuIHtcbiAgY29uc3QgbCA9IEZwTGVnZW5kcmUoRnAsIG4pO1xuICByZXR1cm4gbCA9PT0gMTtcbn1cblxuZXhwb3J0IHR5cGUgTkxlbmd0aCA9IHsgbkJ5dGVMZW5ndGg6IG51bWJlcjsgbkJpdExlbmd0aDogbnVtYmVyIH07XG4vLyBDVVJWRS5uIGxlbmd0aHNcbmV4cG9ydCBmdW5jdGlvbiBuTGVuZ3RoKG46IGJpZ2ludCwgbkJpdExlbmd0aD86IG51bWJlcik6IE5MZW5ndGgge1xuICAvLyBCaXQgc2l6ZSwgYnl0ZSBzaXplIG9mIENVUlZFLm5cbiAgaWYgKG5CaXRMZW5ndGggIT09IHVuZGVmaW5lZCkgYW51bWJlcihuQml0TGVuZ3RoKTtcbiAgY29uc3QgX25CaXRMZW5ndGggPSBuQml0TGVuZ3RoICE9PSB1bmRlZmluZWQgPyBuQml0TGVuZ3RoIDogbi50b1N0cmluZygyKS5sZW5ndGg7XG4gIGNvbnN0IG5CeXRlTGVuZ3RoID0gTWF0aC5jZWlsKF9uQml0TGVuZ3RoIC8gOCk7XG4gIHJldHVybiB7IG5CaXRMZW5ndGg6IF9uQml0TGVuZ3RoLCBuQnl0ZUxlbmd0aCB9O1xufVxuXG50eXBlIEZwRmllbGQgPSBJRmllbGQ8YmlnaW50PiAmIFJlcXVpcmVkPFBpY2s8SUZpZWxkPGJpZ2ludD4sICdpc09kZCc+PjtcbnR5cGUgU3FydEZuID0gKG46IGJpZ2ludCkgPT4gYmlnaW50O1xudHlwZSBGaWVsZE9wdHMgPSBQYXJ0aWFsPHtcbiAgaXNMRTogYm9vbGVhbjtcbiAgQklUUzogbnVtYmVyO1xuICBzcXJ0OiBTcXJ0Rm47XG4gIGFsbG93ZWRMZW5ndGhzPzogcmVhZG9ubHkgbnVtYmVyW107IC8vIGZvciBQNTIxIChhZGRzIHBhZGRpbmcgZm9yIHNtYWxsZXIgc2l6ZXMpXG4gIG1vZEZyb21CeXRlczogYm9vbGVhbjsgLy8gYmxzMTItMzgxIHJlcXVpcmVzIG1vZChuKSBpbnN0ZWFkIG9mIHJlamVjdGluZyBrZXlzID49IG5cbn0+O1xuY2xhc3MgX0ZpZWxkIGltcGxlbWVudHMgSUZpZWxkPGJpZ2ludD4ge1xuICByZWFkb25seSBPUkRFUjogYmlnaW50O1xuICByZWFkb25seSBCSVRTOiBudW1iZXI7XG4gIHJlYWRvbmx5IEJZVEVTOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlzTEU6IGJvb2xlYW47XG4gIHJlYWRvbmx5IFpFUk8gPSBfMG47XG4gIHJlYWRvbmx5IE9ORSA9IF8xbjtcbiAgcmVhZG9ubHkgX2xlbmd0aHM/OiBudW1iZXJbXTtcbiAgcHJpdmF0ZSBfc3FydDogUmV0dXJuVHlwZTx0eXBlb2YgRnBTcXJ0PiB8IHVuZGVmaW5lZDsgLy8gY2FjaGVkIHNxcnRcbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kPzogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoT1JERVI6IGJpZ2ludCwgb3B0czogRmllbGRPcHRzID0ge30pIHtcbiAgICBpZiAoT1JERVIgPD0gXzBuKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmllbGQ6IGV4cGVjdGVkIE9SREVSID4gMCwgZ290ICcgKyBPUkRFUik7XG4gICAgbGV0IF9uYml0TGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc0xFID0gZmFsc2U7XG4gICAgaWYgKG9wdHMgIT0gbnVsbCAmJiB0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5CSVRTID09PSAnbnVtYmVyJykgX25iaXRMZW5ndGggPSBvcHRzLkJJVFM7XG4gICAgICBpZiAodHlwZW9mIG9wdHMuc3FydCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5zcXJ0ID0gb3B0cy5zcXJ0O1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmlzTEUgPT09ICdib29sZWFuJykgdGhpcy5pc0xFID0gb3B0cy5pc0xFO1xuICAgICAgaWYgKG9wdHMuYWxsb3dlZExlbmd0aHMpIHRoaXMuX2xlbmd0aHMgPSBvcHRzLmFsbG93ZWRMZW5ndGhzPy5zbGljZSgpO1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm1vZEZyb21CeXRlcyA9PT0gJ2Jvb2xlYW4nKSB0aGlzLl9tb2QgPSBvcHRzLm1vZEZyb21CeXRlcztcbiAgICB9XG4gICAgY29uc3QgeyBuQml0TGVuZ3RoLCBuQnl0ZUxlbmd0aCB9ID0gbkxlbmd0aChPUkRFUiwgX25iaXRMZW5ndGgpO1xuICAgIGlmIChuQnl0ZUxlbmd0aCA+IDIwNDgpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgb2YgPD0gMjA0OCBieXRlcycpO1xuICAgIHRoaXMuT1JERVIgPSBPUkRFUjtcbiAgICB0aGlzLkJJVFMgPSBuQml0TGVuZ3RoO1xuICAgIHRoaXMuQllURVMgPSBuQnl0ZUxlbmd0aDtcbiAgICB0aGlzLl9zcXJ0ID0gdW5kZWZpbmVkO1xuICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgfVxuXG4gIGNyZWF0ZShudW06IGJpZ2ludCkge1xuICAgIHJldHVybiBtb2QobnVtLCB0aGlzLk9SREVSKTtcbiAgfVxuICBpc1ZhbGlkKG51bTogYmlnaW50KSB7XG4gICAgaWYgKHR5cGVvZiBudW0gIT09ICdiaWdpbnQnKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZpZWxkIGVsZW1lbnQ6IGV4cGVjdGVkIGJpZ2ludCwgZ290ICcgKyB0eXBlb2YgbnVtKTtcbiAgICByZXR1cm4gXzBuIDw9IG51bSAmJiBudW0gPCB0aGlzLk9SREVSOyAvLyAwIGlzIHZhbGlkIGVsZW1lbnQsIGJ1dCBpdCdzIG5vdCBpbnZlcnRpYmxlXG4gIH1cbiAgaXMwKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuIG51bSA9PT0gXzBuO1xuICB9XG4gIC8vIGlzIHZhbGlkIGFuZCBpbnZlcnRpYmxlXG4gIGlzVmFsaWROb3QwKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuICF0aGlzLmlzMChudW0pICYmIHRoaXMuaXNWYWxpZChudW0pO1xuICB9XG4gIGlzT2RkKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuIChudW0gJiBfMW4pID09PSBfMW47XG4gIH1cbiAgbmVnKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuIG1vZCgtbnVtLCB0aGlzLk9SREVSKTtcbiAgfVxuICBlcWwobGhzOiBiaWdpbnQsIHJoczogYmlnaW50KSB7XG4gICAgcmV0dXJuIGxocyA9PT0gcmhzO1xuICB9XG5cbiAgc3FyKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuIG1vZChudW0gKiBudW0sIHRoaXMuT1JERVIpO1xuICB9XG4gIGFkZChsaHM6IGJpZ2ludCwgcmhzOiBiaWdpbnQpIHtcbiAgICByZXR1cm4gbW9kKGxocyArIHJocywgdGhpcy5PUkRFUik7XG4gIH1cbiAgc3ViKGxoczogYmlnaW50LCByaHM6IGJpZ2ludCkge1xuICAgIHJldHVybiBtb2QobGhzIC0gcmhzLCB0aGlzLk9SREVSKTtcbiAgfVxuICBtdWwobGhzOiBiaWdpbnQsIHJoczogYmlnaW50KSB7XG4gICAgcmV0dXJuIG1vZChsaHMgKiByaHMsIHRoaXMuT1JERVIpO1xuICB9XG4gIHBvdyhudW06IGJpZ2ludCwgcG93ZXI6IGJpZ2ludCk6IGJpZ2ludCB7XG4gICAgcmV0dXJuIEZwUG93KHRoaXMsIG51bSwgcG93ZXIpO1xuICB9XG4gIGRpdihsaHM6IGJpZ2ludCwgcmhzOiBiaWdpbnQpIHtcbiAgICByZXR1cm4gbW9kKGxocyAqIGludmVydChyaHMsIHRoaXMuT1JERVIpLCB0aGlzLk9SREVSKTtcbiAgfVxuXG4gIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBkb2Vzbid0IG5vcm1hbGl6ZVxuICBzcXJOKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuIG51bSAqIG51bTtcbiAgfVxuICBhZGROKGxoczogYmlnaW50LCByaHM6IGJpZ2ludCkge1xuICAgIHJldHVybiBsaHMgKyByaHM7XG4gIH1cbiAgc3ViTihsaHM6IGJpZ2ludCwgcmhzOiBiaWdpbnQpIHtcbiAgICByZXR1cm4gbGhzIC0gcmhzO1xuICB9XG4gIG11bE4obGhzOiBiaWdpbnQsIHJoczogYmlnaW50KSB7XG4gICAgcmV0dXJuIGxocyAqIHJocztcbiAgfVxuXG4gIGludihudW06IGJpZ2ludCkge1xuICAgIHJldHVybiBpbnZlcnQobnVtLCB0aGlzLk9SREVSKTtcbiAgfVxuICBzcXJ0KG51bTogYmlnaW50KTogYmlnaW50IHtcbiAgICAvLyBDYWNoaW5nIF9zcXJ0IHNwZWVkcyB1cCBzcXJ0OW1vZDE2IGJ5IDV4IGFuZCB0b25uZWxpLXNoYW5rcyBieSAxMCVcbiAgICBpZiAoIXRoaXMuX3NxcnQpIHRoaXMuX3NxcnQgPSBGcFNxcnQodGhpcy5PUkRFUik7XG4gICAgcmV0dXJuIHRoaXMuX3NxcnQodGhpcywgbnVtKTtcbiAgfVxuICB0b0J5dGVzKG51bTogYmlnaW50KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNMRSA/IG51bWJlclRvQnl0ZXNMRShudW0sIHRoaXMuQllURVMpIDogbnVtYmVyVG9CeXRlc0JFKG51bSwgdGhpcy5CWVRFUyk7XG4gIH1cbiAgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5LCBza2lwVmFsaWRhdGlvbiA9IGZhbHNlKSB7XG4gICAgYWJ5dGVzKGJ5dGVzKTtcbiAgICBjb25zdCB7IF9sZW5ndGhzOiBhbGxvd2VkTGVuZ3RocywgQllURVMsIGlzTEUsIE9SREVSLCBfbW9kOiBtb2RGcm9tQnl0ZXMgfSA9IHRoaXM7XG4gICAgaWYgKGFsbG93ZWRMZW5ndGhzKSB7XG4gICAgICBpZiAoIWFsbG93ZWRMZW5ndGhzLmluY2x1ZGVzKGJ5dGVzLmxlbmd0aCkgfHwgYnl0ZXMubGVuZ3RoID4gQllURVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGaWVsZC5mcm9tQnl0ZXM6IGV4cGVjdGVkICcgKyBhbGxvd2VkTGVuZ3RocyArICcgYnl0ZXMsIGdvdCAnICsgYnl0ZXMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShCWVRFUyk7XG4gICAgICAvLyBpc0xFIGFkZCAwIHRvIHJpZ2h0LCAhaXNMRSB0byB0aGUgbGVmdC5cbiAgICAgIHBhZGRlZC5zZXQoYnl0ZXMsIGlzTEUgPyAwIDogcGFkZGVkLmxlbmd0aCAtIGJ5dGVzLmxlbmd0aCk7XG4gICAgICBieXRlcyA9IHBhZGRlZDtcbiAgICB9XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gQllURVMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkLmZyb21CeXRlczogZXhwZWN0ZWQgJyArIEJZVEVTICsgJyBieXRlcywgZ290ICcgKyBieXRlcy5sZW5ndGgpO1xuICAgIGxldCBzY2FsYXIgPSBpc0xFID8gYnl0ZXNUb051bWJlckxFKGJ5dGVzKSA6IGJ5dGVzVG9OdW1iZXJCRShieXRlcyk7XG4gICAgaWYgKG1vZEZyb21CeXRlcykgc2NhbGFyID0gbW9kKHNjYWxhciwgT1JERVIpO1xuICAgIGlmICghc2tpcFZhbGlkYXRpb24pXG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZChzY2FsYXIpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmllbGQgZWxlbWVudDogb3V0c2lkZSBvZiByYW5nZSAwLi5PUkRFUicpO1xuICAgIC8vIE5PVEU6IHdlIGRvbid0IHZhbGlkYXRlIHNjYWxhciBoZXJlLCBwbGVhc2UgdXNlIGlzVmFsaWQuIFRoaXMgZG9uZSBzdWNoIHdheSBiZWNhdXNlIHNvbWVcbiAgICAvLyBwcm90b2NvbCBtYXkgYWxsb3cgbm9uLXJlZHVjZWQgc2NhbGFyIHRoYXQgcmVkdWNlZCBsYXRlciBvciBjaGFuZ2VkIHNvbWUgb3RoZXIgd2F5LlxuICAgIHJldHVybiBzY2FsYXI7XG4gIH1cbiAgLy8gVE9ETzogd2UgZG9uJ3QgbmVlZCBpdCBoZXJlLCBtb3ZlIG91dCB0byBzZXBhcmF0ZSBmblxuICBpbnZlcnRCYXRjaChsc3Q6IGJpZ2ludFtdKTogYmlnaW50W10ge1xuICAgIHJldHVybiBGcEludmVydEJhdGNoKHRoaXMsIGxzdCk7XG4gIH1cbiAgLy8gV2UgY2FuJ3QgbW92ZSB0aGlzIG91dCBiZWNhdXNlIEZwNiwgRnAxMiBpbXBsZW1lbnQgaXRcbiAgLy8gYW5kIGl0J3MgdW5jbGVhciB3aGF0IHRvIHJldHVybiBpbiB0aGVyZS5cbiAgY21vdihhOiBiaWdpbnQsIGI6IGJpZ2ludCwgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbiA/IGIgOiBhO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZpbml0ZSBmaWVsZC4gTWFqb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uczpcbiAqICogMS4gRGVub3JtYWxpemVkIG9wZXJhdGlvbnMgbGlrZSBtdWxOIGluc3RlYWQgb2YgbXVsLlxuICogKiAyLiBJZGVudGljYWwgb2JqZWN0IHNoYXBlOiBuZXZlciBhZGQgb3IgcmVtb3ZlIGtleXMuXG4gKiAqIDMuIGBPYmplY3QuZnJlZXplYC5cbiAqIEZyYWdpbGU6IGFsd2F5cyBydW4gYSBiZW5jaG1hcmsgb24gYSBjaGFuZ2UuXG4gKiBTZWN1cml0eSBub3RlOiBvcGVyYXRpb25zIGRvbid0IGNoZWNrICdpc1ZhbGlkJyBmb3IgYWxsIGVsZW1lbnRzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLFxuICogaXQgaXMgY2FsbGVyIHJlc3BvbnNpYmlsaXR5IHRvIGNoZWNrIHRoaXMuXG4gKiBUaGlzIGlzIGxvdy1sZXZlbCBjb2RlLCBwbGVhc2UgbWFrZSBzdXJlIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICpcbiAqIE5vdGUgYWJvdXQgZmllbGQgcHJvcGVydGllczpcbiAqICogQ0hBUkFDVEVSSVNUSUMgcCA9IHByaW1lIG51bWJlciwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIG1haW4gc3ViZ3JvdXAuXG4gKiAqIE9SREVSIHEgPSBzaW1pbGFyIHRvIGNvZmFjdG9yIGluIGN1cnZlcywgbWF5IGJlIGNvbXBvc2l0ZSBgcSA9IHBebWAuXG4gKlxuICogQHBhcmFtIE9SREVSIGZpZWxkIG9yZGVyLCBwcm9iYWJseSBwcmltZSwgb3IgY291bGQgYmUgY29tcG9zaXRlXG4gKiBAcGFyYW0gYml0TGVuIGhvdyBtYW55IGJpdHMgdGhlIGZpZWxkIGNvbnN1bWVzXG4gKiBAcGFyYW0gaXNMRSAoZGVmYXVsdDogZmFsc2UpIGlmIGVuY29kaW5nIC8gZGVjb2Rpbmcgc2hvdWxkIGJlIGluIGxpdHRsZS1lbmRpYW5cbiAqIEBwYXJhbSByZWRlZiBvcHRpb25hbCBmYXN0ZXIgcmVkZWZpbml0aW9ucyBvZiBzcXJ0IGFuZCBvdGhlciBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGaWVsZChPUkRFUjogYmlnaW50LCBvcHRzOiBGaWVsZE9wdHMgPSB7fSk6IFJlYWRvbmx5PEZwRmllbGQ+IHtcbiAgcmV0dXJuIG5ldyBfRmllbGQoT1JERVIsIG9wdHMpO1xufVxuXG4vLyBHZW5lcmljIHJhbmRvbSBzY2FsYXIsIHdlIGNhbiBkbyBzYW1lIGZvciBvdGhlciBmaWVsZHMgaWYgdmlhIEZwMi5tdWwoRnAyLk9ORSwgRnAyLnJhbmRvbSk/XG4vLyBUaGlzIGFsbG93cyB1bnNhZmUgbWV0aG9kcyBsaWtlIGlnbm9yZSBiaWFzIG9yIHplcm8uIFRoZXNlIHVuc2FmZSwgYnV0IG9mdGVuIHVzZWQgaW4gZGlmZmVyZW50IHByb3RvY29scyAoaWYgZGV0ZXJtaW5pc3RpYyBSTkcpLlxuLy8gd2hpY2ggbWVhbiB3ZSBjYW5ub3QgZm9yY2UgdGhpcyB2aWEgb3B0cy5cbi8vIE5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCByYW5kb21CeXRlcywgd2UgY2FuIGFjY2VwdCBpdCBpbnNpZGUgb3B0cyBpZiB3YW50ZWQuXG4vLyBQcm9iYWJseSBuZWVkIHRvIGV4cG9ydCBnZXRNaW5IYXNoTGVuZ3RoIHNvbWV3aGVyZT9cbi8vIHJhbmRvbShieXRlcz86IFVpbnQ4QXJyYXksIHVuc2FmZUFsbG93WmVybyA9IGZhbHNlLCB1bnNhZmVBbGxvd0JpYXMgPSBmYWxzZSkge1xuLy8gICBjb25zdCBMRU4gPSAhdW5zYWZlQWxsb3dCaWFzID8gZ2V0TWluSGFzaExlbmd0aChPUkRFUikgOiBCWVRFUztcbi8vICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQpIGJ5dGVzID0gcmFuZG9tQnl0ZXMoTEVOKTsgLy8gX29wdHMucmFuZG9tQnl0ZXM/XG4vLyAgIGNvbnN0IG51bSA9IGlzTEUgPyBieXRlc1RvTnVtYmVyTEUoYnl0ZXMpIDogYnl0ZXNUb051bWJlckJFKGJ5dGVzKTtcbi8vICAgLy8gYG1vZCh4LCAxMSlgIGNhbiBzb21ldGltZXMgcHJvZHVjZSAwLiBgbW9kKHgsIDEwKSArIDFgIGlzIHRoZSBzYW1lLCBidXQgbm8gMFxuLy8gICBjb25zdCByZWR1Y2VkID0gdW5zYWZlQWxsb3daZXJvID8gbW9kKG51bSwgT1JERVIpIDogbW9kKG51bSwgT1JERVIgLSBfMW4pICsgXzFuO1xuLy8gICByZXR1cm4gcmVkdWNlZDtcbi8vIH0sXG5cbmV4cG9ydCBmdW5jdGlvbiBGcFNxcnRPZGQ8VD4oRnA6IElGaWVsZDxUPiwgZWxtOiBUKTogVCB7XG4gIGlmICghRnAuaXNPZGQpIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIGRvZXNuJ3QgaGF2ZSBpc09kZFwiKTtcbiAgY29uc3Qgcm9vdCA9IEZwLnNxcnQoZWxtKTtcbiAgcmV0dXJuIEZwLmlzT2RkKHJvb3QpID8gcm9vdCA6IEZwLm5lZyhyb290KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZwU3FydEV2ZW48VD4oRnA6IElGaWVsZDxUPiwgZWxtOiBUKTogVCB7XG4gIGlmICghRnAuaXNPZGQpIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIGRvZXNuJ3QgaGF2ZSBpc09kZFwiKTtcbiAgY29uc3Qgcm9vdCA9IEZwLnNxcnQoZWxtKTtcbiAgcmV0dXJuIEZwLmlzT2RkKHJvb3QpID8gRnAubmVnKHJvb3QpIDogcm9vdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRvdGFsIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBieSB0aGUgZmllbGQgZWxlbWVudC5cbiAqIEZvciBleGFtcGxlLCAzMiBieXRlcyBmb3IgdXN1YWwgMjU2LWJpdCB3ZWllcnN0cmFzcyBjdXJ2ZS5cbiAqIEBwYXJhbSBmaWVsZE9yZGVyIG51bWJlciBvZiBmaWVsZCBlbGVtZW50cywgdXN1YWxseSBDVVJWRS5uXG4gKiBAcmV0dXJucyBieXRlIGxlbmd0aCBvZiBmaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRCeXRlc0xlbmd0aChmaWVsZE9yZGVyOiBiaWdpbnQpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIGZpZWxkT3JkZXIgIT09ICdiaWdpbnQnKSB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG9yZGVyIG11c3QgYmUgYmlnaW50Jyk7XG4gIGNvbnN0IGJpdExlbmd0aCA9IGZpZWxkT3JkZXIudG9TdHJpbmcoMikubGVuZ3RoO1xuICByZXR1cm4gTWF0aC5jZWlsKGJpdExlbmd0aCAvIDgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbWluaW1hbCBhbW91bnQgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgc2FmZWx5IHJlZHVjZWRcbiAqIGJ5IGZpZWxkIG9yZGVyLlxuICogU2hvdWxkIGJlIDJeLTEyOCBmb3IgMTI4LWJpdCBjdXJ2ZSBzdWNoIGFzIFAyNTYuXG4gKiBAcGFyYW0gZmllbGRPcmRlciBudW1iZXIgb2YgZmllbGQgZWxlbWVudHMsIHVzdWFsbHkgQ1VSVkUublxuICogQHJldHVybnMgYnl0ZSBsZW5ndGggb2YgdGFyZ2V0IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbkhhc2hMZW5ndGgoZmllbGRPcmRlcjogYmlnaW50KTogbnVtYmVyIHtcbiAgY29uc3QgbGVuZ3RoID0gZ2V0RmllbGRCeXRlc0xlbmd0aChmaWVsZE9yZGVyKTtcbiAgcmV0dXJuIGxlbmd0aCArIE1hdGguY2VpbChsZW5ndGggLyAyKTtcbn1cblxuLyoqXG4gKiBcIkNvbnN0YW50LXRpbWVcIiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIHV0aWxpdHkuXG4gKiBDYW4gdGFrZSAobiArIG4vMikgb3IgbW9yZSBieXRlcyBvZiB1bmlmb3JtIGlucHV0IGUuZy4gZnJvbSBDU1BSTkcgb3IgS0RGXG4gKiBhbmQgY29udmVydCB0aGVtIGludG8gcHJpdmF0ZSBzY2FsYXIsIHdpdGggdGhlIG1vZHVsbyBiaWFzIGJlaW5nIG5lZ2xpZ2libGUuXG4gKiBOZWVkcyBhdCBsZWFzdCA0OCBieXRlcyBvZiBpbnB1dCBmb3IgMzItYnl0ZSBwcml2YXRlIGtleS5cbiAqIGh0dHBzOi8vcmVzZWFyY2gua3VkZWxza2lzZWN1cml0eS5jb20vMjAyMC8wNy8yOC90aGUtZGVmaW5pdGl2ZS1ndWlkZS10by1tb2R1bG8tYmlhcy1hbmQtaG93LXRvLWF2b2lkLWl0L1xuICogRklQUyAxODYtNSwgQS4yIGh0dHBzOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZGV0YWlsL2ZpcHMvMTg2LzUvZmluYWxcbiAqIFJGQyA5MzgwLCBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTM4MCNzZWN0aW9uLTVcbiAqIEBwYXJhbSBoYXNoIGhhc2ggb3V0cHV0IGZyb20gU0hBMyBvciBhIHNpbWlsYXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBncm91cE9yZGVyIHNpemUgb2Ygc3ViZ3JvdXAgLSAoZS5nLiBzZWNwMjU2azEuUG9pbnQuRm4uT1JERVIpXG4gKiBAcGFyYW0gaXNMRSBpbnRlcnByZXQgaGFzaCBieXRlcyBhcyBMRSBudW1cbiAqIEByZXR1cm5zIHZhbGlkIHByaXZhdGUgc2NhbGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBIYXNoVG9GaWVsZChrZXk6IFVpbnQ4QXJyYXksIGZpZWxkT3JkZXI6IGJpZ2ludCwgaXNMRSA9IGZhbHNlKTogVWludDhBcnJheSB7XG4gIGFieXRlcyhrZXkpO1xuICBjb25zdCBsZW4gPSBrZXkubGVuZ3RoO1xuICBjb25zdCBmaWVsZExlbiA9IGdldEZpZWxkQnl0ZXNMZW5ndGgoZmllbGRPcmRlcik7XG4gIGNvbnN0IG1pbkxlbiA9IGdldE1pbkhhc2hMZW5ndGgoZmllbGRPcmRlcik7XG4gIC8vIE5vIHNtYWxsIG51bWJlcnM6IG5lZWQgdG8gdW5kZXJzdGFuZCBiaWFzIHN0b3J5LiBObyBodWdlIG51bWJlcnM6IGVhc2llciB0byBkZXRlY3QgSlMgdGltaW5ncy5cbiAgaWYgKGxlbiA8IDE2IHx8IGxlbiA8IG1pbkxlbiB8fCBsZW4gPiAxMDI0KVxuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgJyArIG1pbkxlbiArICctMTAyNCBieXRlcyBvZiBpbnB1dCwgZ290ICcgKyBsZW4pO1xuICBjb25zdCBudW0gPSBpc0xFID8gYnl0ZXNUb051bWJlckxFKGtleSkgOiBieXRlc1RvTnVtYmVyQkUoa2V5KTtcbiAgLy8gYG1vZCh4LCAxMSlgIGNhbiBzb21ldGltZXMgcHJvZHVjZSAwLiBgbW9kKHgsIDEwKSArIDFgIGlzIHRoZSBzYW1lLCBidXQgbm8gMFxuICBjb25zdCByZWR1Y2VkID0gbW9kKG51bSwgZmllbGRPcmRlciAtIF8xbikgKyBfMW47XG4gIHJldHVybiBpc0xFID8gbnVtYmVyVG9CeXRlc0xFKHJlZHVjZWQsIGZpZWxkTGVuKSA6IG51bWJlclRvQnl0ZXNCRShyZWR1Y2VkLCBmaWVsZExlbik7XG59XG4iLCAiLyoqXG4gKiBTaG9ydCBXZWllcnN0cmFzcyBjdXJ2ZSBtZXRob2RzLiBUaGUgZm9ybXVsYSBpczogeVx1MDBCMiA9IHhcdTAwQjMgKyBheCArIGIuXG4gKlxuICogIyMjIERlc2lnbiByYXRpb25hbGUgZm9yIHR5cGVzXG4gKlxuICogKiBJbnRlcmFjdGlvbiBiZXR3ZWVuIGNsYXNzZXMgZnJvbSBkaWZmZXJlbnQgY3VydmVzIHNob3VsZCBmYWlsOlxuICogICBgazI1Ni5Qb2ludC5CQVNFLmFkZChwMjU2LlBvaW50LkJBU0UpYFxuICogKiBGb3IgdGhpcyBwdXJwb3NlIHdlIHdhbnQgdG8gdXNlIGBpbnN0YW5jZW9mYCBvcGVyYXRvciwgd2hpY2ggaXMgZmFzdCBhbmQgd29ya3MgZHVyaW5nIHJ1bnRpbWVcbiAqICogRGlmZmVyZW50IGNhbGxzIG9mIGBjdXJ2ZSgpYCB3b3VsZCByZXR1cm4gZGlmZmVyZW50IGNsYXNzZXMgLVxuICogICBgY3VydmUocGFyYW1zKSAhPT0gY3VydmUocGFyYW1zKWA6IGlmIHNvbWVib2R5IGRlY2lkZWQgdG8gbW9ua2V5LXBhdGNoIHRoZWlyIGN1cnZlLFxuICogICBpdCB3b24ndCBhZmZlY3Qgb3RoZXJzXG4gKlxuICogVHlwZVNjcmlwdCBjYW4ndCBpbmZlciB0eXBlcyBmb3IgY2xhc3NlcyBjcmVhdGVkIGluc2lkZSBhIGZ1bmN0aW9uLiBDbGFzc2VzIGlzIG9uZSBpbnN0YW5jZVxuICogb2Ygbm9taW5hdGl2ZSB0eXBlcyBpbiBUeXBlU2NyaXB0IGFuZCBpbnRlcmZhY2VzIG9ubHkgY2hlY2sgZm9yIHNoYXBlLCBzbyBpdCdzIGhhcmQgdG8gY3JlYXRlXG4gKiB1bmlxdWUgdHlwZSBmb3IgZXZlcnkgZnVuY3Rpb24gY2FsbC5cbiAqXG4gKiBXZSBjYW4gdXNlIGdlbmVyaWMgdHlwZXMgdmlhIHNvbWUgcGFyYW0sIGxpa2UgY3VydmUgb3B0cywgYnV0IHRoYXQgd291bGQ6XG4gKiAgICAgMS4gRW5hYmxlIGludGVyYWN0aW9uIGJldHdlZW4gYGN1cnZlKHBhcmFtcylgIGFuZCBgY3VydmUocGFyYW1zKWAgKGN1cnZlcyBvZiBzYW1lIHBhcmFtcylcbiAqICAgICB3aGljaCBpcyBoYXJkIHRvIGRlYnVnLlxuICogICAgIDIuIFBhcmFtcyBjYW4gYmUgZ2VuZXJpYyBhbmQgd2UgY2FuJ3QgZW5mb3JjZSB0aGVtIHRvIGJlIGNvbnN0YW50IHZhbHVlOlxuICogICAgIGlmIHNvbWVib2R5IGNyZWF0ZXMgY3VydmUgZnJvbSBub24tY29uc3RhbnQgcGFyYW1zLFxuICogICAgIGl0IHdvdWxkIGJlIGFsbG93ZWQgdG8gaW50ZXJhY3Qgd2l0aCBvdGhlciBjdXJ2ZXMgd2l0aCBub24tY29uc3RhbnQgcGFyYW1zXG4gKlxuICogQHRvZG8gaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svcmVsZWFzZS1ub3Rlcy90eXBlc2NyaXB0LTItNy5odG1sI3VuaXF1ZS1zeW1ib2xcbiAqIEBtb2R1bGVcbiAqL1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuaW1wb3J0IHsgaG1hYyBhcyBub2JsZUhtYWMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL2htYWMuanMnO1xuaW1wb3J0IHsgYWhhc2ggfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmltcG9ydCB7XG4gIGFib29sLFxuICBhYnl0ZXMsXG4gIGFJblJhbmdlLFxuICBiaXRMZW4sXG4gIGJpdE1hc2ssXG4gIGJ5dGVzVG9IZXgsXG4gIGJ5dGVzVG9OdW1iZXJCRSxcbiAgY29uY2F0Qnl0ZXMsXG4gIGNyZWF0ZUhtYWNEcmJnLFxuICBoZXhUb0J5dGVzLFxuICBpc0J5dGVzLFxuICBtZW1vaXplZCxcbiAgbnVtYmVyVG9IZXhVbnBhZGRlZCxcbiAgdmFsaWRhdGVPYmplY3QsXG4gIHJhbmRvbUJ5dGVzIGFzIHdjUmFuZG9tQnl0ZXMsXG4gIHR5cGUgQ0hhc2gsXG4gIHR5cGUgU2lnbmVyLFxufSBmcm9tICcuLi91dGlscy50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVDdXJ2ZUZpZWxkcyxcbiAgY3JlYXRlS2V5Z2VuLFxuICBtdWxFbmRvVW5zYWZlLFxuICBuZWdhdGVDdCxcbiAgbm9ybWFsaXplWixcbiAgd05BRixcbiAgdHlwZSBBZmZpbmVQb2ludCxcbiAgdHlwZSBDdXJ2ZUxlbmd0aHMsXG4gIHR5cGUgQ3VydmVQb2ludCxcbiAgdHlwZSBDdXJ2ZVBvaW50Q29ucyxcbn0gZnJvbSAnLi9jdXJ2ZS50cyc7XG5pbXBvcnQge1xuICBGcEludmVydEJhdGNoLFxuICBnZXRNaW5IYXNoTGVuZ3RoLFxuICBtYXBIYXNoVG9GaWVsZCxcbiAgdmFsaWRhdGVGaWVsZCxcbiAgdHlwZSBJRmllbGQsXG59IGZyb20gJy4vbW9kdWxhci50cyc7XG5cbmV4cG9ydCB0eXBlIHsgQWZmaW5lUG9pbnQgfTtcblxudHlwZSBFbmRvQmFzaXMgPSBbW2JpZ2ludCwgYmlnaW50XSwgW2JpZ2ludCwgYmlnaW50XV07XG4vKipcbiAqIFdoZW4gV2VpZXJzdHJhc3MgY3VydmUgaGFzIGBhPTBgLCBpdCBiZWNvbWVzIEtvYmxpdHogY3VydmUuXG4gKiBLb2JsaXR6IGN1cnZlcyBhbGxvdyB1c2luZyAqKmVmZmljaWVudGx5LWNvbXB1dGFibGUgR0xWIGVuZG9tb3JwaGlzbSBcdTAzQzgqKi5cbiAqIEVuZG9tb3JwaGlzbSB1c2VzIDJ4IGxlc3MgUkFNLCBzcGVlZHMgdXAgcHJlY29tcHV0YXRpb24gYnkgMnggYW5kIEVDREggLyBrZXkgcmVjb3ZlcnkgYnkgMjAlLlxuICogRm9yIHByZWNvbXB1dGVkIHdOQUYgaXQgdHJhZGVzIG9mZiAxLzIgaW5pdCB0aW1lICYgMS8zIHJhbSBmb3IgMjAlIHBlcmYgaGl0LlxuICpcbiAqIEVuZG9tb3JwaGlzbSBjb25zaXN0cyBvZiBiZXRhLCBsYW1iZGEgYW5kIHNwbGl0U2NhbGFyOlxuICpcbiAqIDEuIEdMViBlbmRvbW9ycGhpc20gXHUwM0M4IHRyYW5zZm9ybXMgYSBwb2ludDogYFAgPSAoeCwgeSkgXHUyMUE2IFx1MDNDOChQKSA9IChcdTAzQjJcdTAwQjd4IG1vZCBwLCB5KWBcbiAqIDIuIEdMViBzY2FsYXIgZGVjb21wb3NpdGlvbiB0cmFuc2Zvcm1zIGEgc2NhbGFyOiBgayBcdTIyNjEga1x1MjA4MSArIGtcdTIwODJcdTAwQjdcdTAzQkIgKG1vZCBuKWBcbiAqIDMuIFRoZW4gdGhlc2UgYXJlIGNvbWJpbmVkOiBga1x1MDBCN1AgPSBrXHUyMDgxXHUwMEI3UCArIGtcdTIwODJcdTAwQjdcdTAzQzgoUClgXG4gKiA0LiBUd28gMTI4LWJpdCBwb2ludC1ieS1zY2FsYXIgbXVsdGlwbGljYXRpb25zICsgb25lIHBvaW50IGFkZGl0aW9uIGlzIGZhc3RlciB0aGFuXG4gKiAgICBvbmUgMjU2LWJpdCBtdWx0aXBsaWNhdGlvbi5cbiAqXG4gKiB3aGVyZVxuICogKiBiZXRhOiBcdTAzQjIgXHUyMjA4IEZcdTIwOUEgd2l0aCBcdTAzQjJcdTAwQjMgPSAxLCBcdTAzQjIgXHUyMjYwIDFcbiAqICogbGFtYmRhOiBcdTAzQkIgXHUyMjA4IEZcdTIwOTkgd2l0aCBcdTAzQkJcdTAwQjMgPSAxLCBcdTAzQkIgXHUyMjYwIDFcbiAqICogc3BsaXRTY2FsYXIgZGVjb21wb3NlcyBrIFx1MjFBNiBrXHUyMDgxLCBrXHUyMDgyLCBieSB1c2luZyByZWR1Y2VkIGJhc2lzIHZlY3RvcnMuXG4gKiAgIEdhdXNzIGxhdHRpY2UgcmVkdWN0aW9uIGNhbGN1bGF0ZXMgdGhlbSBmcm9tIGluaXRpYWwgYmFzaXMgdmVjdG9ycyBgKG4sIDApLCAoLVx1MDNCQiwgMClgXG4gKlxuICogQ2hlY2sgb3V0IGB0ZXN0L21pc2MvZW5kb21vcnBoaXNtLmpzYCBhbmRcbiAqIFtnaXN0XShodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsbWlsbHIvZWI2NzA4MDY3OTNlODRkZjYyOGE3YzQzNGE4NzMwNjYpLlxuICovXG5leHBvcnQgdHlwZSBFbmRvbW9ycGhpc21PcHRzID0ge1xuICBiZXRhOiBiaWdpbnQ7XG4gIGJhc2lzZXM/OiBFbmRvQmFzaXM7XG4gIHNwbGl0U2NhbGFyPzogKGs6IGJpZ2ludCkgPT4geyBrMW5lZzogYm9vbGVhbjsgazE6IGJpZ2ludDsgazJuZWc6IGJvb2xlYW47IGsyOiBiaWdpbnQgfTtcbn07XG4vLyBXZSBjb25zdHJ1Y3QgYmFzaXMgaW4gc3VjaCB3YXkgdGhhdCBkZW4gaXMgYWx3YXlzIHBvc2l0aXZlIGFuZCBlcXVhbHMgbiwgYnV0IG51bSBzaWduIGRlcGVuZHMgb24gYmFzaXMgKG5vdCBvbiBzZWNyZXQgdmFsdWUpXG5jb25zdCBkaXZOZWFyZXN0ID0gKG51bTogYmlnaW50LCBkZW46IGJpZ2ludCkgPT4gKG51bSArIChudW0gPj0gMCA/IGRlbiA6IC1kZW4pIC8gXzJuKSAvIGRlbjtcblxuZXhwb3J0IHR5cGUgU2NhbGFyRW5kb1BhcnRzID0geyBrMW5lZzogYm9vbGVhbjsgazE6IGJpZ2ludDsgazJuZWc6IGJvb2xlYW47IGsyOiBiaWdpbnQgfTtcblxuLyoqXG4gKiBTcGxpdHMgc2NhbGFyIGZvciBHTFYgZW5kb21vcnBoaXNtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX3NwbGl0RW5kb1NjYWxhcihrOiBiaWdpbnQsIGJhc2lzOiBFbmRvQmFzaXMsIG46IGJpZ2ludCk6IFNjYWxhckVuZG9QYXJ0cyB7XG4gIC8vIFNwbGl0IHNjYWxhciBpbnRvIHR3byBzdWNoIHRoYXQgcGFydCBpcyB+aGFsZiBiaXRzOiBgYWJzKHBhcnQpIDwgc3FydChOKWBcbiAgLy8gU2luY2UgcGFydCBjYW4gYmUgbmVnYXRpdmUsIHdlIG5lZWQgdG8gZG8gdGhpcyBvbiBwb2ludC5cbiAgLy8gVE9ETzogdmVyaWZ5U2NhbGFyIGZ1bmN0aW9uIHdoaWNoIGNvbnN1bWVzIGxhbWJkYVxuICBjb25zdCBbW2ExLCBiMV0sIFthMiwgYjJdXSA9IGJhc2lzO1xuICBjb25zdCBjMSA9IGRpdk5lYXJlc3QoYjIgKiBrLCBuKTtcbiAgY29uc3QgYzIgPSBkaXZOZWFyZXN0KC1iMSAqIGssIG4pO1xuICAvLyB8azF8L3xrMnwgaXMgPCBzcXJ0KE4pLCBidXQgY2FuIGJlIG5lZ2F0aXZlLlxuICAvLyBJZiB3ZSBkbyBgazEgbW9kIE5gLCB3ZSdsbCBnZXQgYmlnIHNjYWxhciAoYD4gc3FydChOKWApOiBzbywgd2UgZG8gY2hlYXBlciBuZWdhdGlvbiBpbnN0ZWFkLlxuICBsZXQgazEgPSBrIC0gYzEgKiBhMSAtIGMyICogYTI7XG4gIGxldCBrMiA9IC1jMSAqIGIxIC0gYzIgKiBiMjtcbiAgY29uc3QgazFuZWcgPSBrMSA8IF8wbjtcbiAgY29uc3QgazJuZWcgPSBrMiA8IF8wbjtcbiAgaWYgKGsxbmVnKSBrMSA9IC1rMTtcbiAgaWYgKGsybmVnKSBrMiA9IC1rMjtcbiAgLy8gRG91YmxlIGNoZWNrIHRoYXQgcmVzdWx0aW5nIHNjYWxhciBsZXNzIHRoYW4gaGFsZiBiaXRzIG9mIE46IG90aGVyd2lzZSB3TkFGIHdpbGwgZmFpbC5cbiAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb24gd3JvbmcgYmFzaXNlcy4gQWxzbywgbWF0aCBpbnNpZGUgaXMgdG9vIGNvbXBsZXggYW5kIEkgZG9uJ3QgdHJ1c3QgaXQuXG4gIGNvbnN0IE1BWF9OVU0gPSBiaXRNYXNrKE1hdGguY2VpbChiaXRMZW4obikgLyAyKSkgKyBfMW47IC8vIEhhbGYgYml0cyBvZiBOXG4gIGlmIChrMSA8IF8wbiB8fCBrMSA+PSBNQVhfTlVNIHx8IGsyIDwgXzBuIHx8IGsyID49IE1BWF9OVU0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwbGl0U2NhbGFyIChlbmRvbW9ycGhpc20pOiBmYWlsZWQsIGs9JyArIGspO1xuICB9XG4gIHJldHVybiB7IGsxbmVnLCBrMSwgazJuZWcsIGsyIH07XG59XG5cbi8qKlxuICogT3B0aW9uIHRvIGVuYWJsZSBoZWRnZWQgc2lnbmF0dXJlcyB3aXRoIGltcHJvdmVkIHNlY3VyaXR5LlxuICpcbiAqICogUmFuZG9tbHkgZ2VuZXJhdGVkIGsgaXMgYmFkLCBiZWNhdXNlIGJyb2tlbiBDU1BSTkcgd291bGQgbGVhayBwcml2YXRlIGtleXMuXG4gKiAqIERldGVybWluaXN0aWMgayAoUkZDNjk3OSkgaXMgYmV0dGVyOyBidXQgaXMgc3VzcGVjdGlibGUgdG8gZmF1bHQgYXR0YWNrcy5cbiAqXG4gKiBXZSBhbGxvdyB1c2luZyB0ZWNobmlxdWUgZGVzY3JpYmVkIGluIFJGQzY5NzkgMy42OiBhZGRpdGlvbmFsIGsnLCBhLmsuYS4gYWRkaW5nIHJhbmRvbW5lc3NcbiAqIHRvIGRldGVybWluaXN0aWMgc2lnLiBJZiBDU1BSTkcgaXMgYnJva2VuICYgcmFuZG9tbmVzcyBpcyB3ZWFrLCBpdCB3b3VsZCBTVElMTCBiZSBhcyBzZWN1cmVcbiAqIGFzIG9yZGluYXJ5IHNpZyB3aXRob3V0IEV4dHJhRW50cm9weS5cbiAqXG4gKiAqIGB0cnVlYCBtZWFucyBcImZldGNoIGRhdGEsIGZyb20gQ1NQUk5HLCBpbmNvcnBvcmF0ZSBpdCBpbnRvIGsgZ2VuZXJhdGlvblwiXG4gKiAqIGBmYWxzZWAgbWVhbnMgXCJkaXNhYmxlIGV4dHJhIGVudHJvcHksIHVzZSBwdXJlbHkgZGV0ZXJtaW5pc3RpYyBrXCJcbiAqICogYFVpbnQ4QXJyYXlgIHBhc3NlZCBtZWFucyBcImluY29ycG9yYXRlIGZvbGxvd2luZyBkYXRhIGludG8gayBnZW5lcmF0aW9uXCJcbiAqXG4gKiBodHRwczovL3BhdWxtaWxsci5jb20vcG9zdHMvZGV0ZXJtaW5pc3RpYy1zaWduYXR1cmVzL1xuICovXG5leHBvcnQgdHlwZSBFQ0RTQUV4dHJhRW50cm9weSA9IGJvb2xlYW4gfCBVaW50OEFycmF5O1xuLyoqXG4gKiAtIGBjb21wYWN0YCBpcyB0aGUgZGVmYXVsdCBmb3JtYXRcbiAqIC0gYHJlY292ZXJlZGAgaXMgdGhlIHNhbWUgYXMgY29tcGFjdCwgYnV0IHdpdGggYW4gZXh0cmEgYnl0ZSBpbmRpY2F0aW5nIHJlY292ZXJ5IGJ5dGVcbiAqIC0gYGRlcmAgaXMgQVNOLjEgREVSIGVuY29kaW5nXG4gKi9cbmV4cG9ydCB0eXBlIEVDRFNBU2lnbmF0dXJlRm9ybWF0ID0gJ2NvbXBhY3QnIHwgJ3JlY292ZXJlZCcgfCAnZGVyJztcbi8qKlxuICogLSBgcHJlaGFzaGA6IChkZWZhdWx0OiB0cnVlKSBpbmRpY2F0ZXMgd2hldGhlciB0byBkbyBzaGEyNTYobWVzc2FnZSkuXG4gKiAgIFdoZW4gYSBjdXN0b20gaGFzaCBpcyB1c2VkLCBpdCBtdXN0IGJlIHNldCB0byBgZmFsc2VgLlxuICovXG5leHBvcnQgdHlwZSBFQ0RTQVJlY292ZXJPcHRzID0ge1xuICBwcmVoYXNoPzogYm9vbGVhbjtcbn07XG4vKipcbiAqIC0gYHByZWhhc2hgOiAoZGVmYXVsdDogdHJ1ZSkgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZG8gc2hhMjU2KG1lc3NhZ2UpLlxuICogICBXaGVuIGEgY3VzdG9tIGhhc2ggaXMgdXNlZCwgaXQgbXVzdCBiZSBzZXQgdG8gYGZhbHNlYC5cbiAqIC0gYGxvd1NgOiAoZGVmYXVsdDogdHJ1ZSkgcHJvaGliaXRzIHNpZ25hdHVyZXMgd2hpY2ggaGF2ZSAoc2lnLnMgPj0gQ1VSVkUubi8ybikuXG4gKiAgIENvbXBhdGlibGUgd2l0aCBCVEMvRVRILiBTZXR0aW5nIGBsb3dTOiBmYWxzZWAgYWxsb3dzIHRvIGNyZWF0ZSBtYWxsZWFibGUgc2lnbmF0dXJlcyxcbiAqICAgd2hpY2ggaXMgZGVmYXVsdCBvcGVuc3NsIGJlaGF2aW9yLlxuICogICBOb24tbWFsbGVhYmxlIHNpZ25hdHVyZXMgY2FuIHN0aWxsIGJlIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZCBpbiBvcGVuc3NsLlxuICogLSBgZm9ybWF0YDogKGRlZmF1bHQ6ICdjb21wYWN0JykgJ2NvbXBhY3QnIG9yICdyZWNvdmVyZWQnIHdpdGggcmVjb3ZlcnkgYnl0ZVxuICovXG5leHBvcnQgdHlwZSBFQ0RTQVZlcmlmeU9wdHMgPSB7XG4gIHByZWhhc2g/OiBib29sZWFuO1xuICBsb3dTPzogYm9vbGVhbjtcbiAgZm9ybWF0PzogRUNEU0FTaWduYXR1cmVGb3JtYXQ7XG59O1xuLyoqXG4gKiAtIGBwcmVoYXNoYDogKGRlZmF1bHQ6IHRydWUpIGluZGljYXRlcyB3aGV0aGVyIHRvIGRvIHNoYTI1NihtZXNzYWdlKS5cbiAqICAgV2hlbiBhIGN1c3RvbSBoYXNoIGlzIHVzZWQsIGl0IG11c3QgYmUgc2V0IHRvIGBmYWxzZWAuXG4gKiAtIGBsb3dTYDogKGRlZmF1bHQ6IHRydWUpIHByb2hpYml0cyBzaWduYXR1cmVzIHdoaWNoIGhhdmUgKHNpZy5zID49IENVUlZFLm4vMm4pLlxuICogICBDb21wYXRpYmxlIHdpdGggQlRDL0VUSC4gU2V0dGluZyBgbG93UzogZmFsc2VgIGFsbG93cyB0byBjcmVhdGUgbWFsbGVhYmxlIHNpZ25hdHVyZXMsXG4gKiAgIHdoaWNoIGlzIGRlZmF1bHQgb3BlbnNzbCBiZWhhdmlvci5cbiAqICAgTm9uLW1hbGxlYWJsZSBzaWduYXR1cmVzIGNhbiBzdGlsbCBiZSBzdWNjZXNzZnVsbHkgdmVyaWZpZWQgaW4gb3BlbnNzbC5cbiAqIC0gYGZvcm1hdGA6IChkZWZhdWx0OiAnY29tcGFjdCcpICdjb21wYWN0JyBvciAncmVjb3ZlcmVkJyB3aXRoIHJlY292ZXJ5IGJ5dGVcbiAqIC0gYGV4dHJhRW50cm9weWA6IChkZWZhdWx0OiBmYWxzZSkgY3JlYXRlcyBzaWdzIHdpdGggaW5jcmVhc2VkIHNlY3VyaXR5LCBzZWUge0BsaW5rIEVDRFNBRXh0cmFFbnRyb3B5fVxuICovXG5leHBvcnQgdHlwZSBFQ0RTQVNpZ25PcHRzID0ge1xuICBwcmVoYXNoPzogYm9vbGVhbjtcbiAgbG93Uz86IGJvb2xlYW47XG4gIGZvcm1hdD86IEVDRFNBU2lnbmF0dXJlRm9ybWF0O1xuICBleHRyYUVudHJvcHk/OiBFQ0RTQUV4dHJhRW50cm9weTtcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2lnRm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRUNEU0FTaWduYXR1cmVGb3JtYXQge1xuICBpZiAoIVsnY29tcGFjdCcsICdyZWNvdmVyZWQnLCAnZGVyJ10uaW5jbHVkZXMoZm9ybWF0KSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZ25hdHVyZSBmb3JtYXQgbXVzdCBiZSBcImNvbXBhY3RcIiwgXCJyZWNvdmVyZWRcIiwgb3IgXCJkZXJcIicpO1xuICByZXR1cm4gZm9ybWF0IGFzIEVDRFNBU2lnbmF0dXJlRm9ybWF0O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNpZ09wdHM8VCBleHRlbmRzIEVDRFNBU2lnbk9wdHMsIEQgZXh0ZW5kcyBSZXF1aXJlZDxFQ0RTQVNpZ25PcHRzPj4oXG4gIG9wdHM6IFQsXG4gIGRlZjogRFxuKTogUmVxdWlyZWQ8RUNEU0FTaWduT3B0cz4ge1xuICBjb25zdCBvcHRzbjogRUNEU0FTaWduT3B0cyA9IHt9O1xuICBmb3IgKGxldCBvcHROYW1lIG9mIE9iamVjdC5rZXlzKGRlZikpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0c25bb3B0TmFtZV0gPSBvcHRzW29wdE5hbWVdID09PSB1bmRlZmluZWQgPyBkZWZbb3B0TmFtZV0gOiBvcHRzW29wdE5hbWVdO1xuICB9XG4gIGFib29sKG9wdHNuLmxvd1MhLCAnbG93UycpO1xuICBhYm9vbChvcHRzbi5wcmVoYXNoISwgJ3ByZWhhc2gnKTtcbiAgaWYgKG9wdHNuLmZvcm1hdCAhPT0gdW5kZWZpbmVkKSB2YWxpZGF0ZVNpZ0Zvcm1hdChvcHRzbi5mb3JtYXQpO1xuICByZXR1cm4gb3B0c24gYXMgUmVxdWlyZWQ8RUNEU0FTaWduT3B0cz47XG59XG5cbi8qKiBJbnN0YW5jZSBtZXRob2RzIGZvciAzRCBYWVogcHJvamVjdGl2ZSBwb2ludHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlaWVyc3RyYXNzUG9pbnQ8VD4gZXh0ZW5kcyBDdXJ2ZVBvaW50PFQsIFdlaWVyc3RyYXNzUG9pbnQ8VD4+IHtcbiAgLyoqIHByb2plY3RpdmUgWCBjb29yZGluYXRlLiBEaWZmZXJlbnQgZnJvbSBhZmZpbmUgeC4gKi9cbiAgcmVhZG9ubHkgWDogVDtcbiAgLyoqIHByb2plY3RpdmUgWSBjb29yZGluYXRlLiBEaWZmZXJlbnQgZnJvbSBhZmZpbmUgeS4gKi9cbiAgcmVhZG9ubHkgWTogVDtcbiAgLyoqIHByb2plY3RpdmUgeiBjb29yZGluYXRlICovXG4gIHJlYWRvbmx5IFo6IFQ7XG4gIC8qKiBhZmZpbmUgeCBjb29yZGluYXRlLiBEaWZmZXJlbnQgZnJvbSBwcm9qZWN0aXZlIFguICovXG4gIGdldCB4KCk6IFQ7XG4gIC8qKiBhZmZpbmUgeSBjb29yZGluYXRlLiBEaWZmZXJlbnQgZnJvbSBwcm9qZWN0aXZlIFkuICovXG4gIGdldCB5KCk6IFQ7XG4gIC8qKiBFbmNvZGVzIHBvaW50IHVzaW5nIElFRUUgUDEzNjMgKERFUikgZW5jb2RpbmcuIEZpcnN0IGJ5dGUgaXMgMi8zLzQuIERlZmF1bHQgPSBpc0NvbXByZXNzZWQuICovXG4gIHRvQnl0ZXMoaXNDb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXk7XG4gIHRvSGV4KGlzQ29tcHJlc3NlZD86IGJvb2xlYW4pOiBzdHJpbmc7XG59XG5cbi8qKiBTdGF0aWMgbWV0aG9kcyBmb3IgM0QgWFlaIHByb2plY3RpdmUgcG9pbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWllcnN0cmFzc1BvaW50Q29uczxUPiBleHRlbmRzIEN1cnZlUG9pbnRDb25zPFdlaWVyc3RyYXNzUG9pbnQ8VD4+IHtcbiAgLyoqIERvZXMgTk9UIHZhbGlkYXRlIGlmIHRoZSBwb2ludCBpcyB2YWxpZC4gVXNlIGAuYXNzZXJ0VmFsaWRpdHkoKWAuICovXG4gIG5ldyAoWDogVCwgWTogVCwgWjogVCk6IFdlaWVyc3RyYXNzUG9pbnQ8VD47XG4gIENVUlZFKCk6IFdlaWVyc3RyYXNzT3B0czxUPjtcbn1cblxuLyoqXG4gKiBXZWllcnN0cmFzcyBjdXJ2ZSBvcHRpb25zLlxuICpcbiAqICogcDogcHJpbWUgY2hhcmFjdGVyaXN0aWMgKG9yZGVyKSBvZiBmaW5pdGUgZmllbGQsIGluIHdoaWNoIGFyaXRobWV0aWNzIGlzIGRvbmVcbiAqICogbjogb3JkZXIgb2YgcHJpbWUgc3ViZ3JvdXAgYS5rLmEgdG90YWwgYW1vdW50IG9mIHZhbGlkIGN1cnZlIHBvaW50c1xuICogKiBoOiBjb2ZhY3RvciwgdXN1YWxseSAxLiBoKm4gaXMgZ3JvdXAgb3JkZXI7IG4gaXMgc3ViZ3JvdXAgb3JkZXJcbiAqICogYTogZm9ybXVsYSBwYXJhbSwgbXVzdCBiZSBpbiBmaWVsZCBvZiBwXG4gKiAqIGI6IGZvcm11bGEgcGFyYW0sIG11c3QgYmUgaW4gZmllbGQgb2YgcFxuICogKiBHeDogeCBjb29yZGluYXRlIG9mIGdlbmVyYXRvciBwb2ludCBhLmsuYS4gYmFzZSBwb2ludFxuICogKiBHeTogeSBjb29yZGluYXRlIG9mIGdlbmVyYXRvciBwb2ludFxuICovXG5leHBvcnQgdHlwZSBXZWllcnN0cmFzc09wdHM8VD4gPSBSZWFkb25seTx7XG4gIHA6IGJpZ2ludDtcbiAgbjogYmlnaW50O1xuICBoOiBiaWdpbnQ7XG4gIGE6IFQ7XG4gIGI6IFQ7XG4gIEd4OiBUO1xuICBHeTogVDtcbn0+O1xuXG4vLyBXaGVuIGEgY29mYWN0b3IgIT0gMSwgdGhlcmUgY2FuIGJlIGFuIGVmZmVjdGl2ZSBtZXRob2RzIHRvOlxuLy8gMS4gRGV0ZXJtaW5lIHdoZXRoZXIgYSBwb2ludCBpcyB0b3JzaW9uLWZyZWVcbi8vIDIuIENsZWFyIHRvcnNpb24gY29tcG9uZW50XG5leHBvcnQgdHlwZSBXZWllcnN0cmFzc0V4dHJhT3B0czxUPiA9IFBhcnRpYWw8e1xuICBGcDogSUZpZWxkPFQ+O1xuICBGbjogSUZpZWxkPGJpZ2ludD47XG4gIGFsbG93SW5maW5pdHlQb2ludDogYm9vbGVhbjtcbiAgZW5kbzogRW5kb21vcnBoaXNtT3B0cztcbiAgaXNUb3JzaW9uRnJlZTogKGM6IFdlaWVyc3RyYXNzUG9pbnRDb25zPFQ+LCBwb2ludDogV2VpZXJzdHJhc3NQb2ludDxUPikgPT4gYm9vbGVhbjtcbiAgY2xlYXJDb2ZhY3RvcjogKGM6IFdlaWVyc3RyYXNzUG9pbnRDb25zPFQ+LCBwb2ludDogV2VpZXJzdHJhc3NQb2ludDxUPikgPT4gV2VpZXJzdHJhc3NQb2ludDxUPjtcbiAgZnJvbUJ5dGVzOiAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IEFmZmluZVBvaW50PFQ+O1xuICB0b0J5dGVzOiAoXG4gICAgYzogV2VpZXJzdHJhc3NQb2ludENvbnM8VD4sXG4gICAgcG9pbnQ6IFdlaWVyc3RyYXNzUG9pbnQ8VD4sXG4gICAgaXNDb21wcmVzc2VkOiBib29sZWFuXG4gICkgPT4gVWludDhBcnJheTtcbn0+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIEVDRFNBIHNpZ25hdHVyZXMgb3ZlciBhIFdlaWVyc3RyYXNzIGN1cnZlLlxuICpcbiAqICogbG93UzogKGRlZmF1bHQ6IHRydWUpIHdoZXRoZXIgcHJvZHVjZWQgLyB2ZXJpZmllZCBzaWduYXR1cmVzIG9jY3VweSBsb3cgaGFsZiBvZiBlY2RzYU9wdHMucC4gUHJldmVudHMgbWFsbGVhYmlsaXR5LlxuICogKiBobWFjOiAoZGVmYXVsdDogbm9ibGUtaGFzaGVzIGhtYWMpIGZ1bmN0aW9uLCB3b3VsZCBiZSB1c2VkIHRvIGluaXQgaG1hYy1kcmJnIGZvciBrIGdlbmVyYXRpb24uXG4gKiAqIHJhbmRvbUJ5dGVzOiAoZGVmYXVsdDogd2ViY3J5cHRvIG9zLWxldmVsIENTUFJORykgY3VzdG9tIG1ldGhvZCBmb3IgZmV0Y2hpbmcgc2VjdXJlIHJhbmRvbW5lc3MuXG4gKiAqIGJpdHMyaW50LCBiaXRzMmludF9tb2ROOiB1c2VkIGluIHNpZ3MsIHNvbWV0aW1lcyBvdmVycmlkZGVuIGJ5IGN1cnZlc1xuICovXG5leHBvcnQgdHlwZSBFQ0RTQU9wdHMgPSBQYXJ0aWFsPHtcbiAgbG93UzogYm9vbGVhbjtcbiAgaG1hYzogKGtleTogVWludDhBcnJheSwgbWVzc2FnZTogVWludDhBcnJheSkgPT4gVWludDhBcnJheTtcbiAgcmFuZG9tQnl0ZXM6IChieXRlc0xlbmd0aD86IG51bWJlcikgPT4gVWludDhBcnJheTtcbiAgYml0czJpbnQ6IChieXRlczogVWludDhBcnJheSkgPT4gYmlnaW50O1xuICBiaXRzMmludF9tb2ROOiAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IGJpZ2ludDtcbn0+O1xuXG4vKipcbiAqIEVsbGlwdGljIEN1cnZlIERpZmZpZS1IZWxsbWFuIGludGVyZmFjZS5cbiAqIFByb3ZpZGVzIGtleWdlbiwgc2VjcmV0LXRvLXB1YmxpYyBjb252ZXJzaW9uLCBjYWxjdWxhdGluZyBzaGFyZWQgc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFQ0RIIHtcbiAga2V5Z2VuOiAoc2VlZD86IFVpbnQ4QXJyYXkpID0+IHsgc2VjcmV0S2V5OiBVaW50OEFycmF5OyBwdWJsaWNLZXk6IFVpbnQ4QXJyYXkgfTtcbiAgZ2V0UHVibGljS2V5OiAoc2VjcmV0S2V5OiBVaW50OEFycmF5LCBpc0NvbXByZXNzZWQ/OiBib29sZWFuKSA9PiBVaW50OEFycmF5O1xuICBnZXRTaGFyZWRTZWNyZXQ6IChcbiAgICBzZWNyZXRLZXlBOiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleUI6IFVpbnQ4QXJyYXksXG4gICAgaXNDb21wcmVzc2VkPzogYm9vbGVhblxuICApID0+IFVpbnQ4QXJyYXk7XG4gIFBvaW50OiBXZWllcnN0cmFzc1BvaW50Q29uczxiaWdpbnQ+O1xuICB1dGlsczoge1xuICAgIGlzVmFsaWRTZWNyZXRLZXk6IChzZWNyZXRLZXk6IFVpbnQ4QXJyYXkpID0+IGJvb2xlYW47XG4gICAgaXNWYWxpZFB1YmxpY0tleTogKHB1YmxpY0tleTogVWludDhBcnJheSwgaXNDb21wcmVzc2VkPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgICByYW5kb21TZWNyZXRLZXk6IChzZWVkPzogVWludDhBcnJheSkgPT4gVWludDhBcnJheTtcbiAgfTtcbiAgbGVuZ3RoczogQ3VydmVMZW5ndGhzO1xufVxuXG4vKipcbiAqIEVDRFNBIGludGVyZmFjZS5cbiAqIE9ubHkgc3VwcG9ydGVkIGZvciBwcmltZSBmaWVsZHMsIG5vdCBGcDIgKGV4dGVuc2lvbiBmaWVsZHMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVDRFNBIGV4dGVuZHMgRUNESCB7XG4gIHNpZ246IChtZXNzYWdlOiBVaW50OEFycmF5LCBzZWNyZXRLZXk6IFVpbnQ4QXJyYXksIG9wdHM/OiBFQ0RTQVNpZ25PcHRzKSA9PiBVaW50OEFycmF5O1xuICB2ZXJpZnk6IChcbiAgICBzaWduYXR1cmU6IFVpbnQ4QXJyYXksXG4gICAgbWVzc2FnZTogVWludDhBcnJheSxcbiAgICBwdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gICAgb3B0cz86IEVDRFNBVmVyaWZ5T3B0c1xuICApID0+IGJvb2xlYW47XG4gIHJlY292ZXJQdWJsaWNLZXkoc2lnbmF0dXJlOiBVaW50OEFycmF5LCBtZXNzYWdlOiBVaW50OEFycmF5LCBvcHRzPzogRUNEU0FSZWNvdmVyT3B0cyk6IFVpbnQ4QXJyYXk7XG4gIFNpZ25hdHVyZTogRUNEU0FTaWduYXR1cmVDb25zO1xufVxuZXhwb3J0IGNsYXNzIERFUkVyciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobSA9ICcnKSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbmV4cG9ydCB0eXBlIElERVIgPSB7XG4gIC8vIGFzbi4xIERFUiBlbmNvZGluZyB1dGlsc1xuICBFcnI6IHR5cGVvZiBERVJFcnI7XG4gIC8vIEJhc2ljIGJ1aWxkaW5nIGJsb2NrIGlzIFRMViAoVGFnLUxlbmd0aC1WYWx1ZSlcbiAgX3Rsdjoge1xuICAgIGVuY29kZTogKHRhZzogbnVtYmVyLCBkYXRhOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICAvLyB2IC0gdmFsdWUsIGwgLSBsZWZ0IGJ5dGVzICh1bnBhcnNlZClcbiAgICBkZWNvZGUodGFnOiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkpOiB7IHY6IFVpbnQ4QXJyYXk7IGw6IFVpbnQ4QXJyYXkgfTtcbiAgfTtcbiAgLy8gaHR0cHM6Ly9jcnlwdG8uc3RhY2tleGNoYW5nZS5jb20vYS81NzczNCBMZWZ0bW9zdCBiaXQgb2YgZmlyc3QgYnl0ZSBpcyAnbmVnYXRpdmUnIGZsYWcsXG4gIC8vIHNpbmNlIHdlIGFsd2F5cyB1c2UgcG9zaXRpdmUgaW50ZWdlcnMgaGVyZS4gSXQgbXVzdCBhbHdheXMgYmUgZW1wdHk6XG4gIC8vIC0gYWRkIHplcm8gYnl0ZSBpZiBleGlzdHNcbiAgLy8gLSBpZiBuZXh0IGJ5dGUgZG9lc24ndCBoYXZlIGEgZmxhZywgbGVhZGluZyB6ZXJvIGlzIG5vdCBhbGxvd2VkIChtaW5pbWFsIGVuY29kaW5nKVxuICBfaW50OiB7XG4gICAgZW5jb2RlKG51bTogYmlnaW50KTogc3RyaW5nO1xuICAgIGRlY29kZShkYXRhOiBVaW50OEFycmF5KTogYmlnaW50O1xuICB9O1xuICB0b1NpZyhoZXg6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB7IHI6IGJpZ2ludDsgczogYmlnaW50IH07XG4gIGhleEZyb21TaWcoc2lnOiB7IHI6IGJpZ2ludDsgczogYmlnaW50IH0pOiBzdHJpbmc7XG59O1xuLyoqXG4gKiBBU04uMSBERVIgZW5jb2RpbmcgdXRpbGl0aWVzLiBBU04gaXMgdmVyeSBjb21wbGV4ICYgZnJhZ2lsZS4gRm9ybWF0OlxuICpcbiAqICAgICBbMHgzMCAoU0VRVUVOQ0UpLCBieXRlbGVuZ3RoLCAweDAyIChJTlRFR0VSKSwgaW50TGVuZ3RoLCBSLCAweDAyIChJTlRFR0VSKSwgaW50TGVuZ3RoLCBTXVxuICpcbiAqIERvY3M6IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL2RvY3MvYS13YXJtLXdlbGNvbWUtdG8tYXNuMS1hbmQtZGVyLywgaHR0cHM6Ly9sdWNhLm50b3Aub3JnL1RlYWNoaW5nL0FwcHVudGkvYXNuMS5odG1sXG4gKi9cbmV4cG9ydCBjb25zdCBERVI6IElERVIgPSB7XG4gIC8vIGFzbi4xIERFUiBlbmNvZGluZyB1dGlsc1xuICBFcnI6IERFUkVycixcbiAgLy8gQmFzaWMgYnVpbGRpbmcgYmxvY2sgaXMgVExWIChUYWctTGVuZ3RoLVZhbHVlKVxuICBfdGx2OiB7XG4gICAgZW5jb2RlOiAodGFnOiBudW1iZXIsIGRhdGE6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCB7IEVycjogRSB9ID0gREVSO1xuICAgICAgaWYgKHRhZyA8IDAgfHwgdGFnID4gMjU2KSB0aHJvdyBuZXcgRSgndGx2LmVuY29kZTogd3JvbmcgdGFnJyk7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggJiAxKSB0aHJvdyBuZXcgRSgndGx2LmVuY29kZTogdW5wYWRkZWQgZGF0YScpO1xuICAgICAgY29uc3QgZGF0YUxlbiA9IGRhdGEubGVuZ3RoIC8gMjtcbiAgICAgIGNvbnN0IGxlbiA9IG51bWJlclRvSGV4VW5wYWRkZWQoZGF0YUxlbik7XG4gICAgICBpZiAoKGxlbi5sZW5ndGggLyAyKSAmIDBiMTAwMF8wMDAwKSB0aHJvdyBuZXcgRSgndGx2LmVuY29kZTogbG9uZyBmb3JtIGxlbmd0aCB0b28gYmlnJyk7XG4gICAgICAvLyBsZW5ndGggb2YgbGVuZ3RoIHdpdGggbG9uZyBmb3JtIGZsYWdcbiAgICAgIGNvbnN0IGxlbkxlbiA9IGRhdGFMZW4gPiAxMjcgPyBudW1iZXJUb0hleFVucGFkZGVkKChsZW4ubGVuZ3RoIC8gMikgfCAwYjEwMDBfMDAwMCkgOiAnJztcbiAgICAgIGNvbnN0IHQgPSBudW1iZXJUb0hleFVucGFkZGVkKHRhZyk7XG4gICAgICByZXR1cm4gdCArIGxlbkxlbiArIGxlbiArIGRhdGE7XG4gICAgfSxcbiAgICAvLyB2IC0gdmFsdWUsIGwgLSBsZWZ0IGJ5dGVzICh1bnBhcnNlZClcbiAgICBkZWNvZGUodGFnOiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkpOiB7IHY6IFVpbnQ4QXJyYXk7IGw6IFVpbnQ4QXJyYXkgfSB7XG4gICAgICBjb25zdCB7IEVycjogRSB9ID0gREVSO1xuICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICBpZiAodGFnIDwgMCB8fCB0YWcgPiAyNTYpIHRocm93IG5ldyBFKCd0bHYuZW5jb2RlOiB3cm9uZyB0YWcnKTtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDIgfHwgZGF0YVtwb3MrK10gIT09IHRhZykgdGhyb3cgbmV3IEUoJ3Rsdi5kZWNvZGU6IHdyb25nIHRsdicpO1xuICAgICAgY29uc3QgZmlyc3QgPSBkYXRhW3BvcysrXTtcbiAgICAgIGNvbnN0IGlzTG9uZyA9ICEhKGZpcnN0ICYgMGIxMDAwXzAwMDApOyAvLyBGaXJzdCBiaXQgb2YgZmlyc3QgbGVuZ3RoIGJ5dGUgaXMgZmxhZyBmb3Igc2hvcnQvbG9uZyBmb3JtXG4gICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgIGlmICghaXNMb25nKSBsZW5ndGggPSBmaXJzdDtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBMb25nIGZvcm06IFtsb25nRmxhZygxYml0KSwgbGVuZ3RoTGVuZ3RoKDdiaXQpLCBsZW5ndGggKEJFKV1cbiAgICAgICAgY29uc3QgbGVuTGVuID0gZmlyc3QgJiAwYjAxMTFfMTExMTtcbiAgICAgICAgaWYgKCFsZW5MZW4pIHRocm93IG5ldyBFKCd0bHYuZGVjb2RlKGxvbmcpOiBpbmRlZmluaXRlIGxlbmd0aCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIGlmIChsZW5MZW4gPiA0KSB0aHJvdyBuZXcgRSgndGx2LmRlY29kZShsb25nKTogYnl0ZSBsZW5ndGggaXMgdG9vIGJpZycpOyAvLyB0aGlzIHdpbGwgb3ZlcmZsb3cgdTMyIGluIGpzXG4gICAgICAgIGNvbnN0IGxlbmd0aEJ5dGVzID0gZGF0YS5zdWJhcnJheShwb3MsIHBvcyArIGxlbkxlbik7XG4gICAgICAgIGlmIChsZW5ndGhCeXRlcy5sZW5ndGggIT09IGxlbkxlbikgdGhyb3cgbmV3IEUoJ3Rsdi5kZWNvZGU6IGxlbmd0aCBieXRlcyBub3QgY29tcGxldGUnKTtcbiAgICAgICAgaWYgKGxlbmd0aEJ5dGVzWzBdID09PSAwKSB0aHJvdyBuZXcgRSgndGx2LmRlY29kZShsb25nKTogemVybyBsZWZ0bW9zdCBieXRlJyk7XG4gICAgICAgIGZvciAoY29uc3QgYiBvZiBsZW5ndGhCeXRlcykgbGVuZ3RoID0gKGxlbmd0aCA8PCA4KSB8IGI7XG4gICAgICAgIHBvcyArPSBsZW5MZW47XG4gICAgICAgIGlmIChsZW5ndGggPCAxMjgpIHRocm93IG5ldyBFKCd0bHYuZGVjb2RlKGxvbmcpOiBub3QgbWluaW1hbCBlbmNvZGluZycpO1xuICAgICAgfVxuICAgICAgY29uc3QgdiA9IGRhdGEuc3ViYXJyYXkocG9zLCBwb3MgKyBsZW5ndGgpO1xuICAgICAgaWYgKHYubGVuZ3RoICE9PSBsZW5ndGgpIHRocm93IG5ldyBFKCd0bHYuZGVjb2RlOiB3cm9uZyB2YWx1ZSBsZW5ndGgnKTtcbiAgICAgIHJldHVybiB7IHYsIGw6IGRhdGEuc3ViYXJyYXkocG9zICsgbGVuZ3RoKSB9O1xuICAgIH0sXG4gIH0sXG4gIC8vIGh0dHBzOi8vY3J5cHRvLnN0YWNrZXhjaGFuZ2UuY29tL2EvNTc3MzQgTGVmdG1vc3QgYml0IG9mIGZpcnN0IGJ5dGUgaXMgJ25lZ2F0aXZlJyBmbGFnLFxuICAvLyBzaW5jZSB3ZSBhbHdheXMgdXNlIHBvc2l0aXZlIGludGVnZXJzIGhlcmUuIEl0IG11c3QgYWx3YXlzIGJlIGVtcHR5OlxuICAvLyAtIGFkZCB6ZXJvIGJ5dGUgaWYgZXhpc3RzXG4gIC8vIC0gaWYgbmV4dCBieXRlIGRvZXNuJ3QgaGF2ZSBhIGZsYWcsIGxlYWRpbmcgemVybyBpcyBub3QgYWxsb3dlZCAobWluaW1hbCBlbmNvZGluZylcbiAgX2ludDoge1xuICAgIGVuY29kZShudW06IGJpZ2ludCk6IHN0cmluZyB7XG4gICAgICBjb25zdCB7IEVycjogRSB9ID0gREVSO1xuICAgICAgaWYgKG51bSA8IF8wbikgdGhyb3cgbmV3IEUoJ2ludGVnZXI6IG5lZ2F0aXZlIGludGVnZXJzIGFyZSBub3QgYWxsb3dlZCcpO1xuICAgICAgbGV0IGhleCA9IG51bWJlclRvSGV4VW5wYWRkZWQobnVtKTtcbiAgICAgIC8vIFBhZCB3aXRoIHplcm8gYnl0ZSBpZiBuZWdhdGl2ZSBmbGFnIGlzIHByZXNlbnRcbiAgICAgIGlmIChOdW1iZXIucGFyc2VJbnQoaGV4WzBdLCAxNikgJiAwYjEwMDApIGhleCA9ICcwMCcgKyBoZXg7XG4gICAgICBpZiAoaGV4Lmxlbmd0aCAmIDEpIHRocm93IG5ldyBFKCd1bmV4cGVjdGVkIERFUiBwYXJzaW5nIGFzc2VydGlvbjogdW5wYWRkZWQgaGV4Jyk7XG4gICAgICByZXR1cm4gaGV4O1xuICAgIH0sXG4gICAgZGVjb2RlKGRhdGE6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICAgICAgY29uc3QgeyBFcnI6IEUgfSA9IERFUjtcbiAgICAgIGlmIChkYXRhWzBdICYgMGIxMDAwXzAwMDApIHRocm93IG5ldyBFKCdpbnZhbGlkIHNpZ25hdHVyZSBpbnRlZ2VyOiBuZWdhdGl2ZScpO1xuICAgICAgaWYgKGRhdGFbMF0gPT09IDB4MDAgJiYgIShkYXRhWzFdICYgMGIxMDAwXzAwMDApKVxuICAgICAgICB0aHJvdyBuZXcgRSgnaW52YWxpZCBzaWduYXR1cmUgaW50ZWdlcjogdW5uZWNlc3NhcnkgbGVhZGluZyB6ZXJvJyk7XG4gICAgICByZXR1cm4gYnl0ZXNUb051bWJlckJFKGRhdGEpO1xuICAgIH0sXG4gIH0sXG4gIHRvU2lnKGJ5dGVzOiBVaW50OEFycmF5KTogeyByOiBiaWdpbnQ7IHM6IGJpZ2ludCB9IHtcbiAgICAvLyBwYXJzZSBERVIgc2lnbmF0dXJlXG4gICAgY29uc3QgeyBFcnI6IEUsIF9pbnQ6IGludCwgX3RsdjogdGx2IH0gPSBERVI7XG4gICAgY29uc3QgZGF0YSA9IGFieXRlcyhieXRlcywgdW5kZWZpbmVkLCAnc2lnbmF0dXJlJyk7XG4gICAgY29uc3QgeyB2OiBzZXFCeXRlcywgbDogc2VxTGVmdEJ5dGVzIH0gPSB0bHYuZGVjb2RlKDB4MzAsIGRhdGEpO1xuICAgIGlmIChzZXFMZWZ0Qnl0ZXMubGVuZ3RoKSB0aHJvdyBuZXcgRSgnaW52YWxpZCBzaWduYXR1cmU6IGxlZnQgYnl0ZXMgYWZ0ZXIgcGFyc2luZycpO1xuICAgIGNvbnN0IHsgdjogckJ5dGVzLCBsOiByTGVmdEJ5dGVzIH0gPSB0bHYuZGVjb2RlKDB4MDIsIHNlcUJ5dGVzKTtcbiAgICBjb25zdCB7IHY6IHNCeXRlcywgbDogc0xlZnRCeXRlcyB9ID0gdGx2LmRlY29kZSgweDAyLCByTGVmdEJ5dGVzKTtcbiAgICBpZiAoc0xlZnRCeXRlcy5sZW5ndGgpIHRocm93IG5ldyBFKCdpbnZhbGlkIHNpZ25hdHVyZTogbGVmdCBieXRlcyBhZnRlciBwYXJzaW5nJyk7XG4gICAgcmV0dXJuIHsgcjogaW50LmRlY29kZShyQnl0ZXMpLCBzOiBpbnQuZGVjb2RlKHNCeXRlcykgfTtcbiAgfSxcbiAgaGV4RnJvbVNpZyhzaWc6IHsgcjogYmlnaW50OyBzOiBiaWdpbnQgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBfdGx2OiB0bHYsIF9pbnQ6IGludCB9ID0gREVSO1xuICAgIGNvbnN0IHJzID0gdGx2LmVuY29kZSgweDAyLCBpbnQuZW5jb2RlKHNpZy5yKSk7XG4gICAgY29uc3Qgc3MgPSB0bHYuZW5jb2RlKDB4MDIsIGludC5lbmNvZGUoc2lnLnMpKTtcbiAgICBjb25zdCBzZXEgPSBycyArIHNzO1xuICAgIHJldHVybiB0bHYuZW5jb2RlKDB4MzAsIHNlcSk7XG4gIH0sXG59O1xuXG4vLyBCZSBmcmllbmRseSB0byBiYWQgRUNNQVNjcmlwdCBwYXJzZXJzIGJ5IG5vdCB1c2luZyBiaWdpbnQgbGl0ZXJhbHNcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgXzBuID0gQmlnSW50KDApLCBfMW4gPSBCaWdJbnQoMSksIF8ybiA9IEJpZ0ludCgyKSwgXzNuID0gQmlnSW50KDMpLCBfNG4gPSBCaWdJbnQoNCk7XG5cbi8qKlxuICogQ3JlYXRlcyB3ZWllcnN0cmFzcyBQb2ludCBjb25zdHJ1Y3RvciwgYmFzZWQgb24gc3BlY2lmaWVkIGN1cnZlIG9wdGlvbnMuXG4gKlxuICogU2VlIHtAbGluayBXZWllcnN0cmFzc09wdHN9LlxuICpcbiAqIEBleGFtcGxlXG5gYGBqc1xuY29uc3Qgb3B0cyA9IHtcbiAgcDogMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZhYzczbixcbiAgbjogMHgxMDAwMDAwMDAwMDAwMDAwMDAwMDFiOGZhMTZkZmFiOWFjYTE2YjZiM24sXG4gIGg6IDFuLFxuICBhOiAwbixcbiAgYjogN24sXG4gIEd4OiAweDNiNGMzODJjZTM3YWExOTJhNDAxOWU3NjMwMzZmNGY1ZGQ0ZDdlYmJuLFxuICBHeTogMHg5MzhjZjkzNTMxOGZkY2VkNmJjMjgyODY1MzE3MzNjM2YwM2M0ZmVlbixcbn07XG5jb25zdCBzZWNwMTYwazFfUG9pbnQgPSB3ZWllcnN0cmFzcyhvcHRzKTtcbmBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2VpZXJzdHJhc3M8VD4oXG4gIHBhcmFtczogV2VpZXJzdHJhc3NPcHRzPFQ+LFxuICBleHRyYU9wdHM6IFdlaWVyc3RyYXNzRXh0cmFPcHRzPFQ+ID0ge31cbik6IFdlaWVyc3RyYXNzUG9pbnRDb25zPFQ+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gY3JlYXRlQ3VydmVGaWVsZHMoJ3dlaWVyc3RyYXNzJywgcGFyYW1zLCBleHRyYU9wdHMpO1xuICBjb25zdCB7IEZwLCBGbiB9ID0gdmFsaWRhdGVkO1xuICBsZXQgQ1VSVkUgPSB2YWxpZGF0ZWQuQ1VSVkUgYXMgV2VpZXJzdHJhc3NPcHRzPFQ+O1xuICBjb25zdCB7IGg6IGNvZmFjdG9yLCBuOiBDVVJWRV9PUkRFUiB9ID0gQ1VSVkU7XG4gIHZhbGlkYXRlT2JqZWN0KFxuICAgIGV4dHJhT3B0cyxcbiAgICB7fSxcbiAgICB7XG4gICAgICBhbGxvd0luZmluaXR5UG9pbnQ6ICdib29sZWFuJyxcbiAgICAgIGNsZWFyQ29mYWN0b3I6ICdmdW5jdGlvbicsXG4gICAgICBpc1RvcnNpb25GcmVlOiAnZnVuY3Rpb24nLFxuICAgICAgZnJvbUJ5dGVzOiAnZnVuY3Rpb24nLFxuICAgICAgdG9CeXRlczogJ2Z1bmN0aW9uJyxcbiAgICAgIGVuZG86ICdvYmplY3QnLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCB7IGVuZG8gfSA9IGV4dHJhT3B0cztcbiAgaWYgKGVuZG8pIHtcbiAgICAvLyB2YWxpZGF0ZU9iamVjdChlbmRvLCB7IGJldGE6ICdiaWdpbnQnLCBzcGxpdFNjYWxhcjogJ2Z1bmN0aW9uJyB9KTtcbiAgICBpZiAoIUZwLmlzMChDVVJWRS5hKSB8fCB0eXBlb2YgZW5kby5iZXRhICE9PSAnYmlnaW50JyB8fCAhQXJyYXkuaXNBcnJheShlbmRvLmJhc2lzZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW5kbzogZXhwZWN0ZWQgXCJiZXRhXCI6IGJpZ2ludCBhbmQgXCJiYXNpc2VzXCI6IGFycmF5Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbGVuZ3RocyA9IGdldFdMZW5ndGhzKEZwLCBGbik7XG5cbiAgZnVuY3Rpb24gYXNzZXJ0Q29tcHJlc3Npb25Jc1N1cHBvcnRlZCgpIHtcbiAgICBpZiAoIUZwLmlzT2RkKSB0aHJvdyBuZXcgRXJyb3IoJ2NvbXByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQ6IEZpZWxkIGRvZXMgbm90IGhhdmUgLmlzT2RkKCknKTtcbiAgfVxuXG4gIC8vIEltcGxlbWVudHMgSUVFRSBQMTM2MyBwb2ludCBlbmNvZGluZ1xuICBmdW5jdGlvbiBwb2ludFRvQnl0ZXMoXG4gICAgX2M6IFdlaWVyc3RyYXNzUG9pbnRDb25zPFQ+LFxuICAgIHBvaW50OiBXZWllcnN0cmFzc1BvaW50PFQ+LFxuICAgIGlzQ29tcHJlc3NlZDogYm9vbGVhblxuICApOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHBvaW50LnRvQWZmaW5lKCk7XG4gICAgY29uc3QgYnggPSBGcC50b0J5dGVzKHgpO1xuICAgIGFib29sKGlzQ29tcHJlc3NlZCwgJ2lzQ29tcHJlc3NlZCcpO1xuICAgIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICAgIGFzc2VydENvbXByZXNzaW9uSXNTdXBwb3J0ZWQoKTtcbiAgICAgIGNvbnN0IGhhc0V2ZW5ZID0gIUZwLmlzT2RkISh5KTtcbiAgICAgIHJldHVybiBjb25jYXRCeXRlcyhwcHJlZml4KGhhc0V2ZW5ZKSwgYngpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29uY2F0Qnl0ZXMoVWludDhBcnJheS5vZigweDA0KSwgYngsIEZwLnRvQnl0ZXMoeSkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwb2ludEZyb21CeXRlcyhieXRlczogVWludDhBcnJheSkge1xuICAgIGFieXRlcyhieXRlcywgdW5kZWZpbmVkLCAnUG9pbnQnKTtcbiAgICBjb25zdCB7IHB1YmxpY0tleTogY29tcCwgcHVibGljS2V5VW5jb21wcmVzc2VkOiB1bmNvbXAgfSA9IGxlbmd0aHM7IC8vIGUuZy4gZm9yIDMyLWJ5dGU6IDMzLCA2NVxuICAgIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgICBjb25zdCBoZWFkID0gYnl0ZXNbMF07XG4gICAgY29uc3QgdGFpbCA9IGJ5dGVzLnN1YmFycmF5KDEpO1xuICAgIC8vIE5vIGFjdHVhbCB2YWxpZGF0aW9uIGlzIGRvbmUgaGVyZTogdXNlIC5hc3NlcnRWYWxpZGl0eSgpXG4gICAgaWYgKGxlbmd0aCA9PT0gY29tcCAmJiAoaGVhZCA9PT0gMHgwMiB8fCBoZWFkID09PSAweDAzKSkge1xuICAgICAgY29uc3QgeCA9IEZwLmZyb21CeXRlcyh0YWlsKTtcbiAgICAgIGlmICghRnAuaXNWYWxpZCh4KSkgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IGlzIG5vdCBvbiBjdXJ2ZSwgd3JvbmcgeCcpO1xuICAgICAgY29uc3QgeTIgPSB3ZWllcnN0cmFzc0VxdWF0aW9uKHgpOyAvLyB5XHUwMEIyID0geFx1MDBCMyArIGF4ICsgYlxuICAgICAgbGV0IHk6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICB5ID0gRnAuc3FydCh5Mik7IC8vIHkgPSB5XHUwMEIyIF4gKHArMSkvNFxuICAgICAgfSBjYXRjaCAoc3FydEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHNxcnRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJzogJyArIHNxcnRFcnJvci5tZXNzYWdlIDogJyc7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHBvaW50OiBpcyBub3Qgb24gY3VydmUsIHNxcnQgZXJyb3InICsgZXJyKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydENvbXByZXNzaW9uSXNTdXBwb3J0ZWQoKTtcbiAgICAgIGNvbnN0IGV2ZW5ZID0gRnAuaXNPZGQhKHkpO1xuICAgICAgY29uc3QgZXZlbkggPSAoaGVhZCAmIDEpID09PSAxOyAvLyBFQ0RTQS1zcGVjaWZpY1xuICAgICAgaWYgKGV2ZW5IICE9PSBldmVuWSkgeSA9IEZwLm5lZyh5KTtcbiAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5jb21wICYmIGhlYWQgPT09IDB4MDQpIHtcbiAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2tzXG4gICAgICBjb25zdCBMID0gRnAuQllURVM7XG4gICAgICBjb25zdCB4ID0gRnAuZnJvbUJ5dGVzKHRhaWwuc3ViYXJyYXkoMCwgTCkpO1xuICAgICAgY29uc3QgeSA9IEZwLmZyb21CeXRlcyh0YWlsLnN1YmFycmF5KEwsIEwgKiAyKSk7XG4gICAgICBpZiAoIWlzVmFsaWRYWSh4LCB5KSkgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IGlzIG5vdCBvbiBjdXJ2ZScpO1xuICAgICAgcmV0dXJuIHsgeCwgeSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBiYWQgcG9pbnQ6IGdvdCBsZW5ndGggJHtsZW5ndGh9LCBleHBlY3RlZCBjb21wcmVzc2VkPSR7Y29tcH0gb3IgdW5jb21wcmVzc2VkPSR7dW5jb21wfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZW5jb2RlUG9pbnQgPSBleHRyYU9wdHMudG9CeXRlcyB8fCBwb2ludFRvQnl0ZXM7XG4gIGNvbnN0IGRlY29kZVBvaW50ID0gZXh0cmFPcHRzLmZyb21CeXRlcyB8fCBwb2ludEZyb21CeXRlcztcbiAgZnVuY3Rpb24gd2VpZXJzdHJhc3NFcXVhdGlvbih4OiBUKTogVCB7XG4gICAgY29uc3QgeDIgPSBGcC5zcXIoeCk7IC8vIHggKiB4XG4gICAgY29uc3QgeDMgPSBGcC5tdWwoeDIsIHgpOyAvLyB4XHUwMEIyICogeFxuICAgIHJldHVybiBGcC5hZGQoRnAuYWRkKHgzLCBGcC5tdWwoeCwgQ1VSVkUuYSkpLCBDVVJWRS5iKTsgLy8geFx1MDBCMyArIGEgKiB4ICsgYlxuICB9XG5cbiAgLy8gVE9ETzogbW92ZSB0b3AtbGV2ZWxcbiAgLyoqIENoZWNrcyB3aGV0aGVyIGVxdWF0aW9uIGhvbGRzIGZvciBnaXZlbiB4LCB5OiB5XHUwMEIyID09IHhcdTAwQjMgKyBheCArIGIgKi9cbiAgZnVuY3Rpb24gaXNWYWxpZFhZKHg6IFQsIHk6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZWZ0ID0gRnAuc3FyKHkpOyAvLyB5XHUwMEIyXG4gICAgY29uc3QgcmlnaHQgPSB3ZWllcnN0cmFzc0VxdWF0aW9uKHgpOyAvLyB4XHUwMEIzICsgYXggKyBiXG4gICAgcmV0dXJuIEZwLmVxbChsZWZ0LCByaWdodCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB3aGV0aGVyIHRoZSBwYXNzZWQgY3VydmUgcGFyYW1zIGFyZSB2YWxpZC5cbiAgLy8gVGVzdCAxOiBlcXVhdGlvbiB5XHUwMEIyID0geFx1MDBCMyArIGF4ICsgYiBzaG91bGQgd29yayBmb3IgZ2VuZXJhdG9yIHBvaW50LlxuICBpZiAoIWlzVmFsaWRYWShDVVJWRS5HeCwgQ1VSVkUuR3kpKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBjdXJ2ZSBwYXJhbXM6IGdlbmVyYXRvciBwb2ludCcpO1xuXG4gIC8vIFRlc3QgMjogZGlzY3JpbWluYW50IFx1MDM5NCBwYXJ0IHNob3VsZCBiZSBub24temVybzogNGFcdTAwQjMgKyAyN2JcdTAwQjIgIT0gMC5cbiAgLy8gR3VhcmFudGVlcyBjdXJ2ZSBpcyBnZW51cy0xLCBzbW9vdGggKG5vbi1zaW5ndWxhcikuXG4gIGNvbnN0IF80YTMgPSBGcC5tdWwoRnAucG93KENVUlZFLmEsIF8zbiksIF80bik7XG4gIGNvbnN0IF8yN2IyID0gRnAubXVsKEZwLnNxcihDVVJWRS5iKSwgQmlnSW50KDI3KSk7XG4gIGlmIChGcC5pczAoRnAuYWRkKF80YTMsIF8yN2IyKSkpIHRocm93IG5ldyBFcnJvcignYmFkIGN1cnZlIHBhcmFtczogYSBvciBiJyk7XG5cbiAgLyoqIEFzc2VydHMgY29vcmRpbmF0ZSBpcyB2YWxpZDogMCA8PSBuIDwgRnAuT1JERVIuICovXG4gIGZ1bmN0aW9uIGFjb29yZCh0aXRsZTogc3RyaW5nLCBuOiBULCBiYW5aZXJvID0gZmFsc2UpIHtcbiAgICBpZiAoIUZwLmlzVmFsaWQobikgfHwgKGJhblplcm8gJiYgRnAuaXMwKG4pKSkgdGhyb3cgbmV3IEVycm9yKGBiYWQgcG9pbnQgY29vcmRpbmF0ZSAke3RpdGxlfWApO1xuICAgIHJldHVybiBuO1xuICB9XG5cbiAgZnVuY3Rpb24gYXByanBvaW50KG90aGVyOiB1bmtub3duKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQb2ludCkpIHRocm93IG5ldyBFcnJvcignV2VpZXJzdHJhc3MgUG9pbnQgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNwbGl0RW5kb1NjYWxhck4oazogYmlnaW50KSB7XG4gICAgaWYgKCFlbmRvIHx8ICFlbmRvLmJhc2lzZXMpIHRocm93IG5ldyBFcnJvcignbm8gZW5kbycpO1xuICAgIHJldHVybiBfc3BsaXRFbmRvU2NhbGFyKGssIGVuZG8uYmFzaXNlcywgRm4uT1JERVIpO1xuICB9XG5cbiAgLy8gTWVtb2l6ZWQgdG9BZmZpbmUgLyB2YWxpZGl0eSBjaGVjay4gVGhleSBhcmUgaGVhdnkuIFBvaW50cyBhcmUgaW1tdXRhYmxlLlxuXG4gIC8vIENvbnZlcnRzIFByb2plY3RpdmUgcG9pbnQgdG8gYWZmaW5lICh4LCB5KSBjb29yZGluYXRlcy5cbiAgLy8gQ2FuIGFjY2VwdCBwcmVjb21wdXRlZCBaXi0xIC0gZm9yIGV4YW1wbGUsIGZyb20gaW52ZXJ0QmF0Y2guXG4gIC8vIChYLCBZLCBaKSBcdTIyMEIgKHg9WC9aLCB5PVkvWilcbiAgY29uc3QgdG9BZmZpbmVNZW1vID0gbWVtb2l6ZWQoKHA6IFBvaW50LCBpej86IFQpOiBBZmZpbmVQb2ludDxUPiA9PiB7XG4gICAgY29uc3QgeyBYLCBZLCBaIH0gPSBwO1xuICAgIC8vIEZhc3QtcGF0aCBmb3Igbm9ybWFsaXplZCBwb2ludHNcbiAgICBpZiAoRnAuZXFsKFosIEZwLk9ORSkpIHJldHVybiB7IHg6IFgsIHk6IFkgfTtcbiAgICBjb25zdCBpczAgPSBwLmlzMCgpO1xuICAgIC8vIElmIGludlogd2FzIDAsIHdlIHJldHVybiB6ZXJvIHBvaW50LiBIb3dldmVyIHdlIHN0aWxsIHdhbnQgdG8gZXhlY3V0ZVxuICAgIC8vIGFsbCBvcGVyYXRpb25zLCBzbyB3ZSByZXBsYWNlIGludlogd2l0aCBhIHJhbmRvbSBudW1iZXIsIDEuXG4gICAgaWYgKGl6ID09IG51bGwpIGl6ID0gaXMwID8gRnAuT05FIDogRnAuaW52KFopO1xuICAgIGNvbnN0IHggPSBGcC5tdWwoWCwgaXopO1xuICAgIGNvbnN0IHkgPSBGcC5tdWwoWSwgaXopO1xuICAgIGNvbnN0IHp6ID0gRnAubXVsKFosIGl6KTtcbiAgICBpZiAoaXMwKSByZXR1cm4geyB4OiBGcC5aRVJPLCB5OiBGcC5aRVJPIH07XG4gICAgaWYgKCFGcC5lcWwoenosIEZwLk9ORSkpIHRocm93IG5ldyBFcnJvcignaW52WiB3YXMgaW52YWxpZCcpO1xuICAgIHJldHVybiB7IHgsIHkgfTtcbiAgfSk7XG4gIC8vIE5PVEU6IG9uIGV4Y2VwdGlvbiB0aGlzIHdpbGwgY3Jhc2ggJ2NhY2hlZCcgYW5kIG5vIHZhbHVlIHdpbGwgYmUgc2V0LlxuICAvLyBPdGhlcndpc2UgdHJ1ZSB3aWxsIGJlIHJldHVyblxuICBjb25zdCBhc3NlcnRWYWxpZE1lbW8gPSBtZW1vaXplZCgocDogUG9pbnQpID0+IHtcbiAgICBpZiAocC5pczAoKSkge1xuICAgICAgLy8gKDAsIDEsIDApIGFrYSBaRVJPIGlzIGludmFsaWQgaW4gbW9zdCBjb250ZXh0cy5cbiAgICAgIC8vIEluIEJMUywgWkVSTyBjYW4gYmUgc2VyaWFsaXplZCwgc28gd2UgYWxsb3cgaXQuXG4gICAgICAvLyAoMCwgMCwgMCkgaXMgaW52YWxpZCByZXByZXNlbnRhdGlvbiBvZiBaRVJPLlxuICAgICAgaWYgKGV4dHJhT3B0cy5hbGxvd0luZmluaXR5UG9pbnQgJiYgIUZwLmlzMChwLlkpKSByZXR1cm47XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogWkVSTycpO1xuICAgIH1cbiAgICAvLyBTb21lIDNyZC1wYXJ0eSB0ZXN0IHZlY3RvcnMgcmVxdWlyZSBkaWZmZXJlbnQgd29yZGluZyBiZXR3ZWVuIGhlcmUgJiBgZnJvbUNvbXByZXNzZWRIZXhgXG4gICAgY29uc3QgeyB4LCB5IH0gPSBwLnRvQWZmaW5lKCk7XG4gICAgaWYgKCFGcC5pc1ZhbGlkKHgpIHx8ICFGcC5pc1ZhbGlkKHkpKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogeCBvciB5IG5vdCBmaWVsZCBlbGVtZW50cycpO1xuICAgIGlmICghaXNWYWxpZFhZKHgsIHkpKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogZXF1YXRpb24gbGVmdCAhPSByaWdodCcpO1xuICAgIGlmICghcC5pc1RvcnNpb25GcmVlKCkpIHRocm93IG5ldyBFcnJvcignYmFkIHBvaW50OiBub3QgaW4gcHJpbWUtb3JkZXIgc3ViZ3JvdXAnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gZmluaXNoRW5kbyhcbiAgICBlbmRvQmV0YTogRW5kb21vcnBoaXNtT3B0c1snYmV0YSddLFxuICAgIGsxcDogUG9pbnQsXG4gICAgazJwOiBQb2ludCxcbiAgICBrMW5lZzogYm9vbGVhbixcbiAgICBrMm5lZzogYm9vbGVhblxuICApIHtcbiAgICBrMnAgPSBuZXcgUG9pbnQoRnAubXVsKGsycC5YLCBlbmRvQmV0YSksIGsycC5ZLCBrMnAuWik7XG4gICAgazFwID0gbmVnYXRlQ3QoazFuZWcsIGsxcCk7XG4gICAgazJwID0gbmVnYXRlQ3QoazJuZWcsIGsycCk7XG4gICAgcmV0dXJuIGsxcC5hZGQoazJwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0aXZlIFBvaW50IHdvcmtzIGluIDNkIC8gcHJvamVjdGl2ZSAoaG9tb2dlbmVvdXMpIGNvb3JkaW5hdGVzOihYLCBZLCBaKSBcdTIyMEIgKHg9WC9aLCB5PVkvWikuXG4gICAqIERlZmF1bHQgUG9pbnQgd29ya3MgaW4gMmQgLyBhZmZpbmUgY29vcmRpbmF0ZXM6ICh4LCB5KS5cbiAgICogV2UncmUgZG9pbmcgY2FsY3VsYXRpb25zIGluIHByb2plY3RpdmUsIGJlY2F1c2UgaXRzIG9wZXJhdGlvbnMgZG9uJ3QgcmVxdWlyZSBjb3N0bHkgaW52ZXJzaW9uLlxuICAgKi9cbiAgY2xhc3MgUG9pbnQgaW1wbGVtZW50cyBXZWllcnN0cmFzc1BvaW50PFQ+IHtcbiAgICAvLyBiYXNlIC8gZ2VuZXJhdG9yIHBvaW50XG4gICAgc3RhdGljIHJlYWRvbmx5IEJBU0UgPSBuZXcgUG9pbnQoQ1VSVkUuR3gsIENVUlZFLkd5LCBGcC5PTkUpO1xuICAgIC8vIHplcm8gLyBpbmZpbml0eSAvIGlkZW50aXR5IHBvaW50XG4gICAgc3RhdGljIHJlYWRvbmx5IFpFUk8gPSBuZXcgUG9pbnQoRnAuWkVSTywgRnAuT05FLCBGcC5aRVJPKTsgLy8gMCwgMSwgMFxuICAgIC8vIG1hdGggZmllbGRcbiAgICBzdGF0aWMgcmVhZG9ubHkgRnAgPSBGcDtcbiAgICAvLyBzY2FsYXIgZmllbGRcbiAgICBzdGF0aWMgcmVhZG9ubHkgRm4gPSBGbjtcblxuICAgIHJlYWRvbmx5IFg6IFQ7XG4gICAgcmVhZG9ubHkgWTogVDtcbiAgICByZWFkb25seSBaOiBUO1xuXG4gICAgLyoqIERvZXMgTk9UIHZhbGlkYXRlIGlmIHRoZSBwb2ludCBpcyB2YWxpZC4gVXNlIGAuYXNzZXJ0VmFsaWRpdHkoKWAuICovXG4gICAgY29uc3RydWN0b3IoWDogVCwgWTogVCwgWjogVCkge1xuICAgICAgdGhpcy5YID0gYWNvb3JkKCd4JywgWCk7XG4gICAgICB0aGlzLlkgPSBhY29vcmQoJ3knLCBZLCB0cnVlKTtcbiAgICAgIHRoaXMuWiA9IGFjb29yZCgneicsIFopO1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgQ1VSVkUoKTogV2VpZXJzdHJhc3NPcHRzPFQ+IHtcbiAgICAgIHJldHVybiBDVVJWRTtcbiAgICB9XG5cbiAgICAvKiogRG9lcyBOT1QgdmFsaWRhdGUgaWYgdGhlIHBvaW50IGlzIHZhbGlkLiBVc2UgYC5hc3NlcnRWYWxpZGl0eSgpYC4gKi9cbiAgICBzdGF0aWMgZnJvbUFmZmluZShwOiBBZmZpbmVQb2ludDxUPik6IFBvaW50IHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcCB8fCB7fTtcbiAgICAgIGlmICghcCB8fCAhRnAuaXNWYWxpZCh4KSB8fCAhRnAuaXNWYWxpZCh5KSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFmZmluZSBwb2ludCcpO1xuICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQb2ludCkgdGhyb3cgbmV3IEVycm9yKCdwcm9qZWN0aXZlIHBvaW50IG5vdCBhbGxvd2VkJyk7XG4gICAgICAvLyAoMCwgMCkgd291bGQndmUgcHJvZHVjZWQgKDAsIDAsIDEpIC0gaW5zdGVhZCwgd2UgbmVlZCAoMCwgMSwgMClcbiAgICAgIGlmIChGcC5pczAoeCkgJiYgRnAuaXMwKHkpKSByZXR1cm4gUG9pbnQuWkVSTztcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSwgRnAuT05FKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5KTogUG9pbnQge1xuICAgICAgY29uc3QgUCA9IFBvaW50LmZyb21BZmZpbmUoZGVjb2RlUG9pbnQoYWJ5dGVzKGJ5dGVzLCB1bmRlZmluZWQsICdwb2ludCcpKSk7XG4gICAgICBQLmFzc2VydFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm4gUDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUhleChoZXg6IHN0cmluZyk6IFBvaW50IHtcbiAgICAgIHJldHVybiBQb2ludC5mcm9tQnl0ZXMoaGV4VG9CeXRlcyhoZXgpKTtcbiAgICB9XG5cbiAgICBnZXQgeCgpOiBUIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueDtcbiAgICB9XG4gICAgZ2V0IHkoKTogVCB7XG4gICAgICByZXR1cm4gdGhpcy50b0FmZmluZSgpLnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2luZG93U2l6ZVxuICAgICAqIEBwYXJhbSBpc0xhenkgdHJ1ZSB3aWxsIGRlZmVyIHRhYmxlIGNvbXB1dGF0aW9uIHVudGlsIHRoZSBmaXJzdCBtdWx0aXBsaWNhdGlvblxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJlY29tcHV0ZSh3aW5kb3dTaXplOiBudW1iZXIgPSA4LCBpc0xhenkgPSB0cnVlKTogUG9pbnQge1xuICAgICAgd25hZi5jcmVhdGVDYWNoZSh0aGlzLCB3aW5kb3dTaXplKTtcbiAgICAgIGlmICghaXNMYXp5KSB0aGlzLm11bHRpcGx5KF8zbik7IC8vIHJhbmRvbSBudW1iZXJcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJldHVybiBgdGhpc2BcbiAgICAvKiogQSBwb2ludCBvbiBjdXJ2ZSBpcyB2YWxpZCBpZiBpdCBjb25mb3JtcyB0byBlcXVhdGlvbi4gKi9cbiAgICBhc3NlcnRWYWxpZGl0eSgpOiB2b2lkIHtcbiAgICAgIGFzc2VydFZhbGlkTWVtbyh0aGlzKTtcbiAgICB9XG5cbiAgICBoYXNFdmVuWSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHsgeSB9ID0gdGhpcy50b0FmZmluZSgpO1xuICAgICAgaWYgKCFGcC5pc09kZCkgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgZG9lc24ndCBzdXBwb3J0IGlzT2RkXCIpO1xuICAgICAgcmV0dXJuICFGcC5pc09kZCh5KTtcbiAgICB9XG5cbiAgICAvKiogQ29tcGFyZSBvbmUgcG9pbnQgdG8gYW5vdGhlci4gKi9cbiAgICBlcXVhbHMob3RoZXI6IFBvaW50KTogYm9vbGVhbiB7XG4gICAgICBhcHJqcG9pbnQob3RoZXIpO1xuICAgICAgY29uc3QgeyBYOiBYMSwgWTogWTEsIFo6IFoxIH0gPSB0aGlzO1xuICAgICAgY29uc3QgeyBYOiBYMiwgWTogWTIsIFo6IFoyIH0gPSBvdGhlcjtcbiAgICAgIGNvbnN0IFUxID0gRnAuZXFsKEZwLm11bChYMSwgWjIpLCBGcC5tdWwoWDIsIFoxKSk7XG4gICAgICBjb25zdCBVMiA9IEZwLmVxbChGcC5tdWwoWTEsIFoyKSwgRnAubXVsKFkyLCBaMSkpO1xuICAgICAgcmV0dXJuIFUxICYmIFUyO1xuICAgIH1cblxuICAgIC8qKiBGbGlwcyBwb2ludCB0byBvbmUgY29ycmVzcG9uZGluZyB0byAoeCwgLXkpIGluIEFmZmluZSBjb29yZGluYXRlcy4gKi9cbiAgICBuZWdhdGUoKTogUG9pbnQge1xuICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLlgsIEZwLm5lZyh0aGlzLlkpLCB0aGlzLlopO1xuICAgIH1cblxuICAgIC8vIFJlbmVzLUNvc3RlbGxvLUJhdGluYSBleGNlcHRpb24tZnJlZSBkb3VibGluZyBmb3JtdWxhLlxuICAgIC8vIFRoZXJlIGlzIDMwJSBmYXN0ZXIgSmFjb2JpYW4gZm9ybXVsYSwgYnV0IGl0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAvLyBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDE1LzEwNjAsIGFsZ29yaXRobSAzXG4gICAgLy8gQ29zdDogOE0gKyAzUyArIDMqYSArIDIqYjMgKyAxNWFkZC5cbiAgICBkb3VibGUoKSB7XG4gICAgICBjb25zdCB7IGEsIGIgfSA9IENVUlZFO1xuICAgICAgY29uc3QgYjMgPSBGcC5tdWwoYiwgXzNuKTtcbiAgICAgIGNvbnN0IHsgWDogWDEsIFk6IFkxLCBaOiBaMSB9ID0gdGhpcztcbiAgICAgIGxldCBYMyA9IEZwLlpFUk8sIFkzID0gRnAuWkVSTywgWjMgPSBGcC5aRVJPOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGxldCB0MCA9IEZwLm11bChYMSwgWDEpOyAvLyBzdGVwIDFcbiAgICAgIGxldCB0MSA9IEZwLm11bChZMSwgWTEpO1xuICAgICAgbGV0IHQyID0gRnAubXVsKFoxLCBaMSk7XG4gICAgICBsZXQgdDMgPSBGcC5tdWwoWDEsIFkxKTtcbiAgICAgIHQzID0gRnAuYWRkKHQzLCB0Myk7IC8vIHN0ZXAgNVxuICAgICAgWjMgPSBGcC5tdWwoWDEsIFoxKTtcbiAgICAgIFozID0gRnAuYWRkKFozLCBaMyk7XG4gICAgICBYMyA9IEZwLm11bChhLCBaMyk7XG4gICAgICBZMyA9IEZwLm11bChiMywgdDIpO1xuICAgICAgWTMgPSBGcC5hZGQoWDMsIFkzKTsgLy8gc3RlcCAxMFxuICAgICAgWDMgPSBGcC5zdWIodDEsIFkzKTtcbiAgICAgIFkzID0gRnAuYWRkKHQxLCBZMyk7XG4gICAgICBZMyA9IEZwLm11bChYMywgWTMpO1xuICAgICAgWDMgPSBGcC5tdWwodDMsIFgzKTtcbiAgICAgIFozID0gRnAubXVsKGIzLCBaMyk7IC8vIHN0ZXAgMTVcbiAgICAgIHQyID0gRnAubXVsKGEsIHQyKTtcbiAgICAgIHQzID0gRnAuc3ViKHQwLCB0Mik7XG4gICAgICB0MyA9IEZwLm11bChhLCB0Myk7XG4gICAgICB0MyA9IEZwLmFkZCh0MywgWjMpO1xuICAgICAgWjMgPSBGcC5hZGQodDAsIHQwKTsgLy8gc3RlcCAyMFxuICAgICAgdDAgPSBGcC5hZGQoWjMsIHQwKTtcbiAgICAgIHQwID0gRnAuYWRkKHQwLCB0Mik7XG4gICAgICB0MCA9IEZwLm11bCh0MCwgdDMpO1xuICAgICAgWTMgPSBGcC5hZGQoWTMsIHQwKTtcbiAgICAgIHQyID0gRnAubXVsKFkxLCBaMSk7IC8vIHN0ZXAgMjVcbiAgICAgIHQyID0gRnAuYWRkKHQyLCB0Mik7XG4gICAgICB0MCA9IEZwLm11bCh0MiwgdDMpO1xuICAgICAgWDMgPSBGcC5zdWIoWDMsIHQwKTtcbiAgICAgIFozID0gRnAubXVsKHQyLCB0MSk7XG4gICAgICBaMyA9IEZwLmFkZChaMywgWjMpOyAvLyBzdGVwIDMwXG4gICAgICBaMyA9IEZwLmFkZChaMywgWjMpO1xuICAgICAgcmV0dXJuIG5ldyBQb2ludChYMywgWTMsIFozKTtcbiAgICB9XG5cbiAgICAvLyBSZW5lcy1Db3N0ZWxsby1CYXRpbmEgZXhjZXB0aW9uLWZyZWUgYWRkaXRpb24gZm9ybXVsYS5cbiAgICAvLyBUaGVyZSBpcyAzMCUgZmFzdGVyIEphY29iaWFuIGZvcm11bGEsIGJ1dCBpdCBpcyBub3QgY29tcGxldGUuXG4gICAgLy8gaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxNS8xMDYwLCBhbGdvcml0aG0gMVxuICAgIC8vIENvc3Q6IDEyTSArIDBTICsgMyphICsgMypiMyArIDIzYWRkLlxuICAgIGFkZChvdGhlcjogUG9pbnQpOiBQb2ludCB7XG4gICAgICBhcHJqcG9pbnQob3RoZXIpO1xuICAgICAgY29uc3QgeyBYOiBYMSwgWTogWTEsIFo6IFoxIH0gPSB0aGlzO1xuICAgICAgY29uc3QgeyBYOiBYMiwgWTogWTIsIFo6IFoyIH0gPSBvdGhlcjtcbiAgICAgIGxldCBYMyA9IEZwLlpFUk8sIFkzID0gRnAuWkVSTywgWjMgPSBGcC5aRVJPOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGEgPSBDVVJWRS5hO1xuICAgICAgY29uc3QgYjMgPSBGcC5tdWwoQ1VSVkUuYiwgXzNuKTtcbiAgICAgIGxldCB0MCA9IEZwLm11bChYMSwgWDIpOyAvLyBzdGVwIDFcbiAgICAgIGxldCB0MSA9IEZwLm11bChZMSwgWTIpO1xuICAgICAgbGV0IHQyID0gRnAubXVsKFoxLCBaMik7XG4gICAgICBsZXQgdDMgPSBGcC5hZGQoWDEsIFkxKTtcbiAgICAgIGxldCB0NCA9IEZwLmFkZChYMiwgWTIpOyAvLyBzdGVwIDVcbiAgICAgIHQzID0gRnAubXVsKHQzLCB0NCk7XG4gICAgICB0NCA9IEZwLmFkZCh0MCwgdDEpO1xuICAgICAgdDMgPSBGcC5zdWIodDMsIHQ0KTtcbiAgICAgIHQ0ID0gRnAuYWRkKFgxLCBaMSk7XG4gICAgICBsZXQgdDUgPSBGcC5hZGQoWDIsIFoyKTsgLy8gc3RlcCAxMFxuICAgICAgdDQgPSBGcC5tdWwodDQsIHQ1KTtcbiAgICAgIHQ1ID0gRnAuYWRkKHQwLCB0Mik7XG4gICAgICB0NCA9IEZwLnN1Yih0NCwgdDUpO1xuICAgICAgdDUgPSBGcC5hZGQoWTEsIFoxKTtcbiAgICAgIFgzID0gRnAuYWRkKFkyLCBaMik7IC8vIHN0ZXAgMTVcbiAgICAgIHQ1ID0gRnAubXVsKHQ1LCBYMyk7XG4gICAgICBYMyA9IEZwLmFkZCh0MSwgdDIpO1xuICAgICAgdDUgPSBGcC5zdWIodDUsIFgzKTtcbiAgICAgIFozID0gRnAubXVsKGEsIHQ0KTtcbiAgICAgIFgzID0gRnAubXVsKGIzLCB0Mik7IC8vIHN0ZXAgMjBcbiAgICAgIFozID0gRnAuYWRkKFgzLCBaMyk7XG4gICAgICBYMyA9IEZwLnN1Yih0MSwgWjMpO1xuICAgICAgWjMgPSBGcC5hZGQodDEsIFozKTtcbiAgICAgIFkzID0gRnAubXVsKFgzLCBaMyk7XG4gICAgICB0MSA9IEZwLmFkZCh0MCwgdDApOyAvLyBzdGVwIDI1XG4gICAgICB0MSA9IEZwLmFkZCh0MSwgdDApO1xuICAgICAgdDIgPSBGcC5tdWwoYSwgdDIpO1xuICAgICAgdDQgPSBGcC5tdWwoYjMsIHQ0KTtcbiAgICAgIHQxID0gRnAuYWRkKHQxLCB0Mik7XG4gICAgICB0MiA9IEZwLnN1Yih0MCwgdDIpOyAvLyBzdGVwIDMwXG4gICAgICB0MiA9IEZwLm11bChhLCB0Mik7XG4gICAgICB0NCA9IEZwLmFkZCh0NCwgdDIpO1xuICAgICAgdDAgPSBGcC5tdWwodDEsIHQ0KTtcbiAgICAgIFkzID0gRnAuYWRkKFkzLCB0MCk7XG4gICAgICB0MCA9IEZwLm11bCh0NSwgdDQpOyAvLyBzdGVwIDM1XG4gICAgICBYMyA9IEZwLm11bCh0MywgWDMpO1xuICAgICAgWDMgPSBGcC5zdWIoWDMsIHQwKTtcbiAgICAgIHQwID0gRnAubXVsKHQzLCB0MSk7XG4gICAgICBaMyA9IEZwLm11bCh0NSwgWjMpO1xuICAgICAgWjMgPSBGcC5hZGQoWjMsIHQwKTsgLy8gc3RlcCA0MFxuICAgICAgcmV0dXJuIG5ldyBQb2ludChYMywgWTMsIFozKTtcbiAgICB9XG5cbiAgICBzdWJ0cmFjdChvdGhlcjogUG9pbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZChvdGhlci5uZWdhdGUoKSk7XG4gICAgfVxuXG4gICAgaXMwKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKFBvaW50LlpFUk8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IHRpbWUgbXVsdGlwbGljYXRpb24uXG4gICAgICogVXNlcyB3TkFGIG1ldGhvZC4gV2luZG93ZWQgbWV0aG9kIG1heSBiZSAxMCUgZmFzdGVyLFxuICAgICAqIGJ1dCB0YWtlcyAyeCBsb25nZXIgdG8gZ2VuZXJhdGUgYW5kIGNvbnN1bWVzIDJ4IG1lbW9yeS5cbiAgICAgKiBVc2VzIHByZWNvbXB1dGVzIHdoZW4gYXZhaWxhYmxlLlxuICAgICAqIFVzZXMgZW5kb21vcnBoaXNtIGZvciBLb2JsaXR6IGN1cnZlcy5cbiAgICAgKiBAcGFyYW0gc2NhbGFyIGJ5IHdoaWNoIHRoZSBwb2ludCB3b3VsZCBiZSBtdWx0aXBsaWVkXG4gICAgICogQHJldHVybnMgTmV3IHBvaW50XG4gICAgICovXG4gICAgbXVsdGlwbHkoc2NhbGFyOiBiaWdpbnQpOiBQb2ludCB7XG4gICAgICBjb25zdCB7IGVuZG8gfSA9IGV4dHJhT3B0cztcbiAgICAgIGlmICghRm4uaXNWYWxpZE5vdDAoc2NhbGFyKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjYWxhcjogb3V0IG9mIHJhbmdlJyk7IC8vIDAgaXMgaW52YWxpZFxuICAgICAgbGV0IHBvaW50OiBQb2ludCwgZmFrZTogUG9pbnQ7IC8vIEZha2UgcG9pbnQgaXMgdXNlZCB0byBjb25zdC10aW1lIG11bHRcbiAgICAgIGNvbnN0IG11bCA9IChuOiBiaWdpbnQpID0+IHduYWYuY2FjaGVkKHRoaXMsIG4sIChwKSA9PiBub3JtYWxpemVaKFBvaW50LCBwKSk7XG4gICAgICAvKiogU2VlIGRvY3MgZm9yIHtAbGluayBFbmRvbW9ycGhpc21PcHRzfSAqL1xuICAgICAgaWYgKGVuZG8pIHtcbiAgICAgICAgY29uc3QgeyBrMW5lZywgazEsIGsybmVnLCBrMiB9ID0gc3BsaXRFbmRvU2NhbGFyTihzY2FsYXIpO1xuICAgICAgICBjb25zdCB7IHA6IGsxcCwgZjogazFmIH0gPSBtdWwoazEpO1xuICAgICAgICBjb25zdCB7IHA6IGsycCwgZjogazJmIH0gPSBtdWwoazIpO1xuICAgICAgICBmYWtlID0gazFmLmFkZChrMmYpO1xuICAgICAgICBwb2ludCA9IGZpbmlzaEVuZG8oZW5kby5iZXRhLCBrMXAsIGsycCwgazFuZWcsIGsybmVnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgcCwgZiB9ID0gbXVsKHNjYWxhcik7XG4gICAgICAgIHBvaW50ID0gcDtcbiAgICAgICAgZmFrZSA9IGY7XG4gICAgICB9XG4gICAgICAvLyBOb3JtYWxpemUgYHpgIGZvciBib3RoIHBvaW50cywgYnV0IHJldHVybiBvbmx5IHJlYWwgb25lXG4gICAgICByZXR1cm4gbm9ybWFsaXplWihQb2ludCwgW3BvaW50LCBmYWtlXSlbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9uLWNvbnN0YW50LXRpbWUgbXVsdGlwbGljYXRpb24uIFVzZXMgZG91YmxlLWFuZC1hZGQgYWxnb3JpdGhtLlxuICAgICAqIEl0J3MgZmFzdGVyLCBidXQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBkb24ndCBjYXJlIGFib3V0XG4gICAgICogYW4gZXhwb3NlZCBzZWNyZXQga2V5IGUuZy4gc2lnIHZlcmlmaWNhdGlvbiwgd2hpY2ggd29ya3Mgb3ZlciAqcHVibGljKiBrZXlzLlxuICAgICAqL1xuICAgIG11bHRpcGx5VW5zYWZlKHNjOiBiaWdpbnQpOiBQb2ludCB7XG4gICAgICBjb25zdCB7IGVuZG8gfSA9IGV4dHJhT3B0cztcbiAgICAgIGNvbnN0IHAgPSB0aGlzIGFzIFBvaW50O1xuICAgICAgaWYgKCFGbi5pc1ZhbGlkKHNjKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjYWxhcjogb3V0IG9mIHJhbmdlJyk7IC8vIDAgaXMgdmFsaWRcbiAgICAgIGlmIChzYyA9PT0gXzBuIHx8IHAuaXMwKCkpIHJldHVybiBQb2ludC5aRVJPOyAvLyAwXG4gICAgICBpZiAoc2MgPT09IF8xbikgcmV0dXJuIHA7IC8vIDFcbiAgICAgIGlmICh3bmFmLmhhc0NhY2hlKHRoaXMpKSByZXR1cm4gdGhpcy5tdWx0aXBseShzYyk7IC8vIHByZWNvbXB1dGVzXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIG1ldGhvZCBmb3IgZG91YmxlIHNjYWxhciBtdWx0aXBsaWNhdGlvbiAoYVAgKyBiUSk6XG4gICAgICAvLyBFdmVuIHdpdGggdXNpbmcgU3RyYXVzcy1TaGFtaXIgdHJpY2ssIGl0J3MgMzUlIHNsb3dlciB0aGFuIG5hXHUwMEVGdmUgbXVsK2FkZC5cbiAgICAgIGlmIChlbmRvKSB7XG4gICAgICAgIGNvbnN0IHsgazFuZWcsIGsxLCBrMm5lZywgazIgfSA9IHNwbGl0RW5kb1NjYWxhck4oc2MpO1xuICAgICAgICBjb25zdCB7IHAxLCBwMiB9ID0gbXVsRW5kb1Vuc2FmZShQb2ludCwgcCwgazEsIGsyKTsgLy8gMzAlIGZhc3RlciB2cyB3bmFmLnVuc2FmZVxuICAgICAgICByZXR1cm4gZmluaXNoRW5kbyhlbmRvLmJldGEsIHAxLCBwMiwgazFuZWcsIGsybmVnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB3bmFmLnVuc2FmZShwLCBzYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgUHJvamVjdGl2ZSBwb2ludCB0byBhZmZpbmUgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSBpbnZlcnRlZFogWl4tMSAoaW52ZXJ0ZWQgemVybykgLSBvcHRpb25hbCwgcHJlY29tcHV0YXRpb24gaXMgdXNlZnVsIGZvciBpbnZlcnRCYXRjaFxuICAgICAqL1xuICAgIHRvQWZmaW5lKGludmVydGVkWj86IFQpOiBBZmZpbmVQb2ludDxUPiB7XG4gICAgICByZXR1cm4gdG9BZmZpbmVNZW1vKHRoaXMsIGludmVydGVkWik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgUG9pbnQgaXMgZnJlZSBvZiB0b3JzaW9uIGVsZW1lbnRzIChpcyBpbiBwcmltZSBzdWJncm91cCkuXG4gICAgICogQWx3YXlzIHRvcnNpb24tZnJlZSBmb3IgY29mYWN0b3I9MSBjdXJ2ZXMuXG4gICAgICovXG4gICAgaXNUb3JzaW9uRnJlZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHsgaXNUb3JzaW9uRnJlZSB9ID0gZXh0cmFPcHRzO1xuICAgICAgaWYgKGNvZmFjdG9yID09PSBfMW4pIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGlzVG9yc2lvbkZyZWUpIHJldHVybiBpc1RvcnNpb25GcmVlKFBvaW50LCB0aGlzKTtcbiAgICAgIHJldHVybiB3bmFmLnVuc2FmZSh0aGlzLCBDVVJWRV9PUkRFUikuaXMwKCk7XG4gICAgfVxuXG4gICAgY2xlYXJDb2ZhY3RvcigpOiBQb2ludCB7XG4gICAgICBjb25zdCB7IGNsZWFyQ29mYWN0b3IgfSA9IGV4dHJhT3B0cztcbiAgICAgIGlmIChjb2ZhY3RvciA9PT0gXzFuKSByZXR1cm4gdGhpczsgLy8gRmFzdC1wYXRoXG4gICAgICBpZiAoY2xlYXJDb2ZhY3RvcikgcmV0dXJuIGNsZWFyQ29mYWN0b3IoUG9pbnQsIHRoaXMpIGFzIFBvaW50O1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlVbnNhZmUoY29mYWN0b3IpO1xuICAgIH1cblxuICAgIGlzU21hbGxPcmRlcigpOiBib29sZWFuIHtcbiAgICAgIC8vIGNhbiB3ZSB1c2UgdGhpcy5jbGVhckNvZmFjdG9yKCk/XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVVuc2FmZShjb2ZhY3RvcikuaXMwKCk7XG4gICAgfVxuXG4gICAgdG9CeXRlcyhpc0NvbXByZXNzZWQgPSB0cnVlKTogVWludDhBcnJheSB7XG4gICAgICBhYm9vbChpc0NvbXByZXNzZWQsICdpc0NvbXByZXNzZWQnKTtcbiAgICAgIHRoaXMuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybiBlbmNvZGVQb2ludChQb2ludCwgdGhpcywgaXNDb21wcmVzc2VkKTtcbiAgICB9XG5cbiAgICB0b0hleChpc0NvbXByZXNzZWQgPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBieXRlc1RvSGV4KHRoaXMudG9CeXRlcyhpc0NvbXByZXNzZWQpKTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBgPFBvaW50ICR7dGhpcy5pczAoKSA/ICdaRVJPJyA6IHRoaXMudG9IZXgoKX0+YDtcbiAgICB9XG4gIH1cbiAgY29uc3QgYml0cyA9IEZuLkJJVFM7XG4gIGNvbnN0IHduYWYgPSBuZXcgd05BRihQb2ludCwgZXh0cmFPcHRzLmVuZG8gPyBNYXRoLmNlaWwoYml0cyAvIDIpIDogYml0cyk7XG4gIFBvaW50LkJBU0UucHJlY29tcHV0ZSg4KTsgLy8gRW5hYmxlIHByZWNvbXB1dGVzLiBTbG93cyBkb3duIGZpcnN0IHB1YmxpY0tleSBjb21wdXRhdGlvbiBieSAyMG1zLlxuICByZXR1cm4gUG9pbnQ7XG59XG5cbi8qKiBNZXRob2RzIG9mIEVDRFNBIHNpZ25hdHVyZSBpbnN0YW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUNEU0FTaWduYXR1cmUge1xuICByZWFkb25seSByOiBiaWdpbnQ7XG4gIHJlYWRvbmx5IHM6IGJpZ2ludDtcbiAgcmVhZG9ubHkgcmVjb3Zlcnk/OiBudW1iZXI7XG4gIGFkZFJlY292ZXJ5Qml0KHJlY292ZXJ5OiBudW1iZXIpOiBFQ0RTQVNpZ25hdHVyZSAmIHsgcmVhZG9ubHkgcmVjb3Zlcnk6IG51bWJlciB9O1xuICBoYXNIaWdoUygpOiBib29sZWFuO1xuICByZWNvdmVyUHVibGljS2V5KG1lc3NhZ2VIYXNoOiBVaW50OEFycmF5KTogV2VpZXJzdHJhc3NQb2ludDxiaWdpbnQ+O1xuICB0b0J5dGVzKGZvcm1hdD86IHN0cmluZyk6IFVpbnQ4QXJyYXk7XG4gIHRvSGV4KGZvcm1hdD86IHN0cmluZyk6IHN0cmluZztcbn1cbi8qKiBNZXRob2RzIG9mIEVDRFNBIHNpZ25hdHVyZSBjb25zdHJ1Y3Rvci4gKi9cbmV4cG9ydCB0eXBlIEVDRFNBU2lnbmF0dXJlQ29ucyA9IHtcbiAgbmV3IChyOiBiaWdpbnQsIHM6IGJpZ2ludCwgcmVjb3Zlcnk/OiBudW1iZXIpOiBFQ0RTQVNpZ25hdHVyZTtcbiAgZnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5LCBmb3JtYXQ/OiBFQ0RTQVNpZ25hdHVyZUZvcm1hdCk6IEVDRFNBU2lnbmF0dXJlO1xuICBmcm9tSGV4KGhleDogc3RyaW5nLCBmb3JtYXQ/OiBFQ0RTQVNpZ25hdHVyZUZvcm1hdCk6IEVDRFNBU2lnbmF0dXJlO1xufTtcblxuLy8gUG9pbnRzIHN0YXJ0IHdpdGggYnl0ZSAweDAyIHdoZW4geSBpcyBldmVuOyBvdGhlcndpc2UgMHgwM1xuZnVuY3Rpb24gcHByZWZpeChoYXNFdmVuWTogYm9vbGVhbik6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gVWludDhBcnJheS5vZihoYXNFdmVuWSA/IDB4MDIgOiAweDAzKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2hhbGx1ZSBhbmQgdmFuIGRlIFdvZXN0aWpuZSBtZXRob2QgZm9yIGFueSB3ZWllcnN0cmFzcyBjdXJ2ZS5cbiAqIFRPRE86IGNoZWNrIGlmIHRoZXJlIGlzIGEgd2F5IHRvIG1lcmdlIHRoaXMgd2l0aCB1dlJhdGlvIGluIEVkd2FyZHM7IG1vdmUgdG8gbW9kdWxhci5cbiAqIGIgPSBUcnVlIGFuZCB5ID0gc3FydCh1IC8gdikgaWYgKHUgLyB2KSBpcyBzcXVhcmUgaW4gRiwgYW5kXG4gKiBiID0gRmFsc2UgYW5kIHkgPSBzcXJ0KFogKiAodSAvIHYpKSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gRnBcbiAqIEBwYXJhbSBaXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gU1dVRnBTcXJ0UmF0aW88VD4oXG4gIEZwOiBJRmllbGQ8VD4sXG4gIFo6IFRcbik6ICh1OiBULCB2OiBUKSA9PiB7IGlzVmFsaWQ6IGJvb2xlYW47IHZhbHVlOiBUIH0ge1xuICAvLyBHZW5lcmljIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IHEgPSBGcC5PUkRFUjtcbiAgbGV0IGwgPSBfMG47XG4gIGZvciAobGV0IG8gPSBxIC0gXzFuOyBvICUgXzJuID09PSBfMG47IG8gLz0gXzJuKSBsICs9IF8xbjtcbiAgY29uc3QgYzEgPSBsOyAvLyAxLiBjMSwgdGhlIGxhcmdlc3QgaW50ZWdlciBzdWNoIHRoYXQgMl5jMSBkaXZpZGVzIHEgLSAxLlxuICAvLyBXZSBuZWVkIDJuICoqIGMxIGFuZCAybiAqKiAoYzEtMSkuIFdlIGNhbid0IHVzZSAqKjsgYnV0IHdlIGNhbiB1c2UgPDwuXG4gIC8vIDJuICoqIGMxID09IDJuIDw8IChjMS0xKVxuICBjb25zdCBfMm5fcG93X2MxXzEgPSBfMm4gPDwgKGMxIC0gXzFuIC0gXzFuKTtcbiAgY29uc3QgXzJuX3Bvd19jMSA9IF8ybl9wb3dfYzFfMSAqIF8ybjtcbiAgY29uc3QgYzIgPSAocSAtIF8xbikgLyBfMm5fcG93X2MxOyAvLyAyLiBjMiA9IChxIC0gMSkgLyAoMl5jMSkgICMgSW50ZWdlciBhcml0aG1ldGljXG4gIGNvbnN0IGMzID0gKGMyIC0gXzFuKSAvIF8ybjsgLy8gMy4gYzMgPSAoYzIgLSAxKSAvIDIgICAgICAgICAgICAjIEludGVnZXIgYXJpdGhtZXRpY1xuICBjb25zdCBjNCA9IF8ybl9wb3dfYzEgLSBfMW47IC8vIDQuIGM0ID0gMl5jMSAtIDEgICAgICAgICAgICAgICAgIyBJbnRlZ2VyIGFyaXRobWV0aWNcbiAgY29uc3QgYzUgPSBfMm5fcG93X2MxXzE7IC8vIDUuIGM1ID0gMl4oYzEgLSAxKSAgICAgICAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gIGNvbnN0IGM2ID0gRnAucG93KFosIGMyKTsgLy8gNi4gYzYgPSBaXmMyXG4gIGNvbnN0IGM3ID0gRnAucG93KFosIChjMiArIF8xbikgLyBfMm4pOyAvLyA3LiBjNyA9IFpeKChjMiArIDEpIC8gMilcbiAgbGV0IHNxcnRSYXRpbyA9ICh1OiBULCB2OiBUKTogeyBpc1ZhbGlkOiBib29sZWFuOyB2YWx1ZTogVCB9ID0+IHtcbiAgICBsZXQgdHYxID0gYzY7IC8vIDEuIHR2MSA9IGM2XG4gICAgbGV0IHR2MiA9IEZwLnBvdyh2LCBjNCk7IC8vIDIuIHR2MiA9IHZeYzRcbiAgICBsZXQgdHYzID0gRnAuc3FyKHR2Mik7IC8vIDMuIHR2MyA9IHR2Ml4yXG4gICAgdHYzID0gRnAubXVsKHR2Mywgdik7IC8vIDQuIHR2MyA9IHR2MyAqIHZcbiAgICBsZXQgdHY1ID0gRnAubXVsKHUsIHR2Myk7IC8vIDUuIHR2NSA9IHUgKiB0djNcbiAgICB0djUgPSBGcC5wb3codHY1LCBjMyk7IC8vIDYuIHR2NSA9IHR2NV5jM1xuICAgIHR2NSA9IEZwLm11bCh0djUsIHR2Mik7IC8vIDcuIHR2NSA9IHR2NSAqIHR2MlxuICAgIHR2MiA9IEZwLm11bCh0djUsIHYpOyAvLyA4LiB0djIgPSB0djUgKiB2XG4gICAgdHYzID0gRnAubXVsKHR2NSwgdSk7IC8vIDkuIHR2MyA9IHR2NSAqIHVcbiAgICBsZXQgdHY0ID0gRnAubXVsKHR2MywgdHYyKTsgLy8gMTAuIHR2NCA9IHR2MyAqIHR2MlxuICAgIHR2NSA9IEZwLnBvdyh0djQsIGM1KTsgLy8gMTEuIHR2NSA9IHR2NF5jNVxuICAgIGxldCBpc1FSID0gRnAuZXFsKHR2NSwgRnAuT05FKTsgLy8gMTIuIGlzUVIgPSB0djUgPT0gMVxuICAgIHR2MiA9IEZwLm11bCh0djMsIGM3KTsgLy8gMTMuIHR2MiA9IHR2MyAqIGM3XG4gICAgdHY1ID0gRnAubXVsKHR2NCwgdHYxKTsgLy8gMTQuIHR2NSA9IHR2NCAqIHR2MVxuICAgIHR2MyA9IEZwLmNtb3YodHYyLCB0djMsIGlzUVIpOyAvLyAxNS4gdHYzID0gQ01PVih0djIsIHR2MywgaXNRUilcbiAgICB0djQgPSBGcC5jbW92KHR2NSwgdHY0LCBpc1FSKTsgLy8gMTYuIHR2NCA9IENNT1YodHY1LCB0djQsIGlzUVIpXG4gICAgLy8gMTcuIGZvciBpIGluIChjMSwgYzEgLSAxLCAuLi4sIDIpOlxuICAgIGZvciAobGV0IGkgPSBjMTsgaSA+IF8xbjsgaS0tKSB7XG4gICAgICBsZXQgdHY1ID0gaSAtIF8ybjsgLy8gMTguICAgIHR2NSA9IGkgLSAyXG4gICAgICB0djUgPSBfMm4gPDwgKHR2NSAtIF8xbik7IC8vIDE5LiAgICB0djUgPSAyXnR2NVxuICAgICAgbGV0IHR2djUgPSBGcC5wb3codHY0LCB0djUpOyAvLyAyMC4gICAgdHY1ID0gdHY0XnR2NVxuICAgICAgY29uc3QgZTEgPSBGcC5lcWwodHZ2NSwgRnAuT05FKTsgLy8gMjEuICAgIGUxID0gdHY1ID09IDFcbiAgICAgIHR2MiA9IEZwLm11bCh0djMsIHR2MSk7IC8vIDIyLiAgICB0djIgPSB0djMgKiB0djFcbiAgICAgIHR2MSA9IEZwLm11bCh0djEsIHR2MSk7IC8vIDIzLiAgICB0djEgPSB0djEgKiB0djFcbiAgICAgIHR2djUgPSBGcC5tdWwodHY0LCB0djEpOyAvLyAyNC4gICAgdHY1ID0gdHY0ICogdHYxXG4gICAgICB0djMgPSBGcC5jbW92KHR2MiwgdHYzLCBlMSk7IC8vIDI1LiAgICB0djMgPSBDTU9WKHR2MiwgdHYzLCBlMSlcbiAgICAgIHR2NCA9IEZwLmNtb3YodHZ2NSwgdHY0LCBlMSk7IC8vIDI2LiAgICB0djQgPSBDTU9WKHR2NSwgdHY0LCBlMSlcbiAgICB9XG4gICAgcmV0dXJuIHsgaXNWYWxpZDogaXNRUiwgdmFsdWU6IHR2MyB9O1xuICB9O1xuICBpZiAoRnAuT1JERVIgJSBfNG4gPT09IF8zbikge1xuICAgIC8vIHNxcnRfcmF0aW9fM21vZDQodSwgdilcbiAgICBjb25zdCBjMSA9IChGcC5PUkRFUiAtIF8zbikgLyBfNG47IC8vIDEuIGMxID0gKHEgLSAzKSAvIDQgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzIgPSBGcC5zcXJ0KEZwLm5lZyhaKSk7IC8vIDIuIGMyID0gc3FydCgtWilcbiAgICBzcXJ0UmF0aW8gPSAodTogVCwgdjogVCkgPT4ge1xuICAgICAgbGV0IHR2MSA9IEZwLnNxcih2KTsgLy8gMS4gdHYxID0gdl4yXG4gICAgICBjb25zdCB0djIgPSBGcC5tdWwodSwgdik7IC8vIDIuIHR2MiA9IHUgKiB2XG4gICAgICB0djEgPSBGcC5tdWwodHYxLCB0djIpOyAvLyAzLiB0djEgPSB0djEgKiB0djJcbiAgICAgIGxldCB5MSA9IEZwLnBvdyh0djEsIGMxKTsgLy8gNC4geTEgPSB0djFeYzFcbiAgICAgIHkxID0gRnAubXVsKHkxLCB0djIpOyAvLyA1LiB5MSA9IHkxICogdHYyXG4gICAgICBjb25zdCB5MiA9IEZwLm11bCh5MSwgYzIpOyAvLyA2LiB5MiA9IHkxICogYzJcbiAgICAgIGNvbnN0IHR2MyA9IEZwLm11bChGcC5zcXIoeTEpLCB2KTsgLy8gNy4gdHYzID0geTFeMjsgOC4gdHYzID0gdHYzICogdlxuICAgICAgY29uc3QgaXNRUiA9IEZwLmVxbCh0djMsIHUpOyAvLyA5LiBpc1FSID0gdHYzID09IHVcbiAgICAgIGxldCB5ID0gRnAuY21vdih5MiwgeTEsIGlzUVIpOyAvLyAxMC4geSA9IENNT1YoeTIsIHkxLCBpc1FSKVxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogaXNRUiwgdmFsdWU6IHkgfTsgLy8gMTEuIHJldHVybiAoaXNRUiwgeSkgaXNRUiA/IHkgOiB5KmMyXG4gICAgfTtcbiAgfVxuICAvLyBObyBjdXJ2ZXMgdXNlcyB0aGF0XG4gIC8vIGlmIChGcC5PUkRFUiAlIF84biA9PT0gXzVuKSAvLyBzcXJ0X3JhdGlvXzVtb2Q4XG4gIHJldHVybiBzcXJ0UmF0aW87XG59XG4vKipcbiAqIFNpbXBsaWZpZWQgU2hhbGx1ZS12YW4gZGUgV29lc3Rpam5lLVVsYXMgTWV0aG9kXG4gKiBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTM4MCNzZWN0aW9uLTYuNi4yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb0N1cnZlU2ltcGxlU1dVPFQ+KFxuICBGcDogSUZpZWxkPFQ+LFxuICBvcHRzOiB7XG4gICAgQTogVDtcbiAgICBCOiBUO1xuICAgIFo6IFQ7XG4gIH1cbik6ICh1OiBUKSA9PiB7IHg6IFQ7IHk6IFQgfSB7XG4gIHZhbGlkYXRlRmllbGQoRnApO1xuICBjb25zdCB7IEEsIEIsIFogfSA9IG9wdHM7XG4gIGlmICghRnAuaXNWYWxpZChBKSB8fCAhRnAuaXNWYWxpZChCKSB8fCAhRnAuaXNWYWxpZChaKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21hcFRvQ3VydmVTaW1wbGVTV1U6IGludmFsaWQgb3B0cycpO1xuICBjb25zdCBzcXJ0UmF0aW8gPSBTV1VGcFNxcnRSYXRpbyhGcCwgWik7XG4gIGlmICghRnAuaXNPZGQpIHRocm93IG5ldyBFcnJvcignRmllbGQgZG9lcyBub3QgaGF2ZSAuaXNPZGQoKScpO1xuICAvLyBJbnB1dDogdSwgYW4gZWxlbWVudCBvZiBGLlxuICAvLyBPdXRwdXQ6ICh4LCB5KSwgYSBwb2ludCBvbiBFLlxuICByZXR1cm4gKHU6IFQpOiB7IHg6IFQ7IHk6IFQgfSA9PiB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgbGV0IHR2MSwgdHYyLCB0djMsIHR2NCwgdHY1LCB0djYsIHgsIHk7XG4gICAgdHYxID0gRnAuc3FyKHUpOyAvLyAxLiAgdHYxID0gdV4yXG4gICAgdHYxID0gRnAubXVsKHR2MSwgWik7IC8vIDIuICB0djEgPSBaICogdHYxXG4gICAgdHYyID0gRnAuc3FyKHR2MSk7IC8vIDMuICB0djIgPSB0djFeMlxuICAgIHR2MiA9IEZwLmFkZCh0djIsIHR2MSk7IC8vIDQuICB0djIgPSB0djIgKyB0djFcbiAgICB0djMgPSBGcC5hZGQodHYyLCBGcC5PTkUpOyAvLyA1LiAgdHYzID0gdHYyICsgMVxuICAgIHR2MyA9IEZwLm11bCh0djMsIEIpOyAvLyA2LiAgdHYzID0gQiAqIHR2M1xuICAgIHR2NCA9IEZwLmNtb3YoWiwgRnAubmVnKHR2MiksICFGcC5lcWwodHYyLCBGcC5aRVJPKSk7IC8vIDcuICB0djQgPSBDTU9WKFosIC10djIsIHR2MiAhPSAwKVxuICAgIHR2NCA9IEZwLm11bCh0djQsIEEpOyAvLyA4LiAgdHY0ID0gQSAqIHR2NFxuICAgIHR2MiA9IEZwLnNxcih0djMpOyAvLyA5LiAgdHYyID0gdHYzXjJcbiAgICB0djYgPSBGcC5zcXIodHY0KTsgLy8gMTAuIHR2NiA9IHR2NF4yXG4gICAgdHY1ID0gRnAubXVsKHR2NiwgQSk7IC8vIDExLiB0djUgPSBBICogdHY2XG4gICAgdHYyID0gRnAuYWRkKHR2MiwgdHY1KTsgLy8gMTIuIHR2MiA9IHR2MiArIHR2NVxuICAgIHR2MiA9IEZwLm11bCh0djIsIHR2Myk7IC8vIDEzLiB0djIgPSB0djIgKiB0djNcbiAgICB0djYgPSBGcC5tdWwodHY2LCB0djQpOyAvLyAxNC4gdHY2ID0gdHY2ICogdHY0XG4gICAgdHY1ID0gRnAubXVsKHR2NiwgQik7IC8vIDE1LiB0djUgPSBCICogdHY2XG4gICAgdHYyID0gRnAuYWRkKHR2MiwgdHY1KTsgLy8gMTYuIHR2MiA9IHR2MiArIHR2NVxuICAgIHggPSBGcC5tdWwodHYxLCB0djMpOyAvLyAxNy4gICB4ID0gdHYxICogdHYzXG4gICAgY29uc3QgeyBpc1ZhbGlkLCB2YWx1ZSB9ID0gc3FydFJhdGlvKHR2MiwgdHY2KTsgLy8gMTguIChpc19neDFfc3F1YXJlLCB5MSkgPSBzcXJ0X3JhdGlvKHR2MiwgdHY2KVxuICAgIHkgPSBGcC5tdWwodHYxLCB1KTsgLy8gMTkuICAgeSA9IHR2MSAqIHUgIC0+IFogKiB1XjMgKiB5MVxuICAgIHkgPSBGcC5tdWwoeSwgdmFsdWUpOyAvLyAyMC4gICB5ID0geSAqIHkxXG4gICAgeCA9IEZwLmNtb3YoeCwgdHYzLCBpc1ZhbGlkKTsgLy8gMjEuICAgeCA9IENNT1YoeCwgdHYzLCBpc19neDFfc3F1YXJlKVxuICAgIHkgPSBGcC5jbW92KHksIHZhbHVlLCBpc1ZhbGlkKTsgLy8gMjIuICAgeSA9IENNT1YoeSwgeTEsIGlzX2d4MV9zcXVhcmUpXG4gICAgY29uc3QgZTEgPSBGcC5pc09kZCEodSkgPT09IEZwLmlzT2RkISh5KTsgLy8gMjMuICBlMSA9IHNnbjAodSkgPT0gc2duMCh5KVxuICAgIHkgPSBGcC5jbW92KEZwLm5lZyh5KSwgeSwgZTEpOyAvLyAyNC4gICB5ID0gQ01PVigteSwgeSwgZTEpXG4gICAgY29uc3QgdHY0X2ludiA9IEZwSW52ZXJ0QmF0Y2goRnAsIFt0djRdLCB0cnVlKVswXTtcbiAgICB4ID0gRnAubXVsKHgsIHR2NF9pbnYpOyAvLyAyNS4gICB4ID0geCAvIHR2NFxuICAgIHJldHVybiB7IHgsIHkgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0V0xlbmd0aHM8VD4oRnA6IElGaWVsZDxUPiwgRm46IElGaWVsZDxiaWdpbnQ+KSB7XG4gIHJldHVybiB7XG4gICAgc2VjcmV0S2V5OiBGbi5CWVRFUyxcbiAgICBwdWJsaWNLZXk6IDEgKyBGcC5CWVRFUyxcbiAgICBwdWJsaWNLZXlVbmNvbXByZXNzZWQ6IDEgKyAyICogRnAuQllURVMsXG4gICAgcHVibGljS2V5SGFzUHJlZml4OiB0cnVlLFxuICAgIHNpZ25hdHVyZTogMiAqIEZuLkJZVEVTLFxuICB9O1xufVxuXG4vKipcbiAqIFNvbWV0aW1lcyB1c2VycyBvbmx5IG5lZWQgZ2V0UHVibGljS2V5LCBnZXRTaGFyZWRTZWNyZXQsIGFuZCBzZWNyZXQga2V5IGhhbmRsaW5nLlxuICogVGhpcyBoZWxwZXIgZW5zdXJlcyBubyBzaWduYXR1cmUgZnVuY3Rpb25hbGl0eSBpcyBwcmVzZW50LiBMZXNzIGNvZGUsIHNtYWxsZXIgYnVuZGxlIHNpemUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlY2RoKFxuICBQb2ludDogV2VpZXJzdHJhc3NQb2ludENvbnM8YmlnaW50PixcbiAgZWNkaE9wdHM6IHsgcmFuZG9tQnl0ZXM/OiAoYnl0ZXNMZW5ndGg/OiBudW1iZXIpID0+IFVpbnQ4QXJyYXkgfSA9IHt9XG4pOiBFQ0RIIHtcbiAgY29uc3QgeyBGbiB9ID0gUG9pbnQ7XG4gIGNvbnN0IHJhbmRvbUJ5dGVzXyA9IGVjZGhPcHRzLnJhbmRvbUJ5dGVzIHx8IHdjUmFuZG9tQnl0ZXM7XG4gIGNvbnN0IGxlbmd0aHMgPSBPYmplY3QuYXNzaWduKGdldFdMZW5ndGhzKFBvaW50LkZwLCBGbiksIHsgc2VlZDogZ2V0TWluSGFzaExlbmd0aChGbi5PUkRFUikgfSk7XG5cbiAgZnVuY3Rpb24gaXNWYWxpZFNlY3JldEtleShzZWNyZXRLZXk6IFVpbnQ4QXJyYXkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbnVtID0gRm4uZnJvbUJ5dGVzKHNlY3JldEtleSk7XG4gICAgICByZXR1cm4gRm4uaXNWYWxpZE5vdDAobnVtKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5OiBVaW50OEFycmF5LCBpc0NvbXByZXNzZWQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBwdWJsaWNLZXk6IGNvbXAsIHB1YmxpY0tleVVuY29tcHJlc3NlZCB9ID0gbGVuZ3RocztcbiAgICB0cnkge1xuICAgICAgY29uc3QgbCA9IHB1YmxpY0tleS5sZW5ndGg7XG4gICAgICBpZiAoaXNDb21wcmVzc2VkID09PSB0cnVlICYmIGwgIT09IGNvbXApIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChpc0NvbXByZXNzZWQgPT09IGZhbHNlICYmIGwgIT09IHB1YmxpY0tleVVuY29tcHJlc3NlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuICEhUG9pbnQuZnJvbUJ5dGVzKHB1YmxpY0tleSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvZHVjZXMgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHNlY3JldCBrZXkgZnJvbSByYW5kb20gb2Ygc2l6ZVxuICAgKiAoZ3JvdXBMZW4gKyBjZWlsKGdyb3VwTGVuIC8gMikpIHdpdGggbW9kdWxvIGJpYXMgYmVpbmcgbmVnbGlnaWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJhbmRvbVNlY3JldEtleShzZWVkID0gcmFuZG9tQnl0ZXNfKGxlbmd0aHMuc2VlZCkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gbWFwSGFzaFRvRmllbGQoYWJ5dGVzKHNlZWQsIGxlbmd0aHMuc2VlZCwgJ3NlZWQnKSwgRm4uT1JERVIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHB1YmxpYyBrZXkgZm9yIGEgc2VjcmV0IGtleS4gQ2hlY2tzIGZvciB2YWxpZGl0eSBvZiB0aGUgc2VjcmV0IGtleS5cbiAgICogQHBhcmFtIGlzQ29tcHJlc3NlZCB3aGV0aGVyIHRvIHJldHVybiBjb21wYWN0IChkZWZhdWx0KSwgb3IgZnVsbCBrZXlcbiAgICogQHJldHVybnMgUHVibGljIGtleSwgZnVsbCB3aGVuIGlzQ29tcHJlc3NlZD1mYWxzZTsgc2hvcnQgd2hlbiBpc0NvbXByZXNzZWQ9dHJ1ZVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHVibGljS2V5KHNlY3JldEtleTogVWludDhBcnJheSwgaXNDb21wcmVzc2VkID0gdHJ1ZSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBQb2ludC5CQVNFLm11bHRpcGx5KEZuLmZyb21CeXRlcyhzZWNyZXRLZXkpKS50b0J5dGVzKGlzQ29tcHJlc3NlZCk7XG4gIH1cblxuICAvKipcbiAgICogUXVpY2sgYW5kIGRpcnR5IGNoZWNrIGZvciBpdGVtIGJlaW5nIHB1YmxpYyBrZXkuIERvZXMgbm90IHZhbGlkYXRlIGhleCwgb3IgYmVpbmcgb24tY3VydmUuXG4gICAqL1xuICBmdW5jdGlvbiBpc1Byb2JQdWIoaXRlbTogVWludDhBcnJheSk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgc2VjcmV0S2V5LCBwdWJsaWNLZXksIHB1YmxpY0tleVVuY29tcHJlc3NlZCB9ID0gbGVuZ3RocztcbiAgICBpZiAoIWlzQnl0ZXMoaXRlbSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCgnX2xlbmd0aHMnIGluIEZuICYmIEZuLl9sZW5ndGhzKSB8fCBzZWNyZXRLZXkgPT09IHB1YmxpY0tleSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBsID0gYWJ5dGVzKGl0ZW0sIHVuZGVmaW5lZCwgJ2tleScpLmxlbmd0aDtcbiAgICByZXR1cm4gbCA9PT0gcHVibGljS2V5IHx8IGwgPT09IHB1YmxpY0tleVVuY29tcHJlc3NlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFQ0RIIChFbGxpcHRpYyBDdXJ2ZSBEaWZmaWUgSGVsbG1hbikuXG4gICAqIENvbXB1dGVzIHNoYXJlZCBwdWJsaWMga2V5IGZyb20gc2VjcmV0IGtleSBBIGFuZCBwdWJsaWMga2V5IEIuXG4gICAqIENoZWNrczogMSkgc2VjcmV0IGtleSB2YWxpZGl0eSAyKSBzaGFyZWQga2V5IGlzIG9uLWN1cnZlLlxuICAgKiBEb2VzIE5PVCBoYXNoIHRoZSByZXN1bHQuXG4gICAqIEBwYXJhbSBpc0NvbXByZXNzZWQgd2hldGhlciB0byByZXR1cm4gY29tcGFjdCAoZGVmYXVsdCksIG9yIGZ1bGwga2V5XG4gICAqIEByZXR1cm5zIHNoYXJlZCBwdWJsaWMga2V5XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTaGFyZWRTZWNyZXQoXG4gICAgc2VjcmV0S2V5QTogVWludDhBcnJheSxcbiAgICBwdWJsaWNLZXlCOiBVaW50OEFycmF5LFxuICAgIGlzQ29tcHJlc3NlZCA9IHRydWVcbiAgKTogVWludDhBcnJheSB7XG4gICAgaWYgKGlzUHJvYlB1YihzZWNyZXRLZXlBKSA9PT0gdHJ1ZSkgdGhyb3cgbmV3IEVycm9yKCdmaXJzdCBhcmcgbXVzdCBiZSBwcml2YXRlIGtleScpO1xuICAgIGlmIChpc1Byb2JQdWIocHVibGljS2V5QikgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ3NlY29uZCBhcmcgbXVzdCBiZSBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgcyA9IEZuLmZyb21CeXRlcyhzZWNyZXRLZXlBKTtcbiAgICBjb25zdCBiID0gUG9pbnQuZnJvbUJ5dGVzKHB1YmxpY0tleUIpOyAvLyBjaGVja3MgZm9yIGJlaW5nIG9uLWN1cnZlXG4gICAgcmV0dXJuIGIubXVsdGlwbHkocykudG9CeXRlcyhpc0NvbXByZXNzZWQpO1xuICB9XG5cbiAgY29uc3QgdXRpbHMgPSB7XG4gICAgaXNWYWxpZFNlY3JldEtleSxcbiAgICBpc1ZhbGlkUHVibGljS2V5LFxuICAgIHJhbmRvbVNlY3JldEtleSxcbiAgfTtcbiAgY29uc3Qga2V5Z2VuID0gY3JlYXRlS2V5Z2VuKHJhbmRvbVNlY3JldEtleSwgZ2V0UHVibGljS2V5KTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGdldFB1YmxpY0tleSwgZ2V0U2hhcmVkU2VjcmV0LCBrZXlnZW4sIFBvaW50LCB1dGlscywgbGVuZ3RocyB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEVDRFNBIHNpZ25pbmcgaW50ZXJmYWNlIGZvciBnaXZlbiBlbGxpcHRpYyBjdXJ2ZSBgUG9pbnRgIGFuZCBgaGFzaGAgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIFBvaW50IGNyZWF0ZWQgdXNpbmcge0BsaW5rIHdlaWVyc3RyYXNzfSBmdW5jdGlvblxuICogQHBhcmFtIGhhc2ggdXNlZCBmb3IgMSkgbWVzc2FnZSBwcmVoYXNoLWluZyAyKSBrIGdlbmVyYXRpb24gaW4gYHNpZ25gLCB1c2luZyBobWFjX2RyYmcoaGFzaClcbiAqIEBwYXJhbSBlY2RzYU9wdHMgcmFyZWx5IG5lZWRlZCwgc2VlIHtAbGluayBFQ0RTQU9wdHN9XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBjb25zdCBwMjU2X1BvaW50ID0gd2VpZXJzdHJhc3MoLi4uKTtcbiAqIGNvbnN0IHAyNTZfc2hhMjU2ID0gZWNkc2EocDI1Nl9Qb2ludCwgc2hhMjU2KTtcbiAqIGNvbnN0IHAyNTZfc2hhMjI0ID0gZWNkc2EocDI1Nl9Qb2ludCwgc2hhMjI0KTtcbiAqIGNvbnN0IHAyNTZfc2hhMjI0X3IgPSBlY2RzYShwMjU2X1BvaW50LCBzaGEyMjQsIHsgcmFuZG9tQnl0ZXM6IChsZW5ndGgpID0+IHsgLi4uIH0gfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVjZHNhKFxuICBQb2ludDogV2VpZXJzdHJhc3NQb2ludENvbnM8YmlnaW50PixcbiAgaGFzaDogQ0hhc2gsXG4gIGVjZHNhT3B0czogRUNEU0FPcHRzID0ge31cbik6IEVDRFNBIHtcbiAgYWhhc2goaGFzaCk7XG4gIHZhbGlkYXRlT2JqZWN0KFxuICAgIGVjZHNhT3B0cyxcbiAgICB7fSxcbiAgICB7XG4gICAgICBobWFjOiAnZnVuY3Rpb24nLFxuICAgICAgbG93UzogJ2Jvb2xlYW4nLFxuICAgICAgcmFuZG9tQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgICBiaXRzMmludDogJ2Z1bmN0aW9uJyxcbiAgICAgIGJpdHMyaW50X21vZE46ICdmdW5jdGlvbicsXG4gICAgfVxuICApO1xuICBlY2RzYU9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBlY2RzYU9wdHMpO1xuICBjb25zdCByYW5kb21CeXRlcyA9IGVjZHNhT3B0cy5yYW5kb21CeXRlcyB8fCB3Y1JhbmRvbUJ5dGVzO1xuICBjb25zdCBobWFjID0gZWNkc2FPcHRzLmhtYWMgfHwgKChrZXksIG1zZykgPT4gbm9ibGVIbWFjKGhhc2gsIGtleSwgbXNnKSk7XG5cbiAgY29uc3QgeyBGcCwgRm4gfSA9IFBvaW50O1xuICBjb25zdCB7IE9SREVSOiBDVVJWRV9PUkRFUiwgQklUUzogZm5CaXRzIH0gPSBGbjtcbiAgY29uc3QgeyBrZXlnZW4sIGdldFB1YmxpY0tleSwgZ2V0U2hhcmVkU2VjcmV0LCB1dGlscywgbGVuZ3RocyB9ID0gZWNkaChQb2ludCwgZWNkc2FPcHRzKTtcbiAgY29uc3QgZGVmYXVsdFNpZ09wdHM6IFJlcXVpcmVkPEVDRFNBU2lnbk9wdHM+ID0ge1xuICAgIHByZWhhc2g6IHRydWUsXG4gICAgbG93UzogdHlwZW9mIGVjZHNhT3B0cy5sb3dTID09PSAnYm9vbGVhbicgPyBlY2RzYU9wdHMubG93UyA6IHRydWUsXG4gICAgZm9ybWF0OiAnY29tcGFjdCcgYXMgRUNEU0FTaWduYXR1cmVGb3JtYXQsXG4gICAgZXh0cmFFbnRyb3B5OiBmYWxzZSxcbiAgfTtcbiAgY29uc3QgaGFzTGFyZ2VDb2ZhY3RvciA9IENVUlZFX09SREVSICogXzJuIDwgRnAuT1JERVI7IC8vIFdvbid0IENVUlZFKCkuaCA+IDJuIGJlIG1vcmUgZWZmZWN0aXZlP1xuXG4gIGZ1bmN0aW9uIGlzQmlnZ2VyVGhhbkhhbGZPcmRlcihudW1iZXI6IGJpZ2ludCkge1xuICAgIGNvbnN0IEhBTEYgPSBDVVJWRV9PUkRFUiA+PiBfMW47XG4gICAgcmV0dXJuIG51bWJlciA+IEhBTEY7XG4gIH1cbiAgZnVuY3Rpb24gdmFsaWRhdGVSUyh0aXRsZTogc3RyaW5nLCBudW06IGJpZ2ludCk6IGJpZ2ludCB7XG4gICAgaWYgKCFGbi5pc1ZhbGlkTm90MChudW0pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNpZ25hdHVyZSAke3RpdGxlfTogb3V0IG9mIHJhbmdlIDEuLlBvaW50LkZuLk9SREVSYCk7XG4gICAgcmV0dXJuIG51bTtcbiAgfVxuICBmdW5jdGlvbiBhc3NlcnRTbWFsbENvZmFjdG9yKCk6IHZvaWQge1xuICAgIC8vIEVDRFNBIHJlY292ZXJ5IGlzIGhhcmQgZm9yIGNvZmFjdG9yID4gMSBjdXJ2ZXMuXG4gICAgLy8gSW4gc2lnbiwgYHIgPSBxLnggbW9kIG5gLCBhbmQgaGVyZSB3ZSByZWNvdmVyIHEueCBmcm9tIHIuXG4gICAgLy8gV2hpbGUgcmVjb3ZlcmluZyBxLnggPj0gbiwgd2UgbmVlZCB0byBhZGQgcituIGZvciBjb2ZhY3Rvcj0xIGN1cnZlcy5cbiAgICAvLyBIb3dldmVyLCBmb3IgY29mYWN0b3I+MSwgcituIG1heSBub3QgZ2V0IHEueDpcbiAgICAvLyByK24qaSB3b3VsZCBuZWVkIHRvIGJlIGRvbmUgaW5zdGVhZCB3aGVyZSBpIGlzIHVua25vd24uXG4gICAgLy8gVG8gZWFzaWx5IGdldCBpLCB3ZSBlaXRoZXIgbmVlZCB0bzpcbiAgICAvLyBhLiBpbmNyZWFzZSBhbW91bnQgb2YgdmFsaWQgcmVjaWQgdmFsdWVzICg0LCA1Li4uKTsgT1JcbiAgICAvLyBiLiBwcm9oaWJpdCBub24tcHJpbWUtb3JkZXIgc2lnbmF0dXJlcyAocmVjaWQgPiAxKS5cbiAgICBpZiAoaGFzTGFyZ2VDb2ZhY3RvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJyZWNvdmVyZWRcIiBzaWcgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb2ZhY3RvciA+MiBjdXJ2ZXMnKTtcbiAgfVxuICBmdW5jdGlvbiB2YWxpZGF0ZVNpZ0xlbmd0aChieXRlczogVWludDhBcnJheSwgZm9ybWF0OiBFQ0RTQVNpZ25hdHVyZUZvcm1hdCkge1xuICAgIHZhbGlkYXRlU2lnRm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgc2l6ZSA9IGxlbmd0aHMuc2lnbmF0dXJlITtcbiAgICBjb25zdCBzaXplciA9IGZvcm1hdCA9PT0gJ2NvbXBhY3QnID8gc2l6ZSA6IGZvcm1hdCA9PT0gJ3JlY292ZXJlZCcgPyBzaXplICsgMSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYWJ5dGVzKGJ5dGVzLCBzaXplcik7XG4gIH1cblxuICAvKipcbiAgICogRUNEU0Egc2lnbmF0dXJlIHdpdGggaXRzIChyLCBzKSBwcm9wZXJ0aWVzLiBTdXBwb3J0cyBjb21wYWN0LCByZWNvdmVyZWQgJiBERVIgcmVwcmVzZW50YXRpb25zLlxuICAgKi9cbiAgY2xhc3MgU2lnbmF0dXJlIGltcGxlbWVudHMgRUNEU0FTaWduYXR1cmUge1xuICAgIHJlYWRvbmx5IHI6IGJpZ2ludDtcbiAgICByZWFkb25seSBzOiBiaWdpbnQ7XG4gICAgcmVhZG9ubHkgcmVjb3Zlcnk/OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyOiBiaWdpbnQsIHM6IGJpZ2ludCwgcmVjb3Zlcnk/OiBudW1iZXIpIHtcbiAgICAgIHRoaXMuciA9IHZhbGlkYXRlUlMoJ3InLCByKTsgLy8gciBpbiBbMS4uTi0xXTtcbiAgICAgIHRoaXMucyA9IHZhbGlkYXRlUlMoJ3MnLCBzKTsgLy8gcyBpbiBbMS4uTi0xXTtcbiAgICAgIGlmIChyZWNvdmVyeSAhPSBudWxsKSB7XG4gICAgICAgIGFzc2VydFNtYWxsQ29mYWN0b3IoKTtcbiAgICAgICAgaWYgKCFbMCwgMSwgMiwgM10uaW5jbHVkZXMocmVjb3ZlcnkpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnkgaWQnKTtcbiAgICAgICAgdGhpcy5yZWNvdmVyeSA9IHJlY292ZXJ5O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUJ5dGVzKFxuICAgICAgYnl0ZXM6IFVpbnQ4QXJyYXksXG4gICAgICBmb3JtYXQ6IEVDRFNBU2lnbmF0dXJlRm9ybWF0ID0gZGVmYXVsdFNpZ09wdHMuZm9ybWF0XG4gICAgKTogU2lnbmF0dXJlIHtcbiAgICAgIHZhbGlkYXRlU2lnTGVuZ3RoKGJ5dGVzLCBmb3JtYXQpO1xuICAgICAgbGV0IHJlY2lkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZm9ybWF0ID09PSAnZGVyJykge1xuICAgICAgICBjb25zdCB7IHIsIHMgfSA9IERFUi50b1NpZyhhYnl0ZXMoYnl0ZXMpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUociwgcyk7XG4gICAgICB9XG4gICAgICBpZiAoZm9ybWF0ID09PSAncmVjb3ZlcmVkJykge1xuICAgICAgICByZWNpZCA9IGJ5dGVzWzBdO1xuICAgICAgICBmb3JtYXQgPSAnY29tcGFjdCc7XG4gICAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBMID0gbGVuZ3Rocy5zaWduYXR1cmUhIC8gMjtcbiAgICAgIGNvbnN0IHIgPSBieXRlcy5zdWJhcnJheSgwLCBMKTtcbiAgICAgIGNvbnN0IHMgPSBieXRlcy5zdWJhcnJheShMLCBMICogMik7XG4gICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZShGbi5mcm9tQnl0ZXMociksIEZuLmZyb21CeXRlcyhzKSwgcmVjaWQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSGV4KGhleDogc3RyaW5nLCBmb3JtYXQ/OiBFQ0RTQVNpZ25hdHVyZUZvcm1hdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbUJ5dGVzKGhleFRvQnl0ZXMoaGV4KSwgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzc2VydFJlY292ZXJ5KCk6IG51bWJlciB7XG4gICAgICBjb25zdCB7IHJlY292ZXJ5IH0gPSB0aGlzO1xuICAgICAgaWYgKHJlY292ZXJ5ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeSBpZDogbXVzdCBiZSBwcmVzZW50Jyk7XG4gICAgICByZXR1cm4gcmVjb3Zlcnk7XG4gICAgfVxuXG4gICAgYWRkUmVjb3ZlcnlCaXQocmVjb3Zlcnk6IG51bWJlcik6IFJlY292ZXJlZFNpZ25hdHVyZSB7XG4gICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLnIsIHRoaXMucywgcmVjb3ZlcnkpIGFzIFJlY292ZXJlZFNpZ25hdHVyZTtcbiAgICB9XG5cbiAgICByZWNvdmVyUHVibGljS2V5KG1lc3NhZ2VIYXNoOiBVaW50OEFycmF5KTogV2VpZXJzdHJhc3NQb2ludDxiaWdpbnQ+IHtcbiAgICAgIGNvbnN0IHsgciwgcyB9ID0gdGhpcztcbiAgICAgIGNvbnN0IHJlY292ZXJ5ID0gdGhpcy5hc3NlcnRSZWNvdmVyeSgpO1xuICAgICAgY29uc3QgcmFkaiA9IHJlY292ZXJ5ID09PSAyIHx8IHJlY292ZXJ5ID09PSAzID8gciArIENVUlZFX09SREVSIDogcjtcbiAgICAgIGlmICghRnAuaXNWYWxpZChyYWRqKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5IGlkOiBzaWcucitjdXJ2ZS5uICE9IFIueCcpO1xuICAgICAgY29uc3QgeCA9IEZwLnRvQnl0ZXMocmFkaik7XG4gICAgICBjb25zdCBSID0gUG9pbnQuZnJvbUJ5dGVzKGNvbmNhdEJ5dGVzKHBwcmVmaXgoKHJlY292ZXJ5ICYgMSkgPT09IDApLCB4KSk7XG4gICAgICBjb25zdCBpciA9IEZuLmludihyYWRqKTsgLy8gcl4tMVxuICAgICAgY29uc3QgaCA9IGJpdHMyaW50X21vZE4oYWJ5dGVzKG1lc3NhZ2VIYXNoLCB1bmRlZmluZWQsICdtc2dIYXNoJykpOyAvLyBUcnVuY2F0ZSBoYXNoXG4gICAgICBjb25zdCB1MSA9IEZuLmNyZWF0ZSgtaCAqIGlyKTsgLy8gLWhyXi0xXG4gICAgICBjb25zdCB1MiA9IEZuLmNyZWF0ZShzICogaXIpOyAvLyBzcl4tMVxuICAgICAgLy8gKHNyXi0xKVItKGhyXi0xKUcgPSAtKGhyXi0xKUcgKyAoc3JeLTEpLiB1bnNhZmUgaXMgZmluZTogdGhlcmUgaXMgbm8gcHJpdmF0ZSBkYXRhLlxuICAgICAgY29uc3QgUSA9IFBvaW50LkJBU0UubXVsdGlwbHlVbnNhZmUodTEpLmFkZChSLm11bHRpcGx5VW5zYWZlKHUyKSk7XG4gICAgICBpZiAoUS5pczAoKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5OiBwb2ludCBhdCBpbmZpbmlmeScpO1xuICAgICAgUS5hc3NlcnRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuIFE7XG4gICAgfVxuXG4gICAgLy8gU2lnbmF0dXJlcyBzaG91bGQgYmUgbG93LXMsIHRvIHByZXZlbnQgbWFsbGVhYmlsaXR5LlxuICAgIGhhc0hpZ2hTKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGlzQmlnZ2VyVGhhbkhhbGZPcmRlcih0aGlzLnMpO1xuICAgIH1cblxuICAgIHRvQnl0ZXMoZm9ybWF0OiBFQ0RTQVNpZ25hdHVyZUZvcm1hdCA9IGRlZmF1bHRTaWdPcHRzLmZvcm1hdCkge1xuICAgICAgdmFsaWRhdGVTaWdGb3JtYXQoZm9ybWF0KTtcbiAgICAgIGlmIChmb3JtYXQgPT09ICdkZXInKSByZXR1cm4gaGV4VG9CeXRlcyhERVIuaGV4RnJvbVNpZyh0aGlzKSk7XG4gICAgICBjb25zdCB7IHIsIHMgfSA9IHRoaXM7XG4gICAgICBjb25zdCByYiA9IEZuLnRvQnl0ZXMocik7XG4gICAgICBjb25zdCBzYiA9IEZuLnRvQnl0ZXMocyk7XG4gICAgICBpZiAoZm9ybWF0ID09PSAncmVjb3ZlcmVkJykge1xuICAgICAgICBhc3NlcnRTbWFsbENvZmFjdG9yKCk7XG4gICAgICAgIHJldHVybiBjb25jYXRCeXRlcyhVaW50OEFycmF5Lm9mKHRoaXMuYXNzZXJ0UmVjb3ZlcnkoKSksIHJiLCBzYik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uY2F0Qnl0ZXMocmIsIHNiKTtcbiAgICB9XG5cbiAgICB0b0hleChmb3JtYXQ/OiBFQ0RTQVNpZ25hdHVyZUZvcm1hdCkge1xuICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgodGhpcy50b0J5dGVzKGZvcm1hdCkpO1xuICAgIH1cbiAgfVxuICB0eXBlIFJlY292ZXJlZFNpZ25hdHVyZSA9IFNpZ25hdHVyZSAmIHsgcmVjb3Zlcnk6IG51bWJlciB9O1xuXG4gIC8vIFJGQzY5Nzk6IGVuc3VyZSBFQ0RTQSBtc2cgaXMgWCBieXRlcyBhbmQgPCBOLiBSRkMgc3VnZ2VzdHMgb3B0aW9uYWwgdHJ1bmNhdGluZyB2aWEgYml0czJvY3RldHMuXG4gIC8vIEZJUFMgMTg2LTQgNC42IHN1Z2dlc3RzIHRoZSBsZWZ0bW9zdCBtaW4obkJpdExlbiwgb3V0TGVuKSBiaXRzLCB3aGljaCBtYXRjaGVzIGJpdHMyaW50LlxuICAvLyBiaXRzMmludCBjYW4gcHJvZHVjZSByZXM+Tiwgd2UgY2FuIGRvIG1vZChyZXMsIE4pIHNpbmNlIHRoZSBiaXRMZW4gaXMgdGhlIHNhbWUuXG4gIC8vIGludDJvY3RldHMgY2FuJ3QgYmUgdXNlZDsgcGFkcyBzbWFsbCBtc2dzIHdpdGggMDogdW5hY2NlcHRhdGJsZSBmb3IgdHJ1bmMgYXMgcGVyIFJGQyB2ZWN0b3JzXG4gIGNvbnN0IGJpdHMyaW50ID1cbiAgICBlY2RzYU9wdHMuYml0czJpbnQgfHxcbiAgICBmdW5jdGlvbiBiaXRzMmludF9kZWYoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICAgICAgLy8gT3VyIGN1c3RvbSBjaGVjayBcImp1c3QgaW4gY2FzZVwiLCBmb3IgcHJvdGVjdGlvbiBhZ2FpbnN0IERvU1xuICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA+IDgxOTIpIHRocm93IG5ldyBFcnJvcignaW5wdXQgaXMgdG9vIGxhcmdlJyk7XG4gICAgICAvLyBGb3IgY3VydmVzIHdpdGggbkJpdExlbmd0aCAlIDggIT09IDA6IGJpdHMyb2N0ZXRzKGJpdHMyb2N0ZXRzKG0pKSAhPT0gYml0czJvY3RldHMobSlcbiAgICAgIC8vIGZvciBzb21lIGNhc2VzLCBzaW5jZSBieXRlcy5sZW5ndGggKiA4IGlzIG5vdCBhY3R1YWwgYml0TGVuZ3RoLlxuICAgICAgY29uc3QgbnVtID0gYnl0ZXNUb051bWJlckJFKGJ5dGVzKTsgLy8gY2hlY2sgZm9yID09IHU4IGRvbmUgaGVyZVxuICAgICAgY29uc3QgZGVsdGEgPSBieXRlcy5sZW5ndGggKiA4IC0gZm5CaXRzOyAvLyB0cnVuY2F0ZSB0byBuQml0TGVuZ3RoIGxlZnRtb3N0IGJpdHNcbiAgICAgIHJldHVybiBkZWx0YSA+IDAgPyBudW0gPj4gQmlnSW50KGRlbHRhKSA6IG51bTtcbiAgICB9O1xuICBjb25zdCBiaXRzMmludF9tb2ROID1cbiAgICBlY2RzYU9wdHMuYml0czJpbnRfbW9kTiB8fFxuICAgIGZ1bmN0aW9uIGJpdHMyaW50X21vZE5fZGVmKGJ5dGVzOiBVaW50OEFycmF5KTogYmlnaW50IHtcbiAgICAgIHJldHVybiBGbi5jcmVhdGUoYml0czJpbnQoYnl0ZXMpKTsgLy8gY2FuJ3QgdXNlIGJ5dGVzVG9OdW1iZXJCRSBoZXJlXG4gICAgfTtcbiAgLy8gUGFkcyBvdXRwdXQgd2l0aCB6ZXJvIGFzIHBlciBzcGVjXG4gIGNvbnN0IE9SREVSX01BU0sgPSBiaXRNYXNrKGZuQml0cyk7XG4gIC8qKiBDb252ZXJ0cyB0byBieXRlcy4gQ2hlY2tzIGlmIG51bSBpbiBgWzAuLk9SREVSX01BU0stMV1gIGUuZy46IGBbMC4uMl4yNTYtMV1gLiAqL1xuICBmdW5jdGlvbiBpbnQyb2N0ZXRzKG51bTogYmlnaW50KTogVWludDhBcnJheSB7XG4gICAgLy8gSU1QT1JUQU5UOiB0aGUgY2hlY2sgZW5zdXJlcyB3b3JraW5nIGZvciBjYXNlIGBGbi5CWVRFUyAhPSBGbi5CSVRTICogOGBcbiAgICBhSW5SYW5nZSgnbnVtIDwgMl4nICsgZm5CaXRzLCBudW0sIF8wbiwgT1JERVJfTUFTSyk7XG4gICAgcmV0dXJuIEZuLnRvQnl0ZXMobnVtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlTXNnQW5kSGFzaChtZXNzYWdlOiBVaW50OEFycmF5LCBwcmVoYXNoOiBib29sZWFuKSB7XG4gICAgYWJ5dGVzKG1lc3NhZ2UsIHVuZGVmaW5lZCwgJ21lc3NhZ2UnKTtcbiAgICByZXR1cm4gcHJlaGFzaCA/IGFieXRlcyhoYXNoKG1lc3NhZ2UpLCB1bmRlZmluZWQsICdwcmVoYXNoZWQgbWVzc2FnZScpIDogbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGVwcyBBLCBEIG9mIFJGQzY5NzkgMy4yLlxuICAgKiBDcmVhdGVzIFJGQzY5Nzkgc2VlZDsgY29udmVydHMgbXNnL3ByaXZLZXkgdG8gbnVtYmVycy5cbiAgICogVXNlZCBvbmx5IGluIHNpZ24sIG5vdCBpbiB2ZXJpZnkuXG4gICAqXG4gICAqIFdhcm5pbmc6IHdlIGNhbm5vdCBhc3N1bWUgaGVyZSB0aGF0IG1lc3NhZ2UgaGFzIHNhbWUgYW1vdW50IG9mIGJ5dGVzIGFzIGN1cnZlIG9yZGVyLFxuICAgKiB0aGlzIHdpbGwgYmUgaW52YWxpZCBhdCBsZWFzdCBmb3IgUDUyMS4gQWxzbyBpdCBjYW4gYmUgYmlnZ2VyIGZvciBQMjI0ICsgU0hBMjU2LlxuICAgKi9cbiAgZnVuY3Rpb24gcHJlcFNpZyhtZXNzYWdlOiBVaW50OEFycmF5LCBzZWNyZXRLZXk6IFVpbnQ4QXJyYXksIG9wdHM6IEVDRFNBU2lnbk9wdHMpIHtcbiAgICBjb25zdCB7IGxvd1MsIHByZWhhc2gsIGV4dHJhRW50cm9weSB9ID0gdmFsaWRhdGVTaWdPcHRzKG9wdHMsIGRlZmF1bHRTaWdPcHRzKTtcbiAgICBtZXNzYWdlID0gdmFsaWRhdGVNc2dBbmRIYXNoKG1lc3NhZ2UsIHByZWhhc2gpOyAvLyBSRkM2OTc5IDMuMiBBOiBoMSA9IEgobSlcbiAgICAvLyBXZSBjYW4ndCBsYXRlciBjYWxsIGJpdHMyb2N0ZXRzLCBzaW5jZSBuZXN0ZWQgYml0czJpbnQgaXMgYnJva2VuIGZvciBjdXJ2ZXNcbiAgICAvLyB3aXRoIGZuQml0cyAlIDggIT09IDAuIEJlY2F1c2Ugb2YgdGhhdCwgd2UgdW53cmFwIGl0IGhlcmUgYXMgaW50Mm9jdGV0cyBjYWxsLlxuICAgIC8vIGNvbnN0IGJpdHMyb2N0ZXRzID0gKGJpdHMpID0+IGludDJvY3RldHMoYml0czJpbnRfbW9kTihiaXRzKSlcbiAgICBjb25zdCBoMWludCA9IGJpdHMyaW50X21vZE4obWVzc2FnZSk7XG4gICAgY29uc3QgZCA9IEZuLmZyb21CeXRlcyhzZWNyZXRLZXkpOyAvLyB2YWxpZGF0ZSBzZWNyZXQga2V5LCBjb252ZXJ0IHRvIGJpZ2ludFxuICAgIGlmICghRm4uaXNWYWxpZE5vdDAoZCkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcml2YXRlIGtleScpO1xuICAgIGNvbnN0IHNlZWRBcmdzID0gW2ludDJvY3RldHMoZCksIGludDJvY3RldHMoaDFpbnQpXTtcbiAgICAvLyBleHRyYUVudHJvcHkuIFJGQzY5NzkgMy42OiBhZGRpdGlvbmFsIGsnIChvcHRpb25hbCkuXG4gICAgaWYgKGV4dHJhRW50cm9weSAhPSBudWxsICYmIGV4dHJhRW50cm9weSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIEsgPSBITUFDX0soViB8fCAweDAwIHx8IGludDJvY3RldHMoeCkgfHwgYml0czJvY3RldHMoaDEpIHx8IGsnKVxuICAgICAgLy8gZ2VuIHJhbmRvbSBieXRlcyBPUiBwYXNzIGFzLWlzXG4gICAgICBjb25zdCBlID0gZXh0cmFFbnRyb3B5ID09PSB0cnVlID8gcmFuZG9tQnl0ZXMobGVuZ3Rocy5zZWNyZXRLZXkpIDogZXh0cmFFbnRyb3B5O1xuICAgICAgc2VlZEFyZ3MucHVzaChhYnl0ZXMoZSwgdW5kZWZpbmVkLCAnZXh0cmFFbnRyb3B5JykpOyAvLyBjaGVjayBmb3IgYmVpbmcgYnl0ZXNcbiAgICB9XG4gICAgY29uc3Qgc2VlZCA9IGNvbmNhdEJ5dGVzKC4uLnNlZWRBcmdzKTsgLy8gU3RlcCBEIG9mIFJGQzY5NzkgMy4yXG4gICAgY29uc3QgbSA9IGgxaW50OyAvLyBubyBuZWVkIHRvIGNhbGwgYml0czJpbnQgc2Vjb25kIHRpbWUgaGVyZSwgaXQgaXMgaW5zaWRlIHRydW5jYXRlSGFzaCFcbiAgICAvLyBDb252ZXJ0cyBzaWduYXR1cmUgcGFyYW1zIGludG8gcG9pbnQgdyByL3MsIGNoZWNrcyByZXN1bHQgZm9yIHZhbGlkaXR5LlxuICAgIC8vIFRvIHRyYW5zZm9ybSBrID0+IFNpZ25hdHVyZTpcbiAgICAvLyBxID0ga1x1MjJDNUdcbiAgICAvLyByID0gcS54IG1vZCBuXG4gICAgLy8gcyA9IGteLTEobSArIHJkKSBtb2QgblxuICAgIC8vIENhbiB1c2Ugc2NhbGFyIGJsaW5kaW5nIGJeLTEoYm0gKyBiZHIpIHdoZXJlIGIgXHUyMjA4IFsxLHFcdTIyMTIxXSBhY2NvcmRpbmcgdG9cbiAgICAvLyBodHRwczovL3RjaGVzLmlhY3Iub3JnL2luZGV4LnBocC9UQ0hFUy9hcnRpY2xlL3ZpZXcvNzMzNy82NTA5LiBXZSd2ZSBkZWNpZGVkIGFnYWluc3QgaXQ6XG4gICAgLy8gYSkgZGVwZW5kZW5jeSBvbiBDU1BSTkcgYikgMTUlIHNsb3dkb3duIGMpIGRvZXNuJ3QgcmVhbGx5IGhlbHAgc2luY2UgYmlnaW50cyBhcmUgbm90IENUXG4gICAgZnVuY3Rpb24gazJzaWcoa0J5dGVzOiBVaW50OEFycmF5KTogU2lnbmF0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICAgIC8vIFJGQyA2OTc5IFNlY3Rpb24gMy4yLCBzdGVwIDM6IGsgPSBiaXRzMmludChUKVxuICAgICAgLy8gSW1wb3J0YW50OiBhbGwgbW9kKCkgY2FsbHMgaGVyZSBtdXN0IGJlIGRvbmUgb3ZlciBOXG4gICAgICBjb25zdCBrID0gYml0czJpbnQoa0J5dGVzKTsgLy8gQ2Fubm90IHVzZSBmaWVsZHMgbWV0aG9kcywgc2luY2UgaXQgaXMgZ3JvdXAgZWxlbWVudFxuICAgICAgaWYgKCFGbi5pc1ZhbGlkTm90MChrKSkgcmV0dXJuOyAvLyBWYWxpZCBzY2FsYXJzIChpbmNsdWRpbmcgaykgbXVzdCBiZSBpbiAxLi5OLTFcbiAgICAgIGNvbnN0IGlrID0gRm4uaW52KGspOyAvLyBrXi0xIG1vZCBuXG4gICAgICBjb25zdCBxID0gUG9pbnQuQkFTRS5tdWx0aXBseShrKS50b0FmZmluZSgpOyAvLyBxID0ga1x1MjJDNUdcbiAgICAgIGNvbnN0IHIgPSBGbi5jcmVhdGUocS54KTsgLy8gciA9IHEueCBtb2QgblxuICAgICAgaWYgKHIgPT09IF8wbikgcmV0dXJuO1xuICAgICAgY29uc3QgcyA9IEZuLmNyZWF0ZShpayAqIEZuLmNyZWF0ZShtICsgciAqIGQpKTsgLy8gcyA9IGteLTEobSArIHJkKSBtb2QgblxuICAgICAgaWYgKHMgPT09IF8wbikgcmV0dXJuO1xuICAgICAgbGV0IHJlY292ZXJ5ID0gKHEueCA9PT0gciA/IDAgOiAyKSB8IE51bWJlcihxLnkgJiBfMW4pOyAvLyByZWNvdmVyeSBiaXQgKDIgb3IgMyB3aGVuIHEueD5uKVxuICAgICAgbGV0IG5vcm1TID0gcztcbiAgICAgIGlmIChsb3dTICYmIGlzQmlnZ2VyVGhhbkhhbGZPcmRlcihzKSkge1xuICAgICAgICBub3JtUyA9IEZuLm5lZyhzKTsgLy8gaWYgbG93UyB3YXMgcGFzc2VkLCBlbnN1cmUgcyBpcyBhbHdheXMgaW4gdGhlIGJvdHRvbSBoYWxmIG9mIE5cbiAgICAgICAgcmVjb3ZlcnkgXj0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHIsIG5vcm1TLCBoYXNMYXJnZUNvZmFjdG9yID8gdW5kZWZpbmVkIDogcmVjb3ZlcnkpO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWVkLCBrMnNpZyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIG1lc3NhZ2UgaGFzaCB3aXRoIGEgc2VjcmV0IGtleS5cbiAgICpcbiAgICogYGBgXG4gICAqIHNpZ24obSwgZCkgd2hlcmVcbiAgICogICBrID0gcmZjNjk3OV9obWFjX2RyYmcobSwgZClcbiAgICogICAoeCwgeSkgPSBHIFx1MDBENyBrXG4gICAqICAgciA9IHggbW9kIG5cbiAgICogICBzID0gKG0gKyBkcikgLyBrIG1vZCBuXG4gICAqIGBgYFxuICAgKi9cbiAgZnVuY3Rpb24gc2lnbihtZXNzYWdlOiBVaW50OEFycmF5LCBzZWNyZXRLZXk6IFVpbnQ4QXJyYXksIG9wdHM6IEVDRFNBU2lnbk9wdHMgPSB7fSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHsgc2VlZCwgazJzaWcgfSA9IHByZXBTaWcobWVzc2FnZSwgc2VjcmV0S2V5LCBvcHRzKTsgLy8gU3RlcHMgQSwgRCBvZiBSRkM2OTc5IDMuMi5cbiAgICBjb25zdCBkcmJnID0gY3JlYXRlSG1hY0RyYmc8U2lnbmF0dXJlPihoYXNoLm91dHB1dExlbiwgRm4uQllURVMsIGhtYWMpO1xuICAgIGNvbnN0IHNpZyA9IGRyYmcoc2VlZCwgazJzaWcpOyAvLyBTdGVwcyBCLCBDLCBELCBFLCBGLCBHXG4gICAgcmV0dXJuIHNpZy50b0J5dGVzKG9wdHMuZm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIHNpZ25hdHVyZSBhZ2FpbnN0IG1lc3NhZ2UgYW5kIHB1YmxpYyBrZXkuXG4gICAqIFJlamVjdHMgbG93UyBzaWduYXR1cmVzIGJ5IGRlZmF1bHQ6IHNlZSB7QGxpbmsgRUNEU0FWZXJpZnlPcHRzfS5cbiAgICogSW1wbGVtZW50cyBzZWN0aW9uIDQuMS40IGZyb20gaHR0cHM6Ly93d3cuc2VjZy5vcmcvc2VjMS12Mi5wZGY6XG4gICAqXG4gICAqIGBgYFxuICAgKiB2ZXJpZnkociwgcywgaCwgUCkgd2hlcmVcbiAgICogICB1MSA9IGhzXi0xIG1vZCBuXG4gICAqICAgdTIgPSByc14tMSBtb2QgblxuICAgKiAgIFIgPSB1MVx1MjJDNUcgKyB1Mlx1MjJDNVBcbiAgICogICBtb2QoUi54LCBuKSA9PSByXG4gICAqIGBgYFxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5KFxuICAgIHNpZ25hdHVyZTogVWludDhBcnJheSxcbiAgICBtZXNzYWdlOiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICBvcHRzOiBFQ0RTQVZlcmlmeU9wdHMgPSB7fVxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxvd1MsIHByZWhhc2gsIGZvcm1hdCB9ID0gdmFsaWRhdGVTaWdPcHRzKG9wdHMsIGRlZmF1bHRTaWdPcHRzKTtcbiAgICBwdWJsaWNLZXkgPSBhYnl0ZXMocHVibGljS2V5LCB1bmRlZmluZWQsICdwdWJsaWNLZXknKTtcbiAgICBtZXNzYWdlID0gdmFsaWRhdGVNc2dBbmRIYXNoKG1lc3NhZ2UsIHByZWhhc2gpO1xuICAgIGlmICghaXNCeXRlcyhzaWduYXR1cmUgYXMgYW55KSkge1xuICAgICAgY29uc3QgZW5kID0gc2lnbmF0dXJlIGluc3RhbmNlb2YgU2lnbmF0dXJlID8gJywgdXNlIHNpZy50b0J5dGVzKCknIDogJyc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmeSBleHBlY3RzIFVpbnQ4QXJyYXkgc2lnbmF0dXJlJyArIGVuZCk7XG4gICAgfVxuICAgIHZhbGlkYXRlU2lnTGVuZ3RoKHNpZ25hdHVyZSwgZm9ybWF0KTsgLy8gZXhlY3V0ZSB0aGlzIHR3aWNlIGJlY2F1c2Ugd2Ugd2FudCBsb3VkIGVycm9yXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZyA9IFNpZ25hdHVyZS5mcm9tQnl0ZXMoc2lnbmF0dXJlLCBmb3JtYXQpO1xuICAgICAgY29uc3QgUCA9IFBvaW50LmZyb21CeXRlcyhwdWJsaWNLZXkpO1xuICAgICAgaWYgKGxvd1MgJiYgc2lnLmhhc0hpZ2hTKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHsgciwgcyB9ID0gc2lnO1xuICAgICAgY29uc3QgaCA9IGJpdHMyaW50X21vZE4obWVzc2FnZSk7IC8vIG1vZCBuLCBub3QgbW9kIHBcbiAgICAgIGNvbnN0IGlzID0gRm4uaW52KHMpOyAvLyBzXi0xIG1vZCBuXG4gICAgICBjb25zdCB1MSA9IEZuLmNyZWF0ZShoICogaXMpOyAvLyB1MSA9IGhzXi0xIG1vZCBuXG4gICAgICBjb25zdCB1MiA9IEZuLmNyZWF0ZShyICogaXMpOyAvLyB1MiA9IHJzXi0xIG1vZCBuXG4gICAgICBjb25zdCBSID0gUG9pbnQuQkFTRS5tdWx0aXBseVVuc2FmZSh1MSkuYWRkKFAubXVsdGlwbHlVbnNhZmUodTIpKTsgLy8gdTFcdTIyQzVHICsgdTJcdTIyQzVQXG4gICAgICBpZiAoUi5pczAoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdiA9IEZuLmNyZWF0ZShSLngpOyAvLyB2ID0gci54IG1vZCBuXG4gICAgICByZXR1cm4gdiA9PT0gcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb3ZlclB1YmxpY0tleShcbiAgICBzaWduYXR1cmU6IFVpbnQ4QXJyYXksXG4gICAgbWVzc2FnZTogVWludDhBcnJheSxcbiAgICBvcHRzOiBFQ0RTQVJlY292ZXJPcHRzID0ge31cbiAgKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgeyBwcmVoYXNoIH0gPSB2YWxpZGF0ZVNpZ09wdHMob3B0cywgZGVmYXVsdFNpZ09wdHMpO1xuICAgIG1lc3NhZ2UgPSB2YWxpZGF0ZU1zZ0FuZEhhc2gobWVzc2FnZSwgcHJlaGFzaCk7XG4gICAgcmV0dXJuIFNpZ25hdHVyZS5mcm9tQnl0ZXMoc2lnbmF0dXJlLCAncmVjb3ZlcmVkJykucmVjb3ZlclB1YmxpY0tleShtZXNzYWdlKS50b0J5dGVzKCk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAga2V5Z2VuLFxuICAgIGdldFB1YmxpY0tleSxcbiAgICBnZXRTaGFyZWRTZWNyZXQsXG4gICAgdXRpbHMsXG4gICAgbGVuZ3RocyxcbiAgICBQb2ludCxcbiAgICBzaWduLFxuICAgIHZlcmlmeSxcbiAgICByZWNvdmVyUHVibGljS2V5LFxuICAgIFNpZ25hdHVyZSxcbiAgICBoYXNoLFxuICB9KSBzYXRpc2ZpZXMgU2lnbmVyO1xufVxuIiwgIi8qKlxuICogSE1BQzogUkZDMjEwNCBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUuXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGFieXRlcywgYWV4aXN0cywgYWhhc2gsIGNsZWFuLCB0eXBlIENIYXNoLCB0eXBlIEhhc2ggfSBmcm9tICcuL3V0aWxzLnRzJztcblxuLyoqIEludGVybmFsIGNsYXNzIGZvciBITUFDLiAqL1xuZXhwb3J0IGNsYXNzIF9ITUFDPFQgZXh0ZW5kcyBIYXNoPFQ+PiBpbXBsZW1lbnRzIEhhc2g8X0hNQUM8VD4+IHtcbiAgb0hhc2g6IFQ7XG4gIGlIYXNoOiBUO1xuICBibG9ja0xlbjogbnVtYmVyO1xuICBvdXRwdXRMZW46IG51bWJlcjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGhhc2g6IENIYXNoLCBrZXk6IFVpbnQ4QXJyYXkpIHtcbiAgICBhaGFzaChoYXNoKTtcbiAgICBhYnl0ZXMoa2V5LCB1bmRlZmluZWQsICdrZXknKTtcbiAgICB0aGlzLmlIYXNoID0gaGFzaC5jcmVhdGUoKSBhcyBUO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pSGFzaC51cGRhdGUgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGluc3RhbmNlIG9mIGNsYXNzIHdoaWNoIGV4dGVuZHMgdXRpbHMuSGFzaCcpO1xuICAgIHRoaXMuYmxvY2tMZW4gPSB0aGlzLmlIYXNoLmJsb2NrTGVuO1xuICAgIHRoaXMub3V0cHV0TGVuID0gdGhpcy5pSGFzaC5vdXRwdXRMZW47XG4gICAgY29uc3QgYmxvY2tMZW4gPSB0aGlzLmJsb2NrTGVuO1xuICAgIGNvbnN0IHBhZCA9IG5ldyBVaW50OEFycmF5KGJsb2NrTGVuKTtcbiAgICAvLyBibG9ja0xlbiBjYW4gYmUgYmlnZ2VyIHRoYW4gb3V0cHV0TGVuXG4gICAgcGFkLnNldChrZXkubGVuZ3RoID4gYmxvY2tMZW4gPyBoYXNoLmNyZWF0ZSgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpIDoga2V5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZC5sZW5ndGg7IGkrKykgcGFkW2ldIF49IDB4MzY7XG4gICAgdGhpcy5pSGFzaC51cGRhdGUocGFkKTtcbiAgICAvLyBCeSBkb2luZyB1cGRhdGUgKHByb2Nlc3Npbmcgb2YgZmlyc3QgYmxvY2spIG9mIG91dGVyIGhhc2ggaGVyZSB3ZSBjYW4gcmUtdXNlIGl0IGJldHdlZW4gbXVsdGlwbGUgY2FsbHMgdmlhIGNsb25lXG4gICAgdGhpcy5vSGFzaCA9IGhhc2guY3JlYXRlKCkgYXMgVDtcbiAgICAvLyBVbmRvIGludGVybmFsIFhPUiAmJiBhcHBseSBvdXRlciBYT1JcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZC5sZW5ndGg7IGkrKykgcGFkW2ldIF49IDB4MzYgXiAweDVjO1xuICAgIHRoaXMub0hhc2gudXBkYXRlKHBhZCk7XG4gICAgY2xlYW4ocGFkKTtcbiAgfVxuICB1cGRhdGUoYnVmOiBVaW50OEFycmF5KTogdGhpcyB7XG4gICAgYWV4aXN0cyh0aGlzKTtcbiAgICB0aGlzLmlIYXNoLnVwZGF0ZShidWYpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRpZ2VzdEludG8ob3V0OiBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgYWV4aXN0cyh0aGlzKTtcbiAgICBhYnl0ZXMob3V0LCB0aGlzLm91dHB1dExlbiwgJ291dHB1dCcpO1xuICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgIHRoaXMuaUhhc2guZGlnZXN0SW50byhvdXQpO1xuICAgIHRoaXMub0hhc2gudXBkYXRlKG91dCk7XG4gICAgdGhpcy5vSGFzaC5kaWdlc3RJbnRvKG91dCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cbiAgZGlnZXN0KCk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IG91dCA9IG5ldyBVaW50OEFycmF5KHRoaXMub0hhc2gub3V0cHV0TGVuKTtcbiAgICB0aGlzLmRpZ2VzdEludG8ob3V0KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIF9jbG9uZUludG8odG8/OiBfSE1BQzxUPik6IF9ITUFDPFQ+IHtcbiAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlIHdpdGhvdXQgY2FsbGluZyBjb25zdHJ1Y3RvciBzaW5jZSBrZXkgYWxyZWFkeSBpbiBzdGF0ZSBhbmQgd2UgZG9uJ3Qga25vdyBpdC5cbiAgICB0byB8fD0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIHt9KTtcbiAgICBjb25zdCB7IG9IYXNoLCBpSGFzaCwgZmluaXNoZWQsIGRlc3Ryb3llZCwgYmxvY2tMZW4sIG91dHB1dExlbiB9ID0gdGhpcztcbiAgICB0byA9IHRvIGFzIHRoaXM7XG4gICAgdG8uZmluaXNoZWQgPSBmaW5pc2hlZDtcbiAgICB0by5kZXN0cm95ZWQgPSBkZXN0cm95ZWQ7XG4gICAgdG8uYmxvY2tMZW4gPSBibG9ja0xlbjtcbiAgICB0by5vdXRwdXRMZW4gPSBvdXRwdXRMZW47XG4gICAgdG8ub0hhc2ggPSBvSGFzaC5fY2xvbmVJbnRvKHRvLm9IYXNoKTtcbiAgICB0by5pSGFzaCA9IGlIYXNoLl9jbG9uZUludG8odG8uaUhhc2gpO1xuICAgIHJldHVybiB0bztcbiAgfVxuICBjbG9uZSgpOiBfSE1BQzxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb25lSW50bygpO1xuICB9XG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMub0hhc2guZGVzdHJveSgpO1xuICAgIHRoaXMuaUhhc2guZGVzdHJveSgpO1xuICB9XG59XG5cbi8qKlxuICogSE1BQzogUkZDMjEwNCBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUuXG4gKiBAcGFyYW0gaGFzaCAtIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgdXNlZCBlLmcuIHNoYTI1NlxuICogQHBhcmFtIGtleSAtIG1lc3NhZ2Uga2V5XG4gKiBAcGFyYW0gbWVzc2FnZSAtIG1lc3NhZ2UgZGF0YVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGhtYWMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL2htYWMnO1xuICogaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyJztcbiAqIGNvbnN0IG1hYzEgPSBobWFjKHNoYTI1NiwgJ2tleScsICdtZXNzYWdlJyk7XG4gKi9cbmV4cG9ydCBjb25zdCBobWFjOiB7XG4gIChoYXNoOiBDSGFzaCwga2V5OiBVaW50OEFycmF5LCBtZXNzYWdlOiBVaW50OEFycmF5KTogVWludDhBcnJheTtcbiAgY3JlYXRlKGhhc2g6IENIYXNoLCBrZXk6IFVpbnQ4QXJyYXkpOiBfSE1BQzxhbnk+O1xufSA9IChoYXNoOiBDSGFzaCwga2V5OiBVaW50OEFycmF5LCBtZXNzYWdlOiBVaW50OEFycmF5KTogVWludDhBcnJheSA9PlxuICBuZXcgX0hNQUM8YW55PihoYXNoLCBrZXkpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKTtcbmhtYWMuY3JlYXRlID0gKGhhc2g6IENIYXNoLCBrZXk6IFVpbnQ4QXJyYXkpID0+IG5ldyBfSE1BQzxhbnk+KGhhc2gsIGtleSk7XG4iLCAiLyoqXG4gKiBAbW9kdWxlIGxvZ2dlclxuICogQGRlc2NyaXB0aW9uIExvZ2dlciB1dGlsaXR5IGZvciB0aGUgYXBwbGljYXRpb25cbiAqL1xuXG5lbnVtIExvZ0xldmVsIHtcbiAgREVCVUcsXG4gIElORk8sXG4gIFdBUk4sXG4gIEVSUk9SXG59XG5cbmltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nO1xuXG4vKipcbiAqIENyZWF0ZSBhIGxvZ2dlciBpbnN0YW5jZSB3aXRoIGNvbnNpc3RlbnQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIG5hbWUgLSBDb21wb25lbnQgb3IgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2dnZXJcbiAqIEByZXR1cm5zIENvbmZpZ3VyZWQgcGlubyBsb2dnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihuYW1lOiBzdHJpbmcpOiBwaW5vLkxvZ2dlciB7XG4gIHJldHVybiBwaW5vKHtcbiAgICBuYW1lLFxuICAgIGxldmVsOiBwcm9jZXNzLmVudi5MT0dfTEVWRUwgfHwgJ2luZm8nLFxuICAgIHRyYW5zcG9ydDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgPyB7XG4gICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNvbG9yaXplOiB0cnVlLFxuICAgICAgICB0cmFuc2xhdGVUaW1lOiAnSEg6TU06c3MnLFxuICAgICAgICBpZ25vcmU6ICdwaWQsaG9zdG5hbWUnLFxuICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQsXG4gICAgZm9ybWF0dGVyczoge1xuICAgICAgbGV2ZWw6IChsYWJlbCkgPT4ge1xuICAgICAgICByZXR1cm4geyBsZXZlbDogbGFiZWwudG9VcHBlckNhc2UoKSB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU2ltcGxlIGxvZyBmdW5jdGlvbiBmb3IgYmFzaWMgbG9nZ2luZyBuZWVkc1xuICogQHBhcmFtIG1lc3NhZ2UgLSBNZXNzYWdlIHRvIGxvZ1xuICogQHBhcmFtIGRhdGEgLSBPcHRpb25hbCBkYXRhIHRvIGluY2x1ZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgYXBwbGljYXRpb25cbiAqIEluY2x1ZGVzIGVuaGFuY2VkIGVycm9yIGhhbmRsaW5nIGFuZCBmb3JtYXR0aW5nXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXI6IHBpbm8uTG9nZ2VyID0gcGlubyh7XG4gIG5hbWU6ICdub3N0ci1jcnlwdG8tdXRpbHMnLFxuICBsZXZlbDogcHJvY2Vzcy5lbnYuTE9HX0xFVkVMIHx8ICdpbmZvJyxcbiAgdHJhbnNwb3J0OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyA/IHtcbiAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgb3B0aW9uczoge1xuICAgICAgY29sb3JpemU6IHRydWUsXG4gICAgICB0cmFuc2xhdGVUaW1lOiAnSEg6TU06c3MnLFxuICAgICAgaWdub3JlOiAncGlkLGhvc3RuYW1lJyxcbiAgICB9XG4gIH0gOiB1bmRlZmluZWQsXG4gIGZvcm1hdHRlcnM6IHtcbiAgICBsZXZlbDogKGxhYmVsKSA9PiB7XG4gICAgICByZXR1cm4geyBsZXZlbDogbGFiZWwudG9VcHBlckNhc2UoKSB9O1xuICAgIH0sXG4gICAgbG9nOiAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgLy8gQ29udmVydCBlcnJvciBvYmplY3RzIHRvIHN0cmluZ3MgZm9yIGJldHRlciBsb2dnaW5nXG4gICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICdlcnInIGluIG9iaikge1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLm9iaiB9O1xuICAgICAgICBpZiAobmV3T2JqLmVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3T2JqLmVyciBhcyBFcnJvcjtcbiAgICAgICAgICBuZXdPYmouZXJyID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgbmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tTG9nZ2VyIHtcbiAgcHJpdmF0ZSBfbGV2ZWw6IExvZ0xldmVsO1xuXG4gIGNvbnN0cnVjdG9yKGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLklORk8pIHtcbiAgICB0aGlzLl9sZXZlbCA9IGxldmVsO1xuICB9XG5cbiAgc2V0TGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG4gICAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIHByaXZhdGUgX2xvZyhsZXZlbDogTG9nTGV2ZWwsIG1lc3NhZ2U6IHN0cmluZywgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKGxldmVsID49IHRoaXMuX2xldmVsKSB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBsZXZlbE5hbWUgPSBMb2dMZXZlbFtsZXZlbF07XG4gICAgICBjb25zdCBjb250ZXh0U3RyID0gY29udGV4dCA/IGAgJHtKU09OLnN0cmluZ2lmeShjb250ZXh0KX1gIDogJyc7XG4gICAgICBjb25zb2xlLmxvZyhgWyR7dGltZXN0YW1wfV0gJHtsZXZlbE5hbWV9OiAke21lc3NhZ2V9JHtjb250ZXh0U3RyfWApO1xuICAgIH1cbiAgfVxuXG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLkRFQlVHLCBtZXNzYWdlLCBjb250ZXh0KTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLl9sb2coTG9nTGV2ZWwuSU5GTywgbWVzc2FnZSwgY29udGV4dCk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLldBUk4sIG1lc3NhZ2UsIGNvbnRleHQpO1xuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nIHwgRXJyb3IgfCB1bmtub3duLCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLm1lc3NhZ2UgOiBTdHJpbmcobWVzc2FnZSk7XG4gICAgdGhpcy5fbG9nKExvZ0xldmVsLkVSUk9SLCBlcnJvck1lc3NhZ2UsIGNvbnRleHQpO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0aGUgTG9nZ2VyIHR5cGUgZm9yIHVzZSBpbiBvdGhlciBmaWxlc1xuZXhwb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICdwaW5vJztcbiIsICIvKipcbiAqIEJhc2U2NCBlbmNvZGluZyB1dGlsaXRpZXMgZm9yIE5vc3RyXG4gKiBQcm92aWRlcyBjb25zaXN0ZW50IGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZyBhY3Jvc3MgYWxsIE5vc3RyLXJlbGF0ZWQgcHJvamVjdHNcbiAqIFVzZXMgYnJvd3Nlci1jb21wYXRpYmxlIEFQSXMgKG5vIE5vZGUuanMgQnVmZmVyIGRlcGVuZGVuY3kpXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyB0byBiYXNlNjRcbiAqIEBwYXJhbSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIEJhc2U2NCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvQmFzZTY0KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgcmV0dXJuIGJ5dGVzVG9CYXNlNjQoYnl0ZXMpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYmFzZTY0IHRvIHN0cmluZ1xuICogQHBhcmFtIGJhc2U2NCBCYXNlNjQgc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIFVURi04IHN0cmluZ1xuICogQHRocm93cyBFcnJvciBpZiBiYXNlNjQgc3RyaW5nIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvU3RyaW5nKGJhc2U2NDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpc1ZhbGlkQmFzZTY0KGJhc2U2NCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICB9XG4gIGNvbnN0IGJ5dGVzID0gYmFzZTY0VG9CeXRlcyhiYXNlNjQpO1xuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGJ5dGVzKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFVpbnQ4QXJyYXkgdG8gYmFzZTY0XG4gKiBAcGFyYW0gYnVmZmVyIFVpbnQ4QXJyYXkgdG8gY29udmVydFxuICogQHJldHVybnMgQmFzZTY0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5dGVzVG9CYXNlNjQoYnVmZmVyKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGJhc2U2NCB0byBVaW50OEFycmF5XG4gKiBAcGFyYW0gYmFzZTY0IEJhc2U2NCBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybnMgVWludDhBcnJheVxuICogQHRocm93cyBFcnJvciBpZiBiYXNlNjQgc3RyaW5nIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvQnVmZmVyKGJhc2U2NDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGlmICghaXNWYWxpZEJhc2U2NChiYXNlNjQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJhc2U2NCBzdHJpbmcnKTtcbiAgfVxuICByZXR1cm4gYmFzZTY0VG9CeXRlcyhiYXNlNjQpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHN0cmluZyBpcyB2YWxpZCBiYXNlNjRcbiAqIEBwYXJhbSBiYXNlNjQgU3RyaW5nIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbGlkIGJhc2U2NFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJhc2U2NChiYXNlNjQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKGJhc2U2NC5tYXRjaCgvXltBLVphLXowLTkrL10qPXswLDJ9JC8pKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBiYXNlNjQgdG8gVVJMLXNhZmUgYmFzZTY0XG4gKiBAcGFyYW0gYmFzZTY0IFN0YW5kYXJkIGJhc2U2NCBzdHJpbmdcbiAqIEByZXR1cm5zIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmFzZTY0VXJsKGJhc2U2NDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59XG5cbi8qKlxuICogQ29udmVydCBVUkwtc2FmZSBiYXNlNjQgdG8gc3RhbmRhcmQgYmFzZTY0XG4gKiBAcGFyYW0gYmFzZTY0dXJsIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdcbiAqIEByZXR1cm5zIFN0YW5kYXJkIGJhc2U2NCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21CYXNlNjRVcmwoYmFzZTY0dXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlNjQgPSBiYXNlNjR1cmwucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgY29uc3QgcGFkZGluZyA9ICc9Jy5yZXBlYXQoKDQgLSBiYXNlNjQubGVuZ3RoICUgNCkgJSA0KTtcbiAgcmV0dXJuIGJhc2U2NCArIHBhZGRpbmc7XG59XG5cbi8qKlxuICogQ29udmVydCBoZXggc3RyaW5nIHRvIGJhc2U2NFxuICogQHBhcmFtIGhleCBIZXggc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIEJhc2U2NCBzdHJpbmdcbiAqIEB0aHJvd3MgRXJyb3IgaWYgaGV4IHN0cmluZyBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb0Jhc2U2NChoZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaGV4Lm1hdGNoKC9eWzAtOWEtZkEtRl0qJC8pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKTtcbiAgfVxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGhleC5sZW5ndGggLyAyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBieXRlc1tpIC8gMl0gPSBwYXJzZUludChoZXguc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpO1xuICB9XG4gIHJldHVybiBieXRlc1RvQmFzZTY0KGJ5dGVzKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGJhc2U2NCB0byBoZXggc3RyaW5nXG4gKiBAcGFyYW0gYmFzZTY0IEJhc2U2NCBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybnMgSGV4IHN0cmluZ1xuICogQHRocm93cyBFcnJvciBpZiBiYXNlNjQgc3RyaW5nIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvSGV4KGJhc2U2NDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpc1ZhbGlkQmFzZTY0KGJhc2U2NCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICB9XG4gIGNvbnN0IGJ5dGVzID0gYmFzZTY0VG9CeXRlcyhiYXNlNjQpO1xuICByZXR1cm4gQXJyYXkuZnJvbShieXRlcykubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGJhc2U2NCBzdHJpbmcgZnJvbSBieXRlIGFycmF5XG4gKiBAcGFyYW0gYnl0ZXMgQnl0ZSBhcnJheVxuICogQHJldHVybnMgQmFzZTY0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb0Jhc2U2NChieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGxldCBiaW5hcnkgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgfVxuICByZXR1cm4gYnRvYShiaW5hcnkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYmFzZTY0IHRvIGJ5dGUgYXJyYXlcbiAqIEBwYXJhbSBiYXNlNjQgQmFzZTY0IHN0cmluZ1xuICogQHJldHVybnMgQnl0ZSBhcnJheVxuICogQHRocm93cyBFcnJvciBpZiBiYXNlNjQgc3RyaW5nIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMoYmFzZTY0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgaWYgKCFpc1ZhbGlkQmFzZTY0KGJhc2U2NCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICB9XG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgcGFkZGVkIGxlbmd0aCBmb3IgYmFzZTY0IHN0cmluZ1xuICogQHBhcmFtIGRhdGFMZW5ndGggTGVuZ3RoIG9mIHJhdyBkYXRhXG4gKiBAcmV0dXJucyBMZW5ndGggb2YgcGFkZGVkIGJhc2U2NCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUJhc2U2NExlbmd0aChkYXRhTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5jZWlsKGRhdGFMZW5ndGggLyAzKSAqIDQ7XG59XG5cbi8qKlxuICogUmVtb3ZlIGJhc2U2NCBwYWRkaW5nXG4gKiBAcGFyYW0gYmFzZTY0IEJhc2U2NCBzdHJpbmdcbiAqIEByZXR1cm5zIEJhc2U2NCBzdHJpbmcgd2l0aG91dCBwYWRkaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVCYXNlNjRQYWRkaW5nKGJhc2U2NDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC89KyQvLCAnJyk7XG59XG5cbi8qKlxuICogQWRkIGJhc2U2NCBwYWRkaW5nXG4gKiBAcGFyYW0gYmFzZTY0IEJhc2U2NCBzdHJpbmcgd2l0aG91dCBwYWRkaW5nXG4gKiBAcmV0dXJucyBQcm9wZXJseSBwYWRkZWQgYmFzZTY0IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQmFzZTY0UGFkZGluZyhiYXNlNjQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhZGRpbmcgPSAnPScucmVwZWF0KCg0IC0gYmFzZTY0Lmxlbmd0aCAlIDQpICUgNCk7XG4gIHJldHVybiBiYXNlNjQgKyBwYWRkaW5nO1xufVxuIiwgIi8qKlxuICogQG1vZHVsZSB2YWxpZGF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdGlvbiB1dGlsaXRpZXMgZm9yIE5vc3RyIGV2ZW50cywgbWVzc2FnZXMsIGFuZCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcy5cbiAqIFByb3ZpZGVzIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSBldmVudHMsIHNpZ25hdHVyZXMsIGZpbHRlcnMsIGFuZCBzdWJzY3JpcHRpb25zIGFjY29yZGluZyB0byB0aGUgTm9zdHIgcHJvdG9jb2wuXG4gKi9cblxuaW1wb3J0IHsgXG4gIE5vc3RyRXZlbnQsIFxuICBTaWduZWROb3N0ckV2ZW50LCBcbiAgTm9zdHJGaWx0ZXIsIFxuICBOb3N0clN1YnNjcmlwdGlvbiwgXG4gIFZhbGlkYXRpb25SZXN1bHQsIFxuICBQdWJsaWNLZXksXG4gIE5vc3RyTWVzc2FnZVR5cGVcbn0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuXG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTIuanMnO1xuaW1wb3J0IHsgYnl0ZXNUb0hleCB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMuanMnO1xuaW1wb3J0IHsgc2Nobm9yciB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvc2VjcDI1NmsxLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBoZXggc3RyaW5nIGZyb20gYSBQdWJsaWNLZXkgb3Igc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldFB1YmxpY0tleUhleChwdWJrZXk6IFB1YmxpY0tleSB8IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcHVia2V5ID09PSAnc3RyaW5nJyA/IHB1YmtleSA6IHB1YmtleS5oZXg7XG59XG5cbmZ1bmN0aW9uIGhleFRvQnl0ZXMoaGV4OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGhleC5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBOb3N0ciBldmVudCBJRCBieSBjaGVja2luZyBpZiBpdCBtYXRjaGVzIHRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlIGNhbm9uaWNhbCBldmVudCBzZXJpYWxpemF0aW9uLlxuICogXG4gKiBAcGFyYW0ge1NpZ25lZE5vc3RyRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7VmFsaWRhdGlvblJlc3VsdH0gT2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiByZXN1bHQgYW5kIGFueSBlcnJvciBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVFdmVudElkKGV2ZW50KTtcbiAqIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAqICAgY29uc29sZS5lcnJvcihyZXN1bHQuZXJyb3IpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV2ZW50SWQoZXZlbnQ6IFNpZ25lZE5vc3RyRXZlbnQpOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoW1xuICAgICAgMCxcbiAgICAgIGdldFB1YmxpY0tleUhleChldmVudC5wdWJrZXkpLFxuICAgICAgZXZlbnQuY3JlYXRlZF9hdCxcbiAgICAgIGV2ZW50LmtpbmQsXG4gICAgICBldmVudC50YWdzLFxuICAgICAgZXZlbnQuY29udGVudFxuICAgIF0pO1xuICAgIGNvbnN0IGhhc2ggPSBieXRlc1RvSGV4KHNoYTI1NihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplZCkpKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogaGFzaCA9PT0gZXZlbnQuaWQsXG4gICAgICBlcnJvcjogaGFzaCA9PT0gZXZlbnQuaWQgPyB1bmRlZmluZWQgOiAnSW52YWxpZCBldmVudCBJRCdcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gdmFsaWRhdGUgZXZlbnQgSUQnKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcjogJ0ZhaWxlZCB0byB2YWxpZGF0ZSBldmVudCBJRCdcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgTm9zdHIgZXZlbnQgc2lnbmF0dXJlIHVzaW5nIFNjaG5vcnIgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi5cbiAqIFxuICogQHBhcmFtIHtTaWduZWROb3N0ckV2ZW50fSBldmVudCAtIFRoZSBldmVudCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge1ZhbGlkYXRpb25SZXN1bHR9IE9iamVjdCBjb250YWluaW5nIHZhbGlkYXRpb24gcmVzdWx0IGFuZCBhbnkgZXJyb3IgbWVzc2FnZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRXZlbnRTaWduYXR1cmUoZXZlbnQpO1xuICogaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICogICBjb25zb2xlLmVycm9yKHJlc3VsdC5lcnJvcik7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXZlbnRTaWduYXR1cmUoZXZlbnQ6IFNpZ25lZE5vc3RyRXZlbnQpOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhlIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShbXG4gICAgICAwLFxuICAgICAgZ2V0UHVibGljS2V5SGV4KGV2ZW50LnB1YmtleSksXG4gICAgICBldmVudC5jcmVhdGVkX2F0LFxuICAgICAgZXZlbnQua2luZCxcbiAgICAgIGV2ZW50LnRhZ3MsXG4gICAgICBldmVudC5jb250ZW50XG4gICAgXSk7XG4gICAgY29uc3QgaGFzaCA9IHNoYTI1NihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplZCkpO1xuICAgIGNvbnN0IHB1YmtleUhleCA9IGdldFB1YmxpY0tleUhleChldmVudC5wdWJrZXkpO1xuICAgIGNvbnN0IHB1YmtleUJ5dGVzID0gaGV4VG9CeXRlcyhwdWJrZXlIZXgpO1xuICAgIGNvbnN0IGlzVmFsaWQgPSBzY2hub3JyLnZlcmlmeShoZXhUb0J5dGVzKGV2ZW50LnNpZyksIGhhc2gsIHB1YmtleUJ5dGVzKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZCxcbiAgICAgIGVycm9yOiBpc1ZhbGlkID8gdW5kZWZpbmVkIDogJ0ludmFsaWQgc2lnbmF0dXJlJ1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKHsgZXJyb3IgfSwgJ0ZhaWxlZCB0byB2YWxpZGF0ZSBldmVudCBzaWduYXR1cmUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcjogJ0ZhaWxlZCB0byB2YWxpZGF0ZSBldmVudCBzaWduYXR1cmUnXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGNvbXBsZXRlIE5vc3RyIGV2ZW50IGJ5IGNoZWNraW5nIGl0cyBzdHJ1Y3R1cmUsIHRpbWVzdGFtcHMsIElELCBhbmQgc2lnbmF0dXJlLlxuICogXG4gKiBAcGFyYW0ge1NpZ25lZE5vc3RyRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7VmFsaWRhdGlvblJlc3VsdH0gT2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiByZXN1bHQgYW5kIGFueSBlcnJvciBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVFdmVudChldmVudCk7XG4gKiBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LmVycm9yKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVFdmVudChldmVudDogU2lnbmVkTm9zdHJFdmVudCk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAvLyBGaXJzdCB2YWxpZGF0ZSB0aGUgZXZlbnQgc3RydWN0dXJlXG4gIGNvbnN0IGJhc2VWYWxpZGF0aW9uID0gdmFsaWRhdGVFdmVudEJhc2UoZXZlbnQpO1xuICBpZiAoIWJhc2VWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICByZXR1cm4gYmFzZVZhbGlkYXRpb247XG4gIH1cblxuICAvLyBUaGVuIHZhbGlkYXRlIHRoZSBldmVudCBJRFxuICBjb25zdCBpZFZhbGlkYXRpb24gPSB2YWxpZGF0ZUV2ZW50SWQoZXZlbnQpO1xuICBpZiAoIWlkVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIGlkVmFsaWRhdGlvbjtcbiAgfVxuXG4gIC8vIEZpbmFsbHkgdmFsaWRhdGUgdGhlIHNpZ25hdHVyZVxuICByZXR1cm4gdmFsaWRhdGVFdmVudFNpZ25hdHVyZShldmVudCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2lnbmVkIE5vc3RyIGV2ZW50IGJ5IGNoZWNraW5nIGl0cyBzdHJ1Y3R1cmUgYW5kIHNpZ25hdHVyZSBmb3JtYXQuXG4gKiBcbiAqIEBwYXJhbSB7U2lnbmVkTm9zdHJFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtWYWxpZGF0aW9uUmVzdWx0fSBPYmplY3QgY29udGFpbmluZyB2YWxpZGF0aW9uIHJlc3VsdCBhbmQgYW55IGVycm9yIG1lc3NhZ2VcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZVNpZ25lZEV2ZW50KGV2ZW50KTtcbiAqIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAqICAgY29uc29sZS5lcnJvcihyZXN1bHQuZXJyb3IpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNpZ25lZEV2ZW50KGV2ZW50OiBTaWduZWROb3N0ckV2ZW50KTogVmFsaWRhdGlvblJlc3VsdCB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgYmFzaWMgZXZlbnQgc3RydWN0dXJlXG4gICAgY29uc3QgYmFzZVZhbGlkYXRpb24gPSB2YWxpZGF0ZUV2ZW50QmFzZShldmVudCk7XG4gICAgaWYgKCFiYXNlVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gYmFzZVZhbGlkYXRpb247XG4gICAgfVxuXG4gICAgLy8gR2V0IHB1YmtleSBoZXhcbiAgICBjb25zdCBwdWJrZXlIZXggPSBnZXRQdWJsaWNLZXlIZXgoZXZlbnQucHVia2V5KTtcblxuICAgIC8vIFZhbGlkYXRlIHB1YmtleSBmb3JtYXRcbiAgICBpZiAoIXB1YmtleUhleCB8fCB0eXBlb2YgcHVia2V5SGV4ICE9PSAnc3RyaW5nJyB8fCBwdWJrZXlIZXgubGVuZ3RoICE9PSA2NCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCBwdWJsaWMga2V5IGZvcm1hdCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlIGZvcm1hdFxuICAgIGlmICghZXZlbnQuc2lnIHx8IHR5cGVvZiBldmVudC5zaWcgIT09ICdzdHJpbmcnIHx8IGV2ZW50LnNpZy5sZW5ndGggIT09IDEyOCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCBzaWduYXR1cmUgZm9ybWF0J1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBJRCBmb3JtYXRcbiAgICBpZiAoIWV2ZW50LmlkIHx8IHR5cGVvZiBldmVudC5pZCAhPT0gJ3N0cmluZycgfHwgZXZlbnQuaWQubGVuZ3RoICE9PSA2NCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCBldmVudCBJRCBmb3JtYXQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHZhbGlkYXRlIHNpZ25lZCBldmVudCcpO1xuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yOiAnRmFpbGVkIHRvIHZhbGlkYXRlIHNpZ25lZCBldmVudCdcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgTm9zdHIgZXZlbnQgYnkgY2hlY2tpbmcgaXRzIHN0cnVjdHVyZSBhbmQgZmllbGRzLlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIGV2ZW50IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCBhbmQgYW55IGVycm9yIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXZlbnRCYXNlKGV2ZW50OiBOb3N0ckV2ZW50IHwgU2lnbmVkTm9zdHJFdmVudCk6IFZhbGlkYXRpb25SZXN1bHQge1xuICAvLyBDaGVjayByZXF1aXJlZCBmaWVsZHNcbiAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnSW52YWxpZCBldmVudCBzdHJ1Y3R1cmUnIH07XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBraW5kXG4gIGlmICh0eXBlb2YgZXZlbnQua2luZCAhPT0gJ251bWJlcicgfHwgZXZlbnQua2luZCA8IDApIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdFdmVudCBraW5kIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRpbWVzdGFtcFxuICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgaWYgKHR5cGVvZiBldmVudC5jcmVhdGVkX2F0ICE9PSAnbnVtYmVyJyB8fCBldmVudC5jcmVhdGVkX2F0ID4gbm93ICsgNjApIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdFdmVudCB0aW1lc3RhbXAgY2Fubm90IGJlIGluIHRoZSBmdXR1cmUnIH07XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBjb250ZW50XG4gIGlmICh0eXBlb2YgZXZlbnQuY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdFdmVudCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnIH07XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBwdWJrZXkgZm9ybWF0XG4gIGlmICghZXZlbnQucHVia2V5KSB7XG4gICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnTWlzc2luZyBwdWJsaWMga2V5JyB9O1xuICB9XG5cbiAgLy8gR2V0IHB1YmtleSBoZXhcbiAgY29uc3QgcHVia2V5SGV4ID0gZ2V0UHVibGljS2V5SGV4KGV2ZW50LnB1YmtleSk7XG4gIGlmICh0eXBlb2YgcHVia2V5SGV4ICE9PSAnc3RyaW5nJyB8fCAhL15bMC05YS1mXXs2NH0kLy50ZXN0KHB1YmtleUhleCkpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdJbnZhbGlkIHB1YmxpYyBrZXkgZm9ybWF0JyB9O1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgdGFnc1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXZlbnQudGFncykpIHtcbiAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdFdmVudCB0YWdzIG11c3QgYmUgYW4gYXJyYXknIH07XG4gIH1cblxuICBmb3IgKGNvbnN0IHRhZyBvZiBldmVudC50YWdzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhZykpIHtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0VhY2ggdGFnIG11c3QgYmUgYW4gYXJyYXknIH07XG4gICAgfVxuICAgIGlmICh0YWcubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdFbXB0eSB0YWdzIGFyZSBub3QgYWxsb3dlZCcgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0YWdbMF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdUYWcgaWRlbnRpZmllciBtdXN0IGJlIGEgc3RyaW5nJyB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBOb3N0ciBmaWx0ZXIgYnkgY2hlY2tpbmcgaXRzIHN0cnVjdHVyZSBhbmQgZmllbGRzLlxuICogXG4gKiBAcGFyYW0ge05vc3RyRmlsdGVyfSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7VmFsaWRhdGlvblJlc3VsdH0gT2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiByZXN1bHQgYW5kIGFueSBlcnJvciBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVGaWx0ZXIoZmlsdGVyKTtcbiAqIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAqICAgY29uc29sZS5lcnJvcihyZXN1bHQuZXJyb3IpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbHRlcihmaWx0ZXI6IE5vc3RyRmlsdGVyKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gIHRyeSB7XG4gICAgLy8gVmFsaWRhdGUgZmlsdGVyIHN0cnVjdHVyZVxuICAgIGlmICghZmlsdGVyIHx8IHR5cGVvZiBmaWx0ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdJbnZhbGlkIGZpbHRlciBzdHJ1Y3R1cmUnIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaWRzIGFycmF5IGlmIHByZXNlbnRcbiAgICBpZiAoZmlsdGVyLmlkcyAmJiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyLmlkcykgfHwgIWZpbHRlci5pZHMuZXZlcnkoaWQgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJykpKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdGaWx0ZXIgaWRzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhdXRob3JzIGFycmF5IGlmIHByZXNlbnRcbiAgICBpZiAoZmlsdGVyLmF1dGhvcnMgJiYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5hdXRob3JzKSB8fCAhZmlsdGVyLmF1dGhvcnMuZXZlcnkoYXV0aG9yID0+IHR5cGVvZiBhdXRob3IgPT09ICdzdHJpbmcnKSkpIHtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ZpbHRlciBhdXRob3JzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBraW5kcyBhcnJheSBpZiBwcmVzZW50XG4gICAgaWYgKGZpbHRlci5raW5kcykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5raW5kcykpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnRmlsdGVyIGtpbmRzIG11c3QgYmUgYW4gYXJyYXkgb2YgbnVtYmVycycgfTtcbiAgICAgIH1cbiAgICAgIGlmICghZmlsdGVyLmtpbmRzLmV2ZXJ5KGtpbmQgPT4gdHlwZW9mIGtpbmQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoa2luZCkgJiYga2luZCA+PSAwKSkge1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdGaWx0ZXIga2luZHMgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlcnMnIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGltZXN0YW1wc1xuICAgIGlmIChmaWx0ZXIuc2luY2UgJiYgdHlwZW9mIGZpbHRlci5zaW5jZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ZpbHRlciBzaW5jZSBtdXN0IGJlIGEgbnVtYmVyJyB9O1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnVudGlsICYmIHR5cGVvZiBmaWx0ZXIudW50aWwgIT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdGaWx0ZXIgdW50aWwgbXVzdCBiZSBhIG51bWJlcicgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsaW1pdFxuICAgIGlmIChmaWx0ZXIubGltaXQgJiYgdHlwZW9mIGZpbHRlci5saW1pdCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ZpbHRlciBsaW1pdCBtdXN0IGJlIGEgbnVtYmVyJyB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHNlYXJjaFxuICAgIGlmIChmaWx0ZXIuc2VhcmNoICYmIHR5cGVvZiBmaWx0ZXIuc2VhcmNoICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnRmlsdGVyIHNlYXJjaCBtdXN0IGJlIGEgc3RyaW5nJyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHZhbGlkYXRlIGZpbHRlcicpO1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogJ0ZhaWxlZCB0byB2YWxpZGF0ZSBmaWx0ZXInIH07XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBOb3N0ciBzdWJzY3JpcHRpb24gYnkgY2hlY2tpbmcgaXRzIHN0cnVjdHVyZSBhbmQgZmlsdGVycy5cbiAqIFxuICogQHBhcmFtIHtOb3N0clN1YnNjcmlwdGlvbn0gc3Vic2NyaXB0aW9uIC0gVGhlIHN1YnNjcmlwdGlvbiB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge1ZhbGlkYXRpb25SZXN1bHR9IE9iamVjdCBjb250YWluaW5nIHZhbGlkYXRpb24gcmVzdWx0IGFuZCBhbnkgZXJyb3IgbWVzc2FnZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gKiBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LmVycm9yKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uOiBOb3N0clN1YnNjcmlwdGlvbik6IFZhbGlkYXRpb25SZXN1bHQge1xuICB0cnkge1xuICAgIC8vIFZhbGlkYXRlIHN1YnNjcmlwdGlvbiBzdHJ1Y3R1cmVcbiAgICBpZiAoIXN1YnNjcmlwdGlvbiB8fCB0eXBlb2Ygc3Vic2NyaXB0aW9uICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnSW52YWxpZCBzdWJzY3JpcHRpb24gc3RydWN0dXJlJyB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHN1YnNjcmlwdGlvbiBJRFxuICAgIGlmICghc3Vic2NyaXB0aW9uLmlkIHx8IHR5cGVvZiBzdWJzY3JpcHRpb24uaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJzY3JpcHRpb24gbXVzdCBoYXZlIGEgc3RyaW5nIElEJyB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGZpbHRlcnMgYXJyYXlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2NyaXB0aW9uLmZpbHRlcnMpKSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3I6ICdTdWJzY3JpcHRpb24gZmlsdGVycyBtdXN0IGJlIGFuIGFycmF5JyB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggZmlsdGVyXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2Ygc3Vic2NyaXB0aW9uLmZpbHRlcnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlclZhbGlkYXRpb24gPSB2YWxpZGF0ZUZpbHRlcihmaWx0ZXIpO1xuICAgICAgaWYgKCFmaWx0ZXJWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlclZhbGlkYXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gdmFsaWRhdGUgc3Vic2NyaXB0aW9uJyk7XG4gICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yOiAnRmFpbGVkIHRvIHZhbGlkYXRlIHN1YnNjcmlwdGlvbicgfTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIE5vc3RyIHJlbGF5IHJlc3BvbnNlIG1lc3NhZ2UuXG4gKiBcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7VmFsaWRhdGlvblJlc3VsdH0gT2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiByZXN1bHQgYW5kIGFueSBlcnJvciBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVSZXNwb25zZShbJ0VWRU5UJywgZXZlbnRPYmpdKTtcbiAqIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAqICAgY29uc29sZS5lcnJvcihyZXN1bHQuZXJyb3IpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlKG1lc3NhZ2U6IHVua25vd24pOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgLy8gQ2hlY2sgaWYgbWVzc2FnZSBpcyBhbiBhcnJheVxuICBpZiAoIUFycmF5LmlzQXJyYXkobWVzc2FnZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcjogJ0ludmFsaWQgbWVzc2FnZSBmb3JtYXQ6IG11c3QgYmUgYW4gYXJyYXknXG4gICAgfTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1lc3NhZ2UgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gIGlmIChtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yOiAnSW52YWxpZCBtZXNzYWdlIGZvcm1hdDogYXJyYXkgaXMgZW1wdHknXG4gICAgfTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGZpcnN0IGVsZW1lbnQgaXMgYSB2YWxpZCBtZXNzYWdlIHR5cGVcbiAgY29uc3QgdHlwZSA9IG1lc3NhZ2VbMF07XG4gIGlmICghT2JqZWN0LnZhbHVlcyhOb3N0ck1lc3NhZ2VUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIE5vc3RyTWVzc2FnZVR5cGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3I6IGBJbnZhbGlkIG1lc3NhZ2UgdHlwZTogJHt0eXBlfWBcbiAgICB9O1xuICB9XG5cbiAgLy8gVHlwZS1zcGVjaWZpYyB2YWxpZGF0aW9uXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgTm9zdHJNZXNzYWdlVHlwZS5FVkVOVDpcbiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAnRVZFTlQgbWVzc2FnZSBtdXN0IGhhdmUgZXhhY3RseSAyIGVsZW1lbnRzJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkYXRlU2lnbmVkRXZlbnQobWVzc2FnZVsxXSBhcyBTaWduZWROb3N0ckV2ZW50KTtcblxuICAgIGNhc2UgTm9zdHJNZXNzYWdlVHlwZS5OT1RJQ0U6XG4gICAgICBpZiAobWVzc2FnZS5sZW5ndGggIT09IDIgfHwgdHlwZW9mIG1lc3NhZ2VbMV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6ICdOT1RJQ0UgbWVzc2FnZSBtdXN0IGhhdmUgZXhhY3RseSAyIGVsZW1lbnRzIHdpdGggYSBzdHJpbmcgbWVzc2FnZSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcblxuICAgIGNhc2UgTm9zdHJNZXNzYWdlVHlwZS5PSzpcbiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCAhPT0gNCB8fCBcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZVsxXSAhPT0gJ3N0cmluZycgfHwgXG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2VbMl0gIT09ICdib29sZWFuJyB8fCBcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZVszXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ09LIG1lc3NhZ2UgbXVzdCBoYXZlIGV4YWN0bHkgNCBlbGVtZW50czogW3R5cGUsIGV2ZW50SWQsIHN1Y2Nlc3MsIG1lc3NhZ2VdJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9O1xuXG4gICAgY2FzZSBOb3N0ck1lc3NhZ2VUeXBlLkVPU0U6XG4gICAgICBpZiAobWVzc2FnZS5sZW5ndGggIT09IDIgfHwgdHlwZW9mIG1lc3NhZ2VbMV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6ICdFT1NFIG1lc3NhZ2UgbXVzdCBoYXZlIGV4YWN0bHkgMiBlbGVtZW50cyB3aXRoIGEgc3Vic2NyaXB0aW9uIElEJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9O1xuXG4gICAgY2FzZSBOb3N0ck1lc3NhZ2VUeXBlLlJFUTpcbiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ1JFUSBtZXNzYWdlIG11c3QgaGF2ZSBhdCBsZWFzdCAyIGVsZW1lbnRzJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlWzFdICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAnUkVRIG1lc3NhZ2UgbXVzdCBoYXZlIGEgc3RyaW5nIHN1YnNjcmlwdGlvbiBJRCdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGVhY2ggZmlsdGVyIGlmIHByZXNlbnRcbiAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbWVzc2FnZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWx0ZXJSZXN1bHQgPSB2YWxpZGF0ZUZpbHRlcihtZXNzYWdlW2ldIGFzIE5vc3RyRmlsdGVyKTtcbiAgICAgICAgaWYgKCFmaWx0ZXJSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXJSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUgfTtcblxuICAgIGNhc2UgTm9zdHJNZXNzYWdlVHlwZS5DTE9TRTpcbiAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCAhPT0gMiB8fCB0eXBlb2YgbWVzc2FnZVsxXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ0NMT1NFIG1lc3NhZ2UgbXVzdCBoYXZlIGV4YWN0bHkgMiBlbGVtZW50cyB3aXRoIGEgc3Vic2NyaXB0aW9uIElEJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9O1xuXG4gICAgY2FzZSBOb3N0ck1lc3NhZ2VUeXBlLkFVVEg6XG4gICAgICBpZiAobWVzc2FnZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ0FVVEggbWVzc2FnZSBtdXN0IGhhdmUgZXhhY3RseSAyIGVsZW1lbnRzJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkYXRlU2lnbmVkRXZlbnQobWVzc2FnZVsxXSBhcyBTaWduZWROb3N0ckV2ZW50KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGBVbnN1cHBvcnRlZCBtZXNzYWdlIHR5cGU6ICR7dHlwZX1gXG4gICAgICB9O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbW9kdWxlIGV2ZW50XG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgaGFuZGxpbmcgdXRpbGl0aWVzIGZvciBOb3N0clxuICovXG5cbmV4cG9ydCB7IGNyZWF0ZUV2ZW50LCBzZXJpYWxpemVFdmVudCwgZ2V0RXZlbnRIYXNoIH0gZnJvbSAnLi9jcmVhdGlvbic7XG5leHBvcnQgeyB2YWxpZGF0ZUV2ZW50LCBjYWxjdWxhdGVFdmVudElkIH0gZnJvbSAnLi9zaWduaW5nJztcbiIsICIvKipcbiAqIEBtb2R1bGUgZXZlbnQvY3JlYXRpb25cbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBjcmVhdGlvbiBhbmQgc2VyaWFsaXphdGlvbiB1dGlsaXRpZXMgZm9yIE5vc3RyXG4gKi9cblxuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyLmpzJztcbmltcG9ydCB7IGJ5dGVzVG9IZXggfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IE5vc3RyRXZlbnQsIE5vc3RyRXZlbnRLaW5kIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTm9zdHIgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBwYXJhbXMgLSBFdmVudCBwYXJhbWV0ZXJzXG4gKiBAcmV0dXJucyBDcmVhdGVkIGV2ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudChwYXJhbXM6IHtcbiAga2luZDogTm9zdHJFdmVudEtpbmQ7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdW107XG4gIGNyZWF0ZWRfYXQ/OiBudW1iZXI7XG4gIHB1YmtleT86IHN0cmluZztcbn0pOiBOb3N0ckV2ZW50IHtcbiAgY29uc3QgeyBcbiAgICBraW5kLCBcbiAgICBjb250ZW50LCBcbiAgICB0YWdzID0gW10sIFxuICAgIGNyZWF0ZWRfYXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSwgXG4gICAgcHVia2V5ID0gJycgXG4gIH0gPSBwYXJhbXM7XG4gIFxuICByZXR1cm4ge1xuICAgIGtpbmQsXG4gICAgY29udGVudCxcbiAgICB0YWdzLFxuICAgIGNyZWF0ZWRfYXQsXG4gICAgcHVia2V5LFxuICB9O1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYSBOb3N0ciBldmVudCBmb3Igc2lnbmluZy9oYXNoaW5nIChOSVAtMDEpXG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudCB0byBzZXJpYWxpemVcbiAqIEByZXR1cm5zIFNlcmlhbGl6ZWQgZXZlbnQgSlNPTiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUV2ZW50KGV2ZW50OiBOb3N0ckV2ZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICAwLFxuICAgIGV2ZW50LnB1YmtleSxcbiAgICBldmVudC5jcmVhdGVkX2F0LFxuICAgIGV2ZW50LmtpbmQsXG4gICAgZXZlbnQudGFncyxcbiAgICBldmVudC5jb250ZW50XG4gIF0pO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGhhc2ggb2YgYSBOb3N0ciBldmVudCAoTklQLTAxKVxuICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgdG8gaGFzaFxuICogQHJldHVybnMgRXZlbnQgaGFzaCBpbiBoZXggZm9ybWF0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFdmVudEhhc2goZXZlbnQ6IE5vc3RyRXZlbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVFdmVudChldmVudCk7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IHNoYTI1NihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplZCkpO1xuICAgIHJldHVybiBieXRlc1RvSGV4KGhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gZ2V0IGV2ZW50IGhhc2gnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIiwgIi8qKlxuICogQG1vZHVsZSBldmVudC9zaWduaW5nXG4gKiBAZGVzY3JpcHRpb24gRXZlbnQgc2lnbmluZyBhbmQgdmVyaWZpY2F0aW9uIHV0aWxpdGllcyBmb3IgTm9zdHJcbiAqL1xuXG5pbXBvcnQgeyBzY2hub3JyIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEuanMnO1xuaW1wb3J0IHsgYnl0ZXNUb0hleCwgaGV4VG9CeXRlcyB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGdldEV2ZW50SGFzaCB9IGZyb20gJy4vY3JlYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBOb3N0ckV2ZW50LCBTaWduZWROb3N0ckV2ZW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFNpZ25zIGEgTm9zdHIgZXZlbnQgd2l0aCBhIHByaXZhdGUga2V5IChOSVAtMDEpXG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudCB0byBzaWduXG4gKiBAcGFyYW0gcHJpdmF0ZUtleSAtIFByaXZhdGUga2V5IGluIGhleCBmb3JtYXRcbiAqIEByZXR1cm5zIFNpZ25lZCBldmVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkV2ZW50KFxuICBldmVudDogTm9zdHJFdmVudCwgXG4gIHByaXZhdGVLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxTaWduZWROb3N0ckV2ZW50PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IGdldEV2ZW50SGFzaChldmVudCk7XG4gICAgY29uc3Qgc2lnID0gc2Nobm9yci5zaWduKGhleFRvQnl0ZXMoaGFzaCksIGhleFRvQnl0ZXMocHJpdmF0ZUtleSkpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGlkOiBoYXNoLFxuICAgICAgc2lnOiBieXRlc1RvSGV4KHNpZyksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHNpZ24gZXZlbnQnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb2YgYSBzaWduZWQgTm9zdHIgZXZlbnQgKE5JUC0wMSlcbiAqIEBwYXJhbSBldmVudCAtIEV2ZW50IHRvIHZlcmlmeVxuICogQHJldHVybnMgVHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShldmVudDogU2lnbmVkTm9zdHJFdmVudCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBzY2hub3JyLnZlcmlmeShcbiAgICAgIGhleFRvQnl0ZXMoZXZlbnQuc2lnKSxcbiAgICAgIGhleFRvQnl0ZXMoZXZlbnQuaWQpLFxuICAgICAgaGV4VG9CeXRlcyhldmVudC5wdWJrZXkpXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHZlcmlmeSBzaWduYXR1cmUnKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBOb3N0ciBldmVudFxuICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFRydWUgaWYgZXZlbnQgaXMgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXZlbnQoZXZlbnQ6IFNpZ25lZE5vc3RyRXZlbnQpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIWV2ZW50LmlkIHx8ICFldmVudC5wdWJrZXkgfHwgIWV2ZW50LnNpZykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSBzaWduYXR1cmVcbiAgICByZXR1cm4gdmVyaWZ5U2lnbmF0dXJlKGV2ZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRXJyb3IgdmFsaWRhdGluZyBldmVudCcpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV2ZW50IElEIGZvciBhIE5vc3RyIGV2ZW50XG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudCB0byBjYWxjdWxhdGUgSUQgZm9yXG4gKiBAcmV0dXJucyBFdmVudCBJRFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXZlbnRJZChldmVudDogTm9zdHJFdmVudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBnZXRFdmVudEhhc2goZXZlbnQpO1xufVxuIiwgIi8qKlxuICogQG1vZHVsZSBuaXBzL25pcC0wNFxuICogQGRlc2NyaXB0aW9uIEltcGxlbWVudGF0aW9uIG9mIE5JUC0wNCAoRW5jcnlwdGVkIERpcmVjdCBNZXNzYWdlcylcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMDQubWRcbiAqL1xuXG5pbXBvcnQgeyBzZWNwMjU2azEgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMS5qcyc7XG5pbXBvcnQgeyBoZXhUb0J5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgYnl0ZXNUb0Jhc2U2NCwgYmFzZTY0VG9CeXRlcyB9IGZyb20gJy4uL2VuY29kaW5nL2Jhc2U2NCc7XG5pbXBvcnQgdHlwZSB7IENyeXB0b1N1YnRsZSB9IGZyb20gJy4uL2NyeXB0byc7XG5cblxuLy8gQ29uZmlndXJlIGNyeXB0byBmb3IgTm9kZS5qcyBhbmQgdGVzdCBlbnZpcm9ubWVudHNcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgY3J5cHRvOiBDcnlwdG9TdWJ0bGU7XG4gIH1cbiAgaW50ZXJmYWNlIEdsb2JhbCB7XG4gICAgY3J5cHRvOiBDcnlwdG9TdWJ0bGU7XG4gIH1cbn1cblxuY29uc3QgZ2V0Q3J5cHRvID0gYXN5bmMgKCk6IFByb21pc2U8Q3J5cHRvU3VidGxlPiA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5jcnlwdG87XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIChnbG9iYWwgYXMgR2xvYmFsKS5jcnlwdG8pIHtcbiAgICByZXR1cm4gKGdsb2JhbCBhcyBHbG9iYWwpLmNyeXB0bztcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNyeXB0b01vZHVsZSA9IGF3YWl0IGltcG9ydCgnY3J5cHRvJyk7XG4gICAgaWYgKGNyeXB0b01vZHVsZS53ZWJjcnlwdG8pIHtcbiAgICAgIHJldHVybiBjcnlwdG9Nb2R1bGUud2ViY3J5cHRvIGFzIENyeXB0b1N1YnRsZTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci5kZWJ1ZygnTm9kZSBjcnlwdG8gbm90IGF2YWlsYWJsZScpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJDcnlwdG8gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyk7XG59O1xuXG5jbGFzcyBDcnlwdG9JbXBsZW1lbnRhdGlvbiB7XG4gIHByaXZhdGUgY3J5cHRvSW5zdGFuY2U6IENyeXB0b1N1YnRsZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5pdFByb21pc2UgPSB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNyeXB0b0luc3RhbmNlID0gYXdhaXQgZ2V0Q3J5cHRvKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8Q3J5cHRvU3VidGxlPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICBpZiAoIXRoaXMuY3J5cHRvSW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3J5cHRvIGltcGxlbWVudGF0aW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcnlwdG9JbnN0YW5jZTtcbiAgfVxuXG4gIGFzeW5jIGdldFN1YnRsZSgpOiBQcm9taXNlPENyeXB0b1N1YnRsZVsnc3VidGxlJ10+IHtcbiAgICBjb25zdCBjcnlwdG8gPSBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIGNyeXB0by5zdWJ0bGU7XG4gIH1cblxuICBhc3luYyBnZXRSYW5kb21WYWx1ZXM8VCBleHRlbmRzIFVpbnQ4QXJyYXkgfCBJbnQ4QXJyYXkgfCBVaW50MTZBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MzJBcnJheSB8IEludDMyQXJyYXk+KGFycmF5OiBUKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY3J5cHRvID0gYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgfVxufVxuXG5jb25zdCBjcnlwdG9JbXBsID0gbmV3IENyeXB0b0ltcGxlbWVudGF0aW9uKCk7XG5cbmludGVyZmFjZSBTaGFyZWRTZWNyZXQge1xuICBzaGFyZWRTZWNyZXQ6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRW5jcnlwdHMgYSBtZXNzYWdlIHVzaW5nIE5JUC0wNCBlbmNyeXB0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE1lc3NhZ2UgdG8gZW5jcnlwdFxuICogQHBhcmFtIHNlbmRlclByaXZLZXkgLSBTZW5kZXIncyBwcml2YXRlIGtleVxuICogQHBhcmFtIHJlY2lwaWVudFB1YktleSAtIFJlY2lwaWVudCdzIHB1YmxpYyBrZXlcbiAqIEByZXR1cm5zIEVuY3J5cHRlZCBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdE1lc3NhZ2UoXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgc2VuZGVyUHJpdktleTogc3RyaW5nLFxuICByZWNpcGllbnRQdWJLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIXNlbmRlclByaXZLZXkgfHwgIXJlY2lwaWVudFB1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBrZXlzXG4gICAgaWYgKCEvXlswLTlhLWZdezY0fSQvaS50ZXN0KHNlbmRlclByaXZLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpdmF0ZSBrZXkgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHB1YmxpYyBrZXkgaXMgaW4gY29ycmVjdCBmb3JtYXRcbiAgICBjb25zdCBwdWJLZXlIZXggPSByZWNpcGllbnRQdWJLZXkuc3RhcnRzV2l0aCgnMDInKSB8fCByZWNpcGllbnRQdWJLZXkuc3RhcnRzV2l0aCgnMDMnKSBcbiAgICAgID8gcmVjaXBpZW50UHViS2V5IFxuICAgICAgOiAnMDInICsgcmVjaXBpZW50UHViS2V5O1xuXG4gICAgLy8gR2VuZXJhdGUgc2hhcmVkIHNlY3JldFxuICAgIGNvbnN0IHNoYXJlZFBvaW50ID0gc2VjcDI1NmsxLmdldFNoYXJlZFNlY3JldChoZXhUb0J5dGVzKHNlbmRlclByaXZLZXkpLCBoZXhUb0J5dGVzKHB1YktleUhleCkpO1xuICAgIGNvbnN0IHNoYXJlZFggPSBzaGFyZWRQb2ludC5zbGljZSgxLCAzMyk7IC8vIFVzZSBvbmx5IHgtY29vcmRpbmF0ZVxuXG4gICAgLy8gSW1wb3J0IGtleSBmb3IgQUVTXG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgKGF3YWl0IGNyeXB0b0ltcGwuZ2V0U3VidGxlKCkpLmltcG9ydEtleShcbiAgICAgICdyYXcnLFxuICAgICAgc2hhcmVkWC5idWZmZXIsXG4gICAgICB7IG5hbWU6ICdBRVMtQ0JDJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgIGZhbHNlLFxuICAgICAgWydlbmNyeXB0J11cbiAgICApO1xuXG4gICAgLy8gWmVybyBzaGFyZWQgc2VjcmV0IG1hdGVyaWFsIG5vdyB0aGF0IEFFUyBrZXkgaXMgaW1wb3J0ZWRcbiAgICBzaGFyZWRYLmZpbGwoMCk7XG4gICAgc2hhcmVkUG9pbnQuZmlsbCgwKTtcblxuICAgIC8vIEdlbmVyYXRlIElWIGFuZCBlbmNyeXB0XG4gICAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgYXdhaXQgY3J5cHRvSW1wbC5nZXRSYW5kb21WYWx1ZXMoaXYpO1xuXG4gICAgY29uc3QgZW5jb2RlZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCAoYXdhaXQgY3J5cHRvSW1wbC5nZXRTdWJ0bGUoKSkuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogJ0FFUy1DQkMnLCBpdiB9LFxuICAgICAgc2hhcmVkS2V5LFxuICAgICAgZW5jb2RlZC5idWZmZXJcbiAgICApO1xuXG4gICAgLy8gTklQLTA0IHN0YW5kYXJkIGZvcm1hdDogYmFzZTY0KGNpcGhlcnRleHQpICsgXCI/aXY9XCIgKyBiYXNlNjQoaXYpXG4gICAgY29uc3QgY2lwaGVydGV4dEJhc2U2NCA9IGJ5dGVzVG9CYXNlNjQobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgY29uc3QgaXZCYXNlNjQgPSBieXRlc1RvQmFzZTY0KGl2KTtcblxuICAgIHJldHVybiBjaXBoZXJ0ZXh0QmFzZTY0ICsgJz9pdj0nICsgaXZCYXNlNjQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmVycm9yKHsgZXJyb3IgfSwgJ0ZhaWxlZCB0byBlbmNyeXB0IG1lc3NhZ2UnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIERlY3J5cHRzIGEgbWVzc2FnZSB1c2luZyBOSVAtMDQgZGVjcnlwdGlvblxuICogQHBhcmFtIGVuY3J5cHRlZE1lc3NhZ2UgLSBFbmNyeXB0ZWQgbWVzc2FnZSBzdHJpbmdcbiAqIEBwYXJhbSByZWNpcGllbnRQcml2S2V5IC0gUmVjaXBpZW50J3MgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSBzZW5kZXJQdWJLZXkgLSBTZW5kZXIncyBwdWJsaWMga2V5XG4gKiBAcmV0dXJucyBEZWNyeXB0ZWQgbWVzc2FnZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRNZXNzYWdlKFxuICBlbmNyeXB0ZWRNZXNzYWdlOiBzdHJpbmcsXG4gIHJlY2lwaWVudFByaXZLZXk6IHN0cmluZyxcbiAgc2VuZGVyUHViS2V5OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgaWYgKCFlbmNyeXB0ZWRNZXNzYWdlIHx8ICFyZWNpcGllbnRQcml2S2V5IHx8ICFzZW5kZXJQdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5c1xuICAgIGlmICghL15bMC05YS1mXXs2NH0kL2kudGVzdChyZWNpcGllbnRQcml2S2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5IGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBwdWJsaWMga2V5IGlzIGluIGNvcnJlY3QgZm9ybWF0XG4gICAgY29uc3QgcHViS2V5SGV4ID0gc2VuZGVyUHViS2V5LnN0YXJ0c1dpdGgoJzAyJykgfHwgc2VuZGVyUHViS2V5LnN0YXJ0c1dpdGgoJzAzJylcbiAgICAgID8gc2VuZGVyUHViS2V5XG4gICAgICA6ICcwMicgKyBzZW5kZXJQdWJLZXk7XG5cbiAgICAvLyBHZW5lcmF0ZSBzaGFyZWQgc2VjcmV0XG4gICAgY29uc3Qgc2hhcmVkUG9pbnQgPSBzZWNwMjU2azEuZ2V0U2hhcmVkU2VjcmV0KGhleFRvQnl0ZXMocmVjaXBpZW50UHJpdktleSksIGhleFRvQnl0ZXMocHViS2V5SGV4KSk7XG4gICAgY29uc3Qgc2hhcmVkWCA9IHNoYXJlZFBvaW50LnNsaWNlKDEsIDMzKTsgLy8gVXNlIG9ubHkgeC1jb29yZGluYXRlXG5cbiAgICAvLyBJbXBvcnQga2V5IGZvciBBRVNcbiAgICBjb25zdCBzaGFyZWRLZXkgPSBhd2FpdCAoYXdhaXQgY3J5cHRvSW1wbC5nZXRTdWJ0bGUoKSkuaW1wb3J0S2V5KFxuICAgICAgJ3JhdycsXG4gICAgICBzaGFyZWRYLmJ1ZmZlcixcbiAgICAgIHsgbmFtZTogJ0FFUy1DQkMnLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2RlY3J5cHQnXVxuICAgICk7XG5cbiAgICAvLyBaZXJvIHNoYXJlZCBzZWNyZXQgbWF0ZXJpYWwgbm93IHRoYXQgQUVTIGtleSBpcyBpbXBvcnRlZFxuICAgIHNoYXJlZFguZmlsbCgwKTtcbiAgICBzaGFyZWRQb2ludC5maWxsKDApO1xuXG4gICAgLy8gUGFyc2UgTklQLTA0IHN0YW5kYXJkIGZvcm1hdDogYmFzZTY0KGNpcGhlcnRleHQpICsgXCI/aXY9XCIgKyBiYXNlNjQoaXYpXG4gICAgLy8gQWxzbyBzdXBwb3J0IGxlZ2FjeSBoZXggZm9ybWF0IChpdiArIGNpcGhlcnRleHQgY29uY2F0ZW5hdGVkKSBhcyBmYWxsYmFja1xuICAgIGxldCBpdjogVWludDhBcnJheTtcbiAgICBsZXQgY2lwaGVydGV4dDogVWludDhBcnJheTtcblxuICAgIGlmIChlbmNyeXB0ZWRNZXNzYWdlLmluY2x1ZGVzKCc/aXY9JykpIHtcbiAgICAgIC8vIE5JUC0wNCBzdGFuZGFyZCBmb3JtYXRcbiAgICAgIGNvbnN0IFtjaXBoZXJ0ZXh0QmFzZTY0LCBpdkJhc2U2NF0gPSBlbmNyeXB0ZWRNZXNzYWdlLnNwbGl0KCc/aXY9Jyk7XG4gICAgICBjaXBoZXJ0ZXh0ID0gYmFzZTY0VG9CeXRlcyhjaXBoZXJ0ZXh0QmFzZTY0KTtcbiAgICAgIGl2ID0gYmFzZTY0VG9CeXRlcyhpdkJhc2U2NCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBoZXggZm9ybWF0IGZhbGxiYWNrOiBmaXJzdCAxNiBieXRlcyBhcmUgSVYsIHJlc3QgaXMgY2lwaGVydGV4dFxuICAgICAgY29uc3QgZW5jcnlwdGVkID0gaGV4VG9CeXRlcyhlbmNyeXB0ZWRNZXNzYWdlKTtcbiAgICAgIGl2ID0gZW5jcnlwdGVkLnNsaWNlKDAsIDE2KTtcbiAgICAgIGNpcGhlcnRleHQgPSBlbmNyeXB0ZWQuc2xpY2UoMTYpO1xuICAgIH1cblxuICAgIC8vIERlY3J5cHRcbiAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCAoYXdhaXQgY3J5cHRvSW1wbC5nZXRTdWJ0bGUoKSkuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogJ0FFUy1DQkMnLCBpdiB9LFxuICAgICAgc2hhcmVkS2V5LFxuICAgICAgY2lwaGVydGV4dC5idWZmZXIgYXMgQXJyYXlCdWZmZXJcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShkZWNyeXB0ZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gZGVjcnlwdCBtZXNzYWdlJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzaGFyZWQgc2VjcmV0IGZvciBOSVAtMDQgZW5jcnlwdGlvblxuICogQHBhcmFtIHByaXZhdGVLZXkgLSBQcml2YXRlIGtleVxuICogQHBhcmFtIHB1YmxpY0tleSAtIFB1YmxpYyBrZXlcbiAqIEByZXR1cm5zIFNoYXJlZCBzZWNyZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2hhcmVkU2VjcmV0KFxuICBwcml2YXRlS2V5OiBzdHJpbmcsXG4gIHB1YmxpY0tleTogc3RyaW5nXG4pOiBTaGFyZWRTZWNyZXQge1xuICB0cnkge1xuICAgIGlmICghcHJpdmF0ZUtleSB8fCAhcHVibGljS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgcGFyYW1ldGVycycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGtleXNcbiAgICBpZiAoIS9eWzAtOWEtZl17NjR9JC9pLnRlc3QocHJpdmF0ZUtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwcml2YXRlIGtleSBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgcHVibGljIGtleSBpcyBpbiBjb3JyZWN0IGZvcm1hdFxuICAgIGNvbnN0IHB1YktleUhleCA9IHB1YmxpY0tleS5zdGFydHNXaXRoKCcwMicpIHx8IHB1YmxpY0tleS5zdGFydHNXaXRoKCcwMycpXG4gICAgICA/IHB1YmxpY0tleVxuICAgICAgOiAnMDInICsgcHVibGljS2V5O1xuXG4gICAgLy8gR2VuZXJhdGUgc2hhcmVkIHNlY3JldFxuICAgIGNvbnN0IHNoYXJlZFBvaW50ID0gc2VjcDI1NmsxLmdldFNoYXJlZFNlY3JldChoZXhUb0J5dGVzKHByaXZhdGVLZXkpLCBoZXhUb0J5dGVzKHB1YktleUhleCkpO1xuICAgIHJldHVybiB7IHNoYXJlZFNlY3JldDogc2hhcmVkUG9pbnQuc2xpY2UoMSwgMzMpIH07IC8vIFJldHVybiBvbmx5IHgtY29vcmRpbmF0ZVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gZ2VuZXJhdGUgc2hhcmVkIHNlY3JldCcpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCB7IGdlbmVyYXRlU2hhcmVkU2VjcmV0IGFzIGNvbXB1dGVTaGFyZWRTZWNyZXQgfTtcbiIsICIvKipcbiAqIEBtb2R1bGUgbmlwcy9uaXAtMDFcbiAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiBOSVAtMDE6IEJhc2ljIFByb3RvY29sIEZsb3cgRGVzY3JpcHRpb25cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMDEubWRcbiAqL1xuXG5pbXBvcnQgeyBzY2hub3JyIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEuanMnO1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyLmpzJztcbmltcG9ydCB7IGJ5dGVzVG9IZXgsIGhleFRvQnl0ZXMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IE5vc3RyRXZlbnQsIFNpZ25lZE5vc3RyRXZlbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBOb3N0ciBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyAoTklQLTAxKVxuICogQHBhcmFtIHBhcmFtcyAtIEV2ZW50IHBhcmFtZXRlcnNcbiAqIEByZXR1cm5zIENyZWF0ZWQgZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KHBhcmFtczoge1xuICBraW5kOiBudW1iZXI7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdW107XG4gIGNyZWF0ZWRfYXQ/OiBudW1iZXI7XG4gIHB1YmtleT86IHN0cmluZztcbn0pOiBOb3N0ckV2ZW50IHtcbiAgY29uc3QgeyBcbiAgICBraW5kLCBcbiAgICBjb250ZW50LCBcbiAgICB0YWdzID0gW10sIFxuICAgIGNyZWF0ZWRfYXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSwgXG4gICAgcHVia2V5ID0gJycgXG4gIH0gPSBwYXJhbXM7XG4gIFxuICByZXR1cm4ge1xuICAgIGtpbmQsXG4gICAgY29udGVudCxcbiAgICB0YWdzLFxuICAgIGNyZWF0ZWRfYXQsXG4gICAgcHVia2V5LFxuICB9O1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYSBOb3N0ciBldmVudCBmb3Igc2lnbmluZy9oYXNoaW5nIChOSVAtMDEpXG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudCB0byBzZXJpYWxpemVcbiAqIEByZXR1cm5zIFNlcmlhbGl6ZWQgZXZlbnQgSlNPTiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUV2ZW50KGV2ZW50OiBOb3N0ckV2ZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICAwLFxuICAgIGV2ZW50LnB1YmtleSxcbiAgICBldmVudC5jcmVhdGVkX2F0LFxuICAgIGV2ZW50LmtpbmQsXG4gICAgZXZlbnQudGFncyxcbiAgICBldmVudC5jb250ZW50XG4gIF0pO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGhhc2ggb2YgYSBOb3N0ciBldmVudCAoTklQLTAxKVxuICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgdG8gaGFzaFxuICogQHJldHVybnMgRXZlbnQgaGFzaCBpbiBoZXggZm9ybWF0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFdmVudEhhc2goZXZlbnQ6IE5vc3RyRXZlbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVFdmVudChldmVudCk7XG4gICAgY29uc3QgaGFzaCA9IHNoYTI1NihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplZCkpO1xuICAgIHJldHVybiBieXRlc1RvSGV4KGhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gZ2V0IGV2ZW50IGhhc2gnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFNpZ25zIGEgTm9zdHIgZXZlbnQgd2l0aCBhIHByaXZhdGUga2V5IChOSVAtMDEpXG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudCB0byBzaWduXG4gKiBAcGFyYW0gcHJpdmF0ZUtleSAtIFByaXZhdGUga2V5IGluIGhleCBmb3JtYXRcbiAqIEByZXR1cm5zIFNpZ25lZCBldmVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkV2ZW50KFxuICBldmVudDogTm9zdHJFdmVudCwgXG4gIHByaXZhdGVLZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxTaWduZWROb3N0ckV2ZW50PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IGdldEV2ZW50SGFzaChldmVudCk7XG4gICAgY29uc3Qgc2lnID0gc2Nobm9yci5zaWduKGhleFRvQnl0ZXMoaGFzaCksIGhleFRvQnl0ZXMocHJpdmF0ZUtleSkpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGlkOiBoYXNoLFxuICAgICAgc2lnOiBieXRlc1RvSGV4KHNpZyksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHNpZ24gZXZlbnQnKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb2YgYSBzaWduZWQgTm9zdHIgZXZlbnQgKE5JUC0wMSlcbiAqIEBwYXJhbSBldmVudCAtIEV2ZW50IHRvIHZlcmlmeVxuICogQHJldHVybnMgVHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShldmVudDogU2lnbmVkTm9zdHJFdmVudCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIC8vIFZlcmlmeSBldmVudCBJRFxuICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBjYWxjdWxhdGVFdmVudElkKGV2ZW50KTtcbiAgICBpZiAoZXZlbnQuaWQgIT09IGV4cGVjdGVkSWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgc2lnbmF0dXJlXG4gICAgcmV0dXJuIHNjaG5vcnIudmVyaWZ5KFxuICAgICAgaGV4VG9CeXRlcyhldmVudC5zaWcpLFxuICAgICAgaGV4VG9CeXRlcyhldmVudC5pZCksXG4gICAgICBoZXhUb0J5dGVzKGV2ZW50LnB1YmtleSlcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcih7IGVycm9yIH0sICdGYWlsZWQgdG8gdmVyaWZ5IHNpZ25hdHVyZScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV2ZW50IElEIGFjY29yZGluZyB0byBOSVAtMDFcbiAqIEBwYXJhbSBldmVudCAtIEV2ZW50IHRvIGNhbGN1bGF0ZSBJRCBmb3JcbiAqIEByZXR1cm5zIEV2ZW50IElEIGluIGhleCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUV2ZW50SWQoZXZlbnQ6IE5vc3RyRXZlbnQpOiBzdHJpbmcge1xuICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplRXZlbnQoZXZlbnQpO1xuICBjb25zdCBoYXNoID0gc2hhMjU2KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzZXJpYWxpemVkKSk7XG4gIHJldHVybiBieXRlc1RvSGV4KGhhc2gpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIE5vc3RyIGV2ZW50IHN0cnVjdHVyZSAoTklQLTAxKVxuICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFRydWUgaWYgZXZlbnQgc3RydWN0dXJlIGlzIHZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV2ZW50KGV2ZW50OiBOb3N0ckV2ZW50KTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBldmVudC5jb250ZW50ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgZXZlbnQuY3JlYXRlZF9hdCAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIGV2ZW50LmtpbmQgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50LnRhZ3MpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBldmVudC5wdWJrZXkgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgdGFncyBzdHJ1Y3R1cmVcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBldmVudC50YWdzKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHRhZy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdGFnWzBdICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnRmFpbGVkIHRvIHZhbGlkYXRlIGV2ZW50Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBOSVAtMTk6IGJlY2gzMi1lbmNvZGVkIGVudGl0aWVzXG4gKiBJbXBsZW1lbnRzIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBOb3N0ciBlbnRpdGllcyB1c2luZyBiZWNoMzIgZm9ybWF0XG4gKi9cblxuaW1wb3J0IHsgYmVjaDMyIH0gZnJvbSAnYmVjaDMyJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbmV4cG9ydCB0eXBlIE5pcDE5RGF0YVR5cGUgPSAnbnB1YicgfCAnbnNlYycgfCAnbm90ZScgfCAnbnByb2ZpbGUnIHwgJ25ldmVudCcgfCAnbmFkZHInIHwgJ25yZWxheSc7XG5cbmNvbnN0IFZBTElEX1BSRUZJWEVTOiBOaXAxOURhdGFUeXBlW10gPSBbJ25wdWInLCAnbnNlYycsICdub3RlJywgJ25wcm9maWxlJywgJ25ldmVudCcsICduYWRkcicsICducmVsYXknXTtcblxuZXhwb3J0IGludGVyZmFjZSBOaXAxOURhdGEge1xuICB0eXBlOiBOaXAxOURhdGFUeXBlO1xuICBkYXRhOiBzdHJpbmc7XG4gIHJlbGF5cz86IHN0cmluZ1tdO1xuICBhdXRob3I/OiBzdHJpbmc7XG4gIGtpbmQ/OiBudW1iZXI7XG4gIGlkZW50aWZpZXI/OiBzdHJpbmc7IC8vIEZvciBuYWRkclxufVxuXG4vLyBUTFYgdHlwZSBjb25zdGFudHNcbmNvbnN0IFRMVl9UWVBFUyA9IHtcbiAgU1BFQ0lBTDogMCwgICAvLyBNYWluIGRhdGEgKGhleClcbiAgUkVMQVk6IDEsICAgICAvLyBSZWxheSBVUkwgKHV0ZjgpXG4gIEFVVEhPUjogMiwgICAgLy8gQXV0aG9yIHB1YmtleSAoaGV4KVxuICBLSU5EOiAzLCAgICAgIC8vIEV2ZW50IGtpbmQgKHVpbnQ4KVxuICBJREVOVElGSUVSOiA0IC8vIElkZW50aWZpZXIgKHV0ZjgpXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEVuY29kZSBhIHB1YmxpYyBrZXkgYXMgYW4gbnB1YlxuICogQHBhcmFtIHB1YmtleSBQdWJsaWMga2V5IGluIGhleCBmb3JtYXRcbiAqIEByZXR1cm5zIGJlY2gzMi1lbmNvZGVkIG5wdWIgc3RyaW5nXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcHVia2V5IGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5wdWJFbmNvZGUocHVia2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YWxpZGF0ZUhleFN0cmluZyhwdWJrZXksIDY0KTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5mcm9tKHB1YmtleSwgJ2hleCcpO1xuICBjb25zdCB3b3JkcyA9IGJlY2gzMi50b1dvcmRzKGRhdGEpO1xuICByZXR1cm4gYmVjaDMyLmVuY29kZSgnbnB1YicsIHdvcmRzLCAxMDAwKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBwcml2YXRlIGtleSBhcyBhbiBuc2VjXG4gKiBAcGFyYW0gcHJpdmtleSBQcml2YXRlIGtleSBpbiBoZXggZm9ybWF0XG4gKiBAcmV0dXJucyBiZWNoMzItZW5jb2RlZCBuc2VjIHN0cmluZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHByaXZrZXkgaXMgaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbnNlY0VuY29kZShwcml2a2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YWxpZGF0ZUhleFN0cmluZyhwcml2a2V5LCA2NCk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShwcml2a2V5LCAnaGV4Jyk7XG4gIGNvbnN0IHdvcmRzID0gYmVjaDMyLnRvV29yZHMoZGF0YSk7XG4gIHJldHVybiBiZWNoMzIuZW5jb2RlKCduc2VjJywgd29yZHMsIDEwMDApO1xufVxuXG4vKipcbiAqIEVuY29kZSBhbiBldmVudCBJRCBhcyBhIG5vdGVcbiAqIEBwYXJhbSBldmVudElkIEV2ZW50IElEIGluIGhleCBmb3JtYXRcbiAqIEByZXR1cm5zIGJlY2gzMi1lbmNvZGVkIG5vdGUgc3RyaW5nXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZXZlbnRJZCBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RlRW5jb2RlKGV2ZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHZhbGlkYXRlSGV4U3RyaW5nKGV2ZW50SWQsIDY0KTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5mcm9tKGV2ZW50SWQsICdoZXgnKTtcbiAgY29uc3Qgd29yZHMgPSBiZWNoMzIudG9Xb3JkcyhkYXRhKTtcbiAgcmV0dXJuIGJlY2gzMi5lbmNvZGUoJ25vdGUnLCB3b3JkcywgMTAwMCk7XG59XG5cbi8qKlxuICogRW5jb2RlIHByb2ZpbGUgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSBwdWJrZXkgUHVibGljIGtleSBpbiBoZXggZm9ybWF0XG4gKiBAcGFyYW0gcmVsYXlzIE9wdGlvbmFsIHJlbGF5IFVSTHNcbiAqIEByZXR1cm5zIGJlY2gzMi1lbmNvZGVkIG5wcm9maWxlIHN0cmluZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHB1YmtleSBpcyBpbnZhbGlkIG9yIHJlbGF5cyBhcmUgbWFsZm9ybWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBucHJvZmlsZUVuY29kZShwdWJrZXk6IHN0cmluZywgcmVsYXlzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICB2YWxpZGF0ZUhleFN0cmluZyhwdWJrZXksIDY0KTtcbiAgaWYgKHJlbGF5cykge1xuICAgIHJlbGF5cy5mb3JFYWNoKHZhbGlkYXRlUmVsYXlVcmwpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGVuY29kZVRMVih7XG4gICAgdHlwZTogJ25wcm9maWxlJyxcbiAgICBkYXRhOiBwdWJrZXksXG4gICAgcmVsYXlzXG4gIH0pO1xuICByZXR1cm4gYmVjaDMyLmVuY29kZSgnbnByb2ZpbGUnLCBkYXRhLCAxMDAwKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgZXZlbnQgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSBldmVudElkIEV2ZW50IElEIGluIGhleCBmb3JtYXRcbiAqIEBwYXJhbSByZWxheXMgT3B0aW9uYWwgcmVsYXkgVVJMc1xuICogQHBhcmFtIGF1dGhvciBPcHRpb25hbCBhdXRob3IgcHVibGljIGtleVxuICogQHBhcmFtIGtpbmQgT3B0aW9uYWwgZXZlbnQga2luZFxuICogQHJldHVybnMgYmVjaDMyLWVuY29kZWQgbmV2ZW50IHN0cmluZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHBhcmFtZXRlcnMgYXJlIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ldmVudEVuY29kZShcbiAgZXZlbnRJZDogc3RyaW5nLFxuICByZWxheXM/OiBzdHJpbmdbXSxcbiAgYXV0aG9yPzogc3RyaW5nLFxuICBraW5kPzogbnVtYmVyXG4pOiBzdHJpbmcge1xuICB2YWxpZGF0ZUhleFN0cmluZyhldmVudElkLCA2NCk7XG4gIGlmIChyZWxheXMpIHtcbiAgICByZWxheXMuZm9yRWFjaCh2YWxpZGF0ZVJlbGF5VXJsKTtcbiAgfVxuICBpZiAoYXV0aG9yKSB7XG4gICAgdmFsaWRhdGVIZXhTdHJpbmcoYXV0aG9yLCA2NCk7XG4gIH1cbiAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCAmJiAhTnVtYmVyLmlzSW50ZWdlcihraW5kKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBldmVudCBraW5kJyk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gZW5jb2RlVExWKHtcbiAgICB0eXBlOiAnbmV2ZW50JyxcbiAgICBkYXRhOiBldmVudElkLFxuICAgIHJlbGF5cyxcbiAgICBhdXRob3IsXG4gICAga2luZFxuICB9KTtcbiAgcmV0dXJuIGJlY2gzMi5lbmNvZGUoJ25ldmVudCcsIGRhdGEsIDEwMDApO1xufVxuXG4vKipcbiAqIEVuY29kZSBhbiBhZGRyZXNzIChOSVAtMzMpXG4gKiBAcGFyYW0gcHVia2V5IEF1dGhvcidzIHB1YmxpYyBrZXlcbiAqIEBwYXJhbSBraW5kIEV2ZW50IGtpbmRcbiAqIEBwYXJhbSBpZGVudGlmaWVyIFN0cmluZyBpZGVudGlmaWVyXG4gKiBAcGFyYW0gcmVsYXlzIE9wdGlvbmFsIHJlbGF5IFVSTHNcbiAqIEByZXR1cm5zIGJlY2gzMi1lbmNvZGVkIG5hZGRyIHN0cmluZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHBhcmFtZXRlcnMgYXJlIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hZGRyRW5jb2RlKFxuICBwdWJrZXk6IHN0cmluZyxcbiAga2luZDogbnVtYmVyLFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIHJlbGF5cz86IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICB2YWxpZGF0ZUhleFN0cmluZyhwdWJrZXksIDY0KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtpbmQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV2ZW50IGtpbmQnKTtcbiAgfVxuICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lkZW50aWZpZXIgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAocmVsYXlzKSB7XG4gICAgcmVsYXlzLmZvckVhY2godmFsaWRhdGVSZWxheVVybCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gZW5jb2RlVExWKHtcbiAgICB0eXBlOiAnbmFkZHInLFxuICAgIGRhdGE6IHB1YmtleSxcbiAgICBraW5kLFxuICAgIGlkZW50aWZpZXIsXG4gICAgcmVsYXlzXG4gIH0pO1xuICByZXR1cm4gYmVjaDMyLmVuY29kZSgnbmFkZHInLCBkYXRhLCAxMDAwKTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSByZWxheSBVUkxcbiAqIEBwYXJhbSB1cmwgUmVsYXkgVVJMXG4gKiBAcmV0dXJucyBiZWNoMzItZW5jb2RlZCBucmVsYXkgc3RyaW5nXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgVVJMIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5yZWxheUVuY29kZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHZhbGlkYXRlUmVsYXlVcmwodXJsKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5mcm9tKHVybCwgJ3V0ZjgnKTtcbiAgY29uc3Qgd29yZHMgPSBiZWNoMzIudG9Xb3JkcyhkYXRhKTtcbiAgcmV0dXJuIGJlY2gzMi5lbmNvZGUoJ25yZWxheScsIHdvcmRzLCAxMDAwKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBiZWNoMzItZW5jb2RlZCBOb3N0ciBlbnRpdHlcbiAqIEBwYXJhbSBzdHIgYmVjaDMyLWVuY29kZWQgc3RyaW5nXG4gKiBAcmV0dXJucyBEZWNvZGVkIGRhdGEgd2l0aCB0eXBlIGFuZCBtZXRhZGF0YVxuICogQHRocm93cyB7RXJyb3J9IElmIHN0cmluZyBpcyBpbnZhbGlkIG9yIG1hbGZvcm1lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHN0cjogc3RyaW5nKTogTmlwMTlEYXRhIHtcbiAgaWYgKCFzdHIuaW5jbHVkZXMoJzEnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiZWNoMzIgc3RyaW5nJyk7XG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBzdHIuc3BsaXQoJzEnKVswXS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIVZBTElEX1BSRUZJWEVTLmluY2x1ZGVzKHByZWZpeCBhcyBOaXAxOURhdGFUeXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmVmaXgnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGJlY2gzMi5kZWNvZGUoc3RyLCAxMDAwKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmZyb20oYmVjaDMyLmZyb21Xb3JkcyhkZWNvZGVkLndvcmRzKSk7XG5cbiAgICAvLyBGb3IgbnJlbGF5IHR5cGVcbiAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgLy8gRm9yIFRMViB0eXBlc1xuICAgIGxldCBkZWNvZGVkRGF0YTogTmlwMTlEYXRhO1xuXG4gICAgc3dpdGNoIChkZWNvZGVkLnByZWZpeCkge1xuICAgICAgY2FzZSAnbnB1Yic6XG4gICAgICBjYXNlICduc2VjJzpcbiAgICAgIGNhc2UgJ25vdGUnOlxuICAgICAgICB2YWxpZGF0ZUhleFN0cmluZyhkYXRhLnRvU3RyaW5nKCdoZXgnKSwgNjQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IGRlY29kZWQucHJlZml4IGFzIE5pcDE5RGF0YVR5cGUsXG4gICAgICAgICAgZGF0YTogZGF0YS50b1N0cmluZygnaGV4JylcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ25yZWxheSc6XG4gICAgICAgIHVybCA9IGRhdGEudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgdmFsaWRhdGVSZWxheVVybCh1cmwpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICducmVsYXknLFxuICAgICAgICAgIGRhdGE6IHVybFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnbnByb2ZpbGUnOlxuICAgICAgY2FzZSAnbmV2ZW50JzpcbiAgICAgIGNhc2UgJ25hZGRyJzpcbiAgICAgICAgZGVjb2RlZERhdGEgPSBkZWNvZGVUTFYoZGVjb2RlZC5wcmVmaXggYXMgTmlwMTlEYXRhVHlwZSwgZGF0YSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVkRGF0YTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmVmaXgnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmVjaDMyIHN0cmluZycpO1xuICB9XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbnNcblxuZnVuY3Rpb24gdmFsaWRhdGVIZXhTdHJpbmcoc3RyOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IHZvaWQge1xuICBpZiAoIS9eWzAtOWEtZkEtRl0rJC8udGVzdChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKTtcbiAgfVxuICBpZiAobGVuZ3RoICYmIHN0ci5sZW5ndGggIT09IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aCAoZXhwZWN0ZWQgJHtsZW5ndGh9KWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVsYXlVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgaWYgKCFbJ3dzOicsICd3c3M6J10uaW5jbHVkZXMocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlbGF5IFVSTCBwcm90b2NvbCcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlbGF5IFVSTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVRMVihkYXRhOiBOaXAxOURhdGEpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgXG4gIC8vIFNwZWNpYWwgKHR5cGUgMCk6IG1haW4gZGF0YVxuICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZGF0YSwgJ2hleCcpO1xuICByZXN1bHQucHVzaChUTFZfVFlQRVMuU1BFQ0lBTCwgYnl0ZXMubGVuZ3RoKTtcbiAgcmVzdWx0LnB1c2goLi4uYnl0ZXMpO1xuXG4gIC8vIFJlbGF5ICh0eXBlIDEpOiByZWxheSBVUkxzXG4gIGlmIChkYXRhLnJlbGF5cz8ubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCByZWxheSBvZiBkYXRhLnJlbGF5cykge1xuICAgICAgY29uc3QgcmVsYXlCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlbGF5LCAndXRmOCcpO1xuICAgICAgcmVzdWx0LnB1c2goVExWX1RZUEVTLlJFTEFZLCByZWxheUJ5dGVzLmxlbmd0aCk7XG4gICAgICByZXN1bHQucHVzaCguLi5yZWxheUJ5dGVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBBdXRob3IgKHR5cGUgMik6IGF1dGhvciBwdWJrZXlcbiAgaWYgKGRhdGEuYXV0aG9yKSB7XG4gICAgY29uc3QgYXV0aG9yQnl0ZXMgPSBCdWZmZXIuZnJvbShkYXRhLmF1dGhvciwgJ2hleCcpO1xuICAgIHJlc3VsdC5wdXNoKFRMVl9UWVBFUy5BVVRIT1IsIGF1dGhvckJ5dGVzLmxlbmd0aCk7XG4gICAgcmVzdWx0LnB1c2goLi4uYXV0aG9yQnl0ZXMpO1xuICB9XG5cbiAgLy8gS2luZCAodHlwZSAzKTogZXZlbnQga2luZFxuICBpZiAoZGF0YS5raW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBraW5kQnl0ZXMgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAga2luZEJ5dGVzLndyaXRlVUludDMyQkUoZGF0YS5raW5kKTtcbiAgICByZXN1bHQucHVzaChUTFZfVFlQRVMuS0lORCwga2luZEJ5dGVzLmxlbmd0aCk7XG4gICAgcmVzdWx0LnB1c2goLi4ua2luZEJ5dGVzKTtcbiAgfVxuXG4gIC8vIElkZW50aWZpZXIgKHR5cGUgNCk6IGZvciBuYWRkclxuICBpZiAoZGF0YS5pZGVudGlmaWVyKSB7XG4gICAgY29uc3QgaWRlbnRpZmllckJ5dGVzID0gQnVmZmVyLmZyb20oZGF0YS5pZGVudGlmaWVyLCAndXRmOCcpO1xuICAgIHJlc3VsdC5wdXNoKFRMVl9UWVBFUy5JREVOVElGSUVSLCBpZGVudGlmaWVyQnl0ZXMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaCguLi5pZGVudGlmaWVyQnl0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIGJlY2gzMi50b1dvcmRzKEJ1ZmZlci5mcm9tKHJlc3VsdCkpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVUTFYocHJlZml4OiBOaXAxOURhdGFUeXBlLCBkYXRhOiBCdWZmZXIpOiBOaXAxOURhdGEge1xuICBjb25zdCByZXN1bHQ6IE5pcDE5RGF0YSA9IHtcbiAgICB0eXBlOiBwcmVmaXgsXG4gICAgZGF0YTogJycsXG4gICAgcmVsYXlzOiBbXVxuICB9O1xuXG4gIGxldCBpID0gMDtcbiAgLy8gRm9yIHJlbGF5IHR5cGVcbiAgbGV0IHJlbGF5OiBzdHJpbmc7XG5cbiAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IHR5cGUgPSBkYXRhW2ldO1xuICAgIGNvbnN0IGxlbmd0aCA9IGRhdGFbaSArIDFdO1xuICAgIFxuICAgIGlmIChpICsgMiArIGxlbmd0aCA+IGRhdGEubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVExWIGRhdGEnKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhLnNsaWNlKGkgKyAyLCBpICsgMiArIGxlbmd0aCk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVExWX1RZUEVTLlNQRUNJQUw6XG4gICAgICAgIHJlc3VsdC5kYXRhID0gdmFsdWUudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICB2YWxpZGF0ZUhleFN0cmluZyhyZXN1bHQuZGF0YSwgNjQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVExWX1RZUEVTLlJFTEFZOlxuICAgICAgICByZWxheSA9IHZhbHVlLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgICAgIHZhbGlkYXRlUmVsYXlVcmwocmVsYXkpO1xuICAgICAgICByZXN1bHQucmVsYXlzID0gcmVzdWx0LnJlbGF5cyB8fCBbXTtcbiAgICAgICAgcmVzdWx0LnJlbGF5cy5wdXNoKHJlbGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRMVl9UWVBFUy5BVVRIT1I6XG4gICAgICAgIHJlc3VsdC5hdXRob3IgPSB2YWx1ZS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIHZhbGlkYXRlSGV4U3RyaW5nKHJlc3VsdC5hdXRob3IsIDY0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRMVl9UWVBFUy5LSU5EOlxuICAgICAgICByZXN1bHQua2luZCA9IHZhbHVlLnJlYWRVSW50MzJCRSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVExWX1RZUEVTLklERU5USUZJRVI6XG4gICAgICAgIHJlc3VsdC5pZGVudGlmaWVyID0gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBTa2lwIHVua25vd24gVExWIHR5cGVzXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGkgKz0gMiArIGxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAiLyoqXG4gKiBOSVAtMjY6IERlbGVnYXRlZCBFdmVudCBTaWduaW5nXG4gKiBJbXBsZW1lbnRzIGRlbGVnYXRpb24gb2YgZXZlbnQgc2lnbmluZyBjYXBhYmlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTIuanMnO1xuaW1wb3J0IHsgTm9zdHJFdmVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHNpZ25TY2hub3JyLCB2ZXJpZnlTY2hub3JyU2lnbmF0dXJlIH0gZnJvbSAnLi4vY3J5cHRvJztcbmltcG9ydCB7IGJ5dGVzVG9IZXgsIGhleFRvQnl0ZXMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmltcG9ydCB7IHNjaG5vcnIgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZWdhdGlvbkNvbmRpdGlvbnMge1xuICBraW5kPzogbnVtYmVyO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZWdhdGlvbiB7XG4gIGRlbGVnYXRvcjogc3RyaW5nO1xuICBkZWxlZ2F0ZWU6IHN0cmluZztcbiAgY29uZGl0aW9uczogRGVsZWdhdGlvbkNvbmRpdGlvbnM7XG4gIHRva2VuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVsZWdhdGlvbiB0b2tlblxuICogQHBhcmFtIGRlbGVnYXRvclByaXZhdGVLZXkgRGVsZWdhdG9yJ3MgcHJpdmF0ZSBrZXkgKHVzZWQgZm9yIHNpZ25pbmcgb25seSwgbmV2ZXIgcmV0dXJuZWQpXG4gKiBAcGFyYW0gZGVsZWdhdGVlIERlbGVnYXRlZSdzIHB1YmxpYyBrZXlcbiAqIEBwYXJhbSBjb25kaXRpb25zIERlbGVnYXRpb24gY29uZGl0aW9uc1xuICogQHJldHVybnMgRGVsZWdhdGlvbiB0b2tlbiAoZGVsZWdhdG9yIGZpZWxkIGNvbnRhaW5zIHRoZSBQVUJMSUMga2V5LCBub3QgdGhlIHByaXZhdGUga2V5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVsZWdhdGlvbihcbiAgZGVsZWdhdG9yUHJpdmF0ZUtleTogc3RyaW5nLFxuICBkZWxlZ2F0ZWU6IHN0cmluZyxcbiAgY29uZGl0aW9uczogRGVsZWdhdGlvbkNvbmRpdGlvbnNcbik6IERlbGVnYXRpb24ge1xuICBjb25zdCBjb25kaXRpb25zU3RyaW5nID0gc2VyaWFsaXplQ29uZGl0aW9ucyhjb25kaXRpb25zKTtcbiAgY29uc3QgdG9rZW4gPSBzaWduRGVsZWdhdGlvbihkZWxlZ2F0b3JQcml2YXRlS2V5LCBkZWxlZ2F0ZWUsIGNvbmRpdGlvbnNTdHJpbmcpO1xuXG4gIC8vIERlcml2ZSB0aGUgcHVibGljIGtleSBmcm9tIHRoZSBwcml2YXRlIGtleSBcdTIwMTQgTkVWRVIgcmV0dXJuIHRoZSBwcml2YXRlIGtleVxuICBjb25zdCBkZWxlZ2F0b3JQdWJsaWNLZXkgPSBieXRlc1RvSGV4KHNjaG5vcnIuZ2V0UHVibGljS2V5KGhleFRvQnl0ZXMoZGVsZWdhdG9yUHJpdmF0ZUtleSkpKTtcblxuICByZXR1cm4ge1xuICAgIGRlbGVnYXRvcjogZGVsZWdhdG9yUHVibGljS2V5LFxuICAgIGRlbGVnYXRlZSxcbiAgICBjb25kaXRpb25zLFxuICAgIHRva2VuXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgZGVsZWdhdGlvbiB0b2tlblxuICogQHBhcmFtIGRlbGVnYXRpb24gRGVsZWdhdGlvbiB0byB2ZXJpZnlcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5RGVsZWdhdGlvbihkZWxlZ2F0aW9uOiBEZWxlZ2F0aW9uKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbmRpdGlvbnNTdHJpbmcgPSBzZXJpYWxpemVDb25kaXRpb25zKGRlbGVnYXRpb24uY29uZGl0aW9ucyk7XG4gIHJldHVybiBhd2FpdCB2ZXJpZnlEZWxlZ2F0aW9uU2lnbmF0dXJlKFxuICAgIGRlbGVnYXRpb24uZGVsZWdhdG9yLFxuICAgIGRlbGVnYXRpb24uZGVsZWdhdGVlLFxuICAgIGNvbmRpdGlvbnNTdHJpbmcsXG4gICAgZGVsZWdhdGlvbi50b2tlblxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGV2ZW50IG1lZXRzIGRlbGVnYXRpb24gY29uZGl0aW9uc1xuICogQHBhcmFtIGV2ZW50IEV2ZW50IHRvIGNoZWNrXG4gKiBAcGFyYW0gY29uZGl0aW9ucyBEZWxlZ2F0aW9uIGNvbmRpdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgaWYgY29uZGl0aW9ucyBhcmUgbWV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0RlbGVnYXRpb25Db25kaXRpb25zKFxuICBldmVudDogTm9zdHJFdmVudCxcbiAgY29uZGl0aW9uczogRGVsZWdhdGlvbkNvbmRpdGlvbnNcbik6IGJvb2xlYW4ge1xuICBpZiAoY29uZGl0aW9ucy5raW5kICE9PSB1bmRlZmluZWQgJiYgZXZlbnQua2luZCAhPT0gY29uZGl0aW9ucy5raW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNvbmRpdGlvbnMuc2luY2UgIT09IHVuZGVmaW5lZCAmJiBldmVudC5jcmVhdGVkX2F0IDwgY29uZGl0aW9ucy5zaW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjb25kaXRpb25zLnVudGlsICE9PSB1bmRlZmluZWQgJiYgZXZlbnQuY3JlYXRlZF9hdCA+IGNvbmRpdGlvbnMudW50aWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBZGQgZGVsZWdhdGlvbiB0YWcgdG8gYW4gZXZlbnRcbiAqIEBwYXJhbSBldmVudCBFdmVudCB0byBhZGQgZGVsZWdhdGlvbiB0b1xuICogQHBhcmFtIGRlbGVnYXRpb24gRGVsZWdhdGlvbiB0byBhZGRcbiAqIEByZXR1cm5zIFVwZGF0ZWQgZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERlbGVnYXRpb25UYWcoXG4gIGV2ZW50OiBOb3N0ckV2ZW50LFxuICBkZWxlZ2F0aW9uOiBEZWxlZ2F0aW9uXG4pOiBOb3N0ckV2ZW50IHtcbiAgY29uc3QgdGFnID0gW1xuICAgICdkZWxlZ2F0aW9uJyxcbiAgICBkZWxlZ2F0aW9uLmRlbGVnYXRvcixcbiAgICBzZXJpYWxpemVDb25kaXRpb25zKGRlbGVnYXRpb24uY29uZGl0aW9ucyksXG4gICAgZGVsZWdhdGlvbi50b2tlblxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgLi4uZXZlbnQsXG4gICAgdGFnczogWy4uLmV2ZW50LnRhZ3MsIHRhZ11cbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGRlbGVnYXRpb24gZnJvbSBhbiBldmVudFxuICogQHBhcmFtIGV2ZW50IEV2ZW50IHRvIGV4dHJhY3QgZGVsZWdhdGlvbiBmcm9tXG4gKiBAcmV0dXJucyBEZWxlZ2F0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVsZWdhdGlvbihldmVudDogTm9zdHJFdmVudCk6IERlbGVnYXRpb24gfCBudWxsIHtcbiAgY29uc3QgdGFnID0gZXZlbnQudGFncy5maW5kKHQgPT4gdFswXSA9PT0gJ2RlbGVnYXRpb24nKTtcbiAgaWYgKCF0YWcgfHwgdGFnLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkZWxlZ2F0b3I6IHRhZ1sxXSxcbiAgICBkZWxlZ2F0ZWU6IGV2ZW50LnB1YmtleSxcbiAgICBjb25kaXRpb25zOiBwYXJzZUNvbmRpdGlvbnModGFnWzJdKSxcbiAgICB0b2tlbjogdGFnWzNdXG4gIH07XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbnNcbmZ1bmN0aW9uIHNlcmlhbGl6ZUNvbmRpdGlvbnMoY29uZGl0aW9uczogRGVsZWdhdGlvbkNvbmRpdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29uZGl0aW9ucy5raW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJ0cy5wdXNoKGBraW5kPSR7Y29uZGl0aW9ucy5raW5kfWApO1xuICB9XG4gIGlmIChjb25kaXRpb25zLnNpbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJ0cy5wdXNoKGBjcmVhdGVkX2F0PiR7Y29uZGl0aW9ucy5zaW5jZX1gKTtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy51bnRpbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcGFydHMucHVzaChgY3JlYXRlZF9hdDwke2NvbmRpdGlvbnMudW50aWx9YCk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvbmRpdGlvbnMoY29uZGl0aW9uc1N0cmluZzogc3RyaW5nKTogRGVsZWdhdGlvbkNvbmRpdGlvbnMge1xuICBjb25zdCBjb25kaXRpb25zOiBEZWxlZ2F0aW9uQ29uZGl0aW9ucyA9IHt9O1xuICBjb25zdCBwYXJ0cyA9IGNvbmRpdGlvbnNTdHJpbmcuc3BsaXQoJyYnKTtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAocGFydC5zdGFydHNXaXRoKCdraW5kPScpKSB7XG4gICAgICBjb25kaXRpb25zLmtpbmQgPSBwYXJzZUludChwYXJ0LnNsaWNlKDUpKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQuc3RhcnRzV2l0aCgnY3JlYXRlZF9hdD4nKSkge1xuICAgICAgY29uZGl0aW9ucy5zaW5jZSA9IHBhcnNlSW50KHBhcnQuc2xpY2UoMTEpKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQuc3RhcnRzV2l0aCgnY3JlYXRlZF9hdDwnKSkge1xuICAgICAgY29uZGl0aW9ucy51bnRpbCA9IHBhcnNlSW50KHBhcnQuc2xpY2UoMTEpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuZnVuY3Rpb24gc2lnbkRlbGVnYXRpb24oXG4gIGRlbGVnYXRvcjogc3RyaW5nLFxuICBkZWxlZ2F0ZWU6IHN0cmluZyxcbiAgY29uZGl0aW9uczogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYG5vc3RyOmRlbGVnYXRpb246JHtkZWxlZ2F0ZWV9OiR7Y29uZGl0aW9uc31gO1xuICBjb25zdCBoYXNoID0gc2hhMjU2KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKSk7XG4gIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25TY2hub3JyKGhhc2gsIGhleFRvQnl0ZXMoZGVsZWdhdG9yKSk7XG4gIHJldHVybiBieXRlc1RvSGV4KHNpZ25hdHVyZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeURlbGVnYXRpb25TaWduYXR1cmUoXG4gIGRlbGVnYXRvcjogc3RyaW5nLFxuICBkZWxlZ2F0ZWU6IHN0cmluZyxcbiAgY29uZGl0aW9uczogc3RyaW5nLFxuICBzaWduYXR1cmU6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG1zZ0hhc2ggPSBzaGEyNTYobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGBub3N0cjpkZWxlZ2F0aW9uOiR7ZGVsZWdhdGVlfToke2NvbmRpdGlvbnN9YCkpO1xuXG4gIHJldHVybiB2ZXJpZnlTY2hub3JyU2lnbmF0dXJlKGhleFRvQnl0ZXMoc2lnbmF0dXJlKSwgbXNnSGFzaCwgaGV4VG9CeXRlcyhkZWxlZ2F0b3IpKTtcbn1cbiIsICIvKipcbiAqIEBtb2R1bGUgbmlwcy9uaXAtNDRcbiAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiBOSVAtNDQgKFZlcnNpb25lZCBFbmNyeXB0ZWQgUGF5bG9hZHMpXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzQ0Lm1kXG4gKi9cblxuaW1wb3J0IHsgY2hhY2hhMjAgfSBmcm9tICdAbm9ibGUvY2lwaGVycy9jaGFjaGEuanMnO1xuaW1wb3J0IHsgZXF1YWxCeXRlcyB9IGZyb20gJ0Bub2JsZS9jaXBoZXJzL3V0aWxzLmpzJztcbmltcG9ydCB7IHNlY3AyNTZrMSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvc2VjcDI1NmsxLmpzJztcbmltcG9ydCB7IGV4dHJhY3QgYXMgaGtkZl9leHRyYWN0LCBleHBhbmQgYXMgaGtkZl9leHBhbmQgfSBmcm9tICdAbm9ibGUvaGFzaGVzL2hrZGYuanMnO1xuaW1wb3J0IHsgaG1hYyB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvaG1hYy5qcyc7XG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTIuanMnO1xuaW1wb3J0IHsgY29uY2F0Qnl0ZXMsIGhleFRvQnl0ZXMsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscy5qcyc7XG5pbXBvcnQgeyBiYXNlNjQgfSBmcm9tICdAc2N1cmUvYmFzZSc7XG5cbmNvbnN0IHV0ZjhFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5jb25zdCB1dGY4RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdCBtaW5QbGFpbnRleHRTaXplID0gMTtcbmNvbnN0IG1heFBsYWludGV4dFNpemUgPSA2NTUzNTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgcGFkZGVkIGxlbmd0aCBmb3IgTklQLTQ0IG1lc3NhZ2UgcGFkZGluZ1xuICovXG5mdW5jdGlvbiBjYWxjUGFkZGVkTGVuKGxlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihsZW4pIHx8IGxlbiA8IDEpIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgcG9zaXRpdmUgaW50ZWdlcicpO1xuICBpZiAobGVuIDw9IDMyKSByZXR1cm4gMzI7XG4gIGNvbnN0IG5leHRQb3dlciA9IDEgPDwgKE1hdGguZmxvb3IoTWF0aC5sb2cyKGxlbiAtIDEpKSArIDEpO1xuICBjb25zdCBjaHVuayA9IG5leHRQb3dlciA8PSAyNTYgPyAzMiA6IG5leHRQb3dlciAvIDg7XG4gIHJldHVybiBjaHVuayAqIChNYXRoLmZsb29yKChsZW4gLSAxKSAvIGNodW5rKSArIDEpO1xufVxuXG4vKipcbiAqIFBhZCBwbGFpbnRleHQgcGVyIE5JUC00NCBzcGVjXG4gKi9cbmZ1bmN0aW9uIHBhZChwbGFpbnRleHQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB1bnBhZGRlZCA9IHV0ZjhFbmNvZGVyLmVuY29kZShwbGFpbnRleHQpO1xuICBjb25zdCB1bnBhZGRlZExlbiA9IHVucGFkZGVkLmxlbmd0aDtcbiAgaWYgKHVucGFkZGVkTGVuIDwgbWluUGxhaW50ZXh0U2l6ZSB8fCB1bnBhZGRlZExlbiA+IG1heFBsYWludGV4dFNpemUpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBsYWludGV4dCBsZW5ndGg6IG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NTUzNSBieXRlcycpO1xuICBjb25zdCBwcmVmaXggPSBuZXcgVWludDhBcnJheSgyKTtcbiAgbmV3IERhdGFWaWV3KHByZWZpeC5idWZmZXIpLnNldFVpbnQxNigwLCB1bnBhZGRlZExlbiwgZmFsc2UpOyAvLyBiaWctZW5kaWFuXG4gIGNvbnN0IHN1ZmZpeCA9IG5ldyBVaW50OEFycmF5KGNhbGNQYWRkZWRMZW4odW5wYWRkZWRMZW4pIC0gdW5wYWRkZWRMZW4pO1xuICByZXR1cm4gY29uY2F0Qnl0ZXMocHJlZml4LCB1bnBhZGRlZCwgc3VmZml4KTtcbn1cblxuLyoqXG4gKiBVbnBhZCBkZWNyeXB0ZWQgbWVzc2FnZSBwZXIgTklQLTQ0IHNwZWNcbiAqL1xuZnVuY3Rpb24gdW5wYWQocGFkZGVkOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgY29uc3QgdW5wYWRkZWRMZW4gPSBuZXcgRGF0YVZpZXcocGFkZGVkLmJ1ZmZlciwgcGFkZGVkLmJ5dGVPZmZzZXQpLmdldFVpbnQxNigwLCBmYWxzZSk7XG4gIGNvbnN0IHVucGFkZGVkID0gcGFkZGVkLnN1YmFycmF5KDIsIDIgKyB1bnBhZGRlZExlbik7XG4gIGlmIChcbiAgICB1bnBhZGRlZExlbiA8IG1pblBsYWludGV4dFNpemUgfHxcbiAgICB1bnBhZGRlZExlbiA+IG1heFBsYWludGV4dFNpemUgfHxcbiAgICB1bnBhZGRlZC5sZW5ndGggIT09IHVucGFkZGVkTGVuIHx8XG4gICAgcGFkZGVkLmxlbmd0aCAhPT0gMiArIGNhbGNQYWRkZWRMZW4odW5wYWRkZWRMZW4pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYWRkaW5nJyk7XG4gIH1cbiAgcmV0dXJuIHV0ZjhEZWNvZGVyLmRlY29kZSh1bnBhZGRlZCk7XG59XG5cbi8qKlxuICogRGVyaXZlIGNvbnZlcnNhdGlvbiBrZXkgZnJvbSBwcml2YXRlIGtleSBhbmQgcHVibGljIGtleSB1c2luZyBFQ0RIICsgSEtERlxuICovXG5mdW5jdGlvbiBnZXRDb252ZXJzYXRpb25LZXkocHJpdmtleUE6IFVpbnQ4QXJyYXksIHB1YmtleUI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBzaGFyZWRQb2ludCA9IHNlY3AyNTZrMS5nZXRTaGFyZWRTZWNyZXQocHJpdmtleUEsIGhleFRvQnl0ZXMoJzAyJyArIHB1YmtleUIpKTtcbiAgY29uc3Qgc2hhcmVkWCA9IHNoYXJlZFBvaW50LnN1YmFycmF5KDEsIDMzKTtcbiAgcmV0dXJuIGhrZGZfZXh0cmFjdChzaGEyNTYsIHNoYXJlZFgsIHV0ZjhFbmNvZGVyLmVuY29kZSgnbmlwNDQtdjInKSk7XG59XG5cbi8qKlxuICogRGVyaXZlIG1lc3NhZ2Uga2V5cyAoY2hhY2hhIGtleSwgY2hhY2hhIG5vbmNlLCBobWFjIGtleSkgZnJvbSBjb252ZXJzYXRpb24ga2V5IGFuZCBub25jZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlS2V5cyhjb252ZXJzYXRpb25LZXk6IFVpbnQ4QXJyYXksIG5vbmNlOiBVaW50OEFycmF5KToge1xuICBjaGFjaGFfa2V5OiBVaW50OEFycmF5O1xuICBjaGFjaGFfbm9uY2U6IFVpbnQ4QXJyYXk7XG4gIGhtYWNfa2V5OiBVaW50OEFycmF5O1xufSB7XG4gIGNvbnN0IGtleXMgPSBoa2RmX2V4cGFuZChzaGEyNTYsIGNvbnZlcnNhdGlvbktleSwgbm9uY2UsIDc2KTtcbiAgcmV0dXJuIHtcbiAgICBjaGFjaGFfa2V5OiBrZXlzLnN1YmFycmF5KDAsIDMyKSxcbiAgICBjaGFjaGFfbm9uY2U6IGtleXMuc3ViYXJyYXkoMzIsIDQ0KSxcbiAgICBobWFjX2tleToga2V5cy5zdWJhcnJheSg0NCwgNzYpLFxuICB9O1xufVxuXG4vKipcbiAqIEVuY3J5cHQgcGxhaW50ZXh0IHVzaW5nIE5JUC00NCB2MlxuICogQHBhcmFtIHBsYWludGV4dCAtIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHRcbiAqIEBwYXJhbSBjb252ZXJzYXRpb25LZXkgLSAzMi1ieXRlIGNvbnZlcnNhdGlvbiBrZXkgZnJvbSBnZXRDb252ZXJzYXRpb25LZXlcbiAqIEBwYXJhbSBub25jZSAtIE9wdGlvbmFsIDMyLWJ5dGUgbm9uY2UgKHJhbmRvbSBpZiBub3QgcHJvdmlkZWQpXG4gKiBAcmV0dXJucyBCYXNlNjQtZW5jb2RlZCBlbmNyeXB0ZWQgcGF5bG9hZFxuICovXG5mdW5jdGlvbiBlbmNyeXB0KHBsYWludGV4dDogc3RyaW5nLCBjb252ZXJzYXRpb25LZXk6IFVpbnQ4QXJyYXksIG5vbmNlOiBVaW50OEFycmF5ID0gcmFuZG9tQnl0ZXMoMzIpKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjaGFjaGFfa2V5LCBjaGFjaGFfbm9uY2UsIGhtYWNfa2V5IH0gPSBnZXRNZXNzYWdlS2V5cyhjb252ZXJzYXRpb25LZXksIG5vbmNlKTtcbiAgY29uc3QgcGFkZGVkID0gcGFkKHBsYWludGV4dCk7XG4gIGNvbnN0IGNpcGhlcnRleHQgPSBjaGFjaGEyMChjaGFjaGFfa2V5LCBjaGFjaGFfbm9uY2UsIHBhZGRlZCk7XG4gIGNvbnN0IG1hYyA9IGhtYWMoc2hhMjU2LCBobWFjX2tleSwgY29uY2F0Qnl0ZXMobm9uY2UsIGNpcGhlcnRleHQpKTtcbiAgcmV0dXJuIGJhc2U2NC5lbmNvZGUoY29uY2F0Qnl0ZXMobmV3IFVpbnQ4QXJyYXkoWzJdKSwgbm9uY2UsIGNpcGhlcnRleHQsIG1hYykpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSBOSVAtNDQgdjIgcGF5bG9hZFxuICogQHBhcmFtIHBheWxvYWQgLSBCYXNlNjQtZW5jb2RlZCBlbmNyeXB0ZWQgcGF5bG9hZFxuICogQHBhcmFtIGNvbnZlcnNhdGlvbktleSAtIDMyLWJ5dGUgY29udmVyc2F0aW9uIGtleSBmcm9tIGdldENvbnZlcnNhdGlvbktleVxuICogQHJldHVybnMgRGVjcnlwdGVkIHBsYWludGV4dCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZGVjcnlwdChwYXlsb2FkOiBzdHJpbmcsIGNvbnZlcnNhdGlvbktleTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGEgPSBiYXNlNjQuZGVjb2RlKHBheWxvYWQpO1xuICBjb25zdCB2ZXJzaW9uID0gZGF0YVswXTtcbiAgaWYgKHZlcnNpb24gIT09IDIpIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBlbmNyeXB0aW9uIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcbiAgaWYgKGRhdGEubGVuZ3RoIDwgOTkgfHwgZGF0YS5sZW5ndGggPiA2NTYwMykgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBheWxvYWQgc2l6ZScpO1xuICBjb25zdCBub25jZSA9IGRhdGEuc3ViYXJyYXkoMSwgMzMpO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gZGF0YS5zdWJhcnJheSgzMywgZGF0YS5sZW5ndGggLSAzMik7XG4gIGNvbnN0IG1hYyA9IGRhdGEuc3ViYXJyYXkoZGF0YS5sZW5ndGggLSAzMik7XG4gIGNvbnN0IHsgY2hhY2hhX2tleSwgY2hhY2hhX25vbmNlLCBobWFjX2tleSB9ID0gZ2V0TWVzc2FnZUtleXMoY29udmVyc2F0aW9uS2V5LCBub25jZSk7XG4gIGNvbnN0IGV4cGVjdGVkTWFjID0gaG1hYyhzaGEyNTYsIGhtYWNfa2V5LCBjb25jYXRCeXRlcyhub25jZSwgY2lwaGVydGV4dCkpO1xuICBpZiAoIWVxdWFsQnl0ZXMobWFjLCBleHBlY3RlZE1hYykpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBNQUMnKTtcbiAgY29uc3QgcGFkZGVkID0gY2hhY2hhMjAoY2hhY2hhX2tleSwgY2hhY2hhX25vbmNlLCBjaXBoZXJ0ZXh0KTtcbiAgcmV0dXJuIHVucGFkKHBhZGRlZCk7XG59XG5cbi8qKlxuICogdjIgQVBJIG9iamVjdCBtYXRjaGluZyBub3N0ci10b29scyBzaGFwZSBmb3IgY29tcGF0aWJpbGl0eVxuICovXG5leHBvcnQgY29uc3QgdjIgPSB7XG4gIHV0aWxzOiB7XG4gICAgZ2V0Q29udmVyc2F0aW9uS2V5LFxuICAgIGNhbGNQYWRkZWRMZW4sXG4gIH0sXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG59O1xuXG5leHBvcnQgeyBnZXRDb252ZXJzYXRpb25LZXksIGVuY3J5cHQsIGRlY3J5cHQsIGNhbGNQYWRkZWRMZW4gfTtcbiIsICIvKipcbiAqIENoYUNoYSBzdHJlYW0gY2lwaGVyLCByZWxlYXNlZFxuICogaW4gMjAwOC4gRGV2ZWxvcGVkIGFmdGVyIFNhbHNhMjAsIENoYUNoYSBhaW1zIHRvIGluY3JlYXNlIGRpZmZ1c2lvbiBwZXIgcm91bmQuXG4gKiBJdCB3YXMgc3RhbmRhcmRpemVkIGluIFtSRkMgODQzOV0oaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzg0MzkpIGFuZFxuICogaXMgbm93IHVzZWQgaW4gVExTIDEuMy5cbiAqXG4gKiBbWENoYUNoYTIwXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlydGYtY2ZyZy14Y2hhY2hhKVxuICogZXh0ZW5kZWQtbm9uY2UgdmFyaWFudCBpcyBhbHNvIHByb3ZpZGVkLiBTaW1pbGFyIHRvIFhTYWxzYSwgaXQncyBzYWZlIHRvIHVzZSB3aXRoXG4gKiByYW5kb21seS1nZW5lcmF0ZWQgbm9uY2VzLlxuICpcbiAqIENoZWNrIG91dCBbUERGXShodHRwOi8vY3IueXAudG8vY2hhY2hhL2NoYWNoYS0yMDA4MDEyOC5wZGYpIGFuZFxuICogW3dpa2ldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NhbHNhMjApIGFuZFxuICogW3dlYnNpdGVdKGh0dHBzOi8vY3IueXAudG8vY2hhY2hhLmh0bWwpLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgdHlwZSBYb3JQUkcsIGNyZWF0ZUNpcGhlciwgY3JlYXRlUFJHLCByb3RsIH0gZnJvbSAnLi9fYXJ4LnRzJztcbmltcG9ydCB7IHBvbHkxMzA1IH0gZnJvbSAnLi9fcG9seTEzMDUudHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBBUlhDaXBoZXIsXG4gIHR5cGUgQ2lwaGVyV2l0aE91dHB1dCxcbiAgdHlwZSBYb3JTdHJlYW0sXG4gIGFieXRlcyxcbiAgY2xlYW4sXG4gIGVxdWFsQnl0ZXMsXG4gIGdldE91dHB1dCxcbiAgdTY0TGVuZ3RocyxcbiAgd3JhcENpcGhlcixcbn0gZnJvbSAnLi91dGlscy50cyc7XG5cbi8qKlxuICogQ2hhQ2hhIGNvcmUgZnVuY3Rpb24uIEl0IGlzIGltcGxlbWVudGVkIHR3aWNlOlxuICogMS4gU2ltcGxlIGxvb3AgKGNoYWNoYUNvcmVfc21hbGwsIGhjaGFjaGFfc21hbGwpXG4gKiAyLiBVbnJvbGxlZCBsb29wIChjaGFjaGFDb3JlLCBoY2hhY2hhKSAtIDR4IGZhc3RlciwgYnV0IGxhcmdlciAmIGhhcmRlciB0byByZWFkXG4gKiBUaGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgc2VsZWN0ZWQgaW4gYGNyZWF0ZUNpcGhlcmAgYmVsb3cuXG4gKi9cblxuLyoqIHF1YXJ0ZXItcm91bmQgKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxuZnVuY3Rpb24gY2hhY2hhUVIoeDogVWludDMyQXJyYXksIGE6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcikge1xuICB4W2FdID0gKHhbYV0gKyB4W2JdKSB8IDA7IHhbZF0gPSByb3RsKHhbZF0gXiB4W2FdLCAxNik7XG4gIHhbY10gPSAoeFtjXSArIHhbZF0pIHwgMDsgeFtiXSA9IHJvdGwoeFtiXSBeIHhbY10sIDEyKTtcbiAgeFthXSA9ICh4W2FdICsgeFtiXSkgfCAwOyB4W2RdID0gcm90bCh4W2RdIF4geFthXSwgOCk7XG4gIHhbY10gPSAoeFtjXSArIHhbZF0pIHwgMDsgeFtiXSA9IHJvdGwoeFtiXSBeIHhbY10sIDcpO1xufVxuXG4vKiogc2luZ2xlIHJvdW5kICovXG5mdW5jdGlvbiBjaGFjaGFSb3VuZCh4OiBVaW50MzJBcnJheSwgcm91bmRzID0gMjApIHtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCByb3VuZHM7IHIgKz0gMikge1xuICAgIGNoYWNoYVFSKHgsIDAsIDQsIDgsIDEyKTtcbiAgICBjaGFjaGFRUih4LCAxLCA1LCA5LCAxMyk7XG4gICAgY2hhY2hhUVIoeCwgMiwgNiwgMTAsIDE0KTtcbiAgICBjaGFjaGFRUih4LCAzLCA3LCAxMSwgMTUpO1xuICAgIGNoYWNoYVFSKHgsIDAsIDUsIDEwLCAxNSk7XG4gICAgY2hhY2hhUVIoeCwgMSwgNiwgMTEsIDEyKTtcbiAgICBjaGFjaGFRUih4LCAyLCA3LCA4LCAxMyk7XG4gICAgY2hhY2hhUVIoeCwgMywgNCwgOSwgMTQpO1xuICB9XG59XG5cbmNvbnN0IGN0bXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDE2KTtcblxuLyoqIFNtYWxsIHZlcnNpb24gb2YgY2hhY2hhIHdpdGhvdXQgbG9vcCB1bnJvbGxpbmcuIFVudXNlZCwgcHJvdmlkZWQgZm9yIGF1ZGl0YWJpbGl0eS4gKi9cbi8vIHByZXR0aWVyLWlnbm9yZVxuZnVuY3Rpb24gY2hhY2hhKFxuICBzOiBVaW50MzJBcnJheSwgazogVWludDMyQXJyYXksIGk6IFVpbnQzMkFycmF5LCBvdXQ6IFVpbnQzMkFycmF5LFxuICBpc0hDaGFjaGE6IGJvb2xlYW4gPSB0cnVlLCByb3VuZHM6IG51bWJlciA9IDIwXG4pOiB2b2lkIHtcbiAgLy8gQ3JlYXRlIGluaXRpYWwgYXJyYXkgdXNpbmcgY29tbW9uIHBhdHRlcm5cbiAgY29uc3QgeSA9IFVpbnQzMkFycmF5LmZyb20oW1xuICAgIHNbMF0sIHNbMV0sIHNbMl0sIHNbM10sIC8vIFwiZXhwYVwiICAgXCJuZCAzXCIgIFwiMi1ieVwiICBcInRlIGtcIlxuICAgIGtbMF0sIGtbMV0sIGtbMl0sIGtbM10sIC8vIEtleSAgICAgIEtleSAgICAgS2V5ICAgICBLZXlcbiAgICBrWzRdLCBrWzVdLCBrWzZdLCBrWzddLCAvLyBLZXkgICAgICBLZXkgICAgIEtleSAgICAgS2V5XG4gICAgaVswXSwgaVsxXSwgaVsyXSwgaVszXSwgLy8gQ291bnRlciAgQ291bnRlciBOb25jZSAgIE5vbmNlXG4gIF0pO1xuICBjb25zdCB4ID0gY3RtcDtcbiAgeC5zZXQoeSk7XG4gIGNoYWNoYVJvdW5kKHgsIHJvdW5kcyk7XG5cbiAgLy8gaGNoYWNoYSBleHRyYWN0cyA4IHNwZWNpZmljIGJ5dGVzLCBjaGFjaGEgYWRkcyBvcmlnIHRvIHJlc3VsdFxuICBpZiAoaXNIQ2hhY2hhKSB7XG4gICAgY29uc3QgeGluZGV4ZXMgPSBbMCwgMSwgMiwgMywgMTIsIDEzLCAxNCwgMTVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSBvdXRbaV0gPSB4W3hpbmRleGVzW2ldXTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIG91dFtpXSA9ICh5W2ldICsgeFtpXSkgfCAwO1xuICB9XG59XG5cbi8qKiBJZGVudGljYWwgdG8gYGNoYWNoYUNvcmVgLiBVbnVzZWQuICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBjaGFjaGFDb3JlX3NtYWxsOiB0eXBlb2YgY2hhY2hhQ29yZSA9IChzLCBrLCBuLCBvdXQsIGNudCwgcm91bmRzKSA9PlxuICBjaGFjaGEocywgaywgVWludDMyQXJyYXkuZnJvbShbblswXSwgblsxXSwgY250LCAwXSksIG91dCwgZmFsc2UsIHJvdW5kcyk7XG4vKiogSWRlbnRpY2FsIHRvIGBoY2hhY2hhYC4gVW51c2VkLiAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgaGNoYWNoYV9zbWFsbDogdHlwZW9mIGhjaGFjaGEgPSBjaGFjaGE7XG5cbi8qKiBJZGVudGljYWwgdG8gYGNoYWNoYUNvcmVfc21hbGxgLiBVbnVzZWQuICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmZ1bmN0aW9uIGNoYWNoYUNvcmUoXG4gIHM6IFVpbnQzMkFycmF5LCBrOiBVaW50MzJBcnJheSwgbjogVWludDMyQXJyYXksIG91dDogVWludDMyQXJyYXksIGNudDogbnVtYmVyLCByb3VuZHMgPSAyMFxuKTogdm9pZCB7XG4gIGxldCB5MDAgPSBzWzBdLCB5MDEgPSBzWzFdLCB5MDIgPSBzWzJdLCB5MDMgPSBzWzNdLCAvLyBcImV4cGFcIiAgIFwibmQgM1wiICBcIjItYnlcIiAgXCJ0ZSBrXCJcbiAgICAgIHkwNCA9IGtbMF0sIHkwNSA9IGtbMV0sIHkwNiA9IGtbMl0sIHkwNyA9IGtbM10sIC8vIEtleSAgICAgIEtleSAgICAgS2V5ICAgICBLZXlcbiAgICAgIHkwOCA9IGtbNF0sIHkwOSA9IGtbNV0sIHkxMCA9IGtbNl0sIHkxMSA9IGtbN10sIC8vIEtleSAgICAgIEtleSAgICAgS2V5ICAgICBLZXlcbiAgICAgIHkxMiA9IGNudCwgIHkxMyA9IG5bMF0sIHkxNCA9IG5bMV0sIHkxNSA9IG5bMl07ICAvLyBDb3VudGVyICBDb3VudGVyXHROb25jZSAgIE5vbmNlXG4gIC8vIFNhdmUgc3RhdGUgdG8gdGVtcG9yYXJ5IHZhcmlhYmxlc1xuICBsZXQgeDAwID0geTAwLCB4MDEgPSB5MDEsIHgwMiA9IHkwMiwgeDAzID0geTAzLFxuICAgICAgeDA0ID0geTA0LCB4MDUgPSB5MDUsIHgwNiA9IHkwNiwgeDA3ID0geTA3LFxuICAgICAgeDA4ID0geTA4LCB4MDkgPSB5MDksIHgxMCA9IHkxMCwgeDExID0geTExLFxuICAgICAgeDEyID0geTEyLCB4MTMgPSB5MTMsIHgxNCA9IHkxNCwgeDE1ID0geTE1O1xuICBmb3IgKGxldCByID0gMDsgciA8IHJvdW5kczsgciArPSAyKSB7XG4gICAgeDAwID0gKHgwMCArIHgwNCkgfCAwOyB4MTIgPSByb3RsKHgxMiBeIHgwMCwgMTYpO1xuICAgIHgwOCA9ICh4MDggKyB4MTIpIHwgMDsgeDA0ID0gcm90bCh4MDQgXiB4MDgsIDEyKTtcbiAgICB4MDAgPSAoeDAwICsgeDA0KSB8IDA7IHgxMiA9IHJvdGwoeDEyIF4geDAwLCA4KTtcbiAgICB4MDggPSAoeDA4ICsgeDEyKSB8IDA7IHgwNCA9IHJvdGwoeDA0IF4geDA4LCA3KTtcblxuICAgIHgwMSA9ICh4MDEgKyB4MDUpIHwgMDsgeDEzID0gcm90bCh4MTMgXiB4MDEsIDE2KTtcbiAgICB4MDkgPSAoeDA5ICsgeDEzKSB8IDA7IHgwNSA9IHJvdGwoeDA1IF4geDA5LCAxMik7XG4gICAgeDAxID0gKHgwMSArIHgwNSkgfCAwOyB4MTMgPSByb3RsKHgxMyBeIHgwMSwgOCk7XG4gICAgeDA5ID0gKHgwOSArIHgxMykgfCAwOyB4MDUgPSByb3RsKHgwNSBeIHgwOSwgNyk7XG5cbiAgICB4MDIgPSAoeDAyICsgeDA2KSB8IDA7IHgxNCA9IHJvdGwoeDE0IF4geDAyLCAxNik7XG4gICAgeDEwID0gKHgxMCArIHgxNCkgfCAwOyB4MDYgPSByb3RsKHgwNiBeIHgxMCwgMTIpO1xuICAgIHgwMiA9ICh4MDIgKyB4MDYpIHwgMDsgeDE0ID0gcm90bCh4MTQgXiB4MDIsIDgpO1xuICAgIHgxMCA9ICh4MTAgKyB4MTQpIHwgMDsgeDA2ID0gcm90bCh4MDYgXiB4MTAsIDcpO1xuXG4gICAgeDAzID0gKHgwMyArIHgwNykgfCAwOyB4MTUgPSByb3RsKHgxNSBeIHgwMywgMTYpO1xuICAgIHgxMSA9ICh4MTEgKyB4MTUpIHwgMDsgeDA3ID0gcm90bCh4MDcgXiB4MTEsIDEyKTtcbiAgICB4MDMgPSAoeDAzICsgeDA3KSB8IDA7IHgxNSA9IHJvdGwoeDE1IF4geDAzLCA4KVxuICAgIHgxMSA9ICh4MTEgKyB4MTUpIHwgMDsgeDA3ID0gcm90bCh4MDcgXiB4MTEsIDcpO1xuXG4gICAgeDAwID0gKHgwMCArIHgwNSkgfCAwOyB4MTUgPSByb3RsKHgxNSBeIHgwMCwgMTYpO1xuICAgIHgxMCA9ICh4MTAgKyB4MTUpIHwgMDsgeDA1ID0gcm90bCh4MDUgXiB4MTAsIDEyKTtcbiAgICB4MDAgPSAoeDAwICsgeDA1KSB8IDA7IHgxNSA9IHJvdGwoeDE1IF4geDAwLCA4KTtcbiAgICB4MTAgPSAoeDEwICsgeDE1KSB8IDA7IHgwNSA9IHJvdGwoeDA1IF4geDEwLCA3KTtcblxuICAgIHgwMSA9ICh4MDEgKyB4MDYpIHwgMDsgeDEyID0gcm90bCh4MTIgXiB4MDEsIDE2KTtcbiAgICB4MTEgPSAoeDExICsgeDEyKSB8IDA7IHgwNiA9IHJvdGwoeDA2IF4geDExLCAxMik7XG4gICAgeDAxID0gKHgwMSArIHgwNikgfCAwOyB4MTIgPSByb3RsKHgxMiBeIHgwMSwgOCk7XG4gICAgeDExID0gKHgxMSArIHgxMikgfCAwOyB4MDYgPSByb3RsKHgwNiBeIHgxMSwgNyk7XG5cbiAgICB4MDIgPSAoeDAyICsgeDA3KSB8IDA7IHgxMyA9IHJvdGwoeDEzIF4geDAyLCAxNik7XG4gICAgeDA4ID0gKHgwOCArIHgxMykgfCAwOyB4MDcgPSByb3RsKHgwNyBeIHgwOCwgMTIpO1xuICAgIHgwMiA9ICh4MDIgKyB4MDcpIHwgMDsgeDEzID0gcm90bCh4MTMgXiB4MDIsIDgpO1xuICAgIHgwOCA9ICh4MDggKyB4MTMpIHwgMDsgeDA3ID0gcm90bCh4MDcgXiB4MDgsIDcpO1xuXG4gICAgeDAzID0gKHgwMyArIHgwNCkgfCAwOyB4MTQgPSByb3RsKHgxNCBeIHgwMywgMTYpXG4gICAgeDA5ID0gKHgwOSArIHgxNCkgfCAwOyB4MDQgPSByb3RsKHgwNCBeIHgwOSwgMTIpO1xuICAgIHgwMyA9ICh4MDMgKyB4MDQpIHwgMDsgeDE0ID0gcm90bCh4MTQgXiB4MDMsIDgpO1xuICAgIHgwOSA9ICh4MDkgKyB4MTQpIHwgMDsgeDA0ID0gcm90bCh4MDQgXiB4MDksIDcpO1xuICB9XG4gIC8vIFdyaXRlIG91dHB1dFxuICBsZXQgb2kgPSAwO1xuICBvdXRbb2krK10gPSAoeTAwICsgeDAwKSB8IDA7IG91dFtvaSsrXSA9ICh5MDEgKyB4MDEpIHwgMDtcbiAgb3V0W29pKytdID0gKHkwMiArIHgwMikgfCAwOyBvdXRbb2krK10gPSAoeTAzICsgeDAzKSB8IDA7XG4gIG91dFtvaSsrXSA9ICh5MDQgKyB4MDQpIHwgMDsgb3V0W29pKytdID0gKHkwNSArIHgwNSkgfCAwO1xuICBvdXRbb2krK10gPSAoeTA2ICsgeDA2KSB8IDA7IG91dFtvaSsrXSA9ICh5MDcgKyB4MDcpIHwgMDtcbiAgb3V0W29pKytdID0gKHkwOCArIHgwOCkgfCAwOyBvdXRbb2krK10gPSAoeTA5ICsgeDA5KSB8IDA7XG4gIG91dFtvaSsrXSA9ICh5MTAgKyB4MTApIHwgMDsgb3V0W29pKytdID0gKHkxMSArIHgxMSkgfCAwO1xuICBvdXRbb2krK10gPSAoeTEyICsgeDEyKSB8IDA7IG91dFtvaSsrXSA9ICh5MTMgKyB4MTMpIHwgMDtcbiAgb3V0W29pKytdID0gKHkxNCArIHgxNCkgfCAwOyBvdXRbb2krK10gPSAoeTE1ICsgeDE1KSB8IDA7XG59XG4vKipcbiAqIGhjaGFjaGEgaGFzaGVzIGtleSBhbmQgbm9uY2UgaW50byBrZXknIGFuZCBub25jZScgZm9yIHhjaGFjaGEyMC5cbiAqIElkZW50aWNhbCB0byBgaGNoYWNoYV9zbWFsbGAuXG4gKiBOZWVkIHRvIGZpbmQgYSB3YXkgdG8gbWVyZ2UgaXQgd2l0aCBgY2hhY2hhQ29yZWAgd2l0aG91dCAyNSUgcGVyZm9ybWFuY2UgaGl0LlxuICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCBmdW5jdGlvbiBoY2hhY2hhKFxuICBzOiBVaW50MzJBcnJheSwgazogVWludDMyQXJyYXksIGk6IFVpbnQzMkFycmF5LCBvdXQ6IFVpbnQzMkFycmF5XG4pOiB2b2lkIHtcbiAgbGV0IHgwMCA9IHNbMF0sIHgwMSA9IHNbMV0sIHgwMiA9IHNbMl0sIHgwMyA9IHNbM10sXG4gICAgICB4MDQgPSBrWzBdLCB4MDUgPSBrWzFdLCB4MDYgPSBrWzJdLCB4MDcgPSBrWzNdLFxuICAgICAgeDA4ID0ga1s0XSwgeDA5ID0ga1s1XSwgeDEwID0ga1s2XSwgeDExID0ga1s3XSxcbiAgICAgIHgxMiA9IGlbMF0sIHgxMyA9IGlbMV0sIHgxNCA9IGlbMl0sIHgxNSA9IGlbM107XG4gIGZvciAobGV0IHIgPSAwOyByIDwgMjA7IHIgKz0gMikge1xuICAgIHgwMCA9ICh4MDAgKyB4MDQpIHwgMDsgeDEyID0gcm90bCh4MTIgXiB4MDAsIDE2KTtcbiAgICB4MDggPSAoeDA4ICsgeDEyKSB8IDA7IHgwNCA9IHJvdGwoeDA0IF4geDA4LCAxMik7XG4gICAgeDAwID0gKHgwMCArIHgwNCkgfCAwOyB4MTIgPSByb3RsKHgxMiBeIHgwMCwgOCk7XG4gICAgeDA4ID0gKHgwOCArIHgxMikgfCAwOyB4MDQgPSByb3RsKHgwNCBeIHgwOCwgNyk7XG5cbiAgICB4MDEgPSAoeDAxICsgeDA1KSB8IDA7IHgxMyA9IHJvdGwoeDEzIF4geDAxLCAxNik7XG4gICAgeDA5ID0gKHgwOSArIHgxMykgfCAwOyB4MDUgPSByb3RsKHgwNSBeIHgwOSwgMTIpO1xuICAgIHgwMSA9ICh4MDEgKyB4MDUpIHwgMDsgeDEzID0gcm90bCh4MTMgXiB4MDEsIDgpO1xuICAgIHgwOSA9ICh4MDkgKyB4MTMpIHwgMDsgeDA1ID0gcm90bCh4MDUgXiB4MDksIDcpO1xuXG4gICAgeDAyID0gKHgwMiArIHgwNikgfCAwOyB4MTQgPSByb3RsKHgxNCBeIHgwMiwgMTYpO1xuICAgIHgxMCA9ICh4MTAgKyB4MTQpIHwgMDsgeDA2ID0gcm90bCh4MDYgXiB4MTAsIDEyKTtcbiAgICB4MDIgPSAoeDAyICsgeDA2KSB8IDA7IHgxNCA9IHJvdGwoeDE0IF4geDAyLCA4KTtcbiAgICB4MTAgPSAoeDEwICsgeDE0KSB8IDA7IHgwNiA9IHJvdGwoeDA2IF4geDEwLCA3KTtcblxuICAgIHgwMyA9ICh4MDMgKyB4MDcpIHwgMDsgeDE1ID0gcm90bCh4MTUgXiB4MDMsIDE2KTtcbiAgICB4MTEgPSAoeDExICsgeDE1KSB8IDA7IHgwNyA9IHJvdGwoeDA3IF4geDExLCAxMik7XG4gICAgeDAzID0gKHgwMyArIHgwNykgfCAwOyB4MTUgPSByb3RsKHgxNSBeIHgwMywgOClcbiAgICB4MTEgPSAoeDExICsgeDE1KSB8IDA7IHgwNyA9IHJvdGwoeDA3IF4geDExLCA3KTtcblxuICAgIHgwMCA9ICh4MDAgKyB4MDUpIHwgMDsgeDE1ID0gcm90bCh4MTUgXiB4MDAsIDE2KTtcbiAgICB4MTAgPSAoeDEwICsgeDE1KSB8IDA7IHgwNSA9IHJvdGwoeDA1IF4geDEwLCAxMik7XG4gICAgeDAwID0gKHgwMCArIHgwNSkgfCAwOyB4MTUgPSByb3RsKHgxNSBeIHgwMCwgOCk7XG4gICAgeDEwID0gKHgxMCArIHgxNSkgfCAwOyB4MDUgPSByb3RsKHgwNSBeIHgxMCwgNyk7XG5cbiAgICB4MDEgPSAoeDAxICsgeDA2KSB8IDA7IHgxMiA9IHJvdGwoeDEyIF4geDAxLCAxNik7XG4gICAgeDExID0gKHgxMSArIHgxMikgfCAwOyB4MDYgPSByb3RsKHgwNiBeIHgxMSwgMTIpO1xuICAgIHgwMSA9ICh4MDEgKyB4MDYpIHwgMDsgeDEyID0gcm90bCh4MTIgXiB4MDEsIDgpO1xuICAgIHgxMSA9ICh4MTEgKyB4MTIpIHwgMDsgeDA2ID0gcm90bCh4MDYgXiB4MTEsIDcpO1xuXG4gICAgeDAyID0gKHgwMiArIHgwNykgfCAwOyB4MTMgPSByb3RsKHgxMyBeIHgwMiwgMTYpO1xuICAgIHgwOCA9ICh4MDggKyB4MTMpIHwgMDsgeDA3ID0gcm90bCh4MDcgXiB4MDgsIDEyKTtcbiAgICB4MDIgPSAoeDAyICsgeDA3KSB8IDA7IHgxMyA9IHJvdGwoeDEzIF4geDAyLCA4KTtcbiAgICB4MDggPSAoeDA4ICsgeDEzKSB8IDA7IHgwNyA9IHJvdGwoeDA3IF4geDA4LCA3KTtcblxuICAgIHgwMyA9ICh4MDMgKyB4MDQpIHwgMDsgeDE0ID0gcm90bCh4MTQgXiB4MDMsIDE2KVxuICAgIHgwOSA9ICh4MDkgKyB4MTQpIHwgMDsgeDA0ID0gcm90bCh4MDQgXiB4MDksIDEyKTtcbiAgICB4MDMgPSAoeDAzICsgeDA0KSB8IDA7IHgxNCA9IHJvdGwoeDE0IF4geDAzLCA4KTtcbiAgICB4MDkgPSAoeDA5ICsgeDE0KSB8IDA7IHgwNCA9IHJvdGwoeDA0IF4geDA5LCA3KTtcbiAgfVxuICBsZXQgb2kgPSAwO1xuICBvdXRbb2krK10gPSB4MDA7IG91dFtvaSsrXSA9IHgwMTtcbiAgb3V0W29pKytdID0geDAyOyBvdXRbb2krK10gPSB4MDM7XG4gIG91dFtvaSsrXSA9IHgxMjsgb3V0W29pKytdID0geDEzO1xuICBvdXRbb2krK10gPSB4MTQ7IG91dFtvaSsrXSA9IHgxNTtcbn1cblxuLyoqIE9yaWdpbmFsLCBub24tUkZDIGNoYWNoYTIwIGZyb20gREpCLiA4LWJ5dGUgbm9uY2UsIDgtYnl0ZSBjb3VudGVyLiAqL1xuZXhwb3J0IGNvbnN0IGNoYWNoYTIwb3JpZzogWG9yU3RyZWFtID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUNpcGhlcihjaGFjaGFDb3JlLCB7XG4gIGNvdW50ZXJSaWdodDogZmFsc2UsXG4gIGNvdW50ZXJMZW5ndGg6IDgsXG4gIGFsbG93U2hvcnRLZXlzOiB0cnVlLFxufSk7XG4vKipcbiAqIENoYUNoYSBzdHJlYW0gY2lwaGVyLiBDb25mb3JtcyB0byBSRkMgODQzOSAoSUVURiwgVExTKS4gMTItYnl0ZSBub25jZSwgNC1ieXRlIGNvdW50ZXIuXG4gKiBXaXRoIHNtYWxsZXIgbm9uY2UsIGl0J3Mgbm90IHNhZmUgdG8gbWFrZSBpdCByYW5kb20gKENTUFJORyksIGR1ZSB0byBjb2xsaXNpb24gY2hhbmNlLlxuICovXG5leHBvcnQgY29uc3QgY2hhY2hhMjA6IFhvclN0cmVhbSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVDaXBoZXIoY2hhY2hhQ29yZSwge1xuICBjb3VudGVyUmlnaHQ6IGZhbHNlLFxuICBjb3VudGVyTGVuZ3RoOiA0LFxuICBhbGxvd1Nob3J0S2V5czogZmFsc2UsXG59KTtcblxuLyoqXG4gKiBYQ2hhQ2hhIGVYdGVuZGVkLW5vbmNlIENoYUNoYS4gV2l0aCAyNC1ieXRlIG5vbmNlLCBpdCdzIHNhZmUgdG8gbWFrZSBpdCByYW5kb20gKENTUFJORykuXG4gKiBTZWUgW0lSVEYgZHJhZnRdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaXJ0Zi1jZnJnLXhjaGFjaGEpLlxuICovXG5leHBvcnQgY29uc3QgeGNoYWNoYTIwOiBYb3JTdHJlYW0gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlQ2lwaGVyKGNoYWNoYUNvcmUsIHtcbiAgY291bnRlclJpZ2h0OiBmYWxzZSxcbiAgY291bnRlckxlbmd0aDogOCxcbiAgZXh0ZW5kTm9uY2VGbjogaGNoYWNoYSxcbiAgYWxsb3dTaG9ydEtleXM6IGZhbHNlLFxufSk7XG5cbi8qKiBSZWR1Y2VkIDgtcm91bmQgY2hhY2hhLCBkZXNjcmliZWQgaW4gb3JpZ2luYWwgcGFwZXIuICovXG5leHBvcnQgY29uc3QgY2hhY2hhODogWG9yU3RyZWFtID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUNpcGhlcihjaGFjaGFDb3JlLCB7XG4gIGNvdW50ZXJSaWdodDogZmFsc2UsXG4gIGNvdW50ZXJMZW5ndGg6IDQsXG4gIHJvdW5kczogOCxcbn0pO1xuXG4vKiogUmVkdWNlZCAxMi1yb3VuZCBjaGFjaGEsIGRlc2NyaWJlZCBpbiBvcmlnaW5hbCBwYXBlci4gKi9cbmV4cG9ydCBjb25zdCBjaGFjaGExMjogWG9yU3RyZWFtID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUNpcGhlcihjaGFjaGFDb3JlLCB7XG4gIGNvdW50ZXJSaWdodDogZmFsc2UsXG4gIGNvdW50ZXJMZW5ndGg6IDQsXG4gIHJvdW5kczogMTIsXG59KTtcblxuY29uc3QgWkVST1MxNiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVWludDhBcnJheSgxNik7XG4vLyBQYWQgdG8gZGlnZXN0IHNpemUgd2l0aCB6ZXJvc1xuY29uc3QgdXBkYXRlUGFkZGVkID0gKGg6IFJldHVyblR5cGU8dHlwZW9mIHBvbHkxMzA1LmNyZWF0ZT4sIG1zZzogVWludDhBcnJheSkgPT4ge1xuICBoLnVwZGF0ZShtc2cpO1xuICBjb25zdCBsZWZ0b3ZlciA9IG1zZy5sZW5ndGggJSAxNjtcbiAgaWYgKGxlZnRvdmVyKSBoLnVwZGF0ZShaRVJPUzE2LnN1YmFycmF5KGxlZnRvdmVyKSk7XG59O1xuXG5jb25zdCBaRVJPUzMyID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50OEFycmF5KDMyKTtcbmZ1bmN0aW9uIGNvbXB1dGVUYWcoXG4gIGZuOiBYb3JTdHJlYW0sXG4gIGtleTogVWludDhBcnJheSxcbiAgbm9uY2U6IFVpbnQ4QXJyYXksXG4gIGNpcGhlcnRleHQ6IFVpbnQ4QXJyYXksXG4gIEFBRD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBpZiAoQUFEICE9PSB1bmRlZmluZWQpIGFieXRlcyhBQUQsIHVuZGVmaW5lZCwgJ0FBRCcpO1xuICBjb25zdCBhdXRoS2V5ID0gZm4oa2V5LCBub25jZSwgWkVST1MzMik7XG4gIGNvbnN0IGxlbmd0aHMgPSB1NjRMZW5ndGhzKGNpcGhlcnRleHQubGVuZ3RoLCBBQUQgPyBBQUQubGVuZ3RoIDogMCwgdHJ1ZSk7XG5cbiAgLy8gTWV0aG9kcyBiZWxvdyBjYW4gYmUgcmVwbGFjZWQgd2l0aFxuICAvLyByZXR1cm4gcG9seTEzMDVfY29tcHV0ZVRhZ19zbWFsbChhdXRoS2V5LCBsZW5ndGhzLCBjaXBoZXJ0ZXh0LCBBQUQpXG4gIGNvbnN0IGggPSBwb2x5MTMwNS5jcmVhdGUoYXV0aEtleSk7XG4gIGlmIChBQUQpIHVwZGF0ZVBhZGRlZChoLCBBQUQpO1xuICB1cGRhdGVQYWRkZWQoaCwgY2lwaGVydGV4dCk7XG4gIGgudXBkYXRlKGxlbmd0aHMpO1xuICBjb25zdCByZXMgPSBoLmRpZ2VzdCgpO1xuICBjbGVhbihhdXRoS2V5LCBsZW5ndGhzKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLyoqXG4gKiBBRUFEIGFsZ29yaXRobSBmcm9tIFJGQyA4NDM5LlxuICogU2Fsc2EyMCBhbmQgY2hhY2hhIChSRkMgODQzOSkgdXNlIHBvbHkxMzA1IGRpZmZlcmVudGx5LlxuICogV2UgY291bGQgaGF2ZSBjb21wb3NlZCB0aGVtLCBidXQgaXQncyBoYXJkIGJlY2F1c2Ugb2YgYXV0aEtleTpcbiAqIEluIHNhbHNhMjAsIGF1dGhLZXkgY2hhbmdlcyBwb3NpdGlvbiBpbiBzYWxzYSBzdHJlYW0uXG4gKiBJbiBjaGFjaGEsIGF1dGhLZXkgY2FuJ3QgYmUgY29tcHV0ZWQgaW5zaWRlIGNvbXB1dGVUYWcsIGl0IG1vZGlmaWVzIHRoZSBjb3VudGVyLlxuICovXG5leHBvcnQgY29uc3QgX3BvbHkxMzA1X2FlYWQgPVxuICAoeG9yU3RyZWFtOiBYb3JTdHJlYW0pID0+XG4gIChrZXk6IFVpbnQ4QXJyYXksIG5vbmNlOiBVaW50OEFycmF5LCBBQUQ/OiBVaW50OEFycmF5KTogQ2lwaGVyV2l0aE91dHB1dCA9PiB7XG4gICAgY29uc3QgdGFnTGVuZ3RoID0gMTY7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuY3J5cHQocGxhaW50ZXh0OiBVaW50OEFycmF5LCBvdXRwdXQ/OiBVaW50OEFycmF5KSB7XG4gICAgICAgIGNvbnN0IHBsZW5ndGggPSBwbGFpbnRleHQubGVuZ3RoO1xuICAgICAgICBvdXRwdXQgPSBnZXRPdXRwdXQocGxlbmd0aCArIHRhZ0xlbmd0aCwgb3V0cHV0LCBmYWxzZSk7XG4gICAgICAgIG91dHB1dC5zZXQocGxhaW50ZXh0KTtcbiAgICAgICAgY29uc3Qgb1BsYWluID0gb3V0cHV0LnN1YmFycmF5KDAsIC10YWdMZW5ndGgpO1xuICAgICAgICAvLyBBY3R1YWwgZW5jcnlwdGlvblxuICAgICAgICB4b3JTdHJlYW0oa2V5LCBub25jZSwgb1BsYWluLCBvUGxhaW4sIDEpO1xuICAgICAgICBjb25zdCB0YWcgPSBjb21wdXRlVGFnKHhvclN0cmVhbSwga2V5LCBub25jZSwgb1BsYWluLCBBQUQpO1xuICAgICAgICBvdXRwdXQuc2V0KHRhZywgcGxlbmd0aCk7IC8vIGFwcGVuZCB0YWdcbiAgICAgICAgY2xlYW4odGFnKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH0sXG4gICAgICBkZWNyeXB0KGNpcGhlcnRleHQ6IFVpbnQ4QXJyYXksIG91dHB1dD86IFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgb3V0cHV0ID0gZ2V0T3V0cHV0KGNpcGhlcnRleHQubGVuZ3RoIC0gdGFnTGVuZ3RoLCBvdXRwdXQsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNpcGhlcnRleHQuc3ViYXJyYXkoMCwgLXRhZ0xlbmd0aCk7XG4gICAgICAgIGNvbnN0IHBhc3NlZFRhZyA9IGNpcGhlcnRleHQuc3ViYXJyYXkoLXRhZ0xlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRhZyA9IGNvbXB1dGVUYWcoeG9yU3RyZWFtLCBrZXksIG5vbmNlLCBkYXRhLCBBQUQpO1xuICAgICAgICBpZiAoIWVxdWFsQnl0ZXMocGFzc2VkVGFnLCB0YWcpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFnJyk7XG4gICAgICAgIG91dHB1dC5zZXQoY2lwaGVydGV4dC5zdWJhcnJheSgwLCAtdGFnTGVuZ3RoKSk7XG4gICAgICAgIC8vIEFjdHVhbCBkZWNyeXB0aW9uXG4gICAgICAgIHhvclN0cmVhbShrZXksIG5vbmNlLCBvdXRwdXQsIG91dHB1dCwgMSk7IC8vIHN0YXJ0IHN0cmVhbSB3aXRoIGk9MVxuICAgICAgICBjbGVhbih0YWcpO1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIENoYUNoYTIwLVBvbHkxMzA1IGZyb20gUkZDIDg0MzkuXG4gKlxuICogVW5zYWZlIHRvIHVzZSByYW5kb20gbm9uY2VzIHVuZGVyIHRoZSBzYW1lIGtleSwgZHVlIHRvIGNvbGxpc2lvbiBjaGFuY2UuXG4gKiBQcmVmZXIgWENoYUNoYSBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgY2hhY2hhMjBwb2x5MTMwNTogQVJYQ2lwaGVyID0gLyogQF9fUFVSRV9fICovIHdyYXBDaXBoZXIoXG4gIHsgYmxvY2tTaXplOiA2NCwgbm9uY2VMZW5ndGg6IDEyLCB0YWdMZW5ndGg6IDE2IH0sXG4gIF9wb2x5MTMwNV9hZWFkKGNoYWNoYTIwKVxuKTtcbi8qKlxuICogWENoYUNoYTIwLVBvbHkxMzA1IGV4dGVuZGVkLW5vbmNlIGNoYWNoYS5cbiAqXG4gKiBDYW4gYmUgc2FmZWx5IHVzZWQgd2l0aCByYW5kb20gbm9uY2VzIChDU1BSTkcpLlxuICogU2VlIFtJUlRGIGRyYWZ0XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlydGYtY2ZyZy14Y2hhY2hhKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHhjaGFjaGEyMHBvbHkxMzA1OiBBUlhDaXBoZXIgPSAvKiBAX19QVVJFX18gKi8gd3JhcENpcGhlcihcbiAgeyBibG9ja1NpemU6IDY0LCBub25jZUxlbmd0aDogMjQsIHRhZ0xlbmd0aDogMTYgfSxcbiAgX3BvbHkxMzA1X2FlYWQoeGNoYWNoYTIwKVxuKTtcblxuLyoqXG4gKiBDaGFjaGEyMCBDU1BSTkcgKGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvcikuXG4gKiBJdCdzIGJlc3QgdG8gbGltaXQgdXNhZ2UgdG8gbm9uLXByb2R1Y3Rpb24sIG5vbi1jcml0aWNhbCBjYXNlczogZm9yIGV4YW1wbGUsIHRlc3Qtb25seS5cbiAqIENvbXBhdGlibGUgd2l0aCBsaWJ0b21jcnlwdC4gSXQgZG9lcyBub3QgaGF2ZSBhIHNwZWNpZmljYXRpb24sIHNvIHVuY2xlYXIgaG93IHNlY3VyZSBpdCBpcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHJuZ0NoYWNoYTIwOiBYb3JQUkcgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlUFJHKGNoYWNoYTIwb3JpZywgNjQsIDMyLCA4KTtcbi8qKlxuICogQ2hhY2hhMjAvOCBDU1BSTkcgKGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvcikuXG4gKiBJdCdzIGJlc3QgdG8gbGltaXQgdXNhZ2UgdG8gbm9uLXByb2R1Y3Rpb24sIG5vbi1jcml0aWNhbCBjYXNlczogZm9yIGV4YW1wbGUsIHRlc3Qtb25seS5cbiAqIEZhc3RlciB0aGFuIGBybmdDaGFjaGEyMGAuXG4gKi9cbmV4cG9ydCBjb25zdCBybmdDaGFjaGE4OiBYb3JQUkcgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlUFJHKGNoYWNoYTgsIDY0LCAzMiwgMTIpO1xuIiwgIi8qKlxuICogQmFzaWMgdXRpbHMgZm9yIEFSWCAoYWRkLXJvdGF0ZS14b3IpIHNhbHNhIGFuZCBjaGFjaGEgY2lwaGVycy5cblxuUkZDODQzOSByZXF1aXJlcyBtdWx0aS1zdGVwIGNpcGhlciBzdHJlYW0sIHdoZXJlXG5hdXRoS2V5IHN0YXJ0cyB3aXRoIGNvdW50ZXI6IDAsIGFjdHVhbCBtc2cgd2l0aCBjb3VudGVyOiAxLlxuXG5Gb3IgdGhpcywgd2UgbmVlZCBhIHdheSB0byByZS11c2Ugbm9uY2UgLyBjb3VudGVyOlxuXG4gICAgY29uc3QgY291bnRlciA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgIGNoYWNoYSguLi4sIGNvdW50ZXIsIC4uLik7IC8vIGNvdW50ZXIgaXMgbm93IDFcbiAgICBjaGFjaGEoLi4uLCBjb3VudGVyLCAuLi4pOyAvLyBjb3VudGVyIGlzIG5vdyAyXG5cblRoaXMgaXMgY29tcGxpY2F0ZWQ6XG5cbi0gMzItYml0IGNvdW50ZXJzIGFyZSBlbm91Z2gsIG5vIG5lZWQgZm9yIDY0LWJpdDogbWF4IEFycmF5QnVmZmVyIHNpemUgaW4gSlMgaXMgNEdCXG4tIE9yaWdpbmFsIHBhcGVycyBkb24ndCBhbGxvdyBtdXRhdGluZyBjb3VudGVyc1xuLSBDb3VudGVyIG92ZXJmbG93IGlzIHVuZGVmaW5lZCBbXjFdXG4tIElkZWEgQTogYWxsb3cgcHJvdmlkaW5nIChub25jZSB8IGNvdW50ZXIpIGluc3RlYWQgb2YganVzdCBub25jZSwgcmUtdXNlIGl0XG4tIENhdmVhdDogQ2Fubm90IGJlIHJlLXVzZWQgdGhyb3VnaCBhbGwgY2FzZXM6XG4tICogY2hhY2hhIGhhcyAoY291bnRlciB8IG5vbmNlKVxuLSAqIHhjaGFjaGEgaGFzIChub25jZTE2IHwgY291bnRlciB8IG5vbmNlMTYpXG4tIElkZWEgQjogc2VwYXJhdGUgbm9uY2UgLyBjb3VudGVyIGFuZCBwcm92aWRlIHNlcGFyYXRlIEFQSSBmb3IgY291bnRlciByZS11c2Vcbi0gQ2F2ZWF0OiB0aGVyZSBhcmUgZGlmZmVyZW50IGNvdW50ZXIgc2l6ZXMgZGVwZW5kaW5nIG9uIGFuIGFsZ29yaXRobS5cbi0gc2Fsc2EgJiBjaGFjaGEgYWxzbyBkaWZmZXIgaW4gc3RydWN0dXJlcyBvZiBrZXkgJiBzaWdtYTpcbiAgc2Fsc2EyMDogICAgICBzWzBdIHwgayg0KSB8IHNbMV0gfCBub25jZSgyKSB8IGNudCgyKSB8IHNbMl0gfCBrKDQpIHwgc1szXVxuICBjaGFjaGE6ICAgICAgIHMoNCkgfCBrKDgpIHwgY250KDEpIHwgbm9uY2UoMylcbiAgY2hhY2hhMjBvcmlnOiBzKDQpIHwgayg4KSB8IGNudCgyKSB8IG5vbmNlKDIpXG4tIElkZWEgQzogaGVscGVyIG1ldGhvZCBzdWNoIGFzIGBzZXRTYWxzYVN0YXRlKGtleSwgbm9uY2UsIHNpZ21hLCBkYXRhKWBcbi0gQ2F2ZWF0OiB3ZSBjYW4ndCByZS11c2UgY291bnRlciBhcnJheVxuXG54Y2hhY2hhIFteMl0gdXNlcyB0aGUgc3Via2V5IGFuZCByZW1haW5pbmcgOCBieXRlIG5vbmNlIHdpdGggQ2hhQ2hhMjAgYXMgbm9ybWFsXG4ocHJlZml4ZWQgYnkgNCBOVUwgYnl0ZXMsIHNpbmNlIFtSRkM4NDM5XSBzcGVjaWZpZXMgYSAxMi1ieXRlIG5vbmNlKS5cblxuW14xXTogaHR0cHM6Ly9tYWlsYXJjaGl2ZS5pZXRmLm9yZy9hcmNoL21zZy9jZnJnL2dzT25USnpjYmdHNk9xRDhTYzBHTzVhUl90VS9cblteMl06IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaXJ0Zi1jZnJnLXhjaGFjaGEjYXBwZW5kaXgtQS4yXG5cbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgdHlwZSBQUkcsXG4gIHR5cGUgWG9yU3RyZWFtLFxuICBhYm9vbCxcbiAgYWJ5dGVzLFxuICBhbnVtYmVyLFxuICBjaGVja09wdHMsXG4gIGNsZWFuLFxuICBjb3B5Qnl0ZXMsXG4gIHJhbmRvbUJ5dGVzLFxuICB1MzIsXG59IGZyb20gJy4vdXRpbHMudHMnO1xuXG4vLyBSZXBsYWNlcyBgVGV4dEVuY29kZXJgLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBlbnZpcm9ubWVudHNcbmNvbnN0IGVuY29kZVN0ciA9IChzdHI6IHN0cmluZykgPT4gVWludDhBcnJheS5mcm9tKHN0ci5zcGxpdCgnJyksIChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuY29uc3Qgc2lnbWExNiA9IGVuY29kZVN0cignZXhwYW5kIDE2LWJ5dGUgaycpO1xuY29uc3Qgc2lnbWEzMiA9IGVuY29kZVN0cignZXhwYW5kIDMyLWJ5dGUgaycpO1xuY29uc3Qgc2lnbWExNl8zMiA9IHUzMihzaWdtYTE2KTtcbmNvbnN0IHNpZ21hMzJfMzIgPSB1MzIoc2lnbWEzMik7XG5cbi8qKiBSb3RhdGUgbGVmdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RsKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChhIDw8IGIpIHwgKGEgPj4+ICgzMiAtIGIpKTtcbn1cblxuLyoqIENpcGhlcnMgbXVzdCB1c2UgdTMyIGZvciBlZmZpY2llbmN5LiAqL1xuZXhwb3J0IHR5cGUgQ2lwaGVyQ29yZUZuID0gKFxuICBzaWdtYTogVWludDMyQXJyYXksXG4gIGtleTogVWludDMyQXJyYXksXG4gIG5vbmNlOiBVaW50MzJBcnJheSxcbiAgb3V0cHV0OiBVaW50MzJBcnJheSxcbiAgY291bnRlcjogbnVtYmVyLFxuICByb3VuZHM/OiBudW1iZXJcbikgPT4gdm9pZDtcblxuLyoqIE1ldGhvZCB3aGljaCBleHRlbmRzIGtleSArIHNob3J0IG5vbmNlIGludG8gbGFyZ2VyIG5vbmNlIC8gZGlmZiBrZXkuICovXG5leHBvcnQgdHlwZSBFeHRlbmROb25jZUZuID0gKFxuICBzaWdtYTogVWludDMyQXJyYXksXG4gIGtleTogVWludDMyQXJyYXksXG4gIGlucHV0OiBVaW50MzJBcnJheSxcbiAgb3V0cHV0OiBVaW50MzJBcnJheVxuKSA9PiB2b2lkO1xuXG4vKiogQVJYIGNpcGhlciBvcHRpb25zLlxuICogKiBgYWxsb3dTaG9ydEtleXNgIGZvciAxNi1ieXRlIGtleXNcbiAqICogYGNvdW50ZXJMZW5ndGhgIGluIGJ5dGVzXG4gKiAqIGBjb3VudGVyUmlnaHRgOiByaWdodDogYG5vbmNlfGNvdW50ZXJgOyBsZWZ0OiBgY291bnRlcnxub25jZWBcbiAqICovXG5leHBvcnQgdHlwZSBDaXBoZXJPcHRzID0ge1xuICBhbGxvd1Nob3J0S2V5cz86IGJvb2xlYW47IC8vIE9yaWdpbmFsIHNhbHNhIC8gY2hhY2hhIGFsbG93IDE2LWJ5dGUga2V5c1xuICBleHRlbmROb25jZUZuPzogRXh0ZW5kTm9uY2VGbjtcbiAgY291bnRlckxlbmd0aD86IG51bWJlcjtcbiAgY291bnRlclJpZ2h0PzogYm9vbGVhbjtcbiAgcm91bmRzPzogbnVtYmVyO1xufTtcblxuLy8gSXMgYnl0ZSBhcnJheSBhbGlnbmVkIHRvIDQgYnl0ZSBvZmZzZXQgKHUzMik/XG5mdW5jdGlvbiBpc0FsaWduZWQzMihiOiBVaW50OEFycmF5KSB7XG4gIHJldHVybiBiLmJ5dGVPZmZzZXQgJSA0ID09PSAwO1xufVxuXG4vLyBTYWxzYSBhbmQgQ2hhY2hhIGJsb2NrIGxlbmd0aCBpcyBhbHdheXMgNTEyLWJpdFxuY29uc3QgQkxPQ0tfTEVOID0gNjQ7XG5jb25zdCBCTE9DS19MRU4zMiA9IDE2O1xuXG4vLyBuZXcgVWludDMyQXJyYXkoWzIqKjMyXSkgICAvLyA9PiBVaW50MzJBcnJheSgxKSBbIDAgXVxuLy8gbmV3IFVpbnQzMkFycmF5KFsyKiozMi0xXSkgLy8gPT4gVWludDMyQXJyYXkoMSkgWyA0Mjk0OTY3Mjk1IF1cbmNvbnN0IE1BWF9DT1VOVEVSID0gMiAqKiAzMiAtIDE7XG5cbmNvbnN0IFUzMl9FTVBUWSA9IFVpbnQzMkFycmF5Lm9mKCk7XG5mdW5jdGlvbiBydW5DaXBoZXIoXG4gIGNvcmU6IENpcGhlckNvcmVGbixcbiAgc2lnbWE6IFVpbnQzMkFycmF5LFxuICBrZXk6IFVpbnQzMkFycmF5LFxuICBub25jZTogVWludDMyQXJyYXksXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIG91dHB1dDogVWludDhBcnJheSxcbiAgY291bnRlcjogbnVtYmVyLFxuICByb3VuZHM6IG51bWJlclxuKTogdm9pZCB7XG4gIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBibG9jayA9IG5ldyBVaW50OEFycmF5KEJMT0NLX0xFTik7XG4gIGNvbnN0IGIzMiA9IHUzMihibG9jayk7XG4gIC8vIE1ha2Ugc3VyZSB0aGF0IGJ1ZmZlcnMgYWxpZ25lZCB0byA0IGJ5dGVzXG4gIGNvbnN0IGlzQWxpZ25lZCA9IGlzQWxpZ25lZDMyKGRhdGEpICYmIGlzQWxpZ25lZDMyKG91dHB1dCk7XG4gIGNvbnN0IGQzMiA9IGlzQWxpZ25lZCA/IHUzMihkYXRhKSA6IFUzMl9FTVBUWTtcbiAgY29uc3QgbzMyID0gaXNBbGlnbmVkID8gdTMyKG91dHB1dCkgOiBVMzJfRU1QVFk7XG4gIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IGxlbjsgY291bnRlcisrKSB7XG4gICAgY29yZShzaWdtYSwga2V5LCBub25jZSwgYjMyLCBjb3VudGVyLCByb3VuZHMpO1xuICAgIGlmIChjb3VudGVyID49IE1BWF9DT1VOVEVSKSB0aHJvdyBuZXcgRXJyb3IoJ2FyeDogY291bnRlciBvdmVyZmxvdycpO1xuICAgIGNvbnN0IHRha2UgPSBNYXRoLm1pbihCTE9DS19MRU4sIGxlbiAtIHBvcyk7XG4gICAgLy8gYWxpZ25lZCB0byA0IGJ5dGVzXG4gICAgaWYgKGlzQWxpZ25lZCAmJiB0YWtlID09PSBCTE9DS19MRU4pIHtcbiAgICAgIGNvbnN0IHBvczMyID0gcG9zIC8gNDtcbiAgICAgIGlmIChwb3MgJSA0ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ2FyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbicpO1xuICAgICAgZm9yIChsZXQgaiA9IDAsIHBvc2o6IG51bWJlcjsgaiA8IEJMT0NLX0xFTjMyOyBqKyspIHtcbiAgICAgICAgcG9zaiA9IHBvczMyICsgajtcbiAgICAgICAgbzMyW3Bvc2pdID0gZDMyW3Bvc2pdIF4gYjMyW2pdO1xuICAgICAgfVxuICAgICAgcG9zICs9IEJMT0NLX0xFTjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gMCwgcG9zajsgaiA8IHRha2U7IGorKykge1xuICAgICAgcG9zaiA9IHBvcyArIGo7XG4gICAgICBvdXRwdXRbcG9zal0gPSBkYXRhW3Bvc2pdIF4gYmxvY2tbal07XG4gICAgfVxuICAgIHBvcyArPSB0YWtlO1xuICB9XG59XG5cbi8qKiBDcmVhdGVzIEFSWC1saWtlIChDaGFDaGEsIFNhbHNhKSBjaXBoZXIgc3RyZWFtIGZyb20gY29yZSBmdW5jdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaXBoZXIoY29yZTogQ2lwaGVyQ29yZUZuLCBvcHRzOiBDaXBoZXJPcHRzKTogWG9yU3RyZWFtIHtcbiAgY29uc3QgeyBhbGxvd1Nob3J0S2V5cywgZXh0ZW5kTm9uY2VGbiwgY291bnRlckxlbmd0aCwgY291bnRlclJpZ2h0LCByb3VuZHMgfSA9IGNoZWNrT3B0cyhcbiAgICB7IGFsbG93U2hvcnRLZXlzOiBmYWxzZSwgY291bnRlckxlbmd0aDogOCwgY291bnRlclJpZ2h0OiBmYWxzZSwgcm91bmRzOiAyMCB9LFxuICAgIG9wdHNcbiAgKTtcbiAgaWYgKHR5cGVvZiBjb3JlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ2NvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIGFudW1iZXIoY291bnRlckxlbmd0aCk7XG4gIGFudW1iZXIocm91bmRzKTtcbiAgYWJvb2woY291bnRlclJpZ2h0KTtcbiAgYWJvb2woYWxsb3dTaG9ydEtleXMpO1xuICByZXR1cm4gKFxuICAgIGtleTogVWludDhBcnJheSxcbiAgICBub25jZTogVWludDhBcnJheSxcbiAgICBkYXRhOiBVaW50OEFycmF5LFxuICAgIG91dHB1dD86IFVpbnQ4QXJyYXksXG4gICAgY291bnRlciA9IDBcbiAgKTogVWludDhBcnJheSA9PiB7XG4gICAgYWJ5dGVzKGtleSwgdW5kZWZpbmVkLCAna2V5Jyk7XG4gICAgYWJ5dGVzKG5vbmNlLCB1bmRlZmluZWQsICdub25jZScpO1xuICAgIGFieXRlcyhkYXRhLCB1bmRlZmluZWQsICdkYXRhJyk7XG4gICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gICAgaWYgKG91dHB1dCA9PT0gdW5kZWZpbmVkKSBvdXRwdXQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIGFieXRlcyhvdXRwdXQsIHVuZGVmaW5lZCwgJ291dHB1dCcpO1xuICAgIGFudW1iZXIoY291bnRlcik7XG4gICAgaWYgKGNvdW50ZXIgPCAwIHx8IGNvdW50ZXIgPj0gTUFYX0NPVU5URVIpIHRocm93IG5ldyBFcnJvcignYXJ4OiBjb3VudGVyIG92ZXJmbG93Jyk7XG4gICAgaWYgKG91dHB1dC5sZW5ndGggPCBsZW4pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFyeDogb3V0cHV0ICgke291dHB1dC5sZW5ndGh9KSBpcyBzaG9ydGVyIHRoYW4gZGF0YSAoJHtsZW59KWApO1xuICAgIGNvbnN0IHRvQ2xlYW4gPSBbXTtcblxuICAgIC8vIEtleSAmIHNpZ21hXG4gICAgLy8ga2V5PTE2IC0+IHNpZ21hMTYsIGs9a2V5fGtleVxuICAgIC8vIGtleT0zMiAtPiBzaWdtYTMyLCBrPWtleVxuICAgIGxldCBsID0ga2V5Lmxlbmd0aDtcbiAgICBsZXQgazogVWludDhBcnJheTtcbiAgICBsZXQgc2lnbWE6IFVpbnQzMkFycmF5O1xuICAgIGlmIChsID09PSAzMikge1xuICAgICAgdG9DbGVhbi5wdXNoKChrID0gY29weUJ5dGVzKGtleSkpKTtcbiAgICAgIHNpZ21hID0gc2lnbWEzMl8zMjtcbiAgICB9IGVsc2UgaWYgKGwgPT09IDE2ICYmIGFsbG93U2hvcnRLZXlzKSB7XG4gICAgICBrID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgay5zZXQoa2V5KTtcbiAgICAgIGsuc2V0KGtleSwgMTYpO1xuICAgICAgc2lnbWEgPSBzaWdtYTE2XzMyO1xuICAgICAgdG9DbGVhbi5wdXNoKGspO1xuICAgIH0gZWxzZSB7XG4gICAgICBhYnl0ZXMoa2V5LCAzMiwgJ2FyeCBrZXknKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBrZXkgc2l6ZScpO1xuICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKGBcImFyeCBrZXlcIiBleHBlY3RlZCBVaW50OEFycmF5IG9mIGxlbmd0aCAzMiwgZ290IGxlbmd0aD0ke2x9YCk7XG4gICAgfVxuXG4gICAgLy8gTm9uY2VcbiAgICAvLyBzYWxzYTIwOiAgICAgIDggICAoOC1ieXRlIGNvdW50ZXIpXG4gICAgLy8gY2hhY2hhMjBvcmlnOiA4ICAgKDgtYnl0ZSBjb3VudGVyKVxuICAgIC8vIGNoYWNoYTIwOiAgICAgMTIgICg0LWJ5dGUgY291bnRlcilcbiAgICAvLyB4c2Fsc2EyMDogICAgIDI0ICAoMTYgLT4gaHNhbHNhLCAgOCAtPiBvbGQgbm9uY2UpXG4gICAgLy8geGNoYWNoYTIwOiAgICAyNCAgKDE2IC0+IGhjaGFjaGEsIDggLT4gb2xkIG5vbmNlKVxuICAgIC8vIEFsaWduIG5vbmNlIHRvIDQgYnl0ZXNcbiAgICBpZiAoIWlzQWxpZ25lZDMyKG5vbmNlKSkgdG9DbGVhbi5wdXNoKChub25jZSA9IGNvcHlCeXRlcyhub25jZSkpKTtcblxuICAgIGNvbnN0IGszMiA9IHUzMihrKTtcbiAgICAvLyBoc2Fsc2EgJiBoY2hhY2hhOiBoYW5kbGUgZXh0ZW5kZWQgbm9uY2VcbiAgICBpZiAoZXh0ZW5kTm9uY2VGbikge1xuICAgICAgaWYgKG5vbmNlLmxlbmd0aCAhPT0gMjQpIHRocm93IG5ldyBFcnJvcihgYXJ4OiBleHRlbmRlZCBub25jZSBtdXN0IGJlIDI0IGJ5dGVzYCk7XG4gICAgICBleHRlbmROb25jZUZuKHNpZ21hLCBrMzIsIHUzMihub25jZS5zdWJhcnJheSgwLCAxNikpLCBrMzIpO1xuICAgICAgbm9uY2UgPSBub25jZS5zdWJhcnJheSgxNik7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG5vbmNlIGNvdW50ZXJcbiAgICBjb25zdCBub25jZU5jTGVuID0gMTYgLSBjb3VudGVyTGVuZ3RoO1xuICAgIGlmIChub25jZU5jTGVuICE9PSBub25jZS5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFyeDogbm9uY2UgbXVzdCBiZSAke25vbmNlTmNMZW59IG9yIDE2IGJ5dGVzYCk7XG5cbiAgICAvLyBQYWQgY291bnRlciB3aGVuIG5vbmNlIGlzIDY0IGJpdFxuICAgIGlmIChub25jZU5jTGVuICE9PSAxMikge1xuICAgICAgY29uc3QgbmMgPSBuZXcgVWludDhBcnJheSgxMik7XG4gICAgICBuYy5zZXQobm9uY2UsIGNvdW50ZXJSaWdodCA/IDAgOiAxMiAtIG5vbmNlLmxlbmd0aCk7XG4gICAgICBub25jZSA9IG5jO1xuICAgICAgdG9DbGVhbi5wdXNoKG5vbmNlKTtcbiAgICB9XG4gICAgY29uc3QgbjMyID0gdTMyKG5vbmNlKTtcbiAgICBydW5DaXBoZXIoY29yZSwgc2lnbWEsIGszMiwgbjMyLCBkYXRhLCBvdXRwdXQsIGNvdW50ZXIsIHJvdW5kcyk7XG4gICAgY2xlYW4oLi4udG9DbGVhbik7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcbn1cblxuLyoqIEludGVybmFsIGNsYXNzIHdoaWNoIHdyYXBzIGNoYWNoYTIwIG9yIGNoYWNoYTggdG8gY3JlYXRlIENTUFJORy4gKi9cbmV4cG9ydCBjbGFzcyBfWG9yU3RyZWFtUFJHIGltcGxlbWVudHMgUFJHIHtcbiAgcmVhZG9ubHkgYmxvY2tMZW46IG51bWJlcjtcbiAgcmVhZG9ubHkga2V5TGVuOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5vbmNlTGVuOiBudW1iZXI7XG4gIHByaXZhdGUgc3RhdGU6IFVpbnQ4QXJyYXk7XG4gIHByaXZhdGUgYnVmOiBVaW50OEFycmF5O1xuICBwcml2YXRlIGtleTogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBub25jZTogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBwb3M6IG51bWJlcjtcbiAgcHJpdmF0ZSBjdHI6IG51bWJlcjtcbiAgcHJpdmF0ZSBjaXBoZXI6IFhvclN0cmVhbTtcbiAgY29uc3RydWN0b3IoXG4gICAgY2lwaGVyOiBYb3JTdHJlYW0sXG4gICAgYmxvY2tMZW46IG51bWJlcixcbiAgICBrZXlMZW46IG51bWJlcixcbiAgICBub25jZUxlbjogbnVtYmVyLFxuICAgIHNlZWQ6IFVpbnQ4QXJyYXlcbiAgKSB7XG4gICAgdGhpcy5jaXBoZXIgPSBjaXBoZXI7XG4gICAgdGhpcy5ibG9ja0xlbiA9IGJsb2NrTGVuO1xuICAgIHRoaXMua2V5TGVuID0ga2V5TGVuO1xuICAgIHRoaXMubm9uY2VMZW4gPSBub25jZUxlbjtcbiAgICB0aGlzLnN0YXRlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5rZXlMZW4gKyB0aGlzLm5vbmNlTGVuKTtcbiAgICB0aGlzLnJlc2VlZChzZWVkKTtcbiAgICB0aGlzLmN0ciA9IDA7XG4gICAgdGhpcy5wb3MgPSB0aGlzLmJsb2NrTGVuO1xuICAgIHRoaXMuYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja0xlbik7XG4gICAgdGhpcy5rZXkgPSB0aGlzLnN0YXRlLnN1YmFycmF5KDAsIHRoaXMua2V5TGVuKTtcbiAgICB0aGlzLm5vbmNlID0gdGhpcy5zdGF0ZS5zdWJhcnJheSh0aGlzLmtleUxlbik7XG4gIH1cbiAgcHJpdmF0ZSByZXNlZWQoc2VlZDogVWludDhBcnJheSkge1xuICAgIGFieXRlcyhzZWVkKTtcbiAgICBpZiAoIXNlZWQgfHwgc2VlZC5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcignZW50cm9weSByZXF1aXJlZCcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VlZC5sZW5ndGg7IGkrKykgdGhpcy5zdGF0ZVtpICUgdGhpcy5zdGF0ZS5sZW5ndGhdIF49IHNlZWRbaV07XG4gICAgdGhpcy5jdHIgPSAwO1xuICAgIHRoaXMucG9zID0gdGhpcy5ibG9ja0xlbjtcbiAgfVxuICBhZGRFbnRyb3B5KHNlZWQ6IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnNldCh0aGlzLnJhbmRvbUJ5dGVzKHRoaXMuc3RhdGUubGVuZ3RoKSk7XG4gICAgdGhpcy5yZXNlZWQoc2VlZCk7XG4gIH1cbiAgcmFuZG9tQnl0ZXMobGVuOiBudW1iZXIpOiBVaW50OEFycmF5IHtcbiAgICBhbnVtYmVyKGxlbik7XG4gICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIGNvbnN0IG91dCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgbGV0IG91dFBvcyA9IDA7XG4gICAgLy8gTGVmdG92ZXJzXG4gICAgaWYgKHRoaXMucG9zIDwgdGhpcy5ibG9ja0xlbikge1xuICAgICAgY29uc3QgdGFrZSA9IE1hdGgubWluKGxlbiwgdGhpcy5ibG9ja0xlbiAtIHRoaXMucG9zKTtcbiAgICAgIG91dC5zZXQodGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsIHRoaXMucG9zICsgdGFrZSksIDApO1xuICAgICAgdGhpcy5wb3MgKz0gdGFrZTtcbiAgICAgIG91dFBvcyArPSB0YWtlO1xuICAgICAgaWYgKG91dFBvcyA9PT0gbGVuKSByZXR1cm4gb3V0OyAvLyBmYXN0IHBhdGhcbiAgICB9XG4gICAgLy8gRnVsbCBibG9ja3MgZGlyZWN0bHkgdG8gb3V0XG4gICAgY29uc3QgYmxvY2tzID0gTWF0aC5mbG9vcigobGVuIC0gb3V0UG9zKSAvIHRoaXMuYmxvY2tMZW4pO1xuICAgIGlmIChibG9ja3MgPiAwKSB7XG4gICAgICBjb25zdCBibG9ja0J5dGVzID0gYmxvY2tzICogdGhpcy5ibG9ja0xlbjtcbiAgICAgIGNvbnN0IGIgPSBvdXQuc3ViYXJyYXkob3V0UG9zLCBvdXRQb3MgKyBibG9ja0J5dGVzKTtcbiAgICAgIHRoaXMuY2lwaGVyKHRoaXMua2V5LCB0aGlzLm5vbmNlLCBiLCBiLCB0aGlzLmN0cik7XG4gICAgICB0aGlzLmN0ciArPSBibG9ja3M7XG4gICAgICBvdXRQb3MgKz0gYmxvY2tCeXRlcztcbiAgICB9XG4gICAgLy8gU2F2ZSBsZWZ0b3ZlcnNcbiAgICBjb25zdCBsZWZ0ID0gbGVuIC0gb3V0UG9zO1xuICAgIGlmIChsZWZ0ID4gMCkge1xuICAgICAgdGhpcy5idWYuZmlsbCgwKTtcbiAgICAgIC8vIE5PVEU6IGNpcGhlciB3aWxsIGhhbmRsZSBvdmVyZmxvd1xuICAgICAgdGhpcy5jaXBoZXIodGhpcy5rZXksIHRoaXMubm9uY2UsIHRoaXMuYnVmLCB0aGlzLmJ1ZiwgdGhpcy5jdHIrKyk7XG4gICAgICBvdXQuc2V0KHRoaXMuYnVmLnN1YmFycmF5KDAsIGxlZnQpLCBvdXRQb3MpO1xuICAgICAgdGhpcy5wb3MgPSBsZWZ0O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIGNsb25lKCk6IF9Yb3JTdHJlYW1QUkcge1xuICAgIHJldHVybiBuZXcgX1hvclN0cmVhbVBSRyhcbiAgICAgIHRoaXMuY2lwaGVyLFxuICAgICAgdGhpcy5ibG9ja0xlbixcbiAgICAgIHRoaXMua2V5TGVuLFxuICAgICAgdGhpcy5ub25jZUxlbixcbiAgICAgIHRoaXMucmFuZG9tQnl0ZXModGhpcy5zdGF0ZS5sZW5ndGgpXG4gICAgKTtcbiAgfVxuICBjbGVhbigpOiB2b2lkIHtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5jdHIgPSAwO1xuICAgIHRoaXMuYnVmLmZpbGwoMCk7XG4gICAgdGhpcy5zdGF0ZS5maWxsKDApO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFhvclBSRyA9IChzZWVkPzogVWludDhBcnJheSkgPT4gX1hvclN0cmVhbVBSRztcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBSRyA9IChcbiAgY2lwaGVyOiBYb3JTdHJlYW0sXG4gIGJsb2NrTGVuOiBudW1iZXIsXG4gIGtleUxlbjogbnVtYmVyLFxuICBub25jZUxlbjogbnVtYmVyXG4pOiBYb3JQUkcgPT4ge1xuICByZXR1cm4gKHNlZWQ6IFVpbnQ4QXJyYXkgPSByYW5kb21CeXRlcygzMikpOiBfWG9yU3RyZWFtUFJHID0+XG4gICAgbmV3IF9Yb3JTdHJlYW1QUkcoY2lwaGVyLCBibG9ja0xlbiwga2V5TGVuLCBub25jZUxlbiwgc2VlZCk7XG59O1xuIiwgIi8qKlxuICogVXRpbGl0aWVzIGZvciBoZXgsIGJ5dGVzLCBDU1BSTkcuXG4gKiBAbW9kdWxlXG4gKi9cbi8qISBub2JsZS1jaXBoZXJzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjMgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5cbi8qKiBDaGVja3MgaWYgc29tZXRoaW5nIGlzIFVpbnQ4QXJyYXkuIEJlIGNhcmVmdWw6IG5vZGVqcyBCdWZmZXIgd2lsbCByZXR1cm4gdHJ1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzKGE6IHVua25vd24pOiBhIGlzIFVpbnQ4QXJyYXkge1xuICByZXR1cm4gYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiBhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdVaW50OEFycmF5Jyk7XG59XG5cbi8qKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBib29sZWFuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFib29sKGI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBiICE9PSAnYm9vbGVhbicpIHRocm93IG5ldyBFcnJvcihgYm9vbGVhbiBleHBlY3RlZCwgbm90ICR7Yn1gKTtcbn1cblxuLyoqIEFzc2VydHMgc29tZXRoaW5nIGlzIHBvc2l0aXZlIGludGVnZXIuICovXG5leHBvcnQgZnVuY3Rpb24gYW51bWJlcihuOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSB8fCBuIDwgMCkgdGhyb3cgbmV3IEVycm9yKCdwb3NpdGl2ZSBpbnRlZ2VyIGV4cGVjdGVkLCBnb3QgJyArIG4pO1xufVxuXG4vKiogQXNzZXJ0cyBzb21ldGhpbmcgaXMgVWludDhBcnJheS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnl0ZXModmFsdWU6IFVpbnQ4QXJyYXksIGxlbmd0aD86IG51bWJlciwgdGl0bGU6IHN0cmluZyA9ICcnKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGJ5dGVzID0gaXNCeXRlcyh2YWx1ZSk7XG4gIGNvbnN0IGxlbiA9IHZhbHVlPy5sZW5ndGg7XG4gIGNvbnN0IG5lZWRzTGVuID0gbGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gIGlmICghYnl0ZXMgfHwgKG5lZWRzTGVuICYmIGxlbiAhPT0gbGVuZ3RoKSkge1xuICAgIGNvbnN0IHByZWZpeCA9IHRpdGxlICYmIGBcIiR7dGl0bGV9XCIgYDtcbiAgICBjb25zdCBvZkxlbiA9IG5lZWRzTGVuID8gYCBvZiBsZW5ndGggJHtsZW5ndGh9YCA6ICcnO1xuICAgIGNvbnN0IGdvdCA9IGJ5dGVzID8gYGxlbmd0aD0ke2xlbn1gIDogYHR5cGU9JHt0eXBlb2YgdmFsdWV9YDtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4ICsgJ2V4cGVjdGVkIFVpbnQ4QXJyYXknICsgb2ZMZW4gKyAnLCBnb3QgJyArIGdvdCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKiogQXNzZXJ0cyBhIGhhc2ggaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGRlc3Ryb3llZCAvIGZpbmlzaGVkICovXG5leHBvcnQgZnVuY3Rpb24gYWV4aXN0cyhpbnN0YW5jZTogYW55LCBjaGVja0ZpbmlzaGVkID0gdHJ1ZSk6IHZvaWQge1xuICBpZiAoaW5zdGFuY2UuZGVzdHJveWVkKSB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkJyk7XG4gIGlmIChjaGVja0ZpbmlzaGVkICYmIGluc3RhbmNlLmZpbmlzaGVkKSB0aHJvdyBuZXcgRXJyb3IoJ0hhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQnKTtcbn1cblxuLyoqIEFzc2VydHMgb3V0cHV0IGlzIHByb3Blcmx5LXNpemVkIGJ5dGUgYXJyYXkgKi9cbmV4cG9ydCBmdW5jdGlvbiBhb3V0cHV0KG91dDogYW55LCBpbnN0YW5jZTogYW55KTogdm9pZCB7XG4gIGFieXRlcyhvdXQsIHVuZGVmaW5lZCwgJ291dHB1dCcpO1xuICBjb25zdCBtaW4gPSBpbnN0YW5jZS5vdXRwdXRMZW47XG4gIGlmIChvdXQubGVuZ3RoIDwgbWluKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAnICsgbWluKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBJSGFzaCA9IHtcbiAgKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xuICBibG9ja0xlbjogbnVtYmVyO1xuICBvdXRwdXRMZW46IG51bWJlcjtcbiAgY3JlYXRlOiBhbnk7XG59O1xuXG4vKiogR2VuZXJpYyB0eXBlIGVuY29tcGFzc2luZyA4LzE2LzMyLWJ5dGUgYXJyYXlzIC0gYnV0IG5vdCA2NC1ieXRlLiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gSW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5IHxcbiAgVWludDE2QXJyYXkgfCBJbnQxNkFycmF5IHwgVWludDMyQXJyYXkgfCBJbnQzMkFycmF5O1xuXG4vKiogQ2FzdCB1OCAvIHUxNiAvIHUzMiB0byB1OC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1OChhcnI6IFR5cGVkQXJyYXkpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBhcnIuYnl0ZUxlbmd0aCk7XG59XG5cbi8qKiBDYXN0IHU4IC8gdTE2IC8gdTMyIHRvIHUzMi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1MzIoYXJyOiBUeXBlZEFycmF5KTogVWludDMyQXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBNYXRoLmZsb29yKGFyci5ieXRlTGVuZ3RoIC8gNCkpO1xufVxuXG4vKiogWmVyb2l6ZSBhIGJ5dGUgYXJyYXkuIFdhcm5pbmc6IEpTIHByb3ZpZGVzIG5vIGd1YXJhbnRlZXMuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW4oLi4uYXJyYXlzOiBUeXBlZEFycmF5W10pOiB2b2lkIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHtcbiAgICBhcnJheXNbaV0uZmlsbCgwKTtcbiAgfVxufVxuXG4vKiogQ3JlYXRlIERhdGFWaWV3IG9mIGFuIGFycmF5IGZvciBlYXN5IGJ5dGUtbGV2ZWwgbWFuaXB1bGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZpZXcoYXJyOiBUeXBlZEFycmF5KTogRGF0YVZpZXcge1xuICByZXR1cm4gbmV3IERhdGFWaWV3KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBhcnIuYnl0ZUxlbmd0aCk7XG59XG5cbi8qKiBJcyBjdXJyZW50IHBsYXRmb3JtIGxpdHRsZS1lbmRpYW4/IE1vc3QgYXJlLiBCaWctRW5kaWFuIHBsYXRmb3JtOiBJQk0gKi9cbmV4cG9ydCBjb25zdCBpc0xFOiBib29sZWFuID0gLyogQF9fUFVSRV9fICovICgoKSA9PlxuICBuZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzB4MTEyMjMzNDRdKS5idWZmZXIpWzBdID09PSAweDQ0KSgpO1xuXG4vLyBCdWlsdC1pbiBoZXggY29udmVyc2lvbiBodHRwczovL2Nhbml1c2UuY29tL21kbi1qYXZhc2NyaXB0X2J1aWx0aW5zX3VpbnQ4YXJyYXlfZnJvbWhleFxuY29uc3QgaGFzSGV4QnVpbHRpbjogYm9vbGVhbiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT5cbiAgLy8gQHRzLWlnbm9yZVxuICB0eXBlb2YgVWludDhBcnJheS5mcm9tKFtdKS50b0hleCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgVWludDhBcnJheS5mcm9tSGV4ID09PSAnZnVuY3Rpb24nKSgpO1xuXG4vLyBBcnJheSB3aGVyZSBpbmRleCAweGYwICgyNDApIGlzIG1hcHBlZCB0byBzdHJpbmcgJ2YwJ1xuY29uc3QgaGV4ZXMgPSAvKiBAX19QVVJFX18gKi8gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChfLCBpKSA9PlxuICBpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpXG4pO1xuXG4vKipcbiAqIENvbnZlcnQgYnl0ZSBhcnJheSB0byBoZXggc3RyaW5nLiBVc2VzIGJ1aWx0LWluIGZ1bmN0aW9uLCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleGFtcGxlIGJ5dGVzVG9IZXgoVWludDhBcnJheS5mcm9tKFsweGNhLCAweGZlLCAweDAxLCAweDIzXSkpIC8vICdjYWZlMDEyMydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9IZXgoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICBhYnl0ZXMoYnl0ZXMpO1xuICAvLyBAdHMtaWdub3JlXG4gIGlmIChoYXNIZXhCdWlsdGluKSByZXR1cm4gYnl0ZXMudG9IZXgoKTtcbiAgLy8gcHJlLWNhY2hpbmcgaW1wcm92ZXMgdGhlIHNwZWVkIDZ4XG4gIGxldCBoZXggPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGhleCArPSBoZXhlc1tieXRlc1tpXV07XG4gIH1cbiAgcmV0dXJuIGhleDtcbn1cblxuLy8gV2UgdXNlIG9wdGltaXplZCB0ZWNobmlxdWUgdG8gY29udmVydCBoZXggc3RyaW5nIHRvIGJ5dGUgYXJyYXlcbmNvbnN0IGFzY2lpcyA9IHsgXzA6IDQ4LCBfOTogNTcsIEE6IDY1LCBGOiA3MCwgYTogOTcsIGY6IDEwMiB9IGFzIGNvbnN0O1xuZnVuY3Rpb24gYXNjaWlUb0Jhc2UxNihjaDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNoID49IGFzY2lpcy5fMCAmJiBjaCA8PSBhc2NpaXMuXzkpIHJldHVybiBjaCAtIGFzY2lpcy5fMDsgLy8gJzInID0+IDUwLTQ4XG4gIGlmIChjaCA+PSBhc2NpaXMuQSAmJiBjaCA8PSBhc2NpaXMuRikgcmV0dXJuIGNoIC0gKGFzY2lpcy5BIC0gMTApOyAvLyAnQicgPT4gNjYtKDY1LTEwKVxuICBpZiAoY2ggPj0gYXNjaWlzLmEgJiYgY2ggPD0gYXNjaWlzLmYpIHJldHVybiBjaCAtIChhc2NpaXMuYSAtIDEwKTsgLy8gJ2InID0+IDk4LSg5Ny0xMClcbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIENvbnZlcnQgaGV4IHN0cmluZyB0byBieXRlIGFycmF5LiBVc2VzIGJ1aWx0LWluIGZ1bmN0aW9uLCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleGFtcGxlIGhleFRvQnl0ZXMoJ2NhZmUwMTIzJykgLy8gVWludDhBcnJheS5mcm9tKFsweGNhLCAweGZlLCAweDAxLCAweDIzXSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhleFRvQnl0ZXMoaGV4OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgaWYgKHR5cGVvZiBoZXggIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoJ2hleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCAnICsgdHlwZW9mIGhleCk7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaWYgKGhhc0hleEJ1aWx0aW4pIHJldHVybiBVaW50OEFycmF5LmZyb21IZXgoaGV4KTtcbiAgY29uc3QgaGwgPSBoZXgubGVuZ3RoO1xuICBjb25zdCBhbCA9IGhsIC8gMjtcbiAgaWYgKGhsICUgMikgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgdW5wYWRkZWQgaGV4IG9mIGxlbmd0aCAnICsgaGwpO1xuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFsKTtcbiAgZm9yIChsZXQgYWkgPSAwLCBoaSA9IDA7IGFpIDwgYWw7IGFpKyssIGhpICs9IDIpIHtcbiAgICBjb25zdCBuMSA9IGFzY2lpVG9CYXNlMTYoaGV4LmNoYXJDb2RlQXQoaGkpKTtcbiAgICBjb25zdCBuMiA9IGFzY2lpVG9CYXNlMTYoaGV4LmNoYXJDb2RlQXQoaGkgKyAxKSk7XG4gICAgaWYgKG4xID09PSB1bmRlZmluZWQgfHwgbjIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2hhciA9IGhleFtoaV0gKyBoZXhbaGkgKyAxXTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaGV4IHN0cmluZyBleHBlY3RlZCwgZ290IG5vbi1oZXggY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgYXQgaW5kZXggJyArIGhpKTtcbiAgICB9XG4gICAgYXJyYXlbYWldID0gbjEgKiAxNiArIG4yOyAvLyBtdWx0aXBseSBmaXJzdCBvY3RldCwgZS5nLiAnYTMnID0+IDEwKjE2KzMgPT4gMTYwICsgMyA9PiAxNjNcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8vIFVzZWQgaW4gbWljcm9cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb051bWJlcihoZXg6IHN0cmluZyk6IGJpZ2ludCB7XG4gIGlmICh0eXBlb2YgaGV4ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgJyArIHR5cGVvZiBoZXgpO1xuICByZXR1cm4gQmlnSW50KGhleCA9PT0gJycgPyAnMCcgOiAnMHgnICsgaGV4KTsgLy8gQmlnIEVuZGlhblxufVxuXG4vLyBVc2VkIGluIGZmMVxuLy8gQkU6IEJpZyBFbmRpYW4sIExFOiBMaXR0bGUgRW5kaWFuXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb051bWJlckJFKGJ5dGVzOiBVaW50OEFycmF5KTogYmlnaW50IHtcbiAgcmV0dXJuIGhleFRvTnVtYmVyKGJ5dGVzVG9IZXgoYnl0ZXMpKTtcbn1cblxuLy8gVXNlZCBpbiBtaWNybywgZmYxXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9CeXRlc0JFKG46IG51bWJlciB8IGJpZ2ludCwgbGVuOiBudW1iZXIpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGhleFRvQnl0ZXMobi50b1N0cmluZygxNikucGFkU3RhcnQobGVuICogMiwgJzAnKSk7XG59XG5cbi8vIEdsb2JhbCBzeW1ib2xzLCBidXQgdHMgZG9lc24ndCBzZWUgdGhlbTogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMTUzNVxuZGVjbGFyZSBjb25zdCBUZXh0RW5jb2RlcjogYW55O1xuZGVjbGFyZSBjb25zdCBUZXh0RGVjb2RlcjogYW55O1xuXG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyB0byBieXRlcyB1c2luZyBVVEY4IGVuY29kaW5nLlxuICogQGV4YW1wbGUgdXRmOFRvQnl0ZXMoJ2FiYycpIC8vIG5ldyBVaW50OEFycmF5KFs5NywgOTgsIDk5XSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cjogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpKTsgLy8gaHR0cHM6Ly9idWd6aWwubGEvMTY4MTgwOVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJ5dGVzIHRvIHN0cmluZyB1c2luZyBVVEY4IGVuY29kaW5nLlxuICogQGV4YW1wbGUgYnl0ZXNUb1V0ZjgobmV3IFVpbnQ4QXJyYXkoWzk3LCA5OCwgOTldKSkgLy8gJ2FiYydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9VdGY4KGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHR3byBVOEEgdXNlIHNhbWUgdW5kZXJseWluZyBidWZmZXIgYW5kIG92ZXJsYXBzLlxuICogVGhpcyBpcyBpbnZhbGlkIGFuZCBjYW4gY29ycnVwdCBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcmxhcEJ5dGVzKGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhLmJ1ZmZlciA9PT0gYi5idWZmZXIgJiYgLy8gYmVzdCB3ZSBjYW4gZG8sIG1heSBmYWlsIHdpdGggYW4gb2JzY3VyZSBQcm94eVxuICAgIGEuYnl0ZU9mZnNldCA8IGIuYnl0ZU9mZnNldCArIGIuYnl0ZUxlbmd0aCAmJiAvLyBhIHN0YXJ0cyBiZWZvcmUgYiBlbmRcbiAgICBiLmJ5dGVPZmZzZXQgPCBhLmJ5dGVPZmZzZXQgKyBhLmJ5dGVMZW5ndGggLy8gYiBzdGFydHMgYmVmb3JlIGEgZW5kXG4gICk7XG59XG5cbi8qKlxuICogSWYgaW5wdXQgYW5kIG91dHB1dCBvdmVybGFwIGFuZCBpbnB1dCBzdGFydHMgYmVmb3JlIG91dHB1dCwgd2Ugd2lsbCBvdmVyd3JpdGUgZW5kIG9mIGlucHV0IGJlZm9yZVxuICogd2Ugc3RhcnQgcHJvY2Vzc2luZyBpdCwgc28gdGhpcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBtb3N0IGNpcGhlcnMgKGV4Y2VwdCBjaGFjaGEvc2Fsc2UsIHdoaWNoIGRlc2lnbmVkIHdpdGggdGhpcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsZXhPdmVybGFwQnl0ZXMoaW5wdXQ6IFVpbnQ4QXJyYXksIG91dHB1dDogVWludDhBcnJheSk6IHZvaWQge1xuICAvLyBUaGlzIGlzIHZlcnkgY3Vyc2VkLiBJdCB3b3JrcyBzb21laG93LCBidXQgSSdtIGNvbXBsZXRlbHkgdW5zdXJlLFxuICAvLyByZWFzb25pbmcgYWJvdXQgb3ZlcmxhcHBpbmcgYWxpZ25lZCB3aW5kb3dzIGlzIHZlcnkgaGFyZC5cbiAgaWYgKG92ZXJsYXBCeXRlcyhpbnB1dCwgb3V0cHV0KSAmJiBpbnB1dC5ieXRlT2Zmc2V0IDwgb3V0cHV0LmJ5dGVPZmZzZXQpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb21wbGV4IG92ZXJsYXAgb2YgaW5wdXQgYW5kIG91dHB1dCBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5cbi8qKlxuICogQ29waWVzIHNldmVyYWwgVWludDhBcnJheXMgaW50byBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRCeXRlcyguLi5hcnJheXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXkge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhID0gYXJyYXlzW2ldO1xuICAgIGFieXRlcyhhKTtcbiAgICBzdW0gKz0gYS5sZW5ndGg7XG4gIH1cbiAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoc3VtKTtcbiAgZm9yIChsZXQgaSA9IDAsIHBhZCA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhID0gYXJyYXlzW2ldO1xuICAgIHJlcy5zZXQoYSwgcGFkKTtcbiAgICBwYWQgKz0gYS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy8gVXNlZCBpbiBBUlggb25seVxudHlwZSBFbXB0eU9iaiA9IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrT3B0czxUMSBleHRlbmRzIEVtcHR5T2JqLCBUMiBleHRlbmRzIEVtcHR5T2JqPihcbiAgZGVmYXVsdHM6IFQxLFxuICBvcHRzOiBUMlxuKTogVDEgJiBUMiB7XG4gIGlmIChvcHRzID09IG51bGwgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIGNvbnN0IG1lcmdlZCA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIG9wdHMpO1xuICByZXR1cm4gbWVyZ2VkIGFzIFQxICYgVDI7XG59XG5cbi8qKiBDb21wYXJlcyAyIHVpbnQ4YXJyYXktcyBpbiBraW5kYSBjb25zdGFudCB0aW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsQnl0ZXMoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGxldCBkaWZmID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBkaWZmIHw9IGFbaV0gXiBiW2ldO1xuICByZXR1cm4gZGlmZiA9PT0gMDtcbn1cblxuLy8gVE9ETzogcmVtb3ZlXG5leHBvcnQgaW50ZXJmYWNlIElIYXNoMiB7XG4gIGJsb2NrTGVuOiBudW1iZXI7IC8vIEJ5dGVzIHBlciBibG9ja1xuICBvdXRwdXRMZW46IG51bWJlcjsgLy8gQnl0ZXMgaW4gb3V0cHV0XG4gIHVwZGF0ZShidWY6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB0aGlzO1xuICAvLyBXcml0ZXMgZGlnZXN0IGludG8gYnVmXG4gIGRpZ2VzdEludG8oYnVmOiBVaW50OEFycmF5KTogdm9pZDtcbiAgZGlnZXN0KCk6IFVpbnQ4QXJyYXk7XG4gIC8qKlxuICAgKiBSZXNldHMgaW50ZXJuYWwgc3RhdGUuIE1ha2VzIEhhc2ggaW5zdGFuY2UgdW51c2FibGUuXG4gICAqIFJlc2V0IGlzIGltcG9zc2libGUgZm9yIGtleWVkIGhhc2hlcyBpZiBrZXkgaXMgY29uc3VtZWQgaW50byBzdGF0ZS4gSWYgZGlnZXN0IGlzIG5vdCBjb25zdW1lZFxuICAgKiBieSB1c2VyLCB0aGV5IHdpbGwgbmVlZCB0byBtYW51YWxseSBjYWxsIGBkZXN0cm95KClgIHdoZW4gemVyb2luZyBpcyBuZWNlc3NhcnkuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbi8vIFRoaXMgd2lsbCBhbGxvdyB0byByZS11c2Ugd2l0aCBjb21wb3NhYmxlIHRoaW5ncyBsaWtlIHBhY2tlZCAmIGJhc2UgZW5jb2RlcnNcbi8vIEFsc28sIHdlIHByb2JhYmx5IGNhbiBtYWtlIHRhZ3MgY29tcG9zYWJsZVxuXG4vKiogU3luYyBjaXBoZXI6IHRha2VzIGJ5dGUgYXJyYXkgYW5kIHJldHVybnMgYnl0ZSBhcnJheS4gKi9cbmV4cG9ydCB0eXBlIENpcGhlciA9IHtcbiAgZW5jcnlwdChwbGFpbnRleHQ6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xuICBkZWNyeXB0KGNpcGhlcnRleHQ6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xufTtcblxuLyoqIEFzeW5jIGNpcGhlciBlLmcuIGZyb20gYnVpbHQtaW4gV2ViQ3J5cHRvLiAqL1xuZXhwb3J0IHR5cGUgQXN5bmNDaXBoZXIgPSB7XG4gIGVuY3J5cHQocGxhaW50ZXh0OiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5PjtcbiAgZGVjcnlwdChjaXBoZXJ0ZXh0OiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5Pjtcbn07XG5cbi8qKiBDaXBoZXIgd2l0aCBgb3V0cHV0YCBhcmd1bWVudCB3aGljaCBjYW4gb3B0aW1pemUgYnkgZG9pbmcgMSBsZXNzIGFsbG9jYXRpb24uICovXG5leHBvcnQgdHlwZSBDaXBoZXJXaXRoT3V0cHV0ID0gQ2lwaGVyICYge1xuICBlbmNyeXB0KHBsYWludGV4dDogVWludDhBcnJheSwgb3V0cHV0PzogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG4gIGRlY3J5cHQoY2lwaGVydGV4dDogVWludDhBcnJheSwgb3V0cHV0PzogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG59O1xuXG4vKipcbiAqIFBhcmFtcyBhcmUgb3V0c2lkZSBvZiByZXR1cm4gdHlwZSwgc28gaXQgaXMgYWNjZXNzaWJsZSBiZWZvcmUgY2FsbGluZyBjb25zdHJ1Y3Rvci5cbiAqIElmIGZ1bmN0aW9uIHN1cHBvcnQgbXVsdGlwbGUgbm9uY2VMZW5ndGgncywgd2UgcmV0dXJuIHRoZSBiZXN0IG9uZS5cbiAqL1xuZXhwb3J0IHR5cGUgQ2lwaGVyUGFyYW1zID0ge1xuICBibG9ja1NpemU6IG51bWJlcjtcbiAgbm9uY2VMZW5ndGg/OiBudW1iZXI7XG4gIHRhZ0xlbmd0aD86IG51bWJlcjtcbiAgdmFyU2l6ZU5vbmNlPzogYm9vbGVhbjtcbn07XG4vKiogQVJYIGNpcGhlciwgbGlrZSBzYWxzYSBvciBjaGFjaGEuICovXG5leHBvcnQgdHlwZSBBUlhDaXBoZXIgPSAoKFxuICBrZXk6IFVpbnQ4QXJyYXksXG4gIG5vbmNlOiBVaW50OEFycmF5LFxuICBBQUQ/OiBVaW50OEFycmF5XG4pID0+IENpcGhlcldpdGhPdXRwdXQpICYge1xuICBibG9ja1NpemU6IG51bWJlcjtcbiAgbm9uY2VMZW5ndGg6IG51bWJlcjtcbiAgdGFnTGVuZ3RoOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgQ2lwaGVyQ29uczxUIGV4dGVuZHMgYW55W10+ID0gKGtleTogVWludDhBcnJheSwgLi4uYXJnczogVCkgPT4gQ2lwaGVyO1xuLyoqXG4gKiBXcmFwcyBhIGNpcGhlcjogdmFsaWRhdGVzIGFyZ3MsIGVuc3VyZXMgZW5jcnlwdCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlxuICogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiAqL1xuZXhwb3J0IGNvbnN0IHdyYXBDaXBoZXIgPSA8QyBleHRlbmRzIENpcGhlckNvbnM8YW55PiwgUCBleHRlbmRzIENpcGhlclBhcmFtcz4oXG4gIHBhcmFtczogUCxcbiAgY29uc3RydWN0b3I6IENcbik6IEMgJiBQID0+IHtcbiAgZnVuY3Rpb24gd3JhcHBlZENpcGhlcihrZXk6IFVpbnQ4QXJyYXksIC4uLmFyZ3M6IGFueVtdKTogQ2lwaGVyV2l0aE91dHB1dCB7XG4gICAgLy8gVmFsaWRhdGUga2V5XG4gICAgYWJ5dGVzKGtleSwgdW5kZWZpbmVkLCAna2V5Jyk7XG5cbiAgICAvLyBCaWctRW5kaWFuIGhhcmR3YXJlIGlzIHJhcmUuIEp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIGRlY2lkZXMgdG8gcnVuIGNpcGhlcnM6XG4gICAgaWYgKCFpc0xFKSB0aHJvdyBuZXcgRXJyb3IoJ05vbiBsaXR0bGUtZW5kaWFuIGhhcmR3YXJlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkJyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBub25jZSBpZiBub25jZUxlbmd0aCBpcyBwcmVzZW50XG4gICAgaWYgKHBhcmFtcy5ub25jZUxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBub25jZSA9IGFyZ3NbMF07XG4gICAgICBhYnl0ZXMobm9uY2UsIHBhcmFtcy52YXJTaXplTm9uY2UgPyB1bmRlZmluZWQgOiBwYXJhbXMubm9uY2VMZW5ndGgsICdub25jZScpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIEFBRCBpZiB0YWdMZW5ndGggcHJlc2VudFxuICAgIGNvbnN0IHRhZ2wgPSBwYXJhbXMudGFnTGVuZ3RoO1xuICAgIGlmICh0YWdsICYmIGFyZ3NbMV0gIT09IHVuZGVmaW5lZCkgYWJ5dGVzKGFyZ3NbMV0sIHVuZGVmaW5lZCwgJ0FBRCcpO1xuXG4gICAgY29uc3QgY2lwaGVyID0gY29uc3RydWN0b3Ioa2V5LCAuLi5hcmdzKTtcbiAgICBjb25zdCBjaGVja091dHB1dCA9IChmbkxlbmd0aDogbnVtYmVyLCBvdXRwdXQ/OiBVaW50OEFycmF5KSA9PiB7XG4gICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGZuTGVuZ3RoICE9PSAyKSB0aHJvdyBuZXcgRXJyb3IoJ2NpcGhlciBvdXRwdXQgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICBhYnl0ZXMob3V0cHV0LCB1bmRlZmluZWQsICdvdXRwdXQnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIENyZWF0ZSB3cmFwcGVkIGNpcGhlciB3aXRoIHZhbGlkYXRpb24gYW5kIHNpbmdsZS11c2UgZW5jcnlwdGlvblxuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCB3ckNpcGhlciA9IHtcbiAgICAgIGVuY3J5cHQoZGF0YTogVWludDhBcnJheSwgb3V0cHV0PzogVWludDhBcnJheSkge1xuICAgICAgICBpZiAoY2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBlbmNyeXB0KCkgdHdpY2Ugd2l0aCBzYW1lIGtleSArIG5vbmNlJyk7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGFieXRlcyhkYXRhKTtcbiAgICAgICAgY2hlY2tPdXRwdXQoY2lwaGVyLmVuY3J5cHQubGVuZ3RoLCBvdXRwdXQpO1xuICAgICAgICByZXR1cm4gKGNpcGhlciBhcyBDaXBoZXJXaXRoT3V0cHV0KS5lbmNyeXB0KGRhdGEsIG91dHB1dCk7XG4gICAgICB9LFxuICAgICAgZGVjcnlwdChkYXRhOiBVaW50OEFycmF5LCBvdXRwdXQ/OiBVaW50OEFycmF5KSB7XG4gICAgICAgIGFieXRlcyhkYXRhKTtcbiAgICAgICAgaWYgKHRhZ2wgJiYgZGF0YS5sZW5ndGggPCB0YWdsKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCJjaXBoZXJ0ZXh0XCIgZXhwZWN0ZWQgbGVuZ3RoIGJpZ2dlciB0aGFuIHRhZ0xlbmd0aD0nICsgdGFnbCk7XG4gICAgICAgIGNoZWNrT3V0cHV0KGNpcGhlci5kZWNyeXB0Lmxlbmd0aCwgb3V0cHV0KTtcbiAgICAgICAgcmV0dXJuIChjaXBoZXIgYXMgQ2lwaGVyV2l0aE91dHB1dCkuZGVjcnlwdChkYXRhLCBvdXRwdXQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHdyQ2lwaGVyO1xuICB9XG5cbiAgT2JqZWN0LmFzc2lnbih3cmFwcGVkQ2lwaGVyLCBwYXJhbXMpO1xuICByZXR1cm4gd3JhcHBlZENpcGhlciBhcyBDICYgUDtcbn07XG5cbi8qKiBSZXByZXNlbnRzIHNhbHNhIC8gY2hhY2hhIHN0cmVhbS4gKi9cbmV4cG9ydCB0eXBlIFhvclN0cmVhbSA9IChcbiAga2V5OiBVaW50OEFycmF5LFxuICBub25jZTogVWludDhBcnJheSxcbiAgZGF0YTogVWludDhBcnJheSxcbiAgb3V0cHV0PzogVWludDhBcnJheSxcbiAgY291bnRlcj86IG51bWJlclxuKSA9PiBVaW50OEFycmF5O1xuXG4vKipcbiAqIEJ5IGRlZmF1bHQsIHJldHVybnMgdThhIG9mIGxlbmd0aC5cbiAqIFdoZW4gb3V0IGlzIGF2YWlsYWJsZSwgaXQgY2hlY2tzIGl0IGZvciB2YWxpZGl0eSBhbmQgdXNlcyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE91dHB1dChcbiAgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcixcbiAgb3V0PzogVWludDhBcnJheSxcbiAgb25seUFsaWduZWQgPSB0cnVlXG4pOiBVaW50OEFycmF5IHtcbiAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZXhwZWN0ZWRMZW5ndGgpO1xuICBpZiAob3V0Lmxlbmd0aCAhPT0gZXhwZWN0ZWRMZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1wib3V0cHV0XCIgZXhwZWN0ZWQgVWludDhBcnJheSBvZiBsZW5ndGggJyArIGV4cGVjdGVkTGVuZ3RoICsgJywgZ290OiAnICsgb3V0Lmxlbmd0aFxuICAgICk7XG4gIGlmIChvbmx5QWxpZ25lZCAmJiAhaXNBbGlnbmVkMzIob3V0KSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG91dHB1dCwgbXVzdCBiZSBhbGlnbmVkJyk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1NjRMZW5ndGhzKGRhdGFMZW5ndGg6IG51bWJlciwgYWFkTGVuZ3RoOiBudW1iZXIsIGlzTEU6IGJvb2xlYW4pOiBVaW50OEFycmF5IHtcbiAgYWJvb2woaXNMRSk7XG4gIGNvbnN0IG51bSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgY29uc3QgdmlldyA9IGNyZWF0ZVZpZXcobnVtKTtcbiAgdmlldy5zZXRCaWdVaW50NjQoMCwgQmlnSW50KGFhZExlbmd0aCksIGlzTEUpO1xuICB2aWV3LnNldEJpZ1VpbnQ2NCg4LCBCaWdJbnQoZGF0YUxlbmd0aCksIGlzTEUpO1xuICByZXR1cm4gbnVtO1xufVxuXG4vLyBJcyBieXRlIGFycmF5IGFsaWduZWQgdG8gNCBieXRlIG9mZnNldCAodTMyKT9cbmV4cG9ydCBmdW5jdGlvbiBpc0FsaWduZWQzMihieXRlczogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYnl0ZXMuYnl0ZU9mZnNldCAlIDQgPT09IDA7XG59XG5cbi8vIGNvcHkgYnl0ZXMgdG8gbmV3IHU4YSAoYWxpZ25lZCkuIEJlY2F1c2UgQnVmZmVyLnNsaWNlIGlzIGJyb2tlbi5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Qnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShieXRlcyk7XG59XG5cbi8qKiBDcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgUFJORy4gVXNlcyBpbnRlcm5hbCBPUy1sZXZlbCBgY3J5cHRvLmdldFJhbmRvbVZhbHVlc2AuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tQnl0ZXMoYnl0ZXNMZW5ndGggPSAzMik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBjciA9IHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JyA/IChnbG9iYWxUaGlzIGFzIGFueSkuY3J5cHRvIDogbnVsbDtcbiAgaWYgKHR5cGVvZiBjcj8uZ2V0UmFuZG9tVmFsdWVzICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgcmV0dXJuIGNyLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShieXRlc0xlbmd0aCkpO1xufVxuXG4vKipcbiAqIFRoZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkb2Vzbid0IHdpcGUgY3VycmVudCBzdGF0ZTpcbiAqIGluc3RlYWQsIGl0IGdlbmVyYXRlcyBuZXcgb25lIGJhc2VkIG9uIHByZXZpb3VzIHN0YXRlICsgZW50cm9weS5cbiAqIE5vdCByZXNlZWQvcmVrZXksIHNpbmNlIEFFUyBDVFIgRFJCRyBkb2VzIHJla2V5IG9uIGVhY2ggcmFuZG9tQnl0ZXMsXG4gKiB3aGljaCBpcyBpbiBmYWN0IGByZXNlZWRgLCBzaW5jZSBpdCBjaGFuZ2VzIGNvdW50ZXIgdG9vLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBSRyB7XG4gIGFkZEVudHJvcHkoc2VlZDogVWludDhBcnJheSk6IHZvaWQ7XG4gIHJhbmRvbUJ5dGVzKGxlbmd0aDogbnVtYmVyKTogVWludDhBcnJheTtcbiAgY2xlYW4oKTogdm9pZDtcbn1cblxudHlwZSBSZW1vdmVOb25jZUlubmVyPFQgZXh0ZW5kcyBhbnlbXSwgUmV0PiA9ICgoLi4uYXJnczogVCkgPT4gUmV0KSBleHRlbmRzIChcbiAgYXJnMDogYW55LFxuICBhcmcxOiBhbnksXG4gIC4uLnJlc3Q6IGluZmVyIFJcbikgPT4gYW55XG4gID8gKGtleTogVWludDhBcnJheSwgLi4uYXJnczogUikgPT4gUmV0XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFJlbW92ZU5vbmNlPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBhbnk+ID0gUmVtb3ZlTm9uY2VJbm5lcjxcbiAgUGFyYW1ldGVyczxUPixcbiAgUmV0dXJuVHlwZTxUPlxuPjtcbmV4cG9ydCB0eXBlIENpcGhlcldpdGhOb25jZSA9ICgoXG4gIGtleTogVWludDhBcnJheSxcbiAgbm9uY2U6IFVpbnQ4QXJyYXksXG4gIC4uLmFyZ3M6IGFueVtdXG4pID0+IENpcGhlciB8IEFzeW5jQ2lwaGVyKSAmIHtcbiAgbm9uY2VMZW5ndGg6IG51bWJlcjtcbn07XG5cbi8qKlxuICogVXNlcyBDU1BSRyBmb3Igbm9uY2UsIG5vbmNlIGluamVjdGVkIGluIGNpcGhlcnRleHQuXG4gKiBGb3IgYGVuY3J5cHRgLCBhIGBub25jZUJ5dGVzYC1sZW5ndGggYnVmZmVyIGlzIGZldGNoZWQgZnJvbSBDU1BSTkcgYW5kXG4gKiBwcmVwZW5kZWQgdG8gZW5jcnlwdGVkIGNpcGhlcnRleHQuIEZvciBgZGVjcnlwdGAsIGZpcnN0IGBub25jZUJ5dGVzYCBvZiBjaXBoZXJ0ZXh0XG4gKiBhcmUgdHJlYXRlZCBhcyBub25jZS5cbiAqXG4gKiBOT1RFOiBVbmRlciB0aGUgc2FtZSBrZXksIHVzaW5nIHJhbmRvbSBub25jZXMgKGUuZy4gYG1hbmFnZWROb25jZWApIHdpdGggQUVTLUdDTSBhbmQgQ2hhQ2hhXG4gKiBzaG91bGQgYmUgbGltaXRlZCB0byBgMioqMjNgICg4TSkgbWVzc2FnZXMgdG8gZ2V0IGEgY29sbGlzaW9uIGNoYW5jZSBvZiBgMioqLTUwYC4gU3RyZXRjaGluZyB0byAgKiBgMioqMzJgICg0QikgbWVzc2FnZXMsIGNoYW5jZSB3b3VsZCBiZWNvbWUgYDIqKi0zM2AgLSBzdGlsbCBuZWdsaWdpYmxlLCBidXQgY3JlZXBpbmcgdXAuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZ2NtID0gbWFuYWdlZE5vbmNlKGFlcy5nY20pO1xuICogY29uc3QgY2lwaHIgPSBnY20oa2V5KS5lbmNyeXB0KGRhdGEpO1xuICogY29uc3QgcGxhaW4gPSBnY20oa2V5KS5kZWNyeXB0KGNpcGgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFuYWdlZE5vbmNlPFQgZXh0ZW5kcyBDaXBoZXJXaXRoTm9uY2U+KFxuICBmbjogVCxcbiAgcmFuZG9tQnl0ZXNfOiB0eXBlb2YgcmFuZG9tQnl0ZXMgPSByYW5kb21CeXRlc1xuKTogUmVtb3ZlTm9uY2U8VD4ge1xuICBjb25zdCB7IG5vbmNlTGVuZ3RoIH0gPSBmbjtcbiAgYW51bWJlcihub25jZUxlbmd0aCk7XG4gIGNvbnN0IGFkZE5vbmNlID0gKG5vbmNlOiBVaW50OEFycmF5LCBjaXBoZXJ0ZXh0OiBVaW50OEFycmF5KSA9PiB7XG4gICAgY29uc3Qgb3V0ID0gY29uY2F0Qnl0ZXMobm9uY2UsIGNpcGhlcnRleHQpO1xuICAgIGNpcGhlcnRleHQuZmlsbCgwKTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xuICAvLyBOT1RFOiB3ZSBjYW5ub3Qgc3VwcG9ydCBEU1QgaGVyZSwgaXQgd291bGQgYmUgbWlzdGFrZTpcbiAgLy8gLSB3ZSBkb24ndCBrbm93IGhvdyBtdWNoIGRzdCBsZW5ndGggY2lwaGVyIHJlcXVpcmVzXG4gIC8vIC0gbm9uY2UgbWF5IHVuYWxpZ24gZHN0IGFuZCBicmVhayBldmVyeXRoaW5nXG4gIC8vIC0gd2UgY3JlYXRlIG5ldyB1OGEgYW55d2F5IChjb25jYXRCeXRlcylcbiAgLy8gLSBwcmV2aW91c2x5IHdlIHBhc3NlZCBhbGwgYXJncyB0byBjaXBoZXIsIGJ1dCB0aGF0IHdhcyBtaXN0YWtlIVxuICByZXR1cm4gKChrZXk6IFVpbnQ4QXJyYXksIC4uLmFyZ3M6IGFueVtdKTogYW55ID0+ICh7XG4gICAgZW5jcnlwdChwbGFpbnRleHQ6IFVpbnQ4QXJyYXkpIHtcbiAgICAgIGFieXRlcyhwbGFpbnRleHQpO1xuICAgICAgY29uc3Qgbm9uY2UgPSByYW5kb21CeXRlc18obm9uY2VMZW5ndGgpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkID0gZm4oa2V5LCBub25jZSwgLi4uYXJncykuZW5jcnlwdChwbGFpbnRleHQpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKGVuY3J5cHRlZCBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBlbmNyeXB0ZWQudGhlbigoY3QpID0+IGFkZE5vbmNlKG5vbmNlLCBjdCkpO1xuICAgICAgcmV0dXJuIGFkZE5vbmNlKG5vbmNlLCBlbmNyeXB0ZWQpO1xuICAgIH0sXG4gICAgZGVjcnlwdChjaXBoZXJ0ZXh0OiBVaW50OEFycmF5KSB7XG4gICAgICBhYnl0ZXMoY2lwaGVydGV4dCk7XG4gICAgICBjb25zdCBub25jZSA9IGNpcGhlcnRleHQuc3ViYXJyYXkoMCwgbm9uY2VMZW5ndGgpO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gY2lwaGVydGV4dC5zdWJhcnJheShub25jZUxlbmd0aCk7XG4gICAgICByZXR1cm4gZm4oa2V5LCBub25jZSwgLi4uYXJncykuZGVjcnlwdChkZWNyeXB0ZWQpO1xuICAgIH0sXG4gIH0pKSBhcyBSZW1vdmVOb25jZTxUPjtcbn1cblxuLy8gd29ya2Fyb3VuZCBmb3IgVFMgNS45IGxhbmd1YWdlIG1lc3M6XG5leHBvcnQgdHlwZSBVaW50OEFycmF5QnVmZmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgVWludDhBcnJheS5vZj47XG4iLCAiLyoqXG4gKiBQb2x5MTMwNSAoW1BERl0oaHR0cHM6Ly9jci55cC50by9tYWMvcG9seTEzMDUtMjAwNTAzMjkucGRmKSxcbiAqIFt3aWtpXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qb2x5MTMwNSkpXG4gKiBpcyBhIGZhc3QgYW5kIHBhcmFsbGVsIHNlY3JldC1rZXkgbWVzc2FnZS1hdXRoZW50aWNhdGlvbiBjb2RlIHN1aXRhYmxlIGZvclxuICogYSB3aWRlIHZhcmlldHkgb2YgYXBwbGljYXRpb25zLiBJdCB3YXMgc3RhbmRhcmRpemVkIGluXG4gKiBbUkZDIDg0MzldKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM4NDM5KSBhbmQgaXMgbm93IHVzZWQgaW4gVExTIDEuMy5cbiAqXG4gKiBQb2x5bm9taWFsIE1BQ3MgYXJlIG5vdCBwZXJmZWN0IGZvciBldmVyeSBzaXR1YXRpb246XG4gKiB0aGV5IGxhY2sgUmFuZG9tIEtleSBSb2J1c3RuZXNzOiB0aGUgTUFDIGNhbiBiZSBmb3JnZWQsIGFuZCBjYW4ndCBiZSB1c2VkIGluIFBBS0Ugc2NoZW1lcy5cbiAqIFNlZSBbaW52aXNpYmxlIHNhbGFtYW5kZXJzIGF0dGFja10oaHR0cHM6Ly9rZXltYXRlcmlhbC5uZXQvMjAyMC8wOS8wNy9pbnZpc2libGUtc2FsYW1hbmRlcnMtaW4tYWVzLWdjbS1zaXYvKS5cbiAqIFRvIGNvbWJhdCBpbnZpc2libGUgc2FsYW1hbmRlcnMsIGBoYXNoKGtleSlgIGNhbiBiZSBpbmNsdWRlZCBpbiBjaXBoZXJ0ZXh0LFxuICogaG93ZXZlciwgdGhpcyB3b3VsZCB2aW9sYXRlIGNpcGhlcnRleHQgaW5kaXN0aW5ndWlzaGFiaWxpdHk6XG4gKiBhbiBhdHRhY2tlciB3b3VsZCBrbm93IHdoaWNoIGtleSB3YXMgdXNlZCAtIHNvIGBIS0RGKGtleSwgaSlgXG4gKiBjb3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKlxuICogQ2hlY2sgb3V0IFtvcmlnaW5hbCB3ZWJzaXRlXShodHRwczovL2NyLnlwLnRvL21hYy5odG1sKS5cbiAqIEJhc2VkIG9uIFB1YmxpYyBEb21haW4gW3BvbHkxMzA1LWRvbm5hXShodHRwczovL2dpdGh1Yi5jb20vZmxvb2R5YmVycnkvcG9seTEzMDUtZG9ubmEpLlxuICogQG1vZHVsZVxuICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmltcG9ydCB7XG4gIGFieXRlcywgYWV4aXN0cywgYW91dHB1dCwgYnl0ZXNUb0hleCxcbiAgY2xlYW4sIGNvbmNhdEJ5dGVzLCBjb3B5Qnl0ZXMsIGhleFRvTnVtYmVyLCBudW1iZXJUb0J5dGVzQkUsXG4gIHR5cGUgSUhhc2gyXG59IGZyb20gJy4vdXRpbHMudHMnO1xuXG5mdW5jdGlvbiB1OHRvMTYoYTogVWludDhBcnJheSwgaTogbnVtYmVyKSB7XG4gIHJldHVybiAoYVtpKytdICYgMHhmZikgfCAoKGFbaSsrXSAmIDB4ZmYpIDw8IDgpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvTnVtYmVyTEUoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICByZXR1cm4gaGV4VG9OdW1iZXIoYnl0ZXNUb0hleChVaW50OEFycmF5LmZyb20oYnl0ZXMpLnJldmVyc2UoKSkpO1xufVxuXG4vKiogU21hbGwgdmVyc2lvbiBvZiBgcG9seTEzMDVgIHdpdGhvdXQgbG9vcCB1bnJvbGxpbmcuIFVudXNlZCwgcHJvdmlkZWQgZm9yIGF1ZGl0YWJpbGl0eS4gKi9cbmZ1bmN0aW9uIHBvbHkxMzA1X3NtYWxsKG1zZzogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGFieXRlcyhtc2cpO1xuICBhYnl0ZXMoa2V5LCAzMiwgJ2tleScpO1xuICBjb25zdCBQT1dfMl8xMzBfNSA9IEJpZ0ludCgyKSAqKiBCaWdJbnQoMTMwKSAtIEJpZ0ludCg1KTsgLy8gMl4xMzAtNVxuICBjb25zdCBQT1dfMl8xMjhfMSA9IEJpZ0ludCgyKSAqKiBCaWdJbnQoMTI4KSAtIEJpZ0ludCgxKTsgLy8gMl4xMjgtMVxuICBjb25zdCBDTEFNUF9SID0gQmlnSW50KCcweDBmZmZmZmZjMGZmZmZmZmMwZmZmZmZmYzBmZmZmZmZmJyk7XG4gIGNvbnN0IHIgPSBieXRlc1RvTnVtYmVyTEUoa2V5LnN1YmFycmF5KDAsIDE2KSkgJiBDTEFNUF9SO1xuICBjb25zdCBzID0gYnl0ZXNUb051bWJlckxFKGtleS5zdWJhcnJheSgxNikpO1xuICAvLyBQcm9jZXNzIGJ5IDE2IGJ5dGUgY2h1bmtzXG4gIGxldCBhY2MgPSBCaWdJbnQoMCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAxNikge1xuICAgIGNvbnN0IG0gPSBtc2cuc3ViYXJyYXkoaSwgaSArIDE2KTtcbiAgICBjb25zdCBuID0gYnl0ZXNUb051bWJlckxFKG0pIHwgKEJpZ0ludCgxKSA8PCBCaWdJbnQoOCAqIG0ubGVuZ3RoKSk7XG4gICAgYWNjID0gKChhY2MgKyBuKSAqIHIpICUgUE9XXzJfMTMwXzU7XG4gIH1cbiAgY29uc3QgcmVzID0gKGFjYyArIHMpICYgUE9XXzJfMTI4XzE7XG4gIHJldHVybiBudW1iZXJUb0J5dGVzQkUocmVzLCAxNikucmV2ZXJzZSgpOyAvLyBMRVxufVxuXG4vLyBDYW4gYmUgdXNlZCB0byByZXBsYWNlIGBjb21wdXRlVGFnYCBpbiBjaGFjaGEudHMuIFVudXNlZCwgcHJvdmlkZWQgZm9yIGF1ZGl0YWJpbGl0eS5cbi8vIEB0cy1leHBlY3QtZXJyb3JcbmZ1bmN0aW9uIHBvbHkxMzA1X2NvbXB1dGVUYWdfc21hbGwoXG4gIGF1dGhLZXk6IFVpbnQ4QXJyYXksXG4gIGxlbmd0aHM6IFVpbnQ4QXJyYXksXG4gIGNpcGhlcnRleHQ6IFVpbnQ4QXJyYXksXG4gIEFBRD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCByZXMgPSBbXTtcbiAgY29uc3QgdXBkYXRlUGFkZGVkMiA9IChtc2c6IFVpbnQ4QXJyYXkpID0+IHtcbiAgICByZXMucHVzaChtc2cpO1xuICAgIGNvbnN0IGxlZnRvdmVyID0gbXNnLmxlbmd0aCAlIDE2O1xuICAgIGlmIChsZWZ0b3ZlcikgcmVzLnB1c2gobmV3IFVpbnQ4QXJyYXkoMTYpLnNsaWNlKGxlZnRvdmVyKSk7XG4gIH07XG4gIGlmIChBQUQpIHVwZGF0ZVBhZGRlZDIoQUFEKTtcbiAgdXBkYXRlUGFkZGVkMihjaXBoZXJ0ZXh0KTtcbiAgcmVzLnB1c2gobGVuZ3Rocyk7XG4gIHJldHVybiBwb2x5MTMwNV9zbWFsbChjb25jYXRCeXRlcyguLi5yZXMpLCBhdXRoS2V5KTtcbn1cblxuLyoqIFBvbHkxMzA1IGNsYXNzLiBQcmVmZXIgcG9seTEzMDUoKSBmdW5jdGlvbiBpbnN0ZWFkLiAqL1xuZXhwb3J0IGNsYXNzIFBvbHkxMzA1IGltcGxlbWVudHMgSUhhc2gyIHtcbiAgcmVhZG9ubHkgYmxvY2tMZW4gPSAxNjtcbiAgcmVhZG9ubHkgb3V0cHV0TGVuID0gMTY7XG4gIHByaXZhdGUgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICBwcml2YXRlIHIgPSBuZXcgVWludDE2QXJyYXkoMTApOyAvLyBBbGxvY2F0aW5nIDEgYXJyYXkgd2l0aCAuc3ViYXJyYXkoKSBoZXJlIGlzIHNsb3dlciB0aGFuIDNcbiAgcHJpdmF0ZSBoID0gbmV3IFVpbnQxNkFycmF5KDEwKTtcbiAgcHJpdmF0ZSBwYWQgPSBuZXcgVWludDE2QXJyYXkoOCk7XG4gIHByaXZhdGUgcG9zID0gMDtcbiAgcHJvdGVjdGVkIGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gQ2FuIGJlIHNwZWVkLXVwIHVzaW5nIEJpZ1VpbnQ2NEFycmF5LCBhdCB0aGUgY29zdCBvZiBjb21wbGV4aXR5XG4gIGNvbnN0cnVjdG9yKGtleTogVWludDhBcnJheSkge1xuICAgIGtleSA9IGNvcHlCeXRlcyhhYnl0ZXMoa2V5LCAzMiwgJ2tleScpKTtcbiAgICBjb25zdCB0MCA9IHU4dG8xNihrZXksIDApO1xuICAgIGNvbnN0IHQxID0gdTh0bzE2KGtleSwgMik7XG4gICAgY29uc3QgdDIgPSB1OHRvMTYoa2V5LCA0KTtcbiAgICBjb25zdCB0MyA9IHU4dG8xNihrZXksIDYpO1xuICAgIGNvbnN0IHQ0ID0gdTh0bzE2KGtleSwgOCk7XG4gICAgY29uc3QgdDUgPSB1OHRvMTYoa2V5LCAxMCk7XG4gICAgY29uc3QgdDYgPSB1OHRvMTYoa2V5LCAxMik7XG4gICAgY29uc3QgdDcgPSB1OHRvMTYoa2V5LCAxNCk7XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvb2R5YmVycnkvcG9seTEzMDUtZG9ubmEvYmxvYi9lNmFkNmUwOTFkMzBkN2Y0ZWMyZDRmOTc4YmUxZmNmY2JjZTcyNzgxL3BvbHkxMzA1LWRvbm5hLTE2LmgjTDQ3XG4gICAgdGhpcy5yWzBdID0gdDAgJiAweDFmZmY7XG4gICAgdGhpcy5yWzFdID0gKCh0MCA+Pj4gMTMpIHwgKHQxIDw8IDMpKSAmIDB4MWZmZjtcbiAgICB0aGlzLnJbMl0gPSAoKHQxID4+PiAxMCkgfCAodDIgPDwgNikpICYgMHgxZjAzO1xuICAgIHRoaXMuclszXSA9ICgodDIgPj4+IDcpIHwgKHQzIDw8IDkpKSAmIDB4MWZmZjtcbiAgICB0aGlzLnJbNF0gPSAoKHQzID4+PiA0KSB8ICh0NCA8PCAxMikpICYgMHgwMGZmO1xuICAgIHRoaXMucls1XSA9ICh0NCA+Pj4gMSkgJiAweDFmZmU7XG4gICAgdGhpcy5yWzZdID0gKCh0NCA+Pj4gMTQpIHwgKHQ1IDw8IDIpKSAmIDB4MWZmZjtcbiAgICB0aGlzLnJbN10gPSAoKHQ1ID4+PiAxMSkgfCAodDYgPDwgNSkpICYgMHgxZjgxO1xuICAgIHRoaXMucls4XSA9ICgodDYgPj4+IDgpIHwgKHQ3IDw8IDgpKSAmIDB4MWZmZjtcbiAgICB0aGlzLnJbOV0gPSAodDcgPj4+IDUpICYgMHgwMDdmO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB0aGlzLnBhZFtpXSA9IHU4dG8xNihrZXksIDE2ICsgMiAqIGkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzKGRhdGE6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyLCBpc0xhc3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IGhpYml0ID0gaXNMYXN0ID8gMCA6IDEgPDwgMTE7XG4gICAgY29uc3QgeyBoLCByIH0gPSB0aGlzO1xuICAgIGNvbnN0IHIwID0gclswXTtcbiAgICBjb25zdCByMSA9IHJbMV07XG4gICAgY29uc3QgcjIgPSByWzJdO1xuICAgIGNvbnN0IHIzID0gclszXTtcbiAgICBjb25zdCByNCA9IHJbNF07XG4gICAgY29uc3QgcjUgPSByWzVdO1xuICAgIGNvbnN0IHI2ID0gcls2XTtcbiAgICBjb25zdCByNyA9IHJbN107XG4gICAgY29uc3QgcjggPSByWzhdO1xuICAgIGNvbnN0IHI5ID0gcls5XTtcblxuICAgIGNvbnN0IHQwID0gdTh0bzE2KGRhdGEsIG9mZnNldCArIDApO1xuICAgIGNvbnN0IHQxID0gdTh0bzE2KGRhdGEsIG9mZnNldCArIDIpO1xuICAgIGNvbnN0IHQyID0gdTh0bzE2KGRhdGEsIG9mZnNldCArIDQpO1xuICAgIGNvbnN0IHQzID0gdTh0bzE2KGRhdGEsIG9mZnNldCArIDYpO1xuICAgIGNvbnN0IHQ0ID0gdTh0bzE2KGRhdGEsIG9mZnNldCArIDgpO1xuICAgIGNvbnN0IHQ1ID0gdTh0bzE2KGRhdGEsIG9mZnNldCArIDEwKTtcbiAgICBjb25zdCB0NiA9IHU4dG8xNihkYXRhLCBvZmZzZXQgKyAxMik7XG4gICAgY29uc3QgdDcgPSB1OHRvMTYoZGF0YSwgb2Zmc2V0ICsgMTQpO1xuXG4gICAgbGV0IGgwID0gaFswXSArICh0MCAmIDB4MWZmZik7XG4gICAgbGV0IGgxID0gaFsxXSArICgoKHQwID4+PiAxMykgfCAodDEgPDwgMykpICYgMHgxZmZmKTtcbiAgICBsZXQgaDIgPSBoWzJdICsgKCgodDEgPj4+IDEwKSB8ICh0MiA8PCA2KSkgJiAweDFmZmYpO1xuICAgIGxldCBoMyA9IGhbM10gKyAoKCh0MiA+Pj4gNykgfCAodDMgPDwgOSkpICYgMHgxZmZmKTtcbiAgICBsZXQgaDQgPSBoWzRdICsgKCgodDMgPj4+IDQpIHwgKHQ0IDw8IDEyKSkgJiAweDFmZmYpO1xuICAgIGxldCBoNSA9IGhbNV0gKyAoKHQ0ID4+PiAxKSAmIDB4MWZmZik7XG4gICAgbGV0IGg2ID0gaFs2XSArICgoKHQ0ID4+PiAxNCkgfCAodDUgPDwgMikpICYgMHgxZmZmKTtcbiAgICBsZXQgaDcgPSBoWzddICsgKCgodDUgPj4+IDExKSB8ICh0NiA8PCA1KSkgJiAweDFmZmYpO1xuICAgIGxldCBoOCA9IGhbOF0gKyAoKCh0NiA+Pj4gOCkgfCAodDcgPDwgOCkpICYgMHgxZmZmKTtcbiAgICBsZXQgaDkgPSBoWzldICsgKCh0NyA+Pj4gNSkgfCBoaWJpdCk7XG5cbiAgICBsZXQgYyA9IDA7XG5cbiAgICBsZXQgZDAgPSBjICsgaDAgKiByMCArIGgxICogKDUgKiByOSkgKyBoMiAqICg1ICogcjgpICsgaDMgKiAoNSAqIHI3KSArIGg0ICogKDUgKiByNik7XG4gICAgYyA9IGQwID4+PiAxMztcbiAgICBkMCAmPSAweDFmZmY7XG4gICAgZDAgKz0gaDUgKiAoNSAqIHI1KSArIGg2ICogKDUgKiByNCkgKyBoNyAqICg1ICogcjMpICsgaDggKiAoNSAqIHIyKSArIGg5ICogKDUgKiByMSk7XG4gICAgYyArPSBkMCA+Pj4gMTM7XG4gICAgZDAgJj0gMHgxZmZmO1xuXG4gICAgbGV0IGQxID0gYyArIGgwICogcjEgKyBoMSAqIHIwICsgaDIgKiAoNSAqIHI5KSArIGgzICogKDUgKiByOCkgKyBoNCAqICg1ICogcjcpO1xuICAgIGMgPSBkMSA+Pj4gMTM7XG4gICAgZDEgJj0gMHgxZmZmO1xuICAgIGQxICs9IGg1ICogKDUgKiByNikgKyBoNiAqICg1ICogcjUpICsgaDcgKiAoNSAqIHI0KSArIGg4ICogKDUgKiByMykgKyBoOSAqICg1ICogcjIpO1xuICAgIGMgKz0gZDEgPj4+IDEzO1xuICAgIGQxICY9IDB4MWZmZjtcblxuICAgIGxldCBkMiA9IGMgKyBoMCAqIHIyICsgaDEgKiByMSArIGgyICogcjAgKyBoMyAqICg1ICogcjkpICsgaDQgKiAoNSAqIHI4KTtcbiAgICBjID0gZDIgPj4+IDEzO1xuICAgIGQyICY9IDB4MWZmZjtcbiAgICBkMiArPSBoNSAqICg1ICogcjcpICsgaDYgKiAoNSAqIHI2KSArIGg3ICogKDUgKiByNSkgKyBoOCAqICg1ICogcjQpICsgaDkgKiAoNSAqIHIzKTtcbiAgICBjICs9IGQyID4+PiAxMztcbiAgICBkMiAmPSAweDFmZmY7XG5cbiAgICBsZXQgZDMgPSBjICsgaDAgKiByMyArIGgxICogcjIgKyBoMiAqIHIxICsgaDMgKiByMCArIGg0ICogKDUgKiByOSk7XG4gICAgYyA9IGQzID4+PiAxMztcbiAgICBkMyAmPSAweDFmZmY7XG4gICAgZDMgKz0gaDUgKiAoNSAqIHI4KSArIGg2ICogKDUgKiByNykgKyBoNyAqICg1ICogcjYpICsgaDggKiAoNSAqIHI1KSArIGg5ICogKDUgKiByNCk7XG4gICAgYyArPSBkMyA+Pj4gMTM7XG4gICAgZDMgJj0gMHgxZmZmO1xuXG4gICAgbGV0IGQ0ID0gYyArIGgwICogcjQgKyBoMSAqIHIzICsgaDIgKiByMiArIGgzICogcjEgKyBoNCAqIHIwO1xuICAgIGMgPSBkNCA+Pj4gMTM7XG4gICAgZDQgJj0gMHgxZmZmO1xuICAgIGQ0ICs9IGg1ICogKDUgKiByOSkgKyBoNiAqICg1ICogcjgpICsgaDcgKiAoNSAqIHI3KSArIGg4ICogKDUgKiByNikgKyBoOSAqICg1ICogcjUpO1xuICAgIGMgKz0gZDQgPj4+IDEzO1xuICAgIGQ0ICY9IDB4MWZmZjtcblxuICAgIGxldCBkNSA9IGMgKyBoMCAqIHI1ICsgaDEgKiByNCArIGgyICogcjMgKyBoMyAqIHIyICsgaDQgKiByMTtcbiAgICBjID0gZDUgPj4+IDEzO1xuICAgIGQ1ICY9IDB4MWZmZjtcbiAgICBkNSArPSBoNSAqIHIwICsgaDYgKiAoNSAqIHI5KSArIGg3ICogKDUgKiByOCkgKyBoOCAqICg1ICogcjcpICsgaDkgKiAoNSAqIHI2KTtcbiAgICBjICs9IGQ1ID4+PiAxMztcbiAgICBkNSAmPSAweDFmZmY7XG5cbiAgICBsZXQgZDYgPSBjICsgaDAgKiByNiArIGgxICogcjUgKyBoMiAqIHI0ICsgaDMgKiByMyArIGg0ICogcjI7XG4gICAgYyA9IGQ2ID4+PiAxMztcbiAgICBkNiAmPSAweDFmZmY7XG4gICAgZDYgKz0gaDUgKiByMSArIGg2ICogcjAgKyBoNyAqICg1ICogcjkpICsgaDggKiAoNSAqIHI4KSArIGg5ICogKDUgKiByNyk7XG4gICAgYyArPSBkNiA+Pj4gMTM7XG4gICAgZDYgJj0gMHgxZmZmO1xuXG4gICAgbGV0IGQ3ID0gYyArIGgwICogcjcgKyBoMSAqIHI2ICsgaDIgKiByNSArIGgzICogcjQgKyBoNCAqIHIzO1xuICAgIGMgPSBkNyA+Pj4gMTM7XG4gICAgZDcgJj0gMHgxZmZmO1xuICAgIGQ3ICs9IGg1ICogcjIgKyBoNiAqIHIxICsgaDcgKiByMCArIGg4ICogKDUgKiByOSkgKyBoOSAqICg1ICogcjgpO1xuICAgIGMgKz0gZDcgPj4+IDEzO1xuICAgIGQ3ICY9IDB4MWZmZjtcblxuICAgIGxldCBkOCA9IGMgKyBoMCAqIHI4ICsgaDEgKiByNyArIGgyICogcjYgKyBoMyAqIHI1ICsgaDQgKiByNDtcbiAgICBjID0gZDggPj4+IDEzO1xuICAgIGQ4ICY9IDB4MWZmZjtcbiAgICBkOCArPSBoNSAqIHIzICsgaDYgKiByMiArIGg3ICogcjEgKyBoOCAqIHIwICsgaDkgKiAoNSAqIHI5KTtcbiAgICBjICs9IGQ4ID4+PiAxMztcbiAgICBkOCAmPSAweDFmZmY7XG5cbiAgICBsZXQgZDkgPSBjICsgaDAgKiByOSArIGgxICogcjggKyBoMiAqIHI3ICsgaDMgKiByNiArIGg0ICogcjU7XG4gICAgYyA9IGQ5ID4+PiAxMztcbiAgICBkOSAmPSAweDFmZmY7XG4gICAgZDkgKz0gaDUgKiByNCArIGg2ICogcjMgKyBoNyAqIHIyICsgaDggKiByMSArIGg5ICogcjA7XG4gICAgYyArPSBkOSA+Pj4gMTM7XG4gICAgZDkgJj0gMHgxZmZmO1xuXG4gICAgYyA9ICgoYyA8PCAyKSArIGMpIHwgMDtcbiAgICBjID0gKGMgKyBkMCkgfCAwO1xuICAgIGQwID0gYyAmIDB4MWZmZjtcbiAgICBjID0gYyA+Pj4gMTM7XG4gICAgZDEgKz0gYztcblxuICAgIGhbMF0gPSBkMDtcbiAgICBoWzFdID0gZDE7XG4gICAgaFsyXSA9IGQyO1xuICAgIGhbM10gPSBkMztcbiAgICBoWzRdID0gZDQ7XG4gICAgaFs1XSA9IGQ1O1xuICAgIGhbNl0gPSBkNjtcbiAgICBoWzddID0gZDc7XG4gICAgaFs4XSA9IGQ4O1xuICAgIGhbOV0gPSBkOTtcbiAgfVxuXG4gIHByaXZhdGUgZmluYWxpemUoKSB7XG4gICAgY29uc3QgeyBoLCBwYWQgfSA9IHRoaXM7XG4gICAgY29uc3QgZyA9IG5ldyBVaW50MTZBcnJheSgxMCk7XG4gICAgbGV0IGMgPSBoWzFdID4+PiAxMztcbiAgICBoWzFdICY9IDB4MWZmZjtcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IDEwOyBpKyspIHtcbiAgICAgIGhbaV0gKz0gYztcbiAgICAgIGMgPSBoW2ldID4+PiAxMztcbiAgICAgIGhbaV0gJj0gMHgxZmZmO1xuICAgIH1cbiAgICBoWzBdICs9IGMgKiA1O1xuICAgIGMgPSBoWzBdID4+PiAxMztcbiAgICBoWzBdICY9IDB4MWZmZjtcbiAgICBoWzFdICs9IGM7XG4gICAgYyA9IGhbMV0gPj4+IDEzO1xuICAgIGhbMV0gJj0gMHgxZmZmO1xuICAgIGhbMl0gKz0gYztcblxuICAgIGdbMF0gPSBoWzBdICsgNTtcbiAgICBjID0gZ1swXSA+Pj4gMTM7XG4gICAgZ1swXSAmPSAweDFmZmY7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7XG4gICAgICBnW2ldID0gaFtpXSArIGM7XG4gICAgICBjID0gZ1tpXSA+Pj4gMTM7XG4gICAgICBnW2ldICY9IDB4MWZmZjtcbiAgICB9XG4gICAgZ1s5XSAtPSAxIDw8IDEzO1xuXG4gICAgbGV0IG1hc2sgPSAoYyBeIDEpIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIGdbaV0gJj0gbWFzaztcbiAgICBtYXNrID0gfm1hc2s7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSBoW2ldID0gKGhbaV0gJiBtYXNrKSB8IGdbaV07XG4gICAgaFswXSA9IChoWzBdIHwgKGhbMV0gPDwgMTMpKSAmIDB4ZmZmZjtcbiAgICBoWzFdID0gKChoWzFdID4+PiAzKSB8IChoWzJdIDw8IDEwKSkgJiAweGZmZmY7XG4gICAgaFsyXSA9ICgoaFsyXSA+Pj4gNikgfCAoaFszXSA8PCA3KSkgJiAweGZmZmY7XG4gICAgaFszXSA9ICgoaFszXSA+Pj4gOSkgfCAoaFs0XSA8PCA0KSkgJiAweGZmZmY7XG4gICAgaFs0XSA9ICgoaFs0XSA+Pj4gMTIpIHwgKGhbNV0gPDwgMSkgfCAoaFs2XSA8PCAxNCkpICYgMHhmZmZmO1xuICAgIGhbNV0gPSAoKGhbNl0gPj4+IDIpIHwgKGhbN10gPDwgMTEpKSAmIDB4ZmZmZjtcbiAgICBoWzZdID0gKChoWzddID4+PiA1KSB8IChoWzhdIDw8IDgpKSAmIDB4ZmZmZjtcbiAgICBoWzddID0gKChoWzhdID4+PiA4KSB8IChoWzldIDw8IDUpKSAmIDB4ZmZmZjtcblxuICAgIGxldCBmID0gaFswXSArIHBhZFswXTtcbiAgICBoWzBdID0gZiAmIDB4ZmZmZjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDg7IGkrKykge1xuICAgICAgZiA9ICgoKGhbaV0gKyBwYWRbaV0pIHwgMCkgKyAoZiA+Pj4gMTYpKSB8IDA7XG4gICAgICBoW2ldID0gZiAmIDB4ZmZmZjtcbiAgICB9XG4gICAgY2xlYW4oZyk7XG4gIH1cbiAgdXBkYXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiB0aGlzIHtcbiAgICBhZXhpc3RzKHRoaXMpO1xuICAgIGFieXRlcyhkYXRhKTtcbiAgICBkYXRhID0gY29weUJ5dGVzKGRhdGEpO1xuICAgIGNvbnN0IHsgYnVmZmVyLCBibG9ja0xlbiB9ID0gdGhpcztcbiAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcblxuICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IGxlbjsgKSB7XG4gICAgICBjb25zdCB0YWtlID0gTWF0aC5taW4oYmxvY2tMZW4gLSB0aGlzLnBvcywgbGVuIC0gcG9zKTtcbiAgICAgIC8vIEZhc3QgcGF0aDogd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYmxvY2sgaW4gaW5wdXRcbiAgICAgIGlmICh0YWtlID09PSBibG9ja0xlbikge1xuICAgICAgICBmb3IgKDsgYmxvY2tMZW4gPD0gbGVuIC0gcG9zOyBwb3MgKz0gYmxvY2tMZW4pIHRoaXMucHJvY2VzcyhkYXRhLCBwb3MpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJ1ZmZlci5zZXQoZGF0YS5zdWJhcnJheShwb3MsIHBvcyArIHRha2UpLCB0aGlzLnBvcyk7XG4gICAgICB0aGlzLnBvcyArPSB0YWtlO1xuICAgICAgcG9zICs9IHRha2U7XG4gICAgICBpZiAodGhpcy5wb3MgPT09IGJsb2NrTGVuKSB7XG4gICAgICAgIHRoaXMucHJvY2VzcyhidWZmZXIsIDAsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFuKHRoaXMuaCwgdGhpcy5yLCB0aGlzLmJ1ZmZlciwgdGhpcy5wYWQpO1xuICB9XG4gIGRpZ2VzdEludG8ob3V0OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgYWV4aXN0cyh0aGlzKTtcbiAgICBhb3V0cHV0KG91dCwgdGhpcyk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgY29uc3QgeyBidWZmZXIsIGggfSA9IHRoaXM7XG4gICAgbGV0IHsgcG9zIH0gPSB0aGlzO1xuICAgIGlmIChwb3MpIHtcbiAgICAgIGJ1ZmZlcltwb3MrK10gPSAxO1xuICAgICAgZm9yICg7IHBvcyA8IDE2OyBwb3MrKykgYnVmZmVyW3Bvc10gPSAwO1xuICAgICAgdGhpcy5wcm9jZXNzKGJ1ZmZlciwgMCwgdHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuZmluYWxpemUoKTtcbiAgICBsZXQgb3BvcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgIG91dFtvcG9zKytdID0gaFtpXSA+Pj4gMDtcbiAgICAgIG91dFtvcG9zKytdID0gaFtpXSA+Pj4gODtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICBkaWdlc3QoKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgeyBidWZmZXIsIG91dHB1dExlbiB9ID0gdGhpcztcbiAgICB0aGlzLmRpZ2VzdEludG8oYnVmZmVyKTtcbiAgICBjb25zdCByZXMgPSBidWZmZXIuc2xpY2UoMCwgb3V0cHV0TGVuKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENIYXNoID0gUmV0dXJuVHlwZTx0eXBlb2Ygd3JhcENvbnN0cnVjdG9yV2l0aEtleT47XG5leHBvcnQgZnVuY3Rpb24gd3JhcENvbnN0cnVjdG9yV2l0aEtleTxIIGV4dGVuZHMgSUhhc2gyPihcbiAgaGFzaENvbnM6IChrZXk6IFVpbnQ4QXJyYXkpID0+IEhcbik6IHtcbiAgKG1zZzogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheTtcbiAgb3V0cHV0TGVuOiBudW1iZXI7XG4gIGJsb2NrTGVuOiBudW1iZXI7XG4gIGNyZWF0ZShrZXk6IFVpbnQ4QXJyYXkpOiBIO1xufSB7XG4gIGNvbnN0IGhhc2hDID0gKG1zZzogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSA9PlxuICAgIGhhc2hDb25zKGtleSkudXBkYXRlKG1zZykuZGlnZXN0KCk7XG4gIGNvbnN0IHRtcCA9IGhhc2hDb25zKG5ldyBVaW50OEFycmF5KDMyKSk7IC8vIHRtcCBhcnJheSwgdXNlZCBqdXN0IG9uY2UgYmVsb3dcbiAgaGFzaEMub3V0cHV0TGVuID0gdG1wLm91dHB1dExlbjtcbiAgaGFzaEMuYmxvY2tMZW4gPSB0bXAuYmxvY2tMZW47XG4gIGhhc2hDLmNyZWF0ZSA9IChrZXk6IFVpbnQ4QXJyYXkpID0+IGhhc2hDb25zKGtleSk7XG4gIHJldHVybiBoYXNoQztcbn1cblxuLyoqIFBvbHkxMzA1IE1BQyBmcm9tIFJGQyA4NDM5LiAqL1xuZXhwb3J0IGNvbnN0IHBvbHkxMzA1OiBDSGFzaCA9IC8qKiBAX19QVVJFX18gKi8gKCgpID0+XG4gIHdyYXBDb25zdHJ1Y3RvcldpdGhLZXkoKGtleSkgPT4gbmV3IFBvbHkxMzA1KGtleSkpKSgpO1xuIiwgIi8qKlxuICogSEtERiAoUkZDIDU4NjkpOiBleHRyYWN0ICsgZXhwYW5kIGluIG9uZSBzdGVwLlxuICogU2VlIGh0dHBzOi8vc29hdG9rLmJsb2cvMjAyMS8xMS8xNy91bmRlcnN0YW5kaW5nLWhrZGYvLlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBobWFjIH0gZnJvbSAnLi9obWFjLnRzJztcbmltcG9ydCB7IGFieXRlcywgYWhhc2gsIGFudW1iZXIsIHR5cGUgQ0hhc2gsIGNsZWFuIH0gZnJvbSAnLi91dGlscy50cyc7XG5cbi8qKlxuICogSEtERi1leHRyYWN0IGZyb20gc3BlYy4gTGVzcyBpbXBvcnRhbnQgcGFydC4gYEhLREYtRXh0cmFjdChJS00sIHNhbHQpIC0+IFBSS2BcbiAqIEFyZ3VtZW50cyBwb3NpdGlvbiBkaWZmZXJzIGZyb20gc3BlYyAoSUtNIGlzIGZpcnN0IG9uZSwgc2luY2UgaXQgaXMgbm90IG9wdGlvbmFsKVxuICogQHBhcmFtIGhhc2ggLSBoYXNoIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgdXNlZCAoZS5nLiBzaGEyNTYpXG4gKiBAcGFyYW0gaWttIC0gaW5wdXQga2V5aW5nIG1hdGVyaWFsLCB0aGUgaW5pdGlhbCBrZXlcbiAqIEBwYXJhbSBzYWx0IC0gb3B0aW9uYWwgc2FsdCB2YWx1ZSAoYSBub24tc2VjcmV0IHJhbmRvbSB2YWx1ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3QoaGFzaDogQ0hhc2gsIGlrbTogVWludDhBcnJheSwgc2FsdD86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgYWhhc2goaGFzaCk7XG4gIC8vIE5PVEU6IHNvbWUgbGlicmFyaWVzIHRyZWF0IHplcm8tbGVuZ3RoIGFycmF5IGFzICdub3QgcHJvdmlkZWQnO1xuICAvLyB3ZSBkb24ndCwgc2luY2Ugd2UgaGF2ZSB1bmRlZmluZWQgYXMgJ25vdCBwcm92aWRlZCdcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1J1c3RDcnlwdG8vS0RGcy9pc3N1ZXMvMTVcbiAgaWYgKHNhbHQgPT09IHVuZGVmaW5lZCkgc2FsdCA9IG5ldyBVaW50OEFycmF5KGhhc2gub3V0cHV0TGVuKTtcbiAgcmV0dXJuIGhtYWMoaGFzaCwgc2FsdCwgaWttKTtcbn1cblxuY29uc3QgSEtERl9DT1VOVEVSID0gLyogQF9fUFVSRV9fICovIFVpbnQ4QXJyYXkub2YoMCk7XG5jb25zdCBFTVBUWV9CVUZGRVIgPSAvKiBAX19QVVJFX18gKi8gVWludDhBcnJheS5vZigpO1xuXG4vKipcbiAqIEhLREYtZXhwYW5kIGZyb20gdGhlIHNwZWMuIFRoZSBtb3N0IGltcG9ydGFudCBwYXJ0LiBgSEtERi1FeHBhbmQoUFJLLCBpbmZvLCBMKSAtPiBPS01gXG4gKiBAcGFyYW0gaGFzaCAtIGhhc2ggZnVuY3Rpb24gdGhhdCB3b3VsZCBiZSB1c2VkIChlLmcuIHNoYTI1NilcbiAqIEBwYXJhbSBwcmsgLSBhIHBzZXVkb3JhbmRvbSBrZXkgb2YgYXQgbGVhc3QgSGFzaExlbiBvY3RldHMgKHVzdWFsbHksIHRoZSBvdXRwdXQgZnJvbSB0aGUgZXh0cmFjdCBzdGVwKVxuICogQHBhcmFtIGluZm8gLSBvcHRpb25hbCBjb250ZXh0IGFuZCBhcHBsaWNhdGlvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAoY2FuIGJlIGEgemVyby1sZW5ndGggc3RyaW5nKVxuICogQHBhcmFtIGxlbmd0aCAtIGxlbmd0aCBvZiBvdXRwdXQga2V5aW5nIG1hdGVyaWFsIGluIGJ5dGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmQoXG4gIGhhc2g6IENIYXNoLFxuICBwcms6IFVpbnQ4QXJyYXksXG4gIGluZm8/OiBVaW50OEFycmF5LFxuICBsZW5ndGg6IG51bWJlciA9IDMyXG4pOiBVaW50OEFycmF5IHtcbiAgYWhhc2goaGFzaCk7XG4gIGFudW1iZXIobGVuZ3RoLCAnbGVuZ3RoJyk7XG4gIGNvbnN0IG9sZW4gPSBoYXNoLm91dHB1dExlbjtcbiAgaWYgKGxlbmd0aCA+IDI1NSAqIG9sZW4pIHRocm93IG5ldyBFcnJvcignTGVuZ3RoIG11c3QgYmUgPD0gMjU1Kkhhc2hMZW4nKTtcbiAgY29uc3QgYmxvY2tzID0gTWF0aC5jZWlsKGxlbmd0aCAvIG9sZW4pO1xuICBpZiAoaW5mbyA9PT0gdW5kZWZpbmVkKSBpbmZvID0gRU1QVFlfQlVGRkVSO1xuICBlbHNlIGFieXRlcyhpbmZvLCB1bmRlZmluZWQsICdpbmZvJyk7XG4gIC8vIGZpcnN0IEwoZW5ndGgpIG9jdGV0cyBvZiBUXG4gIGNvbnN0IG9rbSA9IG5ldyBVaW50OEFycmF5KGJsb2NrcyAqIG9sZW4pO1xuICAvLyBSZS11c2UgSE1BQyBpbnN0YW5jZSBiZXR3ZWVuIGJsb2Nrc1xuICBjb25zdCBITUFDID0gaG1hYy5jcmVhdGUoaGFzaCwgcHJrKTtcbiAgY29uc3QgSE1BQ1RtcCA9IEhNQUMuX2Nsb25lSW50bygpO1xuICBjb25zdCBUID0gbmV3IFVpbnQ4QXJyYXkoSE1BQy5vdXRwdXRMZW4pO1xuICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IGJsb2NrczsgY291bnRlcisrKSB7XG4gICAgSEtERl9DT1VOVEVSWzBdID0gY291bnRlciArIDE7XG4gICAgLy8gVCgwKSA9IGVtcHR5IHN0cmluZyAoemVybyBsZW5ndGgpXG4gICAgLy8gVChOKSA9IEhNQUMtSGFzaChQUkssIFQoTi0xKSB8IGluZm8gfCBOKVxuICAgIEhNQUNUbXAudXBkYXRlKGNvdW50ZXIgPT09IDAgPyBFTVBUWV9CVUZGRVIgOiBUKVxuICAgICAgLnVwZGF0ZShpbmZvKVxuICAgICAgLnVwZGF0ZShIS0RGX0NPVU5URVIpXG4gICAgICAuZGlnZXN0SW50byhUKTtcbiAgICBva20uc2V0KFQsIG9sZW4gKiBjb3VudGVyKTtcbiAgICBITUFDLl9jbG9uZUludG8oSE1BQ1RtcCk7XG4gIH1cbiAgSE1BQy5kZXN0cm95KCk7XG4gIEhNQUNUbXAuZGVzdHJveSgpO1xuICBjbGVhbihULCBIS0RGX0NPVU5URVIpO1xuICByZXR1cm4gb2ttLnNsaWNlKDAsIGxlbmd0aCk7XG59XG5cbi8qKlxuICogSEtERiAoUkZDIDU4NjkpOiBkZXJpdmUga2V5cyBmcm9tIGFuIGluaXRpYWwgaW5wdXQuXG4gKiBDb21iaW5lcyBoa2RmX2V4dHJhY3QgKyBoa2RmX2V4cGFuZCBpbiBvbmUgc3RlcFxuICogQHBhcmFtIGhhc2ggLSBoYXNoIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgdXNlZCAoZS5nLiBzaGEyNTYpXG4gKiBAcGFyYW0gaWttIC0gaW5wdXQga2V5aW5nIG1hdGVyaWFsLCB0aGUgaW5pdGlhbCBrZXlcbiAqIEBwYXJhbSBzYWx0IC0gb3B0aW9uYWwgc2FsdCB2YWx1ZSAoYSBub24tc2VjcmV0IHJhbmRvbSB2YWx1ZSlcbiAqIEBwYXJhbSBpbmZvIC0gb3B0aW9uYWwgY29udGV4dCBhbmQgYXBwbGljYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gKGNhbiBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZylcbiAqIEBwYXJhbSBsZW5ndGggLSBsZW5ndGggb2Ygb3V0cHV0IGtleWluZyBtYXRlcmlhbCBpbiBieXRlc1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGhrZGYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL2hrZGYnO1xuICogaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyJztcbiAqIGltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscyc7XG4gKiBjb25zdCBpbnB1dEtleSA9IHJhbmRvbUJ5dGVzKDMyKTtcbiAqIGNvbnN0IHNhbHQgPSByYW5kb21CeXRlcygzMik7XG4gKiBjb25zdCBpbmZvID0gJ2FwcGxpY2F0aW9uLWtleSc7XG4gKiBjb25zdCBoazEgPSBoa2RmKHNoYTI1NiwgaW5wdXRLZXksIHNhbHQsIGluZm8sIDMyKTtcbiAqL1xuZXhwb3J0IGNvbnN0IGhrZGYgPSAoXG4gIGhhc2g6IENIYXNoLFxuICBpa206IFVpbnQ4QXJyYXksXG4gIHNhbHQ6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQsXG4gIGluZm86IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQsXG4gIGxlbmd0aDogbnVtYmVyXG4pOiBVaW50OEFycmF5ID0+IGV4cGFuZChoYXNoLCBleHRyYWN0KGhhc2gsIGlrbSwgc2FsdCksIGluZm8sIGxlbmd0aCk7XG4iLCAiLyohIHNjdXJlLWJhc2UgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlcjxGLCBUPiB7XG4gIGVuY29kZShmcm9tOiBGKTogVDtcbiAgZGVjb2RlKHRvOiBUKTogRjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCeXRlc0NvZGVyIGV4dGVuZHMgQ29kZXI8VWludDhBcnJheSwgc3RyaW5nPiB7XG4gIGVuY29kZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHN0cmluZztcbiAgZGVjb2RlOiAoc3RyOiBzdHJpbmcpID0+IFVpbnQ4QXJyYXk7XG59XG5cbmZ1bmN0aW9uIGlzQnl0ZXMoYTogdW5rbm93bik6IGEgaXMgVWludDhBcnJheSB7XG4gIHJldHVybiBhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCAoQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ1VpbnQ4QXJyYXknKTtcbn1cbi8qKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBVaW50OEFycmF5LiAqL1xuZnVuY3Rpb24gYWJ5dGVzKGI6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFpc0J5dGVzKGIpKSB0aHJvdyBuZXcgRXJyb3IoJ1VpbnQ4QXJyYXkgZXhwZWN0ZWQnKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheU9mKGlzU3RyaW5nOiBib29sZWFuLCBhcnI6IGFueVtdKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzU3RyaW5nKSB7XG4gICAgcmV0dXJuIGFyci5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXJyLmV2ZXJ5KChpdGVtKSA9PiBOdW1iZXIuaXNTYWZlSW50ZWdlcihpdGVtKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZuKGlucHV0OiBGdW5jdGlvbik6IGlucHV0IGlzIEZ1bmN0aW9uIHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdmdW5jdGlvbiBleHBlY3RlZCcpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYXN0cihsYWJlbDogc3RyaW5nLCBpbnB1dDogdW5rbm93bik6IGlucHV0IGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9OiBzdHJpbmcgZXhwZWN0ZWRgKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGFudW1iZXIobjogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobikpIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnRlZ2VyOiAke259YCk7XG59XG5cbmZ1bmN0aW9uIGFBcnIoaW5wdXQ6IGFueVtdKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHRocm93IG5ldyBFcnJvcignYXJyYXkgZXhwZWN0ZWQnKTtcbn1cbmZ1bmN0aW9uIGFzdHJBcnIobGFiZWw6IHN0cmluZywgaW5wdXQ6IHN0cmluZ1tdKSB7XG4gIGlmICghaXNBcnJheU9mKHRydWUsIGlucHV0KSkgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfTogYXJyYXkgb2Ygc3RyaW5ncyBleHBlY3RlZGApO1xufVxuZnVuY3Rpb24gYW51bUFycihsYWJlbDogc3RyaW5nLCBpbnB1dDogbnVtYmVyW10pIHtcbiAgaWYgKCFpc0FycmF5T2YoZmFsc2UsIGlucHV0KSkgdGhyb3cgbmV3IEVycm9yKGAke2xhYmVsfTogYXJyYXkgb2YgbnVtYmVycyBleHBlY3RlZGApO1xufVxuXG4vLyBUT0RPOiBzb21lIHJlY3VzaXZlIHR5cGUgaW5mZXJlbmNlIHNvIGl0IHdvdWxkIGNoZWNrIGNvcnJlY3Qgb3JkZXIgb2YgaW5wdXQvb3V0cHV0IGluc2lkZSByZXN0P1xuLy8gbGlrZSA8c3RyaW5nLCBudW1iZXI+LCA8bnVtYmVyLCBieXRlcz4sIDxieXRlcywgZmxvYXQ+XG50eXBlIENoYWluID0gW0NvZGVyPGFueSwgYW55PiwgLi4uQ29kZXI8YW55LCBhbnk+W11dO1xuLy8gRXh0cmFjdCBpbmZvIGZyb20gQ29kZXIgdHlwZVxudHlwZSBJbnB1dDxGPiA9IEYgZXh0ZW5kcyBDb2RlcjxpbmZlciBULCBhbnk+ID8gVCA6IG5ldmVyO1xudHlwZSBPdXRwdXQ8Rj4gPSBGIGV4dGVuZHMgQ29kZXI8YW55LCBpbmZlciBUPiA/IFQgOiBuZXZlcjtcbi8vIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGFycmF5c1xudHlwZSBGaXJzdDxUPiA9IFQgZXh0ZW5kcyBbaW5mZXIgVSwgLi4uYW55W11dID8gVSA6IG5ldmVyO1xudHlwZSBMYXN0PFQ+ID0gVCBleHRlbmRzIFsuLi5hbnlbXSwgaW5mZXIgVV0gPyBVIDogbmV2ZXI7XG50eXBlIFRhaWw8VD4gPSBUIGV4dGVuZHMgW2FueSwgLi4uaW5mZXIgVV0gPyBVIDogbmV2ZXI7XG5cbnR5cGUgQXNDaGFpbjxDIGV4dGVuZHMgQ2hhaW4sIFJlc3QgPSBUYWlsPEM+PiA9IHtcbiAgLy8gQ1tLXSA9IENvZGVyPElucHV0PENbS10+LCBJbnB1dDxSZXN0W2tdPj5cbiAgW0sgaW4ga2V5b2YgQ106IENvZGVyPElucHV0PENbS10+LCBJbnB1dDxLIGV4dGVuZHMga2V5b2YgUmVzdCA/IFJlc3RbS10gOiBhbnk+Pjtcbn07XG5cbi8qKlxuICogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiAqL1xuZnVuY3Rpb24gY2hhaW48VCBleHRlbmRzIENoYWluICYgQXNDaGFpbjxUPj4oLi4uYXJnczogVCk6IENvZGVyPElucHV0PEZpcnN0PFQ+PiwgT3V0cHV0PExhc3Q8VD4+PiB7XG4gIGNvbnN0IGlkID0gKGE6IGFueSkgPT4gYTtcbiAgLy8gV3JhcCBjYWxsIGluIGNsb3N1cmUgc28gSklUIGNhbiBpbmxpbmUgY2FsbHNcbiAgY29uc3Qgd3JhcCA9IChhOiBhbnksIGI6IGFueSkgPT4gKGM6IGFueSkgPT4gYShiKGMpKTtcbiAgLy8gQ29uc3RydWN0IGNoYWluIG9mIGFyZ3NbLTFdLmVuY29kZShhcmdzWy0yXS5lbmNvZGUoWy4uLl0pKVxuICBjb25zdCBlbmNvZGUgPSBhcmdzLm1hcCgoeCkgPT4geC5lbmNvZGUpLnJlZHVjZVJpZ2h0KHdyYXAsIGlkKTtcbiAgLy8gQ29uc3RydWN0IGNoYWluIG9mIGFyZ3NbMF0uZGVjb2RlKGFyZ3NbMV0uZGVjb2RlKC4uLikpXG4gIGNvbnN0IGRlY29kZSA9IGFyZ3MubWFwKCh4KSA9PiB4LmRlY29kZSkucmVkdWNlKHdyYXAsIGlkKTtcbiAgcmV0dXJuIHsgZW5jb2RlLCBkZWNvZGUgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGludGVnZXIgcmFkaXggcmVwcmVzZW50YXRpb24gdG8gYXJyYXkgb2Ygc3RyaW5ncyB1c2luZyBhbHBoYWJldCBhbmQgYmFjay5cbiAqIENvdWxkIGFsc28gYmUgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBfX05PX1NJREVfRUZGRUNUU19fXG4gKi9cbmZ1bmN0aW9uIGFscGhhYmV0KGxldHRlcnM6IHN0cmluZyB8IHN0cmluZ1tdKTogQ29kZXI8bnVtYmVyW10sIHN0cmluZ1tdPiB7XG4gIC8vIG1hcHBpbmcgMSB0byBcImJcIlxuICBjb25zdCBsZXR0ZXJzQSA9IHR5cGVvZiBsZXR0ZXJzID09PSAnc3RyaW5nJyA/IGxldHRlcnMuc3BsaXQoJycpIDogbGV0dGVycztcbiAgY29uc3QgbGVuID0gbGV0dGVyc0EubGVuZ3RoO1xuICBhc3RyQXJyKCdhbHBoYWJldCcsIGxldHRlcnNBKTtcblxuICAvLyBtYXBwaW5nIFwiYlwiIHRvIDFcbiAgY29uc3QgaW5kZXhlcyA9IG5ldyBNYXAobGV0dGVyc0EubWFwKChsLCBpKSA9PiBbbCwgaV0pKTtcbiAgcmV0dXJuIHtcbiAgICBlbmNvZGU6IChkaWdpdHM6IG51bWJlcltdKSA9PiB7XG4gICAgICBhQXJyKGRpZ2l0cyk7XG4gICAgICByZXR1cm4gZGlnaXRzLm1hcCgoaSkgPT4ge1xuICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGkpIHx8IGkgPCAwIHx8IGkgPj0gbGVuKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBhbHBoYWJldC5lbmNvZGU6IGRpZ2l0IGluZGV4IG91dHNpZGUgYWxwaGFiZXQgXCIke2l9XCIuIEFsbG93ZWQ6ICR7bGV0dGVyc31gXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGxldHRlcnNBW2ldITtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVjb2RlOiAoaW5wdXQ6IHN0cmluZ1tdKTogbnVtYmVyW10gPT4ge1xuICAgICAgYUFycihpbnB1dCk7XG4gICAgICByZXR1cm4gaW5wdXQubWFwKChsZXR0ZXIpID0+IHtcbiAgICAgICAgYXN0cignYWxwaGFiZXQuZGVjb2RlJywgbGV0dGVyKTtcbiAgICAgICAgY29uc3QgaSA9IGluZGV4ZXMuZ2V0KGxldHRlcik7XG4gICAgICAgIGlmIChpID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsZXR0ZXI6IFwiJHtsZXR0ZXJ9XCIuIEFsbG93ZWQ6ICR7bGV0dGVyc31gKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBfX05PX1NJREVfRUZGRUNUU19fXG4gKi9cbmZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yID0gJycpOiBDb2RlcjxzdHJpbmdbXSwgc3RyaW5nPiB7XG4gIGFzdHIoJ2pvaW4nLCBzZXBhcmF0b3IpO1xuICByZXR1cm4ge1xuICAgIGVuY29kZTogKGZyb20pID0+IHtcbiAgICAgIGFzdHJBcnIoJ2pvaW4uZGVjb2RlJywgZnJvbSk7XG4gICAgICByZXR1cm4gZnJvbS5qb2luKHNlcGFyYXRvcik7XG4gICAgfSxcbiAgICBkZWNvZGU6ICh0bykgPT4ge1xuICAgICAgYXN0cignam9pbi5kZWNvZGUnLCB0byk7XG4gICAgICByZXR1cm4gdG8uc3BsaXQoc2VwYXJhdG9yKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBhZCBzdHJpbmdzIGFycmF5IHNvIGl0IGhhcyBpbnRlZ2VyIG51bWJlciBvZiBiaXRzXG4gKiBAX19OT19TSURFX0VGRkVDVFNfX1xuICovXG5mdW5jdGlvbiBwYWRkaW5nKGJpdHM6IG51bWJlciwgY2hyID0gJz0nKTogQ29kZXI8c3RyaW5nW10sIHN0cmluZ1tdPiB7XG4gIGFudW1iZXIoYml0cyk7XG4gIGFzdHIoJ3BhZGRpbmcnLCBjaHIpO1xuICByZXR1cm4ge1xuICAgIGVuY29kZShkYXRhOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgIGFzdHJBcnIoJ3BhZGRpbmcuZW5jb2RlJywgZGF0YSk7XG4gICAgICB3aGlsZSAoKGRhdGEubGVuZ3RoICogYml0cykgJSA4KSBkYXRhLnB1c2goY2hyKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgZGVjb2RlKGlucHV0OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgIGFzdHJBcnIoJ3BhZGRpbmcuZGVjb2RlJywgaW5wdXQpO1xuICAgICAgbGV0IGVuZCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgIGlmICgoZW5kICogYml0cykgJSA4KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZGRpbmc6IGludmFsaWQsIHN0cmluZyBzaG91bGQgaGF2ZSB3aG9sZSBudW1iZXIgb2YgYnl0ZXMnKTtcbiAgICAgIGZvciAoOyBlbmQgPiAwICYmIGlucHV0W2VuZCAtIDFdID09PSBjaHI7IGVuZC0tKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBlbmQgLSAxO1xuICAgICAgICBjb25zdCBieXRlID0gbGFzdCAqIGJpdHM7XG4gICAgICAgIGlmIChieXRlICUgOCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCdwYWRkaW5nOiBpbnZhbGlkLCBzdHJpbmcgaGFzIHRvbyBtdWNoIHBhZGRpbmcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnB1dC5zbGljZSgwLCBlbmQpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplPFQ+KGZuOiAodmFsOiBUKSA9PiBUKTogQ29kZXI8VCwgVD4ge1xuICBhZm4oZm4pO1xuICByZXR1cm4geyBlbmNvZGU6IChmcm9tOiBUKSA9PiBmcm9tLCBkZWNvZGU6ICh0bzogVCkgPT4gZm4odG8pIH07XG59XG5cbi8qKlxuICogU2xvdzogTyhuXjIpIHRpbWUgY29tcGxleGl0eVxuICovXG5mdW5jdGlvbiBjb252ZXJ0UmFkaXgoZGF0YTogbnVtYmVyW10sIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IG51bWJlcltdIHtcbiAgLy8gYmFzZSAxIGlzIGltcG9zc2libGVcbiAgaWYgKGZyb20gPCAyKSB0aHJvdyBuZXcgRXJyb3IoYGNvbnZlcnRSYWRpeDogaW52YWxpZCBmcm9tPSR7ZnJvbX0sIGJhc2UgY2Fubm90IGJlIGxlc3MgdGhhbiAyYCk7XG4gIGlmICh0byA8IDIpIHRocm93IG5ldyBFcnJvcihgY29udmVydFJhZGl4OiBpbnZhbGlkIHRvPSR7dG99LCBiYXNlIGNhbm5vdCBiZSBsZXNzIHRoYW4gMmApO1xuICBhQXJyKGRhdGEpO1xuICBpZiAoIWRhdGEubGVuZ3RoKSByZXR1cm4gW107XG4gIGxldCBwb3MgPSAwO1xuICBjb25zdCByZXMgPSBbXTtcbiAgY29uc3QgZGlnaXRzID0gQXJyYXkuZnJvbShkYXRhLCAoZCkgPT4ge1xuICAgIGFudW1iZXIoZCk7XG4gICAgaWYgKGQgPCAwIHx8IGQgPj0gZnJvbSkgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGludGVnZXI6ICR7ZH1gKTtcbiAgICByZXR1cm4gZDtcbiAgfSk7XG4gIGNvbnN0IGRsZW4gPSBkaWdpdHMubGVuZ3RoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGxldCBjYXJyeSA9IDA7XG4gICAgbGV0IGRvbmUgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBkbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGRpZ2l0ID0gZGlnaXRzW2ldITtcbiAgICAgIGNvbnN0IGZyb21DYXJyeSA9IGZyb20gKiBjYXJyeTtcbiAgICAgIGNvbnN0IGRpZ2l0QmFzZSA9IGZyb21DYXJyeSArIGRpZ2l0O1xuICAgICAgaWYgKFxuICAgICAgICAhTnVtYmVyLmlzU2FmZUludGVnZXIoZGlnaXRCYXNlKSB8fFxuICAgICAgICBmcm9tQ2FycnkgLyBmcm9tICE9PSBjYXJyeSB8fFxuICAgICAgICBkaWdpdEJhc2UgLSBkaWdpdCAhPT0gZnJvbUNhcnJ5XG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb252ZXJ0UmFkaXg6IGNhcnJ5IG92ZXJmbG93Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkaXYgPSBkaWdpdEJhc2UgLyB0bztcbiAgICAgIGNhcnJ5ID0gZGlnaXRCYXNlICUgdG87XG4gICAgICBjb25zdCByb3VuZGVkID0gTWF0aC5mbG9vcihkaXYpO1xuICAgICAgZGlnaXRzW2ldID0gcm91bmRlZDtcbiAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocm91bmRlZCkgfHwgcm91bmRlZCAqIHRvICsgY2FycnkgIT09IGRpZ2l0QmFzZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb252ZXJ0UmFkaXg6IGNhcnJ5IG92ZXJmbG93Jyk7XG4gICAgICBpZiAoIWRvbmUpIGNvbnRpbnVlO1xuICAgICAgZWxzZSBpZiAoIXJvdW5kZWQpIHBvcyA9IGk7XG4gICAgICBlbHNlIGRvbmUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmVzLnB1c2goY2FycnkpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoIC0gMSAmJiBkYXRhW2ldID09PSAwOyBpKyspIHJlcy5wdXNoKDApO1xuICByZXR1cm4gcmVzLnJldmVyc2UoKTtcbn1cblxuY29uc3QgZ2NkID0gKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyID0+IChiID09PSAwID8gYSA6IGdjZChiLCBhICUgYikpO1xuY29uc3QgcmFkaXgyY2FycnkgPSAvKiBAX19OT19TSURFX0VGRkVDVFNfXyAqLyAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PlxuICBmcm9tICsgKHRvIC0gZ2NkKGZyb20sIHRvKSk7XG5jb25zdCBwb3dlcnM6IG51bWJlcltdID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGxldCByZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MDsgaSsrKSByZXMucHVzaCgyICoqIGkpO1xuICByZXR1cm4gcmVzO1xufSkoKTtcbi8qKlxuICogSW1wbGVtZW50ZWQgd2l0aCBudW1iZXJzLCBiZWNhdXNlIEJpZ0ludCBpcyA1eCBzbG93ZXJcbiAqL1xuZnVuY3Rpb24gY29udmVydFJhZGl4MihkYXRhOiBudW1iZXJbXSwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBwYWRkaW5nOiBib29sZWFuKTogbnVtYmVyW10ge1xuICBhQXJyKGRhdGEpO1xuICBpZiAoZnJvbSA8PSAwIHx8IGZyb20gPiAzMikgdGhyb3cgbmV3IEVycm9yKGBjb252ZXJ0UmFkaXgyOiB3cm9uZyBmcm9tPSR7ZnJvbX1gKTtcbiAgaWYgKHRvIDw9IDAgfHwgdG8gPiAzMikgdGhyb3cgbmV3IEVycm9yKGBjb252ZXJ0UmFkaXgyOiB3cm9uZyB0bz0ke3RvfWApO1xuICBpZiAocmFkaXgyY2FycnkoZnJvbSwgdG8pID4gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgY29udmVydFJhZGl4MjogY2Fycnkgb3ZlcmZsb3cgZnJvbT0ke2Zyb219IHRvPSR7dG99IGNhcnJ5Qml0cz0ke3JhZGl4MmNhcnJ5KGZyb20sIHRvKX1gXG4gICAgKTtcbiAgfVxuICBsZXQgY2FycnkgPSAwO1xuICBsZXQgcG9zID0gMDsgLy8gYml0d2lzZSBwb3NpdGlvbiBpbiBjdXJyZW50IGVsZW1lbnRcbiAgY29uc3QgbWF4ID0gcG93ZXJzW2Zyb21dITtcbiAgY29uc3QgbWFzayA9IHBvd2Vyc1t0b10hIC0gMTtcbiAgY29uc3QgcmVzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG4gb2YgZGF0YSkge1xuICAgIGFudW1iZXIobik7XG4gICAgaWYgKG4gPj0gbWF4KSB0aHJvdyBuZXcgRXJyb3IoYGNvbnZlcnRSYWRpeDI6IGludmFsaWQgZGF0YSB3b3JkPSR7bn0gZnJvbT0ke2Zyb219YCk7XG4gICAgY2FycnkgPSAoY2FycnkgPDwgZnJvbSkgfCBuO1xuICAgIGlmIChwb3MgKyBmcm9tID4gMzIpIHRocm93IG5ldyBFcnJvcihgY29udmVydFJhZGl4MjogY2Fycnkgb3ZlcmZsb3cgcG9zPSR7cG9zfSBmcm9tPSR7ZnJvbX1gKTtcbiAgICBwb3MgKz0gZnJvbTtcbiAgICBmb3IgKDsgcG9zID49IHRvOyBwb3MgLT0gdG8pIHJlcy5wdXNoKCgoY2FycnkgPj4gKHBvcyAtIHRvKSkgJiBtYXNrKSA+Pj4gMCk7XG4gICAgY29uc3QgcG93ID0gcG93ZXJzW3Bvc107XG4gICAgaWYgKHBvdyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2FycnknKTtcbiAgICBjYXJyeSAmPSBwb3cgLSAxOyAvLyBjbGVhbiBjYXJyeSwgb3RoZXJ3aXNlIGl0IHdpbGwgY2F1c2Ugb3ZlcmZsb3dcbiAgfVxuICBjYXJyeSA9IChjYXJyeSA8PCAodG8gLSBwb3MpKSAmIG1hc2s7XG4gIGlmICghcGFkZGluZyAmJiBwb3MgPj0gZnJvbSkgdGhyb3cgbmV3IEVycm9yKCdFeGNlc3MgcGFkZGluZycpO1xuICBpZiAoIXBhZGRpbmcgJiYgY2FycnkgPiAwKSB0aHJvdyBuZXcgRXJyb3IoYE5vbi16ZXJvIHBhZGRpbmc6ICR7Y2Fycnl9YCk7XG4gIGlmIChwYWRkaW5nICYmIHBvcyA+IDApIHJlcy5wdXNoKGNhcnJ5ID4+PiAwKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLyoqXG4gKiBAX19OT19TSURFX0VGRkVDVFNfX1xuICovXG5mdW5jdGlvbiByYWRpeChudW06IG51bWJlcik6IENvZGVyPFVpbnQ4QXJyYXksIG51bWJlcltdPiB7XG4gIGFudW1iZXIobnVtKTtcbiAgY29uc3QgXzI1NiA9IDIgKiogODtcbiAgcmV0dXJuIHtcbiAgICBlbmNvZGU6IChieXRlczogVWludDhBcnJheSkgPT4ge1xuICAgICAgaWYgKCFpc0J5dGVzKGJ5dGVzKSkgdGhyb3cgbmV3IEVycm9yKCdyYWRpeC5lbmNvZGUgaW5wdXQgc2hvdWxkIGJlIFVpbnQ4QXJyYXknKTtcbiAgICAgIHJldHVybiBjb252ZXJ0UmFkaXgoQXJyYXkuZnJvbShieXRlcyksIF8yNTYsIG51bSk7XG4gICAgfSxcbiAgICBkZWNvZGU6IChkaWdpdHM6IG51bWJlcltdKSA9PiB7XG4gICAgICBhbnVtQXJyKCdyYWRpeC5kZWNvZGUnLCBkaWdpdHMpO1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShjb252ZXJ0UmFkaXgoZGlnaXRzLCBudW0sIF8yNTYpKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIElmIGJvdGggYmFzZXMgYXJlIHBvd2VyIG9mIHNhbWUgbnVtYmVyIChsaWtlIGAyKio4IDwtPiAyKio2NGApLFxuICogdGhlcmUgaXMgYSBsaW5lYXIgYWxnb3JpdGhtLiBGb3Igbm93IHdlIGhhdmUgaW1wbGVtZW50YXRpb24gZm9yIHBvd2VyLW9mLXR3byBiYXNlcyBvbmx5LlxuICogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiAqL1xuZnVuY3Rpb24gcmFkaXgyKGJpdHM6IG51bWJlciwgcmV2UGFkZGluZyA9IGZhbHNlKTogQ29kZXI8VWludDhBcnJheSwgbnVtYmVyW10+IHtcbiAgYW51bWJlcihiaXRzKTtcbiAgaWYgKGJpdHMgPD0gMCB8fCBiaXRzID4gMzIpIHRocm93IG5ldyBFcnJvcigncmFkaXgyOiBiaXRzIHNob3VsZCBiZSBpbiAoMC4uMzJdJyk7XG4gIGlmIChyYWRpeDJjYXJyeSg4LCBiaXRzKSA+IDMyIHx8IHJhZGl4MmNhcnJ5KGJpdHMsIDgpID4gMzIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdyYWRpeDI6IGNhcnJ5IG92ZXJmbG93Jyk7XG4gIHJldHVybiB7XG4gICAgZW5jb2RlOiAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHtcbiAgICAgIGlmICghaXNCeXRlcyhieXRlcykpIHRocm93IG5ldyBFcnJvcigncmFkaXgyLmVuY29kZSBpbnB1dCBzaG91bGQgYmUgVWludDhBcnJheScpO1xuICAgICAgcmV0dXJuIGNvbnZlcnRSYWRpeDIoQXJyYXkuZnJvbShieXRlcyksIDgsIGJpdHMsICFyZXZQYWRkaW5nKTtcbiAgICB9LFxuICAgIGRlY29kZTogKGRpZ2l0czogbnVtYmVyW10pID0+IHtcbiAgICAgIGFudW1BcnIoJ3JhZGl4Mi5kZWNvZGUnLCBkaWdpdHMpO1xuICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShjb252ZXJ0UmFkaXgyKGRpZ2l0cywgYml0cywgOCwgcmV2UGFkZGluZykpO1xuICAgIH0sXG4gIH07XG59XG5cbnR5cGUgQXJndW1lbnRUeXBlczxGIGV4dGVuZHMgRnVuY3Rpb24+ID0gRiBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBhbnkgPyBBIDogbmV2ZXI7XG5mdW5jdGlvbiB1bnNhZmVXcmFwcGVyPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBhbnk+KGZuOiBUKSB7XG4gIGFmbihmbik7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogQXJndW1lbnRUeXBlczxUPik6IFJldHVyblR5cGU8VD4gfCB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoZWNrc3VtKFxuICBsZW46IG51bWJlcixcbiAgZm46IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5XG4pOiBDb2RlcjxVaW50OEFycmF5LCBVaW50OEFycmF5PiB7XG4gIGFudW1iZXIobGVuKTtcbiAgYWZuKGZuKTtcbiAgcmV0dXJuIHtcbiAgICBlbmNvZGUoZGF0YTogVWludDhBcnJheSkge1xuICAgICAgaWYgKCFpc0J5dGVzKGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ2NoZWNrc3VtLmVuY29kZTogaW5wdXQgc2hvdWxkIGJlIFVpbnQ4QXJyYXknKTtcbiAgICAgIGNvbnN0IHN1bSA9IGZuKGRhdGEpLnNsaWNlKDAsIGxlbik7XG4gICAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCArIGxlbik7XG4gICAgICByZXMuc2V0KGRhdGEpO1xuICAgICAgcmVzLnNldChzdW0sIGRhdGEubGVuZ3RoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICBkZWNvZGUoZGF0YTogVWludDhBcnJheSkge1xuICAgICAgaWYgKCFpc0J5dGVzKGRhdGEpKSB0aHJvdyBuZXcgRXJyb3IoJ2NoZWNrc3VtLmRlY29kZTogaW5wdXQgc2hvdWxkIGJlIFVpbnQ4QXJyYXknKTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhLnNsaWNlKDAsIC1sZW4pO1xuICAgICAgY29uc3Qgb2xkQ2hlY2tzdW0gPSBkYXRhLnNsaWNlKC1sZW4pO1xuICAgICAgY29uc3QgbmV3Q2hlY2tzdW0gPSBmbihwYXlsb2FkKS5zbGljZSgwLCBsZW4pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgICAgaWYgKG5ld0NoZWNrc3VtW2ldICE9PSBvbGRDaGVja3N1bVtpXSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrc3VtJyk7XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9LFxuICB9O1xufVxuXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCBjb25zdCB1dGlsczogeyBhbHBoYWJldDogdHlwZW9mIGFscGhhYmV0OyBjaGFpbjogdHlwZW9mIGNoYWluOyBjaGVja3N1bTogdHlwZW9mIGNoZWNrc3VtOyBjb252ZXJ0UmFkaXg6IHR5cGVvZiBjb252ZXJ0UmFkaXg7IGNvbnZlcnRSYWRpeDI6IHR5cGVvZiBjb252ZXJ0UmFkaXgyOyByYWRpeDogdHlwZW9mIHJhZGl4OyByYWRpeDI6IHR5cGVvZiByYWRpeDI7IGpvaW46IHR5cGVvZiBqb2luOyBwYWRkaW5nOiB0eXBlb2YgcGFkZGluZzsgfSA9IHtcbiAgYWxwaGFiZXQsIGNoYWluLCBjaGVja3N1bSwgY29udmVydFJhZGl4LCBjb252ZXJ0UmFkaXgyLCByYWRpeCwgcmFkaXgyLCBqb2luLCBwYWRkaW5nLFxufTtcblxuLy8gUkZDIDQ2NDggYWthIFJGQyAzNTQ4XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBiYXNlMTYgZW5jb2RpbmcgZnJvbSBSRkMgNDY0OC5cbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogYmFzZTE2LmVuY29kZShVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKSk7XG4gKiAvLyA9PiAnMTJBQidcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgYmFzZTE2OiBCeXRlc0NvZGVyID0gY2hhaW4ocmFkaXgyKDQpLCBhbHBoYWJldCgnMDEyMzQ1Njc4OUFCQ0RFRicpLCBqb2luKCcnKSk7XG5cbi8qKlxuICogYmFzZTMyIGVuY29kaW5nIGZyb20gUkZDIDQ2NDguIEhhcyBwYWRkaW5nLlxuICogVXNlIGBiYXNlMzJub3BhZGAgZm9yIHVucGFkZGVkIHZlcnNpb24uXG4gKiBBbHNvIGNoZWNrIG91dCBgYmFzZTMyaGV4YCwgYGJhc2UzMmhleG5vcGFkYCwgYGJhc2UzMmNyb2NrZm9yZGAuXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGJhc2UzMi5lbmNvZGUoVWludDhBcnJheS5mcm9tKFsweDEyLCAweGFiXSkpO1xuICogLy8gPT4gJ0NLVlE9PT09J1xuICogYmFzZTMyLmRlY29kZSgnQ0tWUT09PT0nKTtcbiAqIC8vID0+IFVpbnQ4QXJyYXkuZnJvbShbMHgxMiwgMHhhYl0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2UzMjogQnl0ZXNDb2RlciA9IGNoYWluKFxuICByYWRpeDIoNSksXG4gIGFscGhhYmV0KCdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2NycpLFxuICBwYWRkaW5nKDUpLFxuICBqb2luKCcnKVxuKTtcblxuLyoqXG4gKiBiYXNlMzIgZW5jb2RpbmcgZnJvbSBSRkMgNDY0OC4gTm8gcGFkZGluZy5cbiAqIFVzZSBgYmFzZTMyYCBmb3IgcGFkZGVkIHZlcnNpb24uXG4gKiBBbHNvIGNoZWNrIG91dCBgYmFzZTMyaGV4YCwgYGJhc2UzMmhleG5vcGFkYCwgYGJhc2UzMmNyb2NrZm9yZGAuXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGJhc2UzMm5vcGFkLmVuY29kZShVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKSk7XG4gKiAvLyA9PiAnQ0tWUSdcbiAqIGJhc2UzMm5vcGFkLmRlY29kZSgnQ0tWUScpO1xuICogLy8gPT4gVWludDhBcnJheS5mcm9tKFsweDEyLCAweGFiXSlcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgYmFzZTMybm9wYWQ6IEJ5dGVzQ29kZXIgPSBjaGFpbihcbiAgcmFkaXgyKDUpLFxuICBhbHBoYWJldCgnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjcnKSxcbiAgam9pbignJylcbik7XG4vKipcbiAqIGJhc2UzMiBlbmNvZGluZyBmcm9tIFJGQyA0NjQ4LiBQYWRkZWQuIENvbXBhcmVkIHRvIG9yZGluYXJ5IGBiYXNlMzJgLCBzbGlnaHRseSBkaWZmZXJlbnQgYWxwaGFiZXQuXG4gKiBVc2UgYGJhc2UzMmhleG5vcGFkYCBmb3IgdW5wYWRkZWQgdmVyc2lvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogYmFzZTMyaGV4LmVuY29kZShVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKSk7XG4gKiAvLyA9PiAnMkFMRz09PT0nXG4gKiBiYXNlMzJoZXguZGVjb2RlKCcyQUxHPT09PScpO1xuICogLy8gPT4gVWludDhBcnJheS5mcm9tKFsweDEyLCAweGFiXSlcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgYmFzZTMyaGV4OiBCeXRlc0NvZGVyID0gY2hhaW4oXG4gIHJhZGl4Mig1KSxcbiAgYWxwaGFiZXQoJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWJyksXG4gIHBhZGRpbmcoNSksXG4gIGpvaW4oJycpXG4pO1xuXG4vKipcbiAqIGJhc2UzMiBlbmNvZGluZyBmcm9tIFJGQyA0NjQ4LiBObyBwYWRkaW5nLiBDb21wYXJlZCB0byBvcmRpbmFyeSBgYmFzZTMyYCwgc2xpZ2h0bHkgZGlmZmVyZW50IGFscGhhYmV0LlxuICogVXNlIGBiYXNlMzJoZXhgIGZvciBwYWRkZWQgdmVyc2lvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogYmFzZTMyaGV4bm9wYWQuZW5jb2RlKFVpbnQ4QXJyYXkuZnJvbShbMHgxMiwgMHhhYl0pKTtcbiAqIC8vID0+ICcyQUxHJ1xuICogYmFzZTMyaGV4bm9wYWQuZGVjb2RlKCcyQUxHJyk7XG4gKiAvLyA9PiBVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlMzJoZXhub3BhZDogQnl0ZXNDb2RlciA9IGNoYWluKFxuICByYWRpeDIoNSksXG4gIGFscGhhYmV0KCcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVicpLFxuICBqb2luKCcnKVxuKTtcbi8qKlxuICogYmFzZTMyIGVuY29kaW5nIGZyb20gUkZDIDQ2NDguIERvdWcgQ3JvY2tmb3JkJ3MgdmVyc2lvbi5cbiAqIGh0dHBzOi8vd3d3LmNyb2NrZm9yZC5jb20vYmFzZTMyLmh0bWxcbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogYmFzZTMyY3JvY2tmb3JkLmVuY29kZShVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKSk7XG4gKiAvLyA9PiAnMkFORydcbiAqIGJhc2UzMmNyb2NrZm9yZC5kZWNvZGUoJzJBTkcnKTtcbiAqIC8vID0+IFVpbnQ4QXJyYXkuZnJvbShbMHgxMiwgMHhhYl0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2UzMmNyb2NrZm9yZDogQnl0ZXNDb2RlciA9IGNoYWluKFxuICByYWRpeDIoNSksXG4gIGFscGhhYmV0KCcwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWicpLFxuICBqb2luKCcnKSxcbiAgbm9ybWFsaXplKChzOiBzdHJpbmcpID0+IHMudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9PL2csICcwJykucmVwbGFjZSgvW0lMXS9nLCAnMScpKVxuKTtcblxuLy8gQnVpbHQtaW4gYmFzZTY0IGNvbnZlcnNpb24gaHR0cHM6Ly9jYW5pdXNlLmNvbS9tZG4tamF2YXNjcmlwdF9idWlsdGluc191aW50OGFycmF5X2Zyb21iYXNlNjRcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgaGFzQmFzZTY0QnVpbHRpbjogYm9vbGVhbiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT5cbiAgdHlwZW9mIChVaW50OEFycmF5IGFzIGFueSkuZnJvbShbXSkudG9CYXNlNjQgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIChVaW50OEFycmF5IGFzIGFueSkuZnJvbUJhc2U2NCA9PT0gJ2Z1bmN0aW9uJykoKTtcblxuY29uc3QgZGVjb2RlQmFzZTY0QnVpbHRpbiA9IChzOiBzdHJpbmcsIGlzVXJsOiBib29sZWFuKSA9PiB7XG4gIGFzdHIoJ2Jhc2U2NCcsIHMpO1xuICBjb25zdCByZSA9IGlzVXJsID8gL15bQS1aYS16MC05PV8tXSskLyA6IC9eW0EtWmEtejAtOT0rL10rJC87XG4gIGNvbnN0IGFscGhhYmV0ID0gaXNVcmwgPyAnYmFzZTY0dXJsJyA6ICdiYXNlNjQnO1xuICBpZiAocy5sZW5ndGggPiAwICYmICFyZS50ZXN0KHMpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFzZTY0Jyk7XG4gIHJldHVybiAoVWludDhBcnJheSBhcyBhbnkpLmZyb21CYXNlNjQocywgeyBhbHBoYWJldCwgbGFzdENodW5rSGFuZGxpbmc6ICdzdHJpY3QnIH0pO1xufTtcblxuLyoqXG4gKiBiYXNlNjQgZnJvbSBSRkMgNDY0OC4gUGFkZGVkLlxuICogVXNlIGBiYXNlNjRub3BhZGAgZm9yIHVucGFkZGVkIHZlcnNpb24uXG4gKiBBbHNvIGNoZWNrIG91dCBgYmFzZTY0dXJsYCwgYGJhc2U2NHVybG5vcGFkYC5cbiAqIEZhbGxzIGJhY2sgdG8gYnVpbHQtaW4gZnVuY3Rpb24sIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBiYXNlNjQuZW5jb2RlKFVpbnQ4QXJyYXkuZnJvbShbMHgxMiwgMHhhYl0pKTtcbiAqIC8vID0+ICdFcXM9J1xuICogYmFzZTY0LmRlY29kZSgnRXFzPScpO1xuICogLy8gPT4gVWludDhBcnJheS5mcm9tKFsweDEyLCAweGFiXSlcbiAqIGBgYFxuICovXG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCBjb25zdCBiYXNlNjQ6IEJ5dGVzQ29kZXIgPSBoYXNCYXNlNjRCdWlsdGluID8ge1xuICBlbmNvZGUoYikgeyBhYnl0ZXMoYik7IHJldHVybiAoYiBhcyBhbnkpLnRvQmFzZTY0KCk7IH0sXG4gIGRlY29kZShzKSB7IHJldHVybiBkZWNvZGVCYXNlNjRCdWlsdGluKHMsIGZhbHNlKTsgfSxcbn0gOiBjaGFpbihcbiAgcmFkaXgyKDYpLFxuICBhbHBoYWJldCgnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycpLFxuICBwYWRkaW5nKDYpLFxuICBqb2luKCcnKVxuKTtcbi8qKlxuICogYmFzZTY0IGZyb20gUkZDIDQ2NDguIE5vIHBhZGRpbmcuXG4gKiBVc2UgYGJhc2U2NGAgZm9yIHBhZGRlZCB2ZXJzaW9uLlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBiYXNlNjRub3BhZC5lbmNvZGUoVWludDhBcnJheS5mcm9tKFsweDEyLCAweGFiXSkpO1xuICogLy8gPT4gJ0VxcydcbiAqIGJhc2U2NG5vcGFkLmRlY29kZSgnRXFzJyk7XG4gKiAvLyA9PiBVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNjRub3BhZDogQnl0ZXNDb2RlciA9IGNoYWluKFxuICByYWRpeDIoNiksXG4gIGFscGhhYmV0KCdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJyksXG4gIGpvaW4oJycpXG4pO1xuXG4vKipcbiAqIGJhc2U2NCBmcm9tIFJGQyA0NjQ4LCB1c2luZyBVUkwtc2FmZSBhbHBoYWJldC4gUGFkZGVkLlxuICogVXNlIGBiYXNlNjR1cmxub3BhZGAgZm9yIHVucGFkZGVkIHZlcnNpb24uXG4gKiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGZ1bmN0aW9uLCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogYmFzZTY0dXJsLmVuY29kZShVaW50OEFycmF5LmZyb20oWzB4MTIsIDB4YWJdKSk7XG4gKiAvLyA9PiAnRXFzPSdcbiAqIGJhc2U2NHVybC5kZWNvZGUoJ0Vxcz0nKTtcbiAqIC8vID0+IFVpbnQ4QXJyYXkuZnJvbShbMHgxMiwgMHhhYl0pXG4gKiBgYGBcbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgY29uc3QgYmFzZTY0dXJsOiBCeXRlc0NvZGVyID0gaGFzQmFzZTY0QnVpbHRpbiA/IHtcbiAgZW5jb2RlKGIpIHsgYWJ5dGVzKGIpOyByZXR1cm4gKGIgYXMgYW55KS50b0Jhc2U2NCh7IGFscGhhYmV0OiAnYmFzZTY0dXJsJyB9KTsgfSxcbiAgZGVjb2RlKHMpIHsgcmV0dXJuIGRlY29kZUJhc2U2NEJ1aWx0aW4ocywgdHJ1ZSk7IH0sXG59IDogY2hhaW4oXG4gIHJhZGl4Mig2KSxcbiAgYWxwaGFiZXQoJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8nKSxcbiAgcGFkZGluZyg2KSxcbiAgam9pbignJylcbik7XG5cbi8qKlxuICogYmFzZTY0IGZyb20gUkZDIDQ2NDgsIHVzaW5nIFVSTC1zYWZlIGFscGhhYmV0LiBObyBwYWRkaW5nLlxuICogVXNlIGBiYXNlNjR1cmxgIGZvciBwYWRkZWQgdmVyc2lvbi5cbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogYmFzZTY0dXJsbm9wYWQuZW5jb2RlKFVpbnQ4QXJyYXkuZnJvbShbMHgxMiwgMHhhYl0pKTtcbiAqIC8vID0+ICdFcXMnXG4gKiBiYXNlNjR1cmxub3BhZC5kZWNvZGUoJ0VxcycpO1xuICogLy8gPT4gVWludDhBcnJheS5mcm9tKFsweDEyLCAweGFiXSlcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgYmFzZTY0dXJsbm9wYWQ6IEJ5dGVzQ29kZXIgPSBjaGFpbihcbiAgcmFkaXgyKDYpLFxuICBhbHBoYWJldCgnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXycpLFxuICBqb2luKCcnKVxuKTtcblxuLy8gYmFzZTU4IGNvZGVcbi8vIC0tLS0tLS0tLS0tXG5jb25zdCBnZW5CYXNlNTggPSAvKiBAX19OT19TSURFX0VGRkVDVFNfXyAqLyAoYWJjOiBzdHJpbmcpID0+XG4gIGNoYWluKHJhZGl4KDU4KSwgYWxwaGFiZXQoYWJjKSwgam9pbignJykpO1xuXG4vKipcbiAqIGJhc2U1ODogYmFzZTY0IHdpdGhvdXQgYW1iaWdvdXMgY2hhcmFjdGVycyArLCAvLCAwLCBPLCBJLCBsLlxuICogUXVhZHJhdGljIChPKG5eMikpIC0gc28sIGNhbid0IGJlIHVzZWQgb24gbGFyZ2UgaW5wdXRzLlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBiYXNlNTguZGVjb2RlKCcwMWFiY2RlZicpO1xuICogLy8gPT4gJzNVaEpXJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNTg6IEJ5dGVzQ29kZXIgPSBnZW5CYXNlNTgoXG4gICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6J1xuKTtcbi8qKlxuICogYmFzZTU4OiBmbGlja3IgdmVyc2lvbi4gQ2hlY2sgb3V0IGBiYXNlNThgLlxuICovXG5leHBvcnQgY29uc3QgYmFzZTU4ZmxpY2tyOiBCeXRlc0NvZGVyID0gZ2VuQmFzZTU4KFxuICAnMTIzNDU2Nzg5YWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5ekFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWidcbik7XG4vKipcbiAqIGJhc2U1ODogWFJQIHZlcnNpb24uIENoZWNrIG91dCBgYmFzZTU4YC5cbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2U1OHhycDogQnl0ZXNDb2RlciA9IGdlbkJhc2U1OChcbiAgJ3Jwc2huYWYzOXdCVURORUdISktMTTRQUVJTVDdWV1hZWjJiY2RlQ2c2NWprbThvRnFpMXR1dkF4eXonXG4pO1xuXG4vLyBEYXRhIGxlbiAoaW5kZXgpIC0+IGVuY29kZWQgYmxvY2sgbGVuXG5jb25zdCBYTVJfQkxPQ0tfTEVOID0gWzAsIDIsIDMsIDUsIDYsIDcsIDksIDEwLCAxMV07XG5cbi8qKlxuICogYmFzZTU4OiBYTVIgdmVyc2lvbi4gQ2hlY2sgb3V0IGBiYXNlNThgLlxuICogRG9uZSBpbiA4LWJ5dGUgYmxvY2tzICh3aGljaCBlcXVhbHMgMTEgY2hhcnMgaW4gZGVjb2RpbmcpLiBMYXN0IChub24tZnVsbCkgYmxvY2sgcGFkZGVkIHdpdGggJzEnIHRvIHNpemUgaW4gWE1SX0JMT0NLX0xFTi5cbiAqIEJsb2NrIGVuY29kaW5nIHNpZ25pZmljYW50bHkgcmVkdWNlcyBxdWFkcmF0aWMgY29tcGxleGl0eSBvZiBiYXNlNTguXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNTh4bXI6IEJ5dGVzQ29kZXIgPSB7XG4gIGVuY29kZShkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgY29uc3QgYmxvY2sgPSBkYXRhLnN1YmFycmF5KGksIGkgKyA4KTtcbiAgICAgIHJlcyArPSBiYXNlNTguZW5jb2RlKGJsb2NrKS5wYWRTdGFydChYTVJfQkxPQ0tfTEVOW2Jsb2NrLmxlbmd0aF0hLCAnMScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9LFxuICBkZWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxMSkge1xuICAgICAgY29uc3Qgc2xpY2UgPSBzdHIuc2xpY2UoaSwgaSArIDExKTtcbiAgICAgIGNvbnN0IGJsb2NrTGVuID0gWE1SX0JMT0NLX0xFTi5pbmRleE9mKHNsaWNlLmxlbmd0aCk7XG4gICAgICBjb25zdCBibG9jayA9IGJhc2U1OC5kZWNvZGUoc2xpY2UpO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBibG9jay5sZW5ndGggLSBibG9ja0xlbjsgaisrKSB7XG4gICAgICAgIGlmIChibG9ja1tqXSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdiYXNlNTh4bXI6IHdyb25nIHBhZGRpbmcnKTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IHJlcy5jb25jYXQoQXJyYXkuZnJvbShibG9jay5zbGljZShibG9jay5sZW5ndGggLSBibG9ja0xlbikpKTtcbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyZXMpO1xuICB9LFxufTtcblxuLyoqXG4gKiBNZXRob2QsIHdoaWNoIGNyZWF0ZXMgYmFzZTU4Y2hlY2sgZW5jb2Rlci5cbiAqIFJlcXVpcmVzIGZ1bmN0aW9uLCBjYWxjdWxhdGluZyBzaGEyNTYuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCYXNlNThjaGVjayA9IChzaGEyNTY6IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5KTogQnl0ZXNDb2RlciA9PlxuICBjaGFpbihcbiAgICBjaGVja3N1bSg0LCAoZGF0YSkgPT4gc2hhMjU2KHNoYTI1NihkYXRhKSkpLFxuICAgIGJhc2U1OFxuICApO1xuXG4vKipcbiAqIFVzZSBgY3JlYXRlQmFzZTU4Y2hlY2tgIGluc3RlYWQuXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgY29uc3QgYmFzZTU4Y2hlY2s6IChzaGEyNTY6IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5KSA9PiBCeXRlc0NvZGVyID1cbiAgY3JlYXRlQmFzZTU4Y2hlY2s7XG5cbi8vIEJlY2gzMiBjb2RlXG4vLyAtLS0tLS0tLS0tLVxuZXhwb3J0IGludGVyZmFjZSBCZWNoMzJEZWNvZGVkPFByZWZpeCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICBwcmVmaXg6IFByZWZpeDtcbiAgd29yZHM6IG51bWJlcltdO1xufVxuZXhwb3J0IGludGVyZmFjZSBCZWNoMzJEZWNvZGVkV2l0aEFycmF5PFByZWZpeCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICBwcmVmaXg6IFByZWZpeDtcbiAgd29yZHM6IG51bWJlcltdO1xuICBieXRlczogVWludDhBcnJheTtcbn1cblxuY29uc3QgQkVDSF9BTFBIQUJFVDogQ29kZXI8bnVtYmVyW10sIHN0cmluZz4gPSBjaGFpbihcbiAgYWxwaGFiZXQoJ3FwenJ5OXg4Z2YydHZkdzBzM2puNTRraGNlNm11YTdsJyksXG4gIGpvaW4oJycpXG4pO1xuXG5jb25zdCBQT0xZTU9EX0dFTkVSQVRPUlMgPSBbMHgzYjZhNTdiMiwgMHgyNjUwOGU2ZCwgMHgxZWExMTlmYSwgMHgzZDQyMzNkZCwgMHgyYTE0NjJiM107XG5mdW5jdGlvbiBiZWNoMzJQb2x5bW9kKHByZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYiA9IHByZSA+PiAyNTtcbiAgbGV0IGNoayA9IChwcmUgJiAweDFmZmZmZmYpIDw8IDU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgUE9MWU1PRF9HRU5FUkFUT1JTLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCgoYiA+PiBpKSAmIDEpID09PSAxKSBjaGsgXj0gUE9MWU1PRF9HRU5FUkFUT1JTW2ldITtcbiAgfVxuICByZXR1cm4gY2hrO1xufVxuXG5mdW5jdGlvbiBiZWNoQ2hlY2tzdW0ocHJlZml4OiBzdHJpbmcsIHdvcmRzOiBudW1iZXJbXSwgZW5jb2RpbmdDb25zdCA9IDEpOiBzdHJpbmcge1xuICBjb25zdCBsZW4gPSBwcmVmaXgubGVuZ3RoO1xuICBsZXQgY2hrID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGMgPSBwcmVmaXguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA8IDMzIHx8IGMgPiAxMjYpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcmVmaXggKCR7cHJlZml4fSlgKTtcbiAgICBjaGsgPSBiZWNoMzJQb2x5bW9kKGNoaykgXiAoYyA+PiA1KTtcbiAgfVxuICBjaGsgPSBiZWNoMzJQb2x5bW9kKGNoayk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIGNoayA9IGJlY2gzMlBvbHltb2QoY2hrKSBeIChwcmVmaXguY2hhckNvZGVBdChpKSAmIDB4MWYpO1xuICBmb3IgKGxldCB2IG9mIHdvcmRzKSBjaGsgPSBiZWNoMzJQb2x5bW9kKGNoaykgXiB2O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykgY2hrID0gYmVjaDMyUG9seW1vZChjaGspO1xuICBjaGsgXj0gZW5jb2RpbmdDb25zdDtcbiAgcmV0dXJuIEJFQ0hfQUxQSEFCRVQuZW5jb2RlKGNvbnZlcnRSYWRpeDIoW2NoayAlIHBvd2Vyc1szMF0hXSwgMzAsIDUsIGZhbHNlKSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmVjaDMyIHtcbiAgZW5jb2RlPFByZWZpeCBleHRlbmRzIHN0cmluZz4oXG4gICAgcHJlZml4OiBQcmVmaXgsXG4gICAgd29yZHM6IG51bWJlcltdIHwgVWludDhBcnJheSxcbiAgICBsaW1pdD86IG51bWJlciB8IGZhbHNlXG4gICk6IGAke0xvd2VyY2FzZTxQcmVmaXg+fTEke3N0cmluZ31gO1xuICBkZWNvZGU8UHJlZml4IGV4dGVuZHMgc3RyaW5nPihcbiAgICBzdHI6IGAke1ByZWZpeH0xJHtzdHJpbmd9YCxcbiAgICBsaW1pdD86IG51bWJlciB8IGZhbHNlXG4gICk6IEJlY2gzMkRlY29kZWQ8UHJlZml4PjtcbiAgZW5jb2RlRnJvbUJ5dGVzKHByZWZpeDogc3RyaW5nLCBieXRlczogVWludDhBcnJheSk6IHN0cmluZztcbiAgZGVjb2RlVG9CeXRlcyhzdHI6IHN0cmluZyk6IEJlY2gzMkRlY29kZWRXaXRoQXJyYXk7XG4gIGRlY29kZVVuc2FmZShzdHI6IHN0cmluZywgbGltaXQ/OiBudW1iZXIgfCBmYWxzZSk6IHZvaWQgfCBCZWNoMzJEZWNvZGVkPHN0cmluZz47XG4gIGZyb21Xb3Jkcyh0bzogbnVtYmVyW10pOiBVaW50OEFycmF5O1xuICBmcm9tV29yZHNVbnNhZmUodG86IG51bWJlcltdKTogdm9pZCB8IFVpbnQ4QXJyYXk7XG4gIHRvV29yZHMoZnJvbTogVWludDhBcnJheSk6IG51bWJlcltdO1xufVxuLyoqXG4gKiBAX19OT19TSURFX0VGRkVDVFNfX1xuICovXG5mdW5jdGlvbiBnZW5CZWNoMzIoZW5jb2Rpbmc6ICdiZWNoMzInIHwgJ2JlY2gzMm0nKTogQmVjaDMyIHtcbiAgY29uc3QgRU5DT0RJTkdfQ09OU1QgPSBlbmNvZGluZyA9PT0gJ2JlY2gzMicgPyAxIDogMHgyYmM4MzBhMztcbiAgY29uc3QgX3dvcmRzID0gcmFkaXgyKDUpO1xuICBjb25zdCBmcm9tV29yZHMgPSBfd29yZHMuZGVjb2RlO1xuICBjb25zdCB0b1dvcmRzID0gX3dvcmRzLmVuY29kZTtcbiAgY29uc3QgZnJvbVdvcmRzVW5zYWZlID0gdW5zYWZlV3JhcHBlcihmcm9tV29yZHMpO1xuXG4gIGZ1bmN0aW9uIGVuY29kZTxQcmVmaXggZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHByZWZpeDogUHJlZml4LFxuICAgIHdvcmRzOiBudW1iZXJbXSB8IFVpbnQ4QXJyYXksXG4gICAgbGltaXQ6IG51bWJlciB8IGZhbHNlID0gOTBcbiAgKTogYCR7TG93ZXJjYXNlPFByZWZpeD59MSR7c3RyaW5nfWAge1xuICAgIGFzdHIoJ2JlY2gzMi5lbmNvZGUgcHJlZml4JywgcHJlZml4KTtcbiAgICBpZiAoaXNCeXRlcyh3b3JkcykpIHdvcmRzID0gQXJyYXkuZnJvbSh3b3Jkcyk7XG4gICAgYW51bUFycignYmVjaDMyLmVuY29kZScsIHdvcmRzKTtcbiAgICBjb25zdCBwbGVuID0gcHJlZml4Lmxlbmd0aDtcbiAgICBpZiAocGxlbiA9PT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBwcmVmaXggbGVuZ3RoICR7cGxlbn1gKTtcbiAgICBjb25zdCBhY3R1YWxMZW5ndGggPSBwbGVuICsgNyArIHdvcmRzLmxlbmd0aDtcbiAgICBpZiAobGltaXQgIT09IGZhbHNlICYmIGFjdHVhbExlbmd0aCA+IGxpbWl0KVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTGVuZ3RoICR7YWN0dWFsTGVuZ3RofSBleGNlZWRzIGxpbWl0ICR7bGltaXR9YCk7XG4gICAgY29uc3QgbG93ZXJlZCA9IHByZWZpeC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHN1bSA9IGJlY2hDaGVja3N1bShsb3dlcmVkLCB3b3JkcywgRU5DT0RJTkdfQ09OU1QpO1xuICAgIHJldHVybiBgJHtsb3dlcmVkfTEke0JFQ0hfQUxQSEFCRVQuZW5jb2RlKHdvcmRzKX0ke3N1bX1gIGFzIGAke0xvd2VyY2FzZTxQcmVmaXg+fTEke3N0cmluZ31gO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlPFByZWZpeCBleHRlbmRzIHN0cmluZz4oXG4gICAgc3RyOiBgJHtQcmVmaXh9MSR7c3RyaW5nfWAsXG4gICAgbGltaXQ/OiBudW1iZXIgfCBmYWxzZVxuICApOiBCZWNoMzJEZWNvZGVkPFByZWZpeD47XG4gIGZ1bmN0aW9uIGRlY29kZShzdHI6IHN0cmluZywgbGltaXQ/OiBudW1iZXIgfCBmYWxzZSk6IEJlY2gzMkRlY29kZWQ7XG4gIGZ1bmN0aW9uIGRlY29kZShzdHI6IHN0cmluZywgbGltaXQ6IG51bWJlciB8IGZhbHNlID0gOTApOiBCZWNoMzJEZWNvZGVkIHtcbiAgICBhc3RyKCdiZWNoMzIuZGVjb2RlIGlucHV0Jywgc3RyKTtcbiAgICBjb25zdCBzbGVuID0gc3RyLmxlbmd0aDtcbiAgICBpZiAoc2xlbiA8IDggfHwgKGxpbWl0ICE9PSBmYWxzZSAmJiBzbGVuID4gbGltaXQpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCBzdHJpbmcgbGVuZ3RoOiAke3NsZW59ICgke3N0cn0pLiBFeHBlY3RlZCAoOC4uJHtsaW1pdH0pYCk7XG4gICAgLy8gZG9uJ3QgYWxsb3cgbWl4ZWQgY2FzZVxuICAgIGNvbnN0IGxvd2VyZWQgPSBzdHIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoc3RyICE9PSBsb3dlcmVkICYmIHN0ciAhPT0gc3RyLnRvVXBwZXJDYXNlKCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0cmluZyBtdXN0IGJlIGxvd2VyY2FzZSBvciB1cHBlcmNhc2VgKTtcbiAgICBjb25zdCBzZXBJbmRleCA9IGxvd2VyZWQubGFzdEluZGV4T2YoJzEnKTtcbiAgICBpZiAoc2VwSW5kZXggPT09IDAgfHwgc2VwSW5kZXggPT09IC0xKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZXR0ZXIgXCIxXCIgbXVzdCBiZSBwcmVzZW50IGJldHdlZW4gcHJlZml4IGFuZCBkYXRhIG9ubHlgKTtcbiAgICBjb25zdCBwcmVmaXggPSBsb3dlcmVkLnNsaWNlKDAsIHNlcEluZGV4KTtcbiAgICBjb25zdCBkYXRhID0gbG93ZXJlZC5zbGljZShzZXBJbmRleCArIDEpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IDYpIHRocm93IG5ldyBFcnJvcignRGF0YSBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyBsb25nJyk7XG4gICAgY29uc3Qgd29yZHMgPSBCRUNIX0FMUEhBQkVULmRlY29kZShkYXRhKS5zbGljZSgwLCAtNik7XG4gICAgY29uc3Qgc3VtID0gYmVjaENoZWNrc3VtKHByZWZpeCwgd29yZHMsIEVOQ09ESU5HX0NPTlNUKTtcbiAgICBpZiAoIWRhdGEuZW5kc1dpdGgoc3VtKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoZWNrc3VtIGluICR7c3RyfTogZXhwZWN0ZWQgXCIke3N1bX1cImApO1xuICAgIHJldHVybiB7IHByZWZpeCwgd29yZHMgfTtcbiAgfVxuXG4gIGNvbnN0IGRlY29kZVVuc2FmZSA9IHVuc2FmZVdyYXBwZXIoZGVjb2RlKTtcblxuICBmdW5jdGlvbiBkZWNvZGVUb0J5dGVzKHN0cjogc3RyaW5nKTogQmVjaDMyRGVjb2RlZFdpdGhBcnJheSB7XG4gICAgY29uc3QgeyBwcmVmaXgsIHdvcmRzIH0gPSBkZWNvZGUoc3RyLCBmYWxzZSk7XG4gICAgcmV0dXJuIHsgcHJlZml4LCB3b3JkcywgYnl0ZXM6IGZyb21Xb3Jkcyh3b3JkcykgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuY29kZUZyb21CeXRlcyhwcmVmaXg6IHN0cmluZywgYnl0ZXM6IFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gZW5jb2RlKHByZWZpeCwgdG9Xb3JkcyhieXRlcykpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlbmNvZGUsXG4gICAgZGVjb2RlLFxuICAgIGVuY29kZUZyb21CeXRlcyxcbiAgICBkZWNvZGVUb0J5dGVzLFxuICAgIGRlY29kZVVuc2FmZSxcbiAgICBmcm9tV29yZHMsXG4gICAgZnJvbVdvcmRzVW5zYWZlLFxuICAgIHRvV29yZHMsXG4gIH07XG59XG5cbi8qKlxuICogYmVjaDMyIGZyb20gQklQIDE3My4gT3BlcmF0ZXMgb24gd29yZHMuXG4gKiBGb3IgaGlnaC1sZXZlbCwgY2hlY2sgb3V0IHNjdXJlLWJ0Yy1zaWduZXI6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL3NjdXJlLWJ0Yy1zaWduZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBiZWNoMzI6IEJlY2gzMiA9IGdlbkJlY2gzMignYmVjaDMyJyk7XG5cbi8qKlxuICogYmVjaDMybSBmcm9tIEJJUCAzNTAuIE9wZXJhdGVzIG9uIHdvcmRzLlxuICogSXQgd2FzIHRvIG1pdGlnYXRlIGBiZWNoMzJgIHdlYWtuZXNzZXMuXG4gKiBGb3IgaGlnaC1sZXZlbCwgY2hlY2sgb3V0IHNjdXJlLWJ0Yy1zaWduZXI6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL3NjdXJlLWJ0Yy1zaWduZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBiZWNoMzJtOiBCZWNoMzIgPSBnZW5CZWNoMzIoJ2JlY2gzMm0nKTtcblxuZGVjbGFyZSBjb25zdCBUZXh0RW5jb2RlcjogYW55O1xuZGVjbGFyZSBjb25zdCBUZXh0RGVjb2RlcjogYW55O1xuXG4vKipcbiAqIFVURi04LXRvLWJ5dGUgZGVjb2Rlci4gVXNlcyBidWlsdC1pbiBUZXh0RGVjb2RlciAvIFRleHRFbmNvZGVyLlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBjb25zdCBiID0gdXRmOC5kZWNvZGUoXCJoZXlcIik7IC8vID0+IG5ldyBVaW50OEFycmF5KFsgMTA0LCAxMDEsIDEyMSBdKVxuICogY29uc3Qgc3RyID0gdXRmOC5lbmNvZGUoYik7IC8vIFwiaGV5XCJcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdXRmODogQnl0ZXNDb2RlciA9IHtcbiAgZW5jb2RlOiAoZGF0YSkgPT4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRhdGEpLFxuICBkZWNvZGU6IChzdHIpID0+IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpLFxufTtcblxuLy8gQnVpbHQtaW4gaGV4IGNvbnZlcnNpb24gaHR0cHM6Ly9jYW5pdXNlLmNvbS9tZG4tamF2YXNjcmlwdF9idWlsdGluc191aW50OGFycmF5X2Zyb21oZXhcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgaGFzSGV4QnVpbHRpbjogYm9vbGVhbiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT5cbiAgdHlwZW9mIChVaW50OEFycmF5IGFzIGFueSkuZnJvbShbXSkudG9IZXggPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIChVaW50OEFycmF5IGFzIGFueSkuZnJvbUhleCA9PT0gJ2Z1bmN0aW9uJykoKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgaGV4QnVpbHRpbjogQnl0ZXNDb2RlciA9IHtcbiAgZW5jb2RlKGRhdGEpIHsgYWJ5dGVzKGRhdGEpOyByZXR1cm4gKGRhdGEgYXMgYW55KS50b0hleCgpOyB9LFxuICBkZWNvZGUocykgeyBhc3RyKCdoZXgnLCBzKTsgcmV0dXJuIChVaW50OEFycmF5IGFzIGFueSkuZnJvbUhleChzKTsgfSxcbn07XG4vKipcbiAqIGhleCBzdHJpbmcgZGVjb2Rlci4gVXNlcyBidWlsdC1pbiBmdW5jdGlvbiwgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhhbXBsZVxuICogYGBganNcbiAqIGNvbnN0IGIgPSBoZXguZGVjb2RlKFwiMDEwMmZmXCIpOyAvLyA9PiBuZXcgVWludDhBcnJheShbIDEsIDIsIDI1NSBdKVxuICogY29uc3Qgc3RyID0gaGV4LmVuY29kZShiKTsgLy8gXCIwMTAyZmZcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBoZXg6IEJ5dGVzQ29kZXIgPSBoYXNIZXhCdWlsdGluXG4gID8gaGV4QnVpbHRpblxuICA6IGNoYWluKFxuICAgICAgcmFkaXgyKDQpLFxuICAgICAgYWxwaGFiZXQoJzAxMjM0NTY3ODlhYmNkZWYnKSxcbiAgICAgIGpvaW4oJycpLFxuICAgICAgbm9ybWFsaXplKChzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzICE9PSAnc3RyaW5nJyB8fCBzLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBoZXguZGVjb2RlOiBleHBlY3RlZCBzdHJpbmcsIGdvdCAke3R5cGVvZiBzfSB3aXRoIGxlbmd0aCAke3MubGVuZ3RofWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSlcbiAgICApO1xuXG5leHBvcnQgdHlwZSBTb21lQ29kZXJzID0ge1xuICB1dGY4OiBCeXRlc0NvZGVyO1xuICBoZXg6IEJ5dGVzQ29kZXI7XG4gIGJhc2UxNjogQnl0ZXNDb2RlcjtcbiAgYmFzZTMyOiBCeXRlc0NvZGVyO1xuICBiYXNlNjQ6IEJ5dGVzQ29kZXI7XG4gIGJhc2U2NHVybDogQnl0ZXNDb2RlcjtcbiAgYmFzZTU4OiBCeXRlc0NvZGVyO1xuICBiYXNlNTh4bXI6IEJ5dGVzQ29kZXI7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBDT0RFUlM6IFNvbWVDb2RlcnMgPSB7XG4gIHV0ZjgsIGhleCwgYmFzZTE2LCBiYXNlMzIsIGJhc2U2NCwgYmFzZTY0dXJsLCBiYXNlNTgsIGJhc2U1OHhtclxufTtcbnR5cGUgQ29kZXJUeXBlID0ga2V5b2YgU29tZUNvZGVycztcbmNvbnN0IGNvZGVyVHlwZUVycm9yID1cbiAgJ0ludmFsaWQgZW5jb2RpbmcgdHlwZS4gQXZhaWxhYmxlIHR5cGVzOiB1dGY4LCBoZXgsIGJhc2UxNiwgYmFzZTMyLCBiYXNlNjQsIGJhc2U2NHVybCwgYmFzZTU4LCBiYXNlNTh4bXInO1xuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBjb25zdCBieXRlc1RvU3RyaW5nID0gKHR5cGU6IENvZGVyVHlwZSwgYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8ICFDT0RFUlMuaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoY29kZXJUeXBlRXJyb3IpO1xuICBpZiAoIWlzQnl0ZXMoYnl0ZXMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdieXRlc1RvU3RyaW5nKCkgZXhwZWN0cyBVaW50OEFycmF5Jyk7XG4gIHJldHVybiBDT0RFUlNbdHlwZV0uZW5jb2RlKGJ5dGVzKTtcbn07XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGNvbnN0IHN0cjogKHR5cGU6IENvZGVyVHlwZSwgYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHN0cmluZyA9IGJ5dGVzVG9TdHJpbmc7IC8vIGFzIGluIHB5dGhvbiwgYnV0IGZvciBieXRlcyBvbmx5XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ1RvQnl0ZXMgPSAodHlwZTogQ29kZXJUeXBlLCBzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICBpZiAoIUNPREVSUy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihjb2RlclR5cGVFcnJvcik7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignc3RyaW5nVG9CeXRlcygpIGV4cGVjdHMgc3RyaW5nJyk7XG4gIHJldHVybiBDT0RFUlNbdHlwZV0uZGVjb2RlKHN0cik7XG59O1xuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgY29uc3QgYnl0ZXM6ICh0eXBlOiBDb2RlclR5cGUsIHN0cjogc3RyaW5nKSA9PiBVaW50OEFycmF5ID0gc3RyaW5nVG9CeXRlcztcbiIsICIvKipcbiAqIEBtb2R1bGUgbmlwcy9uaXAtNDZcbiAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRhdGlvbiBvZiBOSVAtNDYgKE5vc3RyIENvbm5lY3QgLyBSZW1vdGUgU2lnbmluZylcbiAqXG4gKiBQdXJlIHByb3RvY29sIGxheWVyIFx1MjAxNCBjcnlwdG8sIGVuY29kaW5nLCBtZXNzYWdlIGZvcm1hdHRpbmcuXG4gKiBObyBXZWJTb2NrZXQsIG5vIHJlbGF5IGNvbm5lY3Rpb25zLCBubyBJL08uXG4gKiBDb25zdW1lcnMgcHJvdmlkZSB0aGVpciBvd24gdHJhbnNwb3J0LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNDYubWRcbiAqL1xuXG5pbXBvcnQgeyBzY2hub3JyIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEuanMnO1xuaW1wb3J0IHsgYnl0ZXNUb0hleCwgaGV4VG9CeXRlcywgcmFuZG9tQnl0ZXMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmltcG9ydCB7IHNoYTI1NiB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvc2hhMi5qcyc7XG5pbXBvcnQge1xuICBnZXRDb252ZXJzYXRpb25LZXkgYXMgbmlwNDRHZXRDb252ZXJzYXRpb25LZXksXG4gIGVuY3J5cHQgYXMgbmlwNDRFbmNyeXB0LFxuICBkZWNyeXB0IGFzIG5pcDQ0RGVjcnlwdCxcbn0gZnJvbSAnLi9uaXAtNDQnO1xuaW1wb3J0IHR5cGUge1xuICBCdW5rZXJVUkksXG4gIEJ1bmtlclZhbGlkYXRpb25SZXN1bHQsXG4gIE5pcDQ2UmVxdWVzdCxcbiAgTmlwNDZSZXNwb25zZSxcbiAgTmlwNDZTZXNzaW9uLFxuICBOaXA0NlNlc3Npb25JbmZvLFxuICBTaWduZWROb3N0ckV2ZW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBOaXA0Nk1ldGhvZCB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIDEuIEJ1bmtlciBVUkkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogUGFyc2UgYSBidW5rZXI6Ly8gVVJJIGludG8gaXRzIGNvbXBvbmVudHNcbiAqIEBwYXJhbSB1cmkgLSBidW5rZXI6Ly8mbHQ7cmVtb3RlLXB1YmtleSZndDs/cmVsYXk9Li4uJnNlY3JldD0uLi5cbiAqIEByZXR1cm5zIFBhcnNlZCBCdW5rZXJVUkkgb3IgdGhyb3dzIG9uIGludmFsaWQgaW5wdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVua2VyVVJJKHVyaTogc3RyaW5nKTogQnVua2VyVVJJIHtcbiAgaWYgKCF1cmkuc3RhcnRzV2l0aCgnYnVua2VyOi8vJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYnVua2VyIFVSSTogbXVzdCBzdGFydCB3aXRoIGJ1bmtlcjovLycpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmkucmVwbGFjZSgnYnVua2VyOi8vJywgJ2h0dHBzOi8vJykpO1xuICBjb25zdCByZW1vdGVQdWJrZXkgPSB1cmwuaG9zdG5hbWU7XG5cbiAgaWYgKCEvXlswLTlhLWZdezY0fSQvLnRlc3QocmVtb3RlUHVia2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBidW5rZXIgVVJJOiByZW1vdGUgcHVia2V5IG11c3QgYmUgNjQgaGV4IGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGNvbnN0IHJlbGF5cyA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0QWxsKCdyZWxheScpO1xuICBpZiAocmVsYXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBidW5rZXIgVVJJOiBhdCBsZWFzdCBvbmUgcmVsYXkgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IHNlY3JldCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdzZWNyZXQnKSB8fCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHsgcmVtb3RlUHVia2V5LCByZWxheXMsIHNlY3JldCB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJ1bmtlcjovLyBVUkkgc3RyaW5nXG4gKiBAcGFyYW0gcmVtb3RlUHVia2V5IC0gUmVtb3RlIHNpZ25lcidzIHB1YmxpYyBrZXkgKGhleClcbiAqIEBwYXJhbSByZWxheXMgLSBSZWxheSBVUkxzXG4gKiBAcGFyYW0gc2VjcmV0IC0gT3B0aW9uYWwgY29ubmVjdGlvbiBzZWNyZXRcbiAqIEByZXR1cm5zIGJ1bmtlcjovLyBVUkkgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdW5rZXJVUkkocmVtb3RlUHVia2V5OiBzdHJpbmcsIHJlbGF5czogc3RyaW5nW10sIHNlY3JldD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghL15bMC05YS1mXXs2NH0kLy50ZXN0KHJlbW90ZVB1YmtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW90ZVB1YmtleSBtdXN0IGJlIDY0IGhleCBjaGFyYWN0ZXJzJyk7XG4gIH1cbiAgaWYgKHJlbGF5cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2F0IGxlYXN0IG9uZSByZWxheSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zID0gcmVsYXlzLm1hcChyID0+IGByZWxheT0ke2VuY29kZVVSSUNvbXBvbmVudChyKX1gKTtcbiAgaWYgKHNlY3JldCkge1xuICAgIHBhcmFtcy5wdXNoKGBzZWNyZXQ9JHtlbmNvZGVVUklDb21wb25lbnQoc2VjcmV0KX1gKTtcbiAgfVxuXG4gIHJldHVybiBgYnVua2VyOi8vJHtyZW1vdGVQdWJrZXl9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgYnVua2VyOi8vIFVSSSBhbmQgcmV0dXJuIHN0cnVjdHVyZWQgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJ1bmtlclVSSSh1cmk6IHN0cmluZyk6IEJ1bmtlclZhbGlkYXRpb25SZXN1bHQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQnVua2VyVVJJKHVyaSk7XG4gICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgdXJpOiBwYXJzZWQgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IGZhbHNlLCBlcnJvcjogKGUgYXMgRXJyb3IpLm1lc3NhZ2UgfTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgMi4gU2Vzc2lvbiBNYW5hZ2VtZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBOSVAtNDYgc2Vzc2lvbiB3aXRoIGFuIGVwaGVtZXJhbCBrZXlwYWlyXG4gKiBAcGFyYW0gcmVtb3RlUHVia2V5IC0gUmVtb3RlIHNpZ25lcidzIHB1YmxpYyBrZXkgKGhleClcbiAqIEByZXR1cm5zIFNlc3Npb24gY29udGFpbmluZyBlcGhlbWVyYWwga2V5cyBhbmQgTklQLTQ0IGNvbnZlcnNhdGlvbiBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlc3Npb24ocmVtb3RlUHVia2V5OiBzdHJpbmcpOiBOaXA0NlNlc3Npb24ge1xuICBpZiAoIS9eWzAtOWEtZl17NjR9JC8udGVzdChyZW1vdGVQdWJrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZW1vdGVQdWJrZXkgbXVzdCBiZSA2NCBoZXggY2hhcmFjdGVycycpO1xuICB9XG5cbiAgY29uc3QgY2xpZW50U2VjcmV0S2V5Qnl0ZXMgPSByYW5kb21CeXRlcygzMik7XG4gIGNvbnN0IGNsaWVudFNlY3JldEtleSA9IGJ5dGVzVG9IZXgoY2xpZW50U2VjcmV0S2V5Qnl0ZXMpO1xuICBjb25zdCBjbGllbnRQdWJrZXlCeXRlcyA9IHNjaG5vcnIuZ2V0UHVibGljS2V5KGNsaWVudFNlY3JldEtleUJ5dGVzKTtcbiAgY29uc3QgY2xpZW50UHVia2V5ID0gYnl0ZXNUb0hleChjbGllbnRQdWJrZXlCeXRlcyk7XG5cbiAgY29uc3QgY29udmVyc2F0aW9uS2V5ID0gbmlwNDRHZXRDb252ZXJzYXRpb25LZXkoY2xpZW50U2VjcmV0S2V5Qnl0ZXMsIHJlbW90ZVB1YmtleSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjbGllbnRTZWNyZXRLZXksXG4gICAgY2xpZW50UHVia2V5LFxuICAgIHJlbW90ZVB1YmtleSxcbiAgICBjb252ZXJzYXRpb25LZXksXG4gIH07XG59XG5cbi8qKlxuICogUmVzdG9yZSBhIHNlc3Npb24gZnJvbSBhIHByZXZpb3VzbHkgc2F2ZWQgZXBoZW1lcmFsIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gY2xpZW50U2VjcmV0S2V5IC0gSGV4LWVuY29kZWQgZXBoZW1lcmFsIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gcmVtb3RlUHVia2V5IC0gUmVtb3RlIHNpZ25lcidzIHB1YmxpYyBrZXkgKGhleClcbiAqIEByZXR1cm5zIFJlc3RvcmVkIHNlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVTZXNzaW9uKGNsaWVudFNlY3JldEtleTogc3RyaW5nLCByZW1vdGVQdWJrZXk6IHN0cmluZyk6IE5pcDQ2U2Vzc2lvbiB7XG4gIGNvbnN0IGNsaWVudFNlY3JldEtleUJ5dGVzID0gaGV4VG9CeXRlcyhjbGllbnRTZWNyZXRLZXkpO1xuICBjb25zdCBjbGllbnRQdWJrZXlCeXRlcyA9IHNjaG5vcnIuZ2V0UHVibGljS2V5KGNsaWVudFNlY3JldEtleUJ5dGVzKTtcbiAgY29uc3QgY2xpZW50UHVia2V5ID0gYnl0ZXNUb0hleChjbGllbnRQdWJrZXlCeXRlcyk7XG5cbiAgY29uc3QgY29udmVyc2F0aW9uS2V5ID0gbmlwNDRHZXRDb252ZXJzYXRpb25LZXkoY2xpZW50U2VjcmV0S2V5Qnl0ZXMsIHJlbW90ZVB1YmtleSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjbGllbnRTZWNyZXRLZXksXG4gICAgY2xpZW50UHVia2V5LFxuICAgIHJlbW90ZVB1YmtleSxcbiAgICBjb252ZXJzYXRpb25LZXksXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHB1YmxpYyBzZXNzaW9uIGluZm8gKHNhZmUgdG8gZXhwb3NlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vzc2lvbkluZm8oc2Vzc2lvbjogTmlwNDZTZXNzaW9uKTogTmlwNDZTZXNzaW9uSW5mbyB7XG4gIHJldHVybiB7XG4gICAgY2xpZW50UHVia2V5OiBzZXNzaW9uLmNsaWVudFB1YmtleSxcbiAgICByZW1vdGVQdWJrZXk6IHNlc3Npb24ucmVtb3RlUHVia2V5LFxuICB9O1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgMy4gSlNPTi1SUEMgTWVzc2FnZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQ3JlYXRlIGEgTklQLTQ2IEpTT04tUlBDIHJlcXVlc3RcbiAqIEBwYXJhbSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAqIEBwYXJhbSBwYXJhbXMgLSBBcnJheSBvZiBzdHJpbmcgcGFyYW1ldGVyc1xuICogQHBhcmFtIGlkIC0gT3B0aW9uYWwgcmVxdWVzdCBJRCAocmFuZG9tIGlmIG5vdCBwcm92aWRlZClcbiAqIEByZXR1cm5zIEpTT04tUlBDIHJlcXVlc3Qgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0KG1ldGhvZDogTmlwNDZNZXRob2QgfCBzdHJpbmcsIHBhcmFtczogc3RyaW5nW10sIGlkPzogc3RyaW5nKTogTmlwNDZSZXF1ZXN0IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogaWQgfHwgYnl0ZXNUb0hleChyYW5kb21CeXRlcygxNikpLFxuICAgIG1ldGhvZCxcbiAgICBwYXJhbXMsXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTklQLTQ2IEpTT04tUlBDIHJlc3BvbnNlXG4gKiBAcGFyYW0gaWQgLSBSZXF1ZXN0IElEIGJlaW5nIHJlc3BvbmRlZCB0b1xuICogQHBhcmFtIHJlc3VsdCAtIFJlc3VsdCBzdHJpbmcgKG9uIHN1Y2Nlc3MpXG4gKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBzdHJpbmcgKG9uIGZhaWx1cmUpXG4gKiBAcmV0dXJucyBKU09OLVJQQyByZXNwb25zZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlKGlkOiBzdHJpbmcsIHJlc3VsdD86IHN0cmluZywgZXJyb3I/OiBzdHJpbmcpOiBOaXA0NlJlc3BvbnNlIHtcbiAgY29uc3QgcmVzcG9uc2U6IE5pcDQ2UmVzcG9uc2UgPSB7IGlkIH07XG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2UucmVzdWx0ID0gcmVzdWx0O1xuICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2UuZXJyb3IgPSBlcnJvcjtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBzdHJpbmcgaW50byBhIE5JUC00NiByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ganNvbiAtIEpTT04gc3RyaW5nIHRvIHBhcnNlXG4gKiBAcmV0dXJucyBQYXJzZWQgcmVxdWVzdCBvciByZXNwb25zZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXlsb2FkKGpzb246IHN0cmluZyk6IE5pcDQ2UmVxdWVzdCB8IE5pcDQ2UmVzcG9uc2Uge1xuICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGpzb24pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodHlwZW9mIG9iai5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgTklQLTQ2IHBheWxvYWQ6IG1pc3NpbmcgaWQnKTtcbiAgfVxuICByZXR1cm4gb2JqIGFzIHVua25vd24gYXMgTmlwNDZSZXF1ZXN0IHwgTmlwNDZSZXNwb25zZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBheWxvYWQgaXMgYSBOSVAtNDYgcmVxdWVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXF1ZXN0KHBheWxvYWQ6IE5pcDQ2UmVxdWVzdCB8IE5pcDQ2UmVzcG9uc2UpOiBwYXlsb2FkIGlzIE5pcDQ2UmVxdWVzdCB7XG4gIHJldHVybiAnbWV0aG9kJyBpbiBwYXlsb2FkICYmICdwYXJhbXMnIGluIHBheWxvYWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwYXlsb2FkIGlzIGEgTklQLTQ2IHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3BvbnNlKHBheWxvYWQ6IE5pcDQ2UmVxdWVzdCB8IE5pcDQ2UmVzcG9uc2UpOiBwYXlsb2FkIGlzIE5pcDQ2UmVzcG9uc2Uge1xuICByZXR1cm4gJ3Jlc3VsdCcgaW4gcGF5bG9hZCB8fCAnZXJyb3InIGluIHBheWxvYWQ7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCA0LiBFdmVudCBXcmFwcGluZyAoS2luZCAyNDEzMykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogRW5jcnlwdCBhbmQgd3JhcCBhIE5JUC00NiBwYXlsb2FkIGludG8gYSBraW5kIDI0MTMzIHNpZ25lZCBldmVudFxuICogQHBhcmFtIHBheWxvYWQgLSBKU09OLVJQQyByZXF1ZXN0IG9yIHJlc3BvbnNlIHRvIGVuY3J5cHRcbiAqIEBwYXJhbSBzZXNzaW9uIC0gTklQLTQ2IHNlc3Npb25cbiAqIEBwYXJhbSByZWNpcGllbnRQdWJrZXkgLSBUaGUgcmVjaXBpZW50J3MgcHVia2V5IChoZXgpXG4gKiBAcmV0dXJucyBTaWduZWQga2luZCAyNDEzMyBldmVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JhcEV2ZW50KFxuICBwYXlsb2FkOiBOaXA0NlJlcXVlc3QgfCBOaXA0NlJlc3BvbnNlLFxuICBzZXNzaW9uOiBOaXA0NlNlc3Npb24sXG4gIHJlY2lwaWVudFB1YmtleTogc3RyaW5nXG4pOiBQcm9taXNlPFNpZ25lZE5vc3RyRXZlbnQ+IHtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICBjb25zdCBlbmNyeXB0ZWQgPSBuaXA0NEVuY3J5cHQoanNvbiwgc2Vzc2lvbi5jb252ZXJzYXRpb25LZXkpO1xuXG4gIGNvbnN0IGNyZWF0ZWRfYXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgY29uc3QgZXZlbnQgPSB7XG4gICAga2luZDogMjQxMzMsXG4gICAgY3JlYXRlZF9hdCxcbiAgICB0YWdzOiBbWydwJywgcmVjaXBpZW50UHVia2V5XV0sXG4gICAgY29udGVudDogZW5jcnlwdGVkLFxuICAgIHB1YmtleTogc2Vzc2lvbi5jbGllbnRQdWJrZXksXG4gIH07XG5cbiAgLy8gU2VyaWFsaXplIGZvciBOSVAtMDEgZXZlbnQgSURcbiAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KFtcbiAgICAwLFxuICAgIGV2ZW50LnB1YmtleSxcbiAgICBldmVudC5jcmVhdGVkX2F0LFxuICAgIGV2ZW50LmtpbmQsXG4gICAgZXZlbnQudGFncyxcbiAgICBldmVudC5jb250ZW50LFxuICBdKTtcblxuICBjb25zdCBldmVudEhhc2ggPSBzaGEyNTYobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHNlcmlhbGl6ZWQpKTtcbiAgY29uc3QgcHJpdmF0ZUtleUJ5dGVzID0gaGV4VG9CeXRlcyhzZXNzaW9uLmNsaWVudFNlY3JldEtleSk7XG4gIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gc2Nobm9yci5zaWduKGV2ZW50SGFzaCwgcHJpdmF0ZUtleUJ5dGVzKTtcblxuICByZXR1cm4ge1xuICAgIC4uLmV2ZW50LFxuICAgIGlkOiBieXRlc1RvSGV4KGV2ZW50SGFzaCksXG4gICAgc2lnOiBieXRlc1RvSGV4KHNpZ25hdHVyZUJ5dGVzKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGFuZCBwYXJzZSBhIGtpbmQgMjQxMzMgZXZlbnRcbiAqIEBwYXJhbSBldmVudCAtIFNpZ25lZCBraW5kIDI0MTMzIGV2ZW50XG4gKiBAcGFyYW0gc2Vzc2lvbiAtIE5JUC00NiBzZXNzaW9uXG4gKiBAcmV0dXJucyBEZWNyeXB0ZWQgSlNPTi1SUEMgcmVxdWVzdCBvciByZXNwb25zZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwRXZlbnQoXG4gIGV2ZW50OiBTaWduZWROb3N0ckV2ZW50LFxuICBzZXNzaW9uOiBOaXA0NlNlc3Npb25cbik6IE5pcDQ2UmVxdWVzdCB8IE5pcDQ2UmVzcG9uc2Uge1xuICBpZiAoZXZlbnQua2luZCAhPT0gMjQxMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGtpbmQgMjQxMzMsIGdvdCAke2V2ZW50LmtpbmR9YCk7XG4gIH1cblxuICBjb25zdCBqc29uID0gbmlwNDREZWNyeXB0KGV2ZW50LmNvbnRlbnQsIHNlc3Npb24uY29udmVyc2F0aW9uS2V5KTtcbiAgcmV0dXJuIHBhcnNlUGF5bG9hZChqc29uKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIDUuIENvbnZlbmllbmNlIFJlcXVlc3QgQ3JlYXRvcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbi8qKlxuICogQ3JlYXRlIGEgJ2Nvbm5lY3QnIHJlcXVlc3RcbiAqIEBwYXJhbSByZW1vdGVQdWJrZXkgLSBSZW1vdGUgc2lnbmVyJ3MgcHVia2V5XG4gKiBAcGFyYW0gc2VjcmV0IC0gT3B0aW9uYWwgY29ubmVjdGlvbiBzZWNyZXQgZnJvbSBidW5rZXIgVVJJXG4gKiBAcGFyYW0gcGVybWlzc2lvbnMgLSBPcHRpb25hbCBjb21tYS1zZXBhcmF0ZWQgcGVybWlzc2lvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RSZXF1ZXN0KHJlbW90ZVB1YmtleTogc3RyaW5nLCBzZWNyZXQ/OiBzdHJpbmcsIHBlcm1pc3Npb25zPzogc3RyaW5nKTogTmlwNDZSZXF1ZXN0IHtcbiAgY29uc3QgcGFyYW1zID0gW3JlbW90ZVB1YmtleV07XG4gIGlmIChzZWNyZXQpIHBhcmFtcy5wdXNoKHNlY3JldCk7XG4gIGVsc2UgaWYgKHBlcm1pc3Npb25zKSBwYXJhbXMucHVzaCgnJyk7XG4gIGlmIChwZXJtaXNzaW9ucykgcGFyYW1zLnB1c2gocGVybWlzc2lvbnMpO1xuICByZXR1cm4gY3JlYXRlUmVxdWVzdChOaXA0Nk1ldGhvZC5DT05ORUNULCBwYXJhbXMpO1xufVxuXG4vKiogQ3JlYXRlIGEgJ3BpbmcnIHJlcXVlc3QgKi9cbmV4cG9ydCBmdW5jdGlvbiBwaW5nUmVxdWVzdCgpOiBOaXA0NlJlcXVlc3Qge1xuICByZXR1cm4gY3JlYXRlUmVxdWVzdChOaXA0Nk1ldGhvZC5QSU5HLCBbXSk7XG59XG5cbi8qKiBDcmVhdGUgYSAnZ2V0X3B1YmxpY19rZXknIHJlcXVlc3QgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQdWJsaWNLZXlSZXF1ZXN0KCk6IE5pcDQ2UmVxdWVzdCB7XG4gIHJldHVybiBjcmVhdGVSZXF1ZXN0KE5pcDQ2TWV0aG9kLkdFVF9QVUJMSUNfS0VZLCBbXSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgJ3NpZ25fZXZlbnQnIHJlcXVlc3RcbiAqIEBwYXJhbSBldmVudEpzb24gLSBKU09OLXN0cmluZ2lmaWVkIHVuc2lnbmVkIGV2ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduRXZlbnRSZXF1ZXN0KGV2ZW50SnNvbjogc3RyaW5nKTogTmlwNDZSZXF1ZXN0IHtcbiAgcmV0dXJuIGNyZWF0ZVJlcXVlc3QoTmlwNDZNZXRob2QuU0lHTl9FVkVOVCwgW2V2ZW50SnNvbl0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhICduaXAwNF9lbmNyeXB0JyByZXF1ZXN0XG4gKiBAcGFyYW0gdGhpcmRQYXJ0eVB1YmtleSAtIFB1YmxpYyBrZXkgb2YgdGhlIG1lc3NhZ2UgcmVjaXBpZW50XG4gKiBAcGFyYW0gcGxhaW50ZXh0IC0gTWVzc2FnZSB0byBlbmNyeXB0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuaXAwNEVuY3J5cHRSZXF1ZXN0KHRoaXJkUGFydHlQdWJrZXk6IHN0cmluZywgcGxhaW50ZXh0OiBzdHJpbmcpOiBOaXA0NlJlcXVlc3Qge1xuICByZXR1cm4gY3JlYXRlUmVxdWVzdChOaXA0Nk1ldGhvZC5OSVAwNF9FTkNSWVBULCBbdGhpcmRQYXJ0eVB1YmtleSwgcGxhaW50ZXh0XSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgJ25pcDA0X2RlY3J5cHQnIHJlcXVlc3RcbiAqIEBwYXJhbSB0aGlyZFBhcnR5UHVia2V5IC0gUHVibGljIGtleSBvZiB0aGUgbWVzc2FnZSBzZW5kZXJcbiAqIEBwYXJhbSBjaXBoZXJ0ZXh0IC0gRW5jcnlwdGVkIG1lc3NhZ2UgdG8gZGVjcnlwdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmlwMDREZWNyeXB0UmVxdWVzdCh0aGlyZFBhcnR5UHVia2V5OiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IE5pcDQ2UmVxdWVzdCB7XG4gIHJldHVybiBjcmVhdGVSZXF1ZXN0KE5pcDQ2TWV0aG9kLk5JUDA0X0RFQ1JZUFQsIFt0aGlyZFBhcnR5UHVia2V5LCBjaXBoZXJ0ZXh0XSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgJ25pcDQ0X2VuY3J5cHQnIHJlcXVlc3RcbiAqIEBwYXJhbSB0aGlyZFBhcnR5UHVia2V5IC0gUHVibGljIGtleSBvZiB0aGUgbWVzc2FnZSByZWNpcGllbnRcbiAqIEBwYXJhbSBwbGFpbnRleHQgLSBNZXNzYWdlIHRvIGVuY3J5cHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5pcDQ0RW5jcnlwdFJlcXVlc3QodGhpcmRQYXJ0eVB1YmtleTogc3RyaW5nLCBwbGFpbnRleHQ6IHN0cmluZyk6IE5pcDQ2UmVxdWVzdCB7XG4gIHJldHVybiBjcmVhdGVSZXF1ZXN0KE5pcDQ2TWV0aG9kLk5JUDQ0X0VOQ1JZUFQsIFt0aGlyZFBhcnR5UHVia2V5LCBwbGFpbnRleHRdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSAnbmlwNDRfZGVjcnlwdCcgcmVxdWVzdFxuICogQHBhcmFtIHRoaXJkUGFydHlQdWJrZXkgLSBQdWJsaWMga2V5IG9mIHRoZSBtZXNzYWdlIHNlbmRlclxuICogQHBhcmFtIGNpcGhlcnRleHQgLSBFbmNyeXB0ZWQgbWVzc2FnZSB0byBkZWNyeXB0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuaXA0NERlY3J5cHRSZXF1ZXN0KHRoaXJkUGFydHlQdWJrZXk6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogTmlwNDZSZXF1ZXN0IHtcbiAgcmV0dXJuIGNyZWF0ZVJlcXVlc3QoTmlwNDZNZXRob2QuTklQNDRfREVDUllQVCwgW3RoaXJkUGFydHlQdWJrZXksIGNpcGhlcnRleHRdKTtcbn1cblxuLyoqIENyZWF0ZSBhICdnZXRfcmVsYXlzJyByZXF1ZXN0ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVsYXlzUmVxdWVzdCgpOiBOaXA0NlJlcXVlc3Qge1xuICByZXR1cm4gY3JlYXRlUmVxdWVzdChOaXA0Nk1ldGhvZC5HRVRfUkVMQVlTLCBbXSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCA2LiBGaWx0ZXIgSGVscGVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4vKipcbiAqIENyZWF0ZSBhIE5vc3RyIGZpbHRlciBmb3Igc3Vic2NyaWJpbmcgdG8gTklQLTQ2IHJlc3BvbnNlIGV2ZW50c1xuICogQHBhcmFtIGNsaWVudFB1YmtleSAtIE91ciBlcGhlbWVyYWwgcHVibGljIGtleSAoaGV4KVxuICogQHBhcmFtIHNpbmNlIC0gT3B0aW9uYWwgc2luY2UgdGltZXN0YW1wXG4gKiBAcmV0dXJucyBGaWx0ZXIgb2JqZWN0IGZvciBraW5kIDI0MTMzIGV2ZW50cyB0YWdnZWQgdG8gdXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRmlsdGVyKFxuICBjbGllbnRQdWJrZXk6IHN0cmluZyxcbiAgc2luY2U/OiBudW1iZXJcbik6IHsga2luZHM6IG51bWJlcltdOyAnI3AnOiBzdHJpbmdbXTsgc2luY2U/OiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpbHRlcjogeyBraW5kczogbnVtYmVyW107ICcjcCc6IHN0cmluZ1tdOyBzaW5jZT86IG51bWJlciB9ID0ge1xuICAgIGtpbmRzOiBbMjQxMzNdLFxuICAgICcjcCc6IFtjbGllbnRQdWJrZXldLFxuICB9O1xuICBpZiAoc2luY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIGZpbHRlci5zaW5jZSA9IHNpbmNlO1xuICB9XG4gIHJldHVybiBmaWx0ZXI7XG59XG4iLCAiLyoqXG4gKiBAbW9kdWxlIG5pcHMvbmlwLTQ5XG4gKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgTklQLTQ5IChQcml2YXRlIEtleSBFbmNyeXB0aW9uIC8gbmNyeXB0c2VjKVxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci80OS5tZFxuICovXG5cbmltcG9ydCB7IHhjaGFjaGEyMHBvbHkxMzA1IH0gZnJvbSAnQG5vYmxlL2NpcGhlcnMvY2hhY2hhLmpzJztcbmltcG9ydCB7IHNjcnlwdCB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvc2NyeXB0LmpzJztcbmltcG9ydCB7IGNvbmNhdEJ5dGVzLCByYW5kb21CeXRlcyB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMuanMnO1xuaW1wb3J0IHsgYmVjaDMyIGFzIHNjdXJlQmVjaDMyIH0gZnJvbSAnQHNjdXJlL2Jhc2UnO1xuXG50eXBlIEtleVNlY3VyaXR5Qnl0ZSA9IDB4MDAgfCAweDAxIHwgMHgwMjtcblxuLyoqXG4gKiBFbmNyeXB0IGEgTm9zdHIgcHJpdmF0ZSBrZXkgd2l0aCBhIHBhc3N3b3JkLCBwcm9kdWNpbmcgYW4gbmNyeXB0c2VjIGJlY2gzMiBzdHJpbmdcbiAqIEBwYXJhbSBzZWMgLSAzMi1ieXRlIHNlY3JldCBrZXlcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFBhc3N3b3JkIGZvciBlbmNyeXB0aW9uXG4gKiBAcGFyYW0gbG9nbiAtIFNjcnlwdCBsb2cyKE4pIHBhcmFtZXRlciAoZGVmYXVsdDogMTYsIG1lYW5pbmcgTj02NTUzNilcbiAqIEBwYXJhbSBrc2IgLSBLZXkgc2VjdXJpdHkgYnl0ZTogMHgwMD11bmtub3duLCAweDAxPXVuc2FmZSwgMHgwMj1zYWZlIChkZWZhdWx0OiAweDAyKVxuICogQHJldHVybnMgYmVjaDMyLWVuY29kZWQgbmNyeXB0c2VjIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdChcbiAgc2VjOiBVaW50OEFycmF5LFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBsb2duOiBudW1iZXIgPSAxNixcbiAga3NiOiBLZXlTZWN1cml0eUJ5dGUgPSAweDAyXG4pOiBzdHJpbmcge1xuICBjb25zdCBzYWx0ID0gcmFuZG9tQnl0ZXMoMTYpO1xuICBjb25zdCBuID0gMiAqKiBsb2duO1xuICBjb25zdCBub3JtYWxpemVkUGFzc3dvcmQgPSBwYXNzd29yZC5ub3JtYWxpemUoJ05GS0MnKTtcbiAgY29uc3Qga2V5ID0gc2NyeXB0KG5vcm1hbGl6ZWRQYXNzd29yZCwgc2FsdCwgeyBOOiBuLCByOiA4LCBwOiAxLCBka0xlbjogMzIgfSk7XG4gIGNvbnN0IG5vbmNlID0gcmFuZG9tQnl0ZXMoMjQpO1xuICBjb25zdCBhYWQgPSBVaW50OEFycmF5LmZyb20oW2tzYl0pO1xuICBjb25zdCBjaXBoZXIgPSB4Y2hhY2hhMjBwb2x5MTMwNShrZXksIG5vbmNlLCBhYWQpO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gY2lwaGVyLmVuY3J5cHQoc2VjKTtcbiAgLy8gQmluYXJ5IGZvcm1hdDogdmVyc2lvbigxKSArIGxvZ24oMSkgKyBzYWx0KDE2KSArIG5vbmNlKDI0KSArIGtzYigxKSArIGNpcGhlcnRleHQoNDggPSAzMiArIDE2IHRhZylcbiAgY29uc3QgcGF5bG9hZCA9IGNvbmNhdEJ5dGVzKFxuICAgIFVpbnQ4QXJyYXkuZnJvbShbMHgwMl0pLFxuICAgIFVpbnQ4QXJyYXkuZnJvbShbbG9nbl0pLFxuICAgIHNhbHQsXG4gICAgbm9uY2UsXG4gICAgYWFkLFxuICAgIGNpcGhlcnRleHRcbiAgKTtcbiAgY29uc3Qgd29yZHMgPSBzY3VyZUJlY2gzMi50b1dvcmRzKHBheWxvYWQpO1xuICByZXR1cm4gc2N1cmVCZWNoMzIuZW5jb2RlKCduY3J5cHRzZWMnLCB3b3JkcywgMjAwKTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGFuIG5jcnlwdHNlYyBiZWNoMzIgc3RyaW5nIGJhY2sgdG8gdGhlIDMyLWJ5dGUgc2VjcmV0IGtleVxuICogQHBhcmFtIG5jcnlwdHNlYyAtIGJlY2gzMi1lbmNvZGVkIG5jcnlwdHNlYyBzdHJpbmdcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpb25cbiAqIEByZXR1cm5zIDMyLWJ5dGUgc2VjcmV0IGtleSBhcyBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyeXB0KG5jcnlwdHNlYzogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHsgcHJlZml4LCB3b3JkcyB9ID0gc2N1cmVCZWNoMzIuZGVjb2RlKG5jcnlwdHNlYyBhcyBgJHtzdHJpbmd9MSR7c3RyaW5nfWAsIDIwMCk7XG4gIGlmIChwcmVmaXggIT09ICduY3J5cHRzZWMnKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbmNyeXB0c2VjIHByZWZpeCcpO1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoc2N1cmVCZWNoMzIuZnJvbVdvcmRzKHdvcmRzKSk7XG4gIGNvbnN0IHZlcnNpb24gPSBkYXRhWzBdO1xuICBpZiAodmVyc2lvbiAhPT0gMHgwMikgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG5jcnlwdHNlYyB2ZXJzaW9uOiAke3ZlcnNpb259YCk7XG4gIGNvbnN0IGxvZ24gPSBkYXRhWzFdO1xuICBjb25zdCBzYWx0ID0gZGF0YS5zdWJhcnJheSgyLCAxOCk7XG4gIGNvbnN0IG5vbmNlID0gZGF0YS5zdWJhcnJheSgxOCwgNDIpO1xuICBjb25zdCBrc2IgPSBkYXRhWzQyXTtcbiAgY29uc3QgY2lwaGVydGV4dCA9IGRhdGEuc3ViYXJyYXkoNDMpO1xuICBjb25zdCBuID0gMiAqKiBsb2duO1xuICBjb25zdCBub3JtYWxpemVkUGFzc3dvcmQgPSBwYXNzd29yZC5ub3JtYWxpemUoJ05GS0MnKTtcbiAgY29uc3Qga2V5ID0gc2NyeXB0KG5vcm1hbGl6ZWRQYXNzd29yZCwgc2FsdCwgeyBOOiBuLCByOiA4LCBwOiAxLCBka0xlbjogMzIgfSk7XG4gIGNvbnN0IGFhZCA9IFVpbnQ4QXJyYXkuZnJvbShba3NiXSk7XG4gIGNvbnN0IGNpcGhlciA9IHhjaGFjaGEyMHBvbHkxMzA1KGtleSwgbm9uY2UsIGFhZCk7XG4gIHJldHVybiBjaXBoZXIuZGVjcnlwdChjaXBoZXJ0ZXh0KTtcbn1cbiIsICIvKipcbiAqIFJGQyA3OTE0IFNjcnlwdCBLREYuIENhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGtleSBmcm9tIHBhc3N3b3JkIGFuZCBzYWx0LlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBwYmtkZjIgfSBmcm9tICcuL3Bia2RmMi50cyc7XG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICcuL3NoYTIudHMnO1xuLy8gcHJldHRpZXItaWdub3JlXG5pbXBvcnQge1xuICBhbnVtYmVyLCBhc3luY0xvb3AsXG4gIGNoZWNrT3B0cywgY2xlYW4sXG4gIHR5cGUgS0RGSW5wdXQsIHJvdGwsXG4gIHN3YXAzMklmQkUsXG4gIHUzMlxufSBmcm9tICcuL3V0aWxzLnRzJztcblxuLy8gVGhlIG1haW4gU2NyeXB0IGxvb3A6IHVzZXMgU2Fsc2EgZXh0ZW5zaXZlbHkuXG4vLyBTaXggdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIHdlcmUgdHJpZWQsIHRoaXMgaXMgdGhlIGZhc3Rlc3Qgb25lLlxuLy8gcHJldHRpZXItaWdub3JlXG5mdW5jdGlvbiBYb3JBbmRTYWxzYShcbiAgcHJldjogVWludDMyQXJyYXksXG4gIHBpOiBudW1iZXIsXG4gIGlucHV0OiBVaW50MzJBcnJheSxcbiAgaWk6IG51bWJlcixcbiAgb3V0OiBVaW50MzJBcnJheSxcbiAgb2k6IG51bWJlclxuKSB7XG4gIC8vIEJhc2VkIG9uIGh0dHBzOi8vY3IueXAudG8vc2Fsc2EyMC5odG1sXG4gIC8vIFhvciBibG9ja3NcbiAgbGV0IHkwMCA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXSwgeTAxID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdO1xuICBsZXQgeTAyID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdLCB5MDMgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK107XG4gIGxldCB5MDQgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK10sIHkwNSA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXTtcbiAgbGV0IHkwNiA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXSwgeTA3ID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdO1xuICBsZXQgeTA4ID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdLCB5MDkgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK107XG4gIGxldCB5MTAgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK10sIHkxMSA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXTtcbiAgbGV0IHkxMiA9IHByZXZbcGkrK10gXiBpbnB1dFtpaSsrXSwgeTEzID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdO1xuICBsZXQgeTE0ID0gcHJldltwaSsrXSBeIGlucHV0W2lpKytdLCB5MTUgPSBwcmV2W3BpKytdIF4gaW5wdXRbaWkrK107XG4gIC8vIFNhdmUgc3RhdGUgdG8gdGVtcG9yYXJ5IHZhcmlhYmxlcyAoc2Fsc2EpXG4gIGxldCB4MDAgPSB5MDAsIHgwMSA9IHkwMSwgeDAyID0geTAyLCB4MDMgPSB5MDMsXG4gICAgICB4MDQgPSB5MDQsIHgwNSA9IHkwNSwgeDA2ID0geTA2LCB4MDcgPSB5MDcsXG4gICAgICB4MDggPSB5MDgsIHgwOSA9IHkwOSwgeDEwID0geTEwLCB4MTEgPSB5MTEsXG4gICAgICB4MTIgPSB5MTIsIHgxMyA9IHkxMywgeDE0ID0geTE0LCB4MTUgPSB5MTU7XG4gIC8vIE1haW4gbG9vcCAoc2Fsc2EpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSArPSAyKSB7XG4gICAgeDA0IF49IHJvdGwoeDAwICsgeDEyIHwgMCwgIDcpOyB4MDggXj0gcm90bCh4MDQgKyB4MDAgfCAwLCAgOSk7XG4gICAgeDEyIF49IHJvdGwoeDA4ICsgeDA0IHwgMCwgMTMpOyB4MDAgXj0gcm90bCh4MTIgKyB4MDggfCAwLCAxOCk7XG4gICAgeDA5IF49IHJvdGwoeDA1ICsgeDAxIHwgMCwgIDcpOyB4MTMgXj0gcm90bCh4MDkgKyB4MDUgfCAwLCAgOSk7XG4gICAgeDAxIF49IHJvdGwoeDEzICsgeDA5IHwgMCwgMTMpOyB4MDUgXj0gcm90bCh4MDEgKyB4MTMgfCAwLCAxOCk7XG4gICAgeDE0IF49IHJvdGwoeDEwICsgeDA2IHwgMCwgIDcpOyB4MDIgXj0gcm90bCh4MTQgKyB4MTAgfCAwLCAgOSk7XG4gICAgeDA2IF49IHJvdGwoeDAyICsgeDE0IHwgMCwgMTMpOyB4MTAgXj0gcm90bCh4MDYgKyB4MDIgfCAwLCAxOCk7XG4gICAgeDAzIF49IHJvdGwoeDE1ICsgeDExIHwgMCwgIDcpOyB4MDcgXj0gcm90bCh4MDMgKyB4MTUgfCAwLCAgOSk7XG4gICAgeDExIF49IHJvdGwoeDA3ICsgeDAzIHwgMCwgMTMpOyB4MTUgXj0gcm90bCh4MTEgKyB4MDcgfCAwLCAxOCk7XG4gICAgeDAxIF49IHJvdGwoeDAwICsgeDAzIHwgMCwgIDcpOyB4MDIgXj0gcm90bCh4MDEgKyB4MDAgfCAwLCAgOSk7XG4gICAgeDAzIF49IHJvdGwoeDAyICsgeDAxIHwgMCwgMTMpOyB4MDAgXj0gcm90bCh4MDMgKyB4MDIgfCAwLCAxOCk7XG4gICAgeDA2IF49IHJvdGwoeDA1ICsgeDA0IHwgMCwgIDcpOyB4MDcgXj0gcm90bCh4MDYgKyB4MDUgfCAwLCAgOSk7XG4gICAgeDA0IF49IHJvdGwoeDA3ICsgeDA2IHwgMCwgMTMpOyB4MDUgXj0gcm90bCh4MDQgKyB4MDcgfCAwLCAxOCk7XG4gICAgeDExIF49IHJvdGwoeDEwICsgeDA5IHwgMCwgIDcpOyB4MDggXj0gcm90bCh4MTEgKyB4MTAgfCAwLCAgOSk7XG4gICAgeDA5IF49IHJvdGwoeDA4ICsgeDExIHwgMCwgMTMpOyB4MTAgXj0gcm90bCh4MDkgKyB4MDggfCAwLCAxOCk7XG4gICAgeDEyIF49IHJvdGwoeDE1ICsgeDE0IHwgMCwgIDcpOyB4MTMgXj0gcm90bCh4MTIgKyB4MTUgfCAwLCAgOSk7XG4gICAgeDE0IF49IHJvdGwoeDEzICsgeDEyIHwgMCwgMTMpOyB4MTUgXj0gcm90bCh4MTQgKyB4MTMgfCAwLCAxOCk7XG4gIH1cbiAgLy8gV3JpdGUgb3V0cHV0IChzYWxzYSlcbiAgb3V0W29pKytdID0gKHkwMCArIHgwMCkgfCAwOyBvdXRbb2krK10gPSAoeTAxICsgeDAxKSB8IDA7XG4gIG91dFtvaSsrXSA9ICh5MDIgKyB4MDIpIHwgMDsgb3V0W29pKytdID0gKHkwMyArIHgwMykgfCAwO1xuICBvdXRbb2krK10gPSAoeTA0ICsgeDA0KSB8IDA7IG91dFtvaSsrXSA9ICh5MDUgKyB4MDUpIHwgMDtcbiAgb3V0W29pKytdID0gKHkwNiArIHgwNikgfCAwOyBvdXRbb2krK10gPSAoeTA3ICsgeDA3KSB8IDA7XG4gIG91dFtvaSsrXSA9ICh5MDggKyB4MDgpIHwgMDsgb3V0W29pKytdID0gKHkwOSArIHgwOSkgfCAwO1xuICBvdXRbb2krK10gPSAoeTEwICsgeDEwKSB8IDA7IG91dFtvaSsrXSA9ICh5MTEgKyB4MTEpIHwgMDtcbiAgb3V0W29pKytdID0gKHkxMiArIHgxMikgfCAwOyBvdXRbb2krK10gPSAoeTEzICsgeDEzKSB8IDA7XG4gIG91dFtvaSsrXSA9ICh5MTQgKyB4MTQpIHwgMDsgb3V0W29pKytdID0gKHkxNSArIHgxNSkgfCAwO1xufVxuXG5mdW5jdGlvbiBCbG9ja01peChpbnB1dDogVWludDMyQXJyYXksIGlpOiBudW1iZXIsIG91dDogVWludDMyQXJyYXksIG9pOiBudW1iZXIsIHI6IG51bWJlcikge1xuICAvLyBUaGUgYmxvY2sgQiBpcyByIDEyOC1ieXRlIGNodW5rcyAod2hpY2ggaXMgZXF1aXZhbGVudCBvZiAyciA2NC1ieXRlIGNodW5rcylcbiAgbGV0IGhlYWQgPSBvaSArIDA7XG4gIGxldCB0YWlsID0gb2kgKyAxNiAqIHI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykgb3V0W3RhaWwgKyBpXSA9IGlucHV0W2lpICsgKDIgKiByIC0gMSkgKiAxNiArIGldOyAvLyBYIFx1MjE5MCBCWzJyXHUyMjEyMV1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByOyBpKyssIGhlYWQgKz0gMTYsIGlpICs9IDE2KSB7XG4gICAgLy8gV2Ugd3JpdGUgb2RkICYgZXZlbiBZaSBhdCBzYW1lIHRpbWUuIEV2ZW46IDBiWFhYWFgwIE9kZDogIDBiWFhYWFgxXG4gICAgWG9yQW5kU2Fsc2Eob3V0LCB0YWlsLCBpbnB1dCwgaWksIG91dCwgaGVhZCk7IC8vIGhlYWRbaV0gPSBTYWxzYShibG9ja0luWzIqaV0gXiB0YWlsW2ktMV0pXG4gICAgaWYgKGkgPiAwKSB0YWlsICs9IDE2OyAvLyBGaXJzdCBpdGVyYXRpb24gb3ZlcndyaXRlcyB0bXAgdmFsdWUgaW4gdGFpbFxuICAgIFhvckFuZFNhbHNhKG91dCwgaGVhZCwgaW5wdXQsIChpaSArPSAxNiksIG91dCwgdGFpbCk7IC8vIHRhaWxbaV0gPSBTYWxzYShibG9ja0luWzIqaSsxXSBeIGhlYWRbaV0pXG4gIH1cbn1cblxuLyoqXG4gKiBTY3J5cHQgb3B0aW9uczpcbiAqIC0gYE5gIGlzIGNwdS9tZW0gd29yayBmYWN0b3IgKHBvd2VyIG9mIDIgZS5nLiBgMioqMThgKVxuICogLSBgcmAgaXMgYmxvY2sgc2l6ZSAoOCBpcyBjb21tb24pLCBmaW5lLXR1bmVzIHNlcXVlbnRpYWwgbWVtb3J5IHJlYWQgc2l6ZSBhbmQgcGVyZm9ybWFuY2VcbiAqIC0gYHBgIGlzIHBhcmFsbGVsaXphdGlvbiBmYWN0b3IgKDEgaXMgY29tbW9uKVxuICogLSBgZGtMZW5gIGlzIG91dHB1dCBrZXkgbGVuZ3RoIGluIGJ5dGVzIGUuZy4gMzIuXG4gKiAtIGBhc3luY1RpY2tgIC0gKGRlZmF1bHQ6IDEwKSBtYXggdGltZSBpbiBtcyBmb3Igd2hpY2ggYXN5bmMgZnVuY3Rpb24gY2FuIGJsb2NrIGV4ZWN1dGlvblxuICogLSBgbWF4bWVtYCAtIChkZWZhdWx0OiBgMTAyNCAqKiAzICsgMTAyNGAgYWthIDFHQisxS0IpLiBBIGxpbWl0IHRoYXQgdGhlIGFwcCBjb3VsZCB1c2UgZm9yIHNjcnlwdFxuICogLSBgb25Qcm9ncmVzc2AgLSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdvdWxkIGJlIGV4ZWN1dGVkIGZvciBwcm9ncmVzcyByZXBvcnRcbiAqL1xuZXhwb3J0IHR5cGUgU2NyeXB0T3B0cyA9IHtcbiAgTjogbnVtYmVyOyAvLyBjb3N0IGZhY3RvclxuICByOiBudW1iZXI7IC8vIGJsb2NrIHNpemVcbiAgcDogbnVtYmVyOyAvLyBwYXJhbGxlbGl6YXRpb25cbiAgZGtMZW4/OiBudW1iZXI7IC8vIGtleSBsZW5ndGhcbiAgYXN5bmNUaWNrPzogbnVtYmVyOyAvLyBibG9jayBleGVjdXRpb24gbWF4IHRpbWVcbiAgbWF4bWVtPzogbnVtYmVyO1xuICBvblByb2dyZXNzPzogKHByb2dyZXNzOiBudW1iZXIpID0+IHZvaWQ7XG59O1xuXG4vLyBDb21tb24gcHJvbG9ndWUgYW5kIGVwaWxvZ3VlIGZvciBzeW5jL2FzeW5jIGZ1bmN0aW9uc1xuZnVuY3Rpb24gc2NyeXB0SW5pdChwYXNzd29yZDogS0RGSW5wdXQsIHNhbHQ6IEtERklucHV0LCBfb3B0cz86IFNjcnlwdE9wdHMpIHtcbiAgLy8gTWF4bWVtIC0gMUdCKzFLQiBieSBkZWZhdWx0XG4gIGNvbnN0IG9wdHMgPSBjaGVja09wdHMoXG4gICAge1xuICAgICAgZGtMZW46IDMyLFxuICAgICAgYXN5bmNUaWNrOiAxMCxcbiAgICAgIG1heG1lbTogMTAyNCAqKiAzICsgMTAyNCxcbiAgICB9LFxuICAgIF9vcHRzXG4gICk7XG4gIGNvbnN0IHsgTiwgciwgcCwgZGtMZW4sIGFzeW5jVGljaywgbWF4bWVtLCBvblByb2dyZXNzIH0gPSBvcHRzO1xuICBhbnVtYmVyKE4sICdOJyk7XG4gIGFudW1iZXIociwgJ3InKTtcbiAgYW51bWJlcihwLCAncCcpO1xuICBhbnVtYmVyKGRrTGVuLCAnZGtMZW4nKTtcbiAgYW51bWJlcihhc3luY1RpY2ssICdhc3luY1RpY2snKTtcbiAgYW51bWJlcihtYXhtZW0sICdtYXhtZW0nKTtcbiAgaWYgKG9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb25Qcm9ncmVzcyAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2dyZXNzQ2IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIGNvbnN0IGJsb2NrU2l6ZSA9IDEyOCAqIHI7XG4gIGNvbnN0IGJsb2NrU2l6ZTMyID0gYmxvY2tTaXplIC8gNDtcblxuICAvLyBNYXggTiBpcyAyXjMyIChJbnRlZ3JpZnkgaXMgMzItYml0KS5cbiAgLy8gUmVhbCBsaW1pdCBjYW4gYmUgMl4yMjogc29tZSBKUyBlbmdpbmVzIGxpbWl0IFVpbnQ4QXJyYXkgdG8gNEdCLlxuICAvLyBTcGVjIGNoZWNrIGBOID49IDJeKGJsb2NrU2l6ZSAvIDgpYCBpcyBub3QgZG9uZSBmb3IgY29tcGF0IHdpdGggcG9wdWxhciBsaWJzLFxuICAvLyB3aGljaCB1c2VkIGluY29ycmVjdCByOiAxLCBwOiA4LiBBbHNvLCB0aGUgY2hlY2sgc2VlbXMgdG8gYmUgYSBzcGVjIGVycm9yOlxuICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGFfc2VhcmNoLnBocD9yZmM9NzkxNFxuICBjb25zdCBwb3czMiA9IE1hdGgucG93KDIsIDMyKTtcbiAgaWYgKE4gPD0gMSB8fCAoTiAmIChOIC0gMSkpICE9PSAwIHx8IE4gPiBwb3czMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiTlwiIGV4cGVjdGVkIGEgcG93ZXIgb2YgMiwgYW5kIDJeMSA8PSBOIDw9IDJeMzInKTtcbiAgaWYgKHAgPCAxIHx8IHAgPiAoKHBvdzMyIC0gMSkgKiAzMikgLyBibG9ja1NpemUpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdcInBcIiBleHBlY3RlZCBpbnRlZ2VyIDEuLigoMl4zMiAtIDEpICogMzIpIC8gKDEyOCAqIHIpJyk7XG4gIGlmIChka0xlbiA8IDEgfHwgZGtMZW4gPiAocG93MzIgLSAxKSAqIDMyKVxuICAgIHRocm93IG5ldyBFcnJvcignXCJka0xlblwiIGV4cGVjdGVkIGludGVnZXIgMS4uKDJeMzIgLSAxKSAqIDMyJyk7XG4gIGNvbnN0IG1lbVVzZWQgPSBibG9ja1NpemUgKiAoTiArIHApO1xuICBpZiAobWVtVXNlZCA+IG1heG1lbSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wibWF4bWVtXCIgbGltaXQgd2FzIGhpdCwgZXhwZWN0ZWQgMTI4KnIqKE4rcCkgPD0gXCJtYXhtZW1cIj0nICsgbWF4bWVtKTtcbiAgLy8gW0IwLi4uQnBcdTIyMTIxXSBcdTIxOTAgUEJLREYySE1BQy1TSEEyNTYoUGFzc3BocmFzZSwgU2FsdCwgMSwgYmxvY2tTaXplKlBhcmFsbGVsaXphdGlvbkZhY3RvcilcbiAgLy8gU2luY2UgaXQgaGFzIG9ubHkgb25lIGl0ZXJhdGlvbiB0aGVyZSBpcyBubyByZWFzb24gdG8gdXNlIGFzeW5jIHZhcmlhbnRcbiAgY29uc3QgQiA9IHBia2RmMihzaGEyNTYsIHBhc3N3b3JkLCBzYWx0LCB7IGM6IDEsIGRrTGVuOiBibG9ja1NpemUgKiBwIH0pO1xuICBjb25zdCBCMzIgPSB1MzIoQik7XG4gIC8vIFJlLXVzZWQgYmV0d2VlbiBwYXJhbGxlbCBpdGVyYXRpb25zLiBBcnJheShpdGVyYXRpb25zKSBvZiBCXG4gIGNvbnN0IFYgPSB1MzIobmV3IFVpbnQ4QXJyYXkoYmxvY2tTaXplICogTikpO1xuICBjb25zdCB0bXAgPSB1MzIobmV3IFVpbnQ4QXJyYXkoYmxvY2tTaXplKSk7XG4gIGxldCBibG9ja01peENiID0gKCkgPT4ge307XG4gIGlmIChvblByb2dyZXNzKSB7XG4gICAgY29uc3QgdG90YWxCbG9ja01peCA9IDIgKiBOICogcDtcbiAgICAvLyBJbnZva2UgY2FsbGJhY2sgaWYgcHJvZ3Jlc3MgY2hhbmdlcyBmcm9tIDEwLjAxIHRvIDEwLjAyXG4gICAgLy8gQWxsb3dzIHRvIGRyYXcgc21vb3RoIHByb2dyZXNzIGJhciBvbiB1cCB0byA4SyBzY3JlZW5cbiAgICBjb25zdCBjYWxsYmFja1BlciA9IE1hdGgubWF4KE1hdGguZmxvb3IodG90YWxCbG9ja01peCAvIDEwMDAwKSwgMSk7XG4gICAgbGV0IGJsb2NrTWl4Q250ID0gMDtcbiAgICBibG9ja01peENiID0gKCkgPT4ge1xuICAgICAgYmxvY2tNaXhDbnQrKztcbiAgICAgIGlmIChvblByb2dyZXNzICYmICghKGJsb2NrTWl4Q250ICUgY2FsbGJhY2tQZXIpIHx8IGJsb2NrTWl4Q250ID09PSB0b3RhbEJsb2NrTWl4KSlcbiAgICAgICAgb25Qcm9ncmVzcyhibG9ja01peENudCAvIHRvdGFsQmxvY2tNaXgpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsgTiwgciwgcCwgZGtMZW4sIGJsb2NrU2l6ZTMyLCBWLCBCMzIsIEIsIHRtcCwgYmxvY2tNaXhDYiwgYXN5bmNUaWNrIH07XG59XG5cbmZ1bmN0aW9uIHNjcnlwdE91dHB1dChcbiAgcGFzc3dvcmQ6IEtERklucHV0LFxuICBka0xlbjogbnVtYmVyLFxuICBCOiBVaW50OEFycmF5LFxuICBWOiBVaW50MzJBcnJheSxcbiAgdG1wOiBVaW50MzJBcnJheVxuKSB7XG4gIGNvbnN0IHJlcyA9IHBia2RmMihzaGEyNTYsIHBhc3N3b3JkLCBCLCB7IGM6IDEsIGRrTGVuIH0pO1xuICBjbGVhbihCLCBWLCB0bXApO1xuICByZXR1cm4gcmVzO1xufVxuXG4vKipcbiAqIFNjcnlwdCBLREYgZnJvbSBSRkMgNzkxNC4gU2VlIHtAbGluayBTY3J5cHRPcHRzfS5cbiAqIEBleGFtcGxlXG4gKiBzY3J5cHQoJ3Bhc3N3b3JkJywgJ3NhbHQnLCB7IE46IDIqKjE4LCByOiA4LCBwOiAxLCBka0xlbjogMzIgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J5cHQocGFzc3dvcmQ6IEtERklucHV0LCBzYWx0OiBLREZJbnB1dCwgb3B0czogU2NyeXB0T3B0cyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB7IE4sIHIsIHAsIGRrTGVuLCBibG9ja1NpemUzMiwgViwgQjMyLCBCLCB0bXAsIGJsb2NrTWl4Q2IgfSA9IHNjcnlwdEluaXQoXG4gICAgcGFzc3dvcmQsXG4gICAgc2FsdCxcbiAgICBvcHRzXG4gICk7XG4gIHN3YXAzMklmQkUoQjMyKTtcbiAgZm9yIChsZXQgcGkgPSAwOyBwaSA8IHA7IHBpKyspIHtcbiAgICBjb25zdCBQaSA9IGJsb2NrU2l6ZTMyICogcGk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NpemUzMjsgaSsrKSBWW2ldID0gQjMyW1BpICsgaV07IC8vIFZbMF0gPSBCW2ldXG4gICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCBOIC0gMTsgaSsrKSB7XG4gICAgICBCbG9ja01peChWLCBwb3MsIFYsIChwb3MgKz0gYmxvY2tTaXplMzIpLCByKTsgLy8gVltpXSA9IEJsb2NrTWl4KFZbaS0xXSk7XG4gICAgICBibG9ja01peENiKCk7XG4gICAgfVxuICAgIEJsb2NrTWl4KFYsIChOIC0gMSkgKiBibG9ja1NpemUzMiwgQjMyLCBQaSwgcik7IC8vIFByb2Nlc3MgbGFzdCBlbGVtZW50XG4gICAgYmxvY2tNaXhDYigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAvLyBGaXJzdCB1MzIgb2YgdGhlIGxhc3QgNjQtYnl0ZSBibG9jayAodTMyIGlzIExFKVxuICAgICAgLy8gJiAoTiAtIDEpIGlzICUgTiBhcyBOIGlzIGEgcG93ZXIgb2YgMiwgTiAmIChOIC0gMSkgPSAwIGlzIGNoZWNrZWQgYWJvdmU7ID4+PiAwIGZvciB1bnNpZ25lZCwgaW5wdXQgZml0cyBpbiB1MzJcbiAgICAgIGNvbnN0IGogPSAoQjMyW1BpICsgYmxvY2tTaXplMzIgLSAxNl0gJiAoTiAtIDEpKSA+Pj4gMDsgLy8gaiA9IEludGVncmlmeShYKSAlIGl0ZXJhdGlvbnNcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgYmxvY2tTaXplMzI7IGsrKykgdG1wW2tdID0gQjMyW1BpICsga10gXiBWW2ogKiBibG9ja1NpemUzMiArIGtdOyAvLyB0bXAgPSBCIF4gVltqXVxuICAgICAgQmxvY2tNaXgodG1wLCAwLCBCMzIsIFBpLCByKTsgLy8gQiA9IEJsb2NrTWl4KEIgXiBWW2pdKVxuICAgICAgYmxvY2tNaXhDYigpO1xuICAgIH1cbiAgfVxuICBzd2FwMzJJZkJFKEIzMik7XG4gIHJldHVybiBzY3J5cHRPdXRwdXQocGFzc3dvcmQsIGRrTGVuLCBCLCBWLCB0bXApO1xufVxuXG4vKipcbiAqIFNjcnlwdCBLREYgZnJvbSBSRkMgNzkxNC4gQXN5bmMgdmVyc2lvbi4gU2VlIHtAbGluayBTY3J5cHRPcHRzfS5cbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzY3J5cHRBc3luYygncGFzc3dvcmQnLCAnc2FsdCcsIHsgTjogMioqMTgsIHI6IDgsIHA6IDEsIGRrTGVuOiAzMiB9KTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNjcnlwdEFzeW5jKFxuICBwYXNzd29yZDogS0RGSW5wdXQsXG4gIHNhbHQ6IEtERklucHV0LFxuICBvcHRzOiBTY3J5cHRPcHRzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgeyBOLCByLCBwLCBka0xlbiwgYmxvY2tTaXplMzIsIFYsIEIzMiwgQiwgdG1wLCBibG9ja01peENiLCBhc3luY1RpY2sgfSA9IHNjcnlwdEluaXQoXG4gICAgcGFzc3dvcmQsXG4gICAgc2FsdCxcbiAgICBvcHRzXG4gICk7XG4gIHN3YXAzMklmQkUoQjMyKTtcbiAgZm9yIChsZXQgcGkgPSAwOyBwaSA8IHA7IHBpKyspIHtcbiAgICBjb25zdCBQaSA9IGJsb2NrU2l6ZTMyICogcGk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NpemUzMjsgaSsrKSBWW2ldID0gQjMyW1BpICsgaV07IC8vIFZbMF0gPSBCW2ldXG4gICAgbGV0IHBvcyA9IDA7XG4gICAgYXdhaXQgYXN5bmNMb29wKE4gLSAxLCBhc3luY1RpY2ssICgpID0+IHtcbiAgICAgIEJsb2NrTWl4KFYsIHBvcywgViwgKHBvcyArPSBibG9ja1NpemUzMiksIHIpOyAvLyBWW2ldID0gQmxvY2tNaXgoVltpLTFdKTtcbiAgICAgIGJsb2NrTWl4Q2IoKTtcbiAgICB9KTtcbiAgICBCbG9ja01peChWLCAoTiAtIDEpICogYmxvY2tTaXplMzIsIEIzMiwgUGksIHIpOyAvLyBQcm9jZXNzIGxhc3QgZWxlbWVudFxuICAgIGJsb2NrTWl4Q2IoKTtcbiAgICBhd2FpdCBhc3luY0xvb3AoTiwgYXN5bmNUaWNrLCAoKSA9PiB7XG4gICAgICAvLyBGaXJzdCB1MzIgb2YgdGhlIGxhc3QgNjQtYnl0ZSBibG9jayAodTMyIGlzIExFKVxuICAgICAgLy8gJiAoTiAtIDEpIGlzICUgTiBhcyBOIGlzIGEgcG93ZXIgb2YgMiwgTiAmIChOIC0gMSkgPSAwIGlzIGNoZWNrZWQgYWJvdmU7ID4+PiAwIGZvciB1bnNpZ25lZCwgaW5wdXQgZml0cyBpbiB1MzJcbiAgICAgIGNvbnN0IGogPSAoQjMyW1BpICsgYmxvY2tTaXplMzIgLSAxNl0gJiAoTiAtIDEpKSA+Pj4gMDsgLy8gaiA9IEludGVncmlmeShYKSAlIGl0ZXJhdGlvbnNcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgYmxvY2tTaXplMzI7IGsrKykgdG1wW2tdID0gQjMyW1BpICsga10gXiBWW2ogKiBibG9ja1NpemUzMiArIGtdOyAvLyB0bXAgPSBCIF4gVltqXVxuICAgICAgQmxvY2tNaXgodG1wLCAwLCBCMzIsIFBpLCByKTsgLy8gQiA9IEJsb2NrTWl4KEIgXiBWW2pdKVxuICAgICAgYmxvY2tNaXhDYigpO1xuICAgIH0pO1xuICB9XG4gIHN3YXAzMklmQkUoQjMyKTtcbiAgcmV0dXJuIHNjcnlwdE91dHB1dChwYXNzd29yZCwgZGtMZW4sIEIsIFYsIHRtcCk7XG59XG4iLCAiLyoqXG4gKiBQQktERiAoUkZDIDI4OTgpLiBDYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBrZXkgZnJvbSBwYXNzd29yZCBhbmQgc2FsdC5cbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgaG1hYyB9IGZyb20gJy4vaG1hYy50cyc7XG4vLyBwcmV0dGllci1pZ25vcmVcbmltcG9ydCB7XG4gIGFoYXNoLCBhbnVtYmVyLFxuICBhc3luY0xvb3AsIGNoZWNrT3B0cywgY2xlYW4sIGNyZWF0ZVZpZXcsIGtkZklucHV0VG9CeXRlcyxcbiAgdHlwZSBDSGFzaCxcbiAgdHlwZSBIYXNoLFxuICB0eXBlIEtERklucHV0XG59IGZyb20gJy4vdXRpbHMudHMnO1xuXG4vKipcbiAqIFBCS0RGMiBvcHRpb25zOlxuICogKiBjOiBpdGVyYXRpb25zLCBzaG91bGQgcHJvYmFibHkgYmUgaGlnaGVyIHRoYW4gMTAwXzAwMFxuICogKiBka0xlbjogZGVzaXJlZCBsZW5ndGggb2YgZGVyaXZlZCBrZXkgaW4gYnl0ZXNcbiAqICogYXN5bmNUaWNrOiBtYXggdGltZSBpbiBtcyBmb3Igd2hpY2ggYXN5bmMgZnVuY3Rpb24gY2FuIGJsb2NrIGV4ZWN1dGlvblxuICovXG5leHBvcnQgdHlwZSBQYmtkZjJPcHQgPSB7XG4gIGM6IG51bWJlcjtcbiAgZGtMZW4/OiBudW1iZXI7XG4gIGFzeW5jVGljaz86IG51bWJlcjtcbn07XG4vLyBDb21tb24gc3RhcnQgYW5kIGVuZCBmb3Igc3luYy9hc3luYyBmdW5jdGlvbnNcbmZ1bmN0aW9uIHBia2RmMkluaXQoaGFzaDogQ0hhc2gsIF9wYXNzd29yZDogS0RGSW5wdXQsIF9zYWx0OiBLREZJbnB1dCwgX29wdHM6IFBia2RmMk9wdCkge1xuICBhaGFzaChoYXNoKTtcbiAgY29uc3Qgb3B0cyA9IGNoZWNrT3B0cyh7IGRrTGVuOiAzMiwgYXN5bmNUaWNrOiAxMCB9LCBfb3B0cyk7XG4gIGNvbnN0IHsgYywgZGtMZW4sIGFzeW5jVGljayB9ID0gb3B0cztcbiAgYW51bWJlcihjLCAnYycpO1xuICBhbnVtYmVyKGRrTGVuLCAnZGtMZW4nKTtcbiAgYW51bWJlcihhc3luY1RpY2ssICdhc3luY1RpY2snKTtcbiAgaWYgKGMgPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ2l0ZXJhdGlvbnMgKGMpIG11c3QgYmUgPj0gMScpO1xuICBjb25zdCBwYXNzd29yZCA9IGtkZklucHV0VG9CeXRlcyhfcGFzc3dvcmQsICdwYXNzd29yZCcpO1xuICBjb25zdCBzYWx0ID0ga2RmSW5wdXRUb0J5dGVzKF9zYWx0LCAnc2FsdCcpO1xuICAvLyBESyA9IFBCS0RGMihQUkYsIFBhc3N3b3JkLCBTYWx0LCBjLCBka0xlbik7XG4gIGNvbnN0IERLID0gbmV3IFVpbnQ4QXJyYXkoZGtMZW4pO1xuICAvLyBVMSA9IFBSRihQYXNzd29yZCwgU2FsdCArIElOVF8zMl9CRShpKSlcbiAgY29uc3QgUFJGID0gaG1hYy5jcmVhdGUoaGFzaCwgcGFzc3dvcmQpO1xuICBjb25zdCBQUkZTYWx0ID0gUFJGLl9jbG9uZUludG8oKS51cGRhdGUoc2FsdCk7XG4gIHJldHVybiB7IGMsIGRrTGVuLCBhc3luY1RpY2ssIERLLCBQUkYsIFBSRlNhbHQgfTtcbn1cblxuZnVuY3Rpb24gcGJrZGYyT3V0cHV0PFQgZXh0ZW5kcyBIYXNoPFQ+PihcbiAgUFJGOiBIYXNoPFQ+LFxuICBQUkZTYWx0OiBIYXNoPFQ+LFxuICBESzogVWludDhBcnJheSxcbiAgcHJmVzogSGFzaDxUPixcbiAgdTogVWludDhBcnJheVxuKSB7XG4gIFBSRi5kZXN0cm95KCk7XG4gIFBSRlNhbHQuZGVzdHJveSgpO1xuICBpZiAocHJmVykgcHJmVy5kZXN0cm95KCk7XG4gIGNsZWFuKHUpO1xuICByZXR1cm4gREs7XG59XG5cbi8qKlxuICogUEJLREYyLUhNQUM6IFJGQyAyODk4IGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uXG4gKiBAcGFyYW0gaGFzaCAtIGhhc2ggZnVuY3Rpb24gdGhhdCB3b3VsZCBiZSB1c2VkIGUuZy4gc2hhMjU2XG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBwYXNzd29yZCBmcm9tIHdoaWNoIGEgZGVyaXZlZCBrZXkgaXMgZ2VuZXJhdGVkXG4gKiBAcGFyYW0gc2FsdCAtIGNyeXB0b2dyYXBoaWMgc2FsdFxuICogQHBhcmFtIG9wdHMgLSB7YywgZGtMZW59IHdoZXJlIGMgaXMgd29yayBmYWN0b3IgYW5kIGRrTGVuIGlzIG91dHB1dCBtZXNzYWdlIHNpemVcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBrZXkgPSBwYmtkZjIoc2hhMjU2LCAncGFzc3dvcmQnLCAnc2FsdCcsIHsgZGtMZW46IDMyLCBjOiBNYXRoLnBvdygyLCAxOCkgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYmtkZjIoXG4gIGhhc2g6IENIYXNoLFxuICBwYXNzd29yZDogS0RGSW5wdXQsXG4gIHNhbHQ6IEtERklucHV0LFxuICBvcHRzOiBQYmtkZjJPcHRcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB7IGMsIGRrTGVuLCBESywgUFJGLCBQUkZTYWx0IH0gPSBwYmtkZjJJbml0KGhhc2gsIHBhc3N3b3JkLCBzYWx0LCBvcHRzKTtcbiAgbGV0IHByZlc6IGFueTsgLy8gV29ya2luZyBjb3B5XG4gIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KDQpO1xuICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldyhhcnIpO1xuICBjb25zdCB1ID0gbmV3IFVpbnQ4QXJyYXkoUFJGLm91dHB1dExlbik7XG4gIC8vIERLID0gVDEgKyBUMiArIFx1MjJFRiArIFRka2xlbi9obGVuXG4gIGZvciAobGV0IHRpID0gMSwgcG9zID0gMDsgcG9zIDwgZGtMZW47IHRpKyssIHBvcyArPSBQUkYub3V0cHV0TGVuKSB7XG4gICAgLy8gVGkgPSBGKFBhc3N3b3JkLCBTYWx0LCBjLCBpKVxuICAgIGNvbnN0IFRpID0gREsuc3ViYXJyYXkocG9zLCBwb3MgKyBQUkYub3V0cHV0TGVuKTtcbiAgICB2aWV3LnNldEludDMyKDAsIHRpLCBmYWxzZSk7XG4gICAgLy8gRihQYXNzd29yZCwgU2FsdCwgYywgaSkgPSBVMSBeIFUyIF4gXHUyMkVGIF4gVWNcbiAgICAvLyBVMSA9IFBSRihQYXNzd29yZCwgU2FsdCArIElOVF8zMl9CRShpKSlcbiAgICAocHJmVyA9IFBSRlNhbHQuX2Nsb25lSW50byhwcmZXKSkudXBkYXRlKGFycikuZGlnZXN0SW50byh1KTtcbiAgICBUaS5zZXQodS5zdWJhcnJheSgwLCBUaS5sZW5ndGgpKTtcbiAgICBmb3IgKGxldCB1aSA9IDE7IHVpIDwgYzsgdWkrKykge1xuICAgICAgLy8gVWMgPSBQUkYoUGFzc3dvcmQsIFVjXHUyMjEyMSlcbiAgICAgIFBSRi5fY2xvbmVJbnRvKHByZlcpLnVwZGF0ZSh1KS5kaWdlc3RJbnRvKHUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUaS5sZW5ndGg7IGkrKykgVGlbaV0gXj0gdVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBia2RmMk91dHB1dChQUkYsIFBSRlNhbHQsIERLLCBwcmZXLCB1KTtcbn1cblxuLyoqXG4gKiBQQktERjItSE1BQzogUkZDIDI4OTgga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uIEFzeW5jIHZlcnNpb24uXG4gKiBAZXhhbXBsZVxuICogYXdhaXQgcGJrZGYyQXN5bmMoc2hhMjU2LCAncGFzc3dvcmQnLCAnc2FsdCcsIHsgZGtMZW46IDMyLCBjOiA1MDBfMDAwIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGJrZGYyQXN5bmMoXG4gIGhhc2g6IENIYXNoLFxuICBwYXNzd29yZDogS0RGSW5wdXQsXG4gIHNhbHQ6IEtERklucHV0LFxuICBvcHRzOiBQYmtkZjJPcHRcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCB7IGMsIGRrTGVuLCBhc3luY1RpY2ssIERLLCBQUkYsIFBSRlNhbHQgfSA9IHBia2RmMkluaXQoaGFzaCwgcGFzc3dvcmQsIHNhbHQsIG9wdHMpO1xuICBsZXQgcHJmVzogYW55OyAvLyBXb3JraW5nIGNvcHlcbiAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGNvbnN0IHZpZXcgPSBjcmVhdGVWaWV3KGFycik7XG4gIGNvbnN0IHUgPSBuZXcgVWludDhBcnJheShQUkYub3V0cHV0TGVuKTtcbiAgLy8gREsgPSBUMSArIFQyICsgXHUyMkVGICsgVGRrbGVuL2hsZW5cbiAgZm9yIChsZXQgdGkgPSAxLCBwb3MgPSAwOyBwb3MgPCBka0xlbjsgdGkrKywgcG9zICs9IFBSRi5vdXRwdXRMZW4pIHtcbiAgICAvLyBUaSA9IEYoUGFzc3dvcmQsIFNhbHQsIGMsIGkpXG4gICAgY29uc3QgVGkgPSBESy5zdWJhcnJheShwb3MsIHBvcyArIFBSRi5vdXRwdXRMZW4pO1xuICAgIHZpZXcuc2V0SW50MzIoMCwgdGksIGZhbHNlKTtcbiAgICAvLyBGKFBhc3N3b3JkLCBTYWx0LCBjLCBpKSA9IFUxIF4gVTIgXiBcdTIyRUYgXiBVY1xuICAgIC8vIFUxID0gUFJGKFBhc3N3b3JkLCBTYWx0ICsgSU5UXzMyX0JFKGkpKVxuICAgIChwcmZXID0gUFJGU2FsdC5fY2xvbmVJbnRvKHByZlcpKS51cGRhdGUoYXJyKS5kaWdlc3RJbnRvKHUpO1xuICAgIFRpLnNldCh1LnN1YmFycmF5KDAsIFRpLmxlbmd0aCkpO1xuICAgIGF3YWl0IGFzeW5jTG9vcChjIC0gMSwgYXN5bmNUaWNrLCAoKSA9PiB7XG4gICAgICAvLyBVYyA9IFBSRihQYXNzd29yZCwgVWNcdTIyMTIxKVxuICAgICAgUFJGLl9jbG9uZUludG8ocHJmVykudXBkYXRlKHUpLmRpZ2VzdEludG8odSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRpLmxlbmd0aDsgaSsrKSBUaVtpXSBePSB1W2ldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYmtkZjJPdXRwdXQoUFJGLCBQUkZTYWx0LCBESywgcHJmVywgdSk7XG59XG4iLCAiLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGRhdGFcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBoZXggc3RyaW5nIHRvIFVpbnQ4QXJyYXlcbiAqIEBwYXJhbSBoZXggSGV4IHN0cmluZyB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyBVaW50OEFycmF5IG9mIGJ5dGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXhUb0J5dGVzKGhleDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShoZXgubGVuZ3RoIC8gMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgYnl0ZXNbaSAvIDJdID0gcGFyc2VJbnQoaGV4LnNsaWNlKGksIGkgKyAyKSwgMTYpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKlxuICogQ29udmVydCBVaW50OEFycmF5IHRvIGhleCBzdHJpbmdcbiAqIEBwYXJhbSBieXRlcyBVaW50OEFycmF5IHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIEhleCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9IZXgoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgICAgICAubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSlcbiAgICAgICAgLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBVVEYtOCBzdHJpbmcgdG8gVWludDhBcnJheVxuICogQHBhcmFtIHN0ciBVVEYtOCBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybnMgVWludDhBcnJheSBvZiBieXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXRmOFRvQnl0ZXMoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG59XG5cbi8qKlxuICogQ29udmVydCBVaW50OEFycmF5IHRvIFVURi04IHN0cmluZ1xuICogQHBhcmFtIGJ5dGVzIFVpbnQ4QXJyYXkgdG8gY29udmVydFxuICogQHJldHVybnMgVVRGLTggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvVXRmOChieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShieXRlcyk7XG59XG4iLCAiLyoqXG4gKiBCSVAzOSBTZWVkIFBocmFzZSB1dGlsaXRpZXMgZm9yIE5vc3RyS2V5LlxuICpcbiAqIEltcGxlbWVudHMgdGhlIHNhbWUgYWxnb3JpdGhtIGFzIGBub3N0ci1uc2VjLXNlZWRwaHJhc2VgOlxuICogdGhlIDMyLWJ5dGUgcHJpdmF0ZSBrZXkgSVMgdGhlIEJJUDM5IGVudHJvcHkgKGJpZGlyZWN0aW9uYWwgZW5jb2RpbmcpLlxuICpcbiAqIFVzZXMgQHNjdXJlL2JpcDM5IChhbHJlYWR5IGEgdHJhbnNpdGl2ZSBkZXAgb2Ygbm9zdHItdG9vbHMpLlxuICovXG5cbmltcG9ydCB7IGVudHJvcHlUb01uZW1vbmljLCBtbmVtb25pY1RvRW50cm9weSwgdmFsaWRhdGVNbmVtb25pYyB9IGZyb20gJ0BzY3VyZS9iaXAzOSc7XG5pbXBvcnQgeyB3b3JkbGlzdCB9IGZyb20gJ0BzY3VyZS9iaXAzOS93b3JkbGlzdHMvZW5nbGlzaC5qcyc7XG5pbXBvcnQgeyBoZXhUb0J5dGVzLCBieXRlc1RvSGV4LCBnZXRQdWJsaWNLZXlTeW5jIH0gZnJvbSAnbm9zdHItY3J5cHRvLXV0aWxzJztcblxuLyoqXG4gKiBDb252ZXJ0IGEgaGV4IHByaXZhdGUga2V5IHRvIGEgMjQtd29yZCBCSVAzOSBtbmVtb25pYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBoZXhLZXkgLSA2NC1jaGFyIGhleCBwcml2YXRlIGtleVxuICogQHJldHVybnMge3N0cmluZ30gMjQtd29yZCBtbmVtb25pY1xuICovXG5leHBvcnQgZnVuY3Rpb24ga2V5VG9TZWVkUGhyYXNlKGhleEtleSkge1xuICAgIGNvbnN0IGJ5dGVzID0gaGV4VG9CeXRlcyhoZXhLZXkpO1xuICAgIHJldHVybiBlbnRyb3B5VG9NbmVtb25pYyhieXRlcywgd29yZGxpc3QpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBCSVAzOSBtbmVtb25pYyBiYWNrIHRvIGEgaGV4IHByaXZhdGUga2V5ICsgZGVyaXZlZCBwdWJrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGhyYXNlIC0gMjQtd29yZCBtbmVtb25pY1xuICogQHJldHVybnMge3sgaGV4S2V5OiBzdHJpbmcsIHB1YktleTogc3RyaW5nIH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkUGhyYXNlVG9LZXkocGhyYXNlKSB7XG4gICAgY29uc3QgZW50cm9weSA9IG1uZW1vbmljVG9FbnRyb3B5KHBocmFzZS50cmltKCkudG9Mb3dlckNhc2UoKSwgd29yZGxpc3QpO1xuICAgIGNvbnN0IGhleEtleSA9IGJ5dGVzVG9IZXgoZW50cm9weSk7XG4gICAgY29uc3QgcHViS2V5ID0gZ2V0UHVibGljS2V5U3luYyhoZXhLZXkpO1xuICAgIHJldHVybiB7IGhleEtleSwgcHViS2V5IH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBCSVAzOSBtbmVtb25pYyAoY2hlY2tzdW0gKyB3b3JkbGlzdCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGhyYXNlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTZWVkUGhyYXNlKHBocmFzZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU1uZW1vbmljKHBocmFzZS50cmltKCkudG9Mb3dlckNhc2UoKSwgd29yZGxpc3QpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEZhc3QgaGV1cmlzdGljOiBkb2VzIHRoZSBpbnB1dCBsb29rIGxpa2UgaXQgY291bGQgYmUgYSBzZWVkIHBocmFzZT9cbiAqICgxMisgc3BhY2Utc2VwYXJhdGVkIGFscGhhYmV0aWMgd29yZHMpXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlU2VlZFBocmFzZShpbnB1dCkge1xuICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHdvcmRzID0gaW5wdXQudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgcmV0dXJuIHdvcmRzLmxlbmd0aCA+PSAxMiAmJiB3b3Jkcy5ldmVyeSh3ID0+IC9eW2EtekEtWl0rJC8udGVzdCh3KSk7XG59XG4iLCAiLyohIHNjdXJlLWJpcDM5IC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF0cmljaW8gUGFsbGFkaW5vLCBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmltcG9ydCB7IHBia2RmMiwgcGJrZGYyQXN5bmMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3Bia2RmMi5qcyc7XG5pbXBvcnQgeyBzaGEyNTYsIHNoYTUxMiB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvc2hhMi5qcyc7XG5pbXBvcnQgeyBhYnl0ZXMsIGFudW1iZXIsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscy5qcyc7XG5pbXBvcnQgeyBwYmtkZjIgYXMgcGJrZGYyd2ViLCBzaGE1MTIgYXMgc2hhNTEyd2ViIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy93ZWJjcnlwdG8uanMnO1xuaW1wb3J0IHsgdXRpbHMgYXMgYmFzZVV0aWxzIH0gZnJvbSAnQHNjdXJlL2Jhc2UnO1xuLy8gSmFwYW5lc2Ugd29yZGxpc3RcbmNvbnN0IGlzSmFwYW5lc2UgPSAod29yZGxpc3QpID0+IHdvcmRsaXN0WzBdID09PSAnXFx1MzA0MlxcdTMwNDRcXHUzMDUzXFx1MzA0ZlxcdTMwNTdcXHUzMDkzJztcbi8vIE5vcm1hbGl6YXRpb24gcmVwbGFjZXMgZXF1aXZhbGVudCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVyc1xuLy8gc28gdGhhdCBhbnkgdHdvIHRleHRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgd2lsbCBiZSByZWR1Y2VkXG4vLyB0byB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cywgY2FsbGVkIHRoZSBub3JtYWwgZm9ybSBvZiB0aGUgb3JpZ2luYWwgdGV4dC5cbi8vIGh0dHBzOi8vdG9uc2t5Lm1lL2Jsb2cvdW5pY29kZS8jd2h5LWlzLWEtLS0tXG5mdW5jdGlvbiBuZmtkKHN0cikge1xuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBtbmVtb25pYyB0eXBlOiAnICsgdHlwZW9mIHN0cik7XG4gICAgcmV0dXJuIHN0ci5ub3JtYWxpemUoJ05GS0QnKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZShzdHIpIHtcbiAgICBjb25zdCBub3JtID0gbmZrZChzdHIpO1xuICAgIGNvbnN0IHdvcmRzID0gbm9ybS5zcGxpdCgnICcpO1xuICAgIGlmICghWzEyLCAxNSwgMTgsIDIxLCAyNF0uaW5jbHVkZXMod29yZHMubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1uZW1vbmljJyk7XG4gICAgcmV0dXJuIHsgbmZrZDogbm9ybSwgd29yZHMgfTtcbn1cbmZ1bmN0aW9uIGFlbnRyb3B5KGVudCkge1xuICAgIGFieXRlcyhlbnQpO1xuICAgIGlmICghWzE2LCAyMCwgMjQsIDI4LCAzMl0uaW5jbHVkZXMoZW50Lmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyb3B5IGxlbmd0aCcpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSB4IHJhbmRvbSB3b3Jkcy4gVXNlcyBDcnlwdG9ncmFwaGljYWxseS1TZWN1cmUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IuXG4gKiBAcGFyYW0gd29yZGxpc3QgaW1wb3J0ZWQgd29yZGxpc3QgZm9yIHNwZWNpZmljIGxhbmd1YWdlXG4gKiBAcGFyYW0gc3RyZW5ndGggbW5lbW9uaWMgc3RyZW5ndGggMTI4LTI1NiBiaXRzXG4gKiBAZXhhbXBsZVxuICogZ2VuZXJhdGVNbmVtb25pYyh3b3JkbGlzdCwgMTI4KVxuICogLy8gJ2xlZ2FsIHdpbm5lciB0aGFuayB5ZWFyIHdhdmUgc2F1c2FnZSB3b3J0aCB1c2VmdWwgbGVnYWwgd2lubmVyIHRoYW5rIHllbGxvdydcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTW5lbW9uaWMod29yZGxpc3QsIHN0cmVuZ3RoID0gMTI4KSB7XG4gICAgYW51bWJlcihzdHJlbmd0aCk7XG4gICAgaWYgKHN0cmVuZ3RoICUgMzIgIT09IDAgfHwgc3RyZW5ndGggPiAyNTYpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZW50cm9weScpO1xuICAgIHJldHVybiBlbnRyb3B5VG9NbmVtb25pYyhyYW5kb21CeXRlcyhzdHJlbmd0aCAvIDgpLCB3b3JkbGlzdCk7XG59XG5jb25zdCBjYWxjQ2hlY2tzdW0gPSAoZW50cm9weSkgPT4ge1xuICAgIC8vIENoZWNrc3VtIGlzIGVudC5sZW5ndGgvNCBiaXRzIGxvbmdcbiAgICBjb25zdCBiaXRzTGVmdCA9IDggLSBlbnRyb3B5Lmxlbmd0aCAvIDQ7XG4gICAgLy8gWmVybyByaWdodG1vc3QgXCJiaXRzTGVmdFwiIGJpdHMgaW4gYnl0ZVxuICAgIC8vIEZvciBleGFtcGxlOiBiaXRzTGVmdD00IHZhbD0xMDExMTEwMSAtPiAxMDExMDAwMFxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShbKHNoYTI1NihlbnRyb3B5KVswXSA+PiBiaXRzTGVmdCkgPDwgYml0c0xlZnRdKTtcbn07XG5mdW5jdGlvbiBnZXRDb2Rlcih3b3JkbGlzdCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh3b3JkbGlzdCkgfHwgd29yZGxpc3QubGVuZ3RoICE9PSAyMDQ4IHx8IHR5cGVvZiB3b3JkbGlzdFswXSAhPT0gJ3N0cmluZycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV29yZGxpc3Q6IGV4cGVjdGVkIGFycmF5IG9mIDIwNDggc3RyaW5ncycpO1xuICAgIHdvcmRsaXN0LmZvckVhY2goKGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd29yZGxpc3Q6IG5vbi1zdHJpbmcgZWxlbWVudDogJyArIGkpO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXNlVXRpbHMuY2hhaW4oYmFzZVV0aWxzLmNoZWNrc3VtKDEsIGNhbGNDaGVja3N1bSksIGJhc2VVdGlscy5yYWRpeDIoMTEsIHRydWUpLCBiYXNlVXRpbHMuYWxwaGFiZXQod29yZGxpc3QpKTtcbn1cbi8qKlxuICogUmV2ZXJzaWJsZTogQ29udmVydHMgbW5lbW9uaWMgc3RyaW5nIHRvIHJhdyBlbnRyb3B5IGluIGZvcm0gb2YgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSBtbmVtb25pYyAxMi0yNCB3b3Jkc1xuICogQHBhcmFtIHdvcmRsaXN0IGltcG9ydGVkIHdvcmRsaXN0IGZvciBzcGVjaWZpYyBsYW5ndWFnZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG1uZW0gPSAnbGVnYWwgd2lubmVyIHRoYW5rIHllYXIgd2F2ZSBzYXVzYWdlIHdvcnRoIHVzZWZ1bCBsZWdhbCB3aW5uZXIgdGhhbmsgeWVsbG93JztcbiAqIG1uZW1vbmljVG9FbnRyb3B5KG1uZW0sIHdvcmRsaXN0KVxuICogLy8gUHJvZHVjZXNcbiAqIG5ldyBVaW50OEFycmF5KFtcbiAqICAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZixcbiAqICAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZlxuICogXSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1uZW1vbmljVG9FbnRyb3B5KG1uZW1vbmljLCB3b3JkbGlzdCkge1xuICAgIGNvbnN0IHsgd29yZHMgfSA9IG5vcm1hbGl6ZShtbmVtb25pYyk7XG4gICAgY29uc3QgZW50cm9weSA9IGdldENvZGVyKHdvcmRsaXN0KS5kZWNvZGUod29yZHMpO1xuICAgIGFlbnRyb3B5KGVudHJvcHkpO1xuICAgIHJldHVybiBlbnRyb3B5O1xufVxuLyoqXG4gKiBSZXZlcnNpYmxlOiBDb252ZXJ0cyByYXcgZW50cm9weSBpbiBmb3JtIG9mIGJ5dGUgYXJyYXkgdG8gbW5lbW9uaWMgc3RyaW5nLlxuICogQHBhcmFtIGVudHJvcHkgYnl0ZSBhcnJheVxuICogQHBhcmFtIHdvcmRsaXN0IGltcG9ydGVkIHdvcmRsaXN0IGZvciBzcGVjaWZpYyBsYW5ndWFnZVxuICogQHJldHVybnMgMTItMjQgd29yZHNcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBlbnQgPSBuZXcgVWludDhBcnJheShbXG4gKiAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsXG4gKiAgIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsIDB4N2ZcbiAqIF0pO1xuICogZW50cm9weVRvTW5lbW9uaWMoZW50LCB3b3JkbGlzdCk7XG4gKiAvLyAnbGVnYWwgd2lubmVyIHRoYW5rIHllYXIgd2F2ZSBzYXVzYWdlIHdvcnRoIHVzZWZ1bCBsZWdhbCB3aW5uZXIgdGhhbmsgeWVsbG93J1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW50cm9weVRvTW5lbW9uaWMoZW50cm9weSwgd29yZGxpc3QpIHtcbiAgICBhZW50cm9weShlbnRyb3B5KTtcbiAgICBjb25zdCB3b3JkcyA9IGdldENvZGVyKHdvcmRsaXN0KS5lbmNvZGUoZW50cm9weSk7XG4gICAgcmV0dXJuIHdvcmRzLmpvaW4oaXNKYXBhbmVzZSh3b3JkbGlzdCkgPyAnXFx1MzAwMCcgOiAnICcpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgbW5lbW9uaWMgZm9yIGJlaW5nIDEyLTI0IHdvcmRzIGNvbnRhaW5lZCBpbiBgd29yZGxpc3RgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNbmVtb25pYyhtbmVtb25pYywgd29yZGxpc3QpIHtcbiAgICB0cnkge1xuICAgICAgICBtbmVtb25pY1RvRW50cm9weShtbmVtb25pYywgd29yZGxpc3QpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY29uc3QgcHNhbHQgPSAocGFzc3BocmFzZSkgPT4gbmZrZCgnbW5lbW9uaWMnICsgcGFzc3BocmFzZSk7XG4vKipcbiAqIElycmV2ZXJzaWJsZTogVXNlcyBLREYgdG8gZGVyaXZlIDY0IGJ5dGVzIG9mIGtleSBkYXRhIGZyb20gbW5lbW9uaWMgKyBvcHRpb25hbCBwYXNzd29yZC5cbiAqIEBwYXJhbSBtbmVtb25pYyAxMi0yNCB3b3Jkc1xuICogQHBhcmFtIHBhc3NwaHJhc2Ugc3RyaW5nIHRoYXQgd2lsbCBhZGRpdGlvbmFsbHkgcHJvdGVjdCB0aGUga2V5XG4gKiBAcmV0dXJucyA2NCBieXRlcyBvZiBrZXkgZGF0YVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG1uZW0gPSAnbGVnYWwgd2lubmVyIHRoYW5rIHllYXIgd2F2ZSBzYXVzYWdlIHdvcnRoIHVzZWZ1bCBsZWdhbCB3aW5uZXIgdGhhbmsgeWVsbG93JztcbiAqIGF3YWl0IG1uZW1vbmljVG9TZWVkKG1uZW0sICdwYXNzd29yZCcpO1xuICogLy8gbmV3IFVpbnQ4QXJyYXkoWy4uLjY0IGJ5dGVzXSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1uZW1vbmljVG9TZWVkKG1uZW1vbmljLCBwYXNzcGhyYXNlID0gJycpIHtcbiAgICByZXR1cm4gcGJrZGYyQXN5bmMoc2hhNTEyLCBub3JtYWxpemUobW5lbW9uaWMpLm5ma2QsIHBzYWx0KHBhc3NwaHJhc2UpLCB7IGM6IDIwNDgsIGRrTGVuOiA2NCB9KTtcbn1cbi8qKlxuICogSXJyZXZlcnNpYmxlOiBVc2VzIEtERiB0byBkZXJpdmUgNjQgYnl0ZXMgb2Yga2V5IGRhdGEgZnJvbSBtbmVtb25pYyArIG9wdGlvbmFsIHBhc3N3b3JkLlxuICogQHBhcmFtIG1uZW1vbmljIDEyLTI0IHdvcmRzXG4gKiBAcGFyYW0gcGFzc3BocmFzZSBzdHJpbmcgdGhhdCB3aWxsIGFkZGl0aW9uYWxseSBwcm90ZWN0IHRoZSBrZXlcbiAqIEByZXR1cm5zIDY0IGJ5dGVzIG9mIGtleSBkYXRhXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbW5lbSA9ICdsZWdhbCB3aW5uZXIgdGhhbmsgeWVhciB3YXZlIHNhdXNhZ2Ugd29ydGggdXNlZnVsIGxlZ2FsIHdpbm5lciB0aGFuayB5ZWxsb3cnO1xuICogbW5lbW9uaWNUb1NlZWRTeW5jKG1uZW0sICdwYXNzd29yZCcpO1xuICogLy8gbmV3IFVpbnQ4QXJyYXkoWy4uLjY0IGJ5dGVzXSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1uZW1vbmljVG9TZWVkU3luYyhtbmVtb25pYywgcGFzc3BocmFzZSA9ICcnKSB7XG4gICAgcmV0dXJuIHBia2RmMihzaGE1MTIsIG5vcm1hbGl6ZShtbmVtb25pYykubmZrZCwgcHNhbHQocGFzc3BocmFzZSksIHsgYzogMjA0OCwgZGtMZW46IDY0IH0pO1xufVxuLyoqXG4gKiBVc2VzIG5hdGl2ZSwgYnVpbHQtaW4gZnVuY3Rpb25hbGl0eSwgcHJvdmlkZWQgYnkgZ2xvYmFsVGhpcy5jcnlwdG8uXG4gKiBJcnJldmVyc2libGU6IFVzZXMgS0RGIHRvIGRlcml2ZSA2NCBieXRlcyBvZiBrZXkgZGF0YSBmcm9tIG1uZW1vbmljICsgb3B0aW9uYWwgcGFzc3dvcmQuXG4gKiBAcGFyYW0gbW5lbW9uaWMgMTItMjQgd29yZHNcbiAqIEBwYXJhbSBwYXNzcGhyYXNlIHN0cmluZyB0aGF0IHdpbGwgYWRkaXRpb25hbGx5IHByb3RlY3QgdGhlIGtleVxuICogQHJldHVybnMgNjQgYnl0ZXMgb2Yga2V5IGRhdGFcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBtbmVtID0gJ2xlZ2FsIHdpbm5lciB0aGFuayB5ZWFyIHdhdmUgc2F1c2FnZSB3b3J0aCB1c2VmdWwgbGVnYWwgd2lubmVyIHRoYW5rIHllbGxvdyc7XG4gKiBtbmVtb25pY1RvU2VlZFdlYmNyeXB0byhtbmVtLCAncGFzc3dvcmQnKTtcbiAqIC8vIG5ldyBVaW50OEFycmF5KFsuLi42NCBieXRlc10pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtbmVtb25pY1RvU2VlZFdlYmNyeXB0byhtbmVtb25pYywgcGFzc3BocmFzZSA9ICcnKSB7XG4gICAgcmV0dXJuIHBia2RmMndlYihzaGE1MTJ3ZWIsIG5vcm1hbGl6ZShtbmVtb25pYykubmZrZCwgcHNhbHQocGFzc3BocmFzZSksIHsgYzogMjA0OCwgZGtMZW46IDY0IH0pO1xufVxuIiwgImV4cG9ydCBjb25zdCB3b3JkbGlzdCA9IGBhYmFuZG9uXG5hYmlsaXR5XG5hYmxlXG5hYm91dFxuYWJvdmVcbmFic2VudFxuYWJzb3JiXG5hYnN0cmFjdFxuYWJzdXJkXG5hYnVzZVxuYWNjZXNzXG5hY2NpZGVudFxuYWNjb3VudFxuYWNjdXNlXG5hY2hpZXZlXG5hY2lkXG5hY291c3RpY1xuYWNxdWlyZVxuYWNyb3NzXG5hY3RcbmFjdGlvblxuYWN0b3JcbmFjdHJlc3NcbmFjdHVhbFxuYWRhcHRcbmFkZFxuYWRkaWN0XG5hZGRyZXNzXG5hZGp1c3RcbmFkbWl0XG5hZHVsdFxuYWR2YW5jZVxuYWR2aWNlXG5hZXJvYmljXG5hZmZhaXJcbmFmZm9yZFxuYWZyYWlkXG5hZ2FpblxuYWdlXG5hZ2VudFxuYWdyZWVcbmFoZWFkXG5haW1cbmFpclxuYWlycG9ydFxuYWlzbGVcbmFsYXJtXG5hbGJ1bVxuYWxjb2hvbFxuYWxlcnRcbmFsaWVuXG5hbGxcbmFsbGV5XG5hbGxvd1xuYWxtb3N0XG5hbG9uZVxuYWxwaGFcbmFscmVhZHlcbmFsc29cbmFsdGVyXG5hbHdheXNcbmFtYXRldXJcbmFtYXppbmdcbmFtb25nXG5hbW91bnRcbmFtdXNlZFxuYW5hbHlzdFxuYW5jaG9yXG5hbmNpZW50XG5hbmdlclxuYW5nbGVcbmFuZ3J5XG5hbmltYWxcbmFua2xlXG5hbm5vdW5jZVxuYW5udWFsXG5hbm90aGVyXG5hbnN3ZXJcbmFudGVubmFcbmFudGlxdWVcbmFueGlldHlcbmFueVxuYXBhcnRcbmFwb2xvZ3lcbmFwcGVhclxuYXBwbGVcbmFwcHJvdmVcbmFwcmlsXG5hcmNoXG5hcmN0aWNcbmFyZWFcbmFyZW5hXG5hcmd1ZVxuYXJtXG5hcm1lZFxuYXJtb3JcbmFybXlcbmFyb3VuZFxuYXJyYW5nZVxuYXJyZXN0XG5hcnJpdmVcbmFycm93XG5hcnRcbmFydGVmYWN0XG5hcnRpc3RcbmFydHdvcmtcbmFza1xuYXNwZWN0XG5hc3NhdWx0XG5hc3NldFxuYXNzaXN0XG5hc3N1bWVcbmFzdGhtYVxuYXRobGV0ZVxuYXRvbVxuYXR0YWNrXG5hdHRlbmRcbmF0dGl0dWRlXG5hdHRyYWN0XG5hdWN0aW9uXG5hdWRpdFxuYXVndXN0XG5hdW50XG5hdXRob3JcbmF1dG9cbmF1dHVtblxuYXZlcmFnZVxuYXZvY2Fkb1xuYXZvaWRcbmF3YWtlXG5hd2FyZVxuYXdheVxuYXdlc29tZVxuYXdmdWxcbmF3a3dhcmRcbmF4aXNcbmJhYnlcbmJhY2hlbG9yXG5iYWNvblxuYmFkZ2VcbmJhZ1xuYmFsYW5jZVxuYmFsY29ueVxuYmFsbFxuYmFtYm9vXG5iYW5hbmFcbmJhbm5lclxuYmFyXG5iYXJlbHlcbmJhcmdhaW5cbmJhcnJlbFxuYmFzZVxuYmFzaWNcbmJhc2tldFxuYmF0dGxlXG5iZWFjaFxuYmVhblxuYmVhdXR5XG5iZWNhdXNlXG5iZWNvbWVcbmJlZWZcbmJlZm9yZVxuYmVnaW5cbmJlaGF2ZVxuYmVoaW5kXG5iZWxpZXZlXG5iZWxvd1xuYmVsdFxuYmVuY2hcbmJlbmVmaXRcbmJlc3RcbmJldHJheVxuYmV0dGVyXG5iZXR3ZWVuXG5iZXlvbmRcbmJpY3ljbGVcbmJpZFxuYmlrZVxuYmluZFxuYmlvbG9neVxuYmlyZFxuYmlydGhcbmJpdHRlclxuYmxhY2tcbmJsYWRlXG5ibGFtZVxuYmxhbmtldFxuYmxhc3RcbmJsZWFrXG5ibGVzc1xuYmxpbmRcbmJsb29kXG5ibG9zc29tXG5ibG91c2VcbmJsdWVcbmJsdXJcbmJsdXNoXG5ib2FyZFxuYm9hdFxuYm9keVxuYm9pbFxuYm9tYlxuYm9uZVxuYm9udXNcbmJvb2tcbmJvb3N0XG5ib3JkZXJcbmJvcmluZ1xuYm9ycm93XG5ib3NzXG5ib3R0b21cbmJvdW5jZVxuYm94XG5ib3lcbmJyYWNrZXRcbmJyYWluXG5icmFuZFxuYnJhc3NcbmJyYXZlXG5icmVhZFxuYnJlZXplXG5icmlja1xuYnJpZGdlXG5icmllZlxuYnJpZ2h0XG5icmluZ1xuYnJpc2tcbmJyb2Njb2xpXG5icm9rZW5cbmJyb256ZVxuYnJvb21cbmJyb3RoZXJcbmJyb3duXG5icnVzaFxuYnViYmxlXG5idWRkeVxuYnVkZ2V0XG5idWZmYWxvXG5idWlsZFxuYnVsYlxuYnVsa1xuYnVsbGV0XG5idW5kbGVcbmJ1bmtlclxuYnVyZGVuXG5idXJnZXJcbmJ1cnN0XG5idXNcbmJ1c2luZXNzXG5idXN5XG5idXR0ZXJcbmJ1eWVyXG5idXp6XG5jYWJiYWdlXG5jYWJpblxuY2FibGVcbmNhY3R1c1xuY2FnZVxuY2FrZVxuY2FsbFxuY2FsbVxuY2FtZXJhXG5jYW1wXG5jYW5cbmNhbmFsXG5jYW5jZWxcbmNhbmR5XG5jYW5ub25cbmNhbm9lXG5jYW52YXNcbmNhbnlvblxuY2FwYWJsZVxuY2FwaXRhbFxuY2FwdGFpblxuY2FyXG5jYXJib25cbmNhcmRcbmNhcmdvXG5jYXJwZXRcbmNhcnJ5XG5jYXJ0XG5jYXNlXG5jYXNoXG5jYXNpbm9cbmNhc3RsZVxuY2FzdWFsXG5jYXRcbmNhdGFsb2dcbmNhdGNoXG5jYXRlZ29yeVxuY2F0dGxlXG5jYXVnaHRcbmNhdXNlXG5jYXV0aW9uXG5jYXZlXG5jZWlsaW5nXG5jZWxlcnlcbmNlbWVudFxuY2Vuc3VzXG5jZW50dXJ5XG5jZXJlYWxcbmNlcnRhaW5cbmNoYWlyXG5jaGFsa1xuY2hhbXBpb25cbmNoYW5nZVxuY2hhb3NcbmNoYXB0ZXJcbmNoYXJnZVxuY2hhc2VcbmNoYXRcbmNoZWFwXG5jaGVja1xuY2hlZXNlXG5jaGVmXG5jaGVycnlcbmNoZXN0XG5jaGlja2VuXG5jaGllZlxuY2hpbGRcbmNoaW1uZXlcbmNob2ljZVxuY2hvb3NlXG5jaHJvbmljXG5jaHVja2xlXG5jaHVua1xuY2h1cm5cbmNpZ2FyXG5jaW5uYW1vblxuY2lyY2xlXG5jaXRpemVuXG5jaXR5XG5jaXZpbFxuY2xhaW1cbmNsYXBcbmNsYXJpZnlcbmNsYXdcbmNsYXlcbmNsZWFuXG5jbGVya1xuY2xldmVyXG5jbGlja1xuY2xpZW50XG5jbGlmZlxuY2xpbWJcbmNsaW5pY1xuY2xpcFxuY2xvY2tcbmNsb2dcbmNsb3NlXG5jbG90aFxuY2xvdWRcbmNsb3duXG5jbHViXG5jbHVtcFxuY2x1c3RlclxuY2x1dGNoXG5jb2FjaFxuY29hc3RcbmNvY29udXRcbmNvZGVcbmNvZmZlZVxuY29pbFxuY29pblxuY29sbGVjdFxuY29sb3JcbmNvbHVtblxuY29tYmluZVxuY29tZVxuY29tZm9ydFxuY29taWNcbmNvbW1vblxuY29tcGFueVxuY29uY2VydFxuY29uZHVjdFxuY29uZmlybVxuY29uZ3Jlc3NcbmNvbm5lY3RcbmNvbnNpZGVyXG5jb250cm9sXG5jb252aW5jZVxuY29va1xuY29vbFxuY29wcGVyXG5jb3B5XG5jb3JhbFxuY29yZVxuY29yblxuY29ycmVjdFxuY29zdFxuY290dG9uXG5jb3VjaFxuY291bnRyeVxuY291cGxlXG5jb3Vyc2VcbmNvdXNpblxuY292ZXJcbmNveW90ZVxuY3JhY2tcbmNyYWRsZVxuY3JhZnRcbmNyYW1cbmNyYW5lXG5jcmFzaFxuY3JhdGVyXG5jcmF3bFxuY3JhenlcbmNyZWFtXG5jcmVkaXRcbmNyZWVrXG5jcmV3XG5jcmlja2V0XG5jcmltZVxuY3Jpc3BcbmNyaXRpY1xuY3JvcFxuY3Jvc3NcbmNyb3VjaFxuY3Jvd2RcbmNydWNpYWxcbmNydWVsXG5jcnVpc2VcbmNydW1ibGVcbmNydW5jaFxuY3J1c2hcbmNyeVxuY3J5c3RhbFxuY3ViZVxuY3VsdHVyZVxuY3VwXG5jdXBib2FyZFxuY3VyaW91c1xuY3VycmVudFxuY3VydGFpblxuY3VydmVcbmN1c2hpb25cbmN1c3RvbVxuY3V0ZVxuY3ljbGVcbmRhZFxuZGFtYWdlXG5kYW1wXG5kYW5jZVxuZGFuZ2VyXG5kYXJpbmdcbmRhc2hcbmRhdWdodGVyXG5kYXduXG5kYXlcbmRlYWxcbmRlYmF0ZVxuZGVicmlzXG5kZWNhZGVcbmRlY2VtYmVyXG5kZWNpZGVcbmRlY2xpbmVcbmRlY29yYXRlXG5kZWNyZWFzZVxuZGVlclxuZGVmZW5zZVxuZGVmaW5lXG5kZWZ5XG5kZWdyZWVcbmRlbGF5XG5kZWxpdmVyXG5kZW1hbmRcbmRlbWlzZVxuZGVuaWFsXG5kZW50aXN0XG5kZW55XG5kZXBhcnRcbmRlcGVuZFxuZGVwb3NpdFxuZGVwdGhcbmRlcHV0eVxuZGVyaXZlXG5kZXNjcmliZVxuZGVzZXJ0XG5kZXNpZ25cbmRlc2tcbmRlc3BhaXJcbmRlc3Ryb3lcbmRldGFpbFxuZGV0ZWN0XG5kZXZlbG9wXG5kZXZpY2VcbmRldm90ZVxuZGlhZ3JhbVxuZGlhbFxuZGlhbW9uZFxuZGlhcnlcbmRpY2VcbmRpZXNlbFxuZGlldFxuZGlmZmVyXG5kaWdpdGFsXG5kaWduaXR5XG5kaWxlbW1hXG5kaW5uZXJcbmRpbm9zYXVyXG5kaXJlY3RcbmRpcnRcbmRpc2FncmVlXG5kaXNjb3ZlclxuZGlzZWFzZVxuZGlzaFxuZGlzbWlzc1xuZGlzb3JkZXJcbmRpc3BsYXlcbmRpc3RhbmNlXG5kaXZlcnRcbmRpdmlkZVxuZGl2b3JjZVxuZGl6enlcbmRvY3RvclxuZG9jdW1lbnRcbmRvZ1xuZG9sbFxuZG9scGhpblxuZG9tYWluXG5kb25hdGVcbmRvbmtleVxuZG9ub3JcbmRvb3JcbmRvc2VcbmRvdWJsZVxuZG92ZVxuZHJhZnRcbmRyYWdvblxuZHJhbWFcbmRyYXN0aWNcbmRyYXdcbmRyZWFtXG5kcmVzc1xuZHJpZnRcbmRyaWxsXG5kcmlua1xuZHJpcFxuZHJpdmVcbmRyb3BcbmRydW1cbmRyeVxuZHVja1xuZHVtYlxuZHVuZVxuZHVyaW5nXG5kdXN0XG5kdXRjaFxuZHV0eVxuZHdhcmZcbmR5bmFtaWNcbmVhZ2VyXG5lYWdsZVxuZWFybHlcbmVhcm5cbmVhcnRoXG5lYXNpbHlcbmVhc3RcbmVhc3lcbmVjaG9cbmVjb2xvZ3lcbmVjb25vbXlcbmVkZ2VcbmVkaXRcbmVkdWNhdGVcbmVmZm9ydFxuZWdnXG5laWdodFxuZWl0aGVyXG5lbGJvd1xuZWxkZXJcbmVsZWN0cmljXG5lbGVnYW50XG5lbGVtZW50XG5lbGVwaGFudFxuZWxldmF0b3JcbmVsaXRlXG5lbHNlXG5lbWJhcmtcbmVtYm9keVxuZW1icmFjZVxuZW1lcmdlXG5lbW90aW9uXG5lbXBsb3lcbmVtcG93ZXJcbmVtcHR5XG5lbmFibGVcbmVuYWN0XG5lbmRcbmVuZGxlc3NcbmVuZG9yc2VcbmVuZW15XG5lbmVyZ3lcbmVuZm9yY2VcbmVuZ2FnZVxuZW5naW5lXG5lbmhhbmNlXG5lbmpveVxuZW5saXN0XG5lbm91Z2hcbmVucmljaFxuZW5yb2xsXG5lbnN1cmVcbmVudGVyXG5lbnRpcmVcbmVudHJ5XG5lbnZlbG9wZVxuZXBpc29kZVxuZXF1YWxcbmVxdWlwXG5lcmFcbmVyYXNlXG5lcm9kZVxuZXJvc2lvblxuZXJyb3JcbmVydXB0XG5lc2NhcGVcbmVzc2F5XG5lc3NlbmNlXG5lc3RhdGVcbmV0ZXJuYWxcbmV0aGljc1xuZXZpZGVuY2VcbmV2aWxcbmV2b2tlXG5ldm9sdmVcbmV4YWN0XG5leGFtcGxlXG5leGNlc3NcbmV4Y2hhbmdlXG5leGNpdGVcbmV4Y2x1ZGVcbmV4Y3VzZVxuZXhlY3V0ZVxuZXhlcmNpc2VcbmV4aGF1c3RcbmV4aGliaXRcbmV4aWxlXG5leGlzdFxuZXhpdFxuZXhvdGljXG5leHBhbmRcbmV4cGVjdFxuZXhwaXJlXG5leHBsYWluXG5leHBvc2VcbmV4cHJlc3NcbmV4dGVuZFxuZXh0cmFcbmV5ZVxuZXllYnJvd1xuZmFicmljXG5mYWNlXG5mYWN1bHR5XG5mYWRlXG5mYWludFxuZmFpdGhcbmZhbGxcbmZhbHNlXG5mYW1lXG5mYW1pbHlcbmZhbW91c1xuZmFuXG5mYW5jeVxuZmFudGFzeVxuZmFybVxuZmFzaGlvblxuZmF0XG5mYXRhbFxuZmF0aGVyXG5mYXRpZ3VlXG5mYXVsdFxuZmF2b3JpdGVcbmZlYXR1cmVcbmZlYnJ1YXJ5XG5mZWRlcmFsXG5mZWVcbmZlZWRcbmZlZWxcbmZlbWFsZVxuZmVuY2VcbmZlc3RpdmFsXG5mZXRjaFxuZmV2ZXJcbmZld1xuZmliZXJcbmZpY3Rpb25cbmZpZWxkXG5maWd1cmVcbmZpbGVcbmZpbG1cbmZpbHRlclxuZmluYWxcbmZpbmRcbmZpbmVcbmZpbmdlclxuZmluaXNoXG5maXJlXG5maXJtXG5maXJzdFxuZmlzY2FsXG5maXNoXG5maXRcbmZpdG5lc3NcbmZpeFxuZmxhZ1xuZmxhbWVcbmZsYXNoXG5mbGF0XG5mbGF2b3JcbmZsZWVcbmZsaWdodFxuZmxpcFxuZmxvYXRcbmZsb2NrXG5mbG9vclxuZmxvd2VyXG5mbHVpZFxuZmx1c2hcbmZseVxuZm9hbVxuZm9jdXNcbmZvZ1xuZm9pbFxuZm9sZFxuZm9sbG93XG5mb29kXG5mb290XG5mb3JjZVxuZm9yZXN0XG5mb3JnZXRcbmZvcmtcbmZvcnR1bmVcbmZvcnVtXG5mb3J3YXJkXG5mb3NzaWxcbmZvc3RlclxuZm91bmRcbmZveFxuZnJhZ2lsZVxuZnJhbWVcbmZyZXF1ZW50XG5mcmVzaFxuZnJpZW5kXG5mcmluZ2VcbmZyb2dcbmZyb250XG5mcm9zdFxuZnJvd25cbmZyb3plblxuZnJ1aXRcbmZ1ZWxcbmZ1blxuZnVubnlcbmZ1cm5hY2VcbmZ1cnlcbmZ1dHVyZVxuZ2FkZ2V0XG5nYWluXG5nYWxheHlcbmdhbGxlcnlcbmdhbWVcbmdhcFxuZ2FyYWdlXG5nYXJiYWdlXG5nYXJkZW5cbmdhcmxpY1xuZ2FybWVudFxuZ2FzXG5nYXNwXG5nYXRlXG5nYXRoZXJcbmdhdWdlXG5nYXplXG5nZW5lcmFsXG5nZW5pdXNcbmdlbnJlXG5nZW50bGVcbmdlbnVpbmVcbmdlc3R1cmVcbmdob3N0XG5naWFudFxuZ2lmdFxuZ2lnZ2xlXG5naW5nZXJcbmdpcmFmZmVcbmdpcmxcbmdpdmVcbmdsYWRcbmdsYW5jZVxuZ2xhcmVcbmdsYXNzXG5nbGlkZVxuZ2xpbXBzZVxuZ2xvYmVcbmdsb29tXG5nbG9yeVxuZ2xvdmVcbmdsb3dcbmdsdWVcbmdvYXRcbmdvZGRlc3NcbmdvbGRcbmdvb2Rcbmdvb3NlXG5nb3JpbGxhXG5nb3NwZWxcbmdvc3NpcFxuZ292ZXJuXG5nb3duXG5ncmFiXG5ncmFjZVxuZ3JhaW5cbmdyYW50XG5ncmFwZVxuZ3Jhc3NcbmdyYXZpdHlcbmdyZWF0XG5ncmVlblxuZ3JpZFxuZ3JpZWZcbmdyaXRcbmdyb2Nlcnlcbmdyb3VwXG5ncm93XG5ncnVudFxuZ3VhcmRcbmd1ZXNzXG5ndWlkZVxuZ3VpbHRcbmd1aXRhclxuZ3VuXG5neW1cbmhhYml0XG5oYWlyXG5oYWxmXG5oYW1tZXJcbmhhbXN0ZXJcbmhhbmRcbmhhcHB5XG5oYXJib3JcbmhhcmRcbmhhcnNoXG5oYXJ2ZXN0XG5oYXRcbmhhdmVcbmhhd2tcbmhhemFyZFxuaGVhZFxuaGVhbHRoXG5oZWFydFxuaGVhdnlcbmhlZGdlaG9nXG5oZWlnaHRcbmhlbGxvXG5oZWxtZXRcbmhlbHBcbmhlblxuaGVyb1xuaGlkZGVuXG5oaWdoXG5oaWxsXG5oaW50XG5oaXBcbmhpcmVcbmhpc3RvcnlcbmhvYmJ5XG5ob2NrZXlcbmhvbGRcbmhvbGVcbmhvbGlkYXlcbmhvbGxvd1xuaG9tZVxuaG9uZXlcbmhvb2RcbmhvcGVcbmhvcm5cbmhvcnJvclxuaG9yc2Vcbmhvc3BpdGFsXG5ob3N0XG5ob3RlbFxuaG91clxuaG92ZXJcbmh1YlxuaHVnZVxuaHVtYW5cbmh1bWJsZVxuaHVtb3Jcbmh1bmRyZWRcbmh1bmdyeVxuaHVudFxuaHVyZGxlXG5odXJyeVxuaHVydFxuaHVzYmFuZFxuaHlicmlkXG5pY2Vcbmljb25cbmlkZWFcbmlkZW50aWZ5XG5pZGxlXG5pZ25vcmVcbmlsbFxuaWxsZWdhbFxuaWxsbmVzc1xuaW1hZ2VcbmltaXRhdGVcbmltbWVuc2VcbmltbXVuZVxuaW1wYWN0XG5pbXBvc2VcbmltcHJvdmVcbmltcHVsc2VcbmluY2hcbmluY2x1ZGVcbmluY29tZVxuaW5jcmVhc2VcbmluZGV4XG5pbmRpY2F0ZVxuaW5kb29yXG5pbmR1c3RyeVxuaW5mYW50XG5pbmZsaWN0XG5pbmZvcm1cbmluaGFsZVxuaW5oZXJpdFxuaW5pdGlhbFxuaW5qZWN0XG5pbmp1cnlcbmlubWF0ZVxuaW5uZXJcbmlubm9jZW50XG5pbnB1dFxuaW5xdWlyeVxuaW5zYW5lXG5pbnNlY3Rcbmluc2lkZVxuaW5zcGlyZVxuaW5zdGFsbFxuaW50YWN0XG5pbnRlcmVzdFxuaW50b1xuaW52ZXN0XG5pbnZpdGVcbmludm9sdmVcbmlyb25cbmlzbGFuZFxuaXNvbGF0ZVxuaXNzdWVcbml0ZW1cbml2b3J5XG5qYWNrZXRcbmphZ3VhclxuamFyXG5qYXp6XG5qZWFsb3VzXG5qZWFuc1xuamVsbHlcbmpld2VsXG5qb2JcbmpvaW5cbmpva2VcbmpvdXJuZXlcbmpveVxuanVkZ2Vcbmp1aWNlXG5qdW1wXG5qdW5nbGVcbmp1bmlvclxuanVua1xuanVzdFxua2FuZ2Fyb29cbmtlZW5cbmtlZXBcbmtldGNodXBcbmtleVxua2lja1xua2lkXG5raWRuZXlcbmtpbmRcbmtpbmdkb21cbmtpc3NcbmtpdFxua2l0Y2hlblxua2l0ZVxua2l0dGVuXG5raXdpXG5rbmVlXG5rbmlmZVxua25vY2tcbmtub3dcbmxhYlxubGFiZWxcbmxhYm9yXG5sYWRkZXJcbmxhZHlcbmxha2VcbmxhbXBcbmxhbmd1YWdlXG5sYXB0b3BcbmxhcmdlXG5sYXRlclxubGF0aW5cbmxhdWdoXG5sYXVuZHJ5XG5sYXZhXG5sYXdcbmxhd25cbmxhd3N1aXRcbmxheWVyXG5sYXp5XG5sZWFkZXJcbmxlYWZcbmxlYXJuXG5sZWF2ZVxubGVjdHVyZVxubGVmdFxubGVnXG5sZWdhbFxubGVnZW5kXG5sZWlzdXJlXG5sZW1vblxubGVuZFxubGVuZ3RoXG5sZW5zXG5sZW9wYXJkXG5sZXNzb25cbmxldHRlclxubGV2ZWxcbmxpYXJcbmxpYmVydHlcbmxpYnJhcnlcbmxpY2Vuc2VcbmxpZmVcbmxpZnRcbmxpZ2h0XG5saWtlXG5saW1iXG5saW1pdFxubGlua1xubGlvblxubGlxdWlkXG5saXN0XG5saXR0bGVcbmxpdmVcbmxpemFyZFxubG9hZFxubG9hblxubG9ic3RlclxubG9jYWxcbmxvY2tcbmxvZ2ljXG5sb25lbHlcbmxvbmdcbmxvb3BcbmxvdHRlcnlcbmxvdWRcbmxvdW5nZVxubG92ZVxubG95YWxcbmx1Y2t5XG5sdWdnYWdlXG5sdW1iZXJcbmx1bmFyXG5sdW5jaFxubHV4dXJ5XG5seXJpY3Ncbm1hY2hpbmVcbm1hZFxubWFnaWNcbm1hZ25ldFxubWFpZFxubWFpbFxubWFpblxubWFqb3Jcbm1ha2Vcbm1hbW1hbFxubWFuXG5tYW5hZ2Vcbm1hbmRhdGVcbm1hbmdvXG5tYW5zaW9uXG5tYW51YWxcbm1hcGxlXG5tYXJibGVcbm1hcmNoXG5tYXJnaW5cbm1hcmluZVxubWFya2V0XG5tYXJyaWFnZVxubWFza1xubWFzc1xubWFzdGVyXG5tYXRjaFxubWF0ZXJpYWxcbm1hdGhcbm1hdHJpeFxubWF0dGVyXG5tYXhpbXVtXG5tYXplXG5tZWFkb3dcbm1lYW5cbm1lYXN1cmVcbm1lYXRcbm1lY2hhbmljXG5tZWRhbFxubWVkaWFcbm1lbG9keVxubWVsdFxubWVtYmVyXG5tZW1vcnlcbm1lbnRpb25cbm1lbnVcbm1lcmN5XG5tZXJnZVxubWVyaXRcbm1lcnJ5XG5tZXNoXG5tZXNzYWdlXG5tZXRhbFxubWV0aG9kXG5taWRkbGVcbm1pZG5pZ2h0XG5taWxrXG5taWxsaW9uXG5taW1pY1xubWluZFxubWluaW11bVxubWlub3Jcbm1pbnV0ZVxubWlyYWNsZVxubWlycm9yXG5taXNlcnlcbm1pc3Ncbm1pc3Rha2Vcbm1peFxubWl4ZWRcbm1peHR1cmVcbm1vYmlsZVxubW9kZWxcbm1vZGlmeVxubW9tXG5tb21lbnRcbm1vbml0b3Jcbm1vbmtleVxubW9uc3RlclxubW9udGhcbm1vb25cbm1vcmFsXG5tb3JlXG5tb3JuaW5nXG5tb3NxdWl0b1xubW90aGVyXG5tb3Rpb25cbm1vdG9yXG5tb3VudGFpblxubW91c2Vcbm1vdmVcbm1vdmllXG5tdWNoXG5tdWZmaW5cbm11bGVcbm11bHRpcGx5XG5tdXNjbGVcbm11c2V1bVxubXVzaHJvb21cbm11c2ljXG5tdXN0XG5tdXR1YWxcbm15c2VsZlxubXlzdGVyeVxubXl0aFxubmFpdmVcbm5hbWVcbm5hcGtpblxubmFycm93XG5uYXN0eVxubmF0aW9uXG5uYXR1cmVcbm5lYXJcbm5lY2tcbm5lZWRcbm5lZ2F0aXZlXG5uZWdsZWN0XG5uZWl0aGVyXG5uZXBoZXdcbm5lcnZlXG5uZXN0XG5uZXRcbm5ldHdvcmtcbm5ldXRyYWxcbm5ldmVyXG5uZXdzXG5uZXh0XG5uaWNlXG5uaWdodFxubm9ibGVcbm5vaXNlXG5ub21pbmVlXG5ub29kbGVcbm5vcm1hbFxubm9ydGhcbm5vc2Vcbm5vdGFibGVcbm5vdGVcbm5vdGhpbmdcbm5vdGljZVxubm92ZWxcbm5vd1xubnVjbGVhclxubnVtYmVyXG5udXJzZVxubnV0XG5vYWtcbm9iZXlcbm9iamVjdFxub2JsaWdlXG5vYnNjdXJlXG5vYnNlcnZlXG5vYnRhaW5cbm9idmlvdXNcbm9jY3VyXG5vY2Vhblxub2N0b2Jlclxub2Rvclxub2ZmXG5vZmZlclxub2ZmaWNlXG5vZnRlblxub2lsXG5va2F5XG5vbGRcbm9saXZlXG5vbHltcGljXG5vbWl0XG5vbmNlXG5vbmVcbm9uaW9uXG5vbmxpbmVcbm9ubHlcbm9wZW5cbm9wZXJhXG5vcGluaW9uXG5vcHBvc2Vcbm9wdGlvblxub3JhbmdlXG5vcmJpdFxub3JjaGFyZFxub3JkZXJcbm9yZGluYXJ5XG5vcmdhblxub3JpZW50XG5vcmlnaW5hbFxub3JwaGFuXG5vc3RyaWNoXG5vdGhlclxub3V0ZG9vclxub3V0ZXJcbm91dHB1dFxub3V0c2lkZVxub3ZhbFxub3Zlblxub3Zlclxub3duXG5vd25lclxub3h5Z2VuXG5veXN0ZXJcbm96b25lXG5wYWN0XG5wYWRkbGVcbnBhZ2VcbnBhaXJcbnBhbGFjZVxucGFsbVxucGFuZGFcbnBhbmVsXG5wYW5pY1xucGFudGhlclxucGFwZXJcbnBhcmFkZVxucGFyZW50XG5wYXJrXG5wYXJyb3RcbnBhcnR5XG5wYXNzXG5wYXRjaFxucGF0aFxucGF0aWVudFxucGF0cm9sXG5wYXR0ZXJuXG5wYXVzZVxucGF2ZVxucGF5bWVudFxucGVhY2VcbnBlYW51dFxucGVhclxucGVhc2FudFxucGVsaWNhblxucGVuXG5wZW5hbHR5XG5wZW5jaWxcbnBlb3BsZVxucGVwcGVyXG5wZXJmZWN0XG5wZXJtaXRcbnBlcnNvblxucGV0XG5waG9uZVxucGhvdG9cbnBocmFzZVxucGh5c2ljYWxcbnBpYW5vXG5waWNuaWNcbnBpY3R1cmVcbnBpZWNlXG5waWdcbnBpZ2VvblxucGlsbFxucGlsb3RcbnBpbmtcbnBpb25lZXJcbnBpcGVcbnBpc3RvbFxucGl0Y2hcbnBpenphXG5wbGFjZVxucGxhbmV0XG5wbGFzdGljXG5wbGF0ZVxucGxheVxucGxlYXNlXG5wbGVkZ2VcbnBsdWNrXG5wbHVnXG5wbHVuZ2VcbnBvZW1cbnBvZXRcbnBvaW50XG5wb2xhclxucG9sZVxucG9saWNlXG5wb25kXG5wb255XG5wb29sXG5wb3B1bGFyXG5wb3J0aW9uXG5wb3NpdGlvblxucG9zc2libGVcbnBvc3RcbnBvdGF0b1xucG90dGVyeVxucG92ZXJ0eVxucG93ZGVyXG5wb3dlclxucHJhY3RpY2VcbnByYWlzZVxucHJlZGljdFxucHJlZmVyXG5wcmVwYXJlXG5wcmVzZW50XG5wcmV0dHlcbnByZXZlbnRcbnByaWNlXG5wcmlkZVxucHJpbWFyeVxucHJpbnRcbnByaW9yaXR5XG5wcmlzb25cbnByaXZhdGVcbnByaXplXG5wcm9ibGVtXG5wcm9jZXNzXG5wcm9kdWNlXG5wcm9maXRcbnByb2dyYW1cbnByb2plY3RcbnByb21vdGVcbnByb29mXG5wcm9wZXJ0eVxucHJvc3BlclxucHJvdGVjdFxucHJvdWRcbnByb3ZpZGVcbnB1YmxpY1xucHVkZGluZ1xucHVsbFxucHVscFxucHVsc2VcbnB1bXBraW5cbnB1bmNoXG5wdXBpbFxucHVwcHlcbnB1cmNoYXNlXG5wdXJpdHlcbnB1cnBvc2VcbnB1cnNlXG5wdXNoXG5wdXRcbnB1enpsZVxucHlyYW1pZFxucXVhbGl0eVxucXVhbnR1bVxucXVhcnRlclxucXVlc3Rpb25cbnF1aWNrXG5xdWl0XG5xdWl6XG5xdW90ZVxucmFiYml0XG5yYWNjb29uXG5yYWNlXG5yYWNrXG5yYWRhclxucmFkaW9cbnJhaWxcbnJhaW5cbnJhaXNlXG5yYWxseVxucmFtcFxucmFuY2hcbnJhbmRvbVxucmFuZ2VcbnJhcGlkXG5yYXJlXG5yYXRlXG5yYXRoZXJcbnJhdmVuXG5yYXdcbnJhem9yXG5yZWFkeVxucmVhbFxucmVhc29uXG5yZWJlbFxucmVidWlsZFxucmVjYWxsXG5yZWNlaXZlXG5yZWNpcGVcbnJlY29yZFxucmVjeWNsZVxucmVkdWNlXG5yZWZsZWN0XG5yZWZvcm1cbnJlZnVzZVxucmVnaW9uXG5yZWdyZXRcbnJlZ3VsYXJcbnJlamVjdFxucmVsYXhcbnJlbGVhc2VcbnJlbGllZlxucmVseVxucmVtYWluXG5yZW1lbWJlclxucmVtaW5kXG5yZW1vdmVcbnJlbmRlclxucmVuZXdcbnJlbnRcbnJlb3BlblxucmVwYWlyXG5yZXBlYXRcbnJlcGxhY2VcbnJlcG9ydFxucmVxdWlyZVxucmVzY3VlXG5yZXNlbWJsZVxucmVzaXN0XG5yZXNvdXJjZVxucmVzcG9uc2VcbnJlc3VsdFxucmV0aXJlXG5yZXRyZWF0XG5yZXR1cm5cbnJldW5pb25cbnJldmVhbFxucmV2aWV3XG5yZXdhcmRcbnJoeXRobVxucmliXG5yaWJib25cbnJpY2VcbnJpY2hcbnJpZGVcbnJpZGdlXG5yaWZsZVxucmlnaHRcbnJpZ2lkXG5yaW5nXG5yaW90XG5yaXBwbGVcbnJpc2tcbnJpdHVhbFxucml2YWxcbnJpdmVyXG5yb2FkXG5yb2FzdFxucm9ib3RcbnJvYnVzdFxucm9ja2V0XG5yb21hbmNlXG5yb29mXG5yb29raWVcbnJvb21cbnJvc2VcbnJvdGF0ZVxucm91Z2hcbnJvdW5kXG5yb3V0ZVxucm95YWxcbnJ1YmJlclxucnVkZVxucnVnXG5ydWxlXG5ydW5cbnJ1bndheVxucnVyYWxcbnNhZFxuc2FkZGxlXG5zYWRuZXNzXG5zYWZlXG5zYWlsXG5zYWxhZFxuc2FsbW9uXG5zYWxvblxuc2FsdFxuc2FsdXRlXG5zYW1lXG5zYW1wbGVcbnNhbmRcbnNhdGlzZnlcbnNhdG9zaGlcbnNhdWNlXG5zYXVzYWdlXG5zYXZlXG5zYXlcbnNjYWxlXG5zY2FuXG5zY2FyZVxuc2NhdHRlclxuc2NlbmVcbnNjaGVtZVxuc2Nob29sXG5zY2llbmNlXG5zY2lzc29yc1xuc2NvcnBpb25cbnNjb3V0XG5zY3JhcFxuc2NyZWVuXG5zY3JpcHRcbnNjcnViXG5zZWFcbnNlYXJjaFxuc2Vhc29uXG5zZWF0XG5zZWNvbmRcbnNlY3JldFxuc2VjdGlvblxuc2VjdXJpdHlcbnNlZWRcbnNlZWtcbnNlZ21lbnRcbnNlbGVjdFxuc2VsbFxuc2VtaW5hclxuc2VuaW9yXG5zZW5zZVxuc2VudGVuY2VcbnNlcmllc1xuc2VydmljZVxuc2Vzc2lvblxuc2V0dGxlXG5zZXR1cFxuc2V2ZW5cbnNoYWRvd1xuc2hhZnRcbnNoYWxsb3dcbnNoYXJlXG5zaGVkXG5zaGVsbFxuc2hlcmlmZlxuc2hpZWxkXG5zaGlmdFxuc2hpbmVcbnNoaXBcbnNoaXZlclxuc2hvY2tcbnNob2VcbnNob290XG5zaG9wXG5zaG9ydFxuc2hvdWxkZXJcbnNob3ZlXG5zaHJpbXBcbnNocnVnXG5zaHVmZmxlXG5zaHlcbnNpYmxpbmdcbnNpY2tcbnNpZGVcbnNpZWdlXG5zaWdodFxuc2lnblxuc2lsZW50XG5zaWxrXG5zaWxseVxuc2lsdmVyXG5zaW1pbGFyXG5zaW1wbGVcbnNpbmNlXG5zaW5nXG5zaXJlblxuc2lzdGVyXG5zaXR1YXRlXG5zaXhcbnNpemVcbnNrYXRlXG5za2V0Y2hcbnNraVxuc2tpbGxcbnNraW5cbnNraXJ0XG5za3VsbFxuc2xhYlxuc2xhbVxuc2xlZXBcbnNsZW5kZXJcbnNsaWNlXG5zbGlkZVxuc2xpZ2h0XG5zbGltXG5zbG9nYW5cbnNsb3RcbnNsb3dcbnNsdXNoXG5zbWFsbFxuc21hcnRcbnNtaWxlXG5zbW9rZVxuc21vb3RoXG5zbmFja1xuc25ha2VcbnNuYXBcbnNuaWZmXG5zbm93XG5zb2FwXG5zb2NjZXJcbnNvY2lhbFxuc29ja1xuc29kYVxuc29mdFxuc29sYXJcbnNvbGRpZXJcbnNvbGlkXG5zb2x1dGlvblxuc29sdmVcbnNvbWVvbmVcbnNvbmdcbnNvb25cbnNvcnJ5XG5zb3J0XG5zb3VsXG5zb3VuZFxuc291cFxuc291cmNlXG5zb3V0aFxuc3BhY2VcbnNwYXJlXG5zcGF0aWFsXG5zcGF3blxuc3BlYWtcbnNwZWNpYWxcbnNwZWVkXG5zcGVsbFxuc3BlbmRcbnNwaGVyZVxuc3BpY2VcbnNwaWRlclxuc3Bpa2VcbnNwaW5cbnNwaXJpdFxuc3BsaXRcbnNwb2lsXG5zcG9uc29yXG5zcG9vblxuc3BvcnRcbnNwb3RcbnNwcmF5XG5zcHJlYWRcbnNwcmluZ1xuc3B5XG5zcXVhcmVcbnNxdWVlemVcbnNxdWlycmVsXG5zdGFibGVcbnN0YWRpdW1cbnN0YWZmXG5zdGFnZVxuc3RhaXJzXG5zdGFtcFxuc3RhbmRcbnN0YXJ0XG5zdGF0ZVxuc3RheVxuc3RlYWtcbnN0ZWVsXG5zdGVtXG5zdGVwXG5zdGVyZW9cbnN0aWNrXG5zdGlsbFxuc3RpbmdcbnN0b2NrXG5zdG9tYWNoXG5zdG9uZVxuc3Rvb2xcbnN0b3J5XG5zdG92ZVxuc3RyYXRlZ3lcbnN0cmVldFxuc3RyaWtlXG5zdHJvbmdcbnN0cnVnZ2xlXG5zdHVkZW50XG5zdHVmZlxuc3R1bWJsZVxuc3R5bGVcbnN1YmplY3RcbnN1Ym1pdFxuc3Vid2F5XG5zdWNjZXNzXG5zdWNoXG5zdWRkZW5cbnN1ZmZlclxuc3VnYXJcbnN1Z2dlc3RcbnN1aXRcbnN1bW1lclxuc3VuXG5zdW5ueVxuc3Vuc2V0XG5zdXBlclxuc3VwcGx5XG5zdXByZW1lXG5zdXJlXG5zdXJmYWNlXG5zdXJnZVxuc3VycHJpc2VcbnN1cnJvdW5kXG5zdXJ2ZXlcbnN1c3BlY3RcbnN1c3RhaW5cbnN3YWxsb3dcbnN3YW1wXG5zd2FwXG5zd2FybVxuc3dlYXJcbnN3ZWV0XG5zd2lmdFxuc3dpbVxuc3dpbmdcbnN3aXRjaFxuc3dvcmRcbnN5bWJvbFxuc3ltcHRvbVxuc3lydXBcbnN5c3RlbVxudGFibGVcbnRhY2tsZVxudGFnXG50YWlsXG50YWxlbnRcbnRhbGtcbnRhbmtcbnRhcGVcbnRhcmdldFxudGFza1xudGFzdGVcbnRhdHRvb1xudGF4aVxudGVhY2hcbnRlYW1cbnRlbGxcbnRlblxudGVuYW50XG50ZW5uaXNcbnRlbnRcbnRlcm1cbnRlc3RcbnRleHRcbnRoYW5rXG50aGF0XG50aGVtZVxudGhlblxudGhlb3J5XG50aGVyZVxudGhleVxudGhpbmdcbnRoaXNcbnRob3VnaHRcbnRocmVlXG50aHJpdmVcbnRocm93XG50aHVtYlxudGh1bmRlclxudGlja2V0XG50aWRlXG50aWdlclxudGlsdFxudGltYmVyXG50aW1lXG50aW55XG50aXBcbnRpcmVkXG50aXNzdWVcbnRpdGxlXG50b2FzdFxudG9iYWNjb1xudG9kYXlcbnRvZGRsZXJcbnRvZVxudG9nZXRoZXJcbnRvaWxldFxudG9rZW5cbnRvbWF0b1xudG9tb3Jyb3dcbnRvbmVcbnRvbmd1ZVxudG9uaWdodFxudG9vbFxudG9vdGhcbnRvcFxudG9waWNcbnRvcHBsZVxudG9yY2hcbnRvcm5hZG9cbnRvcnRvaXNlXG50b3NzXG50b3RhbFxudG91cmlzdFxudG93YXJkXG50b3dlclxudG93blxudG95XG50cmFja1xudHJhZGVcbnRyYWZmaWNcbnRyYWdpY1xudHJhaW5cbnRyYW5zZmVyXG50cmFwXG50cmFzaFxudHJhdmVsXG50cmF5XG50cmVhdFxudHJlZVxudHJlbmRcbnRyaWFsXG50cmliZVxudHJpY2tcbnRyaWdnZXJcbnRyaW1cbnRyaXBcbnRyb3BoeVxudHJvdWJsZVxudHJ1Y2tcbnRydWVcbnRydWx5XG50cnVtcGV0XG50cnVzdFxudHJ1dGhcbnRyeVxudHViZVxudHVpdGlvblxudHVtYmxlXG50dW5hXG50dW5uZWxcbnR1cmtleVxudHVyblxudHVydGxlXG50d2VsdmVcbnR3ZW50eVxudHdpY2VcbnR3aW5cbnR3aXN0XG50d29cbnR5cGVcbnR5cGljYWxcbnVnbHlcbnVtYnJlbGxhXG51bmFibGVcbnVuYXdhcmVcbnVuY2xlXG51bmNvdmVyXG51bmRlclxudW5kb1xudW5mYWlyXG51bmZvbGRcbnVuaGFwcHlcbnVuaWZvcm1cbnVuaXF1ZVxudW5pdFxudW5pdmVyc2VcbnVua25vd25cbnVubG9ja1xudW50aWxcbnVudXN1YWxcbnVudmVpbFxudXBkYXRlXG51cGdyYWRlXG51cGhvbGRcbnVwb25cbnVwcGVyXG51cHNldFxudXJiYW5cbnVyZ2VcbnVzYWdlXG51c2VcbnVzZWRcbnVzZWZ1bFxudXNlbGVzc1xudXN1YWxcbnV0aWxpdHlcbnZhY2FudFxudmFjdXVtXG52YWd1ZVxudmFsaWRcbnZhbGxleVxudmFsdmVcbnZhblxudmFuaXNoXG52YXBvclxudmFyaW91c1xudmFzdFxudmF1bHRcbnZlaGljbGVcbnZlbHZldFxudmVuZG9yXG52ZW50dXJlXG52ZW51ZVxudmVyYlxudmVyaWZ5XG52ZXJzaW9uXG52ZXJ5XG52ZXNzZWxcbnZldGVyYW5cbnZpYWJsZVxudmlicmFudFxudmljaW91c1xudmljdG9yeVxudmlkZW9cbnZpZXdcbnZpbGxhZ2VcbnZpbnRhZ2VcbnZpb2xpblxudmlydHVhbFxudmlydXNcbnZpc2FcbnZpc2l0XG52aXN1YWxcbnZpdGFsXG52aXZpZFxudm9jYWxcbnZvaWNlXG52b2lkXG52b2xjYW5vXG52b2x1bWVcbnZvdGVcbnZveWFnZVxud2FnZVxud2Fnb25cbndhaXRcbndhbGtcbndhbGxcbndhbG51dFxud2FudFxud2FyZmFyZVxud2FybVxud2Fycmlvclxud2FzaFxud2FzcFxud2FzdGVcbndhdGVyXG53YXZlXG53YXlcbndlYWx0aFxud2VhcG9uXG53ZWFyXG53ZWFzZWxcbndlYXRoZXJcbndlYlxud2VkZGluZ1xud2Vla2VuZFxud2VpcmRcbndlbGNvbWVcbndlc3RcbndldFxud2hhbGVcbndoYXRcbndoZWF0XG53aGVlbFxud2hlblxud2hlcmVcbndoaXBcbndoaXNwZXJcbndpZGVcbndpZHRoXG53aWZlXG53aWxkXG53aWxsXG53aW5cbndpbmRvd1xud2luZVxud2luZ1xud2lua1xud2lubmVyXG53aW50ZXJcbndpcmVcbndpc2RvbVxud2lzZVxud2lzaFxud2l0bmVzc1xud29sZlxud29tYW5cbndvbmRlclxud29vZFxud29vbFxud29yZFxud29ya1xud29ybGRcbndvcnJ5XG53b3J0aFxud3JhcFxud3JlY2tcbndyZXN0bGVcbndyaXN0XG53cml0ZVxud3JvbmdcbnlhcmRcbnllYXJcbnllbGxvd1xueW91XG55b3VuZ1xueW91dGhcbnplYnJhXG56ZXJvXG56b25lXG56b29gLnNwbGl0KCdcXG4nKTtcbiIsICIvKipcbiAqIEtleSBnZW5lcmF0aW9uIHV0aWxpdGllcyBmb3IgTm9zdHJcbiAqXG4gKiBVc2VzIG5vc3RyLWNyeXB0by11dGlscyBmb3IgYWxsIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9ucy5cbiAqIFJldHVybnMgcGxhaW4gaGV4IHN0cmluZ3MgZm9yIGJvdGggcHJpdmF0ZSBhbmQgcHVibGljIGtleXMuXG4gKi9cblxuaW1wb3J0IHsgZ2VuZXJhdGVLZXlQYWlyIGFzIGdlbmVyYXRlS2V5UGFpckNyeXB0bywgZ2V0UHVibGljS2V5U3luYywgYnl0ZXNUb0hleCB9IGZyb20gJ25vc3RyLWNyeXB0by11dGlscyc7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IE5vc3RyIGtleXBhaXIuXG4gKiBSZXR1cm5zIHRoZSBwcml2YXRlIGtleSBhbmQgcHVibGljIGtleSBhcyBoZXggc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlS2V5UGFpcigpIHtcbiAgICBjb25zdCBrZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVLZXlQYWlyQ3J5cHRvKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJpdmF0ZUtleToga2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBwdWJsaWNLZXk6IGtleVBhaXIucHVibGljS2V5LmhleCxcbiAgICB9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHB1YmxpYyBrZXkgZnJvbSBhIHByaXZhdGUga2V5IChoZXggc3RyaW5nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFB1YmxpY0tleUZyb21Qcml2YXRlKHByaXZhdGVLZXlIZXgpIHtcbiAgICByZXR1cm4gZ2V0UHVibGljS2V5U3luYyhwcml2YXRlS2V5SGV4KTtcbn1cblxuZXhwb3J0IHsgYnl0ZXNUb0hleCB9O1xuIiwgImNvbnN0IEVfVElNRU9VVCA9IG5ldyBFcnJvcigndGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBtdXRleCB0byBiZWNvbWUgYXZhaWxhYmxlJyk7XG5jb25zdCBFX0FMUkVBRFlfTE9DS0VEID0gbmV3IEVycm9yKCdtdXRleCBhbHJlYWR5IGxvY2tlZCcpO1xuY29uc3QgRV9DQU5DRUxFRCA9IG5ldyBFcnJvcigncmVxdWVzdCBmb3IgbG9jayBjYW5jZWxlZCcpO1xuXG52YXIgX19hd2FpdGVyJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmNsYXNzIFNlbWFwaG9yZSB7XG4gICAgY29uc3RydWN0b3IoX3ZhbHVlLCBfY2FuY2VsRXJyb3IgPSBFX0NBTkNFTEVEKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gX3ZhbHVlO1xuICAgICAgICB0aGlzLl9jYW5jZWxFcnJvciA9IF9jYW5jZWxFcnJvcjtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzID0gW107XG4gICAgfVxuICAgIGFjcXVpcmUod2VpZ2h0ID0gMSwgcHJpb3JpdHkgPSAwKSB7XG4gICAgICAgIGlmICh3ZWlnaHQgPD0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3ZWlnaHQgJHt3ZWlnaHR9OiBtdXN0IGJlIHBvc2l0aXZlYCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXNrID0geyByZXNvbHZlLCByZWplY3QsIHdlaWdodCwgcHJpb3JpdHkgfTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBmaW5kSW5kZXhGcm9tRW5kKHRoaXMuX3F1ZXVlLCAob3RoZXIpID0+IHByaW9yaXR5IDw9IG90aGVyLnByaW9yaXR5KTtcbiAgICAgICAgICAgIGlmIChpID09PSAtMSAmJiB3ZWlnaHQgPD0gdGhpcy5fdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBOZWVkcyBpbW1lZGlhdGUgZGlzcGF0Y2gsIHNraXAgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hJdGVtKHRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVldWUuc3BsaWNlKGkgKyAxLCAwLCB0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJ1bkV4Y2x1c2l2ZShjYWxsYmFja18xKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIkMih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChjYWxsYmFjaywgd2VpZ2h0ID0gMSwgcHJpb3JpdHkgPSAwKSB7XG4gICAgICAgICAgICBjb25zdCBbdmFsdWUsIHJlbGVhc2VdID0geWllbGQgdGhpcy5hY3F1aXJlKHdlaWdodCwgcHJpb3JpdHkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgY2FsbGJhY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2FpdEZvclVubG9jayh3ZWlnaHQgPSAxLCBwcmlvcml0eSA9IDApIHtcbiAgICAgICAgaWYgKHdlaWdodCA8PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHdlaWdodCAke3dlaWdodH06IG11c3QgYmUgcG9zaXRpdmVgKTtcbiAgICAgICAgaWYgKHRoaXMuX2NvdWxkTG9ja0ltbWVkaWF0ZWx5KHdlaWdodCwgcHJpb3JpdHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdID0gW107XG4gICAgICAgICAgICAgICAgaW5zZXJ0U29ydGVkKHRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXSwgeyByZXNvbHZlLCBwcmlvcml0eSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPD0gMDtcbiAgICB9XG4gICAgZ2V0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hRdWV1ZSgpO1xuICAgIH1cbiAgICByZWxlYXNlKHdlaWdodCA9IDEpIHtcbiAgICAgICAgaWYgKHdlaWdodCA8PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHdlaWdodCAke3dlaWdodH06IG11c3QgYmUgcG9zaXRpdmVgKTtcbiAgICAgICAgdGhpcy5fdmFsdWUgKz0gd2VpZ2h0O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaFF1ZXVlKCk7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5fcXVldWUuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LnJlamVjdCh0aGlzLl9jYW5jZWxFcnJvcikpO1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIH1cbiAgICBfZGlzcGF0Y2hRdWV1ZSgpIHtcbiAgICAgICAgdGhpcy5fZHJhaW5VbmxvY2tXYWl0ZXJzKCk7XG4gICAgICAgIHdoaWxlICh0aGlzLl9xdWV1ZS5sZW5ndGggPiAwICYmIHRoaXMuX3F1ZXVlWzBdLndlaWdodCA8PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hJdGVtKHRoaXMuX3F1ZXVlLnNoaWZ0KCkpO1xuICAgICAgICAgICAgdGhpcy5fZHJhaW5VbmxvY2tXYWl0ZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2Rpc3BhdGNoSXRlbShpdGVtKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICAgICAgdGhpcy5fdmFsdWUgLT0gaXRlbS53ZWlnaHQ7XG4gICAgICAgIGl0ZW0ucmVzb2x2ZShbcHJldmlvdXNWYWx1ZSwgdGhpcy5fbmV3UmVsZWFzZXIoaXRlbS53ZWlnaHQpXSk7XG4gICAgfVxuICAgIF9uZXdSZWxlYXNlcih3ZWlnaHQpIHtcbiAgICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbGxlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHdlaWdodCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIF9kcmFpblVubG9ja1dhaXRlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IHdlaWdodCA9IHRoaXMuX3ZhbHVlOyB3ZWlnaHQgPiAwOyB3ZWlnaHQtLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRlcnMgPSB0aGlzLl93ZWlnaHRlZFdhaXRlcnNbd2VpZ2h0IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKCF3YWl0ZXJzKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB3YWl0ZXJzLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyLnJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2VpZ2h0ZWRXYWl0ZXJzW3dlaWdodCAtIDFdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBxdWV1ZWRQcmlvcml0eSA9IHRoaXMuX3F1ZXVlWzBdLnByaW9yaXR5O1xuICAgICAgICAgICAgZm9yIChsZXQgd2VpZ2h0ID0gdGhpcy5fdmFsdWU7IHdlaWdodCA+IDA7IHdlaWdodC0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2FpdGVycyA9IHRoaXMuX3dlaWdodGVkV2FpdGVyc1t3ZWlnaHQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdhaXRlcnMpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB3YWl0ZXJzLmZpbmRJbmRleCgod2FpdGVyKSA9PiB3YWl0ZXIucHJpb3JpdHkgPD0gcXVldWVkUHJpb3JpdHkpO1xuICAgICAgICAgICAgICAgIChpID09PSAtMSA/IHdhaXRlcnMgOiB3YWl0ZXJzLnNwbGljZSgwLCBpKSlcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKHdhaXRlciA9PiB3YWl0ZXIucmVzb2x2ZSgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2NvdWxkTG9ja0ltbWVkaWF0ZWx5KHdlaWdodCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDAgfHwgdGhpcy5fcXVldWVbMF0ucHJpb3JpdHkgPCBwcmlvcml0eSkgJiZcbiAgICAgICAgICAgIHdlaWdodCA8PSB0aGlzLl92YWx1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnRTb3J0ZWQoYSwgdikge1xuICAgIGNvbnN0IGkgPSBmaW5kSW5kZXhGcm9tRW5kKGEsIChvdGhlcikgPT4gdi5wcmlvcml0eSA8PSBvdGhlci5wcmlvcml0eSk7XG4gICAgYS5zcGxpY2UoaSArIDEsIDAsIHYpO1xufVxuZnVuY3Rpb24gZmluZEluZGV4RnJvbUVuZChhLCBwcmVkaWNhdGUpIHtcbiAgICBmb3IgKGxldCBpID0gYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAocHJlZGljYXRlKGFbaV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbnZhciBfX2F3YWl0ZXIkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuY2xhc3MgTXV0ZXgge1xuICAgIGNvbnN0cnVjdG9yKGNhbmNlbEVycm9yKSB7XG4gICAgICAgIHRoaXMuX3NlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoMSwgY2FuY2VsRXJyb3IpO1xuICAgIH1cbiAgICBhY3F1aXJlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyJDEodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAocHJpb3JpdHkgPSAwKSB7XG4gICAgICAgICAgICBjb25zdCBbLCByZWxlYXNlcl0gPSB5aWVsZCB0aGlzLl9zZW1hcGhvcmUuYWNxdWlyZSgxLCBwcmlvcml0eSk7XG4gICAgICAgICAgICByZXR1cm4gcmVsZWFzZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBydW5FeGNsdXNpdmUoY2FsbGJhY2ssIHByaW9yaXR5ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLnJ1bkV4Y2x1c2l2ZSgoKSA9PiBjYWxsYmFjaygpLCAxLCBwcmlvcml0eSk7XG4gICAgfVxuICAgIGlzTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VtYXBob3JlLmlzTG9ja2VkKCk7XG4gICAgfVxuICAgIHdhaXRGb3JVbmxvY2socHJpb3JpdHkgPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZW1hcGhvcmUud2FpdEZvclVubG9jaygxLCBwcmlvcml0eSk7XG4gICAgfVxuICAgIHJlbGVhc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZW1hcGhvcmUuaXNMb2NrZWQoKSlcbiAgICAgICAgICAgIHRoaXMuX3NlbWFwaG9yZS5yZWxlYXNlKCk7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbWFwaG9yZS5jYW5jZWwoKTtcbiAgICB9XG59XG5cbnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmZ1bmN0aW9uIHdpdGhUaW1lb3V0KHN5bmMsIHRpbWVvdXQsIHRpbWVvdXRFcnJvciA9IEVfVElNRU9VVCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjcXVpcmU6ICh3ZWlnaHRPclByaW9yaXR5LCBwcmlvcml0eSkgPT4ge1xuICAgICAgICAgICAgbGV0IHdlaWdodDtcbiAgICAgICAgICAgIGlmIChpc1NlbWFwaG9yZShzeW5jKSkge1xuICAgICAgICAgICAgICAgIHdlaWdodCA9IHdlaWdodE9yUHJpb3JpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSB3ZWlnaHRPclByaW9yaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmIHdlaWdodCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHdlaWdodCAke3dlaWdodH06IG11c3QgYmUgcG9zaXRpdmVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlzVGltZW91dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpc1RpbWVvdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QodGltZW91dEVycm9yKTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aWNrZXQgPSB5aWVsZCAoaXNTZW1hcGhvcmUoc3luYylcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc3luYy5hY3F1aXJlKHdlaWdodCwgcHJpb3JpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHN5bmMuYWNxdWlyZShwcmlvcml0eSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxlYXNlID0gQXJyYXkuaXNBcnJheSh0aWNrZXQpID8gdGlja2V0WzFdIDogdGlja2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRpY2tldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBydW5FeGNsdXNpdmUoY2FsbGJhY2ssIHdlaWdodCwgcHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGVhc2UgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlja2V0ID0geWllbGQgdGhpcy5hY3F1aXJlKHdlaWdodCwgcHJpb3JpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aWNrZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gdGlja2V0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGNhbGxiYWNrKHRpY2tldFswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gdGlja2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVsZWFzZSh3ZWlnaHQpIHtcbiAgICAgICAgICAgIHN5bmMucmVsZWFzZSh3ZWlnaHQpO1xuICAgICAgICB9LFxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3luYy5jYW5jZWwoKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2FpdEZvclVubG9jazogKHdlaWdodE9yUHJpb3JpdHksIHByaW9yaXR5KSA9PiB7XG4gICAgICAgICAgICBsZXQgd2VpZ2h0O1xuICAgICAgICAgICAgaWYgKGlzU2VtYXBob3JlKHN5bmMpKSB7XG4gICAgICAgICAgICAgICAgd2VpZ2h0ID0gd2VpZ2h0T3JQcmlvcml0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcmlvcml0eSA9IHdlaWdodE9yUHJpb3JpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2VpZ2h0ICE9PSB1bmRlZmluZWQgJiYgd2VpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgd2VpZ2h0ICR7d2VpZ2h0fTogbXVzdCBiZSBwb3NpdGl2ZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdCh0aW1lb3V0RXJyb3IpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICAoaXNTZW1hcGhvcmUoc3luYylcbiAgICAgICAgICAgICAgICAgICAgPyBzeW5jLndhaXRGb3JVbmxvY2sod2VpZ2h0LCBwcmlvcml0eSlcbiAgICAgICAgICAgICAgICAgICAgOiBzeW5jLndhaXRGb3JVbmxvY2socHJpb3JpdHkpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBpc0xvY2tlZDogKCkgPT4gc3luYy5pc0xvY2tlZCgpLFxuICAgICAgICBnZXRWYWx1ZTogKCkgPT4gc3luYy5nZXRWYWx1ZSgpLFxuICAgICAgICBzZXRWYWx1ZTogKHZhbHVlKSA9PiBzeW5jLnNldFZhbHVlKHZhbHVlKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNTZW1hcGhvcmUoc3luYykge1xuICAgIHJldHVybiBzeW5jLmdldFZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGlzbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZnVuY3Rpb24gdHJ5QWNxdWlyZShzeW5jLCBhbHJlYWR5QWNxdWlyZWRFcnJvciA9IEVfQUxSRUFEWV9MT0NLRUQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiB3aXRoVGltZW91dChzeW5jLCAwLCBhbHJlYWR5QWNxdWlyZWRFcnJvcik7XG59XG5cbmV4cG9ydCB7IEVfQUxSRUFEWV9MT0NLRUQsIEVfQ0FOQ0VMRUQsIEVfVElNRU9VVCwgTXV0ZXgsIFNlbWFwaG9yZSwgdHJ5QWNxdWlyZSwgd2l0aFRpbWVvdXQgfTtcbiIsICJpbXBvcnQgeyBhcGkgfSBmcm9tICcuL2Jyb3dzZXItcG9seWZpbGwnO1xuaW1wb3J0IHsgZW5jcnlwdCwgZGVjcnlwdCwgaGFzaFBhc3N3b3JkLCB2ZXJpZnlQYXNzd29yZCB9IGZyb20gJy4vY3J5cHRvJztcbmltcG9ydCB7IGxvb2tzTGlrZVNlZWRQaHJhc2UsIGlzVmFsaWRTZWVkUGhyYXNlIH0gZnJvbSAnLi9zZWVkcGhyYXNlJztcblxuY29uc3QgREJfVkVSU0lPTiA9IDY7XG5jb25zdCBzdG9yYWdlID0gYXBpLnN0b3JhZ2UubG9jYWw7XG5leHBvcnQgY29uc3QgUkVDT01NRU5ERURfUkVMQVlTID0gW1xuICAgIG5ldyBVUkwoJ3dzczovL3JlbGF5LmRhbXVzLmlvJyksXG4gICAgbmV3IFVSTCgnd3NzOi8vcmVsYXkucHJpbWFsLm5ldCcpLFxuICAgIG5ldyBVUkwoJ3dzczovL3JlbGF5LnNub3J0LnNvY2lhbCcpLFxuICAgIG5ldyBVUkwoJ3dzczovL3JlbGF5LmdldGFsYnkuY29tL3YxJyksXG4gICAgbmV3IFVSTCgnd3NzOi8vbm9zLmxvbCcpLFxuXTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IGNvbnN0IEtJTkRTID0gW1xuICAgIFswLCAnTWV0YWRhdGEnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMDEubWQnXSxcbiAgICBbMSwgJ1RleHQnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMDEubWQnXSxcbiAgICBbMiwgJ1JlY29tbWVuZCBSZWxheScsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8wMS5tZCddLFxuICAgIFszLCAnQ29udGFjdHMnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMDIubWQnXSxcbiAgICBbNCwgJ0VuY3J5cHRlZCBEaXJlY3QgTWVzc2FnZXMnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMDQubWQnXSxcbiAgICBbNSwgJ0V2ZW50IERlbGV0aW9uJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzA5Lm1kJ10sXG4gICAgWzYsICdSZXBvc3QnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMTgubWQnXSxcbiAgICBbNywgJ1JlYWN0aW9uJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzI1Lm1kJ10sXG4gICAgWzgsICdCYWRnZSBBd2FyZCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci81OC5tZCddLFxuICAgIFsxNiwgJ0dlbmVyaWMgUmVwb3N0JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzE4Lm1kJ10sXG4gICAgWzQwLCAnQ2hhbm5lbCBDcmVhdGlvbicsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8yOC5tZCddLFxuICAgIFs0MSwgJ0NoYW5uZWwgTWV0YWRhdGEnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMjgubWQnXSxcbiAgICBbNDIsICdDaGFubmVsIE1lc3NhZ2UnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMjgubWQnXSxcbiAgICBbNDMsICdDaGFubmVsIEhpZGUgTWVzc2FnZScsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8yOC5tZCddLFxuICAgIFs0NCwgJ0NoYW5uZWwgTXV0ZSBVc2VyJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzI4Lm1kJ10sXG4gICAgWzEwNjMsICdGaWxlIE1ldGFkYXRhJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzk0Lm1kJ10sXG4gICAgWzEzMTEsICdMaXZlIENoYXQgTWVzc2FnZScsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci81My5tZCddLFxuICAgIFsxOTg0LCAnUmVwb3J0aW5nJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzU2Lm1kJ10sXG4gICAgWzE5ODUsICdMYWJlbCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8zMi5tZCddLFxuICAgIFs0NTUwLCAnQ29tbXVuaXR5IFBvc3QgQXBwcm92YWwnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNzIubWQnXSxcbiAgICBbNzAwMCwgJ0pvYiBGZWVkYmFjaycsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci85MC5tZCddLFxuICAgIFs5MDQxLCAnWmFwIEdvYWwnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNzUubWQnXSxcbiAgICBbOTczNCwgJ1phcCBSZXF1ZXN0JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzU3Lm1kJ10sXG4gICAgWzk3MzUsICdaYXAnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNTcubWQnXSxcbiAgICBbMTAwMDAsICdNdXRlIExpc3QnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNTEubWQnXSxcbiAgICBbMTAwMDEsICdQaW4gTGlzdCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci81MS5tZCddLFxuICAgIFsxMDAwMiwgJ1JlbGF5IExpc3QgTWV0YWRhdGEnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNjUubWQnXSxcbiAgICBbMTMxOTQsICdXYWxsZXQgSW5mbycsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci80Ny5tZCddLFxuICAgIFsyMjI0MiwgJ0NsaWVudCBBdXRoZW50aWNhdGlvbicsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci80Mi5tZCddLFxuICAgIFsyMzE5NCwgJ1dhbGxldCBSZXF1ZXN0JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzQ3Lm1kJ10sXG4gICAgWzIzMTk1LCAnV2FsbGV0IFJlc3BvbnNlJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzQ3Lm1kJ10sXG4gICAgWzI0MTMzLCAnTm9zdHIgQ29ubmVjdCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci80Ni5tZCddLFxuICAgIFsyNzIzNSwgJ0hUVFAgQXV0aCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci85OC5tZCddLFxuICAgIFszMDAwMCwgJ0NhdGVnb3JpemVkIFBlb3BsZSBMaXN0JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzUxLm1kJ10sXG4gICAgWzMwMDAxLCAnQ2F0ZWdvcml6ZWQgQm9va21hcmsgTGlzdCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci81MS5tZCddLFxuICAgIFszMDAwOCwgJ1Byb2ZpbGUgQmFkZ2VzJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzU4Lm1kJ10sXG4gICAgWzMwMDA5LCAnQmFkZ2UgRGVmaW5pdGlvbicsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci81OC5tZCddLFxuICAgIFszMDAxNywgJ0NyZWF0ZSBvciB1cGRhdGUgYSBzdGFsbCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8xNS5tZCddLFxuICAgIFszMDAxOCwgJ0NyZWF0ZSBvciB1cGRhdGUgYSBwcm9kdWN0JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzE1Lm1kJ10sXG4gICAgWzMwMDIzLCAnTG9uZy1Gb3JtIENvbnRlbnQnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvMjMubWQnXSxcbiAgICBbMzAwMjQsICdEcmFmdCBMb25nLWZvcm0gQ29udGVudCcsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8yMy5tZCddLFxuICAgIFszMDA3OCwgJ0FwcGxpY2F0aW9uLXNwZWNpZmljIERhdGEnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNzgubWQnXSxcbiAgICBbMzAzMTEsICdMaXZlIEV2ZW50JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzUzLm1kJ10sXG4gICAgWzMwMzE1LCAnVXNlciBTdGF0dXNlcycsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci8zOC5tZCddLFxuICAgIFszMDQwMiwgJ0NsYXNzaWZpZWQgTGlzdGluZycsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci85OS5tZCddLFxuICAgIFszMDQwMywgJ0RyYWZ0IENsYXNzaWZpZWQgTGlzdGluZycsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci85OS5tZCddLFxuICAgIFszMTkyMiwgJ0RhdGUtQmFzZWQgQ2FsZW5kYXIgRXZlbnQnLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNTIubWQnXSxcbiAgICBbMzE5MjMsICdUaW1lLUJhc2VkIENhbGVuZGFyIEV2ZW50JywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzUyLm1kJ10sXG4gICAgWzMxOTI0LCAnQ2FsZW5kYXInLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvNTIubWQnXSxcbiAgICBbMzE5MjUsICdDYWxlbmRhciBFdmVudCBSU1ZQJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9ub3N0ci1wcm90b2NvbC9uaXBzL2Jsb2IvbWFzdGVyLzUyLm1kJ10sXG4gICAgWzMxOTg5LCAnSGFuZGxlciByZWNvbW1lbmRhdGlvbicsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci84OS5tZCddLFxuICAgIFszMTk5MCwgJ0hhbmRsZXIgaW5mb3JtYXRpb24nLCAnaHR0cHM6Ly9naXRodWIuY29tL25vc3RyLXByb3RvY29sL25pcHMvYmxvYi9tYXN0ZXIvODkubWQnXSxcbiAgICBbMzQ1NTAsICdDb21tdW5pdHkgRGVmaW5pdGlvbicsICdodHRwczovL2dpdGh1Yi5jb20vbm9zdHItcHJvdG9jb2wvbmlwcy9ibG9iL21hc3Rlci83Mi5tZCddLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgYXdhaXQgZ2V0T3JTZXREZWZhdWx0KCdwcm9maWxlSW5kZXgnLCAwKTtcbiAgICBhd2FpdCBnZXRPclNldERlZmF1bHQoJ3Byb2ZpbGVzJywgW2F3YWl0IGdlbmVyYXRlUHJvZmlsZSgpXSk7XG4gICAgbGV0IHZlcnNpb24gPSAoYXdhaXQgc3RvcmFnZS5nZXQoeyB2ZXJzaW9uOiAwIH0pKS52ZXJzaW9uO1xuICAgIGNvbnNvbGUubG9nKCdEQiB2ZXJzaW9uOiAnLCB2ZXJzaW9uKTtcbiAgICB3aGlsZSAodmVyc2lvbiA8IERCX1ZFUlNJT04pIHtcbiAgICAgICAgdmVyc2lvbiA9IGF3YWl0IG1pZ3JhdGUodmVyc2lvbiwgREJfVkVSU0lPTik7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgdmVyc2lvbiB9KTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGUodmVyc2lvbiwgZ29hbCkge1xuICAgIGlmICh2ZXJzaW9uID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdNaWdyYXRpbmcgdG8gdmVyc2lvbiAxLicpO1xuICAgICAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXRQcm9maWxlcygpO1xuICAgICAgICBwcm9maWxlcy5mb3JFYWNoKHByb2ZpbGUgPT4gKHByb2ZpbGUuaG9zdHMgPSB7fSkpO1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldCh7IHByb2ZpbGVzIH0pO1xuICAgICAgICByZXR1cm4gdmVyc2lvbiArIDE7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gPT09IDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ21pZ3JhdGluZyB0byB2ZXJzaW9uIDIuJyk7XG4gICAgICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uICsgMTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiA9PT0gMikge1xuICAgICAgICBjb25zb2xlLmxvZygnTWlncmF0aW5nIHRvIHZlcnNpb24gMy4nKTtcbiAgICAgICAgbGV0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICAgICAgcHJvZmlsZXMuZm9yRWFjaChwcm9maWxlID0+IChwcm9maWxlLnJlbGF5UmVtaW5kZXIgPSB0cnVlKSk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uICsgMTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiA9PT0gMykge1xuICAgICAgICBjb25zb2xlLmxvZygnTWlncmF0aW5nIHRvIHZlcnNpb24gNCAoZW5jcnlwdGlvbiBzdXBwb3J0KS4nKTtcbiAgICAgICAgLy8gTm8gZGF0YSB0cmFuc2Zvcm1hdGlvbiBuZWVkZWQgXHUyMDE0IGV4aXN0aW5nIHBsYWludGV4dCBrZXlzIHN0YXkgYXMtaXMuXG4gICAgICAgIC8vIEVuY3J5cHRpb24gb25seSBhY3RpdmF0ZXMgd2hlbiB0aGUgdXNlciBzZXRzIGEgbWFzdGVyIHBhc3N3b3JkLlxuICAgICAgICAvLyBXZSBqdXN0IGVuc3VyZSB0aGUgaXNFbmNyeXB0ZWQgZmxhZyBleGlzdHMgYW5kIGRlZmF1bHRzIHRvIGZhbHNlLlxuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgaXNFbmNyeXB0ZWQ6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoIWRhdGEuaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgaXNFbmNyeXB0ZWQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJzaW9uICsgMTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiA9PT0gNCkge1xuICAgICAgICBjb25zb2xlLmxvZygnTWlncmF0aW5nIHRvIHZlcnNpb24gNSAoTklQLTQ2IGJ1bmtlciBzdXBwb3J0KS4nKTtcbiAgICAgICAgbGV0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICAgICAgcHJvZmlsZXMuZm9yRWFjaChwcm9maWxlID0+IHtcbiAgICAgICAgICAgIGlmICghcHJvZmlsZS50eXBlKSBwcm9maWxlLnR5cGUgPSAnbG9jYWwnO1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUuYnVua2VyVXJsID09PSB1bmRlZmluZWQpIHByb2ZpbGUuYnVua2VyVXJsID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9maWxlLnJlbW90ZVB1YmtleSA9PT0gdW5kZWZpbmVkKSBwcm9maWxlLnJlbW90ZVB1YmtleSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldCh7IHByb2ZpbGVzIH0pO1xuICAgICAgICByZXR1cm4gdmVyc2lvbiArIDE7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gPT09IDUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ01pZ3JhdGluZyB0byB2ZXJzaW9uIDYgKHBsYXRmb3JtIHN5bmMgc3VwcG9ydCkuJyk7XG4gICAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXRQcm9maWxlcygpO1xuICAgICAgICBwcm9maWxlcy5mb3JFYWNoKHByb2ZpbGUgPT4ge1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUudXBkYXRlZEF0ID09PSB1bmRlZmluZWQpIHByb2ZpbGUudXBkYXRlZEF0ID0gbm93O1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlcywgcGxhdGZvcm1TeW5jRW5hYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb24gKyAxO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2ZpbGVzKCkge1xuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgcHJvZmlsZXM6IFtdIH0pO1xuICAgIHJldHVybiBwcm9maWxlcy5wcm9maWxlcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2ZpbGUoaW5kZXgpIHtcbiAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXRQcm9maWxlcygpO1xuICAgIHJldHVybiBwcm9maWxlc1tpbmRleF07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9maWxlTmFtZXMoKSB7XG4gICAgbGV0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICByZXR1cm4gcHJvZmlsZXMubWFwKHAgPT4gcC5uYW1lKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByb2ZpbGVJbmRleCgpIHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgcHJvZmlsZUluZGV4OiAwIH0pO1xuICAgIHJldHVybiBpbmRleC5wcm9maWxlSW5kZXg7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQcm9maWxlSW5kZXgocHJvZmlsZUluZGV4KSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlSW5kZXggfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVQcm9maWxlKGluZGV4KSB7XG4gICAgbGV0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICBsZXQgcHJvZmlsZUluZGV4ID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgcHJvZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAocHJvZmlsZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgYXdhaXQgY2xlYXJEYXRhKCk7IC8vIElmIHdlIGhhdmUgZGVsZXRlZCBhbGwgb2YgdGhlIHByb2ZpbGVzLCBsZXQncyBqdXN0IHN0YXJ0IGZyZXNoIHdpdGggYWxsIG5ldyBkYXRhXG4gICAgICAgIGF3YWl0IGluaXRpYWxpemUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgaW5kZXggZGVsZXRlZCB3YXMgdGhlIGFjdGl2ZSBwcm9maWxlLCBjaGFuZ2UgdGhlIGFjdGl2ZSBwcm9maWxlIHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICBsZXQgbmV3SW5kZXggPVxuICAgICAgICAgICAgcHJvZmlsZUluZGV4ID09PSBpbmRleCA/IE1hdGgubWF4KGluZGV4IC0gMSwgMCkgOiBwcm9maWxlSW5kZXg7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMsIHByb2ZpbGVJbmRleDogbmV3SW5kZXggfSk7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJEYXRhKCkge1xuICAgIGxldCBpZ25vcmVJbnN0YWxsSG9vayA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgaWdub3JlSW5zdGFsbEhvb2s6IGZhbHNlIH0pO1xuICAgIGF3YWl0IHN0b3JhZ2UuY2xlYXIoKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldChpZ25vcmVJbnN0YWxsSG9vayk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJpdmF0ZUtleSgpIHtcbiAgICByZXR1cm4gYXdhaXQgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBraW5kOiAnZ2VuZXJhdGVQcml2YXRlS2V5JyB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJvZmlsZShuYW1lID0gJ0RlZmF1bHQgTm9zdHIgUHJvZmlsZScsIHR5cGUgPSAnbG9jYWwnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcHJpdktleTogdHlwZSA9PT0gJ2xvY2FsJyA/IGF3YWl0IGdlbmVyYXRlUHJpdmF0ZUtleSgpIDogJycsXG4gICAgICAgIGhvc3RzOiB7fSxcbiAgICAgICAgcmVsYXlzOiBSRUNPTU1FTkRFRF9SRUxBWVMubWFwKHIgPT4gKHsgdXJsOiByLmhyZWYsIHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH0pKSxcbiAgICAgICAgcmVsYXlSZW1pbmRlcjogZmFsc2UsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGJ1bmtlclVybDogbnVsbCxcbiAgICAgICAgcmVtb3RlUHVia2V5OiBudWxsLFxuICAgICAgICB1cGRhdGVkQXQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLFxuICAgIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9yU2V0RGVmYXVsdChrZXksIGRlZikge1xuICAgIGxldCB2YWwgPSAoYXdhaXQgc3RvcmFnZS5nZXQoa2V5KSlba2V5XTtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldCh7IFtrZXldOiBkZWYgfSk7XG4gICAgICAgIHJldHVybiBkZWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVQcm9maWxlTmFtZShpbmRleCwgcHJvZmlsZU5hbWUpIHtcbiAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXRQcm9maWxlcygpO1xuICAgIHByb2ZpbGVzW2luZGV4XS5uYW1lID0gcHJvZmlsZU5hbWU7XG4gICAgcHJvZmlsZXNbaW5kZXhdLnVwZGF0ZWRBdCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlUHJpdmF0ZUtleShpbmRleCwgcHJpdmF0ZUtleSkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaS5ydW50aW1lLnNlbmRNZXNzYWdlKHtcbiAgICAgICAga2luZDogJ3NhdmVQcml2YXRlS2V5JyxcbiAgICAgICAgcGF5bG9hZDogW2luZGV4LCBwcml2YXRlS2V5XSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcyB8fCAhcmVzLnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcz8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBzYXZlIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXdQcm9maWxlKCkge1xuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgY29uc3QgbmV3UHJvZmlsZSA9IGF3YWl0IGdlbmVyYXRlUHJvZmlsZSgnTmV3IFByb2ZpbGUnKTtcbiAgICBwcm9maWxlcy5wdXNoKG5ld1Byb2ZpbGUpO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG4gICAgcmV0dXJuIHByb2ZpbGVzLmxlbmd0aCAtIDE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXdCdW5rZXJQcm9maWxlKG5hbWUgPSAnTmV3IEJ1bmtlcicsIGJ1bmtlclVybCA9IG51bGwpIHtcbiAgICBsZXQgcHJvZmlsZXMgPSBhd2FpdCBnZXRQcm9maWxlcygpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVByb2ZpbGUobmFtZSwgJ2J1bmtlcicpO1xuICAgIHByb2ZpbGUuYnVua2VyVXJsID0gYnVua2VyVXJsO1xuICAgIHByb2ZpbGVzLnB1c2gocHJvZmlsZSk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlcyB9KTtcbiAgICByZXR1cm4gcHJvZmlsZXMubGVuZ3RoIC0gMTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlbGF5cyhwcm9maWxlSW5kZXgpIHtcbiAgICBsZXQgcHJvZmlsZSA9IGF3YWl0IGdldFByb2ZpbGUocHJvZmlsZUluZGV4KTtcbiAgICByZXR1cm4gcHJvZmlsZS5yZWxheXMgfHwgW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlUmVsYXlzKHByb2ZpbGVJbmRleCwgcmVsYXlzKSB7XG4gICAgLy8gSGF2aW5nIGFuIEFscGluZSBwcm94eSBvYmplY3QgYXMgYSBzdWItb2JqZWN0IGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgaW4gc3RvcmFnZSxcbiAgICAvLyBzbyB3ZSBhcmUgcHJlLXNlcmlhbGl6aW5nIGhlcmUgYmVmb3JlIGFzc2lnbmluZyBpdCB0byB0aGUgcHJvZmlsZSwgc28gdGhlIHByb3h5XG4gICAgLy8gb2JqIGRvZXNuJ3QgYnVnIG91dC5cbiAgICBsZXQgZml4ZWRSZWxheXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlbGF5cykpO1xuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgbGV0IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlSW5kZXhdO1xuICAgIHByb2ZpbGUucmVsYXlzID0gZml4ZWRSZWxheXM7XG4gICAgcHJvZmlsZS51cGRhdGVkQXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldCh7IHByb2ZpbGVzIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0KGl0ZW0pIHtcbiAgICByZXR1cm4gKGF3YWl0IHN0b3JhZ2UuZ2V0KGl0ZW0pKVtpdGVtXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBlcm1pc3Npb25zKGluZGV4ID0gbnVsbCkge1xuICAgIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGluZGV4ID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgfVxuICAgIGxldCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShpbmRleCk7XG4gICAgbGV0IGhvc3RzID0gYXdhaXQgcHJvZmlsZS5ob3N0cztcbiAgICByZXR1cm4gaG9zdHM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQZXJtaXNzaW9uKGhvc3QsIGFjdGlvbikge1xuICAgIGxldCBpbmRleCA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIGxldCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShpbmRleCk7XG4gICAgcmV0dXJuIHByb2ZpbGU/Lmhvc3RzPy5baG9zdF0/LlthY3Rpb25dIHx8ICdhc2snO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0UGVybWlzc2lvbihob3N0LCBhY3Rpb24sIHBlcm0sIGluZGV4ID0gbnVsbCkge1xuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgICBpbmRleCA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIH1cbiAgICBsZXQgcHJvZmlsZSA9IHByb2ZpbGVzW2luZGV4XTtcbiAgICBsZXQgbmV3UGVybXMgPSBwcm9maWxlLmhvc3RzW2hvc3RdIHx8IHt9O1xuICAgIG5ld1Blcm1zID0geyAuLi5uZXdQZXJtcywgW2FjdGlvbl06IHBlcm0gfTtcbiAgICBwcm9maWxlLmhvc3RzW2hvc3RdID0gbmV3UGVybXM7XG4gICAgcHJvZmlsZS51cGRhdGVkQXQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBwcm9maWxlc1tpbmRleF0gPSBwcm9maWxlO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodW1hblBlcm1pc3Npb24ocCkge1xuICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgZXZlbnQgc2lnbmluZyBpbmNsdWRlcyBhIGtpbmQgbnVtYmVyXG4gICAgaWYgKHAuc3RhcnRzV2l0aCgnc2lnbkV2ZW50OicpKSB7XG4gICAgICAgIGxldCBbZSwgbl0gPSBwLnNwbGl0KCc6Jyk7XG4gICAgICAgIG4gPSBwYXJzZUludChuKTtcbiAgICAgICAgbGV0IG5uYW1lID0gS0lORFMuZmluZChrID0+IGtbMF0gPT09IG4pPy5bMV0gfHwgYFVua25vd24gKEtpbmQgJHtufSlgO1xuICAgICAgICByZXR1cm4gYFNpZ24gZXZlbnQ6ICR7bm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ2V0UHViS2V5JzpcbiAgICAgICAgICAgIHJldHVybiAnUmVhZCBwdWJsaWMga2V5JztcbiAgICAgICAgY2FzZSAnc2lnbkV2ZW50JzpcbiAgICAgICAgICAgIHJldHVybiAnU2lnbiBldmVudCc7XG4gICAgICAgIGNhc2UgJ2dldFJlbGF5cyc6XG4gICAgICAgICAgICByZXR1cm4gJ1JlYWQgcmVsYXkgbGlzdCc7XG4gICAgICAgIGNhc2UgJ25pcDA0LmVuY3J5cHQnOlxuICAgICAgICAgICAgcmV0dXJuICdFbmNyeXB0IHByaXZhdGUgbWVzc2FnZSAoTklQLTA0KSc7XG4gICAgICAgIGNhc2UgJ25pcDA0LmRlY3J5cHQnOlxuICAgICAgICAgICAgcmV0dXJuICdEZWNyeXB0IHByaXZhdGUgbWVzc2FnZSAoTklQLTA0KSc7XG4gICAgICAgIGNhc2UgJ25pcDQ0LmVuY3J5cHQnOlxuICAgICAgICAgICAgcmV0dXJuICdFbmNyeXB0IHByaXZhdGUgbWVzc2FnZSAoTklQLTQ0KSc7XG4gICAgICAgIGNhc2UgJ25pcDQ0LmRlY3J5cHQnOlxuICAgICAgICAgICAgcmV0dXJuICdEZWNyeXB0IHByaXZhdGUgbWVzc2FnZSAoTklQLTQ0KSc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlS2V5KGtleSkge1xuICAgIGNvbnN0IGhleE1hdGNoID0gL15bXFxkYS1mXXs2NH0kL2kudGVzdChrZXkpO1xuICAgIGNvbnN0IGIzMk1hdGNoID0gL15uc2VjMVtxcHpyeTl4OGdmMnR2ZHcwczNqbjU0a2hjZTZtdWE3bF17NTh9JC8udGVzdChrZXkpO1xuXG4gICAgcmV0dXJuIGhleE1hdGNoIHx8IGIzMk1hdGNoIHx8IGlzTmNyeXB0c2VjKGtleSkgfHwgaXNWYWxpZFNlZWRQaHJhc2Uoa2V5KTtcbn1cblxuZXhwb3J0IHsgbG9va3NMaWtlU2VlZFBocmFzZSB9O1xuZXhwb3J0IGNvbnN0IGlzU2VlZFBocmFzZSA9IGlzVmFsaWRTZWVkUGhyYXNlO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOY3J5cHRzZWMoa2V5KSB7XG4gICAgcmV0dXJuIC9ebmNyeXB0c2VjMVtxcHpyeTl4OGdmMnR2ZHcwczNqbjU0a2hjZTZtdWE3bF0rJC8udGVzdChrZXkpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmVhdHVyZShuYW1lKSB7XG4gICAgbGV0IGZuYW1lID0gYGZlYXR1cmU6JHtuYW1lfWA7XG4gICAgbGV0IGYgPSBhd2FpdCBhcGkuc3RvcmFnZS5sb2NhbC5nZXQoeyBbZm5hbWVdOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gZltmbmFtZV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxheVJlbWluZGVyKCkge1xuICAgIGxldCBpbmRleCA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIGxldCBwcm9maWxlID0gYXdhaXQgZ2V0UHJvZmlsZShpbmRleCk7XG4gICAgcmV0dXJuIHByb2ZpbGUucmVsYXlSZW1pbmRlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVJlbGF5UmVtaW5kZXIoKSB7XG4gICAgbGV0IGluZGV4ID0gYXdhaXQgZ2V0UHJvZmlsZUluZGV4KCk7XG4gICAgbGV0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICBwcm9maWxlc1tpbmRleF0ucmVsYXlSZW1pbmRlciA9IGZhbHNlO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgcHJvZmlsZXMgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROcHViKCkge1xuICAgIGxldCBpbmRleCA9IGF3YWl0IGdldFByb2ZpbGVJbmRleCgpO1xuICAgIHJldHVybiBhd2FpdCBhcGkucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICAgIGtpbmQ6ICdnZXROcHViJyxcbiAgICAgICAgcGF5bG9hZDogaW5kZXgsXG4gICAgfSk7XG59XG5cbi8vIC0tLSBNYXN0ZXIgcGFzc3dvcmQgZW5jcnlwdGlvbiBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIG1hc3RlciBwYXNzd29yZCBlbmNyeXB0aW9uIGlzIGFjdGl2ZS5cbiAqXG4gKiBEZWZlbnNpdmU6IGNoZWNrcyBtdWx0aXBsZSBpbmRpY2F0b3JzLCBub3QganVzdCB0aGUgYm9vbGVhbiBmbGFnLlxuICogSWYgcGFzc3dvcmRIYXNoIG9yIGVuY3J5cHRlZCBrZXkgYmxvYnMgZXhpc3QgYnV0IHRoZSBpc0VuY3J5cHRlZCBmbGFnXG4gKiBpcyBmYWxzZSAoaW5jb25zaXN0ZW50IHN0YXRlIGZyb20gc2VydmljZSB3b3JrZXIgY3Jhc2gsIHJhY2UgY29uZGl0aW9uLFxuICogZXRjLiksIHNlbGYtaGVhbHMgYnkgc2V0dGluZyB0aGUgZmxhZyBiYWNrIHRvIHRydWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VuY3J5cHRlZCgpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgc3RvcmFnZS5nZXQoeyBpc0VuY3J5cHRlZDogZmFsc2UsIHBhc3N3b3JkSGFzaDogbnVsbCwgcHJvZmlsZXM6IFtdIH0pO1xuICAgIGlmIChkYXRhLmlzRW5jcnlwdGVkKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIEZhbGxiYWNrIDE6IHBhc3N3b3JkSGFzaCBleGlzdHMgYnV0IGZsYWcgaXMgc3RhbGVcbiAgICBpZiAoZGF0YS5wYXNzd29yZEhhc2gpIHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBpc0VuY3J5cHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgMjogZW5jcnlwdGVkIGJsb2JzIGV4aXN0IGluIHByb2ZpbGVzIGJ1dCBmbGFnICsgaGFzaCBhcmUgbWlzc2luZ1xuICAgIGZvciAoY29uc3QgcHJvZmlsZSBvZiBkYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGlmIChpc0VuY3J5cHRlZEJsb2IocHJvZmlsZS5wcml2S2V5KSkge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBpc0VuY3J5cHRlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFN0b3JlIHRoZSBwYXNzd29yZCB2ZXJpZmljYXRpb24gaGFzaCAobmV2ZXIgdGhlIHBhc3N3b3JkIGl0c2VsZikuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQYXNzd29yZEhhc2gocGFzc3dvcmQpIHtcbiAgICBjb25zdCB7IGhhc2gsIHNhbHQgfSA9IGF3YWl0IGhhc2hQYXNzd29yZChwYXNzd29yZCk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoe1xuICAgICAgICBwYXNzd29yZEhhc2g6IGhhc2gsXG4gICAgICAgIHBhc3N3b3JkU2FsdDogc2FsdCxcbiAgICAgICAgaXNFbmNyeXB0ZWQ6IHRydWUsXG4gICAgfSk7XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgcGFzc3dvcmQgYWdhaW5zdCB0aGUgc3RvcmVkIGhhc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja1Bhc3N3b3JkKHBhc3N3b3JkKSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHtcbiAgICAgICAgcGFzc3dvcmRIYXNoOiBudWxsLFxuICAgICAgICBwYXNzd29yZFNhbHQ6IG51bGwsXG4gICAgfSk7XG4gICAgaWYgKCFkYXRhLnBhc3N3b3JkSGFzaCB8fCAhZGF0YS5wYXNzd29yZFNhbHQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmVyaWZ5UGFzc3dvcmQocGFzc3dvcmQsIGRhdGEucGFzc3dvcmRIYXNoLCBkYXRhLnBhc3N3b3JkU2FsdCk7XG59XG5cbi8qKlxuICogUmVtb3ZlIG1hc3RlciBwYXNzd29yZCBwcm90ZWN0aW9uIFx1MjAxNCBjbGVhcnMgaGFzaCBhbmQgZGVjcnlwdHMgYWxsIGtleXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVQYXNzd29yZFByb3RlY3Rpb24ocGFzc3dvcmQpIHtcbiAgICBjb25zdCB2YWxpZCA9IGF3YWl0IGNoZWNrUGFzc3dvcmQocGFzc3dvcmQpO1xuICAgIGlmICghdmFsaWQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXNzd29yZCcpO1xuXG4gICAgbGV0IHByb2ZpbGVzID0gYXdhaXQgZ2V0UHJvZmlsZXMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwcm9maWxlc1tpXS50eXBlID09PSAnYnVua2VyJykgY29udGludWU7XG4gICAgICAgIGlmIChpc0VuY3J5cHRlZEJsb2IocHJvZmlsZXNbaV0ucHJpdktleSkpIHtcbiAgICAgICAgICAgIHByb2ZpbGVzW2ldLnByaXZLZXkgPSBhd2FpdCBkZWNyeXB0KHByb2ZpbGVzW2ldLnByaXZLZXksIHBhc3N3b3JkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBzdG9yYWdlLnNldCh7XG4gICAgICAgIHByb2ZpbGVzLFxuICAgICAgICBpc0VuY3J5cHRlZDogZmFsc2UsXG4gICAgICAgIHBhc3N3b3JkSGFzaDogbnVsbCxcbiAgICAgICAgcGFzc3dvcmRTYWx0OiBudWxsLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEVuY3J5cHQgYWxsIHByb2ZpbGUgcHJpdmF0ZSBrZXlzIHdpdGggYSBtYXN0ZXIgcGFzc3dvcmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0QWxsS2V5cyhwYXNzd29yZCkge1xuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvZmlsZXNbaV0udHlwZSA9PT0gJ2J1bmtlcicpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRW5jcnlwdGVkQmxvYihwcm9maWxlc1tpXS5wcml2S2V5KSkge1xuICAgICAgICAgICAgcHJvZmlsZXNbaV0ucHJpdktleSA9IGF3YWl0IGVuY3J5cHQocHJvZmlsZXNbaV0ucHJpdktleSwgcGFzc3dvcmQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHNldFBhc3N3b3JkSGFzaChwYXNzd29yZCk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBwcm9maWxlcyB9KTtcbn1cblxuLyoqXG4gKiBSZS1lbmNyeXB0IGFsbCBrZXlzIHdpdGggYSBuZXcgcGFzc3dvcmQgKHJlcXVpcmVzIHRoZSBvbGQgcGFzc3dvcmQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hhbmdlUGFzc3dvcmRGb3JLZXlzKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCkge1xuICAgIGxldCBwcm9maWxlcyA9IGF3YWl0IGdldFByb2ZpbGVzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvZmlsZXNbaV0udHlwZSA9PT0gJ2J1bmtlcicpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgaGV4ID0gcHJvZmlsZXNbaV0ucHJpdktleTtcbiAgICAgICAgaWYgKGlzRW5jcnlwdGVkQmxvYihoZXgpKSB7XG4gICAgICAgICAgICBoZXggPSBhd2FpdCBkZWNyeXB0KGhleCwgb2xkUGFzc3dvcmQpO1xuICAgICAgICB9XG4gICAgICAgIHByb2ZpbGVzW2ldLnByaXZLZXkgPSBhd2FpdCBlbmNyeXB0KGhleCwgbmV3UGFzc3dvcmQpO1xuICAgIH1cbiAgICBjb25zdCB7IGhhc2gsIHNhbHQgfSA9IGF3YWl0IGhhc2hQYXNzd29yZChuZXdQYXNzd29yZCk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoe1xuICAgICAgICBwcm9maWxlcyxcbiAgICAgICAgcGFzc3dvcmRIYXNoOiBoYXNoLFxuICAgICAgICBwYXNzd29yZFNhbHQ6IHNhbHQsXG4gICAgICAgIGlzRW5jcnlwdGVkOiB0cnVlLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSBzaW5nbGUgcHJvZmlsZSdzIHByaXZhdGUga2V5LCByZXR1cm5pbmcgdGhlIGhleCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZWNyeXB0ZWRQcml2S2V5KHByb2ZpbGUsIHBhc3N3b3JkKSB7XG4gICAgaWYgKHByb2ZpbGUudHlwZSA9PT0gJ2J1bmtlcicpIHJldHVybiAnJztcbiAgICBpZiAoaXNFbmNyeXB0ZWRCbG9iKHByb2ZpbGUucHJpdktleSkpIHtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHQocHJvZmlsZS5wcml2S2V5LCBwYXNzd29yZCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9maWxlLnByaXZLZXk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIHN0b3JlZCB2YWx1ZSBsb29rcyBsaWtlIGFuIGVuY3J5cHRlZCBibG9iLlxuICogRW5jcnlwdGVkIGJsb2JzIGFyZSBKU09OIHN0cmluZ3MgY29udGFpbmluZyB7c2FsdCwgaXYsIGNpcGhlcnRleHR9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRCbG9iKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuICEhKHBhcnNlZC5zYWx0ICYmIHBhcnNlZC5pdiAmJiBwYXJzZWQuY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBCcm93c2VyIEFQSSBjb21wYXRpYmlsaXR5IGxheWVyIGZvciBDaHJvbWUgLyBTYWZhcmkgLyBGaXJlZm94LlxuICpcbiAqIFNhZmFyaSBhbmQgRmlyZWZveCBleHBvc2UgYGJyb3dzZXIuKmAgKFByb21pc2UtYmFzZWQsIFdlYkV4dGVuc2lvbiBzdGFuZGFyZCkuXG4gKiBDaHJvbWUgZXhwb3NlcyBgY2hyb21lLipgIChjYWxsYmFjay1iYXNlZCBoaXN0b3JpY2FsbHksIGJ1dCBNVjMgc3VwcG9ydHNcbiAqIHByb21pc2VzIG9uIG1vc3QgQVBJcykuIEluIGEgc2VydmljZS13b3JrZXIgY29udGV4dCBgYnJvd3NlcmAgaXMgdW5kZWZpbmVkXG4gKiBvbiBDaHJvbWUsIHNvIHdlIG5vcm1hbGlzZSBldmVyeXRoaW5nIGhlcmUuXG4gKlxuICogVXNhZ2U6ICBpbXBvcnQgeyBhcGkgfSBmcm9tICcuL3V0aWxpdGllcy9icm93c2VyLXBvbHlmaWxsJztcbiAqICAgICAgICAgYXBpLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoLi4uKVxuICpcbiAqIFRoZSBleHBvcnRlZCBgYXBpYCBvYmplY3QgbWlycm9ycyB0aGUgc3Vic2V0IG9mIHRoZSBXZWJFeHRlbnNpb24gQVBJIHRoYXRcbiAqIE5vc3RyS2V5IGFjdHVhbGx5IHVzZXMsIHdpdGggZXZlcnkgbWV0aG9kIHJldHVybmluZyBhIFByb21pc2UuXG4gKi9cblxuLy8gRGV0ZWN0IHdoaWNoIGdsb2JhbCBuYW1lc3BhY2UgaXMgYXZhaWxhYmxlLlxuY29uc3QgX2Jyb3dzZXIgPVxuICAgIHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOlxuICAgIHR5cGVvZiBjaHJvbWUgICE9PSAndW5kZWZpbmVkJyA/IGNocm9tZSAgOlxuICAgIG51bGw7XG5cbmlmICghX2Jyb3dzZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jyb3dzZXItcG9seWZpbGw6IE5vIGV4dGVuc2lvbiBBUEkgbmFtZXNwYWNlIGZvdW5kIChuZWl0aGVyIGJyb3dzZXIgbm9yIGNocm9tZSkuJyk7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIHJ1bm5pbmcgb24gQ2hyb21lIChvciBhbnkgQ2hyb21pdW0tYmFzZWQgYnJvd3NlciB0aGF0IG9ubHlcbiAqIGV4cG9zZXMgdGhlIGBjaHJvbWVgIG5hbWVzcGFjZSkuXG4gKi9cbmNvbnN0IGlzQ2hyb21lID0gdHlwZW9mIGJyb3dzZXIgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjaHJvbWUgIT09ICd1bmRlZmluZWQnO1xuXG4vKipcbiAqIFdyYXAgYSBDaHJvbWUgY2FsbGJhY2stc3R5bGUgbWV0aG9kIHNvIGl0IHJldHVybnMgYSBQcm9taXNlLlxuICogSWYgdGhlIG1ldGhvZCBhbHJlYWR5IHJldHVybnMgYSBwcm9taXNlIChNVjMpIHdlIGp1c3QgcGFzcyB0aHJvdWdoLlxuICovXG5mdW5jdGlvbiBwcm9taXNpZnkoY29udGV4dCwgbWV0aG9kKSB7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIC8vIE1WMyBDaHJvbWUgQVBJcyByZXR1cm4gcHJvbWlzZXMgd2hlbiBubyBjYWxsYmFjayBpcyBzdXBwbGllZC5cbiAgICAgICAgLy8gV2UgdHJ5IHRoZSBwcm9taXNlIHBhdGggZmlyc3Q7IGlmIHRoZSBydW50aW1lIHNpZ25hbHMgYW4gZXJyb3JcbiAgICAgICAgLy8gdmlhIGNocm9tZS5ydW50aW1lLmxhc3RFcnJvciBpbnNpZGUgYSBjYWxsYmFjayB3ZSBjYXRjaCB0aGF0IHRvby5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG1ldGhvZC5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGNhbGxiYWNrIHdyYXBwaW5nXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbWV0aG9kLmFwcGx5KGNvbnRleHQsIFtcbiAgICAgICAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgICAgICAgICguLi5jYkFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9icm93c2VyLnJ1bnRpbWUgJiYgX2Jyb3dzZXIucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoX2Jyb3dzZXIucnVudGltZS5sYXN0RXJyb3IubWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjYkFyZ3MubGVuZ3RoIDw9IDEgPyBjYkFyZ3NbMF0gOiBjYkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1aWxkIHRoZSB1bmlmaWVkIGBhcGlgIG9iamVjdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IGFwaSA9IHt9O1xuXG4vLyAtLS0gcnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmFwaS5ydW50aW1lID0ge1xuICAgIC8qKlxuICAgICAqIHNlbmRNZXNzYWdlIFx1MjAxMyBhbHdheXMgcmV0dXJucyBhIFByb21pc2UuXG4gICAgICovXG4gICAgc2VuZE1lc3NhZ2UoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIucnVudGltZS5zZW5kTWVzc2FnZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnJ1bnRpbWUsIF9icm93c2VyLnJ1bnRpbWUuc2VuZE1lc3NhZ2UpKC4uLmFyZ3MpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBvbk1lc3NhZ2UgXHUyMDEzIHRoaW4gd3JhcHBlciBzbyBjYWxsZXJzIHVzZSBhIGNvbnNpc3RlbnQgcmVmZXJlbmNlLlxuICAgICAqIFRoZSBsaXN0ZW5lciBzaWduYXR1cmUgaXMgKG1lc3NhZ2UsIHNlbmRlciwgc2VuZFJlc3BvbnNlKS5cbiAgICAgKiBPbiBDaHJvbWUgdGhlIGxpc3RlbmVyIGNhbiByZXR1cm4gYHRydWVgIHRvIGtlZXAgdGhlIGNoYW5uZWwgb3BlbixcbiAgICAgKiBvciByZXR1cm4gYSBQcm9taXNlIChNVjMpLiAgU2FmYXJpIC8gRmlyZWZveCBleHBlY3QgYSBQcm9taXNlIHJldHVybi5cbiAgICAgKi9cbiAgICBvbk1lc3NhZ2U6IF9icm93c2VyLnJ1bnRpbWUub25NZXNzYWdlLFxuXG4gICAgLyoqXG4gICAgICogZ2V0VVJMIFx1MjAxMyBzeW5jaHJvbm91cyBvbiBhbGwgYnJvd3NlcnMuXG4gICAgICovXG4gICAgZ2V0VVJMKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF9icm93c2VyLnJ1bnRpbWUuZ2V0VVJMKHBhdGgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBvcGVuT3B0aW9uc1BhZ2VcbiAgICAgKi9cbiAgICBvcGVuT3B0aW9uc1BhZ2UoKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci5ydW50aW1lLm9wZW5PcHRpb25zUGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIucnVudGltZSwgX2Jyb3dzZXIucnVudGltZS5vcGVuT3B0aW9uc1BhZ2UpKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEV4cG9zZSB0aGUgaWQgZm9yIGNvbnZlbmllbmNlLlxuICAgICAqL1xuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIF9icm93c2VyLnJ1bnRpbWUuaWQ7XG4gICAgfSxcbn07XG5cbi8vIC0tLSBzdG9yYWdlLmxvY2FsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuYXBpLnN0b3JhZ2UgPSB7XG4gICAgbG9jYWw6IHtcbiAgICAgICAgZ2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5sb2NhbC5nZXQoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2UubG9jYWwsIF9icm93c2VyLnN0b3JhZ2UubG9jYWwuZ2V0KSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5sb2NhbC5zZXQoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2UubG9jYWwsIF9icm93c2VyLnN0b3JhZ2UubG9jYWwuc2V0KSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xlYXIoLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLmNsZWFyKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLCBfYnJvd3Nlci5zdG9yYWdlLmxvY2FsLmNsZWFyKSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5sb2NhbC5yZW1vdmUoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2UubG9jYWwsIF9icm93c2VyLnN0b3JhZ2UubG9jYWwucmVtb3ZlKSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gLS0tIHN0b3JhZ2Uuc3luYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gTnVsbCB3aGVuIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBzeW5jIChvbGRlciBTYWZhcmksIGV0Yy4pXG4gICAgc3luYzogX2Jyb3dzZXIuc3RvcmFnZT8uc3luYyA/IHtcbiAgICAgICAgZ2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLmdldCguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLCBfYnJvd3Nlci5zdG9yYWdlLnN5bmMuZ2V0KSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLnNldCguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLCBfYnJvd3Nlci5zdG9yYWdlLnN5bmMuc2V0KSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLnJlbW92ZSguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLCBfYnJvd3Nlci5zdG9yYWdlLnN5bmMucmVtb3ZlKSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xlYXIoLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci5zdG9yYWdlLnN5bmMuY2xlYXIoLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnN0b3JhZ2Uuc3luYywgX2Jyb3dzZXIuc3RvcmFnZS5zeW5jLmNsZWFyKSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Qnl0ZXNJblVzZSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoIV9icm93c2VyLnN0b3JhZ2Uuc3luYy5nZXRCeXRlc0luVXNlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCBnZXRCeXRlc0luVXNlIFx1MjAxNCByZXR1cm4gMFxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnN0b3JhZ2Uuc3luYy5nZXRCeXRlc0luVXNlKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci5zdG9yYWdlLnN5bmMsIF9icm93c2VyLnN0b3JhZ2Uuc3luYy5nZXRCeXRlc0luVXNlKSguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICB9IDogbnVsbCxcblxuICAgIC8vIC0tLSBzdG9yYWdlLm9uQ2hhbmdlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIG9uQ2hhbmdlZDogX2Jyb3dzZXIuc3RvcmFnZT8ub25DaGFuZ2VkIHx8IG51bGwsXG59O1xuXG4vLyAtLS0gdGFicyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmFwaS50YWJzID0ge1xuICAgIGNyZWF0ZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci50YWJzLmNyZWF0ZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnRhYnMsIF9icm93c2VyLnRhYnMuY3JlYXRlKSguLi5hcmdzKTtcbiAgICB9LFxuICAgIHF1ZXJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnRhYnMucXVlcnkoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci50YWJzLCBfYnJvd3Nlci50YWJzLnF1ZXJ5KSguLi5hcmdzKTtcbiAgICB9LFxuICAgIHJlbW92ZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci50YWJzLnJlbW92ZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnRhYnMsIF9icm93c2VyLnRhYnMucmVtb3ZlKSguLi5hcmdzKTtcbiAgICB9LFxuICAgIHVwZGF0ZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci50YWJzLnVwZGF0ZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnRhYnMsIF9icm93c2VyLnRhYnMudXBkYXRlKSguLi5hcmdzKTtcbiAgICB9LFxuICAgIGdldCguLi5hcmdzKSB7XG4gICAgICAgIGlmICghaXNDaHJvbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfYnJvd3Nlci50YWJzLmdldCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KF9icm93c2VyLnRhYnMsIF9icm93c2VyLnRhYnMuZ2V0KSguLi5hcmdzKTtcbiAgICB9LFxuICAgIGdldEN1cnJlbnQoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIudGFicy5nZXRDdXJyZW50KC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIudGFicywgX2Jyb3dzZXIudGFicy5nZXRDdXJyZW50KSguLi5hcmdzKTtcbiAgICB9LFxuICAgIHNlbmRNZXNzYWdlKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCFpc0Nocm9tZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9icm93c2VyLnRhYnMuc2VuZE1lc3NhZ2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShfYnJvd3Nlci50YWJzLCBfYnJvd3Nlci50YWJzLnNlbmRNZXNzYWdlKSguLi5hcmdzKTtcbiAgICB9LFxufTtcblxuLy8gLS0tIGFsYXJtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBjaHJvbWUuYWxhcm1zIHN1cnZpdmVzIE1WMyBzZXJ2aWNlLXdvcmtlciBldmljdGlvbjsgc2V0VGltZW91dCBkb2VzIG5vdC5cbmFwaS5hbGFybXMgPSBfYnJvd3Nlci5hbGFybXMgPyB7XG4gICAgY3JlYXRlKC4uLmFyZ3MpIHtcbiAgICAgICAgLy8gYWxhcm1zLmNyZWF0ZSBpcyBzeW5jaHJvbm91cyBvbiBDaHJvbWUsIHJldHVybnMgUHJvbWlzZSBvbiBGaXJlZm94L1NhZmFyaVxuICAgICAgICBjb25zdCByZXN1bHQgPSBfYnJvd3Nlci5hbGFybXMuY3JlYXRlKC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJyA/IHJlc3VsdCA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0sXG4gICAgY2xlYXIoLi4uYXJncykge1xuICAgICAgICBpZiAoIWlzQ2hyb21lKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Jyb3dzZXIuYWxhcm1zLmNsZWFyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNpZnkoX2Jyb3dzZXIuYWxhcm1zLCBfYnJvd3Nlci5hbGFybXMuY2xlYXIpKC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgb25BbGFybTogX2Jyb3dzZXIuYWxhcm1zLm9uQWxhcm0sXG59IDogbnVsbDtcblxuZXhwb3J0IHsgYXBpLCBpc0Nocm9tZSB9O1xuIiwgIi8qKlxuICogRW5jcnlwdGlvbiB1dGlsaXRpZXMgZm9yIE5vc3RyS2V5IG1hc3RlciBwYXNzd29yZCBmZWF0dXJlLlxuICpcbiAqIFVzZXMgV2ViIENyeXB0byBBUEkgKGNyeXB0by5zdWJ0bGUpIGV4Y2x1c2l2ZWx5IFx1MjAxNCBubyBleHRlcm5hbCBsaWJyYXJpZXMuXG4gKiAtIFBCS0RGMiB3aXRoIDYwMCwwMDAgaXRlcmF0aW9ucyAoT1dBU1AgMjAyMyByZWNvbW1lbmRhdGlvbilcbiAqIC0gQUVTLTI1Ni1HQ00gZm9yIGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvblxuICogLSBSYW5kb20gc2FsdCAoMTYgYnl0ZXMpIGFuZCBJViAoMTIgYnl0ZXMpIHBlciBvcGVyYXRpb25cbiAqIC0gQWxsIGJpbmFyeSBkYXRhIGVuY29kZWQgYXMgYmFzZTY0IGZvciBKU09OIHN0b3JhZ2UgY29tcGF0aWJpbGl0eVxuICovXG5cbmNvbnN0IFBCS0RGMl9JVEVSQVRJT05TID0gNjAwXzAwMDtcbmNvbnN0IFNBTFRfQllURVMgPSAxNjtcbmNvbnN0IElWX0JZVEVTID0gMTI7XG5cbi8vIC0tLSBCYXNlNjQgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXIpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgbGV0IGJpbmFyeSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJ5dGVzW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbi8vIC0tLSBLZXkgZGVyaXZhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEZXJpdmUgYW4gQUVTLTI1Ni1HQ00gQ3J5cHRvS2V5IGZyb20gYSBwYXNzd29yZCBhbmQgc2FsdCB1c2luZyBQQktERjIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIC0gVGhlIG1hc3RlciBwYXNzd29yZFxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcnxVaW50OEFycmF5fSBzYWx0IC0gMTYtYnl0ZSBzYWx0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxDcnlwdG9LZXk+fSBBRVMtMjU2LUdDTSBrZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZUtleShwYXNzd29yZCwgc2FsdCkge1xuICAgIGNvbnN0IGVuYyA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IGtleU1hdGVyaWFsID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICdyYXcnLFxuICAgICAgICBlbmMuZW5jb2RlKHBhc3N3b3JkKSxcbiAgICAgICAgJ1BCS0RGMicsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBbJ2Rlcml2ZUtleSddXG4gICAgKTtcblxuICAgIHJldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1BCS0RGMicsXG4gICAgICAgICAgICBzYWx0OiBzYWx0IGluc3RhbmNlb2YgVWludDhBcnJheSA/IHNhbHQgOiBuZXcgVWludDhBcnJheShzYWx0KSxcbiAgICAgICAgICAgIGl0ZXJhdGlvbnM6IFBCS0RGMl9JVEVSQVRJT05TLFxuICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICB9LFxuICAgICAgICBrZXlNYXRlcmlhbCxcbiAgICAgICAgeyBuYW1lOiAnQUVTLUdDTScsIGxlbmd0aDogMjU2IH0sXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddXG4gICAgKTtcbn1cblxuLy8gLS0tIEVuY3J5cHQgd2l0aCBwcmUtZGVyaXZlZCBrZXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEVuY3J5cHQgYSBwbGFpbnRleHQgc3RyaW5nIHVzaW5nIGEgcHJlLWRlcml2ZWQgQ3J5cHRvS2V5IGFuZCBpdHMgc2FsdC5cbiAqXG4gKiBUaGlzIGF2b2lkcyBob2xkaW5nIHRoZSByYXcgcGFzc3dvcmQgaW4gbWVtb3J5IFx1MjAxNCB0aGUgY2FsbGVyIGRlcml2ZXMgdGhlXG4gKiBrZXkgb25jZSAodmlhIGRlcml2ZUtleSkgYW5kIHJldXNlcyBpdCBmb3IgdGhlIHNlc3Npb24uICBUaGUgb3V0cHV0XG4gKiBmb3JtYXQgaXMgaWRlbnRpY2FsIHRvIGVuY3J5cHQoKSwgc28gZGVjcnlwdCgpIGNhbiBzdGlsbCBiZSB1c2VkIHdpdGhcbiAqIHRoZSBvcmlnaW5hbCBwYXNzd29yZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhaW50ZXh0ICAgICAgICAgIC0gVGhlIGRhdGEgdG8gZW5jcnlwdFxuICogQHBhcmFtIHtDcnlwdG9LZXl9IGtleSAgICAgICAgICAgICAtIEFFUy0yNTYtR0NNIGtleSBmcm9tIGRlcml2ZUtleSgpXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHNhbHQgICAgICAgICAgIC0gVGhlIHNhbHQgdGhhdCB3YXMgdXNlZCB0byBkZXJpdmUgYGtleWBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEpTT04gc3RyaW5nOiB7IHNhbHQsIGl2LCBjaXBoZXJ0ZXh0IH0gKGFsbCBiYXNlNjQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0V2l0aEtleShwbGFpbnRleHQsIGtleSwgc2FsdCkge1xuICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShJVl9CWVRFUykpO1xuICAgIGNvbnN0IGVuYyA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdiB9LFxuICAgICAgICBrZXksXG4gICAgICAgIGVuYy5lbmNvZGUocGxhaW50ZXh0KVxuICAgICk7XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBzYWx0OiBhcnJheUJ1ZmZlclRvQmFzZTY0KHNhbHQpLFxuICAgICAgICBpdjogYXJyYXlCdWZmZXJUb0Jhc2U2NChpdiksXG4gICAgICAgIGNpcGhlcnRleHQ6IGFycmF5QnVmZmVyVG9CYXNlNjQoY2lwaGVydGV4dCksXG4gICAgfSk7XG59XG5cbi8vIC0tLSBFbmNyeXB0IC8gRGVjcnlwdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFbmNyeXB0IGEgcGxhaW50ZXh0IHN0cmluZyB3aXRoIGEgcGFzc3dvcmQuXG4gKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHNhbHQgKDE2IGJ5dGVzKSBhbmQgSVYgKDEyIGJ5dGVzKSwgZGVyaXZlcyBhblxuICogQUVTLTI1Ni1HQ00ga2V5IHZpYSBQQktERjIsIGFuZCByZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZ1xuICogYmFzZTY0LWVuY29kZWQgc2FsdCwgaXYsIGFuZCBjaXBoZXJ0ZXh0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFpbnRleHQgLSBUaGUgZGF0YSB0byBlbmNyeXB0IChlLmcuIGhleCBwcml2YXRlIGtleSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCAgLSBUaGUgbWFzdGVyIHBhc3N3b3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBKU09OIHN0cmluZzogeyBzYWx0LCBpdiwgY2lwaGVydGV4dCB9IChhbGwgYmFzZTY0KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChwbGFpbnRleHQsIHBhc3N3b3JkKSB7XG4gICAgY29uc3Qgc2FsdCA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoU0FMVF9CWVRFUykpO1xuICAgIGNvbnN0IGl2ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShJVl9CWVRFUykpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGRlcml2ZUtleShwYXNzd29yZCwgc2FsdCk7XG5cbiAgICBjb25zdCBlbmMgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICB7IG5hbWU6ICdBRVMtR0NNJywgaXYgfSxcbiAgICAgICAga2V5LFxuICAgICAgICBlbmMuZW5jb2RlKHBsYWludGV4dClcbiAgICApO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgc2FsdDogYXJyYXlCdWZmZXJUb0Jhc2U2NChzYWx0KSxcbiAgICAgICAgaXY6IGFycmF5QnVmZmVyVG9CYXNlNjQoaXYpLFxuICAgICAgICBjaXBoZXJ0ZXh0OiBhcnJheUJ1ZmZlclRvQmFzZTY0KGNpcGhlcnRleHQpLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSB0aGF0IHdhcyBlbmNyeXB0ZWQgd2l0aCBgZW5jcnlwdCgpYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jcnlwdGVkRGF0YSAtIEpTT04gc3RyaW5nIGZyb20gZW5jcnlwdCgpXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgICAgICAtIFRoZSBtYXN0ZXIgcGFzc3dvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBvcmlnaW5hbCBwbGFpbnRleHRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFzc3dvcmQgaXMgd3Jvbmcgb3IgZGF0YSBpcyB0YW1wZXJlZCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KGVuY3J5cHRlZERhdGEsIHBhc3N3b3JkKSB7XG4gICAgY29uc3QgeyBzYWx0LCBpdiwgY2lwaGVydGV4dCB9ID0gSlNPTi5wYXJzZShlbmNyeXB0ZWREYXRhKTtcblxuICAgIGNvbnN0IHNhbHRCdWYgPSBuZXcgVWludDhBcnJheShiYXNlNjRUb0FycmF5QnVmZmVyKHNhbHQpKTtcbiAgICBjb25zdCBpdkJ1ZiA9IG5ldyBVaW50OEFycmF5KGJhc2U2NFRvQXJyYXlCdWZmZXIoaXYpKTtcbiAgICBjb25zdCBjdEJ1ZiA9IGJhc2U2NFRvQXJyYXlCdWZmZXIoY2lwaGVydGV4dCk7XG5cbiAgICBjb25zdCBrZXkgPSBhd2FpdCBkZXJpdmVLZXkocGFzc3dvcmQsIHNhbHRCdWYpO1xuXG4gICAgY29uc3QgcGxhaW5CdWYgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogaXZCdWYgfSxcbiAgICAgICAga2V5LFxuICAgICAgICBjdEJ1ZlxuICAgICk7XG5cbiAgICBjb25zdCBkZWMgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICByZXR1cm4gZGVjLmRlY29kZShwbGFpbkJ1Zik7XG59XG5cbi8vIC0tLSBQYXNzd29yZCBoYXNoaW5nIChmb3IgdmVyaWZpY2F0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIYXNoIGEgcGFzc3dvcmQgd2l0aCBQQktERjIgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHByb2R1Y2VzIGEgc2VwYXJhdGUgaGFzaCAobm90IHRoZSBlbmNyeXB0aW9uIGtleSkgdGhhdCBjYW4gYmUgc3RvcmVkXG4gKiB0byB2ZXJpZnkgdGhlIHBhc3N3b3JkIHdpdGhvdXQgbmVlZGluZyB0byBhdHRlbXB0IGRlY3J5cHRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIC0gVGhlIG1hc3RlciBwYXNzd29yZFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBbc2FsdF0gLSBPcHRpb25hbCBzYWx0OyBnZW5lcmF0ZWQgaWYgb21pdHRlZFxuICogQHJldHVybnMge1Byb21pc2U8eyBoYXNoOiBzdHJpbmcsIHNhbHQ6IHN0cmluZyB9Pn0gYmFzZTY0LWVuY29kZWQgaGFzaCBhbmQgc2FsdFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFzaFBhc3N3b3JkKHBhc3N3b3JkLCBzYWx0KSB7XG4gICAgaWYgKCFzYWx0KSB7XG4gICAgICAgIHNhbHQgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KFNBTFRfQllURVMpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzYWx0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzYWx0ID0gbmV3IFVpbnQ4QXJyYXkoYmFzZTY0VG9BcnJheUJ1ZmZlcihzYWx0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3Qga2V5TWF0ZXJpYWwgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgJ3JhdycsXG4gICAgICAgIGVuYy5lbmNvZGUocGFzc3dvcmQpLFxuICAgICAgICAnUEJLREYyJyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFsnZGVyaXZlQml0cyddXG4gICAgKTtcblxuICAgIGNvbnN0IGhhc2hCaXRzID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZXJpdmVCaXRzKFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgICAgIHNhbHQsXG4gICAgICAgICAgICBpdGVyYXRpb25zOiBQQktERjJfSVRFUkFUSU9OUyxcbiAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgfSxcbiAgICAgICAga2V5TWF0ZXJpYWwsXG4gICAgICAgIDI1NlxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBoYXNoOiBhcnJheUJ1ZmZlclRvQmFzZTY0KGhhc2hCaXRzKSxcbiAgICAgICAgc2FsdDogYXJyYXlCdWZmZXJUb0Jhc2U2NChzYWx0KSxcbiAgICB9O1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIHBhc3N3b3JkIGFnYWluc3QgYSBzdG9yZWQgaGFzaC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgICAtIFRoZSBwYXNzd29yZCB0byB2ZXJpZnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yZWRIYXNoIC0gYmFzZTY0LWVuY29kZWQgaGFzaCBmcm9tIGhhc2hQYXNzd29yZCgpXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RvcmVkU2FsdCAtIGJhc2U2NC1lbmNvZGVkIHNhbHQgZnJvbSBoYXNoUGFzc3dvcmQoKVxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFRydWUgaWYgdGhlIHBhc3N3b3JkIG1hdGNoZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkKHBhc3N3b3JkLCBzdG9yZWRIYXNoLCBzdG9yZWRTYWx0KSB7XG4gICAgY29uc3QgeyBoYXNoIH0gPSBhd2FpdCBoYXNoUGFzc3dvcmQocGFzc3dvcmQsIHN0b3JlZFNhbHQpO1xuICAgIHJldHVybiBoYXNoID09PSBzdG9yZWRIYXNoO1xufVxuIiwgImltcG9ydCB7IG9wZW5EQiB9IGZyb20gJ2lkYic7XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5FdmVudHNEYigpIHtcbiAgICByZXR1cm4gYXdhaXQgb3BlbkRCKCdldmVudHMnLCAxLCB7XG4gICAgICAgIHVwZ3JhZGUoZGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdldmVudHMnLCB7XG4gICAgICAgICAgICAgICAga2V5UGF0aDogJ2V2ZW50LmlkJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXZlbnRzLmNyZWF0ZUluZGV4KCdwdWJrZXknLCAnZXZlbnQucHVia2V5Jyk7XG4gICAgICAgICAgICBldmVudHMuY3JlYXRlSW5kZXgoJ2NyZWF0ZWRfYXQnLCAnZXZlbnQuY3JlYXRlZF9hdCcpO1xuICAgICAgICAgICAgZXZlbnRzLmNyZWF0ZUluZGV4KCdraW5kJywgJ2V2ZW50LmtpbmQnKTtcbiAgICAgICAgICAgIGV2ZW50cy5jcmVhdGVJbmRleCgnaG9zdCcsICdtZXRhZGF0YS5ob3N0Jyk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRXZlbnQoZXZlbnQpIHtcbiAgICBsZXQgZGIgPSBhd2FpdCBvcGVuRXZlbnRzRGIoKTtcbiAgICByZXR1cm4gZGIucHV0KCdldmVudHMnLCBldmVudCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb3J0QnlJbmRleChpbmRleCwgcXVlcnksIGFzYywgbWF4KSB7XG4gICAgbGV0IGRiID0gYXdhaXQgb3BlbkV2ZW50c0RiKCk7XG4gICAgbGV0IGV2ZW50cyA9IFtdO1xuICAgIGxldCBjdXJzb3IgPSBhd2FpdCBkYlxuICAgICAgICAudHJhbnNhY3Rpb24oJ2V2ZW50cycpXG4gICAgICAgIC5zdG9yZS5pbmRleChpbmRleClcbiAgICAgICAgLm9wZW5DdXJzb3IocXVlcnksIGFzYyA/ICduZXh0JyA6ICdwcmV2Jyk7XG4gICAgd2hpbGUgKGN1cnNvcikge1xuICAgICAgICBldmVudHMucHVzaChjdXJzb3IudmFsdWUpO1xuICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+PSBtYXgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvciA9IGF3YWl0IGN1cnNvci5jb250aW51ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SG9zdHMoKSB7XG4gICAgbGV0IGRiID0gYXdhaXQgb3BlbkV2ZW50c0RiKCk7XG4gICAgbGV0IGhvc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCBjdXJzb3IgPSBhd2FpdCBkYi50cmFuc2FjdGlvbignZXZlbnRzJykuc3RvcmUub3BlbkN1cnNvcigpO1xuICAgIHdoaWxlIChjdXJzb3IpIHtcbiAgICAgICAgaG9zdHMuYWRkKGN1cnNvci52YWx1ZS5tZXRhZGF0YS5ob3N0KTtcbiAgICAgICAgY3Vyc29yID0gYXdhaXQgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaG9zdHNdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBbGxDb250ZW50cygpIHtcbiAgICBsZXQgZGIgPSBhd2FpdCBvcGVuRXZlbnRzRGIoKTtcbiAgICBsZXQgZXZlbnRzID0gW107XG4gICAgbGV0IGN1cnNvciA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCdldmVudHMnKS5zdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgd2hpbGUgKGN1cnNvcikge1xuICAgICAgICBldmVudHMucHVzaChjdXJzb3IudmFsdWUuZXZlbnQpO1xuICAgICAgICBjdXJzb3IgPSBhd2FpdCBjdXJzb3IuY29udGludWUoKTtcbiAgICB9XG4gICAgZXZlbnRzID0gZXZlbnRzLm1hcChlID0+IEpTT04uc3RyaW5naWZ5KGUpKTtcbiAgICBldmVudHMgPSBldmVudHMuam9pbignXFxuJyk7XG4gICAgY29uc29sZS5sb2coZXZlbnRzKTtcblxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbZXZlbnRzXSwgJ2V2ZW50cy5qc29ubCcsIHtcbiAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsXG4gICAgfSk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2V2ZW50c10sIHsgdHlwZTogJ3BsYWluL3RleHQnIH0pO1xuXG4gICAgcmV0dXJuIGJsb2I7XG59XG4iLCAiY29uc3QgaW5zdGFuY2VPZkFueSA9IChvYmplY3QsIGNvbnN0cnVjdG9ycykgPT4gY29uc3RydWN0b3JzLnNvbWUoKGMpID0+IG9iamVjdCBpbnN0YW5jZW9mIGMpO1xuXG5sZXQgaWRiUHJveHlhYmxlVHlwZXM7XG5sZXQgY3Vyc29yQWR2YW5jZU1ldGhvZHM7XG4vLyBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gcHJldmVudCBpdCB0aHJvd2luZyB1cCBpbiBub2RlIGVudmlyb25tZW50cy5cbmZ1bmN0aW9uIGdldElkYlByb3h5YWJsZVR5cGVzKCkge1xuICAgIHJldHVybiAoaWRiUHJveHlhYmxlVHlwZXMgfHxcbiAgICAgICAgKGlkYlByb3h5YWJsZVR5cGVzID0gW1xuICAgICAgICAgICAgSURCRGF0YWJhc2UsXG4gICAgICAgICAgICBJREJPYmplY3RTdG9yZSxcbiAgICAgICAgICAgIElEQkluZGV4LFxuICAgICAgICAgICAgSURCQ3Vyc29yLFxuICAgICAgICAgICAgSURCVHJhbnNhY3Rpb24sXG4gICAgICAgIF0pKTtcbn1cbi8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBwcmV2ZW50IGl0IHRocm93aW5nIHVwIGluIG5vZGUgZW52aXJvbm1lbnRzLlxuZnVuY3Rpb24gZ2V0Q3Vyc29yQWR2YW5jZU1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIChjdXJzb3JBZHZhbmNlTWV0aG9kcyB8fFxuICAgICAgICAoY3Vyc29yQWR2YW5jZU1ldGhvZHMgPSBbXG4gICAgICAgICAgICBJREJDdXJzb3IucHJvdG90eXBlLmFkdmFuY2UsXG4gICAgICAgICAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlLFxuICAgICAgICAgICAgSURCQ3Vyc29yLnByb3RvdHlwZS5jb250aW51ZVByaW1hcnlLZXksXG4gICAgICAgIF0pKTtcbn1cbmNvbnN0IHRyYW5zYWN0aW9uRG9uZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB0cmFuc2Zvcm1DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdW5saXN0ZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCBzdWNjZXNzKTtcbiAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHdyYXAocmVxdWVzdC5yZXN1bHQpKTtcbiAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdzdWNjZXNzJywgc3VjY2Vzcyk7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvcik7XG4gICAgfSk7XG4gICAgLy8gVGhpcyBtYXBwaW5nIGV4aXN0cyBpbiByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgYnV0IGRvZXNuJ3QgZXhpc3QgaW4gdHJhbnNmb3JtQ2FjaGUuIFRoaXNcbiAgICAvLyBpcyBiZWNhdXNlIHdlIGNyZWF0ZSBtYW55IHByb21pc2VzIGZyb20gYSBzaW5nbGUgSURCUmVxdWVzdC5cbiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb21pc2UsIHJlcXVlc3QpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHR4KSB7XG4gICAgLy8gRWFybHkgYmFpbCBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBkb25lIHByb21pc2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgaWYgKHRyYW5zYWN0aW9uRG9uZU1hcC5oYXModHgpKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgZG9uZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdW5saXN0ZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb21wbGV0ZScsIGNvbXBsZXRlKTtcbiAgICAgICAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QodHguZXJyb3IgfHwgbmV3IERPTUV4Y2VwdGlvbignQWJvcnRFcnJvcicsICdBYm9ydEVycm9yJykpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHguYWRkRXZlbnRMaXN0ZW5lcignY29tcGxldGUnLCBjb21wbGV0ZSk7XG4gICAgICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB0eC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGVycm9yKTtcbiAgICB9KTtcbiAgICAvLyBDYWNoZSBpdCBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuICAgIHRyYW5zYWN0aW9uRG9uZU1hcC5zZXQodHgsIGRvbmUpO1xufVxubGV0IGlkYlByb3h5VHJhcHMgPSB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElEQlRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0cmFuc2FjdGlvbi5kb25lLlxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdkb25lJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25Eb25lTWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgLy8gTWFrZSB0eC5zdG9yZSByZXR1cm4gdGhlIG9ubHkgc3RvcmUgaW4gdGhlIHRyYW5zYWN0aW9uLCBvciB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG1hbnkuXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ3N0b3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlci5vYmplY3RTdG9yZU5hbWVzWzFdXG4gICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIDogcmVjZWl2ZXIub2JqZWN0U3RvcmUocmVjZWl2ZXIub2JqZWN0U3RvcmVOYW1lc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSB0cmFuc2Zvcm0gd2hhdGV2ZXIgd2UgZ2V0IGJhY2suXG4gICAgICAgIHJldHVybiB3cmFwKHRhcmdldFtwcm9wXSk7XG4gICAgfSxcbiAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbiAmJlxuICAgICAgICAgICAgKHByb3AgPT09ICdkb25lJyB8fCBwcm9wID09PSAnc3RvcmUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3AgaW4gdGFyZ2V0O1xuICAgIH0sXG59O1xuZnVuY3Rpb24gcmVwbGFjZVRyYXBzKGNhbGxiYWNrKSB7XG4gICAgaWRiUHJveHlUcmFwcyA9IGNhbGxiYWNrKGlkYlByb3h5VHJhcHMpO1xufVxuZnVuY3Rpb24gd3JhcEZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAvLyBEdWUgdG8gZXhwZWN0ZWQgb2JqZWN0IGVxdWFsaXR5ICh3aGljaCBpcyBlbmZvcmNlZCBieSB0aGUgY2FjaGluZyBpbiBgd3JhcGApLCB3ZVxuICAgIC8vIG9ubHkgY3JlYXRlIG9uZSBuZXcgZnVuYyBwZXIgZnVuYy5cbiAgICAvLyBDdXJzb3IgbWV0aG9kcyBhcmUgc3BlY2lhbCwgYXMgdGhlIGJlaGF2aW91ciBpcyBhIGxpdHRsZSBtb3JlIGRpZmZlcmVudCB0byBzdGFuZGFyZCBJREIuIEluXG4gICAgLy8gSURCLCB5b3UgYWR2YW5jZSB0aGUgY3Vyc29yIGFuZCB3YWl0IGZvciBhIG5ldyAnc3VjY2Vzcycgb24gdGhlIElEQlJlcXVlc3QgdGhhdCBnYXZlIHlvdSB0aGVcbiAgICAvLyBjdXJzb3IuIEl0J3Mga2luZGEgbGlrZSBhIHByb21pc2UgdGhhdCBjYW4gcmVzb2x2ZSB3aXRoIG1hbnkgdmFsdWVzLiBUaGF0IGRvZXNuJ3QgbWFrZSBzZW5zZVxuICAgIC8vIHdpdGggcmVhbCBwcm9taXNlcywgc28gZWFjaCBhZHZhbmNlIG1ldGhvZHMgcmV0dXJucyBhIG5ldyBwcm9taXNlIGZvciB0aGUgY3Vyc29yIG9iamVjdCwgb3JcbiAgICAvLyB1bmRlZmluZWQgaWYgdGhlIGVuZCBvZiB0aGUgY3Vyc29yIGhhcyBiZWVuIHJlYWNoZWQuXG4gICAgaWYgKGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkuaW5jbHVkZXMoZnVuYykpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAvLyBDYWxsaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRoIHRoZSBwcm94eSBhcyAndGhpcycgY2F1c2VzIElMTEVHQUwgSU5WT0NBVElPTiwgc28gd2UgdXNlXG4gICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgICAgICAgZnVuYy5hcHBseSh1bndyYXAodGhpcyksIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXAodGhpcy5yZXF1ZXN0KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIC8vIENhbGxpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3h5IGFzICd0aGlzJyBjYXVzZXMgSUxMRUdBTCBJTlZPQ0FUSU9OLCBzbyB3ZSB1c2VcbiAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHdyYXAoZnVuYy5hcHBseSh1bndyYXAodGhpcyksIGFyZ3MpKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB3cmFwRnVuY3Rpb24odmFsdWUpO1xuICAgIC8vIFRoaXMgZG9lc24ndCByZXR1cm4sIGl0IGp1c3QgY3JlYXRlcyBhICdkb25lJyBwcm9taXNlIGZvciB0aGUgdHJhbnNhY3Rpb24sXG4gICAgLy8gd2hpY2ggaXMgbGF0ZXIgcmV0dXJuZWQgZm9yIHRyYW5zYWN0aW9uLmRvbmUgKHNlZSBpZGJPYmplY3RIYW5kbGVyKS5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbilcbiAgICAgICAgY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHZhbHVlKTtcbiAgICBpZiAoaW5zdGFuY2VPZkFueSh2YWx1ZSwgZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSkpXG4gICAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIGlkYlByb3h5VHJhcHMpO1xuICAgIC8vIFJldHVybiB0aGUgc2FtZSB2YWx1ZSBiYWNrIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB0cmFuc2Zvcm0gaXQuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gd3JhcCh2YWx1ZSkge1xuICAgIC8vIFdlIHNvbWV0aW1lcyBnZW5lcmF0ZSBtdWx0aXBsZSBwcm9taXNlcyBmcm9tIGEgc2luZ2xlIElEQlJlcXVlc3QgKGVnIHdoZW4gY3Vyc29yaW5nKSwgYmVjYXVzZVxuICAgIC8vIElEQiBpcyB3ZWlyZCBhbmQgYSBzaW5nbGUgSURCUmVxdWVzdCBjYW4geWllbGQgbWFueSByZXNwb25zZXMsIHNvIHRoZXNlIGNhbid0IGJlIGNhY2hlZC5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJREJSZXF1ZXN0KVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdCh2YWx1ZSk7XG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSB0cmFuc2Zvcm1lZCB0aGlzIHZhbHVlIGJlZm9yZSwgcmV1c2UgdGhlIHRyYW5zZm9ybWVkIHZhbHVlLlxuICAgIC8vIFRoaXMgaXMgZmFzdGVyLCBidXQgaXQgYWxzbyBwcm92aWRlcyBvYmplY3QgZXF1YWxpdHkuXG4gICAgaWYgKHRyYW5zZm9ybUNhY2hlLmhhcyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZSk7XG4gICAgLy8gTm90IGFsbCB0eXBlcyBhcmUgdHJhbnNmb3JtZWQuXG4gICAgLy8gVGhlc2UgbWF5IGJlIHByaW1pdGl2ZSB0eXBlcywgc28gdGhleSBjYW4ndCBiZSBXZWFrTWFwIGtleXMuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0cmFuc2Zvcm1DYWNoZS5zZXQodmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChuZXdWYWx1ZSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3VmFsdWU7XG59XG5jb25zdCB1bndyYXAgPSAodmFsdWUpID0+IHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUpO1xuXG4vKipcbiAqIE9wZW4gYSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkYXRhYmFzZS5cbiAqIEBwYXJhbSB2ZXJzaW9uIFNjaGVtYSB2ZXJzaW9uLlxuICogQHBhcmFtIGNhbGxiYWNrcyBBZGRpdGlvbmFsIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3BlbkRCKG5hbWUsIHZlcnNpb24sIHsgYmxvY2tlZCwgdXBncmFkZSwgYmxvY2tpbmcsIHRlcm1pbmF0ZWQgfSA9IHt9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKG5hbWUsIHZlcnNpb24pO1xuICAgIGNvbnN0IG9wZW5Qcm9taXNlID0gd3JhcChyZXF1ZXN0KTtcbiAgICBpZiAodXBncmFkZSkge1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3VwZ3JhZGVuZWVkZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHVwZ3JhZGUod3JhcChyZXF1ZXN0LnJlc3VsdCksIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIHdyYXAocmVxdWVzdC50cmFuc2FjdGlvbiksIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChibG9ja2VkKSB7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignYmxvY2tlZCcsIChldmVudCkgPT4gYmxvY2tlZChcbiAgICAgICAgLy8gQ2FzdGluZyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0LURPTS1saWItZ2VuZXJhdG9yL3B1bGwvMTQwNVxuICAgICAgICBldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCBldmVudCkpO1xuICAgIH1cbiAgICBvcGVuUHJvbWlzZVxuICAgICAgICAudGhlbigoZGIpID0+IHtcbiAgICAgICAgaWYgKHRlcm1pbmF0ZWQpXG4gICAgICAgICAgICBkYi5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHRlcm1pbmF0ZWQoKSk7XG4gICAgICAgIGlmIChibG9ja2luZykge1xuICAgICAgICAgICAgZGIuYWRkRXZlbnRMaXN0ZW5lcigndmVyc2lvbmNoYW5nZScsIChldmVudCkgPT4gYmxvY2tpbmcoZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgZXZlbnQpKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIHJldHVybiBvcGVuUHJvbWlzZTtcbn1cbi8qKlxuICogRGVsZXRlIGEgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGF0YWJhc2UuXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZURCKG5hbWUsIHsgYmxvY2tlZCB9ID0ge30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKG5hbWUpO1xuICAgIGlmIChibG9ja2VkKSB7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignYmxvY2tlZCcsIChldmVudCkgPT4gYmxvY2tlZChcbiAgICAgICAgLy8gQ2FzdGluZyBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0LURPTS1saWItZ2VuZXJhdG9yL3B1bGwvMTQwNVxuICAgICAgICBldmVudC5vbGRWZXJzaW9uLCBldmVudCkpO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcChyZXF1ZXN0KS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG59XG5cbmNvbnN0IHJlYWRNZXRob2RzID0gWydnZXQnLCAnZ2V0S2V5JywgJ2dldEFsbCcsICdnZXRBbGxLZXlzJywgJ2NvdW50J107XG5jb25zdCB3cml0ZU1ldGhvZHMgPSBbJ3B1dCcsICdhZGQnLCAnZGVsZXRlJywgJ2NsZWFyJ107XG5jb25zdCBjYWNoZWRNZXRob2RzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIElEQkRhdGFiYXNlICYmXG4gICAgICAgICEocHJvcCBpbiB0YXJnZXQpICYmXG4gICAgICAgIHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2FjaGVkTWV0aG9kcy5nZXQocHJvcCkpXG4gICAgICAgIHJldHVybiBjYWNoZWRNZXRob2RzLmdldChwcm9wKTtcbiAgICBjb25zdCB0YXJnZXRGdW5jTmFtZSA9IHByb3AucmVwbGFjZSgvRnJvbUluZGV4JC8sICcnKTtcbiAgICBjb25zdCB1c2VJbmRleCA9IHByb3AgIT09IHRhcmdldEZ1bmNOYW1lO1xuICAgIGNvbnN0IGlzV3JpdGUgPSB3cml0ZU1ldGhvZHMuaW5jbHVkZXModGFyZ2V0RnVuY05hbWUpO1xuICAgIGlmIChcbiAgICAvLyBCYWlsIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBleGlzdCBvbiB0aGUgdGFyZ2V0LiBFZywgZ2V0QWxsIGlzbid0IGluIEVkZ2UuXG4gICAgISh0YXJnZXRGdW5jTmFtZSBpbiAodXNlSW5kZXggPyBJREJJbmRleCA6IElEQk9iamVjdFN0b3JlKS5wcm90b3R5cGUpIHx8XG4gICAgICAgICEoaXNXcml0ZSB8fCByZWFkTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gYXN5bmMgZnVuY3Rpb24gKHN0b3JlTmFtZSwgLi4uYXJncykge1xuICAgICAgICAvLyBpc1dyaXRlID8gJ3JlYWR3cml0ZScgOiB1bmRlZmluZWQgZ3ppcHBzIGJldHRlciwgYnV0IGZhaWxzIGluIEVkZ2UgOihcbiAgICAgICAgY29uc3QgdHggPSB0aGlzLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgaXNXcml0ZSA/ICdyZWFkd3JpdGUnIDogJ3JlYWRvbmx5Jyk7XG4gICAgICAgIGxldCB0YXJnZXQgPSB0eC5zdG9yZTtcbiAgICAgICAgaWYgKHVzZUluZGV4KVxuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LmluZGV4KGFyZ3Muc2hpZnQoKSk7XG4gICAgICAgIC8vIE11c3QgcmVqZWN0IGlmIG9wIHJlamVjdHMuXG4gICAgICAgIC8vIElmIGl0J3MgYSB3cml0ZSBvcGVyYXRpb24sIG11c3QgcmVqZWN0IGlmIHR4LmRvbmUgcmVqZWN0cy5cbiAgICAgICAgLy8gTXVzdCByZWplY3Qgd2l0aCBvcCByZWplY3Rpb24gZmlyc3QuXG4gICAgICAgIC8vIE11c3QgcmVzb2x2ZSB3aXRoIG9wIHZhbHVlLlxuICAgICAgICAvLyBNdXN0IGhhbmRsZSBib3RoIHByb21pc2VzIChubyB1bmhhbmRsZWQgcmVqZWN0aW9ucylcbiAgICAgICAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0YXJnZXRbdGFyZ2V0RnVuY05hbWVdKC4uLmFyZ3MpLFxuICAgICAgICAgICAgaXNXcml0ZSAmJiB0eC5kb25lLFxuICAgICAgICBdKSlbMF07XG4gICAgfTtcbiAgICBjYWNoZWRNZXRob2RzLnNldChwcm9wLCBtZXRob2QpO1xuICAgIHJldHVybiBtZXRob2Q7XG59XG5yZXBsYWNlVHJhcHMoKG9sZFRyYXBzKSA9PiAoe1xuICAgIC4uLm9sZFRyYXBzLFxuICAgIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IGdldE1ldGhvZCh0YXJnZXQsIHByb3ApIHx8IG9sZFRyYXBzLmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSxcbiAgICBoYXM6ICh0YXJnZXQsIHByb3ApID0+ICEhZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuaGFzKHRhcmdldCwgcHJvcCksXG59KSk7XG5cbmNvbnN0IGFkdmFuY2VNZXRob2RQcm9wcyA9IFsnY29udGludWUnLCAnY29udGludWVQcmltYXJ5S2V5JywgJ2FkdmFuY2UnXTtcbmNvbnN0IG1ldGhvZE1hcCA9IHt9O1xuY29uc3QgYWR2YW5jZVJlc3VsdHMgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHkgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgY3Vyc29ySXRlcmF0b3JUcmFwcyA9IHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghYWR2YW5jZU1ldGhvZFByb3BzLmluY2x1ZGVzKHByb3ApKVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgbGV0IGNhY2hlZEZ1bmMgPSBtZXRob2RNYXBbcHJvcF07XG4gICAgICAgIGlmICghY2FjaGVkRnVuYykge1xuICAgICAgICAgICAgY2FjaGVkRnVuYyA9IG1ldGhvZE1hcFtwcm9wXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZVJlc3VsdHMuc2V0KHRoaXMsIGl0dHJQcm94aWVkQ3Vyc29yVG9PcmlnaW5hbFByb3h5LmdldCh0aGlzKVtwcm9wXSguLi5hcmdzKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWRGdW5jO1xuICAgIH0sXG59O1xuYXN5bmMgZnVuY3Rpb24qIGl0ZXJhdGUoLi4uYXJncykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10aGlzLWFzc2lnbm1lbnRcbiAgICBsZXQgY3Vyc29yID0gdGhpcztcbiAgICBpZiAoIShjdXJzb3IgaW5zdGFuY2VvZiBJREJDdXJzb3IpKSB7XG4gICAgICAgIGN1cnNvciA9IGF3YWl0IGN1cnNvci5vcGVuQ3Vyc29yKC4uLmFyZ3MpO1xuICAgIH1cbiAgICBpZiAoIWN1cnNvcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGN1cnNvciA9IGN1cnNvcjtcbiAgICBjb25zdCBwcm94aWVkQ3Vyc29yID0gbmV3IFByb3h5KGN1cnNvciwgY3Vyc29ySXRlcmF0b3JUcmFwcyk7XG4gICAgaXR0clByb3hpZWRDdXJzb3JUb09yaWdpbmFsUHJveHkuc2V0KHByb3hpZWRDdXJzb3IsIGN1cnNvcik7XG4gICAgLy8gTWFwIHRoaXMgZG91YmxlLXByb3h5IGJhY2sgdG8gdGhlIG9yaWdpbmFsLCBzbyBvdGhlciBjdXJzb3IgbWV0aG9kcyB3b3JrLlxuICAgIHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5zZXQocHJveGllZEN1cnNvciwgdW53cmFwKGN1cnNvcikpO1xuICAgIHdoaWxlIChjdXJzb3IpIHtcbiAgICAgICAgeWllbGQgcHJveGllZEN1cnNvcjtcbiAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBhZHZhbmNpbmcgbWV0aG9kcyB3YXMgbm90IGNhbGxlZCwgY2FsbCBjb250aW51ZSgpLlxuICAgICAgICBjdXJzb3IgPSBhd2FpdCAoYWR2YW5jZVJlc3VsdHMuZ2V0KHByb3hpZWRDdXJzb3IpIHx8IGN1cnNvci5jb250aW51ZSgpKTtcbiAgICAgICAgYWR2YW5jZVJlc3VsdHMuZGVsZXRlKHByb3hpZWRDdXJzb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzSXRlcmF0b3JQcm9wKHRhcmdldCwgcHJvcCkge1xuICAgIHJldHVybiAoKHByb3AgPT09IFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmXG4gICAgICAgIGluc3RhbmNlT2ZBbnkodGFyZ2V0LCBbSURCSW5kZXgsIElEQk9iamVjdFN0b3JlLCBJREJDdXJzb3JdKSkgfHxcbiAgICAgICAgKHByb3AgPT09ICdpdGVyYXRlJyAmJiBpbnN0YW5jZU9mQW55KHRhcmdldCwgW0lEQkluZGV4LCBJREJPYmplY3RTdG9yZV0pKSk7XG59XG5yZXBsYWNlVHJhcHMoKG9sZFRyYXBzKSA9PiAoe1xuICAgIC4uLm9sZFRyYXBzLFxuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmIChpc0l0ZXJhdG9yUHJvcCh0YXJnZXQsIHByb3ApKVxuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdGU7XG4gICAgICAgIHJldHVybiBvbGRUcmFwcy5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfSxcbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBpc0l0ZXJhdG9yUHJvcCh0YXJnZXQsIHByb3ApIHx8IG9sZFRyYXBzLmhhcyh0YXJnZXQsIHByb3ApO1xuICAgIH0sXG59KSk7XG5cbmV4cG9ydCB7IGRlbGV0ZURCLCBvcGVuREIsIHVud3JhcCwgd3JhcCB9O1xuIiwgIi8qKlxuICogU3luYyBNYW5hZ2VyIFx1MjAxNCBQbGF0Zm9ybSBzeW5jIHZpYSBzdG9yYWdlLnN5bmMgKENocm9tZSBcdTIxOTIgR29vZ2xlLCBTYWZhcmkgXHUyMTkyIGlDbG91ZClcbiAqXG4gKiBBcmNoaXRlY3R1cmU6XG4gKiAgIFdyaXRlOiBhcHAgXHUyMTkyIHN0b3JhZ2UubG9jYWwgXHUyMTkyIHNjaGVkdWxlU3luY1B1c2goKSBcdTIxOTIgc3RvcmFnZS5zeW5jXG4gKiAgIFJlYWQ6ICBwdWxsRnJvbVN5bmMoKSBvbiBzdGFydHVwIFx1MjE5MiBtZXJnZSBpbnRvIHN0b3JhZ2UubG9jYWxcbiAqICAgTGlzdGVuOiBzdG9yYWdlLm9uQ2hhbmdlZChcInN5bmNcIikgXHUyMTkyIG1lcmdlIHJlbW90ZSBjaGFuZ2VzIGludG8gbG9jYWxcbiAqXG4gKiBzdG9yYWdlLmxvY2FsIHJlbWFpbnMgdGhlIHNvdXJjZSBvZiB0cnV0aC4gc3RvcmFnZS5zeW5jIGlzIGEgYmVzdC1lZmZvcnQgbWlycm9yLlxuICovXG5cbmltcG9ydCB7IGFwaSB9IGZyb20gJy4vYnJvd3Nlci1wb2x5ZmlsbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IFNZTkNfUVVPVEEgPSAxMDJfNDAwOyAgICAgICAvLyAxMDAgS0IgdG90YWxcbmNvbnN0IE1BWF9JVEVNID0gOF8xOTI7ICAgICAgICAgICAvLyA4IEtCIHBlciBpdGVtXG5jb25zdCBNQVhfSVRFTVMgPSA1MTI7XG5jb25zdCBDSFVOS19QUkVGSVggPSAnX2NodW5rOic7XG5jb25zdCBTWU5DX01FVEFfS0VZID0gJ19zeW5jX21ldGEnO1xuY29uc3QgTE9DQUxfRU5BQkxFRF9LRVkgPSAncGxhdGZvcm1TeW5jRW5hYmxlZCc7XG5cbi8vIEtleXMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgc3luY2VkXG5jb25zdCBFWENMVURFRF9LRVlTID0gW1xuICAgICdidW5rZXJTZXNzaW9ucycsXG4gICAgJ2lnbm9yZUluc3RhbGxIb29rJyxcbiAgICAncGFzc3dvcmRIYXNoJyxcbiAgICAncGFzc3dvcmRTYWx0Jyxcbl07XG5cbi8vIFByaW9yaXR5IHRpZXJzIGZvciBidWRnZXQgYWxsb2NhdGlvblxuY29uc3QgUFJJT1JJVFkgPSB7XG4gICAgUDFfUFJPRklMRVM6IDEsXG4gICAgUDJfU0VUVElOR1M6IDIsXG4gICAgUDNfQVBJS0VZUzogMyxcbiAgICBQNF9WQVVMVDogNCxcbn07XG5cbmNvbnN0IHN0b3JhZ2UgPSBhcGkuc3RvcmFnZS5sb2NhbDtcbmxldCBwdXNoVGltZXIgPSBudWxsO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENodW5raW5nIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNwbGl0IGEgSlNPTi1zZXJpYWxpc2VkIHZhbHVlIGludG8gPD04S0IgY2h1bmtzLlxuICogUmV0dXJucyBhbiBhcnJheSBvZiB7IGtleSwgdmFsdWUgfSBwYWlycyByZWFkeSBmb3Igc3RvcmFnZS5zeW5jLnNldCgpLlxuICovXG5mdW5jdGlvbiBjaHVua1ZhbHVlKGtleSwganNvblN0cmluZykge1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvblN0cmluZy5sZW5ndGg7IGkgKz0gTUFYX0lURU0gLSAxMDApIHtcbiAgICAgICAgLy8gUmVzZXJ2ZSB+MTAwIGJ5dGVzIGZvciB0aGUga2V5IG92ZXJoZWFkIGluIHRoZSBzdG9yZWQgaXRlbVxuICAgICAgICBjaHVua3MucHVzaChqc29uU3RyaW5nLnNsaWNlKGksIGkgKyBNQVhfSVRFTSAtIDEwMCkpO1xuICAgIH1cbiAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGaXRzIGluIGEgc2luZ2xlIGl0ZW0gXHUyMDE0IHN0b3JlIGRpcmVjdGx5XG4gICAgICAgIHJldHVybiBbeyBrZXksIHZhbHVlOiBqc29uU3RyaW5nIH1dO1xuICAgIH1cbiAgICAvLyBNdWx0aXBsZSBjaHVua3NcbiAgICBjb25zdCBlbnRyaWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBgJHtDSFVOS19QUkVGSVh9JHtrZXl9OiR7aX1gLCB2YWx1ZTogY2h1bmtzW2ldIH0pO1xuICAgIH1cbiAgICAvLyBTdG9yZSBhIG1ldGFkYXRhIGVudHJ5IHNvIHdlIGtub3cgaG93IG1hbnkgY2h1bmtzIHRoZXJlIGFyZVxuICAgIGVudHJpZXMucHVzaCh7IGtleSwgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHsgX19jaHVua2VkOiB0cnVlLCBjb3VudDogY2h1bmtzLmxlbmd0aCB9KSB9KTtcbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqXG4gKiBSZWFzc2VtYmxlIGNodW5rZWQgZGF0YSBmcm9tIGEgc3luYyBkYXRhIG9iamVjdC5cbiAqIFJldHVybnMgdGhlIHBhcnNlZCBKU09OIHZhbHVlLCBvciBudWxsIG9uIGVycm9yLlxuICovXG5mdW5jdGlvbiByZWFzc2VtYmxlRnJvbVN5bmNEYXRhKGtleSwgc3luY0RhdGEpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBtZXRhID0gdHlwZW9mIHN5bmNEYXRhW2tleV0gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShzeW5jRGF0YVtrZXldKSA6IHN5bmNEYXRhW2tleV07XG4gICAgICAgIGlmICghbWV0YSB8fCAhbWV0YS5fX2NodW5rZWQpIHtcbiAgICAgICAgICAgIC8vIE5vdCBjaHVua2VkIFx1MjAxNCBwYXJzZSBkaXJlY3RseVxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBzeW5jRGF0YVtrZXldID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc3luY0RhdGFba2V5XSkgOiBzeW5jRGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb21iaW5lZCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1ldGEuY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2h1bmtLZXkgPSBgJHtDSFVOS19QUkVGSVh9JHtrZXl9OiR7aX1gO1xuICAgICAgICAgICAgaWYgKHN5bmNEYXRhW2NodW5rS2V5XSA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbWJpbmVkICs9IHN5bmNEYXRhW2NodW5rS2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb21iaW5lZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdWlsZCBzeW5jIHBheWxvYWRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlYWQgYWxsIGxvY2FsIGRhdGEgYW5kIGJ1aWxkIGEgcHJpb3JpdGlzZWQgbGlzdCBvZiBlbnRyaWVzIHRvIHN5bmMuXG4gKiBSZXR1cm5zIHsgZW50cmllczogW3sga2V5LCBqc29uU3RyaW5nLCBwcmlvcml0eSwgc2l6ZSB9XSwgdG90YWxTaXplIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTeW5jUGF5bG9hZCgpIHtcbiAgICBjb25zdCBhbGwgPSBhd2FpdCBzdG9yYWdlLmdldChudWxsKTtcbiAgICBjb25zdCBlbnRyaWVzID0gW107XG5cbiAgICAvLyBQMTogUHJvZmlsZXMgKHN0cmlwIGBob3N0c2AgdG8gc2F2ZSBzcGFjZSkgKyBwcm9maWxlSW5kZXhcbiAgICBpZiAoYWxsLnByb2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGNsZWFuUHJvZmlsZXMgPSBhbGwucHJvZmlsZXMubWFwKHAgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBob3N0cywgLi4ucmVzdCB9ID0gcDtcbiAgICAgICAgICAgIHJldHVybiByZXN0O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGNsZWFuUHJvZmlsZXMpO1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBrZXk6ICdwcm9maWxlcycsIGpzb25TdHJpbmc6IGpzb24sIHByaW9yaXR5OiBQUklPUklUWS5QMV9QUk9GSUxFUywgc2l6ZToganNvbi5sZW5ndGggfSk7XG4gICAgfVxuICAgIGlmIChhbGwucHJvZmlsZUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGFsbC5wcm9maWxlSW5kZXgpO1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBrZXk6ICdwcm9maWxlSW5kZXgnLCBqc29uU3RyaW5nOiBqc29uLCBwcmlvcml0eTogUFJJT1JJVFkuUDFfUFJPRklMRVMsIHNpemU6IGpzb24ubGVuZ3RoIH0pO1xuICAgIH1cbiAgICAvLyBOT1RFOiBgaXNFbmNyeXB0ZWRgIGlzIGludGVudGlvbmFsbHkgTk9UIHN5bmNlZC4gVGhlIHBhc3N3b3JkIHZlcmlmaWVyXG4gICAgLy8gKHBhc3N3b3JkSGFzaC9wYXNzd29yZFNhbHQpIGlzIGV4Y2x1ZGVkIGZyb20gc3luYyBmb3Igc2VjdXJpdHksIHNvIGEgZGV2aWNlXG4gICAgLy8gdGhhdCByZWNlaXZlZCBpc0VuY3J5cHRlZD10cnVlIHdpdGggbm8gaGFzaCB3b3VsZCBiZSBwZXJtYW5lbnRseSBsb2NrZWQgb3V0XG4gICAgLy8gKGNoZWNrUGFzc3dvcmQgYWx3YXlzIGZhaWxzKS4gRW5jcnlwdGlvbiBzdGF0ZSBpcyBzdHJpY3RseSBkZXZpY2UtbG9jYWwuXG5cbiAgICAvLyBQMjogU2V0dGluZ3NcbiAgICBjb25zdCBzZXR0aW5nc0tleXMgPSBbJ2F1dG9Mb2NrTWludXRlcycsICd2ZXJzaW9uJywgJ3Byb3RvY29sX2hhbmRsZXInLCBMT0NBTF9FTkFCTEVEX0tFWV07XG4gICAgZm9yIChjb25zdCBrIG9mIHNldHRpbmdzS2V5cykge1xuICAgICAgICBpZiAoYWxsW2tdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShhbGxba10pO1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiBrLCBqc29uU3RyaW5nOiBqc29uLCBwcmlvcml0eTogUFJJT1JJVFkuUDJfU0VUVElOR1MsIHNpemU6IGpzb24ubGVuZ3RoIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZlYXR1cmUgZmxhZ3NcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoYWxsKSkge1xuICAgICAgICBpZiAoay5zdGFydHNXaXRoKCdmZWF0dXJlOicpKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYWxsW2tdKTtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGtleTogaywganNvblN0cmluZzoganNvbiwgcHJpb3JpdHk6IFBSSU9SSVRZLlAyX1NFVFRJTkdTLCBzaXplOiBqc29uLmxlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFAzOiBBUEkga2V5IHZhdWx0XG4gICAgaWYgKGFsbC5hcGlLZXlWYXVsdCkge1xuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYWxsLmFwaUtleVZhdWx0KTtcbiAgICAgICAgZW50cmllcy5wdXNoKHsga2V5OiAnYXBpS2V5VmF1bHQnLCBqc29uU3RyaW5nOiBqc29uLCBwcmlvcml0eTogUFJJT1JJVFkuUDNfQVBJS0VZUywgc2l6ZToganNvbi5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgLy8gUDQ6IFZhdWx0IGRvY3MgKGluZGl2aWR1YWxseSwgbmV3ZXN0IGZpcnN0KVxuICAgIGlmIChhbGwudmF1bHREb2NzICYmIHR5cGVvZiBhbGwudmF1bHREb2NzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBkb2NzID0gT2JqZWN0LnZhbHVlcyhhbGwudmF1bHREb2NzKS5zb3J0KChhLCBiKSA9PiAoYi51cGRhdGVkQXQgfHwgMCkgLSAoYS51cGRhdGVkQXQgfHwgMCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICAgICAgICBjb25zdCBkb2NLZXkgPSBgdmF1bHREb2M6JHtkb2MucGF0aH1gO1xuICAgICAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGRvYyk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyBrZXk6IGRvY0tleSwganNvblN0cmluZzoganNvbiwgcHJpb3JpdHk6IFBSSU9SSVRZLlA0X1ZBVUxULCBzaXplOiBqc29uLmxlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1c2ggdG8gc3luY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHB1c2hUb1N5bmMoKSB7XG4gICAgaWYgKCFhcGkuc3RvcmFnZS5zeW5jKSByZXR1cm47XG5cbiAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgaXNTeW5jRW5hYmxlZCgpO1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGJ1aWxkU3luY1BheWxvYWQoKTtcblxuICAgICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IChhc2NlbmRpbmcgPSBtb3N0IGltcG9ydGFudCBmaXJzdClcbiAgICAgICAgZW50cmllcy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSk7XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIHN5bmMgcGF5bG9hZCByZXNwZWN0aW5nIGJ1ZGdldFxuICAgICAgICBsZXQgdXNlZEJ5dGVzID0gMDtcbiAgICAgICAgbGV0IHVzZWRJdGVtcyA9IDA7XG4gICAgICAgIGNvbnN0IHN5bmNQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IGFsbFN5bmNLZXlzID0gW107XG4gICAgICAgIGxldCBidWRnZXRFeGhhdXN0ZWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChidWRnZXRFeGhhdXN0ZWQpIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBjaHVua3MgPSBjaHVua1ZhbHVlKGVudHJ5LmtleSwgZW50cnkuanNvblN0cmluZyk7XG4gICAgICAgICAgICBsZXQgZW50cnlTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjaHVua3MpIHtcbiAgICAgICAgICAgICAgICBlbnRyeVNpemUgKz0gYy5rZXkubGVuZ3RoICsgKHR5cGVvZiBjLnZhbHVlID09PSAnc3RyaW5nJyA/IGMudmFsdWUubGVuZ3RoIDogSlNPTi5zdHJpbmdpZnkoYy52YWx1ZSkubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVzZWRCeXRlcyArIGVudHJ5U2l6ZSA+IFNZTkNfUVVPVEEgLSA1MDAgfHwgdXNlZEl0ZW1zICsgY2h1bmtzLmxlbmd0aCA+IE1BWF9JVEVNUyAtIDUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkucHJpb3JpdHkgPD0gUFJJT1JJVFkuUDNfQVBJS0VZUykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDcml0aWNhbCBkYXRhIFx1MjAxNCB0cnkgYW55d2F5LCBsZXQgdGhlIEFQSSB0aHJvdyBpZiB0cnVseSBvdmVyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbU3luY01hbmFnZXJdIEJ1ZGdldCBleGhhdXN0ZWQgYXQgcHJpb3JpdHkgJHtlbnRyeS5wcmlvcml0eX0sIHNraXBwaW5nIHJlbWFpbmluZyBlbnRyaWVzYCk7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZGdldEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNodW5rcykge1xuICAgICAgICAgICAgICAgIHN5bmNQYXlsb2FkW2Mua2V5XSA9IGMudmFsdWU7XG4gICAgICAgICAgICAgICAgYWxsU3luY0tleXMucHVzaChjLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1c2VkQnl0ZXMgKz0gZW50cnlTaXplO1xuICAgICAgICAgICAgdXNlZEl0ZW1zICs9IGNodW5rcy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgc3luYyBtZXRhZGF0YVxuICAgICAgICBjb25zdCBtZXRhID0ge1xuICAgICAgICAgICAgbGFzdFdyaXR0ZW5BdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGtleXM6IGFsbFN5bmNLZXlzLFxuICAgICAgICB9O1xuICAgICAgICBzeW5jUGF5bG9hZFtTWU5DX01FVEFfS0VZXSA9IEpTT04uc3RyaW5naWZ5KG1ldGEpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRvIHN5bmMgc3RvcmFnZVxuICAgICAgICBhd2FpdCBhcGkuc3RvcmFnZS5zeW5jLnNldChzeW5jUGF5bG9hZCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gb3JwaGFuZWQgY2h1bmtzOiByZWFkIGV4aXN0aW5nIHN5bmMga2V5cyBhbmQgcmVtb3ZlIGFueSBub3QgaW4gb3VyIHBheWxvYWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgYXBpLnN0b3JhZ2Uuc3luYy5nZXQobnVsbCk7XG4gICAgICAgICAgICBjb25zdCBvcnBoYW5LZXlzID0gT2JqZWN0LmtleXMoZXhpc3RpbmcpLmZpbHRlcihrID0+XG4gICAgICAgICAgICAgICAgayAhPT0gU1lOQ19NRVRBX0tFWSAmJiAhYWxsU3luY0tleXMuaW5jbHVkZXMoaylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAob3JwaGFuS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnN0b3JhZ2Uuc3luYy5yZW1vdmUob3JwaGFuS2V5cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm9uLWNyaXRpY2FsIGNsZWFudXBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbU3luY01hbmFnZXJdIFB1c2hlZCAke2FsbFN5bmNLZXlzLmxlbmd0aH0gZW50cmllcyAoJHt1c2VkQnl0ZXN9IGJ5dGVzKSB0byBzeW5jIHN0b3JhZ2VgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTeW5jTWFuYWdlcl0gcHVzaFRvU3luYyBlcnJvcjonLCBlKTtcbiAgICAgICAgLy8gTG9jYWwgc3RvcmFnZSBpcyB1bmFmZmVjdGVkIFx1MjAxNCBncmFjZWZ1bCBkZWdyYWRhdGlvblxuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWxsIGZyb20gc3luY1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmVhZCBhbGwgZGF0YSBmcm9tIHN5bmMgc3RvcmFnZSBhbmQgcmV0dXJuIGFzIGEgcGxhaW4gb2JqZWN0IHdpdGhcbiAqIHJlYXNzZW1ibGVkIGNodW5rZWQgdmFsdWVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBwdWxsRnJvbVN5bmMoKSB7XG4gICAgaWYgKCFhcGkuc3RvcmFnZS5zeW5jKSByZXR1cm4gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IGFwaS5zdG9yYWdlLnN5bmMuZ2V0KG51bGwpO1xuICAgICAgICBpZiAoIXJhdyB8fCBPYmplY3Qua2V5cyhyYXcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgbWV0YVN0ciA9IHJhd1tTWU5DX01FVEFfS0VZXTtcbiAgICAgICAgaWYgKCFtZXRhU3RyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbWV0YTtcbiAgICAgICAgdHJ5IHsgbWV0YSA9IEpTT04ucGFyc2UobWV0YVN0cik7IH0gY2F0Y2ggeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICAvLyBDb2xsZWN0IHRoZSBub24tY2h1bmssIG5vbi1tZXRhIGtleXNcbiAgICAgICAgY29uc3QgZGF0YUtleXMgPSBtZXRhLmtleXMuZmlsdGVyKGsgPT4gIWsuc3RhcnRzV2l0aChDSFVOS19QUkVGSVgpICYmIGsgIT09IFNZTkNfTUVUQV9LRVkpO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRhdGFLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlYXNzZW1ibGVGcm9tU3luY0RhdGEoa2V5LCByYXcpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0Ll9zeW5jTWV0YSA9IG1ldGE7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU3luY01hbmFnZXJdIHB1bGxGcm9tU3luYyBlcnJvcjonLCBlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1lcmdlIGxvZ2ljXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBNZXJnZSBzeW5jIGRhdGEgaW50byBsb2NhbCBzdG9yYWdlIHdpdGggY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVyZ2VJbnRvTG9jYWwoc3luY0RhdGEpIHtcbiAgICBpZiAoIXN5bmNEYXRhKSByZXR1cm47XG5cbiAgICBjb25zdCBsb2NhbCA9IGF3YWl0IHN0b3JhZ2UuZ2V0KG51bGwpO1xuICAgIGNvbnN0IHsgdXBkYXRlcywgY2hhbmdlZCB9ID0gY29tcHV0ZU1lcmdlVXBkYXRlcyhsb2NhbCwgc3luY0RhdGEpO1xuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQodXBkYXRlcyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU3luY01hbmFnZXJdIE1lcmdlZCBzeW5jIGRhdGEgaW50byBsb2NhbDonLCBPYmplY3Qua2V5cyh1cGRhdGVzKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFB1cmUgbWVyZ2U6IGdpdmVuIHRoZSBjdXJyZW50IGxvY2FsIHN0YXRlIGFuZCBhbiBpbmNvbWluZyBzeW5jIHBheWxvYWQsXG4gKiBjb21wdXRlIHRoZSBzdG9yYWdlIHVwZGF0ZXMgdG8gYXBwbHkuIE5vIEkvTyBcdTIwMTQgZXhwb3J0ZWQgc28gdGhlIG1lcmdlIHJ1bGVzXG4gKiAoZnJlc2gtaW5zdGFsbCBkZXRlY3Rpb24sIHB1YmtleS1rZXllZCBwcm9maWxlIG1hdGNoaW5nLCBlbmNyeXB0aW9uLXN0YXRlXG4gKiBleGNsdXNpb24pIGNhbiBiZSByZWdyZXNzaW9uLXRlc3RlZCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyB7eyB1cGRhdGVzOiBPYmplY3QsIGNoYW5nZWQ6IGJvb2xlYW4gfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVNZXJnZVVwZGF0ZXMobG9jYWwsIHN5bmNEYXRhKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKCFzeW5jRGF0YSkgcmV0dXJuIHsgdXBkYXRlcywgY2hhbmdlZCB9O1xuXG4gICAgLy8gRGV0ZWN0IGZyZXNoIGluc3RhbGw6IG5vIHByb2ZpbGVzLCBvciBvbmx5IHByb2ZpbGUocykgdGhhdCBjYXJyeSBub1xuICAgIC8vIGlkZW50aXR5IGF0IGFsbCAobm8gcHJpdmF0ZSBrZXksIG5vIGNhY2hlZCBwdWJrZXksIG5vdCBhIGJ1bmtlci9yZW1vdGVcbiAgICAvLyBzaWduZXIpLiBBIGJ1bmtlciBwcm9maWxlIGxlZ2l0aW1hdGVseSBoYXMgcHJpdktleTonJyBidXQgSVMgYSByZWFsXG4gICAgLy8gaWRlbnRpdHkgXHUyMDE0IGl0IG11c3Qgbm90IGJlIHRyZWF0ZWQgYXMgYSBibGFuayBpbnN0YWxsIGFuZCB3aXBlZC5cbiAgICBjb25zdCBoYXNJZGVudGl0eSA9IChwKSA9PlxuICAgICAgICAhIShwLnByaXZLZXkgfHwgcC5wdWJLZXkgfHwgcC50eXBlID09PSAnYnVua2VyJyB8fCBwLmJ1bmtlclVybCB8fCBwLnJlbW90ZVB1YmtleSk7XG4gICAgY29uc3QgaXNGcmVzaCA9ICFsb2NhbC5wcm9maWxlcyB8fFxuICAgICAgICBsb2NhbC5wcm9maWxlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgIWxvY2FsLnByb2ZpbGVzLnNvbWUoaGFzSWRlbnRpdHkpO1xuXG4gICAgLy8gLS0tIFByb2ZpbGVzIChQMSkgLS0tXG4gICAgaWYgKHN5bmNEYXRhLnByb2ZpbGVzKSB7XG4gICAgICAgIGlmIChpc0ZyZXNoKSB7XG4gICAgICAgICAgICAvLyBGcmVzaCBpbnN0YWxsIFx1MjAxNCBhZG9wdCBzeW5jIHByb2ZpbGVzIGVudGlyZWx5XG4gICAgICAgICAgICB1cGRhdGVzLnByb2ZpbGVzID0gc3luY0RhdGEucHJvZmlsZXM7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbC5wcm9maWxlcykge1xuICAgICAgICAgICAgLy8gTWF0Y2ggcHJvZmlsZXMgYnkgcHVia2V5IChzdGFibGUgaWRlbnRpdHkpLCBOT1QgYXJyYXkgaW5kZXggXHUyMDE0XG4gICAgICAgICAgICAvLyByZW9yZGVyaW5nIG9yIGluc2VydGluZyBhIHByb2ZpbGUgb24gb25lIGRldmljZSBtdXN0IG5ldmVyIGNhdXNlXG4gICAgICAgICAgICAvLyBvbmUgaWRlbnRpdHkncyBrZXkgbWF0ZXJpYWwgdG8gb3ZlcndyaXRlIGFuIHVucmVsYXRlZCBwcm9maWxlLlxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gWy4uLmxvY2FsLnByb2ZpbGVzXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4QnlQdWJrZXkgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBtZXJnZWQuZm9yRWFjaCgocCwgaSkgPT4geyBpZiAocC5wdWJLZXkpIGluZGV4QnlQdWJrZXkuc2V0KHAucHViS2V5LCBpKTsgfSk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3luY1Byb2ZpbGUgb2Ygc3luY0RhdGEucHJvZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbElkeCA9IHN5bmNQcm9maWxlLnB1YktleSAhPSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gaW5kZXhCeVB1YmtleS5nZXQoc3luY1Byb2ZpbGUucHViS2V5KVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIGlmIChsb2NhbElkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIGxvY2FsIHByb2ZpbGUgd2l0aCB0aGlzIHB1YmtleSBcdTIwMTQgaXQncyBhIG5ldyBvbmUgZnJvbSBzeW5jLlxuICAgICAgICAgICAgICAgICAgICAvLyAoUHJvZmlsZXMgd2l0aG91dCBhIHB1YmtleSBjYW4ndCBiZSBzYWZlbHkgbWF0Y2hlZCwgc28gd2UgYWRkXG4gICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHJpc2sgY2xvYmJlcmluZyBhbiB1bnJlbGF0ZWQgbG9jYWwgcHJvZmlsZS4pXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZC5wdXNoKHN5bmNQcm9maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNQcm9maWxlLnB1YktleSkgaW5kZXhCeVB1YmtleS5zZXQoc3luY1Byb2ZpbGUucHViS2V5LCBtZXJnZWQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsUHJvZmlsZSA9IG1lcmdlZFtsb2NhbElkeF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bmNUaW1lID0gc3luY1Byb2ZpbGUudXBkYXRlZEF0IHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsVGltZSA9IGxvY2FsUHJvZmlsZS51cGRhdGVkQXQgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNUaW1lID4gbG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW5jIGlzIG5ld2VyIFx1MjAxNCBtZXJnZSBidXQgcHJlc2VydmUgbG9jYWwgaG9zdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZFtsb2NhbElkeF0gPSB7IC4uLnN5bmNQcm9maWxlLCBob3N0czogbG9jYWxQcm9maWxlLmhvc3RzIHx8IHt9IH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB1cGRhdGVzLnByb2ZpbGVzID0gbWVyZ2VkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIFByb2ZpbGUgaW5kZXggKFAxKSAtLS1cbiAgICBpZiAoc3luY0RhdGEucHJvZmlsZUluZGV4ICE9IG51bGwgJiYgaXNGcmVzaCkge1xuICAgICAgICB1cGRhdGVzLnByb2ZpbGVJbmRleCA9IHN5bmNEYXRhLnByb2ZpbGVJbmRleDtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gLS0tIEVuY3J5cHRpb24gc3RhdGUgKFAxKSAtLS1cbiAgICAvLyBJbnRlbnRpb25hbGx5IE5PVCBtZXJnZWQgZnJvbSBzeW5jLiBTZWUgYnVpbGRTeW5jUGF5bG9hZCgpOiB0aGUgcGFzc3dvcmRcbiAgICAvLyB2ZXJpZmllciBpcyBuZXZlciBzeW5jZWQsIHNvIHRydXN0aW5nIGEgc3luY2VkIGlzRW5jcnlwdGVkPXRydWUgd291bGQgbG9ja1xuICAgIC8vIHRoZSB1c2VyIG91dCBwZXJtYW5lbnRseS4gRW5jcnlwdGlvbiBzdGF0ZSBzdGF5cyBkZXZpY2UtbG9jYWwuXG5cbiAgICAvLyAtLS0gU2V0dGluZ3MgKFAyKSBcdTIwMTQgbGFzdC13cml0ZS13aW5zIC0tLVxuICAgIGNvbnN0IHN5bmNNZXRhID0gc3luY0RhdGEuX3N5bmNNZXRhIHx8IHt9O1xuICAgIGNvbnN0IHNldHRpbmdzS2V5cyA9IFsnYXV0b0xvY2tNaW51dGVzJywgJ3ZlcnNpb24nLCAncHJvdG9jb2xfaGFuZGxlcicsIExPQ0FMX0VOQUJMRURfS0VZXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzZXR0aW5nc0tleXMpIHtcbiAgICAgICAgaWYgKHN5bmNEYXRhW2tleV0gIT0gbnVsbCAmJiBzeW5jRGF0YVtrZXldICE9PSBsb2NhbFtrZXldKSB7XG4gICAgICAgICAgICAvLyBGb3IgdmVyc2lvbiwgb25seSBhY2NlcHQgaGlnaGVyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAndmVyc2lvbicgJiYgbG9jYWwudmVyc2lvbiAmJiBzeW5jRGF0YS52ZXJzaW9uIDw9IGxvY2FsLnZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgdXBkYXRlc1trZXldID0gc3luY0RhdGFba2V5XTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZlYXR1cmUgZmxhZ3NcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzeW5jRGF0YSkpIHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCdmZWF0dXJlOicpICYmIHN5bmNEYXRhW2tleV0gIT09IGxvY2FsW2tleV0pIHtcbiAgICAgICAgICAgIHVwZGF0ZXNba2V5XSA9IHN5bmNEYXRhW2tleV07XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBBUEkgS2V5IFZhdWx0IChQMykgLS0tXG4gICAgaWYgKHN5bmNEYXRhLmFwaUtleVZhdWx0KSB7XG4gICAgICAgIGlmICghbG9jYWwuYXBpS2V5VmF1bHQgfHwgaXNGcmVzaCkge1xuICAgICAgICAgICAgdXBkYXRlcy5hcGlLZXlWYXVsdCA9IHN5bmNEYXRhLmFwaUtleVZhdWx0O1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBpbmRpdmlkdWFsIGtleXMgYnkgdXBkYXRlZEF0XG4gICAgICAgICAgICBjb25zdCBsb2NhbEtleXMgPSBsb2NhbC5hcGlLZXlWYXVsdC5rZXlzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3Qgc3luY0tleXMgPSBzeW5jRGF0YS5hcGlLZXlWYXVsdC5rZXlzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0geyAuLi5sb2NhbEtleXMgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2lkLCBzeW5jS2V5XSBvZiBPYmplY3QuZW50cmllcyhzeW5jS2V5cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEtleSA9IG1lcmdlZFtpZF07XG4gICAgICAgICAgICAgICAgaWYgKCFsb2NhbEtleSB8fCAoc3luY0tleS51cGRhdGVkQXQgfHwgMCkgPiAobG9jYWxLZXkudXBkYXRlZEF0IHx8IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZFtpZF0gPSBzeW5jS2V5O1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZXMuYXBpS2V5VmF1bHQgPSB7IC4uLmxvY2FsLmFwaUtleVZhdWx0LCBrZXlzOiBtZXJnZWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLSBWYXVsdCBkb2NzIChQNCkgLS0tXG4gICAgY29uc3QgbG9jYWxEb2NzID0gbG9jYWwudmF1bHREb2NzIHx8IHt9O1xuICAgIGxldCBkb2NzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG1lcmdlZERvY3MgPSB7IC4uLmxvY2FsRG9jcyB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN5bmNEYXRhKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKCd2YXVsdERvYzonKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGRvYyA9IHN5bmNEYXRhW2tleV07XG4gICAgICAgIGlmICghZG9jIHx8ICFkb2MucGF0aCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGxvY2FsRG9jID0gbWVyZ2VkRG9jc1tkb2MucGF0aF07XG4gICAgICAgIGlmICghbG9jYWxEb2MgfHwgKGRvYy51cGRhdGVkQXQgfHwgMCkgPiAobG9jYWxEb2MudXBkYXRlZEF0IHx8IDApKSB7XG4gICAgICAgICAgICBtZXJnZWREb2NzW2RvYy5wYXRoXSA9IGRvYztcbiAgICAgICAgICAgIGRvY3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZG9jc0NoYW5nZWQpIHtcbiAgICAgICAgdXBkYXRlcy52YXVsdERvY3MgPSBtZXJnZWREb2NzO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB1cGRhdGVzLCBjaGFuZ2VkIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVib3VuY2VkIHB1c2hcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNjaGVkdWxlIGEgc3luYyBwdXNoIHdpdGggYSAyLXNlY29uZCBkZWJvdW5jZS5cbiAqIEV4cG9ydGVkIGZvciB1c2UgYnkgc3RvcmVzIGFuZCB0aGUgc3RvcmFnZSBpbnRlcmNlcHRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlU3luY1B1c2goKSB7XG4gICAgaWYgKCFhcGkuc3RvcmFnZS5zeW5jKSByZXR1cm47XG4gICAgaWYgKHB1c2hUaW1lcikgY2xlYXJUaW1lb3V0KHB1c2hUaW1lcik7XG4gICAgcHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHB1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIHB1c2hUb1N5bmMoKTtcbiAgICB9LCAyMDAwKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmFibGUgLyBkaXNhYmxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzU3luY0VuYWJsZWQoKSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgW0xPQ0FMX0VOQUJMRURfS0VZXTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGF0YVtMT0NBTF9FTkFCTEVEX0tFWV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRTeW5jRW5hYmxlZChlbmFibGVkKSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBbTE9DQUxfRU5BQkxFRF9LRVldOiBlbmFibGVkIH0pO1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHNjaGVkdWxlU3luY1B1c2goKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW5pdGlhbGlzYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENhbGxlZCBvbmNlIG9uIHN0YXJ0dXAgKGZyb20gYmFja2dyb3VuZC5qcykuXG4gKiBQdWxscyBmcm9tIHN5bmMsIG1lcmdlcywgdGhlbiBsaXN0ZW5zIGZvciByZW1vdGUgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRTeW5jKCkge1xuICAgIGlmICghYXBpLnN0b3JhZ2Uuc3luYykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1N5bmNNYW5hZ2VyXSBzdG9yYWdlLnN5bmMgbm90IGF2YWlsYWJsZSBcdTIwMTQgc2tpcHBpbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZWQgPSBhd2FpdCBpc1N5bmNFbmFibGVkKCk7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU3luY01hbmFnZXJdIFBsYXRmb3JtIHN5bmMgZGlzYWJsZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFB1bGwgKyBtZXJnZVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN5bmNEYXRhID0gYXdhaXQgcHVsbEZyb21TeW5jKCk7XG4gICAgICAgIGlmIChzeW5jRGF0YSkge1xuICAgICAgICAgICAgYXdhaXQgbWVyZ2VJbnRvTG9jYWwoc3luY0RhdGEpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTeW5jTWFuYWdlcl0gSW5pdGlhbCBwdWxsK21lcmdlIGNvbXBsZXRlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1N5bmNNYW5hZ2VyXSBObyBzeW5jIGRhdGEgZm91bmQgXHUyMDE0IGZyZXNoIHN5bmMnKTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1N5bmNNYW5hZ2VyXSBJbml0aWFsIHB1bGwgZmFpbGVkOicsIGUpO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiBmb3IgcmVtb3RlIGNoYW5nZXNcbiAgICBpZiAoYXBpLnN0b3JhZ2Uub25DaGFuZ2VkKSB7XG4gICAgICAgIGFwaS5zdG9yYWdlLm9uQ2hhbmdlZC5hZGRMaXN0ZW5lcigoY2hhbmdlcywgYXJlYU5hbWUpID0+IHtcbiAgICAgICAgICAgIGlmIChhcmVhTmFtZSAhPT0gJ3N5bmMnKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1N5bmNNYW5hZ2VyXSBSZW1vdGUgc3luYyBjaGFuZ2UgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICAgIC8vIFJlLXB1bGwgYW5kIG1lcmdlIHRoZSBmdWxsIHN5bmMgZGF0YSB0byBoYW5kbGUgY2h1bmtlZCB2YWx1ZXMgY29ycmVjdGx5XG4gICAgICAgICAgICBwdWxsRnJvbVN5bmMoKS50aGVuKHN5bmNEYXRhID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3luY0RhdGEpIG1lcmdlSW50b0xvY2FsKHN5bmNEYXRhKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTeW5jTWFuYWdlcl0gUmVtb3RlIG1lcmdlIGVycm9yOicsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERvIGFuIGluaXRpYWwgcHVzaCBzbyBsb2NhbCBkYXRhIGlzIG1pcnJvcmVkXG4gICAgc2NoZWR1bGVTeW5jUHVzaCgpO1xufVxuIiwgIi8qKlxuICogTklQLTQ2IE5vc3RyIENvbm5lY3QgKG5zZWNCdW5rZXIpIENsaWVudFxuICpcbiAqIEltcGxlbWVudHMgdGhlIGNsaWVudCBzaWRlIG9mIE5JUC00NiBmb3IgcmVtb3RlIHNpZ25pbmcuXG4gKiBUaGUgZXh0ZW5zaW9uIGNvbm5lY3RzIHRvIGEgYnVua2VyIHZpYSBOb3N0ciByZWxheXMuXG4gKiBUaGUgYnVua2VyIGhvbGRzIHRoZSBuc2VjIGFuZCBwZXJmb3JtcyBzaWduaW5nIG9wZXJhdGlvbnMuXG4gKlxuICogRmxvdzpcbiAqICAgMS4gVXNlciBwcm92aWRlcyBhIGJ1bmtlcjovLyBjb25uZWN0aW9uIHN0cmluZ1xuICogICAyLiBDbGllbnQgZ2VuZXJhdGVzIGFuIGVwaGVtZXJhbCBrZXlwYWlyIGZvciB0aGUgc2Vzc2lvblxuICogICAzLiBDbGllbnQgY29ubmVjdHMgdG8gdGhlIHJlbGF5IHNwZWNpZmllZCBpbiB0aGUgY29ubmVjdGlvbiBzdHJpbmdcbiAqICAgNC4gQ2xpZW50IHNlbmRzIE5JUC00NCBlbmNyeXB0ZWQgcmVxdWVzdHMgdG8gdGhlIGJ1bmtlciBwdWJrZXlcbiAqICAgNS4gQnVua2VyIHJlc3BvbmRzIHdpdGggTklQLTQ0IGVuY3J5cHRlZCByZXN1bHRzXG4gKiAgIDYuIENsaWVudCBkZWNyeXB0cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0XG4gKlxuICogQ29ubmVjdGlvbiBzdHJpbmcgZm9ybWF0OlxuICogICBidW5rZXI6Ly88cmVtb3RlLXNpZ25lci1wdWJrZXk+P3JlbGF5PXdzczovLy4uLiZyZWxheT13c3M6Ly8uLi4mc2VjcmV0PTxvcHRpb25hbD5cbiAqL1xuXG5pbXBvcnQge1xuICAgIGZpbmFsaXplRXZlbnQsXG4gICAgYnl0ZXNUb0hleCxcbiAgICBoZXhUb0J5dGVzLFxufSBmcm9tICdub3N0ci1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVLZXlQYWlyIH0gZnJvbSAnLi9rZXlzLmpzJztcbmltcG9ydCAqIGFzIG5pcDQ0IGZyb20gJ25vc3RyLWNyeXB0by11dGlscy9uaXA0NCc7XG5pbXBvcnQgeyBhcGkgfSBmcm9tICcuL2Jyb3dzZXItcG9seWZpbGwnO1xuXG5jb25zdCBzdG9yYWdlID0gYXBpLnN0b3JhZ2UubG9jYWw7XG5jb25zdCBsb2cgPSBtc2cgPT4gY29uc29sZS5sb2coJ05JUC00NjogJywgbXNnKTtcblxuLy8gQWN0aXZlIGJ1bmtlciBzZXNzaW9ucyBrZXllZCBieSBwcm9maWxlIGluZGV4XG5jb25zdCBzZXNzaW9ucyA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBQYXJzZSBhIGJ1bmtlcjovLyBjb25uZWN0aW9uIHN0cmluZ1xuICogRm9ybWF0OiBidW5rZXI6Ly88cHVia2V5Pj9yZWxheT13c3M6Ly8uLi4mcmVsYXk9d3NzOi8vLi4uJnNlY3JldD08b3B0aW9uYWw+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1bmtlclVybCh1cmwpIHtcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdidW5rZXI6Ly8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVua2VyIFVSTDogbXVzdCBzdGFydCB3aXRoIGJ1bmtlcjovLycpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCByZW1vdGVQdWJrZXkgPSBwYXJzZWQuaG9zdG5hbWUgfHwgcGFyc2VkLnBhdGhuYW1lLnJlcGxhY2UoJy8vJywgJycpO1xuXG4gICAgaWYgKCEvXlswLTlhLWZdezY0fSQvaS50ZXN0KHJlbW90ZVB1YmtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1bmtlciBVUkw6IHB1YmtleSBtdXN0IGJlIDY0IGhleCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXlzID0gcGFyc2VkLnNlYXJjaFBhcmFtcy5nZXRBbGwoJ3JlbGF5Jyk7XG4gICAgaWYgKHJlbGF5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1bmtlciBVUkw6IGF0IGxlYXN0IG9uZSByZWxheSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJlbGF5IFVSTHNcbiAgICBmb3IgKGNvbnN0IHJlbGF5IG9mIHJlbGF5cykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IG5ldyBVUkwocmVsYXkpO1xuICAgICAgICAgICAgaWYgKHIucHJvdG9jb2wgIT09ICd3c3M6JyAmJiByLnByb3RvY29sICE9PSAnd3M6Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWxheSBwcm90b2NvbDogJHtyLnByb3RvY29sfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVsYXkgVVJMOiAke3JlbGF5fWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjcmV0ID0gcGFyc2VkLnNlYXJjaFBhcmFtcy5nZXQoJ3NlY3JldCcpIHx8IG51bGw7XG5cbiAgICByZXR1cm4geyByZW1vdGVQdWJrZXksIHJlbGF5cywgc2VjcmV0IH07XG59XG5cbi8qKlxuICogQSBzaW5nbGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gYSBOb3N0ciByZWxheVxuICovXG5leHBvcnQgY2xhc3MgUmVsYXlDb25uZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMud3MgPSBudWxsO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZW9zZUNhbGxiYWNrcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdHMgPSAwO1xuICAgICAgICB0aGlzLm1heFJlY29ubmVjdEF0dGVtcHRzID0gNTtcbiAgICB9XG5cbiAgICBjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLndzID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBXZWJTb2NrZXQ6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndzPy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbm5lY3Rpb24gdGltZW91dDogJHt0aGlzLnVybH1gKSk7XG4gICAgICAgICAgICB9LCAxMDAwMCk7XG5cbiAgICAgICAgICAgIHRoaXMud3Mub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0cyA9IDA7XG4gICAgICAgICAgICAgICAgbG9nKGBDb25uZWN0ZWQgdG8gJHt0aGlzLnVybH1gKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke3RoaXMudXJsfWApO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYlNvY2tldCBlcnJvcjogJHt0aGlzLnVybH1gKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLndzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsb2coYERpc2Nvbm5lY3RlZCBmcm9tICR7dGhpcy51cmx9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVJlY29ubmVjdCgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy53cy5vbm1lc3NhZ2UgPSAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobXNnLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1lc3NhZ2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2coYEZhaWxlZCB0byBwYXJzZSBtZXNzYWdlOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVNZXNzYWdlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgW3R5cGUsIHN1YklkLCAuLi5yZXN0XSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdFVkVOVCcgJiYgc3ViSWQgJiYgcmVzdFswXSkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSByZXN0WzBdO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoc3ViSWQpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnRU9TRScgJiYgc3ViSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVvc2VIYW5kbGVyID0gdGhpcy5lb3NlQ2FsbGJhY2tzLmdldChzdWJJZCk7XG4gICAgICAgICAgICBpZiAoZW9zZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVvc2VDYWxsYmFja3MuZGVsZXRlKHN1YklkKTtcbiAgICAgICAgICAgICAgICBlb3NlSGFuZGxlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdPSycpIHtcbiAgICAgICAgICAgIC8vIEV2ZW50IGFjY2VwdGVkXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ05PVElDRScpIHtcbiAgICAgICAgICAgIGxvZyhgUmVsYXkgbm90aWNlOiAke3Jlc3RbMF19YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmUoc3ViSWQsIGZpbHRlcnMsIG9uRXZlbnQsIG9uRW9zZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCB8fCAhdGhpcy53cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldChzdWJJZCwgb25FdmVudCk7XG4gICAgICAgIGlmIChvbkVvc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZW9zZUNhbGxiYWNrcy5zZXQoc3ViSWQsIG9uRW9zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cy5zZW5kKEpTT04uc3RyaW5naWZ5KFsnUkVRJywgc3ViSWQsIC4uLmZpbHRlcnNdKSk7XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUoc3ViSWQpIHtcbiAgICAgICAgaWYgKHRoaXMud3MgJiYgdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud3Muc2VuZChKU09OLnN0cmluZ2lmeShbJ0NMT1NFJywgc3ViSWRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJJZCk7XG4gICAgICAgIHRoaXMuZW9zZUNhbGxiYWNrcy5kZWxldGUoc3ViSWQpO1xuICAgIH1cblxuICAgIHB1Ymxpc2goZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCB8fCAhdGhpcy53cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cy5zZW5kKEpTT04uc3RyaW5naWZ5KFsnRVZFTlQnLCBldmVudF0pKTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZVJlY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjb25uZWN0QXR0ZW1wdHMgPj0gdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cykge1xuICAgICAgICAgICAgbG9nKGBNYXggcmVjb25uZWN0IGF0dGVtcHRzIHJlYWNoZWQgZm9yICR7dGhpcy51cmx9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgubWluKDEwMDAgKiBNYXRoLnBvdygyLCB0aGlzLnJlY29ubmVjdEF0dGVtcHRzKSwgMzAwMDApO1xuICAgICAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHRzKys7XG5cbiAgICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgbG9nKGBSZWNvbm5lY3RpbmcgdG8gJHt0aGlzLnVybH0gKGF0dGVtcHQgJHt0aGlzLnJlY29ubmVjdEF0dGVtcHRzfSlgKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICAgIHRoaXMubWF4UmVjb25uZWN0QXR0ZW1wdHMgPSAwOyAvLyBQcmV2ZW50IGZ1cnRoZXIgcmVjb25uZWN0c1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lb3NlQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBOSVAtNDYgQnVua2VyIFNlc3Npb25cbiAqXG4gKiBNYW5hZ2VzIGEgc2Vzc2lvbiB3aXRoIGEgcmVtb3RlIHNpZ25lciAobnNlY0J1bmtlcikuXG4gKiBVc2VzIGFuIGVwaGVtZXJhbCBrZXlwYWlyIGZvciBlbmNyeXB0ZWQgY29tbXVuaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bmtlclNlc3Npb24ge1xuICAgIGNvbnN0cnVjdG9yKHsgcmVtb3RlUHVia2V5LCByZWxheXMsIHNlY3JldCB9KSB7XG4gICAgICAgIHRoaXMucmVtb3RlUHVia2V5ID0gcmVtb3RlUHVia2V5O1xuICAgICAgICB0aGlzLnJlbGF5VXJscyA9IHJlbGF5cztcbiAgICAgICAgdGhpcy5zZWNyZXQgPSBzZWNyZXQ7XG5cbiAgICAgICAgLy8gS2V5cGFpciB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXQoKVxuICAgICAgICB0aGlzLnNlc3Npb25Qcml2a2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZXNzaW9uUHVia2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25LZXkgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucmVsYXlzID0gW107XG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1YklkID0gYG5vc3Rya2V5LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKS5zbGljZSgwLCA4KX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGVwaGVtZXJhbCBzZXNzaW9uIGtleXBhaXIgKGFzeW5jKVxuICAgICAqL1xuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb25Qcml2a2V5KSByZXR1cm47IC8vIEFscmVhZHkgaW5pdGlhbGl6ZWRcblxuICAgICAgICAvLyBHZW5lcmF0ZSBlcGhlbWVyYWwgc2Vzc2lvbiBrZXlwYWlyXG4gICAgICAgIGNvbnN0IGtleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uUHJpdmtleSA9IGhleFRvQnl0ZXMoa2V5UGFpci5wcml2YXRlS2V5KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uUHVia2V5ID0ga2V5UGFpci5wdWJsaWNLZXk7XG5cbiAgICAgICAgLy8gRGVyaXZlIE5JUC00NCBjb252ZXJzYXRpb24ga2V5XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID0gbmlwNDQudjIudXRpbHMuZ2V0Q29udmVyc2F0aW9uS2V5KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uUHJpdmtleSxcbiAgICAgICAgICAgIHRoaXMucmVtb3RlUHVia2V5XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhbGwgcmVsYXlzIGFuZCBzdWJzY3JpYmUgZm9yIHJlc3BvbnNlc1xuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgICAgIC8vIEVuc3VyZSBrZXlwYWlyIGlzIGluaXRpYWxpemVkXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuXG4gICAgICAgIC8vIENvbm5lY3QgdG8gcmVsYXlzXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gdGhpcy5yZWxheVVybHMubWFwKHVybCA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxheSA9IG5ldyBSZWxheUNvbm5lY3Rpb24odXJsKTtcbiAgICAgICAgICAgIHJldHVybiByZWxheS5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxheXMucHVzaChyZWxheSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY29ubmVjdGlvbnMpO1xuICAgICAgICBjb25zdCBjb25uZWN0ZWQgPSByZXN1bHRzLmZpbHRlcihyID0+IHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyk7XG5cbiAgICAgICAgaWYgKGNvbm5lY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbm5lY3QgdG8gYW55IHJlbGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2coYENvbm5lY3RlZCB0byAke2Nvbm5lY3RlZC5sZW5ndGh9LyR7dGhpcy5yZWxheVVybHMubGVuZ3RofSByZWxheXNgKTtcblxuICAgICAgICAvLyBTdWJzY3JpYmUgZm9yIE5JUC00NiByZXNwb25zZXMgKGtpbmQgMjQxMzMgYWRkcmVzc2VkIHRvIG91ciBzZXNzaW9uIHB1YmtleSlcbiAgICAgICAgZm9yIChjb25zdCByZWxheSBvZiB0aGlzLnJlbGF5cykge1xuICAgICAgICAgICAgcmVsYXkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHRoaXMuc3ViSWQsXG4gICAgICAgICAgICAgICAgW3sga2luZHM6IFsyNDEzM10sICcjcCc6IFt0aGlzLnNlc3Npb25QdWJrZXldIH1dLFxuICAgICAgICAgICAgICAgIChldmVudCkgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShldmVudClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gU2VuZCBjb25uZWN0IHJlcXVlc3QgaWYgc2VjcmV0IGlzIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLnNlY3JldCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgnY29ubmVjdCcsIFt0aGlzLnJlbW90ZVB1YmtleSwgdGhpcy5zZWNyZXRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QoJ2Nvbm5lY3QnLCBbdGhpcy5yZW1vdGVQdWJrZXldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhbiBpbmNvbWluZyBOSVAtNDYgcmVzcG9uc2UgZXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVSZXNwb25zZShldmVudCkge1xuICAgICAgICAvLyBNdXN0IGJlIGZyb20gdGhlIHJlbW90ZSBzaWduZXJcbiAgICAgICAgaWYgKGV2ZW50LnB1YmtleSAhPT0gdGhpcy5yZW1vdGVQdWJrZXkpIHtcbiAgICAgICAgICAgIGxvZyhgSWdub3JpbmcgZXZlbnQgZnJvbSB1bmtub3duIHB1YmtleTogJHtldmVudC5wdWJrZXl9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRGVjcnlwdCB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnN0IHBsYWludGV4dCA9IG5pcDQ0LnYyLmRlY3J5cHQoZXZlbnQuY29udGVudCwgdGhpcy5jb252ZXJzYXRpb25LZXkpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHBsYWludGV4dCk7XG5cbiAgICAgICAgICAgIGxvZyhgUmVzcG9uc2U6ICR7cmVzcG9uc2UuaWR9IC0+ICR7cmVzcG9uc2UucmVzdWx0ID8gJ29rJyA6IHJlc3BvbnNlLmVycm9yfWApO1xuXG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KHJlc3BvbnNlLmlkKTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKHJlc3BvbnNlLmlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUocmVzcG9uc2UucmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZyhgRmFpbGVkIHRvIGhhbmRsZSByZXNwb25zZTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIGVuY3J5cHRlZCBOSVAtNDYgcmVxdWVzdCB0byB0aGUgYnVua2VyXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QobWV0aG9kLCBwYXJhbXMgPSBbXSkge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkICYmIG1ldGhvZCAhPT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBjb25uZWN0ZWQgdG8gYnVua2VyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0pO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBuaXA0NC52Mi5lbmNyeXB0KHJlcXVlc3QsIHRoaXMuY29udmVyc2F0aW9uS2V5KTtcblxuICAgICAgICAvLyBDcmVhdGUgYW5kIHNpZ24gdGhlIGV2ZW50XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgZmluYWxpemVFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAyNDEzMyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGVuY3J5cHRlZCxcbiAgICAgICAgICAgIHRhZ3M6IFtbJ3AnLCB0aGlzLnJlbW90ZVB1YmtleV1dLFxuICAgICAgICAgICAgY3JlYXRlZF9hdDogTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCksXG4gICAgICAgIH0sIHRoaXMuc2Vzc2lvblByaXZrZXkpO1xuXG4gICAgICAgIC8vIFB1Ymxpc2ggdG8gYWxsIGNvbm5lY3RlZCByZWxheXNcbiAgICAgICAgZm9yIChjb25zdCByZWxheSBvZiB0aGlzLnJlbGF5cykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZWxheS5wdWJsaXNoKGV2ZW50KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2coYEZhaWxlZCB0byBwdWJsaXNoIHRvICR7cmVsYXkudXJsfTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciByZXNwb25zZSB3aXRoIHRpbWVvdXRcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dDogJHttZXRob2R9YCkpO1xuICAgICAgICAgICAgfSwgMzAwMDApO1xuXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5zZXQoaWQsIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0OiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTklQLTQ2IE1ldGhvZHNcbiAgICAgKi9cblxuICAgIGFzeW5jIGdldFB1YmxpY0tleSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QoJ2dldF9wdWJsaWNfa2V5Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2lnbkV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QoJ3NpZ25fZXZlbnQnLCBbSlNPTi5zdHJpbmdpZnkoZXZlbnQpXSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmlwMDRFbmNyeXB0KHRoaXJkUGFydHlQdWJrZXksIHBsYWludGV4dCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgnbmlwMDRfZW5jcnlwdCcsIFt0aGlyZFBhcnR5UHVia2V5LCBwbGFpbnRleHRdKTtcbiAgICB9XG5cbiAgICBhc3luYyBuaXAwNERlY3J5cHQodGhpcmRQYXJ0eVB1YmtleSwgY2lwaGVydGV4dCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgnbmlwMDRfZGVjcnlwdCcsIFt0aGlyZFBhcnR5UHVia2V5LCBjaXBoZXJ0ZXh0XSk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmlwNDRFbmNyeXB0KHRoaXJkUGFydHlQdWJrZXksIHBsYWludGV4dCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgnbmlwNDRfZW5jcnlwdCcsIFt0aGlyZFBhcnR5UHVia2V5LCBwbGFpbnRleHRdKTtcbiAgICB9XG5cbiAgICBhc3luYyBuaXA0NERlY3J5cHQodGhpcmRQYXJ0eVB1YmtleSwgY2lwaGVydGV4dCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCgnbmlwNDRfZGVjcnlwdCcsIFt0aGlyZFBhcnR5UHVia2V5LCBjaXBoZXJ0ZXh0XSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcGluZygpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QoJ3BpbmcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2Vzc2lvbiBpbmZvIGZvciBwZXJzaXN0ZW5jZVxuICAgICAqL1xuICAgIGdldFNlc3Npb25JbmZvKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVtb3RlUHVia2V5OiB0aGlzLnJlbW90ZVB1YmtleSxcbiAgICAgICAgICAgIHJlbGF5VXJsczogdGhpcy5yZWxheVVybHMsXG4gICAgICAgICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LFxuICAgICAgICAgICAgc2Vzc2lvblByaXZrZXk6IGJ5dGVzVG9IZXgodGhpcy5zZXNzaW9uUHJpdmtleSksXG4gICAgICAgICAgICBzZXNzaW9uUHVia2V5OiB0aGlzLnNlc3Npb25QdWJrZXksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdCBmcm9tIGFsbCByZWxheXNcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlbGF5IG9mIHRoaXMucmVsYXlzKSB7XG4gICAgICAgICAgICByZWxheS51bnN1YnNjcmliZSh0aGlzLnN1YklkKTtcbiAgICAgICAgICAgIHJlbGF5LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWxheXMgPSBbXTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgbG9nKCdEaXNjb25uZWN0ZWQgZnJvbSBidW5rZXInKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVzdG9yZSBhIHNlc3Npb24gZnJvbSBwZXJzaXN0ZWQgc2Vzc2lvbiBpbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlU2Vzc2lvbihzZXNzaW9uSW5mbykge1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgQnVua2VyU2Vzc2lvbih7XG4gICAgICAgIHJlbW90ZVB1YmtleTogc2Vzc2lvbkluZm8ucmVtb3RlUHVia2V5LFxuICAgICAgICByZWxheXM6IHNlc3Npb25JbmZvLnJlbGF5VXJscyxcbiAgICAgICAgc2VjcmV0OiBzZXNzaW9uSW5mby5zZWNyZXQsXG4gICAgfSk7XG5cbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGtleXBhaXIgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIG5ldyBvbmVcbiAgICBzZXNzaW9uLnNlc3Npb25Qcml2a2V5ID0gaGV4VG9CeXRlcyhzZXNzaW9uSW5mby5zZXNzaW9uUHJpdmtleSk7XG4gICAgc2Vzc2lvbi5zZXNzaW9uUHVia2V5ID0gc2Vzc2lvbkluZm8uc2Vzc2lvblB1YmtleTtcbiAgICBzZXNzaW9uLmNvbnZlcnNhdGlvbktleSA9IG5pcDQ0LnYyLnV0aWxzLmdldENvbnZlcnNhdGlvbktleShcbiAgICAgICAgc2Vzc2lvbi5zZXNzaW9uUHJpdmtleSxcbiAgICAgICAgc2Vzc2lvbi5yZW1vdGVQdWJrZXlcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlc3Npb247XG59XG5cbi8qKlxuICogU2Vzc2lvbiBNYW5hZ2VyIFx1MjAxNCBtYW5hZ2VzIGFjdGl2ZSBidW5rZXIgc2Vzc2lvbnMgcGVyIHByb2ZpbGVcbiAqL1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVTZXNzaW9uKHByb2ZpbGVJbmRleCkge1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYW4gYWN0aXZlIHNlc3Npb25cbiAgICBpZiAoc2Vzc2lvbnMuaGFzKHByb2ZpbGVJbmRleCkpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmdldChwcm9maWxlSW5kZXgpO1xuICAgICAgICBpZiAoc2Vzc2lvbi5jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlc3Npb24gZGlzY29ubmVjdGVkLCBjbGVhbiB1cFxuICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgc2Vzc2lvbnMuZGVsZXRlKHByb2ZpbGVJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHJlc3RvcmUgZnJvbSBwZXJzaXN0ZWQgc2Vzc2lvbiBpbmZvXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgYnVua2VyU2Vzc2lvbnM6IHt9IH0pO1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gZGF0YS5idW5rZXJTZXNzaW9ucz8uW3Byb2ZpbGVJbmRleF07XG5cbiAgICBpZiAoIXNlc3Npb25JbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYnVua2VyIHNlc3Npb24gY29uZmlndXJlZCBmb3IgdGhpcyBwcm9maWxlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHJlc3RvcmVTZXNzaW9uKHNlc3Npb25JbmZvKTtcbiAgICBhd2FpdCBzZXNzaW9uLmNvbm5lY3QoKTtcbiAgICBzZXNzaW9ucy5zZXQocHJvZmlsZUluZGV4LCBzZXNzaW9uKTtcbiAgICByZXR1cm4gc2Vzc2lvbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlc3Npb24ocHJvZmlsZUluZGV4LCBidW5rZXJVcmwpIHtcbiAgICAvLyBEaXNjb25uZWN0IGV4aXN0aW5nIHNlc3Npb25cbiAgICBpZiAoc2Vzc2lvbnMuaGFzKHByb2ZpbGVJbmRleCkpIHtcbiAgICAgICAgc2Vzc2lvbnMuZ2V0KHByb2ZpbGVJbmRleCkuZGlzY29ubmVjdCgpO1xuICAgICAgICBzZXNzaW9ucy5kZWxldGUocHJvZmlsZUluZGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSBwYXJzZUJ1bmtlclVybChidW5rZXJVcmwpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgQnVua2VyU2Vzc2lvbihjb25maWcpO1xuICAgIGF3YWl0IHNlc3Npb24uY29ubmVjdCgpO1xuXG4gICAgLy8gUGVyc2lzdCBzZXNzaW9uIGluZm9cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgc3RvcmFnZS5nZXQoeyBidW5rZXJTZXNzaW9uczoge30gfSk7XG4gICAgY29uc3QgYnVua2VyU2Vzc2lvbnMgPSBkYXRhLmJ1bmtlclNlc3Npb25zIHx8IHt9O1xuICAgIGJ1bmtlclNlc3Npb25zW3Byb2ZpbGVJbmRleF0gPSBzZXNzaW9uLmdldFNlc3Npb25JbmZvKCk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoeyBidW5rZXJTZXNzaW9ucyB9KTtcblxuICAgIHNlc3Npb25zLnNldChwcm9maWxlSW5kZXgsIHNlc3Npb24pO1xuICAgIHJldHVybiBzZXNzaW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY29ubmVjdFNlc3Npb24ocHJvZmlsZUluZGV4KSB7XG4gICAgaWYgKHNlc3Npb25zLmhhcyhwcm9maWxlSW5kZXgpKSB7XG4gICAgICAgIHNlc3Npb25zLmdldChwcm9maWxlSW5kZXgpLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgc2Vzc2lvbnMuZGVsZXRlKHByb2ZpbGVJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHBlcnNpc3RlZCBzZXNzaW9uXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHN0b3JhZ2UuZ2V0KHsgYnVua2VyU2Vzc2lvbnM6IHt9IH0pO1xuICAgIGNvbnN0IGJ1bmtlclNlc3Npb25zID0gZGF0YS5idW5rZXJTZXNzaW9ucyB8fCB7fTtcbiAgICBkZWxldGUgYnVua2VyU2Vzc2lvbnNbcHJvZmlsZUluZGV4XTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldCh7IGJ1bmtlclNlc3Npb25zIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZXNzaW9uQWN0aXZlKHByb2ZpbGVJbmRleCkge1xuICAgIHJldHVybiBzZXNzaW9ucy5oYXMocHJvZmlsZUluZGV4KSAmJiBzZXNzaW9ucy5nZXQocHJvZmlsZUluZGV4KS5jb25uZWN0ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBidW5rZXIgVVJMIHdpdGhvdXQgY29ubmVjdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVCdW5rZXJVcmwodXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcGFyc2VCdW5rZXJVcmwodXJsKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGVycm9yOiBudWxsIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfTtcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBOSVAtNDYgQnVua2VyIFNlcnZlclxuICpcbiAqIFRoZSBpbnZlcnNlIG9mIEJ1bmtlclNlc3Npb24gaW4gbmlwNDYuanMgXHUyMDE0IHRoaXMgbWFrZXMgdGhlIE5vc3RyS2V5XG4gKiBleHRlbnNpb24gYWN0IGFzIGEgTklQLTQ2IHJlbW90ZSBzaWduZXIgKGJ1bmtlcikuXG4gKlxuICogRmxvdzpcbiAqICAgMS4gRXh0ZW5zaW9uIGdlbmVyYXRlcyBhIGNvbm5lY3Rpb24gc2VjcmV0IGFuZCBvcGVucyBhIFdlYlNvY2tldCB0byB0aGUgcmVsYXlcbiAqICAgMi4gRXh0ZW5zaW9uIHN1YnNjcmliZXMgZm9yIGtpbmQgMjQxMzMgZXZlbnRzIHRhZ2dlZCB3aXRoIHRoZSB1c2VyJ3MgcHVia2V5XG4gKiAgIDMuIEEgcmVtb3RlIGNsaWVudCBzZW5kcyBhbiBlbmNyeXB0ZWQgcmVxdWVzdCAoY29ubmVjdCwgc2lnbl9ldmVudCwgZXRjLilcbiAqICAgNC4gRXh0ZW5zaW9uIGRlY3J5cHRzLCBleGVjdXRlcywgZW5jcnlwdHMgdGhlIHJlc3BvbnNlLCBwdWJsaXNoZXMgYmFja1xuICpcbiAqIENvbm5lY3Rpb24gc3RyaW5nIGZvcm1hdDpcbiAqICAgYnVua2VyOi8vPHVzZXItcHVia2V5Pj9yZWxheT13c3M6Ly8uLi4mc2VjcmV0PTxyYW5kb20+XG4gKi9cblxuaW1wb3J0IHtcbiAgICBmaW5hbGl6ZUV2ZW50LFxuICAgIGJ5dGVzVG9IZXgsXG4gICAgbmlwMDQsXG59IGZyb20gJ25vc3RyLWNyeXB0by11dGlscyc7XG5pbXBvcnQgKiBhcyBuaXA0NCBmcm9tICdub3N0ci1jcnlwdG8tdXRpbHMvbmlwNDQnO1xuaW1wb3J0IHsgUmVsYXlDb25uZWN0aW9uIH0gZnJvbSAnLi9uaXA0Ni5qcyc7XG5cbmNvbnN0IGxvZyA9IG1zZyA9PiBjb25zb2xlLmxvZygnQnVua2VyU2VydmVyOiAnLCBtc2cpO1xuXG5leHBvcnQgY2xhc3MgQnVua2VyU2VydmVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9wdHMucmVsYXlVcmxzICAtIHJlbGF5IFVSTHMgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSAgIG9wdHMudXNlclB1YmtleSAtIGhleCBwdWJrZXkgb2YgdGhlIGxvY2FsIHVzZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICBvcHRzLnNlY3JldCAgICAgLSBzaGFyZWQgc2VjcmV0IGZvciBjb25uZWN0IGhhbmRzaGFrZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHsgcmVsYXlVcmxzLCB1c2VyUHVia2V5LCBzZWNyZXQgfSkge1xuICAgICAgICB0aGlzLnJlbGF5VXJscyA9IHJlbGF5VXJscztcbiAgICAgICAgdGhpcy51c2VyUHVia2V5ID0gdXNlclB1YmtleTtcbiAgICAgICAgdGhpcy5zZWNyZXQgPSBzZWNyZXQ7XG5cbiAgICAgICAgdGhpcy5yZWxheXMgPSBbXTtcbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkQ2xpZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5zdWJJZCA9IGBidW5rZXItc3J2LSR7Y3J5cHRvLnJhbmRvbVVVSUQoKS5zbGljZSgwLCA4KX1gO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFdpbGwgYmUgc2V0IGJ5IHN0YXJ0KClcbiAgICAgICAgdGhpcy5fZ2V0UHJpdktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIGJ1bmtlciBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRzLmdldFByaXZLZXkgLSBhc3luYyAoKSA9PiBVaW50OEFycmF5ICh1c2VyJ3MgcHJpdmF0ZSBrZXkpXG4gICAgICovXG4gICAgYXN5bmMgc3RhcnQoeyBnZXRQcml2S2V5IH0pIHtcbiAgICAgICAgdGhpcy5fZ2V0UHJpdktleSA9IGdldFByaXZLZXk7XG5cbiAgICAgICAgLy8gQ29ubmVjdCB0byByZWxheXNcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSB0aGlzLnJlbGF5VXJscy5tYXAodXJsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF5ID0gbmV3IFJlbGF5Q29ubmVjdGlvbih1cmwpO1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF5LmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF5cy5wdXNoKHJlbGF5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjb25uZWN0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RlZCA9IHJlc3VsdHMuZmlsdGVyKHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKTtcblxuICAgICAgICBpZiAoY29ubmVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29ubmVjdCB0byBhbnkgcmVsYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZyhgQ29ubmVjdGVkIHRvICR7Y29ubmVjdGVkLmxlbmd0aH0vJHt0aGlzLnJlbGF5VXJscy5sZW5ndGh9IHJlbGF5c2ApO1xuXG4gICAgICAgIC8vIFN1YnNjcmliZSBmb3IgaW5jb21pbmcgTklQLTQ2IHJlcXVlc3RzIChraW5kIDI0MTMzIHRhZ2dlZCB3aXRoIG91ciBwdWJrZXkpXG4gICAgICAgIGZvciAoY29uc3QgcmVsYXkgb2YgdGhpcy5yZWxheXMpIHtcbiAgICAgICAgICAgIHJlbGF5LnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICB0aGlzLnN1YklkLFxuICAgICAgICAgICAgICAgIFt7IGtpbmRzOiBbMjQxMzNdLCAnI3AnOiBbdGhpcy51c2VyUHVia2V5XSwgc2luY2U6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApIC0gNSB9XSxcbiAgICAgICAgICAgICAgICAoZXZlbnQpID0+IHRoaXMuX2hhbmRsZVJlcXVlc3QoZXZlbnQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBsb2coJ0J1bmtlciBzZXJ2ZXIgc3RhcnRlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIGJ1bmtlciBzZXJ2ZXIuXG4gICAgICovXG4gICAgc3RvcCgpIHtcbiAgICAgICAgZm9yIChjb25zdCByZWxheSBvZiB0aGlzLnJlbGF5cykge1xuICAgICAgICAgICAgcmVsYXkudW5zdWJzY3JpYmUodGhpcy5zdWJJZCk7XG4gICAgICAgICAgICByZWxheS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVsYXlzID0gW107XG4gICAgICAgIHRoaXMuYXV0aGVudGljYXRlZENsaWVudHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZ2V0UHJpdktleSA9IG51bGw7XG4gICAgICAgIGxvZygnQnVua2VyIHNlcnZlciBzdG9wcGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGJ1bmtlcjovLyBjb25uZWN0aW9uIHN0cmluZy5cbiAgICAgKi9cbiAgICBnZXRDb25uZWN0aW9uU3RyaW5nKCkge1xuICAgICAgICBjb25zdCByZWxheVBhcmFtcyA9IHRoaXMucmVsYXlVcmxzLm1hcCh1ID0+IGByZWxheT0ke2VuY29kZVVSSUNvbXBvbmVudCh1KX1gKS5qb2luKCcmJyk7XG4gICAgICAgIHJldHVybiBgYnVua2VyOi8vJHt0aGlzLnVzZXJQdWJrZXl9PyR7cmVsYXlQYXJhbXN9JnNlY3JldD0ke3RoaXMuc2VjcmV0fWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGFuIGluY29taW5nIE5JUC00NiByZXF1ZXN0IGV2ZW50LlxuICAgICAqL1xuICAgIGFzeW5jIF9oYW5kbGVSZXF1ZXN0KGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGNsaWVudFB1YmtleSA9IGV2ZW50LnB1YmtleTtcblxuICAgICAgICBsZXQgcHJpdktleTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByaXZLZXkgPSBhd2FpdCB0aGlzLl9nZXRQcml2S2V5KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZyhgQ2Fubm90IGdldCBwcml2YXRlIGtleSAobG9ja2VkPyk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVyaXZlIGNvbnZlcnNhdGlvbiBrZXkgd2l0aCB0aGUgcmVxdWVzdGluZyBjbGllbnRcbiAgICAgICAgbGV0IGNvbnZlcnNhdGlvbktleTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbktleSA9IG5pcDQ0LnYyLnV0aWxzLmdldENvbnZlcnNhdGlvbktleShwcml2S2V5LCBjbGllbnRQdWJrZXkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2coYEZhaWxlZCB0byBkZXJpdmUgY29udmVyc2F0aW9uIGtleTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWNyeXB0IHRoZSByZXF1ZXN0XG4gICAgICAgIGxldCByZXF1ZXN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGxhaW50ZXh0ID0gbmlwNDQudjIuZGVjcnlwdChldmVudC5jb250ZW50LCBjb252ZXJzYXRpb25LZXkpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IEpTT04ucGFyc2UocGxhaW50ZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nKGBGYWlsZWQgdG8gZGVjcnlwdCByZXF1ZXN0OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0gPSByZXF1ZXN0O1xuICAgICAgICBsb2coYFJlcXVlc3Q6ICR7bWV0aG9kfSAoaWQ9JHtpZH0pIGZyb20gJHtjbGllbnRQdWJrZXkuc2xpY2UoMCwgOCl9Li4uYCk7XG5cbiAgICAgICAgLy8gU2VjdXJpdHk6IHJlamVjdCB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50cyBmb3IgZXZlcnl0aGluZyBleGNlcHQgY29ubmVjdFxuICAgICAgICBpZiAobWV0aG9kICE9PSAnY29ubmVjdCcgJiYgIXRoaXMuYXV0aGVudGljYXRlZENsaWVudHMuaGFzKGNsaWVudFB1YmtleSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXNwb25zZShwcml2S2V5LCBjbGllbnRQdWJrZXksIGNvbnZlcnNhdGlvbktleSwge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogJ1VuYXV0aG9yaXplZDogc2VuZCBjb25uZWN0IGZpcnN0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGF0Y2hcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29ubmVjdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1zWzBdID0gcmVtb3RlIHB1YmtleSAoc2hvdWxkIG1hdGNoIG91cnMpLCBwYXJhbXNbMV0gPSBzZWNyZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50U2VjcmV0ID0gcGFyYW1zWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWNyZXQgJiYgY2xpZW50U2VjcmV0ICE9PSB0aGlzLnNlY3JldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAnSW52YWxpZCBzZWNyZXQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkQ2xpZW50cy5hZGQoY2xpZW50UHVia2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGBDbGllbnQgYXV0aGVudGljYXRlZDogJHtjbGllbnRQdWJrZXkuc2xpY2UoMCwgOCl9Li4uYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnZ2V0X3B1YmxpY19rZXknOlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnVzZXJQdWJrZXk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnc2lnbl9ldmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgPSBKU09OLnBhcnNlKHBhcmFtc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IGZpbmFsaXplRXZlbnQodW5zaWduZWQsIHByaXZLZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnN0cmluZ2lmeShzaWduZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICduaXA0NF9lbmNyeXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlyZFBhcnR5UHVia2V5ID0gcGFyYW1zWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFpbnRleHQgPSBwYXJhbXNbMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNrID0gbmlwNDQudjIudXRpbHMuZ2V0Q29udmVyc2F0aW9uS2V5KHByaXZLZXksIHRoaXJkUGFydHlQdWJrZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuaXA0NC52Mi5lbmNyeXB0KHBsYWludGV4dCwgY2spO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYXNlICduaXA0NF9kZWNyeXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlyZFBhcnR5UHVia2V5ID0gcGFyYW1zWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gcGFyYW1zWzFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjayA9IG5pcDQ0LnYyLnV0aWxzLmdldENvbnZlcnNhdGlvbktleShwcml2S2V5LCB0aGlyZFBhcnR5UHVia2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmlwNDQudjIuZGVjcnlwdChjaXBoZXJ0ZXh0LCBjayk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgJ25pcDA0X2VuY3J5cHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXJkUGFydHlQdWJrZXkgPSBwYXJhbXNbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWludGV4dCA9IHBhcmFtc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgbmlwMDQuZW5jcnlwdE1lc3NhZ2UocGxhaW50ZXh0LCBieXRlc1RvSGV4KHByaXZLZXkpLCB0aGlyZFBhcnR5UHVia2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnbmlwMDRfZGVjcnlwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhpcmRQYXJ0eVB1YmtleSA9IHBhcmFtc1swXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2lwaGVydGV4dCA9IHBhcmFtc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgbmlwMDQuZGVjcnlwdE1lc3NhZ2UoY2lwaGVydGV4dCwgYnl0ZXNUb0hleChwcml2S2V5KSwgdGhpcmRQYXJ0eVB1YmtleSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgJ3BpbmcnOlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAncG9uZyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBgVW5zdXBwb3J0ZWQgbWV0aG9kOiAke21ldGhvZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnJvciA9IGUubWVzc2FnZTtcbiAgICAgICAgICAgIGxvZyhgRXJyb3IgaGFuZGxpbmcgJHttZXRob2R9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXNwb25zZShwcml2S2V5LCBjbGllbnRQdWJrZXksIGNvbnZlcnNhdGlvbktleSwgeyBpZCwgcmVzdWx0LCBlcnJvciB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNyeXB0IGFuZCBwdWJsaXNoIGEgTklQLTQ2IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIGFzeW5jIF9zZW5kUmVzcG9uc2UocHJpdktleSwgY2xpZW50UHVia2V5LCBjb252ZXJzYXRpb25LZXksIHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IG5pcDQ0LnYyLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpLCBjb252ZXJzYXRpb25LZXkpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgZmluYWxpemVFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAyNDEzMyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGVuY3J5cHRlZCxcbiAgICAgICAgICAgIHRhZ3M6IFtbJ3AnLCBjbGllbnRQdWJrZXldXSxcbiAgICAgICAgICAgIGNyZWF0ZWRfYXQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLFxuICAgICAgICB9LCBwcml2S2V5KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlbGF5IG9mIHRoaXMucmVsYXlzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlbGF5LnB1Ymxpc2goZXZlbnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZyhgRmFpbGVkIHRvIHB1Ymxpc2ggcmVzcG9uc2UgdG8gJHtyZWxheS51cmx9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZyhgUmVzcG9uc2Ugc2VudDogJHtyZXNwb25zZS5pZH0gJHtyZXNwb25zZS5lcnJvciA/ICdFUlJPUicgOiAnT0snfWApO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIE5JUC03OCBFbmNyeXB0ZWQgVmF1bHQgUHJvdG9jb2xcbiAqXG4gKiBQdXJlIGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcvcGFyc2luZyBraW5kIDMwMDc4IChwYXJhbWV0ZXJpemVkIHJlcGxhY2VhYmxlKVxuICogZXZlbnRzIHVzZWQgYXMgYW4gZW5jcnlwdGVkIG1hcmtkb3duIGRvY3VtZW50IHZhdWx0LlxuICpcbiAqIGQtdGFnIHByZWZpeCBcIm5vc3Rya2V5OlwiIG5hbWVzcGFjZXMgb3VyIHZhdWx0IGl0ZW1zIGZyb20gb3RoZXIgTklQLTc4IGFwcHMuXG4gKiBSZWxheXMgc2VlIGZpbGUgcGF0aHMgYnV0IG5vdCBjb250ZW50IChOSVAtNDQgZW5jcnlwdGVkIHRvIHNlbGYpLlxuICovXG5cbmNvbnN0IEtJTkRfQVBQX0RBVEEgPSAzMDA3ODtcbmNvbnN0IEtJTkRfREVMRVRJT04gPSA1O1xuY29uc3QgRFRBR19QUkVGSVggPSAnbm9zdHJrZXk6JztcbmNvbnN0IENMSUVOVF9UQUcgPSAnbm9zdHJrZXknO1xuXG4vKipcbiAqIEJ1aWxkIGFuIHVuc2lnbmVkIGtpbmQgMzAwNzggdmF1bHQgZXZlbnQuXG4gKiBDYWxsZXIgbXVzdCBzaWduIChmaW5hbGl6ZUV2ZW50IG9yIGJ1bmtlciBzZXNzaW9uLnNpZ25FdmVudCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBEb2N1bWVudCBwYXRoIChlLmcuIFwibm90ZXMvdG9kby5tZFwiKVxuICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZENvbnRlbnQgLSBOSVAtNDQgZW5jcnlwdGVkIGNvbnRlbnQgc3RyaW5nXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBVbnNpZ25lZCBldmVudCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRWYXVsdEV2ZW50KHBhdGgsIGVuY3J5cHRlZENvbnRlbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBLSU5EX0FQUF9EQVRBLFxuICAgICAgICBjb250ZW50OiBlbmNyeXB0ZWRDb250ZW50LFxuICAgICAgICB0YWdzOiBbXG4gICAgICAgICAgICBbJ2QnLCBgJHtEVEFHX1BSRUZJWH0ke3BhdGh9YF0sXG4gICAgICAgICAgICBbJ2NsaWVudCcsIENMSUVOVF9UQUddLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVkX2F0OiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSxcbiAgICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuIHVuc2lnbmVkIGtpbmQgNSBkZWxldGlvbiBldmVudCAoTklQLTA5KSBmb3IgYSB2YXVsdCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRJZCAtIFRoZSBldmVudCBpZCB0byBkZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRG9jdW1lbnQgcGF0aCAoZm9yIHRoZSBhLXRhZyByZWZlcmVuY2UpXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBVbnNpZ25lZCBkZWxldGlvbiBldmVudCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRWYXVsdERlbGV0aW9uKGV2ZW50SWQsIHBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBLSU5EX0RFTEVUSU9OLFxuICAgICAgICBjb250ZW50OiAndmF1bHQgZG9jdW1lbnQgZGVsZXRlZCcsXG4gICAgICAgIHRhZ3M6IFtcbiAgICAgICAgICAgIFsnZScsIGV2ZW50SWRdLFxuICAgICAgICAgICAgWydhJywgYCR7S0lORF9BUFBfREFUQX06OiR7RFRBR19QUkVGSVh9JHtwYXRofWBdLFxuICAgICAgICBdLFxuICAgICAgICBjcmVhdGVkX2F0OiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSxcbiAgICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgUkVRIGZpbHRlciBmb3IgZmV0Y2hpbmcgYWxsIHZhdWx0IGRvY3VtZW50cyBmb3IgYSBwdWJrZXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHB1YmtleSAtIEhleCBwdWJsaWMga2V5XG4gKiBAcmV0dXJucyB7b2JqZWN0fSBOb3N0ciBSRVEgZmlsdGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFZhdWx0RmlsdGVyKHB1YmtleSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGtpbmRzOiBbS0lORF9BUFBfREFUQV0sXG4gICAgICAgIGF1dGhvcnM6IFtwdWJrZXldLFxuICAgIH07XG59XG5cbi8qKlxuICogUGFyc2UgYSBraW5kIDMwMDc4IGV2ZW50IGludG8gYSB2YXVsdCBkb2N1bWVudCBkZXNjcmlwdG9yLlxuICogUmV0dXJucyBudWxsIGlmIHRoZSBldmVudCBpcyBub3QgYSBub3N0cmtleSB2YXVsdCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBOb3N0ciBldmVudFxuICogQHJldHVybnMge3sgcGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGNyZWF0ZWRBdDogbnVtYmVyLCBldmVudElkOiBzdHJpbmcgfSB8IG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhdWx0RXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2luZCAhPT0gS0lORF9BUFBfREFUQSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkVGFnID0gZXZlbnQudGFncz8uZmluZCh0ID0+IHRbMF0gPT09ICdkJyk7XG4gICAgaWYgKCFkVGFnIHx8ICFkVGFnWzFdPy5zdGFydHNXaXRoKERUQUdfUFJFRklYKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBwYXRoID0gZFRhZ1sxXS5zbGljZShEVEFHX1BSRUZJWC5sZW5ndGgpO1xuICAgIGlmICghcGF0aCkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwYXRoLFxuICAgICAgICBjb250ZW50OiBldmVudC5jb250ZW50LFxuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRfYXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BTVc7QUFOWDtBQUFBO0FBTU8sTUFBSSxVQUFVO0FBQUEsUUFDakIsS0FBSyxFQUFFLFVBQVUsY0FBYyxXQUFXLE9BQU87QUFBQSxRQUNqRCxTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsUUFDVCxRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixVQUFVLFNBQVUsSUFBSTtBQUNwQixjQUFJLE9BQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFDbEQsa0JBQVEsUUFBUSxFQUFFLEtBQUssV0FBWTtBQUFFLGVBQUcsTUFBTSxNQUFNLElBQUk7QUFBQSxVQUFHLENBQUM7QUFBQSxRQUNoRTtBQUFBLE1BQ0o7QUFBQTtBQUFBOzs7QUNoQkE7QUFBQTtBQUFBO0FBQUE7QUFDQSxlQUFTLGFBQWMsR0FBRztBQUN4QixZQUFJO0FBQUUsaUJBQU8sS0FBSyxVQUFVLENBQUM7QUFBQSxRQUFFLFNBQVEsR0FBRztBQUFFLGlCQUFPO0FBQUEsUUFBZTtBQUFBLE1BQ3BFO0FBRUEsYUFBTyxVQUFVO0FBRWpCLGVBQVMsT0FBTyxHQUFHLE1BQU0sTUFBTTtBQUM3QixZQUFJLEtBQU0sUUFBUSxLQUFLLGFBQWM7QUFDckMsWUFBSSxTQUFTO0FBQ2IsWUFBSSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU07QUFDdkMsY0FBSSxNQUFNLEtBQUssU0FBUztBQUN4QixjQUFJLFFBQVEsRUFBRyxRQUFPO0FBQ3RCLGNBQUksVUFBVSxJQUFJLE1BQU0sR0FBRztBQUMzQixrQkFBUSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ2pCLG1CQUFTLFFBQVEsR0FBRyxRQUFRLEtBQUssU0FBUztBQUN4QyxvQkFBUSxLQUFLLElBQUksR0FBRyxLQUFLLEtBQUssQ0FBQztBQUFBLFVBQ2pDO0FBQ0EsaUJBQU8sUUFBUSxLQUFLLEdBQUc7QUFBQSxRQUN6QjtBQUNBLFlBQUksT0FBTyxNQUFNLFVBQVU7QUFDekIsaUJBQU87QUFBQSxRQUNUO0FBQ0EsWUFBSSxTQUFTLEtBQUs7QUFDbEIsWUFBSSxXQUFXLEVBQUcsUUFBTztBQUN6QixZQUFJLE1BQU07QUFDVixZQUFJLElBQUksSUFBSTtBQUNaLFlBQUksVUFBVTtBQUNkLFlBQUksT0FBUSxLQUFLLEVBQUUsVUFBVztBQUM5QixpQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFPO0FBQ3pCLGNBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxNQUFNLElBQUksSUFBSSxNQUFNO0FBQzFDLHNCQUFVLFVBQVUsS0FBSyxVQUFVO0FBQ25DLG9CQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsR0FBRztBQUFBLGNBQzNCLEtBQUs7QUFBQTtBQUFBLGNBQ0wsS0FBSztBQUNILG9CQUFJLEtBQUs7QUFDUDtBQUNGLG9CQUFJLEtBQUssQ0FBQyxLQUFLLEtBQU87QUFDdEIsb0JBQUksVUFBVTtBQUNaLHlCQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0IsdUJBQU8sT0FBTyxLQUFLLENBQUMsQ0FBQztBQUNyQiwwQkFBVSxJQUFJO0FBQ2Q7QUFDQTtBQUFBLGNBQ0YsS0FBSztBQUNILG9CQUFJLEtBQUs7QUFDUDtBQUNGLG9CQUFJLEtBQUssQ0FBQyxLQUFLLEtBQU87QUFDdEIsb0JBQUksVUFBVTtBQUNaLHlCQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0IsdUJBQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqQywwQkFBVSxJQUFJO0FBQ2Q7QUFDQTtBQUFBLGNBQ0YsS0FBSztBQUFBO0FBQUEsY0FDTCxLQUFLO0FBQUE7QUFBQSxjQUNMLEtBQUs7QUFDSCxvQkFBSSxLQUFLO0FBQ1A7QUFDRixvQkFBSSxLQUFLLENBQUMsTUFBTSxPQUFXO0FBQzNCLG9CQUFJLFVBQVU7QUFDWix5QkFBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNCLG9CQUFJLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFDeEIsb0JBQUksU0FBUyxVQUFVO0FBQ3JCLHlCQUFPLE1BQU8sS0FBSyxDQUFDLElBQUk7QUFDeEIsNEJBQVUsSUFBSTtBQUNkO0FBQ0E7QUFBQSxnQkFDRjtBQUNBLG9CQUFJLFNBQVMsWUFBWTtBQUN2Qix5QkFBTyxLQUFLLENBQUMsRUFBRSxRQUFRO0FBQ3ZCLDRCQUFVLElBQUk7QUFDZDtBQUNBO0FBQUEsZ0JBQ0Y7QUFDQSx1QkFBTyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLDBCQUFVLElBQUk7QUFDZDtBQUNBO0FBQUEsY0FDRixLQUFLO0FBQ0gsb0JBQUksS0FBSztBQUNQO0FBQ0Ysb0JBQUksVUFBVTtBQUNaLHlCQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0IsdUJBQU8sT0FBTyxLQUFLLENBQUMsQ0FBQztBQUNyQiwwQkFBVSxJQUFJO0FBQ2Q7QUFDQTtBQUFBLGNBQ0YsS0FBSztBQUNILG9CQUFJLFVBQVU7QUFDWix5QkFBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNCLHVCQUFPO0FBQ1AsMEJBQVUsSUFBSTtBQUNkO0FBQ0E7QUFDQTtBQUFBLFlBQ0o7QUFDQSxjQUFFO0FBQUEsVUFDSjtBQUNBLFlBQUU7QUFBQSxRQUNKO0FBQ0EsWUFBSSxZQUFZO0FBQ2QsaUJBQU87QUFBQSxpQkFDQSxVQUFVLE1BQU07QUFDdkIsaUJBQU8sRUFBRSxNQUFNLE9BQU87QUFBQSxRQUN4QjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBQUE7QUFBQTs7O0FDNUdBO0FBQUE7QUFBQTtBQUFBO0FBRUEsVUFBTSxTQUFTO0FBRWYsYUFBTyxVQUFVQTtBQUVqQixVQUFNLFdBQVcsdUJBQXVCLEVBQUUsV0FBVyxDQUFDO0FBQ3RELFVBQU0saUJBQWlCO0FBQUEsUUFDckIsZ0JBQWdCO0FBQUEsUUFDaEIsaUJBQWlCO0FBQUEsUUFDakIsdUJBQXVCO0FBQUEsUUFDdkIsd0JBQXdCO0FBQUEsUUFDeEIscUJBQXFCO0FBQUEsUUFDckIsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsY0FBYztBQUFBLE1BQ2hCO0FBQ0EsZUFBUyxhQUFjLE9BQU9DLFNBQVE7QUFDcEMsZUFBTyxVQUFVLFdBQ2IsV0FDQUEsUUFBTyxPQUFPLE9BQU8sS0FBSztBQUFBLE1BQ2hDO0FBQ0EsVUFBTSx3QkFBd0IsdUJBQU8sZUFBZTtBQUNwRCxVQUFNLGtCQUFrQix1QkFBTyxnQkFBZ0I7QUFFL0MsVUFBTSxpQkFBaUI7QUFBQSxRQUNyQixPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsUUFDUCxNQUFNO0FBQUEsUUFDTixNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVMsa0JBQW1CLGNBQWMsYUFBYTtBQUNyRCxjQUFNLFdBQVc7QUFBQSxVQUNmLFFBQVE7QUFBQSxVQUNSLFFBQVEsYUFBYSxlQUFlO0FBQUEsUUFDdEM7QUFDQSxvQkFBWSxlQUFlLElBQUk7QUFBQSxNQUNqQztBQUVBLGVBQVMsc0JBQXVCQSxTQUFRLFFBQVEsT0FBTztBQUNyRCxjQUFNLGVBQWUsQ0FBQztBQUN0QixlQUFPLFFBQVEsV0FBUztBQUN0Qix1QkFBYSxLQUFLLElBQUksTUFBTSxLQUFLLElBQUksTUFBTSxLQUFLLElBQUssU0FBUyxLQUFLLEtBQUssU0FBUyxlQUFlLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFBQSxRQUN0SCxDQUFDO0FBQ0QsUUFBQUEsUUFBTyxxQkFBcUIsSUFBSTtBQUFBLE1BQ2xDO0FBRUEsZUFBUyxnQkFBaUIsV0FBVyxhQUFhO0FBQ2hELFlBQUksTUFBTSxRQUFRLFNBQVMsR0FBRztBQUM1QixnQkFBTSxjQUFjLFVBQVUsT0FBTyxTQUFVLEdBQUc7QUFDaEQsbUJBQU8sTUFBTTtBQUFBLFVBQ2YsQ0FBQztBQUNELGlCQUFPO0FBQUEsUUFDVCxXQUFXLGNBQWMsTUFBTTtBQUM3QixpQkFBTyxPQUFPLEtBQUssV0FBVztBQUFBLFFBQ2hDO0FBRUEsZUFBTztBQUFBLE1BQ1Q7QUFFQSxlQUFTRCxNQUFNLE1BQU07QUFDbkIsZUFBTyxRQUFRLENBQUM7QUFDaEIsYUFBSyxVQUFVLEtBQUssV0FBVyxDQUFDO0FBRWhDLGNBQU1FLFlBQVcsS0FBSyxRQUFRO0FBQzlCLFlBQUlBLGFBQVksT0FBT0EsVUFBUyxTQUFTLFlBQVk7QUFBRSxnQkFBTSxNQUFNLGlEQUFpRDtBQUFBLFFBQUU7QUFFdEgsY0FBTSxRQUFRLEtBQUssUUFBUSxTQUFTO0FBQ3BDLFlBQUksS0FBSyxRQUFRLE1BQU8sTUFBSyxRQUFRLFdBQVc7QUFDaEQsY0FBTSxjQUFjLEtBQUssZUFBZSxDQUFDO0FBQ3pDLGNBQU0sWUFBWSxnQkFBZ0IsS0FBSyxRQUFRLFdBQVcsV0FBVztBQUNyRSxZQUFJLGtCQUFrQixLQUFLLFFBQVE7QUFFbkMsWUFDRSxNQUFNLFFBQVEsS0FBSyxRQUFRLFNBQVMsS0FDcEMsS0FBSyxRQUFRLFVBQVUsUUFBUSxxQkFBcUIsSUFBSSxHQUN4RCxtQkFBa0I7QUFFcEIsY0FBTSxlQUFlLE9BQU8sS0FBSyxLQUFLLGdCQUFnQixDQUFDLENBQUM7QUFDeEQsY0FBTSxTQUFTLENBQUMsU0FBUyxTQUFTLFFBQVEsUUFBUSxTQUFTLE9BQU8sRUFBRSxPQUFPLFlBQVk7QUFFdkYsWUFBSSxPQUFPLFVBQVUsWUFBWTtBQUMvQixpQkFBTyxRQUFRLFNBQVVDLFFBQU87QUFDOUIsa0JBQU1BLE1BQUssSUFBSTtBQUFBLFVBQ2pCLENBQUM7QUFBQSxRQUNIO0FBQ0EsWUFBSSxLQUFLLFlBQVksU0FBUyxLQUFLLFFBQVEsU0FBVSxNQUFLLFFBQVE7QUFDbEUsY0FBTSxRQUFRLEtBQUssU0FBUztBQUM1QixjQUFNRixVQUFTLE9BQU8sT0FBTyxLQUFLO0FBQ2xDLFlBQUksQ0FBQ0EsUUFBTyxJQUFLLENBQUFBLFFBQU8sTUFBTTtBQUU5Qiw4QkFBc0JBLFNBQVEsUUFBUSxLQUFLO0FBRTNDLDBCQUFrQixDQUFDLEdBQUdBLE9BQU07QUFFNUIsZUFBTyxlQUFlQSxTQUFRLFlBQVk7QUFBQSxVQUN4QyxLQUFLO0FBQUEsUUFDUCxDQUFDO0FBQ0QsZUFBTyxlQUFlQSxTQUFRLFNBQVM7QUFBQSxVQUNyQyxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsUUFDUCxDQUFDO0FBRUQsY0FBTSxVQUFVO0FBQUEsVUFDZCxVQUFBQztBQUFBLFVBQ0E7QUFBQSxVQUNBLFVBQVUsS0FBSyxRQUFRO0FBQUEsVUFDdkIsc0JBQXNCLEtBQUssUUFBUTtBQUFBLFVBQ25DLFlBQVksS0FBSyxRQUFRO0FBQUEsVUFDekIsY0FBYyxLQUFLLFFBQVE7QUFBQSxVQUMzQjtBQUFBLFVBQ0EsV0FBVyxnQkFBZ0IsSUFBSTtBQUFBLFVBQy9CLFlBQVksS0FBSyxjQUFjO0FBQUEsVUFDL0IsU0FBUyxLQUFLLFdBQVc7QUFBQSxRQUMzQjtBQUNBLFFBQUFELFFBQU8sU0FBUyxVQUFVLElBQUk7QUFDOUIsUUFBQUEsUUFBTyxRQUFRO0FBRWYsUUFBQUEsUUFBTyxpQkFBaUIsU0FBVUUsUUFBTztBQUN2QyxjQUFJLENBQUMsS0FBSyxPQUFPLE9BQU9BLE1BQUssR0FBRztBQUM5QixtQkFBTztBQUFBLFVBQ1Q7QUFFQSxpQkFBTyxLQUFLLE9BQU8sT0FBT0EsTUFBSyxLQUFLLEtBQUssT0FBTyxPQUFPLEtBQUssS0FBSztBQUFBLFFBQ25FO0FBQ0EsUUFBQUYsUUFBTyxrQkFBa0JBLFFBQU8sa0JBQ2hDQSxRQUFPLE9BQU9BLFFBQU8sY0FBY0EsUUFBTyxLQUMxQ0EsUUFBTyxrQkFBa0JBLFFBQU8sT0FDaENBLFFBQU8sc0JBQXNCQSxRQUFPLGlCQUNwQ0EsUUFBTyxxQkFBcUJBLFFBQU8sWUFDbkNBLFFBQU8sZ0JBQWdCQSxRQUFPLGFBQzlCQSxRQUFPLFFBQVFBLFFBQU8sUUFBUTtBQUM5QixRQUFBQSxRQUFPLGNBQWM7QUFDckIsUUFBQUEsUUFBTyxhQUFhO0FBQ3BCLFFBQUFBLFFBQU8sbUJBQW1CO0FBQzFCLFFBQUFBLFFBQU8sUUFBUSxZQUFhLE1BQU07QUFBRSxpQkFBTyxNQUFNLEtBQUssTUFBTSxTQUFTLEdBQUcsSUFBSTtBQUFBLFFBQUU7QUFFOUUsWUFBSUMsVUFBVSxDQUFBRCxRQUFPLFlBQVksb0JBQW9CO0FBRXJELGlCQUFTLGNBQWU7QUFDdEIsaUJBQU8sYUFBYSxLQUFLLE9BQU8sSUFBSTtBQUFBLFFBQ3RDO0FBRUEsaUJBQVMsV0FBWTtBQUNuQixpQkFBTyxLQUFLO0FBQUEsUUFDZDtBQUNBLGlCQUFTLFNBQVVFLFFBQU87QUFDeEIsY0FBSUEsV0FBVSxZQUFZLENBQUMsS0FBSyxPQUFPLE9BQU9BLE1BQUssR0FBRztBQUNwRCxrQkFBTSxNQUFNLG1CQUFtQkEsTUFBSztBQUFBLFVBQ3RDO0FBQ0EsZUFBSyxTQUFTQTtBQUVkLGNBQUksTUFBTSxTQUFTRixTQUFRLE9BQU87QUFDbEMsY0FBSSxNQUFNLFNBQVNBLFNBQVEsT0FBTztBQUNsQyxjQUFJLE1BQU0sU0FBU0EsU0FBUSxNQUFNO0FBQ2pDLGNBQUksTUFBTSxTQUFTQSxTQUFRLE1BQU07QUFDakMsY0FBSSxNQUFNLFNBQVNBLFNBQVEsT0FBTztBQUNsQyxjQUFJLE1BQU0sU0FBU0EsU0FBUSxPQUFPO0FBRWxDLHVCQUFhLFFBQVEsQ0FBQ0UsV0FBVTtBQUM5QixnQkFBSSxNQUFNLFNBQVNGLFNBQVFFLE1BQUs7QUFBQSxVQUNsQyxDQUFDO0FBQUEsUUFDSDtBQUVBLGlCQUFTLE1BQU9DLFVBQVMsVUFBVSxjQUFjO0FBQy9DLGNBQUksQ0FBQyxVQUFVO0FBQ2Isa0JBQU0sSUFBSSxNQUFNLGlDQUFpQztBQUFBLFVBQ25EO0FBQ0EseUJBQWUsZ0JBQWdCLENBQUM7QUFDaEMsY0FBSSxhQUFhLFNBQVMsYUFBYTtBQUNyQyx5QkFBYSxjQUFjLFNBQVM7QUFBQSxVQUN0QztBQUNBLGdCQUFNLDBCQUEwQixhQUFhO0FBQzdDLGNBQUksYUFBYSx5QkFBeUI7QUFDeEMsZ0JBQUksbUJBQW1CLE9BQU8sT0FBTyxDQUFDLEdBQUcsYUFBYSx1QkFBdUI7QUFDN0UsZ0JBQUksaUJBQWlCLEtBQUssUUFBUSxjQUFjLE9BQzVDLE9BQU8sS0FBSyxnQkFBZ0IsSUFDNUI7QUFDSixtQkFBTyxTQUFTO0FBQ2hCLDZCQUFpQixDQUFDLFFBQVEsR0FBRyxnQkFBZ0Isa0JBQWtCLEtBQUssZ0JBQWdCO0FBQUEsVUFDdEY7QUFDQSxtQkFBUyxNQUFPLFFBQVE7QUFDdEIsaUJBQUssZUFBZSxPQUFPLGNBQWMsS0FBSztBQUc5QyxpQkFBSyxXQUFXO0FBRWhCLGdCQUFJLGtCQUFrQjtBQUNwQixtQkFBSyxjQUFjO0FBQ25CLG1CQUFLLGFBQWE7QUFBQSxZQUNwQjtBQUNBLGdCQUFJRixXQUFVO0FBQ1osbUJBQUssWUFBWTtBQUFBLGdCQUNmLENBQUMsRUFBRSxPQUFPLE9BQU8sVUFBVSxVQUFVLFFBQVE7QUFBQSxjQUMvQztBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQ0EsZ0JBQU0sWUFBWTtBQUNsQixnQkFBTSxZQUFZLElBQUksTUFBTSxJQUFJO0FBR2hDLDRCQUFrQixNQUFNLFNBQVM7QUFDakMsb0JBQVUsUUFBUSxZQUFhLE1BQU07QUFBRSxtQkFBTyxNQUFNLEtBQUssTUFBTUUsVUFBUyxHQUFHLElBQUk7QUFBQSxVQUFFO0FBRWpGLG9CQUFVLFFBQVEsYUFBYSxTQUFTLEtBQUs7QUFDN0MsVUFBQUEsU0FBUSxRQUFRLFNBQVM7QUFFekIsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBT0g7QUFBQSxNQUNUO0FBRUEsZUFBUyxVQUFXLE1BQU07QUFDeEIsY0FBTSxlQUFlLEtBQUssZ0JBQWdCLENBQUM7QUFFM0MsY0FBTSxTQUFTLE9BQU8sT0FBTyxDQUFDLEdBQUdELE1BQUssT0FBTyxRQUFRLFlBQVk7QUFDakUsY0FBTSxTQUFTLE9BQU8sT0FBTyxDQUFDLEdBQUdBLE1BQUssT0FBTyxRQUFRLGFBQWEsWUFBWSxDQUFDO0FBRS9FLGVBQU87QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsZUFBUyxhQUFjLEtBQUs7QUFDMUIsY0FBTSxXQUFXLENBQUM7QUFDbEIsZUFBTyxLQUFLLEdBQUcsRUFBRSxRQUFRLFNBQVUsS0FBSztBQUN0QyxtQkFBUyxJQUFJLEdBQUcsQ0FBQyxJQUFJO0FBQUEsUUFDdkIsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNUO0FBRUEsTUFBQUEsTUFBSyxTQUFTO0FBQUEsUUFDWixRQUFRO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsVUFDUCxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFFBQ047QUFBQSxNQUNGO0FBRUEsTUFBQUEsTUFBSyxpQkFBaUI7QUFDdEIsTUFBQUEsTUFBSyxtQkFBbUIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLFVBQVUsV0FBVyxVQUFVLFFBQVEsQ0FBQztBQUVwRixlQUFTLGdCQUFpQkMsU0FBUTtBQUNoQyxjQUFNLFdBQVcsQ0FBQztBQUNsQixZQUFJQSxRQUFPLFVBQVU7QUFDbkIsbUJBQVMsS0FBS0EsUUFBTyxRQUFRO0FBQUEsUUFDL0I7QUFHQSxZQUFJLFlBQVlBLFFBQU8sZUFBZTtBQUN0QyxlQUFPLFVBQVUsUUFBUTtBQUN2QixzQkFBWSxVQUFVO0FBQ3RCLGNBQUksVUFBVSxPQUFPLFVBQVU7QUFDN0IscUJBQVMsS0FBSyxVQUFVLE9BQU8sUUFBUTtBQUFBLFVBQ3pDO0FBQUEsUUFDRjtBQUVBLGVBQU8sU0FBUyxRQUFRO0FBQUEsTUFDMUI7QUFFQSxlQUFTLElBQUtJLE9BQU0sTUFBTSxZQUFZLE9BQU87QUFFM0MsZUFBTyxlQUFlQSxPQUFNLE9BQU87QUFBQSxVQUNqQyxPQUFRLGFBQWFBLE1BQUssT0FBTyxVQUFVLElBQUksYUFBYSxPQUFPLFVBQVUsSUFDekUsT0FDQSxXQUFXLHFCQUFxQixFQUFFLEtBQUs7QUFBQSxVQUMzQyxVQUFVO0FBQUEsVUFDVixZQUFZO0FBQUEsVUFDWixjQUFjO0FBQUEsUUFDaEIsQ0FBQztBQUVELFlBQUlBLE1BQUssS0FBSyxNQUFNLE1BQU07QUFDeEIsY0FBSSxDQUFDLEtBQUssU0FBVTtBQUVwQixnQkFBTSxnQkFBZ0IsS0FBSyxTQUFTLFNBQVNBLE1BQUs7QUFDbEQsZ0JBQU0sZ0JBQWdCLGFBQWEsZUFBZSxVQUFVO0FBQzVELGdCQUFNLGNBQWMsYUFBYSxPQUFPLFVBQVU7QUFDbEQsY0FBSSxjQUFjLGNBQWU7QUFBQSxRQUNuQztBQUdBLFFBQUFBLE1BQUssS0FBSyxJQUFJLFdBQVdBLE9BQU0sTUFBTSxZQUFZLEtBQUs7QUFHdEQsY0FBTSxXQUFXLGdCQUFnQkEsS0FBSTtBQUNyQyxZQUFJLFNBQVMsV0FBVyxHQUFHO0FBRXpCO0FBQUEsUUFDRjtBQUNBLFFBQUFBLE1BQUssS0FBSyxJQUFJLDJCQUEyQixVQUFVQSxNQUFLLEtBQUssQ0FBQztBQUFBLE1BQ2hFO0FBRUEsZUFBUywyQkFBNEIsVUFBVSxTQUFTO0FBQ3RELGVBQU8sV0FBWTtBQUNqQixpQkFBTyxRQUFRLE1BQU0sTUFBTSxDQUFDLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUFBLFFBQ3hEO0FBQUEsTUFDRjtBQUVBLGVBQVMsV0FBWUEsT0FBTSxNQUFNLFlBQVksT0FBTztBQUNsRCxlQUFRLDBCQUFVLE9BQU87QUFDdkIsaUJBQU8sU0FBUyxNQUFPO0FBQ3JCLGtCQUFNLEtBQUssS0FBSyxVQUFVO0FBQzFCLGtCQUFNLE9BQU8sSUFBSSxNQUFNLFVBQVUsTUFBTTtBQUN2QyxrQkFBTSxRQUFTLE9BQU8sa0JBQWtCLE9BQU8sZUFBZSxJQUFJLE1BQU0sV0FBWSxXQUFXO0FBQy9GLHFCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxJQUFLLE1BQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUUzRCxnQkFBSSxtQkFBbUI7QUFDdkIsZ0JBQUksS0FBSyxXQUFXO0FBQ2xCLCtCQUFpQixNQUFNLEtBQUssWUFBWSxLQUFLLGFBQWEsS0FBSyxnQkFBZ0I7QUFDL0UsaUNBQW1CO0FBQUEsWUFDckI7QUFDQSxnQkFBSSxLQUFLLFlBQVksS0FBSyxZQUFZO0FBQ3BDLG9CQUFNLE1BQU0sU0FBUyxNQUFNLE9BQU8sTUFBTSxJQUFJLElBQUk7QUFDaEQsa0JBQUksS0FBSyxnQkFBZ0IsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLFVBQVU7QUFDdEYsb0JBQUk7QUFDRix3QkFBTSxTQUFTLGtCQUFrQjtBQUNqQyxzQkFBSSxPQUFRLEtBQUksQ0FBQyxFQUFFLFNBQVM7QUFBQSxnQkFDOUIsU0FBUyxHQUFHO0FBQUEsZ0JBQUM7QUFBQSxjQUNmO0FBQ0Esb0JBQU0sS0FBSyxPQUFPLEdBQUcsR0FBRztBQUFBLFlBQzFCLE9BQU87QUFDTCxrQkFBSSxLQUFLLGNBQWM7QUFDckIsb0JBQUk7QUFDRix3QkFBTSxTQUFTLGtCQUFrQjtBQUNqQyxzQkFBSSxPQUFRLE1BQUssS0FBSyxNQUFNO0FBQUEsZ0JBQzlCLFNBQVMsR0FBRztBQUFBLGdCQUFDO0FBQUEsY0FDZjtBQUNBLG9CQUFNLE1BQU0sT0FBTyxJQUFJO0FBQUEsWUFDekI7QUFFQSxnQkFBSSxLQUFLLFVBQVU7QUFDakIsb0JBQU0sZ0JBQWdCLEtBQUssU0FBUyxTQUFTQSxNQUFLO0FBQ2xELG9CQUFNLGdCQUFnQixhQUFhLGVBQWUsVUFBVTtBQUM1RCxvQkFBTSxjQUFjLGFBQWEsT0FBTyxVQUFVO0FBQ2xELGtCQUFJLGNBQWMsY0FBZTtBQUNqQyx1QkFBUyxNQUFNO0FBQUEsZ0JBQ2I7QUFBQSxnQkFDQSxhQUFhO0FBQUEsZ0JBQ2I7QUFBQSxnQkFDQTtBQUFBLGdCQUNBLGVBQWUsV0FBVyxPQUFPLE9BQU8sS0FBSyxTQUFTLFNBQVNBLE1BQUssTUFBTTtBQUFBLGdCQUMxRSxNQUFNLEtBQUssU0FBUztBQUFBLGdCQUNwQixLQUFLLGFBQWFBLE1BQUssUUFBUSxVQUFVO0FBQUEsY0FDM0MsR0FBRyxNQUFNLGdCQUFnQjtBQUFBLFlBQzNCO0FBQUEsVUFDRjtBQUFBLFFBQ0YsR0FBR0EsTUFBSyxxQkFBcUIsRUFBRSxLQUFLLENBQUM7QUFBQSxNQUN2QztBQUVBLGVBQVMsU0FBVUosU0FBUSxPQUFPLE1BQU0sSUFBSSxNQUFNO0FBQ2hELGNBQU07QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLEtBQUsscUJBQXFCLENBQUMsUUFBUTtBQUFBLFFBQ3JDLElBQUksS0FBSyxjQUFjLENBQUM7QUFDeEIsY0FBTSxhQUFhLEtBQUssTUFBTTtBQUM5QixZQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ3RCLGNBQU0sWUFBWSxDQUFDO0FBRW5CLFlBQUksT0FBT0EsUUFBTyxjQUFjLEtBQUs7QUFDckMsWUFBSSxNQUFNLEVBQUcsT0FBTTtBQUVuQixZQUFJLElBQUk7QUFDTixvQkFBVSxPQUFPO0FBQUEsUUFDbkI7QUFFQSxZQUFJLGdCQUFnQjtBQUNsQixnQkFBTSxpQkFBaUIsZUFBZSxPQUFPQSxRQUFPLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFDeEUsaUJBQU8sT0FBTyxXQUFXLGNBQWM7QUFBQSxRQUN6QyxPQUFPO0FBQ0wsb0JBQVUsUUFBUUEsUUFBTyxPQUFPLE9BQU8sS0FBSztBQUFBLFFBQzlDO0FBRUEsWUFBSSxLQUFLLHNCQUFzQjtBQUM3QixjQUFJLFFBQVEsUUFBUSxPQUFPLFFBQVEsVUFBVTtBQUMzQyxtQkFBTyxTQUFTLE9BQU8sV0FBVyxDQUFDLE1BQU0sVUFBVTtBQUNqRCxxQkFBTyxPQUFPLFdBQVcsV0FBVyxNQUFNLENBQUM7QUFBQSxZQUM3QztBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxxQkFBcUIsbUJBQW1CLFNBQVM7QUFDdkQsaUJBQU8sQ0FBQyxvQkFBb0IsR0FBRyxVQUFVO0FBQUEsUUFDM0MsT0FBTztBQUVMLGNBQUksUUFBUSxRQUFRLE9BQU8sUUFBUSxVQUFVO0FBQzNDLG1CQUFPLFNBQVMsT0FBTyxXQUFXLENBQUMsTUFBTSxVQUFVO0FBQ2pELHFCQUFPLE9BQU8sV0FBVyxXQUFXLE1BQU0sQ0FBQztBQUFBLFlBQzdDO0FBQ0Esa0JBQU0sV0FBVyxTQUFTLE9BQU8sV0FBVyxNQUFNLEdBQUcsVUFBVSxJQUFJO0FBQUEsVUFDckUsV0FBVyxPQUFPLFFBQVEsU0FBVSxPQUFNLE9BQU8sV0FBVyxNQUFNLEdBQUcsVUFBVTtBQUMvRSxjQUFJLFFBQVEsT0FBVyxXQUFVLEtBQUssVUFBVSxJQUFJO0FBRXBELGdCQUFNLHFCQUFxQixtQkFBbUIsU0FBUztBQUN2RCxpQkFBTyxDQUFDLGtCQUFrQjtBQUFBLFFBQzVCO0FBQUEsTUFDRjtBQUVBLGVBQVMsaUJBQWtCLE1BQU0sV0FBVyxhQUFhLGlCQUFpQjtBQUN4RSxtQkFBVyxLQUFLLE1BQU07QUFDcEIsY0FBSSxtQkFBbUIsS0FBSyxDQUFDLGFBQWEsT0FBTztBQUMvQyxpQkFBSyxDQUFDLElBQUlELE1BQUssZUFBZSxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQUEsVUFDM0MsV0FBVyxPQUFPLEtBQUssQ0FBQyxNQUFNLFlBQVksQ0FBQyxNQUFNLFFBQVEsS0FBSyxDQUFDLENBQUMsS0FBSyxXQUFXO0FBQzlFLHVCQUFXLEtBQUssS0FBSyxDQUFDLEdBQUc7QUFDdkIsa0JBQUksVUFBVSxRQUFRLENBQUMsSUFBSSxNQUFNLEtBQUssYUFBYTtBQUNqRCxxQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUFBLGNBQ3hDO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLGVBQVMsU0FBVUMsU0FBUSxNQUFNLE1BQU0sbUJBQW1CLE9BQU87QUFDL0QsY0FBTSxPQUFPLEtBQUs7QUFDbEIsY0FBTSxLQUFLLEtBQUs7QUFDaEIsY0FBTSxjQUFjLEtBQUs7QUFDekIsY0FBTSxjQUFjLEtBQUs7QUFDekIsY0FBTSxNQUFNLEtBQUs7QUFDakIsY0FBTSxXQUFXQSxRQUFPLFVBQVU7QUFFbEMsWUFBSSxDQUFDLGtCQUFrQjtBQUNyQjtBQUFBLFlBQ0U7QUFBQSxZQUNBQSxRQUFPLGNBQWMsT0FBTyxLQUFLQSxRQUFPLFdBQVc7QUFBQSxZQUNuREEsUUFBTztBQUFBLFlBQ1BBLFFBQU8scUJBQXFCLFNBQVksT0FBT0EsUUFBTztBQUFBLFVBQ3hEO0FBQUEsUUFDRjtBQUVBLFFBQUFBLFFBQU8sVUFBVSxLQUFLO0FBQ3RCLFFBQUFBLFFBQU8sVUFBVSxXQUFXLEtBQUssT0FBTyxTQUFVLEtBQUs7QUFFckQsaUJBQU8sU0FBUyxRQUFRLEdBQUcsTUFBTTtBQUFBLFFBQ25DLENBQUM7QUFFRCxRQUFBQSxRQUFPLFVBQVUsTUFBTSxRQUFRO0FBQy9CLFFBQUFBLFFBQU8sVUFBVSxNQUFNLFFBQVE7QUFFL0IsYUFBSyxhQUFhQSxRQUFPLFdBQVcsR0FBRztBQUV2QyxRQUFBQSxRQUFPLFlBQVksb0JBQW9CLFFBQVE7QUFBQSxNQUNqRDtBQUVBLGVBQVMsb0JBQXFCLFVBQVU7QUFDdEMsZUFBTztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osVUFBVSxDQUFDO0FBQUEsVUFDWCxVQUFVLFlBQVksQ0FBQztBQUFBLFVBQ3ZCLE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFO0FBQUEsUUFDL0I7QUFBQSxNQUNGO0FBRUEsZUFBUyxXQUFZLEtBQUs7QUFDeEIsY0FBTSxNQUFNO0FBQUEsVUFDVixNQUFNLElBQUksWUFBWTtBQUFBLFVBQ3RCLEtBQUssSUFBSTtBQUFBLFVBQ1QsT0FBTyxJQUFJO0FBQUEsUUFDYjtBQUNBLG1CQUFXLE9BQU8sS0FBSztBQUNyQixjQUFJLElBQUksR0FBRyxNQUFNLFFBQVc7QUFDMUIsZ0JBQUksR0FBRyxJQUFJLElBQUksR0FBRztBQUFBLFVBQ3BCO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxnQkFBaUIsTUFBTTtBQUM5QixZQUFJLE9BQU8sS0FBSyxjQUFjLFlBQVk7QUFDeEMsaUJBQU8sS0FBSztBQUFBLFFBQ2Q7QUFDQSxZQUFJLEtBQUssY0FBYyxPQUFPO0FBQzVCLGlCQUFPO0FBQUEsUUFDVDtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxPQUFRO0FBQUUsZUFBTyxDQUFDO0FBQUEsTUFBRTtBQUM3QixlQUFTLFlBQWEsR0FBRztBQUFFLGVBQU87QUFBQSxNQUFFO0FBQ3BDLGVBQVMsT0FBUTtBQUFBLE1BQUM7QUFFbEIsZUFBUyxXQUFZO0FBQUUsZUFBTztBQUFBLE1BQU07QUFDcEMsZUFBUyxZQUFhO0FBQUUsZUFBTyxLQUFLLElBQUk7QUFBQSxNQUFFO0FBQzFDLGVBQVMsV0FBWTtBQUFFLGVBQU8sS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLEdBQU07QUFBQSxNQUFFO0FBQzlELGVBQVMsVUFBVztBQUFFLGVBQU8sSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLEVBQUUsWUFBWTtBQUFBLE1BQUU7QUFJaEUsZUFBUyx5QkFBMEI7QUFDakMsaUJBQVMsS0FBTSxHQUFHO0FBQUUsaUJBQU8sT0FBTyxNQUFNLGVBQWU7QUFBQSxRQUFFO0FBQ3pELFlBQUk7QUFDRixjQUFJLE9BQU8sZUFBZSxZQUFhLFFBQU87QUFDOUMsaUJBQU8sZUFBZSxPQUFPLFdBQVcsY0FBYztBQUFBLFlBQ3BELEtBQUssV0FBWTtBQUNmLHFCQUFPLE9BQU8sVUFBVTtBQUN4QixxQkFBUSxLQUFLLGFBQWE7QUFBQSxZQUM1QjtBQUFBLFlBQ0EsY0FBYztBQUFBLFVBQ2hCLENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1QsU0FBUyxHQUFHO0FBQ1YsaUJBQU8sS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQztBQUFBLFFBQ3REO0FBQUEsTUFDRjtBQUdBLGFBQU8sUUFBUSxVQUFVRDtBQUN6QixhQUFPLFFBQVEsT0FBT0E7QUFJdEIsZUFBUyxvQkFBcUI7QUFDNUIsY0FBTSxRQUFTLElBQUksTUFBTSxFQUFHO0FBQzVCLFlBQUksQ0FBQyxNQUFPLFFBQU87QUFDbkIsY0FBTSxRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQzlCLGlCQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ3JDLGdCQUFNLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSztBQUV4QixjQUFJLDRFQUE0RSxLQUFLLENBQUMsRUFBRztBQUN6RixjQUFJLEVBQUUsUUFBUSxZQUFZLE1BQU0sR0FBSTtBQUNwQyxjQUFJLEVBQUUsUUFBUSxlQUFlLE1BQU0sR0FBSTtBQUN2QyxjQUFJLEVBQUUsUUFBUSxjQUFjLE1BQU0sR0FBSTtBQUV0QyxjQUFJLElBQUksRUFBRSxNQUFNLHVCQUF1QjtBQUN2QyxjQUFJLENBQUMsRUFBRyxLQUFJLEVBQUUsTUFBTSx3QkFBd0I7QUFDNUMsY0FBSSxHQUFHO0FBQ0wsa0JBQU0sT0FBTyxFQUFFLENBQUM7QUFDaEIsa0JBQU0sT0FBTyxFQUFFLENBQUM7QUFDaEIsa0JBQU0sTUFBTSxFQUFFLENBQUM7QUFDZixtQkFBTyxPQUFPLE1BQU0sT0FBTyxNQUFNO0FBQUEsVUFDbkM7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFBQTtBQUFBOzs7QUNsaUJBO0FBQUE7QUFBQTtBQUFBLGFBQU8sVUFBVSxDQUFDO0FBQUE7QUFBQTs7O0FDQWxCO0FBQUE7QUFBQTtBQUFBO0FBQ0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsVUFBVSxRQUFRLFNBQVM7QUFDbkMsVUFBTSxXQUFXO0FBQ2pCLFVBQU0sZUFBZSxDQUFDO0FBQ3RCLGVBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDdEMsY0FBTSxJQUFJLFNBQVMsT0FBTyxDQUFDO0FBQzNCLHFCQUFhLENBQUMsSUFBSTtBQUFBLE1BQ3RCO0FBQ0EsZUFBUyxZQUFZLEtBQUs7QUFDdEIsY0FBTSxJQUFJLE9BQU87QUFDakIsZ0JBQVUsTUFBTSxhQUFjLElBQ3pCLEVBQUcsS0FBSyxJQUFLLEtBQUssWUFDbEIsRUFBRyxLQUFLLElBQUssS0FBSyxZQUNsQixFQUFHLEtBQUssSUFBSyxLQUFLLFlBQ2xCLEVBQUcsS0FBSyxJQUFLLEtBQUssYUFDbEIsRUFBRyxLQUFLLElBQUssS0FBSztBQUFBLE1BQzNCO0FBQ0EsZUFBUyxVQUFVLFFBQVE7QUFDdkIsWUFBSSxNQUFNO0FBQ1YsaUJBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEVBQUUsR0FBRztBQUNwQyxnQkFBTSxJQUFJLE9BQU8sV0FBVyxDQUFDO0FBQzdCLGNBQUksSUFBSSxNQUFNLElBQUk7QUFDZCxtQkFBTyxxQkFBcUIsU0FBUztBQUN6QyxnQkFBTSxZQUFZLEdBQUcsSUFBSyxLQUFLO0FBQUEsUUFDbkM7QUFDQSxjQUFNLFlBQVksR0FBRztBQUNyQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsRUFBRSxHQUFHO0FBQ3BDLGdCQUFNLElBQUksT0FBTyxXQUFXLENBQUM7QUFDN0IsZ0JBQU0sWUFBWSxHQUFHLElBQUssSUFBSTtBQUFBLFFBQ2xDO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFDQSxlQUFTLFFBQVEsTUFBTSxRQUFRLFNBQVNNLE1BQUs7QUFDekMsWUFBSSxRQUFRO0FBQ1osWUFBSSxPQUFPO0FBQ1gsY0FBTSxRQUFRLEtBQUssV0FBVztBQUM5QixjQUFNLFNBQVMsQ0FBQztBQUNoQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHO0FBQ2xDLGtCQUFTLFNBQVMsU0FBVSxLQUFLLENBQUM7QUFDbEMsa0JBQVE7QUFDUixpQkFBTyxRQUFRLFNBQVM7QUFDcEIsb0JBQVE7QUFDUixtQkFBTyxLQUFNLFNBQVMsT0FBUSxJQUFJO0FBQUEsVUFDdEM7QUFBQSxRQUNKO0FBQ0EsWUFBSUEsTUFBSztBQUNMLGNBQUksT0FBTyxHQUFHO0FBQ1YsbUJBQU8sS0FBTSxTQUFVLFVBQVUsT0FBUyxJQUFJO0FBQUEsVUFDbEQ7QUFBQSxRQUNKLE9BQ0s7QUFDRCxjQUFJLFFBQVE7QUFDUixtQkFBTztBQUNYLGNBQUssU0FBVSxVQUFVLE9BQVM7QUFDOUIsbUJBQU87QUFBQSxRQUNmO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFDQSxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFFBQVEsT0FBTyxHQUFHLEdBQUcsSUFBSTtBQUFBLE1BQ3BDO0FBQ0EsZUFBUyxnQkFBZ0IsT0FBTztBQUM1QixjQUFNLE1BQU0sUUFBUSxPQUFPLEdBQUcsR0FBRyxLQUFLO0FBQ3RDLFlBQUksTUFBTSxRQUFRLEdBQUc7QUFDakIsaUJBQU87QUFBQSxNQUNmO0FBQ0EsZUFBUyxVQUFVLE9BQU87QUFDdEIsY0FBTSxNQUFNLFFBQVEsT0FBTyxHQUFHLEdBQUcsS0FBSztBQUN0QyxZQUFJLE1BQU0sUUFBUSxHQUFHO0FBQ2pCLGlCQUFPO0FBQ1gsY0FBTSxJQUFJLE1BQU0sR0FBRztBQUFBLE1BQ3ZCO0FBQ0EsZUFBUyx1QkFBdUIsVUFBVTtBQUN0QyxZQUFJO0FBQ0osWUFBSSxhQUFhLFVBQVU7QUFDdkIsMkJBQWlCO0FBQUEsUUFDckIsT0FDSztBQUNELDJCQUFpQjtBQUFBLFFBQ3JCO0FBQ0EsaUJBQVMsT0FBTyxRQUFRLE9BQU8sT0FBTztBQUNsQyxrQkFBUSxTQUFTO0FBQ2pCLGNBQUksT0FBTyxTQUFTLElBQUksTUFBTSxTQUFTO0FBQ25DLGtCQUFNLElBQUksVUFBVSxzQkFBc0I7QUFDOUMsbUJBQVMsT0FBTyxZQUFZO0FBRTVCLGNBQUksTUFBTSxVQUFVLE1BQU07QUFDMUIsY0FBSSxPQUFPLFFBQVE7QUFDZixrQkFBTSxJQUFJLE1BQU0sR0FBRztBQUN2QixjQUFJLFNBQVMsU0FBUztBQUN0QixtQkFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ25DLGtCQUFNLElBQUksTUFBTSxDQUFDO0FBQ2pCLGdCQUFJLEtBQUssTUFBTTtBQUNYLG9CQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFDcEMsa0JBQU0sWUFBWSxHQUFHLElBQUk7QUFDekIsc0JBQVUsU0FBUyxPQUFPLENBQUM7QUFBQSxVQUMvQjtBQUNBLG1CQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ3hCLGtCQUFNLFlBQVksR0FBRztBQUFBLFVBQ3pCO0FBQ0EsaUJBQU87QUFDUCxtQkFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUN4QixrQkFBTSxJQUFLLFFBQVMsSUFBSSxLQUFLLElBQU07QUFDbkMsc0JBQVUsU0FBUyxPQUFPLENBQUM7QUFBQSxVQUMvQjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGlCQUFTLFNBQVMsS0FBSyxPQUFPO0FBQzFCLGtCQUFRLFNBQVM7QUFDakIsY0FBSSxJQUFJLFNBQVM7QUFDYixtQkFBTyxNQUFNO0FBQ2pCLGNBQUksSUFBSSxTQUFTO0FBQ2IsbUJBQU87QUFFWCxnQkFBTSxVQUFVLElBQUksWUFBWTtBQUNoQyxnQkFBTSxVQUFVLElBQUksWUFBWTtBQUNoQyxjQUFJLFFBQVEsV0FBVyxRQUFRO0FBQzNCLG1CQUFPLHVCQUF1QjtBQUNsQyxnQkFBTTtBQUNOLGdCQUFNLFFBQVEsSUFBSSxZQUFZLEdBQUc7QUFDakMsY0FBSSxVQUFVO0FBQ1YsbUJBQU8sZ0NBQWdDO0FBQzNDLGNBQUksVUFBVTtBQUNWLG1CQUFPLHdCQUF3QjtBQUNuQyxnQkFBTSxTQUFTLElBQUksTUFBTSxHQUFHLEtBQUs7QUFDakMsZ0JBQU0sWUFBWSxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQ3JDLGNBQUksVUFBVSxTQUFTO0FBQ25CLG1CQUFPO0FBQ1gsY0FBSSxNQUFNLFVBQVUsTUFBTTtBQUMxQixjQUFJLE9BQU8sUUFBUTtBQUNmLG1CQUFPO0FBQ1gsZ0JBQU0sUUFBUSxDQUFDO0FBQ2YsbUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEVBQUUsR0FBRztBQUN2QyxrQkFBTSxJQUFJLFVBQVUsT0FBTyxDQUFDO0FBQzVCLGtCQUFNLElBQUksYUFBYSxDQUFDO0FBQ3hCLGdCQUFJLE1BQU07QUFDTixxQkFBTyx1QkFBdUI7QUFDbEMsa0JBQU0sWUFBWSxHQUFHLElBQUk7QUFFekIsZ0JBQUksSUFBSSxLQUFLLFVBQVU7QUFDbkI7QUFDSixrQkFBTSxLQUFLLENBQUM7QUFBQSxVQUNoQjtBQUNBLGNBQUksUUFBUTtBQUNSLG1CQUFPLDBCQUEwQjtBQUNyQyxpQkFBTyxFQUFFLFFBQVEsTUFBTTtBQUFBLFFBQzNCO0FBQ0EsaUJBQVMsYUFBYSxLQUFLLE9BQU87QUFDOUIsZ0JBQU0sTUFBTSxTQUFTLEtBQUssS0FBSztBQUMvQixjQUFJLE9BQU8sUUFBUTtBQUNmLG1CQUFPO0FBQUEsUUFDZjtBQUNBLGlCQUFTQyxRQUFPLEtBQUssT0FBTztBQUN4QixnQkFBTSxNQUFNLFNBQVMsS0FBSyxLQUFLO0FBQy9CLGNBQUksT0FBTyxRQUFRO0FBQ2YsbUJBQU87QUFDWCxnQkFBTSxJQUFJLE1BQU0sR0FBRztBQUFBLFFBQ3ZCO0FBQ0EsZUFBTztBQUFBLFVBQ0g7QUFBQSxVQUNBLFFBQUFBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsY0FBUSxTQUFTLHVCQUF1QixRQUFRO0FBQ2hELGNBQVEsVUFBVSx1QkFBdUIsU0FBUztBQUFBO0FBQUE7OztBQ3pLbEQ7QUFBQTtBQUFBO0FBQUE7QUFFQSxjQUFRLGFBQWE7QUFDckIsY0FBUSxjQUFjO0FBQ3RCLGNBQVEsZ0JBQWdCO0FBRXhCLFVBQUksU0FBUyxDQUFDO0FBQ2QsVUFBSSxZQUFZLENBQUM7QUFDakIsVUFBSSxNQUFNLE9BQU8sZUFBZSxjQUFjLGFBQWE7QUFFM0QsVUFBSSxPQUFPO0FBQ1gsV0FBUyxJQUFJLEdBQUcsTUFBTSxLQUFLLFFBQVEsSUFBSSxLQUFLLEVBQUUsR0FBRztBQUMvQyxlQUFPLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbEIsa0JBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxJQUFJO0FBQUEsTUFDbEM7QUFIUztBQUFPO0FBT2hCLGdCQUFVLElBQUksV0FBVyxDQUFDLENBQUMsSUFBSTtBQUMvQixnQkFBVSxJQUFJLFdBQVcsQ0FBQyxDQUFDLElBQUk7QUFFL0IsZUFBUyxRQUFTLEtBQUs7QUFDckIsWUFBSUMsT0FBTSxJQUFJO0FBRWQsWUFBSUEsT0FBTSxJQUFJLEdBQUc7QUFDZixnQkFBTSxJQUFJLE1BQU0sZ0RBQWdEO0FBQUEsUUFDbEU7QUFJQSxZQUFJLFdBQVcsSUFBSSxRQUFRLEdBQUc7QUFDOUIsWUFBSSxhQUFhLEdBQUksWUFBV0E7QUFFaEMsWUFBSSxrQkFBa0IsYUFBYUEsT0FDL0IsSUFDQSxJQUFLLFdBQVc7QUFFcEIsZUFBTyxDQUFDLFVBQVUsZUFBZTtBQUFBLE1BQ25DO0FBR0EsZUFBUyxXQUFZLEtBQUs7QUFDeEIsWUFBSSxPQUFPLFFBQVEsR0FBRztBQUN0QixZQUFJLFdBQVcsS0FBSyxDQUFDO0FBQ3JCLFlBQUksa0JBQWtCLEtBQUssQ0FBQztBQUM1QixnQkFBUyxXQUFXLG1CQUFtQixJQUFJLElBQUs7QUFBQSxNQUNsRDtBQUVBLGVBQVMsWUFBYSxLQUFLLFVBQVUsaUJBQWlCO0FBQ3BELGdCQUFTLFdBQVcsbUJBQW1CLElBQUksSUFBSztBQUFBLE1BQ2xEO0FBRUEsZUFBUyxZQUFhLEtBQUs7QUFDekIsWUFBSTtBQUNKLFlBQUksT0FBTyxRQUFRLEdBQUc7QUFDdEIsWUFBSSxXQUFXLEtBQUssQ0FBQztBQUNyQixZQUFJLGtCQUFrQixLQUFLLENBQUM7QUFFNUIsWUFBSSxNQUFNLElBQUksSUFBSSxZQUFZLEtBQUssVUFBVSxlQUFlLENBQUM7QUFFN0QsWUFBSSxVQUFVO0FBR2QsWUFBSUEsT0FBTSxrQkFBa0IsSUFDeEIsV0FBVyxJQUNYO0FBRUosWUFBSUM7QUFDSixhQUFLQSxLQUFJLEdBQUdBLEtBQUlELE1BQUtDLE1BQUssR0FBRztBQUMzQixnQkFDRyxVQUFVLElBQUksV0FBV0EsRUFBQyxDQUFDLEtBQUssS0FDaEMsVUFBVSxJQUFJLFdBQVdBLEtBQUksQ0FBQyxDQUFDLEtBQUssS0FDcEMsVUFBVSxJQUFJLFdBQVdBLEtBQUksQ0FBQyxDQUFDLEtBQUssSUFDckMsVUFBVSxJQUFJLFdBQVdBLEtBQUksQ0FBQyxDQUFDO0FBQ2pDLGNBQUksU0FBUyxJQUFLLE9BQU8sS0FBTTtBQUMvQixjQUFJLFNBQVMsSUFBSyxPQUFPLElBQUs7QUFDOUIsY0FBSSxTQUFTLElBQUksTUFBTTtBQUFBLFFBQ3pCO0FBRUEsWUFBSSxvQkFBb0IsR0FBRztBQUN6QixnQkFDRyxVQUFVLElBQUksV0FBV0EsRUFBQyxDQUFDLEtBQUssSUFDaEMsVUFBVSxJQUFJLFdBQVdBLEtBQUksQ0FBQyxDQUFDLEtBQUs7QUFDdkMsY0FBSSxTQUFTLElBQUksTUFBTTtBQUFBLFFBQ3pCO0FBRUEsWUFBSSxvQkFBb0IsR0FBRztBQUN6QixnQkFDRyxVQUFVLElBQUksV0FBV0EsRUFBQyxDQUFDLEtBQUssS0FDaEMsVUFBVSxJQUFJLFdBQVdBLEtBQUksQ0FBQyxDQUFDLEtBQUssSUFDcEMsVUFBVSxJQUFJLFdBQVdBLEtBQUksQ0FBQyxDQUFDLEtBQUs7QUFDdkMsY0FBSSxTQUFTLElBQUssT0FBTyxJQUFLO0FBQzlCLGNBQUksU0FBUyxJQUFJLE1BQU07QUFBQSxRQUN6QjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxnQkFBaUJDLE1BQUs7QUFDN0IsZUFBTyxPQUFPQSxRQUFPLEtBQUssRUFBSSxJQUM1QixPQUFPQSxRQUFPLEtBQUssRUFBSSxJQUN2QixPQUFPQSxRQUFPLElBQUksRUFBSSxJQUN0QixPQUFPQSxPQUFNLEVBQUk7QUFBQSxNQUNyQjtBQUVBLGVBQVMsWUFBYSxPQUFPLE9BQU8sS0FBSztBQUN2QyxZQUFJO0FBQ0osWUFBSSxTQUFTLENBQUM7QUFDZCxpQkFBU0QsS0FBSSxPQUFPQSxLQUFJLEtBQUtBLE1BQUssR0FBRztBQUNuQyxpQkFDSSxNQUFNQSxFQUFDLEtBQUssS0FBTSxhQUNsQixNQUFNQSxLQUFJLENBQUMsS0FBSyxJQUFLLFVBQ3RCLE1BQU1BLEtBQUksQ0FBQyxJQUFJO0FBQ2xCLGlCQUFPLEtBQUssZ0JBQWdCLEdBQUcsQ0FBQztBQUFBLFFBQ2xDO0FBQ0EsZUFBTyxPQUFPLEtBQUssRUFBRTtBQUFBLE1BQ3ZCO0FBRUEsZUFBUyxjQUFlLE9BQU87QUFDN0IsWUFBSTtBQUNKLFlBQUlELE9BQU0sTUFBTTtBQUNoQixZQUFJLGFBQWFBLE9BQU07QUFDdkIsWUFBSSxRQUFRLENBQUM7QUFDYixZQUFJLGlCQUFpQjtBQUdyQixpQkFBU0MsS0FBSSxHQUFHRSxRQUFPSCxPQUFNLFlBQVlDLEtBQUlFLE9BQU1GLE1BQUssZ0JBQWdCO0FBQ3RFLGdCQUFNLEtBQUssWUFBWSxPQUFPQSxJQUFJQSxLQUFJLGlCQUFrQkUsUUFBT0EsUUFBUUYsS0FBSSxjQUFlLENBQUM7QUFBQSxRQUM3RjtBQUdBLFlBQUksZUFBZSxHQUFHO0FBQ3BCLGdCQUFNLE1BQU1ELE9BQU0sQ0FBQztBQUNuQixnQkFBTTtBQUFBLFlBQ0osT0FBTyxPQUFPLENBQUMsSUFDZixPQUFRLE9BQU8sSUFBSyxFQUFJLElBQ3hCO0FBQUEsVUFDRjtBQUFBLFFBQ0YsV0FBVyxlQUFlLEdBQUc7QUFDM0IsaUJBQU8sTUFBTUEsT0FBTSxDQUFDLEtBQUssS0FBSyxNQUFNQSxPQUFNLENBQUM7QUFDM0MsZ0JBQU07QUFBQSxZQUNKLE9BQU8sT0FBTyxFQUFFLElBQ2hCLE9BQVEsT0FBTyxJQUFLLEVBQUksSUFDeEIsT0FBUSxPQUFPLElBQUssRUFBSSxJQUN4QjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBRUEsZUFBTyxNQUFNLEtBQUssRUFBRTtBQUFBLE1BQ3RCO0FBQUE7QUFBQTs7O0FDckpBO0FBQUE7QUFBQTtBQUNBLGNBQVEsT0FBTyxTQUFVLFFBQVEsUUFBUUksT0FBTSxNQUFNLFFBQVE7QUFDM0QsWUFBSSxHQUFHO0FBQ1AsWUFBSSxPQUFRLFNBQVMsSUFBSyxPQUFPO0FBQ2pDLFlBQUksUUFBUSxLQUFLLFFBQVE7QUFDekIsWUFBSSxRQUFRLFFBQVE7QUFDcEIsWUFBSSxRQUFRO0FBQ1osWUFBSSxJQUFJQSxRQUFRLFNBQVMsSUFBSztBQUM5QixZQUFJLElBQUlBLFFBQU8sS0FBSztBQUNwQixZQUFJLElBQUksT0FBTyxTQUFTLENBQUM7QUFFekIsYUFBSztBQUVMLFlBQUksS0FBTSxLQUFNLENBQUMsU0FBVTtBQUMzQixjQUFPLENBQUM7QUFDUixpQkFBUztBQUNULGVBQU8sUUFBUSxHQUFHLElBQUssSUFBSSxNQUFPLE9BQU8sU0FBUyxDQUFDLEdBQUcsS0FBSyxHQUFHLFNBQVMsR0FBRztBQUFBLFFBQUM7QUFFM0UsWUFBSSxLQUFNLEtBQU0sQ0FBQyxTQUFVO0FBQzNCLGNBQU8sQ0FBQztBQUNSLGlCQUFTO0FBQ1QsZUFBTyxRQUFRLEdBQUcsSUFBSyxJQUFJLE1BQU8sT0FBTyxTQUFTLENBQUMsR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHO0FBQUEsUUFBQztBQUUzRSxZQUFJLE1BQU0sR0FBRztBQUNYLGNBQUksSUFBSTtBQUFBLFFBQ1YsV0FBVyxNQUFNLE1BQU07QUFDckIsaUJBQU8sSUFBSSxPQUFRLElBQUksS0FBSyxLQUFLO0FBQUEsUUFDbkMsT0FBTztBQUNMLGNBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJO0FBQ3hCLGNBQUksSUFBSTtBQUFBLFFBQ1Y7QUFDQSxnQkFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSTtBQUFBLE1BQ2hEO0FBRUEsY0FBUSxRQUFRLFNBQVUsUUFBUSxPQUFPLFFBQVFBLE9BQU0sTUFBTSxRQUFRO0FBQ25FLFlBQUksR0FBRyxHQUFHO0FBQ1YsWUFBSSxPQUFRLFNBQVMsSUFBSyxPQUFPO0FBQ2pDLFlBQUksUUFBUSxLQUFLLFFBQVE7QUFDekIsWUFBSSxRQUFRLFFBQVE7QUFDcEIsWUFBSSxLQUFNLFNBQVMsS0FBSyxLQUFLLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsR0FBRyxJQUFJO0FBQzlELFlBQUksSUFBSUEsUUFBTyxJQUFLLFNBQVM7QUFDN0IsWUFBSSxJQUFJQSxRQUFPLElBQUk7QUFDbkIsWUFBSSxJQUFJLFFBQVEsS0FBTSxVQUFVLEtBQUssSUFBSSxRQUFRLElBQUssSUFBSTtBQUUxRCxnQkFBUSxLQUFLLElBQUksS0FBSztBQUV0QixZQUFJLE1BQU0sS0FBSyxLQUFLLFVBQVUsVUFBVTtBQUN0QyxjQUFJLE1BQU0sS0FBSyxJQUFJLElBQUk7QUFDdkIsY0FBSTtBQUFBLFFBQ04sT0FBTztBQUNMLGNBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHO0FBQ3pDLGNBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUc7QUFDckM7QUFDQSxpQkFBSztBQUFBLFVBQ1A7QUFDQSxjQUFJLElBQUksU0FBUyxHQUFHO0FBQ2xCLHFCQUFTLEtBQUs7QUFBQSxVQUNoQixPQUFPO0FBQ0wscUJBQVMsS0FBSyxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUs7QUFBQSxVQUNyQztBQUNBLGNBQUksUUFBUSxLQUFLLEdBQUc7QUFDbEI7QUFDQSxpQkFBSztBQUFBLFVBQ1A7QUFFQSxjQUFJLElBQUksU0FBUyxNQUFNO0FBQ3JCLGdCQUFJO0FBQ0osZ0JBQUk7QUFBQSxVQUNOLFdBQVcsSUFBSSxTQUFTLEdBQUc7QUFDekIsaUJBQU0sUUFBUSxJQUFLLEtBQUssS0FBSyxJQUFJLEdBQUcsSUFBSTtBQUN4QyxnQkFBSSxJQUFJO0FBQUEsVUFDVixPQUFPO0FBQ0wsZ0JBQUksUUFBUSxLQUFLLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJO0FBQ3JELGdCQUFJO0FBQUEsVUFDTjtBQUFBLFFBQ0Y7QUFFQSxlQUFPLFFBQVEsR0FBRyxPQUFPLFNBQVMsQ0FBQyxJQUFJLElBQUksS0FBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLFFBQVEsR0FBRztBQUFBLFFBQUM7QUFFL0UsWUFBSyxLQUFLLE9BQVE7QUFDbEIsZ0JBQVE7QUFDUixlQUFPLE9BQU8sR0FBRyxPQUFPLFNBQVMsQ0FBQyxJQUFJLElBQUksS0FBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLFFBQVEsR0FBRztBQUFBLFFBQUM7QUFFOUUsZUFBTyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUk7QUFBQSxNQUNoQztBQUFBO0FBQUE7OztBQ3BGQTtBQUFBO0FBQUE7QUFBQTtBQVVBLFVBQU1DLFVBQVM7QUFDZixVQUFNLFVBQVU7QUFDaEIsVUFBTSxzQkFDSCxPQUFPLFdBQVcsY0FBYyxPQUFPLE9BQU8sS0FBSyxNQUFNLGFBQ3RELE9BQU8sS0FBSyxFQUFFLDRCQUE0QixJQUMxQztBQUVOLGNBQVEsU0FBU0M7QUFDakIsY0FBUSxhQUFhO0FBQ3JCLGNBQVEsb0JBQW9CO0FBRTVCLFVBQU0sZUFBZTtBQUNyQixjQUFRLGFBQWE7QUFnQnJCLE1BQUFBLFFBQU8sc0JBQXNCLGtCQUFrQjtBQUUvQyxVQUFJLENBQUNBLFFBQU8sdUJBQXVCLE9BQU8sWUFBWSxlQUNsRCxPQUFPLFFBQVEsVUFBVSxZQUFZO0FBQ3ZDLGdCQUFRO0FBQUEsVUFDTjtBQUFBLFFBRUY7QUFBQSxNQUNGO0FBRUEsZUFBUyxvQkFBcUI7QUFFNUIsWUFBSTtBQUNGLGdCQUFNLE1BQU0sSUFBSSxXQUFXLENBQUM7QUFDNUIsZ0JBQU0sUUFBUSxFQUFFLEtBQUssV0FBWTtBQUFFLG1CQUFPO0FBQUEsVUFBRyxFQUFFO0FBQy9DLGlCQUFPLGVBQWUsT0FBTyxXQUFXLFNBQVM7QUFDakQsaUJBQU8sZUFBZSxLQUFLLEtBQUs7QUFDaEMsaUJBQU8sSUFBSSxJQUFJLE1BQU07QUFBQSxRQUN2QixTQUFTLEdBQUc7QUFDVixpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBRUEsYUFBTyxlQUFlQSxRQUFPLFdBQVcsVUFBVTtBQUFBLFFBQ2hELFlBQVk7QUFBQSxRQUNaLEtBQUssV0FBWTtBQUNmLGNBQUksQ0FBQ0EsUUFBTyxTQUFTLElBQUksRUFBRyxRQUFPO0FBQ25DLGlCQUFPLEtBQUs7QUFBQSxRQUNkO0FBQUEsTUFDRixDQUFDO0FBRUQsYUFBTyxlQUFlQSxRQUFPLFdBQVcsVUFBVTtBQUFBLFFBQ2hELFlBQVk7QUFBQSxRQUNaLEtBQUssV0FBWTtBQUNmLGNBQUksQ0FBQ0EsUUFBTyxTQUFTLElBQUksRUFBRyxRQUFPO0FBQ25DLGlCQUFPLEtBQUs7QUFBQSxRQUNkO0FBQUEsTUFDRixDQUFDO0FBRUQsZUFBUyxhQUFjLFFBQVE7QUFDN0IsWUFBSSxTQUFTLGNBQWM7QUFDekIsZ0JBQU0sSUFBSSxXQUFXLGdCQUFnQixTQUFTLGdDQUFnQztBQUFBLFFBQ2hGO0FBRUEsY0FBTSxNQUFNLElBQUksV0FBVyxNQUFNO0FBQ2pDLGVBQU8sZUFBZSxLQUFLQSxRQUFPLFNBQVM7QUFDM0MsZUFBTztBQUFBLE1BQ1Q7QUFZQSxlQUFTQSxRQUFRLEtBQUssa0JBQWtCLFFBQVE7QUFFOUMsWUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixjQUFJLE9BQU8scUJBQXFCLFVBQVU7QUFDeEMsa0JBQU0sSUFBSTtBQUFBLGNBQ1I7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUNBLGlCQUFPLFlBQVksR0FBRztBQUFBLFFBQ3hCO0FBQ0EsZUFBTyxLQUFLLEtBQUssa0JBQWtCLE1BQU07QUFBQSxNQUMzQztBQUVBLE1BQUFBLFFBQU8sV0FBVztBQUVsQixlQUFTLEtBQU0sT0FBTyxrQkFBa0IsUUFBUTtBQUM5QyxZQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGlCQUFPLFdBQVcsT0FBTyxnQkFBZ0I7QUFBQSxRQUMzQztBQUVBLFlBQUksWUFBWSxPQUFPLEtBQUssR0FBRztBQUM3QixpQkFBTyxjQUFjLEtBQUs7QUFBQSxRQUM1QjtBQUVBLFlBQUksU0FBUyxNQUFNO0FBQ2pCLGdCQUFNLElBQUk7QUFBQSxZQUNSLG9IQUMwQyxPQUFPO0FBQUEsVUFDbkQ7QUFBQSxRQUNGO0FBRUEsWUFBSSxXQUFXLE9BQU8sV0FBVyxLQUM1QixTQUFTLFdBQVcsTUFBTSxRQUFRLFdBQVcsR0FBSTtBQUNwRCxpQkFBTyxnQkFBZ0IsT0FBTyxrQkFBa0IsTUFBTTtBQUFBLFFBQ3hEO0FBRUEsWUFBSSxPQUFPLHNCQUFzQixnQkFDNUIsV0FBVyxPQUFPLGlCQUFpQixLQUNuQyxTQUFTLFdBQVcsTUFBTSxRQUFRLGlCQUFpQixJQUFLO0FBQzNELGlCQUFPLGdCQUFnQixPQUFPLGtCQUFrQixNQUFNO0FBQUEsUUFDeEQ7QUFFQSxZQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGdCQUFNLElBQUk7QUFBQSxZQUNSO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLFVBQVUsTUFBTSxXQUFXLE1BQU0sUUFBUTtBQUMvQyxZQUFJLFdBQVcsUUFBUSxZQUFZLE9BQU87QUFDeEMsaUJBQU9BLFFBQU8sS0FBSyxTQUFTLGtCQUFrQixNQUFNO0FBQUEsUUFDdEQ7QUFFQSxjQUFNLElBQUksV0FBVyxLQUFLO0FBQzFCLFlBQUksRUFBRyxRQUFPO0FBRWQsWUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLGVBQWUsUUFDdkQsT0FBTyxNQUFNLE9BQU8sV0FBVyxNQUFNLFlBQVk7QUFDbkQsaUJBQU9BLFFBQU8sS0FBSyxNQUFNLE9BQU8sV0FBVyxFQUFFLFFBQVEsR0FBRyxrQkFBa0IsTUFBTTtBQUFBLFFBQ2xGO0FBRUEsY0FBTSxJQUFJO0FBQUEsVUFDUixvSEFDMEMsT0FBTztBQUFBLFFBQ25EO0FBQUEsTUFDRjtBQVVBLE1BQUFBLFFBQU8sT0FBTyxTQUFVLE9BQU8sa0JBQWtCLFFBQVE7QUFDdkQsZUFBTyxLQUFLLE9BQU8sa0JBQWtCLE1BQU07QUFBQSxNQUM3QztBQUlBLGFBQU8sZUFBZUEsUUFBTyxXQUFXLFdBQVcsU0FBUztBQUM1RCxhQUFPLGVBQWVBLFNBQVEsVUFBVTtBQUV4QyxlQUFTLFdBQVksTUFBTTtBQUN6QixZQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGdCQUFNLElBQUksVUFBVSx3Q0FBd0M7QUFBQSxRQUM5RCxXQUFXLE9BQU8sR0FBRztBQUNuQixnQkFBTSxJQUFJLFdBQVcsZ0JBQWdCLE9BQU8sZ0NBQWdDO0FBQUEsUUFDOUU7QUFBQSxNQUNGO0FBRUEsZUFBUyxNQUFPLE1BQU0sTUFBTSxVQUFVO0FBQ3BDLG1CQUFXLElBQUk7QUFDZixZQUFJLFFBQVEsR0FBRztBQUNiLGlCQUFPLGFBQWEsSUFBSTtBQUFBLFFBQzFCO0FBQ0EsWUFBSSxTQUFTLFFBQVc7QUFJdEIsaUJBQU8sT0FBTyxhQUFhLFdBQ3ZCLGFBQWEsSUFBSSxFQUFFLEtBQUssTUFBTSxRQUFRLElBQ3RDLGFBQWEsSUFBSSxFQUFFLEtBQUssSUFBSTtBQUFBLFFBQ2xDO0FBQ0EsZUFBTyxhQUFhLElBQUk7QUFBQSxNQUMxQjtBQU1BLE1BQUFBLFFBQU8sUUFBUSxTQUFVLE1BQU0sTUFBTSxVQUFVO0FBQzdDLGVBQU8sTUFBTSxNQUFNLE1BQU0sUUFBUTtBQUFBLE1BQ25DO0FBRUEsZUFBUyxZQUFhLE1BQU07QUFDMUIsbUJBQVcsSUFBSTtBQUNmLGVBQU8sYUFBYSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDO0FBQUEsTUFDdEQ7QUFLQSxNQUFBQSxRQUFPLGNBQWMsU0FBVSxNQUFNO0FBQ25DLGVBQU8sWUFBWSxJQUFJO0FBQUEsTUFDekI7QUFJQSxNQUFBQSxRQUFPLGtCQUFrQixTQUFVLE1BQU07QUFDdkMsZUFBTyxZQUFZLElBQUk7QUFBQSxNQUN6QjtBQUVBLGVBQVMsV0FBWSxRQUFRLFVBQVU7QUFDckMsWUFBSSxPQUFPLGFBQWEsWUFBWSxhQUFhLElBQUk7QUFDbkQscUJBQVc7QUFBQSxRQUNiO0FBRUEsWUFBSSxDQUFDQSxRQUFPLFdBQVcsUUFBUSxHQUFHO0FBQ2hDLGdCQUFNLElBQUksVUFBVSx1QkFBdUIsUUFBUTtBQUFBLFFBQ3JEO0FBRUEsY0FBTSxTQUFTLFdBQVcsUUFBUSxRQUFRLElBQUk7QUFDOUMsWUFBSSxNQUFNLGFBQWEsTUFBTTtBQUU3QixjQUFNLFNBQVMsSUFBSSxNQUFNLFFBQVEsUUFBUTtBQUV6QyxZQUFJLFdBQVcsUUFBUTtBQUlyQixnQkFBTSxJQUFJLE1BQU0sR0FBRyxNQUFNO0FBQUEsUUFDM0I7QUFFQSxlQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVMsY0FBZSxPQUFPO0FBQzdCLGNBQU0sU0FBUyxNQUFNLFNBQVMsSUFBSSxJQUFJLFFBQVEsTUFBTSxNQUFNLElBQUk7QUFDOUQsY0FBTSxNQUFNLGFBQWEsTUFBTTtBQUMvQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUssR0FBRztBQUNsQyxjQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSTtBQUFBLFFBQ3RCO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxlQUFTLGNBQWUsV0FBVztBQUNqQyxZQUFJLFdBQVcsV0FBVyxVQUFVLEdBQUc7QUFDckMsZ0JBQU0sT0FBTyxJQUFJLFdBQVcsU0FBUztBQUNyQyxpQkFBTyxnQkFBZ0IsS0FBSyxRQUFRLEtBQUssWUFBWSxLQUFLLFVBQVU7QUFBQSxRQUN0RTtBQUNBLGVBQU8sY0FBYyxTQUFTO0FBQUEsTUFDaEM7QUFFQSxlQUFTLGdCQUFpQixPQUFPLFlBQVksUUFBUTtBQUNuRCxZQUFJLGFBQWEsS0FBSyxNQUFNLGFBQWEsWUFBWTtBQUNuRCxnQkFBTSxJQUFJLFdBQVcsc0NBQXNDO0FBQUEsUUFDN0Q7QUFFQSxZQUFJLE1BQU0sYUFBYSxjQUFjLFVBQVUsSUFBSTtBQUNqRCxnQkFBTSxJQUFJLFdBQVcsc0NBQXNDO0FBQUEsUUFDN0Q7QUFFQSxZQUFJO0FBQ0osWUFBSSxlQUFlLFVBQWEsV0FBVyxRQUFXO0FBQ3BELGdCQUFNLElBQUksV0FBVyxLQUFLO0FBQUEsUUFDNUIsV0FBVyxXQUFXLFFBQVc7QUFDL0IsZ0JBQU0sSUFBSSxXQUFXLE9BQU8sVUFBVTtBQUFBLFFBQ3hDLE9BQU87QUFDTCxnQkFBTSxJQUFJLFdBQVcsT0FBTyxZQUFZLE1BQU07QUFBQSxRQUNoRDtBQUdBLGVBQU8sZUFBZSxLQUFLQSxRQUFPLFNBQVM7QUFFM0MsZUFBTztBQUFBLE1BQ1Q7QUFFQSxlQUFTLFdBQVksS0FBSztBQUN4QixZQUFJQSxRQUFPLFNBQVMsR0FBRyxHQUFHO0FBQ3hCLGdCQUFNLE1BQU0sUUFBUSxJQUFJLE1BQU0sSUFBSTtBQUNsQyxnQkFBTSxNQUFNLGFBQWEsR0FBRztBQUU1QixjQUFJLElBQUksV0FBVyxHQUFHO0FBQ3BCLG1CQUFPO0FBQUEsVUFDVDtBQUVBLGNBQUksS0FBSyxLQUFLLEdBQUcsR0FBRyxHQUFHO0FBQ3ZCLGlCQUFPO0FBQUEsUUFDVDtBQUVBLFlBQUksSUFBSSxXQUFXLFFBQVc7QUFDNUIsY0FBSSxPQUFPLElBQUksV0FBVyxZQUFZLFlBQVksSUFBSSxNQUFNLEdBQUc7QUFDN0QsbUJBQU8sYUFBYSxDQUFDO0FBQUEsVUFDdkI7QUFDQSxpQkFBTyxjQUFjLEdBQUc7QUFBQSxRQUMxQjtBQUVBLFlBQUksSUFBSSxTQUFTLFlBQVksTUFBTSxRQUFRLElBQUksSUFBSSxHQUFHO0FBQ3BELGlCQUFPLGNBQWMsSUFBSSxJQUFJO0FBQUEsUUFDL0I7QUFBQSxNQUNGO0FBRUEsZUFBUyxRQUFTLFFBQVE7QUFHeEIsWUFBSSxVQUFVLGNBQWM7QUFDMUIsZ0JBQU0sSUFBSSxXQUFXLDREQUNhLGFBQWEsU0FBUyxFQUFFLElBQUksUUFBUTtBQUFBLFFBQ3hFO0FBQ0EsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFFQSxlQUFTLFdBQVksUUFBUTtBQUMzQixZQUFJLENBQUMsVUFBVSxRQUFRO0FBQ3JCLG1CQUFTO0FBQUEsUUFDWDtBQUNBLGVBQU9BLFFBQU8sTUFBTSxDQUFDLE1BQU07QUFBQSxNQUM3QjtBQUVBLE1BQUFBLFFBQU8sV0FBVyxTQUFTLFNBQVUsR0FBRztBQUN0QyxlQUFPLEtBQUssUUFBUSxFQUFFLGNBQWMsUUFDbEMsTUFBTUEsUUFBTztBQUFBLE1BQ2pCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLFNBQVMsUUFBUyxHQUFHLEdBQUc7QUFDdkMsWUFBSSxXQUFXLEdBQUcsVUFBVSxFQUFHLEtBQUlBLFFBQU8sS0FBSyxHQUFHLEVBQUUsUUFBUSxFQUFFLFVBQVU7QUFDeEUsWUFBSSxXQUFXLEdBQUcsVUFBVSxFQUFHLEtBQUlBLFFBQU8sS0FBSyxHQUFHLEVBQUUsUUFBUSxFQUFFLFVBQVU7QUFDeEUsWUFBSSxDQUFDQSxRQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUNBLFFBQU8sU0FBUyxDQUFDLEdBQUc7QUFDOUMsZ0JBQU0sSUFBSTtBQUFBLFlBQ1I7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLFlBQUksTUFBTSxFQUFHLFFBQU87QUFFcEIsWUFBSSxJQUFJLEVBQUU7QUFDVixZQUFJLElBQUksRUFBRTtBQUVWLGlCQUFTLElBQUksR0FBRyxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2xELGNBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUc7QUFDakIsZ0JBQUksRUFBRSxDQUFDO0FBQ1AsZ0JBQUksRUFBRSxDQUFDO0FBQ1A7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLFlBQUksSUFBSSxFQUFHLFFBQU87QUFDbEIsWUFBSSxJQUFJLEVBQUcsUUFBTztBQUNsQixlQUFPO0FBQUEsTUFDVDtBQUVBLE1BQUFBLFFBQU8sYUFBYSxTQUFTLFdBQVksVUFBVTtBQUNqRCxnQkFBUSxPQUFPLFFBQVEsRUFBRSxZQUFZLEdBQUc7QUFBQSxVQUN0QyxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQUEsVUFDTCxLQUFLO0FBQ0gsbUJBQU87QUFBQSxVQUNUO0FBQ0UsbUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDRjtBQUVBLE1BQUFBLFFBQU8sU0FBUyxTQUFTLE9BQVEsTUFBTSxRQUFRO0FBQzdDLFlBQUksQ0FBQyxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3hCLGdCQUFNLElBQUksVUFBVSw2Q0FBNkM7QUFBQSxRQUNuRTtBQUVBLFlBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsaUJBQU9BLFFBQU8sTUFBTSxDQUFDO0FBQUEsUUFDdkI7QUFFQSxZQUFJO0FBQ0osWUFBSSxXQUFXLFFBQVc7QUFDeEIsbUJBQVM7QUFDVCxlQUFLLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxFQUFFLEdBQUc7QUFDaEMsc0JBQVUsS0FBSyxDQUFDLEVBQUU7QUFBQSxVQUNwQjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLFNBQVNBLFFBQU8sWUFBWSxNQUFNO0FBQ3hDLFlBQUksTUFBTTtBQUNWLGFBQUssSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEVBQUUsR0FBRztBQUNoQyxjQUFJLE1BQU0sS0FBSyxDQUFDO0FBQ2hCLGNBQUksV0FBVyxLQUFLLFVBQVUsR0FBRztBQUMvQixnQkFBSSxNQUFNLElBQUksU0FBUyxPQUFPLFFBQVE7QUFDcEMsa0JBQUksQ0FBQ0EsUUFBTyxTQUFTLEdBQUcsRUFBRyxPQUFNQSxRQUFPLEtBQUssR0FBRztBQUNoRCxrQkFBSSxLQUFLLFFBQVEsR0FBRztBQUFBLFlBQ3RCLE9BQU87QUFDTCx5QkFBVyxVQUFVLElBQUk7QUFBQSxnQkFDdkI7QUFBQSxnQkFDQTtBQUFBLGdCQUNBO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGLFdBQVcsQ0FBQ0EsUUFBTyxTQUFTLEdBQUcsR0FBRztBQUNoQyxrQkFBTSxJQUFJLFVBQVUsNkNBQTZDO0FBQUEsVUFDbkUsT0FBTztBQUNMLGdCQUFJLEtBQUssUUFBUSxHQUFHO0FBQUEsVUFDdEI7QUFDQSxpQkFBTyxJQUFJO0FBQUEsUUFDYjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxXQUFZLFFBQVEsVUFBVTtBQUNyQyxZQUFJQSxRQUFPLFNBQVMsTUFBTSxHQUFHO0FBQzNCLGlCQUFPLE9BQU87QUFBQSxRQUNoQjtBQUNBLFlBQUksWUFBWSxPQUFPLE1BQU0sS0FBSyxXQUFXLFFBQVEsV0FBVyxHQUFHO0FBQ2pFLGlCQUFPLE9BQU87QUFBQSxRQUNoQjtBQUNBLFlBQUksT0FBTyxXQUFXLFVBQVU7QUFDOUIsZ0JBQU0sSUFBSTtBQUFBLFlBQ1IsNkZBQ21CLE9BQU87QUFBQSxVQUM1QjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLE1BQU0sT0FBTztBQUNuQixjQUFNLFlBQWEsVUFBVSxTQUFTLEtBQUssVUFBVSxDQUFDLE1BQU07QUFDNUQsWUFBSSxDQUFDLGFBQWEsUUFBUSxFQUFHLFFBQU87QUFHcEMsWUFBSSxjQUFjO0FBQ2xCLG1CQUFTO0FBQ1Asa0JBQVEsVUFBVTtBQUFBLFlBQ2hCLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFDSCxxQkFBTztBQUFBLFlBQ1QsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUNILHFCQUFPQyxhQUFZLE1BQU0sRUFBRTtBQUFBLFlBQzdCLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFDSCxxQkFBTyxNQUFNO0FBQUEsWUFDZixLQUFLO0FBQ0gscUJBQU8sUUFBUTtBQUFBLFlBQ2pCLEtBQUs7QUFDSCxxQkFBT0MsZUFBYyxNQUFNLEVBQUU7QUFBQSxZQUMvQjtBQUNFLGtCQUFJLGFBQWE7QUFDZix1QkFBTyxZQUFZLEtBQUtELGFBQVksTUFBTSxFQUFFO0FBQUEsY0FDOUM7QUFDQSwwQkFBWSxLQUFLLFVBQVUsWUFBWTtBQUN2Qyw0QkFBYztBQUFBLFVBQ2xCO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFDQSxNQUFBRCxRQUFPLGFBQWE7QUFFcEIsZUFBUyxhQUFjLFVBQVUsT0FBTyxLQUFLO0FBQzNDLFlBQUksY0FBYztBQVNsQixZQUFJLFVBQVUsVUFBYSxRQUFRLEdBQUc7QUFDcEMsa0JBQVE7QUFBQSxRQUNWO0FBR0EsWUFBSSxRQUFRLEtBQUssUUFBUTtBQUN2QixpQkFBTztBQUFBLFFBQ1Q7QUFFQSxZQUFJLFFBQVEsVUFBYSxNQUFNLEtBQUssUUFBUTtBQUMxQyxnQkFBTSxLQUFLO0FBQUEsUUFDYjtBQUVBLFlBQUksT0FBTyxHQUFHO0FBQ1osaUJBQU87QUFBQSxRQUNUO0FBR0EsaUJBQVM7QUFDVCxtQkFBVztBQUVYLFlBQUksT0FBTyxPQUFPO0FBQ2hCLGlCQUFPO0FBQUEsUUFDVDtBQUVBLFlBQUksQ0FBQyxTQUFVLFlBQVc7QUFFMUIsZUFBTyxNQUFNO0FBQ1gsa0JBQVEsVUFBVTtBQUFBLFlBQ2hCLEtBQUs7QUFDSCxxQkFBTyxTQUFTLE1BQU0sT0FBTyxHQUFHO0FBQUEsWUFFbEMsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUNILHFCQUFPLFVBQVUsTUFBTSxPQUFPLEdBQUc7QUFBQSxZQUVuQyxLQUFLO0FBQ0gscUJBQU8sV0FBVyxNQUFNLE9BQU8sR0FBRztBQUFBLFlBRXBDLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFDSCxxQkFBTyxZQUFZLE1BQU0sT0FBTyxHQUFHO0FBQUEsWUFFckMsS0FBSztBQUNILHFCQUFPLFlBQVksTUFBTSxPQUFPLEdBQUc7QUFBQSxZQUVyQyxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQ0gscUJBQU8sYUFBYSxNQUFNLE9BQU8sR0FBRztBQUFBLFlBRXRDO0FBQ0Usa0JBQUksWUFBYSxPQUFNLElBQUksVUFBVSx1QkFBdUIsUUFBUTtBQUNwRSwwQkFBWSxXQUFXLElBQUksWUFBWTtBQUN2Qyw0QkFBYztBQUFBLFVBQ2xCO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFRQSxNQUFBQSxRQUFPLFVBQVUsWUFBWTtBQUU3QixlQUFTLEtBQU0sR0FBRyxHQUFHLEdBQUc7QUFDdEIsY0FBTSxJQUFJLEVBQUUsQ0FBQztBQUNiLFVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNWLFVBQUUsQ0FBQyxJQUFJO0FBQUEsTUFDVDtBQUVBLE1BQUFBLFFBQU8sVUFBVSxTQUFTLFNBQVMsU0FBVTtBQUMzQyxjQUFNLE1BQU0sS0FBSztBQUNqQixZQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ2pCLGdCQUFNLElBQUksV0FBVywyQ0FBMkM7QUFBQSxRQUNsRTtBQUNBLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxHQUFHO0FBQy9CLGVBQUssTUFBTSxHQUFHLElBQUksQ0FBQztBQUFBLFFBQ3JCO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxNQUFBQSxRQUFPLFVBQVUsU0FBUyxTQUFTLFNBQVU7QUFDM0MsY0FBTSxNQUFNLEtBQUs7QUFDakIsWUFBSSxNQUFNLE1BQU0sR0FBRztBQUNqQixnQkFBTSxJQUFJLFdBQVcsMkNBQTJDO0FBQUEsUUFDbEU7QUFDQSxpQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUssR0FBRztBQUMvQixlQUFLLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDbkIsZUFBSyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7QUFBQSxRQUN6QjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsTUFBQUEsUUFBTyxVQUFVLFNBQVMsU0FBUyxTQUFVO0FBQzNDLGNBQU0sTUFBTSxLQUFLO0FBQ2pCLFlBQUksTUFBTSxNQUFNLEdBQUc7QUFDakIsZ0JBQU0sSUFBSSxXQUFXLDJDQUEyQztBQUFBLFFBQ2xFO0FBQ0EsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUc7QUFDL0IsZUFBSyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ25CLGVBQUssTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLGVBQUssTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLGVBQUssTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQUEsUUFDekI7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLE1BQUFBLFFBQU8sVUFBVSxXQUFXLFNBQVMsV0FBWTtBQUMvQyxjQUFNLFNBQVMsS0FBSztBQUNwQixZQUFJLFdBQVcsRUFBRyxRQUFPO0FBQ3pCLFlBQUksVUFBVSxXQUFXLEVBQUcsUUFBTyxVQUFVLE1BQU0sR0FBRyxNQUFNO0FBQzVELGVBQU8sYUFBYSxNQUFNLE1BQU0sU0FBUztBQUFBLE1BQzNDO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGlCQUFpQkEsUUFBTyxVQUFVO0FBRW5ELE1BQUFBLFFBQU8sVUFBVSxTQUFTLFNBQVMsT0FBUSxHQUFHO0FBQzVDLFlBQUksQ0FBQ0EsUUFBTyxTQUFTLENBQUMsRUFBRyxPQUFNLElBQUksVUFBVSwyQkFBMkI7QUFDeEUsWUFBSSxTQUFTLEVBQUcsUUFBTztBQUN2QixlQUFPQSxRQUFPLFFBQVEsTUFBTSxDQUFDLE1BQU07QUFBQSxNQUNyQztBQUVBLE1BQUFBLFFBQU8sVUFBVSxVQUFVLFNBQVMsVUFBVztBQUM3QyxZQUFJLE1BQU07QUFDVixjQUFNLE1BQU0sUUFBUTtBQUNwQixjQUFNLEtBQUssU0FBUyxPQUFPLEdBQUcsR0FBRyxFQUFFLFFBQVEsV0FBVyxLQUFLLEVBQUUsS0FBSztBQUNsRSxZQUFJLEtBQUssU0FBUyxJQUFLLFFBQU87QUFDOUIsZUFBTyxhQUFhLE1BQU07QUFBQSxNQUM1QjtBQUNBLFVBQUkscUJBQXFCO0FBQ3ZCLFFBQUFBLFFBQU8sVUFBVSxtQkFBbUIsSUFBSUEsUUFBTyxVQUFVO0FBQUEsTUFDM0Q7QUFFQSxNQUFBQSxRQUFPLFVBQVUsVUFBVSxTQUFTLFFBQVMsUUFBUSxPQUFPLEtBQUssV0FBVyxTQUFTO0FBQ25GLFlBQUksV0FBVyxRQUFRLFVBQVUsR0FBRztBQUNsQyxtQkFBU0EsUUFBTyxLQUFLLFFBQVEsT0FBTyxRQUFRLE9BQU8sVUFBVTtBQUFBLFFBQy9EO0FBQ0EsWUFBSSxDQUFDQSxRQUFPLFNBQVMsTUFBTSxHQUFHO0FBQzVCLGdCQUFNLElBQUk7QUFBQSxZQUNSLG1GQUNvQixPQUFPO0FBQUEsVUFDN0I7QUFBQSxRQUNGO0FBRUEsWUFBSSxVQUFVLFFBQVc7QUFDdkIsa0JBQVE7QUFBQSxRQUNWO0FBQ0EsWUFBSSxRQUFRLFFBQVc7QUFDckIsZ0JBQU0sU0FBUyxPQUFPLFNBQVM7QUFBQSxRQUNqQztBQUNBLFlBQUksY0FBYyxRQUFXO0FBQzNCLHNCQUFZO0FBQUEsUUFDZDtBQUNBLFlBQUksWUFBWSxRQUFXO0FBQ3pCLG9CQUFVLEtBQUs7QUFBQSxRQUNqQjtBQUVBLFlBQUksUUFBUSxLQUFLLE1BQU0sT0FBTyxVQUFVLFlBQVksS0FBSyxVQUFVLEtBQUssUUFBUTtBQUM5RSxnQkFBTSxJQUFJLFdBQVcsb0JBQW9CO0FBQUEsUUFDM0M7QUFFQSxZQUFJLGFBQWEsV0FBVyxTQUFTLEtBQUs7QUFDeEMsaUJBQU87QUFBQSxRQUNUO0FBQ0EsWUFBSSxhQUFhLFNBQVM7QUFDeEIsaUJBQU87QUFBQSxRQUNUO0FBQ0EsWUFBSSxTQUFTLEtBQUs7QUFDaEIsaUJBQU87QUFBQSxRQUNUO0FBRUEsbUJBQVc7QUFDWCxpQkFBUztBQUNULHVCQUFlO0FBQ2YscUJBQWE7QUFFYixZQUFJLFNBQVMsT0FBUSxRQUFPO0FBRTVCLFlBQUksSUFBSSxVQUFVO0FBQ2xCLFlBQUksSUFBSSxNQUFNO0FBQ2QsY0FBTSxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUM7QUFFekIsY0FBTSxXQUFXLEtBQUssTUFBTSxXQUFXLE9BQU87QUFDOUMsY0FBTSxhQUFhLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFFMUMsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDNUIsY0FBSSxTQUFTLENBQUMsTUFBTSxXQUFXLENBQUMsR0FBRztBQUNqQyxnQkFBSSxTQUFTLENBQUM7QUFDZCxnQkFBSSxXQUFXLENBQUM7QUFDaEI7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLFlBQUksSUFBSSxFQUFHLFFBQU87QUFDbEIsWUFBSSxJQUFJLEVBQUcsUUFBTztBQUNsQixlQUFPO0FBQUEsTUFDVDtBQVdBLGVBQVMscUJBQXNCLFFBQVEsS0FBSyxZQUFZLFVBQVUsS0FBSztBQUVyRSxZQUFJLE9BQU8sV0FBVyxFQUFHLFFBQU87QUFHaEMsWUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxxQkFBVztBQUNYLHVCQUFhO0FBQUEsUUFDZixXQUFXLGFBQWEsWUFBWTtBQUNsQyx1QkFBYTtBQUFBLFFBQ2YsV0FBVyxhQUFhLGFBQWE7QUFDbkMsdUJBQWE7QUFBQSxRQUNmO0FBQ0EscUJBQWEsQ0FBQztBQUNkLFlBQUksWUFBWSxVQUFVLEdBQUc7QUFFM0IsdUJBQWEsTUFBTSxJQUFLLE9BQU8sU0FBUztBQUFBLFFBQzFDO0FBR0EsWUFBSSxhQUFhLEVBQUcsY0FBYSxPQUFPLFNBQVM7QUFDakQsWUFBSSxjQUFjLE9BQU8sUUFBUTtBQUMvQixjQUFJLElBQUssUUFBTztBQUFBLGNBQ1gsY0FBYSxPQUFPLFNBQVM7QUFBQSxRQUNwQyxXQUFXLGFBQWEsR0FBRztBQUN6QixjQUFJLElBQUssY0FBYTtBQUFBLGNBQ2pCLFFBQU87QUFBQSxRQUNkO0FBR0EsWUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixnQkFBTUEsUUFBTyxLQUFLLEtBQUssUUFBUTtBQUFBLFFBQ2pDO0FBR0EsWUFBSUEsUUFBTyxTQUFTLEdBQUcsR0FBRztBQUV4QixjQUFJLElBQUksV0FBVyxHQUFHO0FBQ3BCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLGFBQWEsUUFBUSxLQUFLLFlBQVksVUFBVSxHQUFHO0FBQUEsUUFDNUQsV0FBVyxPQUFPLFFBQVEsVUFBVTtBQUNsQyxnQkFBTSxNQUFNO0FBQ1osY0FBSSxPQUFPLFdBQVcsVUFBVSxZQUFZLFlBQVk7QUFDdEQsZ0JBQUksS0FBSztBQUNQLHFCQUFPLFdBQVcsVUFBVSxRQUFRLEtBQUssUUFBUSxLQUFLLFVBQVU7QUFBQSxZQUNsRSxPQUFPO0FBQ0wscUJBQU8sV0FBVyxVQUFVLFlBQVksS0FBSyxRQUFRLEtBQUssVUFBVTtBQUFBLFlBQ3RFO0FBQUEsVUFDRjtBQUNBLGlCQUFPLGFBQWEsUUFBUSxDQUFDLEdBQUcsR0FBRyxZQUFZLFVBQVUsR0FBRztBQUFBLFFBQzlEO0FBRUEsY0FBTSxJQUFJLFVBQVUsc0NBQXNDO0FBQUEsTUFDNUQ7QUFFQSxlQUFTLGFBQWMsS0FBSyxLQUFLLFlBQVksVUFBVSxLQUFLO0FBQzFELFlBQUksWUFBWTtBQUNoQixZQUFJLFlBQVksSUFBSTtBQUNwQixZQUFJLFlBQVksSUFBSTtBQUVwQixZQUFJLGFBQWEsUUFBVztBQUMxQixxQkFBVyxPQUFPLFFBQVEsRUFBRSxZQUFZO0FBQ3hDLGNBQUksYUFBYSxVQUFVLGFBQWEsV0FDcEMsYUFBYSxhQUFhLGFBQWEsWUFBWTtBQUNyRCxnQkFBSSxJQUFJLFNBQVMsS0FBSyxJQUFJLFNBQVMsR0FBRztBQUNwQyxxQkFBTztBQUFBLFlBQ1Q7QUFDQSx3QkFBWTtBQUNaLHlCQUFhO0FBQ2IseUJBQWE7QUFDYiwwQkFBYztBQUFBLFVBQ2hCO0FBQUEsUUFDRjtBQUVBLGlCQUFTLEtBQU0sS0FBS0csSUFBRztBQUNyQixjQUFJLGNBQWMsR0FBRztBQUNuQixtQkFBTyxJQUFJQSxFQUFDO0FBQUEsVUFDZCxPQUFPO0FBQ0wsbUJBQU8sSUFBSSxhQUFhQSxLQUFJLFNBQVM7QUFBQSxVQUN2QztBQUFBLFFBQ0Y7QUFFQSxZQUFJO0FBQ0osWUFBSSxLQUFLO0FBQ1AsY0FBSSxhQUFhO0FBQ2pCLGVBQUssSUFBSSxZQUFZLElBQUksV0FBVyxLQUFLO0FBQ3ZDLGdCQUFJLEtBQUssS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLGVBQWUsS0FBSyxJQUFJLElBQUksVUFBVSxHQUFHO0FBQ3RFLGtCQUFJLGVBQWUsR0FBSSxjQUFhO0FBQ3BDLGtCQUFJLElBQUksYUFBYSxNQUFNLFVBQVcsUUFBTyxhQUFhO0FBQUEsWUFDNUQsT0FBTztBQUNMLGtCQUFJLGVBQWUsR0FBSSxNQUFLLElBQUk7QUFDaEMsMkJBQWE7QUFBQSxZQUNmO0FBQUEsVUFDRjtBQUFBLFFBQ0YsT0FBTztBQUNMLGNBQUksYUFBYSxZQUFZLFVBQVcsY0FBYSxZQUFZO0FBQ2pFLGVBQUssSUFBSSxZQUFZLEtBQUssR0FBRyxLQUFLO0FBQ2hDLGdCQUFJLFFBQVE7QUFDWixxQkFBUyxJQUFJLEdBQUcsSUFBSSxXQUFXLEtBQUs7QUFDbEMsa0JBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLEdBQUc7QUFDckMsd0JBQVE7QUFDUjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQ0EsZ0JBQUksTUFBTyxRQUFPO0FBQUEsVUFDcEI7QUFBQSxRQUNGO0FBRUEsZUFBTztBQUFBLE1BQ1Q7QUFFQSxNQUFBSCxRQUFPLFVBQVUsV0FBVyxTQUFTLFNBQVUsS0FBSyxZQUFZLFVBQVU7QUFDeEUsZUFBTyxLQUFLLFFBQVEsS0FBSyxZQUFZLFFBQVEsTUFBTTtBQUFBLE1BQ3JEO0FBRUEsTUFBQUEsUUFBTyxVQUFVLFVBQVUsU0FBUyxRQUFTLEtBQUssWUFBWSxVQUFVO0FBQ3RFLGVBQU8scUJBQXFCLE1BQU0sS0FBSyxZQUFZLFVBQVUsSUFBSTtBQUFBLE1BQ25FO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGNBQWMsU0FBUyxZQUFhLEtBQUssWUFBWSxVQUFVO0FBQzlFLGVBQU8scUJBQXFCLE1BQU0sS0FBSyxZQUFZLFVBQVUsS0FBSztBQUFBLE1BQ3BFO0FBRUEsZUFBUyxTQUFVLEtBQUssUUFBUSxRQUFRLFFBQVE7QUFDOUMsaUJBQVMsT0FBTyxNQUFNLEtBQUs7QUFDM0IsY0FBTSxZQUFZLElBQUksU0FBUztBQUMvQixZQUFJLENBQUMsUUFBUTtBQUNYLG1CQUFTO0FBQUEsUUFDWCxPQUFPO0FBQ0wsbUJBQVMsT0FBTyxNQUFNO0FBQ3RCLGNBQUksU0FBUyxXQUFXO0FBQ3RCLHFCQUFTO0FBQUEsVUFDWDtBQUFBLFFBQ0Y7QUFFQSxjQUFNLFNBQVMsT0FBTztBQUV0QixZQUFJLFNBQVMsU0FBUyxHQUFHO0FBQ3ZCLG1CQUFTLFNBQVM7QUFBQSxRQUNwQjtBQUNBLFlBQUk7QUFDSixhQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRSxHQUFHO0FBQzNCLGdCQUFNLFNBQVMsU0FBUyxPQUFPLE9BQU8sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQ25ELGNBQUksWUFBWSxNQUFNLEVBQUcsUUFBTztBQUNoQyxjQUFJLFNBQVMsQ0FBQyxJQUFJO0FBQUEsUUFDcEI7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVMsVUFBVyxLQUFLLFFBQVEsUUFBUSxRQUFRO0FBQy9DLGVBQU8sV0FBV0MsYUFBWSxRQUFRLElBQUksU0FBUyxNQUFNLEdBQUcsS0FBSyxRQUFRLE1BQU07QUFBQSxNQUNqRjtBQUVBLGVBQVMsV0FBWSxLQUFLLFFBQVEsUUFBUSxRQUFRO0FBQ2hELGVBQU8sV0FBV0csY0FBYSxNQUFNLEdBQUcsS0FBSyxRQUFRLE1BQU07QUFBQSxNQUM3RDtBQUVBLGVBQVMsWUFBYSxLQUFLLFFBQVEsUUFBUSxRQUFRO0FBQ2pELGVBQU8sV0FBV0YsZUFBYyxNQUFNLEdBQUcsS0FBSyxRQUFRLE1BQU07QUFBQSxNQUM5RDtBQUVBLGVBQVMsVUFBVyxLQUFLLFFBQVEsUUFBUSxRQUFRO0FBQy9DLGVBQU8sV0FBVyxlQUFlLFFBQVEsSUFBSSxTQUFTLE1BQU0sR0FBRyxLQUFLLFFBQVEsTUFBTTtBQUFBLE1BQ3BGO0FBRUEsTUFBQUYsUUFBTyxVQUFVLFFBQVEsU0FBUyxNQUFPLFFBQVEsUUFBUSxRQUFRLFVBQVU7QUFFekUsWUFBSSxXQUFXLFFBQVc7QUFDeEIscUJBQVc7QUFDWCxtQkFBUyxLQUFLO0FBQ2QsbUJBQVM7QUFBQSxRQUVYLFdBQVcsV0FBVyxVQUFhLE9BQU8sV0FBVyxVQUFVO0FBQzdELHFCQUFXO0FBQ1gsbUJBQVMsS0FBSztBQUNkLG1CQUFTO0FBQUEsUUFFWCxXQUFXLFNBQVMsTUFBTSxHQUFHO0FBQzNCLG1CQUFTLFdBQVc7QUFDcEIsY0FBSSxTQUFTLE1BQU0sR0FBRztBQUNwQixxQkFBUyxXQUFXO0FBQ3BCLGdCQUFJLGFBQWEsT0FBVyxZQUFXO0FBQUEsVUFDekMsT0FBTztBQUNMLHVCQUFXO0FBQ1gscUJBQVM7QUFBQSxVQUNYO0FBQUEsUUFDRixPQUFPO0FBQ0wsZ0JBQU0sSUFBSTtBQUFBLFlBQ1I7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLGNBQU0sWUFBWSxLQUFLLFNBQVM7QUFDaEMsWUFBSSxXQUFXLFVBQWEsU0FBUyxVQUFXLFVBQVM7QUFFekQsWUFBSyxPQUFPLFNBQVMsTUFBTSxTQUFTLEtBQUssU0FBUyxNQUFPLFNBQVMsS0FBSyxRQUFRO0FBQzdFLGdCQUFNLElBQUksV0FBVyx3Q0FBd0M7QUFBQSxRQUMvRDtBQUVBLFlBQUksQ0FBQyxTQUFVLFlBQVc7QUFFMUIsWUFBSSxjQUFjO0FBQ2xCLG1CQUFTO0FBQ1Asa0JBQVEsVUFBVTtBQUFBLFlBQ2hCLEtBQUs7QUFDSCxxQkFBTyxTQUFTLE1BQU0sUUFBUSxRQUFRLE1BQU07QUFBQSxZQUU5QyxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQ0gscUJBQU8sVUFBVSxNQUFNLFFBQVEsUUFBUSxNQUFNO0FBQUEsWUFFL0MsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUNILHFCQUFPLFdBQVcsTUFBTSxRQUFRLFFBQVEsTUFBTTtBQUFBLFlBRWhELEtBQUs7QUFFSCxxQkFBTyxZQUFZLE1BQU0sUUFBUSxRQUFRLE1BQU07QUFBQSxZQUVqRCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQ0gscUJBQU8sVUFBVSxNQUFNLFFBQVEsUUFBUSxNQUFNO0FBQUEsWUFFL0M7QUFDRSxrQkFBSSxZQUFhLE9BQU0sSUFBSSxVQUFVLHVCQUF1QixRQUFRO0FBQ3BFLDBCQUFZLEtBQUssVUFBVSxZQUFZO0FBQ3ZDLDRCQUFjO0FBQUEsVUFDbEI7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxTQUFTLFNBQVMsU0FBVTtBQUMzQyxlQUFPO0FBQUEsVUFDTCxNQUFNO0FBQUEsVUFDTixNQUFNLE1BQU0sVUFBVSxNQUFNLEtBQUssS0FBSyxRQUFRLE1BQU0sQ0FBQztBQUFBLFFBQ3ZEO0FBQUEsTUFDRjtBQUVBLGVBQVMsWUFBYSxLQUFLLE9BQU8sS0FBSztBQUNyQyxZQUFJLFVBQVUsS0FBSyxRQUFRLElBQUksUUFBUTtBQUNyQyxpQkFBT0QsUUFBTyxjQUFjLEdBQUc7QUFBQSxRQUNqQyxPQUFPO0FBQ0wsaUJBQU9BLFFBQU8sY0FBYyxJQUFJLE1BQU0sT0FBTyxHQUFHLENBQUM7QUFBQSxRQUNuRDtBQUFBLE1BQ0Y7QUFFQSxlQUFTLFVBQVcsS0FBSyxPQUFPLEtBQUs7QUFDbkMsY0FBTSxLQUFLLElBQUksSUFBSSxRQUFRLEdBQUc7QUFDOUIsY0FBTSxNQUFNLENBQUM7QUFFYixZQUFJLElBQUk7QUFDUixlQUFPLElBQUksS0FBSztBQUNkLGdCQUFNLFlBQVksSUFBSSxDQUFDO0FBQ3ZCLGNBQUksWUFBWTtBQUNoQixjQUFJLG1CQUFvQixZQUFZLE1BQ2hDLElBQ0MsWUFBWSxNQUNULElBQ0MsWUFBWSxNQUNULElBQ0E7QUFFWixjQUFJLElBQUksb0JBQW9CLEtBQUs7QUFDL0IsZ0JBQUksWUFBWSxXQUFXLFlBQVk7QUFFdkMsb0JBQVEsa0JBQWtCO0FBQUEsY0FDeEIsS0FBSztBQUNILG9CQUFJLFlBQVksS0FBTTtBQUNwQiw4QkFBWTtBQUFBLGdCQUNkO0FBQ0E7QUFBQSxjQUNGLEtBQUs7QUFDSCw2QkFBYSxJQUFJLElBQUksQ0FBQztBQUN0QixxQkFBSyxhQUFhLFNBQVUsS0FBTTtBQUNoQyxtQ0FBaUIsWUFBWSxPQUFTLElBQU8sYUFBYTtBQUMxRCxzQkFBSSxnQkFBZ0IsS0FBTTtBQUN4QixnQ0FBWTtBQUFBLGtCQUNkO0FBQUEsZ0JBQ0Y7QUFDQTtBQUFBLGNBQ0YsS0FBSztBQUNILDZCQUFhLElBQUksSUFBSSxDQUFDO0FBQ3RCLDRCQUFZLElBQUksSUFBSSxDQUFDO0FBQ3JCLHFCQUFLLGFBQWEsU0FBVSxRQUFTLFlBQVksU0FBVSxLQUFNO0FBQy9ELG1DQUFpQixZQUFZLE9BQVEsTUFBTyxhQUFhLE9BQVMsSUFBTyxZQUFZO0FBQ3JGLHNCQUFJLGdCQUFnQixTQUFVLGdCQUFnQixTQUFVLGdCQUFnQixRQUFTO0FBQy9FLGdDQUFZO0FBQUEsa0JBQ2Q7QUFBQSxnQkFDRjtBQUNBO0FBQUEsY0FDRixLQUFLO0FBQ0gsNkJBQWEsSUFBSSxJQUFJLENBQUM7QUFDdEIsNEJBQVksSUFBSSxJQUFJLENBQUM7QUFDckIsNkJBQWEsSUFBSSxJQUFJLENBQUM7QUFDdEIscUJBQUssYUFBYSxTQUFVLFFBQVMsWUFBWSxTQUFVLFFBQVMsYUFBYSxTQUFVLEtBQU07QUFDL0YsbUNBQWlCLFlBQVksT0FBUSxNQUFRLGFBQWEsT0FBUyxNQUFPLFlBQVksT0FBUyxJQUFPLGFBQWE7QUFDbkgsc0JBQUksZ0JBQWdCLFNBQVUsZ0JBQWdCLFNBQVU7QUFDdEQsZ0NBQVk7QUFBQSxrQkFDZDtBQUFBLGdCQUNGO0FBQUEsWUFDSjtBQUFBLFVBQ0Y7QUFFQSxjQUFJLGNBQWMsTUFBTTtBQUd0Qix3QkFBWTtBQUNaLCtCQUFtQjtBQUFBLFVBQ3JCLFdBQVcsWUFBWSxPQUFRO0FBRTdCLHlCQUFhO0FBQ2IsZ0JBQUksS0FBSyxjQUFjLEtBQUssT0FBUSxLQUFNO0FBQzFDLHdCQUFZLFFBQVMsWUFBWTtBQUFBLFVBQ25DO0FBRUEsY0FBSSxLQUFLLFNBQVM7QUFDbEIsZUFBSztBQUFBLFFBQ1A7QUFFQSxlQUFPLHNCQUFzQixHQUFHO0FBQUEsTUFDbEM7QUFLQSxVQUFNLHVCQUF1QjtBQUU3QixlQUFTLHNCQUF1QixZQUFZO0FBQzFDLGNBQU0sTUFBTSxXQUFXO0FBQ3ZCLFlBQUksT0FBTyxzQkFBc0I7QUFDL0IsaUJBQU8sT0FBTyxhQUFhLE1BQU0sUUFBUSxVQUFVO0FBQUEsUUFDckQ7QUFHQSxZQUFJLE1BQU07QUFDVixZQUFJLElBQUk7QUFDUixlQUFPLElBQUksS0FBSztBQUNkLGlCQUFPLE9BQU8sYUFBYTtBQUFBLFlBQ3pCO0FBQUEsWUFDQSxXQUFXLE1BQU0sR0FBRyxLQUFLLG9CQUFvQjtBQUFBLFVBQy9DO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxXQUFZLEtBQUssT0FBTyxLQUFLO0FBQ3BDLFlBQUksTUFBTTtBQUNWLGNBQU0sS0FBSyxJQUFJLElBQUksUUFBUSxHQUFHO0FBRTlCLGlCQUFTLElBQUksT0FBTyxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQ2hDLGlCQUFPLE9BQU8sYUFBYSxJQUFJLENBQUMsSUFBSSxHQUFJO0FBQUEsUUFDMUM7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVMsWUFBYSxLQUFLLE9BQU8sS0FBSztBQUNyQyxZQUFJLE1BQU07QUFDVixjQUFNLEtBQUssSUFBSSxJQUFJLFFBQVEsR0FBRztBQUU5QixpQkFBUyxJQUFJLE9BQU8sSUFBSSxLQUFLLEVBQUUsR0FBRztBQUNoQyxpQkFBTyxPQUFPLGFBQWEsSUFBSSxDQUFDLENBQUM7QUFBQSxRQUNuQztBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxTQUFVLEtBQUssT0FBTyxLQUFLO0FBQ2xDLGNBQU0sTUFBTSxJQUFJO0FBRWhCLFlBQUksQ0FBQyxTQUFTLFFBQVEsRUFBRyxTQUFRO0FBQ2pDLFlBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxNQUFNLElBQUssT0FBTTtBQUV4QyxZQUFJLE1BQU07QUFDVixpQkFBUyxJQUFJLE9BQU8sSUFBSSxLQUFLLEVBQUUsR0FBRztBQUNoQyxpQkFBTyxvQkFBb0IsSUFBSSxDQUFDLENBQUM7QUFBQSxRQUNuQztBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxhQUFjLEtBQUssT0FBTyxLQUFLO0FBQ3RDLGNBQU0sUUFBUSxJQUFJLE1BQU0sT0FBTyxHQUFHO0FBQ2xDLFlBQUksTUFBTTtBQUVWLGlCQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRztBQUM1QyxpQkFBTyxPQUFPLGFBQWEsTUFBTSxDQUFDLElBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxHQUFJO0FBQUEsUUFDNUQ7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUVBLE1BQUFDLFFBQU8sVUFBVSxRQUFRLFNBQVMsTUFBTyxPQUFPLEtBQUs7QUFDbkQsY0FBTSxNQUFNLEtBQUs7QUFDakIsZ0JBQVEsQ0FBQyxDQUFDO0FBQ1YsY0FBTSxRQUFRLFNBQVksTUFBTSxDQUFDLENBQUM7QUFFbEMsWUFBSSxRQUFRLEdBQUc7QUFDYixtQkFBUztBQUNULGNBQUksUUFBUSxFQUFHLFNBQVE7QUFBQSxRQUN6QixXQUFXLFFBQVEsS0FBSztBQUN0QixrQkFBUTtBQUFBLFFBQ1Y7QUFFQSxZQUFJLE1BQU0sR0FBRztBQUNYLGlCQUFPO0FBQ1AsY0FBSSxNQUFNLEVBQUcsT0FBTTtBQUFBLFFBQ3JCLFdBQVcsTUFBTSxLQUFLO0FBQ3BCLGdCQUFNO0FBQUEsUUFDUjtBQUVBLFlBQUksTUFBTSxNQUFPLE9BQU07QUFFdkIsY0FBTSxTQUFTLEtBQUssU0FBUyxPQUFPLEdBQUc7QUFFdkMsZUFBTyxlQUFlLFFBQVFBLFFBQU8sU0FBUztBQUU5QyxlQUFPO0FBQUEsTUFDVDtBQUtBLGVBQVMsWUFBYSxRQUFRLEtBQUssUUFBUTtBQUN6QyxZQUFLLFNBQVMsTUFBTyxLQUFLLFNBQVMsRUFBRyxPQUFNLElBQUksV0FBVyxvQkFBb0I7QUFDL0UsWUFBSSxTQUFTLE1BQU0sT0FBUSxPQUFNLElBQUksV0FBVyx1Q0FBdUM7QUFBQSxNQUN6RjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxhQUNqQkEsUUFBTyxVQUFVLGFBQWEsU0FBUyxXQUFZLFFBQVFLLGFBQVksVUFBVTtBQUMvRSxpQkFBUyxXQUFXO0FBQ3BCLFFBQUFBLGNBQWFBLGdCQUFlO0FBQzVCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUUEsYUFBWSxLQUFLLE1BQU07QUFFMUQsWUFBSSxNQUFNLEtBQUssTUFBTTtBQUNyQixZQUFJLE1BQU07QUFDVixZQUFJLElBQUk7QUFDUixlQUFPLEVBQUUsSUFBSUEsZ0JBQWUsT0FBTyxNQUFRO0FBQ3pDLGlCQUFPLEtBQUssU0FBUyxDQUFDLElBQUk7QUFBQSxRQUM1QjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBRUEsTUFBQUwsUUFBTyxVQUFVLGFBQ2pCQSxRQUFPLFVBQVUsYUFBYSxTQUFTLFdBQVksUUFBUUssYUFBWSxVQUFVO0FBQy9FLGlCQUFTLFdBQVc7QUFDcEIsUUFBQUEsY0FBYUEsZ0JBQWU7QUFDNUIsWUFBSSxDQUFDLFVBQVU7QUFDYixzQkFBWSxRQUFRQSxhQUFZLEtBQUssTUFBTTtBQUFBLFFBQzdDO0FBRUEsWUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFQSxXQUFVO0FBQ3BDLFlBQUksTUFBTTtBQUNWLGVBQU9BLGNBQWEsTUFBTSxPQUFPLE1BQVE7QUFDdkMsaUJBQU8sS0FBSyxTQUFTLEVBQUVBLFdBQVUsSUFBSTtBQUFBLFFBQ3ZDO0FBRUEsZUFBTztBQUFBLE1BQ1Q7QUFFQSxNQUFBTCxRQUFPLFVBQVUsWUFDakJBLFFBQU8sVUFBVSxZQUFZLFNBQVMsVUFBVyxRQUFRLFVBQVU7QUFDakUsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxhQUFZLFFBQVEsR0FBRyxLQUFLLE1BQU07QUFDakQsZUFBTyxLQUFLLE1BQU07QUFBQSxNQUNwQjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxlQUNqQkEsUUFBTyxVQUFVLGVBQWUsU0FBUyxhQUFjLFFBQVEsVUFBVTtBQUN2RSxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUSxHQUFHLEtBQUssTUFBTTtBQUNqRCxlQUFPLEtBQUssTUFBTSxJQUFLLEtBQUssU0FBUyxDQUFDLEtBQUs7QUFBQSxNQUM3QztBQUVBLE1BQUFBLFFBQU8sVUFBVSxlQUNqQkEsUUFBTyxVQUFVLGVBQWUsU0FBUyxhQUFjLFFBQVEsVUFBVTtBQUN2RSxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUSxHQUFHLEtBQUssTUFBTTtBQUNqRCxlQUFRLEtBQUssTUFBTSxLQUFLLElBQUssS0FBSyxTQUFTLENBQUM7QUFBQSxNQUM5QztBQUVBLE1BQUFBLFFBQU8sVUFBVSxlQUNqQkEsUUFBTyxVQUFVLGVBQWUsU0FBUyxhQUFjLFFBQVEsVUFBVTtBQUN2RSxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUSxHQUFHLEtBQUssTUFBTTtBQUVqRCxnQkFBUyxLQUFLLE1BQU0sSUFDZixLQUFLLFNBQVMsQ0FBQyxLQUFLLElBQ3BCLEtBQUssU0FBUyxDQUFDLEtBQUssTUFDcEIsS0FBSyxTQUFTLENBQUMsSUFBSTtBQUFBLE1BQzFCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGVBQ2pCQSxRQUFPLFVBQVUsZUFBZSxTQUFTLGFBQWMsUUFBUSxVQUFVO0FBQ3ZFLGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsYUFBWSxRQUFRLEdBQUcsS0FBSyxNQUFNO0FBRWpELGVBQVEsS0FBSyxNQUFNLElBQUksWUFDbkIsS0FBSyxTQUFTLENBQUMsS0FBSyxLQUNyQixLQUFLLFNBQVMsQ0FBQyxLQUFLLElBQ3JCLEtBQUssU0FBUyxDQUFDO0FBQUEsTUFDbkI7QUFFQSxNQUFBQSxRQUFPLFVBQVUsa0JBQWtCLG1CQUFtQixTQUFTLGdCQUFpQixRQUFRO0FBQ3RGLGlCQUFTLFdBQVc7QUFDcEIsdUJBQWUsUUFBUSxRQUFRO0FBQy9CLGNBQU0sUUFBUSxLQUFLLE1BQU07QUFDekIsY0FBTSxPQUFPLEtBQUssU0FBUyxDQUFDO0FBQzVCLFlBQUksVUFBVSxVQUFhLFNBQVMsUUFBVztBQUM3QyxzQkFBWSxRQUFRLEtBQUssU0FBUyxDQUFDO0FBQUEsUUFDckM7QUFFQSxjQUFNLEtBQUssUUFDVCxLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssSUFDdEIsS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLEtBQ3RCLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSztBQUV4QixjQUFNLEtBQUssS0FBSyxFQUFFLE1BQU0sSUFDdEIsS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLElBQ3RCLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxLQUN0QixPQUFPLEtBQUs7QUFFZCxlQUFPLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBRTtBQUFBLE1BQzlDLENBQUM7QUFFRCxNQUFBQSxRQUFPLFVBQVUsa0JBQWtCLG1CQUFtQixTQUFTLGdCQUFpQixRQUFRO0FBQ3RGLGlCQUFTLFdBQVc7QUFDcEIsdUJBQWUsUUFBUSxRQUFRO0FBQy9CLGNBQU0sUUFBUSxLQUFLLE1BQU07QUFDekIsY0FBTSxPQUFPLEtBQUssU0FBUyxDQUFDO0FBQzVCLFlBQUksVUFBVSxVQUFhLFNBQVMsUUFBVztBQUM3QyxzQkFBWSxRQUFRLEtBQUssU0FBUyxDQUFDO0FBQUEsUUFDckM7QUFFQSxjQUFNLEtBQUssUUFBUSxLQUFLLEtBQ3RCLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxLQUN0QixLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssSUFDdEIsS0FBSyxFQUFFLE1BQU07QUFFZixjQUFNLEtBQUssS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLEtBQy9CLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxLQUN0QixLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssSUFDdEI7QUFFRixnQkFBUSxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUU7QUFBQSxNQUMvQyxDQUFDO0FBRUQsTUFBQUEsUUFBTyxVQUFVLFlBQVksU0FBUyxVQUFXLFFBQVFLLGFBQVksVUFBVTtBQUM3RSxpQkFBUyxXQUFXO0FBQ3BCLFFBQUFBLGNBQWFBLGdCQUFlO0FBQzVCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUUEsYUFBWSxLQUFLLE1BQU07QUFFMUQsWUFBSSxNQUFNLEtBQUssTUFBTTtBQUNyQixZQUFJLE1BQU07QUFDVixZQUFJLElBQUk7QUFDUixlQUFPLEVBQUUsSUFBSUEsZ0JBQWUsT0FBTyxNQUFRO0FBQ3pDLGlCQUFPLEtBQUssU0FBUyxDQUFDLElBQUk7QUFBQSxRQUM1QjtBQUNBLGVBQU87QUFFUCxZQUFJLE9BQU8sSUFBSyxRQUFPLEtBQUssSUFBSSxHQUFHLElBQUlBLFdBQVU7QUFFakQsZUFBTztBQUFBLE1BQ1Q7QUFFQSxNQUFBTCxRQUFPLFVBQVUsWUFBWSxTQUFTLFVBQVcsUUFBUUssYUFBWSxVQUFVO0FBQzdFLGlCQUFTLFdBQVc7QUFDcEIsUUFBQUEsY0FBYUEsZ0JBQWU7QUFDNUIsWUFBSSxDQUFDLFNBQVUsYUFBWSxRQUFRQSxhQUFZLEtBQUssTUFBTTtBQUUxRCxZQUFJLElBQUlBO0FBQ1IsWUFBSSxNQUFNO0FBQ1YsWUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7QUFDM0IsZUFBTyxJQUFJLE1BQU0sT0FBTyxNQUFRO0FBQzlCLGlCQUFPLEtBQUssU0FBUyxFQUFFLENBQUMsSUFBSTtBQUFBLFFBQzlCO0FBQ0EsZUFBTztBQUVQLFlBQUksT0FBTyxJQUFLLFFBQU8sS0FBSyxJQUFJLEdBQUcsSUFBSUEsV0FBVTtBQUVqRCxlQUFPO0FBQUEsTUFDVDtBQUVBLE1BQUFMLFFBQU8sVUFBVSxXQUFXLFNBQVMsU0FBVSxRQUFRLFVBQVU7QUFDL0QsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxhQUFZLFFBQVEsR0FBRyxLQUFLLE1BQU07QUFDakQsWUFBSSxFQUFFLEtBQUssTUFBTSxJQUFJLEtBQU8sUUFBUSxLQUFLLE1BQU07QUFDL0MsZ0JBQVMsTUFBTyxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUEsTUFDdEM7QUFFQSxNQUFBQSxRQUFPLFVBQVUsY0FBYyxTQUFTLFlBQWEsUUFBUSxVQUFVO0FBQ3JFLGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsYUFBWSxRQUFRLEdBQUcsS0FBSyxNQUFNO0FBQ2pELGNBQU0sTUFBTSxLQUFLLE1BQU0sSUFBSyxLQUFLLFNBQVMsQ0FBQyxLQUFLO0FBQ2hELGVBQVEsTUFBTSxRQUFVLE1BQU0sYUFBYTtBQUFBLE1BQzdDO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGNBQWMsU0FBUyxZQUFhLFFBQVEsVUFBVTtBQUNyRSxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUSxHQUFHLEtBQUssTUFBTTtBQUNqRCxjQUFNLE1BQU0sS0FBSyxTQUFTLENBQUMsSUFBSyxLQUFLLE1BQU0sS0FBSztBQUNoRCxlQUFRLE1BQU0sUUFBVSxNQUFNLGFBQWE7QUFBQSxNQUM3QztBQUVBLE1BQUFBLFFBQU8sVUFBVSxjQUFjLFNBQVMsWUFBYSxRQUFRLFVBQVU7QUFDckUsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxhQUFZLFFBQVEsR0FBRyxLQUFLLE1BQU07QUFFakQsZUFBUSxLQUFLLE1BQU0sSUFDaEIsS0FBSyxTQUFTLENBQUMsS0FBSyxJQUNwQixLQUFLLFNBQVMsQ0FBQyxLQUFLLEtBQ3BCLEtBQUssU0FBUyxDQUFDLEtBQUs7QUFBQSxNQUN6QjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxjQUFjLFNBQVMsWUFBYSxRQUFRLFVBQVU7QUFDckUsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxhQUFZLFFBQVEsR0FBRyxLQUFLLE1BQU07QUFFakQsZUFBUSxLQUFLLE1BQU0sS0FBSyxLQUNyQixLQUFLLFNBQVMsQ0FBQyxLQUFLLEtBQ3BCLEtBQUssU0FBUyxDQUFDLEtBQUssSUFDcEIsS0FBSyxTQUFTLENBQUM7QUFBQSxNQUNwQjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxpQkFBaUIsbUJBQW1CLFNBQVMsZUFBZ0IsUUFBUTtBQUNwRixpQkFBUyxXQUFXO0FBQ3BCLHVCQUFlLFFBQVEsUUFBUTtBQUMvQixjQUFNLFFBQVEsS0FBSyxNQUFNO0FBQ3pCLGNBQU0sT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUM1QixZQUFJLFVBQVUsVUFBYSxTQUFTLFFBQVc7QUFDN0Msc0JBQVksUUFBUSxLQUFLLFNBQVMsQ0FBQztBQUFBLFFBQ3JDO0FBRUEsY0FBTSxNQUFNLEtBQUssU0FBUyxDQUFDLElBQ3pCLEtBQUssU0FBUyxDQUFDLElBQUksS0FBSyxJQUN4QixLQUFLLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFDdkIsUUFBUTtBQUVYLGdCQUFRLE9BQU8sR0FBRyxLQUFLLE9BQU8sRUFBRSxLQUM5QixPQUFPLFFBQ1AsS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLElBQ3RCLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxLQUN0QixLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssRUFBRTtBQUFBLE1BQzVCLENBQUM7QUFFRCxNQUFBQSxRQUFPLFVBQVUsaUJBQWlCLG1CQUFtQixTQUFTLGVBQWdCLFFBQVE7QUFDcEYsaUJBQVMsV0FBVztBQUNwQix1QkFBZSxRQUFRLFFBQVE7QUFDL0IsY0FBTSxRQUFRLEtBQUssTUFBTTtBQUN6QixjQUFNLE9BQU8sS0FBSyxTQUFTLENBQUM7QUFDNUIsWUFBSSxVQUFVLFVBQWEsU0FBUyxRQUFXO0FBQzdDLHNCQUFZLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFBQSxRQUNyQztBQUVBLGNBQU0sT0FBTyxTQUFTO0FBQUEsUUFDcEIsS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLEtBQ3RCLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxJQUN0QixLQUFLLEVBQUUsTUFBTTtBQUVmLGdCQUFRLE9BQU8sR0FBRyxLQUFLLE9BQU8sRUFBRSxLQUM5QixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxLQUM3QixLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssS0FDdEIsS0FBSyxFQUFFLE1BQU0sSUFBSSxLQUFLLElBQ3RCLElBQUk7QUFBQSxNQUNSLENBQUM7QUFFRCxNQUFBQSxRQUFPLFVBQVUsY0FBYyxTQUFTLFlBQWEsUUFBUSxVQUFVO0FBQ3JFLGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsYUFBWSxRQUFRLEdBQUcsS0FBSyxNQUFNO0FBQ2pELGVBQU8sUUFBUSxLQUFLLE1BQU0sUUFBUSxNQUFNLElBQUksQ0FBQztBQUFBLE1BQy9DO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGNBQWMsU0FBUyxZQUFhLFFBQVEsVUFBVTtBQUNyRSxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLGFBQVksUUFBUSxHQUFHLEtBQUssTUFBTTtBQUNqRCxlQUFPLFFBQVEsS0FBSyxNQUFNLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFBQSxNQUNoRDtBQUVBLE1BQUFBLFFBQU8sVUFBVSxlQUFlLFNBQVMsYUFBYyxRQUFRLFVBQVU7QUFDdkUsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxhQUFZLFFBQVEsR0FBRyxLQUFLLE1BQU07QUFDakQsZUFBTyxRQUFRLEtBQUssTUFBTSxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDL0M7QUFFQSxNQUFBQSxRQUFPLFVBQVUsZUFBZSxTQUFTLGFBQWMsUUFBUSxVQUFVO0FBQ3ZFLGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsYUFBWSxRQUFRLEdBQUcsS0FBSyxNQUFNO0FBQ2pELGVBQU8sUUFBUSxLQUFLLE1BQU0sUUFBUSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQ2hEO0FBRUEsZUFBUyxTQUFVLEtBQUssT0FBTyxRQUFRLEtBQUssS0FBSyxLQUFLO0FBQ3BELFlBQUksQ0FBQ0EsUUFBTyxTQUFTLEdBQUcsRUFBRyxPQUFNLElBQUksVUFBVSw2Q0FBNkM7QUFDNUYsWUFBSSxRQUFRLE9BQU8sUUFBUSxJQUFLLE9BQU0sSUFBSSxXQUFXLG1DQUFtQztBQUN4RixZQUFJLFNBQVMsTUFBTSxJQUFJLE9BQVEsT0FBTSxJQUFJLFdBQVcsb0JBQW9CO0FBQUEsTUFDMUU7QUFFQSxNQUFBQSxRQUFPLFVBQVUsY0FDakJBLFFBQU8sVUFBVSxjQUFjLFNBQVMsWUFBYSxPQUFPLFFBQVFLLGFBQVksVUFBVTtBQUN4RixnQkFBUSxDQUFDO0FBQ1QsaUJBQVMsV0FBVztBQUNwQixRQUFBQSxjQUFhQSxnQkFBZTtBQUM1QixZQUFJLENBQUMsVUFBVTtBQUNiLGdCQUFNLFdBQVcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsV0FBVSxJQUFJO0FBQy9DLG1CQUFTLE1BQU0sT0FBTyxRQUFRQSxhQUFZLFVBQVUsQ0FBQztBQUFBLFFBQ3ZEO0FBRUEsWUFBSSxNQUFNO0FBQ1YsWUFBSSxJQUFJO0FBQ1IsYUFBSyxNQUFNLElBQUksUUFBUTtBQUN2QixlQUFPLEVBQUUsSUFBSUEsZ0JBQWUsT0FBTyxNQUFRO0FBQ3pDLGVBQUssU0FBUyxDQUFDLElBQUssUUFBUSxNQUFPO0FBQUEsUUFDckM7QUFFQSxlQUFPLFNBQVNBO0FBQUEsTUFDbEI7QUFFQSxNQUFBTCxRQUFPLFVBQVUsY0FDakJBLFFBQU8sVUFBVSxjQUFjLFNBQVMsWUFBYSxPQUFPLFFBQVFLLGFBQVksVUFBVTtBQUN4RixnQkFBUSxDQUFDO0FBQ1QsaUJBQVMsV0FBVztBQUNwQixRQUFBQSxjQUFhQSxnQkFBZTtBQUM1QixZQUFJLENBQUMsVUFBVTtBQUNiLGdCQUFNLFdBQVcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsV0FBVSxJQUFJO0FBQy9DLG1CQUFTLE1BQU0sT0FBTyxRQUFRQSxhQUFZLFVBQVUsQ0FBQztBQUFBLFFBQ3ZEO0FBRUEsWUFBSSxJQUFJQSxjQUFhO0FBQ3JCLFlBQUksTUFBTTtBQUNWLGFBQUssU0FBUyxDQUFDLElBQUksUUFBUTtBQUMzQixlQUFPLEVBQUUsS0FBSyxNQUFNLE9BQU8sTUFBUTtBQUNqQyxlQUFLLFNBQVMsQ0FBQyxJQUFLLFFBQVEsTUFBTztBQUFBLFFBQ3JDO0FBRUEsZUFBTyxTQUFTQTtBQUFBLE1BQ2xCO0FBRUEsTUFBQUwsUUFBTyxVQUFVLGFBQ2pCQSxRQUFPLFVBQVUsYUFBYSxTQUFTLFdBQVksT0FBTyxRQUFRLFVBQVU7QUFDMUUsZ0JBQVEsQ0FBQztBQUNULGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsVUFBUyxNQUFNLE9BQU8sUUFBUSxHQUFHLEtBQU0sQ0FBQztBQUN2RCxhQUFLLE1BQU0sSUFBSyxRQUFRO0FBQ3hCLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGdCQUNqQkEsUUFBTyxVQUFVLGdCQUFnQixTQUFTLGNBQWUsT0FBTyxRQUFRLFVBQVU7QUFDaEYsZ0JBQVEsQ0FBQztBQUNULGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsVUFBUyxNQUFNLE9BQU8sUUFBUSxHQUFHLE9BQVEsQ0FBQztBQUN6RCxhQUFLLE1BQU0sSUFBSyxRQUFRO0FBQ3hCLGFBQUssU0FBUyxDQUFDLElBQUssVUFBVTtBQUM5QixlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxnQkFDakJBLFFBQU8sVUFBVSxnQkFBZ0IsU0FBUyxjQUFlLE9BQU8sUUFBUSxVQUFVO0FBQ2hGLGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLFVBQVMsTUFBTSxPQUFPLFFBQVEsR0FBRyxPQUFRLENBQUM7QUFDekQsYUFBSyxNQUFNLElBQUssVUFBVTtBQUMxQixhQUFLLFNBQVMsQ0FBQyxJQUFLLFFBQVE7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFFQSxNQUFBQSxRQUFPLFVBQVUsZ0JBQ2pCQSxRQUFPLFVBQVUsZ0JBQWdCLFNBQVMsY0FBZSxPQUFPLFFBQVEsVUFBVTtBQUNoRixnQkFBUSxDQUFDO0FBQ1QsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxVQUFTLE1BQU0sT0FBTyxRQUFRLEdBQUcsWUFBWSxDQUFDO0FBQzdELGFBQUssU0FBUyxDQUFDLElBQUssVUFBVTtBQUM5QixhQUFLLFNBQVMsQ0FBQyxJQUFLLFVBQVU7QUFDOUIsYUFBSyxTQUFTLENBQUMsSUFBSyxVQUFVO0FBQzlCLGFBQUssTUFBTSxJQUFLLFFBQVE7QUFDeEIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFFQSxNQUFBQSxRQUFPLFVBQVUsZ0JBQ2pCQSxRQUFPLFVBQVUsZ0JBQWdCLFNBQVMsY0FBZSxPQUFPLFFBQVEsVUFBVTtBQUNoRixnQkFBUSxDQUFDO0FBQ1QsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxVQUFTLE1BQU0sT0FBTyxRQUFRLEdBQUcsWUFBWSxDQUFDO0FBQzdELGFBQUssTUFBTSxJQUFLLFVBQVU7QUFDMUIsYUFBSyxTQUFTLENBQUMsSUFBSyxVQUFVO0FBQzlCLGFBQUssU0FBUyxDQUFDLElBQUssVUFBVTtBQUM5QixhQUFLLFNBQVMsQ0FBQyxJQUFLLFFBQVE7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFFQSxlQUFTLGVBQWdCLEtBQUssT0FBTyxRQUFRLEtBQUssS0FBSztBQUNyRCxtQkFBVyxPQUFPLEtBQUssS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUUxQyxZQUFJLEtBQUssT0FBTyxRQUFRLE9BQU8sVUFBVSxDQUFDO0FBQzFDLFlBQUksUUFBUSxJQUFJO0FBQ2hCLGFBQUssTUFBTTtBQUNYLFlBQUksUUFBUSxJQUFJO0FBQ2hCLGFBQUssTUFBTTtBQUNYLFlBQUksUUFBUSxJQUFJO0FBQ2hCLGFBQUssTUFBTTtBQUNYLFlBQUksUUFBUSxJQUFJO0FBQ2hCLFlBQUksS0FBSyxPQUFPLFNBQVMsT0FBTyxFQUFFLElBQUksT0FBTyxVQUFVLENBQUM7QUFDeEQsWUFBSSxRQUFRLElBQUk7QUFDaEIsYUFBSyxNQUFNO0FBQ1gsWUFBSSxRQUFRLElBQUk7QUFDaEIsYUFBSyxNQUFNO0FBQ1gsWUFBSSxRQUFRLElBQUk7QUFDaEIsYUFBSyxNQUFNO0FBQ1gsWUFBSSxRQUFRLElBQUk7QUFDaEIsZUFBTztBQUFBLE1BQ1Q7QUFFQSxlQUFTLGVBQWdCLEtBQUssT0FBTyxRQUFRLEtBQUssS0FBSztBQUNyRCxtQkFBVyxPQUFPLEtBQUssS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUUxQyxZQUFJLEtBQUssT0FBTyxRQUFRLE9BQU8sVUFBVSxDQUFDO0FBQzFDLFlBQUksU0FBUyxDQUFDLElBQUk7QUFDbEIsYUFBSyxNQUFNO0FBQ1gsWUFBSSxTQUFTLENBQUMsSUFBSTtBQUNsQixhQUFLLE1BQU07QUFDWCxZQUFJLFNBQVMsQ0FBQyxJQUFJO0FBQ2xCLGFBQUssTUFBTTtBQUNYLFlBQUksU0FBUyxDQUFDLElBQUk7QUFDbEIsWUFBSSxLQUFLLE9BQU8sU0FBUyxPQUFPLEVBQUUsSUFBSSxPQUFPLFVBQVUsQ0FBQztBQUN4RCxZQUFJLFNBQVMsQ0FBQyxJQUFJO0FBQ2xCLGFBQUssTUFBTTtBQUNYLFlBQUksU0FBUyxDQUFDLElBQUk7QUFDbEIsYUFBSyxNQUFNO0FBQ1gsWUFBSSxTQUFTLENBQUMsSUFBSTtBQUNsQixhQUFLLE1BQU07QUFDWCxZQUFJLE1BQU0sSUFBSTtBQUNkLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLG1CQUFtQixtQkFBbUIsU0FBUyxpQkFBa0IsT0FBTyxTQUFTLEdBQUc7QUFDbkcsZUFBTyxlQUFlLE1BQU0sT0FBTyxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sb0JBQW9CLENBQUM7QUFBQSxNQUNwRixDQUFDO0FBRUQsTUFBQUEsUUFBTyxVQUFVLG1CQUFtQixtQkFBbUIsU0FBUyxpQkFBa0IsT0FBTyxTQUFTLEdBQUc7QUFDbkcsZUFBTyxlQUFlLE1BQU0sT0FBTyxRQUFRLE9BQU8sQ0FBQyxHQUFHLE9BQU8sb0JBQW9CLENBQUM7QUFBQSxNQUNwRixDQUFDO0FBRUQsTUFBQUEsUUFBTyxVQUFVLGFBQWEsU0FBUyxXQUFZLE9BQU8sUUFBUUssYUFBWSxVQUFVO0FBQ3RGLGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxVQUFVO0FBQ2IsZ0JBQU0sUUFBUSxLQUFLLElBQUksR0FBSSxJQUFJQSxjQUFjLENBQUM7QUFFOUMsbUJBQVMsTUFBTSxPQUFPLFFBQVFBLGFBQVksUUFBUSxHQUFHLENBQUMsS0FBSztBQUFBLFFBQzdEO0FBRUEsWUFBSSxJQUFJO0FBQ1IsWUFBSSxNQUFNO0FBQ1YsWUFBSSxNQUFNO0FBQ1YsYUFBSyxNQUFNLElBQUksUUFBUTtBQUN2QixlQUFPLEVBQUUsSUFBSUEsZ0JBQWUsT0FBTyxNQUFRO0FBQ3pDLGNBQUksUUFBUSxLQUFLLFFBQVEsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sR0FBRztBQUN4RCxrQkFBTTtBQUFBLFVBQ1I7QUFDQSxlQUFLLFNBQVMsQ0FBQyxLQUFNLFFBQVEsT0FBUSxLQUFLLE1BQU07QUFBQSxRQUNsRDtBQUVBLGVBQU8sU0FBU0E7QUFBQSxNQUNsQjtBQUVBLE1BQUFMLFFBQU8sVUFBVSxhQUFhLFNBQVMsV0FBWSxPQUFPLFFBQVFLLGFBQVksVUFBVTtBQUN0RixnQkFBUSxDQUFDO0FBQ1QsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsVUFBVTtBQUNiLGdCQUFNLFFBQVEsS0FBSyxJQUFJLEdBQUksSUFBSUEsY0FBYyxDQUFDO0FBRTlDLG1CQUFTLE1BQU0sT0FBTyxRQUFRQSxhQUFZLFFBQVEsR0FBRyxDQUFDLEtBQUs7QUFBQSxRQUM3RDtBQUVBLFlBQUksSUFBSUEsY0FBYTtBQUNyQixZQUFJLE1BQU07QUFDVixZQUFJLE1BQU07QUFDVixhQUFLLFNBQVMsQ0FBQyxJQUFJLFFBQVE7QUFDM0IsZUFBTyxFQUFFLEtBQUssTUFBTSxPQUFPLE1BQVE7QUFDakMsY0FBSSxRQUFRLEtBQUssUUFBUSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxHQUFHO0FBQ3hELGtCQUFNO0FBQUEsVUFDUjtBQUNBLGVBQUssU0FBUyxDQUFDLEtBQU0sUUFBUSxPQUFRLEtBQUssTUFBTTtBQUFBLFFBQ2xEO0FBRUEsZUFBTyxTQUFTQTtBQUFBLE1BQ2xCO0FBRUEsTUFBQUwsUUFBTyxVQUFVLFlBQVksU0FBUyxVQUFXLE9BQU8sUUFBUSxVQUFVO0FBQ3hFLGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLFVBQVMsTUFBTSxPQUFPLFFBQVEsR0FBRyxLQUFNLElBQUs7QUFDM0QsWUFBSSxRQUFRLEVBQUcsU0FBUSxNQUFPLFFBQVE7QUFDdEMsYUFBSyxNQUFNLElBQUssUUFBUTtBQUN4QixlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxlQUFlLFNBQVMsYUFBYyxPQUFPLFFBQVEsVUFBVTtBQUM5RSxnQkFBUSxDQUFDO0FBQ1QsaUJBQVMsV0FBVztBQUNwQixZQUFJLENBQUMsU0FBVSxVQUFTLE1BQU0sT0FBTyxRQUFRLEdBQUcsT0FBUSxNQUFPO0FBQy9ELGFBQUssTUFBTSxJQUFLLFFBQVE7QUFDeEIsYUFBSyxTQUFTLENBQUMsSUFBSyxVQUFVO0FBQzlCLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGVBQWUsU0FBUyxhQUFjLE9BQU8sUUFBUSxVQUFVO0FBQzlFLGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLFVBQVMsTUFBTSxPQUFPLFFBQVEsR0FBRyxPQUFRLE1BQU87QUFDL0QsYUFBSyxNQUFNLElBQUssVUFBVTtBQUMxQixhQUFLLFNBQVMsQ0FBQyxJQUFLLFFBQVE7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFFQSxNQUFBQSxRQUFPLFVBQVUsZUFBZSxTQUFTLGFBQWMsT0FBTyxRQUFRLFVBQVU7QUFDOUUsZ0JBQVEsQ0FBQztBQUNULGlCQUFTLFdBQVc7QUFDcEIsWUFBSSxDQUFDLFNBQVUsVUFBUyxNQUFNLE9BQU8sUUFBUSxHQUFHLFlBQVksV0FBVztBQUN2RSxhQUFLLE1BQU0sSUFBSyxRQUFRO0FBQ3hCLGFBQUssU0FBUyxDQUFDLElBQUssVUFBVTtBQUM5QixhQUFLLFNBQVMsQ0FBQyxJQUFLLFVBQVU7QUFDOUIsYUFBSyxTQUFTLENBQUMsSUFBSyxVQUFVO0FBQzlCLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGVBQWUsU0FBUyxhQUFjLE9BQU8sUUFBUSxVQUFVO0FBQzlFLGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxTQUFVLFVBQVMsTUFBTSxPQUFPLFFBQVEsR0FBRyxZQUFZLFdBQVc7QUFDdkUsWUFBSSxRQUFRLEVBQUcsU0FBUSxhQUFhLFFBQVE7QUFDNUMsYUFBSyxNQUFNLElBQUssVUFBVTtBQUMxQixhQUFLLFNBQVMsQ0FBQyxJQUFLLFVBQVU7QUFDOUIsYUFBSyxTQUFTLENBQUMsSUFBSyxVQUFVO0FBQzlCLGFBQUssU0FBUyxDQUFDLElBQUssUUFBUTtBQUM1QixlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUVBLE1BQUFBLFFBQU8sVUFBVSxrQkFBa0IsbUJBQW1CLFNBQVMsZ0JBQWlCLE9BQU8sU0FBUyxHQUFHO0FBQ2pHLGVBQU8sZUFBZSxNQUFNLE9BQU8sUUFBUSxDQUFDLE9BQU8sb0JBQW9CLEdBQUcsT0FBTyxvQkFBb0IsQ0FBQztBQUFBLE1BQ3hHLENBQUM7QUFFRCxNQUFBQSxRQUFPLFVBQVUsa0JBQWtCLG1CQUFtQixTQUFTLGdCQUFpQixPQUFPLFNBQVMsR0FBRztBQUNqRyxlQUFPLGVBQWUsTUFBTSxPQUFPLFFBQVEsQ0FBQyxPQUFPLG9CQUFvQixHQUFHLE9BQU8sb0JBQW9CLENBQUM7QUFBQSxNQUN4RyxDQUFDO0FBRUQsZUFBUyxhQUFjLEtBQUssT0FBTyxRQUFRLEtBQUssS0FBSyxLQUFLO0FBQ3hELFlBQUksU0FBUyxNQUFNLElBQUksT0FBUSxPQUFNLElBQUksV0FBVyxvQkFBb0I7QUFDeEUsWUFBSSxTQUFTLEVBQUcsT0FBTSxJQUFJLFdBQVcsb0JBQW9CO0FBQUEsTUFDM0Q7QUFFQSxlQUFTLFdBQVksS0FBSyxPQUFPLFFBQVEsY0FBYyxVQUFVO0FBQy9ELGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxVQUFVO0FBQ2IsdUJBQWEsS0FBSyxPQUFPLFFBQVEsR0FBRyxzQkFBd0IscUJBQXVCO0FBQUEsUUFDckY7QUFDQSxnQkFBUSxNQUFNLEtBQUssT0FBTyxRQUFRLGNBQWMsSUFBSSxDQUFDO0FBQ3JELGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGVBQWUsU0FBUyxhQUFjLE9BQU8sUUFBUSxVQUFVO0FBQzlFLGVBQU8sV0FBVyxNQUFNLE9BQU8sUUFBUSxNQUFNLFFBQVE7QUFBQSxNQUN2RDtBQUVBLE1BQUFBLFFBQU8sVUFBVSxlQUFlLFNBQVMsYUFBYyxPQUFPLFFBQVEsVUFBVTtBQUM5RSxlQUFPLFdBQVcsTUFBTSxPQUFPLFFBQVEsT0FBTyxRQUFRO0FBQUEsTUFDeEQ7QUFFQSxlQUFTLFlBQWEsS0FBSyxPQUFPLFFBQVEsY0FBYyxVQUFVO0FBQ2hFLGdCQUFRLENBQUM7QUFDVCxpQkFBUyxXQUFXO0FBQ3BCLFlBQUksQ0FBQyxVQUFVO0FBQ2IsdUJBQWEsS0FBSyxPQUFPLFFBQVEsR0FBRyx1QkFBeUIsc0JBQXdCO0FBQUEsUUFDdkY7QUFDQSxnQkFBUSxNQUFNLEtBQUssT0FBTyxRQUFRLGNBQWMsSUFBSSxDQUFDO0FBQ3JELGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGdCQUFnQixTQUFTLGNBQWUsT0FBTyxRQUFRLFVBQVU7QUFDaEYsZUFBTyxZQUFZLE1BQU0sT0FBTyxRQUFRLE1BQU0sUUFBUTtBQUFBLE1BQ3hEO0FBRUEsTUFBQUEsUUFBTyxVQUFVLGdCQUFnQixTQUFTLGNBQWUsT0FBTyxRQUFRLFVBQVU7QUFDaEYsZUFBTyxZQUFZLE1BQU0sT0FBTyxRQUFRLE9BQU8sUUFBUTtBQUFBLE1BQ3pEO0FBR0EsTUFBQUEsUUFBTyxVQUFVLE9BQU8sU0FBUyxLQUFNLFFBQVEsYUFBYSxPQUFPLEtBQUs7QUFDdEUsWUFBSSxDQUFDQSxRQUFPLFNBQVMsTUFBTSxFQUFHLE9BQU0sSUFBSSxVQUFVLDZCQUE2QjtBQUMvRSxZQUFJLENBQUMsTUFBTyxTQUFRO0FBQ3BCLFlBQUksQ0FBQyxPQUFPLFFBQVEsRUFBRyxPQUFNLEtBQUs7QUFDbEMsWUFBSSxlQUFlLE9BQU8sT0FBUSxlQUFjLE9BQU87QUFDdkQsWUFBSSxDQUFDLFlBQWEsZUFBYztBQUNoQyxZQUFJLE1BQU0sS0FBSyxNQUFNLE1BQU8sT0FBTTtBQUdsQyxZQUFJLFFBQVEsTUFBTyxRQUFPO0FBQzFCLFlBQUksT0FBTyxXQUFXLEtBQUssS0FBSyxXQUFXLEVBQUcsUUFBTztBQUdyRCxZQUFJLGNBQWMsR0FBRztBQUNuQixnQkFBTSxJQUFJLFdBQVcsMkJBQTJCO0FBQUEsUUFDbEQ7QUFDQSxZQUFJLFFBQVEsS0FBSyxTQUFTLEtBQUssT0FBUSxPQUFNLElBQUksV0FBVyxvQkFBb0I7QUFDaEYsWUFBSSxNQUFNLEVBQUcsT0FBTSxJQUFJLFdBQVcseUJBQXlCO0FBRzNELFlBQUksTUFBTSxLQUFLLE9BQVEsT0FBTSxLQUFLO0FBQ2xDLFlBQUksT0FBTyxTQUFTLGNBQWMsTUFBTSxPQUFPO0FBQzdDLGdCQUFNLE9BQU8sU0FBUyxjQUFjO0FBQUEsUUFDdEM7QUFFQSxjQUFNLE1BQU0sTUFBTTtBQUVsQixZQUFJLFNBQVMsVUFBVSxPQUFPLFdBQVcsVUFBVSxlQUFlLFlBQVk7QUFFNUUsZUFBSyxXQUFXLGFBQWEsT0FBTyxHQUFHO0FBQUEsUUFDekMsT0FBTztBQUNMLHFCQUFXLFVBQVUsSUFBSTtBQUFBLFlBQ3ZCO0FBQUEsWUFDQSxLQUFLLFNBQVMsT0FBTyxHQUFHO0FBQUEsWUFDeEI7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBTUEsTUFBQUEsUUFBTyxVQUFVLE9BQU8sU0FBUyxLQUFNLEtBQUssT0FBTyxLQUFLLFVBQVU7QUFFaEUsWUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixjQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLHVCQUFXO0FBQ1gsb0JBQVE7QUFDUixrQkFBTSxLQUFLO0FBQUEsVUFDYixXQUFXLE9BQU8sUUFBUSxVQUFVO0FBQ2xDLHVCQUFXO0FBQ1gsa0JBQU0sS0FBSztBQUFBLFVBQ2I7QUFDQSxjQUFJLGFBQWEsVUFBYSxPQUFPLGFBQWEsVUFBVTtBQUMxRCxrQkFBTSxJQUFJLFVBQVUsMkJBQTJCO0FBQUEsVUFDakQ7QUFDQSxjQUFJLE9BQU8sYUFBYSxZQUFZLENBQUNBLFFBQU8sV0FBVyxRQUFRLEdBQUc7QUFDaEUsa0JBQU0sSUFBSSxVQUFVLHVCQUF1QixRQUFRO0FBQUEsVUFDckQ7QUFDQSxjQUFJLElBQUksV0FBVyxHQUFHO0FBQ3BCLGtCQUFNLE9BQU8sSUFBSSxXQUFXLENBQUM7QUFDN0IsZ0JBQUssYUFBYSxVQUFVLE9BQU8sT0FDL0IsYUFBYSxVQUFVO0FBRXpCLG9CQUFNO0FBQUEsWUFDUjtBQUFBLFVBQ0Y7QUFBQSxRQUNGLFdBQVcsT0FBTyxRQUFRLFVBQVU7QUFDbEMsZ0JBQU0sTUFBTTtBQUFBLFFBQ2QsV0FBVyxPQUFPLFFBQVEsV0FBVztBQUNuQyxnQkFBTSxPQUFPLEdBQUc7QUFBQSxRQUNsQjtBQUdBLFlBQUksUUFBUSxLQUFLLEtBQUssU0FBUyxTQUFTLEtBQUssU0FBUyxLQUFLO0FBQ3pELGdCQUFNLElBQUksV0FBVyxvQkFBb0I7QUFBQSxRQUMzQztBQUVBLFlBQUksT0FBTyxPQUFPO0FBQ2hCLGlCQUFPO0FBQUEsUUFDVDtBQUVBLGdCQUFRLFVBQVU7QUFDbEIsY0FBTSxRQUFRLFNBQVksS0FBSyxTQUFTLFFBQVE7QUFFaEQsWUFBSSxDQUFDLElBQUssT0FBTTtBQUVoQixZQUFJO0FBQ0osWUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixlQUFLLElBQUksT0FBTyxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQzVCLGlCQUFLLENBQUMsSUFBSTtBQUFBLFVBQ1o7QUFBQSxRQUNGLE9BQU87QUFDTCxnQkFBTSxRQUFRQSxRQUFPLFNBQVMsR0FBRyxJQUM3QixNQUNBQSxRQUFPLEtBQUssS0FBSyxRQUFRO0FBQzdCLGdCQUFNLE1BQU0sTUFBTTtBQUNsQixjQUFJLFFBQVEsR0FBRztBQUNiLGtCQUFNLElBQUksVUFBVSxnQkFBZ0IsTUFDbEMsbUNBQW1DO0FBQUEsVUFDdkM7QUFDQSxlQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sT0FBTyxFQUFFLEdBQUc7QUFDaEMsaUJBQUssSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLEdBQUc7QUFBQSxVQUNqQztBQUFBLFFBQ0Y7QUFFQSxlQUFPO0FBQUEsTUFDVDtBQU1BLFVBQU0sU0FBUyxDQUFDO0FBQ2hCLGVBQVMsRUFBRyxLQUFLLFlBQVksTUFBTTtBQUNqQyxlQUFPLEdBQUcsSUFBSSxNQUFNLGtCQUFrQixLQUFLO0FBQUEsVUFDekMsY0FBZTtBQUNiLGtCQUFNO0FBRU4sbUJBQU8sZUFBZSxNQUFNLFdBQVc7QUFBQSxjQUNyQyxPQUFPLFdBQVcsTUFBTSxNQUFNLFNBQVM7QUFBQSxjQUN2QyxVQUFVO0FBQUEsY0FDVixjQUFjO0FBQUEsWUFDaEIsQ0FBQztBQUdELGlCQUFLLE9BQU8sR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHO0FBR2hDLGlCQUFLO0FBRUwsbUJBQU8sS0FBSztBQUFBLFVBQ2Q7QUFBQSxVQUVBLElBQUksT0FBUTtBQUNWLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFVBRUEsSUFBSSxLQUFNLE9BQU87QUFDZixtQkFBTyxlQUFlLE1BQU0sUUFBUTtBQUFBLGNBQ2xDLGNBQWM7QUFBQSxjQUNkLFlBQVk7QUFBQSxjQUNaO0FBQUEsY0FDQSxVQUFVO0FBQUEsWUFDWixDQUFDO0FBQUEsVUFDSDtBQUFBLFVBRUEsV0FBWTtBQUNWLG1CQUFPLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxNQUFNLEtBQUssT0FBTztBQUFBLFVBQy9DO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQTtBQUFBLFFBQUU7QUFBQSxRQUNBLFNBQVUsTUFBTTtBQUNkLGNBQUksTUFBTTtBQUNSLG1CQUFPLEdBQUcsSUFBSTtBQUFBLFVBQ2hCO0FBRUEsaUJBQU87QUFBQSxRQUNUO0FBQUEsUUFBRztBQUFBLE1BQVU7QUFDZjtBQUFBLFFBQUU7QUFBQSxRQUNBLFNBQVUsTUFBTSxRQUFRO0FBQ3RCLGlCQUFPLFFBQVEsSUFBSSxvREFBb0QsT0FBTyxNQUFNO0FBQUEsUUFDdEY7QUFBQSxRQUFHO0FBQUEsTUFBUztBQUNkO0FBQUEsUUFBRTtBQUFBLFFBQ0EsU0FBVSxLQUFLLE9BQU8sT0FBTztBQUMzQixjQUFJLE1BQU0saUJBQWlCLEdBQUc7QUFDOUIsY0FBSSxXQUFXO0FBQ2YsY0FBSSxPQUFPLFVBQVUsS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJO0FBQ3hELHVCQUFXLHNCQUFzQixPQUFPLEtBQUssQ0FBQztBQUFBLFVBQ2hELFdBQVcsT0FBTyxVQUFVLFVBQVU7QUFDcEMsdUJBQVcsT0FBTyxLQUFLO0FBQ3ZCLGdCQUFJLFFBQVEsT0FBTyxDQUFDLEtBQUssT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLE9BQU8sRUFBRSxJQUFJO0FBQ3pFLHlCQUFXLHNCQUFzQixRQUFRO0FBQUEsWUFDM0M7QUFDQSx3QkFBWTtBQUFBLFVBQ2Q7QUFDQSxpQkFBTyxlQUFlLEtBQUssY0FBYyxRQUFRO0FBQ2pELGlCQUFPO0FBQUEsUUFDVDtBQUFBLFFBQUc7QUFBQSxNQUFVO0FBRWYsZUFBUyxzQkFBdUIsS0FBSztBQUNuQyxZQUFJLE1BQU07QUFDVixZQUFJLElBQUksSUFBSTtBQUNaLGNBQU0sUUFBUSxJQUFJLENBQUMsTUFBTSxNQUFNLElBQUk7QUFDbkMsZUFBTyxLQUFLLFFBQVEsR0FBRyxLQUFLLEdBQUc7QUFDN0IsZ0JBQU0sSUFBSSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFBQSxRQUNyQztBQUNBLGVBQU8sR0FBRyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQUEsTUFDakM7QUFLQSxlQUFTLFlBQWEsS0FBSyxRQUFRSyxhQUFZO0FBQzdDLHVCQUFlLFFBQVEsUUFBUTtBQUMvQixZQUFJLElBQUksTUFBTSxNQUFNLFVBQWEsSUFBSSxTQUFTQSxXQUFVLE1BQU0sUUFBVztBQUN2RSxzQkFBWSxRQUFRLElBQUksVUFBVUEsY0FBYSxFQUFFO0FBQUEsUUFDbkQ7QUFBQSxNQUNGO0FBRUEsZUFBUyxXQUFZLE9BQU8sS0FBSyxLQUFLLEtBQUssUUFBUUEsYUFBWTtBQUM3RCxZQUFJLFFBQVEsT0FBTyxRQUFRLEtBQUs7QUFDOUIsZ0JBQU0sSUFBSSxPQUFPLFFBQVEsV0FBVyxNQUFNO0FBQzFDLGNBQUk7QUFDSixjQUFJQSxjQUFhLEdBQUc7QUFDbEIsZ0JBQUksUUFBUSxLQUFLLFFBQVEsT0FBTyxDQUFDLEdBQUc7QUFDbEMsc0JBQVEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRQSxjQUFhLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFBQSxZQUM3RCxPQUFPO0FBQ0wsc0JBQVEsU0FBUyxDQUFDLFFBQVFBLGNBQWEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUN6Q0EsY0FBYSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUM7QUFBQSxZQUN6QztBQUFBLFVBQ0YsT0FBTztBQUNMLG9CQUFRLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUFBLFVBQ3pDO0FBQ0EsZ0JBQU0sSUFBSSxPQUFPLGlCQUFpQixTQUFTLE9BQU8sS0FBSztBQUFBLFFBQ3pEO0FBQ0Esb0JBQVksS0FBSyxRQUFRQSxXQUFVO0FBQUEsTUFDckM7QUFFQSxlQUFTLGVBQWdCLE9BQU8sTUFBTTtBQUNwQyxZQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGdCQUFNLElBQUksT0FBTyxxQkFBcUIsTUFBTSxVQUFVLEtBQUs7QUFBQSxRQUM3RDtBQUFBLE1BQ0Y7QUFFQSxlQUFTLFlBQWEsT0FBTyxRQUFRLE1BQU07QUFDekMsWUFBSSxLQUFLLE1BQU0sS0FBSyxNQUFNLE9BQU87QUFDL0IseUJBQWUsT0FBTyxJQUFJO0FBQzFCLGdCQUFNLElBQUksT0FBTyxpQkFBaUIsUUFBUSxVQUFVLGNBQWMsS0FBSztBQUFBLFFBQ3pFO0FBRUEsWUFBSSxTQUFTLEdBQUc7QUFDZCxnQkFBTSxJQUFJLE9BQU8seUJBQXlCO0FBQUEsUUFDNUM7QUFFQSxjQUFNLElBQUksT0FBTztBQUFBLFVBQWlCLFFBQVE7QUFBQSxVQUNSLE1BQU0sT0FBTyxJQUFJLENBQUMsV0FBVyxNQUFNO0FBQUEsVUFDbkM7QUFBQSxRQUFLO0FBQUEsTUFDekM7QUFLQSxVQUFNLG9CQUFvQjtBQUUxQixlQUFTLFlBQWEsS0FBSztBQUV6QixjQUFNLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUV0QixjQUFNLElBQUksS0FBSyxFQUFFLFFBQVEsbUJBQW1CLEVBQUU7QUFFOUMsWUFBSSxJQUFJLFNBQVMsRUFBRyxRQUFPO0FBRTNCLGVBQU8sSUFBSSxTQUFTLE1BQU0sR0FBRztBQUMzQixnQkFBTSxNQUFNO0FBQUEsUUFDZDtBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBU0osYUFBYSxRQUFRLE9BQU87QUFDbkMsZ0JBQVEsU0FBUztBQUNqQixZQUFJO0FBQ0osY0FBTSxTQUFTLE9BQU87QUFDdEIsWUFBSSxnQkFBZ0I7QUFDcEIsY0FBTSxRQUFRLENBQUM7QUFFZixpQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsR0FBRztBQUMvQixzQkFBWSxPQUFPLFdBQVcsQ0FBQztBQUcvQixjQUFJLFlBQVksU0FBVSxZQUFZLE9BQVE7QUFFNUMsZ0JBQUksQ0FBQyxlQUFlO0FBRWxCLGtCQUFJLFlBQVksT0FBUTtBQUV0QixxQkFBSyxTQUFTLEtBQUssR0FBSSxPQUFNLEtBQUssS0FBTSxLQUFNLEdBQUk7QUFDbEQ7QUFBQSxjQUNGLFdBQVcsSUFBSSxNQUFNLFFBQVE7QUFFM0IscUJBQUssU0FBUyxLQUFLLEdBQUksT0FBTSxLQUFLLEtBQU0sS0FBTSxHQUFJO0FBQ2xEO0FBQUEsY0FDRjtBQUdBLDhCQUFnQjtBQUVoQjtBQUFBLFlBQ0Y7QUFHQSxnQkFBSSxZQUFZLE9BQVE7QUFDdEIsbUJBQUssU0FBUyxLQUFLLEdBQUksT0FBTSxLQUFLLEtBQU0sS0FBTSxHQUFJO0FBQ2xELDhCQUFnQjtBQUNoQjtBQUFBLFlBQ0Y7QUFHQSx5QkFBYSxnQkFBZ0IsU0FBVSxLQUFLLFlBQVksU0FBVTtBQUFBLFVBQ3BFLFdBQVcsZUFBZTtBQUV4QixpQkFBSyxTQUFTLEtBQUssR0FBSSxPQUFNLEtBQUssS0FBTSxLQUFNLEdBQUk7QUFBQSxVQUNwRDtBQUVBLDBCQUFnQjtBQUdoQixjQUFJLFlBQVksS0FBTTtBQUNwQixpQkFBSyxTQUFTLEtBQUssRUFBRztBQUN0QixrQkFBTSxLQUFLLFNBQVM7QUFBQSxVQUN0QixXQUFXLFlBQVksTUFBTztBQUM1QixpQkFBSyxTQUFTLEtBQUssRUFBRztBQUN0QixrQkFBTTtBQUFBLGNBQ0osYUFBYSxJQUFNO0FBQUEsY0FDbkIsWUFBWSxLQUFPO0FBQUEsWUFDckI7QUFBQSxVQUNGLFdBQVcsWUFBWSxPQUFTO0FBQzlCLGlCQUFLLFNBQVMsS0FBSyxFQUFHO0FBQ3RCLGtCQUFNO0FBQUEsY0FDSixhQUFhLEtBQU07QUFBQSxjQUNuQixhQUFhLElBQU0sS0FBTztBQUFBLGNBQzFCLFlBQVksS0FBTztBQUFBLFlBQ3JCO0FBQUEsVUFDRixXQUFXLFlBQVksU0FBVTtBQUMvQixpQkFBSyxTQUFTLEtBQUssRUFBRztBQUN0QixrQkFBTTtBQUFBLGNBQ0osYUFBYSxLQUFPO0FBQUEsY0FDcEIsYUFBYSxLQUFNLEtBQU87QUFBQSxjQUMxQixhQUFhLElBQU0sS0FBTztBQUFBLGNBQzFCLFlBQVksS0FBTztBQUFBLFlBQ3JCO0FBQUEsVUFDRixPQUFPO0FBQ0wsa0JBQU0sSUFBSSxNQUFNLG9CQUFvQjtBQUFBLFVBQ3RDO0FBQUEsUUFDRjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBU0csY0FBYyxLQUFLO0FBQzFCLGNBQU0sWUFBWSxDQUFDO0FBQ25CLGlCQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFLEdBQUc7QUFFbkMsb0JBQVUsS0FBSyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEdBQUk7QUFBQSxRQUN6QztBQUNBLGVBQU87QUFBQSxNQUNUO0FBRUEsZUFBUyxlQUFnQixLQUFLLE9BQU87QUFDbkMsWUFBSSxHQUFHLElBQUk7QUFDWCxjQUFNLFlBQVksQ0FBQztBQUNuQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsRUFBRSxHQUFHO0FBQ25DLGVBQUssU0FBUyxLQUFLLEVBQUc7QUFFdEIsY0FBSSxJQUFJLFdBQVcsQ0FBQztBQUNwQixlQUFLLEtBQUs7QUFDVixlQUFLLElBQUk7QUFDVCxvQkFBVSxLQUFLLEVBQUU7QUFDakIsb0JBQVUsS0FBSyxFQUFFO0FBQUEsUUFDbkI7QUFFQSxlQUFPO0FBQUEsTUFDVDtBQUVBLGVBQVNGLGVBQWUsS0FBSztBQUMzQixlQUFPSCxRQUFPLFlBQVksWUFBWSxHQUFHLENBQUM7QUFBQSxNQUM1QztBQUVBLGVBQVMsV0FBWSxLQUFLLEtBQUssUUFBUSxRQUFRO0FBQzdDLFlBQUk7QUFDSixhQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRSxHQUFHO0FBQzNCLGNBQUssSUFBSSxVQUFVLElBQUksVUFBWSxLQUFLLElBQUksT0FBUztBQUNyRCxjQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQztBQUFBLFFBQ3pCO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFLQSxlQUFTLFdBQVksS0FBSyxNQUFNO0FBQzlCLGVBQU8sZUFBZSxRQUNuQixPQUFPLFFBQVEsSUFBSSxlQUFlLFFBQVEsSUFBSSxZQUFZLFFBQVEsUUFDakUsSUFBSSxZQUFZLFNBQVMsS0FBSztBQUFBLE1BQ3BDO0FBQ0EsZUFBUyxZQUFhLEtBQUs7QUFFekIsZUFBTyxRQUFRO0FBQUEsTUFDakI7QUFJQSxVQUFNLHVCQUF1QixXQUFZO0FBQ3ZDLGNBQU1PLFlBQVc7QUFDakIsY0FBTSxRQUFRLElBQUksTUFBTSxHQUFHO0FBQzNCLGlCQUFTLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxHQUFHO0FBQzNCLGdCQUFNLE1BQU0sSUFBSTtBQUNoQixtQkFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUMzQixrQkFBTSxNQUFNLENBQUMsSUFBSUEsVUFBUyxDQUFDLElBQUlBLFVBQVMsQ0FBQztBQUFBLFVBQzNDO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNULEdBQUc7QUFHSCxlQUFTLG1CQUFvQixJQUFJO0FBQy9CLGVBQU8sT0FBTyxXQUFXLGNBQWMseUJBQXlCO0FBQUEsTUFDbEU7QUFFQSxlQUFTLHlCQUEwQjtBQUNqQyxjQUFNLElBQUksTUFBTSxzQkFBc0I7QUFBQSxNQUN4QztBQUFBO0FBQUE7OztBQ3pqRUE7OztBQ0FBOzs7QUNBQTs7O0FDQUE7QUE0QkEsTUFBWTtBQUFaLEdBQUEsU0FBWUMsaUJBQWM7QUFFeEIsSUFBQUEsZ0JBQUFBLGdCQUFBLGNBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsV0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxrQkFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxVQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLDBCQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLGdCQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLFFBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsVUFBQSxJQUFBLENBQUEsSUFBQTtBQUdBLElBQUFBLGdCQUFBQSxnQkFBQSxrQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxrQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxpQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxzQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxtQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUdBLElBQUFBLGdCQUFBQSxnQkFBQSxNQUFBLElBQUEsS0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLGVBQUEsSUFBQSxLQUFBLElBQUE7RUFDRixHQXJCWSxtQkFBQSxpQkFBYyxDQUFBLEVBQUE7QUE4RTFCLE1BQVk7QUFBWixHQUFBLFNBQVlDLG1CQUFnQjtBQUMxQixJQUFBQSxrQkFBQSxPQUFBLElBQUE7QUFDQSxJQUFBQSxrQkFBQSxRQUFBLElBQUE7QUFDQSxJQUFBQSxrQkFBQSxJQUFBLElBQUE7QUFDQSxJQUFBQSxrQkFBQSxNQUFBLElBQUE7QUFDQSxJQUFBQSxrQkFBQSxLQUFBLElBQUE7QUFDQSxJQUFBQSxrQkFBQSxPQUFBLElBQUE7QUFDQSxJQUFBQSxrQkFBQSxNQUFBLElBQUE7RUFDRixHQVJZLHFCQUFBLG1CQUFnQixDQUFBLEVBQUE7OztBQzFHNUI7OztBQ0FBOzs7QUNBQTs7O0FDQUE7QUFTQSxNQUFZO0FBQVosR0FBQSxTQUFZQyxjQUFXO0FBQ3JCLElBQUFBLGFBQUEsU0FBQSxJQUFBO0FBQ0EsSUFBQUEsYUFBQSxNQUFBLElBQUE7QUFDQSxJQUFBQSxhQUFBLGdCQUFBLElBQUE7QUFDQSxJQUFBQSxhQUFBLFlBQUEsSUFBQTtBQUNBLElBQUFBLGFBQUEsZUFBQSxJQUFBO0FBQ0EsSUFBQUEsYUFBQSxlQUFBLElBQUE7QUFDQSxJQUFBQSxhQUFBLGVBQUEsSUFBQTtBQUNBLElBQUFBLGFBQUEsZUFBQSxJQUFBO0FBQ0EsSUFBQUEsYUFBQSxZQUFBLElBQUE7RUFDRixHQVZZLGdCQUFBLGNBQVcsQ0FBQSxFQUFBOzs7QUw2QnZCLE1BQVlDO0FBQVosR0FBQSxTQUFZQSxpQkFBYztBQUN4QixJQUFBQSxnQkFBQUEsZ0JBQUEsY0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxXQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLGtCQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLGNBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsMEJBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsUUFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxRQUFBLElBQUEsQ0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLFVBQUEsSUFBQSxDQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsYUFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxnQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxrQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxpQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxzQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxtQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxpQkFBQSxJQUFBLEVBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxXQUFBLElBQUEsSUFBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLGFBQUEsSUFBQSxJQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsS0FBQSxJQUFBLElBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxXQUFBLElBQUEsR0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLFVBQUEsSUFBQSxLQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEscUJBQUEsSUFBQSxLQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsYUFBQSxJQUFBLEtBQUEsSUFBQTtBQUNBLElBQUFBLGdCQUFBQSxnQkFBQSxlQUFBLElBQUEsS0FBQSxJQUFBO0FBQ0EsSUFBQUEsZ0JBQUFBLGdCQUFBLGVBQUEsSUFBQSxLQUFBLElBQUE7QUFDQSxJQUFBQSxnQkFBQUEsZ0JBQUEsb0JBQUEsSUFBQSxHQUFBLElBQUE7QUFDQSxJQUFB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QUdBLElBQUc7QUFDeEIsY0FBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFFLElBQUs7QUFDaEMsWUFBSSxLQUFLLEdBQUcsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLEdBQUc7QUFDeEMsWUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDdEIsWUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDdEIsWUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDdEIsWUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDdEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksR0FBRyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUU7QUFDakIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUNqQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsZUFBTyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7TUFDN0I7Ozs7O01BTUEsSUFBSSxPQUFZO0FBQ2Qsa0JBQVUsS0FBSztBQUNmLGNBQU0sRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRSxJQUFLO0FBQ2hDLGNBQU0sRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRSxJQUFLO0FBQ2hDLFlBQUksS0FBSyxHQUFHLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxHQUFHO0FBQ3hDLGNBQU0sSUFBSSxNQUFNO0FBQ2hCLGNBQU0sS0FBSyxHQUFHLElBQUksTUFBTSxHQUFHQSxJQUFHO0FBQzlCLFlBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3RCLFlBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3RCLFlBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3RCLFlBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3RCLFlBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ3RCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixZQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUN0QixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUNqQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksR0FBRyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUNqQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixhQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDbEIsYUFBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQ2xCLGFBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUNsQixlQUFPLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtNQUM3QjtNQUVBLFNBQVMsT0FBWTtBQUNuQixlQUFPLEtBQUssSUFBSSxNQUFNLE9BQU0sQ0FBRTtNQUNoQztNQUVBLE1BQUc7QUFDRCxlQUFPLEtBQUssT0FBTyxNQUFNLElBQUk7TUFDL0I7Ozs7Ozs7Ozs7TUFXQSxTQUFTLFFBQWM7QUFDckIsY0FBTSxFQUFFLE1BQUFHLE1BQUksSUFBSztBQUNqQixZQUFJLENBQUMsR0FBRyxZQUFZLE1BQU07QUFBRyxnQkFBTSxJQUFJLE1BQU0sOEJBQThCO0FBQzNFLFlBQUksT0FBYztBQUNsQixjQUFNLE1BQU0sQ0FBQyxNQUFjLEtBQUssT0FBTyxNQUFNLEdBQUcsQ0FBQyxNQUFNLFdBQVcsT0FBTyxDQUFDLENBQUM7QUFFM0UsWUFBSUEsT0FBTTtBQUNSLGdCQUFNLEVBQUUsT0FBTyxJQUFJLE9BQU8sR0FBRSxJQUFLLGlCQUFpQixNQUFNO0FBQ3hELGdCQUFNLEVBQUUsR0FBRyxLQUFLLEdBQUcsSUFBRyxJQUFLLElBQUksRUFBRTtBQUNqQyxnQkFBTSxFQUFFLEdBQUcsS0FBSyxHQUFHLElBQUcsSUFBSyxJQUFJLEVBQUU7QUFDakMsaUJBQU8sSUFBSSxJQUFJLEdBQUc7QUFDbEIsa0JBQVEsV0FBV0EsTUFBSyxNQUFNLEtBQUssS0FBSyxPQUFPLEtBQUs7UUFDdEQsT0FBTztBQUNMLGdCQUFNLEVBQUUsR0FBRyxFQUFDLElBQUssSUFBSSxNQUFNO0FBQzNCLGtCQUFRO0FBQ1IsaUJBQU87UUFDVDtBQUVBLGVBQU8sV0FBVyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO01BQzNDOzs7Ozs7TUFPQSxlQUFlLElBQVU7QUFDdkIsY0FBTSxFQUFFLE1BQUFBLE1BQUksSUFBSztBQUNqQixjQUFNLElBQUk7QUFDVixZQUFJLENBQUMsR0FBRyxRQUFRLEVBQUU7QUFBRyxnQkFBTSxJQUFJLE1BQU0sOEJBQThCO0FBQ25FLFlBQUksT0FBT0wsUUFBTyxFQUFFLElBQUc7QUFBSSxpQkFBTyxNQUFNO0FBQ3hDLFlBQUksT0FBT0M7QUFBSyxpQkFBTztBQUN2QixZQUFJLEtBQUssU0FBUyxJQUFJO0FBQUcsaUJBQU8sS0FBSyxTQUFTLEVBQUU7QUFHaEQsWUFBSUksT0FBTTtBQUNSLGdCQUFNLEVBQUUsT0FBTyxJQUFJLE9BQU8sR0FBRSxJQUFLLGlCQUFpQixFQUFFO0FBQ3BELGdCQUFNLEVBQUUsSUFBSSxHQUFFLElBQUssY0FBYyxPQUFPLEdBQUcsSUFBSSxFQUFFO0FBQ2pELGlCQUFPLFdBQVdBLE1BQUssTUFBTSxJQUFJLElBQUksT0FBTyxLQUFLO1FBQ25ELE9BQU87QUFDTCxpQkFBTyxLQUFLLE9BQU8sR0FBRyxFQUFFO1FBQzFCO01BQ0Y7Ozs7O01BTUEsU0FBUyxXQUFhO0FBQ3BCLGVBQU8sYUFBYSxNQUFNLFNBQVM7TUFDckM7Ozs7O01BTUEsZ0JBQWE7QUFDWCxjQUFNLEVBQUUsY0FBYSxJQUFLO0FBQzFCLFlBQUksYUFBYUo7QUFBSyxpQkFBTztBQUM3QixZQUFJO0FBQWUsaUJBQU8sY0FBYyxPQUFPLElBQUk7QUFDbkQsZUFBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLEVBQUUsSUFBRztNQUMzQztNQUVBLGdCQUFhO0FBQ1gsY0FBTSxFQUFFLGNBQWEsSUFBSztBQUMxQixZQUFJLGFBQWFBO0FBQUssaUJBQU87QUFDN0IsWUFBSTtBQUFlLGlCQUFPLGNBQWMsT0FBTyxJQUFJO0FBQ25ELGVBQU8sS0FBSyxlQUFlLFFBQVE7TUFDckM7TUFFQSxlQUFZO0FBRVYsZUFBTyxLQUFLLGVBQWUsUUFBUSxFQUFFLElBQUc7TUFDMUM7TUFFQSxRQUFRLGVBQWUsTUFBSTtBQUN6QixjQUFNLGNBQWMsY0FBYztBQUNsQyxhQUFLLGVBQWM7QUFDbkIsZUFBTyxZQUFZLE9BQU8sTUFBTSxZQUFZO01BQzlDO01BRUEsTUFBTSxlQUFlLE1BQUk7QUFDdkIsZUFBTyxXQUFXLEtBQUssUUFBUSxZQUFZLENBQUM7TUFDOUM7TUFFQSxXQUFRO0FBQ04sZUFBTyxVQUFVLEtBQUssSUFBRyxJQUFLLFNBQVMsS0FBSyxNQUFLLENBQUU7TUFDckQ7O0FBRUYsVUFBTSxPQUFPLEdBQUc7QUFDaEIsVUFBTSxPQUFPLElBQUksS0FBSyxPQUFPLFVBQVUsT0FBTyxLQUFLLEtBQUssT0FBTyxDQUFDLElBQUksSUFBSTtBQUN4RSxVQUFNLEtBQUssV0FBVyxDQUFDO0FBQ3ZCLFdBQU87RUFDVDtBQXFCQSxXQUFTLFFBQVEsVUFBaUI7QUFDaEMsV0FBTyxXQUFXLEdBQUcsV0FBVyxJQUFPLENBQUk7RUFDN0M7QUF1SUEsV0FBUyxZQUFlLElBQWUsSUFBa0I7QUFDdkQsV0FBTztNQUNMLFdBQVcsR0FBRztNQUNkLFdBQVcsSUFBSSxHQUFHO01BQ2xCLHVCQUF1QixJQUFJLElBQUksR0FBRztNQUNsQyxvQkFBb0I7TUFDcEIsV0FBVyxJQUFJLEdBQUc7O0VBRXRCO0FBTU0sV0FBVSxLQUNkLE9BQ0EsV0FBbUUsQ0FBQSxHQUFFO0FBRXJFLFVBQU0sRUFBRSxHQUFFLElBQUs7QUFDZixVQUFNLGVBQWUsU0FBUyxlQUFlO0FBQzdDLFVBQU0sVUFBVSxPQUFPLE9BQU8sWUFBWSxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUMsQ0FBRTtBQUU3RixhQUFTLGlCQUFpQixXQUFxQjtBQUM3QyxVQUFJO0FBQ0YsY0FBTUssT0FBTSxHQUFHLFVBQVUsU0FBUztBQUNsQyxlQUFPLEdBQUcsWUFBWUEsSUFBRztNQUMzQixTQUFTLE9BQU87QUFDZCxlQUFPO01BQ1Q7SUFDRjtBQUVBLGFBQVMsaUJBQWlCLFdBQXVCLGNBQXNCO0FBQ3JFLFlBQU0sRUFBRSxXQUFXLE1BQU0sc0JBQXFCLElBQUs7QUFDbkQsVUFBSTtBQUNGLGNBQU0sSUFBSSxVQUFVO0FBQ3BCLFlBQUksaUJBQWlCLFFBQVEsTUFBTTtBQUFNLGlCQUFPO0FBQ2hELFlBQUksaUJBQWlCLFNBQVMsTUFBTTtBQUF1QixpQkFBTztBQUNsRSxlQUFPLENBQUMsQ0FBQyxNQUFNLFVBQVUsU0FBUztNQUNwQyxTQUFTLE9BQU87QUFDZCxlQUFPO01BQ1Q7SUFDRjtBQU1BLGFBQVMsZ0JBQWdCLE9BQU8sYUFBYSxRQUFRLElBQUksR0FBQztBQUN4RCxhQUFPLGVBQWUsT0FBTyxNQUFNLFFBQVEsTUFBTSxNQUFNLEdBQUcsR0FBRyxLQUFLO0lBQ3BFO0FBT0EsYUFBU0MsY0FBYSxXQUF1QixlQUFlLE1BQUk7QUFDOUQsYUFBTyxNQUFNLEtBQUssU0FBUyxHQUFHLFVBQVUsU0FBUyxDQUFDLEVBQUUsUUFBUSxZQUFZO0lBQzFFO0FBS0EsYUFBUyxVQUFVLE1BQWdCO0FBQ2pDLFlBQU0sRUFBRSxXQUFXLFdBQVcsc0JBQXFCLElBQUs7QUFDeEQsVUFBSSxDQUFDLFFBQVEsSUFBSTtBQUFHLGVBQU87QUFDM0IsVUFBSyxjQUFjLE1BQU0sR0FBRyxZQUFhLGNBQWM7QUFBVyxlQUFPO0FBQ3pFLFlBQU0sSUFBSSxPQUFPLE1BQU0sUUFBVyxLQUFLLEVBQUU7QUFDekMsYUFBTyxNQUFNLGFBQWEsTUFBTTtJQUNsQztBQVVBLGFBQVMsZ0JBQ1AsWUFDQSxZQUNBLGVBQWUsTUFBSTtBQUVuQixVQUFJLFVBQVUsVUFBVSxNQUFNO0FBQU0sY0FBTSxJQUFJLE1BQU0sK0JBQStCO0FBQ25GLFVBQUksVUFBVSxVQUFVLE1BQU07QUFBTyxjQUFNLElBQUksTUFBTSwrQkFBK0I7QUFDcEYsWUFBTSxJQUFJLEdBQUcsVUFBVSxVQUFVO0FBQ2pDLFlBQU0sSUFBSSxNQUFNLFVBQVUsVUFBVTtBQUNwQyxhQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsUUFBUSxZQUFZO0lBQzNDO0FBRUEsVUFBTUMsU0FBUTtNQUNaO01BQ0E7TUFDQTs7QUFFRixVQUFNLFNBQVMsYUFBYSxpQkFBaUJELGFBQVk7QUFFekQsV0FBTyxPQUFPLE9BQU8sRUFBRSxjQUFBQSxlQUFjLGlCQUFpQixRQUFRLE9BQU8sT0FBQUMsUUFBTyxRQUFPLENBQUU7RUFDdkY7QUFpQk0sV0FBVSxNQUNkLE9BQ0EsTUFDQSxZQUF1QixDQUFBLEdBQUU7QUFFekIsVUFBTSxJQUFJO0FBQ1YsbUJBQ0UsV0FDQSxDQUFBLEdBQ0E7TUFDRSxNQUFNO01BQ04sTUFBTTtNQUNOLGFBQWE7TUFDYixVQUFVO01BQ1YsZUFBZTtLQUNoQjtBQUVILGdCQUFZLE9BQU8sT0FBTyxDQUFBLEdBQUksU0FBUztBQUN2QyxVQUFNQyxlQUFjLFVBQVUsZUFBZTtBQUM3QyxVQUFNQyxRQUFPLFVBQVUsU0FBUyxDQUFDLEtBQUssUUFBUSxLQUFVLE1BQU0sS0FBSyxHQUFHO0FBRXRFLFVBQU0sRUFBRSxJQUFJLEdBQUUsSUFBSztBQUNuQixVQUFNLEVBQUUsT0FBTyxhQUFhLE1BQU0sT0FBTSxJQUFLO0FBQzdDLFVBQU0sRUFBRSxRQUFRLGNBQUFILGVBQWMsaUJBQWlCLE9BQUFDLFFBQU8sUUFBTyxJQUFLLEtBQUssT0FBTyxTQUFTO0FBQ3ZGLFVBQU0saUJBQTBDO01BQzlDLFNBQVM7TUFDVCxNQUFNLE9BQU8sVUFBVSxTQUFTLFlBQVksVUFBVSxPQUFPO01BQzdELFFBQVE7TUFDUixjQUFjOztBQUVoQixVQUFNLG1CQUFtQixjQUFjRyxPQUFNLEdBQUc7QUFFaEQsYUFBUyxzQkFBc0IsUUFBYztBQUMzQyxZQUFNLE9BQU8sZUFBZUM7QUFDNUIsYUFBTyxTQUFTO0lBQ2xCO0FBQ0EsYUFBUyxXQUFXLE9BQWVOLE1BQVc7QUFDNUMsVUFBSSxDQUFDLEdBQUcsWUFBWUEsSUFBRztBQUNyQixjQUFNLElBQUksTUFBTSxxQkFBcUIsS0FBSyxrQ0FBa0M7QUFDOUUsYUFBT0E7SUFDVDtBQUNBLGFBQVMsc0JBQW1CO0FBUzFCLFVBQUk7QUFDRixjQUFNLElBQUksTUFBTSw4REFBOEQ7SUFDbEY7QUFDQSxhQUFTLGtCQUFrQixPQUFtQixRQUE0QjtBQUN4RSx3QkFBa0IsTUFBTTtBQUN4QixZQUFNLE9BQU8sUUFBUTtBQUNyQixZQUFNLFFBQVEsV0FBVyxZQUFZLE9BQU8sV0FBVyxjQUFjLE9BQU8sSUFBSTtBQUNoRixhQUFPLE9BQU8sT0FBTyxLQUFLO0lBQzVCO0lBS0EsTUFBTSxVQUFTO01BQ0o7TUFDQTtNQUNBO01BRVQsWUFBWSxHQUFXLEdBQVcsVUFBaUI7QUFDakQsYUFBSyxJQUFJLFdBQVcsS0FBSyxDQUFDO0FBQzFCLGFBQUssSUFBSSxXQUFXLEtBQUssQ0FBQztBQUMxQixZQUFJLFlBQVksTUFBTTtBQUNwQiw4QkFBbUI7QUFDbkIsY0FBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLFNBQVMsUUFBUTtBQUFHLGtCQUFNLElBQUksTUFBTSxxQkFBcUI7QUFDM0UsZUFBSyxXQUFXO1FBQ2xCO0FBQ0EsZUFBTyxPQUFPLElBQUk7TUFDcEI7TUFFQSxPQUFPLFVBQ0wsT0FDQSxTQUErQixlQUFlLFFBQU07QUFFcEQsMEJBQWtCLE9BQU8sTUFBTTtBQUMvQixZQUFJO0FBQ0osWUFBSSxXQUFXLE9BQU87QUFDcEIsZ0JBQU0sRUFBRSxHQUFBTyxJQUFHLEdBQUFDLEdBQUMsSUFBSyxJQUFJLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFDeEMsaUJBQU8sSUFBSSxVQUFVRCxJQUFHQyxFQUFDO1FBQzNCO0FBQ0EsWUFBSSxXQUFXLGFBQWE7QUFDMUIsa0JBQVEsTUFBTSxDQUFDO0FBQ2YsbUJBQVM7QUFDVCxrQkFBUSxNQUFNLFNBQVMsQ0FBQztRQUMxQjtBQUNBLGNBQU0sSUFBSSxRQUFRLFlBQWE7QUFDL0IsY0FBTSxJQUFJLE1BQU0sU0FBUyxHQUFHLENBQUM7QUFDN0IsY0FBTSxJQUFJLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQztBQUNqQyxlQUFPLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsS0FBSztNQUM5RDtNQUVBLE9BQU8sUUFBUSxLQUFhLFFBQTZCO0FBQ3ZELGVBQU8sS0FBSyxVQUFVLFdBQVcsR0FBRyxHQUFHLE1BQU07TUFDL0M7TUFFUSxpQkFBYztBQUNwQixjQUFNLEVBQUUsU0FBUSxJQUFLO0FBQ3JCLFlBQUksWUFBWTtBQUFNLGdCQUFNLElBQUksTUFBTSxzQ0FBc0M7QUFDNUUsZUFBTztNQUNUO01BRUEsZUFBZSxVQUFnQjtBQUM3QixlQUFPLElBQUksVUFBVSxLQUFLLEdBQUcsS0FBSyxHQUFHLFFBQVE7TUFDL0M7TUFFQSxpQkFBaUIsYUFBdUI7QUFDdEMsY0FBTSxFQUFFLEdBQUcsRUFBQyxJQUFLO0FBQ2pCLGNBQU0sV0FBVyxLQUFLLGVBQWM7QUFDcEMsY0FBTSxPQUFPLGFBQWEsS0FBSyxhQUFhLElBQUksSUFBSSxjQUFjO0FBQ2xFLFlBQUksQ0FBQyxHQUFHLFFBQVEsSUFBSTtBQUFHLGdCQUFNLElBQUksTUFBTSwyQ0FBMkM7QUFDbEYsY0FBTSxJQUFJLEdBQUcsUUFBUSxJQUFJO0FBQ3pCLGNBQU0sSUFBSSxNQUFNLFVBQVUsWUFBWSxTQUFTLFdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZFLGNBQU0sS0FBSyxHQUFHLElBQUksSUFBSTtBQUN0QixjQUFNLElBQUksY0FBYyxPQUFPLGFBQWEsUUFBVyxTQUFTLENBQUM7QUFDakUsY0FBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRTtBQUM1QixjQUFNLEtBQUssR0FBRyxPQUFPLElBQUksRUFBRTtBQUUzQixjQUFNLElBQUksTUFBTSxLQUFLLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRSxZQUFJLEVBQUUsSUFBRztBQUFJLGdCQUFNLElBQUksTUFBTSxxQ0FBcUM7QUFDbEUsVUFBRSxlQUFjO0FBQ2hCLGVBQU87TUFDVDs7TUFHQSxXQUFRO0FBQ04sZUFBTyxzQkFBc0IsS0FBSyxDQUFDO01BQ3JDO01BRUEsUUFBUSxTQUErQixlQUFlLFFBQU07QUFDMUQsMEJBQWtCLE1BQU07QUFDeEIsWUFBSSxXQUFXO0FBQU8saUJBQU8sV0FBVyxJQUFJLFdBQVcsSUFBSSxDQUFDO0FBQzVELGNBQU0sRUFBRSxHQUFHLEVBQUMsSUFBSztBQUNqQixjQUFNLEtBQUssR0FBRyxRQUFRLENBQUM7QUFDdkIsY0FBTSxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBQ3ZCLFlBQUksV0FBVyxhQUFhO0FBQzFCLDhCQUFtQjtBQUNuQixpQkFBTyxZQUFZLFdBQVcsR0FBRyxLQUFLLGVBQWMsQ0FBRSxHQUFHLElBQUksRUFBRTtRQUNqRTtBQUNBLGVBQU8sWUFBWSxJQUFJLEVBQUU7TUFDM0I7TUFFQSxNQUFNLFFBQTZCO0FBQ2pDLGVBQU8sV0FBVyxLQUFLLFFBQVEsTUFBTSxDQUFDO01BQ3hDOztBQVFGLFVBQU0sV0FDSixVQUFVLFlBQ1YsU0FBUyxhQUFhLE9BQWlCO0FBRXJDLFVBQUksTUFBTSxTQUFTO0FBQU0sY0FBTSxJQUFJLE1BQU0sb0JBQW9CO0FBRzdELFlBQU1SLE9BQU0sZ0JBQWdCLEtBQUs7QUFDakMsWUFBTSxRQUFRLE1BQU0sU0FBUyxJQUFJO0FBQ2pDLGFBQU8sUUFBUSxJQUFJQSxRQUFPLE9BQU8sS0FBSyxJQUFJQTtJQUM1QztBQUNGLFVBQU0sZ0JBQ0osVUFBVSxpQkFDVixTQUFTLGtCQUFrQixPQUFpQjtBQUMxQyxhQUFPLEdBQUcsT0FBTyxTQUFTLEtBQUssQ0FBQztJQUNsQztBQUVGLFVBQU0sYUFBYSxRQUFRLE1BQU07QUFFakMsYUFBUyxXQUFXQSxNQUFXO0FBRTdCLGVBQVMsYUFBYSxRQUFRQSxNQUFLUyxNQUFLLFVBQVU7QUFDbEQsYUFBTyxHQUFHLFFBQVFULElBQUc7SUFDdkI7QUFFQSxhQUFTLG1CQUFtQixTQUFxQixTQUFnQjtBQUMvRCxhQUFPLFNBQVMsUUFBVyxTQUFTO0FBQ3BDLGFBQU8sVUFBVSxPQUFPLEtBQUssT0FBTyxHQUFHLFFBQVcsbUJBQW1CLElBQUk7SUFDM0U7QUFVQSxhQUFTLFFBQVEsU0FBcUIsV0FBdUIsTUFBbUI7QUFDOUUsWUFBTSxFQUFFLE1BQU0sU0FBUyxhQUFZLElBQUssZ0JBQWdCLE1BQU0sY0FBYztBQUM1RSxnQkFBVSxtQkFBbUIsU0FBUyxPQUFPO0FBSTdDLFlBQU0sUUFBUSxjQUFjLE9BQU87QUFDbkMsWUFBTSxJQUFJLEdBQUcsVUFBVSxTQUFTO0FBQ2hDLFVBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUFHLGNBQU0sSUFBSSxNQUFNLHFCQUFxQjtBQUM3RCxZQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLEtBQUssQ0FBQztBQUVsRCxVQUFJLGdCQUFnQixRQUFRLGlCQUFpQixPQUFPO0FBR2xELGNBQU0sSUFBSSxpQkFBaUIsT0FBT0csYUFBWSxRQUFRLFNBQVMsSUFBSTtBQUNuRSxpQkFBUyxLQUFLLE9BQU8sR0FBRyxRQUFXLGNBQWMsQ0FBQztNQUNwRDtBQUNBLFlBQU0sT0FBTyxZQUFZLEdBQUcsUUFBUTtBQUNwQyxZQUFNLElBQUk7QUFTVixlQUFTLE1BQU0sUUFBa0I7QUFHL0IsY0FBTSxJQUFJLFNBQVMsTUFBTTtBQUN6QixZQUFJLENBQUMsR0FBRyxZQUFZLENBQUM7QUFBRztBQUN4QixjQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDbkIsY0FBTSxJQUFJLE1BQU0sS0FBSyxTQUFTLENBQUMsRUFBRSxTQUFRO0FBQ3pDLGNBQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBQ3ZCLFlBQUksTUFBTU07QUFBSztBQUNmLGNBQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFJLE1BQU1BO0FBQUs7QUFDZixZQUFJLFlBQVksRUFBRSxNQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxJQUFJSCxJQUFHO0FBQ3JELFlBQUksUUFBUTtBQUNaLFlBQUksUUFBUSxzQkFBc0IsQ0FBQyxHQUFHO0FBQ3BDLGtCQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLHNCQUFZO1FBQ2Q7QUFDQSxlQUFPLElBQUksVUFBVSxHQUFHLE9BQU8sbUJBQW1CLFNBQVksUUFBUTtNQUN4RTtBQUNBLGFBQU8sRUFBRSxNQUFNLE1BQUs7SUFDdEI7QUFhQSxhQUFTLEtBQUssU0FBcUIsV0FBdUIsT0FBc0IsQ0FBQSxHQUFFO0FBQ2hGLFlBQU0sRUFBRSxNQUFNLE1BQUssSUFBSyxRQUFRLFNBQVMsV0FBVyxJQUFJO0FBQ3hELFlBQU0sT0FBTyxlQUEwQixLQUFLLFdBQVcsR0FBRyxPQUFPRixLQUFJO0FBQ3JFLFlBQU0sTUFBTSxLQUFLLE1BQU0sS0FBSztBQUM1QixhQUFPLElBQUksUUFBUSxLQUFLLE1BQU07SUFDaEM7QUFlQSxhQUFTLE9BQ1AsV0FDQSxTQUNBLFdBQ0EsT0FBd0IsQ0FBQSxHQUFFO0FBRTFCLFlBQU0sRUFBRSxNQUFNLFNBQVMsT0FBTSxJQUFLLGdCQUFnQixNQUFNLGNBQWM7QUFDdEUsa0JBQVksT0FBTyxXQUFXLFFBQVcsV0FBVztBQUNwRCxnQkFBVSxtQkFBbUIsU0FBUyxPQUFPO0FBQzdDLFVBQUksQ0FBQyxRQUFRLFNBQWdCLEdBQUc7QUFDOUIsY0FBTSxNQUFNLHFCQUFxQixZQUFZLHdCQUF3QjtBQUNyRSxjQUFNLElBQUksTUFBTSx3Q0FBd0MsR0FBRztNQUM3RDtBQUNBLHdCQUFrQixXQUFXLE1BQU07QUFDbkMsVUFBSTtBQUNGLGNBQU0sTUFBTSxVQUFVLFVBQVUsV0FBVyxNQUFNO0FBQ2pELGNBQU0sSUFBSSxNQUFNLFVBQVUsU0FBUztBQUNuQyxZQUFJLFFBQVEsSUFBSSxTQUFRO0FBQUksaUJBQU87QUFDbkMsY0FBTSxFQUFFLEdBQUcsRUFBQyxJQUFLO0FBQ2pCLGNBQU0sSUFBSSxjQUFjLE9BQU87QUFDL0IsY0FBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25CLGNBQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxFQUFFO0FBQzNCLGNBQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxFQUFFO0FBQzNCLGNBQU0sSUFBSSxNQUFNLEtBQUssZUFBZSxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO0FBQ2hFLFlBQUksRUFBRSxJQUFHO0FBQUksaUJBQU87QUFDcEIsY0FBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFDdkIsZUFBTyxNQUFNO01BQ2YsU0FBUyxHQUFHO0FBQ1YsZUFBTztNQUNUO0lBQ0Y7QUFFQSxhQUFTLGlCQUNQLFdBQ0EsU0FDQSxPQUF5QixDQUFBLEdBQUU7QUFFM0IsWUFBTSxFQUFFLFFBQU8sSUFBSyxnQkFBZ0IsTUFBTSxjQUFjO0FBQ3hELGdCQUFVLG1CQUFtQixTQUFTLE9BQU87QUFDN0MsYUFBTyxVQUFVLFVBQVUsV0FBVyxXQUFXLEVBQUUsaUJBQWlCLE9BQU8sRUFBRSxRQUFPO0lBQ3RGO0FBRUEsV0FBTyxPQUFPLE9BQU87TUFDbkI7TUFDQSxjQUFBSDtNQUNBO01BQ0EsT0FBQUM7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtLQUNEO0VBQ0g7OztBUDcvQ0EsTUFBTSxrQkFBMkM7SUFDL0MsR0FBRyxPQUFPLG9FQUFvRTtJQUM5RSxHQUFHLE9BQU8sb0VBQW9FO0lBQzlFLEdBQUcsT0FBTyxDQUFDO0lBQ1gsR0FBRyxPQUFPLENBQUM7SUFDWCxHQUFHLE9BQU8sQ0FBQztJQUNYLElBQUksT0FBTyxvRUFBb0U7SUFDL0UsSUFBSSxPQUFPLG9FQUFvRTs7QUFHakYsTUFBTSxpQkFBbUM7SUFDdkMsTUFBTSxPQUFPLG9FQUFvRTtJQUNqRixTQUFTO01BQ1AsQ0FBQyxPQUFPLG9DQUFvQyxHQUFHLENBQUMsT0FBTyxvQ0FBb0MsQ0FBQztNQUM1RixDQUFDLE9BQU8scUNBQXFDLEdBQUcsT0FBTyxvQ0FBb0MsQ0FBQzs7O0FBSWhHLE1BQU1RLE9BQXNCLHVCQUFPLENBQUM7QUFDcEMsTUFBTUMsT0FBc0IsdUJBQU8sQ0FBQztBQU1wQyxXQUFTLFFBQVEsR0FBUztBQUN4QixVQUFNLElBQUksZ0JBQWdCO0FBRTFCLFVBQU1DLE9BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxPQUFPLE9BQU8sRUFBRSxHQUFHLE9BQU8sT0FBTyxFQUFFO0FBRTNFLFVBQU0sT0FBTyxPQUFPLEVBQUUsR0FBRyxPQUFPLE9BQU8sRUFBRSxHQUFHLE9BQU8sT0FBTyxFQUFFO0FBQzVELFVBQU0sS0FBTSxJQUFJLElBQUksSUFBSztBQUN6QixVQUFNLEtBQU0sS0FBSyxLQUFLLElBQUs7QUFDM0IsVUFBTSxLQUFNLEtBQUssSUFBSUEsTUFBSyxDQUFDLElBQUksS0FBTTtBQUNyQyxVQUFNLEtBQU0sS0FBSyxJQUFJQSxNQUFLLENBQUMsSUFBSSxLQUFNO0FBQ3JDLFVBQU0sTUFBTyxLQUFLLElBQUlELE1BQUssQ0FBQyxJQUFJLEtBQU07QUFDdEMsVUFBTSxNQUFPLEtBQUssS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFPO0FBQ3pDLFVBQU0sTUFBTyxLQUFLLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTztBQUN6QyxVQUFNLE1BQU8sS0FBSyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU87QUFDekMsVUFBTSxPQUFRLEtBQUssS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFPO0FBQzFDLFVBQU0sT0FBUSxLQUFLLE1BQU0sTUFBTSxDQUFDLElBQUksTUFBTztBQUMzQyxVQUFNLE9BQVEsS0FBSyxNQUFNQyxNQUFLLENBQUMsSUFBSSxLQUFNO0FBQ3pDLFVBQU0sS0FBTSxLQUFLLE1BQU0sTUFBTSxDQUFDLElBQUksTUFBTztBQUN6QyxVQUFNLEtBQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQU07QUFDckMsVUFBTSxPQUFPLEtBQUssSUFBSUQsTUFBSyxDQUFDO0FBQzVCLFFBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDO0FBQUcsWUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBQzNFLFdBQU87RUFDVDtBQUVBLE1BQU0sT0FBTyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsTUFBTSxRQUFPLENBQUU7QUFDdkQsTUFBTSxVQUEwQiw0QkFBWSxpQkFBaUI7SUFDM0QsSUFBSTtJQUNKLE1BQU07R0FDUDtBQW1CTSxNQUFNLFlBQW1DLHNCQUFNLFNBQVMsTUFBTTtBQUtyRSxNQUFNLHVCQUFzRCxDQUFBO0FBQzVELFdBQVMsV0FBVyxRQUFnQixVQUFzQjtBQUN4RCxRQUFJLE9BQU8scUJBQXFCLEdBQUc7QUFDbkMsUUFBSSxTQUFTLFFBQVc7QUFDdEIsWUFBTSxPQUFPLE9BQU8sYUFBYSxHQUFHLENBQUM7QUFDckMsYUFBTyxZQUFZLE1BQU0sSUFBSTtBQUM3QiwyQkFBcUIsR0FBRyxJQUFJO0lBQzlCO0FBQ0EsV0FBTyxPQUFPLFlBQVksTUFBTSxHQUFHLFFBQVEsQ0FBQztFQUM5QztBQUdBLE1BQU0sZUFBZSxDQUFDLFVBQTZCLE1BQU0sUUFBUSxJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQzlFLE1BQU0sVUFBVSxDQUFDLE1BQWMsSUFBSUEsU0FBUUQ7QUFHM0MsV0FBUyxvQkFBb0IsTUFBZ0I7QUFDM0MsVUFBTSxFQUFFLElBQUksS0FBSSxJQUFLO0FBQ3JCLFVBQU0sS0FBSyxHQUFHLFVBQVUsSUFBSTtBQUM1QixVQUFNLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDMUIsVUFBTSxTQUFTLFFBQVEsRUFBRSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksRUFBRTtBQUM1QyxXQUFPLEVBQUUsUUFBUSxPQUFPLGFBQWEsQ0FBQyxFQUFDO0VBQ3pDO0FBS0EsV0FBUyxPQUFPLEdBQVM7QUFDdkIsVUFBTSxLQUFLO0FBQ1gsUUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQUcsWUFBTSxJQUFJLE1BQU0sK0JBQTBCO0FBQ2xFLFVBQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxDQUFDO0FBQzFCLFVBQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztBQUdqQixRQUFJLENBQUMsUUFBUSxDQUFDO0FBQUcsVUFBSSxHQUFHLElBQUksQ0FBQztBQUM3QixVQUFNLElBQUksUUFBUSxXQUFXLEVBQUUsR0FBRyxFQUFDLENBQUU7QUFDckMsTUFBRSxlQUFjO0FBQ2hCLFdBQU87RUFDVDtBQUNBLE1BQU0sTUFBTTtBQUlaLFdBQVMsYUFBYSxNQUFrQjtBQUN0QyxXQUFPLFFBQVEsR0FBRyxPQUFPLElBQUksV0FBVyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQztFQUN4RTtBQUtBLFdBQVMsb0JBQW9CLFdBQXFCO0FBQ2hELFdBQU8sb0JBQW9CLFNBQVMsRUFBRTtFQUN4QztBQU1BLFdBQVMsWUFDUCxTQUNBLFdBQ0EsVUFBc0IsWUFBWSxFQUFFLEdBQUM7QUFFckMsVUFBTSxFQUFFLEdBQUUsSUFBSztBQUNmLFVBQU0sSUFBSSxPQUFPLFNBQVMsUUFBVyxTQUFTO0FBQzlDLFVBQU0sRUFBRSxPQUFPLElBQUksUUFBUSxFQUFDLElBQUssb0JBQW9CLFNBQVM7QUFDOUQsVUFBTSxJQUFJLE9BQU8sU0FBUyxJQUFJLFNBQVM7QUFDdkMsVUFBTSxJQUFJLEdBQUcsUUFBUSxJQUFJLElBQUksV0FBVyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQzFELFVBQU0sT0FBTyxXQUFXLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUVqRCxVQUFNLEVBQUUsT0FBTyxJQUFJLFFBQVEsRUFBQyxJQUFLLG9CQUFvQixJQUFJO0FBQ3pELFVBQU0sSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDO0FBQzdCLFVBQU0sTUFBTSxJQUFJLFdBQVcsRUFBRTtBQUM3QixRQUFJLElBQUksSUFBSSxDQUFDO0FBQ2IsUUFBSSxJQUFJLEdBQUcsUUFBUSxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFFNUMsUUFBSSxDQUFDLGNBQWMsS0FBSyxHQUFHLEVBQUU7QUFBRyxZQUFNLElBQUksTUFBTSxrQ0FBa0M7QUFDbEYsV0FBTztFQUNUO0FBTUEsV0FBUyxjQUFjLFdBQXVCLFNBQXFCLFdBQXFCO0FBQ3RGLFVBQU0sRUFBRSxJQUFJLElBQUksS0FBSSxJQUFLO0FBQ3pCLFVBQU0sTUFBTSxPQUFPLFdBQVcsSUFBSSxXQUFXO0FBQzdDLFVBQU0sSUFBSSxPQUFPLFNBQVMsUUFBVyxTQUFTO0FBQzlDLFVBQU0sTUFBTSxPQUFPLFdBQVcsSUFBSSxXQUFXO0FBQzdDLFFBQUk7QUFDRixZQUFNLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQztBQUN6QixZQUFNLElBQUksSUFBSSxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDakMsVUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQUcsZUFBTztBQUMvQixZQUFNLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxFQUFFLENBQUM7QUFDbEMsVUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQUcsZUFBTztBQUUvQixZQUFNLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7QUFFckQsWUFBTSxJQUFJLEtBQUssZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLFlBQU0sRUFBRSxHQUFHLEVBQUMsSUFBSyxFQUFFLFNBQVE7QUFFM0IsVUFBSSxFQUFFLElBQUcsS0FBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU07QUFBRyxlQUFPO0FBQzlDLGFBQU87SUFDVCxTQUFTLE9BQU87QUFDZCxhQUFPO0lBQ1Q7RUFDRjtBQTZCTyxNQUFNLFVBQXdDLHVCQUFLO0FBQ3hELFVBQU0sT0FBTztBQUNiLFVBQU0sYUFBYTtBQUNuQixVQUFNLGtCQUFrQixDQUFDLE9BQU8sWUFBWSxVQUFVLE1BQWlCO0FBQ3JFLGFBQU8sZUFBZSxNQUFNLGdCQUFnQixDQUFDO0lBQy9DO0FBQ0EsV0FBTztNQUNMLFFBQVEsYUFBYSxpQkFBaUIsbUJBQW1CO01BQ3pELGNBQWM7TUFDZCxNQUFNO01BQ04sUUFBUTtNQUNSLE9BQU87TUFDUCxPQUFPO1FBQ0w7UUFDQTtRQUNBO1FBQ0E7O01BRUYsU0FBUztRQUNQLFdBQVc7UUFDWCxXQUFXO1FBQ1gsb0JBQW9CO1FBQ3BCLFdBQVcsT0FBTztRQUNsQixNQUFNOzs7RUFHWixHQUFFOzs7QVMzUUY7QUFZQSxvQkFBaUI7QUFQakIsTUFBSztBQUFMLEdBQUEsU0FBS0csV0FBUTtBQUNYLElBQUFBLFVBQUFBLFVBQUEsT0FBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLFVBQUFBLFVBQUEsTUFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLFVBQUFBLFVBQUEsTUFBQSxJQUFBLENBQUEsSUFBQTtBQUNBLElBQUFBLFVBQUFBLFVBQUEsT0FBQSxJQUFBLENBQUEsSUFBQTtFQUNGLEdBTEssYUFBQSxXQUFRLENBQUEsRUFBQTtBQStDTixNQUFNLGFBQXNCLFlBQUFDLFNBQUs7SUFDdEMsTUFBTTtJQUNOLE9BQU8sUUFBUSxJQUFJLGFBQWE7SUFDaEMsV0FBVyxPQUF5QztNQUNsRCxRQUFRO01BQ1IsU0FBUztRQUNQLFVBQVU7UUFDVixlQUFlO1FBQ2YsUUFBUTs7UUFFUjtJQUNKLFlBQVk7TUFDVixPQUFPLENBQUMsVUFBUztBQUNmLGVBQU8sRUFBRSxPQUFPLE1BQU0sWUFBVyxFQUFFO01BQ3JDO01BQ0EsS0FBSyxDQUFDLFFBQWdDO0FBRXBDLFlBQUksT0FBTyxPQUFPLFFBQVEsWUFBWSxTQUFTLEtBQUs7QUFDbEQsZ0JBQU0sU0FBUyxFQUFFLEdBQUcsSUFBRztBQUN2QixjQUFJLE9BQU8sZUFBZSxPQUFPO0FBQy9CLGtCQUFNLE1BQU0sT0FBTztBQUNuQixtQkFBTyxNQUFNO2NBQ1gsU0FBUyxJQUFJO2NBQ2IsT0FBTyxJQUFJO2NBQ1gsTUFBTSxJQUFJOztVQUVkO0FBQ0EsaUJBQU87UUFDVDtBQUNBLGVBQU87TUFDVDs7R0FFSDs7O0FDcEZEO0FBeURNLFdBQVUsY0FBY0MsU0FBYztBQUMxQyxRQUFJO0FBQ0YsYUFBTyxRQUFRQSxRQUFPLE1BQU0sd0JBQXdCLENBQUM7SUFDdkQsUUFBUTtBQUNOLGFBQU87SUFDVDtFQUNGO0FBMERNLFdBQVUsY0FBYyxPQUFpQjtBQUM3QyxRQUFJLFNBQVM7QUFDYixhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ3JDLGdCQUFVLE9BQU8sYUFBYSxNQUFNLENBQUMsQ0FBQztJQUN4QztBQUNBLFdBQU8sS0FBSyxNQUFNO0VBQ3BCO0FBUU0sV0FBVSxjQUFjQyxTQUFjO0FBQzFDLFFBQUksQ0FBQyxjQUFjQSxPQUFNLEdBQUc7QUFDMUIsWUFBTSxJQUFJLE1BQU0sdUJBQXVCO0lBQ3pDO0FBQ0EsVUFBTSxTQUFTLEtBQUtBLE9BQU07QUFDMUIsVUFBTSxRQUFRLElBQUksV0FBVyxPQUFPLE1BQU07QUFDMUMsYUFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxZQUFNLENBQUMsSUFBSSxPQUFPLFdBQVcsQ0FBQztJQUNoQztBQUNBLFdBQU87RUFDVDs7O0FYekVBLE1BQU0sWUFBWSxZQUFrQztBQUNsRCxRQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sUUFBUTtBQUNsRCxhQUFPLE9BQU87SUFDaEI7QUFDQSxRQUFJLE9BQU8sZUFBVyxlQUFnQixXQUFrQixRQUFRO0FBQzlELGFBQVEsV0FBa0I7SUFDNUI7QUFDQSxRQUFJO0FBQ0YsWUFBTSxlQUFlLE1BQU07QUFDM0IsVUFBSSxhQUFhLFdBQVc7QUFDMUIsZUFBTyxhQUFhO01BQ3RCO0lBQ0YsUUFBUTtBQUNOLGFBQU8sTUFBTSwyQkFBMkI7SUFDMUM7QUFFQSxVQUFNLElBQUksTUFBTSx1Q0FBdUM7RUFDekQ7QUFLQSxNQUFNLGVBQU4sTUFBa0I7SUFDUixpQkFBc0M7SUFDdEM7SUFFUixjQUFBO0FBQ0UsV0FBSyxjQUFjLEtBQUssV0FBVTtJQUNwQztJQUVRLE1BQU0sYUFBVTtBQUN0QixXQUFLLGlCQUFpQixNQUFNLFVBQVM7SUFDdkM7SUFFUSxNQUFNLG9CQUFpQjtBQUM3QixZQUFNLEtBQUs7QUFDWCxVQUFJLENBQUMsS0FBSyxnQkFBZ0I7QUFDeEIsY0FBTSxJQUFJLE1BQU0sdUNBQXVDO01BQ3pEO0FBQ0EsYUFBTyxLQUFLO0lBQ2Q7SUFFQSxNQUFNLFlBQVM7QUFDYixZQUFNQyxVQUFTLE1BQU0sS0FBSyxrQkFBaUI7QUFDM0MsYUFBT0EsUUFBTztJQUNoQjtJQUVBLE1BQU0sZ0JBQXdHLE9BQVE7QUFDcEgsWUFBTUEsVUFBUyxNQUFNLEtBQUssa0JBQWlCO0FBQzNDLGFBQU9BLFFBQU8sZ0JBQWdCLEtBQUs7SUFDckM7O0FBSUssTUFBTSxlQUFlLElBQUksYUFBWTtBQUdyQyxNQUFNLGNBQWMsUUFBUTtBQUM1QixNQUFNLHlCQUF5QixRQUFRO0FBbUI5QyxpQkFBc0Isa0JBQWU7QUFDbkMsVUFBTSxrQkFBa0IsWUFBWSxFQUFFO0FBQ3RDLFVBQU0sYUFBYSxXQUFXLGVBQWU7QUFDN0Msb0JBQWdCLEtBQUssQ0FBQztBQUN0QixVQUFNLFlBQVksTUFBTSxhQUFhLFVBQVU7QUFFL0MsV0FBTztNQUNMO01BQ0E7O0VBRUo7QUFLQSxpQkFBc0IsYUFBYSxZQUFrQjtBQUNuRCxRQUFJO0FBQ0YsWUFBTSxrQkFBa0IsV0FBVyxVQUFVO0FBQzdDLFlBQU0saUJBQWlCLFFBQVEsYUFBYSxlQUFlO0FBQzNELGFBQU87UUFDTCxLQUFLLFdBQVcsY0FBYztRQUM5QixPQUFPOztJQUVYLFNBQVMsT0FBTztBQUNkLGFBQU8sTUFBTSxFQUFFLE1BQUssR0FBSSwwQkFBMEI7QUFDbEQsWUFBTTtJQUNSO0VBQ0Y7QUFpQ0EsV0FBUyxvQkFBb0IsWUFBK0I7QUFDMUQsUUFBSSxzQkFBc0IsWUFBWTtBQUNwQyxhQUFPLFdBQVcsVUFBVTtJQUM5QjtBQUNBLFdBQU87RUFDVDtBQU9BLGlCQUFzQixVQUFVLE9BQW1CLFlBQStCO0FBQ2hGLFFBQUk7QUFDRixZQUFNLGdCQUFnQixvQkFBb0IsVUFBVTtBQUdwRCxZQUFNLGFBQWEsS0FBSyxVQUFVO1FBQ2hDO1FBQ0EsTUFBTTtRQUNOLE1BQU07UUFDTixNQUFNO1FBQ04sTUFBTTtRQUNOLE1BQU07T0FDUDtBQUdELFlBQU0sWUFBWSxPQUFPLElBQUksWUFBVyxFQUFHLE9BQU8sVUFBVSxDQUFDO0FBRzdELFlBQU0sa0JBQWtCLFdBQVcsYUFBYTtBQUNoRCxZQUFNLGlCQUFpQixRQUFRLEtBQUssV0FBVyxlQUFlO0FBRzlELGFBQU87UUFDTCxHQUFHO1FBQ0gsSUFBSSxXQUFXLFNBQVM7UUFDeEIsS0FBSyxXQUFXLGNBQWM7O0lBRWxDLFNBQVMsT0FBTztBQUNkLGFBQU8sTUFBTSxFQUFFLE1BQUssR0FBSSxzQkFBc0I7QUFDOUMsWUFBTTtJQUNSO0VBQ0Y7QUFPTSxXQUFVLGlCQUFpQixZQUErQjtBQUM5RCxVQUFNLGtCQUFrQixzQkFBc0IsYUFDMUMsYUFDQSxXQUFXLFVBQVU7QUFDekIsVUFBTSxpQkFBaUIsUUFBUSxhQUFhLGVBQWU7QUFDM0QsV0FBTyxXQUFXLGNBQWM7RUFDbEM7QUFRQSxpQkFBc0IsY0FDcEIsT0FDQSxZQUErQjtBQUUvQixVQUFNLFNBQVMsTUFBTSxVQUFVLGlCQUFpQixVQUFVO0FBQzFELFVBQU0sWUFBWSxNQUFNLGNBQWMsS0FBSyxNQUFNLEtBQUssSUFBRyxJQUFLLEdBQUk7QUFFbEUsVUFBTSxZQUF3QjtNQUM1QixNQUFNLE1BQU0sUUFBUTtNQUNwQixZQUFZO01BQ1osTUFBTSxNQUFNLFFBQVEsQ0FBQTtNQUNwQixTQUFTLE1BQU0sV0FBVztNQUMxQjs7QUFHRixXQUFPLFVBQVUsV0FBVyxVQUFVO0VBQ3hDOzs7QVlqU0E7OztBQ0FBOzs7QUNBQTs7O0FDQUE7OztBQ0FBOzs7Ozs7OztBQXVCQSxNQUFNQyxhQUFZLFlBQWtDO0FBQ2xELFFBQUksT0FBTyxXQUFXLGVBQWUsT0FBTyxRQUFRO0FBQ2xELGFBQU8sT0FBTztJQUNoQjtBQUNBLFFBQUksT0FBTyxlQUFXLGVBQWdCLFdBQWtCLFFBQVE7QUFDOUQsYUFBUSxXQUFrQjtJQUM1QjtBQUNBLFFBQUk7QUFDRixZQUFNLGVBQWUsTUFBTTtBQUMzQixVQUFJLGFBQWEsV0FBVztBQUMxQixlQUFPLGFBQWE7TUFDdEI7SUFDRixRQUFRO0FBQ04sYUFBTyxNQUFNLDJCQUEyQjtJQUMxQztBQUVBLFVBQU0sSUFBSSxNQUFNLHVDQUF1QztFQUN6RDtBQUVBLE1BQU0sdUJBQU4sTUFBMEI7SUFDaEIsaUJBQXNDO0lBQ3RDO0lBRVIsY0FBQTtBQUNFLFdBQUssY0FBYyxLQUFLLFdBQVU7SUFDcEM7SUFFUSxNQUFNLGFBQVU7QUFDdEIsV0FBSyxpQkFBaUIsTUFBTUEsV0FBUztJQUN2QztJQUVRLE1BQU0sb0JBQWlCO0FBQzdCLFlBQU0sS0FBSztBQUNYLFVBQUksQ0FBQyxLQUFLLGdCQUFnQjtBQUN4QixjQUFNLElBQUksTUFBTSx1Q0FBdUM7TUFDekQ7QUFDQSxhQUFPLEtBQUs7SUFDZDtJQUVBLE1BQU0sWUFBUztBQUNiLFlBQU1DLFVBQVMsTUFBTSxLQUFLLGtCQUFpQjtBQUMzQyxhQUFPQSxRQUFPO0lBQ2hCO0lBRUEsTUFBTSxnQkFBd0csT0FBUTtBQUNwSCxZQUFNQSxVQUFTLE1BQU0sS0FBSyxrQkFBaUI7QUFDM0MsYUFBT0EsUUFBTyxnQkFBZ0IsS0FBSztJQUNyQzs7QUFHRixNQUFNLGFBQWEsSUFBSSxxQkFBb0I7QUFhM0MsaUJBQXNCLGVBQ3BCLFNBQ0EsZUFDQSxpQkFBdUI7QUFFdkIsUUFBSTtBQUNGLFVBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCO0FBQ2xELGNBQU0sSUFBSSxNQUFNLDBCQUEwQjtNQUM1QztBQUdBLFVBQUksQ0FBQyxrQkFBa0IsS0FBSyxhQUFhLEdBQUc7QUFDMUMsY0FBTSxJQUFJLE1BQU0sNEJBQTRCO01BQzlDO0FBR0EsWUFBTSxZQUFZLGdCQUFnQixXQUFXLElBQUksS0FBSyxnQkFBZ0IsV0FBVyxJQUFJLElBQ2pGLGtCQUNBLE9BQU87QUFHWCxZQUFNLGNBQWMsVUFBVSxnQkFBZ0IsV0FBVyxhQUFhLEdBQUcsV0FBVyxTQUFTLENBQUM7QUFDOUYsWUFBTSxVQUFVLFlBQVksTUFBTSxHQUFHLEVBQUU7QUFHdkMsWUFBTSxZQUFZLE9BQU8sTUFBTSxXQUFXLFVBQVMsR0FBSSxVQUNyRCxPQUNBLFFBQVEsUUFDUixFQUFFLE1BQU0sV0FBVyxRQUFRLElBQUcsR0FDOUIsT0FDQSxDQUFDLFNBQVMsQ0FBQztBQUliLGNBQVEsS0FBSyxDQUFDO0FBQ2Qsa0JBQVksS0FBSyxDQUFDO0FBR2xCLFlBQU0sS0FBSyxJQUFJLFdBQVcsRUFBRTtBQUM1QixZQUFNLFdBQVcsZ0JBQWdCLEVBQUU7QUFFbkMsWUFBTSxVQUFVLElBQUksWUFBVyxFQUFHLE9BQU8sT0FBTztBQUNoRCxZQUFNLFlBQVksT0FBTyxNQUFNLFdBQVcsVUFBUyxHQUFJLFFBQ3JELEVBQUUsTUFBTSxXQUFXLEdBQUUsR0FDckIsV0FDQSxRQUFRLE1BQU07QUFJaEIsWUFBTSxtQkFBbUIsY0FBYyxJQUFJLFdBQVcsU0FBUyxDQUFDO0FBQ2hFLFlBQU0sV0FBVyxjQUFjLEVBQUU7QUFFakMsYUFBTyxtQkFBbUIsU0FBUztJQUNyQyxTQUFTLE9BQU87QUFDZCxhQUFPLE1BQU0sRUFBRSxNQUFLLEdBQUksMkJBQTJCO0FBQ25ELFlBQU07SUFDUjtFQUNGO0FBU0EsaUJBQXNCLGVBQ3BCLGtCQUNBLGtCQUNBLGNBQW9CO0FBRXBCLFFBQUk7QUFDRixVQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsY0FBYztBQUMzRCxjQUFNLElBQUksTUFBTSwwQkFBMEI7TUFDNUM7QUFHQSxVQUFJLENBQUMsa0JBQWtCLEtBQUssZ0JBQWdCLEdBQUc7QUFDN0MsY0FBTSxJQUFJLE1BQU0sNEJBQTRCO01BQzlDO0FBR0EsWUFBTSxZQUFZLGFBQWEsV0FBVyxJQUFJLEtBQUssYUFBYSxXQUFXLElBQUksSUFDM0UsZUFDQSxPQUFPO0FBR1gsWUFBTSxjQUFjLFVBQVUsZ0JBQWdCLFdBQVcsZ0JBQWdCLEdBQUcsV0FBVyxTQUFTLENBQUM7QUFDakcsWUFBTSxVQUFVLFlBQVksTUFBTSxHQUFHLEVBQUU7QUFHdkMsWUFBTSxZQUFZLE9BQU8sTUFBTSxXQUFXLFVBQVMsR0FBSSxVQUNyRCxPQUNBLFFBQVEsUUFDUixFQUFFLE1BQU0sV0FBVyxRQUFRLElBQUcsR0FDOUIsT0FDQSxDQUFDLFNBQVMsQ0FBQztBQUliLGNBQVEsS0FBSyxDQUFDO0FBQ2Qsa0JBQVksS0FBSyxDQUFDO0FBSWxCLFVBQUk7QUFDSixVQUFJO0FBRUosVUFBSSxpQkFBaUIsU0FBUyxNQUFNLEdBQUc7QUFFckMsY0FBTSxDQUFDLGtCQUFrQixRQUFRLElBQUksaUJBQWlCLE1BQU0sTUFBTTtBQUNsRSxxQkFBYSxjQUFjLGdCQUFnQjtBQUMzQyxhQUFLLGNBQWMsUUFBUTtNQUM3QixPQUFPO0FBRUwsY0FBTSxZQUFZLFdBQVcsZ0JBQWdCO0FBQzdDLGFBQUssVUFBVSxNQUFNLEdBQUcsRUFBRTtBQUMxQixxQkFBYSxVQUFVLE1BQU0sRUFBRTtNQUNqQztBQUdBLFlBQU0sWUFBWSxPQUFPLE1BQU0sV0FBVyxVQUFTLEdBQUksUUFDckQsRUFBRSxNQUFNLFdBQVcsR0FBRSxHQUNyQixXQUNBLFdBQVcsTUFBcUI7QUFHbEMsYUFBTyxJQUFJLFlBQVcsRUFBRyxPQUFPLFNBQVM7SUFDM0MsU0FBUyxPQUFPO0FBQ2QsYUFBTyxNQUFNLEVBQUUsTUFBSyxHQUFJLDJCQUEyQjtBQUNuRCxZQUFNO0lBQ1I7RUFDRjtBQVFNLFdBQVUscUJBQ2QsWUFDQSxXQUFpQjtBQUVqQixRQUFJO0FBQ0YsVUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXO0FBQzdCLGNBQU0sSUFBSSxNQUFNLDBCQUEwQjtNQUM1QztBQUdBLFVBQUksQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLEdBQUc7QUFDdkMsY0FBTSxJQUFJLE1BQU0sNEJBQTRCO01BQzlDO0FBR0EsWUFBTSxZQUFZLFVBQVUsV0FBVyxJQUFJLEtBQUssVUFBVSxXQUFXLElBQUksSUFDckUsWUFDQSxPQUFPO0FBR1gsWUFBTSxjQUFjLFVBQVUsZ0JBQWdCLFdBQVcsVUFBVSxHQUFHLFdBQVcsU0FBUyxDQUFDO0FBQzNGLGFBQU8sRUFBRSxjQUFjLFlBQVksTUFBTSxHQUFHLEVBQUUsRUFBQztJQUNqRCxTQUFTLE9BQU87QUFDZCxhQUFPLE1BQU0sRUFBRSxNQUFLLEdBQUksa0NBQWtDO0FBQzFELFlBQU07SUFDUjtFQUNGOzs7QUM1UEE7OztBQ0FBOzs7Ozs7Ozs7Ozs7QUFLQSxzQkFBdUI7QUFDdkIsc0JBQXVCO0FBSXZCLE1BQU0saUJBQWtDLENBQUMsUUFBUSxRQUFRLFFBQVEsWUFBWSxVQUFVLFNBQVMsUUFBUTtBQVl4RyxNQUFNLFlBQVk7SUFDaEIsU0FBUzs7SUFDVCxPQUFPOztJQUNQLFFBQVE7O0lBQ1IsTUFBTTs7SUFDTixZQUFZOzs7QUFTUixXQUFVLFdBQVcsUUFBYztBQUN2QyxzQkFBa0IsUUFBUSxFQUFFO0FBQzVCLFVBQU0sT0FBTyxxQkFBTyxLQUFLLFFBQVEsS0FBSztBQUN0QyxVQUFNLFFBQVEscUJBQU8sUUFBUSxJQUFJO0FBQ2pDLFdBQU8scUJBQU8sT0FBTyxRQUFRLE9BQU8sR0FBSTtFQUMxQztBQVFNLFdBQVUsV0FBVyxTQUFlO0FBQ3hDLHNCQUFrQixTQUFTLEVBQUU7QUFDN0IsVUFBTSxPQUFPLHFCQUFPLEtBQUssU0FBUyxLQUFLO0FBQ3ZDLFVBQU0sUUFBUSxxQkFBTyxRQUFRLElBQUk7QUFDakMsV0FBTyxxQkFBTyxPQUFPLFFBQVEsT0FBTyxHQUFJO0VBQzFDO0FBUU0sV0FBVSxXQUFXLFNBQWU7QUFDeEMsc0JBQWtCLFNBQVMsRUFBRTtBQUM3QixVQUFNLE9BQU8scUJBQU8sS0FBSyxTQUFTLEtBQUs7QUFDdkMsVUFBTSxRQUFRLHFCQUFPLFFBQVEsSUFBSTtBQUNqQyxXQUFPLHFCQUFPLE9BQU8sUUFBUSxPQUFPLEdBQUk7RUFDMUM7QUFTTSxXQUFVLGVBQWUsUUFBZ0IsUUFBaUI7QUFDOUQsc0JBQWtCLFFBQVEsRUFBRTtBQUM1QixRQUFJLFFBQVE7QUFDVixhQUFPLFFBQVEsZ0JBQWdCO0lBQ2pDO0FBRUEsVUFBTSxPQUFPLFVBQVU7TUFDckIsTUFBTTtNQUNOLE1BQU07TUFDTjtLQUNEO0FBQ0QsV0FBTyxxQkFBTyxPQUFPLFlBQVksTUFBTSxHQUFJO0VBQzdDO0FBV00sV0FBVSxhQUNkLFNBQ0EsUUFDQSxRQUNBLE1BQWE7QUFFYixzQkFBa0IsU0FBUyxFQUFFO0FBQzdCLFFBQUksUUFBUTtBQUNWLGFBQU8sUUFBUSxnQkFBZ0I7SUFDakM7QUFDQSxRQUFJLFFBQVE7QUFDVix3QkFBa0IsUUFBUSxFQUFFO0lBQzlCO0FBQ0EsUUFBSSxTQUFTLFVBQWEsQ0FBQyxPQUFPLFVBQVUsSUFBSSxHQUFHO0FBQ2pELFlBQU0sSUFBSSxNQUFNLG9CQUFvQjtJQUN0QztBQUVBLFVBQU0sT0FBTyxVQUFVO01BQ3JCLE1BQU07TUFDTixNQUFNO01BQ047TUFDQTtNQUNBO0tBQ0Q7QUFDRCxXQUFPLHFCQUFPLE9BQU8sVUFBVSxNQUFNLEdBQUk7RUFDM0M7QUFXTSxXQUFVLFlBQ2QsUUFDQSxNQUNBLFlBQ0EsUUFBaUI7QUFFakIsc0JBQWtCLFFBQVEsRUFBRTtBQUM1QixRQUFJLENBQUMsT0FBTyxVQUFVLElBQUksR0FBRztBQUMzQixZQUFNLElBQUksTUFBTSxvQkFBb0I7SUFDdEM7QUFDQSxRQUFJLENBQUMsWUFBWTtBQUNmLFlBQU0sSUFBSSxNQUFNLHdCQUF3QjtJQUMxQztBQUNBLFFBQUksUUFBUTtBQUNWLGFBQU8sUUFBUSxnQkFBZ0I7SUFDakM7QUFFQSxVQUFNLE9BQU8sVUFBVTtNQUNyQixNQUFNO01BQ04sTUFBTTtNQUNOO01BQ0E7TUFDQTtLQUNEO0FBQ0QsV0FBTyxxQkFBTyxPQUFPLFNBQVMsTUFBTSxHQUFJO0VBQzFDO0FBUU0sV0FBVSxhQUFhLEtBQVc7QUFDdEMscUJBQWlCLEdBQUc7QUFDcEIsVUFBTSxPQUFPLHFCQUFPLEtBQUssS0FBSyxNQUFNO0FBQ3BDLFVBQU0sUUFBUSxxQkFBTyxRQUFRLElBQUk7QUFDakMsV0FBTyxxQkFBTyxPQUFPLFVBQVUsT0FBTyxHQUFJO0VBQzVDO0FBUU0sV0FBVSxPQUFPLEtBQVc7QUFDaEMsUUFBSSxDQUFDLElBQUksU0FBUyxHQUFHLEdBQUc7QUFDdEIsWUFBTSxJQUFJLE1BQU0sdUJBQXVCO0lBQ3pDO0FBRUEsVUFBTSxTQUFTLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFlBQVc7QUFDNUMsUUFBSSxDQUFDLGVBQWUsU0FBUyxNQUF1QixHQUFHO0FBQ3JELFlBQU0sSUFBSSxNQUFNLGdCQUFnQjtJQUNsQztBQUVBLFFBQUk7QUFDRixZQUFNLFVBQVUscUJBQU8sT0FBTyxLQUFLLEdBQUk7QUFDdkMsWUFBTSxPQUFPLHFCQUFPLEtBQUsscUJBQU8sVUFBVSxRQUFRLEtBQUssQ0FBQztBQUd4RCxVQUFJO0FBRUosVUFBSTtBQUVKLGNBQVEsUUFBUSxRQUFRO1FBQ3RCLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztBQUNILDRCQUFrQixLQUFLLFNBQVMsS0FBSyxHQUFHLEVBQUU7QUFDMUMsaUJBQU87WUFDTCxNQUFNLFFBQVE7WUFDZCxNQUFNLEtBQUssU0FBUyxLQUFLOztRQUU3QixLQUFLO0FBQ0gsZ0JBQU0sS0FBSyxTQUFTLE1BQU07QUFDMUIsMkJBQWlCLEdBQUc7QUFDcEIsaUJBQU87WUFDTCxNQUFNO1lBQ04sTUFBTTs7UUFFVixLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7QUFDSCx3QkFBYyxVQUFVLFFBQVEsUUFBeUIsSUFBSTtBQUM3RCxpQkFBTztRQUNUO0FBQ0UsZ0JBQU0sSUFBSSxNQUFNLGdCQUFnQjtNQUNwQztJQUNGLFNBQVMsT0FBZ0I7QUFDdkIsVUFBSSxpQkFBaUIsT0FBTztBQUMxQixjQUFNO01BQ1I7QUFDQSxZQUFNLElBQUksTUFBTSx1QkFBdUI7SUFDekM7RUFDRjtBQUlBLFdBQVMsa0JBQWtCLEtBQWEsUUFBZTtBQUNyRCxRQUFJLENBQUMsaUJBQWlCLEtBQUssR0FBRyxHQUFHO0FBQy9CLFlBQU0sSUFBSSxNQUFNLG9CQUFvQjtJQUN0QztBQUNBLFFBQUksVUFBVSxJQUFJLFdBQVcsUUFBUTtBQUNuQyxZQUFNLElBQUksTUFBTSx1Q0FBdUMsTUFBTSxHQUFHO0lBQ2xFO0VBQ0Y7QUFFQSxXQUFTLGlCQUFpQixLQUFXO0FBQ25DLFFBQUk7QUFDRixZQUFNLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFDMUIsVUFBSSxDQUFDLENBQUMsT0FBTyxNQUFNLEVBQUUsU0FBUyxPQUFPLFFBQVEsR0FBRztBQUM5QyxjQUFNLElBQUksTUFBTSw0QkFBNEI7TUFDOUM7SUFDRixRQUFRO0FBQ04sWUFBTSxJQUFJLE1BQU0sbUJBQW1CO0lBQ3JDO0VBQ0Y7QUFFQSxXQUFTLFVBQVUsTUFBZTtBQUNoQyxVQUFNLFNBQW1CLENBQUE7QUFHekIsVUFBTSxRQUFRLHFCQUFPLEtBQUssS0FBSyxNQUFNLEtBQUs7QUFDMUMsV0FBTyxLQUFLLFVBQVUsU0FBUyxNQUFNLE1BQU07QUFDM0MsV0FBTyxLQUFLLEdBQUcsS0FBSztBQUdwQixRQUFJLEtBQUssUUFBUSxRQUFRO0FBQ3ZCLGlCQUFXLFNBQVMsS0FBSyxRQUFRO0FBQy9CLGNBQU0sYUFBYSxxQkFBTyxLQUFLLE9BQU8sTUFBTTtBQUM1QyxlQUFPLEtBQUssVUFBVSxPQUFPLFdBQVcsTUFBTTtBQUM5QyxlQUFPLEtBQUssR0FBRyxVQUFVO01BQzNCO0lBQ0Y7QUFHQSxRQUFJLEtBQUssUUFBUTtBQUNmLFlBQU0sY0FBYyxxQkFBTyxLQUFLLEtBQUssUUFBUSxLQUFLO0FBQ2xELGFBQU8sS0FBSyxVQUFVLFFBQVEsWUFBWSxNQUFNO0FBQ2hELGFBQU8sS0FBSyxHQUFHLFdBQVc7SUFDNUI7QUFHQSxRQUFJLEtBQUssU0FBUyxRQUFXO0FBQzNCLFlBQU0sWUFBWSxxQkFBTyxNQUFNLENBQUM7QUFDaEMsZ0JBQVUsY0FBYyxLQUFLLElBQUk7QUFDakMsYUFBTyxLQUFLLFVBQVUsTUFBTSxVQUFVLE1BQU07QUFDNUMsYUFBTyxLQUFLLEdBQUcsU0FBUztJQUMxQjtBQUdBLFFBQUksS0FBSyxZQUFZO0FBQ25CLFlBQU0sa0JBQWtCLHFCQUFPLEtBQUssS0FBSyxZQUFZLE1BQU07QUFDM0QsYUFBTyxLQUFLLFVBQVUsWUFBWSxnQkFBZ0IsTUFBTTtBQUN4RCxhQUFPLEtBQUssR0FBRyxlQUFlO0lBQ2hDO0FBRUEsV0FBTyxxQkFBTyxRQUFRLHFCQUFPLEtBQUssTUFBTSxDQUFDO0VBQzNDO0FBRUEsV0FBUyxVQUFVLFFBQXVCLE1BQVk7QUFDcEQsVUFBTSxTQUFvQjtNQUN4QixNQUFNO01BQ04sTUFBTTtNQUNOLFFBQVEsQ0FBQTs7QUFHVixRQUFJLElBQUk7QUFFUixRQUFJO0FBRUosV0FBTyxJQUFJLEtBQUssUUFBUTtBQUN0QixZQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLFlBQU0sU0FBUyxLQUFLLElBQUksQ0FBQztBQUV6QixVQUFJLElBQUksSUFBSSxTQUFTLEtBQUssUUFBUTtBQUNoQyxjQUFNLElBQUksTUFBTSxrQkFBa0I7TUFDcEM7QUFFQSxZQUFNLFFBQVEsS0FBSyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksTUFBTTtBQUU5QyxjQUFRLE1BQU07UUFDWixLQUFLLFVBQVU7QUFDYixpQkFBTyxPQUFPLE1BQU0sU0FBUyxLQUFLO0FBQ2xDLDRCQUFrQixPQUFPLE1BQU0sRUFBRTtBQUNqQztRQUNGLEtBQUssVUFBVTtBQUNiLGtCQUFRLE1BQU0sU0FBUyxNQUFNO0FBQzdCLDJCQUFpQixLQUFLO0FBQ3RCLGlCQUFPLFNBQVMsT0FBTyxVQUFVLENBQUE7QUFDakMsaUJBQU8sT0FBTyxLQUFLLEtBQUs7QUFDeEI7UUFDRixLQUFLLFVBQVU7QUFDYixpQkFBTyxTQUFTLE1BQU0sU0FBUyxLQUFLO0FBQ3BDLDRCQUFrQixPQUFPLFFBQVEsRUFBRTtBQUNuQztRQUNGLEtBQUssVUFBVTtBQUNiLGlCQUFPLE9BQU8sTUFBTSxhQUFZO0FBQ2hDO1FBQ0YsS0FBSyxVQUFVO0FBQ2IsaUJBQU8sYUFBYSxNQUFNLFNBQVMsTUFBTTtBQUN6QztRQUNGO0FBRUU7TUFDSjtBQUVBLFdBQUssSUFBSTtJQUNYO0FBRUEsV0FBTztFQUNUOzs7QUMzVkE7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7QUNBQTs7O0FDQUE7QUFPTSxXQUFVQyxTQUFRLEdBQVU7QUFDaEMsV0FBTyxhQUFhLGNBQWUsWUFBWSxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksU0FBUztFQUNyRjtBQUdNLFdBQVVDLE9BQU0sR0FBVTtBQUM5QixRQUFJLE9BQU8sTUFBTTtBQUFXLFlBQU0sSUFBSSxNQUFNLHlCQUF5QixDQUFDLEVBQUU7RUFDMUU7QUFHTSxXQUFVQyxTQUFRLEdBQVM7QUFDL0IsUUFBSSxDQUFDLE9BQU8sY0FBYyxDQUFDLEtBQUssSUFBSTtBQUFHLFlBQU0sSUFBSSxNQUFNLG9DQUFvQyxDQUFDO0VBQzlGO0FBR00sV0FBVUMsUUFBTyxPQUFtQixRQUFpQixRQUFnQixJQUFFO0FBQzNFLFVBQU0sUUFBUUgsU0FBUSxLQUFLO0FBQzNCLFVBQU0sTUFBTSxPQUFPO0FBQ25CLFVBQU0sV0FBVyxXQUFXO0FBQzVCLFFBQUksQ0FBQyxTQUFVLFlBQVksUUFBUSxRQUFTO0FBQzFDLFlBQU0sU0FBUyxTQUFTLElBQUksS0FBSztBQUNqQyxZQUFNLFFBQVEsV0FBVyxjQUFjLE1BQU0sS0FBSztBQUNsRCxZQUFNLE1BQU0sUUFBUSxVQUFVLEdBQUcsS0FBSyxRQUFRLE9BQU8sS0FBSztBQUMxRCxZQUFNLElBQUksTUFBTSxTQUFTLHdCQUF3QixRQUFRLFdBQVcsR0FBRztJQUN6RTtBQUNBLFdBQU87RUFDVDtBQUdNLFdBQVVJLFNBQVEsVUFBZSxnQkFBZ0IsTUFBSTtBQUN6RCxRQUFJLFNBQVM7QUFBVyxZQUFNLElBQUksTUFBTSxrQ0FBa0M7QUFDMUUsUUFBSSxpQkFBaUIsU0FBUztBQUFVLFlBQU0sSUFBSSxNQUFNLHVDQUF1QztFQUNqRztBQUdNLFdBQVVDLFNBQVEsS0FBVSxVQUFhO0FBQzdDLElBQUFGLFFBQU8sS0FBSyxRQUFXLFFBQVE7QUFDL0IsVUFBTSxNQUFNLFNBQVM7QUFDckIsUUFBSSxJQUFJLFNBQVMsS0FBSztBQUNwQixZQUFNLElBQUksTUFBTSwyREFBMkQsR0FBRztJQUNoRjtFQUNGO0FBb0JNLFdBQVVHLEtBQUksS0FBZTtBQUNqQyxXQUFPLElBQUksWUFBWSxJQUFJLFFBQVEsSUFBSSxZQUFZLEtBQUssTUFBTSxJQUFJLGFBQWEsQ0FBQyxDQUFDO0VBQ25GO0FBR00sV0FBVUMsVUFBUyxRQUFvQjtBQUMzQyxhQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3RDLGFBQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUNsQjtFQUNGO0FBR00sV0FBVUMsWUFBVyxLQUFlO0FBQ3hDLFdBQU8sSUFBSSxTQUFTLElBQUksUUFBUSxJQUFJLFlBQVksSUFBSSxVQUFVO0VBQ2hFO0FBR08sTUFBTUMsUUFBaUMsdUJBQzVDLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxTQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLElBQUs7QUErSTdELFdBQVVDLFdBQ2QsVUFDQSxNQUFRO0FBRVIsUUFBSSxRQUFRLFFBQVEsT0FBTyxTQUFTO0FBQVUsWUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBQ3ZGLFVBQU0sU0FBUyxPQUFPLE9BQU8sVUFBVSxJQUFJO0FBQzNDLFdBQU87RUFDVDtBQUdNLFdBQVUsV0FBVyxHQUFlLEdBQWE7QUFDckQsUUFBSSxFQUFFLFdBQVcsRUFBRTtBQUFRLGFBQU87QUFDbEMsUUFBSSxPQUFPO0FBQ1gsYUFBUyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVE7QUFBSyxjQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyRCxXQUFPLFNBQVM7RUFDbEI7QUFnRU8sTUFBTSx3Q0FBYSxDQUN4QixRQUNBLGdCQUNTO0FBQ1QsYUFBUyxjQUFjLFFBQW9CLE1BQVc7QUFFcEQsTUFBQUMsUUFBTyxLQUFLLFFBQVcsS0FBSztBQUc1QixVQUFJLENBQUNDO0FBQU0sY0FBTSxJQUFJLE1BQU0saURBQWlEO0FBRzVFLFVBQUksT0FBTyxnQkFBZ0IsUUFBVztBQUNwQyxjQUFNLFFBQVEsS0FBSyxDQUFDO0FBQ3BCLFFBQUFELFFBQU8sT0FBTyxPQUFPLGVBQWUsU0FBWSxPQUFPLGFBQWEsT0FBTztNQUM3RTtBQUdBLFlBQU0sT0FBTyxPQUFPO0FBQ3BCLFVBQUksUUFBUSxLQUFLLENBQUMsTUFBTTtBQUFXLFFBQUFBLFFBQU8sS0FBSyxDQUFDLEdBQUcsUUFBVyxLQUFLO0FBRW5FLFlBQU0sU0FBUyxZQUFZLEtBQUssR0FBRyxJQUFJO0FBQ3ZDLFlBQU0sY0FBYyxDQUFDLFVBQWtCLFdBQXVCO0FBQzVELFlBQUksV0FBVyxRQUFXO0FBQ3hCLGNBQUksYUFBYTtBQUFHLGtCQUFNLElBQUksTUFBTSw2QkFBNkI7QUFDakUsVUFBQUEsUUFBTyxRQUFRLFFBQVcsUUFBUTtRQUNwQztNQUNGO0FBRUEsVUFBSSxTQUFTO0FBQ2IsWUFBTSxXQUFXO1FBQ2YsUUFBUSxNQUFrQixRQUFtQjtBQUMzQyxjQUFJO0FBQVEsa0JBQU0sSUFBSSxNQUFNLDhDQUE4QztBQUMxRSxtQkFBUztBQUNULFVBQUFBLFFBQU8sSUFBSTtBQUNYLHNCQUFZLE9BQU8sUUFBUSxRQUFRLE1BQU07QUFDekMsaUJBQVEsT0FBNEIsUUFBUSxNQUFNLE1BQU07UUFDMUQ7UUFDQSxRQUFRLE1BQWtCLFFBQW1CO0FBQzNDLFVBQUFBLFFBQU8sSUFBSTtBQUNYLGNBQUksUUFBUSxLQUFLLFNBQVM7QUFDeEIsa0JBQU0sSUFBSSxNQUFNLHdEQUF3RCxJQUFJO0FBQzlFLHNCQUFZLE9BQU8sUUFBUSxRQUFRLE1BQU07QUFDekMsaUJBQVEsT0FBNEIsUUFBUSxNQUFNLE1BQU07UUFDMUQ7O0FBR0YsYUFBTztJQUNUO0FBRUEsV0FBTyxPQUFPLGVBQWUsTUFBTTtBQUNuQyxXQUFPO0VBQ1Q7QUFlTSxXQUFVLFVBQ2QsZ0JBQ0EsS0FDQSxjQUFjLE1BQUk7QUFFbEIsUUFBSSxRQUFRO0FBQVcsYUFBTyxJQUFJLFdBQVcsY0FBYztBQUMzRCxRQUFJLElBQUksV0FBVztBQUNqQixZQUFNLElBQUksTUFDUiw0Q0FBNEMsaUJBQWlCLFlBQVksSUFBSSxNQUFNO0FBRXZGLFFBQUksZUFBZSxDQUFDLFlBQVksR0FBRztBQUFHLFlBQU0sSUFBSSxNQUFNLGlDQUFpQztBQUN2RixXQUFPO0VBQ1Q7QUFFTSxXQUFVLFdBQVcsWUFBb0IsV0FBbUJDLE9BQWE7QUFDN0UsSUFBQUMsT0FBTUQsS0FBSTtBQUNWLFVBQU1FLE9BQU0sSUFBSSxXQUFXLEVBQUU7QUFDN0IsVUFBTSxPQUFPQyxZQUFXRCxJQUFHO0FBQzNCLFNBQUssYUFBYSxHQUFHLE9BQU8sU0FBUyxHQUFHRixLQUFJO0FBQzVDLFNBQUssYUFBYSxHQUFHLE9BQU8sVUFBVSxHQUFHQSxLQUFJO0FBQzdDLFdBQU9FO0VBQ1Q7QUFHTSxXQUFVLFlBQVksT0FBaUI7QUFDM0MsV0FBTyxNQUFNLGFBQWEsTUFBTTtFQUNsQztBQUdNLFdBQVVFLFdBQVUsT0FBaUI7QUFDekMsV0FBTyxXQUFXLEtBQUssS0FBSztFQUM5Qjs7O0FEbFdBLE1BQU0sWUFBWSxDQUFDLFFBQWdCLFdBQVcsS0FBSyxJQUFJLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3hGLE1BQU0sVUFBVSxVQUFVLGtCQUFrQjtBQUM1QyxNQUFNLFVBQVUsVUFBVSxrQkFBa0I7QUFDNUMsTUFBTSxhQUFhQyxLQUFJLE9BQU87QUFDOUIsTUFBTSxhQUFhQSxLQUFJLE9BQU87QUFHeEIsV0FBVUMsTUFBSyxHQUFXLEdBQVM7QUFDdkMsV0FBUSxLQUFLLElBQU0sTUFBTyxLQUFLO0VBQ2pDO0FBa0NBLFdBQVNDLGFBQVksR0FBYTtBQUNoQyxXQUFPLEVBQUUsYUFBYSxNQUFNO0VBQzlCO0FBR0EsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sY0FBYztBQUlwQixNQUFNLGNBQWMsS0FBSyxLQUFLO0FBRTlCLE1BQU0sWUFBWSxZQUFZLEdBQUU7QUFDaEMsV0FBUyxVQUNQLE1BQ0EsT0FDQSxLQUNBLE9BQ0EsTUFDQSxRQUNBLFNBQ0EsUUFBYztBQUVkLFVBQU0sTUFBTSxLQUFLO0FBQ2pCLFVBQU0sUUFBUSxJQUFJLFdBQVcsU0FBUztBQUN0QyxVQUFNLE1BQU1GLEtBQUksS0FBSztBQUVyQixVQUFNLFlBQVlFLGFBQVksSUFBSSxLQUFLQSxhQUFZLE1BQU07QUFDekQsVUFBTSxNQUFNLFlBQVlGLEtBQUksSUFBSSxJQUFJO0FBQ3BDLFVBQU0sTUFBTSxZQUFZQSxLQUFJLE1BQU0sSUFBSTtBQUN0QyxhQUFTLE1BQU0sR0FBRyxNQUFNLEtBQUssV0FBVztBQUN0QyxXQUFLLE9BQU8sS0FBSyxPQUFPLEtBQUssU0FBUyxNQUFNO0FBQzVDLFVBQUksV0FBVztBQUFhLGNBQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUNuRSxZQUFNLE9BQU8sS0FBSyxJQUFJLFdBQVcsTUFBTSxHQUFHO0FBRTFDLFVBQUksYUFBYSxTQUFTLFdBQVc7QUFDbkMsY0FBTSxRQUFRLE1BQU07QUFDcEIsWUFBSSxNQUFNLE1BQU07QUFBRyxnQkFBTSxJQUFJLE1BQU0sNkJBQTZCO0FBQ2hFLGlCQUFTLElBQUksR0FBRyxNQUFjLElBQUksYUFBYSxLQUFLO0FBQ2xELGlCQUFPLFFBQVE7QUFDZixjQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUM7UUFDL0I7QUFDQSxlQUFPO0FBQ1A7TUFDRjtBQUNBLGVBQVMsSUFBSSxHQUFHLE1BQU0sSUFBSSxNQUFNLEtBQUs7QUFDbkMsZUFBTyxNQUFNO0FBQ2IsZUFBTyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDO01BQ3JDO0FBQ0EsYUFBTztJQUNUO0VBQ0Y7QUFHTSxXQUFVLGFBQWEsTUFBb0IsTUFBZ0I7QUFDL0QsVUFBTSxFQUFFLGdCQUFnQixlQUFlLGVBQWUsY0FBYyxPQUFNLElBQUtHLFdBQzdFLEVBQUUsZ0JBQWdCLE9BQU8sZUFBZSxHQUFHLGNBQWMsT0FBTyxRQUFRLEdBQUUsR0FDMUUsSUFBSTtBQUVOLFFBQUksT0FBTyxTQUFTO0FBQVksWUFBTSxJQUFJLE1BQU0seUJBQXlCO0FBQ3pFLElBQUFDLFNBQVEsYUFBYTtBQUNyQixJQUFBQSxTQUFRLE1BQU07QUFDZCxJQUFBQyxPQUFNLFlBQVk7QUFDbEIsSUFBQUEsT0FBTSxjQUFjO0FBQ3BCLFdBQU8sQ0FDTCxLQUNBLE9BQ0EsTUFDQSxRQUNBLFVBQVUsTUFDSTtBQUNkLE1BQUFDLFFBQU8sS0FBSyxRQUFXLEtBQUs7QUFDNUIsTUFBQUEsUUFBTyxPQUFPLFFBQVcsT0FBTztBQUNoQyxNQUFBQSxRQUFPLE1BQU0sUUFBVyxNQUFNO0FBQzlCLFlBQU0sTUFBTSxLQUFLO0FBQ2pCLFVBQUksV0FBVztBQUFXLGlCQUFTLElBQUksV0FBVyxHQUFHO0FBQ3JELE1BQUFBLFFBQU8sUUFBUSxRQUFXLFFBQVE7QUFDbEMsTUFBQUYsU0FBUSxPQUFPO0FBQ2YsVUFBSSxVQUFVLEtBQUssV0FBVztBQUFhLGNBQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUNsRixVQUFJLE9BQU8sU0FBUztBQUNsQixjQUFNLElBQUksTUFBTSxnQkFBZ0IsT0FBTyxNQUFNLDJCQUEyQixHQUFHLEdBQUc7QUFDaEYsWUFBTSxVQUFVLENBQUE7QUFLaEIsVUFBSSxJQUFJLElBQUk7QUFDWixVQUFJO0FBQ0osVUFBSTtBQUNKLFVBQUksTUFBTSxJQUFJO0FBQ1osZ0JBQVEsS0FBTSxJQUFJRyxXQUFVLEdBQUcsQ0FBRTtBQUNqQyxnQkFBUTtNQUNWLFdBQVcsTUFBTSxNQUFNLGdCQUFnQjtBQUNyQyxZQUFJLElBQUksV0FBVyxFQUFFO0FBQ3JCLFVBQUUsSUFBSSxHQUFHO0FBQ1QsVUFBRSxJQUFJLEtBQUssRUFBRTtBQUNiLGdCQUFRO0FBQ1IsZ0JBQVEsS0FBSyxDQUFDO01BQ2hCLE9BQU87QUFDTCxRQUFBRCxRQUFPLEtBQUssSUFBSSxTQUFTO0FBQ3pCLGNBQU0sSUFBSSxNQUFNLGtCQUFrQjtNQUVwQztBQVNBLFVBQUksQ0FBQ0osYUFBWSxLQUFLO0FBQUcsZ0JBQVEsS0FBTSxRQUFRSyxXQUFVLEtBQUssQ0FBRTtBQUVoRSxZQUFNLE1BQU1QLEtBQUksQ0FBQztBQUVqQixVQUFJLGVBQWU7QUFDakIsWUFBSSxNQUFNLFdBQVc7QUFBSSxnQkFBTSxJQUFJLE1BQU0sc0NBQXNDO0FBQy9FLHNCQUFjLE9BQU8sS0FBS0EsS0FBSSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHO0FBQ3pELGdCQUFRLE1BQU0sU0FBUyxFQUFFO01BQzNCO0FBR0EsWUFBTSxhQUFhLEtBQUs7QUFDeEIsVUFBSSxlQUFlLE1BQU07QUFDdkIsY0FBTSxJQUFJLE1BQU0sc0JBQXNCLFVBQVUsY0FBYztBQUdoRSxVQUFJLGVBQWUsSUFBSTtBQUNyQixjQUFNLEtBQUssSUFBSSxXQUFXLEVBQUU7QUFDNUIsV0FBRyxJQUFJLE9BQU8sZUFBZSxJQUFJLEtBQUssTUFBTSxNQUFNO0FBQ2xELGdCQUFRO0FBQ1IsZ0JBQVEsS0FBSyxLQUFLO01BQ3BCO0FBQ0EsWUFBTSxNQUFNQSxLQUFJLEtBQUs7QUFDckIsZ0JBQVUsTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLFFBQVEsU0FBUyxNQUFNO0FBQzlELE1BQUFRLE9BQU0sR0FBRyxPQUFPO0FBQ2hCLGFBQU87SUFDVDtFQUNGOzs7QUV6T0E7QUEwQkEsV0FBUyxPQUFPLEdBQWUsR0FBUztBQUN0QyxXQUFRLEVBQUUsR0FBRyxJQUFJLE9BQVUsRUFBRSxHQUFHLElBQUksUUFBUztFQUMvQztBQStDTSxNQUFPLFdBQVAsTUFBZTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ2IsU0FBUyxJQUFJLFdBQVcsRUFBRTtJQUMxQixJQUFJLElBQUksWUFBWSxFQUFFOztJQUN0QixJQUFJLElBQUksWUFBWSxFQUFFO0lBQ3RCLE1BQU0sSUFBSSxZQUFZLENBQUM7SUFDdkIsTUFBTTtJQUNKLFdBQVc7O0lBR3JCLFlBQVksS0FBZTtBQUN6QixZQUFNQyxXQUFVQyxRQUFPLEtBQUssSUFBSSxLQUFLLENBQUM7QUFDdEMsWUFBTSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQ3hCLFlBQU0sS0FBSyxPQUFPLEtBQUssQ0FBQztBQUN4QixZQUFNLEtBQUssT0FBTyxLQUFLLENBQUM7QUFDeEIsWUFBTSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQ3hCLFlBQU0sS0FBSyxPQUFPLEtBQUssQ0FBQztBQUN4QixZQUFNLEtBQUssT0FBTyxLQUFLLEVBQUU7QUFDekIsWUFBTSxLQUFLLE9BQU8sS0FBSyxFQUFFO0FBQ3pCLFlBQU0sS0FBSyxPQUFPLEtBQUssRUFBRTtBQUd6QixXQUFLLEVBQUUsQ0FBQyxJQUFJLEtBQUs7QUFDakIsV0FBSyxFQUFFLENBQUMsS0FBTSxPQUFPLEtBQU8sTUFBTSxLQUFNO0FBQ3hDLFdBQUssRUFBRSxDQUFDLEtBQU0sT0FBTyxLQUFPLE1BQU0sS0FBTTtBQUN4QyxXQUFLLEVBQUUsQ0FBQyxLQUFNLE9BQU8sSUFBTSxNQUFNLEtBQU07QUFDdkMsV0FBSyxFQUFFLENBQUMsS0FBTSxPQUFPLElBQU0sTUFBTSxNQUFPO0FBQ3hDLFdBQUssRUFBRSxDQUFDLElBQUssT0FBTyxJQUFLO0FBQ3pCLFdBQUssRUFBRSxDQUFDLEtBQU0sT0FBTyxLQUFPLE1BQU0sS0FBTTtBQUN4QyxXQUFLLEVBQUUsQ0FBQyxLQUFNLE9BQU8sS0FBTyxNQUFNLEtBQU07QUFDeEMsV0FBSyxFQUFFLENBQUMsS0FBTSxPQUFPLElBQU0sTUFBTSxLQUFNO0FBQ3ZDLFdBQUssRUFBRSxDQUFDLElBQUssT0FBTyxJQUFLO0FBQ3pCLGVBQVMsSUFBSSxHQUFHLElBQUksR0FBRztBQUFLLGFBQUssSUFBSSxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDO0lBQ2xFO0lBRVEsUUFBUSxNQUFrQixRQUFnQixTQUFTLE9BQUs7QUFDOUQsWUFBTSxRQUFRLFNBQVMsSUFBSSxLQUFLO0FBQ2hDLFlBQU0sRUFBRSxHQUFHLEVBQUMsSUFBSztBQUNqQixZQUFNLEtBQUssRUFBRSxDQUFDO0FBQ2QsWUFBTSxLQUFLLEVBQUUsQ0FBQztBQUNkLFlBQU0sS0FBSyxFQUFFLENBQUM7QUFDZCxZQUFNLEtBQUssRUFBRSxDQUFDO0FBQ2QsWUFBTSxLQUFLLEVBQUUsQ0FBQztBQUNkLFlBQU0sS0FBSyxFQUFFLENBQUM7QUFDZCxZQUFNLEtBQUssRUFBRSxDQUFDO0FBQ2QsWUFBTSxLQUFLLEVBQUUsQ0FBQztBQUNkLFlBQU0sS0FBSyxFQUFFLENBQUM7QUFDZCxZQUFNLEtBQUssRUFBRSxDQUFDO0FBRWQsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbEMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbEMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbEMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbEMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbEMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLEVBQUU7QUFDbkMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLEVBQUU7QUFDbkMsWUFBTSxLQUFLLE9BQU8sTUFBTSxTQUFTLEVBQUU7QUFFbkMsVUFBSSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEtBQUs7QUFDdEIsVUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFPLE9BQU8sS0FBTyxNQUFNLEtBQU07QUFDN0MsVUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFPLE9BQU8sS0FBTyxNQUFNLEtBQU07QUFDN0MsVUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFPLE9BQU8sSUFBTSxNQUFNLEtBQU07QUFDNUMsVUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFPLE9BQU8sSUFBTSxNQUFNLE1BQU87QUFDN0MsVUFBSSxLQUFLLEVBQUUsQ0FBQyxLQUFNLE9BQU8sSUFBSztBQUM5QixVQUFJLEtBQUssRUFBRSxDQUFDLE1BQU8sT0FBTyxLQUFPLE1BQU0sS0FBTTtBQUM3QyxVQUFJLEtBQUssRUFBRSxDQUFDLE1BQU8sT0FBTyxLQUFPLE1BQU0sS0FBTTtBQUM3QyxVQUFJLEtBQUssRUFBRSxDQUFDLE1BQU8sT0FBTyxJQUFNLE1BQU0sS0FBTTtBQUM1QyxVQUFJLEtBQUssRUFBRSxDQUFDLEtBQU0sT0FBTyxJQUFLO0FBRTlCLFVBQUksSUFBSTtBQUVSLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUk7QUFDakYsVUFBSSxPQUFPO0FBQ1gsWUFBTTtBQUNOLFlBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJO0FBQ2hGLFdBQUssT0FBTztBQUNaLFlBQU07QUFFTixVQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sSUFBSSxNQUFNLE1BQU0sSUFBSSxNQUFNLE1BQU0sSUFBSTtBQUMzRSxVQUFJLE9BQU87QUFDWCxZQUFNO0FBQ04sWUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUk7QUFDaEYsV0FBSyxPQUFPO0FBQ1osWUFBTTtBQUVOLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sSUFBSSxNQUFNLE1BQU0sSUFBSTtBQUNyRSxVQUFJLE9BQU87QUFDWCxZQUFNO0FBQ04sWUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUk7QUFDaEYsV0FBSyxPQUFPO0FBQ1osWUFBTTtBQUVOLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUk7QUFDL0QsVUFBSSxPQUFPO0FBQ1gsWUFBTTtBQUNOLFlBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJO0FBQ2hGLFdBQUssT0FBTztBQUNaLFlBQU07QUFFTixVQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUMxRCxVQUFJLE9BQU87QUFDWCxZQUFNO0FBQ04sWUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUk7QUFDaEYsV0FBSyxPQUFPO0FBQ1osWUFBTTtBQUVOLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQzFELFVBQUksT0FBTztBQUNYLFlBQU07QUFDTixZQUFNLEtBQUssS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUk7QUFDMUUsV0FBSyxPQUFPO0FBQ1osWUFBTTtBQUVOLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQzFELFVBQUksT0FBTztBQUNYLFlBQU07QUFDTixZQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJO0FBQ3BFLFdBQUssT0FBTztBQUNaLFlBQU07QUFFTixVQUFJLEtBQUssSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUMxRCxVQUFJLE9BQU87QUFDWCxZQUFNO0FBQ04sWUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUk7QUFDOUQsV0FBSyxPQUFPO0FBQ1osWUFBTTtBQUVOLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQzFELFVBQUksT0FBTztBQUNYLFlBQU07QUFDTixZQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUk7QUFDeEQsV0FBSyxPQUFPO0FBQ1osWUFBTTtBQUVOLFVBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQzFELFVBQUksT0FBTztBQUNYLFlBQU07QUFDTixZQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25ELFdBQUssT0FBTztBQUNaLFlBQU07QUFFTixXQUFNLEtBQUssS0FBSyxJQUFLO0FBQ3JCLFVBQUssSUFBSSxLQUFNO0FBQ2YsV0FBSyxJQUFJO0FBQ1QsVUFBSSxNQUFNO0FBQ1YsWUFBTTtBQUVOLFFBQUUsQ0FBQyxJQUFJO0FBQ1AsUUFBRSxDQUFDLElBQUk7QUFDUCxRQUFFLENBQUMsSUFBSTtBQUNQLFFBQUUsQ0FBQyxJQUFJO0FBQ1AsUUFBRSxDQUFDLElBQUk7QUFDUCxRQUFFLENBQUMsSUFBSTtBQUNQLFFBQUUsQ0FBQyxJQUFJO0FBQ1AsUUFBRSxDQUFDLElBQUk7QUFDUCxRQUFFLENBQUMsSUFBSTtBQUNQLFFBQUUsQ0FBQyxJQUFJO0lBQ1Q7SUFFUSxXQUFRO0FBQ2QsWUFBTSxFQUFFLEdBQUcsS0FBQUMsS0FBRyxJQUFLO0FBQ25CLFlBQU0sSUFBSSxJQUFJLFlBQVksRUFBRTtBQUM1QixVQUFJLElBQUksRUFBRSxDQUFDLE1BQU07QUFDakIsUUFBRSxDQUFDLEtBQUs7QUFDUixlQUFTLElBQUksR0FBRyxJQUFJLElBQUksS0FBSztBQUMzQixVQUFFLENBQUMsS0FBSztBQUNSLFlBQUksRUFBRSxDQUFDLE1BQU07QUFDYixVQUFFLENBQUMsS0FBSztNQUNWO0FBQ0EsUUFBRSxDQUFDLEtBQUssSUFBSTtBQUNaLFVBQUksRUFBRSxDQUFDLE1BQU07QUFDYixRQUFFLENBQUMsS0FBSztBQUNSLFFBQUUsQ0FBQyxLQUFLO0FBQ1IsVUFBSSxFQUFFLENBQUMsTUFBTTtBQUNiLFFBQUUsQ0FBQyxLQUFLO0FBQ1IsUUFBRSxDQUFDLEtBQUs7QUFFUixRQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSTtBQUNkLFVBQUksRUFBRSxDQUFDLE1BQU07QUFDYixRQUFFLENBQUMsS0FBSztBQUNSLGVBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxLQUFLO0FBQzNCLFVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJO0FBQ2QsWUFBSSxFQUFFLENBQUMsTUFBTTtBQUNiLFVBQUUsQ0FBQyxLQUFLO01BQ1Y7QUFDQSxRQUFFLENBQUMsS0FBSyxLQUFLO0FBRWIsVUFBSSxRQUFRLElBQUksS0FBSztBQUNyQixlQUFTLElBQUksR0FBRyxJQUFJLElBQUk7QUFBSyxVQUFFLENBQUMsS0FBSztBQUNyQyxhQUFPLENBQUM7QUFDUixlQUFTLElBQUksR0FBRyxJQUFJLElBQUk7QUFBSyxVQUFFLENBQUMsSUFBSyxFQUFFLENBQUMsSUFBSSxPQUFRLEVBQUUsQ0FBQztBQUN2RCxRQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSyxFQUFFLENBQUMsS0FBSyxNQUFPO0FBQy9CLFFBQUUsQ0FBQyxLQUFNLEVBQUUsQ0FBQyxNQUFNLElBQU0sRUFBRSxDQUFDLEtBQUssTUFBTztBQUN2QyxRQUFFLENBQUMsS0FBTSxFQUFFLENBQUMsTUFBTSxJQUFNLEVBQUUsQ0FBQyxLQUFLLEtBQU07QUFDdEMsUUFBRSxDQUFDLEtBQU0sRUFBRSxDQUFDLE1BQU0sSUFBTSxFQUFFLENBQUMsS0FBSyxLQUFNO0FBQ3RDLFFBQUUsQ0FBQyxLQUFNLEVBQUUsQ0FBQyxNQUFN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LFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUU5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUM5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFFOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFDOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBRTlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUU5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUM5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFFOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFDOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBRTlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztJQUNoRDtBQUVBLFFBQUksS0FBSztBQUNULFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUFHLFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUN2RCxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFBRyxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFDdkQsUUFBSSxJQUFJLElBQUssTUFBTSxNQUFPO0FBQUcsUUFBSSxJQUFJLElBQUssTUFBTSxNQUFPO0FBQ3ZELFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUFHLFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUN2RCxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFBRyxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFDdkQsUUFBSSxJQUFJLElBQUssTUFBTSxNQUFPO0FBQUcsUUFBSSxJQUFJLElBQUssTUFBTSxNQUFPO0FBQ3ZELFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUFHLFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUN2RCxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFBRyxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87RUFDekQ7QUFPTSxXQUFVLFFBQ2QsR0FBZ0IsR0FBZ0IsR0FBZ0IsS0FBZ0I7QUFFaEUsUUFBSSxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUM3QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUM3QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUM3QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUNqRCxhQUFTLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHO0FBQzlCLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUU5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUM5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFFOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFDOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBRTlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBQzlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUU5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLEVBQUU7QUFDL0MsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssQ0FBQztBQUM5QyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFFOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxFQUFFO0FBQy9DLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFBRTtBQUMvQyxZQUFPLE1BQU0sTUFBTztBQUFHLFlBQU1BLE1BQUssTUFBTSxLQUFLLENBQUM7QUFDOUMsWUFBTyxNQUFNLE1BQU87QUFBRyxZQUFNQSxNQUFLLE1BQU0sS0FBSyxDQUFDO0FBRTlDLFlBQU8sTUFBTSxNQUFPO0FBQUcsWUFBTUEsTUFBSyxNQUFNLEtBQUssRUFB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QUFJLENBQUM7QUFDN0QsYUFBTyxLQUFLLE1BQU0sTUFBTSxHQUFHLEVBQUU7QUFBRyxhQUFPLEtBQUssTUFBTSxNQUFNLEdBQUcsRUFBRTtBQUM3RCxhQUFPLEtBQUssTUFBTSxNQUFNLEdBQUksQ0FBQztBQUFHLGFBQU8sS0FBSyxNQUFNLE1BQU0sR0FBSSxDQUFDO0FBQzdELGFBQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0FBQUcsYUFBTyxLQUFLLE1BQU0sTUFBTSxHQUFHLEVBQUU7QUFDN0QsYUFBTyxLQUFLLE1BQU0sTUFBTSxHQUFJLENBQUM7QUFBRyxhQUFPLEtBQUssTUFBTSxNQUFNLEdBQUksQ0FBQztBQUM3RCxhQUFPLEtBQUssTUFBTSxNQUFNLEdBQUcsRUFBRTtBQUFHLGFBQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0FBQzdELGFBQU8sS0FBSyxNQUFNLE1BQU0sR0FBSSxDQUFDO0FBQUcsYUFBTyxLQUFLLE1BQU0sTUFBTSxHQUFJLENBQUM7QUFDN0QsYUFBTyxLQUFLLE1BQU0sTUFBTSxHQUFHLEVBQUU7QUFBRyxhQUFPLEtBQUssTUFBTSxNQUFNLEdBQUcsRUFBRTtBQUM3RCxhQUFPLEtBQUssTUFBTSxNQUFNLEdBQUksQ0FBQztBQUFHLGFBQU8sS0FBSyxNQUFNLE1BQU0sR0FBSSxDQUFDO0FBQzdELGFBQU8sS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFO0FBQUcsYUFBTyxLQUFLLE1BQU0sTUFBTSxHQUFHLEVBQUU7SUFDL0Q7QUFFQSxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFBRyxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFDdkQsUUFBSSxJQUFJLElBQUssTUFBTSxNQUFPO0FBQUcsUUFBSSxJQUFJLElBQUssTUFBTSxNQUFPO0FBQ3ZELFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUFHLFFBQUksSUFBSSxJQUFLLE1BQU0sTUFBTztBQUN2RCxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFBRyxRQUFJLElBQUksSUFBSyxNQUFNLE1BQU87QUFD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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QSxNQUMxQixTQUFTLEdBQUc7QUFBQSxNQUVaO0FBQUEsSUFDSixDQUFDO0FBRUQsVUFBTSxRQUFRLFdBQVcsZUFBZTtBQUV4QyxRQUFJLFlBQVksV0FBVyxHQUFHO0FBQzFCLFlBQU0sSUFBSSxNQUFNLGdDQUFnQztBQUFBLElBQ3BEO0FBRUEsUUFBSTtBQUNBLFlBQU0sU0FBUyxXQUFXO0FBQUEsSUFDOUIsVUFBRTtBQUNFLGlCQUFXLFNBQVMsYUFBYTtBQUM3QixjQUFNLE1BQU07QUFBQSxNQUNoQjtBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJwaW5vIiwgImxvZ2dlciIsICJ0cmFuc21pdCIsICJsZXZlbCIsICJzZXRPcHRzIiwgInNlbGYiLCAicGFkIiwgImRlY29kZSIsICJsZW4iLCAiaSIsICJudW0iLCAibGVuMiIsICJpc0xFIiwgImJhc2U2NCIsICJCdWZmZXIiLCAidXRmOFRvQnl0ZXMiLCAiYmFzZTY0VG9CeXRlcyIsICJpIiwgImFzY2lpVG9CeXRlcyIsICJieXRlTGVuZ3RoIiwgImFscGhhYmV0IiwgIk5vc3RyRXZlbnRLaW5kIiwgIk5vc3RyTWVzc2FnZVR5cGUiLCAiTmlwNDZNZXRob2QiLCAiTm9zdHJFdmVudEtpbmQiLCAicGFkIiwgImlzTEUiLCAibnVtIiwgIl8wbiIsICJfMW4iLCAiXzBuIiwgIl8xbiIsICJnY2QiLCAibnVtIiwgIl8wbiIsICJfMW4iLCAiXzFuIiwgIl8wbiIsICJfMW4iLCAibnVtIiwgImlzTEUiLCAiaXNMRSIsICJudW0iLCAiXzFuIiwgIl8wbiIsICJfMW4iLCAid2luZG93IiwgIl8wbiIsICJfMW4iLCAid2luZG93IiwgImlzTEUiLCAiXzBuIiwgImdldFB1YmxpY0tleSIsICJwYWQiLCAibnVtIiwgIl8ybiIsICJfMG4iLCAiXzFuIiwgIl8zbiIsICJfNG4iLCAicG9pbnRUb0J5dGVzIiwgImVuZG8iLCAibnVtIiwgImdldFB1YmxpY0tleSIsICJ1dGlscyIsICJyYW5kb21CeXRlcyIsICJobWFjIiwgIl8ybiIsICJfMW4iLCAiciIsICJzIiwgIl8wbiIsICJfMG4iLCAiXzJuIiwgIl8zbiIsICJMb2dMZXZlbCIsICJwaW5vIiwgImJhc2U2NCIsICJiYXNlNjQiLCAiY3J5cHRvIiwgImdldENyeXB0byIsICJjcnlwdG8iLCAiaXNCeXRlcyIsICJhYm9vbCIsICJhbnVtYmVyIiwgImFieXRlcyIsICJhZXhpc3RzIiwgImFvdXRwdXQiLCAidTMyIiwgImNsZWFuIiwgImNyZWF0ZVZpZXciLCAiaXNMRSIsICJjaGVja09wdHMiLCAiYWJ5dGVzIiwgImlzTEUiLCAiYWJvb2wiLCAibnVtIiwgImNyZWF0ZVZpZXciLCAiY29weUJ5dGVzIiwgInUzMiIsICJyb3RsIiwgImlzQWxpZ25lZDMyIiwgImNoZWNrT3B0cyIsICJhbnVtYmVyIiwgImFib29sIiwgImFieXRlcyIsICJjb3B5Qnl0ZXMiLCAiY2xlYW4iLCAiY29weUJ5dGVzIiwgImFieXRlcyIsICJwYWQiLCAiY2xlYW4iLCAiYWV4aXN0cyIsICJhb3V0cHV0IiwgInJvdGwiLCAiYWJ5dGVzIiwgImNsZWFuIiwgImlzQnl0ZXMiLCAiYWJ5dGVzIiwgImFudW1iZXIiLCAid3JhcCIsICJkZWNvZGUiLCAiYW51bWJlciIsICJwYWRkaW5nIiwgIm51bSIsICJpc0J5dGVzIiwgImFscGhhYmV0IiwgImFieXRlcyIsICJpc0J5dGVzIiwgImRlY29kZSIsICJiZWNoMzIiLCAiZW5jcnlwdCIsICJiZWNoMzIiLCAiZGVjcnlwdCIsICJoZXhUb0J5dGVzIiwgImJ5dGVzVG9IZXgiLCAid29yZGxpc3QiLCAid29yZGxpc3QiLCAiaGV4VG9CeXRlcyIsICJieXRlc1RvSGV4IiwgImdlbmVyYXRlS2V5UGFpciIsICJiYXNlNjQiLCAiZW5jcnlwdCIsICJkZWNyeXB0IiwgImRlY3J5cHQiLCAiZW5jcnlwdCIsICJjb21wbGV0ZSIsICJ0YXJnZXQiLCAic3RvcmFnZSIsICJzdG9yYWdlIiwgImdlbmVyYXRlS2V5UGFpciIsICJoZXhUb0J5dGVzIiwgImJ5dGVzVG9IZXgiLCAic2Vzc2lvbiIsICJsb2ciLCAiZ2V0UHJpdktleSIsICJieXRlc1RvSGV4IiwgInN0b3JhZ2UiLCAibG9nIiwgImJ5dGVzVG9IZXgiLCAiZGVjcnlwdCIsICJlbmNyeXB0IiwgImhleFRvQnl0ZXMiLCAiZ2VuZXJhdGVLZXlQYWlyIl0KfQo= diff --git a/distros/safari/background.js b/distros/safari/background.js index f62e006..351a0e4 100644 --- a/distros/safari/background.js +++ b/distros/safari/background.js @@ -128,6 +128,21 @@ const permissionRateMap = new Map(); // host → { count, resetAt } await storage.set({ isEncrypted: true }); data.isEncrypted = true; } + // Lockout recovery: if isEncrypted=true but there is NO password verifier AND + // no actually-encrypted key blobs, encryption is bogus (e.g. a stale flag + // received from an older buggy sync). Clearing it prevents a permanent lockout + // where the user can never unlock because checkPassword() always fails. + // We ONLY clear when no encrypted blobs exist — never when real ciphertext is + // present (that would corrupt encrypted keys into "plaintext"). + if (data.isEncrypted && !data.passwordHash) { + const { profiles = [] } = await storage.get({ profiles: [] }); + const hasEncryptedBlob = profiles.some(p => isEncryptedBlob(p.privKey)); + if (!hasEncryptedBlob) { + log('[STARTUP] Lockout recovery: isEncrypted=true with no passwordHash and no encrypted blobs → clearing bogus encryption flag'); + await storage.set({ isEncrypted: false }); + data.isEncrypted = false; + } + } encryptionEnabled = data.isEncrypted; nostrAccessWhileLocked = !!data.nostrAccessWhileLocked; blockCrossOriginFrames = data.blockCrossOriginFrames !== false; @@ -419,7 +434,20 @@ api.runtime.onMessage.addListener((message, _sender, sendResponse) => { return true; // Keep message channel open for async sendResponse case 'savePrivateKey': resetAutoLock(); - return savePrivateKey(message.payload); + // Must use sendResponse + return true (not a Promise return): Chrome MV3 + // does not deliver Promise-return values to sendMessage callers, so the + // caller could not tell whether the key was actually saved (or whether it + // threw). That made imported keys silently fail while the UI showed success. + (async () => { + try { + await savePrivateKey(message.payload); + sendResponse({ success: true }); + } catch (e) { + console.error('savePrivateKey error:', e); + sendResponse({ success: false, error: e.message || 'Failed to save key' }); + } + })(); + return true; case 'getNpub': (async () => { try { @@ -1118,8 +1146,13 @@ api.runtime.onMessage.addListener((message, _sender, sendResponse) => { // --- Encrypted vault backup / restore --- case 'backup.export': reply(sendResponse, async () => { - if (!sessionCryptoKey) { - return { success: false, error: 'Extension must be unlocked to create a backup' }; + // Backups are encrypted with a dedicated backup password supplied at + // export time — NOT the in-memory session key. This lets users with no + // master password create backups, and works even while locked (the + // stored key blobs stay encrypted and get wrapped again here). + const password = message.payload?.password; + if (typeof password !== 'string' || password.length < 8) { + return { success: false, error: 'A backup password of at least 8 characters is required' }; } const data = await storage.get({ profiles: [], @@ -1135,7 +1168,7 @@ api.runtime.onMessage.addListener((message, _sender, sendResponse) => { version: null, }); const plaintext = JSON.stringify(data); - const encrypted = await encryptWithKey(plaintext, sessionCryptoKey, sessionKeySalt); + const encrypted = await encryptBlob(plaintext, password); const version = api.runtime.getManifest?.()?.version || 'unknown'; return { success: true, diff --git a/distros/safari/content.build.js b/distros/safari/content.build.js index 1a2824e..313a376 100644 --- a/distros/safari/content.build.js +++ b/distros/safari/content.build.js @@ -1,4 +1,233 @@ -(()=>{var t=typeof browser<"u"?browser:typeof chrome<"u"?chrome:null;if(!t)throw new Error("browser-polyfill: No extension API namespace found (neither browser nor chrome).");var r=typeof browser>"u"&&typeof chrome<"u";function s(e,n){return(...o)=>{try{let i=n.apply(e,o);if(i&&typeof i.then=="function")return i}catch{}return new Promise((i,c)=>{n.apply(e,[...o,(...u)=>{t.runtime&&t.runtime.lastError?c(new Error(t.runtime.lastError.message)):i(u.length<=1?u[0]:u)}])})}}var a={};a.runtime={sendMessage(...e){return r?s(t.runtime,t.runtime.sendMessage)(...e):t.runtime.sendMessage(...e)},onMessage:t.runtime.onMessage,getURL(e){return t.runtime.getURL(e)},openOptionsPage(){return r?s(t.runtime,t.runtime.openOptionsPage)():t.runtime.openOptionsPage()},get id(){return t.runtime.id}};a.storage={local:{get(...e){return r?s(t.storage.local,t.storage.local.get)(...e):t.storage.local.get(...e)},set(...e){return r?s(t.storage.local,t.storage.local.set)(...e):t.storage.local.set(...e)},clear(...e){return r?s(t.storage.local,t.storage.local.clear)(...e):t.storage.local.clear(...e)},remove(...e){return r?s(t.storage.local,t.storage.local.remove)(...e):t.storage.local.remove(...e)}},sync:t.storage?.sync?{get(...e){return r?s(t.storage.sync,t.storage.sync.get)(...e):t.storage.sync.get(...e)},set(...e){return r?s(t.storage.sync,t.storage.sync.set)(...e):t.storage.sync.set(...e)},remove(...e){return r?s(t.storage.sync,t.storage.sync.remove)(...e):t.storage.sync.remove(...e)},clear(...e){return r?s(t.storage.sync,t.storage.sync.clear)(...e):t.storage.sync.clear(...e)},getBytesInUse(...e){return t.storage.sync.getBytesInUse?r?s(t.storage.sync,t.storage.sync.getBytesInUse)(...e):t.storage.sync.getBytesInUse(...e):Promise.resolve(0)}}:null,onChanged:t.storage?.onChanged||null};a.tabs={create(...e){return r?s(t.tabs,t.tabs.create)(...e):t.tabs.create(...e)},query(...e){return r?s(t.tabs,t.tabs.query)(...e):t.tabs.query(...e)},remove(...e){return r?s(t.tabs,t.tabs.remove)(...e):t.tabs.remove(...e)},update(...e){return r?s(t.tabs,t.tabs.update)(...e):t.tabs.update(...e)},get(...e){return r?s(t.tabs,t.tabs.get)(...e):t.tabs.get(...e)},getCurrent(...e){return r?s(t.tabs,t.tabs.getCurrent)(...e):t.tabs.getCurrent(...e)},sendMessage(...e){return r?s(t.tabs,t.tabs.sendMessage)(...e):t.tabs.sendMessage(...e)}};a.alarms=t.alarms?{create(...e){let n=t.alarms.create(...e);return n&&typeof n.then=="function"?n:Promise.resolve()},clear(...e){return r?s(t.alarms,t.alarms.clear)(...e):t.alarms.clear(...e)},onAlarm:t.alarms.onAlarm}:null;async function b(){if(window===window.top)return!0;try{if(!(await a.storage.local.get({blockCrossOriginFrames:!0})).blockCrossOriginFrames)return!0}catch{return!1}try{return window.top.location.href,!0}catch{return!1}}b().then(e=>{if(!e)return;let n=document.createElement("script");n.setAttribute("src",a.runtime.getURL("nostr.build.js")),document.body.appendChild(n),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&a.runtime.sendMessage({kind:"resetAutoLock"}).catch(()=>{})})});var d=null,m=null;function g(){if(d)return;let e=document.createElement("div");e.id="nostrkey-permission-sheet",e.innerHTML=` +(() => { + // src/utilities/browser-polyfill.js + var _browser = typeof browser !== "undefined" ? browser : typeof chrome !== "undefined" ? chrome : null; + if (!_browser) { + throw new Error("browser-polyfill: No extension API namespace found (neither browser nor chrome)."); + } + var isChrome = typeof browser === "undefined" && typeof chrome !== "undefined"; + function promisify(context, method) { + return (...args) => { + try { + const result = method.apply(context, args); + if (result && typeof result.then === "function") { + return result; + } + } catch (_) { + } + return new Promise((resolve, reject) => { + method.apply(context, [ + ...args, + (...cbArgs) => { + if (_browser.runtime && _browser.runtime.lastError) { + reject(new Error(_browser.runtime.lastError.message)); + } else { + resolve(cbArgs.length <= 1 ? cbArgs[0] : cbArgs); + } + } + ]); + }); + }; + } + var api = {}; + api.runtime = { + /** + * sendMessage – always returns a Promise. + */ + sendMessage(...args) { + if (!isChrome) { + return _browser.runtime.sendMessage(...args); + } + return promisify(_browser.runtime, _browser.runtime.sendMessage)(...args); + }, + /** + * onMessage – thin wrapper so callers use a consistent reference. + * The listener signature is (message, sender, sendResponse). + * On Chrome the listener can return `true` to keep the channel open, + * or return a Promise (MV3). Safari / Firefox expect a Promise return. + */ + onMessage: _browser.runtime.onMessage, + /** + * getURL – synchronous on all browsers. + */ + getURL(path) { + return _browser.runtime.getURL(path); + }, + /** + * openOptionsPage + */ + openOptionsPage() { + if (!isChrome) { + return _browser.runtime.openOptionsPage(); + } + return promisify(_browser.runtime, _browser.runtime.openOptionsPage)(); + }, + /** + * Expose the id for convenience. + */ + get id() { + return _browser.runtime.id; + } + }; + api.storage = { + local: { + get(...args) { + if (!isChrome) { + return _browser.storage.local.get(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.get)(...args); + }, + set(...args) { + if (!isChrome) { + return _browser.storage.local.set(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.set)(...args); + }, + clear(...args) { + if (!isChrome) { + return _browser.storage.local.clear(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.clear)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.storage.local.remove(...args); + } + return promisify(_browser.storage.local, _browser.storage.local.remove)(...args); + } + }, + // --- storage.sync ---------------------------------------------------------- + // Null when the browser doesn't support sync (older Safari, etc.) + sync: _browser.storage?.sync ? { + get(...args) { + if (!isChrome) { + return _browser.storage.sync.get(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.get)(...args); + }, + set(...args) { + if (!isChrome) { + return _browser.storage.sync.set(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.set)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.storage.sync.remove(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.remove)(...args); + }, + clear(...args) { + if (!isChrome) { + return _browser.storage.sync.clear(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.clear)(...args); + }, + getBytesInUse(...args) { + if (!_browser.storage.sync.getBytesInUse) { + return Promise.resolve(0); + } + if (!isChrome) { + return _browser.storage.sync.getBytesInUse(...args); + } + return promisify(_browser.storage.sync, _browser.storage.sync.getBytesInUse)(...args); + } + } : null, + // --- storage.onChanged ----------------------------------------------------- + onChanged: _browser.storage?.onChanged || null + }; + api.tabs = { + create(...args) { + if (!isChrome) { + return _browser.tabs.create(...args); + } + return promisify(_browser.tabs, _browser.tabs.create)(...args); + }, + query(...args) { + if (!isChrome) { + return _browser.tabs.query(...args); + } + return promisify(_browser.tabs, _browser.tabs.query)(...args); + }, + remove(...args) { + if (!isChrome) { + return _browser.tabs.remove(...args); + } + return promisify(_browser.tabs, _browser.tabs.remove)(...args); + }, + update(...args) { + if (!isChrome) { + return _browser.tabs.update(...args); + } + return promisify(_browser.tabs, _browser.tabs.update)(...args); + }, + get(...args) { + if (!isChrome) { + return _browser.tabs.get(...args); + } + return promisify(_browser.tabs, _browser.tabs.get)(...args); + }, + getCurrent(...args) { + if (!isChrome) { + return _browser.tabs.getCurrent(...args); + } + return promisify(_browser.tabs, _browser.tabs.getCurrent)(...args); + }, + sendMessage(...args) { + if (!isChrome) { + return _browser.tabs.sendMessage(...args); + } + return promisify(_browser.tabs, _browser.tabs.sendMessage)(...args); + } + }; + api.alarms = _browser.alarms ? { + create(...args) { + const result = _browser.alarms.create(...args); + return result && typeof result.then === "function" ? result : Promise.resolve(); + }, + clear(...args) { + if (!isChrome) { + return _browser.alarms.clear(...args); + } + return promisify(_browser.alarms, _browser.alarms.clear)(...args); + }, + onAlarm: _browser.alarms.onAlarm + } : null; + + // src/content.js + async function shouldInject() { + if (window === window.top) return true; + try { + const data = await api.storage.local.get({ blockCrossOriginFrames: true }); + if (!data.blockCrossOriginFrames) return true; + } catch { + return false; + } + try { + void window.top.location.href; + return true; + } catch { + return false; + } + } + shouldInject().then((inject) => { + if (!inject) return; + let script = document.createElement("script"); + script.setAttribute("src", api.runtime.getURL("nostr.build.js")); + document.body.appendChild(script); + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "visible") { + api.runtime.sendMessage({ kind: "resetAutoLock" }).catch(() => { + }); + } + }); + }); + var permissionSheet = null; + var permissionResolve = null; + function createPermissionSheet() { + if (permissionSheet) return; + const sheet = document.createElement("div"); + sheet.id = "nostrkey-permission-sheet"; + sheet.innerHTML = `