/**
|
* table-core
|
*
|
* Copyright (c) TanStack
|
*
|
* This source code is licensed under the MIT license found in the
|
* LICENSE.md file in the root directory of this source tree.
|
*
|
* @license MIT
|
*/
|
// Is this type a tuple?
|
|
// If this type is a tuple, what indices are allowed?
|
|
///
|
|
function functionalUpdate(updater, input) {
|
return typeof updater === 'function' ? updater(input) : updater;
|
}
|
function noop() {
|
//
|
}
|
function makeStateUpdater(key, instance) {
|
return updater => {
|
instance.setState(old => {
|
return {
|
...old,
|
[key]: functionalUpdate(updater, old[key])
|
};
|
});
|
};
|
}
|
function isFunction(d) {
|
return d instanceof Function;
|
}
|
function isNumberArray(d) {
|
return Array.isArray(d) && d.every(val => typeof val === 'number');
|
}
|
function flattenBy(arr, getChildren) {
|
const flat = [];
|
const recurse = subArr => {
|
subArr.forEach(item => {
|
flat.push(item);
|
const children = getChildren(item);
|
if (children != null && children.length) {
|
recurse(children);
|
}
|
});
|
};
|
recurse(arr);
|
return flat;
|
}
|
function memo(getDeps, fn, opts) {
|
let deps = [];
|
let result;
|
return () => {
|
let depTime;
|
if (opts.key && opts.debug) depTime = Date.now();
|
const newDeps = getDeps();
|
const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
|
if (!depsChanged) {
|
return result;
|
}
|
deps = newDeps;
|
let resultTime;
|
if (opts.key && opts.debug) resultTime = Date.now();
|
result = fn(...newDeps);
|
opts == null || opts.onChange == null || opts.onChange(result);
|
if (opts.key && opts.debug) {
|
if (opts != null && opts.debug()) {
|
const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
|
const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
|
const resultFpsPercentage = resultEndTime / 16;
|
const pad = (str, num) => {
|
str = String(str);
|
while (str.length < num) {
|
str = ' ' + str;
|
}
|
return str;
|
};
|
console.info(`%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`, `
|
font-size: .6rem;
|
font-weight: bold;
|
color: hsl(${Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120))}deg 100% 31%);`, opts == null ? void 0 : opts.key);
|
}
|
}
|
return result;
|
};
|
}
|
|
function createColumn(table, columnDef, depth, parent) {
|
var _ref, _resolvedColumnDef$id;
|
const defaultColumn = table._getDefaultColumnDef();
|
const resolvedColumnDef = {
|
...defaultColumn,
|
...columnDef
|
};
|
const accessorKey = resolvedColumnDef.accessorKey;
|
let id = (_ref = (_resolvedColumnDef$id = resolvedColumnDef.id) != null ? _resolvedColumnDef$id : accessorKey ? accessorKey.replace('.', '_') : undefined) != null ? _ref : typeof resolvedColumnDef.header === 'string' ? resolvedColumnDef.header : undefined;
|
let accessorFn;
|
if (resolvedColumnDef.accessorFn) {
|
accessorFn = resolvedColumnDef.accessorFn;
|
} else if (accessorKey) {
|
// Support deep accessor keys
|
if (accessorKey.includes('.')) {
|
accessorFn = originalRow => {
|
let result = originalRow;
|
for (const key of accessorKey.split('.')) {
|
var _result;
|
result = (_result = result) == null ? void 0 : _result[key];
|
if ("development" !== 'production' && result === undefined) {
|
console.warn(`"${key}" in deeply nested key "${accessorKey}" returned undefined.`);
|
}
|
}
|
return result;
|
};
|
} else {
|
accessorFn = originalRow => originalRow[resolvedColumnDef.accessorKey];
|
}
|
}
|
if (!id) {
|
if ("development" !== 'production') {
|
throw new Error(resolvedColumnDef.accessorFn ? `Columns require an id when using an accessorFn` : `Columns require an id when using a non-string header`);
|
}
|
throw new Error();
|
}
|
let column = {
|
id: `${String(id)}`,
|
accessorFn,
|
parent: parent,
|
depth,
|
columnDef: resolvedColumnDef,
|
columns: [],
|
getFlatColumns: memo(() => [true], () => {
|
var _column$columns;
|
return [column, ...((_column$columns = column.columns) == null ? void 0 : _column$columns.flatMap(d => d.getFlatColumns()))];
|
}, {
|
key: "development" === 'production' && 'column.getFlatColumns',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugColumns;
|
}
|
}),
|
getLeafColumns: memo(() => [table._getOrderColumnsFn()], orderColumns => {
|
var _column$columns2;
|
if ((_column$columns2 = column.columns) != null && _column$columns2.length) {
|
let leafColumns = column.columns.flatMap(column => column.getLeafColumns());
|
return orderColumns(leafColumns);
|
}
|
return [column];
|
}, {
|
key: "development" === 'production' && 'column.getLeafColumns',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugColumns;
|
}
|
})
|
};
|
for (const feature of table._features) {
|
feature.createColumn == null || feature.createColumn(column, table);
|
}
|
|
// Yes, we have to convert table to uknown, because we know more than the compiler here.
|
return column;
|
}
|
|
//
|
|
function createHeader(table, column, options) {
|
var _options$id;
|
const id = (_options$id = options.id) != null ? _options$id : column.id;
|
let header = {
|
id,
|
column,
|
index: options.index,
|
isPlaceholder: !!options.isPlaceholder,
|
placeholderId: options.placeholderId,
|
depth: options.depth,
|
subHeaders: [],
|
colSpan: 0,
|
rowSpan: 0,
|
headerGroup: null,
|
getLeafHeaders: () => {
|
const leafHeaders = [];
|
const recurseHeader = h => {
|
if (h.subHeaders && h.subHeaders.length) {
|
h.subHeaders.map(recurseHeader);
|
}
|
leafHeaders.push(h);
|
};
|
recurseHeader(header);
|
return leafHeaders;
|
},
|
getContext: () => ({
|
table,
|
header: header,
|
column
|
})
|
};
|
table._features.forEach(feature => {
|
feature.createHeader == null || feature.createHeader(header, table);
|
});
|
return header;
|
}
|
const Headers = {
|
createTable: table => {
|
// Header Groups
|
|
table.getHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
|
var _left$map$filter, _right$map$filter;
|
const leftColumns = (_left$map$filter = left == null ? void 0 : left.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _left$map$filter : [];
|
const rightColumns = (_right$map$filter = right == null ? void 0 : right.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _right$map$filter : [];
|
const centerColumns = leafColumns.filter(column => !(left != null && left.includes(column.id)) && !(right != null && right.includes(column.id)));
|
const headerGroups = buildHeaderGroups(allColumns, [...leftColumns, ...centerColumns, ...rightColumns], table);
|
return headerGroups;
|
}, {
|
key: "development" === 'development' && 'getHeaderGroups',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugHeaders;
|
}
|
});
|
table.getCenterHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
|
leafColumns = leafColumns.filter(column => !(left != null && left.includes(column.id)) && !(right != null && right.includes(column.id)));
|
return buildHeaderGroups(allColumns, leafColumns, table, 'center');
|
}, {
|
key: "development" === 'development' && 'getCenterHeaderGroups',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugHeaders;
|
}
|
});
|
table.getLeftHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left], (allColumns, leafColumns, left) => {
|
var _left$map$filter2;
|
const orderedLeafColumns = (_left$map$filter2 = left == null ? void 0 : left.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _left$map$filter2 : [];
|
return buildHeaderGroups(allColumns, orderedLeafColumns, table, 'left');
|
}, {
|
key: "development" === 'development' && 'getLeftHeaderGroups',
|
debug: () => {
|
var _table$options$debugA3;
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugHeaders;
|
}
|
});
|
table.getRightHeaderGroups = memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.right], (allColumns, leafColumns, right) => {
|
var _right$map$filter2;
|
const orderedLeafColumns = (_right$map$filter2 = right == null ? void 0 : right.map(columnId => leafColumns.find(d => d.id === columnId)).filter(Boolean)) != null ? _right$map$filter2 : [];
|
return buildHeaderGroups(allColumns, orderedLeafColumns, table, 'right');
|
}, {
|
key: "development" === 'development' && 'getRightHeaderGroups',
|
debug: () => {
|
var _table$options$debugA4;
|
return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugHeaders;
|
}
|
});
|
|
// Footer Groups
|
|
table.getFooterGroups = memo(() => [table.getHeaderGroups()], headerGroups => {
|
return [...headerGroups].reverse();
|
}, {
|
key: "development" === 'development' && 'getFooterGroups',
|
debug: () => {
|
var _table$options$debugA5;
|
return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugHeaders;
|
}
|
});
|
table.getLeftFooterGroups = memo(() => [table.getLeftHeaderGroups()], headerGroups => {
|
return [...headerGroups].reverse();
|
}, {
|
key: "development" === 'development' && 'getLeftFooterGroups',
|
debug: () => {
|
var _table$options$debugA6;
|
return (_table$options$debugA6 = table.options.debugAll) != null ? _table$options$debugA6 : table.options.debugHeaders;
|
}
|
});
|
table.getCenterFooterGroups = memo(() => [table.getCenterHeaderGroups()], headerGroups => {
|
return [...headerGroups].reverse();
|
}, {
|
key: "development" === 'development' && 'getCenterFooterGroups',
|
debug: () => {
|
var _table$options$debugA7;
|
return (_table$options$debugA7 = table.options.debugAll) != null ? _table$options$debugA7 : table.options.debugHeaders;
|
}
|
});
|
table.getRightFooterGroups = memo(() => [table.getRightHeaderGroups()], headerGroups => {
|
return [...headerGroups].reverse();
|
}, {
|
key: "development" === 'development' && 'getRightFooterGroups',
|
debug: () => {
|
var _table$options$debugA8;
|
return (_table$options$debugA8 = table.options.debugAll) != null ? _table$options$debugA8 : table.options.debugHeaders;
|
}
|
});
|
|
// Flat Headers
|
|
table.getFlatHeaders = memo(() => [table.getHeaderGroups()], headerGroups => {
|
return headerGroups.map(headerGroup => {
|
return headerGroup.headers;
|
}).flat();
|
}, {
|
key: "development" === 'development' && 'getFlatHeaders',
|
debug: () => {
|
var _table$options$debugA9;
|
return (_table$options$debugA9 = table.options.debugAll) != null ? _table$options$debugA9 : table.options.debugHeaders;
|
}
|
});
|
table.getLeftFlatHeaders = memo(() => [table.getLeftHeaderGroups()], left => {
|
return left.map(headerGroup => {
|
return headerGroup.headers;
|
}).flat();
|
}, {
|
key: "development" === 'development' && 'getLeftFlatHeaders',
|
debug: () => {
|
var _table$options$debugA10;
|
return (_table$options$debugA10 = table.options.debugAll) != null ? _table$options$debugA10 : table.options.debugHeaders;
|
}
|
});
|
table.getCenterFlatHeaders = memo(() => [table.getCenterHeaderGroups()], left => {
|
return left.map(headerGroup => {
|
return headerGroup.headers;
|
}).flat();
|
}, {
|
key: "development" === 'development' && 'getCenterFlatHeaders',
|
debug: () => {
|
var _table$options$debugA11;
|
return (_table$options$debugA11 = table.options.debugAll) != null ? _table$options$debugA11 : table.options.debugHeaders;
|
}
|
});
|
table.getRightFlatHeaders = memo(() => [table.getRightHeaderGroups()], left => {
|
return left.map(headerGroup => {
|
return headerGroup.headers;
|
}).flat();
|
}, {
|
key: "development" === 'development' && 'getRightFlatHeaders',
|
debug: () => {
|
var _table$options$debugA12;
|
return (_table$options$debugA12 = table.options.debugAll) != null ? _table$options$debugA12 : table.options.debugHeaders;
|
}
|
});
|
|
// Leaf Headers
|
|
table.getCenterLeafHeaders = memo(() => [table.getCenterFlatHeaders()], flatHeaders => {
|
return flatHeaders.filter(header => {
|
var _header$subHeaders;
|
return !((_header$subHeaders = header.subHeaders) != null && _header$subHeaders.length);
|
});
|
}, {
|
key: "development" === 'development' && 'getCenterLeafHeaders',
|
debug: () => {
|
var _table$options$debugA13;
|
return (_table$options$debugA13 = table.options.debugAll) != null ? _table$options$debugA13 : table.options.debugHeaders;
|
}
|
});
|
table.getLeftLeafHeaders = memo(() => [table.getLeftFlatHeaders()], flatHeaders => {
|
return flatHeaders.filter(header => {
|
var _header$subHeaders2;
|
return !((_header$subHeaders2 = header.subHeaders) != null && _header$subHeaders2.length);
|
});
|
}, {
|
key: "development" === 'development' && 'getLeftLeafHeaders',
|
debug: () => {
|
var _table$options$debugA14;
|
return (_table$options$debugA14 = table.options.debugAll) != null ? _table$options$debugA14 : table.options.debugHeaders;
|
}
|
});
|
table.getRightLeafHeaders = memo(() => [table.getRightFlatHeaders()], flatHeaders => {
|
return flatHeaders.filter(header => {
|
var _header$subHeaders3;
|
return !((_header$subHeaders3 = header.subHeaders) != null && _header$subHeaders3.length);
|
});
|
}, {
|
key: "development" === 'development' && 'getRightLeafHeaders',
|
debug: () => {
|
var _table$options$debugA15;
|
return (_table$options$debugA15 = table.options.debugAll) != null ? _table$options$debugA15 : table.options.debugHeaders;
|
}
|
});
|
table.getLeafHeaders = memo(() => [table.getLeftHeaderGroups(), table.getCenterHeaderGroups(), table.getRightHeaderGroups()], (left, center, right) => {
|
var _left$0$headers, _left$, _center$0$headers, _center$, _right$0$headers, _right$;
|
return [...((_left$0$headers = (_left$ = left[0]) == null ? void 0 : _left$.headers) != null ? _left$0$headers : []), ...((_center$0$headers = (_center$ = center[0]) == null ? void 0 : _center$.headers) != null ? _center$0$headers : []), ...((_right$0$headers = (_right$ = right[0]) == null ? void 0 : _right$.headers) != null ? _right$0$headers : [])].map(header => {
|
return header.getLeafHeaders();
|
}).flat();
|
}, {
|
key: "development" === 'development' && 'getLeafHeaders',
|
debug: () => {
|
var _table$options$debugA16;
|
return (_table$options$debugA16 = table.options.debugAll) != null ? _table$options$debugA16 : table.options.debugHeaders;
|
}
|
});
|
}
|
};
|
function buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {
|
var _headerGroups$0$heade, _headerGroups$;
|
// Find the max depth of the columns:
|
// build the leaf column row
|
// build each buffer row going up
|
// placeholder for non-existent level
|
// real column for existing level
|
|
let maxDepth = 0;
|
const findMaxDepth = function (columns, depth) {
|
if (depth === void 0) {
|
depth = 1;
|
}
|
maxDepth = Math.max(maxDepth, depth);
|
columns.filter(column => column.getIsVisible()).forEach(column => {
|
var _column$columns;
|
if ((_column$columns = column.columns) != null && _column$columns.length) {
|
findMaxDepth(column.columns, depth + 1);
|
}
|
}, 0);
|
};
|
findMaxDepth(allColumns);
|
let headerGroups = [];
|
const createHeaderGroup = (headersToGroup, depth) => {
|
// The header group we are creating
|
const headerGroup = {
|
depth,
|
id: [headerFamily, `${depth}`].filter(Boolean).join('_'),
|
headers: []
|
};
|
|
// The parent columns we're going to scan next
|
const pendingParentHeaders = [];
|
|
// Scan each column for parents
|
headersToGroup.forEach(headerToGroup => {
|
// What is the latest (last) parent column?
|
|
const latestPendingParentHeader = [...pendingParentHeaders].reverse()[0];
|
const isLeafHeader = headerToGroup.column.depth === headerGroup.depth;
|
let column;
|
let isPlaceholder = false;
|
if (isLeafHeader && headerToGroup.column.parent) {
|
// The parent header is new
|
column = headerToGroup.column.parent;
|
} else {
|
// The parent header is repeated
|
column = headerToGroup.column;
|
isPlaceholder = true;
|
}
|
if (latestPendingParentHeader && (latestPendingParentHeader == null ? void 0 : latestPendingParentHeader.column) === column) {
|
// This column is repeated. Add it as a sub header to the next batch
|
latestPendingParentHeader.subHeaders.push(headerToGroup);
|
} else {
|
// This is a new header. Let's create it
|
const header = createHeader(table, column, {
|
id: [headerFamily, depth, column.id, headerToGroup == null ? void 0 : headerToGroup.id].filter(Boolean).join('_'),
|
isPlaceholder,
|
placeholderId: isPlaceholder ? `${pendingParentHeaders.filter(d => d.column === column).length}` : undefined,
|
depth,
|
index: pendingParentHeaders.length
|
});
|
|
// Add the headerToGroup as a subHeader of the new header
|
header.subHeaders.push(headerToGroup);
|
// Add the new header to the pendingParentHeaders to get grouped
|
// in the next batch
|
pendingParentHeaders.push(header);
|
}
|
headerGroup.headers.push(headerToGroup);
|
headerToGroup.headerGroup = headerGroup;
|
});
|
headerGroups.push(headerGroup);
|
if (depth > 0) {
|
createHeaderGroup(pendingParentHeaders, depth - 1);
|
}
|
};
|
const bottomHeaders = columnsToGroup.map((column, index) => createHeader(table, column, {
|
depth: maxDepth,
|
index
|
}));
|
createHeaderGroup(bottomHeaders, maxDepth - 1);
|
headerGroups.reverse();
|
|
// headerGroups = headerGroups.filter(headerGroup => {
|
// return !headerGroup.headers.every(header => header.isPlaceholder)
|
// })
|
|
const recurseHeadersForSpans = headers => {
|
const filteredHeaders = headers.filter(header => header.column.getIsVisible());
|
return filteredHeaders.map(header => {
|
let colSpan = 0;
|
let rowSpan = 0;
|
let childRowSpans = [0];
|
if (header.subHeaders && header.subHeaders.length) {
|
childRowSpans = [];
|
recurseHeadersForSpans(header.subHeaders).forEach(_ref => {
|
let {
|
colSpan: childColSpan,
|
rowSpan: childRowSpan
|
} = _ref;
|
colSpan += childColSpan;
|
childRowSpans.push(childRowSpan);
|
});
|
} else {
|
colSpan = 1;
|
}
|
const minChildRowSpan = Math.min(...childRowSpans);
|
rowSpan = rowSpan + minChildRowSpan;
|
header.colSpan = colSpan;
|
header.rowSpan = rowSpan;
|
return {
|
colSpan,
|
rowSpan
|
};
|
});
|
};
|
recurseHeadersForSpans((_headerGroups$0$heade = (_headerGroups$ = headerGroups[0]) == null ? void 0 : _headerGroups$.headers) != null ? _headerGroups$0$heade : []);
|
return headerGroups;
|
}
|
|
//
|
|
//
|
|
const defaultColumnSizing = {
|
size: 150,
|
minSize: 20,
|
maxSize: Number.MAX_SAFE_INTEGER
|
};
|
const getDefaultColumnSizingInfoState = () => ({
|
startOffset: null,
|
startSize: null,
|
deltaOffset: null,
|
deltaPercentage: null,
|
isResizingColumn: false,
|
columnSizingStart: []
|
});
|
const ColumnSizing = {
|
getDefaultColumnDef: () => {
|
return defaultColumnSizing;
|
},
|
getInitialState: state => {
|
return {
|
columnSizing: {},
|
columnSizingInfo: getDefaultColumnSizingInfoState(),
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
columnResizeMode: 'onEnd',
|
onColumnSizingChange: makeStateUpdater('columnSizing', table),
|
onColumnSizingInfoChange: makeStateUpdater('columnSizingInfo', table)
|
};
|
},
|
createColumn: (column, table) => {
|
column.getSize = () => {
|
var _column$columnDef$min, _ref, _column$columnDef$max;
|
const columnSize = table.getState().columnSizing[column.id];
|
return Math.min(Math.max((_column$columnDef$min = column.columnDef.minSize) != null ? _column$columnDef$min : defaultColumnSizing.minSize, (_ref = columnSize != null ? columnSize : column.columnDef.size) != null ? _ref : defaultColumnSizing.size), (_column$columnDef$max = column.columnDef.maxSize) != null ? _column$columnDef$max : defaultColumnSizing.maxSize);
|
};
|
column.getStart = position => {
|
const columns = !position ? table.getVisibleLeafColumns() : position === 'left' ? table.getLeftVisibleLeafColumns() : table.getRightVisibleLeafColumns();
|
const index = columns.findIndex(d => d.id === column.id);
|
if (index > 0) {
|
const prevSiblingColumn = columns[index - 1];
|
return prevSiblingColumn.getStart(position) + prevSiblingColumn.getSize();
|
}
|
return 0;
|
};
|
column.resetSize = () => {
|
table.setColumnSizing(_ref2 => {
|
let {
|
[column.id]: _,
|
...rest
|
} = _ref2;
|
return rest;
|
});
|
};
|
column.getCanResize = () => {
|
var _column$columnDef$ena, _table$options$enable;
|
return ((_column$columnDef$ena = column.columnDef.enableResizing) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnResizing) != null ? _table$options$enable : true);
|
};
|
column.getIsResizing = () => {
|
return table.getState().columnSizingInfo.isResizingColumn === column.id;
|
};
|
},
|
createHeader: (header, table) => {
|
header.getSize = () => {
|
let sum = 0;
|
const recurse = header => {
|
if (header.subHeaders.length) {
|
header.subHeaders.forEach(recurse);
|
} else {
|
var _header$column$getSiz;
|
sum += (_header$column$getSiz = header.column.getSize()) != null ? _header$column$getSiz : 0;
|
}
|
};
|
recurse(header);
|
return sum;
|
};
|
header.getStart = () => {
|
if (header.index > 0) {
|
const prevSiblingHeader = header.headerGroup.headers[header.index - 1];
|
return prevSiblingHeader.getStart() + prevSiblingHeader.getSize();
|
}
|
return 0;
|
};
|
header.getResizeHandler = () => {
|
const column = table.getColumn(header.column.id);
|
const canResize = column == null ? void 0 : column.getCanResize();
|
return e => {
|
if (!column || !canResize) {
|
return;
|
}
|
e.persist == null || e.persist();
|
if (isTouchStartEvent(e)) {
|
// lets not respond to multiple touches (e.g. 2 or 3 fingers)
|
if (e.touches && e.touches.length > 1) {
|
return;
|
}
|
}
|
const startSize = header.getSize();
|
const columnSizingStart = header ? header.getLeafHeaders().map(d => [d.column.id, d.column.getSize()]) : [[column.id, column.getSize()]];
|
const clientX = isTouchStartEvent(e) ? Math.round(e.touches[0].clientX) : e.clientX;
|
const newColumnSizing = {};
|
const updateOffset = (eventType, clientXPos) => {
|
if (typeof clientXPos !== 'number') {
|
return;
|
}
|
table.setColumnSizingInfo(old => {
|
var _old$startOffset, _old$startSize;
|
const deltaOffset = clientXPos - ((_old$startOffset = old == null ? void 0 : old.startOffset) != null ? _old$startOffset : 0);
|
const deltaPercentage = Math.max(deltaOffset / ((_old$startSize = old == null ? void 0 : old.startSize) != null ? _old$startSize : 0), -0.999999);
|
old.columnSizingStart.forEach(_ref3 => {
|
let [columnId, headerSize] = _ref3;
|
newColumnSizing[columnId] = Math.round(Math.max(headerSize + headerSize * deltaPercentage, 0) * 100) / 100;
|
});
|
return {
|
...old,
|
deltaOffset,
|
deltaPercentage
|
};
|
});
|
if (table.options.columnResizeMode === 'onChange' || eventType === 'end') {
|
table.setColumnSizing(old => ({
|
...old,
|
...newColumnSizing
|
}));
|
}
|
};
|
const onMove = clientXPos => updateOffset('move', clientXPos);
|
const onEnd = clientXPos => {
|
updateOffset('end', clientXPos);
|
table.setColumnSizingInfo(old => ({
|
...old,
|
isResizingColumn: false,
|
startOffset: null,
|
startSize: null,
|
deltaOffset: null,
|
deltaPercentage: null,
|
columnSizingStart: []
|
}));
|
};
|
const mouseEvents = {
|
moveHandler: e => onMove(e.clientX),
|
upHandler: e => {
|
document.removeEventListener('mousemove', mouseEvents.moveHandler);
|
document.removeEventListener('mouseup', mouseEvents.upHandler);
|
onEnd(e.clientX);
|
}
|
};
|
const touchEvents = {
|
moveHandler: e => {
|
if (e.cancelable) {
|
e.preventDefault();
|
e.stopPropagation();
|
}
|
onMove(e.touches[0].clientX);
|
return false;
|
},
|
upHandler: e => {
|
var _e$touches$;
|
document.removeEventListener('touchmove', touchEvents.moveHandler);
|
document.removeEventListener('touchend', touchEvents.upHandler);
|
if (e.cancelable) {
|
e.preventDefault();
|
e.stopPropagation();
|
}
|
onEnd((_e$touches$ = e.touches[0]) == null ? void 0 : _e$touches$.clientX);
|
}
|
};
|
const passiveIfSupported = passiveEventSupported() ? {
|
passive: false
|
} : false;
|
if (isTouchStartEvent(e)) {
|
document.addEventListener('touchmove', touchEvents.moveHandler, passiveIfSupported);
|
document.addEventListener('touchend', touchEvents.upHandler, passiveIfSupported);
|
} else {
|
document.addEventListener('mousemove', mouseEvents.moveHandler, passiveIfSupported);
|
document.addEventListener('mouseup', mouseEvents.upHandler, passiveIfSupported);
|
}
|
table.setColumnSizingInfo(old => ({
|
...old,
|
startOffset: clientX,
|
startSize,
|
deltaOffset: 0,
|
deltaPercentage: 0,
|
columnSizingStart,
|
isResizingColumn: column.id
|
}));
|
};
|
};
|
},
|
createTable: table => {
|
table.setColumnSizing = updater => table.options.onColumnSizingChange == null ? void 0 : table.options.onColumnSizingChange(updater);
|
table.setColumnSizingInfo = updater => table.options.onColumnSizingInfoChange == null ? void 0 : table.options.onColumnSizingInfoChange(updater);
|
table.resetColumnSizing = defaultState => {
|
var _table$initialState$c;
|
table.setColumnSizing(defaultState ? {} : (_table$initialState$c = table.initialState.columnSizing) != null ? _table$initialState$c : {});
|
};
|
table.resetHeaderSizeInfo = defaultState => {
|
var _table$initialState$c2;
|
table.setColumnSizingInfo(defaultState ? getDefaultColumnSizingInfoState() : (_table$initialState$c2 = table.initialState.columnSizingInfo) != null ? _table$initialState$c2 : getDefaultColumnSizingInfoState());
|
};
|
table.getTotalSize = () => {
|
var _table$getHeaderGroup, _table$getHeaderGroup2;
|
return (_table$getHeaderGroup = (_table$getHeaderGroup2 = table.getHeaderGroups()[0]) == null ? void 0 : _table$getHeaderGroup2.headers.reduce((sum, header) => {
|
return sum + header.getSize();
|
}, 0)) != null ? _table$getHeaderGroup : 0;
|
};
|
table.getLeftTotalSize = () => {
|
var _table$getLeftHeaderG, _table$getLeftHeaderG2;
|
return (_table$getLeftHeaderG = (_table$getLeftHeaderG2 = table.getLeftHeaderGroups()[0]) == null ? void 0 : _table$getLeftHeaderG2.headers.reduce((sum, header) => {
|
return sum + header.getSize();
|
}, 0)) != null ? _table$getLeftHeaderG : 0;
|
};
|
table.getCenterTotalSize = () => {
|
var _table$getCenterHeade, _table$getCenterHeade2;
|
return (_table$getCenterHeade = (_table$getCenterHeade2 = table.getCenterHeaderGroups()[0]) == null ? void 0 : _table$getCenterHeade2.headers.reduce((sum, header) => {
|
return sum + header.getSize();
|
}, 0)) != null ? _table$getCenterHeade : 0;
|
};
|
table.getRightTotalSize = () => {
|
var _table$getRightHeader, _table$getRightHeader2;
|
return (_table$getRightHeader = (_table$getRightHeader2 = table.getRightHeaderGroups()[0]) == null ? void 0 : _table$getRightHeader2.headers.reduce((sum, header) => {
|
return sum + header.getSize();
|
}, 0)) != null ? _table$getRightHeader : 0;
|
};
|
}
|
};
|
let passiveSupported = null;
|
function passiveEventSupported() {
|
if (typeof passiveSupported === 'boolean') return passiveSupported;
|
let supported = false;
|
try {
|
const options = {
|
get passive() {
|
supported = true;
|
return false;
|
}
|
};
|
const noop = () => {};
|
window.addEventListener('test', noop, options);
|
window.removeEventListener('test', noop);
|
} catch (err) {
|
supported = false;
|
}
|
passiveSupported = supported;
|
return passiveSupported;
|
}
|
function isTouchStartEvent(e) {
|
return e.type === 'touchstart';
|
}
|
|
//
|
|
const Expanding = {
|
getInitialState: state => {
|
return {
|
expanded: {},
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onExpandedChange: makeStateUpdater('expanded', table),
|
paginateExpandedRows: true
|
};
|
},
|
createTable: table => {
|
let registered = false;
|
let queued = false;
|
table._autoResetExpanded = () => {
|
var _ref, _table$options$autoRe;
|
if (!registered) {
|
table._queue(() => {
|
registered = true;
|
});
|
return;
|
}
|
if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetExpanded) != null ? _ref : !table.options.manualExpanding) {
|
if (queued) return;
|
queued = true;
|
table._queue(() => {
|
table.resetExpanded();
|
queued = false;
|
});
|
}
|
};
|
table.setExpanded = updater => table.options.onExpandedChange == null ? void 0 : table.options.onExpandedChange(updater);
|
table.toggleAllRowsExpanded = expanded => {
|
if (expanded != null ? expanded : !table.getIsAllRowsExpanded()) {
|
table.setExpanded(true);
|
} else {
|
table.setExpanded({});
|
}
|
};
|
table.resetExpanded = defaultState => {
|
var _table$initialState$e, _table$initialState;
|
table.setExpanded(defaultState ? {} : (_table$initialState$e = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.expanded) != null ? _table$initialState$e : {});
|
};
|
table.getCanSomeRowsExpand = () => {
|
return table.getPrePaginationRowModel().flatRows.some(row => row.getCanExpand());
|
};
|
table.getToggleAllRowsExpandedHandler = () => {
|
return e => {
|
e.persist == null || e.persist();
|
table.toggleAllRowsExpanded();
|
};
|
};
|
table.getIsSomeRowsExpanded = () => {
|
const expanded = table.getState().expanded;
|
return expanded === true || Object.values(expanded).some(Boolean);
|
};
|
table.getIsAllRowsExpanded = () => {
|
const expanded = table.getState().expanded;
|
|
// If expanded is true, save some cycles and return true
|
if (typeof expanded === 'boolean') {
|
return expanded === true;
|
}
|
if (!Object.keys(expanded).length) {
|
return false;
|
}
|
|
// If any row is not expanded, return false
|
if (table.getRowModel().flatRows.some(row => !row.getIsExpanded())) {
|
return false;
|
}
|
|
// They must all be expanded :shrug:
|
return true;
|
};
|
table.getExpandedDepth = () => {
|
let maxDepth = 0;
|
const rowIds = table.getState().expanded === true ? Object.keys(table.getRowModel().rowsById) : Object.keys(table.getState().expanded);
|
rowIds.forEach(id => {
|
const splitId = id.split('.');
|
maxDepth = Math.max(maxDepth, splitId.length);
|
});
|
return maxDepth;
|
};
|
table.getPreExpandedRowModel = () => table.getSortedRowModel();
|
table.getExpandedRowModel = () => {
|
if (!table._getExpandedRowModel && table.options.getExpandedRowModel) {
|
table._getExpandedRowModel = table.options.getExpandedRowModel(table);
|
}
|
if (table.options.manualExpanding || !table._getExpandedRowModel) {
|
return table.getPreExpandedRowModel();
|
}
|
return table._getExpandedRowModel();
|
};
|
},
|
createRow: (row, table) => {
|
row.toggleExpanded = expanded => {
|
table.setExpanded(old => {
|
var _expanded;
|
const exists = old === true ? true : !!(old != null && old[row.id]);
|
let oldExpanded = {};
|
if (old === true) {
|
Object.keys(table.getRowModel().rowsById).forEach(rowId => {
|
oldExpanded[rowId] = true;
|
});
|
} else {
|
oldExpanded = old;
|
}
|
expanded = (_expanded = expanded) != null ? _expanded : !exists;
|
if (!exists && expanded) {
|
return {
|
...oldExpanded,
|
[row.id]: true
|
};
|
}
|
if (exists && !expanded) {
|
const {
|
[row.id]: _,
|
...rest
|
} = oldExpanded;
|
return rest;
|
}
|
return old;
|
});
|
};
|
row.getIsExpanded = () => {
|
var _table$options$getIsR;
|
const expanded = table.getState().expanded;
|
return !!((_table$options$getIsR = table.options.getIsRowExpanded == null ? void 0 : table.options.getIsRowExpanded(row)) != null ? _table$options$getIsR : expanded === true || (expanded == null ? void 0 : expanded[row.id]));
|
};
|
row.getCanExpand = () => {
|
var _table$options$getRow, _table$options$enable, _row$subRows;
|
return (_table$options$getRow = table.options.getRowCanExpand == null ? void 0 : table.options.getRowCanExpand(row)) != null ? _table$options$getRow : ((_table$options$enable = table.options.enableExpanding) != null ? _table$options$enable : true) && !!((_row$subRows = row.subRows) != null && _row$subRows.length);
|
};
|
row.getIsAllParentsExpanded = () => {
|
let isFullyExpanded = true;
|
let currentRow = row;
|
while (isFullyExpanded && currentRow.parentId) {
|
currentRow = table.getRow(currentRow.parentId, true);
|
isFullyExpanded = currentRow.getIsExpanded();
|
}
|
return isFullyExpanded;
|
};
|
row.getToggleExpandedHandler = () => {
|
const canExpand = row.getCanExpand();
|
return () => {
|
if (!canExpand) return;
|
row.toggleExpanded();
|
};
|
};
|
}
|
};
|
|
const includesString = (row, columnId, filterValue) => {
|
var _row$getValue;
|
const search = filterValue.toLowerCase();
|
return Boolean((_row$getValue = row.getValue(columnId)) == null || (_row$getValue = _row$getValue.toString()) == null || (_row$getValue = _row$getValue.toLowerCase()) == null ? void 0 : _row$getValue.includes(search));
|
};
|
includesString.autoRemove = val => testFalsey(val);
|
const includesStringSensitive = (row, columnId, filterValue) => {
|
var _row$getValue2;
|
return Boolean((_row$getValue2 = row.getValue(columnId)) == null || (_row$getValue2 = _row$getValue2.toString()) == null ? void 0 : _row$getValue2.includes(filterValue));
|
};
|
includesStringSensitive.autoRemove = val => testFalsey(val);
|
const equalsString = (row, columnId, filterValue) => {
|
var _row$getValue3;
|
return ((_row$getValue3 = row.getValue(columnId)) == null || (_row$getValue3 = _row$getValue3.toString()) == null ? void 0 : _row$getValue3.toLowerCase()) === (filterValue == null ? void 0 : filterValue.toLowerCase());
|
};
|
equalsString.autoRemove = val => testFalsey(val);
|
const arrIncludes = (row, columnId, filterValue) => {
|
var _row$getValue4;
|
return (_row$getValue4 = row.getValue(columnId)) == null ? void 0 : _row$getValue4.includes(filterValue);
|
};
|
arrIncludes.autoRemove = val => testFalsey(val) || !(val != null && val.length);
|
const arrIncludesAll = (row, columnId, filterValue) => {
|
return !filterValue.some(val => {
|
var _row$getValue5;
|
return !((_row$getValue5 = row.getValue(columnId)) != null && _row$getValue5.includes(val));
|
});
|
};
|
arrIncludesAll.autoRemove = val => testFalsey(val) || !(val != null && val.length);
|
const arrIncludesSome = (row, columnId, filterValue) => {
|
return filterValue.some(val => {
|
var _row$getValue6;
|
return (_row$getValue6 = row.getValue(columnId)) == null ? void 0 : _row$getValue6.includes(val);
|
});
|
};
|
arrIncludesSome.autoRemove = val => testFalsey(val) || !(val != null && val.length);
|
const equals = (row, columnId, filterValue) => {
|
return row.getValue(columnId) === filterValue;
|
};
|
equals.autoRemove = val => testFalsey(val);
|
const weakEquals = (row, columnId, filterValue) => {
|
return row.getValue(columnId) == filterValue;
|
};
|
weakEquals.autoRemove = val => testFalsey(val);
|
const inNumberRange = (row, columnId, filterValue) => {
|
let [min, max] = filterValue;
|
const rowValue = row.getValue(columnId);
|
return rowValue >= min && rowValue <= max;
|
};
|
inNumberRange.resolveFilterValue = val => {
|
let [unsafeMin, unsafeMax] = val;
|
let parsedMin = typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin;
|
let parsedMax = typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax;
|
let min = unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin;
|
let max = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax;
|
if (min > max) {
|
const temp = min;
|
min = max;
|
max = temp;
|
}
|
return [min, max];
|
};
|
inNumberRange.autoRemove = val => testFalsey(val) || testFalsey(val[0]) && testFalsey(val[1]);
|
|
// Export
|
|
const filterFns = {
|
includesString,
|
includesStringSensitive,
|
equalsString,
|
arrIncludes,
|
arrIncludesAll,
|
arrIncludesSome,
|
equals,
|
weakEquals,
|
inNumberRange
|
};
|
// Utils
|
|
function testFalsey(val) {
|
return val === undefined || val === null || val === '';
|
}
|
|
//
|
|
const Filters = {
|
getDefaultColumnDef: () => {
|
return {
|
filterFn: 'auto'
|
};
|
},
|
getInitialState: state => {
|
return {
|
columnFilters: [],
|
globalFilter: undefined,
|
// filtersProgress: 1,
|
// facetProgress: {},
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onColumnFiltersChange: makeStateUpdater('columnFilters', table),
|
onGlobalFilterChange: makeStateUpdater('globalFilter', table),
|
filterFromLeafRows: false,
|
maxLeafRowFilterDepth: 100,
|
globalFilterFn: 'auto',
|
getColumnCanGlobalFilter: column => {
|
var _table$getCoreRowMode;
|
const value = (_table$getCoreRowMode = table.getCoreRowModel().flatRows[0]) == null || (_table$getCoreRowMode = _table$getCoreRowMode._getAllCellsByColumnId()[column.id]) == null ? void 0 : _table$getCoreRowMode.getValue();
|
return typeof value === 'string' || typeof value === 'number';
|
}
|
};
|
},
|
createColumn: (column, table) => {
|
column.getAutoFilterFn = () => {
|
const firstRow = table.getCoreRowModel().flatRows[0];
|
const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
|
if (typeof value === 'string') {
|
return filterFns.includesString;
|
}
|
if (typeof value === 'number') {
|
return filterFns.inNumberRange;
|
}
|
if (typeof value === 'boolean') {
|
return filterFns.equals;
|
}
|
if (value !== null && typeof value === 'object') {
|
return filterFns.equals;
|
}
|
if (Array.isArray(value)) {
|
return filterFns.arrIncludes;
|
}
|
return filterFns.weakEquals;
|
};
|
column.getFilterFn = () => {
|
var _table$options$filter, _table$options$filter2;
|
return isFunction(column.columnDef.filterFn) ? column.columnDef.filterFn : column.columnDef.filterFn === 'auto' ? column.getAutoFilterFn() : // @ts-ignore
|
(_table$options$filter = (_table$options$filter2 = table.options.filterFns) == null ? void 0 : _table$options$filter2[column.columnDef.filterFn]) != null ? _table$options$filter : filterFns[column.columnDef.filterFn];
|
};
|
column.getCanFilter = () => {
|
var _column$columnDef$ena, _table$options$enable, _table$options$enable2;
|
return ((_column$columnDef$ena = column.columnDef.enableColumnFilter) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnFilters) != null ? _table$options$enable : true) && ((_table$options$enable2 = table.options.enableFilters) != null ? _table$options$enable2 : true) && !!column.accessorFn;
|
};
|
column.getCanGlobalFilter = () => {
|
var _column$columnDef$ena2, _table$options$enable3, _table$options$enable4, _table$options$getCol;
|
return ((_column$columnDef$ena2 = column.columnDef.enableGlobalFilter) != null ? _column$columnDef$ena2 : true) && ((_table$options$enable3 = table.options.enableGlobalFilter) != null ? _table$options$enable3 : true) && ((_table$options$enable4 = table.options.enableFilters) != null ? _table$options$enable4 : true) && ((_table$options$getCol = table.options.getColumnCanGlobalFilter == null ? void 0 : table.options.getColumnCanGlobalFilter(column)) != null ? _table$options$getCol : true) && !!column.accessorFn;
|
};
|
column.getIsFiltered = () => column.getFilterIndex() > -1;
|
column.getFilterValue = () => {
|
var _table$getState$colum;
|
return (_table$getState$colum = table.getState().columnFilters) == null || (_table$getState$colum = _table$getState$colum.find(d => d.id === column.id)) == null ? void 0 : _table$getState$colum.value;
|
};
|
column.getFilterIndex = () => {
|
var _table$getState$colum2, _table$getState$colum3;
|
return (_table$getState$colum2 = (_table$getState$colum3 = table.getState().columnFilters) == null ? void 0 : _table$getState$colum3.findIndex(d => d.id === column.id)) != null ? _table$getState$colum2 : -1;
|
};
|
column.setFilterValue = value => {
|
table.setColumnFilters(old => {
|
const filterFn = column.getFilterFn();
|
const previousfilter = old == null ? void 0 : old.find(d => d.id === column.id);
|
const newFilter = functionalUpdate(value, previousfilter ? previousfilter.value : undefined);
|
|
//
|
if (shouldAutoRemoveFilter(filterFn, newFilter, column)) {
|
var _old$filter;
|
return (_old$filter = old == null ? void 0 : old.filter(d => d.id !== column.id)) != null ? _old$filter : [];
|
}
|
const newFilterObj = {
|
id: column.id,
|
value: newFilter
|
};
|
if (previousfilter) {
|
var _old$map;
|
return (_old$map = old == null ? void 0 : old.map(d => {
|
if (d.id === column.id) {
|
return newFilterObj;
|
}
|
return d;
|
})) != null ? _old$map : [];
|
}
|
if (old != null && old.length) {
|
return [...old, newFilterObj];
|
}
|
return [newFilterObj];
|
});
|
};
|
column._getFacetedRowModel = table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, column.id);
|
column.getFacetedRowModel = () => {
|
if (!column._getFacetedRowModel) {
|
return table.getPreFilteredRowModel();
|
}
|
return column._getFacetedRowModel();
|
};
|
column._getFacetedUniqueValues = table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, column.id);
|
column.getFacetedUniqueValues = () => {
|
if (!column._getFacetedUniqueValues) {
|
return new Map();
|
}
|
return column._getFacetedUniqueValues();
|
};
|
column._getFacetedMinMaxValues = table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, column.id);
|
column.getFacetedMinMaxValues = () => {
|
if (!column._getFacetedMinMaxValues) {
|
return undefined;
|
}
|
return column._getFacetedMinMaxValues();
|
};
|
// () => [column.getFacetedRowModel()],
|
// facetedRowModel => getRowModelMinMaxValues(facetedRowModel, column.id),
|
},
|
|
createRow: (row, table) => {
|
row.columnFilters = {};
|
row.columnFiltersMeta = {};
|
},
|
createTable: table => {
|
table.getGlobalAutoFilterFn = () => {
|
return filterFns.includesString;
|
};
|
table.getGlobalFilterFn = () => {
|
var _table$options$filter3, _table$options$filter4;
|
const {
|
globalFilterFn: globalFilterFn
|
} = table.options;
|
return isFunction(globalFilterFn) ? globalFilterFn : globalFilterFn === 'auto' ? table.getGlobalAutoFilterFn() : // @ts-ignore
|
(_table$options$filter3 = (_table$options$filter4 = table.options.filterFns) == null ? void 0 : _table$options$filter4[globalFilterFn]) != null ? _table$options$filter3 : filterFns[globalFilterFn];
|
};
|
table.setColumnFilters = updater => {
|
const leafColumns = table.getAllLeafColumns();
|
const updateFn = old => {
|
var _functionalUpdate;
|
return (_functionalUpdate = functionalUpdate(updater, old)) == null ? void 0 : _functionalUpdate.filter(filter => {
|
const column = leafColumns.find(d => d.id === filter.id);
|
if (column) {
|
const filterFn = column.getFilterFn();
|
if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {
|
return false;
|
}
|
}
|
return true;
|
});
|
};
|
table.options.onColumnFiltersChange == null || table.options.onColumnFiltersChange(updateFn);
|
};
|
table.setGlobalFilter = updater => {
|
table.options.onGlobalFilterChange == null || table.options.onGlobalFilterChange(updater);
|
};
|
table.resetGlobalFilter = defaultState => {
|
table.setGlobalFilter(defaultState ? undefined : table.initialState.globalFilter);
|
};
|
table.resetColumnFilters = defaultState => {
|
var _table$initialState$c, _table$initialState;
|
table.setColumnFilters(defaultState ? [] : (_table$initialState$c = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.columnFilters) != null ? _table$initialState$c : []);
|
};
|
table.getPreFilteredRowModel = () => table.getCoreRowModel();
|
table.getFilteredRowModel = () => {
|
if (!table._getFilteredRowModel && table.options.getFilteredRowModel) {
|
table._getFilteredRowModel = table.options.getFilteredRowModel(table);
|
}
|
if (table.options.manualFiltering || !table._getFilteredRowModel) {
|
return table.getPreFilteredRowModel();
|
}
|
return table._getFilteredRowModel();
|
};
|
table._getGlobalFacetedRowModel = table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, '__global__');
|
table.getGlobalFacetedRowModel = () => {
|
if (table.options.manualFiltering || !table._getGlobalFacetedRowModel) {
|
return table.getPreFilteredRowModel();
|
}
|
return table._getGlobalFacetedRowModel();
|
};
|
table._getGlobalFacetedUniqueValues = table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, '__global__');
|
table.getGlobalFacetedUniqueValues = () => {
|
if (!table._getGlobalFacetedUniqueValues) {
|
return new Map();
|
}
|
return table._getGlobalFacetedUniqueValues();
|
};
|
table._getGlobalFacetedMinMaxValues = table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, '__global__');
|
table.getGlobalFacetedMinMaxValues = () => {
|
if (!table._getGlobalFacetedMinMaxValues) {
|
return;
|
}
|
return table._getGlobalFacetedMinMaxValues();
|
};
|
}
|
};
|
function shouldAutoRemoveFilter(filterFn, value, column) {
|
return (filterFn && filterFn.autoRemove ? filterFn.autoRemove(value, column) : false) || typeof value === 'undefined' || typeof value === 'string' && !value;
|
}
|
|
const sum = (columnId, _leafRows, childRows) => {
|
// It's faster to just add the aggregations together instead of
|
// process leaf nodes individually
|
return childRows.reduce((sum, next) => {
|
const nextValue = next.getValue(columnId);
|
return sum + (typeof nextValue === 'number' ? nextValue : 0);
|
}, 0);
|
};
|
const min = (columnId, _leafRows, childRows) => {
|
let min;
|
childRows.forEach(row => {
|
const value = row.getValue(columnId);
|
if (value != null && (min > value || min === undefined && value >= value)) {
|
min = value;
|
}
|
});
|
return min;
|
};
|
const max = (columnId, _leafRows, childRows) => {
|
let max;
|
childRows.forEach(row => {
|
const value = row.getValue(columnId);
|
if (value != null && (max < value || max === undefined && value >= value)) {
|
max = value;
|
}
|
});
|
return max;
|
};
|
const extent = (columnId, _leafRows, childRows) => {
|
let min;
|
let max;
|
childRows.forEach(row => {
|
const value = row.getValue(columnId);
|
if (value != null) {
|
if (min === undefined) {
|
if (value >= value) min = max = value;
|
} else {
|
if (min > value) min = value;
|
if (max < value) max = value;
|
}
|
}
|
});
|
return [min, max];
|
};
|
const mean = (columnId, leafRows) => {
|
let count = 0;
|
let sum = 0;
|
leafRows.forEach(row => {
|
let value = row.getValue(columnId);
|
if (value != null && (value = +value) >= value) {
|
++count, sum += value;
|
}
|
});
|
if (count) return sum / count;
|
return;
|
};
|
const median = (columnId, leafRows) => {
|
if (!leafRows.length) {
|
return;
|
}
|
const values = leafRows.map(row => row.getValue(columnId));
|
if (!isNumberArray(values)) {
|
return;
|
}
|
if (values.length === 1) {
|
return values[0];
|
}
|
const mid = Math.floor(values.length / 2);
|
const nums = values.sort((a, b) => a - b);
|
return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
|
};
|
const unique = (columnId, leafRows) => {
|
return Array.from(new Set(leafRows.map(d => d.getValue(columnId))).values());
|
};
|
const uniqueCount = (columnId, leafRows) => {
|
return new Set(leafRows.map(d => d.getValue(columnId))).size;
|
};
|
const count = (_columnId, leafRows) => {
|
return leafRows.length;
|
};
|
const aggregationFns = {
|
sum,
|
min,
|
max,
|
extent,
|
mean,
|
median,
|
unique,
|
uniqueCount,
|
count
|
};
|
|
//
|
|
const Grouping = {
|
getDefaultColumnDef: () => {
|
return {
|
aggregatedCell: props => {
|
var _toString, _props$getValue;
|
return (_toString = (_props$getValue = props.getValue()) == null || _props$getValue.toString == null ? void 0 : _props$getValue.toString()) != null ? _toString : null;
|
},
|
aggregationFn: 'auto'
|
};
|
},
|
getInitialState: state => {
|
return {
|
grouping: [],
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onGroupingChange: makeStateUpdater('grouping', table),
|
groupedColumnMode: 'reorder'
|
};
|
},
|
createColumn: (column, table) => {
|
column.toggleGrouping = () => {
|
table.setGrouping(old => {
|
// Find any existing grouping for this column
|
if (old != null && old.includes(column.id)) {
|
return old.filter(d => d !== column.id);
|
}
|
return [...(old != null ? old : []), column.id];
|
});
|
};
|
column.getCanGroup = () => {
|
var _ref, _ref2, _ref3, _column$columnDef$ena;
|
return (_ref = (_ref2 = (_ref3 = (_column$columnDef$ena = column.columnDef.enableGrouping) != null ? _column$columnDef$ena : true) != null ? _ref3 : table.options.enableGrouping) != null ? _ref2 : true) != null ? _ref : !!column.accessorFn;
|
};
|
column.getIsGrouped = () => {
|
var _table$getState$group;
|
return (_table$getState$group = table.getState().grouping) == null ? void 0 : _table$getState$group.includes(column.id);
|
};
|
column.getGroupedIndex = () => {
|
var _table$getState$group2;
|
return (_table$getState$group2 = table.getState().grouping) == null ? void 0 : _table$getState$group2.indexOf(column.id);
|
};
|
column.getToggleGroupingHandler = () => {
|
const canGroup = column.getCanGroup();
|
return () => {
|
if (!canGroup) return;
|
column.toggleGrouping();
|
};
|
};
|
column.getAutoAggregationFn = () => {
|
const firstRow = table.getCoreRowModel().flatRows[0];
|
const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
|
if (typeof value === 'number') {
|
return aggregationFns.sum;
|
}
|
if (Object.prototype.toString.call(value) === '[object Date]') {
|
return aggregationFns.extent;
|
}
|
};
|
column.getAggregationFn = () => {
|
var _table$options$aggreg, _table$options$aggreg2;
|
if (!column) {
|
throw new Error();
|
}
|
return isFunction(column.columnDef.aggregationFn) ? column.columnDef.aggregationFn : column.columnDef.aggregationFn === 'auto' ? column.getAutoAggregationFn() : (_table$options$aggreg = (_table$options$aggreg2 = table.options.aggregationFns) == null ? void 0 : _table$options$aggreg2[column.columnDef.aggregationFn]) != null ? _table$options$aggreg : aggregationFns[column.columnDef.aggregationFn];
|
};
|
},
|
createTable: table => {
|
table.setGrouping = updater => table.options.onGroupingChange == null ? void 0 : table.options.onGroupingChange(updater);
|
table.resetGrouping = defaultState => {
|
var _table$initialState$g, _table$initialState;
|
table.setGrouping(defaultState ? [] : (_table$initialState$g = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.grouping) != null ? _table$initialState$g : []);
|
};
|
table.getPreGroupedRowModel = () => table.getFilteredRowModel();
|
table.getGroupedRowModel = () => {
|
if (!table._getGroupedRowModel && table.options.getGroupedRowModel) {
|
table._getGroupedRowModel = table.options.getGroupedRowModel(table);
|
}
|
if (table.options.manualGrouping || !table._getGroupedRowModel) {
|
return table.getPreGroupedRowModel();
|
}
|
return table._getGroupedRowModel();
|
};
|
},
|
createRow: (row, table) => {
|
row.getIsGrouped = () => !!row.groupingColumnId;
|
row.getGroupingValue = columnId => {
|
if (row._groupingValuesCache.hasOwnProperty(columnId)) {
|
return row._groupingValuesCache[columnId];
|
}
|
const column = table.getColumn(columnId);
|
if (!(column != null && column.columnDef.getGroupingValue)) {
|
return row.getValue(columnId);
|
}
|
row._groupingValuesCache[columnId] = column.columnDef.getGroupingValue(row.original);
|
return row._groupingValuesCache[columnId];
|
};
|
row._groupingValuesCache = {};
|
},
|
createCell: (cell, column, row, table) => {
|
cell.getIsGrouped = () => column.getIsGrouped() && column.id === row.groupingColumnId;
|
cell.getIsPlaceholder = () => !cell.getIsGrouped() && column.getIsGrouped();
|
cell.getIsAggregated = () => {
|
var _row$subRows;
|
return !cell.getIsGrouped() && !cell.getIsPlaceholder() && !!((_row$subRows = row.subRows) != null && _row$subRows.length);
|
};
|
}
|
};
|
function orderColumns(leafColumns, grouping, groupedColumnMode) {
|
if (!(grouping != null && grouping.length) || !groupedColumnMode) {
|
return leafColumns;
|
}
|
const nonGroupingColumns = leafColumns.filter(col => !grouping.includes(col.id));
|
if (groupedColumnMode === 'remove') {
|
return nonGroupingColumns;
|
}
|
const groupingColumns = grouping.map(g => leafColumns.find(col => col.id === g)).filter(Boolean);
|
return [...groupingColumns, ...nonGroupingColumns];
|
}
|
|
//
|
|
const Ordering = {
|
getInitialState: state => {
|
return {
|
columnOrder: [],
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onColumnOrderChange: makeStateUpdater('columnOrder', table)
|
};
|
},
|
createTable: table => {
|
table.setColumnOrder = updater => table.options.onColumnOrderChange == null ? void 0 : table.options.onColumnOrderChange(updater);
|
table.resetColumnOrder = defaultState => {
|
var _table$initialState$c;
|
table.setColumnOrder(defaultState ? [] : (_table$initialState$c = table.initialState.columnOrder) != null ? _table$initialState$c : []);
|
};
|
table._getOrderColumnsFn = memo(() => [table.getState().columnOrder, table.getState().grouping, table.options.groupedColumnMode], (columnOrder, grouping, groupedColumnMode) => columns => {
|
// Sort grouped columns to the start of the column list
|
// before the headers are built
|
let orderedColumns = [];
|
|
// If there is no order, return the normal columns
|
if (!(columnOrder != null && columnOrder.length)) {
|
orderedColumns = columns;
|
} else {
|
const columnOrderCopy = [...columnOrder];
|
|
// If there is an order, make a copy of the columns
|
const columnsCopy = [...columns];
|
|
// And make a new ordered array of the columns
|
|
// Loop over the columns and place them in order into the new array
|
while (columnsCopy.length && columnOrderCopy.length) {
|
const targetColumnId = columnOrderCopy.shift();
|
const foundIndex = columnsCopy.findIndex(d => d.id === targetColumnId);
|
if (foundIndex > -1) {
|
orderedColumns.push(columnsCopy.splice(foundIndex, 1)[0]);
|
}
|
}
|
|
// If there are any columns left, add them to the end
|
orderedColumns = [...orderedColumns, ...columnsCopy];
|
}
|
return orderColumns(orderedColumns, grouping, groupedColumnMode);
|
}, {
|
key: "development" === 'development' && 'getOrderColumnsFn'
|
// debug: () => table.options.debugAll ?? table.options.debugTable,
|
});
|
}
|
};
|
|
//
|
|
const defaultPageIndex = 0;
|
const defaultPageSize = 10;
|
const getDefaultPaginationState = () => ({
|
pageIndex: defaultPageIndex,
|
pageSize: defaultPageSize
|
});
|
const Pagination = {
|
getInitialState: state => {
|
return {
|
...state,
|
pagination: {
|
...getDefaultPaginationState(),
|
...(state == null ? void 0 : state.pagination)
|
}
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onPaginationChange: makeStateUpdater('pagination', table)
|
};
|
},
|
createTable: table => {
|
let registered = false;
|
let queued = false;
|
table._autoResetPageIndex = () => {
|
var _ref, _table$options$autoRe;
|
if (!registered) {
|
table._queue(() => {
|
registered = true;
|
});
|
return;
|
}
|
if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetPageIndex) != null ? _ref : !table.options.manualPagination) {
|
if (queued) return;
|
queued = true;
|
table._queue(() => {
|
table.resetPageIndex();
|
queued = false;
|
});
|
}
|
};
|
table.setPagination = updater => {
|
const safeUpdater = old => {
|
let newState = functionalUpdate(updater, old);
|
return newState;
|
};
|
return table.options.onPaginationChange == null ? void 0 : table.options.onPaginationChange(safeUpdater);
|
};
|
table.resetPagination = defaultState => {
|
var _table$initialState$p;
|
table.setPagination(defaultState ? getDefaultPaginationState() : (_table$initialState$p = table.initialState.pagination) != null ? _table$initialState$p : getDefaultPaginationState());
|
};
|
table.setPageIndex = updater => {
|
table.setPagination(old => {
|
let pageIndex = functionalUpdate(updater, old.pageIndex);
|
const maxPageIndex = typeof table.options.pageCount === 'undefined' || table.options.pageCount === -1 ? Number.MAX_SAFE_INTEGER : table.options.pageCount - 1;
|
pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex));
|
return {
|
...old,
|
pageIndex
|
};
|
});
|
};
|
table.resetPageIndex = defaultState => {
|
var _table$initialState$p2, _table$initialState;
|
table.setPageIndex(defaultState ? defaultPageIndex : (_table$initialState$p2 = (_table$initialState = table.initialState) == null || (_table$initialState = _table$initialState.pagination) == null ? void 0 : _table$initialState.pageIndex) != null ? _table$initialState$p2 : defaultPageIndex);
|
};
|
table.resetPageSize = defaultState => {
|
var _table$initialState$p3, _table$initialState2;
|
table.setPageSize(defaultState ? defaultPageSize : (_table$initialState$p3 = (_table$initialState2 = table.initialState) == null || (_table$initialState2 = _table$initialState2.pagination) == null ? void 0 : _table$initialState2.pageSize) != null ? _table$initialState$p3 : defaultPageSize);
|
};
|
table.setPageSize = updater => {
|
table.setPagination(old => {
|
const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize));
|
const topRowIndex = old.pageSize * old.pageIndex;
|
const pageIndex = Math.floor(topRowIndex / pageSize);
|
return {
|
...old,
|
pageIndex,
|
pageSize
|
};
|
});
|
};
|
table.setPageCount = updater => table.setPagination(old => {
|
var _table$options$pageCo;
|
let newPageCount = functionalUpdate(updater, (_table$options$pageCo = table.options.pageCount) != null ? _table$options$pageCo : -1);
|
if (typeof newPageCount === 'number') {
|
newPageCount = Math.max(-1, newPageCount);
|
}
|
return {
|
...old,
|
pageCount: newPageCount
|
};
|
});
|
table.getPageOptions = memo(() => [table.getPageCount()], pageCount => {
|
let pageOptions = [];
|
if (pageCount && pageCount > 0) {
|
pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i);
|
}
|
return pageOptions;
|
}, {
|
key: "development" === 'development' && 'getPageOptions',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
}
|
});
|
table.getCanPreviousPage = () => table.getState().pagination.pageIndex > 0;
|
table.getCanNextPage = () => {
|
const {
|
pageIndex
|
} = table.getState().pagination;
|
const pageCount = table.getPageCount();
|
if (pageCount === -1) {
|
return true;
|
}
|
if (pageCount === 0) {
|
return false;
|
}
|
return pageIndex < pageCount - 1;
|
};
|
table.previousPage = () => {
|
return table.setPageIndex(old => old - 1);
|
};
|
table.nextPage = () => {
|
return table.setPageIndex(old => {
|
return old + 1;
|
});
|
};
|
table.getPrePaginationRowModel = () => table.getExpandedRowModel();
|
table.getPaginationRowModel = () => {
|
if (!table._getPaginationRowModel && table.options.getPaginationRowModel) {
|
table._getPaginationRowModel = table.options.getPaginationRowModel(table);
|
}
|
if (table.options.manualPagination || !table._getPaginationRowModel) {
|
return table.getPrePaginationRowModel();
|
}
|
return table._getPaginationRowModel();
|
};
|
table.getPageCount = () => {
|
var _table$options$pageCo2;
|
return (_table$options$pageCo2 = table.options.pageCount) != null ? _table$options$pageCo2 : Math.ceil(table.getPrePaginationRowModel().rows.length / table.getState().pagination.pageSize);
|
};
|
}
|
};
|
|
//
|
|
const getDefaultColumnPinningState = () => ({
|
left: [],
|
right: []
|
});
|
const getDefaultRowPinningState = () => ({
|
top: [],
|
bottom: []
|
});
|
const Pinning = {
|
getInitialState: state => {
|
return {
|
columnPinning: getDefaultColumnPinningState(),
|
rowPinning: getDefaultRowPinningState(),
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onColumnPinningChange: makeStateUpdater('columnPinning', table),
|
onRowPinningChange: makeStateUpdater('rowPinning', table)
|
};
|
},
|
createColumn: (column, table) => {
|
column.pin = position => {
|
const columnIds = column.getLeafColumns().map(d => d.id).filter(Boolean);
|
table.setColumnPinning(old => {
|
var _old$left3, _old$right3;
|
if (position === 'right') {
|
var _old$left, _old$right;
|
return {
|
left: ((_old$left = old == null ? void 0 : old.left) != null ? _old$left : []).filter(d => !(columnIds != null && columnIds.includes(d))),
|
right: [...((_old$right = old == null ? void 0 : old.right) != null ? _old$right : []).filter(d => !(columnIds != null && columnIds.includes(d))), ...columnIds]
|
};
|
}
|
if (position === 'left') {
|
var _old$left2, _old$right2;
|
return {
|
left: [...((_old$left2 = old == null ? void 0 : old.left) != null ? _old$left2 : []).filter(d => !(columnIds != null && columnIds.includes(d))), ...columnIds],
|
right: ((_old$right2 = old == null ? void 0 : old.right) != null ? _old$right2 : []).filter(d => !(columnIds != null && columnIds.includes(d)))
|
};
|
}
|
return {
|
left: ((_old$left3 = old == null ? void 0 : old.left) != null ? _old$left3 : []).filter(d => !(columnIds != null && columnIds.includes(d))),
|
right: ((_old$right3 = old == null ? void 0 : old.right) != null ? _old$right3 : []).filter(d => !(columnIds != null && columnIds.includes(d)))
|
};
|
});
|
};
|
column.getCanPin = () => {
|
const leafColumns = column.getLeafColumns();
|
return leafColumns.some(d => {
|
var _d$columnDef$enablePi, _ref, _table$options$enable;
|
return ((_d$columnDef$enablePi = d.columnDef.enablePinning) != null ? _d$columnDef$enablePi : true) && ((_ref = (_table$options$enable = table.options.enableColumnPinning) != null ? _table$options$enable : table.options.enablePinning) != null ? _ref : true);
|
});
|
};
|
column.getIsPinned = () => {
|
const leafColumnIds = column.getLeafColumns().map(d => d.id);
|
const {
|
left,
|
right
|
} = table.getState().columnPinning;
|
const isLeft = leafColumnIds.some(d => left == null ? void 0 : left.includes(d));
|
const isRight = leafColumnIds.some(d => right == null ? void 0 : right.includes(d));
|
return isLeft ? 'left' : isRight ? 'right' : false;
|
};
|
column.getPinnedIndex = () => {
|
var _table$getState$colum, _table$getState$colum2;
|
const position = column.getIsPinned();
|
return position ? (_table$getState$colum = (_table$getState$colum2 = table.getState().columnPinning) == null || (_table$getState$colum2 = _table$getState$colum2[position]) == null ? void 0 : _table$getState$colum2.indexOf(column.id)) != null ? _table$getState$colum : -1 : 0;
|
};
|
},
|
createRow: (row, table) => {
|
row.pin = (position, includeLeafRows, includeParentRows) => {
|
const leafRowIds = includeLeafRows ? row.getLeafRows().map(_ref2 => {
|
let {
|
id
|
} = _ref2;
|
return id;
|
}) : [];
|
const parentRowIds = includeParentRows ? row.getParentRows().map(_ref3 => {
|
let {
|
id
|
} = _ref3;
|
return id;
|
}) : [];
|
const rowIds = new Set([...parentRowIds, row.id, ...leafRowIds]);
|
table.setRowPinning(old => {
|
var _old$top3, _old$bottom3;
|
if (position === 'bottom') {
|
var _old$top, _old$bottom;
|
return {
|
top: ((_old$top = old == null ? void 0 : old.top) != null ? _old$top : []).filter(d => !(rowIds != null && rowIds.has(d))),
|
bottom: [...((_old$bottom = old == null ? void 0 : old.bottom) != null ? _old$bottom : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)]
|
};
|
}
|
if (position === 'top') {
|
var _old$top2, _old$bottom2;
|
return {
|
top: [...((_old$top2 = old == null ? void 0 : old.top) != null ? _old$top2 : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)],
|
bottom: ((_old$bottom2 = old == null ? void 0 : old.bottom) != null ? _old$bottom2 : []).filter(d => !(rowIds != null && rowIds.has(d)))
|
};
|
}
|
return {
|
top: ((_old$top3 = old == null ? void 0 : old.top) != null ? _old$top3 : []).filter(d => !(rowIds != null && rowIds.has(d))),
|
bottom: ((_old$bottom3 = old == null ? void 0 : old.bottom) != null ? _old$bottom3 : []).filter(d => !(rowIds != null && rowIds.has(d)))
|
};
|
});
|
};
|
row.getCanPin = () => {
|
var _ref4;
|
const {
|
enableRowPinning,
|
enablePinning
|
} = table.options;
|
if (typeof enableRowPinning === 'function') {
|
return enableRowPinning(row);
|
}
|
return (_ref4 = enableRowPinning != null ? enableRowPinning : enablePinning) != null ? _ref4 : true;
|
};
|
row.getIsPinned = () => {
|
const rowIds = [row.id];
|
const {
|
top,
|
bottom
|
} = table.getState().rowPinning;
|
const isTop = rowIds.some(d => top == null ? void 0 : top.includes(d));
|
const isBottom = rowIds.some(d => bottom == null ? void 0 : bottom.includes(d));
|
return isTop ? 'top' : isBottom ? 'bottom' : false;
|
};
|
row.getPinnedIndex = () => {
|
var _table$_getPinnedRows, _visiblePinnedRowIds$;
|
const position = row.getIsPinned();
|
if (!position) return -1;
|
const visiblePinnedRowIds = (_table$_getPinnedRows = table._getPinnedRows(position)) == null ? void 0 : _table$_getPinnedRows.map(_ref5 => {
|
let {
|
id
|
} = _ref5;
|
return id;
|
});
|
return (_visiblePinnedRowIds$ = visiblePinnedRowIds == null ? void 0 : visiblePinnedRowIds.indexOf(row.id)) != null ? _visiblePinnedRowIds$ : -1;
|
};
|
row.getCenterVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allCells, left, right) => {
|
const leftAndRight = [...(left != null ? left : []), ...(right != null ? right : [])];
|
return allCells.filter(d => !leftAndRight.includes(d.column.id));
|
}, {
|
key: "development" === 'development' && 'row.getCenterVisibleCells',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
|
}
|
});
|
row.getLeftVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left,,], (allCells, left) => {
|
const cells = (left != null ? left : []).map(columnId => allCells.find(cell => cell.column.id === columnId)).filter(Boolean).map(d => ({
|
...d,
|
position: 'left'
|
}));
|
return cells;
|
}, {
|
key: "development" === 'development' && 'row.getLeftVisibleCells',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
|
}
|
});
|
row.getRightVisibleCells = memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.right], (allCells, right) => {
|
const cells = (right != null ? right : []).map(columnId => allCells.find(cell => cell.column.id === columnId)).filter(Boolean).map(d => ({
|
...d,
|
position: 'right'
|
}));
|
return cells;
|
}, {
|
key: "development" === 'development' && 'row.getRightVisibleCells',
|
debug: () => {
|
var _table$options$debugA3;
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugRows;
|
}
|
});
|
},
|
createTable: table => {
|
table.setColumnPinning = updater => table.options.onColumnPinningChange == null ? void 0 : table.options.onColumnPinningChange(updater);
|
table.resetColumnPinning = defaultState => {
|
var _table$initialState$c, _table$initialState;
|
return table.setColumnPinning(defaultState ? getDefaultColumnPinningState() : (_table$initialState$c = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.columnPinning) != null ? _table$initialState$c : getDefaultColumnPinningState());
|
};
|
table.getIsSomeColumnsPinned = position => {
|
var _pinningState$positio;
|
const pinningState = table.getState().columnPinning;
|
if (!position) {
|
var _pinningState$left, _pinningState$right;
|
return Boolean(((_pinningState$left = pinningState.left) == null ? void 0 : _pinningState$left.length) || ((_pinningState$right = pinningState.right) == null ? void 0 : _pinningState$right.length));
|
}
|
return Boolean((_pinningState$positio = pinningState[position]) == null ? void 0 : _pinningState$positio.length);
|
};
|
table.getLeftLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left], (allColumns, left) => {
|
return (left != null ? left : []).map(columnId => allColumns.find(column => column.id === columnId)).filter(Boolean);
|
}, {
|
key: "development" === 'development' && 'getLeftLeafColumns',
|
debug: () => {
|
var _table$options$debugA4;
|
return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugColumns;
|
}
|
});
|
table.getRightLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.right], (allColumns, right) => {
|
return (right != null ? right : []).map(columnId => allColumns.find(column => column.id === columnId)).filter(Boolean);
|
}, {
|
key: "development" === 'development' && 'getRightLeafColumns',
|
debug: () => {
|
var _table$options$debugA5;
|
return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugColumns;
|
}
|
});
|
table.getCenterLeafColumns = memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, left, right) => {
|
const leftAndRight = [...(left != null ? left : []), ...(right != null ? right : [])];
|
return allColumns.filter(d => !leftAndRight.includes(d.id));
|
}, {
|
key: "development" === 'development' && 'getCenterLeafColumns',
|
debug: () => {
|
var _table$options$debugA6;
|
return (_table$options$debugA6 = table.options.debugAll) != null ? _table$options$debugA6 : table.options.debugColumns;
|
}
|
});
|
table.setRowPinning = updater => table.options.onRowPinningChange == null ? void 0 : table.options.onRowPinningChange(updater);
|
table.resetRowPinning = defaultState => {
|
var _table$initialState$r, _table$initialState2;
|
return table.setRowPinning(defaultState ? getDefaultRowPinningState() : (_table$initialState$r = (_table$initialState2 = table.initialState) == null ? void 0 : _table$initialState2.rowPinning) != null ? _table$initialState$r : getDefaultRowPinningState());
|
};
|
table.getIsSomeRowsPinned = position => {
|
var _pinningState$positio2;
|
const pinningState = table.getState().rowPinning;
|
if (!position) {
|
var _pinningState$top, _pinningState$bottom;
|
return Boolean(((_pinningState$top = pinningState.top) == null ? void 0 : _pinningState$top.length) || ((_pinningState$bottom = pinningState.bottom) == null ? void 0 : _pinningState$bottom.length));
|
}
|
return Boolean((_pinningState$positio2 = pinningState[position]) == null ? void 0 : _pinningState$positio2.length);
|
};
|
table._getPinnedRows = position => memo(() => [table.getRowModel().rows, table.getState().rowPinning[position]], (visibleRows, pinnedRowIds) => {
|
var _table$options$keepPi;
|
const rows = ((_table$options$keepPi = table.options.keepPinnedRows) != null ? _table$options$keepPi : true) ?
|
//get all rows that are pinned even if they would not be otherwise visible
|
//account for expanded parent rows, but not pagination or filtering
|
(pinnedRowIds != null ? pinnedRowIds : []).map(rowId => {
|
const row = table.getRow(rowId, true);
|
return row.getIsAllParentsExpanded() ? row : null;
|
}) :
|
//else get only visible rows that are pinned
|
(pinnedRowIds != null ? pinnedRowIds : []).map(rowId => visibleRows.find(row => row.id === rowId));
|
return rows.filter(Boolean).map(d => ({
|
...d,
|
position
|
}));
|
}, {
|
key: "development" === 'development' && `row.get${position === 'top' ? 'Top' : 'Bottom'}Rows`,
|
debug: () => {
|
var _table$options$debugA7;
|
return (_table$options$debugA7 = table.options.debugAll) != null ? _table$options$debugA7 : table.options.debugRows;
|
}
|
})();
|
table.getTopRows = () => table._getPinnedRows('top');
|
table.getBottomRows = () => table._getPinnedRows('bottom');
|
table.getCenterRows = memo(() => [table.getRowModel().rows, table.getState().rowPinning.top, table.getState().rowPinning.bottom], (allRows, top, bottom) => {
|
const topAndBottom = new Set([...(top != null ? top : []), ...(bottom != null ? bottom : [])]);
|
return allRows.filter(d => !topAndBottom.has(d.id));
|
}, {
|
key: "development" === 'development' && 'row.getCenterRows',
|
debug: () => {
|
var _table$options$debugA8;
|
return (_table$options$debugA8 = table.options.debugAll) != null ? _table$options$debugA8 : table.options.debugRows;
|
}
|
});
|
}
|
};
|
|
//
|
|
const RowSelection = {
|
getInitialState: state => {
|
return {
|
rowSelection: {},
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onRowSelectionChange: makeStateUpdater('rowSelection', table),
|
enableRowSelection: true,
|
enableMultiRowSelection: true,
|
enableSubRowSelection: true
|
// enableGroupingRowSelection: false,
|
// isAdditiveSelectEvent: (e: unknown) => !!e.metaKey,
|
// isInclusiveSelectEvent: (e: unknown) => !!e.shiftKey,
|
};
|
},
|
|
createTable: table => {
|
table.setRowSelection = updater => table.options.onRowSelectionChange == null ? void 0 : table.options.onRowSelectionChange(updater);
|
table.resetRowSelection = defaultState => {
|
var _table$initialState$r;
|
return table.setRowSelection(defaultState ? {} : (_table$initialState$r = table.initialState.rowSelection) != null ? _table$initialState$r : {});
|
};
|
table.toggleAllRowsSelected = value => {
|
table.setRowSelection(old => {
|
value = typeof value !== 'undefined' ? value : !table.getIsAllRowsSelected();
|
const rowSelection = {
|
...old
|
};
|
const preGroupedFlatRows = table.getPreGroupedRowModel().flatRows;
|
|
// We don't use `mutateRowIsSelected` here for performance reasons.
|
// All of the rows are flat already, so it wouldn't be worth it
|
if (value) {
|
preGroupedFlatRows.forEach(row => {
|
if (!row.getCanSelect()) {
|
return;
|
}
|
rowSelection[row.id] = true;
|
});
|
} else {
|
preGroupedFlatRows.forEach(row => {
|
delete rowSelection[row.id];
|
});
|
}
|
return rowSelection;
|
});
|
};
|
table.toggleAllPageRowsSelected = value => table.setRowSelection(old => {
|
const resolvedValue = typeof value !== 'undefined' ? value : !table.getIsAllPageRowsSelected();
|
const rowSelection = {
|
...old
|
};
|
table.getRowModel().rows.forEach(row => {
|
mutateRowIsSelected(rowSelection, row.id, resolvedValue, true, table);
|
});
|
return rowSelection;
|
});
|
|
// addRowSelectionRange: rowId => {
|
// const {
|
// rows,
|
// rowsById,
|
// options: { selectGroupingRows, selectSubRows },
|
// } = table
|
|
// const findSelectedRow = (rows: Row[]) => {
|
// let found
|
// rows.find(d => {
|
// if (d.getIsSelected()) {
|
// found = d
|
// return true
|
// }
|
// const subFound = findSelectedRow(d.subRows || [])
|
// if (subFound) {
|
// found = subFound
|
// return true
|
// }
|
// return false
|
// })
|
// return found
|
// }
|
|
// const firstRow = findSelectedRow(rows) || rows[0]
|
// const lastRow = rowsById[rowId]
|
|
// let include = false
|
// const selectedRowIds = {}
|
|
// const addRow = (row: Row) => {
|
// mutateRowIsSelected(selectedRowIds, row.id, true, {
|
// rowsById,
|
// selectGroupingRows: selectGroupingRows!,
|
// selectSubRows: selectSubRows!,
|
// })
|
// }
|
|
// table.rows.forEach(row => {
|
// const isFirstRow = row.id === firstRow.id
|
// const isLastRow = row.id === lastRow.id
|
|
// if (isFirstRow || isLastRow) {
|
// if (!include) {
|
// include = true
|
// } else if (include) {
|
// addRow(row)
|
// include = false
|
// }
|
// }
|
|
// if (include) {
|
// addRow(row)
|
// }
|
// })
|
|
// table.setRowSelection(selectedRowIds)
|
// },
|
table.getPreSelectedRowModel = () => table.getCoreRowModel();
|
table.getSelectedRowModel = memo(() => [table.getState().rowSelection, table.getCoreRowModel()], (rowSelection, rowModel) => {
|
if (!Object.keys(rowSelection).length) {
|
return {
|
rows: [],
|
flatRows: [],
|
rowsById: {}
|
};
|
}
|
return selectRowsFn(table, rowModel);
|
}, {
|
key: "development" === 'development' && 'getSelectedRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
}
|
});
|
table.getFilteredSelectedRowModel = memo(() => [table.getState().rowSelection, table.getFilteredRowModel()], (rowSelection, rowModel) => {
|
if (!Object.keys(rowSelection).length) {
|
return {
|
rows: [],
|
flatRows: [],
|
rowsById: {}
|
};
|
}
|
return selectRowsFn(table, rowModel);
|
}, {
|
key: "development" === 'production' && 'getFilteredSelectedRowModel',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugTable;
|
}
|
});
|
table.getGroupedSelectedRowModel = memo(() => [table.getState().rowSelection, table.getSortedRowModel()], (rowSelection, rowModel) => {
|
if (!Object.keys(rowSelection).length) {
|
return {
|
rows: [],
|
flatRows: [],
|
rowsById: {}
|
};
|
}
|
return selectRowsFn(table, rowModel);
|
}, {
|
key: "development" === 'production' && 'getGroupedSelectedRowModel',
|
debug: () => {
|
var _table$options$debugA3;
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugTable;
|
}
|
});
|
|
///
|
|
// getGroupingRowCanSelect: rowId => {
|
// const row = table.getRow(rowId)
|
|
// if (!row) {
|
// throw new Error()
|
// }
|
|
// if (typeof table.options.enableGroupingRowSelection === 'function') {
|
// return table.options.enableGroupingRowSelection(row)
|
// }
|
|
// return table.options.enableGroupingRowSelection ?? false
|
// },
|
|
table.getIsAllRowsSelected = () => {
|
const preGroupedFlatRows = table.getFilteredRowModel().flatRows;
|
const {
|
rowSelection
|
} = table.getState();
|
let isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length);
|
if (isAllRowsSelected) {
|
if (preGroupedFlatRows.some(row => row.getCanSelect() && !rowSelection[row.id])) {
|
isAllRowsSelected = false;
|
}
|
}
|
return isAllRowsSelected;
|
};
|
table.getIsAllPageRowsSelected = () => {
|
const paginationFlatRows = table.getPaginationRowModel().flatRows.filter(row => row.getCanSelect());
|
const {
|
rowSelection
|
} = table.getState();
|
let isAllPageRowsSelected = !!paginationFlatRows.length;
|
if (isAllPageRowsSelected && paginationFlatRows.some(row => !rowSelection[row.id])) {
|
isAllPageRowsSelected = false;
|
}
|
return isAllPageRowsSelected;
|
};
|
table.getIsSomeRowsSelected = () => {
|
var _table$getState$rowSe;
|
const totalSelected = Object.keys((_table$getState$rowSe = table.getState().rowSelection) != null ? _table$getState$rowSe : {}).length;
|
return totalSelected > 0 && totalSelected < table.getFilteredRowModel().flatRows.length;
|
};
|
table.getIsSomePageRowsSelected = () => {
|
const paginationFlatRows = table.getPaginationRowModel().flatRows;
|
return table.getIsAllPageRowsSelected() ? false : paginationFlatRows.filter(row => row.getCanSelect()).some(d => d.getIsSelected() || d.getIsSomeSelected());
|
};
|
table.getToggleAllRowsSelectedHandler = () => {
|
return e => {
|
table.toggleAllRowsSelected(e.target.checked);
|
};
|
};
|
table.getToggleAllPageRowsSelectedHandler = () => {
|
return e => {
|
table.toggleAllPageRowsSelected(e.target.checked);
|
};
|
};
|
},
|
createRow: (row, table) => {
|
row.toggleSelected = (value, opts) => {
|
const isSelected = row.getIsSelected();
|
table.setRowSelection(old => {
|
var _opts$selectChildren;
|
value = typeof value !== 'undefined' ? value : !isSelected;
|
if (row.getCanSelect() && isSelected === value) {
|
return old;
|
}
|
const selectedRowIds = {
|
...old
|
};
|
mutateRowIsSelected(selectedRowIds, row.id, value, (_opts$selectChildren = opts == null ? void 0 : opts.selectChildren) != null ? _opts$selectChildren : true, table);
|
return selectedRowIds;
|
});
|
};
|
row.getIsSelected = () => {
|
const {
|
rowSelection
|
} = table.getState();
|
return isRowSelected(row, rowSelection);
|
};
|
row.getIsSomeSelected = () => {
|
const {
|
rowSelection
|
} = table.getState();
|
return isSubRowSelected(row, rowSelection) === 'some';
|
};
|
row.getIsAllSubRowsSelected = () => {
|
const {
|
rowSelection
|
} = table.getState();
|
return isSubRowSelected(row, rowSelection) === 'all';
|
};
|
row.getCanSelect = () => {
|
var _table$options$enable;
|
if (typeof table.options.enableRowSelection === 'function') {
|
return table.options.enableRowSelection(row);
|
}
|
return (_table$options$enable = table.options.enableRowSelection) != null ? _table$options$enable : true;
|
};
|
row.getCanSelectSubRows = () => {
|
var _table$options$enable2;
|
if (typeof table.options.enableSubRowSelection === 'function') {
|
return table.options.enableSubRowSelection(row);
|
}
|
return (_table$options$enable2 = table.options.enableSubRowSelection) != null ? _table$options$enable2 : true;
|
};
|
row.getCanMultiSelect = () => {
|
var _table$options$enable3;
|
if (typeof table.options.enableMultiRowSelection === 'function') {
|
return table.options.enableMultiRowSelection(row);
|
}
|
return (_table$options$enable3 = table.options.enableMultiRowSelection) != null ? _table$options$enable3 : true;
|
};
|
row.getToggleSelectedHandler = () => {
|
const canSelect = row.getCanSelect();
|
return e => {
|
var _target;
|
if (!canSelect) return;
|
row.toggleSelected((_target = e.target) == null ? void 0 : _target.checked);
|
};
|
};
|
}
|
};
|
const mutateRowIsSelected = (selectedRowIds, id, value, includeChildren, table) => {
|
var _row$subRows;
|
const row = table.getRow(id);
|
|
// const isGrouped = row.getIsGrouped()
|
|
// if ( // TODO: enforce grouping row selection rules
|
// !isGrouped ||
|
// (isGrouped && table.options.enableGroupingRowSelection)
|
// ) {
|
if (value) {
|
if (!row.getCanMultiSelect()) {
|
Object.keys(selectedRowIds).forEach(key => delete selectedRowIds[key]);
|
}
|
if (row.getCanSelect()) {
|
selectedRowIds[id] = true;
|
}
|
} else {
|
delete selectedRowIds[id];
|
}
|
// }
|
|
if (includeChildren && (_row$subRows = row.subRows) != null && _row$subRows.length && row.getCanSelectSubRows()) {
|
row.subRows.forEach(row => mutateRowIsSelected(selectedRowIds, row.id, value, includeChildren, table));
|
}
|
};
|
function selectRowsFn(table, rowModel) {
|
const rowSelection = table.getState().rowSelection;
|
const newSelectedFlatRows = [];
|
const newSelectedRowsById = {};
|
|
// Filters top level and nested rows
|
const recurseRows = function (rows, depth) {
|
return rows.map(row => {
|
var _row$subRows2;
|
const isSelected = isRowSelected(row, rowSelection);
|
if (isSelected) {
|
newSelectedFlatRows.push(row);
|
newSelectedRowsById[row.id] = row;
|
}
|
if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length) {
|
row = {
|
...row,
|
subRows: recurseRows(row.subRows)
|
};
|
}
|
if (isSelected) {
|
return row;
|
}
|
}).filter(Boolean);
|
};
|
return {
|
rows: recurseRows(rowModel.rows),
|
flatRows: newSelectedFlatRows,
|
rowsById: newSelectedRowsById
|
};
|
}
|
function isRowSelected(row, selection) {
|
var _selection$row$id;
|
return (_selection$row$id = selection[row.id]) != null ? _selection$row$id : false;
|
}
|
function isSubRowSelected(row, selection, table) {
|
var _row$subRows3;
|
if (!((_row$subRows3 = row.subRows) != null && _row$subRows3.length)) return false;
|
let allChildrenSelected = true;
|
let someSelected = false;
|
row.subRows.forEach(subRow => {
|
// Bail out early if we know both of these
|
if (someSelected && !allChildrenSelected) {
|
return;
|
}
|
if (subRow.getCanSelect()) {
|
if (isRowSelected(subRow, selection)) {
|
someSelected = true;
|
} else {
|
allChildrenSelected = false;
|
}
|
}
|
|
// Check row selection of nested subrows
|
if (subRow.subRows && subRow.subRows.length) {
|
const subRowChildrenSelected = isSubRowSelected(subRow, selection);
|
if (subRowChildrenSelected === 'all') {
|
someSelected = true;
|
} else if (subRowChildrenSelected === 'some') {
|
someSelected = true;
|
allChildrenSelected = false;
|
} else {
|
allChildrenSelected = false;
|
}
|
}
|
});
|
return allChildrenSelected ? 'all' : someSelected ? 'some' : false;
|
}
|
|
const reSplitAlphaNumeric = /([0-9]+)/gm;
|
const alphanumeric = (rowA, rowB, columnId) => {
|
return compareAlphanumeric(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());
|
};
|
const alphanumericCaseSensitive = (rowA, rowB, columnId) => {
|
return compareAlphanumeric(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));
|
};
|
|
// The text filter is more basic (less numeric support)
|
// but is much faster
|
const text = (rowA, rowB, columnId) => {
|
return compareBasic(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());
|
};
|
|
// The text filter is more basic (less numeric support)
|
// but is much faster
|
const textCaseSensitive = (rowA, rowB, columnId) => {
|
return compareBasic(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));
|
};
|
const datetime = (rowA, rowB, columnId) => {
|
const a = rowA.getValue(columnId);
|
const b = rowB.getValue(columnId);
|
|
// Can handle nullish values
|
// Use > and < because == (and ===) doesn't work with
|
// Date objects (would require calling getTime()).
|
return a > b ? 1 : a < b ? -1 : 0;
|
};
|
const basic = (rowA, rowB, columnId) => {
|
return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId));
|
};
|
|
// Utils
|
|
function compareBasic(a, b) {
|
return a === b ? 0 : a > b ? 1 : -1;
|
}
|
function toString(a) {
|
if (typeof a === 'number') {
|
if (isNaN(a) || a === Infinity || a === -Infinity) {
|
return '';
|
}
|
return String(a);
|
}
|
if (typeof a === 'string') {
|
return a;
|
}
|
return '';
|
}
|
|
// Mixed sorting is slow, but very inclusive of many edge cases.
|
// It handles numbers, mixed alphanumeric combinations, and even
|
// null, undefined, and Infinity
|
function compareAlphanumeric(aStr, bStr) {
|
// Split on number groups, but keep the delimiter
|
// Then remove falsey split values
|
const a = aStr.split(reSplitAlphaNumeric).filter(Boolean);
|
const b = bStr.split(reSplitAlphaNumeric).filter(Boolean);
|
|
// While
|
while (a.length && b.length) {
|
const aa = a.shift();
|
const bb = b.shift();
|
const an = parseInt(aa, 10);
|
const bn = parseInt(bb, 10);
|
const combo = [an, bn].sort();
|
|
// Both are string
|
if (isNaN(combo[0])) {
|
if (aa > bb) {
|
return 1;
|
}
|
if (bb > aa) {
|
return -1;
|
}
|
continue;
|
}
|
|
// One is a string, one is a number
|
if (isNaN(combo[1])) {
|
return isNaN(an) ? -1 : 1;
|
}
|
|
// Both are numbers
|
if (an > bn) {
|
return 1;
|
}
|
if (bn > an) {
|
return -1;
|
}
|
}
|
return a.length - b.length;
|
}
|
|
// Exports
|
|
const sortingFns = {
|
alphanumeric,
|
alphanumericCaseSensitive,
|
text,
|
textCaseSensitive,
|
datetime,
|
basic
|
};
|
|
//
|
|
const Sorting = {
|
getInitialState: state => {
|
return {
|
sorting: [],
|
...state
|
};
|
},
|
getDefaultColumnDef: () => {
|
return {
|
sortingFn: 'auto',
|
sortUndefined: 1
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onSortingChange: makeStateUpdater('sorting', table),
|
isMultiSortEvent: e => {
|
return e.shiftKey;
|
}
|
};
|
},
|
createColumn: (column, table) => {
|
column.getAutoSortingFn = () => {
|
const firstRows = table.getFilteredRowModel().flatRows.slice(10);
|
let isString = false;
|
for (const row of firstRows) {
|
const value = row == null ? void 0 : row.getValue(column.id);
|
if (Object.prototype.toString.call(value) === '[object Date]') {
|
return sortingFns.datetime;
|
}
|
if (typeof value === 'string') {
|
isString = true;
|
if (value.split(reSplitAlphaNumeric).length > 1) {
|
return sortingFns.alphanumeric;
|
}
|
}
|
}
|
if (isString) {
|
return sortingFns.text;
|
}
|
return sortingFns.basic;
|
};
|
column.getAutoSortDir = () => {
|
const firstRow = table.getFilteredRowModel().flatRows[0];
|
const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
|
if (typeof value === 'string') {
|
return 'asc';
|
}
|
return 'desc';
|
};
|
column.getSortingFn = () => {
|
var _table$options$sortin, _table$options$sortin2;
|
if (!column) {
|
throw new Error();
|
}
|
return isFunction(column.columnDef.sortingFn) ? column.columnDef.sortingFn : column.columnDef.sortingFn === 'auto' ? column.getAutoSortingFn() : (_table$options$sortin = (_table$options$sortin2 = table.options.sortingFns) == null ? void 0 : _table$options$sortin2[column.columnDef.sortingFn]) != null ? _table$options$sortin : sortingFns[column.columnDef.sortingFn];
|
};
|
column.toggleSorting = (desc, multi) => {
|
// if (column.columns.length) {
|
// column.columns.forEach((c, i) => {
|
// if (c.id) {
|
// table.toggleColumnSorting(c.id, undefined, multi || !!i)
|
// }
|
// })
|
// return
|
// }
|
|
// this needs to be outside of table.setSorting to be in sync with rerender
|
const nextSortingOrder = column.getNextSortingOrder();
|
const hasManualValue = typeof desc !== 'undefined' && desc !== null;
|
table.setSorting(old => {
|
// Find any existing sorting for this column
|
const existingSorting = old == null ? void 0 : old.find(d => d.id === column.id);
|
const existingIndex = old == null ? void 0 : old.findIndex(d => d.id === column.id);
|
let newSorting = [];
|
|
// What should we do with this sort action?
|
let sortAction;
|
let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc';
|
|
// Multi-mode
|
if (old != null && old.length && column.getCanMultiSort() && multi) {
|
if (existingSorting) {
|
sortAction = 'toggle';
|
} else {
|
sortAction = 'add';
|
}
|
} else {
|
// Normal mode
|
if (old != null && old.length && existingIndex !== old.length - 1) {
|
sortAction = 'replace';
|
} else if (existingSorting) {
|
sortAction = 'toggle';
|
} else {
|
sortAction = 'replace';
|
}
|
}
|
|
// Handle toggle states that will remove the sorting
|
if (sortAction === 'toggle') {
|
// If we are "actually" toggling (not a manual set value), should we remove the sorting?
|
if (!hasManualValue) {
|
// Is our intention to remove?
|
if (!nextSortingOrder) {
|
sortAction = 'remove';
|
}
|
}
|
}
|
if (sortAction === 'add') {
|
var _table$options$maxMul;
|
newSorting = [...old, {
|
id: column.id,
|
desc: nextDesc
|
}];
|
// Take latest n columns
|
newSorting.splice(0, newSorting.length - ((_table$options$maxMul = table.options.maxMultiSortColCount) != null ? _table$options$maxMul : Number.MAX_SAFE_INTEGER));
|
} else if (sortAction === 'toggle') {
|
// This flips (or sets) the
|
newSorting = old.map(d => {
|
if (d.id === column.id) {
|
return {
|
...d,
|
desc: nextDesc
|
};
|
}
|
return d;
|
});
|
} else if (sortAction === 'remove') {
|
newSorting = old.filter(d => d.id !== column.id);
|
} else {
|
newSorting = [{
|
id: column.id,
|
desc: nextDesc
|
}];
|
}
|
return newSorting;
|
});
|
};
|
column.getFirstSortDir = () => {
|
var _ref, _column$columnDef$sor;
|
const sortDescFirst = (_ref = (_column$columnDef$sor = column.columnDef.sortDescFirst) != null ? _column$columnDef$sor : table.options.sortDescFirst) != null ? _ref : column.getAutoSortDir() === 'desc';
|
return sortDescFirst ? 'desc' : 'asc';
|
};
|
column.getNextSortingOrder = multi => {
|
var _table$options$enable, _table$options$enable2;
|
const firstSortDirection = column.getFirstSortDir();
|
const isSorted = column.getIsSorted();
|
if (!isSorted) {
|
return firstSortDirection;
|
}
|
if (isSorted !== firstSortDirection && ((_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && (
|
// If enableSortRemove, enable in general
|
multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true) // If multi, don't allow if enableMultiRemove))
|
) {
|
return false;
|
}
|
return isSorted === 'desc' ? 'asc' : 'desc';
|
};
|
column.getCanSort = () => {
|
var _column$columnDef$ena, _table$options$enable3;
|
return ((_column$columnDef$ena = column.columnDef.enableSorting) != null ? _column$columnDef$ena : true) && ((_table$options$enable3 = table.options.enableSorting) != null ? _table$options$enable3 : true) && !!column.accessorFn;
|
};
|
column.getCanMultiSort = () => {
|
var _ref2, _column$columnDef$ena2;
|
return (_ref2 = (_column$columnDef$ena2 = column.columnDef.enableMultiSort) != null ? _column$columnDef$ena2 : table.options.enableMultiSort) != null ? _ref2 : !!column.accessorFn;
|
};
|
column.getIsSorted = () => {
|
var _table$getState$sorti;
|
const columnSort = (_table$getState$sorti = table.getState().sorting) == null ? void 0 : _table$getState$sorti.find(d => d.id === column.id);
|
return !columnSort ? false : columnSort.desc ? 'desc' : 'asc';
|
};
|
column.getSortIndex = () => {
|
var _table$getState$sorti2, _table$getState$sorti3;
|
return (_table$getState$sorti2 = (_table$getState$sorti3 = table.getState().sorting) == null ? void 0 : _table$getState$sorti3.findIndex(d => d.id === column.id)) != null ? _table$getState$sorti2 : -1;
|
};
|
column.clearSorting = () => {
|
//clear sorting for just 1 column
|
table.setSorting(old => old != null && old.length ? old.filter(d => d.id !== column.id) : []);
|
};
|
column.getToggleSortingHandler = () => {
|
const canSort = column.getCanSort();
|
return e => {
|
if (!canSort) return;
|
e.persist == null || e.persist();
|
column.toggleSorting == null || column.toggleSorting(undefined, column.getCanMultiSort() ? table.options.isMultiSortEvent == null ? void 0 : table.options.isMultiSortEvent(e) : false);
|
};
|
};
|
},
|
createTable: table => {
|
table.setSorting = updater => table.options.onSortingChange == null ? void 0 : table.options.onSortingChange(updater);
|
table.resetSorting = defaultState => {
|
var _table$initialState$s, _table$initialState;
|
table.setSorting(defaultState ? [] : (_table$initialState$s = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.sorting) != null ? _table$initialState$s : []);
|
};
|
table.getPreSortedRowModel = () => table.getGroupedRowModel();
|
table.getSortedRowModel = () => {
|
if (!table._getSortedRowModel && table.options.getSortedRowModel) {
|
table._getSortedRowModel = table.options.getSortedRowModel(table);
|
}
|
if (table.options.manualSorting || !table._getSortedRowModel) {
|
return table.getPreSortedRowModel();
|
}
|
return table._getSortedRowModel();
|
};
|
}
|
};
|
|
//
|
|
const Visibility = {
|
getInitialState: state => {
|
return {
|
columnVisibility: {},
|
...state
|
};
|
},
|
getDefaultOptions: table => {
|
return {
|
onColumnVisibilityChange: makeStateUpdater('columnVisibility', table)
|
};
|
},
|
createColumn: (column, table) => {
|
column.toggleVisibility = value => {
|
if (column.getCanHide()) {
|
table.setColumnVisibility(old => ({
|
...old,
|
[column.id]: value != null ? value : !column.getIsVisible()
|
}));
|
}
|
};
|
column.getIsVisible = () => {
|
var _table$getState$colum, _table$getState$colum2;
|
return (_table$getState$colum = (_table$getState$colum2 = table.getState().columnVisibility) == null ? void 0 : _table$getState$colum2[column.id]) != null ? _table$getState$colum : true;
|
};
|
column.getCanHide = () => {
|
var _column$columnDef$ena, _table$options$enable;
|
return ((_column$columnDef$ena = column.columnDef.enableHiding) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableHiding) != null ? _table$options$enable : true);
|
};
|
column.getToggleVisibilityHandler = () => {
|
return e => {
|
column.toggleVisibility == null || column.toggleVisibility(e.target.checked);
|
};
|
};
|
},
|
createRow: (row, table) => {
|
row._getAllVisibleCells = memo(() => [row.getAllCells(), table.getState().columnVisibility], cells => {
|
return cells.filter(cell => cell.column.getIsVisible());
|
}, {
|
key: "development" === 'production' && 'row._getAllVisibleCells',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
|
}
|
});
|
row.getVisibleCells = memo(() => [row.getLeftVisibleCells(), row.getCenterVisibleCells(), row.getRightVisibleCells()], (left, center, right) => [...left, ...center, ...right], {
|
key: "development" === 'development' && 'row.getVisibleCells',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
|
}
|
});
|
},
|
createTable: table => {
|
const makeVisibleColumnsMethod = (key, getColumns) => {
|
return memo(() => [getColumns(), getColumns().filter(d => d.getIsVisible()).map(d => d.id).join('_')], columns => {
|
return columns.filter(d => d.getIsVisible == null ? void 0 : d.getIsVisible());
|
}, {
|
key,
|
debug: () => {
|
var _table$options$debugA3;
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugColumns;
|
}
|
});
|
};
|
table.getVisibleFlatColumns = makeVisibleColumnsMethod('getVisibleFlatColumns', () => table.getAllFlatColumns());
|
table.getVisibleLeafColumns = makeVisibleColumnsMethod('getVisibleLeafColumns', () => table.getAllLeafColumns());
|
table.getLeftVisibleLeafColumns = makeVisibleColumnsMethod('getLeftVisibleLeafColumns', () => table.getLeftLeafColumns());
|
table.getRightVisibleLeafColumns = makeVisibleColumnsMethod('getRightVisibleLeafColumns', () => table.getRightLeafColumns());
|
table.getCenterVisibleLeafColumns = makeVisibleColumnsMethod('getCenterVisibleLeafColumns', () => table.getCenterLeafColumns());
|
table.setColumnVisibility = updater => table.options.onColumnVisibilityChange == null ? void 0 : table.options.onColumnVisibilityChange(updater);
|
table.resetColumnVisibility = defaultState => {
|
var _table$initialState$c;
|
table.setColumnVisibility(defaultState ? {} : (_table$initialState$c = table.initialState.columnVisibility) != null ? _table$initialState$c : {});
|
};
|
table.toggleAllColumnsVisible = value => {
|
var _value;
|
value = (_value = value) != null ? _value : !table.getIsAllColumnsVisible();
|
table.setColumnVisibility(table.getAllLeafColumns().reduce((obj, column) => ({
|
...obj,
|
[column.id]: !value ? !(column.getCanHide != null && column.getCanHide()) : value
|
}), {}));
|
};
|
table.getIsAllColumnsVisible = () => !table.getAllLeafColumns().some(column => !(column.getIsVisible != null && column.getIsVisible()));
|
table.getIsSomeColumnsVisible = () => table.getAllLeafColumns().some(column => column.getIsVisible == null ? void 0 : column.getIsVisible());
|
table.getToggleAllColumnsVisibilityHandler = () => {
|
return e => {
|
var _target;
|
table.toggleAllColumnsVisible((_target = e.target) == null ? void 0 : _target.checked);
|
};
|
};
|
}
|
};
|
|
const features = [Headers, Visibility, Ordering, Pinning, Filters, Sorting, Grouping, Expanding, Pagination, RowSelection, ColumnSizing];
|
|
//
|
|
function createTable(options) {
|
var _options$initialState;
|
if (options.debugAll || options.debugTable) {
|
console.info('Creating Table Instance...');
|
}
|
let table = {
|
_features: features
|
};
|
const defaultOptions = table._features.reduce((obj, feature) => {
|
return Object.assign(obj, feature.getDefaultOptions == null ? void 0 : feature.getDefaultOptions(table));
|
}, {});
|
const mergeOptions = options => {
|
if (table.options.mergeOptions) {
|
return table.options.mergeOptions(defaultOptions, options);
|
}
|
return {
|
...defaultOptions,
|
...options
|
};
|
};
|
const coreInitialState = {};
|
let initialState = {
|
...coreInitialState,
|
...((_options$initialState = options.initialState) != null ? _options$initialState : {})
|
};
|
table._features.forEach(feature => {
|
var _feature$getInitialSt;
|
initialState = (_feature$getInitialSt = feature.getInitialState == null ? void 0 : feature.getInitialState(initialState)) != null ? _feature$getInitialSt : initialState;
|
});
|
const queued = [];
|
let queuedTimeout = false;
|
const coreInstance = {
|
_features: features,
|
options: {
|
...defaultOptions,
|
...options
|
},
|
initialState,
|
_queue: cb => {
|
queued.push(cb);
|
if (!queuedTimeout) {
|
queuedTimeout = true;
|
|
// Schedule a microtask to run the queued callbacks after
|
// the current call stack (render, etc) has finished.
|
Promise.resolve().then(() => {
|
while (queued.length) {
|
queued.shift()();
|
}
|
queuedTimeout = false;
|
}).catch(error => setTimeout(() => {
|
throw error;
|
}));
|
}
|
},
|
reset: () => {
|
table.setState(table.initialState);
|
},
|
setOptions: updater => {
|
const newOptions = functionalUpdate(updater, table.options);
|
table.options = mergeOptions(newOptions);
|
},
|
getState: () => {
|
return table.options.state;
|
},
|
setState: updater => {
|
table.options.onStateChange == null || table.options.onStateChange(updater);
|
},
|
_getRowId: (row, index, parent) => {
|
var _table$options$getRow;
|
return (_table$options$getRow = table.options.getRowId == null ? void 0 : table.options.getRowId(row, index, parent)) != null ? _table$options$getRow : `${parent ? [parent.id, index].join('.') : index}`;
|
},
|
getCoreRowModel: () => {
|
if (!table._getCoreRowModel) {
|
table._getCoreRowModel = table.options.getCoreRowModel(table);
|
}
|
return table._getCoreRowModel();
|
},
|
// The final calls start at the bottom of the model,
|
// expanded rows, which then work their way up
|
|
getRowModel: () => {
|
return table.getPaginationRowModel();
|
},
|
getRow: (id, searchAll) => {
|
const row = (searchAll ? table.getCoreRowModel() : table.getRowModel()).rowsById[id];
|
if (!row) {
|
if ("development" !== 'production') {
|
throw new Error(`getRow expected an ID, but got ${id}`);
|
}
|
throw new Error();
|
}
|
return row;
|
},
|
_getDefaultColumnDef: memo(() => [table.options.defaultColumn], defaultColumn => {
|
var _defaultColumn;
|
defaultColumn = (_defaultColumn = defaultColumn) != null ? _defaultColumn : {};
|
return {
|
header: props => {
|
const resolvedColumnDef = props.header.column.columnDef;
|
if (resolvedColumnDef.accessorKey) {
|
return resolvedColumnDef.accessorKey;
|
}
|
if (resolvedColumnDef.accessorFn) {
|
return resolvedColumnDef.id;
|
}
|
return null;
|
},
|
// footer: props => props.header.column.id,
|
cell: props => {
|
var _props$renderValue$to, _props$renderValue;
|
return (_props$renderValue$to = (_props$renderValue = props.renderValue()) == null || _props$renderValue.toString == null ? void 0 : _props$renderValue.toString()) != null ? _props$renderValue$to : null;
|
},
|
...table._features.reduce((obj, feature) => {
|
return Object.assign(obj, feature.getDefaultColumnDef == null ? void 0 : feature.getDefaultColumnDef());
|
}, {}),
|
...defaultColumn
|
};
|
}, {
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugColumns;
|
},
|
key: "development" === 'development' && 'getDefaultColumnDef'
|
}),
|
_getColumnDefs: () => table.options.columns,
|
getAllColumns: memo(() => [table._getColumnDefs()], columnDefs => {
|
const recurseColumns = function (columnDefs, parent, depth) {
|
if (depth === void 0) {
|
depth = 0;
|
}
|
return columnDefs.map(columnDef => {
|
const column = createColumn(table, columnDef, depth, parent);
|
const groupingColumnDef = columnDef;
|
column.columns = groupingColumnDef.columns ? recurseColumns(groupingColumnDef.columns, column, depth + 1) : [];
|
return column;
|
});
|
};
|
return recurseColumns(columnDefs);
|
}, {
|
key: "development" === 'development' && 'getAllColumns',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugColumns;
|
}
|
}),
|
getAllFlatColumns: memo(() => [table.getAllColumns()], allColumns => {
|
return allColumns.flatMap(column => {
|
return column.getFlatColumns();
|
});
|
}, {
|
key: "development" === 'development' && 'getAllFlatColumns',
|
debug: () => {
|
var _table$options$debugA3;
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugColumns;
|
}
|
}),
|
_getAllFlatColumnsById: memo(() => [table.getAllFlatColumns()], flatColumns => {
|
return flatColumns.reduce((acc, column) => {
|
acc[column.id] = column;
|
return acc;
|
}, {});
|
}, {
|
key: "development" === 'development' && 'getAllFlatColumnsById',
|
debug: () => {
|
var _table$options$debugA4;
|
return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugColumns;
|
}
|
}),
|
getAllLeafColumns: memo(() => [table.getAllColumns(), table._getOrderColumnsFn()], (allColumns, orderColumns) => {
|
let leafColumns = allColumns.flatMap(column => column.getLeafColumns());
|
return orderColumns(leafColumns);
|
}, {
|
key: "development" === 'development' && 'getAllLeafColumns',
|
debug: () => {
|
var _table$options$debugA5;
|
return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugColumns;
|
}
|
}),
|
getColumn: columnId => {
|
const column = table._getAllFlatColumnsById()[columnId];
|
if ("development" !== 'production' && !column) {
|
console.error(`[Table] Column with id '${columnId}' does not exist.`);
|
}
|
return column;
|
}
|
};
|
Object.assign(table, coreInstance);
|
for (let index = 0; index < table._features.length; index++) {
|
const feature = table._features[index];
|
feature == null || feature.createTable == null || feature.createTable(table);
|
}
|
return table;
|
}
|
|
function createCell(table, row, column, columnId) {
|
const getRenderValue = () => {
|
var _cell$getValue;
|
return (_cell$getValue = cell.getValue()) != null ? _cell$getValue : table.options.renderFallbackValue;
|
};
|
const cell = {
|
id: `${row.id}_${column.id}`,
|
row,
|
column,
|
getValue: () => row.getValue(columnId),
|
renderValue: getRenderValue,
|
getContext: memo(() => [table, column, row, cell], (table, column, row, cell) => ({
|
table,
|
column,
|
row,
|
cell: cell,
|
getValue: cell.getValue,
|
renderValue: cell.renderValue
|
}), {
|
key: "development" === 'development' && 'cell.getContext',
|
debug: () => table.options.debugAll
|
})
|
};
|
table._features.forEach(feature => {
|
feature.createCell == null || feature.createCell(cell, column, row, table);
|
}, {});
|
return cell;
|
}
|
|
const createRow = (table, id, original, rowIndex, depth, subRows, parentId) => {
|
let row = {
|
id,
|
index: rowIndex,
|
original,
|
depth,
|
parentId,
|
_valuesCache: {},
|
_uniqueValuesCache: {},
|
getValue: columnId => {
|
if (row._valuesCache.hasOwnProperty(columnId)) {
|
return row._valuesCache[columnId];
|
}
|
const column = table.getColumn(columnId);
|
if (!(column != null && column.accessorFn)) {
|
return undefined;
|
}
|
row._valuesCache[columnId] = column.accessorFn(row.original, rowIndex);
|
return row._valuesCache[columnId];
|
},
|
getUniqueValues: columnId => {
|
if (row._uniqueValuesCache.hasOwnProperty(columnId)) {
|
return row._uniqueValuesCache[columnId];
|
}
|
const column = table.getColumn(columnId);
|
if (!(column != null && column.accessorFn)) {
|
return undefined;
|
}
|
if (!column.columnDef.getUniqueValues) {
|
row._uniqueValuesCache[columnId] = [row.getValue(columnId)];
|
return row._uniqueValuesCache[columnId];
|
}
|
row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, rowIndex);
|
return row._uniqueValuesCache[columnId];
|
},
|
renderValue: columnId => {
|
var _row$getValue;
|
return (_row$getValue = row.getValue(columnId)) != null ? _row$getValue : table.options.renderFallbackValue;
|
},
|
subRows: subRows != null ? subRows : [],
|
getLeafRows: () => flattenBy(row.subRows, d => d.subRows),
|
getParentRow: () => row.parentId ? table.getRow(row.parentId, true) : undefined,
|
getParentRows: () => {
|
let parentRows = [];
|
let currentRow = row;
|
while (true) {
|
const parentRow = currentRow.getParentRow();
|
if (!parentRow) break;
|
parentRows.push(parentRow);
|
currentRow = parentRow;
|
}
|
return parentRows.reverse();
|
},
|
getAllCells: memo(() => [table.getAllLeafColumns()], leafColumns => {
|
return leafColumns.map(column => {
|
return createCell(table, row, column, column.id);
|
});
|
}, {
|
key: "development" === 'development' && 'row.getAllCells',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
|
}
|
}),
|
_getAllCellsByColumnId: memo(() => [row.getAllCells()], allCells => {
|
return allCells.reduce((acc, cell) => {
|
acc[cell.column.id] = cell;
|
return acc;
|
}, {});
|
}, {
|
key: "development" === 'production' && 'row.getAllCellsByColumnId',
|
debug: () => {
|
var _table$options$debugA2;
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
|
}
|
})
|
};
|
for (let i = 0; i < table._features.length; i++) {
|
const feature = table._features[i];
|
feature == null || feature.createRow == null || feature.createRow(row, table);
|
}
|
return row;
|
};
|
|
// type Person = {
|
// firstName: string
|
// lastName: string
|
// age: number
|
// visits: number
|
// status: string
|
// progress: number
|
// createdAt: Date
|
// nested: {
|
// foo: [
|
// {
|
// bar: 'bar'
|
// }
|
// ]
|
// bar: { subBar: boolean }[]
|
// baz: {
|
// foo: 'foo'
|
// bar: {
|
// baz: 'baz'
|
// }
|
// }
|
// }
|
// }
|
|
// const test: DeepKeys<Person> = 'nested.foo.0.bar'
|
// const test2: DeepKeys<Person> = 'nested.bar'
|
|
// const helper = createColumnHelper<Person>()
|
|
// helper.accessor('nested.foo', {
|
// cell: info => info.getValue(),
|
// })
|
|
// helper.accessor('nested.foo.0.bar', {
|
// cell: info => info.getValue(),
|
// })
|
|
// helper.accessor('nested.bar', {
|
// cell: info => info.getValue(),
|
// })
|
function createColumnHelper() {
|
return {
|
accessor: (accessor, column) => {
|
return typeof accessor === 'function' ? {
|
...column,
|
accessorFn: accessor
|
} : {
|
...column,
|
accessorKey: accessor
|
};
|
},
|
display: column => column,
|
group: column => column
|
};
|
}
|
|
function getCoreRowModel() {
|
return table => memo(() => [table.options.data], data => {
|
const rowModel = {
|
rows: [],
|
flatRows: [],
|
rowsById: {}
|
};
|
const accessRows = function (originalRows, depth, parentRow) {
|
if (depth === void 0) {
|
depth = 0;
|
}
|
const rows = [];
|
for (let i = 0; i < originalRows.length; i++) {
|
// This could be an expensive check at scale, so we should move it somewhere else, but where?
|
// if (!id) {
|
// if ("development" !== 'production') {
|
// throw new Error(`getRowId expected an ID, but got ${id}`)
|
// }
|
// }
|
|
// Make the row
|
const row = createRow(table, table._getRowId(originalRows[i], i, parentRow), originalRows[i], i, depth, undefined, parentRow == null ? void 0 : parentRow.id);
|
|
// Keep track of every row in a flat array
|
rowModel.flatRows.push(row);
|
// Also keep track of every row by its ID
|
rowModel.rowsById[row.id] = row;
|
// Push table row into parent
|
rows.push(row);
|
|
// Get the original subrows
|
if (table.options.getSubRows) {
|
var _row$originalSubRows;
|
row.originalSubRows = table.options.getSubRows(originalRows[i], i);
|
|
// Then recursively access them
|
if ((_row$originalSubRows = row.originalSubRows) != null && _row$originalSubRows.length) {
|
row.subRows = accessRows(row.originalSubRows, depth + 1, row);
|
}
|
}
|
}
|
return rows;
|
};
|
rowModel.rows = accessRows(data);
|
return rowModel;
|
}, {
|
key: "development" === 'development' && 'getRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {
|
table._autoResetPageIndex();
|
}
|
});
|
}
|
|
function filterRows(rows, filterRowImpl, table) {
|
if (table.options.filterFromLeafRows) {
|
return filterRowModelFromLeafs(rows, filterRowImpl, table);
|
}
|
return filterRowModelFromRoot(rows, filterRowImpl, table);
|
}
|
function filterRowModelFromLeafs(rowsToFilter, filterRow, table) {
|
var _table$options$maxLea;
|
const newFilteredFlatRows = [];
|
const newFilteredRowsById = {};
|
const maxDepth = (_table$options$maxLea = table.options.maxLeafRowFilterDepth) != null ? _table$options$maxLea : 100;
|
const recurseFilterRows = function (rowsToFilter, depth) {
|
if (depth === void 0) {
|
depth = 0;
|
}
|
const rows = [];
|
|
// Filter from children up first
|
for (let i = 0; i < rowsToFilter.length; i++) {
|
var _row$subRows;
|
let row = rowsToFilter[i];
|
const newRow = createRow(table, row.id, row.original, row.index, row.depth, undefined, row.parentId);
|
newRow.columnFilters = row.columnFilters;
|
if ((_row$subRows = row.subRows) != null && _row$subRows.length && depth < maxDepth) {
|
newRow.subRows = recurseFilterRows(row.subRows, depth + 1);
|
row = newRow;
|
if (filterRow(row) && !newRow.subRows.length) {
|
rows.push(row);
|
newFilteredRowsById[row.id] = row;
|
newFilteredFlatRows.push(row);
|
continue;
|
}
|
if (filterRow(row) || newRow.subRows.length) {
|
rows.push(row);
|
newFilteredRowsById[row.id] = row;
|
newFilteredFlatRows.push(row);
|
continue;
|
}
|
} else {
|
row = newRow;
|
if (filterRow(row)) {
|
rows.push(row);
|
newFilteredRowsById[row.id] = row;
|
newFilteredFlatRows.push(row);
|
}
|
}
|
}
|
return rows;
|
};
|
return {
|
rows: recurseFilterRows(rowsToFilter),
|
flatRows: newFilteredFlatRows,
|
rowsById: newFilteredRowsById
|
};
|
}
|
function filterRowModelFromRoot(rowsToFilter, filterRow, table) {
|
var _table$options$maxLea2;
|
const newFilteredFlatRows = [];
|
const newFilteredRowsById = {};
|
const maxDepth = (_table$options$maxLea2 = table.options.maxLeafRowFilterDepth) != null ? _table$options$maxLea2 : 100;
|
|
// Filters top level and nested rows
|
const recurseFilterRows = function (rowsToFilter, depth) {
|
if (depth === void 0) {
|
depth = 0;
|
}
|
// Filter from parents downward first
|
|
const rows = [];
|
|
// Apply the filter to any subRows
|
for (let i = 0; i < rowsToFilter.length; i++) {
|
let row = rowsToFilter[i];
|
const pass = filterRow(row);
|
if (pass) {
|
var _row$subRows2;
|
if ((_row$subRows2 = row.subRows) != null && _row$subRows2.length && depth < maxDepth) {
|
const newRow = createRow(table, row.id, row.original, row.index, row.depth, undefined, row.parentId);
|
newRow.subRows = recurseFilterRows(row.subRows, depth + 1);
|
row = newRow;
|
}
|
rows.push(row);
|
newFilteredFlatRows.push(row);
|
newFilteredRowsById[row.id] = row;
|
}
|
}
|
return rows;
|
};
|
return {
|
rows: recurseFilterRows(rowsToFilter),
|
flatRows: newFilteredFlatRows,
|
rowsById: newFilteredRowsById
|
};
|
}
|
|
function getFilteredRowModel() {
|
return table => memo(() => [table.getPreFilteredRowModel(), table.getState().columnFilters, table.getState().globalFilter], (rowModel, columnFilters, globalFilter) => {
|
if (!rowModel.rows.length || !(columnFilters != null && columnFilters.length) && !globalFilter) {
|
for (let i = 0; i < rowModel.flatRows.length; i++) {
|
rowModel.flatRows[i].columnFilters = {};
|
rowModel.flatRows[i].columnFiltersMeta = {};
|
}
|
return rowModel;
|
}
|
const resolvedColumnFilters = [];
|
const resolvedGlobalFilters = [];
|
(columnFilters != null ? columnFilters : []).forEach(d => {
|
var _filterFn$resolveFilt;
|
const column = table.getColumn(d.id);
|
if (!column) {
|
return;
|
}
|
const filterFn = column.getFilterFn();
|
if (!filterFn) {
|
if ("development" !== 'production') {
|
console.warn(`Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`);
|
}
|
return;
|
}
|
resolvedColumnFilters.push({
|
id: d.id,
|
filterFn,
|
resolvedValue: (_filterFn$resolveFilt = filterFn.resolveFilterValue == null ? void 0 : filterFn.resolveFilterValue(d.value)) != null ? _filterFn$resolveFilt : d.value
|
});
|
});
|
const filterableIds = columnFilters.map(d => d.id);
|
const globalFilterFn = table.getGlobalFilterFn();
|
const globallyFilterableColumns = table.getAllLeafColumns().filter(column => column.getCanGlobalFilter());
|
if (globalFilter && globalFilterFn && globallyFilterableColumns.length) {
|
filterableIds.push('__global__');
|
globallyFilterableColumns.forEach(column => {
|
var _globalFilterFn$resol;
|
resolvedGlobalFilters.push({
|
id: column.id,
|
filterFn: globalFilterFn,
|
resolvedValue: (_globalFilterFn$resol = globalFilterFn.resolveFilterValue == null ? void 0 : globalFilterFn.resolveFilterValue(globalFilter)) != null ? _globalFilterFn$resol : globalFilter
|
});
|
});
|
}
|
let currentColumnFilter;
|
let currentGlobalFilter;
|
|
// Flag the prefiltered row model with each filter state
|
for (let j = 0; j < rowModel.flatRows.length; j++) {
|
const row = rowModel.flatRows[j];
|
row.columnFilters = {};
|
if (resolvedColumnFilters.length) {
|
for (let i = 0; i < resolvedColumnFilters.length; i++) {
|
currentColumnFilter = resolvedColumnFilters[i];
|
const id = currentColumnFilter.id;
|
|
// Tag the row with the column filter state
|
row.columnFilters[id] = currentColumnFilter.filterFn(row, id, currentColumnFilter.resolvedValue, filterMeta => {
|
row.columnFiltersMeta[id] = filterMeta;
|
});
|
}
|
}
|
if (resolvedGlobalFilters.length) {
|
for (let i = 0; i < resolvedGlobalFilters.length; i++) {
|
currentGlobalFilter = resolvedGlobalFilters[i];
|
const id = currentGlobalFilter.id;
|
// Tag the row with the first truthy global filter state
|
if (currentGlobalFilter.filterFn(row, id, currentGlobalFilter.resolvedValue, filterMeta => {
|
row.columnFiltersMeta[id] = filterMeta;
|
})) {
|
row.columnFilters.__global__ = true;
|
break;
|
}
|
}
|
if (row.columnFilters.__global__ !== true) {
|
row.columnFilters.__global__ = false;
|
}
|
}
|
}
|
const filterRowsImpl = row => {
|
// Horizontally filter rows through each column
|
for (let i = 0; i < filterableIds.length; i++) {
|
if (row.columnFilters[filterableIds[i]] === false) {
|
return false;
|
}
|
}
|
return true;
|
};
|
|
// Filter final rows using all of the active filters
|
return filterRows(rowModel.rows, filterRowsImpl, table);
|
}, {
|
key: "development" === 'development' && 'getFilteredRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {
|
table._autoResetPageIndex();
|
}
|
});
|
}
|
|
function getFacetedRowModel() {
|
return (table, columnId) => memo(() => [table.getPreFilteredRowModel(), table.getState().columnFilters, table.getState().globalFilter, table.getFilteredRowModel()], (preRowModel, columnFilters, globalFilter) => {
|
if (!preRowModel.rows.length || !(columnFilters != null && columnFilters.length) && !globalFilter) {
|
return preRowModel;
|
}
|
const filterableIds = [...columnFilters.map(d => d.id).filter(d => d !== columnId), globalFilter ? '__global__' : undefined].filter(Boolean);
|
const filterRowsImpl = row => {
|
// Horizontally filter rows through each column
|
for (let i = 0; i < filterableIds.length; i++) {
|
if (row.columnFilters[filterableIds[i]] === false) {
|
return false;
|
}
|
}
|
return true;
|
};
|
return filterRows(preRowModel.rows, filterRowsImpl, table);
|
}, {
|
key: "development" === 'development' && 'getFacetedRowModel_' + columnId,
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {}
|
});
|
}
|
|
function getFacetedUniqueValues() {
|
return (table, columnId) => memo(() => {
|
var _table$getColumn;
|
return [(_table$getColumn = table.getColumn(columnId)) == null ? void 0 : _table$getColumn.getFacetedRowModel()];
|
}, facetedRowModel => {
|
if (!facetedRowModel) return new Map();
|
let facetedUniqueValues = new Map();
|
for (let i = 0; i < facetedRowModel.flatRows.length; i++) {
|
const values = facetedRowModel.flatRows[i].getUniqueValues(columnId);
|
for (let j = 0; j < values.length; j++) {
|
const value = values[j];
|
if (facetedUniqueValues.has(value)) {
|
var _facetedUniqueValues$;
|
facetedUniqueValues.set(value, ((_facetedUniqueValues$ = facetedUniqueValues.get(value)) != null ? _facetedUniqueValues$ : 0) + 1);
|
} else {
|
facetedUniqueValues.set(value, 1);
|
}
|
}
|
}
|
return facetedUniqueValues;
|
}, {
|
key: "development" === 'development' && 'getFacetedUniqueValues_' + columnId,
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {}
|
});
|
}
|
|
function getFacetedMinMaxValues() {
|
return (table, columnId) => memo(() => {
|
var _table$getColumn;
|
return [(_table$getColumn = table.getColumn(columnId)) == null ? void 0 : _table$getColumn.getFacetedRowModel()];
|
}, facetedRowModel => {
|
var _facetedRowModel$flat;
|
if (!facetedRowModel) return undefined;
|
const firstValue = (_facetedRowModel$flat = facetedRowModel.flatRows[0]) == null ? void 0 : _facetedRowModel$flat.getUniqueValues(columnId);
|
if (typeof firstValue === 'undefined') {
|
return undefined;
|
}
|
let facetedMinMaxValues = [firstValue, firstValue];
|
for (let i = 0; i < facetedRowModel.flatRows.length; i++) {
|
const values = facetedRowModel.flatRows[i].getUniqueValues(columnId);
|
for (let j = 0; j < values.length; j++) {
|
const value = values[j];
|
if (value < facetedMinMaxValues[0]) {
|
facetedMinMaxValues[0] = value;
|
} else if (value > facetedMinMaxValues[1]) {
|
facetedMinMaxValues[1] = value;
|
}
|
}
|
}
|
return facetedMinMaxValues;
|
}, {
|
key: "development" === 'development' && 'getFacetedMinMaxValues_' + columnId,
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {}
|
});
|
}
|
|
function getSortedRowModel() {
|
return table => memo(() => [table.getState().sorting, table.getPreSortedRowModel()], (sorting, rowModel) => {
|
if (!rowModel.rows.length || !(sorting != null && sorting.length)) {
|
return rowModel;
|
}
|
const sortingState = table.getState().sorting;
|
const sortedFlatRows = [];
|
|
// Filter out sortings that correspond to non existing columns
|
const availableSorting = sortingState.filter(sort => {
|
var _table$getColumn;
|
return (_table$getColumn = table.getColumn(sort.id)) == null ? void 0 : _table$getColumn.getCanSort();
|
});
|
const columnInfoById = {};
|
availableSorting.forEach(sortEntry => {
|
const column = table.getColumn(sortEntry.id);
|
if (!column) return;
|
columnInfoById[sortEntry.id] = {
|
sortUndefined: column.columnDef.sortUndefined,
|
invertSorting: column.columnDef.invertSorting,
|
sortingFn: column.getSortingFn()
|
};
|
});
|
const sortData = rows => {
|
// This will also perform a stable sorting using the row index
|
// if needed.
|
const sortedData = rows.map(row => ({
|
...row
|
}));
|
sortedData.sort((rowA, rowB) => {
|
for (let i = 0; i < availableSorting.length; i += 1) {
|
var _sortEntry$desc;
|
const sortEntry = availableSorting[i];
|
const columnInfo = columnInfoById[sortEntry.id];
|
const isDesc = (_sortEntry$desc = sortEntry == null ? void 0 : sortEntry.desc) != null ? _sortEntry$desc : false;
|
let sortInt = 0;
|
|
// All sorting ints should always return in ascending order
|
if (columnInfo.sortUndefined) {
|
const aValue = rowA.getValue(sortEntry.id);
|
const bValue = rowB.getValue(sortEntry.id);
|
const aUndefined = aValue === undefined;
|
const bUndefined = bValue === undefined;
|
if (aUndefined || bUndefined) {
|
sortInt = aUndefined && bUndefined ? 0 : aUndefined ? columnInfo.sortUndefined : -columnInfo.sortUndefined;
|
}
|
}
|
if (sortInt === 0) {
|
sortInt = columnInfo.sortingFn(rowA, rowB, sortEntry.id);
|
}
|
|
// If sorting is non-zero, take care of desc and inversion
|
if (sortInt !== 0) {
|
if (isDesc) {
|
sortInt *= -1;
|
}
|
if (columnInfo.invertSorting) {
|
sortInt *= -1;
|
}
|
return sortInt;
|
}
|
}
|
return rowA.index - rowB.index;
|
});
|
|
// If there are sub-rows, sort them
|
sortedData.forEach(row => {
|
var _row$subRows;
|
sortedFlatRows.push(row);
|
if ((_row$subRows = row.subRows) != null && _row$subRows.length) {
|
row.subRows = sortData(row.subRows);
|
}
|
});
|
return sortedData;
|
};
|
return {
|
rows: sortData(rowModel.rows),
|
flatRows: sortedFlatRows,
|
rowsById: rowModel.rowsById
|
};
|
}, {
|
key: "development" === 'development' && 'getSortedRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {
|
table._autoResetPageIndex();
|
}
|
});
|
}
|
|
function getGroupedRowModel() {
|
return table => memo(() => [table.getState().grouping, table.getPreGroupedRowModel()], (grouping, rowModel) => {
|
if (!rowModel.rows.length || !grouping.length) {
|
return rowModel;
|
}
|
|
// Filter the grouping list down to columns that exist
|
const existingGrouping = grouping.filter(columnId => table.getColumn(columnId));
|
const groupedFlatRows = [];
|
const groupedRowsById = {};
|
// const onlyGroupedFlatRows: Row[] = [];
|
// const onlyGroupedRowsById: Record<RowId, Row> = {};
|
// const nonGroupedFlatRows: Row[] = [];
|
// const nonGroupedRowsById: Record<RowId, Row> = {};
|
|
// Recursively group the data
|
const groupUpRecursively = function (rows, depth, parentId) {
|
if (depth === void 0) {
|
depth = 0;
|
}
|
// Grouping depth has been been met
|
// Stop grouping and simply rewrite thd depth and row relationships
|
if (depth >= existingGrouping.length) {
|
return rows.map(row => {
|
row.depth = depth;
|
groupedFlatRows.push(row);
|
groupedRowsById[row.id] = row;
|
if (row.subRows) {
|
row.subRows = groupUpRecursively(row.subRows, depth + 1, row.id);
|
}
|
return row;
|
});
|
}
|
const columnId = existingGrouping[depth];
|
|
// Group the rows together for this level
|
const rowGroupsMap = groupBy(rows, columnId);
|
|
// Peform aggregations for each group
|
const aggregatedGroupedRows = Array.from(rowGroupsMap.entries()).map((_ref, index) => {
|
let [groupingValue, groupedRows] = _ref;
|
let id = `${columnId}:${groupingValue}`;
|
id = parentId ? `${parentId}>${id}` : id;
|
|
// First, Recurse to group sub rows before aggregation
|
const subRows = groupUpRecursively(groupedRows, depth + 1, id);
|
|
// Flatten the leaf rows of the rows in this group
|
const leafRows = depth ? flattenBy(groupedRows, row => row.subRows) : groupedRows;
|
const row = createRow(table, id, leafRows[0].original, index, depth, undefined, parentId);
|
Object.assign(row, {
|
groupingColumnId: columnId,
|
groupingValue,
|
subRows,
|
leafRows,
|
getValue: columnId => {
|
// Don't aggregate columns that are in the grouping
|
if (existingGrouping.includes(columnId)) {
|
if (row._valuesCache.hasOwnProperty(columnId)) {
|
return row._valuesCache[columnId];
|
}
|
if (groupedRows[0]) {
|
var _groupedRows$0$getVal;
|
row._valuesCache[columnId] = (_groupedRows$0$getVal = groupedRows[0].getValue(columnId)) != null ? _groupedRows$0$getVal : undefined;
|
}
|
return row._valuesCache[columnId];
|
}
|
if (row._groupingValuesCache.hasOwnProperty(columnId)) {
|
return row._groupingValuesCache[columnId];
|
}
|
|
// Aggregate the values
|
const column = table.getColumn(columnId);
|
const aggregateFn = column == null ? void 0 : column.getAggregationFn();
|
if (aggregateFn) {
|
row._groupingValuesCache[columnId] = aggregateFn(columnId, leafRows, groupedRows);
|
return row._groupingValuesCache[columnId];
|
}
|
}
|
});
|
subRows.forEach(subRow => {
|
groupedFlatRows.push(subRow);
|
groupedRowsById[subRow.id] = subRow;
|
// if (subRow.getIsGrouped?.()) {
|
// onlyGroupedFlatRows.push(subRow);
|
// onlyGroupedRowsById[subRow.id] = subRow;
|
// } else {
|
// nonGroupedFlatRows.push(subRow);
|
// nonGroupedRowsById[subRow.id] = subRow;
|
// }
|
});
|
|
return row;
|
});
|
return aggregatedGroupedRows;
|
};
|
const groupedRows = groupUpRecursively(rowModel.rows, 0);
|
groupedRows.forEach(subRow => {
|
groupedFlatRows.push(subRow);
|
groupedRowsById[subRow.id] = subRow;
|
// if (subRow.getIsGrouped?.()) {
|
// onlyGroupedFlatRows.push(subRow);
|
// onlyGroupedRowsById[subRow.id] = subRow;
|
// } else {
|
// nonGroupedFlatRows.push(subRow);
|
// nonGroupedRowsById[subRow.id] = subRow;
|
// }
|
});
|
|
return {
|
rows: groupedRows,
|
flatRows: groupedFlatRows,
|
rowsById: groupedRowsById
|
};
|
}, {
|
key: "development" === 'development' && 'getGroupedRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
},
|
onChange: () => {
|
table._queue(() => {
|
table._autoResetExpanded();
|
table._autoResetPageIndex();
|
});
|
}
|
});
|
}
|
function groupBy(rows, columnId) {
|
const groupMap = new Map();
|
return rows.reduce((map, row) => {
|
const resKey = `${row.getGroupingValue(columnId)}`;
|
const previous = map.get(resKey);
|
if (!previous) {
|
map.set(resKey, [row]);
|
} else {
|
previous.push(row);
|
}
|
return map;
|
}, groupMap);
|
}
|
|
function getExpandedRowModel() {
|
return table => memo(() => [table.getState().expanded, table.getPreExpandedRowModel(), table.options.paginateExpandedRows], (expanded, rowModel, paginateExpandedRows) => {
|
if (!rowModel.rows.length || expanded !== true && !Object.keys(expanded != null ? expanded : {}).length) {
|
return rowModel;
|
}
|
if (!paginateExpandedRows) {
|
// Only expand rows at this point if they are being paginated
|
return rowModel;
|
}
|
return expandRows(rowModel);
|
}, {
|
key: "development" === 'development' && 'getExpandedRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
}
|
});
|
}
|
function expandRows(rowModel) {
|
const expandedRows = [];
|
const handleRow = row => {
|
var _row$subRows;
|
expandedRows.push(row);
|
if ((_row$subRows = row.subRows) != null && _row$subRows.length && row.getIsExpanded()) {
|
row.subRows.forEach(handleRow);
|
}
|
};
|
rowModel.rows.forEach(handleRow);
|
return {
|
rows: expandedRows,
|
flatRows: rowModel.flatRows,
|
rowsById: rowModel.rowsById
|
};
|
}
|
|
function getPaginationRowModel(opts) {
|
return table => memo(() => [table.getState().pagination, table.getPrePaginationRowModel(), table.options.paginateExpandedRows ? undefined : table.getState().expanded], (pagination, rowModel) => {
|
if (!rowModel.rows.length) {
|
return rowModel;
|
}
|
const {
|
pageSize,
|
pageIndex
|
} = pagination;
|
let {
|
rows,
|
flatRows,
|
rowsById
|
} = rowModel;
|
const pageStart = pageSize * pageIndex;
|
const pageEnd = pageStart + pageSize;
|
rows = rows.slice(pageStart, pageEnd);
|
let paginatedRowModel;
|
if (!table.options.paginateExpandedRows) {
|
paginatedRowModel = expandRows({
|
rows,
|
flatRows,
|
rowsById
|
});
|
} else {
|
paginatedRowModel = {
|
rows,
|
flatRows,
|
rowsById
|
};
|
}
|
paginatedRowModel.flatRows = [];
|
const handleRow = row => {
|
paginatedRowModel.flatRows.push(row);
|
if (row.subRows.length) {
|
row.subRows.forEach(handleRow);
|
}
|
};
|
paginatedRowModel.rows.forEach(handleRow);
|
return paginatedRowModel;
|
}, {
|
key: "development" === 'development' && 'getPaginationRowModel',
|
debug: () => {
|
var _table$options$debugA;
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
}
|
});
|
}
|
|
export { ColumnSizing, Expanding, Filters, Grouping, Headers, Ordering, Pagination, Pinning, RowSelection, Sorting, Visibility, aggregationFns, buildHeaderGroups, createCell, createColumn, createColumnHelper, createRow, createTable, defaultColumnSizing, expandRows, filterFns, flattenBy, functionalUpdate, getCoreRowModel, getExpandedRowModel, getFacetedMinMaxValues, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getGroupedRowModel, getPaginationRowModel, getSortedRowModel, isFunction, isNumberArray, isRowSelected, isSubRowSelected, makeStateUpdater, memo, noop, orderColumns, passiveEventSupported, reSplitAlphaNumeric, selectRowsFn, shouldAutoRemoveFilter, sortingFns };
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiLCIuLi8uLi9zcmMvY29yZS9jb2x1bW4udHMiLCIuLi8uLi9zcmMvY29yZS9oZWFkZXJzLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL0NvbHVtblNpemluZy50cyIsIi4uLy4uL3NyYy9mZWF0dXJlcy9FeHBhbmRpbmcudHMiLCIuLi8uLi9zcmMvZmlsdGVyRm5zLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL0ZpbHRlcnMudHMiLCIuLi8uLi9zcmMvYWdncmVnYXRpb25GbnMudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvR3JvdXBpbmcudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvT3JkZXJpbmcudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvUGFnaW5hdGlvbi50cyIsIi4uLy4uL3NyYy9mZWF0dXJlcy9QaW5uaW5nLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL1Jvd1NlbGVjdGlvbi50cyIsIi4uLy4uL3NyYy9zb3J0aW5nRm5zLnRzIiwiLi4vLi4vc3JjL2ZlYXR1cmVzL1NvcnRpbmcudHMiLCIuLi8uLi9zcmMvZmVhdHVyZXMvVmlzaWJpbGl0eS50cyIsIi4uLy4uL3NyYy9jb3JlL3RhYmxlLnRzIiwiLi4vLi4vc3JjL2NvcmUvY2VsbC50cyIsIi4uLy4uL3NyYy9jb3JlL3Jvdy50cyIsIi4uLy4uL3NyYy9jb2x1bW5IZWxwZXIudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0Q29yZVJvd01vZGVsLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2ZpbHRlclJvd3NVdGlscy50cyIsIi4uLy4uL3NyYy91dGlscy9nZXRGaWx0ZXJlZFJvd01vZGVsLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEZhY2V0ZWRSb3dNb2RlbC50cyIsIi4uLy4uL3NyYy91dGlscy9nZXRGYWNldGVkVW5pcXVlVmFsdWVzLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEZhY2V0ZWRNaW5NYXhWYWx1ZXMudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0U29ydGVkUm93TW9kZWwudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0R3JvdXBlZFJvd01vZGVsLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEV4cGFuZGVkUm93TW9kZWwudHMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0UGFnaW5hdGlvblJvd01vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhYmxlU3RhdGUsIFVwZGF0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsS2V5czxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBPbWl0PFQsIEs+ICYgUGFydGlhbDxQaWNrPFQsIEs+PlxuZXhwb3J0IHR5cGUgUmVxdWlyZWRLZXlzPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IE9taXQ8VCwgSz4gJlxuICBSZXF1aXJlZDxQaWNrPFQsIEs+PlxuZXhwb3J0IHR5cGUgT3ZlcndyaXRlPFQsIFUgZXh0ZW5kcyB7IFtUS2V5IGluIGtleW9mIFRdPzogYW55IH0+ID0gT21pdDxcbiAgVCxcbiAga2V5b2YgVVxuPiAmXG4gIFVcblxuZXhwb3J0IHR5cGUgVW5pb25Ub0ludGVyc2VjdGlvbjxUPiA9IChcbiAgVCBleHRlbmRzIGFueSA/ICh4OiBUKSA9PiBhbnkgOiBuZXZlclxuKSBleHRlbmRzICh4OiBpbmZlciBSKSA9PiBhbnlcbiAgPyBSXG4gIDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgSXNBbnk8VCwgWSwgTj4gPSAxIGV4dGVuZHMgMCAmIFQgPyBZIDogTlxuZXhwb3J0IHR5cGUgSXNLbm93bjxULCBZLCBOPiA9IHVua25vd24gZXh0ZW5kcyBUID8gTiA6IFlcblxudHlwZSBDb21wdXRlUmFuZ2U8XG4gIE4gZXh0ZW5kcyBudW1iZXIsXG4gIFJlc3VsdCBleHRlbmRzIEFycmF5PHVua25vd24+ID0gW10sXG4+ID0gUmVzdWx0WydsZW5ndGgnXSBleHRlbmRzIE5cbiAgPyBSZXN1bHRcbiAgOiBDb21wdXRlUmFuZ2U8TiwgWy4uLlJlc3VsdCwgUmVzdWx0WydsZW5ndGgnXV0+XG50eXBlIEluZGV4NDAgPSBDb21wdXRlUmFuZ2U8NDA+W251bWJlcl1cblxuLy8gSXMgdGhpcyB0eXBlIGEgdHVwbGU/XG50eXBlIElzVHVwbGU8VD4gPSBUIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gJiB7IGxlbmd0aDogaW5mZXIgTGVuZ3RoIH1cbiAgPyBMZW5ndGggZXh0ZW5kcyBJbmRleDQwXG4gICAgPyBUXG4gICAgOiBuZXZlclxuICA6IG5ldmVyXG5cbi8vIElmIHRoaXMgdHlwZSBpcyBhIHR1cGxlLCB3aGF0IGluZGljZXMgYXJlIGFsbG93ZWQ/XG50eXBlIEFsbG93ZWRJbmRleGVzPFxuICBUdXBsZSBleHRlbmRzIFJlYWRvbmx5QXJyYXk8YW55PixcbiAgS2V5cyBleHRlbmRzIG51bWJlciA9IG5ldmVyLFxuPiA9IFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgW11cbiAgPyBLZXlzXG4gIDogVHVwbGUgZXh0ZW5kcyByZWFkb25seSBbaW5mZXIgXywgLi4uaW5mZXIgVGFpbF1cbiAgPyBBbGxvd2VkSW5kZXhlczxUYWlsLCBLZXlzIHwgVGFpbFsnbGVuZ3RoJ10+XG4gIDogS2V5c1xuXG5leHBvcnQgdHlwZSBEZWVwS2V5czxULCBURGVwdGggZXh0ZW5kcyBhbnlbXSA9IFtdPiA9IFREZXB0aFsnbGVuZ3RoJ10gZXh0ZW5kcyA1XG4gID8gbmV2ZXJcbiAgOiB1bmtub3duIGV4dGVuZHMgVFxuICA/IHN0cmluZ1xuICA6IG9iamVjdCBleHRlbmRzIFRcbiAgPyBzdHJpbmdcbiAgOiBUIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gJiBJc1R1cGxlPFQ+XG4gID8gQWxsb3dlZEluZGV4ZXM8VD4gfCBEZWVwS2V5c1ByZWZpeDxULCBBbGxvd2VkSW5kZXhlczxUPiwgVERlcHRoPlxuICA6IFQgZXh0ZW5kcyBhbnlbXVxuICA/IERlZXBLZXlzPFRbbnVtYmVyXSwgWy4uLlREZXB0aCwgYW55XT5cbiAgOiBUIGV4dGVuZHMgRGF0ZVxuICA/IG5ldmVyXG4gIDogVCBleHRlbmRzIG9iamVjdFxuICA/IChrZXlvZiBUICYgc3RyaW5nKSB8IERlZXBLZXlzUHJlZml4PFQsIGtleW9mIFQsIFREZXB0aD5cbiAgOiBuZXZlclxuXG50eXBlIERlZXBLZXlzUHJlZml4PFxuICBULFxuICBUUHJlZml4LFxuICBURGVwdGggZXh0ZW5kcyBhbnlbXSxcbj4gPSBUUHJlZml4IGV4dGVuZHMga2V5b2YgVCAmIChudW1iZXIgfCBzdHJpbmcpXG4gID8gYCR7VFByZWZpeH0uJHtEZWVwS2V5czxUW1RQcmVmaXhdLCBbLi4uVERlcHRoLCBhbnldPiAmIHN0cmluZ31gXG4gIDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgRGVlcFZhbHVlPFQsIFRQcm9wPiA9IFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBhbnk+XG4gID8gVFByb3AgZXh0ZW5kcyBgJHtpbmZlciBUQnJhbmNofS4ke2luZmVyIFREZWVwUHJvcH1gXG4gICAgPyBEZWVwVmFsdWU8VFtUQnJhbmNoXSwgVERlZXBQcm9wPlxuICAgIDogVFtUUHJvcCAmIHN0cmluZ11cbiAgOiBuZXZlclxuXG5leHBvcnQgdHlwZSBOb0luZmVyPFQ+ID0gW1RdW1QgZXh0ZW5kcyBhbnkgPyAwIDogbmV2ZXJdXG5cbmV4cG9ydCB0eXBlIEdldHRlcjxUVmFsdWU+ID0gPFRUVmFsdWUgPSBUVmFsdWU+KCkgPT4gTm9JbmZlcjxUVFZhbHVlPlxuXG4vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIGZ1bmN0aW9uYWxVcGRhdGU8VD4odXBkYXRlcjogVXBkYXRlcjxUPiwgaW5wdXQ6IFQpOiBUIHtcbiAgcmV0dXJuIHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nXG4gICAgPyAodXBkYXRlciBhcyAoaW5wdXQ6IFQpID0+IFQpKGlucHV0KVxuICAgIDogdXBkYXRlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VTdGF0ZVVwZGF0ZXI8SyBleHRlbmRzIGtleW9mIFRhYmxlU3RhdGU+KFxuICBrZXk6IEssXG4gIGluc3RhbmNlOiB1bmtub3duXG4pIHtcbiAgcmV0dXJuICh1cGRhdGVyOiBVcGRhdGVyPFRhYmxlU3RhdGVbS10+KSA9PiB7XG4gICAgOyhpbnN0YW5jZSBhcyBhbnkpLnNldFN0YXRlKDxUVGFibGVTdGF0ZT4ob2xkOiBUVGFibGVTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub2xkLFxuICAgICAgICBba2V5XTogZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCAob2xkIGFzIGFueSlba2V5XSksXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG50eXBlIEFueUZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueSkgPT4gYW55XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uPFQgZXh0ZW5kcyBBbnlGdW5jdGlvbj4oZDogYW55KTogZCBpcyBUIHtcbiAgcmV0dXJuIGQgaW5zdGFuY2VvZiBGdW5jdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheShkOiBhbnkpOiBkIGlzIG51bWJlcltdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZCkgJiYgZC5ldmVyeSh2YWwgPT4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQnk8VE5vZGU+KFxuICBhcnI6IFROb2RlW10sXG4gIGdldENoaWxkcmVuOiAoaXRlbTogVE5vZGUpID0+IFROb2RlW11cbikge1xuICBjb25zdCBmbGF0OiBUTm9kZVtdID0gW11cblxuICBjb25zdCByZWN1cnNlID0gKHN1YkFycjogVE5vZGVbXSkgPT4ge1xuICAgIHN1YkFyci5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgZmxhdC5wdXNoKGl0ZW0pXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGl0ZW0pXG4gICAgICBpZiAoY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICByZWN1cnNlKGNoaWxkcmVuKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZWN1cnNlKGFycilcblxuICByZXR1cm4gZmxhdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVtbzxURGVwcyBleHRlbmRzIHJlYWRvbmx5IGFueVtdLCBUUmVzdWx0PihcbiAgZ2V0RGVwczogKCkgPT4gWy4uLlREZXBzXSxcbiAgZm46ICguLi5hcmdzOiBOb0luZmVyPFsuLi5URGVwc10+KSA9PiBUUmVzdWx0LFxuICBvcHRzOiB7XG4gICAga2V5OiBhbnlcbiAgICBkZWJ1Zz86ICgpID0+IGFueVxuICAgIG9uQ2hhbmdlPzogKHJlc3VsdDogVFJlc3VsdCkgPT4gdm9pZFxuICB9XG4pOiAoKSA9PiBUUmVzdWx0IHtcbiAgbGV0IGRlcHM6IGFueVtdID0gW11cbiAgbGV0IHJlc3VsdDogVFJlc3VsdCB8IHVuZGVmaW5lZFxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGRlcFRpbWU6IG51bWJlclxuICAgIGlmIChvcHRzLmtleSAmJiBvcHRzLmRlYnVnKSBkZXBUaW1lID0gRGF0ZS5ub3coKVxuXG4gICAgY29uc3QgbmV3RGVwcyA9IGdldERlcHMoKVxuXG4gICAgY29uc3QgZGVwc0NoYW5nZWQgPVxuICAgICAgbmV3RGVwcy5sZW5ndGggIT09IGRlcHMubGVuZ3RoIHx8XG4gICAgICBuZXdEZXBzLnNvbWUoKGRlcDogYW55LCBpbmRleDogbnVtYmVyKSA9PiBkZXBzW2luZGV4XSAhPT0gZGVwKVxuXG4gICAgaWYgKCFkZXBzQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCFcbiAgICB9XG5cbiAgICBkZXBzID0gbmV3RGVwc1xuXG4gICAgbGV0IHJlc3VsdFRpbWU6IG51bWJlclxuICAgIGlmIChvcHRzLmtleSAmJiBvcHRzLmRlYnVnKSByZXN1bHRUaW1lID0gRGF0ZS5ub3coKVxuXG4gICAgcmVzdWx0ID0gZm4oLi4ubmV3RGVwcylcbiAgICBvcHRzPy5vbkNoYW5nZT8uKHJlc3VsdClcblxuICAgIGlmIChvcHRzLmtleSAmJiBvcHRzLmRlYnVnKSB7XG4gICAgICBpZiAob3B0cz8uZGVidWcoKSkge1xuICAgICAgICBjb25zdCBkZXBFbmRUaW1lID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIGRlcFRpbWUhKSAqIDEwMCkgLyAxMDBcbiAgICAgICAgY29uc3QgcmVzdWx0RW5kVGltZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLSByZXN1bHRUaW1lISkgKiAxMDApIC8gMTAwXG4gICAgICAgIGNvbnN0IHJlc3VsdEZwc1BlcmNlbnRhZ2UgPSByZXN1bHRFbmRUaW1lIC8gMTZcblxuICAgICAgICBjb25zdCBwYWQgPSAoc3RyOiBudW1iZXIgfCBzdHJpbmcsIG51bTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgc3RyID0gU3RyaW5nKHN0cilcbiAgICAgICAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IG51bSkge1xuICAgICAgICAgICAgc3RyID0gJyAnICsgc3RyXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdHJcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBgJWPij7EgJHtwYWQocmVzdWx0RW5kVGltZSwgNSl9IC8ke3BhZChkZXBFbmRUaW1lLCA1KX0gbXNgLFxuICAgICAgICAgIGBcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogLjZyZW07XG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgICAgIGNvbG9yOiBoc2woJHtNYXRoLm1heChcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgTWF0aC5taW4oMTIwIC0gMTIwICogcmVzdWx0RnBzUGVyY2VudGFnZSwgMTIwKVxuICAgICAgICAgICAgKX1kZWcgMTAwJSAzMSUpO2AsXG4gICAgICAgICAgb3B0cz8ua2V5XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW4sXG4gIFRhYmxlLFxuICBBY2Nlc3NvckZuLFxuICBDb2x1bW5EZWYsXG4gIFJvd0RhdGEsXG4gIENvbHVtbkRlZlJlc29sdmVkLFxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBDb3JlQ29sdW1uPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgYWNjZXNzb3IgZnVuY3Rpb24gdG8gdXNlIHdoZW4gZXh0cmFjdGluZyB0aGUgdmFsdWUgZm9yIHRoZSBjb2x1bW4gZnJvbSBlYWNoIHJvdy4gV2lsbCBvbmx5IGJlIGRlZmluZWQgaWYgdGhlIGNvbHVtbiBkZWYgaGFzIGEgdmFsaWQgYWNjZXNzb3Iga2V5IG9yIGZ1bmN0aW9uIGRlZmluZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jYWNjZXNzb3JmbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgYWNjZXNzb3JGbj86IEFjY2Vzc29yRm48VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBjb2x1bW4gZGVmIHVzZWQgdG8gY3JlYXRlIHRoZSBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jY29sdW1uZGVmKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBjb2x1bW5EZWY6IENvbHVtbkRlZjxURGF0YSwgVFZhbHVlPlxuICAvKipcbiAgICogVGhlIGNoaWxkIGNvbHVtbiAoaWYgdGhlIGNvbHVtbiBpcyBhIGdyb3VwIGNvbHVtbikuIFdpbGwgYmUgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIGNvbHVtbiBpcyBub3QgYSBncm91cCBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgY29sdW1uczogQ29sdW1uPFREYXRhLCBUVmFsdWU+W11cbiAgLyoqXG4gICAqIFRoZSBkZXB0aCBvZiB0aGUgY29sdW1uIChpZiBncm91cGVkKSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb2x1bW4gZGVmIGFycmF5LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvY29sdW1uI2RlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBkZXB0aDogbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmbGF0dGVuZWQgYXJyYXkgb2YgdGhpcyBjb2x1bW4gYW5kIGFsbCBjaGlsZC9ncmFuZC1jaGlsZCBjb2x1bW5zIGZvciB0aGlzIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NvbHVtbiNnZXRmbGF0Y29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgZ2V0RmxhdENvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgVFZhbHVlPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBsZWFmLW5vZGUgY29sdW1ucyBmb3IgdGhpcyBjb2x1bW4uIElmIGEgY29sdW1uIGhhcyBubyBjaGlsZHJlbiwgaXQgaXMgY29uc2lkZXJlZCB0aGUgb25seSBsZWFmLW5vZGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvY29sdW1uI2dldGxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBnZXRMZWFmQ29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCBUVmFsdWU+W11cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbHVtbiByZXNvbHZlZCBpbiB0aGlzIHByaW9yaXR5OlxuICAgICAgLSBBIG1hbnVhbCBgaWRgIHByb3BlcnR5IGZyb20gdGhlIGNvbHVtbiBkZWZcbiAgICAgIC0gVGhlIGFjY2Vzc29yIGtleSBmcm9tIHRoZSBjb2x1bW4gZGVmXG4gICAgICAtIFRoZSBoZWFkZXIgc3RyaW5nIGZyb20gdGhlIGNvbHVtbiBkZWZcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NvbHVtbiNpZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1kZWZzKVxuICAgKi9cbiAgaWQ6IHN0cmluZ1xuICAvKipcbiAgICogVGhlIHBhcmVudCBjb2x1bW4gZm9yIHRoaXMgY29sdW1uLiBXaWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIGlzIGEgcm9vdCBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jb2x1bW4jcGFyZW50KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLWRlZnMpXG4gICAqL1xuICBwYXJlbnQ/OiBDb2x1bW48VERhdGEsIFRWYWx1ZT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbjxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGNvbHVtbkRlZjogQ29sdW1uRGVmPFREYXRhLCBUVmFsdWU+LFxuICBkZXB0aDogbnVtYmVyLFxuICBwYXJlbnQ/OiBDb2x1bW48VERhdGEsIFRWYWx1ZT5cbik6IENvbHVtbjxURGF0YSwgVFZhbHVlPiB7XG4gIGNvbnN0IGRlZmF1bHRDb2x1bW4gPSB0YWJsZS5fZ2V0RGVmYXVsdENvbHVtbkRlZigpXG5cbiAgY29uc3QgcmVzb2x2ZWRDb2x1bW5EZWYgPSB7XG4gICAgLi4uZGVmYXVsdENvbHVtbixcbiAgICAuLi5jb2x1bW5EZWYsXG4gIH0gYXMgQ29sdW1uRGVmUmVzb2x2ZWQ8VERhdGE+XG5cbiAgY29uc3QgYWNjZXNzb3JLZXkgPSByZXNvbHZlZENvbHVtbkRlZi5hY2Nlc3NvcktleVxuXG4gIGxldCBpZCA9XG4gICAgcmVzb2x2ZWRDb2x1bW5EZWYuaWQgPz9cbiAgICAoYWNjZXNzb3JLZXkgPyBhY2Nlc3NvcktleS5yZXBsYWNlKCcuJywgJ18nKSA6IHVuZGVmaW5lZCkgPz9cbiAgICAodHlwZW9mIHJlc29sdmVkQ29sdW1uRGVmLmhlYWRlciA9PT0gJ3N0cmluZydcbiAgICAgID8gcmVzb2x2ZWRDb2x1bW5EZWYuaGVhZGVyXG4gICAgICA6IHVuZGVmaW5lZClcblxuICBsZXQgYWNjZXNzb3JGbjogQWNjZXNzb3JGbjxURGF0YT4gfCB1bmRlZmluZWRcblxuICBpZiAocmVzb2x2ZWRDb2x1bW5EZWYuYWNjZXNzb3JGbikge1xuICAgIGFjY2Vzc29yRm4gPSByZXNvbHZlZENvbHVtbkRlZi5hY2Nlc3NvckZuXG4gIH0gZWxzZSBpZiAoYWNjZXNzb3JLZXkpIHtcbiAgICAvLyBTdXBwb3J0IGRlZXAgYWNjZXNzb3Iga2V5c1xuICAgIGlmIChhY2Nlc3NvcktleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICBhY2Nlc3NvckZuID0gKG9yaWdpbmFsUm93OiBURGF0YSkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxSb3cgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFjY2Vzc29yS2V5LnNwbGl0KCcuJykpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQ/LltrZXldXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgcmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYFwiJHtrZXl9XCIgaW4gZGVlcGx5IG5lc3RlZCBrZXkgXCIke2FjY2Vzc29yS2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhY2Nlc3NvckZuID0gKG9yaWdpbmFsUm93OiBURGF0YSkgPT5cbiAgICAgICAgKG9yaWdpbmFsUm93IGFzIGFueSlbcmVzb2x2ZWRDb2x1bW5EZWYuYWNjZXNzb3JLZXldXG4gICAgfVxuICB9XG5cbiAgaWYgKCFpZCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHJlc29sdmVkQ29sdW1uRGVmLmFjY2Vzc29yRm5cbiAgICAgICAgICA/IGBDb2x1bW5zIHJlcXVpcmUgYW4gaWQgd2hlbiB1c2luZyBhbiBhY2Nlc3NvckZuYFxuICAgICAgICAgIDogYENvbHVtbnMgcmVxdWlyZSBhbiBpZCB3aGVuIHVzaW5nIGEgbm9uLXN0cmluZyBoZWFkZXJgXG4gICAgICApXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICBsZXQgY29sdW1uOiBDb3JlQ29sdW1uPFREYXRhLCBhbnk+ID0ge1xuICAgIGlkOiBgJHtTdHJpbmcoaWQpfWAsXG4gICAgYWNjZXNzb3JGbixcbiAgICBwYXJlbnQ6IHBhcmVudCBhcyBhbnksXG4gICAgZGVwdGgsXG4gICAgY29sdW1uRGVmOiByZXNvbHZlZENvbHVtbkRlZiBhcyBDb2x1bW5EZWY8VERhdGEsIGFueT4sXG4gICAgY29sdW1uczogW10sXG4gICAgZ2V0RmxhdENvbHVtbnM6IG1lbW8oXG4gICAgICAoKSA9PiBbdHJ1ZV0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgY29sdW1uIGFzIENvbHVtbjxURGF0YSwgVFZhbHVlPixcbiAgICAgICAgICAuLi5jb2x1bW4uY29sdW1ucz8uZmxhdE1hcChkID0+IGQuZ2V0RmxhdENvbHVtbnMoKSksXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJiAnY29sdW1uLmdldEZsYXRDb2x1bW5zJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0NvbHVtbnMsXG4gICAgICB9XG4gICAgKSxcbiAgICBnZXRMZWFmQ29sdW1uczogbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5fZ2V0T3JkZXJDb2x1bW5zRm4oKV0sXG4gICAgICBvcmRlckNvbHVtbnMgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIGxldCBsZWFmQ29sdW1ucyA9IGNvbHVtbi5jb2x1bW5zLmZsYXRNYXAoY29sdW1uID0+XG4gICAgICAgICAgICBjb2x1bW4uZ2V0TGVhZkNvbHVtbnMoKVxuICAgICAgICAgIClcblxuICAgICAgICAgIHJldHVybiBvcmRlckNvbHVtbnMobGVhZkNvbHVtbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2NvbHVtbiBhcyBDb2x1bW48VERhdGEsIFRWYWx1ZT5dXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiYgJ2NvbHVtbi5nZXRMZWFmQ29sdW1ucycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgfVxuICAgICksXG4gIH1cblxuICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGFibGUuX2ZlYXR1cmVzKSB7XG4gICAgZmVhdHVyZS5jcmVhdGVDb2x1bW4/Lihjb2x1bW4sIHRhYmxlKVxuICB9XG5cbiAgLy8gWWVzLCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGFibGUgdG8gdWtub3duLCBiZWNhdXNlIHdlIGtub3cgbW9yZSB0aGFuIHRoZSBjb21waWxlciBoZXJlLlxuICByZXR1cm4gY29sdW1uIGFzIENvbHVtbjxURGF0YSwgVFZhbHVlPlxufVxuIiwiaW1wb3J0IHsgUm93RGF0YSwgQ29sdW1uLCBIZWFkZXIsIEhlYWRlckdyb3VwLCBUYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi90YWJsZSdcblxuZXhwb3J0IGludGVyZmFjZSBDb3JlSGVhZGVyR3JvdXA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIGRlcHRoOiBudW1iZXJcbiAgaGVhZGVyczogSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJDb250ZXh0PFREYXRhLCBUVmFsdWU+IHtcbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIGEgY29sdW1uLlxuICAgKi9cbiAgY29sdW1uOiBDb2x1bW48VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIGEgaGVhZGVyLlxuICAgKi9cbiAgaGVhZGVyOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZSBpbnN0YW5jZS5cbiAgICovXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3JlSGVhZGVyPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgY29sLXNwYW4gZm9yIHRoZSBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjY29sc3BhbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBjb2xTcGFuOiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBoZWFkZXIncyBhc3NvY2lhdGVkIGNvbHVtbiBvYmplY3QuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjY29sdW1uKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+XG4gIC8qKlxuICAgKiBUaGUgZGVwdGggb2YgdGhlIGhlYWRlciwgemVyby1pbmRleGVkIGJhc2VkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVyI2RlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGRlcHRoOiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlbmRlcmluZyBjb250ZXh0IChvciBwcm9wcykgZm9yIGNvbHVtbi1iYXNlZCBjb21wb25lbnRzIGxpa2UgaGVhZGVycywgZm9vdGVycyBhbmQgZmlsdGVycy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNnZXRjb250ZXh0KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldENvbnRleHQ6ICgpID0+IEhlYWRlckNvbnRleHQ8VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxlYWYgaGVhZGVycyBoaWVyYXJjaGljYWxseSBuZXN0ZWQgdW5kZXIgdGhpcyBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjZ2V0bGVhZmhlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0TGVhZkhlYWRlcnM6ICgpID0+IEhlYWRlcjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogVGhlIGhlYWRlcidzIGFzc29jaWF0ZWQgaGVhZGVyIGdyb3VwIG9iamVjdC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNoZWFkZXJncm91cClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBoZWFkZXJHcm91cDogSGVhZGVyR3JvdXA8VERhdGE+XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXIjaWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgaWQ6IHN0cmluZ1xuICAvKipcbiAgICogVGhlIGluZGV4IGZvciB0aGUgaGVhZGVyIHdpdGhpbiB0aGUgaGVhZGVyIGdyb3VwLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVyI2luZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGluZGV4OiBudW1iZXJcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZW5vdGluZyBpZiB0aGUgaGVhZGVyIGlzIGEgcGxhY2Vob2xkZXIgaGVhZGVyLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVyI2lzcGxhY2Vob2xkZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgaXNQbGFjZWhvbGRlcjogYm9vbGVhblxuICAvKipcbiAgICogSWYgdGhlIGhlYWRlciBpcyBhIHBsYWNlaG9sZGVyIGhlYWRlciwgdGhpcyB3aWxsIGJlIGEgdW5pcXVlIGhlYWRlciBJRCB0aGF0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW55IG90aGVyIGhlYWRlcnMgYWNyb3NzIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNwbGFjZWhvbGRlcmlkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIHBsYWNlaG9sZGVySWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSByb3ctc3BhbiBmb3IgdGhlIGhlYWRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNyb3dzcGFuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIHJvd1NwYW46IG51bWJlclxuICAvKipcbiAgICogVGhlIGhlYWRlcidzIGhpZXJhcmNoaWNhbCBzdWIvY2hpbGQgaGVhZGVycy4gV2lsbCBiZSBlbXB0eSBpZiB0aGUgaGVhZGVyJ3MgYXNzb2NpYXRlZCBjb2x1bW4gaXMgYSBsZWFmLWNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlciNzdWJoZWFkZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIHN1YkhlYWRlcnM6IEhlYWRlcjxURGF0YSwgVFZhbHVlPltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyc0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgaGVhZGVyIGdyb3VwcyBmb3IgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRoZWFkZXJncm91cHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0SGVhZGVyR3JvdXBzOiAoKSA9PiBIZWFkZXJHcm91cDxURGF0YT5bXVxuICAvKipcbiAgICogSWYgcGlubmluZywgcmV0dXJucyB0aGUgaGVhZGVyIGdyb3VwcyBmb3IgdGhlIGxlZnQgcGlubmVkIGNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGxlZnRoZWFkZXJncm91cHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0TGVmdEhlYWRlckdyb3VwczogKCkgPT4gSGVhZGVyR3JvdXA8VERhdGE+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgdGhlIGhlYWRlciBncm91cHMgZm9yIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBpbm5lZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0Y2VudGVyaGVhZGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldENlbnRlckhlYWRlckdyb3VwczogKCkgPT4gSGVhZGVyR3JvdXA8VERhdGE+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgdGhlIGhlYWRlciBncm91cHMgZm9yIHRoZSByaWdodCBwaW5uZWQgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0cmlnaHRoZWFkZXJncm91cHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0UmlnaHRIZWFkZXJHcm91cHM6ICgpID0+IEhlYWRlckdyb3VwPFREYXRhPltdXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZvb3RlciBncm91cHMgZm9yIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0Zm9vdGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldEZvb3Rlckdyb3VwczogKCkgPT4gSGVhZGVyR3JvdXA8VERhdGE+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgdGhlIGZvb3RlciBncm91cHMgZm9yIHRoZSBsZWZ0IHBpbm5lZCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRsZWZ0Zm9vdGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldExlZnRGb290ZXJHcm91cHM6ICgpID0+IEhlYWRlckdyb3VwPFREYXRhPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIHRoZSBmb290ZXIgZ3JvdXBzIGZvciBjb2x1bW5zIHRoYXQgYXJlIG5vdCBwaW5uZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGNlbnRlcmZvb3Rlcmdyb3VwcylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRDZW50ZXJGb290ZXJHcm91cHM6ICgpID0+IEhlYWRlckdyb3VwPFREYXRhPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIHRoZSBmb290ZXIgZ3JvdXBzIGZvciB0aGUgcmlnaHQgcGlubmVkIGNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldHJpZ2h0Zm9vdGVyZ3JvdXBzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldFJpZ2h0Rm9vdGVyR3JvdXBzOiAoKSA9PiBIZWFkZXJHcm91cDxURGF0YT5bXVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCBjb2x1bW5zIGluIHRoZSB0YWJsZSwgaW5jbHVkaW5nIHBhcmVudCBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRmbGF0aGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRGbGF0SGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCBsZWZ0IHBpbm5lZCBjb2x1bW5zIGluIHRoZSB0YWJsZSwgaW5jbHVkaW5nIHBhcmVudCBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRsZWZ0ZmxhdGhlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0TGVmdEZsYXRIZWFkZXJzOiAoKSA9PiBIZWFkZXI8VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgaGVhZGVycyBmb3IgYWxsIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBpbm5lZCwgaW5jbHVkaW5nIHBhcmVudCBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRjZW50ZXJmbGF0aGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRDZW50ZXJGbGF0SGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCByaWdodCBwaW5uZWQgY29sdW1ucyBpbiB0aGUgdGFibGUsIGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2hlYWRlcnMjZ2V0cmlnaHRmbGF0aGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRSaWdodEZsYXRIZWFkZXJzOiAoKSA9PiBIZWFkZXI8VERhdGEsIHVua25vd24+W11cblxuICAvKipcbiAgICogUmV0dXJucyBoZWFkZXJzIGZvciBhbGwgbGVhZiBjb2x1bW5zIGluIHRoZSB0YWJsZSwgKG5vdCBpbmNsdWRpbmcgcGFyZW50IGhlYWRlcnMpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvaGVhZGVycyNnZXRsZWFmaGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRMZWFmSGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIGhlYWRlcnMgZm9yIGFsbCBsZWZ0IHBpbm5lZCBsZWFmIGNvbHVtbnMgaW4gdGhlIHRhYmxlLCAobm90IGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycykuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGxlZnRsZWFmaGVhZGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2hlYWRlcnMpXG4gICAqL1xuICBnZXRMZWZ0TGVhZkhlYWRlcnM6ICgpID0+IEhlYWRlcjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogSWYgcGlubmluZywgcmV0dXJucyBoZWFkZXJzIGZvciBhbGwgY29sdW1ucyB0aGF0IGFyZSBub3QgcGlubmVkLCAobm90IGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycykuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldGNlbnRlcmxlYWZoZWFkZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvaGVhZGVycylcbiAgICovXG4gIGdldENlbnRlckxlYWZIZWFkZXJzOiAoKSA9PiBIZWFkZXI8VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIElmIHBpbm5pbmcsIHJldHVybnMgaGVhZGVycyBmb3IgYWxsIHJpZ2h0IHBpbm5lZCBsZWFmIGNvbHVtbnMgaW4gdGhlIHRhYmxlLCAobm90IGluY2x1ZGluZyBwYXJlbnQgaGVhZGVycykuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9oZWFkZXJzI2dldHJpZ2h0bGVhZmhlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9oZWFkZXJzKVxuICAgKi9cbiAgZ2V0UmlnaHRMZWFmSGVhZGVyczogKCkgPT4gSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG59XG5cbi8vXG5cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcjxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICBvcHRpb25zOiB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBpc1BsYWNlaG9sZGVyPzogYm9vbGVhblxuICAgIHBsYWNlaG9sZGVySWQ/OiBzdHJpbmdcbiAgICBpbmRleDogbnVtYmVyXG4gICAgZGVwdGg6IG51bWJlclxuICB9XG4pOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT4ge1xuICBjb25zdCBpZCA9IG9wdGlvbnMuaWQgPz8gY29sdW1uLmlkXG5cbiAgbGV0IGhlYWRlcjogQ29yZUhlYWRlcjxURGF0YSwgVFZhbHVlPiA9IHtcbiAgICBpZCxcbiAgICBjb2x1bW4sXG4gICAgaW5kZXg6IG9wdGlvbnMuaW5kZXgsXG4gICAgaXNQbGFjZWhvbGRlcjogISFvcHRpb25zLmlzUGxhY2Vob2xkZXIsXG4gICAgcGxhY2Vob2xkZXJJZDogb3B0aW9ucy5wbGFjZWhvbGRlcklkLFxuICAgIGRlcHRoOiBvcHRpb25zLmRlcHRoLFxuICAgIHN1YkhlYWRlcnM6IFtdLFxuICAgIGNvbFNwYW46IDAsXG4gICAgcm93U3BhbjogMCxcbiAgICBoZWFkZXJHcm91cDogbnVsbCEsXG4gICAgZ2V0TGVhZkhlYWRlcnM6ICgpOiBIZWFkZXI8VERhdGEsIHVua25vd24+W10gPT4ge1xuICAgICAgY29uc3QgbGVhZkhlYWRlcnM6IEhlYWRlcjxURGF0YSwgdW5rbm93bj5bXSA9IFtdXG5cbiAgICAgIGNvbnN0IHJlY3Vyc2VIZWFkZXIgPSAoaDogQ29yZUhlYWRlcjxURGF0YSwgYW55PikgPT4ge1xuICAgICAgICBpZiAoaC5zdWJIZWFkZXJzICYmIGguc3ViSGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBoLnN1YkhlYWRlcnMubWFwKHJlY3Vyc2VIZWFkZXIpXG4gICAgICAgIH1cbiAgICAgICAgbGVhZkhlYWRlcnMucHVzaChoIGFzIEhlYWRlcjxURGF0YSwgdW5rbm93bj4pXG4gICAgICB9XG5cbiAgICAgIHJlY3Vyc2VIZWFkZXIoaGVhZGVyKVxuXG4gICAgICByZXR1cm4gbGVhZkhlYWRlcnNcbiAgICB9LFxuICAgIGdldENvbnRleHQ6ICgpID0+ICh7XG4gICAgICB0YWJsZSxcbiAgICAgIGhlYWRlcjogaGVhZGVyIGFzIEhlYWRlcjxURGF0YSwgVFZhbHVlPixcbiAgICAgIGNvbHVtbixcbiAgICB9KSxcbiAgfVxuXG4gIHRhYmxlLl9mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgIGZlYXR1cmUuY3JlYXRlSGVhZGVyPy4oaGVhZGVyLCB0YWJsZSlcbiAgfSlcblxuICByZXR1cm4gaGVhZGVyIGFzIEhlYWRlcjxURGF0YSwgVFZhbHVlPlxufVxuXG5leHBvcnQgY29uc3QgSGVhZGVyczogVGFibGVGZWF0dXJlID0ge1xuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIC8vIEhlYWRlciBHcm91cHNcblxuICAgIHRhYmxlLmdldEhlYWRlckdyb3VwcyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldEFsbENvbHVtbnMoKSxcbiAgICAgICAgdGFibGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKCksXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHQsXG4gICAgICBdLFxuICAgICAgKGFsbENvbHVtbnMsIGxlYWZDb2x1bW5zLCBsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0Q29sdW1ucyA9XG4gICAgICAgICAgbGVmdFxuICAgICAgICAgICAgPy5tYXAoY29sdW1uSWQgPT4gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGNvbHVtbklkKSEpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdXG5cbiAgICAgICAgY29uc3QgcmlnaHRDb2x1bW5zID1cbiAgICAgICAgICByaWdodFxuICAgICAgICAgICAgPy5tYXAoY29sdW1uSWQgPT4gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGNvbHVtbklkKSEpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdXG5cbiAgICAgICAgY29uc3QgY2VudGVyQ29sdW1ucyA9IGxlYWZDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICBjb2x1bW4gPT4gIWxlZnQ/LmluY2x1ZGVzKGNvbHVtbi5pZCkgJiYgIXJpZ2h0Py5pbmNsdWRlcyhjb2x1bW4uaWQpXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBoZWFkZXJHcm91cHMgPSBidWlsZEhlYWRlckdyb3VwcyhcbiAgICAgICAgICBhbGxDb2x1bW5zLFxuICAgICAgICAgIFsuLi5sZWZ0Q29sdW1ucywgLi4uY2VudGVyQ29sdW1ucywgLi4ucmlnaHRDb2x1bW5zXSxcbiAgICAgICAgICB0YWJsZVxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwc1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0SGVhZGVyR3JvdXBzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVySGVhZGVyR3JvdXBzID0gbWVtbyhcbiAgICAgICgpID0+IFtcbiAgICAgICAgdGFibGUuZ2V0QWxsQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLmxlZnQsXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5yaWdodCxcbiAgICAgIF0sXG4gICAgICAoYWxsQ29sdW1ucywgbGVhZkNvbHVtbnMsIGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICAgIGxlYWZDb2x1bW5zID0gbGVhZkNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgIGNvbHVtbiA9PiAhbGVmdD8uaW5jbHVkZXMoY29sdW1uLmlkKSAmJiAhcmlnaHQ/LmluY2x1ZGVzKGNvbHVtbi5pZClcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gYnVpbGRIZWFkZXJHcm91cHMoYWxsQ29sdW1ucywgbGVhZkNvbHVtbnMsIHRhYmxlLCAnY2VudGVyJylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldENlbnRlckhlYWRlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIHRhYmxlLmdldExlZnRIZWFkZXJHcm91cHMgPSBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRBbGxDb2x1bW5zKCksXG4gICAgICAgIHRhYmxlLmdldFZpc2libGVMZWFmQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxcbiAgICAgIF0sXG4gICAgICAoYWxsQ29sdW1ucywgbGVhZkNvbHVtbnMsIGxlZnQpID0+IHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZExlYWZDb2x1bW5zID1cbiAgICAgICAgICBsZWZ0XG4gICAgICAgICAgICA/Lm1hcChjb2x1bW5JZCA9PiBsZWFmQ29sdW1ucy5maW5kKGQgPT4gZC5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgPz8gW11cblxuICAgICAgICByZXR1cm4gYnVpbGRIZWFkZXJHcm91cHMoYWxsQ29sdW1ucywgb3JkZXJlZExlYWZDb2x1bW5zLCB0YWJsZSwgJ2xlZnQnKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0TGVmdEhlYWRlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIHRhYmxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzID0gbWVtbyhcbiAgICAgICgpID0+IFtcbiAgICAgICAgdGFibGUuZ2V0QWxsQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRWaXNpYmxlTGVhZkNvbHVtbnMoKSxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0LFxuICAgICAgXSxcbiAgICAgIChhbGxDb2x1bW5zLCBsZWFmQ29sdW1ucywgcmlnaHQpID0+IHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZExlYWZDb2x1bW5zID1cbiAgICAgICAgICByaWdodFxuICAgICAgICAgICAgPy5tYXAoY29sdW1uSWQgPT4gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGNvbHVtbklkKSEpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdXG5cbiAgICAgICAgcmV0dXJuIGJ1aWxkSGVhZGVyR3JvdXBzKGFsbENvbHVtbnMsIG9yZGVyZWRMZWFmQ29sdW1ucywgdGFibGUsICdyaWdodCcpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRSaWdodEhlYWRlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIC8vIEZvb3RlciBHcm91cHNcblxuICAgIHRhYmxlLmdldEZvb3Rlckdyb3VwcyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0SGVhZGVyR3JvdXBzKCldLFxuICAgICAgaGVhZGVyR3JvdXBzID0+IHtcbiAgICAgICAgcmV0dXJuIFsuLi5oZWFkZXJHcm91cHNdLnJldmVyc2UoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0Rm9vdGVyR3JvdXBzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0TGVmdEZvb3Rlckdyb3VwcyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0TGVmdEhlYWRlckdyb3VwcygpXSxcbiAgICAgIGhlYWRlckdyb3VwcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uaGVhZGVyR3JvdXBzXS5yZXZlcnNlKClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldExlZnRGb290ZXJHcm91cHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRDZW50ZXJGb290ZXJHcm91cHMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxcbiAgICAgIGhlYWRlckdyb3VwcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uaGVhZGVyR3JvdXBzXS5yZXZlcnNlKClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldENlbnRlckZvb3Rlckdyb3VwcycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdIZWFkZXJzLFxuICAgICAgfVxuICAgIClcblxuICAgIHRhYmxlLmdldFJpZ2h0Rm9vdGVyR3JvdXBzID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRSaWdodEhlYWRlckdyb3VwcygpXSxcbiAgICAgIGhlYWRlckdyb3VwcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uaGVhZGVyR3JvdXBzXS5yZXZlcnNlKClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFJpZ2h0Rm9vdGVyR3JvdXBzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gRmxhdCBIZWFkZXJzXG5cbiAgICB0YWJsZS5nZXRGbGF0SGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0SGVhZGVyR3JvdXBzKCldLFxuICAgICAgaGVhZGVyR3JvdXBzID0+IHtcbiAgICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwc1xuICAgICAgICAgIC5tYXAoaGVhZGVyR3JvdXAgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckdyb3VwLmhlYWRlcnNcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mbGF0KClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0TGVmdEZsYXRIZWFkZXJzID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRMZWZ0SGVhZGVyR3JvdXBzKCldLFxuICAgICAgbGVmdCA9PiB7XG4gICAgICAgIHJldHVybiBsZWZ0XG4gICAgICAgICAgLm1hcChoZWFkZXJHcm91cCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyR3JvdXAuaGVhZGVyc1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZsYXQoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0TGVmdEZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldENlbnRlckhlYWRlckdyb3VwcygpXSxcbiAgICAgIGxlZnQgPT4ge1xuICAgICAgICByZXR1cm4gbGVmdFxuICAgICAgICAgIC5tYXAoaGVhZGVyR3JvdXAgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckdyb3VwLmhlYWRlcnNcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mbGF0KClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldENlbnRlckZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0UmlnaHRGbGF0SGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0UmlnaHRIZWFkZXJHcm91cHMoKV0sXG4gICAgICBsZWZ0ID0+IHtcbiAgICAgICAgcmV0dXJuIGxlZnRcbiAgICAgICAgICAubWFwKGhlYWRlckdyb3VwID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXJHcm91cC5oZWFkZXJzXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmxhdCgpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRSaWdodEZsYXRIZWFkZXJzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0hlYWRlcnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8gTGVhZiBIZWFkZXJzXG5cbiAgICB0YWJsZS5nZXRDZW50ZXJMZWFmSGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0Q2VudGVyRmxhdEhlYWRlcnMoKV0sXG4gICAgICBmbGF0SGVhZGVycyA9PiB7XG4gICAgICAgIHJldHVybiBmbGF0SGVhZGVycy5maWx0ZXIoaGVhZGVyID0+ICFoZWFkZXIuc3ViSGVhZGVycz8ubGVuZ3RoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0Q2VudGVyTGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRMZWZ0TGVhZkhlYWRlcnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldExlZnRGbGF0SGVhZGVycygpXSxcbiAgICAgIGZsYXRIZWFkZXJzID0+IHtcbiAgICAgICAgcmV0dXJuIGZsYXRIZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gIWhlYWRlci5zdWJIZWFkZXJzPy5sZW5ndGgpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRMZWZ0TGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRSaWdodExlYWZIZWFkZXJzID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRSaWdodEZsYXRIZWFkZXJzKCldLFxuICAgICAgZmxhdEhlYWRlcnMgPT4ge1xuICAgICAgICByZXR1cm4gZmxhdEhlYWRlcnMuZmlsdGVyKGhlYWRlciA9PiAhaGVhZGVyLnN1YkhlYWRlcnM/Lmxlbmd0aClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFJpZ2h0TGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRMZWFmSGVhZGVycyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldExlZnRIZWFkZXJHcm91cHMoKSxcbiAgICAgICAgdGFibGUuZ2V0Q2VudGVySGVhZGVyR3JvdXBzKCksXG4gICAgICAgIHRhYmxlLmdldFJpZ2h0SGVhZGVyR3JvdXBzKCksXG4gICAgICBdLFxuICAgICAgKGxlZnQsIGNlbnRlciwgcmlnaHQpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi4obGVmdFswXT8uaGVhZGVycyA/PyBbXSksXG4gICAgICAgICAgLi4uKGNlbnRlclswXT8uaGVhZGVycyA/PyBbXSksXG4gICAgICAgICAgLi4uKHJpZ2h0WzBdPy5oZWFkZXJzID8/IFtdKSxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoaGVhZGVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0TGVhZkhlYWRlcnMoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZsYXQoKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0TGVhZkhlYWRlcnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnSGVhZGVycyxcbiAgICAgIH1cbiAgICApXG4gIH0sXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhlYWRlckdyb3VwczxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICBhbGxDb2x1bW5zOiBDb2x1bW48VERhdGEsIHVua25vd24+W10sXG4gIGNvbHVtbnNUb0dyb3VwOiBDb2x1bW48VERhdGEsIHVua25vd24+W10sXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGhlYWRlckZhbWlseT86ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0J1xuKSB7XG4gIC8vIEZpbmQgdGhlIG1heCBkZXB0aCBvZiB0aGUgY29sdW1uczpcbiAgLy8gYnVpbGQgdGhlIGxlYWYgY29sdW1uIHJvd1xuICAvLyBidWlsZCBlYWNoIGJ1ZmZlciByb3cgZ29pbmcgdXBcbiAgLy8gICAgcGxhY2Vob2xkZXIgZm9yIG5vbi1leGlzdGVudCBsZXZlbFxuICAvLyAgICByZWFsIGNvbHVtbiBmb3IgZXhpc3RpbmcgbGV2ZWxcblxuICBsZXQgbWF4RGVwdGggPSAwXG5cbiAgY29uc3QgZmluZE1heERlcHRoID0gKGNvbHVtbnM6IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXSwgZGVwdGggPSAxKSA9PiB7XG4gICAgbWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgZGVwdGgpXG5cbiAgICBjb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZ2V0SXNWaXNpYmxlKCkpXG4gICAgICAuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICBpZiAoY29sdW1uLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIGZpbmRNYXhEZXB0aChjb2x1bW4uY29sdW1ucywgZGVwdGggKyAxKVxuICAgICAgICB9XG4gICAgICB9LCAwKVxuICB9XG5cbiAgZmluZE1heERlcHRoKGFsbENvbHVtbnMpXG5cbiAgbGV0IGhlYWRlckdyb3VwczogSGVhZGVyR3JvdXA8VERhdGE+W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUhlYWRlckdyb3VwID0gKFxuICAgIGhlYWRlcnNUb0dyb3VwOiBIZWFkZXI8VERhdGEsIHVua25vd24+W10sXG4gICAgZGVwdGg6IG51bWJlclxuICApID0+IHtcbiAgICAvLyBUaGUgaGVhZGVyIGdyb3VwIHdlIGFyZSBjcmVhdGluZ1xuICAgIGNvbnN0IGhlYWRlckdyb3VwOiBIZWFkZXJHcm91cDxURGF0YT4gPSB7XG4gICAgICBkZXB0aCxcbiAgICAgIGlkOiBbaGVhZGVyRmFtaWx5LCBgJHtkZXB0aH1gXS5maWx0ZXIoQm9vbGVhbikuam9pbignXycpLFxuICAgICAgaGVhZGVyczogW10sXG4gICAgfVxuXG4gICAgLy8gVGhlIHBhcmVudCBjb2x1bW5zIHdlJ3JlIGdvaW5nIHRvIHNjYW4gbmV4dFxuICAgIGNvbnN0IHBlbmRpbmdQYXJlbnRIZWFkZXJzOiBIZWFkZXI8VERhdGEsIHVua25vd24+W10gPSBbXVxuXG4gICAgLy8gU2NhbiBlYWNoIGNvbHVtbiBmb3IgcGFyZW50c1xuICAgIGhlYWRlcnNUb0dyb3VwLmZvckVhY2goaGVhZGVyVG9Hcm91cCA9PiB7XG4gICAgICAvLyBXaGF0IGlzIHRoZSBsYXRlc3QgKGxhc3QpIHBhcmVudCBjb2x1bW4/XG5cbiAgICAgIGNvbnN0IGxhdGVzdFBlbmRpbmdQYXJlbnRIZWFkZXIgPSBbLi4ucGVuZGluZ1BhcmVudEhlYWRlcnNdLnJldmVyc2UoKVswXVxuXG4gICAgICBjb25zdCBpc0xlYWZIZWFkZXIgPSBoZWFkZXJUb0dyb3VwLmNvbHVtbi5kZXB0aCA9PT0gaGVhZGVyR3JvdXAuZGVwdGhcblxuICAgICAgbGV0IGNvbHVtbjogQ29sdW1uPFREYXRhLCB1bmtub3duPlxuICAgICAgbGV0IGlzUGxhY2Vob2xkZXIgPSBmYWxzZVxuXG4gICAgICBpZiAoaXNMZWFmSGVhZGVyICYmIGhlYWRlclRvR3JvdXAuY29sdW1uLnBhcmVudCkge1xuICAgICAgICAvLyBUaGUgcGFyZW50IGhlYWRlciBpcyBuZXdcbiAgICAgICAgY29sdW1uID0gaGVhZGVyVG9Hcm91cC5jb2x1bW4ucGFyZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgcGFyZW50IGhlYWRlciBpcyByZXBlYXRlZFxuICAgICAgICBjb2x1bW4gPSBoZWFkZXJUb0dyb3VwLmNvbHVtblxuICAgICAgICBpc1BsYWNlaG9sZGVyID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGxhdGVzdFBlbmRpbmdQYXJlbnRIZWFkZXIgJiZcbiAgICAgICAgbGF0ZXN0UGVuZGluZ1BhcmVudEhlYWRlcj8uY29sdW1uID09PSBjb2x1bW5cbiAgICAgICkge1xuICAgICAgICAvLyBUaGlzIGNvbHVtbiBpcyByZXBlYXRlZC4gQWRkIGl0IGFzIGEgc3ViIGhlYWRlciB0byB0aGUgbmV4dCBiYXRjaFxuICAgICAgICBsYXRlc3RQZW5kaW5nUGFyZW50SGVhZGVyLnN1YkhlYWRlcnMucHVzaChoZWFkZXJUb0dyb3VwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBoZWFkZXIuIExldCdzIGNyZWF0ZSBpdFxuICAgICAgICBjb25zdCBoZWFkZXIgPSBjcmVhdGVIZWFkZXIodGFibGUsIGNvbHVtbiwge1xuICAgICAgICAgIGlkOiBbaGVhZGVyRmFtaWx5LCBkZXB0aCwgY29sdW1uLmlkLCBoZWFkZXJUb0dyb3VwPy5pZF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdfJyksXG4gICAgICAgICAgaXNQbGFjZWhvbGRlcixcbiAgICAgICAgICBwbGFjZWhvbGRlcklkOiBpc1BsYWNlaG9sZGVyXG4gICAgICAgICAgICA/IGAke3BlbmRpbmdQYXJlbnRIZWFkZXJzLmZpbHRlcihkID0+IGQuY29sdW1uID09PSBjb2x1bW4pLmxlbmd0aH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBpbmRleDogcGVuZGluZ1BhcmVudEhlYWRlcnMubGVuZ3RoLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEFkZCB0aGUgaGVhZGVyVG9Hcm91cCBhcyBhIHN1YkhlYWRlciBvZiB0aGUgbmV3IGhlYWRlclxuICAgICAgICBoZWFkZXIuc3ViSGVhZGVycy5wdXNoKGhlYWRlclRvR3JvdXApXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IGhlYWRlciB0byB0aGUgcGVuZGluZ1BhcmVudEhlYWRlcnMgdG8gZ2V0IGdyb3VwZWRcbiAgICAgICAgLy8gaW4gdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgcGVuZGluZ1BhcmVudEhlYWRlcnMucHVzaChoZWFkZXIpXG4gICAgICB9XG5cbiAgICAgIGhlYWRlckdyb3VwLmhlYWRlcnMucHVzaChoZWFkZXJUb0dyb3VwKVxuICAgICAgaGVhZGVyVG9Hcm91cC5oZWFkZXJHcm91cCA9IGhlYWRlckdyb3VwXG4gICAgfSlcblxuICAgIGhlYWRlckdyb3Vwcy5wdXNoKGhlYWRlckdyb3VwKVxuXG4gICAgaWYgKGRlcHRoID4gMCkge1xuICAgICAgY3JlYXRlSGVhZGVyR3JvdXAocGVuZGluZ1BhcmVudEhlYWRlcnMsIGRlcHRoIC0gMSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBib3R0b21IZWFkZXJzID0gY29sdW1uc1RvR3JvdXAubWFwKChjb2x1bW4sIGluZGV4KSA9PlxuICAgIGNyZWF0ZUhlYWRlcih0YWJsZSwgY29sdW1uLCB7XG4gICAgICBkZXB0aDogbWF4RGVwdGgsXG4gICAgICBpbmRleCxcbiAgICB9KVxuICApXG5cbiAgY3JlYXRlSGVhZGVyR3JvdXAoYm90dG9tSGVhZGVycywgbWF4RGVwdGggLSAxKVxuXG4gIGhlYWRlckdyb3Vwcy5yZXZlcnNlKClcblxuICAvLyBoZWFkZXJHcm91cHMgPSBoZWFkZXJHcm91cHMuZmlsdGVyKGhlYWRlckdyb3VwID0+IHtcbiAgLy8gICByZXR1cm4gIWhlYWRlckdyb3VwLmhlYWRlcnMuZXZlcnkoaGVhZGVyID0+IGhlYWRlci5pc1BsYWNlaG9sZGVyKVxuICAvLyB9KVxuXG4gIGNvbnN0IHJlY3Vyc2VIZWFkZXJzRm9yU3BhbnMgPSAoXG4gICAgaGVhZGVyczogSGVhZGVyPFREYXRhLCB1bmtub3duPltdXG4gICk6IHsgY29sU3BhbjogbnVtYmVyOyByb3dTcGFuOiBudW1iZXIgfVtdID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEhlYWRlcnMgPSBoZWFkZXJzLmZpbHRlcihoZWFkZXIgPT5cbiAgICAgIGhlYWRlci5jb2x1bW4uZ2V0SXNWaXNpYmxlKClcbiAgICApXG5cbiAgICByZXR1cm4gZmlsdGVyZWRIZWFkZXJzLm1hcChoZWFkZXIgPT4ge1xuICAgICAgbGV0IGNvbFNwYW4gPSAwXG4gICAgICBsZXQgcm93U3BhbiA9IDBcbiAgICAgIGxldCBjaGlsZFJvd1NwYW5zID0gWzBdXG5cbiAgICAgIGlmIChoZWFkZXIuc3ViSGVhZGVycyAmJiBoZWFkZXIuc3ViSGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRSb3dTcGFucyA9IFtdXG5cbiAgICAgICAgcmVjdXJzZUhlYWRlcnNGb3JTcGFucyhoZWFkZXIuc3ViSGVhZGVycykuZm9yRWFjaChcbiAgICAgICAgICAoeyBjb2xTcGFuOiBjaGlsZENvbFNwYW4sIHJvd1NwYW46IGNoaWxkUm93U3BhbiB9KSA9PiB7XG4gICAgICAgICAgICBjb2xTcGFuICs9IGNoaWxkQ29sU3BhblxuICAgICAgICAgICAgY2hpbGRSb3dTcGFucy5wdXNoKGNoaWxkUm93U3BhbilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbFNwYW4gPSAxXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbkNoaWxkUm93U3BhbiA9IE1hdGgubWluKC4uLmNoaWxkUm93U3BhbnMpXG4gICAgICByb3dTcGFuID0gcm93U3BhbiArIG1pbkNoaWxkUm93U3BhblxuXG4gICAgICBoZWFkZXIuY29sU3BhbiA9IGNvbFNwYW5cbiAgICAgIGhlYWRlci5yb3dTcGFuID0gcm93U3BhblxuXG4gICAgICByZXR1cm4geyBjb2xTcGFuLCByb3dTcGFuIH1cbiAgICB9KVxuICB9XG5cbiAgcmVjdXJzZUhlYWRlcnNGb3JTcGFucyhoZWFkZXJHcm91cHNbMF0/LmhlYWRlcnMgPz8gW10pXG5cbiAgcmV0dXJuIGhlYWRlckdyb3Vwc1xufVxuIiwiaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi4vY29yZS90YWJsZSdcbmltcG9ydCB7IFJvd0RhdGEsIENvbHVtbiwgSGVhZGVyLCBPbkNoYW5nZUZuLCBUYWJsZSwgVXBkYXRlciB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgQ29sdW1uUGlubmluZ1Bvc2l0aW9uIH0gZnJvbSAnLi9QaW5uaW5nJ1xuXG4vL1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblNpemluZ1RhYmxlU3RhdGUge1xuICBjb2x1bW5TaXppbmc6IENvbHVtblNpemluZ1N0YXRlXG4gIGNvbHVtblNpemluZ0luZm86IENvbHVtblNpemluZ0luZm9TdGF0ZVxufVxuXG5leHBvcnQgdHlwZSBDb2x1bW5TaXppbmdTdGF0ZSA9IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5TaXppbmdJbmZvU3RhdGUge1xuICBjb2x1bW5TaXppbmdTdGFydDogW3N0cmluZywgbnVtYmVyXVtdXG4gIGRlbHRhT2Zmc2V0OiBudWxsIHwgbnVtYmVyXG4gIGRlbHRhUGVyY2VudGFnZTogbnVsbCB8IG51bWJlclxuICBpc1Jlc2l6aW5nQ29sdW1uOiBmYWxzZSB8IHN0cmluZ1xuICBzdGFydE9mZnNldDogbnVsbCB8IG51bWJlclxuICBzdGFydFNpemU6IG51bGwgfCBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgQ29sdW1uUmVzaXplTW9kZSA9ICdvbkNoYW5nZScgfCAnb25FbmQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uU2l6aW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZW4gdGhlIGNvbHVtblNpemluZyBzdGF0ZSBpcyB1cGRhdGVkLiBgb25DaGFuZ2VgIHVwZGF0ZXMgdGhlIHN0YXRlIHdoZW4gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgdGhlIHJlc2l6ZSBoYW5kbGUuIGBvbkVuZGAgdXBkYXRlcyB0aGUgc3RhdGUgd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgcmVzaXplIGhhbmRsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2NvbHVtbnJlc2l6ZW1vZGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgY29sdW1uUmVzaXplTW9kZT86IENvbHVtblJlc2l6ZU1vZGVcbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29sdW1uIHJlc2l6aW5nIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZW5hYmxlY29sdW1ucmVzaXppbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uUmVzaXppbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLmNvbHVtblNpemluZ2AgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBgc3RhdGUuY29sdW1uU2l6aW5nYCBmcm9tIHlvdXIgb3duIG1hbmFnZWQgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNvbmNvbHVtbnNpemluZ2NoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBvbkNvbHVtblNpemluZ0NoYW5nZT86IE9uQ2hhbmdlRm48Q29sdW1uU2l6aW5nU3RhdGU+XG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLmNvbHVtblNpemluZ0luZm9gIGNoYW5nZXMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGludGVybmFsIHN0YXRlIG1hbmFnZW1lbnQsIHNvIHlvdSB3aWxsIGFsc28gbmVlZCB0byBzdXBwbHkgYHN0YXRlLmNvbHVtblNpemluZ0luZm9gIGZyb20geW91ciBvd24gbWFuYWdlZCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI29uY29sdW1uc2l6aW5naW5mb2NoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBvbkNvbHVtblNpemluZ0luZm9DaGFuZ2U/OiBPbkNoYW5nZUZuPENvbHVtblNpemluZ0luZm9TdGF0ZT5cbn1cblxuZXhwb3J0IHR5cGUgQ29sdW1uU2l6aW5nRGVmYXVsdE9wdGlvbnMgPSBQaWNrPFxuICBDb2x1bW5TaXppbmdPcHRpb25zLFxuICAnY29sdW1uUmVzaXplTW9kZScgfCAnb25Db2x1bW5TaXppbmdDaGFuZ2UnIHwgJ29uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZSdcbj5cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5TaXppbmdJbnN0YW5jZSB7XG4gIC8qKlxuICAgKiBJZiBwaW5uaW5nLCByZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjZW50ZXIgcG9ydGlvbiBvZiB0aGUgdGFibGUgYnkgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgYWxsIHVucGlubmVkL2NlbnRlciBsZWFmLWNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNnZXRjZW50ZXJ0b3RhbHNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0Q2VudGVyVG90YWxTaXplOiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGxlZnQgcG9ydGlvbiBvZiB0aGUgdGFibGUgYnkgY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgYWxsIGxlZnQgbGVhZi1jb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0bGVmdHRvdGFsc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBnZXRMZWZ0VG90YWxTaXplOiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHJpZ2h0IHBvcnRpb24gb2YgdGhlIHRhYmxlIGJ5IGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mIGFsbCByaWdodCBsZWFmLWNvbHVtbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNnZXRyaWdodHRvdGFsc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBnZXRSaWdodFRvdGFsU2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIHRoZSB0YWJsZSBieSBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiBhbGwgbGVhZi1jb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0dG90YWxzaXplKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIGdldFRvdGFsU2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXNldHMgY29sdW1uIHNpemluZyB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gSWYgYGRlZmF1bHRTdGF0ZWAgaXMgYHRydWVgLCB0aGUgZGVmYXVsdCBzdGF0ZSBmb3IgdGhlIHRhYmxlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbml0aWFsVmFsdWUgcHJvdmlkZWQgdG8gdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjcmVzZXRjb2x1bW5zaXppbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgcmVzZXRDb2x1bW5TaXppbmc6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXNldHMgY29sdW1uIHNpemluZyBpbmZvIHRvIGl0cyBpbml0aWFsIHN0YXRlLiBJZiBgZGVmYXVsdFN0YXRlYCBpcyBgdHJ1ZWAsIHRoZSBkZWZhdWx0IHN0YXRlIGZvciB0aGUgdGFibGUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGluaXRpYWxWYWx1ZSBwcm92aWRlZCB0byB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNyZXNldGhlYWRlcnNpemVpbmZvKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIHJlc2V0SGVhZGVyU2l6ZUluZm86IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb2x1bW4gc2l6aW5nIHN0YXRlIHVzaW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24gb3IgYSB2YWx1ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIHVuZGVybHlpbmcgYG9uQ29sdW1uU2l6aW5nQ2hhbmdlYCBmdW5jdGlvbiBpZiBvbmUgaXMgcGFzc2VkIHRvIHRoZSB0YWJsZSBvcHRpb25zLCBvdGhlcndpc2UgdGhlIHN0YXRlIHdpbGwgYmUgbWFuYWdlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI3NldGNvbHVtbnNpemluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBzZXRDb2x1bW5TaXppbmc6ICh1cGRhdGVyOiBVcGRhdGVyPENvbHVtblNpemluZ1N0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyB0aGUgY29sdW1uIHNpemluZyBpbmZvIHN0YXRlIHVzaW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24gb3IgYSB2YWx1ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIHVuZGVybHlpbmcgYG9uQ29sdW1uU2l6aW5nSW5mb0NoYW5nZWAgZnVuY3Rpb24gaWYgb25lIGlzIHBhc3NlZCB0byB0aGUgdGFibGUgb3B0aW9ucywgb3RoZXJ3aXNlIHRoZSBzdGF0ZSB3aWxsIGJlIG1hbmFnZWQgYXV0b21hdGljYWxseSBieSB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNzZXRjb2x1bW5zaXppbmdpbmZvKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIHNldENvbHVtblNpemluZ0luZm86ICh1cGRhdGVyOiBVcGRhdGVyPENvbHVtblNpemluZ0luZm9TdGF0ZT4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5TaXppbmdDb2x1bW5EZWYge1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb2x1bW4gcmVzaXppbmcgZm9yIHRoZSBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNlbmFibGVyZXNpemluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBlbmFibGVSZXNpemluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBmb3IgdGhlIGNvbHVtblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjbWF4c2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBtYXhTaXplPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhbGxvd2VkIHNpemUgZm9yIHRoZSBjb2x1bW5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI21pbnNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgbWluU2l6ZT86IG51bWJlclxuICAvKipcbiAgICogVGhlIGRlc2lyZWQgc2l6ZSBmb3IgdGhlIGNvbHVtblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBzaXplPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uU2l6aW5nQ29sdW1uIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXNpemluZyNnZXRjYW5yZXNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0Q2FuUmVzaXplOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29sdW1uIGlzIGN1cnJlbnRseSBiZWluZyByZXNpemVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0aXNyZXNpemluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1zaXppbmcpXG4gICAqL1xuICBnZXRJc1Jlc2l6aW5nOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2dldHNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgbWVhc3VyZW1lbnQgYWxvbmcgdGhlIHJvdy1heGlzICh1c3VhbGx5IHRoZSB4LWF4aXMgZm9yIHN0YW5kYXJkIHRhYmxlcykgZm9yIHRoZSBoZWFkZXIuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBzdW0gb2YgdGhlIG9mZnNldCBtZWFzdXJlbWVudHMgb2YgYWxsIHByZWNlZGluZyBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0c3RhcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U3RhcnQ6IChwb3NpdGlvbj86IENvbHVtblBpbm5pbmdQb3NpdGlvbikgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGNvbHVtbiB0byBpdHMgaW5pdGlhbCBzaXplLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjcmVzZXRzaXplKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXNpemluZylcbiAgICovXG4gIHJlc2V0U2l6ZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblNpemluZ0hlYWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byByZXNpemUgdGhlIGhlYWRlci4gSXQgY2FuIGJlIHVzZWQgYXMgYW46XG4gICAqIC0gYG9uTW91c2VEb3duYCBoYW5kbGVyXG4gICAqIC0gYG9uVG91Y2hTdGFydGAgaGFuZGxlclxuICAgKlxuICAgKiBUaGUgZHJhZ2dpbmcgYW5kIHJlbGVhc2UgZXZlbnRzIGFyZSBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgZm9yIHlvdS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2dldHJlc2l6ZWhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0UmVzaXplSGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGhlYWRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tc2l6aW5nI2dldHNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U2l6ZTogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgbWVhc3VyZW1lbnQgYWxvbmcgdGhlIHJvdy1heGlzICh1c3VhbGx5IHRoZSB4LWF4aXMgZm9yIHN0YW5kYXJkIHRhYmxlcykgZm9yIHRoZSBoZWFkZXIuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBzdW0gb2YgdGhlIG9mZnNldCBtZWFzdXJlbWVudHMgb2YgYWxsIHByZWNlZGluZyBoZWFkZXJzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1zaXppbmcjZ2V0c3RhcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tc2l6aW5nKVxuICAgKi9cbiAgZ2V0U3RhcnQ6IChwb3NpdGlvbj86IENvbHVtblBpbm5pbmdQb3NpdGlvbikgPT4gbnVtYmVyXG59XG5cbi8vXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sdW1uU2l6aW5nID0ge1xuICBzaXplOiAxNTAsXG4gIG1pblNpemU6IDIwLFxuICBtYXhTaXplOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbn1cblxuY29uc3QgZ2V0RGVmYXVsdENvbHVtblNpemluZ0luZm9TdGF0ZSA9ICgpOiBDb2x1bW5TaXppbmdJbmZvU3RhdGUgPT4gKHtcbiAgc3RhcnRPZmZzZXQ6IG51bGwsXG4gIHN0YXJ0U2l6ZTogbnVsbCxcbiAgZGVsdGFPZmZzZXQ6IG51bGwsXG4gIGRlbHRhUGVyY2VudGFnZTogbnVsbCxcbiAgaXNSZXNpemluZ0NvbHVtbjogZmFsc2UsXG4gIGNvbHVtblNpemluZ1N0YXJ0OiBbXSxcbn0pXG5cbmV4cG9ydCBjb25zdCBDb2x1bW5TaXppbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogKCk6IENvbHVtblNpemluZ0NvbHVtbkRlZiA9PiB7XG4gICAgcmV0dXJuIGRlZmF1bHRDb2x1bW5TaXppbmdcbiAgfSxcbiAgZ2V0SW5pdGlhbFN0YXRlOiAoc3RhdGUpOiBDb2x1bW5TaXppbmdUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uU2l6aW5nOiB7fSxcbiAgICAgIGNvbHVtblNpemluZ0luZm86IGdldERlZmF1bHRDb2x1bW5TaXppbmdJbmZvU3RhdGUoKSxcbiAgICAgIC4uLnN0YXRlLFxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0T3B0aW9uczogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiBDb2x1bW5TaXppbmdEZWZhdWx0T3B0aW9ucyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtblJlc2l6ZU1vZGU6ICdvbkVuZCcsXG4gICAgICBvbkNvbHVtblNpemluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignY29sdW1uU2l6aW5nJywgdGFibGUpLFxuICAgICAgb25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdjb2x1bW5TaXppbmdJbmZvJywgdGFibGUpLFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVDb2x1bW46IDxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gICAgY29sdW1uOiBDb2x1bW48VERhdGEsIFRWYWx1ZT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICBjb2x1bW4uZ2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtblNpemUgPSB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblNpemluZ1tjb2x1bW4uaWRdXG5cbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgY29sdW1uLmNvbHVtbkRlZi5taW5TaXplID8/IGRlZmF1bHRDb2x1bW5TaXppbmcubWluU2l6ZSxcbiAgICAgICAgICBjb2x1bW5TaXplID8/IGNvbHVtbi5jb2x1bW5EZWYuc2l6ZSA/PyBkZWZhdWx0Q29sdW1uU2l6aW5nLnNpemVcbiAgICAgICAgKSxcbiAgICAgICAgY29sdW1uLmNvbHVtbkRlZi5tYXhTaXplID8/IGRlZmF1bHRDb2x1bW5TaXppbmcubWF4U2l6ZVxuICAgICAgKVxuICAgIH1cbiAgICBjb2x1bW4uZ2V0U3RhcnQgPSBwb3NpdGlvbiA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gIXBvc2l0aW9uXG4gICAgICAgID8gdGFibGUuZ2V0VmlzaWJsZUxlYWZDb2x1bW5zKClcbiAgICAgICAgOiBwb3NpdGlvbiA9PT0gJ2xlZnQnXG4gICAgICAgID8gdGFibGUuZ2V0TGVmdFZpc2libGVMZWFmQ29sdW1ucygpXG4gICAgICAgIDogdGFibGUuZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMoKVxuXG4gICAgICBjb25zdCBpbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gY29sdW1uLmlkKVxuXG4gICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXZTaWJsaW5nQ29sdW1uID0gY29sdW1uc1tpbmRleCAtIDFdIVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcHJldlNpYmxpbmdDb2x1bW4uZ2V0U3RhcnQocG9zaXRpb24pICsgcHJldlNpYmxpbmdDb2x1bW4uZ2V0U2l6ZSgpXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gICAgY29sdW1uLnJlc2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtblNpemluZygoeyBbY29sdW1uLmlkXTogXywgLi4ucmVzdCB9KSA9PiB7XG4gICAgICAgIHJldHVybiByZXN0XG4gICAgICB9KVxuICAgIH1cbiAgICBjb2x1bW4uZ2V0Q2FuUmVzaXplID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNvbHVtbi5jb2x1bW5EZWYuZW5hYmxlUmVzaXppbmcgPz8gdHJ1ZSkgJiZcbiAgICAgICAgKHRhYmxlLm9wdGlvbnMuZW5hYmxlQ29sdW1uUmVzaXppbmcgPz8gdHJ1ZSlcbiAgICAgIClcbiAgICB9XG4gICAgY29sdW1uLmdldElzUmVzaXppbmcgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5TaXppbmdJbmZvLmlzUmVzaXppbmdDb2x1bW4gPT09IGNvbHVtbi5pZFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVIZWFkZXI6IDxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gICAgaGVhZGVyOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICBoZWFkZXIuZ2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIGxldCBzdW0gPSAwXG5cbiAgICAgIGNvbnN0IHJlY3Vyc2UgPSAoaGVhZGVyOiBIZWFkZXI8VERhdGEsIFRWYWx1ZT4pID0+IHtcbiAgICAgICAgaWYgKGhlYWRlci5zdWJIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGhlYWRlci5zdWJIZWFkZXJzLmZvckVhY2gocmVjdXJzZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdW0gKz0gaGVhZGVyLmNvbHVtbi5nZXRTaXplKCkgPz8gMFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY3Vyc2UoaGVhZGVyKVxuXG4gICAgICByZXR1cm4gc3VtXG4gICAgfVxuICAgIGhlYWRlci5nZXRTdGFydCA9ICgpID0+IHtcbiAgICAgIGlmIChoZWFkZXIuaW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXZTaWJsaW5nSGVhZGVyID0gaGVhZGVyLmhlYWRlckdyb3VwLmhlYWRlcnNbaGVhZGVyLmluZGV4IC0gMV0hXG4gICAgICAgIHJldHVybiBwcmV2U2libGluZ0hlYWRlci5nZXRTdGFydCgpICsgcHJldlNpYmxpbmdIZWFkZXIuZ2V0U2l6ZSgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwXG4gICAgfVxuICAgIGhlYWRlci5nZXRSZXNpemVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGhlYWRlci5jb2x1bW4uaWQpXG4gICAgICBjb25zdCBjYW5SZXNpemUgPSBjb2x1bW4/LmdldENhblJlc2l6ZSgpXG5cbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIWNvbHVtbiB8fCAhY2FuUmVzaXplKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICA7KGUgYXMgYW55KS5wZXJzaXN0Py4oKVxuXG4gICAgICAgIGlmIChpc1RvdWNoU3RhcnRFdmVudChlKSkge1xuICAgICAgICAgIC8vIGxldHMgbm90IHJlc3BvbmQgdG8gbXVsdGlwbGUgdG91Y2hlcyAoZS5nLiAyIG9yIDMgZmluZ2VycylcbiAgICAgICAgICBpZiAoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydFNpemUgPSBoZWFkZXIuZ2V0U2l6ZSgpXG5cbiAgICAgICAgY29uc3QgY29sdW1uU2l6aW5nU3RhcnQ6IFtzdHJpbmcsIG51bWJlcl1bXSA9IGhlYWRlclxuICAgICAgICAgID8gaGVhZGVyLmdldExlYWZIZWFkZXJzKCkubWFwKGQgPT4gW2QuY29sdW1uLmlkLCBkLmNvbHVtbi5nZXRTaXplKCldKVxuICAgICAgICAgIDogW1tjb2x1bW4uaWQsIGNvbHVtbi5nZXRTaXplKCldXVxuXG4gICAgICAgIGNvbnN0IGNsaWVudFggPSBpc1RvdWNoU3RhcnRFdmVudChlKVxuICAgICAgICAgID8gTWF0aC5yb3VuZChlLnRvdWNoZXNbMF0hLmNsaWVudFgpXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KS5jbGllbnRYXG5cbiAgICAgICAgY29uc3QgbmV3Q29sdW1uU2l6aW5nOiBDb2x1bW5TaXppbmdTdGF0ZSA9IHt9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlT2Zmc2V0ID0gKFxuICAgICAgICAgIGV2ZW50VHlwZTogJ21vdmUnIHwgJ2VuZCcsXG4gICAgICAgICAgY2xpZW50WFBvcz86IG51bWJlclxuICAgICAgICApID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNsaWVudFhQb3MgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmdJbmZvKG9sZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YU9mZnNldCA9IGNsaWVudFhQb3MgLSAob2xkPy5zdGFydE9mZnNldCA/PyAwKVxuICAgICAgICAgICAgY29uc3QgZGVsdGFQZXJjZW50YWdlID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgIGRlbHRhT2Zmc2V0IC8gKG9sZD8uc3RhcnRTaXplID8/IDApLFxuICAgICAgICAgICAgICAtMC45OTk5OTlcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgb2xkLmNvbHVtblNpemluZ1N0YXJ0LmZvckVhY2goKFtjb2x1bW5JZCwgaGVhZGVyU2l6ZV0pID0+IHtcbiAgICAgICAgICAgICAgbmV3Q29sdW1uU2l6aW5nW2NvbHVtbklkXSA9XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGhlYWRlclNpemUgKyBoZWFkZXJTaXplICogZGVsdGFQZXJjZW50YWdlLCAwKSAqIDEwMFxuICAgICAgICAgICAgICAgICkgLyAxMDBcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICAgICAgZGVsdGFPZmZzZXQsXG4gICAgICAgICAgICAgIGRlbHRhUGVyY2VudGFnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFibGUub3B0aW9ucy5jb2x1bW5SZXNpemVNb2RlID09PSAnb25DaGFuZ2UnIHx8XG4gICAgICAgICAgICBldmVudFR5cGUgPT09ICdlbmQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmcob2xkID0+ICh7XG4gICAgICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICAgICAgLi4ubmV3Q29sdW1uU2l6aW5nLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25Nb3ZlID0gKGNsaWVudFhQb3M/OiBudW1iZXIpID0+IHVwZGF0ZU9mZnNldCgnbW92ZScsIGNsaWVudFhQb3MpXG5cbiAgICAgICAgY29uc3Qgb25FbmQgPSAoY2xpZW50WFBvcz86IG51bWJlcikgPT4ge1xuICAgICAgICAgIHVwZGF0ZU9mZnNldCgnZW5kJywgY2xpZW50WFBvcylcblxuICAgICAgICAgIHRhYmxlLnNldENvbHVtblNpemluZ0luZm8ob2xkID0+ICh7XG4gICAgICAgICAgICAuLi5vbGQsXG4gICAgICAgICAgICBpc1Jlc2l6aW5nQ29sdW1uOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBudWxsLFxuICAgICAgICAgICAgc3RhcnRTaXplOiBudWxsLFxuICAgICAgICAgICAgZGVsdGFPZmZzZXQ6IG51bGwsXG4gICAgICAgICAgICBkZWx0YVBlcmNlbnRhZ2U6IG51bGwsXG4gICAgICAgICAgICBjb2x1bW5TaXppbmdTdGFydDogW10sXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb3VzZUV2ZW50cyA9IHtcbiAgICAgICAgICBtb3ZlSGFuZGxlcjogKGU6IE1vdXNlRXZlbnQpID0+IG9uTW92ZShlLmNsaWVudFgpLFxuICAgICAgICAgIHVwSGFuZGxlcjogKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlRXZlbnRzLm1vdmVIYW5kbGVyKVxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlRXZlbnRzLnVwSGFuZGxlcilcbiAgICAgICAgICAgIG9uRW5kKGUuY2xpZW50WClcbiAgICAgICAgICB9LFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG91Y2hFdmVudHMgPSB7XG4gICAgICAgICAgbW92ZUhhbmRsZXI6IChlOiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbk1vdmUoZS50b3VjaGVzWzBdIS5jbGllbnRYKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cEhhbmRsZXI6IChlOiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaEV2ZW50cy5tb3ZlSGFuZGxlcilcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hFdmVudHMudXBIYW5kbGVyKVxuICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25FbmQoZS50b3VjaGVzWzBdPy5jbGllbnRYKVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXNzaXZlSWZTdXBwb3J0ZWQgPSBwYXNzaXZlRXZlbnRTdXBwb3J0ZWQoKVxuICAgICAgICAgID8geyBwYXNzaXZlOiBmYWxzZSB9XG4gICAgICAgICAgOiBmYWxzZVxuXG4gICAgICAgIGlmIChpc1RvdWNoU3RhcnRFdmVudChlKSkge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAndG91Y2htb3ZlJyxcbiAgICAgICAgICAgIHRvdWNoRXZlbnRzLm1vdmVIYW5kbGVyLFxuICAgICAgICAgICAgcGFzc2l2ZUlmU3VwcG9ydGVkXG4gICAgICAgICAgKVxuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAndG91Y2hlbmQnLFxuICAgICAgICAgICAgdG91Y2hFdmVudHMudXBIYW5kbGVyLFxuICAgICAgICAgICAgcGFzc2l2ZUlmU3VwcG9ydGVkXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAnbW91c2Vtb3ZlJyxcbiAgICAgICAgICAgIG1vdXNlRXZlbnRzLm1vdmVIYW5kbGVyLFxuICAgICAgICAgICAgcGFzc2l2ZUlmU3VwcG9ydGVkXG4gICAgICAgICAgKVxuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAnbW91c2V1cCcsXG4gICAgICAgICAgICBtb3VzZUV2ZW50cy51cEhhbmRsZXIsXG4gICAgICAgICAgICBwYXNzaXZlSWZTdXBwb3J0ZWRcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmdJbmZvKG9sZCA9PiAoe1xuICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICBzdGFydE9mZnNldDogY2xpZW50WCxcbiAgICAgICAgICBzdGFydFNpemUsXG4gICAgICAgICAgZGVsdGFPZmZzZXQ6IDAsXG4gICAgICAgICAgZGVsdGFQZXJjZW50YWdlOiAwLFxuICAgICAgICAgIGNvbHVtblNpemluZ1N0YXJ0LFxuICAgICAgICAgIGlzUmVzaXppbmdDb2x1bW46IGNvbHVtbi5pZCxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgdGFibGUuc2V0Q29sdW1uU2l6aW5nID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vbkNvbHVtblNpemluZ0NoYW5nZT8uKHVwZGF0ZXIpXG4gICAgdGFibGUuc2V0Q29sdW1uU2l6aW5nSW5mbyA9IHVwZGF0ZXIgPT5cbiAgICAgIHRhYmxlLm9wdGlvbnMub25Db2x1bW5TaXppbmdJbmZvQ2hhbmdlPy4odXBkYXRlcilcbiAgICB0YWJsZS5yZXNldENvbHVtblNpemluZyA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRDb2x1bW5TaXppbmcoXG4gICAgICAgIGRlZmF1bHRTdGF0ZSA/IHt9IDogdGFibGUuaW5pdGlhbFN0YXRlLmNvbHVtblNpemluZyA/PyB7fVxuICAgICAgKVxuICAgIH1cbiAgICB0YWJsZS5yZXNldEhlYWRlclNpemVJbmZvID0gZGVmYXVsdFN0YXRlID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtblNpemluZ0luZm8oXG4gICAgICAgIGRlZmF1bHRTdGF0ZVxuICAgICAgICAgID8gZ2V0RGVmYXVsdENvbHVtblNpemluZ0luZm9TdGF0ZSgpXG4gICAgICAgICAgOiB0YWJsZS5pbml0aWFsU3RhdGUuY29sdW1uU2l6aW5nSW5mbyA/P1xuICAgICAgICAgICAgICBnZXREZWZhdWx0Q29sdW1uU2l6aW5nSW5mb1N0YXRlKClcbiAgICAgIClcbiAgICB9XG4gICAgdGFibGUuZ2V0VG90YWxTaXplID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoc3VtLCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN1bSArIGhlYWRlci5nZXRTaXplKClcbiAgICAgIH0sIDApID8/IDBcbiAgICB0YWJsZS5nZXRMZWZ0VG90YWxTaXplID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldExlZnRIZWFkZXJHcm91cHMoKVswXT8uaGVhZGVycy5yZWR1Y2UoKHN1bSwgaGVhZGVyKSA9PiB7XG4gICAgICAgIHJldHVybiBzdW0gKyBoZWFkZXIuZ2V0U2l6ZSgpXG4gICAgICB9LCAwKSA/PyAwXG4gICAgdGFibGUuZ2V0Q2VudGVyVG90YWxTaXplID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldENlbnRlckhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoc3VtLCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN1bSArIGhlYWRlci5nZXRTaXplKClcbiAgICAgIH0sIDApID8/IDBcbiAgICB0YWJsZS5nZXRSaWdodFRvdGFsU2l6ZSA9ICgpID0+XG4gICAgICB0YWJsZS5nZXRSaWdodEhlYWRlckdyb3VwcygpWzBdPy5oZWFkZXJzLnJlZHVjZSgoc3VtLCBoZWFkZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHN1bSArIGhlYWRlci5nZXRTaXplKClcbiAgICAgIH0sIDApID8/IDBcbiAgfSxcbn1cblxubGV0IHBhc3NpdmVTdXBwb3J0ZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbFxuZXhwb3J0IGZ1bmN0aW9uIHBhc3NpdmVFdmVudFN1cHBvcnRlZCgpIHtcbiAgaWYgKHR5cGVvZiBwYXNzaXZlU3VwcG9ydGVkID09PSAnYm9vbGVhbicpIHJldHVybiBwYXNzaXZlU3VwcG9ydGVkXG5cbiAgbGV0IHN1cHBvcnRlZCA9IGZhbHNlXG4gIHRyeSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGdldCBwYXNzaXZlKCkge1xuICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBub29wID0gKCkgPT4ge31cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgbm9vcCwgb3B0aW9ucylcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG5vb3ApXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlXG4gIH1cbiAgcGFzc2l2ZVN1cHBvcnRlZCA9IHN1cHBvcnRlZFxuICByZXR1cm4gcGFzc2l2ZVN1cHBvcnRlZFxufVxuXG5mdW5jdGlvbiBpc1RvdWNoU3RhcnRFdmVudChlOiB1bmtub3duKTogZSBpcyBUb3VjaEV2ZW50IHtcbiAgcmV0dXJuIChlIGFzIFRvdWNoRXZlbnQpLnR5cGUgPT09ICd0b3VjaHN0YXJ0J1xufVxuIiwiaW1wb3J0IHsgUm93TW9kZWwgfSBmcm9tICcuLidcbmltcG9ydCB7IFRhYmxlRmVhdHVyZSB9IGZyb20gJy4uL2NvcmUvdGFibGUnXG5pbXBvcnQgeyBPbkNoYW5nZUZuLCBUYWJsZSwgUm93LCBVcGRhdGVyLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtYWtlU3RhdGVVcGRhdGVyIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIEV4cGFuZGVkU3RhdGVMaXN0ID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cbmV4cG9ydCB0eXBlIEV4cGFuZGVkU3RhdGUgPSB0cnVlIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZWRUYWJsZVN0YXRlIHtcbiAgZXhwYW5kZWQ6IEV4cGFuZGVkU3RhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBhbmRlZFJvdyB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJvdyBjYW4gYmUgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGNhbmV4cGFuZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldENhbkV4cGFuZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGFsbCBwYXJlbnQgcm93cyBvZiB0aGUgcm93IGFyZSBleHBhbmRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjZ2V0aXNhbGxwYXJlbnRzZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRJc0FsbFBhcmVudHNFeHBhbmRlZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByb3cgaXMgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGlzZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRJc0V4cGFuZGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSByb3cuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYmluZCB0byBhbiBldmVudCBoYW5kbGVyIHRvIGEgYnV0dG9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXR0b2dnbGVleHBhbmRlZGhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRUb2dnbGVFeHBhbmRlZEhhbmRsZXI6ICgpID0+ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGV4cGFuZGVkIHN0YXRlIChvciBzZXRzIGl0IGlmIGBleHBhbmRlZGAgaXMgcHJvdmlkZWQpIGZvciB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyN0b2dnbGVleHBhbmRlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIHRvZ2dsZUV4cGFuZGVkOiAoZXhwYW5kZWQ/OiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZWRPcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogRW5hYmxlIHRoaXMgc2V0dGluZyB0byBhdXRvbWF0aWNhbGx5IHJlc2V0IHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgdGFibGUgd2hlbiBleHBhbmRpbmcgc3RhdGUgY2hhbmdlcy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjYXV0b3Jlc2V0ZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBhdXRvUmVzZXRFeHBhbmRlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIGV4cGFuZGluZyBmb3IgYWxsIHJvd3MuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2VuYWJsZWV4cGFuZGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGVuYWJsZUV4cGFuZGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyB0aGUgZXhwYW5kZWQgcm93IG1vZGVsLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBwcm92aWRlZCwgdGhlIHRhYmxlIHdpbGwgbm90IGV4cGFuZCByb3dzLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCBleHBvcnRlZCBgZ2V0RXhwYW5kZWRSb3dNb2RlbGAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBleHBhbmRlZCByb3cgbW9kZWwgb3IgaW1wbGVtZW50IHlvdXIgb3duLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRleHBhbmRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0RXhwYW5kZWRSb3dNb2RlbD86ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHJvdyBpcyBjdXJyZW50bHkgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGlzcm93ZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRJc1Jvd0V4cGFuZGVkPzogKHJvdzogUm93PFREYXRhPikgPT4gYm9vbGVhblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHJvdyBjYW4gYmUgZXhwYW5kZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldHJvd2NhbmV4cGFuZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldFJvd0NhbkV4cGFuZD86IChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZXMgbWFudWFsIHJvdyBleHBhbnNpb24uIElmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgYGdldEV4cGFuZGVkUm93TW9kZWxgIHdpbGwgbm90IGJlIHVzZWQgdG8gZXhwYW5kIHJvd3MgYW5kIHlvdSB3b3VsZCBiZSBleHBlY3RlZCB0byBwZXJmb3JtIHRoZSBleHBhbnNpb24gaW4geW91ciBvd24gZGF0YSBtb2RlbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkb2luZyBzZXJ2ZXItc2lkZSBleHBhbnNpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI21hbnVhbGV4cGFuZGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIG1hbnVhbEV4cGFuZGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGBleHBhbmRlZGAgdGFibGUgc3RhdGUgY2hhbmdlcy4gSWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgeW91IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoaXMgc3RhdGUgb24geW91ciBvd24uIFRvIHBhc3MgdGhlIG1hbmFnZWQgc3RhdGUgYmFjayB0byB0aGUgdGFibGUsIHVzZSB0aGUgYHRhYmxlT3B0aW9ucy5zdGF0ZS5leHBhbmRlZGAgb3B0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNvbmV4cGFuZGVkY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgb25FeHBhbmRlZENoYW5nZT86IE9uQ2hhbmdlRm48RXhwYW5kZWRTdGF0ZT5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCBleHBhbmRlZCByb3dzIHdpbGwgYmUgcGFnaW5hdGVkIGFsb25nIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRhYmxlICh3aGljaCBtZWFucyBleHBhbmRlZCByb3dzIG1heSBzcGFuIG11bHRpcGxlIHBhZ2VzKS4gSWYgYGZhbHNlYCBleHBhbmRlZCByb3dzIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHBhZ2luYXRpb24gKHdoaWNoIG1lYW5zIGV4cGFuZGVkIHJvd3Mgd2lsbCBhbHdheXMgcmVuZGVyIG9uIHRoZWlyIHBhcmVudHMgcGFnZS4gVGhpcyBhbHNvIG1lYW5zIG1vcmUgcm93cyB3aWxsIGJlIHJlbmRlcmVkIHRoYW4gdGhlIHNldCBwYWdlIHNpemUpXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI3BhZ2luYXRlZXhwYW5kZWRyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgcGFnaW5hdGVFeHBhbmRlZFJvd3M/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZWRJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2F1dG9SZXNldEV4cGFuZGVkOiAoKSA9PiB2b2lkXG4gIF9nZXRFeHBhbmRlZFJvd01vZGVsPzogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByb3dzIHRoYXQgY2FuIGJlIGV4cGFuZGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRjYW5zb21lcm93c2V4cGFuZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldENhblNvbWVSb3dzRXhwYW5kOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBleHBhbmRlZCByb3dzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRleHBhbmRlZGRlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0RXhwYW5kZWREZXB0aDogKCkgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgYWZ0ZXIgZXhwYW5zaW9uIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZXhwYW5kaW5nI2dldGV4cGFuZGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBnZXRFeHBhbmRlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhbGwgcm93cyBhcmUgY3VycmVudGx5IGV4cGFuZGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRpc2FsbHJvd3NleHBhbmRlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIGdldElzQWxsUm93c0V4cGFuZGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByb3dzIHRoYXQgYXJlIGN1cnJlbnRseSBleHBhbmRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjZ2V0aXNzb21lcm93c2V4cGFuZGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0SXNTb21lUm93c0V4cGFuZGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgYmVmb3JlIGV4cGFuc2lvbiBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXRwcmVleHBhbmRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0UHJlRXhwYW5kZWRSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRvZ2dsZSB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYWxsIHJvd3MuIFRoaXMgaGFuZGxlciBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggYW4gYGlucHV0W3R5cGU9Y2hlY2tib3hdYCBlbGVtZW50LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2V4cGFuZGluZyNnZXR0b2dnbGVhbGxyb3dzZXhwYW5kZWRoYW5kbGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkSGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSB0YWJsZSB0byB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjcmVzZXRleHBhbmRlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2V4cGFuZGluZylcbiAgICovXG4gIHJlc2V0RXhwYW5kZWQ6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgdGFibGUgdmlhIGFuIHVwZGF0ZSBmdW5jdGlvbiBvciB2YWx1ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjc2V0ZXhwYW5kZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9leHBhbmRpbmcpXG4gICAqL1xuICBzZXRFeHBhbmRlZDogKHVwZGF0ZXI6IFVwZGF0ZXI8RXhwYW5kZWRTdGF0ZT4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGV4cGFuZGVkIHN0YXRlIGZvciBhbGwgcm93cy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9leHBhbmRpbmcjdG9nZ2xlYWxscm93c2V4cGFuZGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZXhwYW5kaW5nKVxuICAgKi9cbiAgdG9nZ2xlQWxsUm93c0V4cGFuZGVkOiAoZXhwYW5kZWQ/OiBib29sZWFuKSA9PiB2b2lkXG59XG5cbi8vXG5cbmV4cG9ydCBjb25zdCBFeHBhbmRpbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0SW5pdGlhbFN0YXRlOiAoc3RhdGUpOiBFeHBhbmRlZFRhYmxlU3RhdGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBleHBhbmRlZDoge30sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogRXhwYW5kZWRPcHRpb25zPFREYXRhPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uRXhwYW5kZWRDaGFuZ2U6IG1ha2VTdGF0ZVVwZGF0ZXIoJ2V4cGFuZGVkJywgdGFibGUpLFxuICAgICAgcGFnaW5hdGVFeHBhbmRlZFJvd3M6IHRydWUsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIGxldCBxdWV1ZWQgPSBmYWxzZVxuXG4gICAgdGFibGUuX2F1dG9SZXNldEV4cGFuZGVkID0gKCkgPT4ge1xuICAgICAgaWYgKCFyZWdpc3RlcmVkKSB7XG4gICAgICAgIHRhYmxlLl9xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGFibGUub3B0aW9ucy5hdXRvUmVzZXRBbGwgPz9cbiAgICAgICAgdGFibGUub3B0aW9ucy5hdXRvUmVzZXRFeHBhbmRlZCA/P1xuICAgICAgICAhdGFibGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmdcbiAgICAgICkge1xuICAgICAgICBpZiAocXVldWVkKSByZXR1cm5cbiAgICAgICAgcXVldWVkID0gdHJ1ZVxuICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgIHRhYmxlLnJlc2V0RXhwYW5kZWQoKVxuICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlLnNldEV4cGFuZGVkID0gdXBkYXRlciA9PiB0YWJsZS5vcHRpb25zLm9uRXhwYW5kZWRDaGFuZ2U/Lih1cGRhdGVyKVxuICAgIHRhYmxlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZCA9IGV4cGFuZGVkID0+IHtcbiAgICAgIGlmIChleHBhbmRlZCA/PyAhdGFibGUuZ2V0SXNBbGxSb3dzRXhwYW5kZWQoKSkge1xuICAgICAgICB0YWJsZS5zZXRFeHBhbmRlZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGUuc2V0RXhwYW5kZWQoe30pXG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlLnJlc2V0RXhwYW5kZWQgPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0RXhwYW5kZWQoZGVmYXVsdFN0YXRlID8ge30gOiB0YWJsZS5pbml0aWFsU3RhdGU/LmV4cGFuZGVkID8/IHt9KVxuICAgIH1cbiAgICB0YWJsZS5nZXRDYW5Tb21lUm93c0V4cGFuZCA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZVxuICAgICAgICAuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsKClcbiAgICAgICAgLmZsYXRSb3dzLnNvbWUocm93ID0+IHJvdy5nZXRDYW5FeHBhbmQoKSlcbiAgICB9XG4gICAgdGFibGUuZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICA7KGUgYXMgYW55KS5wZXJzaXN0Py4oKVxuICAgICAgICB0YWJsZS50b2dnbGVBbGxSb3dzRXhwYW5kZWQoKVxuICAgICAgfVxuICAgIH1cbiAgICB0YWJsZS5nZXRJc1NvbWVSb3dzRXhwYW5kZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBleHBhbmRlZCA9IHRhYmxlLmdldFN0YXRlKCkuZXhwYW5kZWRcbiAgICAgIHJldHVybiBleHBhbmRlZCA9PT0gdHJ1ZSB8fCBPYmplY3QudmFsdWVzKGV4cGFuZGVkKS5zb21lKEJvb2xlYW4pXG4gICAgfVxuICAgIHRhYmxlLmdldElzQWxsUm93c0V4cGFuZGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgZXhwYW5kZWQgPSB0YWJsZS5nZXRTdGF0ZSgpLmV4cGFuZGVkXG5cbiAgICAgIC8vIElmIGV4cGFuZGVkIGlzIHRydWUsIHNhdmUgc29tZSBjeWNsZXMgYW5kIHJldHVybiB0cnVlXG4gICAgICBpZiAodHlwZW9mIGV4cGFuZGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZGVkID09PSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmICghT2JqZWN0LmtleXMoZXhwYW5kZWQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYW55IHJvdyBpcyBub3QgZXhwYW5kZWQsIHJldHVybiBmYWxzZVxuICAgICAgaWYgKHRhYmxlLmdldFJvd01vZGVsKCkuZmxhdFJvd3Muc29tZShyb3cgPT4gIXJvdy5nZXRJc0V4cGFuZGVkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBUaGV5IG11c3QgYWxsIGJlIGV4cGFuZGVkIDpzaHJ1ZzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHRhYmxlLmdldEV4cGFuZGVkRGVwdGggPSAoKSA9PiB7XG4gICAgICBsZXQgbWF4RGVwdGggPSAwXG5cbiAgICAgIGNvbnN0IHJvd0lkcyA9XG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuZXhwYW5kZWQgPT09IHRydWVcbiAgICAgICAgICA/IE9iamVjdC5rZXlzKHRhYmxlLmdldFJvd01vZGVsKCkucm93c0J5SWQpXG4gICAgICAgICAgOiBPYmplY3Qua2V5cyh0YWJsZS5nZXRTdGF0ZSgpLmV4cGFuZGVkKVxuXG4gICAgICByb3dJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0SWQgPSBpZC5zcGxpdCgnLicpXG4gICAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIHNwbGl0SWQubGVuZ3RoKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIG1heERlcHRoXG4gICAgfVxuICAgIHRhYmxlLmdldFByZUV4cGFuZGVkUm93TW9kZWwgPSAoKSA9PiB0YWJsZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0RXhwYW5kZWRSb3dNb2RlbCA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEV4cGFuZGVkUm93TW9kZWwgJiYgdGFibGUub3B0aW9ucy5nZXRFeHBhbmRlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRFeHBhbmRlZFJvd01vZGVsID0gdGFibGUub3B0aW9ucy5nZXRFeHBhbmRlZFJvd01vZGVsKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFibGUub3B0aW9ucy5tYW51YWxFeHBhbmRpbmcgfHwgIXRhYmxlLl9nZXRFeHBhbmRlZFJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVFeHBhbmRlZFJvd01vZGVsKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLl9nZXRFeHBhbmRlZFJvd01vZGVsKClcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cudG9nZ2xlRXhwYW5kZWQgPSBleHBhbmRlZCA9PiB7XG4gICAgICB0YWJsZS5zZXRFeHBhbmRlZChvbGQgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGQgPT09IHRydWUgPyB0cnVlIDogISFvbGQ/Lltyb3cuaWRdXG5cbiAgICAgICAgbGV0IG9sZEV4cGFuZGVkOiBFeHBhbmRlZFN0YXRlTGlzdCA9IHt9XG5cbiAgICAgICAgaWYgKG9sZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHRhYmxlLmdldFJvd01vZGVsKCkucm93c0J5SWQpLmZvckVhY2gocm93SWQgPT4ge1xuICAgICAgICAgICAgb2xkRXhwYW5kZWRbcm93SWRdID0gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkRXhwYW5kZWQgPSBvbGRcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGFuZGVkID0gZXhwYW5kZWQgPz8gIWV4aXN0c1xuXG4gICAgICAgIGlmICghZXhpc3RzICYmIGV4cGFuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm9sZEV4cGFuZGVkLFxuICAgICAgICAgICAgW3Jvdy5pZF06IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4aXN0cyAmJiAhZXhwYW5kZWQpIHtcbiAgICAgICAgICBjb25zdCB7IFtyb3cuaWRdOiBfLCAuLi5yZXN0IH0gPSBvbGRFeHBhbmRlZFxuICAgICAgICAgIHJldHVybiByZXN0XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2xkXG4gICAgICB9KVxuICAgIH1cbiAgICByb3cuZ2V0SXNFeHBhbmRlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gdGFibGUuZ2V0U3RhdGUoKS5leHBhbmRlZFxuXG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0SXNSb3dFeHBhbmRlZD8uKHJvdykgPz9cbiAgICAgICAgKGV4cGFuZGVkID09PSB0cnVlIHx8IGV4cGFuZGVkPy5bcm93LmlkXSlcbiAgICAgIClcbiAgICB9XG4gICAgcm93LmdldENhbkV4cGFuZCA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0Um93Q2FuRXhwYW5kPy4ocm93KSA/P1xuICAgICAgICAoKHRhYmxlLm9wdGlvbnMuZW5hYmxlRXhwYW5kaW5nID8/IHRydWUpICYmICEhcm93LnN1YlJvd3M/Lmxlbmd0aClcbiAgICAgIClcbiAgICB9XG4gICAgcm93LmdldElzQWxsUGFyZW50c0V4cGFuZGVkID0gKCkgPT4ge1xuICAgICAgbGV0IGlzRnVsbHlFeHBhbmRlZCA9IHRydWVcbiAgICAgIGxldCBjdXJyZW50Um93ID0gcm93XG5cbiAgICAgIHdoaWxlIChpc0Z1bGx5RXhwYW5kZWQgJiYgY3VycmVudFJvdy5wYXJlbnRJZCkge1xuICAgICAgICBjdXJyZW50Um93ID0gdGFibGUuZ2V0Um93KGN1cnJlbnRSb3cucGFyZW50SWQsIHRydWUpXG4gICAgICAgIGlzRnVsbHlFeHBhbmRlZCA9IGN1cnJlbnRSb3cuZ2V0SXNFeHBhbmRlZCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0Z1bGx5RXhwYW5kZWRcbiAgICB9XG4gICAgcm93LmdldFRvZ2dsZUV4cGFuZGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbkV4cGFuZCA9IHJvdy5nZXRDYW5FeHBhbmQoKVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIWNhbkV4cGFuZCkgcmV0dXJuXG4gICAgICAgIHJvdy50b2dnbGVFeHBhbmRlZCgpXG4gICAgICB9XG4gICAgfVxuICB9LFxufVxuIiwiaW1wb3J0IHsgRmlsdGVyRm4gfSBmcm9tICcuL2ZlYXR1cmVzL0ZpbHRlcnMnXG5cbmNvbnN0IGluY2x1ZGVzU3RyaW5nOiBGaWx0ZXJGbjxhbnk+ID0gKFxuICByb3csXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGZpbHRlclZhbHVlOiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBzZWFyY2ggPSBmaWx0ZXJWYWx1ZS50b0xvd2VyQ2FzZSgpXG4gIHJldHVybiBCb29sZWFuKFxuICAgIHJvd1xuICAgICAgLmdldFZhbHVlPHN0cmluZyB8IG51bGw+KGNvbHVtbklkKVxuICAgICAgPy50b1N0cmluZygpXG4gICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgID8uaW5jbHVkZXMoc2VhcmNoKVxuICApXG59XG5cbmluY2x1ZGVzU3RyaW5nLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+IHRlc3RGYWxzZXkodmFsKVxuXG5jb25zdCBpbmNsdWRlc1N0cmluZ1NlbnNpdGl2ZTogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogc3RyaW5nXG4pID0+IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgcm93LmdldFZhbHVlPHN0cmluZyB8IG51bGw+KGNvbHVtbklkKT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoZmlsdGVyVmFsdWUpXG4gIClcbn1cblxuaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmUuYXV0b1JlbW92ZSA9ICh2YWw6IGFueSkgPT4gdGVzdEZhbHNleSh2YWwpXG5cbmNvbnN0IGVxdWFsc1N0cmluZzogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogc3RyaW5nXG4pID0+IHtcbiAgcmV0dXJuIChcbiAgICByb3cuZ2V0VmFsdWU8c3RyaW5nIHwgbnVsbD4oY29sdW1uSWQpPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PVxuICAgIGZpbHRlclZhbHVlPy50b0xvd2VyQ2FzZSgpXG4gIClcbn1cblxuZXF1YWxzU3RyaW5nLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+IHRlc3RGYWxzZXkodmFsKVxuXG5jb25zdCBhcnJJbmNsdWRlczogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogdW5rbm93blxuKSA9PiB7XG4gIHJldHVybiByb3cuZ2V0VmFsdWU8dW5rbm93bltdPihjb2x1bW5JZCk/LmluY2x1ZGVzKGZpbHRlclZhbHVlKVxufVxuXG5hcnJJbmNsdWRlcy5hdXRvUmVtb3ZlID0gKHZhbDogYW55KSA9PiB0ZXN0RmFsc2V5KHZhbCkgfHwgIXZhbD8ubGVuZ3RoXG5cbmNvbnN0IGFyckluY2x1ZGVzQWxsOiBGaWx0ZXJGbjxhbnk+ID0gKFxuICByb3csXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGZpbHRlclZhbHVlOiB1bmtub3duW11cbikgPT4ge1xuICByZXR1cm4gIWZpbHRlclZhbHVlLnNvbWUoXG4gICAgdmFsID0+ICFyb3cuZ2V0VmFsdWU8dW5rbm93bltdPihjb2x1bW5JZCk/LmluY2x1ZGVzKHZhbClcbiAgKVxufVxuXG5hcnJJbmNsdWRlc0FsbC5hdXRvUmVtb3ZlID0gKHZhbDogYW55KSA9PiB0ZXN0RmFsc2V5KHZhbCkgfHwgIXZhbD8ubGVuZ3RoXG5cbmNvbnN0IGFyckluY2x1ZGVzU29tZTogRmlsdGVyRm48YW55PiA9IChcbiAgcm93LFxuICBjb2x1bW5JZDogc3RyaW5nLFxuICBmaWx0ZXJWYWx1ZTogdW5rbm93bltdXG4pID0+IHtcbiAgcmV0dXJuIGZpbHRlclZhbHVlLnNvbWUoXG4gICAgdmFsID0+IHJvdy5nZXRWYWx1ZTx1bmtub3duW10+KGNvbHVtbklkKT8uaW5jbHVkZXModmFsKVxuICApXG59XG5cbmFyckluY2x1ZGVzU29tZS5hdXRvUmVtb3ZlID0gKHZhbDogYW55KSA9PiB0ZXN0RmFsc2V5KHZhbCkgfHwgIXZhbD8ubGVuZ3RoXG5cbmNvbnN0IGVxdWFsczogRmlsdGVyRm48YW55PiA9IChyb3csIGNvbHVtbklkOiBzdHJpbmcsIGZpbHRlclZhbHVlOiB1bmtub3duKSA9PiB7XG4gIHJldHVybiByb3cuZ2V0VmFsdWUoY29sdW1uSWQpID09PSBmaWx0ZXJWYWx1ZVxufVxuXG5lcXVhbHMuYXV0b1JlbW92ZSA9ICh2YWw6IGFueSkgPT4gdGVzdEZhbHNleSh2YWwpXG5cbmNvbnN0IHdlYWtFcXVhbHM6IEZpbHRlckZuPGFueT4gPSAoXG4gIHJvdyxcbiAgY29sdW1uSWQ6IHN0cmluZyxcbiAgZmlsdGVyVmFsdWU6IHVua25vd25cbikgPT4ge1xuICByZXR1cm4gcm93LmdldFZhbHVlKGNvbHVtbklkKSA9PSBmaWx0ZXJWYWx1ZVxufVxuXG53ZWFrRXF1YWxzLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+IHRlc3RGYWxzZXkodmFsKVxuXG5jb25zdCBpbk51bWJlclJhbmdlOiBGaWx0ZXJGbjxhbnk+ID0gKFxuICByb3csXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGZpbHRlclZhbHVlOiBbbnVtYmVyLCBudW1iZXJdXG4pID0+IHtcbiAgbGV0IFttaW4sIG1heF0gPSBmaWx0ZXJWYWx1ZVxuXG4gIGNvbnN0IHJvd1ZhbHVlID0gcm93LmdldFZhbHVlPG51bWJlcj4oY29sdW1uSWQpXG4gIHJldHVybiByb3dWYWx1ZSA+PSBtaW4gJiYgcm93VmFsdWUgPD0gbWF4XG59XG5cbmluTnVtYmVyUmFuZ2UucmVzb2x2ZUZpbHRlclZhbHVlID0gKHZhbDogW2FueSwgYW55XSkgPT4ge1xuICBsZXQgW3Vuc2FmZU1pbiwgdW5zYWZlTWF4XSA9IHZhbFxuXG4gIGxldCBwYXJzZWRNaW4gPVxuICAgIHR5cGVvZiB1bnNhZmVNaW4gIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh1bnNhZmVNaW4gYXMgc3RyaW5nKSA6IHVuc2FmZU1pblxuICBsZXQgcGFyc2VkTWF4ID1cbiAgICB0eXBlb2YgdW5zYWZlTWF4ICE9PSAnbnVtYmVyJyA/IHBhcnNlRmxvYXQodW5zYWZlTWF4IGFzIHN0cmluZykgOiB1bnNhZmVNYXhcblxuICBsZXQgbWluID1cbiAgICB1bnNhZmVNaW4gPT09IG51bGwgfHwgTnVtYmVyLmlzTmFOKHBhcnNlZE1pbikgPyAtSW5maW5pdHkgOiBwYXJzZWRNaW5cbiAgbGV0IG1heCA9IHVuc2FmZU1heCA9PT0gbnVsbCB8fCBOdW1iZXIuaXNOYU4ocGFyc2VkTWF4KSA/IEluZmluaXR5IDogcGFyc2VkTWF4XG5cbiAgaWYgKG1pbiA+IG1heCkge1xuICAgIGNvbnN0IHRlbXAgPSBtaW5cbiAgICBtaW4gPSBtYXhcbiAgICBtYXggPSB0ZW1wXG4gIH1cblxuICByZXR1cm4gW21pbiwgbWF4XSBhcyBjb25zdFxufVxuXG5pbk51bWJlclJhbmdlLmF1dG9SZW1vdmUgPSAodmFsOiBhbnkpID0+XG4gIHRlc3RGYWxzZXkodmFsKSB8fCAodGVzdEZhbHNleSh2YWxbMF0pICYmIHRlc3RGYWxzZXkodmFsWzFdKSlcblxuLy8gRXhwb3J0XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJGbnMgPSB7XG4gIGluY2x1ZGVzU3RyaW5nLFxuICBpbmNsdWRlc1N0cmluZ1NlbnNpdGl2ZSxcbiAgZXF1YWxzU3RyaW5nLFxuICBhcnJJbmNsdWRlcyxcbiAgYXJySW5jbHVkZXNBbGwsXG4gIGFyckluY2x1ZGVzU29tZSxcbiAgZXF1YWxzLFxuICB3ZWFrRXF1YWxzLFxuICBpbk51bWJlclJhbmdlLFxufVxuXG5leHBvcnQgdHlwZSBCdWlsdEluRmlsdGVyRm4gPSBrZXlvZiB0eXBlb2YgZmlsdGVyRm5zXG5cbi8vIFV0aWxzXG5cbmZ1bmN0aW9uIHRlc3RGYWxzZXkodmFsOiBhbnkpIHtcbiAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09ICcnXG59XG4iLCJpbXBvcnQgeyBSb3dNb2RlbCB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi4vY29yZS90YWJsZSdcbmltcG9ydCB7IEJ1aWx0SW5GaWx0ZXJGbiwgZmlsdGVyRm5zIH0gZnJvbSAnLi4vZmlsdGVyRm5zJ1xuaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgUm93LFxuICBVcGRhdGVyLFxuICBSb3dEYXRhLFxuICBGaWx0ZXJNZXRhLFxuICBGaWx0ZXJGbnMsXG59IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZnVuY3Rpb25hbFVwZGF0ZSwgaXNGdW5jdGlvbiwgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcnNUYWJsZVN0YXRlIHtcbiAgY29sdW1uRmlsdGVyczogQ29sdW1uRmlsdGVyc1N0YXRlXG4gIGdsb2JhbEZpbHRlcjogYW55XG59XG5cbmV4cG9ydCB0eXBlIENvbHVtbkZpbHRlcnNTdGF0ZSA9IENvbHVtbkZpbHRlcltdXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRmlsdGVyIHtcbiAgaWQ6IHN0cmluZ1xuICB2YWx1ZTogdW5rbm93blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQ29sdW1uRmlsdGVyPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBpZDogc3RyaW5nXG4gIHJlc29sdmVkVmFsdWU6IHVua25vd25cbiAgZmlsdGVyRm46IEZpbHRlckZuPFREYXRhPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckZuPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAoXG4gICAgcm93OiBSb3c8VERhdGE+LFxuICAgIGNvbHVtbklkOiBzdHJpbmcsXG4gICAgZmlsdGVyVmFsdWU6IGFueSxcbiAgICBhZGRNZXRhOiAobWV0YTogRmlsdGVyTWV0YSkgPT4gdm9pZFxuICApOiBib29sZWFuXG5cbiAgcmVzb2x2ZUZpbHRlclZhbHVlPzogVHJhbnNmb3JtRmlsdGVyVmFsdWVGbjxURGF0YT5cbiAgYXV0b1JlbW92ZT86IENvbHVtbkZpbHRlckF1dG9SZW1vdmVUZXN0Rm48VERhdGE+XG59XG5cbmV4cG9ydCB0eXBlIFRyYW5zZm9ybUZpbHRlclZhbHVlRm48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiA9IChcbiAgdmFsdWU6IGFueSxcbiAgY29sdW1uPzogQ29sdW1uPFREYXRhLCB1bmtub3duPlxuKSA9PiB1bmtub3duXG5cbmV4cG9ydCB0eXBlIENvbHVtbkZpbHRlckF1dG9SZW1vdmVUZXN0Rm48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiA9IChcbiAgdmFsdWU6IGFueSxcbiAgY29sdW1uPzogQ29sdW1uPFREYXRhLCB1bmtub3duPlxuKSA9PiBib29sZWFuXG5cbmV4cG9ydCB0eXBlIEN1c3RvbUZpbHRlckZuczxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID0gUmVjb3JkPFxuICBzdHJpbmcsXG4gIEZpbHRlckZuPFREYXRhPlxuPlxuXG5leHBvcnQgdHlwZSBGaWx0ZXJGbk9wdGlvbjxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID1cbiAgfCAnYXV0bydcbiAgfCBCdWlsdEluRmlsdGVyRm5cbiAgfCBrZXlvZiBGaWx0ZXJGbnNcbiAgfCBGaWx0ZXJGbjxURGF0YT5cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJzQ29sdW1uRGVmPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogVGhlIGZpbHRlciBmdW5jdGlvbiB0byB1c2Ugd2l0aCB0aGlzIGNvbHVtbi4gQ2FuIGJlIHRoZSBuYW1lIG9mIGEgYnVpbHQtaW4gZmlsdGVyIGZ1bmN0aW9uIG9yIGEgY3VzdG9tIGZpbHRlciBmdW5jdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2ZpbHRlcmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGZpbHRlckZuPzogRmlsdGVyRm5PcHRpb248VERhdGE+XG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSAqKmNvbHVtbioqIGZpbHRlciBmb3IgdGhpcyBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNlbmFibGVjb2x1bW5maWx0ZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uRmlsdGVyPzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgKipnbG9iYWwqKiBmaWx0ZXIgZm9yIHRoaXMgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZW5hYmxlZ2xvYmFsZmlsdGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGVuYWJsZUdsb2JhbEZpbHRlcj86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJzQ29sdW1uPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBfZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz86ICgpID0+IHVuZGVmaW5lZCB8IFtudW1iZXIsIG51bWJlcl1cbiAgX2dldEZhY2V0ZWRSb3dNb2RlbD86ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICBfZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcz86ICgpID0+IE1hcDxhbnksIG51bWJlcj5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZpbHRlciBmdW5jdGlvbiBmb3IgdGhlIGNvbHVtbiBiYXNlZCBvZmYgb2YgdGhlIGNvbHVtbnMgZmlyc3Qga25vd24gdmFsdWUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRhdXRvZmlsdGVyZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0QXV0b0ZpbHRlckZuOiAoKSA9PiBGaWx0ZXJGbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgKipjb2x1bW4qKiBmaWx0ZXJlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGNhbmZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRDYW5GaWx0ZXI6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgKipnbG9iYWxseSoqIGZpbHRlcmVkLiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGEgY29sdW1uIGZyb20gYmVpbmcgc2Nhbm5lZCBkdXJpbmcgZ2xvYmFsIGZpbHRlcmluZy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGNhbmdsb2JhbGZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRDYW5HbG9iYWxGaWx0ZXI6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCAqKmNvbXB1dGVzIGFuZCByZXR1cm5zKiogYSBtaW4vbWF4IHR1cGxlIGRlcml2ZWQgZnJvbSBgY29sdW1uLmdldEZhY2V0ZWRSb3dNb2RlbGAuIFVzZWZ1bCBmb3IgZGlzcGxheWluZyBmYWNldGVkIHJlc3VsdCB2YWx1ZXMuXG4gICAqID4g4pqg77iPIFJlcXVpcmVzIHRoYXQgeW91IHBhc3MgYSB2YWxpZCBgZ2V0RmFjZXRlZE1pbk1heFZhbHVlc2AgZnVuY3Rpb24gdG8gYG9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlc2AuIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCB2aWEgdGhlIGV4cG9ydGVkIGBnZXRGYWNldGVkTWluTWF4VmFsdWVzYCBmdW5jdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGZhY2V0ZWRtaW5tYXh2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0RmFjZXRlZE1pbk1heFZhbHVlczogKCkgPT4gdW5kZWZpbmVkIHwgW251bWJlciwgbnVtYmVyXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIHdpdGggYWxsIG90aGVyIGNvbHVtbiBmaWx0ZXJzIGFwcGxpZWQsIGV4Y2x1ZGluZyBpdHMgb3duIGZpbHRlci4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIGZhY2V0ZWQgcmVzdWx0IGNvdW50cy5cbiAgICogPiDimqDvuI8gUmVxdWlyZXMgdGhhdCB5b3UgcGFzcyBhIHZhbGlkIGBnZXRGYWNldGVkUm93TW9kZWxgIGZ1bmN0aW9uIHRvIGBvcHRpb25zLmZhY2V0ZWRSb3dNb2RlbGAuIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCB2aWEgdGhlIGV4cG9ydGVkIGBnZXRGYWNldGVkUm93TW9kZWxgIGZ1bmN0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0ZmFjZXRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZhY2V0ZWRSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgKipjb21wdXRlcyBhbmQgcmV0dXJucyoqIGEgYE1hcGAgb2YgdW5pcXVlIHZhbHVlcyBhbmQgdGhlaXIgb2NjdXJyZW5jZXMgZGVyaXZlZCBmcm9tIGBjb2x1bW4uZ2V0RmFjZXRlZFJvd01vZGVsYC4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIGZhY2V0ZWQgcmVzdWx0IHZhbHVlcy5cbiAgICogPiDimqDvuI8gUmVxdWlyZXMgdGhhdCB5b3UgcGFzcyBhIHZhbGlkIGBnZXRGYWNldGVkVW5pcXVlVmFsdWVzYCBmdW5jdGlvbiB0byBgb3B0aW9ucy5nZXRGYWNldGVkVW5pcXVlVmFsdWVzYC4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIHZpYSB0aGUgZXhwb3J0ZWQgYGdldEZhY2V0ZWRVbmlxdWVWYWx1ZXNgIGZ1bmN0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0ZmFjZXRlZHVuaXF1ZXZhbHVlcylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRGYWNldGVkVW5pcXVlVmFsdWVzOiAoKSA9PiBNYXA8YW55LCBudW1iZXI+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgZnVuY3Rpb24gKGVpdGhlciB1c2VyLWRlZmluZWQgb3IgYXV0b21hdGljLCBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbikgZm9yIHRoZSBjb2x1bW5JZCBzcGVjaWZpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRmaWx0ZXJmbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRGaWx0ZXJGbjogKCkgPT4gRmlsdGVyRm48VERhdGE+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCAoaW5jbHVkaW5nIGAtMWApIG9mIHRoZSBjb2x1bW4gZmlsdGVyIGluIHRoZSB0YWJsZSdzIGBzdGF0ZS5jb2x1bW5GaWx0ZXJzYCBhcnJheS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGZpbHRlcmluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZpbHRlckluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZmlsdGVyIHZhbHVlIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0ZmlsdGVydmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0RmlsdGVyVmFsdWU6ICgpID0+IHVua25vd25cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBpcyBjdXJyZW50bHkgZmlsdGVyZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRpc2ZpbHRlcmVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldElzRmlsdGVyZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBjdXJyZW50IGZpbHRlciB2YWx1ZSBmb3IgdGhlIGNvbHVtbi4gWW91IGNhbiBwYXNzIGl0IGEgdmFsdWUgb3IgYW4gdXBkYXRlciBmdW5jdGlvbiBmb3IgaW1tdXRhYmlsaXR5LXNhZmUgb3BlcmF0aW9ucyBvbiBleGlzdGluZyB2YWx1ZXMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNzZXRmaWx0ZXJ2YWx1ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBzZXRGaWx0ZXJWYWx1ZTogKHVwZGF0ZXI6IFVwZGF0ZXI8YW55PikgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcnNSb3c8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGZpbHRlcnMgbWFwIGZvciB0aGUgcm93LiBUaGlzIG9iamVjdCB0cmFja3Mgd2hldGhlciBhIHJvdyBpcyBwYXNzaW5nL2ZhaWxpbmcgc3BlY2lmaWMgZmlsdGVycyBieSB0aGVpciBjb2x1bW4gSUQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNjb2x1bW5maWx0ZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGNvbHVtbkZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIGZpbHRlcnMgbWV0YSBtYXAgZm9yIHRoZSByb3cuIFRoaXMgb2JqZWN0IHRyYWNrcyBhbnkgZmlsdGVyIG1ldGEgZm9yIGEgcm93IGFzIG9wdGlvbmFsbHkgcHJvdmlkZWQgZHVyaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2Vzcy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2NvbHVtbmZpbHRlcnNtZXRhKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGNvbHVtbkZpbHRlcnNNZXRhOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJNZXRhPlxufVxuXG5pbnRlcmZhY2UgRmlsdGVyc09wdGlvbnNCYXNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyBhbGwgZmlsdGVyaW5nIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNlbmFibGVmaWx0ZXJzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGVuYWJsZUZpbHRlcnM/OiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBmaWx0ZXJpbmcgaXMgZG9uZSBmcm9tIHBhcmVudCByb3dzIGRvd24gKHNvIGlmIGEgcGFyZW50IHJvdyBpcyBmaWx0ZXJlZCBvdXQsIGFsbCBvZiBpdHMgY2hpbGRyZW4gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgYXMgd2VsbCkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gYHRydWVgIHdpbGwgY2F1c2UgZmlsdGVyaW5nIHRvIGJlIGRvbmUgZnJvbSBsZWFmIHJvd3MgdXAgKHdoaWNoIG1lYW5zIHBhcmVudCByb3dzIHdpbGwgYmUgaW5jbHVkZWQgc28gbG9uZyBhcyBvbmUgb2YgdGhlaXIgY2hpbGQgb3IgZ3JhbmQtY2hpbGQgcm93cyBpcyBhbHNvIGluY2x1ZGVkKS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2ZpbHRlcmZyb21sZWFmcm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBmaWx0ZXJGcm9tTGVhZlJvd3M/OiBib29sZWFuXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKipvbmNlKiogcGVyIHRhYmxlIGFuZCBzaG91bGQgcmV0dXJuIGEgKipuZXcgZnVuY3Rpb24qKiB3aGljaCB3aWxsIGNhbGN1bGF0ZSBhbmQgcmV0dXJuIHRoZSByb3cgbW9kZWwgZm9yIHRoZSB0YWJsZSB3aGVuIGl0J3MgZmlsdGVyZWQuXG4gICAqIC0gRm9yIHNlcnZlci1zaWRlIGZpbHRlcmluZywgdGhpcyBmdW5jdGlvbiBpcyB1bm5lY2Vzc2FyeSBhbmQgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhlIHNlcnZlciBzaG91bGQgYWxyZWFkeSByZXR1cm4gdGhlIGZpbHRlcmVkIHJvdyBtb2RlbC5cbiAgICogLSBGb3IgY2xpZW50LXNpZGUgZmlsdGVyaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkLiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgdmlhIGFueSB0YWJsZSBhZGFwdGVyJ3MgYHsgZ2V0RmlsdGVyZWRSb3dNb2RlbCB9YCBleHBvcnQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRmaWx0ZXJlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZpbHRlcmVkUm93TW9kZWw/OiAodGFibGU6IFRhYmxlPGFueT4pID0+ICgpID0+IFJvd01vZGVsPGFueT5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBgZ2V0RmlsdGVyZWRSb3dNb2RlbGAgZnJvbSBiZWluZyB1c2VkIHRvIGZpbHRlciBkYXRhLiBUaGlzIG1heSBiZSB1c2VmdWwgaWYgeW91ciB0YWJsZSBuZWVkcyB0byBkeW5hbWljYWxseSBzdXBwb3J0IGJvdGggY2xpZW50LXNpZGUgYW5kIHNlcnZlci1zaWRlIGZpbHRlcmluZy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI21hbnVhbGZpbHRlcmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBtYW51YWxGaWx0ZXJpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBmaWx0ZXJpbmcgaXMgZG9uZSBmb3IgYWxsIHJvd3MgKG1heCBkZXB0aCBvZiAxMDApLCBubyBtYXR0ZXIgaWYgdGhleSBhcmUgcm9vdCBsZXZlbCBwYXJlbnQgcm93cyBvciB0aGUgY2hpbGQgbGVhZiByb3dzIG9mIGEgcGFyZW50IHJvdy4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBgMGAgd2lsbCBjYXVzZSBmaWx0ZXJpbmcgdG8gb25seSBiZSBhcHBsaWVkIHRvIHRoZSByb290IGxldmVsIHBhcmVudCByb3dzLCB3aXRoIGFsbCBzdWItcm93cyByZW1haW5pbmcgdW5maWx0ZXJlZC4gU2ltaWxhcmx5LCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGAxYCB3aWxsIGNhdXNlIGZpbHRlcmluZyB0byBvbmx5IGJlIGFwcGxpZWQgdG8gY2hpbGQgbGVhZiByb3dzIDEgbGV2ZWwgZGVlcCwgYW5kIHNvIG9uLlxuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzaXR1YXRpb25zIHdoZXJlIHlvdSB3YW50IGEgcm93J3MgZW50aXJlIGNoaWxkIGhpZXJhcmNoeSB0byBiZSB2aXNpYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGFwcGxpZWQgZmlsdGVyLlxuICAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI21heGxlYWZyb3dmaWx0ZXJkZXB0aClcbiAgICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgbWF4TGVhZlJvd0ZpbHRlckRlcHRoPzogbnVtYmVyXG5cbiAgLy8gQ29sdW1uXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzICoqY29sdW1uKiogZmlsdGVyaW5nIGZvciBhbGwgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2VuYWJsZWNvbHVtbmZpbHRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uRmlsdGVycz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gYHVwZGF0ZXJGbmAgd2hlbiBgc3RhdGUuY29sdW1uRmlsdGVyc2AgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2UgZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI29uY29sdW1uZmlsdGVyc2NoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBvbkNvbHVtbkZpbHRlcnNDaGFuZ2U/OiBPbkNoYW5nZUZuPENvbHVtbkZpbHRlcnNTdGF0ZT5cblxuICAvLyBHbG9iYWxcbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgKipnbG9iYWwqKiBmaWx0ZXJpbmcgZm9yIGFsbCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZW5hYmxlZ2xvYmFsZmlsdGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGVuYWJsZUdsb2JhbEZpbHRlcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGNvbHVtbiBhbmQgc2hvdWxkIHJldHVybiBgdHJ1ZWAgb3IgYGZhbHNlYCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgY29sdW1uIHNob3VsZCBiZSB1c2VkIGZvciBnbG9iYWwgZmlsdGVyaW5nLlxuICAgKiBcbiAgICogVGhpcyBpcyB1c2VmdWwgaWYgdGhlIGNvbHVtbiBjYW4gY29udGFpbiBkYXRhIHRoYXQgaXMgbm90IGBzdHJpbmdgIG9yIGBudW1iZXJgIChpLmUuIGB1bmRlZmluZWRgKS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGNvbHVtbmNhbmdsb2JhbGZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRDb2x1bW5DYW5HbG9iYWxGaWx0ZXI/OiAoY29sdW1uOiBDb2x1bW48VERhdGEsIHVua25vd24+KSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIGZ1bmN0aW9uIHRvIHVzZSBmb3IgZ2xvYmFsIGZpbHRlcmluZy5cbiAgICogLSBBIGBzdHJpbmdgIHJlZmVyZW5jaW5nIGEgYnVpbHQtaW4gZmlsdGVyIGZ1bmN0aW9uXG4gICAqIC0gQSBgc3RyaW5nYCB0aGF0IHJlZmVyZW5jZXMgYSBjdXN0b20gZmlsdGVyIGZ1bmN0aW9ucyBwcm92aWRlZCB2aWEgdGhlIGB0YWJsZU9wdGlvbnMuZmlsdGVyRm5zYCBvcHRpb25cbiAgICogLSBBIGN1c3RvbSBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dsb2JhbGZpbHRlcmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdsb2JhbEZpbHRlckZuPzogRmlsdGVyRm5PcHRpb248VERhdGE+XG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLmdsb2JhbEZpbHRlcmAgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2UgZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI29uZ2xvYmFsZmlsdGVyY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIG9uR2xvYmFsRmlsdGVyQ2hhbmdlPzogT25DaGFuZ2VGbjxhbnk+XG5cbiAgLy8gRmFjZXRpbmdcbiAgZ2V0RmFjZXRlZFJvd01vZGVsPzogKFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gICAgY29sdW1uSWQ6IHN0cmluZ1xuICApID0+ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICBnZXRGYWNldGVkVW5pcXVlVmFsdWVzPzogKFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gICAgY29sdW1uSWQ6IHN0cmluZ1xuICApID0+ICgpID0+IE1hcDxhbnksIG51bWJlcj5cbiAgZ2V0RmFjZXRlZE1pbk1heFZhbHVlcz86IChcbiAgICB0YWJsZTogVGFibGU8VERhdGE+LFxuICAgIGNvbHVtbklkOiBzdHJpbmdcbiAgKSA9PiAoKSA9PiB1bmRlZmluZWQgfCBbbnVtYmVyLCBudW1iZXJdXG59XG5cbnR5cGUgUmVzb2x2ZWRGaWx0ZXJGbnMgPSBrZXlvZiBGaWx0ZXJGbnMgZXh0ZW5kcyBuZXZlclxuICA/IHtcbiAgICAgIGZpbHRlckZucz86IFJlY29yZDxzdHJpbmcsIEZpbHRlckZuPGFueT4+XG4gICAgfVxuICA6IHtcbiAgICAgIGZpbHRlckZuczogUmVjb3JkPGtleW9mIEZpbHRlckZucywgRmlsdGVyRm48YW55Pj5cbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyc09wdGlvbnM8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPlxuICBleHRlbmRzIEZpbHRlcnNPcHRpb25zQmFzZTxURGF0YT4sXG4gICAgUmVzb2x2ZWRGaWx0ZXJGbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJzSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIGBzdGF0ZS5jb2x1bW5GaWx0ZXJzYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3NldGNvbHVtbmZpbHRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgc2V0Q29sdW1uRmlsdGVyczogKHVwZGF0ZXI6IFVwZGF0ZXI8Q29sdW1uRmlsdGVyc1N0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKmNvbHVtbkZpbHRlcnMqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLmNvbHVtbkZpbHRlcnNgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3Jlc2V0Y29sdW1uZmlsdGVycylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICByZXNldENvbHVtbkZpbHRlcnM6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG5cbiAgLy8gQ29sdW1uIEZpbHRlcnNcbiAgX2dldEZpbHRlcmVkUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGFmdGVyICoqY29sdW1uKiogZmlsdGVyaW5nIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRmaWx0ZXJlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEZpbHRlcmVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYmVmb3JlIGFueSAqKmNvbHVtbioqIGZpbHRlcmluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2ZpbHRlcnMjZ2V0cHJlZmlsdGVyZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRQcmVGaWx0ZXJlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cblxuICAvLyBHbG9iYWwgRmlsdGVyc1xuICBfZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcz86ICgpID0+IHVuZGVmaW5lZCB8IFtudW1iZXIsIG51bWJlcl1cbiAgX2dldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbD86ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICBfZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcz86ICgpID0+IE1hcDxhbnksIG51bWJlcj5cbiAgLyoqXG4gICAqIEN1cnJlbnRseSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBidWlsdC1pbiBgaW5jbHVkZXNTdHJpbmdgIGZpbHRlciBmdW5jdGlvbi4gSW4gZnV0dXJlIHJlbGVhc2VzLCBpdCBtYXkgcmV0dXJuIG1vcmUgZHluYW1pYyBmaWx0ZXIgZnVuY3Rpb25zIGJhc2VkIG9uIHRoZSBuYXR1cmUgb2YgdGhlIGRhdGEgcHJvdmlkZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZmlsdGVycyNnZXRnbG9iYWxhdXRvZmlsdGVyZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0R2xvYmFsQXV0b0ZpbHRlckZuOiAoKSA9PiBGaWx0ZXJGbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZhY2V0ZWQgbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZhY2V0ZWRtaW5tYXh2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlczogKCkgPT4gdW5kZWZpbmVkIHwgW251bWJlciwgbnVtYmVyXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYWZ0ZXIgKipnbG9iYWwqKiBmaWx0ZXJpbmcgaGFzIGJlZW4gYXBwbGllZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZhY2V0ZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBnZXRHbG9iYWxGYWNldGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmFjZXRlZCB1bmlxdWUgdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZhY2V0ZWR1bmlxdWV2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9maWx0ZXJzKVxuICAgKi9cbiAgZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlczogKCkgPT4gTWFwPGFueSwgbnVtYmVyPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsdGVyIGZ1bmN0aW9uIChlaXRoZXIgdXNlci1kZWZpbmVkIG9yIGF1dG9tYXRpYywgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24pIGZvciB0aGUgZ2xvYmFsIGZpbHRlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI2dldGdsb2JhbGZpbHRlcmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIGdldEdsb2JhbEZpbHRlckZuOiAoKSA9PiBGaWx0ZXJGbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipnbG9iYWxGaWx0ZXIqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLmdsb2JhbEZpbHRlcmAsIG9yIGB0cnVlYCBjYW4gYmUgcGFzc2VkIHRvIGZvcmNlIGEgZGVmYXVsdCBibGFuayBzdGF0ZSByZXNldCB0byBgdW5kZWZpbmVkYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3Jlc2V0Z2xvYmFsZmlsdGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZmlsdGVycylcbiAgICovXG4gIHJlc2V0R2xvYmFsRmlsdGVyOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUuZ2xvYmFsRmlsdGVyYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9maWx0ZXJzI3NldGdsb2JhbGZpbHRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2ZpbHRlcnMpXG4gICAqL1xuICBzZXRHbG9iYWxGaWx0ZXI6ICh1cGRhdGVyOiBVcGRhdGVyPGFueT4pID0+IHZvaWRcbn1cblxuLy9cblxuZXhwb3J0IGNvbnN0IEZpbHRlcnM6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogRmlsdGVyc0NvbHVtbkRlZjxURGF0YT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJGbjogJ2F1dG8nLFxuICAgIH1cbiAgfSxcblxuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IEZpbHRlcnNUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uRmlsdGVyczogW10sXG4gICAgICBnbG9iYWxGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgIC8vIGZpbHRlcnNQcm9ncmVzczogMSxcbiAgICAgIC8vIGZhY2V0UHJvZ3Jlc3M6IHt9LFxuICAgICAgLi4uc3RhdGUsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRPcHRpb25zOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IEZpbHRlcnNPcHRpb25zPFREYXRhPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uRmlsdGVyc0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignY29sdW1uRmlsdGVycycsIHRhYmxlKSxcbiAgICAgIG9uR2xvYmFsRmlsdGVyQ2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdnbG9iYWxGaWx0ZXInLCB0YWJsZSksXG4gICAgICBmaWx0ZXJGcm9tTGVhZlJvd3M6IGZhbHNlLFxuICAgICAgbWF4TGVhZlJvd0ZpbHRlckRlcHRoOiAxMDAsXG4gICAgICBnbG9iYWxGaWx0ZXJGbjogJ2F1dG8nLFxuICAgICAgZ2V0Q29sdW1uQ2FuR2xvYmFsRmlsdGVyOiBjb2x1bW4gPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRhYmxlXG4gICAgICAgICAgLmdldENvcmVSb3dNb2RlbCgpXG4gICAgICAgICAgLmZsYXRSb3dzWzBdPy5fZ2V0QWxsQ2VsbHNCeUNvbHVtbklkKClcbiAgICAgICAgICBbY29sdW1uLmlkXT8uZ2V0VmFsdWUoKVxuXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcidcbiAgICAgIH0sXG4gICAgfSBhcyBGaWx0ZXJzT3B0aW9uczxURGF0YT5cbiAgfSxcblxuICBjcmVhdGVDb2x1bW46IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCB1bmtub3duPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbHVtbi5nZXRBdXRvRmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvdyA9IHRhYmxlLmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZmlyc3RSb3c/LmdldFZhbHVlKGNvbHVtbi5pZClcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckZucy5pbmNsdWRlc1N0cmluZ1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmlsdGVyRm5zLmluTnVtYmVyUmFuZ2VcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJGbnMuZXF1YWxzXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJGbnMuZXF1YWxzXG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmlsdGVyRm5zLmFyckluY2x1ZGVzXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJGbnMud2Vha0VxdWFsc1xuICAgIH1cbiAgICBjb2x1bW4uZ2V0RmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihjb2x1bW4uY29sdW1uRGVmLmZpbHRlckZuKVxuICAgICAgICA/IGNvbHVtbi5jb2x1bW5EZWYuZmlsdGVyRm5cbiAgICAgICAgOiBjb2x1bW4uY29sdW1uRGVmLmZpbHRlckZuID09PSAnYXV0bydcbiAgICAgICAgPyBjb2x1bW4uZ2V0QXV0b0ZpbHRlckZuKClcbiAgICAgICAgOiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGFibGUub3B0aW9ucy5maWx0ZXJGbnM/Lltjb2x1bW4uY29sdW1uRGVmLmZpbHRlckZuIGFzIHN0cmluZ10gPz9cbiAgICAgICAgICBmaWx0ZXJGbnNbY29sdW1uLmNvbHVtbkRlZi5maWx0ZXJGbiBhcyBCdWlsdEluRmlsdGVyRm5dXG4gICAgfVxuICAgIGNvbHVtbi5nZXRDYW5GaWx0ZXIgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29sdW1uLmNvbHVtbkRlZi5lbmFibGVDb2x1bW5GaWx0ZXIgPz8gdHJ1ZSkgJiZcbiAgICAgICAgKHRhYmxlLm9wdGlvbnMuZW5hYmxlQ29sdW1uRmlsdGVycyA/PyB0cnVlKSAmJlxuICAgICAgICAodGFibGUub3B0aW9ucy5lbmFibGVGaWx0ZXJzID8/IHRydWUpICYmXG4gICAgICAgICEhY29sdW1uLmFjY2Vzc29yRm5cbiAgICAgIClcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0Q2FuR2xvYmFsRmlsdGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGNvbHVtbi5jb2x1bW5EZWYuZW5hYmxlR2xvYmFsRmlsdGVyID8/IHRydWUpICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZUdsb2JhbEZpbHRlciA/PyB0cnVlKSAmJlxuICAgICAgICAodGFibGUub3B0aW9ucy5lbmFibGVGaWx0ZXJzID8/IHRydWUpICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmdldENvbHVtbkNhbkdsb2JhbEZpbHRlcj8uKGNvbHVtbikgPz8gdHJ1ZSkgJiZcbiAgICAgICAgISFjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRJc0ZpbHRlcmVkID0gKCkgPT4gY29sdW1uLmdldEZpbHRlckluZGV4KCkgPiAtMVxuXG4gICAgY29sdW1uLmdldEZpbHRlclZhbHVlID0gKCkgPT5cbiAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uRmlsdGVycz8uZmluZChkID0+IGQuaWQgPT09IGNvbHVtbi5pZCk/LnZhbHVlXG5cbiAgICBjb2x1bW4uZ2V0RmlsdGVySW5kZXggPSAoKSA9PlxuICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5GaWx0ZXJzPy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpID8/IC0xXG5cbiAgICBjb2x1bW4uc2V0RmlsdGVyVmFsdWUgPSB2YWx1ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRDb2x1bW5GaWx0ZXJzKG9sZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlckZuID0gY29sdW1uLmdldEZpbHRlckZuKClcbiAgICAgICAgY29uc3QgcHJldmlvdXNmaWx0ZXIgPSBvbGQ/LmZpbmQoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpXG5cbiAgICAgICAgY29uc3QgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91c2ZpbHRlciA/IHByZXZpb3VzZmlsdGVyLnZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIClcblxuICAgICAgICAvL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihmaWx0ZXJGbiBhcyBGaWx0ZXJGbjxURGF0YT4sIG5ld0ZpbHRlciwgY29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gb2xkPy5maWx0ZXIoZCA9PiBkLmlkICE9PSBjb2x1bW4uaWQpID8/IFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdGaWx0ZXJPYmogPSB7IGlkOiBjb2x1bW4uaWQsIHZhbHVlOiBuZXdGaWx0ZXIgfVxuXG4gICAgICAgIGlmIChwcmV2aW91c2ZpbHRlcikge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBvbGQ/Lm1hcChkID0+IHtcbiAgICAgICAgICAgICAgaWYgKGQuaWQgPT09IGNvbHVtbi5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdGaWx0ZXJPYmpcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZFxuICAgICAgICAgICAgfSkgPz8gW11cbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLm9sZCwgbmV3RmlsdGVyT2JqXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtuZXdGaWx0ZXJPYmpdXG4gICAgICB9KVxuICAgIH1cbiAgICBjb2x1bW4uX2dldEZhY2V0ZWRSb3dNb2RlbCA9XG4gICAgICB0YWJsZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkUm93TW9kZWwodGFibGUsIGNvbHVtbi5pZClcbiAgICBjb2x1bW4uZ2V0RmFjZXRlZFJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKCFjb2x1bW4uX2dldEZhY2V0ZWRSb3dNb2RlbCkge1xuICAgICAgICByZXR1cm4gdGFibGUuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW4uX2dldEZhY2V0ZWRSb3dNb2RlbCgpXG4gICAgfVxuICAgIGNvbHVtbi5fZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyA9XG4gICAgICB0YWJsZS5vcHRpb25zLmdldEZhY2V0ZWRVbmlxdWVWYWx1ZXMgJiZcbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyh0YWJsZSwgY29sdW1uLmlkKVxuICAgIGNvbHVtbi5nZXRGYWNldGVkVW5pcXVlVmFsdWVzID0gKCkgPT4ge1xuICAgICAgaWYgKCFjb2x1bW4uX2dldEZhY2V0ZWRVbmlxdWVWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uLl9nZXRGYWNldGVkVW5pcXVlVmFsdWVzKClcbiAgICB9XG4gICAgY29sdW1uLl9nZXRGYWNldGVkTWluTWF4VmFsdWVzID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzKHRhYmxlLCBjb2x1bW4uaWQpXG4gICAgY29sdW1uLmdldEZhY2V0ZWRNaW5NYXhWYWx1ZXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIWNvbHVtbi5fZ2V0RmFjZXRlZE1pbk1heFZhbHVlcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW4uX2dldEZhY2V0ZWRNaW5NYXhWYWx1ZXMoKVxuICAgIH1cbiAgICAvLyAoKSA9PiBbY29sdW1uLmdldEZhY2V0ZWRSb3dNb2RlbCgpXSxcbiAgICAvLyBmYWNldGVkUm93TW9kZWwgPT4gZ2V0Um93TW9kZWxNaW5NYXhWYWx1ZXMoZmFjZXRlZFJvd01vZGVsLCBjb2x1bW4uaWQpLFxuICB9LFxuXG4gIGNyZWF0ZVJvdzogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgcm93OiBSb3c8VERhdGE+LFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogdm9pZCA9PiB7XG4gICAgcm93LmNvbHVtbkZpbHRlcnMgPSB7fVxuICAgIHJvdy5jb2x1bW5GaWx0ZXJzTWV0YSA9IHt9XG4gIH0sXG5cbiAgY3JlYXRlVGFibGU6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KHRhYmxlOiBUYWJsZTxURGF0YT4pOiB2b2lkID0+IHtcbiAgICB0YWJsZS5nZXRHbG9iYWxBdXRvRmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gZmlsdGVyRm5zLmluY2x1ZGVzU3RyaW5nXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0R2xvYmFsRmlsdGVyRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdsb2JhbEZpbHRlckZuOiBnbG9iYWxGaWx0ZXJGbiB9ID0gdGFibGUub3B0aW9uc1xuXG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihnbG9iYWxGaWx0ZXJGbilcbiAgICAgICAgPyBnbG9iYWxGaWx0ZXJGblxuICAgICAgICA6IGdsb2JhbEZpbHRlckZuID09PSAnYXV0bydcbiAgICAgICAgPyB0YWJsZS5nZXRHbG9iYWxBdXRvRmlsdGVyRm4oKVxuICAgICAgICA6IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0YWJsZS5vcHRpb25zLmZpbHRlckZucz8uW2dsb2JhbEZpbHRlckZuIGFzIHN0cmluZ10gPz9cbiAgICAgICAgICBmaWx0ZXJGbnNbZ2xvYmFsRmlsdGVyRm4gYXMgQnVpbHRJbkZpbHRlckZuXVxuICAgIH1cblxuICAgIHRhYmxlLnNldENvbHVtbkZpbHRlcnMgPSAodXBkYXRlcjogVXBkYXRlcjxDb2x1bW5GaWx0ZXJzU3RhdGU+KSA9PiB7XG4gICAgICBjb25zdCBsZWFmQ29sdW1ucyA9IHRhYmxlLmdldEFsbExlYWZDb2x1bW5zKClcblxuICAgICAgY29uc3QgdXBkYXRlRm4gPSAob2xkOiBDb2x1bW5GaWx0ZXJzU3RhdGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uYWxVcGRhdGUodXBkYXRlciwgb2xkKT8uZmlsdGVyKGZpbHRlciA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gbGVhZkNvbHVtbnMuZmluZChkID0+IGQuaWQgPT09IGZpbHRlci5pZClcblxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckZuID0gY29sdW1uLmdldEZpbHRlckZuKClcblxuICAgICAgICAgICAgaWYgKHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoZmlsdGVyRm4sIGZpbHRlci52YWx1ZSwgY29sdW1uKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0YWJsZS5vcHRpb25zLm9uQ29sdW1uRmlsdGVyc0NoYW5nZT8uKHVwZGF0ZUZuKVxuICAgIH1cblxuICAgIHRhYmxlLnNldEdsb2JhbEZpbHRlciA9IHVwZGF0ZXIgPT4ge1xuICAgICAgdGFibGUub3B0aW9ucy5vbkdsb2JhbEZpbHRlckNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgfVxuXG4gICAgdGFibGUucmVzZXRHbG9iYWxGaWx0ZXIgPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0R2xvYmFsRmlsdGVyKFxuICAgICAgICBkZWZhdWx0U3RhdGUgPyB1bmRlZmluZWQgOiB0YWJsZS5pbml0aWFsU3RhdGUuZ2xvYmFsRmlsdGVyXG4gICAgICApXG4gICAgfVxuXG4gICAgdGFibGUucmVzZXRDb2x1bW5GaWx0ZXJzID0gZGVmYXVsdFN0YXRlID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtbkZpbHRlcnMoXG4gICAgICAgIGRlZmF1bHRTdGF0ZSA/IFtdIDogdGFibGUuaW5pdGlhbFN0YXRlPy5jb2x1bW5GaWx0ZXJzID8/IFtdXG4gICAgICApXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCA9ICgpID0+IHRhYmxlLmdldENvcmVSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEZpbHRlcmVkUm93TW9kZWwgJiYgdGFibGUub3B0aW9ucy5nZXRGaWx0ZXJlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRGaWx0ZXJlZFJvd01vZGVsID0gdGFibGUub3B0aW9ucy5nZXRGaWx0ZXJlZFJvd01vZGVsKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFibGUub3B0aW9ucy5tYW51YWxGaWx0ZXJpbmcgfHwgIXRhYmxlLl9nZXRGaWx0ZXJlZFJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLl9nZXRGaWx0ZXJlZFJvd01vZGVsKClcbiAgICB9XG5cbiAgICB0YWJsZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZFJvd01vZGVsICYmXG4gICAgICB0YWJsZS5vcHRpb25zLmdldEZhY2V0ZWRSb3dNb2RlbCh0YWJsZSwgJ19fZ2xvYmFsX18nKVxuXG4gICAgdGFibGUuZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKHRhYmxlLm9wdGlvbnMubWFudWFsRmlsdGVyaW5nIHx8ICF0YWJsZS5fZ2V0R2xvYmFsRmFjZXRlZFJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLl9nZXRHbG9iYWxGYWNldGVkUm93TW9kZWwoKVxuICAgIH1cblxuICAgIHRhYmxlLl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkVW5pcXVlVmFsdWVzKHRhYmxlLCAnX19nbG9iYWxfXycpXG4gICAgdGFibGUuZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcyA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEdsb2JhbEZhY2V0ZWRVbmlxdWVWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGUuX2dldEdsb2JhbEZhY2V0ZWRVbmlxdWVWYWx1ZXMoKVxuICAgIH1cblxuICAgIHRhYmxlLl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzID1cbiAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyAmJlxuICAgICAgdGFibGUub3B0aW9ucy5nZXRGYWNldGVkTWluTWF4VmFsdWVzKHRhYmxlLCAnX19nbG9iYWxfXycpXG4gICAgdGFibGUuZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcyA9ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldEdsb2JhbEZhY2V0ZWRNaW5NYXhWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5fZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcygpXG4gICAgfVxuICB9LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQXV0b1JlbW92ZUZpbHRlcjxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICBmaWx0ZXJGbj86IEZpbHRlckZuPFREYXRhPixcbiAgdmFsdWU/OiBhbnksXG4gIGNvbHVtbj86IENvbHVtbjxURGF0YSwgdW5rbm93bj5cbikge1xuICByZXR1cm4gKFxuICAgIChmaWx0ZXJGbiAmJiBmaWx0ZXJGbi5hdXRvUmVtb3ZlXG4gICAgICA/IGZpbHRlckZuLmF1dG9SZW1vdmUodmFsdWUsIGNvbHVtbilcbiAgICAgIDogZmFsc2UpIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZSlcbiAgKVxufVxuIiwiaW1wb3J0IHsgQWdncmVnYXRpb25GbiB9IGZyb20gJy4vZmVhdHVyZXMvR3JvdXBpbmcnXG5pbXBvcnQgeyBpc051bWJlckFycmF5IH0gZnJvbSAnLi91dGlscydcblxuY29uc3Qgc3VtOiBBZ2dyZWdhdGlvbkZuPGFueT4gPSAoY29sdW1uSWQsIF9sZWFmUm93cywgY2hpbGRSb3dzKSA9PiB7XG4gIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3QgYWRkIHRoZSBhZ2dyZWdhdGlvbnMgdG9nZXRoZXIgaW5zdGVhZCBvZlxuICAvLyBwcm9jZXNzIGxlYWYgbm9kZXMgaW5kaXZpZHVhbGx5XG4gIHJldHVybiBjaGlsZFJvd3MucmVkdWNlKChzdW0sIG5leHQpID0+IHtcbiAgICBjb25zdCBuZXh0VmFsdWUgPSBuZXh0LmdldFZhbHVlKGNvbHVtbklkKVxuICAgIHJldHVybiBzdW0gKyAodHlwZW9mIG5leHRWYWx1ZSA9PT0gJ251bWJlcicgPyBuZXh0VmFsdWUgOiAwKVxuICB9LCAwKVxufVxuXG5jb25zdCBtaW46IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgX2xlYWZSb3dzLCBjaGlsZFJvd3MpID0+IHtcbiAgbGV0IG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgY2hpbGRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdy5nZXRWYWx1ZTxudW1iZXI+KGNvbHVtbklkKVxuXG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT0gbnVsbCAmJlxuICAgICAgKG1pbiEgPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKVxuICAgICkge1xuICAgICAgbWluID0gdmFsdWVcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1pblxufVxuXG5jb25zdCBtYXg6IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgX2xlYWZSb3dzLCBjaGlsZFJvd3MpID0+IHtcbiAgbGV0IG1heDogbnVtYmVyIHwgdW5kZWZpbmVkXG5cbiAgY2hpbGRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvdy5nZXRWYWx1ZTxudW1iZXI+KGNvbHVtbklkKVxuICAgIGlmIChcbiAgICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICAgIChtYXghIDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSlcbiAgICApIHtcbiAgICAgIG1heCA9IHZhbHVlXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtYXhcbn1cblxuY29uc3QgZXh0ZW50OiBBZ2dyZWdhdGlvbkZuPGFueT4gPSAoY29sdW1uSWQsIF9sZWFmUm93cywgY2hpbGRSb3dzKSA9PiB7XG4gIGxldCBtaW46IG51bWJlciB8IHVuZGVmaW5lZFxuICBsZXQgbWF4OiBudW1iZXIgfCB1bmRlZmluZWRcblxuICBjaGlsZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcm93LmdldFZhbHVlPG51bWJlcj4oY29sdW1uSWQpXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodmFsdWUgPj0gdmFsdWUpIG1pbiA9IG1heCA9IHZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlXG4gICAgICAgIGlmIChtYXghIDwgdmFsdWUpIG1heCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBbbWluLCBtYXhdXG59XG5cbmNvbnN0IG1lYW46IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgbGVhZlJvd3MpID0+IHtcbiAgbGV0IGNvdW50ID0gMFxuICBsZXQgc3VtID0gMFxuXG4gIGxlYWZSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBsZXQgdmFsdWUgPSByb3cuZ2V0VmFsdWU8bnVtYmVyPihjb2x1bW5JZClcbiAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICArK2NvdW50LCAoc3VtICs9IHZhbHVlKVxuICAgIH1cbiAgfSlcblxuICBpZiAoY291bnQpIHJldHVybiBzdW0gLyBjb3VudFxuXG4gIHJldHVyblxufVxuXG5jb25zdCBtZWRpYW46IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgbGVhZlJvd3MpID0+IHtcbiAgaWYgKCFsZWFmUm93cy5sZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGxlYWZSb3dzLm1hcChyb3cgPT4gcm93LmdldFZhbHVlKGNvbHVtbklkKSlcbiAgaWYgKCFpc051bWJlckFycmF5KHZhbHVlcykpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB2YWx1ZXNbMF1cbiAgfVxuXG4gIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpXG4gIGNvbnN0IG51bXMgPSB2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gIHJldHVybiB2YWx1ZXMubGVuZ3RoICUgMiAhPT0gMCA/IG51bXNbbWlkXSA6IChudW1zW21pZCAtIDFdISArIG51bXNbbWlkXSEpIC8gMlxufVxuXG5jb25zdCB1bmlxdWU6IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChjb2x1bW5JZCwgbGVhZlJvd3MpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChsZWFmUm93cy5tYXAoZCA9PiBkLmdldFZhbHVlKGNvbHVtbklkKSkpLnZhbHVlcygpKVxufVxuXG5jb25zdCB1bmlxdWVDb3VudDogQWdncmVnYXRpb25Gbjxhbnk+ID0gKGNvbHVtbklkLCBsZWFmUm93cykgPT4ge1xuICByZXR1cm4gbmV3IFNldChsZWFmUm93cy5tYXAoZCA9PiBkLmdldFZhbHVlKGNvbHVtbklkKSkpLnNpemVcbn1cblxuY29uc3QgY291bnQ6IEFnZ3JlZ2F0aW9uRm48YW55PiA9IChfY29sdW1uSWQsIGxlYWZSb3dzKSA9PiB7XG4gIHJldHVybiBsZWFmUm93cy5sZW5ndGhcbn1cblxuZXhwb3J0IGNvbnN0IGFnZ3JlZ2F0aW9uRm5zID0ge1xuICBzdW0sXG4gIG1pbixcbiAgbWF4LFxuICBleHRlbnQsXG4gIG1lYW4sXG4gIG1lZGlhbixcbiAgdW5pcXVlLFxuICB1bmlxdWVDb3VudCxcbiAgY291bnQsXG59XG5cbmV4cG9ydCB0eXBlIEJ1aWx0SW5BZ2dyZWdhdGlvbkZuID0ga2V5b2YgdHlwZW9mIGFnZ3JlZ2F0aW9uRm5zXG4iLCJpbXBvcnQgeyBSb3dNb2RlbCB9IGZyb20gJy4uJ1xuaW1wb3J0IHsgQnVpbHRJbkFnZ3JlZ2F0aW9uRm4sIGFnZ3JlZ2F0aW9uRm5zIH0gZnJvbSAnLi4vYWdncmVnYXRpb25GbnMnXG5pbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHtcbiAgQ2VsbCxcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgUm93LFxuICBVcGRhdGVyLFxuICBDb2x1bW5EZWZUZW1wbGF0ZSxcbiAgUm93RGF0YSxcbiAgQWdncmVnYXRpb25GbnMsXG59IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBHcm91cGluZ1N0YXRlID0gc3RyaW5nW11cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ1RhYmxlU3RhdGUge1xuICBncm91cGluZzogR3JvdXBpbmdTdGF0ZVxufVxuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvbkZuPFREYXRhIGV4dGVuZHMgUm93RGF0YT4gPSAoXG4gIGNvbHVtbklkOiBzdHJpbmcsXG4gIGxlYWZSb3dzOiBSb3c8VERhdGE+W10sXG4gIGNoaWxkUm93czogUm93PFREYXRhPltdXG4pID0+IGFueVxuXG5leHBvcnQgdHlwZSBDdXN0b21BZ2dyZWdhdGlvbkZucyA9IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0aW9uRm48YW55Pj5cblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25Gbk9wdGlvbjxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID1cbiAgfCAnYXV0bydcbiAgfCBrZXlvZiBBZ2dyZWdhdGlvbkZuc1xuICB8IEJ1aWx0SW5BZ2dyZWdhdGlvbkZuXG4gIHwgQWdncmVnYXRpb25GbjxURGF0YT5cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ0NvbHVtbkRlZjxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4ge1xuICAvKipcbiAgICogVGhlIGNlbGwgdG8gZGlzcGxheSBlYWNoIHJvdyBmb3IgdGhlIGNvbHVtbiBpZiB0aGUgY2VsbCBpcyBhbiBhZ2dyZWdhdGUuIElmIGEgZnVuY3Rpb24gaXMgcGFzc2VkLCBpdCB3aWxsIGJlIHBhc3NlZCBhIHByb3BzIG9iamVjdCB3aXRoIHRoZSBjb250ZXh0IG9mIHRoZSBjZWxsIGFuZCBzaG91bGQgcmV0dXJuIHRoZSBwcm9wZXJ0eSB0eXBlIGZvciB5b3VyIGFkYXB0ZXIgKHRoZSBleGFjdCB0eXBlIGRlcGVuZHMgb24gdGhlIGFkYXB0ZXIgYmVpbmcgdXNlZCkuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjYWdncmVnYXRlZGNlbGwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGFnZ3JlZ2F0ZWRDZWxsPzogQ29sdW1uRGVmVGVtcGxhdGU8XG4gICAgUmV0dXJuVHlwZTxDZWxsPFREYXRhLCBUVmFsdWU+WydnZXRDb250ZXh0J10+XG4gID5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNhZ2dyZWdhdGlvbmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBhZ2dyZWdhdGlvbkZuPzogQWdncmVnYXRpb25Gbk9wdGlvbjxURGF0YT5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgZ3JvdXBpbmcgZm9yIHRoaXMgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2VuYWJsZWdyb3VwaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBlbmFibGVHcm91cGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSB2YWx1ZSB0byBiZSB1c2VkIGZvciBncm91cGluZyByb3dzIG9uIHRoaXMgY29sdW1uLiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZGVyaXZlZCBmcm9tIGBhY2Nlc3NvcktleWAgLyBgYWNjZXNzb3JGbmAgd2lsbCBiZSB1c2VkIGluc3RlYWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0Z3JvdXBpbmd2YWx1ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0R3JvdXBpbmdWYWx1ZT86IChyb3c6IFREYXRhKSA9PiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ0NvbHVtbjxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGFnZ3JlZ2F0aW9uZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldEFnZ3JlZ2F0aW9uRm46ICgpID0+IEFnZ3JlZ2F0aW9uRm48VERhdGE+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGF1dG9hZ2dyZWdhdGlvbmZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRBdXRvQWdncmVnYXRpb25GbjogKCkgPT4gQWdncmVnYXRpb25GbjxURGF0YT4gfCB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgZ3JvdXBlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRjYW5ncm91cClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0Q2FuR3JvdXA6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gaW4gdGhlIGdyb3VwaW5nIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGdyb3VwZWRpbmRleClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0R3JvdXBlZEluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBpcyBjdXJyZW50bHkgZ3JvdXBlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRpc2dyb3VwZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldElzR3JvdXBlZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdG9nZ2xlcyB0aGUgZ3JvdXBpbmcgc3RhdGUgb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHBhc3NpbmcgdG8gdGhlIGBvbkNsaWNrYCBwcm9wIG9mIGEgYnV0dG9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldHRvZ2dsZWdyb3VwaW5naGFuZGxlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0VG9nZ2xlR3JvdXBpbmdIYW5kbGVyOiAoKSA9PiAoKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBncm91cGluZyBzdGF0ZSBvZiB0aGUgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI3RvZ2dsZWdyb3VwaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICB0b2dnbGVHcm91cGluZzogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwaW5nUm93IHtcbiAgX2dyb3VwaW5nVmFsdWVzQ2FjaGU6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGZvciBhbnkgcm93IGFuZCBjb2x1bW4gKGluY2x1ZGluZyBsZWFmIHJvd3MpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldGdyb3VwaW5ndmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldEdyb3VwaW5nVmFsdWU6IChjb2x1bW5JZDogc3RyaW5nKSA9PiB1bmtub3duXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSByb3cgaXMgY3VycmVudGx5IGdyb3VwZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0aXNncm91cGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc0dyb3VwZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHRoaXMgcm93IGlzIGdyb3VwZWQsIHRoaXMgaXMgdGhlIGlkIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGlzIHJvdyBpcyBncm91cGVkIGJ5LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dyb3VwaW5nY29sdW1uaWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdyb3VwaW5nQ29sdW1uSWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHRoaXMgcm93IGlzIGdyb3VwZWQsIHRoaXMgaXMgdGhlIHVuaXF1ZS9zaGFyZWQgdmFsdWUgZm9yIHRoZSBgZ3JvdXBpbmdDb2x1bW5JZGAgZm9yIGFsbCBvZiB0aGUgcm93cyBpbiB0aGlzIGdyb3VwLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dyb3VwaW5ndmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdyb3VwaW5nVmFsdWU/OiB1bmtub3duXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBpbmdDZWxsIHtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNlbGwgaXMgY3VycmVudGx5IGFnZ3JlZ2F0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0aXNhZ2dyZWdhdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc0FnZ3JlZ2F0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNlbGwgaXMgY3VycmVudGx5IGdyb3VwZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0aXNncm91cGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc0dyb3VwZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNlbGwgaXMgY3VycmVudGx5IGEgcGxhY2Vob2xkZXIgY2VsbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRpc3BsYWNlaG9sZGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRJc1BsYWNlaG9sZGVyOiAoKSA9PiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRGVmYXVsdE9wdGlvbnMge1xuICBlbmFibGVHcm91cGluZzogYm9vbGVhblxuICBvbkdyb3VwaW5nQ2hhbmdlOiBPbkNoYW5nZUZuPEdyb3VwaW5nU3RhdGU+XG59XG5cbmludGVyZmFjZSBHcm91cGluZ09wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgZ3JvdXBpbmcgZm9yIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNlbmFibGVncm91cGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZW5hYmxlR3JvdXBpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgYWZ0ZXIgZ3JvdXBpbmcgaGFzIHRha2VuIHBsYWNlLCBidXQgbm8gZnVydGhlci5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNnZXRncm91cGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIGdldEdyb3VwZWRSb3dNb2RlbD86ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogR3JvdXBpbmcgY29sdW1ucyBhcmUgYXV0b21hdGljYWxseSByZW9yZGVyZWQgYnkgZGVmYXVsdCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbHVtbnMgbGlzdC4gSWYgeW91IHdvdWxkIHJhdGhlciByZW1vdmUgdGhlbSBvciBsZWF2ZSB0aGVtIGFzLWlzLCBzZXQgdGhlIGFwcHJvcHJpYXRlIG1vZGUgaGVyZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNncm91cGVkY29sdW1ubW9kZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ3JvdXBlZENvbHVtbk1vZGU/OiBmYWxzZSB8ICdyZW9yZGVyJyB8ICdyZW1vdmUnXG4gIC8qKlxuICAgKiBFbmFibGVzIG1hbnVhbCBncm91cGluZy4gSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHRhYmxlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgZ3JvdXAgcm93cyB1c2luZyBgZ2V0R3JvdXBlZFJvd01vZGVsKClgIGFuZCBpbnN0ZWFkIHdpbGwgZXhwZWN0IHlvdSB0byBtYW51YWxseSBncm91cCB0aGUgcm93cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSB0YWJsZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkb2luZyBzZXJ2ZXItc2lkZSBncm91cGluZyBhbmQgYWdncmVnYXRpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjbWFudWFsZ3JvdXBpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIG1hbnVhbEdyb3VwaW5nPzogYm9vbGVhblxuICAvKipcbiAgICogSWYgdGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZ3JvdXBpbmcgc3RhdGUgY2hhbmdlcyBhbmQgeW91IHdpbGwgYmUgZXhwZWN0ZWQgdG8gbWFuYWdlIHRoZSBzdGF0ZSB5b3Vyc2VsZi4gWW91IGNhbiBwYXNzIHRoZSBtYW5hZ2VkIHN0YXRlIGJhY2sgdG8gdGhlIHRhYmxlIHZpYSB0aGUgYHRhYmxlT3B0aW9ucy5zdGF0ZS5ncm91cGluZ2Agb3B0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI29uZ3JvdXBpbmdjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIG9uR3JvdXBpbmdDaGFuZ2U/OiBPbkNoYW5nZUZuPEdyb3VwaW5nU3RhdGU+XG59XG5cbnR5cGUgUmVzb2x2ZWRBZ2dyZWdhdGlvbkZucyA9IGtleW9mIEFnZ3JlZ2F0aW9uRm5zIGV4dGVuZHMgbmV2ZXJcbiAgPyB7XG4gICAgICBhZ2dyZWdhdGlvbkZucz86IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0aW9uRm48YW55Pj5cbiAgICB9XG4gIDoge1xuICAgICAgYWdncmVnYXRpb25GbnM6IFJlY29yZDxrZXlvZiBBZ2dyZWdhdGlvbkZucywgQWdncmVnYXRpb25Gbjxhbnk+PlxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGluZ09wdGlvbnNcbiAgZXh0ZW5kcyBHcm91cGluZ09wdGlvbnNCYXNlLFxuICAgIFJlc29sdmVkQWdncmVnYXRpb25GbnMge31cblxuZXhwb3J0IHR5cGUgR3JvdXBpbmdDb2x1bW5Nb2RlID0gZmFsc2UgfCAncmVvcmRlcicgfCAncmVtb3ZlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwaW5nSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIF9nZXRHcm91cGVkUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGFmdGVyIGdyb3VwaW5nIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjZ2V0Z3JvdXBlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICBnZXRHcm91cGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYmVmb3JlIGFueSBncm91cGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2dyb3VwaW5nI2dldHByZWdyb3VwZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2dyb3VwaW5nKVxuICAgKi9cbiAgZ2V0UHJlR3JvdXBlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipncm91cGluZyoqIHN0YXRlIHRvIGBpbml0aWFsU3RhdGUuZ3JvdXBpbmdgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9ncm91cGluZyNyZXNldGdyb3VwaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvZ3JvdXBpbmcpXG4gICAqL1xuICByZXNldEdyb3VwaW5nOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZ3JvdXBpbmcgc3RhdGUgb2YgdGhlIHRhYmxlIHZpYSBhbiB1cGRhdGUgZnVuY3Rpb24gb3IgdmFsdWUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvZ3JvdXBpbmcjc2V0Z3JvdXBpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9ncm91cGluZylcbiAgICovXG4gIHNldEdyb3VwaW5nOiAodXBkYXRlcjogVXBkYXRlcjxHcm91cGluZ1N0YXRlPikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgR3JvdXBpbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogR3JvdXBpbmdDb2x1bW5EZWY8XG4gICAgVERhdGEsXG4gICAgdW5rbm93blxuICA+ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWdncmVnYXRlZENlbGw6IHByb3BzID0+IChwcm9wcy5nZXRWYWx1ZSgpIGFzIGFueSk/LnRvU3RyaW5nPy4oKSA/PyBudWxsLFxuICAgICAgYWdncmVnYXRpb25GbjogJ2F1dG8nLFxuICAgIH1cbiAgfSxcblxuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IEdyb3VwaW5nVGFibGVTdGF0ZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwaW5nOiBbXSxcbiAgICAgIC4uLnN0YXRlLFxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0T3B0aW9uczogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiBHcm91cGluZ09wdGlvbnMgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvbkdyb3VwaW5nQ2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdncm91cGluZycsIHRhYmxlKSxcbiAgICAgIGdyb3VwZWRDb2x1bW5Nb2RlOiAncmVvcmRlcicsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZUNvbHVtbjogPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPihcbiAgICBjb2x1bW46IENvbHVtbjxURGF0YSwgVFZhbHVlPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbHVtbi50b2dnbGVHcm91cGluZyA9ICgpID0+IHtcbiAgICAgIHRhYmxlLnNldEdyb3VwaW5nKG9sZCA9PiB7XG4gICAgICAgIC8vIEZpbmQgYW55IGV4aXN0aW5nIGdyb3VwaW5nIGZvciB0aGlzIGNvbHVtblxuICAgICAgICBpZiAob2xkPy5pbmNsdWRlcyhjb2x1bW4uaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG9sZC5maWx0ZXIoZCA9PiBkICE9PSBjb2x1bW4uaWQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gWy4uLihvbGQgPz8gW10pLCBjb2x1bW4uaWRdXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRDYW5Hcm91cCA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbHVtbi5jb2x1bW5EZWYuZW5hYmxlR3JvdXBpbmcgPz9cbiAgICAgICAgdHJ1ZSA/P1xuICAgICAgICB0YWJsZS5vcHRpb25zLmVuYWJsZUdyb3VwaW5nID8/XG4gICAgICAgIHRydWUgPz9cbiAgICAgICAgISFjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRJc0dyb3VwZWQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdGFibGUuZ2V0U3RhdGUoKS5ncm91cGluZz8uaW5jbHVkZXMoY29sdW1uLmlkKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRHcm91cGVkSW5kZXggPSAoKSA9PiB0YWJsZS5nZXRTdGF0ZSgpLmdyb3VwaW5nPy5pbmRleE9mKGNvbHVtbi5pZClcblxuICAgIGNvbHVtbi5nZXRUb2dnbGVHcm91cGluZ0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5Hcm91cCA9IGNvbHVtbi5nZXRDYW5Hcm91cCgpXG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICghY2FuR3JvdXApIHJldHVyblxuICAgICAgICBjb2x1bW4udG9nZ2xlR3JvdXBpbmcoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb2x1bW4uZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvdyA9IHRhYmxlLmdldENvcmVSb3dNb2RlbCgpLmZsYXRSb3dzWzBdXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZmlyc3RSb3c/LmdldFZhbHVlKGNvbHVtbi5pZClcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0aW9uRm5zLnN1bVxuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkZucy5leHRlbnRcbiAgICAgIH1cbiAgICB9XG4gICAgY29sdW1uLmdldEFnZ3JlZ2F0aW9uRm4gPSAoKSA9PiB7XG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihjb2x1bW4uY29sdW1uRGVmLmFnZ3JlZ2F0aW9uRm4pXG4gICAgICAgID8gY29sdW1uLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuXG4gICAgICAgIDogY29sdW1uLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuID09PSAnYXV0bydcbiAgICAgICAgPyBjb2x1bW4uZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4oKVxuICAgICAgICA6IHRhYmxlLm9wdGlvbnMuYWdncmVnYXRpb25GbnM/LltcbiAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5EZWYuYWdncmVnYXRpb25GbiBhcyBzdHJpbmdcbiAgICAgICAgICBdID8/XG4gICAgICAgICAgYWdncmVnYXRpb25GbnNbY29sdW1uLmNvbHVtbkRlZi5hZ2dyZWdhdGlvbkZuIGFzIEJ1aWx0SW5BZ2dyZWdhdGlvbkZuXVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIHRhYmxlLnNldEdyb3VwaW5nID0gdXBkYXRlciA9PiB0YWJsZS5vcHRpb25zLm9uR3JvdXBpbmdDaGFuZ2U/Lih1cGRhdGVyKVxuXG4gICAgdGFibGUucmVzZXRHcm91cGluZyA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRHcm91cGluZyhkZWZhdWx0U3RhdGUgPyBbXSA6IHRhYmxlLmluaXRpYWxTdGF0ZT8uZ3JvdXBpbmcgPz8gW10pXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UHJlR3JvdXBlZFJvd01vZGVsID0gKCkgPT4gdGFibGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0R3JvdXBlZFJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKCF0YWJsZS5fZ2V0R3JvdXBlZFJvd01vZGVsICYmIHRhYmxlLm9wdGlvbnMuZ2V0R3JvdXBlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRHcm91cGVkUm93TW9kZWwgPSB0YWJsZS5vcHRpb25zLmdldEdyb3VwZWRSb3dNb2RlbCh0YWJsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRhYmxlLm9wdGlvbnMubWFudWFsR3JvdXBpbmcgfHwgIXRhYmxlLl9nZXRHcm91cGVkUm93TW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLmdldFByZUdyb3VwZWRSb3dNb2RlbCgpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5fZ2V0R3JvdXBlZFJvd01vZGVsKClcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cuZ2V0SXNHcm91cGVkID0gKCkgPT4gISFyb3cuZ3JvdXBpbmdDb2x1bW5JZFxuICAgIHJvdy5nZXRHcm91cGluZ1ZhbHVlID0gY29sdW1uSWQgPT4ge1xuICAgICAgaWYgKHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5JZCkpIHtcbiAgICAgICAgcmV0dXJuIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKVxuXG4gICAgICBpZiAoIWNvbHVtbj8uY29sdW1uRGVmLmdldEdyb3VwaW5nVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJvdy5nZXRWYWx1ZShjb2x1bW5JZClcbiAgICAgIH1cblxuICAgICAgcm93Ll9ncm91cGluZ1ZhbHVlc0NhY2hlW2NvbHVtbklkXSA9IGNvbHVtbi5jb2x1bW5EZWYuZ2V0R3JvdXBpbmdWYWx1ZShcbiAgICAgICAgcm93Lm9yaWdpbmFsXG4gICAgICApXG5cbiAgICAgIHJldHVybiByb3cuX2dyb3VwaW5nVmFsdWVzQ2FjaGVbY29sdW1uSWRdXG4gICAgfVxuICAgIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZSA9IHt9XG4gIH0sXG5cbiAgY3JlYXRlQ2VsbDogPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPihcbiAgICBjZWxsOiBDZWxsPFREYXRhLCBUVmFsdWU+LFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICAgIHJvdzogUm93PFREYXRhPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGdldFJlbmRlclZhbHVlID0gKCkgPT5cbiAgICAgIGNlbGwuZ2V0VmFsdWUoKSA/PyB0YWJsZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWVcblxuICAgIGNlbGwuZ2V0SXNHcm91cGVkID0gKCkgPT5cbiAgICAgIGNvbHVtbi5nZXRJc0dyb3VwZWQoKSAmJiBjb2x1bW4uaWQgPT09IHJvdy5ncm91cGluZ0NvbHVtbklkXG4gICAgY2VsbC5nZXRJc1BsYWNlaG9sZGVyID0gKCkgPT4gIWNlbGwuZ2V0SXNHcm91cGVkKCkgJiYgY29sdW1uLmdldElzR3JvdXBlZCgpXG4gICAgY2VsbC5nZXRJc0FnZ3JlZ2F0ZWQgPSAoKSA9PlxuICAgICAgIWNlbGwuZ2V0SXNHcm91cGVkKCkgJiYgIWNlbGwuZ2V0SXNQbGFjZWhvbGRlcigpICYmICEhcm93LnN1YlJvd3M/Lmxlbmd0aFxuICB9LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JkZXJDb2x1bW5zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIGxlYWZDb2x1bW5zOiBDb2x1bW48VERhdGEsIHVua25vd24+W10sXG4gIGdyb3VwaW5nOiBzdHJpbmdbXSxcbiAgZ3JvdXBlZENvbHVtbk1vZGU/OiBHcm91cGluZ0NvbHVtbk1vZGVcbikge1xuICBpZiAoIWdyb3VwaW5nPy5sZW5ndGggfHwgIWdyb3VwZWRDb2x1bW5Nb2RlKSB7XG4gICAgcmV0dXJuIGxlYWZDb2x1bW5zXG4gIH1cblxuICBjb25zdCBub25Hcm91cGluZ0NvbHVtbnMgPSBsZWFmQ29sdW1ucy5maWx0ZXIoXG4gICAgY29sID0+ICFncm91cGluZy5pbmNsdWRlcyhjb2wuaWQpXG4gIClcblxuICBpZiAoZ3JvdXBlZENvbHVtbk1vZGUgPT09ICdyZW1vdmUnKSB7XG4gICAgcmV0dXJuIG5vbkdyb3VwaW5nQ29sdW1uc1xuICB9XG5cbiAgY29uc3QgZ3JvdXBpbmdDb2x1bW5zID0gZ3JvdXBpbmdcbiAgICAubWFwKGcgPT4gbGVhZkNvbHVtbnMuZmluZChjb2wgPT4gY29sLmlkID09PSBnKSEpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuXG4gIHJldHVybiBbLi4uZ3JvdXBpbmdDb2x1bW5zLCAuLi5ub25Hcm91cGluZ0NvbHVtbnNdXG59XG4iLCJpbXBvcnQgeyBtYWtlU3RhdGVVcGRhdGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmltcG9ydCB7IFRhYmxlLCBPbkNoYW5nZUZuLCBVcGRhdGVyLCBDb2x1bW4sIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcblxuaW1wb3J0IHsgb3JkZXJDb2x1bW5zIH0gZnJvbSAnLi9Hcm91cGluZydcbmltcG9ydCB7IFRhYmxlRmVhdHVyZSB9IGZyb20gJy4uL2NvcmUvdGFibGUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3JkZXJUYWJsZVN0YXRlIHtcbiAgY29sdW1uT3JkZXI6IENvbHVtbk9yZGVyU3RhdGVcbn1cblxuZXhwb3J0IHR5cGUgQ29sdW1uT3JkZXJTdGF0ZSA9IHN0cmluZ1tdXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3JkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gYHVwZGF0ZXJGbmAgd2hlbiBgc3RhdGUuY29sdW1uT3JkZXJgIGNoYW5nZXMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGludGVybmFsIHN0YXRlIG1hbmFnZW1lbnQsIHNvIHlvdSB3aWxsIG5lZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlIGVpdGhlciBmdWxseSBvciBwYXJ0aWFsbHkgb3V0c2lkZSBvZiB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLW9yZGVyaW5nI29uY29sdW1ub3JkZXJjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tb3JkZXJpbmcpXG4gICAqL1xuICBvbkNvbHVtbk9yZGVyQ2hhbmdlPzogT25DaGFuZ2VGbjxDb2x1bW5PcmRlclN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbk9yZGVyRGVmYXVsdE9wdGlvbnMge1xuICBvbkNvbHVtbk9yZGVyQ2hhbmdlOiBPbkNoYW5nZUZuPENvbHVtbk9yZGVyU3RhdGU+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3JkZXJJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2dldE9yZGVyQ29sdW1uc0ZuOiAoKSA9PiAoXG4gICAgY29sdW1uczogQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gICkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlICoqY29sdW1uT3JkZXIqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLmNvbHVtbk9yZGVyYCwgb3IgYHRydWVgIGNhbiBiZSBwYXNzZWQgdG8gZm9yY2UgYSBkZWZhdWx0IGJsYW5rIHN0YXRlIHJlc2V0IHRvIGBbXWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLW9yZGVyaW5nI3Jlc2V0Y29sdW1ub3JkZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tb3JkZXJpbmcpXG4gICAqL1xuICByZXNldENvbHVtbk9yZGVyOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUuY29sdW1uT3JkZXJgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi1vcmRlcmluZyNzZXRjb2x1bW5vcmRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi1vcmRlcmluZylcbiAgICovXG4gIHNldENvbHVtbk9yZGVyOiAodXBkYXRlcjogVXBkYXRlcjxDb2x1bW5PcmRlclN0YXRlPikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgT3JkZXJpbmc6IFRhYmxlRmVhdHVyZSA9IHtcbiAgZ2V0SW5pdGlhbFN0YXRlOiAoc3RhdGUpOiBDb2x1bW5PcmRlclRhYmxlU3RhdGUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBjb2x1bW5PcmRlcjogW10sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogQ29sdW1uT3JkZXJEZWZhdWx0T3B0aW9ucyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uT3JkZXJDaGFuZ2U6IG1ha2VTdGF0ZVVwZGF0ZXIoJ2NvbHVtbk9yZGVyJywgdGFibGUpLFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIHRhYmxlLnNldENvbHVtbk9yZGVyID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vbkNvbHVtbk9yZGVyQ2hhbmdlPy4odXBkYXRlcilcbiAgICB0YWJsZS5yZXNldENvbHVtbk9yZGVyID0gZGVmYXVsdFN0YXRlID0+IHtcbiAgICAgIHRhYmxlLnNldENvbHVtbk9yZGVyKFxuICAgICAgICBkZWZhdWx0U3RhdGUgPyBbXSA6IHRhYmxlLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlciA/PyBbXVxuICAgICAgKVxuICAgIH1cbiAgICB0YWJsZS5fZ2V0T3JkZXJDb2x1bW5zRm4gPSBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtbk9yZGVyLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmdyb3VwaW5nLFxuICAgICAgICB0YWJsZS5vcHRpb25zLmdyb3VwZWRDb2x1bW5Nb2RlLFxuICAgICAgXSxcbiAgICAgIChjb2x1bW5PcmRlciwgZ3JvdXBpbmcsIGdyb3VwZWRDb2x1bW5Nb2RlKSA9PiBjb2x1bW5zID0+IHtcbiAgICAgICAgLy8gU29ydCBncm91cGVkIGNvbHVtbnMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb2x1bW4gbGlzdFxuICAgICAgICAvLyBiZWZvcmUgdGhlIGhlYWRlcnMgYXJlIGJ1aWx0XG4gICAgICAgIGxldCBvcmRlcmVkQ29sdW1uczogQ29sdW1uPFREYXRhLCB1bmtub3duPltdID0gW11cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBvcmRlciwgcmV0dXJuIHRoZSBub3JtYWwgY29sdW1uc1xuICAgICAgICBpZiAoIWNvbHVtbk9yZGVyPy5sZW5ndGgpIHtcbiAgICAgICAgICBvcmRlcmVkQ29sdW1ucyA9IGNvbHVtbnNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5PcmRlckNvcHkgPSBbLi4uY29sdW1uT3JkZXJdXG5cbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBvcmRlciwgbWFrZSBhIGNvcHkgb2YgdGhlIGNvbHVtbnNcbiAgICAgICAgICBjb25zdCBjb2x1bW5zQ29weSA9IFsuLi5jb2x1bW5zXVxuXG4gICAgICAgICAgLy8gQW5kIG1ha2UgYSBuZXcgb3JkZXJlZCBhcnJheSBvZiB0aGUgY29sdW1uc1xuXG4gICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBjb2x1bW5zIGFuZCBwbGFjZSB0aGVtIGluIG9yZGVyIGludG8gdGhlIG5ldyBhcnJheVxuICAgICAgICAgIHdoaWxlIChjb2x1bW5zQ29weS5sZW5ndGggJiYgY29sdW1uT3JkZXJDb3B5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uSWQgPSBjb2x1bW5PcmRlckNvcHkuc2hpZnQoKVxuICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGNvbHVtbnNDb3B5LmZpbmRJbmRleChcbiAgICAgICAgICAgICAgZCA9PiBkLmlkID09PSB0YXJnZXRDb2x1bW5JZFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICBvcmRlcmVkQ29sdW1ucy5wdXNoKGNvbHVtbnNDb3B5LnNwbGljZShmb3VuZEluZGV4LCAxKVswXSEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBjb2x1bW5zIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBlbmRcbiAgICAgICAgICBvcmRlcmVkQ29sdW1ucyA9IFsuLi5vcmRlcmVkQ29sdW1ucywgLi4uY29sdW1uc0NvcHldXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JkZXJDb2x1bW5zKG9yZGVyZWRDb2x1bW5zLCBncm91cGluZywgZ3JvdXBlZENvbHVtbk1vZGUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRPcmRlckNvbHVtbnNGbicsXG4gICAgICAgIC8vIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgIH1cbiAgICApXG4gIH0sXG59XG4iLCJpbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHsgT25DaGFuZ2VGbiwgVGFibGUsIFJvd01vZGVsLCBVcGRhdGVyLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBmdW5jdGlvbmFsVXBkYXRlLCBtYWtlU3RhdGVVcGRhdGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblN0YXRlIHtcbiAgcGFnZUluZGV4OiBudW1iZXJcbiAgcGFnZVNpemU6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25UYWJsZVN0YXRlIHtcbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvblN0YXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbkluaXRpYWxUYWJsZVN0YXRlIHtcbiAgcGFnaW5hdGlvbj86IFBhcnRpYWw8UGFnaW5hdGlvblN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCB0byBgdHJ1ZWAsIHBhZ2luYXRpb24gd2lsbCBiZSByZXNldCB0byB0aGUgZmlyc3QgcGFnZSB3aGVuIHBhZ2UtYWx0ZXJpbmcgc3RhdGUgY2hhbmdlcyBlZy4gYGRhdGFgIGlzIHVwZGF0ZWQsIGZpbHRlcnMgY2hhbmdlLCBncm91cGluZyBjaGFuZ2VzLCBldGMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNhdXRvcmVzZXRwYWdlaW5kZXgpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgYXV0b1Jlc2V0UGFnZUluZGV4PzogYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGFmdGVyIHBhZ2luYXRpb24gaGFzIHRha2VuIHBsYWNlLCBidXQgbm8gZnVydGhlci5cbiAgICpcbiAgICogUGFnaW5hdGlvbiBjb2x1bW5zIGFyZSBhdXRvbWF0aWNhbGx5IHJlb3JkZXJlZCBieSBkZWZhdWx0IHRvIHRoZSBzdGFydCBvZiB0aGUgY29sdW1ucyBsaXN0LiBJZiB5b3Ugd291bGQgcmF0aGVyIHJlbW92ZSB0aGVtIG9yIGxlYXZlIHRoZW0gYXMtaXMsIHNldCB0aGUgYXBwcm9wcmlhdGUgbW9kZSBoZXJlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jZ2V0cGFnaW5hdGlvbnJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIGdldFBhZ2luYXRpb25Sb3dNb2RlbD86ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogRW5hYmxlcyBtYW51YWwgcGFnaW5hdGlvbi4gSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHRhYmxlIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgcGFnaW5hdGUgcm93cyB1c2luZyBgZ2V0UGFnaW5hdGlvblJvd01vZGVsKClgIGFuZCBpbnN0ZWFkIHdpbGwgZXhwZWN0IHlvdSB0byBtYW51YWxseSBwYWdpbmF0ZSB0aGUgcm93cyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSB0YWJsZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkb2luZyBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIGFuZCBhZ2dyZWdhdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI21hbnVhbHBhZ2luYXRpb24pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgbWFudWFsUGFnaW5hdGlvbj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHBhZ2luYXRpb24gc3RhdGUgY2hhbmdlcyBhbmQgeW91IHdpbGwgYmUgZXhwZWN0ZWQgdG8gbWFuYWdlIHRoZSBzdGF0ZSB5b3Vyc2VsZi4gWW91IGNhbiBwYXNzIHRoZSBtYW5hZ2VkIHN0YXRlIGJhY2sgdG8gdGhlIHRhYmxlIHZpYSB0aGUgYHRhYmxlT3B0aW9ucy5zdGF0ZS5wYWdpbmF0aW9uYCBvcHRpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNvbnBhZ2luYXRpb25jaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgb25QYWdpbmF0aW9uQ2hhbmdlPzogT25DaGFuZ2VGbjxQYWdpbmF0aW9uU3RhdGU+XG4gIC8qKlxuICAgKiBXaGVuIG1hbnVhbGx5IGNvbnRyb2xsaW5nIHBhZ2luYXRpb24sIHlvdSBzaG91bGQgc3VwcGx5IGEgdG90YWwgYHBhZ2VDb3VudGAgdmFsdWUgdG8gdGhlIHRhYmxlIGlmIHlvdSBrbm93IGl0LiBJZiB5b3UgZG8gbm90IGtub3cgaG93IG1hbnkgcGFnZXMgdGhlcmUgYXJlLCB5b3UgY2FuIHNldCB0aGlzIHRvIGAtMWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNwYWdlY291bnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgcGFnZUNvdW50PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbkRlZmF1bHRPcHRpb25zIHtcbiAgb25QYWdpbmF0aW9uQ2hhbmdlOiBPbkNoYW5nZUZuPFBhZ2luYXRpb25TdGF0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIF9hdXRvUmVzZXRQYWdlSW5kZXg6ICgpID0+IHZvaWRcbiAgX2dldFBhZ2luYXRpb25Sb3dNb2RlbD86ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB0YWJsZSBjYW4gZ28gdG8gdGhlIG5leHQgcGFnZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI2dldGNhbm5leHRwYWdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIGdldENhbk5leHRQYWdlOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRhYmxlIGNhbiBnbyB0byB0aGUgcHJldmlvdXMgcGFnZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI2dldGNhbnByZXZpb3VzcGFnZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBnZXRDYW5QcmV2aW91c1BhZ2U6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhZ2UgY291bnQuIElmIG1hbnVhbGx5IHBhZ2luYXRpbmcgb3IgY29udHJvbGxpbmcgdGhlIHBhZ2luYXRpb24gc3RhdGUsIHRoaXMgd2lsbCBjb21lIGRpcmVjdGx5IGZyb20gdGhlIGBvcHRpb25zLnBhZ2VDb3VudGAgdGFibGUgb3B0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGZyb20gdGhlIHRhYmxlIGRhdGEgdXNpbmcgdGhlIHRvdGFsIHJvdyBjb3VudCBhbmQgY3VycmVudCBwYWdlIHNpemUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNnZXRwYWdlY291bnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0UGFnZUNvdW50OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGFnZSBvcHRpb25zICh6ZXJvLWluZGV4LWJhc2VkKSBmb3IgdGhlIGN1cnJlbnQgcGFnZSBzaXplLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jZ2V0cGFnZW9wdGlvbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0UGFnZU9wdGlvbnM6ICgpID0+IG51bWJlcltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgZm9yIHRoZSB0YWJsZSBhZnRlciBwYWdpbmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNnZXRwYWdpbmF0aW9ucm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgZ2V0UGFnaW5hdGlvblJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGJlZm9yZSBhbnkgcGFnaW5hdGlvbiBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jZ2V0cHJlcGFnaW5hdGlvbnJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIGdldFByZVBhZ2luYXRpb25Sb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBJbmNyZW1lbnRzIHRoZSBwYWdlIGluZGV4IGJ5IG9uZSwgaWYgcG9zc2libGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGFnaW5hdGlvbiNuZXh0cGFnZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBuZXh0UGFnZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogRGVjcmVtZW50cyB0aGUgcGFnZSBpbmRleCBieSBvbmUsIGlmIHBvc3NpYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jcHJldmlvdXNwYWdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIHByZXZpb3VzUGFnZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWdlIGluZGV4IHRvIGl0cyBpbml0aWFsIHN0YXRlLiBJZiBgZGVmYXVsdFN0YXRlYCBpcyBgdHJ1ZWAsIHRoZSBwYWdlIGluZGV4IHdpbGwgYmUgcmVzZXQgdG8gYDBgIHJlZ2FyZGxlc3Mgb2YgaW5pdGlhbCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI3Jlc2V0cGFnZWluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIHJlc2V0UGFnZUluZGV4OiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWdlIHNpemUgdG8gaXRzIGluaXRpYWwgc3RhdGUuIElmIGBkZWZhdWx0U3RhdGVgIGlzIGB0cnVlYCwgdGhlIHBhZ2Ugc2l6ZSB3aWxsIGJlIHJlc2V0IHRvIGAxMGAgcmVnYXJkbGVzcyBvZiBpbml0aWFsIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jcmVzZXRwYWdlc2l6ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICByZXNldFBhZ2VTaXplOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKnBhZ2luYXRpb24qKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLnBhZ2luYXRpb25gLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI3Jlc2V0cGFnaW5hdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICByZXNldFBhZ2luYXRpb246IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwYWdlIGNvdW50IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvciB2YWx1ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9wYWdpbmF0aW9uI3NldHBhZ2Vjb3VudClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBzZXRQYWdlQ291bnQ6ICh1cGRhdGVyOiBVcGRhdGVyPG51bWJlcj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBhZ2UgaW5kZXggdXNpbmcgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9yIHZhbHVlIGluIHRoZSBgc3RhdGUucGFnaW5hdGlvbi5wYWdlSW5kZXhgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jc2V0cGFnZWluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGFnaW5hdGlvbilcbiAgICovXG4gIHNldFBhZ2VJbmRleDogKHVwZGF0ZXI6IFVwZGF0ZXI8bnVtYmVyPikgPT4gdm9pZFxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFnZSBzaXplIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvciB2YWx1ZSBpbiB0aGUgYHN0YXRlLnBhZ2luYXRpb24ucGFnZVNpemVgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jc2V0cGFnZXNpemUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9wYWdpbmF0aW9uKVxuICAgKi9cbiAgc2V0UGFnZVNpemU6ICh1cGRhdGVyOiBVcGRhdGVyPG51bWJlcj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgYHN0YXRlLnBhZ2luYXRpb25gIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3BhZ2luYXRpb24jc2V0cGFnaW5hdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3BhZ2luYXRpb24pXG4gICAqL1xuICBzZXRQYWdpbmF0aW9uOiAodXBkYXRlcjogVXBkYXRlcjxQYWdpbmF0aW9uU3RhdGU+KSA9PiB2b2lkXG59XG5cbi8vXG5cbmNvbnN0IGRlZmF1bHRQYWdlSW5kZXggPSAwXG5jb25zdCBkZWZhdWx0UGFnZVNpemUgPSAxMFxuXG5jb25zdCBnZXREZWZhdWx0UGFnaW5hdGlvblN0YXRlID0gKCk6IFBhZ2luYXRpb25TdGF0ZSA9PiAoe1xuICBwYWdlSW5kZXg6IGRlZmF1bHRQYWdlSW5kZXgsXG4gIHBhZ2VTaXplOiBkZWZhdWx0UGFnZVNpemUsXG59KVxuXG5leHBvcnQgY29uc3QgUGFnaW5hdGlvbjogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IFBhZ2luYXRpb25UYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIC4uLmdldERlZmF1bHRQYWdpbmF0aW9uU3RhdGUoKSxcbiAgICAgICAgLi4uc3RhdGU/LnBhZ2luYXRpb24sXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBnZXREZWZhdWx0T3B0aW9uczogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiBQYWdpbmF0aW9uRGVmYXVsdE9wdGlvbnMgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvblBhZ2luYXRpb25DaGFuZ2U6IG1ha2VTdGF0ZVVwZGF0ZXIoJ3BhZ2luYXRpb24nLCB0YWJsZSksXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgbGV0IHJlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIGxldCBxdWV1ZWQgPSBmYWxzZVxuXG4gICAgdGFibGUuX2F1dG9SZXNldFBhZ2VJbmRleCA9ICgpID0+IHtcbiAgICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgIHJlZ2lzdGVyZWQgPSB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRhYmxlLm9wdGlvbnMuYXV0b1Jlc2V0QWxsID8/XG4gICAgICAgIHRhYmxlLm9wdGlvbnMuYXV0b1Jlc2V0UGFnZUluZGV4ID8/XG4gICAgICAgICF0YWJsZS5vcHRpb25zLm1hbnVhbFBhZ2luYXRpb25cbiAgICAgICkge1xuICAgICAgICBpZiAocXVldWVkKSByZXR1cm5cbiAgICAgICAgcXVldWVkID0gdHJ1ZVxuICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgIHRhYmxlLnJlc2V0UGFnZUluZGV4KClcbiAgICAgICAgICBxdWV1ZWQgPSBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICB0YWJsZS5zZXRQYWdpbmF0aW9uID0gdXBkYXRlciA9PiB7XG4gICAgICBjb25zdCBzYWZlVXBkYXRlcjogVXBkYXRlcjxQYWdpbmF0aW9uU3RhdGU+ID0gb2xkID0+IHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCBvbGQpXG5cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLm9uUGFnaW5hdGlvbkNoYW5nZT8uKHNhZmVVcGRhdGVyKVxuICAgIH1cbiAgICB0YWJsZS5yZXNldFBhZ2luYXRpb24gPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0UGFnaW5hdGlvbihcbiAgICAgICAgZGVmYXVsdFN0YXRlXG4gICAgICAgICAgPyBnZXREZWZhdWx0UGFnaW5hdGlvblN0YXRlKClcbiAgICAgICAgICA6IHRhYmxlLmluaXRpYWxTdGF0ZS5wYWdpbmF0aW9uID8/IGdldERlZmF1bHRQYWdpbmF0aW9uU3RhdGUoKVxuICAgICAgKVxuICAgIH1cbiAgICB0YWJsZS5zZXRQYWdlSW5kZXggPSB1cGRhdGVyID0+IHtcbiAgICAgIHRhYmxlLnNldFBhZ2luYXRpb24ob2xkID0+IHtcbiAgICAgICAgbGV0IHBhZ2VJbmRleCA9IGZ1bmN0aW9uYWxVcGRhdGUodXBkYXRlciwgb2xkLnBhZ2VJbmRleClcblxuICAgICAgICBjb25zdCBtYXhQYWdlSW5kZXggPVxuICAgICAgICAgIHR5cGVvZiB0YWJsZS5vcHRpb25zLnBhZ2VDb3VudCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICB0YWJsZS5vcHRpb25zLnBhZ2VDb3VudCA9PT0gLTFcbiAgICAgICAgICAgID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgIDogdGFibGUub3B0aW9ucy5wYWdlQ291bnQgLSAxXG5cbiAgICAgICAgcGFnZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZUluZGV4LCBtYXhQYWdlSW5kZXgpKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgdGFibGUucmVzZXRQYWdlSW5kZXggPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0UGFnZUluZGV4KFxuICAgICAgICBkZWZhdWx0U3RhdGVcbiAgICAgICAgICA/IGRlZmF1bHRQYWdlSW5kZXhcbiAgICAgICAgICA6IHRhYmxlLmluaXRpYWxTdGF0ZT8ucGFnaW5hdGlvbj8ucGFnZUluZGV4ID8/IGRlZmF1bHRQYWdlSW5kZXhcbiAgICAgIClcbiAgICB9XG4gICAgdGFibGUucmVzZXRQYWdlU2l6ZSA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRQYWdlU2l6ZShcbiAgICAgICAgZGVmYXVsdFN0YXRlXG4gICAgICAgICAgPyBkZWZhdWx0UGFnZVNpemVcbiAgICAgICAgICA6IHRhYmxlLmluaXRpYWxTdGF0ZT8ucGFnaW5hdGlvbj8ucGFnZVNpemUgPz8gZGVmYXVsdFBhZ2VTaXplXG4gICAgICApXG4gICAgfVxuICAgIHRhYmxlLnNldFBhZ2VTaXplID0gdXBkYXRlciA9PiB7XG4gICAgICB0YWJsZS5zZXRQYWdpbmF0aW9uKG9sZCA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gTWF0aC5tYXgoMSwgZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCBvbGQucGFnZVNpemUpKVxuICAgICAgICBjb25zdCB0b3BSb3dJbmRleCA9IG9sZC5wYWdlU2l6ZSAqIG9sZC5wYWdlSW5kZXghXG4gICAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IE1hdGguZmxvb3IodG9wUm93SW5kZXggLyBwYWdlU2l6ZSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLm9sZCxcbiAgICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRhYmxlLnNldFBhZ2VDb3VudCA9IHVwZGF0ZXIgPT5cbiAgICAgIHRhYmxlLnNldFBhZ2luYXRpb24ob2xkID0+IHtcbiAgICAgICAgbGV0IG5ld1BhZ2VDb3VudCA9IGZ1bmN0aW9uYWxVcGRhdGUoXG4gICAgICAgICAgdXBkYXRlcixcbiAgICAgICAgICB0YWJsZS5vcHRpb25zLnBhZ2VDb3VudCA/PyAtMVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdQYWdlQ291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbmV3UGFnZUNvdW50ID0gTWF0aC5tYXgoLTEsIG5ld1BhZ2VDb3VudClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgIHBhZ2VDb3VudDogbmV3UGFnZUNvdW50LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGFibGUuZ2V0UGFnZU9wdGlvbnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldFBhZ2VDb3VudCgpXSxcbiAgICAgIHBhZ2VDb3VudCA9PiB7XG4gICAgICAgIGxldCBwYWdlT3B0aW9uczogbnVtYmVyW10gPSBbXVxuICAgICAgICBpZiAocGFnZUNvdW50ICYmIHBhZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICBwYWdlT3B0aW9ucyA9IFsuLi5uZXcgQXJyYXkocGFnZUNvdW50KV0uZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IGkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VPcHRpb25zXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRQYWdlT3B0aW9ucycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRDYW5QcmV2aW91c1BhZ2UgPSAoKSA9PiB0YWJsZS5nZXRTdGF0ZSgpLnBhZ2luYXRpb24ucGFnZUluZGV4ID4gMFxuXG4gICAgdGFibGUuZ2V0Q2FuTmV4dFBhZ2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBhZ2VJbmRleCB9ID0gdGFibGUuZ2V0U3RhdGUoKS5wYWdpbmF0aW9uXG5cbiAgICAgIGNvbnN0IHBhZ2VDb3VudCA9IHRhYmxlLmdldFBhZ2VDb3VudCgpXG5cbiAgICAgIGlmIChwYWdlQ291bnQgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdlQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWdlSW5kZXggPCBwYWdlQ291bnQgLSAxXG4gICAgfVxuXG4gICAgdGFibGUucHJldmlvdXNQYWdlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlLnNldFBhZ2VJbmRleChvbGQgPT4gb2xkIC0gMSlcbiAgICB9XG5cbiAgICB0YWJsZS5uZXh0UGFnZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZS5zZXRQYWdlSW5kZXgob2xkID0+IHtcbiAgICAgICAgcmV0dXJuIG9sZCArIDFcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UHJlUGFnaW5hdGlvblJvd01vZGVsID0gKCkgPT4gdGFibGUuZ2V0RXhwYW5kZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0UGFnaW5hdGlvblJvd01vZGVsID0gKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhdGFibGUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbCAmJlxuICAgICAgICB0YWJsZS5vcHRpb25zLmdldFBhZ2luYXRpb25Sb3dNb2RlbFxuICAgICAgKSB7XG4gICAgICAgIHRhYmxlLl9nZXRQYWdpbmF0aW9uUm93TW9kZWwgPVxuICAgICAgICAgIHRhYmxlLm9wdGlvbnMuZ2V0UGFnaW5hdGlvblJvd01vZGVsKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFibGUub3B0aW9ucy5tYW51YWxQYWdpbmF0aW9uIHx8ICF0YWJsZS5fZ2V0UGFnaW5hdGlvblJvd01vZGVsKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGUuX2dldFBhZ2luYXRpb25Sb3dNb2RlbCgpXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0UGFnZUNvdW50ID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFibGUub3B0aW9ucy5wYWdlQ291bnQgPz9cbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIHRhYmxlLmdldFByZVBhZ2luYXRpb25Sb3dNb2RlbCgpLnJvd3MubGVuZ3RoIC9cbiAgICAgICAgICAgIHRhYmxlLmdldFN0YXRlKCkucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuICB9LFxufVxuIiwiaW1wb3J0IHsgVGFibGVGZWF0dXJlIH0gZnJvbSAnLi4vY29yZS90YWJsZSdcbmltcG9ydCB7XG4gIE9uQ2hhbmdlRm4sXG4gIFVwZGF0ZXIsXG4gIFRhYmxlLFxuICBDb2x1bW4sXG4gIFJvdyxcbiAgQ2VsbCxcbiAgUm93RGF0YSxcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtYWtlU3RhdGVVcGRhdGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIENvbHVtblBpbm5pbmdQb3NpdGlvbiA9IGZhbHNlIHwgJ2xlZnQnIHwgJ3JpZ2h0J1xuZXhwb3J0IHR5cGUgUm93UGlubmluZ1Bvc2l0aW9uID0gZmFsc2UgfCAndG9wJyB8ICdib3R0b20nXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ1N0YXRlIHtcbiAgbGVmdD86IHN0cmluZ1tdXG4gIHJpZ2h0Pzogc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dQaW5uaW5nU3RhdGUge1xuICBib3R0b20/OiBzdHJpbmdbXVxuICB0b3A/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblBpbm5pbmdUYWJsZVN0YXRlIHtcbiAgY29sdW1uUGlubmluZzogQ29sdW1uUGlubmluZ1N0YXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93UGlubmluZ1RhYmxlU3RhdGUge1xuICByb3dQaW5uaW5nOiBSb3dQaW5uaW5nU3RhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5QaW5uaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIGNvbHVtbiBwaW5uaW5nIGZvciB0aGUgdGFibGUuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2VuYWJsZWNvbHVtbnBpbm5pbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZW5hYmxlQ29sdW1uUGlubmluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgYWxsIHBpbm5pbmcgZm9yIHRoZSB0YWJsZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZW5hYmxlcGlubmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBlbmFibGVQaW5uaW5nPzogYm9vbGVhblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBgdXBkYXRlckZuYCB3aGVuIGBzdGF0ZS5jb2x1bW5QaW5uaW5nYCBjaGFuZ2VzLiBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbnRlcm5hbCBzdGF0ZSBtYW5hZ2VtZW50LCBzbyB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IGBzdGF0ZS5jb2x1bW5QaW5uaW5nYCBmcm9tIHlvdXIgb3duIG1hbmFnZWQgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNvbmNvbHVtbnBpbm5pbmdjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9vbmNvbHVtbnBpbm5pbmdjaGFuZ2UpXG4gICAqL1xuICBvbkNvbHVtblBpbm5pbmdDaGFuZ2U/OiBPbkNoYW5nZUZuPENvbHVtblBpbm5pbmdTdGF0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dQaW5uaW5nT3B0aW9uczxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgcm93IHBpbm5pbmcgZm9yIHRoZSB0YWJsZS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZW5hYmxlcm93cGlubmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBlbmFibGVSb3dQaW5uaW5nPzogYm9vbGVhbiB8ICgocm93OiBSb3c8VERhdGE+KSA9PiBib29sZWFuKVxuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBwaW5uZWQgcm93cyB3aWxsIG5vdCBiZSB2aXNpYmxlIGlmIHRoZXkgYXJlIGZpbHRlcmVkIG9yIHBhZ2luYXRlZCBvdXQgb2YgdGhlIHRhYmxlLiBXaGVuIGB0cnVlYCwgcGlubmVkIHJvd3Mgd2lsbCBhbHdheXMgYmUgdmlzaWJsZSByZWdhcmRsZXNzIG9mIGZpbHRlcmluZyBvciBwYWdpbmF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNrZWVwcGlubmVkcm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBrZWVwUGlubmVkUm93cz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gYHVwZGF0ZXJGbmAgd2hlbiBgc3RhdGUucm93UGlubmluZ2AgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBgc3RhdGUucm93UGlubmluZ2AgZnJvbSB5b3VyIG93biBtYW5hZ2VkIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjb25yb3dwaW5uaW5nY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvb25yb3dwaW5uaW5nY2hhbmdlKVxuICAgKi9cbiAgb25Sb3dQaW5uaW5nQ2hhbmdlPzogT25DaGFuZ2VGbjxSb3dQaW5uaW5nU3RhdGU+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ0RlZmF1bHRPcHRpb25zIHtcbiAgb25Db2x1bW5QaW5uaW5nQ2hhbmdlOiBPbkNoYW5nZUZuPENvbHVtblBpbm5pbmdTdGF0ZT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dQaW5uaW5nRGVmYXVsdE9wdGlvbnMge1xuICBvblJvd1Bpbm5pbmdDaGFuZ2U6IE9uQ2hhbmdlRm48Um93UGlubmluZ1N0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblBpbm5pbmdDb2x1bW5EZWYge1xuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyBjb2x1bW4gcGlubmluZyBmb3IgdGhpcyBjb2x1bW4uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2VuYWJsZXBpbm5pbmctMSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBlbmFibGVQaW5uaW5nPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtblBpbm5pbmdDb2x1bW4ge1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29sdW1uIGNhbiBiZSBwaW5uZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjYW5waW4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0Q2FuUGluOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwaW5uZWQgcG9zaXRpb24gb2YgdGhlIGNvbHVtbi4gKGAnbGVmdCdgLCBgJ3JpZ2h0J2Agb3IgYGZhbHNlYClcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGlzcGlubmVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldElzUGlubmVkOiAoKSA9PiBDb2x1bW5QaW5uaW5nUG9zaXRpb25cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWVyaWMgcGlubmVkIGluZGV4IG9mIHRoZSBjb2x1bW4gd2l0aGluIGEgcGlubmVkIGNvbHVtbiBncm91cC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldHBpbm5lZGluZGV4KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldFBpbm5lZEluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFBpbnMgYSBjb2x1bW4gdG8gdGhlIGAnbGVmdCdgIG9yIGAncmlnaHQnYCwgb3IgdW5waW5zIHRoZSBjb2x1bW4gdG8gdGhlIGNlbnRlciBpZiBgZmFsc2VgIGlzIHBhc3NlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI3BpbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBwaW46IChwb3NpdGlvbjogQ29sdW1uUGlubmluZ1Bvc2l0aW9uKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ1JvdzxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNlbnRlciBwaW5uZWQgKHVucGlubmVkKSBsZWFmIGNlbGxzIGluIHRoZSByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjZW50ZXJ2aXNpYmxlY2VsbHMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0Q2VudGVyVmlzaWJsZUNlbGxzOiAoKSA9PiBDZWxsPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBsZWZ0IHBpbm5lZCBsZWFmIGNlbGxzIGluIHRoZSByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRsZWZ0dmlzaWJsZWNlbGxzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldExlZnRWaXNpYmxlQ2VsbHM6ICgpID0+IENlbGw8VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHJpZ2h0IHBpbm5lZCBsZWFmIGNlbGxzIGluIHRoZSByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRyaWdodHZpc2libGVjZWxscylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRSaWdodFZpc2libGVDZWxsczogKCkgPT4gQ2VsbDxURGF0YSwgdW5rbm93bj5bXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvd1Bpbm5pbmdSb3cge1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcm93IGNhbiBiZSBwaW5uZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjYW5waW4tMSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRDYW5QaW46ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBpbm5lZCBwb3NpdGlvbiBvZiB0aGUgcm93LiAoYCd0b3AnYCwgYCdib3R0b20nYCBvciBgZmFsc2VgKVxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZ2V0aXNwaW5uZWQtMSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRJc1Bpbm5lZDogKCkgPT4gUm93UGlubmluZ1Bvc2l0aW9uXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1lcmljIHBpbm5lZCBpbmRleCBvZiB0aGUgcm93IHdpdGhpbiBhIHBpbm5lZCByb3cgZ3JvdXAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRwaW5uZWRpbmRleC0xKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldFBpbm5lZEluZGV4OiAoKSA9PiBudW1iZXJcbiAgLyoqXG4gICAqIFBpbnMgYSByb3cgdG8gdGhlIGAndG9wJ2Agb3IgYCdib3R0b20nYCwgb3IgdW5waW5zIHRoZSByb3cgdG8gdGhlIGNlbnRlciBpZiBgZmFsc2VgIGlzIHBhc3NlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI3Bpbi0xKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIHBpbjogKFxuICAgIHBvc2l0aW9uOiBSb3dQaW5uaW5nUG9zaXRpb24sXG4gICAgaW5jbHVkZUxlYWZSb3dzPzogYm9vbGVhbixcbiAgICBpbmNsdWRlUGFyZW50Um93cz86IGJvb2xlYW5cbiAgKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGlubmluZ0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgY2VudGVyIHBpbm5lZCAodW5waW5uZWQpIGxlYWYgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGNlbnRlcmxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldENlbnRlckxlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW55IGNvbHVtbnMgYXJlIHBpbm5lZC4gT3B0aW9uYWxseSBzcGVjaWZ5IHRvIG9ubHkgY2hlY2sgZm9yIHBpbm5lZCBjb2x1bW5zIGluIGVpdGhlciB0aGUgYGxlZnRgIG9yIGByaWdodGAgcG9zaXRpb24uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRpc3NvbWVjb2x1bW5zcGlubmVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldElzU29tZUNvbHVtbnNQaW5uZWQ6IChwb3NpdGlvbj86IENvbHVtblBpbm5pbmdQb3NpdGlvbikgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgbGVmdCBwaW5uZWQgbGVhZiBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZ2V0bGVmdGxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldExlZnRMZWFmQ29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCByaWdodCBwaW5uZWQgbGVhZiBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjZ2V0cmlnaHRsZWFmY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBnZXRSaWdodExlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipjb2x1bW5QaW5uaW5nKiogc3RhdGUgdG8gYGluaXRpYWxTdGF0ZS5jb2x1bW5QaW5uaW5nYCwgb3IgYHRydWVgIGNhbiBiZSBwYXNzZWQgdG8gZm9yY2UgYSBkZWZhdWx0IGJsYW5rIHN0YXRlIHJlc2V0IHRvIGB7IGxlZnQ6IFtdLCByaWdodDogW10sIH1gLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjcmVzZXRjb2x1bW5waW5uaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIHJlc2V0Q29sdW1uUGlubmluZzogKGRlZmF1bHRTdGF0ZT86IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgYHN0YXRlLmNvbHVtblBpbm5pbmdgIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Bpbm5pbmcjc2V0Y29sdW1ucGlubmluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Bpbm5pbmcpXG4gICAqL1xuICBzZXRDb2x1bW5QaW5uaW5nOiAodXBkYXRlcjogVXBkYXRlcjxDb2x1bW5QaW5uaW5nU3RhdGU+KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93UGlubmluZ0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBfZ2V0UGlubmVkUm93czogKHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nKSA9PiBSb3c8VERhdGE+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGJvdHRvbSBwaW5uZWQgcm93cy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGJvdHRvbXJvd3MpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0Qm90dG9tUm93czogKCkgPT4gUm93PFREYXRhPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCByb3dzIHRoYXQgYXJlIG5vdCBwaW5uZWQgdG8gdGhlIHRvcCBvciBib3R0b20uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXRjZW50ZXJyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldENlbnRlclJvd3M6ICgpID0+IFJvdzxURGF0YT5bXVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbnkgcm93cyBhcmUgcGlubmVkLiBPcHRpb25hbGx5IHNwZWNpZnkgdG8gb25seSBjaGVjayBmb3IgcGlubmVkIHJvd3MgaW4gZWl0aGVyIHRoZSBgdG9wYCBvciBgYm90dG9tYCBwb3NpdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9waW5uaW5nI2dldGlzc29tZXJvd3NwaW5uZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgZ2V0SXNTb21lUm93c1Bpbm5lZDogKHBvc2l0aW9uPzogUm93UGlubmluZ1Bvc2l0aW9uKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCB0b3AgcGlubmVkIHJvd3MuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNnZXR0b3Byb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIGdldFRvcFJvd3M6ICgpID0+IFJvdzxURGF0YT5bXVxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKnJvd1Bpbm5pbmcqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLnJvd1Bpbm5pbmdgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYHsgdG9wOiBbXSwgYm90dG9tOiBbXSwgfWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNyZXNldHJvd3Bpbm5pbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9waW5uaW5nKVxuICAgKi9cbiAgcmVzZXRSb3dQaW5uaW5nOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUucm93UGlubmluZ2Agc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcGlubmluZyNzZXRyb3dwaW5uaW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcGlubmluZylcbiAgICovXG4gIHNldFJvd1Bpbm5pbmc6ICh1cGRhdGVyOiBVcGRhdGVyPFJvd1Bpbm5pbmdTdGF0ZT4pID0+IHZvaWRcbn1cblxuLy9cblxuY29uc3QgZ2V0RGVmYXVsdENvbHVtblBpbm5pbmdTdGF0ZSA9ICgpOiBDb2x1bW5QaW5uaW5nU3RhdGUgPT4gKHtcbiAgbGVmdDogW10sXG4gIHJpZ2h0OiBbXSxcbn0pXG5cbmNvbnN0IGdldERlZmF1bHRSb3dQaW5uaW5nU3RhdGUgPSAoKTogUm93UGlubmluZ1N0YXRlID0+ICh7XG4gIHRvcDogW10sXG4gIGJvdHRvbTogW10sXG59KVxuXG5leHBvcnQgY29uc3QgUGlubmluZzogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IENvbHVtblBpbm5pbmdUYWJsZVN0YXRlICYgUm93UGlubmluZ1N0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uUGlubmluZzogZ2V0RGVmYXVsdENvbHVtblBpbm5pbmdTdGF0ZSgpLFxuICAgICAgcm93UGlubmluZzogZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSgpLFxuICAgICAgLi4uc3RhdGUsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRPcHRpb25zOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IENvbHVtblBpbm5pbmdEZWZhdWx0T3B0aW9ucyAmIFJvd1Bpbm5pbmdEZWZhdWx0T3B0aW9ucyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ29sdW1uUGlubmluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignY29sdW1uUGlubmluZycsIHRhYmxlKSxcbiAgICAgIG9uUm93UGlubmluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcigncm93UGlubmluZycsIHRhYmxlKSxcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlQ29sdW1uOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+KFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29sdW1uLnBpbiA9IHBvc2l0aW9uID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbklkcyA9IGNvbHVtblxuICAgICAgICAuZ2V0TGVhZkNvbHVtbnMoKVxuICAgICAgICAubWFwKGQgPT4gZC5pZClcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXVxuXG4gICAgICB0YWJsZS5zZXRDb2x1bW5QaW5uaW5nKG9sZCA9PiB7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAob2xkPy5sZWZ0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgICAgICByaWdodDogW1xuICAgICAgICAgICAgICAuLi4ob2xkPy5yaWdodCA/PyBbXSkuZmlsdGVyKGQgPT4gIWNvbHVtbklkcz8uaW5jbHVkZXMoZCkpLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5JZHMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IFtcbiAgICAgICAgICAgICAgLi4uKG9sZD8ubGVmdCA/PyBbXSkuZmlsdGVyKGQgPT4gIWNvbHVtbklkcz8uaW5jbHVkZXMoZCkpLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5JZHMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmlnaHQ6IChvbGQ/LnJpZ2h0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsZWZ0OiAob2xkPy5sZWZ0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgICAgcmlnaHQ6IChvbGQ/LnJpZ2h0ID8/IFtdKS5maWx0ZXIoZCA9PiAhY29sdW1uSWRzPy5pbmNsdWRlcyhkKSksXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29sdW1uLmdldENhblBpbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGxlYWZDb2x1bW5zID0gY29sdW1uLmdldExlYWZDb2x1bW5zKClcblxuICAgICAgcmV0dXJuIGxlYWZDb2x1bW5zLnNvbWUoXG4gICAgICAgIGQgPT5cbiAgICAgICAgICAoZC5jb2x1bW5EZWYuZW5hYmxlUGlubmluZyA/PyB0cnVlKSAmJlxuICAgICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZUNvbHVtblBpbm5pbmcgPz9cbiAgICAgICAgICAgIHRhYmxlLm9wdGlvbnMuZW5hYmxlUGlubmluZyA/P1xuICAgICAgICAgICAgdHJ1ZSlcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0SXNQaW5uZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBsZWFmQ29sdW1uSWRzID0gY29sdW1uLmdldExlYWZDb2x1bW5zKCkubWFwKGQgPT4gZC5pZClcblxuICAgICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nXG5cbiAgICAgIGNvbnN0IGlzTGVmdCA9IGxlYWZDb2x1bW5JZHMuc29tZShkID0+IGxlZnQ/LmluY2x1ZGVzKGQpKVxuICAgICAgY29uc3QgaXNSaWdodCA9IGxlYWZDb2x1bW5JZHMuc29tZShkID0+IHJpZ2h0Py5pbmNsdWRlcyhkKSlcblxuICAgICAgcmV0dXJuIGlzTGVmdCA/ICdsZWZ0JyA6IGlzUmlnaHQgPyAncmlnaHQnIDogZmFsc2VcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0UGlubmVkSW5kZXggPSAoKSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNvbHVtbi5nZXRJc1Bpbm5lZCgpXG5cbiAgICAgIHJldHVybiBwb3NpdGlvblxuICAgICAgICA/IHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZz8uW3Bvc2l0aW9uXT8uaW5kZXhPZihjb2x1bW4uaWQpID8/IC0xXG4gICAgICAgIDogMFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVSb3c6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHJvdzogUm93PFREYXRhPixcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IHZvaWQgPT4ge1xuICAgIHJvdy5waW4gPSAocG9zaXRpb24sIGluY2x1ZGVMZWFmUm93cywgaW5jbHVkZVBhcmVudFJvd3MpID0+IHtcbiAgICAgIGNvbnN0IGxlYWZSb3dJZHMgPSBpbmNsdWRlTGVhZlJvd3NcbiAgICAgICAgPyByb3cuZ2V0TGVhZlJvd3MoKS5tYXAoKHsgaWQgfSkgPT4gaWQpXG4gICAgICAgIDogW11cbiAgICAgIGNvbnN0IHBhcmVudFJvd0lkcyA9IGluY2x1ZGVQYXJlbnRSb3dzXG4gICAgICAgID8gcm93LmdldFBhcmVudFJvd3MoKS5tYXAoKHsgaWQgfSkgPT4gaWQpXG4gICAgICAgIDogW11cbiAgICAgIGNvbnN0IHJvd0lkcyA9IG5ldyBTZXQoWy4uLnBhcmVudFJvd0lkcywgcm93LmlkLCAuLi5sZWFmUm93SWRzXSlcblxuICAgICAgdGFibGUuc2V0Um93UGlubmluZyhvbGQgPT4ge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogKG9sZD8udG9wID8/IFtdKS5maWx0ZXIoZCA9PiAhcm93SWRzPy5oYXMoZCkpLFxuICAgICAgICAgICAgYm90dG9tOiBbXG4gICAgICAgICAgICAgIC4uLihvbGQ/LmJvdHRvbSA/PyBbXSkuZmlsdGVyKGQgPT4gIXJvd0lkcz8uaGFzKGQpKSxcbiAgICAgICAgICAgICAgLi4uQXJyYXkuZnJvbShyb3dJZHMpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogW1xuICAgICAgICAgICAgICAuLi4ob2xkPy50b3AgPz8gW10pLmZpbHRlcihkID0+ICFyb3dJZHM/LmhhcyhkKSksXG4gICAgICAgICAgICAgIC4uLkFycmF5LmZyb20ocm93SWRzKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBib3R0b206IChvbGQ/LmJvdHRvbSA/PyBbXSkuZmlsdGVyKGQgPT4gIXJvd0lkcz8uaGFzKGQpKSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvcDogKG9sZD8udG9wID8/IFtdKS5maWx0ZXIoZCA9PiAhcm93SWRzPy5oYXMoZCkpLFxuICAgICAgICAgIGJvdHRvbTogKG9sZD8uYm90dG9tID8/IFtdKS5maWx0ZXIoZCA9PiAhcm93SWRzPy5oYXMoZCkpLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByb3cuZ2V0Q2FuUGluID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBlbmFibGVSb3dQaW5uaW5nLCBlbmFibGVQaW5uaW5nIH0gPSB0YWJsZS5vcHRpb25zXG4gICAgICBpZiAodHlwZW9mIGVuYWJsZVJvd1Bpbm5pbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGVuYWJsZVJvd1Bpbm5pbmcocm93KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVuYWJsZVJvd1Bpbm5pbmcgPz8gZW5hYmxlUGlubmluZyA/PyB0cnVlXG4gICAgfVxuICAgIHJvdy5nZXRJc1Bpbm5lZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0lkcyA9IFtyb3cuaWRdXG5cbiAgICAgIGNvbnN0IHsgdG9wLCBib3R0b20gfSA9IHRhYmxlLmdldFN0YXRlKCkucm93UGlubmluZ1xuXG4gICAgICBjb25zdCBpc1RvcCA9IHJvd0lkcy5zb21lKGQgPT4gdG9wPy5pbmNsdWRlcyhkKSlcbiAgICAgIGNvbnN0IGlzQm90dG9tID0gcm93SWRzLnNvbWUoZCA9PiBib3R0b20/LmluY2x1ZGVzKGQpKVxuXG4gICAgICByZXR1cm4gaXNUb3AgPyAndG9wJyA6IGlzQm90dG9tID8gJ2JvdHRvbScgOiBmYWxzZVxuICAgIH1cbiAgICByb3cuZ2V0UGlubmVkSW5kZXggPSAoKSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHJvdy5nZXRJc1Bpbm5lZCgpXG4gICAgICBpZiAoIXBvc2l0aW9uKSByZXR1cm4gLTFcblxuICAgICAgY29uc3QgdmlzaWJsZVBpbm5lZFJvd0lkcyA9IHRhYmxlXG4gICAgICAgIC5fZ2V0UGlubmVkUm93cyhwb3NpdGlvbilcbiAgICAgICAgPy5tYXAoKHsgaWQgfSkgPT4gaWQpXG5cbiAgICAgIHJldHVybiB2aXNpYmxlUGlubmVkUm93SWRzPy5pbmRleE9mKHJvdy5pZCkgPz8gLTFcbiAgICB9XG4gICAgcm93LmdldENlbnRlclZpc2libGVDZWxscyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHJvdy5fZ2V0QWxsVmlzaWJsZUNlbGxzKCksXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHQsXG4gICAgICBdLFxuICAgICAgKGFsbENlbGxzLCBsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0QW5kUmlnaHQ6IHN0cmluZ1tdID0gWy4uLihsZWZ0ID8/IFtdKSwgLi4uKHJpZ2h0ID8/IFtdKV1cblxuICAgICAgICByZXR1cm4gYWxsQ2VsbHMuZmlsdGVyKGQgPT4gIWxlZnRBbmRSaWdodC5pbmNsdWRlcyhkLmNvbHVtbi5pZCkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ3Jvdy5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gICAgcm93LmdldExlZnRWaXNpYmxlQ2VsbHMgPSBtZW1vKFxuICAgICAgKCkgPT4gW3Jvdy5fZ2V0QWxsVmlzaWJsZUNlbGxzKCksIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZy5sZWZ0LCAsXSxcbiAgICAgIChhbGxDZWxscywgbGVmdCkgPT4ge1xuICAgICAgICBjb25zdCBjZWxscyA9IChsZWZ0ID8/IFtdKVxuICAgICAgICAgIC5tYXAoY29sdW1uSWQgPT4gYWxsQ2VsbHMuZmluZChjZWxsID0+IGNlbGwuY29sdW1uLmlkID09PSBjb2x1bW5JZCkhKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKGQgPT4gKHsgLi4uZCwgcG9zaXRpb246ICdsZWZ0JyB9KSBhcyBDZWxsPFREYXRhLCB1bmtub3duPilcblxuICAgICAgICByZXR1cm4gY2VsbHNcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTpcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAncm93LmdldExlZnRWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gICAgcm93LmdldFJpZ2h0VmlzaWJsZUNlbGxzID0gbWVtbyhcbiAgICAgICgpID0+IFtyb3cuX2dldEFsbFZpc2libGVDZWxscygpLCB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLFxuICAgICAgKGFsbENlbGxzLCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBjZWxscyA9IChyaWdodCA/PyBbXSlcbiAgICAgICAgICAubWFwKGNvbHVtbklkID0+IGFsbENlbGxzLmZpbmQoY2VsbCA9PiBjZWxsLmNvbHVtbi5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcChkID0+ICh7IC4uLmQsIHBvc2l0aW9uOiAncmlnaHQnIH0pIGFzIENlbGw8VERhdGEsIHVua25vd24+KVxuXG4gICAgICAgIHJldHVybiBjZWxsc1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdyb3cuZ2V0UmlnaHRWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gIH0sXG5cbiAgY3JlYXRlVGFibGU6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KHRhYmxlOiBUYWJsZTxURGF0YT4pOiB2b2lkID0+IHtcbiAgICB0YWJsZS5zZXRDb2x1bW5QaW5uaW5nID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vbkNvbHVtblBpbm5pbmdDaGFuZ2U/Lih1cGRhdGVyKVxuXG4gICAgdGFibGUucmVzZXRDb2x1bW5QaW5uaW5nID0gZGVmYXVsdFN0YXRlID0+XG4gICAgICB0YWJsZS5zZXRDb2x1bW5QaW5uaW5nKFxuICAgICAgICBkZWZhdWx0U3RhdGVcbiAgICAgICAgICA/IGdldERlZmF1bHRDb2x1bW5QaW5uaW5nU3RhdGUoKVxuICAgICAgICAgIDogdGFibGUuaW5pdGlhbFN0YXRlPy5jb2x1bW5QaW5uaW5nID8/IGdldERlZmF1bHRDb2x1bW5QaW5uaW5nU3RhdGUoKVxuICAgICAgKVxuXG4gICAgdGFibGUuZ2V0SXNTb21lQ29sdW1uc1Bpbm5lZCA9IHBvc2l0aW9uID0+IHtcbiAgICAgIGNvbnN0IHBpbm5pbmdTdGF0ZSA9IHRhYmxlLmdldFN0YXRlKCkuY29sdW1uUGlubmluZ1xuXG4gICAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBpbm5pbmdTdGF0ZS5sZWZ0Py5sZW5ndGggfHwgcGlubmluZ1N0YXRlLnJpZ2h0Py5sZW5ndGgpXG4gICAgICB9XG4gICAgICByZXR1cm4gQm9vbGVhbihwaW5uaW5nU3RhdGVbcG9zaXRpb25dPy5sZW5ndGgpXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0TGVmdExlYWZDb2x1bW5zID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRBbGxMZWFmQ29sdW1ucygpLCB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdF0sXG4gICAgICAoYWxsQ29sdW1ucywgbGVmdCkgPT4ge1xuICAgICAgICByZXR1cm4gKGxlZnQgPz8gW10pXG4gICAgICAgICAgLm1hcChjb2x1bW5JZCA9PiBhbGxDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRMZWZ0TGVhZkNvbHVtbnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5nZXRSaWdodExlYWZDb2x1bW5zID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRBbGxMZWFmQ29sdW1ucygpLCB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcucmlnaHRdLFxuICAgICAgKGFsbENvbHVtbnMsIHJpZ2h0KSA9PiB7XG4gICAgICAgIHJldHVybiAocmlnaHQgPz8gW10pXG4gICAgICAgICAgLm1hcChjb2x1bW5JZCA9PiBhbGxDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpISlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRSaWdodExlYWZDb2x1bW5zJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0NvbHVtbnMsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMgPSBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRBbGxMZWFmQ29sdW1ucygpLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblBpbm5pbmcubGVmdCxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5QaW5uaW5nLnJpZ2h0LFxuICAgICAgXSxcbiAgICAgIChhbGxDb2x1bW5zLCBsZWZ0LCByaWdodCkgPT4ge1xuICAgICAgICBjb25zdCBsZWZ0QW5kUmlnaHQ6IHN0cmluZ1tdID0gWy4uLihsZWZ0ID8/IFtdKSwgLi4uKHJpZ2h0ID8/IFtdKV1cblxuICAgICAgICByZXR1cm4gYWxsQ29sdW1ucy5maWx0ZXIoZCA9PiAhbGVmdEFuZFJpZ2h0LmluY2x1ZGVzKGQuaWQpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0Q2VudGVyTGVhZkNvbHVtbnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApXG5cbiAgICB0YWJsZS5zZXRSb3dQaW5uaW5nID0gdXBkYXRlciA9PiB0YWJsZS5vcHRpb25zLm9uUm93UGlubmluZ0NoYW5nZT8uKHVwZGF0ZXIpXG5cbiAgICB0YWJsZS5yZXNldFJvd1Bpbm5pbmcgPSBkZWZhdWx0U3RhdGUgPT5cbiAgICAgIHRhYmxlLnNldFJvd1Bpbm5pbmcoXG4gICAgICAgIGRlZmF1bHRTdGF0ZVxuICAgICAgICAgID8gZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSgpXG4gICAgICAgICAgOiB0YWJsZS5pbml0aWFsU3RhdGU/LnJvd1Bpbm5pbmcgPz8gZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSgpXG4gICAgICApXG5cbiAgICB0YWJsZS5nZXRJc1NvbWVSb3dzUGlubmVkID0gcG9zaXRpb24gPT4ge1xuICAgICAgY29uc3QgcGlubmluZ1N0YXRlID0gdGFibGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nXG5cbiAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGlubmluZ1N0YXRlLnRvcD8ubGVuZ3RoIHx8IHBpbm5pbmdTdGF0ZS5ib3R0b20/Lmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHJldHVybiBCb29sZWFuKHBpbm5pbmdTdGF0ZVtwb3NpdGlvbl0/Lmxlbmd0aClcbiAgICB9XG5cbiAgICB0YWJsZS5fZ2V0UGlubmVkUm93cyA9IChwb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJykgPT5cbiAgICAgIG1lbW8oXG4gICAgICAgICgpID0+IFt0YWJsZS5nZXRSb3dNb2RlbCgpLnJvd3MsIHRhYmxlLmdldFN0YXRlKCkucm93UGlubmluZ1twb3NpdGlvbl1dLFxuICAgICAgICAodmlzaWJsZVJvd3MsIHBpbm5lZFJvd0lkcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJvd3MgPVxuICAgICAgICAgICAgdGFibGUub3B0aW9ucy5rZWVwUGlubmVkUm93cyA/PyB0cnVlXG4gICAgICAgICAgICAgID8gLy9nZXQgYWxsIHJvd3MgdGhhdCBhcmUgcGlubmVkIGV2ZW4gaWYgdGhleSB3b3VsZCBub3QgYmUgb3RoZXJ3aXNlIHZpc2libGVcbiAgICAgICAgICAgICAgICAvL2FjY291bnQgZm9yIGV4cGFuZGVkIHBhcmVudCByb3dzLCBidXQgbm90IHBhZ2luYXRpb24gb3IgZmlsdGVyaW5nXG4gICAgICAgICAgICAgICAgKHBpbm5lZFJvd0lkcyA/PyBbXSkubWFwKHJvd0lkID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlLmdldFJvdyhyb3dJZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiByb3cuZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQoKSA/IHJvdyA6IG51bGxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IC8vZWxzZSBnZXQgb25seSB2aXNpYmxlIHJvd3MgdGhhdCBhcmUgcGlubmVkXG4gICAgICAgICAgICAgICAgKHBpbm5lZFJvd0lkcyA/PyBbXSkubWFwKFxuICAgICAgICAgICAgICAgICAgcm93SWQgPT4gdmlzaWJsZVJvd3MuZmluZChyb3cgPT4gcm93LmlkID09PSByb3dJZCkhXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgcmV0dXJuIHJvd3NcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5tYXAoZCA9PiAoeyAuLi5kLCBwb3NpdGlvbiB9KSkgYXMgUm93PFREYXRhPltdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJlxuICAgICAgICAgICAgYHJvdy5nZXQke3Bvc2l0aW9uID09PSAndG9wJyA/ICdUb3AnIDogJ0JvdHRvbSd9Um93c2AsXG4gICAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1Jvd3MsXG4gICAgICAgIH1cbiAgICAgICkoKVxuXG4gICAgdGFibGUuZ2V0VG9wUm93cyA9ICgpID0+IHRhYmxlLl9nZXRQaW5uZWRSb3dzKCd0b3AnKVxuXG4gICAgdGFibGUuZ2V0Qm90dG9tUm93cyA9ICgpID0+IHRhYmxlLl9nZXRQaW5uZWRSb3dzKCdib3R0b20nKVxuXG4gICAgdGFibGUuZ2V0Q2VudGVyUm93cyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldFJvd01vZGVsKCkucm93cyxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLnRvcCxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5yb3dQaW5uaW5nLmJvdHRvbSxcbiAgICAgIF0sXG4gICAgICAoYWxsUm93cywgdG9wLCBib3R0b20pID0+IHtcbiAgICAgICAgY29uc3QgdG9wQW5kQm90dG9tID0gbmV3IFNldChbLi4uKHRvcCA/PyBbXSksIC4uLihib3R0b20gPz8gW10pXSlcbiAgICAgICAgcmV0dXJuIGFsbFJvd3MuZmlsdGVyKGQgPT4gIXRvcEFuZEJvdHRvbS5oYXMoZC5pZCkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdyb3cuZ2V0Q2VudGVyUm93cycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdSb3dzLFxuICAgICAgfVxuICAgIClcbiAgfSxcbn1cbiIsImltcG9ydCB7IFRhYmxlRmVhdHVyZSB9IGZyb20gJy4uL2NvcmUvdGFibGUnXG5pbXBvcnQgeyBPbkNoYW5nZUZuLCBUYWJsZSwgUm93LCBSb3dNb2RlbCwgVXBkYXRlciwgUm93RGF0YSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgbWFrZVN0YXRlVXBkYXRlciwgbWVtbyB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBSb3dTZWxlY3Rpb25TdGF0ZSA9IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93U2VsZWN0aW9uVGFibGVTdGF0ZSB7XG4gIHJvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uU3RhdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3dTZWxlY3Rpb25PcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogLSBFbmFibGVzL2Rpc2FibGVzIG11bHRpcGxlIHJvdyBzZWxlY3Rpb24gZm9yIGFsbCByb3dzIGluIHRoZSB0YWJsZSBPUlxuICAgKiAtIEEgZnVuY3Rpb24gdGhhdCBnaXZlbiBhIHJvdywgcmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZS9kaXNhYmxlIG11bHRpcGxlIHJvdyBzZWxlY3Rpb24gZm9yIHRoYXQgcm93J3MgY2hpbGRyZW4vZ3JhbmRjaGlsZHJlblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZW5hYmxlbXVsdGlyb3dzZWxlY3Rpb24pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24/OiBib29sZWFuIHwgKChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW4pXG4gIC8qKlxuICAgKiAtIEVuYWJsZXMvZGlzYWJsZXMgcm93IHNlbGVjdGlvbiBmb3IgYWxsIHJvd3MgaW4gdGhlIHRhYmxlIE9SXG4gICAqIC0gQSBmdW5jdGlvbiB0aGF0IGdpdmVuIGEgcm93LCByZXR1cm5zIHdoZXRoZXIgdG8gZW5hYmxlL2Rpc2FibGUgcm93IHNlbGVjdGlvbiBmb3IgdGhhdCByb3dcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2VuYWJsZXJvd3NlbGVjdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBlbmFibGVSb3dTZWxlY3Rpb24/OiBib29sZWFuIHwgKChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW4pXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIGF1dG9tYXRpYyBzdWItcm93IHNlbGVjdGlvbiB3aGVuIGEgcGFyZW50IHJvdyBpcyBzZWxlY3RlZCwgb3IgYSBmdW5jdGlvbiB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgYXV0b21hdGljIHN1Yi1yb3cgc2VsZWN0aW9uIGZvciBlYWNoIHJvdy5cbiAgICogKFVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIGV4cGFuZGluZyBvciBncm91cGluZyBmZWF0dXJlcylcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2VuYWJsZXN1YnJvd3NlbGVjdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBlbmFibGVTdWJSb3dTZWxlY3Rpb24/OiBib29sZWFuIHwgKChyb3c6IFJvdzxURGF0YT4pID0+IGJvb2xlYW4pXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLnJvd1NlbGVjdGlvbmAgY2hhbmdlcy4gVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc3RhdGUgbWFuYWdlbWVudCwgc28geW91IHdpbGwgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2UgZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseSBvdXRzaWRlIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI29ucm93c2VsZWN0aW9uY2hhbmdlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIG9uUm93U2VsZWN0aW9uQ2hhbmdlPzogT25DaGFuZ2VGbjxSb3dTZWxlY3Rpb25TdGF0ZT5cbiAgLy8gZW5hYmxlR3JvdXBpbmdSb3dTZWxlY3Rpb24/OlxuICAvLyAgIHwgYm9vbGVhblxuICAvLyAgIHwgKChcbiAgLy8gICAgICAgcm93OiBSb3c8VERhdGE+XG4gIC8vICAgICApID0+IGJvb2xlYW4pXG4gIC8vIGlzQWRkaXRpdmVTZWxlY3RFdmVudD86IChlOiB1bmtub3duKSA9PiBib29sZWFuXG4gIC8vIGlzSW5jbHVzaXZlU2VsZWN0RXZlbnQ/OiAoZTogdW5rbm93bikgPT4gYm9vbGVhblxuICAvLyBzZWxlY3RSb3dzRm4/OiAoXG4gIC8vICAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgLy8gICByb3dNb2RlbDogUm93TW9kZWw8VERhdGE+XG4gIC8vICkgPT4gUm93TW9kZWw8VERhdGE+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93U2VsZWN0aW9uUm93IHtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJvdyBjYW4gbXVsdGktc2VsZWN0LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0Y2FubXVsdGlzZWxlY3QpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0Q2FuTXVsdGlTZWxlY3Q6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJvdyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRjYW5zZWxlY3QpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0Q2FuU2VsZWN0OiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSByb3cgY2FuIHNlbGVjdCBzdWIgcm93cyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhcmVudCByb3cgaXMgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRjYW5zZWxlY3RzdWJyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldENhblNlbGVjdFN1YlJvd3M6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYWxsIG9mIHRoZSByb3cncyBzdWIgcm93cyBhcmUgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRpc2FsbHN1YnJvd3NzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc0FsbFN1YlJvd3NTZWxlY3RlZDogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcm93IGlzIHNlbGVjdGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0aXNzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHNvbWUgb2YgdGhlIHJvdydzIHN1YiByb3dzIGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldGlzc29tZXNlbGVjdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldElzU29tZVNlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRvZ2dsZSB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0dG9nZ2xlc2VsZWN0ZWRoYW5kbGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldFRvZ2dsZVNlbGVjdGVkSGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZWxlY3RzL2Rlc2VsZWN0cyB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jdG9nZ2xlc2VsZWN0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0ZWQ6ICh2YWx1ZT86IGJvb2xlYW4sIG9wdHM/OiB7IHNlbGVjdENoaWxkcmVuPzogYm9vbGVhbiB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm93U2VsZWN0aW9uSW5zdGFuY2U8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgbW9kZWwgb2YgYWxsIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGhhcyBiZWVuIGFwcGxpZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRmaWx0ZXJlZHNlbGVjdGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBvZiBhbGwgcm93cyB0aGF0IGFyZSBzZWxlY3RlZCBhZnRlciBncm91cGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0Z3JvdXBlZHNlbGVjdGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbGwgcm93cyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldGlzYWxscGFnZXJvd3NzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYWxsIHJvd3MgaW4gdGhlIHRhYmxlIGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldGlzYWxscm93c3NlbGVjdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIGdldElzQWxsUm93c1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFsbCByb3dzIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIHNlbGVjdGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0aXNzb21lcGFnZXJvd3NzZWxlY3RlZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFsbCByb3dzIGluIHRoZSB0YWJsZSBhcmUgc2VsZWN0ZWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvcm93LXNlbGVjdGlvbiNnZXRpc3NvbWVyb3dzc2VsZWN0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0SXNTb21lUm93c1NlbGVjdGVkOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb3JlIHJvdyBtb2RlbCBvZiBhbGwgcm93cyBiZWZvcmUgcm93IHNlbGVjdGlvbiBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0cHJlc2VsZWN0ZWRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRQcmVTZWxlY3RlZFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBvZiBhbGwgcm93cyB0aGF0IGFyZSBzZWxlY3RlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI2dldHNlbGVjdGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRvZ2dsZSBhbGwgcm93cyBvbiB0aGUgY3VycmVudCBwYWdlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0dG9nZ2xlYWxscGFnZXJvd3NzZWxlY3RlZGhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZEhhbmRsZXI6ICgpID0+IChldmVudDogdW5rbm93bikgPT4gdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhIGhhbmRsZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgYWxsIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jZ2V0dG9nZ2xlYWxscm93c3NlbGVjdGVkaGFuZGxlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBnZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyOiAoKSA9PiAoZXZlbnQ6IHVua25vd24pID0+IHZvaWRcbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgKipyb3dTZWxlY3Rpb24qKiBzdGF0ZSB0byB0aGUgYGluaXRpYWxTdGF0ZS5yb3dTZWxlY3Rpb25gLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYHt9YC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI3Jlc2V0cm93c2VsZWN0aW9uKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIHJlc2V0Um93U2VsZWN0aW9uOiAoZGVmYXVsdFN0YXRlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBgc3RhdGUucm93U2VsZWN0aW9uYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI3NldHJvd3NlbGVjdGlvbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvdy1zZWxlY3Rpb24pXG4gICAqL1xuICBzZXRSb3dTZWxlY3Rpb246ICh1cGRhdGVyOiBVcGRhdGVyPFJvd1NlbGVjdGlvblN0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogU2VsZWN0cy9kZXNlbGVjdHMgYWxsIHJvd3Mgb24gdGhlIGN1cnJlbnQgcGFnZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9yb3ctc2VsZWN0aW9uI3RvZ2dsZWFsbHBhZ2Vyb3dzc2VsZWN0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3ctc2VsZWN0aW9uKVxuICAgKi9cbiAgdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZDogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxuICAvKipcbiAgICogU2VsZWN0cy9kZXNlbGVjdHMgYWxsIHJvd3MgaW4gdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3Jvdy1zZWxlY3Rpb24jdG9nZ2xlYWxscm93c3NlbGVjdGVkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93LXNlbGVjdGlvbilcbiAgICovXG4gIHRvZ2dsZUFsbFJvd3NTZWxlY3RlZDogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgUm93U2VsZWN0aW9uOiBUYWJsZUZlYXR1cmUgPSB7XG4gIGdldEluaXRpYWxTdGF0ZTogKHN0YXRlKTogUm93U2VsZWN0aW9uVGFibGVTdGF0ZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd1NlbGVjdGlvbjoge30sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogUm93U2VsZWN0aW9uT3B0aW9uczxURGF0YT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvblJvd1NlbGVjdGlvbkNoYW5nZTogbWFrZVN0YXRlVXBkYXRlcigncm93U2VsZWN0aW9uJywgdGFibGUpLFxuICAgICAgZW5hYmxlUm93U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb246IHRydWUsXG4gICAgICBlbmFibGVTdWJSb3dTZWxlY3Rpb246IHRydWUsXG4gICAgICAvLyBlbmFibGVHcm91cGluZ1Jvd1NlbGVjdGlvbjogZmFsc2UsXG4gICAgICAvLyBpc0FkZGl0aXZlU2VsZWN0RXZlbnQ6IChlOiB1bmtub3duKSA9PiAhIWUubWV0YUtleSxcbiAgICAgIC8vIGlzSW5jbHVzaXZlU2VsZWN0RXZlbnQ6IChlOiB1bmtub3duKSA9PiAhIWUuc2hpZnRLZXksXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgdGFibGUuc2V0Um93U2VsZWN0aW9uID0gdXBkYXRlciA9PlxuICAgICAgdGFibGUub3B0aW9ucy5vblJvd1NlbGVjdGlvbkNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgdGFibGUucmVzZXRSb3dTZWxlY3Rpb24gPSBkZWZhdWx0U3RhdGUgPT5cbiAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbihcbiAgICAgICAgZGVmYXVsdFN0YXRlID8ge30gOiB0YWJsZS5pbml0aWFsU3RhdGUucm93U2VsZWN0aW9uID8/IHt9XG4gICAgICApXG4gICAgdGFibGUudG9nZ2xlQWxsUm93c1NlbGVjdGVkID0gdmFsdWUgPT4ge1xuICAgICAgdGFibGUuc2V0Um93U2VsZWN0aW9uKG9sZCA9PiB7XG4gICAgICAgIHZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiAhdGFibGUuZ2V0SXNBbGxSb3dzU2VsZWN0ZWQoKVxuXG4gICAgICAgIGNvbnN0IHJvd1NlbGVjdGlvbiA9IHsgLi4ub2xkIH1cblxuICAgICAgICBjb25zdCBwcmVHcm91cGVkRmxhdFJvd3MgPSB0YWJsZS5nZXRQcmVHcm91cGVkUm93TW9kZWwoKS5mbGF0Um93c1xuXG4gICAgICAgIC8vIFdlIGRvbid0IHVzZSBgbXV0YXRlUm93SXNTZWxlY3RlZGAgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgICAgLy8gQWxsIG9mIHRoZSByb3dzIGFyZSBmbGF0IGFscmVhZHksIHNvIGl0IHdvdWxkbid0IGJlIHdvcnRoIGl0XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHByZUdyb3VwZWRGbGF0Um93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5nZXRDYW5TZWxlY3QoKSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd1NlbGVjdGlvbltyb3cuaWRdID0gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlR3JvdXBlZEZsYXRSb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSByb3dTZWxlY3Rpb25bcm93LmlkXVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm93U2VsZWN0aW9uXG4gICAgICB9KVxuICAgIH1cbiAgICB0YWJsZS50b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkID0gdmFsdWUgPT5cbiAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbihvbGQgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZFZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6ICF0YWJsZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKVxuXG4gICAgICAgIGNvbnN0IHJvd1NlbGVjdGlvbjogUm93U2VsZWN0aW9uU3RhdGUgPSB7IC4uLm9sZCB9XG5cbiAgICAgICAgdGFibGUuZ2V0Um93TW9kZWwoKS5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICBtdXRhdGVSb3dJc1NlbGVjdGVkKHJvd1NlbGVjdGlvbiwgcm93LmlkLCByZXNvbHZlZFZhbHVlLCB0cnVlLCB0YWJsZSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcm93U2VsZWN0aW9uXG4gICAgICB9KVxuXG4gICAgLy8gYWRkUm93U2VsZWN0aW9uUmFuZ2U6IHJvd0lkID0+IHtcbiAgICAvLyAgIGNvbnN0IHtcbiAgICAvLyAgICAgcm93cyxcbiAgICAvLyAgICAgcm93c0J5SWQsXG4gICAgLy8gICAgIG9wdGlvbnM6IHsgc2VsZWN0R3JvdXBpbmdSb3dzLCBzZWxlY3RTdWJSb3dzIH0sXG4gICAgLy8gICB9ID0gdGFibGVcblxuICAgIC8vICAgY29uc3QgZmluZFNlbGVjdGVkUm93ID0gKHJvd3M6IFJvd1tdKSA9PiB7XG4gICAgLy8gICAgIGxldCBmb3VuZFxuICAgIC8vICAgICByb3dzLmZpbmQoZCA9PiB7XG4gICAgLy8gICAgICAgaWYgKGQuZ2V0SXNTZWxlY3RlZCgpKSB7XG4gICAgLy8gICAgICAgICBmb3VuZCA9IGRcbiAgICAvLyAgICAgICAgIHJldHVybiB0cnVlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIGNvbnN0IHN1YkZvdW5kID0gZmluZFNlbGVjdGVkUm93KGQuc3ViUm93cyB8fCBbXSlcbiAgICAvLyAgICAgICBpZiAoc3ViRm91bmQpIHtcbiAgICAvLyAgICAgICAgIGZvdW5kID0gc3ViRm91bmRcbiAgICAvLyAgICAgICAgIHJldHVybiB0cnVlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIHJldHVybiBmYWxzZVxuICAgIC8vICAgICB9KVxuICAgIC8vICAgICByZXR1cm4gZm91bmRcbiAgICAvLyAgIH1cblxuICAgIC8vICAgY29uc3QgZmlyc3RSb3cgPSBmaW5kU2VsZWN0ZWRSb3cocm93cykgfHwgcm93c1swXVxuICAgIC8vICAgY29uc3QgbGFzdFJvdyA9IHJvd3NCeUlkW3Jvd0lkXVxuXG4gICAgLy8gICBsZXQgaW5jbHVkZSA9IGZhbHNlXG4gICAgLy8gICBjb25zdCBzZWxlY3RlZFJvd0lkcyA9IHt9XG5cbiAgICAvLyAgIGNvbnN0IGFkZFJvdyA9IChyb3c6IFJvdykgPT4ge1xuICAgIC8vICAgICBtdXRhdGVSb3dJc1NlbGVjdGVkKHNlbGVjdGVkUm93SWRzLCByb3cuaWQsIHRydWUsIHtcbiAgICAvLyAgICAgICByb3dzQnlJZCxcbiAgICAvLyAgICAgICBzZWxlY3RHcm91cGluZ1Jvd3M6IHNlbGVjdEdyb3VwaW5nUm93cyEsXG4gICAgLy8gICAgICAgc2VsZWN0U3ViUm93czogc2VsZWN0U3ViUm93cyEsXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG5cbiAgICAvLyAgIHRhYmxlLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIC8vICAgICBjb25zdCBpc0ZpcnN0Um93ID0gcm93LmlkID09PSBmaXJzdFJvdy5pZFxuICAgIC8vICAgICBjb25zdCBpc0xhc3RSb3cgPSByb3cuaWQgPT09IGxhc3RSb3cuaWRcblxuICAgIC8vICAgICBpZiAoaXNGaXJzdFJvdyB8fCBpc0xhc3RSb3cpIHtcbiAgICAvLyAgICAgICBpZiAoIWluY2x1ZGUpIHtcbiAgICAvLyAgICAgICAgIGluY2x1ZGUgPSB0cnVlXG4gICAgLy8gICAgICAgfSBlbHNlIGlmIChpbmNsdWRlKSB7XG4gICAgLy8gICAgICAgICBhZGRSb3cocm93KVxuICAgIC8vICAgICAgICAgaW5jbHVkZSA9IGZhbHNlXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGluY2x1ZGUpIHtcbiAgICAvLyAgICAgICBhZGRSb3cocm93KVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9KVxuXG4gICAgLy8gICB0YWJsZS5zZXRSb3dTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJZHMpXG4gICAgLy8gfSxcbiAgICB0YWJsZS5nZXRQcmVTZWxlY3RlZFJvd01vZGVsID0gKCkgPT4gdGFibGUuZ2V0Q29yZVJvd01vZGVsKClcbiAgICB0YWJsZS5nZXRTZWxlY3RlZFJvd01vZGVsID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbiwgdGFibGUuZ2V0Q29yZVJvd01vZGVsKCldLFxuICAgICAgKHJvd1NlbGVjdGlvbiwgcm93TW9kZWwpID0+IHtcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhyb3dTZWxlY3Rpb24pLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3dzOiBbXSxcbiAgICAgICAgICAgIGZsYXRSb3dzOiBbXSxcbiAgICAgICAgICAgIHJvd3NCeUlkOiB7fSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZWN0Um93c0ZuKHRhYmxlLCByb3dNb2RlbClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFNlbGVjdGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsID0gbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRTdGF0ZSgpLnJvd1NlbGVjdGlvbiwgdGFibGUuZ2V0RmlsdGVyZWRSb3dNb2RlbCgpXSxcbiAgICAgIChyb3dTZWxlY3Rpb24sIHJvd01vZGVsKSA9PiB7XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMocm93U2VsZWN0aW9uKS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93czogW10sXG4gICAgICAgICAgICBmbGF0Um93czogW10sXG4gICAgICAgICAgICByb3dzQnlJZDoge30sXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFJvd3NGbih0YWJsZSwgcm93TW9kZWwpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgICAgICdnZXRGaWx0ZXJlZFNlbGVjdGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxuXG4gICAgdGFibGUuZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWwgPSBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uLCB0YWJsZS5nZXRTb3J0ZWRSb3dNb2RlbCgpXSxcbiAgICAgIChyb3dTZWxlY3Rpb24sIHJvd01vZGVsKSA9PiB7XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMocm93U2VsZWN0aW9uKS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93czogW10sXG4gICAgICAgICAgICBmbGF0Um93czogW10sXG4gICAgICAgICAgICByb3dzQnlJZDoge30sXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFJvd3NGbih0YWJsZSwgcm93TW9kZWwpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJiAnZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxuXG4gICAgLy8vXG5cbiAgICAvLyBnZXRHcm91cGluZ1Jvd0NhblNlbGVjdDogcm93SWQgPT4ge1xuICAgIC8vICAgY29uc3Qgcm93ID0gdGFibGUuZ2V0Um93KHJvd0lkKVxuXG4gICAgLy8gICBpZiAoIXJvdykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIC8vICAgfVxuXG4gICAgLy8gICBpZiAodHlwZW9mIHRhYmxlLm9wdGlvbnMuZW5hYmxlR3JvdXBpbmdSb3dTZWxlY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRhYmxlLm9wdGlvbnMuZW5hYmxlR3JvdXBpbmdSb3dTZWxlY3Rpb24ocm93KVxuICAgIC8vICAgfVxuXG4gICAgLy8gICByZXR1cm4gdGFibGUub3B0aW9ucy5lbmFibGVHcm91cGluZ1Jvd1NlbGVjdGlvbiA/PyBmYWxzZVxuICAgIC8vIH0sXG5cbiAgICB0YWJsZS5nZXRJc0FsbFJvd3NTZWxlY3RlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByZUdyb3VwZWRGbGF0Um93cyA9IHRhYmxlLmdldEZpbHRlcmVkUm93TW9kZWwoKS5mbGF0Um93c1xuICAgICAgY29uc3QgeyByb3dTZWxlY3Rpb24gfSA9IHRhYmxlLmdldFN0YXRlKClcblxuICAgICAgbGV0IGlzQWxsUm93c1NlbGVjdGVkID0gQm9vbGVhbihcbiAgICAgICAgcHJlR3JvdXBlZEZsYXRSb3dzLmxlbmd0aCAmJiBPYmplY3Qua2V5cyhyb3dTZWxlY3Rpb24pLmxlbmd0aFxuICAgICAgKVxuXG4gICAgICBpZiAoaXNBbGxSb3dzU2VsZWN0ZWQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZUdyb3VwZWRGbGF0Um93cy5zb21lKFxuICAgICAgICAgICAgcm93ID0+IHJvdy5nZXRDYW5TZWxlY3QoKSAmJiAhcm93U2VsZWN0aW9uW3Jvdy5pZF1cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlzQWxsUm93c1NlbGVjdGVkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNBbGxSb3dzU2VsZWN0ZWRcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwYWdpbmF0aW9uRmxhdFJvd3MgPSB0YWJsZVxuICAgICAgICAuZ2V0UGFnaW5hdGlvblJvd01vZGVsKClcbiAgICAgICAgLmZsYXRSb3dzLmZpbHRlcihyb3cgPT4gcm93LmdldENhblNlbGVjdCgpKVxuICAgICAgY29uc3QgeyByb3dTZWxlY3Rpb24gfSA9IHRhYmxlLmdldFN0YXRlKClcblxuICAgICAgbGV0IGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9ICEhcGFnaW5hdGlvbkZsYXRSb3dzLmxlbmd0aFxuXG4gICAgICBpZiAoXG4gICAgICAgIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCAmJlxuICAgICAgICBwYWdpbmF0aW9uRmxhdFJvd3Muc29tZShyb3cgPT4gIXJvd1NlbGVjdGlvbltyb3cuaWRdKVxuICAgICAgKSB7XG4gICAgICAgIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWRcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRJc1NvbWVSb3dzU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0b3RhbFNlbGVjdGVkID0gT2JqZWN0LmtleXMoXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkucm93U2VsZWN0aW9uID8/IHt9XG4gICAgICApLmxlbmd0aFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdG90YWxTZWxlY3RlZCA+IDAgJiZcbiAgICAgICAgdG90YWxTZWxlY3RlZCA8IHRhYmxlLmdldEZpbHRlcmVkUm93TW9kZWwoKS5mbGF0Um93cy5sZW5ndGhcbiAgICAgIClcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGFnaW5hdGlvbkZsYXRSb3dzID0gdGFibGUuZ2V0UGFnaW5hdGlvblJvd01vZGVsKCkuZmxhdFJvd3NcbiAgICAgIHJldHVybiB0YWJsZS5nZXRJc0FsbFBhZ2VSb3dzU2VsZWN0ZWQoKVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogcGFnaW5hdGlvbkZsYXRSb3dzXG4gICAgICAgICAgICAuZmlsdGVyKHJvdyA9PiByb3cuZ2V0Q2FuU2VsZWN0KCkpXG4gICAgICAgICAgICAuc29tZShkID0+IGQuZ2V0SXNTZWxlY3RlZCgpIHx8IGQuZ2V0SXNTb21lU2VsZWN0ZWQoKSlcbiAgICB9XG5cbiAgICB0YWJsZS5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRhYmxlLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZChcbiAgICAgICAgICAoKGUgYXMgTW91c2VFdmVudCkudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWRcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhYmxlLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRhYmxlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQoXG4gICAgICAgICAgKChlIGFzIE1vdXNlRXZlbnQpLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cudG9nZ2xlU2VsZWN0ZWQgPSAodmFsdWUsIG9wdHMpID0+IHtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByb3cuZ2V0SXNTZWxlY3RlZCgpXG5cbiAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbihvbGQgPT4ge1xuICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6ICFpc1NlbGVjdGVkXG5cbiAgICAgICAgaWYgKHJvdy5nZXRDYW5TZWxlY3QoKSAmJiBpc1NlbGVjdGVkID09PSB2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBvbGRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUm93SWRzID0geyAuLi5vbGQgfVxuXG4gICAgICAgIG11dGF0ZVJvd0lzU2VsZWN0ZWQoXG4gICAgICAgICAgc2VsZWN0ZWRSb3dJZHMsXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG9wdHM/LnNlbGVjdENoaWxkcmVuID8/IHRydWUsXG4gICAgICAgICAgdGFibGVcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkc1xuICAgICAgfSlcbiAgICB9XG4gICAgcm93LmdldElzU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJvd1NlbGVjdGlvbiB9ID0gdGFibGUuZ2V0U3RhdGUoKVxuICAgICAgcmV0dXJuIGlzUm93U2VsZWN0ZWQocm93LCByb3dTZWxlY3Rpb24pXG4gICAgfVxuXG4gICAgcm93LmdldElzU29tZVNlbGVjdGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyByb3dTZWxlY3Rpb24gfSA9IHRhYmxlLmdldFN0YXRlKClcbiAgICAgIHJldHVybiBpc1N1YlJvd1NlbGVjdGVkKHJvdywgcm93U2VsZWN0aW9uLCB0YWJsZSkgPT09ICdzb21lJ1xuICAgIH1cblxuICAgIHJvdy5nZXRJc0FsbFN1YlJvd3NTZWxlY3RlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcm93U2VsZWN0aW9uIH0gPSB0YWJsZS5nZXRTdGF0ZSgpXG4gICAgICByZXR1cm4gaXNTdWJSb3dTZWxlY3RlZChyb3csIHJvd1NlbGVjdGlvbiwgdGFibGUpID09PSAnYWxsJ1xuICAgIH1cblxuICAgIHJvdy5nZXRDYW5TZWxlY3QgPSAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlLm9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbihyb3cpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbiA/PyB0cnVlXG4gICAgfVxuXG4gICAgcm93LmdldENhblNlbGVjdFN1YlJvd3MgPSAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlLm9wdGlvbnMuZW5hYmxlU3ViUm93U2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbihyb3cpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZVN1YlJvd1NlbGVjdGlvbiA/PyB0cnVlXG4gICAgfVxuXG4gICAgcm93LmdldENhbk11bHRpU2VsZWN0ID0gKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZS5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5vcHRpb25zLmVuYWJsZU11bHRpUm93U2VsZWN0aW9uKHJvdylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlLm9wdGlvbnMuZW5hYmxlTXVsdGlSb3dTZWxlY3Rpb24gPz8gdHJ1ZVxuICAgIH1cbiAgICByb3cuZ2V0VG9nZ2xlU2VsZWN0ZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgY2FuU2VsZWN0ID0gcm93LmdldENhblNlbGVjdCgpXG5cbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIWNhblNlbGVjdCkgcmV0dXJuXG4gICAgICAgIHJvdy50b2dnbGVTZWxlY3RlZChcbiAgICAgICAgICAoKGUgYXMgTW91c2VFdmVudCkudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59XG5cbmNvbnN0IG11dGF0ZVJvd0lzU2VsZWN0ZWQgPSA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgc2VsZWN0ZWRSb3dJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LFxuICBpZDogc3RyaW5nLFxuICB2YWx1ZTogYm9vbGVhbixcbiAgaW5jbHVkZUNoaWxkcmVuOiBib29sZWFuLFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pID0+IHtcbiAgY29uc3Qgcm93ID0gdGFibGUuZ2V0Um93KGlkKVxuXG4gIC8vIGNvbnN0IGlzR3JvdXBlZCA9IHJvdy5nZXRJc0dyb3VwZWQoKVxuXG4gIC8vIGlmICggLy8gVE9ETzogZW5mb3JjZSBncm91cGluZyByb3cgc2VsZWN0aW9uIHJ1bGVzXG4gIC8vICAgIWlzR3JvdXBlZCB8fFxuICAvLyAgIChpc0dyb3VwZWQgJiYgdGFibGUub3B0aW9ucy5lbmFibGVHcm91cGluZ1Jvd1NlbGVjdGlvbilcbiAgLy8gKSB7XG4gIGlmICh2YWx1ZSkge1xuICAgIGlmICghcm93LmdldENhbk11bHRpU2VsZWN0KCkpIHtcbiAgICAgIE9iamVjdC5rZXlzKHNlbGVjdGVkUm93SWRzKS5mb3JFYWNoKGtleSA9PiBkZWxldGUgc2VsZWN0ZWRSb3dJZHNba2V5XSlcbiAgICB9XG4gICAgaWYgKHJvdy5nZXRDYW5TZWxlY3QoKSkge1xuICAgICAgc2VsZWN0ZWRSb3dJZHNbaWRdID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgc2VsZWN0ZWRSb3dJZHNbaWRdXG4gIH1cbiAgLy8gfVxuXG4gIGlmIChpbmNsdWRlQ2hpbGRyZW4gJiYgcm93LnN1YlJvd3M/Lmxlbmd0aCAmJiByb3cuZ2V0Q2FuU2VsZWN0U3ViUm93cygpKSB7XG4gICAgcm93LnN1YlJvd3MuZm9yRWFjaChyb3cgPT5cbiAgICAgIG11dGF0ZVJvd0lzU2VsZWN0ZWQoc2VsZWN0ZWRSb3dJZHMsIHJvdy5pZCwgdmFsdWUsIGluY2x1ZGVDaGlsZHJlbiwgdGFibGUpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSb3dzRm48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgcm93TW9kZWw6IFJvd01vZGVsPFREYXRhPlxuKTogUm93TW9kZWw8VERhdGE+IHtcbiAgY29uc3Qgcm93U2VsZWN0aW9uID0gdGFibGUuZ2V0U3RhdGUoKS5yb3dTZWxlY3Rpb25cblxuICBjb25zdCBuZXdTZWxlY3RlZEZsYXRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuICBjb25zdCBuZXdTZWxlY3RlZFJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PiA9IHt9XG5cbiAgLy8gRmlsdGVycyB0b3AgbGV2ZWwgYW5kIG5lc3RlZCByb3dzXG4gIGNvbnN0IHJlY3Vyc2VSb3dzID0gKHJvd3M6IFJvdzxURGF0YT5bXSwgZGVwdGggPSAwKTogUm93PFREYXRhPltdID0+IHtcbiAgICByZXR1cm4gcm93c1xuICAgICAgLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gaXNSb3dTZWxlY3RlZChyb3csIHJvd1NlbGVjdGlvbilcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgIG5ld1NlbGVjdGVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgbmV3U2VsZWN0ZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCkge1xuICAgICAgICAgIHJvdyA9IHtcbiAgICAgICAgICAgIC4uLnJvdyxcbiAgICAgICAgICAgIHN1YlJvd3M6IHJlY3Vyc2VSb3dzKHJvdy5zdWJSb3dzLCBkZXB0aCArIDEpLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBSb3c8VERhdGE+W11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93czogcmVjdXJzZVJvd3Mocm93TW9kZWwucm93cyksXG4gICAgZmxhdFJvd3M6IG5ld1NlbGVjdGVkRmxhdFJvd3MsXG4gICAgcm93c0J5SWQ6IG5ld1NlbGVjdGVkUm93c0J5SWQsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUm93U2VsZWN0ZWQ8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgcm93OiBSb3c8VERhdGE+LFxuICBzZWxlY3Rpb246IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlbGVjdGlvbltyb3cuaWRdID8/IGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N1YlJvd1NlbGVjdGVkPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIHJvdzogUm93PFREYXRhPixcbiAgc2VsZWN0aW9uOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPixcbiAgdGFibGU6IFRhYmxlPFREYXRhPlxuKTogYm9vbGVhbiB8ICdzb21lJyB8ICdhbGwnIHtcbiAgaWYgKCFyb3cuc3ViUm93cz8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICBsZXQgYWxsQ2hpbGRyZW5TZWxlY3RlZCA9IHRydWVcbiAgbGV0IHNvbWVTZWxlY3RlZCA9IGZhbHNlXG5cbiAgcm93LnN1YlJvd3MuZm9yRWFjaChzdWJSb3cgPT4ge1xuICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHdlIGtub3cgYm90aCBvZiB0aGVzZVxuICAgIGlmIChzb21lU2VsZWN0ZWQgJiYgIWFsbENoaWxkcmVuU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzdWJSb3cuZ2V0Q2FuU2VsZWN0KCkpIHtcbiAgICAgIGlmIChpc1Jvd1NlbGVjdGVkKHN1YlJvdywgc2VsZWN0aW9uKSkge1xuICAgICAgICBzb21lU2VsZWN0ZWQgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxDaGlsZHJlblNlbGVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayByb3cgc2VsZWN0aW9uIG9mIG5lc3RlZCBzdWJyb3dzXG4gICAgaWYgKHN1YlJvdy5zdWJSb3dzICYmIHN1YlJvdy5zdWJSb3dzLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc3ViUm93Q2hpbGRyZW5TZWxlY3RlZCA9IGlzU3ViUm93U2VsZWN0ZWQoc3ViUm93LCBzZWxlY3Rpb24sIHRhYmxlKVxuICAgICAgaWYgKHN1YlJvd0NoaWxkcmVuU2VsZWN0ZWQgPT09ICdhbGwnKSB7XG4gICAgICAgIHNvbWVTZWxlY3RlZCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3ViUm93Q2hpbGRyZW5TZWxlY3RlZCA9PT0gJ3NvbWUnKSB7XG4gICAgICAgIHNvbWVTZWxlY3RlZCA9IHRydWVcbiAgICAgICAgYWxsQ2hpbGRyZW5TZWxlY3RlZCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxDaGlsZHJlblNlbGVjdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGFsbENoaWxkcmVuU2VsZWN0ZWQgPyAnYWxsJyA6IHNvbWVTZWxlY3RlZCA/ICdzb21lJyA6IGZhbHNlXG59XG4iLCJpbXBvcnQgeyBTb3J0aW5nRm4gfSBmcm9tICcuL2ZlYXR1cmVzL1NvcnRpbmcnXG5cbmV4cG9ydCBjb25zdCByZVNwbGl0QWxwaGFOdW1lcmljID0gLyhbMC05XSspL2dtXG5cbmNvbnN0IGFscGhhbnVtZXJpYzogU29ydGluZ0ZuPGFueT4gPSAocm93QSwgcm93QiwgY29sdW1uSWQpID0+IHtcbiAgcmV0dXJuIGNvbXBhcmVBbHBoYW51bWVyaWMoXG4gICAgdG9TdHJpbmcocm93QS5nZXRWYWx1ZShjb2x1bW5JZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgdG9TdHJpbmcocm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpLnRvTG93ZXJDYXNlKClcbiAgKVxufVxuXG5jb25zdCBhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlOiBTb3J0aW5nRm48YW55PiA9IChyb3dBLCByb3dCLCBjb2x1bW5JZCkgPT4ge1xuICByZXR1cm4gY29tcGFyZUFscGhhbnVtZXJpYyhcbiAgICB0b1N0cmluZyhyb3dBLmdldFZhbHVlKGNvbHVtbklkKSksXG4gICAgdG9TdHJpbmcocm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpXG4gIClcbn1cblxuLy8gVGhlIHRleHQgZmlsdGVyIGlzIG1vcmUgYmFzaWMgKGxlc3MgbnVtZXJpYyBzdXBwb3J0KVxuLy8gYnV0IGlzIG11Y2ggZmFzdGVyXG5jb25zdCB0ZXh0OiBTb3J0aW5nRm48YW55PiA9IChyb3dBLCByb3dCLCBjb2x1bW5JZCkgPT4ge1xuICByZXR1cm4gY29tcGFyZUJhc2ljKFxuICAgIHRvU3RyaW5nKHJvd0EuZ2V0VmFsdWUoY29sdW1uSWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgIHRvU3RyaW5nKHJvd0IuZ2V0VmFsdWUoY29sdW1uSWQpKS50b0xvd2VyQ2FzZSgpXG4gIClcbn1cblxuLy8gVGhlIHRleHQgZmlsdGVyIGlzIG1vcmUgYmFzaWMgKGxlc3MgbnVtZXJpYyBzdXBwb3J0KVxuLy8gYnV0IGlzIG11Y2ggZmFzdGVyXG5jb25zdCB0ZXh0Q2FzZVNlbnNpdGl2ZTogU29ydGluZ0ZuPGFueT4gPSAocm93QSwgcm93QiwgY29sdW1uSWQpID0+IHtcbiAgcmV0dXJuIGNvbXBhcmVCYXNpYyhcbiAgICB0b1N0cmluZyhyb3dBLmdldFZhbHVlKGNvbHVtbklkKSksXG4gICAgdG9TdHJpbmcocm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpXG4gIClcbn1cblxuY29uc3QgZGF0ZXRpbWU6IFNvcnRpbmdGbjxhbnk+ID0gKHJvd0EsIHJvd0IsIGNvbHVtbklkKSA9PiB7XG4gIGNvbnN0IGEgPSByb3dBLmdldFZhbHVlPERhdGU+KGNvbHVtbklkKVxuICBjb25zdCBiID0gcm93Qi5nZXRWYWx1ZTxEYXRlPihjb2x1bW5JZClcblxuICAvLyBDYW4gaGFuZGxlIG51bGxpc2ggdmFsdWVzXG4gIC8vIFVzZSA+IGFuZCA8IGJlY2F1c2UgPT0gKGFuZCA9PT0pIGRvZXNuJ3Qgd29yayB3aXRoXG4gIC8vIERhdGUgb2JqZWN0cyAod291bGQgcmVxdWlyZSBjYWxsaW5nIGdldFRpbWUoKSkuXG4gIHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMFxufVxuXG5jb25zdCBiYXNpYzogU29ydGluZ0ZuPGFueT4gPSAocm93QSwgcm93QiwgY29sdW1uSWQpID0+IHtcbiAgcmV0dXJuIGNvbXBhcmVCYXNpYyhyb3dBLmdldFZhbHVlKGNvbHVtbklkKSwgcm93Qi5nZXRWYWx1ZShjb2x1bW5JZCkpXG59XG5cbi8vIFV0aWxzXG5cbmZ1bmN0aW9uIGNvbXBhcmVCYXNpYyhhOiBhbnksIGI6IGFueSkge1xuICByZXR1cm4gYSA9PT0gYiA/IDAgOiBhID4gYiA/IDEgOiAtMVxufVxuXG5mdW5jdGlvbiB0b1N0cmluZyhhOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiBhID09PSAnbnVtYmVyJykge1xuICAgIGlmIChpc05hTihhKSB8fCBhID09PSBJbmZpbml0eSB8fCBhID09PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGEpXG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhXG4gIH1cbiAgcmV0dXJuICcnXG59XG5cbi8vIE1peGVkIHNvcnRpbmcgaXMgc2xvdywgYnV0IHZlcnkgaW5jbHVzaXZlIG9mIG1hbnkgZWRnZSBjYXNlcy5cbi8vIEl0IGhhbmRsZXMgbnVtYmVycywgbWl4ZWQgYWxwaGFudW1lcmljIGNvbWJpbmF0aW9ucywgYW5kIGV2ZW5cbi8vIG51bGwsIHVuZGVmaW5lZCwgYW5kIEluZmluaXR5XG5mdW5jdGlvbiBjb21wYXJlQWxwaGFudW1lcmljKGFTdHI6IHN0cmluZywgYlN0cjogc3RyaW5nKSB7XG4gIC8vIFNwbGl0IG9uIG51bWJlciBncm91cHMsIGJ1dCBrZWVwIHRoZSBkZWxpbWl0ZXJcbiAgLy8gVGhlbiByZW1vdmUgZmFsc2V5IHNwbGl0IHZhbHVlc1xuICBjb25zdCBhID0gYVN0ci5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5maWx0ZXIoQm9vbGVhbilcbiAgY29uc3QgYiA9IGJTdHIuc3BsaXQocmVTcGxpdEFscGhhTnVtZXJpYykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgLy8gV2hpbGVcbiAgd2hpbGUgKGEubGVuZ3RoICYmIGIubGVuZ3RoKSB7XG4gICAgY29uc3QgYWEgPSBhLnNoaWZ0KCkhXG4gICAgY29uc3QgYmIgPSBiLnNoaWZ0KCkhXG5cbiAgICBjb25zdCBhbiA9IHBhcnNlSW50KGFhLCAxMClcbiAgICBjb25zdCBibiA9IHBhcnNlSW50KGJiLCAxMClcblxuICAgIGNvbnN0IGNvbWJvID0gW2FuLCBibl0uc29ydCgpXG5cbiAgICAvLyBCb3RoIGFyZSBzdHJpbmdcbiAgICBpZiAoaXNOYU4oY29tYm9bMF0hKSkge1xuICAgICAgaWYgKGFhID4gYmIpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICAgIGlmIChiYiA+IGFhKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBPbmUgaXMgYSBzdHJpbmcsIG9uZSBpcyBhIG51bWJlclxuICAgIGlmIChpc05hTihjb21ib1sxXSEpKSB7XG4gICAgICByZXR1cm4gaXNOYU4oYW4pID8gLTEgOiAxXG4gICAgfVxuXG4gICAgLy8gQm90aCBhcmUgbnVtYmVyc1xuICAgIGlmIChhbiA+IGJuKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgICBpZiAoYm4gPiBhbikge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGhcbn1cblxuLy8gRXhwb3J0c1xuXG5leHBvcnQgY29uc3Qgc29ydGluZ0ZucyA9IHtcbiAgYWxwaGFudW1lcmljLFxuICBhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlLFxuICB0ZXh0LFxuICB0ZXh0Q2FzZVNlbnNpdGl2ZSxcbiAgZGF0ZXRpbWUsXG4gIGJhc2ljLFxufVxuXG5leHBvcnQgdHlwZSBCdWlsdEluU29ydGluZ0ZuID0ga2V5b2YgdHlwZW9mIHNvcnRpbmdGbnNcbiIsImltcG9ydCB7IFJvd01vZGVsIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHtcbiAgQnVpbHRJblNvcnRpbmdGbixcbiAgcmVTcGxpdEFscGhhTnVtZXJpYyxcbiAgc29ydGluZ0Zucyxcbn0gZnJvbSAnLi4vc29ydGluZ0ZucydcblxuaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgUm93LFxuICBVcGRhdGVyLFxuICBSb3dEYXRhLFxuICBTb3J0aW5nRm5zLFxufSBmcm9tICcuLi90eXBlcydcblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgbWFrZVN0YXRlVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBTb3J0RGlyZWN0aW9uID0gJ2FzYycgfCAnZGVzYydcblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5Tb3J0IHtcbiAgZGVzYzogYm9vbGVhblxuICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFNvcnRpbmdTdGF0ZSA9IENvbHVtblNvcnRbXVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmdUYWJsZVN0YXRlIHtcbiAgc29ydGluZzogU29ydGluZ1N0YXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydGluZ0ZuPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAocm93QTogUm93PFREYXRhPiwgcm93QjogUm93PFREYXRhPiwgY29sdW1uSWQ6IHN0cmluZyk6IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBDdXN0b21Tb3J0aW5nRm5zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4gPSBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgU29ydGluZ0ZuPFREYXRhPlxuPlxuXG5leHBvcnQgdHlwZSBTb3J0aW5nRm5PcHRpb248VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiA9XG4gIHwgJ2F1dG8nXG4gIHwga2V5b2YgU29ydGluZ0Zuc1xuICB8IEJ1aWx0SW5Tb3J0aW5nRm5cbiAgfCBTb3J0aW5nRm48VERhdGE+XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydGluZ0NvbHVtbkRlZjxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIEVuYWJsZXMvRGlzYWJsZXMgbXVsdGktc29ydGluZyBmb3IgdGhpcyBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNlbmFibGVtdWx0aXNvcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZW5hYmxlTXVsdGlTb3J0PzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9EaXNhYmxlcyBzb3J0aW5nIGZvciB0aGlzIGNvbHVtbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2VuYWJsZXNvcnRpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZW5hYmxlU29ydGluZz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEludmVydHMgdGhlIG9yZGVyIG9mIHRoZSBzb3J0aW5nIGZvciB0aGlzIGNvbHVtbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHZhbHVlcyB0aGF0IGhhdmUgYW4gaW52ZXJ0ZWQgYmVzdC93b3JzdCBzY2FsZSB3aGVyZSBsb3dlciBudW1iZXJzIGFyZSBiZXR0ZXIsIGVnLiBhIHJhbmtpbmcgKDFzdCwgMm5kLCAzcmQpIG9yIGdvbGYtbGlrZSBzY29yaW5nXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNpbnZlcnRzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGludmVydFNvcnRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBzb3J0aW5nIHRvZ2dsZXMgb24gdGhpcyBjb2x1bW4gdG8gc3RhcnQgaW4gdGhlIGRlc2NlbmRpbmcgZGlyZWN0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjc29ydGRlc2NmaXJzdClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBzb3J0RGVzY0ZpcnN0PzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIHNvcnRpbmcgZnVuY3Rpb24gdG8gdXNlIHdpdGggdGhpcyBjb2x1bW4uXG4gICAqIC0gQSBgc3RyaW5nYCByZWZlcmVuY2luZyBhIGJ1aWx0LWluIHNvcnRpbmcgZnVuY3Rpb25cbiAgICogLSBBIGN1c3RvbSBzb3J0aW5nIGZ1bmN0aW9uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNzb3J0aW5nZm4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgc29ydGluZ0ZuPzogU29ydGluZ0ZuT3B0aW9uPFREYXRhPlxuICAvKipcbiAgICogLSBgZmFsc2VgXG4gICAqICAgLSBVbmRlZmluZWQgdmFsdWVzIHdpbGwgYmUgY29uc2lkZXJlZCB0aWVkIGFuZCBuZWVkIHRvIGJlIHNvcnRlZCBieSB0aGUgbmV4dCBjb2x1bW4gZmlsdGVyIG9yIG9yaWdpbmFsIGluZGV4ICh3aGljaGV2ZXIgYXBwbGllcylcbiAgICogLSBgLTFgXG4gICAqICAgLSBVbmRlZmluZWQgdmFsdWVzIHdpbGwgYmUgc29ydGVkIHdpdGggaGlnaGVyIHByaW9yaXR5IChhc2NlbmRpbmcpIChpZiBhc2NlbmRpbmcsIHVuZGVmaW5lZCB3aWxsIGFwcGVhciBvbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0KVxuICAgKiAtIGAxYFxuICAgKiAgIC0gVW5kZWZpbmVkIHZhbHVlcyB3aWxsIGJlIHNvcnRlZCB3aXRoIGxvd2VyIHByaW9yaXR5IChkZXNjZW5kaW5nKSAoaWYgYXNjZW5kaW5nLCB1bmRlZmluZWQgd2lsbCBhcHBlYXIgb24gdGhlIGVuZCBvZiB0aGUgbGlzdClcbiAgICovXG4gIHNvcnRVbmRlZmluZWQ/OiBmYWxzZSB8IC0xIHwgMVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmdDb2x1bW48VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoaXMgY29sdW1uIGZyb20gdGhlIHRhYmxlJ3Mgc29ydGluZyBzdGF0ZVxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjY2xlYXJzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGNsZWFyU29ydGluZzogKCkgPT4gdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhIHNvcnQgZGlyZWN0aW9uIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGNvbHVtbnMgdmFsdWVzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0YXV0b3NvcnRkaXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0QXV0b1NvcnREaXI6ICgpID0+IFNvcnREaXJlY3Rpb25cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzb3J0aW5nIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGNvbHVtbnMgdmFsdWVzLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0YXV0b3NvcnRpbmdmbilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRBdXRvU29ydGluZ0ZuOiAoKSA9PiBTb3J0aW5nRm48VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb2x1bW4gY2FuIGJlIG11bHRpLXNvcnRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2dldGNhbm11bHRpc29ydClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRDYW5NdWx0aVNvcnQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbHVtbiBjYW4gYmUgc29ydGVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0Y2Fuc29ydClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRDYW5Tb3J0OiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBkaXJlY3Rpb24gdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHNvcnRpbmcgdGhpcyBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNnZXRmaXJzdHNvcnRkaXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0Rmlyc3RTb3J0RGlyOiAoKSA9PiBTb3J0RGlyZWN0aW9uXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNvcnQgZGlyZWN0aW9uIG9mIHRoaXMgY29sdW1uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0aXNzb3J0ZWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0SXNTb3J0ZWQ6ICgpID0+IGZhbHNlIHwgU29ydERpcmVjdGlvblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmV4dCBzb3J0aW5nIG9yZGVyLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0bmV4dHNvcnRpbmdvcmRlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXROZXh0U29ydGluZ09yZGVyOiAoKSA9PiBTb3J0RGlyZWN0aW9uIHwgZmFsc2VcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoaXMgY29sdW1uJ3Mgc29ydGluZyB3aXRoaW4gdGhlIHNvcnRpbmcgc3RhdGVcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2dldHNvcnRpbmRleClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRTb3J0SW5kZXg6ICgpID0+IG51bWJlclxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgc29ydGluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciB0aGlzIGNvbHVtblxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0c29ydGluZ2ZuKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGdldFNvcnRpbmdGbjogKCkgPT4gU29ydGluZ0ZuPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gdG9nZ2xlIHRoaXMgY29sdW1uJ3Mgc29ydGluZyBzdGF0ZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGF0dGFjaGluZyBhIGNsaWNrIGhhbmRsZXIgdG8gdGhlIGNvbHVtbiBoZWFkZXIuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNnZXR0b2dnbGVzb3J0aW5naGFuZGxlcilcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBnZXRUb2dnbGVTb3J0aW5nSGFuZGxlcjogKCkgPT4gdW5kZWZpbmVkIHwgKChldmVudDogdW5rbm93bikgPT4gdm9pZClcbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhpcyBjb2x1bW5zIHNvcnRpbmcgc3RhdGUuIElmIGBkZXNjYCBpcyBwcm92aWRlZCwgaXQgd2lsbCBmb3JjZSB0aGUgc29ydCBkaXJlY3Rpb24gdG8gdGhhdCB2YWx1ZS4gSWYgYGlzTXVsdGlgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGFkZGl0aXZpdHkgbXVsdGktc29ydCB0aGUgY29sdW1uIChvciB0b2dnbGUgaXQgaWYgaXQgaXMgYWxyZWFkeSBzb3J0ZWQpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjdG9nZ2xlc29ydGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICB0b2dnbGVTb3J0aW5nOiAoZGVzYz86IGJvb2xlYW4sIGlzTXVsdGk/OiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBTb3J0aW5nT3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgYWJpbGl0eSB0byByZW1vdmUgbXVsdGktc29ydHNcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2VuYWJsZW11bHRpcmVtb3ZlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGVuYWJsZU11bHRpUmVtb3ZlPzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9EaXNhYmxlcyBtdWx0aS1zb3J0aW5nIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNlbmFibGVtdWx0aXNvcnQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZW5hYmxlTXVsdGlTb3J0PzogYm9vbGVhblxuICAvKipcbiAgICogRW5hYmxlcy9EaXNhYmxlcyBzb3J0aW5nIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNlbmFibGVzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGVuYWJsZVNvcnRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBFbmFibGVzL0Rpc2FibGVzIHRoZSBhYmlsaXR5IHRvIHJlbW92ZSBzb3J0aW5nIGZvciB0aGUgdGFibGUuXG4gICAqIC0gSWYgYHRydWVgIHRoZW4gY2hhbmdpbmcgc29ydCBvcmRlciB3aWxsIGNpcmNsZSBsaWtlOiAnbm9uZScgLT4gJ2Rlc2MnIC0+ICdhc2MnIC0+ICdub25lJyAtPiAuLi5cbiAgICogLSBJZiBgZmFsc2VgIHRoZW4gY2hhbmdpbmcgc29ydCBvcmRlciB3aWxsIGNpcmNsZSBsaWtlOiAnbm9uZScgLT4gJ2Rlc2MnIC0+ICdhc2MnIC0+ICdkZXNjJyAtPiAnYXNjJyAtPiAuLi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2VuYWJsZXNvcnRpbmdyZW1vdmFsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGVuYWJsZVNvcnRpbmdSZW1vdmFsPzogYm9vbGVhblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBzb3J0ZWQgcm93IG1vZGVsLiBJZiB1c2luZyBzZXJ2ZXItc2lkZSBzb3J0aW5nLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCByZXF1aXJlZC4gVG8gdXNlIGNsaWVudC1zaWRlIHNvcnRpbmcsIHBhc3MgdGhlIGV4cG9ydGVkIGBnZXRTb3J0ZWRSb3dNb2RlbCgpYCBmcm9tIHlvdXIgYWRhcHRlciB0byB5b3VyIHRhYmxlIG9yIGltcGxlbWVudCB5b3VyIG93bi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI2dldHNvcnRlZHJvd21vZGVsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIGdldFNvcnRlZFJvd01vZGVsPzogKHRhYmxlOiBUYWJsZTxhbnk+KSA9PiAoKSA9PiBSb3dNb2RlbDxhbnk+XG4gIC8qKlxuICAgKiBQYXNzIGEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhIG11bHRpLXNvcnQgZXZlbnQgc2hvdWxkIGJlIHRyaWdnZXJlZC4gSXQgaXMgcGFzc2VkIHRoZSBldmVudCBmcm9tIHRoZSBzb3J0IHRvZ2dsZSBoYW5kbGVyIGFuZCBzaG91bGQgcmV0dXJuIGB0cnVlYCBpZiB0aGUgZXZlbnQgc2hvdWxkIHRyaWdnZXIgYSBtdWx0aS1zb3J0LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjaXNtdWx0aXNvcnRldmVudClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICBpc011bHRpU29ydEV2ZW50PzogKGU6IHVua25vd24pID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEVuYWJsZXMgbWFudWFsIHNvcnRpbmcgZm9yIHRoZSB0YWJsZS4gSWYgdGhpcyBpcyBgdHJ1ZWAsIHlvdSB3aWxsIGJlIGV4cGVjdGVkIHRvIHNvcnQgeW91ciBkYXRhIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gdGhlIHRhYmxlLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGRvaW5nIHNlcnZlci1zaWRlIHNvcnRpbmcuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNtYW51YWxzb3J0aW5nKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIG1hbnVhbFNvcnRpbmc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTZXQgYSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgY2FuIGJlIG11bHRpLXNvcnRlZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI21heG11bHRpc29ydGNvbGNvdW50KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIG1heE11bHRpU29ydENvbENvdW50PzogbnVtYmVyXG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGB1cGRhdGVyRm5gIHdoZW4gYHN0YXRlLnNvcnRpbmdgIGNoYW5nZXMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGludGVybmFsIHN0YXRlIG1hbmFnZW1lbnQsIHNvIHlvdSB3aWxsIG5lZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlIGVpdGhlciBmdWxseSBvciBwYXJ0aWFsbHkgb3V0c2lkZSBvZiB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNvbnNvcnRpbmdjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgb25Tb3J0aW5nQ2hhbmdlPzogT25DaGFuZ2VGbjxTb3J0aW5nU3RhdGU+XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGFsbCBzb3J0cyB3aWxsIGRlZmF1bHQgdG8gZGVzY2VuZGluZyBhcyB0aGVpciBmaXJzdCB0b2dnbGUgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvc29ydGluZyNzb3J0ZGVzY2ZpcnN0KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvc29ydGluZylcbiAgICovXG4gIHNvcnREZXNjRmlyc3Q/OiBib29sZWFuXG59XG5cbnR5cGUgUmVzb2x2ZWRTb3J0aW5nRm5zID0ga2V5b2YgU29ydGluZ0ZucyBleHRlbmRzIG5ldmVyXG4gID8ge1xuICAgICAgc29ydGluZ0Zucz86IFJlY29yZDxzdHJpbmcsIFNvcnRpbmdGbjxhbnk+PlxuICAgIH1cbiAgOiB7XG4gICAgICBzb3J0aW5nRm5zOiBSZWNvcmQ8a2V5b2YgU29ydGluZ0ZucywgU29ydGluZ0ZuPGFueT4+XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRpbmdPcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT5cbiAgZXh0ZW5kcyBTb3J0aW5nT3B0aW9uc0Jhc2UsXG4gICAgUmVzb2x2ZWRTb3J0aW5nRm5zIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydGluZ0luc3RhbmNlPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICBfZ2V0U29ydGVkUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyBtb2RlbCBmb3IgdGhlIHRhYmxlIGJlZm9yZSBhbnkgc29ydGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0cHJlc29ydGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0UHJlU29ydGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUgYWZ0ZXIgc29ydGluZyBoYXMgYmVlbiBhcHBsaWVkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL3NvcnRpbmcjZ2V0c29ydGVkcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgZ2V0U29ydGVkUm93TW9kZWw6ICgpID0+IFJvd01vZGVsPFREYXRhPlxuICAvKipcbiAgICogUmVzZXRzIHRoZSAqKnNvcnRpbmcqKiBzdGF0ZSB0byBgaW5pdGlhbFN0YXRlLnNvcnRpbmdgLCBvciBgdHJ1ZWAgY2FuIGJlIHBhc3NlZCB0byBmb3JjZSBhIGRlZmF1bHQgYmxhbmsgc3RhdGUgcmVzZXQgdG8gYFtdYC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI3Jlc2V0c29ydGluZylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3NvcnRpbmcpXG4gICAqL1xuICByZXNldFNvcnRpbmc6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIGBzdGF0ZS5zb3J0aW5nYCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9zb3J0aW5nI3NldHNvcnRpbmcpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9zb3J0aW5nKVxuICAgKi9cbiAgc2V0U29ydGluZzogKHVwZGF0ZXI6IFVwZGF0ZXI8U29ydGluZ1N0YXRlPikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgU29ydGluZzogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IFNvcnRpbmdUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc29ydGluZzogW10sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdENvbHVtbkRlZjogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogU29ydGluZ0NvbHVtbkRlZjxURGF0YT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzb3J0aW5nRm46ICdhdXRvJyxcbiAgICAgIHNvcnRVbmRlZmluZWQ6IDEsXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRPcHRpb25zOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICB0YWJsZTogVGFibGU8VERhdGE+XG4gICk6IFNvcnRpbmdPcHRpb25zPFREYXRhPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uU29ydGluZ0NoYW5nZTogbWFrZVN0YXRlVXBkYXRlcignc29ydGluZycsIHRhYmxlKSxcbiAgICAgIGlzTXVsdGlTb3J0RXZlbnQ6IChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHJldHVybiAoZSBhcyBNb3VzZUV2ZW50KS5zaGlmdEtleVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlQ29sdW1uOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+KFxuICAgIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29sdW1uLmdldEF1dG9Tb3J0aW5nRm4gPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFJvd3MgPSB0YWJsZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3Muc2xpY2UoMTApXG5cbiAgICAgIGxldCBpc1N0cmluZyA9IGZhbHNlXG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGZpcnN0Um93cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdz8uZ2V0VmFsdWUoY29sdW1uLmlkKVxuXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICByZXR1cm4gc29ydGluZ0Zucy5kYXRldGltZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpc1N0cmluZyA9IHRydWVcblxuICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydGluZ0Zucy5hbHBoYW51bWVyaWNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzb3J0aW5nRm5zLnRleHRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNvcnRpbmdGbnMuYmFzaWNcbiAgICB9XG4gICAgY29sdW1uLmdldEF1dG9Tb3J0RGlyID0gKCkgPT4ge1xuICAgICAgY29uc3QgZmlyc3RSb3cgPSB0YWJsZS5nZXRGaWx0ZXJlZFJvd01vZGVsKCkuZmxhdFJvd3NbMF1cblxuICAgICAgY29uc3QgdmFsdWUgPSBmaXJzdFJvdz8uZ2V0VmFsdWUoY29sdW1uLmlkKVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ2FzYydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdkZXNjJ1xuICAgIH1cbiAgICBjb2x1bW4uZ2V0U29ydGluZ0ZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oY29sdW1uLmNvbHVtbkRlZi5zb3J0aW5nRm4pXG4gICAgICAgID8gY29sdW1uLmNvbHVtbkRlZi5zb3J0aW5nRm5cbiAgICAgICAgOiBjb2x1bW4uY29sdW1uRGVmLnNvcnRpbmdGbiA9PT0gJ2F1dG8nXG4gICAgICAgID8gY29sdW1uLmdldEF1dG9Tb3J0aW5nRm4oKVxuICAgICAgICA6IHRhYmxlLm9wdGlvbnMuc29ydGluZ0Zucz8uW2NvbHVtbi5jb2x1bW5EZWYuc29ydGluZ0ZuIGFzIHN0cmluZ10gPz9cbiAgICAgICAgICBzb3J0aW5nRm5zW2NvbHVtbi5jb2x1bW5EZWYuc29ydGluZ0ZuIGFzIEJ1aWx0SW5Tb3J0aW5nRm5dXG4gICAgfVxuICAgIGNvbHVtbi50b2dnbGVTb3J0aW5nID0gKGRlc2MsIG11bHRpKSA9PiB7XG4gICAgICAvLyBpZiAoY29sdW1uLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAvLyAgIGNvbHVtbi5jb2x1bW5zLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgIC8vICAgICBpZiAoYy5pZCkge1xuICAgICAgLy8gICAgICAgdGFibGUudG9nZ2xlQ29sdW1uU29ydGluZyhjLmlkLCB1bmRlZmluZWQsIG11bHRpIHx8ICEhaSlcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgIH0pXG4gICAgICAvLyAgIHJldHVyblxuICAgICAgLy8gfVxuXG4gICAgICAvLyB0aGlzIG5lZWRzIHRvIGJlIG91dHNpZGUgb2YgdGFibGUuc2V0U29ydGluZyB0byBiZSBpbiBzeW5jIHdpdGggcmVyZW5kZXJcbiAgICAgIGNvbnN0IG5leHRTb3J0aW5nT3JkZXIgPSBjb2x1bW4uZ2V0TmV4dFNvcnRpbmdPcmRlcigpXG4gICAgICBjb25zdCBoYXNNYW51YWxWYWx1ZSA9IHR5cGVvZiBkZXNjICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjICE9PSBudWxsXG5cbiAgICAgIHRhYmxlLnNldFNvcnRpbmcob2xkID0+IHtcbiAgICAgICAgLy8gRmluZCBhbnkgZXhpc3Rpbmcgc29ydGluZyBmb3IgdGhpcyBjb2x1bW5cbiAgICAgICAgY29uc3QgZXhpc3RpbmdTb3J0aW5nID0gb2xkPy5maW5kKGQgPT4gZC5pZCA9PT0gY29sdW1uLmlkKVxuICAgICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gb2xkPy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpXG5cbiAgICAgICAgbGV0IG5ld1NvcnRpbmc6IFNvcnRpbmdTdGF0ZSA9IFtdXG5cbiAgICAgICAgLy8gV2hhdCBzaG91bGQgd2UgZG8gd2l0aCB0aGlzIHNvcnQgYWN0aW9uP1xuICAgICAgICBsZXQgc29ydEFjdGlvbjogJ2FkZCcgfCAncmVtb3ZlJyB8ICd0b2dnbGUnIHwgJ3JlcGxhY2UnXG4gICAgICAgIGxldCBuZXh0RGVzYyA9IGhhc01hbnVhbFZhbHVlID8gZGVzYyA6IG5leHRTb3J0aW5nT3JkZXIgPT09ICdkZXNjJ1xuXG4gICAgICAgIC8vIE11bHRpLW1vZGVcbiAgICAgICAgaWYgKG9sZD8ubGVuZ3RoICYmIGNvbHVtbi5nZXRDYW5NdWx0aVNvcnQoKSAmJiBtdWx0aSkge1xuICAgICAgICAgIGlmIChleGlzdGluZ1NvcnRpbmcpIHtcbiAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAndG9nZ2xlJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3J0QWN0aW9uID0gJ2FkZCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm9ybWFsIG1vZGVcbiAgICAgICAgICBpZiAob2xkPy5sZW5ndGggJiYgZXhpc3RpbmdJbmRleCAhPT0gb2xkLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nU29ydGluZykge1xuICAgICAgICAgICAgc29ydEFjdGlvbiA9ICd0b2dnbGUnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdG9nZ2xlIHN0YXRlcyB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBzb3J0aW5nXG4gICAgICAgIGlmIChzb3J0QWN0aW9uID09PSAndG9nZ2xlJykge1xuICAgICAgICAgIC8vIElmIHdlIGFyZSBcImFjdHVhbGx5XCIgdG9nZ2xpbmcgKG5vdCBhIG1hbnVhbCBzZXQgdmFsdWUpLCBzaG91bGQgd2UgcmVtb3ZlIHRoZSBzb3J0aW5nP1xuICAgICAgICAgIGlmICghaGFzTWFudWFsVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIElzIG91ciBpbnRlbnRpb24gdG8gcmVtb3ZlP1xuICAgICAgICAgICAgaWYgKCFuZXh0U29ydGluZ09yZGVyKSB7XG4gICAgICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVtb3ZlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3J0QWN0aW9uID09PSAnYWRkJykge1xuICAgICAgICAgIG5ld1NvcnRpbmcgPSBbXG4gICAgICAgICAgICAuLi5vbGQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiBjb2x1bW4uaWQsXG4gICAgICAgICAgICAgIGRlc2M6IG5leHREZXNjLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgICAgLy8gVGFrZSBsYXRlc3QgbiBjb2x1bW5zXG4gICAgICAgICAgbmV3U29ydGluZy5zcGxpY2UoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgbmV3U29ydGluZy5sZW5ndGggLVxuICAgICAgICAgICAgICAodGFibGUub3B0aW9ucy5tYXhNdWx0aVNvcnRDb2xDb3VudCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAvLyBUaGlzIGZsaXBzIChvciBzZXRzKSB0aGVcbiAgICAgICAgICBuZXdTb3J0aW5nID0gb2xkLm1hcChkID0+IHtcbiAgICAgICAgICAgIGlmIChkLmlkID09PSBjb2x1bW4uaWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5kLFxuICAgICAgICAgICAgICAgIGRlc2M6IG5leHREZXNjLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICBuZXdTb3J0aW5nID0gb2xkLmZpbHRlcihkID0+IGQuaWQgIT09IGNvbHVtbi5pZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTb3J0aW5nID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICAgICAgICBkZXNjOiBuZXh0RGVzYyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld1NvcnRpbmdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29sdW1uLmdldEZpcnN0U29ydERpciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNvcnREZXNjRmlyc3QgPVxuICAgICAgICBjb2x1bW4uY29sdW1uRGVmLnNvcnREZXNjRmlyc3QgPz9cbiAgICAgICAgdGFibGUub3B0aW9ucy5zb3J0RGVzY0ZpcnN0ID8/XG4gICAgICAgIGNvbHVtbi5nZXRBdXRvU29ydERpcigpID09PSAnZGVzYydcbiAgICAgIHJldHVybiBzb3J0RGVzY0ZpcnN0ID8gJ2Rlc2MnIDogJ2FzYydcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0TmV4dFNvcnRpbmdPcmRlciA9IChtdWx0aT86IGJvb2xlYW4pID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0U29ydERpcmVjdGlvbiA9IGNvbHVtbi5nZXRGaXJzdFNvcnREaXIoKVxuICAgICAgY29uc3QgaXNTb3J0ZWQgPSBjb2x1bW4uZ2V0SXNTb3J0ZWQoKVxuXG4gICAgICBpZiAoIWlzU29ydGVkKSB7XG4gICAgICAgIHJldHVybiBmaXJzdFNvcnREaXJlY3Rpb25cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBpc1NvcnRlZCAhPT0gZmlyc3RTb3J0RGlyZWN0aW9uICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZVNvcnRpbmdSZW1vdmFsID8/IHRydWUpICYmIC8vIElmIGVuYWJsZVNvcnRSZW1vdmUsIGVuYWJsZSBpbiBnZW5lcmFsXG4gICAgICAgIChtdWx0aSA/IHRhYmxlLm9wdGlvbnMuZW5hYmxlTXVsdGlSZW1vdmUgPz8gdHJ1ZSA6IHRydWUpIC8vIElmIG11bHRpLCBkb24ndCBhbGxvdyBpZiBlbmFibGVNdWx0aVJlbW92ZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTb3J0ZWQgPT09ICdkZXNjJyA/ICdhc2MnIDogJ2Rlc2MnXG4gICAgfVxuXG4gICAgY29sdW1uLmdldENhblNvcnQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29sdW1uLmNvbHVtbkRlZi5lbmFibGVTb3J0aW5nID8/IHRydWUpICYmXG4gICAgICAgICh0YWJsZS5vcHRpb25zLmVuYWJsZVNvcnRpbmcgPz8gdHJ1ZSkgJiZcbiAgICAgICAgISFjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbHVtbi5nZXRDYW5NdWx0aVNvcnQgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2x1bW4uY29sdW1uRGVmLmVuYWJsZU11bHRpU29ydCA/P1xuICAgICAgICB0YWJsZS5vcHRpb25zLmVuYWJsZU11bHRpU29ydCA/P1xuICAgICAgICAhIWNvbHVtbi5hY2Nlc3NvckZuXG4gICAgICApXG4gICAgfVxuXG4gICAgY29sdW1uLmdldElzU29ydGVkID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uU29ydCA9IHRhYmxlLmdldFN0YXRlKCkuc29ydGluZz8uZmluZChkID0+IGQuaWQgPT09IGNvbHVtbi5pZClcblxuICAgICAgcmV0dXJuICFjb2x1bW5Tb3J0ID8gZmFsc2UgOiBjb2x1bW5Tb3J0LmRlc2MgPyAnZGVzYycgOiAnYXNjJ1xuICAgIH1cblxuICAgIGNvbHVtbi5nZXRTb3J0SW5kZXggPSAoKSA9PlxuICAgICAgdGFibGUuZ2V0U3RhdGUoKS5zb3J0aW5nPy5maW5kSW5kZXgoZCA9PiBkLmlkID09PSBjb2x1bW4uaWQpID8/IC0xXG5cbiAgICBjb2x1bW4uY2xlYXJTb3J0aW5nID0gKCkgPT4ge1xuICAgICAgLy9jbGVhciBzb3J0aW5nIGZvciBqdXN0IDEgY29sdW1uXG4gICAgICB0YWJsZS5zZXRTb3J0aW5nKG9sZCA9PlxuICAgICAgICBvbGQ/Lmxlbmd0aCA/IG9sZC5maWx0ZXIoZCA9PiBkLmlkICE9PSBjb2x1bW4uaWQpIDogW11cbiAgICAgIClcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYW5Tb3J0ID0gY29sdW1uLmdldENhblNvcnQoKVxuXG4gICAgICByZXR1cm4gKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKCFjYW5Tb3J0KSByZXR1cm5cbiAgICAgICAgOyhlIGFzIGFueSkucGVyc2lzdD8uKClcbiAgICAgICAgY29sdW1uLnRvZ2dsZVNvcnRpbmc/LihcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY29sdW1uLmdldENhbk11bHRpU29ydCgpID8gdGFibGUub3B0aW9ucy5pc011bHRpU29ydEV2ZW50Py4oZSkgOiBmYWxzZVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZVRhYmxlOiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPih0YWJsZTogVGFibGU8VERhdGE+KTogdm9pZCA9PiB7XG4gICAgdGFibGUuc2V0U29ydGluZyA9IHVwZGF0ZXIgPT4gdGFibGUub3B0aW9ucy5vblNvcnRpbmdDaGFuZ2U/Lih1cGRhdGVyKVxuICAgIHRhYmxlLnJlc2V0U29ydGluZyA9IGRlZmF1bHRTdGF0ZSA9PiB7XG4gICAgICB0YWJsZS5zZXRTb3J0aW5nKGRlZmF1bHRTdGF0ZSA/IFtdIDogdGFibGUuaW5pdGlhbFN0YXRlPy5zb3J0aW5nID8/IFtdKVxuICAgIH1cbiAgICB0YWJsZS5nZXRQcmVTb3J0ZWRSb3dNb2RlbCA9ICgpID0+IHRhYmxlLmdldEdyb3VwZWRSb3dNb2RlbCgpXG4gICAgdGFibGUuZ2V0U29ydGVkUm93TW9kZWwgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRhYmxlLl9nZXRTb3J0ZWRSb3dNb2RlbCAmJiB0YWJsZS5vcHRpb25zLmdldFNvcnRlZFJvd01vZGVsKSB7XG4gICAgICAgIHRhYmxlLl9nZXRTb3J0ZWRSb3dNb2RlbCA9IHRhYmxlLm9wdGlvbnMuZ2V0U29ydGVkUm93TW9kZWwodGFibGUpXG4gICAgICB9XG5cbiAgICAgIGlmICh0YWJsZS5vcHRpb25zLm1hbnVhbFNvcnRpbmcgfHwgIXRhYmxlLl9nZXRTb3J0ZWRSb3dNb2RlbCkge1xuICAgICAgICByZXR1cm4gdGFibGUuZ2V0UHJlU29ydGVkUm93TW9kZWwoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGUuX2dldFNvcnRlZFJvd01vZGVsKClcbiAgICB9XG4gIH0sXG59XG4iLCJpbXBvcnQgeyBUYWJsZUZlYXR1cmUgfSBmcm9tICcuLi9jb3JlL3RhYmxlJ1xuaW1wb3J0IHtcbiAgQ2VsbCxcbiAgQ29sdW1uLFxuICBPbkNoYW5nZUZuLFxuICBUYWJsZSxcbiAgVXBkYXRlcixcbiAgUm93LFxuICBSb3dEYXRhLFxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1ha2VTdGF0ZVVwZGF0ZXIsIG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IHR5cGUgVmlzaWJpbGl0eVN0YXRlID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cblxuZXhwb3J0IGludGVyZmFjZSBWaXNpYmlsaXR5VGFibGVTdGF0ZSB7XG4gIGNvbHVtblZpc2liaWxpdHk6IFZpc2liaWxpdHlTdGF0ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlPcHRpb25zIHtcbiAgZW5hYmxlSGlkaW5nPzogYm9vbGVhblxuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBgdXBkYXRlckZuYCB3aGVuIGBzdGF0ZS5jb2x1bW5WaXNpYmlsaXR5YCBjaGFuZ2VzLiBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbnRlcm5hbCBzdGF0ZSBtYW5hZ2VtZW50LCBzbyB5b3Ugd2lsbCBuZWVkIHRvIHBlcnNpc3QgdGhlIHN0YXRlIGNoYW5nZSBlaXRoZXIgZnVsbHkgb3IgcGFydGlhbGx5IG91dHNpZGUgb2YgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I29uY29sdW1udmlzaWJpbGl0eWNoYW5nZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlPzogT25DaGFuZ2VGbjxWaXNpYmlsaXR5U3RhdGU+XG59XG5cbmV4cG9ydCB0eXBlIFZpc2liaWxpdHlEZWZhdWx0T3B0aW9ucyA9IFBpY2s8XG4gIFZpc2liaWxpdHlPcHRpb25zLFxuICAnb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlJ1xuPlxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgLyoqXG4gICAqIElmIGNvbHVtbiBwaW5uaW5nLCByZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBsZWFmLW5vZGUgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSB1bnBpbm5lZC9jZW50ZXIgcG9ydGlvbiBvZiB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0Y2VudGVydmlzaWJsZWxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBnZXRDZW50ZXJWaXNpYmxlTGVhZkNvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGFsbCBjb2x1bW5zIGFyZSB2aXNpYmxlXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0aXNhbGxjb2x1bW5zdmlzaWJsZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0SXNBbGxDb2x1bW5zVmlzaWJsZTogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIGFueSBjb2x1bW5zIGFyZSB2aXNpYmxlXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0aXNzb21lY29sdW1uc3Zpc2libGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tdmlzaWJpbGl0eSlcbiAgICovXG4gIGdldElzU29tZUNvbHVtbnNWaXNpYmxlOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBJZiBjb2x1bW4gcGlubmluZywgcmV0dXJucyBhIGZsYXQgYXJyYXkgb2YgbGVhZi1ub2RlIGNvbHVtbnMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgbGVmdCBwb3J0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXRsZWZ0dmlzaWJsZWxlYWZjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBnZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIElmIGNvbHVtbiBwaW5uaW5nLCByZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBsZWFmLW5vZGUgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSByaWdodCBwb3J0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXRyaWdodHZpc2libGVsZWFmY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyBhIGhhbmRsZXIgZm9yIHRvZ2dsaW5nIHRoZSB2aXNpYmlsaXR5IG9mIGFsbCBjb2x1bW5zLCBtZWFudCB0byBiZSBib3VuZCB0byBhIGBpbnB1dFt0eXBlPWNoZWNrYm94XWAgZWxlbWVudC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXR0b2dnbGVhbGxjb2x1bW5zdmlzaWJpbGl0eWhhbmRsZXIpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tdmlzaWJpbGl0eSlcbiAgICovXG4gIGdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBjb2x1bW5zIHRoYXQgYXJlIHZpc2libGUsIGluY2x1ZGluZyBwYXJlbnQgY29sdW1ucy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNnZXR2aXNpYmxlZmxhdGNvbHVtbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jb2x1bW4tdmlzaWJpbGl0eSlcbiAgICovXG4gIGdldFZpc2libGVGbGF0Q29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmxhdCBhcnJheSBvZiBsZWFmLW5vZGUgY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldHZpc2libGVsZWFmY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0VmlzaWJsZUxlYWZDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgY29sdW1uIHZpc2liaWxpdHkgc3RhdGUgdG8gdGhlIGluaXRpYWwgc3RhdGUuIElmIGBkZWZhdWx0U3RhdGVgIGlzIHByb3ZpZGVkLCB0aGUgc3RhdGUgd2lsbCBiZSByZXNldCB0byBge31gXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjcmVzZXRjb2x1bW52aXNpYmlsaXR5KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICByZXNldENvbHVtblZpc2liaWxpdHk6IChkZWZhdWx0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIGBzdGF0ZS5jb2x1bW5WaXNpYmlsaXR5YCBzdGF0ZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9mZWF0dXJlcy9jb2x1bW4tdmlzaWJpbGl0eSNzZXRjb2x1bW52aXNpYmlsaXR5KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBzZXRDb2x1bW5WaXNpYmlsaXR5OiAodXBkYXRlcjogVXBkYXRlcjxWaXNpYmlsaXR5U3RhdGU+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGFsbCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I3RvZ2dsZWFsbGNvbHVtbnN2aXNpYmxlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICB0b2dnbGVBbGxDb2x1bW5zVmlzaWJsZTogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2liaWxpdHlDb2x1bW5EZWYge1xuICBlbmFibGVIaWRpbmc/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaWJpbGl0eVJvdzxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2dldEFsbFZpc2libGVDZWxsczogKCkgPT4gQ2VsbDxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjZWxscyB0aGF0IGFjY291bnQgZm9yIGNvbHVtbiB2aXNpYmlsaXR5IGZvciB0aGUgcm93LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldHZpc2libGVjZWxscylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0VmlzaWJsZUNlbGxzOiAoKSA9PiBDZWxsPFREYXRhLCB1bmtub3duPltdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaWJpbGl0eUNvbHVtbiB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbHVtbiBjYW4gYmUgaGlkZGVuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjZ2V0Y2FuaGlkZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0Q2FuSGlkZTogKCkgPT4gYm9vbGVhblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgdmlzaWJsZVxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldGlzdmlzaWJsZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgZ2V0SXNWaXNpYmxlOiAoKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgdGhlIGNvbHVtbiB2aXNpYmlsaXR5LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGJpbmQgdG8gYW4gZXZlbnQgaGFuZGxlciB0byBhIGNoZWNrYm94LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2ZlYXR1cmVzL2NvbHVtbi12aXNpYmlsaXR5I2dldHRvZ2dsZXZpc2liaWxpdHloYW5kbGVyKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY29sdW1uLXZpc2liaWxpdHkpXG4gICAqL1xuICBnZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlcjogKCkgPT4gKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjb2x1bW4uXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvZmVhdHVyZXMvY29sdW1uLXZpc2liaWxpdHkjdG9nZ2xldmlzaWJpbGl0eSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NvbHVtbi12aXNpYmlsaXR5KVxuICAgKi9cbiAgdG9nZ2xlVmlzaWJpbGl0eTogKHZhbHVlPzogYm9vbGVhbikgPT4gdm9pZFxufVxuXG4vL1xuXG5leHBvcnQgY29uc3QgVmlzaWJpbGl0eTogVGFibGVGZWF0dXJlID0ge1xuICBnZXRJbml0aWFsU3RhdGU6IChzdGF0ZSk6IFZpc2liaWxpdHlUYWJsZVN0YXRlID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uVmlzaWJpbGl0eToge30sXG4gICAgICAuLi5zdGF0ZSxcbiAgICB9XG4gIH0sXG5cbiAgZ2V0RGVmYXVsdE9wdGlvbnM6IDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KFxuICAgIHRhYmxlOiBUYWJsZTxURGF0YT5cbiAgKTogVmlzaWJpbGl0eURlZmF1bHRPcHRpb25zID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlOiBtYWtlU3RhdGVVcGRhdGVyKCdjb2x1bW5WaXNpYmlsaXR5JywgdGFibGUpLFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVDb2x1bW46IDxURGF0YSBleHRlbmRzIFJvd0RhdGEsIFRWYWx1ZT4oXG4gICAgY29sdW1uOiBDb2x1bW48VERhdGEsIFRWYWx1ZT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICBjb2x1bW4udG9nZ2xlVmlzaWJpbGl0eSA9IHZhbHVlID0+IHtcbiAgICAgIGlmIChjb2x1bW4uZ2V0Q2FuSGlkZSgpKSB7XG4gICAgICAgIHRhYmxlLnNldENvbHVtblZpc2liaWxpdHkob2xkID0+ICh7XG4gICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgIFtjb2x1bW4uaWRdOiB2YWx1ZSA/PyAhY29sdW1uLmdldElzVmlzaWJsZSgpLFxuICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29sdW1uLmdldElzVmlzaWJsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0YWJsZS5nZXRTdGF0ZSgpLmNvbHVtblZpc2liaWxpdHk/Lltjb2x1bW4uaWRdID8/IHRydWVcbiAgICB9XG5cbiAgICBjb2x1bW4uZ2V0Q2FuSGlkZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb2x1bW4uY29sdW1uRGVmLmVuYWJsZUhpZGluZyA/PyB0cnVlKSAmJlxuICAgICAgICAodGFibGUub3B0aW9ucy5lbmFibGVIaWRpbmcgPz8gdHJ1ZSlcbiAgICAgIClcbiAgICB9XG4gICAgY29sdW1uLmdldFRvZ2dsZVZpc2liaWxpdHlIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVWaXNpYmlsaXR5Py4oXG4gICAgICAgICAgKChlIGFzIE1vdXNlRXZlbnQpLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlUm93OiA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgICByb3c6IFJvdzxURGF0YT4sXG4gICAgdGFibGU6IFRhYmxlPFREYXRhPlxuICApOiB2b2lkID0+IHtcbiAgICByb3cuX2dldEFsbFZpc2libGVDZWxscyA9IG1lbW8oXG4gICAgICAoKSA9PiBbcm93LmdldEFsbENlbGxzKCksIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uVmlzaWJpbGl0eV0sXG4gICAgICBjZWxscyA9PiB7XG4gICAgICAgIHJldHVybiBjZWxscy5maWx0ZXIoY2VsbCA9PiBjZWxsLmNvbHVtbi5nZXRJc1Zpc2libGUoKSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJiAncm93Ll9nZXRBbGxWaXNpYmxlQ2VsbHMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApXG4gICAgcm93LmdldFZpc2libGVDZWxscyA9IG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHJvdy5nZXRMZWZ0VmlzaWJsZUNlbGxzKCksXG4gICAgICAgIHJvdy5nZXRDZW50ZXJWaXNpYmxlQ2VsbHMoKSxcbiAgICAgICAgcm93LmdldFJpZ2h0VmlzaWJsZUNlbGxzKCksXG4gICAgICBdLFxuICAgICAgKGxlZnQsIGNlbnRlciwgcmlnaHQpID0+IFsuLi5sZWZ0LCAuLi5jZW50ZXIsIC4uLnJpZ2h0XSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAncm93LmdldFZpc2libGVDZWxscycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdSb3dzLFxuICAgICAgfVxuICAgIClcbiAgfSxcblxuICBjcmVhdGVUYWJsZTogPFREYXRhIGV4dGVuZHMgUm93RGF0YT4odGFibGU6IFRhYmxlPFREYXRhPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1ha2VWaXNpYmxlQ29sdW1uc01ldGhvZCA9IChcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgZ2V0Q29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gICAgKTogKCgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgcmV0dXJuIG1lbW8oXG4gICAgICAgICgpID0+IFtcbiAgICAgICAgICBnZXRDb2x1bW5zKCksXG4gICAgICAgICAgZ2V0Q29sdW1ucygpXG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4gZC5nZXRJc1Zpc2libGUoKSlcbiAgICAgICAgICAgIC5tYXAoZCA9PiBkLmlkKVxuICAgICAgICAgICAgLmpvaW4oJ18nKSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKGQgPT4gZC5nZXRJc1Zpc2libGU/LigpKVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGFibGUuZ2V0VmlzaWJsZUZsYXRDb2x1bW5zID0gbWFrZVZpc2libGVDb2x1bW5zTWV0aG9kKFxuICAgICAgJ2dldFZpc2libGVGbGF0Q29sdW1ucycsXG4gICAgICAoKSA9PiB0YWJsZS5nZXRBbGxGbGF0Q29sdW1ucygpXG4gICAgKVxuICAgIHRhYmxlLmdldFZpc2libGVMZWFmQ29sdW1ucyA9IG1ha2VWaXNpYmxlQ29sdW1uc01ldGhvZChcbiAgICAgICdnZXRWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0QWxsTGVhZkNvbHVtbnMoKVxuICAgIClcbiAgICB0YWJsZS5nZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zID0gbWFrZVZpc2libGVDb2x1bW5zTWV0aG9kKFxuICAgICAgJ2dldExlZnRWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0TGVmdExlYWZDb2x1bW5zKClcbiAgICApXG4gICAgdGFibGUuZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMgPSBtYWtlVmlzaWJsZUNvbHVtbnNNZXRob2QoXG4gICAgICAnZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0UmlnaHRMZWFmQ29sdW1ucygpXG4gICAgKVxuICAgIHRhYmxlLmdldENlbnRlclZpc2libGVMZWFmQ29sdW1ucyA9IG1ha2VWaXNpYmxlQ29sdW1uc01ldGhvZChcbiAgICAgICdnZXRDZW50ZXJWaXNpYmxlTGVhZkNvbHVtbnMnLFxuICAgICAgKCkgPT4gdGFibGUuZ2V0Q2VudGVyTGVhZkNvbHVtbnMoKVxuICAgIClcblxuICAgIHRhYmxlLnNldENvbHVtblZpc2liaWxpdHkgPSB1cGRhdGVyID0+XG4gICAgICB0YWJsZS5vcHRpb25zLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZT8uKHVwZGF0ZXIpXG5cbiAgICB0YWJsZS5yZXNldENvbHVtblZpc2liaWxpdHkgPSBkZWZhdWx0U3RhdGUgPT4ge1xuICAgICAgdGFibGUuc2V0Q29sdW1uVmlzaWJpbGl0eShcbiAgICAgICAgZGVmYXVsdFN0YXRlID8ge30gOiB0YWJsZS5pbml0aWFsU3RhdGUuY29sdW1uVmlzaWJpbGl0eSA/PyB7fVxuICAgICAgKVxuICAgIH1cblxuICAgIHRhYmxlLnRvZ2dsZUFsbENvbHVtbnNWaXNpYmxlID0gdmFsdWUgPT4ge1xuICAgICAgdmFsdWUgPSB2YWx1ZSA/PyAhdGFibGUuZ2V0SXNBbGxDb2x1bW5zVmlzaWJsZSgpXG5cbiAgICAgIHRhYmxlLnNldENvbHVtblZpc2liaWxpdHkoXG4gICAgICAgIHRhYmxlLmdldEFsbExlYWZDb2x1bW5zKCkucmVkdWNlKFxuICAgICAgICAgIChvYmosIGNvbHVtbikgPT4gKHtcbiAgICAgICAgICAgIC4uLm9iaixcbiAgICAgICAgICAgIFtjb2x1bW4uaWRdOiAhdmFsdWUgPyAhY29sdW1uLmdldENhbkhpZGU/LigpIDogdmFsdWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAge31cbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cblxuICAgIHRhYmxlLmdldElzQWxsQ29sdW1uc1Zpc2libGUgPSAoKSA9PlxuICAgICAgIXRhYmxlLmdldEFsbExlYWZDb2x1bW5zKCkuc29tZShjb2x1bW4gPT4gIWNvbHVtbi5nZXRJc1Zpc2libGU/LigpKVxuXG4gICAgdGFibGUuZ2V0SXNTb21lQ29sdW1uc1Zpc2libGUgPSAoKSA9PlxuICAgICAgdGFibGUuZ2V0QWxsTGVhZkNvbHVtbnMoKS5zb21lKGNvbHVtbiA9PiBjb2x1bW4uZ2V0SXNWaXNpYmxlPy4oKSlcblxuICAgIHRhYmxlLmdldFRvZ2dsZUFsbENvbHVtbnNWaXNpYmlsaXR5SGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0YWJsZS50b2dnbGVBbGxDb2x1bW5zVmlzaWJsZShcbiAgICAgICAgICAoKGUgYXMgTW91c2VFdmVudCkudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy5jaGVja2VkXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59XG4iLCJpbXBvcnQgeyBmdW5jdGlvbmFsVXBkYXRlLCBtZW1vLCBSZXF1aXJlZEtleXMgfSBmcm9tICcuLi91dGlscydcblxuaW1wb3J0IHtcbiAgVXBkYXRlcixcbiAgVGFibGVPcHRpb25zUmVzb2x2ZWQsXG4gIFRhYmxlU3RhdGUsXG4gIFRhYmxlLFxuICBJbml0aWFsVGFibGVTdGF0ZSxcbiAgUm93LFxuICBDb2x1bW4sXG4gIFJvd01vZGVsLFxuICBDb2x1bW5EZWYsXG4gIFRhYmxlT3B0aW9ucyxcbiAgUm93RGF0YSxcbiAgVGFibGVNZXRhLFxuICBDb2x1bW5EZWZSZXNvbHZlZCxcbiAgR3JvdXBDb2x1bW5EZWYsXG59IGZyb20gJy4uL3R5cGVzJ1xuXG4vL1xuaW1wb3J0IHsgY3JlYXRlQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4nXG5pbXBvcnQgeyBIZWFkZXJzIH0gZnJvbSAnLi9oZWFkZXJzJ1xuLy9cblxuaW1wb3J0IHsgQ29sdW1uU2l6aW5nIH0gZnJvbSAnLi4vZmVhdHVyZXMvQ29sdW1uU2l6aW5nJ1xuaW1wb3J0IHsgRXhwYW5kaW5nIH0gZnJvbSAnLi4vZmVhdHVyZXMvRXhwYW5kaW5nJ1xuaW1wb3J0IHsgRmlsdGVycyB9IGZyb20gJy4uL2ZlYXR1cmVzL0ZpbHRlcnMnXG5pbXBvcnQgeyBHcm91cGluZyB9IGZyb20gJy4uL2ZlYXR1cmVzL0dyb3VwaW5nJ1xuaW1wb3J0IHsgT3JkZXJpbmcgfSBmcm9tICcuLi9mZWF0dXJlcy9PcmRlcmluZydcbmltcG9ydCB7IFBhZ2luYXRpb24gfSBmcm9tICcuLi9mZWF0dXJlcy9QYWdpbmF0aW9uJ1xuaW1wb3J0IHsgUGlubmluZyB9IGZyb20gJy4uL2ZlYXR1cmVzL1Bpbm5pbmcnXG5pbXBvcnQgeyBSb3dTZWxlY3Rpb24gfSBmcm9tICcuLi9mZWF0dXJlcy9Sb3dTZWxlY3Rpb24nXG5pbXBvcnQgeyBTb3J0aW5nIH0gZnJvbSAnLi4vZmVhdHVyZXMvU29ydGluZydcbmltcG9ydCB7IFZpc2liaWxpdHkgfSBmcm9tICcuLi9mZWF0dXJlcy9WaXNpYmlsaXR5J1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRmVhdHVyZSB7XG4gIGNyZWF0ZUNlbGw/OiAoY2VsbDogYW55LCBjb2x1bW46IGFueSwgcm93OiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVDb2x1bW4/OiAoY29sdW1uOiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVIZWFkZXI/OiAoY29sdW1uOiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVSb3c/OiAocm93OiBhbnksIHRhYmxlOiBhbnkpID0+IGFueVxuICBjcmVhdGVUYWJsZT86ICh0YWJsZTogYW55KSA9PiBhbnlcbiAgZ2V0RGVmYXVsdENvbHVtbkRlZj86ICgpID0+IGFueVxuICBnZXREZWZhdWx0T3B0aW9ucz86ICh0YWJsZTogYW55KSA9PiBhbnlcbiAgZ2V0SW5pdGlhbFN0YXRlPzogKGluaXRpYWxTdGF0ZT86IEluaXRpYWxUYWJsZVN0YXRlKSA9PiBhbnlcbn1cblxuY29uc3QgZmVhdHVyZXMgPSBbXG4gIEhlYWRlcnMsXG4gIFZpc2liaWxpdHksXG4gIE9yZGVyaW5nLFxuICBQaW5uaW5nLFxuICBGaWx0ZXJzLFxuICBTb3J0aW5nLFxuICBHcm91cGluZyxcbiAgRXhwYW5kaW5nLFxuICBQYWdpbmF0aW9uLFxuICBSb3dTZWxlY3Rpb24sXG4gIENvbHVtblNpemluZyxcbl0gYXMgY29uc3RcblxuLy9cblxuZXhwb3J0IGludGVyZmFjZSBDb3JlVGFibGVTdGF0ZSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVPcHRpb25zPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ge1xuICAvKipcbiAgICogU2V0IHRoaXMgb3B0aW9uIHRvIG92ZXJyaWRlIGFueSBvZiB0aGUgYGF1dG9SZXNldC4uLmAgZmVhdHVyZSBvcHRpb25zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjYXV0b3Jlc2V0YWxsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgYXV0b1Jlc2V0QWxsPzogYm9vbGVhblxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGNvbHVtbiBkZWZzIHRvIHVzZSBmb3IgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGNvbHVtbnM6IENvbHVtbkRlZjxURGF0YSwgYW55PltdXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmb3IgdGhlIHRhYmxlIHRvIGRpc3BsYXkuIFRoaXMgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIHlvdSBwcm92aWRlZCB0byBgdGFibGUuc2V0Um93VHlwZTwuLi4+YC4gQ29sdW1ucyBjYW4gYWNjZXNzIHRoaXMgZGF0YSB2aWEgc3RyaW5nL2luZGV4IG9yIGEgZnVuY3Rpb25hbCBhY2Nlc3Nvci4gV2hlbiB0aGUgYGRhdGFgIG9wdGlvbiBjaGFuZ2VzIHJlZmVyZW5jZSwgdGhlIHRhYmxlIHdpbGwgcmVwcm9jZXNzIHRoZSBkYXRhLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZGF0YSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRhdGE6IFREYXRhW11cbiAgLyoqXG4gICAqIFNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAgdG8gb3V0cHV0IGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNkZWJ1Z2FsbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRlYnVnQWxsPzogYm9vbGVhblxuICAvKipcbiAgICogU2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCB0byBvdXRwdXQgY29sdW1uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2RlYnVnY29sdW1ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRlYnVnQ29sdW1ucz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAgdG8gb3V0cHV0IGhlYWRlciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNkZWJ1Z2hlYWRlcnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBkZWJ1Z0hlYWRlcnM/OiBib29sZWFuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBvcHRpb24gdG8gYHRydWVgIHRvIG91dHB1dCByb3cgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZGVidWdyb3dzKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgZGVidWdSb3dzPzogYm9vbGVhblxuICAvKipcbiAgICogU2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCB0byBvdXRwdXQgdGFibGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZGVidWd0YWJsZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGRlYnVnVGFibGU/OiBib29sZWFuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGNvbHVtbiBvcHRpb25zIHRvIHVzZSBmb3IgYWxsIGNvbHVtbiBkZWZzIHN1cHBsaWVkIHRvIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2RlZmF1bHRjb2x1bW4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBkZWZhdWx0Q29sdW1uPzogUGFydGlhbDxDb2x1bW5EZWY8VERhdGEsIHVua25vd24+PlxuICAvKipcbiAgICogVGhpcyByZXF1aXJlZCBvcHRpb24gaXMgYSBmYWN0b3J5IGZvciBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGNvcmUgcm93IG1vZGVsIGZvciB0aGUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRjb3Jlcm93bW9kZWwpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRDb3JlUm93TW9kZWw6ICh0YWJsZTogVGFibGU8YW55PikgPT4gKCkgPT4gUm93TW9kZWw8YW55PlxuICAvKipcbiAgICogVGhpcyBvcHRpb25hbCBmdW5jdGlvbiBpcyB1c2VkIHRvIGRlcml2ZSBhIHVuaXF1ZSBJRCBmb3IgYW55IGdpdmVuIHJvdy4gSWYgbm90IHByb3ZpZGVkIHRoZSByb3dzIGluZGV4IGlzIHVzZWQgKG5lc3RlZCByb3dzIGpvaW4gdG9nZXRoZXIgd2l0aCBgLmAgdXNpbmcgdGhlaXIgZ3JhbmRwYXJlbnRzJyBpbmRleCBlZy4gYGluZGV4LmluZGV4LmluZGV4YCkuIElmIHlvdSBuZWVkIHRvIGlkZW50aWZ5IGluZGl2aWR1YWwgcm93cyB0aGF0IGFyZSBvcmlnaW5hdGluZyBmcm9tIGFueSBzZXJ2ZXItc2lkZSBvcGVyYXRpb25zLCBpdCdzIHN1Z2dlc3RlZCB5b3UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGFuIElEIHRoYXQgbWFrZXMgc2Vuc2UgcmVnYXJkbGVzcyBvZiBuZXR3b3JrIElPL2FtYmlndWl0eSBlZy4gYSB1c2VySWQsIHRhc2tJZCwgZGF0YWJhc2UgSUQgZmllbGQsIGV0Yy5cbiAgICogQGV4YW1wbGUgZ2V0Um93SWQ6IHJvdyA9PiByb3cudXNlcklkXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRyb3dpZClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldFJvd0lkPzogKG9yaWdpbmFsUm93OiBURGF0YSwgaW5kZXg6IG51bWJlciwgcGFyZW50PzogUm93PFREYXRhPikgPT4gc3RyaW5nXG4gIC8qKlxuICAgKiBUaGlzIG9wdGlvbmFsIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBzdWIgcm93cyBmb3IgYW55IGdpdmVuIHJvdy4gSWYgeW91IGFyZSB1c2luZyBuZXN0ZWQgcm93cywgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHN1YiByb3dzIG9iamVjdCAob3IgdW5kZWZpbmVkKSBmcm9tIHRoZSByb3cuXG4gICAqIEBleGFtcGxlIGdldFN1YlJvd3M6IHJvdyA9PiByb3cuc3ViUm93c1xuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZ2V0c3Vicm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldFN1YlJvd3M/OiAob3JpZ2luYWxSb3c6IFREYXRhLCBpbmRleDogbnVtYmVyKSA9PiB1bmRlZmluZWQgfCBURGF0YVtdXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBvcHRpb24gdG8gb3B0aW9uYWxseSBwYXNzIGluaXRpYWwgc3RhdGUgdG8gdGhlIHRhYmxlLiBUaGlzIHN0YXRlIHdpbGwgYmUgdXNlZCB3aGVuIHJlc2V0dGluZyB2YXJpb3VzIHRhYmxlIHN0YXRlcyBlaXRoZXIgYXV0b21hdGljYWxseSBieSB0aGUgdGFibGUgKGVnLiBgb3B0aW9ucy5hdXRvUmVzZXRQYWdlSW5kZXhgKSBvciB2aWEgZnVuY3Rpb25zIGxpa2UgYHRhYmxlLnJlc2V0Um93U2VsZWN0aW9uKClgLiBNb3N0IHJlc2V0IGZ1bmN0aW9uIGFsbG93IHlvdSBvcHRpb25hbGx5IHBhc3MgYSBmbGFnIHRvIHJlc2V0IHRvIGEgYmxhbmsvZGVmYXVsdCBzdGF0ZSBpbnN0ZWFkIG9mIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgKlxuICAgKiBUYWJsZSBzdGF0ZSB3aWxsIG5vdCBiZSByZXNldCB3aGVuIHRoaXMgb2JqZWN0IGNoYW5nZXMsIHdoaWNoIGFsc28gbWVhbnMgdGhhdCB0aGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZSBzdGFibGUuXG4gICAqXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNpbml0aWFsc3RhdGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBpbml0aWFsU3RhdGU/OiBJbml0aWFsVGFibGVTdGF0ZVxuICAvKipcbiAgICogVGhpcyBvcHRpb24gaXMgdXNlZCB0byBvcHRpb25hbGx5IGltcGxlbWVudCB0aGUgbWVyZ2luZyBvZiB0YWJsZSBvcHRpb25zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjbWVyZ2VvcHRpb25zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgbWVyZ2VPcHRpb25zPzogKFxuICAgIGRlZmF1bHRPcHRpb25zOiBUYWJsZU9wdGlvbnM8VERhdGE+LFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8VGFibGVPcHRpb25zPFREYXRhPj5cbiAgKSA9PiBUYWJsZU9wdGlvbnM8VERhdGE+XG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgYW55IG9iamVjdCB0byBgb3B0aW9ucy5tZXRhYCBhbmQgYWNjZXNzIGl0IGFueXdoZXJlIHRoZSBgdGFibGVgIGlzIGF2YWlsYWJsZSB2aWEgYHRhYmxlLm9wdGlvbnMubWV0YWAuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNtZXRhKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgbWV0YT86IFRhYmxlTWV0YTxURGF0YT5cbiAgLyoqXG4gICAqIFRoZSBgb25TdGF0ZUNoYW5nZWAgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG9wdGlvbmFsbHkgbGlzdGVuIHRvIHN0YXRlIGNoYW5nZXMgd2l0aGluIHRoZSB0YWJsZS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI29uc3RhdGVjaGFuZ2UpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBvblN0YXRlQ2hhbmdlOiAodXBkYXRlcjogVXBkYXRlcjxUYWJsZVN0YXRlPikgPT4gdm9pZFxuICAvKipcbiAgICogVmFsdWUgdXNlZCB3aGVuIHRoZSBkZXNpcmVkIHZhbHVlIGlzIG5vdCBmb3VuZCBpbiB0aGUgZGF0YS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI3JlbmRlcmZhbGxiYWNrdmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICByZW5kZXJGYWxsYmFja1ZhbHVlOiBhbnlcbiAgLyoqXG4gICAqIFRoZSBgc3RhdGVgIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvcHRpb25hbGx5IF9jb250cm9sXyBwYXJ0IG9yIGFsbCBvZiB0aGUgdGFibGUgc3RhdGUuIFRoZSBzdGF0ZSB5b3UgcGFzcyBoZXJlIHdpbGwgbWVyZ2Ugd2l0aCBhbmQgb3ZlcndyaXRlIHRoZSBpbnRlcm5hbCBhdXRvbWF0aWNhbGx5LW1hbmFnZWQgc3RhdGUgdG8gcHJvZHVjZSB0aGUgZmluYWwgc3RhdGUgZm9yIHRoZSB0YWJsZS4gWW91IGNhbiBhbHNvIGxpc3RlbiB0byBzdGF0ZSBjaGFuZ2VzIHZpYSB0aGUgYG9uU3RhdGVDaGFuZ2VgIG9wdGlvbi5cbiAgICogPiBOb3RlOiBBbnkgc3RhdGUgcGFzc2VkIGluIGhlcmUgd2lsbCBvdmVycmlkZSBib3RoIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQgYW55IG90aGVyIGBpbml0aWFsU3RhdGVgIHlvdSBwcm92aWRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjc3RhdGUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBzdGF0ZTogUGFydGlhbDxUYWJsZVN0YXRlPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVJbnN0YW5jZTxURGF0YSBleHRlbmRzIFJvd0RhdGE+IHtcbiAgX2ZlYXR1cmVzOiByZWFkb25seSBUYWJsZUZlYXR1cmVbXVxuICBfZ2V0QWxsRmxhdENvbHVtbnNCeUlkOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW48VERhdGEsIHVua25vd24+PlxuICBfZ2V0Q29sdW1uRGVmczogKCkgPT4gQ29sdW1uRGVmPFREYXRhLCB1bmtub3duPltdXG4gIF9nZXRDb3JlUm93TW9kZWw/OiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgX2dldERlZmF1bHRDb2x1bW5EZWY6ICgpID0+IFBhcnRpYWw8Q29sdW1uRGVmPFREYXRhLCB1bmtub3duPj5cbiAgX2dldFJvd0lkOiAoXzogVERhdGEsIGluZGV4OiBudW1iZXIsIHBhcmVudD86IFJvdzxURGF0YT4pID0+IHN0cmluZ1xuICBfcXVldWU6IChjYjogKCkgPT4gdm9pZCkgPT4gdm9pZFxuICAvKipcbiAgICogUmV0dXJucyBhbGwgY29sdW1ucyBpbiB0aGUgdGFibGUgaW4gdGhlaXIgbm9ybWFsaXplZCBhbmQgbmVzdGVkIGhpZXJhcmNoeS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldGFsbGNvbHVtbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRBbGxDb2x1bW5zOiAoKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNvbHVtbnMgaW4gdGhlIHRhYmxlIGZsYXR0ZW5lZCB0byBhIHNpbmdsZSBsZXZlbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldGFsbGZsYXRjb2x1bW5zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgZ2V0QWxsRmxhdENvbHVtbnM6ICgpID0+IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyBhbGwgbGVhZi1ub2RlIGNvbHVtbnMgaW4gdGhlIHRhYmxlIGZsYXR0ZW5lZCB0byBhIHNpbmdsZSBsZXZlbC4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHBhcmVudCBjb2x1bW5zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjZ2V0YWxsbGVhZmNvbHVtbnMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRBbGxMZWFmQ29sdW1uczogKCkgPT4gQ29sdW1uPFREYXRhLCB1bmtub3duPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc2luZ2xlIGNvbHVtbiBieSBpdHMgSUQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRjb2x1bW4pXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRDb2x1bW46IChjb2x1bW5JZDogc3RyaW5nKSA9PiBDb2x1bW48VERhdGEsIHVua25vd24+IHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb3JlIHJvdyBtb2RlbCBiZWZvcmUgYW55IHByb2Nlc3NpbmcgaGFzIGJlZW4gYXBwbGllZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldGNvcmVyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldENvcmVSb3dNb2RlbDogKCkgPT4gUm93TW9kZWw8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRyb3cpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICBnZXRSb3c6IChpZDogc3RyaW5nLCBzZWFyY2hBbGw/OiBib29sZWFuKSA9PiBSb3c8VERhdGE+XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCBtb2RlbCBhZnRlciBhbGwgcHJvY2Vzc2luZyBmcm9tIG90aGVyIHVzZWQgZmVhdHVyZXMgaGFzIGJlZW4gYXBwbGllZC4gVGhpcyBpcyB0aGUgcm93IG1vZGVsIHRoYXQgaXMgbW9zdCBjb21tb25seSB1c2VkIGZvciByZW5kZXJpbmcuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNnZXRyb3dtb2RlbClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIGdldFJvd01vZGVsOiAoKSA9PiBSb3dNb2RlbDxURGF0YT5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIHRhYmxlJ3MgY3VycmVudCBzdGF0ZS4gSXQncyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmdW5jdGlvbiBhbmQgaXRzIHN0YXRlLCBlc3BlY2lhbGx5IHdoZW4gbWFuYWdpbmcgdGhlIHRhYmxlIHN0YXRlIG1hbnVhbGx5LiBJdCBpcyB0aGUgZXhhY3Qgc2FtZSBzdGF0ZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHRhYmxlIGZvciBldmVyeSBmZWF0dXJlIGFuZCBmdW5jdGlvbiBpdCBwcm92aWRlcy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3RhYmxlI2dldHN0YXRlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgZ2V0U3RhdGU6ICgpID0+IFRhYmxlU3RhdGVcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIHJlc29sdmVkIGluaXRpYWwgc3RhdGUgb2YgdGhlIHRhYmxlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjaW5pdGlhbHN0YXRlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgaW5pdGlhbFN0YXRlOiBUYWJsZVN0YXRlXG4gIC8qKlxuICAgKiBBIHJlYWQtb25seSByZWZlcmVuY2UgdG8gdGhlIHRhYmxlJ3MgY3VycmVudCBvcHRpb25zLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjb3B0aW9ucylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIG9wdGlvbnM6IFJlcXVpcmVkS2V5czxUYWJsZU9wdGlvbnNSZXNvbHZlZDxURGF0YT4sICdzdGF0ZSc+XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVzZXQgdGhlIHRhYmxlIHN0YXRlIHRvIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvdGFibGUjcmVzZXQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS90YWJsZXMpXG4gICAqL1xuICByZXNldDogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIHRhYmxlIG9wdGlvbnMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNzZXRvcHRpb25zKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvdGFibGVzKVxuICAgKi9cbiAgc2V0T3B0aW9uczogKG5ld09wdGlvbnM6IFVwZGF0ZXI8VGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+PikgPT4gdm9pZFxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgdGFibGUgc3RhdGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS90YWJsZSNzZXRzdGF0ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3RhYmxlcylcbiAgICovXG4gIHNldFN0YXRlOiAodXBkYXRlcjogVXBkYXRlcjxUYWJsZVN0YXRlPikgPT4gdm9pZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGU8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgb3B0aW9uczogVGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+XG4pOiBUYWJsZTxURGF0YT4ge1xuICBpZiAob3B0aW9ucy5kZWJ1Z0FsbCB8fCBvcHRpb25zLmRlYnVnVGFibGUpIHtcbiAgICBjb25zb2xlLmluZm8oJ0NyZWF0aW5nIFRhYmxlIEluc3RhbmNlLi4uJylcbiAgfVxuXG4gIGxldCB0YWJsZSA9IHsgX2ZlYXR1cmVzOiBmZWF0dXJlcyB9IGFzIHVua25vd24gYXMgVGFibGU8VERhdGE+XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB0YWJsZS5fZmVhdHVyZXMucmVkdWNlKChvYmosIGZlYXR1cmUpID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIGZlYXR1cmUuZ2V0RGVmYXVsdE9wdGlvbnM/Lih0YWJsZSkpXG4gIH0sIHt9KSBhcyBUYWJsZU9wdGlvbnNSZXNvbHZlZDxURGF0YT5cblxuICBjb25zdCBtZXJnZU9wdGlvbnMgPSAob3B0aW9uczogVGFibGVPcHRpb25zUmVzb2x2ZWQ8VERhdGE+KSA9PiB7XG4gICAgaWYgKHRhYmxlLm9wdGlvbnMubWVyZ2VPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGFibGUub3B0aW9ucy5tZXJnZU9wdGlvbnMoZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb3JlSW5pdGlhbFN0YXRlOiBDb3JlVGFibGVTdGF0ZSA9IHt9XG5cbiAgbGV0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAuLi5jb3JlSW5pdGlhbFN0YXRlLFxuICAgIC4uLihvcHRpb25zLmluaXRpYWxTdGF0ZSA/PyB7fSksXG4gIH0gYXMgVGFibGVTdGF0ZVxuXG4gIHRhYmxlLl9mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgIGluaXRpYWxTdGF0ZSA9IGZlYXR1cmUuZ2V0SW5pdGlhbFN0YXRlPy4oaW5pdGlhbFN0YXRlKSA/PyBpbml0aWFsU3RhdGVcbiAgfSlcblxuICBjb25zdCBxdWV1ZWQ6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgbGV0IHF1ZXVlZFRpbWVvdXQgPSBmYWxzZVxuXG4gIGNvbnN0IGNvcmVJbnN0YW5jZTogQ29yZUluc3RhbmNlPFREYXRhPiA9IHtcbiAgICBfZmVhdHVyZXM6IGZlYXR1cmVzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9LFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICBfcXVldWU6IGNiID0+IHtcbiAgICAgIHF1ZXVlZC5wdXNoKGNiKVxuXG4gICAgICBpZiAoIXF1ZXVlZFRpbWVvdXQpIHtcbiAgICAgICAgcXVldWVkVGltZW91dCA9IHRydWVcblxuICAgICAgICAvLyBTY2hlZHVsZSBhIG1pY3JvdGFzayB0byBydW4gdGhlIHF1ZXVlZCBjYWxsYmFja3MgYWZ0ZXJcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgY2FsbCBzdGFjayAocmVuZGVyLCBldGMpIGhhcyBmaW5pc2hlZC5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB3aGlsZSAocXVldWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICBxdWV1ZWQuc2hpZnQoKSEoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWVkVGltZW91dCA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldDogKCkgPT4ge1xuICAgICAgdGFibGUuc2V0U3RhdGUodGFibGUuaW5pdGlhbFN0YXRlKVxuICAgIH0sXG4gICAgc2V0T3B0aW9uczogdXBkYXRlciA9PiB7XG4gICAgICBjb25zdCBuZXdPcHRpb25zID0gZnVuY3Rpb25hbFVwZGF0ZSh1cGRhdGVyLCB0YWJsZS5vcHRpb25zKVxuICAgICAgdGFibGUub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhuZXdPcHRpb25zKSBhcyBSZXF1aXJlZEtleXM8XG4gICAgICAgIFRhYmxlT3B0aW9uc1Jlc29sdmVkPFREYXRhPixcbiAgICAgICAgJ3N0YXRlJ1xuICAgICAgPlxuICAgIH0sXG5cbiAgICBnZXRTdGF0ZTogKCkgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlLm9wdGlvbnMuc3RhdGUgYXMgVGFibGVTdGF0ZVxuICAgIH0sXG5cbiAgICBzZXRTdGF0ZTogKHVwZGF0ZXI6IFVwZGF0ZXI8VGFibGVTdGF0ZT4pID0+IHtcbiAgICAgIHRhYmxlLm9wdGlvbnMub25TdGF0ZUNoYW5nZT8uKHVwZGF0ZXIpXG4gICAgfSxcblxuICAgIF9nZXRSb3dJZDogKHJvdzogVERhdGEsIGluZGV4OiBudW1iZXIsIHBhcmVudD86IFJvdzxURGF0YT4pID0+XG4gICAgICB0YWJsZS5vcHRpb25zLmdldFJvd0lkPy4ocm93LCBpbmRleCwgcGFyZW50KSA/P1xuICAgICAgYCR7cGFyZW50ID8gW3BhcmVudC5pZCwgaW5kZXhdLmpvaW4oJy4nKSA6IGluZGV4fWAsXG5cbiAgICBnZXRDb3JlUm93TW9kZWw6ICgpID0+IHtcbiAgICAgIGlmICghdGFibGUuX2dldENvcmVSb3dNb2RlbCkge1xuICAgICAgICB0YWJsZS5fZ2V0Q29yZVJvd01vZGVsID0gdGFibGUub3B0aW9ucy5nZXRDb3JlUm93TW9kZWwodGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZS5fZ2V0Q29yZVJvd01vZGVsISgpXG4gICAgfSxcblxuICAgIC8vIFRoZSBmaW5hbCBjYWxscyBzdGFydCBhdCB0aGUgYm90dG9tIG9mIHRoZSBtb2RlbCxcbiAgICAvLyBleHBhbmRlZCByb3dzLCB3aGljaCB0aGVuIHdvcmsgdGhlaXIgd2F5IHVwXG5cbiAgICBnZXRSb3dNb2RlbDogKCkgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlLmdldFBhZ2luYXRpb25Sb3dNb2RlbCgpXG4gICAgfSxcbiAgICBnZXRSb3c6IChpZDogc3RyaW5nLCBzZWFyY2hBbGw/OiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCByb3cgPSAoc2VhcmNoQWxsID8gdGFibGUuZ2V0Q29yZVJvd01vZGVsKCkgOiB0YWJsZS5nZXRSb3dNb2RlbCgpKVxuICAgICAgICAucm93c0J5SWRbaWRdXG5cbiAgICAgIGlmICghcm93KSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRSb3cgZXhwZWN0ZWQgYW4gSUQsIGJ1dCBnb3QgJHtpZH1gKVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3dcbiAgICB9LFxuICAgIF9nZXREZWZhdWx0Q29sdW1uRGVmOiBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLm9wdGlvbnMuZGVmYXVsdENvbHVtbl0sXG4gICAgICBkZWZhdWx0Q29sdW1uID0+IHtcbiAgICAgICAgZGVmYXVsdENvbHVtbiA9IChkZWZhdWx0Q29sdW1uID8/IHt9KSBhcyBQYXJ0aWFsPFxuICAgICAgICAgIENvbHVtbkRlZjxURGF0YSwgdW5rbm93bj5cbiAgICAgICAgPlxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVhZGVyOiBwcm9wcyA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbHVtbkRlZiA9IHByb3BzLmhlYWRlci5jb2x1bW5cbiAgICAgICAgICAgICAgLmNvbHVtbkRlZiBhcyBDb2x1bW5EZWZSZXNvbHZlZDxURGF0YT5cblxuICAgICAgICAgICAgaWYgKHJlc29sdmVkQ29sdW1uRGVmLmFjY2Vzc29yS2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZENvbHVtbkRlZi5hY2Nlc3NvcktleVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzb2x2ZWRDb2x1bW5EZWYuYWNjZXNzb3JGbikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRDb2x1bW5EZWYuaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIGZvb3RlcjogcHJvcHMgPT4gcHJvcHMuaGVhZGVyLmNvbHVtbi5pZCxcbiAgICAgICAgICBjZWxsOiBwcm9wcyA9PiBwcm9wcy5yZW5kZXJWYWx1ZTxhbnk+KCk/LnRvU3RyaW5nPy4oKSA/PyBudWxsLFxuICAgICAgICAgIC4uLnRhYmxlLl9mZWF0dXJlcy5yZWR1Y2UoKG9iaiwgZmVhdHVyZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCBmZWF0dXJlLmdldERlZmF1bHRDb2x1bW5EZWY/LigpKVxuICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAuLi5kZWZhdWx0Q29sdW1uLFxuICAgICAgICB9IGFzIFBhcnRpYWw8Q29sdW1uRGVmPFREYXRhLCB1bmtub3duPj5cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXREZWZhdWx0Q29sdW1uRGVmJyxcbiAgICAgIH1cbiAgICApLFxuXG4gICAgX2dldENvbHVtbkRlZnM6ICgpID0+IHRhYmxlLm9wdGlvbnMuY29sdW1ucyxcblxuICAgIGdldEFsbENvbHVtbnM6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuX2dldENvbHVtbkRlZnMoKV0sXG4gICAgICBjb2x1bW5EZWZzID0+IHtcbiAgICAgICAgY29uc3QgcmVjdXJzZUNvbHVtbnMgPSAoXG4gICAgICAgICAgY29sdW1uRGVmczogQ29sdW1uRGVmPFREYXRhLCB1bmtub3duPltdLFxuICAgICAgICAgIHBhcmVudD86IENvbHVtbjxURGF0YSwgdW5rbm93bj4sXG4gICAgICAgICAgZGVwdGggPSAwXG4gICAgICAgICk6IENvbHVtbjxURGF0YSwgdW5rbm93bj5bXSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbkRlZnMubWFwKGNvbHVtbkRlZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBjcmVhdGVDb2x1bW4odGFibGUsIGNvbHVtbkRlZiwgZGVwdGgsIHBhcmVudClcblxuICAgICAgICAgICAgY29uc3QgZ3JvdXBpbmdDb2x1bW5EZWYgPSBjb2x1bW5EZWYgYXMgR3JvdXBDb2x1bW5EZWY8XG4gICAgICAgICAgICAgIFREYXRhLFxuICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICA+XG5cbiAgICAgICAgICAgIGNvbHVtbi5jb2x1bW5zID0gZ3JvdXBpbmdDb2x1bW5EZWYuY29sdW1uc1xuICAgICAgICAgICAgICA/IHJlY3Vyc2VDb2x1bW5zKGdyb3VwaW5nQ29sdW1uRGVmLmNvbHVtbnMsIGNvbHVtbiwgZGVwdGggKyAxKVxuICAgICAgICAgICAgICA6IFtdXG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY3Vyc2VDb2x1bW5zKGNvbHVtbkRlZnMpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRBbGxDb2x1bW5zJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z0NvbHVtbnMsXG4gICAgICB9XG4gICAgKSxcblxuICAgIGdldEFsbEZsYXRDb2x1bW5zOiBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldEFsbENvbHVtbnMoKV0sXG4gICAgICBhbGxDb2x1bW5zID0+IHtcbiAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmxhdE1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIHJldHVybiBjb2x1bW4uZ2V0RmxhdENvbHVtbnMoKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnZ2V0QWxsRmxhdENvbHVtbnMnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApLFxuXG4gICAgX2dldEFsbEZsYXRDb2x1bW5zQnlJZDogbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRBbGxGbGF0Q29sdW1ucygpXSxcbiAgICAgIGZsYXRDb2x1bW5zID0+IHtcbiAgICAgICAgcmV0dXJuIGZsYXRDb2x1bW5zLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGFjY1tjb2x1bW4uaWRdID0gY29sdW1uXG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDb2x1bW48VERhdGEsIHVua25vd24+PlxuICAgICAgICApXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRBbGxGbGF0Q29sdW1uc0J5SWQnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnQ29sdW1ucyxcbiAgICAgIH1cbiAgICApLFxuXG4gICAgZ2V0QWxsTGVhZkNvbHVtbnM6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0QWxsQ29sdW1ucygpLCB0YWJsZS5fZ2V0T3JkZXJDb2x1bW5zRm4oKV0sXG4gICAgICAoYWxsQ29sdW1ucywgb3JkZXJDb2x1bW5zKSA9PiB7XG4gICAgICAgIGxldCBsZWFmQ29sdW1ucyA9IGFsbENvbHVtbnMuZmxhdE1hcChjb2x1bW4gPT4gY29sdW1uLmdldExlYWZDb2x1bW5zKCkpXG4gICAgICAgIHJldHVybiBvcmRlckNvbHVtbnMobGVhZkNvbHVtbnMpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRBbGxMZWFmQ29sdW1ucycsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdDb2x1bW5zLFxuICAgICAgfVxuICAgICksXG5cbiAgICBnZXRDb2x1bW46IGNvbHVtbklkID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQoKVtjb2x1bW5JZF1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbHVtbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbVGFibGVdIENvbHVtbiB3aXRoIGlkICcke2NvbHVtbklkfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtblxuICAgIH0sXG4gIH1cblxuICBPYmplY3QuYXNzaWduKHRhYmxlLCBjb3JlSW5zdGFuY2UpXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRhYmxlLl9mZWF0dXJlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBmZWF0dXJlID0gdGFibGUuX2ZlYXR1cmVzW2luZGV4XVxuICAgIGZlYXR1cmU/LmNyZWF0ZVRhYmxlPy4odGFibGUpXG4gIH1cblxuICByZXR1cm4gdGFibGVcbn1cbiIsImltcG9ydCB7IFJvd0RhdGEsIENlbGwsIENvbHVtbiwgUm93LCBUYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgR2V0dGVyLCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2VsbENvbnRleHQ8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+IHtcbiAgY2VsbDogQ2VsbDxURGF0YSwgVFZhbHVlPlxuICBjb2x1bW46IENvbHVtbjxURGF0YSwgVFZhbHVlPlxuICBnZXRWYWx1ZTogR2V0dGVyPFRWYWx1ZT5cbiAgcmVuZGVyVmFsdWU6IEdldHRlcjxUVmFsdWUgfCBudWxsPlxuICByb3c6IFJvdzxURGF0YT5cbiAgdGFibGU6IFRhYmxlPFREYXRhPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVDZWxsPFREYXRhIGV4dGVuZHMgUm93RGF0YSwgVFZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgYXNzb2NpYXRlZCBDb2x1bW4gb2JqZWN0IGZvciB0aGUgY2VsbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjY29sdW1uKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY2VsbHMpXG4gICAqL1xuICBjb2x1bW46IENvbHVtbjxURGF0YSwgVFZhbHVlPlxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVuZGVyaW5nIGNvbnRleHQgKG9yIHByb3BzKSBmb3IgY2VsbC1iYXNlZCBjb21wb25lbnRzIGxpa2UgY2VsbHMgYW5kIGFnZ3JlZ2F0ZWQgY2VsbHMuIFVzZSB0aGVzZSBwcm9wcyB3aXRoIHlvdXIgZnJhbWV3b3JrJ3MgYGZsZXhSZW5kZXJgIHV0aWxpdHkgdG8gcmVuZGVyIHRoZXNlIHVzaW5nIHRoZSB0ZW1wbGF0ZSBvZiB5b3VyIGNob2ljZTpcbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjZ2V0Y29udGV4dClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NlbGxzKVxuICAgKi9cbiAgZ2V0Q29udGV4dDogKCkgPT4gQ2VsbENvbnRleHQ8VERhdGEsIFRWYWx1ZT5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgY2VsbCwgYWNjZXNzZWQgdmlhIHRoZSBhc3NvY2lhdGVkIGNvbHVtbidzIGFjY2Vzc29yIGtleSBvciBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjZ2V0dmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9jZWxscylcbiAgICovXG4gIGdldFZhbHVlOiBDZWxsQ29udGV4dDxURGF0YSwgVFZhbHVlPlsnZ2V0VmFsdWUnXVxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGNlbGwgYWNyb3NzIHRoZSBlbnRpcmUgdGFibGUuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9jZWxsI2lkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY2VsbHMpXG4gICAqL1xuICBpZDogc3RyaW5nXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB2YWx1ZSBmb3IgYSBjZWxsIHRoZSBzYW1lIGFzIGBnZXRWYWx1ZWAsIGJ1dCB3aWxsIHJldHVybiB0aGUgYHJlbmRlckZhbGxiYWNrVmFsdWVgIGlmIG5vIHZhbHVlIGlzIGZvdW5kLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvY2VsbCNyZW5kZXJ2YWx1ZSlcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL2NlbGxzKVxuICAgKi9cbiAgcmVuZGVyVmFsdWU6IENlbGxDb250ZXh0PFREYXRhLCBUVmFsdWU+WydyZW5kZXJWYWx1ZSddXG4gIC8qKlxuICAgKiBUaGUgYXNzb2NpYXRlZCBSb3cgb2JqZWN0IGZvciB0aGUgY2VsbC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL2NlbGwjcm93KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvY2VsbHMpXG4gICAqL1xuICByb3c6IFJvdzxURGF0YT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNlbGw8VERhdGEgZXh0ZW5kcyBSb3dEYXRhLCBUVmFsdWU+KFxuICB0YWJsZTogVGFibGU8VERhdGE+LFxuICByb3c6IFJvdzxURGF0YT4sXG4gIGNvbHVtbjogQ29sdW1uPFREYXRhLCBUVmFsdWU+LFxuICBjb2x1bW5JZDogc3RyaW5nXG4pOiBDZWxsPFREYXRhLCBUVmFsdWU+IHtcbiAgY29uc3QgZ2V0UmVuZGVyVmFsdWUgPSAoKSA9PlxuICAgIGNlbGwuZ2V0VmFsdWUoKSA/PyB0YWJsZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWVcblxuICBjb25zdCBjZWxsOiBDb3JlQ2VsbDxURGF0YSwgVFZhbHVlPiA9IHtcbiAgICBpZDogYCR7cm93LmlkfV8ke2NvbHVtbi5pZH1gLFxuICAgIHJvdyxcbiAgICBjb2x1bW4sXG4gICAgZ2V0VmFsdWU6ICgpID0+IHJvdy5nZXRWYWx1ZShjb2x1bW5JZCksXG4gICAgcmVuZGVyVmFsdWU6IGdldFJlbmRlclZhbHVlLFxuICAgIGdldENvbnRleHQ6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUsIGNvbHVtbiwgcm93LCBjZWxsXSxcbiAgICAgICh0YWJsZSwgY29sdW1uLCByb3csIGNlbGwpID0+ICh7XG4gICAgICAgIHRhYmxlLFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIHJvdyxcbiAgICAgICAgY2VsbDogY2VsbCBhcyBDZWxsPFREYXRhLCBUVmFsdWU+LFxuICAgICAgICBnZXRWYWx1ZTogY2VsbC5nZXRWYWx1ZSxcbiAgICAgICAgcmVuZGVyVmFsdWU6IGNlbGwucmVuZGVyVmFsdWUsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAnY2VsbC5nZXRDb250ZXh0JyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwsXG4gICAgICB9XG4gICAgKSxcbiAgfVxuXG4gIHRhYmxlLl9mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgIGZlYXR1cmUuY3JlYXRlQ2VsbD8uKFxuICAgICAgY2VsbCBhcyBDZWxsPFREYXRhLCBUVmFsdWU+LFxuICAgICAgY29sdW1uLFxuICAgICAgcm93IGFzIFJvdzxURGF0YT4sXG4gICAgICB0YWJsZVxuICAgIClcbiAgfSwge30pXG5cbiAgcmV0dXJuIGNlbGwgYXMgQ2VsbDxURGF0YSwgVFZhbHVlPlxufVxuIiwiaW1wb3J0IHsgUm93RGF0YSwgQ2VsbCwgUm93LCBUYWJsZSB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgZmxhdHRlbkJ5LCBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBjcmVhdGVDZWxsIH0gZnJvbSAnLi9jZWxsJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcmVSb3c8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPiB7XG4gIF9nZXRBbGxDZWxsc0J5Q29sdW1uSWQ6ICgpID0+IFJlY29yZDxzdHJpbmcsIENlbGw8VERhdGEsIHVua25vd24+PlxuICBfdW5pcXVlVmFsdWVzQ2FjaGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIF92YWx1ZXNDYWNoZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgLyoqXG4gICAqIFRoZSBkZXB0aCBvZiB0aGUgcm93IChpZiBuZXN0ZWQgb3IgZ3JvdXBlZCkgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgcm93IGFycmF5LlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I2RlcHRoKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGRlcHRoOiBudW1iZXJcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIG9mIHRoZSBjZWxscyBmb3IgdGhlIHJvdy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNnZXRhbGxjZWxscylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBnZXRBbGxDZWxsczogKCkgPT4gQ2VsbDxURGF0YSwgdW5rbm93bj5bXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVhZiByb3dzIGZvciB0aGUgcm93LCBub3QgaW5jbHVkaW5nIGFueSBwYXJlbnQgcm93cy5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNnZXRsZWFmcm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBnZXRMZWFmUm93czogKCkgPT4gUm93PFREYXRhPltdXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgcm93IGZvciB0aGUgcm93LCBpZiBpdCBleGlzdHMuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjZ2V0cGFyZW50cm93KVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGdldFBhcmVudFJvdzogKCkgPT4gUm93PFREYXRhPiB8IHVuZGVmaW5lZFxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGFyZW50IHJvd3MgZm9yIHRoZSByb3csIGFsbCB0aGUgd2F5IHVwIHRvIGEgcm9vdCByb3cuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjZ2V0cGFyZW50cm93cylcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBnZXRQYXJlbnRSb3dzOiAoKSA9PiBSb3c8VERhdGE+W11cbiAgLyoqXG4gICAqIFJldHVybnMgYSB1bmlxdWUgYXJyYXkgb2YgdmFsdWVzIGZyb20gdGhlIHJvdyBmb3IgYSBnaXZlbiBjb2x1bW5JZC5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNnZXR1bmlxdWV2YWx1ZXMpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgZ2V0VW5pcXVlVmFsdWVzOiA8VFZhbHVlPihjb2x1bW5JZDogc3RyaW5nKSA9PiBUVmFsdWVbXVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgcm93IGZvciBhIGdpdmVuIGNvbHVtbklkLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I2dldHZhbHVlKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGdldFZhbHVlOiA8VFZhbHVlPihjb2x1bW5JZDogc3RyaW5nKSA9PiBUVmFsdWVcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJvdyByZXNvbHZlZCB2aWEgdGhlIGBvcHRpb25zLmdldFJvd0lkYCBvcHRpb24uIERlZmF1bHRzIHRvIHRoZSByb3cncyBpbmRleCAob3IgcmVsYXRpdmUgaW5kZXggaWYgaXQgaXMgYSBzdWJSb3cpLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I2lkKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIGlkOiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgcm93IHdpdGhpbiBpdHMgcGFyZW50IGFycmF5IChvciB0aGUgcm9vdCBkYXRhIGFycmF5KS5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNpbmRleClcbiAgICogQGxpbmsgW0d1aWRlXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2d1aWRlL3Jvd3MpXG4gICAqL1xuICBpbmRleDogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgcm93IG9iamVjdCBwcm92aWRlZCB0byB0aGUgdGFibGUuIElmIHRoZSByb3cgaXMgYSBncm91cGVkIHJvdywgdGhlIG9yaWdpbmFsIHJvdyBvYmplY3Qgd2lsbCBiZSB0aGUgZmlyc3Qgb3JpZ2luYWwgaW4gdGhlIGdyb3VwLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I29yaWdpbmFsKVxuICAgKiBAbGluayBbR3VpZGVdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvZ3VpZGUvcm93cylcbiAgICovXG4gIG9yaWdpbmFsOiBURGF0YVxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgdGhlIG9yaWdpbmFsIHN1YlJvd3MgYXMgcmV0dXJuZWQgYnkgdGhlIGBvcHRpb25zLmdldFN1YlJvd3NgIG9wdGlvbi5cbiAgICogQGxpbmsgW0FQSSBEb2NzXShodHRwczovL3RhbnN0YWNrLmNvbS90YWJsZS92OC9kb2NzL2FwaS9jb3JlL3JvdyNvcmlnaW5hbHN1YnJvd3MpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgb3JpZ2luYWxTdWJSb3dzPzogVERhdGFbXVxuICAvKipcbiAgICogSWYgbmVzdGVkLCB0aGlzIHJvdydzIHBhcmVudCByb3cgaWQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjcGFyZW50aWQpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgcGFyZW50SWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHZhbHVlIGZvciB0aGUgcm93IGluIGEgZ2l2ZW4gY29sdW1uSWQgdGhlIHNhbWUgYXMgYGdldFZhbHVlYCwgYnV0IHdpbGwgcmV0dXJuIHRoZSBgcmVuZGVyRmFsbGJhY2tWYWx1ZWAgaWYgbm8gdmFsdWUgaXMgZm91bmQuXG4gICAqIEBsaW5rIFtBUEkgRG9jc10oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9hcGkvY29yZS9yb3cjcmVuZGVydmFsdWUpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgcmVuZGVyVmFsdWU6IDxUVmFsdWU+KGNvbHVtbklkOiBzdHJpbmcpID0+IFRWYWx1ZVxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3ViUm93cyBmb3IgdGhlIHJvdyBhcyByZXR1cm5lZCBhbmQgY3JlYXRlZCBieSB0aGUgYG9wdGlvbnMuZ2V0U3ViUm93c2Agb3B0aW9uLlxuICAgKiBAbGluayBbQVBJIERvY3NdKGh0dHBzOi8vdGFuc3RhY2suY29tL3RhYmxlL3Y4L2RvY3MvYXBpL2NvcmUvcm93I3N1YnJvd3MpXG4gICAqIEBsaW5rIFtHdWlkZV0oaHR0cHM6Ly90YW5zdGFjay5jb20vdGFibGUvdjgvZG9jcy9ndWlkZS9yb3dzKVxuICAgKi9cbiAgc3ViUm93czogUm93PFREYXRhPltdXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSb3cgPSA8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgaWQ6IHN0cmluZyxcbiAgb3JpZ2luYWw6IFREYXRhLFxuICByb3dJbmRleDogbnVtYmVyLFxuICBkZXB0aDogbnVtYmVyLFxuICBzdWJSb3dzPzogUm93PFREYXRhPltdLFxuICBwYXJlbnRJZD86IHN0cmluZ1xuKTogUm93PFREYXRhPiA9PiB7XG4gIGxldCByb3c6IENvcmVSb3c8VERhdGE+ID0ge1xuICAgIGlkLFxuICAgIGluZGV4OiByb3dJbmRleCxcbiAgICBvcmlnaW5hbCxcbiAgICBkZXB0aCxcbiAgICBwYXJlbnRJZCxcbiAgICBfdmFsdWVzQ2FjaGU6IHt9LFxuICAgIF91bmlxdWVWYWx1ZXNDYWNoZToge30sXG4gICAgZ2V0VmFsdWU6IGNvbHVtbklkID0+IHtcbiAgICAgIGlmIChyb3cuX3ZhbHVlc0NhY2hlLmhhc093blByb3BlcnR5KGNvbHVtbklkKSkge1xuICAgICAgICByZXR1cm4gcm93Ll92YWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKVxuXG4gICAgICBpZiAoIWNvbHVtbj8uYWNjZXNzb3JGbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHJvdy5fdmFsdWVzQ2FjaGVbY29sdW1uSWRdID0gY29sdW1uLmFjY2Vzc29yRm4oXG4gICAgICAgIHJvdy5vcmlnaW5hbCBhcyBURGF0YSxcbiAgICAgICAgcm93SW5kZXhcbiAgICAgIClcblxuICAgICAgcmV0dXJuIHJvdy5fdmFsdWVzQ2FjaGVbY29sdW1uSWRdIGFzIGFueVxuICAgIH0sXG4gICAgZ2V0VW5pcXVlVmFsdWVzOiBjb2x1bW5JZCA9PiB7XG4gICAgICBpZiAocm93Ll91bmlxdWVWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5JZCkpIHtcbiAgICAgICAgcmV0dXJuIHJvdy5fdW5pcXVlVmFsdWVzQ2FjaGVbY29sdW1uSWRdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihjb2x1bW5JZClcblxuICAgICAgaWYgKCFjb2x1bW4/LmFjY2Vzc29yRm4pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbHVtbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzKSB7XG4gICAgICAgIHJvdy5fdW5pcXVlVmFsdWVzQ2FjaGVbY29sdW1uSWRdID0gW3Jvdy5nZXRWYWx1ZShjb2x1bW5JZCldXG4gICAgICAgIHJldHVybiByb3cuX3VuaXF1ZVZhbHVlc0NhY2hlW2NvbHVtbklkXVxuICAgICAgfVxuXG4gICAgICByb3cuX3VuaXF1ZVZhbHVlc0NhY2hlW2NvbHVtbklkXSA9IGNvbHVtbi5jb2x1bW5EZWYuZ2V0VW5pcXVlVmFsdWVzKFxuICAgICAgICByb3cub3JpZ2luYWwgYXMgVERhdGEsXG4gICAgICAgIHJvd0luZGV4XG4gICAgICApXG5cbiAgICAgIHJldHVybiByb3cuX3VuaXF1ZVZhbHVlc0NhY2hlW2NvbHVtbklkXSBhcyBhbnlcbiAgICB9LFxuICAgIHJlbmRlclZhbHVlOiBjb2x1bW5JZCA9PlxuICAgICAgcm93LmdldFZhbHVlKGNvbHVtbklkKSA/PyB0YWJsZS5vcHRpb25zLnJlbmRlckZhbGxiYWNrVmFsdWUsXG4gICAgc3ViUm93czogc3ViUm93cyA/PyBbXSxcbiAgICBnZXRMZWFmUm93czogKCkgPT4gZmxhdHRlbkJ5KHJvdy5zdWJSb3dzLCBkID0+IGQuc3ViUm93cyksXG4gICAgZ2V0UGFyZW50Um93OiAoKSA9PiAocm93LnBhcmVudElkID8gdGFibGUuZ2V0Um93KHJvdy5wYXJlbnRJZCwgdHJ1ZSkgOiB1bmRlZmluZWQpLFxuICAgIGdldFBhcmVudFJvd3M6ICgpID0+IHtcbiAgICAgIGxldCBwYXJlbnRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuICAgICAgbGV0IGN1cnJlbnRSb3cgPSByb3dcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFJvdyA9IGN1cnJlbnRSb3cuZ2V0UGFyZW50Um93KClcbiAgICAgICAgaWYgKCFwYXJlbnRSb3cpIGJyZWFrXG4gICAgICAgIHBhcmVudFJvd3MucHVzaChwYXJlbnRSb3cpXG4gICAgICAgIGN1cnJlbnRSb3cgPSBwYXJlbnRSb3dcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRSb3dzLnJldmVyc2UoKVxuICAgIH0sXG4gICAgZ2V0QWxsQ2VsbHM6IG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0QWxsTGVhZkNvbHVtbnMoKV0sXG4gICAgICBsZWFmQ29sdW1ucyA9PiB7XG4gICAgICAgIHJldHVybiBsZWFmQ29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQ2VsbCh0YWJsZSwgcm93IGFzIFJvdzxURGF0YT4sIGNvbHVtbiwgY29sdW1uLmlkKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyAmJiAncm93LmdldEFsbENlbGxzJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1Jvd3MsXG4gICAgICB9XG4gICAgKSxcblxuICAgIF9nZXRBbGxDZWxsc0J5Q29sdW1uSWQ6IG1lbW8oXG4gICAgICAoKSA9PiBbcm93LmdldEFsbENlbGxzKCldLFxuICAgICAgYWxsQ2VsbHMgPT4ge1xuICAgICAgICByZXR1cm4gYWxsQ2VsbHMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGNlbGwpID0+IHtcbiAgICAgICAgICAgIGFjY1tjZWxsLmNvbHVtbi5pZF0gPSBjZWxsXG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDZWxsPFREYXRhLCB1bmtub3duPj5cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiYgJ3Jvdy5nZXRBbGxDZWxsc0J5Q29sdW1uSWQnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnUm93cyxcbiAgICAgIH1cbiAgICApLFxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5fZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBmZWF0dXJlID0gdGFibGUuX2ZlYXR1cmVzW2ldXG4gICAgZmVhdHVyZT8uY3JlYXRlUm93Py4ocm93LCB0YWJsZSlcbiAgfVxuXG4gIHJldHVybiByb3cgYXMgUm93PFREYXRhPlxufVxuIiwiaW1wb3J0IHtcbiAgQWNjZXNzb3JGbixcbiAgQ29sdW1uRGVmLFxuICBEaXNwbGF5Q29sdW1uRGVmLFxuICBHcm91cENvbHVtbkRlZixcbiAgSWRlbnRpZmllZENvbHVtbkRlZixcbiAgUm93RGF0YSxcbn0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IERlZXBLZXlzLCBEZWVwVmFsdWUsIFJlcXVpcmVkS2V5cyB9IGZyb20gJy4vdXRpbHMnXG5cbi8vIHR5cGUgUGVyc29uID0ge1xuLy8gICBmaXJzdE5hbWU6IHN0cmluZ1xuLy8gICBsYXN0TmFtZTogc3RyaW5nXG4vLyAgIGFnZTogbnVtYmVyXG4vLyAgIHZpc2l0czogbnVtYmVyXG4vLyAgIHN0YXR1czogc3RyaW5nXG4vLyAgIHByb2dyZXNzOiBudW1iZXJcbi8vICAgY3JlYXRlZEF0OiBEYXRlXG4vLyAgIG5lc3RlZDoge1xuLy8gICAgIGZvbzogW1xuLy8gICAgICAge1xuLy8gICAgICAgICBiYXI6ICdiYXInXG4vLyAgICAgICB9XG4vLyAgICAgXVxuLy8gICAgIGJhcjogeyBzdWJCYXI6IGJvb2xlYW4gfVtdXG4vLyAgICAgYmF6OiB7XG4vLyAgICAgICBmb286ICdmb28nXG4vLyAgICAgICBiYXI6IHtcbi8vICAgICAgICAgYmF6OiAnYmF6J1xuLy8gICAgICAgfVxuLy8gICAgIH1cbi8vICAgfVxuLy8gfVxuXG4vLyBjb25zdCB0ZXN0OiBEZWVwS2V5czxQZXJzb24+ID0gJ25lc3RlZC5mb28uMC5iYXInXG4vLyBjb25zdCB0ZXN0MjogRGVlcEtleXM8UGVyc29uPiA9ICduZXN0ZWQuYmFyJ1xuXG4vLyBjb25zdCBoZWxwZXIgPSBjcmVhdGVDb2x1bW5IZWxwZXI8UGVyc29uPigpXG5cbi8vIGhlbHBlci5hY2Nlc3NvcignbmVzdGVkLmZvbycsIHtcbi8vICAgY2VsbDogaW5mbyA9PiBpbmZvLmdldFZhbHVlKCksXG4vLyB9KVxuXG4vLyBoZWxwZXIuYWNjZXNzb3IoJ25lc3RlZC5mb28uMC5iYXInLCB7XG4vLyAgIGNlbGw6IGluZm8gPT4gaW5mby5nZXRWYWx1ZSgpLFxuLy8gfSlcblxuLy8gaGVscGVyLmFjY2Vzc29yKCduZXN0ZWQuYmFyJywge1xuLy8gICBjZWxsOiBpbmZvID0+IGluZm8uZ2V0VmFsdWUoKSxcbi8vIH0pXG5cbmV4cG9ydCB0eXBlIENvbHVtbkhlbHBlcjxURGF0YSBleHRlbmRzIFJvd0RhdGE+ID0ge1xuICBhY2Nlc3NvcjogPFxuICAgIFRBY2Nlc3NvciBleHRlbmRzIEFjY2Vzc29yRm48VERhdGE+IHwgRGVlcEtleXM8VERhdGE+LFxuICAgIFRWYWx1ZSBleHRlbmRzIFRBY2Nlc3NvciBleHRlbmRzIEFjY2Vzc29yRm48VERhdGEsIGluZmVyIFRSZXR1cm4+XG4gICAgICA/IFRSZXR1cm5cbiAgICAgIDogVEFjY2Vzc29yIGV4dGVuZHMgRGVlcEtleXM8VERhdGE+XG4gICAgICA/IERlZXBWYWx1ZTxURGF0YSwgVEFjY2Vzc29yPlxuICAgICAgOiBuZXZlcixcbiAgPihcbiAgICBhY2Nlc3NvcjogVEFjY2Vzc29yLFxuICAgIGNvbHVtbjogVEFjY2Vzc29yIGV4dGVuZHMgQWNjZXNzb3JGbjxURGF0YT5cbiAgICAgID8gRGlzcGxheUNvbHVtbkRlZjxURGF0YSwgVFZhbHVlPlxuICAgICAgOiBJZGVudGlmaWVkQ29sdW1uRGVmPFREYXRhLCBUVmFsdWU+XG4gICkgPT4gQ29sdW1uRGVmPFREYXRhLCBUVmFsdWU+XG4gIGRpc3BsYXk6IChjb2x1bW46IERpc3BsYXlDb2x1bW5EZWY8VERhdGE+KSA9PiBDb2x1bW5EZWY8VERhdGEsIHVua25vd24+XG4gIGdyb3VwOiAoY29sdW1uOiBHcm91cENvbHVtbkRlZjxURGF0YT4pID0+IENvbHVtbkRlZjxURGF0YSwgdW5rbm93bj5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbkhlbHBlcjxcbiAgVERhdGEgZXh0ZW5kcyBSb3dEYXRhLFxuPigpOiBDb2x1bW5IZWxwZXI8VERhdGE+IHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NvcjogKGFjY2Vzc29yLCBjb2x1bW4pID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgYWNjZXNzb3IgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyAoe1xuICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgYWNjZXNzb3JGbjogYWNjZXNzb3IsXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgYWNjZXNzb3JLZXk6IGFjY2Vzc29yLFxuICAgICAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXk6IGNvbHVtbiA9PiBjb2x1bW4gYXMgQ29sdW1uRGVmPFREYXRhLCB1bmtub3duPixcbiAgICBncm91cDogY29sdW1uID0+IGNvbHVtbiBhcyBDb2x1bW5EZWY8VERhdGEsIHVua25vd24+LFxuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSb3cgfSBmcm9tICcuLi9jb3JlL3JvdydcbmltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb3JlUm93TW9kZWw8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPigpOiAoXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbikgPT4gKCkgPT4gUm93TW9kZWw8VERhdGE+IHtcbiAgcmV0dXJuIHRhYmxlID0+XG4gICAgbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5vcHRpb25zLmRhdGFdLFxuICAgICAgKFxuICAgICAgICBkYXRhXG4gICAgICApOiB7XG4gICAgICAgIHJvd3M6IFJvdzxURGF0YT5bXVxuICAgICAgICBmbGF0Um93czogUm93PFREYXRhPltdXG4gICAgICAgIHJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PlxuICAgICAgfSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd01vZGVsOiBSb3dNb2RlbDxURGF0YT4gPSB7XG4gICAgICAgICAgcm93czogW10sXG4gICAgICAgICAgZmxhdFJvd3M6IFtdLFxuICAgICAgICAgIHJvd3NCeUlkOiB7fSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Jvd3MgPSAoXG4gICAgICAgICAgb3JpZ2luYWxSb3dzOiBURGF0YVtdLFxuICAgICAgICAgIGRlcHRoID0gMCxcbiAgICAgICAgICBwYXJlbnRSb3c/OiBSb3c8VERhdGE+XG4gICAgICAgICk6IFJvdzxURGF0YT5bXSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm93cyA9IFtdIGFzIFJvdzxURGF0YT5bXVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5hbFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY291bGQgYmUgYW4gZXhwZW5zaXZlIGNoZWNrIGF0IHNjYWxlLCBzbyB3ZSBzaG91bGQgbW92ZSBpdCBzb21ld2hlcmUgZWxzZSwgYnV0IHdoZXJlP1xuICAgICAgICAgICAgLy8gaWYgKCFpZCkge1xuICAgICAgICAgICAgLy8gICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgZ2V0Um93SWQgZXhwZWN0ZWQgYW4gSUQsIGJ1dCBnb3QgJHtpZH1gKVxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJvd1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gY3JlYXRlUm93KFxuICAgICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgICAgdGFibGUuX2dldFJvd0lkKG9yaWdpbmFsUm93c1tpXSEsIGksIHBhcmVudFJvdyksXG4gICAgICAgICAgICAgIG9yaWdpbmFsUm93c1tpXSEsXG4gICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHBhcmVudFJvdz8uaWRcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBldmVyeSByb3cgaW4gYSBmbGF0IGFycmF5XG4gICAgICAgICAgICByb3dNb2RlbC5mbGF0Um93cy5wdXNoKHJvdylcbiAgICAgICAgICAgIC8vIEFsc28ga2VlcCB0cmFjayBvZiBldmVyeSByb3cgYnkgaXRzIElEXG4gICAgICAgICAgICByb3dNb2RlbC5yb3dzQnlJZFtyb3cuaWRdID0gcm93XG4gICAgICAgICAgICAvLyBQdXNoIHRhYmxlIHJvdyBpbnRvIHBhcmVudFxuICAgICAgICAgICAgcm93cy5wdXNoKHJvdylcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBvcmlnaW5hbCBzdWJyb3dzXG4gICAgICAgICAgICBpZiAodGFibGUub3B0aW9ucy5nZXRTdWJSb3dzKSB7XG4gICAgICAgICAgICAgIHJvdy5vcmlnaW5hbFN1YlJvd3MgPSB0YWJsZS5vcHRpb25zLmdldFN1YlJvd3MoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxSb3dzW2ldISxcbiAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAvLyBUaGVuIHJlY3Vyc2l2ZWx5IGFjY2VzcyB0aGVtXG4gICAgICAgICAgICAgIGlmIChyb3cub3JpZ2luYWxTdWJSb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByb3cuc3ViUm93cyA9IGFjY2Vzc1Jvd3Mocm93Lm9yaWdpbmFsU3ViUm93cywgZGVwdGggKyAxLCByb3cpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcm93c1xuICAgICAgICB9XG5cbiAgICAgICAgcm93TW9kZWwucm93cyA9IGFjY2Vzc1Jvd3MoZGF0YSlcblxuICAgICAgICByZXR1cm4gcm93TW9kZWxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFJvd01vZGVsJyxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1RhYmxlLFxuICAgICAgICBvbkNoYW5nZTogKCkgPT4ge1xuICAgICAgICAgIHRhYmxlLl9hdXRvUmVzZXRQYWdlSW5kZXgoKVxuICAgICAgICB9LFxuICAgICAgfVxuICAgIClcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJvdyB9IGZyb20gJy4uL2NvcmUvcm93J1xuaW1wb3J0IHsgUm93LCBSb3dNb2RlbCwgVGFibGUsIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJvd3M8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgcm93czogUm93PFREYXRhPltdLFxuICBmaWx0ZXJSb3dJbXBsOiAocm93OiBSb3c8VERhdGE+KSA9PiBhbnksXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbikge1xuICBpZiAodGFibGUub3B0aW9ucy5maWx0ZXJGcm9tTGVhZlJvd3MpIHtcbiAgICByZXR1cm4gZmlsdGVyUm93TW9kZWxGcm9tTGVhZnMocm93cywgZmlsdGVyUm93SW1wbCwgdGFibGUpXG4gIH1cblxuICByZXR1cm4gZmlsdGVyUm93TW9kZWxGcm9tUm9vdChyb3dzLCBmaWx0ZXJSb3dJbXBsLCB0YWJsZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJvd01vZGVsRnJvbUxlYWZzPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oXG4gIHJvd3NUb0ZpbHRlcjogUm93PFREYXRhPltdLFxuICBmaWx0ZXJSb3c6IChyb3c6IFJvdzxURGF0YT4pID0+IFJvdzxURGF0YT5bXSxcbiAgdGFibGU6IFRhYmxlPFREYXRhPlxuKTogUm93TW9kZWw8VERhdGE+IHtcbiAgY29uc3QgbmV3RmlsdGVyZWRGbGF0Um93czogUm93PFREYXRhPltdID0gW11cbiAgY29uc3QgbmV3RmlsdGVyZWRSb3dzQnlJZDogUmVjb3JkPHN0cmluZywgUm93PFREYXRhPj4gPSB7fVxuICBjb25zdCBtYXhEZXB0aCA9IHRhYmxlLm9wdGlvbnMubWF4TGVhZlJvd0ZpbHRlckRlcHRoID8/IDEwMFxuXG4gIGNvbnN0IHJlY3Vyc2VGaWx0ZXJSb3dzID0gKHJvd3NUb0ZpbHRlcjogUm93PFREYXRhPltdLCBkZXB0aCA9IDApID0+IHtcbiAgICBjb25zdCByb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuXG4gICAgLy8gRmlsdGVyIGZyb20gY2hpbGRyZW4gdXAgZmlyc3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3NUb0ZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHJvdyA9IHJvd3NUb0ZpbHRlcltpXSFcblxuICAgICAgY29uc3QgbmV3Um93ID0gY3JlYXRlUm93KFxuICAgICAgICB0YWJsZSxcbiAgICAgICAgcm93LmlkLFxuICAgICAgICByb3cub3JpZ2luYWwsXG4gICAgICAgIHJvdy5pbmRleCxcbiAgICAgICAgcm93LmRlcHRoLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHJvdy5wYXJlbnRJZFxuICAgICAgKVxuICAgICAgbmV3Um93LmNvbHVtbkZpbHRlcnMgPSByb3cuY29sdW1uRmlsdGVyc1xuXG4gICAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XG4gICAgICAgIG5ld1Jvdy5zdWJSb3dzID0gcmVjdXJzZUZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSlcbiAgICAgICAgcm93ID0gbmV3Um93XG5cbiAgICAgICAgaWYgKGZpbHRlclJvdyhyb3cpICYmICFuZXdSb3cuc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dzLnB1c2gocm93KVxuICAgICAgICAgIG5ld0ZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvd1xuICAgICAgICAgIG5ld0ZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJSb3cocm93KSB8fCBuZXdSb3cuc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dzLnB1c2gocm93KVxuICAgICAgICAgIG5ld0ZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvd1xuICAgICAgICAgIG5ld0ZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm93ID0gbmV3Um93XG4gICAgICAgIGlmIChmaWx0ZXJSb3cocm93KSkge1xuICAgICAgICAgIHJvd3MucHVzaChyb3cpXG4gICAgICAgICAgbmV3RmlsdGVyZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93XG4gICAgICAgICAgbmV3RmlsdGVyZWRGbGF0Um93cy5wdXNoKHJvdylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb3dzXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd3M6IHJlY3Vyc2VGaWx0ZXJSb3dzKHJvd3NUb0ZpbHRlciksXG4gICAgZmxhdFJvd3M6IG5ld0ZpbHRlcmVkRmxhdFJvd3MsXG4gICAgcm93c0J5SWQ6IG5ld0ZpbHRlcmVkUm93c0J5SWQsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJvd01vZGVsRnJvbVJvb3Q8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPihcbiAgcm93c1RvRmlsdGVyOiBSb3c8VERhdGE+W10sXG4gIGZpbHRlclJvdzogKHJvdzogUm93PFREYXRhPikgPT4gYW55LFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pOiBSb3dNb2RlbDxURGF0YT4ge1xuICBjb25zdCBuZXdGaWx0ZXJlZEZsYXRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuICBjb25zdCBuZXdGaWx0ZXJlZFJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PiA9IHt9XG4gIGNvbnN0IG1heERlcHRoID0gdGFibGUub3B0aW9ucy5tYXhMZWFmUm93RmlsdGVyRGVwdGggPz8gMTAwXG5cbiAgLy8gRmlsdGVycyB0b3AgbGV2ZWwgYW5kIG5lc3RlZCByb3dzXG4gIGNvbnN0IHJlY3Vyc2VGaWx0ZXJSb3dzID0gKHJvd3NUb0ZpbHRlcjogUm93PFREYXRhPltdLCBkZXB0aCA9IDApID0+IHtcbiAgICAvLyBGaWx0ZXIgZnJvbSBwYXJlbnRzIGRvd253YXJkIGZpcnN0XG5cbiAgICBjb25zdCByb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuXG4gICAgLy8gQXBwbHkgdGhlIGZpbHRlciB0byBhbnkgc3ViUm93c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93c1RvRmlsdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgcm93ID0gcm93c1RvRmlsdGVyW2ldIVxuXG4gICAgICBjb25zdCBwYXNzID0gZmlsdGVyUm93KHJvdylcblxuICAgICAgaWYgKHBhc3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdWJSb3dzPy5sZW5ndGggJiYgZGVwdGggPCBtYXhEZXB0aCkge1xuICAgICAgICAgIGNvbnN0IG5ld1JvdyA9IGNyZWF0ZVJvdyhcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgcm93LmlkLFxuICAgICAgICAgICAgcm93Lm9yaWdpbmFsLFxuICAgICAgICAgICAgcm93LmluZGV4LFxuICAgICAgICAgICAgcm93LmRlcHRoLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgcm93LnBhcmVudElkXG4gICAgICAgICAgKVxuICAgICAgICAgIG5ld1Jvdy5zdWJSb3dzID0gcmVjdXJzZUZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSlcbiAgICAgICAgICByb3cgPSBuZXdSb3dcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaChyb3cpXG4gICAgICAgIG5ld0ZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgIG5ld0ZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvd1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb3dzXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd3M6IHJlY3Vyc2VGaWx0ZXJSb3dzKHJvd3NUb0ZpbHRlciksXG4gICAgZmxhdFJvd3M6IG5ld0ZpbHRlcmVkRmxhdFJvd3MsXG4gICAgcm93c0J5SWQ6IG5ld0ZpbHRlcmVkUm93c0J5SWQsXG4gIH1cbn1cbiIsImltcG9ydCB7IFJlc29sdmVkQ29sdW1uRmlsdGVyIH0gZnJvbSAnLi4vZmVhdHVyZXMvRmlsdGVycydcbmltcG9ydCB7IFRhYmxlLCBSb3dNb2RlbCwgUm93LCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBmaWx0ZXJSb3dzIH0gZnJvbSAnLi9maWx0ZXJSb3dzVXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJlZFJvd01vZGVsPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogKFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pID0+ICgpID0+IFJvd01vZGVsPFREYXRhPiB7XG4gIHJldHVybiB0YWJsZSA9PlxuICAgIG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldFByZUZpbHRlcmVkUm93TW9kZWwoKSxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5jb2x1bW5GaWx0ZXJzLFxuICAgICAgICB0YWJsZS5nZXRTdGF0ZSgpLmdsb2JhbEZpbHRlcixcbiAgICAgIF0sXG4gICAgICAocm93TW9kZWwsIGNvbHVtbkZpbHRlcnMsIGdsb2JhbEZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXJvd01vZGVsLnJvd3MubGVuZ3RoIHx8XG4gICAgICAgICAgKCFjb2x1bW5GaWx0ZXJzPy5sZW5ndGggJiYgIWdsb2JhbEZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dNb2RlbC5mbGF0Um93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm93TW9kZWwuZmxhdFJvd3NbaV0hLmNvbHVtbkZpbHRlcnMgPSB7fVxuICAgICAgICAgICAgcm93TW9kZWwuZmxhdFJvd3NbaV0hLmNvbHVtbkZpbHRlcnNNZXRhID0ge31cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZENvbHVtbkZpbHRlcnM6IFJlc29sdmVkQ29sdW1uRmlsdGVyPFREYXRhPltdID0gW11cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRHbG9iYWxGaWx0ZXJzOiBSZXNvbHZlZENvbHVtbkZpbHRlcjxURGF0YT5bXSA9IFtdXG5cbiAgICAgICAgOyhjb2x1bW5GaWx0ZXJzID8/IFtdKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihkLmlkKVxuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbHRlckZuID0gY29sdW1uLmdldEZpbHRlckZuKClcblxuICAgICAgICAgIGlmICghZmlsdGVyRm4pIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgYSB2YWxpZCAnY29sdW1uLmZpbHRlckZuJyBmb3IgY29sdW1uIHdpdGggdGhlIElEOiAke2NvbHVtbi5pZH0uYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlZENvbHVtbkZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICBpZDogZC5pZCxcbiAgICAgICAgICAgIGZpbHRlckZuLFxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZTogZmlsdGVyRm4ucmVzb2x2ZUZpbHRlclZhbHVlPy4oZC52YWx1ZSkgPz8gZC52YWx1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGZpbHRlcmFibGVJZHMgPSBjb2x1bW5GaWx0ZXJzLm1hcChkID0+IGQuaWQpXG5cbiAgICAgICAgY29uc3QgZ2xvYmFsRmlsdGVyRm4gPSB0YWJsZS5nZXRHbG9iYWxGaWx0ZXJGbigpXG5cbiAgICAgICAgY29uc3QgZ2xvYmFsbHlGaWx0ZXJhYmxlQ29sdW1ucyA9IHRhYmxlXG4gICAgICAgICAgLmdldEFsbExlYWZDb2x1bW5zKClcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZ2V0Q2FuR2xvYmFsRmlsdGVyKCkpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdsb2JhbEZpbHRlciAmJlxuICAgICAgICAgIGdsb2JhbEZpbHRlckZuICYmXG4gICAgICAgICAgZ2xvYmFsbHlGaWx0ZXJhYmxlQ29sdW1ucy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyYWJsZUlkcy5wdXNoKCdfX2dsb2JhbF9fJylcblxuICAgICAgICAgIGdsb2JhbGx5RmlsdGVyYWJsZUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZWRHbG9iYWxGaWx0ZXJzLnB1c2goe1xuICAgICAgICAgICAgICBpZDogY29sdW1uLmlkLFxuICAgICAgICAgICAgICBmaWx0ZXJGbjogZ2xvYmFsRmlsdGVyRm4sXG4gICAgICAgICAgICAgIHJlc29sdmVkVmFsdWU6XG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyRm4ucmVzb2x2ZUZpbHRlclZhbHVlPy4oZ2xvYmFsRmlsdGVyKSA/P1xuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlcixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uRmlsdGVyXG4gICAgICAgIGxldCBjdXJyZW50R2xvYmFsRmlsdGVyXG5cbiAgICAgICAgLy8gRmxhZyB0aGUgcHJlZmlsdGVyZWQgcm93IG1vZGVsIHdpdGggZWFjaCBmaWx0ZXIgc3RhdGVcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dNb2RlbC5mbGF0Um93cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd01vZGVsLmZsYXRSb3dzW2pdIVxuXG4gICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnMgPSB7fVxuXG4gICAgICAgICAgaWYgKHJlc29sdmVkQ29sdW1uRmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRDb2x1bW5GaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5GaWx0ZXIgPSByZXNvbHZlZENvbHVtbkZpbHRlcnNbaV0hXG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gY3VycmVudENvbHVtbkZpbHRlci5pZFxuXG4gICAgICAgICAgICAgIC8vIFRhZyB0aGUgcm93IHdpdGggdGhlIGNvbHVtbiBmaWx0ZXIgc3RhdGVcbiAgICAgICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnNbaWRdID0gY3VycmVudENvbHVtbkZpbHRlci5maWx0ZXJGbihcbiAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgY3VycmVudENvbHVtbkZpbHRlci5yZXNvbHZlZFZhbHVlLFxuICAgICAgICAgICAgICAgIGZpbHRlck1ldGEgPT4ge1xuICAgICAgICAgICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnNNZXRhW2lkXSA9IGZpbHRlck1ldGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2ZWRHbG9iYWxGaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZEdsb2JhbEZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY3VycmVudEdsb2JhbEZpbHRlciA9IHJlc29sdmVkR2xvYmFsRmlsdGVyc1tpXSFcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSBjdXJyZW50R2xvYmFsRmlsdGVyLmlkXG4gICAgICAgICAgICAgIC8vIFRhZyB0aGUgcm93IHdpdGggdGhlIGZpcnN0IHRydXRoeSBnbG9iYWwgZmlsdGVyIHN0YXRlXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjdXJyZW50R2xvYmFsRmlsdGVyLmZpbHRlckZuKFxuICAgICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50R2xvYmFsRmlsdGVyLnJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICBmaWx0ZXJNZXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcm93LmNvbHVtbkZpbHRlcnNNZXRhW2lkXSA9IGZpbHRlck1ldGFcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJvdy5jb2x1bW5GaWx0ZXJzLl9fZ2xvYmFsX18gPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocm93LmNvbHVtbkZpbHRlcnMuX19nbG9iYWxfXyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICByb3cuY29sdW1uRmlsdGVycy5fX2dsb2JhbF9fID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJSb3dzSW1wbCA9IChyb3c6IFJvdzxURGF0YT4pID0+IHtcbiAgICAgICAgICAvLyBIb3Jpem9udGFsbHkgZmlsdGVyIHJvd3MgdGhyb3VnaCBlYWNoIGNvbHVtblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyYWJsZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJvdy5jb2x1bW5GaWx0ZXJzW2ZpbHRlcmFibGVJZHNbaV0hXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWx0ZXIgZmluYWwgcm93cyB1c2luZyBhbGwgb2YgdGhlIGFjdGl2ZSBmaWx0ZXJzXG4gICAgICAgIHJldHVybiBmaWx0ZXJSb3dzKHJvd01vZGVsLnJvd3MsIGZpbHRlclJvd3NJbXBsLCB0YWJsZSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEZpbHRlcmVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICAgIG9uQ2hhbmdlOiAoKSA9PiB7XG4gICAgICAgICAgdGFibGUuX2F1dG9SZXNldFBhZ2VJbmRleCgpXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKVxufVxuIiwiaW1wb3J0IHsgVGFibGUsIFJvd01vZGVsLCBSb3csIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1lbW8gfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGZpbHRlclJvd3MgfSBmcm9tICcuL2ZpbHRlclJvd3NVdGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhY2V0ZWRSb3dNb2RlbDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KCk6IChcbiAgdGFibGU6IFRhYmxlPFREYXRhPixcbiAgY29sdW1uSWQ6IHN0cmluZ1xuKSA9PiAoKSA9PiBSb3dNb2RlbDxURGF0YT4ge1xuICByZXR1cm4gKHRhYmxlLCBjb2x1bW5JZCkgPT5cbiAgICBtZW1vKFxuICAgICAgKCkgPT4gW1xuICAgICAgICB0YWJsZS5nZXRQcmVGaWx0ZXJlZFJvd01vZGVsKCksXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuY29sdW1uRmlsdGVycyxcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5nbG9iYWxGaWx0ZXIsXG4gICAgICAgIHRhYmxlLmdldEZpbHRlcmVkUm93TW9kZWwoKSxcbiAgICAgIF0sXG4gICAgICAocHJlUm93TW9kZWwsIGNvbHVtbkZpbHRlcnMsIGdsb2JhbEZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXByZVJvd01vZGVsLnJvd3MubGVuZ3RoIHx8XG4gICAgICAgICAgKCFjb2x1bW5GaWx0ZXJzPy5sZW5ndGggJiYgIWdsb2JhbEZpbHRlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHByZVJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJhYmxlSWRzID0gW1xuICAgICAgICAgIC4uLmNvbHVtbkZpbHRlcnMubWFwKGQgPT4gZC5pZCkuZmlsdGVyKGQgPT4gZCAhPT0gY29sdW1uSWQpLFxuICAgICAgICAgIGdsb2JhbEZpbHRlciA/ICdfX2dsb2JhbF9fJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cblxuICAgICAgICBjb25zdCBmaWx0ZXJSb3dzSW1wbCA9IChyb3c6IFJvdzxURGF0YT4pID0+IHtcbiAgICAgICAgICAvLyBIb3Jpem9udGFsbHkgZmlsdGVyIHJvd3MgdGhyb3VnaCBlYWNoIGNvbHVtblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyYWJsZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHJvdy5jb2x1bW5GaWx0ZXJzW2ZpbHRlcmFibGVJZHNbaV0hXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsdGVyUm93cyhwcmVSb3dNb2RlbC5yb3dzLCBmaWx0ZXJSb3dzSW1wbCwgdGFibGUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgICAnZ2V0RmFjZXRlZFJvd01vZGVsXycgKyBjb2x1bW5JZCxcbiAgICAgICAgZGVidWc6ICgpID0+IHRhYmxlLm9wdGlvbnMuZGVidWdBbGwgPz8gdGFibGUub3B0aW9ucy5kZWJ1Z1RhYmxlLFxuICAgICAgICBvbkNoYW5nZTogKCkgPT4ge30sXG4gICAgICB9XG4gICAgKVxufVxuIiwiaW1wb3J0IHsgVGFibGUsIFJvd0RhdGEgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhY2V0ZWRVbmlxdWVWYWx1ZXM8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPigpOiAoXG4gIHRhYmxlOiBUYWJsZTxURGF0YT4sXG4gIGNvbHVtbklkOiBzdHJpbmdcbikgPT4gKCkgPT4gTWFwPGFueSwgbnVtYmVyPiB7XG4gIHJldHVybiAodGFibGUsIGNvbHVtbklkKSA9PlxuICAgIG1lbW8oXG4gICAgICAoKSA9PiBbdGFibGUuZ2V0Q29sdW1uKGNvbHVtbklkKT8uZ2V0RmFjZXRlZFJvd01vZGVsKCldLFxuICAgICAgZmFjZXRlZFJvd01vZGVsID0+IHtcbiAgICAgICAgaWYgKCFmYWNldGVkUm93TW9kZWwpIHJldHVybiBuZXcgTWFwKClcblxuICAgICAgICBsZXQgZmFjZXRlZFVuaXF1ZVZhbHVlcyA9IG5ldyBNYXA8YW55LCBudW1iZXI+KClcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhY2V0ZWRSb3dNb2RlbC5mbGF0Um93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9XG4gICAgICAgICAgICBmYWNldGVkUm93TW9kZWwuZmxhdFJvd3NbaV0hLmdldFVuaXF1ZVZhbHVlczxudW1iZXI+KGNvbHVtbklkKVxuXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2pdIVxuXG4gICAgICAgICAgICBpZiAoZmFjZXRlZFVuaXF1ZVZhbHVlcy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZhY2V0ZWRVbmlxdWVWYWx1ZXMuc2V0KFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIChmYWNldGVkVW5pcXVlVmFsdWVzLmdldCh2YWx1ZSkgPz8gMCkgKyAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZhY2V0ZWRVbmlxdWVWYWx1ZXMuc2V0KHZhbHVlLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWNldGVkVW5pcXVlVmFsdWVzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgICAnZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlc18nICsgY29sdW1uSWQsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHt9LFxuICAgICAgfVxuICAgIClcbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWNldGVkTWluTWF4VmFsdWVzPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogKFxuICB0YWJsZTogVGFibGU8VERhdGE+LFxuICBjb2x1bW5JZDogc3RyaW5nXG4pID0+ICgpID0+IHVuZGVmaW5lZCB8IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gKHRhYmxlLCBjb2x1bW5JZCkgPT5cbiAgICBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldENvbHVtbihjb2x1bW5JZCk/LmdldEZhY2V0ZWRSb3dNb2RlbCgpXSxcbiAgICAgIGZhY2V0ZWRSb3dNb2RlbCA9PiB7XG4gICAgICAgIGlmICghZmFjZXRlZFJvd01vZGVsKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9XG4gICAgICAgICAgZmFjZXRlZFJvd01vZGVsLmZsYXRSb3dzWzBdPy5nZXRVbmlxdWVWYWx1ZXMoY29sdW1uSWQpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmYWNldGVkTWluTWF4VmFsdWVzOiBbYW55LCBhbnldID0gW2ZpcnN0VmFsdWUsIGZpcnN0VmFsdWVdXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmYWNldGVkUm93TW9kZWwuZmxhdFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgZmFjZXRlZFJvd01vZGVsLmZsYXRSb3dzW2ldIS5nZXRVbmlxdWVWYWx1ZXM8bnVtYmVyPihjb2x1bW5JZClcblxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tqXSFcblxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgZmFjZXRlZE1pbk1heFZhbHVlc1swXSkge1xuICAgICAgICAgICAgICBmYWNldGVkTWluTWF4VmFsdWVzWzBdID0gdmFsdWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiBmYWNldGVkTWluTWF4VmFsdWVzWzFdKSB7XG4gICAgICAgICAgICAgIGZhY2V0ZWRNaW5NYXhWYWx1ZXNbMV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWNldGVkTWluTWF4VmFsdWVzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgICAnZ2V0RmFjZXRlZE1pbk1heFZhbHVlc18nICsgY29sdW1uSWQsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHt9LFxuICAgICAgfVxuICAgIClcbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBTb3J0aW5nRm4gfSBmcm9tICcuLi9mZWF0dXJlcy9Tb3J0aW5nJ1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJy4uL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29ydGVkUm93TW9kZWw8VERhdGEgZXh0ZW5kcyBSb3dEYXRhPigpOiAoXG4gIHRhYmxlOiBUYWJsZTxURGF0YT5cbikgPT4gKCkgPT4gUm93TW9kZWw8VERhdGE+IHtcbiAgcmV0dXJuIHRhYmxlID0+XG4gICAgbWVtbyhcbiAgICAgICgpID0+IFt0YWJsZS5nZXRTdGF0ZSgpLnNvcnRpbmcsIHRhYmxlLmdldFByZVNvcnRlZFJvd01vZGVsKCldLFxuICAgICAgKHNvcnRpbmcsIHJvd01vZGVsKSA9PiB7XG4gICAgICAgIGlmICghcm93TW9kZWwucm93cy5sZW5ndGggfHwgIXNvcnRpbmc/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiByb3dNb2RlbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gdGFibGUuZ2V0U3RhdGUoKS5zb3J0aW5nXG5cbiAgICAgICAgY29uc3Qgc29ydGVkRmxhdFJvd3M6IFJvdzxURGF0YT5bXSA9IFtdXG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCBzb3J0aW5ncyB0aGF0IGNvcnJlc3BvbmQgdG8gbm9uIGV4aXN0aW5nIGNvbHVtbnNcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlU29ydGluZyA9IHNvcnRpbmdTdGF0ZS5maWx0ZXIoc29ydCA9PlxuICAgICAgICAgIHRhYmxlLmdldENvbHVtbihzb3J0LmlkKT8uZ2V0Q2FuU29ydCgpXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBjb2x1bW5JbmZvQnlJZDogUmVjb3JkPFxuICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3J0VW5kZWZpbmVkPzogZmFsc2UgfCAtMSB8IDFcbiAgICAgICAgICAgIGludmVydFNvcnRpbmc/OiBib29sZWFuXG4gICAgICAgICAgICBzb3J0aW5nRm46IFNvcnRpbmdGbjxURGF0YT5cbiAgICAgICAgICB9XG4gICAgICAgID4gPSB7fVxuXG4gICAgICAgIGF2YWlsYWJsZVNvcnRpbmcuZm9yRWFjaChzb3J0RW50cnkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihzb3J0RW50cnkuaWQpXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHJldHVyblxuXG4gICAgICAgICAgY29sdW1uSW5mb0J5SWRbc29ydEVudHJ5LmlkXSA9IHtcbiAgICAgICAgICAgIHNvcnRVbmRlZmluZWQ6IGNvbHVtbi5jb2x1bW5EZWYuc29ydFVuZGVmaW5lZCxcbiAgICAgICAgICAgIGludmVydFNvcnRpbmc6IGNvbHVtbi5jb2x1bW5EZWYuaW52ZXJ0U29ydGluZyxcbiAgICAgICAgICAgIHNvcnRpbmdGbjogY29sdW1uLmdldFNvcnRpbmdGbigpLFxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzb3J0RGF0YSA9IChyb3dzOiBSb3c8VERhdGE+W10pID0+IHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgYWxzbyBwZXJmb3JtIGEgc3RhYmxlIHNvcnRpbmcgdXNpbmcgdGhlIHJvdyBpbmRleFxuICAgICAgICAgIC8vIGlmIG5lZWRlZC5cbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gcm93cy5tYXAocm93ID0+ICh7Li4ucm93fSkpXG5cbiAgICAgICAgICBzb3J0ZWREYXRhLnNvcnQoKHJvd0EsIHJvd0IpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXZhaWxhYmxlU29ydGluZy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBjb25zdCBzb3J0RW50cnkgPSBhdmFpbGFibGVTb3J0aW5nW2ldIVxuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmZvID0gY29sdW1uSW5mb0J5SWRbc29ydEVudHJ5LmlkXSFcbiAgICAgICAgICAgICAgY29uc3QgaXNEZXNjID0gc29ydEVudHJ5Py5kZXNjID8/IGZhbHNlXG5cbiAgICAgICAgICAgICAgbGV0IHNvcnRJbnQgPSAwXG5cbiAgICAgICAgICAgICAgLy8gQWxsIHNvcnRpbmcgaW50cyBzaG91bGQgYWx3YXlzIHJldHVybiBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZm8uc29ydFVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFWYWx1ZSA9IHJvd0EuZ2V0VmFsdWUoc29ydEVudHJ5LmlkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGJWYWx1ZSA9IHJvd0IuZ2V0VmFsdWUoc29ydEVudHJ5LmlkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYVVuZGVmaW5lZCA9IGFWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgY29uc3QgYlVuZGVmaW5lZCA9IGJWYWx1ZSA9PT0gdW5kZWZpbmVkXG5cbiAgICAgICAgICAgICAgICBpZiAoYVVuZGVmaW5lZCB8fCBiVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBzb3J0SW50ID1cbiAgICAgICAgICAgICAgICAgICAgYVVuZGVmaW5lZCAmJiBiVW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgOiBhVW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb2x1bW5JbmZvLnNvcnRVbmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA6IC1jb2x1bW5JbmZvLnNvcnRVbmRlZmluZWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc29ydEludCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNvcnRJbnQgPSBjb2x1bW5JbmZvLnNvcnRpbmdGbihyb3dBLCByb3dCLCBzb3J0RW50cnkuaWQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiBzb3J0aW5nIGlzIG5vbi16ZXJvLCB0YWtlIGNhcmUgb2YgZGVzYyBhbmQgaW52ZXJzaW9uXG4gICAgICAgICAgICAgIGlmIChzb3J0SW50ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgc29ydEludCAqPSAtMVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmZvLmludmVydFNvcnRpbmcpIHtcbiAgICAgICAgICAgICAgICAgIHNvcnRJbnQgKj0gLTFcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc29ydEludFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByb3dBLmluZGV4IC0gcm93Qi5pbmRleFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc3ViLXJvd3MsIHNvcnQgdGhlbVxuICAgICAgICAgIHNvcnRlZERhdGEuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgc29ydGVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByb3cuc3ViUm93cyA9IHNvcnREYXRhKHJvdy5zdWJSb3dzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gc29ydGVkRGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb3dzOiBzb3J0RGF0YShyb3dNb2RlbC5yb3dzKSxcbiAgICAgICAgICBmbGF0Um93czogc29ydGVkRmxhdFJvd3MsXG4gICAgICAgICAgcm93c0J5SWQ6IHJvd01vZGVsLnJvd3NCeUlkLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmICdnZXRTb3J0ZWRSb3dNb2RlbCcsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICB0YWJsZS5fYXV0b1Jlc2V0UGFnZUluZGV4KClcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApXG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSb3cgfSBmcm9tICcuLi9jb3JlL3JvdydcbmltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBmbGF0dGVuQnksIG1lbW8gfSBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyb3VwZWRSb3dNb2RlbDxURGF0YSBleHRlbmRzIFJvd0RhdGE+KCk6IChcbiAgdGFibGU6IFRhYmxlPFREYXRhPlxuKSA9PiAoKSA9PiBSb3dNb2RlbDxURGF0YT4ge1xuICByZXR1cm4gdGFibGUgPT5cbiAgICBtZW1vKFxuICAgICAgKCkgPT4gW3RhYmxlLmdldFN0YXRlKCkuZ3JvdXBpbmcsIHRhYmxlLmdldFByZUdyb3VwZWRSb3dNb2RlbCgpXSxcbiAgICAgIChncm91cGluZywgcm93TW9kZWwpID0+IHtcbiAgICAgICAgaWYgKCFyb3dNb2RlbC5yb3dzLmxlbmd0aCB8fCAhZ3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWx0ZXIgdGhlIGdyb3VwaW5nIGxpc3QgZG93biB0byBjb2x1bW5zIHRoYXQgZXhpc3RcbiAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cGluZyA9IGdyb3VwaW5nLmZpbHRlcihjb2x1bW5JZCA9PlxuICAgICAgICAgIHRhYmxlLmdldENvbHVtbihjb2x1bW5JZClcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IGdyb3VwZWRGbGF0Um93czogUm93PFREYXRhPltdID0gW11cbiAgICAgICAgY29uc3QgZ3JvdXBlZFJvd3NCeUlkOiBSZWNvcmQ8c3RyaW5nLCBSb3c8VERhdGE+PiA9IHt9XG4gICAgICAgIC8vIGNvbnN0IG9ubHlHcm91cGVkRmxhdFJvd3M6IFJvd1tdID0gW107XG4gICAgICAgIC8vIGNvbnN0IG9ubHlHcm91cGVkUm93c0J5SWQ6IFJlY29yZDxSb3dJZCwgUm93PiA9IHt9O1xuICAgICAgICAvLyBjb25zdCBub25Hcm91cGVkRmxhdFJvd3M6IFJvd1tdID0gW107XG4gICAgICAgIC8vIGNvbnN0IG5vbkdyb3VwZWRSb3dzQnlJZDogUmVjb3JkPFJvd0lkLCBSb3c+ID0ge307XG5cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ3JvdXAgdGhlIGRhdGFcbiAgICAgICAgY29uc3QgZ3JvdXBVcFJlY3Vyc2l2ZWx5ID0gKFxuICAgICAgICAgIHJvd3M6IFJvdzxURGF0YT5bXSxcbiAgICAgICAgICBkZXB0aCA9IDAsXG4gICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmdcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgLy8gR3JvdXBpbmcgZGVwdGggaGFzIGJlZW4gYmVlbiBtZXRcbiAgICAgICAgICAvLyBTdG9wIGdyb3VwaW5nIGFuZCBzaW1wbHkgcmV3cml0ZSB0aGQgZGVwdGggYW5kIHJvdyByZWxhdGlvbnNoaXBzXG4gICAgICAgICAgaWYgKGRlcHRoID49IGV4aXN0aW5nR3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm93cy5tYXAocm93ID0+IHtcbiAgICAgICAgICAgICAgcm93LmRlcHRoID0gZGVwdGhcblxuICAgICAgICAgICAgICBncm91cGVkRmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgICAgIGdyb3VwZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93XG5cbiAgICAgICAgICAgICAgaWYgKHJvdy5zdWJSb3dzKSB7XG4gICAgICAgICAgICAgICAgcm93LnN1YlJvd3MgPSBncm91cFVwUmVjdXJzaXZlbHkocm93LnN1YlJvd3MsIGRlcHRoICsgMSwgcm93LmlkKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb2x1bW5JZDogc3RyaW5nID0gZXhpc3RpbmdHcm91cGluZ1tkZXB0aF0hXG5cbiAgICAgICAgICAvLyBHcm91cCB0aGUgcm93cyB0b2dldGhlciBmb3IgdGhpcyBsZXZlbFxuICAgICAgICAgIGNvbnN0IHJvd0dyb3Vwc01hcCA9IGdyb3VwQnkocm93cywgY29sdW1uSWQpXG5cbiAgICAgICAgICAvLyBQZWZvcm0gYWdncmVnYXRpb25zIGZvciBlYWNoIGdyb3VwXG4gICAgICAgICAgY29uc3QgYWdncmVnYXRlZEdyb3VwZWRSb3dzID0gQXJyYXkuZnJvbShyb3dHcm91cHNNYXAuZW50cmllcygpKS5tYXAoXG4gICAgICAgICAgICAoW2dyb3VwaW5nVmFsdWUsIGdyb3VwZWRSb3dzXSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGlkID0gYCR7Y29sdW1uSWR9OiR7Z3JvdXBpbmdWYWx1ZX1gXG4gICAgICAgICAgICAgIGlkID0gcGFyZW50SWQgPyBgJHtwYXJlbnRJZH0+JHtpZH1gIDogaWRcblxuICAgICAgICAgICAgICAvLyBGaXJzdCwgUmVjdXJzZSB0byBncm91cCBzdWIgcm93cyBiZWZvcmUgYWdncmVnYXRpb25cbiAgICAgICAgICAgICAgY29uc3Qgc3ViUm93cyA9IGdyb3VwVXBSZWN1cnNpdmVseShncm91cGVkUm93cywgZGVwdGggKyAxLCBpZClcblxuICAgICAgICAgICAgICAvLyBGbGF0dGVuIHRoZSBsZWFmIHJvd3Mgb2YgdGhlIHJvd3MgaW4gdGhpcyBncm91cFxuICAgICAgICAgICAgICBjb25zdCBsZWFmUm93cyA9IGRlcHRoXG4gICAgICAgICAgICAgICAgPyBmbGF0dGVuQnkoZ3JvdXBlZFJvd3MsIHJvdyA9PiByb3cuc3ViUm93cylcbiAgICAgICAgICAgICAgICA6IGdyb3VwZWRSb3dzXG5cbiAgICAgICAgICAgICAgY29uc3Qgcm93ID0gY3JlYXRlUm93KFxuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIGxlYWZSb3dzWzBdIS5vcmlnaW5hbCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGFyZW50SWRcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocm93LCB7XG4gICAgICAgICAgICAgICAgZ3JvdXBpbmdDb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgICAgICAgICAgZ3JvdXBpbmdWYWx1ZSxcbiAgICAgICAgICAgICAgICBzdWJSb3dzLFxuICAgICAgICAgICAgICAgIGxlYWZSb3dzLFxuICAgICAgICAgICAgICAgIGdldFZhbHVlOiAoY29sdW1uSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWdncmVnYXRlIGNvbHVtbnMgdGhhdCBhcmUgaW4gdGhlIGdyb3VwaW5nXG4gICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdHcm91cGluZy5pbmNsdWRlcyhjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdy5fdmFsdWVzQ2FjaGUuaGFzT3duUHJvcGVydHkoY29sdW1uSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5fdmFsdWVzQ2FjaGVbY29sdW1uSWRdXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJvd3NbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICByb3cuX3ZhbHVlc0NhY2hlW2NvbHVtbklkXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUm93c1swXS5nZXRWYWx1ZShjb2x1bW5JZCkgPz8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93Ll92YWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihjb2x1bW5JZClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZUZuID0gY29sdW1uPy5nZXRBZ2dyZWdhdGlvbkZuKClcblxuICAgICAgICAgICAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF0gPSBhZ2dyZWdhdGVGbihcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICBsZWFmUm93cyxcbiAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUm93c1xuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvdy5fZ3JvdXBpbmdWYWx1ZXNDYWNoZVtjb2x1bW5JZF1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHN1YlJvd3MuZm9yRWFjaChzdWJSb3cgPT4ge1xuICAgICAgICAgICAgICAgIGdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdylcbiAgICAgICAgICAgICAgICBncm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvd1xuICAgICAgICAgICAgICAgIC8vIGlmIChzdWJSb3cuZ2V0SXNHcm91cGVkPy4oKSkge1xuICAgICAgICAgICAgICAgIC8vICAgb25seUdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgICAgICAgLy8gICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIG5vbkdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgICAgICAgLy8gICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICAgICAgfVxuICAgICAgICAgIClcblxuICAgICAgICAgIHJldHVybiBhZ2dyZWdhdGVkR3JvdXBlZFJvd3NcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSb3dzID0gZ3JvdXBVcFJlY3Vyc2l2ZWx5KHJvd01vZGVsLnJvd3MsIDApXG5cbiAgICAgICAgZ3JvdXBlZFJvd3MuZm9yRWFjaChzdWJSb3cgPT4ge1xuICAgICAgICAgIGdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdylcbiAgICAgICAgICBncm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvd1xuICAgICAgICAgIC8vIGlmIChzdWJSb3cuZ2V0SXNHcm91cGVkPy4oKSkge1xuICAgICAgICAgIC8vICAgb25seUdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgLy8gICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAvLyAgIG5vbkdyb3VwZWRGbGF0Um93cy5wdXNoKHN1YlJvdyk7XG4gICAgICAgICAgLy8gICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb3dzOiBncm91cGVkUm93cyxcbiAgICAgICAgICBmbGF0Um93czogZ3JvdXBlZEZsYXRSb3dzLFxuICAgICAgICAgIHJvd3NCeUlkOiBncm91cGVkUm93c0J5SWQsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEdyb3VwZWRSb3dNb2RlbCcsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgICAgb25DaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICB0YWJsZS5fcXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGUuX2F1dG9SZXNldEV4cGFuZGVkKClcbiAgICAgICAgICAgIHRhYmxlLl9hdXRvUmVzZXRQYWdlSW5kZXgoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKVxufVxuXG5mdW5jdGlvbiBncm91cEJ5PFREYXRhIGV4dGVuZHMgUm93RGF0YT4ocm93czogUm93PFREYXRhPltdLCBjb2x1bW5JZDogc3RyaW5nKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcDxhbnksIFJvdzxURGF0YT5bXT4oKVxuXG4gIHJldHVybiByb3dzLnJlZHVjZSgobWFwLCByb3cpID0+IHtcbiAgICBjb25zdCByZXNLZXkgPSBgJHtyb3cuZ2V0R3JvdXBpbmdWYWx1ZShjb2x1bW5JZCl9YFxuICAgIGNvbnN0IHByZXZpb3VzID0gbWFwLmdldChyZXNLZXkpXG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgbWFwLnNldChyZXNLZXksIFtyb3ddKVxuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2aW91cy5wdXNoKHJvdylcbiAgICB9XG4gICAgcmV0dXJuIG1hcFxuICB9LCBncm91cE1hcClcbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3csIFJvd01vZGVsLCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBhbmRlZFJvd01vZGVsPFREYXRhIGV4dGVuZHMgUm93RGF0YT4oKTogKFxuICB0YWJsZTogVGFibGU8VERhdGE+XG4pID0+ICgpID0+IFJvd01vZGVsPFREYXRhPiB7XG4gIHJldHVybiB0YWJsZSA9PlxuICAgIG1lbW8oXG4gICAgICAoKSA9PiBbXG4gICAgICAgIHRhYmxlLmdldFN0YXRlKCkuZXhwYW5kZWQsXG4gICAgICAgIHRhYmxlLmdldFByZUV4cGFuZGVkUm93TW9kZWwoKSxcbiAgICAgICAgdGFibGUub3B0aW9ucy5wYWdpbmF0ZUV4cGFuZGVkUm93cyxcbiAgICAgIF0sXG4gICAgICAoZXhwYW5kZWQsIHJvd01vZGVsLCBwYWdpbmF0ZUV4cGFuZGVkUm93cykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXJvd01vZGVsLnJvd3MubGVuZ3RoIHx8XG4gICAgICAgICAgKGV4cGFuZGVkICE9PSB0cnVlICYmICFPYmplY3Qua2V5cyhleHBhbmRlZCA/PyB7fSkubGVuZ3RoKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gcm93TW9kZWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFnaW5hdGVFeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgICAvLyBPbmx5IGV4cGFuZCByb3dzIGF0IHRoaXMgcG9pbnQgaWYgdGhleSBhcmUgYmVpbmcgcGFnaW5hdGVkXG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhwYW5kUm93cyhyb3dNb2RlbClcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldEV4cGFuZGVkUm93TW9kZWwnLFxuICAgICAgICBkZWJ1ZzogKCkgPT4gdGFibGUub3B0aW9ucy5kZWJ1Z0FsbCA/PyB0YWJsZS5vcHRpb25zLmRlYnVnVGFibGUsXG4gICAgICB9XG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kUm93czxURGF0YSBleHRlbmRzIFJvd0RhdGE+KHJvd01vZGVsOiBSb3dNb2RlbDxURGF0YT4pIHtcbiAgY29uc3QgZXhwYW5kZWRSb3dzOiBSb3c8VERhdGE+W10gPSBbXVxuXG4gIGNvbnN0IGhhbmRsZVJvdyA9IChyb3c6IFJvdzxURGF0YT4pID0+IHtcbiAgICBleHBhbmRlZFJvd3MucHVzaChyb3cpXG5cbiAgICBpZiAocm93LnN1YlJvd3M/Lmxlbmd0aCAmJiByb3cuZ2V0SXNFeHBhbmRlZCgpKSB7XG4gICAgICByb3cuc3ViUm93cy5mb3JFYWNoKGhhbmRsZVJvdylcbiAgICB9XG4gIH1cblxuICByb3dNb2RlbC5yb3dzLmZvckVhY2goaGFuZGxlUm93KVxuXG4gIHJldHVybiB7XG4gICAgcm93czogZXhwYW5kZWRSb3dzLFxuICAgIGZsYXRSb3dzOiByb3dNb2RlbC5mbGF0Um93cyxcbiAgICByb3dzQnlJZDogcm93TW9kZWwucm93c0J5SWQsXG4gIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlLCBSb3dNb2RlbCwgUm93LCBSb3dEYXRhIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBtZW1vIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBleHBhbmRSb3dzIH0gZnJvbSAnLi9nZXRFeHBhbmRlZFJvd01vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnaW5hdGlvblJvd01vZGVsPFREYXRhIGV4dGVuZHMgUm93RGF0YT4ob3B0cz86IHtcbiAgaW5pdGlhbFN5bmM6IGJvb2xlYW5cbn0pOiAodGFibGU6IFRhYmxlPFREYXRhPikgPT4gKCkgPT4gUm93TW9kZWw8VERhdGE+IHtcbiAgcmV0dXJuIHRhYmxlID0+XG4gICAgbWVtbyhcbiAgICAgICgpID0+IFtcbiAgICAgICAgdGFibGUuZ2V0U3RhdGUoKS5wYWdpbmF0aW9uLFxuICAgICAgICB0YWJsZS5nZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwoKSxcbiAgICAgICAgdGFibGUub3B0aW9ucy5wYWdpbmF0ZUV4cGFuZGVkUm93c1xuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0YWJsZS5nZXRTdGF0ZSgpLmV4cGFuZGVkLFxuICAgICAgXSxcbiAgICAgIChwYWdpbmF0aW9uLCByb3dNb2RlbCkgPT4ge1xuICAgICAgICBpZiAoIXJvd01vZGVsLnJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd01vZGVsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHBhZ2VTaXplLCBwYWdlSW5kZXggfSA9IHBhZ2luYXRpb25cbiAgICAgICAgbGV0IHsgcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkIH0gPSByb3dNb2RlbFxuICAgICAgICBjb25zdCBwYWdlU3RhcnQgPSBwYWdlU2l6ZSAqIHBhZ2VJbmRleFxuICAgICAgICBjb25zdCBwYWdlRW5kID0gcGFnZVN0YXJ0ICsgcGFnZVNpemVcblxuICAgICAgICByb3dzID0gcm93cy5zbGljZShwYWdlU3RhcnQsIHBhZ2VFbmQpXG5cbiAgICAgICAgbGV0IHBhZ2luYXRlZFJvd01vZGVsOiBSb3dNb2RlbDxURGF0YT5cblxuICAgICAgICBpZiAoIXRhYmxlLm9wdGlvbnMucGFnaW5hdGVFeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgICBwYWdpbmF0ZWRSb3dNb2RlbCA9IGV4cGFuZFJvd3Moe1xuICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgIGZsYXRSb3dzLFxuICAgICAgICAgICAgcm93c0J5SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYWdpbmF0ZWRSb3dNb2RlbCA9IHtcbiAgICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgICBmbGF0Um93cyxcbiAgICAgICAgICAgIHJvd3NCeUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2luYXRlZFJvd01vZGVsLmZsYXRSb3dzID0gW11cblxuICAgICAgICBjb25zdCBoYW5kbGVSb3cgPSAocm93OiBSb3c8VERhdGE+KSA9PiB7XG4gICAgICAgICAgcGFnaW5hdGVkUm93TW9kZWwuZmxhdFJvd3MucHVzaChyb3cpXG4gICAgICAgICAgaWYgKHJvdy5zdWJSb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgcm93LnN1YlJvd3MuZm9yRWFjaChoYW5kbGVSb3cpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcGFnaW5hdGVkUm93TW9kZWwucm93cy5mb3JFYWNoKGhhbmRsZVJvdylcblxuICAgICAgICByZXR1cm4gcGFnaW5hdGVkUm93TW9kZWxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgJiYgJ2dldFBhZ2luYXRpb25Sb3dNb2RlbCcsXG4gICAgICAgIGRlYnVnOiAoKSA9PiB0YWJsZS5vcHRpb25zLmRlYnVnQWxsID8/IHRhYmxlLm9wdGlvbnMuZGVidWdUYWJsZSxcbiAgICAgIH1cbiAgICApXG59XG4iXSwibmFtZXMiOlsiZnVuY3Rpb25hbFVwZGF0ZSIsInVwZGF0ZXIiLCJpbnB1dCIsIm5vb3AiLCJtYWtlU3RhdGVVcGRhdGVyIiwia2V5IiwiaW5zdGFuY2UiLCJzZXRTdGF0ZSIsIm9sZCIsImlzRnVuY3Rpb24iLCJkIiwiRnVuY3Rpb24iLCJpc051bWJlckFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZXZlcnkiLCJ2YWwiLCJmbGF0dGVuQnkiLCJhcnIiLCJnZXRDaGlsZHJlbiIsImZsYXQiLCJyZWN1cnNlIiwic3ViQXJyIiwiZm9yRWFjaCIsIml0ZW0iLCJwdXNoIiwiY2hpbGRyZW4iLCJsZW5ndGgiLCJtZW1vIiwiZ2V0RGVwcyIsImZuIiwib3B0cyIsImRlcHMiLCJyZXN1bHQiLCJkZXBUaW1lIiwiZGVidWciLCJEYXRlIiwibm93IiwibmV3RGVwcyIsImRlcHNDaGFuZ2VkIiwic29tZSIsImRlcCIsImluZGV4IiwicmVzdWx0VGltZSIsIm9uQ2hhbmdlIiwiZGVwRW5kVGltZSIsIk1hdGgiLCJyb3VuZCIsInJlc3VsdEVuZFRpbWUiLCJyZXN1bHRGcHNQZXJjZW50YWdlIiwicGFkIiwic3RyIiwibnVtIiwiU3RyaW5nIiwiY29uc29sZSIsImluZm8iLCJtYXgiLCJtaW4iLCJjcmVhdGVDb2x1bW4iLCJ0YWJsZSIsImNvbHVtbkRlZiIsImRlcHRoIiwicGFyZW50IiwiX3JlZiIsIl9yZXNvbHZlZENvbHVtbkRlZiRpZCIsImRlZmF1bHRDb2x1bW4iLCJfZ2V0RGVmYXVsdENvbHVtbkRlZiIsInJlc29sdmVkQ29sdW1uRGVmIiwiYWNjZXNzb3JLZXkiLCJpZCIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJoZWFkZXIiLCJhY2Nlc3NvckZuIiwiaW5jbHVkZXMiLCJvcmlnaW5hbFJvdyIsInNwbGl0IiwiX3Jlc3VsdCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIndhcm4iLCJFcnJvciIsImNvbHVtbiIsImNvbHVtbnMiLCJnZXRGbGF0Q29sdW1ucyIsIl9jb2x1bW4kY29sdW1ucyIsImZsYXRNYXAiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0EiLCJvcHRpb25zIiwiZGVidWdBbGwiLCJkZWJ1Z0NvbHVtbnMiLCJnZXRMZWFmQ29sdW1ucyIsIl9nZXRPcmRlckNvbHVtbnNGbiIsIm9yZGVyQ29sdW1ucyIsIl9jb2x1bW4kY29sdW1uczIiLCJsZWFmQ29sdW1ucyIsIl90YWJsZSRvcHRpb25zJGRlYnVnQTIiLCJmZWF0dXJlIiwiX2ZlYXR1cmVzIiwiY3JlYXRlSGVhZGVyIiwiX29wdGlvbnMkaWQiLCJpc1BsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJJZCIsInN1YkhlYWRlcnMiLCJjb2xTcGFuIiwicm93U3BhbiIsImhlYWRlckdyb3VwIiwiZ2V0TGVhZkhlYWRlcnMiLCJsZWFmSGVhZGVycyIsInJlY3Vyc2VIZWFkZXIiLCJoIiwibWFwIiwiZ2V0Q29udGV4dCIsIkhlYWRlcnMiLCJjcmVhdGVUYWJsZSIsImdldEhlYWRlckdyb3VwcyIsImdldEFsbENvbHVtbnMiLCJnZXRWaXNpYmxlTGVhZkNvbHVtbnMiLCJnZXRTdGF0ZSIsImNvbHVtblBpbm5pbmciLCJsZWZ0IiwicmlnaHQiLCJhbGxDb2x1bW5zIiwiX2xlZnQkbWFwJGZpbHRlciIsIl9yaWdodCRtYXAkZmlsdGVyIiwibGVmdENvbHVtbnMiLCJjb2x1bW5JZCIsImZpbmQiLCJmaWx0ZXIiLCJCb29sZWFuIiwicmlnaHRDb2x1bW5zIiwiY2VudGVyQ29sdW1ucyIsImhlYWRlckdyb3VwcyIsImJ1aWxkSGVhZGVyR3JvdXBzIiwiZGVidWdIZWFkZXJzIiwiZ2V0Q2VudGVySGVhZGVyR3JvdXBzIiwiZ2V0TGVmdEhlYWRlckdyb3VwcyIsIl9sZWZ0JG1hcCRmaWx0ZXIyIiwib3JkZXJlZExlYWZDb2x1bW5zIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBMyIsImdldFJpZ2h0SGVhZGVyR3JvdXBzIiwiX3JpZ2h0JG1hcCRmaWx0ZXIyIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBNCIsImdldEZvb3Rlckdyb3VwcyIsInJldmVyc2UiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0E1IiwiZ2V0TGVmdEZvb3Rlckdyb3VwcyIsIl90YWJsZSRvcHRpb25zJGRlYnVnQTYiLCJnZXRDZW50ZXJGb290ZXJHcm91cHMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0E3IiwiZ2V0UmlnaHRGb290ZXJHcm91cHMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0E4IiwiZ2V0RmxhdEhlYWRlcnMiLCJoZWFkZXJzIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBOSIsImdldExlZnRGbGF0SGVhZGVycyIsIl90YWJsZSRvcHRpb25zJGRlYnVnQTEwIiwiZ2V0Q2VudGVyRmxhdEhlYWRlcnMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExMSIsImdldFJpZ2h0RmxhdEhlYWRlcnMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExMiIsImdldENlbnRlckxlYWZIZWFkZXJzIiwiZmxhdEhlYWRlcnMiLCJfaGVhZGVyJHN1YkhlYWRlcnMiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExMyIsImdldExlZnRMZWFmSGVhZGVycyIsIl9oZWFkZXIkc3ViSGVhZGVyczIiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExNCIsImdldFJpZ2h0TGVhZkhlYWRlcnMiLCJfaGVhZGVyJHN1YkhlYWRlcnMzIiwiX3RhYmxlJG9wdGlvbnMkZGVidWdBMTUiLCJjZW50ZXIiLCJfbGVmdCQwJGhlYWRlcnMiLCJfbGVmdCQiLCJfY2VudGVyJDAkaGVhZGVycyIsIl9jZW50ZXIkIiwiX3JpZ2h0JDAkaGVhZGVycyIsIl9yaWdodCQiLCJfdGFibGUkb3B0aW9ucyRkZWJ1Z0ExNiIsImNvbHVtbnNUb0dyb3VwIiwiaGVhZGVyRmFtaWx5IiwiX2hlYWRlckdyb3VwcyQwJGhlYWRlIiwiX2hlYWRlckdyb3VwcyQiLCJtYXhEZXB0aCIsImZpbmRNYXhEZXB0aCIsImdldElzVmlzaWJsZSIsImNyZWF0ZUhlYWRlckdyb3VwIiwiaGVhZGVyc1RvR3JvdXAiLCJqb2luIiwicGVuZGluZ1BhcmVudEhlYWRlcnMiLCJoZWFkZXJUb0dyb3VwIiwibGF0ZXN0UGVuZGluZ1BhcmVudEhlYWRlciIsImlzTGVhZkhlYWRlciIsImJvdHRvbUhlYWRlcnMiLCJyZWN1cnNlSGVhZGVyc0ZvclNwYW5zIiwiZmlsdGVyZWRIZWFkZXJzIiwiY2hpbGRSb3dTcGFucyIsImNoaWxkQ29sU3BhbiIsImNoaWxkUm93U3BhbiIsIm1pbkNoaWxkUm93U3BhbiIsImRlZmF1bHRDb2x1bW5TaXppbmciLCJzaXplIiwibWluU2l6ZSIsIm1heFNpemUiLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiZ2V0RGVmYXVsdENvbHVtblNpemluZ0luZm9TdGF0ZSIsInN0YXJ0T2Zmc2V0Iiwic3RhcnRTaXplIiwiZGVsdGFPZmZzZXQiLCJkZWx0YVBlcmNlbnRhZ2UiLCJpc1Jlc2l6aW5nQ29sdW1uIiwiY29sdW1uU2l6aW5nU3RhcnQiLCJDb2x1bW5TaXppbmciLCJnZXREZWZhdWx0Q29sdW1uRGVmIiwiZ2V0SW5pdGlhbFN0YXRlIiwic3RhdGUiLCJjb2x1bW5TaXppbmciLCJjb2x1bW5TaXppbmdJbmZvIiwiZ2V0RGVmYXVsdE9wdGlvbnMiLCJjb2x1bW5SZXNpemVNb2RlIiwib25Db2x1bW5TaXppbmdDaGFuZ2UiLCJvbkNvbHVtblNpemluZ0luZm9DaGFuZ2UiLCJnZXRTaXplIiwiX2NvbHVtbiRjb2x1bW5EZWYkbWluIiwiX2NvbHVtbiRjb2x1bW5EZWYkbWF4IiwiY29sdW1uU2l6ZSIsImdldFN0YXJ0IiwicG9zaXRpb24iLCJnZXRMZWZ0VmlzaWJsZUxlYWZDb2x1bW5zIiwiZ2V0UmlnaHRWaXNpYmxlTGVhZkNvbHVtbnMiLCJmaW5kSW5kZXgiLCJwcmV2U2libGluZ0NvbHVtbiIsInJlc2V0U2l6ZSIsInNldENvbHVtblNpemluZyIsIl9yZWYyIiwiXyIsInJlc3QiLCJnZXRDYW5SZXNpemUiLCJfY29sdW1uJGNvbHVtbkRlZiRlbmEiLCJfdGFibGUkb3B0aW9ucyRlbmFibGUiLCJlbmFibGVSZXNpemluZyIsImVuYWJsZUNvbHVtblJlc2l6aW5nIiwiZ2V0SXNSZXNpemluZyIsInN1bSIsIl9oZWFkZXIkY29sdW1uJGdldFNpeiIsInByZXZTaWJsaW5nSGVhZGVyIiwiZ2V0UmVzaXplSGFuZGxlciIsImdldENvbHVtbiIsImNhblJlc2l6ZSIsImUiLCJwZXJzaXN0IiwiaXNUb3VjaFN0YXJ0RXZlbnQiLCJ0b3VjaGVzIiwiY2xpZW50WCIsIm5ld0NvbHVtblNpemluZyIsInVwZGF0ZU9mZnNldCIsImV2ZW50VHlwZSIsImNsaWVudFhQb3MiLCJzZXRDb2x1bW5TaXppbmdJbmZvIiwiX29sZCRzdGFydE9mZnNldCIsIl9vbGQkc3RhcnRTaXplIiwiX3JlZjMiLCJoZWFkZXJTaXplIiwib25Nb3ZlIiwib25FbmQiLCJtb3VzZUV2ZW50cyIsIm1vdmVIYW5kbGVyIiwidXBIYW5kbGVyIiwiZG9jdW1lbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidG91Y2hFdmVudHMiLCJjYW5jZWxhYmxlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJfZSR0b3VjaGVzJCIsInBhc3NpdmVJZlN1cHBvcnRlZCIsInBhc3NpdmVFdmVudFN1cHBvcnRlZCIsInBhc3NpdmUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVzZXRDb2x1bW5TaXppbmciLCJkZWZhdWx0U3RhdGUiLCJfdGFibGUkaW5pdGlhbFN0YXRlJGMiLCJpbml0aWFsU3RhdGUiLCJyZXNldEhlYWRlclNpemVJbmZvIiwiX3RhYmxlJGluaXRpYWxTdGF0ZSRjMiIsImdldFRvdGFsU2l6ZSIsIl90YWJsZSRnZXRIZWFkZXJHcm91cCIsIl90YWJsZSRnZXRIZWFkZXJHcm91cDIiLCJyZWR1Y2UiLCJnZXRMZWZ0VG90YWxTaXplIiwiX3RhYmxlJGdldExlZnRIZWFkZXJHIiwiX3RhYmxlJGdldExlZnRIZWFkZXJHMiIsImdldENlbnRlclRvdGFsU2l6ZSIsIl90YWJsZSRnZXRDZW50ZXJIZWFkZSIsIl90YWJsZSRnZXRDZW50ZXJIZWFkZTIiLCJnZXRSaWdodFRvdGFsU2l6ZSIsIl90YWJsZSRnZXRSaWdodEhlYWRlciIsIl90YWJsZSRnZXRSaWdodEhlYWRlcjIiLCJwYXNzaXZlU3VwcG9ydGVkIiwic3VwcG9ydGVkIiwid2luZG93IiwiZXJyIiwidHlwZSIsIkV4cGFuZGluZyIsImV4cGFuZGVkIiwib25FeHBhbmRlZENoYW5nZSIsInBhZ2luYXRlRXhwYW5kZWRSb3dzIiwicmVnaXN0ZXJlZCIsInF1ZXVlZCIsIl9hdXRvUmVzZXRFeHBhbmRlZCIsIl90YWJsZSRvcHRpb25zJGF1dG9SZSIsIl9xdWV1ZSIsImF1dG9SZXNldEFsbCIsImF1dG9SZXNldEV4cGFuZGVkIiwibWFudWFsRXhwYW5kaW5nIiwicmVzZXRFeHBhbmRlZCIsInNldEV4cGFuZGVkIiwidG9nZ2xlQWxsUm93c0V4cGFuZGVkIiwiZ2V0SXNBbGxSb3dzRXhwYW5kZWQiLCJfdGFibGUkaW5pdGlhbFN0YXRlJGUiLCJfdGFibGUkaW5pdGlhbFN0YXRlIiwiZ2V0Q2FuU29tZVJvd3NFeHBhbmQiLCJnZXRQcmVQYWdpbmF0aW9uUm93TW9kZWwiLCJmbGF0Um93cyIsInJvdyIsImdldENhbkV4cGFuZCIsImdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZEhhbmRsZXIiLCJnZXRJc1NvbWVSb3dzRXhwYW5kZWQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJrZXlzIiwiZ2V0Um93TW9kZWwiLCJnZXRJc0V4cGFuZGVkIiwiZ2V0RXhwYW5kZWREZXB0aCIsInJvd0lkcyIsInJvd3NCeUlkIiwic3BsaXRJZCIsImdldFByZUV4cGFuZGVkUm93TW9kZWwiLCJnZXRTb3J0ZWRSb3dNb2RlbCIsImdldEV4cGFuZGVkUm93TW9kZWwiLCJfZ2V0RXhwYW5kZWRSb3dNb2RlbCIsImNyZWF0ZVJvdyIsInRvZ2dsZUV4cGFuZGVkIiwiX2V4cGFuZGVkIiwiZXhpc3RzIiwib2xkRXhwYW5kZWQiLCJyb3dJZCIsIl90YWJsZSRvcHRpb25zJGdldElzUiIsImdldElzUm93RXhwYW5kZWQiLCJfdGFibGUkb3B0aW9ucyRnZXRSb3ciLCJfcm93JHN1YlJvd3MiLCJnZXRSb3dDYW5FeHBhbmQiLCJlbmFibGVFeHBhbmRpbmciLCJzdWJSb3dzIiwiZ2V0SXNBbGxQYXJlbnRzRXhwYW5kZWQiLCJpc0Z1bGx5RXhwYW5kZWQiLCJjdXJyZW50Um93IiwicGFyZW50SWQiLCJnZXRSb3ciLCJnZXRUb2dnbGVFeHBhbmRlZEhhbmRsZXIiLCJjYW5FeHBhbmQiLCJpbmNsdWRlc1N0cmluZyIsImZpbHRlclZhbHVlIiwiX3JvdyRnZXRWYWx1ZSIsInNlYXJjaCIsInRvTG93ZXJDYXNlIiwiZ2V0VmFsdWUiLCJ0b1N0cmluZyIsImF1dG9SZW1vdmUiLCJ0ZXN0RmFsc2V5IiwiaW5jbHVkZXNTdHJpbmdTZW5zaXRpdmUiLCJfcm93JGdldFZhbHVlMiIsImVxdWFsc1N0cmluZyIsIl9yb3ckZ2V0VmFsdWUzIiwiYXJySW5jbHVkZXMiLCJfcm93JGdldFZhbHVlNCIsImFyckluY2x1ZGVzQWxsIiwiX3JvdyRnZXRWYWx1ZTUiLCJhcnJJbmNsdWRlc1NvbWUiLCJfcm93JGdldFZhbHVlNiIsImVxdWFscyIsIndlYWtFcXVhbHMiLCJpbk51bWJlclJhbmdlIiwicm93VmFsdWUiLCJyZXNvbHZlRmlsdGVyVmFsdWUiLCJ1bnNhZmVNaW4iLCJ1bnNhZmVNYXgiLCJwYXJzZWRNaW4iLCJwYXJzZUZsb2F0IiwicGFyc2VkTWF4IiwiaXNOYU4iLCJJbmZpbml0eSIsInRlbXAiLCJmaWx0ZXJGbnMiLCJGaWx0ZXJzIiwiZmlsdGVyRm4iLCJjb2x1bW5GaWx0ZXJzIiwiZ2xvYmFsRmlsdGVyIiwib25Db2x1bW5GaWx0ZXJzQ2hhbmdlIiwib25HbG9iYWxGaWx0ZXJDaGFuZ2UiLCJmaWx0ZXJGcm9tTGVhZlJvd3MiLCJtYXhMZWFmUm93RmlsdGVyRGVwdGgiLCJnbG9iYWxGaWx0ZXJGbiIsImdldENvbHVtbkNhbkdsb2JhbEZpbHRlciIsIl90YWJsZSRnZXRDb3JlUm93TW9kZSIsInZhbHVlIiwiZ2V0Q29yZVJvd01vZGVsIiwiX2dldEFsbENlbGxzQnlDb2x1bW5JZCIsImdldEF1dG9GaWx0ZXJGbiIsImZpcnN0Um93IiwiZ2V0RmlsdGVyRm4iLCJfdGFibGUkb3B0aW9ucyRmaWx0ZXIiLCJfdGFibGUkb3B0aW9ucyRmaWx0ZXIyIiwiZ2V0Q2FuRmlsdGVyIiwiX3RhYmxlJG9wdGlvbnMkZW5hYmxlMiIsImVuYWJsZUNvbHVtbkZpbHRlciIsImVuYWJsZUNvbHVtbkZpbHRlcnMiLCJlbmFibGVGaWx0ZXJzIiwiZ2V0Q2FuR2xvYmFsRmlsdGVyIiwiX2NvbHVtbiRjb2x1bW5EZWYkZW5hMiIsIl90YWJsZSRvcHRpb25zJGVuYWJsZTMiLCJfdGFibGUkb3B0aW9ucyRlbmFibGU0IiwiX3RhYmxlJG9wdGlvbnMkZ2V0Q29sIiwiZW5hYmxlR2xvYmFsRmlsdGVyIiwiZ2V0SXNGaWx0ZXJlZCIsImdldEZpbHRlckluZGV4IiwiZ2V0RmlsdGVyVmFsdWUiLCJfdGFibGUkZ2V0U3RhdGUkY29sdW0iLCJfdGFibGUkZ2V0U3RhdGUkY29sdW0yIiwiX3RhYmxlJGdldFN0YXRlJGNvbHVtMyIsInNldEZpbHRlclZhbHVlIiwic2V0Q29sdW1uRmlsdGVycyIsInByZXZpb3VzZmlsdGVyIiwibmV3RmlsdGVyIiwic2hvdWxkQXV0b1JlbW92ZUZpbHRlciIsIl9vbGQkZmlsdGVyIiwibmV3RmlsdGVyT2JqIiwiX29sZCRtYXAiLCJfZ2V0RmFjZXRlZFJvd01vZGVsIiwiZ2V0RmFjZXRlZFJvd01vZGVsIiwiZ2V0UHJlRmlsdGVyZWRSb3dNb2RlbCIsIl9nZXRGYWNldGVkVW5pcXVlVmFsdWVzIiwiZ2V0RmFjZXRlZFVuaXF1ZVZhbHVlcyIsIk1hcCIsIl9nZXRGYWNldGVkTWluTWF4VmFsdWVzIiwiZ2V0RmFjZXRlZE1pbk1heFZhbHVlcyIsImNvbHVtbkZpbHRlcnNNZXRhIiwiZ2V0R2xvYmFsQXV0b0ZpbHRlckZuIiwiZ2V0R2xvYmFsRmlsdGVyRm4iLCJfdGFibGUkb3B0aW9ucyRmaWx0ZXIzIiwiX3RhYmxlJG9wdGlvbnMkZmlsdGVyNCIsImdldEFsbExlYWZDb2x1bW5zIiwidXBkYXRlRm4iLCJfZnVuY3Rpb25hbFVwZGF0ZSIsInNldEdsb2JhbEZpbHRlciIsInJlc2V0R2xvYmFsRmlsdGVyIiwicmVzZXRDb2x1bW5GaWx0ZXJzIiwiZ2V0RmlsdGVyZWRSb3dNb2RlbCIsIl9nZXRGaWx0ZXJlZFJvd01vZGVsIiwibWFudWFsRmlsdGVyaW5nIiwiX2dldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbCIsImdldEdsb2JhbEZhY2V0ZWRSb3dNb2RlbCIsIl9nZXRHbG9iYWxGYWNldGVkVW5pcXVlVmFsdWVzIiwiZ2V0R2xvYmFsRmFjZXRlZFVuaXF1ZVZhbHVlcyIsIl9nZXRHbG9iYWxGYWNldGVkTWluTWF4VmFsdWVzIiwiZ2V0R2xvYmFsRmFjZXRlZE1pbk1heFZhbHVlcyIsIl9sZWFmUm93cyIsImNoaWxkUm93cyIsIm5leHQiLCJuZXh0VmFsdWUiLCJleHRlbnQiLCJtZWFuIiwibGVhZlJvd3MiLCJjb3VudCIsIm1lZGlhbiIsIm1pZCIsImZsb29yIiwibnVtcyIsInNvcnQiLCJhIiwiYiIsInVuaXF1ZSIsImZyb20iLCJTZXQiLCJ1bmlxdWVDb3VudCIsIl9jb2x1bW5JZCIsImFnZ3JlZ2F0aW9uRm5zIiwiR3JvdXBpbmciLCJhZ2dyZWdhdGVkQ2VsbCIsInByb3BzIiwiX3RvU3RyaW5nIiwiX3Byb3BzJGdldFZhbHVlIiwiYWdncmVnYXRpb25GbiIsImdyb3VwaW5nIiwib25Hcm91cGluZ0NoYW5nZSIsImdyb3VwZWRDb2x1bW5Nb2RlIiwidG9nZ2xlR3JvdXBpbmciLCJzZXRHcm91cGluZyIsImdldENhbkdyb3VwIiwiZW5hYmxlR3JvdXBpbmciLCJnZXRJc0dyb3VwZWQiLCJfdGFibGUkZ2V0U3RhdGUkZ3JvdXAiLCJnZXRHcm91cGVkSW5kZXgiLCJfdGFibGUkZ2V0U3RhdGUkZ3JvdXAyIiwiaW5kZXhPZiIsImdldFRvZ2dsZUdyb3VwaW5nSGFuZGxlciIsImNhbkdyb3VwIiwiZ2V0QXV0b0FnZ3JlZ2F0aW9uRm4iLCJwcm90b3R5cGUiLCJjYWxsIiwiZ2V0QWdncmVnYXRpb25GbiIsIl90YWJsZSRvcHRpb25zJGFnZ3JlZyIsIl90YWJsZSRvcHRpb25zJGFnZ3JlZzIiLCJyZXNldEdyb3VwaW5nIiwiX3RhYmxlJGluaXRpYWxTdGF0ZSRnIiwiZ2V0UHJlR3JvdXBlZFJvd01vZGVsIiwiZ2V0R3JvdXBlZFJvd01vZGVsIiwiX2dldEdyb3VwZWRSb3dNb2RlbCIsIm1hbnVhbEdyb3VwaW5nIiwiZ3JvdXBpbmdDb2x1bW5JZCIsImdldEdyb3VwaW5nVmFsdWUiLCJfZ3JvdXBpbmdWYWx1ZXNDYWNoZSIsImhhc093blByb3BlcnR5Iiwib3JpZ2luYWwiLCJjcmVhdGVDZWxsIiwiY2VsbCIsImdldElzUGxhY2Vob2xkZXIiLCJnZXRJc0FnZ3JlZ2F0ZWQiLCJub25Hcm91cGluZ0NvbHVtbnMiLCJjb2wiLCJncm91cGluZ0NvbHVtbnMiLCJnIiwiT3JkZXJpbmciLCJjb2x1bW5PcmRlciIsIm9uQ29sdW1uT3JkZXJDaGFuZ2UiLCJzZXRDb2x1bW5PcmRlciIsInJlc2V0Q29sdW1uT3JkZXIiLCJvcmRlcmVkQ29sdW1ucyIsImNvbHVtbk9yZGVyQ29weSIsImNvbHVtbnNDb3B5IiwidGFyZ2V0Q29sdW1uSWQiLCJzaGlmdCIsImZvdW5kSW5kZXgiLCJzcGxpY2UiLCJkZWZhdWx0UGFnZUluZGV4IiwiZGVmYXVsdFBhZ2VTaXplIiwiZ2V0RGVmYXVsdFBhZ2luYXRpb25TdGF0ZSIsInBhZ2VJbmRleCIsInBhZ2VTaXplIiwiUGFnaW5hdGlvbiIsInBhZ2luYXRpb24iLCJvblBhZ2luYXRpb25DaGFuZ2UiLCJfYXV0b1Jlc2V0UGFnZUluZGV4IiwiYXV0b1Jlc2V0UGFnZUluZGV4IiwibWFudWFsUGFnaW5hdGlvbiIsInJlc2V0UGFnZUluZGV4Iiwic2V0UGFnaW5hdGlvbiIsInNhZmVVcGRhdGVyIiwibmV3U3RhdGUiLCJyZXNldFBhZ2luYXRpb24iLCJfdGFibGUkaW5pdGlhbFN0YXRlJHAiLCJzZXRQYWdlSW5kZXgiLCJtYXhQYWdlSW5kZXgiLCJwYWdlQ291bnQiLCJfdGFibGUkaW5pdGlhbFN0YXRlJHAyIiwicmVzZXRQYWdlU2l6ZSIsIl90YWJsZSRpbml0aWFsU3RhdGUkcDMiLCJfdGFibGUkaW5pdGlhbFN0YXRlMiIsInNldFBhZ2VTaXplIiwidG9wUm93SW5kZXgiLCJzZXRQYWdlQ291bnQiLCJfdGFibGUkb3B0aW9ucyRwYWdlQ28iLCJuZXdQYWdlQ291bnQiLCJnZXRQYWdlT3B0aW9ucyIsImdldFBhZ2VDb3VudCIsInBhZ2VPcHRpb25zIiwiZmlsbCIsImkiLCJkZWJ1Z1RhYmxlIiwiZ2V0Q2FuUHJldmlvdXNQYWdlIiwiZ2V0Q2FuTmV4dFBhZ2UiLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsImdldFBhZ2luYXRpb25Sb3dNb2RlbCIsIl9nZXRQYWdpbmF0aW9uUm93TW9kZWwiLCJfdGFibGUkb3B0aW9ucyRwYWdlQ28yIiwiY2VpbCIsInJvd3MiLCJnZXREZWZhdWx0Q29sdW1uUGlubmluZ1N0YXRlIiwiZ2V0RGVmYXVsdFJvd1Bpbm5pbmdTdGF0ZSIsInRvcCIsImJvdHRvbSIsIlBpbm5pbmciLCJyb3dQaW5uaW5nIiwib25Db2x1bW5QaW5uaW5nQ2hhbmdlIiwib25Sb3dQaW5uaW5nQ2hhbmdlIiwicGluIiwiY29sdW1uSWRzIiwic2V0Q29sdW1uUGlubmluZyIsIl9vbGQkbGVmdDMiLCJfb2xkJHJpZ2h0MyIsIl9vbGQkbGVmdCIsIl9vbGQkcmlnaHQiLCJfb2xkJGxlZnQyIiwiX29sZCRyaWdodDIiLCJnZXRDYW5QaW4iLCJfZCRjb2x1bW5EZWYkZW5hYmxlUGkiLCJlbmFibGVQaW5uaW5nIiwiZW5hYmxlQ29sdW1uUGlubmluZyIsImdldElzUGlubmVkIiwibGVhZkNvbHVtbklkcyIsImlzTGVmdCIsImlzUmlnaHQiLCJnZXRQaW5uZWRJbmRleCIsImluY2x1ZGVMZWFmUm93cyIsImluY2x1ZGVQYXJlbnRSb3dzIiwibGVhZlJvd0lkcyIsImdldExlYWZSb3dzIiwicGFyZW50Um93SWRzIiwiZ2V0UGFyZW50Um93cyIsInNldFJvd1Bpbm5pbmciLCJfb2xkJHRvcDMiLCJfb2xkJGJvdHRvbTMiLCJfb2xkJHRvcCIsIl9vbGQkYm90dG9tIiwiaGFzIiwiX29sZCR0b3AyIiwiX29sZCRib3R0b20yIiwiX3JlZjQiLCJlbmFibGVSb3dQaW5uaW5nIiwiaXNUb3AiLCJpc0JvdHRvbSIsIl90YWJsZSRfZ2V0UGlubmVkUm93cyIsIl92aXNpYmxlUGlubmVkUm93SWRzJCIsInZpc2libGVQaW5uZWRSb3dJZHMiLCJfZ2V0UGlubmVkUm93cyIsIl9yZWY1IiwiZ2V0Q2VudGVyVmlzaWJsZUNlbGxzIiwiX2dldEFsbFZpc2libGVDZWxscyIsImFsbENlbGxzIiwibGVmdEFuZFJpZ2h0IiwiZGVidWdSb3dzIiwiZ2V0TGVmdFZpc2libGVDZWxscyIsImNlbGxzIiwiZ2V0UmlnaHRWaXNpYmxlQ2VsbHMiLCJyZXNldENvbHVtblBpbm5pbmciLCJnZXRJc1NvbWVDb2x1bW5zUGlubmVkIiwiX3Bpbm5pbmdTdGF0ZSRwb3NpdGlvIiwicGlubmluZ1N0YXRlIiwiX3Bpbm5pbmdTdGF0ZSRsZWZ0IiwiX3Bpbm5pbmdTdGF0ZSRyaWdodCIsImdldExlZnRMZWFmQ29sdW1ucyIsImdldFJpZ2h0TGVhZkNvbHVtbnMiLCJnZXRDZW50ZXJMZWFmQ29sdW1ucyIsInJlc2V0Um93UGlubmluZyIsIl90YWJsZSRpbml0aWFsU3RhdGUkciIsImdldElzU29tZVJvd3NQaW5uZWQiLCJfcGlubmluZ1N0YXRlJHBvc2l0aW8yIiwiX3Bpbm5pbmdTdGF0ZSR0b3AiLCJfcGlubmluZ1N0YXRlJGJvdHRvbSIsInZpc2libGVSb3dzIiwicGlubmVkUm93SWRzIiwiX3RhYmxlJG9wdGlvbnMka2VlcFBpIiwia2VlcFBpbm5lZFJvd3MiLCJnZXRUb3BSb3dzIiwiZ2V0Qm90dG9tUm93cyIsImdldENlbnRlclJvd3MiLCJhbGxSb3dzIiwidG9wQW5kQm90dG9tIiwiUm93U2VsZWN0aW9uIiwicm93U2VsZWN0aW9uIiwib25Sb3dTZWxlY3Rpb25DaGFuZ2UiLCJlbmFibGVSb3dTZWxlY3Rpb24iLCJlbmFibGVNdWx0aVJvd1NlbGVjdGlvbiIsImVuYWJsZVN1YlJvd1NlbGVjdGlvbiIsInNldFJvd1NlbGVjdGlvbiIsInJlc2V0Um93U2VsZWN0aW9uIiwidG9nZ2xlQWxsUm93c1NlbGVjdGVkIiwiZ2V0SXNBbGxSb3dzU2VsZWN0ZWQiLCJwcmVHcm91cGVkRmxhdFJvd3MiLCJnZXRDYW5TZWxlY3QiLCJ0b2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkIiwicmVzb2x2ZWRWYWx1ZSIsImdldElzQWxsUGFnZVJvd3NTZWxlY3RlZCIsIm11dGF0ZVJvd0lzU2VsZWN0ZWQiLCJnZXRQcmVTZWxlY3RlZFJvd01vZGVsIiwiZ2V0U2VsZWN0ZWRSb3dNb2RlbCIsInJvd01vZGVsIiwic2VsZWN0Um93c0ZuIiwiZ2V0RmlsdGVyZWRTZWxlY3RlZFJvd01vZGVsIiwiZ2V0R3JvdXBlZFNlbGVjdGVkUm93TW9kZWwiLCJpc0FsbFJvd3NTZWxlY3RlZCIsInBhZ2luYXRpb25GbGF0Um93cyIsImlzQWxsUGFnZVJvd3NTZWxlY3RlZCIsImdldElzU29tZVJvd3NTZWxlY3RlZCIsIl90YWJsZSRnZXRTdGF0ZSRyb3dTZSIsInRvdGFsU2VsZWN0ZWQiLCJnZXRJc1NvbWVQYWdlUm93c1NlbGVjdGVkIiwiZ2V0SXNTZWxlY3RlZCIsImdldElzU29tZVNlbGVjdGVkIiwiZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkSGFuZGxlciIsInRhcmdldCIsImNoZWNrZWQiLCJnZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkSGFuZGxlciIsInRvZ2dsZVNlbGVjdGVkIiwiaXNTZWxlY3RlZCIsIl9vcHRzJHNlbGVjdENoaWxkcmVuIiwic2VsZWN0ZWRSb3dJZHMiLCJzZWxlY3RDaGlsZHJlbiIsImlzUm93U2VsZWN0ZWQiLCJpc1N1YlJvd1NlbGVjdGVkIiwiZ2V0SXNBbGxTdWJSb3dzU2VsZWN0ZWQiLCJnZXRDYW5TZWxlY3RTdWJSb3dzIiwiZ2V0Q2FuTXVsdGlTZWxlY3QiLCJnZXRUb2dnbGVTZWxlY3RlZEhhbmRsZXIiLCJjYW5TZWxlY3QiLCJfdGFyZ2V0IiwiaW5jbHVkZUNoaWxkcmVuIiwibmV3U2VsZWN0ZWRGbGF0Um93cyIsIm5ld1NlbGVjdGVkUm93c0J5SWQiLCJyZWN1cnNlUm93cyIsIl9yb3ckc3ViUm93czIiLCJzZWxlY3Rpb24iLCJfc2VsZWN0aW9uJHJvdyRpZCIsIl9yb3ckc3ViUm93czMiLCJhbGxDaGlsZHJlblNlbGVjdGVkIiwic29tZVNlbGVjdGVkIiwic3ViUm93Iiwic3ViUm93Q2hpbGRyZW5TZWxlY3RlZCIsInJlU3BsaXRBbHBoYU51bWVyaWMiLCJhbHBoYW51bWVyaWMiLCJyb3dBIiwicm93QiIsImNvbXBhcmVBbHBoYW51bWVyaWMiLCJhbHBoYW51bWVyaWNDYXNlU2Vuc2l0aXZlIiwidGV4dCIsImNvbXBhcmVCYXNpYyIsInRleHRDYXNlU2Vuc2l0aXZlIiwiZGF0ZXRpbWUiLCJiYXNpYyIsImFTdHIiLCJiU3RyIiwiYWEiLCJiYiIsImFuIiwicGFyc2VJbnQiLCJibiIsImNvbWJvIiwic29ydGluZ0ZucyIsIlNvcnRpbmciLCJzb3J0aW5nIiwic29ydGluZ0ZuIiwic29ydFVuZGVmaW5lZCIsIm9uU29ydGluZ0NoYW5nZSIsImlzTXVsdGlTb3J0RXZlbnQiLCJzaGlmdEtleSIsImdldEF1dG9Tb3J0aW5nRm4iLCJmaXJzdFJvd3MiLCJzbGljZSIsImlzU3RyaW5nIiwiZ2V0QXV0b1NvcnREaXIiLCJnZXRTb3J0aW5nRm4iLCJfdGFibGUkb3B0aW9ucyRzb3J0aW4iLCJfdGFibGUkb3B0aW9ucyRzb3J0aW4yIiwidG9nZ2xlU29ydGluZyIsImRlc2MiLCJtdWx0aSIsIm5leHRTb3J0aW5nT3JkZXIiLCJnZXROZXh0U29ydGluZ09yZGVyIiwiaGFzTWFudWFsVmFsdWUiLCJzZXRTb3J0aW5nIiwiZXhpc3RpbmdTb3J0aW5nIiwiZXhpc3RpbmdJbmRleCIsIm5ld1NvcnRpbmciLCJzb3J0QWN0aW9uIiwibmV4dERlc2MiLCJnZXRDYW5NdWx0aVNvcnQiLCJfdGFibGUkb3B0aW9ucyRtYXhNdWwiLCJtYXhNdWx0aVNvcnRDb2xDb3VudCIsImdldEZpcnN0U29ydERpciIsIl9jb2x1bW4kY29sdW1uRGVmJHNvciIsInNvcnREZXNjRmlyc3QiLCJmaXJzdFNvcnREaXJlY3Rpb24iLCJpc1NvcnRlZCIsImdldElzU29ydGVkIiwiZW5hYmxlU29ydGluZ1JlbW92YWwiLCJlbmFibGVNdWx0aVJlbW92ZSIsImdldENhblNvcnQiLCJlbmFibGVTb3J0aW5nIiwiZW5hYmxlTXVsdGlTb3J0IiwiX3RhYmxlJGdldFN0YXRlJHNvcnRpIiwiY29sdW1uU29ydCIsImdldFNvcnRJbmRleCIsIl90YWJsZSRnZXRTdGF0ZSRzb3J0aTIiLCJfdGFibGUkZ2V0U3RhdGUkc29ydGkzIiwiY2xlYXJTb3J0aW5nIiwiZ2V0VG9nZ2xlU29ydGluZ0hhbmRsZXIiLCJjYW5Tb3J0IiwicmVzZXRTb3J0aW5nIiwiX3RhYmxlJGluaXRpYWxTdGF0ZSRzIiwiZ2V0UHJlU29ydGVkUm93TW9kZWwiLCJfZ2V0U29ydGVkUm93TW9kZWwiLCJtYW51YWxTb3J0aW5nIiwiVmlzaWJpbGl0eSIsImNvbHVtblZpc2liaWxpdHkiLCJvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UiLCJ0b2dnbGVWaXNpYmlsaXR5IiwiZ2V0Q2FuSGlkZSIsInNldENvbHVtblZpc2liaWxpdHkiLCJlbmFibGVIaWRpbmciLCJnZXRUb2dnbGVWaXNpYmlsaXR5SGFuZGxlciIsImdldEFsbENlbGxzIiwiZ2V0VmlzaWJsZUNlbGxzIiwibWFrZVZpc2libGVDb2x1bW5zTWV0aG9kIiwiZ2V0Q29sdW1ucyIsImdldFZpc2libGVGbGF0Q29sdW1ucyIsImdldEFsbEZsYXRDb2x1bW5zIiwiZ2V0Q2VudGVyVmlzaWJsZUxlYWZDb2x1bW5zIiwicmVzZXRDb2x1bW5WaXNpYmlsaXR5IiwidG9nZ2xlQWxsQ29sdW1uc1Zpc2libGUiLCJfdmFsdWUiLCJnZXRJc0FsbENvbHVtbnNWaXNpYmxlIiwib2JqIiwiZ2V0SXNTb21lQ29sdW1uc1Zpc2libGUiLCJnZXRUb2dnbGVBbGxDb2x1bW5zVmlzaWJpbGl0eUhhbmRsZXIiLCJmZWF0dXJlcyIsIl9vcHRpb25zJGluaXRpYWxTdGF0ZSIsImRlZmF1bHRPcHRpb25zIiwiYXNzaWduIiwibWVyZ2VPcHRpb25zIiwiY29yZUluaXRpYWxTdGF0ZSIsIl9mZWF0dXJlJGdldEluaXRpYWxTdCIsInF1ZXVlZFRpbWVvdXQiLCJjb3JlSW5zdGFuY2UiLCJjYiIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImNhdGNoIiwiZXJyb3IiLCJzZXRUaW1lb3V0IiwicmVzZXQiLCJzZXRPcHRpb25zIiwibmV3T3B0aW9ucyIsIm9uU3RhdGVDaGFuZ2UiLCJfZ2V0Um93SWQiLCJnZXRSb3dJZCIsIl9nZXRDb3JlUm93TW9kZWwiLCJzZWFyY2hBbGwiLCJfZGVmYXVsdENvbHVtbiIsIl9wcm9wcyRyZW5kZXJWYWx1ZSR0byIsIl9wcm9wcyRyZW5kZXJWYWx1ZSIsInJlbmRlclZhbHVlIiwiX2dldENvbHVtbkRlZnMiLCJjb2x1bW5EZWZzIiwicmVjdXJzZUNvbHVtbnMiLCJncm91cGluZ0NvbHVtbkRlZiIsIl9nZXRBbGxGbGF0Q29sdW1uc0J5SWQiLCJmbGF0Q29sdW1ucyIsImFjYyIsImdldFJlbmRlclZhbHVlIiwiX2NlbGwkZ2V0VmFsdWUiLCJyZW5kZXJGYWxsYmFja1ZhbHVlIiwicm93SW5kZXgiLCJfdmFsdWVzQ2FjaGUiLCJfdW5pcXVlVmFsdWVzQ2FjaGUiLCJnZXRVbmlxdWVWYWx1ZXMiLCJnZXRQYXJlbnRSb3ciLCJwYXJlbnRSb3dzIiwicGFyZW50Um93IiwiY3JlYXRlQ29sdW1uSGVscGVyIiwiYWNjZXNzb3IiLCJkaXNwbGF5IiwiZ3JvdXAiLCJkYXRhIiwiYWNjZXNzUm93cyIsIm9yaWdpbmFsUm93cyIsImdldFN1YlJvd3MiLCJfcm93JG9yaWdpbmFsU3ViUm93cyIsIm9yaWdpbmFsU3ViUm93cyIsImZpbHRlclJvd3MiLCJmaWx0ZXJSb3dJbXBsIiwiZmlsdGVyUm93TW9kZWxGcm9tTGVhZnMiLCJmaWx0ZXJSb3dNb2RlbEZyb21Sb290Iiwicm93c1RvRmlsdGVyIiwiZmlsdGVyUm93IiwiX3RhYmxlJG9wdGlvbnMkbWF4TGVhIiwibmV3RmlsdGVyZWRGbGF0Um93cyIsIm5ld0ZpbHRlcmVkUm93c0J5SWQiLCJyZWN1cnNlRmlsdGVyUm93cyIsIm5ld1JvdyIsIl90YWJsZSRvcHRpb25zJG1heExlYTIiLCJwYXNzIiwicmVzb2x2ZWRDb2x1bW5GaWx0ZXJzIiwicmVzb2x2ZWRHbG9iYWxGaWx0ZXJzIiwiX2ZpbHRlckZuJHJlc29sdmVGaWx0IiwiZmlsdGVyYWJsZUlkcyIsImdsb2JhbGx5RmlsdGVyYWJsZUNvbHVtbnMiLCJfZ2xvYmFsRmlsdGVyRm4kcmVzb2wiLCJjdXJyZW50Q29sdW1uRmlsdGVyIiwiY3VycmVudEdsb2JhbEZpbHRlciIsImoiLCJmaWx0ZXJNZXRhIiwiX19nbG9iYWxfXyIsImZpbHRlclJvd3NJbXBsIiwicHJlUm93TW9kZWwiLCJfdGFibGUkZ2V0Q29sdW1uIiwiZmFjZXRlZFJvd01vZGVsIiwiZmFjZXRlZFVuaXF1ZVZhbHVlcyIsIl9mYWNldGVkVW5pcXVlVmFsdWVzJCIsInNldCIsImdldCIsIl9mYWNldGVkUm93TW9kZWwkZmxhdCIsImZpcnN0VmFsdWUiLCJmYWNldGVkTWluTWF4VmFsdWVzIiwic29ydGluZ1N0YXRlIiwic29ydGVkRmxhdFJvd3MiLCJhdmFpbGFibGVTb3J0aW5nIiwiY29sdW1uSW5mb0J5SWQiLCJzb3J0RW50cnkiLCJpbnZlcnRTb3J0aW5nIiwic29ydERhdGEiLCJzb3J0ZWREYXRhIiwiX3NvcnRFbnRyeSRkZXNjIiwiY29sdW1uSW5mbyIsImlzRGVzYyIsInNvcnRJbnQiLCJhVmFsdWUiLCJiVmFsdWUiLCJhVW5kZWZpbmVkIiwiYlVuZGVmaW5lZCIsImV4aXN0aW5nR3JvdXBpbmciLCJncm91cGVkRmxhdFJvd3MiLCJncm91cGVkUm93c0J5SWQiLCJncm91cFVwUmVjdXJzaXZlbHkiLCJyb3dHcm91cHNNYXAiLCJncm91cEJ5IiwiYWdncmVnYXRlZEdyb3VwZWRSb3dzIiwiZW50cmllcyIsImdyb3VwaW5nVmFsdWUiLCJncm91cGVkUm93cyIsIl9ncm91cGVkUm93cyQwJGdldFZhbCIsImFnZ3JlZ2F0ZUZuIiwiZ3JvdXBNYXAiLCJyZXNLZXkiLCJwcmV2aW91cyIsImV4cGFuZFJvd3MiLCJleHBhbmRlZFJvd3MiLCJoYW5kbGVSb3ciLCJwYWdlU3RhcnQiLCJwYWdlRW5kIiwicGFnaW5hdGVkUm93TW9kZWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUE0QkE7O0FBT0E7O0FBNENBOztBQUVPLFNBQVNBLGdCQUFnQkEsQ0FBSUMsT0FBbUIsRUFBRUMsS0FBUSxFQUFLO0VBQ3BFLE9BQU8sT0FBT0QsT0FBTyxLQUFLLFVBQVUsR0FDL0JBLE9BQU8sQ0FBcUJDLEtBQUssQ0FBQyxHQUNuQ0QsT0FBTyxDQUFBO0FBQ2IsQ0FBQTtBQUVPLFNBQVNFLElBQUlBLEdBQUc7QUFDckI7QUFBQSxDQUFBO0FBR0ssU0FBU0MsZ0JBQWdCQSxDQUM5QkMsR0FBTSxFQUNOQyxRQUFpQixFQUNqQjtBQUNBLEVBQUEsT0FBUUwsT0FBK0IsSUFBSztBQUN4Q0ssSUFBQUEsUUFB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R0FBR2dXLFFBQVEsQ0FBQTtBQUMzQyxJQUFBLE1BQU1zUSxTQUFTLEdBQUdqWixRQUFRLEdBQUdELFNBQVMsQ0FBQTtBQUN0QyxJQUFBLE1BQU1tWixPQUFPLEdBQUdELFNBQVMsR0FBR2paLFFBQVEsQ0FBQTtJQUVwQ3VDLElBQUksR0FBR0EsSUFBSSxDQUFDMkssS0FBSyxDQUFDK0wsU0FBUyxFQUFFQyxPQUFPLENBQUMsQ0FBQTtBQUVyQyxJQUFBLElBQUlDLGlCQUFrQyxDQUFBO0FBRXRDLElBQUEsSUFBSSxDQUFDOTNCLEtBQUssQ0FBQzhCLE9BQU8sQ0FBQzJOLG9CQUFvQixFQUFFO01BQ3ZDcW9CLGlCQUFpQixHQUFHTCxVQUFVLENBQUM7UUFDN0J2VyxJQUFJO1FBQ0p4USxRQUFRO0FBQ1JZLFFBQUFBLFFBQUFBO0FBQ0YsT0FBQyxDQUFDLENBQUE7QUFDSixLQUFDLE1BQU07QUFDTHdtQixNQUFBQSxpQkFBaUIsR0FBRztRQUNsQjVXLElBQUk7UUFDSnhRLFFBQVE7QUFDUlksUUFBQUEsUUFBQUE7T0FDRCxDQUFBO0FBQ0gsS0FBQTtJQUVBd21CLGlCQUFpQixDQUFDcG5CLFFBQVEsR0FBRyxFQUFFLENBQUE7SUFFL0IsTUFBTWluQixTQUFTLEdBQUlobkIsR0FBZSxJQUFLO0FBQ3JDbW5CLE1BQUFBLGlCQUFpQixDQUFDcG5CLFFBQVEsQ0FBQzVTLElBQUksQ0FBQzZTLEdBQUcsQ0FBQyxDQUFBO0FBQ3BDLE1BQUEsSUFBSUEsR0FBRyxDQUFDNkIsT0FBTyxDQUFDeFUsTUFBTSxFQUFFO0FBQ3RCMlMsUUFBQUEsR0FBRyxDQUFDNkIsT0FBTyxDQUFDNVUsT0FBTyxDQUFDKzVCLFNBQVMsQ0FBQyxDQUFBO0FBQ2hDLE9BQUE7S0FDRCxDQUFBO0FBRURHLElBQUFBLGlCQUFpQixDQUFDNVcsSUFBSSxDQUFDdGpCLE9BQU8sQ0FBQys1QixTQUFTLENBQUMsQ0FBQTtBQUV6QyxJQUFBLE9BQU9HLGlCQUFpQixDQUFBO0FBQzFCLEdBQUMsRUFDRDtJQUNFcDdCLEdBQUcsRUFBRXlFLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyxRQUFRLEtBQUssYUFBYSxJQUFJLHVCQUF1QjtBQUN0RTdDLElBQUFBLEtBQUssRUFBRUEsTUFBQTtBQUFBLE1BQUEsSUFBQXFELHFCQUFBLENBQUE7QUFBQSxNQUFBLE9BQUEsQ0FBQUEscUJBQUEsR0FBTTdCLEtBQUssQ0FBQzhCLE9BQU8sQ0FBQ0MsUUFBUSxLQUFBRixJQUFBQSxHQUFBQSxxQkFBQSxHQUFJN0IsS0FBSyxDQUFDOEIsT0FBTyxDQUFDMmUsVUFBVSxDQUFBO0FBQUEsS0FBQTtBQUNqRSxHQUNGLENBQUMsQ0FBQTtBQUNMOzs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5XX0=
|