@magic-xpa/utils
Version:
magic utils package
214 lines • 21.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
// In order to convert some functionality to Visual C#, the Java Language Conversion Assistant
// creates "support classes" that duplicate the original functionality.
//
// Support classes replicate the functionality of the original code, but in some cases they are
// substantially different architecturally. Although every effort is made to preserve the
// original architecture of the application in the converted project, the user should be aware that
// the primary goal of these support classes is to replicate functionality, and that at times
// the architecture of the resulting solution may differ somewhat.
import { StringBuilder, NString, NNumber, DateTime, RefParam } from "@magic-xpa/mscorelib";
/// <summary>
/// Contains conversion support elements such as classes, interfaces and static methods.
/// </summary>
export class Misc {
/// <summary>
/// Writes the exception stack trace to the received stream
/// </summary>
/// <param name="throwable">Exception to obtain information from</param>
/// <param name="stream">Output sream used to write to</param>
/**
* @param {?} throwable
* @return {?}
*/
static WriteStackTrace(throwable) {
console.log(throwable.Message);
console.log(throwable.StackTrace);
}
/// <summary>
/// Receives a byte array and returns it transformed in an byte array
/// </summary>
/// <param name="byteArray">Byte array to process</param>
/// <returns>The transformed array</returns>
/**
* @param {?} byteArray
* @return {?}
*/
static ToSByteArray(byteArray) {
/** @type {?} */
let sbyteArray = null;
if (byteArray !== null) {
sbyteArray = new Int8Array(byteArray.length);
for (let i = 0; i < byteArray.length; i = i + 1) {
sbyteArray[i] = (/** @type {?} */ (byteArray[i]));
}
}
return sbyteArray;
}
/// <summary>
/// Receives sbyte array and returns it transformed in a byte array
/// </summary>
/// <param name="sbyteArray">sbyte array to process</param>
/// <returns>The transformed array</returns>
/**
* @param {?} sbyteArray
* @return {?}
*/
static ToByteArray(sbyteArray) {
/** @type {?} */
let byteArray = null;
if (sbyteArray !== null) {
byteArray = new Uint8Array(sbyteArray.length);
for (let i = 0; i < sbyteArray.length; i = i + 1) {
byteArray[i] = (/** @type {?} */ (sbyteArray[i]));
}
}
return byteArray;
}
/// <summary> Compares number of bytes in two byte arrays</summary>
/// <param name="source"></param>
/// <param name="destination"></param>
/// <param name="numberOfBytes"></param>
/// <returns> boolen true if equal</returns>
/**
* @param {?} source
* @param {?} destination
* @param {?} numberOfBytes
* @return {?}
*/
static CompareByteArray(source, destination, numberOfBytes) {
if (source.length >= numberOfBytes && destination.length >= numberOfBytes) {
for (let len = 0; len < numberOfBytes; len++) {
if (source[len] !== destination[len])
return false;
}
}
else
return false;
return true;
}
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
/// <param name="number">Number to operate on</param>
/// <param name="bits">Ammount of bits to shift</param>
/// <returns>The resulting number from the shift operation</returns>
// TODO: instead of calling URShift(number, bits), we can use((uint)number) >> bits.
/**
* @param {?} number
* @param {?} bits
* @return {?}
*/
static URShift(number, bits) {
/** @type {?} */
let result;
if (number >= 0) {
result = number >> bits;
}
else {
result = (number >> bits) + (2 << ~bits);
}
return result;
}
/// <summary>
/// get system's time in milliseconds
/// </summary>
/// <returns></returns>
/**
* @return {?}
*/
static getSystemMilliseconds() {
// TODO - check if we need this adjustment
return Math.floor((DateTime.Now.Ticks - 621355968000000000) / 10000);
}
/// <summary>
/// Compares 2 int arrays
/// </summary>
/// <param name="arrayOne"></param>
/// <param name="arrayTwo"></param>
/// <returns>true if arrays are equal else false</returns>
/**
* @param {?} arrayOne
* @param {?} arrayTwo
* @return {?}
*/
static CompareIntArrays(arrayOne, arrayTwo) {
/** @type {?} */
let areEqual = false;
if (arrayOne === arrayTwo) {
areEqual = true;
}
else {
if (arrayOne !== null && arrayTwo !== null) {
if (arrayOne.length === arrayTwo.length) {
for (let i = 0; i < arrayOne.length; i = i + 1) {
if (arrayOne[i] !== arrayTwo[i]) {
break;
}
areEqual = true;
}
}
}
}
return areEqual;
}
/// <summary>
/// Returns the comma separated string for the values passed in int array.
/// </summary>
/// <param name="values">Integer array</param>
/// <returns>comma separated string</returns>
/**
* @param {?} intArray
* @return {?}
*/
static GetCommaSeperatedString(intArray) {
/** @type {?} */
let temp = new StringBuilder();
for (let val = 0; val < intArray.length; val = val + 1) {
/** @type {?} */
let value = intArray[val];
if (temp.Length > 0) {
temp.Append(",");
}
temp.Append(value);
}
return temp.ToString();
}
/// <summary>
/// Returns int array out of comma separated string
/// </summary>
/// <param name="value">comma separated string</param>
/// <returns>Integer array</returns>
/**
* @param {?} commaSeparatedValue
* @return {?}
*/
static GetIntArray(commaSeparatedValue) {
/** @type {?} */
let intArray = new Array(0);
if (!NString.IsNullOrEmpty(commaSeparatedValue)) {
/** @type {?} */
let vals = commaSeparatedValue.split(',');
intArray = new Array(vals.length);
/** @type {?} */
let outInt = new RefParam(0);
for (let iCtr = 0; iCtr < vals.length; iCtr = iCtr + 1) {
/** @type {?} */
let _r = NNumber.TryParse(vals[iCtr], outInt);
intArray[iCtr] = outInt.value;
}
}
return intArray;
}
/**
* @param {?} fileName
* @return {?}
*/
static IsWebUrl(fileName) {
return fileName.toLowerCase().startsWith("http");
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtYWdpYy14cGEvdXRpbHMvIiwic291cmNlcyI6WyJzcmMvTWlzYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFVQSxPQUFPLEVBQ00sYUFBYSxFQUN4QixPQUFPLEVBQUUsT0FBTyxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNuQixNQUFNLHNCQUFzQixDQUFDOzs7O0FBTzlCLE1BQU07Ozs7Ozs7Ozs7SUFPSixNQUFNLENBQUMsZUFBZSxDQUFDLFNBQW9CO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7Ozs7Ozs7SUFPRCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXFCOztZQUNuQyxVQUFVLEdBQWMsSUFBSTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QixVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQVEsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFBLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BCLENBQUM7Ozs7Ozs7Ozs7SUFPRCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQXFCOztZQUNsQyxTQUFTLEdBQWUsSUFBSTtRQUNoQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZ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O29CQUMzRCxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO2dCQUM3QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluIG9yZGVyIHRvIGNvbnZlcnQgc29tZSBmdW5jdGlvbmFsaXR5IHRvIFZpc3VhbCBDIywgdGhlIEphdmEgTGFuZ3VhZ2UgQ29udmVyc2lvbiBBc3Npc3RhbnRcclxuLy8gY3JlYXRlcyBcInN1cHBvcnQgY2xhc3Nlc1wiIHRoYXQgZHVwbGljYXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbmFsaXR5LlxyXG4vL1xyXG4vLyBTdXBwb3J0IGNsYXNzZXMgcmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcmlnaW5hbCBjb2RlLCBidXQgaW4gc29tZSBjYXNlcyB0aGV5IGFyZVxyXG4vLyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudCBhcmNoaXRlY3R1cmFsbHkuIEFsdGhvdWdoIGV2ZXJ5IGVmZm9ydCBpcyBtYWRlIHRvIHByZXNlcnZlIHRoZVxyXG4vLyBvcmlnaW5hbCBhcmNoaXRlY3R1cmUgb2YgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSBjb252ZXJ0ZWQgcHJvamVjdCwgdGhlIHVzZXIgc2hvdWxkIGJlIGF3YXJlIHRoYXRcclxuLy8gdGhlIHByaW1hcnkgZ29hbCBvZiB0aGVzZSBzdXBwb3J0IGNsYXNzZXMgaXMgdG8gcmVwbGljYXRlIGZ1bmN0aW9uYWxpdHksIGFuZCB0aGF0IGF0IHRpbWVzXHJcbi8vIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHJlc3VsdGluZyBzb2x1dGlvbiBtYXkgZGlmZmVyIHNvbWV3aGF0LlxyXG5cclxuXHJcbmltcG9ydCB7XHJcbiAgRXhjZXB0aW9uLCBTdHJpbmdCdWlsZGVyLFxyXG4gIE5TdHJpbmcsIE5OdW1iZXIsXHJcbiAgRGF0ZVRpbWUsIFJlZlBhcmFtXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcblxyXG5cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIENvbnRhaW5zIGNvbnZlcnNpb24gc3VwcG9ydCBlbGVtZW50cyBzdWNoIGFzIGNsYXNzZXMsIGludGVyZmFjZXMgYW5kIHN0YXRpYyBtZXRob2RzLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgTWlzYyB7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gV3JpdGVzIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2UgdG8gdGhlIHJlY2VpdmVkIHN0cmVhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGhyb3dhYmxlXCI+RXhjZXB0aW9uIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBmcm9tPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJlYW1cIj5PdXRwdXQgc3JlYW0gdXNlZCB0byB3cml0ZSB0bzwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlU3RhY2tUcmFjZSh0aHJvd2FibGU6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2codGhyb3dhYmxlLk1lc3NhZ2UpO1xyXG4gICAgY29uc29sZS5sb2codGhyb3dhYmxlLlN0YWNrVHJhY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZWNlaXZlcyBhIGJ5dGUgYXJyYXkgYW5kIHJldHVybnMgaXQgdHJhbnNmb3JtZWQgaW4gYW4gYnl0ZSBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnl0ZUFycmF5XCI+Qnl0ZSBhcnJheSB0byBwcm9jZXNzPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIHRyYW5zZm9ybWVkIGFycmF5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUb1NCeXRlQXJyYXkoYnl0ZUFycmF5OiBVaW50OEFycmF5KTogSW50OEFycmF5IHtcclxuICAgIGxldCBzYnl0ZUFycmF5OiBJbnQ4QXJyYXkgPSBudWxsO1xyXG4gICAgaWYgKGJ5dGVBcnJheSAhPT0gbnVsbCkge1xyXG4gICAgICBzYnl0ZUFycmF5ID0gbmV3IEludDhBcnJheShieXRlQXJyYXkubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGJ5dGVBcnJheS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIHNieXRlQXJyYXlbaV0gPSA8bnVtYmVyPmJ5dGVBcnJheVtpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNieXRlQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlY2VpdmVzIHNieXRlIGFycmF5IGFuZCByZXR1cm5zIGl0IHRyYW5zZm9ybWVkIGluIGEgYnl0ZSBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2J5dGVBcnJheVwiPnNieXRlIGFycmF5IHRvIHByb2Nlc3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgdHJhbnNmb3JtZWQgYXJyYXk8L3JldHVybnM+XHJcbiAgc3RhdGljIFRvQnl0ZUFycmF5KHNieXRlQXJyYXk6IEludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xyXG4gICAgbGV0IGJ5dGVBcnJheTogVWludDhBcnJheSA9IG51bGw7XHJcbiAgICBpZiAoc2J5dGVBcnJheSAhPT0gbnVsbCkge1xyXG4gICAgICBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShzYnl0ZUFycmF5Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzYnl0ZUFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgYnl0ZUFycmF5W2ldID0gPG51bWJlcj5zYnl0ZUFycmF5W2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnl0ZUFycmF5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wYXJlcyBudW1iZXIgb2YgYnl0ZXMgaW4gdHdvIGJ5dGUgYXJyYXlzPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNvdXJjZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVzdGluYXRpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm51bWJlck9mQnl0ZXNcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVuIHRydWUgaWYgZXF1YWw8L3JldHVybnM+XHJcbiAgc3RhdGljIENvbXBhcmVCeXRlQXJyYXkoc291cmNlOiBVaW50OEFycmF5LCBkZXN0aW5hdGlvbjogVWludDhBcnJheSwgbnVtYmVyT2ZCeXRlczogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoc291cmNlLmxlbmd0aCA+PSBudW1iZXJPZkJ5dGVzICYmIGRlc3RpbmF0aW9uLmxlbmd0aCA+PSBudW1iZXJPZkJ5dGVzKSB7XHJcbiAgICAgIGZvciAobGV0IGxlbjogbnVtYmVyID0gMDsgbGVuIDwgbnVtYmVyT2ZCeXRlczsgbGVuKyspIHtcclxuICAgICAgICBpZiAoc291cmNlW2xlbl0gIT09IGRlc3RpbmF0aW9uW2xlbl0pXHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBQZXJmb3JtcyBhbiB1bnNpZ25lZCBiaXR3aXNlIHJpZ2h0IHNoaWZ0IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm51bWJlclwiPk51bWJlciB0byBvcGVyYXRlIG9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJiaXRzXCI+QW1tb3VudCBvZiBiaXRzIHRvIHNoaWZ0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIHJlc3VsdGluZyBudW1iZXIgZnJvbSB0aGUgc2hpZnQgb3BlcmF0aW9uPC9yZXR1cm5zPlxyXG4gIC8vIFRPRE86IGluc3RlYWQgb2YgY2FsbGluZyBVUlNoaWZ0KG51bWJlciwgYml0cyksIHdlIGNhbiB1c2UoKHVpbnQpbnVtYmVyKSA+PiBiaXRzLlxyXG4gIHN0YXRpYyBVUlNoaWZ0KG51bWJlcjogbnVtYmVyLCBiaXRzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG4gICAgaWYgKG51bWJlciA+PSAwKSB7XHJcbiAgICAgIHJlc3VsdCA9IG51bWJlciA+PiBiaXRzO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IChudW1iZXIgPj4gYml0cykgKyAoMiA8PCB+Yml0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgc3lzdGVtJ3MgdGltZSBpbiBtaWxsaXNlY29uZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIGdldFN5c3RlbU1pbGxpc2Vjb25kcygpOiBudW1iZXIge1xyXG4gICAgLy8gVE9ETyAtIGNoZWNrIGlmIHdlIG5lZWQgdGhpcyBhZGp1c3RtZW50XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoRGF0ZVRpbWUuTm93LlRpY2tzIC0gNjIxMzU1OTY4MDAwMDAwMDAwKSAvIDEwMDAwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ29tcGFyZXMgMiBpbnQgYXJyYXlzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcnJheU9uZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYXJyYXlUd29cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmIGFycmF5cyBhcmUgZXF1YWwgZWxzZSBmYWxzZTwvcmV0dXJucz5cclxuICBzdGF0aWMgQ29tcGFyZUludEFycmF5cyhhcnJheU9uZTogbnVtYmVyW10sIGFycmF5VHdvOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFyZUVxdWFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoYXJyYXlPbmUgPT09IGFycmF5VHdvKSB7XHJcbiAgICAgIGFyZUVxdWFsID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoYXJyYXlPbmUgIT09IG51bGwgJiYgYXJyYXlUd28gIT09IG51bGwpIHtcclxuICAgICAgICBpZiAoYXJyYXlPbmUubGVuZ3RoID09PSBhcnJheVR3by5sZW5ndGgpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBhcnJheU9uZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICBpZiAoYXJyYXlPbmVbaV0gIT09IGFycmF5VHdvW2ldKSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJlRXF1YWwgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyZUVxdWFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIGZvciB0aGUgdmFsdWVzIHBhc3NlZCBpbiBpbnQgYXJyYXkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZXNcIj5JbnRlZ2VyIGFycmF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+Y29tbWEgc2VwYXJhdGVkIHN0cmluZzwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0Q29tbWFTZXBlcmF0ZWRTdHJpbmcoaW50QXJyYXk6IG51bWJlcltdKTogc3RyaW5nIHtcclxuICAgIGxldCB0ZW1wOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGZvciAobGV0IHZhbDogbnVtYmVyID0gMDsgdmFsIDwgaW50QXJyYXkubGVuZ3RoOyB2YWwgPSB2YWwgKyAxKSB7XHJcbiAgICAgIGxldCB2YWx1ZTogbnVtYmVyID0gaW50QXJyYXlbdmFsXTtcclxuICAgICAgaWYgKHRlbXAuTGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRlbXAuQXBwZW5kKFwiLFwiKTtcclxuICAgICAgfVxyXG4gICAgICB0ZW1wLkFwcGVuZCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcC5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIGludCBhcnJheSBvdXQgb2YgY29tbWEgc2VwYXJhdGVkIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj5jb21tYSBzZXBhcmF0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+SW50ZWdlciBhcnJheTwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0SW50QXJyYXkoY29tbWFTZXBhcmF0ZWRWYWx1ZTogc3RyaW5nKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGludEFycmF5OiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDApO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGNvbW1hU2VwYXJhdGVkVmFsdWUpKSB7XHJcbiAgICAgIGxldCB2YWxzOiBzdHJpbmdbXSA9IGNvbW1hU2VwYXJhdGVkVmFsdWUuc3BsaXQoJywnKTtcclxuICAgICAgaW50QXJyYXkgPSBuZXcgQXJyYXk8bnVtYmVyPih2YWxzLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgb3V0SW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtKDApO1xyXG4gICAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgdmFscy5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICAgIGxldCBfciA9IE5OdW1iZXIuVHJ5UGFyc2UodmFsc1tpQ3RyXSwgb3V0SW50KTtcclxuICAgICAgICBpbnRBcnJheVtpQ3RyXSA9IG91dEludC52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnRBcnJheTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBJc1dlYlVybChmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiaHR0cFwiKTtcclxuICB9XHJcbn1cclxuIl19