UNPKG

infobox-parser

Version:
2 lines 92 kB
"use strict";function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}function trimWrappers(e){return e.replace(/\[\[/g,"").replace(/\]\]/g,"").replace(/\{\{/g,"").replace(/\}\}/g,"").trim()}function trimOr(e){var t=e.indexOf("|");return-1!==t?e.substring(0,t):e}function getValue(e,t){if(!e)return null;var r=e.trim().replace(/File:/,"").replace(/\{\{\d+\}\}/g,"").replace(extraPropertyPattern,"").replace(endingPattern,"");if("y"===r||"yes"===r)return!0;if("birthPlace"==t)return e.trim();var a=r.match(linksPattern);return a?a[0].split(linkSeparatorPattern).filter(function(e){return e}):trimOr(trimWrappers(r))}function dataType(e){var t=e.globalPattern,r=e.parsePattern,a=e.parse,n=e.variable,l=e.name;return function(e){var i=e.match(t);if(!i){var s;return s={},defineProperty(s,l,[]),defineProperty(s,"sourceAfter",e),s}var o=i.map(function(e){return a(e.match(r))}),u=i.reduce(function(e,t,r){return o[r]===DO_NOT_REPLACE?e:e.replace(t,"$"+n+"_"+r)},e);return{data:defineProperty({},l,o),sourceAfter:u}}}function byDataHandler(e,t){var r=e.source,a=e.context,n=t(r),l=n.data,i=n.sourceAfter;return{context:Object.assign({},a,l),source:i}}function extractData(e){return dataTypes$1.map(function(e){return e.handler}).reduce(byDataHandler,{context:{},source:e})}function findPropertyList(e){var t=e.match(keyValueGlobalPattern);return t?t.map(function(e){var t=keyValuePattern.exec(e);if(!t)return null;var r=slicedToArray(t,3),a=r[1],n=r[2],l=camelCase(a.trim());return{key:l,value:getValue(n,l)}}).filter(function(e){return e}):[]}function fillVariable(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.simplifyDataValues;if("string"!=typeof e)return console.log("Warning: Something went wrong. Could not fill variables in: ("+(void 0===e?"undefined":_typeof(e))+") "+JSON.stringify(e)),{};var n=dataTypes$1.find(function(t){return e.match(t.pattern)});if(n){var l=n.pattern.exec(e),i=slicedToArray(l,2),s=i[0],o=i[1],u=t[n.name][parseInt(o,10)];return a||"string"!=typeof u?u:e.replace(s,u)}return e}function fillVariables(e,t,r){if(void 0===e)return e;if(e instanceof Date)return e;if("number"==typeof e)return e;if(Array.isArray(e))return e.map(function(e){return fillVariables(e,t,r)});if("object"===(void 0===e?"undefined":_typeof(e)))return Object.keys(e).reduce(function(a,n){return Object.assign(a,defineProperty({},n,fillVariables(e[n],t,r)))},{});var a=fillVariable(e,t,r);return a===e?e:fillVariables(a,t,r)}function handleSmallData(e,t,r){var a=r.simplifyDataValues;if("string"==typeof e&&e.match(smallDataType.pattern)){var n=e.replace(smallDataType.pattern,"").replace(/,/,"").trim(),l=smallDataType.pattern.exec(e),i=slicedToArray(l,2),s=i[1],o=t[smallDataType.name][parseInt(s,10)],u={primary:getVariableValue(n,t,{simplifyDataValues:a}),secondary:getVariableValue(o,t,{simplifyDataValues:a})};return a?u.primary:u}return null}function getVariableValue(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.simplifyDataValues,n=handleSmallData(e,t,{simplifyDataValues:a});return n||fillVariables(e,t,{simplifyDataValues:a})}function reduceVariable(e,t,r,a){if(null===t)return null;if("boolean"==typeof t)return t;if(Array.isArray(t))return t.map(function(e){return getVariableValue(e,r,a)});if(e.match(/areaTotal/)||e.match(/population/)){var n=numberParse(t);if(!1===n&&(n=parseFloat(t,10)),!isNaN(n))return n}if(e.match(/date/i)){var l=+new Date(t);if(!isNaN(l))return new Date(t)}var i=getVariableValue(t,r,a);return Array.isArray(i)?i.map(function(e){return getVariableValue(e,r,a)}):i}function byVariableReduction(e,t){return function(r,a){var n=a.key,l=a.value,i=reduceVariable(n,l,e,t);return""===i||null===i?r:Object.assign({},r,defineProperty({},n,i))}}function extractProperties(e){var t=e.source,r=e.context,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=a.simplifyDataValues,l=void 0===n||n;return findPropertyList(t).reduce(byVariableReduction(r,{simplifyDataValues:l}),{})}function transformProperties(e){return Object.keys(e).reduce(function(t,r){var a=e[r],n=r.match(blankNamePattern);if(n){var l=n[1]||"",i=e["blank"+l+"NameSec2"],s=e["blank"+l+"InfoSec2"];return"string"!=typeof i?t:Object.assign(t,defineProperty({},camelCase(i),s))}return r.match(blankInfoPattern)?t:Object.assign(t,defineProperty({},r,a))},{})}function findOuterIndex(e){for(var t=[],r=0;r<e.length-1;r++){var a=e.substr(r,2);if("{{"!==a){if("}}"===a){t.pop();if(0===t.length)return r+2;r++}}else t.push(r),r++}}function parse(e){var t=e.match(infoBoxStartPattern);if(!t)return{data:e,sourceLeft:null};var r=t.index,a=e.substring(r),n=findOuterIndex(a);if(!n)return{data:e,sourceLeft:null};var l=a.substring(0,n),i=e.substring(n);return{data:l,sourceLeft:!i.match(infoBoxStartPattern)?null:i}}function extractInfoboxes(e){for(var t=parse(e),r=[t.data];t.sourceLeft;)t=parse(t.sourceLeft),r.push(t.data);return r}function cleanSource(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.removeSmall,a=void 0!==r&&r,n=t.removeReferences;return(void 0===n||n)&&(e=e.replace(/<ref(\s\w+=[^>]+)?>.*<\/ref>/g,"").replace(/<ref(\s\w+=[^>]+)?\s?\/>/g,"")),a&&(e=e.replace(/<small>.*<\/small>/g,"")),e.replace(/'''?/g,"").replace(/\|display=inline/g,"").replace(/<br\s?\/?>/g,",").replace(/&minus;/g,"-").replace(/{{Sndash}}/g,"–").replace(/<sup>/g,"^").replace(/\{\{sfn\|([^\}\}]+)\}\}/g,"").replace(/\{\{efn\|([^\}\}]+)\}\}/g,"").replace(/−/g,"-").replace(/<\/sup>/g,"").replace(/\{\{\s*nowrap\s*\|([^\n\}]+)\}\}/gi,"$1").replace(/\{\{\s*Avoid\swrap\s*\|([^\n\}]+)\}\}/gi,"$1").replace(/<!--([\s\S]*?)-->/g,"").replace(/&nbsp;/g," ").replace("|''See list''","")}function transformRowSpan(e){return e.map(transformCells).reduce(function(e,t,r){for(var a=0===r?0:1,n=0;n<t.length;n++)e[n+a]||(e[n+a]={}),t[n]&&(e[n+a][t[n]]=1);return e},[]).map(function(e){return Object.keys(e).join(",")}).join(" || ")}function clean(e){return e.substring(2,e.length-2).replace(linkPattern$1,function(e,t){return t.split("|")[0]}).replace(/'''?/g,"")}function parseRow(e){var t=e[0].match(/BS(\d)/),r=e[0].substring(2),a=1,n=[],l=1;for(t&&(a=t[1],r=e[0].substring(3));l<=a;l++)n.push(e[l]);return{type:r,margin:e[l++],text1:e[l++],text2:e[l++],comment:e[l++],icons:n}}function getMatches(e,t){for(var r=void 0,a=[];null!==(r=t.exec(e));)a.push({value:r[1]&&r[1].trim(),start:r.index,end:r.index+r[0].length});return a}function parseTableData(e){var t=e.match(rowPattern$1);return t?t.map(function(e){var t=e.match(rowPatternSingle);return slicedToArray(t,2)[1].trim().split("|").slice(1)}):[]}function getTables(e){var t=getMatches(e,tableStartPattern$1),r=getMatches(e,tableEndPattern$1);return t.map(function(t,a){var n=r[a];if(!n)throw new Error("[Table Parsing] Failed to pair table");return{rows:parseTableData(e.substring(t.end,n.start).trim().replace(/'''/g,"")),start:t.start,end:n.end}})}function last(e){return e.length?e[e.length-1]:void 0}function parseInfobox(e,t){var r=extractInfoboxes(e).map(function(e){return transformProperties(extractProperties(extractData(cleanSource(e,t)),t))});if(!r.length)return{};var a={general:r.shift()};return r.forEach(function(e){var t=e.type;t?a[camelCase(t)]=e:Object.assign(a,{general:Object.assign({},a.general,e)})}),a.tables=parseTables(e),a.bsTables=parseBsTables(e),a.lists=parseLists(e),a}var camelCase=_interopDefault(require("camelcase")),_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},defineProperty=function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e},slicedToArray=function(){function e(e,t){var r=[],a=!0,n=!1,l=void 0;try{for(var i,s=e[Symbol.iterator]();!(a=(i=s.next()).done)&&(r.push(i.value),!t||r.length!==t);a=!0);}catch(e){n=!0,l=e}finally{try{!a&&s.return&&s.return()}finally{if(n)throw l}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),toConsumableArray=function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)},smallGlobalPattern=/\{\{small\|([^\}\}]+)\}\}/g,smallPattern=/small\|([^\}\}]+)\}\}/,small={globalPattern:smallGlobalPattern,parsePattern:smallPattern,parse:function(e){return slicedToArray(e,2)[1]},variable:"SMALL",name:"smalls"},flagGlobalPattern=/\{\{flag\|([^\}\}]+)\}\}/g,flagPattern=/flag\|([^\}\}]+)\}\}/,flag={globalPattern:flagGlobalPattern,parsePattern:flagPattern,parse:function(e){return slicedToArray(e,2)[1]},variable:"FLAG",name:"flags"},coordsGlobalPattern=/\{\{coord\|([^\}\}]+)\}\}/g,coordsPattern=/coord\|([^\}\}]+)\}\}/,coords={globalPattern:coordsGlobalPattern,parsePattern:coordsPattern,parse:function(e){return slicedToArray(e,2)[1]},variable:"COORD",name:"coords"},globalPattern=/\[\[([^\]\|]+)\|?([^\]]+)?\]\]/g,pattern=/\[\[([^\]\|]+)\|?([^\]]+)?\]\]/,instances={globalPattern:globalPattern,parsePattern:pattern,parse:function(e){var t=slicedToArray(e,3),r=t[1],a=t[2];return r||a},variable:"INSTANCE",name:"instances"},extraPropertyPattern=/\n?\s?\|\s?\w+$/,endingPattern=/\n\}\}$/,linksPattern=/((\$\w+_\d+)\s*,?\s*){2,}/g,linkSeparatorPattern=/[,\s?]/g,listItemPrefixPattern=/^\|\s?/,unbulletedListGlobalPattern=/\{\{(?:unbulleted list|ubl|ubt|ublist|unbullet)\s?\|([^\}\}]+)\}\}/gi,unbulletedListItemPattern=/\|\s*([^|}]+)/g,unbulletedLists={globalPattern:unbulletedListGlobalPattern,parsePattern:unbulletedListItemPattern,parse:function(e){return e?e.map(function(e){return e.replace(listItemPrefixPattern,"").trim()}).filter(function(e){return e&&e.length}):[]},variable:"UNBULLETED_LIST",name:"unbulletedLists"},listItemPrefixPattern$1=/^\*\s*/,plainListGlobalPattern=/\n(\*\s*[^*|]+)+/g,plainListItemPattern=/\*\s*([^*|]+)/g,unmarkedLists={globalPattern:plainListGlobalPattern,parsePattern:plainListItemPattern,parse:function(e){return e?e.map(function(e){return e.replace(listItemPrefixPattern$1,"").trim()}).filter(function(e){return e&&e.length}):[]},variable:"UNMARKED_LIST",name:"unmarkedLists"},listItemPrefixPattern$2=/^\*\s?/,plainListGlobalPattern$1=/\{\{f?p?P?l?a?i?n?t?\s?list\s?\|([^\}\}]+)\}\}/g,plainListItemPattern$1=/\*\s*([^*}]+)/g,plainLists={globalPattern:plainListGlobalPattern$1,parsePattern:plainListItemPattern$1,parse:function(e){return e?e.map(function(e){return e.replace(listItemPrefixPattern$2,"").trim()}).filter(function(e){return e&&e.length}):[]},variable:"PLAIN_LIST",name:"plainLists"},marriageGlobalPattern=/\{\{Marriage\|([^\}\}]+)\}\}/gi,marriagePattern=/Marriage\|([^|]+)\|([^|]*)(.*)\}\}/i,marriages={globalPattern:marriageGlobalPattern,parsePattern:marriagePattern,parse:function(e){var t=slicedToArray(e,3);return{who:t[1],married:t[2]}},variable:"MARRIAGE",name:"marriages"},nbayGlobalPattern=/\{\{nbay\|([^\}\}]+)\}\}/gi,nbayPattern=/nbay\|([^|]+)\|(.*)\}\}/i,nbay={globalPattern:nbayGlobalPattern,parsePattern:nbayPattern,parse:function(e){var t=slicedToArray(e,3),r=t[1];t[2];return r},variable:"nbay",name:"nbay"},otherGlobalPattern=/\{\{([^|\n]+)\|([^|\n]+)\|?([^\}\n]+)?\}\}/g,otherPattern=/\{\{([^|\n]+)\|([^|\n]+)\|?([^\}\n]+)?\}\}/,other={globalPattern:otherGlobalPattern,parsePattern:otherPattern,parse:function(e){var t=slicedToArray(e,4),r=t[1];t[2],t[3];return r},variable:"OTHER",name:"others"},hlistGlobalPattern=/\{\{hlist\|([^\}\}]+)\}\}/gi,hlistPattern=/hlist\|(.*)\n?\}\}/i,hlist={globalPattern:hlistGlobalPattern,parsePattern:hlistPattern,parse:function(e){return e?slicedToArray(e,2)[1].split("|"):[]},variable:"HLIST",name:"hlists"},birthDateGlobalPattern=/\{\{birth\sdate([^\}\}]+)\}\}/gi,birthDatePattern=/(\d+)\|(\d+)\|(\d+)/,millisInYear=31536e6,birthDates={globalPattern:birthDateGlobalPattern,parsePattern:birthDatePattern,parse:function(e){var t=slicedToArray(e,4),r=t[1],a=t[2],n=t[3],l=new Date(r,a-1,n);return{date:l,age:Math.floor((Date.now()-+l)/millisInYear)}},variable:"BIRTH_DATE",name:"birthDates"},DO_NOT_REPLACE=Symbol("DO NOT REPLACE"),labeledDateGlobalPattern=/\{\{([^\n\}\}]+)\}\}/g,labeledDatePattern=/(.*)/,labeledDates={globalPattern:labeledDateGlobalPattern,parsePattern:labeledDatePattern,parse:function(e){var t=e[0].indexOf("|");if(t>-1){var r=e[0].substring(t+1).slice(0,-2),a=new Date(r+" GMT");if(!isNaN(a.getTime()))return{date:a};if(a=new Date(r.split("|").join("-")+" GMT"),!isNaN(a.getTime()))return{date:a}}return DO_NOT_REPLACE},variable:"LABELED_DATE",name:"labeledDates"},deathDateGlobalPattern=/\{\{death\sdate\sand\sage([^\}\}]+)\}\}/gi,deathDatePattern=/(\d+)\|(\d+)\|(\d+)\|(\d+)\|?(\d+)?\|?(\d+)?/,millisInYear$1=31536e6,deathDates={globalPattern:deathDateGlobalPattern,parsePattern:deathDatePattern,parse:function(e){var t=slicedToArray(e,7),r=t[1],a=t[2],n=t[3],l=t[4],i=t[5],s=void 0===i?0:i,o=t[6],u=void 0===o?0:o,c=new Date(r,a-1,n),f=new Date(l,s-1,u);return{date:c,age:Math.floor((Number(c)-Number(f))/millisInYear$1)}},variable:"DEATH_DATE",name:"deathDates"},URLGlobalPattern=/\{\{URL\|([^\}\}]+)\}\}/g,URLPattern=/URL\|([^\}\}]+)\}\}/,url={globalPattern:URLGlobalPattern,parsePattern:URLPattern,parse:function(e){return slicedToArray(e,2)[1]},variable:"URL",name:"urls"},websiteGlobalPattern=/\[(https?):\/\/((?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6})\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)\s+([\w\s]+)\]/g,websitePattern=/\[(https?):\/\/((?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6})\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)\s+([\w\s]+)\]/,website={globalPattern:websiteGlobalPattern,parsePattern:websitePattern,parse:function(e){var t=slicedToArray(e,5),r=t[1],a=t[2],n=t[3];return{protocol:r,hostname:a,path:n,title:t[4],url:r+"://"+a+n}},variable:"WEBSITE",name:"websites"},globalPattern$1=/\{\{Extra[^}}]+\}\}/gi,parsePattern=/\|\s?(\w+)\s+=\s+(.+)/g,propPattern=/\|\s?(\w+)\s+=\s+(.+)/,extra={globalPattern:globalPattern$1,parsePattern:parsePattern,parse:function(e){return e.reduce(function(e,t){var r=t.match(propPattern),a=slicedToArray(r,3),n=a[1],l=a[2];return e[n]=l,e},{})},variable:"EXTRA",name:"extra"},convertGlobalPattern=/\{\{convert\|([\d\.]+)\|(\w+)/g,convertPattern=/\{\{convert\|([\d\.]+)\|(\w+)/,convert={globalPattern:convertGlobalPattern,parsePattern:convertPattern,parse:function(e){var t=slicedToArray(e,3);return t[1]+" "+t[2]},variable:"CONVERT",name:"converts"},filmDatesPattern=/\{\{film\sdate([^\}\}]+)\}\}/gi,filmDatePatternGlobal=/(\d+)\|?(\d+)\|?(\d+)\|?([^\|\}]*)\|?(ref\d+=([^\|\}]*))?/g,filmDatePattern=/(\d+)\|?(\d+)\|?(\d+)\|?([^\|\}]*)\|?(ref\d+=([^\|\}]*))?/,filmDates={globalPattern:filmDatesPattern,parsePattern:filmDatePatternGlobal,parse:function(e){return e.map(function(e){var t=e.match(filmDatePattern),r=slicedToArray(t,7),a=(r[0],r[1]),n=r[2],l=r[3],i=r[4],s=(r[5],r[6]);return{date:new Date(a,n&&n-1,l),location:i,ref:s}})},variable:"FILM_DATES",name:"filmDates"},otherGlobalPattern$1=/<ref(\s\w+=[^>]+)?>(.*)<\/ref>/g,otherPattern$1=/<ref(\s\w+=[^>]+)?>(.*)<\/ref>/,attributeGlobalPattern=/(\w+)=(["\w]+)/g,attributePattern=/(\w+)=(["\w]+)/,ref1={globalPattern:otherGlobalPattern$1,parsePattern:otherPattern$1,parse:function(e){var t=slicedToArray(e,3),r=(t[0],t[1]),a=t[2];return{attributes:((r||"").match(attributeGlobalPattern)||[]).reduce(function(e,t){if(t){var r=t.match(attributePattern),a=slicedToArray(r,3),n=(a[0],a[1]),l=a[2];e[n]=l.replace(/"/g,"")}return e},{}),contents:a}},variable:"REF",name:"refs"},otherGlobalPattern$2=/<ref(\s\w+=[^>]+)?\/>/g,otherPattern$2=/<ref(\s\w+=[^>]+)?\/>/,attributeGlobalPattern$1=/(\w+)=(["\w]+)/g,attributePattern$1=/(\w+)=(["\w]+)/,ref2={globalPattern:otherGlobalPattern$2,parsePattern:otherPattern$2,parse:function(e){return{attributes:e[1].match(attributeGlobalPattern$1).reduce(function(e,t){var r=t.match(attributePattern$1),a=slicedToArray(r,3),n=(a[0],a[1]),l=a[2];return e[n]=l.replace(/"/g,""),e},{})}},variable:"REF",name:"refs"},globalPattern$2=/\{\{formatnum:\d+\}\}/gi,parsePattern$1=/\{\{formatnum:(\d+)\}\}/,formatNum={globalPattern:globalPattern$2,parsePattern:parsePattern$1,parse:function(e){var t=slicedToArray(e,2),r=t[1];return parseFloat(r)},variable:"FORMAT_NUM",name:"formatNum"},dataTypes=[instances,ref1,ref2,small,formatNum,flag,coords,marriages,birthDates,labeledDates,deathDates,unbulletedLists,website,hlist,url,convert,nbay,filmDates,other,extra,plainLists,unmarkedLists],dataTypes$1=dataTypes.map(function(e){return{handler:dataType(e),name:e.name,pattern:new RegExp("\\$"+e.variable+"_(\\d+)")}}),keyValueGlobalPattern=/\|\s*([-'\u0400-\u04FF\w\s]+)\s*=\s*([^|]+)?/g,keyValuePattern=/\|\s*([-'\u0400-\u04FF\w\s]+)\s*=\s*([^|]+)?/,numberParse=function(e){return"string"==typeof e&&(e=e.trim().replace(/ /g,""),e.match(/,/)&&e.match(/\./)?e.indexOf(",")<e.indexOf(".")?parseEnglish(e):parseSpanish(e):e.match(/,/)&&!e.match(/\./)?e.match(/,/g).length>1?parseEnglish(e):e.match(/,[0-9]{3}($|^[0-9])/)?parseEnglish(e):parseSpanish(e):!e.match(/,/)&&e.match(/\./)?e.match(/\./g).length>1?parseSpanish(e):e.match(/\.[0-9]{3}($|^[0-9])/)?parseSpanish(e):parseEnglish(e):(+e).toString()===e&&+e)},parseEnglish=function(e){return+e.replace(/,/g,"")},parseSpanish=function(e){return+e.replace(/\./g,"").replace(/,/g,".")},smallDataType=dataTypes$1.find(function(e){return"smalls"===e.name}),blankNamePattern=/blank(\d+)?NameSec2/,blankInfoPattern=/blank(\d+)?InfoSec2/,infoBoxStartPattern=/{{\w*box/,tableStartPattern=/{\|(.*)\n?/,tableEndPattern=/\n\|}/,headersPattern=/!\s?(.*)/g,rowPattern=/\|-/,cellSeparatorPattern=/(?:\n\|)|(?:\|\|)/,linkPattern=/\[\[([^\]]+)\]\]/g,linkNamePattern=/^.*\|/,inlineHeaderPattern="!!",actionPattern=/{{anchor\|(.*)}}/g,rowSpanCountPattern=/rowspan="(\d+)"/,stripLinks=function(e){return e.replace(linkPattern,function(e,t){return t.replace(linkNamePattern,"").trim()||t})},removeActions=function(e){return e.replace(actionPattern,"")},transformCell=function(e){return stripLinks(removeActions(e||"")).replace(rowSpanCountPattern,"").replace(linkNamePattern,"").trim()},transformCells=function(e){return e.split(cellSeparatorPattern).map(transformCell)},findIndex=function(e,t){var r=e.match(t);return r?r.index:-1},findTableStart=function(e){var t=e.match(tableStartPattern);return t?t.index+t[0].length:-1},findTableEnd=function(e){return findIndex(e,tableEndPattern)},getHeaders=function(e){for(var t=[],r=void 0;r=headersPattern.exec(e);)t.push.apply(t,toConsumableArray(r[1].split(inlineHeaderPattern).map(transformCell)));return t},getRows=function(e){var t=e.split(rowPattern).map(function(e){return e.replace(/^.*\n+?\|/,"").trim()}).filter(function(e){return e}),r=[],a=0,n=0,l=[],i=!0,s=!1,o=void 0;try{for(var u,c=t[Symbol.iterator]();!(i=(u=c.next()).done);i=!0){var f=u.value,p=f.match(rowSpanCountPattern);p&&(a=0,n=parseInt(p[1]),l=[]),a<n?(l.push(f),++a===n&&r.push(transformRowSpan(l))):r.push(f)}}catch(e){s=!0,o=e}finally{try{!i&&c.return&&c.return()}finally{if(s)throw o}}return r},getNextTable=function(e,t,r){var a=e,n=findTableStart(a);if(-1===n)return null;a=a.substring(n);var l=findTableEnd(a);if(-1===l)return null;a=a.substring(0,l);var i=getRows(a);if(!i.length)return null;var s=getHeaders(i[0]);return s.length?{data:i.slice(1).map(transformCells).map(function(e){return s.reduce(function(a,n,l){return a[camelCase(fillVariable(n,t,r))]=fillVariables(e[l],t,r),a},{})}),end:n+l}:null},parseTables=function(e,t){for(var r=cleanSource(e,t),a=extractData(r),n=[],l=a.source,i=null;i=getNextTable(l,a.context,t);){if(!i)return n;n.push(i.data),l=l.substring(i.end)}return n},linkPattern$1=/\[\[([^\]]+)\]\]/g,kmPattern=/{{BSkm\|([\dx]+,[\dx]+)\|([\dx]+,[\dx]+)}}/g,parseBsTables=function(e){var t=e.replace(kmPattern,"$1/$2").match(/{{BS([^}}]+)}}/g);return t?t.map(function(e){return clean(e).split("|")}).map(parseRow).filter(function(e){return"-"!==e.type[0]}):null},headingPattern=/[^=]==\s?([\w\s]+)\s?==/g,subheadingPattern=/===([\w\s]+)===/g,tableStartPattern$1=/{{list.+start.*}}/gi,tableEndPattern$1=/{{list.+end.*}}/gi,rowPattern$1=/{{(.*)}}/g,rowPatternSingle=/{{(.*)}}/,parseLists=function(e){var t=getMatches(e,headingPattern),r=getMatches(e,subheadingPattern),a=getTables(e);return a.forEach(function(e){var a=t.filter(function(t){return t.end<e.start}).map(function(e){return e.value});e.heading=last(a);var n=r.filter(function(t){return t.end<e.start}).map(function(e){return e.value});e.subheading=last(n),delete e.start,delete e.end}),a};module.exports=parseInfobox; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLm1pbi5qcyIsInNvdXJjZXMiOlsiLi4vdXRpbC9nZXRWYWx1ZS5qcyIsIi4uL2RhdGEtdHlwZXMvZGF0YVR5cGUuanMiLCIuLi91dGlsL2V4dHJhY3REYXRhLmpzIiwiLi4vdXRpbC9wcm9wZXJ0eUxpc3QuanMiLCIuLi91dGlsL2ZpbGxWYXJpYWJsZXMuanMiLCIuLi91dGlsL2V4dHJhY3RQcm9wZXJ0aWVzLmpzIiwiLi4vdXRpbC90cmFuc2Zvcm1Qcm9wZXJ0aWVzLmpzIiwiLi4vdXRpbC9leHRyYWN0SW5mb2JveGVzLmpzIiwiLi4vdXRpbC9jbGVhblNvdXJjZS5qcyIsIi4uL3V0aWwvcGFyc2VUYWJsZXMuanMiLCIuLi91dGlsL3BhcnNlQnNUYWJsZXMuanMiLCIuLi91dGlsL3BhcnNlTGlzdHMuanMiLCIuLi9pbmRleC5qcyIsIi4uL2RhdGEtdHlwZXMvc21hbGwuanMiLCIuLi9kYXRhLXR5cGVzL2ZsYWcuanMiLCIuLi9kYXRhLXR5cGVzL2Nvb3Jkcy5qcyIsIi4uL2RhdGEtdHlwZXMvaW5zdGFuY2VzLmpzIiwiLi4vZGF0YS10eXBlcy91bmJ1bGxldGVkTGlzdHMuanMiLCIuLi9kYXRhLXR5cGVzL3VubWFya2VkTGlzdHMuanMiLCIuLi9kYXRhLXR5cGVzL3BsYWluTGlzdHMuanMiLCIuLi9kYXRhLXR5cGVzL21hcnJpYWdlcy5qcyIsIi4uL2RhdGEtdHlwZXMvbmJheS5qcyIsIi4uL2RhdGEtdHlwZXMvb3RoZXIuanMiLCIuLi9kYXRhLXR5cGVzL2hsaXN0LmpzIiwiLi4vZGF0YS10eXBlcy9iaXJ0aERhdGVzLmpzIiwiLi4vZGF0YS10eXBlcy9sYWJlbGVkRGF0ZXMuanMiLCIuLi9kYXRhLXR5cGVzL2RlYXRoRGF0ZXMuanMiLCIuLi9kYXRhLXR5cGVzL3VybC5qcyIsIi4uL2RhdGEtdHlwZXMvd2Vic2l0ZS5qcyIsIi4uL2RhdGEtdHlwZXMvZXh0cmEuanMiLCIuLi9kYXRhLXR5cGVzL2NvbnZlcnQuanMiLCIuLi9kYXRhLXR5cGVzL2ZpbG1EYXRlcy5qcyIsIi4uL2RhdGEtdHlwZXMvcmVmMS5qcyIsIi4uL2RhdGEtdHlwZXMvcmVmMi5qcyIsIi4uL2RhdGEtdHlwZXMvZm9ybWF0TnVtLmpzIiwiLi4vZGF0YS10eXBlcy9pbmRleC5qcyIsIi4uL3V0aWwvbnVtYmVyUGFyc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZXh0cmFQcm9wZXJ0eVBhdHRlcm4gPSAvXFxuP1xccz9cXHxcXHM/XFx3KyQvO1xuY29uc3QgZW5kaW5nUGF0dGVybiA9IC9cXG5cXH1cXH0kLztcbmNvbnN0IGxpbmtzUGF0dGVybiA9IC8oKFxcJFxcdytfXFxkKylcXHMqLD9cXHMqKXsyLH0vZztcbmNvbnN0IGxpbmtTZXBhcmF0b3JQYXR0ZXJuID0gL1ssXFxzP10vZztcblxuZnVuY3Rpb24gdHJpbVdyYXBwZXJzKHN0cikge1xuICByZXR1cm4gc3RyXG4gICAgLnJlcGxhY2UoL1xcW1xcWy9nLCAnJylcbiAgICAucmVwbGFjZSgvXFxdXFxdL2csICcnKVxuICAgIC5yZXBsYWNlKC9cXHtcXHsvZywgJycpXG4gICAgLnJlcGxhY2UoL1xcfVxcfS9nLCAnJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiB0cmltT3Ioc3RyKSB7XG4gIGNvbnN0IG9yUG9zaXRpb24gPSBzdHIuaW5kZXhPZignfCcpO1xuICBpZiAob3JQb3NpdGlvbiAhPT0gLTEpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBvclBvc2l0aW9uKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYWx1ZShyYXcsIGtleSkge1xuICBpZiAoIXJhdykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2xlYW5zZWQgPSByYXdcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UoL0ZpbGU6LywgJycpXG4gICAgLy8gSGF2ZSBub3QgZm91bmQgcmVhc29uIGZvciB0aGlzIGJ1dCBpdCBicmVha3MgcGFyc2luZywgc28gd2UgYXJlIGp1c3RcbiAgICAvLyByZW1vdmluZyBpdCBmb3Igbm93XG4gICAgLnJlcGxhY2UoL1xce1xce1xcZCtcXH1cXH0vZywgJycpXG4gICAgLnJlcGxhY2UoZXh0cmFQcm9wZXJ0eVBhdHRlcm4sICcnKVxuICAgIC5yZXBsYWNlKGVuZGluZ1BhdHRlcm4sICcnKTtcblxuICBpZiAoY2xlYW5zZWQgPT09ICd5JyB8fCBjbGVhbnNlZCA9PT0gJ3llcycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChrZXkgPT0gJ2JpcnRoUGxhY2UnKSB7XG4gICAgcmV0dXJuIHJhdy50cmltKCk7XG4gIH1cblxuICAvLyBJcyBpdCBhIGxpc3Qgb2YgbGlua3M/P1xuICBjb25zdCBsaW5rcyA9IGNsZWFuc2VkLm1hdGNoKGxpbmtzUGF0dGVybik7XG4gIGlmIChsaW5rcykge1xuICAgIHJldHVybiBsaW5rc1swXS5zcGxpdChsaW5rU2VwYXJhdG9yUGF0dGVybikuZmlsdGVyKHRleHQgPT4gdGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJpbU9yKHRyaW1XcmFwcGVycyhjbGVhbnNlZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IERPX05PVF9SRVBMQUNFID0gU3ltYm9sKCdETyBOT1QgUkVQTEFDRScpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkYXRhVHlwZSh7XG4gIGdsb2JhbFBhdHRlcm4sXG4gIHBhcnNlUGF0dGVybixcbiAgcGFyc2UsXG4gIHZhcmlhYmxlLFxuICBuYW1lLFxufSkge1xuICByZXR1cm4gKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBzb3VyY2UubWF0Y2goZ2xvYmFsUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbbmFtZV06IFtdLFxuICAgICAgICBzb3VyY2VBZnRlcjogc291cmNlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2VzID0gbWF0Y2hlcy5tYXAoKG1hdGNoKSA9PiBwYXJzZShtYXRjaC5tYXRjaChwYXJzZVBhdHRlcm4pKSk7XG4gICAgY29uc3Qgc291cmNlQWZ0ZXIgPSBtYXRjaGVzLnJlZHVjZSgobWVtbywgbWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5zdGFuY2VzW2luZGV4XSA9PT0gRE9fTk9UX1JFUExBQ0UpIHtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVtby5yZXBsYWNlKG1hdGNoLCBgJCR7dmFyaWFibGV9XyR7aW5kZXh9YCk7XG4gICAgfSwgc291cmNlKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YToge1xuICAgICAgICBbbmFtZV06IGluc3RhbmNlcyxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VBZnRlcixcbiAgICB9O1xuICB9O1xufVxuIiwiaW1wb3J0IGRhdGFUeXBlcyBmcm9tICcuLi9kYXRhLXR5cGVzL2luZGV4JztcblxuZnVuY3Rpb24gYnlEYXRhSGFuZGxlcih7IHNvdXJjZSwgY29udGV4dCB9LCBoYW5kbGVyKSB7XG4gIGNvbnN0IHsgZGF0YSwgc291cmNlQWZ0ZXIgfSA9IGhhbmRsZXIoc291cmNlKTtcbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0OiBPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0LCBkYXRhKSxcbiAgICBzb3VyY2U6IHNvdXJjZUFmdGVyLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRyYWN0RGF0YShzb3VyY2UpIHtcbiAgcmV0dXJuIGRhdGFUeXBlc1xuICAgIC5tYXAodHlwZSA9PiB0eXBlLmhhbmRsZXIpXG4gICAgLnJlZHVjZShieURhdGFIYW5kbGVyLCB7XG4gICAgICBjb250ZXh0OiB7fSxcbiAgICAgIHNvdXJjZSxcbiAgICB9KTtcbn1cbiIsImltcG9ydCBnZXRWYWx1ZSBmcm9tICcuL2dldFZhbHVlJztcbmltcG9ydCBjYW1lbENhc2UgZnJvbSAnY2FtZWxjYXNlJztcblxuY29uc3Qga2V5VmFsdWVHbG9iYWxQYXR0ZXJuID0gL1xcfFxccyooWy0nXFx1MDQwMC1cXHUwNEZGXFx3XFxzXSspXFxzKj1cXHMqKFtefF0rKT8vZztcbmNvbnN0IGtleVZhbHVlUGF0dGVybiA9IC9cXHxcXHMqKFstJ1xcdTA0MDAtXFx1MDRGRlxcd1xcc10rKVxccyo9XFxzKihbXnxdKyk/LztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluZFByb3BlcnR5TGlzdChzb3VyY2UpIHtcbiAgY29uc3Qga2V5VmFsdWVQYWlycyA9IHNvdXJjZS5tYXRjaChrZXlWYWx1ZUdsb2JhbFBhdHRlcm4pO1xuICBpZiAoIWtleVZhbHVlUGFpcnMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGtleVZhbHVlUGFpcnNcbiAgICAubWFwKG1hdGNoID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGtleVZhbHVlUGF0dGVybi5leGVjKG1hdGNoKTtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgWywgcmF3S2V5LCByYXdWYWx1ZV0gPSByZXN1bHQ7XG4gICAgICBjb25zdCBrZXkgPSBjYW1lbENhc2UocmF3S2V5LnRyaW0oKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBnZXRWYWx1ZShyYXdWYWx1ZSwga2V5KSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbSk7XG59XG4iLCJpbXBvcnQgZGF0YVR5cGVzIGZyb20gJy4uL2RhdGEtdHlwZXMvaW5kZXgnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmlsbFZhcmlhYmxlKHZhbHVlLCBjb250ZXh0LCB7IHNpbXBsaWZ5RGF0YVZhbHVlcyB9ID0ge30pIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBXYXJuaW5nOiBTb21ldGhpbmcgd2VudCB3cm9uZy4gQ291bGQgbm90IGZpbGwgdmFyaWFibGVzIGluOiAoJHt0eXBlb2YgdmFsdWV9KSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB2YWx1ZVxuICAgICAgKX1gXG4gICAgKTtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3QgZGF0YVR5cGUgPSBkYXRhVHlwZXMuZmluZCgodHlwZSkgPT4gdmFsdWUubWF0Y2godHlwZS5wYXR0ZXJuKSk7XG4gIGlmIChkYXRhVHlwZSkge1xuICAgIGNvbnN0IFttYXRjaGVkLCBpbmRleF0gPSBkYXRhVHlwZS5wYXR0ZXJuLmV4ZWModmFsdWUpO1xuICAgIGNvbnN0IGRhdGFWYWx1ZSA9IGNvbnRleHRbZGF0YVR5cGUubmFtZV1bcGFyc2VJbnQoaW5kZXgsIDEwKV07XG4gICAgaWYgKCFzaW1wbGlmeURhdGFWYWx1ZXMgJiYgdHlwZW9mIGRhdGFWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKG1hdGNoZWQsIGRhdGFWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhVmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBSZWN1cnNpdmUgdmFyYWlibGUgZmlsbGluZy4uLiBldmVuIGhhbmRsZXMgYXJyYXlzIG9mIHZhbHVlc1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmlsbFZhcmlhYmxlcyh2YWx1ZSwgY29udGV4dCwgb3B0aW9ucykge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IGZpbGxWYXJpYWJsZXMoaXRlbSwgY29udGV4dCwgb3B0aW9ucykpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5yZWR1Y2UoKG1lbW8sIGtleSkgPT4ge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obWVtbywge1xuICAgICAgICBba2V5XTogZmlsbFZhcmlhYmxlcyh2YWx1ZVtrZXldLCBjb250ZXh0LCBvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH0sIHt9KTtcbiAgICAvLyByZXR1cm4gdmFsdWUubWFwKGl0ZW0gPT4gZmlsbFZhcmlhYmxlcyhpdGVtLCBjb250ZXh0LCBvcHRpb25zKSk7XG4gIH1cbiAgY29uc3QgZmlsbGVkID0gZmlsbFZhcmlhYmxlKHZhbHVlLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgaWYgKGZpbGxlZCA9PT0gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGZpbGxWYXJpYWJsZXMoZmlsbGVkLCBjb250ZXh0LCBvcHRpb25zKTtcbn1cbiIsImltcG9ydCBkYXRhVHlwZXMgZnJvbSAnLi4vZGF0YS10eXBlcy9pbmRleCc7XG5pbXBvcnQgZmluZFByb3BlcnR5TGlzdCBmcm9tICcuL3Byb3BlcnR5TGlzdCc7XG5pbXBvcnQgbnVtYmVyUGFyc2UgZnJvbSAnLi9udW1iZXJQYXJzZSc7XG5pbXBvcnQgZmlsbFZhcmlhYmxlcyBmcm9tICcuL2ZpbGxWYXJpYWJsZXMnO1xuXG5jb25zdCBzbWFsbERhdGFUeXBlID0gZGF0YVR5cGVzLmZpbmQoKHR5cGUpID0+IHR5cGUubmFtZSA9PT0gJ3NtYWxscycpO1xuXG5mdW5jdGlvbiBoYW5kbGVTbWFsbERhdGEodmFsdWUsIGNvbnRleHQsIHsgc2ltcGxpZnlEYXRhVmFsdWVzIH0pIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubWF0Y2goc21hbGxEYXRhVHlwZS5wYXR0ZXJuKSkge1xuICAgIGNvbnN0IHByaW1hcnkgPSB2YWx1ZVxuICAgICAgLnJlcGxhY2Uoc21hbGxEYXRhVHlwZS5wYXR0ZXJuLCAnJylcbiAgICAgIC8vIENsZWFuaW5nIHVwIGZyb20gaW5zZXJ0ZWQgY29tbWFzXG4gICAgICAucmVwbGFjZSgvLC8sICcnKVxuICAgICAgLnRyaW0oKTtcbiAgICBjb25zdCBbLCBpbmRleF0gPSBzbWFsbERhdGFUeXBlLnBhdHRlcm4uZXhlYyh2YWx1ZSk7XG4gICAgY29uc3Qgc2Vjb25kYXJ5ID0gY29udGV4dFtzbWFsbERhdGFUeXBlLm5hbWVdW3BhcnNlSW50KGluZGV4LCAxMCldO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHByaW1hcnk6IGdldFZhcmlhYmxlVmFsdWUocHJpbWFyeSwgY29udGV4dCwgeyBzaW1wbGlmeURhdGFWYWx1ZXMgfSksXG4gICAgICBzZWNvbmRhcnk6IGdldFZhcmlhYmxlVmFsdWUoc2Vjb25kYXJ5LCBjb250ZXh0LCB7IHNpbXBsaWZ5RGF0YVZhbHVlcyB9KSxcbiAgICB9O1xuICAgIHJldHVybiBzaW1wbGlmeURhdGFWYWx1ZXMgPyByZXN1bHQucHJpbWFyeSA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFyaWFibGVWYWx1ZSh2YWx1ZSwgY29udGV4dCwgeyBzaW1wbGlmeURhdGFWYWx1ZXMgfSA9IHt9KSB7XG4gIC8vIEhhbmRsaW5nIHNtYWxsIGRhdGEgZGlmZmVyZW50bHkuLi4gSSBkb250IGxpa2UgdGhpcy4uLlxuICBjb25zdCBzbWFsbERhdGEgPSBoYW5kbGVTbWFsbERhdGEodmFsdWUsIGNvbnRleHQsIHsgc2ltcGxpZnlEYXRhVmFsdWVzIH0pO1xuICBpZiAoc21hbGxEYXRhKSB7XG4gICAgcmV0dXJuIHNtYWxsRGF0YTtcbiAgfVxuICByZXR1cm4gZmlsbFZhcmlhYmxlcyh2YWx1ZSwgY29udGV4dCwgeyBzaW1wbGlmeURhdGFWYWx1ZXMgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZVZhcmlhYmxlKGtleSwgdmFsdWUsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIC8vIEZpcnN0IGFycmF5IHBhc3MuLi5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gZ2V0VmFyaWFibGVWYWx1ZShpdGVtLCBjb250ZXh0LCBvcHRpb25zKSk7XG4gIH1cbiAgaWYgKGtleS5tYXRjaCgvYXJlYVRvdGFsLykgfHwga2V5Lm1hdGNoKC9wb3B1bGF0aW9uLykpIHtcbiAgICBsZXQgZmxvYXQgPSBudW1iZXJQYXJzZSh2YWx1ZSk7XG4gICAgaWYgKGZsb2F0ID09PSBmYWxzZSkgZmxvYXQgPSBwYXJzZUZsb2F0KHZhbHVlLCAxMCk7XG4gICAgaWYgKCFpc05hTihmbG9hdCkpIHtcbiAgICAgIHJldHVybiBmbG9hdDtcbiAgICB9XG4gIH1cbiAgaWYgKGtleS5tYXRjaCgvZGF0ZS9pKSkge1xuICAgIGNvbnN0IGRhdGVWYWx1ZSA9ICtuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCFpc05hTihkYXRlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgIH1cbiAgfVxuICBjb25zdCB2YXJpYWJsZVZhbHVlID0gZ2V0VmFyaWFibGVWYWx1ZSh2YWx1ZSwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgLy8gU2Vjb25kIGFycmF5IHBhc3MuIElmIGZpcnN0IHZhcmlhYmxlIHdhcyBhbiBhcnJheSBvZiB2YXJpYWJsZXMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhYmxlVmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlVmFsdWUubWFwKChpdGVtKSA9PlxuICAgICAgZ2V0VmFyaWFibGVWYWx1ZShpdGVtLCBjb250ZXh0LCBvcHRpb25zKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHZhcmlhYmxlVmFsdWU7XG59XG5cbmZ1bmN0aW9uIGJ5VmFyaWFibGVSZWR1Y3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICByZXR1cm4gKG1lbW8sIHsga2V5LCB2YWx1ZSB9KSA9PiB7XG4gICAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZVZhcmlhYmxlKGtleSwgdmFsdWUsIGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIGlmIChyZWR1Y2VkID09PSAnJyB8fCByZWR1Y2VkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG1lbW8sIHtcbiAgICAgIFtrZXldOiByZWR1Y2VkLFxuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRyYWN0UHJvcGVydGllcyhcbiAgeyBzb3VyY2UsIGNvbnRleHQgfSxcbiAgeyBzaW1wbGlmeURhdGFWYWx1ZXMgPSB0cnVlIH0gPSB7fVxuKSB7XG4gIHJldHVybiBmaW5kUHJvcGVydHlMaXN0KHNvdXJjZSkucmVkdWNlKFxuICAgIGJ5VmFyaWFibGVSZWR1Y3Rpb24oY29udGV4dCwgeyBzaW1wbGlmeURhdGFWYWx1ZXMgfSksXG4gICAge31cbiAgKTtcbn1cbiIsIi8vIGltcG9ydCBnZXRWYWx1ZSBmcm9tICcuL2dldFZhbHVlJztcbmltcG9ydCBjYW1lbENhc2UgZnJvbSAnY2FtZWxjYXNlJztcblxuY29uc3QgYmxhbmtOYW1lUGF0dGVybiA9IC9ibGFuayhcXGQrKT9OYW1lU2VjMi87XG5jb25zdCBibGFua0luZm9QYXR0ZXJuID0gL2JsYW5rKFxcZCspP0luZm9TZWMyLztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKVxuICAgIC5yZWR1Y2UoKHRyYW5zZm9ybWVkLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllc1trZXldO1xuICAgICAgY29uc3QgbWF0Y2ggPSBrZXkubWF0Y2goYmxhbmtOYW1lUGF0dGVybik7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgaWQgPSBtYXRjaFsxXSB8fCAnJztcbiAgICAgICAgY29uc3QgYmxhbmtOYW1lID0gcHJvcGVydGllc1tgYmxhbmske2lkfU5hbWVTZWMyYF07XG4gICAgICAgIGNvbnN0IGJsYW5rSW5mbyA9IHByb3BlcnRpZXNbYGJsYW5rJHtpZH1JbmZvU2VjMmBdO1xuICAgICAgICBpZiAodHlwZW9mIGJsYW5rTmFtZSAhPT0gJ3N0cmluZycpIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odHJhbnNmb3JtZWQsIHtcbiAgICAgICAgICBbY2FtZWxDYXNlKGJsYW5rTmFtZSldOiBibGFua0luZm8sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGtleS5tYXRjaChibGFua0luZm9QYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0cmFuc2Zvcm1lZCwge1xuICAgICAgICBba2V5XTogdmFsdWUsXG4gICAgICB9KTtcbiAgICB9LCB7fSk7XG59XG4iLCJmdW5jdGlvbiBmaW5kT3V0ZXJJbmRleChzb3VyY2UpIHtcblx0bGV0IGxhc3RPcGVuID0gW107XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IG5leHRUd28gPSBzb3VyY2Uuc3Vic3RyKGksIDIpO1xuICAgIGlmIChuZXh0VHdvID09PSAne3snKSB7XG5cdFx0XHRsYXN0T3Blbi5wdXNoKGkpO1xuXHRcdFx0Ly8gTW92ZSBmb3J3YXJkLCBzbyB3ZSBkbyBub3QgY291bnQgY2xvc3VyZXMgcmlnaHQgbmV4dCB0byBlYWNoIG90aGVyXG5cdFx0XHRpKys7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG4gICAgaWYgKG5leHRUd28gPT09ICd9fScpIHtcblx0XHRcdGNvbnN0IG9wZW5BdCA9IGxhc3RPcGVuLnBvcCgpO1xuXHRcdFx0aWYgKGxhc3RPcGVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBBZGRpbmcgMiBoZXJlIGZvciB0aGUgY2xvc3VyZVxuXHRcdFx0XHRyZXR1cm4gaSArIDI7XG5cdFx0XHR9XG5cdFx0XHQvLyBNb3ZlIGZvcndhcmQsIHNvIHdlIGRvIG5vdCBjb3VudCBjbG9zdXJlcyByaWdodCBuZXh0IHRvIGVhY2ggb3RoZXJcblx0XHRcdGkrKztcblx0XHR9ICAgIFxuICB9XG59XG5cbmNvbnN0IGluZm9Cb3hTdGFydFBhdHRlcm4gPSAve3tcXHcqYm94LztcblxuZnVuY3Rpb24gcGFyc2Uoc291cmNlKSB7XG5cdGNvbnN0IHN0YXJ0TWF0Y2ggPSBzb3VyY2UubWF0Y2goaW5mb0JveFN0YXJ0UGF0dGVybik7XG5cdGlmICghc3RhcnRNYXRjaCkge1xuXHRcdC8vIE1heSBub3QgaGF2ZSBhIGEgcHJvcGVyIGluZm9ib3ggd3JhcHBlciwgbGV0J3MgdXNlIHRoZSBlbnRpcmUgc291cmNlXG5cdFx0Ly8gYnkgZGVmYXVsdFxuXHRcdHJldHVybiB7IGRhdGE6IHNvdXJjZSwgc291cmNlTGVmdDogbnVsbCB9O1xuXHR9XG5cdGNvbnN0IHN0YXJ0SW5kZXggPSBzdGFydE1hdGNoLmluZGV4O1xuXHRjb25zdCB3aXRoU3RhcnQgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpO1xuXHRjb25zdCBvdXRlckluZGV4ID0gZmluZE91dGVySW5kZXgod2l0aFN0YXJ0KTtcblx0aWYgKCFvdXRlckluZGV4KSB7XG5cdFx0cmV0dXJuIHsgZGF0YTogc291cmNlLCBzb3VyY2VMZWZ0OiBudWxsIH07XG5cdH1cblx0Y29uc3QgZGF0YSA9IHdpdGhTdGFydC5zdWJzdHJpbmcoMCwgb3V0ZXJJbmRleCk7XG5cdGNvbnN0IHNvdXJjZUxlZnQgPSBzb3VyY2Uuc3Vic3RyaW5nKG91dGVySW5kZXgpO1xuXHRjb25zdCBzb3VyY2VMZWZ0SGFzTWF0Y2ggPSAhIXNvdXJjZUxlZnQubWF0Y2goaW5mb0JveFN0YXJ0UGF0dGVybik7XG5cdHJldHVybiB7XG5cdFx0ZGF0YSxcblx0XHRzb3VyY2VMZWZ0OiBzb3VyY2VMZWZ0SGFzTWF0Y2ggPyBzb3VyY2VMZWZ0IDogbnVsbFxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHRyYWN0SW5mb2JveGVzKHNvdXJjZSkge1xuICBsZXQgcGFyc2VkID0gcGFyc2Uoc291cmNlKTtcbiAgY29uc3QgaW5mb2JveGVzID0gW3BhcnNlZC5kYXRhXTtcbiAgd2hpbGUocGFyc2VkLnNvdXJjZUxlZnQpIHtcbiAgXHRwYXJzZWQgPSBwYXJzZShwYXJzZWQuc291cmNlTGVmdCk7XG4gIFx0aW5mb2JveGVzLnB1c2gocGFyc2VkLmRhdGEpO1xuICB9XG4gIHJldHVybiBpbmZvYm94ZXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGVhblNvdXJjZShcbiAgc291cmNlLFxuICB7IHJlbW92ZVNtYWxsID0gZmFsc2UsIHJlbW92ZVJlZmVyZW5jZXMgPSB0cnVlIH0gPSB7fVxuKSB7XG4gIGlmIChyZW1vdmVSZWZlcmVuY2VzKSB7XG4gICAgc291cmNlID0gc291cmNlXG4gICAgICAucmVwbGFjZSgvPHJlZihcXHNcXHcrPVtePl0rKT8+Lio8XFwvcmVmPi9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC88cmVmKFxcc1xcdys9W14+XSspP1xccz9cXC8+L2csICcnKTtcbiAgfVxuXG4gIGlmIChyZW1vdmVTbWFsbCkge1xuICAgIHNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlKC88c21hbGw+Lio8XFwvc21hbGw+L2csICcnKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgc291cmNlXG4gICAgICAvLyBSZW1vdmUgdGlja3NcbiAgICAgIC5yZXBsYWNlKC8nJyc/L2csICcnKVxuICAgICAgLnJlcGxhY2UoL1xcfGRpc3BsYXk9aW5saW5lL2csICcnKVxuICAgICAgLy8gVGhpcyBpcyBhIGxpdHRsZSBpZmZ5XG4gICAgICAucmVwbGFjZSgvPGJyXFxzP1xcLz8+L2csICcsJylcbiAgICAgIC5yZXBsYWNlKC8mbWludXM7L2csICctJylcbiAgICAgIC5yZXBsYWNlKC97e1NuZGFzaH19L2csICfigJMnKVxuICAgICAgLnJlcGxhY2UoLzxzdXA+L2csICdeJylcbiAgICAgIC8vIFJlbW92ZSBzaG9ydGVuZWQgZm9vdG5vdGUgdGVtcGxhdGVzXG4gICAgICAucmVwbGFjZSgvXFx7XFx7c2ZuXFx8KFteXFx9XFx9XSspXFx9XFx9L2csICcnKVxuICAgICAgLy8gUmVtb3ZlIGV4cGxhbmF0b3J5IGZvb3Rub3Rlc1xuICAgICAgLnJlcGxhY2UoL1xce1xce2VmblxcfChbXlxcfVxcfV0rKVxcfVxcfS9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC/iiJIvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoLzxcXC9zdXA+L2csICcnKVxuICAgICAgLy8gUmVwbGFjZSB3cmFwIHRlbXBsYXRlcyB3aXRoIGl0cyBjb250ZW50XG4gICAgICAucmVwbGFjZSgvXFx7XFx7XFxzKm5vd3JhcFxccypcXHwoW15cXG5cXH1dKylcXH1cXH0vZ2ksICckMScpXG4gICAgICAucmVwbGFjZSgvXFx7XFx7XFxzKkF2b2lkXFxzd3JhcFxccypcXHwoW15cXG5cXH1dKylcXH1cXH0vZ2ksICckMScpXG4gICAgICAvLyBIVE1MIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvPCEtLShbXFxzXFxTXSo/KS0tPi9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC8mbmJzcDsvZywgJyAnKVxuICAgICAgLnJlcGxhY2UoXCJ8JydTZWUgbGlzdCcnXCIsICcnKVxuICApO1xufVxuIiwiaW1wb3J0IGNhbWVsY2FzZSBmcm9tICdjYW1lbGNhc2UnO1xuaW1wb3J0IGV4dHJhY3REYXRhIGZyb20gJy4vZXh0cmFjdERhdGEnO1xuaW1wb3J0IGNsZWFuU291cmNlIGZyb20gJy4vY2xlYW5Tb3VyY2UnO1xuaW1wb3J0IGZpbGxWYXJpYWJsZXMsIHsgZmlsbFZhcmlhYmxlIH0gZnJvbSAnLi9maWxsVmFyaWFibGVzJztcblxuY29uc3QgdGFibGVTdGFydFBhdHRlcm4gPSAve1xcfCguKilcXG4/LztcbmNvbnN0IHRhYmxlRW5kUGF0dGVybiA9IC9cXG5cXHx9LztcbmNvbnN0IGhlYWRlcnNQYXR0ZXJuID0gLyFcXHM/KC4qKS9nO1xuY29uc3Qgcm93UGF0dGVybiA9IC9cXHwtLztcbmNvbnN0IGNlbGxTZXBhcmF0b3JQYXR0ZXJuID0gLyg/OlxcblxcfCl8KD86XFx8XFx8KS87XG5jb25zdCBsaW5rUGF0dGVybiA9IC9cXFtcXFsoW15cXF1dKylcXF1cXF0vZztcbmNvbnN0IGxpbmtOYW1lUGF0dGVybiA9IC9eLipcXHwvO1xuY29uc3QgaW5saW5lSGVhZGVyUGF0dGVybiA9ICchISc7XG5jb25zdCBhY3Rpb25QYXR0ZXJuID0gL3t7YW5jaG9yXFx8KC4qKX19L2c7XG5jb25zdCByb3dTcGFuQ291bnRQYXR0ZXJuID0gL3Jvd3NwYW49XCIoXFxkKylcIi87XG5cbmNvbnN0IHN0cmlwTGlua3MgPSAoc291cmNlKSA9PlxuICBzb3VyY2UucmVwbGFjZShsaW5rUGF0dGVybiwgKG0sIGNhcHR1cmUpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBjYXB0dXJlLnJlcGxhY2UobGlua05hbWVQYXR0ZXJuLCAnJykudHJpbSgpO1xuICAgIHJldHVybiByZXN1bHQgfHwgY2FwdHVyZTtcbiAgfSk7XG5jb25zdCByZW1vdmVBY3Rpb25zID0gKHNvdXJjZSkgPT4gc291cmNlLnJlcGxhY2UoYWN0aW9uUGF0dGVybiwgJycpO1xuY29uc3QgdHJhbnNmb3JtQ2VsbCA9IChzb3VyY2UpID0+XG4gIHN0cmlwTGlua3MocmVtb3ZlQWN0aW9ucyhzb3VyY2UgfHwgJycpKVxuICAgIC5yZXBsYWNlKHJvd1NwYW5Db3VudFBhdHRlcm4sICcnKVxuICAgIC5yZXBsYWNlKGxpbmtOYW1lUGF0dGVybiwgJycpXG4gICAgLnRyaW0oKTtcblxuY29uc3QgdHJhbnNmb3JtQ2VsbHMgPSAocm93KSA9PlxuICByb3cuc3BsaXQoY2VsbFNlcGFyYXRvclBhdHRlcm4pLm1hcCh0cmFuc2Zvcm1DZWxsKTtcblxuY29uc3QgZmluZEluZGV4ID0gKHQsIHApID0+IHtcbiAgY29uc3QgbSA9IHQubWF0Y2gocCk7XG4gIHJldHVybiBtID8gbS5pbmRleCA6IC0xO1xufTtcblxuY29uc3QgZmluZFRhYmxlU3RhcnQgPSAoc291cmNlKSA9PiB7XG4gIGNvbnN0IG0gPSBzb3VyY2UubWF0Y2godGFibGVTdGFydFBhdHRlcm4pO1xuICByZXR1cm4gbSA/IG0uaW5kZXggKyBtWzBdLmxlbmd0aCA6IC0xO1xufTtcbmNvbnN0IGZpbmRUYWJsZUVuZCA9IChzb3VyY2UpID0+IGZpbmRJbmRleChzb3VyY2UsIHRhYmxlRW5kUGF0dGVybik7XG5cbmNvbnN0IGdldEhlYWRlcnMgPSAoc291cmNlKSA9PiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBbXTtcbiAgbGV0IG1hdGNoO1xuICB3aGlsZSAoKG1hdGNoID0gaGVhZGVyc1BhdHRlcm4uZXhlYyhzb3VyY2UpKSkge1xuICAgIGhlYWRlcnMucHVzaCguLi5tYXRjaFsxXS5zcGxpdChpbmxpbmVIZWFkZXJQYXR0ZXJuKS5tYXAodHJhbnNmb3JtQ2VsbCkpO1xuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtUm93U3Bhbihyb3dzKSB7XG4gIHJldHVybiByb3dzXG4gICAgLm1hcCh0cmFuc2Zvcm1DZWxscylcbiAgICAucmVkdWNlKChtZXJnZWQsIGNlbGxzLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgayA9IGluZGV4ID09PSAwID8gMCA6IDE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbWVyZ2VkW2kgKyBrXSkgbWVyZ2VkW2kgKyBrXSA9IHt9O1xuICAgICAgICBpZiAoY2VsbHNbaV0pIHtcbiAgICAgICAgICBtZXJnZWRbaSArIGtdW2NlbGxzW2ldXSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfSwgW10pXG4gICAgLm1hcCgobykgPT4gT2JqZWN0LmtleXMobykuam9pbignLCcpKVxuICAgIC5qb2luKCcgfHwgJyk7XG59XG5cbmNvbnN0IGdldFJvd3MgPSAoc291cmNlKSA9PiB7XG4gIGNvbnN0IHJhdyA9IHNvdXJjZVxuICAgIC5zcGxpdChyb3dQYXR0ZXJuKVxuICAgIC5tYXAoKGUpID0+IGUucmVwbGFjZSgvXi4qXFxuKz9cXHwvLCAnJykudHJpbSgpKVxuICAgIC5maWx0ZXIoKGUpID0+IGUpO1xuXG4gIGNvbnN0IHJvd3MgPSBbXTtcbiAgbGV0IHNwYW5OID0gMDtcbiAgbGV0IHNwYW5Db3VudCA9IDA7XG4gIGxldCByb3dzSW5TcGFuID0gW107XG5cbiAgZm9yIChjb25zdCByb3cgb2YgcmF3KSB7XG4gICAgY29uc3QgbWF0Y2ggPSByb3cubWF0Y2gocm93U3BhbkNvdW50UGF0dGVybik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBzcGFuTiA9IDA7XG4gICAgICBzcGFuQ291bnQgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICByb3dzSW5TcGFuID0gW107XG4gICAgfVxuICAgIGlmIChzcGFuTiA8IHNwYW5Db3VudCkge1xuICAgICAgcm93c0luU3Bhbi5wdXNoKHJvdyk7XG4gICAgICBpZiAoKytzcGFuTiA9PT0gc3BhbkNvdW50KSB7XG4gICAgICAgIHJvd3MucHVzaCh0cmFuc2Zvcm1Sb3dTcGFuKHJvd3NJblNwYW4pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcm93cy5wdXNoKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvd3M7XG59O1xuXG5jb25zdCBnZXROZXh0VGFibGUgPSAoc291cmNlLCBjb250ZXh0LCBvcHRpb25zKSA9PiB7XG4gIGxldCBsZWZ0ID0gc291cmNlO1xuICBjb25zdCBzdGFydCA9IGZpbmRUYWJsZVN0YXJ0KGxlZnQpO1xuXG4gIGlmIChzdGFydCA9PT0gLTEpIHJldHVybiBudWxsO1xuICBsZWZ0ID0gbGVmdC5zdWJzdHJpbmcoc3RhcnQpO1xuXG4gIGNvbnN0IGVuZCA9IGZpbmRUYWJsZUVuZChsZWZ0KTtcblxuICBpZiAoZW5kID09PSAtMSkgcmV0dXJuIG51bGw7XG4gIGxlZnQgPSBsZWZ0LnN1YnN0cmluZygwLCBlbmQpO1xuXG4gIGNvbnN0IHJvd3MgPSBnZXRSb3dzKGxlZnQpO1xuXG4gIGlmICghcm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKHJvd3NbMF0pO1xuXG4gIGlmICghaGVhZGVycy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGRhdGEgPSByb3dzXG4gICAgLnNsaWNlKDEpXG4gICAgLm1hcCh0cmFuc2Zvcm1DZWxscylcbiAgICAubWFwKChyb3cpID0+IHtcbiAgICAgIHJldHVybiBoZWFkZXJzLnJlZHVjZSgob2JqLCBrZXksIGluZGV4KSA9PiB7XG4gICAgICAgIG9ialtjYW1lbGNhc2UoZmlsbFZhcmlhYmxlKGtleSwgY29udGV4dCwgb3B0aW9ucykpXSA9IGZpbGxWYXJpYWJsZXMoXG4gICAgICAgICAgcm93W2luZGV4XSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0sIHt9KTtcbiAgICB9KTtcblxuICByZXR1cm4geyBkYXRhLCBlbmQ6IHN0YXJ0ICsgZW5kIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc291cmNlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNsZWFuZWRTb3VyY2UgPSBjbGVhblNvdXJjZShzb3VyY2UsIG9wdGlvbnMpO1xuICBjb25zdCBkYXRhID0gZXh0cmFjdERhdGEoY2xlYW5lZFNvdXJjZSk7XG4gIGNvbnN0IHRhYmxlcyA9IFtdO1xuICBsZXQgbGVmdCA9IGRhdGEuc291cmNlO1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgd2hpbGUgKChyZXN1bHQgPSBnZXROZXh0VGFibGUobGVmdCwgZGF0YS5jb250ZXh0LCBvcHRpb25zKSkpIHtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHRhYmxlcztcbiAgICB9XG4gICAgdGFibGVzLnB1c2gocmVzdWx0LmRhdGEpO1xuICAgIGxlZnQgPSBsZWZ0LnN1YnN0cmluZyhyZXN1bHQuZW5kKTtcbiAgfVxuICByZXR1cm4gdGFibGVzO1xufVxuIiwiY29uc3QgbGlua1BhdHRlcm4gPSAvXFxbXFxbKFteXFxdXSspXFxdXFxdL2c7XG5jb25zdCBrbVBhdHRlcm4gPSAve3tCU2ttXFx8KFtcXGR4XSssW1xcZHhdKylcXHwoW1xcZHhdKyxbXFxkeF0rKX19L2c7XG5cbmZ1bmN0aW9uIGNsZWFuKHRleHQpIHtcbiAgcmV0dXJuIHRleHRcbiAgICAuc3Vic3RyaW5nKDIsIHRleHQubGVuZ3RoIC0gMilcbiAgICAucmVwbGFjZShsaW5rUGF0dGVybiwgKG0sIHgpID0+IHguc3BsaXQoJ3wnKVswXSlcbiAgICAucmVwbGFjZSgvJycnPy9nLCAnJyk7XG59XG5cbi8vIFNvdXJjZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lraXBlZGlhOlJvdXRlX2RpYWdyYW1fdGVtcGxhdGUje3tCUy1tYXB9fV9yb3dzX3dpdGhfaWNvbnNfYW5kX3RleHRcbmZ1bmN0aW9uIHBhcnNlUm93KHJhdykge1xuICBsZXQgY291bnRNYXRjaCA9IHJhd1swXS5tYXRjaCgvQlMoXFxkKS8pO1xuICBsZXQgdHlwZSA9IHJhd1swXS5zdWJzdHJpbmcoMik7XG4gIGxldCBjb3VudCA9IDE7XG4gIGxldCBpY29ucyA9IFtdO1xuICBsZXQgaW5kZXggPSAxO1xuICBpZiAoY291bnRNYXRjaCkge1xuICAgIGNvdW50ID0gY291bnRNYXRjaFsxXTtcbiAgICB0eXBlID0gcmF3WzBdLnN1YnN0cmluZygzKTtcbiAgfVxuICBmb3IgKDsgaW5kZXggPD0gY291bnQ7IGluZGV4KyspIHtcbiAgICBpY29ucy5wdXNoKHJhd1tpbmRleF0pO1xuICB9XG4gIGNvbnN0IG1hcmdpbiA9IHJhd1tpbmRleCsrXTtcbiAgY29uc3QgdGV4dDEgPSByYXdbaW5kZXgrK107XG4gIGNvbnN0IHRleHQyID0gcmF3W2luZGV4KytdO1xuICBjb25zdCBjb21tZW50ID0gcmF3W2luZGV4KytdO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgbWFyZ2luLFxuICAgIHRleHQxLFxuICAgIHRleHQyLFxuICAgIGNvbW1lbnQsXG4gICAgaWNvbnMsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgY29uc3QgcmVzdWx0cyA9IHNvdXJjZS5yZXBsYWNlKGttUGF0dGVybiwgJyQxLyQyJykubWF0Y2goL3t7QlMoW159fV0rKX19L2cpO1xuICBpZiAocmVzdWx0cykge1xuICAgIHJldHVybiByZXN1bHRzXG4gICAgICAubWFwKChyZXN1bHQpID0+IGNsZWFuKHJlc3VsdCkuc3BsaXQoJ3wnKSlcbiAgICAgIC5tYXAocGFyc2VSb3cpXG4gICAgICAuZmlsdGVyKCh7IHR5cGUgfSkgPT4gdHlwZVswXSAhPT0gJy0nKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsImNvbnN0IGhlYWRpbmdQYXR0ZXJuID0gL1tePV09PVxccz8oW1xcd1xcc10rKVxccz89PS9nXG5jb25zdCBzdWJoZWFkaW5nUGF0dGVybiA9IC89PT0oW1xcd1xcc10rKT09PS9nXG5jb25zdCB0YWJsZVN0YXJ0UGF0dGVybiA9IC97e2xpc3QuK3N0YXJ0Lip9fS9naVxuY29uc3QgdGFibGVFbmRQYXR0ZXJuID0gL3t7bGlzdC4rZW5kLip9fS9naVxuY29uc3Qgcm93UGF0dGVybiA9IC97eyguKil9fS9nXG5jb25zdCByb3dQYXR0ZXJuU2luZ2xlID0gL3t7KC4qKX19L1xuXG5mdW5jdGlvbiBnZXRIZWFkaW5ncyh0ZXh0KSB7XG5cdGxldCBtYXRjaDtcblx0Y29uc3QgaGVhZGluZ3MgPSBbXTtcblx0d2hpbGUgKChtYXRjaCA9IGhlYWRpbmdQYXR0ZXJuLmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG5cdFx0aGVhZGluZ3MucHVzaCh7XG5cdFx0XHRoZWFkaW5nOiBtYXRjaFsxXS50cmltKCksXG5cdFx0XHRzdGFydDogbWF0Y2guaW5kZXgsXG5cdFx0XHRlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG5cdFx0fSlcblx0fVxuXHRyZXR1cm4gaGVhZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGdldFN1YmhlYWRpbmdzKHRleHQpIHtcblx0bGV0IG1hdGNoO1xuXHRjb25zdCBzdWJoZWFkaW5ncyA9IFtdO1xuXHR3aGlsZSAoKG1hdGNoID0gc3ViaGVhZGluZ1BhdHRlcm4uZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcblx0XHRzdWJoZWFkaW5ncy5wdXNoKHtcblx0XHRcdGhlYWRpbmc6IG1hdGNoWzFdLnRyaW0oKSxcblx0XHRcdHN0YXJ0OiBtYXRjaC5pbmRleCxcblx0XHRcdGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcblx0XHR9KVxuXHR9XG5cdHJldHVybiBzdWJoZWFkaW5ncztcbn1cblxuZnVuY3Rpb24gZ2V0TWF0Y2hlcyh0ZXh0LCBwYXR0ZXJuKSB7XG5cdGxldCBtYXRjaDtcblx0Y29uc3QgbWF0Y2hlcyA9IFtdO1xuXHR3aGlsZSAoKG1hdGNoID0gcGF0dGVybi5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuXHRcdG1hdGNoZXMucHVzaCh7XG5cdFx0XHR2YWx1ZTogbWF0Y2hbMV0gJiYgbWF0Y2hbMV0udHJpbSgpLFxuXHRcdFx0c3RhcnQ6IG1hdGNoLmluZGV4LFxuXHRcdFx0ZW5kOiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuXHRcdH0pXG5cdH1cblx0cmV0dXJuIG1hdGNoZXM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFibGVEYXRhKHJhdykge1xuXHRjb25zdCBtYXRjaGVzID0gcmF3Lm1hdGNoKHJvd1BhdHRlcm4pO1xuXHRpZiAoIW1hdGNoZXMpIHJldHVybiBbXTtcblx0cmV0dXJuIG1hdGNoZXMubWFwKGVsID0+IHtcblx0XHRjb25zdCBbLHRleHRdID0gZWwubWF0Y2gocm93UGF0dGVyblNpbmdsZSk7XG5cdFx0Y29uc3QgY29sdW1ucyA9IHRleHQudHJpbSgpLnNwbGl0KCd8Jyk7XG5cdFx0cmV0dXJuIGNvbHVtbnMuc2xpY2UoMSk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBnZXRUYWJsZXModGV4dCkge1xuXHRjb25zdCB0YWJsZVN0YXJ0cyA9IGdldE1hdGNoZXModGV4dCwgdGFibGVTdGFydFBhdHRlcm4pO1xuXHRjb25zdCB0YWJsZUVuZHMgPSBnZXRNYXRjaGVzKHRleHQsIHRhYmxlRW5kUGF0dGVybik7XG5cdHJldHVybiB0YWJsZVN0YXJ0cy5tYXAoKHRhYmxlU3RhcnQsIGluZGV4KSA9PiB7XG5cdFx0Y29uc3QgdGFibGVFbmQgPSB0YWJsZUVuZHNbaW5kZXhdO1xuXHRcdGlmICghdGFibGVFbmQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignW1RhYmxlIFBhcnNpbmddIEZhaWxlZCB0byBwYWlyIHRhYmxlJyk7XG5cdFx0fVxuXHRcdGNvbnN0IHJhdyA9IHRleHRcblx0XHRcdFx0LnN1YnN0cmluZyh0YWJsZVN0YXJ0LmVuZCwgdGFibGVFbmQuc3RhcnQpXG5cdFx0XHRcdC50cmltKClcblx0XHRcdFx0LnJlcGxhY2UoLycnJy9nLCAnJyk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJvd3M6IHBhcnNlVGFibGVEYXRhKHJhdyksXG5cdFx0XHRzdGFydDogdGFibGVTdGFydC5zdGFydCxcblx0XHRcdGVuZDogdGFibGVFbmQuZW5kXG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbGFzdChsaXN0KSB7XG5cdHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3RbbGlzdC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNvdXJjZSkge1xuXHRjb25zdCBoZWFkaW5ncyA9IGdldE1hdGNoZXMoc291cmNlLCBoZWFkaW5nUGF0dGVybik7XG5cdGNvbnN0IHN1YmhlYWRpbmdzID0gZ2V0TWF0Y2hlcyhzb3VyY2UsIHN1YmhlYWRpbmdQYXR0ZXJuKTtcblx0Y29uc3QgdGFibGVzID0gZ2V0VGFibGVzKHNvdXJjZSk7XG5cblx0dGFibGVzLmZvckVhY2godGFibGUgPT4ge1xuXHRcdGNvbnN0IGhlYWRpbmdzQmVmb3JlID0gaGVhZGluZ3MuZmlsdGVyKGhlYWRpbmcgPT4ge1xuXHRcdFx0cmV0dXJuIGhlYWRpbmcuZW5kIDwgdGFibGUuc3RhcnQ7XG5cdFx0fSkubWFwKGUgPT4gZS52YWx1ZSlcblx0XHR0YWJsZS5oZWFkaW5nID0gbGFzdChoZWFkaW5nc0JlZm9yZSk7XG5cdFx0Y29uc3Qgc3ViaGVhZGluZ3NCZWZvcmUgPSBzdWJoZWFkaW5ncy5maWx0ZXIoc3ViaGVhZGluZyA9PiB7XG5cdFx0XHRyZXR1cm4gc3ViaGVhZGluZy5lbmQgPCB0YWJsZS5zdGFydDtcblx0XHR9KS5tYXAoZSA9PiBlLnZhbHVlKVxuXHRcdHRhYmxlLnN1YmhlYWRpbmcgPSBsYXN0KHN1YmhlYWRpbmdzQmVmb3JlKTtcblx0XHRkZWxldGUgdGFibGUuc3RhcnQ7XG5cdFx0ZGVsZXRlIHRhYmxlLmVuZDtcblx0fSk7XG5cblx0cmV0dXJuIHRhYmxlcztcbn0iLCJpbXBvcnQgY2FtZWxDYXNlIGZyb20gJ2NhbWVsY2FzZSc7XG5pbXBvcnQgZXh0cmFjdERhdGEgZnJvbSAnLi91dGlsL2V4dHJhY3REYXRhJztcbmltcG9ydCBleHRyYWN0UHJvcGVydGllcyBmcm9tICcuL3V0aWwvZXh0cmFjdFByb3BlcnRpZXMnO1xuaW1wb3J0IHRyYW5zZm9ybVByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3RyYW5zZm9ybVByb3BlcnRpZXMnO1xuaW1wb3J0IGV4dHJhY3RJbmZvYm94ZXMgZnJvbSAnLi91dGlsL2V4dHJhY3RJbmZvYm94ZXMnO1xuaW1wb3J0IGNsZWFuU291cmNlIGZyb20gJy4vdXRpbC9jbGVhblNvdXJjZSc7XG5pbXBvcnQgcGFyc2VUYWJsZXMgZnJvbSAnLi91dGlsL3BhcnNlVGFibGVzJztcbmltcG9ydCBwYXJzZUJzVGFibGVzIGZyb20gJy4vdXRpbC9wYXJzZUJzVGFibGVzJztcbmltcG9ydCBwYXJzZUxpc3RzIGZyb20gJy4vdXRpbC9wYXJzZUxpc3RzJztcblxuLyoqXG4gKiBQYXJzZSBXaWtpIEluZm9ib3ggVGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIEluZm9ib3ggc291cmNlIHRleHRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUGFyc2luZyBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNpbXBsaWZ5RGF0YVZhbHVlcz10cnVlXSAtIE9ubHkgdXNlIHByaW1hcnkgZGF0YSB2YWx1ZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVtb3ZlU21hbGw9ZmFsc2VdIC0gUmVtb3ZlIDxzbWFsbD4uLi48L3NtYWxsPiBjaHVua3Mgb2Ygc291cmNlIGRhdGFcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVtb3ZlUmVmZXJlbmNlcz10cnVlXSAtIFJlbW92ZSA8cmVmPi4uLjwvcmVmPiBjaHVua3Mgb2Ygc291cmNlIGRhdGFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFN0cnVjdHVyZWQgaW5mb3JtYXRpb24gZnJvbSBzb3VyY2UgdGV4dFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUluZm9ib3goc291cmNlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGluZm9ib3hlcyA9IGV4dHJhY3RJbmZvYm94ZXMoc291cmNlKS5tYXAoKGluZm9ib3gpID0+IHtcbiAgICBjb25zdCBjbGVhbmVkU291cmNlID0gY2xlYW5Tb3VyY2UoaW5mb2JveCwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YSA9IGV4dHJhY3REYXRhKGNsZWFuZWRTb3VyY2UpO1xuICAgIGNvbnN0IHByb3BzID0gZXh0cmFjdFByb3BlcnRpZXMoZGF0YSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVByb3BlcnRpZXMocHJvcHMpO1xuICB9KTtcblxuICBpZiAoIWluZm9ib3hlcy5sZW5ndGgpIHJldHVybiB7fTtcblxuICBjb25zdCByZXMgPSB7XG4gICAgLy8gRmlyc3QgaW5mb2JveCBzaG91bGQgYmUgdGhlIG1haW4gb25lXG4gICAgZ2VuZXJhbDogaW5mb2JveGVzLnNoaWZ0KCksXG4gIH07XG5cbiAgaW5mb2JveGVzLmZvckVhY2goKG5leHQpID0+IHtcbiAgICBjb25zdCB0eXBlID0gbmV4dC50eXBlO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICByZXNbY2FtZWxDYXNlKHR5cGUpXSA9IG5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzLCB7XG4gICAgICAgIGdlbmVyYWw6IE9iamVjdC5hc3NpZ24oe30sIHJlcy5nZW5lcmFsLCBuZXh0KSxcbiAgICAgIH0pO1xuICAgIH1