New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@fgv/ts-utils

Package Overview
Dependencies
Maintainers
1
Versions
94
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@fgv/ts-utils - npm Package Compare versions

Comparing version 0.3.2 to 0.3.3

4

converters.d.ts

@@ -40,2 +40,6 @@ import { BaseConverter, Converter } from './converter';

/**
* A converter to convert an iso formatted string, a number or a Date object to a Date object
*/
export declare const isoDate: BaseConverter<Date>;
/**
* A converter to convert an optional number value. Values of type number

@@ -42,0 +46,0 @@ * or numeric strings are converted and returned. Anything else returns

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.rangeOf = exports.rangeTypeOf = exports.transform = exports.object = exports.ObjectConverter = exports.optionalField = exports.field = exports.mapOf = exports.recordOf = exports.extendedArrayOf = exports.arrayOf = exports.oneOf = exports.optionalBoolean = exports.optionalNumber = exports.delimitedString = exports.optionalString = exports.boolean = exports.number = exports.enumeratedValue = exports.string = void 0;
exports.rangeOf = exports.rangeTypeOf = exports.transform = exports.object = exports.ObjectConverter = exports.optionalField = exports.field = exports.mapOf = exports.recordOf = exports.extendedArrayOf = exports.arrayOf = exports.oneOf = exports.optionalBoolean = exports.optionalNumber = exports.isoDate = exports.delimitedString = exports.optionalString = exports.boolean = exports.number = exports.enumeratedValue = exports.string = void 0;
/*

@@ -28,2 +28,3 @@ * Copyright (c) 2020 Erik Fortune

const result_1 = require("./result");
const luxon_1 = require("luxon");
const extendedArray_1 = require("./extendedArray");

@@ -107,2 +108,21 @@ const utils_1 = require("./utils");

/**
* A converter to convert an iso formatted string, a number or a Date object to a Date object
*/
exports.isoDate = new converter_1.BaseConverter((from) => {
if (typeof from === 'string') {
const dt = luxon_1.DateTime.fromISO(from);
if (dt.isValid) {
return result_1.succeed(dt.toJSDate());
}
return result_1.fail(`Invalid date: ${dt.invalidExplanation}`);
}
else if (typeof from === 'number') {
return result_1.succeed(new Date(from));
}
else if (from instanceof Date) {
return result_1.succeed(from);
}
return result_1.fail(`Cannot convert ${JSON.stringify(from)} to Date`);
});
/**
* A converter to convert an optional number value. Values of type number

@@ -412,2 +432,2 @@ * or numeric strings are converted and returned. Anything else returns

exports.rangeOf = rangeOf;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF1RDtBQUN2RCx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBQ2hFLG1EQUFnRDtBQUNoRCxtQ0FBa0M7QUFJbEM7OztHQUdHO0FBQ1UsUUFBQSxNQUFNLEdBQUcsSUFBSSx5QkFBYSxDQUFTLENBQUMsSUFBYSxFQUFFLEVBQUU7SUFDOUQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1FBQzNCLENBQUMsQ0FBQyxnQkFBTyxDQUFDLElBQWMsQ0FBQztRQUN6QixDQUFDLENBQUMsYUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDSCxTQUFnQixlQUFlLENBQUksTUFBVztJQUMxQyxPQUFPLElBQUkseUJBQWEsQ0FBSSxDQUFDLElBQWEsRUFBYSxFQUFFO1FBQ3JELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBUyxDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQUksQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFMRCwwQ0FLQztBQUVEOzs7R0FHRztBQUNVLFFBQUEsTUFBTSxHQUFHLElBQUkseUJBQWEsQ0FBUyxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQzlELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzFC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LE9BQU8sV0FBVyxDQUFnQixTQUFTLEVBQUUsaUJBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRkQsMEJBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHsgQmFzZUNvbnZlcnRlciwgQ29udmVydGVyIH0gZnJvbSAnLi9jb252ZXJ0ZXInO1xuaW1wb3J0IHsgUmFuZ2VPZiwgUmFuZ2VPZlByb3BlcnRpZXMgfSBmcm9tICcuL3JhbmdlT2YnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IHVua25vd24gdG8gc3RyaW5nLiBWYWx1ZXMgb2YgdHlwZVxuICogc3RyaW5nIHN1Y2NlZWQuICBBbnl0aGluZyBlbHNlIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nID0gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgc3RyaW5nKVxuICAgICAgICA6IGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBvbmUgb2YgYSBzZXQgb2ZcbiAqIHN1cHBsaWVkIGVudW1lcmF0ZWQgdmFsdWVzLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZWRWYWx1ZTxUPih2YWx1ZXM6IFRbXSk6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFQ+KChmcm9tOiB1bmtub3duKTogUmVzdWx0PFQ+ID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB2YWx1ZXMuaW5kZXhPZihmcm9tIGFzIFQpO1xuICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgPyBzdWNjZWVkKHZhbHVlc1tpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBhIG51bWJlci4gIE51bWJlcnMgYW5kIHN0cmluZ3NcbiAqIHdpdGggYSBudW1lcmljIGZvcm1hdCBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IG5ldyBCYXNlQ29udmVydGVyPG51bWJlcj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bTogbnVtYmVyID0gKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IE51bWJlcihmcm9tKSA6IE5hTik7XG4gICAgICAgIHJldHVybiBpc05hTihudW0pXG4gICAgICAgICAgICA/IGZhaWwoYE5vdCBhIG51bWJlcjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKVxuICAgICAgICAgICAgOiBzdWNjZWVkKG51bSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIGJvb2xlYW4uIEJvb2xlYW4gdmFsdWVzIG9yIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzICd0cnVlJyBhbmQgJ2ZhbHNlJyBzdWNjZWVkLiAgQW55dGhpbmdcbiAqIGVsc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBzdHJpbmcgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICogYXJlIHJldHVybmVkLiAgQW55dGhpbmcgZWxzZSByZXR1cm5zIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbFN0cmluZyA9IHN0cmluZy5vcHRpb25hbCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2hpY2ggY29udmVydHMgYW55IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAqIGJ5IHNlcGFyYXRpbmcgYXQgYSBzdXBwbGllZCBkZWxpbWl0ZXIuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIFRoZSBkZWxpbWl0ZXIgYXQgd2hpY2ggdG8gc3BsaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZWRTdHJpbmcoZGVsaW1pdGVyOiBzdHJpbmcsIG9wdGlvbnM6ICdmaWx0ZXJlZCd8J2FsbCcgPSAnZmlsdGVyZWQnKTogQ29udmVydGVyPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPHN0cmluZ1tdPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmcuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgbGV0IHN0cmluZ3MgPSByZXN1bHQudmFsdWUuc3BsaXQoZGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MgPSBzdHJpbmdzLmZpbHRlcigocykgPT4gKHMudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0cmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIG9wdGlvbmFsIG51bWJlciB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgbnVtYmVyXG4gKiBvciBudW1lcmljIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQuIEFueXRoaW5nIGVsc2UgcmV0dXJuc1xuICogc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsTnVtYmVyID0gbnVtYmVyLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBib29sZWFuIHZhbHVlLiBWYWx1ZXMgb2YgdHlwZSBib29sZWFuXG4gKiBvciBzdHJpbmdzIHRoYXQgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpICd0cnVlJyBvciAnZmFsc2UnIGFyZSBjb252ZXJ0ZWRcbiAqIGFuZCByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyBzdWNjZXNzIHdpdGggYW4gdW5kZWZpbmVkIHZhbHVlLlxuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uYWxCb29sZWFuID0gYm9vbGVhbi5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIHBvbHltb3JwaGljIGZpZWxkcy4gSW52b2tlcyB0aGUgd3JhcHBlZCBjb252ZXJ0ZXJzXG4gKiBpbiBzZXF1ZW5jZSwgcmV0dXJuaW5nIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlc3VsdC4gIFJldHVybnMgYW4gZXJyb3JcbiAqIGlmIG5vbmUgb2YgdGhlIHN1cHBsaWVkIGNvbnZlcnRlcnMgY2FuIGNvbnZlcnQgdGhlIHZhbHVlLlxuICpcbiAqIElmIG9uRXJyb3IgaXMgJ2lnbm9yZUVycm9ycycgKGRlZmF1bHQpLCB0aGVuIGVycm9ycyBmcm9tIGFueSBvZiB0aGVcbiAqIGNvbnZlcnRlcnMgYXJlIGlnbm9yZWQgcHJvdmlkZWQgdGhhdCBzb21lIGNvbnZlcnRlciBzdWNjZWVkcy4gIElmXG4gKiBvbkVycm9yIGlzICdmYWlsT25FcnJvcicsIHRoZW4gYW4gZXJyb3IgZnJvbSBhbnkgY29udmVydGVyIGZhaWxzIHRoZSBlbnRpcmVcbiAqIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlcnMgQW4gb3JkZXJlZCBsaXN0IG9mIGNvbnZlcnRlcnMgdG8gYmUgY29uc2lkZXJlZFxuICogQHBhcmFtIG9uRXJyb3IgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVPZjxUPihjb252ZXJ0ZXJzOiBBcnJheTxDb252ZXJ0ZXI8VD4+LCBvbkVycm9yOiBPbkVycm9yID0gJ2lnbm9yZUVycm9ycycpOiBDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb20pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvbkVycm9yID09PSAnZmFpbE9uRXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgTm8gbWF0Y2hpbmcgY29udmVydGVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZyb20pfTogJHtlcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciBmb3IgY29udmVydGluZyBhbiBhcnJheSBvZiA8VD4uICBJZiBvbkVycm9yIGlzICdmYWlsT25FcnJvcicgKGRlZmF1bHQpLFxuICogdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnQgY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIG9uRXJyb3JcbiAqIGlzICdpZ25vcmVFcnJvcnMnLCBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSBpZ25vcmVFcnJvcnMgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheU9mPFQ+KGNvbnZlcnRlcjogQ29udmVydGVyPFQ+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxUW10+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGFuIGFycmF5OiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3VjY2Vzc2VzOiBUW10gPSBbXTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZnJvbSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoaXRlbSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2VzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9uRXJyb3IgPT09ICdpZ25vcmVFcnJvcnMnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKHN1Y2Nlc3NlcylcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIGNvbnZlcnRpbmcgdG8gSXRlbXJyYXk8VD4uICBJZiBvbkVycm9yIGlzICdmYWlsT25FcnJvcicgKGRlZmF1bHQpLFxuICogdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnQgY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIG9uRXJyb3JcbiAqIGlzICdpZ25vcmVFcnJvcnMnLCBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSBpZ25vcmVFcnJvcnMgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRlZEFycmF5T2Y8VD4obGFiZWw6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VD4sIG9uRXJyb3I6IE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InKTogQ29udmVydGVyPEV4dGVuZGVkQXJyYXk8VD4+IHtcbiAgICByZXR1cm4gYXJyYXlPZihjb252ZXJ0ZXIsIG9uRXJyb3IpLm1hcCgoaXRlbXM6IFRbXSkgPT4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgRXh0ZW5kZWRBcnJheShsYWJlbCwgLi4uaXRlbXMpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnZlcnQgdGhlIHN0cmluZy1rZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCB0byBhIFJlY29yZCBvZiBULlxuICogSWYgb25FcnJvciBpcyAnZmFpbCcgKGRlZmF1bHQpLCAgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnRcbiAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yIGlzICdpZ25vcmUnIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSByZWNvcmRcbiAqIEBwYXJhbSBpZ25vcmVFcnJvcnMgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPiwgb25FcnJvcjogJ2ZhaWwnfCdpZ25vcmUnID0gJ2ZhaWwnKTogQ29udmVydGVyPFJlY29yZDxzdHJpbmcsIFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB8fCBBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgc3RyaW5nLWtleWVkIG9iamVjdDogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgVD4gPSB7fTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKGtleSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW2tleV0gYXMgdW5rbm93bik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlJylcbiAgICAgICAgICAgID8gc3VjY2VlZChyZWNvcmQpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnZlcnQgdGhlIHN0cmluZy1rZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCB0byBhIE1hcCBvZiBULlxuICogSWYgb25FcnJvciBpcyAnZmFpbCcgKGRlZmF1bHQpLCAgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnRcbiAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yIGlzICdpZ25vcmUnIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSByZWNvcmRcbiAqIEBwYXJhbSBpZ25vcmVFcnJvcnMgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPiwgb25FcnJvcjogJ2ZhaWwnfCdpZ25vcmUnID0gJ2ZhaWwnKTogQ29udmVydGVyPE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB8fCBBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgc3RyaW5nLWtleWVkIG9iamVjdDogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21ba2V5XSBhcyB1bmtub3duKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCByZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9uRXJyb3IgPT09ICdpZ25vcmUnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKG1hcClcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgYW5kIGNvbnZlcnQgYSBmaWVsZCBmcm9tIGFuIG9iamVjdC4gU3VjY2VlZHMgYW5kIHJldHVybnNcbiAqIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaWYgdGhlIGZpZWxkIGV4aXN0cyBpbiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyIGFuZCBjYW4gYmUgY29udmVydGVkLlxuICogRmFpbHMgb3RoZXJ3aXNlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGQ8VD4obmFtZTogc3RyaW5nLCBjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPik6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcgJiYgZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2YobmFtZSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoZnJvbVtuYW1lXSkub25GYWlsdXJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGBGaWVsZCAke25hbWV9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfSBub3QgZm91bmQgaW46ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0IGZpZWxkIFwiJHtuYW1lfVwiIGZyb20gbm9uLW9iamVjdCAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgYW5kIGNvbnZlcnQgYW4gb3B0aW9uYWwgZmllbGQgZnJvbSBhbiBvYmplY3QuIFN1Y2NlZWRzXG4gKiBhbmQgcmV0dXJucyB0aGUgY29udmVydGVkIHZhbHVlIGlmIHRoZSBmaWVsZCBleGlzdHMgaW4gdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhbmQgY2FuXG4gKiBiZSBjb252ZXJ0ZWQuIFN1Y2NlZWRzIHdpdGggdW5kZWZpbmVkIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IGJ1dCB0aGUgbmFtZWQgZmllbGRcbiAqIGlzIG5vdCBwcmVzZW50LiBGYWlscyBpZiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3QuXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBleHRyYWN0ZWQgZmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEZpZWxkPFQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VD4pOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihuYW1lLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0pLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCBvciBpbnB1dCB3YXMgdW5kZWZpbmVkIHdlXG4gICAgICAgICAgICAgICAgLy8gc3VjY2VlZCB3aXRoICd1bmRlZmluZWQnLCBidXQgd2UgcHJvcGFnYXRlIGFjdHVhbFxuICAgICAgICAgICAgICAgIC8vIGZhaWx1cmVzLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgfHwgKGZyb21bbmFtZV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgRmllbGRDb252ZXJ0ZXJzPFQ+ID0geyBbIGtleSBpbiBrZXlvZiBUIF06IENvbnZlcnRlcjxUW2tleV0+IH07XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RDb252ZXJ0ZXI8VD4gZXh0ZW5kcyBCYXNlQ29udmVydGVyPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD47XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbmFsRmllbGRzOiAoa2V5b2YgVClbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPiwgb3B0aW9uYWw/OiAoa2V5b2YgVClbXSkge1xuICAgICAgICBzdXBlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50IGJ1ZyB0aGlua3Mga2V5IGlzIHVzZWQgYmVmb3JlIGRlZmluZWRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc09wdGlvbmFsID0gb3B0aW9uYWw/LmluY2x1ZGVzKGtleSkgPz8gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzT3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9uYWxGaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkKGtleSwgZmllbGRzW2tleV0pLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgdGhpcy5vcHRpb25hbEZpZWxkcyA9IG9wdGlvbmFsID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJ0aWFsKG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcjxQYXJ0aWFsPFQ+Pih0aGlzLmZpZWxkcyBhcyBGaWVsZENvbnZlcnRlcnM8UGFydGlhbDxUPj4sIG9wdGlvbmFsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFydGlhbChhZGRPcHRpb25hbEZpZWxkczogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWFsKFsuLi50aGlzLm9wdGlvbmFsRmllbGRzLCAuLi5hZGRPcHRpb25hbEZpZWxkc10pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY29udmVydCBhbiBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBzaGFwZS4gVGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QgYW5kIHRoZSBhcHByb3ByaWF0ZSBjb3JyZXNwb25kaW5nIGNvbnZlcnRlclxuICogYXMgdGhlIHByb3BlcnR5IHZhbHVlLiBJZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMgYVxuICogbmV3IG9iamVjdCB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgZmllbGRzIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBmaWVsZHMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGVmaW5pbmcgdGhlIHNoYXBlIGFuZCBjb252ZXJ0ZXJzIHRvIGJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4oZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgT2JqZWN0Q29udmVydGVyKGZpZWxkcywgb3B0aW9uYWwpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjb252ZXJ0IGFuIG9iamVjdCB0byBhIG5ldyBvYmplY3Qgd2l0aCBhIGRpZmZlcmVudCBzaGFwZS4gVGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXNcbiAqIGFuIG9iamVjdCB3aXRoIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QsIGFuZCBhbiBhcHByb3JpYXRlIF9maWVsZF9cbiAqIGNvbnZlcnRlciB0aGF0IHdpbGwgZXh0cmFjdCBhbmQgY29udmVydCBhIHNpbmdsZSBmaWVsZCBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICpcbiAqIElmIGFsbCBvZiB0aGUgZXh0cmFjdGVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCB0aGVcbiAqIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSBmaWVsZHMgdG8gYmUgZXh0cmFjdGVkIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZmllbGRzIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgc2hhcGUgb2YgdGhlIHRhcmdldCBvYmplY3QgYW5kIHRoZSBmaWVsZCBjb252ZXJ0ZXJzXG4gKiB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybTxUPihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPik6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFsga2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmllbGRzW2tleV0uY29udmVydChmcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnZlcnQgYSByYW5nZSBvZiBzb21lIG90aGVyIGNvbXBhcmFibGUgdHlwZVxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IG1pbiBhbmQgbWF4IGV4dGVudCBvZiB0aGUgcmFpZFxuICogQHBhcmFtIGNvbnN0cnVjdG9yIE9wdGlvbmFsIHN0YXRpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVR5cGVPZjxULCBSVCBleHRlbmRzIFJhbmdlT2Y8VD4+KGNvbnZlcnRlcjogQ29udmVydGVyPFQ+LCBjb25zdHJ1Y3RvcjogKGluaXQ6IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+KSA9PiBSZXN1bHQ8UlQ+KTogQ29udmVydGVyPFJUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9iamVjdCh7XG4gICAgICAgICAgICBtaW46IGNvbnZlcnRlcixcbiAgICAgICAgICAgIG1heDogY29udmVydGVyLFxuICAgICAgICB9LCBbJ21pbicsICdtYXgnXSkuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKHsgbWluOiByZXN1bHQudmFsdWUubWluLCBtYXg6IHJlc3VsdC52YWx1ZS5tYXggfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0Lm1lc3NhZ2UpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPik6IENvbnZlcnRlcjxSYW5nZU9mPFQ+PiB7XG4gICAgcmV0dXJuIHJhbmdlVHlwZU9mPFQsIFJhbmdlT2Y8VD4+KGNvbnZlcnRlciwgUmFuZ2VPZi5jcmVhdGVSYW5nZSk7XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF1RDtBQUN2RCx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsbUNBQWtDO0FBSWxDOzs7R0FHRztBQUNVLFFBQUEsTUFBTSxHQUFHLElBQUkseUJBQWEsQ0FBUyxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQzlELE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUTtRQUMzQixDQUFDLENBQUMsZ0JBQU8sQ0FBQyxJQUFjLENBQUM7UUFDekIsQ0FBQyxDQUFDLGFBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDLENBQUM7QUFFSDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFJLE1BQVc7SUFDMUMsT0FBTyxJQUFJLHlCQUFhLENBQUksQ0FBQyxJQUFhLEVBQWEsRUFBRTtRQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFJLENBQUMsNEJBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBTEQsMENBS0M7QUFFRDs7O0dBR0c7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFJLHlCQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM5RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFB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SSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBckJELDhCQXFCQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQTJCLFNBQXVCLEVBQUUsV0FBdUQ7SUFDbEksT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEIsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNqQixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFDRCxPQUFPLGFBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBWEQsa0NBV0M7QUFFRCxTQUFnQixPQUFPLENBQUksU0FBdUI7SUFDOUMsT0FBTyxXQUFXLENBQWdCLFNBQVMsRUFBRSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBCYXNlQ29udmVydGVyLCBDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcic7XG5pbXBvcnQgeyBSYW5nZU9mLCBSYW5nZU9mUHJvcGVydGllcyB9IGZyb20gJy4vcmFuZ2VPZic7XG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IHVua25vd24gdG8gc3RyaW5nLiBWYWx1ZXMgb2YgdHlwZVxuICogc3RyaW5nIHN1Y2NlZWQuICBBbnl0aGluZyBlbHNlIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nID0gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgc3RyaW5nKVxuICAgICAgICA6IGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBvbmUgb2YgYSBzZXQgb2ZcbiAqIHN1cHBsaWVkIGVudW1lcmF0ZWQgdmFsdWVzLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZWRWYWx1ZTxUPih2YWx1ZXM6IFRbXSk6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFQ+KChmcm9tOiB1bmtub3duKTogUmVzdWx0PFQ+ID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB2YWx1ZXMuaW5kZXhPZihmcm9tIGFzIFQpO1xuICAgICAgICByZXR1cm4gKGluZGV4ID49IDAgPyBzdWNjZWVkKHZhbHVlc1tpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBhIG51bWJlci4gIE51bWJlcnMgYW5kIHN0cmluZ3NcbiAqIHdpdGggYSBudW1lcmljIGZvcm1hdCBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IG5ldyBCYXNlQ29udmVydGVyPG51bWJlcj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bTogbnVtYmVyID0gKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IE51bWJlcihmcm9tKSA6IE5hTik7XG4gICAgICAgIHJldHVybiBpc05hTihudW0pXG4gICAgICAgICAgICA/IGZhaWwoYE5vdCBhIG51bWJlcjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKVxuICAgICAgICAgICAgOiBzdWNjZWVkKG51bSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIGJvb2xlYW4uIEJvb2xlYW4gdmFsdWVzIG9yIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzICd0cnVlJyBhbmQgJ2ZhbHNlJyBzdWNjZWVkLiAgQW55dGhpbmdcbiAqIGVsc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBzdHJpbmcgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICogYXJlIHJldHVybmVkLiAgQW55dGhpbmcgZWxzZSByZXR1cm5zIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbFN0cmluZyA9IHN0cmluZy5vcHRpb25hbCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2hpY2ggY29udmVydHMgYW55IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAqIGJ5IHNlcGFyYXRpbmcgYXQgYSBzdXBwbGllZCBkZWxpbWl0ZXIuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIFRoZSBkZWxpbWl0ZXIgYXQgd2hpY2ggdG8gc3BsaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZWRTdHJpbmcoZGVsaW1pdGVyOiBzdHJpbmcsIG9wdGlvbnM6ICdmaWx0ZXJlZCd8J2FsbCcgPSAnZmlsdGVyZWQnKTogQ29udmVydGVyPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPHN0cmluZ1tdPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmcuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgbGV0IHN0cmluZ3MgPSByZXN1bHQudmFsdWUuc3BsaXQoZGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MgPSBzdHJpbmdzLmZpbHRlcigocykgPT4gKHMudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0cmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIGlzbyBmb3JtYXR0ZWQgc3RyaW5nLCBhIG51bWJlciBvciBhIERhdGUgb2JqZWN0IHRvIGEgRGF0ZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGlzb0RhdGUgPSBuZXcgQmFzZUNvbnZlcnRlcjxEYXRlPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSVNPKGZyb20pO1xuICAgICAgICBpZiAoZHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZHQudG9KU0RhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYEludmFsaWQgZGF0ZTogJHtkdC5pbnZhbGlkRXhwbGFuYXRpb259YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChuZXcgRGF0ZShmcm9tKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeShmcm9tKX0gdG8gRGF0ZWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBudW1iZXIgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIG51bWJlclxuICogb3IgbnVtZXJpYyBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkLiBBbnl0aGluZyBlbHNlIHJldHVybnNcbiAqIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYm9vbGVhbiB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgYm9vbGVhblxuICogb3Igc3RyaW5ncyB0aGF0IG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKSAndHJ1ZScgb3IgJ2ZhbHNlJyBhcmUgY29udmVydGVkXG4gKiBhbmQgcmV0dXJuZWQuICBBbnl0aGluZyBlbHNlIHJldHVybnMgc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsQm9vbGVhbiA9IGJvb2xlYW4ub3B0aW9uYWwoKTtcblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBwb2x5bW9ycGhpYyBmaWVsZHMuIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVyc1xuICogaW4gc2VxdWVuY2UsIHJldHVybmluZyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yXG4gKiBpZiBub25lIG9mIHRoZSBzdXBwbGllZCBjb252ZXJ0ZXJzIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZS5cbiAqXG4gKiBJZiBvbkVycm9yIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSwgdGhlbiBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlXG4gKiBjb252ZXJ0ZXJzIGFyZSBpZ25vcmVkIHByb3ZpZGVkIHRoYXQgc29tZSBjb252ZXJ0ZXIgc3VjY2VlZHMuICBJZlxuICogb25FcnJvciBpcyAnZmFpbE9uRXJyb3InLCB0aGVuIGFuIGVycm9yIGZyb20gYW55IGNvbnZlcnRlciBmYWlscyB0aGUgZW50aXJlXG4gKiBjb252ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJzIEFuIG9yZGVyZWQgbGlzdCBvZiBjb252ZXJ0ZXJzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VD4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQ+Piwgb25FcnJvcjogT25FcnJvciA9ICdpZ25vcmVFcnJvcnMnKTogQ29udmVydGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciA9PT0gJ2ZhaWxPbkVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYE5vIG1hdGNoaW5nIGNvbnZlcnRlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIGNvbnZlcnRpbmcgYW4gYXJyYXkgb2YgPFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8VFtdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhbiBhcnJheTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NlczogVFtdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJylcbiAgICAgICAgICAgID8gc3VjY2VlZChzdWNjZXNzZXMpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBjb252ZXJ0aW5nIHRvIEl0ZW1ycmF5PFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kZWRBcnJheU9mPFQ+KGxhYmVsOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQ+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxFeHRlbmRlZEFycmF5PFQ+PiB7XG4gICAgcmV0dXJuIGFycmF5T2YoY29udmVydGVyLCBvbkVycm9yKS5tYXAoKGl0ZW1zOiBUW10pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IEV4dGVuZGVkQXJyYXkobGFiZWwsIC4uLml0ZW1zKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IHRoZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgdG8gYSBSZWNvcmQgb2YgVC5cbiAqIElmIG9uRXJyb3IgaXMgJ2ZhaWwnIChkZWZhdWx0KSwgIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvciBpcyAnaWdub3JlJyBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgcmVjb3JkXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT2Y8VD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VD4sIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJyA9ICdmYWlsJyk6IENvbnZlcnRlcjxSZWNvcmQ8c3RyaW5nLCBUPj4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbVtrZXldIGFzIHVua25vd24pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob25FcnJvciA9PT0gJ2lnbm9yZScpXG4gICAgICAgICAgICA/IHN1Y2NlZWQocmVjb3JkKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IHRoZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgdG8gYSBNYXAgb2YgVC5cbiAqIElmIG9uRXJyb3IgaXMgJ2ZhaWwnIChkZWZhdWx0KSwgIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvciBpcyAnaWdub3JlJyBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgcmVjb3JkXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VD4sIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJyA9ICdmYWlsJyk6IENvbnZlcnRlcjxNYXA8c3RyaW5nLCBUPj4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKGtleSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW2tleV0gYXMgdW5rbm93bik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgcmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlJylcbiAgICAgICAgICAgID8gc3VjY2VlZChtYXApXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGEgZmllbGQgZnJvbSBhbiBvYmplY3QuIFN1Y2NlZWRzIGFuZCByZXR1cm5zXG4gKiB0aGUgY29udmVydGVkIHZhbHVlIGlmIHRoZSBmaWVsZCBleGlzdHMgaW4gdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhbmQgY2FuIGJlIGNvbnZlcnRlZC5cbiAqIEZhaWxzIG90aGVyd2lzZS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkPFQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VD4pOiBDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKG5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0pLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX0gbm90IGZvdW5kIGluOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGFuIG9wdGlvbmFsIGZpZWxkIGZyb20gYW4gb2JqZWN0LiBTdWNjZWVkc1xuICogYW5kIHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpZiB0aGUgZmllbGQgZXhpc3RzIGluIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgYW5kIGNhblxuICogYmUgY29udmVydGVkLiBTdWNjZWVkcyB3aXRoIHVuZGVmaW5lZCBpZiB0aGUgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBidXQgdGhlIG5hbWVkIGZpZWxkXG4gKiBpcyBub3QgcHJlc2VudC4gRmFpbHMgaWYgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxGaWVsZDxUPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQ+KTogQ29udmVydGVyPFR8dW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcgJiYgZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2YobmFtZSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW25hbWVdKS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwgb3IgaW5wdXQgd2FzIHVuZGVmaW5lZCB3ZVxuICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWQgd2l0aCAndW5kZWZpbmVkJywgYnV0IHdlIHByb3BhZ2F0ZSBhY3R1YWxcbiAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpIHx8IChmcm9tW25hbWVdICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgZmllbGQgXCIke25hbWV9XCIgZnJvbSBub24tb2JqZWN0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkQ29udmVydGVyczxUPiA9IHsgWyBrZXkgaW4ga2V5b2YgVCBdOiBDb252ZXJ0ZXI8VFtrZXldPiB9O1xuXG5leHBvcnQgY2xhc3MgT2JqZWN0Q29udmVydGVyPFQ+IGV4dGVuZHMgQmFzZUNvbnZlcnRlcjxUPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25hbEZpZWxkczogKGtleW9mIFQpW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pIHtcbiAgICAgICAgc3VwZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHt9IGFzIHsgW2tleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9IG9wdGlvbmFsPy5pbmNsdWRlcyhrZXkpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpc09wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbmFsRmllbGQoa2V5LCBmaWVsZHNba2V5XSkuY29udmVydChmcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIHRoaXMub3B0aW9uYWxGaWVsZHMgPSBvcHRpb25hbCA/PyBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFydGlhbChvcHRpb25hbD86IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4odGhpcy5maWVsZHMgYXMgRmllbGRDb252ZXJ0ZXJzPFBhcnRpYWw8VD4+LCBvcHRpb25hbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhcnRpYWwoYWRkT3B0aW9uYWxGaWVsZHM6IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbChbLi4udGhpcy5vcHRpb25hbEZpZWxkcywgLi4uYWRkT3B0aW9uYWxGaWVsZHNdKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHdpdGhvdXQgY2hhbmdpbmcgc2hhcGUuIFRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB3aXRoXG4gKiBrZXkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCB0aGUgYXBwcm9wcmlhdGUgY29ycmVzcG9uZGluZyBjb252ZXJ0ZXJcbiAqIGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gSWYgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgZmllbGRzIGV4aXN0IGFuZCBjYW4gYmUgY29udmVydGVkLCByZXR1cm5zIGFcbiAqIG5ldyBvYmplY3Qgd2l0aCB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUgb3JpZ2luYWwga2V5IG5hbWVzLiAgSWYgYW55IGZpZWxkcyBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gZmllbGRzIEFuIG9iamVjdCBjb250YWluaW5nIGRlZmluaW5nIHRoZSBzaGFwZSBhbmQgY29udmVydGVycyB0byBiZSBhcHBsaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0PFQ+KGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25hbD86IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcihmaWVsZHMsIG9wdGlvbmFsKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY29udmVydCBhbiBvYmplY3QgdG8gYSBuZXcgb2JqZWN0IHdpdGggYSBkaWZmZXJlbnQgc2hhcGUuIFRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzXG4gKiBhbiBvYmplY3Qgd2l0aCBrZXkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgb2JqZWN0LCBhbmQgYW4gYXBwcm9yaWF0ZSBfZmllbGRfXG4gKiBjb252ZXJ0ZXIgdGhhdCB3aWxsIGV4dHJhY3QgYW5kIGNvbnZlcnQgYSBzaW5nbGUgZmllbGQgZnJvbSB0aGUgc291cmNlIG9iamVjdC5cbiAqXG4gKiBJZiBhbGwgb2YgdGhlIGV4dHJhY3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGggdGhlXG4gKiBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgZmllbGRzIHRvIGJlIGV4dHJhY3RlZCBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIGZpZWxkcyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIHNoYXBlIG9mIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCB0aGUgZmllbGQgY29udmVydGVyc1xuICogdG8gYmUgdXNlZCB0byBjb25zdHJ1Y3QgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm08VD4oZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4pOiBDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBbIGtleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpZWxkc1trZXldLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IGEgcmFuZ2Ugb2Ygc29tZSBvdGhlciBjb21wYXJhYmxlIHR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBtaW4gYW5kIG1heCBleHRlbnQgb2YgdGhlIHJhaWRcbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciBPcHRpb25hbCBzdGF0aWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VUeXBlT2Y8VCwgUlQgZXh0ZW5kcyBSYW5nZU9mPFQ+Pihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPiwgY29uc3RydWN0b3I6IChpbml0OiBSYW5nZU9mUHJvcGVydGllczxUPikgPT4gUmVzdWx0PFJUPik6IENvbnZlcnRlcjxSVD4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBvYmplY3Qoe1xuICAgICAgICAgICAgbWluOiBjb252ZXJ0ZXIsXG4gICAgICAgICAgICBtYXg6IGNvbnZlcnRlcixcbiAgICAgICAgfSwgWydtaW4nLCAnbWF4J10pLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvcih7IG1pbjogcmVzdWx0LnZhbHVlLm1pbiwgbWF4OiByZXN1bHQudmFsdWUubWF4IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlT2Y8VD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VD4pOiBDb252ZXJ0ZXI8UmFuZ2VPZjxUPj4ge1xuICAgIHJldHVybiByYW5nZVR5cGVPZjxULCBSYW5nZU9mPFQ+Pihjb252ZXJ0ZXIsIFJhbmdlT2YuY3JlYXRlUmFuZ2UpO1xufVxuIl19

16

package.json
{
"name": "@fgv/ts-utils",
"version": "0.3.2",
"version": "0.3.3",
"description": "Assorted Typescript Utilities",

@@ -31,7 +31,8 @@ "main": "index.js",

"devDependencies": {
"@types/jest": "^26.0.13",
"@types/jest": "^26.0.14",
"@types/luxon": "^1.25.0",
"@types/mustache": "^4.0.1",
"@types/node": "^14.10.1",
"@typescript-eslint/eslint-plugin": "^4.1.1",
"@typescript-eslint/parser": "^4.1.1",
"@types/node": "^14.11.2",
"@typescript-eslint/eslint-plugin": "^4.2.0",
"@typescript-eslint/parser": "^4.2.0",
"eslint": "^7.9.0",

@@ -46,10 +47,11 @@ "eslint-config-standard": "^14.1.1",

"rimraf": "^3.0.2",
"ts-jest": "^26.3.0",
"ts-jest": "^26.4.0",
"ts-node": "^9.0.0",
"typescript": "^4.0.2"
"typescript": "^4.0.3"
},
"dependencies": {
"csv-parse": "^4.12.0",
"luxon": "^1.25.0",
"mustache": "^4.0.1"
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc