# booking/11.9/_dist/bfb/_out/wpbc_bfb.js

Booking Calendar, version 11.9. 1,413 lines.

- Page: https://pluginprobe.com/plugins/booking/11.9/code/_dist/bfb/_out/wpbc_bfb.js
- Raw: https://pluginprobe.com/plugins/booking/11.9/raw/_dist/bfb/_out/wpbc_bfb.js
- Modified: 2026-10-03T20:32:36+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/booking/11.9/code/_dist/bfb/_out/wpbc_bfb.js#L10-L20`.

```javascript
"use strict";// ---------------------------------------------------------------------------------------------------------------------
// == File  /includes/page-form-builder/_out/core/bfb-core.js == | 2025-09-10 15:47
// ---------------------------------------------------------------------------------------------------------------------
(function(w){'use strict';// Single global namespace (idempotent & load-order safe).
const Core=w.WPBC_BFB_Core=w.WPBC_BFB_Core||{};const UI=Core.UI=Core.UI||{};/**
	 * Core sanitize/escape/normalize helpers.
	 * All methods use snake_case; camelCase aliases are provided for backwards compatibility.
	 */Core.WPBC_BFB_Sanitize=class{/**
		 * Escape text for safe use in CSS selectors.
		 * @param {string} s - raw selector fragment
		 * @returns {string}
		 */static esc_css(s){return w.CSS&&w.CSS.escape?w.CSS.escape(String(s)):String(s).replace(/([^\w-])/g,'\\$1');}/**
		 * Escape a value for attribute selectors, e.g. [data-id="<value>"].
		 * @param {string} v
		 * @returns {string}
		 */static esc_attr_value_for_selector(v){return String(v).replace(/\\/g,'\\\\').replace(/"/g,'\\"').replace(/\n/g,'\\A ').replace(/\]/g,'\\]');}/**
		 * Sanitize into a broadly compatible HTML id: letters, digits, - _ : . ; must start with a letter.
		 * @param {string} v
		 * @returns {string}
		 */static sanitize_html_id(v){let s=(v==null?'':String(v)).trim();s=s.replace(/\s+/g,'-').replace(/[^A-Za-z0-9\-_\:.]/g,'-').replace(/-+/g,'-').replace(/^[-_.:]+|[-_.:]+$/g,'');if(!s)return'field';if(!/^[A-Za-z]/.test(s))s='f-'+s;return s;}/**
		 * Sanitize into a safe HTML name token: letters, digits, _ -
		 * Must start with a letter; no dots/brackets/spaces.
		 * @param {string} v
		 * @returns {string}
		 */static sanitize_html_name(v){let s=(v==null?'':String(v)).trim();s=s.replace(/\s+/g,'_').replace(/[^A-Za-z0-9_-]/g,'_').replace(/_+/g,'_');if(!s){s='field';}if(!/^[A-Za-z]/.test(s)){s='f_'+s;}return s;}/**
		 * Escape for HTML text/attributes (not URLs).
		 * @param {any} v
		 * @returns {string}
		 */static escape_html(v){if(v==null){return'';}return String(v).replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/'/g,'&#039;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}/**
		 * Escape minimal set for attribute-safety without slugging.
		 * Keeps original human text; escapes &, <, >, " and ' only.
		 * @param {string} s
		 * @returns {string}
		 */static escape_value_for_attr(s){return String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;');}/**
		 * Sanitize a space-separated CSS class list.
		 * @param {any} v
		 * @returns {string}
		 */static sanitize_css_classlist(v){if(v==null)return'';return String(v).replace(/[^\w\- ]+/g,' ').replace(/\s+/g,' ').trim();}// == NEW ==
/**
		 * Turn an arbitrary value into a conservative "token" (underscores, hyphens allowed).
		 * Useful for shortcode tokens, ids in plain text, etc.
		 * @param {any} v
		 * @returns {string}
		 */static to_token(v){return String(v??'').trim().replace(/\s+/g,'_').replace(/[^A-Za-z0-9_\-]/g,'');}/**
		 * Convert to kebab-case (letters, digits, hyphens).
		 * @param {any} v
		 * @returns {string}
		 */static to_kebab(v){return String(v??'').trim().replace(/[_\s]+/g,'-').replace(/[^A-Za-z0-9-]/g,'').replace(/-+/g,'-').toLowerCase();}/**
		 * Truthy normalization for form-like inputs: true, 'true', 1, '1', 'yes', 'on'.
		 * @param {any} v
		 * @returns {boolean}
		 */static is_truthy(v){if(typeof v==='boolean')return v;const s=String(v??'').trim().toLowerCase();return s==='true'||s==='1'||s==='yes'||s==='on';}/**
		 * Coerce to boolean with an optional default for empty values.
		 * @param {any} v
		 * @param {boolean} [def=false]
		 * @returns {boolean}
		 */static coerce_boolean(v,def=false){if(v==null||v==='')return def;return this.is_truthy(v);}/**
		 * Parse a "percent-like" value ('33'|'33%'|33) with fallback.
		 * @param {string|number|null|undefined} v
		 * @param {number} fallback_value
		 * @returns {number}
		 */static parse_percent(v,fallback_value){if(v==null){return fallback_value;}const s=String(v).trim();const n=parseFloat(s.replace(/%/g,''));return Number.isFinite(n)?n:fallback_value;}/**
		 * Clamp a number to the [min, max] range.
		 * @param {number} n
		 * @param {number} min
		 * @param {number} max
		 * @returns {number}
		 */static clamp(n,min,max){return Math.max(min,Math.min(max,n));}/**
		 * Escape a value for inclusion inside a quoted HTML attribute (double quotes).
		 * Replaces newlines with spaces and double quotes with single quotes.
		 * @param {any} v
		 * @returns {string}
		 */static escape_for_attr_quoted(v){if(v==null)return'';return String(v).replace(/\r?\n/g,' ').replace(/"/g,'\'');}/**
		 * Escape for shortcode-like tokens where double quotes and newlines should be neutralized.
		 * @param {any} v
		 * @returns {string}
		 */static escape_for_shortcode(v){return String(v??'').replace(/"/g,'\\"').replace(/\r?\n/g,' ');}/**
		 * JSON.parse with fallback (no throw).
		 * @param {string} s
		 * @param {any} [fallback=null]
		 * @returns {any}
		 */static safe_json_parse(s,fallback=null){try{return JSON.parse(s);}catch(_){return fallback;}}/**
		 * Stringify data-* attribute value safely (objects -> JSON, others -> String).
		 * @param {any} v
		 * @returns {string}
		 */static stringify_data_value(v){if(typeof v==='object'&&v!==null){try{return JSON.stringify(v);}catch{console.error('WPBC: stringify_data_value');return'';}}return String(v);}// -------------------------------------------------------------------------------------------------------------
// Strict value guards for CSS lengths and hex colors (defense-in-depth).
// -------------------------------------------------------------------------------------------------------------
/**
		 * Sanitize a CSS length. Allows: px, %, rem, em (lower/upper).
		 * Returns fallback if invalid.
		 * @param {any} v
		 * @param {string} [fallback='100%']
		 * @returns {string}
		 */static sanitize_css_len(v,fallback='100%'){const s=String(v??'').trim();const m=s.match(/^(-?\d+(?:\.\d+)?)(px|%|rem|em)$/i);return m?m[0]:String(fallback);}/**
		 * Sanitize a hex color. Allows #rgb or #rrggbb (case-insensitive).
		 * Returns fallback if invalid.
		 * @param {any} v
		 * @param {string} [fallback='#e0e0e0']
		 * @returns {string}
		 */static sanitize_hex_color(v,fallback='#e0e0e0'){const s=String(v??'').trim();return /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.test(s)?s:String(fallback);}};/**
	 * WPBC ID / Name service. Generates, sanitizes, and ensures uniqueness for field ids/names/html_ids within the
	 * canvas.
	 */Core.WPBC_BFB_IdService=class{/**
		 * Constructor. Set root container of the form pages.
		 *
		 * @param {HTMLElement} pages_container - Root container of the form pages.
		 */constructor(pages_container){this.pages_container=pages_container;}/**
		 * Ensure a unique **internal** field id (stored in data-id) within the canvas.
		 * Starts from a desired id (already sanitized or not) and appends suffixes if needed.
		 *
		 * @param {string} baseId - Desired id.
		 * @returns {string} Unique id.
		 */ensure_unique_field_id(baseId,currentEl=null){const base=Core.WPBC_BFB_Sanitize.sanitize_html_id(baseId);let id=base||'field';const esc=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const escUid=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const notSelf=currentEl?.dataset?.uid?`:not([data-uid="${escUid(currentEl.dataset.uid)}"])`:'';while(this.pages_container?.querySelector(`.wpbc_bfb__panel--preview .wpbc_bfb__field${notSelf}[data-id="${esc(id)}"], .wpbc_bfb__panel--preview .wpbc_bfb__section${notSelf}[data-id="${esc(id)}"]`)){// Excludes self by data-uid .
const found=this.pages_container.querySelector(`.wpbc_bfb__panel--preview .wpbc_bfb__field[data-id="${esc(id)}"], .wpbc_bfb__panel--preview .wpbc_bfb__section[data-id="${esc(id)}"]`);if(found&&currentEl&&found===currentEl){break;}id=`${base||'field'}-${Math.random().toString(36).slice(2,5)}`;}return id;}/**
		 * Ensure a unique HTML name across the form.
		 *
		 * @param {string} base - Desired base name (un/sanitized).
		 * @param {HTMLElement|null} currentEl - If provided, ignore conflicts with this element.
		 * @returns {string} Unique name.
		 */ensure_unique_field_name(base,currentEl=null){let name=base||'field';const esc=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const escUid=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);// Exclude the current field *and any DOM mirrors of it* (same data-uid)
const uid=currentEl?.dataset?.uid;const notSelf=uid?`:not([data-uid="${escUid(uid)}"])`:'';while(true){const selector=`.wpbc_bfb__panel--preview .wpbc_bfb__field${notSelf}[data-name="${esc(name)}"]`;const clashes=this.pages_container?.querySelectorAll(selector)||[];if(clashes.length===0)break;// nobody else uses this name
const m=name.match(/-(\d+)$/);name=m?name.replace(/-\d+$/,'-'+(Number(m[1])+1)):`${base}-2`;}return name;}/**
		 * Set field's INTERNAL id (data-id) on an element. Ensures uniqueness and optionally asks caller to refresh
		 * preview.
		 *
		 * @param {HTMLElement} field_el - Field element in the canvas.
		 * @param {string} newIdRaw - Desired id (un/sanitized).
		 * @param {boolean} [renderPreview=false] - Caller can decide to re-render preview.
		 * @returns {string} Applied unique id.
		 */set_field_id(field_el,newIdRaw,renderPreview=false){const desired=Core.WPBC_BFB_Sanitize.sanitize_html_id(newIdRaw);const unique=this.ensure_unique_field_id(desired,field_el);field_el.setAttribute('data-id',unique);if(renderPreview){// Caller decides if / when to render.
}return unique;}/**
		 * Set field's REQUIRED HTML name (data-name). Ensures sanitized + unique per form.
		 * Falls back to sanitized internal id if user provides empty value.
		 *
		 * @param {HTMLElement} field_el - Field element in the canvas.
		 * @param {string} newNameRaw - Desired name (un/sanitized).
		 * @param {boolean} [renderPreview=false] - Caller can decide to re-render preview.
		 * @returns {string} Applied unique name.
		 */set_field_name(field_el,newNameRaw,renderPreview=false){const raw=(newNameRaw==null?'':String(newNameRaw)).trim();const base=raw?Core.WPBC_BFB_Sanitize.sanitize_html_name(raw):Core.WPBC_BFB_Sanitize.sanitize_html_name(field_el.getAttribute('data-id')||'field');const unique=this.ensure_unique_field_name(base,field_el);field_el.setAttribute('data-name',unique);if(renderPreview){// Caller decides if / when to render.
}return unique;}/**
		 * Set field's OPTIONAL public HTML id (data-html_id). Empty value removes the attribute.
		 * Ensures sanitization + uniqueness among other declared HTML ids.
		 *
		 * @param {HTMLElement} field_el - Field element in the canvas.
		 * @param {string} newHtmlIdRaw - Desired html_id (optional).
		 * @param {boolean} [renderPreview=false] - Caller can decide to re-render preview.
		 * @returns {string} The applied html_id or empty string if removed.
		 */set_field_html_id(field_el,newHtmlIdRaw,renderPreview=false){const raw=(newHtmlIdRaw==null?'':String(newHtmlIdRaw)).trim();if(raw===''){field_el.removeAttribute('data-html_id');if(renderPreview){// Caller decides if / when to render.
}return'';}const desired=Core.WPBC_BFB_Sanitize.sanitize_html_id(raw);let htmlId=desired;const esc=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);const escUid=v=>Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(v);while(true){const uid=field_el?.dataset?.uid;const notSelf=uid?`:not([data-uid="${escUid(uid)}"])`:'';const clashInCanvas=this.pages_container?.querySelector(`.wpbc_bfb__panel--preview .wpbc_bfb__field${notSelf}[data-html_id="${esc(htmlId)}"],`+`.wpbc_bfb__panel--preview .wpbc_bfb__section${notSelf}[data-html_id="${esc(htmlId)}"]`);const domClash=document.getElementById(htmlId);// Allow when the only "clash" is inside this same field (e.g., the input you just rendered)
const domClashIsSelf=domClash===field_el||domClash&&field_el.contains(domClash);if(!clashInCanvas&&(!domClash||domClashIsSelf)){break;}const m=htmlId.match(/-(\d+)$/);htmlId=m?htmlId.replace(/-\d+$/,'-'+(Number(m[1])+1)):`${desired}-2`;}field_el.setAttribute('data-html_id',htmlId);if(renderPreview){// Caller decides if / when to render.
}return htmlId;}};/**
	 * WPBC Layout service. Encapsulates column width math with gap handling, presets, and utilities.
	 */Core.WPBC_BFB_LayoutService=class{/**
		 * Constructor. Set options with gap between columns (%).
		 *
		 * @param {{ col_gap_percent?: number }} [opts] - Options with gap between columns (%).
		 */constructor(opts={}){this.col_gap_percent=Number.isFinite(+opts.col_gap_percent)?+opts.col_gap_percent:3;}/**
		 * Compute normalized flex-basis values for a row, respecting column gaps.
		 * Returns bases that sum to available = 100 - (n-1)*gap.
		 *
		 * @param {HTMLElement} row_el - Row element containing .wpbc_bfb__column children.
		 * @param {number} [gap_percent=this.col_gap_percent] - Gap percent between columns.
		 * @returns {{available:number,bases:number[]}} Available space and basis values.
		 */compute_effective_bases_from_row(row_el,gap_percent=this.col_gap_percent){const cols=Array.from(row_el?.querySelectorAll(':scope > .wpbc_bfb__column')||[]);const n=cols.length||1;const raw=cols.map(col=>{const w=col.style.flexBasis||'';const p=Core.WPBC_BFB_Sanitize.parse_percent(w,NaN);return Number.isFinite(p)?p:100/n;});const sum_raw=raw.reduce((a,b)=>a+b,0)||100;const gp=Number.isFinite(+gap_percent)?+gap_percent:3;const total_gaps=Math.max(0,n-1)*gp;const available=Math.max(0,100-total_gaps);const scale=available/sum_raw;return{available,bases:raw.map(p=>Math.max(0,p*scale))};}/**
		 * Apply computed bases to the row's columns (sets flex-basis %).
		 *
		 * @param {HTMLElement} row_el - Row element.
		 * @param {number[]} bases - Array of basis values (percent of full 100).
		 * @returns {void}
		 */apply_bases_to_row(row_el,bases){const cols=Array.from(row_el?.querySelectorAll(':scope > .wpbc_bfb__column')||[]);cols.forEach((col,i)=>{const p=bases[i]??0;col.style.flexBasis=`${p}%`;});}/**
		 * Distribute columns evenly, respecting gap.
		 *
		 * @param {HTMLElement} row_el - Row element.
		 * @param {number} [gap_percent=this.col_gap_percent] - Gap percent.
		 * @returns {void}
		 */set_equal_bases(row_el,gap_percent=this.col_gap_percent){const cols=Array.from(row_el?.querySelectorAll(':scope > .wpbc_bfb__column')||[]);const n=cols.length||1;const gp=Number.isFinite(+gap_percent)?+gap_percent:3;const total_gaps=Math.max(0,n-1)*gp;const available=Math.max(0,100-total_gaps);const each=available/n;this.apply_bases_to_row(row_el,Array(n).fill(each));}/**
		 * Apply a preset of relative weights to a row/section.
		 *
		 * @param {HTMLElement} sectionOrRow - .wpbc_bfb__section or its child .wpbc_bfb__row.
		 * @param {number[]} weights - Relative weights (e.g., [1,3,1]).
		 * @param {number} [gap_percent=this.col_gap_percent] - Gap percent.
		 * @returns {void}
		 */apply_layout_preset(sectionOrRow,weights,gap_percent=this.col_gap_percent){const row=sectionOrRow?.classList?.contains('wpbc_bfb__row')?sectionOrRow:sectionOrRow?.querySelector(':scope > .wpbc_bfb__row');if(!row){return;}const cols=Array.from(row.querySelectorAll(':scope > .wpbc_bfb__column')||[]);const n=cols.length||1;if(!Array.isArray(weights)||weights.length!==n){this.set_equal_bases(row,gap_percent);return;}const sum=weights.reduce((a,b)=>a+Math.max(0,Number(b)||0),0)||1;const gp=Number.isFinite(+gap_percent)?+gap_percent:3;const available=Math.max(0,100-Math.max(0,n-1)*gp);const bases=weights.map(w=>Math.max(0,(Number(w)||0)/sum*available));this.apply_bases_to_row(row,bases);}/**
		 * Build preset weight lists for a given column count.
		 *
		 * @param {number} n - Column count.
		 * @returns {number[][]} List of weight arrays.
		 */build_presets_for_columns(n){switch(n){case 1:return[[1]];case 2:return[[1,2],[2,1],[1,3],[3,1]];case 3:return[[1,3,1],[1,2,1],[2,1,1],[1,1,2]];case 4:return[[1,2,2,1],[2,1,1,1],[1,1,1,2]];default:return[Array(n).fill(1)];}}/**
		 * Format a human-readable label like "50%/25%/25%" from weights.
		 *
		 * @param {number[]} weights - Weight list.
		 * @returns {string} Label string.
		 */format_preset_label(weights){const sum=weights.reduce((a,b)=>a+(Number(b)||0),0)||1;return weights.map(w=>Math.round((Number(w)||0)/sum*100)).join('%/')+'%';}/**
		 * Parse comma/space separated weights into numbers.
		 *
		 * @param {string} input - User input like "20,60,20".
		 * @returns {number[]} Parsed weights.
		 */parse_weights(input){if(!input){return[];}return String(input).replace(/[^\d,.\s]/g,'').split(/[\s,]+/).map(s=>parseFloat(s)).filter(n=>Number.isFinite(n)&&n>=0);}};/**
	 * WPBC Usage Limit service.
	 * Counts field usage by key, compares to palette limits, and updates palette UI.
	 */Core.WPBC_BFB_UsageLimitService=class{/**
		 * Constructor. Set pages_container and palette_ul.
		 *
		 * @param {HTMLElement} pages_container - Canvas root that holds placed fields.
		 * @param {HTMLElement[]|null} palette_uls?:   Palettes UL with .wpbc_bfb__field items (may be null).
		 */constructor(pages_container,palette_uls){this.pages_container=pages_container;// Normalize to an array; we’ll still be robust if none provided.
this.palette_uls=Array.isArray(palette_uls)?palette_uls:palette_uls?[palette_uls]:[];}/**
		 * Parse usage limit from raw dataset value. Missing/invalid -> Infinity.
		 *
		 * @param {string|number|null|undefined} raw - Raw attribute value.
		 * @returns {number} Limit number or Infinity.
		 */static parse_usage_limit(raw){if(raw==null){return Infinity;}const n=parseInt(raw,10);return Number.isFinite(n)?n:Infinity;}/**
		 * Count how many instances exist per usage_key in the canvas.
		 *
		 * @returns {Record<string, number>} Map of usage_key -> count.
		 */count_usage_by_key(){const used={};const all=this.pages_container?.querySelectorAll('.wpbc_bfb__panel--preview .wpbc_bfb__field:not(.is-invalid)')||[];all.forEach(el=>{const key=el.dataset.usage_key||el.dataset.type||el.dataset.id;if(!key){return;}used[key]=(used[key]||0)+1;});return used;}/**
		 * Return palette limit for a given usage key (id of the palette item).
		 *
		 * @param {string} key - Usage key.
		 * @returns {number} Limit value or Infinity.
		 */get_limit_for_key(key){if(!key){return Infinity;}// Query across all palettes present now (stored + any newly added in DOM).
const roots=this.palette_uls?.length?this.palette_uls:document.querySelectorAll('.wpbc_bfb__panel_field_types__ul');const allPaletteFields=Array.from(roots).flatMap(r=>Array.from(r.querySelectorAll('.wpbc_bfb__field')));let limit=Infinity;allPaletteFields.forEach(el=>{const usage_key=el.dataset.usage_key||el.dataset.id;if(el.dataset.id===key||usage_key===key){const n=Core.WPBC_BFB_UsageLimitService.parse_usage_limit(el.dataset.usagenumber);// Choose the smallest finite limit (safest if palettes disagree).
if(n<limit){limit=n;}}});return limit;}/**
		 * Disable/enable palette items based on current usage counts and limits.
		 *
		 * @returns {void}
		 */update_palette_ui(){// Always compute usage from the canvas:
const usage=this.count_usage_by_key();// Update all palettes currently in DOM (not just the initially captured ones)
const palettes=document.querySelectorAll('.wpbc_bfb__panel_field_types__ul');palettes.forEach(pal=>{pal.querySelectorAll('.wpbc_bfb__field').forEach(panel_field=>{const paletteId=panel_field.dataset.id;const usageKey=panel_field.dataset.usage_key||paletteId;const raw_limit=panel_field.dataset.usagenumber;const perElLimit=Core.WPBC_BFB_UsageLimitService.parse_usage_limit(raw_limit);// Effective limit across all palettes is the global limit for this key.
const globalLimit=this.get_limit_for_key(usageKey);const limit=Number.isFinite(globalLimit)?globalLimit:perElLimit;// prefer global min
const current=usage[usageKey]||0;const disable=Number.isFinite(limit)&&current>=limit;panel_field.style.pointerEvents=disable?'none':'';panel_field.style.opacity=disable?'0.4':'';panel_field.setAttribute('aria-disabled',disable?'true':'false');if(disable){panel_field.setAttribute('tabindex','-1');}else{panel_field.removeAttribute('tabindex');}});});}/**
		 * Return how many valid instances with this usage key exist in the canvas.
		 *
		 * @param {string} key - Usage key of a palette item.
		 * @returns {number} Count of existing non-invalid instances.
		 */count_for_key(key){if(!key){return 0;}return(this.pages_container?.querySelectorAll(`.wpbc_bfb__panel--preview .wpbc_bfb__field[data-usage_key="${Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(key)}"]:not(.is-invalid), 
                 .wpbc_bfb__panel--preview .wpbc_bfb__field[data-type="${Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(key)}"]:not(.is-invalid)`)||[]).length;}/**
		 * Alias for limit lookup (readability).
		 *
		 * @param {string} key - Usage key of a palette item.
		 * @returns {number} Limit value or Infinity.
		 */limit_for_key(key){return this.get_limit_for_key(key);}/**
		 * Remaining slots for this key (Infinity if unlimited).
		 *
		 * @param {string} key - Usage key of a palette item.
		 * @returns {number} Remaining count (>= 0) or Infinity.
		 */remaining_for_key(key){const limit=this.limit_for_key(key);if(limit===Infinity){return Infinity;}const used=this.count_for_key(key);return Math.max(0,limit-used);}/**
		 * True if you can add `delta` more items for this key.
		 *
		 * @param {string} key - Usage key of a palette item.
		 * @param {number} [delta=1] - How many items you intend to add.
		 * @returns {boolean} Whether adding is allowed.
		 */can_add(key,delta=1){const rem=this.remaining_for_key(key);return rem===Infinity?true:rem>=delta;}/**
		 * UI-facing gate: alert when exceeded. Returns boolean allowed/blocked.
		 *
		 * @param {string} key - Usage key of a palette item.
		 * @param {{label?: string, delta?: number}} [opts={}] - Optional UI info.
		 * @returns {boolean} True if allowed, false if blocked.
		 */gate_or_alert(key,{label=key,delta=1}={}){if(this.can_add(key,delta)){return true;}const limit=this.limit_for_key(key);alert(`Only ${limit} instance${limit>1?'s':''} of "${label}" allowed.`);return false;}/**
		 * Backward-compatible alias used elsewhere in the codebase.  - Check whether another instance with the given
		 * usage key can be added.
		 *
		 * @param {string} key - Usage key of a palette item.
		 * @returns {boolean} Whether adding one more is allowed.
		 */is_usage_ok(key){return this.can_add(key,1);}};/**
	 * Constant event names for the builder.
	 */Core.WPBC_BFB_Events=Object.freeze({SELECT:'wpbc:bfb:select',CLEAR_SELECTION:'wpbc:bfb:clear-selection',FIELD_ADD:'wpbc:bfb:field:add',FIELD_REMOVE:'wpbc:bfb:field:remove',STRUCTURE_CHANGE:'wpbc:bfb:structure:change',STRUCTURE_LOADED:'wpbc:bfb:structure:loaded'});/**
	 * Lightweight event bus that emits to both the pages container and document.
	 */Core.WPBC_BFB_EventBus=class{/**
		 * @param {HTMLElement} scope_el - Element to dispatch bubbled events from.
		 */constructor(scope_el){this.scope_el=scope_el;}/**
		 * Emit a DOM CustomEvent with payload.
		 *
		 * @param {string} type - Event type (use Core.WPBC_BFB_Events. when possible).
		 * @param {Object} [detail={}] - Arbitrary serializable payload.
		 * @returns {void}
		 */emit(type,detail={}){if(!this.scope_el){return;}this.scope_el.dispatchEvent(new CustomEvent(type,{detail:{...detail},bubbles:true}));}/**
		 * Subscribe to an event on document.
		 *
		 * @param {string} type - Event type.
		 * @param {(ev:CustomEvent)=>void} handler - Handler function.
		 * @returns {void}
		 */on(type,handler){document.addEventListener(type,handler);}/**
		 * Unsubscribe from an event on document.
		 *
		 * @param {string} type - Event type.
		 * @param {(ev:CustomEvent)=>void} handler - Handler function.
		 * @returns {void}
		 */off(type,handler){document.removeEventListener(type,handler);}};/**
	 * SortableJS manager: single point for consistent DnD config.
	 */Core.WPBC_BFB_SortableManager=class{/**
		 * @param {WPBC_Form_Builder} builder - The active builder instance.
		 * @param {{ groupName?: string, animation?: number, ghostClass?: string, chosenClass?: string, dragClass?:
		 *     string, candidate_dwell_ms?: number, candidate_commit_distance?: number,
		 *     candidate_dwell_distance?: number }} [opts={}] - Visual and drag-stability options.
		 */constructor(builder,opts={}){this.builder=builder;const gid=this.builder?.instance_id||Math.random().toString(36).slice(2,8);this.opts={// groupName  : 'form',
groupName:`form-${gid}`,animation:150,ghostClass:'wpbc_bfb__drag-ghost',chosenClass:'wpbc_bfb__highlight',dragClass:'wpbc_bfb__drag-active',candidate_dwell_ms:90,candidate_commit_distance:10,candidate_dwell_distance:2,...opts};/** @type {Set<HTMLElement>} */this._containers=new Set();/**
			 * Guard against lost mouseup / pointerup events.
			 *
			 * @type {boolean}
			 */this._drag_fail_safe_bound=false;/**
			 * State for the current Form Builder canvas drag.
			 *
			 * @type {?Object}
			 */this._drag_state=null;this._bind_drag_fail_safe();}/**
		 * Cleanup drag UI state.
		 *
		 * This is a defensive cleanup for cases when Chrome or a browser extension
		 * loses the final mouseup / pointerup event during fallback dragging.
		 *
		 * @returns {void}
		 */_cleanup_drag_ui(){const drag_state=this._drag_state;if(drag_state?.item){drag_state.item.classList.remove('wpbc_bfb__drop-indicator');}if(drag_state?.source_spacer?.parentNode){drag_state.source_spacer.parentNode.removeChild(drag_state.source_spacer);}this._release_canvas_geometry_locks(drag_state);this._drag_state=null;this._toggle_dnd_root_flags(false);this.builder?._remove_dragging_class?.();// Remove only fallback mirrors. Do not touch real dragged elements.
document.querySelectorAll('.sortable-fallback[data-drag-role], .wpbc_bfb__simple_list_fallback').forEach(el=>{if(el.parentNode){el.parentNode.removeChild(el);}});}/**
		 * Capture the block size of every canvas layout container before drag reflow starts.
		 *
		 * SortableJS temporarily moves the real node between containers. That changes CSS
		 * `:empty` matching and can otherwise shrink an empty destination row or grow a
		 * populated destination by the insertion-line height. The captured values are
		 * applied only for the active drag session and never become saved form data.
		 *
		 * @returns {Array<Object>} Restorable geometry-lock records for visible canvas containers.
		 */_capture_canvas_geometry_locks(){const pages_container=this.builder?.pages_container;if(!pages_container?.querySelectorAll){return[];}const lock_selector=['.wpbc_bfb__form_preview_section_container','.wpbc_bfb__row','.wpbc_bfb__column'].join(', ');const block_size_property='--wpbc-bfb-drag-locked-block-size';return Array.from(pages_container.querySelectorAll(lock_selector)).map(element=>{const block_size=element.getBoundingClientRect?.().height;if(!Number.isFinite(block_size)||block_size<=0){return null;}return{element:element,block_size:Math.round(block_size*1000)/1000,had_lock_class:element.classList?.contains('wpbc_bfb__drag-geometry-lock'),previous_block_size:element.style?.getPropertyValue?.(block_size_property)||'',previous_block_size_priority:element.style?.getPropertyPriority?.(block_size_property)||''};}).filter(Boolean);}/**
		 * Freeze captured canvas container heights for the active SortableJS session.
		 *
		 * The lock is applied before global drag classes or the compact insertion marker
		 * can change flex alignment and empty-container selectors.
		 *
		 * @returns {void}
		 */_apply_canvas_geometry_locks(){const geometry_locks=this._drag_state?.geometry_locks||[];geometry_locks.forEach(geometry_lock=>{geometry_lock.element.style?.setProperty('--wpbc-bfb-drag-locked-block-size',`${geometry_lock.block_size}px`);geometry_lock.element.classList?.add('wpbc_bfb__drag-geometry-lock');});}/**
		 * Restore all inline state used by the drag-session geometry lock.
		 *
		 * @param {?Object} drag_state - Drag state whose geometry records must be restored.
		 * @returns {void}
		 */_release_canvas_geometry_locks(drag_state){const block_size_property='--wpbc-bfb-drag-locked-block-size';const geometry_locks=drag_state?.geometry_locks||[];geometry_locks.forEach(geometry_lock=>{if(geometry_lock.previous_block_size){geometry_lock.element.style?.setProperty(block_size_property,geometry_lock.previous_block_size,geometry_lock.previous_block_size_priority);}else{geometry_lock.element.style?.removeProperty?.(block_size_property);}if(!geometry_lock.had_lock_class){geometry_lock.element.classList?.remove('wpbc_bfb__drag-geometry-lock');}});}/**
		 * Capture the original canvas geometry before SortableJS applies its ghost class.
		 *
		 * The saved rectangle is later represented by a non-data spacer. This keeps the
		 * source layout stable while the real dragged node becomes a compact insertion
		 * indicator in another container.
		 *
		 * @param {Sortable.SortableEvent} evt - Sortable choose event.
		 * @returns {void}
		 */_prepare_drag_state(evt){if(!evt?.item||!evt?.from){this._drag_state=null;return;}const source_rect=evt.item.getBoundingClientRect();const from_palette=!!this.builder?.palette_uls?.includes?.(evt.from);this._drag_state={item:evt.item,from_palette:from_palette,source_parent:evt.from,source_next_sibling:evt.item.nextSibling,source_rect:{width:source_rect.width,height:source_rect.height},geometry_locks:this._capture_canvas_geometry_locks(),source_spacer:null,accepted_candidate:null,pending_candidate:null,pending_since:0,pending_pointer:null};}/**
		 * Create a measured, non-data footprint at the dragged item's source position.
		 *
		 * The spacer intentionally does not use field or section classes, so Form Builder
		 * serialization and usage accounting cannot treat it as saved form content.
		 *
		 * @returns {void}
		 */_create_drag_source_spacer(){const drag_state=this._drag_state;if(!drag_state||drag_state.from_palette||!drag_state.item||!drag_state.source_parent||drag_state.source_spacer){return;}const spacer=document.createElement('div');const width=Math.max(1,drag_state.source_rect?.width||1);const height=Math.max(1,drag_state.source_rect?.height||1);spacer.className='wpbc_bfb__drag-source-spacer';spacer.setAttribute('aria-hidden','true');spacer.setAttribute('data-wpbc-bfb-drag-source-spacer','true');spacer.style.setProperty('--wpbc-bfb-drag-source-inline-size',`${width}px`);spacer.style.setProperty('--wpbc-bfb-drag-source-block-size',`${height}px`);const reference_node=drag_state.source_next_sibling?.parentNode===drag_state.source_parent?drag_state.source_next_sibling:null;drag_state.source_parent.insertBefore(spacer,reference_node);drag_state.source_spacer=spacer;}/**
		 * Start the stable drag representation after SortableJS creates its off-flow mirror.
		 *
		 * @param {Sortable.SortableEvent} evt - Sortable start event.
		 * @returns {void}
		 */_start_drag(evt){if(!this._drag_state){this._prepare_drag_state(evt);}this._apply_canvas_geometry_locks();this.builder?._add_dragging_class?.();const from_palette=!!this._drag_state?.from_palette;this._toggle_dnd_root_flags(true,from_palette);this._tag_drag_mirror(evt);if(!from_palette&&evt?.item){this._create_drag_source_spacer();evt.item.classList.add('wpbc_bfb__drop-indicator');}}/**
		 * Finish a Form Builder drag and remove transient layout helpers.
		 *
		 * @returns {void}
		 */_finish_drag(){this._cleanup_drag_ui();}/**
		 * Check whether a SortableJS canvas candidate is stable enough to accept.
		 *
		 * The candidate includes the destination container, related sibling, and insertion
		 * side. A new candidate must receive real pointer movement before it can replace
		 * the accepted position, preventing layout movement alone from causing flip-flops.
		 *
		 * @param {Object} evt - Sortable move event.
		 * @param {MouseEvent|PointerEvent|TouchEvent} original_event - Original pointer event.
		 * @returns {boolean} Whether SortableJS may move the in-flow insertion indicator.
		 */_allow_canvas_move(evt,original_event){const{to,from}=evt||{};if(!to||!from){return true;}if(!to.closest('.wpbc_bfb__panel--preview')){return true;}const touch_event=original_event?.touches?.[0]||original_event?.changedTouches?.[0];const event_x=touch_event?.clientX??original_event?.clientX;const event_y=touch_event?.clientY??original_event?.clientY;const dragged_rect=evt.draggedRect||evt.dragged?.getBoundingClientRect?.();const pointer_x=Number.isFinite(event_x)?event_x:dragged_rect?dragged_rect.left+dragged_rect.width/2:0;const pointer_y=Number.isFinite(event_y)?event_y:dragged_rect?dragged_rect.top+dragged_rect.height/2:0;// Cross-container column changes require a deliberate move inside the new column.
if(to!==from&&to.classList?.contains('wpbc_bfb__column')){const container_rect=to.getBoundingClientRect();const padding_x=Core.WPBC_BFB_Sanitize.clamp(container_rect.width*0.20,12,36);const padding_y=Core.WPBC_BFB_Sanitize.clamp(container_rect.height*0.10,6,16);const visually_empty=!to.querySelector(':scope > .wpbc_bfb__field:not(.wpbc_bfb__drop-indicator), '+':scope > .wpbc_bfb__section:not(.wpbc_bfb__drop-indicator)')||container_rect.height<64;const inner_top=container_rect.top+(visually_empty?4:padding_y);const inner_bottom=container_rect.bottom-(visually_empty?4:padding_y);const inner_left=container_rect.left+padding_x;const inner_right=container_rect.right-padding_x;if(pointer_x<=inner_left||pointer_x>=inner_right||pointer_y<=inner_top||pointer_y>=inner_bottom){return false;}}const drag_state=this._drag_state;if(!drag_state){return true;}const candidate={to:to,related:evt.related||null,will_insert_after:!!evt.willInsertAfter};const candidate_matches=(first,second)=>!!first&&!!second&&first.to===second.to&&first.related===second.related&&first.will_insert_after===second.will_insert_after;if(candidate_matches(candidate,drag_state.accepted_candidate)){evt.dragged?.classList.add('wpbc_bfb__drop-indicator');return true;}const now=window.performance?.now?.()??Date.now();if(!candidate_matches(candidate,drag_state.pending_candidate)){drag_state.pending_candidate=candidate;drag_state.pending_since=now;drag_state.pending_pointer={x:pointer_x,y:pointer_y};return false;}const pointer_distance=Math.hypot(pointer_x-drag_state.pending_pointer.x,pointer_y-drag_state.pending_pointer.y);const candidate_age=now-drag_state.pending_since;const crossed_commit_distance=pointer_distance>=this.opts.candidate_commit_distance;const completed_dwell_move=candidate_age>=this.opts.candidate_dwell_ms&&pointer_distance>=this.opts.candidate_dwell_distance;if(!crossed_commit_distance&&!completed_dwell_move){return false;}drag_state.accepted_candidate=candidate;drag_state.pending_candidate=null;drag_state.pending_since=0;drag_state.pending_pointer=null;evt.dragged?.classList.add('wpbc_bfb__drop-indicator');return true;}/**
		 * Bind global fail-safe listeners for drag cleanup.
		 *
		 * @returns {void}
		 */_bind_drag_fail_safe(){if(this._drag_fail_safe_bound){return;}this._drag_fail_safe_bound=true;const finish_drag=()=>{window.requestAnimationFrame(()=>{this._cleanup_drag_ui();});};['mouseup','pointerup','touchend','dragend'].forEach(evt_name=>{document.addEventListener(evt_name,finish_drag,true);});window.addEventListener('blur',finish_drag,true);document.addEventListener('visibilitychange',()=>{if(document.hidden){finish_drag();}},true);}/**
		 * Tag the drag mirror (element under cursor) with role: 'palette' | 'canvas'.
		 * Works with Sortable's fallback mirror (.sortable-fallback / .sortable-drag) and with your dragClass
		 * (.wpbc_bfb__drag-active).
		 */_tag_drag_mirror(evt){const fromPalette=this.builder?.palette_uls?.includes?.(evt.from);const role=fromPalette?'palette':'canvas';// Wait a tick so the mirror exists.  - The window.requestAnimationFrame() method tells the browser you wish to perform an animation.
requestAnimationFrame(()=>{const mirror=document.querySelector('.sortable-fallback, .sortable-drag, .'+this.opts.dragClass);if(mirror){mirror.setAttribute('data-drag-role',role);mirror.setAttribute('aria-hidden','true');}});}_toggle_dnd_root_flags(active,from_palette=false){// set to root element of an HTML document, which is the <html>.
const root=document.documentElement;if(active){root.classList.add('wpbc_bfb__dnd-active');if(from_palette){root.classList.add('wpbc_bfb__drag-from-palette');}}else{root.classList.remove('wpbc_bfb__dnd-active','wpbc_bfb__drag-from-palette');}}/**
		 * Ensure a simple vertical sortable list.
		 *
		 * This configuration is intended for inspector/sidebar lists such as:
		 * - dropdown choices
		 * - radio options
		 * - checkbox options
		 *
		 * It is intentionally much simpler than the canvas DnD config and does not
		 * use the column edge-fence / sticky-target logic.
		 *
		 * @param {HTMLElement} container - Sortable list container.
		 * @param {{ handle_selector?: string, draggable_selector?: string, onUpdate?: Function }} [handlers={}] -
		 *     Optional handlers/selectors.
		 * @returns {void}
		 */ensure_simple_list(container,handlers={}){if(!container||typeof Sortable==='undefined'){return;}if(Sortable.get?.(container)){return;}const common={animation:this.opts.animation,ghostClass:this.opts.ghostClass,chosenClass:this.opts.chosenClass,dragClass:this.opts.dragClass,forceFallback:true,// For a single scrollable sidebar list this is usually more stable.
fallbackOnBody:false,fallbackTolerance:8,removeCloneOnHide:true,onStart:()=>{this.builder?._add_dragging_class?.();this._toggle_dnd_root_flags(true,false);},onEnd:()=>{setTimeout(()=>{this.builder?._remove_dragging_class?.();},50);this._toggle_dnd_root_flags(false);this._cleanup_drag_ui();}};Sortable.create(container,{...common,group:{name:this.opts.groupName,pull:false,put:false},sort:true,direction:'vertical',handle:handlers.handle_selector||'.wpbc_bfb__drag-handle',draggable:handlers.draggable_selector||'.wpbc_bfb__sortable-row',fallbackClass:'wpbc_bfb__simple_list_fallback',filter:['input','textarea','select','button','a','.wpbc_bfb__no-drag-zone','.wpbc_bfb__no-drag-zone *'].join(','),preventOnFilter:false,invertSwap:false,swapThreshold:0.30,invertedSwapThreshold:0.60,emptyInsertThreshold:8,dragoverBubble:false,scroll:true,scrollSensitivity:60,scrollSpeed:14,onUpdate:handlers.onUpdate||function(){}});this._containers.add(container);}/**
		 * Ensure Sortable is attached to a container with role 'palette' or 'canvas'.
		 *
		 *  -- Handle selectors: handle:  '.section-drag-handle, .wpbc_bfb__drag-handle, .wpbc_bfb__drag-anywhere,
		 * [data-draggable="true"]'
		 *  -- Draggable gate: draggable fields, sections, and the transient measured source spacer.
		 *  -- Filter (overlay-safe):     ignore everything in overlay except the handle -
		 * '.wpbc_bfb__overlay-controls
		 * *:not(.wpbc_bfb__drag-handle):not(.section-drag-handle):not(.wpbc_icn_drag_indicator)'
		 *  -- No-drag wrapper:           use .wpbc_bfb__no-drag-zone inside renderers for inputs/widgets.
		 *  -- Focus guard (optional):    flip [data-draggable] on focusin/focusout to prevent accidental drags while
		 * typing.
		 *
		 * @param {HTMLElement} container - The element to enhance with Sortable.
		 * @param {'palette'|'canvas'} role - Behavior profile to apply.
		 * @param {{ onAdd?: Function }} [handlers={}] - Optional handlers.
		 * @returns {void}
		 */ensure(container,role,handlers={}){if(!container||typeof Sortable==='undefined'){return;}if(Sortable.get?.(container)){return;}const sortable_kind=handlers.sortable_kind||'';if(sortable_kind==='simple_list'){this.ensure_simple_list(container,handlers);return;}const common={animation:this.opts.animation,ghostClass:this.opts.ghostClass,chosenClass:this.opts.chosenClass,dragClass:this.opts.dragClass,// == Element under the cursor  == Ensure we drag a real DOM mirror you can style via CSS (cross-browser).
forceFallback:true,fallbackOnBody:true,fallbackTolerance:8,removeCloneOnHide:true,onChoose:evt=>this._prepare_drag_state(evt),onStart:evt=>this._start_drag(evt),onEnd:()=>this._finish_drag(),onMove:(evt,original_event)=>this._allow_canvas_move(evt,original_event)};if(role==='palette'){Sortable.create(container,{...common,group:{name:this.opts.groupName,pull:'clone',put:false},sort:false});this._containers.add(container);return;}// role === 'canvas'.
Sortable.create(container,{...common,// Stable insertion geometry is preferable to animating hit-test targets.
animation:0,group:{name:this.opts.groupName,pull:true,put:(to,from,draggedEl)=>{return draggedEl.classList.contains('wpbc_bfb__field')||draggedEl.classList.contains('wpbc_bfb__section');}},// ---------- DnD Handlers --------------                // Grab anywhere on fields that opt-in with the class or attribute.  - Sections still require their dedicated handle.
handle:'.section-drag-handle, .wpbc_bfb__drag-handle, .wpbc_bfb__drag-anywhere, [data-draggable="true"]',// The transient spacer participates in hit testing but never serialization.
draggable:['.wpbc_bfb__field:not([data-draggable="false"])','.wpbc_bfb__section','.wpbc_bfb__drag-source-spacer'].join(', '),// ---------- Filters - No DnD ----------                // Declarative “no-drag zones”: anything inside these wrappers won’t start a drag.
filter:['.wpbc_bfb__no-drag-zone','.wpbc_bfb__no-drag-zone *','.wpbc_bfb__column-resizer',// Ignore the resizer rails during DnD (prevents edge “snap”).
// In the overlay toolbar, block everything EXCEPT the drag handle (and its icon).
'.wpbc_bfb__overlay-controls *:not(.wpbc_bfb__drag-handle):not(.section-drag-handle):not(.wpbc_icn_drag_indicator)'].join(','),preventOnFilter:false,// ---------- anti-jitter tuning ----------
direction:'vertical',// columns are vertical lists.
invertSwap:true,// use swap on inverted overlap.
swapThreshold:0.65,// be less eager to swap.
invertedSwapThreshold:0.85,// require deeper overlap when inverted.
emptyInsertThreshold:24,// don’t jump into empty containers too early.
dragoverBubble:false,// keep dragover local.
scroll:true,scrollSensitivity:40,scrollSpeed:10,// ----------------------------------------
// onAdd: handlers.onAdd || this.builder.handle_on_add.bind( this.builder )
onAdd:evt=>{if(this._on_add_section(evt)){return;}// Fallback: original handler for normal fields.
(handlers.onAdd||this.builder.handle_on_add.bind(this.builder))(evt);},onUpdate:()=>{this.builder.bus?.emit?.(Core.WPBC_BFB_Events.STRUCTURE_CHANGE,{reason:'sort-update'});}});this._containers.add(container);}/**
		 * Handle adding/moving sections via Sortable onAdd.
		 * Returns true if handled (i.e., it was a section), false to let the default field handler run.
		 *
		 * - Palette -> canvas: remove the placeholder clone and build a fresh section via add_section()
		 * - Canvas -> canvas: keep the moved DOM (and its children), just re-wire overlays/sortables/metadata
		 *
		 * @param {Sortable.SortableEvent} evt
		 * @returns {boolean}
		 */_on_add_section(evt){const item=evt.item;if(!item){return false;}// Identify sections both from palette items (li clones) and real canvas nodes.
const data=Core.WPBC_Form_Builder_Helper.get_all_data_attributes(item);const isSection=item.classList.contains('wpbc_bfb__section')||(data?.type||item.dataset?.type)==='section';if(!isSection){return false;}const fromPalette=this.builder?.palette_uls?.includes?.(evt.from)===true;if(!fromPalette){// Canvas -> canvas move: DO NOT rebuild/remove; preserve children.
this.builder.add_overlay_toolbar?.(item);// ensure overlay exists
this.builder.pages_sections?.init_all_nested_sortables?.(item);// ensure inner sortables
// Ensure metadata present/updated
item.dataset.type='section';const cols=item.querySelectorAll(':scope > .wpbc_bfb__row > .wpbc_bfb__column').length||1;item.dataset.columns=String(cols);// Select & notify subscribers (layout/min guards, etc.)
this.builder.select_field?.(item);this.builder.bus?.emit?.(Core.WPBC_BFB_Events.STRUCTURE_CHANGE,{el:item,reason:'section-move'});this.builder.usage?.update_palette_ui?.();return true;// handled.
}// Palette -> canvas: build a brand-new section using the same path as the dropdown/menu
const to=evt.to?.closest?.('.wpbc_bfb__column, .wpbc_bfb__form_preview_section_container')||evt.to;const cols=parseInt(data?.columns||item.dataset.columns||1,10)||1;// Remove the palette clone placeholder.
item.parentNode&&item.parentNode.removeChild(item);// Create the real section.
this.builder.pages_sections.add_section(to,cols);// Insert at the precise drop index.
const section=to.lastElementChild;// add_section appends to end.
if(evt.newIndex!=null&&evt.newIndex<to.children.length-1){const ref=to.children[evt.newIndex]||null;to.insertBefore(section,ref);}// Finalize: overlay, selection, events, usage refresh.
this.builder.add_overlay_toolbar?.(section);this.builder.select_field?.(section);this.builder.bus?.emit?.(Core.WPBC_BFB_Events.FIELD_ADD,{el:section,id:section.dataset.id,uid:section.dataset.uid});this.builder.usage?.update_palette_ui?.();return true;}/**
		 * Destroy all Sortable instances created by this manager.
		 *
		 * @returns {void}
		 */destroyAll(){this._containers.forEach(el=>{const inst=Sortable.get?.(el);if(inst){inst.destroy();}});this._containers.clear();}};/**
	 * Small DOM contract and renderer helper
	 *
	 * @type {Readonly<{
	 *                  SELECTORS: {pagePanel: string, field: string, validField: string, section: string, column:
	 *     string, row: string, overlay: string}, CLASSES: {selected: string}, ATTR: {id: string, name: string, htmlId:
	 *     string, usageKey: string, uid: string}}
	 *        >}
	 */Core.WPBC_BFB_DOM=Object.freeze({SELECTORS:{pagePanel:'.wpbc_bfb__panel--preview',field:'.wpbc_bfb__field',validField:'.wpbc_bfb__field:not(.is-invalid)',section:'.wpbc_bfb__section',column:'.wpbc_bfb__column',row:'.wpbc_bfb__row',overlay:'.wpbc_bfb__overlay-controls'},CLASSES:{selected:'is-selected'},ATTR:{id:'data-id',name:'data-name',htmlId:'data-html_id',usageKey:'data-usage_key',uid:'data-uid'}});Core.WPBC_Form_Builder_Helper=class{/**
		 * Create an HTML element.
		 *
		 * @param {string} tag - HTML tag name.
		 * @param {string} [class_name=''] - Optional CSS class name.
		 * @param {string} [inner_html=''] - Optional innerHTML.
		 * @returns {HTMLElement} Created element.
		 */static create_element(tag,class_name='',inner_html=''){const el=document.createElement(tag);if(class_name){el.className=class_name;}if(inner_html){el.innerHTML=inner_html;}return el;}/**
		 * Set multiple `data-*` attributes on a given element.
		 *
		 * @param {HTMLElement} el - Target element.
		 * @param {Object} data_obj - Key-value pairs for data attributes.
		 * @returns {void}
		 */static set_data_attributes(el,data_obj){Object.entries(data_obj).forEach(([key,val])=>{// Previously: 2025-09-01 17:09:
// const value = (typeof val === 'object') ? JSON.stringify( val ) : val;
//New:
let value;if(typeof val==='object'&&val!==null){try{value=JSON.stringify(val);}catch{value='';}}else{value=val;}el.setAttribute('data-'+key,value);});}/**
		 * Get all `data-*` attributes from an element and parse JSON where possible.
		 *
		 * @param {HTMLElement} el - Element to extract data from.
		 * @returns {Object} Parsed key-value map of data attributes.
		 */static get_all_data_attributes(el){const data={};if(!el||!el.attributes){return data;}Array.from(el.attributes).forEach(attr=>{if(attr.name.startsWith('data-')){const key=attr.name.replace(/^data-/,'');try{data[key]=JSON.parse(attr.value);}catch(e){data[key]=attr.value;}}});// Only default the label if it's truly absent (undefined/null), not when it's an empty string.
const hasExplicitLabel=Object.prototype.hasOwnProperty.call(data,'label');if(!hasExplicitLabel&&data.id){data.label=data.id.charAt(0).toUpperCase()+data.id.slice(1);}return data;}/**
		 * Render a simple label + type preview (used for unknown or fallback fields).
		 *
		 * @param {Object} field_data - Field data object.
		 * @returns {string} HTML content.
		 */static render_field_inner_html(field_data){// Make the fallback preview respect an empty label.
const hasLabel=Object.prototype.hasOwnProperty.call(field_data,'label');const label=hasLabel?String(field_data.label):String(field_data.id||'(no label)');const type=String(field_data.type||'unknown');const is_required=field_data.required===true||field_data.required==='true'||field_data.required===1||field_data.required==='1';const wrapper=document.createElement('div');const spanLabel=document.createElement('span');spanLabel.className='wpbc_bfb__field-label';spanLabel.textContent=label+(is_required?' *':'');wrapper.appendChild(spanLabel);const spanType=document.createElement('span');spanType.className='wpbc_bfb__field-type';spanType.textContent=type;wrapper.appendChild(spanType);return wrapper.innerHTML;}/**
		 * Debounce a function.
		 *
		 * @param {Function} fn - Function to debounce.
		 * @param {number} wait - Delay in ms.
		 * @returns {Function} Debounced function.
		 */static debounce(fn,wait=120){let t=null;return function debounced(...args){if(t){clearTimeout(t);}t=setTimeout(()=>fn.apply(this,args),wait);};}};// Renderer registry. Allows late registration and avoids tight coupling to a global map.
Core.WPBC_BFB_Field_Renderer_Registry=function(){const map=new Map();return{register(type,ClassRef){map.set(String(type),ClassRef);},get(type){return map.get(String(type));}};}();})(window);// ---------------------------------------------------------------------------------------------------------------------
// == File  /includes/page-form-builder/_out/core/bfb-fields.js == | 2025-09-10 15:47
// ---------------------------------------------------------------------------------------------------------------------
(function(w){'use strict';// Single global namespace (idempotent & load-order safe).
const Core=w.WPBC_BFB_Core=w.WPBC_BFB_Core||{};const UI=Core.UI=Core.UI||{};/**
	 * Base class for field renderers (static-only contract).
	 * ================================================================================================================
	 * Contract exposed to the builder (static methods on the CLASS itself):
	 *   - render(el, data, ctx)              // REQUIRED
	 *   - on_field_drop(data, el, meta)      // OPTIONAL (default provided)
	 *
	 * Helpers for subclasses:
	 *   - get_defaults()     -> per-field defaults (MUST override in subclass to set type/label)
	 *   - normalize_data(d)  -> shallow merge with defaults
	 *   - get_template(id)   -> per-id cached wp.template compiler
	 *
	 * Subclass usage:
	 *   class WPBC_BFB_Field_Text extends Core.WPBC_BFB_Field_Base { static get_defaults(){ ... } }
	 *   WPBC_BFB_Field_Text.template_id = 'wpbc-bfb-field-text';
	 * ================================================================================================================
	 */Core.WPBC_BFB_Field_Base=class{/**
		 * Default field data (generic baseline).
		 * Subclasses MUST override to provide { type, label } appropriate for the field.
		 * @returns {Object}
		 */static get_defaults(){return{type:'field',label:'Field',name:'field',html_id:'',placeholder:'',required:false,minlength:'',maxlength:'',pattern:'',cssclass:'',help:''};}/**
		 * Shallow-merge incoming data with defaults.
		 * @param {Object} data
		 * @returns {Object}
		 */static normalize_data(data){var d=data||{};var defaults=this.get_defaults();var out={};var k;for(k in defaults){if(Object.prototype.hasOwnProperty.call(defaults,k)){out[k]=defaults[k];}}for(k in d){if(Object.prototype.hasOwnProperty.call(d,k)){out[k]=d[k];}}return out;}/**
		 * Compile and cache a wp.template by id (per-id cache).
		 * @param {string} template_id
		 * @returns {Function|null}
		 */static get_template(template_id){// Accept either "wpbc-bfb-field-text" or "tmpl-wpbc-bfb-field-text".
if(!template_id||!window.wp||!wp.template){return null;}const domId=template_id.startsWith('tmpl-')?template_id:'tmpl-'+template_id;if(!document.getElementById(domId)){return null;}if(!Core.__bfb_tpl_cache_map){Core.__bfb_tpl_cache_map={};}// Normalize id for the compiler & cache. // wp.template expects id WITHOUT the "tmpl-" prefix !
const key=template_id.replace(/^tmpl-/,'');if(Core.__bfb_tpl_cache_map[key]){return Core.__bfb_tpl_cache_map[key];}const compiler=wp.template(key);// <-- normalized id here
if(compiler){Core.__bfb_tpl_cache_map[key]=compiler;}return compiler;}/**
		 * REQUIRED: render preview into host element (full redraw; idempotent).
		 * Subclasses should set static `template_id` to a valid wp.template id.
		 * @param {HTMLElement} el
		 * @param {Object}      data
		 * @param {{mode?:string,builder?:any,tpl?:Function,sanit?:any}} ctx
		 * @returns {void}
		 */static render(el,data,ctx){if(!el){return;}var compile=this.get_template(this.template_id);var d=this.normalize_data(data);var s=ctx&&ctx.sanit?ctx.sanit:Core.WPBC_BFB_Sanitize;// Sanitize critical attributes before templating.
if(s){d.html_id=d.html_id?s.sanitize_html_id(String(d.html_id)):'';d.name=s.sanitize_html_name(String(d.name||d.id||'field'));}else{d.html_id=d.html_id?String(d.html_id):'';d.name=String(d.name||d.id||'field');}// Fall back to generic preview if template not available.
if(compile){el.innerHTML=compile(d);// After render, set attribute values via DOM so quotes/newlines are handled correctly.
const input=el.querySelector('input, textarea, select');if(input){if(d.placeholder!=null)input.setAttribute('placeholder',String(d.placeholder));if(d.title!=null)input.setAttribute('title',String(d.title));}}else{el.innerHTML=Core.WPBC_Form_Builder_Helper.render_field_inner_html(d);}el.dataset.type=d.type||'field';el.setAttribute('data-label',d.label!=null?String(d.label):'');// allow "".
}/**
		 * OPTIONAL hook executed after field is dropped/loaded/preview.
		 * Default extended:
		 * - On first drop: stamp default label (existing behavior) and mark field as "fresh" for auto-name.
		 * - On load: mark as loaded so later label edits do not rename the saved name.
		 */static on_field_drop(data,el,meta){const context=meta&&meta.context?String(meta.context):'';// -----------------------------------------------------------------------------------------
// NEW: Seed default "help" (and keep it in Structure) for all field packs that define it.
// This fixes the mismatch where:
//   - UI shows default help via normalize_data() / templates
//   - but get_structure() / exporters see `help` as undefined/empty.
//
// Behavior:
//   - Runs ONLY on initial drop (context === 'drop').
//   - If get_defaults() exposes a non-empty "help", and data.help is
//     missing / null / empty string -> we persist the default into `data`
//     and notify Structure so exports see it.
//   - On "load" we do nothing, so existing forms where user *cleared*
//     help will not be overridden.
// -----------------------------------------------------------------------------------------
if(context==='drop'&&data){try{const defs=typeof this.get_defaults==='function'?this.get_defaults():null;if(defs&&Object.prototype.hasOwnProperty.call(defs,'help')){const current=Object.prototype.hasOwnProperty.call(data,'help')?data.help:undefined;const hasValue=current!==undefined&&current!==null&&String(current)!=='';const defaultVal=defs.help;if(!hasValue&&defaultVal!=null&&String(defaultVal)!==''){// 1) persist into data object (used by Structure).
data.help=defaultVal;// 2) mirror into dataset (for any DOM-based consumers).
if(el){el.dataset.help=String(defaultVal);// 3) notify Structure / listeners (if available).
try{Core.Structure?.update_field_prop?.(el,'help',defaultVal);el.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'help',value:defaultVal}}));}catch(_inner){}}}}}catch(_e){}}// -----------------------------------------------------------------------------------------
if(context==='drop'&&!Object.prototype.hasOwnProperty.call(data,'label')){const defs=this.get_defaults();data.label=defs.label||'Field';el.setAttribute('data-label',data.label);}// Mark provenance flags.
if(context==='drop'){el.dataset.fresh='1';// can auto-name on first label edit.
el.dataset.autoname='1';el.dataset.was_loaded='0';// Seed a provisional unique name immediately.
try{const b=meta?.builder;if(b?.id&&(!el.hasAttribute('data-name')||!el.getAttribute('data-name'))){const S=Core.WPBC_BFB_Sanitize;const base=S.sanitize_html_name(el.getAttribute('data-id')||data?.id||data?.type||'field');const uniq=b.id.ensure_unique_field_name(base,el);el.setAttribute('data-name',uniq);el.dataset.name_user_touched='0';}}catch(_){}}else if(context==='load'){el.dataset.fresh='0';el.dataset.autoname='0';el.dataset.was_loaded='1';// never rename names for loaded fields.
}}// --- Auto Rename "Fresh" field,  on entering the new Label ---
/**
		 * Create a conservative field "name" from a human label.
		 * Uses the same constraints as sanitize_html_name (letters/digits/_- and leading letter).
		 */static name_from_label(label){const s=Core.WPBC_BFB_Sanitize.sanitize_html_name(String(label??''));return s.toLowerCase()||'field';}/**
		 * Auto-fill data-name from label ONLY for freshly dropped fields that were not edited yet.
		 * - Never runs for sections.
		 * - Never runs for loaded/existing fields.
		 * - Stops as soon as user edits the Name manually.
		 *
		 * @param {WPBC_Form_Builder} builder
		 * @param {HTMLElement} el  - .wpbc_bfb__field element
		 * @param {string} labelVal
		 */static maybe_autoname_from_label(builder,el,labelVal){if(!builder||!el)return;if(el.classList.contains('wpbc_bfb__section'))return;const allowAuto=el.dataset.autoname==='1';const userTouched=el.dataset.name_user_touched==='1';const isLoaded=el.dataset.was_loaded==='1';if(!allowAuto||userTouched||isLoaded)return;// Only override placeholder-y names
const S=Core.WPBC_BFB_Sanitize;const base=this.name_from_label(labelVal);const unique=builder.id.ensure_unique_field_name(base,el);el.setAttribute('data-name',unique);const ins=document.getElementById('wpbc_bfb__inspector');const nameCtrl=ins?.querySelector('[data-inspector-key="name"]');if(nameCtrl&&'value'in nameCtrl&&nameCtrl.value!==unique)nameCtrl.value=unique;}};/**
	 * Select_Base (shared base for select-like packs)
	 *
	 * @type {Core.WPBC_BFB_Select_Base}
	 */Core.WPBC_BFB_Select_Base=class extends Core.WPBC_BFB_Field_Base{static template_id=null;// main preview template id
static option_row_template_id='wpbc-bfb-inspector-select-option-row';// row tpl id
static kind='select';static __root_wired=false;static __root_node=null;// Single source of selectors used by the inspector UI.
static ui={list:'.wpbc_bfb__options_list',holder:'.wpbc_bfb__options_state[data-inspector-key="options"]',row:'.wpbc_bfb__options_row',label:'.wpbc_bfb__opt-label',value:'.wpbc_bfb__opt-value',toggle:'.wpbc_bfb__opt-selected-chk',add_btn:'.js-add-option',drag_handle:'.wpbc_bfb__drag-handle',multiple_chk:'.js-opt-multiple[data-inspector-key="multiple"]',default_text:'.js-default-value[data-inspector-key="default_value"]',placeholder_input:'.js-placeholder[data-inspector-key="placeholder"]',placeholder_note:'.js-placeholder-note',size_input:'.inspector__input[data-inspector-key="size"]',// Dropdown menu integration.
menu_root:'.wpbc_ui_el__dropdown',menu_toggle:'[data-toggle="wpbc_dropdown"]',menu_action:'.ul_dropdown_menu_li_action[data-action]',// Value-differs toggle.
value_differs_chk:'.js-value-differs[data-inspector-key="value_differs"]'};/**
		 * Build option value from label.
		 * - If `differs === true` -> generate token (slug-like machine value).
		 * - If `differs === false` -> keep human text; escape only dangerous chars.
		 * @param {string} label
		 * @param {boolean} differs
		 * @returns {string}
		 */static build_value_from_label(label,differs){const S=Core.WPBC_BFB_Sanitize;if(differs){return S&&typeof S.to_token==='function'?S.to_token(String(label||'')):String(label||'').trim().toLowerCase().replace(/\s+/g,'_').replace(/[^\w-]/g,'');}// single-input mode: keep human text; template will escape safely.
return String(label==null?'':label);}/**
		 * Is the “value differs from label” toggle enabled?
		 * @param {HTMLElement} panel
		 * @returns {boolean}
		 */static is_value_differs_enabled(panel){const chk=panel?.querySelector(this.ui.value_differs_chk);return!!(chk&&chk.checked);}/**
		 * Ensure visibility/enabled state of Value inputs based on the toggle.
		 * When disabled -> hide Value inputs and keep them mirrored from Label.
		 * @param {HTMLElement} panel
		 * @returns {void}
		 */static sync_value_inputs_visibility(panel){const differs=this.is_value_differs_enabled(panel);const rows=panel?.querySelectorAll(this.ui.row)||[];for(let i=0;i<rows.length;i++){const r=rows[i];const lbl_in=r.querySelector(this.ui.label);const val_in=r.querySelector(this.ui.value);if(!val_in)continue;if(differs){// Re-enable & show value input
val_in.removeAttribute('disabled');val_in.style.display='';// If we have a cached custom value and the row wasn't edited while OFF, restore it
const hasCache=!!val_in.dataset.cached_value;const userEdited=r.dataset.value_user_touched==='1';if(hasCache&&!userEdited){val_in.value=val_in.dataset.cached_value;}else if(!hasCache){// No cache: if value is just a mirrored label, offer a tokenized default
const lbl=lbl_in?lbl_in.value:'';const mirrored=this.build_value_from_label(lbl,/*differs=*/false);if(val_in.value===mirrored){val_in.value=this.build_value_from_label(lbl,/*differs=*/true);}}}else{// ON -> OFF: cache once, then mirror
if(!val_in.dataset.cached_value){val_in.dataset.cached_value=val_in.value||'';}const lbl=lbl_in?lbl_in.value:'';val_in.value=this.build_value_from_label(lbl,/*differs=*/false);val_in.setAttribute('disabled','disabled');val_in.style.display='none';// NOTE: do NOT mark as user_touched here
}}}/**
		 * Return whether this row’s value has been edited by user.
		 * @param {HTMLElement} row
		 * @returns {boolean}
		 */static is_row_value_user_touched(row){return row?.dataset?.value_user_touched==='1';}/**
		 * Mark this row’s value as edited by user.
		 * @param {HTMLElement} row
		 */static mark_row_value_user_touched(row){if(row)row.dataset.value_user_touched='1';}/**
		 * Initialize “freshness” flags on a row (value untouched).
		 * Call on creation/append of rows.
		 * @param {HTMLElement} row
		 */static init_row_fresh_flags(row){if(row){if(!row.dataset.value_user_touched){row.dataset.value_user_touched='0';}}}// ---- defaults (packs can override) ----
static get_defaults(){return{type:this.kind,label:'Select',name:'',html_id:'',placeholder:'--- Select ---',required:false,multiple:false,size:null,cssclass:'',help:'',default_value:'',options:[{label:'Option 1',value:'Option 1',selected:false},{label:'Option 2',value:'Option 2',selected:false},{label:'Option 3',value:'Option 3',selected:false},{label:'Option 4',value:'Option 4',selected:false}],min_width:'240px'};}// ---- preview render (idempotent) ----
static render(el,data,ctx){if(!el)return;const d=this.normalize_data(data);if(d.min_width!=null){el.dataset.min_width=String(d.min_width);try{el.style.setProperty('--wpbc-col-min',String(d.min_width));}catch(_){}}if(d.html_id!=null)el.dataset.html_id=String(d.html_id||'');if(d.cssclass!=null)el.dataset.cssclass=String(d.cssclass||'');if(d.placeholder!=null)el.dataset.placeholder=String(d.placeholder||'');const tpl=this.get_template(this.template_id);if(typeof tpl!=='function'){el.innerHTML='<div class="wpbc_bfb__error" role="alert">Template not found: '+this.template_id+'.</div>';return;}try{el.innerHTML=tpl(d);}catch(e){window._wpbc?.dev?.error?.('Select_Base.render',e);el.innerHTML='<div class="wpbc_bfb__error" role="alert">Error rendering field preview.</div>';return;}el.dataset.type=d.type||this.kind;el.setAttribute('data-label',d.label!=null?String(d.label):'');try{Core.UI?.WPBC_BFB_Overlay?.ensure?.(ctx?.builder,el);}catch(_){}if(!el.dataset.options&&Array.isArray(d.options)&&d.options.length){try{el.dataset.options=JSON.stringify(d.options);}catch(_){}}}// ---- drop seeding (options + placeholder) ----
static on_field_drop(data,el,meta){try{super.on_field_drop?.(data,el,meta);}catch(_){}const is_drop=meta&&meta.context==='drop';if(is_drop){if(!Array.isArray(data.options)||!data.options.length){const opts=(this.get_defaults().options||[]).map(o=>({label:o.label,value:o.value,selected:!!o.selected}));data.options=opts;try{el.dataset.options=JSON.stringify(opts);el.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'options',value:opts}}));Core.Structure?.update_field_prop?.(el,'options',opts);}catch(_){}}const ph=(data.placeholder??'').toString().trim();if(!ph){const dflt=this.get_defaults().placeholder||'--- Select ---';data.placeholder=dflt;try{el.dataset.placeholder=String(dflt);el.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'placeholder',value:dflt}}));Core.Structure?.update_field_prop?.(el,'placeholder',dflt);}catch(_){}}}}// ==============================
// Inspector helpers (snake_case)
// ==============================
static get_panel_root(el){return el?.closest?.('.wpbc_bfb__inspector__body')||el?.closest?.('.wpbc_bfb__inspector')||null;}static get_list(panel){return panel?panel.querySelector(this.ui.list):null;}static get_holder(panel){return panel?panel.querySelector(this.ui.holder):null;}static make_uid(){return'wpbc_ins_auto_opt_'+Math.random().toString(36).slice(2,10);}static append_row(panel,data){const list=this.get_list(panel);if(!list)return;const idx=list.children.length;const rowd=Object.assign({label:'',value:'',selected:false,index:idx},data||{});if(!rowd.uid)rowd.uid=this.make_uid();const tpl_id=this.option_row_template_id;const tpl=window.wp&&wp.template?wp.template(tpl_id):null;const html=tpl?tpl(rowd):null;// In append_row() -> fallback HTML.
const wrap=document.createElement('div');wrap.innerHTML=html||'<div class="wpbc_bfb__options_row" data-index="'+(rowd.index||0)+'">'+'<span class="wpbc_bfb__drag-handle"><span class="wpbc_icn_drag_indicator"></span></span>'+'<input type="text" class="wpbc_bfb__opt-label" placeholder="Label" value="'+(rowd.label||'')+'">'+'<input type="text" class="wpbc_bfb__opt-value" placeholder="Value" value="'+(rowd.value||'')+'">'+'<div class="wpbc_bfb__opt-selected">'+'<div class="inspector__control wpbc_ui__toggle">'+'<input type="checkbox" class="wpbc_bfb__opt-selected-chk inspector__input" id="'+rowd.uid+'" role="switch" '+(rowd.selected?'checked aria-checked="true"':'aria-checked="false"')+'>'+'<label class="wpbc_ui__toggle_icon_radio" for="'+rowd.uid+'"></label>'+'<label class="wpbc_ui__toggle_label" for="'+rowd.uid+'">Default</label>'+'</div>'+'</div>'+// 3-dot dropdown (uses existing plugin dropdown JS).
'<div class="wpbc_ui_el wpbc_ui_el_container wpbc_ui_el__dropdown">'+'<a href="javascript:void(0)" data-toggle="wpbc_dropdown" aria-expanded="false" class="ul_dropdown_menu_toggle">'+'<i class="menu_icon icon-1x wpbc_icn_more_vert"></i>'+'</a>'+'<ul class="ul_dropdown_menu" role="menu" style="right:0px; left:auto;">'+'<li>'+'<a class="ul_dropdown_menu_li_action" data-action="add_after" href="javascript:void(0)">'+'Add New'+'<i class="menu_icon icon-1x wpbc_icn_add_circle"></i>'+'</a>'+'</li>'+'<li>'+'<a class="ul_dropdown_menu_li_action" data-action="duplicate" href="javascript:void(0)">'+'Duplicate'+'<i class="menu_icon icon-1x wpbc_icn_content_copy"></i>'+'</a>'+'</li>'+'<li class="divider"></li>'+'<li>'+'<a class="ul_dropdown_menu_li_action" data-action="remove" href="javascript:void(0)">'+'Remove'+'<i class="menu_icon icon-1x wpbc_icn_delete_outline"></i>'+'</a>'+'</li>'+'</ul>'+'</div>'+'</div>';const node=wrap.firstElementChild;if(!node){return;}// pre-hide Value input if toggle is OFF **before** appending.
const differs=this.is_value_differs_enabled(panel);const valIn=node.querySelector(this.ui.value);const lblIn=node.querySelector(this.ui.label);if(!differs&&valIn){if(!valIn.dataset.cached_value){valIn.dataset.cached_value=valIn.value||'';}if(lblIn)valIn.value=this.build_value_from_label(lblIn.value,false);valIn.setAttribute('disabled','disabled');valIn.style.display='none';}this.init_row_fresh_flags(node);list.appendChild(node);// Keep your existing post-append sync as a safety net
this.sync_value_inputs_visibility(panel);}static close_dropdown(anchor_el){try{var root=anchor_el?.closest?.(this.ui.menu_root);if(root){// If your dropdown toggler toggles a class like 'open', close it.
root.classList.remove('open');// Or if it relies on aria-expanded on the toggle.
var t=root.querySelector(this.ui.menu_toggle);if(t){t.setAttribute('aria-expanded','false');}}}catch(_){}}static insert_after(new_node,ref_node){if(ref_node?.parentNode){if(ref_node.nextSibling){ref_node.parentNode.insertBefore(new_node,ref_node.nextSibling);}else{ref_node.parentNode.appendChild(new_node);}}}static commit_options(panel){const list=this.get_list(panel);const holder=this.get_holder(panel);if(!list||!holder)return;const differs=this.is_value_differs_enabled(panel);const rows=list.querySelectorAll(this.ui.row);const options=[];for(let i=0;i<rows.length;i++){const r=rows[i];const lbl_in=r.querySelector(this.ui.label);const val_in=r.querySelector(this.ui.value);const chk=r.querySelector(this.ui.toggle);const lbl=lbl_in&&lbl_in.value||'';let val=val_in&&val_in.value||'';// If single-input mode -> hard mirror to label.
if(!differs){// single-input mode: mirror Label, minimal escaping (no slug).
val=this.build_value_from_label(lbl,/*differs=*/false);if(val_in){val_in.value=val;// keep hidden input in sync for any previews/debug.
}}const sel=!!(chk&&chk.checked);options.push({label:lbl,value:val,selected:sel});}try{holder.value=JSON.stringify(options);holder.dispatchEvent(new Event('input',{bubbles:true}));holder.dispatchEvent(new Event('change',{bubbles:true}));panel.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'options',value:options}}));}catch(_){}this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);// Mirror to the selected field element so canvas/export sees current options immediately.
const field=panel.__selectbase_field||document.querySelector('.wpbc_bfb__field.is-selected, .wpbc_bfb__field--selected');if(field){try{field.dataset.options=JSON.stringify(options);}catch(_){}Core.Structure?.update_field_prop?.(field,'options',options);field.dispatchEvent(new CustomEvent('wpbc_bfb_field_data_changed',{bubbles:true,detail:{key:'options',value:options}}));}}static ensure_sortable(panel){const list=this.get_list(panel);if(!list){return;}try{const existing=window.Sortable?.get?.(list);if(existing){return;}const builder=window.wpbc_bfb_api?.get_builder?.()||window.wpbc_bfb||null;// Prefer the shared Sortable manager so the sidebar list uses
// the dedicated "simple_list" config instead of the canvas config.
if(builder&&builder.sortable&&typeof builder.sortable.ensure==='function'){builder.sortable.ensure(list,'canvas',{sortable_kind:'simple_list',handle_selector:this.ui.drag_handle,draggable_selector:this.ui.row,onUpdate:()=>{this.commit_options(panel);}});}else if(window.Sortable?.create){// Fallback if builder is not ready for some reason.
window.Sortable.create(list,{handle:this.ui.drag_handle,draggable:this.ui.row,animation:120,forceFallback:true,fallbackOnBody:false,fallbackTolerance:8,removeCloneOnHide:true,onUpdate:()=>{this.commit_options(panel);}});}list.dataset.sortable_init='1';}catch(e){window._wpbc?.dev?.error?.('Select_Base.ensure_sortable',e);}}static rebuild_if_empty(panel){const list=this.get_list(panel);const holder=this.get_holder(panel);if(!list||!holder||list.children.length)return;let data=[];try{data=JSON.parse(holder.value||'[]');}catch(_){data=[];}if(!Array.isArray(data)||!data.length){data=(this.get_defaults().options||[]).slice(0);try{holder.value=JSON.stringify(data);holder.dispatchEvent(new Event('input',{bubbles:true}));holder.dispatchEvent(new Event('change',{bubbles:true}));}catch(_){}}for(let i=0;i<data.length;i++){this.append_row(panel,{label:data[i]?.label||'',value:data[i]?.value||'',selected:!!data[i]?.selected,index:i,uid:this.make_uid()});}this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);this.sync_value_inputs_visibility(panel);}static has_row_defaults(panel){const checks=panel?.querySelectorAll(this.ui.toggle);if(!checks?.length)return false;for(let i=0;i<checks.length;i++)if(checks[i].checked)return true;return false;}static is_multiple_enabled(panel){const chk=panel?.querySelector(this.ui.multiple_chk);return!!(chk&&chk.checked);}static has_text_default_value(panel){const dv=panel?.querySelector(this.ui.default_text);return!!(dv&&String(dv.value||'').trim().length);}static sync_default_value_lock(panel){const input=panel?.querySelector(this.ui.default_text);const note=panel?.querySelector('.js-default-value-note');if(!input)return;const lock=this.has_row_defaults(panel);input.disabled=!!lock;if(lock){input.setAttribute('aria-disabled','true');if(note)note.style.display='';}else{input.removeAttribute('aria-disabled');if(note)note.style.display='none';}}static sync_placeholder_lock(panel){const input=panel?.querySelector(this.ui.placeholder_input);const note=panel?.querySelector(this.ui.placeholder_note);// NEW: compute multiple and toggle row visibility
const isMultiple=this.is_multiple_enabled(panel);const placeholderRow=input?.closest('.inspector__row')||null;const sizeInput=panel?.querySelector(this.ui.size_input)||null;const sizeRow=sizeInput?.closest('.inspector__row')||null;// Show placeholder only for single-select; show size only for multiple
if(placeholderRow)placeholderRow.style.display=isMultiple?'none':'';if(sizeRow)sizeRow.style.display=isMultiple?'':'none';// Existing behavior (keep as-is)
if(!input)return;const lock=isMultiple||this.has_row_defaults(panel)||this.has_text_default_value(panel);if(note&&!note.id)note.id='wpbc_placeholder_note_'+Math.random().toString(36).slice(2,10);input.disabled=!!lock;if(lock){input.setAttribute('aria-disabled','true');if(note){note.style.display='';input.setAttribute('aria-describedby',note.id);}}else{input.removeAttribute('aria-disabled');input.removeAttribute('aria-describedby');if(note)note.style.display='none';}}static enforce_single_default(panel,clicked){if(this.is_multiple_enabled(panel))return;const checks=panel?.querySelectorAll(this.ui.toggle);if(!checks?.length)return;if(clicked&&clicked.checked){for(let i=0;i<checks.length;i++)if(checks[i]!==clicked){checks[i].checked=false;checks[i].setAttribute('aria-checked','false');}clicked.setAttribute('aria-checked','true');return;}let kept=false;for(let j=0;j<checks.length;j++)if(checks[j].checked){if(!kept){kept=true;}else{checks[j].checked=false;checks[j].setAttribute('aria-checked','false');}}this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);}// ---- one-time bootstrap of a panel ----
static bootstrap_panel(panel){if(!panel)return;if(!panel.querySelector('.wpbc_bfb__options_editor'))return;// only select-like UIs
if(panel.dataset.selectbase_bootstrapped==='1'){this.ensure_sortable(panel);return;}this.rebuild_if_empty(panel);this.ensure_sortable(panel);panel.dataset.selectbase_bootstrapped='1';this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);this.sync_value_inputs_visibility(panel);}// ---- hook into inspector lifecycle (fires ONCE) ----
static wire_once(){if(Core.__selectbase_wired)return;Core.__selectbase_wired=true;const on_ready_or_render=ev=>{const panel=ev?.detail?.panel;const field=ev?.detail?.el||ev?.detail?.field||null;if(!panel)return;if(field)panel.__selectbase_field=field;this.bootstrap_panel(panel);// If the inspector root was remounted, ensure root listeners are (re)bound.
this.wire_root_listeners();};document.addEventListener('wpbc_bfb_inspector_ready',on_ready_or_render);document.addEventListener('wpbc_bfb_inspector_render',on_ready_or_render);this.wire_root_listeners();}static wire_root_listeners(){// If already wired AND the stored root is still in the DOM, bail out.
if(this.__root_wired&&this.__root_node?.isConnected)return;const root=document.getElementById('wpbc_bfb__inspector');if(!root){// Root missing (e.g., SPA re-render) — clear flags so we can wire later.
this.__root_wired=false;this.__root_node=null;return;}this.__root_node=root;this.__root_wired=true;root.dataset.selectbase_root_wired='1';const get_panel=target=>target?.closest?.('.wpbc_bfb__inspector__body')||root.querySelector('.wpbc_bfb__inspector__body')||null;// Click handlers: add / delete / duplicate
root.addEventListener('click',e=>{const panel=get_panel(e.target);if(!panel)return;this.bootstrap_panel(panel);const ui=this.ui;// Existing "Add option" button (top toolbar)
const add=e.target.closest?.(ui.add_btn);if(add){this.append_row(panel,{label:'',value:'',selected:false});this.commit_options(panel);this.sync_value_inputs_visibility(panel);return;}// Dropdown menu actions.
const menu_action=e.target.closest?.(ui.menu_action);if(menu_action){e.preventDefault();e.stopPropagation();const action=(menu_action.getAttribute('data-action')||'').toLowerCase();const row=menu_action.closest?.(ui.row);if(!row){this.close_dropdown(menu_action);return;}if('add_after'===action){// Add empty row after current
const prev_count=this.get_list(panel)?.children.length||0;this.append_row(panel,{label:'',value:'',selected:false});// Move the newly added last row just after current row to preserve "add after"
const list=this.get_list(panel);if(list&&list.lastElementChild&&list.lastElementChild!==row){this.insert_after(list.lastElementChild,row);}this.commit_options(panel);this.sync_value_inputs_visibility(panel);}else if('duplicate'===action){const lbl=(row.querySelector(ui.label)||{}).value||'';const val=(row.querySelector(ui.value)||{}).value||'';const sel=!!(row.querySelector(ui.toggle)||{}).checked;this.append_row(panel,{label:lbl,value:val,selected:sel,uid:this.make_uid()});// Place the new row right after the current.
const list=this.get_list(panel);if(list&&list.lastElementChild&&list.lastElementChild!==row){this.insert_after(list.lastElementChild,row);}this.enforce_single_default(panel,null);this.commit_options(panel);this.sync_value_inputs_visibility(panel);}else if('remove'===action){if(row&&row.parentNode)row.parentNode.removeChild(row);this.commit_options(panel);this.sync_value_inputs_visibility(panel);}this.close_dropdown(menu_action);return;}},true);// Input delegation.
root.addEventListener('input',e=>{const panel=get_panel(e.target);if(!panel){return;}const ui=this.ui;const is_label_or_value=e.target.classList?.contains('wpbc_bfb__opt-label')||e.target.classList?.contains('wpbc_bfb__opt-value');const is_toggle=e.target.classList?.contains('wpbc_bfb__opt-selected-chk');const is_multiple=e.target.matches?.(ui.multiple_chk);const is_default_text=e.target.matches?.(ui.default_text);const is_value_differs=e.target.matches?.(ui.value_differs_chk);// Handle "value differs" toggle live
if(is_value_differs){this.sync_value_inputs_visibility(panel);this.commit_options(panel);return;}// Track when the user edits VALUE explicitly
if(e.target.classList?.contains('wpbc_bfb__opt-value')){const row=e.target.closest(this.ui.row);this.mark_row_value_user_touched(row);// Keep the cache updated so toggling OFF/ON later restores the latest custom value
e.target.dataset.cached_value=e.target.value||'';}// Auto-fill VALUE from LABEL if value is fresh (and differs is ON); if differs is OFF, we mirror anyway in commit
if(e.target.classList?.contains('wpbc_bfb__opt-label')){const row=e.target.closest(ui.row);const val_in=row?.querySelector(ui.value);const differs=this.is_value_differs_enabled(panel);if(val_in){if(!differs){// single-input mode: mirror human label with minimal escaping
val_in.value=this.build_value_from_label(e.target.value,false);}else if(!this.is_row_value_user_touched(row)){// separate-value mode, only while fresh
val_in.value=this.build_value_from_label(e.target.value,true);}}}if(is_label_or_value||is_toggle||is_multiple){if(is_toggle)e.target.setAttribute('aria-checked',e.target.checked?'true':'false');if(is_toggle||is_multiple)this.enforce_single_default(panel,is_toggle?e.target:null);this.commit_options(panel);}if(is_default_text){this.sync_default_value_lock(panel);this.sync_placeholder_lock(panel);const holder=this.get_holder(panel);if(holder){holder.dispatchEvent(new Event('input',{bubbles:true}));holder.dispatchEvent(new Event('change',{bubbles:true}));}}},true);// Change delegation
root.addEventListener('change',e=>{const panel=get_panel(e.target);if(!panel)return;const ui=this.ui;const is_toggle=e.target.classList?.contains('wpbc_bfb__opt-selected-chk');const is_multi=e.target.matches?.(ui.multiple_chk);if(!is_toggle&&!is_multi)return;if(is_toggle)e.target.setAttribute('aria-checked',e.target.checked?'true':'false');this.enforce_single_default(panel,is_toggle?e.target:null);this.commit_options(panel);},true);// Lazy bootstrap
root.addEventListener('mouseenter',e=>{const panel=get_panel(e.target);if(panel&&e.target?.closest?.(this.ui.list))this.bootstrap_panel(panel);},true);root.addEventListener('mousedown',e=>{const panel=get_panel(e.target);if(panel&&e.target?.closest?.(this.ui.drag_handle))this.bootstrap_panel(panel);},true);}};try{Core.WPBC_BFB_Select_Base.wire_once();}catch(_){}// Try immediately (if root is already in DOM), then again on DOMContentLoaded.
Core.WPBC_BFB_Select_Base.wire_root_listeners();document.addEventListener('DOMContentLoaded',()=>{Core.WPBC_BFB_Select_Base.wire_root_listeners();});})(window);// ---------------------------------------------------------------------------------------------------------------------
// == File  /includes/page-form-builder/_out/core/bfb-ui.js == | 2025-09-10 15:47
// ---------------------------------------------------------------------------------------------------------------------
(function(w,d){'use strict';// Single global namespace (idempotent & load-order safe).
const Core=w.WPBC_BFB_Core=w.WPBC_BFB_Core||{};const UI=Core.UI=Core.UI||{};// --- Highlight Element,  like Generator brn  -  Tiny UI helpers ------------------------------------
UI._pulse_timers=UI._pulse_timers||new Map();// el -> timer_id
UI._pulse_meta=UI._pulse_meta||new Map();// el -> { token, last_ts, debounce_id, color_set }
// Pulse tuning (milliseconds).
UI.PULSE_THROTTLE_MS=Number.isFinite(UI.PULSE_THROTTLE_MS)?UI.PULSE_THROTTLE_MS:500;UI.PULSE_DEBOUNCE_MS=Number.isFinite(UI.PULSE_DEBOUNCE_MS)?UI.PULSE_DEBOUNCE_MS:750;// Debounce STRUCTURE_CHANGE for continuous inspector controls (sliders / scrubbing).
// Tune: 180..350 is usually a sweet spot.
UI.STRUCTURE_CHANGE_DEBOUNCE_MS=Number.isFinite(UI.STRUCTURE_CHANGE_DEBOUNCE_MS)?UI.STRUCTURE_CHANGE_DEBOUNCE_MS:180;// Change this to tune speed: 50..120 ms is a good range. Can be configured in <div data-len-group data-len-throttle="180">...</div>.
UI.VALUE_SLIDER_THROTTLE_MS=Number.isFinite(UI.VALUE_SLIDER_THROTTLE_MS)?UI.VALUE_SLIDER_THROTTLE_MS:120;/**
	 * Cancel any running pulse sequence for an element.
	 * Uses token invalidation so already-scheduled callbacks become no-ops.
	 *
	 * @param {HTMLElement} el
	 */UI.cancel_pulse=function(el){if(!el){return;}try{clearTimeout(UI._pulse_timers.get(el));}catch(_){}UI._pulse_timers.delete(el);var meta=UI._pulse_meta.get(el)||{};meta.token=(Number.isFinite(meta.token)?meta.token:0)+1;meta.color_set=false;try{el.classList.remove('wpbc_bfb__scroll-pulse','wpbc_bfb__highlight-pulse');}catch(_){}try{el.style.removeProperty('--wpbc-bfb-pulse-color');}catch(_){}UI._pulse_meta.set(el,meta);try{clearTimeout(meta.debounce_id);}catch(_){}meta.debounce_id=0;};/**
	 * Force-restart a CSS animation on a class.
	 * @param {HTMLElement} el
	 * @param {string} cls
	 */UI._restart_css_animation=function(el,cls){if(!el){return;}try{el.classList.remove(cls);}catch(_){}// Force reflow so the next add() retriggers the keyframes.
void el.offsetWidth;try{el.classList.add(cls);}catch(_){}};/**
		Single pulse (back-compat).
		@param {HTMLElement} el
		@param {number} dur_ms
	 */UI.pulse_once=function(el,dur_ms){if(!el){return;}var cls='wpbc_bfb__scroll-pulse';var ms=Number.isFinite(dur_ms)?dur_ms:700;UI.cancel_pulse(el);var meta=UI._pulse_meta.get(el)||{};var token=(Number.isFinite(meta.token)?meta.token:0)+1;meta.token=token;UI._pulse_meta.set(el,meta);UI._restart_css_animation(el,cls);var t=setTimeout(function(){// ignore if a newer pulse started.
var m=UI._pulse_meta.get(el)||{};if(m.token!==token){return;}try{el.classList.remove(cls);}catch(_){}UI._pulse_timers.delete(el);},ms);UI._pulse_timers.set(el,t);};/**
		Multi-blink sequence with optional per-call color override.
		@param {HTMLElement} el
		@param {number} [times=3]
		@param {number} [on_ms=280]
		@param {number} [off_ms=180]
		@param {string} [hex_color] Optional CSS color (e.g. '#ff4d4f' or 'rgb(...)').
	 */UI.pulse_sequence=function(el,times,on_ms,off_ms,hex_color){if(!el||!d.body.contains(el)){return;}var cls='wpbc_bfb__highlight-pulse';var count=Number.isFinite(times)?times:2;var on=Number.isFinite(on_ms)?on_ms:280;var off=Number.isFinite(off_ms)?off_ms:180;// Throttle: avoid reflow spam if called repeatedly while typing/dragging.
var meta=UI._pulse_meta.get(el)||{};var now=Date.now();var throttle_ms=Number.isFinite(UI.PULSE_THROTTLE_MS)?UI.PULSE_THROTTLE_MS:120;if(Number.isFinite(meta.last_ts)&&now-meta.last_ts<throttle_ms){return;}meta.last_ts=now;// cancel any running pulse and reset class (token invalidation).
UI.cancel_pulse(el);// new token for this run
var token=(Number.isFinite(meta.token)?meta.token:0)+1;meta.token=token;var have_color=!!hex_color&&typeof hex_color==='string';if(have_color){try{el.style.setProperty('--wpbc-bfb-pulse-color',hex_color);}catch(_){}meta.color_set=true;}UI._pulse_meta.set(el,meta);var i=0;(function tick(){var m=UI._pulse_meta.get(el)||{};if(m.token!==token){// canceled/replaced
return;}if(i>=count){UI._pulse_timers.delete(el);if(have_color){try{el.style.removeProperty('--wpbc-bfb-pulse-color');}catch(_){}}return;}UI._restart_css_animation(el,cls);UI._pulse_timers.set(el,setTimeout(function(){// ON -> OFF
var m2=UI._pulse_meta.get(el)||{};if(m2.token!==token){return;}try{el.classList.remove(cls);}catch(_){}UI._pulse_timers.set(el,setTimeout(function(){// OFF gap -> next
var m3=UI._pulse_meta.get(el)||{};if(m3.token!==token){return;}i++;tick();},off));},on));})();};/**
	 * Debounced query + pulse.
	 * Useful for `input` events (sliders / typing) to avoid forced reflow spam.
	 *
	 * @param {HTMLElement|string} root_or_selector
	 * @param {string} selector
	 * @param {number} wait_ms
	 * @param {number} [a]
	 * @param {number} [b]
	 * @param {number} [c]
	 * @param {string} [color]
	 */UI.pulse_query_debounced=function(root_or_selector,selector,wait_ms,a,b,c,color){var root=typeof root_or_selector==='string'?d:root_or_selector||d;var sel=typeof root_or_selector==='string'?root_or_selector:selector;if(!sel){return;}var el=root.querySelector(sel);if(!el){return;}var def_ms=Number.isFinite(UI.PULSE_DEBOUNCE_MS)?UI.PULSE_DEBOUNCE_MS:120;var ms=Number.isFinite(wait_ms)?wait_ms:def_ms;var meta=UI._pulse_meta.get(el)||{};try{clearTimeout(meta.debounce_id);}catch(_){}meta.debounce_id=setTimeout(function(){UI.pulse_sequence(el,a,b,c,color);},ms);UI._pulse_meta.set(el,meta);};/**
		Query + pulse:
		(BC) If only 3rd arg is a number and no 4th/5th -> single long pulse.
		Otherwise -> strong sequence (defaults 3×280/180).
		Optional 6th arg: color.
		@param {HTMLElement|string} root_or_selector
		@param {string} [selector]
		@param {number} [a]
		@param {number} [b]

		@param {number} [c]

		@param {string} [color]
	 */UI.pulse_query=function(root_or_selector,selector,a,b,c,color){var root=typeof root_or_selector==='string'?d:root_or_selector||d;var sel=typeof root_or_selector==='string'?root_or_selector:selector;if(!sel){return;}var el=root.querySelector(sel);if(!el){return;}// Back-compat: UI.pulseQuery(root, sel, dur_ms)
if(Number.isFinite(a)&&b===undefined&&c===undefined){return UI.pulse_once(el,a);}// New: sequence; params optional; supports optional color.
UI.pulse_sequence(el,a,b,c,color);};/**
	Convenience helper (snake_case) to call a strong pulse with options.

	@param {HTMLElement} el

	@param {Object} [opts]

	@param {number} [opts.times=3]

	@param {number} [opts.on_ms=280]

	@param {number} [opts.off_ms=180]

	@param {string} [opts.color]
	 */UI.pulse_sequence_strong=function(el,opts){opts=opts||{};UI.pulse_sequence(el,Number.isFinite(opts.times)?opts.times:3,Number.isFinite(opts.on_ms)?opts.on_ms:280,Number.isFinite(opts.off_ms)?opts.off_ms:180,opts.color);};/**
	 * Base class for BFB modules.
	 */UI.WPBC_BFB_Module=class{/** @param {WPBC_Form_Builder} builder */constructor(builder){this.builder=builder;}/** Initialize the module. */init(){}/** Cleanup the module. */destroy(){}};/**
	 * Central overlay/controls manager for fields/sections.
	 * Pure UI composition; all actions route back into the builder instance.
	 */UI.WPBC_BFB_Overlay=class{/**
		 * Synchronize every overlay settings button with the real Inspector state.
		 *
		 * A selected canvas item can remain selected while another right-bar panel is
		 * visible. Combining both states prevents a stale pressed button after the
		 * administrator switches away from the Inspector.
		 *
		 * @param {WPBC_Form_Builder} builder - Active Form Builder instance.
		 * @param {HTMLButtonElement[]|NodeListOf<HTMLButtonElement>|null} [settings_buttons=null]
		 *     Optional bounded controls to reconcile during incremental rendering.
		 * @returns {void}
		 */static sync_settings_button_states(builder,settings_buttons=null){const pages_container=builder?.pages_container;if(!pages_container?.querySelectorAll){return;}const inspector=document.getElementById('wpbc_bfb__inspector');const inspector_is_open=!!inspector&&!inspector.hasAttribute('hidden')&&inspector.getAttribute('aria-hidden')!=='true';const selectable_query=`${Core.WPBC_BFB_DOM.SELECTORS.field}, ${Core.WPBC_BFB_DOM.SELECTORS.section}`;const buttons=settings_buttons||pages_container.querySelectorAll('.wpbc_bfb__settings-btn');Array.from(buttons).forEach(settings_button=>{const owner=settings_button.closest(selectable_query);const is_pressed=inspector_is_open&&!!owner?.classList?.contains(Core.WPBC_BFB_DOM.CLASSES.selected);settings_button.setAttribute('aria-pressed',is_pressed?'true':'false');});}/**
		 * Ensure an overlay exists and is wired up on the element.
		 * @param {WPBC_Form_Builder} builder
		 * @param {HTMLElement} el - field or section element
		 */static ensure(builder,el){if(!el){return;}const isSection=el.classList.contains('wpbc_bfb__section');// let overlay = el.querySelector( Core.WPBC_BFB_DOM.SELECTORS.overlay );
let overlay=el.querySelector(`:scope > ${Core.WPBC_BFB_DOM.SELECTORS.overlay}`);if(!overlay){overlay=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__overlay-controls');el.prepend(overlay);}// Drag handle.
if(!overlay.querySelector('.wpbc_bfb__drag-handle')){const dragClass=isSection?'wpbc_bfb__drag-handle section-drag-handle':'wpbc_bfb__drag-handle';overlay.appendChild(Core.WPBC_Form_Builder_Helper.create_element('span',dragClass,'<span class="wpbc_icn_drag_indicator"></span>'));}// SETTINGS button (shown for both fields & sections).
let settings_btn=overlay.querySelector('.wpbc_bfb__settings-btn');if(!settings_btn){settings_btn=Core.WPBC_Form_Builder_Helper.create_element('button','wpbc_bfb__settings-btn','<i class="menu_icon icon-1x wpbc_icn_near_me wpbc_icn_rotate_270"></i>');settings_btn.type='button';settings_btn.title='Open settings';settings_btn.setAttribute('aria-label',settings_btn.title);settings_btn.setAttribute('aria-controls','wpbc_bfb__inspector');settings_btn.setAttribute('aria-pressed','false');settings_btn.onclick=e=>{e.preventDefault();// Select THIS element and scroll it into view.
builder.select_field(el,{scrollIntoView:true});// Auto-open Inspector from the overlay “Settings” button.
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__inspector',tab_id:'wpbc_tab_inspector'});// Try to bring the inspector into view / focus first input.
const ins=document.getElementById('wpbc_bfb__inspector');if(ins){ins.scrollIntoView({behavior:'smooth',block:'nearest'});// Focus first interactive control (best-effort).
setTimeout(()=>{const focusable=ins.querySelector('input,select,textarea,button,[contenteditable],[tabindex]:not([tabindex="-1"])');focusable?.focus?.();},260);}};overlay.appendChild(settings_btn);}overlay.setAttribute('role','toolbar');overlay.setAttribute('aria-label',el.classList.contains('wpbc_bfb__section')?'Section tools':'Field tools');UI.WPBC_BFB_Overlay.sync_settings_button_states(builder,[settings_btn]);return overlay;}};/**
	 * WPBC Layout Chips helper - visual layout picker (chips), e.g., "50%/50%", to a section overlay.
	 *
	 * Renders Equal/Presets/Custom chips into a host container and wires them to apply the layout.
	 */UI.WPBC_BFB_Layout_Chips=class{/** Read per-column min (px) from CSS var set by the guard. */static _get_col_min_px(col){const v=getComputedStyle(col).getPropertyValue('--wpbc-col-min')||'0';const n=parseFloat(v);return Number.isFinite(n)?Math.max(0,n):0;}/**
		 * Turn raw weights (e.g. [1,1], [2,1,1]) into effective "available-%" bases that
		 * (a) sum to the row's available %, and (b) meet every column's min px.
		 * Returns an array of bases (numbers) or null if impossible to satisfy mins.
		 */static _fit_weights_respecting_min(builder,row,weights){const cols=Array.from(row.querySelectorAll(':scope > .wpbc_bfb__column'));const n=cols.length;if(!n)return null;if(!Array.isArray(weights)||weights.length!==n)return null;// available % after gaps (from LayoutService)
const gp=builder.col_gap_percent;const eff=builder.layout.compute_effective_bases_from_row(row,gp);const availPct=eff.available;// e.g. 94 if 2 cols and 3% gap
const rowPx=row.getBoundingClientRect().width;const availPx=rowPx*(availPct/100);// collect minima in % of "available"
const minPct=cols.map(c=>{const minPx=UI.WPBC_BFB_Layout_Chips._get_col_min_px(c);if(availPx<=0)return 0;return minPx/availPx*availPct;});// If mins alone don't fit, bail.
const sumMin=minPct.reduce((a,b)=>a+b,0);if(sumMin>availPct-1e-6){return null;// impossible to respect mins; don't apply preset
}// Target percentages from weights, normalized to availPct.
const wSum=weights.reduce((a,w)=>a+(Number(w)||0),0)||n;const targetPct=weights.map(w=>(Number(w)||0)/wSum*availPct);// Lock columns that would be below min, then distribute the remainder
// across the remaining columns proportionally to their targetPct.
const locked=new Array(n).fill(false);let lockedSum=0;for(let i=0;i<n;i++){if(targetPct[i]<minPct[i]){locked[i]=true;lockedSum+=minPct[i];}}let remaining=availPct-lockedSum;const freeIdx=[];let freeTargetSum=0;for(let i=0;i<n;i++){if(!locked[i]){freeIdx.push(i);freeTargetSum+=targetPct[i];}}const result=new Array(n).fill(0);// Seed locked with their minima.
for(let i=0;i<n;i++){if(locked[i])result[i]=minPct[i];}if(freeIdx.length===0){// everything locked exactly at min; any leftover (shouldn't happen)
// would be ignored to keep simplicity and stability.
return result;}if(remaining<=0){// nothing left to distribute; keep exactly mins on locked,
// nothing for free (degenerate but consistent)
return result;}if(freeTargetSum<=0){// distribute equally among free columns
const each=remaining/freeIdx.length;freeIdx.forEach(i=>result[i]=each);return result;}// Distribute remaining proportionally to free columns' targetPct
freeIdx.forEach(i=>{result[i]=remaining*(targetPct[i]/freeTargetSum);});return result;}/** Apply a preset but guard it by minima; returns true if applied, false if skipped. */static _apply_preset_with_min_guard(builder,section_el,weights){const row=section_el.querySelector(':scope > .wpbc_bfb__row');if(!row)return false;const fitted=UI.WPBC_BFB_Layout_Chips._fit_weights_respecting_min(builder,row,weights);if(!fitted){builder?._announce?.('Not enough space for this layout because of fields’ minimum widths.');return false;}// `fitted` already sums to the row’s available %, so we can apply bases directly.
builder.layout.apply_bases_to_row(row,fitted);return true;}/**
		 * Build and append layout chips for a section.
		 *
		 * @param {WPBC_Form_Builder} builder - The form builder instance.
		 * @param {HTMLElement} section_el - The .wpbc_bfb__section element.
		 * @param {HTMLElement} host_el - Container where chips should be rendered.
		 * @returns {void}
		 */static render_for_section(builder,section_el,host_el){if(!builder||!section_el||!host_el){return;}const row=section_el.querySelector(':scope > .wpbc_bfb__row');if(!row){return;}const cols=row.querySelectorAll(':scope > .wpbc_bfb__column').length||1;// Clear host.
host_el.innerHTML='';// Equal chip.
host_el.appendChild(UI.WPBC_BFB_Layout_Chips._make_chip(builder,section_el,Array(cols).fill(1),'Equal'));// Presets based on column count.
const presets=builder.layout.build_presets_for_columns(cols);presets.forEach(weights=>{host_el.appendChild(UI.WPBC_BFB_Layout_Chips._make_chip(builder,section_el,weights,null));});// Custom chip.
const customBtn=document.createElement('button');customBtn.type='button';customBtn.className='wpbc_bfb__layout_chip';customBtn.textContent='Custom…';customBtn.title=`Enter ${cols} percentages`;customBtn.addEventListener('click',()=>{const example=cols===2?'50,50':cols===3?'20,60,20':'25,25,25,25';const text=prompt(`Enter ${cols} percentages (comma or space separated):`,example);if(text==null)return;const weights=builder.layout.parse_weights(text);if(weights.length!==cols){alert(`Please enter exactly ${cols} numbers.`);return;}// OLD:
// builder.layout.apply_layout_preset( section_el, weights, builder.col_gap_percent );
// Guarded apply:.
if(!UI.WPBC_BFB_Layout_Chips._apply_preset_with_min_guard(builder,section_el,weights)){return;}host_el.querySelectorAll('.wpbc_bfb__layout_chip').forEach(c=>c.classList.remove('is-active'));customBtn.classList.add('is-active');});host_el.appendChild(customBtn);}/**
		 * Create a single layout chip button.
		 *
		 * @private
		 * @param {WPBC_Form_Builder} builder
		 * @param {HTMLElement} section_el
		 * @param {number[]} weights
		 * @param {string|null} label
		 * @returns {HTMLButtonElement}
		 */static _make_chip(builder,section_el,weights,label=null){const btn=document.createElement('button');btn.type='button';btn.className='wpbc_bfb__layout_chip';const title=label||builder.layout.format_preset_label(weights);btn.title=title;// Visual miniature.
const vis=document.createElement('div');vis.className='wpbc_bfb__layout_chip-vis';const sum=weights.reduce((a,b)=>a+(Number(b)||0),0)||1;weights.forEach(w=>{const bar=document.createElement('span');bar.style.flex=`0 0 calc( ${((Number(w)||0)/sum*100).toFixed(3)}% - 1.5px )`;vis.appendChild(bar);});btn.appendChild(vis);const txt=document.createElement('span');txt.className='wpbc_bfb__layout_chip-label';txt.textContent=label||builder.layout.format_preset_label(weights);btn.appendChild(txt);btn.addEventListener('click',()=>{// OLD:
// builder.layout.apply_layout_preset( section_el, weights, builder.col_gap_percent );
// NEW:
if(!UI.WPBC_BFB_Layout_Chips._apply_preset_with_min_guard(builder,section_el,weights)){return;// do not toggle active if we didn't change layout
}btn.parentElement?.querySelectorAll('.wpbc_bfb__layout_chip').forEach(c=>c.classList.remove('is-active'));btn.classList.add('is-active');});return btn;}};/**
	 * Selection controller for fields and announcements.
	 */UI.WPBC_BFB_Selection_Controller=class extends UI.WPBC_BFB_Module{init(){this._selected_uid=null;this.builder.select_field=this.select_field.bind(this);this.builder.get_selected_field=this.get_selected_field.bind(this);this._on_clear=this.on_clear.bind(this);this._on_panel_shown=this._sync_settings_button_states.bind(this);// Centralized delete command used by keyboard + inspector + overlay.
this.builder.delete_item=el=>{if(!el){return null;}const b=this.builder;const neighbor=b._find_neighbor_selectable?.(el)||null;el.remove();// Use local Core constants (not a global) to avoid ReferenceErrors.
b.bus?.emit?.(Core.WPBC_BFB_Events.FIELD_REMOVE,{el,id:el?.dataset?.id,uid:el?.dataset?.uid});b.usage?.update_palette_ui?.();// Notify generic structure listeners, too:
b.bus?.emit?.(Core.WPBC_BFB_Events.STRUCTURE_CHANGE,{reason:'delete',el});// Defer selection a tick so the DOM is fully settled before Inspector hydrates.
requestAnimationFrame(()=>{// This calls inspector.bind_to_field() and opens the Inspector panel.
b.select_field?.(neighbor||null,{scrollIntoView:!!neighbor});});return neighbor;};this.builder.bus.on(Core.WPBC_BFB_Events.CLEAR_SELECTION,this._on_clear);this.builder.bus.on(Core.WPBC_BFB_Events.STRUCTURE_LOADED,this._on_clear);// delegated click selection (capture ensures we win before bubbling to containers).
this._on_canvas_click=this._handle_canvas_click.bind(this);this.builder.pages_container.addEventListener('click',this._on_canvas_click,true);document.addEventListener('wpbc_bfb:panel_shown',this._on_panel_shown);this._sync_settings_button_states();}destroy(){this.builder.bus.off(Core.WPBC_BFB_Events.CLEAR_SELECTION,this._on_clear);if(this._on_canvas_click){this.builder.pages_container.removeEventListener('click',this._on_canvas_click,true);this._on_canvas_click=null;}if(this._on_panel_shown){document.removeEventListener('wpbc_bfb:panel_shown',this._on_panel_shown);this._on_panel_shown=null;}}/**
		 * Refresh overlay button state after selection or right-bar panel changes.
		 *
		 * @returns {void}
		 */_sync_settings_button_states(){UI.WPBC_BFB_Overlay.sync_settings_button_states(this.builder);}/**
		 * Delegated canvas click -> select closest field/section (inner beats outer).
		 * @private
		 * @param {MouseEvent} e
		 */_handle_canvas_click(e){const root=this.builder.pages_container;if(!root)return;// Ignore clicks on controls/handles/resizers, etc.
const IGNORE=['.wpbc_bfb__overlay-controls','.wpbc_bfb__layout_picker','.wpbc_bfb__drag-handle','.wpbc_bfb__field-remove-btn','.wpbc_bfb__field-move-up','.wpbc_bfb__field-move-down','.wpbc_bfb__column-resizer'].join(',');if(e.target.closest(IGNORE)){return;// let those controls do their own thing.
}// Find the closest selectable (field OR section) from the click target.
let hit=e.target.closest?.(`${Core.WPBC_BFB_DOM.SELECTORS.validField}, ${Core.WPBC_BFB_DOM.SELECTORS.section}, .wpbc_bfb__column`);if(!hit||!root.contains(hit)){this.select_field(null);// Clear selection on blank click.
return;// Empty space is handled elsewhere.
}// NEW: if user clicked a COLUMN -> remember tab key on its SECTION, but still select the section.
let preselect_tab_key=null;if(hit.classList.contains('wpbc_bfb__column')){const row=hit.closest('.wpbc_bfb__row');const cols=row?Array.from(row.querySelectorAll(':scope > .wpbc_bfb__column')):[];const idx=Math.max(0,cols.indexOf(hit));const sec=hit.closest('.wpbc_bfb__section');if(sec){preselect_tab_key=String(idx+1);// tabs are 1-based in ui-column-styles.js
// Hint for the renderer (it reads this BEFORE rendering and restores the tab).
sec.dataset.col_styles_active_tab=preselect_tab_key;// promote selection to the section (same UX as before).
hit=sec;// NEW: visually mark which column is being edited
if(UI&&UI.WPBC_BFB_Column_Styles&&UI.WPBC_BFB_Column_Styles.set_selected_col_flag){UI.WPBC_BFB_Column_Styles.set_selected_col_flag(sec,preselect_tab_key);}}}// Select and stop bubbling so outer containers don’t reselect a parent.
this.select_field(hit);e.stopPropagation();// Also set the tab after the inspector renders (works even if it was already open).
if(preselect_tab_key){(window.requestAnimationFrame||setTimeout)(function(){try{const ins=document.getElementById('wpbc_bfb__inspector');const tabs=ins&&ins.querySelector('[data-bfb-slot="column_styles"] [data-wpbc-tabs]');if(tabs&&window.wpbc_ui_tabs&&typeof window.wpbc_ui_tabs.set_active==='function'){window.wpbc_ui_tabs.set_active(tabs,preselect_tab_key);}}catch(_e){}},0);// Politely ask the Inspector to focus/open the "Column Styles" group and tab.
wpbc_bfb__dispatch_event_safe('wpbc_bfb:inspector_focus',{group:'column_styles',tab_key:preselect_tab_key});}}/**
		 * Select a field element or clear selection.
		 *
		 * @param {HTMLElement|null} field_el
		 * @param {{scrollIntoView?: boolean}} [opts = {}]
		 */select_field(field_el,{scrollIntoView=false}={}){const root=this.builder.pages_container;const prevEl=this.get_selected_field?.()||null;// the one we’re leaving.
// Ignore elements not in the canvas.
if(field_el&&!root.contains(field_el)){field_el=null;// treat as "no selection".
}// NEW: if we are leaving a section, clear its column highlight
if(prevEl&&prevEl!==field_el&&prevEl.classList?.contains('wpbc_bfb__section')&&UI?.WPBC_BFB_Column_Styles?.clear_selected_col_flag){UI.WPBC_BFB_Column_Styles.clear_selected_col_flag(prevEl);}// If we're leaving a field, permanently stop auto-name for it.
if(prevEl&&prevEl!==field_el&&prevEl.classList?.contains('wpbc_bfb__field')){prevEl.dataset.autoname='0';prevEl.dataset.fresh='0';}root.querySelectorAll('.is-selected').forEach(n=>{n.classList.remove('is-selected');});if(!field_el){const prev=this._selected_uid||null;this._selected_uid=null;this.builder.inspector?.clear?.();root.classList.remove('has-selection');this.builder.bus.emit(Core.WPBC_BFB_Events.CLEAR_SELECTION,{prev_uid:prev,source:'builder'});// Auto-open "Add Fields" when nothing is selected.
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__palette_add_new',tab_id:'wpbc_tab_library'});this._sync_settings_button_states();return;}field_el.classList.add('is-selected');this._selected_uid=field_el.getAttribute('data-uid')||null;// Fallback: ensure sections announce themselves as type="section".
if(field_el.classList.contains('wpbc_bfb__section')&&!field_el.dataset.type){field_el.dataset.type='section';}if(scrollIntoView){field_el.scrollIntoView({behavior:'smooth',block:'center'});}this.builder.inspector?.bind_to_field?.(field_el);// Fallback: ensure inspector enhancers (incl. ValueSlider) run every bind.
try{const ins=document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');if(ins){UI.InspectorEnhancers?.scan?.(ins);// runs all enhancers
UI.WPBC_BFB_ValueSlider?.init_on?.(ins);// extra belt-and-suspenders
}}catch(_){}// NEW: when selecting a section, reflect its active tab as the highlighted column.
if(field_el.classList.contains('wpbc_bfb__section')&&UI?.WPBC_BFB_Column_Styles?.set_selected_col_flag){var k=field_el.dataset&&field_el.dataset.col_styles_active_tab?field_el.dataset.col_styles_active_tab:'1';UI.WPBC_BFB_Column_Styles.set_selected_col_flag(field_el,k);}// Keep sections & fields in the same flow:
// 1) Generic hydrator for simple dataset-backed controls.
if(field_el){UI.WPBC_BFB_Inspector_Bridge._generic_hydrate_controls?.(this.builder,field_el);UI.WPBC_BFB_Inspector_Bridge._hydrate_special_controls?.(this.builder,field_el);}// Auto-open Inspector when a user selects a field/section .
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__inspector',tab_id:'wpbc_tab_inspector'});this._sync_settings_button_states();root.classList.add('has-selection');this.builder.bus.emit(Core.WPBC_BFB_Events.SELECT,{uid:this._selected_uid,el:field_el});const label=field_el?.querySelector('.wpbc_bfb__field-label')?.textContent||(field_el.classList.contains('wpbc_bfb__section')?'section':'')||field_el?.dataset?.id||'item';this.builder._announce('Selected '+label+'.');}/** @returns {HTMLElement|null} */get_selected_field(){if(!this._selected_uid){return null;}const esc_attr=Core.WPBC_BFB_Sanitize.esc_attr_value_for_selector(this._selected_uid);return this.builder.pages_container.querySelector(`.wpbc_bfb__field[data-uid="${esc_attr}"], .wpbc_bfb__section[data-uid="${esc_attr}"]`);}/** @param {CustomEvent} ev */on_clear(ev){const src=ev?.detail?.source??ev?.source;if(src!=='builder'){this.select_field(null);}}};/**
	 * Bridges the builder with the Inspector and sanitizes id/name edits.
	 */UI.WPBC_BFB_Inspector_Bridge=class extends UI.WPBC_BFB_Module{init(){this._attach_inspector();this._bind_id_sanitizer();this._open_inspector_after_field_added();this._bind_focus_shortcuts();}_attach_inspector(){const b=this.builder;const attach=()=>{if(typeof window.WPBC_BFB_Inspector==='function'){b.inspector=new WPBC_BFB_Inspector(document.getElementById('wpbc_bfb__inspector'),b);this._bind_id_sanitizer();document.removeEventListener('wpbc_bfb_inspector_ready',attach);}};// Ensure we bind after late ready as well.
if(typeof window.WPBC_BFB_Inspector==='function'){attach();}else{b.inspector={bind_to_field(){},clear(){}};document.addEventListener('wpbc_bfb_inspector_ready',attach);setTimeout(attach,0);}}/**
		 * Listen for "focus" hints from the canvas and open the right group/tab.
		 * - Supports: group === 'column_styles'
		 * - Also scrolls the group into view.
		 */_bind_focus_shortcuts(){/** @param {CustomEvent} e */const on_focus=e=>{try{const grp_key=e&&e.detail&&e.detail.group;const tab_key=e&&e.detail&&e.detail.tab_key;if(!grp_key){return;}const ins=document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');if(!ins){return;}if(grp_key==='column_styles'){// Find the Column Styles slot/group.
const slot=ins.querySelector('[data-bfb-slot="column_styles"]')||ins.querySelector('[data-inspector-group-key="column_styles"]');if(slot){// Open collapsible container if present.
const group_wrap=slot.closest('.inspector__group')||slot.closest('[data-inspector-group]');if(group_wrap&&!group_wrap.classList.contains('is-open')){group_wrap.classList.add('is-open');// Mirror ARIA state if your header uses aria-expanded.
const header_btn=group_wrap.querySelector('[aria-expanded]');if(header_btn){header_btn.setAttribute('aria-expanded','true');}}// Optional: set the requested tab key if tabs exist in this group.
if(tab_key){const tabs=slot.querySelector('[data-wpbc-tabs]');if(tabs&&window.wpbc_ui_tabs&&typeof window.wpbc_ui_tabs.set_active==='function'){window.wpbc_ui_tabs.set_active(tabs,String(tab_key));}}// Bring into view for convenience.
try{// Uncomment (Only  if needed) this to AUTO SCROLL to  specific COLUMN in the section:.
// slot.scrollIntoView( { behavior: 'smooth', block: 'nearest' } );
}catch(_e){}}}}catch(_e){}};this._on_inspector_focus=on_focus;document.addEventListener('wpbc_bfb:inspector_focus',on_focus,true);}destroy(){try{if(this._on_inspector_focus){document.removeEventListener('wpbc_bfb:inspector_focus',this._on_inspector_focus,true);this._on_inspector_focus=null;}}catch(_e){}}/**
		 * Hydrate inspector inputs for "special" keys that we handle explicitly.
		 * Works for both fields and sections.
		 * @param {WPBC_Form_Builder} builder
		 * @param {HTMLElement} sel
		 */static _hydrate_special_controls(builder,sel){const ins=document.getElementById('wpbc_bfb__inspector');if(!ins||!sel)return;const setVal=(key,val)=>{const ctrl=ins.querySelector(`[data-inspector-key="${key}"]`);if(ctrl&&'value'in ctrl)ctrl.value=String(val??'');};// Internal id / name / public html_id.
setVal('id',sel.getAttribute('data-id')||'');setVal('name',sel.getAttribute('data-name')||'');setVal('html_id',sel.getAttribute('data-html_id')||'');// Section-only extras are harmless to set for fields (controls may not exist).
setVal('cssclass',sel.getAttribute('data-cssclass')||'');setVal('label',sel.getAttribute('data-label')||'');}/**
		 * Hydrate inspector inputs that declare a generic dataset mapping via
		 * [data-inspector-key] but do NOT declare a custom value_from adapter.
		 * This makes sections follow the same data flow as fields with almost no glue.
		 *
		 * @param {WPBC_Form_Builder} builder
		 * @param {HTMLElement} sel - currently selected field/section
		 */static _generic_hydrate_controls(builder,sel){const ins=document.getElementById('wpbc_bfb__inspector');if(!ins||!sel)return;const SKIP=/^(id|name|html_id|cssclass|label)$/;// handled by _hydrate_special_controls
// NEW: read schema for the selected element’s type.
const schemas=window.WPBC_BFB_Schemas||{};const typeKey=sel.dataset&&sel.dataset.type||'';const schemaEntry=schemas[typeKey]||null;const propsSchema=schemaEntry&&schemaEntry.schema&&schemaEntry.schema.props?schemaEntry.schema.props:{};const hasOwn=Function.prototype.call.bind(Object.prototype.hasOwnProperty);const getDefault=key=>{const meta=propsSchema[key];return meta&&hasOwn(meta,'default')?meta.default:undefined;};ins.querySelectorAll('[data-inspector-key]').forEach(ctrl=>{const key=String(ctrl.dataset?.inspectorKey||'').toLowerCase();if(!key||SKIP.test(key))return;// Element-level lock.
const dl=(ctrl.dataset?.locked||'').trim().toLowerCase();if(dl==='1'||dl==='true'||dl==='yes')return;// Respect explicit adapters.
if(ctrl.dataset?.value_from||ctrl.dataset?.valueFrom)return;const raw=sel.dataset?sel.dataset[key]:undefined;const hasRaw=sel.dataset?hasOwn(sel.dataset,key):false;const defValue=getDefault(key);// Best-effort control typing with schema default fallback when value is absent.
if(ctrl instanceof HTMLInputElement&&(ctrl.type==='checkbox'||ctrl.type==='radio')){// If dataset is missing the key entirely -> use schema default (boolean).
if(!hasRaw){ctrl.checked=!!defValue;}else{// An explicit empty value is the legacy persisted representation of false.
ctrl.checked=Core.WPBC_BFB_Sanitize.coerce_boolean(raw,false);}}else if('value'in ctrl){if(hasRaw){ctrl.value=raw!=null?String(raw):'';}else{ctrl.value=defValue==null?'':String(defValue);}}});}_bind_id_sanitizer(){const b=this.builder;const ins=document.getElementById('wpbc_bfb__inspector');if(!ins){return;}if(ins.__wpbc_bfb_id_sanitizer_bound){return;}ins.__wpbc_bfb_id_sanitizer_bound=true;const handler=e=>{const t=e.target;if(!t||!('value'in t)){return;}const key=(t.dataset?.inspectorKey||'').toLowerCase();const sel=b.get_selected_field?.();const isSection=sel?.classList?.contains('wpbc_bfb__section');if(!sel)return;// Unified emitter that always includes the element reference.
const EV=Core.WPBC_BFB_Events;// STRUCTURE_CHANGE can be "expensive" because other listeners may trigger full canvas refresh.
// Debounce only continuous controls (e.g. value slider scrubbing) on the INPUT phase.
const ensure_sc_debounce_state=()=>{if(b.__wpbc_bfb_sc_debounce_state){return b.__wpbc_bfb_sc_debounce_state;}b.__wpbc_bfb_sc_debounce_state={timer_id:0,pending_payload:null};return b.__wpbc_bfb_sc_debounce_state;};const cancel_sc_debounced_emit=()=>{const st=b.__wpbc_bfb_sc_debounce_state;if(!st)return;try{clearTimeout(st.timer_id);}catch(_){}st.timer_id=0;st.pending_payload=null;};const bus_emit_change=(reason,extra={})=>{// If we’re committing something (change/blur/etc), drop any pending "input" emit.
cancel_sc_debounced_emit();b.bus?.emit?.(EV.STRUCTURE_CHANGE,{reason,el:sel,...extra});};const bus_emit_change_debounced=(reason,extra={},wait_ms)=>{const st=ensure_sc_debounce_state();const ms=Number.isFinite(wait_ms)?wait_ms:Number.isFinite(UI.STRUCTURE_CHANGE_DEBOUNCE_MS)?UI.STRUCTURE_CHANGE_DEBOUNCE_MS:240;// Capture the CURRENT selected element into the payload now (stable ref).
st.pending_payload={reason,el:sel,...extra,debounced:true};try{clearTimeout(st.timer_id);}catch(_){}st.timer_id=setTimeout(function(){st.timer_id=0;const payload=st.pending_payload;st.pending_payload=null;if(payload){b.bus?.emit?.(EV.STRUCTURE_CHANGE,payload);}},ms);};// ---- FIELD/SECTION: internal id ----
if(key==='id'){const unique=b.id.set_field_id(sel,t.value);if(b.preview_mode&&!isSection){b.render_preview(sel);}if(t.value!==unique){t.value=unique;}bus_emit_change('id-change');return;}// ---- FIELD/SECTION: public HTML id ----
if(key==='html_id'){const applied=b.id.set_field_html_id(sel,t.value);// For sections, also set the real DOM id so anchors/CSS can target it.
if(isSection){sel.id=applied||'';}else if(b.preview_mode){b.render_preview(sel);}if(t.value!==applied){t.value=applied;}bus_emit_change('html-id-change');return;}// ---- FIELDS ONLY: name ----
if(key==='name'&&!isSection){// Live typing: sanitize only (NO uniqueness yet) to avoid "-2" spam
if(e.type==='input'){const before=t.value;const sanitized=Core.WPBC_BFB_Sanitize.sanitize_html_name(before);if(before!==sanitized){// optional: preserve caret to avoid jump
const selStart=t.selectionStart,selEnd=t.selectionEnd;t.value=sanitized;try{t.setSelectionRange(selStart,selEnd);}catch(_){}}return;// uniqueness on change/blur
}// Commit (change/blur)
const raw=String(t.value??'').trim();if(!raw){// RESEED: keep name non-empty and provisional (autoname stays ON)
const S=Core.WPBC_BFB_Sanitize;const base=S.sanitize_html_name(sel.getAttribute('data-id')||sel.dataset.id||sel.dataset.type||'field');const uniq=b.id.ensure_unique_field_name(base,sel);sel.setAttribute('data-name',uniq);sel.dataset.autoname='1';sel.dataset.name_user_touched='0';// Keep DOM in sync if we’re not re-rendering
if(!b.preview_mode){const ctrl=sel.querySelector('input,textarea,select');if(ctrl)ctrl.setAttribute('name',uniq);}else{b.render_preview(sel);}if(t.value!==uniq)t.value=uniq;bus_emit_change('name-reseed');return;}// Non-empty commit: user takes control; disable autoname going forward
sel.dataset.name_user_touched='1';sel.dataset.autoname='0';const sanitized=Core.WPBC_BFB_Sanitize.sanitize_html_name(raw);const unique=b.id.set_field_name(sel,sanitized);if(!b.preview_mode){const ctrl=sel.querySelector('input,textarea,select');if(ctrl)ctrl.setAttribute('name',unique);}else{b.render_preview(sel);}if(t.value!==unique)t.value=unique;bus_emit_change('name-change');return;}// ---- SECTIONS & FIELDS: cssclass (live apply; no re-render) ----
if(key==='cssclass'){const next=Core.WPBC_BFB_Sanitize.sanitize_css_classlist(t.value||'');const desiredArr=next.split(/\s+/).filter(Boolean);const desiredSet=new Set(desiredArr);// Core classes are never touched.
const isCore=cls=>cls==='is-selected'||cls.startsWith('wpbc_');// Snapshot before mutating (DOMTokenList is live).
const beforeClasses=Array.from(sel.classList);const customBefore=beforeClasses.filter(c=>!isCore(c));// Remove stray non-core classes not in desired.
customBefore.forEach(c=>{if(!desiredSet.has(c))sel.classList.remove(c);});// Add missing desired classes in one go.
const missing=desiredArr.filter(c=>!customBefore.includes(c));if(missing.length)sel.classList.add(...missing);// Keep dataset in sync (avoid useless attribute writes).
if(sel.getAttribute('data-cssclass')!==next){sel.setAttribute('data-cssclass',next);}// Emit only if something actually changed.
const afterClasses=Array.from(sel.classList);const changed=afterClasses.length!==beforeClasses.length||beforeClasses.some((c,i)=>c!==afterClasses[i]);const detail={key:'cssclass',phase:e.type};if(isSection){bus_emit_change('cssclass-change',detail);}else{bus_emit_change('prop-change',detail);}return;}// ---- SECTIONS: label ----
if(isSection&&key==='label'){const val=String(t.value??'');sel.setAttribute('data-label',val);bus_emit_change('label-change');return;}// ---- FIELDS: label (auto-name while typing; freeze on commit) ----
if(!isSection&&key==='label'){const val=String(t.value??'');sel.dataset.label=val;// while typing, allow auto-name (if flags permit)
try{Core.WPBC_BFB_Field_Base.maybe_autoname_from_label(b,sel,val);}catch(_){}// if user committed the label (blur/change), freeze future auto-name
if(e.type!=='input'){sel.dataset.autoname='0';// stop future label->name sync
sel.dataset.fresh='0';// also kill the "fresh" escape hatch
}// Optional UI nicety: disable Name when auto is ON, enable when OFF
const ins=document.getElementById('wpbc_bfb__inspector');const nameCtrl=ins?.querySelector('[data-inspector-key="name"]');if(nameCtrl){const autoActive=(sel.dataset.autoname??'1')!=='0'&&sel.dataset.name_user_touched!=='1'&&sel.dataset.was_loaded!=='1';nameCtrl.toggleAttribute('disabled',autoActive);if(autoActive&&!nameCtrl.placeholder){nameCtrl.placeholder=b?.i18n?.auto_from_label??'auto — from label';}if(!autoActive&&nameCtrl.placeholder===(b?.i18n?.auto_from_label??'auto — from label')){nameCtrl.placeholder='';}}// Always re-render the preview so label changes are visible immediately.
b.render_preview(sel);bus_emit_change('label-change');return;}// ---- DEFAULT (GENERIC): dataset writer for both fields & sections ----
// Any inspector control with [data-inspector-key] that doesn't have a custom
// adapter/value_from will simply read/write sel.dataset[key].
if(key){const selfLocked=/^(1|true|yes)$/i.test((t.dataset?.locked||'').trim());if(selfLocked){return;}// Skip keys we handled above to avoid double work.
if(key==='id'||key==='name'||key==='html_id'||key==='cssclass'||key==='label'){return;}let nextVal='';if(t instanceof HTMLInputElement&&(t.type==='checkbox'||t.type==='radio')){// Persist both boolean states explicitly so schema defaults cannot replace false.
nextVal=t.checked?'true':'false';}else if('value'in t){nextVal=String(t.value??'');}// Persist to dataset.
if(sel?.dataset)sel.dataset[key]=nextVal;// Generator controls are "UI inputs" — avoid STRUCTURE_CHANGE spam while dragging/typing.
const is_gen_key=key.indexOf('gen_')===0;// Re-render on visual keys so preview stays in sync (calendar label/help, etc.).
const visualKeys=new Set(['help','placeholder','min_width','cssclass']);if(!isSection&&(visualKeys.has(key)||key.startsWith('ui_'))){// Light heuristic: only re-render on commit for heavy inputs; live for short ones is fine.
if(e.type==='change'||key==='help'||key==='placeholder'){b.render_preview(sel);}}if(!(is_gen_key&&e.type==='input')){// Debounce continuous value slider input events to avoid full-canvas refresh spam.
// We detect the slider group via [data-len-group] wrapper.
const is_len_group_ctrl=!!(t&&t.closest&&t.closest('[data-len-group]'));if(is_len_group_ctrl&&e.type==='input'){bus_emit_change_debounced('prop-change',{key,phase:e.type});}else{bus_emit_change('prop-change',{key,phase:e.type});}}return;}};ins.addEventListener('change',handler,true);// reflect instantly while typing as well.
ins.addEventListener('input',handler,true);}/**
		 * Open Inspector after a field is added.
		 * @private
		 */_open_inspector_after_field_added(){const EV=Core.WPBC_BFB_Events;this.builder?.bus?.on?.(EV.FIELD_ADD,e=>{const el=e?.detail?.el||null;if(el&&this.builder?.select_field){this.builder.select_field(el,{scrollIntoView:true});}// Show Inspector Palette.
wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',{panel_id:'wpbc_bfb__inspector',tab_id:'wpbc_tab_inspector'});});}};/**
	 * Keyboard shortcuts for selection, deletion, and movement.
	 */UI.WPBC_BFB_Keyboard_Controller=class extends UI.WPBC_BFB_Module{init(){this._on_key=this.on_key.bind(this);document.addEventListener('keydown',this._on_key,true);}destroy(){document.removeEventListener('keydown',this._on_key,true);}/** @param {KeyboardEvent} e */on_key(e){const b=this.builder;const is_typing=this._is_typing_anywhere();if(e.key==='Escape'){if(is_typing){return;}this.builder.bus.emit(Core.WPBC_BFB_Events.CLEAR_SELECTION,{source:'esc'});return;}const selected=b.get_selected_field?.();if(!selected||is_typing){return;}if(e.key==='Delete'||e.key==='Backspace'){e.preventDefault();b.delete_item?.(selected);return;}if((e.altKey||e.ctrlKey||e.metaKey)&&(e.key==='ArrowUp'||e.key==='ArrowDown')&&!e.shiftKey){e.preventDefault();const dir=e.key==='ArrowUp'?'up':'down';b.move_item?.(selected,dir);return;}if(e.key==='Enter'){e.preventDefault();b.select_field(selected,{scrollIntoView:true});}}/** @returns {boolean} */_is_typing_anywhere(){const a=document.activeElement;const tag=a?.tagName;if(tag==='INPUT'||tag==='TEXTAREA'||tag==='SELECT'||a?.isContentEditable===true){return true;}const ins=document.getElementById('wpbc_bfb__inspector');return!!(ins&&a&&ins.contains(a));}};/**
	 * Column resize logic for section rows.
	 */UI.WPBC_BFB_Resize_Controller=class extends UI.WPBC_BFB_Module{init(){this.builder.init_resize_handler=this.handle_resize.bind(this);}/**
		 * read the CSS var (kept local so it doesn’t depend on the Min-Width module)
		 *
		 * @param col
		 * @returns {number|number}
		 * @private
		 */_get_col_min_px(col){const v=getComputedStyle(col).getPropertyValue('--wpbc-col-min')||'0';const n=parseFloat(v);return Number.isFinite(n)?Math.max(0,n):0;}/** @param {MouseEvent} e */handle_resize(e){const b=this.builder;e.preventDefault();if(e.button!==0)return;const resizer=e.currentTarget;const row_el=resizer.parentElement;const cols=Array.from(row_el.querySelectorAll(':scope > .wpbc_bfb__column'));const left_col=resizer?.previousElementSibling;const right_col=resizer?.nextElementSibling;if(!left_col||!right_col||!left_col.classList.contains('wpbc_bfb__column')||!right_col.classList.contains('wpbc_bfb__column'))return;const left_index=cols.indexOf(left_col);const right_index=cols.indexOf(right_col);if(left_index===-1||right_index!==left_index+1)return;const start_x=e.clientX;const left_start_px=left_col.getBoundingClientRect().width;const right_start_px=right_col.getBoundingClientRect().width;const pair_px=Math.max(0,left_start_px+right_start_px);const gp=b.col_gap_percent;const computed=b.layout.compute_effective_bases_from_row(row_el,gp);const available=computed.available;// % of the “full 100” after gaps
const bases=computed.bases.slice(0);// current effective %
const pair_avail=bases[left_index]+bases[right_index];// Bail if we can’t compute sane deltas.
if(!pair_px||!Number.isFinite(pair_avail)||pair_avail<=0)return;// --- MIN CLAMPS (pixels) -------------------------------------------------
const pctToPx=pct=>pair_px*(pct/pair_avail);// pair-local percent -> px
const genericMinPct=Math.min(0.1,available);// original 0.1% floor (in “available %” space)
const genericMinPx=pctToPx(genericMinPct);const leftMinPx=Math.max(this._get_col_min_px(left_col),genericMinPx);const rightMinPx=Math.max(this._get_col_min_px(right_col),genericMinPx);// freeze text selection + cursor
const prev_user_select=document.body.style.userSelect;document.body.style.userSelect='none';row_el.style.cursor='col-resize';const on_mouse_move=ev=>{if(!pair_px)return;// work in pixels, clamp by each side’s min
const delta_px=ev.clientX-start_x;let newLeftPx=left_start_px+delta_px;newLeftPx=Math.max(leftMinPx,Math.min(pair_px-rightMinPx,newLeftPx));const newRightPx=pair_px-newLeftPx;// translate back to pair-local percentages
const newLeftPct=newLeftPx/pair_px*pair_avail;const newBases=bases.slice(0);newBases[left_index]=newLeftPct;newBases[right_index]=pair_avail-newLeftPct;b.layout.apply_bases_to_row(row_el,newBases);};const on_mouse_up=()=>{document.removeEventListener('mousemove',on_mouse_move);document.removeEventListener('mouseup',on_mouse_up);window.removeEventListener('mouseup',on_mouse_up);document.removeEventListener('mouseleave',on_mouse_up);document.body.style.userSelect=prev_user_select||'';row_el.style.cursor='';// normalize to the row’s available % again
const normalized=b.layout.compute_effective_bases_from_row(row_el,gp);b.layout.apply_bases_to_row(row_el,normalized.bases);};document.addEventListener('mousemove',on_mouse_move);document.addEventListener('mouseup',on_mouse_up);window.addEventListener('mouseup',on_mouse_up);document.addEventListener('mouseleave',on_mouse_up);}};/**
	 * Page and section creation, rebuilding, and nested Sortable setup.
	 */UI.WPBC_BFB_Pages_Sections=class extends UI.WPBC_BFB_Module{init(){this.builder.add_page=opts=>this.add_page(opts);this.builder.add_section=(container,cols)=>this.add_section(container,cols);this.builder.rebuild_section=(section_data,container)=>this.rebuild_section(section_data,container);this.builder.init_all_nested_sortables=el=>this.init_all_nested_sortables(el);this.builder.init_section_sortable=el=>this.init_section_sortable(el);this.builder.pages_sections=this;}/**
		 * Give every field/section in a cloned subtree a fresh data-uid so
		 * uniqueness checks don't exclude their originals.
		 */_retag_uids_in_subtree(root){const b=this.builder;if(!root)return;const nodes=[];if(root.classList?.contains('wpbc_bfb__section')||root.classList?.contains('wpbc_bfb__field')){nodes.push(root);}nodes.push(...root.querySelectorAll('.wpbc_bfb__section, .wpbc_bfb__field'));nodes.forEach(el=>{const prefix=el.classList.contains('wpbc_bfb__section')?'s':'f';el.dataset.uid=`${prefix}-${++b._uid_counter}-${Date.now()}-${Math.random().toString(36).slice(2,7)}`;});}/**
		 * Bump "foo", "foo-2", "foo-3", ...
		 */_make_unique(base,taken){const s=Core.WPBC_BFB_Sanitize;let v=String(base||'');if(!v)v='field';const m=v.match(/-(\d+)$/);let n=m?parseInt(m[1],10)||1:1;let stem=m?v.replace(/-\d+$/,''):v;while(taken.has(v)){n=Math.max(2,n+1);v=`${stem}-${n}`;}taken.add(v);return v;}/**
		 * Strict, one-pass de-duplication for a newly-inserted subtree.
		 * - Ensures unique data-id (internal), data-name (fields), data-html_id (public)
		 * - Also updates DOM: <section id>, <input id>, <label for>, and input[name].
		 */_dedupe_subtree_strict(root){const b=this.builder;const s=Core.WPBC_BFB_Sanitize;if(!root||!b?.pages_container)return;// 1) Build "taken" sets from outside the subtree.
const takenDataId=new Set();const takenDataName=new Set();const takenHtmlId=new Set();const takenDomId=new Set();// All fields/sections outside root
b.pages_container.querySelectorAll('.wpbc_bfb__field, .wpbc_bfb__section').forEach(el=>{if(root.contains(el))return;const did=el.getAttribute('data-id');const dnam=el.getAttribute('data-name');const hid=el.getAttribute('data-html_id');if(did)takenDataId.add(did);if(dnam)takenDataName.add(dnam);if(hid)takenHtmlId.add(hid);});// All DOM ids outside root (labels, inputs, anything)
document.querySelectorAll('[id]').forEach(el=>{if(root.contains(el))return;if(el.id)takenDomId.add(el.id);});const nodes=[];if(root.classList?.contains('wpbc_bfb__section')||root.classList?.contains('wpbc_bfb__field')){nodes.push(root);}nodes.push(...root.querySelectorAll('.wpbc_bfb__section, .wpbc_bfb__field'));// 2) Walk the subtree and fix collisions deterministically.
nodes.forEach(el=>{const isField=el.classList.contains('wpbc_bfb__field');const isSection=el.classList.contains('wpbc_bfb__section');// INTERNAL data-id
{const raw=el.getAttribute('data-id')||'';const base=s.sanitize_html_id(raw)||(isSection?'section':'field');const uniq=this._make_unique(base,takenDataId);if(uniq!==raw)el.setAttribute('data-id',uniq);}// HTML name (fields only)
if(isField){const raw=el.getAttribute('data-name')||'';if(raw){const base=s.sanitize_html_name(raw);const uniq=this._make_unique(base,takenDataName);if(uniq!==raw){el.setAttribute('data-name',uniq);// Update inner control immediately
const input=el.querySelector('input, textarea, select');if(input)input.setAttribute('name',uniq);}}}// Public HTML id (fields + sections)
{const raw=el.getAttribute('data-html_id')||'';if(raw){const base=s.sanitize_html_id(raw);// Reserve against BOTH known data-html_id and real DOM ids.
const combinedTaken=new Set([...takenHtmlId,...takenDomId]);let candidate=this._make_unique(base,combinedTaken);// Record into the real sets so future checks see the reservation.
takenHtmlId.add(candidate);takenDomId.add(candidate);if(candidate!==raw)el.setAttribute('data-html_id',candidate);// Reflect to DOM immediately
if(isSection){el.id=candidate||'';}else{const input=el.querySelector('input, textarea, select');const label=el.querySelector('label.wpbc_bfb__field-label');if(input)input.id=candidate||'';if(label)label.htmlFor=candidate||'';}}else if(isSection){// Ensure no stale DOM id if data-html_id was cleared
el.removeAttribute('id');}}});}_make_add_columns_control(page_el,section_container,insert_pos='bottom'){// Accept insert_pos ('top'|'bottom'), default 'bottom'.
const tpl=document.getElementById('wpbc_bfb__add_columns_template');if(!tpl){return null;}// Clone *contents* (not the id), unhide, and add a page-scoped class.
const src=tpl.content&&tpl.content.firstElementChild?tpl.content.firstElementChild:tpl.firstElementChild;if(!src){return null;}const clone=src.cloneNode(true);clone.removeAttribute('hidden');if(clone.id){clone.removeAttribute('id');}clone.querySelectorAll('[id]').forEach(n=>n.removeAttribute('id'));// Mark where this control inserts sections.
clone.dataset.insert=insert_pos;// 'top' | 'bottom'
// // Optional UI hint for users (keeps existing markup intact).
// const hint = clone.querySelector( '.nav-tab-text .selected_value' );
// if ( hint ) {
// 	hint.textContent = (insert_pos === 'top') ? ' (add at top)' : ' (add at bottom)';
// }
// Click on options - add section with N columns.
clone.addEventListener('click',e=>{const a=e.target.closest('.ul_dropdown_menu_li_action_add_sections');if(!a){return;}e.preventDefault();// Read N either from data-cols or fallback to parsing text like "3 Columns".
let cols=parseInt(a.dataset.cols||(a.textContent.match(/\b(\d+)\s*Column/i)?.[1]??'1'),10);cols=Math.max(1,Math.min(4,cols));// NEW: honor the control's insertion position
this.add_section(section_container,cols,insert_pos);// Reflect last choice (unchanged)
const val=clone.querySelector('.selected_value');if(val){val.textContent=` (${cols})`;}});return clone;}/**
		 * @param {{scroll?: boolean}} [opts = {}]
		 * @returns {HTMLElement}
		 */add_page({scroll=true}={}){const b=this.builder;const page_el=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__panel wpbc_bfb__panel--preview  wpbc_bfb_form wpbc_container wpbc_form wpbc_container_booking_form');page_el.setAttribute('data-page',++b.page_counter);// "Page 1 | X" - Render page Title with Remove X button.
const controls_html=UI.render_wp_template('wpbc-bfb-tpl-page-remove',{page_number:b.page_counter});page_el.innerHTML=controls_html+'<div class="wpbc_bfb__form_preview_section_container wpbc_wizard__border_container"></div>';b.pages_container.appendChild(page_el);if(scroll){page_el.scrollIntoView({behavior:'smooth',block:'start'});}const section_container=page_el.querySelector('.wpbc_bfb__form_preview_section_container');const section_count_on_add_page=2;this.init_section_sortable(section_container);this.add_section(section_container,section_count_on_add_page);// Dropdown control cloned from the hidden template.
const controls_host_top=page_el.querySelector('.wpbc_bfb__controls');const ctrl_top=this._make_add_columns_control(page_el,section_container,'top');if(ctrl_top){controls_host_top.appendChild(ctrl_top);}// Bottom control bar after the section container.
const controls_host_bottom=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__controls wpbc_bfb__controls--bottom');section_container.after(controls_host_bottom);const ctrl_bottom=this._make_add_columns_control(page_el,section_container,'bottom');if(ctrl_bottom){controls_host_bottom.appendChild(ctrl_bottom);}return page_el;}/**
		 * @param {HTMLElement} container
		 * @param {number}      cols
		 * @param {'top'|'bottom'} [insert_pos='bottom']  // NEW
		 */add_section(container,cols,insert_pos='bottom'){const b=this.builder;cols=Math.max(1,parseInt(cols,10)||1);const section=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__section');section.setAttribute('data-id',`section-${++b.section_counter}-${Date.now()}`);section.setAttribute('data-uid',`s-${++b._uid_counter}-${Date.now()}-${Math.random().toString(36).slice(2,7)}`);section.setAttribute('data-type','section');section.setAttribute('data-label','Section');section.setAttribute('data-columns',String(cols));// Do not persist or seed per-column styles by default (opt-in via inspector).
const row=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__row wpbc__row');for(let i=0;i<cols;i++){const col=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__column wpbc__field');col.style.flexBasis=100/cols+'%';// No default CSS vars here; real columns remain unaffected until user activates styles.
b.init_sortable?.(col);row.appendChild(col);if(i<cols-1){const resizer=Core.WPBC_Form_Builder_Helper.create_element('div','wpbc_bfb__column-resizer');resizer.addEventListener('mousedown',b.init_resize_handler);row.appendChild(resizer);}}section.appendChild(row);b.layout.set_equal_bases(row,b.col_gap_percent);b.add_overlay_toolbar(section);section.setAttribute('tabindex','0');this.init_all_nested_sortables(section);// Insertion policy: top | bottom.
if(insert_pos==='top'&&container.firstElementChild){container.insertBefore(section,container.firstElementChild);}else{container.appendChild(section);}}/**
		 * @param {Object} section_data
		 * @param {HTMLElement} container
		 * @returns {HTMLElement} The rebuilt section element.
		 */rebuild_section(section_data,container){const b=this.builder;const cols_data=Array.isArray(section_data?.columns)?section_data.columns:[];this.add_section(container,cols_data.length||1);const section=container.lastElementChild;if(!section.dataset.uid){section.setAttribute('data-uid',`s-${++b._uid_counter}-${Date.now()}-${Math.random().toString(36).slice(2,7)}`);}section.setAttribute('data-id',section_data?.id||`section-${++b.section_counter}-${Date.now()}`);section.setAttribute('data-type','section');section.setAttribute('data-label',section_data?.label||'Section');section.setAttribute('data-columns',String((section_data?.columns||[]).length||1));// Persisted attributes
if(section_data?.html_id){section.setAttribute('data-html_id',String(section_data.html_id));// give the container a real id so anchors/CSS can target it
section.id=String(section_data.html_id);}// NEW: restore persisted per-column styles (raw JSON string).
if(section_data?.col_styles!=null){const json=String(section_data.col_styles);section.setAttribute('data-col_styles',json);try{section.dataset.col_styles=json;}catch(_e){}}// (No render_preview() call here on purpose: sections’ builder DOM uses .wpbc_bfb__row/.wpbc_bfb__column.)
if(section_data?.cssclass){section.setAttribute('data-cssclass',String(section_data.cssclass));// keep core classes, then add custom class(es)
String(section_data.cssclass).split(/\s+/).filter(Boolean).forEach(cls=>section.classList.add(cls));}const row=section.querySelector('.wpbc_bfb__row');// Delegate parsing + activation + application to the Column Styles service.
try{const json=section.getAttribute('data-col_styles')||(section.dataset?section.dataset.col_styles||'':'');const arr=UI.WPBC_BFB_Column_Styles.parse_col_styles(json);UI.WPBC_BFB_Column_Styles.apply(section,arr);}catch(_e){}cols_data.forEach((col_data,index)=>{const columns_only=row.querySelectorAll(':scope > .wpbc_bfb__column');const col=columns_only[index];col.style.flexBasis=col_data.width||'100%';(col_data.items||[]).forEach(item=>{if(!item||!item.type){return;}if(item.type==='field'){const el=b.build_field(item.data);if(el){col.appendChild(el);b.trigger_field_drop_callback(el,'load');}return;}if(item.type==='section'){this.rebuild_section(item.data,col);}});});const computed=b.layout.compute_effective_bases_from_row(row,b.col_gap_percent);b.layout.apply_bases_to_row(row,computed.bases);this.init_all_nested_sortables(section);// NEW: retag UIDs first (so uniqueness checks don't exclude originals), then dedupe all keys.
this._retag_uids_in_subtree(section);this._dedupe_subtree_strict(section);return section;}/** @param {HTMLElement} container */init_all_nested_sortables(container){const b=this.builder;if(container.classList.contains('wpbc_bfb__form_preview_section_container')){this.init_section_sortable(container);}container.querySelectorAll('.wpbc_bfb__section').forEach(section=>{section.querySelectorAll('.wpbc_bfb__column').forEach(col=>{this.init_section_sortable(col);});});}/** @param {HTMLElement} container */init_section_sortable(container){const b=this.builder;if(!container){return;}const is_column=container.classList.contains('wpbc_bfb__column');const is_top_level=container.classList.contains('wpbc_bfb__form_preview_section_container');if(!is_column&&!is_top_level){return;}b.init_sortable?.(container);}};/**
	 * Serialization and deserialization of pages/sections/fields.
	 */UI.WPBC_BFB_Structure_IO=class extends UI.WPBC_BFB_Module{init(){this.builder.get_structure=()=>this.serialize();this.builder.load_saved_structure=(s,opts)=>this.deserialize(s,opts);}/**
		 * Normalize option values when a field explicitly disables separate values.
		 *
		 * Older Builder versions persisted an unchecked value_differs toggle as an
		 * empty string. Treat that explicit legacy value as false, while retaining
		 * the schema default when the property is genuinely absent.
		 *
		 * @param {Object} field_data Serialized field data.
		 * @returns {Object} Normalized serialized field data.
		 */_normalize_field_option_values(field_data){const has_value_differs=Object.prototype.hasOwnProperty.call(field_data,'value_differs');if(!has_value_differs){return field_data;}const value_differs=Core.WPBC_BFB_Sanitize.coerce_boolean(field_data.value_differs,false);field_data.value_differs=value_differs;if(!value_differs&&Array.isArray(field_data.options)){field_data.options=field_data.options.map(option_record=>{if(!option_record||typeof option_record!=='object'){return option_record;}return Object.assign({},option_record,{value:String(option_record.label==null?'':option_record.label)});});}return field_data;}/** @returns {Array} */serialize(){const b=this.builder;this._normalize_ids();this._normalize_names();const pages=[];b.pages_container.querySelectorAll('.wpbc_bfb__panel--preview').forEach((page_el,page_index)=>{const container=page_el.querySelector('.wpbc_bfb__form_preview_section_container');const content=[];if(!container){pages.push({page:page_index+1,content});return;}container.querySelectorAll(':scope > *').forEach(child=>{if(child.classList.contains('wpbc_bfb__section')){content.push({type:'section',data:this.serialize_section(child)});return;}if(child.classList.contains('wpbc_bfb__field')){if(child.classList.contains('is-invalid')){return;}const f_data=this._normalize_field_option_values(Core.WPBC_Form_Builder_Helper.get_all_data_attributes(child));// Drop ephemeral/editor-only flags
['uid','fresh','autoname','was_loaded','name_user_touched'].forEach(k=>{if(k in f_data)delete f_data[k];});content.push({type:'field',data:f_data});}});pages.push({page:page_index+1,content});});return pages;}/**
		 * @param {HTMLElement} section_el
		 * @returns {{id:string,label:string,html_id:string,cssclass:string,col_styles:string,columns:Array}}
		 */serialize_section(section_el){const row=section_el.querySelector(':scope > .wpbc_bfb__row');// NEW: read per-column styles from dataset/attributes (underscore & hyphen)
var col_styles_raw=section_el.getAttribute('data-col_styles')||(section_el.dataset?section_el.dataset.col_styles:'')||'';const base={id:section_el.dataset.id,label:section_el.dataset.label||'',html_id:section_el.dataset.html_id||'',cssclass:section_el.dataset.cssclass||'',col_styles:String(col_styles_raw)// <-- NEW: keep as raw JSON string
};if(!row){return Object.assign({},base,{columns:[]});}const columns=[];row.querySelectorAll(':scope > .wpbc_bfb__column').forEach(function(col){const width=col.style.flexBasis||'100%';const items=[];Array.prototype.forEach.call(col.children,function(child){if(child.classList.contains('wpbc_bfb__section')){items.push({type:'section',data:this.serialize_section(child)});return;}if(child.classList.contains('wpbc_bfb__field')){if(child.classList.contains('is-invalid')){return;}const f_data=this._normalize_field_option_values(Core.WPBC_Form_Builder_Helper.get_all_data_attributes(child));['uid','fresh','autoname','was_loaded','name_user_touched'].forEach(function(k){if(k in f_data){delete f_data[k];}});items.push({type:'field',data:f_data});}}.bind(this));columns.push({width:width,items:items});}.bind(this));// Clamp persisted col_styles to the actual number of columns on Save.
try{const colCount=columns.length;const raw=String(col_styles_raw||'').trim();if(raw){let arr=[];try{const parsed=JSON.parse(raw);arr=Array.isArray(parsed)?parsed:parsed&&Array.isArray(parsed.columns)?parsed.columns:[];}catch(_e){arr=[];}if(colCount<=0){base.col_styles='[]';}else{if(arr.length>colCount)arr.length=colCount;while(arr.length<colCount)arr.push({});base.col_styles=JSON.stringify(arr);}}else{base.col_styles='';}}catch(_e){}return Object.assign({},base,{columns:columns});}/**
		 * @param {Array} structure
		 * @param {{deferIfTyping?: boolean}} [opts = {}]
		 */deserialize(structure,{deferIfTyping=true}={}){const b=this.builder;if(deferIfTyping&&this._is_typing_in_inspector()){clearTimeout(this._defer_timer);this._defer_timer=setTimeout(()=>{this.deserialize(structure,{deferIfTyping:false});},150);return;}b.pages_container.innerHTML='';b.page_counter=0;(structure||[]).forEach(page_data=>{const page_el=b.pages_sections.add_page({scroll:false});const section_container=page_el.querySelector('.wpbc_bfb__form_preview_section_container');section_container.innerHTML='';b.init_section_sortable?.(section_container);(page_data.content||[]).forEach(item=>{if(item.type==='section'){// Now returns the element; attributes (incl. col_styles) are applied inside rebuild.
b.pages_sections.rebuild_section(item.data,section_container);return;}if(item.type==='field'){const el=b.build_field(item.data);if(el){section_container.appendChild(el);b.trigger_field_drop_callback(el,'load');}}});});b.usage?.update_palette_ui?.();b.bus.emit(Core.WPBC_BFB_Events.STRUCTURE_LOADED,{structure});}_normalize_ids(){const b=this.builder;b.pages_container.querySelectorAll('.wpbc_bfb__panel--preview .wpbc_bfb__field:not(.is-invalid)').forEach(el=>{const data=Core.WPBC_Form_Builder_Helper.get_all_data_attributes(el);const want=Core.WPBC_BFB_Sanitize.sanitize_html_id(data.id||'')||'field';const uniq=b.id.ensure_unique_field_id(want,el);if(data.id!==uniq){el.setAttribute('data-id',uniq);if(b.preview_mode){b.render_preview(el);}}});}_normalize_names(){const b=this.builder;b.pages_container.querySelectorAll('.wpbc_bfb__panel--preview .wpbc_bfb__field:not(.is-invalid)').forEach(el=>{const data=Core.WPBC_Form_Builder_Helper.get_all_data_attributes(el);const base=Core.WPBC_BFB_Sanitize.sanitize_html_name(data.name!=null?data.name:data.id)||'field';const uniq=b.id.ensure_unique_field_name(base,el);if(data.name!==uniq){el.setAttribute('data-name',uniq);if(b.preview_mode){b.render_preview(el);}}});}/** @returns {boolean} */_is_typing_in_inspector(){const ins=document.getElementById('wpbc_bfb__inspector');return!!(ins&&document.activeElement&&ins.contains(document.activeElement));}};/**
	 * Minimal, standalone guard that enforces per-column min widths based on fields' data-min_width.
	 *
	 * @type {UI.WPBC_BFB_Min_Width_Guard}
	 */UI.WPBC_BFB_Min_Width_Guard=class extends UI.WPBC_BFB_Module{constructor(builder){super(builder);this._on_field_add=this._on_field_add.bind(this);this._on_field_remove=this._on_field_remove.bind(this);this._on_structure_loaded=this._on_structure_loaded.bind(this);this._on_structure_change=this._on_structure_change.bind(this);this._on_window_resize=this._on_window_resize.bind(this);this._pending_rows=new Set();this._pending_all=false;this._raf_id=0;}init(){const EV=Core.WPBC_BFB_Events;this.builder?.bus?.on?.(EV.FIELD_ADD,this._on_field_add);this.builder?.bus?.on?.(EV.FIELD_REMOVE,this._on_field_remove);this.builder?.bus?.on?.(EV.STRUCTURE_LOADED,this._on_structure_loaded);// Refresh selectively on structure change (NOT on every prop input).
this.builder?.bus?.on?.(EV.STRUCTURE_CHANGE,this._on_structure_change);window.addEventListener('resize',this._on_window_resize,{passive:true});this._schedule_refresh_all();}destroy(){const EV=Core.WPBC_BFB_Events;this.builder?.bus?.off?.(EV.FIELD_ADD,this._on_field_add);this.builder?.bus?.off?.(EV.FIELD_REMOVE,this._on_field_remove);this.builder?.bus?.off?.(EV.STRUCTURE_LOADED,this._on_structure_loaded);this.builder?.bus?.off?.(EV.STRUCTURE_CHANGE,this._on_structure_change);window.removeEventListener('resize',this._on_window_resize);}_on_field_add(e){this._schedule_refresh_all();// if you really want to be minimal work here, keep your row-only version.
}_on_field_remove(e){const src_el=e?.detail?.el||null;const row=src_el&&src_el.closest?src_el.closest('.wpbc_bfb__row'):null;if(row){this._schedule_refresh_row(row);}else{this._schedule_refresh_all();}}_on_structure_loaded(){this._schedule_refresh_all();}_on_structure_change(e){const reason=e?.detail?.reason||'';const key=e?.detail?.key||'';// Ignore noisy prop changes that don't affect min widths.
if(reason==='prop-change'&&key!=='min_width'){return;}const el=e?.detail?.el||null;const row=el?.closest?.('.wpbc_bfb__row')||null;if(row){this._schedule_refresh_row(row);}else{this._schedule_refresh_all();}}_on_window_resize(){this._schedule_refresh_all();}_schedule_refresh_row(row_el){if(!row_el)return;this._pending_rows.add(row_el);this._kick_raf();}_schedule_refresh_all(){this._pending_all=true;this._pending_rows.clear();this._kick_raf();}_kick_raf(){if(this._raf_id)return;this._raf_id=(window.requestAnimationFrame||setTimeout)(()=>{this._raf_id=0;if(this._pending_all){this._pending_all=false;this.refresh_all();return;}const rows=Array.from(this._pending_rows);this._pending_rows.clear();rows.forEach(r=>this.refresh_row(r));},0);}refresh_all(){this.builder?.pages_container?.querySelectorAll?.('.wpbc_bfb__row')?.forEach?.(row=>this.refresh_row(row));}refresh_row(row_el){if(!row_el)return;const cols=row_el.querySelectorAll(':scope > .wpbc_bfb__column');// 1) Recalculate each column’s required min px and write it to the CSS var.
cols.forEach(col=>this.apply_col_min(col));// 2) Enforce it at the CSS level right away so layout can’t render narrower.
cols.forEach(col=>{const px=parseFloat(getComputedStyle(col).getPropertyValue('--wpbc-col-min')||'0')||0;col.style.minWidth=px>0?Math.round(px)+'px':'';});// 3) Normalize current bases so the row respects all mins without overflow.
try{const b=this.builder;const gp=b.col_gap_percent;const eff=b.layout.compute_effective_bases_from_row(row_el,gp);// { bases, available }
// Re-fit *current* bases against mins (same algorithm layout chips use).
const fitted=UI.WPBC_BFB_Layout_Chips._fit_weights_respecting_min(b,row_el,eff.bases);if(Array.isArray(fitted)){const changed=fitted.some((v,i)=>Math.abs(v-eff.bases[i])>0.01);if(changed){b.layout.apply_bases_to_row(row_el,fitted);}}}catch(e){w._wpbc?.dev?.error?.('WPBC_BFB_Min_Width_Guard - refresh_row',e);}}apply_col_min(col_el){if(!col_el)return;let max_px=0;const colRect=col_el.getBoundingClientRect();col_el.querySelectorAll(':scope > .wpbc_bfb__field').forEach(field=>{const raw=field.getAttribute('data-min_width');let px=0;if(raw){const s=String(raw).trim().toLowerCase();if(s.endsWith('%')){const n=parseFloat(s);if(Number.isFinite(n)&&colRect.width>0){px=n/100*colRect.width;}else{px=0;}}else{px=this.parse_len_px(s);}}else{const cs=getComputedStyle(field);px=parseFloat(cs.minWidth||'0')||0;}if(px>max_px)max_px=px;});col_el.style.setProperty('--wpbc-col-min',max_px>0?Math.round(max_px)+'px':'0px');}parse_len_px(value){if(value==null)return 0;const s=String(value).trim().toLowerCase();if(s==='')return 0;if(s.endsWith('px')){const n=parseFloat(s);return Number.isFinite(n)?n:0;}if(s.endsWith('rem')||s.endsWith('em')){const n=parseFloat(s);const base=parseFloat(getComputedStyle(document.documentElement).fontSize)||16;return Number.isFinite(n)?n*base:0;}const n=parseFloat(s);return Number.isFinite(n)?n:0;}};/**
	 * WPBC_BFB_Toggle_Normalizer
	 *
	 * Converts plain checkboxes into toggle UI:
	 * <div class="inspector__control wpbc_ui__toggle">
	 *   <input type="checkbox" id="{unique}" data-inspector-key="..." class="inspector__input" role="switch"
	 * aria-checked="true|false">
	 *   <label class="wpbc_ui__toggle_icon"  for="{unique}"></label>
	 *   <label class="wpbc_ui__toggle_label" for="{unique}">Label</label>
	 * </div>
	 *
	 * - Skips inputs already inside `.wpbc_ui__toggle`.
	 * - Reuses an existing <label for="..."> text if present; otherwise falls back to nearby labels or attributes.
	 * - Auto-generates a unique id when absent.
	 */UI.WPBC_BFB_Toggle_Normalizer=class{/**
		 * Upgrade all raw checkboxes in a container to toggles.
		 * @param {HTMLElement} root_el
		 */static upgrade_checkboxes_in(root_el){if(!root_el||!root_el.querySelectorAll){return;}var inputs=root_el.querySelectorAll('input[type="checkbox"]');if(!inputs.length){return;}Array.prototype.forEach.call(inputs,function(input){// 1) Skip if already inside toggle wrapper.
if(input.closest('.wpbc_ui__toggle')){return;}// Skip rows / where input checkbox explicitly marked with  attribute 'data-wpbc-ui-no-toggle'.
if(input.hasAttribute('data-wpbc-ui-no-toggle')){return;}// 2) Ensure unique id; prefer existing.
var input_id=input.getAttribute('id');if(!input_id){var key=input.dataset&&input.dataset.inspectorKey?String(input.dataset.inspectorKey):'opt';input_id=UI.WPBC_BFB_Toggle_Normalizer.generate_unique_id('wpbc_ins_auto_'+key+'_');input.setAttribute('id',input_id);}// 3) Find best label text.
var label_text=UI.WPBC_BFB_Toggle_Normalizer.resolve_label_text(root_el,input,input_id);// 4) Build the toggle wrapper.
var wrapper=document.createElement('div');wrapper.className='inspector__control wpbc_ui__toggle';// Keep original input; just move it into wrapper.
input.classList.add('inspector__input');input.setAttribute('role','switch');input.setAttribute('aria-checked',input.checked?'true':'false');var icon_label=document.createElement('label');icon_label.className='wpbc_ui__toggle_icon';icon_label.setAttribute('for',input_id);var text_label=document.createElement('label');text_label.className='wpbc_ui__toggle_label';text_label.setAttribute('for',input_id);text_label.appendChild(document.createTextNode(label_text));// 5) Insert wrapper into DOM near the input.
//    Preferred: replace the original labeled row if it matches typical inspector layout.
var replaced=UI.WPBC_BFB_Toggle_Normalizer.try_replace_known_row(input,wrapper,label_text);if(!replaced){if(!input.parentNode)return;// NEW guard
// Fallback: just wrap the input in place and append labels.
input.parentNode.insertBefore(wrapper,input);wrapper.appendChild(input);wrapper.appendChild(icon_label);wrapper.appendChild(text_label);}// 6) ARIA sync on change.
input.addEventListener('change',function(){input.setAttribute('aria-checked',input.checked?'true':'false');});});}/**
		 * Generate a unique id with a given prefix.
		 * @param {string} prefix
		 * @returns {string}
		 */static generate_unique_id(prefix){var base=String(prefix||'wpbc_ins_auto_');var uid=Math.random().toString(36).slice(2,8);var id=base+uid;// Minimal collision guard in the current document scope.
while(document.getElementById(id)){uid=Math.random().toString(36).slice(2,8);id=base+uid;}return id;}/**
		 * Resolve the best human label for an input.
		 * Priority:
		 *  1) <label for="{id}">text</label>
		 *  2) nearest sibling/parent .inspector__label text
		 *  3) input.getAttribute('aria-label') || data-label || data-inspector-key || name || 'Option'
		 * @param {HTMLElement} root_el
		 * @param {HTMLInputElement} input
		 * @param {string} input_id
		 * @returns {string}
		 */static resolve_label_text(root_el,input,input_id){// for= association
if(input_id){var assoc=root_el.querySelector('label[for="'+UI.WPBC_BFB_Toggle_Normalizer.css_escape(input_id)+'"]');if(assoc&&assoc.textContent){var txt=assoc.textContent.trim();// Remove the old label from DOM; its text will be used by toggle.
assoc.parentNode&&assoc.parentNode.removeChild(assoc);if(txt){return txt;}}}// nearby inspector label
var near_label=input.closest('.inspector__row');if(near_label){var il=near_label.querySelector('.inspector__label');if(il&&il.textContent){var t2=il.textContent.trim();// If this row had the standard label+control, drop the old text label to avoid duplicates.
il.parentNode&&il.parentNode.removeChild(il);if(t2){return t2;}}}// fallbacks
var aria=input.getAttribute('aria-label');if(aria){return aria;}if(input.dataset&&input.dataset.label){return String(input.dataset.label);}if(input.dataset&&input.dataset.inspectorKey){return String(input.dataset.inspectorKey);}if(input.name){return String(input.name);}return'Option';}/**
		 * Try to replace a known inspector row pattern with a toggle wrapper.
		 * Patterns:
		 *  <div.inspector__row>
		 *    <label.inspector__label>Text</label>
		 *    <div.inspector__control> [input[type=checkbox]] </div>
		 *  </div>
		 *
		 * @param {HTMLInputElement} input
		 * @param {HTMLElement} wrapper
		 * @returns {boolean} replaced
		 */static try_replace_known_row(input,wrapper,label_text){var row=input.closest('.inspector__row');var ctrl_wrap=input.parentElement;if(row&&ctrl_wrap&&ctrl_wrap.classList.contains('inspector__control')){// Clear control wrap and reinsert toggle structure.
while(ctrl_wrap.firstChild){ctrl_wrap.removeChild(ctrl_wrap.firstChild);}row.classList.add('inspector__row--toggle');ctrl_wrap.classList.add('wpbc_ui__toggle');ctrl_wrap.appendChild(input);var input_id=input.getAttribute('id');var icon_lbl=document.createElement('label');icon_lbl.className='wpbc_ui__toggle_icon';icon_lbl.setAttribute('for',input_id);var text_lbl=document.createElement('label');text_lbl.className='wpbc_ui__toggle_label';text_lbl.setAttribute('for',input_id);if(label_text){text_lbl.appendChild(document.createTextNode(label_text));}// If the row previously had a .inspector__label (we removed it in resolve_label_text),
// we intentionally do NOT recreate it; the toggle text label becomes the visible one.
// The text content is already resolved in resolve_label_text() and set below by caller.
ctrl_wrap.appendChild(icon_lbl);ctrl_wrap.appendChild(text_lbl);return true;}// Not a known pattern; caller will wrap in place.
return false;}/**
		 * CSS.escape polyfill for selectors.
		 * @param {string} s
		 * @returns {string}
		 */static css_escape(s){s=String(s);if(window.CSS&&typeof window.CSS.escape==='function'){return window.CSS.escape(s);}return s.replace(/([^\w-])/g,'\\$1');}};/**
	 * Apply all UI normalizers/enhancers to a container (post-render).
	 * Keep this file small and add more normalizers later in one place.
	 *
	 * @param {HTMLElement} root
	 */UI.apply_post_render=function(root){if(!root){return;}try{UI.WPBC_BFB_ValueSlider?.init_on?.(root);}catch(e){/* noop */}try{var T=UI.WPBC_BFB_Toggle_Normalizer;if(T&&typeof T.upgrade_checkboxes_in==='function'){T.upgrade_checkboxes_in(root);}}catch(e){w._wpbc?.dev?.error?.('apply_post_render.toggle',e);}// Accessibility: keep aria-checked in sync for all toggles inside root.
try{root.querySelectorAll('.wpbc_ui__toggle input[type="checkbox"]').forEach(function(cb){if(cb.__wpbc_aria_hooked){return;}cb.__wpbc_aria_hooked=true;cb.setAttribute('aria-checked',cb.checked?'true':'false');// Delegate ‘change’ just once per render – native delegation still works fine for your logic.
cb.addEventListener('change',()=>{cb.setAttribute('aria-checked',cb.checked?'true':'false');},{passive:true});});}catch(e){w._wpbc?.dev?.error?.('apply_post_render.aria',e);}};UI.InspectorEnhancers=UI.InspectorEnhancers||function(){var regs=[];function register(name,selector,init,destroy){regs.push({name,selector,init,destroy});}function scan(root){if(!root)return;regs.forEach(function(r){root.querySelectorAll(r.selector).forEach(function(node){node.__wpbc_eh=node.__wpbc_eh||{};if(node.__wpbc_eh[r.name])return;try{r.init&&r.init(node,root);node.__wpbc_eh[r.name]=true;}catch(_e){}});});}function destroy(root){if(!root)return;regs.forEach(function(r){root.querySelectorAll(r.selector).forEach(function(node){try{r.destroy&&r.destroy(node,root);}catch(_e){}if(node.__wpbc_eh)delete node.__wpbc_eh[r.name];});});}return{register,scan,destroy};}();UI.WPBC_BFB_ValueSlider={init_on(root){var groups=(root.nodeType===1?[root]:[]).concat([].slice.call(root.querySelectorAll?.('[data-len-group]')||[]));groups.forEach(function(g){if(!g.matches||!g.matches('[data-len-group]'))return;if(g.__wpbc_len_wired)return;var number=g.querySelector('[data-len-value]');var range=g.querySelector('[data-len-range]');var unit=g.querySelector('[data-len-unit]');if(!number||!range)return;// Mirror constraints if missing on the range.
['min','max','step'].forEach(function(a){if(!range.hasAttribute(a)&&number.hasAttribute(a)){range.setAttribute(a,number.getAttribute(a));}});function sync_range_from_number(){if(g.hasAttribute('data-len-allow-empty')&&''===number.value){var empty_range_value=range.min||'0';if(range.value!==empty_range_value){range.value=empty_range_value;}return;}if(range.value!==number.value){range.value=number.value;}}function dispatch_input(el){try{el.dispatchEvent(new Event('input',{bubbles:true}));}catch(_e){}}function dispatch_change(el){try{el.dispatchEvent(new Event('change',{bubbles:true}));}catch(_e){}}// Throttle range->number syncing (time-based).
var timer_id=0;var pending_val=null;var pending_change=false;var last_flush_ts=0;// Change this to tune speed: 50..120 ms is a good range.
var min_interval_ms=parseInt(g.dataset.lenThrottle||UI.VALUE_SLIDER_THROTTLE_MS,10);min_interval_ms=Number.isFinite(min_interval_ms)?Math.max(0,min_interval_ms):120;function flush_range_to_number(){timer_id=0;if(pending_val==null){return;}var next=String(pending_val);pending_val=null;if(number.value!==next){number.value=next;// IMPORTANT: only 'input' while dragging.
dispatch_input(number);}if(pending_change){pending_change=false;dispatch_change(number);}last_flush_ts=Date.now();}function schedule_range_to_number(val,emit_change){pending_val=val;if(emit_change){pending_change=true;}// If commit requested, flush immediately.
if(pending_change){if(timer_id){clearTimeout(timer_id);timer_id=0;}flush_range_to_number();return;}var now=Date.now();var delta=now-last_flush_ts;// If enough time passed, flush immediately; else schedule.
if(delta>=min_interval_ms){flush_range_to_number();return;}if(timer_id){return;}timer_id=setTimeout(flush_range_to_number,Math.max(0,min_interval_ms-delta));}function on_number_input(){sync_range_from_number();}function on_number_change(){sync_range_from_number();}function on_range_input(){schedule_range_to_number(range.value,false);}function on_range_change(){schedule_range_to_number(range.value,true);}number.addEventListener('input',on_number_input);number.addEventListener('change',on_number_change);range.addEventListener('input',on_range_input);range.addEventListener('change',on_range_change);if(unit){unit.addEventListener('change',function(){// We just nudge the number so upstream handlers re-run.
try{number.dispatchEvent(new Event('input',{bubbles:true}));}catch(_e){}});}// Initial sync
sync_range_from_number();g.__wpbc_len_wired={destroy(){number.removeEventListener('input',on_number_input);number.removeEventListener('change',on_number_change);range.removeEventListener('input',on_range_input);range.removeEventListener('change',on_range_change);}};});},destroy_on(root){var groups=(root&&root.nodeType===1?[root]:[]).concat([].slice.call(root.querySelectorAll?.('[data-len-group]')||[]));groups.forEach(function(g){if(!g.matches||!g.matches('[data-len-group]'))return;try{g.__wpbc_len_wired&&g.__wpbc_len_wired.destroy&&g.__wpbc_len_wired.destroy();}catch(_e){}delete g.__wpbc_len_wired;});}};// Register with the global enhancers hub.
UI.InspectorEnhancers&&UI.InspectorEnhancers.register('value-slider','[data-len-group]',function(el,_root){UI.WPBC_BFB_ValueSlider.init_on(el);},function(el,_root){UI.WPBC_BFB_ValueSlider.destroy_on(el);});// Single, load-order-safe patch so enhancers auto-run on every bind.
(function patchInspectorEnhancers(){function applyPatch(){var Inspector=w.WPBC_BFB_Inspector;if(!Inspector||Inspector.__wpbc_enhancers_patched)return false;Inspector.__wpbc_enhancers_patched=true;var orig=Inspector.prototype.bind_to_field;Inspector.prototype.bind_to_field=function(el){orig.call(this,el);try{var ins=this.panel||document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');UI.InspectorEnhancers&&UI.InspectorEnhancers.scan(ins);}catch(_e){}};// Initial scan if the DOM is already present.
try{var insEl=document.getElementById('wpbc_bfb__inspector')||document.querySelector('.wpbc_bfb__inspector');UI.InspectorEnhancers&&UI.InspectorEnhancers.scan(insEl);}catch(_e){}return true;}// Try now; if Inspector isn’t defined yet, patch when it becomes ready.
if(!applyPatch()){document.addEventListener('wpbc_bfb_inspector_ready',function(){applyPatch();},{once:true});}})();})(window,document);// ---------------------------------------------------------------------------------------------------------------------
// == File  /includes/page-form-builder/__js/core/bfb-sync-code-tools-tab.js   | 2026-04-06 | 16:38
// ---------------------------------------------------------------------------------------------------------------------
(function(w,d){'use strict';/**
	 * Dispatch request to show a right sidebar panel.
	 *
	 * @param {string} panel_id
	 * @param {string} tab_id
	 *
	 * @return {void}
	 */function wpbc_bfb__dispatch_show_panel(panel_id,tab_id){var event_detail;if(!panel_id||!tab_id){return;}event_detail={panel_id:panel_id,tab_id:tab_id};if(typeof w.wpbc_bfb__dispatch_event_safe==='function'){w.wpbc_bfb__dispatch_event_safe('wpbc_bfb:show_panel',event_detail);return;}d.dispatchEvent(new CustomEvent('wpbc_bfb:show_panel',{detail:event_detail}));}/**
	 * Sync right sidebar with top mode tabs.
	 *
	 * Uses top tabs nav attribute `data-active-tab` as the source of truth.
	 * This avoids false detection on initial page load, because top panels are
	 * hidden by inline style `display:none`, not by the `hidden` attribute.
	 */class WPBC_BFB_Mode_Rightbar_Sync{constructor(){this.top_tabs_nav=null;this.advanced_tab_wrap=null;this.advanced_panel=null;this.mutation_observer=null;this.last_mode='';this.sync_rightbar_mode=this.sync_rightbar_mode.bind(this);this.handle_click=this.handle_click.bind(this);}/**
		 * Init controller.
		 *
		 * @return {void}
		 */init(){this.top_tabs_nav=d.getElementById('wpbc_bfb__top_horisontal_nav');this.advanced_tab_wrap=d.querySelector('.wpbc_bfb__rightbar_tab_wrap--advanced_tools');this.advanced_panel=d.getElementById('wpbc_bfb__inspector_advanced_tools');if(!this.advanced_tab_wrap||!this.advanced_panel){return;}// Observe active tab changes in the top tabs nav.
if(this.top_tabs_nav){this.mutation_observer=new MutationObserver(this.sync_rightbar_mode);this.mutation_observer.observe(this.top_tabs_nav,{attributes:true,attributeFilter:['data-active-tab']});}// Fallback for click-driven switching.
d.addEventListener('click',this.handle_click,true);// Initial sync.
this.sync_rightbar_mode();}/**
		 * Get active top tab id.
		 *
		 * Priority:
		 * 1. data-active-tab from top tabs nav
		 * 2. active CSS class in nav
		 * 3. visible top panel fallback
		 *
		 * @return {string}
		 */get_active_top_tab_id(){var active_tab_id='';var active_link=null;var advanced_panel=null;var builder_panel=null;if(this.top_tabs_nav){active_tab_id=String(this.top_tabs_nav.getAttribute('data-active-tab')||'').trim();if(''!==active_tab_id){return active_tab_id;}active_link=this.top_tabs_nav.querySelector('.wpbc_ui_el__horis_nav_item.active [data-wpbc-bfb-tab]');if(active_link){active_tab_id=String(active_link.getAttribute('data-wpbc-bfb-tab')||'').trim();if(''!==active_tab_id){return active_tab_id;}}}// Final fallback: detect visible panel.
advanced_panel=d.querySelector('.wpbc_bfb__top_tab_section__advanced_tab');builder_panel=d.querySelector('.wpbc_bfb__top_tab_section__builder_tab');if(this.is_element_visible(advanced_panel)){return'advanced_tab';}if(this.is_element_visible(builder_panel)){return'builder_tab';}return'';}/**
		 * Check element visibility.
		 *
		 * @param {HTMLElement|null} el
		 *
		 * @return {boolean}
		 */is_element_visible(el){var style;if(!el){return false;}style=w.getComputedStyle(el);if(!style){return false;}if('none'===style.display){return false;}if('hidden'===style.visibility){return false;}return true;}/**
		 * Check if Advanced Mode is active.
		 *
		 * @return {boolean}
		 */is_advanced_mode_active(){return'advanced_tab'===this.get_active_top_tab_id();}/**
		 * Show Code Tools tab button.
		 *
		 * @return {void}
		 */show_advanced_tools_tab(){this.advanced_tab_wrap.removeAttribute('hidden');this.advanced_tab_wrap.setAttribute('aria-hidden','false');}/**
		 * Hide Code Tools tab button.
		 *
		 * @return {void}
		 */hide_advanced_tools_tab(){this.advanced_tab_wrap.setAttribute('hidden','true');this.advanced_tab_wrap.setAttribute('aria-hidden','true');}/**
		 * Check if Code Tools panel is currently active.
		 *
		 * @return {boolean}
		 */is_advanced_tools_panel_active(){return!!(this.advanced_panel&&!this.advanced_panel.hasAttribute('hidden'));}/**
		 * Open Code Tools panel.
		 *
		 * @return {void}
		 */open_advanced_tools_panel(){wpbc_bfb__dispatch_show_panel('wpbc_bfb__inspector_advanced_tools','wpbc_tab_advanced_tools');}/**
		 * Open default builder rightbar panel.
		 *
		 * @return {void}
		 */open_default_visual_panel(){wpbc_bfb__dispatch_show_panel('wpbc_bfb__palette_add_new','wpbc_tab_library');}/**
		 * Sync rightbar mode with top tabs mode.
		 *
		 * @return {void}
		 */sync_rightbar_mode(){var is_advanced_mode=this.is_advanced_mode_active();if(is_advanced_mode){this.show_advanced_tools_tab();if('advanced'!==this.last_mode){this.open_advanced_tools_panel();}this.last_mode='advanced';return;}if(this.is_advanced_tools_panel_active()){this.open_default_visual_panel();}this.hide_advanced_tools_tab();this.last_mode='builder';}/**
		 * Fallback click handler for top tabs.
		 *
		 * @param {Event} event
		 *
		 * @return {void}
		 */handle_click(event){var target=event.target.closest('[data-wpbc-bfb-tab]');var this_obj=this;if(!target){return;}setTimeout(function(){this_obj.sync_rightbar_mode();},0);}}if(d.readyState==='loading'){d.addEventListener('DOMContentLoaded',function(){new WPBC_BFB_Mode_Rightbar_Sync().init();});}else{new WPBC_BFB_Mode_Rightbar_Sync().init();}})(window,document);// ---------------------------------------------------------------------------------------------------------------------
// == File  /includes/page-form-builder/_out/core/bfb-inspector.js == Time point: 2025-09-06 14:08
// ---------------------------------------------------------------------------------------------------------------------
(function(w){'use strict';// 1) Actions registry.
/** @type {Record<string, (ctx: InspectorActionContext) => void>} */const __INSPECTOR_ACTIONS_MAP__=Object.create(null);// Built-ins.
__INSPECTOR_ACTIONS_MAP__['deselect']=({builder})=>{builder?.select_field?.(null);};__INSPECTOR_ACTIONS_MAP__['scrollto']=({builder,el})=>{if(!el||!document.body.contains(el))return;builder?.select_field?.(el,{scrollIntoView:true});el.classList.add('wpbc_bfb__scroll-pulse');setTimeout(()=>el.classList.remove('wpbc_bfb__scroll-pulse'),700);};__INSPECTOR_ACTIONS_MAP__['move-up']=({builder,el})=>{if(!el)return;builder?.move_item?.(el,'up');// Scroll after the DOM has settled.
requestAnimationFrame(()=>__INSPECTOR_ACTIONS_MAP__['scrollto']({builder,el}));};__INSPECTOR_ACTIONS_MAP__['move-down']=({builder,el})=>{if(!el)return;builder?.move_item?.(el,'down');// Scroll after the DOM has settled.
requestAnimationFrame(()=>__INSPECTOR_ACTIONS_MAP__['scrollto']({builder,el}));};__INSPECTOR_ACTIONS_MAP__['delete']=({builder,el,confirm=w.confirm})=>{if(!el)return;const is_field=el.classList.contains('wpbc_bfb__field');const label=is_field?el.querySelector('.wpbc_bfb__field-label')?.textContent||el.dataset?.id||'field':el.dataset?.id||'section';UI.Modal_Confirm_Delete.open(label,()=>{// Central command will remove, emit events, and reselect neighbor (which re-binds Inspector).
builder?.delete_item?.(el);});};__INSPECTOR_ACTIONS_MAP__['duplicate']=({builder,el})=>{if(!el)return;const clone=builder?.duplicate_item?.(el);if(clone)builder?.select_field?.(clone,{scrollIntoView:true});};// Public API.
w.WPBC_BFB_Inspector_Actions={run(name,ctx){const fn=__INSPECTOR_ACTIONS_MAP__[name];if(typeof fn==='function')fn(ctx);else console.warn('WPBC. Inspector action not found:',name);},register(name,handler){if(!name||typeof handler!=='function'){throw new Error('register(name, handler): invalid arguments');}__INSPECTOR_ACTIONS_MAP__[name]=handler;},has(name){return typeof __INSPECTOR_ACTIONS_MAP__[name]==='function';}};// 2) Inspector Factory.
var UI=w.WPBC_BFB_Core.UI=w.WPBC_BFB_Core.UI||{};// Global Hybrid++ registries (keep public).
w.wpbc_bfb_inspector_factory_slots=w.wpbc_bfb_inspector_factory_slots||{};w.wpbc_bfb_inspector_factory_value_from=w.wpbc_bfb_inspector_factory_value_from||{};// Define Factory only if missing (no early return for the whole bundle).
// always define/replace Factory
{/**
		 * Utility: create element with attributes and children.
		 *
		 * @param {string} tag
		 * @param {Object=} attrs
		 * @param {(Node|string|Array<Node|string>)=} children
		 * @returns {HTMLElement}
		 */function el(tag,attrs,children){var node=document.createElement(tag);if(attrs){Object.keys(attrs).forEach(function(k){var v=attrs[k];if(v==null)return;if(k==='class'){node.className=v;return;}if(k==='dataset'){Object.keys(v).forEach(function(dk){node.dataset[dk]=String(v[dk]);});return;}if(k==='checked'&&typeof v==='boolean'){if(v)node.setAttribute('checked','checked');return;}if(k==='disabled'&&typeof v==='boolean'){if(v)node.setAttribute('disabled','disabled');return;}// normalize boolean attributes to strings.
if(typeof v==='boolean'){node.setAttribute(k,v?'true':'false');return;}node.setAttribute(k,String(v));});}if(children){(Array.isArray(children)?children:[children]).forEach(function(c){if(c==null)return;node.appendChild(typeof c==='string'?document.createTextNode(c):c);});}return node;}/**
		 * Build a toggle control row (checkbox rendered as toggle).
		 *
		 * Structure:
		 * <div class="inspector__row inspector__row--toggle">
		 *   <div class="inspector__control wpbc_ui__toggle">
		 *     <input type="checkbox" id="ID" data-inspector-key="KEY" class="inspector__input" checked>
		 *     <label class="wpbc_ui__toggle_icon"  for="ID"></label>
		 *     <label class="wpbc_ui__toggle_label" for="ID">Label text</label>
		 *   </div>
		 * </div>
		 *
		 * @param {string} input_id
		 * @param {string} key
		 * @param {boolean} checked
		 * @param {string} label_text
		 * @returns {HTMLElement}
		 */function build_toggle_row(input_id,key,checked,label_text){var row_el=el('div',{'class':'inspector__row inspector__row--toggle'});var ctrl_wrap=el('div',{'class':'inspector__control wpbc_ui__toggle'});var input_el=el('input',{id:input_id,type:'checkbox','data-inspector-key':key,'class':'inspector__input',checked:!!checked,role:'switch','aria-checked':!!checked});var icon_lbl=el('label',{'class':'wpbc_ui__toggle_icon','for':input_id});var text_lbl=el('label',{'class':'wpbc_ui__toggle_label','for':input_id},label_text||'');ctrl_wrap.appendChild(input_el);ctrl_wrap.appendChild(icon_lbl);ctrl_wrap.appendChild(text_lbl);row_el.appendChild(ctrl_wrap);return row_el;}/**
	 * Utility: choose initial value from data or schema default.
	 */function get_initial_value(key,data,props_schema){if(data&&Object.prototype.hasOwnProperty.call(data,key))return data[key];var meta=props_schema&&props_schema[key];return meta&&Object.prototype.hasOwnProperty.call(meta,'default')?meta.default:'';}/**
	 * Utility: coerce value by schema type.
	 */function coerce_by_type(value,type){switch(type){case'number':case'int':case'float':if(value===''||value==null){return'';}var n=Number(value);return isNaN(n)?'':n;case'boolean':return!!value;case'array':return Array.isArray(value)?value:[];default:return value==null?'':String(value);}}/**
	 * Normalize <select> options (array of {value,label} or map {value:label}).
	 */function normalize_select_options(options){if(Array.isArray(options)){return options.map(function(o){if(typeof o==='object'&&o&&'value'in o){return{value:String(o.value),label:String(o.label||o.value)};}return{value:String(o),label:String(o)};});}if(options&&typeof options==='object'){return Object.keys(options).map(function(k){return{value:String(k),label:String(options[k])};});}return[];}/** Parse a CSS length like "120px" or "80%" into { value:number, unit:string }. */function parse_len(value,fallback_unit){value=value==null?'':String(value).trim();var m=value.match(/^(-?\d+(?:\.\d+)?)(px|%|rem|em)$/i);if(m){return{value:parseFloat(m[1]),unit:m[2].toLowerCase()};}// plain number -> assume fallback unit
if(value!==''&&!isNaN(Number(value))){return{value:Number(value),unit:fallback_unit||'px'};}return{value:0,unit:fallback_unit||'px'};}/** Clamp helper. */function clamp_num(v,min,max){if(typeof v!=='number'||isNaN(v))return min!=null?min:0;if(min!=null&&v<min)v=min;if(max!=null&&v>max)v=max;return v;}// Initialize Coloris pickers in a given root.
// Relies on Coloris being enqueued (see bfb-bootstrap.php).
function init_coloris_pickers(root){if(!root||!w.Coloris)return;// Mark inputs we want Coloris to handle.
var inputs=root.querySelectorAll('input[data-inspector-type="color"]');if(!inputs.length)return;// Add a stable class for Coloris targeting; avoid double-initializing.
inputs.forEach(function(input){if(input.classList.contains('wpbc_bfb_coloris'))return;input.classList.add('wpbc_bfb_coloris');});// Create/refresh a Coloris instance bound to these inputs.
// Keep HEX output to match schema defaults (e.g., "#e0e0e0").
try{w.Coloris({el:'.wpbc_bfb_coloris',alpha:false,format:'hex',themeMode:'auto'});// Coloris already dispatches 'input' events on value changes.
}catch(e){// Non-fatal: if Coloris throws (rare), the text input still works.
console.warn('WPBC Inspector: Coloris init failed:',e);}}/**
		 * Build: slider + number in one row (writes to a single data key).
		 * Control meta: { type:'range_number', key, label, min, max, step }
		 */function build_range_number_row(input_id,key,label_text,value,meta){var row_el=el('div',{'class':'inspector__row'});var label_el=el('label',{'for':input_id,'class':'inspector__label'},label_text||key||'');var ctrl=el('div',{'class':'inspector__control'});var min=meta&&meta.min!=null?meta.min:0;var max=meta&&meta.max!=null?meta.max:100;var step=meta&&meta.step!=null?meta.step:1;var group=el('div',{'class':'wpbc_len_group wpbc_inline_inputs','data-len-group':key});var range=el('input',{type:'range','class':'inspector__input','data-len-range':'',min:String(min),max:String(max),step:String(step),value:String(value==null||value===''?min:value)});var num=el('input',{id:input_id,type:'number','class':'inspector__input inspector__w_30','data-len-value':'','data-inspector-key':key,min:String(min),max:String(max),step:String(step),value:value==null||value===''?String(min):String(value)});group.appendChild(range);group.appendChild(num);ctrl.appendChild(group);row_el.appendChild(label_el);row_el.appendChild(ctrl);return row_el;}/**
		 * Build: (number + unit) + slider, writing a *single* combined string to `key`.
		 * Control meta:
		 * {
		 *   type:'len', key, label, units:['px','%','rem','em'],
		 *   slider: { px:{min:0,max:512,step:1}, '%':{min:0,max:100,step:1}, rem:{min:0,max:10,step:0.1}, em:{...} },
		 *   fallback_unit:'px'
		 * }
		 */function build_len_compound_row(control,props_schema,data,uid){var key=control.key;var label_text=control.label||key||'';var def_str=get_initial_value(key,data,props_schema);var fallback_u=control.fallback_unit||'px';var parsed=parse_len(def_str,fallback_u);var row=el('div',{'class':'inspector__row'});var label=el('label',{'class':'inspector__label'},label_text);var ctrl=el('div',{'class':'inspector__control'});var units=Array.isArray(control.units)&&control.units.length?control.units:['px','%','rem','em'];var slider_map=control.slider||{'px':{min:0,max:512,step:1},'%':{min:0,max:100,step:1},'rem':{min:0,max:10,step:0.1},'em':{min:0,max:10,step:0.1}};// Host with a hidden input that carries data-inspector-key to reuse the standard handler.
var group=el('div',{'class':'wpbc_len_group','data-len-group':key});var inline=el('div',{'class':'wpbc_inline_inputs'});var num=el('input',{type:'number','class':'inspector__input','data-len-value':'',min:'0',step:'any',value:String(parsed.value)});var sel=el('select',{'class':'inspector__input','data-len-unit':''});units.forEach(function(u){var opt=el('option',{value:u},u);if(u===parsed.unit)opt.setAttribute('selected','selected');sel.appendChild(opt);});inline.appendChild(num);inline.appendChild(sel);// Slider (unit-aware)
var current=slider_map[parsed.unit]||slider_map[units[0]];var range=el('input',{type:'range','class':'inspector__input','data-len-range':'',min:String(current.min),max:String(current.max),step:String(current.step),value:String(clamp_num(parsed.value,current.min,current.max))});// Hidden writer input that the default Inspector handler will catch.
var hidden=el('input',{type:'text','class':'inspector__input',style:'display:none','aria-hidden':'true',tabindex:'-1',id:'wpbc_ins_'+key+'_'+uid+'_len_hidden','data-inspector-key':key,value:String(parsed.value)+parsed.unit});group.appendChild(inline);group.appendChild(range);group.appendChild(hidden);ctrl.appendChild(group);row.appendChild(label);row.appendChild(ctrl);return row;}/**
		 * Wire syncing for any .wpbc_len_group inside a given root (panel).
		 * - range ⇄ number sync
		 * - unit switches update slider bounds
		 * - hidden writer (if present) gets updated and emits 'input'
		 */function wire_len_group(root){if(!root)return;function find_group(el){return el&&el.closest&&el.closest('.wpbc_len_group');}root.addEventListener('input',function(e){var t=e.target;// Slider moved -> update number (and writer/hidden)
if(t&&t.hasAttribute('data-len-range')){var g=find_group(t);if(!g)return;var num=g.querySelector('[data-len-value]');if(num){num.value=t.value;}var writer=g.querySelector('[data-inspector-key]');if(writer&&writer.type==='text'){var unit=g.querySelector('[data-len-unit]');unit=unit?unit.value:'px';writer.value=String(t.value)+String(unit);// trigger standard inspector handler:
writer.dispatchEvent(new Event('input',{bubbles:true}));}else{// Plain range_number case (number has data-inspector-key) -> fire input on number
if(num&&num.hasAttribute('data-inspector-key')){num.dispatchEvent(new Event('input',{bubbles:true}));}}}// Number typed -> update slider and writer/hidden
if(t&&t.hasAttribute('data-len-value')){var g=find_group(t);if(!g)return;var r=g.querySelector('[data-len-range]');if(r){// clamp within slider bounds if present
var min=Number(r.min);var max=Number(r.max);var v=Number(t.value);if(!isNaN(v)){v=clamp_num(v,isNaN(min)?undefined:min,isNaN(max)?undefined:max);r.value=String(v);if(String(v)!==t.value)t.value=String(v);}}var writer=g.querySelector('[data-inspector-key]');if(writer&&writer.type==='text'){var unit=g.querySelector('[data-len-unit]');unit=unit?unit.value:'px';writer.value=String(t.value||0)+String(unit);writer.dispatchEvent(new Event('input',{bubbles:true}));}// else: number itself likely carries data-inspector-key (range_number); default handler will run.
}},true);root.addEventListener('change',function(e){var t=e.target;// Unit changed -> update slider limits and writer/hidden
if(t&&t.hasAttribute('data-len-unit')){var g=find_group(t);if(!g)return;// Find the control meta via a data attribute on group if provided
// (Factory path sets nothing here; we re-derive from current slider bounds.)
var r=g.querySelector('[data-len-range]');var num=g.querySelector('[data-len-value]');var writer=g.querySelector('[data-inspector-key]');var unit=t.value||'px';// Adjust slider bounds heuristically (match Factory defaults)
var bounds_by_unit={'px':{min:0,max:512,step:1},'%':{min:0,max:100,step:1},'rem':{min:0,max:10,step:0.1},'em':{min:0,max:10,step:0.1}};if(r){var b=bounds_by_unit[unit]||bounds_by_unit['px'];r.min=String(b.min);r.max=String(b.max);r.step=String(b.step);// clamp to new bounds
var v=Number(num&&num.value?num.value:r.value);if(!isNaN(v)){v=clamp_num(v,b.min,b.max);r.value=String(v);if(num)num.value=String(v);}}if(writer&&writer.type==='text'){var v=num&&num.value?num.value:r?r.value:'0';writer.value=String(v)+String(unit);writer.dispatchEvent(new Event('input',{bubbles:true}));}}},true);}// =============================================================================================================
// ==  C O N T R O L  ==
// =============================================================================================================
/**
	 * Schema > Inspector > Control Element, e.g. Input!  Build a single control row:
	 * <div class="inspector__row">
	 *   <label class="inspector__label" for="...">Label</label>
	 *   <div class="inspector__control"><input|textarea|select class="inspector__input" ...></div>
	 * </div>
	 *
	 * @param {Object} control           - schema control meta ({type,key,label,...})
	 * @param {Object} props_schema      - schema.props
	 * @param {Object} data              - current element data-* map
	 * @param {string} uid               - unique suffix for input ids
	 * @param {Object} ctx               - { el, builder, type, data }
	 * @returns {HTMLElement}
	 */function build_control(control,props_schema,data,uid,ctx){var type=control.type;var key=control.key;var label_text=control.label||key||'';var prop_meta=key?props_schema[key]||{type:'string'}:{type:'string'};var value=coerce_by_type(get_initial_value(key,data,props_schema),prop_meta.type);// Allow value_from override (computed at render-time).
if(control&&control.value_from&&w.wpbc_bfb_inspector_factory_value_from[control.value_from]){try{var computed=w.wpbc_bfb_inspector_factory_value_from[control.value_from](ctx||{});value=coerce_by_type(computed,prop_meta.type);}catch(e){console.warn('value_from failed for',control.value_from,e);}}var input_id='wpbc_ins_'+key+'_'+uid;var row_el=el('div',{'class':'inspector__row'});var label_el=el('label',{'for':input_id,'class':'inspector__label'},label_text);var ctrl_wrap=el('div',{'class':'inspector__control'});var field_el;// --- slot host (named UI injection) -----------------------------------
if(type==='slot'&&control.slot){// add a marker class for the layout chips row
var classes='inspector__row inspector__row--slot';if(control.slot==='layout_chips')classes+=' inspector__row--layout-chips';var slot_row=el('div',{'class':classes});if(label_text)slot_row.appendChild(el('label',{'class':'inspector__label'},label_text));// add a data attribute on the host so both CSS and the safety-net can target it
var host_attrs={'class':'inspector__control'};if(control.slot==='layout_chips')host_attrs['data-bfb-slot']='layout_chips';var slot_host=el('div',host_attrs);slot_row.appendChild(slot_host);var slot_fn=w.wpbc_bfb_inspector_factory_slots[control.slot];if(typeof slot_fn==='function'){setTimeout(function(){try{slot_fn(slot_host,ctx||{});}catch(e){console.warn('slot "'+control.slot+'" failed:',e);}},0);}else{slot_host.appendChild(el('div',{'class':'wpbc_bfb__slot__missing'},'[slot: '+control.slot+']'));}return slot_row;}if(type==='textarea'){field_el=el('textarea',{id:input_id,'data-inspector-key':key,rows:control.rows||3,'class':'inspector__input'},value==null?'':String(value));}else if(type==='select'){field_el=el('select',{id:input_id,'data-inspector-key':key,'class':'inspector__input'});normalize_select_options(control.options||[]).forEach(function(opt){var opt_el=el('option',{value:opt.value},opt.label);if(String(value)===opt.value)opt_el.setAttribute('selected','selected');field_el.appendChild(opt_el);});}else if(type==='checkbox'){// field_el = el( 'input', { id: input_id, type: 'checkbox', 'data-inspector-key': key, checked: !!value, 'class': 'inspector__input' } ); //.
// Render as toggle UI instead of label-left + checkbox.  Note: we return the full toggle row here and skip the default row/label flow below.
return build_toggle_row(input_id,key,!!value,label_text);}else if(type==='range_number'){// --- new: slider + number (single key).
var rn_id='wpbc_ins_'+key+'_'+uid;var rn_val=value;// from get_initial_value/prop_meta already.
return build_range_number_row(rn_id,key,label_text,rn_val,control);}else if(type==='len'){// --- new: length compound (value+unit+slider -> writes a single string key).
return build_len_compound_row(control,props_schema,data,uid);}else if(type==='color'){// Color picker (Coloris). Store as string (e.g., "#e0e0e0").
field_el=el('input',{id:input_id,type:'text','data-inspector-key':key,'data-inspector-type':'color','data-coloris':'','class':'inspector__input','data-default-color':value!=null&&value!==''?String(value):control.placeholder||''});if(value!==''){field_el.value=String(value);}}else{// text/number default.
var attrs={id:input_id,type:type==='number'?'number':'text','data-inspector-key':key,'class':'inspector__input'};// number constraints (schema or control)
if(type==='number'){if(Object.prototype.hasOwnProperty.call(prop_meta,'min'))attrs.min=prop_meta.min;if(Object.prototype.hasOwnProperty.call(prop_meta,'max'))attrs.max=prop_meta.max;if(Object.prototype.hasOwnProperty.call(prop_meta,'step'))attrs.step=prop_meta.step;if(Object.prototype.hasOwnProperty.call(control,'min'))attrs.min=control.min;if(Object.prototype.hasOwnProperty.call(control,'max'))attrs.max=control.max;if(Object.prototype.hasOwnProperty.call(control,'step'))attrs.step=control.step;}field_el=el('input',attrs);if(value!=='')field_el.value=String(value);}ctrl_wrap.appendChild(field_el);row_el.appendChild(label_el);row_el.appendChild(ctrl_wrap);return row_el;}/**
		 * Schema > Inspector > Groups! Build an inspector group (collapsible).
		 * Structure:
		 * <section class="wpbc_bfb__inspector__group wpbc_ui__collapsible_group is-open" data-group="...">
		 *   <button type="button" class="group__header" role="button" aria-expanded="true" aria-controls="wpbc_collapsible_panel_X">
		 *     <h3>Group Title</h3>
		 *     <i class="wpbc_ui_el__vert_menu_root_section_icon menu_icon icon-1x wpbc-bi-chevron-right"></i>
		 *   </button>
		 *   <div class="group__fields" id="wpbc_collapsible_panel_X" aria-hidden="false"> …rows… </div>
		 * </section>
		 *
		 * @param {Object} group
		 * @param {Object} props_schema
		 * @param {Object} data
		 * @param {string} uid
		 * @param {Object} ctx
		 * @returns {HTMLElement}
		 */function build_group(group,props_schema,data,uid,ctx){var is_open=!!group.open;var panel_id='wpbc_collapsible_panel_'+uid+'_'+(group.key||'g');var section=el('section',{'class':'wpbc_bfb__inspector__group wpbc_ui__collapsible_group'+(is_open?' is-open':''),'data-group':group.key||''});var header_btn=el('button',{type:'button','class':'group__header',role:'button','aria-expanded':is_open?'true':'false','aria-controls':panel_id},[el('h3',null,group.title||group.label||group.key||''),el('i',{'class':'wpbc_ui_el__vert_menu_root_section_icon menu_icon icon-1x wpbc-bi-chevron-right'})]);var fields=el('div',{'class':'group__fields',id:panel_id,'aria-hidden':is_open?'false':'true'});function asArray(x){if(Array.isArray(x))return x;if(x&&typeof x==='object')return Object.values(x);return x!=null?[x]:[];}asArray(group.controls).forEach(function(control){fields.appendChild(build_control(control,props_schema,data,uid,ctx));});section.appendChild(header_btn);section.appendChild(fields);return section;}/**
		 * Schema > Inspector > Header! Build inspector header with action buttons wired to existing data-action handlers.
		 *
		 * @param {Array<string>} header_actions
		 * @param {string}        title_text
		 * @returns {HTMLElement}
		 */function build_header(inspector_ui,title_fallback,schema_for_type){inspector_ui=inspector_ui||{};schema_for_type=schema_for_type||{};var variant=inspector_ui.header_variant||'minimal';var headerActions=inspector_ui.header_actions||schema_for_type.header_actions||['deselect','scrollto','move-up','move-down','duplicate','delete'];var title=inspector_ui.title||title_fallback||'';var description=inspector_ui.description||'';// helper to create a button for either header style
function actionBtn(act,minimal){if(minimal){return el('button',{type:'button','class':'button-link','data-action':act},'');}// toolbar variant (rich)
var iconMap={'deselect':'wpbc_icn_near_me_disabled','scrollto':'wpbc_icn_ads_click filter_center_focus','move-up':'wpbc_icn_arrow_upward','move-down':'wpbc_icn_arrow_downward','duplicate':'wpbc_icn_content_copy','delete':'wpbc_icn_delete_outline'};var classes='button button-secondary wpbc_ui_control wpbc_ui_button';if(act==='delete')classes+=' wpbc_ui_button_danger button-link-delete';var btn=el('button',{type:'button','class':classes,'data-action':act,'aria-label':act.replace(/-/g,' ')});if(act==='delete'){btn.appendChild(el('span',{'class':'in-button-text'},'Delete'));btn.appendChild(document.createTextNode(' '));// minor spacing before icon
}btn.appendChild(el('i',{'class':'menu_icon icon-1x '+(iconMap[act]||'')}));return btn;}// === minimal header (existing look; default) ===
if(variant!=='toolbar'){var header=el('header',{'class':'wpbc_bfb__inspector__header'});header.appendChild(el('h3',null,title||''));var actions=el('div',{'class':'wpbc_bfb__inspector__header_actions'});headerActions.forEach(function(act){actions.appendChild(actionBtn(act,/*minimal*/true));});header.appendChild(actions);return header;}// === toolbar header (rich title/desc + grouped buttons) ===
var root=el('div',{'class':'wpbc_bfb__inspector__head'});var wrap=el('div',{'class':'header_container'});var left=el('div',{'class':'header_title_content'});var h3=el('h3',{'class':'title'},title||'');left.appendChild(h3);if(description){left.appendChild(el('div',{'class':'desc'},description));}var right=el('div',{'class':'actions wpbc_ajx_toolbar wpbc_no_borders'});var uiC=el('div',{'class':'ui_container ui_container_small'});var uiG=el('div',{'class':'ui_group'});// Split into visual groups: first 2, next 2, then the rest.
var g1=el('div',{'class':'ui_element'});var g2=el('div',{'class':'ui_element'});var g3=el('div',{'class':'ui_element'});headerActions.slice(0,2).forEach(function(act){g1.appendChild(actionBtn(act,false));});headerActions.slice(2,4).forEach(function(act){g2.appendChild(actionBtn(act,false));});headerActions.slice(4).forEach(function(act){g3.appendChild(actionBtn(act,false));});uiG.appendChild(g1);uiG.appendChild(g2);uiG.appendChild(g3);uiC.appendChild(uiG);right.appendChild(uiC);wrap.appendChild(left);wrap.appendChild(right);root.appendChild(wrap);return root;}function factory_render(panel_el,schema_for_type,data,opts){if(!panel_el)return panel_el;schema_for_type=schema_for_type||{};var props_schema=schema_for_type.schema&&schema_for_type.schema.props?schema_for_type.schema.props:{};var inspector_ui=schema_for_type.inspector_ui||{};var groups=inspector_ui.groups||[];var header_actions=inspector_ui.header_actions||schema_for_type.header_actions||[];var title_text=opts&&opts.title||inspector_ui.title||schema_for_type.label||data&&data.label||'';// Prepare rendering context for slots/value_from, etc.
var ctx={el:opts&&opts.el||null,builder:opts&&opts.builder||null,type:opts&&opts.type||null,data:data||{}};// clear panel.
while(panel_el.firstChild)panel_el.removeChild(panel_el.firstChild);var uid=Math.random().toString(36).slice(2,8);// header.
panel_el.appendChild(build_header(inspector_ui,title_text,schema_for_type));// groups.
groups.forEach(function(g){panel_el.appendChild(build_group(g,props_schema,data||{},uid,ctx));});// ARIA sync for toggles created here (ensure aria-checked matches state).
try{// Centralized UI normalizers (toggles + A11y): handled in Core.
UI.apply_post_render(panel_el);try{wire_len_group(panel_el);// Initialize Coloris on color inputs rendered in this panel.
init_coloris_pickers(panel_el);}catch(_){}}catch(_){}return panel_el;}UI.WPBC_BFB_Inspector_Factory={render:factory_render};// overwrite/refresh
// ---- Built-in slot + value_from for Sections ----
function slot_layout_chips(host,ctx){try{var L=w.WPBC_BFB_Core&&w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Layout_Chips;if(L&&typeof L.render_for_section==='function'){L.render_for_section(ctx.builder,ctx.el,host);}else{host.appendChild(document.createTextNode('[layout_chips not available]'));}}catch(e){console.warn('wpbc_bfb_slot_layout_chips failed:',e);}}w.wpbc_bfb_inspector_factory_slots.layout_chips=slot_layout_chips;function value_from_compute_section_columns(ctx){try{var row=ctx&&ctx.el&&ctx.el.querySelector&&ctx.el.querySelector(':scope > .wpbc_bfb__row');if(!row)return 1;var n=row.querySelectorAll(':scope > .wpbc_bfb__column').length||1;if(n<1)n=1;if(n>4)n=4;return n;}catch(_){return 1;}}w.wpbc_bfb_inspector_factory_value_from.compute_section_columns=value_from_compute_section_columns;}// 3) Inspector class.
class WPBC_BFB_Inspector{constructor(panel_el,builder){this.panel=panel_el||this._create_fallback_panel();this.builder=builder;this.selected_el=null;this._render_timer=null;this._on_delegated_input=e=>this._apply_control_from_event(e);this._on_delegated_change=e=>this._apply_control_from_event(e);this.panel.addEventListener('input',this._on_delegated_input,true);this.panel.addEventListener('change',this._on_delegated_change,true);this._on_delegated_click=e=>{const btn=e.target.closest('[data-action]');if(!btn||!this.panel.contains(btn))return;e.preventDefault();e.stopPropagation();const action=btn.getAttribute('data-action');const el=this.selected_el;if(!el)return;w.WPBC_BFB_Inspector_Actions?.run(action,{builder:this.builder,el,panel:this.panel,event:e});if(action==='delete')this.clear();};this.panel.addEventListener('click',this._on_delegated_click);}_post_render_ui(){try{var UI=w.WPBC_BFB_Core&&w.WPBC_BFB_Core.UI;if(UI&&typeof UI.apply_post_render==='function'){UI.apply_post_render(this.panel);}// NEW: wire slider/number/unit syncing for length & range_number groups.
try{wire_len_group(this.panel);init_coloris_pickers(this.panel);}catch(_){}}catch(e){_wpbc?.dev?.error?.('inspector._post_render_ui',e);}}_apply_control_from_event(e){if(!this.panel.contains(e.target))return;const t=/** @type {HTMLInputElement|HTMLTextAreaElement|HTMLSelectElement} */e.target;const key=t?.dataset?.inspectorKey;if(!key)return;const el=this.selected_el;if(!el||!document.body.contains(el))return;let v;if(t instanceof HTMLInputElement&&t.type==='checkbox'){v=!!t.checked;t.setAttribute('aria-checked',v?'true':'false');// Keep ARIA state in sync for toggles (schema and template paths).
}else if(t instanceof HTMLInputElement&&t.type==='number'){v=t.value===''?'':Number(t.value);}else{v=t.value;}if(key==='id'){const unique=this.builder?.id?.set_field_id?.(el,v);if(unique!=null&&t.value!==unique)t.value=unique;}else if(key==='name'){const unique=this.builder?.id?.set_field_name?.(el,v);if(unique!=null&&t.value!==unique)t.value=unique;}else if(key==='html_id'){const applied=this.builder?.id?.set_field_html_id?.(el,v);if(applied!=null&&t.value!==applied)t.value=applied;}else if(key==='columns'&&el.classList.contains('wpbc_bfb__section')){const v_int=parseInt(String(v),10);if(Number.isFinite(v_int)){const clamped=w.WPBC_BFB_Core.WPBC_BFB_Sanitize.clamp(v_int,1,4);this.builder?.set_section_columns?.(el,clamped);if(String(clamped)!==t.value)t.value=String(clamped);}}else{if(t instanceof HTMLInputElement&&t.type==='checkbox'){el.setAttribute('data-'+key,String(!!v));}else if(t instanceof HTMLInputElement&&t.type==='number'){if(t.value===''||!Number.isFinite(v)){el.removeAttribute('data-'+key);}else{el.setAttribute('data-'+key,String(v));}}else if(v==null){el.removeAttribute('data-'+key);}else{el.setAttribute('data-'+key,typeof v==='object'?JSON.stringify(v):String(v));}}// Update preview/overlay
if(el.classList.contains('wpbc_bfb__field')){if(this.builder?.preview_mode)this.builder.render_preview(el);else this.builder.add_overlay_toolbar(el);}else{this.builder.add_overlay_toolbar(el);}if(this._needs_rerender(el,key,e)){this._schedule_render_preserving_focus(0);}}_needs_rerender(el,key,_e){if(el.classList.contains('wpbc_bfb__section')&&key==='columns')return true;return false;}bind_to_field(field_el){this.selected_el=field_el;this.render();}clear(){this.selected_el=null;if(this._render_timer){clearTimeout(this._render_timer);this._render_timer=null;}// Also clear the section-cols hint on empty state.
this.panel.removeAttribute('data-bfb-section-cols');this.panel.innerHTML='<div class="wpbc_bfb__inspector__empty">Select a field to edit its options.</div>';}_schedule_render_preserving_focus(delay=200){const active=/** @type {HTMLInputElement|HTMLTextAreaElement|HTMLElement|null} */document.activeElement;const activeKey=active?.dataset?.inspectorKey||null;let selStart=null,selEnd=null;if(active&&'selectionStart'in active&&'selectionEnd'in active){// @ts-ignore
selStart=active.selectionStart;// @ts-ignore
selEnd=active.selectionEnd;}if(this._render_timer)clearTimeout(this._render_timer);this._render_timer=/** @type {unknown} */setTimeout(()=>{this.render();if(activeKey){const next=/** @type {HTMLInputElement|HTMLTextAreaElement|HTMLElement|null} */this.panel.querySelector(`[data-inspector-key="${activeKey}"]`);if(next){next.focus();try{if(selStart!=null&&selEnd!=null&&typeof next.setSelectionRange==='function'){// @ts-ignore
next.setSelectionRange(selStart,selEnd);}}catch(e){_wpbc?.dev?.error('_render_timer',e);}}}},delay);}render(){const el=this.selected_el;if(!el||!document.body.contains(el))return this.clear();// Reset section-cols hint unless we set it later for a section.
this.panel.removeAttribute('data-bfb-section-cols');const prev_scroll=this.panel.scrollTop;// Section
if(el.classList.contains('wpbc_bfb__section')){let tpl=null;try{tpl=w.wp&&wp.template&&document.getElementById('tmpl-wpbc-bfb-inspector-section')?wp.template('wpbc-bfb-inspector-section'):null;}catch(_){tpl=null;}if(tpl){this.panel.innerHTML=tpl({});this._enforce_default_group_open();this._set_panel_section_cols(el);this._post_render_ui();this.panel.scrollTop=prev_scroll;return;}const Factory=w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Inspector_Factory;const schemas=w.WPBC_BFB_Schemas||{};const entry=schemas['section']||null;if(entry&&Factory){this.panel.innerHTML='';Factory.render(this.panel,entry,{},{el,builder:this.builder,type:'section',title:entry.label||'Section'});this._enforce_default_group_open();// --- Safety net: if for any reason the slot didn’t render chips, inject them now.
try{const hasSlotHost=this.panel.querySelector('[data-bfb-slot="layout_chips"]')||this.panel.querySelector('.inspector__row--layout-chips .wpbc_bfb__layout_chips')||this.panel.querySelector('#wpbc_bfb__layout_chips_host');const hasChips=!!this.panel.querySelector('.wpbc_bfb__layout_chip');if(!hasChips){// Create a host if missing and render chips into it.
const host=function ensureHost(root){let h=root.querySelector('[data-bfb-slot="layout_chips"]')||root.querySelector('.inspector__row--layout-chips .wpbc_bfb__layout_chips')||root.querySelector('#wpbc_bfb__layout_chips_host');if(h)return h;// Fallback host inside (or after) the “layout” group
const fields=root.querySelector('.wpbc_bfb__inspector__group[data-group="layout"] .group__fields')||root.querySelector('.group__fields')||root;const row=document.createElement('div');row.className='inspector__row inspector__row--layout-chips';const lab=document.createElement('label');lab.className='inspector__label';lab.textContent='Layout';const ctl=document.createElement('div');ctl.className='inspector__control';h=document.createElement('div');h.className='wpbc_bfb__layout_chips';h.setAttribute('data-bfb-slot','layout_chips');ctl.appendChild(h);row.appendChild(lab);row.appendChild(ctl);fields.appendChild(row);return h;}(this.panel);const L=w.WPBC_BFB_Core&&w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Layout_Chips;if(L&&typeof L.render_for_section==='function'){host.innerHTML='';L.render_for_section(this.builder,el,host);}}}catch(e){_wpbc?.dev?.error('WPBC_BFB_Inspector - render',e);}this._set_panel_section_cols(el);this.panel.scrollTop=prev_scroll;return;}this.panel.innerHTML='<div class="wpbc_bfb__inspector__empty">Select a field to edit its options.</div>';return;}// Field
if(!el.classList.contains('wpbc_bfb__field'))return this.clear();const data=w.WPBC_BFB_Core.WPBC_Form_Builder_Helper.get_all_data_attributes(el);const type=data.type||'text';function _get_tpl(id){if(!w.wp||!wp.template)return null;if(!document.getElementById('tmpl-'+id))return null;try{return wp.template(id);}catch(e){return null;}}const tpl_id=`wpbc-bfb-inspector-${type}`;const tpl=_get_tpl(tpl_id);const generic_tpl=_get_tpl('wpbc-bfb-inspector-generic');const schemas=w.WPBC_BFB_Schemas||{};const schema_for_type=schemas[type]||null;const Factory=w.WPBC_BFB_Core.UI&&w.WPBC_BFB_Core.UI.WPBC_BFB_Inspector_Factory;if(tpl){// NEW: merge schema defaults so missing keys (esp. booleans) honor defaults on first paint
const hasOwn=Function.call.bind(Object.prototype.hasOwnProperty);const props=schema_for_type&&schema_for_type.schema&&schema_for_type.schema.props?schema_for_type.schema.props:{};const merged={...data};if(props){Object.keys(props).forEach(k=>{const meta=props[k]||{};if(!hasOwn(data,k)){if(hasOwn(meta,'default')){// Coerce booleans to a real boolean; leave others as-is
merged[k]=meta.type==='boolean'?!!meta.default:meta.default;}}else if(meta.type==='boolean'){// Explicit empty values are legacy unchecked booleans, not missing defaults.
merged[k]=w.WPBC_BFB_Core.WPBC_BFB_Sanitize.coerce_boolean(data[k],false);}else if(data[k]===''&&hasOwn(meta,'default')){merged[k]=meta.default;}});}this.panel.innerHTML=tpl(merged);this._post_render_ui();}else if(schema_for_type&&Factory){this.panel.innerHTML='';Factory.render(this.panel,schema_for_type,{...data},{el,builder:this.builder,type,title:data.label||''});// Ensure toggle normalizers and slider/number/unit wiring are attached.
this._post_render_ui();}else if(generic_tpl){this.panel.innerHTML=generic_tpl({...data});this._post_render_ui();}else{const msg=`There are no Inspector wp.template "${tpl_id}" or Schema for this "${String(type||'')}" element.`;this.panel.innerHTML='';const div=document.createElement('div');div.className='wpbc_bfb__inspector__empty';div.textContent=msg;// safe.
this.panel.appendChild(div);}this._enforce_default_group_open();this.panel.scrollTop=prev_scroll;}_enforce_default_group_open(){const groups=Array.from(this.panel.querySelectorAll('.wpbc_bfb__inspector__group'));if(!groups.length)return;let found=false;groups.forEach(g=>{if(!found&&g.classList.contains('is-open')){found=true;}else{if(g.classList.contains('is-open')){g.classList.remove('is-open');g.dispatchEvent(new Event('wpbc:collapsible:close',{bubbles:true}));}else{g.classList.remove('is-open');}}});if(!found){groups[0].classList.add('is-open');groups[0].dispatchEvent(new Event('wpbc:collapsible:open',{bubbles:true}));}}/**
		 * Set data-bfb-section-cols on the inspector panel based on the current section.
		 * Uses the registered compute fn if available; falls back to direct DOM.
		 * @param {HTMLElement} sectionEl
		 */_set_panel_section_cols(sectionEl){try{// Prefer the already-registered value_from helper if present.
var compute=w.wpbc_bfb_inspector_factory_value_from&&w.wpbc_bfb_inspector_factory_value_from.compute_section_columns;var cols=1;if(typeof compute==='function'){cols=compute({el:sectionEl})||1;}else{// Fallback: compute directly from the DOM.
var row=sectionEl&&sectionEl.querySelector(':scope > .wpbc_bfb__row');cols=row?row.querySelectorAll(':scope > .wpbc_bfb__column').length||1:1;if(cols<1)cols=1;if(cols>4)cols=4;}this.panel.setAttribute('data-bfb-section-cols',String(cols));}catch(_){}}_create_fallback_panel(){const p=document.createElement('div');p.id='wpbc_bfb__inspector';p.className='wpbc_bfb__inspector';document.body.appendChild(p);return/** @type {HTMLDivElement} */p;}}// Export class + ready signal.
w.WPBC_BFB_Inspector=WPBC_BFB_Inspector;document.dispatchEvent(new Event('wpbc_bfb_inspector_ready'));})(window);
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2Rpc3QvYmZiL19vdXQvd3BiY19iZmIuanMiLCJuYW1lcyI6WyJ3IiwiQ29yZSIsIldQQkNfQkZCX0NvcmUiLCJVSSIsIldQQkNfQkZCX1Nhbml0aXplIiwiZXNjX2NzcyIsInMiLCJDU1MiLCJlc2NhcGUiLCJTdHJpbmciLCJyZXBsYWNlIiwiZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yIiwidiIsInNhbml0aXplX2h0bWxfaWQiLCJ0cmltIiwidGVzdCIsInNhbml0aXplX2h0bWxfbmFtZSIsImVzY2FwZV9odG1sIiwiZXNjYXBlX3ZhbHVlX2Zvcl9hdHRyIiwic2FuaXRpemVfY3NzX2NsYXNzbGlzdCIsInRvX3Rva2VuIiwidG9fa2ViYWIiLCJ0b0xvd2VyQ2FzZSIsImlzX3RydXRoeSIsImNvZXJjZV9ib29sZWFuIiwiZGVmIiwicGFyc2VfcGVyY2VudCIsImZhbGxiYWNrX3ZhbHVlIiwibiIsInBhcnNlRmxvYXQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImNsYW1wIiwibWluIiwibWF4IiwiTWF0aCIsImVzY2FwZV9mb3JfYXR0cl9xdW90ZWQiLCJlc2NhcGVfZm9yX3Nob3J0Y29kZSIsInNhZmVfanNvbl9wYXJzZSIsImZhbGxiYWNrIiwiSlNPTiIsInBhcnNlIiwiXyIsInN0cmluZ2lmeV9kYXRhX3ZhbHVlIiwic3RyaW5naWZ5IiwiY29uc29sZSIsImVycm9yIiwic2FuaXRpemVfY3NzX2xlbiIsIm0iLCJtYXRjaCIsInNhbml0aXplX2hleF9jb2xvciIsIldQQkNfQkZCX0lkU2VydmljZSIsImNvbnN0cnVjdG9yIiwicGFnZXNfY29udGFpbmVyIiwiZW5zdXJlX3VuaXF1ZV9maWVsZF9pZCIsImJhc2VJZCIsImN1cnJlbnRFbCIsImJhc2UiLCJpZCIsImVzYyIsImVzY1VpZCIsIm5vdFNlbGYiLCJkYXRhc2V0IiwidWlkIiwicXVlcnlTZWxlY3RvciIsImZvdW5kIiwicmFuZG9tIiwidG9TdHJpbmciLCJzbGljZSIsImVuc3VyZV91bmlxdWVfZmllbGRfbmFtZSIsIm5hbWUiLCJzZWxlY3RvciIsImNsYXNoZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuZ3RoIiwic2V0X2ZpZWxkX2lkIiwiZmllbGRfZWwiLCJuZXdJZFJhdyIsInJlbmRlclByZXZpZXciLCJkZXNpcmVkIiwidW5pcXVlIiwic2V0QXR0cmlidXRlIiwic2V0X2ZpZWxkX25hbWUiLCJuZXdOYW1lUmF3IiwicmF3IiwiZ2V0QXR0cmlidXRlIiwic2V0X2ZpZWxkX2h0bWxfaWQiLCJuZXdIdG1sSWRSYXciLCJyZW1vdmVBdHRyaWJ1dGUiLCJodG1sSWQiLCJjbGFzaEluQ2FudmFzIiwiZG9tQ2xhc2giLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiZG9tQ2xhc2hJc1NlbGYiLCJjb250YWlucyIsIldQQkNfQkZCX0xheW91dFNlcnZpY2UiLCJvcHRzIiwiY29sX2dhcF9wZXJjZW50IiwiY29tcHV0ZV9lZmZlY3RpdmVfYmFzZXNfZnJvbV9yb3ciLCJyb3dfZWwiLCJnYXBfcGVyY2VudCIsImNvbHMiLCJBcnJheSIsImZyb20iLCJtYXAiLCJjb2wiLCJzdHlsZSIsImZsZXhCYXNpcyIsInAiLCJOYU4iLCJzdW1fcmF3IiwicmVkdWNlIiwiYSIsImIiLCJncCIsInRvdGFsX2dhcHMiLCJhdmFpbGFibGUiLCJzY2FsZSIsImJhc2VzIiwiYXBwbHlfYmFzZXNfdG9fcm93IiwiZm9yRWFjaCIsImkiLCJzZXRfZXF1YWxfYmFzZXMiLCJlYWNoIiwiZmlsbCIsImFwcGx5X2xheW91dF9wcmVzZXQiLCJzZWN0aW9uT3JSb3ciLCJ3ZWlnaHRzIiwicm93IiwiY2xhc3NMaXN0IiwiaXNBcnJheSIsInN1bSIsImJ1aWxkX3ByZXNldHNfZm9yX2NvbHVtbnMiLCJmb3JtYXRfcHJlc2V0X2xhYmVsIiwicm91bmQiLCJqb2luIiwicGFyc2Vfd2VpZ2h0cyIsImlucHV0Iiwic3BsaXQiLCJmaWx0ZXIiLCJXUEJDX0JGQl9Vc2FnZUxpbWl0U2VydmljZSIsInBhbGV0dGVfdWxzIiwicGFyc2VfdXNhZ2VfbGltaXQiLCJJbmZpbml0eSIsInBhcnNlSW50IiwiY291bnRfdXNhZ2VfYnlfa2V5IiwidXNlZCIsImFsbCIsImVsIiwia2V5IiwidXNhZ2Vfa2V5IiwidHlwZSIsImdldF9saW1pdF9mb3Jfa2V5Iiwicm9vdHMiLCJhbGxQYWxldHRlRmllbGRzIiwiZmxhdE1hcCIsInIiLCJsaW1pdCIsInVzYWdlbnVtYmVyIiwidXBkYXRlX3BhbGV0dGVfdWkiLCJ1c2FnZSIsInBhbGV0dGVzIiwicGFsIiwicGFuZWxfZmllbGQiLCJwYWxldHRlSWQiLCJ1c2FnZUtleSIsInJhd19saW1pdCIsInBlckVsTGltaXQiLCJnbG9iYWxMaW1pdCIsImN1cnJlbnQiLCJkaXNhYmxlIiwicG9pbnRlckV2ZW50cyIsIm9wYWNpdHkiLCJjb3VudF9mb3Jfa2V5IiwibGltaXRfZm9yX2tleSIsInJlbWFpbmluZ19mb3Jfa2V5IiwiY2FuX2FkZCIsImRlbHRhIiwicmVtIiwiZ2F0ZV9vcl9hbGVydCIsImxhYmVsIiwiYWxlcnQiLCJpc191c2FnZV9vayIsIldQQkNfQkZCX0V2ZW50cyIsIk9iamVjdCIsImZyZWV6ZSIsIlNFTEVDVCIsIkNMRUFSX1NFTEVDVElPTiIsIkZJRUxEX0FERCIsIkZJRUxEX1JFTU9WRSIsIlNUUlVDVFVSRV9DSEFOR0UiLCJTVFJVQ1RVUkVfTE9BREVEIiwiV1BCQ19CRkJfRXZlbnRCdXMiLCJzY29wZV9lbCIsImVtaXQiLCJkZXRhaWwiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJidWJibGVzIiwib24iLCJoYW5kbGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9mZiIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJXUEJDX0JGQl9Tb3J0YWJsZU1hbmFnZXIiLCJidWlsZGVyIiwiZ2lkIiwiaW5zdGFuY2VfaWQiLCJncm91cE5hbWUiLCJhbmltYXRpb24iLCJnaG9zdENsYXNzIiwiY2hvc2VuQ2xhc3MiLCJkcmFnQ2xhc3MiLCJjYW5kaWRhdGVfZHdlbGxfbXMiLCJjYW5kaWRhdGVfY29tbWl0X2Rpc3RhbmNlIiwiY2FuZGlkYXRlX2R3ZWxsX2Rpc3RhbmNlIiwiX2NvbnRhaW5lcnMiLCJTZXQiLCJfZHJhZ19mYWlsX3NhZmVfYm91bmQiLCJfZHJhZ19zdGF0ZSIsIl9iaW5kX2RyYWdfZmFpbF9zYWZlIiwiX2NsZWFudXBfZHJhZ191aSIsImRyYWdfc3RhdGUiLCJpdGVtIiwicmVtb3ZlIiwic291cmNlX3NwYWNlciIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsIl9yZWxlYXNlX2NhbnZhc19nZW9tZXRyeV9sb2NrcyIsIl90b2dnbGVfZG5kX3Jvb3RfZmxhZ3MiLCJfcmVtb3ZlX2RyYWdnaW5nX2NsYXNzIiwiX2NhcHR1cmVfY2FudmFzX2dlb21ldHJ5X2xvY2tzIiwibG9ja19zZWxlY3RvciIsImJsb2NrX3NpemVfcHJvcGVydHkiLCJlbGVtZW50IiwiYmxvY2tfc2l6ZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImhhZF9sb2NrX2NsYXNzIiwicHJldmlvdXNfYmxvY2tfc2l6ZSIsImdldFByb3BlcnR5VmFsdWUiLCJwcmV2aW91c19ibG9ja19zaXplX3ByaW9yaXR5IiwiZ2V0UHJvcGVydHlQcmlvcml0eSIsIkJvb2xlYW4iLCJfYXBwbHlfY2FudmFzX2dlb21ldHJ5X2xvY2tzIiwiZ2VvbWV0cnlfbG9ja3MiLCJnZW9tZXRyeV9sb2NrIiwic2V0UHJvcGVydHkiLCJhZGQiLCJyZW1vdmVQcm9wZXJ0eSIsIl9wcmVwYXJlX2RyYWdfc3RhdGUiLCJldnQiLCJzb3VyY2VfcmVjdCIsImZyb21fcGFsZXR0ZSIsImluY2x1ZGVzIiwic291cmNlX3BhcmVudCIsInNvdXJjZV9uZXh0X3NpYmxpbmciLCJuZXh0U2libGluZyIsIndpZHRoIiwiYWNjZXB0ZWRfY2FuZGlkYXRlIiwicGVuZGluZ19jYW5kaWRhdGUiLCJwZW5kaW5nX3NpbmNlIiwicGVuZGluZ19wb2ludGVyIiwiX2NyZWF0ZV9kcmFnX3NvdXJjZV9zcGFjZXIiLCJzcGFjZXIiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwicmVmZXJlbmNlX25vZGUiLCJpbnNlcnRCZWZvcmUiLCJfc3RhcnRfZHJhZyIsIl9hZGRfZHJhZ2dpbmdfY2xhc3MiLCJfdGFnX2RyYWdfbWlycm9yIiwiX2ZpbmlzaF9kcmFnIiwiX2FsbG93X2NhbnZhc19tb3ZlIiwib3JpZ2luYWxfZXZlbnQiLCJ0byIsImNsb3Nlc3QiLCJ0b3VjaF9ldmVudCIsInRvdWNoZXMiLCJjaGFuZ2VkVG91Y2hlcyIsImV2ZW50X3giLCJjbGllbnRYIiwiZXZlbnRfeSIsImNsaWVudFkiLCJkcmFnZ2VkX3JlY3QiLCJkcmFnZ2VkUmVjdCIsImRyYWdnZWQiLCJwb2ludGVyX3giLCJsZWZ0IiwicG9pbnRlcl95IiwidG9wIiwiY29udGFpbmVyX3JlY3QiLCJwYWRkaW5nX3giLCJwYWRkaW5nX3kiLCJ2aXN1YWxseV9lbXB0eSIsImlubmVyX3RvcCIsImlubmVyX2JvdHRvbSIsImJvdHRvbSIsImlubmVyX2xlZnQiLCJpbm5lcl9yaWdodCIsInJpZ2h0IiwiY2FuZGlkYXRlIiwicmVsYXRlZCIsIndpbGxfaW5zZXJ0X2FmdGVyIiwid2lsbEluc2VydEFmdGVyIiwiY2FuZGlkYXRlX21hdGNoZXMiLCJmaXJzdCIsInNlY29uZCIsIm5vdyIsIndpbmRvdyIsInBlcmZvcm1hbmNlIiwiRGF0ZSIsIngiLCJ5IiwicG9pbnRlcl9kaXN0YW5jZSIsImh5cG90IiwiY2FuZGlkYXRlX2FnZSIsImNyb3NzZWRfY29tbWl0X2Rpc3RhbmNlIiwiY29tcGxldGVkX2R3ZWxsX21vdmUiLCJmaW5pc2hfZHJhZyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImV2dF9uYW1lIiwiaGlkZGVuIiwiZnJvbVBhbGV0dGUiLCJyb2xlIiwibWlycm9yIiwiYWN0aXZlIiwicm9vdCIsImRvY3VtZW50RWxlbWVudCIsImVuc3VyZV9zaW1wbGVfbGlzdCIsImNvbnRhaW5lciIsImhhbmRsZXJzIiwiU29ydGFibGUiLCJnZXQiLCJjb21tb24iLCJmb3JjZUZhbGxiYWNrIiwiZmFsbGJhY2tPbkJvZHkiLCJmYWxsYmFja1RvbGVyYW5jZSIsInJlbW92ZUNsb25lT25IaWRlIiwib25TdGFydCIsIm9uRW5kIiwic2V0VGltZW91dCIsImNyZWF0ZSIsImdyb3VwIiwicHVsbCIsInB1dCIsInNvcnQiLCJkaXJlY3Rpb24iLCJoYW5kbGUiLCJoYW5kbGVfc2VsZWN0b3IiLCJkcmFnZ2FibGUiLCJkcmFnZ2FibGVfc2VsZWN0b3IiLCJmYWxsYmFja0NsYXNzIiwicHJldmVudE9uRmlsdGVyIiwiaW52ZXJ0U3dhcCIsInN3YXBUaHJlc2hvbGQiLCJpbnZlcnRlZFN3YXBUaHJlc2hvbGQiLCJlbXB0eUluc2VydFRocmVzaG9sZCIsImRyYWdvdmVyQnViYmxlIiwic2Nyb2xsIiwic2Nyb2xsU2Vuc2l0aXZpdHkiLCJzY3JvbGxTcGVlZCIsIm9uVXBkYXRlIiwiZW5zdXJlIiwic29ydGFibGVfa2luZCIsIm9uQ2hvb3NlIiwib25Nb3ZlIiwiZHJhZ2dlZEVsIiwib25BZGQiLCJfb25fYWRkX3NlY3Rpb24iLCJoYW5kbGVfb25fYWRkIiwiYmluZCIsImJ1cyIsInJlYXNvbiIsImRhdGEiLCJXUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIiLCJnZXRfYWxsX2RhdGFfYXR0cmlidXRlcyIsImlzU2VjdGlvbiIsImFkZF9vdmVybGF5X3Rvb2xiYXIiLCJwYWdlc19zZWN0aW9ucyIsImluaXRfYWxsX25lc3RlZF9zb3J0YWJsZXMiLCJjb2x1bW5zIiwic2VsZWN0X2ZpZWxkIiwiYWRkX3NlY3Rpb24iLCJzZWN0aW9uIiwibGFzdEVsZW1lbnRDaGlsZCIsIm5ld0luZGV4IiwiY2hpbGRyZW4iLCJyZWYiLCJkZXN0cm95QWxsIiwiaW5zdCIsImRlc3Ryb3kiLCJjbGVhciIsIldQQkNfQkZCX0RPTSIsIlNFTEVDVE9SUyIsInBhZ2VQYW5lbCIsImZpZWxkIiwidmFsaWRGaWVsZCIsImNvbHVtbiIsIm92ZXJsYXkiLCJDTEFTU0VTIiwic2VsZWN0ZWQiLCJBVFRSIiwiY3JlYXRlX2VsZW1lbnQiLCJ0YWciLCJjbGFzc19uYW1lIiwiaW5uZXJfaHRtbCIsImlubmVySFRNTCIsInNldF9kYXRhX2F0dHJpYnV0ZXMiLCJkYXRhX29iaiIsImVudHJpZXMiLCJ2YWwiLCJ2YWx1ZSIsImF0dHJpYnV0ZXMiLCJhdHRyIiwic3RhcnRzV2l0aCIsImUiLCJoYXNFeHBsaWNpdExhYmVsIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJyZW5kZXJfZmllbGRfaW5uZXJfaHRtbCIsImZpZWxkX2RhdGEiLCJoYXNMYWJlbCIsImlzX3JlcXVpcmVkIiwicmVxdWlyZWQiLCJ3cmFwcGVyIiwic3BhbkxhYmVsIiwidGV4dENvbnRlbnQiLCJhcHBlbmRDaGlsZCIsInNwYW5UeXBlIiwiZGVib3VuY2UiLCJmbiIsIndhaXQiLCJ0IiwiZGVib3VuY2VkIiwiYXJncyIsImNsZWFyVGltZW91dCIsImFwcGx5IiwiV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnkiLCJNYXAiLCJyZWdpc3RlciIsIkNsYXNzUmVmIiwic2V0IiwiV1BCQ19CRkJfRmllbGRfQmFzZSIsImdldF9kZWZhdWx0cyIsImh0bWxfaWQiLCJwbGFjZWhvbGRlciIsIm1pbmxlbmd0aCIsIm1heGxlbmd0aCIsInBhdHRlcm4iLCJjc3NjbGFzcyIsImhlbHAiLCJub3JtYWxpemVfZGF0YSIsImQiLCJkZWZhdWx0cyIsIm91dCIsImsiLCJnZXRfdGVtcGxhdGUiLCJ0ZW1wbGF0ZV9pZCIsIndwIiwidGVtcGxhdGUiLCJkb21JZCIsIl9fYmZiX3RwbF9jYWNoZV9tYXAiLCJjb21waWxlciIsInJlbmRlciIsImN0eCIsImNvbXBpbGUiLCJzYW5pdCIsInRpdGxlIiwib25fZmllbGRfZHJvcCIsIm1ldGEiLCJjb250ZXh0IiwiZGVmcyIsInVuZGVmaW5lZCIsImhhc1ZhbHVlIiwiZGVmYXVsdFZhbCIsIlN0cnVjdHVyZSIsInVwZGF0ZV9maWVsZF9wcm9wIiwiX2lubmVyIiwiX2UiLCJmcmVzaCIsImF1dG9uYW1lIiwid2FzX2xvYWRlZCIsImhhc0F0dHJpYnV0ZSIsIlMiLCJ1bmlxIiwibmFtZV91c2VyX3RvdWNoZWQiLCJuYW1lX2Zyb21fbGFiZWwiLCJtYXliZV9hdXRvbmFtZV9mcm9tX2xhYmVsIiwibGFiZWxWYWwiLCJhbGxvd0F1dG8iLCJ1c2VyVG91Y2hlZCIsImlzTG9hZGVkIiwiaW5zIiwibmFtZUN0cmwiLCJXUEJDX0JGQl9TZWxlY3RfQmFzZSIsIm9wdGlvbl9yb3dfdGVtcGxhdGVfaWQiLCJraW5kIiwiX19yb290X3dpcmVkIiwiX19yb290X25vZGUiLCJ1aSIsImxpc3QiLCJob2xkZXIiLCJ0b2dnbGUiLCJhZGRfYnRuIiwiZHJhZ19oYW5kbGUiLCJtdWx0aXBsZV9jaGsiLCJkZWZhdWx0X3RleHQiLCJwbGFjZWhvbGRlcl9pbnB1dCIsInBsYWNlaG9sZGVyX25vdGUiLCJzaXplX2lucHV0IiwibWVudV9yb290IiwibWVudV90b2dnbGUiLCJtZW51X2FjdGlvbiIsInZhbHVlX2RpZmZlcnNfY2hrIiwiYnVpbGRfdmFsdWVfZnJvbV9sYWJlbCIsImRpZmZlcnMiLCJpc192YWx1ZV9kaWZmZXJzX2VuYWJsZWQiLCJwYW5lbCIsImNoayIsImNoZWNrZWQiLCJzeW5jX3ZhbHVlX2lucHV0c192aXNpYmlsaXR5Iiwicm93cyIsImxibF9pbiIsInZhbF9pbiIsImRpc3BsYXkiLCJoYXNDYWNoZSIsImNhY2hlZF92YWx1ZSIsInVzZXJFZGl0ZWQiLCJ2YWx1ZV91c2VyX3RvdWNoZWQiLCJsYmwiLCJtaXJyb3JlZCIsImlzX3Jvd192YWx1ZV91c2VyX3RvdWNoZWQiLCJtYXJrX3Jvd192YWx1ZV91c2VyX3RvdWNoZWQiLCJpbml0X3Jvd19mcmVzaF9mbGFncyIsIm11bHRpcGxlIiwic2l6ZSIsImRlZmF1bHRfdmFsdWUiLCJvcHRpb25zIiwibWluX3dpZHRoIiwidHBsIiwiX3dwYmMiLCJkZXYiLCJXUEJDX0JGQl9PdmVybGF5IiwiaXNfZHJvcCIsIm8iLCJwaCIsImRmbHQiLCJnZXRfcGFuZWxfcm9vdCIsImdldF9saXN0IiwiZ2V0X2hvbGRlciIsIm1ha2VfdWlkIiwiYXBwZW5kX3JvdyIsImlkeCIsInJvd2QiLCJhc3NpZ24iLCJpbmRleCIsInRwbF9pZCIsImh0bWwiLCJ3cmFwIiwibm9kZSIsImZpcnN0RWxlbWVudENoaWxkIiwidmFsSW4iLCJsYmxJbiIsImNsb3NlX2Ryb3Bkb3duIiwiYW5jaG9yX2VsIiwiaW5zZXJ0X2FmdGVyIiwibmV3X25vZGUiLCJyZWZfbm9kZSIsImNvbW1pdF9vcHRpb25zIiwic2VsIiwicHVzaCIsIkV2ZW50Iiwic3luY19kZWZhdWx0X3ZhbHVlX2xvY2siLCJzeW5jX3BsYWNlaG9sZGVyX2xvY2siLCJfX3NlbGVjdGJhc2VfZmllbGQiLCJlbnN1cmVfc29ydGFibGUiLCJleGlzdGluZyIsIndwYmNfYmZiX2FwaSIsImdldF9idWlsZGVyIiwid3BiY19iZmIiLCJzb3J0YWJsZSIsInNvcnRhYmxlX2luaXQiLCJyZWJ1aWxkX2lmX2VtcHR5IiwiaGFzX3Jvd19kZWZhdWx0cyIsImNoZWNrcyIsImlzX211bHRpcGxlX2VuYWJsZWQiLCJoYXNfdGV4dF9kZWZhdWx0X3ZhbHVlIiwiZHYiLCJub3RlIiwibG9jayIsImRpc2FibGVkIiwiaXNNdWx0aXBsZSIsInBsYWNlaG9sZGVyUm93Iiwic2l6ZUlucHV0Iiwic2l6ZVJvdyIsImVuZm9yY2Vfc2luZ2xlX2RlZmF1bHQiLCJjbGlja2VkIiwia2VwdCIsImoiLCJib290c3RyYXBfcGFuZWwiLCJzZWxlY3RiYXNlX2Jvb3RzdHJhcHBlZCIsIndpcmVfb25jZSIsIl9fc2VsZWN0YmFzZV93aXJlZCIsIm9uX3JlYWR5X29yX3JlbmRlciIsImV2Iiwid2lyZV9yb290X2xpc3RlbmVycyIsImlzQ29ubmVjdGVkIiwic2VsZWN0YmFzZV9yb290X3dpcmVkIiwiZ2V0X3BhbmVsIiwidGFyZ2V0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJhY3Rpb24iLCJwcmV2X2NvdW50IiwiaXNfbGFiZWxfb3JfdmFsdWUiLCJpc190b2dnbGUiLCJpc19tdWx0aXBsZSIsIm1hdGNoZXMiLCJpc19kZWZhdWx0X3RleHQiLCJpc192YWx1ZV9kaWZmZXJzIiwiaXNfbXVsdGkiLCJfcHVsc2VfdGltZXJzIiwiX3B1bHNlX21ldGEiLCJQVUxTRV9USFJPVFRMRV9NUyIsIlBVTFNFX0RFQk9VTkNFX01TIiwiU1RSVUNUVVJFX0NIQU5HRV9ERUJPVU5DRV9NUyIsIlZBTFVFX1NMSURFUl9USFJPVFRMRV9NUyIsImNhbmNlbF9wdWxzZSIsImRlbGV0ZSIsInRva2VuIiwiY29sb3Jfc2V0IiwiZGVib3VuY2VfaWQiLCJfcmVzdGFydF9jc3NfYW5pbWF0aW9uIiwiY2xzIiwib2Zmc2V0V2lkdGgiLCJwdWxzZV9vbmNlIiwiZHVyX21zIiwibXMiLCJwdWxzZV9zZXF1ZW5jZSIsInRpbWVzIiwib25fbXMiLCJvZmZfbXMiLCJoZXhfY29sb3IiLCJib2R5IiwiY291bnQiLCJ0aHJvdHRsZV9tcyIsImxhc3RfdHMiLCJoYXZlX2NvbG9yIiwidGljayIsIm0yIiwibTMiLCJwdWxzZV9xdWVyeV9kZWJvdW5jZWQiLCJyb290X29yX3NlbGVjdG9yIiwid2FpdF9tcyIsImMiLCJjb2xvciIsImRlZl9tcyIsInB1bHNlX3F1ZXJ5IiwicHVsc2Vfc2VxdWVuY2Vfc3Ryb25nIiwiV1BCQ19CRkJfTW9kdWxlIiwiaW5pdCIsInN5bmNfc2V0dGluZ3NfYnV0dG9uX3N0YXRlcyIsInNldHRpbmdzX2J1dHRvbnMiLCJpbnNwZWN0b3IiLCJpbnNwZWN0b3JfaXNfb3BlbiIsInNlbGVjdGFibGVfcXVlcnkiLCJidXR0b25zIiwic2V0dGluZ3NfYnV0dG9uIiwib3duZXIiLCJpc19wcmVzc2VkIiwicHJlcGVuZCIsInNldHRpbmdzX2J0biIsIm9uY2xpY2siLCJzY3JvbGxJbnRvVmlldyIsIndwYmNfYmZiX19kaXNwYXRjaF9ldmVudF9zYWZlIiwicGFuZWxfaWQiLCJ0YWJfaWQiLCJiZWhhdmlvciIsImJsb2NrIiwiZm9jdXNhYmxlIiwiZm9jdXMiLCJXUEJDX0JGQl9MYXlvdXRfQ2hpcHMiLCJfZ2V0X2NvbF9taW5fcHgiLCJnZXRDb21wdXRlZFN0eWxlIiwiX2ZpdF93ZWlnaHRzX3Jlc3BlY3RpbmdfbWluIiwiZWZmIiwibGF5b3V0IiwiYXZhaWxQY3QiLCJyb3dQeCIsImF2YWlsUHgiLCJtaW5QY3QiLCJtaW5QeCIsInN1bU1pbiIsIndTdW0iLCJ0YXJnZXRQY3QiLCJsb2NrZWQiLCJsb2NrZWRTdW0iLCJyZW1haW5pbmciLCJmcmVlSWR4IiwiZnJlZVRhcmdldFN1bSIsInJlc3VsdCIsIl9hcHBseV9wcmVzZXRfd2l0aF9taW5fZ3VhcmQiLCJzZWN0aW9uX2VsIiwiZml0dGVkIiwiX2Fubm91bmNlIiwicmVuZGVyX2Zvcl9zZWN0aW9uIiwiaG9zdF9lbCIsIl9tYWtlX2NoaXAiLCJwcmVzZXRzIiwiY3VzdG9tQnRuIiwiZXhhbXBsZSIsInRleHQiLCJwcm9tcHQiLCJidG4iLCJ2aXMiLCJiYXIiLCJmbGV4IiwidG9GaXhlZCIsInR4dCIsInBhcmVudEVsZW1lbnQiLCJXUEJDX0JGQl9TZWxlY3Rpb25fQ29udHJvbGxlciIsIl9zZWxlY3RlZF91aWQiLCJnZXRfc2VsZWN0ZWRfZmllbGQiLCJfb25fY2xlYXIiLCJvbl9jbGVhciIsIl9vbl9wYW5lbF9zaG93biIsIl9zeW5jX3NldHRpbmdzX2J1dHRvbl9zdGF0ZXMiLCJkZWxldGVfaXRlbSIsIm5laWdoYm9yIiwiX2ZpbmRfbmVpZ2hib3Jfc2VsZWN0YWJsZSIsIl9vbl9jYW52YXNfY2xpY2siLCJfaGFuZGxlX2NhbnZhc19jbGljayIsIklHTk9SRSIsImhpdCIsInByZXNlbGVjdF90YWJfa2V5IiwiaW5kZXhPZiIsInNlYyIsImNvbF9zdHlsZXNfYWN0aXZlX3RhYiIsIldQQkNfQkZCX0NvbHVtbl9TdHlsZXMiLCJzZXRfc2VsZWN0ZWRfY29sX2ZsYWciLCJ0YWJzIiwid3BiY191aV90YWJzIiwic2V0X2FjdGl2ZSIsInRhYl9rZXkiLCJwcmV2RWwiLCJjbGVhcl9zZWxlY3RlZF9jb2xfZmxhZyIsInByZXYiLCJwcmV2X3VpZCIsInNvdXJjZSIsImJpbmRfdG9fZmllbGQiLCJJbnNwZWN0b3JFbmhhbmNlcnMiLCJzY2FuIiwiV1BCQ19CRkJfVmFsdWVTbGlkZXIiLCJpbml0X29uIiwiV1BCQ19CRkJfSW5zcGVjdG9yX0JyaWRnZSIsIl9nZW5lcmljX2h5ZHJhdGVfY29udHJvbHMiLCJfaHlkcmF0ZV9zcGVjaWFsX2NvbnRyb2xzIiwiZXNjX2F0dHIiLCJzcmMiLCJfYXR0YWNoX2luc3BlY3RvciIsIl9iaW5kX2lkX3Nhbml0aXplciIsIl9vcGVuX2luc3BlY3Rvcl9hZnRlcl9maWVsZF9hZGRlZCIsIl9iaW5kX2ZvY3VzX3Nob3J0Y3V0cyIsImF0dGFjaCIsIldQQkNfQkZCX0luc3BlY3RvciIsIm9uX2ZvY3VzIiwiZ3JwX2tleSIsInNsb3QiLCJncm91cF93cmFwIiwiaGVhZGVyX2J0biIsIl9vbl9pbnNwZWN0b3JfZm9jdXMiLCJzZXRWYWwiLCJjdHJsIiwiU0tJUCIsInNjaGVtYXMiLCJXUEJDX0JGQl9TY2hlbWFzIiwidHlwZUtleSIsInNjaGVtYUVudHJ5IiwicHJvcHNTY2hlbWEiLCJzY2hlbWEiLCJwcm9wcyIsImhhc093biIsIkZ1bmN0aW9uIiwiZ2V0RGVmYXVsdCIsImRlZmF1bHQiLCJpbnNwZWN0b3JLZXkiLCJkbCIsInZhbHVlX2Zyb20iLCJ2YWx1ZUZyb20iLCJoYXNSYXciLCJkZWZWYWx1ZSIsIkhUTUxJbnB1dEVsZW1lbnQiLCJfX3dwYmNfYmZiX2lkX3Nhbml0aXplcl9ib3VuZCIsIkVWIiwiZW5zdXJlX3NjX2RlYm91bmNlX3N0YXRlIiwiX193cGJjX2JmYl9zY19kZWJvdW5jZV9zdGF0ZSIsInRpbWVyX2lkIiwicGVuZGluZ19wYXlsb2FkIiwiY2FuY2VsX3NjX2RlYm91bmNlZF9lbWl0Iiwic3QiLCJidXNfZW1pdF9jaGFuZ2UiLCJleHRyYSIsImJ1c19lbWl0X2NoYW5nZV9kZWJvdW5jZWQiLCJwYXlsb2FkIiwicHJldmlld19tb2RlIiwicmVuZGVyX3ByZXZpZXciLCJhcHBsaWVkIiwiYmVmb3JlIiwic2FuaXRpemVkIiwic2VsU3RhcnQiLCJzZWxlY3Rpb25TdGFydCIsInNlbEVuZCIsInNlbGVjdGlvbkVuZCIsInNldFNlbGVjdGlvblJhbmdlIiwibmV4dCIsImRlc2lyZWRBcnIiLCJkZXNpcmVkU2V0IiwiaXNDb3JlIiwiYmVmb3JlQ2xhc3NlcyIsImN1c3RvbUJlZm9yZSIsImhhcyIsIm1pc3NpbmciLCJhZnRlckNsYXNzZXMiLCJjaGFuZ2VkIiwic29tZSIsInBoYXNlIiwiYXV0b0FjdGl2ZSIsInRvZ2dsZUF0dHJpYnV0ZSIsImkxOG4iLCJhdXRvX2Zyb21fbGFiZWwiLCJzZWxmTG9ja2VkIiwibmV4dFZhbCIsImlzX2dlbl9rZXkiLCJ2aXN1YWxLZXlzIiwiaXNfbGVuX2dyb3VwX2N0cmwiLCJXUEJDX0JGQl9LZXlib2FyZF9Db250cm9sbGVyIiwiX29uX2tleSIsIm9uX2tleSIsImlzX3R5cGluZyIsIl9pc190eXBpbmdfYW55d2hlcmUiLCJhbHRLZXkiLCJjdHJsS2V5IiwibWV0YUtleSIsInNoaWZ0S2V5IiwiZGlyIiwibW92ZV9pdGVtIiwiYWN0aXZlRWxlbWVudCIsInRhZ05hbWUiLCJpc0NvbnRlbnRFZGl0YWJsZSIsIldQQkNfQkZCX1Jlc2l6ZV9Db250cm9sbGVyIiwiaW5pdF9yZXNpemVfaGFuZGxlciIsImhhbmRsZV9yZXNpemUiLCJidXR0b24iLCJyZXNpemVyIiwiY3VycmVudFRhcmdldCIsImxlZnRfY29sIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsInJpZ2h0X2NvbCIsIm5leHRFbGVtZW50U2libGluZyIsImxlZnRfaW5kZXgiLCJyaWdodF9pbmRleCIsInN0YXJ0X3giLCJsZWZ0X3N0YXJ0X3B4IiwicmlnaHRfc3RhcnRfcHgiLCJwYWlyX3B4IiwiY29tcHV0ZWQiLCJwYWlyX2F2YWlsIiwicGN0VG9QeCIsInBjdCIsImdlbmVyaWNNaW5QY3QiLCJnZW5lcmljTWluUHgiLCJsZWZ0TWluUHgiLCJyaWdodE1pblB4IiwicHJldl91c2VyX3NlbGVjdCIsInVzZXJTZWxlY3QiLCJjdXJzb3IiLCJvbl9tb3VzZV9tb3ZlIiwiZGVsdGFfcHgiLCJuZXdMZWZ0UHgiLCJuZXdSaWdodFB4IiwibmV3TGVmdFBjdCIsIm5ld0Jhc2VzIiwib25fbW91c2VfdXAiLCJub3JtYWxpemVkIiwiV1BCQ19CRkJfUGFnZXNfU2VjdGlvbnMiLCJhZGRfcGFnZSIsInJlYnVpbGRfc2VjdGlvbiIsInNlY3Rpb25fZGF0YSIsImluaXRfc2VjdGlvbl9zb3J0YWJsZSIsIl9yZXRhZ191aWRzX2luX3N1YnRyZWUiLCJub2RlcyIsInByZWZpeCIsIl91aWRfY291bnRlciIsIl9tYWtlX3VuaXF1ZSIsInRha2VuIiwic3RlbSIsIl9kZWR1cGVfc3VidHJlZV9zdHJpY3QiLCJ0YWtlbkRhdGFJZCIsInRha2VuRGF0YU5hbWUiLCJ0YWtlbkh0bWxJZCIsInRha2VuRG9tSWQiLCJkaWQiLCJkbmFtIiwiaGlkIiwiaXNGaWVsZCIsImNvbWJpbmVkVGFrZW4iLCJodG1sRm9yIiwiX21ha2VfYWRkX2NvbHVtbnNfY29udHJvbCIsInBhZ2VfZWwiLCJzZWN0aW9uX2NvbnRhaW5lciIsImluc2VydF9wb3MiLCJjb250ZW50IiwiY2xvbmUiLCJjbG9uZU5vZGUiLCJpbnNlcnQiLCJwYWdlX2NvdW50ZXIiLCJjb250cm9sc19odG1sIiwicmVuZGVyX3dwX3RlbXBsYXRlIiwicGFnZV9udW1iZXIiLCJzZWN0aW9uX2NvdW50X29uX2FkZF9wYWdlIiwiY29udHJvbHNfaG9zdF90b3AiLCJjdHJsX3RvcCIsImNvbnRyb2xzX2hvc3RfYm90dG9tIiwiYWZ0ZXIiLCJjdHJsX2JvdHRvbSIsInNlY3Rpb25fY291bnRlciIsImluaXRfc29ydGFibGUiLCJjb2xzX2RhdGEiLCJjb2xfc3R5bGVzIiwianNvbiIsImFyciIsInBhcnNlX2NvbF9zdHlsZXMiLCJjb2xfZGF0YSIsImNvbHVtbnNfb25seSIsIml0ZW1zIiwiYnVpbGRfZmllbGQiLCJ0cmlnZ2VyX2ZpZWxkX2Ryb3BfY2FsbGJhY2siLCJpc19jb2x1bW4iLCJpc190b3BfbGV2ZWwiLCJXUEJDX0JGQl9TdHJ1Y3R1cmVfSU8iLCJnZXRfc3RydWN0dXJlIiwic2VyaWFsaXplIiwibG9hZF9zYXZlZF9zdHJ1Y3R1cmUiLCJkZXNlcmlhbGl6ZSIsIl9ub3JtYWxpemVfZmllbGRfb3B0aW9uX3ZhbHVlcyIsImhhc192YWx1ZV9kaWZmZXJzIiwidmFsdWVfZGlmZmVycyIsIm9wdGlvbl9yZWNvcmQiLCJfbm9ybWFsaXplX2lkcyIsIl9ub3JtYWxpemVfbmFtZXMiLCJwYWdlcyIsInBhZ2VfaW5kZXgiLCJwYWdlIiwiY2hpbGQiLCJzZXJpYWxpemVfc2VjdGlvbiIsImZfZGF0YSIsImNvbF9zdHlsZXNfcmF3IiwiY29sQ291bnQiLCJwYXJzZWQiLCJzdHJ1Y3R1cmUiLCJkZWZlcklmVHlwaW5nIiwiX2lzX3R5cGluZ19pbl9pbnNwZWN0b3IiLCJfZGVmZXJfdGltZXIiLCJwYWdlX2RhdGEiLCJ3YW50IiwiV1BCQ19CRkJfTWluX1dpZHRoX0d1YXJkIiwiX29uX2ZpZWxkX2FkZCIsIl9vbl9maWVsZF9yZW1vdmUiLCJfb25fc3RydWN0dXJlX2xvYWRlZCIsIl9vbl9zdHJ1Y3R1cmVfY2hhbmdlIiwiX29uX3dpbmRvd19yZXNpemUiLCJfcGVuZGluZ19yb3dzIiwiX3BlbmRpbmdfYWxsIiwiX3JhZl9pZCIsInBhc3NpdmUiLCJfc2NoZWR1bGVfcmVmcmVzaF9hbGwiLCJzcmNfZWwiLCJfc2NoZWR1bGVfcmVmcmVzaF9yb3ciLCJfa2lja19yYWYiLCJyZWZyZXNoX2FsbCIsInJlZnJlc2hfcm93IiwiYXBwbHlfY29sX21pbiIsInB4IiwibWluV2lkdGgiLCJhYnMiLCJjb2xfZWwiLCJtYXhfcHgiLCJjb2xSZWN0IiwiZW5kc1dpdGgiLCJwYXJzZV9sZW5fcHgiLCJjcyIsImZvbnRTaXplIiwiV1BCQ19CRkJfVG9nZ2xlX05vcm1hbGl6ZXIiLCJ1cGdyYWRlX2NoZWNrYm94ZXNfaW4iLCJyb290X2VsIiwiaW5wdXRzIiwiaW5wdXRfaWQiLCJnZW5lcmF0ZV91bmlxdWVfaWQiLCJsYWJlbF90ZXh0IiwicmVzb2x2ZV9sYWJlbF90ZXh0IiwiaWNvbl9sYWJlbCIsInRleHRfbGFiZWwiLCJjcmVhdGVUZXh0Tm9kZSIsInJlcGxhY2VkIiwidHJ5X3JlcGxhY2Vfa25vd25fcm93IiwiYXNzb2MiLCJjc3NfZXNjYXBlIiwibmVhcl9sYWJlbCIsImlsIiwidDIiLCJhcmlhIiwiY3RybF93cmFwIiwiZmlyc3RDaGlsZCIsImljb25fbGJsIiwidGV4dF9sYmwiLCJhcHBseV9wb3N0X3JlbmRlciIsIlQiLCJjYiIsIl9fd3BiY19hcmlhX2hvb2tlZCIsInJlZ3MiLCJfX3dwYmNfZWgiLCJncm91cHMiLCJub2RlVHlwZSIsImNvbmNhdCIsImciLCJfX3dwYmNfbGVuX3dpcmVkIiwibnVtYmVyIiwicmFuZ2UiLCJ1bml0Iiwic3luY19yYW5nZV9mcm9tX251bWJlciIsImVtcHR5X3JhbmdlX3ZhbHVlIiwiZGlzcGF0Y2hfaW5wdXQiLCJkaXNwYXRjaF9jaGFuZ2UiLCJwZW5kaW5nX3ZhbCIsInBlbmRpbmdfY2hhbmdlIiwibGFzdF9mbHVzaF90cyIsIm1pbl9pbnRlcnZhbF9tcyIsImxlblRocm90dGxlIiwiZmx1c2hfcmFuZ2VfdG9fbnVtYmVyIiwic2NoZWR1bGVfcmFuZ2VfdG9fbnVtYmVyIiwiZW1pdF9jaGFuZ2UiLCJvbl9udW1iZXJfaW5wdXQiLCJvbl9udW1iZXJfY2hhbmdlIiwib25fcmFuZ2VfaW5wdXQiLCJvbl9yYW5nZV9jaGFuZ2UiLCJkZXN0cm95X29uIiwiX3Jvb3QiLCJwYXRjaEluc3BlY3RvckVuaGFuY2VycyIsImFwcGx5UGF0Y2giLCJJbnNwZWN0b3IiLCJfX3dwYmNfZW5oYW5jZXJzX3BhdGNoZWQiLCJvcmlnIiwiaW5zRWwiLCJvbmNlIiwid3BiY19iZmJfX2Rpc3BhdGNoX3Nob3dfcGFuZWwiLCJldmVudF9kZXRhaWwiLCJXUEJDX0JGQl9Nb2RlX1JpZ2h0YmFyX1N5bmMiLCJ0b3BfdGFic19uYXYiLCJhZHZhbmNlZF90YWJfd3JhcCIsImFkdmFuY2VkX3BhbmVsIiwibXV0YXRpb25fb2JzZXJ2ZXIiLCJsYXN0X21vZGUiLCJzeW5jX3JpZ2h0YmFyX21vZGUiLCJoYW5kbGVfY2xpY2siLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImF0dHJpYnV0ZUZpbHRlciIsImdldF9hY3RpdmVfdG9wX3RhYl9pZCIsImFjdGl2ZV90YWJfaWQiLCJhY3RpdmVfbGluayIsImJ1aWxkZXJfcGFuZWwiLCJpc19lbGVtZW50X3Zpc2libGUiLCJ2aXNpYmlsaXR5IiwiaXNfYWR2YW5jZWRfbW9kZV9hY3RpdmUiLCJzaG93X2FkdmFuY2VkX3Rvb2xzX3RhYiIsImhpZGVfYWR2YW5jZWRfdG9vbHNfdGFiIiwiaXNfYWR2YW5jZWRfdG9vbHNfcGFuZWxfYWN0aXZlIiwib3Blbl9hZHZhbmNlZF90b29sc19wYW5lbCIsIm9wZW5fZGVmYXVsdF92aXN1YWxfcGFuZWwiLCJpc19hZHZhbmNlZF9tb2RlIiwiZXZlbnQiLCJ0aGlzX29iaiIsInJlYWR5U3RhdGUiLCJfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fIiwiY29uZmlybSIsImlzX2ZpZWxkIiwiTW9kYWxfQ29uZmlybV9EZWxldGUiLCJvcGVuIiwiZHVwbGljYXRlX2l0ZW0iLCJXUEJDX0JGQl9JbnNwZWN0b3JfQWN0aW9ucyIsInJ1biIsIndhcm4iLCJFcnJvciIsIndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3Nsb3RzIiwid3BiY19iZmJfaW5zcGVjdG9yX2ZhY3RvcnlfdmFsdWVfZnJvbSIsImF0dHJzIiwia2V5cyIsImRrIiwiYnVpbGRfdG9nZ2xlX3JvdyIsImlucHV0X2VsIiwiZ2V0X2luaXRpYWxfdmFsdWUiLCJwcm9wc19zY2hlbWEiLCJjb2VyY2VfYnlfdHlwZSIsImlzTmFOIiwibm9ybWFsaXplX3NlbGVjdF9vcHRpb25zIiwicGFyc2VfbGVuIiwiZmFsbGJhY2tfdW5pdCIsImNsYW1wX251bSIsImluaXRfY29sb3Jpc19waWNrZXJzIiwiQ29sb3JpcyIsImFscGhhIiwiZm9ybWF0IiwidGhlbWVNb2RlIiwiYnVpbGRfcmFuZ2VfbnVtYmVyX3JvdyIsImxhYmVsX2VsIiwic3RlcCIsIm51bSIsImJ1aWxkX2xlbl9jb21wb3VuZF9yb3ciLCJjb250cm9sIiwiZGVmX3N0ciIsImZhbGxiYWNrX3UiLCJ1bml0cyIsInNsaWRlcl9tYXAiLCJzbGlkZXIiLCJpbmxpbmUiLCJ1Iiwib3B0IiwidGFiaW5kZXgiLCJ3aXJlX2xlbl9ncm91cCIsImZpbmRfZ3JvdXAiLCJ3cml0ZXIiLCJib3VuZHNfYnlfdW5pdCIsImJ1aWxkX2NvbnRyb2wiLCJwcm9wX21ldGEiLCJjbGFzc2VzIiwic2xvdF9yb3ciLCJob3N0X2F0dHJzIiwic2xvdF9ob3N0Iiwic2xvdF9mbiIsIm9wdF9lbCIsInJuX2lkIiwicm5fdmFsIiwiYnVpbGRfZ3JvdXAiLCJpc19vcGVuIiwiZmllbGRzIiwiYXNBcnJheSIsInZhbHVlcyIsImNvbnRyb2xzIiwiYnVpbGRfaGVhZGVyIiwiaW5zcGVjdG9yX3VpIiwidGl0bGVfZmFsbGJhY2siLCJzY2hlbWFfZm9yX3R5cGUiLCJ2YXJpYW50IiwiaGVhZGVyX3ZhcmlhbnQiLCJoZWFkZXJBY3Rpb25zIiwiaGVhZGVyX2FjdGlvbnMiLCJkZXNjcmlwdGlvbiIsImFjdGlvbkJ0biIsImFjdCIsIm1pbmltYWwiLCJpY29uTWFwIiwiaGVhZGVyIiwiYWN0aW9ucyIsImgzIiwidWlDIiwidWlHIiwiZzEiLCJnMiIsImczIiwiZmFjdG9yeV9yZW5kZXIiLCJwYW5lbF9lbCIsInRpdGxlX3RleHQiLCJXUEJDX0JGQl9JbnNwZWN0b3JfRmFjdG9yeSIsInNsb3RfbGF5b3V0X2NoaXBzIiwiaG9zdCIsIkwiLCJsYXlvdXRfY2hpcHMiLCJ2YWx1ZV9mcm9tX2NvbXB1dGVfc2VjdGlvbl9jb2x1bW5zIiwiY29tcHV0ZV9zZWN0aW9uX2NvbHVtbnMiLCJfY3JlYXRlX2ZhbGxiYWNrX3BhbmVsIiwic2VsZWN0ZWRfZWwiLCJfcmVuZGVyX3RpbWVyIiwiX29uX2RlbGVnYXRlZF9pbnB1dCIsIl9hcHBseV9jb250cm9sX2Zyb21fZXZlbnQiLCJfb25fZGVsZWdhdGVkX2NoYW5nZSIsIl9vbl9kZWxlZ2F0ZWRfY2xpY2siLCJfcG9zdF9yZW5kZXJfdWkiLCJ2X2ludCIsImNsYW1wZWQiLCJzZXRfc2VjdGlvbl9jb2x1bW5zIiwiX25lZWRzX3JlcmVuZGVyIiwiX3NjaGVkdWxlX3JlbmRlcl9wcmVzZXJ2aW5nX2ZvY3VzIiwiZGVsYXkiLCJhY3RpdmVLZXkiLCJwcmV2X3Njcm9sbCIsInNjcm9sbFRvcCIsIl9lbmZvcmNlX2RlZmF1bHRfZ3JvdXBfb3BlbiIsIl9zZXRfcGFuZWxfc2VjdGlvbl9jb2xzIiwiRmFjdG9yeSIsImVudHJ5IiwiaGFzU2xvdEhvc3QiLCJoYXNDaGlwcyIsImVuc3VyZUhvc3QiLCJoIiwibGFiIiwiY3RsIiwiX2dldF90cGwiLCJnZW5lcmljX3RwbCIsIm1lcmdlZCIsIm1zZyIsImRpdiIsInNlY3Rpb25FbCIsImNvbXB1dGUiXSwic291cmNlcyI6WyJiZmItY29yZS5qcyIsImJmYi1maWVsZHMuanMiLCJiZmItdWkuanMiLCJiZmItc3luYy1jb2RlLXRvb2xzLXRhYi5qcyIsImJmYi1pbnNwZWN0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fb3V0L2NvcmUvYmZiLWNvcmUuanMgPT0gfCAyMDI1LTA5LTEwIDE1OjQ3XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4oZnVuY3Rpb24gKCB3ICkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0Ly8gU2luZ2xlIGdsb2JhbCBuYW1lc3BhY2UgKGlkZW1wb3RlbnQgJiBsb2FkLW9yZGVyIHNhZmUpLlxyXG5cdGNvbnN0IENvcmUgPSAoIHcuV1BCQ19CRkJfQ29yZSA9IHcuV1BCQ19CRkJfQ29yZSB8fCB7fSApO1xyXG5cdGNvbnN0IFVJICAgPSAoIENvcmUuVUkgPSBDb3JlLlVJIHx8IHt9ICk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcmUgc2FuaXRpemUvZXNjYXBlL25vcm1hbGl6ZSBoZWxwZXJzLlxyXG5cdCAqIEFsbCBtZXRob2RzIHVzZSBzbmFrZV9jYXNlOyBjYW1lbENhc2UgYWxpYXNlcyBhcmUgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxyXG5cdCAqL1xyXG5cdENvcmUuV1BCQ19CRkJfU2FuaXRpemUgPSBjbGFzcyB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFc2NhcGUgdGV4dCBmb3Igc2FmZSB1c2UgaW4gQ1NTIHNlbGVjdG9ycy5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBzIC0gcmF3IHNlbGVjdG9yIGZyYWdtZW50XHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgZXNjX2NzcyhzKSB7XHJcblx0XHRcdHJldHVybiAody5DU1MgJiYgdy5DU1MuZXNjYXBlKSA/IHcuQ1NTLmVzY2FwZSggU3RyaW5nKCBzICkgKSA6IFN0cmluZyggcyApLnJlcGxhY2UoIC8oW15cXHctXSkvZywgJ1xcXFwkMScgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVzY2FwZSBhIHZhbHVlIGZvciBhdHRyaWJ1dGUgc2VsZWN0b3JzLCBlLmcuIFtkYXRhLWlkPVwiPHZhbHVlPlwiXS5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2XHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKHYpIHtcclxuXHRcdFx0cmV0dXJuIFN0cmluZyggdiApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9cXFxcL2csICdcXFxcXFxcXCcgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvXCIvZywgJ1xcXFxcIicgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvXFxuL2csICdcXFxcQSAnIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1xcXS9nLCAnXFxcXF0nICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTYW5pdGl6ZSBpbnRvIGEgYnJvYWRseSBjb21wYXRpYmxlIEhUTUwgaWQ6IGxldHRlcnMsIGRpZ2l0cywgLSBfIDogLiA7IG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2XHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgc2FuaXRpemVfaHRtbF9pZCh2KSB7XHJcblx0XHRcdGxldCBzID0gKHYgPT0gbnVsbCA/ICcnIDogU3RyaW5nKCB2ICkpLnRyaW0oKTtcclxuXHRcdFx0cyAgICAgPSBzXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9cXHMrL2csICctJyApXHJcblx0XHRcdFx0LnJlcGxhY2UoIC9bXkEtWmEtejAtOVxcLV9cXDouXS9nLCAnLScgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvLSsvZywgJy0nIClcclxuXHRcdFx0XHQucmVwbGFjZSggL15bLV8uOl0rfFstXy46XSskL2csICcnICk7XHJcblx0XHRcdGlmICggIXMgKSByZXR1cm4gJ2ZpZWxkJztcclxuXHRcdFx0aWYgKCAhL15bQS1aYS16XS8udGVzdCggcyApICkgcyA9ICdmLScgKyBzO1xyXG5cdFx0XHRyZXR1cm4gcztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNhbml0aXplIGludG8gYSBzYWZlIEhUTUwgbmFtZSB0b2tlbjogbGV0dGVycywgZGlnaXRzLCBfIC1cclxuXHRcdCAqIE11c3Qgc3RhcnQgd2l0aCBhIGxldHRlcjsgbm8gZG90cy9icmFja2V0cy9zcGFjZXMuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHNhbml0aXplX2h0bWxfbmFtZSh2KSB7XHJcblxyXG5cdFx0XHRsZXQgcyA9ICh2ID09IG51bGwgPyAnJyA6IFN0cmluZyggdiApKS50cmltKCk7XHJcblxyXG5cdFx0XHRzID0gcy5yZXBsYWNlKCAvXFxzKy9nLCAnXycgKS5yZXBsYWNlKCAvW15BLVphLXowLTlfLV0vZywgJ18nICkucmVwbGFjZSggL18rL2csICdfJyApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHMgKSB7XHJcblx0XHRcdFx0cyA9ICdmaWVsZCc7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCAhIC9eW0EtWmEtel0vLnRlc3QoIHMgKSApIHtcclxuXHRcdFx0XHRzID0gJ2ZfJyArIHM7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHM7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFc2NhcGUgZm9yIEhUTUwgdGV4dC9hdHRyaWJ1dGVzIChub3QgVVJMcykuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGVzY2FwZV9odG1sKHYpIHtcclxuXHRcdFx0aWYgKCB2ID09IG51bGwgKSB7XHJcblx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvJi9nLCAnJmFtcDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1wiL2csICcmcXVvdDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLycvZywgJyYjMDM5OycgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvPC9nLCAnJmx0OycgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvPi9nLCAnJmd0OycgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVzY2FwZSBtaW5pbWFsIHNldCBmb3IgYXR0cmlidXRlLXNhZmV0eSB3aXRob3V0IHNsdWdnaW5nLlxyXG5cdFx0ICogS2VlcHMgb3JpZ2luYWwgaHVtYW4gdGV4dDsgZXNjYXBlcyAmLCA8LCA+LCBcIiBhbmQgJyBvbmx5LlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHNcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBlc2NhcGVfdmFsdWVfZm9yX2F0dHIocykge1xyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCBzID09IG51bGwgPyAnJyA6IHMgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvJi9nLCAnJmFtcDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLzwvZywgJyZsdDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLz4vZywgJyZndDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1wiL2csICcmcXVvdDsnIClcclxuXHRcdFx0XHQucmVwbGFjZSggLycvZywgJyYjMzk7JyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2FuaXRpemUgYSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzIGxpc3QuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHNhbml0aXplX2Nzc19jbGFzc2xpc3Qodikge1xyXG5cdFx0XHRpZiAoIHYgPT0gbnVsbCApIHJldHVybiAnJztcclxuXHRcdFx0cmV0dXJuIFN0cmluZyggdiApLnJlcGxhY2UoIC9bXlxcd1xcLSBdKy9nLCAnICcgKS5yZXBsYWNlKCAvXFxzKy9nLCAnICcgKS50cmltKCk7XHJcblx0XHR9XHJcbi8vID09IE5FVyA9PVxyXG5cdFx0LyoqXHJcblx0XHQgKiBUdXJuIGFuIGFyYml0cmFyeSB2YWx1ZSBpbnRvIGEgY29uc2VydmF0aXZlIFwidG9rZW5cIiAodW5kZXJzY29yZXMsIGh5cGhlbnMgYWxsb3dlZCkuXHJcblx0XHQgKiBVc2VmdWwgZm9yIHNob3J0Y29kZSB0b2tlbnMsIGlkcyBpbiBwbGFpbiB0ZXh0LCBldGMuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHRvX3Rva2VuKHYpIHtcclxuXHRcdFx0cmV0dXJuIFN0cmluZyggdiA/PyAnJyApXHJcblx0XHRcdFx0LnRyaW0oKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvXFxzKy9nLCAnXycgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvW15BLVphLXowLTlfXFwtXS9nLCAnJyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udmVydCB0byBrZWJhYi1jYXNlIChsZXR0ZXJzLCBkaWdpdHMsIGh5cGhlbnMpLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyB0b19rZWJhYih2KSB7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgPz8gJycgKVxyXG5cdFx0XHRcdC50cmltKClcclxuXHRcdFx0XHQucmVwbGFjZSggL1tfXFxzXSsvZywgJy0nIClcclxuXHRcdFx0XHQucmVwbGFjZSggL1teQS1aYS16MC05LV0vZywgJycgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvLSsvZywgJy0nIClcclxuXHRcdFx0XHQudG9Mb3dlckNhc2UoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRydXRoeSBub3JtYWxpemF0aW9uIGZvciBmb3JtLWxpa2UgaW5wdXRzOiB0cnVlLCAndHJ1ZScsIDEsICcxJywgJ3llcycsICdvbicuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBpc190cnV0aHkodikge1xyXG5cdFx0XHRpZiAoIHR5cGVvZiB2ID09PSAnYm9vbGVhbicgKSByZXR1cm4gdjtcclxuXHRcdFx0Y29uc3QgcyA9IFN0cmluZyggdiA/PyAnJyApLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRyZXR1cm4gcyA9PT0gJ3RydWUnIHx8IHMgPT09ICcxJyB8fCBzID09PSAneWVzJyB8fCBzID09PSAnb24nO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29lcmNlIHRvIGJvb2xlYW4gd2l0aCBhbiBvcHRpb25hbCBkZWZhdWx0IGZvciBlbXB0eSB2YWx1ZXMuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbZGVmPWZhbHNlXVxyXG5cdFx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBjb2VyY2VfYm9vbGVhbih2LCBkZWYgPSBmYWxzZSkge1xyXG5cdFx0XHRpZiAoIHYgPT0gbnVsbCB8fCB2ID09PSAnJyApIHJldHVybiBkZWY7XHJcblx0XHRcdHJldHVybiB0aGlzLmlzX3RydXRoeSggdiApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUGFyc2UgYSBcInBlcmNlbnQtbGlrZVwiIHZhbHVlICgnMzMnfCczMyUnfDMzKSB3aXRoIGZhbGxiYWNrLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfG51bGx8dW5kZWZpbmVkfSB2XHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gZmFsbGJhY2tfdmFsdWVcclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBwYXJzZV9wZXJjZW50KHYsIGZhbGxiYWNrX3ZhbHVlKSB7XHJcblx0XHRcdGlmICggdiA9PSBudWxsICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxsYmFja192YWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBzID0gU3RyaW5nKCB2ICkudHJpbSgpO1xyXG5cdFx0XHRjb25zdCBuID0gcGFyc2VGbG9hdCggcy5yZXBsYWNlKCAvJS9nLCAnJyApICk7XHJcblx0XHRcdHJldHVybiBOdW1iZXIuaXNGaW5pdGUoIG4gKSA/IG4gOiBmYWxsYmFja192YWx1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENsYW1wIGEgbnVtYmVyIHRvIHRoZSBbbWluLCBtYXhdIHJhbmdlLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IG5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBjbGFtcChuLCBtaW4sIG1heCkge1xyXG5cdFx0XHRyZXR1cm4gTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbiApICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFc2NhcGUgYSB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluc2lkZSBhIHF1b3RlZCBIVE1MIGF0dHJpYnV0ZSAoZG91YmxlIHF1b3RlcykuXHJcblx0XHQgKiBSZXBsYWNlcyBuZXdsaW5lcyB3aXRoIHNwYWNlcyBhbmQgZG91YmxlIHF1b3RlcyB3aXRoIHNpbmdsZSBxdW90ZXMuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGVzY2FwZV9mb3JfYXR0cl9xdW90ZWQodikge1xyXG5cdFx0XHRpZiAoIHYgPT0gbnVsbCApIHJldHVybiAnJztcclxuXHRcdFx0cmV0dXJuIFN0cmluZyggdiApLnJlcGxhY2UoIC9cXHI/XFxuL2csICcgJyApLnJlcGxhY2UoIC9cIi9nLCAnXFwnJyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXNjYXBlIGZvciBzaG9ydGNvZGUtbGlrZSB0b2tlbnMgd2hlcmUgZG91YmxlIHF1b3RlcyBhbmQgbmV3bGluZXMgc2hvdWxkIGJlIG5ldXRyYWxpemVkLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBlc2NhcGVfZm9yX3Nob3J0Y29kZSh2KSB7XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgPz8gJycgKS5yZXBsYWNlKCAvXCIvZywgJ1xcXFxcIicgKS5yZXBsYWNlKCAvXFxyP1xcbi9nLCAnICcgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEpTT04ucGFyc2Ugd2l0aCBmYWxsYmFjayAobm8gdGhyb3cpLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHNcclxuXHRcdCAqIEBwYXJhbSB7YW55fSBbZmFsbGJhY2s9bnVsbF1cclxuXHRcdCAqIEByZXR1cm5zIHthbnl9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBzYWZlX2pzb25fcGFyc2UocywgZmFsbGJhY2sgPSBudWxsKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0cmV0dXJuIEpTT04ucGFyc2UoIHMgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbGxiYWNrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTdHJpbmdpZnkgZGF0YS0qIGF0dHJpYnV0ZSB2YWx1ZSBzYWZlbHkgKG9iamVjdHMgLT4gSlNPTiwgb3RoZXJzIC0+IFN0cmluZykuXHJcblx0XHQgKiBAcGFyYW0ge2FueX0gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHN0cmluZ2lmeV9kYXRhX3ZhbHVlKHYpIHtcclxuXHRcdFx0aWYgKCB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCApIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KCB2ICk7XHJcblx0XHRcdFx0fSBjYXRjaCB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV1BCQzogc3RyaW5naWZ5X2RhdGFfdmFsdWUnICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gJyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBTdHJpbmcoIHYgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHQvLyBTdHJpY3QgdmFsdWUgZ3VhcmRzIGZvciBDU1MgbGVuZ3RocyBhbmQgaGV4IGNvbG9ycyAoZGVmZW5zZS1pbi1kZXB0aCkuXHJcblx0XHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0XHQvKipcclxuXHRcdCAqIFNhbml0aXplIGEgQ1NTIGxlbmd0aC4gQWxsb3dzOiBweCwgJSwgcmVtLCBlbSAobG93ZXIvdXBwZXIpLlxyXG5cdFx0ICogUmV0dXJucyBmYWxsYmFjayBpZiBpbnZhbGlkLlxyXG5cdFx0ICogQHBhcmFtIHthbnl9IHZcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmFsbGJhY2s9JzEwMCUnXVxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHNhbml0aXplX2Nzc19sZW4odiwgZmFsbGJhY2sgPSAnMTAwJScpIHtcclxuXHRcdFx0Y29uc3QgcyA9IFN0cmluZyggdiA/PyAnJyApLnRyaW0oKTtcclxuXHRcdFx0Y29uc3QgbSA9IHMubWF0Y2goIC9eKC0/XFxkKyg/OlxcLlxcZCspPykocHh8JXxyZW18ZW0pJC9pICk7XHJcblx0XHRcdHJldHVybiBtID8gbVswXSA6IFN0cmluZyggZmFsbGJhY2sgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNhbml0aXplIGEgaGV4IGNvbG9yLiBBbGxvd3MgI3JnYiBvciAjcnJnZ2JiIChjYXNlLWluc2Vuc2l0aXZlKS5cclxuXHRcdCAqIFJldHVybnMgZmFsbGJhY2sgaWYgaW52YWxpZC5cclxuXHRcdCAqIEBwYXJhbSB7YW55fSB2XHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZhbGxiYWNrPScjZTBlMGUwJ11cclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBzYW5pdGl6ZV9oZXhfY29sb3IodiwgZmFsbGJhY2sgPSAnI2UwZTBlMCcpIHtcclxuXHRcdFx0Y29uc3QgcyA9IFN0cmluZyggdiA/PyAnJyApLnRyaW0oKTtcclxuXHRcdFx0cmV0dXJuIC9eIyg/OlswLTlhLWZdezN9fFswLTlhLWZdezZ9KSQvaS50ZXN0KCBzICkgPyBzIDogU3RyaW5nKCBmYWxsYmFjayApO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkMgSUQgLyBOYW1lIHNlcnZpY2UuIEdlbmVyYXRlcywgc2FuaXRpemVzLCBhbmQgZW5zdXJlcyB1bmlxdWVuZXNzIGZvciBmaWVsZCBpZHMvbmFtZXMvaHRtbF9pZHMgd2l0aGluIHRoZVxyXG5cdCAqIGNhbnZhcy5cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX0lkU2VydmljZSA9IGNsYXNzICB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb25zdHJ1Y3Rvci4gU2V0IHJvb3QgY29udGFpbmVyIG9mIHRoZSBmb3JtIHBhZ2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhZ2VzX2NvbnRhaW5lciAtIFJvb3QgY29udGFpbmVyIG9mIHRoZSBmb3JtIHBhZ2VzLlxyXG5cdFx0ICovXHJcblx0XHRjb25zdHJ1Y3RvciggcGFnZXNfY29udGFpbmVyICkge1xyXG5cdFx0XHR0aGlzLnBhZ2VzX2NvbnRhaW5lciA9IHBhZ2VzX2NvbnRhaW5lcjtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuc3VyZSBhIHVuaXF1ZSAqKmludGVybmFsKiogZmllbGQgaWQgKHN0b3JlZCBpbiBkYXRhLWlkKSB3aXRoaW4gdGhlIGNhbnZhcy5cclxuXHRcdCAqIFN0YXJ0cyBmcm9tIGEgZGVzaXJlZCBpZCAoYWxyZWFkeSBzYW5pdGl6ZWQgb3Igbm90KSBhbmQgYXBwZW5kcyBzdWZmaXhlcyBpZiBuZWVkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGJhc2VJZCAtIERlc2lyZWQgaWQuXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVbmlxdWUgaWQuXHJcblx0XHQgKi9cclxuXHRcdGVuc3VyZV91bmlxdWVfZmllbGRfaWQoYmFzZUlkLCBjdXJyZW50RWwgPSBudWxsKSB7XHJcblx0XHRcdGNvbnN0IGJhc2UgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIGJhc2VJZCApO1xyXG5cdFx0XHRsZXQgaWQgICAgICAgID0gYmFzZSB8fCAnZmllbGQnO1xyXG5cdFx0XHRjb25zdCBlc2MgICAgID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCB2ICk7XHJcblx0XHRcdGNvbnN0IGVzY1VpZCAgPSAodikgPT4gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NfYXR0cl92YWx1ZV9mb3Jfc2VsZWN0b3IoIHYgKTtcclxuXHRcdFx0Y29uc3Qgbm90U2VsZiA9IGN1cnJlbnRFbD8uZGF0YXNldD8udWlkID8gYDpub3QoW2RhdGEtdWlkPVwiJHtlc2NVaWQoIGN1cnJlbnRFbC5kYXRhc2V0LnVpZCApfVwiXSlgIDogJyc7XHJcblx0XHRcdHdoaWxlICggdGhpcy5wYWdlc19jb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoXHJcblx0XHRcdFx0YC53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19maWVsZCR7bm90U2VsZn1bZGF0YS1pZD1cIiR7ZXNjKGlkKX1cIl0sIC53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19zZWN0aW9uJHtub3RTZWxmfVtkYXRhLWlkPVwiJHtlc2MoaWQpfVwiXWBcclxuXHRcdFx0KSApIHtcclxuXHRcdFx0XHQvLyBFeGNsdWRlcyBzZWxmIGJ5IGRhdGEtdWlkIC5cclxuXHRcdFx0XHRjb25zdCBmb3VuZCA9IHRoaXMucGFnZXNfY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIGAud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3IC53cGJjX2JmYl9fZmllbGRbZGF0YS1pZD1cIiR7ZXNjKCBpZCApfVwiXSwgLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX3NlY3Rpb25bZGF0YS1pZD1cIiR7ZXNjKCBpZCApfVwiXWAgKTtcclxuXHRcdFx0XHRpZiAoIGZvdW5kICYmIGN1cnJlbnRFbCAmJiBmb3VuZCA9PT0gY3VycmVudEVsICkge1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlkID0gYCR7YmFzZSB8fCAnZmllbGQnfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDUgKX1gO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBpZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuc3VyZSBhIHVuaXF1ZSBIVE1MIG5hbWUgYWNyb3NzIHRoZSBmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIC0gRGVzaXJlZCBiYXNlIG5hbWUgKHVuL3Nhbml0aXplZCkuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGN1cnJlbnRFbCAtIElmIHByb3ZpZGVkLCBpZ25vcmUgY29uZmxpY3RzIHdpdGggdGhpcyBlbGVtZW50LlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gVW5pcXVlIG5hbWUuXHJcblx0XHQgKi9cclxuXHRcdGVuc3VyZV91bmlxdWVfZmllbGRfbmFtZShiYXNlLCBjdXJyZW50RWwgPSBudWxsKSB7XHJcblx0XHRcdGxldCBuYW1lICAgICAgPSBiYXNlIHx8ICdmaWVsZCc7XHJcblx0XHRcdGNvbnN0IGVzYyAgICAgPSAodikgPT4gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NfYXR0cl92YWx1ZV9mb3Jfc2VsZWN0b3IoIHYgKTtcclxuXHRcdFx0Y29uc3QgZXNjVWlkICA9ICh2KSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY19hdHRyX3ZhbHVlX2Zvcl9zZWxlY3RvciggdiApO1xyXG5cdFx0XHQvLyBFeGNsdWRlIHRoZSBjdXJyZW50IGZpZWxkICphbmQgYW55IERPTSBtaXJyb3JzIG9mIGl0KiAoc2FtZSBkYXRhLXVpZClcclxuXHRcdFx0Y29uc3QgdWlkICAgICA9IGN1cnJlbnRFbD8uZGF0YXNldD8udWlkO1xyXG5cdFx0XHRjb25zdCBub3RTZWxmID0gdWlkID8gYDpub3QoW2RhdGEtdWlkPVwiJHtlc2NVaWQoIHVpZCApfVwiXSlgIDogJyc7XHJcblx0XHRcdHdoaWxlICggdHJ1ZSApIHtcclxuXHRcdFx0XHRjb25zdCBzZWxlY3RvciA9IGAud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3IC53cGJjX2JmYl9fZmllbGQke25vdFNlbGZ9W2RhdGEtbmFtZT1cIiR7ZXNjKCBuYW1lICl9XCJdYDtcclxuXHRcdFx0XHRjb25zdCBjbGFzaGVzICA9IHRoaXMucGFnZXNfY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsKCBzZWxlY3RvciApIHx8IFtdO1xyXG5cdFx0XHRcdGlmICggY2xhc2hlcy5sZW5ndGggPT09IDAgKSBicmVhazsgICAgICAgICAgIC8vIG5vYm9keSBlbHNlIHVzZXMgdGhpcyBuYW1lXHJcblx0XHRcdFx0Y29uc3QgbSA9IG5hbWUubWF0Y2goIC8tKFxcZCspJC8gKTtcclxuXHRcdFx0XHRuYW1lICAgID0gbSA/IG5hbWUucmVwbGFjZSggLy1cXGQrJC8sICctJyArIChOdW1iZXIoIG1bMV0gKSArIDEpICkgOiBgJHtiYXNlfS0yYDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gbmFtZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBmaWVsZCdzIElOVEVSTkFMIGlkIChkYXRhLWlkKSBvbiBhbiBlbGVtZW50LiBFbnN1cmVzIHVuaXF1ZW5lc3MgYW5kIG9wdGlvbmFsbHkgYXNrcyBjYWxsZXIgdG8gcmVmcmVzaFxyXG5cdFx0ICogcHJldmlldy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBmaWVsZF9lbCAtIEZpZWxkIGVsZW1lbnQgaW4gdGhlIGNhbnZhcy5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBuZXdJZFJhdyAtIERlc2lyZWQgaWQgKHVuL3Nhbml0aXplZCkuXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW5kZXJQcmV2aWV3PWZhbHNlXSAtIENhbGxlciBjYW4gZGVjaWRlIHRvIHJlLXJlbmRlciBwcmV2aWV3LlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gQXBwbGllZCB1bmlxdWUgaWQuXHJcblx0XHQgKi9cclxuXHRcdHNldF9maWVsZF9pZCggZmllbGRfZWwsIG5ld0lkUmF3LCByZW5kZXJQcmV2aWV3ID0gZmFsc2UgKSB7XHJcblx0XHRcdGNvbnN0IGRlc2lyZWQgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIG5ld0lkUmF3ICk7XHJcblx0XHRcdGNvbnN0IHVuaXF1ZSAgPSB0aGlzLmVuc3VyZV91bmlxdWVfZmllbGRfaWQoIGRlc2lyZWQsIGZpZWxkX2VsICk7XHJcblx0XHRcdGZpZWxkX2VsLnNldEF0dHJpYnV0ZSggJ2RhdGEtaWQnLCB1bmlxdWUgKTtcclxuXHRcdFx0aWYgKCByZW5kZXJQcmV2aWV3ICkge1xyXG5cdFx0XHRcdC8vIENhbGxlciBkZWNpZGVzIGlmIC8gd2hlbiB0byByZW5kZXIuXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHVuaXF1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBmaWVsZCdzIFJFUVVJUkVEIEhUTUwgbmFtZSAoZGF0YS1uYW1lKS4gRW5zdXJlcyBzYW5pdGl6ZWQgKyB1bmlxdWUgcGVyIGZvcm0uXHJcblx0XHQgKiBGYWxscyBiYWNrIHRvIHNhbml0aXplZCBpbnRlcm5hbCBpZCBpZiB1c2VyIHByb3ZpZGVzIGVtcHR5IHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGZpZWxkX2VsIC0gRmllbGQgZWxlbWVudCBpbiB0aGUgY2FudmFzLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IG5ld05hbWVSYXcgLSBEZXNpcmVkIG5hbWUgKHVuL3Nhbml0aXplZCkuXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW5kZXJQcmV2aWV3PWZhbHNlXSAtIENhbGxlciBjYW4gZGVjaWRlIHRvIHJlLXJlbmRlciBwcmV2aWV3LlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gQXBwbGllZCB1bmlxdWUgbmFtZS5cclxuXHRcdCAqL1xyXG5cdFx0c2V0X2ZpZWxkX25hbWUoIGZpZWxkX2VsLCBuZXdOYW1lUmF3LCByZW5kZXJQcmV2aWV3ID0gZmFsc2UgKSB7XHJcblx0XHRcdGNvbnN0IHJhdyAgPSAobmV3TmFtZVJhdyA9PSBudWxsID8gJycgOiBTdHJpbmcoIG5ld05hbWVSYXcgKSkudHJpbSgpO1xyXG5cdFx0XHRjb25zdCBiYXNlID0gcmF3XHJcblx0XHRcdFx0PyBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfbmFtZSggcmF3IClcclxuXHRcdFx0XHQ6IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCBmaWVsZF9lbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWlkJyApIHx8ICdmaWVsZCcgKTtcclxuXHJcblx0XHRcdGNvbnN0IHVuaXF1ZSA9IHRoaXMuZW5zdXJlX3VuaXF1ZV9maWVsZF9uYW1lKCBiYXNlLCBmaWVsZF9lbCApO1xyXG5cdFx0XHRmaWVsZF9lbC5zZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnLCB1bmlxdWUgKTtcclxuXHRcdFx0aWYgKCByZW5kZXJQcmV2aWV3ICkge1xyXG5cdFx0XHRcdC8vIENhbGxlciBkZWNpZGVzIGlmIC8gd2hlbiB0byByZW5kZXIuXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHVuaXF1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBmaWVsZCdzIE9QVElPTkFMIHB1YmxpYyBIVE1MIGlkIChkYXRhLWh0bWxfaWQpLiBFbXB0eSB2YWx1ZSByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuXHJcblx0XHQgKiBFbnN1cmVzIHNhbml0aXphdGlvbiArIHVuaXF1ZW5lc3MgYW1vbmcgb3RoZXIgZGVjbGFyZWQgSFRNTCBpZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZmllbGRfZWwgLSBGaWVsZCBlbGVtZW50IGluIHRoZSBjYW52YXMuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbmV3SHRtbElkUmF3IC0gRGVzaXJlZCBodG1sX2lkIChvcHRpb25hbCkuXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW5kZXJQcmV2aWV3PWZhbHNlXSAtIENhbGxlciBjYW4gZGVjaWRlIHRvIHJlLXJlbmRlciBwcmV2aWV3LlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gVGhlIGFwcGxpZWQgaHRtbF9pZCBvciBlbXB0eSBzdHJpbmcgaWYgcmVtb3ZlZC5cclxuXHRcdCAqL1xyXG5cdFx0c2V0X2ZpZWxkX2h0bWxfaWQoIGZpZWxkX2VsLCBuZXdIdG1sSWRSYXcsIHJlbmRlclByZXZpZXcgPSBmYWxzZSApIHtcclxuXHRcdFx0Y29uc3QgcmF3ID0gKG5ld0h0bWxJZFJhdyA9PSBudWxsID8gJycgOiBTdHJpbmcoIG5ld0h0bWxJZFJhdyApKS50cmltKCk7XHJcblxyXG5cdFx0XHRpZiAoIHJhdyA9PT0gJycgKSB7XHJcblx0XHRcdFx0ZmllbGRfZWwucmVtb3ZlQXR0cmlidXRlKCAnZGF0YS1odG1sX2lkJyApO1xyXG5cdFx0XHRcdGlmICggcmVuZGVyUHJldmlldyApIHtcclxuXHRcdFx0XHRcdC8vIENhbGxlciBkZWNpZGVzIGlmIC8gd2hlbiB0byByZW5kZXIuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZGVzaXJlZCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9pZCggcmF3ICk7XHJcblx0XHRcdGxldCBodG1sSWQgICAgPSBkZXNpcmVkO1xyXG5cdFx0XHRjb25zdCBlc2MgICAgID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCB2ICk7XHJcblx0XHRcdGNvbnN0IGVzY1VpZCAgPSAodikgPT4gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NfYXR0cl92YWx1ZV9mb3Jfc2VsZWN0b3IoIHYgKTtcclxuXHJcblx0XHRcdHdoaWxlICggdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdWlkICAgICA9IGZpZWxkX2VsPy5kYXRhc2V0Py51aWQ7XHJcblx0XHRcdFx0Y29uc3Qgbm90U2VsZiA9IHVpZCA/IGA6bm90KFtkYXRhLXVpZD1cIiR7ZXNjVWlkKCB1aWQgKX1cIl0pYCA6ICcnO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjbGFzaEluQ2FudmFzID0gdGhpcy5wYWdlc19jb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoXHJcblx0XHRcdFx0XHRgLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkJHtub3RTZWxmfVtkYXRhLWh0bWxfaWQ9XCIke2VzYyggaHRtbElkICl9XCJdLGAgK1xyXG5cdFx0XHRcdFx0YC53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19zZWN0aW9uJHtub3RTZWxmfVtkYXRhLWh0bWxfaWQ9XCIke2VzYyggaHRtbElkICl9XCJdYFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0Y29uc3QgZG9tQ2xhc2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaHRtbElkICk7XHJcblxyXG5cdFx0XHRcdC8vIEFsbG93IHdoZW4gdGhlIG9ubHkgXCJjbGFzaFwiIGlzIGluc2lkZSB0aGlzIHNhbWUgZmllbGQgKGUuZy4sIHRoZSBpbnB1dCB5b3UganVzdCByZW5kZXJlZClcclxuXHRcdFx0XHRjb25zdCBkb21DbGFzaElzU2VsZiA9IGRvbUNsYXNoID09PSBmaWVsZF9lbCB8fCAoZG9tQ2xhc2ggJiYgZmllbGRfZWwuY29udGFpbnMoIGRvbUNsYXNoICkpO1xyXG5cclxuXHRcdFx0XHRpZiAoICFjbGFzaEluQ2FudmFzICYmICghZG9tQ2xhc2ggfHwgZG9tQ2xhc2hJc1NlbGYpICkge1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBtID0gaHRtbElkLm1hdGNoKCAvLShcXGQrKSQvICk7XHJcblx0XHRcdFx0aHRtbElkICA9IG0gPyBodG1sSWQucmVwbGFjZSggLy1cXGQrJC8sICctJyArIChOdW1iZXIoIG1bMV0gKSArIDEpICkgOiBgJHtkZXNpcmVkfS0yYDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZmllbGRfZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1odG1sX2lkJywgaHRtbElkICk7XHJcblx0XHRcdGlmICggcmVuZGVyUHJldmlldyApIHtcclxuXHRcdFx0XHQvLyBDYWxsZXIgZGVjaWRlcyBpZiAvIHdoZW4gdG8gcmVuZGVyLlxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBodG1sSWQ7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogV1BCQyBMYXlvdXQgc2VydmljZS4gRW5jYXBzdWxhdGVzIGNvbHVtbiB3aWR0aCBtYXRoIHdpdGggZ2FwIGhhbmRsaW5nLCBwcmVzZXRzLCBhbmQgdXRpbGl0aWVzLlxyXG5cdCAqL1xyXG5cdENvcmUuV1BCQ19CRkJfTGF5b3V0U2VydmljZSA9IGNsYXNzICB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb25zdHJ1Y3Rvci4gU2V0IG9wdGlvbnMgd2l0aCBnYXAgYmV0d2VlbiBjb2x1bW5zICglKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3sgY29sX2dhcF9wZXJjZW50PzogbnVtYmVyIH19IFtvcHRzXSAtIE9wdGlvbnMgd2l0aCBnYXAgYmV0d2VlbiBjb2x1bW5zICglKS5cclxuXHRcdCAqL1xyXG5cdFx0Y29uc3RydWN0b3IoIG9wdHMgPSB7fSApIHtcclxuXHRcdFx0dGhpcy5jb2xfZ2FwX3BlcmNlbnQgPSBOdW1iZXIuaXNGaW5pdGUoICtvcHRzLmNvbF9nYXBfcGVyY2VudCApID8gK29wdHMuY29sX2dhcF9wZXJjZW50IDogMztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbXB1dGUgbm9ybWFsaXplZCBmbGV4LWJhc2lzIHZhbHVlcyBmb3IgYSByb3csIHJlc3BlY3RpbmcgY29sdW1uIGdhcHMuXHJcblx0XHQgKiBSZXR1cm5zIGJhc2VzIHRoYXQgc3VtIHRvIGF2YWlsYWJsZSA9IDEwMCAtIChuLTEpKmdhcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dfZWwgLSBSb3cgZWxlbWVudCBjb250YWluaW5nIC53cGJjX2JmYl9fY29sdW1uIGNoaWxkcmVuLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtnYXBfcGVyY2VudD10aGlzLmNvbF9nYXBfcGVyY2VudF0gLSBHYXAgcGVyY2VudCBiZXR3ZWVuIGNvbHVtbnMuXHJcblx0XHQgKiBAcmV0dXJucyB7e2F2YWlsYWJsZTpudW1iZXIsYmFzZXM6bnVtYmVyW119fSBBdmFpbGFibGUgc3BhY2UgYW5kIGJhc2lzIHZhbHVlcy5cclxuXHRcdCAqL1xyXG5cdFx0Y29tcHV0ZV9lZmZlY3RpdmVfYmFzZXNfZnJvbV9yb3coIHJvd19lbCwgZ2FwX3BlcmNlbnQgPSB0aGlzLmNvbF9nYXBfcGVyY2VudCApIHtcclxuXHRcdFx0Y29uc3QgY29scyA9IEFycmF5LmZyb20oIHJvd19lbD8ucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApIHx8IFtdICk7XHJcblx0XHRcdGNvbnN0IG4gICAgPSBjb2xzLmxlbmd0aCB8fCAxO1xyXG5cclxuXHRcdFx0Y29uc3QgcmF3ID0gY29scy5tYXAoICggY29sICkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHcgPSBjb2wuc3R5bGUuZmxleEJhc2lzIHx8ICcnO1xyXG5cdFx0XHRcdGNvbnN0IHAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnBhcnNlX3BlcmNlbnQoIHcsIE5hTiApO1xyXG5cdFx0XHRcdHJldHVybiBOdW1iZXIuaXNGaW5pdGUoIHAgKSA/IHAgOiAoMTAwIC8gbik7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGNvbnN0IHN1bV9yYXcgICAgPSByYXcucmVkdWNlKCAoIGEsIGIgKSA9PiBhICsgYiwgMCApIHx8IDEwMDtcclxuXHRcdFx0Y29uc3QgZ3AgICAgICAgICA9IE51bWJlci5pc0Zpbml0ZSggK2dhcF9wZXJjZW50ICkgPyArZ2FwX3BlcmNlbnQgOiAzO1xyXG5cdFx0XHRjb25zdCB0b3RhbF9nYXBzID0gTWF0aC5tYXgoIDAsIG4gLSAxICkgKiBncDtcclxuXHRcdFx0Y29uc3QgYXZhaWxhYmxlICA9IE1hdGgubWF4KCAwLCAxMDAgLSB0b3RhbF9nYXBzICk7XHJcblx0XHRcdGNvbnN0IHNjYWxlICAgICAgPSBhdmFpbGFibGUgLyBzdW1fcmF3O1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRhdmFpbGFibGUsXHJcblx0XHRcdFx0YmFzZXM6IHJhdy5tYXAoICggcCApID0+IE1hdGgubWF4KCAwLCBwICogc2NhbGUgKSApXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBcHBseSBjb21wdXRlZCBiYXNlcyB0byB0aGUgcm93J3MgY29sdW1ucyAoc2V0cyBmbGV4LWJhc2lzICUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvd19lbCAtIFJvdyBlbGVtZW50LlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJbXX0gYmFzZXMgLSBBcnJheSBvZiBiYXNpcyB2YWx1ZXMgKHBlcmNlbnQgb2YgZnVsbCAxMDApLlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdGFwcGx5X2Jhc2VzX3RvX3Jvdyggcm93X2VsLCBiYXNlcyApIHtcclxuXHRcdFx0Y29uc3QgY29scyA9IEFycmF5LmZyb20oIHJvd19lbD8ucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApIHx8IFtdICk7XHJcblx0XHRcdGNvbHMuZm9yRWFjaCggKCBjb2wsIGkgKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgcCAgICAgICAgICAgICA9IGJhc2VzW2ldID8/IDA7XHJcblx0XHRcdFx0Y29sLnN0eWxlLmZsZXhCYXNpcyA9IGAke3B9JWA7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERpc3RyaWJ1dGUgY29sdW1ucyBldmVubHksIHJlc3BlY3RpbmcgZ2FwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJvd19lbCAtIFJvdyBlbGVtZW50LlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtnYXBfcGVyY2VudD10aGlzLmNvbF9nYXBfcGVyY2VudF0gLSBHYXAgcGVyY2VudC5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRzZXRfZXF1YWxfYmFzZXMoIHJvd19lbCwgZ2FwX3BlcmNlbnQgPSB0aGlzLmNvbF9nYXBfcGVyY2VudCApIHtcclxuXHRcdFx0Y29uc3QgY29scyAgICAgICA9IEFycmF5LmZyb20oIHJvd19lbD8ucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApIHx8IFtdICk7XHJcblx0XHRcdGNvbnN0IG4gICAgICAgICAgPSBjb2xzLmxlbmd0aCB8fCAxO1xyXG5cdFx0XHRjb25zdCBncCAgICAgICAgID0gTnVtYmVyLmlzRmluaXRlKCArZ2FwX3BlcmNlbnQgKSA/ICtnYXBfcGVyY2VudCA6IDM7XHJcblx0XHRcdGNvbnN0IHRvdGFsX2dhcHMgPSBNYXRoLm1heCggMCwgbiAtIDEgKSAqIGdwO1xyXG5cdFx0XHRjb25zdCBhdmFpbGFibGUgID0gTWF0aC5tYXgoIDAsIDEwMCAtIHRvdGFsX2dhcHMgKTtcclxuXHRcdFx0Y29uc3QgZWFjaCAgICAgICA9IGF2YWlsYWJsZSAvIG47XHJcblx0XHRcdHRoaXMuYXBwbHlfYmFzZXNfdG9fcm93KCByb3dfZWwsIEFycmF5KCBuICkuZmlsbCggZWFjaCApICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBcHBseSBhIHByZXNldCBvZiByZWxhdGl2ZSB3ZWlnaHRzIHRvIGEgcm93L3NlY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2VjdGlvbk9yUm93IC0gLndwYmNfYmZiX19zZWN0aW9uIG9yIGl0cyBjaGlsZCAud3BiY19iZmJfX3Jvdy5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyW119IHdlaWdodHMgLSBSZWxhdGl2ZSB3ZWlnaHRzIChlLmcuLCBbMSwzLDFdKS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbZ2FwX3BlcmNlbnQ9dGhpcy5jb2xfZ2FwX3BlcmNlbnRdIC0gR2FwIHBlcmNlbnQuXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0YXBwbHlfbGF5b3V0X3ByZXNldCggc2VjdGlvbk9yUm93LCB3ZWlnaHRzLCBnYXBfcGVyY2VudCA9IHRoaXMuY29sX2dhcF9wZXJjZW50ICkge1xyXG5cdFx0XHRjb25zdCByb3cgPSBzZWN0aW9uT3JSb3c/LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fcm93JyApXHJcblx0XHRcdFx0PyBzZWN0aW9uT3JSb3dcclxuXHRcdFx0XHQ6IHNlY3Rpb25PclJvdz8ucXVlcnlTZWxlY3RvciggJzpzY29wZSA+IC53cGJjX2JmYl9fcm93JyApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHJvdyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNvbHMgPSBBcnJheS5mcm9tKCByb3cucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApIHx8IFtdICk7XHJcblx0XHRcdGNvbnN0IG4gICAgPSBjb2xzLmxlbmd0aCB8fCAxO1xyXG5cclxuXHRcdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIHdlaWdodHMgKSB8fCB3ZWlnaHRzLmxlbmd0aCAhPT0gbiApIHtcclxuXHRcdFx0XHR0aGlzLnNldF9lcXVhbF9iYXNlcyggcm93LCBnYXBfcGVyY2VudCApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc3VtICAgICAgID0gd2VpZ2h0cy5yZWR1Y2UoICggYSwgYiApID0+IGEgKyBNYXRoLm1heCggMCwgTnVtYmVyKCBiICkgfHwgMCApLCAwICkgfHwgMTtcclxuXHRcdFx0Y29uc3QgZ3AgICAgICAgID0gTnVtYmVyLmlzRmluaXRlKCArZ2FwX3BlcmNlbnQgKSA/ICtnYXBfcGVyY2VudCA6IDM7XHJcblx0XHRcdGNvbnN0IGF2YWlsYWJsZSA9IE1hdGgubWF4KCAwLCAxMDAgLSBNYXRoLm1heCggMCwgbiAtIDEgKSAqIGdwICk7XHJcblx0XHRcdGNvbnN0IGJhc2VzICAgICA9IHdlaWdodHMubWFwKCAoIHcgKSA9PiBNYXRoLm1heCggMCwgKE51bWJlciggdyApIHx8IDApIC8gc3VtICogYXZhaWxhYmxlICkgKTtcclxuXHJcblx0XHRcdHRoaXMuYXBwbHlfYmFzZXNfdG9fcm93KCByb3csIGJhc2VzICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCdWlsZCBwcmVzZXQgd2VpZ2h0IGxpc3RzIGZvciBhIGdpdmVuIGNvbHVtbiBjb3VudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbiAtIENvbHVtbiBjb3VudC5cclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJbXVtdfSBMaXN0IG9mIHdlaWdodCBhcnJheXMuXHJcblx0XHQgKi9cclxuXHRcdGJ1aWxkX3ByZXNldHNfZm9yX2NvbHVtbnMoIG4gKSB7XHJcblx0XHRcdHN3aXRjaCAoIG4gKSB7XHJcblx0XHRcdFx0Y2FzZSAxOlxyXG5cdFx0XHRcdFx0cmV0dXJuIFsgWyAxIF0gXTtcclxuXHRcdFx0XHRjYXNlIDI6XHJcblx0XHRcdFx0XHRyZXR1cm4gWyBbIDEsIDIgXSwgWyAyLCAxIF0sIFsgMSwgMyBdLCBbIDMsIDEgXSBdO1xyXG5cdFx0XHRcdGNhc2UgMzpcclxuXHRcdFx0XHRcdHJldHVybiBbIFsgMSwgMywgMSBdLCBbIDEsIDIsIDEgXSwgWyAyLCAxLCAxIF0sIFsgMSwgMSwgMiBdIF07XHJcblx0XHRcdFx0Y2FzZSA0OlxyXG5cdFx0XHRcdFx0cmV0dXJuIFsgWyAxLCAyLCAyLCAxIF0sIFsgMiwgMSwgMSwgMSBdLCBbIDEsIDEsIDEsIDIgXSBdO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRyZXR1cm4gWyBBcnJheSggbiApLmZpbGwoIDEgKSBdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3JtYXQgYSBodW1hbi1yZWFkYWJsZSBsYWJlbCBsaWtlIFwiNTAlLzI1JS8yNSVcIiBmcm9tIHdlaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJbXX0gd2VpZ2h0cyAtIFdlaWdodCBsaXN0LlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gTGFiZWwgc3RyaW5nLlxyXG5cdFx0ICovXHJcblx0XHRmb3JtYXRfcHJlc2V0X2xhYmVsKCB3ZWlnaHRzICkge1xyXG5cdFx0XHRjb25zdCBzdW0gPSB3ZWlnaHRzLnJlZHVjZSggKCBhLCBiICkgPT4gYSArIChOdW1iZXIoIGIgKSB8fCAwKSwgMCApIHx8IDE7XHJcblx0XHRcdHJldHVybiB3ZWlnaHRzLm1hcCggKCB3ICkgPT4gTWF0aC5yb3VuZCggKChOdW1iZXIoIHcgKSB8fCAwKSAvIHN1bSkgKiAxMDAgKSApLmpvaW4oICclLycgKSArICclJztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBhcnNlIGNvbW1hL3NwYWNlIHNlcGFyYXRlZCB3ZWlnaHRzIGludG8gbnVtYmVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgLSBVc2VyIGlucHV0IGxpa2UgXCIyMCw2MCwyMFwiLlxyXG5cdFx0ICogQHJldHVybnMge251bWJlcltdfSBQYXJzZWQgd2VpZ2h0cy5cclxuXHRcdCAqL1xyXG5cdFx0cGFyc2Vfd2VpZ2h0cyggaW5wdXQgKSB7XHJcblx0XHRcdGlmICggISBpbnB1dCApIHtcclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIFN0cmluZyggaW5wdXQgKVxyXG5cdFx0XHRcdC5yZXBsYWNlKCAvW15cXGQsLlxcc10vZywgJycgKVxyXG5cdFx0XHRcdC5zcGxpdCggL1tcXHMsXSsvIClcclxuXHRcdFx0XHQubWFwKCAoIHMgKSA9PiBwYXJzZUZsb2F0KCBzICkgKVxyXG5cdFx0XHRcdC5maWx0ZXIoICggbiApID0+IE51bWJlci5pc0Zpbml0ZSggbiApICYmIG4gPj0gMCApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkMgVXNhZ2UgTGltaXQgc2VydmljZS5cclxuXHQgKiBDb3VudHMgZmllbGQgdXNhZ2UgYnkga2V5LCBjb21wYXJlcyB0byBwYWxldHRlIGxpbWl0cywgYW5kIHVwZGF0ZXMgcGFsZXR0ZSBVSS5cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX1VzYWdlTGltaXRTZXJ2aWNlID0gY2xhc3MgIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnN0cnVjdG9yLiBTZXQgcGFnZXNfY29udGFpbmVyIGFuZCBwYWxldHRlX3VsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhZ2VzX2NvbnRhaW5lciAtIENhbnZhcyByb290IHRoYXQgaG9sZHMgcGxhY2VkIGZpZWxkcy5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXXxudWxsfSBwYWxldHRlX3Vscz86ICAgUGFsZXR0ZXMgVUwgd2l0aCAud3BiY19iZmJfX2ZpZWxkIGl0ZW1zIChtYXkgYmUgbnVsbCkuXHJcblx0XHQgKi9cclxuXHRcdGNvbnN0cnVjdG9yKHBhZ2VzX2NvbnRhaW5lciwgcGFsZXR0ZV91bHMpIHtcclxuXHRcdFx0dGhpcy5wYWdlc19jb250YWluZXIgPSBwYWdlc19jb250YWluZXI7XHJcblx0XHRcdC8vIE5vcm1hbGl6ZSB0byBhbiBhcnJheTsgd2XigJlsbCBzdGlsbCBiZSByb2J1c3QgaWYgbm9uZSBwcm92aWRlZC5cclxuXHRcdFx0dGhpcy5wYWxldHRlX3VscyAgICAgPSBBcnJheS5pc0FycmF5KCBwYWxldHRlX3VscyApID8gcGFsZXR0ZV91bHMgOiAocGFsZXR0ZV91bHMgPyBbIHBhbGV0dGVfdWxzIF0gOiBbXSk7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUGFyc2UgdXNhZ2UgbGltaXQgZnJvbSByYXcgZGF0YXNldCB2YWx1ZS4gTWlzc2luZy9pbnZhbGlkIC0+IEluZmluaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxudWxsfHVuZGVmaW5lZH0gcmF3IC0gUmF3IGF0dHJpYnV0ZSB2YWx1ZS5cclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJ9IExpbWl0IG51bWJlciBvciBJbmZpbml0eS5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHBhcnNlX3VzYWdlX2xpbWl0KCByYXcgKSB7XHJcblx0XHRcdGlmICggcmF3ID09IG51bGwgKSB7XHJcblx0XHRcdFx0cmV0dXJuIEluZmluaXR5O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IG4gPSBwYXJzZUludCggcmF3LCAxMCApO1xyXG5cdFx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKCBuICkgPyBuIDogSW5maW5pdHk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb3VudCBob3cgbWFueSBpbnN0YW5jZXMgZXhpc3QgcGVyIHVzYWdlX2tleSBpbiB0aGUgY2FudmFzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBNYXAgb2YgdXNhZ2Vfa2V5IC0+IGNvdW50LlxyXG5cdFx0ICovXHJcblx0XHRjb3VudF91c2FnZV9ieV9rZXkoKSB7XHJcblx0XHRcdGNvbnN0IHVzZWQgPSB7fTtcclxuXHRcdFx0Y29uc3QgYWxsICA9IHRoaXMucGFnZXNfY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkOm5vdCguaXMtaW52YWxpZCknICkgfHwgW107XHJcblx0XHRcdGFsbC5mb3JFYWNoKCAoIGVsICkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGtleSA9IGVsLmRhdGFzZXQudXNhZ2Vfa2V5IHx8IGVsLmRhdGFzZXQudHlwZSB8fCBlbC5kYXRhc2V0LmlkO1xyXG5cdFx0XHRcdGlmICggISBrZXkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHVzZWRba2V5XSA9ICh1c2VkW2tleV0gfHwgMCkgKyAxO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdHJldHVybiB1c2VkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJuIHBhbGV0dGUgbGltaXQgZm9yIGEgZ2l2ZW4gdXNhZ2Uga2V5IChpZCBvZiB0aGUgcGFsZXR0ZSBpdGVtKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5LlxyXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gTGltaXQgdmFsdWUgb3IgSW5maW5pdHkuXHJcblx0XHQgKi9cclxuXHRcdGdldF9saW1pdF9mb3Jfa2V5KGtleSkge1xyXG5cdFx0XHRpZiAoICEga2V5ICkge1xyXG5cdFx0XHRcdHJldHVybiBJbmZpbml0eTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBRdWVyeSBhY3Jvc3MgYWxsIHBhbGV0dGVzIHByZXNlbnQgbm93IChzdG9yZWQgKyBhbnkgbmV3bHkgYWRkZWQgaW4gRE9NKS5cclxuXHRcdFx0Y29uc3Qgcm9vdHMgICAgICAgICAgICA9IHRoaXMucGFsZXR0ZV91bHM/Lmxlbmd0aCA/IHRoaXMucGFsZXR0ZV91bHMgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19wYW5lbF9maWVsZF90eXBlc19fdWwnICk7XHJcblx0XHRcdGNvbnN0IGFsbFBhbGV0dGVGaWVsZHMgPSBBcnJheS5mcm9tKCByb290cyApLmZsYXRNYXAoIHIgPT4gQXJyYXkuZnJvbSggci5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19maWVsZCcgKSApICk7XHJcblx0XHRcdGxldCBsaW1pdCAgICAgICAgICAgICAgPSBJbmZpbml0eTtcclxuXHJcblx0XHRcdGFsbFBhbGV0dGVGaWVsZHMuZm9yRWFjaCggKGVsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdXNhZ2Vfa2V5ID0gZWwuZGF0YXNldC51c2FnZV9rZXkgfHwgZWwuZGF0YXNldC5pZDtcclxuXHRcdFx0XHRpZiAoIGVsLmRhdGFzZXQuaWQgPT09IGtleSB8fCB1c2FnZV9rZXkgPT09IGtleSApIHtcclxuXHRcdFx0XHRcdGNvbnN0IG4gPSBDb3JlLldQQkNfQkZCX1VzYWdlTGltaXRTZXJ2aWNlLnBhcnNlX3VzYWdlX2xpbWl0KCBlbC5kYXRhc2V0LnVzYWdlbnVtYmVyICk7XHJcblx0XHRcdFx0XHQvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGZpbml0ZSBsaW1pdCAoc2FmZXN0IGlmIHBhbGV0dGVzIGRpc2FncmVlKS5cclxuXHRcdFx0XHRcdGlmICggbiA8IGxpbWl0ICkge1xyXG5cdFx0XHRcdFx0XHRsaW1pdCA9IG47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gbGltaXQ7XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGlzYWJsZS9lbmFibGUgcGFsZXR0ZSBpdGVtcyBiYXNlZCBvbiBjdXJyZW50IHVzYWdlIGNvdW50cyBhbmQgbGltaXRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHR1cGRhdGVfcGFsZXR0ZV91aSgpIHtcclxuXHRcdFx0Ly8gQWx3YXlzIGNvbXB1dGUgdXNhZ2UgZnJvbSB0aGUgY2FudmFzOlxyXG5cdFx0XHRjb25zdCB1c2FnZSA9IHRoaXMuY291bnRfdXNhZ2VfYnlfa2V5KCk7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgYWxsIHBhbGV0dGVzIGN1cnJlbnRseSBpbiBET00gKG5vdCBqdXN0IHRoZSBpbml0aWFsbHkgY2FwdHVyZWQgb25lcylcclxuXHRcdFx0Y29uc3QgcGFsZXR0ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19wYW5lbF9maWVsZF90eXBlc19fdWwnICk7XHJcblxyXG5cdFx0XHRwYWxldHRlcy5mb3JFYWNoKCAocGFsKSA9PiB7XHJcblx0XHRcdFx0cGFsLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX2ZpZWxkJyApLmZvckVhY2goIChwYW5lbF9maWVsZCkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgcGFsZXR0ZUlkICAgPSBwYW5lbF9maWVsZC5kYXRhc2V0LmlkO1xyXG5cdFx0XHRcdFx0Y29uc3QgdXNhZ2VLZXkgICAgPSBwYW5lbF9maWVsZC5kYXRhc2V0LnVzYWdlX2tleSB8fCBwYWxldHRlSWQ7XHJcblx0XHRcdFx0XHRjb25zdCByYXdfbGltaXQgICA9IHBhbmVsX2ZpZWxkLmRhdGFzZXQudXNhZ2VudW1iZXI7XHJcblx0XHRcdFx0XHRjb25zdCBwZXJFbExpbWl0ICA9IENvcmUuV1BCQ19CRkJfVXNhZ2VMaW1pdFNlcnZpY2UucGFyc2VfdXNhZ2VfbGltaXQoIHJhd19saW1pdCApO1xyXG5cdFx0XHRcdFx0Ly8gRWZmZWN0aXZlIGxpbWl0IGFjcm9zcyBhbGwgcGFsZXR0ZXMgaXMgdGhlIGdsb2JhbCBsaW1pdCBmb3IgdGhpcyBrZXkuXHJcblx0XHRcdFx0XHRjb25zdCBnbG9iYWxMaW1pdCA9IHRoaXMuZ2V0X2xpbWl0X2Zvcl9rZXkoIHVzYWdlS2V5ICk7XHJcblx0XHRcdFx0XHRjb25zdCBsaW1pdCAgICAgICA9IE51bWJlci5pc0Zpbml0ZSggZ2xvYmFsTGltaXQgKSA/IGdsb2JhbExpbWl0IDogcGVyRWxMaW1pdDsgLy8gcHJlZmVyIGdsb2JhbCBtaW5cclxuXHJcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50ID0gdXNhZ2VbdXNhZ2VLZXldIHx8IDA7XHJcblx0XHRcdFx0XHRjb25zdCBkaXNhYmxlID0gTnVtYmVyLmlzRmluaXRlKCBsaW1pdCApICYmIGN1cnJlbnQgPj0gbGltaXQ7XHJcblxyXG5cdFx0XHRcdFx0cGFuZWxfZmllbGQuc3R5bGUucG9pbnRlckV2ZW50cyA9IGRpc2FibGUgPyAnbm9uZScgOiAnJztcclxuXHRcdFx0XHRcdHBhbmVsX2ZpZWxkLnN0eWxlLm9wYWNpdHkgICAgICAgPSBkaXNhYmxlID8gJzAuNCcgOiAnJztcclxuXHRcdFx0XHRcdHBhbmVsX2ZpZWxkLnNldEF0dHJpYnV0ZSggJ2FyaWEtZGlzYWJsZWQnLCBkaXNhYmxlID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdFx0aWYgKCBkaXNhYmxlICkge1xyXG5cdFx0XHRcdFx0XHRwYW5lbF9maWVsZC5zZXRBdHRyaWJ1dGUoICd0YWJpbmRleCcsICctMScgKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHBhbmVsX2ZpZWxkLnJlbW92ZUF0dHJpYnV0ZSggJ3RhYmluZGV4JyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybiBob3cgbWFueSB2YWxpZCBpbnN0YW5jZXMgd2l0aCB0aGlzIHVzYWdlIGtleSBleGlzdCBpbiB0aGUgY2FudmFzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBVc2FnZSBrZXkgb2YgYSBwYWxldHRlIGl0ZW0uXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBDb3VudCBvZiBleGlzdGluZyBub24taW52YWxpZCBpbnN0YW5jZXMuXHJcblx0XHQgKi9cclxuXHRcdGNvdW50X2Zvcl9rZXkoIGtleSApIHtcclxuXHRcdFx0aWYgKCAhIGtleSApIHtcclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gKCB0aGlzLnBhZ2VzX2NvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChcclxuICAgICAgICAgICAgICAgIGAud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3IC53cGJjX2JmYl9fZmllbGRbZGF0YS11c2FnZV9rZXk9XCIke0NvcmUuV1BCQ19CRkJfU2FuaXRpemUuZXNjX2F0dHJfdmFsdWVfZm9yX3NlbGVjdG9yKCBrZXkgKX1cIl06bm90KC5pcy1pbnZhbGlkKSwgXHJcbiAgICAgICAgICAgICAgICAgLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkW2RhdGEtdHlwZT1cIiR7Q29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NfYXR0cl92YWx1ZV9mb3Jfc2VsZWN0b3IoIGtleSApfVwiXTpub3QoLmlzLWludmFsaWQpYFxyXG5cdFx0XHQpIHx8IFtdICkubGVuZ3RoO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxpYXMgZm9yIGxpbWl0IGxvb2t1cCAocmVhZGFiaWxpdHkpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBVc2FnZSBrZXkgb2YgYSBwYWxldHRlIGl0ZW0uXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBMaW1pdCB2YWx1ZSBvciBJbmZpbml0eS5cclxuXHRcdCAqL1xyXG5cdFx0bGltaXRfZm9yX2tleSgga2V5ICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRfbGltaXRfZm9yX2tleSgga2V5ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW1haW5pbmcgc2xvdHMgZm9yIHRoaXMga2V5IChJbmZpbml0eSBpZiB1bmxpbWl0ZWQpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBVc2FnZSBrZXkgb2YgYSBwYWxldHRlIGl0ZW0uXHJcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBSZW1haW5pbmcgY291bnQgKD49IDApIG9yIEluZmluaXR5LlxyXG5cdFx0ICovXHJcblx0XHRyZW1haW5pbmdfZm9yX2tleSgga2V5ICkge1xyXG5cdFx0XHRjb25zdCBsaW1pdCA9IHRoaXMubGltaXRfZm9yX2tleSgga2V5ICk7XHJcblx0XHRcdGlmICggbGltaXQgPT09IEluZmluaXR5ICkge1xyXG5cdFx0XHRcdHJldHVybiBJbmZpbml0eTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB1c2VkID0gdGhpcy5jb3VudF9mb3Jfa2V5KCBrZXkgKTtcclxuXHRcdFx0cmV0dXJuIE1hdGgubWF4KCAwLCBsaW1pdCAtIHVzZWQgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRydWUgaWYgeW91IGNhbiBhZGQgYGRlbHRhYCBtb3JlIGl0ZW1zIGZvciB0aGlzIGtleS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5IG9mIGEgcGFsZXR0ZSBpdGVtLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZWx0YT0xXSAtIEhvdyBtYW55IGl0ZW1zIHlvdSBpbnRlbmQgdG8gYWRkLlxyXG5cdFx0ICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYWRkaW5nIGlzIGFsbG93ZWQuXHJcblx0XHQgKi9cclxuXHRcdGNhbl9hZGQoIGtleSwgZGVsdGEgPSAxICkge1xyXG5cdFx0XHRjb25zdCByZW0gPSB0aGlzLnJlbWFpbmluZ19mb3Jfa2V5KCBrZXkgKTtcclxuXHRcdFx0cmV0dXJuICggcmVtID09PSBJbmZpbml0eSApID8gdHJ1ZSA6ICggcmVtID49IGRlbHRhICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVSS1mYWNpbmcgZ2F0ZTogYWxlcnQgd2hlbiBleGNlZWRlZC4gUmV0dXJucyBib29sZWFuIGFsbG93ZWQvYmxvY2tlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5IG9mIGEgcGFsZXR0ZSBpdGVtLlxyXG5cdFx0ICogQHBhcmFtIHt7bGFiZWw/OiBzdHJpbmcsIGRlbHRhPzogbnVtYmVyfX0gW29wdHM9e31dIC0gT3B0aW9uYWwgVUkgaW5mby5cclxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFsbG93ZWQsIGZhbHNlIGlmIGJsb2NrZWQuXHJcblx0XHQgKi9cclxuXHRcdGdhdGVfb3JfYWxlcnQoIGtleSwgeyBsYWJlbCA9IGtleSwgZGVsdGEgPSAxIH0gPSB7fSApIHtcclxuXHRcdFx0aWYgKCB0aGlzLmNhbl9hZGQoIGtleSwgZGVsdGEgKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBsaW1pdCA9IHRoaXMubGltaXRfZm9yX2tleSgga2V5ICk7XHJcblx0XHRcdGFsZXJ0KCBgT25seSAke2xpbWl0fSBpbnN0YW5jZSR7bGltaXQgPiAxID8gJ3MnIDogJyd9IG9mIFwiJHtsYWJlbH1cIiBhbGxvd2VkLmAgKTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQmFja3dhcmQtY29tcGF0aWJsZSBhbGlhcyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgY29kZWJhc2UuICAtIENoZWNrIHdoZXRoZXIgYW5vdGhlciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlblxyXG5cdFx0ICogdXNhZ2Uga2V5IGNhbiBiZSBhZGRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVXNhZ2Uga2V5IG9mIGEgcGFsZXR0ZSBpdGVtLlxyXG5cdFx0ICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYWRkaW5nIG9uZSBtb3JlIGlzIGFsbG93ZWQuXHJcblx0XHQgKi9cclxuXHRcdGlzX3VzYWdlX29rKCBrZXkgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNhbl9hZGQoIGtleSwgMSApO1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdGFudCBldmVudCBuYW1lcyBmb3IgdGhlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9FdmVudHMgPSBPYmplY3QuZnJlZXplKHtcclxuXHRcdFNFTEVDVCAgICAgICAgICAgIDogJ3dwYmM6YmZiOnNlbGVjdCcsXHJcblx0XHRDTEVBUl9TRUxFQ1RJT04gICA6ICd3cGJjOmJmYjpjbGVhci1zZWxlY3Rpb24nLFxyXG5cdFx0RklFTERfQUREICAgICAgICAgOiAnd3BiYzpiZmI6ZmllbGQ6YWRkJyxcclxuXHRcdEZJRUxEX1JFTU9WRSAgICAgIDogJ3dwYmM6YmZiOmZpZWxkOnJlbW92ZScsXHJcblx0XHRTVFJVQ1RVUkVfQ0hBTkdFICA6ICd3cGJjOmJmYjpzdHJ1Y3R1cmU6Y2hhbmdlJyxcclxuXHRcdFNUUlVDVFVSRV9MT0FERUQgIDogJ3dwYmM6YmZiOnN0cnVjdHVyZTpsb2FkZWQnXHJcblx0fSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpZ2h0d2VpZ2h0IGV2ZW50IGJ1cyB0aGF0IGVtaXRzIHRvIGJvdGggdGhlIHBhZ2VzIGNvbnRhaW5lciBhbmQgZG9jdW1lbnQuXHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9FdmVudEJ1cyA9ICBjbGFzcyB7XHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNjb3BlX2VsIC0gRWxlbWVudCB0byBkaXNwYXRjaCBidWJibGVkIGV2ZW50cyBmcm9tLlxyXG5cdFx0ICovXHJcblx0XHRjb25zdHJ1Y3Rvciggc2NvcGVfZWwgKSB7XHJcblx0XHRcdHRoaXMuc2NvcGVfZWwgPSBzY29wZV9lbDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVtaXQgYSBET00gQ3VzdG9tRXZlbnQgd2l0aCBwYXlsb2FkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gRXZlbnQgdHlwZSAodXNlIENvcmUuV1BCQ19CRkJfRXZlbnRzLiB3aGVuIHBvc3NpYmxlKS5cclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBbZGV0YWlsPXt9XSAtIEFyYml0cmFyeSBzZXJpYWxpemFibGUgcGF5bG9hZC5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRlbWl0KCB0eXBlLCBkZXRhaWwgPSB7fSApIHtcclxuXHRcdFx0aWYgKCAhIHRoaXMuc2NvcGVfZWwgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuc2NvcGVfZWwuZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCB0eXBlLCB7IGRldGFpbDogeyAuLi5kZXRhaWwgfSwgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFN1YnNjcmliZSB0byBhbiBldmVudCBvbiBkb2N1bWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEV2ZW50IHR5cGUuXHJcblx0XHQgKiBAcGFyYW0geyhldjpDdXN0b21FdmVudCk9PnZvaWR9IGhhbmRsZXIgLSBIYW5kbGVyIGZ1bmN0aW9uLlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdG9uKCB0eXBlLCBoYW5kbGVyICkge1xyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGVyICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50IG9uIGRvY3VtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gRXZlbnQgdHlwZS5cclxuXHRcdCAqIEBwYXJhbSB7KGV2OkN1c3RvbUV2ZW50KT0+dm9pZH0gaGFuZGxlciAtIEhhbmRsZXIgZnVuY3Rpb24uXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0b2ZmKCB0eXBlLCBoYW5kbGVyICkge1xyXG5cdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGVyICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogU29ydGFibGVKUyBtYW5hZ2VyOiBzaW5nbGUgcG9pbnQgZm9yIGNvbnNpc3RlbnQgRG5EIGNvbmZpZy5cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX1NvcnRhYmxlTWFuYWdlciA9IGNsYXNzICB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcGFyYW0ge1dQQkNfRm9ybV9CdWlsZGVyfSBidWlsZGVyIC0gVGhlIGFjdGl2ZSBidWlsZGVyIGluc3RhbmNlLlxyXG5cdFx0ICogQHBhcmFtIHt7IGdyb3VwTmFtZT86IHN0cmluZywgYW5pbWF0aW9uPzogbnVtYmVyLCBnaG9zdENsYXNzPzogc3RyaW5nLCBjaG9zZW5DbGFzcz86IHN0cmluZywgZHJhZ0NsYXNzPzpcblx0XHQgKiAgICAgc3RyaW5nLCBjYW5kaWRhdGVfZHdlbGxfbXM/OiBudW1iZXIsIGNhbmRpZGF0ZV9jb21taXRfZGlzdGFuY2U/OiBudW1iZXIsXG5cdFx0ICogICAgIGNhbmRpZGF0ZV9kd2VsbF9kaXN0YW5jZT86IG51bWJlciB9fSBbb3B0cz17fV0gLSBWaXN1YWwgYW5kIGRyYWctc3RhYmlsaXR5IG9wdGlvbnMuXG5cdFx0ICovXHJcblx0XHRjb25zdHJ1Y3RvciggYnVpbGRlciwgb3B0cyA9IHt9ICkge1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xyXG5cdFx0XHRjb25zdCBnaWQgPSB0aGlzLmJ1aWxkZXI/Lmluc3RhbmNlX2lkIHx8IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDggKTtcclxuXHRcdFx0dGhpcy5vcHRzID0ge1xyXG5cdFx0XHRcdC8vIGdyb3VwTmFtZSAgOiAnZm9ybScsXHJcblx0XHRcdFx0Z3JvdXBOYW1lOiBgZm9ybS0ke2dpZH1gLFxyXG5cdFx0XHRcdGFuaW1hdGlvbiAgOiAxNTAsXHJcblx0XHRcdFx0Z2hvc3RDbGFzcyA6ICd3cGJjX2JmYl9fZHJhZy1naG9zdCcsXG5cdFx0XHRcdGNob3NlbkNsYXNzOiAnd3BiY19iZmJfX2hpZ2hsaWdodCcsXG5cdFx0XHRcdGRyYWdDbGFzcyAgOiAnd3BiY19iZmJfX2RyYWctYWN0aXZlJyxcblx0XHRcdFx0Y2FuZGlkYXRlX2R3ZWxsX21zICAgICAgICA6IDkwLFxuXHRcdFx0XHRjYW5kaWRhdGVfY29tbWl0X2Rpc3RhbmNlIDogMTAsXG5cdFx0XHRcdGNhbmRpZGF0ZV9kd2VsbF9kaXN0YW5jZSAgOiAyLFxuXHRcdFx0XHQuLi5vcHRzXG5cdFx0XHR9O1xuXHRcdFx0LyoqIEB0eXBlIHtTZXQ8SFRNTEVsZW1lbnQ+fSAqL1xyXG5cdFx0XHR0aGlzLl9jb250YWluZXJzID0gbmV3IFNldCgpO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIEd1YXJkIGFnYWluc3QgbG9zdCBtb3VzZXVwIC8gcG9pbnRlcnVwIGV2ZW50cy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHRcdCAqL1xyXG5cdFx0XHR0aGlzLl9kcmFnX2ZhaWxfc2FmZV9ib3VuZCA9IGZhbHNlO1xuXG5cdFx0XHQvKipcblx0XHRcdCAqIFN0YXRlIGZvciB0aGUgY3VycmVudCBGb3JtIEJ1aWxkZXIgY2FudmFzIGRyYWcuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUgez9PYmplY3R9XG5cdFx0XHQgKi9cblx0XHRcdHRoaXMuX2RyYWdfc3RhdGUgPSBudWxsO1xuXHJcblx0XHRcdHRoaXMuX2JpbmRfZHJhZ19mYWlsX3NhZmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENsZWFudXAgZHJhZyBVSSBzdGF0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIGlzIGEgZGVmZW5zaXZlIGNsZWFudXAgZm9yIGNhc2VzIHdoZW4gQ2hyb21lIG9yIGEgYnJvd3NlciBleHRlbnNpb25cclxuXHRcdCAqIGxvc2VzIHRoZSBmaW5hbCBtb3VzZXVwIC8gcG9pbnRlcnVwIGV2ZW50IGR1cmluZyBmYWxsYmFjayBkcmFnZ2luZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0X2NsZWFudXBfZHJhZ191aSgpIHtcblx0XHRcdGNvbnN0IGRyYWdfc3RhdGUgPSB0aGlzLl9kcmFnX3N0YXRlO1xuXG5cdFx0XHRpZiAoIGRyYWdfc3RhdGU/Lml0ZW0gKSB7XG5cdFx0XHRcdGRyYWdfc3RhdGUuaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCAnd3BiY19iZmJfX2Ryb3AtaW5kaWNhdG9yJyApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBkcmFnX3N0YXRlPy5zb3VyY2Vfc3BhY2VyPy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRkcmFnX3N0YXRlLnNvdXJjZV9zcGFjZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZHJhZ19zdGF0ZS5zb3VyY2Vfc3BhY2VyICk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9yZWxlYXNlX2NhbnZhc19nZW9tZXRyeV9sb2NrcyggZHJhZ19zdGF0ZSApO1xuXG5cdFx0XHR0aGlzLl9kcmFnX3N0YXRlID0gbnVsbDtcblx0XHRcdHRoaXMuX3RvZ2dsZV9kbmRfcm9vdF9mbGFncyggZmFsc2UgKTtcblx0XHRcdHRoaXMuYnVpbGRlcj8uX3JlbW92ZV9kcmFnZ2luZ19jbGFzcz8uKCk7XG5cclxuXHRcdFx0Ly8gUmVtb3ZlIG9ubHkgZmFsbGJhY2sgbWlycm9ycy4gRG8gbm90IHRvdWNoIHJlYWwgZHJhZ2dlZCBlbGVtZW50cy5cclxuXHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJy5zb3J0YWJsZS1mYWxsYmFja1tkYXRhLWRyYWctcm9sZV0sIC53cGJjX2JmYl9fc2ltcGxlX2xpc3RfZmFsbGJhY2snIClcclxuXHRcdFx0XHRcdC5mb3JFYWNoKCAoZWwpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbC5wYXJlbnROb2RlICkge1xyXG5cdFx0XHRcdFx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBDYXB0dXJlIHRoZSBibG9jayBzaXplIG9mIGV2ZXJ5IGNhbnZhcyBsYXlvdXQgY29udGFpbmVyIGJlZm9yZSBkcmFnIHJlZmxvdyBzdGFydHMuXG5cdFx0ICpcblx0XHQgKiBTb3J0YWJsZUpTIHRlbXBvcmFyaWx5IG1vdmVzIHRoZSByZWFsIG5vZGUgYmV0d2VlbiBjb250YWluZXJzLiBUaGF0IGNoYW5nZXMgQ1NTXG5cdFx0ICogYDplbXB0eWAgbWF0Y2hpbmcgYW5kIGNhbiBvdGhlcndpc2Ugc2hyaW5rIGFuIGVtcHR5IGRlc3RpbmF0aW9uIHJvdyBvciBncm93IGFcblx0XHQgKiBwb3B1bGF0ZWQgZGVzdGluYXRpb24gYnkgdGhlIGluc2VydGlvbi1saW5lIGhlaWdodC4gVGhlIGNhcHR1cmVkIHZhbHVlcyBhcmVcblx0XHQgKiBhcHBsaWVkIG9ubHkgZm9yIHRoZSBhY3RpdmUgZHJhZyBzZXNzaW9uIGFuZCBuZXZlciBiZWNvbWUgc2F2ZWQgZm9ybSBkYXRhLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge0FycmF5PE9iamVjdD59IFJlc3RvcmFibGUgZ2VvbWV0cnktbG9jayByZWNvcmRzIGZvciB2aXNpYmxlIGNhbnZhcyBjb250YWluZXJzLlxuXHRcdCAqL1xuXHRcdF9jYXB0dXJlX2NhbnZhc19nZW9tZXRyeV9sb2NrcygpIHtcblx0XHRcdGNvbnN0IHBhZ2VzX2NvbnRhaW5lciA9IHRoaXMuYnVpbGRlcj8ucGFnZXNfY29udGFpbmVyO1xuXHRcdFx0aWYgKCAhIHBhZ2VzX2NvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbCApIHtcblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBsb2NrX3NlbGVjdG9yID0gW1xuXHRcdFx0XHQnLndwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXInLFxuXHRcdFx0XHQnLndwYmNfYmZiX19yb3cnLFxuXHRcdFx0XHQnLndwYmNfYmZiX19jb2x1bW4nXG5cdFx0XHRdLmpvaW4oICcsICcgKTtcblx0XHRcdGNvbnN0IGJsb2NrX3NpemVfcHJvcGVydHkgPSAnLS13cGJjLWJmYi1kcmFnLWxvY2tlZC1ibG9jay1zaXplJztcblxuXHRcdFx0cmV0dXJuIEFycmF5LmZyb20oIHBhZ2VzX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCBsb2NrX3NlbGVjdG9yICkgKVxuXHRcdFx0XHQubWFwKCAoIGVsZW1lbnQgKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYmxvY2tfc2l6ZSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0Py4oKS5oZWlnaHQ7XG5cdFx0XHRcdFx0aWYgKCAhIE51bWJlci5pc0Zpbml0ZSggYmxvY2tfc2l6ZSApIHx8IGJsb2NrX3NpemUgPD0gMCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgOiBlbGVtZW50LFxuXHRcdFx0XHRcdFx0YmxvY2tfc2l6ZSAgICAgICAgICAgICAgICAgIDogTWF0aC5yb3VuZCggYmxvY2tfc2l6ZSAqIDEwMDAgKSAvIDEwMDAsXG5cdFx0XHRcdFx0XHRoYWRfbG9ja19jbGFzcyAgICAgICAgICAgICAgOiBlbGVtZW50LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fZHJhZy1nZW9tZXRyeS1sb2NrJyApLFxuXHRcdFx0XHRcdFx0cHJldmlvdXNfYmxvY2tfc2l6ZSAgICAgICAgIDogZWxlbWVudC5zdHlsZT8uZ2V0UHJvcGVydHlWYWx1ZT8uKCBibG9ja19zaXplX3Byb3BlcnR5ICkgfHwgJycsXG5cdFx0XHRcdFx0XHRwcmV2aW91c19ibG9ja19zaXplX3ByaW9yaXR5OiBlbGVtZW50LnN0eWxlPy5nZXRQcm9wZXJ0eVByaW9yaXR5Py4oIGJsb2NrX3NpemVfcHJvcGVydHkgKSB8fCAnJ1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gKVxuXHRcdFx0XHQuZmlsdGVyKCBCb29sZWFuICk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogRnJlZXplIGNhcHR1cmVkIGNhbnZhcyBjb250YWluZXIgaGVpZ2h0cyBmb3IgdGhlIGFjdGl2ZSBTb3J0YWJsZUpTIHNlc3Npb24uXG5cdFx0ICpcblx0XHQgKiBUaGUgbG9jayBpcyBhcHBsaWVkIGJlZm9yZSBnbG9iYWwgZHJhZyBjbGFzc2VzIG9yIHRoZSBjb21wYWN0IGluc2VydGlvbiBtYXJrZXJcblx0XHQgKiBjYW4gY2hhbmdlIGZsZXggYWxpZ25tZW50IGFuZCBlbXB0eS1jb250YWluZXIgc2VsZWN0b3JzLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0X2FwcGx5X2NhbnZhc19nZW9tZXRyeV9sb2NrcygpIHtcblx0XHRcdGNvbnN0IGdlb21ldHJ5X2xvY2tzID0gdGhpcy5fZHJhZ19zdGF0ZT8uZ2VvbWV0cnlfbG9ja3MgfHwgW107XG5cblx0XHRcdGdlb21ldHJ5X2xvY2tzLmZvckVhY2goICggZ2VvbWV0cnlfbG9jayApID0+IHtcblx0XHRcdFx0Z2VvbWV0cnlfbG9jay5lbGVtZW50LnN0eWxlPy5zZXRQcm9wZXJ0eShcblx0XHRcdFx0XHQnLS13cGJjLWJmYi1kcmFnLWxvY2tlZC1ibG9jay1zaXplJyxcblx0XHRcdFx0XHRgJHtnZW9tZXRyeV9sb2NrLmJsb2NrX3NpemV9cHhgXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGdlb21ldHJ5X2xvY2suZWxlbWVudC5jbGFzc0xpc3Q/LmFkZCggJ3dwYmNfYmZiX19kcmFnLWdlb21ldHJ5LWxvY2snICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmVzdG9yZSBhbGwgaW5saW5lIHN0YXRlIHVzZWQgYnkgdGhlIGRyYWctc2Vzc2lvbiBnZW9tZXRyeSBsb2NrLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHs/T2JqZWN0fSBkcmFnX3N0YXRlIC0gRHJhZyBzdGF0ZSB3aG9zZSBnZW9tZXRyeSByZWNvcmRzIG11c3QgYmUgcmVzdG9yZWQuXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0X3JlbGVhc2VfY2FudmFzX2dlb21ldHJ5X2xvY2tzKCBkcmFnX3N0YXRlICkge1xuXHRcdFx0Y29uc3QgYmxvY2tfc2l6ZV9wcm9wZXJ0eSA9ICctLXdwYmMtYmZiLWRyYWctbG9ja2VkLWJsb2NrLXNpemUnO1xuXHRcdFx0Y29uc3QgZ2VvbWV0cnlfbG9ja3MgICAgICA9IGRyYWdfc3RhdGU/Lmdlb21ldHJ5X2xvY2tzIHx8IFtdO1xuXG5cdFx0XHRnZW9tZXRyeV9sb2Nrcy5mb3JFYWNoKCAoIGdlb21ldHJ5X2xvY2sgKSA9PiB7XG5cdFx0XHRcdGlmICggZ2VvbWV0cnlfbG9jay5wcmV2aW91c19ibG9ja19zaXplICkge1xuXHRcdFx0XHRcdGdlb21ldHJ5X2xvY2suZWxlbWVudC5zdHlsZT8uc2V0UHJvcGVydHkoXG5cdFx0XHRcdFx0XHRibG9ja19zaXplX3Byb3BlcnR5LFxuXHRcdFx0XHRcdFx0Z2VvbWV0cnlfbG9jay5wcmV2aW91c19ibG9ja19zaXplLFxuXHRcdFx0XHRcdFx0Z2VvbWV0cnlfbG9jay5wcmV2aW91c19ibG9ja19zaXplX3ByaW9yaXR5XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRnZW9tZXRyeV9sb2NrLmVsZW1lbnQuc3R5bGU/LnJlbW92ZVByb3BlcnR5Py4oIGJsb2NrX3NpemVfcHJvcGVydHkgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggISBnZW9tZXRyeV9sb2NrLmhhZF9sb2NrX2NsYXNzICkge1xuXHRcdFx0XHRcdGdlb21ldHJ5X2xvY2suZWxlbWVudC5jbGFzc0xpc3Q/LnJlbW92ZSggJ3dwYmNfYmZiX19kcmFnLWdlb21ldHJ5LWxvY2snICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBDYXB0dXJlIHRoZSBvcmlnaW5hbCBjYW52YXMgZ2VvbWV0cnkgYmVmb3JlIFNvcnRhYmxlSlMgYXBwbGllcyBpdHMgZ2hvc3QgY2xhc3MuXG5cdFx0ICpcblx0XHQgKiBUaGUgc2F2ZWQgcmVjdGFuZ2xlIGlzIGxhdGVyIHJlcHJlc2VudGVkIGJ5IGEgbm9uLWRhdGEgc3BhY2VyLiBUaGlzIGtlZXBzIHRoZVxuXHRcdCAqIHNvdXJjZSBsYXlvdXQgc3RhYmxlIHdoaWxlIHRoZSByZWFsIGRyYWdnZWQgbm9kZSBiZWNvbWVzIGEgY29tcGFjdCBpbnNlcnRpb25cblx0XHQgKiBpbmRpY2F0b3IgaW4gYW5vdGhlciBjb250YWluZXIuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1NvcnRhYmxlLlNvcnRhYmxlRXZlbnR9IGV2dCAtIFNvcnRhYmxlIGNob29zZSBldmVudC5cblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHQgKi9cblx0XHRfcHJlcGFyZV9kcmFnX3N0YXRlKCBldnQgKSB7XG5cdFx0XHRpZiAoICEgZXZ0Py5pdGVtIHx8ICEgZXZ0Py5mcm9tICkge1xuXHRcdFx0XHR0aGlzLl9kcmFnX3N0YXRlID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzb3VyY2VfcmVjdCAgPSBldnQuaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdGNvbnN0IGZyb21fcGFsZXR0ZSA9ICEhIHRoaXMuYnVpbGRlcj8ucGFsZXR0ZV91bHM/LmluY2x1ZGVzPy4oIGV2dC5mcm9tICk7XG5cblx0XHRcdHRoaXMuX2RyYWdfc3RhdGUgPSB7XG5cdFx0XHRcdGl0ZW0gICAgICAgICAgICAgICAgOiBldnQuaXRlbSxcblx0XHRcdFx0ZnJvbV9wYWxldHRlICAgICAgICA6IGZyb21fcGFsZXR0ZSxcblx0XHRcdFx0c291cmNlX3BhcmVudCAgICAgICA6IGV2dC5mcm9tLFxuXHRcdFx0XHRzb3VyY2VfbmV4dF9zaWJsaW5nIDogZXZ0Lml0ZW0ubmV4dFNpYmxpbmcsXG5cdFx0XHRcdHNvdXJjZV9yZWN0ICAgICAgICAgOiB7XG5cdFx0XHRcdFx0d2lkdGggOiBzb3VyY2VfcmVjdC53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHNvdXJjZV9yZWN0LmhlaWdodFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZW9tZXRyeV9sb2NrcyAgICAgIDogdGhpcy5fY2FwdHVyZV9jYW52YXNfZ2VvbWV0cnlfbG9ja3MoKSxcblx0XHRcdFx0c291cmNlX3NwYWNlciAgICAgICA6IG51bGwsXG5cdFx0XHRcdGFjY2VwdGVkX2NhbmRpZGF0ZSAgOiBudWxsLFxuXHRcdFx0XHRwZW5kaW5nX2NhbmRpZGF0ZSAgIDogbnVsbCxcblx0XHRcdFx0cGVuZGluZ19zaW5jZSAgICAgICA6IDAsXG5cdFx0XHRcdHBlbmRpbmdfcG9pbnRlciAgICAgOiBudWxsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIENyZWF0ZSBhIG1lYXN1cmVkLCBub24tZGF0YSBmb290cHJpbnQgYXQgdGhlIGRyYWdnZWQgaXRlbSdzIHNvdXJjZSBwb3NpdGlvbi5cblx0XHQgKlxuXHRcdCAqIFRoZSBzcGFjZXIgaW50ZW50aW9uYWxseSBkb2VzIG5vdCB1c2UgZmllbGQgb3Igc2VjdGlvbiBjbGFzc2VzLCBzbyBGb3JtIEJ1aWxkZXJcblx0XHQgKiBzZXJpYWxpemF0aW9uIGFuZCB1c2FnZSBhY2NvdW50aW5nIGNhbm5vdCB0cmVhdCBpdCBhcyBzYXZlZCBmb3JtIGNvbnRlbnQuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHQgKi9cblx0XHRfY3JlYXRlX2RyYWdfc291cmNlX3NwYWNlcigpIHtcblx0XHRcdGNvbnN0IGRyYWdfc3RhdGUgPSB0aGlzLl9kcmFnX3N0YXRlO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCEgZHJhZ19zdGF0ZSB8fFxuXHRcdFx0XHRkcmFnX3N0YXRlLmZyb21fcGFsZXR0ZSB8fFxuXHRcdFx0XHQhIGRyYWdfc3RhdGUuaXRlbSB8fFxuXHRcdFx0XHQhIGRyYWdfc3RhdGUuc291cmNlX3BhcmVudCB8fFxuXHRcdFx0XHRkcmFnX3N0YXRlLnNvdXJjZV9zcGFjZXJcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNwYWNlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG5cdFx0XHRjb25zdCB3aWR0aCAgPSBNYXRoLm1heCggMSwgZHJhZ19zdGF0ZS5zb3VyY2VfcmVjdD8ud2lkdGggfHwgMSApO1xuXHRcdFx0Y29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoIDEsIGRyYWdfc3RhdGUuc291cmNlX3JlY3Q/LmhlaWdodCB8fCAxICk7XG5cblx0XHRcdHNwYWNlci5jbGFzc05hbWUgPSAnd3BiY19iZmJfX2RyYWctc291cmNlLXNwYWNlcic7XG5cdFx0XHRzcGFjZXIuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCAndHJ1ZScgKTtcblx0XHRcdHNwYWNlci5zZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWRyYWctc291cmNlLXNwYWNlcicsICd0cnVlJyApO1xuXHRcdFx0c3BhY2VyLnN0eWxlLnNldFByb3BlcnR5KCAnLS13cGJjLWJmYi1kcmFnLXNvdXJjZS1pbmxpbmUtc2l6ZScsIGAke3dpZHRofXB4YCApO1xuXHRcdFx0c3BhY2VyLnN0eWxlLnNldFByb3BlcnR5KCAnLS13cGJjLWJmYi1kcmFnLXNvdXJjZS1ibG9jay1zaXplJywgYCR7aGVpZ2h0fXB4YCApO1xuXG5cdFx0XHRjb25zdCByZWZlcmVuY2Vfbm9kZSA9IGRyYWdfc3RhdGUuc291cmNlX25leHRfc2libGluZz8ucGFyZW50Tm9kZSA9PT0gZHJhZ19zdGF0ZS5zb3VyY2VfcGFyZW50XG5cdFx0XHRcdD8gZHJhZ19zdGF0ZS5zb3VyY2VfbmV4dF9zaWJsaW5nXG5cdFx0XHRcdDogbnVsbDtcblxuXHRcdFx0ZHJhZ19zdGF0ZS5zb3VyY2VfcGFyZW50Lmluc2VydEJlZm9yZSggc3BhY2VyLCByZWZlcmVuY2Vfbm9kZSApO1xuXHRcdFx0ZHJhZ19zdGF0ZS5zb3VyY2Vfc3BhY2VyID0gc3BhY2VyO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFN0YXJ0IHRoZSBzdGFibGUgZHJhZyByZXByZXNlbnRhdGlvbiBhZnRlciBTb3J0YWJsZUpTIGNyZWF0ZXMgaXRzIG9mZi1mbG93IG1pcnJvci5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U29ydGFibGUuU29ydGFibGVFdmVudH0gZXZ0IC0gU29ydGFibGUgc3RhcnQgZXZlbnQuXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0X3N0YXJ0X2RyYWcoIGV2dCApIHtcblx0XHRcdGlmICggISB0aGlzLl9kcmFnX3N0YXRlICkge1xuXHRcdFx0XHR0aGlzLl9wcmVwYXJlX2RyYWdfc3RhdGUoIGV2dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9hcHBseV9jYW52YXNfZ2VvbWV0cnlfbG9ja3MoKTtcblx0XHRcdHRoaXMuYnVpbGRlcj8uX2FkZF9kcmFnZ2luZ19jbGFzcz8uKCk7XG5cblx0XHRcdGNvbnN0IGZyb21fcGFsZXR0ZSA9ICEhIHRoaXMuX2RyYWdfc3RhdGU/LmZyb21fcGFsZXR0ZTtcblx0XHRcdHRoaXMuX3RvZ2dsZV9kbmRfcm9vdF9mbGFncyggdHJ1ZSwgZnJvbV9wYWxldHRlICk7XG5cdFx0XHR0aGlzLl90YWdfZHJhZ19taXJyb3IoIGV2dCApO1xuXG5cdFx0XHRpZiAoICEgZnJvbV9wYWxldHRlICYmIGV2dD8uaXRlbSApIHtcblx0XHRcdFx0dGhpcy5fY3JlYXRlX2RyYWdfc291cmNlX3NwYWNlcigpO1xuXHRcdFx0XHRldnQuaXRlbS5jbGFzc0xpc3QuYWRkKCAnd3BiY19iZmJfX2Ryb3AtaW5kaWNhdG9yJyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEZpbmlzaCBhIEZvcm0gQnVpbGRlciBkcmFnIGFuZCByZW1vdmUgdHJhbnNpZW50IGxheW91dCBoZWxwZXJzLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0X2ZpbmlzaF9kcmFnKCkge1xuXHRcdFx0dGhpcy5fY2xlYW51cF9kcmFnX3VpKCk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQ2hlY2sgd2hldGhlciBhIFNvcnRhYmxlSlMgY2FudmFzIGNhbmRpZGF0ZSBpcyBzdGFibGUgZW5vdWdoIHRvIGFjY2VwdC5cblx0XHQgKlxuXHRcdCAqIFRoZSBjYW5kaWRhdGUgaW5jbHVkZXMgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciwgcmVsYXRlZCBzaWJsaW5nLCBhbmQgaW5zZXJ0aW9uXG5cdFx0ICogc2lkZS4gQSBuZXcgY2FuZGlkYXRlIG11c3QgcmVjZWl2ZSByZWFsIHBvaW50ZXIgbW92ZW1lbnQgYmVmb3JlIGl0IGNhbiByZXBsYWNlXG5cdFx0ICogdGhlIGFjY2VwdGVkIHBvc2l0aW9uLCBwcmV2ZW50aW5nIGxheW91dCBtb3ZlbWVudCBhbG9uZSBmcm9tIGNhdXNpbmcgZmxpcC1mbG9wcy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBldnQgLSBTb3J0YWJsZSBtb3ZlIGV2ZW50LlxuXHRcdCAqIEBwYXJhbSB7TW91c2VFdmVudHxQb2ludGVyRXZlbnR8VG91Y2hFdmVudH0gb3JpZ2luYWxfZXZlbnQgLSBPcmlnaW5hbCBwb2ludGVyIGV2ZW50LlxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIFNvcnRhYmxlSlMgbWF5IG1vdmUgdGhlIGluLWZsb3cgaW5zZXJ0aW9uIGluZGljYXRvci5cblx0XHQgKi9cblx0XHRfYWxsb3dfY2FudmFzX21vdmUoIGV2dCwgb3JpZ2luYWxfZXZlbnQgKSB7XG5cdFx0XHRjb25zdCB7IHRvLCBmcm9tIH0gPSBldnQgfHwge307XG5cdFx0XHRpZiAoICEgdG8gfHwgISBmcm9tICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhIHRvLmNsb3Nlc3QoICcud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3JyApICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdG91Y2hfZXZlbnQgID0gb3JpZ2luYWxfZXZlbnQ/LnRvdWNoZXM/LlswXSB8fCBvcmlnaW5hbF9ldmVudD8uY2hhbmdlZFRvdWNoZXM/LlswXTtcblx0XHRcdGNvbnN0IGV2ZW50X3ggICAgICA9IHRvdWNoX2V2ZW50Py5jbGllbnRYID8/IG9yaWdpbmFsX2V2ZW50Py5jbGllbnRYO1xuXHRcdFx0Y29uc3QgZXZlbnRfeSAgICAgID0gdG91Y2hfZXZlbnQ/LmNsaWVudFkgPz8gb3JpZ2luYWxfZXZlbnQ/LmNsaWVudFk7XG5cdFx0XHRjb25zdCBkcmFnZ2VkX3JlY3QgPSBldnQuZHJhZ2dlZFJlY3QgfHwgZXZ0LmRyYWdnZWQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdD8uKCk7XG5cdFx0XHRjb25zdCBwb2ludGVyX3ggICAgPSBOdW1iZXIuaXNGaW5pdGUoIGV2ZW50X3ggKVxuXHRcdFx0XHQ/IGV2ZW50X3hcblx0XHRcdFx0OiAoZHJhZ2dlZF9yZWN0ID8gZHJhZ2dlZF9yZWN0LmxlZnQgKyAoZHJhZ2dlZF9yZWN0LndpZHRoIC8gMikgOiAwKTtcblx0XHRcdGNvbnN0IHBvaW50ZXJfeSAgICA9IE51bWJlci5pc0Zpbml0ZSggZXZlbnRfeSApXG5cdFx0XHRcdD8gZXZlbnRfeVxuXHRcdFx0XHQ6IChkcmFnZ2VkX3JlY3QgPyBkcmFnZ2VkX3JlY3QudG9wICsgKGRyYWdnZWRfcmVjdC5oZWlnaHQgLyAyKSA6IDApO1xuXG5cdFx0XHQvLyBDcm9zcy1jb250YWluZXIgY29sdW1uIGNoYW5nZXMgcmVxdWlyZSBhIGRlbGliZXJhdGUgbW92ZSBpbnNpZGUgdGhlIG5ldyBjb2x1bW4uXG5cdFx0XHRpZiAoIHRvICE9PSBmcm9tICYmIHRvLmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fY29sdW1uJyApICkge1xuXHRcdFx0XHRjb25zdCBjb250YWluZXJfcmVjdCA9IHRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRjb25zdCBwYWRkaW5nX3ggICAgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmNsYW1wKCBjb250YWluZXJfcmVjdC53aWR0aCAqIDAuMjAsIDEyLCAzNiApO1xuXHRcdFx0XHRjb25zdCBwYWRkaW5nX3kgICAgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmNsYW1wKCBjb250YWluZXJfcmVjdC5oZWlnaHQgKiAwLjEwLCA2LCAxNiApO1xuXHRcdFx0XHRjb25zdCB2aXN1YWxseV9lbXB0eSAgPSAhIHRvLnF1ZXJ5U2VsZWN0b3IoXG5cdFx0XHRcdFx0JzpzY29wZSA+IC53cGJjX2JmYl9fZmllbGQ6bm90KC53cGJjX2JmYl9fZHJvcC1pbmRpY2F0b3IpLCAnICtcblx0XHRcdFx0XHQnOnNjb3BlID4gLndwYmNfYmZiX19zZWN0aW9uOm5vdCgud3BiY19iZmJfX2Ryb3AtaW5kaWNhdG9yKSdcblx0XHRcdFx0KSB8fCBjb250YWluZXJfcmVjdC5oZWlnaHQgPCA2NDtcblx0XHRcdFx0Y29uc3QgaW5uZXJfdG9wICAgICAgID0gY29udGFpbmVyX3JlY3QudG9wICsgKHZpc3VhbGx5X2VtcHR5ID8gNCA6IHBhZGRpbmdfeSk7XG5cdFx0XHRcdGNvbnN0IGlubmVyX2JvdHRvbSAgICA9IGNvbnRhaW5lcl9yZWN0LmJvdHRvbSAtICh2aXN1YWxseV9lbXB0eSA/IDQgOiBwYWRkaW5nX3kpO1xuXHRcdFx0XHRjb25zdCBpbm5lcl9sZWZ0ICAgICAgPSBjb250YWluZXJfcmVjdC5sZWZ0ICsgcGFkZGluZ194O1xuXHRcdFx0XHRjb25zdCBpbm5lcl9yaWdodCAgICAgPSBjb250YWluZXJfcmVjdC5yaWdodCAtIHBhZGRpbmdfeDtcblxuXHRcdFx0XHRpZiAoIHBvaW50ZXJfeCA8PSBpbm5lcl9sZWZ0IHx8IHBvaW50ZXJfeCA+PSBpbm5lcl9yaWdodCB8fCBwb2ludGVyX3kgPD0gaW5uZXJfdG9wIHx8IHBvaW50ZXJfeSA+PSBpbm5lcl9ib3R0b20gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRyYWdfc3RhdGUgPSB0aGlzLl9kcmFnX3N0YXRlO1xuXHRcdFx0aWYgKCAhIGRyYWdfc3RhdGUgKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5kaWRhdGUgPSB7XG5cdFx0XHRcdHRvICAgICAgICAgICAgICAgIDogdG8sXG5cdFx0XHRcdHJlbGF0ZWQgICAgICAgICAgIDogZXZ0LnJlbGF0ZWQgfHwgbnVsbCxcblx0XHRcdFx0d2lsbF9pbnNlcnRfYWZ0ZXIgOiAhISBldnQud2lsbEluc2VydEFmdGVyXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlX21hdGNoZXMgPSAoIGZpcnN0LCBzZWNvbmQgKSA9PiAhISBmaXJzdCAmJiAhISBzZWNvbmQgJiZcblx0XHRcdFx0Zmlyc3QudG8gPT09IHNlY29uZC50byAmJlxuXHRcdFx0XHRmaXJzdC5yZWxhdGVkID09PSBzZWNvbmQucmVsYXRlZCAmJlxuXHRcdFx0XHRmaXJzdC53aWxsX2luc2VydF9hZnRlciA9PT0gc2Vjb25kLndpbGxfaW5zZXJ0X2FmdGVyO1xuXG5cdFx0XHRpZiAoIGNhbmRpZGF0ZV9tYXRjaGVzKCBjYW5kaWRhdGUsIGRyYWdfc3RhdGUuYWNjZXB0ZWRfY2FuZGlkYXRlICkgKSB7XG5cdFx0XHRcdGV2dC5kcmFnZ2VkPy5jbGFzc0xpc3QuYWRkKCAnd3BiY19iZmJfX2Ryb3AtaW5kaWNhdG9yJyApO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgbm93ID0gd2luZG93LnBlcmZvcm1hbmNlPy5ub3c/LigpID8/IERhdGUubm93KCk7XG5cdFx0XHRpZiAoICEgY2FuZGlkYXRlX21hdGNoZXMoIGNhbmRpZGF0ZSwgZHJhZ19zdGF0ZS5wZW5kaW5nX2NhbmRpZGF0ZSApICkge1xuXHRcdFx0XHRkcmFnX3N0YXRlLnBlbmRpbmdfY2FuZGlkYXRlID0gY2FuZGlkYXRlO1xuXHRcdFx0XHRkcmFnX3N0YXRlLnBlbmRpbmdfc2luY2UgICAgID0gbm93O1xuXHRcdFx0XHRkcmFnX3N0YXRlLnBlbmRpbmdfcG9pbnRlciAgID0geyB4OiBwb2ludGVyX3gsIHk6IHBvaW50ZXJfeSB9O1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHBvaW50ZXJfZGlzdGFuY2UgPSBNYXRoLmh5cG90KFxuXHRcdFx0XHRwb2ludGVyX3ggLSBkcmFnX3N0YXRlLnBlbmRpbmdfcG9pbnRlci54LFxuXHRcdFx0XHRwb2ludGVyX3kgLSBkcmFnX3N0YXRlLnBlbmRpbmdfcG9pbnRlci55XG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlX2FnZSAgICAgICAgICAgID0gbm93IC0gZHJhZ19zdGF0ZS5wZW5kaW5nX3NpbmNlO1xuXHRcdFx0Y29uc3QgY3Jvc3NlZF9jb21taXRfZGlzdGFuY2UgPSBwb2ludGVyX2Rpc3RhbmNlID49IHRoaXMub3B0cy5jYW5kaWRhdGVfY29tbWl0X2Rpc3RhbmNlO1xuXHRcdFx0Y29uc3QgY29tcGxldGVkX2R3ZWxsX21vdmUgICAgPSBjYW5kaWRhdGVfYWdlID49IHRoaXMub3B0cy5jYW5kaWRhdGVfZHdlbGxfbXMgJiZcblx0XHRcdFx0cG9pbnRlcl9kaXN0YW5jZSA+PSB0aGlzLm9wdHMuY2FuZGlkYXRlX2R3ZWxsX2Rpc3RhbmNlO1xuXG5cdFx0XHRpZiAoICEgY3Jvc3NlZF9jb21taXRfZGlzdGFuY2UgJiYgISBjb21wbGV0ZWRfZHdlbGxfbW92ZSApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRkcmFnX3N0YXRlLmFjY2VwdGVkX2NhbmRpZGF0ZSA9IGNhbmRpZGF0ZTtcblx0XHRcdGRyYWdfc3RhdGUucGVuZGluZ19jYW5kaWRhdGUgID0gbnVsbDtcblx0XHRcdGRyYWdfc3RhdGUucGVuZGluZ19zaW5jZSAgICAgID0gMDtcblx0XHRcdGRyYWdfc3RhdGUucGVuZGluZ19wb2ludGVyICAgID0gbnVsbDtcblx0XHRcdGV2dC5kcmFnZ2VkPy5jbGFzc0xpc3QuYWRkKCAnd3BiY19iZmJfX2Ryb3AtaW5kaWNhdG9yJyApO1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQmluZCBnbG9iYWwgZmFpbC1zYWZlIGxpc3RlbmVycyBmb3IgZHJhZyBjbGVhbnVwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRfYmluZF9kcmFnX2ZhaWxfc2FmZSgpIHtcclxuXHRcdFx0aWYgKCB0aGlzLl9kcmFnX2ZhaWxfc2FmZV9ib3VuZCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2RyYWdfZmFpbF9zYWZlX2JvdW5kID0gdHJ1ZTtcclxuXHJcblx0XHRcdGNvbnN0IGZpbmlzaF9kcmFnID0gKCkgPT4ge1xyXG5cdFx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuX2NsZWFudXBfZHJhZ191aSgpO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdFsgJ21vdXNldXAnLCAncG9pbnRlcnVwJywgJ3RvdWNoZW5kJywgJ2RyYWdlbmQnIF0uZm9yRWFjaCggKGV2dF9uYW1lKSA9PiB7XHJcblx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggZXZ0X25hbWUsIGZpbmlzaF9kcmFnLCB0cnVlICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnYmx1cicsIGZpbmlzaF9kcmFnLCB0cnVlICk7XHJcblxyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG5cdFx0XHRcdCd2aXNpYmlsaXR5Y2hhbmdlJyxcclxuXHRcdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiApIHtcclxuXHRcdFx0XHRcdFx0ZmluaXNoX2RyYWcoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHRydWVcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRhZyB0aGUgZHJhZyBtaXJyb3IgKGVsZW1lbnQgdW5kZXIgY3Vyc29yKSB3aXRoIHJvbGU6ICdwYWxldHRlJyB8ICdjYW52YXMnLlxyXG5cdFx0ICogV29ya3Mgd2l0aCBTb3J0YWJsZSdzIGZhbGxiYWNrIG1pcnJvciAoLnNvcnRhYmxlLWZhbGxiYWNrIC8gLnNvcnRhYmxlLWRyYWcpIGFuZCB3aXRoIHlvdXIgZHJhZ0NsYXNzXHJcblx0XHQgKiAoLndwYmNfYmZiX19kcmFnLWFjdGl2ZSkuXHJcblx0XHQgKi9cclxuXHRcdF90YWdfZHJhZ19taXJyb3IoIGV2dCApIHtcclxuXHRcdFx0Y29uc3QgZnJvbVBhbGV0dGUgPSB0aGlzLmJ1aWxkZXI/LnBhbGV0dGVfdWxzPy5pbmNsdWRlcz8uKCBldnQuZnJvbSApO1xyXG5cdFx0XHRjb25zdCByb2xlICAgICAgICA9IGZyb21QYWxldHRlID8gJ3BhbGV0dGUnIDogJ2NhbnZhcyc7XHJcblx0XHRcdC8vIFdhaXQgYSB0aWNrIHNvIHRoZSBtaXJyb3IgZXhpc3RzLiAgLSBUaGUgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgpIG1ldGhvZCB0ZWxscyB0aGUgYnJvd3NlciB5b3Ugd2lzaCB0byBwZXJmb3JtIGFuIGFuaW1hdGlvbi5cclxuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWlycm9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy5zb3J0YWJsZS1mYWxsYmFjaywgLnNvcnRhYmxlLWRyYWcsIC4nICsgdGhpcy5vcHRzLmRyYWdDbGFzcyApO1xuXHRcdFx0XHRpZiAoIG1pcnJvciApIHtcblx0XHRcdFx0XHRtaXJyb3Iuc2V0QXR0cmlidXRlKCAnZGF0YS1kcmFnLXJvbGUnLCByb2xlICk7XG5cdFx0XHRcdFx0bWlycm9yLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRfdG9nZ2xlX2RuZF9yb290X2ZsYWdzKCBhY3RpdmUsIGZyb21fcGFsZXR0ZSA9IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Ly8gc2V0IHRvIHJvb3QgZWxlbWVudCBvZiBhbiBIVE1MIGRvY3VtZW50LCB3aGljaCBpcyB0aGUgPGh0bWw+LlxyXG5cdFx0XHRjb25zdCByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5cdFx0XHRpZiAoIGFjdGl2ZSApIHtcclxuXHRcdFx0XHRyb290LmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9fZG5kLWFjdGl2ZScgKTtcclxuXHRcdFx0XHRpZiAoIGZyb21fcGFsZXR0ZSApIHtcclxuXHRcdFx0XHRcdHJvb3QuY2xhc3NMaXN0LmFkZCggJ3dwYmNfYmZiX19kcmFnLWZyb20tcGFsZXR0ZScgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cm9vdC5jbGFzc0xpc3QucmVtb3ZlKCAnd3BiY19iZmJfX2RuZC1hY3RpdmUnLCAnd3BiY19iZmJfX2RyYWctZnJvbS1wYWxldHRlJyApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5zdXJlIGEgc2ltcGxlIHZlcnRpY2FsIHNvcnRhYmxlIGxpc3QuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBjb25maWd1cmF0aW9uIGlzIGludGVuZGVkIGZvciBpbnNwZWN0b3Ivc2lkZWJhciBsaXN0cyBzdWNoIGFzOlxyXG5cdFx0ICogLSBkcm9wZG93biBjaG9pY2VzXHJcblx0XHQgKiAtIHJhZGlvIG9wdGlvbnNcclxuXHRcdCAqIC0gY2hlY2tib3ggb3B0aW9uc1xyXG5cdFx0ICpcclxuXHRcdCAqIEl0IGlzIGludGVudGlvbmFsbHkgbXVjaCBzaW1wbGVyIHRoYW4gdGhlIGNhbnZhcyBEbkQgY29uZmlnIGFuZCBkb2VzIG5vdFxyXG5cdFx0ICogdXNlIHRoZSBjb2x1bW4gZWRnZS1mZW5jZSAvIHN0aWNreS10YXJnZXQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIC0gU29ydGFibGUgbGlzdCBjb250YWluZXIuXHJcblx0XHQgKiBAcGFyYW0ge3sgaGFuZGxlX3NlbGVjdG9yPzogc3RyaW5nLCBkcmFnZ2FibGVfc2VsZWN0b3I/OiBzdHJpbmcsIG9uVXBkYXRlPzogRnVuY3Rpb24gfX0gW2hhbmRsZXJzPXt9XSAtXHJcblx0XHQgKiAgICAgT3B0aW9uYWwgaGFuZGxlcnMvc2VsZWN0b3JzLlxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdGVuc3VyZV9zaW1wbGVfbGlzdCggY29udGFpbmVyLCBoYW5kbGVycyA9IHt9ICkge1xyXG5cdFx0XHRpZiAoICEgY29udGFpbmVyIHx8IHR5cGVvZiBTb3J0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggU29ydGFibGUuZ2V0Py4oIGNvbnRhaW5lciApICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29tbW9uID0ge1xyXG5cdFx0XHRcdGFuaW1hdGlvbiAgICAgICAgOiB0aGlzLm9wdHMuYW5pbWF0aW9uLFxyXG5cdFx0XHRcdGdob3N0Q2xhc3MgICAgICAgOiB0aGlzLm9wdHMuZ2hvc3RDbGFzcyxcclxuXHRcdFx0XHRjaG9zZW5DbGFzcyAgICAgIDogdGhpcy5vcHRzLmNob3NlbkNsYXNzLFxyXG5cdFx0XHRcdGRyYWdDbGFzcyAgICAgICAgOiB0aGlzLm9wdHMuZHJhZ0NsYXNzLFxyXG5cdFx0XHRcdGZvcmNlRmFsbGJhY2sgICAgOiB0cnVlLFxyXG5cdFx0XHRcdC8vIEZvciBhIHNpbmdsZSBzY3JvbGxhYmxlIHNpZGViYXIgbGlzdCB0aGlzIGlzIHVzdWFsbHkgbW9yZSBzdGFibGUuXHJcblx0XHRcdFx0ZmFsbGJhY2tPbkJvZHkgICA6IGZhbHNlLFxyXG5cdFx0XHRcdGZhbGxiYWNrVG9sZXJhbmNlOiA4LFxyXG5cdFx0XHRcdHJlbW92ZUNsb25lT25IaWRlOiB0cnVlLFxyXG5cdFx0XHRcdG9uU3RhcnQgICAgICAgICAgOiAoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmJ1aWxkZXI/Ll9hZGRfZHJhZ2dpbmdfY2xhc3M/LigpO1xyXG5cdFx0XHRcdFx0dGhpcy5fdG9nZ2xlX2RuZF9yb290X2ZsYWdzKCB0cnVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0b25FbmQgICAgICAgICAgICA6ICgpID0+IHtcclxuXHRcdFx0XHRcdHNldFRpbWVvdXQoICgpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5idWlsZGVyPy5fcmVtb3ZlX2RyYWdnaW5nX2NsYXNzPy4oKTtcclxuXHRcdFx0XHRcdH0sIDUwICk7XHJcblx0XHRcdFx0XHR0aGlzLl90b2dnbGVfZG5kX3Jvb3RfZmxhZ3MoIGZhbHNlICk7XHJcblx0XHRcdFx0XHR0aGlzLl9jbGVhbnVwX2RyYWdfdWkoKTtcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0U29ydGFibGUuY3JlYXRlKFxyXG5cdFx0XHRcdGNvbnRhaW5lcixcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHQuLi5jb21tb24sXHJcblx0XHRcdFx0XHRncm91cCAgICAgICAgICAgICAgICAgIDogeyBuYW1lOiB0aGlzLm9wdHMuZ3JvdXBOYW1lLCBwdWxsOiBmYWxzZSwgcHV0OiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0c29ydCAgICAgICAgICAgICAgICAgICA6IHRydWUsXHJcblx0XHRcdFx0XHRkaXJlY3Rpb24gICAgICAgICAgICAgIDogJ3ZlcnRpY2FsJyxcclxuXHRcdFx0XHRcdGhhbmRsZSAgICAgICAgICAgICAgICAgOiBoYW5kbGVycy5oYW5kbGVfc2VsZWN0b3IgfHwgJy53cGJjX2JmYl9fZHJhZy1oYW5kbGUnLFxyXG5cdFx0XHRcdFx0ZHJhZ2dhYmxlICAgICAgICAgICAgICA6IGhhbmRsZXJzLmRyYWdnYWJsZV9zZWxlY3RvciB8fCAnLndwYmNfYmZiX19zb3J0YWJsZS1yb3cnLFxyXG5cdFx0XHRcdFx0ZmFsbGJhY2tDbGFzcyAgICAgICAgICA6ICd3cGJjX2JmYl9fc2ltcGxlX2xpc3RfZmFsbGJhY2snLFxyXG5cdFx0XHRcdFx0ZmlsdGVyICAgICAgICAgICAgICAgICA6IFtcclxuXHRcdFx0XHRcdFx0J2lucHV0JyxcclxuXHRcdFx0XHRcdFx0J3RleHRhcmVhJyxcclxuXHRcdFx0XHRcdFx0J3NlbGVjdCcsXHJcblx0XHRcdFx0XHRcdCdidXR0b24nLFxyXG5cdFx0XHRcdFx0XHQnYScsXHJcblx0XHRcdFx0XHRcdCcud3BiY19iZmJfX25vLWRyYWctem9uZScsXHJcblx0XHRcdFx0XHRcdCcud3BiY19iZmJfX25vLWRyYWctem9uZSAqJ1xyXG5cdFx0XHRcdFx0XS5qb2luKCAnLCcgKSxcclxuXHRcdFx0XHRcdHByZXZlbnRPbkZpbHRlciAgICAgICAgOiBmYWxzZSxcclxuXHRcdFx0XHRcdGludmVydFN3YXAgICAgICAgICAgICAgOiBmYWxzZSxcclxuXHRcdFx0XHRcdHN3YXBUaHJlc2hvbGQgICAgICAgICAgOiAwLjMwLFxyXG5cdFx0XHRcdFx0aW52ZXJ0ZWRTd2FwVGhyZXNob2xkICA6IDAuNjAsXHJcblx0XHRcdFx0XHRlbXB0eUluc2VydFRocmVzaG9sZCAgIDogOCxcclxuXHRcdFx0XHRcdGRyYWdvdmVyQnViYmxlICAgICAgICAgOiBmYWxzZSxcclxuXHRcdFx0XHRcdHNjcm9sbCAgICAgICAgICAgICAgICAgOiB0cnVlLFxyXG5cdFx0XHRcdFx0c2Nyb2xsU2Vuc2l0aXZpdHkgICAgICA6IDYwLFxyXG5cdFx0XHRcdFx0c2Nyb2xsU3BlZWQgICAgICAgICAgICA6IDE0LFxyXG5cdFx0XHRcdFx0b25VcGRhdGUgICAgICAgICAgICAgICA6IGhhbmRsZXJzLm9uVXBkYXRlIHx8IGZ1bmN0aW9uICgpIHt9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0dGhpcy5fY29udGFpbmVycy5hZGQoIGNvbnRhaW5lciApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuc3VyZSBTb3J0YWJsZSBpcyBhdHRhY2hlZCB0byBhIGNvbnRhaW5lciB3aXRoIHJvbGUgJ3BhbGV0dGUnIG9yICdjYW52YXMnLlxyXG5cdFx0ICpcclxuXHRcdCAqICAtLSBIYW5kbGUgc2VsZWN0b3JzOiBoYW5kbGU6ICAnLnNlY3Rpb24tZHJhZy1oYW5kbGUsIC53cGJjX2JmYl9fZHJhZy1oYW5kbGUsIC53cGJjX2JmYl9fZHJhZy1hbnl3aGVyZSxcclxuXHRcdCAqIFtkYXRhLWRyYWdnYWJsZT1cInRydWVcIl0nXHJcblx0XHQgKiAgLS0gRHJhZ2dhYmxlIGdhdGU6IGRyYWdnYWJsZSBmaWVsZHMsIHNlY3Rpb25zLCBhbmQgdGhlIHRyYW5zaWVudCBtZWFzdXJlZCBzb3VyY2Ugc3BhY2VyLlxuXHRcdCAqICAtLSBGaWx0ZXIgKG92ZXJsYXktc2FmZSk6ICAgICBpZ25vcmUgZXZlcnl0aGluZyBpbiBvdmVybGF5IGV4Y2VwdCB0aGUgaGFuZGxlIC1cclxuXHRcdCAqICcud3BiY19iZmJfX292ZXJsYXktY29udHJvbHNcclxuXHRcdCAqICo6bm90KC53cGJjX2JmYl9fZHJhZy1oYW5kbGUpOm5vdCguc2VjdGlvbi1kcmFnLWhhbmRsZSk6bm90KC53cGJjX2ljbl9kcmFnX2luZGljYXRvciknXHJcblx0XHQgKiAgLS0gTm8tZHJhZyB3cmFwcGVyOiAgICAgICAgICAgdXNlIC53cGJjX2JmYl9fbm8tZHJhZy16b25lIGluc2lkZSByZW5kZXJlcnMgZm9yIGlucHV0cy93aWRnZXRzLlxyXG5cdFx0ICogIC0tIEZvY3VzIGd1YXJkIChvcHRpb25hbCk6ICAgIGZsaXAgW2RhdGEtZHJhZ2dhYmxlXSBvbiBmb2N1c2luL2ZvY3Vzb3V0IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBkcmFncyB3aGlsZVxyXG5cdFx0ICogdHlwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFRoZSBlbGVtZW50IHRvIGVuaGFuY2Ugd2l0aCBTb3J0YWJsZS5cclxuXHRcdCAqIEBwYXJhbSB7J3BhbGV0dGUnfCdjYW52YXMnfSByb2xlIC0gQmVoYXZpb3IgcHJvZmlsZSB0byBhcHBseS5cclxuXHRcdCAqIEBwYXJhbSB7eyBvbkFkZD86IEZ1bmN0aW9uIH19IFtoYW5kbGVycz17fV0gLSBPcHRpb25hbCBoYW5kbGVycy5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRlbnN1cmUoIGNvbnRhaW5lciwgcm9sZSwgaGFuZGxlcnMgPSB7fSApIHtcclxuXHRcdFx0aWYgKCAhIGNvbnRhaW5lciB8fCB0eXBlb2YgU29ydGFibGUgPT09ICd1bmRlZmluZWQnICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIFNvcnRhYmxlLmdldD8uKCBjb250YWluZXIgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHNvcnRhYmxlX2tpbmQgPSBoYW5kbGVycy5zb3J0YWJsZV9raW5kIHx8ICcnO1xyXG5cclxuXHRcdFx0aWYgKCBzb3J0YWJsZV9raW5kID09PSAnc2ltcGxlX2xpc3QnICkge1xyXG5cdFx0XHRcdHRoaXMuZW5zdXJlX3NpbXBsZV9saXN0KCBjb250YWluZXIsIGhhbmRsZXJzICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjb21tb24gPSB7XHJcblx0XHRcdFx0YW5pbWF0aW9uICA6IHRoaXMub3B0cy5hbmltYXRpb24sXHJcblx0XHRcdFx0Z2hvc3RDbGFzcyA6IHRoaXMub3B0cy5naG9zdENsYXNzLFxyXG5cdFx0XHRcdGNob3NlbkNsYXNzOiB0aGlzLm9wdHMuY2hvc2VuQ2xhc3MsXHJcblx0XHRcdFx0ZHJhZ0NsYXNzICA6IHRoaXMub3B0cy5kcmFnQ2xhc3MsXHJcblx0XHRcdFx0Ly8gPT0gRWxlbWVudCB1bmRlciB0aGUgY3Vyc29yICA9PSBFbnN1cmUgd2UgZHJhZyBhIHJlYWwgRE9NIG1pcnJvciB5b3UgY2FuIHN0eWxlIHZpYSBDU1MgKGNyb3NzLWJyb3dzZXIpLlxyXG5cdFx0XHRcdGZvcmNlRmFsbGJhY2sgICAgOiB0cnVlLFxyXG5cdFx0XHRcdGZhbGxiYWNrT25Cb2R5ICAgOiB0cnVlLFxyXG5cdFx0XHRcdGZhbGxiYWNrVG9sZXJhbmNlOiA4LFxyXG5cdFx0XHRcdHJlbW92ZUNsb25lT25IaWRlOiB0cnVlLFxuXHRcdFx0XHRvbkNob29zZTogKGV2dCkgPT4gdGhpcy5fcHJlcGFyZV9kcmFnX3N0YXRlKCBldnQgKSxcblx0XHRcdFx0b25TdGFydCA6IChldnQpID0+IHRoaXMuX3N0YXJ0X2RyYWcoIGV2dCApLFxuXHRcdFx0XHRvbkVuZCAgIDogKCkgPT4gdGhpcy5fZmluaXNoX2RyYWcoKSxcblx0XHRcdFx0b25Nb3ZlICA6IChldnQsIG9yaWdpbmFsX2V2ZW50KSA9PiB0aGlzLl9hbGxvd19jYW52YXNfbW92ZSggZXZ0LCBvcmlnaW5hbF9ldmVudCApXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCByb2xlID09PSAncGFsZXR0ZScgKSB7XHJcblx0XHRcdFx0U29ydGFibGUuY3JlYXRlKCBjb250YWluZXIsIHtcclxuXHRcdFx0XHRcdC4uLmNvbW1vbixcclxuXHRcdFx0XHRcdGdyb3VwICAgOiB7IG5hbWU6IHRoaXMub3B0cy5ncm91cE5hbWUsIHB1bGw6ICdjbG9uZScsIHB1dDogZmFsc2UgfSxcclxuXHRcdFx0XHRcdHNvcnQgICAgOiBmYWxzZVxyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0XHR0aGlzLl9jb250YWluZXJzLmFkZCggY29udGFpbmVyICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyByb2xlID09PSAnY2FudmFzJy5cclxuXHRcdFx0U29ydGFibGUuY3JlYXRlKCBjb250YWluZXIsIHtcblx0XHRcdFx0Li4uY29tbW9uLFxuXHRcdFx0XHQvLyBTdGFibGUgaW5zZXJ0aW9uIGdlb21ldHJ5IGlzIHByZWZlcmFibGUgdG8gYW5pbWF0aW5nIGhpdC10ZXN0IHRhcmdldHMuXG5cdFx0XHRcdGFuaW1hdGlvbjogMCxcblx0XHRcdFx0Z3JvdXAgICAgOiB7XG5cdFx0XHRcdFx0bmFtZTogdGhpcy5vcHRzLmdyb3VwTmFtZSxcclxuXHRcdFx0XHRcdHB1bGw6IHRydWUsXHJcblx0XHRcdFx0XHRwdXQgOiAodG8sIGZyb20sIGRyYWdnZWRFbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZHJhZ2dlZEVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19maWVsZCcgKSB8fFxyXG5cdFx0XHRcdFx0XHRcdCAgIGRyYWdnZWRFbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vIC0tLS0tLS0tLS0gRG5EIEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIC8vIEdyYWIgYW55d2hlcmUgb24gZmllbGRzIHRoYXQgb3B0LWluIHdpdGggdGhlIGNsYXNzIG9yIGF0dHJpYnV0ZS4gIC0gU2VjdGlvbnMgc3RpbGwgcmVxdWlyZSB0aGVpciBkZWRpY2F0ZWQgaGFuZGxlLlxyXG5cdFx0XHRcdGhhbmRsZSAgIDogJy5zZWN0aW9uLWRyYWctaGFuZGxlLCAud3BiY19iZmJfX2RyYWctaGFuZGxlLCAud3BiY19iZmJfX2RyYWctYW55d2hlcmUsIFtkYXRhLWRyYWdnYWJsZT1cInRydWVcIl0nLFxyXG5cdFx0XHRcdC8vIFRoZSB0cmFuc2llbnQgc3BhY2VyIHBhcnRpY2lwYXRlcyBpbiBoaXQgdGVzdGluZyBidXQgbmV2ZXIgc2VyaWFsaXphdGlvbi5cblx0XHRcdFx0ZHJhZ2dhYmxlOiBbXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fZmllbGQ6bm90KFtkYXRhLWRyYWdnYWJsZT1cImZhbHNlXCJdKScsXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fc2VjdGlvbicsXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fZHJhZy1zb3VyY2Utc3BhY2VyJ1xuXHRcdFx0XHRdLmpvaW4oICcsICcgKSxcblx0XHRcdFx0Ly8gLS0tLS0tLS0tLSBGaWx0ZXJzIC0gTm8gRG5EIC0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLy8gRGVjbGFyYXRpdmUg4oCcbm8tZHJhZyB6b25lc+KAnTogYW55dGhpbmcgaW5zaWRlIHRoZXNlIHdyYXBwZXJzIHdvbuKAmXQgc3RhcnQgYSBkcmFnLlxyXG5cdFx0XHRcdGZpbHRlcjogW1xyXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fbm8tZHJhZy16b25lJyxcclxuXHRcdFx0XHRcdCcud3BiY19iZmJfX25vLWRyYWctem9uZSAqJyxcclxuXHRcdFx0XHRcdCcud3BiY19iZmJfX2NvbHVtbi1yZXNpemVyJywgIC8vIElnbm9yZSB0aGUgcmVzaXplciByYWlscyBkdXJpbmcgRG5EIChwcmV2ZW50cyBlZGdlIOKAnHNuYXDigJ0pLlxyXG5cdFx0XHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIG92ZXJsYXkgdG9vbGJhciwgYmxvY2sgZXZlcnl0aGluZyBFWENFUFQgdGhlIGRyYWcgaGFuZGxlIChhbmQgaXRzIGljb24pLlxyXG5cdFx0XHRcdFx0Jy53cGJjX2JmYl9fb3ZlcmxheS1jb250cm9scyAqOm5vdCgud3BiY19iZmJfX2RyYWctaGFuZGxlKTpub3QoLnNlY3Rpb24tZHJhZy1oYW5kbGUpOm5vdCgud3BiY19pY25fZHJhZ19pbmRpY2F0b3IpJ1xyXG5cdFx0XHRcdF0uam9pbiggJywnICksXHJcblx0XHRcdFx0cHJldmVudE9uRmlsdGVyICA6IGZhbHNlLFxyXG5cdFx0XHRcdFx0Ly8gLS0tLS0tLS0tLSBhbnRpLWppdHRlciB0dW5pbmcgLS0tLS0tLS0tLVxyXG5cdFx0XHRcdGRpcmVjdGlvbiAgICAgICAgICAgIDogJ3ZlcnRpY2FsJywgICAgICAgICAgIC8vIGNvbHVtbnMgYXJlIHZlcnRpY2FsIGxpc3RzLlxyXG5cdFx0XHRcdGludmVydFN3YXAgICAgICAgICAgIDogdHJ1ZSwgICAgICAgICAgICAgICAgIC8vIHVzZSBzd2FwIG9uIGludmVydGVkIG92ZXJsYXAuXHJcblx0XHRcdFx0c3dhcFRocmVzaG9sZCAgICAgICAgOiAwLjY1LCAgICAgICAgICAgICAgICAgLy8gYmUgbGVzcyBlYWdlciB0byBzd2FwLlxyXG5cdFx0XHRcdGludmVydGVkU3dhcFRocmVzaG9sZDogMC44NSwgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGVlcGVyIG92ZXJsYXAgd2hlbiBpbnZlcnRlZC5cclxuXHRcdFx0XHRlbXB0eUluc2VydFRocmVzaG9sZCA6IDI0LCAgICAgICAgICAgICAgICAgICAvLyBkb27igJl0IGp1bXAgaW50byBlbXB0eSBjb250YWluZXJzIHRvbyBlYXJseS5cclxuXHRcdFx0XHRkcmFnb3ZlckJ1YmJsZSAgICAgICA6IGZhbHNlLCAgICAgICAgICAgICAgICAvLyBrZWVwIGRyYWdvdmVyIGxvY2FsLlxyXG5cdFx0XHRcdHNjcm9sbCAgICAgICAgICAgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRzY3JvbGxTZW5zaXRpdml0eSAgICA6IDQwLFxyXG5cdFx0XHRcdHNjcm9sbFNwZWVkICAgICAgICAgIDogMTAsXG5cdFx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0XHQvLyBvbkFkZDogaGFuZGxlcnMub25BZGQgfHwgdGhpcy5idWlsZGVyLmhhbmRsZV9vbl9hZGQuYmluZCggdGhpcy5idWlsZGVyIClcclxuXHRcdFx0XHRvbkFkZDogKGV2dCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCB0aGlzLl9vbl9hZGRfc2VjdGlvbiggZXZ0ICkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrOiBvcmlnaW5hbCBoYW5kbGVyIGZvciBub3JtYWwgZmllbGRzLlxyXG5cdFx0XHRcdFx0KGhhbmRsZXJzLm9uQWRkIHx8IHRoaXMuYnVpbGRlci5oYW5kbGVfb25fYWRkLmJpbmQoIHRoaXMuYnVpbGRlciApKSggZXZ0ICk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvblVwZGF0ZTogKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZGVyLmJ1cz8uZW1pdD8uKCBDb3JlLldQQkNfQkZCX0V2ZW50cy5TVFJVQ1RVUkVfQ0hBTkdFLCB7IHJlYXNvbjogJ3NvcnQtdXBkYXRlJyB9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR0aGlzLl9jb250YWluZXJzLmFkZCggY29udGFpbmVyICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIYW5kbGUgYWRkaW5nL21vdmluZyBzZWN0aW9ucyB2aWEgU29ydGFibGUgb25BZGQuXHJcblx0XHQgKiBSZXR1cm5zIHRydWUgaWYgaGFuZGxlZCAoaS5lLiwgaXQgd2FzIGEgc2VjdGlvbiksIGZhbHNlIHRvIGxldCB0aGUgZGVmYXVsdCBmaWVsZCBoYW5kbGVyIHJ1bi5cclxuXHRcdCAqXHJcblx0XHQgKiAtIFBhbGV0dGUgLT4gY2FudmFzOiByZW1vdmUgdGhlIHBsYWNlaG9sZGVyIGNsb25lIGFuZCBidWlsZCBhIGZyZXNoIHNlY3Rpb24gdmlhIGFkZF9zZWN0aW9uKClcclxuXHRcdCAqIC0gQ2FudmFzIC0+IGNhbnZhczoga2VlcCB0aGUgbW92ZWQgRE9NIChhbmQgaXRzIGNoaWxkcmVuKSwganVzdCByZS13aXJlIG92ZXJsYXlzL3NvcnRhYmxlcy9tZXRhZGF0YVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7U29ydGFibGUuU29ydGFibGVFdmVudH0gZXZ0XHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0X29uX2FkZF9zZWN0aW9uKGV2dCkge1xyXG5cclxuXHRcdFx0Y29uc3QgaXRlbSA9IGV2dC5pdGVtO1xyXG5cdFx0XHRpZiAoICEgaXRlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElkZW50aWZ5IHNlY3Rpb25zIGJvdGggZnJvbSBwYWxldHRlIGl0ZW1zIChsaSBjbG9uZXMpIGFuZCByZWFsIGNhbnZhcyBub2Rlcy5cclxuXHRcdFx0Y29uc3QgZGF0YSAgICAgID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuZ2V0X2FsbF9kYXRhX2F0dHJpYnV0ZXMoIGl0ZW0gKTtcclxuXHRcdFx0Y29uc3QgaXNTZWN0aW9uID0gaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSB8fCAoZGF0YT8udHlwZSB8fCBpdGVtLmRhdGFzZXQ/LnR5cGUpID09PSAnc2VjdGlvbic7XHJcblxyXG5cdFx0XHRpZiAoICEgaXNTZWN0aW9uICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZnJvbVBhbGV0dGUgPSB0aGlzLmJ1aWxkZXI/LnBhbGV0dGVfdWxzPy5pbmNsdWRlcz8uKCBldnQuZnJvbSApID09PSB0cnVlO1xyXG5cclxuXHRcdFx0aWYgKCAhIGZyb21QYWxldHRlICkge1xyXG5cdFx0XHRcdC8vIENhbnZhcyAtPiBjYW52YXMgbW92ZTogRE8gTk9UIHJlYnVpbGQvcmVtb3ZlOyBwcmVzZXJ2ZSBjaGlsZHJlbi5cclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYWRkX292ZXJsYXlfdG9vbGJhcj8uKCBpdGVtICk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgb3ZlcmxheSBleGlzdHNcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfc2VjdGlvbnM/LmluaXRfYWxsX25lc3RlZF9zb3J0YWJsZXM/LiggaXRlbSApOyAvLyBlbnN1cmUgaW5uZXIgc29ydGFibGVzXHJcblxyXG5cdFx0XHRcdC8vIEVuc3VyZSBtZXRhZGF0YSBwcmVzZW50L3VwZGF0ZWRcclxuXHRcdFx0XHRpdGVtLmRhdGFzZXQudHlwZSAgICA9ICdzZWN0aW9uJztcclxuXHRcdFx0XHRjb25zdCBjb2xzICAgICAgICAgICA9IGl0ZW0ucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fcm93ID4gLndwYmNfYmZiX19jb2x1bW4nICkubGVuZ3RoIHx8IDE7XHJcblx0XHRcdFx0aXRlbS5kYXRhc2V0LmNvbHVtbnMgPSBTdHJpbmcoIGNvbHMgKTtcclxuXHJcblx0XHRcdFx0Ly8gU2VsZWN0ICYgbm90aWZ5IHN1YnNjcmliZXJzIChsYXlvdXQvbWluIGd1YXJkcywgZXRjLilcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuc2VsZWN0X2ZpZWxkPy4oIGl0ZW0gKTtcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYnVzPy5lbWl0Py4oIENvcmUuV1BCQ19CRkJfRXZlbnRzLlNUUlVDVFVSRV9DSEFOR0UsIHsgZWw6IGl0ZW0sIHJlYXNvbjogJ3NlY3Rpb24tbW92ZScgfSApO1xyXG5cdFx0XHRcdHRoaXMuYnVpbGRlci51c2FnZT8udXBkYXRlX3BhbGV0dGVfdWk/LigpO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlOyAvLyBoYW5kbGVkLlxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBQYWxldHRlIC0+IGNhbnZhczogYnVpbGQgYSBicmFuZC1uZXcgc2VjdGlvbiB1c2luZyB0aGUgc2FtZSBwYXRoIGFzIHRoZSBkcm9wZG93bi9tZW51XHJcblx0XHRcdGNvbnN0IHRvICAgPSBldnQudG8/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9fY29sdW1uLCAud3BiY19iZmJfX2Zvcm1fcHJldmlld19zZWN0aW9uX2NvbnRhaW5lcicgKSB8fCBldnQudG87XHJcblx0XHRcdGNvbnN0IGNvbHMgPSBwYXJzZUludCggZGF0YT8uY29sdW1ucyB8fCBpdGVtLmRhdGFzZXQuY29sdW1ucyB8fCAxLCAxMCApIHx8IDE7XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgdGhlIHBhbGV0dGUgY2xvbmUgcGxhY2Vob2xkZXIuXHJcblx0XHRcdGl0ZW0ucGFyZW50Tm9kZSAmJiBpdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGl0ZW0gKTtcclxuXHJcblx0XHRcdC8vIENyZWF0ZSB0aGUgcmVhbCBzZWN0aW9uLlxyXG5cdFx0XHR0aGlzLmJ1aWxkZXIucGFnZXNfc2VjdGlvbnMuYWRkX3NlY3Rpb24oIHRvLCBjb2xzICk7XHJcblxyXG5cdFx0XHQvLyBJbnNlcnQgYXQgdGhlIHByZWNpc2UgZHJvcCBpbmRleC5cclxuXHRcdFx0Y29uc3Qgc2VjdGlvbiA9IHRvLmxhc3RFbGVtZW50Q2hpbGQ7IC8vIGFkZF9zZWN0aW9uIGFwcGVuZHMgdG8gZW5kLlxyXG5cdFx0XHRpZiAoIGV2dC5uZXdJbmRleCAhPSBudWxsICYmIGV2dC5uZXdJbmRleCA8IHRvLmNoaWxkcmVuLmxlbmd0aCAtIDEgKSB7XHJcblx0XHRcdFx0Y29uc3QgcmVmID0gdG8uY2hpbGRyZW5bZXZ0Lm5ld0luZGV4XSB8fCBudWxsO1xyXG5cdFx0XHRcdHRvLmluc2VydEJlZm9yZSggc2VjdGlvbiwgcmVmICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZpbmFsaXplOiBvdmVybGF5LCBzZWxlY3Rpb24sIGV2ZW50cywgdXNhZ2UgcmVmcmVzaC5cclxuXHRcdFx0dGhpcy5idWlsZGVyLmFkZF9vdmVybGF5X3Rvb2xiYXI/Liggc2VjdGlvbiApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuc2VsZWN0X2ZpZWxkPy4oIHNlY3Rpb24gKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmJ1cz8uZW1pdD8uKCBDb3JlLldQQkNfQkZCX0V2ZW50cy5GSUVMRF9BREQsIHtcclxuXHRcdFx0XHRlbCA6IHNlY3Rpb24sXHJcblx0XHRcdFx0aWQgOiBzZWN0aW9uLmRhdGFzZXQuaWQsXHJcblx0XHRcdFx0dWlkOiBzZWN0aW9uLmRhdGFzZXQudWlkXHJcblx0XHRcdH0gKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLnVzYWdlPy51cGRhdGVfcGFsZXR0ZV91aT8uKCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlc3Ryb3kgYWxsIFNvcnRhYmxlIGluc3RhbmNlcyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0ZGVzdHJveUFsbCgpIHtcclxuXHRcdFx0dGhpcy5fY29udGFpbmVycy5mb3JFYWNoKCAoIGVsICkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGluc3QgPSBTb3J0YWJsZS5nZXQ/LiggZWwgKTtcclxuXHRcdFx0XHRpZiAoIGluc3QgKSB7XHJcblx0XHRcdFx0XHRpbnN0LmRlc3Ryb3koKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0dGhpcy5fY29udGFpbmVycy5jbGVhcigpO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNtYWxsIERPTSBjb250cmFjdCBhbmQgcmVuZGVyZXIgaGVscGVyXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7UmVhZG9ubHk8e1xyXG5cdCAqICAgICAgICAgICAgICAgICAgU0VMRUNUT1JTOiB7cGFnZVBhbmVsOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIHZhbGlkRmllbGQ6IHN0cmluZywgc2VjdGlvbjogc3RyaW5nLCBjb2x1bW46XHJcblx0ICogICAgIHN0cmluZywgcm93OiBzdHJpbmcsIG92ZXJsYXk6IHN0cmluZ30sIENMQVNTRVM6IHtzZWxlY3RlZDogc3RyaW5nfSwgQVRUUjoge2lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgaHRtbElkOlxyXG5cdCAqICAgICBzdHJpbmcsIHVzYWdlS2V5OiBzdHJpbmcsIHVpZDogc3RyaW5nfX1cclxuXHQgKiAgICAgICAgPn1cclxuXHQgKi9cclxuXHRDb3JlLldQQkNfQkZCX0RPTSA9IE9iamVjdC5mcmVlemUoIHtcclxuXHRcdFNFTEVDVE9SUzoge1xyXG5cdFx0XHRwYWdlUGFuZWwgOiAnLndwYmNfYmZiX19wYW5lbC0tcHJldmlldycsXHJcblx0XHRcdGZpZWxkICAgICA6ICcud3BiY19iZmJfX2ZpZWxkJyxcclxuXHRcdFx0dmFsaWRGaWVsZDogJy53cGJjX2JmYl9fZmllbGQ6bm90KC5pcy1pbnZhbGlkKScsXHJcblx0XHRcdHNlY3Rpb24gICA6ICcud3BiY19iZmJfX3NlY3Rpb24nLFxyXG5cdFx0XHRjb2x1bW4gICAgOiAnLndwYmNfYmZiX19jb2x1bW4nLFxyXG5cdFx0XHRyb3cgICAgICAgOiAnLndwYmNfYmZiX19yb3cnLFxyXG5cdFx0XHRvdmVybGF5ICAgOiAnLndwYmNfYmZiX19vdmVybGF5LWNvbnRyb2xzJ1xyXG5cdFx0fSxcclxuXHRcdENMQVNTRVMgIDoge1xyXG5cdFx0XHRzZWxlY3RlZDogJ2lzLXNlbGVjdGVkJ1xyXG5cdFx0fSxcclxuXHRcdEFUVFIgICAgIDoge1xyXG5cdFx0XHRpZCAgICAgIDogJ2RhdGEtaWQnLFxyXG5cdFx0XHRuYW1lICAgIDogJ2RhdGEtbmFtZScsXHJcblx0XHRcdGh0bWxJZCAgOiAnZGF0YS1odG1sX2lkJyxcclxuXHRcdFx0dXNhZ2VLZXk6ICdkYXRhLXVzYWdlX2tleScsXHJcblx0XHRcdHVpZCAgICAgOiAnZGF0YS11aWQnXHJcblx0XHR9XHJcblx0fSApO1xyXG5cclxuXHRDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlciA9IGNsYXNzIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENyZWF0ZSBhbiBIVE1MIGVsZW1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHRhZyAtIEhUTUwgdGFnIG5hbWUuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXNzX25hbWU9JyddIC0gT3B0aW9uYWwgQ1NTIGNsYXNzIG5hbWUuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gW2lubmVyX2h0bWw9JyddIC0gT3B0aW9uYWwgaW5uZXJIVE1MLlxyXG5cdFx0ICogQHJldHVybnMge0hUTUxFbGVtZW50fSBDcmVhdGVkIGVsZW1lbnQuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBjcmVhdGVfZWxlbWVudCggdGFnLCBjbGFzc19uYW1lID0gJycsIGlubmVyX2h0bWwgPSAnJyApIHtcclxuXHRcdFx0Y29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWcgKTtcclxuXHRcdFx0aWYgKCBjbGFzc19uYW1lICkge1xyXG5cdFx0XHRcdGVsLmNsYXNzTmFtZSA9IGNsYXNzX25hbWU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpbm5lcl9odG1sICkge1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9IGlubmVyX2h0bWw7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGVsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IG11bHRpcGxlIGBkYXRhLSpgIGF0dHJpYnV0ZXMgb24gYSBnaXZlbiBlbGVtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gVGFyZ2V0IGVsZW1lbnQuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YV9vYmogLSBLZXktdmFsdWUgcGFpcnMgZm9yIGRhdGEgYXR0cmlidXRlcy5cclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgc2V0X2RhdGFfYXR0cmlidXRlcyggZWwsIGRhdGFfb2JqICkge1xyXG5cdFx0XHRPYmplY3QuZW50cmllcyggZGF0YV9vYmogKS5mb3JFYWNoKCAoIFsga2V5LCB2YWwgXSApID0+IHtcclxuXHRcdFx0XHQvLyBQcmV2aW91c2x5OiAyMDI1LTA5LTAxIDE3OjA5OlxyXG5cdFx0XHRcdC8vIGNvbnN0IHZhbHVlID0gKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSA/IEpTT04uc3RyaW5naWZ5KCB2YWwgKSA6IHZhbDtcclxuXHRcdFx0XHQvL05ldzpcclxuXHRcdFx0XHRsZXQgdmFsdWU7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KCB2YWwgKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2gge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtJyArIGtleSwgdmFsdWUgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGFsbCBgZGF0YS0qYCBhdHRyaWJ1dGVzIGZyb20gYW4gZWxlbWVudCBhbmQgcGFyc2UgSlNPTiB3aGVyZSBwb3NzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIEVsZW1lbnQgdG8gZXh0cmFjdCBkYXRhIGZyb20uXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fSBQYXJzZWQga2V5LXZhbHVlIG1hcCBvZiBkYXRhIGF0dHJpYnV0ZXMuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfYWxsX2RhdGFfYXR0cmlidXRlcyggZWwgKSB7XHJcblx0XHRcdGNvbnN0IGRhdGEgPSB7fTtcclxuXHJcblx0XHRcdGlmICggISBlbCB8fCAhIGVsLmF0dHJpYnV0ZXMgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGRhdGE7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdEFycmF5LmZyb20oIGVsLmF0dHJpYnV0ZXMgKS5mb3JFYWNoKFxyXG5cdFx0XHRcdCggYXR0ciApID0+IHtcclxuXHRcdFx0XHRcdGlmICggYXR0ci5uYW1lLnN0YXJ0c1dpdGgoICdkYXRhLScgKSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qga2V5ID0gYXR0ci5uYW1lLnJlcGxhY2UoIC9eZGF0YS0vLCAnJyApO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGFba2V5XSA9IEpTT04ucGFyc2UoIGF0dHIudmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YVtrZXldID0gYXR0ci52YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIE9ubHkgZGVmYXVsdCB0aGUgbGFiZWwgaWYgaXQncyB0cnVseSBhYnNlbnQgKHVuZGVmaW5lZC9udWxsKSwgbm90IHdoZW4gaXQncyBhbiBlbXB0eSBzdHJpbmcuXHJcblx0XHRcdGNvbnN0IGhhc0V4cGxpY2l0TGFiZWwgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRhdGEsICdsYWJlbCcgKTtcclxuXHRcdFx0aWYgKCAhIGhhc0V4cGxpY2l0TGFiZWwgJiYgZGF0YS5pZCApIHtcclxuXHRcdFx0XHRkYXRhLmxhYmVsID0gZGF0YS5pZC5jaGFyQXQoIDAgKS50b1VwcGVyQ2FzZSgpICsgZGF0YS5pZC5zbGljZSggMSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlciBhIHNpbXBsZSBsYWJlbCArIHR5cGUgcHJldmlldyAodXNlZCBmb3IgdW5rbm93biBvciBmYWxsYmFjayBmaWVsZHMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZF9kYXRhIC0gRmllbGQgZGF0YSBvYmplY3QuXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfSBIVE1MIGNvbnRlbnQuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyByZW5kZXJfZmllbGRfaW5uZXJfaHRtbCggZmllbGRfZGF0YSApIHtcclxuXHRcdFx0Ly8gTWFrZSB0aGUgZmFsbGJhY2sgcHJldmlldyByZXNwZWN0IGFuIGVtcHR5IGxhYmVsLlxyXG5cdFx0XHRjb25zdCBoYXNMYWJlbCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZmllbGRfZGF0YSwgJ2xhYmVsJyApO1xyXG5cdFx0XHRjb25zdCBsYWJlbCAgICA9IGhhc0xhYmVsID8gU3RyaW5nKCBmaWVsZF9kYXRhLmxhYmVsICkgOiBTdHJpbmcoIGZpZWxkX2RhdGEuaWQgfHwgJyhubyBsYWJlbCknICk7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlICAgICAgICA9IFN0cmluZyggZmllbGRfZGF0YS50eXBlIHx8ICd1bmtub3duJyApO1xyXG5cdFx0XHRjb25zdCBpc19yZXF1aXJlZCA9IGZpZWxkX2RhdGEucmVxdWlyZWQgPT09IHRydWUgfHwgZmllbGRfZGF0YS5yZXF1aXJlZCA9PT0gJ3RydWUnIHx8IGZpZWxkX2RhdGEucmVxdWlyZWQgPT09IDEgfHwgZmllbGRfZGF0YS5yZXF1aXJlZCA9PT0gJzEnO1xyXG5cclxuXHRcdFx0Y29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcGFuTGFiZWwgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnc3BhbicgKTtcclxuXHRcdFx0c3BhbkxhYmVsLmNsYXNzTmFtZSAgID0gJ3dwYmNfYmZiX19maWVsZC1sYWJlbCc7XHJcblx0XHRcdHNwYW5MYWJlbC50ZXh0Q29udGVudCA9IGxhYmVsICsgKGlzX3JlcXVpcmVkID8gJyAqJyA6ICcnKTtcclxuXHRcdFx0d3JhcHBlci5hcHBlbmRDaGlsZCggc3BhbkxhYmVsICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcGFuVHlwZSAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzcGFuJyApO1xyXG5cdFx0XHRzcGFuVHlwZS5jbGFzc05hbWUgICA9ICd3cGJjX2JmYl9fZmllbGQtdHlwZSc7XHJcblx0XHRcdHNwYW5UeXBlLnRleHRDb250ZW50ID0gdHlwZTtcclxuXHRcdFx0d3JhcHBlci5hcHBlbmRDaGlsZCggc3BhblR5cGUgKTtcclxuXHJcblx0XHRcdHJldHVybiB3cmFwcGVyLmlubmVySFRNTDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlYm91bmNlIGEgZnVuY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBGdW5jdGlvbiB0byBkZWJvdW5jZS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IC0gRGVsYXkgaW4gbXMuXHJcblx0XHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IERlYm91bmNlZCBmdW5jdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGRlYm91bmNlKCBmbiwgd2FpdCA9IDEyMCApIHtcclxuXHRcdFx0bGV0IHQgPSBudWxsO1xyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gZGVib3VuY2VkKCAuLi5hcmdzICkge1xyXG5cdFx0XHRcdGlmICggdCApIHtcclxuXHRcdFx0XHRcdGNsZWFyVGltZW91dCggdCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0ID0gc2V0VGltZW91dCggKCkgPT4gZm4uYXBwbHkoIHRoaXMsIGFyZ3MgKSwgd2FpdCApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHQvLyBSZW5kZXJlciByZWdpc3RyeS4gQWxsb3dzIGxhdGUgcmVnaXN0cmF0aW9uIGFuZCBhdm9pZHMgdGlnaHQgY291cGxpbmcgdG8gYSBnbG9iYWwgbWFwLlxyXG5cdENvcmUuV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xyXG5cdFx0Y29uc3QgbWFwID0gbmV3IE1hcCgpO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0cmVnaXN0ZXIoIHR5cGUsIENsYXNzUmVmICkge1xyXG5cdFx0XHRcdG1hcC5zZXQoIFN0cmluZyggdHlwZSApLCBDbGFzc1JlZiApO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRnZXQoIHR5cGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1hcC5nZXQoIFN0cmluZyggdHlwZSApICk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSkoKTtcclxuXHJcbn0oIHdpbmRvdyApKTtcclxuIiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fb3V0L2NvcmUvYmZiLWZpZWxkcy5qcyA9PSB8IDIwMjUtMDktMTAgMTU6NDdcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbihmdW5jdGlvbiAoIHcgKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHQvLyBTaW5nbGUgZ2xvYmFsIG5hbWVzcGFjZSAoaWRlbXBvdGVudCAmIGxvYWQtb3JkZXIgc2FmZSkuXHJcblx0Y29uc3QgQ29yZSA9ICggdy5XUEJDX0JGQl9Db3JlID0gdy5XUEJDX0JGQl9Db3JlIHx8IHt9ICk7XHJcblx0Y29uc3QgVUkgICA9ICggQ29yZS5VSSA9IENvcmUuVUkgfHwge30gKTtcclxuXHJcblx0LyoqXHJcblx0ICogQmFzZSBjbGFzcyBmb3IgZmllbGQgcmVuZGVyZXJzIChzdGF0aWMtb25seSBjb250cmFjdCkuXHJcblx0ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdCAqIENvbnRyYWN0IGV4cG9zZWQgdG8gdGhlIGJ1aWxkZXIgKHN0YXRpYyBtZXRob2RzIG9uIHRoZSBDTEFTUyBpdHNlbGYpOlxyXG5cdCAqICAgLSByZW5kZXIoZWwsIGRhdGEsIGN0eCkgICAgICAgICAgICAgIC8vIFJFUVVJUkVEXHJcblx0ICogICAtIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIG1ldGEpICAgICAgLy8gT1BUSU9OQUwgKGRlZmF1bHQgcHJvdmlkZWQpXHJcblx0ICpcclxuXHQgKiBIZWxwZXJzIGZvciBzdWJjbGFzc2VzOlxyXG5cdCAqICAgLSBnZXRfZGVmYXVsdHMoKSAgICAgLT4gcGVyLWZpZWxkIGRlZmF1bHRzIChNVVNUIG92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHNldCB0eXBlL2xhYmVsKVxyXG5cdCAqICAgLSBub3JtYWxpemVfZGF0YShkKSAgLT4gc2hhbGxvdyBtZXJnZSB3aXRoIGRlZmF1bHRzXHJcblx0ICogICAtIGdldF90ZW1wbGF0ZShpZCkgICAtPiBwZXItaWQgY2FjaGVkIHdwLnRlbXBsYXRlIGNvbXBpbGVyXHJcblx0ICpcclxuXHQgKiBTdWJjbGFzcyB1c2FnZTpcclxuXHQgKiAgIGNsYXNzIFdQQkNfQkZCX0ZpZWxkX1RleHQgZXh0ZW5kcyBDb3JlLldQQkNfQkZCX0ZpZWxkX0Jhc2UgeyBzdGF0aWMgZ2V0X2RlZmF1bHRzKCl7IC4uLiB9IH1cclxuXHQgKiAgIFdQQkNfQkZCX0ZpZWxkX1RleHQudGVtcGxhdGVfaWQgPSAnd3BiYy1iZmItZmllbGQtdGV4dCc7XHJcblx0ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdCAqL1xyXG5cdENvcmUuV1BCQ19CRkJfRmllbGRfQmFzZSA9IGNsYXNzIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmF1bHQgZmllbGQgZGF0YSAoZ2VuZXJpYyBiYXNlbGluZSkuXHJcblx0XHQgKiBTdWJjbGFzc2VzIE1VU1Qgb3ZlcnJpZGUgdG8gcHJvdmlkZSB7IHR5cGUsIGxhYmVsIH0gYXBwcm9wcmlhdGUgZm9yIHRoZSBmaWVsZC5cclxuXHRcdCAqIEByZXR1cm5zIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfZGVmYXVsdHMoKSB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgOiAnZmllbGQnLFxyXG5cdFx0XHRcdGxhYmVsICAgICAgIDogJ0ZpZWxkJyxcclxuXHRcdFx0XHRuYW1lICAgICAgICA6ICdmaWVsZCcsXHJcblx0XHRcdFx0aHRtbF9pZCAgICAgOiAnJyxcclxuXHRcdFx0XHRwbGFjZWhvbGRlciA6ICcnLFxyXG5cdFx0XHRcdHJlcXVpcmVkICAgIDogZmFsc2UsXHJcblx0XHRcdFx0bWlubGVuZ3RoICAgOiAnJyxcclxuXHRcdFx0XHRtYXhsZW5ndGggICA6ICcnLFxyXG5cdFx0XHRcdHBhdHRlcm4gICAgIDogJycsXHJcblx0XHRcdFx0Y3NzY2xhc3MgICAgOiAnJyxcclxuXHRcdFx0XHRoZWxwICAgICAgICA6ICcnXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaGFsbG93LW1lcmdlIGluY29taW5nIGRhdGEgd2l0aCBkZWZhdWx0cy5cclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgbm9ybWFsaXplX2RhdGEoIGRhdGEgKSB7XHJcblx0XHRcdHZhciBkICAgICAgICA9IGRhdGEgfHwge307XHJcblx0XHRcdHZhciBkZWZhdWx0cyA9IHRoaXMuZ2V0X2RlZmF1bHRzKCk7XHJcblx0XHRcdHZhciBvdXQgICAgICA9IHt9O1xyXG5cdFx0XHR2YXIgaztcclxuXHJcblx0XHRcdGZvciAoIGsgaW4gZGVmYXVsdHMgKSB7XHJcblx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRlZmF1bHRzLCBrICkgKSB7XHJcblx0XHRcdFx0XHRvdXRba10gPSBkZWZhdWx0c1trXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Zm9yICggayBpbiBkICkge1xyXG5cdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBkLCBrICkgKSB7XHJcblx0XHRcdFx0XHRvdXRba10gPSBkW2tdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gb3V0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29tcGlsZSBhbmQgY2FjaGUgYSB3cC50ZW1wbGF0ZSBieSBpZCAocGVyLWlkIGNhY2hlKS5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZV9pZFxyXG5cdFx0ICogQHJldHVybnMge0Z1bmN0aW9ufG51bGx9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfdGVtcGxhdGUodGVtcGxhdGVfaWQpIHtcclxuXHJcblx0XHRcdC8vIEFjY2VwdCBlaXRoZXIgXCJ3cGJjLWJmYi1maWVsZC10ZXh0XCIgb3IgXCJ0bXBsLXdwYmMtYmZiLWZpZWxkLXRleHRcIi5cclxuXHRcdFx0aWYgKCAhIHRlbXBsYXRlX2lkIHx8ICEgd2luZG93LndwIHx8ICEgd3AudGVtcGxhdGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgZG9tSWQgPSB0ZW1wbGF0ZV9pZC5zdGFydHNXaXRoKCAndG1wbC0nICkgPyB0ZW1wbGF0ZV9pZCA6ICgndG1wbC0nICsgdGVtcGxhdGVfaWQpO1xyXG5cdFx0XHRpZiAoICEgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGRvbUlkICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggISBDb3JlLl9fYmZiX3RwbF9jYWNoZV9tYXAgKSB7XHJcblx0XHRcdFx0Q29yZS5fX2JmYl90cGxfY2FjaGVfbWFwID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSBpZCBmb3IgdGhlIGNvbXBpbGVyICYgY2FjaGUuIC8vIHdwLnRlbXBsYXRlIGV4cGVjdHMgaWQgV0lUSE9VVCB0aGUgXCJ0bXBsLVwiIHByZWZpeCAhXHJcblx0XHRcdGNvbnN0IGtleSA9IHRlbXBsYXRlX2lkLnJlcGxhY2UoIC9edG1wbC0vLCAnJyApO1xyXG5cdFx0XHRpZiAoIENvcmUuX19iZmJfdHBsX2NhY2hlX21hcFtrZXldICkge1xyXG5cdFx0XHRcdHJldHVybiBDb3JlLl9fYmZiX3RwbF9jYWNoZV9tYXBba2V5XTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29tcGlsZXIgPSB3cC50ZW1wbGF0ZSgga2V5ICk7ICAgICAvLyA8LS0gbm9ybWFsaXplZCBpZCBoZXJlXHJcblx0XHRcdGlmICggY29tcGlsZXIgKSB7XHJcblx0XHRcdFx0Q29yZS5fX2JmYl90cGxfY2FjaGVfbWFwW2tleV0gPSBjb21waWxlcjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvbXBpbGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUkVRVUlSRUQ6IHJlbmRlciBwcmV2aWV3IGludG8gaG9zdCBlbGVtZW50IChmdWxsIHJlZHJhdzsgaWRlbXBvdGVudCkuXHJcblx0XHQgKiBTdWJjbGFzc2VzIHNob3VsZCBzZXQgc3RhdGljIGB0ZW1wbGF0ZV9pZGAgdG8gYSB2YWxpZCB3cC50ZW1wbGF0ZSBpZC5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBkYXRhXHJcblx0XHQgKiBAcGFyYW0ge3ttb2RlPzpzdHJpbmcsYnVpbGRlcj86YW55LHRwbD86RnVuY3Rpb24sc2FuaXQ/OmFueX19IGN0eFxyXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyByZW5kZXIoIGVsLCBkYXRhLCBjdHggKSB7XHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBjb21waWxlID0gdGhpcy5nZXRfdGVtcGxhdGUoIHRoaXMudGVtcGxhdGVfaWQgKTtcclxuXHRcdFx0dmFyIGQgICAgICAgPSB0aGlzLm5vcm1hbGl6ZV9kYXRhKCBkYXRhICk7XHJcblxyXG5cdFx0XHR2YXIgcyA9IChjdHggJiYgY3R4LnNhbml0KSA/IGN0eC5zYW5pdCA6IENvcmUuV1BCQ19CRkJfU2FuaXRpemU7XHJcblxyXG5cdFx0XHQvLyBTYW5pdGl6ZSBjcml0aWNhbCBhdHRyaWJ1dGVzIGJlZm9yZSB0ZW1wbGF0aW5nLlxyXG5cdFx0XHRpZiAoIHMgKSB7XHJcblx0XHRcdFx0ZC5odG1sX2lkID0gZC5odG1sX2lkID8gcy5zYW5pdGl6ZV9odG1sX2lkKCBTdHJpbmcoIGQuaHRtbF9pZCApICkgOiAnJztcclxuXHRcdFx0XHRkLm5hbWUgICAgPSBzLnNhbml0aXplX2h0bWxfbmFtZSggU3RyaW5nKCBkLm5hbWUgfHwgZC5pZCB8fCAnZmllbGQnICkgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRkLmh0bWxfaWQgPSBkLmh0bWxfaWQgPyBTdHJpbmcoIGQuaHRtbF9pZCApIDogJyc7XHJcblx0XHRcdFx0ZC5uYW1lICAgID0gU3RyaW5nKCBkLm5hbWUgfHwgZC5pZCB8fCAnZmllbGQnICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZhbGwgYmFjayB0byBnZW5lcmljIHByZXZpZXcgaWYgdGVtcGxhdGUgbm90IGF2YWlsYWJsZS5cclxuXHRcdFx0aWYgKCBjb21waWxlICkge1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9IGNvbXBpbGUoIGQgKTtcclxuXHJcblx0XHRcdFx0Ly8gQWZ0ZXIgcmVuZGVyLCBzZXQgYXR0cmlidXRlIHZhbHVlcyB2aWEgRE9NIHNvIHF1b3Rlcy9uZXdsaW5lcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuXHJcblx0XHRcdFx0Y29uc3QgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnICk7XHJcblx0XHRcdFx0aWYgKCBpbnB1dCApIHtcclxuXHRcdFx0XHRcdGlmICggZC5wbGFjZWhvbGRlciAhPSBudWxsICkgaW5wdXQuc2V0QXR0cmlidXRlKCAncGxhY2Vob2xkZXInLCBTdHJpbmcoIGQucGxhY2Vob2xkZXIgKSApO1xyXG5cdFx0XHRcdFx0aWYgKCBkLnRpdGxlICE9IG51bGwgKSBpbnB1dC5zZXRBdHRyaWJ1dGUoICd0aXRsZScsIFN0cmluZyggZC50aXRsZSApICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRlbC5pbm5lckhUTUwgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5yZW5kZXJfZmllbGRfaW5uZXJfaHRtbCggZCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbC5kYXRhc2V0LnR5cGUgPSBkLnR5cGUgfHwgJ2ZpZWxkJztcclxuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcsIChkLmxhYmVsICE9IG51bGwgPyBTdHJpbmcoIGQubGFiZWwgKSA6ICcnKSApOyAvLyBhbGxvdyBcIlwiLlxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9QVElPTkFMIGhvb2sgZXhlY3V0ZWQgYWZ0ZXIgZmllbGQgaXMgZHJvcHBlZC9sb2FkZWQvcHJldmlldy5cclxuXHRcdCAqIERlZmF1bHQgZXh0ZW5kZWQ6XHJcblx0XHQgKiAtIE9uIGZpcnN0IGRyb3A6IHN0YW1wIGRlZmF1bHQgbGFiZWwgKGV4aXN0aW5nIGJlaGF2aW9yKSBhbmQgbWFyayBmaWVsZCBhcyBcImZyZXNoXCIgZm9yIGF1dG8tbmFtZS5cclxuXHRcdCAqIC0gT24gbG9hZDogbWFyayBhcyBsb2FkZWQgc28gbGF0ZXIgbGFiZWwgZWRpdHMgZG8gbm90IHJlbmFtZSB0aGUgc2F2ZWQgbmFtZS5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIG1ldGEpIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSAobWV0YSAmJiBtZXRhLmNvbnRleHQpID8gU3RyaW5nKCBtZXRhLmNvbnRleHQgKSA6ICcnO1xyXG5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Ly8gTkVXOiBTZWVkIGRlZmF1bHQgXCJoZWxwXCIgKGFuZCBrZWVwIGl0IGluIFN0cnVjdHVyZSkgZm9yIGFsbCBmaWVsZCBwYWNrcyB0aGF0IGRlZmluZSBpdC5cclxuXHRcdFx0Ly8gVGhpcyBmaXhlcyB0aGUgbWlzbWF0Y2ggd2hlcmU6XHJcblx0XHRcdC8vICAgLSBVSSBzaG93cyBkZWZhdWx0IGhlbHAgdmlhIG5vcm1hbGl6ZV9kYXRhKCkgLyB0ZW1wbGF0ZXNcclxuXHRcdFx0Ly8gICAtIGJ1dCBnZXRfc3RydWN0dXJlKCkgLyBleHBvcnRlcnMgc2VlIGBoZWxwYCBhcyB1bmRlZmluZWQvZW1wdHkuXHJcblx0XHRcdC8vXHJcblx0XHRcdC8vIEJlaGF2aW9yOlxyXG5cdFx0XHQvLyAgIC0gUnVucyBPTkxZIG9uIGluaXRpYWwgZHJvcCAoY29udGV4dCA9PT0gJ2Ryb3AnKS5cclxuXHRcdFx0Ly8gICAtIElmIGdldF9kZWZhdWx0cygpIGV4cG9zZXMgYSBub24tZW1wdHkgXCJoZWxwXCIsIGFuZCBkYXRhLmhlbHAgaXNcclxuXHRcdFx0Ly8gICAgIG1pc3NpbmcgLyBudWxsIC8gZW1wdHkgc3RyaW5nIC0+IHdlIHBlcnNpc3QgdGhlIGRlZmF1bHQgaW50byBgZGF0YWBcclxuXHRcdFx0Ly8gICAgIGFuZCBub3RpZnkgU3RydWN0dXJlIHNvIGV4cG9ydHMgc2VlIGl0LlxyXG5cdFx0XHQvLyAgIC0gT24gXCJsb2FkXCIgd2UgZG8gbm90aGluZywgc28gZXhpc3RpbmcgZm9ybXMgd2hlcmUgdXNlciAqY2xlYXJlZCpcclxuXHRcdFx0Ly8gICAgIGhlbHAgd2lsbCBub3QgYmUgb3ZlcnJpZGRlbi5cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0aWYgKCBjb250ZXh0ID09PSAnZHJvcCcgJiYgZGF0YSApIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGVmcyA9ICh0eXBlb2YgdGhpcy5nZXRfZGVmYXVsdHMgPT09ICdmdW5jdGlvbicpID8gdGhpcy5nZXRfZGVmYXVsdHMoKSA6IG51bGw7XHJcblx0XHRcdFx0XHRpZiAoIGRlZnMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBkZWZzLCAnaGVscCcgKSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudCAgICA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZGF0YSwgJ2hlbHAnICkgPyBkYXRhLmhlbHAgOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGhhc1ZhbHVlICAgPSAoY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnQgIT09IG51bGwgJiYgU3RyaW5nKCBjdXJyZW50ICkgIT09ICcnKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbCA9IGRlZnMuaGVscDtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggISBoYXNWYWx1ZSAmJiBkZWZhdWx0VmFsICE9IG51bGwgJiYgU3RyaW5nKCBkZWZhdWx0VmFsICkgIT09ICcnICkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIDEpIHBlcnNpc3QgaW50byBkYXRhIG9iamVjdCAodXNlZCBieSBTdHJ1Y3R1cmUpLlxyXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVscCA9IGRlZmF1bHRWYWw7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIDIpIG1pcnJvciBpbnRvIGRhdGFzZXQgKGZvciBhbnkgRE9NLWJhc2VkIGNvbnN1bWVycykuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBlbCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsLmRhdGFzZXQuaGVscCA9IFN0cmluZyggZGVmYXVsdFZhbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIDMpIG5vdGlmeSBTdHJ1Y3R1cmUgLyBsaXN0ZW5lcnMgKGlmIGF2YWlsYWJsZSkuXHJcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRDb3JlLlN0cnVjdHVyZT8udXBkYXRlX2ZpZWxkX3Byb3A/LiggZWwsICdoZWxwJywgZGVmYXVsdFZhbCApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5kaXNwYXRjaEV2ZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHsgYnViYmxlczogdHJ1ZSwgZGV0YWlsIDogeyBrZXk6ICdoZWxwJywgdmFsdWU6IGRlZmF1bHRWYWwgfSB9IClcclxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBfaW5uZXIgKSB7fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHt9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0XHRcdGlmICggY29udGV4dCA9PT0gJ2Ryb3AnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRhdGEsICdsYWJlbCcgKSApIHtcclxuXHRcdFx0XHRjb25zdCBkZWZzID0gdGhpcy5nZXRfZGVmYXVsdHMoKTtcclxuXHRcdFx0XHRkYXRhLmxhYmVsID0gZGVmcy5sYWJlbCB8fCAnRmllbGQnO1xyXG5cdFx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtbGFiZWwnLCBkYXRhLmxhYmVsICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gTWFyayBwcm92ZW5hbmNlIGZsYWdzLlxyXG5cdFx0XHRpZiAoIGNvbnRleHQgPT09ICdkcm9wJyApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LmZyZXNoICAgICAgPSAnMSc7ICAgLy8gY2FuIGF1dG8tbmFtZSBvbiBmaXJzdCBsYWJlbCBlZGl0LlxyXG5cdFx0XHRcdGVsLmRhdGFzZXQuYXV0b25hbWUgICA9ICcxJztcclxuXHRcdFx0XHRlbC5kYXRhc2V0Lndhc19sb2FkZWQgPSAnMCc7XHJcblx0XHRcdFx0Ly8gU2VlZCBhIHByb3Zpc2lvbmFsIHVuaXF1ZSBuYW1lIGltbWVkaWF0ZWx5LlxyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gbWV0YT8uYnVpbGRlcjtcclxuXHRcdFx0XHRcdGlmICggYj8uaWQgJiYgKCFlbC5oYXNBdHRyaWJ1dGUoICdkYXRhLW5hbWUnICkgfHwgIWVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtbmFtZScgKSkgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IFMgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiYXNlID0gUy5zYW5pdGl6ZV9odG1sX25hbWUoIGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtaWQnICkgfHwgZGF0YT8uaWQgfHwgZGF0YT8udHlwZSB8fCAnZmllbGQnICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHVuaXEgPSBiLmlkLmVuc3VyZV91bmlxdWVfZmllbGRfbmFtZSggYmFzZSwgZWwgKTtcclxuXHRcdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJywgdW5pcSApO1xyXG5cdFx0XHRcdFx0XHRlbC5kYXRhc2V0Lm5hbWVfdXNlcl90b3VjaGVkID0gJzAnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQgPT09ICdsb2FkJyApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LmZyZXNoICAgICAgPSAnMCc7XHJcblx0XHRcdFx0ZWwuZGF0YXNldC5hdXRvbmFtZSAgID0gJzAnO1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQud2FzX2xvYWRlZCA9ICcxJzsgICAvLyBuZXZlciByZW5hbWUgbmFtZXMgZm9yIGxvYWRlZCBmaWVsZHMuXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyAtLS0gQXV0byBSZW5hbWUgXCJGcmVzaFwiIGZpZWxkLCAgb24gZW50ZXJpbmcgdGhlIG5ldyBMYWJlbCAtLS1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENyZWF0ZSBhIGNvbnNlcnZhdGl2ZSBmaWVsZCBcIm5hbWVcIiBmcm9tIGEgaHVtYW4gbGFiZWwuXHJcblx0XHQgKiBVc2VzIHRoZSBzYW1lIGNvbnN0cmFpbnRzIGFzIHNhbml0aXplX2h0bWxfbmFtZSAobGV0dGVycy9kaWdpdHMvXy0gYW5kIGxlYWRpbmcgbGV0dGVyKS5cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG5hbWVfZnJvbV9sYWJlbChsYWJlbCkge1xyXG5cdFx0XHRjb25zdCBzID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX25hbWUoIFN0cmluZyggbGFiZWwgPz8gJycgKSApO1xyXG5cdFx0XHRyZXR1cm4gcy50b0xvd2VyQ2FzZSgpIHx8ICdmaWVsZCc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBdXRvLWZpbGwgZGF0YS1uYW1lIGZyb20gbGFiZWwgT05MWSBmb3IgZnJlc2hseSBkcm9wcGVkIGZpZWxkcyB0aGF0IHdlcmUgbm90IGVkaXRlZCB5ZXQuXHJcblx0XHQgKiAtIE5ldmVyIHJ1bnMgZm9yIHNlY3Rpb25zLlxyXG5cdFx0ICogLSBOZXZlciBydW5zIGZvciBsb2FkZWQvZXhpc3RpbmcgZmllbGRzLlxyXG5cdFx0ICogLSBTdG9wcyBhcyBzb29uIGFzIHVzZXIgZWRpdHMgdGhlIE5hbWUgbWFudWFsbHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlclxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgIC0gLndwYmNfYmZiX19maWVsZCBlbGVtZW50XHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxWYWxcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG1heWJlX2F1dG9uYW1lX2Zyb21fbGFiZWwoYnVpbGRlciwgZWwsIGxhYmVsVmFsKSB7XHJcblx0XHRcdGlmICggIWJ1aWxkZXIgfHwgIWVsICkgcmV0dXJuO1xyXG5cdFx0XHRpZiAoIGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgYWxsb3dBdXRvID0gZWwuZGF0YXNldC5hdXRvbmFtZSA9PT0gJzEnO1xyXG5cclxuXHRcdFx0Y29uc3QgdXNlclRvdWNoZWQgPSBlbC5kYXRhc2V0Lm5hbWVfdXNlcl90b3VjaGVkID09PSAnMSc7XHJcblx0XHRcdGNvbnN0IGlzTG9hZGVkICAgID0gZWwuZGF0YXNldC53YXNfbG9hZGVkID09PSAnMSc7XHJcblxyXG5cdFx0XHRpZiAoICFhbGxvd0F1dG8gfHwgdXNlclRvdWNoZWQgfHwgaXNMb2FkZWQgKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyBPbmx5IG92ZXJyaWRlIHBsYWNlaG9sZGVyLXkgbmFtZXNcclxuXHRcdFx0Y29uc3QgUyA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemU7XHJcblxyXG5cdFx0XHRjb25zdCBiYXNlICAgPSB0aGlzLm5hbWVfZnJvbV9sYWJlbCggbGFiZWxWYWwgKTtcclxuXHRcdFx0Y29uc3QgdW5pcXVlID0gYnVpbGRlci5pZC5lbnN1cmVfdW5pcXVlX2ZpZWxkX25hbWUoIGJhc2UsIGVsICk7XHJcblx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtbmFtZScsIHVuaXF1ZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgaW5zICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdGNvbnN0IG5hbWVDdHJsID0gaW5zPy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWtleT1cIm5hbWVcIl0nICk7XHJcblx0XHRcdGlmICggbmFtZUN0cmwgJiYgJ3ZhbHVlJyBpbiBuYW1lQ3RybCAmJiBuYW1lQ3RybC52YWx1ZSAhPT0gdW5pcXVlICkgbmFtZUN0cmwudmFsdWUgPSB1bmlxdWU7XHJcblx0XHR9XHJcblxyXG5cclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZWxlY3RfQmFzZSAoc2hhcmVkIGJhc2UgZm9yIHNlbGVjdC1saWtlIHBhY2tzKVxyXG5cdCAqXHJcblx0ICogQHR5cGUge0NvcmUuV1BCQ19CRkJfU2VsZWN0X0Jhc2V9XHJcblx0ICovXHJcblx0Q29yZS5XUEJDX0JGQl9TZWxlY3RfQmFzZSA9IGNsYXNzIGV4dGVuZHMgQ29yZS5XUEJDX0JGQl9GaWVsZF9CYXNlIHtcclxuXHJcblx0XHRzdGF0aWMgdGVtcGxhdGVfaWQgICAgICAgICAgICA9IG51bGw7ICAgICAgICAgICAgICAgICAvLyBtYWluIHByZXZpZXcgdGVtcGxhdGUgaWRcclxuXHRcdHN0YXRpYyBvcHRpb25fcm93X3RlbXBsYXRlX2lkID0gJ3dwYmMtYmZiLWluc3BlY3Rvci1zZWxlY3Qtb3B0aW9uLXJvdyc7IC8vIHJvdyB0cGwgaWRcclxuXHRcdHN0YXRpYyBraW5kICAgICAgICAgICAgICAgICAgID0gJ3NlbGVjdCc7XHJcblx0XHRzdGF0aWMgX19yb290X3dpcmVkICAgICAgICAgICA9IGZhbHNlO1xyXG5cdFx0c3RhdGljIF9fcm9vdF9ub2RlICAgICAgICAgICAgPSBudWxsO1xyXG5cclxuXHRcdC8vIFNpbmdsZSBzb3VyY2Ugb2Ygc2VsZWN0b3JzIHVzZWQgYnkgdGhlIGluc3BlY3RvciBVSS5cclxuXHRcdHN0YXRpYyB1aSA9IHtcclxuXHRcdFx0bGlzdCAgIDogJy53cGJjX2JmYl9fb3B0aW9uc19saXN0JyxcclxuXHRcdFx0aG9sZGVyIDogJy53cGJjX2JmYl9fb3B0aW9uc19zdGF0ZVtkYXRhLWluc3BlY3Rvci1rZXk9XCJvcHRpb25zXCJdJyxcclxuXHRcdFx0cm93ICAgIDogJy53cGJjX2JmYl9fb3B0aW9uc19yb3cnLFxyXG5cdFx0XHRsYWJlbCAgOiAnLndwYmNfYmZiX19vcHQtbGFiZWwnLFxyXG5cdFx0XHR2YWx1ZSAgOiAnLndwYmNfYmZiX19vcHQtdmFsdWUnLFxyXG5cdFx0XHR0b2dnbGUgOiAnLndwYmNfYmZiX19vcHQtc2VsZWN0ZWQtY2hrJyxcclxuXHRcdFx0YWRkX2J0bjogJy5qcy1hZGQtb3B0aW9uJyxcclxuXHJcblx0XHRcdGRyYWdfaGFuZGxlICAgICAgOiAnLndwYmNfYmZiX19kcmFnLWhhbmRsZScsXHJcblx0XHRcdG11bHRpcGxlX2NoayAgICAgOiAnLmpzLW9wdC1tdWx0aXBsZVtkYXRhLWluc3BlY3Rvci1rZXk9XCJtdWx0aXBsZVwiXScsXHJcblx0XHRcdGRlZmF1bHRfdGV4dCAgICAgOiAnLmpzLWRlZmF1bHQtdmFsdWVbZGF0YS1pbnNwZWN0b3Ita2V5PVwiZGVmYXVsdF92YWx1ZVwiXScsXHJcblx0XHRcdHBsYWNlaG9sZGVyX2lucHV0OiAnLmpzLXBsYWNlaG9sZGVyW2RhdGEtaW5zcGVjdG9yLWtleT1cInBsYWNlaG9sZGVyXCJdJyxcclxuXHRcdFx0cGxhY2Vob2xkZXJfbm90ZSA6ICcuanMtcGxhY2Vob2xkZXItbm90ZScsXHJcblx0XHRcdHNpemVfaW5wdXQgICAgICAgOiAnLmluc3BlY3Rvcl9faW5wdXRbZGF0YS1pbnNwZWN0b3Ita2V5PVwic2l6ZVwiXScsXHJcblxyXG5cdFx0XHQvLyBEcm9wZG93biBtZW51IGludGVncmF0aW9uLlxyXG5cdFx0XHRtZW51X3Jvb3QgIDogJy53cGJjX3VpX2VsX19kcm9wZG93bicsXHJcblx0XHRcdG1lbnVfdG9nZ2xlOiAnW2RhdGEtdG9nZ2xlPVwid3BiY19kcm9wZG93blwiXScsXHJcblx0XHRcdG1lbnVfYWN0aW9uOiAnLnVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uW2RhdGEtYWN0aW9uXScsXHJcblx0XHRcdC8vIFZhbHVlLWRpZmZlcnMgdG9nZ2xlLlxyXG5cdFx0XHR2YWx1ZV9kaWZmZXJzX2NoazogJy5qcy12YWx1ZS1kaWZmZXJzW2RhdGEtaW5zcGVjdG9yLWtleT1cInZhbHVlX2RpZmZlcnNcIl0nLFxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkIG9wdGlvbiB2YWx1ZSBmcm9tIGxhYmVsLlxyXG5cdFx0ICogLSBJZiBgZGlmZmVycyA9PT0gdHJ1ZWAgLT4gZ2VuZXJhdGUgdG9rZW4gKHNsdWctbGlrZSBtYWNoaW5lIHZhbHVlKS5cclxuXHRcdCAqIC0gSWYgYGRpZmZlcnMgPT09IGZhbHNlYCAtPiBrZWVwIGh1bWFuIHRleHQ7IGVzY2FwZSBvbmx5IGRhbmdlcm91cyBjaGFycy5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBkaWZmZXJzXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgYnVpbGRfdmFsdWVfZnJvbV9sYWJlbChsYWJlbCwgZGlmZmVycykge1xyXG5cdFx0XHRjb25zdCBTID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZTtcclxuXHRcdFx0aWYgKCBkaWZmZXJzICkge1xyXG5cdFx0XHRcdHJldHVybiAoUyAmJiB0eXBlb2YgUy50b190b2tlbiA9PT0gJ2Z1bmN0aW9uJylcclxuXHRcdFx0XHRcdD8gUy50b190b2tlbiggU3RyaW5nKCBsYWJlbCB8fCAnJyApIClcclxuXHRcdFx0XHRcdDogU3RyaW5nKCBsYWJlbCB8fCAnJyApLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIC9cXHMrL2csICdfJyApLnJlcGxhY2UoIC9bXlxcdy1dL2csICcnICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gc2luZ2xlLWlucHV0IG1vZGU6IGtlZXAgaHVtYW4gdGV4dDsgdGVtcGxhdGUgd2lsbCBlc2NhcGUgc2FmZWx5LlxyXG5cdFx0XHRyZXR1cm4gU3RyaW5nKCBsYWJlbCA9PSBudWxsID8gJycgOiBsYWJlbCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSXMgdGhlIOKAnHZhbHVlIGRpZmZlcnMgZnJvbSBsYWJlbOKAnSB0b2dnbGUgZW5hYmxlZD9cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhbmVsXHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGlzX3ZhbHVlX2RpZmZlcnNfZW5hYmxlZChwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBjaGsgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS52YWx1ZV9kaWZmZXJzX2NoayApO1xyXG5cdFx0XHRyZXR1cm4gISEoY2hrICYmIGNoay5jaGVja2VkKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuc3VyZSB2aXNpYmlsaXR5L2VuYWJsZWQgc3RhdGUgb2YgVmFsdWUgaW5wdXRzIGJhc2VkIG9uIHRoZSB0b2dnbGUuXHJcblx0XHQgKiBXaGVuIGRpc2FibGVkIC0+IGhpZGUgVmFsdWUgaW5wdXRzIGFuZCBrZWVwIHRoZW0gbWlycm9yZWQgZnJvbSBMYWJlbC5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhbmVsXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkocGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgZGlmZmVycyA9IHRoaXMuaXNfdmFsdWVfZGlmZmVyc19lbmFibGVkKCBwYW5lbCApO1xyXG5cdFx0XHRjb25zdCByb3dzICAgID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkucm93ICkgfHwgW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRcdGNvbnN0IHIgICAgICA9IHJvd3NbaV07XHJcblx0XHRcdFx0Y29uc3QgbGJsX2luID0gci5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLmxhYmVsICk7XHJcblx0XHRcdFx0Y29uc3QgdmFsX2luID0gci5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLnZhbHVlICk7XHJcblx0XHRcdFx0aWYgKCAhdmFsX2luICkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGlmICggZGlmZmVycyApIHtcclxuXHRcdFx0XHRcdC8vIFJlLWVuYWJsZSAmIHNob3cgdmFsdWUgaW5wdXRcclxuXHRcdFx0XHRcdHZhbF9pbi5yZW1vdmVBdHRyaWJ1dGUoICdkaXNhYmxlZCcgKTtcclxuXHRcdFx0XHRcdHZhbF9pbi5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcblxyXG5cdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIGNhY2hlZCBjdXN0b20gdmFsdWUgYW5kIHRoZSByb3cgd2Fzbid0IGVkaXRlZCB3aGlsZSBPRkYsIHJlc3RvcmUgaXRcclxuXHRcdFx0XHRcdGNvbnN0IGhhc0NhY2hlICAgPSAhIXZhbF9pbi5kYXRhc2V0LmNhY2hlZF92YWx1ZTtcclxuXHRcdFx0XHRcdGNvbnN0IHVzZXJFZGl0ZWQgPSByLmRhdGFzZXQudmFsdWVfdXNlcl90b3VjaGVkID09PSAnMSc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBoYXNDYWNoZSAmJiAhdXNlckVkaXRlZCApIHtcclxuXHRcdFx0XHRcdFx0dmFsX2luLnZhbHVlID0gdmFsX2luLmRhdGFzZXQuY2FjaGVkX3ZhbHVlO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggIWhhc0NhY2hlICkge1xyXG5cdFx0XHRcdFx0XHQvLyBObyBjYWNoZTogaWYgdmFsdWUgaXMganVzdCBhIG1pcnJvcmVkIGxhYmVsLCBvZmZlciBhIHRva2VuaXplZCBkZWZhdWx0XHJcblx0XHRcdFx0XHRcdGNvbnN0IGxibCAgICAgID0gbGJsX2luID8gbGJsX2luLnZhbHVlIDogJyc7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG1pcnJvcmVkID0gdGhpcy5idWlsZF92YWx1ZV9mcm9tX2xhYmVsKCBsYmwsIC8qZGlmZmVycz0qL2ZhbHNlICk7XHJcblx0XHRcdFx0XHRcdGlmICggdmFsX2luLnZhbHVlID09PSBtaXJyb3JlZCApIHtcclxuXHRcdFx0XHRcdFx0XHR2YWxfaW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGxibCwgLypkaWZmZXJzPSovdHJ1ZSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIE9OIC0+IE9GRjogY2FjaGUgb25jZSwgdGhlbiBtaXJyb3JcclxuXHRcdFx0XHRcdGlmICggIXZhbF9pbi5kYXRhc2V0LmNhY2hlZF92YWx1ZSApIHtcclxuXHRcdFx0XHRcdFx0dmFsX2luLmRhdGFzZXQuY2FjaGVkX3ZhbHVlID0gdmFsX2luLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc3QgbGJsICAgID0gbGJsX2luID8gbGJsX2luLnZhbHVlIDogJyc7XHJcblx0XHRcdFx0XHR2YWxfaW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGxibCwgLypkaWZmZXJzPSovZmFsc2UgKTtcclxuXHJcblx0XHRcdFx0XHR2YWxfaW4uc2V0QXR0cmlidXRlKCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0XHR2YWxfaW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0XHRcdC8vIE5PVEU6IGRvIE5PVCBtYXJrIGFzIHVzZXJfdG91Y2hlZCBoZXJlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJuIHdoZXRoZXIgdGhpcyByb3figJlzIHZhbHVlIGhhcyBiZWVuIGVkaXRlZCBieSB1c2VyLlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm93XHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGlzX3Jvd192YWx1ZV91c2VyX3RvdWNoZWQocm93KSB7XHJcblx0XHRcdHJldHVybiByb3c/LmRhdGFzZXQ/LnZhbHVlX3VzZXJfdG91Y2hlZCA9PT0gJzEnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWFyayB0aGlzIHJvd+KAmXMgdmFsdWUgYXMgZWRpdGVkIGJ5IHVzZXIuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG1hcmtfcm93X3ZhbHVlX3VzZXJfdG91Y2hlZChyb3cpIHtcclxuXHRcdFx0aWYgKCByb3cgKSByb3cuZGF0YXNldC52YWx1ZV91c2VyX3RvdWNoZWQgPSAnMSc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbml0aWFsaXplIOKAnGZyZXNobmVzc+KAnSBmbGFncyBvbiBhIHJvdyAodmFsdWUgdW50b3VjaGVkKS5cclxuXHRcdCAqIENhbGwgb24gY3JlYXRpb24vYXBwZW5kIG9mIHJvd3MuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGluaXRfcm93X2ZyZXNoX2ZsYWdzKHJvdykge1xyXG5cdFx0XHRpZiAoIHJvdyApIHtcclxuXHRcdFx0XHRpZiAoICFyb3cuZGF0YXNldC52YWx1ZV91c2VyX3RvdWNoZWQgKSB7XHJcblx0XHRcdFx0XHRyb3cuZGF0YXNldC52YWx1ZV91c2VyX3RvdWNoZWQgPSAnMCc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBkZWZhdWx0cyAocGFja3MgY2FuIG92ZXJyaWRlKSAtLS0tXHJcblx0XHRzdGF0aWMgZ2V0X2RlZmF1bHRzKCkge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHR5cGUgICAgICAgICA6IHRoaXMua2luZCxcclxuXHRcdFx0XHRsYWJlbCAgICAgICAgOiAnU2VsZWN0JyxcclxuXHRcdFx0XHRuYW1lICAgICAgICAgOiAnJyxcclxuXHRcdFx0XHRodG1sX2lkICAgICAgOiAnJyxcclxuXHRcdFx0XHRwbGFjZWhvbGRlciAgOiAnLS0tIFNlbGVjdCAtLS0nLFxyXG5cdFx0XHRcdHJlcXVpcmVkICAgICA6IGZhbHNlLFxyXG5cdFx0XHRcdG11bHRpcGxlICAgICA6IGZhbHNlLFxyXG5cdFx0XHRcdHNpemUgICAgICAgICA6IG51bGwsXHJcblx0XHRcdFx0Y3NzY2xhc3MgICAgIDogJycsXHJcblx0XHRcdFx0aGVscCAgICAgICAgIDogJycsXHJcblx0XHRcdFx0ZGVmYXVsdF92YWx1ZTogJycsXHJcblx0XHRcdFx0b3B0aW9ucyAgICAgIDogW1xyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiAxJywgdmFsdWU6ICdPcHRpb24gMScsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiAyJywgdmFsdWU6ICdPcHRpb24gMicsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiAzJywgdmFsdWU6ICdPcHRpb24gMycsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRcdFx0eyBsYWJlbDogJ09wdGlvbiA0JywgdmFsdWU6ICdPcHRpb24gNCcsIHNlbGVjdGVkOiBmYWxzZSB9XHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRtaW5fd2lkdGggICAgOiAnMjQwcHgnXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBwcmV2aWV3IHJlbmRlciAoaWRlbXBvdGVudCkgLS0tLVxyXG5cdFx0c3RhdGljIHJlbmRlcihlbCwgZGF0YSwgY3R4KSB7XHJcblx0XHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgZCA9IHRoaXMubm9ybWFsaXplX2RhdGEoIGRhdGEgKTtcclxuXHJcblx0XHRcdGlmICggZC5taW5fd2lkdGggIT0gbnVsbCApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0Lm1pbl93aWR0aCA9IFN0cmluZyggZC5taW5fd2lkdGggKTtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0ZWwuc3R5bGUuc2V0UHJvcGVydHkoICctLXdwYmMtY29sLW1pbicsIFN0cmluZyggZC5taW5fd2lkdGggKSApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGQuaHRtbF9pZCAhPSBudWxsICkgZWwuZGF0YXNldC5odG1sX2lkID0gU3RyaW5nKCBkLmh0bWxfaWQgfHwgJycgKTtcclxuXHRcdFx0aWYgKCBkLmNzc2NsYXNzICE9IG51bGwgKSBlbC5kYXRhc2V0LmNzc2NsYXNzID0gU3RyaW5nKCBkLmNzc2NsYXNzIHx8ICcnICk7XHJcblx0XHRcdGlmICggZC5wbGFjZWhvbGRlciAhPSBudWxsICkgZWwuZGF0YXNldC5wbGFjZWhvbGRlciA9IFN0cmluZyggZC5wbGFjZWhvbGRlciB8fCAnJyApO1xyXG5cclxuXHRcdFx0Y29uc3QgdHBsID0gdGhpcy5nZXRfdGVtcGxhdGUoIHRoaXMudGVtcGxhdGVfaWQgKTtcclxuXHRcdFx0aWYgKCB0eXBlb2YgdHBsICE9PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2Vycm9yXCIgcm9sZT1cImFsZXJ0XCI+VGVtcGxhdGUgbm90IGZvdW5kOiAnICsgdGhpcy50ZW1wbGF0ZV9pZCArICcuPC9kaXY+JztcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0ZWwuaW5uZXJIVE1MID0gdHBsKCBkICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdHdpbmRvdy5fd3BiYz8uZGV2Py5lcnJvcj8uKCAnU2VsZWN0X0Jhc2UucmVuZGVyJywgZSApO1xyXG5cdFx0XHRcdGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2Vycm9yXCIgcm9sZT1cImFsZXJ0XCI+RXJyb3IgcmVuZGVyaW5nIGZpZWxkIHByZXZpZXcuPC9kaXY+JztcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGVsLmRhdGFzZXQudHlwZSA9IGQudHlwZSB8fCB0aGlzLmtpbmQ7XHJcblx0XHRcdGVsLnNldEF0dHJpYnV0ZSggJ2RhdGEtbGFiZWwnLCAoZC5sYWJlbCAhPSBudWxsID8gU3RyaW5nKCBkLmxhYmVsICkgOiAnJykgKTtcclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Q29yZS5VST8uV1BCQ19CRkJfT3ZlcmxheT8uZW5zdXJlPy4oIGN0eD8uYnVpbGRlciwgZWwgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggIWVsLmRhdGFzZXQub3B0aW9ucyAmJiBBcnJheS5pc0FycmF5KCBkLm9wdGlvbnMgKSAmJiBkLm9wdGlvbnMubGVuZ3RoICkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRlbC5kYXRhc2V0Lm9wdGlvbnMgPSBKU09OLnN0cmluZ2lmeSggZC5vcHRpb25zICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBkcm9wIHNlZWRpbmcgKG9wdGlvbnMgKyBwbGFjZWhvbGRlcikgLS0tLVxyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIG1ldGEpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRzdXBlci5vbl9maWVsZF9kcm9wPy4oIGRhdGEsIGVsLCBtZXRhICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBpc19kcm9wID0gKG1ldGEgJiYgbWV0YS5jb250ZXh0ID09PSAnZHJvcCcpO1xyXG5cclxuXHRcdFx0aWYgKCBpc19kcm9wICkge1xyXG5cdFx0XHRcdGlmICggIUFycmF5LmlzQXJyYXkoIGRhdGEub3B0aW9ucyApIHx8ICFkYXRhLm9wdGlvbnMubGVuZ3RoICkge1xyXG5cdFx0XHRcdFx0Y29uc3Qgb3B0cyAgID0gKHRoaXMuZ2V0X2RlZmF1bHRzKCkub3B0aW9ucyB8fCBbXSkubWFwKCAobykgPT4gKHtcclxuXHRcdFx0XHRcdFx0bGFiZWwgICA6IG8ubGFiZWwsXHJcblx0XHRcdFx0XHRcdHZhbHVlICAgOiBvLnZhbHVlLFxyXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogISFvLnNlbGVjdGVkXHJcblx0XHRcdFx0XHR9KSApO1xyXG5cdFx0XHRcdFx0ZGF0YS5vcHRpb25zID0gb3B0cztcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdGVsLmRhdGFzZXQub3B0aW9ucyA9IEpTT04uc3RyaW5naWZ5KCBvcHRzICk7XHJcblx0XHRcdFx0XHRcdGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHsgYnViYmxlczogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRkZXRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5ICA6ICdvcHRpb25zJyxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBvcHRzXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9ICkgKTtcclxuXHRcdFx0XHRcdFx0Q29yZS5TdHJ1Y3R1cmU/LnVwZGF0ZV9maWVsZF9wcm9wPy4oIGVsLCAnb3B0aW9ucycsIG9wdHMgKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgcGggPSAoZGF0YS5wbGFjZWhvbGRlciA/PyAnJykudG9TdHJpbmcoKS50cmltKCk7XHJcblx0XHRcdFx0aWYgKCAhcGggKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkZmx0ICAgICAgID0gdGhpcy5nZXRfZGVmYXVsdHMoKS5wbGFjZWhvbGRlciB8fCAnLS0tIFNlbGVjdCAtLS0nO1xyXG5cdFx0XHRcdFx0ZGF0YS5wbGFjZWhvbGRlciA9IGRmbHQ7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRlbC5kYXRhc2V0LnBsYWNlaG9sZGVyID0gU3RyaW5nKCBkZmx0ICk7XHJcblx0XHRcdFx0XHRcdGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHsgYnViYmxlczogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRkZXRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5ICA6ICdwbGFjZWhvbGRlcicsXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZGZsdFxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSApICk7XHJcblx0XHRcdFx0XHRcdENvcmUuU3RydWN0dXJlPy51cGRhdGVfZmllbGRfcHJvcD8uKCBlbCwgJ3BsYWNlaG9sZGVyJywgZGZsdCApO1xyXG5cdFx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblx0XHQvLyBJbnNwZWN0b3IgaGVscGVycyAoc25ha2VfY2FzZSlcclxuXHRcdC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdFx0c3RhdGljIGdldF9wYW5lbF9yb290KGVsKSB7XHJcblx0XHRcdHJldHVybiBlbD8uY2xvc2VzdD8uKCAnLndwYmNfYmZiX19pbnNwZWN0b3JfX2JvZHknICkgfHwgZWw/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9faW5zcGVjdG9yJyApIHx8IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGdldF9saXN0KHBhbmVsKSB7XHJcblx0XHRcdHJldHVybiBwYW5lbCA/IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoIHRoaXMudWkubGlzdCApIDogbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgZ2V0X2hvbGRlcihwYW5lbCkge1xyXG5cdFx0XHRyZXR1cm4gcGFuZWwgPyBwYW5lbC5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLmhvbGRlciApIDogbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgbWFrZV91aWQoKSB7XHJcblx0XHRcdHJldHVybiAnd3BiY19pbnNfYXV0b19vcHRfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDEwICk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGFwcGVuZF9yb3cocGFuZWwsIGRhdGEpIHtcclxuXHRcdFx0Y29uc3QgbGlzdCA9IHRoaXMuZ2V0X2xpc3QoIHBhbmVsICk7XHJcblx0XHRcdGlmICggIWxpc3QgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBpZHggID0gbGlzdC5jaGlsZHJlbi5sZW5ndGg7XHJcblx0XHRcdGNvbnN0IHJvd2QgPSBPYmplY3QuYXNzaWduKCB7IGxhYmVsOiAnJywgdmFsdWU6ICcnLCBzZWxlY3RlZDogZmFsc2UsIGluZGV4OiBpZHggfSwgKGRhdGEgfHwge30pICk7XHJcblx0XHRcdGlmICggIXJvd2QudWlkICkgcm93ZC51aWQgPSB0aGlzLm1ha2VfdWlkKCk7XHJcblxyXG5cdFx0XHRjb25zdCB0cGxfaWQgPSB0aGlzLm9wdGlvbl9yb3dfdGVtcGxhdGVfaWQ7XHJcblx0XHRcdGNvbnN0IHRwbCAgICA9ICh3aW5kb3cud3AgJiYgd3AudGVtcGxhdGUpID8gd3AudGVtcGxhdGUoIHRwbF9pZCApIDogbnVsbDtcclxuXHRcdFx0Y29uc3QgaHRtbCAgID0gdHBsID8gdHBsKCByb3dkICkgOiBudWxsO1xyXG5cclxuXHRcdFx0Ly8gSW4gYXBwZW5kX3JvdygpIC0+IGZhbGxiYWNrIEhUTUwuXHJcblx0XHRcdGNvbnN0IHdyYXAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0d3JhcC5pbm5lckhUTUwgPSBodG1sIHx8IChcclxuXHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19vcHRpb25zX3Jvd1wiIGRhdGEtaW5kZXg9XCInICsgKHJvd2QuaW5kZXggfHwgMCkgKyAnXCI+JyArXHJcblx0XHRcdFx0XHQnPHNwYW4gY2xhc3M9XCJ3cGJjX2JmYl9fZHJhZy1oYW5kbGVcIj48c3BhbiBjbGFzcz1cIndwYmNfaWNuX2RyYWdfaW5kaWNhdG9yXCI+PC9zcGFuPjwvc3Bhbj4nICtcclxuXHRcdFx0XHRcdCc8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cIndwYmNfYmZiX19vcHQtbGFiZWxcIiBwbGFjZWhvbGRlcj1cIkxhYmVsXCIgdmFsdWU9XCInICsgKHJvd2QubGFiZWwgfHwgJycpICsgJ1wiPicgK1xyXG5cdFx0XHRcdFx0JzxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwid3BiY19iZmJfX29wdC12YWx1ZVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIiB2YWx1ZT1cIicgKyAocm93ZC52YWx1ZSB8fCAnJykgKyAnXCI+JyArXHJcblx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19vcHQtc2VsZWN0ZWRcIj4nICtcclxuXHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJpbnNwZWN0b3JfX2NvbnRyb2wgd3BiY191aV9fdG9nZ2xlXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cIndwYmNfYmZiX19vcHQtc2VsZWN0ZWQtY2hrIGluc3BlY3Rvcl9faW5wdXRcIiBpZD1cIicgKyByb3dkLnVpZCArICdcIiByb2xlPVwic3dpdGNoXCIgJyArIChyb3dkLnNlbGVjdGVkID8gJ2NoZWNrZWQgYXJpYS1jaGVja2VkPVwidHJ1ZVwiJyA6ICdhcmlhLWNoZWNrZWQ9XCJmYWxzZVwiJykgKyAnPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8bGFiZWwgY2xhc3M9XCJ3cGJjX3VpX190b2dnbGVfaWNvbl9yYWRpb1wiIGZvcj1cIicgKyByb3dkLnVpZCArICdcIj48L2xhYmVsPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8bGFiZWwgY2xhc3M9XCJ3cGJjX3VpX190b2dnbGVfbGFiZWxcIiBmb3I9XCInICsgcm93ZC51aWQgKyAnXCI+RGVmYXVsdDwvbGFiZWw+JyArXHJcblx0XHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHRcdC8vIDMtZG90IGRyb3Bkb3duICh1c2VzIGV4aXN0aW5nIHBsdWdpbiBkcm9wZG93biBKUykuXHJcblx0XHRcdFx0XHQnPGRpdiBjbGFzcz1cIndwYmNfdWlfZWwgd3BiY191aV9lbF9jb250YWluZXIgd3BiY191aV9lbF9fZHJvcGRvd25cIj4nICtcclxuXHRcdFx0XHRcdFx0JzxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBkYXRhLXRvZ2dsZT1cIndwYmNfZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBjbGFzcz1cInVsX2Ryb3Bkb3duX21lbnVfdG9nZ2xlXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fbW9yZV92ZXJ0XCI+PC9pPicgK1xyXG5cdFx0XHRcdFx0XHQnPC9hPicgK1xyXG5cdFx0XHRcdFx0XHQnPHVsIGNsYXNzPVwidWxfZHJvcGRvd25fbWVudVwiIHJvbGU9XCJtZW51XCIgc3R5bGU9XCJyaWdodDowcHg7IGxlZnQ6YXV0bztcIj4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGxpPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzxhIGNsYXNzPVwidWxfZHJvcGRvd25fbWVudV9saV9hY3Rpb25cIiBkYXRhLWFjdGlvbj1cImFkZF9hZnRlclwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj4nICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0J0FkZCBOZXcnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fYWRkX2NpcmNsZVwiPjwvaT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8L2E+JyArXHJcblx0XHRcdFx0XHRcdFx0JzwvbGk+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxsaT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8YSBjbGFzcz1cInVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uXCIgZGF0YS1hY3Rpb249XCJkdXBsaWNhdGVcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdEdXBsaWNhdGUnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fY29udGVudF9jb3B5XCI+PC9pPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0JzwvYT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPC9saT4nICtcclxuXHRcdFx0XHRcdFx0XHQnPGxpIGNsYXNzPVwiZGl2aWRlclwiPjwvbGk+JyArXHJcblx0XHRcdFx0XHRcdFx0JzxsaT4nICtcclxuXHRcdFx0XHRcdFx0XHRcdCc8YSBjbGFzcz1cInVsX2Ryb3Bkb3duX21lbnVfbGlfYWN0aW9uXCIgZGF0YS1hY3Rpb249XCJyZW1vdmVcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+JyArXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdSZW1vdmUnICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0JzxpIGNsYXNzPVwibWVudV9pY29uIGljb24tMXggd3BiY19pY25fZGVsZXRlX291dGxpbmVcIj48L2k+JyArXHJcblx0XHRcdFx0XHRcdFx0XHQnPC9hPicgK1xyXG5cdFx0XHRcdFx0XHRcdCc8L2xpPicgK1xyXG5cdFx0XHRcdFx0XHQnPC91bD4nICtcclxuXHRcdFx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdFx0XHQnPC9kaXY+J1xyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZSA9IHdyYXAuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcblx0XHRcdCBpZiAoISBub2RlKSB7XHJcblx0XHRcdFx0IHJldHVybjtcclxuXHRcdFx0IH1cclxuXHRcdFx0Ly8gcHJlLWhpZGUgVmFsdWUgaW5wdXQgaWYgdG9nZ2xlIGlzIE9GRiAqKmJlZm9yZSoqIGFwcGVuZGluZy5cclxuXHRcdFx0Y29uc3QgZGlmZmVycyA9IHRoaXMuaXNfdmFsdWVfZGlmZmVyc19lbmFibGVkKCBwYW5lbCApO1xyXG5cdFx0XHRjb25zdCB2YWxJbiAgID0gbm9kZS5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLnZhbHVlICk7XHJcblx0XHRcdGNvbnN0IGxibEluICAgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoIHRoaXMudWkubGFiZWwgKTtcclxuXHJcblx0XHRcdGlmICggIWRpZmZlcnMgJiYgdmFsSW4gKSB7XHJcblx0XHRcdFx0aWYgKCAhdmFsSW4uZGF0YXNldC5jYWNoZWRfdmFsdWUgKSB7XHJcblx0XHRcdFx0XHR2YWxJbi5kYXRhc2V0LmNhY2hlZF92YWx1ZSA9IHZhbEluLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGxibEluICkgdmFsSW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGxibEluLnZhbHVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdHZhbEluLnNldEF0dHJpYnV0ZSggJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyApO1xyXG5cdFx0XHRcdHZhbEluLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHR0aGlzLmluaXRfcm93X2ZyZXNoX2ZsYWdzKCBub2RlICk7XHJcblx0XHRcdGxpc3QuYXBwZW5kQ2hpbGQoIG5vZGUgKTtcclxuXHJcblx0XHRcdC8vIEtlZXAgeW91ciBleGlzdGluZyBwb3N0LWFwcGVuZCBzeW5jIGFzIGEgc2FmZXR5IG5ldFxyXG5cdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGNsb3NlX2Ryb3Bkb3duKGFuY2hvcl9lbCkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHZhciByb290ID0gYW5jaG9yX2VsPy5jbG9zZXN0Py4oIHRoaXMudWkubWVudV9yb290ICk7XHJcblx0XHRcdFx0aWYgKCByb290ICkge1xyXG5cdFx0XHRcdFx0Ly8gSWYgeW91ciBkcm9wZG93biB0b2dnbGVyIHRvZ2dsZXMgYSBjbGFzcyBsaWtlICdvcGVuJywgY2xvc2UgaXQuXHJcblx0XHRcdFx0XHRyb290LmNsYXNzTGlzdC5yZW1vdmUoICdvcGVuJyApO1xyXG5cdFx0XHRcdFx0Ly8gT3IgaWYgaXQgcmVsaWVzIG9uIGFyaWEtZXhwYW5kZWQgb24gdGhlIHRvZ2dsZS5cclxuXHRcdFx0XHRcdHZhciB0ID0gcm9vdC5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLm1lbnVfdG9nZ2xlICk7XHJcblx0XHRcdFx0XHRpZiAoIHQgKSB7XHJcblx0XHRcdFx0XHRcdHQuc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsICdmYWxzZScgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkgeyB9XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGluc2VydF9hZnRlcihuZXdfbm9kZSwgcmVmX25vZGUpIHtcclxuXHRcdFx0aWYgKCByZWZfbm9kZT8ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRpZiAoIHJlZl9ub2RlLm5leHRTaWJsaW5nICkge1xyXG5cdFx0XHRcdFx0cmVmX25vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIG5ld19ub2RlLCByZWZfbm9kZS5uZXh0U2libGluZyApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZWZfbm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKCBuZXdfbm9kZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRpYyBjb21taXRfb3B0aW9ucyhwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBsaXN0ICAgPSB0aGlzLmdldF9saXN0KCBwYW5lbCApO1xyXG5cdFx0XHRjb25zdCBob2xkZXIgPSB0aGlzLmdldF9ob2xkZXIoIHBhbmVsICk7XHJcblx0XHRcdGlmICggIWxpc3QgfHwgIWhvbGRlciApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGRpZmZlcnMgPSB0aGlzLmlzX3ZhbHVlX2RpZmZlcnNfZW5hYmxlZCggcGFuZWwgKTtcclxuXHJcblx0XHRcdGNvbnN0IHJvd3MgICAgPSBsaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkucm93ICk7XHJcblx0XHRcdGNvbnN0IG9wdGlvbnMgPSBbXTtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRjb25zdCByICAgICAgPSByb3dzW2ldO1xyXG5cdFx0XHRcdGNvbnN0IGxibF9pbiA9IHIucXVlcnlTZWxlY3RvciggdGhpcy51aS5sYWJlbCApO1xyXG5cdFx0XHRcdGNvbnN0IHZhbF9pbiA9IHIucXVlcnlTZWxlY3RvciggdGhpcy51aS52YWx1ZSApO1xyXG5cdFx0XHRcdGNvbnN0IGNoayAgICA9IHIucXVlcnlTZWxlY3RvciggdGhpcy51aS50b2dnbGUgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbGJsID0gKGxibF9pbiAmJiBsYmxfaW4udmFsdWUpIHx8ICcnO1xyXG5cdFx0XHRcdGxldCB2YWwgICA9ICh2YWxfaW4gJiYgdmFsX2luLnZhbHVlKSB8fCAnJztcclxuXHJcblx0XHRcdFx0Ly8gSWYgc2luZ2xlLWlucHV0IG1vZGUgLT4gaGFyZCBtaXJyb3IgdG8gbGFiZWwuXHJcblx0XHRcdFx0aWYgKCAhIGRpZmZlcnMgKSB7XHJcblx0XHRcdFx0XHQvLyBzaW5nbGUtaW5wdXQgbW9kZTogbWlycm9yIExhYmVsLCBtaW5pbWFsIGVzY2FwaW5nIChubyBzbHVnKS5cclxuXHRcdFx0XHRcdHZhbCA9IHRoaXMuYnVpbGRfdmFsdWVfZnJvbV9sYWJlbCggbGJsLCAvKmRpZmZlcnM9Ki9mYWxzZSApO1xyXG5cdFx0XHRcdFx0aWYgKCB2YWxfaW4gKSB7XHJcblx0XHRcdFx0XHRcdHZhbF9pbi52YWx1ZSA9IHZhbDsgICAvLyBrZWVwIGhpZGRlbiBpbnB1dCBpbiBzeW5jIGZvciBhbnkgcHJldmlld3MvZGVidWcuXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBzZWwgPSAhIShjaGsgJiYgY2hrLmNoZWNrZWQpO1xyXG5cdFx0XHRcdG9wdGlvbnMucHVzaCggeyBsYWJlbDogbGJsLCB2YWx1ZTogdmFsLCBzZWxlY3RlZDogc2VsIH0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRob2xkZXIudmFsdWUgPSBKU09OLnN0cmluZ2lmeSggb3B0aW9ucyApO1xyXG5cdFx0XHRcdGhvbGRlci5kaXNwYXRjaEV2ZW50KCBuZXcgRXZlbnQoICdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHRob2xkZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdHBhbmVsLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHtcclxuXHRcdFx0XHRcdGJ1YmJsZXM6IHRydWUsIGRldGFpbDoge1xyXG5cdFx0XHRcdFx0XHRrZXk6ICdvcHRpb25zJywgdmFsdWU6IG9wdGlvbnNcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICkgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc3luY19kZWZhdWx0X3ZhbHVlX2xvY2soIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuc3luY19wbGFjZWhvbGRlcl9sb2NrKCBwYW5lbCApO1xyXG5cclxuXHRcdFx0Ly8gTWlycm9yIHRvIHRoZSBzZWxlY3RlZCBmaWVsZCBlbGVtZW50IHNvIGNhbnZhcy9leHBvcnQgc2VlcyBjdXJyZW50IG9wdGlvbnMgaW1tZWRpYXRlbHkuXHJcblx0XHRcdGNvbnN0IGZpZWxkID0gcGFuZWwuX19zZWxlY3RiYXNlX2ZpZWxkXHJcblx0XHRcdFx0fHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZmllbGQuaXMtc2VsZWN0ZWQsIC53cGJjX2JmYl9fZmllbGQtLXNlbGVjdGVkJyApO1xyXG5cdFx0XHRpZiAoIGZpZWxkICkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRmaWVsZC5kYXRhc2V0Lm9wdGlvbnMgPSBKU09OLnN0cmluZ2lmeSggb3B0aW9ucyApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRDb3JlLlN0cnVjdHVyZT8udXBkYXRlX2ZpZWxkX3Byb3A/LiggZmllbGQsICdvcHRpb25zJywgb3B0aW9ucyApO1xyXG5cdFx0XHRcdGZpZWxkLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3dwYmNfYmZiX2ZpZWxkX2RhdGFfY2hhbmdlZCcsIHtcclxuXHRcdFx0XHRcdGJ1YmJsZXM6IHRydWUsIGRldGFpbDogeyBrZXk6ICdvcHRpb25zJywgdmFsdWU6IG9wdGlvbnMgfVxyXG5cdFx0XHRcdH0gKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdHN0YXRpYyBlbnN1cmVfc29ydGFibGUocGFuZWwpIHtcclxuXHJcblx0XHRcdGNvbnN0IGxpc3QgPSB0aGlzLmdldF9saXN0KCBwYW5lbCApO1xyXG5cdFx0XHRpZiAoICEgbGlzdCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB3aW5kb3cuU29ydGFibGU/LmdldD8uKCBsaXN0ICk7XHJcblx0XHRcdFx0aWYgKCBleGlzdGluZyApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1aWxkZXIgPSB3aW5kb3cud3BiY19iZmJfYXBpPy5nZXRfYnVpbGRlcj8uKCkgfHwgd2luZG93LndwYmNfYmZiIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdC8vIFByZWZlciB0aGUgc2hhcmVkIFNvcnRhYmxlIG1hbmFnZXIgc28gdGhlIHNpZGViYXIgbGlzdCB1c2VzXHJcblx0XHRcdFx0Ly8gdGhlIGRlZGljYXRlZCBcInNpbXBsZV9saXN0XCIgY29uZmlnIGluc3RlYWQgb2YgdGhlIGNhbnZhcyBjb25maWcuXHJcblx0XHRcdFx0aWYgKCBidWlsZGVyICYmIGJ1aWxkZXIuc29ydGFibGUgJiYgdHlwZW9mIGJ1aWxkZXIuc29ydGFibGUuZW5zdXJlID09PSAnZnVuY3Rpb24nICkge1xyXG5cclxuXHRcdFx0XHRcdGJ1aWxkZXIuc29ydGFibGUuZW5zdXJlKFxyXG5cdFx0XHRcdFx0XHRsaXN0LFxyXG5cdFx0XHRcdFx0XHQnY2FudmFzJyxcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdHNvcnRhYmxlX2tpbmQgICAgIDogJ3NpbXBsZV9saXN0JyxcclxuXHRcdFx0XHRcdFx0XHRoYW5kbGVfc2VsZWN0b3IgICA6IHRoaXMudWkuZHJhZ19oYW5kbGUsXHJcblx0XHRcdFx0XHRcdFx0ZHJhZ2dhYmxlX3NlbGVjdG9yOiB0aGlzLnVpLnJvdyxcclxuXHRcdFx0XHRcdFx0XHRvblVwZGF0ZSAgICAgICAgICA6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB3aW5kb3cuU29ydGFibGU/LmNyZWF0ZSApIHtcclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrIGlmIGJ1aWxkZXIgaXMgbm90IHJlYWR5IGZvciBzb21lIHJlYXNvbi5cclxuXHRcdFx0XHRcdHdpbmRvdy5Tb3J0YWJsZS5jcmVhdGUoXHJcblx0XHRcdFx0XHRcdGxpc3QsXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRoYW5kbGUgICAgICAgICAgIDogdGhpcy51aS5kcmFnX2hhbmRsZSxcclxuXHRcdFx0XHRcdFx0XHRkcmFnZ2FibGUgICAgICAgIDogdGhpcy51aS5yb3csXHJcblx0XHRcdFx0XHRcdFx0YW5pbWF0aW9uICAgICAgICA6IDEyMCxcclxuXHRcdFx0XHRcdFx0XHRmb3JjZUZhbGxiYWNrICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRmYWxsYmFja09uQm9keSAgIDogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0ZmFsbGJhY2tUb2xlcmFuY2U6IDgsXHJcblx0XHRcdFx0XHRcdFx0cmVtb3ZlQ2xvbmVPbkhpZGU6IHRydWUsXHJcblx0XHRcdFx0XHRcdFx0b25VcGRhdGUgICAgICAgICA6ICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGlzdC5kYXRhc2V0LnNvcnRhYmxlX2luaXQgPSAnMSc7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHR3aW5kb3cuX3dwYmM/LmRldj8uZXJyb3I/LiggJ1NlbGVjdF9CYXNlLmVuc3VyZV9zb3J0YWJsZScsIGUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRpYyByZWJ1aWxkX2lmX2VtcHR5KHBhbmVsKSB7XHJcblx0XHRcdGNvbnN0IGxpc3QgICA9IHRoaXMuZ2V0X2xpc3QoIHBhbmVsICk7XHJcblx0XHRcdGNvbnN0IGhvbGRlciA9IHRoaXMuZ2V0X2hvbGRlciggcGFuZWwgKTtcclxuXHRcdFx0aWYgKCAhbGlzdCB8fCAhaG9sZGVyIHx8IGxpc3QuY2hpbGRyZW4ubGVuZ3RoICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0bGV0IGRhdGEgPSBbXTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRkYXRhID0gSlNPTi5wYXJzZSggaG9sZGVyLnZhbHVlIHx8ICdbXScgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdFx0ZGF0YSA9IFtdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICFBcnJheS5pc0FycmF5KCBkYXRhICkgfHwgIWRhdGEubGVuZ3RoICkge1xyXG5cdFx0XHRcdGRhdGEgPSAodGhpcy5nZXRfZGVmYXVsdHMoKS5vcHRpb25zIHx8IFtdKS5zbGljZSggMCApO1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRob2xkZXIudmFsdWUgPSBKU09OLnN0cmluZ2lmeSggZGF0YSApO1xyXG5cdFx0XHRcdFx0aG9sZGVyLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdFx0aG9sZGVyLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0dGhpcy5hcHBlbmRfcm93KCBwYW5lbCwge1xyXG5cdFx0XHRcdFx0bGFiZWwgICA6IGRhdGFbaV0/LmxhYmVsIHx8ICcnLFxyXG5cdFx0XHRcdFx0dmFsdWUgICA6IGRhdGFbaV0/LnZhbHVlIHx8ICcnLFxyXG5cdFx0XHRcdFx0c2VsZWN0ZWQ6ICEhZGF0YVtpXT8uc2VsZWN0ZWQsXHJcblx0XHRcdFx0XHRpbmRleCAgIDogaSxcclxuXHRcdFx0XHRcdHVpZCAgICAgOiB0aGlzLm1ha2VfdWlkKClcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc3luY19kZWZhdWx0X3ZhbHVlX2xvY2soIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuc3luY19wbGFjZWhvbGRlcl9sb2NrKCBwYW5lbCApO1xyXG5cdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGhhc19yb3dfZGVmYXVsdHMocGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgY2hlY2tzID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkudG9nZ2xlICk7XHJcblx0XHRcdGlmICggIWNoZWNrcz8ubGVuZ3RoICkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKysgKSBpZiAoIGNoZWNrc1tpXS5jaGVja2VkICkgcmV0dXJuIHRydWU7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgaXNfbXVsdGlwbGVfZW5hYmxlZChwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBjaGsgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5tdWx0aXBsZV9jaGsgKTtcclxuXHRcdFx0cmV0dXJuICEhKGNoayAmJiBjaGsuY2hlY2tlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIGhhc190ZXh0X2RlZmF1bHRfdmFsdWUocGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgZHYgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5kZWZhdWx0X3RleHQgKTtcclxuXHRcdFx0cmV0dXJuICEhKGR2ICYmIFN0cmluZyggZHYudmFsdWUgfHwgJycgKS50cmltKCkubGVuZ3RoKTtcclxuXHRcdH1cclxuXHJcblx0XHRzdGF0aWMgc3luY19kZWZhdWx0X3ZhbHVlX2xvY2socGFuZWwpIHtcclxuXHRcdFx0Y29uc3QgaW5wdXQgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5kZWZhdWx0X3RleHQgKTtcclxuXHRcdFx0Y29uc3Qgbm90ZSAgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggJy5qcy1kZWZhdWx0LXZhbHVlLW5vdGUnICk7XHJcblx0XHRcdGlmICggIWlucHV0ICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgbG9jayAgICAgPSB0aGlzLmhhc19yb3dfZGVmYXVsdHMoIHBhbmVsICk7XHJcblx0XHRcdGlucHV0LmRpc2FibGVkID0gISFsb2NrO1xyXG5cdFx0XHRpZiAoIGxvY2sgKSB7XHJcblx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdGlmICggbm90ZSApIG5vdGUuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlucHV0LnJlbW92ZUF0dHJpYnV0ZSggJ2FyaWEtZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0aWYgKCBub3RlICkgbm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIHN5bmNfcGxhY2Vob2xkZXJfbG9jayhwYW5lbCkge1xyXG5cdFx0XHRjb25zdCBpbnB1dCA9IHBhbmVsPy5xdWVyeVNlbGVjdG9yKCB0aGlzLnVpLnBsYWNlaG9sZGVyX2lucHV0ICk7XHJcblx0XHRcdGNvbnN0IG5vdGUgID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3IoIHRoaXMudWkucGxhY2Vob2xkZXJfbm90ZSApO1xyXG5cclxuXHRcdFx0Ly8gTkVXOiBjb21wdXRlIG11bHRpcGxlIGFuZCB0b2dnbGUgcm93IHZpc2liaWxpdHlcclxuXHRcdFx0Y29uc3QgaXNNdWx0aXBsZSAgICAgPSB0aGlzLmlzX211bHRpcGxlX2VuYWJsZWQoIHBhbmVsICk7XHJcblx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyUm93ID0gaW5wdXQ/LmNsb3Nlc3QoICcuaW5zcGVjdG9yX19yb3cnICkgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgc2l6ZUlucHV0ICAgICAgPSBwYW5lbD8ucXVlcnlTZWxlY3RvciggdGhpcy51aS5zaXplX2lucHV0ICkgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgc2l6ZVJvdyAgICAgICAgPSBzaXplSW5wdXQ/LmNsb3Nlc3QoICcuaW5zcGVjdG9yX19yb3cnICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIFNob3cgcGxhY2Vob2xkZXIgb25seSBmb3Igc2luZ2xlLXNlbGVjdDsgc2hvdyBzaXplIG9ubHkgZm9yIG11bHRpcGxlXHJcblx0XHRcdGlmICggcGxhY2Vob2xkZXJSb3cgKSBwbGFjZWhvbGRlclJvdy5zdHlsZS5kaXNwbGF5ID0gaXNNdWx0aXBsZSA/ICdub25lJyA6ICcnO1xyXG5cdFx0XHRpZiAoIHNpemVSb3cgKSBzaXplUm93LnN0eWxlLmRpc3BsYXkgPSBpc011bHRpcGxlID8gJycgOiAnbm9uZSc7XHJcblxyXG5cdFx0XHQvLyBFeGlzdGluZyBiZWhhdmlvciAoa2VlcCBhcy1pcylcclxuXHRcdFx0aWYgKCAhaW5wdXQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBsb2NrID0gaXNNdWx0aXBsZSB8fCB0aGlzLmhhc19yb3dfZGVmYXVsdHMoIHBhbmVsICkgfHwgdGhpcy5oYXNfdGV4dF9kZWZhdWx0X3ZhbHVlKCBwYW5lbCApO1xyXG5cdFx0XHRpZiAoIG5vdGUgJiYgIW5vdGUuaWQgKSBub3RlLmlkID0gJ3dwYmNfcGxhY2Vob2xkZXJfbm90ZV8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZyggMzYgKS5zbGljZSggMiwgMTAgKTtcclxuXHJcblx0XHRcdGlucHV0LmRpc2FibGVkID0gISFsb2NrO1xyXG5cdFx0XHRpZiAoIGxvY2sgKSB7XHJcblx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdGlmICggbm90ZSApIHtcclxuXHRcdFx0XHRcdG5vdGUuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG5cdFx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCAnYXJpYS1kZXNjcmliZWRieScsIG5vdGUuaWQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aW5wdXQucmVtb3ZlQXR0cmlidXRlKCAnYXJpYS1kaXNhYmxlZCcgKTtcclxuXHRcdFx0XHRpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoICdhcmlhLWRlc2NyaWJlZGJ5JyApO1xyXG5cdFx0XHRcdGlmICggbm90ZSApIG5vdGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRpYyBlbmZvcmNlX3NpbmdsZV9kZWZhdWx0KHBhbmVsLCBjbGlja2VkKSB7XHJcblx0XHRcdGlmICggdGhpcy5pc19tdWx0aXBsZV9lbmFibGVkKCBwYW5lbCApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgY2hlY2tzID0gcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMudWkudG9nZ2xlICk7XHJcblx0XHRcdGlmICggIWNoZWNrcz8ubGVuZ3RoICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0aWYgKCBjbGlja2VkICYmIGNsaWNrZWQuY2hlY2tlZCApIHtcclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKysgKSBpZiAoIGNoZWNrc1tpXSAhPT0gY2xpY2tlZCApIHtcclxuXHRcdFx0XHRcdGNoZWNrc1tpXS5jaGVja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRjaGVja3NbaV0uc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjbGlja2VkLnNldEF0dHJpYnV0ZSggJ2FyaWEtY2hlY2tlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGtlcHQgPSBmYWxzZTtcclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgY2hlY2tzLmxlbmd0aDsgaisrICkgaWYgKCBjaGVja3Nbal0uY2hlY2tlZCApIHtcclxuXHRcdFx0XHRpZiAoICFrZXB0ICkge1xyXG5cdFx0XHRcdFx0a2VwdCA9IHRydWU7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNoZWNrc1tqXS5jaGVja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRjaGVja3Nbal0uc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zeW5jX2RlZmF1bHRfdmFsdWVfbG9jayggcGFuZWwgKTtcclxuXHRcdFx0dGhpcy5zeW5jX3BsYWNlaG9sZGVyX2xvY2soIHBhbmVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gLS0tLSBvbmUtdGltZSBib290c3RyYXAgb2YgYSBwYW5lbCAtLS0tXHJcblx0XHRzdGF0aWMgYm9vdHN0cmFwX3BhbmVsKHBhbmVsKSB7XHJcblx0XHRcdGlmICggIXBhbmVsICkgcmV0dXJuO1xyXG5cdFx0XHRpZiAoICFwYW5lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19vcHRpb25zX2VkaXRvcicgKSApIHJldHVybjsgLy8gb25seSBzZWxlY3QtbGlrZSBVSXNcclxuXHRcdFx0aWYgKCBwYW5lbC5kYXRhc2V0LnNlbGVjdGJhc2VfYm9vdHN0cmFwcGVkID09PSAnMScgKSB7XHJcblx0XHRcdFx0dGhpcy5lbnN1cmVfc29ydGFibGUoIHBhbmVsICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlYnVpbGRfaWZfZW1wdHkoIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuZW5zdXJlX3NvcnRhYmxlKCBwYW5lbCApO1xyXG5cdFx0XHRwYW5lbC5kYXRhc2V0LnNlbGVjdGJhc2VfYm9vdHN0cmFwcGVkID0gJzEnO1xyXG5cclxuXHRcdFx0dGhpcy5zeW5jX2RlZmF1bHRfdmFsdWVfbG9jayggcGFuZWwgKTtcclxuXHRcdFx0dGhpcy5zeW5jX3BsYWNlaG9sZGVyX2xvY2soIHBhbmVsICk7XHJcblx0XHRcdHRoaXMuc3luY192YWx1ZV9pbnB1dHNfdmlzaWJpbGl0eSggcGFuZWwgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyAtLS0tIGhvb2sgaW50byBpbnNwZWN0b3IgbGlmZWN5Y2xlIChmaXJlcyBPTkNFKSAtLS0tXHJcblx0XHRzdGF0aWMgd2lyZV9vbmNlKCkge1xyXG5cdFx0XHRpZiAoIENvcmUuX19zZWxlY3RiYXNlX3dpcmVkICkgcmV0dXJuO1xyXG5cdFx0XHRDb3JlLl9fc2VsZWN0YmFzZV93aXJlZCA9IHRydWU7XHJcblxyXG5cdFx0XHRjb25zdCBvbl9yZWFkeV9vcl9yZW5kZXIgPSAoZXYpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYW5lbCA9IGV2Py5kZXRhaWw/LnBhbmVsO1xyXG5cdFx0XHRcdGNvbnN0IGZpZWxkID0gZXY/LmRldGFpbD8uZWwgfHwgZXY/LmRldGFpbD8uZmllbGQgfHwgbnVsbDtcclxuXHRcdFx0XHRpZiAoICFwYW5lbCApIHJldHVybjtcclxuXHRcdFx0XHRpZiAoIGZpZWxkICkgcGFuZWwuX19zZWxlY3RiYXNlX2ZpZWxkID0gZmllbGQ7XHJcblx0XHRcdFx0dGhpcy5ib290c3RyYXBfcGFuZWwoIHBhbmVsICk7XHJcblx0XHRcdFx0Ly8gSWYgdGhlIGluc3BlY3RvciByb290IHdhcyByZW1vdW50ZWQsIGVuc3VyZSByb290IGxpc3RlbmVycyBhcmUgKHJlKWJvdW5kLlxyXG5cdFx0XHRcdHRoaXMud2lyZV9yb290X2xpc3RlbmVycygpO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScsIG9uX3JlYWR5X29yX3JlbmRlciApO1xyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnd3BiY19iZmJfaW5zcGVjdG9yX3JlbmRlcicsIG9uX3JlYWR5X29yX3JlbmRlciApO1xyXG5cclxuXHRcdFx0dGhpcy53aXJlX3Jvb3RfbGlzdGVuZXJzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGljIHdpcmVfcm9vdF9saXN0ZW5lcnMoKSB7XHJcblxyXG5cdFx0XHQvLyBJZiBhbHJlYWR5IHdpcmVkIEFORCB0aGUgc3RvcmVkIHJvb3QgaXMgc3RpbGwgaW4gdGhlIERPTSwgYmFpbCBvdXQuXHJcblx0XHRcdGlmICggdGhpcy5fX3Jvb3Rfd2lyZWQgJiYgdGhpcy5fX3Jvb3Rfbm9kZT8uaXNDb25uZWN0ZWQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRpZiAoICFyb290ICkge1xyXG5cdFx0XHRcdC8vIFJvb3QgbWlzc2luZyAoZS5nLiwgU1BBIHJlLXJlbmRlcikg4oCUIGNsZWFyIGZsYWdzIHNvIHdlIGNhbiB3aXJlIGxhdGVyLlxyXG5cdFx0XHRcdHRoaXMuX19yb290X3dpcmVkID0gZmFsc2U7XHJcblx0XHRcdFx0dGhpcy5fX3Jvb3Rfbm9kZSAgPSBudWxsO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fX3Jvb3Rfbm9kZSAgICAgICAgICAgICAgICAgICA9IHJvb3Q7XHJcblx0XHRcdHRoaXMuX19yb290X3dpcmVkICAgICAgICAgICAgICAgICAgPSB0cnVlO1xyXG5cdFx0XHRyb290LmRhdGFzZXQuc2VsZWN0YmFzZV9yb290X3dpcmVkID0gJzEnO1xyXG5cclxuXHRcdFx0Y29uc3QgZ2V0X3BhbmVsID0gKHRhcmdldCkgPT5cclxuXHRcdFx0XHR0YXJnZXQ/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9faW5zcGVjdG9yX19ib2R5JyApIHx8XHJcblx0XHRcdFx0cm9vdC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19pbnNwZWN0b3JfX2JvZHknICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIENsaWNrIGhhbmRsZXJzOiBhZGQgLyBkZWxldGUgLyBkdXBsaWNhdGVcclxuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHBhbmVsID0gZ2V0X3BhbmVsKCBlLnRhcmdldCApO1xyXG5cdFx0XHRcdGlmICggIXBhbmVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJvb3RzdHJhcF9wYW5lbCggcGFuZWwgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdWkgPSB0aGlzLnVpO1xyXG5cclxuXHRcdFx0XHQvLyBFeGlzdGluZyBcIkFkZCBvcHRpb25cIiBidXR0b24gKHRvcCB0b29sYmFyKVxyXG5cdFx0XHRcdGNvbnN0IGFkZCA9IGUudGFyZ2V0LmNsb3Nlc3Q/LiggdWkuYWRkX2J0biApO1xyXG5cdFx0XHRcdGlmICggYWRkICkge1xyXG5cdFx0XHRcdFx0dGhpcy5hcHBlbmRfcm93KCBwYW5lbCwgeyBsYWJlbDogJycsIHZhbHVlOiAnJywgc2VsZWN0ZWQ6IGZhbHNlIH0gKTtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBEcm9wZG93biBtZW51IGFjdGlvbnMuXHJcblx0XHRcdFx0Y29uc3QgbWVudV9hY3Rpb24gPSBlLnRhcmdldC5jbG9zZXN0Py4oIHVpLm1lbnVfYWN0aW9uICk7XHJcblx0XHRcdFx0aWYgKCBtZW51X2FjdGlvbiApIHtcclxuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uID0gKG1lbnVfYWN0aW9uLmdldEF0dHJpYnV0ZSggJ2RhdGEtYWN0aW9uJyApIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0Y29uc3Qgcm93ICAgID0gbWVudV9hY3Rpb24uY2xvc2VzdD8uKCB1aS5yb3cgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoICFyb3cgKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuY2xvc2VfZHJvcGRvd24oIG1lbnVfYWN0aW9uICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICdhZGRfYWZ0ZXInID09PSBhY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdC8vIEFkZCBlbXB0eSByb3cgYWZ0ZXIgY3VycmVudFxyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2X2NvdW50ID0gdGhpcy5nZXRfbGlzdCggcGFuZWwgKT8uY2hpbGRyZW4ubGVuZ3RoIHx8IDA7XHJcblx0XHRcdFx0XHRcdHRoaXMuYXBwZW5kX3JvdyggcGFuZWwsIHsgbGFiZWw6ICcnLCB2YWx1ZTogJycsIHNlbGVjdGVkOiBmYWxzZSB9ICk7XHJcblx0XHRcdFx0XHRcdC8vIE1vdmUgdGhlIG5ld2x5IGFkZGVkIGxhc3Qgcm93IGp1c3QgYWZ0ZXIgY3VycmVudCByb3cgdG8gcHJlc2VydmUgXCJhZGQgYWZ0ZXJcIlxyXG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ID0gdGhpcy5nZXRfbGlzdCggcGFuZWwgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBsaXN0ICYmIGxpc3QubGFzdEVsZW1lbnRDaGlsZCAmJiBsaXN0Lmxhc3RFbGVtZW50Q2hpbGQgIT09IHJvdyApIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmluc2VydF9hZnRlciggbGlzdC5sYXN0RWxlbWVudENoaWxkLCByb3cgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbW1pdF9vcHRpb25zKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAnZHVwbGljYXRlJyA9PT0gYWN0aW9uICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBsYmwgPSAocm93LnF1ZXJ5U2VsZWN0b3IoIHVpLmxhYmVsICkgfHwge30pLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB2YWwgPSAocm93LnF1ZXJ5U2VsZWN0b3IoIHVpLnZhbHVlICkgfHwge30pLnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzZWwgPSAhISgocm93LnF1ZXJ5U2VsZWN0b3IoIHVpLnRvZ2dsZSApIHx8IHt9KS5jaGVja2VkKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRfcm93KCBwYW5lbCwgeyBsYWJlbDogbGJsLCB2YWx1ZTogdmFsLCBzZWxlY3RlZDogc2VsLCB1aWQ6IHRoaXMubWFrZV91aWQoKSB9ICk7XHJcblx0XHRcdFx0XHRcdC8vIFBsYWNlIHRoZSBuZXcgcm93IHJpZ2h0IGFmdGVyIHRoZSBjdXJyZW50LlxyXG5cdFx0XHRcdFx0XHRjb25zdCBsaXN0ID0gdGhpcy5nZXRfbGlzdCggcGFuZWwgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggbGlzdCAmJiBsaXN0Lmxhc3RFbGVtZW50Q2hpbGQgJiYgbGlzdC5sYXN0RWxlbWVudENoaWxkICE9PSByb3cgKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5pbnNlcnRfYWZ0ZXIoIGxpc3QubGFzdEVsZW1lbnRDaGlsZCwgcm93ICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGhpcy5lbmZvcmNlX3NpbmdsZV9kZWZhdWx0KCBwYW5lbCwgbnVsbCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbW1pdF9vcHRpb25zKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN5bmNfdmFsdWVfaW5wdXRzX3Zpc2liaWxpdHkoIHBhbmVsICk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAncmVtb3ZlJyA9PT0gYWN0aW9uICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIHJvdyAmJiByb3cucGFyZW50Tm9kZSApIHJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByb3cgKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5jb21taXRfb3B0aW9ucyggcGFuZWwgKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5zeW5jX3ZhbHVlX2lucHV0c192aXNpYmlsaXR5KCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuY2xvc2VfZHJvcGRvd24oIG1lbnVfYWN0aW9uICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSwgdHJ1ZSApO1xyXG5cclxuXHJcblx0XHRcdC8vIElucHV0IGRlbGVnYXRpb24uXHJcblx0XHRcdHJvb3QuYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYW5lbCA9IGdldF9wYW5lbCggZS50YXJnZXQgKTtcclxuXHRcdFx0XHRpZiAoICEgcGFuZWwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IHVpICAgICAgICAgICAgICAgID0gdGhpcy51aTtcclxuXHRcdFx0XHRjb25zdCBpc19sYWJlbF9vcl92YWx1ZSA9IGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LWxhYmVsJyApIHx8IGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LXZhbHVlJyApO1xyXG5cdFx0XHRcdGNvbnN0IGlzX3RvZ2dsZSAgICAgICAgID0gZS50YXJnZXQuY2xhc3NMaXN0Py5jb250YWlucyggJ3dwYmNfYmZiX19vcHQtc2VsZWN0ZWQtY2hrJyApO1xyXG5cdFx0XHRcdGNvbnN0IGlzX211bHRpcGxlICAgICAgID0gZS50YXJnZXQubWF0Y2hlcz8uKCB1aS5tdWx0aXBsZV9jaGsgKTtcclxuXHRcdFx0XHRjb25zdCBpc19kZWZhdWx0X3RleHQgICA9IGUudGFyZ2V0Lm1hdGNoZXM/LiggdWkuZGVmYXVsdF90ZXh0ICk7XHJcblx0XHRcdFx0Y29uc3QgaXNfdmFsdWVfZGlmZmVycyAgPSBlLnRhcmdldC5tYXRjaGVzPy4oIHVpLnZhbHVlX2RpZmZlcnNfY2hrICk7XHJcblxyXG5cdFx0XHRcdC8vIEhhbmRsZSBcInZhbHVlIGRpZmZlcnNcIiB0b2dnbGUgbGl2ZVxyXG5cdFx0XHRcdGlmICggaXNfdmFsdWVfZGlmZmVycyApIHtcclxuXHRcdFx0XHRcdHRoaXMuc3luY192YWx1ZV9pbnB1dHNfdmlzaWJpbGl0eSggcGFuZWwgKTtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0X29wdGlvbnMoIHBhbmVsICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBUcmFjayB3aGVuIHRoZSB1c2VyIGVkaXRzIFZBTFVFIGV4cGxpY2l0bHlcclxuXHRcdFx0XHRpZiAoIGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LXZhbHVlJyApICkge1xyXG5cdFx0XHRcdFx0Y29uc3Qgcm93ID0gZS50YXJnZXQuY2xvc2VzdCggdGhpcy51aS5yb3cgKTtcclxuXHRcdFx0XHRcdHRoaXMubWFya19yb3dfdmFsdWVfdXNlcl90b3VjaGVkKCByb3cgKTtcclxuXHRcdFx0XHRcdC8vIEtlZXAgdGhlIGNhY2hlIHVwZGF0ZWQgc28gdG9nZ2xpbmcgT0ZGL09OIGxhdGVyIHJlc3RvcmVzIHRoZSBsYXRlc3QgY3VzdG9tIHZhbHVlXHJcblx0XHRcdFx0XHRlLnRhcmdldC5kYXRhc2V0LmNhY2hlZF92YWx1ZSA9IGUudGFyZ2V0LnZhbHVlIHx8ICcnO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gQXV0by1maWxsIFZBTFVFIGZyb20gTEFCRUwgaWYgdmFsdWUgaXMgZnJlc2ggKGFuZCBkaWZmZXJzIGlzIE9OKTsgaWYgZGlmZmVycyBpcyBPRkYsIHdlIG1pcnJvciBhbnl3YXkgaW4gY29tbWl0XHJcblx0XHRcdFx0aWYgKCBlLnRhcmdldC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX29wdC1sYWJlbCcgKSApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHJvdyAgICAgPSBlLnRhcmdldC5jbG9zZXN0KCB1aS5yb3cgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbF9pbiAgPSByb3c/LnF1ZXJ5U2VsZWN0b3IoIHVpLnZhbHVlICk7XHJcblx0XHRcdFx0XHRjb25zdCBkaWZmZXJzID0gdGhpcy5pc192YWx1ZV9kaWZmZXJzX2VuYWJsZWQoIHBhbmVsICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB2YWxfaW4gKSB7XHJcblx0XHRcdFx0XHRcdGlmICggIWRpZmZlcnMgKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gc2luZ2xlLWlucHV0IG1vZGU6IG1pcnJvciBodW1hbiBsYWJlbCB3aXRoIG1pbmltYWwgZXNjYXBpbmdcclxuXHRcdFx0XHRcdFx0XHR2YWxfaW4udmFsdWUgPSB0aGlzLmJ1aWxkX3ZhbHVlX2Zyb21fbGFiZWwoIGUudGFyZ2V0LnZhbHVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhdGhpcy5pc19yb3dfdmFsdWVfdXNlcl90b3VjaGVkKCByb3cgKSApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBzZXBhcmF0ZS12YWx1ZSBtb2RlLCBvbmx5IHdoaWxlIGZyZXNoXHJcblx0XHRcdFx0XHRcdFx0dmFsX2luLnZhbHVlID0gdGhpcy5idWlsZF92YWx1ZV9mcm9tX2xhYmVsKCBlLnRhcmdldC52YWx1ZSwgdHJ1ZSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0aWYgKCBpc19sYWJlbF9vcl92YWx1ZSB8fCBpc190b2dnbGUgfHwgaXNfbXVsdGlwbGUgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGlzX3RvZ2dsZSApIGUudGFyZ2V0LnNldEF0dHJpYnV0ZSggJ2FyaWEtY2hlY2tlZCcsIGUudGFyZ2V0LmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnICk7XHJcblx0XHRcdFx0XHRpZiAoIGlzX3RvZ2dsZSB8fCBpc19tdWx0aXBsZSApIHRoaXMuZW5mb3JjZV9zaW5nbGVfZGVmYXVsdCggcGFuZWwsIGlzX3RvZ2dsZSA/IGUudGFyZ2V0IDogbnVsbCApO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21taXRfb3B0aW9ucyggcGFuZWwgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggaXNfZGVmYXVsdF90ZXh0ICkge1xyXG5cdFx0XHRcdFx0dGhpcy5zeW5jX2RlZmF1bHRfdmFsdWVfbG9jayggcGFuZWwgKTtcclxuXHRcdFx0XHRcdHRoaXMuc3luY19wbGFjZWhvbGRlcl9sb2NrKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgaG9sZGVyID0gdGhpcy5nZXRfaG9sZGVyKCBwYW5lbCApO1xyXG5cdFx0XHRcdFx0aWYgKCBob2xkZXIgKSB7XHJcblx0XHRcdFx0XHRcdGhvbGRlci5kaXNwYXRjaEV2ZW50KCBuZXcgRXZlbnQoICdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHRcdFx0aG9sZGVyLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIHRydWUgKTtcclxuXHJcblxyXG5cdFx0XHQvLyBDaGFuZ2UgZGVsZWdhdGlvblxyXG5cdFx0XHRyb290LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCAoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHBhbmVsID0gZ2V0X3BhbmVsKCBlLnRhcmdldCApO1xyXG5cdFx0XHRcdGlmICggIXBhbmVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1aSAgICAgICAgPSB0aGlzLnVpO1xyXG5cdFx0XHRcdGNvbnN0IGlzX3RvZ2dsZSA9IGUudGFyZ2V0LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fb3B0LXNlbGVjdGVkLWNoaycgKTtcclxuXHRcdFx0XHRjb25zdCBpc19tdWx0aSAgPSBlLnRhcmdldC5tYXRjaGVzPy4oIHVpLm11bHRpcGxlX2NoayApO1xyXG5cdFx0XHRcdGlmICggIWlzX3RvZ2dsZSAmJiAhaXNfbXVsdGkgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdGlmICggaXNfdG9nZ2xlICkgZS50YXJnZXQuc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgZS50YXJnZXQuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScgKTtcclxuXHRcdFx0XHR0aGlzLmVuZm9yY2Vfc2luZ2xlX2RlZmF1bHQoIHBhbmVsLCBpc190b2dnbGUgPyBlLnRhcmdldCA6IG51bGwgKTtcclxuXHRcdFx0XHR0aGlzLmNvbW1pdF9vcHRpb25zKCBwYW5lbCApO1xyXG5cdFx0XHR9LCB0cnVlICk7XHJcblxyXG5cdFx0XHQvLyBMYXp5IGJvb3RzdHJhcFxyXG5cdFx0XHRyb290LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYW5lbCA9IGdldF9wYW5lbCggZS50YXJnZXQgKTtcclxuXHRcdFx0XHRpZiAoIHBhbmVsICYmIGUudGFyZ2V0Py5jbG9zZXN0Py4oIHRoaXMudWkubGlzdCApICkgdGhpcy5ib290c3RyYXBfcGFuZWwoIHBhbmVsICk7XHJcblx0XHRcdH0sIHRydWUgKTtcclxuXHJcblx0XHRcdHJvb3QuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZG93bicsIChlKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgcGFuZWwgPSBnZXRfcGFuZWwoIGUudGFyZ2V0ICk7XHJcblx0XHRcdFx0aWYgKCBwYW5lbCAmJiBlLnRhcmdldD8uY2xvc2VzdD8uKCB0aGlzLnVpLmRyYWdfaGFuZGxlICkgKSB0aGlzLmJvb3RzdHJhcF9wYW5lbCggcGFuZWwgKTtcclxuXHRcdFx0fSwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHR0cnkgeyBDb3JlLldQQkNfQkZCX1NlbGVjdF9CYXNlLndpcmVfb25jZSgpOyB9IGNhdGNoIChfKSB7fVxyXG5cdC8vIFRyeSBpbW1lZGlhdGVseSAoaWYgcm9vdCBpcyBhbHJlYWR5IGluIERPTSksIHRoZW4gYWdhaW4gb24gRE9NQ29udGVudExvYWRlZC5cclxuXHRDb3JlLldQQkNfQkZCX1NlbGVjdF9CYXNlLndpcmVfcm9vdF9saXN0ZW5lcnMoKTtcclxuXHJcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgQ29yZS5XUEJDX0JGQl9TZWxlY3RfQmFzZS53aXJlX3Jvb3RfbGlzdGVuZXJzKCk7ICB9KTtcclxuXHJcbn0oIHdpbmRvdyApKTsiLCIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gPT0gRmlsZSAgL2luY2x1ZGVzL3BhZ2UtZm9ybS1idWlsZGVyL19vdXQvY29yZS9iZmItdWkuanMgPT0gfCAyMDI1LTA5LTEwIDE1OjQ3XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4oZnVuY3Rpb24gKHcsIGQpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8vIFNpbmdsZSBnbG9iYWwgbmFtZXNwYWNlIChpZGVtcG90ZW50ICYgbG9hZC1vcmRlciBzYWZlKS5cclxuXHRjb25zdCBDb3JlID0gKHcuV1BCQ19CRkJfQ29yZSA9IHcuV1BCQ19CRkJfQ29yZSB8fCB7fSk7XHJcblx0Y29uc3QgVUkgICA9IChDb3JlLlVJID0gQ29yZS5VSSB8fCB7fSk7XHJcblxyXG5cdC8vIC0tLSBIaWdobGlnaHQgRWxlbWVudCwgIGxpa2UgR2VuZXJhdG9yIGJybiAgLSAgVGlueSBVSSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFVJLl9wdWxzZV90aW1lcnMgPSBVSS5fcHVsc2VfdGltZXJzIHx8IG5ldyBNYXAoKTsgLy8gZWwgLT4gdGltZXJfaWRcclxuXHRVSS5fcHVsc2VfbWV0YSAgID0gVUkuX3B1bHNlX21ldGEgICB8fCBuZXcgTWFwKCk7IC8vIGVsIC0+IHsgdG9rZW4sIGxhc3RfdHMsIGRlYm91bmNlX2lkLCBjb2xvcl9zZXQgfVxyXG5cdC8vIFB1bHNlIHR1bmluZyAobWlsbGlzZWNvbmRzKS5cclxuXHRVSS5QVUxTRV9USFJPVFRMRV9NUyAgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlBVTFNFX1RIUk9UVExFX01TICkgPyBVSS5QVUxTRV9USFJPVFRMRV9NUyA6IDUwMDtcclxuXHRVSS5QVUxTRV9ERUJPVU5DRV9NUyAgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlBVTFNFX0RFQk9VTkNFX01TICkgPyBVSS5QVUxTRV9ERUJPVU5DRV9NUyA6IDc1MDtcclxuXHJcblx0Ly8gRGVib3VuY2UgU1RSVUNUVVJFX0NIQU5HRSBmb3IgY29udGludW91cyBpbnNwZWN0b3IgY29udHJvbHMgKHNsaWRlcnMgLyBzY3J1YmJpbmcpLlxyXG5cdC8vIFR1bmU6IDE4MC4uMzUwIGlzIHVzdWFsbHkgYSBzd2VldCBzcG90LlxyXG5cdFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgKSA/IFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgOiAxODA7XHJcblx0Ly8gQ2hhbmdlIHRoaXMgdG8gdHVuZSBzcGVlZDogNTAuLjEyMCBtcyBpcyBhIGdvb2QgcmFuZ2UuIENhbiBiZSBjb25maWd1cmVkIGluIDxkaXYgZGF0YS1sZW4tZ3JvdXAgZGF0YS1sZW4tdGhyb3R0bGU9XCIxODBcIj4uLi48L2Rpdj4uXHJcblx0VUkuVkFMVUVfU0xJREVSX1RIUk9UVExFX01TID0gTnVtYmVyLmlzRmluaXRlKCBVSS5WQUxVRV9TTElERVJfVEhST1RUTEVfTVMgKSA/IFVJLlZBTFVFX1NMSURFUl9USFJPVFRMRV9NUyA6IDEyMDtcclxuXHJcblx0LyoqXHJcblx0ICogQ2FuY2VsIGFueSBydW5uaW5nIHB1bHNlIHNlcXVlbmNlIGZvciBhbiBlbGVtZW50LlxyXG5cdCAqIFVzZXMgdG9rZW4gaW52YWxpZGF0aW9uIHNvIGFscmVhZHktc2NoZWR1bGVkIGNhbGxiYWNrcyBiZWNvbWUgbm8tb3BzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHQgKi9cclxuXHRVSS5jYW5jZWxfcHVsc2UgPSBmdW5jdGlvbiAoZWwpIHtcclxuXHRcdGlmICggIWVsICkgeyByZXR1cm47IH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCggVUkuX3B1bHNlX3RpbWVycy5nZXQoIGVsICkgKTtcclxuXHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFVJLl9wdWxzZV90aW1lcnMuZGVsZXRlKCBlbCApO1xyXG5cclxuXHRcdHZhciBtZXRhID0gVUkuX3B1bHNlX21ldGEuZ2V0KCBlbCApIHx8IHt9O1xyXG5cdFx0bWV0YS50b2tlbiA9IChOdW1iZXIuaXNGaW5pdGUoIG1ldGEudG9rZW4gKSA/IG1ldGEudG9rZW4gOiAwKSArIDE7XHJcblx0XHRtZXRhLmNvbG9yX3NldCA9IGZhbHNlO1xyXG5cdFx0dHJ5IHsgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19zY3JvbGwtcHVsc2UnLCAnd3BiY19iZmJfX2hpZ2hsaWdodC1wdWxzZScgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0dHJ5IHsgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoICctLXdwYmMtYmZiLXB1bHNlLWNvbG9yJyApOyB9IGNhdGNoICggXyApIHt9XHJcblx0XHRVSS5fcHVsc2VfbWV0YS5zZXQoIGVsLCBtZXRhICk7XHJcblx0XHR0cnkgeyBjbGVhclRpbWVvdXQoIG1ldGEuZGVib3VuY2VfaWQgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0bWV0YS5kZWJvdW5jZV9pZCA9IDA7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogRm9yY2UtcmVzdGFydCBhIENTUyBhbmltYXRpb24gb24gYSBjbGFzcy5cclxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjbHNcclxuXHQgKi9cclxuXHRVSS5fcmVzdGFydF9jc3NfYW5pbWF0aW9uID0gZnVuY3Rpb24gKGVsLCBjbHMpIHtcclxuXHRcdGlmICggISBlbCApIHsgcmV0dXJuOyB9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRlbC5jbGFzc0xpc3QucmVtb3ZlKCBjbHMgKTtcclxuXHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdC8vIEZvcmNlIHJlZmxvdyBzbyB0aGUgbmV4dCBhZGQoKSByZXRyaWdnZXJzIHRoZSBrZXlmcmFtZXMuXHJcblx0XHR2b2lkIGVsLm9mZnNldFdpZHRoO1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZWwuY2xhc3NMaXN0LmFkZCggY2xzICk7XHJcblx0XHR9IGNhdGNoICggXyApIHt9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0XHRTaW5nbGUgcHVsc2UgKGJhY2stY29tcGF0KS5cclxuXHRcdEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcblx0XHRAcGFyYW0ge251bWJlcn0gZHVyX21zXHJcblx0ICovXHJcblx0VUkucHVsc2Vfb25jZSA9IGZ1bmN0aW9uIChlbCwgZHVyX21zKSB7XHJcblx0XHRpZiAoICEgZWwgKSB7IHJldHVybjsgfVxyXG5cdFx0dmFyIGNscyA9ICd3cGJjX2JmYl9fc2Nyb2xsLXB1bHNlJztcclxuXHRcdHZhciBtcyAgPSBOdW1iZXIuaXNGaW5pdGUoIGR1cl9tcyApID8gZHVyX21zIDogNzAwO1xyXG5cclxuXHRcdFVJLmNhbmNlbF9wdWxzZSggZWwgKTtcclxuXHJcblx0XHR2YXIgbWV0YSAgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHR2YXIgdG9rZW4gPSAoTnVtYmVyLmlzRmluaXRlKCBtZXRhLnRva2VuICkgPyBtZXRhLnRva2VuIDogMCkgKyAxO1xyXG5cdFx0bWV0YS50b2tlbiA9IHRva2VuO1xyXG5cdFx0VUkuX3B1bHNlX21ldGEuc2V0KCBlbCwgbWV0YSApO1xyXG5cclxuXHRcdFVJLl9yZXN0YXJ0X2Nzc19hbmltYXRpb24oIGVsLCBjbHMgKTtcclxuXHRcdHZhciB0ID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHQvLyBpZ25vcmUgaWYgYSBuZXdlciBwdWxzZSBzdGFydGVkLlxyXG5cdFx0XHR2YXIgbSA9IFVJLl9wdWxzZV9tZXRhLmdldCggZWwgKSB8fCB7fTtcclxuXHRcdFx0aWYgKCBtLnRva2VuICE9PSB0b2tlbiApIHsgcmV0dXJuOyB9XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZSggY2xzICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFx0VUkuX3B1bHNlX3RpbWVycy5kZWxldGUoIGVsICk7XHJcblx0XHR9LCBtcyApO1xyXG5cdFx0VUkuX3B1bHNlX3RpbWVycy5zZXQoIGVsLCB0ICk7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0XHRNdWx0aS1ibGluayBzZXF1ZW5jZSB3aXRoIG9wdGlvbmFsIHBlci1jYWxsIGNvbG9yIG92ZXJyaWRlLlxyXG5cdFx0QHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbdGltZXM9M11cclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbb25fbXM9MjgwXVxyXG5cdFx0QHBhcmFtIHtudW1iZXJ9IFtvZmZfbXM9MTgwXVxyXG5cdFx0QHBhcmFtIHtzdHJpbmd9IFtoZXhfY29sb3JdIE9wdGlvbmFsIENTUyBjb2xvciAoZS5nLiAnI2ZmNGQ0Zicgb3IgJ3JnYiguLi4pJykuXHJcblx0ICovXHJcblx0VUkucHVsc2Vfc2VxdWVuY2UgPSBmdW5jdGlvbiAoZWwsIHRpbWVzLCBvbl9tcywgb2ZmX21zLCBoZXhfY29sb3IpIHtcclxuXHRcdGlmICggIWVsIHx8ICFkLmJvZHkuY29udGFpbnMoIGVsICkgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHZhciBjbHMgICA9ICd3cGJjX2JmYl9faGlnaGxpZ2h0LXB1bHNlJztcclxuXHRcdHZhciBjb3VudCA9IE51bWJlci5pc0Zpbml0ZSggdGltZXMgKSA/IHRpbWVzIDogMjtcclxuXHRcdHZhciBvbiAgICA9IE51bWJlci5pc0Zpbml0ZSggb25fbXMgKSA/IG9uX21zIDogMjgwO1xyXG5cdFx0dmFyIG9mZiAgID0gTnVtYmVyLmlzRmluaXRlKCBvZmZfbXMgKSA/IG9mZl9tcyA6IDE4MDtcclxuXHJcblx0XHQvLyBUaHJvdHRsZTogYXZvaWQgcmVmbG93IHNwYW0gaWYgY2FsbGVkIHJlcGVhdGVkbHkgd2hpbGUgdHlwaW5nL2RyYWdnaW5nLlxyXG5cdFx0dmFyIG1ldGEgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHR2YXIgbm93ICA9IERhdGUubm93KCk7XHJcblx0XHR2YXIgdGhyb3R0bGVfbXMgPSBOdW1iZXIuaXNGaW5pdGUoIFVJLlBVTFNFX1RIUk9UVExFX01TICkgPyBVSS5QVUxTRV9USFJPVFRMRV9NUyA6IDEyMDtcclxuXHRcdGlmICggTnVtYmVyLmlzRmluaXRlKCBtZXRhLmxhc3RfdHMgKSAmJiAobm93IC0gbWV0YS5sYXN0X3RzKSA8IHRocm90dGxlX21zICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRtZXRhLmxhc3RfdHMgPSBub3c7XHJcblxyXG5cdFx0Ly8gY2FuY2VsIGFueSBydW5uaW5nIHB1bHNlIGFuZCByZXNldCBjbGFzcyAodG9rZW4gaW52YWxpZGF0aW9uKS5cclxuXHRcdFVJLmNhbmNlbF9wdWxzZSggZWwgKTtcclxuXHJcblx0XHQvLyBuZXcgdG9rZW4gZm9yIHRoaXMgcnVuXHJcblx0XHR2YXIgdG9rZW4gPSAoTnVtYmVyLmlzRmluaXRlKCBtZXRhLnRva2VuICkgPyBtZXRhLnRva2VuIDogMCkgKyAxO1xyXG5cdFx0bWV0YS50b2tlbiA9IHRva2VuO1xyXG5cclxuXHRcdHZhciBoYXZlX2NvbG9yID0gISFoZXhfY29sb3IgJiYgdHlwZW9mIGhleF9jb2xvciA9PT0gJ3N0cmluZyc7XHJcblx0XHRpZiAoIGhhdmVfY29sb3IgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0ZWwuc3R5bGUuc2V0UHJvcGVydHkoICctLXdwYmMtYmZiLXB1bHNlLWNvbG9yJywgaGV4X2NvbG9yICk7XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFx0bWV0YS5jb2xvcl9zZXQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0VUkuX3B1bHNlX21ldGEuc2V0KCBlbCwgbWV0YSApO1xyXG5cclxuXHRcdHZhciBpID0gMDtcclxuXHRcdChmdW5jdGlvbiB0aWNrKCkge1xyXG5cdFx0XHR2YXIgbSA9IFVJLl9wdWxzZV9tZXRhLmdldCggZWwgKSB8fCB7fTtcclxuXHRcdFx0aWYgKCBtLnRva2VuICE9PSB0b2tlbiApIHtcclxuXHRcdFx0XHQvLyBjYW5jZWxlZC9yZXBsYWNlZFxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGkgPj0gY291bnQgKSB7XHJcblx0XHRcdFx0VUkuX3B1bHNlX3RpbWVycy5kZWxldGUoIGVsICk7XHJcblx0XHRcdFx0aWYgKCBoYXZlX2NvbG9yICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0ZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoICctLXdwYmMtYmZiLXB1bHNlLWNvbG9yJyApO1xyXG5cdFx0XHRcdFx0fSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0VUkuX3Jlc3RhcnRfY3NzX2FuaW1hdGlvbiggZWwsIGNscyApO1xyXG5cdFx0XHRVSS5fcHVsc2VfdGltZXJzLnNldCggZWwsIHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsgICAgIC8vIE9OIC0+IE9GRlxyXG5cdFx0XHRcdHZhciBtMiA9IFVJLl9wdWxzZV9tZXRhLmdldCggZWwgKSB8fCB7fTtcclxuXHRcdFx0XHRpZiAoIG0yLnRva2VuICE9PSB0b2tlbiApIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGVsLmNsYXNzTGlzdC5yZW1vdmUoIGNscyApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRVSS5fcHVsc2VfdGltZXJzLnNldCggZWwsIHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsgLy8gT0ZGIGdhcCAtPiBuZXh0XHJcblx0XHRcdFx0XHR2YXIgbTMgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHRcdFx0XHRpZiAoIG0zLnRva2VuICE9PSB0b2tlbiApIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0XHRpKys7XHJcblx0XHRcdFx0XHR0aWNrKCk7XHJcblx0XHRcdFx0fSwgb2ZmICkgKTtcclxuXHRcdFx0fSwgb24gKSApO1xyXG5cdFx0fSkoKTtcclxuXHR9O1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRGVib3VuY2VkIHF1ZXJ5ICsgcHVsc2UuXHJcblx0ICogVXNlZnVsIGZvciBgaW5wdXRgIGV2ZW50cyAoc2xpZGVycyAvIHR5cGluZykgdG8gYXZvaWQgZm9yY2VkIHJlZmxvdyBzcGFtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IHJvb3Rfb3Jfc2VsZWN0b3JcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2FpdF9tc1xyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYV1cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2JdXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtjXVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JdXHJcblx0ICovXHJcblx0VUkucHVsc2VfcXVlcnlfZGVib3VuY2VkID0gZnVuY3Rpb24gKHJvb3Rfb3Jfc2VsZWN0b3IsIHNlbGVjdG9yLCB3YWl0X21zLCBhLCBiLCBjLCBjb2xvcikge1xyXG5cdFx0dmFyIHJvb3QgPSAodHlwZW9mIHJvb3Rfb3Jfc2VsZWN0b3IgPT09ICdzdHJpbmcnKSA/IGQgOiAocm9vdF9vcl9zZWxlY3RvciB8fCBkKTtcclxuXHRcdHZhciBzZWwgID0gKHR5cGVvZiByb290X29yX3NlbGVjdG9yID09PSAnc3RyaW5nJykgPyByb290X29yX3NlbGVjdG9yIDogc2VsZWN0b3I7XHJcblx0XHRpZiAoICFzZWwgKSB7IHJldHVybjsgfVxyXG5cdFx0dmFyIGVsID0gcm9vdC5xdWVyeVNlbGVjdG9yKCBzZWwgKTtcclxuXHRcdGlmICggIWVsICkgeyByZXR1cm47IH1cclxuXHJcblx0XHR2YXIgZGVmX21zID0gTnVtYmVyLmlzRmluaXRlKCBVSS5QVUxTRV9ERUJPVU5DRV9NUyApID8gVUkuUFVMU0VfREVCT1VOQ0VfTVMgOiAxMjA7XHJcblx0XHR2YXIgbXMgICAgID0gTnVtYmVyLmlzRmluaXRlKCB3YWl0X21zICkgPyB3YWl0X21zIDogZGVmX21zO1xyXG5cdFx0dmFyIG1ldGEgPSBVSS5fcHVsc2VfbWV0YS5nZXQoIGVsICkgfHwge307XHJcblx0XHR0cnkgeyBjbGVhclRpbWVvdXQoIG1ldGEuZGVib3VuY2VfaWQgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0bWV0YS5kZWJvdW5jZV9pZCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0VUkucHVsc2Vfc2VxdWVuY2UoIGVsLCBhLCBiLCBjLCBjb2xvciApO1xyXG5cdFx0fSwgbXMgKTtcclxuXHRcdFVJLl9wdWxzZV9tZXRhLnNldCggZWwsIG1ldGEgKTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHRcdFF1ZXJ5ICsgcHVsc2U6XHJcblx0XHQoQkMpIElmIG9ubHkgM3JkIGFyZyBpcyBhIG51bWJlciBhbmQgbm8gNHRoLzV0aCAtPiBzaW5nbGUgbG9uZyBwdWxzZS5cclxuXHRcdE90aGVyd2lzZSAtPiBzdHJvbmcgc2VxdWVuY2UgKGRlZmF1bHRzIDPDlzI4MC8xODApLlxyXG5cdFx0T3B0aW9uYWwgNnRoIGFyZzogY29sb3IuXHJcblx0XHRAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gcm9vdF9vcl9zZWxlY3RvclxyXG5cdFx0QHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl1cclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbYV1cclxuXHRcdEBwYXJhbSB7bnVtYmVyfSBbYl1cclxuXHJcblx0XHRAcGFyYW0ge251bWJlcn0gW2NdXHJcblxyXG5cdFx0QHBhcmFtIHtzdHJpbmd9IFtjb2xvcl1cclxuXHQgKi9cclxuXHRVSS5wdWxzZV9xdWVyeSA9IGZ1bmN0aW9uIChyb290X29yX3NlbGVjdG9yLCBzZWxlY3RvciwgYSwgYiwgYywgY29sb3IpIHtcclxuXHRcdHZhciByb290ID0gKHR5cGVvZiByb290X29yX3NlbGVjdG9yID09PSAnc3RyaW5nJykgPyBkIDogKHJvb3Rfb3Jfc2VsZWN0b3IgfHwgZCk7XHJcblx0XHR2YXIgc2VsICA9ICh0eXBlb2Ygcm9vdF9vcl9zZWxlY3RvciA9PT0gJ3N0cmluZycpID8gcm9vdF9vcl9zZWxlY3RvciA6IHNlbGVjdG9yO1xyXG5cdFx0aWYgKCAhc2VsICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGVsID0gcm9vdC5xdWVyeVNlbGVjdG9yKCBzZWwgKTtcclxuXHRcdGlmICggIWVsICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG4vLyBCYWNrLWNvbXBhdDogVUkucHVsc2VRdWVyeShyb290LCBzZWwsIGR1cl9tcylcclxuXHRcdGlmICggTnVtYmVyLmlzRmluaXRlKCBhICkgJiYgYiA9PT0gdW5kZWZpbmVkICYmIGMgPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0cmV0dXJuIFVJLnB1bHNlX29uY2UoIGVsLCBhICk7XHJcblx0XHR9XHJcbi8vIE5ldzogc2VxdWVuY2U7IHBhcmFtcyBvcHRpb25hbDsgc3VwcG9ydHMgb3B0aW9uYWwgY29sb3IuXHJcblx0XHRVSS5wdWxzZV9zZXF1ZW5jZSggZWwsIGEsIGIsIGMsIGNvbG9yICk7XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0Q29udmVuaWVuY2UgaGVscGVyIChzbmFrZV9jYXNlKSB0byBjYWxsIGEgc3Ryb25nIHB1bHNlIHdpdGggb3B0aW9ucy5cclxuXHJcblx0QHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHJcblx0QHBhcmFtIHtPYmplY3R9IFtvcHRzXVxyXG5cclxuXHRAcGFyYW0ge251bWJlcn0gW29wdHMudGltZXM9M11cclxuXHJcblx0QHBhcmFtIHtudW1iZXJ9IFtvcHRzLm9uX21zPTI4MF1cclxuXHJcblx0QHBhcmFtIHtudW1iZXJ9IFtvcHRzLm9mZl9tcz0xODBdXHJcblxyXG5cdEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb2xvcl1cclxuXHQgKi9cclxuXHRVSS5wdWxzZV9zZXF1ZW5jZV9zdHJvbmcgPSBmdW5jdGlvbiAoZWwsIG9wdHMpIHtcclxuXHRcdG9wdHMgPSBvcHRzIHx8IHt9O1xyXG5cdFx0VUkucHVsc2Vfc2VxdWVuY2UoXHJcblx0XHRcdGVsLFxyXG5cdFx0XHROdW1iZXIuaXNGaW5pdGUoIG9wdHMudGltZXMgKSA/IG9wdHMudGltZXMgOiAzLFxyXG5cdFx0XHROdW1iZXIuaXNGaW5pdGUoIG9wdHMub25fbXMgKSA/IG9wdHMub25fbXMgOiAyODAsXHJcblx0XHRcdE51bWJlci5pc0Zpbml0ZSggb3B0cy5vZmZfbXMgKSA/IG9wdHMub2ZmX21zIDogMTgwLFxyXG5cdFx0XHRvcHRzLmNvbG9yXHJcblx0XHQpO1xyXG5cdH07XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBCYXNlIGNsYXNzIGZvciBCRkIgbW9kdWxlcy5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9Nb2R1bGUgPSBjbGFzcyB7XHJcblx0XHQvKiogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlciAqL1xyXG5cdFx0Y29uc3RydWN0b3IoYnVpbGRlcikge1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBJbml0aWFsaXplIHRoZSBtb2R1bGUuICovXHJcblx0XHRpbml0KCkge1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBDbGVhbnVwIHRoZSBtb2R1bGUuICovXHJcblx0XHRkZXN0cm95KCkge1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRyYWwgb3ZlcmxheS9jb250cm9scyBtYW5hZ2VyIGZvciBmaWVsZHMvc2VjdGlvbnMuXHJcblx0ICogUHVyZSBVSSBjb21wb3NpdGlvbjsgYWxsIGFjdGlvbnMgcm91dGUgYmFjayBpbnRvIHRoZSBidWlsZGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX092ZXJsYXkgPSBjbGFzcyB7XG5cblx0XHQvKipcblx0XHQgKiBTeW5jaHJvbml6ZSBldmVyeSBvdmVybGF5IHNldHRpbmdzIGJ1dHRvbiB3aXRoIHRoZSByZWFsIEluc3BlY3RvciBzdGF0ZS5cblx0XHQgKlxuXHRcdCAqIEEgc2VsZWN0ZWQgY2FudmFzIGl0ZW0gY2FuIHJlbWFpbiBzZWxlY3RlZCB3aGlsZSBhbm90aGVyIHJpZ2h0LWJhciBwYW5lbCBpc1xuXHRcdCAqIHZpc2libGUuIENvbWJpbmluZyBib3RoIHN0YXRlcyBwcmV2ZW50cyBhIHN0YWxlIHByZXNzZWQgYnV0dG9uIGFmdGVyIHRoZVxuXHRcdCAqIGFkbWluaXN0cmF0b3Igc3dpdGNoZXMgYXdheSBmcm9tIHRoZSBJbnNwZWN0b3IuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1dQQkNfRm9ybV9CdWlsZGVyfSBidWlsZGVyIC0gQWN0aXZlIEZvcm0gQnVpbGRlciBpbnN0YW5jZS5cblx0XHQgKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50W118Tm9kZUxpc3RPZjxIVE1MQnV0dG9uRWxlbWVudD58bnVsbH0gW3NldHRpbmdzX2J1dHRvbnM9bnVsbF1cblx0XHQgKiAgICAgT3B0aW9uYWwgYm91bmRlZCBjb250cm9scyB0byByZWNvbmNpbGUgZHVyaW5nIGluY3JlbWVudGFsIHJlbmRlcmluZy5cblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHQgKi9cblx0XHRzdGF0aWMgc3luY19zZXR0aW5nc19idXR0b25fc3RhdGVzKGJ1aWxkZXIsIHNldHRpbmdzX2J1dHRvbnMgPSBudWxsKSB7XG5cblx0XHRcdGNvbnN0IHBhZ2VzX2NvbnRhaW5lciA9IGJ1aWxkZXI/LnBhZ2VzX2NvbnRhaW5lcjtcblx0XHRcdGlmICggIXBhZ2VzX2NvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBpbnNwZWN0b3IgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcblx0XHRcdGNvbnN0IGluc3BlY3Rvcl9pc19vcGVuID0gISFpbnNwZWN0b3Jcblx0XHRcdFx0JiYgIWluc3BlY3Rvci5oYXNBdHRyaWJ1dGUoICdoaWRkZW4nIClcblx0XHRcdFx0JiYgaW5zcGVjdG9yLmdldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJyApICE9PSAndHJ1ZSc7XG5cdFx0XHRjb25zdCBzZWxlY3RhYmxlX3F1ZXJ5ICA9IGAke0NvcmUuV1BCQ19CRkJfRE9NLlNFTEVDVE9SUy5maWVsZH0sICR7Q29yZS5XUEJDX0JGQl9ET00uU0VMRUNUT1JTLnNlY3Rpb259YDtcblxuXHRcdFx0Y29uc3QgYnV0dG9ucyA9IHNldHRpbmdzX2J1dHRvbnMgfHwgcGFnZXNfY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3NldHRpbmdzLWJ0bicgKTtcblxuXHRcdFx0QXJyYXkuZnJvbSggYnV0dG9ucyApLmZvckVhY2goIChzZXR0aW5nc19idXR0b24pID0+IHtcblx0XHRcdFx0Y29uc3Qgb3duZXIgICAgICA9IHNldHRpbmdzX2J1dHRvbi5jbG9zZXN0KCBzZWxlY3RhYmxlX3F1ZXJ5ICk7XG5cdFx0XHRcdGNvbnN0IGlzX3ByZXNzZWQgPSBpbnNwZWN0b3JfaXNfb3BlblxuXHRcdFx0XHRcdCYmICEhb3duZXI/LmNsYXNzTGlzdD8uY29udGFpbnMoIENvcmUuV1BCQ19CRkJfRE9NLkNMQVNTRVMuc2VsZWN0ZWQgKTtcblxuXHRcdFx0XHRzZXR0aW5nc19idXR0b24uc2V0QXR0cmlidXRlKCAnYXJpYS1wcmVzc2VkJywgaXNfcHJlc3NlZCA/ICd0cnVlJyA6ICdmYWxzZScgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBFbnN1cmUgYW4gb3ZlcmxheSBleGlzdHMgYW5kIGlzIHdpcmVkIHVwIG9uIHRoZSBlbGVtZW50LlxuXHRcdCAqIEBwYXJhbSB7V1BCQ19Gb3JtX0J1aWxkZXJ9IGJ1aWxkZXJcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gZmllbGQgb3Igc2VjdGlvbiBlbGVtZW50XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBlbnN1cmUoYnVpbGRlciwgZWwpIHtcclxuXHJcblx0XHRcdGlmICggIWVsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBpc1NlY3Rpb24gPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKTtcclxuXHJcblx0XHRcdC8vIGxldCBvdmVybGF5ID0gZWwucXVlcnlTZWxlY3RvciggQ29yZS5XUEJDX0JGQl9ET00uU0VMRUNUT1JTLm92ZXJsYXkgKTtcclxuXHRcdFx0bGV0IG92ZXJsYXkgPSBlbC5xdWVyeVNlbGVjdG9yKCBgOnNjb3BlID4gJHtDb3JlLldQQkNfQkZCX0RPTS5TRUxFQ1RPUlMub3ZlcmxheX1gICk7XHJcblx0XHRcdGlmICggIW92ZXJsYXkgKSB7XHJcblx0XHRcdFx0b3ZlcmxheSA9IENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmNyZWF0ZV9lbGVtZW50KCAnZGl2JywgJ3dwYmNfYmZiX19vdmVybGF5LWNvbnRyb2xzJyApO1xyXG5cdFx0XHRcdGVsLnByZXBlbmQoIG92ZXJsYXkgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRHJhZyBoYW5kbGUuXHJcblx0XHRcdGlmICggIW92ZXJsYXkucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZHJhZy1oYW5kbGUnICkgKSB7XHJcblx0XHRcdFx0Y29uc3QgZHJhZ0NsYXNzID0gaXNTZWN0aW9uID8gJ3dwYmNfYmZiX19kcmFnLWhhbmRsZSBzZWN0aW9uLWRyYWctaGFuZGxlJyA6ICd3cGJjX2JmYl9fZHJhZy1oYW5kbGUnO1xyXG5cdFx0XHRcdG92ZXJsYXkuYXBwZW5kQ2hpbGQoXHJcblx0XHRcdFx0XHRDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ3NwYW4nLCBkcmFnQ2xhc3MsICc8c3BhbiBjbGFzcz1cIndwYmNfaWNuX2RyYWdfaW5kaWNhdG9yXCI+PC9zcGFuPicgKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cblxuXHRcdFx0Ly8gU0VUVElOR1MgYnV0dG9uIChzaG93biBmb3IgYm90aCBmaWVsZHMgJiBzZWN0aW9ucykuXG5cdFx0XHRsZXQgc2V0dGluZ3NfYnRuID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19zZXR0aW5ncy1idG4nICk7XG5cdFx0XHRpZiAoICFzZXR0aW5nc19idG4gKSB7XG5cdFx0XHRcdHNldHRpbmdzX2J0biAgICAgICAgID0gQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuY3JlYXRlX2VsZW1lbnQoICdidXR0b24nLCAnd3BiY19iZmJfX3NldHRpbmdzLWJ0bicsICc8aSBjbGFzcz1cIm1lbnVfaWNvbiBpY29uLTF4IHdwYmNfaWNuX25lYXJfbWUgd3BiY19pY25fcm90YXRlXzI3MFwiPjwvaT4nICk7XG5cdFx0XHRcdHNldHRpbmdzX2J0bi50eXBlICAgID0gJ2J1dHRvbic7XG5cdFx0XHRcdHNldHRpbmdzX2J0bi50aXRsZSAgID0gJ09wZW4gc2V0dGluZ3MnO1xuXHRcdFx0XHRzZXR0aW5nc19idG4uc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsIHNldHRpbmdzX2J0bi50aXRsZSApO1xuXHRcdFx0XHRzZXR0aW5nc19idG4uc2V0QXR0cmlidXRlKCAnYXJpYS1jb250cm9scycsICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xuXHRcdFx0XHRzZXR0aW5nc19idG4uc2V0QXR0cmlidXRlKCAnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyApO1xuXHRcdFx0XHRzZXR0aW5nc19idG4ub25jbGljayA9IChlKSA9PiB7XG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0Ly8gU2VsZWN0IFRISVMgZWxlbWVudCBhbmQgc2Nyb2xsIGl0IGludG8gdmlldy5cclxuXHRcdFx0XHRcdGJ1aWxkZXIuc2VsZWN0X2ZpZWxkKCBlbCwgeyBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQXV0by1vcGVuIEluc3BlY3RvciBmcm9tIHRoZSBvdmVybGF5IOKAnFNldHRpbmdz4oCdIGJ1dHRvbi5cclxuXHRcdFx0XHRcdHdwYmNfYmZiX19kaXNwYXRjaF9ldmVudF9zYWZlKFxyXG5cdFx0XHRcdFx0XHQnd3BiY19iZmI6c2hvd19wYW5lbCcsXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRwYW5lbF9pZDogJ3dwYmNfYmZiX19pbnNwZWN0b3InLFxyXG5cdFx0XHRcdFx0XHRcdHRhYl9pZCAgOiAnd3BiY190YWJfaW5zcGVjdG9yJ1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdC8vIFRyeSB0byBicmluZyB0aGUgaW5zcGVjdG9yIGludG8gdmlldyAvIGZvY3VzIGZpcnN0IGlucHV0LlxyXG5cdFx0XHRcdFx0Y29uc3QgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRcdFx0aWYgKCBpbnMgKSB7XHJcblx0XHRcdFx0XHRcdGlucy5zY3JvbGxJbnRvVmlldyggeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSApO1xyXG5cdFx0XHRcdFx0XHQvLyBGb2N1cyBmaXJzdCBpbnRlcmFjdGl2ZSBjb250cm9sIChiZXN0LWVmZm9ydCkuXHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBmb2N1c2FibGUgPSBpbnMucXVlcnlTZWxlY3RvciggJ2lucHV0LHNlbGVjdCx0ZXh0YXJlYSxidXR0b24sW2NvbnRlbnRlZGl0YWJsZV0sW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyApO1xyXG5cdFx0XHRcdFx0XHRcdGZvY3VzYWJsZT8uZm9jdXM/LigpO1xyXG5cdFx0XHRcdFx0XHR9LCAyNjAgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRvdmVybGF5LmFwcGVuZENoaWxkKCBzZXR0aW5nc19idG4gKTtcclxuXHRcdFx0fVxyXG5cblx0XHRcdG92ZXJsYXkuc2V0QXR0cmlidXRlKCAncm9sZScsICd0b29sYmFyJyApO1xuXHRcdFx0b3ZlcmxheS5zZXRBdHRyaWJ1dGUoICdhcmlhLWxhYmVsJywgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgPyAnU2VjdGlvbiB0b29scycgOiAnRmllbGQgdG9vbHMnICk7XG5cdFx0XHRVSS5XUEJDX0JGQl9PdmVybGF5LnN5bmNfc2V0dGluZ3NfYnV0dG9uX3N0YXRlcyggYnVpbGRlciwgWyBzZXR0aW5nc19idG4gXSApO1xuXG5cdFx0XHRyZXR1cm4gb3ZlcmxheTtcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogV1BCQyBMYXlvdXQgQ2hpcHMgaGVscGVyIC0gdmlzdWFsIGxheW91dCBwaWNrZXIgKGNoaXBzKSwgZS5nLiwgXCI1MCUvNTAlXCIsIHRvIGEgc2VjdGlvbiBvdmVybGF5LlxyXG5cdCAqXHJcblx0ICogUmVuZGVycyBFcXVhbC9QcmVzZXRzL0N1c3RvbSBjaGlwcyBpbnRvIGEgaG9zdCBjb250YWluZXIgYW5kIHdpcmVzIHRoZW0gdG8gYXBwbHkgdGhlIGxheW91dC5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMgPSBjbGFzcyB7XHJcblxyXG5cdFx0LyoqIFJlYWQgcGVyLWNvbHVtbiBtaW4gKHB4KSBmcm9tIENTUyB2YXIgc2V0IGJ5IHRoZSBndWFyZC4gKi9cclxuXHRcdHN0YXRpYyBfZ2V0X2NvbF9taW5fcHgoY29sKSB7XHJcblx0XHRcdGNvbnN0IHYgPSBnZXRDb21wdXRlZFN0eWxlKCBjb2wgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnLS13cGJjLWNvbC1taW4nICkgfHwgJzAnO1xyXG5cdFx0XHRjb25zdCBuID0gcGFyc2VGbG9hdCggdiApO1xyXG5cdFx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKCBuICkgPyBNYXRoLm1heCggMCwgbiApIDogMDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFR1cm4gcmF3IHdlaWdodHMgKGUuZy4gWzEsMV0sIFsyLDEsMV0pIGludG8gZWZmZWN0aXZlIFwiYXZhaWxhYmxlLSVcIiBiYXNlcyB0aGF0XHJcblx0XHQgKiAoYSkgc3VtIHRvIHRoZSByb3cncyBhdmFpbGFibGUgJSwgYW5kIChiKSBtZWV0IGV2ZXJ5IGNvbHVtbidzIG1pbiBweC5cclxuXHRcdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgYmFzZXMgKG51bWJlcnMpIG9yIG51bGwgaWYgaW1wb3NzaWJsZSB0byBzYXRpc2Z5IG1pbnMuXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBfZml0X3dlaWdodHNfcmVzcGVjdGluZ19taW4oYnVpbGRlciwgcm93LCB3ZWlnaHRzKSB7XHJcblx0XHRcdGNvbnN0IGNvbHMgPSBBcnJheS5mcm9tKCByb3cucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApICk7XHJcblx0XHRcdGNvbnN0IG4gICAgPSBjb2xzLmxlbmd0aDtcclxuXHRcdFx0aWYgKCAhbiApIHJldHVybiBudWxsO1xyXG5cdFx0XHRpZiAoICFBcnJheS5pc0FycmF5KCB3ZWlnaHRzICkgfHwgd2VpZ2h0cy5sZW5ndGggIT09IG4gKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdC8vIGF2YWlsYWJsZSAlIGFmdGVyIGdhcHMgKGZyb20gTGF5b3V0U2VydmljZSlcclxuXHRcdFx0Y29uc3QgZ3AgICAgICAgPSBidWlsZGVyLmNvbF9nYXBfcGVyY2VudDtcclxuXHRcdFx0Y29uc3QgZWZmICAgICAgPSBidWlsZGVyLmxheW91dC5jb21wdXRlX2VmZmVjdGl2ZV9iYXNlc19mcm9tX3Jvdyggcm93LCBncCApO1xyXG5cdFx0XHRjb25zdCBhdmFpbFBjdCA9IGVmZi5hdmFpbGFibGU7ICAgICAgICAgICAgICAgLy8gZS5nLiA5NCBpZiAyIGNvbHMgYW5kIDMlIGdhcFxyXG5cdFx0XHRjb25zdCByb3dQeCAgICA9IHJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuXHRcdFx0Y29uc3QgYXZhaWxQeCAgPSByb3dQeCAqIChhdmFpbFBjdCAvIDEwMCk7XHJcblxyXG5cdFx0XHQvLyBjb2xsZWN0IG1pbmltYSBpbiAlIG9mIFwiYXZhaWxhYmxlXCJcclxuXHRcdFx0Y29uc3QgbWluUGN0ID0gY29scy5tYXAoIChjKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWluUHggPSBVSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMuX2dldF9jb2xfbWluX3B4KCBjICk7XHJcblx0XHRcdFx0aWYgKCBhdmFpbFB4IDw9IDAgKSByZXR1cm4gMDtcclxuXHRcdFx0XHRyZXR1cm4gKG1pblB4IC8gYXZhaWxQeCkgKiBhdmFpbFBjdDtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Ly8gSWYgbWlucyBhbG9uZSBkb24ndCBmaXQsIGJhaWwuXHJcblx0XHRcdGNvbnN0IHN1bU1pbiA9IG1pblBjdC5yZWR1Y2UoIChhLCBiKSA9PiBhICsgYiwgMCApO1xyXG5cdFx0XHRpZiAoIHN1bU1pbiA+IGF2YWlsUGN0IC0gMWUtNiApIHtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDsgLy8gaW1wb3NzaWJsZSB0byByZXNwZWN0IG1pbnM7IGRvbid0IGFwcGx5IHByZXNldFxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUYXJnZXQgcGVyY2VudGFnZXMgZnJvbSB3ZWlnaHRzLCBub3JtYWxpemVkIHRvIGF2YWlsUGN0LlxyXG5cdFx0XHRjb25zdCB3U3VtICAgICAgPSB3ZWlnaHRzLnJlZHVjZSggKGEsIHcpID0+IGEgKyAoTnVtYmVyKCB3ICkgfHwgMCksIDAgKSB8fCBuO1xyXG5cdFx0XHRjb25zdCB0YXJnZXRQY3QgPSB3ZWlnaHRzLm1hcCggKHcpID0+ICgoTnVtYmVyKCB3ICkgfHwgMCkgLyB3U3VtKSAqIGF2YWlsUGN0ICk7XHJcblxyXG5cdFx0XHQvLyBMb2NrIGNvbHVtbnMgdGhhdCB3b3VsZCBiZSBiZWxvdyBtaW4sIHRoZW4gZGlzdHJpYnV0ZSB0aGUgcmVtYWluZGVyXHJcblx0XHRcdC8vIGFjcm9zcyB0aGUgcmVtYWluaW5nIGNvbHVtbnMgcHJvcG9ydGlvbmFsbHkgdG8gdGhlaXIgdGFyZ2V0UGN0LlxyXG5cdFx0XHRjb25zdCBsb2NrZWQgID0gbmV3IEFycmF5KCBuICkuZmlsbCggZmFsc2UgKTtcclxuXHRcdFx0bGV0IGxvY2tlZFN1bSA9IDA7XHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG47IGkrKyApIHtcclxuXHRcdFx0XHRpZiAoIHRhcmdldFBjdFtpXSA8IG1pblBjdFtpXSApIHtcclxuXHRcdFx0XHRcdGxvY2tlZFtpXSA9IHRydWU7XHJcblx0XHRcdFx0XHRsb2NrZWRTdW0gKz0gbWluUGN0W2ldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHJlbWFpbmluZyAgICAgPSBhdmFpbFBjdCAtIGxvY2tlZFN1bTtcclxuXHRcdFx0Y29uc3QgZnJlZUlkeCAgICAgPSBbXTtcclxuXHRcdFx0bGV0IGZyZWVUYXJnZXRTdW0gPSAwO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBuOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCAhbG9ja2VkW2ldICkge1xyXG5cdFx0XHRcdFx0ZnJlZUlkeC5wdXNoKCBpICk7XHJcblx0XHRcdFx0XHRmcmVlVGFyZ2V0U3VtICs9IHRhcmdldFBjdFtpXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheSggbiApLmZpbGwoIDAgKTtcclxuXHRcdFx0Ly8gU2VlZCBsb2NrZWQgd2l0aCB0aGVpciBtaW5pbWEuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG47IGkrKyApIHtcclxuXHRcdFx0XHRpZiAoIGxvY2tlZFtpXSApIHJlc3VsdFtpXSA9IG1pblBjdFtpXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBmcmVlSWR4Lmxlbmd0aCA9PT0gMCApIHtcclxuXHRcdFx0XHQvLyBldmVyeXRoaW5nIGxvY2tlZCBleGFjdGx5IGF0IG1pbjsgYW55IGxlZnRvdmVyIChzaG91bGRuJ3QgaGFwcGVuKVxyXG5cdFx0XHRcdC8vIHdvdWxkIGJlIGlnbm9yZWQgdG8ga2VlcCBzaW1wbGljaXR5IGFuZCBzdGFiaWxpdHkuXHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW1haW5pbmcgPD0gMCApIHtcclxuXHRcdFx0XHQvLyBub3RoaW5nIGxlZnQgdG8gZGlzdHJpYnV0ZTsga2VlcCBleGFjdGx5IG1pbnMgb24gbG9ja2VkLFxyXG5cdFx0XHRcdC8vIG5vdGhpbmcgZm9yIGZyZWUgKGRlZ2VuZXJhdGUgYnV0IGNvbnNpc3RlbnQpXHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBmcmVlVGFyZ2V0U3VtIDw9IDAgKSB7XHJcblx0XHRcdFx0Ly8gZGlzdHJpYnV0ZSBlcXVhbGx5IGFtb25nIGZyZWUgY29sdW1uc1xyXG5cdFx0XHRcdGNvbnN0IGVhY2ggPSByZW1haW5pbmcgLyBmcmVlSWR4Lmxlbmd0aDtcclxuXHRcdFx0XHRmcmVlSWR4LmZvckVhY2goIChpKSA9PiAocmVzdWx0W2ldID0gZWFjaCkgKTtcclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBEaXN0cmlidXRlIHJlbWFpbmluZyBwcm9wb3J0aW9uYWxseSB0byBmcmVlIGNvbHVtbnMnIHRhcmdldFBjdFxyXG5cdFx0XHRmcmVlSWR4LmZvckVhY2goIChpKSA9PiB7XHJcblx0XHRcdFx0cmVzdWx0W2ldID0gcmVtYWluaW5nICogKHRhcmdldFBjdFtpXSAvIGZyZWVUYXJnZXRTdW0pO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqIEFwcGx5IGEgcHJlc2V0IGJ1dCBndWFyZCBpdCBieSBtaW5pbWE7IHJldHVybnMgdHJ1ZSBpZiBhcHBsaWVkLCBmYWxzZSBpZiBza2lwcGVkLiAqL1xyXG5cdFx0c3RhdGljIF9hcHBseV9wcmVzZXRfd2l0aF9taW5fZ3VhcmQoYnVpbGRlciwgc2VjdGlvbl9lbCwgd2VpZ2h0cykge1xyXG5cdFx0XHRjb25zdCByb3cgPSBzZWN0aW9uX2VsLnF1ZXJ5U2VsZWN0b3IoICc6c2NvcGUgPiAud3BiY19iZmJfX3JvdycgKTtcclxuXHRcdFx0aWYgKCAhcm93ICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0Y29uc3QgZml0dGVkID0gVUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzLl9maXRfd2VpZ2h0c19yZXNwZWN0aW5nX21pbiggYnVpbGRlciwgcm93LCB3ZWlnaHRzICk7XHJcblx0XHRcdGlmICggIWZpdHRlZCApIHtcclxuXHRcdFx0XHRidWlsZGVyPy5fYW5ub3VuY2U/LiggJ05vdCBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgbGF5b3V0IGJlY2F1c2Ugb2YgZmllbGRz4oCZIG1pbmltdW0gd2lkdGhzLicgKTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGBmaXR0ZWRgIGFscmVhZHkgc3VtcyB0byB0aGUgcm934oCZcyBhdmFpbGFibGUgJSwgc28gd2UgY2FuIGFwcGx5IGJhc2VzIGRpcmVjdGx5LlxyXG5cdFx0XHRidWlsZGVyLmxheW91dC5hcHBseV9iYXNlc190b19yb3coIHJvdywgZml0dGVkICk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkIGFuZCBhcHBlbmQgbGF5b3V0IGNoaXBzIGZvciBhIHNlY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBmb3JtIGJ1aWxkZXIgaW5zdGFuY2UuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzZWN0aW9uX2VsIC0gVGhlIC53cGJjX2JmYl9fc2VjdGlvbiBlbGVtZW50LlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaG9zdF9lbCAtIENvbnRhaW5lciB3aGVyZSBjaGlwcyBzaG91bGQgYmUgcmVuZGVyZWQuXHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHJlbmRlcl9mb3Jfc2VjdGlvbihidWlsZGVyLCBzZWN0aW9uX2VsLCBob3N0X2VsKSB7XHJcblxyXG5cdFx0XHRpZiAoICFidWlsZGVyIHx8ICFzZWN0aW9uX2VsIHx8ICFob3N0X2VsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgcm93ID0gc2VjdGlvbl9lbC5xdWVyeVNlbGVjdG9yKCAnOnNjb3BlID4gLndwYmNfYmZiX19yb3cnICk7XHJcblx0XHRcdGlmICggIXJvdyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNvbHMgPSByb3cucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApLmxlbmd0aCB8fCAxO1xyXG5cclxuXHRcdFx0Ly8gQ2xlYXIgaG9zdC5cclxuXHRcdFx0aG9zdF9lbC5pbm5lckhUTUwgPSAnJztcclxuXHJcblx0XHRcdC8vIEVxdWFsIGNoaXAuXHJcblx0XHRcdGhvc3RfZWwuYXBwZW5kQ2hpbGQoXHJcblx0XHRcdFx0VUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzLl9tYWtlX2NoaXAoIGJ1aWxkZXIsIHNlY3Rpb25fZWwsIEFycmF5KCBjb2xzICkuZmlsbCggMSApLCAnRXF1YWwnIClcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdC8vIFByZXNldHMgYmFzZWQgb24gY29sdW1uIGNvdW50LlxyXG5cdFx0XHRjb25zdCBwcmVzZXRzID0gYnVpbGRlci5sYXlvdXQuYnVpbGRfcHJlc2V0c19mb3JfY29sdW1ucyggY29scyApO1xyXG5cdFx0XHRwcmVzZXRzLmZvckVhY2goICh3ZWlnaHRzKSA9PiB7XHJcblx0XHRcdFx0aG9zdF9lbC5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRcdFVJLldQQkNfQkZCX0xheW91dF9DaGlwcy5fbWFrZV9jaGlwKCBidWlsZGVyLCBzZWN0aW9uX2VsLCB3ZWlnaHRzLCBudWxsIClcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBDdXN0b20gY2hpcC5cclxuXHRcdFx0Y29uc3QgY3VzdG9tQnRuICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2J1dHRvbicgKTtcclxuXHRcdFx0Y3VzdG9tQnRuLnR5cGUgICAgICAgID0gJ2J1dHRvbic7XHJcblx0XHRcdGN1c3RvbUJ0bi5jbGFzc05hbWUgICA9ICd3cGJjX2JmYl9fbGF5b3V0X2NoaXAnO1xyXG5cdFx0XHRjdXN0b21CdG4udGV4dENvbnRlbnQgPSAnQ3VzdG9t4oCmJztcclxuXHRcdFx0Y3VzdG9tQnRuLnRpdGxlICAgICAgID0gYEVudGVyICR7Y29sc30gcGVyY2VudGFnZXNgO1xyXG5cdFx0XHRjdXN0b21CdG4uYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGV4YW1wbGUgPSAoY29scyA9PT0gMikgPyAnNTAsNTAnIDogKGNvbHMgPT09IDMgPyAnMjAsNjAsMjAnIDogJzI1LDI1LDI1LDI1Jyk7XHJcblx0XHRcdFx0Y29uc3QgdGV4dCAgICA9IHByb21wdCggYEVudGVyICR7Y29sc30gcGVyY2VudGFnZXMgKGNvbW1hIG9yIHNwYWNlIHNlcGFyYXRlZCk6YCwgZXhhbXBsZSApO1xyXG5cdFx0XHRcdGlmICggdGV4dCA9PSBudWxsICkgcmV0dXJuO1xyXG5cdFx0XHRcdGNvbnN0IHdlaWdodHMgPSBidWlsZGVyLmxheW91dC5wYXJzZV93ZWlnaHRzKCB0ZXh0ICk7XHJcblx0XHRcdFx0aWYgKCB3ZWlnaHRzLmxlbmd0aCAhPT0gY29scyApIHtcclxuXHRcdFx0XHRcdGFsZXJ0KCBgUGxlYXNlIGVudGVyIGV4YWN0bHkgJHtjb2xzfSBudW1iZXJzLmAgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gT0xEOlxyXG5cdFx0XHRcdC8vIGJ1aWxkZXIubGF5b3V0LmFwcGx5X2xheW91dF9wcmVzZXQoIHNlY3Rpb25fZWwsIHdlaWdodHMsIGJ1aWxkZXIuY29sX2dhcF9wZXJjZW50ICk7XHJcblx0XHRcdFx0Ly8gR3VhcmRlZCBhcHBseTouXHJcblx0XHRcdFx0aWYgKCAhVUkuV1BCQ19CRkJfTGF5b3V0X0NoaXBzLl9hcHBseV9wcmVzZXRfd2l0aF9taW5fZ3VhcmQoIGJ1aWxkZXIsIHNlY3Rpb25fZWwsIHdlaWdodHMgKSApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aG9zdF9lbC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19sYXlvdXRfY2hpcCcgKS5mb3JFYWNoKCBjID0+IGMuY2xhc3NMaXN0LnJlbW92ZSggJ2lzLWFjdGl2ZScgKSApO1xyXG5cdFx0XHRcdGN1c3RvbUJ0bi5jbGFzc0xpc3QuYWRkKCAnaXMtYWN0aXZlJyApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdGhvc3RfZWwuYXBwZW5kQ2hpbGQoIGN1c3RvbUJ0biApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ3JlYXRlIGEgc2luZ2xlIGxheW91dCBjaGlwIGJ1dHRvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlclxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2VjdGlvbl9lbFxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJbXX0gd2VpZ2h0c1xyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFiZWxcclxuXHRcdCAqIEByZXR1cm5zIHtIVE1MQnV0dG9uRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIF9tYWtlX2NoaXAoYnVpbGRlciwgc2VjdGlvbl9lbCwgd2VpZ2h0cywgbGFiZWwgPSBudWxsKSB7XHJcblxyXG5cdFx0XHRjb25zdCBidG4gICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2J1dHRvbicgKTtcclxuXHRcdFx0YnRuLnR5cGUgICAgICA9ICdidXR0b24nO1xyXG5cdFx0XHRidG4uY2xhc3NOYW1lID0gJ3dwYmNfYmZiX19sYXlvdXRfY2hpcCc7XHJcblxyXG5cdFx0XHRjb25zdCB0aXRsZSA9IGxhYmVsIHx8IGJ1aWxkZXIubGF5b3V0LmZvcm1hdF9wcmVzZXRfbGFiZWwoIHdlaWdodHMgKTtcclxuXHRcdFx0YnRuLnRpdGxlICAgPSB0aXRsZTtcclxuXHJcblx0XHRcdC8vIFZpc3VhbCBtaW5pYXR1cmUuXHJcblx0XHRcdGNvbnN0IHZpcyAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xyXG5cdFx0XHR2aXMuY2xhc3NOYW1lID0gJ3dwYmNfYmZiX19sYXlvdXRfY2hpcC12aXMnO1xyXG5cdFx0XHRjb25zdCBzdW0gICAgID0gd2VpZ2h0cy5yZWR1Y2UoIChhLCBiKSA9PiBhICsgKE51bWJlciggYiApIHx8IDApLCAwICkgfHwgMTtcclxuXHRcdFx0d2VpZ2h0cy5mb3JFYWNoKCAodykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGJhciAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3NwYW4nICk7XHJcblx0XHRcdFx0YmFyLnN0eWxlLmZsZXggPSBgMCAwIGNhbGMoICR7KChOdW1iZXIoIHcgKSB8fCAwKSAvIHN1bSAqIDEwMCkudG9GaXhlZCggMyApfSUgLSAxLjVweCApYDtcclxuXHRcdFx0XHR2aXMuYXBwZW5kQ2hpbGQoIGJhciApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdGJ0bi5hcHBlbmRDaGlsZCggdmlzICk7XHJcblxyXG5cdFx0XHRjb25zdCB0eHQgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnc3BhbicgKTtcclxuXHRcdFx0dHh0LmNsYXNzTmFtZSAgID0gJ3dwYmNfYmZiX19sYXlvdXRfY2hpcC1sYWJlbCc7XHJcblx0XHRcdHR4dC50ZXh0Q29udGVudCA9IGxhYmVsIHx8IGJ1aWxkZXIubGF5b3V0LmZvcm1hdF9wcmVzZXRfbGFiZWwoIHdlaWdodHMgKTtcclxuXHRcdFx0YnRuLmFwcGVuZENoaWxkKCB0eHQgKTtcclxuXHJcblx0XHRcdGJ0bi5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdFx0Ly8gT0xEOlxyXG5cdFx0XHRcdC8vIGJ1aWxkZXIubGF5b3V0LmFwcGx5X2xheW91dF9wcmVzZXQoIHNlY3Rpb25fZWwsIHdlaWdodHMsIGJ1aWxkZXIuY29sX2dhcF9wZXJjZW50ICk7XHJcblxyXG5cdFx0XHRcdC8vIE5FVzpcclxuXHRcdFx0XHRpZiAoICFVSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMuX2FwcGx5X3ByZXNldF93aXRoX21pbl9ndWFyZCggYnVpbGRlciwgc2VjdGlvbl9lbCwgd2VpZ2h0cyApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuOyAvLyBkbyBub3QgdG9nZ2xlIGFjdGl2ZSBpZiB3ZSBkaWRuJ3QgY2hhbmdlIGxheW91dFxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnRuLnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX2xheW91dF9jaGlwJyApLmZvckVhY2goIGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCAnaXMtYWN0aXZlJyApICk7XHJcblx0XHRcdFx0YnRuLmNsYXNzTGlzdC5hZGQoICdpcy1hY3RpdmUnICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHJldHVybiBidG47XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogU2VsZWN0aW9uIGNvbnRyb2xsZXIgZm9yIGZpZWxkcyBhbmQgYW5ub3VuY2VtZW50cy5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9TZWxlY3Rpb25fQ29udHJvbGxlciA9IGNsYXNzIGV4dGVuZHMgVUkuV1BCQ19CRkJfTW9kdWxlIHtcclxuXHJcblx0XHRpbml0KCkge1xyXG5cclxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRfdWlkICAgICAgICAgICAgICA9IG51bGw7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5zZWxlY3RfZmllbGQgICAgICAgPSB0aGlzLnNlbGVjdF9maWVsZC5iaW5kKCB0aGlzICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5nZXRfc2VsZWN0ZWRfZmllbGQgPSB0aGlzLmdldF9zZWxlY3RlZF9maWVsZC5iaW5kKCB0aGlzICk7XG5cdFx0XHR0aGlzLl9vbl9jbGVhciAgICAgICAgICAgICAgICAgID0gdGhpcy5vbl9jbGVhci5iaW5kKCB0aGlzICk7XG5cdFx0XHR0aGlzLl9vbl9wYW5lbF9zaG93biAgICAgICAgICAgID0gdGhpcy5fc3luY19zZXR0aW5nc19idXR0b25fc3RhdGVzLmJpbmQoIHRoaXMgKTtcblxyXG5cdFx0XHQvLyBDZW50cmFsaXplZCBkZWxldGUgY29tbWFuZCB1c2VkIGJ5IGtleWJvYXJkICsgaW5zcGVjdG9yICsgb3ZlcmxheS5cclxuXHRcdFx0dGhpcy5idWlsZGVyLmRlbGV0ZV9pdGVtID0gKGVsKSA9PiB7XHJcblx0XHRcdFx0aWYgKCAhZWwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgYiAgICAgICAgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdFx0Y29uc3QgbmVpZ2hib3IgPSBiLl9maW5kX25laWdoYm9yX3NlbGVjdGFibGU/LiggZWwgKSB8fCBudWxsO1xyXG5cdFx0XHRcdGVsLnJlbW92ZSgpO1xyXG5cdFx0XHRcdC8vIFVzZSBsb2NhbCBDb3JlIGNvbnN0YW50cyAobm90IGEgZ2xvYmFsKSB0byBhdm9pZCBSZWZlcmVuY2VFcnJvcnMuXHJcblx0XHRcdFx0Yi5idXM/LmVtaXQ/LiggQ29yZS5XUEJDX0JGQl9FdmVudHMuRklFTERfUkVNT1ZFLCB7IGVsLCBpZDogZWw/LmRhdGFzZXQ/LmlkLCB1aWQ6IGVsPy5kYXRhc2V0Py51aWQgfSApO1xyXG5cdFx0XHRcdGIudXNhZ2U/LnVwZGF0ZV9wYWxldHRlX3VpPy4oKTtcclxuXHRcdFx0XHQvLyBOb3RpZnkgZ2VuZXJpYyBzdHJ1Y3R1cmUgbGlzdGVuZXJzLCB0b286XHJcblx0XHRcdFx0Yi5idXM/LmVtaXQ/LiggQ29yZS5XUEJDX0JGQl9FdmVudHMuU1RSVUNUVVJFX0NIQU5HRSwgeyByZWFzb246ICdkZWxldGUnLCBlbCB9ICk7XHJcblx0XHRcdFx0Ly8gRGVmZXIgc2VsZWN0aW9uIGEgdGljayBzbyB0aGUgRE9NIGlzIGZ1bGx5IHNldHRsZWQgYmVmb3JlIEluc3BlY3RvciBoeWRyYXRlcy5cclxuXHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcclxuXHRcdFx0XHRcdC8vIFRoaXMgY2FsbHMgaW5zcGVjdG9yLmJpbmRfdG9fZmllbGQoKSBhbmQgb3BlbnMgdGhlIEluc3BlY3RvciBwYW5lbC5cclxuXHRcdFx0XHRcdGIuc2VsZWN0X2ZpZWxkPy4oIG5laWdoYm9yIHx8IG51bGwsIHsgc2Nyb2xsSW50b1ZpZXc6ICEhbmVpZ2hib3IgfSApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRyZXR1cm4gbmVpZ2hib3I7XHJcblx0XHRcdH07XHJcblx0XHRcdHRoaXMuYnVpbGRlci5idXMub24oIENvcmUuV1BCQ19CRkJfRXZlbnRzLkNMRUFSX1NFTEVDVElPTiwgdGhpcy5fb25fY2xlYXIgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmJ1cy5vbiggQ29yZS5XUEJDX0JGQl9FdmVudHMuU1RSVUNUVVJFX0xPQURFRCwgdGhpcy5fb25fY2xlYXIgKTtcclxuXHRcdFx0Ly8gZGVsZWdhdGVkIGNsaWNrIHNlbGVjdGlvbiAoY2FwdHVyZSBlbnN1cmVzIHdlIHdpbiBiZWZvcmUgYnViYmxpbmcgdG8gY29udGFpbmVycykuXHJcblx0XHRcdHRoaXMuX29uX2NhbnZhc19jbGljayA9IHRoaXMuX2hhbmRsZV9jYW52YXNfY2xpY2suYmluZCggdGhpcyApO1xuXHRcdFx0dGhpcy5idWlsZGVyLnBhZ2VzX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLl9vbl9jYW52YXNfY2xpY2ssIHRydWUgKTtcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd3cGJjX2JmYjpwYW5lbF9zaG93bicsIHRoaXMuX29uX3BhbmVsX3Nob3duICk7XG5cdFx0XHR0aGlzLl9zeW5jX3NldHRpbmdzX2J1dHRvbl9zdGF0ZXMoKTtcblx0XHR9XG5cclxuXHRcdGRlc3Ryb3koKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5idXMub2ZmKCBDb3JlLldQQkNfQkZCX0V2ZW50cy5DTEVBUl9TRUxFQ1RJT04sIHRoaXMuX29uX2NsZWFyICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX29uX2NhbnZhc19jbGljayApIHtcblx0XHRcdFx0dGhpcy5idWlsZGVyLnBhZ2VzX2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLl9vbl9jYW52YXNfY2xpY2ssIHRydWUgKTtcblx0XHRcdFx0dGhpcy5fb25fY2FudmFzX2NsaWNrID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLl9vbl9wYW5lbF9zaG93biApIHtcblx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dwYmNfYmZiOnBhbmVsX3Nob3duJywgdGhpcy5fb25fcGFuZWxfc2hvd24gKTtcblx0XHRcdFx0dGhpcy5fb25fcGFuZWxfc2hvd24gPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJlZnJlc2ggb3ZlcmxheSBidXR0b24gc3RhdGUgYWZ0ZXIgc2VsZWN0aW9uIG9yIHJpZ2h0LWJhciBwYW5lbCBjaGFuZ2VzLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0X3N5bmNfc2V0dGluZ3NfYnV0dG9uX3N0YXRlcygpIHtcblx0XHRcdFVJLldQQkNfQkZCX092ZXJsYXkuc3luY19zZXR0aW5nc19idXR0b25fc3RhdGVzKCB0aGlzLmJ1aWxkZXIgKTtcblx0XHR9XG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVsZWdhdGVkIGNhbnZhcyBjbGljayAtPiBzZWxlY3QgY2xvc2VzdCBmaWVsZC9zZWN0aW9uIChpbm5lciBiZWF0cyBvdXRlcikuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlXHJcblx0XHQgKi9cclxuXHRcdF9oYW5kbGVfY2FudmFzX2NsaWNrKGUpIHtcclxuXHRcdFx0Y29uc3Qgcm9vdCA9IHRoaXMuYnVpbGRlci5wYWdlc19jb250YWluZXI7XHJcblx0XHRcdGlmICggIXJvb3QgKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyBJZ25vcmUgY2xpY2tzIG9uIGNvbnRyb2xzL2hhbmRsZXMvcmVzaXplcnMsIGV0Yy5cclxuXHRcdFx0Y29uc3QgSUdOT1JFID0gW1xyXG5cdFx0XHRcdCcud3BiY19iZmJfX292ZXJsYXktY29udHJvbHMnLFxyXG5cdFx0XHRcdCcud3BiY19iZmJfX2xheW91dF9waWNrZXInLFxyXG5cdFx0XHRcdCcud3BiY19iZmJfX2RyYWctaGFuZGxlJyxcclxuXHRcdFx0XHQnLndwYmNfYmZiX19maWVsZC1yZW1vdmUtYnRuJyxcclxuXHRcdFx0XHQnLndwYmNfYmZiX19maWVsZC1tb3ZlLXVwJyxcclxuXHRcdFx0XHQnLndwYmNfYmZiX19maWVsZC1tb3ZlLWRvd24nLFxyXG5cdFx0XHRcdCcud3BiY19iZmJfX2NvbHVtbi1yZXNpemVyJ1xyXG5cdFx0XHRdLmpvaW4oICcsJyApO1xyXG5cclxuXHRcdFx0aWYgKCBlLnRhcmdldC5jbG9zZXN0KCBJR05PUkUgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47IC8vIGxldCB0aG9zZSBjb250cm9scyBkbyB0aGVpciBvd24gdGhpbmcuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZpbmQgdGhlIGNsb3Nlc3Qgc2VsZWN0YWJsZSAoZmllbGQgT1Igc2VjdGlvbikgZnJvbSB0aGUgY2xpY2sgdGFyZ2V0LlxyXG5cdFx0XHRsZXQgaGl0ID0gZS50YXJnZXQuY2xvc2VzdD8uKFxyXG5cdFx0XHRcdGAke0NvcmUuV1BCQ19CRkJfRE9NLlNFTEVDVE9SUy52YWxpZEZpZWxkfSwgJHtDb3JlLldQQkNfQkZCX0RPTS5TRUxFQ1RPUlMuc2VjdGlvbn0sIC53cGJjX2JmYl9fY29sdW1uYFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0aWYgKCAhaGl0IHx8ICFyb290LmNvbnRhaW5zKCBoaXQgKSApIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdF9maWVsZCggbnVsbCApOyAgICAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uIG9uIGJsYW5rIGNsaWNrLlxyXG5cdFx0XHRcdHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbXB0eSBzcGFjZSBpcyBoYW5kbGVkIGVsc2V3aGVyZS5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTkVXOiBpZiB1c2VyIGNsaWNrZWQgYSBDT0xVTU4gLT4gcmVtZW1iZXIgdGFiIGtleSBvbiBpdHMgU0VDVElPTiwgYnV0IHN0aWxsIHNlbGVjdCB0aGUgc2VjdGlvbi5cclxuXHRcdFx0bGV0IHByZXNlbGVjdF90YWJfa2V5ID0gbnVsbDtcclxuXHRcdFx0aWYgKCBoaXQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2NvbHVtbicgKSApIHtcclxuXHRcdFx0XHRjb25zdCByb3cgID0gaGl0LmNsb3Nlc3QoICcud3BiY19iZmJfX3JvdycgKTtcclxuXHRcdFx0XHRjb25zdCBjb2xzID0gcm93ID8gQXJyYXkuZnJvbSggcm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKSApIDogW107XHJcblx0XHRcdFx0Y29uc3QgaWR4ICA9IE1hdGgubWF4KCAwLCBjb2xzLmluZGV4T2YoIGhpdCApICk7XHJcblx0XHRcdFx0Y29uc3Qgc2VjICA9IGhpdC5jbG9zZXN0KCAnLndwYmNfYmZiX19zZWN0aW9uJyApO1xyXG5cdFx0XHRcdGlmICggc2VjICkge1xyXG5cdFx0XHRcdFx0cHJlc2VsZWN0X3RhYl9rZXkgPSBTdHJpbmcoIGlkeCArIDEgKTsgICAgICAgICAgICAgIC8vIHRhYnMgYXJlIDEtYmFzZWQgaW4gdWktY29sdW1uLXN0eWxlcy5qc1xyXG5cdFx0XHRcdFx0Ly8gSGludCBmb3IgdGhlIHJlbmRlcmVyIChpdCByZWFkcyB0aGlzIEJFRk9SRSByZW5kZXJpbmcgYW5kIHJlc3RvcmVzIHRoZSB0YWIpLlxyXG5cdFx0XHRcdFx0c2VjLmRhdGFzZXQuY29sX3N0eWxlc19hY3RpdmVfdGFiID0gcHJlc2VsZWN0X3RhYl9rZXk7XHJcblx0XHRcdFx0XHQvLyBwcm9tb3RlIHNlbGVjdGlvbiB0byB0aGUgc2VjdGlvbiAoc2FtZSBVWCBhcyBiZWZvcmUpLlxyXG5cdFx0XHRcdFx0aGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc2VjO1xyXG5cdFx0XHRcdFx0Ly8gTkVXOiB2aXN1YWxseSBtYXJrIHdoaWNoIGNvbHVtbiBpcyBiZWluZyBlZGl0ZWRcclxuXHRcdFx0XHRcdGlmICggVUkgJiYgVUkuV1BCQ19CRkJfQ29sdW1uX1N0eWxlcyAmJiBVSS5XUEJDX0JGQl9Db2x1bW5fU3R5bGVzLnNldF9zZWxlY3RlZF9jb2xfZmxhZyApIHtcclxuXHRcdFx0XHRcdFx0VUkuV1BCQ19CRkJfQ29sdW1uX1N0eWxlcy5zZXRfc2VsZWN0ZWRfY29sX2ZsYWcoIHNlYywgcHJlc2VsZWN0X3RhYl9rZXkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNlbGVjdCBhbmQgc3RvcCBidWJibGluZyBzbyBvdXRlciBjb250YWluZXJzIGRvbuKAmXQgcmVzZWxlY3QgYSBwYXJlbnQuXHJcblx0XHRcdHRoaXMuc2VsZWN0X2ZpZWxkKCBoaXQgKTtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcblx0XHRcdC8vIEFsc28gc2V0IHRoZSB0YWIgYWZ0ZXIgdGhlIGluc3BlY3RvciByZW5kZXJzICh3b3JrcyBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG9wZW4pLlxyXG5cdFx0XHRpZiAoIHByZXNlbGVjdF90YWJfa2V5ICkge1xyXG5cdFx0XHRcdCh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHNldFRpbWVvdXQpKCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbnMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0YWJzID0gaW5zICYmIGlucy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtYmZiLXNsb3Q9XCJjb2x1bW5fc3R5bGVzXCJdIFtkYXRhLXdwYmMtdGFic10nICk7XHJcblx0XHRcdFx0XHRcdGlmICggdGFicyAmJiB3aW5kb3cud3BiY191aV90YWJzICYmIHR5cGVvZiB3aW5kb3cud3BiY191aV90YWJzLnNldF9hY3RpdmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRcdFx0d2luZG93LndwYmNfdWlfdGFicy5zZXRfYWN0aXZlKCB0YWJzLCBwcmVzZWxlY3RfdGFiX2tleSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSwgMCApO1xyXG5cclxuXHRcdFx0XHQvLyBQb2xpdGVseSBhc2sgdGhlIEluc3BlY3RvciB0byBmb2N1cy9vcGVuIHRoZSBcIkNvbHVtbiBTdHlsZXNcIiBncm91cCBhbmQgdGFiLlxyXG5cdFx0XHRcdHdwYmNfYmZiX19kaXNwYXRjaF9ldmVudF9zYWZlKFxyXG5cdFx0XHRcdFx0J3dwYmNfYmZiOmluc3BlY3Rvcl9mb2N1cycsXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGdyb3VwICA6ICdjb2x1bW5fc3R5bGVzJyxcclxuXHRcdFx0XHRcdFx0dGFiX2tleTogcHJlc2VsZWN0X3RhYl9rZXlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2VsZWN0IGEgZmllbGQgZWxlbWVudCBvciBjbGVhciBzZWxlY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBmaWVsZF9lbFxyXG5cdFx0ICogQHBhcmFtIHt7c2Nyb2xsSW50b1ZpZXc/OiBib29sZWFufX0gW29wdHMgPSB7fV1cclxuXHRcdCAqL1xyXG5cdFx0c2VsZWN0X2ZpZWxkKGZpZWxkX2VsLCB7IHNjcm9sbEludG9WaWV3ID0gZmFsc2UgfSA9IHt9KSB7XHJcblx0XHRcdGNvbnN0IHJvb3QgICA9IHRoaXMuYnVpbGRlci5wYWdlc19jb250YWluZXI7XHJcblx0XHRcdGNvbnN0IHByZXZFbCA9IHRoaXMuZ2V0X3NlbGVjdGVkX2ZpZWxkPy4oKSB8fCBudWxsOyAgIC8vIHRoZSBvbmUgd2XigJlyZSBsZWF2aW5nLlxyXG5cclxuXHRcdFx0Ly8gSWdub3JlIGVsZW1lbnRzIG5vdCBpbiB0aGUgY2FudmFzLlxyXG5cdFx0XHRpZiAoIGZpZWxkX2VsICYmICFyb290LmNvbnRhaW5zKCBmaWVsZF9lbCApICkge1xyXG5cdFx0XHRcdGZpZWxkX2VsID0gbnVsbDsgLy8gdHJlYXQgYXMgXCJubyBzZWxlY3Rpb25cIi5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTkVXOiBpZiB3ZSBhcmUgbGVhdmluZyBhIHNlY3Rpb24sIGNsZWFyIGl0cyBjb2x1bW4gaGlnaGxpZ2h0XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRwcmV2RWwgJiYgcHJldkVsICE9PSBmaWVsZF9lbCAmJlxyXG5cdFx0XHRcdHByZXZFbC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgJiZcclxuXHRcdFx0XHRVST8uV1BCQ19CRkJfQ29sdW1uX1N0eWxlcz8uY2xlYXJfc2VsZWN0ZWRfY29sX2ZsYWdcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0VUkuV1BCQ19CRkJfQ29sdW1uX1N0eWxlcy5jbGVhcl9zZWxlY3RlZF9jb2xfZmxhZyggcHJldkVsICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElmIHdlJ3JlIGxlYXZpbmcgYSBmaWVsZCwgcGVybWFuZW50bHkgc3RvcCBhdXRvLW5hbWUgZm9yIGl0LlxyXG5cdFx0XHRpZiAoIHByZXZFbCAmJiBwcmV2RWwgIT09IGZpZWxkX2VsICYmIHByZXZFbC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX2ZpZWxkJyApICkge1xyXG5cdFx0XHRcdHByZXZFbC5kYXRhc2V0LmF1dG9uYW1lID0gJzAnO1xyXG5cdFx0XHRcdHByZXZFbC5kYXRhc2V0LmZyZXNoICAgID0gJzAnO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoICcuaXMtc2VsZWN0ZWQnICkuZm9yRWFjaCggKG4pID0+IHtcclxuXHRcdFx0XHRuLmNsYXNzTGlzdC5yZW1vdmUoICdpcy1zZWxlY3RlZCcgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0XHRpZiAoICFmaWVsZF9lbCApIHtcclxuXHRcdFx0XHRjb25zdCBwcmV2ICAgICAgICAgPSB0aGlzLl9zZWxlY3RlZF91aWQgfHwgbnVsbDtcclxuXHRcdFx0XHR0aGlzLl9zZWxlY3RlZF91aWQgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMuYnVpbGRlci5pbnNwZWN0b3I/LmNsZWFyPy4oKTtcclxuXHRcdFx0XHRyb290LmNsYXNzTGlzdC5yZW1vdmUoICdoYXMtc2VsZWN0aW9uJyApO1xyXG5cdFx0XHRcdHRoaXMuYnVpbGRlci5idXMuZW1pdCggQ29yZS5XUEJDX0JGQl9FdmVudHMuQ0xFQVJfU0VMRUNUSU9OLCB7IHByZXZfdWlkOiBwcmV2LCBzb3VyY2U6ICdidWlsZGVyJyB9ICk7XHJcblxyXG5cdFx0XHRcdC8vIEF1dG8tb3BlbiBcIkFkZCBGaWVsZHNcIiB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQuXHJcblx0XHRcdFx0d3BiY19iZmJfX2Rpc3BhdGNoX2V2ZW50X3NhZmUoXG5cdFx0XHRcdFx0J3dwYmNfYmZiOnNob3dfcGFuZWwnLFxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0cGFuZWxfaWQ6ICd3cGJjX2JmYl9fcGFsZXR0ZV9hZGRfbmV3JyxcclxuXHRcdFx0XHRcdFx0dGFiX2lkICA6ICd3cGJjX3RhYl9saWJyYXJ5J1xyXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHR0aGlzLl9zeW5jX3NldHRpbmdzX2J1dHRvbl9zdGF0ZXMoKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XHJcblx0XHRcdGZpZWxkX2VsLmNsYXNzTGlzdC5hZGQoICdpcy1zZWxlY3RlZCcgKTtcclxuXHRcdFx0dGhpcy5fc2VsZWN0ZWRfdWlkID0gZmllbGRfZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS11aWQnICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIEZhbGxiYWNrOiBlbnN1cmUgc2VjdGlvbnMgYW5ub3VuY2UgdGhlbXNlbHZlcyBhcyB0eXBlPVwic2VjdGlvblwiLlxyXG5cdFx0XHRpZiAoIGZpZWxkX2VsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApICYmICFmaWVsZF9lbC5kYXRhc2V0LnR5cGUgKSB7XHJcblx0XHRcdFx0ZmllbGRfZWwuZGF0YXNldC50eXBlID0gJ3NlY3Rpb24nO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHNjcm9sbEludG9WaWV3ICkge1xyXG5cdFx0XHRcdGZpZWxkX2VsLnNjcm9sbEludG9WaWV3KCB7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuaW5zcGVjdG9yPy5iaW5kX3RvX2ZpZWxkPy4oIGZpZWxkX2VsICk7XHJcblxyXG5cdFx0XHQvLyBGYWxsYmFjazogZW5zdXJlIGluc3BlY3RvciBlbmhhbmNlcnMgKGluY2wuIFZhbHVlU2xpZGVyKSBydW4gZXZlcnkgYmluZC5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InIClcclxuXHRcdFx0XHRcdHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRpZiAoIGlucyApIHtcclxuXHRcdFx0XHRcdFVJLkluc3BlY3RvckVuaGFuY2Vycz8uc2Nhbj8uKCBpbnMgKTsgICAgICAgICAgICAgIC8vIHJ1bnMgYWxsIGVuaGFuY2Vyc1xyXG5cdFx0XHRcdFx0VUkuV1BCQ19CRkJfVmFsdWVTbGlkZXI/LmluaXRfb24/LiggaW5zICk7ICAgICAgICAgLy8gZXh0cmEgYmVsdC1hbmQtc3VzcGVuZGVyc1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIF8gKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5FVzogd2hlbiBzZWxlY3RpbmcgYSBzZWN0aW9uLCByZWZsZWN0IGl0cyBhY3RpdmUgdGFiIGFzIHRoZSBoaWdobGlnaHRlZCBjb2x1bW4uXHJcblx0XHRcdGlmICggZmllbGRfZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgJiZcclxuXHRcdFx0XHRVST8uV1BCQ19CRkJfQ29sdW1uX1N0eWxlcz8uc2V0X3NlbGVjdGVkX2NvbF9mbGFnICkge1xyXG5cdFx0XHRcdHZhciBrID0gKGZpZWxkX2VsLmRhdGFzZXQgJiYgZmllbGRfZWwuZGF0YXNldC5jb2xfc3R5bGVzX2FjdGl2ZV90YWIpXHJcblx0XHRcdFx0XHQ/IGZpZWxkX2VsLmRhdGFzZXQuY29sX3N0eWxlc19hY3RpdmVfdGFiIDogJzEnO1xyXG5cdFx0XHRcdFVJLldQQkNfQkZCX0NvbHVtbl9TdHlsZXMuc2V0X3NlbGVjdGVkX2NvbF9mbGFnKCBmaWVsZF9lbCwgayApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBLZWVwIHNlY3Rpb25zICYgZmllbGRzIGluIHRoZSBzYW1lIGZsb3c6XHJcblx0XHRcdC8vIDEpIEdlbmVyaWMgaHlkcmF0b3IgZm9yIHNpbXBsZSBkYXRhc2V0LWJhY2tlZCBjb250cm9scy5cclxuXHRcdFx0aWYgKCBmaWVsZF9lbCApIHtcclxuXHRcdFx0XHRVSS5XUEJDX0JGQl9JbnNwZWN0b3JfQnJpZGdlLl9nZW5lcmljX2h5ZHJhdGVfY29udHJvbHM/LiggdGhpcy5idWlsZGVyLCBmaWVsZF9lbCApO1xyXG5cdFx0XHRcdFVJLldQQkNfQkZCX0luc3BlY3Rvcl9CcmlkZ2UuX2h5ZHJhdGVfc3BlY2lhbF9jb250cm9scz8uKCB0aGlzLmJ1aWxkZXIsIGZpZWxkX2VsICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEF1dG8tb3BlbiBJbnNwZWN0b3Igd2hlbiBhIHVzZXIgc2VsZWN0cyBhIGZpZWxkL3NlY3Rpb24gLlxyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZShcblx0XHRcdFx0J3dwYmNfYmZiOnNob3dfcGFuZWwnLFxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRwYW5lbF9pZDogJ3dwYmNfYmZiX19pbnNwZWN0b3InLFxyXG5cdFx0XHRcdFx0dGFiX2lkICA6ICd3cGJjX3RhYl9pbnNwZWN0b3InXHJcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3N5bmNfc2V0dGluZ3NfYnV0dG9uX3N0YXRlcygpO1xuXG5cdFx0XHRyb290LmNsYXNzTGlzdC5hZGQoICdoYXMtc2VsZWN0aW9uJyApO1xuXHRcdFx0dGhpcy5idWlsZGVyLmJ1cy5lbWl0KCBDb3JlLldQQkNfQkZCX0V2ZW50cy5TRUxFQ1QsIHsgdWlkOiB0aGlzLl9zZWxlY3RlZF91aWQsIGVsOiBmaWVsZF9lbCB9ICk7XHJcblx0XHRcdGNvbnN0IGxhYmVsID0gZmllbGRfZWw/LnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2ZpZWxkLWxhYmVsJyApPy50ZXh0Q29udGVudCB8fCAoZmllbGRfZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgPyAnc2VjdGlvbicgOiAnJykgfHwgZmllbGRfZWw/LmRhdGFzZXQ/LmlkIHx8ICdpdGVtJztcclxuXHRcdFx0dGhpcy5idWlsZGVyLl9hbm5vdW5jZSggJ1NlbGVjdGVkICcgKyBsYWJlbCArICcuJyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH0gKi9cclxuXHRcdGdldF9zZWxlY3RlZF9maWVsZCgpIHtcclxuXHRcdFx0aWYgKCAhdGhpcy5fc2VsZWN0ZWRfdWlkICkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGVzY19hdHRyID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NfYXR0cl92YWx1ZV9mb3Jfc2VsZWN0b3IoIHRoaXMuX3NlbGVjdGVkX3VpZCApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5idWlsZGVyLnBhZ2VzX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCBgLndwYmNfYmZiX19maWVsZFtkYXRhLXVpZD1cIiR7ZXNjX2F0dHJ9XCJdLCAud3BiY19iZmJfX3NlY3Rpb25bZGF0YS11aWQ9XCIke2VzY19hdHRyfVwiXWAgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXYgKi9cclxuXHRcdG9uX2NsZWFyKGV2KSB7XHJcblx0XHRcdGNvbnN0IHNyYyA9IGV2Py5kZXRhaWw/LnNvdXJjZSA/PyBldj8uc291cmNlO1xyXG5cdFx0XHRpZiAoIHNyYyAhPT0gJ2J1aWxkZXInICkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0X2ZpZWxkKCBudWxsICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogQnJpZGdlcyB0aGUgYnVpbGRlciB3aXRoIHRoZSBJbnNwZWN0b3IgYW5kIHNhbml0aXplcyBpZC9uYW1lIGVkaXRzLlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX0luc3BlY3Rvcl9CcmlkZ2UgPSBjbGFzcyBleHRlbmRzIFVJLldQQkNfQkZCX01vZHVsZSB7XHJcblxyXG5cdFx0aW5pdCgpIHtcclxuXHRcdFx0dGhpcy5fYXR0YWNoX2luc3BlY3RvcigpO1xyXG5cdFx0XHR0aGlzLl9iaW5kX2lkX3Nhbml0aXplcigpO1xyXG5cdFx0XHR0aGlzLl9vcGVuX2luc3BlY3Rvcl9hZnRlcl9maWVsZF9hZGRlZCgpO1xyXG5cdFx0XHR0aGlzLl9iaW5kX2ZvY3VzX3Nob3J0Y3V0cygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9hdHRhY2hfaW5zcGVjdG9yKCkge1xyXG5cdFx0XHRjb25zdCBiICAgICAgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGNvbnN0IGF0dGFjaCA9ICgpID0+IHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiB3aW5kb3cuV1BCQ19CRkJfSW5zcGVjdG9yID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0Yi5pbnNwZWN0b3IgPSBuZXcgV1BCQ19CRkJfSW5zcGVjdG9yKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICksIGIgKTtcclxuXHRcdFx0XHRcdHRoaXMuX2JpbmRfaWRfc2FuaXRpemVyKCk7XHJcblx0XHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnd3BiY19iZmJfaW5zcGVjdG9yX3JlYWR5JywgYXR0YWNoICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0XHQvLyBFbnN1cmUgd2UgYmluZCBhZnRlciBsYXRlIHJlYWR5IGFzIHdlbGwuXHJcblx0XHRcdGlmICggdHlwZW9mIHdpbmRvdy5XUEJDX0JGQl9JbnNwZWN0b3IgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0YXR0YWNoKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Yi5pbnNwZWN0b3IgPSB7XHJcblx0XHRcdFx0XHRiaW5kX3RvX2ZpZWxkKCkge1xyXG5cdFx0XHRcdFx0fSwgY2xlYXIoKSB7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnd3BiY19iZmJfaW5zcGVjdG9yX3JlYWR5JywgYXR0YWNoICk7XHJcblx0XHRcdFx0c2V0VGltZW91dCggYXR0YWNoLCAwICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIExpc3RlbiBmb3IgXCJmb2N1c1wiIGhpbnRzIGZyb20gdGhlIGNhbnZhcyBhbmQgb3BlbiB0aGUgcmlnaHQgZ3JvdXAvdGFiLlxyXG5cdFx0ICogLSBTdXBwb3J0czogZ3JvdXAgPT09ICdjb2x1bW5fc3R5bGVzJ1xyXG5cdFx0ICogLSBBbHNvIHNjcm9sbHMgdGhlIGdyb3VwIGludG8gdmlldy5cclxuXHRcdCAqL1xyXG5cdFx0X2JpbmRfZm9jdXNfc2hvcnRjdXRzKCkge1xyXG5cdFx0XHQvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZSAqL1xyXG5cdFx0XHRjb25zdCBvbl9mb2N1cyA9IChlKSA9PiB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGNvbnN0IGdycF9rZXkgPSBlICYmIGUuZGV0YWlsICYmIGUuZGV0YWlsLmdyb3VwO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGFiX2tleSA9IGUgJiYgZS5kZXRhaWwgJiYgZS5kZXRhaWwudGFiX2tleTtcclxuXHRcdFx0XHRcdGlmICggIWdycF9rZXkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRcdFx0aWYgKCAhaW5zICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBncnBfa2V5ID09PSAnY29sdW1uX3N0eWxlcycgKSB7XHJcblx0XHRcdFx0XHRcdC8vIEZpbmQgdGhlIENvbHVtbiBTdHlsZXMgc2xvdC9ncm91cC5cclxuXHRcdFx0XHRcdFx0Y29uc3Qgc2xvdCA9IGlucy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtYmZiLXNsb3Q9XCJjb2x1bW5fc3R5bGVzXCJdJyApIHx8IGlucy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWdyb3VwLWtleT1cImNvbHVtbl9zdHlsZXNcIl0nICk7XHJcblx0XHRcdFx0XHRcdGlmICggc2xvdCApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBPcGVuIGNvbGxhcHNpYmxlIGNvbnRhaW5lciBpZiBwcmVzZW50LlxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwX3dyYXAgPSBzbG90LmNsb3Nlc3QoICcuaW5zcGVjdG9yX19ncm91cCcgKSB8fCBzbG90LmNsb3Nlc3QoICdbZGF0YS1pbnNwZWN0b3ItZ3JvdXBdJyApO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggZ3JvdXBfd3JhcCAmJiAhZ3JvdXBfd3JhcC5jbGFzc0xpc3QuY29udGFpbnMoICdpcy1vcGVuJyApICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXBfd3JhcC5jbGFzc0xpc3QuYWRkKCAnaXMtb3BlbicgKTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIE1pcnJvciBBUklBIHN0YXRlIGlmIHlvdXIgaGVhZGVyIHVzZXMgYXJpYS1leHBhbmRlZC5cclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGhlYWRlcl9idG4gPSBncm91cF93cmFwLnF1ZXJ5U2VsZWN0b3IoICdbYXJpYS1leHBhbmRlZF0nICk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGhlYWRlcl9idG4gKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlcl9idG4uc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsICd0cnVlJyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWw6IHNldCB0aGUgcmVxdWVzdGVkIHRhYiBrZXkgaWYgdGFicyBleGlzdCBpbiB0aGlzIGdyb3VwLlxyXG5cdFx0XHRcdFx0XHRcdGlmICggdGFiX2tleSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRhYnMgPSBzbG90LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLXRhYnNdJyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0YWJzICYmIHdpbmRvdy53cGJjX3VpX3RhYnMgJiYgdHlwZW9mIHdpbmRvdy53cGJjX3VpX3RhYnMuc2V0X2FjdGl2ZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LndwYmNfdWlfdGFicy5zZXRfYWN0aXZlKCB0YWJzLCBTdHJpbmcoIHRhYl9rZXkgKSApO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gQnJpbmcgaW50byB2aWV3IGZvciBjb252ZW5pZW5jZS5cclxuXHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVW5jb21tZW50IChPbmx5ICBpZiBuZWVkZWQpIHRoaXMgdG8gQVVUTyBTQ1JPTEwgdG8gIHNwZWNpZmljIENPTFVNTiBpbiB0aGUgc2VjdGlvbjouXHJcblx0XHRcdFx0XHRcdFx0XHQvLyBzbG90LnNjcm9sbEludG9WaWV3KCB7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9ICk7XHJcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIF9lICkge31cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHt9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHR0aGlzLl9vbl9pbnNwZWN0b3JfZm9jdXMgPSBvbl9mb2N1cztcclxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3dwYmNfYmZiOmluc3BlY3Rvcl9mb2N1cycsIG9uX2ZvY3VzLCB0cnVlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGVzdHJveSgpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRpZiAoIHRoaXMuX29uX2luc3BlY3Rvcl9mb2N1cyApIHtcclxuXHRcdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3cGJjX2JmYjppbnNwZWN0b3JfZm9jdXMnLCB0aGlzLl9vbl9pbnNwZWN0b3JfZm9jdXMsIHRydWUgKTtcclxuXHRcdFx0XHRcdHRoaXMuX29uX2luc3BlY3Rvcl9mb2N1cyA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIeWRyYXRlIGluc3BlY3RvciBpbnB1dHMgZm9yIFwic3BlY2lhbFwiIGtleXMgdGhhdCB3ZSBoYW5kbGUgZXhwbGljaXRseS5cclxuXHRcdCAqIFdvcmtzIGZvciBib3RoIGZpZWxkcyBhbmQgc2VjdGlvbnMuXHJcblx0XHQgKiBAcGFyYW0ge1dQQkNfRm9ybV9CdWlsZGVyfSBidWlsZGVyXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzZWxcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIF9oeWRyYXRlX3NwZWNpYWxfY29udHJvbHMoYnVpbGRlciwgc2VsKSB7XHJcblx0XHRcdGNvbnN0IGlucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0aWYgKCAhaW5zIHx8ICFzZWwgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBzZXRWYWwgPSAoa2V5LCB2YWwpID0+IHtcclxuXHRcdFx0XHRjb25zdCBjdHJsID0gaW5zLnF1ZXJ5U2VsZWN0b3IoIGBbZGF0YS1pbnNwZWN0b3Ita2V5PVwiJHtrZXl9XCJdYCApO1xyXG5cdFx0XHRcdGlmICggY3RybCAmJiAndmFsdWUnIGluIGN0cmwgKSBjdHJsLnZhbHVlID0gU3RyaW5nKCB2YWwgPz8gJycgKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8vIEludGVybmFsIGlkIC8gbmFtZSAvIHB1YmxpYyBodG1sX2lkLlxyXG5cdFx0XHRzZXRWYWwoICdpZCcsIHNlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWlkJyApIHx8ICcnICk7XHJcblx0XHRcdHNldFZhbCggJ25hbWUnLCBzZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJyApIHx8ICcnICk7XHJcblx0XHRcdHNldFZhbCggJ2h0bWxfaWQnLCBzZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1odG1sX2lkJyApIHx8ICcnICk7XHJcblxyXG5cdFx0XHQvLyBTZWN0aW9uLW9ubHkgZXh0cmFzIGFyZSBoYXJtbGVzcyB0byBzZXQgZm9yIGZpZWxkcyAoY29udHJvbHMgbWF5IG5vdCBleGlzdCkuXHJcblx0XHRcdHNldFZhbCggJ2Nzc2NsYXNzJywgc2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtY3NzY2xhc3MnICkgfHwgJycgKTtcclxuXHRcdFx0c2V0VmFsKCAnbGFiZWwnLCBzZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcgKSB8fCAnJyApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEh5ZHJhdGUgaW5zcGVjdG9yIGlucHV0cyB0aGF0IGRlY2xhcmUgYSBnZW5lcmljIGRhdGFzZXQgbWFwcGluZyB2aWFcclxuXHRcdCAqIFtkYXRhLWluc3BlY3Rvci1rZXldIGJ1dCBkbyBOT1QgZGVjbGFyZSBhIGN1c3RvbSB2YWx1ZV9mcm9tIGFkYXB0ZXIuXHJcblx0XHQgKiBUaGlzIG1ha2VzIHNlY3Rpb25zIGZvbGxvdyB0aGUgc2FtZSBkYXRhIGZsb3cgYXMgZmllbGRzIHdpdGggYWxtb3N0IG5vIGdsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtXUEJDX0Zvcm1fQnVpbGRlcn0gYnVpbGRlclxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2VsIC0gY3VycmVudGx5IHNlbGVjdGVkIGZpZWxkL3NlY3Rpb25cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIF9nZW5lcmljX2h5ZHJhdGVfY29udHJvbHMoYnVpbGRlciwgc2VsKSB7XHJcblx0XHRcdGNvbnN0IGlucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0aWYgKCAhaW5zIHx8ICFzZWwgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBTS0lQID0gL14oaWR8bmFtZXxodG1sX2lkfGNzc2NsYXNzfGxhYmVsKSQvOyAvLyBoYW5kbGVkIGJ5IF9oeWRyYXRlX3NwZWNpYWxfY29udHJvbHNcclxuXHJcblx0XHRcdC8vIE5FVzogcmVhZCBzY2hlbWEgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW504oCZcyB0eXBlLlxyXG5cdFx0XHRjb25zdCBzY2hlbWFzICAgICA9IHdpbmRvdy5XUEJDX0JGQl9TY2hlbWFzIHx8IHt9O1xyXG5cdFx0XHRjb25zdCB0eXBlS2V5ICAgICA9IChzZWwuZGF0YXNldCAmJiBzZWwuZGF0YXNldC50eXBlKSB8fCAnJztcclxuXHRcdFx0Y29uc3Qgc2NoZW1hRW50cnkgPSBzY2hlbWFzW3R5cGVLZXldIHx8IG51bGw7XHJcblx0XHRcdGNvbnN0IHByb3BzU2NoZW1hID0gKHNjaGVtYUVudHJ5ICYmIHNjaGVtYUVudHJ5LnNjaGVtYSAmJiBzY2hlbWFFbnRyeS5zY2hlbWEucHJvcHMpID8gc2NoZW1hRW50cnkuc2NoZW1hLnByb3BzIDoge307XHJcblx0XHRcdGNvbnN0IGhhc093biAgICAgID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZCggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSApO1xyXG5cdFx0XHRjb25zdCBnZXREZWZhdWx0ICA9IChrZXkpID0+IHtcclxuXHRcdFx0XHRjb25zdCBtZXRhID0gcHJvcHNTY2hlbWFba2V5XTtcclxuXHRcdFx0XHRyZXR1cm4gKG1ldGEgJiYgaGFzT3duKCBtZXRhLCAnZGVmYXVsdCcgKSkgPyBtZXRhLmRlZmF1bHQgOiB1bmRlZmluZWQ7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpbnMucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLWluc3BlY3Rvci1rZXldJyApLmZvckVhY2goIChjdHJsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qga2V5ID0gU3RyaW5nKCBjdHJsLmRhdGFzZXQ/Lmluc3BlY3RvcktleSB8fCAnJyApLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0aWYgKCAha2V5IHx8IFNLSVAudGVzdCgga2V5ICkgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdC8vIEVsZW1lbnQtbGV2ZWwgbG9jay5cclxuXHRcdFx0XHRjb25zdCBkbCA9IChjdHJsLmRhdGFzZXQ/LmxvY2tlZCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0aWYgKCBkbCA9PT0gJzEnIHx8IGRsID09PSAndHJ1ZScgfHwgZGwgPT09ICd5ZXMnICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHQvLyBSZXNwZWN0IGV4cGxpY2l0IGFkYXB0ZXJzLlxyXG5cdFx0XHRcdGlmICggY3RybC5kYXRhc2V0Py52YWx1ZV9mcm9tIHx8IGN0cmwuZGF0YXNldD8udmFsdWVGcm9tICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjb25zdCByYXcgICAgICA9IHNlbC5kYXRhc2V0ID8gc2VsLmRhdGFzZXRba2V5XSA6IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRjb25zdCBoYXNSYXcgICA9IHNlbC5kYXRhc2V0ID8gaGFzT3duKCBzZWwuZGF0YXNldCwga2V5ICkgOiBmYWxzZTtcclxuXHRcdFx0XHRjb25zdCBkZWZWYWx1ZSA9IGdldERlZmF1bHQoIGtleSApO1xyXG5cclxuXHRcdFx0XHQvLyBCZXN0LWVmZm9ydCBjb250cm9sIHR5cGluZyB3aXRoIHNjaGVtYSBkZWZhdWx0IGZhbGxiYWNrIHdoZW4gdmFsdWUgaXMgYWJzZW50LlxyXG5cclxuXHRcdFx0XHRpZiAoIGN0cmwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIChjdHJsLnR5cGUgPT09ICdjaGVja2JveCcgfHwgY3RybC50eXBlID09PSAncmFkaW8nKSApIHtcclxuXHRcdFx0XHRcdC8vIElmIGRhdGFzZXQgaXMgbWlzc2luZyB0aGUga2V5IGVudGlyZWx5IC0+IHVzZSBzY2hlbWEgZGVmYXVsdCAoYm9vbGVhbikuXHJcblx0XHRcdFx0XHRpZiAoICFoYXNSYXcgKSB7XHJcblx0XHRcdFx0XHRcdGN0cmwuY2hlY2tlZCA9ICEhZGVmVmFsdWU7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBBbiBleHBsaWNpdCBlbXB0eSB2YWx1ZSBpcyB0aGUgbGVnYWN5IHBlcnNpc3RlZCByZXByZXNlbnRhdGlvbiBvZiBmYWxzZS5cclxuXHRcdFx0XHRcdFx0Y3RybC5jaGVja2VkID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5jb2VyY2VfYm9vbGVhbiggcmF3LCBmYWxzZSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoICd2YWx1ZScgaW4gY3RybCApIHtcclxuXHRcdFx0XHRcdGlmICggaGFzUmF3ICkge1xyXG5cdFx0XHRcdFx0XHRjdHJsLnZhbHVlID0gKHJhdyAhPSBudWxsKSA/IFN0cmluZyggcmF3ICkgOiAnJztcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGN0cmwudmFsdWUgPSAoZGVmVmFsdWUgPT0gbnVsbCkgPyAnJyA6IFN0cmluZyggZGVmVmFsdWUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRfYmluZF9pZF9zYW5pdGl6ZXIoKSB7XHJcblx0XHRcdGNvbnN0IGIgICA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29uc3QgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRpZiAoICEgaW5zICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGlucy5fX3dwYmNfYmZiX2lkX3Nhbml0aXplcl9ib3VuZCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aW5zLl9fd3BiY19iZmJfaWRfc2FuaXRpemVyX2JvdW5kID0gdHJ1ZTtcclxuXHJcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ID0gZS50YXJnZXQ7XHJcblx0XHRcdFx0aWYgKCAhdCB8fCAhKCd2YWx1ZScgaW4gdCkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGtleSAgICAgICA9ICh0LmRhdGFzZXQ/Lmluc3BlY3RvcktleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRjb25zdCBzZWwgICAgICAgPSBiLmdldF9zZWxlY3RlZF9maWVsZD8uKCk7XHJcblx0XHRcdFx0Y29uc3QgaXNTZWN0aW9uID0gc2VsPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICk7XHJcblx0XHRcdFx0aWYgKCAhc2VsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHQvLyBVbmlmaWVkIGVtaXR0ZXIgdGhhdCBhbHdheXMgaW5jbHVkZXMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLlxyXG5cdFx0XHRcdGNvbnN0IEVWICAgICAgICAgICAgICA9IENvcmUuV1BCQ19CRkJfRXZlbnRzO1xyXG5cdFx0XHRcdC8vIFNUUlVDVFVSRV9DSEFOR0UgY2FuIGJlIFwiZXhwZW5zaXZlXCIgYmVjYXVzZSBvdGhlciBsaXN0ZW5lcnMgbWF5IHRyaWdnZXIgZnVsbCBjYW52YXMgcmVmcmVzaC5cclxuXHRcdFx0XHQvLyBEZWJvdW5jZSBvbmx5IGNvbnRpbnVvdXMgY29udHJvbHMgKGUuZy4gdmFsdWUgc2xpZGVyIHNjcnViYmluZykgb24gdGhlIElOUFVUIHBoYXNlLlxyXG5cdFx0XHRcdGNvbnN0IGVuc3VyZV9zY19kZWJvdW5jZV9zdGF0ZSA9ICgpID0+IHtcclxuXHRcdFx0XHRcdGlmICggYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Yi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlID0geyB0aW1lcl9pZDogMCwgcGVuZGluZ19wYXlsb2FkOiBudWxsIH07XHJcblx0XHRcdFx0XHRyZXR1cm4gYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhbmNlbF9zY19kZWJvdW5jZWRfZW1pdCA9ICgpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHN0ID0gYi5fX3dwYmNfYmZiX3NjX2RlYm91bmNlX3N0YXRlO1xyXG5cdFx0XHRcdFx0aWYgKCAhc3QgKSByZXR1cm47XHJcblx0XHRcdFx0XHR0cnkgeyBjbGVhclRpbWVvdXQoIHN0LnRpbWVyX2lkICk7IH0gY2F0Y2ggKCBfICkge31cclxuXHRcdFx0XHRcdHN0LnRpbWVyX2lkICAgICAgICA9IDA7XHJcblx0XHRcdFx0XHRzdC5wZW5kaW5nX3BheWxvYWQgPSBudWxsO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1c19lbWl0X2NoYW5nZSA9IChyZWFzb24sIGV4dHJhID0ge30pID0+IHtcclxuXHRcdFx0XHRcdC8vIElmIHdl4oCZcmUgY29tbWl0dGluZyBzb21ldGhpbmcgKGNoYW5nZS9ibHVyL2V0YyksIGRyb3AgYW55IHBlbmRpbmcgXCJpbnB1dFwiIGVtaXQuXHJcblx0XHRcdFx0XHRjYW5jZWxfc2NfZGVib3VuY2VkX2VtaXQoKTtcclxuXHRcdFx0XHRcdGIuYnVzPy5lbWl0Py4oIEVWLlNUUlVDVFVSRV9DSEFOR0UsIHsgcmVhc29uLCBlbDogc2VsLCAuLi5leHRyYSB9ICk7XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVzX2VtaXRfY2hhbmdlX2RlYm91bmNlZCA9IChyZWFzb24sIGV4dHJhID0ge30sIHdhaXRfbXMpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHN0ID0gZW5zdXJlX3NjX2RlYm91bmNlX3N0YXRlKCk7XHJcblx0XHRcdFx0XHRjb25zdCBtcyA9IE51bWJlci5pc0Zpbml0ZSggd2FpdF9tcyApXHJcblx0XHRcdFx0XHRcdD8gd2FpdF9tc1xyXG5cdFx0XHRcdFx0XHQ6IChOdW1iZXIuaXNGaW5pdGUoIFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgKSA/IFVJLlNUUlVDVFVSRV9DSEFOR0VfREVCT1VOQ0VfTVMgOiAyNDApO1xyXG5cclxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIENVUlJFTlQgc2VsZWN0ZWQgZWxlbWVudCBpbnRvIHRoZSBwYXlsb2FkIG5vdyAoc3RhYmxlIHJlZikuXHJcblx0XHRcdFx0XHRzdC5wZW5kaW5nX3BheWxvYWQgPSB7IHJlYXNvbiwgZWw6IHNlbCwgLi4uZXh0cmEsIGRlYm91bmNlZDogdHJ1ZSB9O1xyXG5cclxuXHRcdFx0XHRcdHRyeSB7IGNsZWFyVGltZW91dCggc3QudGltZXJfaWQgKTsgfSBjYXRjaCAoIF8gKSB7fVxyXG5cdFx0XHRcdFx0c3QudGltZXJfaWQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdHN0LnRpbWVyX2lkID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcGF5bG9hZCA9IHN0LnBlbmRpbmdfcGF5bG9hZDtcclxuXHRcdFx0XHRcdFx0c3QucGVuZGluZ19wYXlsb2FkID0gbnVsbDtcclxuXHRcdFx0XHRcdFx0aWYgKCBwYXlsb2FkICkge1xyXG5cdFx0XHRcdFx0XHRcdGIuYnVzPy5lbWl0Py4oIEVWLlNUUlVDVFVSRV9DSEFOR0UsIHBheWxvYWQgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSwgbXMgKTtcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHQvLyAtLS0tIEZJRUxEL1NFQ1RJT046IGludGVybmFsIGlkIC0tLS1cclxuXHRcdFx0XHRpZiAoIGtleSA9PT0gJ2lkJyApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHVuaXF1ZSA9IGIuaWQuc2V0X2ZpZWxkX2lkKCBzZWwsIHQudmFsdWUgKTtcclxuXHRcdFx0XHRcdGlmICggYi5wcmV2aWV3X21vZGUgJiYgIWlzU2VjdGlvbiApIHtcclxuXHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIHQudmFsdWUgIT09IHVuaXF1ZSApIHtcclxuXHRcdFx0XHRcdFx0dC52YWx1ZSA9IHVuaXF1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJ1c19lbWl0X2NoYW5nZSggJ2lkLWNoYW5nZScgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIC0tLS0gRklFTEQvU0VDVElPTjogcHVibGljIEhUTUwgaWQgLS0tLVxyXG5cdFx0XHRcdGlmICgga2V5ID09PSAnaHRtbF9pZCcgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBhcHBsaWVkID0gYi5pZC5zZXRfZmllbGRfaHRtbF9pZCggc2VsLCB0LnZhbHVlICk7XHJcblx0XHRcdFx0XHQvLyBGb3Igc2VjdGlvbnMsIGFsc28gc2V0IHRoZSByZWFsIERPTSBpZCBzbyBhbmNob3JzL0NTUyBjYW4gdGFyZ2V0IGl0LlxyXG5cdFx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdHNlbC5pZCA9IGFwcGxpZWQgfHwgJyc7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBiLnByZXZpZXdfbW9kZSApIHtcclxuXHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIHQudmFsdWUgIT09IGFwcGxpZWQgKSB7XHJcblx0XHRcdFx0XHRcdHQudmFsdWUgPSBhcHBsaWVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlKCAnaHRtbC1pZC1jaGFuZ2UnICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyAtLS0tIEZJRUxEUyBPTkxZOiBuYW1lIC0tLS1cclxuXHRcdFx0XHRpZiAoIGtleSA9PT0gJ25hbWUnICYmICFpc1NlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gTGl2ZSB0eXBpbmc6IHNhbml0aXplIG9ubHkgKE5PIHVuaXF1ZW5lc3MgeWV0KSB0byBhdm9pZCBcIi0yXCIgc3BhbVxyXG5cdFx0XHRcdFx0aWYgKCBlLnR5cGUgPT09ICdpbnB1dCcgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJlZm9yZSAgICA9IHQudmFsdWU7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHNhbml0aXplZCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCBiZWZvcmUgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBiZWZvcmUgIT09IHNhbml0aXplZCApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBvcHRpb25hbDogcHJlc2VydmUgY2FyZXQgdG8gYXZvaWQganVtcFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbFN0YXJ0ID0gdC5zZWxlY3Rpb25TdGFydCwgc2VsRW5kID0gdC5zZWxlY3Rpb25FbmQ7XHJcblx0XHRcdFx0XHRcdFx0dC52YWx1ZSAgICAgICAgPSBzYW5pdGl6ZWQ7XHJcblx0XHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRcdHQuc2V0U2VsZWN0aW9uUmFuZ2UoIHNlbFN0YXJ0LCBzZWxFbmQgKTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuOyAvLyB1bmlxdWVuZXNzIG9uIGNoYW5nZS9ibHVyXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ29tbWl0IChjaGFuZ2UvYmx1cilcclxuXHRcdFx0XHRcdGNvbnN0IHJhdyA9IFN0cmluZyggdC52YWx1ZSA/PyAnJyApLnRyaW0oKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoICFyYXcgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFJFU0VFRDoga2VlcCBuYW1lIG5vbi1lbXB0eSBhbmQgcHJvdmlzaW9uYWwgKGF1dG9uYW1lIHN0YXlzIE9OKVxyXG5cdFx0XHRcdFx0XHRjb25zdCBTICAgID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYmFzZSA9IFMuc2FuaXRpemVfaHRtbF9uYW1lKCBzZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1pZCcgKSB8fCBzZWwuZGF0YXNldC5pZCB8fCBzZWwuZGF0YXNldC50eXBlIHx8ICdmaWVsZCcgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdW5pcSA9IGIuaWQuZW5zdXJlX3VuaXF1ZV9maWVsZF9uYW1lKCBiYXNlLCBzZWwgKTtcclxuXHJcblx0XHRcdFx0XHRcdHNlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRcdHNlbC5kYXRhc2V0LmF1dG9uYW1lICAgICAgICAgID0gJzEnO1xyXG5cdFx0XHRcdFx0XHRzZWwuZGF0YXNldC5uYW1lX3VzZXJfdG91Y2hlZCA9ICcwJztcclxuXHJcblx0XHRcdFx0XHRcdC8vIEtlZXAgRE9NIGluIHN5bmMgaWYgd2XigJlyZSBub3QgcmUtcmVuZGVyaW5nXHJcblx0XHRcdFx0XHRcdGlmICggIWIucHJldmlld19tb2RlICkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN0cmwgPSBzZWwucXVlcnlTZWxlY3RvciggJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcgKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGN0cmwgKSBjdHJsLnNldEF0dHJpYnV0ZSggJ25hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggdC52YWx1ZSAhPT0gdW5pcSApIHQudmFsdWUgPSB1bmlxO1xyXG5cdFx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICduYW1lLXJlc2VlZCcgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIE5vbi1lbXB0eSBjb21taXQ6IHVzZXIgdGFrZXMgY29udHJvbDsgZGlzYWJsZSBhdXRvbmFtZSBnb2luZyBmb3J3YXJkXHJcblx0XHRcdFx0XHRzZWwuZGF0YXNldC5uYW1lX3VzZXJfdG91Y2hlZCA9ICcxJztcclxuXHRcdFx0XHRcdHNlbC5kYXRhc2V0LmF1dG9uYW1lICAgICAgICAgID0gJzAnO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNhbml0aXplZCA9IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCByYXcgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHVuaXF1ZSAgICA9IGIuaWQuc2V0X2ZpZWxkX25hbWUoIHNlbCwgc2FuaXRpemVkICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhYi5wcmV2aWV3X21vZGUgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGN0cmwgPSBzZWwucXVlcnlTZWxlY3RvciggJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBjdHJsICkgY3RybC5zZXRBdHRyaWJ1dGUoICduYW1lJywgdW5pcXVlICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRiLnJlbmRlcl9wcmV2aWV3KCBzZWwgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHQudmFsdWUgIT09IHVuaXF1ZSApIHQudmFsdWUgPSB1bmlxdWU7XHJcblx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICduYW1lLWNoYW5nZScgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIC0tLS0gU0VDVElPTlMgJiBGSUVMRFM6IGNzc2NsYXNzIChsaXZlIGFwcGx5OyBubyByZS1yZW5kZXIpIC0tLS1cclxuXHRcdFx0XHRpZiAoIGtleSA9PT0gJ2Nzc2NsYXNzJyApIHtcclxuXHRcdFx0XHRcdGNvbnN0IG5leHQgICAgICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2Nzc19jbGFzc2xpc3QoIHQudmFsdWUgfHwgJycgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRlc2lyZWRBcnIgPSBuZXh0LnNwbGl0KCAvXFxzKy8gKS5maWx0ZXIoIEJvb2xlYW4gKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRlc2lyZWRTZXQgPSBuZXcgU2V0KCBkZXNpcmVkQXJyICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ29yZSBjbGFzc2VzIGFyZSBuZXZlciB0b3VjaGVkLlxyXG5cdFx0XHRcdFx0Y29uc3QgaXNDb3JlID0gKGNscykgPT4gY2xzID09PSAnaXMtc2VsZWN0ZWQnIHx8IGNscy5zdGFydHNXaXRoKCAnd3BiY18nICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gU25hcHNob3QgYmVmb3JlIG11dGF0aW5nIChET01Ub2tlbkxpc3QgaXMgbGl2ZSkuXHJcblx0XHRcdFx0XHRjb25zdCBiZWZvcmVDbGFzc2VzID0gQXJyYXkuZnJvbSggc2VsLmNsYXNzTGlzdCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgY3VzdG9tQmVmb3JlICA9IGJlZm9yZUNsYXNzZXMuZmlsdGVyKCAoYykgPT4gIWlzQ29yZSggYyApICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHN0cmF5IG5vbi1jb3JlIGNsYXNzZXMgbm90IGluIGRlc2lyZWQuXHJcblx0XHRcdFx0XHRjdXN0b21CZWZvcmUuZm9yRWFjaCggKGMpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKCAhZGVzaXJlZFNldC5oYXMoIGMgKSApIHNlbC5jbGFzc0xpc3QucmVtb3ZlKCBjICk7XHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRkIG1pc3NpbmcgZGVzaXJlZCBjbGFzc2VzIGluIG9uZSBnby5cclxuXHRcdFx0XHRcdGNvbnN0IG1pc3NpbmcgPSBkZXNpcmVkQXJyLmZpbHRlciggKGMpID0+ICFjdXN0b21CZWZvcmUuaW5jbHVkZXMoIGMgKSApO1xyXG5cdFx0XHRcdFx0aWYgKCBtaXNzaW5nLmxlbmd0aCApIHNlbC5jbGFzc0xpc3QuYWRkKCAuLi5taXNzaW5nICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gS2VlcCBkYXRhc2V0IGluIHN5bmMgKGF2b2lkIHVzZWxlc3MgYXR0cmlidXRlIHdyaXRlcykuXHJcblx0XHRcdFx0XHRpZiAoIHNlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWNzc2NsYXNzJyApICE9PSBuZXh0ICkge1xyXG5cdFx0XHRcdFx0XHRzZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1jc3NjbGFzcycsIG5leHQgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBFbWl0IG9ubHkgaWYgc29tZXRoaW5nIGFjdHVhbGx5IGNoYW5nZWQuXHJcblx0XHRcdFx0XHRjb25zdCBhZnRlckNsYXNzZXMgPSBBcnJheS5mcm9tKCBzZWwuY2xhc3NMaXN0ICk7XHJcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VkICAgICAgPSBhZnRlckNsYXNzZXMubGVuZ3RoICE9PSBiZWZvcmVDbGFzc2VzLmxlbmd0aCB8fCBiZWZvcmVDbGFzc2VzLnNvbWUoIChjLCBpKSA9PiBjICE9PSBhZnRlckNsYXNzZXNbaV0gKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXRhaWwgPSB7IGtleTogJ2Nzc2NsYXNzJywgcGhhc2U6IGUudHlwZSB9O1xyXG5cdFx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdGJ1c19lbWl0X2NoYW5nZSggJ2Nzc2NsYXNzLWNoYW5nZScsIGRldGFpbCApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlKCAncHJvcC1jaGFuZ2UnLCBkZXRhaWwgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0XHQvLyAtLS0tIFNFQ1RJT05TOiBsYWJlbCAtLS0tXHJcblx0XHRcdFx0aWYgKCBpc1NlY3Rpb24gJiYga2V5ID09PSAnbGFiZWwnICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gU3RyaW5nKCB0LnZhbHVlID8/ICcnICk7XHJcblx0XHRcdFx0XHRzZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1sYWJlbCcsIHZhbCApO1xyXG5cdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlKCAnbGFiZWwtY2hhbmdlJyApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gLS0tLSBGSUVMRFM6IGxhYmVsIChhdXRvLW5hbWUgd2hpbGUgdHlwaW5nOyBmcmVlemUgb24gY29tbWl0KSAtLS0tXHJcblx0XHRcdFx0aWYgKCAhaXNTZWN0aW9uICYmIGtleSA9PT0gJ2xhYmVsJyApIHtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbCAgICAgICAgID0gU3RyaW5nKCB0LnZhbHVlID8/ICcnICk7XHJcblx0XHRcdFx0XHRzZWwuZGF0YXNldC5sYWJlbCA9IHZhbDtcclxuXHJcblx0XHRcdFx0XHQvLyB3aGlsZSB0eXBpbmcsIGFsbG93IGF1dG8tbmFtZSAoaWYgZmxhZ3MgcGVybWl0KVxyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0Q29yZS5XUEJDX0JGQl9GaWVsZF9CYXNlLm1heWJlX2F1dG9uYW1lX2Zyb21fbGFiZWwoIGIsIHNlbCwgdmFsICk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBpZiB1c2VyIGNvbW1pdHRlZCB0aGUgbGFiZWwgKGJsdXIvY2hhbmdlKSwgZnJlZXplIGZ1dHVyZSBhdXRvLW5hbWVcclxuXHRcdFx0XHRcdGlmICggZS50eXBlICE9PSAnaW5wdXQnICkge1xyXG5cdFx0XHRcdFx0XHRzZWwuZGF0YXNldC5hdXRvbmFtZSA9ICcwJzsgICAvLyBzdG9wIGZ1dHVyZSBsYWJlbC0+bmFtZSBzeW5jXHJcblx0XHRcdFx0XHRcdHNlbC5kYXRhc2V0LmZyZXNoICAgID0gJzAnOyAgIC8vIGFsc28ga2lsbCB0aGUgXCJmcmVzaFwiIGVzY2FwZSBoYXRjaFxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIE9wdGlvbmFsIFVJIG5pY2V0eTogZGlzYWJsZSBOYW1lIHdoZW4gYXV0byBpcyBPTiwgZW5hYmxlIHdoZW4gT0ZGXHJcblx0XHRcdFx0XHRjb25zdCBpbnMgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hbWVDdHJsID0gaW5zPy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWtleT1cIm5hbWVcIl0nICk7XHJcblx0XHRcdFx0XHRpZiAoIG5hbWVDdHJsICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhdXRvQWN0aXZlID1cclxuXHRcdFx0XHRcdFx0XHRcdCAgKHNlbC5kYXRhc2V0LmF1dG9uYW1lID8/ICcxJykgIT09ICcwJyAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0ICBzZWwuZGF0YXNldC5uYW1lX3VzZXJfdG91Y2hlZCAhPT0gJzEnICYmXHJcblx0XHRcdFx0XHRcdFx0XHQgIHNlbC5kYXRhc2V0Lndhc19sb2FkZWQgIT09ICcxJztcclxuXHRcdFx0XHRcdFx0bmFtZUN0cmwudG9nZ2xlQXR0cmlidXRlKCAnZGlzYWJsZWQnLCBhdXRvQWN0aXZlICk7XHJcblx0XHRcdFx0XHRcdGlmICggYXV0b0FjdGl2ZSAmJiAhbmFtZUN0cmwucGxhY2Vob2xkZXIgKSB7XHJcblx0XHRcdFx0XHRcdFx0bmFtZUN0cmwucGxhY2Vob2xkZXIgPSBiPy5pMThuPy5hdXRvX2Zyb21fbGFiZWwgPz8gJ2F1dG8g4oCUIGZyb20gbGFiZWwnO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICggIWF1dG9BY3RpdmUgJiYgbmFtZUN0cmwucGxhY2Vob2xkZXIgPT09IChiPy5pMThuPy5hdXRvX2Zyb21fbGFiZWwgPz8gJ2F1dG8g4oCUIGZyb20gbGFiZWwnKSApIHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lQ3RybC5wbGFjZWhvbGRlciA9ICcnO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHJlLXJlbmRlciB0aGUgcHJldmlldyBzbyBsYWJlbCBjaGFuZ2VzIGFyZSB2aXNpYmxlIGltbWVkaWF0ZWx5LlxyXG5cdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHRidXNfZW1pdF9jaGFuZ2UoICdsYWJlbC1jaGFuZ2UnICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0Ly8gLS0tLSBERUZBVUxUIChHRU5FUklDKTogZGF0YXNldCB3cml0ZXIgZm9yIGJvdGggZmllbGRzICYgc2VjdGlvbnMgLS0tLVxyXG5cdFx0XHRcdC8vIEFueSBpbnNwZWN0b3IgY29udHJvbCB3aXRoIFtkYXRhLWluc3BlY3Rvci1rZXldIHRoYXQgZG9lc24ndCBoYXZlIGEgY3VzdG9tXHJcblx0XHRcdFx0Ly8gYWRhcHRlci92YWx1ZV9mcm9tIHdpbGwgc2ltcGx5IHJlYWQvd3JpdGUgc2VsLmRhdGFzZXRba2V5XS5cclxuXHRcdFx0XHRpZiAoIGtleSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzZWxmTG9ja2VkID0gL14oMXx0cnVlfHllcykkL2kudGVzdCggKHQuZGF0YXNldD8ubG9ja2VkIHx8ICcnKS50cmltKCkgKTtcclxuXHRcdFx0XHRcdGlmICggc2VsZkxvY2tlZCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFNraXAga2V5cyB3ZSBoYW5kbGVkIGFib3ZlIHRvIGF2b2lkIGRvdWJsZSB3b3JrLlxyXG5cdFx0XHRcdFx0aWYgKCBrZXkgPT09ICdpZCcgfHwga2V5ID09PSAnbmFtZScgfHwga2V5ID09PSAnaHRtbF9pZCcgfHwga2V5ID09PSAnY3NzY2xhc3MnIHx8IGtleSA9PT0gJ2xhYmVsJyApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bGV0IG5leHRWYWwgPSAnJztcclxuXHRcdFx0XHRcdGlmICggdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgKHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0LnR5cGUgPT09ICdyYWRpbycpICkge1xyXG5cdFx0XHRcdFx0XHQvLyBQZXJzaXN0IGJvdGggYm9vbGVhbiBzdGF0ZXMgZXhwbGljaXRseSBzbyBzY2hlbWEgZGVmYXVsdHMgY2Fubm90IHJlcGxhY2UgZmFsc2UuXHJcblx0XHRcdFx0XHRcdG5leHRWYWwgPSB0LmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggJ3ZhbHVlJyBpbiB0ICkge1xyXG5cdFx0XHRcdFx0XHRuZXh0VmFsID0gU3RyaW5nKCB0LnZhbHVlID8/ICcnICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBQZXJzaXN0IHRvIGRhdGFzZXQuXHJcblx0XHRcdFx0XHRpZiAoIHNlbD8uZGF0YXNldCApIHNlbC5kYXRhc2V0W2tleV0gPSBuZXh0VmFsO1xyXG5cclxuXHRcdFx0XHRcdC8vIEdlbmVyYXRvciBjb250cm9scyBhcmUgXCJVSSBpbnB1dHNcIiDigJQgYXZvaWQgU1RSVUNUVVJFX0NIQU5HRSBzcGFtIHdoaWxlIGRyYWdnaW5nL3R5cGluZy5cclxuXHRcdFx0XHRcdGNvbnN0IGlzX2dlbl9rZXkgPSAoa2V5LmluZGV4T2YoICdnZW5fJyApID09PSAwKTtcclxuXHJcblx0XHRcdFx0XHQvLyBSZS1yZW5kZXIgb24gdmlzdWFsIGtleXMgc28gcHJldmlldyBzdGF5cyBpbiBzeW5jIChjYWxlbmRhciBsYWJlbC9oZWxwLCBldGMuKS5cclxuXHRcdFx0XHRcdGNvbnN0IHZpc3VhbEtleXMgPSBuZXcgU2V0KCBbICdoZWxwJywgJ3BsYWNlaG9sZGVyJywgJ21pbl93aWR0aCcsICdjc3NjbGFzcycgXSApO1xyXG5cdFx0XHRcdFx0aWYgKCAhaXNTZWN0aW9uICYmICh2aXN1YWxLZXlzLmhhcygga2V5ICkgfHwga2V5LnN0YXJ0c1dpdGgoICd1aV8nICkpICkge1xyXG5cdFx0XHRcdFx0XHQvLyBMaWdodCBoZXVyaXN0aWM6IG9ubHkgcmUtcmVuZGVyIG9uIGNvbW1pdCBmb3IgaGVhdnkgaW5wdXRzOyBsaXZlIGZvciBzaG9ydCBvbmVzIGlzIGZpbmUuXHJcblx0XHRcdFx0XHRcdGlmICggZS50eXBlID09PSAnY2hhbmdlJyB8fCBrZXkgPT09ICdoZWxwJyB8fCBrZXkgPT09ICdwbGFjZWhvbGRlcicgKSB7XHJcblx0XHRcdFx0XHRcdFx0Yi5yZW5kZXJfcHJldmlldyggc2VsICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICEoaXNfZ2VuX2tleSAmJiBlLnR5cGUgPT09ICdpbnB1dCcpICkge1xyXG5cdFx0XHRcdFx0XHQvLyBEZWJvdW5jZSBjb250aW51b3VzIHZhbHVlIHNsaWRlciBpbnB1dCBldmVudHMgdG8gYXZvaWQgZnVsbC1jYW52YXMgcmVmcmVzaCBzcGFtLlxyXG5cdFx0XHRcdFx0XHQvLyBXZSBkZXRlY3QgdGhlIHNsaWRlciBncm91cCB2aWEgW2RhdGEtbGVuLWdyb3VwXSB3cmFwcGVyLlxyXG5cdFx0XHRcdFx0XHRjb25zdCBpc19sZW5fZ3JvdXBfY3RybCA9ICEhKHQgJiYgdC5jbG9zZXN0ICYmIHQuY2xvc2VzdCggJ1tkYXRhLWxlbi1ncm91cF0nICkpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpc19sZW5fZ3JvdXBfY3RybCAmJiBlLnR5cGUgPT09ICdpbnB1dCcgKSB7XHJcblx0XHRcdFx0XHRcdFx0YnVzX2VtaXRfY2hhbmdlX2RlYm91bmNlZCggJ3Byb3AtY2hhbmdlJywgeyBrZXksIHBoYXNlOiBlLnR5cGUgfSApO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJ1c19lbWl0X2NoYW5nZSggJ3Byb3AtY2hhbmdlJywgeyBrZXksIHBoYXNlOiBlLnR5cGUgfSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aW5zLmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBoYW5kbGVyLCB0cnVlICk7XHJcblx0XHRcdC8vIHJlZmxlY3QgaW5zdGFudGx5IHdoaWxlIHR5cGluZyBhcyB3ZWxsLlxyXG5cdFx0XHRpbnMuYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgaGFuZGxlciwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3BlbiBJbnNwZWN0b3IgYWZ0ZXIgYSBmaWVsZCBpcyBhZGRlZC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdF9vcGVuX2luc3BlY3Rvcl9hZnRlcl9maWVsZF9hZGRlZCgpIHtcclxuXHRcdFx0Y29uc3QgRVYgPSBDb3JlLldQQkNfQkZCX0V2ZW50cztcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5idXM/Lm9uPy4oIEVWLkZJRUxEX0FERCwgKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBlbCA9IGU/LmRldGFpbD8uZWwgfHwgbnVsbDtcclxuXHRcdFx0XHRpZiAoIGVsICYmIHRoaXMuYnVpbGRlcj8uc2VsZWN0X2ZpZWxkICkge1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZGVyLnNlbGVjdF9maWVsZCggZWwsIHsgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBTaG93IEluc3BlY3RvciBQYWxldHRlLlxyXG5cdFx0XHRcdHdwYmNfYmZiX19kaXNwYXRjaF9ldmVudF9zYWZlKFxyXG5cdFx0XHRcdFx0J3dwYmNfYmZiOnNob3dfcGFuZWwnLFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRwYW5lbF9pZDogJ3dwYmNfYmZiX19pbnNwZWN0b3InLFxyXG5cdFx0XHRcdFx0XHR0YWJfaWQgIDogJ3dwYmNfdGFiX2luc3BlY3RvcidcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogS2V5Ym9hcmQgc2hvcnRjdXRzIGZvciBzZWxlY3Rpb24sIGRlbGV0aW9uLCBhbmQgbW92ZW1lbnQuXHJcblx0ICovXHJcblx0VUkuV1BCQ19CRkJfS2V5Ym9hcmRfQ29udHJvbGxlciA9IGNsYXNzIGV4dGVuZHMgVUkuV1BCQ19CRkJfTW9kdWxlIHtcclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdHRoaXMuX29uX2tleSA9IHRoaXMub25fa2V5LmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCB0aGlzLl9vbl9rZXksIHRydWUgKTtcclxuXHRcdH1cclxuXHJcblx0XHRkZXN0cm95KCkge1xyXG5cdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIHRoaXMuX29uX2tleSwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGUgKi9cclxuXHRcdG9uX2tleShlKSB7XHJcblx0XHRcdGNvbnN0IGIgICAgICAgICA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29uc3QgaXNfdHlwaW5nID0gdGhpcy5faXNfdHlwaW5nX2FueXdoZXJlKCk7XHJcblx0XHRcdGlmICggZS5rZXkgPT09ICdFc2NhcGUnICkge1xyXG5cdFx0XHRcdGlmICggaXNfdHlwaW5nICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYnVzLmVtaXQoIENvcmUuV1BCQ19CRkJfRXZlbnRzLkNMRUFSX1NFTEVDVElPTiwgeyBzb3VyY2U6ICdlc2MnIH0gKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3Qgc2VsZWN0ZWQgPSBiLmdldF9zZWxlY3RlZF9maWVsZD8uKCk7XHJcblx0XHRcdGlmICggIXNlbGVjdGVkIHx8IGlzX3R5cGluZyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBlLmtleSA9PT0gJ0RlbGV0ZScgfHwgZS5rZXkgPT09ICdCYWNrc3BhY2UnICkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRiLmRlbGV0ZV9pdGVtPy4oIHNlbGVjdGVkICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggKGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmIChlLmtleSA9PT0gJ0Fycm93VXAnIHx8IGUua2V5ID09PSAnQXJyb3dEb3duJykgJiYgIWUuc2hpZnRLZXkgKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGNvbnN0IGRpciA9IChlLmtleSA9PT0gJ0Fycm93VXAnKSA/ICd1cCcgOiAnZG93bic7XHJcblx0XHRcdFx0Yi5tb3ZlX2l0ZW0/Liggc2VsZWN0ZWQsIGRpciApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGUua2V5ID09PSAnRW50ZXInICkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRiLnNlbGVjdF9maWVsZCggc2VsZWN0ZWQsIHsgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xyXG5cdFx0X2lzX3R5cGluZ19hbnl3aGVyZSgpIHtcclxuXHRcdFx0Y29uc3QgYSAgID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHRcdFx0Y29uc3QgdGFnID0gYT8udGFnTmFtZTtcclxuXHRcdFx0aWYgKCB0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcgfHwgKGE/LmlzQ29udGVudEVkaXRhYmxlID09PSB0cnVlKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdHJldHVybiAhIShpbnMgJiYgYSAmJiBpbnMuY29udGFpbnMoIGEgKSk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29sdW1uIHJlc2l6ZSBsb2dpYyBmb3Igc2VjdGlvbiByb3dzLlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX1Jlc2l6ZV9Db250cm9sbGVyID0gY2xhc3MgZXh0ZW5kcyBVSS5XUEJDX0JGQl9Nb2R1bGUge1xyXG5cdFx0aW5pdCgpIHtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmluaXRfcmVzaXplX2hhbmRsZXIgPSB0aGlzLmhhbmRsZV9yZXNpemUuYmluZCggdGhpcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogcmVhZCB0aGUgQ1NTIHZhciAoa2VwdCBsb2NhbCBzbyBpdCBkb2VzbuKAmXQgZGVwZW5kIG9uIHRoZSBNaW4tV2lkdGggbW9kdWxlKVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSBjb2xcclxuXHRcdCAqIEByZXR1cm5zIHtudW1iZXJ8bnVtYmVyfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0X2dldF9jb2xfbWluX3B4KGNvbCkge1xyXG5cdFx0XHRjb25zdCB2ID0gZ2V0Q29tcHV0ZWRTdHlsZSggY29sICkuZ2V0UHJvcGVydHlWYWx1ZSggJy0td3BiYy1jb2wtbWluJyApIHx8ICcwJztcclxuXHRcdFx0Y29uc3QgbiA9IHBhcnNlRmxvYXQoIHYgKTtcclxuXHRcdFx0cmV0dXJuIE51bWJlci5pc0Zpbml0ZSggbiApID8gTWF0aC5tYXgoIDAsIG4gKSA6IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqIEBwYXJhbSB7TW91c2VFdmVudH0gZSAqL1xyXG5cdFx0aGFuZGxlX3Jlc2l6ZShlKSB7XHJcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0aWYgKCBlLmJ1dHRvbiAhPT0gMCApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IHJlc2l6ZXIgICA9IGUuY3VycmVudFRhcmdldDtcclxuXHRcdFx0Y29uc3Qgcm93X2VsICAgID0gcmVzaXplci5wYXJlbnRFbGVtZW50O1xyXG5cdFx0XHRjb25zdCBjb2xzICAgICAgPSBBcnJheS5mcm9tKCByb3dfZWwucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApICk7XHJcblx0XHRcdGNvbnN0IGxlZnRfY29sICA9IHJlc2l6ZXI/LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XHJcblx0XHRcdGNvbnN0IHJpZ2h0X2NvbCA9IHJlc2l6ZXI/Lm5leHRFbGVtZW50U2libGluZztcclxuXHRcdFx0aWYgKCAhbGVmdF9jb2wgfHwgIXJpZ2h0X2NvbCB8fCAhbGVmdF9jb2wuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2NvbHVtbicgKSB8fCAhcmlnaHRfY29sLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19jb2x1bW4nICkgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBsZWZ0X2luZGV4ICA9IGNvbHMuaW5kZXhPZiggbGVmdF9jb2wgKTtcclxuXHRcdFx0Y29uc3QgcmlnaHRfaW5kZXggPSBjb2xzLmluZGV4T2YoIHJpZ2h0X2NvbCApO1xyXG5cdFx0XHRpZiAoIGxlZnRfaW5kZXggPT09IC0xIHx8IHJpZ2h0X2luZGV4ICE9PSBsZWZ0X2luZGV4ICsgMSApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0X3ggICAgICAgID0gZS5jbGllbnRYO1xyXG5cdFx0XHRjb25zdCBsZWZ0X3N0YXJ0X3B4ICA9IGxlZnRfY29sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xyXG5cdFx0XHRjb25zdCByaWdodF9zdGFydF9weCA9IHJpZ2h0X2NvbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuXHRcdFx0Y29uc3QgcGFpcl9weCAgICAgICAgPSBNYXRoLm1heCggMCwgbGVmdF9zdGFydF9weCArIHJpZ2h0X3N0YXJ0X3B4ICk7XHJcblxyXG5cdFx0XHRjb25zdCBncCAgICAgICAgID0gYi5jb2xfZ2FwX3BlcmNlbnQ7XHJcblx0XHRcdGNvbnN0IGNvbXB1dGVkICAgPSBiLmxheW91dC5jb21wdXRlX2VmZmVjdGl2ZV9iYXNlc19mcm9tX3Jvdyggcm93X2VsLCBncCApO1xyXG5cdFx0XHRjb25zdCBhdmFpbGFibGUgID0gY29tcHV0ZWQuYXZhaWxhYmxlOyAgICAgICAgICAgICAgICAgLy8gJSBvZiB0aGUg4oCcZnVsbCAxMDDigJ0gYWZ0ZXIgZ2Fwc1xyXG5cdFx0XHRjb25zdCBiYXNlcyAgICAgID0gY29tcHV0ZWQuYmFzZXMuc2xpY2UoIDAgKTsgICAgICAgICAgICAvLyBjdXJyZW50IGVmZmVjdGl2ZSAlXHJcblx0XHRcdGNvbnN0IHBhaXJfYXZhaWwgPSBiYXNlc1tsZWZ0X2luZGV4XSArIGJhc2VzW3JpZ2h0X2luZGV4XTtcclxuXHJcblx0XHRcdC8vIEJhaWwgaWYgd2UgY2Fu4oCZdCBjb21wdXRlIHNhbmUgZGVsdGFzLlxyXG5cdFx0XHRpZiAoIXBhaXJfcHggfHwgIU51bWJlci5pc0Zpbml0ZShwYWlyX2F2YWlsKSB8fCBwYWlyX2F2YWlsIDw9IDApIHJldHVybjtcclxuXHJcblx0XHRcdC8vIC0tLSBNSU4gQ0xBTVBTIChwaXhlbHMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Y29uc3QgcGN0VG9QeCAgICAgICA9IChwY3QpID0+IChwYWlyX3B4ICogKHBjdCAvIHBhaXJfYXZhaWwpKTsgLy8gcGFpci1sb2NhbCBwZXJjZW50IC0+IHB4XHJcblx0XHRcdGNvbnN0IGdlbmVyaWNNaW5QY3QgPSBNYXRoLm1pbiggMC4xLCBhdmFpbGFibGUgKTsgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCAwLjElIGZsb29yIChpbiDigJxhdmFpbGFibGUgJeKAnSBzcGFjZSlcclxuXHRcdFx0Y29uc3QgZ2VuZXJpY01pblB4ICA9IHBjdFRvUHgoIGdlbmVyaWNNaW5QY3QgKTtcclxuXHJcblx0XHRcdGNvbnN0IGxlZnRNaW5QeCAgPSBNYXRoLm1heCggdGhpcy5fZ2V0X2NvbF9taW5fcHgoIGxlZnRfY29sICksIGdlbmVyaWNNaW5QeCApO1xyXG5cdFx0XHRjb25zdCByaWdodE1pblB4ID0gTWF0aC5tYXgoIHRoaXMuX2dldF9jb2xfbWluX3B4KCByaWdodF9jb2wgKSwgZ2VuZXJpY01pblB4ICk7XHJcblxyXG5cdFx0XHQvLyBmcmVlemUgdGV4dCBzZWxlY3Rpb24gKyBjdXJzb3JcclxuXHRcdFx0Y29uc3QgcHJldl91c2VyX3NlbGVjdCAgICAgICAgID0gZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0O1xyXG5cdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XHJcblx0XHRcdHJvd19lbC5zdHlsZS5jdXJzb3IgICAgICAgICAgICA9ICdjb2wtcmVzaXplJztcclxuXHJcblx0XHRcdGNvbnN0IG9uX21vdXNlX21vdmUgPSAoZXYpID0+IHtcclxuXHRcdFx0XHRpZiAoICFwYWlyX3B4ICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHQvLyB3b3JrIGluIHBpeGVscywgY2xhbXAgYnkgZWFjaCBzaWRl4oCZcyBtaW5cclxuXHRcdFx0XHRjb25zdCBkZWx0YV9weCAgID0gZXYuY2xpZW50WCAtIHN0YXJ0X3g7XHJcblx0XHRcdFx0bGV0IG5ld0xlZnRQeCAgICA9IGxlZnRfc3RhcnRfcHggKyBkZWx0YV9weDtcclxuXHRcdFx0XHRuZXdMZWZ0UHggICAgICAgID0gTWF0aC5tYXgoIGxlZnRNaW5QeCwgTWF0aC5taW4oIHBhaXJfcHggLSByaWdodE1pblB4LCBuZXdMZWZ0UHggKSApO1xyXG5cdFx0XHRcdGNvbnN0IG5ld1JpZ2h0UHggPSBwYWlyX3B4IC0gbmV3TGVmdFB4O1xyXG5cclxuXHRcdFx0XHQvLyB0cmFuc2xhdGUgYmFjayB0byBwYWlyLWxvY2FsIHBlcmNlbnRhZ2VzXHJcblx0XHRcdFx0Y29uc3QgbmV3TGVmdFBjdCAgICAgID0gKG5ld0xlZnRQeCAvIHBhaXJfcHgpICogcGFpcl9hdmFpbDtcclxuXHRcdFx0XHRjb25zdCBuZXdCYXNlcyAgICAgICAgPSBiYXNlcy5zbGljZSggMCApO1xyXG5cdFx0XHRcdG5ld0Jhc2VzW2xlZnRfaW5kZXhdICA9IG5ld0xlZnRQY3Q7XHJcblx0XHRcdFx0bmV3QmFzZXNbcmlnaHRfaW5kZXhdID0gcGFpcl9hdmFpbCAtIG5ld0xlZnRQY3Q7XHJcblxyXG5cdFx0XHRcdGIubGF5b3V0LmFwcGx5X2Jhc2VzX3RvX3Jvdyggcm93X2VsLCBuZXdCYXNlcyApO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y29uc3Qgb25fbW91c2VfdXAgPSAoKSA9PiB7XHJcblx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNlbW92ZScsIG9uX21vdXNlX21vdmUgKTtcclxuXHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2V1cCcsIG9uX21vdXNlX3VwICk7XHJcblx0XHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25fbW91c2VfdXAgKTtcclxuXHRcdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2VsZWF2ZScsIG9uX21vdXNlX3VwICk7XHJcblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gcHJldl91c2VyX3NlbGVjdCB8fCAnJztcclxuXHRcdFx0XHRyb3dfZWwuc3R5bGUuY3Vyc29yICAgICAgICAgICAgPSAnJztcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsaXplIHRvIHRoZSByb3figJlzIGF2YWlsYWJsZSAlIGFnYWluXHJcblx0XHRcdFx0Y29uc3Qgbm9ybWFsaXplZCA9IGIubGF5b3V0LmNvbXB1dGVfZWZmZWN0aXZlX2Jhc2VzX2Zyb21fcm93KCByb3dfZWwsIGdwICk7XHJcblx0XHRcdFx0Yi5sYXlvdXQuYXBwbHlfYmFzZXNfdG9fcm93KCByb3dfZWwsIG5vcm1hbGl6ZWQuYmFzZXMgKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbl9tb3VzZV9tb3ZlICk7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25fbW91c2VfdXAgKTtcclxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25fbW91c2VfdXAgKTtcclxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCBvbl9tb3VzZV91cCApO1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBQYWdlIGFuZCBzZWN0aW9uIGNyZWF0aW9uLCByZWJ1aWxkaW5nLCBhbmQgbmVzdGVkIFNvcnRhYmxlIHNldHVwLlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX1BhZ2VzX1NlY3Rpb25zID0gY2xhc3MgZXh0ZW5kcyBVSS5XUEJDX0JGQl9Nb2R1bGUge1xyXG5cclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5hZGRfcGFnZSAgICAgICAgICAgICAgICAgID0gKG9wdHMpID0+IHRoaXMuYWRkX3BhZ2UoIG9wdHMgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLmFkZF9zZWN0aW9uICAgICAgICAgICAgICAgPSAoY29udGFpbmVyLCBjb2xzKSA9PiB0aGlzLmFkZF9zZWN0aW9uKCBjb250YWluZXIsIGNvbHMgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyLnJlYnVpbGRfc2VjdGlvbiAgICAgICAgICAgPSAoc2VjdGlvbl9kYXRhLCBjb250YWluZXIpID0+IHRoaXMucmVidWlsZF9zZWN0aW9uKCBzZWN0aW9uX2RhdGEsIGNvbnRhaW5lciApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuaW5pdF9hbGxfbmVzdGVkX3NvcnRhYmxlcyA9IChlbCkgPT4gdGhpcy5pbml0X2FsbF9uZXN0ZWRfc29ydGFibGVzKCBlbCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXIuaW5pdF9zZWN0aW9uX3NvcnRhYmxlICAgICA9IChlbCkgPT4gdGhpcy5pbml0X3NlY3Rpb25fc29ydGFibGUoIGVsICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5wYWdlc19zZWN0aW9ucyAgICAgICAgICAgID0gdGhpcztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdpdmUgZXZlcnkgZmllbGQvc2VjdGlvbiBpbiBhIGNsb25lZCBzdWJ0cmVlIGEgZnJlc2ggZGF0YS11aWQgc29cclxuXHRcdCAqIHVuaXF1ZW5lc3MgY2hlY2tzIGRvbid0IGV4Y2x1ZGUgdGhlaXIgb3JpZ2luYWxzLlxyXG5cdFx0ICovXHJcblx0XHRfcmV0YWdfdWlkc19pbl9zdWJ0cmVlKHJvb3QpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0aWYgKCAhcm9vdCApIHJldHVybjtcclxuXHRcdFx0Y29uc3Qgbm9kZXMgPSBbXTtcclxuXHRcdFx0aWYgKCByb290LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSB8fCByb290LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICkgKSB7XHJcblx0XHRcdFx0bm9kZXMucHVzaCggcm9vdCApO1xyXG5cdFx0XHR9XHJcblx0XHRcdG5vZGVzLnB1c2goIC4uLnJvb3QucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fc2VjdGlvbiwgLndwYmNfYmZiX19maWVsZCcgKSApO1xyXG5cdFx0XHRub2Rlcy5mb3JFYWNoKCAoZWwpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwcmVmaXggICA9IGVsLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19zZWN0aW9uJyApID8gJ3MnIDogJ2YnO1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQudWlkID0gYCR7cHJlZml4fS0keysrYi5fdWlkX2NvdW50ZXJ9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCAzNiApLnNsaWNlKCAyLCA3ICl9YDtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQnVtcCBcImZvb1wiLCBcImZvby0yXCIsIFwiZm9vLTNcIiwgLi4uXHJcblx0XHQgKi9cclxuXHRcdF9tYWtlX3VuaXF1ZShiYXNlLCB0YWtlbikge1xyXG5cdFx0XHRjb25zdCBzID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZTtcclxuXHRcdFx0bGV0IHYgICA9IFN0cmluZyggYmFzZSB8fCAnJyApO1xyXG5cdFx0XHRpZiAoICF2ICkgdiA9ICdmaWVsZCc7XHJcblx0XHRcdGNvbnN0IG0gID0gdi5tYXRjaCggLy0oXFxkKykkLyApO1xyXG5cdFx0XHRsZXQgbiAgICA9IG0gPyAocGFyc2VJbnQoIG1bMV0sIDEwICkgfHwgMSkgOiAxO1xyXG5cdFx0XHRsZXQgc3RlbSA9IG0gPyB2LnJlcGxhY2UoIC8tXFxkKyQvLCAnJyApIDogdjtcclxuXHRcdFx0d2hpbGUgKCB0YWtlbi5oYXMoIHYgKSApIHtcclxuXHRcdFx0XHRuID0gTWF0aC5tYXgoIDIsIG4gKyAxICk7XHJcblx0XHRcdFx0diA9IGAke3N0ZW19LSR7bn1gO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRha2VuLmFkZCggdiApO1xyXG5cdFx0XHRyZXR1cm4gdjtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFN0cmljdCwgb25lLXBhc3MgZGUtZHVwbGljYXRpb24gZm9yIGEgbmV3bHktaW5zZXJ0ZWQgc3VidHJlZS5cclxuXHRcdCAqIC0gRW5zdXJlcyB1bmlxdWUgZGF0YS1pZCAoaW50ZXJuYWwpLCBkYXRhLW5hbWUgKGZpZWxkcyksIGRhdGEtaHRtbF9pZCAocHVibGljKVxyXG5cdFx0ICogLSBBbHNvIHVwZGF0ZXMgRE9NOiA8c2VjdGlvbiBpZD4sIDxpbnB1dCBpZD4sIDxsYWJlbCBmb3I+LCBhbmQgaW5wdXRbbmFtZV0uXHJcblx0XHQgKi9cclxuXHRcdF9kZWR1cGVfc3VidHJlZV9zdHJpY3Qocm9vdCkge1xyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRjb25zdCBzID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZTtcclxuXHRcdFx0aWYgKCAhcm9vdCB8fCAhYj8ucGFnZXNfY29udGFpbmVyICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Ly8gMSkgQnVpbGQgXCJ0YWtlblwiIHNldHMgZnJvbSBvdXRzaWRlIHRoZSBzdWJ0cmVlLlxyXG5cdFx0XHRjb25zdCB0YWtlbkRhdGFJZCAgID0gbmV3IFNldCgpO1xyXG5cdFx0XHRjb25zdCB0YWtlbkRhdGFOYW1lID0gbmV3IFNldCgpO1xyXG5cdFx0XHRjb25zdCB0YWtlbkh0bWxJZCAgID0gbmV3IFNldCgpO1xyXG5cdFx0XHRjb25zdCB0YWtlbkRvbUlkICAgID0gbmV3IFNldCgpO1xyXG5cclxuXHRcdFx0Ly8gQWxsIGZpZWxkcy9zZWN0aW9ucyBvdXRzaWRlIHJvb3RcclxuXHRcdFx0Yi5wYWdlc19jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fZmllbGQsIC53cGJjX2JmYl9fc2VjdGlvbicgKS5mb3JFYWNoKCBlbCA9PiB7XHJcblx0XHRcdFx0aWYgKCByb290LmNvbnRhaW5zKCBlbCApICkgcmV0dXJuO1xyXG5cdFx0XHRcdGNvbnN0IGRpZCAgPSBlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLWlkJyApO1xyXG5cdFx0XHRcdGNvbnN0IGRuYW0gPSBlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnICk7XHJcblx0XHRcdFx0Y29uc3QgaGlkICA9IGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtaHRtbF9pZCcgKTtcclxuXHRcdFx0XHRpZiAoIGRpZCApIHRha2VuRGF0YUlkLmFkZCggZGlkICk7XHJcblx0XHRcdFx0aWYgKCBkbmFtICkgdGFrZW5EYXRhTmFtZS5hZGQoIGRuYW0gKTtcclxuXHRcdFx0XHRpZiAoIGhpZCApIHRha2VuSHRtbElkLmFkZCggaGlkICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIEFsbCBET00gaWRzIG91dHNpZGUgcm9vdCAobGFiZWxzLCBpbnB1dHMsIGFueXRoaW5nKVxyXG5cdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2lkXScgKS5mb3JFYWNoKCBlbCA9PiB7XHJcblx0XHRcdFx0aWYgKCByb290LmNvbnRhaW5zKCBlbCApICkgcmV0dXJuO1xyXG5cdFx0XHRcdGlmICggZWwuaWQgKSB0YWtlbkRvbUlkLmFkZCggZWwuaWQgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZXMgPSBbXTtcclxuXHRcdFx0aWYgKCByb290LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSB8fCByb290LmNsYXNzTGlzdD8uY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICkgKSB7XHJcblx0XHRcdFx0bm9kZXMucHVzaCggcm9vdCApO1xyXG5cdFx0XHR9XHJcblx0XHRcdG5vZGVzLnB1c2goIC4uLnJvb3QucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fc2VjdGlvbiwgLndwYmNfYmZiX19maWVsZCcgKSApO1xyXG5cclxuXHRcdFx0Ly8gMikgV2FsayB0aGUgc3VidHJlZSBhbmQgZml4IGNvbGxpc2lvbnMgZGV0ZXJtaW5pc3RpY2FsbHkuXHJcblx0XHRcdG5vZGVzLmZvckVhY2goIGVsID0+IHtcclxuXHRcdFx0XHRjb25zdCBpc0ZpZWxkICAgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICk7XHJcblx0XHRcdFx0Y29uc3QgaXNTZWN0aW9uID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICk7XHJcblxyXG5cdFx0XHRcdC8vIElOVEVSTkFMIGRhdGEtaWRcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjb25zdCByYXcgID0gZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1pZCcgKSB8fCAnJztcclxuXHRcdFx0XHRcdGNvbnN0IGJhc2UgPSBzLnNhbml0aXplX2h0bWxfaWQoIHJhdyApIHx8IChpc1NlY3Rpb24gPyAnc2VjdGlvbicgOiAnZmllbGQnKTtcclxuXHRcdFx0XHRcdGNvbnN0IHVuaXEgPSB0aGlzLl9tYWtlX3VuaXF1ZSggYmFzZSwgdGFrZW5EYXRhSWQgKTtcclxuXHRcdFx0XHRcdGlmICggdW5pcSAhPT0gcmF3ICkgZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1pZCcsIHVuaXEgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIEhUTUwgbmFtZSAoZmllbGRzIG9ubHkpXHJcblx0XHRcdFx0aWYgKCBpc0ZpZWxkICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcmF3ID0gZWwuZ2V0QXR0cmlidXRlKCAnZGF0YS1uYW1lJyApIHx8ICcnO1xyXG5cdFx0XHRcdFx0aWYgKCByYXcgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJhc2UgPSBzLnNhbml0aXplX2h0bWxfbmFtZSggcmF3ICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHVuaXEgPSB0aGlzLl9tYWtlX3VuaXF1ZSggYmFzZSwgdGFrZW5EYXRhTmFtZSApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHVuaXEgIT09IHJhdyApIHtcclxuXHRcdFx0XHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gVXBkYXRlIGlubmVyIGNvbnRyb2wgaW1tZWRpYXRlbHlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBpbnB1dCA9IGVsLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCcgKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGlucHV0ICkgaW5wdXQuc2V0QXR0cmlidXRlKCAnbmFtZScsIHVuaXEgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gUHVibGljIEhUTUwgaWQgKGZpZWxkcyArIHNlY3Rpb25zKVxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGNvbnN0IHJhdyA9IGVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtaHRtbF9pZCcgKSB8fCAnJztcclxuXHRcdFx0XHRcdGlmICggcmF3ICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiYXNlICAgICAgICAgID0gcy5zYW5pdGl6ZV9odG1sX2lkKCByYXcgKTtcclxuXHRcdFx0XHRcdFx0Ly8gUmVzZXJ2ZSBhZ2FpbnN0IEJPVEgga25vd24gZGF0YS1odG1sX2lkIGFuZCByZWFsIERPTSBpZHMuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGNvbWJpbmVkVGFrZW4gPSBuZXcgU2V0KCBbIC4uLnRha2VuSHRtbElkLCAuLi50YWtlbkRvbUlkIF0gKTtcclxuXHRcdFx0XHRcdFx0bGV0IGNhbmRpZGF0ZSAgICAgICA9IHRoaXMuX21ha2VfdW5pcXVlKCBiYXNlLCBjb21iaW5lZFRha2VuICk7XHJcblx0XHRcdFx0XHRcdC8vIFJlY29yZCBpbnRvIHRoZSByZWFsIHNldHMgc28gZnV0dXJlIGNoZWNrcyBzZWUgdGhlIHJlc2VydmF0aW9uLlxyXG5cdFx0XHRcdFx0XHR0YWtlbkh0bWxJZC5hZGQoIGNhbmRpZGF0ZSApO1xyXG5cdFx0XHRcdFx0XHR0YWtlbkRvbUlkLmFkZCggY2FuZGlkYXRlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGNhbmRpZGF0ZSAhPT0gcmF3ICkgZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1odG1sX2lkJywgY2FuZGlkYXRlICk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBSZWZsZWN0IHRvIERPTSBpbW1lZGlhdGVseVxyXG5cdFx0XHRcdFx0XHRpZiAoIGlzU2VjdGlvbiApIHtcclxuXHRcdFx0XHRcdFx0XHRlbC5pZCA9IGNhbmRpZGF0ZSB8fCAnJztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBpbnB1dCA9IGVsLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCcgKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsYWJlbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoICdsYWJlbC53cGJjX2JmYl9fZmllbGQtbGFiZWwnICk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBpbnB1dCApIGlucHV0LmlkID0gY2FuZGlkYXRlIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggbGFiZWwgKSBsYWJlbC5odG1sRm9yID0gY2FuZGlkYXRlIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBpc1NlY3Rpb24gKSB7XHJcblx0XHRcdFx0XHRcdC8vIEVuc3VyZSBubyBzdGFsZSBET00gaWQgaWYgZGF0YS1odG1sX2lkIHdhcyBjbGVhcmVkXHJcblx0XHRcdFx0XHRcdGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2lkJyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9tYWtlX2FkZF9jb2x1bW5zX2NvbnRyb2wocGFnZV9lbCwgc2VjdGlvbl9jb250YWluZXIsIGluc2VydF9wb3MgPSAnYm90dG9tJykge1xyXG5cclxuXHRcdFx0Ly8gQWNjZXB0IGluc2VydF9wb3MgKCd0b3AnfCdib3R0b20nKSwgZGVmYXVsdCAnYm90dG9tJy5cclxuXHJcblx0XHRcdGNvbnN0IHRwbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2FkZF9jb2x1bW5zX3RlbXBsYXRlJyApO1xyXG5cdFx0XHRpZiAoICF0cGwgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENsb25lICpjb250ZW50cyogKG5vdCB0aGUgaWQpLCB1bmhpZGUsIGFuZCBhZGQgYSBwYWdlLXNjb3BlZCBjbGFzcy5cclxuXHRcdFx0Y29uc3Qgc3JjID0gKHRwbC5jb250ZW50ICYmIHRwbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKSA/IHRwbC5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkIDogdHBsLmZpcnN0RWxlbWVudENoaWxkO1xyXG5cdFx0XHRpZiAoICFzcmMgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNsb25lID0gc3JjLmNsb25lTm9kZSggdHJ1ZSApO1xyXG5cdFx0XHRjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoICdoaWRkZW4nICk7XHJcblx0XHRcdGlmICggY2xvbmUuaWQgKSB7XHJcblx0XHRcdFx0Y2xvbmUucmVtb3ZlQXR0cmlidXRlKCAnaWQnICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2xvbmUucXVlcnlTZWxlY3RvckFsbCggJ1tpZF0nICkuZm9yRWFjaCggbiA9PiBuLnJlbW92ZUF0dHJpYnV0ZSggJ2lkJyApICk7XHJcblxyXG5cdFx0XHQvLyBNYXJrIHdoZXJlIHRoaXMgY29udHJvbCBpbnNlcnRzIHNlY3Rpb25zLlxyXG5cdFx0XHRjbG9uZS5kYXRhc2V0Lmluc2VydCA9IGluc2VydF9wb3M7IC8vICd0b3AnIHwgJ2JvdHRvbSdcclxuXHJcblx0XHRcdC8vIC8vIE9wdGlvbmFsIFVJIGhpbnQgZm9yIHVzZXJzIChrZWVwcyBleGlzdGluZyBtYXJrdXAgaW50YWN0KS5cclxuXHRcdFx0Ly8gY29uc3QgaGludCA9IGNsb25lLnF1ZXJ5U2VsZWN0b3IoICcubmF2LXRhYi10ZXh0IC5zZWxlY3RlZF92YWx1ZScgKTtcclxuXHRcdFx0Ly8gaWYgKCBoaW50ICkge1xyXG5cdFx0XHQvLyBcdGhpbnQudGV4dENvbnRlbnQgPSAoaW5zZXJ0X3BvcyA9PT0gJ3RvcCcpID8gJyAoYWRkIGF0IHRvcCknIDogJyAoYWRkIGF0IGJvdHRvbSknO1xyXG5cdFx0XHQvLyB9XHJcblxyXG5cdFx0XHQvLyBDbGljayBvbiBvcHRpb25zIC0gYWRkIHNlY3Rpb24gd2l0aCBOIGNvbHVtbnMuXHJcblx0XHRcdGNsb25lLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgYSA9IGUudGFyZ2V0LmNsb3Nlc3QoICcudWxfZHJvcGRvd25fbWVudV9saV9hY3Rpb25fYWRkX3NlY3Rpb25zJyApO1xyXG5cdFx0XHRcdGlmICggIWEgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0Ly8gUmVhZCBOIGVpdGhlciBmcm9tIGRhdGEtY29scyBvciBmYWxsYmFjayB0byBwYXJzaW5nIHRleHQgbGlrZSBcIjMgQ29sdW1uc1wiLlxyXG5cdFx0XHRcdGxldCBjb2xzID0gcGFyc2VJbnQoIGEuZGF0YXNldC5jb2xzIHx8IChhLnRleHRDb250ZW50Lm1hdGNoKCAvXFxiKFxcZCspXFxzKkNvbHVtbi9pICk/LlsxXSA/PyAnMScpLCAxMCApO1xyXG5cdFx0XHRcdGNvbHMgICAgID0gTWF0aC5tYXgoIDEsIE1hdGgubWluKCA0LCBjb2xzICkgKTtcclxuXHJcblx0XHRcdFx0Ly8gTkVXOiBob25vciB0aGUgY29udHJvbCdzIGluc2VydGlvbiBwb3NpdGlvblxyXG5cdFx0XHRcdHRoaXMuYWRkX3NlY3Rpb24oIHNlY3Rpb25fY29udGFpbmVyLCBjb2xzLCBpbnNlcnRfcG9zICk7XHJcblxyXG5cdFx0XHRcdC8vIFJlZmxlY3QgbGFzdCBjaG9pY2UgKHVuY2hhbmdlZClcclxuXHRcdFx0XHRjb25zdCB2YWwgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKCAnLnNlbGVjdGVkX3ZhbHVlJyApO1xyXG5cdFx0XHRcdGlmICggdmFsICkge1xyXG5cdFx0XHRcdFx0dmFsLnRleHRDb250ZW50ID0gYCAoJHtjb2xzfSlgO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGNsb25lO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHBhcmFtIHt7c2Nyb2xsPzogYm9vbGVhbn19IFtvcHRzID0ge31dXHJcblx0XHQgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XHJcblx0XHQgKi9cclxuXHRcdGFkZF9wYWdlKHsgc2Nyb2xsID0gdHJ1ZSB9ID0ge30pIHtcclxuXHRcdFx0Y29uc3QgYiAgICAgICA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Y29uc3QgcGFnZV9lbCA9IENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmNyZWF0ZV9lbGVtZW50KCAnZGl2JywgJ3dwYmNfYmZiX19wYW5lbCB3cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgIHdwYmNfYmZiX2Zvcm0gd3BiY19jb250YWluZXIgd3BiY19mb3JtIHdwYmNfY29udGFpbmVyX2Jvb2tpbmdfZm9ybScgKTtcclxuXHRcdFx0cGFnZV9lbC5zZXRBdHRyaWJ1dGUoICdkYXRhLXBhZ2UnLCArK2IucGFnZV9jb3VudGVyICk7XHJcblxyXG5cdFx0XHQvLyBcIlBhZ2UgMSB8IFhcIiAtIFJlbmRlciBwYWdlIFRpdGxlIHdpdGggUmVtb3ZlIFggYnV0dG9uLlxyXG5cdFx0XHRjb25zdCBjb250cm9sc19odG1sID0gVUkucmVuZGVyX3dwX3RlbXBsYXRlKCAnd3BiYy1iZmItdHBsLXBhZ2UtcmVtb3ZlJywgeyBwYWdlX251bWJlcjogYi5wYWdlX2NvdW50ZXIgfSApO1xyXG5cdFx0XHRwYWdlX2VsLmlubmVySFRNTCAgID0gY29udHJvbHNfaHRtbCArICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2Zvcm1fcHJldmlld19zZWN0aW9uX2NvbnRhaW5lciB3cGJjX3dpemFyZF9fYm9yZGVyX2NvbnRhaW5lclwiPjwvZGl2Pic7XHJcblxyXG5cdFx0XHRiLnBhZ2VzX2NvbnRhaW5lci5hcHBlbmRDaGlsZCggcGFnZV9lbCApO1xyXG5cdFx0XHRpZiAoIHNjcm9sbCApIHtcclxuXHRcdFx0XHRwYWdlX2VsLnNjcm9sbEludG9WaWV3KCB7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBzZWN0aW9uX2NvbnRhaW5lciAgICAgICAgID0gcGFnZV9lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXInICk7XHJcblx0XHRcdGNvbnN0IHNlY3Rpb25fY291bnRfb25fYWRkX3BhZ2UgPSAyO1xyXG5cdFx0XHR0aGlzLmluaXRfc2VjdGlvbl9zb3J0YWJsZSggc2VjdGlvbl9jb250YWluZXIgKTtcclxuXHRcdFx0dGhpcy5hZGRfc2VjdGlvbiggc2VjdGlvbl9jb250YWluZXIsIHNlY3Rpb25fY291bnRfb25fYWRkX3BhZ2UgKTtcclxuXHJcblx0XHRcdC8vIERyb3Bkb3duIGNvbnRyb2wgY2xvbmVkIGZyb20gdGhlIGhpZGRlbiB0ZW1wbGF0ZS5cclxuXHRcdFx0Y29uc3QgY29udHJvbHNfaG9zdF90b3AgPSBwYWdlX2VsLnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2NvbnRyb2xzJyApO1xyXG5cdFx0XHRjb25zdCBjdHJsX3RvcCAgICAgICAgICA9IHRoaXMuX21ha2VfYWRkX2NvbHVtbnNfY29udHJvbCggcGFnZV9lbCwgc2VjdGlvbl9jb250YWluZXIsICd0b3AnICk7XHJcblx0XHRcdGlmICggY3RybF90b3AgKSB7XHJcblx0XHRcdFx0Y29udHJvbHNfaG9zdF90b3AuYXBwZW5kQ2hpbGQoIGN0cmxfdG9wICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gQm90dG9tIGNvbnRyb2wgYmFyIGFmdGVyIHRoZSBzZWN0aW9uIGNvbnRhaW5lci5cclxuXHRcdFx0Y29uc3QgY29udHJvbHNfaG9zdF9ib3R0b20gPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ2RpdicsICd3cGJjX2JmYl9fY29udHJvbHMgd3BiY19iZmJfX2NvbnRyb2xzLS1ib3R0b20nICk7XHJcblx0XHRcdHNlY3Rpb25fY29udGFpbmVyLmFmdGVyKCBjb250cm9sc19ob3N0X2JvdHRvbSApO1xyXG5cdFx0XHRjb25zdCBjdHJsX2JvdHRvbSA9IHRoaXMuX21ha2VfYWRkX2NvbHVtbnNfY29udHJvbCggcGFnZV9lbCwgc2VjdGlvbl9jb250YWluZXIsICdib3R0b20nICk7XHJcblx0XHRcdGlmICggY3RybF9ib3R0b20gKSB7XHJcblx0XHRcdFx0Y29udHJvbHNfaG9zdF9ib3R0b20uYXBwZW5kQ2hpbGQoIGN0cmxfYm90dG9tICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBwYWdlX2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gICAgICBjb2xzXHJcblx0XHQgKiBAcGFyYW0geyd0b3AnfCdib3R0b20nfSBbaW5zZXJ0X3Bvcz0nYm90dG9tJ10gIC8vIE5FV1xyXG5cdFx0ICovXHJcblx0XHRhZGRfc2VjdGlvbihjb250YWluZXIsIGNvbHMsIGluc2VydF9wb3MgPSAnYm90dG9tJykge1xyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRjb2xzICAgID0gTWF0aC5tYXgoIDEsIHBhcnNlSW50KCBjb2xzLCAxMCApIHx8IDEgKTtcclxuXHJcblx0XHRcdGNvbnN0IHNlY3Rpb24gPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ2RpdicsICd3cGJjX2JmYl9fc2VjdGlvbicgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWlkJywgYHNlY3Rpb24tJHsrK2Iuc2VjdGlvbl9jb3VudGVyfS0ke0RhdGUubm93KCl9YCApO1xyXG5cdFx0XHRzZWN0aW9uLnNldEF0dHJpYnV0ZSggJ2RhdGEtdWlkJywgYHMtJHsrK2IuX3VpZF9jb3VudGVyfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZyggMzYgKS5zbGljZSggMiwgNyApfWAgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLXR5cGUnLCAnc2VjdGlvbicgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWxhYmVsJywgJ1NlY3Rpb24nICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAnZGF0YS1jb2x1bW5zJywgU3RyaW5nKCBjb2xzICkgKTtcclxuXHRcdFx0Ly8gRG8gbm90IHBlcnNpc3Qgb3Igc2VlZCBwZXItY29sdW1uIHN0eWxlcyBieSBkZWZhdWx0IChvcHQtaW4gdmlhIGluc3BlY3RvcikuXHJcblxyXG5cdFx0XHRjb25zdCByb3cgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ2RpdicsICd3cGJjX2JmYl9fcm93IHdwYmNfX3JvdycgKTtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29sczsgaSsrICkge1xyXG5cdFx0XHRcdGNvbnN0IGNvbCAgICAgICAgICAgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5jcmVhdGVfZWxlbWVudCggJ2RpdicsICd3cGJjX2JmYl9fY29sdW1uIHdwYmNfX2ZpZWxkJyApO1xyXG5cdFx0XHRcdGNvbC5zdHlsZS5mbGV4QmFzaXMgPSAoMTAwIC8gY29scykgKyAnJSc7XHJcblx0XHRcdFx0Ly8gTm8gZGVmYXVsdCBDU1MgdmFycyBoZXJlOyByZWFsIGNvbHVtbnMgcmVtYWluIHVuYWZmZWN0ZWQgdW50aWwgdXNlciBhY3RpdmF0ZXMgc3R5bGVzLlxyXG5cdFx0XHRcdGIuaW5pdF9zb3J0YWJsZT8uKCBjb2wgKTtcclxuXHRcdFx0XHRyb3cuYXBwZW5kQ2hpbGQoIGNvbCApO1xyXG5cdFx0XHRcdGlmICggaSA8IGNvbHMgLSAxICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcmVzaXplciA9IENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmNyZWF0ZV9lbGVtZW50KCAnZGl2JywgJ3dwYmNfYmZiX19jb2x1bW4tcmVzaXplcicgKTtcclxuXHRcdFx0XHRcdHJlc2l6ZXIuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZG93bicsIGIuaW5pdF9yZXNpemVfaGFuZGxlciApO1xyXG5cdFx0XHRcdFx0cm93LmFwcGVuZENoaWxkKCByZXNpemVyICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHNlY3Rpb24uYXBwZW5kQ2hpbGQoIHJvdyApO1xyXG5cdFx0XHRiLmxheW91dC5zZXRfZXF1YWxfYmFzZXMoIHJvdywgYi5jb2xfZ2FwX3BlcmNlbnQgKTtcclxuXHRcdFx0Yi5hZGRfb3ZlcmxheV90b29sYmFyKCBzZWN0aW9uICk7XHJcblx0XHRcdHNlY3Rpb24uc2V0QXR0cmlidXRlKCAndGFiaW5kZXgnLCAnMCcgKTtcclxuXHRcdFx0dGhpcy5pbml0X2FsbF9uZXN0ZWRfc29ydGFibGVzKCBzZWN0aW9uICk7XHJcblxyXG5cdFx0XHQvLyBJbnNlcnRpb24gcG9saWN5OiB0b3AgfCBib3R0b20uXHJcblx0XHRcdGlmICggaW5zZXJ0X3BvcyA9PT0gJ3RvcCcgJiYgY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkICkge1xyXG5cdFx0XHRcdGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoIHNlY3Rpb24sIGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZCApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggc2VjdGlvbiApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gc2VjdGlvbl9kYXRhXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJcclxuXHRcdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIHJlYnVpbHQgc2VjdGlvbiBlbGVtZW50LlxyXG5cdFx0ICovXHJcblx0XHRyZWJ1aWxkX3NlY3Rpb24oc2VjdGlvbl9kYXRhLCBjb250YWluZXIpIHtcclxuXHRcdFx0Y29uc3QgYiAgICAgICAgID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRjb25zdCBjb2xzX2RhdGEgPSBBcnJheS5pc0FycmF5KCBzZWN0aW9uX2RhdGE/LmNvbHVtbnMgKSA/IHNlY3Rpb25fZGF0YS5jb2x1bW5zIDogW107XHJcblx0XHRcdHRoaXMuYWRkX3NlY3Rpb24oIGNvbnRhaW5lciwgY29sc19kYXRhLmxlbmd0aCB8fCAxICk7XHJcblx0XHRcdGNvbnN0IHNlY3Rpb24gPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZDtcclxuXHRcdFx0aWYgKCAhc2VjdGlvbi5kYXRhc2V0LnVpZCApIHtcclxuXHRcdFx0XHRzZWN0aW9uLnNldEF0dHJpYnV0ZSggJ2RhdGEtdWlkJywgYHMtJHsrK2IuX3VpZF9jb3VudGVyfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZyggMzYgKS5zbGljZSggMiwgNyApfWAgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzZWN0aW9uLnNldEF0dHJpYnV0ZSggJ2RhdGEtaWQnLCBzZWN0aW9uX2RhdGE/LmlkIHx8IGBzZWN0aW9uLSR7KytiLnNlY3Rpb25fY291bnRlcn0tJHtEYXRlLm5vdygpfWAgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLXR5cGUnLCAnc2VjdGlvbicgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWxhYmVsJywgc2VjdGlvbl9kYXRhPy5sYWJlbCB8fCAnU2VjdGlvbicgKTtcclxuXHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWNvbHVtbnMnLCBTdHJpbmcoIChzZWN0aW9uX2RhdGE/LmNvbHVtbnMgfHwgW10pLmxlbmd0aCB8fCAxICkgKTtcclxuXHRcdFx0Ly8gUGVyc2lzdGVkIGF0dHJpYnV0ZXNcclxuXHRcdFx0aWYgKCBzZWN0aW9uX2RhdGE/Lmh0bWxfaWQgKSB7XHJcblx0XHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWh0bWxfaWQnLCBTdHJpbmcoIHNlY3Rpb25fZGF0YS5odG1sX2lkICkgKTtcclxuXHRcdFx0XHQvLyBnaXZlIHRoZSBjb250YWluZXIgYSByZWFsIGlkIHNvIGFuY2hvcnMvQ1NTIGNhbiB0YXJnZXQgaXRcclxuXHRcdFx0XHRzZWN0aW9uLmlkID0gU3RyaW5nKCBzZWN0aW9uX2RhdGEuaHRtbF9pZCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBORVc6IHJlc3RvcmUgcGVyc2lzdGVkIHBlci1jb2x1bW4gc3R5bGVzIChyYXcgSlNPTiBzdHJpbmcpLlxyXG5cdFx0XHRpZiAoIHNlY3Rpb25fZGF0YT8uY29sX3N0eWxlcyAhPSBudWxsICkge1xyXG5cdFx0XHRcdGNvbnN0IGpzb24gPSBTdHJpbmcoIHNlY3Rpb25fZGF0YS5jb2xfc3R5bGVzICk7XHJcblx0XHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWNvbF9zdHlsZXMnLCBqc29uICk7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHNlY3Rpb24uZGF0YXNldC5jb2xfc3R5bGVzID0ganNvbjtcclxuXHRcdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vIChObyByZW5kZXJfcHJldmlldygpIGNhbGwgaGVyZSBvbiBwdXJwb3NlOiBzZWN0aW9uc+KAmSBidWlsZGVyIERPTSB1c2VzIC53cGJjX2JmYl9fcm93Ly53cGJjX2JmYl9fY29sdW1uLilcclxuXHJcblxyXG5cdFx0XHRpZiAoIHNlY3Rpb25fZGF0YT8uY3NzY2xhc3MgKSB7XHJcblx0XHRcdFx0c2VjdGlvbi5zZXRBdHRyaWJ1dGUoICdkYXRhLWNzc2NsYXNzJywgU3RyaW5nKCBzZWN0aW9uX2RhdGEuY3NzY2xhc3MgKSApO1xyXG5cdFx0XHRcdC8vIGtlZXAgY29yZSBjbGFzc2VzLCB0aGVuIGFkZCBjdXN0b20gY2xhc3MoZXMpXHJcblx0XHRcdFx0U3RyaW5nKCBzZWN0aW9uX2RhdGEuY3NzY2xhc3MgKS5zcGxpdCggL1xccysvICkuZmlsdGVyKCBCb29sZWFuICkuZm9yRWFjaCggY2xzID0+IHNlY3Rpb24uY2xhc3NMaXN0LmFkZCggY2xzICkgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgcm93ID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19yb3cnICk7XHJcblx0XHRcdC8vIERlbGVnYXRlIHBhcnNpbmcgKyBhY3RpdmF0aW9uICsgYXBwbGljYXRpb24gdG8gdGhlIENvbHVtbiBTdHlsZXMgc2VydmljZS5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBqc29uID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGUoICdkYXRhLWNvbF9zdHlsZXMnIClcclxuXHRcdFx0XHRcdHx8IChzZWN0aW9uLmRhdGFzZXQgPyAoc2VjdGlvbi5kYXRhc2V0LmNvbF9zdHlsZXMgfHwgJycpIDogJycpO1xyXG5cdFx0XHRcdGNvbnN0IGFyciAgPSBVSS5XUEJDX0JGQl9Db2x1bW5fU3R5bGVzLnBhcnNlX2NvbF9zdHlsZXMoIGpzb24gKTtcclxuXHRcdFx0XHRVSS5XUEJDX0JGQl9Db2x1bW5fU3R5bGVzLmFwcGx5KCBzZWN0aW9uLCBhcnIgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb2xzX2RhdGEuZm9yRWFjaCggKGNvbF9kYXRhLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGNvbHVtbnNfb25seSAgPSByb3cucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApO1xyXG5cdFx0XHRcdGNvbnN0IGNvbCAgICAgICAgICAgPSBjb2x1bW5zX29ubHlbaW5kZXhdO1xyXG5cdFx0XHRcdGNvbC5zdHlsZS5mbGV4QmFzaXMgPSBjb2xfZGF0YS53aWR0aCB8fCAnMTAwJSc7XHJcblx0XHRcdFx0KGNvbF9kYXRhLml0ZW1zIHx8IFtdKS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCAhaXRlbSB8fCAhaXRlbS50eXBlICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGl0ZW0udHlwZSA9PT0gJ2ZpZWxkJyApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZWwgPSBiLmJ1aWxkX2ZpZWxkKCBpdGVtLmRhdGEgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbCApIHtcclxuXHRcdFx0XHRcdFx0XHRjb2wuYXBwZW5kQ2hpbGQoIGVsICk7XHJcblx0XHRcdFx0XHRcdFx0Yi50cmlnZ2VyX2ZpZWxkX2Ryb3BfY2FsbGJhY2soIGVsLCAnbG9hZCcgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGl0ZW0udHlwZSA9PT0gJ3NlY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlYnVpbGRfc2VjdGlvbiggaXRlbS5kYXRhLCBjb2wgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0Y29uc3QgY29tcHV0ZWQgPSBiLmxheW91dC5jb21wdXRlX2VmZmVjdGl2ZV9iYXNlc19mcm9tX3Jvdyggcm93LCBiLmNvbF9nYXBfcGVyY2VudCApO1xyXG5cdFx0XHRiLmxheW91dC5hcHBseV9iYXNlc190b19yb3coIHJvdywgY29tcHV0ZWQuYmFzZXMgKTtcclxuXHRcdFx0dGhpcy5pbml0X2FsbF9uZXN0ZWRfc29ydGFibGVzKCBzZWN0aW9uICk7XHJcblxyXG5cdFx0XHQvLyBORVc6IHJldGFnIFVJRHMgZmlyc3QgKHNvIHVuaXF1ZW5lc3MgY2hlY2tzIGRvbid0IGV4Y2x1ZGUgb3JpZ2luYWxzKSwgdGhlbiBkZWR1cGUgYWxsIGtleXMuXHJcblx0XHRcdHRoaXMuX3JldGFnX3VpZHNfaW5fc3VidHJlZSggc2VjdGlvbiApO1xyXG5cdFx0XHR0aGlzLl9kZWR1cGVfc3VidHJlZV9zdHJpY3QoIHNlY3Rpb24gKTtcclxuXHRcdFx0cmV0dXJuIHNlY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAqL1xyXG5cdFx0aW5pdF9hbGxfbmVzdGVkX3NvcnRhYmxlcyhjb250YWluZXIpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0aWYgKCBjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2Zvcm1fcHJldmlld19zZWN0aW9uX2NvbnRhaW5lcicgKSApIHtcclxuXHRcdFx0XHR0aGlzLmluaXRfc2VjdGlvbl9zb3J0YWJsZSggY29udGFpbmVyICk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3NlY3Rpb24nICkuZm9yRWFjaCggKHNlY3Rpb24pID0+IHtcclxuXHRcdFx0XHRzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX2NvbHVtbicgKS5mb3JFYWNoKCAoY29sKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmluaXRfc2VjdGlvbl9zb3J0YWJsZSggY29sICk7XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAqL1xyXG5cdFx0aW5pdF9zZWN0aW9uX3NvcnRhYmxlKGNvbnRhaW5lcikge1xyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRpZiAoICFjb250YWluZXIgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGlzX2NvbHVtbiAgICA9IGNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fY29sdW1uJyApO1xyXG5cdFx0XHRjb25zdCBpc190b3BfbGV2ZWwgPSBjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2Zvcm1fcHJldmlld19zZWN0aW9uX2NvbnRhaW5lcicgKTtcclxuXHRcdFx0aWYgKCAhaXNfY29sdW1uICYmICFpc190b3BfbGV2ZWwgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGIuaW5pdF9zb3J0YWJsZT8uKCBjb250YWluZXIgKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2YgcGFnZXMvc2VjdGlvbnMvZmllbGRzLlxyXG5cdCAqL1xyXG5cdFVJLldQQkNfQkZCX1N0cnVjdHVyZV9JTyA9IGNsYXNzIGV4dGVuZHMgVUkuV1BCQ19CRkJfTW9kdWxlIHtcclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5nZXRfc3RydWN0dXJlICAgICAgICA9ICgpID0+IHRoaXMuc2VyaWFsaXplKCk7XHJcblx0XHRcdHRoaXMuYnVpbGRlci5sb2FkX3NhdmVkX3N0cnVjdHVyZSA9IChzLCBvcHRzKSA9PiB0aGlzLmRlc2VyaWFsaXplKCBzLCBvcHRzICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb3JtYWxpemUgb3B0aW9uIHZhbHVlcyB3aGVuIGEgZmllbGQgZXhwbGljaXRseSBkaXNhYmxlcyBzZXBhcmF0ZSB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogT2xkZXIgQnVpbGRlciB2ZXJzaW9ucyBwZXJzaXN0ZWQgYW4gdW5jaGVja2VkIHZhbHVlX2RpZmZlcnMgdG9nZ2xlIGFzIGFuXHJcblx0XHQgKiBlbXB0eSBzdHJpbmcuIFRyZWF0IHRoYXQgZXhwbGljaXQgbGVnYWN5IHZhbHVlIGFzIGZhbHNlLCB3aGlsZSByZXRhaW5pbmdcclxuXHRcdCAqIHRoZSBzY2hlbWEgZGVmYXVsdCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBnZW51aW5lbHkgYWJzZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZF9kYXRhIFNlcmlhbGl6ZWQgZmllbGQgZGF0YS5cclxuXHRcdCAqIEByZXR1cm5zIHtPYmplY3R9IE5vcm1hbGl6ZWQgc2VyaWFsaXplZCBmaWVsZCBkYXRhLlxyXG5cdFx0ICovXHJcblx0XHRfbm9ybWFsaXplX2ZpZWxkX29wdGlvbl92YWx1ZXMoZmllbGRfZGF0YSkge1xyXG5cdFx0XHRjb25zdCBoYXNfdmFsdWVfZGlmZmVycyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggZmllbGRfZGF0YSwgJ3ZhbHVlX2RpZmZlcnMnICk7XHJcblx0XHRcdGlmICggIWhhc192YWx1ZV9kaWZmZXJzICkge1xyXG5cdFx0XHRcdHJldHVybiBmaWVsZF9kYXRhO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZV9kaWZmZXJzICAgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmNvZXJjZV9ib29sZWFuKCBmaWVsZF9kYXRhLnZhbHVlX2RpZmZlcnMsIGZhbHNlICk7XHJcblx0XHRcdGZpZWxkX2RhdGEudmFsdWVfZGlmZmVycyA9IHZhbHVlX2RpZmZlcnM7XHJcblxyXG5cdFx0XHRpZiAoICF2YWx1ZV9kaWZmZXJzICYmIEFycmF5LmlzQXJyYXkoIGZpZWxkX2RhdGEub3B0aW9ucyApICkge1xyXG5cdFx0XHRcdGZpZWxkX2RhdGEub3B0aW9ucyA9IGZpZWxkX2RhdGEub3B0aW9ucy5tYXAoICggb3B0aW9uX3JlY29yZCApID0+IHtcclxuXHRcdFx0XHRcdGlmICggIW9wdGlvbl9yZWNvcmQgfHwgdHlwZW9mIG9wdGlvbl9yZWNvcmQgIT09ICdvYmplY3QnICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gb3B0aW9uX3JlY29yZDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuXHRcdFx0XHRcdFx0e30sXHJcblx0XHRcdFx0XHRcdG9wdGlvbl9yZWNvcmQsXHJcblx0XHRcdFx0XHRcdHsgdmFsdWU6IFN0cmluZyggb3B0aW9uX3JlY29yZC5sYWJlbCA9PSBudWxsID8gJycgOiBvcHRpb25fcmVjb3JkLmxhYmVsICkgfVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmaWVsZF9kYXRhO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcmV0dXJucyB7QXJyYXl9ICovXHJcblx0XHRzZXJpYWxpemUoKSB7XHJcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdHRoaXMuX25vcm1hbGl6ZV9pZHMoKTtcclxuXHRcdFx0dGhpcy5fbm9ybWFsaXplX25hbWVzKCk7XHJcblx0XHRcdGNvbnN0IHBhZ2VzID0gW107XHJcblx0XHRcdGIucGFnZXNfY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY19iZmJfX3BhbmVsLS1wcmV2aWV3JyApLmZvckVhY2goIChwYWdlX2VsLCBwYWdlX2luZGV4KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY29udGFpbmVyID0gcGFnZV9lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19mb3JtX3ByZXZpZXdfc2VjdGlvbl9jb250YWluZXInICk7XHJcblx0XHRcdFx0Y29uc3QgY29udGVudCAgID0gW107XHJcblx0XHRcdFx0aWYgKCAhY29udGFpbmVyICkge1xyXG5cdFx0XHRcdFx0cGFnZXMucHVzaCggeyBwYWdlOiBwYWdlX2luZGV4ICsgMSwgY29udGVudCB9ICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gKicgKS5mb3JFYWNoKCAoY2hpbGQpID0+IHtcclxuXHRcdFx0XHRcdGlmICggY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRlbnQucHVzaCggeyB0eXBlOiAnc2VjdGlvbicsIGRhdGE6IHRoaXMuc2VyaWFsaXplX3NlY3Rpb24oIGNoaWxkICkgfSApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGNoaWxkLmNsYXNzTGlzdC5jb250YWlucyggJ3dwYmNfYmZiX19maWVsZCcgKSApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoICdpcy1pbnZhbGlkJyApICkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRjb25zdCBmX2RhdGEgPSB0aGlzLl9ub3JtYWxpemVfZmllbGRfb3B0aW9uX3ZhbHVlcyhcclxuXHRcdFx0XHRcdFx0XHRDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5nZXRfYWxsX2RhdGFfYXR0cmlidXRlcyggY2hpbGQgKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHQvLyBEcm9wIGVwaGVtZXJhbC9lZGl0b3Itb25seSBmbGFnc1xyXG5cdFx0XHRcdFx0XHRbICd1aWQnLCAnZnJlc2gnLCAnYXV0b25hbWUnLCAnd2FzX2xvYWRlZCcsICduYW1lX3VzZXJfdG91Y2hlZCcgXVxyXG5cdFx0XHRcdFx0XHRcdC5mb3JFYWNoKCBrID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggayBpbiBmX2RhdGEgKSBkZWxldGUgZl9kYXRhW2tdO1xyXG5cdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdFx0Y29udGVudC5wdXNoKCB7IHR5cGU6ICdmaWVsZCcsIGRhdGE6IGZfZGF0YSB9ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdHBhZ2VzLnB1c2goIHsgcGFnZTogcGFnZV9pbmRleCArIDEsIGNvbnRlbnQgfSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdHJldHVybiBwYWdlcztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlY3Rpb25fZWxcclxuXHRcdCAqIEByZXR1cm5zIHt7aWQ6c3RyaW5nLGxhYmVsOnN0cmluZyxodG1sX2lkOnN0cmluZyxjc3NjbGFzczpzdHJpbmcsY29sX3N0eWxlczpzdHJpbmcsY29sdW1uczpBcnJheX19XHJcblx0XHQgKi9cclxuXHRcdHNlcmlhbGl6ZV9zZWN0aW9uKHNlY3Rpb25fZWwpIHtcclxuXHRcdFx0Y29uc3Qgcm93ID0gc2VjdGlvbl9lbC5xdWVyeVNlbGVjdG9yKCAnOnNjb3BlID4gLndwYmNfYmZiX19yb3cnICk7XHJcblxyXG5cdFx0XHQvLyBORVc6IHJlYWQgcGVyLWNvbHVtbiBzdHlsZXMgZnJvbSBkYXRhc2V0L2F0dHJpYnV0ZXMgKHVuZGVyc2NvcmUgJiBoeXBoZW4pXHJcblx0XHRcdHZhciBjb2xfc3R5bGVzX3JhdyA9XHJcblx0XHRcdFx0XHRzZWN0aW9uX2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtY29sX3N0eWxlcycgKSB8fFxyXG5cdFx0XHRcdFx0KHNlY3Rpb25fZWwuZGF0YXNldCA/IChzZWN0aW9uX2VsLmRhdGFzZXQuY29sX3N0eWxlcykgOiAnJykgfHxcclxuXHRcdFx0XHRcdCcnO1xyXG5cclxuXHRcdFx0Y29uc3QgYmFzZSA9IHtcclxuXHRcdFx0XHRpZCAgICAgICAgOiBzZWN0aW9uX2VsLmRhdGFzZXQuaWQsXHJcblx0XHRcdFx0bGFiZWwgICAgIDogc2VjdGlvbl9lbC5kYXRhc2V0LmxhYmVsIHx8ICcnLFxyXG5cdFx0XHRcdGh0bWxfaWQgICA6IHNlY3Rpb25fZWwuZGF0YXNldC5odG1sX2lkIHx8ICcnLFxyXG5cdFx0XHRcdGNzc2NsYXNzICA6IHNlY3Rpb25fZWwuZGF0YXNldC5jc3NjbGFzcyB8fCAnJyxcclxuXHRcdFx0XHRjb2xfc3R5bGVzOiBTdHJpbmcoIGNvbF9zdHlsZXNfcmF3ICkgICAgICAgIC8vIDwtLSBORVc6IGtlZXAgYXMgcmF3IEpTT04gc3RyaW5nXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoICFyb3cgKSB7XHJcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oIHt9LCBiYXNlLCB7IGNvbHVtbnM6IFtdIH0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29sdW1ucyA9IFtdO1xyXG5cdFx0XHRyb3cucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApLmZvckVhY2goIGZ1bmN0aW9uIChjb2wpIHtcclxuXHRcdFx0XHRjb25zdCB3aWR0aCA9IGNvbC5zdHlsZS5mbGV4QmFzaXMgfHwgJzEwMCUnO1xyXG5cdFx0XHRcdGNvbnN0IGl0ZW1zID0gW107XHJcblx0XHRcdFx0QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggY29sLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcclxuXHRcdFx0XHRcdGlmICggY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgKSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1zLnB1c2goIHsgdHlwZTogJ3NlY3Rpb24nLCBkYXRhOiB0aGlzLnNlcmlhbGl6ZV9zZWN0aW9uKCBjaGlsZCApIH0gKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICkgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaXMtaW52YWxpZCcgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0Y29uc3QgZl9kYXRhID0gdGhpcy5fbm9ybWFsaXplX2ZpZWxkX29wdGlvbl92YWx1ZXMoXHJcblx0XHRcdFx0XHRcdFx0Q29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuZ2V0X2FsbF9kYXRhX2F0dHJpYnV0ZXMoIGNoaWxkIClcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0WyAndWlkJywgJ2ZyZXNoJywgJ2F1dG9uYW1lJywgJ3dhc19sb2FkZWQnLCAnbmFtZV91c2VyX3RvdWNoZWQnIF0uZm9yRWFjaCggZnVuY3Rpb24gKGspIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGsgaW4gZl9kYXRhICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIGZfZGF0YVtrXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRcdFx0aXRlbXMucHVzaCggeyB0eXBlOiAnZmllbGQnLCBkYXRhOiBmX2RhdGEgfSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0uYmluZCggdGhpcyApICk7XHJcblx0XHRcdFx0Y29sdW1ucy5wdXNoKCB7IHdpZHRoOiB3aWR0aCwgaXRlbXM6IGl0ZW1zIH0gKTtcclxuXHRcdFx0fS5iaW5kKCB0aGlzICkgKTtcclxuXHJcblx0XHRcdC8vIENsYW1wIHBlcnNpc3RlZCBjb2xfc3R5bGVzIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvbHVtbnMgb24gU2F2ZS5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCBjb2xDb3VudCA9IGNvbHVtbnMubGVuZ3RoO1xyXG5cdFx0XHRcdGNvbnN0IHJhdyAgICAgID0gU3RyaW5nKCBjb2xfc3R5bGVzX3JhdyB8fCAnJyApLnRyaW0oKTtcclxuXHJcblx0XHRcdFx0aWYgKCByYXcgKSB7XHJcblx0XHRcdFx0XHRsZXQgYXJyID0gW107XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKCByYXcgKTtcclxuXHRcdFx0XHRcdFx0YXJyICAgICAgICAgID0gQXJyYXkuaXNBcnJheSggcGFyc2VkICkgPyBwYXJzZWQgOiAocGFyc2VkICYmIEFycmF5LmlzQXJyYXkoIHBhcnNlZC5jb2x1bW5zICkgPyBwYXJzZWQuY29sdW1ucyA6IFtdKTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0XHRcdFx0YXJyID0gW107XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjb2xDb3VudCA8PSAwICkge1xyXG5cdFx0XHRcdFx0XHRiYXNlLmNvbF9zdHlsZXMgPSAnW10nO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBhcnIubGVuZ3RoID4gY29sQ291bnQgKSBhcnIubGVuZ3RoID0gY29sQ291bnQ7XHJcblx0XHRcdFx0XHRcdHdoaWxlICggYXJyLmxlbmd0aCA8IGNvbENvdW50ICkgYXJyLnB1c2goIHt9ICk7XHJcblx0XHRcdFx0XHRcdGJhc2UuY29sX3N0eWxlcyA9IEpTT04uc3RyaW5naWZ5KCBhcnIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0YmFzZS5jb2xfc3R5bGVzID0gJyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKCB7fSwgYmFzZSwgeyBjb2x1bW5zOiBjb2x1bW5zIH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IHN0cnVjdHVyZVxyXG5cdFx0ICogQHBhcmFtIHt7ZGVmZXJJZlR5cGluZz86IGJvb2xlYW59fSBbb3B0cyA9IHt9XVxyXG5cdFx0ICovXHJcblx0XHRkZXNlcmlhbGl6ZShzdHJ1Y3R1cmUsIHsgZGVmZXJJZlR5cGluZyA9IHRydWUgfSA9IHt9KSB7XHJcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmJ1aWxkZXI7XHJcblx0XHRcdGlmICggZGVmZXJJZlR5cGluZyAmJiB0aGlzLl9pc190eXBpbmdfaW5faW5zcGVjdG9yKCkgKSB7XHJcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aGlzLl9kZWZlcl90aW1lciApO1xyXG5cdFx0XHRcdHRoaXMuX2RlZmVyX3RpbWVyID0gc2V0VGltZW91dCggKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5kZXNlcmlhbGl6ZSggc3RydWN0dXJlLCB7IGRlZmVySWZUeXBpbmc6IGZhbHNlIH0gKTtcclxuXHRcdFx0XHR9LCAxNTAgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0Yi5wYWdlc19jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdGIucGFnZV9jb3VudGVyICAgICAgICAgICAgICA9IDA7XHJcblx0XHRcdChzdHJ1Y3R1cmUgfHwgW10pLmZvckVhY2goIChwYWdlX2RhdGEpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYWdlX2VsICAgICAgICAgICAgICAgPSBiLnBhZ2VzX3NlY3Rpb25zLmFkZF9wYWdlKCB7IHNjcm9sbDogZmFsc2UgfSApO1xyXG5cdFx0XHRcdGNvbnN0IHNlY3Rpb25fY29udGFpbmVyICAgICA9IHBhZ2VfZWwucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fZm9ybV9wcmV2aWV3X3NlY3Rpb25fY29udGFpbmVyJyApO1xyXG5cdFx0XHRcdHNlY3Rpb25fY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG5cdFx0XHRcdGIuaW5pdF9zZWN0aW9uX3NvcnRhYmxlPy4oIHNlY3Rpb25fY29udGFpbmVyICk7XHJcblx0XHRcdFx0KHBhZ2VfZGF0YS5jb250ZW50IHx8IFtdKS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCBpdGVtLnR5cGUgPT09ICdzZWN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0Ly8gTm93IHJldHVybnMgdGhlIGVsZW1lbnQ7IGF0dHJpYnV0ZXMgKGluY2wuIGNvbF9zdHlsZXMpIGFyZSBhcHBsaWVkIGluc2lkZSByZWJ1aWxkLlxyXG5cdFx0XHRcdFx0XHRiLnBhZ2VzX3NlY3Rpb25zLnJlYnVpbGRfc2VjdGlvbiggaXRlbS5kYXRhLCBzZWN0aW9uX2NvbnRhaW5lciApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGl0ZW0udHlwZSA9PT0gJ2ZpZWxkJyApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZWwgPSBiLmJ1aWxkX2ZpZWxkKCBpdGVtLmRhdGEgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbCApIHtcclxuXHRcdFx0XHRcdFx0XHRzZWN0aW9uX2NvbnRhaW5lci5hcHBlbmRDaGlsZCggZWwgKTtcclxuXHRcdFx0XHRcdFx0XHRiLnRyaWdnZXJfZmllbGRfZHJvcF9jYWxsYmFjayggZWwsICdsb2FkJyApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHRcdGIudXNhZ2U/LnVwZGF0ZV9wYWxldHRlX3VpPy4oKTtcclxuXHRcdFx0Yi5idXMuZW1pdCggQ29yZS5XUEJDX0JGQl9FdmVudHMuU1RSVUNUVVJFX0xPQURFRCwgeyBzdHJ1Y3R1cmUgfSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9ub3JtYWxpemVfaWRzKCkge1xyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRiLnBhZ2VzX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19wYW5lbC0tcHJldmlldyAud3BiY19iZmJfX2ZpZWxkOm5vdCguaXMtaW52YWxpZCknICkuZm9yRWFjaCggKGVsKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IENvcmUuV1BCQ19Gb3JtX0J1aWxkZXJfSGVscGVyLmdldF9hbGxfZGF0YV9hdHRyaWJ1dGVzKCBlbCApO1xyXG5cdFx0XHRcdGNvbnN0IHdhbnQgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIGRhdGEuaWQgfHwgJycgKSB8fCAnZmllbGQnO1xyXG5cdFx0XHRcdGNvbnN0IHVuaXEgPSBiLmlkLmVuc3VyZV91bmlxdWVfZmllbGRfaWQoIHdhbnQsIGVsICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmlkICE9PSB1bmlxICkge1xyXG5cdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS1pZCcsIHVuaXEgKTtcclxuXHRcdFx0XHRcdGlmICggYi5wcmV2aWV3X21vZGUgKSB7XHJcblx0XHRcdFx0XHRcdGIucmVuZGVyX3ByZXZpZXcoIGVsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0X25vcm1hbGl6ZV9uYW1lcygpIHtcclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVpbGRlcjtcclxuXHRcdFx0Yi5wYWdlc19jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCggJy53cGJjX2JmYl9fcGFuZWwtLXByZXZpZXcgLndwYmNfYmZiX19maWVsZDpub3QoLmlzLWludmFsaWQpJyApLmZvckVhY2goIChlbCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBDb3JlLldQQkNfRm9ybV9CdWlsZGVyX0hlbHBlci5nZXRfYWxsX2RhdGFfYXR0cmlidXRlcyggZWwgKTtcclxuXHRcdFx0XHRjb25zdCBiYXNlID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5zYW5pdGl6ZV9odG1sX25hbWUoIChkYXRhLm5hbWUgIT0gbnVsbCkgPyBkYXRhLm5hbWUgOiBkYXRhLmlkICkgfHwgJ2ZpZWxkJztcclxuXHRcdFx0XHRjb25zdCB1bmlxID0gYi5pZC5lbnN1cmVfdW5pcXVlX2ZpZWxkX25hbWUoIGJhc2UsIGVsICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuaXEgKSB7XHJcblx0XHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLW5hbWUnLCB1bmlxICk7XHJcblx0XHRcdFx0XHRpZiAoIGIucHJldmlld19tb2RlICkge1xyXG5cdFx0XHRcdFx0XHRiLnJlbmRlcl9wcmV2aWV3KCBlbCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cclxuXHRcdF9pc190eXBpbmdfaW5faW5zcGVjdG9yKCkge1xyXG5cdFx0XHRjb25zdCBpbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX19pbnNwZWN0b3InICk7XHJcblx0XHRcdHJldHVybiAhIShpbnMgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBpbnMuY29udGFpbnMoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKSk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogTWluaW1hbCwgc3RhbmRhbG9uZSBndWFyZCB0aGF0IGVuZm9yY2VzIHBlci1jb2x1bW4gbWluIHdpZHRocyBiYXNlZCBvbiBmaWVsZHMnIGRhdGEtbWluX3dpZHRoLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1VJLldQQkNfQkZCX01pbl9XaWR0aF9HdWFyZH1cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9NaW5fV2lkdGhfR3VhcmQgPSBjbGFzcyBleHRlbmRzIFVJLldQQkNfQkZCX01vZHVsZSB7XHJcblxyXG5cdFx0Y29uc3RydWN0b3IoYnVpbGRlcikge1xyXG5cdFx0XHRzdXBlciggYnVpbGRlciApO1xyXG5cdFx0XHR0aGlzLl9vbl9maWVsZF9hZGQgICAgICAgID0gdGhpcy5fb25fZmllbGRfYWRkLmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0dGhpcy5fb25fZmllbGRfcmVtb3ZlICAgICA9IHRoaXMuX29uX2ZpZWxkX3JlbW92ZS5iaW5kKCB0aGlzICk7XHJcblx0XHRcdHRoaXMuX29uX3N0cnVjdHVyZV9sb2FkZWQgPSB0aGlzLl9vbl9zdHJ1Y3R1cmVfbG9hZGVkLmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0dGhpcy5fb25fc3RydWN0dXJlX2NoYW5nZSA9IHRoaXMuX29uX3N0cnVjdHVyZV9jaGFuZ2UuYmluZCggdGhpcyApO1xyXG5cdFx0XHR0aGlzLl9vbl93aW5kb3dfcmVzaXplICAgID0gdGhpcy5fb25fd2luZG93X3Jlc2l6ZS5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0XHR0aGlzLl9wZW5kaW5nX3Jvd3MgPSBuZXcgU2V0KCk7XHJcblx0XHRcdHRoaXMuX3BlbmRpbmdfYWxsICA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9yYWZfaWQgICAgICAgPSAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGluaXQoKSB7XHJcblx0XHRcdGNvbnN0IEVWID0gQ29yZS5XUEJDX0JGQl9FdmVudHM7XHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vbj8uKCBFVi5GSUVMRF9BREQsIHRoaXMuX29uX2ZpZWxkX2FkZCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXI/LmJ1cz8ub24/LiggRVYuRklFTERfUkVNT1ZFLCB0aGlzLl9vbl9maWVsZF9yZW1vdmUgKTtcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5idXM/Lm9uPy4oIEVWLlNUUlVDVFVSRV9MT0FERUQsIHRoaXMuX29uX3N0cnVjdHVyZV9sb2FkZWQgKTtcclxuXHRcdFx0Ly8gUmVmcmVzaCBzZWxlY3RpdmVseSBvbiBzdHJ1Y3R1cmUgY2hhbmdlIChOT1Qgb24gZXZlcnkgcHJvcCBpbnB1dCkuXHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vbj8uKCBFVi5TVFJVQ1RVUkVfQ0hBTkdFLCB0aGlzLl9vbl9zdHJ1Y3R1cmVfY2hhbmdlICk7XHJcblxyXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMuX29uX3dpbmRvd19yZXNpemUsIHsgcGFzc2l2ZTogdHJ1ZSB9ICk7XHJcblx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGVzdHJveSgpIHtcclxuXHRcdFx0Y29uc3QgRVYgPSBDb3JlLldQQkNfQkZCX0V2ZW50cztcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5idXM/Lm9mZj8uKCBFVi5GSUVMRF9BREQsIHRoaXMuX29uX2ZpZWxkX2FkZCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXI/LmJ1cz8ub2ZmPy4oIEVWLkZJRUxEX1JFTU9WRSwgdGhpcy5fb25fZmllbGRfcmVtb3ZlICk7XHJcblx0XHRcdHRoaXMuYnVpbGRlcj8uYnVzPy5vZmY/LiggRVYuU1RSVUNUVVJFX0xPQURFRCwgdGhpcy5fb25fc3RydWN0dXJlX2xvYWRlZCApO1xyXG5cdFx0XHR0aGlzLmJ1aWxkZXI/LmJ1cz8ub2ZmPy4oIEVWLlNUUlVDVFVSRV9DSEFOR0UsIHRoaXMuX29uX3N0cnVjdHVyZV9jaGFuZ2UgKTtcclxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzLl9vbl93aW5kb3dfcmVzaXplICk7XHJcblx0XHR9XHJcblxyXG5cdFx0X29uX2ZpZWxkX2FkZChlKSB7XHJcblx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHRcdC8vIGlmIHlvdSByZWFsbHkgd2FudCB0byBiZSBtaW5pbWFsIHdvcmsgaGVyZSwga2VlcCB5b3VyIHJvdy1vbmx5IHZlcnNpb24uXHJcblx0XHR9XHJcblxyXG5cdFx0X29uX2ZpZWxkX3JlbW92ZShlKSB7XHJcblx0XHRcdGNvbnN0IHNyY19lbCA9IGU/LmRldGFpbD8uZWwgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgcm93ICAgID0gKHNyY19lbCAmJiBzcmNfZWwuY2xvc2VzdCkgPyBzcmNfZWwuY2xvc2VzdCggJy53cGJjX2JmYl9fcm93JyApIDogbnVsbDtcclxuXHRcdFx0aWYgKCByb3cgKSB7XHJcblx0XHRcdFx0dGhpcy5fc2NoZWR1bGVfcmVmcmVzaF9yb3coIHJvdyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRfb25fc3RydWN0dXJlX2xvYWRlZCgpIHtcclxuXHRcdFx0dGhpcy5fc2NoZWR1bGVfcmVmcmVzaF9hbGwoKTtcclxuXHRcdH1cclxuXHJcblx0XHRfb25fc3RydWN0dXJlX2NoYW5nZShlKSB7XHJcblx0XHRcdGNvbnN0IHJlYXNvbiA9IGU/LmRldGFpbD8ucmVhc29uIHx8ICcnO1xyXG5cdFx0XHRjb25zdCBrZXkgICAgPSBlPy5kZXRhaWw/LmtleSB8fCAnJztcclxuXHJcblx0XHRcdC8vIElnbm9yZSBub2lzeSBwcm9wIGNoYW5nZXMgdGhhdCBkb24ndCBhZmZlY3QgbWluIHdpZHRocy5cclxuXHRcdFx0aWYgKCByZWFzb24gPT09ICdwcm9wLWNoYW5nZScgJiYga2V5ICE9PSAnbWluX3dpZHRoJyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGVsICA9IGU/LmRldGFpbD8uZWwgfHwgbnVsbDtcclxuXHRcdFx0Y29uc3Qgcm93ID0gZWw/LmNsb3Nlc3Q/LiggJy53cGJjX2JmYl9fcm93JyApIHx8IG51bGw7XHJcblx0XHRcdGlmICggcm93ICkge1xyXG5cdFx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfcm93KCByb3cgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLl9zY2hlZHVsZV9yZWZyZXNoX2FsbCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0X29uX3dpbmRvd19yZXNpemUoKSB7XHJcblx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlZnJlc2hfYWxsKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0X3NjaGVkdWxlX3JlZnJlc2hfcm93KHJvd19lbCkge1xyXG5cdFx0XHRpZiAoICFyb3dfZWwgKSByZXR1cm47XHJcblx0XHRcdHRoaXMuX3BlbmRpbmdfcm93cy5hZGQoIHJvd19lbCApO1xyXG5cdFx0XHR0aGlzLl9raWNrX3JhZigpO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9zY2hlZHVsZV9yZWZyZXNoX2FsbCgpIHtcclxuXHRcdFx0dGhpcy5fcGVuZGluZ19hbGwgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLl9wZW5kaW5nX3Jvd3MuY2xlYXIoKTtcclxuXHRcdFx0dGhpcy5fa2lja19yYWYoKTtcclxuXHRcdH1cclxuXHJcblx0XHRfa2lja19yYWYoKSB7XHJcblx0XHRcdGlmICggdGhpcy5fcmFmX2lkICkgcmV0dXJuO1xyXG5cdFx0XHR0aGlzLl9yYWZfaWQgPSAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0KSggKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuX3JhZl9pZCA9IDA7XHJcblx0XHRcdFx0aWYgKCB0aGlzLl9wZW5kaW5nX2FsbCApIHtcclxuXHRcdFx0XHRcdHRoaXMuX3BlbmRpbmdfYWxsID0gZmFsc2U7XHJcblx0XHRcdFx0XHR0aGlzLnJlZnJlc2hfYWxsKCk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKCB0aGlzLl9wZW5kaW5nX3Jvd3MgKTtcclxuXHRcdFx0XHR0aGlzLl9wZW5kaW5nX3Jvd3MuY2xlYXIoKTtcclxuXHRcdFx0XHRyb3dzLmZvckVhY2goIChyKSA9PiB0aGlzLnJlZnJlc2hfcm93KCByICkgKTtcclxuXHRcdFx0fSwgMCApO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRyZWZyZXNoX2FsbCgpIHtcclxuXHRcdFx0dGhpcy5idWlsZGVyPy5wYWdlc19jb250YWluZXJcclxuXHRcdFx0XHQ/LnF1ZXJ5U2VsZWN0b3JBbGw/LiggJy53cGJjX2JmYl9fcm93JyApXHJcblx0XHRcdFx0Py5mb3JFYWNoPy4oIChyb3cpID0+IHRoaXMucmVmcmVzaF9yb3coIHJvdyApICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmVmcmVzaF9yb3cocm93X2VsKSB7XHJcblx0XHRcdGlmICggIXJvd19lbCApIHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IGNvbHMgPSByb3dfZWwucXVlcnlTZWxlY3RvckFsbCggJzpzY29wZSA+IC53cGJjX2JmYl9fY29sdW1uJyApO1xyXG5cclxuXHRcdFx0Ly8gMSkgUmVjYWxjdWxhdGUgZWFjaCBjb2x1bW7igJlzIHJlcXVpcmVkIG1pbiBweCBhbmQgd3JpdGUgaXQgdG8gdGhlIENTUyB2YXIuXHJcblx0XHRcdGNvbHMuZm9yRWFjaCggKGNvbCkgPT4gdGhpcy5hcHBseV9jb2xfbWluKCBjb2wgKSApO1xyXG5cclxuXHRcdFx0Ly8gMikgRW5mb3JjZSBpdCBhdCB0aGUgQ1NTIGxldmVsIHJpZ2h0IGF3YXkgc28gbGF5b3V0IGNhbuKAmXQgcmVuZGVyIG5hcnJvd2VyLlxyXG5cdFx0XHRjb2xzLmZvckVhY2goIChjb2wpID0+IHtcclxuXHRcdFx0XHRjb25zdCBweCAgICAgICAgICAgPSBwYXJzZUZsb2F0KCBnZXRDb21wdXRlZFN0eWxlKCBjb2wgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnLS13cGJjLWNvbC1taW4nICkgfHwgJzAnICkgfHwgMDtcclxuXHRcdFx0XHRjb2wuc3R5bGUubWluV2lkdGggPSBweCA+IDAgPyBNYXRoLnJvdW5kKCBweCApICsgJ3B4JyA6ICcnO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyAzKSBOb3JtYWxpemUgY3VycmVudCBiYXNlcyBzbyB0aGUgcm93IHJlc3BlY3RzIGFsbCBtaW5zIHdpdGhvdXQgb3ZlcmZsb3cuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QgYiAgID0gdGhpcy5idWlsZGVyO1xyXG5cdFx0XHRcdGNvbnN0IGdwICA9IGIuY29sX2dhcF9wZXJjZW50O1xyXG5cdFx0XHRcdGNvbnN0IGVmZiA9IGIubGF5b3V0LmNvbXB1dGVfZWZmZWN0aXZlX2Jhc2VzX2Zyb21fcm93KCByb3dfZWwsIGdwICk7ICAvLyB7IGJhc2VzLCBhdmFpbGFibGUgfVxyXG5cdFx0XHRcdC8vIFJlLWZpdCAqY3VycmVudCogYmFzZXMgYWdhaW5zdCBtaW5zIChzYW1lIGFsZ29yaXRobSBsYXlvdXQgY2hpcHMgdXNlKS5cclxuXHRcdFx0XHRjb25zdCBmaXR0ZWQgPSBVSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMuX2ZpdF93ZWlnaHRzX3Jlc3BlY3RpbmdfbWluKCBiLCByb3dfZWwsIGVmZi5iYXNlcyApO1xyXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggZml0dGVkICkgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VkID0gZml0dGVkLnNvbWUoICh2LCBpKSA9PiBNYXRoLmFicyggdiAtIGVmZi5iYXNlc1tpXSApID4gMC4wMSApO1xyXG5cdFx0XHRcdFx0aWYgKCBjaGFuZ2VkICkge1xyXG5cdFx0XHRcdFx0XHRiLmxheW91dC5hcHBseV9iYXNlc190b19yb3coIHJvd19lbCwgZml0dGVkICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHR3Ll93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9NaW5fV2lkdGhfR3VhcmQgLSByZWZyZXNoX3JvdycsIGUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGFwcGx5X2NvbF9taW4oY29sX2VsKSB7XHJcblx0XHRcdGlmICggIWNvbF9lbCApIHJldHVybjtcclxuXHRcdFx0bGV0IG1heF9weCAgICA9IDA7XHJcblx0XHRcdGNvbnN0IGNvbFJlY3QgPSBjb2xfZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRcdGNvbF9lbC5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gLndwYmNfYmZiX19maWVsZCcgKS5mb3JFYWNoKCAoZmllbGQpID0+IHtcclxuXHRcdFx0XHRjb25zdCByYXcgPSBmaWVsZC5nZXRBdHRyaWJ1dGUoICdkYXRhLW1pbl93aWR0aCcgKTtcclxuXHRcdFx0XHRsZXQgcHggICAgPSAwO1xyXG5cdFx0XHRcdGlmICggcmF3ICkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcyA9IFN0cmluZyggcmF3ICkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRpZiAoIHMuZW5kc1dpdGgoICclJyApICkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBuID0gcGFyc2VGbG9hdCggcyApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIE51bWJlci5pc0Zpbml0ZSggbiApICYmIGNvbFJlY3Qud2lkdGggPiAwICkge1xyXG5cdFx0XHRcdFx0XHRcdHB4ID0gKG4gLyAxMDApICogY29sUmVjdC53aWR0aDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRweCA9IDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHB4ID0gdGhpcy5wYXJzZV9sZW5fcHgoIHMgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgY3MgPSBnZXRDb21wdXRlZFN0eWxlKCBmaWVsZCApO1xyXG5cdFx0XHRcdFx0cHggICAgICAgPSBwYXJzZUZsb2F0KCBjcy5taW5XaWR0aCB8fCAnMCcgKSB8fCAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIHB4ID4gbWF4X3B4ICkgbWF4X3B4ID0gcHg7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0Y29sX2VsLnN0eWxlLnNldFByb3BlcnR5KCAnLS13cGJjLWNvbC1taW4nLCBtYXhfcHggPiAwID8gTWF0aC5yb3VuZCggbWF4X3B4ICkgKyAncHgnIDogJzBweCcgKTtcclxuXHRcdH1cclxuXHJcblx0XHRwYXJzZV9sZW5fcHgodmFsdWUpIHtcclxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsICkgcmV0dXJuIDA7XHJcblx0XHRcdGNvbnN0IHMgPSBTdHJpbmcoIHZhbHVlICkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdGlmICggcyA9PT0gJycgKSByZXR1cm4gMDtcclxuXHRcdFx0aWYgKCBzLmVuZHNXaXRoKCAncHgnICkgKSB7XHJcblx0XHRcdFx0Y29uc3QgbiA9IHBhcnNlRmxvYXQoIHMgKTtcclxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyLmlzRmluaXRlKCBuICkgPyBuIDogMDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIHMuZW5kc1dpdGgoICdyZW0nICkgfHwgcy5lbmRzV2l0aCggJ2VtJyApICkge1xyXG5cdFx0XHRcdGNvbnN0IG4gICAgPSBwYXJzZUZsb2F0KCBzICk7XHJcblx0XHRcdFx0Y29uc3QgYmFzZSA9IHBhcnNlRmxvYXQoIGdldENvbXB1dGVkU3R5bGUoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApLmZvbnRTaXplICkgfHwgMTY7XHJcblx0XHRcdFx0cmV0dXJuIE51bWJlci5pc0Zpbml0ZSggbiApID8gbiAqIGJhc2UgOiAwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IG4gPSBwYXJzZUZsb2F0KCBzICk7XHJcblx0XHRcdHJldHVybiBOdW1iZXIuaXNGaW5pdGUoIG4gKSA/IG4gOiAwO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkNfQkZCX1RvZ2dsZV9Ob3JtYWxpemVyXHJcblx0ICpcclxuXHQgKiBDb252ZXJ0cyBwbGFpbiBjaGVja2JveGVzIGludG8gdG9nZ2xlIFVJOlxyXG5cdCAqIDxkaXYgY2xhc3M9XCJpbnNwZWN0b3JfX2NvbnRyb2wgd3BiY191aV9fdG9nZ2xlXCI+XHJcblx0ICogICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ7dW5pcXVlfVwiIGRhdGEtaW5zcGVjdG9yLWtleT1cIi4uLlwiIGNsYXNzPVwiaW5zcGVjdG9yX19pbnB1dFwiIHJvbGU9XCJzd2l0Y2hcIlxyXG5cdCAqIGFyaWEtY2hlY2tlZD1cInRydWV8ZmFsc2VcIj5cclxuXHQgKiAgIDxsYWJlbCBjbGFzcz1cIndwYmNfdWlfX3RvZ2dsZV9pY29uXCIgIGZvcj1cInt1bmlxdWV9XCI+PC9sYWJlbD5cclxuXHQgKiAgIDxsYWJlbCBjbGFzcz1cIndwYmNfdWlfX3RvZ2dsZV9sYWJlbFwiIGZvcj1cInt1bmlxdWV9XCI+TGFiZWw8L2xhYmVsPlxyXG5cdCAqIDwvZGl2PlxyXG5cdCAqXHJcblx0ICogLSBTa2lwcyBpbnB1dHMgYWxyZWFkeSBpbnNpZGUgYC53cGJjX3VpX190b2dnbGVgLlxyXG5cdCAqIC0gUmV1c2VzIGFuIGV4aXN0aW5nIDxsYWJlbCBmb3I9XCIuLi5cIj4gdGV4dCBpZiBwcmVzZW50OyBvdGhlcndpc2UgZmFsbHMgYmFjayB0byBuZWFyYnkgbGFiZWxzIG9yIGF0dHJpYnV0ZXMuXHJcblx0ICogLSBBdXRvLWdlbmVyYXRlcyBhIHVuaXF1ZSBpZCB3aGVuIGFic2VudC5cclxuXHQgKi9cclxuXHRVSS5XUEJDX0JGQl9Ub2dnbGVfTm9ybWFsaXplciA9IGNsYXNzIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVwZ3JhZGUgYWxsIHJhdyBjaGVja2JveGVzIGluIGEgY29udGFpbmVyIHRvIHRvZ2dsZXMuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb290X2VsXHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyB1cGdyYWRlX2NoZWNrYm94ZXNfaW4ocm9vdF9lbCkge1xyXG5cclxuXHRcdFx0aWYgKCAhcm9vdF9lbCB8fCAhcm9vdF9lbC5xdWVyeVNlbGVjdG9yQWxsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGlucHV0cyA9IHJvb3RfZWwucXVlcnlTZWxlY3RvckFsbCggJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScgKTtcclxuXHRcdFx0aWYgKCAhaW5wdXRzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGlucHV0cywgZnVuY3Rpb24gKGlucHV0KSB7XHJcblxyXG5cdFx0XHRcdC8vIDEpIFNraXAgaWYgYWxyZWFkeSBpbnNpZGUgdG9nZ2xlIHdyYXBwZXIuXHJcblx0XHRcdFx0aWYgKCBpbnB1dC5jbG9zZXN0KCAnLndwYmNfdWlfX3RvZ2dsZScgKSApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gU2tpcCByb3dzIC8gd2hlcmUgaW5wdXQgY2hlY2tib3ggZXhwbGljaXRseSBtYXJrZWQgd2l0aCAgYXR0cmlidXRlICdkYXRhLXdwYmMtdWktbm8tdG9nZ2xlJy5cclxuXHRcdFx0XHRpZiAoIGlucHV0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtd3BiYy11aS1uby10b2dnbGUnICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyAyKSBFbnN1cmUgdW5pcXVlIGlkOyBwcmVmZXIgZXhpc3RpbmcuXHJcblx0XHRcdFx0dmFyIGlucHV0X2lkID0gaW5wdXQuZ2V0QXR0cmlidXRlKCAnaWQnICk7XHJcblx0XHRcdFx0aWYgKCAhaW5wdXRfaWQgKSB7XHJcblx0XHRcdFx0XHR2YXIga2V5ICA9IChpbnB1dC5kYXRhc2V0ICYmIGlucHV0LmRhdGFzZXQuaW5zcGVjdG9yS2V5KSA/IFN0cmluZyggaW5wdXQuZGF0YXNldC5pbnNwZWN0b3JLZXkgKSA6ICdvcHQnO1xyXG5cdFx0XHRcdFx0aW5wdXRfaWQgPSBVSS5XUEJDX0JGQl9Ub2dnbGVfTm9ybWFsaXplci5nZW5lcmF0ZV91bmlxdWVfaWQoICd3cGJjX2luc19hdXRvXycgKyBrZXkgKyAnXycgKTtcclxuXHRcdFx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggJ2lkJywgaW5wdXRfaWQgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIDMpIEZpbmQgYmVzdCBsYWJlbCB0ZXh0LlxyXG5cdFx0XHRcdHZhciBsYWJlbF90ZXh0ID0gVUkuV1BCQ19CRkJfVG9nZ2xlX05vcm1hbGl6ZXIucmVzb2x2ZV9sYWJlbF90ZXh0KCByb290X2VsLCBpbnB1dCwgaW5wdXRfaWQgKTtcclxuXHJcblx0XHRcdFx0Ly8gNCkgQnVpbGQgdGhlIHRvZ2dsZSB3cmFwcGVyLlxyXG5cdFx0XHRcdHZhciB3cmFwcGVyICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcclxuXHRcdFx0XHR3cmFwcGVyLmNsYXNzTmFtZSA9ICdpbnNwZWN0b3JfX2NvbnRyb2wgd3BiY191aV9fdG9nZ2xlJztcclxuXHJcblx0XHRcdFx0Ly8gS2VlcCBvcmlnaW5hbCBpbnB1dDsganVzdCBtb3ZlIGl0IGludG8gd3JhcHBlci5cclxuXHRcdFx0XHRpbnB1dC5jbGFzc0xpc3QuYWRkKCAnaW5zcGVjdG9yX19pbnB1dCcgKTtcclxuXHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoICdyb2xlJywgJ3N3aXRjaCcgKTtcclxuXHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCBpbnB1dC5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cclxuXHRcdFx0XHR2YXIgaWNvbl9sYWJlbCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHRpY29uX2xhYmVsLmNsYXNzTmFtZSA9ICd3cGJjX3VpX190b2dnbGVfaWNvbic7XHJcblx0XHRcdFx0aWNvbl9sYWJlbC5zZXRBdHRyaWJ1dGUoICdmb3InLCBpbnB1dF9pZCApO1xyXG5cclxuXHRcdFx0XHR2YXIgdGV4dF9sYWJlbCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHR0ZXh0X2xhYmVsLmNsYXNzTmFtZSA9ICd3cGJjX3VpX190b2dnbGVfbGFiZWwnO1xyXG5cdFx0XHRcdHRleHRfbGFiZWwuc2V0QXR0cmlidXRlKCAnZm9yJywgaW5wdXRfaWQgKTtcclxuXHRcdFx0XHR0ZXh0X2xhYmVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggbGFiZWxfdGV4dCApICk7XHJcblxyXG5cdFx0XHRcdC8vIDUpIEluc2VydCB3cmFwcGVyIGludG8gRE9NIG5lYXIgdGhlIGlucHV0LlxyXG5cdFx0XHRcdC8vICAgIFByZWZlcnJlZDogcmVwbGFjZSB0aGUgb3JpZ2luYWwgbGFiZWxlZCByb3cgaWYgaXQgbWF0Y2hlcyB0eXBpY2FsIGluc3BlY3RvciBsYXlvdXQuXHJcblx0XHRcdFx0dmFyIHJlcGxhY2VkID0gVUkuV1BCQ19CRkJfVG9nZ2xlX05vcm1hbGl6ZXIudHJ5X3JlcGxhY2Vfa25vd25fcm93KCBpbnB1dCwgd3JhcHBlciwgbGFiZWxfdGV4dCApO1xyXG5cclxuXHRcdFx0XHRpZiAoICFyZXBsYWNlZCApIHtcclxuXHRcdFx0XHRcdGlmICggIWlucHV0LnBhcmVudE5vZGUgKSByZXR1cm47IC8vIE5FVyBndWFyZFxyXG5cdFx0XHRcdFx0Ly8gRmFsbGJhY2s6IGp1c3Qgd3JhcCB0aGUgaW5wdXQgaW4gcGxhY2UgYW5kIGFwcGVuZCBsYWJlbHMuXHJcblx0XHRcdFx0XHRpbnB1dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggd3JhcHBlciwgaW5wdXQgKTtcclxuXHRcdFx0XHRcdHdyYXBwZXIuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XHJcblx0XHRcdFx0XHR3cmFwcGVyLmFwcGVuZENoaWxkKCBpY29uX2xhYmVsICk7XHJcblx0XHRcdFx0XHR3cmFwcGVyLmFwcGVuZENoaWxkKCB0ZXh0X2xhYmVsICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyA2KSBBUklBIHN5bmMgb24gY2hhbmdlLlxyXG5cdFx0XHRcdGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCBpbnB1dC5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2VuZXJhdGUgYSB1bmlxdWUgaWQgd2l0aCBhIGdpdmVuIHByZWZpeC5cclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZW5lcmF0ZV91bmlxdWVfaWQocHJlZml4KSB7XHJcblx0XHRcdHZhciBiYXNlID0gU3RyaW5nKCBwcmVmaXggfHwgJ3dwYmNfaW5zX2F1dG9fJyApO1xyXG5cdFx0XHR2YXIgdWlkICA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoIDM2ICkuc2xpY2UoIDIsIDggKTtcclxuXHRcdFx0dmFyIGlkICAgPSBiYXNlICsgdWlkO1xyXG5cdFx0XHQvLyBNaW5pbWFsIGNvbGxpc2lvbiBndWFyZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudCBzY29wZS5cclxuXHRcdFx0d2hpbGUgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHtcclxuXHRcdFx0XHR1aWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCAzNiApLnNsaWNlKCAyLCA4ICk7XHJcblx0XHRcdFx0aWQgID0gYmFzZSArIHVpZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gaWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXNvbHZlIHRoZSBiZXN0IGh1bWFuIGxhYmVsIGZvciBhbiBpbnB1dC5cclxuXHRcdCAqIFByaW9yaXR5OlxyXG5cdFx0ICogIDEpIDxsYWJlbCBmb3I9XCJ7aWR9XCI+dGV4dDwvbGFiZWw+XHJcblx0XHQgKiAgMikgbmVhcmVzdCBzaWJsaW5nL3BhcmVudCAuaW5zcGVjdG9yX19sYWJlbCB0ZXh0XHJcblx0XHQgKiAgMykgaW5wdXQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgfHwgZGF0YS1sYWJlbCB8fCBkYXRhLWluc3BlY3Rvci1rZXkgfHwgbmFtZSB8fCAnT3B0aW9uJ1xyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdF9lbFxyXG5cdFx0ICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBpbnB1dFxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGlucHV0X2lkXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgcmVzb2x2ZV9sYWJlbF90ZXh0KHJvb3RfZWwsIGlucHV0LCBpbnB1dF9pZCkge1xyXG5cdFx0XHQvLyBmb3I9IGFzc29jaWF0aW9uXHJcblx0XHRcdGlmICggaW5wdXRfaWQgKSB7XHJcblx0XHRcdFx0dmFyIGFzc29jID0gcm9vdF9lbC5xdWVyeVNlbGVjdG9yKCAnbGFiZWxbZm9yPVwiJyArIFVJLldQQkNfQkZCX1RvZ2dsZV9Ob3JtYWxpemVyLmNzc19lc2NhcGUoIGlucHV0X2lkICkgKyAnXCJdJyApO1xyXG5cdFx0XHRcdGlmICggYXNzb2MgJiYgYXNzb2MudGV4dENvbnRlbnQgKSB7XHJcblx0XHRcdFx0XHR2YXIgdHh0ID0gYXNzb2MudGV4dENvbnRlbnQudHJpbSgpO1xyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBvbGQgbGFiZWwgZnJvbSBET007IGl0cyB0ZXh0IHdpbGwgYmUgdXNlZCBieSB0b2dnbGUuXHJcblx0XHRcdFx0XHRhc3NvYy5wYXJlbnROb2RlICYmIGFzc29jLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGFzc29jICk7XHJcblx0XHRcdFx0XHRpZiAoIHR4dCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHR4dDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIG5lYXJieSBpbnNwZWN0b3IgbGFiZWxcclxuXHRcdFx0dmFyIG5lYXJfbGFiZWwgPSBpbnB1dC5jbG9zZXN0KCAnLmluc3BlY3Rvcl9fcm93JyApO1xyXG5cdFx0XHRpZiAoIG5lYXJfbGFiZWwgKSB7XHJcblx0XHRcdFx0dmFyIGlsID0gbmVhcl9sYWJlbC5xdWVyeVNlbGVjdG9yKCAnLmluc3BlY3Rvcl9fbGFiZWwnICk7XHJcblx0XHRcdFx0aWYgKCBpbCAmJiBpbC50ZXh0Q29udGVudCApIHtcclxuXHRcdFx0XHRcdHZhciB0MiA9IGlsLnRleHRDb250ZW50LnRyaW0oKTtcclxuXHRcdFx0XHRcdC8vIElmIHRoaXMgcm93IGhhZCB0aGUgc3RhbmRhcmQgbGFiZWwrY29udHJvbCwgZHJvcCB0aGUgb2xkIHRleHQgbGFiZWwgdG8gYXZvaWQgZHVwbGljYXRlcy5cclxuXHRcdFx0XHRcdGlsLnBhcmVudE5vZGUgJiYgaWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggaWwgKTtcclxuXHRcdFx0XHRcdGlmICggdDIgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0MjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGZhbGxiYWNrc1xyXG5cdFx0XHR2YXIgYXJpYSA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2FyaWEtbGFiZWwnICk7XHJcblx0XHRcdGlmICggYXJpYSApIHtcclxuXHRcdFx0XHRyZXR1cm4gYXJpYTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGlucHV0LmRhdGFzZXQgJiYgaW5wdXQuZGF0YXNldC5sYWJlbCApIHtcclxuXHRcdFx0XHRyZXR1cm4gU3RyaW5nKCBpbnB1dC5kYXRhc2V0LmxhYmVsICk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpbnB1dC5kYXRhc2V0ICYmIGlucHV0LmRhdGFzZXQuaW5zcGVjdG9yS2V5ICkge1xyXG5cdFx0XHRcdHJldHVybiBTdHJpbmcoIGlucHV0LmRhdGFzZXQuaW5zcGVjdG9yS2V5ICk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpbnB1dC5uYW1lICkge1xyXG5cdFx0XHRcdHJldHVybiBTdHJpbmcoIGlucHV0Lm5hbWUgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gJ09wdGlvbic7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcnkgdG8gcmVwbGFjZSBhIGtub3duIGluc3BlY3RvciByb3cgcGF0dGVybiB3aXRoIGEgdG9nZ2xlIHdyYXBwZXIuXHJcblx0XHQgKiBQYXR0ZXJuczpcclxuXHRcdCAqICA8ZGl2Lmluc3BlY3Rvcl9fcm93PlxyXG5cdFx0ICogICAgPGxhYmVsLmluc3BlY3Rvcl9fbGFiZWw+VGV4dDwvbGFiZWw+XHJcblx0XHQgKiAgICA8ZGl2Lmluc3BlY3Rvcl9fY29udHJvbD4gW2lucHV0W3R5cGU9Y2hlY2tib3hdXSA8L2Rpdj5cclxuXHRcdCAqICA8L2Rpdj5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0XHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB3cmFwcGVyXHJcblx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmVwbGFjZWRcclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHRyeV9yZXBsYWNlX2tub3duX3JvdyhpbnB1dCwgd3JhcHBlciwgbGFiZWxfdGV4dCkge1xyXG5cdFx0XHR2YXIgcm93ICAgICAgID0gaW5wdXQuY2xvc2VzdCggJy5pbnNwZWN0b3JfX3JvdycgKTtcclxuXHRcdFx0dmFyIGN0cmxfd3JhcCA9IGlucHV0LnBhcmVudEVsZW1lbnQ7XHJcblxyXG5cdFx0XHRpZiAoIHJvdyAmJiBjdHJsX3dyYXAgJiYgY3RybF93cmFwLmNsYXNzTGlzdC5jb250YWlucyggJ2luc3BlY3Rvcl9fY29udHJvbCcgKSApIHtcclxuXHRcdFx0XHQvLyBDbGVhciBjb250cm9sIHdyYXAgYW5kIHJlaW5zZXJ0IHRvZ2dsZSBzdHJ1Y3R1cmUuXHJcblx0XHRcdFx0d2hpbGUgKCBjdHJsX3dyYXAuZmlyc3RDaGlsZCApIHtcclxuXHRcdFx0XHRcdGN0cmxfd3JhcC5yZW1vdmVDaGlsZCggY3RybF93cmFwLmZpcnN0Q2hpbGQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cm93LmNsYXNzTGlzdC5hZGQoICdpbnNwZWN0b3JfX3Jvdy0tdG9nZ2xlJyApO1xyXG5cclxuXHRcdFx0XHRjdHJsX3dyYXAuY2xhc3NMaXN0LmFkZCggJ3dwYmNfdWlfX3RvZ2dsZScgKTtcclxuXHRcdFx0XHRjdHJsX3dyYXAuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XHJcblxyXG5cdFx0XHRcdHZhciBpbnB1dF9pZCAgICAgICA9IGlucHV0LmdldEF0dHJpYnV0ZSggJ2lkJyApO1xyXG5cdFx0XHRcdHZhciBpY29uX2xibCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHRpY29uX2xibC5jbGFzc05hbWUgPSAnd3BiY191aV9fdG9nZ2xlX2ljb24nO1xyXG5cdFx0XHRcdGljb25fbGJsLnNldEF0dHJpYnV0ZSggJ2ZvcicsIGlucHV0X2lkICk7XHJcblxyXG5cdFx0XHRcdHZhciB0ZXh0X2xibCAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdsYWJlbCcgKTtcclxuXHRcdFx0XHR0ZXh0X2xibC5jbGFzc05hbWUgPSAnd3BiY191aV9fdG9nZ2xlX2xhYmVsJztcclxuXHRcdFx0XHR0ZXh0X2xibC5zZXRBdHRyaWJ1dGUoICdmb3InLCBpbnB1dF9pZCApO1xyXG5cdFx0XHRcdGlmICggbGFiZWxfdGV4dCApIHtcclxuXHRcdFx0XHRcdHRleHRfbGJsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggbGFiZWxfdGV4dCApICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIElmIHRoZSByb3cgcHJldmlvdXNseSBoYWQgYSAuaW5zcGVjdG9yX19sYWJlbCAod2UgcmVtb3ZlZCBpdCBpbiByZXNvbHZlX2xhYmVsX3RleHQpLFxyXG5cdFx0XHRcdC8vIHdlIGludGVudGlvbmFsbHkgZG8gTk9UIHJlY3JlYXRlIGl0OyB0aGUgdG9nZ2xlIHRleHQgbGFiZWwgYmVjb21lcyB0aGUgdmlzaWJsZSBvbmUuXHJcblx0XHRcdFx0Ly8gVGhlIHRleHQgY29udGVudCBpcyBhbHJlYWR5IHJlc29sdmVkIGluIHJlc29sdmVfbGFiZWxfdGV4dCgpIGFuZCBzZXQgYmVsb3cgYnkgY2FsbGVyLlxyXG5cclxuXHRcdFx0XHRjdHJsX3dyYXAuYXBwZW5kQ2hpbGQoIGljb25fbGJsICk7XHJcblx0XHRcdFx0Y3RybF93cmFwLmFwcGVuZENoaWxkKCB0ZXh0X2xibCApO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBOb3QgYSBrbm93biBwYXR0ZXJuOyBjYWxsZXIgd2lsbCB3cmFwIGluIHBsYWNlLlxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDU1MuZXNjYXBlIHBvbHlmaWxsIGZvciBzZWxlY3RvcnMuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc1xyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGNzc19lc2NhcGUocykge1xyXG5cdFx0XHRzID0gU3RyaW5nKCBzICk7XHJcblx0XHRcdGlmICggd2luZG93LkNTUyAmJiB0eXBlb2Ygd2luZG93LkNTUy5lc2NhcGUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHdpbmRvdy5DU1MuZXNjYXBlKCBzICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHMucmVwbGFjZSggLyhbXlxcdy1dKS9nLCAnXFxcXCQxJyApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGx5IGFsbCBVSSBub3JtYWxpemVycy9lbmhhbmNlcnMgdG8gYSBjb250YWluZXIgKHBvc3QtcmVuZGVyKS5cclxuXHQgKiBLZWVwIHRoaXMgZmlsZSBzbWFsbCBhbmQgYWRkIG1vcmUgbm9ybWFsaXplcnMgbGF0ZXIgaW4gb25lIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdFxyXG5cdCAqL1xyXG5cdFVJLmFwcGx5X3Bvc3RfcmVuZGVyID0gZnVuY3Rpb24gKHJvb3QpIHtcclxuXHRcdGlmICggIXJvb3QgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRyeSB7XHJcblx0XHRcdFVJLldQQkNfQkZCX1ZhbHVlU2xpZGVyPy5pbml0X29uPy4oIHJvb3QgKTtcclxuXHRcdH0gY2F0Y2ggKCBlICkgeyAvKiBub29wICovXHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHR2YXIgVCA9IFVJLldQQkNfQkZCX1RvZ2dsZV9Ob3JtYWxpemVyO1xyXG5cdFx0XHRpZiAoIFQgJiYgdHlwZW9mIFQudXBncmFkZV9jaGVja2JveGVzX2luID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFQudXBncmFkZV9jaGVja2JveGVzX2luKCByb290ICk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHR3Ll93cGJjPy5kZXY/LmVycm9yPy4oICdhcHBseV9wb3N0X3JlbmRlci50b2dnbGUnLCBlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWNjZXNzaWJpbGl0eToga2VlcCBhcmlhLWNoZWNrZWQgaW4gc3luYyBmb3IgYWxsIHRvZ2dsZXMgaW5zaWRlIHJvb3QuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoICcud3BiY191aV9fdG9nZ2xlIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScgKS5mb3JFYWNoKCBmdW5jdGlvbiAoY2IpIHtcclxuXHRcdFx0XHRpZiAoIGNiLl9fd3BiY19hcmlhX2hvb2tlZCApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y2IuX193cGJjX2FyaWFfaG9va2VkID0gdHJ1ZTtcclxuXHRcdFx0XHRjYi5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCBjYi5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJyApO1xyXG5cdFx0XHRcdC8vIERlbGVnYXRlIOKAmGNoYW5nZeKAmSBqdXN0IG9uY2UgcGVyIHJlbmRlciDigJMgbmF0aXZlIGRlbGVnYXRpb24gc3RpbGwgd29ya3MgZmluZSBmb3IgeW91ciBsb2dpYy5cclxuXHRcdFx0XHRjYi5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgKCkgPT4ge1xyXG5cdFx0XHRcdFx0Y2Iuc2V0QXR0cmlidXRlKCAnYXJpYS1jaGVja2VkJywgY2IuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZScgKTtcclxuXHRcdFx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0dy5fd3BiYz8uZGV2Py5lcnJvcj8uKCAnYXBwbHlfcG9zdF9yZW5kZXIuYXJpYScsIGUgKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRVSS5JbnNwZWN0b3JFbmhhbmNlcnMgPSBVSS5JbnNwZWN0b3JFbmhhbmNlcnMgfHwgKGZ1bmN0aW9uICgpIHtcclxuXHRcdHZhciByZWdzID0gW107XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgc2VsZWN0b3IsIGluaXQsIGRlc3Ryb3kpIHtcclxuXHRcdFx0cmVncy5wdXNoKCB7IG5hbWUsIHNlbGVjdG9yLCBpbml0LCBkZXN0cm95IH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBzY2FuKHJvb3QpIHtcclxuXHRcdFx0aWYgKCAhcm9vdCApIHJldHVybjtcclxuXHRcdFx0cmVncy5mb3JFYWNoKCBmdW5jdGlvbiAocikge1xyXG5cdFx0XHRcdHJvb3QucXVlcnlTZWxlY3RvckFsbCggci5zZWxlY3RvciApLmZvckVhY2goIGZ1bmN0aW9uIChub2RlKSB7XHJcblx0XHRcdFx0XHRub2RlLl9fd3BiY19laCA9IG5vZGUuX193cGJjX2VoIHx8IHt9O1xyXG5cdFx0XHRcdFx0aWYgKCBub2RlLl9fd3BiY19laFtyLm5hbWVdICkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0ci5pbml0ICYmIHIuaW5pdCggbm9kZSwgcm9vdCApO1xyXG5cdFx0XHRcdFx0XHRub2RlLl9fd3BiY19laFtyLm5hbWVdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBkZXN0cm95KHJvb3QpIHtcclxuXHRcdFx0aWYgKCAhcm9vdCApIHJldHVybjtcclxuXHRcdFx0cmVncy5mb3JFYWNoKCBmdW5jdGlvbiAocikge1xyXG5cdFx0XHRcdHJvb3QucXVlcnlTZWxlY3RvckFsbCggci5zZWxlY3RvciApLmZvckVhY2goIGZ1bmN0aW9uIChub2RlKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRyLmRlc3Ryb3kgJiYgci5kZXN0cm95KCBub2RlLCByb290ICk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggX2UgKSB7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIG5vZGUuX193cGJjX2VoICkgZGVsZXRlIG5vZGUuX193cGJjX2VoW3IubmFtZV07XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHsgcmVnaXN0ZXIsIHNjYW4sIGRlc3Ryb3kgfTtcclxuXHR9KSgpO1xyXG5cclxuXHRVSS5XUEJDX0JGQl9WYWx1ZVNsaWRlciA9IHtcclxuXHRcdGluaXRfb24ocm9vdCkge1xyXG5cdFx0XHR2YXIgZ3JvdXBzID0gKHJvb3Qubm9kZVR5cGUgPT09IDEgPyBbIHJvb3QgXSA6IFtdKS5jb25jYXQoIFtdLnNsaWNlLmNhbGwoIHJvb3QucXVlcnlTZWxlY3RvckFsbD8uKCAnW2RhdGEtbGVuLWdyb3VwXScgKSB8fCBbXSApICk7XHJcblx0XHRcdGdyb3Vwcy5mb3JFYWNoKCBmdW5jdGlvbiAoZykge1xyXG5cdFx0XHRcdGlmICggIWcubWF0Y2hlcyB8fCAhZy5tYXRjaGVzKCAnW2RhdGEtbGVuLWdyb3VwXScgKSApIHJldHVybjtcclxuXHRcdFx0XHRpZiAoIGcuX193cGJjX2xlbl93aXJlZCApIHJldHVybjtcclxuXHJcblx0XHRcdFx0dmFyIG51bWJlciA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi12YWx1ZV0nICk7XHJcblx0XHRcdFx0dmFyIHJhbmdlICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi1yYW5nZV0nICk7XHJcblx0XHRcdFx0dmFyIHVuaXQgICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi11bml0XScgKTtcclxuXHJcblx0XHRcdFx0aWYgKCAhbnVtYmVyIHx8ICFyYW5nZSApIHJldHVybjtcclxuXHJcblx0XHRcdFx0Ly8gTWlycm9yIGNvbnN0cmFpbnRzIGlmIG1pc3Npbmcgb24gdGhlIHJhbmdlLlxyXG5cdFx0XHRcdFsgJ21pbicsICdtYXgnLCAnc3RlcCcgXS5mb3JFYWNoKCBmdW5jdGlvbiAoYSkge1xyXG5cdFx0XHRcdFx0aWYgKCAhcmFuZ2UuaGFzQXR0cmlidXRlKCBhICkgJiYgbnVtYmVyLmhhc0F0dHJpYnV0ZSggYSApICkge1xyXG5cdFx0XHRcdFx0XHRyYW5nZS5zZXRBdHRyaWJ1dGUoIGEsIG51bWJlci5nZXRBdHRyaWJ1dGUoIGEgKSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uIHN5bmNfcmFuZ2VfZnJvbV9udW1iZXIoKSB7XG5cdFx0XHRcdFx0aWYgKCBnLmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLWFsbG93LWVtcHR5JyApICYmICcnID09PSBudW1iZXIudmFsdWUgKSB7XG5cdFx0XHRcdFx0XHR2YXIgZW1wdHlfcmFuZ2VfdmFsdWUgPSByYW5nZS5taW4gfHwgJzAnO1xuXHRcdFx0XHRcdFx0aWYgKCByYW5nZS52YWx1ZSAhPT0gZW1wdHlfcmFuZ2VfdmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRcdHJhbmdlLnZhbHVlID0gZW1wdHlfcmFuZ2VfdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggcmFuZ2UudmFsdWUgIT09IG51bWJlci52YWx1ZSApIHtcblx0XHRcdFx0XHRcdHJhbmdlLnZhbHVlID0gbnVtYmVyLnZhbHVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gZGlzcGF0Y2hfaW5wdXQoZWwpIHtcclxuXHRcdFx0XHRcdHRyeSB7IGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0gKSApOyB9IGNhdGNoICggX2UgKSB7fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmdW5jdGlvbiBkaXNwYXRjaF9jaGFuZ2UoZWwpIHtcclxuXHRcdFx0XHRcdHRyeSB7IGVsLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9ICkgKTsgfSBjYXRjaCAoIF9lICkge31cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFRocm90dGxlIHJhbmdlLT5udW1iZXIgc3luY2luZyAodGltZS1iYXNlZCkuXHJcblx0XHRcdFx0dmFyIHRpbWVyX2lkICAgICAgID0gMDtcclxuXHRcdFx0XHR2YXIgcGVuZGluZ192YWwgICAgPSBudWxsO1xyXG5cdFx0XHRcdHZhciBwZW5kaW5nX2NoYW5nZSA9IGZhbHNlO1xyXG5cdFx0XHRcdHZhciBsYXN0X2ZsdXNoX3RzICA9IDA7XHJcblxyXG5cdFx0XHRcdC8vIENoYW5nZSB0aGlzIHRvIHR1bmUgc3BlZWQ6IDUwLi4xMjAgbXMgaXMgYSBnb29kIHJhbmdlLlxyXG5cdFx0XHRcdHZhciBtaW5faW50ZXJ2YWxfbXMgPSBwYXJzZUludCggZy5kYXRhc2V0LmxlblRocm90dGxlIHx8IFVJLlZBTFVFX1NMSURFUl9USFJPVFRMRV9NUywgMTAgKTtcclxuXHRcdFx0XHRtaW5faW50ZXJ2YWxfbXMgPSBOdW1iZXIuaXNGaW5pdGUoIG1pbl9pbnRlcnZhbF9tcyApID8gTWF0aC5tYXgoIDAsIG1pbl9pbnRlcnZhbF9tcyApIDogMTIwO1xyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBmbHVzaF9yYW5nZV90b19udW1iZXIoKSB7XHJcblx0XHRcdFx0XHR0aW1lcl9pZCA9IDA7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nX3ZhbCA9PSBudWxsICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dmFyIG5leHQgICAgPSBTdHJpbmcoIHBlbmRpbmdfdmFsICk7XHJcblx0XHRcdFx0XHRwZW5kaW5nX3ZhbCA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBudW1iZXIudmFsdWUgIT09IG5leHQgKSB7XHJcblx0XHRcdFx0XHRcdG51bWJlci52YWx1ZSA9IG5leHQ7XHJcblx0XHRcdFx0XHRcdC8vIElNUE9SVEFOVDogb25seSAnaW5wdXQnIHdoaWxlIGRyYWdnaW5nLlxyXG5cdFx0XHRcdFx0XHRkaXNwYXRjaF9pbnB1dCggbnVtYmVyICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nX2NoYW5nZSApIHtcclxuXHRcdFx0XHRcdFx0cGVuZGluZ19jaGFuZ2UgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0ZGlzcGF0Y2hfY2hhbmdlKCBudW1iZXIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsYXN0X2ZsdXNoX3RzID0gRGF0ZS5ub3coKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uIHNjaGVkdWxlX3JhbmdlX3RvX251bWJlcih2YWwsIGVtaXRfY2hhbmdlKSB7XHJcblx0XHRcdFx0XHRwZW5kaW5nX3ZhbCA9IHZhbDtcclxuXHRcdFx0XHRcdGlmICggZW1pdF9jaGFuZ2UgKSB7XHJcblx0XHRcdFx0XHRcdHBlbmRpbmdfY2hhbmdlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJZiBjb21taXQgcmVxdWVzdGVkLCBmbHVzaCBpbW1lZGlhdGVseS5cclxuXHRcdFx0XHRcdGlmICggcGVuZGluZ19jaGFuZ2UgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggdGltZXJfaWQgKSB7XHJcblx0XHRcdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lcl9pZCApO1xyXG5cdFx0XHRcdFx0XHRcdHRpbWVyX2lkID0gMDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRmbHVzaF9yYW5nZV90b19udW1iZXIoKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciBub3cgICA9IERhdGUubm93KCk7XHJcblx0XHRcdFx0XHR2YXIgZGVsdGEgPSBub3cgLSBsYXN0X2ZsdXNoX3RzO1xyXG5cclxuXHRcdFx0XHRcdC8vIElmIGVub3VnaCB0aW1lIHBhc3NlZCwgZmx1c2ggaW1tZWRpYXRlbHk7IGVsc2Ugc2NoZWR1bGUuXHJcblx0XHRcdFx0XHRpZiAoIGRlbHRhID49IG1pbl9pbnRlcnZhbF9tcyApIHtcclxuXHRcdFx0XHRcdFx0Zmx1c2hfcmFuZ2VfdG9fbnVtYmVyKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHRpbWVyX2lkICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGltZXJfaWQgPSBzZXRUaW1lb3V0KCBmbHVzaF9yYW5nZV90b19udW1iZXIsIE1hdGgubWF4KCAwLCBtaW5faW50ZXJ2YWxfbXMgLSBkZWx0YSApICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBvbl9udW1iZXJfaW5wdXQoKSB7XHJcblx0XHRcdFx0XHRzeW5jX3JhbmdlX2Zyb21fbnVtYmVyKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBvbl9udW1iZXJfY2hhbmdlKCkge1xyXG5cdFx0XHRcdFx0c3luY19yYW5nZV9mcm9tX251bWJlcigpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gb25fcmFuZ2VfaW5wdXQoKSB7XHJcblx0XHRcdFx0XHRzY2hlZHVsZV9yYW5nZV90b19udW1iZXIoIHJhbmdlLnZhbHVlLCBmYWxzZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gb25fcmFuZ2VfY2hhbmdlKCkge1xyXG5cdFx0XHRcdFx0c2NoZWR1bGVfcmFuZ2VfdG9fbnVtYmVyKCByYW5nZS52YWx1ZSwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bnVtYmVyLmFkZEV2ZW50TGlzdGVuZXIoICdpbnB1dCcsICBvbl9udW1iZXJfaW5wdXQgKTtcclxuXHRcdFx0XHRudW1iZXIuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIG9uX251bWJlcl9jaGFuZ2UgKTtcclxuXHRcdFx0XHRyYW5nZS5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCAgb25fcmFuZ2VfaW5wdXQgKTtcclxuXHRcdFx0XHRyYW5nZS5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgb25fcmFuZ2VfY2hhbmdlICk7XHJcblxyXG5cdFx0XHRcdGlmICggdW5pdCApIHtcclxuXHRcdFx0XHRcdHVuaXQuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0Ly8gV2UganVzdCBudWRnZSB0aGUgbnVtYmVyIHNvIHVwc3RyZWFtIGhhbmRsZXJzIHJlLXJ1bi5cclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRudW1iZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBfZSApIHtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gSW5pdGlhbCBzeW5jXHJcblx0XHRcdFx0c3luY19yYW5nZV9mcm9tX251bWJlcigpO1xyXG5cclxuXHRcdFx0XHRnLl9fd3BiY19sZW5fd2lyZWQgPSB7XHJcblx0XHRcdFx0XHRkZXN0cm95KCkge1xyXG5cdFx0XHRcdFx0XHRudW1iZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgIG9uX251bWJlcl9pbnB1dCApO1xyXG5cdFx0XHRcdFx0XHRudW1iZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIG9uX251bWJlcl9jaGFuZ2UgKTtcclxuXHRcdFx0XHRcdFx0cmFuZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgIG9uX3JhbmdlX2lucHV0ICk7XHJcblx0XHRcdFx0XHRcdHJhbmdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBvbl9yYW5nZV9jaGFuZ2UgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9LFxyXG5cdFx0ZGVzdHJveV9vbihyb290KSB7XHJcblx0XHRcdHZhciBncm91cHMgPSAocm9vdCAmJiByb290Lm5vZGVUeXBlID09PSAxID8gWyByb290IF0gOiBbXSkuY29uY2F0KFxyXG5cdFx0XHRcdFtdLnNsaWNlLmNhbGwoIHJvb3QucXVlcnlTZWxlY3RvckFsbD8uKCAnW2RhdGEtbGVuLWdyb3VwXScgKSB8fCBbXSApXHJcblx0XHRcdCk7XHJcblx0XHRcdGdyb3Vwcy5mb3JFYWNoKCBmdW5jdGlvbiAoZykge1xyXG5cdFx0XHRcdGlmICggIWcubWF0Y2hlcyB8fCAhZy5tYXRjaGVzKCAnW2RhdGEtbGVuLWdyb3VwXScgKSApIHJldHVybjtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0Zy5fX3dwYmNfbGVuX3dpcmVkICYmIGcuX193cGJjX2xlbl93aXJlZC5kZXN0cm95ICYmIGcuX193cGJjX2xlbl93aXJlZC5kZXN0cm95KCk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRkZWxldGUgZy5fX3dwYmNfbGVuX3dpcmVkO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Ly8gUmVnaXN0ZXIgd2l0aCB0aGUgZ2xvYmFsIGVuaGFuY2VycyBodWIuXHJcblx0VUkuSW5zcGVjdG9yRW5oYW5jZXJzICYmIFVJLkluc3BlY3RvckVuaGFuY2Vycy5yZWdpc3RlcihcclxuXHRcdCd2YWx1ZS1zbGlkZXInLFxyXG5cdFx0J1tkYXRhLWxlbi1ncm91cF0nLFxyXG5cdFx0ZnVuY3Rpb24gKGVsLCBfcm9vdCkge1xyXG5cdFx0XHRVSS5XUEJDX0JGQl9WYWx1ZVNsaWRlci5pbml0X29uKCBlbCApO1xyXG5cdFx0fSxcclxuXHRcdGZ1bmN0aW9uIChlbCwgX3Jvb3QpIHtcclxuXHRcdFx0VUkuV1BCQ19CRkJfVmFsdWVTbGlkZXIuZGVzdHJveV9vbiggZWwgKTtcclxuXHRcdH1cclxuXHQpO1xyXG5cclxuXHQvLyBTaW5nbGUsIGxvYWQtb3JkZXItc2FmZSBwYXRjaCBzbyBlbmhhbmNlcnMgYXV0by1ydW4gb24gZXZlcnkgYmluZC5cclxuXHQoZnVuY3Rpb24gcGF0Y2hJbnNwZWN0b3JFbmhhbmNlcnMoKSB7XHJcblx0XHRmdW5jdGlvbiBhcHBseVBhdGNoKCkge1xyXG5cdFx0XHR2YXIgSW5zcGVjdG9yID0gdy5XUEJDX0JGQl9JbnNwZWN0b3I7XHJcblx0XHRcdGlmICggIUluc3BlY3RvciB8fCBJbnNwZWN0b3IuX193cGJjX2VuaGFuY2Vyc19wYXRjaGVkICkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRJbnNwZWN0b3IuX193cGJjX2VuaGFuY2Vyc19wYXRjaGVkID0gdHJ1ZTtcclxuXHRcdFx0dmFyIG9yaWcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEluc3BlY3Rvci5wcm90b3R5cGUuYmluZF90b19maWVsZDtcclxuXHRcdFx0SW5zcGVjdG9yLnByb3RvdHlwZS5iaW5kX3RvX2ZpZWxkICA9IGZ1bmN0aW9uIChlbCkge1xyXG5cdFx0XHRcdG9yaWcuY2FsbCggdGhpcywgZWwgKTtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0dmFyIGlucyA9IHRoaXMucGFuZWxcclxuXHRcdFx0XHRcdFx0fHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yJyApXHJcblx0XHRcdFx0XHRcdHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2luc3BlY3RvcicgKTtcclxuXHRcdFx0XHRcdFVJLkluc3BlY3RvckVuaGFuY2VycyAmJiBVSS5JbnNwZWN0b3JFbmhhbmNlcnMuc2NhbiggaW5zICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdFx0Ly8gSW5pdGlhbCBzY2FuIGlmIHRoZSBET00gaXMgYWxyZWFkeSBwcmVzZW50LlxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHZhciBpbnNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2luc3BlY3RvcicgKVxyXG5cdFx0XHRcdFx0fHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9faW5zcGVjdG9yJyApO1xyXG5cdFx0XHRcdFVJLkluc3BlY3RvckVuaGFuY2VycyAmJiBVSS5JbnNwZWN0b3JFbmhhbmNlcnMuc2NhbiggaW5zRWwgKTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRyeSBub3c7IGlmIEluc3BlY3RvciBpc27igJl0IGRlZmluZWQgeWV0LCBwYXRjaCB3aGVuIGl0IGJlY29tZXMgcmVhZHkuXHJcblx0XHRpZiAoICFhcHBseVBhdGNoKCkgKSB7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcblx0XHRcdFx0J3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScsXHJcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0YXBwbHlQYXRjaCgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0eyBvbmNlOiB0cnVlIH1cclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9KSgpO1xyXG5cclxufSggd2luZG93LCBkb2N1bWVudCApKTtcclxuIiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fX2pzL2NvcmUvYmZiLXN5bmMtY29kZS10b29scy10YWIuanMgICB8IDIwMjYtMDQtMDYgfCAxNjozOFxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuKGZ1bmN0aW9uICggdywgZCApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BhdGNoIHJlcXVlc3QgdG8gc2hvdyBhIHJpZ2h0IHNpZGViYXIgcGFuZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGFuZWxfaWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFiX2lkXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX19kaXNwYXRjaF9zaG93X3BhbmVsKCBwYW5lbF9pZCwgdGFiX2lkICkge1xyXG5cclxuXHRcdHZhciBldmVudF9kZXRhaWw7XHJcblxyXG5cdFx0aWYgKCAhIHBhbmVsX2lkIHx8ICEgdGFiX2lkICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0ZXZlbnRfZGV0YWlsID0ge1xyXG5cdFx0XHRwYW5lbF9pZDogcGFuZWxfaWQsXHJcblx0XHRcdHRhYl9pZCAgOiB0YWJfaWRcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2Ygdy53cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0dy53cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSggJ3dwYmNfYmZiOnNob3dfcGFuZWwnLCBldmVudF9kZXRhaWwgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGQuZGlzcGF0Y2hFdmVudChcclxuXHRcdFx0bmV3IEN1c3RvbUV2ZW50KFxyXG5cdFx0XHRcdCd3cGJjX2JmYjpzaG93X3BhbmVsJyxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRkZXRhaWw6IGV2ZW50X2RldGFpbFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN5bmMgcmlnaHQgc2lkZWJhciB3aXRoIHRvcCBtb2RlIHRhYnMuXHJcblx0ICpcclxuXHQgKiBVc2VzIHRvcCB0YWJzIG5hdiBhdHRyaWJ1dGUgYGRhdGEtYWN0aXZlLXRhYmAgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cclxuXHQgKiBUaGlzIGF2b2lkcyBmYWxzZSBkZXRlY3Rpb24gb24gaW5pdGlhbCBwYWdlIGxvYWQsIGJlY2F1c2UgdG9wIHBhbmVscyBhcmVcclxuXHQgKiBoaWRkZW4gYnkgaW5saW5lIHN0eWxlIGBkaXNwbGF5Om5vbmVgLCBub3QgYnkgdGhlIGBoaWRkZW5gIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjbGFzcyBXUEJDX0JGQl9Nb2RlX1JpZ2h0YmFyX1N5bmMge1xyXG5cclxuXHRcdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0XHR0aGlzLnRvcF90YWJzX25hdiAgICAgID0gbnVsbDtcclxuXHRcdFx0dGhpcy5hZHZhbmNlZF90YWJfd3JhcCA9IG51bGw7XHJcblx0XHRcdHRoaXMuYWR2YW5jZWRfcGFuZWwgICAgPSBudWxsO1xyXG5cdFx0XHR0aGlzLm11dGF0aW9uX29ic2VydmVyID0gbnVsbDtcclxuXHRcdFx0dGhpcy5sYXN0X21vZGUgICAgICAgICA9ICcnO1xyXG5cdFx0XHR0aGlzLnN5bmNfcmlnaHRiYXJfbW9kZSA9IHRoaXMuc3luY19yaWdodGJhcl9tb2RlLmJpbmQoIHRoaXMgKTtcclxuXHRcdFx0dGhpcy5oYW5kbGVfY2xpY2sgICAgICA9IHRoaXMuaGFuZGxlX2NsaWNrLmJpbmQoIHRoaXMgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluaXQgY29udHJvbGxlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRpbml0KCkge1xyXG5cdFx0XHR0aGlzLnRvcF90YWJzX25hdiAgICAgID0gZC5nZXRFbGVtZW50QnlJZCggJ3dwYmNfYmZiX190b3BfaG9yaXNvbnRhbF9uYXYnICk7XHJcblx0XHRcdHRoaXMuYWR2YW5jZWRfdGFiX3dyYXAgPSBkLnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX3JpZ2h0YmFyX3RhYl93cmFwLS1hZHZhbmNlZF90b29scycgKTtcclxuXHRcdFx0dGhpcy5hZHZhbmNlZF9wYW5lbCAgICA9IGQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9faW5zcGVjdG9yX2FkdmFuY2VkX3Rvb2xzJyApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHRoaXMuYWR2YW5jZWRfdGFiX3dyYXAgfHwgISB0aGlzLmFkdmFuY2VkX3BhbmVsICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gT2JzZXJ2ZSBhY3RpdmUgdGFiIGNoYW5nZXMgaW4gdGhlIHRvcCB0YWJzIG5hdi5cclxuXHRcdFx0aWYgKCB0aGlzLnRvcF90YWJzX25hdiApIHtcclxuXHRcdFx0XHR0aGlzLm11dGF0aW9uX29ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoIHRoaXMuc3luY19yaWdodGJhcl9tb2RlICk7XHJcblx0XHRcdFx0dGhpcy5tdXRhdGlvbl9vYnNlcnZlci5vYnNlcnZlKFxyXG5cdFx0XHRcdFx0dGhpcy50b3BfdGFic19uYXYsXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdGF0dHJpYnV0ZXMgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0YXR0cmlidXRlRmlsdGVyOiBbICdkYXRhLWFjdGl2ZS10YWInIF1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGYWxsYmFjayBmb3IgY2xpY2stZHJpdmVuIHN3aXRjaGluZy5cclxuXHRcdFx0ZC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCB0aGlzLmhhbmRsZV9jbGljaywgdHJ1ZSApO1xyXG5cclxuXHRcdFx0Ly8gSW5pdGlhbCBzeW5jLlxyXG5cdFx0XHR0aGlzLnN5bmNfcmlnaHRiYXJfbW9kZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGFjdGl2ZSB0b3AgdGFiIGlkLlxyXG5cdFx0ICpcclxuXHRcdCAqIFByaW9yaXR5OlxyXG5cdFx0ICogMS4gZGF0YS1hY3RpdmUtdGFiIGZyb20gdG9wIHRhYnMgbmF2XHJcblx0XHQgKiAyLiBhY3RpdmUgQ1NTIGNsYXNzIGluIG5hdlxyXG5cdFx0ICogMy4gdmlzaWJsZSB0b3AgcGFuZWwgZmFsbGJhY2tcclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdGdldF9hY3RpdmVfdG9wX3RhYl9pZCgpIHtcclxuXHRcdFx0dmFyIGFjdGl2ZV90YWJfaWQgPSAnJztcclxuXHRcdFx0dmFyIGFjdGl2ZV9saW5rICAgPSBudWxsO1xyXG5cdFx0XHR2YXIgYWR2YW5jZWRfcGFuZWwgPSBudWxsO1xyXG5cdFx0XHR2YXIgYnVpbGRlcl9wYW5lbCAgPSBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnRvcF90YWJzX25hdiApIHtcclxuXHRcdFx0XHRhY3RpdmVfdGFiX2lkID0gU3RyaW5nKCB0aGlzLnRvcF90YWJzX25hdi5nZXRBdHRyaWJ1dGUoICdkYXRhLWFjdGl2ZS10YWInICkgfHwgJycgKS50cmltKCk7XHJcblx0XHRcdFx0aWYgKCAnJyAhPT0gYWN0aXZlX3RhYl9pZCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBhY3RpdmVfdGFiX2lkO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YWN0aXZlX2xpbmsgPSB0aGlzLnRvcF90YWJzX25hdi5xdWVyeVNlbGVjdG9yKCAnLndwYmNfdWlfZWxfX2hvcmlzX25hdl9pdGVtLmFjdGl2ZSBbZGF0YS13cGJjLWJmYi10YWJdJyApO1xyXG5cdFx0XHRcdGlmICggYWN0aXZlX2xpbmsgKSB7XHJcblx0XHRcdFx0XHRhY3RpdmVfdGFiX2lkID0gU3RyaW5nKCBhY3RpdmVfbGluay5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLXRhYicgKSB8fCAnJyApLnRyaW0oKTtcclxuXHRcdFx0XHRcdGlmICggJycgIT09IGFjdGl2ZV90YWJfaWQgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhY3RpdmVfdGFiX2lkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRmluYWwgZmFsbGJhY2s6IGRldGVjdCB2aXNpYmxlIHBhbmVsLlxyXG5cdFx0XHRhZHZhbmNlZF9wYW5lbCA9IGQucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fdG9wX3RhYl9zZWN0aW9uX19hZHZhbmNlZF90YWInICk7XHJcblx0XHRcdGJ1aWxkZXJfcGFuZWwgID0gZC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX190b3BfdGFiX3NlY3Rpb25fX2J1aWxkZXJfdGFiJyApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmlzX2VsZW1lbnRfdmlzaWJsZSggYWR2YW5jZWRfcGFuZWwgKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gJ2FkdmFuY2VkX3RhYic7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCB0aGlzLmlzX2VsZW1lbnRfdmlzaWJsZSggYnVpbGRlcl9wYW5lbCApICkge1xyXG5cdFx0XHRcdHJldHVybiAnYnVpbGRlcl90YWInO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBlbGVtZW50IHZpc2liaWxpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBlbFxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdGlzX2VsZW1lbnRfdmlzaWJsZSggZWwgKSB7XHJcblx0XHRcdHZhciBzdHlsZTtcclxuXHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0eWxlID0gdy5nZXRDb21wdXRlZFN0eWxlKCBlbCApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHN0eWxlICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCAnbm9uZScgPT09IHN0eWxlLmRpc3BsYXkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICdoaWRkZW4nID09PSBzdHlsZS52aXNpYmlsaXR5ICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBpZiBBZHZhbmNlZCBNb2RlIGlzIGFjdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRpc19hZHZhbmNlZF9tb2RlX2FjdGl2ZSgpIHtcclxuXHRcdFx0cmV0dXJuICggJ2FkdmFuY2VkX3RhYicgPT09IHRoaXMuZ2V0X2FjdGl2ZV90b3BfdGFiX2lkKCkgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNob3cgQ29kZSBUb29scyB0YWIgYnV0dG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdHNob3dfYWR2YW5jZWRfdG9vbHNfdGFiKCkge1xyXG5cdFx0XHR0aGlzLmFkdmFuY2VkX3RhYl93cmFwLnJlbW92ZUF0dHJpYnV0ZSggJ2hpZGRlbicgKTtcclxuXHRcdFx0dGhpcy5hZHZhbmNlZF90YWJfd3JhcC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsICdmYWxzZScgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhpZGUgQ29kZSBUb29scyB0YWIgYnV0dG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge3ZvaWR9XHJcblx0XHQgKi9cclxuXHRcdGhpZGVfYWR2YW5jZWRfdG9vbHNfdGFiKCkge1xyXG5cdFx0XHR0aGlzLmFkdmFuY2VkX3RhYl93cmFwLnNldEF0dHJpYnV0ZSggJ2hpZGRlbicsICd0cnVlJyApO1xyXG5cdFx0XHR0aGlzLmFkdmFuY2VkX3RhYl93cmFwLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgJ3RydWUnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGVjayBpZiBDb2RlIFRvb2xzIHBhbmVsIGlzIGN1cnJlbnRseSBhY3RpdmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0aXNfYWR2YW5jZWRfdG9vbHNfcGFuZWxfYWN0aXZlKCkge1xyXG5cdFx0XHRyZXR1cm4gISEgKCB0aGlzLmFkdmFuY2VkX3BhbmVsICYmICEgdGhpcy5hZHZhbmNlZF9wYW5lbC5oYXNBdHRyaWJ1dGUoICdoaWRkZW4nICkgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9wZW4gQ29kZSBUb29scyBwYW5lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRvcGVuX2FkdmFuY2VkX3Rvb2xzX3BhbmVsKCkge1xyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfc2hvd19wYW5lbCggJ3dwYmNfYmZiX19pbnNwZWN0b3JfYWR2YW5jZWRfdG9vbHMnLCAnd3BiY190YWJfYWR2YW5jZWRfdG9vbHMnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPcGVuIGRlZmF1bHQgYnVpbGRlciByaWdodGJhciBwYW5lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRvcGVuX2RlZmF1bHRfdmlzdWFsX3BhbmVsKCkge1xyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfc2hvd19wYW5lbCggJ3dwYmNfYmZiX19wYWxldHRlX2FkZF9uZXcnLCAnd3BiY190YWJfbGlicmFyeScgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFN5bmMgcmlnaHRiYXIgbW9kZSB3aXRoIHRvcCB0YWJzIG1vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3luY19yaWdodGJhcl9tb2RlKCkge1xyXG5cdFx0XHR2YXIgaXNfYWR2YW5jZWRfbW9kZSA9IHRoaXMuaXNfYWR2YW5jZWRfbW9kZV9hY3RpdmUoKTtcclxuXHJcblx0XHRcdGlmICggaXNfYWR2YW5jZWRfbW9kZSApIHtcclxuXHRcdFx0XHR0aGlzLnNob3dfYWR2YW5jZWRfdG9vbHNfdGFiKCk7XHJcblxyXG5cdFx0XHRcdGlmICggJ2FkdmFuY2VkJyAhPT0gdGhpcy5sYXN0X21vZGUgKSB7XHJcblx0XHRcdFx0XHR0aGlzLm9wZW5fYWR2YW5jZWRfdG9vbHNfcGFuZWwoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRoaXMubGFzdF9tb2RlID0gJ2FkdmFuY2VkJztcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5pc19hZHZhbmNlZF90b29sc19wYW5lbF9hY3RpdmUoKSApIHtcclxuXHRcdFx0XHR0aGlzLm9wZW5fZGVmYXVsdF92aXN1YWxfcGFuZWwoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5oaWRlX2FkdmFuY2VkX3Rvb2xzX3RhYigpO1xyXG5cdFx0XHR0aGlzLmxhc3RfbW9kZSA9ICdidWlsZGVyJztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZhbGxiYWNrIGNsaWNrIGhhbmRsZXIgZm9yIHRvcCB0YWJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0aGFuZGxlX2NsaWNrKCBldmVudCApIHtcclxuXHRcdFx0dmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCAnW2RhdGEtd3BiYy1iZmItdGFiXScgKTtcclxuXHRcdFx0dmFyIHRoaXNfb2JqID0gdGhpcztcclxuXHJcblx0XHRcdGlmICggISB0YXJnZXQgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzZXRUaW1lb3V0KFxyXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHRoaXNfb2JqLnN5bmNfcmlnaHRiYXJfbW9kZSgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0MFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKCBkLnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyApIHtcclxuXHRcdGQuYWRkRXZlbnRMaXN0ZW5lcihcclxuXHRcdFx0J0RPTUNvbnRlbnRMb2FkZWQnLFxyXG5cdFx0XHRmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0KCBuZXcgV1BCQ19CRkJfTW9kZV9SaWdodGJhcl9TeW5jKCkgKS5pbml0KCk7XHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblx0fSBlbHNlIHtcclxuXHRcdCggbmV3IFdQQkNfQkZCX01vZGVfUmlnaHRiYXJfU3luYygpICkuaW5pdCgpO1xyXG5cdH1cclxuXHJcbn0pKCB3aW5kb3csIGRvY3VtZW50ICk7IiwiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9fb3V0L2NvcmUvYmZiLWluc3BlY3Rvci5qcyA9PSBUaW1lIHBvaW50OiAyMDI1LTA5LTA2IDE0OjA4XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4oZnVuY3Rpb24gKHcpIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8vIDEpIEFjdGlvbnMgcmVnaXN0cnkuXHJcblxyXG5cdC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgKGN0eDogSW5zcGVjdG9yQWN0aW9uQ29udGV4dCkgPT4gdm9pZD59ICovXHJcblx0Y29uc3QgX19JTlNQRUNUT1JfQUNUSU9OU19NQVBfXyA9IE9iamVjdC5jcmVhdGUoIG51bGwgKTtcclxuXHJcblx0Ly8gQnVpbHQtaW5zLlxyXG5cdF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bJ2Rlc2VsZWN0J10gPSAoeyBidWlsZGVyIH0pID0+IHtcclxuXHRcdGJ1aWxkZXI/LnNlbGVjdF9maWVsZD8uKCBudWxsICk7XHJcblx0fTtcclxuXHJcblx0X19JTlNQRUNUT1JfQUNUSU9OU19NQVBfX1snc2Nyb2xsdG8nXSA9ICh7IGJ1aWxkZXIsIGVsIH0pID0+IHtcclxuXHRcdGlmICggIWVsIHx8ICFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKCBlbCApICkgcmV0dXJuO1xyXG5cdFx0YnVpbGRlcj8uc2VsZWN0X2ZpZWxkPy4oIGVsLCB7IHNjcm9sbEludG9WaWV3OiB0cnVlIH0gKTtcclxuXHRcdGVsLmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9fc2Nyb2xsLXB1bHNlJyApO1xyXG5cdFx0c2V0VGltZW91dCggKCkgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19zY3JvbGwtcHVsc2UnICksIDcwMCApO1xyXG5cdH07XHJcblxyXG5cdF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bJ21vdmUtdXAnXSA9ICh7IGJ1aWxkZXIsIGVsIH0pID0+IHtcclxuXHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cdFx0YnVpbGRlcj8ubW92ZV9pdGVtPy4oIGVsLCAndXAnICk7XHJcblx0XHQvLyBTY3JvbGwgYWZ0ZXIgdGhlIERPTSBoYXMgc2V0dGxlZC5cclxuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fWydzY3JvbGx0byddKHsgYnVpbGRlciwgZWwgfSkpO1xyXG5cdH07XHJcblxyXG5cdF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bJ21vdmUtZG93biddID0gKHsgYnVpbGRlciwgZWwgfSkgPT4ge1xyXG5cdFx0aWYgKCAhZWwgKSByZXR1cm47XHJcblx0XHRidWlsZGVyPy5tb3ZlX2l0ZW0/LiggZWwsICdkb3duJyApO1xyXG5cdFx0Ly8gU2Nyb2xsIGFmdGVyIHRoZSBET00gaGFzIHNldHRsZWQuXHJcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gX19JTlNQRUNUT1JfQUNUSU9OU19NQVBfX1snc2Nyb2xsdG8nXSh7IGJ1aWxkZXIsIGVsIH0pKTtcclxuXHR9O1xyXG5cclxuXHRfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fWydkZWxldGUnXSA9ICh7IGJ1aWxkZXIsIGVsLCBjb25maXJtID0gdy5jb25maXJtIH0pID0+IHtcclxuXHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cdFx0Y29uc3QgaXNfZmllbGQgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICk7XHJcblx0XHRjb25zdCBsYWJlbCAgICA9IGlzX2ZpZWxkXHJcblx0XHRcdD8gKGVsLnF1ZXJ5U2VsZWN0b3IoICcud3BiY19iZmJfX2ZpZWxkLWxhYmVsJyApPy50ZXh0Q29udGVudCB8fCBlbC5kYXRhc2V0Py5pZCB8fCAnZmllbGQnKVxyXG5cdFx0XHQ6IChlbC5kYXRhc2V0Py5pZCB8fCAnc2VjdGlvbicpO1xyXG5cclxuXHRcdFVJLk1vZGFsX0NvbmZpcm1fRGVsZXRlLm9wZW4oIGxhYmVsLCAoKSA9PiB7XHJcblx0XHRcdC8vIENlbnRyYWwgY29tbWFuZCB3aWxsIHJlbW92ZSwgZW1pdCBldmVudHMsIGFuZCByZXNlbGVjdCBuZWlnaGJvciAod2hpY2ggcmUtYmluZHMgSW5zcGVjdG9yKS5cclxuXHRcdFx0YnVpbGRlcj8uZGVsZXRlX2l0ZW0/LiggZWwgKTtcclxuXHRcdH0gKTtcclxuXHJcblx0fTtcclxuXHJcblx0X19JTlNQRUNUT1JfQUNUSU9OU19NQVBfX1snZHVwbGljYXRlJ10gPSAoeyBidWlsZGVyLCBlbCB9KSA9PiB7XHJcblx0XHRpZiAoICFlbCApIHJldHVybjtcclxuXHRcdGNvbnN0IGNsb25lID0gYnVpbGRlcj8uZHVwbGljYXRlX2l0ZW0/LiggZWwgKTtcclxuXHRcdGlmICggY2xvbmUgKSBidWlsZGVyPy5zZWxlY3RfZmllbGQ/LiggY2xvbmUsIHsgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSApO1xyXG5cdH07XHJcblxyXG5cdC8vIFB1YmxpYyBBUEkuXHJcblx0dy5XUEJDX0JGQl9JbnNwZWN0b3JfQWN0aW9ucyA9IHtcclxuXHRcdHJ1bihuYW1lLCBjdHgpIHtcclxuXHRcdFx0Y29uc3QgZm4gPSBfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fW25hbWVdO1xyXG5cdFx0XHRpZiAoIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyApIGZuKCBjdHggKTtcclxuXHRcdFx0ZWxzZSBjb25zb2xlLndhcm4oICdXUEJDLiBJbnNwZWN0b3IgYWN0aW9uIG5vdCBmb3VuZDonLCBuYW1lICk7XHJcblx0XHR9LFxyXG5cdFx0cmVnaXN0ZXIobmFtZSwgaGFuZGxlcikge1xyXG5cdFx0XHRpZiAoICFuYW1lIHx8IHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ3JlZ2lzdGVyKG5hbWUsIGhhbmRsZXIpOiBpbnZhbGlkIGFyZ3VtZW50cycgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRfX0lOU1BFQ1RPUl9BQ1RJT05TX01BUF9fW25hbWVdID0gaGFuZGxlcjtcclxuXHRcdH0sXHJcblx0XHRoYXMobmFtZSkge1xyXG5cdFx0XHRyZXR1cm4gdHlwZW9mIF9fSU5TUEVDVE9SX0FDVElPTlNfTUFQX19bbmFtZV0gPT09ICdmdW5jdGlvbic7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Ly8gMikgSW5zcGVjdG9yIEZhY3RvcnkuXHJcblxyXG5cdHZhciBVSSA9ICh3LldQQkNfQkZCX0NvcmUuVUkgPSB3LldQQkNfQkZCX0NvcmUuVUkgfHwge30pO1xyXG5cclxuXHQvLyBHbG9iYWwgSHlicmlkKysgcmVnaXN0cmllcyAoa2VlcCBwdWJsaWMpLlxyXG5cdHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3Rvcnlfc2xvdHMgICAgICA9IHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3Rvcnlfc2xvdHMgfHwge307XHJcblx0dy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tIHx8IHt9O1xyXG5cclxuXHQvLyBEZWZpbmUgRmFjdG9yeSBvbmx5IGlmIG1pc3NpbmcgKG5vIGVhcmx5IHJldHVybiBmb3IgdGhlIHdob2xlIGJ1bmRsZSkuXHJcblx0Ly8gYWx3YXlzIGRlZmluZS9yZXBsYWNlIEZhY3RvcnlcclxuXHR7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVdGlsaXR5OiBjcmVhdGUgZWxlbWVudCB3aXRoIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0PX0gYXR0cnNcclxuXHRcdCAqIEBwYXJhbSB7KE5vZGV8c3RyaW5nfEFycmF5PE5vZGV8c3RyaW5nPik9fSBjaGlsZHJlblxyXG5cdFx0ICogQHJldHVybnMge0hUTUxFbGVtZW50fVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiBlbCh0YWcsIGF0dHJzLCBjaGlsZHJlbikge1xyXG5cdFx0XHR2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIHRhZyApO1xyXG5cdFx0XHRpZiAoIGF0dHJzICkge1xyXG5cdFx0XHRcdE9iamVjdC5rZXlzKCBhdHRycyApLmZvckVhY2goIGZ1bmN0aW9uIChrKSB7XHJcblx0XHRcdFx0XHR2YXIgdiA9IGF0dHJzW2tdO1xyXG5cdFx0XHRcdFx0aWYgKCB2ID09IG51bGwgKSByZXR1cm47XHJcblx0XHRcdFx0XHRpZiAoIGsgPT09ICdjbGFzcycgKSB7XHJcblx0XHRcdFx0XHRcdG5vZGUuY2xhc3NOYW1lID0gdjtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBrID09PSAnZGF0YXNldCcgKSB7XHJcblx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKCB2ICkuZm9yRWFjaCggZnVuY3Rpb24gKGRrKSB7XHJcblx0XHRcdFx0XHRcdFx0bm9kZS5kYXRhc2V0W2RrXSA9IFN0cmluZyggdltka10gKTtcclxuXHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoIGsgPT09ICdjaGVja2VkJyAmJiB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIHYgKSBub2RlLnNldEF0dHJpYnV0ZSggJ2NoZWNrZWQnLCAnY2hlY2tlZCcgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBrID09PSAnZGlzYWJsZWQnICYmIHR5cGVvZiB2ID09PSAnYm9vbGVhbicgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggdiApIG5vZGUuc2V0QXR0cmlidXRlKCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIG5vcm1hbGl6ZSBib29sZWFuIGF0dHJpYnV0ZXMgdG8gc3RyaW5ncy5cclxuXHRcdFx0XHRcdGlmICggdHlwZW9mIHYgPT09ICdib29sZWFuJyApIHtcclxuXHRcdFx0XHRcdFx0bm9kZS5zZXRBdHRyaWJ1dGUoIGssIHYgPyAndHJ1ZScgOiAnZmFsc2UnICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKCBrLCBTdHJpbmcoIHYgKSApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGNoaWxkcmVuICkge1xyXG5cdFx0XHRcdChBcnJheS5pc0FycmF5KCBjaGlsZHJlbiApID8gY2hpbGRyZW4gOiBbIGNoaWxkcmVuIF0pLmZvckVhY2goIGZ1bmN0aW9uIChjKSB7XHJcblx0XHRcdFx0XHRpZiAoIGMgPT0gbnVsbCApIHJldHVybjtcclxuXHRcdFx0XHRcdG5vZGUuYXBwZW5kQ2hpbGQoICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIGMgKSA6IGMgKTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCdWlsZCBhIHRvZ2dsZSBjb250cm9sIHJvdyAoY2hlY2tib3ggcmVuZGVyZWQgYXMgdG9nZ2xlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBTdHJ1Y3R1cmU6XHJcblx0XHQgKiA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yX19yb3cgaW5zcGVjdG9yX19yb3ctLXRvZ2dsZVwiPlxyXG5cdFx0ICogICA8ZGl2IGNsYXNzPVwiaW5zcGVjdG9yX19jb250cm9sIHdwYmNfdWlfX3RvZ2dsZVwiPlxyXG5cdFx0ICogICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIklEXCIgZGF0YS1pbnNwZWN0b3Ita2V5PVwiS0VZXCIgY2xhc3M9XCJpbnNwZWN0b3JfX2lucHV0XCIgY2hlY2tlZD5cclxuXHRcdCAqICAgICA8bGFiZWwgY2xhc3M9XCJ3cGJjX3VpX190b2dnbGVfaWNvblwiICBmb3I9XCJJRFwiPjwvbGFiZWw+XHJcblx0XHQgKiAgICAgPGxhYmVsIGNsYXNzPVwid3BiY191aV9fdG9nZ2xlX2xhYmVsXCIgZm9yPVwiSURcIj5MYWJlbCB0ZXh0PC9sYWJlbD5cclxuXHRcdCAqICAgPC9kaXY+XHJcblx0XHQgKiA8L2Rpdj5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRfaWRcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tlZFxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsX3RleHRcclxuXHRcdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gYnVpbGRfdG9nZ2xlX3JvdyggaW5wdXRfaWQsIGtleSwgY2hlY2tlZCwgbGFiZWxfdGV4dCApIHtcclxuXHJcblx0XHRcdHZhciByb3dfZWwgICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93IGluc3BlY3Rvcl9fcm93LS10b2dnbGUnIH0gKTtcclxuXHRcdFx0dmFyIGN0cmxfd3JhcCA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnaW5zcGVjdG9yX19jb250cm9sIHdwYmNfdWlfX3RvZ2dsZScgfSApO1xyXG5cclxuXHRcdFx0dmFyIGlucHV0X2VsID0gZWwoICdpbnB1dCcsIHtcclxuXHRcdFx0XHRpZCAgICAgICAgICAgICAgICAgIDogaW5wdXRfaWQsXHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgICAgICA6ICdjaGVja2JveCcsXHJcblx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHQnY2xhc3MnICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdGNoZWNrZWQgICAgICAgICAgICAgOiAhIWNoZWNrZWQsXHJcblx0XHRcdFx0cm9sZSAgICAgICAgICAgICAgICA6ICdzd2l0Y2gnLFxyXG5cdFx0XHRcdCdhcmlhLWNoZWNrZWQnICAgICAgOiAhIWNoZWNrZWRcclxuXHRcdFx0fSApO1xyXG5cdFx0XHR2YXIgaWNvbl9sYmwgPSBlbCggJ2xhYmVsJywgeyAnY2xhc3MnOiAnd3BiY191aV9fdG9nZ2xlX2ljb24nLCAnZm9yJzogaW5wdXRfaWQgfSApO1xyXG5cdFx0XHR2YXIgdGV4dF9sYmwgPSBlbCggJ2xhYmVsJywgeyAnY2xhc3MnOiAnd3BiY191aV9fdG9nZ2xlX2xhYmVsJywgJ2Zvcic6IGlucHV0X2lkIH0sIGxhYmVsX3RleHQgfHwgJycgKTtcclxuXHJcblx0XHRcdGN0cmxfd3JhcC5hcHBlbmRDaGlsZCggaW5wdXRfZWwgKTtcclxuXHRcdFx0Y3RybF93cmFwLmFwcGVuZENoaWxkKCBpY29uX2xibCApO1xyXG5cdFx0XHRjdHJsX3dyYXAuYXBwZW5kQ2hpbGQoIHRleHRfbGJsICk7XHJcblxyXG5cdFx0XHRyb3dfZWwuYXBwZW5kQ2hpbGQoIGN0cmxfd3JhcCApO1xyXG5cdFx0XHRyZXR1cm4gcm93X2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdCAqIFV0aWxpdHk6IGNob29zZSBpbml0aWFsIHZhbHVlIGZyb20gZGF0YSBvciBzY2hlbWEgZGVmYXVsdC5cclxuXHQgKi9cclxuXHRcdGZ1bmN0aW9uIGdldF9pbml0aWFsX3ZhbHVlKGtleSwgZGF0YSwgcHJvcHNfc2NoZW1hKSB7XHJcblx0XHRcdGlmICggZGF0YSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGRhdGEsIGtleSApICkgcmV0dXJuIGRhdGFba2V5XTtcclxuXHRcdFx0dmFyIG1ldGEgPSBwcm9wc19zY2hlbWEgJiYgcHJvcHNfc2NoZW1hW2tleV07XHJcblx0XHRcdHJldHVybiAobWV0YSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIG1ldGEsICdkZWZhdWx0JyApKSA/IG1ldGEuZGVmYXVsdCA6ICcnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdCAqIFV0aWxpdHk6IGNvZXJjZSB2YWx1ZSBieSBzY2hlbWEgdHlwZS5cclxuXHQgKi9cclxuXHJcblxyXG5cdFx0ZnVuY3Rpb24gY29lcmNlX2J5X3R5cGUodmFsdWUsIHR5cGUpIHtcclxuXHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHRcdFx0XHRjYXNlICdudW1iZXInOlxyXG5cdFx0XHRcdGNhc2UgJ2ludCc6XHJcblx0XHRcdFx0Y2FzZSAnZmxvYXQnOlxyXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dmFyIG4gPSBOdW1iZXIoIHZhbHVlICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXNOYU4oIG4gKSA/ICcnIDogbjtcclxuXHRcdFx0XHRjYXNlICdib29sZWFuJzpcclxuXHRcdFx0XHRcdHJldHVybiAhIXZhbHVlO1xyXG5cdFx0XHRcdGNhc2UgJ2FycmF5JzpcclxuXHRcdFx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KCB2YWx1ZSApID8gdmFsdWUgOiBbXTtcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0cmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICcnIDogU3RyaW5nKCB2YWx1ZSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0ICogTm9ybWFsaXplIDxzZWxlY3Q+IG9wdGlvbnMgKGFycmF5IG9mIHt2YWx1ZSxsYWJlbH0gb3IgbWFwIHt2YWx1ZTpsYWJlbH0pLlxyXG5cdCAqL1xyXG5cdFx0ZnVuY3Rpb24gbm9ybWFsaXplX3NlbGVjdF9vcHRpb25zKG9wdGlvbnMpIHtcclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvcHRpb25zICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG9wdGlvbnMubWFwKCBmdW5jdGlvbiAobykge1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgbyAmJiAndmFsdWUnIGluIG8gKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7IHZhbHVlOiBTdHJpbmcoIG8udmFsdWUgKSwgbGFiZWw6IFN0cmluZyggby5sYWJlbCB8fCBvLnZhbHVlICkgfTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiB7IHZhbHVlOiBTdHJpbmcoIG8gKSwgbGFiZWw6IFN0cmluZyggbyApIH07XHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKCBvcHRpb25zICkubWFwKCBmdW5jdGlvbiAoaykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgdmFsdWU6IFN0cmluZyggayApLCBsYWJlbDogU3RyaW5nKCBvcHRpb25zW2tdICkgfTtcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKiBQYXJzZSBhIENTUyBsZW5ndGggbGlrZSBcIjEyMHB4XCIgb3IgXCI4MCVcIiBpbnRvIHsgdmFsdWU6bnVtYmVyLCB1bml0OnN0cmluZyB9LiAqL1xyXG5cdFx0ZnVuY3Rpb24gcGFyc2VfbGVuKHZhbHVlLCBmYWxsYmFja191bml0KSB7XHJcblx0XHRcdHZhbHVlID0gKHZhbHVlID09IG51bGwpID8gJycgOiBTdHJpbmcoIHZhbHVlICkudHJpbSgpO1xyXG5cdFx0XHR2YXIgbSA9IHZhbHVlLm1hdGNoKCAvXigtP1xcZCsoPzpcXC5cXGQrKT8pKHB4fCV8cmVtfGVtKSQvaSApO1xyXG5cdFx0XHRpZiAoIG0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIHsgdmFsdWU6IHBhcnNlRmxvYXQoIG1bMV0gKSwgdW5pdDogbVsyXS50b0xvd2VyQ2FzZSgpIH07XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gcGxhaW4gbnVtYmVyIC0+IGFzc3VtZSBmYWxsYmFjayB1bml0XHJcblx0XHRcdGlmICggdmFsdWUgIT09ICcnICYmICFpc05hTiggTnVtYmVyKCB2YWx1ZSApICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHsgdmFsdWU6IE51bWJlciggdmFsdWUgKSwgdW5pdDogKGZhbGxiYWNrX3VuaXQgfHwgJ3B4JykgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4geyB2YWx1ZTogMCwgdW5pdDogKGZhbGxiYWNrX3VuaXQgfHwgJ3B4JykgfTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiogQ2xhbXAgaGVscGVyLiAqL1xyXG5cdFx0ZnVuY3Rpb24gY2xhbXBfbnVtKHYsIG1pbiwgbWF4KSB7XHJcblx0XHRcdGlmICggdHlwZW9mIHYgIT09ICdudW1iZXInIHx8IGlzTmFOKCB2ICkgKSByZXR1cm4gKG1pbiAhPSBudWxsID8gbWluIDogMCk7XHJcblx0XHRcdGlmICggbWluICE9IG51bGwgJiYgdiA8IG1pbiApIHYgPSBtaW47XHJcblx0XHRcdGlmICggbWF4ICE9IG51bGwgJiYgdiA+IG1heCApIHYgPSBtYXg7XHJcblx0XHRcdHJldHVybiB2O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluaXRpYWxpemUgQ29sb3JpcyBwaWNrZXJzIGluIGEgZ2l2ZW4gcm9vdC5cclxuXHRcdC8vIFJlbGllcyBvbiBDb2xvcmlzIGJlaW5nIGVucXVldWVkIChzZWUgYmZiLWJvb3RzdHJhcC5waHApLlxyXG5cdFx0ZnVuY3Rpb24gaW5pdF9jb2xvcmlzX3BpY2tlcnMocm9vdCkge1xyXG5cdFx0XHRpZiAoICFyb290IHx8ICF3LkNvbG9yaXMgKSByZXR1cm47XHJcblx0XHRcdC8vIE1hcmsgaW5wdXRzIHdlIHdhbnQgQ29sb3JpcyB0byBoYW5kbGUuXHJcblx0XHRcdHZhciBpbnB1dHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoICdpbnB1dFtkYXRhLWluc3BlY3Rvci10eXBlPVwiY29sb3JcIl0nICk7XHJcblx0XHRcdGlmICggIWlucHV0cy5sZW5ndGggKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyBBZGQgYSBzdGFibGUgY2xhc3MgZm9yIENvbG9yaXMgdGFyZ2V0aW5nOyBhdm9pZCBkb3VibGUtaW5pdGlhbGl6aW5nLlxyXG5cdFx0XHRpbnB1dHMuZm9yRWFjaCggZnVuY3Rpb24gKGlucHV0KSB7XHJcblx0XHRcdFx0aWYgKCBpbnB1dC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9jb2xvcmlzJyApICkgcmV0dXJuO1xyXG5cdFx0XHRcdGlucHV0LmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9jb2xvcmlzJyApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBDcmVhdGUvcmVmcmVzaCBhIENvbG9yaXMgaW5zdGFuY2UgYm91bmQgdG8gdGhlc2UgaW5wdXRzLlxyXG5cdFx0XHQvLyBLZWVwIEhFWCBvdXRwdXQgdG8gbWF0Y2ggc2NoZW1hIGRlZmF1bHRzIChlLmcuLCBcIiNlMGUwZTBcIikuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dy5Db2xvcmlzKCB7XHJcblx0XHRcdFx0XHRlbCAgICAgICA6ICcud3BiY19iZmJfY29sb3JpcycsXHJcblx0XHRcdFx0XHRhbHBoYSAgICA6IGZhbHNlLFxyXG5cdFx0XHRcdFx0Zm9ybWF0ICAgOiAnaGV4JyxcclxuXHRcdFx0XHRcdHRoZW1lTW9kZTogJ2F1dG8nXHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdC8vIENvbG9yaXMgYWxyZWFkeSBkaXNwYXRjaGVzICdpbnB1dCcgZXZlbnRzIG9uIHZhbHVlIGNoYW5nZXMuXHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdC8vIE5vbi1mYXRhbDogaWYgQ29sb3JpcyB0aHJvd3MgKHJhcmUpLCB0aGUgdGV4dCBpbnB1dCBzdGlsbCB3b3Jrcy5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdXUEJDIEluc3BlY3RvcjogQ29sb3JpcyBpbml0IGZhaWxlZDonLCBlICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkOiBzbGlkZXIgKyBudW1iZXIgaW4gb25lIHJvdyAod3JpdGVzIHRvIGEgc2luZ2xlIGRhdGEga2V5KS5cclxuXHRcdCAqIENvbnRyb2wgbWV0YTogeyB0eXBlOidyYW5nZV9udW1iZXInLCBrZXksIGxhYmVsLCBtaW4sIG1heCwgc3RlcCB9XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIGJ1aWxkX3JhbmdlX251bWJlcl9yb3coaW5wdXRfaWQsIGtleSwgbGFiZWxfdGV4dCwgdmFsdWUsIG1ldGEpIHtcclxuXHRcdFx0dmFyIHJvd19lbCAgID0gZWwoJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93JyB9KTtcclxuXHRcdFx0dmFyIGxhYmVsX2VsID0gZWwoJ2xhYmVsJywgeyAnZm9yJzogaW5wdXRfaWQsICdjbGFzcyc6ICdpbnNwZWN0b3JfX2xhYmVsJyB9LCBsYWJlbF90ZXh0IHx8IGtleSB8fCAnJyk7XHJcblx0XHRcdHZhciBjdHJsICAgICA9IGVsKCdkaXYnLCB7ICdjbGFzcyc6ICdpbnNwZWN0b3JfX2NvbnRyb2wnIH0pO1xyXG5cclxuXHRcdFx0dmFyIG1pbiAgPSAobWV0YSAmJiBtZXRhLm1pbiAhPSBudWxsKSAgPyBtZXRhLm1pbiAgOiAwO1xyXG5cdFx0XHR2YXIgbWF4ICA9IChtZXRhICYmIG1ldGEubWF4ICE9IG51bGwpICA/IG1ldGEubWF4ICA6IDEwMDtcclxuXHRcdFx0dmFyIHN0ZXAgPSAobWV0YSAmJiBtZXRhLnN0ZXAgIT0gbnVsbCkgPyBtZXRhLnN0ZXAgOiAxO1xyXG5cclxuXHRcdFx0dmFyIGdyb3VwID0gZWwoJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfbGVuX2dyb3VwIHdwYmNfaW5saW5lX2lucHV0cycsICdkYXRhLWxlbi1ncm91cCc6IGtleSB9KTtcclxuXHJcblx0XHRcdHZhciByYW5nZSA9IGVsKCdpbnB1dCcsIHtcclxuXHRcdFx0XHR0eXBlIDogJ3JhbmdlJyxcclxuXHRcdFx0XHQnY2xhc3MnOiAnaW5zcGVjdG9yX19pbnB1dCcsXHJcblx0XHRcdFx0J2RhdGEtbGVuLXJhbmdlJzogJycsXHJcblx0XHRcdFx0bWluICA6IFN0cmluZyhtaW4pLFxyXG5cdFx0XHRcdG1heCAgOiBTdHJpbmcobWF4KSxcclxuXHRcdFx0XHRzdGVwIDogU3RyaW5nKHN0ZXApLFxyXG5cdFx0XHRcdHZhbHVlOiBTdHJpbmcodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgPyBtaW4gOiB2YWx1ZSlcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR2YXIgbnVtID0gZWwoJ2lucHV0Jywge1xyXG5cdFx0XHRcdGlkICAgOiBpbnB1dF9pZCxcclxuXHRcdFx0XHR0eXBlIDogJ251bWJlcicsXHJcblx0XHRcdFx0J2NsYXNzJzogJ2luc3BlY3Rvcl9faW5wdXQgaW5zcGVjdG9yX193XzMwJyxcclxuXHRcdFx0XHQnZGF0YS1sZW4tdmFsdWUnOiAnJyxcclxuXHRcdFx0XHQnZGF0YS1pbnNwZWN0b3Ita2V5Jzoga2V5LFxyXG5cdFx0XHRcdG1pbiAgOiBTdHJpbmcobWluKSxcclxuXHRcdFx0XHRtYXggIDogU3RyaW5nKG1heCksXHJcblx0XHRcdFx0c3RlcCA6IFN0cmluZyhzdGVwKSxcclxuXHRcdFx0XHR2YWx1ZTogKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSA/IFN0cmluZyhtaW4pIDogU3RyaW5nKHZhbHVlKVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGdyb3VwLmFwcGVuZENoaWxkKHJhbmdlKTtcclxuXHRcdFx0Z3JvdXAuYXBwZW5kQ2hpbGQobnVtKTtcclxuXHRcdFx0Y3RybC5hcHBlbmRDaGlsZChncm91cCk7XHJcblx0XHRcdHJvd19lbC5hcHBlbmRDaGlsZChsYWJlbF9lbCk7XHJcblx0XHRcdHJvd19lbC5hcHBlbmRDaGlsZChjdHJsKTtcclxuXHRcdFx0cmV0dXJuIHJvd19lbDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkOiAobnVtYmVyICsgdW5pdCkgKyBzbGlkZXIsIHdyaXRpbmcgYSAqc2luZ2xlKiBjb21iaW5lZCBzdHJpbmcgdG8gYGtleWAuXHJcblx0XHQgKiBDb250cm9sIG1ldGE6XHJcblx0XHQgKiB7XHJcblx0XHQgKiAgIHR5cGU6J2xlbicsIGtleSwgbGFiZWwsIHVuaXRzOlsncHgnLCclJywncmVtJywnZW0nXSxcclxuXHRcdCAqICAgc2xpZGVyOiB7IHB4OnttaW46MCxtYXg6NTEyLHN0ZXA6MX0sICclJzp7bWluOjAsbWF4OjEwMCxzdGVwOjF9LCByZW06e21pbjowLG1heDoxMCxzdGVwOjAuMX0sIGVtOnsuLi59IH0sXHJcblx0XHQgKiAgIGZhbGxiYWNrX3VuaXQ6J3B4J1xyXG5cdFx0ICogfVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiBidWlsZF9sZW5fY29tcG91bmRfcm93KGNvbnRyb2wsIHByb3BzX3NjaGVtYSwgZGF0YSwgdWlkKSB7XHJcblx0XHRcdHZhciBrZXkgICAgICAgID0gY29udHJvbC5rZXk7XHJcblx0XHRcdHZhciBsYWJlbF90ZXh0ID0gY29udHJvbC5sYWJlbCB8fCBrZXkgfHwgJyc7XHJcblx0XHRcdHZhciBkZWZfc3RyICAgID0gZ2V0X2luaXRpYWxfdmFsdWUoIGtleSwgZGF0YSwgcHJvcHNfc2NoZW1hICk7XHJcblx0XHRcdHZhciBmYWxsYmFja191ID0gY29udHJvbC5mYWxsYmFja191bml0IHx8ICdweCc7XHJcblx0XHRcdHZhciBwYXJzZWQgICAgID0gcGFyc2VfbGVuKCBkZWZfc3RyLCBmYWxsYmFja191ICk7XHJcblxyXG5cdFx0XHR2YXIgcm93ICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93JyB9ICk7XHJcblx0XHRcdHZhciBsYWJlbCA9IGVsKCAnbGFiZWwnLCB7ICdjbGFzcyc6ICdpbnNwZWN0b3JfX2xhYmVsJyB9LCBsYWJlbF90ZXh0ICk7XHJcblx0XHRcdHZhciBjdHJsICA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnaW5zcGVjdG9yX19jb250cm9sJyB9ICk7XHJcblxyXG5cdFx0XHR2YXIgdW5pdHMgICAgICA9IEFycmF5LmlzQXJyYXkoIGNvbnRyb2wudW5pdHMgKSAmJiBjb250cm9sLnVuaXRzLmxlbmd0aCA/IGNvbnRyb2wudW5pdHMgOiBbICdweCcsICclJywgJ3JlbScsICdlbScgXTtcclxuXHRcdFx0dmFyIHNsaWRlcl9tYXAgPSBjb250cm9sLnNsaWRlciB8fCB7XHJcblx0XHRcdFx0J3B4JyA6IHsgbWluOiAwLCBtYXg6IDUxMiwgc3RlcDogMSB9LFxyXG5cdFx0XHRcdCclJyAgOiB7IG1pbjogMCwgbWF4OiAxMDAsIHN0ZXA6IDEgfSxcclxuXHRcdFx0XHQncmVtJzogeyBtaW46IDAsIG1heDogMTAsIHN0ZXA6IDAuMSB9LFxyXG5cdFx0XHRcdCdlbScgOiB7IG1pbjogMCwgbWF4OiAxMCwgc3RlcDogMC4xIH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8vIEhvc3Qgd2l0aCBhIGhpZGRlbiBpbnB1dCB0aGF0IGNhcnJpZXMgZGF0YS1pbnNwZWN0b3Ita2V5IHRvIHJldXNlIHRoZSBzdGFuZGFyZCBoYW5kbGVyLlxyXG5cdFx0XHR2YXIgZ3JvdXAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfbGVuX2dyb3VwJywgJ2RhdGEtbGVuLWdyb3VwJzoga2V5IH0gKTtcclxuXHJcblx0XHRcdHZhciBpbmxpbmUgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfaW5saW5lX2lucHV0cycgfSApO1xyXG5cclxuXHRcdFx0dmFyIG51bSA9IGVsKCAnaW5wdXQnLCB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgIDogJ251bWJlcicsXHJcblx0XHRcdFx0J2NsYXNzJyAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdCdkYXRhLWxlbi12YWx1ZSc6ICcnLFxyXG5cdFx0XHRcdG1pbiAgICAgICAgICAgICA6ICcwJyxcclxuXHRcdFx0XHRzdGVwICAgICAgICAgICAgOiAnYW55JyxcclxuXHRcdFx0XHR2YWx1ZSAgICAgICAgICAgOiBTdHJpbmcoIHBhcnNlZC52YWx1ZSApXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHZhciBzZWwgPSBlbCggJ3NlbGVjdCcsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9faW5wdXQnLCAnZGF0YS1sZW4tdW5pdCc6ICcnIH0gKTtcclxuXHRcdFx0dW5pdHMuZm9yRWFjaCggZnVuY3Rpb24gKHUpIHtcclxuXHRcdFx0XHR2YXIgb3B0ID0gZWwoICdvcHRpb24nLCB7IHZhbHVlOiB1IH0sIHUgKTtcclxuXHRcdFx0XHRpZiAoIHUgPT09IHBhcnNlZC51bml0ICkgb3B0LnNldEF0dHJpYnV0ZSggJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyApO1xyXG5cdFx0XHRcdHNlbC5hcHBlbmRDaGlsZCggb3B0ICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGlubGluZS5hcHBlbmRDaGlsZCggbnVtICk7XHJcblx0XHRcdGlubGluZS5hcHBlbmRDaGlsZCggc2VsICk7XHJcblxyXG5cdFx0XHQvLyBTbGlkZXIgKHVuaXQtYXdhcmUpXHJcblx0XHRcdHZhciBjdXJyZW50ID0gc2xpZGVyX21hcFtwYXJzZWQudW5pdF0gfHwgc2xpZGVyX21hcFt1bml0c1swXV07XHJcblx0XHRcdHZhciByYW5nZSAgID0gZWwoICdpbnB1dCcsIHtcclxuXHRcdFx0XHR0eXBlICAgICAgICAgICAgOiAncmFuZ2UnLFxyXG5cdFx0XHRcdCdjbGFzcycgICAgICAgICA6ICdpbnNwZWN0b3JfX2lucHV0JyxcclxuXHRcdFx0XHQnZGF0YS1sZW4tcmFuZ2UnOiAnJyxcclxuXHRcdFx0XHRtaW4gICAgICAgICAgICAgOiBTdHJpbmcoIGN1cnJlbnQubWluICksXHJcblx0XHRcdFx0bWF4ICAgICAgICAgICAgIDogU3RyaW5nKCBjdXJyZW50Lm1heCApLFxyXG5cdFx0XHRcdHN0ZXAgICAgICAgICAgICA6IFN0cmluZyggY3VycmVudC5zdGVwICksXHJcblx0XHRcdFx0dmFsdWUgICAgICAgICAgIDogU3RyaW5nKCBjbGFtcF9udW0oIHBhcnNlZC52YWx1ZSwgY3VycmVudC5taW4sIGN1cnJlbnQubWF4ICkgKVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBIaWRkZW4gd3JpdGVyIGlucHV0IHRoYXQgdGhlIGRlZmF1bHQgSW5zcGVjdG9yIGhhbmRsZXIgd2lsbCBjYXRjaC5cclxuXHRcdFx0dmFyIGhpZGRlbiA9IGVsKCAnaW5wdXQnLCB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgICAgICA6ICd0ZXh0JyxcclxuXHRcdFx0XHQnY2xhc3MnICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdHN0eWxlICAgICAgICAgICAgICAgOiAnZGlzcGxheTpub25lJyxcclxuXHRcdFx0XHQnYXJpYS1oaWRkZW4nICAgICAgIDogJ3RydWUnLFxyXG5cdFx0XHRcdHRhYmluZGV4ICAgICAgICAgICAgOiAnLTEnLFxyXG5cdFx0XHRcdGlkICAgICAgICAgICAgICAgICAgOiAnd3BiY19pbnNfJyArIGtleSArICdfJyArIHVpZCArICdfbGVuX2hpZGRlbicsXHJcblx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHR2YWx1ZSAgICAgICAgICAgICAgIDogKFN0cmluZyggcGFyc2VkLnZhbHVlICkgKyBwYXJzZWQudW5pdClcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Z3JvdXAuYXBwZW5kQ2hpbGQoIGlubGluZSApO1xyXG5cdFx0XHRncm91cC5hcHBlbmRDaGlsZCggcmFuZ2UgKTtcclxuXHRcdFx0Z3JvdXAuYXBwZW5kQ2hpbGQoIGhpZGRlbiApO1xyXG5cclxuXHRcdFx0Y3RybC5hcHBlbmRDaGlsZCggZ3JvdXAgKTtcclxuXHRcdFx0cm93LmFwcGVuZENoaWxkKCBsYWJlbCApO1xyXG5cdFx0XHRyb3cuYXBwZW5kQ2hpbGQoIGN0cmwgKTtcclxuXHRcdFx0cmV0dXJuIHJvdztcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdpcmUgc3luY2luZyBmb3IgYW55IC53cGJjX2xlbl9ncm91cCBpbnNpZGUgYSBnaXZlbiByb290IChwYW5lbCkuXHJcblx0XHQgKiAtIHJhbmdlIOKHhCBudW1iZXIgc3luY1xyXG5cdFx0ICogLSB1bml0IHN3aXRjaGVzIHVwZGF0ZSBzbGlkZXIgYm91bmRzXHJcblx0XHQgKiAtIGhpZGRlbiB3cml0ZXIgKGlmIHByZXNlbnQpIGdldHMgdXBkYXRlZCBhbmQgZW1pdHMgJ2lucHV0J1xyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3aXJlX2xlbl9ncm91cChyb290KSB7XHJcblx0XHRcdGlmICggIXJvb3QgKSByZXR1cm47XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBmaW5kX2dyb3VwKGVsKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsICYmIGVsLmNsb3Nlc3QgJiYgZWwuY2xvc2VzdCggJy53cGJjX2xlbl9ncm91cCcgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdHZhciB0ID0gZS50YXJnZXQ7XHJcblx0XHRcdFx0Ly8gU2xpZGVyIG1vdmVkIC0+IHVwZGF0ZSBudW1iZXIgKGFuZCB3cml0ZXIvaGlkZGVuKVxyXG5cdFx0XHRcdGlmICggdCAmJiB0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLXJhbmdlJyApICkge1xyXG5cdFx0XHRcdFx0dmFyIGcgPSBmaW5kX2dyb3VwKCB0ICk7XHJcblx0XHRcdFx0XHRpZiAoICFnICkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0dmFyIG51bSA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi12YWx1ZV0nICk7XHJcblx0XHRcdFx0XHRpZiAoIG51bSApIHtcclxuXHRcdFx0XHRcdFx0bnVtLnZhbHVlID0gdC52YWx1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciB3cml0ZXIgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pbnNwZWN0b3Ita2V5XScgKTtcclxuXHRcdFx0XHRcdGlmICggd3JpdGVyICYmIHdyaXRlci50eXBlID09PSAndGV4dCcgKSB7XHJcblx0XHRcdFx0XHRcdHZhciB1bml0ICAgICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi11bml0XScgKTtcclxuXHRcdFx0XHRcdFx0dW5pdCAgICAgICAgID0gdW5pdCA/IHVuaXQudmFsdWUgOiAncHgnO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIudmFsdWUgPSBTdHJpbmcoIHQudmFsdWUgKSArIFN0cmluZyggdW5pdCApO1xyXG5cdFx0XHRcdFx0XHQvLyB0cmlnZ2VyIHN0YW5kYXJkIGluc3BlY3RvciBoYW5kbGVyOlxyXG5cdFx0XHRcdFx0XHR3cml0ZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBQbGFpbiByYW5nZV9udW1iZXIgY2FzZSAobnVtYmVyIGhhcyBkYXRhLWluc3BlY3Rvci1rZXkpIC0+IGZpcmUgaW5wdXQgb24gbnVtYmVyXHJcblx0XHRcdFx0XHRcdGlmICggbnVtICYmIG51bS5oYXNBdHRyaWJ1dGUoICdkYXRhLWluc3BlY3Rvci1rZXknICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0bnVtLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBOdW1iZXIgdHlwZWQgLT4gdXBkYXRlIHNsaWRlciBhbmQgd3JpdGVyL2hpZGRlblxyXG5cdFx0XHRcdGlmICggdCAmJiB0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLXZhbHVlJyApICkge1xyXG5cdFx0XHRcdFx0dmFyIGcgPSBmaW5kX2dyb3VwKCB0ICk7XHJcblx0XHRcdFx0XHRpZiAoICFnICkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0dmFyIHIgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1sZW4tcmFuZ2VdJyApO1xyXG5cdFx0XHRcdFx0aWYgKCByICkge1xyXG5cdFx0XHRcdFx0XHQvLyBjbGFtcCB3aXRoaW4gc2xpZGVyIGJvdW5kcyBpZiBwcmVzZW50XHJcblx0XHRcdFx0XHRcdHZhciBtaW4gPSBOdW1iZXIoIHIubWluICk7XHJcblx0XHRcdFx0XHRcdHZhciBtYXggPSBOdW1iZXIoIHIubWF4ICk7XHJcblx0XHRcdFx0XHRcdHZhciB2ICAgPSBOdW1iZXIoIHQudmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCAhaXNOYU4oIHYgKSApIHtcclxuXHRcdFx0XHRcdFx0XHR2ICAgICAgID0gY2xhbXBfbnVtKCB2LCBpc05hTiggbWluICkgPyB1bmRlZmluZWQgOiBtaW4sIGlzTmFOKCBtYXggKSA/IHVuZGVmaW5lZCA6IG1heCApO1xyXG5cdFx0XHRcdFx0XHRcdHIudmFsdWUgPSBTdHJpbmcoIHYgKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIFN0cmluZyggdiApICE9PSB0LnZhbHVlICkgdC52YWx1ZSA9IFN0cmluZyggdiApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR2YXIgd3JpdGVyID0gZy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtaW5zcGVjdG9yLWtleV0nICk7XHJcblx0XHRcdFx0XHRpZiAoIHdyaXRlciAmJiB3cml0ZXIudHlwZSA9PT0gJ3RleHQnICkge1xyXG5cdFx0XHRcdFx0XHR2YXIgdW5pdCAgICAgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1sZW4tdW5pdF0nICk7XHJcblx0XHRcdFx0XHRcdHVuaXQgICAgICAgICA9IHVuaXQgPyB1bml0LnZhbHVlIDogJ3B4JztcclxuXHRcdFx0XHRcdFx0d3JpdGVyLnZhbHVlID0gU3RyaW5nKCB0LnZhbHVlIHx8IDAgKSArIFN0cmluZyggdW5pdCApO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBlbHNlOiBudW1iZXIgaXRzZWxmIGxpa2VseSBjYXJyaWVzIGRhdGEtaW5zcGVjdG9yLWtleSAocmFuZ2VfbnVtYmVyKTsgZGVmYXVsdCBoYW5kbGVyIHdpbGwgcnVuLlxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKCAnY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHR2YXIgdCA9IGUudGFyZ2V0O1xyXG5cdFx0XHRcdC8vIFVuaXQgY2hhbmdlZCAtPiB1cGRhdGUgc2xpZGVyIGxpbWl0cyBhbmQgd3JpdGVyL2hpZGRlblxyXG5cdFx0XHRcdGlmICggdCAmJiB0Lmhhc0F0dHJpYnV0ZSggJ2RhdGEtbGVuLXVuaXQnICkgKSB7XHJcblx0XHRcdFx0XHR2YXIgZyA9IGZpbmRfZ3JvdXAoIHQgKTtcclxuXHRcdFx0XHRcdGlmICggIWcgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0Ly8gRmluZCB0aGUgY29udHJvbCBtZXRhIHZpYSBhIGRhdGEgYXR0cmlidXRlIG9uIGdyb3VwIGlmIHByb3ZpZGVkXHJcblx0XHRcdFx0XHQvLyAoRmFjdG9yeSBwYXRoIHNldHMgbm90aGluZyBoZXJlOyB3ZSByZS1kZXJpdmUgZnJvbSBjdXJyZW50IHNsaWRlciBib3VuZHMuKVxyXG5cdFx0XHRcdFx0dmFyIHIgICAgICA9IGcucXVlcnlTZWxlY3RvciggJ1tkYXRhLWxlbi1yYW5nZV0nICk7XHJcblx0XHRcdFx0XHR2YXIgbnVtICAgID0gZy5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtbGVuLXZhbHVlXScgKTtcclxuXHRcdFx0XHRcdHZhciB3cml0ZXIgPSBnLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pbnNwZWN0b3Ita2V5XScgKTtcclxuXHRcdFx0XHRcdHZhciB1bml0ICAgPSB0LnZhbHVlIHx8ICdweCc7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRqdXN0IHNsaWRlciBib3VuZHMgaGV1cmlzdGljYWxseSAobWF0Y2ggRmFjdG9yeSBkZWZhdWx0cylcclxuXHRcdFx0XHRcdHZhciBib3VuZHNfYnlfdW5pdCA9IHtcclxuXHRcdFx0XHRcdFx0J3B4JyA6IHsgbWluOiAwLCBtYXg6IDUxMiwgc3RlcDogMSB9LFxyXG5cdFx0XHRcdFx0XHQnJScgIDogeyBtaW46IDAsIG1heDogMTAwLCBzdGVwOiAxIH0sXHJcblx0XHRcdFx0XHRcdCdyZW0nOiB7IG1pbjogMCwgbWF4OiAxMCwgc3RlcDogMC4xIH0sXHJcblx0XHRcdFx0XHRcdCdlbScgOiB7IG1pbjogMCwgbWF4OiAxMCwgc3RlcDogMC4xIH1cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRpZiAoIHIgKSB7XHJcblx0XHRcdFx0XHRcdHZhciBiICA9IGJvdW5kc19ieV91bml0W3VuaXRdIHx8IGJvdW5kc19ieV91bml0WydweCddO1xyXG5cdFx0XHRcdFx0XHRyLm1pbiAgPSBTdHJpbmcoIGIubWluICk7XHJcblx0XHRcdFx0XHRcdHIubWF4ICA9IFN0cmluZyggYi5tYXggKTtcclxuXHRcdFx0XHRcdFx0ci5zdGVwID0gU3RyaW5nKCBiLnN0ZXAgKTtcclxuXHRcdFx0XHRcdFx0Ly8gY2xhbXAgdG8gbmV3IGJvdW5kc1xyXG5cdFx0XHRcdFx0XHR2YXIgdiAgPSBOdW1iZXIoIG51bSAmJiBudW0udmFsdWUgPyBudW0udmFsdWUgOiByLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGlmICggIWlzTmFOKCB2ICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0diAgICAgICA9IGNsYW1wX251bSggdiwgYi5taW4sIGIubWF4ICk7XHJcblx0XHRcdFx0XHRcdFx0ci52YWx1ZSA9IFN0cmluZyggdiApO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggbnVtICkgbnVtLnZhbHVlID0gU3RyaW5nKCB2ICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICggd3JpdGVyICYmIHdyaXRlci50eXBlID09PSAndGV4dCcgKSB7XHJcblx0XHRcdFx0XHRcdHZhciB2ICAgICAgICA9IG51bSAmJiBudW0udmFsdWUgPyBudW0udmFsdWUgOiAociA/IHIudmFsdWUgOiAnMCcpO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIudmFsdWUgPSBTdHJpbmcoIHYgKSArIFN0cmluZyggdW5pdCApO1xyXG5cdFx0XHRcdFx0XHR3cml0ZXIuZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSApICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCB0cnVlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdFx0Ly8gPT0gIEMgTyBOIFQgUiBPIEwgID09XHJcblx0XHQvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG5cdFx0LyoqXHJcblx0ICogU2NoZW1hID4gSW5zcGVjdG9yID4gQ29udHJvbCBFbGVtZW50LCBlLmcuIElucHV0ISAgQnVpbGQgYSBzaW5nbGUgY29udHJvbCByb3c6XHJcblx0ICogPGRpdiBjbGFzcz1cImluc3BlY3Rvcl9fcm93XCI+XHJcblx0ICogICA8bGFiZWwgY2xhc3M9XCJpbnNwZWN0b3JfX2xhYmVsXCIgZm9yPVwiLi4uXCI+TGFiZWw8L2xhYmVsPlxyXG5cdCAqICAgPGRpdiBjbGFzcz1cImluc3BlY3Rvcl9fY29udHJvbFwiPjxpbnB1dHx0ZXh0YXJlYXxzZWxlY3QgY2xhc3M9XCJpbnNwZWN0b3JfX2lucHV0XCIgLi4uPjwvZGl2PlxyXG5cdCAqIDwvZGl2PlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGNvbnRyb2wgICAgICAgICAgIC0gc2NoZW1hIGNvbnRyb2wgbWV0YSAoe3R5cGUsa2V5LGxhYmVsLC4uLn0pXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHByb3BzX3NjaGVtYSAgICAgIC0gc2NoZW1hLnByb3BzXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgICAgICAgICAgICAgIC0gY3VycmVudCBlbGVtZW50IGRhdGEtKiBtYXBcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdWlkICAgICAgICAgICAgICAgLSB1bmlxdWUgc3VmZml4IGZvciBpbnB1dCBpZHNcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY3R4ICAgICAgICAgICAgICAgLSB7IGVsLCBidWlsZGVyLCB0eXBlLCBkYXRhIH1cclxuXHQgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XHJcblx0ICovXHJcblx0XHRmdW5jdGlvbiBidWlsZF9jb250cm9sKGNvbnRyb2wsIHByb3BzX3NjaGVtYSwgZGF0YSwgdWlkLCBjdHgpIHtcclxuXHRcdFx0dmFyIHR5cGUgPSBjb250cm9sLnR5cGU7XHJcblx0XHRcdHZhciBrZXkgID0gY29udHJvbC5rZXk7XHJcblxyXG5cdFx0XHR2YXIgbGFiZWxfdGV4dCA9IGNvbnRyb2wubGFiZWwgfHwga2V5IHx8ICcnO1xyXG5cdFx0XHR2YXIgcHJvcF9tZXRhICA9IChrZXkgPyAocHJvcHNfc2NoZW1hW2tleV0gfHwgeyB0eXBlOiAnc3RyaW5nJyB9KSA6IHsgdHlwZTogJ3N0cmluZycgfSk7XHJcblx0XHRcdHZhciB2YWx1ZSAgICAgID0gY29lcmNlX2J5X3R5cGUoIGdldF9pbml0aWFsX3ZhbHVlKCBrZXksIGRhdGEsIHByb3BzX3NjaGVtYSApLCBwcm9wX21ldGEudHlwZSApO1xyXG5cdFx0Ly8gQWxsb3cgdmFsdWVfZnJvbSBvdmVycmlkZSAoY29tcHV0ZWQgYXQgcmVuZGVyLXRpbWUpLlxyXG5cdFx0aWYgKCBjb250cm9sICYmIGNvbnRyb2wudmFsdWVfZnJvbSAmJiB3LndwYmNfYmZiX2luc3BlY3Rvcl9mYWN0b3J5X3ZhbHVlX2Zyb21bY29udHJvbC52YWx1ZV9mcm9tXSApIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0dmFyIGNvbXB1dGVkID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tW2NvbnRyb2wudmFsdWVfZnJvbV0oIGN0eCB8fCB7fSApO1xyXG5cdFx0XHRcdFx0dmFsdWUgICAgICAgID0gY29lcmNlX2J5X3R5cGUoIGNvbXB1dGVkLCBwcm9wX21ldGEudHlwZSApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAndmFsdWVfZnJvbSBmYWlsZWQgZm9yJywgY29udHJvbC52YWx1ZV9mcm9tLCBlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgaW5wdXRfaWQgPSAnd3BiY19pbnNfJyArIGtleSArICdfJyArIHVpZDtcclxuXHJcblx0XHRcdHZhciByb3dfZWwgICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fcm93JyB9ICk7XHJcblx0XHRcdHZhciBsYWJlbF9lbCAgPSBlbCggJ2xhYmVsJywgeyAnZm9yJzogaW5wdXRfaWQsICdjbGFzcyc6ICdpbnNwZWN0b3JfX2xhYmVsJyB9LCBsYWJlbF90ZXh0ICk7XHJcblx0XHRcdHZhciBjdHJsX3dyYXAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fY29udHJvbCcgfSApO1xyXG5cclxuXHRcdFx0dmFyIGZpZWxkX2VsO1xyXG5cclxuXHRcdC8vIC0tLSBzbG90IGhvc3QgKG5hbWVkIFVJIGluamVjdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdGlmICggdHlwZSA9PT0gJ3Nsb3QnICYmIGNvbnRyb2wuc2xvdCApIHtcclxuXHRcdFx0Ly8gYWRkIGEgbWFya2VyIGNsYXNzIGZvciB0aGUgbGF5b3V0IGNoaXBzIHJvd1xyXG5cdFx0XHR2YXIgY2xhc3NlcyA9ICdpbnNwZWN0b3JfX3JvdyBpbnNwZWN0b3JfX3Jvdy0tc2xvdCc7XHJcblx0XHRcdGlmICggY29udHJvbC5zbG90ID09PSAnbGF5b3V0X2NoaXBzJyApIGNsYXNzZXMgKz0gJyBpbnNwZWN0b3JfX3Jvdy0tbGF5b3V0LWNoaXBzJztcclxuXHJcblx0XHRcdHZhciBzbG90X3JvdyA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiBjbGFzc2VzIH0gKTtcclxuXHJcblx0XHRcdGlmICggbGFiZWxfdGV4dCApIHNsb3Rfcm93LmFwcGVuZENoaWxkKCBlbCggJ2xhYmVsJywgeyAnY2xhc3MnOiAnaW5zcGVjdG9yX19sYWJlbCcgfSwgbGFiZWxfdGV4dCApICk7XHJcblxyXG5cdFx0XHQvLyBhZGQgYSBkYXRhIGF0dHJpYnV0ZSBvbiB0aGUgaG9zdCBzbyBib3RoIENTUyBhbmQgdGhlIHNhZmV0eS1uZXQgY2FuIHRhcmdldCBpdFxyXG5cdFx0XHR2YXIgaG9zdF9hdHRycyA9IHsgJ2NsYXNzJzogJ2luc3BlY3Rvcl9fY29udHJvbCcgfTtcclxuXHRcdFx0aWYgKCBjb250cm9sLnNsb3QgPT09ICdsYXlvdXRfY2hpcHMnICkgaG9zdF9hdHRyc1snZGF0YS1iZmItc2xvdCddID0gJ2xheW91dF9jaGlwcyc7XHJcblxyXG5cdFx0XHR2YXIgc2xvdF9ob3N0ID0gZWwoICdkaXYnLCBob3N0X2F0dHJzICk7XHJcblx0XHRcdHNsb3Rfcm93LmFwcGVuZENoaWxkKCBzbG90X2hvc3QgKTtcclxuXHJcblx0XHRcdHZhciBzbG90X2ZuID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV9zbG90c1tjb250cm9sLnNsb3RdO1xyXG5cdFx0XHRpZiAoIHR5cGVvZiBzbG90X2ZuID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdHNsb3RfZm4oIHNsb3RfaG9zdCwgY3R4IHx8IHt9ICk7XHJcblx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnc2xvdCBcIicgKyBjb250cm9sLnNsb3QgKyAnXCIgZmFpbGVkOicsIGUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LCAwICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2xvdF9ob3N0LmFwcGVuZENoaWxkKCBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3dwYmNfYmZiX19zbG90X19taXNzaW5nJyB9LCAnW3Nsb3Q6ICcgKyBjb250cm9sLnNsb3QgKyAnXScgKSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBzbG90X3JvdztcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09ICd0ZXh0YXJlYScgKSB7XHJcblx0XHRcdFx0ZmllbGRfZWwgPSBlbCggJ3RleHRhcmVhJywge1xyXG5cdFx0XHRcdFx0aWQgICAgICAgICAgICAgICAgICA6IGlucHV0X2lkLFxyXG5cdFx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHRcdHJvd3MgICAgICAgICAgICAgICAgOiBjb250cm9sLnJvd3MgfHwgMyxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICAgICAgICAgOiAnaW5zcGVjdG9yX19pbnB1dCdcclxuXHRcdFx0XHR9LCAodmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKCB2YWx1ZSApKSApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnc2VsZWN0JyApIHtcclxuXHRcdFx0XHRmaWVsZF9lbCA9IGVsKCAnc2VsZWN0Jywge1xyXG5cdFx0XHRcdFx0aWQgICAgICAgICAgICAgICAgICA6IGlucHV0X2lkLFxyXG5cdFx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICAgICAgICAgOiAnaW5zcGVjdG9yX19pbnB1dCdcclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0bm9ybWFsaXplX3NlbGVjdF9vcHRpb25zKCBjb250cm9sLm9wdGlvbnMgfHwgW10gKS5mb3JFYWNoKCBmdW5jdGlvbiAob3B0KSB7XHJcblx0XHRcdFx0XHR2YXIgb3B0X2VsID0gZWwoICdvcHRpb24nLCB7IHZhbHVlOiBvcHQudmFsdWUgfSwgb3B0LmxhYmVsICk7XHJcblx0XHRcdFx0XHRpZiAoIFN0cmluZyggdmFsdWUgKSA9PT0gb3B0LnZhbHVlICkgb3B0X2VsLnNldEF0dHJpYnV0ZSggJ3NlbGVjdGVkJywgJ3NlbGVjdGVkJyApO1xyXG5cdFx0XHRcdFx0ZmllbGRfZWwuYXBwZW5kQ2hpbGQoIG9wdF9lbCApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2NoZWNrYm94JyApIHtcclxuXHRcdFx0XHQvLyBmaWVsZF9lbCA9IGVsKCAnaW5wdXQnLCB7IGlkOiBpbnB1dF9pZCwgdHlwZTogJ2NoZWNrYm94JywgJ2RhdGEtaW5zcGVjdG9yLWtleSc6IGtleSwgY2hlY2tlZDogISF2YWx1ZSwgJ2NsYXNzJzogJ2luc3BlY3Rvcl9faW5wdXQnIH0gKTsgLy8uXHJcblxyXG5cdFx0XHRcdC8vIFJlbmRlciBhcyB0b2dnbGUgVUkgaW5zdGVhZCBvZiBsYWJlbC1sZWZ0ICsgY2hlY2tib3guICBOb3RlOiB3ZSByZXR1cm4gdGhlIGZ1bGwgdG9nZ2xlIHJvdyBoZXJlIGFuZCBza2lwIHRoZSBkZWZhdWx0IHJvdy9sYWJlbCBmbG93IGJlbG93LlxyXG5cdFx0XHRcdHJldHVybiBidWlsZF90b2dnbGVfcm93KCBpbnB1dF9pZCwga2V5LCAhIXZhbHVlLCBsYWJlbF90ZXh0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAncmFuZ2VfbnVtYmVyJyApIHtcclxuXHRcdFx0XHQvLyAtLS0gbmV3OiBzbGlkZXIgKyBudW1iZXIgKHNpbmdsZSBrZXkpLlxyXG5cdFx0XHRcdHZhciBybl9pZCAgPSAnd3BiY19pbnNfJyArIGtleSArICdfJyArIHVpZDtcclxuXHRcdFx0XHR2YXIgcm5fdmFsID0gdmFsdWU7IC8vIGZyb20gZ2V0X2luaXRpYWxfdmFsdWUvcHJvcF9tZXRhIGFscmVhZHkuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkX3JhbmdlX251bWJlcl9yb3coIHJuX2lkLCBrZXksIGxhYmVsX3RleHQsIHJuX3ZhbCwgY29udHJvbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2xlbicgKSB7XHJcblx0XHRcdFx0Ly8gLS0tIG5ldzogbGVuZ3RoIGNvbXBvdW5kICh2YWx1ZSt1bml0K3NsaWRlciAtPiB3cml0ZXMgYSBzaW5nbGUgc3RyaW5nIGtleSkuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkX2xlbl9jb21wb3VuZF9yb3coIGNvbnRyb2wsIHByb3BzX3NjaGVtYSwgZGF0YSwgdWlkICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnY29sb3InICkge1xyXG5cdFx0XHRcdC8vIENvbG9yIHBpY2tlciAoQ29sb3JpcykuIFN0b3JlIGFzIHN0cmluZyAoZS5nLiwgXCIjZTBlMGUwXCIpLlxyXG5cdFx0XHRcdGZpZWxkX2VsID0gZWwoICdpbnB1dCcsIHtcclxuXHRcdFx0XHRcdGlkICAgICAgICAgICAgICAgICAgIDogaW5wdXRfaWQsXHJcblx0XHRcdFx0XHR0eXBlICAgICAgICAgICAgICAgICA6ICd0ZXh0JyxcclxuXHRcdFx0XHRcdCdkYXRhLWluc3BlY3Rvci1rZXknIDoga2V5LFxyXG5cdFx0XHRcdFx0J2RhdGEtaW5zcGVjdG9yLXR5cGUnOiAnY29sb3InLFxyXG5cdFx0XHRcdFx0J2RhdGEtY29sb3JpcycgICAgICAgOiAnJyxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnLFxyXG5cdFx0XHRcdFx0J2RhdGEtZGVmYXVsdC1jb2xvcicgOiAoIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnID8gU3RyaW5nKHZhbHVlKSA6IChjb250cm9sLnBsYWNlaG9sZGVyIHx8ICcnKSApXHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdGlmICggdmFsdWUgIT09ICcnICkge1xyXG5cdFx0XHRcdFx0ZmllbGRfZWwudmFsdWUgPSBTdHJpbmcoIHZhbHVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIHRleHQvbnVtYmVyIGRlZmF1bHQuXHJcblx0XHRcdFx0dmFyIGF0dHJzID0ge1xyXG5cdFx0XHRcdFx0aWQgICAgICAgICAgICAgICAgICA6IGlucHV0X2lkLFxyXG5cdFx0XHRcdFx0dHlwZSAgICAgICAgICAgICAgICA6ICh0eXBlID09PSAnbnVtYmVyJykgPyAnbnVtYmVyJyA6ICd0ZXh0JyxcclxuXHRcdFx0XHRcdCdkYXRhLWluc3BlY3Rvci1rZXknOiBrZXksXHJcblx0XHRcdFx0XHQnY2xhc3MnICAgICAgICAgICAgIDogJ2luc3BlY3Rvcl9faW5wdXQnXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0Ly8gbnVtYmVyIGNvbnN0cmFpbnRzIChzY2hlbWEgb3IgY29udHJvbClcclxuXHRcdFx0XHRpZiAoIHR5cGUgPT09ICdudW1iZXInICkge1xyXG5cdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHByb3BfbWV0YSwgJ21pbicgKSApIGF0dHJzLm1pbiA9IHByb3BfbWV0YS5taW47XHJcblx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggcHJvcF9tZXRhLCAnbWF4JyApICkgYXR0cnMubWF4ID0gcHJvcF9tZXRhLm1heDtcclxuXHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBwcm9wX21ldGEsICdzdGVwJyApICkgYXR0cnMuc3RlcCA9IHByb3BfbWV0YS5zdGVwO1xyXG5cdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIGNvbnRyb2wsICdtaW4nICkgKSBhdHRycy5taW4gPSBjb250cm9sLm1pbjtcclxuXHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBjb250cm9sLCAnbWF4JyApICkgYXR0cnMubWF4ID0gY29udHJvbC5tYXg7XHJcblx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggY29udHJvbCwgJ3N0ZXAnICkgKSBhdHRycy5zdGVwID0gY29udHJvbC5zdGVwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmaWVsZF9lbCA9IGVsKCAnaW5wdXQnLCBhdHRycyApO1xyXG5cdFx0XHRcdGlmICggdmFsdWUgIT09ICcnICkgZmllbGRfZWwudmFsdWUgPSBTdHJpbmcoIHZhbHVlICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN0cmxfd3JhcC5hcHBlbmRDaGlsZCggZmllbGRfZWwgKTtcclxuXHRcdFx0cm93X2VsLmFwcGVuZENoaWxkKCBsYWJlbF9lbCApO1xyXG5cdFx0XHRyb3dfZWwuYXBwZW5kQ2hpbGQoIGN0cmxfd3JhcCApO1xyXG5cdFx0XHRyZXR1cm4gcm93X2VsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2NoZW1hID4gSW5zcGVjdG9yID4gR3JvdXBzISBCdWlsZCBhbiBpbnNwZWN0b3IgZ3JvdXAgKGNvbGxhcHNpYmxlKS5cclxuXHRcdCAqIFN0cnVjdHVyZTpcclxuXHRcdCAqIDxzZWN0aW9uIGNsYXNzPVwid3BiY19iZmJfX2luc3BlY3Rvcl9fZ3JvdXAgd3BiY191aV9fY29sbGFwc2libGVfZ3JvdXAgaXMtb3BlblwiIGRhdGEtZ3JvdXA9XCIuLi5cIj5cclxuXHRcdCAqICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJncm91cF9faGVhZGVyXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cIndwYmNfY29sbGFwc2libGVfcGFuZWxfWFwiPlxyXG5cdFx0ICogICAgIDxoMz5Hcm91cCBUaXRsZTwvaDM+XHJcblx0XHQgKiAgICAgPGkgY2xhc3M9XCJ3cGJjX3VpX2VsX192ZXJ0X21lbnVfcm9vdF9zZWN0aW9uX2ljb24gbWVudV9pY29uIGljb24tMXggd3BiYy1iaS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxyXG5cdFx0ICogICA8L2J1dHRvbj5cclxuXHRcdCAqICAgPGRpdiBjbGFzcz1cImdyb3VwX19maWVsZHNcIiBpZD1cIndwYmNfY29sbGFwc2libGVfcGFuZWxfWFwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIj4g4oCmcm93c+KApiA8L2Rpdj5cclxuXHRcdCAqIDwvc2VjdGlvbj5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXBcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc19zY2hlbWFcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdWlkXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gY3R4XHJcblx0XHQgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIGJ1aWxkX2dyb3VwKGdyb3VwLCBwcm9wc19zY2hlbWEsIGRhdGEsIHVpZCwgY3R4KSB7XHJcblx0XHRcdHZhciBpc19vcGVuICA9ICEhZ3JvdXAub3BlbjtcclxuXHRcdFx0dmFyIHBhbmVsX2lkID0gJ3dwYmNfY29sbGFwc2libGVfcGFuZWxfJyArIHVpZCArICdfJyArIChncm91cC5rZXkgfHwgJ2cnKTtcclxuXHJcblx0XHRcdHZhciBzZWN0aW9uID0gZWwoICdzZWN0aW9uJywge1xyXG5cdFx0XHRcdCdjbGFzcycgICAgIDogJ3dwYmNfYmZiX19pbnNwZWN0b3JfX2dyb3VwIHdwYmNfdWlfX2NvbGxhcHNpYmxlX2dyb3VwJyArIChpc19vcGVuID8gJyBpcy1vcGVuJyA6ICcnKSxcclxuXHRcdFx0XHQnZGF0YS1ncm91cCc6IGdyb3VwLmtleSB8fCAnJ1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR2YXIgaGVhZGVyX2J0biA9IGVsKCAnYnV0dG9uJywge1xyXG5cdFx0XHRcdHR5cGUgICAgICAgICAgIDogJ2J1dHRvbicsXHJcblx0XHRcdFx0J2NsYXNzJyAgICAgICAgOiAnZ3JvdXBfX2hlYWRlcicsXHJcblx0XHRcdFx0cm9sZSAgICAgICAgICAgOiAnYnV0dG9uJyxcclxuXHRcdFx0XHQnYXJpYS1leHBhbmRlZCc6IGlzX29wZW4gPyAndHJ1ZScgOiAnZmFsc2UnLFxyXG5cdFx0XHRcdCdhcmlhLWNvbnRyb2xzJzogcGFuZWxfaWRcclxuXHRcdFx0fSwgW1xyXG5cdFx0XHRcdGVsKCAnaDMnLCBudWxsLCBncm91cC50aXRsZSB8fCBncm91cC5sYWJlbCB8fCBncm91cC5rZXkgfHwgJycgKSxcclxuXHRcdFx0XHRlbCggJ2knLCB7ICdjbGFzcyc6ICd3cGJjX3VpX2VsX192ZXJ0X21lbnVfcm9vdF9zZWN0aW9uX2ljb24gbWVudV9pY29uIGljb24tMXggd3BiYy1iaS1jaGV2cm9uLXJpZ2h0JyB9IClcclxuXHRcdFx0XSApO1xyXG5cclxuXHRcdFx0dmFyIGZpZWxkcyA9IGVsKCAnZGl2Jywge1xyXG5cdFx0XHRcdCdjbGFzcycgICAgICA6ICdncm91cF9fZmllbGRzJyxcclxuXHRcdFx0XHRpZCAgICAgICAgICAgOiBwYW5lbF9pZCxcclxuXHRcdFx0XHQnYXJpYS1oaWRkZW4nOiBpc19vcGVuID8gJ2ZhbHNlJyA6ICd0cnVlJ1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBhc0FycmF5KHgpIHtcclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHggKSApIHJldHVybiB4O1xyXG5cdFx0XHRcdGlmICggeCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgKSByZXR1cm4gT2JqZWN0LnZhbHVlcyggeCApO1xyXG5cdFx0XHRcdHJldHVybiB4ICE9IG51bGwgPyBbIHggXSA6IFtdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhc0FycmF5KCBncm91cC5jb250cm9scyApLmZvckVhY2goIGZ1bmN0aW9uIChjb250cm9sKSB7XHJcblx0XHRcdFx0ZmllbGRzLmFwcGVuZENoaWxkKCBidWlsZF9jb250cm9sKCBjb250cm9sLCBwcm9wc19zY2hlbWEsIGRhdGEsIHVpZCwgY3R4ICkgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0c2VjdGlvbi5hcHBlbmRDaGlsZCggaGVhZGVyX2J0biApO1xyXG5cdFx0XHRzZWN0aW9uLmFwcGVuZENoaWxkKCBmaWVsZHMgKTtcclxuXHRcdFx0cmV0dXJuIHNlY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTY2hlbWEgPiBJbnNwZWN0b3IgPiBIZWFkZXIhIEJ1aWxkIGluc3BlY3RvciBoZWFkZXIgd2l0aCBhY3Rpb24gYnV0dG9ucyB3aXJlZCB0byBleGlzdGluZyBkYXRhLWFjdGlvbiBoYW5kbGVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGhlYWRlcl9hY3Rpb25zXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgIHRpdGxlX3RleHRcclxuXHRcdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gYnVpbGRfaGVhZGVyKGluc3BlY3Rvcl91aSwgdGl0bGVfZmFsbGJhY2ssIHNjaGVtYV9mb3JfdHlwZSkge1xyXG5cclxuXHRcdFx0aW5zcGVjdG9yX3VpICAgICAgPSBpbnNwZWN0b3JfdWkgfHwge307XHJcblx0XHRcdHNjaGVtYV9mb3JfdHlwZSAgID0gc2NoZW1hX2Zvcl90eXBlIHx8IHt9O1xyXG5cdFx0XHR2YXIgdmFyaWFudCAgICAgICA9IGluc3BlY3Rvcl91aS5oZWFkZXJfdmFyaWFudCB8fCAnbWluaW1hbCc7XHJcblx0XHRcdHZhciBoZWFkZXJBY3Rpb25zID0gaW5zcGVjdG9yX3VpLmhlYWRlcl9hY3Rpb25zXHJcblx0XHRcdFx0fHwgc2NoZW1hX2Zvcl90eXBlLmhlYWRlcl9hY3Rpb25zXHJcblx0XHRcdFx0fHwgWyAnZGVzZWxlY3QnLCAnc2Nyb2xsdG8nLCAnbW92ZS11cCcsICdtb3ZlLWRvd24nLCAnZHVwbGljYXRlJywgJ2RlbGV0ZScgXTtcclxuXHJcblx0XHRcdHZhciB0aXRsZSAgICAgICA9IGluc3BlY3Rvcl91aS50aXRsZSB8fCB0aXRsZV9mYWxsYmFjayB8fCAnJztcclxuXHRcdFx0dmFyIGRlc2NyaXB0aW9uID0gaW5zcGVjdG9yX3VpLmRlc2NyaXB0aW9uIHx8ICcnO1xyXG5cclxuXHRcdFx0Ly8gaGVscGVyIHRvIGNyZWF0ZSBhIGJ1dHRvbiBmb3IgZWl0aGVyIGhlYWRlciBzdHlsZVxyXG5cdFx0XHRmdW5jdGlvbiBhY3Rpb25CdG4oYWN0LCBtaW5pbWFsKSB7XHJcblx0XHRcdFx0aWYgKCBtaW5pbWFsICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVsKCAnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJywgJ2NsYXNzJzogJ2J1dHRvbi1saW5rJywgJ2RhdGEtYWN0aW9uJzogYWN0IH0sICcnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIHRvb2xiYXIgdmFyaWFudCAocmljaClcclxuXHRcdFx0XHR2YXIgaWNvbk1hcCA9IHtcclxuXHRcdFx0XHRcdCdkZXNlbGVjdCcgOiAnd3BiY19pY25fbmVhcl9tZV9kaXNhYmxlZCcsXHJcblx0XHRcdFx0XHQnc2Nyb2xsdG8nIDogJ3dwYmNfaWNuX2Fkc19jbGljayBmaWx0ZXJfY2VudGVyX2ZvY3VzJyxcclxuXHRcdFx0XHRcdCdtb3ZlLXVwJyAgOiAnd3BiY19pY25fYXJyb3dfdXB3YXJkJyxcclxuXHRcdFx0XHRcdCdtb3ZlLWRvd24nOiAnd3BiY19pY25fYXJyb3dfZG93bndhcmQnLFxyXG5cdFx0XHRcdFx0J2R1cGxpY2F0ZSc6ICd3cGJjX2ljbl9jb250ZW50X2NvcHknLFxyXG5cdFx0XHRcdFx0J2RlbGV0ZScgICA6ICd3cGJjX2ljbl9kZWxldGVfb3V0bGluZSdcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHZhciBjbGFzc2VzID0gJ2J1dHRvbiBidXR0b24tc2Vjb25kYXJ5IHdwYmNfdWlfY29udHJvbCB3cGJjX3VpX2J1dHRvbic7XHJcblx0XHRcdFx0aWYgKCBhY3QgPT09ICdkZWxldGUnICkgY2xhc3NlcyArPSAnIHdwYmNfdWlfYnV0dG9uX2RhbmdlciBidXR0b24tbGluay1kZWxldGUnO1xyXG5cclxuXHRcdFx0XHR2YXIgYnRuID0gZWwoICdidXR0b24nLCB7XHJcblx0XHRcdFx0XHR0eXBlICAgICAgICAgOiAnYnV0dG9uJyxcclxuXHRcdFx0XHRcdCdjbGFzcycgICAgICA6IGNsYXNzZXMsXHJcblx0XHRcdFx0XHQnZGF0YS1hY3Rpb24nOiBhY3QsXHJcblx0XHRcdFx0XHQnYXJpYS1sYWJlbCcgOiBhY3QucmVwbGFjZSggLy0vZywgJyAnIClcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGlmICggYWN0ID09PSAnZGVsZXRlJyApIHtcclxuXHRcdFx0XHRcdGJ0bi5hcHBlbmRDaGlsZCggZWwoICdzcGFuJywgeyAnY2xhc3MnOiAnaW4tYnV0dG9uLXRleHQnIH0sICdEZWxldGUnICkgKTtcclxuXHRcdFx0XHRcdGJ0bi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoICcgJyApICk7IC8vIG1pbm9yIHNwYWNpbmcgYmVmb3JlIGljb25cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnRuLmFwcGVuZENoaWxkKCBlbCggJ2knLCB7ICdjbGFzcyc6ICdtZW51X2ljb24gaWNvbi0xeCAnICsgKGljb25NYXBbYWN0XSB8fCAnJykgfSApICk7XHJcblx0XHRcdFx0cmV0dXJuIGJ0bjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gPT09IG1pbmltYWwgaGVhZGVyIChleGlzdGluZyBsb29rOyBkZWZhdWx0KSA9PT1cclxuXHRcdFx0aWYgKCB2YXJpYW50ICE9PSAndG9vbGJhcicgKSB7XHJcblx0XHRcdFx0dmFyIGhlYWRlciA9IGVsKCAnaGVhZGVyJywgeyAnY2xhc3MnOiAnd3BiY19iZmJfX2luc3BlY3Rvcl9faGVhZGVyJyB9ICk7XHJcblx0XHRcdFx0aGVhZGVyLmFwcGVuZENoaWxkKCBlbCggJ2gzJywgbnVsbCwgdGl0bGUgfHwgJycgKSApO1xyXG5cclxuXHRcdFx0XHR2YXIgYWN0aW9ucyA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAnd3BiY19iZmJfX2luc3BlY3Rvcl9faGVhZGVyX2FjdGlvbnMnIH0gKTtcclxuXHRcdFx0XHRoZWFkZXJBY3Rpb25zLmZvckVhY2goIGZ1bmN0aW9uIChhY3QpIHtcclxuXHRcdFx0XHRcdGFjdGlvbnMuYXBwZW5kQ2hpbGQoIGFjdGlvbkJ0biggYWN0LCAvKm1pbmltYWwqL3RydWUgKSApO1xyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRoZWFkZXIuYXBwZW5kQ2hpbGQoIGFjdGlvbnMgKTtcclxuXHRcdFx0XHRyZXR1cm4gaGVhZGVyO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyA9PT0gdG9vbGJhciBoZWFkZXIgKHJpY2ggdGl0bGUvZGVzYyArIGdyb3VwZWQgYnV0dG9ucykgPT09XHJcblx0XHRcdHZhciByb290ID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICd3cGJjX2JmYl9faW5zcGVjdG9yX19oZWFkJyB9ICk7XHJcblx0XHRcdHZhciB3cmFwID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICdoZWFkZXJfY29udGFpbmVyJyB9ICk7XHJcblx0XHRcdHZhciBsZWZ0ID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICdoZWFkZXJfdGl0bGVfY29udGVudCcgfSApO1xyXG5cdFx0XHR2YXIgaDMgICA9IGVsKCAnaDMnLCB7ICdjbGFzcyc6ICd0aXRsZScgfSwgdGl0bGUgfHwgJycgKTtcclxuXHRcdFx0bGVmdC5hcHBlbmRDaGlsZCggaDMgKTtcclxuXHRcdFx0aWYgKCBkZXNjcmlwdGlvbiApIHtcclxuXHRcdFx0XHRsZWZ0LmFwcGVuZENoaWxkKCBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ2Rlc2MnIH0sIGRlc2NyaXB0aW9uICkgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIHJpZ2h0ID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICdhY3Rpb25zIHdwYmNfYWp4X3Rvb2xiYXIgd3BiY19ub19ib3JkZXJzJyB9ICk7XHJcblx0XHRcdHZhciB1aUMgICA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAndWlfY29udGFpbmVyIHVpX2NvbnRhaW5lcl9zbWFsbCcgfSApO1xyXG5cdFx0XHR2YXIgdWlHICAgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3VpX2dyb3VwJyB9ICk7XHJcblxyXG5cdFx0XHQvLyBTcGxpdCBpbnRvIHZpc3VhbCBncm91cHM6IGZpcnN0IDIsIG5leHQgMiwgdGhlbiB0aGUgcmVzdC5cclxuXHRcdFx0dmFyIGcxID0gZWwoICdkaXYnLCB7ICdjbGFzcyc6ICd1aV9lbGVtZW50JyB9ICk7XHJcblx0XHRcdHZhciBnMiA9IGVsKCAnZGl2JywgeyAnY2xhc3MnOiAndWlfZWxlbWVudCcgfSApO1xyXG5cdFx0XHR2YXIgZzMgPSBlbCggJ2RpdicsIHsgJ2NsYXNzJzogJ3VpX2VsZW1lbnQnIH0gKTtcclxuXHJcblx0XHRcdGhlYWRlckFjdGlvbnMuc2xpY2UoIDAsIDIgKS5mb3JFYWNoKCBmdW5jdGlvbiAoYWN0KSB7XHJcblx0XHRcdFx0ZzEuYXBwZW5kQ2hpbGQoIGFjdGlvbkJ0biggYWN0LCBmYWxzZSApICk7XHJcblx0XHRcdH0gKTtcclxuXHRcdFx0aGVhZGVyQWN0aW9ucy5zbGljZSggMiwgNCApLmZvckVhY2goIGZ1bmN0aW9uIChhY3QpIHtcclxuXHRcdFx0XHRnMi5hcHBlbmRDaGlsZCggYWN0aW9uQnRuKCBhY3QsIGZhbHNlICkgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0XHRoZWFkZXJBY3Rpb25zLnNsaWNlKCA0ICkuZm9yRWFjaCggZnVuY3Rpb24gKGFjdCkge1xyXG5cdFx0XHRcdGczLmFwcGVuZENoaWxkKCBhY3Rpb25CdG4oIGFjdCwgZmFsc2UgKSApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR1aUcuYXBwZW5kQ2hpbGQoIGcxICk7XHJcblx0XHRcdHVpRy5hcHBlbmRDaGlsZCggZzIgKTtcclxuXHRcdFx0dWlHLmFwcGVuZENoaWxkKCBnMyApO1xyXG5cdFx0XHR1aUMuYXBwZW5kQ2hpbGQoIHVpRyApO1xyXG5cdFx0XHRyaWdodC5hcHBlbmRDaGlsZCggdWlDICk7XHJcblxyXG5cdFx0XHR3cmFwLmFwcGVuZENoaWxkKCBsZWZ0ICk7XHJcblx0XHRcdHdyYXAuYXBwZW5kQ2hpbGQoIHJpZ2h0ICk7XHJcblx0XHRcdHJvb3QuYXBwZW5kQ2hpbGQoIHdyYXAgKTtcclxuXHJcblx0XHRcdHJldHVybiByb290O1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRmdW5jdGlvbiBmYWN0b3J5X3JlbmRlcihwYW5lbF9lbCwgc2NoZW1hX2Zvcl90eXBlLCBkYXRhLCBvcHRzKSB7XHJcblx0XHRcdGlmICggIXBhbmVsX2VsICkgcmV0dXJuIHBhbmVsX2VsO1xyXG5cclxuXHRcdFx0c2NoZW1hX2Zvcl90eXBlICA9IHNjaGVtYV9mb3JfdHlwZSB8fCB7fTtcclxuXHRcdFx0dmFyIHByb3BzX3NjaGVtYSA9IChzY2hlbWFfZm9yX3R5cGUuc2NoZW1hICYmIHNjaGVtYV9mb3JfdHlwZS5zY2hlbWEucHJvcHMpID8gc2NoZW1hX2Zvcl90eXBlLnNjaGVtYS5wcm9wcyA6IHt9O1xyXG5cdFx0XHR2YXIgaW5zcGVjdG9yX3VpID0gKHNjaGVtYV9mb3JfdHlwZS5pbnNwZWN0b3JfdWkgfHwge30pO1xyXG5cdFx0XHR2YXIgZ3JvdXBzICAgICAgID0gaW5zcGVjdG9yX3VpLmdyb3VwcyB8fCBbXTtcclxuXHJcblx0XHRcdHZhciBoZWFkZXJfYWN0aW9ucyA9IGluc3BlY3Rvcl91aS5oZWFkZXJfYWN0aW9ucyB8fCBzY2hlbWFfZm9yX3R5cGUuaGVhZGVyX2FjdGlvbnMgfHwgW107XHJcblx0XHRcdHZhciB0aXRsZV90ZXh0ICAgICA9IChvcHRzICYmIG9wdHMudGl0bGUpIHx8IGluc3BlY3Rvcl91aS50aXRsZSB8fCBzY2hlbWFfZm9yX3R5cGUubGFiZWwgfHwgKGRhdGEgJiYgZGF0YS5sYWJlbCkgfHwgJyc7XHJcblxyXG5cdFx0Ly8gUHJlcGFyZSByZW5kZXJpbmcgY29udGV4dCBmb3Igc2xvdHMvdmFsdWVfZnJvbSwgZXRjLlxyXG5cdFx0XHR2YXIgY3R4ID0ge1xyXG5cdFx0XHRcdGVsICAgICA6IG9wdHMgJiYgb3B0cy5lbCB8fCBudWxsLFxyXG5cdFx0XHRcdGJ1aWxkZXI6IG9wdHMgJiYgb3B0cy5idWlsZGVyIHx8IG51bGwsXHJcblx0XHRcdFx0dHlwZSAgIDogb3B0cyAmJiBvcHRzLnR5cGUgfHwgbnVsbCxcclxuXHRcdFx0XHRkYXRhICAgOiBkYXRhIHx8IHt9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyBjbGVhciBwYW5lbC5cclxuXHRcdFx0d2hpbGUgKCBwYW5lbF9lbC5maXJzdENoaWxkICkgcGFuZWxfZWwucmVtb3ZlQ2hpbGQoIHBhbmVsX2VsLmZpcnN0Q2hpbGQgKTtcclxuXHJcblx0XHRcdHZhciB1aWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCAzNiApLnNsaWNlKCAyLCA4ICk7XHJcblxyXG5cdFx0XHQvLyBoZWFkZXIuXHJcblx0XHRcdHBhbmVsX2VsLmFwcGVuZENoaWxkKCBidWlsZF9oZWFkZXIoIGluc3BlY3Rvcl91aSwgdGl0bGVfdGV4dCwgc2NoZW1hX2Zvcl90eXBlICkgKTtcclxuXHJcblxyXG5cdFx0XHQvLyBncm91cHMuXHJcblx0XHRcdGdyb3Vwcy5mb3JFYWNoKCBmdW5jdGlvbiAoZykge1xyXG5cdFx0XHRcdHBhbmVsX2VsLmFwcGVuZENoaWxkKCBidWlsZF9ncm91cCggZywgcHJvcHNfc2NoZW1hLCBkYXRhIHx8IHt9LCB1aWQsIGN0eCApICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIEFSSUEgc3luYyBmb3IgdG9nZ2xlcyBjcmVhdGVkIGhlcmUgKGVuc3VyZSBhcmlhLWNoZWNrZWQgbWF0Y2hlcyBzdGF0ZSkuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Ly8gQ2VudHJhbGl6ZWQgVUkgbm9ybWFsaXplcnMgKHRvZ2dsZXMgKyBBMTF5KTogaGFuZGxlZCBpbiBDb3JlLlxyXG5cdFx0XHRcdFVJLmFwcGx5X3Bvc3RfcmVuZGVyKCBwYW5lbF9lbCApO1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHR3aXJlX2xlbl9ncm91cCggcGFuZWxfZWwgKTtcclxuXHRcdFx0XHRcdC8vIEluaXRpYWxpemUgQ29sb3JpcyBvbiBjb2xvciBpbnB1dHMgcmVuZGVyZWQgaW4gdGhpcyBwYW5lbC5cclxuXHRcdFx0XHRcdGluaXRfY29sb3Jpc19waWNrZXJzKCBwYW5lbF9lbCApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBfICkgeyB9XHJcblx0XHRcdH0gY2F0Y2ggKCBfICkgeyB9XHJcblxyXG5cdFx0XHRyZXR1cm4gcGFuZWxfZWw7XHJcblx0XHR9XHJcblxyXG5cdFx0VUkuV1BCQ19CRkJfSW5zcGVjdG9yX0ZhY3RvcnkgPSB7IHJlbmRlcjogZmFjdG9yeV9yZW5kZXIgfTsgICAvLyBvdmVyd3JpdGUvcmVmcmVzaFxyXG5cclxuXHRcdC8vIC0tLS0gQnVpbHQtaW4gc2xvdCArIHZhbHVlX2Zyb20gZm9yIFNlY3Rpb25zIC0tLS1cclxuXHJcblx0XHRmdW5jdGlvbiBzbG90X2xheW91dF9jaGlwcyhob3N0LCBjdHgpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHR2YXIgTCA9IHcuV1BCQ19CRkJfQ29yZSAmJiAgdy5XUEJDX0JGQl9Db3JlLlVJICYmIHcuV1BCQ19CRkJfQ29yZS5VSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHM7XHJcblx0XHRcdFx0aWYgKCBMICYmIHR5cGVvZiBMLnJlbmRlcl9mb3Jfc2VjdGlvbiA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdEwucmVuZGVyX2Zvcl9zZWN0aW9uKCBjdHguYnVpbGRlciwgY3R4LmVsLCBob3N0ICk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGhvc3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAnW2xheW91dF9jaGlwcyBub3QgYXZhaWxhYmxlXScgKSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnd3BiY19iZmJfc2xvdF9sYXlvdXRfY2hpcHMgZmFpbGVkOicsIGUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3Rvcnlfc2xvdHMubGF5b3V0X2NoaXBzID0gc2xvdF9sYXlvdXRfY2hpcHM7XHJcblxyXG5cdFx0ZnVuY3Rpb24gdmFsdWVfZnJvbV9jb21wdXRlX3NlY3Rpb25fY29sdW1ucyhjdHgpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHR2YXIgcm93ID0gY3R4ICYmIGN0eC5lbCAmJiBjdHguZWwucXVlcnlTZWxlY3RvciAmJiBjdHguZWwucXVlcnlTZWxlY3RvciggJzpzY29wZSA+IC53cGJjX2JmYl9fcm93JyApO1xyXG5cdFx0XHRcdGlmICggIXJvdyApIHJldHVybiAxO1xyXG5cdFx0XHRcdHZhciBuID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoICc6c2NvcGUgPiAud3BiY19iZmJfX2NvbHVtbicgKS5sZW5ndGggfHwgMTtcclxuXHRcdFx0XHRpZiAoIG4gPCAxICkgbiA9IDE7XHJcblx0XHRcdFx0aWYgKCBuID4gNCApIG4gPSA0O1xyXG5cdFx0XHRcdHJldHVybiBuO1xyXG5cdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHRyZXR1cm4gMTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3RvcnlfdmFsdWVfZnJvbS5jb21wdXRlX3NlY3Rpb25fY29sdW1ucyA9IHZhbHVlX2Zyb21fY29tcHV0ZV9zZWN0aW9uX2NvbHVtbnM7XHJcblx0fVxyXG5cclxuXHQvLyAzKSBJbnNwZWN0b3IgY2xhc3MuXHJcblxyXG5cdGNsYXNzIFdQQkNfQkZCX0luc3BlY3RvciB7XHJcblxyXG5cdFx0Y29uc3RydWN0b3IocGFuZWxfZWwsIGJ1aWxkZXIpIHtcclxuXHRcdFx0dGhpcy5wYW5lbCAgICAgICAgID0gcGFuZWxfZWwgfHwgdGhpcy5fY3JlYXRlX2ZhbGxiYWNrX3BhbmVsKCk7XHJcblx0XHRcdHRoaXMuYnVpbGRlciAgICAgICA9IGJ1aWxkZXI7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRfZWwgICA9IG51bGw7XHJcblx0XHRcdHRoaXMuX3JlbmRlcl90aW1lciA9IG51bGw7XHJcblxyXG5cdFx0XHR0aGlzLl9vbl9kZWxlZ2F0ZWRfaW5wdXQgID0gKGUpID0+IHRoaXMuX2FwcGx5X2NvbnRyb2xfZnJvbV9ldmVudCggZSApO1xyXG5cdFx0XHR0aGlzLl9vbl9kZWxlZ2F0ZWRfY2hhbmdlID0gKGUpID0+IHRoaXMuX2FwcGx5X2NvbnRyb2xfZnJvbV9ldmVudCggZSApO1xyXG5cdFx0XHR0aGlzLnBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoICdpbnB1dCcsIHRoaXMuX29uX2RlbGVnYXRlZF9pbnB1dCwgdHJ1ZSApO1xyXG5cdFx0XHR0aGlzLnBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCB0aGlzLl9vbl9kZWxlZ2F0ZWRfY2hhbmdlLCB0cnVlICk7XHJcblxyXG5cdFx0XHR0aGlzLl9vbl9kZWxlZ2F0ZWRfY2xpY2sgPSAoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoICdbZGF0YS1hY3Rpb25dJyApO1xyXG5cdFx0XHRcdGlmICggIWJ0biB8fCAhdGhpcy5wYW5lbC5jb250YWlucyggYnRuICkgKSByZXR1cm47XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGJ0bi5nZXRBdHRyaWJ1dGUoICdkYXRhLWFjdGlvbicgKTtcclxuXHRcdFx0XHRjb25zdCBlbCAgICAgPSB0aGlzLnNlbGVjdGVkX2VsO1xyXG5cdFx0XHRcdGlmICggIWVsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHR3LldQQkNfQkZCX0luc3BlY3Rvcl9BY3Rpb25zPy5ydW4oIGFjdGlvbiwge1xyXG5cdFx0XHRcdFx0YnVpbGRlcjogdGhpcy5idWlsZGVyLFxyXG5cdFx0XHRcdFx0ZWwsXHJcblx0XHRcdFx0XHRwYW5lbCAgOiB0aGlzLnBhbmVsLFxyXG5cdFx0XHRcdFx0ZXZlbnQgIDogZVxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0aWYgKCBhY3Rpb24gPT09ICdkZWxldGUnICkgdGhpcy5jbGVhcigpO1xyXG5cdFx0XHR9O1xyXG5cdFx0XHR0aGlzLnBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIHRoaXMuX29uX2RlbGVnYXRlZF9jbGljayApO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9wb3N0X3JlbmRlcl91aSgpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHR2YXIgVUkgPSB3LldQQkNfQkZCX0NvcmUgJiYgdy5XUEJDX0JGQl9Db3JlLlVJO1xyXG5cdFx0XHRcdGlmICggVUkgJiYgdHlwZW9mIFVJLmFwcGx5X3Bvc3RfcmVuZGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0VUkuYXBwbHlfcG9zdF9yZW5kZXIoIHRoaXMucGFuZWwgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gTkVXOiB3aXJlIHNsaWRlci9udW1iZXIvdW5pdCBzeW5jaW5nIGZvciBsZW5ndGggJiByYW5nZV9udW1iZXIgZ3JvdXBzLlxyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHR3aXJlX2xlbl9ncm91cCggdGhpcy5wYW5lbCApO1xyXG5cdFx0XHRcdFx0aW5pdF9jb2xvcmlzX3BpY2tlcnMoIHRoaXMucGFuZWwgKTtcclxuXHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cdFx0XHRcdF93cGJjPy5kZXY/LmVycm9yPy4oICdpbnNwZWN0b3IuX3Bvc3RfcmVuZGVyX3VpJywgZSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cclxuXHRcdF9hcHBseV9jb250cm9sX2Zyb21fZXZlbnQoZSkge1xyXG5cdFx0XHRpZiAoICF0aGlzLnBhbmVsLmNvbnRhaW5zKCBlLnRhcmdldCApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgdCAgID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fEhUTUxUZXh0QXJlYUVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR9ICovIChlLnRhcmdldCk7XHJcblx0XHRcdGNvbnN0IGtleSA9IHQ/LmRhdGFzZXQ/Lmluc3BlY3RvcktleTtcclxuXHRcdFx0aWYgKCAha2V5ICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgZWwgPSB0aGlzLnNlbGVjdGVkX2VsO1xyXG5cdFx0XHRpZiAoICFlbCB8fCAhZG9jdW1lbnQuYm9keS5jb250YWlucyggZWwgKSApIHJldHVybjtcclxuXHJcblx0XHRcdGxldCB2O1xyXG5cdFx0XHRpZiAoIHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIHQudHlwZSA9PT0gJ2NoZWNrYm94JyApIHtcclxuXHRcdFx0XHR2ID0gISF0LmNoZWNrZWQ7XHJcblx0XHRcdFx0dC5zZXRBdHRyaWJ1dGUoICdhcmlhLWNoZWNrZWQnLCB2ID8gJ3RydWUnIDogJ2ZhbHNlJyApOyAgICAgICAgIC8vIEtlZXAgQVJJQSBzdGF0ZSBpbiBzeW5jIGZvciB0b2dnbGVzIChzY2hlbWEgYW5kIHRlbXBsYXRlIHBhdGhzKS5cclxuXHRcdFx0fSBlbHNlIGlmICggdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgdC50eXBlID09PSAnbnVtYmVyJyApIHtcclxuXHRcdFx0XHR2ID0gKHQudmFsdWUgPT09ICcnID8gJycgOiBOdW1iZXIoIHQudmFsdWUgKSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0diA9IHQudmFsdWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICgga2V5ID09PSAnaWQnICkge1xyXG5cdFx0XHRcdGNvbnN0IHVuaXF1ZSA9IHRoaXMuYnVpbGRlcj8uaWQ/LnNldF9maWVsZF9pZD8uKCBlbCwgdiApO1xyXG5cdFx0XHRcdGlmICggdW5pcXVlICE9IG51bGwgJiYgdC52YWx1ZSAhPT0gdW5pcXVlICkgdC52YWx1ZSA9IHVuaXF1ZTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ25hbWUnICkge1xyXG5cdFx0XHRcdGNvbnN0IHVuaXF1ZSA9IHRoaXMuYnVpbGRlcj8uaWQ/LnNldF9maWVsZF9uYW1lPy4oIGVsLCB2ICk7XHJcblx0XHRcdFx0aWYgKCB1bmlxdWUgIT0gbnVsbCAmJiB0LnZhbHVlICE9PSB1bmlxdWUgKSB0LnZhbHVlID0gdW5pcXVlO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnaHRtbF9pZCcgKSB7XHJcblx0XHRcdFx0Y29uc3QgYXBwbGllZCA9IHRoaXMuYnVpbGRlcj8uaWQ/LnNldF9maWVsZF9odG1sX2lkPy4oIGVsLCB2ICk7XHJcblx0XHRcdFx0aWYgKCBhcHBsaWVkICE9IG51bGwgJiYgdC52YWx1ZSAhPT0gYXBwbGllZCApIHQudmFsdWUgPSBhcHBsaWVkO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnY29sdW1ucycgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgKSB7XHJcblx0XHRcdFx0Y29uc3Qgdl9pbnQgPSBwYXJzZUludCggU3RyaW5nKCB2ICksIDEwICk7XHJcblx0XHRcdFx0aWYgKCBOdW1iZXIuaXNGaW5pdGUoIHZfaW50ICkgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBjbGFtcGVkID0gdy5XUEJDX0JGQl9Db3JlLldQQkNfQkZCX1Nhbml0aXplLmNsYW1wKCB2X2ludCwgMSwgNCApO1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZGVyPy5zZXRfc2VjdGlvbl9jb2x1bW5zPy4oIGVsLCBjbGFtcGVkICk7XHJcblx0XHRcdFx0XHRpZiAoIFN0cmluZyggY2xhbXBlZCApICE9PSB0LnZhbHVlICkgdC52YWx1ZSA9IFN0cmluZyggY2xhbXBlZCApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aWYgKCB0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiB0LnR5cGUgPT09ICdjaGVja2JveCcgKSB7XHJcblx0XHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLScgKyBrZXksIFN0cmluZyggISF2ICkgKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiB0LnR5cGUgPT09ICdudW1iZXInICkge1xyXG5cdFx0XHRcdFx0aWYgKCB0LnZhbHVlID09PSAnJyB8fCAhTnVtYmVyLmlzRmluaXRlKCB2ICkgKSB7XHJcblx0XHRcdFx0XHRcdGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtJyArIGtleSApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKCAnZGF0YS0nICsga2V5LCBTdHJpbmcoIHYgKSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHYgPT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdGVsLnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtJyArIGtleSApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRlbC5zZXRBdHRyaWJ1dGUoICdkYXRhLScgKyBrZXksICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpID8gSlNPTi5zdHJpbmdpZnkoIHYgKSA6IFN0cmluZyggdiApICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgcHJldmlldy9vdmVybGF5XHJcblx0XHRcdGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX2ZpZWxkJyApICkge1xyXG5cdFx0XHRcdGlmICggdGhpcy5idWlsZGVyPy5wcmV2aWV3X21vZGUgKSB0aGlzLmJ1aWxkZXIucmVuZGVyX3ByZXZpZXcoIGVsICk7XHJcblx0XHRcdFx0ZWxzZSB0aGlzLmJ1aWxkZXIuYWRkX292ZXJsYXlfdG9vbGJhciggZWwgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmJ1aWxkZXIuYWRkX292ZXJsYXlfdG9vbGJhciggZWwgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9uZWVkc19yZXJlbmRlciggZWwsIGtleSwgZSApICkge1xyXG5cdFx0XHRcdHRoaXMuX3NjaGVkdWxlX3JlbmRlcl9wcmVzZXJ2aW5nX2ZvY3VzKCAwICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRfbmVlZHNfcmVyZW5kZXIoZWwsIGtleSwgX2UpIHtcclxuXHRcdFx0aWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fc2VjdGlvbicgKSAmJiBrZXkgPT09ICdjb2x1bW5zJyApIHJldHVybiB0cnVlO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0YmluZF90b19maWVsZChmaWVsZF9lbCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkX2VsID0gZmllbGRfZWw7XHJcblx0XHRcdHRoaXMucmVuZGVyKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y2xlYXIoKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRfZWwgPSBudWxsO1xyXG5cdFx0XHRpZiAoIHRoaXMuX3JlbmRlcl90aW1lciApIHtcclxuXHRcdFx0XHRjbGVhclRpbWVvdXQoIHRoaXMuX3JlbmRlcl90aW1lciApO1xyXG5cdFx0XHRcdHRoaXMuX3JlbmRlcl90aW1lciA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gQWxzbyBjbGVhciB0aGUgc2VjdGlvbi1jb2xzIGhpbnQgb24gZW1wdHkgc3RhdGUuXHJcblx0XHRcdHRoaXMucGFuZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWJmYi1zZWN0aW9uLWNvbHMnKTtcclxuXHRcdFx0dGhpcy5wYW5lbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIndwYmNfYmZiX19pbnNwZWN0b3JfX2VtcHR5XCI+U2VsZWN0IGEgZmllbGQgdG8gZWRpdCBpdHMgb3B0aW9ucy48L2Rpdj4nO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9zY2hlZHVsZV9yZW5kZXJfcHJlc2VydmluZ19mb2N1cyhkZWxheSA9IDIwMCkge1xyXG5cdFx0XHRjb25zdCBhY3RpdmUgICAgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR8SFRNTFRleHRBcmVhRWxlbWVudHxIVE1MRWxlbWVudHxudWxsfSAqLyAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XHJcblx0XHRcdGNvbnN0IGFjdGl2ZUtleSA9IGFjdGl2ZT8uZGF0YXNldD8uaW5zcGVjdG9yS2V5IHx8IG51bGw7XHJcblx0XHRcdGxldCBzZWxTdGFydCAgICA9IG51bGwsIHNlbEVuZCA9IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIGFjdGl2ZSAmJiAnc2VsZWN0aW9uU3RhcnQnIGluIGFjdGl2ZSAmJiAnc2VsZWN0aW9uRW5kJyBpbiBhY3RpdmUgKSB7XHJcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdHNlbFN0YXJ0ID0gYWN0aXZlLnNlbGVjdGlvblN0YXJ0O1xyXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRzZWxFbmQgICA9IGFjdGl2ZS5zZWxlY3Rpb25FbmQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5fcmVuZGVyX3RpbWVyICkgY2xlYXJUaW1lb3V0KCB0aGlzLl9yZW5kZXJfdGltZXIgKTtcclxuXHRcdFx0dGhpcy5fcmVuZGVyX3RpbWVyID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc2V0VGltZW91dCggKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyKCk7XHJcblx0XHRcdFx0aWYgKCBhY3RpdmVLZXkgKSB7XHJcblx0XHRcdFx0XHRjb25zdCBuZXh0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fEhUTUxUZXh0QXJlYUVsZW1lbnR8SFRNTEVsZW1lbnR8bnVsbH0gKi8gKFxyXG5cdFx0XHRcdFx0XHR0aGlzLnBhbmVsLnF1ZXJ5U2VsZWN0b3IoIGBbZGF0YS1pbnNwZWN0b3Ita2V5PVwiJHthY3RpdmVLZXl9XCJdYCApXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKCBuZXh0ICkge1xyXG5cdFx0XHRcdFx0XHRuZXh0LmZvY3VzKCk7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBzZWxTdGFydCAhPSBudWxsICYmIHNlbEVuZCAhPSBudWxsICYmIHR5cGVvZiBuZXh0LnNldFNlbGVjdGlvblJhbmdlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0XHRcdFx0bmV4dC5zZXRTZWxlY3Rpb25SYW5nZSggc2VsU3RhcnQsIHNlbEVuZCApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBjYXRjaCggZSApeyBfd3BiYz8uZGV2Py5lcnJvciggJ19yZW5kZXJfdGltZXInLCBlICk7IH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIGRlbGF5ICkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcigpIHtcclxuXHJcblx0XHRcdGNvbnN0IGVsID0gdGhpcy5zZWxlY3RlZF9lbDtcclxuXHRcdFx0aWYgKCAhZWwgfHwgIWRvY3VtZW50LmJvZHkuY29udGFpbnMoIGVsICkgKSByZXR1cm4gdGhpcy5jbGVhcigpO1xyXG5cclxuXHRcdFx0Ly8gUmVzZXQgc2VjdGlvbi1jb2xzIGhpbnQgdW5sZXNzIHdlIHNldCBpdCBsYXRlciBmb3IgYSBzZWN0aW9uLlxyXG5cdFx0XHR0aGlzLnBhbmVsLnJlbW92ZUF0dHJpYnV0ZSggJ2RhdGEtYmZiLXNlY3Rpb24tY29scycgKTtcclxuXHJcblx0XHRcdGNvbnN0IHByZXZfc2Nyb2xsID0gdGhpcy5wYW5lbC5zY3JvbGxUb3A7XHJcblxyXG5cdFx0XHQvLyBTZWN0aW9uXHJcblx0XHRcdGlmICggZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX3NlY3Rpb24nICkgKSB7XHJcblx0XHRcdFx0bGV0IHRwbCA9IG51bGw7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHRwbCA9ICh3LndwICYmIHdwLnRlbXBsYXRlICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAndG1wbC13cGJjLWJmYi1pbnNwZWN0b3Itc2VjdGlvbicgKSkgPyB3cC50ZW1wbGF0ZSggJ3dwYmMtYmZiLWluc3BlY3Rvci1zZWN0aW9uJyApIDogbnVsbDtcclxuXHRcdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0XHRcdHRwbCA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHRwbCApIHtcclxuXHRcdFx0XHRcdHRoaXMucGFuZWwuaW5uZXJIVE1MID0gdHBsKCB7fSApO1xyXG5cdFx0XHRcdFx0dGhpcy5fZW5mb3JjZV9kZWZhdWx0X2dyb3VwX29wZW4oKTtcclxuXHRcdFx0XHRcdHRoaXMuX3NldF9wYW5lbF9zZWN0aW9uX2NvbHMoIGVsICk7XHJcblx0XHRcdFx0XHR0aGlzLl9wb3N0X3JlbmRlcl91aSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5wYW5lbC5zY3JvbGxUb3AgPSBwcmV2X3Njcm9sbDtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IEZhY3RvcnkgPSB3LldQQkNfQkZCX0NvcmUuVUkgJiYgdy5XUEJDX0JGQl9Db3JlLlVJLldQQkNfQkZCX0luc3BlY3Rvcl9GYWN0b3J5O1xyXG5cdFx0XHRcdGNvbnN0IHNjaGVtYXMgPSB3LldQQkNfQkZCX1NjaGVtYXMgfHwge307XHJcblx0XHRcdFx0Y29uc3QgZW50cnkgICA9IHNjaGVtYXNbJ3NlY3Rpb24nXSB8fCBudWxsO1xyXG5cdFx0XHRcdGlmICggZW50cnkgJiYgRmFjdG9yeSApIHtcclxuXHRcdFx0XHRcdHRoaXMucGFuZWwuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdFx0XHRGYWN0b3J5LnJlbmRlcihcclxuXHRcdFx0XHRcdFx0dGhpcy5wYW5lbCxcclxuXHRcdFx0XHRcdFx0ZW50cnksXHJcblx0XHRcdFx0XHRcdHt9LFxyXG5cdFx0XHRcdFx0XHR7IGVsLCBidWlsZGVyOiB0aGlzLmJ1aWxkZXIsIHR5cGU6ICdzZWN0aW9uJywgdGl0bGU6IGVudHJ5LmxhYmVsIHx8ICdTZWN0aW9uJyB9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0dGhpcy5fZW5mb3JjZV9kZWZhdWx0X2dyb3VwX29wZW4oKTtcclxuXHJcblx0XHRcdFx0XHQvLyAtLS0gU2FmZXR5IG5ldDogaWYgZm9yIGFueSByZWFzb24gdGhlIHNsb3QgZGlkbuKAmXQgcmVuZGVyIGNoaXBzLCBpbmplY3QgdGhlbSBub3cuXHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBoYXNTbG90SG9zdCA9XHJcblx0XHRcdFx0XHRcdFx0XHQgIHRoaXMucGFuZWwucXVlcnlTZWxlY3RvciggJ1tkYXRhLWJmYi1zbG90PVwibGF5b3V0X2NoaXBzXCJdJyApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHQgIHRoaXMucGFuZWwucXVlcnlTZWxlY3RvciggJy5pbnNwZWN0b3JfX3Jvdy0tbGF5b3V0LWNoaXBzIC53cGJjX2JmYl9fbGF5b3V0X2NoaXBzJyApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHQgIHRoaXMucGFuZWwucXVlcnlTZWxlY3RvciggJyN3cGJjX2JmYl9fbGF5b3V0X2NoaXBzX2hvc3QnICk7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBoYXNDaGlwcyA9XHJcblx0XHRcdFx0XHRcdFx0XHQgICEhdGhpcy5wYW5lbC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19sYXlvdXRfY2hpcCcgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggIWhhc0NoaXBzICkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIGhvc3QgaWYgbWlzc2luZyBhbmQgcmVuZGVyIGNoaXBzIGludG8gaXQuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaG9zdCA9IChmdW5jdGlvbiBlbnN1cmVIb3N0KHJvb3QpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxldCBoID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyb290LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1iZmItc2xvdD1cImxheW91dF9jaGlwc1wiXScgKSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvb3QucXVlcnlTZWxlY3RvciggJy5pbnNwZWN0b3JfX3Jvdy0tbGF5b3V0LWNoaXBzIC53cGJjX2JmYl9fbGF5b3V0X2NoaXBzJyApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm9vdC5xdWVyeVNlbGVjdG9yKCAnI3dwYmNfYmZiX19sYXlvdXRfY2hpcHNfaG9zdCcgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggaCApIHJldHVybiBoO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgaG9zdCBpbnNpZGUgKG9yIGFmdGVyKSB0aGUg4oCcbGF5b3V04oCdIGdyb3VwXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmaWVsZHMgICAgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCAgcm9vdC5xdWVyeVNlbGVjdG9yKCAnLndwYmNfYmZiX19pbnNwZWN0b3JfX2dyb3VwW2RhdGEtZ3JvdXA9XCJsYXlvdXRcIl0gLmdyb3VwX19maWVsZHMnICkgfHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgIHJvb3QucXVlcnlTZWxlY3RvciggJy5ncm91cF9fZmllbGRzJyApIHx8IHJvb3Q7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByb3cgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0cm93LmNsYXNzTmFtZSAgID0gJ2luc3BlY3Rvcl9fcm93IGluc3BlY3Rvcl9fcm93LS1sYXlvdXQtY2hpcHMnO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbGFiICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2xhYmVsJyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0bGFiLmNsYXNzTmFtZSAgID0gJ2luc3BlY3Rvcl9fbGFiZWwnO1xyXG5cdFx0XHRcdFx0XHRcdFx0bGFiLnRleHRDb250ZW50ID0gJ0xheW91dCc7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdGwgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y3RsLmNsYXNzTmFtZSAgID0gJ2luc3BlY3Rvcl9fY29udHJvbCc7XHJcblx0XHRcdFx0XHRcdFx0XHRoICAgICAgICAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0aC5jbGFzc05hbWUgICAgID0gJ3dwYmNfYmZiX19sYXlvdXRfY2hpcHMnO1xyXG5cdFx0XHRcdFx0XHRcdFx0aC5zZXRBdHRyaWJ1dGUoICdkYXRhLWJmYi1zbG90JywgJ2xheW91dF9jaGlwcycgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGN0bC5hcHBlbmRDaGlsZCggaCApO1xyXG5cdFx0XHRcdFx0XHRcdFx0cm93LmFwcGVuZENoaWxkKCBsYWIgKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJvdy5hcHBlbmRDaGlsZCggY3RsICk7XHJcblx0XHRcdFx0XHRcdFx0XHRmaWVsZHMuYXBwZW5kQ2hpbGQoIHJvdyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGg7XHJcblx0XHRcdFx0XHRcdFx0fSkoIHRoaXMucGFuZWwgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgTCA9ICh3LldQQkNfQkZCX0NvcmUgJiYgdy5XUEJDX0JGQl9Db3JlLlVJICYmIHcuV1BCQ19CRkJfQ29yZS5VSS5XUEJDX0JGQl9MYXlvdXRfQ2hpcHMpIDtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIEwgJiYgdHlwZW9mIEwucmVuZGVyX2Zvcl9zZWN0aW9uID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aG9zdC5pbm5lckhUTUwgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRcdEwucmVuZGVyX2Zvcl9zZWN0aW9uKCB0aGlzLmJ1aWxkZXIsIGVsLCBob3N0ICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGNhdGNoKCBlICl7IF93cGJjPy5kZXY/LmVycm9yKCAnV1BCQ19CRkJfSW5zcGVjdG9yIC0gcmVuZGVyJywgZSApOyB9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fc2V0X3BhbmVsX3NlY3Rpb25fY29scyggZWwgKTtcclxuXHRcdFx0XHRcdHRoaXMucGFuZWwuc2Nyb2xsVG9wID0gcHJldl9zY3JvbGw7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLnBhbmVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2luc3BlY3Rvcl9fZW1wdHlcIj5TZWxlY3QgYSBmaWVsZCB0byBlZGl0IGl0cyBvcHRpb25zLjwvZGl2Pic7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGaWVsZFxyXG5cdFx0XHRpZiAoICFlbC5jbGFzc0xpc3QuY29udGFpbnMoICd3cGJjX2JmYl9fZmllbGQnICkgKSByZXR1cm4gdGhpcy5jbGVhcigpO1xyXG5cclxuXHRcdFx0Y29uc3QgZGF0YSA9IHcuV1BCQ19CRkJfQ29yZS5XUEJDX0Zvcm1fQnVpbGRlcl9IZWxwZXIuZ2V0X2FsbF9kYXRhX2F0dHJpYnV0ZXMoIGVsICk7XHJcblx0XHRcdGNvbnN0IHR5cGUgPSBkYXRhLnR5cGUgfHwgJ3RleHQnO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gX2dldF90cGwoaWQpIHtcclxuXHRcdFx0XHRpZiAoICF3LndwIHx8ICF3cC50ZW1wbGF0ZSApIHJldHVybiBudWxsO1xyXG5cdFx0XHRcdGlmICggIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAndG1wbC0nICsgaWQgKSApIHJldHVybiBudWxsO1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gd3AudGVtcGxhdGUoIGlkICk7XHJcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHRwbF9pZCAgICAgID0gYHdwYmMtYmZiLWluc3BlY3Rvci0ke3R5cGV9YDtcclxuXHRcdFx0Y29uc3QgdHBsICAgICAgICAgPSBfZ2V0X3RwbCggdHBsX2lkICk7XHJcblx0XHRcdGNvbnN0IGdlbmVyaWNfdHBsID0gX2dldF90cGwoICd3cGJjLWJmYi1pbnNwZWN0b3ItZ2VuZXJpYycgKTtcclxuXHJcblx0XHRcdGNvbnN0IHNjaGVtYXMgICAgICAgICA9IHcuV1BCQ19CRkJfU2NoZW1hcyB8fCB7fTtcclxuXHRcdFx0Y29uc3Qgc2NoZW1hX2Zvcl90eXBlID0gc2NoZW1hc1t0eXBlXSB8fCBudWxsO1xyXG5cdFx0XHRjb25zdCBGYWN0b3J5ICAgICAgICAgPSB3LldQQkNfQkZCX0NvcmUuVUkgJiYgdy5XUEJDX0JGQl9Db3JlLlVJLldQQkNfQkZCX0luc3BlY3Rvcl9GYWN0b3J5O1xyXG5cclxuXHRcdFx0aWYgKCB0cGwgKSB7XHJcblx0XHRcdFx0Ly8gTkVXOiBtZXJnZSBzY2hlbWEgZGVmYXVsdHMgc28gbWlzc2luZyBrZXlzIChlc3AuIGJvb2xlYW5zKSBob25vciBkZWZhdWx0cyBvbiBmaXJzdCBwYWludFxyXG5cdFx0XHRcdGNvbnN0IGhhc093biA9IEZ1bmN0aW9uLmNhbGwuYmluZCggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSApO1xyXG5cdFx0XHRcdGNvbnN0IHByb3BzICA9IChzY2hlbWFfZm9yX3R5cGUgJiYgc2NoZW1hX2Zvcl90eXBlLnNjaGVtYSAmJiBzY2hlbWFfZm9yX3R5cGUuc2NoZW1hLnByb3BzKSA/IHNjaGVtYV9mb3JfdHlwZS5zY2hlbWEucHJvcHMgOiB7fTtcclxuXHRcdFx0XHRjb25zdCBtZXJnZWQgPSB7IC4uLmRhdGEgfTtcclxuXHRcdFx0XHRpZiAoIHByb3BzICkge1xyXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoIHByb3BzICkuZm9yRWFjaCggKGspID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YSA9IHByb3BzW2tdIHx8IHt9O1xyXG5cdFx0XHRcdFx0XHRpZiAoICFoYXNPd24oIGRhdGEsIGsgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGhhc093biggbWV0YSwgJ2RlZmF1bHQnICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYSByZWFsIGJvb2xlYW47IGxlYXZlIG90aGVycyBhcy1pc1xyXG5cdFx0XHRcdFx0XHRcdFx0bWVyZ2VkW2tdID0gKG1ldGEudHlwZSA9PT0gJ2Jvb2xlYW4nKSA/ICEhbWV0YS5kZWZhdWx0IDogbWV0YS5kZWZhdWx0O1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggbWV0YS50eXBlID09PSAnYm9vbGVhbicgKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gRXhwbGljaXQgZW1wdHkgdmFsdWVzIGFyZSBsZWdhY3kgdW5jaGVja2VkIGJvb2xlYW5zLCBub3QgbWlzc2luZyBkZWZhdWx0cy5cclxuXHRcdFx0XHRcdFx0XHRtZXJnZWRba10gPSB3LldQQkNfQkZCX0NvcmUuV1BCQ19CRkJfU2FuaXRpemUuY29lcmNlX2Jvb2xlYW4oIGRhdGFba10sIGZhbHNlICk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRhdGFba10gPT09ICcnICYmIGhhc093biggbWV0YSwgJ2RlZmF1bHQnICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0bWVyZ2VkW2tdID0gbWV0YS5kZWZhdWx0O1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMucGFuZWwuaW5uZXJIVE1MID0gdHBsKCBtZXJnZWQgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5fcG9zdF9yZW5kZXJfdWkoKTtcclxuXHRcdFx0fSBlbHNlIGlmICggc2NoZW1hX2Zvcl90eXBlICYmIEZhY3RvcnkgKSB7XHJcblx0XHRcdFx0dGhpcy5wYW5lbC5pbm5lckhUTUwgPSAnJztcclxuXHRcdFx0XHRGYWN0b3J5LnJlbmRlcihcclxuXHRcdFx0XHRcdHRoaXMucGFuZWwsXHJcblx0XHRcdFx0XHRzY2hlbWFfZm9yX3R5cGUsXHJcblx0XHRcdFx0XHR7IC4uLmRhdGEgfSxcclxuXHRcdFx0XHRcdHsgZWwsIGJ1aWxkZXI6IHRoaXMuYnVpbGRlciwgdHlwZSwgdGl0bGU6IGRhdGEubGFiZWwgfHwgJycgfVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0Ly8gRW5zdXJlIHRvZ2dsZSBub3JtYWxpemVycyBhbmQgc2xpZGVyL251bWJlci91bml0IHdpcmluZyBhcmUgYXR0YWNoZWQuXHJcblx0XHRcdFx0dGhpcy5fcG9zdF9yZW5kZXJfdWkoKTtcclxuXHRcdFx0fSBlbHNlIGlmICggZ2VuZXJpY190cGwgKSB7XHJcblx0XHRcdFx0dGhpcy5wYW5lbC5pbm5lckhUTUwgPSBnZW5lcmljX3RwbCggeyAuLi5kYXRhIH0gKTtcclxuXHRcdFx0XHR0aGlzLl9wb3N0X3JlbmRlcl91aSgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtc2cgICAgICAgICAgICA9IGBUaGVyZSBhcmUgbm8gSW5zcGVjdG9yIHdwLnRlbXBsYXRlIFwiJHt0cGxfaWR9XCIgb3IgU2NoZW1hIGZvciB0aGlzIFwiJHtTdHJpbmcoIHR5cGUgfHwgJycgKX1cIiBlbGVtZW50LmA7XHJcblx0XHRcdFx0dGhpcy5wYW5lbC5pbm5lckhUTUwgPSAnJztcclxuXHRcdFx0XHRjb25zdCBkaXYgICAgICAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XHJcblx0XHRcdFx0ZGl2LmNsYXNzTmFtZSAgICAgICAgPSAnd3BiY19iZmJfX2luc3BlY3Rvcl9fZW1wdHknO1xyXG5cdFx0XHRcdGRpdi50ZXh0Q29udGVudCAgICAgID0gbXNnOyAvLyBzYWZlLlxyXG5cdFx0XHRcdHRoaXMucGFuZWwuYXBwZW5kQ2hpbGQoIGRpdiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9lbmZvcmNlX2RlZmF1bHRfZ3JvdXBfb3BlbigpO1xyXG5cdFx0XHR0aGlzLnBhbmVsLnNjcm9sbFRvcCA9IHByZXZfc2Nyb2xsO1xyXG5cdFx0fVxyXG5cclxuXHRcdF9lbmZvcmNlX2RlZmF1bHRfZ3JvdXBfb3BlbigpIHtcclxuXHRcdFx0Y29uc3QgZ3JvdXBzID0gQXJyYXkuZnJvbSggdGhpcy5wYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfYmZiX19pbnNwZWN0b3JfX2dyb3VwJyApICk7XHJcblx0XHRcdGlmICggIWdyb3Vwcy5sZW5ndGggKSByZXR1cm47XHJcblxyXG5cdFx0XHRsZXQgZm91bmQgPSBmYWxzZTtcclxuXHRcdFx0Z3JvdXBzLmZvckVhY2goIChnKSA9PiB7XHJcblx0XHRcdFx0aWYgKCAhZm91bmQgJiYgZy5jbGFzc0xpc3QuY29udGFpbnMoICdpcy1vcGVuJyApICkge1xyXG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRpZiAoIGcuY2xhc3NMaXN0LmNvbnRhaW5zKCAnaXMtb3BlbicgKSApIHtcclxuXHRcdFx0XHRcdFx0Zy5jbGFzc0xpc3QucmVtb3ZlKCAnaXMtb3BlbicgKTtcclxuXHRcdFx0XHRcdFx0Zy5kaXNwYXRjaEV2ZW50KCBuZXcgRXZlbnQoICd3cGJjOmNvbGxhcHNpYmxlOmNsb3NlJywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Zy5jbGFzc0xpc3QucmVtb3ZlKCAnaXMtb3BlbicgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGlmICggIWZvdW5kICkge1xyXG5cdFx0XHRcdGdyb3Vwc1swXS5jbGFzc0xpc3QuYWRkKCAnaXMtb3BlbicgKTtcclxuXHRcdFx0XHRncm91cHNbMF0uZGlzcGF0Y2hFdmVudCggbmV3IEV2ZW50KCAnd3BiYzpjb2xsYXBzaWJsZTpvcGVuJywgeyBidWJibGVzOiB0cnVlIH0gKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZGF0YS1iZmItc2VjdGlvbi1jb2xzIG9uIHRoZSBpbnNwZWN0b3IgcGFuZWwgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VjdGlvbi5cclxuXHRcdCAqIFVzZXMgdGhlIHJlZ2lzdGVyZWQgY29tcHV0ZSBmbiBpZiBhdmFpbGFibGU7IGZhbGxzIGJhY2sgdG8gZGlyZWN0IERPTS5cclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlY3Rpb25FbFxyXG5cdFx0ICovXHJcblx0XHRfc2V0X3BhbmVsX3NlY3Rpb25fY29scyhzZWN0aW9uRWwpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQcmVmZXIgdGhlIGFscmVhZHktcmVnaXN0ZXJlZCB2YWx1ZV9mcm9tIGhlbHBlciBpZiBwcmVzZW50LlxyXG5cdFx0XHRcdHZhciBjb21wdXRlID0gdy53cGJjX2JmYl9pbnNwZWN0b3JfZmFjdG9yeV92YWx1ZV9mcm9tICYmIHcud3BiY19iZmJfaW5zcGVjdG9yX2ZhY3RvcnlfdmFsdWVfZnJvbS5jb21wdXRlX3NlY3Rpb25fY29sdW1ucztcclxuXHJcblx0XHRcdFx0dmFyIGNvbHMgPSAxO1xyXG5cdFx0XHRcdGlmICggdHlwZW9mIGNvbXB1dGUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRjb2xzID0gY29tcHV0ZSggeyBlbDogc2VjdGlvbkVsIH0gKSB8fCAxO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBGYWxsYmFjazogY29tcHV0ZSBkaXJlY3RseSBmcm9tIHRoZSBET00uXHJcblx0XHRcdFx0XHR2YXIgcm93ID0gc2VjdGlvbkVsICYmIHNlY3Rpb25FbC5xdWVyeVNlbGVjdG9yKCAnOnNjb3BlID4gLndwYmNfYmZiX19yb3cnICk7XHJcblx0XHRcdFx0XHRjb2xzICAgID0gcm93ID8gKHJvdy5xdWVyeVNlbGVjdG9yQWxsKCAnOnNjb3BlID4gLndwYmNfYmZiX19jb2x1bW4nICkubGVuZ3RoIHx8IDEpIDogMTtcclxuXHRcdFx0XHRcdGlmICggY29scyA8IDEgKSBjb2xzID0gMTtcclxuXHRcdFx0XHRcdGlmICggY29scyA+IDQgKSBjb2xzID0gNDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5wYW5lbC5zZXRBdHRyaWJ1dGUoICdkYXRhLWJmYi1zZWN0aW9uLWNvbHMnLCBTdHJpbmcoIGNvbHMgKSApO1xyXG5cdFx0XHR9IGNhdGNoICggXyApIHtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRfY3JlYXRlX2ZhbGxiYWNrX3BhbmVsKCkge1xyXG5cdFx0XHRjb25zdCBwICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XHJcblx0XHRcdHAuaWQgICAgICAgID0gJ3dwYmNfYmZiX19pbnNwZWN0b3InO1xyXG5cdFx0XHRwLmNsYXNzTmFtZSA9ICd3cGJjX2JmYl9faW5zcGVjdG9yJztcclxuXHRcdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggcCApO1xyXG5cdFx0XHRyZXR1cm4gLyoqIEB0eXBlIHtIVE1MRGl2RWxlbWVudH0gKi8gKHApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gRXhwb3J0IGNsYXNzICsgcmVhZHkgc2lnbmFsLlxyXG5cdHcuV1BCQ19CRkJfSW5zcGVjdG9yID0gV1BCQ19CRkJfSW5zcGVjdG9yO1xyXG5cdGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCggJ3dwYmNfYmZiX2luc3BlY3Rvcl9yZWFkeScgKSApO1xyXG5cclxufSkoIHdpbmRvdyApO1xyXG4iXSwibWFwcGluZ3MiOiJhQUFBO0FBQ0E7QUFDQTtBQUNBLFVBQUFBLENBQUEsRUFDQSxhQUVBO0FB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

```
