UNPKG

@magic-xpa/utils

Version:

magic utils package

259 lines (258 loc) • 22.9 kB
/** * @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"; var Misc = /** @class */ (function () { function 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 {?} */ Misc.WriteStackTrace = /** * @param {?} throwable * @return {?} */ function (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 {?} */ Misc.ToSByteArray = /** * @param {?} byteArray * @return {?} */ function (byteArray) { /** @type {?} */ var sbyteArray = null; if (byteArray !== null) { sbyteArray = new Int8Array(byteArray.length); for (var 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 {?} */ Misc.ToByteArray = /** * @param {?} sbyteArray * @return {?} */ function (sbyteArray) { /** @type {?} */ var byteArray = null; if (sbyteArray !== null) { byteArray = new Uint8Array(sbyteArray.length); for (var 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 {?} */ Misc.CompareByteArray = /** * @param {?} source * @param {?} destination * @param {?} numberOfBytes * @return {?} */ function (source, destination, numberOfBytes) { if (source.length >= numberOfBytes && destination.length >= numberOfBytes) { for (var 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 {?} */ Misc.URShift = /** * @param {?} number * @param {?} bits * @return {?} */ function (number, bits) { /** @type {?} */ var 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 {?} */ Misc.getSystemMilliseconds = /** * @return {?} */ function () { // 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 {?} */ Misc.CompareIntArrays = /** * @param {?} arrayOne * @param {?} arrayTwo * @return {?} */ function (arrayOne, arrayTwo) { /** @type {?} */ var areEqual = false; if (arrayOne === arrayTwo) { areEqual = true; } else { if (arrayOne !== null && arrayTwo !== null) { if (arrayOne.length === arrayTwo.length) { for (var 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 {?} */ Misc.GetCommaSeperatedString = /** * @param {?} intArray * @return {?} */ function (intArray) { /** @type {?} */ var temp = new StringBuilder(); for (var val = 0; val < intArray.length; val = val + 1) { /** @type {?} */ var 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 {?} */ Misc.GetIntArray = /** * @param {?} commaSeparatedValue * @return {?} */ function (commaSeparatedValue) { /** @type {?} */ var intArray = new Array(0); if (!NString.IsNullOrEmpty(commaSeparatedValue)) { /** @type {?} */ var vals = commaSeparatedValue.split(','); intArray = new Array(vals.length); /** @type {?} */ var outInt = new RefParam(0); for (var iCtr = 0; iCtr < vals.length; iCtr = iCtr + 1) { /** @type {?} */ var _r = NNumber.TryParse(vals[iCtr], outInt); intArray[iCtr] = outInt.value; } } return intArray; }; /** * @param {?} fileName * @return {?} */ Misc.IsWebUrl = /** * @param {?} fileName * @return {?} */ function (fileName) { return fileName.toLowerCase().startsWith("http"); }; return Misc; }()); export { Misc }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtYWdpYy14cGEvdXRpbHMvIiwic291cmNlcyI6WyJzcmMvTWlzYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFVQSxPQUFPLEVBQ00sYUFBYSxFQUN4QixPQUFPLEVBQUUsT0FBTyxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNuQixNQUFNLHNCQUFzQixDQUFDO0FBTzlCLElBQUE7OztJQUVFLGFBQWE7SUFDYiwyREFBMkQ7SUFDM0QsY0FBYztJQUNkLHdFQUF3RTtJQUN4RSw4REFBOEQ7Ozs7O0lBQ3ZELG9CQUFlOzs7O0lBQXRCLFVBQXVCLFNBQW9CO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25DO0lBRUQsYUFBYTtJQUNiLHFFQUFxRTtJQUNyRSxjQUFjO0lBQ2QseURBQXlEO0lBQ3pELDRDQUE0Qzs7Ozs7SUFDckMsaUJBQVk7Ozs7SUFBbkIsVUFBb0IsU0FBcUI7O1FBQ3ZDLElBQUksVUFBVSxHQUFjLElBQUksQ0FBQztRQUNqQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QixVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxVQUFVLENBQUMsQ0FBQyxDQUFDLHFCQUFXLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0tBQ25CO0lBRUQsYUFBYTtJQUNiLG1FQUFtRTtJQUNuRSxjQUFjO0lBQ2QsMkRBQTJEO0lBQzNELDRDQUE0Qzs7Ozs7SUFDckMsZ0JBQVc7Ozs7SUFBbEIsVUFBbUIsVUFBcUI7O1FBQ3RDLElBQUksU0FBUyxHQUFlLElBQUksQ0FBQztRQUNqQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QixTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6RCxTQUFTLENBQUMsQ0FBQyxDQUFDLHFCQUFXLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxNQUFNLENBQUMsU0FBUyxDQUFDO0tBQ2xCO0lBRUQsbUVBQW1FO0lBQ25FLGlDQUFpQztJQUNqQyxzQ0FBc0M7SUFDdEMsd0NBQXdDO0lBQ3hDLDRDQUE0Qzs7Ozs7OztJQUNyQyxxQkFBZ0I7Ozs7OztJQUF2QixVQUF3QixNQUFrQixFQUFFLFdBQXVCLEVBQUUsYUFBcUI7UUFDeEYsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxhQUFhLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQzFFLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFXLENBQUMsRUFBRSxHQUFHLEdBQUcsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ3JELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDaEI7U0FDRjtRQUNELElBQUk7WUFDRixNQUFNLENBQUMsS0FBSyxDQUFDO1FBRWYsTUFBTSxDQUFDLElBQUksQ0FBQztLQUNiO0lBRUQsYUFBYTtJQUNiLHNFQUFzRTtJQUN0RSxjQUFjO0lBQ2QscURBQXFEO0lBQ3JELHVEQUF1RDtJQUN2RCxvRUFBb0U7SUFDcEUsb0ZBQW9GOzs7Ozs7SUFDN0UsWUFBTzs7Ozs7SUFBZCxVQUFlLE1BQWMsRUFBRSxJQUFZOztRQUN6QyxJQUFJLE1BQU0sQ0FBUztRQUNuQixFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0tBQ2Y7SUFFRCxhQUFhO0lBQ2IscUNBQXFDO0lBQ3JDLGNBQWM7SUFDZCx1QkFBdUI7Ozs7SUFDaEIsMEJBQXFCOzs7SUFBNUI7O1FBRUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0tBQ3RFO0lBRUQsYUFBYTtJQUNiLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsbUNBQW1DO0lBQ25DLG1DQUFtQztJQUNuQywwREFBMEQ7Ozs7OztJQUNuRCxxQkFBZ0I7Ozs7O0lBQXZCLFVBQXdCLFFBQWtCLEVBQUUsUUFBa0I7O1FBQzVELElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztRQUM5QixFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxQixRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ2pCO1FBQ0QsSUFBSSxDQUFDLENBQUM7WUFDSixFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkQsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2hDLEtBQUssQ0FBQzt5QkFDUDt3QkFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDO3FCQUNqQjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDO0tBQ2pCO0lBRUQsYUFBYTtJQUNiLDBFQUEwRTtJQUMxRSxjQUFjO0lBQ2QsOENBQThDO0lBQzlDLDZDQUE2Qzs7Ozs7SUFDdEMsNEJBQXVCOzs7O0lBQTlCLFVBQStCLFFBQWtCOztRQUMvQyxJQUFJLElBQUksR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUM5QyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBVyxDQUFDLEVBQUUsR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7WUFDL0QsSUFBSSxLQUFLLEdBQVcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNsQjtZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEI7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3hCO0lBRUQsYUFBYTtJQUNiLG1EQUFtRDtJQUNuRCxjQUFjO0lBQ2Qsc0RBQXNEO0lBQ3RELG9DQUFvQzs7Ozs7SUFDN0IsZ0JBQVc7Ozs7SUFBbEIsVUFBbUIsbUJBQTJCOztRQUM1QyxJQUFJLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUU5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQ2hELElBQUksSUFBSSxHQUFhLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUUxQyxJQUFJLE1BQU0sR0FBcUIsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7O2dCQUMvRCxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDL0I7U0FDRjtRQUVELE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDakI7Ozs7O0lBRU0sYUFBUTs7OztJQUFmLFVBQWdCLFFBQWdCO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2xEO2VBakxIO0lBa0xDLENBQUE7QUE3SkQsZ0JBNkpDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW4gb3JkZXIgdG8gY29udmVydCBzb21lIGZ1bmN0aW9uYWxpdHkgdG8gVmlzdWFsIEMjLCB0aGUgSmF2YSBMYW5ndWFnZSBDb252ZXJzaW9uIEFzc2lzdGFudFxyXG4vLyBjcmVhdGVzIFwic3VwcG9ydCBjbGFzc2VzXCIgdGhhdCBkdXBsaWNhdGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uYWxpdHkuXHJcbi8vXHJcbi8vIFN1cHBvcnQgY2xhc3NlcyByZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9yaWdpbmFsIGNvZGUsIGJ1dCBpbiBzb21lIGNhc2VzIHRoZXkgYXJlXHJcbi8vIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGFyY2hpdGVjdHVyYWxseS4gQWx0aG91Z2ggZXZlcnkgZWZmb3J0IGlzIG1hZGUgdG8gcHJlc2VydmUgdGhlXHJcbi8vIG9yaWdpbmFsIGFyY2hpdGVjdHVyZSBvZiB0aGUgYXBwbGljYXRpb24gaW4gdGhlIGNvbnZlcnRlZCBwcm9qZWN0LCB0aGUgdXNlciBzaG91bGQgYmUgYXdhcmUgdGhhdFxyXG4vLyB0aGUgcHJpbWFyeSBnb2FsIG9mIHRoZXNlIHN1cHBvcnQgY2xhc3NlcyBpcyB0byByZXBsaWNhdGUgZnVuY3Rpb25hbGl0eSwgYW5kIHRoYXQgYXQgdGltZXNcclxuLy8gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgcmVzdWx0aW5nIHNvbHV0aW9uIG1heSBkaWZmZXIgc29tZXdoYXQuXHJcblxyXG5cclxuaW1wb3J0IHtcclxuICBFeGNlcHRpb24sIFN0cmluZ0J1aWxkZXIsXHJcbiAgTlN0cmluZywgTk51bWJlcixcclxuICBEYXRlVGltZSwgUmVmUGFyYW1cclxufSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuXHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gQ29udGFpbnMgY29udmVyc2lvbiBzdXBwb3J0IGVsZW1lbnRzIHN1Y2ggYXMgY2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgc3RhdGljIG1ldGhvZHMuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBNaXNjIHtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB0byB0aGUgcmVjZWl2ZWQgc3RyZWFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0aHJvd2FibGVcIj5FeGNlcHRpb24gdG8gb2J0YWluIGluZm9ybWF0aW9uIGZyb208L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0cmVhbVwiPk91dHB1dCBzcmVhbSB1c2VkIHRvIHdyaXRlIHRvPC9wYXJhbT5cclxuICBzdGF0aWMgV3JpdGVTdGFja1RyYWNlKHRocm93YWJsZTogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyh0aHJvd2FibGUuTWVzc2FnZSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aHJvd2FibGUuU3RhY2tUcmFjZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlY2VpdmVzIGEgYnl0ZSBhcnJheSBhbmQgcmV0dXJucyBpdCB0cmFuc2Zvcm1lZCBpbiBhbiBieXRlIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJieXRlQXJyYXlcIj5CeXRlIGFycmF5IHRvIHByb2Nlc3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgdHJhbnNmb3JtZWQgYXJyYXk8L3JldHVybnM+XHJcbiAgc3RhdGljIFRvU0J5dGVBcnJheShieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBJbnQ4QXJyYXkge1xyXG4gICAgbGV0IHNieXRlQXJyYXk6IEludDhBcnJheSA9IG51bGw7XHJcbiAgICBpZiAoYnl0ZUFycmF5ICE9PSBudWxsKSB7XHJcbiAgICAgIHNieXRlQXJyYXkgPSBuZXcgSW50OEFycmF5KGJ5dGVBcnJheS5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYnl0ZUFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgc2J5dGVBcnJheVtpXSA9IDxudW1iZXI+Ynl0ZUFycmF5W2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2J5dGVBcnJheTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVjZWl2ZXMgc2J5dGUgYXJyYXkgYW5kIHJldHVybnMgaXQgdHJhbnNmb3JtZWQgaW4gYSBieXRlIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzYnl0ZUFycmF5XCI+c2J5dGUgYXJyYXkgdG8gcHJvY2VzczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSB0cmFuc2Zvcm1lZCBhcnJheTwvcmV0dXJucz5cclxuICBzdGF0aWMgVG9CeXRlQXJyYXkoc2J5dGVBcnJheTogSW50OEFycmF5KTogVWludDhBcnJheSB7XHJcbiAgICBsZXQgYnl0ZUFycmF5OiBVaW50OEFycmF5ID0gbnVsbDtcclxuICAgIGlmIChzYnl0ZUFycmF5ICE9PSBudWxsKSB7XHJcbiAgICAgIGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KHNieXRlQXJyYXkubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNieXRlQXJyYXkubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBieXRlQXJyYXlbaV0gPSA8bnVtYmVyPnNieXRlQXJyYXlbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBieXRlQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvbXBhcmVzIG51bWJlciBvZiBieXRlcyBpbiB0d28gYnl0ZSBhcnJheXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291cmNlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZXN0aW5hdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibnVtYmVyT2ZCeXRlc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZW4gdHJ1ZSBpZiBlcXVhbDwvcmV0dXJucz5cclxuICBzdGF0aWMgQ29tcGFyZUJ5dGVBcnJheShzb3VyY2U6IFVpbnQ4QXJyYXksIGRlc3RpbmF0aW9uOiBVaW50OEFycmF5LCBudW1iZXJPZkJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChzb3VyY2UubGVuZ3RoID49IG51bWJlck9mQnl0ZXMgJiYgZGVzdGluYXRpb24ubGVuZ3RoID49IG51bWJlck9mQnl0ZXMpIHtcclxuICAgICAgZm9yIChsZXQgbGVuOiBudW1iZXIgPSAwOyBsZW4gPCBudW1iZXJPZkJ5dGVzOyBsZW4rKykge1xyXG4gICAgICAgIGlmIChzb3VyY2VbbGVuXSAhPT0gZGVzdGluYXRpb25bbGVuXSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFBlcmZvcm1zIGFuIHVuc2lnbmVkIGJpdHdpc2UgcmlnaHQgc2hpZnQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibnVtYmVyXCI+TnVtYmVyIHRvIG9wZXJhdGUgb248L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJpdHNcIj5BbW1vdW50IG9mIGJpdHMgdG8gc2hpZnQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgcmVzdWx0aW5nIG51bWJlciBmcm9tIHRoZSBzaGlmdCBvcGVyYXRpb248L3JldHVybnM+XHJcbiAgLy8gVE9ETzogaW5zdGVhZCBvZiBjYWxsaW5nIFVSU2hpZnQobnVtYmVyLCBiaXRzKSwgd2UgY2FuIHVzZSgodWludCludW1iZXIpID4+IGJpdHMuXHJcbiAgc3RhdGljIFVSU2hpZnQobnVtYmVyOiBudW1iZXIsIGJpdHM6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAobnVtYmVyID49IDApIHtcclxuICAgICAgcmVzdWx0ID0gbnVtYmVyID4+IGJpdHM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gKG51bWJlciA+PiBiaXRzKSArICgyIDw8IH5iaXRzKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBzeXN0ZW0ncyB0aW1lIGluIG1pbGxpc2Vjb25kc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XHJcbiAgICAvLyBUT0RPIC0gY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGFkanVzdG1lbnRcclxuICAgIHJldHVybiBNYXRoLmZsb29yKChEYXRlVGltZS5Ob3cuVGlja3MgLSA2MjEzNTU5NjgwMDAwMDAwMDApIC8gMTAwMDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDb21wYXJlcyAyIGludCBhcnJheXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFycmF5T25lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcnJheVR3b1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgYXJyYXlzIGFyZSBlcXVhbCBlbHNlIGZhbHNlPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDb21wYXJlSW50QXJyYXlzKGFycmF5T25lOiBudW1iZXJbXSwgYXJyYXlUd286IG51bWJlcltdKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXJlRXF1YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChhcnJheU9uZSA9PT0gYXJyYXlUd28pIHtcclxuICAgICAgYXJlRXF1YWwgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChhcnJheU9uZSAhPT0gbnVsbCAmJiBhcnJheVR3byAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChhcnJheU9uZS5sZW5ndGggPT09IGFycmF5VHdvLmxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFycmF5T25lLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJheU9uZVtpXSAhPT0gYXJyYXlUd29baV0pIHtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhcmVFcXVhbCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJlRXF1YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGhlIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgZm9yIHRoZSB2YWx1ZXMgcGFzc2VkIGluIGludCBhcnJheS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlc1wiPkludGVnZXIgYXJyYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5jb21tYSBzZXBhcmF0ZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRDb21tYVNlcGVyYXRlZFN0cmluZyhpbnRBcnJheTogbnVtYmVyW10pOiBzdHJpbmcge1xyXG4gICAgbGV0IHRlbXA6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgZm9yIChsZXQgdmFsOiBudW1iZXIgPSAwOyB2YWwgPCBpbnRBcnJheS5sZW5ndGg7IHZhbCA9IHZhbCArIDEpIHtcclxuICAgICAgbGV0IHZhbHVlOiBudW1iZXIgPSBpbnRBcnJheVt2YWxdO1xyXG4gICAgICBpZiAodGVtcC5MZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGVtcC5BcHBlbmQoXCIsXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRlbXAuQXBwZW5kKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgaW50IGFycmF5IG91dCBvZiBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPmNvbW1hIHNlcGFyYXRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5JbnRlZ2VyIGFycmF5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRJbnRBcnJheShjb21tYVNlcGFyYXRlZFZhbHVlOiBzdHJpbmcpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgaW50QXJyYXk6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oMCk7XHJcblxyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoY29tbWFTZXBhcmF0ZWRWYWx1ZSkpIHtcclxuICAgICAgbGV0IHZhbHM6IHN0cmluZ1tdID0gY29tbWFTZXBhcmF0ZWRWYWx1ZS5zcGxpdCgnLCcpO1xyXG4gICAgICBpbnRBcnJheSA9IG5ldyBBcnJheTxudW1iZXI+KHZhbHMubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCBvdXRJbnQ6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW0oMCk7XHJcbiAgICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCB2YWxzLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgICAgbGV0IF9yID0gTk51bWJlci5UcnlQYXJzZSh2YWxzW2lDdHJdLCBvdXRJbnQpO1xyXG4gICAgICAgIGludEFycmF5W2lDdHJdID0gb3V0SW50LnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGludEFycmF5O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIElzV2ViVXJsKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xyXG4gIH1cclxufVxyXG4iXX0=