UNPKG

ice-utilities

Version:

Utilities for manage arrays, breadcrumb, dom elements, dates, injectors, local storage, login, objects, router animations, router, session storage, strings and translate utilities, encryption, for angular 6+ with ECMAScript 6 - ECMAScript 2015

2,765 lines 221 kB
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('simple-crypto-js/src/SimpleCrypto'), require('devextreme/ui/notify'), require('@angular/router'), require('@angular/core'), require('@angular/animations')) :
    typeof define === 'function' && define.amd ? define('ice-utilities', ['exports', 'simple-crypto-js/src/SimpleCrypto', 'devextreme/ui/notify', '@angular/router', '@angular/core', '@angular/animations'], factory) :
    (factory((global['ice-utilities'] = {}),global.SimpleCrypto,global.notify,global.ng.router,global.ng.core,global.ng.animations));
}(this, (function (exports,SimpleCrypto,notify,router,core,animations) { 'use strict';

    SimpleCrypto = SimpleCrypto && SimpleCrypto.hasOwnProperty('default') ? SimpleCrypto['default'] : SimpleCrypto;
    notify = notify && notify.hasOwnProperty('default') ? notify['default'] : notify;

    /*! *****************************************************************************
    Copyright (c) Microsoft Corporation. All rights reserved.
    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
    this file except in compliance with the License. You may obtain a copy of the
    License at http://www.apache.org/licenses/LICENSE-2.0

    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
    MERCHANTABLITY OR NON-INFRINGEMENT.

    See the Apache Version 2.0 License for specific language governing permissions
    and limitations under the License.
    ***************************************************************************** */
    var __assign = function () {
        __assign = Object.assign || function __assign(t) {
            for (var s, i = 1, n = arguments.length; i < n; i++) {
                s = arguments[i];
                for (var p in s)
                    if (Object.prototype.hasOwnProperty.call(s, p))
                        t[p] = s[p];
            }
            return t;
        };
        return __assign.apply(this, arguments);
    };
    function __values(o) {
        var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
        if (m)
            return m.call(o);
        return {
            next: function () {
                if (o && i >= o.length)
                    o = void 0;
                return { value: o && o[i++], done: !o };
            }
        };
    }
    function __read(o, n) {
        var m = typeof Symbol === "function" && o[Symbol.iterator];
        if (!m)
            return o;
        var i = m.call(o), r, ar = [], e;
        try {
            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
                ar.push(r.value);
        }
        catch (error) {
            e = { error: error };
        }
        finally {
            try {
                if (r && !r.done && (m = i["return"]))
                    m.call(i);
            }
            finally {
                if (e)
                    throw e.error;
            }
        }
        return ar;
    }
    function __spread() {
        for (var ar = [], i = 0; i < arguments.length; i++)
            ar = ar.concat(__read(arguments[i]));
        return ar;
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    ObjectUtils = /** @class */ (function () {
        function ObjectUtils() {
        }
        /**
         * @param {?} obj
         * @return {?}
         */
        ObjectUtils.isObject = /**
         * @param {?} obj
         * @return {?}
         */
            function (obj) {
                return (typeof obj === 'object');
            };
        /**
         * @param {?} obj
         * @return {?}
         */
        ObjectUtils.isEmpty = /**
         * @param {?} obj
         * @return {?}
         */
            function (obj) {
                return (this.isObject(obj) && (JSON.stringify(obj) === JSON.stringify({})));
            };
        /**
         * @param {?} obj
         * @return {?}
         */
        ObjectUtils.isEmptyCircular = /**
         * @param {?} obj
         * @return {?}
         */
            function (obj) {
                /** @type {?} */
                var isEmpty = true;
                Object.keys(obj).forEach(function (key) {
                    isEmpty = false;
                });
                return isEmpty;
            };
        /**
         * @param {?} myObject
         * @return {?}
         */
        ObjectUtils.copyNestedObject = /**
         * @param {?} myObject
         * @return {?}
         */
            function (myObject) {
                return __assign({}, myObject); // JSON.parse(JSON.stringify(myObject));
            };
        /**
         * @param {?} myObject
         * @return {?}
         */
        ObjectUtils.copyObject = /**
         * @param {?} myObject
         * @return {?}
         */
            function (myObject) {
                return this.copyNestedObject(myObject);
            };
        /**
         * @param {?} obj
         * @return {?}
         */
        ObjectUtils.objectToNum = /**
         * @param {?} obj
         * @return {?}
         */
            function (obj) {
                /** @type {?} */
                var newObj = {};
                Object.keys(obj).forEach(function (prop) {
                    newObj[prop] = +obj[prop];
                });
            };
        /**
         * @param {?=} obj1
         * @param {?=} obj2
         * @return {?}
         */
        ObjectUtils.merge = /**
         * @param {?=} obj1
         * @param {?=} obj2
         * @return {?}
         */
            function (obj1, obj2) {
                if (obj1 === void 0) {
                    obj1 = {};
                }
                if (obj2 === void 0) {
                    obj2 = {};
                }
                return __assign({}, obj1, obj2);
            };
        return ObjectUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    EncryptUtils = /** @class */ (function () {
        function EncryptUtils() {
        }
        /**
         * @param {?} key
         * @return {?}
         */
        EncryptUtils.setKey = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                if (key && key !== null && key.length > 0) {
                    this._key = key;
                    this._SimpleCrypto = new SimpleCrypto(this._key);
                }
            };
        /**
         * @return {?}
         */
        EncryptUtils.hasEncryption = /**
         * @return {?}
         */
            function () {
                return (this._key && this._key.length > 0 && this._SimpleCrypto);
            };
        /**
         * @param {?} data
         * @return {?}
         */
        EncryptUtils.encrypt = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                if (this.hasEncryption() && data && data !== null) {
                    return this._SimpleCrypto.encrypt(data);
                }
                else {
                    return '';
                }
            };
        /**
         * @param {?} ciphered
         * @return {?}
         */
        EncryptUtils.decrypt = /**
         * @param {?} ciphered
         * @return {?}
         */
            function (ciphered) {
                if (this.hasEncryption() && ciphered && ciphered !== null && ciphered.length > 0) {
                    /** @type {?} */
                    var val = this._SimpleCrypto.decrypt(ciphered);
                    try {
                        val = JSON.parse(val);
                    }
                    catch (e) { }
                    return val;
                }
                else {
                    return null;
                }
            };
        /**
         * @return {?}
         */
        EncryptUtils.generateKey = /**
         * @return {?}
         */
            function () {
                return SimpleCrypto.generateRandom();
            };
        return EncryptUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    SessionUtils = /** @class */ (function () {
        function SessionUtils() {
        }
        /**
         * @private
         * @param {?} key
         * @return {?}
         */
        SessionUtils.codeKey = /**
         * @private
         * @param {?} key
         * @return {?}
         */
            function (key) {
                return btoa(key.toUpperCase());
            };
        /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
        SessionUtils.setSession = /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
            function (key, value) {
                if (EncryptUtils.hasEncryption()) {
                    sessionStorage.setItem(this.codeKey(key), EncryptUtils.encrypt(value));
                }
                else {
                    /** @type {?} */
                    var val = void 0;
                    if (ObjectUtils.isObject(value)) {
                        val = JSON.stringify(value);
                    }
                    else {
                        val = value;
                    }
                    sessionStorage.setItem(key, val);
                }
            };
        /**
         * @param {?} key
         * @return {?}
         */
        SessionUtils.deleteSession = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                if (EncryptUtils.hasEncryption()) {
                    sessionStorage.removeItem(this.codeKey(key));
                }
                else {
                    sessionStorage.removeItem(key);
                }
            };
        /**
         * @param {?} key
         * @return {?}
         */
        SessionUtils.getSession = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                if (EncryptUtils.hasEncryption()) {
                    return EncryptUtils.decrypt(sessionStorage.getItem(this.codeKey(key)));
                }
                else {
                    /** @type {?} */
                    var val = sessionStorage.getItem(key);
                    try {
                        val = JSON.parse(val);
                    }
                    catch (e) { }
                    return val;
                }
            };
        return SessionUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * Created by ICEMANven on 22/08/2018.
     */
    /**
     *
     *  Base64 encode / decode
     *  http://www.webtoolkit.info/
     *
     **/
    var Base64 = /** @class */ (function () {
        function Base64() {
            this._keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
        }
        // public method for encoding
        // public method for encoding
        /**
         * @param {?} input
         * @return {?}
         */
        Base64.prototype.encode =
            // public method for encoding
            /**
             * @param {?} input
             * @return {?}
             */
            function (input) {
                /** @type {?} */
                var output = '';
                /** @type {?} */
                var chr1;
                /** @type {?} */
                var chr2;
                /** @type {?} */
                var chr3;
                /** @type {?} */
                var enc1;
                /** @type {?} */
                var enc2;
                /** @type {?} */
                var enc3;
                /** @type {?} */
                var enc4;
                /** @type {?} */
                var i = 0;
                input = this._utf8_encode(input);
                while (i < input.length) {
                    chr1 = input.charCodeAt(i++);
                    chr2 = input.charCodeAt(i++);
                    chr3 = input.charCodeAt(i++);
                    enc1 = chr1 >> 2;
                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    enc4 = chr3 & 63;
                    if (isNaN(chr2)) {
                        enc3 = enc4 = 64;
                    }
                    else if (isNaN(chr3)) {
                        enc4 = 64;
                    }
                    output = output +
                        this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
                        this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
                }
                return output;
            };
        // public method for decoding
        // public method for decoding
        /**
         * @param {?} input
         * @return {?}
         */
        Base64.prototype.decode =
            // public method for decoding
            /**
             * @param {?} input
             * @return {?}
             */
            function (input) {
                /** @type {?} */
                var output = '';
                /** @type {?} */
                var chr1;
                /** @type {?} */
                var chr2;
                /** @type {?} */
                var chr3;
                /** @type {?} */
                var enc1;
                /** @type {?} */
                var enc2;
                /** @type {?} */
                var enc3;
                /** @type {?} */
                var enc4;
                /** @type {?} */
                var i = 0;
                input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
                while (i < input.length) {
                    enc1 = this._keyStr.indexOf(input.charAt(i++));
                    enc2 = this._keyStr.indexOf(input.charAt(i++));
                    enc3 = this._keyStr.indexOf(input.charAt(i++));
                    enc4 = this._keyStr.indexOf(input.charAt(i++));
                    chr1 = (enc1 << 2) | (enc2 >> 4);
                    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                    chr3 = ((enc3 & 3) << 6) | enc4;
                    output = output + String.fromCharCode(chr1);
                    if (enc3 !== 64) {
                        output = output + String.fromCharCode(chr2);
                    }
                    if (enc4 !== 64) {
                        output = output + String.fromCharCode(chr3);
                    }
                }
                output = this._utf8_decode(output);
                // output = this._utf8_encode(output);
                return output;
            };
        // private method for UTF-8 encoding
        // private method for UTF-8 encoding
        /**
         * @param {?} string
         * @return {?}
         */
        Base64.prototype._utf8_encode =
            // private method for UTF-8 encoding
            /**
             * @param {?} string
             * @return {?}
             */
            function (string) {
                string = string.replace(/\r\n/g, '\n');
                /** @type {?} */
                var utftext = '';
                for (var n = 0; n < string.length; n++) {
                    /** @type {?} */
                    var c = string.charCodeAt(n);
                    if (c < 128) {
                        utftext += String.fromCharCode(c);
                    }
                    else if ((c > 127) && (c < 2048)) {
                        utftext += String.fromCharCode((c >> 6) | 192);
                        utftext += String.fromCharCode((c & 63) | 128);
                    }
                    else {
                        utftext += String.fromCharCode((c >> 12) | 224);
                        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                        utftext += String.fromCharCode((c & 63) | 128);
                    }
                }
                return utftext;
            };
        // private method for UTF-8 decoding
        // private method for UTF-8 decoding
        /**
         * @param {?} utftext
         * @return {?}
         */
        Base64.prototype._utf8_decode =
            // private method for UTF-8 decoding
            /**
             * @param {?} utftext
             * @return {?}
             */
            function (utftext) {
                /** @type {?} */
                var string = '';
                /** @type {?} */
                var i = 0;
                /** @type {?} */
                var c1;
                /** @type {?} */
                var c2;
                /** @type {?} */
                var c3;
                /** @type {?} */
                var c = c1 = c2 = 0;
                while (i < utftext.length) {
                    c = utftext.charCodeAt(i);
                    if (c < 128) {
                        string += String.fromCharCode(c);
                        i++;
                    }
                    else if ((c > 191) && (c < 224)) {
                        c2 = utftext.charCodeAt(i + 1);
                        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                        i += 2;
                    }
                    else {
                        c2 = utftext.charCodeAt(i + 1);
                        c3 = utftext.charCodeAt(i + 2);
                        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                        i += 3;
                    }
                }
                return string;
            };
        return Base64;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // Taken from https://github.com/killmenot/webtoolkit.md5
    /** @type {?} */
    var md5 = function (string) {
        /**
         * @param {?} lValue
         * @param {?} iShiftBits
         * @return {?}
         */
        function RotateLeft(lValue, iShiftBits) {
            return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
        }
        /**
         * @param {?} lX
         * @param {?} lY
         * @return {?}
         */
        function AddUnsigned(lX, lY) {
            /** @type {?} */
            var lX4;
            /** @type {?} */
            var lY4;
            /** @type {?} */
            var lX8;
            /** @type {?} */
            var lY8;
            /** @type {?} */
            var lResult;
            lX8 = (lX & 0x80000000);
            lY8 = (lY & 0x80000000);
            lX4 = (lX & 0x40000000);
            lY4 = (lY & 0x40000000);
            lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
            if (lX4 & lY4) {
                return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
            }
            if (lX4 | lY4) {
                if (lResult & 0x40000000) {
                    return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
                }
                else {
                    return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
                }
            }
            else {
                return (lResult ^ lX8 ^ lY8);
            }
        }
        /**
         * @param {?} x
         * @param {?} y
         * @param {?} z
         * @return {?}
         */
        function F(x, y, z) {
            return (x & y) | ((~x) & z);
        }
        /**
         * @param {?} x
         * @param {?} y
         * @param {?} z
         * @return {?}
         */
        function G(x, y, z) {
            return (x & z) | (y & (~z));
        }
        /**
         * @param {?} x
         * @param {?} y
         * @param {?} z
         * @return {?}
         */
        function H(x, y, z) {
            return (x ^ y ^ z);
        }
        /**
         * @param {?} x
         * @param {?} y
         * @param {?} z
         * @return {?}
         */
        function I(x, y, z) {
            return (y ^ (x | (~z)));
        }
        /**
         * @param {?} a
         * @param {?} b
         * @param {?} c
         * @param {?} d
         * @param {?} x
         * @param {?} s
         * @param {?} ac
         * @return {?}
         */
        function FF(a, b, c, d, x, s, ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        }
        /**
         * @param {?} a
         * @param {?} b
         * @param {?} c
         * @param {?} d
         * @param {?} x
         * @param {?} s
         * @param {?} ac
         * @return {?}
         */
        function GG(a, b, c, d, x, s, ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        }
        /**
         * @param {?} a
         * @param {?} b
         * @param {?} c
         * @param {?} d
         * @param {?} x
         * @param {?} s
         * @param {?} ac
         * @return {?}
         */
        function HH(a, b, c, d, x, s, ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        }
        /**
         * @param {?} a
         * @param {?} b
         * @param {?} c
         * @param {?} d
         * @param {?} x
         * @param {?} s
         * @param {?} ac
         * @return {?}
         */
        function II(a, b, c, d, x, s, ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        }
        /**
         * @param {?} string
         * @return {?}
         */
        function ConvertToWordArray(string) {
            /** @type {?} */
            var lWordCount;
            /** @type {?} */
            var lMessageLength = string.length;
            /** @type {?} */
            var lNumberOfWords_temp1 = lMessageLength + 8;
            /** @type {?} */
            var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
            /** @type {?} */
            var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
            /** @type {?} */
            var lWordArray = Array(lNumberOfWords - 1);
            /** @type {?} */
            var lBytePosition = 0;
            /** @type {?} */
            var lByteCount = 0;
            while (lByteCount < lMessageLength) {
                lWordCount = (lByteCount - (lByteCount % 4)) / 4;
                lBytePosition = (lByteCount % 4) * 8;
                lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
                lByteCount++;
            }
            lWordCount = (lByteCount - (lByteCount % 4)) / 4;
            lBytePosition = (lByteCount % 4) * 8;
            lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
            lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
            lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
            return lWordArray;
        }
        /**
         * @param {?} lValue
         * @return {?}
         */
        function WordToHex(lValue) {
            /** @type {?} */
            var WordToHexValue = "";
            /** @type {?} */
            var WordToHexValue_temp = "";
            /** @type {?} */
            var lByte;
            /** @type {?} */
            var lCount;
            for (lCount = 0; lCount <= 3; lCount++) {
                lByte = (lValue >>> (lCount * 8)) & 255;
                WordToHexValue_temp = "0" + lByte.toString(16);
                WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
            }
            return WordToHexValue;
        }
        /**
         * @param {?} string
         * @return {?}
         */
        function Utf8Encode(string) {
            string = string.replace(/\r\n/g, "\n");
            /** @type {?} */
            var utftext = "";
            for (var n = 0; n < string.length; n++) {
                /** @type {?} */
                var c = string.charCodeAt(n);
                if (c < 128) {
                    utftext += String.fromCharCode(c);
                }
                else if ((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
            }
            return utftext;
        }
        /** @type {?} */
        var x = Array();
        /** @type {?} */
        var k;
        /** @type {?} */
        var AA;
        /** @type {?} */
        var BB;
        /** @type {?} */
        var CC;
        /** @type {?} */
        var DD;
        /** @type {?} */
        var a;
        /** @type {?} */
        var b;
        /** @type {?} */
        var c;
        /** @type {?} */
        var d;
        /** @type {?} */
        var S11 = 7;
        /** @type {?} */
        var S12 = 12;
        /** @type {?} */
        var S13 = 17;
        /** @type {?} */
        var S14 = 22;
        /** @type {?} */
        var S21 = 5;
        /** @type {?} */
        var S22 = 9;
        /** @type {?} */
        var S23 = 14;
        /** @type {?} */
        var S24 = 20;
        /** @type {?} */
        var S31 = 4;
        /** @type {?} */
        var S32 = 11;
        /** @type {?} */
        var S33 = 16;
        /** @type {?} */
        var S34 = 23;
        /** @type {?} */
        var S41 = 6;
        /** @type {?} */
        var S42 = 10;
        /** @type {?} */
        var S43 = 15;
        /** @type {?} */
        var S44 = 21;
        string = Utf8Encode(string);
        x = ConvertToWordArray(string);
        a = 0x67452301;
        b = 0xEFCDAB89;
        c = 0x98BADCFE;
        d = 0x10325476;
        for (k = 0; k < x.length; k += 16) {
            AA = a;
            BB = b;
            CC = c;
            DD = d;
            a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
            d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
            c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
            b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
            a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
            d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
            c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
            b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
            a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
            d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
            c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
            b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
            a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
            d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
            c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
            b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
            a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
            d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
            c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
            b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
            a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
            d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
            c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
            b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
            a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
            d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
            c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
            b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
            a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
            d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
            c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
            b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
            a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
            d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
            c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
            b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
            a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
            d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
            c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
            b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
            a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
            d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
            c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
            b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
            a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
            d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
            c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
            b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
            a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
            d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
            c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
            b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
            a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
            d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
            c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
            b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
            a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
            d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
            c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
            b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
            a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
            d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
            c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
            b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
            a = AddUnsigned(a, AA);
            b = AddUnsigned(b, BB);
            c = AddUnsigned(c, CC);
            d = AddUnsigned(d, DD);
        }
        /** @type {?} */
        var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
        return temp.toLowerCase();
    };

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    StringUtils = /** @class */ (function () {
        function StringUtils() {
        }
        /**
         * @param {?} sanitizer
         * @return {?}
         */
        StringUtils.setSanitizerInstance = /**
         * @param {?} sanitizer
         * @return {?}
         */
            function (sanitizer) {
                if (!this.sanitizer && sanitizer) {
                    this.sanitizer = sanitizer;
                }
            };
        /**
         * @param {?} str
         * @param {?} find
         * @return {?}
         */
        StringUtils.includes = /**
         * @param {?} str
         * @param {?} find
         * @return {?}
         */
            function (str, find) {
                return str.includes(find);
            };
        /**
         * @param {?} str
         * @param {?} find
         * @return {?}
         */
        StringUtils.startsWith = /**
         * @param {?} str
         * @param {?} find
         * @return {?}
         */
            function (str, find) {
                return str.startsWith(find);
            };
        /**
         * @param {?} str
         * @param {?} find
         * @return {?}
         */
        StringUtils.endsWith = /**
         * @param {?} str
         * @param {?} find
         * @return {?}
         */
            function (str, find) {
                return str.endsWith(find);
            };
        /**
         * @param {?} val
         * @return {?}
         */
        StringUtils.isString = /**
         * @param {?} val
         * @return {?}
         */
            function (val) {
                return (typeof val === 'string' || val instanceof String);
            };
        /**
         * @param {?} text
         * @return {?}
         */
        StringUtils.removeAccents = /**
         * @param {?} text
         * @return {?}
         */
            function (text) {
                return text ? text.normalize('NFD').replace(/[\u0300-\u036f]/g, '') : '';
            };
        /**
         * @param {?} st
         * @return {?}
         */
        StringUtils.StringToNumber = /**
         * @param {?} st
         * @return {?}
         */
            function (st) {
                return parseInt(st, 10);
            };
        /**
         * @param {?} st
         * @return {?}
         */
        StringUtils.Utf8Encode = /**
         * @param {?} st
         * @return {?}
         */
            function (st) {
                // return this.b64._utf8_encode(st);
                // const sst = this.utf8.utf8decode(st);
                return st;
            };
        /**
         * @param {?} st
         * @return {?}
         */
        StringUtils.Utf8Decode = /**
         * @param {?} st
         * @return {?}
         */
            function (st) {
                // return this.b64._utf8_decode(st);
                // const sst = this.utf8.utf8decode(st);
                return st;
            };
        /**
         * @param {?} bb
         * @return {?}
         */
        StringUtils.base64Decode = /**
         * @param {?} bb
         * @return {?}
         */
            function (bb) {
                /** @type {?} */
                var b64 = new Base64();
                return b64.decode(bb);
            };
        /**
         * @param {?} text
         * @return {?}
         */
        StringUtils.isEmpty = /**
         * @param {?} text
         * @return {?}
         */
            function (text) {
                return (text === '');
            };
        /**
         * @param {?} text
         * @return {?}
         */
        StringUtils.bypassSecurityTrustUrl = /**
         * @param {?} text
         * @return {?}
         */
            function (text) {
                return this.sanitizer.bypassSecurityTrustUrl(text);
            };
        /**
         * @param {?} text
         * @return {?}
         */
        StringUtils.toMd5 = /**
         * @param {?} text
         * @return {?}
         */
            function (text) {
                return md5(text);
            };
        return StringUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    TranslateUtils = /** @class */ (function () {
        function TranslateUtils() {
        }
        /**
         * @param {?} translateService
         * @return {?}
         */
        TranslateUtils.setTranlateInstance = /**
         * @param {?} translateService
         * @return {?}
         */
            function (translateService) {
                if (!this.translateService && translateService) {
                    this.translateService = translateService;
                }
            };
        /**
         * @param {?} text
         * @return {?}
         */
        TranslateUtils.Translate = /**
         * @param {?} text
         * @return {?}
         */
            function (text) {
                if (this.translateService) {
                    /** @type {?} */
                    var translation_1 = '';
                    this.translateService.get(text).subscribe(function (trans) {
                        translation_1 = trans;
                    });
                    return translation_1;
                }
                else {
                    return text;
                }
            };
        return TranslateUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var GlobalUtils = /** @class */ (function () {
        function GlobalUtils() {
        }
        /**
         * @param {?} responsiveWidth
         * @return {?}
         */
        GlobalUtils.setResponsiveWidth = /**
         * @param {?} responsiveWidth
         * @return {?}
         */
            function (responsiveWidth) {
                if (!this.responsiveWidth && responsiveWidth) {
                    this.responsiveWidth = responsiveWidth;
                }
            };
        /**
         * @param {?} timeshow
         * @return {?}
         */
        GlobalUtils.setTimeShow = /**
         * @param {?} timeshow
         * @return {?}
         */
            function (timeshow) {
                if (!this.timeshow && timeshow) {
                    this.timeshow = timeshow;
                }
            };
        /**
         * @param {?} obj1
         * @param {?} obj2
         * @return {?}
         */
        GlobalUtils.areEquals = /**
         * @param {?} obj1
         * @param {?} obj2
         * @return {?}
         */
            function (obj1, obj2) {
                return JSON.stringify(obj1) === JSON.stringify(obj2);
            };
        /**
         * @param {?} data
         * @return {?}
         */
        GlobalUtils.isEmptyData = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                return (this.areEquals(data, '') || this.areEquals(data, 0) || data === null || this.areEquals(data, {}) || this.areEquals(data, []));
            };
        /**
         * @param {?} data
         * @return {?}
         */
        GlobalUtils.isUndefined = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                return typeof data === 'undefined';
            };
        /**
         * @param {?} name
         * @return {?}
         */
        GlobalUtils.setSysname = /**
         * @param {?} name
         * @return {?}
         */
            function (name) {
                SessionUtils.setSession('sysname', name);
            };
        /**
         * @return {?}
         */
        GlobalUtils.getSysname = /**
         * @return {?}
         */
            function () {
                return SessionUtils.getSession('sysname');
            };
        /**
         * @param {?} width
         * @param {?} actstt
         * @return {?}
         */
        GlobalUtils.autoFixSidebarState = /**
         * @param {?} width
         * @param {?} actstt
         * @return {?}
         */
            function (width, actstt) {
                if (width <= this.responsiveWidth) {
                    return 'inres';
                }
                else {
                    if (actstt === 'inres') {
                        return 'out';
                    }
                    else {
                        return actstt;
                    }
                }
            };
        /**
         * @param {?} stt
         * @param {?} width
         * @param {?} actstt
         * @param {?} responsiveWidth
         * @return {?}
         */
        GlobalUtils.fixsidebarState = /**
         * @param {?} stt
         * @param {?} width
         * @param {?} actstt
         * @param {?} responsiveWidth
         * @return {?}
         */
            function (stt, width, actstt, responsiveWidth) {
                if (width <= responsiveWidth) {
                    if (actstt === 'inres') {
                        return 'in';
                    }
                    else {
                        return 'inres';
                    }
                }
                else {
                    return stt;
                }
            };
        /**
         * @param {?} stt
         * @param {?} width
         * @param {?} responsiveWidth
         * @return {?}
         */
        GlobalUtils.fixContainerState = /**
         * @param {?} stt
         * @param {?} width
         * @param {?} responsiveWidth
         * @return {?}
         */
            function (stt, width, responsiveWidth) {
                if (width <= responsiveWidth) {
                    return 'inres';
                }
                else {
                    return stt;
                }
            };
        /**
         * @param {?} men
         * @param {?} data
         * @return {?}
         */
        GlobalUtils.successNotify = /**
         * @param {?} men
         * @param {?} data
         * @return {?}
         */
            function (men, data) {
                notify(TranslateUtils.Translate(men) + ' '
                    + JSON.stringify(data), 'success', this.timeshow);
            };
        /**
         * @param {?} error
         * @param {?} men
         * @param {?=} type
         * @return {?}
         */
        GlobalUtils.cathNotify = /**
         * @param {?} error
         * @param {?} men
         * @param {?=} type
         * @return {?}
         */
            function (error, men, type) {
                if (type === void 0) {
                    type = 'warning';
                }
                /** @type {?} */
                var tmen = TranslateUtils.Translate(men);
                this.notifyError(tmen, error, type);
            };
        /**
         * @private
         * @param {?} tmen
         * @param {?} error
         * @param {?} type
         * @return {?}
         */
        GlobalUtils.notifyError = /**
         * @private
         * @param {?} tmen
         * @param {?} error
         * @param {?} type
         * @return {?}
         */
            function (tmen, error, type) {
                notify(tmen + " :" + this.errorCath(error), type, this.timeshow);
                if (type === 'error') {
                    throw new Error(tmen);
                }
            };
        /**
         * @param {?} error
         * @param {?} men
         * @param {?} extraMen
         * @param {?=} type
         * @return {?}
         */
        GlobalUtils.cathNotifyExtraMen = /**
         * @param {?} error
         * @param {?} men
         * @param {?} extraMen
         * @param {?=} type
         * @return {?}
         */
            function (error, men, extraMen, type) {
                if (type === void 0) {
                    type = 'warning';
                }
                /** @type {?} */
                var tmen = TranslateUtils.Translate(men) + " " + extraMen;
                this.notifyError(tmen, error, type);
            };
        /**
         * @param {?} error
         * @return {?}
         */
        GlobalUtils.errorCath = /**
         * @param {?} error
         * @return {?}
         */
            function (error) {
                /** @type {?} */
                var errorMen = '';
                if (StringUtils.isString(error)) {
                    errorMen = error;
                }
                else if (ObjectUtils.isObject(error)) {
                    if (error.error) {
                        if (StringUtils.isString(error.error)) {
                            errorMen = error.error;
                        }
                        else if (ObjectUtils.isObject(error.error) && error.error.ResponseStatus) {
                            if (error.error.ResponseStatus.Message) {
                                errorMen = error.error.ResponseStatus.Message;
                            }
                            else if (error.error.ResponseStatus.ErrorCode) {
                                errorMen = error.error.ResponseStatus.ErrorCode;
                            }
                        }
                        else if (StringUtils.isString(error.message)) {
                            errorMen = error.message;
                        }
                    }
                    else {
                        if (error.message) {
                            errorMen = error.message;
                        }
                        else if (error.statusText) {
                            errorMen = error.statusText;
                        }
                    }
                }
                return TranslateUtils.Translate(errorMen);
            };
        /**
         * @return {?}
         */
        GlobalUtils.getNativeWindow = /**
         * @return {?}
         */
            function () {
                return window;
            };
        /**
         * @param {?} url
         * @param {?=} config
         * @return {?}
         */
        GlobalUtils.openWindow = /**
         * @param {?} url
         * @param {?=} config
         * @return {?}
         */
            function (url, config) {
                return window.open(url, '', 'location=no,width=1800,height=900,scrollbars=yes,top=100,left=700,resizable = no');
            };
        /**
         * @param {?=} whm
         * @return {?}
         */
        GlobalUtils.setWithHeight = /**
         * @param {?=} whm
         * @return {?}
         */
            function (whm) {
                if (whm && whm.fullScreen) {
                    return {
                        fullscreen: 1,
                    };
                }
                /** @type {?} */
                var mm = 1.5;
                if (whm && whm.Media) {
                    mm = whm.Media;
                }
                /** @type {?} */
                var val = {
                    width: window.innerWidth / mm,
                    height: window.innerHeight / mm
                };
                if (whm && whm.hasOwnProperty('width')) {
                    val.width = whm.width;
                }
                if (whm && whm.hasOwnProperty('height')) {
                    val.height = whm.height;
                }
                return val;
            };
        GlobalUtils.responsiveWidth = 960;
        GlobalUtils.timeshow = 8000;
        return GlobalUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    ArrayUtils = /** @class */ (function () {
        function ArrayUtils() {
        }
        /**
         * @param {?} array
         * @param {?} find
         * @return {?}
         */
        ArrayUtils.inArray = /**
         * @param {?} array
         * @param {?} find
         * @return {?}
         */
            function (array, find) {
                return array.includes(find);
            };
        /**
         * @param {?} array
         * @param {?} find
         * @return {?}
         */
        ArrayUtils.notInArray = /**
         * @param {?} array
         * @param {?} find
         * @return {?}
         */
            function (array, find) {
                return (!this.inArray(array, find));
            };
        /**
         * @param {?} arr
         * @param {?} obj
         * @return {?}
         */
        ArrayUtils.objectInArray = /**
         * @param {?} arr
         * @param {?} obj
         * @return {?}
         */
            function (arr, obj) {
                return (arr.find(function (oo) { return GlobalUtils.areEquals(oo, obj); }));
            };
        /**
         * @param {?} arr
         * @param {?} obj
         * @return {?}
         */
        ArrayUtils.objectNotInArray = /**
         * @param {?} arr
         * @param {?} obj
         * @return {?}
         */
            function (arr, obj) {
                return !this.objectInArray(arr, obj);
            };
        /**
         * @param {?} arr
         * @param {?} prop
         * @param {?} value
         * @return {?}
         */
        ArrayUtils.objectPropInArray = /**
         * @param {?} arr
         * @param {?} prop
         * @param {?} value
         * @return {?}
         */
            function (arr, prop, value) {
                return (arr.find(function (oo) { return GlobalUtils.areEquals(oo[prop], value); }));
            };
        /**
         * @param {?} arr
         * @param {?} prop
         * @param {?} value
         * @return {?}
         */
        ArrayUtils.objectNotPropInArray = /**
         * @param {?} arr
         * @param {?} prop
         * @param {?} value
         * @return {?}
         */
            function (arr, prop, value) {
                return (!this.objectPropInArray(arr, prop, value));
            };
        /**
         * @param {?} arr
         * @return {?}
         */
        ArrayUtils.cloneArray = /**
         * @param {?} arr
         * @return {?}
         */
            function (arr) {
                return __spread(arr);
            };
        /**
         * @param {?} arr
         * @param {?} ind
         * @return {?}
         */
        ArrayUtils.removeFromArray = /**
         * @param {?} arr
         * @param {?} ind
         * @return {?}
         */
            function (arr, ind) {
                arr.splice(ind, 1);
                return arr;
            };
        /**
         * @param {?} arr1
         * @param {?} arr2
         * @return {?}
         */
        ArrayUtils.arrayMerge = /**
         * @param {?} arr1
         * @param {?} arr2
         * @return {?}
         */
            function (arr1, arr2) {
                return __spread(arr1, arr2);
            };
        return ArrayUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    FechasUtils = /** @class */ (function () {
        function FechasUtils() {
        }
        /**
         * @param {?} DateOri
         * @param {?=} RemoveHour
         * @return {?}
         */
        FechasUtils.toDate = /**
         * @param {?} DateOri
         * @param {?=} RemoveHour
         * @return {?}
         */
            function (DateOri, RemoveHour) {
                /** @type {?} */
                var DateObj = DateOri;
                if (DateOri) {
                    try {
                        /** @type {?} */
                        var isDate = (typeof DateObj.getMonth === 'function');
                        if (!isDate) {
                            /** @type {?} */
                            var part = DateObj.split('.');
                            DateObj = Date.parse(part[0]);
                        }
                        if (RemoveHour) {
                            DateObj.setHours(0, 0, 0, 0);
                        }
                        return DateObj;
                    }
                    catch (e) {
                    }
                }
                return null;
            };
        /**
         * @param {?} time
         * @return {?}
         */
        FechasUtils.unsetTimeZero = /**
         * @param {?} time
         * @return {?}
         */
            function (time) {
                return time ? time.replace(/0001-01-01T00:00:00\.0000000/, '') : '';
            };
        /**
         * @param {?} set
         * @return {?}
         */
        FechasUtils.unsetAnytimeZero = /**
         * @param {?} set
         * @return {?}
         */
            function (set) {
                var _this = this;
                Object.keys(set).forEach(function (prop) {
                    if (set[prop] === '0001-01-01T00:00:00.0000000') {
                        set[prop] = _this.unsetTimeZero(set[prop]);
                    }
                });
                return set;
            };
        /**
         * @param {?} set
         * @return {?}
         */
        FechasUtils.unsetArrayTimeZero = /**
         * @param {?} set
         * @return {?}
         */
            function (set) {
                var e_1, _a;
                /** @type {?} */
                var final = [];
                try {
                    for (var set_1 = __values(set), set_1_1 = set_1.next(); !set_1_1.done; set_1_1 = set_1.next()) {
                        var s = set_1_1.value;
                        s = this.unsetAnytimeZero(s);
                        final.push(s);
                    }
                }
                catch (e_1_1) {
                    e_1 = { error: e_1_1 };
                }
                finally {
                    try {
                        if (set_1_1 && !set_1_1.done && (_a = set_1.return))
                            _a.call(set_1);
                    }
                    finally {
                        if (e_1)
                            throw e_1.error;
                    }
                }
                return final;
            };
        /**
         * @param {?} date
         * @return {?}
         */
        FechasUtils.isWeekend = /**
         * @param {?} date
         * @return {?}
         */
            function (date) {
                /** @type {?} */
                var day = date.getDay();
                return day === 0 || day === 6;
            };
        /**
         * @param {?} date
         * @return {?}
         */
        FechasUtils.isToday = /**
         * @param {?} date
         * @return {?}
         */
            function (date) {
                /** @type {?} */
                var today = new Date;
                return (date === today);
            };
        return FechasUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    LocalStorageUtils = /** @class */ (function () {
        function LocalStorageUtils() {
        }
        /**
         * @private
         * @param {?} key
         * @return {?}
         */
        LocalStorageUtils.codeKey = /**
         * @private
         * @param {?} key
         * @return {?}
         */
            function (key) {
                return btoa(key.toUpperCase());
            };
        /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
        LocalStorageUtils.setStorage = /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
            function (key, value) {
                if (EncryptUtils.hasEncryption()) {
                    localStorage.setItem(this.codeKey(key), EncryptUtils.encrypt(value));
                }
                else {
                    /** @type {?} */
                    var val = void 0;
                    if (ObjectUtils.isObject(value)) {
                        val = JSON.stringify(value);
                    }
                    else {
                        val = value;
                    }
                    localStorage.setItem(key, val);
                }
            };
        /**
         * @param {?} key
         * @return {?}
         */
        LocalStorageUtils.deleteStorage = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                if (EncryptUtils.hasEncryption()) {
                    localStorage.removeItem(this.codeKey(key));
                }
                else {
                    localStorage.removeItem(key);
                }
            };
        /**
         * @param {?} key
         * @return {?}
         */
        LocalStorageUtils.getstorage = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                if (EncryptUtils.hasEncryption()) {
                    return EncryptUtils.decrypt(localStorage.getItem(this.codeKey(key)));
                }
                else {
                    /** @type {?} */
                    var val = localStorage.getItem(key);
                    try {
                        val = JSON.parse(val);
                    }
                    catch (e) { }
                    return val;
                }
            };
        return LocalStorageUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    LoginUtils = /** @class */ (function () {
        function LoginUtils() {
        }
        /**
         * @private
         * @return {?}
         */
        LoginUtils.LoginKey = /**
         * @private
         * @return {?}
         */
            function () {
                if (EncryptUtils.hasEncryption()) {
                    return btoa(EncryptUtils.encrypt(this.getCurrentUser()));
                }
                else {
                    return btoa(JSON.stringify(this.getCurrentUser()));
                }
            };
        /**
         * @return {?}
         */
        LoginUtils.isLoggedin = /**
         * @return {?}
         */
            function () {
                /** @type {?} */
                var key;
                if (EncryptUtils.hasEncryption()) {
                    key = EncryptUtils.decrypt(atob(SessionUtils.getSession('isLoggedin')));
                    return GlobalUtils.areEquals(key, this.getCurrentUser());
                }
                else {
                    /** @type {?} */
                    var log = SessionUtils.getSession('isLoggedin');
                    if (log === null) {
                        return false;
                    }
                    key = atob(log);
                    return GlobalUtils.areEquals(JSON.parse(key), this.getCurrentUser());
                }
            };
        /**
         * @return {?}
         */
        LoginUtils.setLoggedin = /**
         * @return {?}
         */
            function () {
                SessionUtils.setSession('isLoggedin', this.LoginKey());
            };
        /**
         * @return {?}
         */
        LoginUtils.logOff = /**
         * @return {?}
         */
            function () {
                sessionStorage.clear();
            };
        /**
         * @param {?} err
         * @return {?}
         */
        LoginUtils.logFail = /**
         * @param {?} err
         * @return {?}
         */
            function (err) {
                this.logOff();
                /** @type {?} */
                var men = TranslateUtils.Translate(err.statusText);
                notify(men, 'error', 5000);
            };
        /**
         * @param {?} value
         * @return {?}
         */
        LoginUtils.setCurrentUser = /**
         * @param {?} value
         * @return {?}
         */
            function (value) {
                SessionUtils.setSession('currentUser', value);
            };
        /**
         * @return {?}
         */
        LoginUtils.getCurrentUser = /**
         * @return {?}
         */
            function () {
                return SessionUtils.getSession('currentUser');
            };
        /**
         * @param {?} empresas
         * @return {?}
         */
        LoginUtils.setEmpresasUser = /**
         * @param {?} empresas
         * @return {?}
         */
            function (empresas) {
                SessionUtils.setSession('empresasUser', empresas);
            };
        /**
         * @return {?}
         */
        LoginUtils.getEmpresasUser = /**
         * @return {?}
         */
            function () {
                return SessionUtils.getSession('empresasUser');
            };
        /**
         * @return {?}
         */
        LoginUtils.getEmresaIdProd = /**
         * @return {?}
         */
            function () {
                var IDEmpresaProd = this.getCurrentUser().IDEmpresaProd;
                return IDEmpresaProd;
            };
        /**
         * @param {?} id
         * @param {?=} nombre
         * @return {?}
         */
        LoginUtils.setEmpresaCode = /**
         * @param {?} id
         * @param {?=} nombre
         * @return {?}
         */
            function (id, nombre) {
                /** @type {?} */
                var crr = this.getCurrentUser();
                crr.CompanyCode = id;
                if (nombre) {
                    crr.CompanyName = nombre;
                }
                this.setCurrentUser(crr);
            };
        /**
         * @return {?}
         */
        LoginUtils.getEmpresaCode = /**
         * @return {?}
         */
            function () {
                var CompanyCode = this.getCurrentUser().CompanyCode;
                return CompanyCode;
            };
        return LoginUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var RouterUtils = /** @class */ (function () {
        function RouterUtils() {
        }
        /**
         * @param {?=} router
         * @return {?}
         */
        RouterUtils.setRouterInstance = /**
         * @param {?=} router
         * @return {?}
         */
            function (router$$1) {
                if (!this.router && router$$1) {
                    this.router = router$$1;
                }
            };
        /**
         * @param {?} dir
         * @return {?}
         */
        RouterUtils.setStaticDir = /**
         * @param {?} dir
         * @return {?}
         */
            function (dir) {
                if (!this.staticDir && dir) {
                    this.staticDir = "/" + dir + "/";
                    this.staticDirR = "/" + dir + "R/";
                }
            };
        /**
         * @param {?} dir
         * @return {?}
         */
        RouterUtils.setDynamicDir = /**
         * @param {?} dir
         * @return {?}
         */
            function (dir) {
                if (!this.dynamicDir && dir) {
                    this.dynamicDir = "/" + dir + "/";
                    this.dynamicDirR = "/" + dir + "R/";
                }
            };
        /**
         * @param {?} dir
         * @return {?}
         */
        RouterUtils.setNotAllowedDir = /**
         * @param {?} dir
         * @return {?}
         */
            function (dir) {
                if (!this.notAllowed && dir) {
                    this.notAllowed = dir;
                }
            };
        /**
         * @param {?} dir
         * @return {?}
         */
        RouterUtils.setListDir = /**
         * @param {?} dir
         * @return {?}
         */
            function (dir) {
                if (!this.listDir && dir) {
                    this.listDir = dir;
                }
            };
        /**
         * @param {?} modulo
         * @param {?} tipo
         * @param {?=} end
         * @return {?}
         */
        RouterUtils.getRerouteUrl = /**
         * @param {?} modulo
         * @param {?} tipo
         * @param {?=} end
         * @return {?}
         */
            function (modulo, tipo, end) {
                if (this.router) {
                    /** @type {?} */
                    var url = void 0;
                    /** @type {?} */
                    var mod = modulo.toUpperCase();
                    /** @type {?} */
                    var tt = tipo.toUpperCase();
                    /** @type {?} */
                    var urlroute = this.router.url;
                    if (StringUtils.includes(urlroute, "/" + mod + "/")) {
                        url = "/" + mod + "R/" + tt + "/";
                    }
                    else if (StringUtils.includes(urlroute, "/" + mod + "R/")) {
                        url = "/" + mod + "/" + tt + "/";
                    }
                    if (end) {
                        url += end.toString();
                    }
                    return url;
                }
                else {
                    return '/';
                }
            };
        /**
         * @param {?} mod
         * @param {?} id
         * @return {?}
         */
        RouterUtils.setDinamicDirUrl = /**
         * @param {?} mod
         * @param {?} id
         * @return {?}
         */
            function (mod, id) {
                return "" + this.dynamicDir + mod.toUpperCase() + "/" + id.toString();
            };
        /**
         * @param {?} sys
         * @param {?} mod
         * @return {?}
         */
        RouterUtils.setCustomDirUrl = /**
         * @param {?} sys
         * @param {?} mod
         * @return {?}
         */
            function (sys, mod) {
                return "" + this.staticDir + sys + "/" + mod;
            };
        /**
         * @param {?=} extra
         * @return {?}
         */
        RouterUtils.evalPerm = /**
         * @param {?=} extra
         * @return {?}
         */
            function (extra) {
                if (this.router) {
                    /** @type {?} */
                    var url = this.router.url;
                    /** @type {?} */
                    var sinDrouter = url.split('(');
                    url = sinDrouter[0];
                    if (StringUtils.includes(url, ';')) {
                        /** @type {?} */
                        var surl = url.split(';');
                        url = surl[0];
                    }
                    if (extra) {
                        url = url.replace(extra, '');
                    }
                    if (StringUtils.includes(url, this.dynamicDirR)) {
                        url = url.replace(this.dynamicDirR, this.dynamicDir);
                    }
                    else if (StringUtils.includes(url, this.staticDirR)) {
                        url = url.replace(this.staticDirR, this.staticDir);
                    }
                    if ((StringUtils.includes(url, this.dynamicDir)
                        || StringUtils.includes(url, this.staticDirR)
                        || StringUtils.includes(url, this.staticDir)
                        || StringUtils.includes(url, this.staticDirR))
                        &&
                            this.urlNotAllowed(url)) {
                        this.router.navigate([this.notAllowed]);
                    }
                }
                else {
                    this.router.navigate([this.notAllowed]);
                }
            };
        /**
         * @param {?} route
         * @param {?=} params
         * @param {?=} lista
         * @return {?}
         */
        RouterUtils.getSegmentsRoute = /**
         * @param {?} route
         * @param {?=} params
         * @param {?=} lista
         * @return {?}
         */
            function (route, params, lista) {
                if (params === void 0) {
                    params = {};
                }
                if (lista === void 0) {
                    lista = false;
                }
                /** @type {?} */
                var tree = this.router.parseUrl(route);
                /** @type {?} */
                var g = tree.root.children[router.PRIMARY_OUTLET];
                /** @type {?} */
                var s = g.segments;
                /** @type {?} */
                var final = s.map(function (p) {
                    return p.path;
                });
                if (lista) {
                    return __spread(final, [this.listDir], [params]);
                }
                else {
                    return __spread(final, [params]);
                }
            };
        /**
         * @param {?} route
         * @param {?} id
         * @param {?=} params
         * @param {?=} lista
         * @return {?}
         */
        RouterUtils.getSegmentsRouteId = /**
         * @param {?} route
         * @param {?} id
         * @param {?=} params
         * @param {?=} lista
         * @return {?}
         */
            function (route, id, params, lista) {
                if (params === void 0) {
                    params = {};
                }
                if (lista === void 0) {
                    lista = false;
                }
                /** @type {?} */
                var tree = this.router.parseUrl(route);
                /** @type {?} */
                var g = tree.root.children[router.PRIMARY_OUTLET];
                /** @type {?} */
                var s = g.segments;
                /** @type {?} */
                var final = s.map(function (p) {
                    return p.path;
                });
                if (lista) {
                    return __spread(final, [id.toString()], ['Lista'], [params]);
                }
                else {
                    return __spread(final, [id.toString()], [params]);
                }
            };
        /**
         * @param {?} men
         * @return {?}
         */
        RouterUtils.setNotAllowMen = /**
         * @param {?} men
         * @return {?}
         */
            function (men) {
                SessionUtils.setSession('notallowedmen', men);
            };
        /**
         * @param {?} menset
         * @return {?}
         */
        RouterUtils.getNotAllowMen = /**
         * @param {?} menset
         * @return {?}
         */
            function (menset) {
                /** @type {?} */
                var men = SessionUtils.getSession('notallowedmen');
                if (men !== null) {
                    SessionUtils.deleteSession('notallowedmen');
                }
                else {
                    men = menset;
                }
                return TranslateUtils.Translate(men);
            };
        /**
         * @param {?} url
         * @return {?}
         */
        RouterUtils.setAllowedUrl = /**
         * @param {?} url
         * @return {?}
         */
            function (url) {
                SessionUtils.setSession('allowedurl', url);
            };
        /**
         * @param {?} url
         * @return {?}
         */
        RouterUtils.urlNotAllowed = /**
         * @param {?} url
         * @return {?}
         */
            function (url) {
                /** @type {?} */
                var urlsAllowed = SessionUtils.getSession('allowedurl');
                /** @type {?} */
                var notA = true;
                if (urlsAllowed !== null) {
                    notA = ArrayUtils.notInArray(urlsAllowed, url);
                }
                return notA;
            };
        RouterUtils.dynamicDir = '';
        RouterUtils.staticDir = '';
        RouterUtils.dynamicDirR = '';
        RouterUtils.staticDirR = '';
        RouterUtils.notAllowed = '/';
        RouterUtils.listDir = 'list';
        return RouterUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    BreadCrumbUtils = /** @class */ (function () {
        function BreadCrumbUtils() {
        }
        /**
         * @return {?}
         */
        BreadCrumbUtils.getBreadCrumb = /**
         * @return {?}
         */
            function () {
                return SessionUtils.getSession('breadcrumb');
            };
        /**
         * @param {?} value
         * @param {?=} isDinamic
         * @return {?}
         */
        BreadCrumbUtils.setBreadCrumb = /**
         * @param {?} value
         * @param {?=} isDinamic
         * @return {?}
         */
            function (value, isDinamic) {
                if (!isDinamic) {
                    value = GlobalUtils.getSysname() + value;
                }
                SessionUtils.setSession('breadcrumb', value);
            };
        /**
         * @param {?} value
         * @return {?}
         */
        BreadCrumbUtils.getPrinModFromBreadCrumb = /**
         * @param {?} value
         * @return {?}
         */
            function (value) {
                /** @type {?} */
                var search = value.split(/\//);
                return search[1];
            };
        return BreadCrumbUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // @dynamic
    /**
     * @abstract
     */
    var 
    // @dynamic
    /**
     * @abstract
     */
    DomElementUtils = /** @class */ (function () {
        function DomElementUtils() {
        }
        /**
         * @param {?} element
         * @return {?}
         */
        DomElementUtils.getContainerElement = /**
         * @param {?} element
         * @return {?}
         */
            function (element) {
                return new Promise(function (resolve, reject) {
                    DomElementUtils.waitForContainerElement(element, resolve);
                });
            };
        /**
         * @param {?} className
         * @return {?}
         */
        DomElementUtils.getContainerClassElement = /**
         * @param {?} className
         * @return {?}
         */
            function (className) {
                return new Promise(function (resolve, reject) {
                    DomElementUtils.waitForContainerClassElement(className, resolve);
                });
            };
        /**
         * @private
         * @param {?} id
         * @param {?} resolve
         * @return {?}
         */
        DomElementUtils.waitForContainerElement = /**
         * @private
         * @param {?} id
         * @param {?} resolve
         * @return {?}
         */
            function (id, resolve) {
                /** @type {?} */
                var $configElement = document.getElementById(id);
                if (!$configElement || $configElement === null) {
                    setTimeout(DomElementUtils.waitForContainerElement.bind(this, id, resolve), 30);
                }
                else {
                    resolve($configElement);
                }
            };
        /**
         * @private
         * @param {?} className
         * @param {?} resolve
         * @return {?}
         */
        DomElementUtils.waitForContainerClassElement = /**
         * @private
         * @param {?} className
         * @param {?} resolve
         * @return {?}
         */
            function (className, resolve) {
                /** @type {?} */
                var $configElement = document.getElementsByClassName(className);
                if (!$configElement || $configElement === null) {
                    setTimeout(DomElementUtils.waitForContainerClassElement.bind(this, className, resolve), 30);
                }
                else {
                    resolve($configElement);
                }
            };
        return DomElementUtils;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @abstract
     */
    var IceUtilities = /** @class */ (function () {
        function IceUtilities() {
        }
        /**
         * @param {?} data
         * @return {?}
         */
        IceUtilities.iniIceUtilities = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                this.globals.setResponsiveWidth(data.responsiveWidth);
                this.globals.setTimeShow(data.timeshow);
                this.router.setRouterInstance(data.router);
                this.router.setDynamicDir(data.dynamicDir);
                this.router.setStaticDir(data.staticDir);
                this.router.setNotAllowedDir(data.notAllowed);
                this.router.setListDir(data.listDir);
                this.strings.setSanitizerInstance(data.sanitizer);
                this.translate.setTranlateInstance(data.translateService);
                this.encryption.setKey(data.encryptionKey);
            };
        IceUtilities.arrays = ArrayUtils;
        IceUtilities.breadCrumbs = BreadCrumbUtils;
        IceUtilities.domElements = DomElementUtils;
        IceUtilities.dates = FechasUtils;
        IceUtilities.globals = GlobalUtils;
        IceUtilities.localStorage = LocalStorageUtils;
        IceUtilities.login = LoginUtils;
        IceUtilities.objects = ObjectUtils;
        IceUtilities.router = RouterUtils;
        IceUtilities.session = SessionUtils;
        IceUtilities.strings = StringUtils;
        IceUtilities.translate = TranslateUtils;
        IceUtilities.encryption = EncryptUtils;
        return IceUtilities;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @param {?} provider
     * @return {?}
     */
    function InjectorUtils(provider) {
        /** @type {?} */
        var injector = core.Injector.create({ providers: [{ provide: provider, deps: [] }] });
        return injector.get(provider);
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @return {?}
     */
    function routerTransition() {
        return slideToLeft(); // slideToTop
    }
    /**
     * @return {?}
     */
    function LoginRouterTransition() {
        return slideToTop(); // slideToTop
    }
    /**
     * @param {?} name
     * @return {?}
     */
    function sidebarAnim(name) {
        animations.trigger('slideInOut', [
            animations.state('in', animations.style({
                transform: 'translate3d(20%, 0, 0)'
            })),
            animations.state('out', animations.style({
                transform: 'translate3d(100%, 0, 0)'
            })),
            animations.transition('in => out', animations.animate('400ms ease-in-out')),
            animations.transition('out => in', animations.animate('400ms ease-in-out'))
        ]);
    }
    /**
     * @return {?}
     */
    function slideToRight() {
        return animations.trigger('routerTransition', [
            animations.state('void', animations.style({})),
            animations.state('*', animations.style({})),
            animations.transition(':enter', [
                animations.style({ transform: 'translateX(-100%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateX(0%)' }))
            ]),
            animations.transition(':leave', [
                animations.style({ transform: 'translateX(0%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateX(100%)' }))
            ])
        ]);
    }
    /**
     * @return {?}
     */
    function slideToLeft() {
        return animations.trigger('routerTransition', [
            animations.state('void', animations.style({})),
            animations.state('*', animations.style({})),
            animations.transition(':enter', [
                animations.style({ transform: 'translateX(100%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateX(0%)' }))
            ]),
            animations.transition(':leave', [
                animations.style({ transform: 'translateX(0%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateX(-100%)' }))
            ])
        ]);
    }
    /**
     * @return {?}
     */
    function slideToBottom() {
        return animations.trigger('routerTransition', [
            animations.state('void', animations.style({})),
            animations.state('*', animations.style({})),
            animations.transition(':enter', [
                animations.style({ transform: 'translateY(-100%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateY(0%)' }))
            ]),
            animations.transition(':leave', [
                animations.style({ transform: 'translateY(0%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateY(100%)' }))
            ])
        ]);
    }
    /**
     * @return {?}
     */
    function slideToTop() {
        return animations.trigger('routerTransition', [
            animations.state('void', animations.style({})),
            animations.state('*', animations.style({})),
            animations.transition(':enter', [
                animations.style({ transform: 'translateY(100%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateY(0%)' }))
            ]),
            animations.transition(':leave', [
                animations.style({ transform: 'translateY(0%)' }),
                animations.animate('0.5s ease-in-out', animations.style({ transform: 'translateY(-100%)' }))
            ])
        ]);
    }
    /**
     * @return {?}
     */
    function slideInOutAnimationSideBar() {
        return animations.trigger('slideInOutAnimationSideBar', [
            // end state styles for route container (host)
            animations.state('in', animations.style({
                // the view covers the whole screen with a semi tranparent background
                left: 60,
                width: 60,
                marginLeft: -60,
            })),
            animations.state('out', animations.style({
                // the view covers the whole screen with a semi tranparent background
                left: 235,
                width: 235,
                marginLeft: -235,
            })),
            animations.transition('in => out', animations.animate('400ms ease-in-out')),
            animations.transition('out => in', animations.animate('400ms ease-in-out'))
        ]);
    }
    /** @type {?} */
    var slideInOutAnimationContent = animations.trigger('slideInOutAnimationContent', [
        // end state styles for route container (host)
        animations.state('in', animations.style({
            // the view covers the whole screen with a semi tranparent background
            left: 60,
            width: 60,
            marginLeft: -60,
        })),
        animations.state('out', animations.style({
            // the view covers the whole screen with a semi tranparent background
            left: 235,
            width: 235,
            marginLeft: -235,
        })),
        animations.transition('in => out', animations.animate('400ms ease-in-out')),
        animations.transition('out => in', animations.animate('400ms ease-in-out'))
    ]);
    /**
     * @return {?}
     */
    function fideInFadeOut() {
        return animations.trigger('simpleFadeAnimation', [
            // the "in" style determines the "resting" state of the element when it is visible.
            animations.state('in', animations.style({ opacity: 1 })),
            // fade in when created. this could also be written as transition('void => *')
            animations.transition(':enter', [
                animations.style({ opacity: 0 }),
                animations.animate(600)
            ]),
            // fade out when destroyed. this could also be written as transition('void => *')
            animations.transition(':leave', animations.animate(600, animations.style({ opacity: 0 })))
        ]);
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */

    exports.IceUtilities = IceUtilities;
    exports.InjectorUtils = InjectorUtils;
    exports.routerTransition = routerTransition;
    exports.LoginRouterTransition = LoginRouterTransition;
    exports.sidebarAnim = sidebarAnim;
    exports.slideToRight = slideToRight;
    exports.slideToLeft = slideToLeft;
    exports.slideToBottom = slideToBottom;
    exports.slideToTop = slideToTop;
    exports.slideInOutAnimationSideBar = slideInOutAnimationSideBar;
    exports.fideInFadeOut = fideInFadeOut;
    exports.slideInOutAnimationContent = slideInOutAnimationContent;

    Object.defineProperty(exports, '__esModule', { value: true });

})));

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlLXV0aWxpdGllcy51bWQuanMubWFwIiwic291cmNlcyI6WyJub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwibmc6Ly9pY2UtdXRpbGl0aWVzL2xpYi91dGlsaXRpZXMvb2JqZWN0VXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9lbmNyeXB0VXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9zZXNzaW9uVXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9iYXNlNjQudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9tZDUudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9zdHJpbmdVdGlscy50cyIsIm5nOi8vaWNlLXV0aWxpdGllcy9saWIvdXRpbGl0aWVzL3RyYW5zbGF0ZVV0aWxzLnRzIiwibmc6Ly9pY2UtdXRpbGl0aWVzL2xpYi91dGlsaXRpZXMvZ2xvYmFsVXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9hcnJheVV0aWxzLnRzIiwibmc6Ly9pY2UtdXRpbGl0aWVzL2xpYi91dGlsaXRpZXMvZmVjaGFzVXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9sb2NhbFN0b3JhZ2VVdGlscy50cyIsIm5nOi8vaWNlLXV0aWxpdGllcy9saWIvdXRpbGl0aWVzL2xvZ2luVXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9yb3V0ZXJVdGlscy50cyIsIm5nOi8vaWNlLXV0aWxpdGllcy9saWIvdXRpbGl0aWVzL2JyZWFkQ3J1bWJVdGlscy50cyIsIm5nOi8vaWNlLXV0aWxpdGllcy9saWIvdXRpbGl0aWVzL2RvbUVsZW1lbnRVdGlscy50cyIsIm5nOi8vaWNlLXV0aWxpdGllcy9saWIvaWNlLXV0aWxpdGllcy50cyIsIm5nOi8vaWNlLXV0aWxpdGllcy9saWIvdXRpbGl0aWVzL2luamVjdG9yVXRpbHMudHMiLCJuZzovL2ljZS11dGlsaXRpZXMvbGliL3V0aWxpdGllcy9yb3V0ZXIuYW5pbWF0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcbiIsIi8vIEBkeW5hbWljXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPYmplY3RVdGlscyB7XHJcbiAgc3RhdGljIGlzT2JqZWN0KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKTtcclxuICB9XHJcbiAgc3RhdGljIGlzRW1wdHkgKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuaXNPYmplY3Qob2JqKSAmJiAoSlNPTi5zdHJpbmdpZnkob2JqKSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBpc0VtcHR5Q2lyY3VsYXIgKG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNFbXB0eSA9IHRydWU7XHJcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgaXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaXNFbXB0eTtcclxuICB9XHJcbiAgc3RhdGljIGNvcHlOZXN0ZWRPYmplY3QgKG15T2JqZWN0OiBvYmplY3QpOiBhbnkge1xyXG4gICAgcmV0dXJuICB7Li4ubXlPYmplY3R9OyAvLyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG15T2JqZWN0KSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBjb3B5T2JqZWN0IChteU9iamVjdDogb2JqZWN0KToge30gJiBvYmplY3Qge1xyXG4gICAgcmV0dXJuICB0aGlzLmNvcHlOZXN0ZWRPYmplY3QobXlPYmplY3QpO1xyXG4gIH1cclxuICBzdGF0aWMgb2JqZWN0VG9OdW0gKG9iajogYW55KTogYW55IHtcclxuICAgIGNvbnN0IG5ld09iajogYW55ID0ge307XHJcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgIG5ld09ialtwcm9wXSA9ICtvYmpbcHJvcF07XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RhdGljIG1lcmdlKG9iajEgPSB7fSwgb2JqMiA9IHt9KTogb2JqZWN0IHtcclxuICAgIHJldHVybiB7Li4ub2JqMSwgLi4ub2JqMn07XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCBTaW1wbGVDcnlwdG8gZnJvbSAnc2ltcGxlLWNyeXB0by1qcy9zcmMvU2ltcGxlQ3J5cHRvJztcclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVuY3J5cHRVdGlscyB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2tleTogc3RyaW5nO1xyXG4gIHByaXZhdGUgc3RhdGljIF9TaW1wbGVDcnlwdG86IGFueTtcclxuICBzdGF0aWMgc2V0S2V5KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoa2V5ICYmIGtleSAhPT0gbnVsbCAmJiBrZXkubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9rZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuX1NpbXBsZUNyeXB0byA9IG5ldyBTaW1wbGVDcnlwdG8odGhpcy5fa2V5KTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIGhhc0VuY3J5cHRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuX2tleSAmJiB0aGlzLl9rZXkubGVuZ3RoID4gMCAmJiB0aGlzLl9TaW1wbGVDcnlwdG8pO1xyXG4gIH1cclxuICBzdGF0aWMgZW5jcnlwdChkYXRhOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaGFzRW5jcnlwdGlvbigpICYmIGRhdGEgJiYgZGF0YSAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fU2ltcGxlQ3J5cHRvLmVuY3J5cHQoZGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBkZWNyeXB0KGNpcGhlcmVkOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuaGFzRW5jcnlwdGlvbigpICYmIGNpcGhlcmVkICYmIGNpcGhlcmVkICE9PSBudWxsICYmIGNpcGhlcmVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IHZhbDogYW55ID0gdGhpcy5fU2ltcGxlQ3J5cHRvLmRlY3J5cHQoY2lwaGVyZWQpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhbCA9IEpTT04ucGFyc2UodmFsKTtcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgZ2VuZXJhdGVLZXkoKSB7XHJcbiAgICByZXR1cm4gU2ltcGxlQ3J5cHRvLmdlbmVyYXRlUmFuZG9tKCk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gJy4vb2JqZWN0VXRpbHMnO1xyXG5pbXBvcnQge0VuY3J5cHRVdGlsc30gZnJvbSAnLi9lbmNyeXB0VXRpbHMnO1xyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvblV0aWxzIHtcclxuICBwcml2YXRlIHN0YXRpYyBjb2RlS2V5KGtleTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gYnRvYShrZXkudG9VcHBlckNhc2UoKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBzZXRTZXNzaW9uKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoRW5jcnlwdFV0aWxzLmhhc0VuY3J5cHRpb24oKSkge1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuY29kZUtleShrZXkpLCBFbmNyeXB0VXRpbHMuZW5jcnlwdCh2YWx1ZSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHZhbDogYW55O1xyXG4gICAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QodmFsdWUpKSB7XHJcbiAgICAgICAgdmFsID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbCA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgZGVsZXRlU2Vzc2lvbihrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKEVuY3J5cHRVdGlscy5oYXNFbmNyeXB0aW9uKCkpIHtcclxuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmNvZGVLZXkoa2V5KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRTZXNzaW9uKGtleTogc3RyaW5nKTogYW55IHtcclxuICAgIGlmIChFbmNyeXB0VXRpbHMuaGFzRW5jcnlwdGlvbigpKSB7XHJcbiAgICAgIHJldHVybiBFbmNyeXB0VXRpbHMuZGVjcnlwdChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuY29kZUtleShrZXkpKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdmFsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhbCA9IEpTT04ucGFyc2UodmFsKTtcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiIsIi8qKlxuICogQ3JlYXRlZCBieSBJQ0VNQU52ZW4gb24gMjIvMDgvMjAxOC5cbiAqL1xuLyoqXG4gKlxuICogIEJhc2U2NCBlbmNvZGUgLyBkZWNvZGVcbiAqICBodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby9cbiAqXG4gKiovXG5cbmV4cG9ydCBjbGFzcyBCYXNlNjQge1xuXG4gIC8vIHByaXZhdGUgcHJvcGVydHlcbiAgX2tleVN0cjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLl9rZXlTdHIgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuICB9XG5cbiAgLy8gcHVibGljIG1ldGhvZCBmb3IgZW5jb2RpbmdcbiAgZW5jb2RlIChpbnB1dCk6IHN0cmluZyB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGxldCBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIGxldCBpID0gMDtcblxuICAgIGlucHV0ID0gdGhpcy5fdXRmOF9lbmNvZGUoaW5wdXQpO1xuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgY2hyMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgIGNocjIgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICBjaHIzID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuXG4gICAgICBlbmMxID0gY2hyMSA+PiAyO1xuICAgICAgZW5jMiA9ICgoY2hyMSAmIDMpIDw8IDQpIHwgKGNocjIgPj4gNCk7XG4gICAgICBlbmMzID0gKChjaHIyICYgMTUpIDw8IDIpIHwgKGNocjMgPj4gNik7XG4gICAgICBlbmM0ID0gY2hyMyAmIDYzO1xuXG4gICAgICBpZiAoaXNOYU4oY2hyMikpIHtcbiAgICAgICAgZW5jMyA9IGVuYzQgPSA2NDtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYU4oY2hyMykpIHtcbiAgICAgICAgZW5jNCA9IDY0O1xuICAgICAgfVxuXG4gICAgICBvdXRwdXQgPSBvdXRwdXQgK1xuICAgICAgICB0aGlzLl9rZXlTdHIuY2hhckF0KGVuYzEpICsgdGhpcy5fa2V5U3RyLmNoYXJBdChlbmMyKSArXG4gICAgICAgIHRoaXMuX2tleVN0ci5jaGFyQXQoZW5jMykgKyB0aGlzLl9rZXlTdHIuY2hhckF0KGVuYzQpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8vIHB1YmxpYyBtZXRob2QgZm9yIGRlY29kaW5nXG4gIGRlY29kZSAoaW5wdXQpOiBzdHJpbmcge1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgY2hyMSwgY2hyMiwgY2hyMztcbiAgICBsZXQgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcbiAgICBsZXQgaSA9IDA7XG5cbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLCAnJyk7XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuXG4gICAgICBlbmMxID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgZW5jMiA9IHRoaXMuX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgIGVuYzMgPSB0aGlzLl9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICBlbmM0ID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuXG4gICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgIGNocjIgPSAoKGVuYzIgJiAxNSkgPDwgNCkgfCAoZW5jMyA+PiAyKTtcbiAgICAgIGNocjMgPSAoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQ7XG5cbiAgICAgIG91dHB1dCA9IG91dHB1dCArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMSk7XG5cbiAgICAgIGlmIChlbmMzICE9PSA2NCkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjIpO1xuICAgICAgfVxuICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dCArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMyk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBvdXRwdXQgPSB0aGlzLl91dGY4X2RlY29kZShvdXRwdXQpO1xuICAgIC8vIG91dHB1dCA9IHRoaXMuX3V0ZjhfZW5jb2RlKG91dHB1dCk7XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuXG4gIH1cblxuICAvLyBwcml2YXRlIG1ldGhvZCBmb3IgVVRGLTggZW5jb2RpbmdcbiAgX3V0ZjhfZW5jb2RlIChzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICAgIGxldCB1dGZ0ZXh0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuXG4gICAgICBjb25zdCBjID0gc3RyaW5nLmNoYXJDb2RlQXQobik7XG5cbiAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgIH0gZWxzZSBpZiAoKGMgPiAxMjcpICYmIChjIDwgMjA0OCkpIHtcbiAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjID4+IDYpIHwgMTkyKTtcbiAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjID4+IDYpICYgNjMpIHwgMTI4KTtcbiAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB1dGZ0ZXh0O1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBtZXRob2QgZm9yIFVURi04IGRlY29kaW5nXG4gIF91dGY4X2RlY29kZSAodXRmdGV4dCk6IHN0cmluZyB7XG4gICAgbGV0IHN0cmluZyA9ICcnO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgYzEsIGMyLCBjMztcbiAgICBsZXQgYyA9IGMxID0gYzIgPSAwO1xuXG4gICAgd2hpbGUgKCBpIDwgdXRmdGV4dC5sZW5ndGggKSB7XG5cbiAgICAgIGMgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2UgaWYgKChjID4gMTkxKSAmJiAoYyA8IDIyNCkpIHtcbiAgICAgICAgYzIgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpO1xuICAgICAgICBpICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjMiA9IHV0ZnRleHQuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgIGMzID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkgKyAyKTtcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpO1xuICAgICAgICBpICs9IDM7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbn1cbiIsIi8vIFRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2tpbGxtZW5vdC93ZWJ0b29sa2l0Lm1kNVxuXG5leHBvcnQgbGV0IG1kNSA9IChzdHJpbmcpID0+IHtcblxuICBmdW5jdGlvbiBSb3RhdGVMZWZ0KGxWYWx1ZSwgaVNoaWZ0Qml0cyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChsVmFsdWUgPDwgaVNoaWZ0Qml0cykgfCAobFZhbHVlID4+PiAoMzIgLSBpU2hpZnRCaXRzKSk7XG4gIH1cblxuICBmdW5jdGlvbiBBZGRVbnNpZ25lZChsWCwgbFkpOiBudW1iZXIge1xuICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XG4gICAgbFg4ID0gKGxYICYgMHg4MDAwMDAwMCk7XG4gICAgbFk4ID0gKGxZICYgMHg4MDAwMDAwMCk7XG4gICAgbFg0ID0gKGxYICYgMHg0MDAwMDAwMCk7XG4gICAgbFk0ID0gKGxZICYgMHg0MDAwMDAwMCk7XG4gICAgbFJlc3VsdCA9IChsWCAmIDB4M0ZGRkZGRkYpICsgKGxZICYgMHgzRkZGRkZGRik7XG4gICAgaWYgKGxYNCAmIGxZNCkge1xuICAgICAgcmV0dXJuIChsUmVzdWx0IF4gMHg4MDAwMDAwMCBeIGxYOCBeIGxZOCk7XG4gICAgfVxuICAgIGlmIChsWDQgfCBsWTQpIHtcbiAgICAgIGlmIChsUmVzdWx0ICYgMHg0MDAwMDAwMCkge1xuICAgICAgICByZXR1cm4gKGxSZXN1bHQgXiAweEMwMDAwMDAwIF4gbFg4IF4gbFk4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAobFJlc3VsdCBeIDB4NDAwMDAwMDAgXiBsWDggXiBsWTgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKGxSZXN1bHQgXiBsWDggXiBsWTgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIEYoeCwgeSwgeikge1xuICAgIHJldHVybiAoeCAmIHkpIHwgKCh+eCkgJiB6KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEcoeCwgeSwgeikge1xuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEgoeCwgeSwgeikge1xuICAgIHJldHVybiAoeCBeIHkgXiB6KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEkoeCwgeSwgeikge1xuICAgIHJldHVybiAoeSBeICh4IHwgKH56KSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoRihiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgcmV0dXJuIEFkZFVuc2lnbmVkKFJvdGF0ZUxlZnQoYSwgcyksIGIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEdHKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7XG4gICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xuICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcbiAgfTtcblxuICBmdW5jdGlvbiBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xuICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBZGRVbnNpZ25lZChBZGRVbnNpZ25lZChIKGIsIGMsIGQpLCB4KSwgYWMpKTtcbiAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gIH07XG5cbiAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoSShiLCBjLCBkKSwgeCksIGFjKSk7XG4gICAgcmV0dXJuIEFkZFVuc2lnbmVkKFJvdGF0ZUxlZnQoYSwgcyksIGIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIENvbnZlcnRUb1dvcmRBcnJheShzdHJpbmcpIHtcbiAgICB2YXIgbFdvcmRDb3VudDtcbiAgICB2YXIgbE1lc3NhZ2VMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgIHZhciBsTnVtYmVyT2ZXb3Jkc190ZW1wMSA9IGxNZXNzYWdlTGVuZ3RoICsgODtcbiAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPSAobE51bWJlck9mV29yZHNfdGVtcDEgLSAobE51bWJlck9mV29yZHNfdGVtcDEgJSA2NCkpIC8gNjQ7XG4gICAgdmFyIGxOdW1iZXJPZldvcmRzID0gKGxOdW1iZXJPZldvcmRzX3RlbXAyICsgMSkgKiAxNjtcbiAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XG4gICAgdmFyIGxCeXRlUG9zaXRpb24gPSAwO1xuICAgIHZhciBsQnl0ZUNvdW50ID0gMDtcbiAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XG4gICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID0gKGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gfCAoc3RyaW5nLmNoYXJDb2RlQXQobEJ5dGVDb3VudCkgPDwgbEJ5dGVQb3NpdGlvbikpO1xuICAgICAgbEJ5dGVDb3VudCsrO1xuICAgIH1cbiAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgbEJ5dGVQb3NpdGlvbiA9IChsQnl0ZUNvdW50ICUgNCkgKiA4O1xuICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPSBsV29yZEFycmF5W2xXb3JkQ291bnRdIHwgKDB4ODAgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgbFdvcmRBcnJheVtsTnVtYmVyT2ZXb3JkcyAtIDJdID0gbE1lc3NhZ2VMZW5ndGggPDwgMztcbiAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMV0gPSBsTWVzc2FnZUxlbmd0aCA+Pj4gMjk7XG4gICAgcmV0dXJuIGxXb3JkQXJyYXk7XG4gIH07XG5cbiAgZnVuY3Rpb24gV29yZFRvSGV4KGxWYWx1ZSkge1xuICAgIHZhciBXb3JkVG9IZXhWYWx1ZSA9IFwiXCIsXG4gICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCJcIixcbiAgICAgIGxCeXRlLCBsQ291bnQ7XG4gICAgZm9yIChsQ291bnQgPSAwOyBsQ291bnQgPD0gMzsgbENvdW50KyspIHtcbiAgICAgIGxCeXRlID0gKGxWYWx1ZSA+Pj4gKGxDb3VudCAqIDgpKSAmIDI1NTtcbiAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIjBcIiArIGxCeXRlLnRvU3RyaW5nKDE2KTtcbiAgICAgIFdvcmRUb0hleFZhbHVlID0gV29yZFRvSGV4VmFsdWUgKyBXb3JkVG9IZXhWYWx1ZV90ZW1wLnN1YnN0cihXb3JkVG9IZXhWYWx1ZV90ZW1wLmxlbmd0aCAtIDIsIDIpO1xuICAgIH1cbiAgICByZXR1cm4gV29yZFRvSGV4VmFsdWU7XG4gIH07XG5cbiAgZnVuY3Rpb24gVXRmOEVuY29kZShzdHJpbmcpIHtcbiAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxyXFxuL2csIFwiXFxuXCIpO1xuICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7XG5cbiAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQobik7XG5cbiAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgIH0gZWxzZSBpZiAoKGMgPiAxMjcpICYmIChjIDwgMjA0OCkpIHtcbiAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjID4+IDYpIHwgMTkyKTtcbiAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjID4+IDYpICYgNjMpIHwgMTI4KTtcbiAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB1dGZ0ZXh0O1xuICB9O1xuXG4gIHZhciB4ID0gQXJyYXkoKTtcbiAgdmFyIGssIEFBLCBCQiwgQ0MsIERELCBhLCBiLCBjLCBkO1xuICB2YXIgUzExID0gNyxcbiAgICBTMTIgPSAxMixcbiAgICBTMTMgPSAxNyxcbiAgICBTMTQgPSAyMjtcbiAgdmFyIFMyMSA9IDUsXG4gICAgUzIyID0gOSxcbiAgICBTMjMgPSAxNCxcbiAgICBTMjQgPSAyMDtcbiAgdmFyIFMzMSA9IDQsXG4gICAgUzMyID0gMTEsXG4gICAgUzMzID0gMTYsXG4gICAgUzM0ID0gMjM7XG4gIHZhciBTNDEgPSA2LFxuICAgIFM0MiA9IDEwLFxuICAgIFM0MyA9IDE1LFxuICAgIFM0NCA9IDIxO1xuXG4gIHN0cmluZyA9IFV0ZjhFbmNvZGUoc3RyaW5nKTtcblxuICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XG5cbiAgYSA9IDB4Njc0NTIzMDE7XG4gIGIgPSAweEVGQ0RBQjg5O1xuICBjID0gMHg5OEJBRENGRTtcbiAgZCA9IDB4MTAzMjU0NzY7XG5cbiAgZm9yIChrID0gMDsgayA8IHgubGVuZ3RoOyBrICs9IDE2KSB7XG4gICAgQUEgPSBhO1xuICAgIEJCID0gYjtcbiAgICBDQyA9IGM7XG4gICAgREQgPSBkO1xuICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweEQ3NkFBNDc4KTtcbiAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMV0sIFMxMiwgMHhFOEM3Qjc1Nik7XG4gICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTMTMsIDB4MjQyMDcwREIpO1xuICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweEMxQkRDRUVFKTtcbiAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgNF0sIFMxMSwgMHhGNTdDMEZBRik7XG4gICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDVdLCBTMTIsIDB4NDc4N0M2MkEpO1xuICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweEE4MzA0NjEzKTtcbiAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgN10sIFMxNCwgMHhGRDQ2OTUwMSk7XG4gICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTMTEsIDB4Njk4MDk4RDgpO1xuICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhCNDRGN0FGKTtcbiAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMTBdLCBTMTMsIDB4RkZGRjVCQjEpO1xuICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAxMV0sIFMxNCwgMHg4OTVDRDdCRSk7XG4gICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZCOTAxMTIyKTtcbiAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMTNdLCBTMTIsIDB4RkQ5ODcxOTMpO1xuICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyAxNF0sIFMxMywgMHhBNjc5NDM4RSk7XG4gICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5QjQwODIxKTtcbiAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMV0sIFMyMSwgMHhGNjFFMjU2Mik7XG4gICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDZdLCBTMjIsIDB4QzA0MEIzNDApO1xuICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVFNUE1MSk7XG4gICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDBdLCBTMjQsIDB4RTlCNkM3QUEpO1xuICAgIGEgPSBHRyhhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzIxLCAweEQ2MkYxMDVEKTtcbiAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XG4gICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzIzLCAweEQ4QTFFNjgxKTtcbiAgICBiID0gR0coYiwgYywgZCwgYSwgeFtrICsgNF0sIFMyNCwgMHhFN0QzRkJDOCk7XG4gICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFFMUNERTYpO1xuICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAxNF0sIFMyMiwgMHhDMzM3MDdENik7XG4gICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDNdLCBTMjMsIDB4RjRENTBEODcpO1xuICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NUExNEVEKTtcbiAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMjEsIDB4QTlFM0U5MDUpO1xuICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAyXSwgUzIyLCAweEZDRUZBM0Y4KTtcbiAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZGMDJEOSk7XG4gICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDEyXSwgUzI0LCAweDhEMkE0QzhBKTtcbiAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgNV0sIFMzMSwgMHhGRkZBMzk0Mik7XG4gICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MUY2ODEpO1xuICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMzMywgMHg2RDlENjEyMik7XG4gICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDE0XSwgUzM0LCAweEZERTUzODBDKTtcbiAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhBNEJFRUE0NCk7XG4gICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDRdLCBTMzIsIDB4NEJERUNGQTkpO1xuICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyA3XSwgUzMzLCAweEY2QkI0QjYwKTtcbiAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4QkVCRkJDNzApO1xuICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyAxM10sIFMzMSwgMHgyODlCN0VDNik7XG4gICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDBdLCBTMzIsIDB4RUFBMTI3RkEpO1xuICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweEQ0RUYzMDg1KTtcbiAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgNl0sIFMzNCwgMHg0ODgxRDA1KTtcbiAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgOV0sIFMzMSwgMHhEOUQ0RDAzOSk7XG4gICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweEU2REI5OUU1KTtcbiAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTVdLCBTMzMsIDB4MUZBMjdDRjgpO1xuICAgIGIgPSBISChiLCBjLCBkLCBhLCB4W2sgKyAyXSwgUzM0LCAweEM0QUM1NjY1KTtcbiAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhGNDI5MjI0NCk7XG4gICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDddLCBTNDIsIDB4NDMyQUZGOTcpO1xuICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxNF0sIFM0MywgMHhBQjk0MjNBNyk7XG4gICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4RkM5M0EwMzkpO1xuICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyAxMl0sIFM0MSwgMHg2NTVCNTlDMyk7XG4gICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDNdLCBTNDIsIDB4OEYwQ0NDOTIpO1xuICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhGRkVGRjQ3RCk7XG4gICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDFdLCBTNDQsIDB4ODU4NDVERDEpO1xuICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA4XSwgUzQxLCAweDZGQTg3RTRGKTtcbiAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4RkUyQ0U2RTApO1xuICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzQzLCAweEEzMDE0MzE0KTtcbiAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgMTNdLCBTNDQsIDB4NEUwODExQTEpO1xuICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweEY3NTM3RTgyKTtcbiAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTFdLCBTNDIsIDB4QkQzQUYyMzUpO1xuICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAyXSwgUzQzLCAweDJBRDdEMkJCKTtcbiAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhFQjg2RDM5MSk7XG4gICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFBKTtcbiAgICBiID0gQWRkVW5zaWduZWQoYiwgQkIpO1xuICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XG4gICAgZCA9IEFkZFVuc2lnbmVkKGQsIEREKTtcbiAgfVxuXG4gIHZhciB0ZW1wID0gV29yZFRvSGV4KGEpICsgV29yZFRvSGV4KGIpICsgV29yZFRvSGV4KGMpICsgV29yZFRvSGV4KGQpO1xuXG4gIHJldHVybiB0ZW1wLnRvTG93ZXJDYXNlKCk7XG59O1xuIiwiaW1wb3J0IHtCYXNlNjR9IGZyb20gJy4vYmFzZTY0JztcclxuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQge21kNX0gZnJvbSAnLi9tZDUnO1xyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RyaW5nVXRpbHMge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XHJcbiAgICBzdGF0aWMgc2V0U2FuaXRpemVySW5zdGFuY2UgKHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNhbml0aXplciAmJiBzYW5pdGl6ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZXIgPSBzYW5pdGl6ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGluY2x1ZGVzKHN0cjogc3RyaW5nLCBmaW5kOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHN0ci5pbmNsdWRlcyhmaW5kKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBmaW5kOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHN0ci5zdGFydHNXaXRoKGZpbmQpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGVuZHNXaXRoKHN0cjogc3RyaW5nLCBmaW5kOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHN0ci5lbmRzV2l0aChmaW5kKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBpc1N0cmluZyh2YWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgU3RyaW5nKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyByZW1vdmVBY2NlbnRzICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0ZXh0ID8gdGV4dC5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKSA6ICcnO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIFN0cmluZ1RvTnVtYmVyIChzdDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc3QsIDEwKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBVdGY4RW5jb2RlIChzdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICAvLyByZXR1cm4gdGhpcy5iNjQuX3V0ZjhfZW5jb2RlKHN0KTtcclxuICAgICAgICAvLyBjb25zdCBzc3QgPSB0aGlzLnV0ZjgudXRmOGRlY29kZShzdCk7XHJcbiAgICAgICAgcmV0dXJuIHN0O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIFV0ZjhEZWNvZGUgKHN0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLmI2NC5fdXRmOF9kZWNvZGUoc3QpO1xyXG4gICAgICAgIC8vIGNvbnN0IHNzdCA9IHRoaXMudXRmOC51dGY4ZGVjb2RlKHN0KTtcclxuICAgICAgICByZXR1cm4gc3Q7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYmFzZTY0RGVjb2RlIChiYjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBiNjQgPSBuZXcgQmFzZTY0KCk7XHJcbiAgICAgICAgcmV0dXJuIGI2NC5kZWNvZGUoYmIpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGlzRW1wdHkodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICh0ZXh0ID09PSAnJyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYnlwYXNzU2VjdXJpdHlUcnVzdFVybCh0ZXh0OiBzdHJpbmcpOiBTYWZlVXJsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybCh0ZXh0KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyB0b01kNSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gbWQ1KHRleHQpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc2xhdGVVdGlscyB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZTtcclxuICBzdGF0aWMgc2V0VHJhbmxhdGVJbnN0YW5jZSAodHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgaWYgKCF0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgJiYgdHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSB0cmFuc2xhdGVTZXJ2aWNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgVHJhbnNsYXRlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgICAgIGxldCB0cmFuc2xhdGlvbiA9ICcnO1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KHRleHQpLnN1YnNjcmliZShcclxuICAgICAgICB0cmFucyA9PiB7XHJcbiAgICAgICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdHJhbnNsYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtTZXNzaW9uVXRpbHN9IGZyb20gJy4vc2Vzc2lvblV0aWxzJztcclxuaW1wb3J0IHtTdHJpbmdVdGlsc30gZnJvbSAnLi9zdHJpbmdVdGlscyc7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gJy4vb2JqZWN0VXRpbHMnO1xyXG5pbXBvcnQge1RyYW5zbGF0ZVV0aWxzfSBmcm9tICcuL3RyYW5zbGF0ZVV0aWxzJztcclxuaW1wb3J0IG5vdGlmeSBmcm9tICdkZXZleHRyZW1lL3VpL25vdGlmeSc7XHJcbmltcG9ydCB7V2lkdGhIZWlnaHRNZWR9IGZyb20gJy4uL2ludGVyZmFjZXMvV2lkdGhIZWlnaHRNZWQnO1xyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2xvYmFsVXRpbHMge1xyXG4gIHByaXZhdGUgc3RhdGljIHJlc3BvbnNpdmVXaWR0aCA9IDk2MDtcclxuICBwcml2YXRlIHN0YXRpYyB0aW1lc2hvdyA9IDgwMDA7XHJcbiAgc3RhdGljIHNldFJlc3BvbnNpdmVXaWR0aChyZXNwb25zaXZlV2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlc3BvbnNpdmVXaWR0aCAmJiByZXNwb25zaXZlV2lkdGgpIHtcclxuICAgICAgdGhpcy5yZXNwb25zaXZlV2lkdGggPSByZXNwb25zaXZlV2lkdGg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBzZXRUaW1lU2hvdyh0aW1lc2hvdzogbnVtYmVyKSB7XHJcbiAgICBpZiAoIXRoaXMudGltZXNob3cgJiYgdGltZXNob3cpIHtcclxuICAgICAgdGhpcy50aW1lc2hvdyA9IHRpbWVzaG93O1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgYXJlRXF1YWxzKG9iajE6IGFueSwgb2JqMjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqMSkgPT09IEpTT04uc3RyaW5naWZ5KG9iajIpO1xyXG4gIH1cclxuICBzdGF0aWMgaXNFbXB0eURhdGEoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuYXJlRXF1YWxzKGRhdGEsICcnKSB8fCB0aGlzLmFyZUVxdWFscyhkYXRhLCAwKSB8fCBkYXRhICA9PT0gbnVsbCB8fCB0aGlzLmFyZUVxdWFscyhkYXRhLCB7fSkgfHwgdGhpcy5hcmVFcXVhbHMoZGF0YSwgW10pKTtcclxuICB9XHJcbiAgc3RhdGljIGlzVW5kZWZpbmVkKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJztcclxuICB9XHJcbiAgc3RhdGljIHNldFN5c25hbWUgKG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgU2Vzc2lvblV0aWxzLnNldFNlc3Npb24oJ3N5c25hbWUnLCBuYW1lKTtcclxuICB9XHJcbiAgc3RhdGljIGdldFN5c25hbWUgKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU2Vzc2lvblV0aWxzLmdldFNlc3Npb24oJ3N5c25hbWUnKTtcclxuICB9XHJcbiAgc3RhdGljIGF1dG9GaXhTaWRlYmFyU3RhdGUgKHdpZHRoOiBudW1iZXIsIGFjdHN0dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh3aWR0aCA8PSB0aGlzLnJlc3BvbnNpdmVXaWR0aCkge1xyXG4gICAgICByZXR1cm4gJ2lucmVzJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChhY3RzdHQgPT09ICdpbnJlcycpIHtcclxuICAgICAgICByZXR1cm4gJ291dCc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGFjdHN0dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgZml4c2lkZWJhclN0YXRlIChzdHQ6IHN0cmluZywgd2lkdGg6IG51bWJlciwgYWN0c3R0OiBzdHJpbmcsIHJlc3BvbnNpdmVXaWR0aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICh3aWR0aCA8PSByZXNwb25zaXZlV2lkdGgpIHtcclxuICAgICAgaWYgKGFjdHN0dCA9PT0gJ2lucmVzJykge1xyXG4gICAgICAgIHJldHVybiAnaW4nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnaW5yZXMnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gc3R0O1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgZml4Q29udGFpbmVyU3RhdGUgKHN0dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCByZXNwb25zaXZlV2lkdGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAod2lkdGggPD0gcmVzcG9uc2l2ZVdpZHRoKSB7XHJcbiAgICAgIHJldHVybiAnaW5yZXMnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHN0dDtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIHN1Y2Nlc3NOb3RpZnkobWVuOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgbm90aWZ5KFRyYW5zbGF0ZVV0aWxzLlRyYW5zbGF0ZShtZW4pICsgJyAnXHJcbiAgICAgICsgSlNPTi5zdHJpbmdpZnkoZGF0YSksICdzdWNjZXNzJywgdGhpcy50aW1lc2hvdyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBjYXRoTm90aWZ5IChlcnJvciwgbWVuOiBzdHJpbmcsIHR5cGUgPSAnd2FybmluZycpOiB2b2lkIHtcclxuICAgICAgY29uc3QgdG1lbiA9IFRyYW5zbGF0ZVV0aWxzLlRyYW5zbGF0ZShtZW4pO1xyXG4gICAgICB0aGlzLm5vdGlmeUVycm9yKHRtZW4sIGVycm9yLCB0eXBlKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBzdGF0aWMgbm90aWZ5RXJyb3IgKHRtZW46IHN0cmluZywgZXJyb3I6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XHJcbiAgICAgIG5vdGlmeShgJHt0bWVufSA6JHt0aGlzLmVycm9yQ2F0aChlcnJvcil9YCwgdHlwZSwgdGhpcy50aW1lc2hvdyk7XHJcbiAgICAgIGlmICh0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodG1lbik7XHJcbiAgICAgIH1cclxuICB9XHJcbiAgc3RhdGljIGNhdGhOb3RpZnlFeHRyYU1lbiAoZXJyb3IsIG1lbjogc3RyaW5nLCBleHRyYU1lbjogc3RyaW5nLCB0eXBlID0gJ3dhcm5pbmcnKTogdm9pZCB7XHJcbiAgICBjb25zdCB0bWVuID0gYCR7VHJhbnNsYXRlVXRpbHMuVHJhbnNsYXRlKG1lbil9ICR7ZXh0cmFNZW59YDtcclxuICAgIHRoaXMubm90aWZ5RXJyb3IodG1lbiwgZXJyb3IsIHR5cGUpO1xyXG4gIH1cclxuICBzdGF0aWMgZXJyb3JDYXRoIChlcnJvcjogYW55KTogc3RyaW5nIHtcclxuICAgIGxldCBlcnJvck1lbiA9ICcnO1xyXG4gICAgaWYgKFN0cmluZ1V0aWxzLmlzU3RyaW5nKGVycm9yKSkge1xyXG4gICAgICBlcnJvck1lbiA9IGVycm9yO1xyXG4gICAgfSBlbHNlICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoZXJyb3IpKSB7XHJcbiAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc1N0cmluZyhlcnJvci5lcnJvcikpIHtcclxuICAgICAgICAgIGVycm9yTWVuID0gZXJyb3IuZXJyb3I7XHJcbiAgICAgICAgfSBlbHNlIGlmIChPYmplY3RVdGlscy5pc09iamVjdChlcnJvci5lcnJvcikgJiYgZXJyb3IuZXJyb3IuUmVzcG9uc2VTdGF0dXMpIHtcclxuICAgICAgICAgIGlmIChlcnJvci5lcnJvci5SZXNwb25zZVN0YXR1cy5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVuID0gZXJyb3IuZXJyb3IuUmVzcG9uc2VTdGF0dXMuTWVzc2FnZTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IuZXJyb3IuUmVzcG9uc2VTdGF0dXMuRXJyb3JDb2RlKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVuID0gZXJyb3IuZXJyb3IuUmVzcG9uc2VTdGF0dXMuRXJyb3JDb2RlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoU3RyaW5nVXRpbHMuaXNTdHJpbmcoZXJyb3IubWVzc2FnZSkpIHtcclxuICAgICAgICAgIGVycm9yTWVuID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgIGVycm9yTWVuID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1c1RleHQpIHtcclxuICAgICAgICAgIGVycm9yTWVuID0gZXJyb3Iuc3RhdHVzVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBUcmFuc2xhdGVVdGlscy5UcmFuc2xhdGUoZXJyb3JNZW4pO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0TmF0aXZlV2luZG93ICgpOiBXaW5kb3cge1xyXG4gICAgcmV0dXJuIHdpbmRvdztcclxuICB9XHJcbiAgc3RhdGljIG9wZW5XaW5kb3codXJsOiBzdHJpbmcsIGNvbmZpZz86IGFueSk6IFdpbmRvdyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5vcGVuKHVybCwgJycsICdsb2NhdGlvbj1ubyx3aWR0aD0xODAwLGhlaWdodD05MDAsc2Nyb2xsYmFycz15ZXMsdG9wPTEwMCxsZWZ0PTcwMCxyZXNpemFibGUgPSBubycpO1xyXG4gIH1cclxuICBzdGF0aWMgc2V0V2l0aEhlaWdodCAod2htPzogV2lkdGhIZWlnaHRNZWQpOiBhbnkge1xyXG4gICAgaWYgKHdobSAmJiB3aG0uZnVsbFNjcmVlbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZ1bGxzY3JlZW46IDEsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGxldCBtbSA9IDEuNTtcclxuICAgIGlmICh3aG0gJiYgd2htLk1lZGlhKSB7XHJcbiAgICAgIG1tID0gd2htLk1lZGlhO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsID0ge1xyXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGggLyBtbSxcclxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLyBtbVxyXG4gICAgfTtcclxuICAgIGlmICh3aG0gJiYgd2htLmhhc093blByb3BlcnR5KCd3aWR0aCcpKSB7XHJcbiAgICAgIHZhbC53aWR0aCA9IHdobS53aWR0aDtcclxuICAgIH1cclxuICAgIGlmICh3aG0gJiYgd2htLmhhc093blByb3BlcnR5KCdoZWlnaHQnKSkge1xyXG4gICAgICB2YWwuaGVpZ2h0ID0gd2htLmhlaWdodDtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7R2xvYmFsVXRpbHN9IGZyb20gJy4vZ2xvYmFsVXRpbHMnO1xyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXJyYXlVdGlscyB7XHJcbiAgc3RhdGljIGluQXJyYXkoYXJyYXk6IGFueVtdLCBmaW5kOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBhcnJheS5pbmNsdWRlcyhmaW5kKTtcclxuICB9XHJcbiAgc3RhdGljIG5vdEluQXJyYXkoYXJyYXk6IGFueVtdLCBmaW5kOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoIXRoaXMuaW5BcnJheShhcnJheSwgZmluZCkpO1xyXG4gIH1cclxuICBzdGF0aWMgb2JqZWN0SW5BcnJheSAoYXJyOiBhbnlbXSwgb2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoYXJyLmZpbmQob28gPT4gR2xvYmFsVXRpbHMuYXJlRXF1YWxzKG9vLCBvYmopKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBvYmplY3ROb3RJbkFycmF5IChhcnI6IGFueVtdLCBvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLm9iamVjdEluQXJyYXkoYXJyLCBvYmopO1xyXG4gIH1cclxuICBzdGF0aWMgb2JqZWN0UHJvcEluQXJyYXkgKGFycjogYW55W10sIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChhcnIuZmluZChvbyA9PiBHbG9iYWxVdGlscy5hcmVFcXVhbHMob29bcHJvcF0sIHZhbHVlKSkpO1xyXG4gIH1cclxuICBzdGF0aWMgb2JqZWN0Tm90UHJvcEluQXJyYXkgKGFycjogYW55W10sIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICghdGhpcy5vYmplY3RQcm9wSW5BcnJheShhcnIsIHByb3AsIHZhbHVlKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBjbG9uZUFycmF5IChhcnI6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIFsuLi5hcnJdO1xyXG4gIH1cclxuICBzdGF0aWMgcmVtb3ZlRnJvbUFycmF5IChhcnI6IGFueVtdLCBpbmQ6IG51bWJlcik6IGFueVtdIHtcclxuICAgIGFyci5zcGxpY2UoaW5kLCAxKTtcclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG4gIHN0YXRpYyBhcnJheU1lcmdlIChhcnIxOiBhbnlbXSwgYXJyMjogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gWy4uLmFycjEsIC4uLmFycjJdO1xyXG4gIH1cclxufVxyXG4iLCIvLyBAZHluYW1pY1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmVjaGFzVXRpbHMge1xyXG4gIHN0YXRpYyB0b0RhdGUgKERhdGVPcmksIFJlbW92ZUhvdXI/KTogYW55IHtcclxuICAgIGxldCBEYXRlT2JqID0gRGF0ZU9yaTtcclxuICAgIGlmIChEYXRlT3JpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaXNEYXRlID0gKHR5cGVvZiBEYXRlT2JqLmdldE1vbnRoID09PSAnZnVuY3Rpb24nKTtcclxuICAgICAgICBpZiAoIWlzRGF0ZSkge1xyXG4gICAgICAgICAgY29uc3QgcGFydCA9IERhdGVPYmouc3BsaXQoJy4nKTtcclxuICAgICAgICAgIERhdGVPYmogPSBEYXRlLnBhcnNlKHBhcnRbMF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoUmVtb3ZlSG91cikge1xyXG4gICAgICAgICAgRGF0ZU9iai5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIERhdGVPYmo7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHN0YXRpYyB1bnNldFRpbWVaZXJvKHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGltZSA/IHRpbWUucmVwbGFjZSggLzAwMDEtMDEtMDFUMDA6MDA6MDBcXC4wMDAwMDAwLywgJycpIDogJyc7XHJcbiAgfVxyXG4gIHN0YXRpYyB1bnNldEFueXRpbWVaZXJvIChzZXQ6IGFueSk6IGFueSB7XHJcbiAgICBPYmplY3Qua2V5cyhzZXQpLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgIGlmIChzZXRbcHJvcF0gPT09ICcwMDAxLTAxLTAxVDAwOjAwOjAwLjAwMDAwMDAnKSB7XHJcbiAgICAgICAgc2V0W3Byb3BdID0gdGhpcy51bnNldFRpbWVaZXJvKHNldFtwcm9wXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNldDtcclxuICB9XHJcbiAgc3RhdGljIHVuc2V0QXJyYXlUaW1lWmVybyAoc2V0OiBhbnlbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IGZpbmFsOiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgcyBvZiBzZXQpIHtcclxuICAgICAgcyA9IHRoaXMudW5zZXRBbnl0aW1lWmVybyhzKTtcclxuICAgICAgZmluYWwucHVzaChzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaW5hbDtcclxuICB9XHJcbiAgc3RhdGljIGlzV2Vla2VuZChkYXRlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xyXG4gICAgcmV0dXJuIGRheSA9PT0gMCB8fCBkYXkgPT09IDY7XHJcbiAgfVxyXG4gIHN0YXRpYyBpc1RvZGF5KGRhdGUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGU7XHJcbiAgICByZXR1cm4gKGRhdGUgPT09IHRvZGF5KTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtFbmNyeXB0VXRpbHN9IGZyb20gJy4vZW5jcnlwdFV0aWxzJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi9vYmplY3RVdGlscyc7XHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2NhbFN0b3JhZ2VVdGlscyB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgY29kZUtleShrZXk6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGJ0b2Eoa2V5LnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxuICBzdGF0aWMgc2V0U3RvcmFnZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKEVuY3J5cHRVdGlscy5oYXNFbmNyeXB0aW9uKCkpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5jb2RlS2V5KGtleSksIEVuY3J5cHRVdGlscy5lbmNyeXB0KHZhbHVlKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdmFsOiBhbnk7XHJcbiAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdCh2YWx1ZSkpIHtcclxuICAgICAgICB2YWwgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlbGV0ZVN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChFbmNyeXB0VXRpbHMuaGFzRW5jcnlwdGlvbigpKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuY29kZUtleShrZXkpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0c3RvcmFnZShrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICBpZiAoRW5jcnlwdFV0aWxzLmhhc0VuY3J5cHRpb24oKSkge1xyXG4gICAgICByZXR1cm4gRW5jcnlwdFV0aWxzLmRlY3J5cHQobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5jb2RlS2V5KGtleSkpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCB2YWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhbCA9IEpTT04ucGFyc2UodmFsKTtcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtTZXNzaW9uVXRpbHN9IGZyb20gJy4vc2Vzc2lvblV0aWxzJztcclxuaW1wb3J0IHtUcmFuc2xhdGVVdGlsc30gZnJvbSAnLi90cmFuc2xhdGVVdGlscyc7XHJcbmltcG9ydCBub3RpZnkgZnJvbSAnZGV2ZXh0cmVtZS91aS9ub3RpZnknO1xyXG5pbXBvcnQge0VuY3J5cHRVdGlsc30gZnJvbSAnLi9lbmNyeXB0VXRpbHMnO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tICcuL29iamVjdFV0aWxzJztcclxuaW1wb3J0IHtHbG9iYWxVdGlsc30gZnJvbSAnLi9nbG9iYWxVdGlscyc7XHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dpblV0aWxzIHtcclxuICBwcml2YXRlIHN0YXRpYyBMb2dpbktleSgpIHtcclxuICAgIGlmIChFbmNyeXB0VXRpbHMuaGFzRW5jcnlwdGlvbigpKSB7XHJcbiAgICAgIHJldHVybiBidG9hKEVuY3J5cHRVdGlscy5lbmNyeXB0KHRoaXMuZ2V0Q3VycmVudFVzZXIoKSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGJ0b2EoSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRDdXJyZW50VXNlcigpKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBpc0xvZ2dlZGluKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGtleTogc3RyaW5nO1xyXG4gICAgaWYgKEVuY3J5cHRVdGlscy5oYXNFbmNyeXB0aW9uKCkpIHtcclxuICAgICAga2V5ID0gRW5jcnlwdFV0aWxzLmRlY3J5cHQoYXRvYihTZXNzaW9uVXRpbHMuZ2V0U2Vzc2lvbignaXNMb2dnZWRpbicpKSk7XHJcbiAgICAgIHJldHVybiBHbG9iYWxVdGlscy5hcmVFcXVhbHMoa2V5LCB0aGlzLmdldEN1cnJlbnRVc2VyKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbG9nID0gU2Vzc2lvblV0aWxzLmdldFNlc3Npb24oJ2lzTG9nZ2VkaW4nKTtcclxuICAgICAgaWYgKGxvZyA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBrZXkgPSBhdG9iKGxvZyk7XHJcbiAgICAgIHJldHVybiBHbG9iYWxVdGlscy5hcmVFcXVhbHMoSlNPTi5wYXJzZShrZXkpLCB0aGlzLmdldEN1cnJlbnRVc2VyKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgc2V0TG9nZ2VkaW4oKTogdm9pZCB7XHJcbiAgICBTZXNzaW9uVXRpbHMuc2V0U2Vzc2lvbignaXNMb2dnZWRpbicsIHRoaXMuTG9naW5LZXkoKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBsb2dPZmYoKTogdm9pZCB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gIH1cclxuICBzdGF0aWMgbG9nRmFpbCAoZXJyKSB7XHJcbiAgICAgIHRoaXMubG9nT2ZmKCk7XHJcbiAgICAgIGNvbnN0IG1lbiA9IFRyYW5zbGF0ZVV0aWxzLlRyYW5zbGF0ZShlcnIuc3RhdHVzVGV4dCk7XHJcbiAgICAgIG5vdGlmeShtZW4sICdlcnJvcicsIDUwMDApO1xyXG4gIH1cclxuICBzdGF0aWMgc2V0Q3VycmVudFVzZXIodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgU2Vzc2lvblV0aWxzLnNldFNlc3Npb24oJ2N1cnJlbnRVc2VyJywgdmFsdWUpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0Q3VycmVudFVzZXIoKTogYW55IHtcclxuICAgIHJldHVybiBTZXNzaW9uVXRpbHMuZ2V0U2Vzc2lvbignY3VycmVudFVzZXInKTtcclxuICB9XHJcbiAgc3RhdGljIHNldEVtcHJlc2FzVXNlciAoZW1wcmVzYXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgIFNlc3Npb25VdGlscy5zZXRTZXNzaW9uKCdlbXByZXNhc1VzZXInLCBlbXByZXNhcyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRFbXByZXNhc1VzZXIgKCk6IGFueVtdIHtcclxuICAgIHJldHVybiBTZXNzaW9uVXRpbHMuZ2V0U2Vzc2lvbignZW1wcmVzYXNVc2VyJyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRFbXJlc2FJZFByb2QgKCk6IGFueSB7XHJcbiAgICBjb25zdCB7SURFbXByZXNhUHJvZH0gPSB0aGlzLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICByZXR1cm4gSURFbXByZXNhUHJvZDtcclxuICB9XHJcbiAgc3RhdGljIHNldEVtcHJlc2FDb2RlIChpZDogbnVtYmVyLCBub21icmU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNyciA9IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgIGNyci5Db21wYW55Q29kZSA9IGlkO1xyXG4gICAgaWYgKG5vbWJyZSkge1xyXG4gICAgICBjcnIuQ29tcGFueU5hbWUgPSBub21icmU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEN1cnJlbnRVc2VyKGNycik7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRFbXByZXNhQ29kZSAoKTogYW55IHtcclxuICAgIGNvbnN0IHtDb21wYW55Q29kZX0gPSB0aGlzLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICByZXR1cm4gQ29tcGFueUNvZGU7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7UFJJTUFSWV9PVVRMRVQsIFJvdXRlciwgVXJsU2VnbWVudCwgVXJsU2VnbWVudEdyb3VwLCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQge1RyYW5zbGF0ZVV0aWxzfSBmcm9tICcuL3RyYW5zbGF0ZVV0aWxzJztcclxuaW1wb3J0IHtTZXNzaW9uVXRpbHN9IGZyb20gJy4vc2Vzc2lvblV0aWxzJztcclxuaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tICcuL2FycmF5VXRpbHMnO1xyXG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tICcuL3N0cmluZ1V0aWxzJztcclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJvdXRlclV0aWxzIHtcclxuICBwcml2YXRlIHN0YXRpYyByb3V0ZXI6IFJvdXRlcjtcclxuICBwcml2YXRlIHN0YXRpYyBkeW5hbWljRGlyID0gJyc7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGljRGlyID0gJyc7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgZHluYW1pY0RpclIgPSAnJztcclxuICBwcml2YXRlIHN0YXRpYyBzdGF0aWNEaXJSID0gJyc7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgbm90QWxsb3dlZCA9ICcvJztcclxuICBwcml2YXRlIHN0YXRpYyBsaXN0RGlyID0gJ2xpc3QnO1xyXG4gIHN0YXRpYyBzZXRSb3V0ZXJJbnN0YW5jZSAocm91dGVyPzogUm91dGVyKSB7XHJcbiAgICBpZiAoIXRoaXMucm91dGVyICYmIHJvdXRlcikge1xyXG4gICAgICB0aGlzLnJvdXRlciA9IHJvdXRlcjtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIHNldFN0YXRpY0RpciAoZGlyOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5zdGF0aWNEaXIgJiYgZGlyKSB7XHJcbiAgICAgIHRoaXMuc3RhdGljRGlyID0gYC8ke2Rpcn0vYDtcclxuICAgICAgdGhpcy5zdGF0aWNEaXJSID0gYC8ke2Rpcn1SL2A7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBzZXREeW5hbWljRGlyIChkaXI6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLmR5bmFtaWNEaXIgJiYgZGlyKSB7XHJcbiAgICAgIHRoaXMuZHluYW1pY0RpciA9IGAvJHtkaXJ9L2A7XHJcbiAgICAgIHRoaXMuZHluYW1pY0RpclIgPSBgLyR7ZGlyfVIvYDtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIHNldE5vdEFsbG93ZWREaXIgKGRpcjogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMubm90QWxsb3dlZCAmJiBkaXIpIHtcclxuICAgICAgdGhpcy5ub3RBbGxvd2VkID0gZGlyO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgc2V0TGlzdERpciAoZGlyOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5saXN0RGlyICYmIGRpcikge1xyXG4gICAgICB0aGlzLmxpc3REaXIgPSBkaXI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRSZXJvdXRlVXJsIChtb2R1bG86IHN0cmluZywgdGlwbzogc3RyaW5nLCBlbmQ/OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucm91dGVyKSB7XHJcbiAgICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgICAgY29uc3QgbW9kID0gbW9kdWxvLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IHR0ID0gdGlwby50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICBjb25zdCB1cmxyb3V0ZTogc3RyaW5nID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgICBpZiAoU3RyaW5nVXRpbHMuaW5jbHVkZXModXJscm91dGUsIGAvJHttb2R9L2ApKSB7XHJcbiAgICAgICAgdXJsID0gYC8ke21vZH1SLyR7dHR9L2A7XHJcbiAgICAgIH0gZWxzZSBpZiAoU3RyaW5nVXRpbHMuaW5jbHVkZXModXJscm91dGUsIGAvJHttb2R9Ui9gKSkge1xyXG4gICAgICAgIHVybCA9IGAvJHttb2R9LyR7dHR9L2A7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVuZCkge1xyXG4gICAgICAgIHVybCArPSBlbmQudG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdXJsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcvJztcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIHNldERpbmFtaWNEaXJVcmwobW9kOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuZHluYW1pY0Rpcn0ke21vZC50b1VwcGVyQ2FzZSgpfS8ke2lkLnRvU3RyaW5nKCl9YDtcclxuICB9XHJcbiAgc3RhdGljIHNldEN1c3RvbURpclVybChzeXM6IHN0cmluZywgbW9kOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuc3RhdGljRGlyfSR7c3lzfS8ke21vZH1gO1xyXG4gIH1cclxuICBzdGF0aWMgZXZhbFBlcm0gKGV4dHJhPzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yb3V0ZXIpIHtcclxuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgICBjb25zdCBzaW5Ecm91dGVyID0gdXJsLnNwbGl0KCcoJyk7XHJcbiAgICAgIHVybCA9IHNpbkRyb3V0ZXJbMF07XHJcbiAgICAgIGlmIChTdHJpbmdVdGlscy5pbmNsdWRlcyh1cmwsICc7JykpIHtcclxuICAgICAgICBjb25zdCBzdXJsID0gdXJsLnNwbGl0KCc7Jyk7XHJcbiAgICAgICAgdXJsID0gc3VybFswXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmEpIHtcclxuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShleHRyYSwgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChTdHJpbmdVdGlscy5pbmNsdWRlcyh1cmwsIHRoaXMuZHluYW1pY0RpclIpKSB7XHJcbiAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UodGhpcy5keW5hbWljRGlyUiwgdGhpcy5keW5hbWljRGlyKTtcclxuICAgICAgfSBlbHNlIGlmIChTdHJpbmdVdGlscy5pbmNsdWRlcyh1cmwsIHRoaXMuc3RhdGljRGlyUikpIHtcclxuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSh0aGlzLnN0YXRpY0RpclIsIHRoaXMuc3RhdGljRGlyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgKFxyXG4gICAgICAgICAgU3RyaW5nVXRpbHMuaW5jbHVkZXModXJsLCB0aGlzLmR5bmFtaWNEaXIpXHJcbiAgICAgICAgICB8fCBTdHJpbmdVdGlscy5pbmNsdWRlcyh1cmwsIHRoaXMuc3RhdGljRGlyUilcclxuICAgICAgICAgIHx8IFN0cmluZ1V0aWxzLmluY2x1ZGVzKHVybCwgdGhpcy5zdGF0aWNEaXIpXHJcbiAgICAgICAgICB8fCBTdHJpbmdVdGlscy5pbmNsdWRlcyh1cmwsIHRoaXMuc3RhdGljRGlyUilcclxuICAgICAgICApXHJcbiAgICAgICAgJiZcclxuICAgICAgICB0aGlzLnVybE5vdEFsbG93ZWQodXJsKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ub3RBbGxvd2VkXSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLm5vdEFsbG93ZWRdKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIGdldFNlZ21lbnRzUm91dGUocm91dGU6IHN0cmluZywgcGFyYW1zOiBhbnkgPSB7fSwgbGlzdGEgPSBmYWxzZSk6IChhbnkgfCBhbnkpW10ge1xyXG4gICAgICBjb25zdCB0cmVlOiBVcmxUcmVlID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwocm91dGUpO1xyXG4gICAgICBjb25zdCBnOiBVcmxTZWdtZW50R3JvdXAgPSB0cmVlLnJvb3QuY2hpbGRyZW5bUFJJTUFSWV9PVVRMRVRdO1xyXG4gICAgICBjb25zdCBzOiBVcmxTZWdtZW50W10gPSBnLnNlZ21lbnRzO1xyXG4gICAgICBjb25zdCBmaW5hbDogYW55W10gPSBzLm1hcChwID0+IHtcclxuICAgICAgICAgIHJldHVybiBwLnBhdGg7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAobGlzdGEpIHtcclxuICAgICAgICAgIHJldHVybiBbLi4uZmluYWwsIC4uLlt0aGlzLmxpc3REaXJdLCAuLi5bcGFyYW1zXV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLmZpbmFsLCAuLi5bcGFyYW1zXV07XHJcbiAgICAgIH1cclxuICB9XHJcbiAgc3RhdGljIGdldFNlZ21lbnRzUm91dGVJZChyb3V0ZTogc3RyaW5nLCBpZDogbnVtYmVyLCBwYXJhbXM6IGFueSA9IHt9LCBsaXN0YSA9IGZhbHNlKTogKGFueSB8IGFueSlbXSB7XHJcbiAgICBjb25zdCB0cmVlOiBVcmxUcmVlID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwocm91dGUpO1xyXG4gICAgY29uc3QgZzogVXJsU2VnbWVudEdyb3VwID0gdHJlZS5yb290LmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXTtcclxuICAgIGNvbnN0IHM6IFVybFNlZ21lbnRbXSA9IGcuc2VnbWVudHM7XHJcbiAgICBjb25zdCBmaW5hbDogYW55W10gPSBzLm1hcChwID0+IHtcclxuICAgICAgcmV0dXJuIHAucGF0aDtcclxuICAgIH0pO1xyXG4gICAgaWYgKGxpc3RhKSB7XHJcbiAgICAgIHJldHVybiBbLi4uZmluYWwsIC4uLltpZC50b1N0cmluZygpXSwgLi4uWydMaXN0YSddLCAuLi5bcGFyYW1zXV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gWy4uLmZpbmFsLCAuLi5baWQudG9TdHJpbmcoKV0sIC4uLltwYXJhbXNdXTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhdGljIHNldE5vdEFsbG93TWVuIChtZW46IHN0cmluZyk6IHZvaWQge1xyXG4gICAgU2Vzc2lvblV0aWxzLnNldFNlc3Npb24oJ25vdGFsbG93ZWRtZW4nLCBtZW4pO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0Tm90QWxsb3dNZW4gKG1lbnNldDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBtZW46IGFueSA9IFNlc3Npb25VdGlscy5nZXRTZXNzaW9uKCdub3RhbGxvd2VkbWVuJyk7XHJcbiAgICBpZiAobWVuICE9PSBudWxsKSB7XHJcbiAgICAgIFNlc3Npb25VdGlscy5kZWxldGVTZXNzaW9uKCdub3RhbGxvd2VkbWVuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtZW4gPSBtZW5zZXQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVHJhbnNsYXRlVXRpbHMuVHJhbnNsYXRlKG1lbik7XHJcbiAgfVxyXG4gIHN0YXRpYyBzZXRBbGxvd2VkVXJsICh1cmw6IGFueSk6IHZvaWQge1xyXG4gICAgU2Vzc2lvblV0aWxzLnNldFNlc3Npb24oJ2FsbG93ZWR1cmwnLCB1cmwpO1xyXG4gIH1cclxuICBzdGF0aWMgdXJsTm90QWxsb3dlZCAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVybHNBbGxvd2VkID0gU2Vzc2lvblV0aWxzLmdldFNlc3Npb24oJ2FsbG93ZWR1cmwnKTtcclxuICAgIGxldCBub3RBID0gdHJ1ZTtcclxuICAgIGlmICh1cmxzQWxsb3dlZCAhPT0gbnVsbCkge1xyXG4gICAgICBub3RBID0gQXJyYXlVdGlscy5ub3RJbkFycmF5KHVybHNBbGxvd2VkLCB1cmwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vdEE7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7U2Vzc2lvblV0aWxzfSBmcm9tICcuL3Nlc3Npb25VdGlscyc7XHJcbmltcG9ydCB7R2xvYmFsVXRpbHN9IGZyb20gJy4vZ2xvYmFsVXRpbHMnO1xyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJlYWRDcnVtYlV0aWxzIHtcclxuICBzdGF0aWMgZ2V0QnJlYWRDcnVtYiAoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTZXNzaW9uVXRpbHMuZ2V0U2Vzc2lvbignYnJlYWRjcnVtYicpO1xyXG4gIH1cclxuICBzdGF0aWMgc2V0QnJlYWRDcnVtYih2YWx1ZTogc3RyaW5nLCBpc0RpbmFtaWM/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIWlzRGluYW1pYykge1xyXG4gICAgICB2YWx1ZSA9IEdsb2JhbFV0aWxzLmdldFN5c25hbWUoKSArIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgU2Vzc2lvblV0aWxzLnNldFNlc3Npb24oJ2JyZWFkY3J1bWInLCB2YWx1ZSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRQcmluTW9kRnJvbUJyZWFkQ3J1bWIgKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VhcmNoID0gdmFsdWUuc3BsaXQoL1xcLy8pO1xyXG4gICAgcmV0dXJuIHNlYXJjaFsxXTtcclxuICB9XHJcbn1cclxuIiwiLy8gQGR5bmFtaWNcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERvbUVsZW1lbnRVdGlscyB7XHJcbiAgc3RhdGljIGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBEb21FbGVtZW50VXRpbHMud2FpdEZvckNvbnRhaW5lckVsZW1lbnQoZWxlbWVudCwgcmVzb2x2ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RhdGljIGdldENvbnRhaW5lckNsYXNzRWxlbWVudChjbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgRG9tRWxlbWVudFV0aWxzLndhaXRGb3JDb250YWluZXJDbGFzc0VsZW1lbnQoY2xhc3NOYW1lLCByZXNvbHZlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyB3YWl0Rm9yQ29udGFpbmVyRWxlbWVudChpZCwgcmVzb2x2ZSkge1xyXG4gICAgY29uc3QgJGNvbmZpZ0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICBpZiAoISRjb25maWdFbGVtZW50IHx8ICRjb25maWdFbGVtZW50ID09PSBudWxsKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoRG9tRWxlbWVudFV0aWxzLndhaXRGb3JDb250YWluZXJFbGVtZW50LmJpbmQodGhpcywgaWQsIHJlc29sdmUpLCAzMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNvbHZlKCRjb25maWdFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBzdGF0aWMgd2FpdEZvckNvbnRhaW5lckNsYXNzRWxlbWVudChjbGFzc05hbWUsIHJlc29sdmUpIHtcclxuICAgIGNvbnN0ICRjb25maWdFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpO1xyXG4gICAgaWYgKCEkY29uZmlnRWxlbWVudCB8fCAkY29uZmlnRWxlbWVudCA9PT0gbnVsbCkge1xyXG4gICAgICBzZXRUaW1lb3V0KERvbUVsZW1lbnRVdGlscy53YWl0Rm9yQ29udGFpbmVyQ2xhc3NFbGVtZW50LmJpbmQodGhpcywgY2xhc3NOYW1lLCByZXNvbHZlKSwgMzApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzb2x2ZSgkY29uZmlnRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7QXJyYXlVdGlsc30gZnJvbSAnLi91dGlsaXRpZXMvYXJyYXlVdGlscyc7XG5pbXBvcnQge0ZlY2hhc1V0aWxzfSBmcm9tICcuL3V0aWxpdGllcy9mZWNoYXNVdGlscyc7XG5pbXBvcnQge0dsb2JhbFV0aWxzfSBmcm9tICcuL3V0aWxpdGllcy9nbG9iYWxVdGlscyc7XG5pbXBvcnQge0xvY2FsU3RvcmFnZVV0aWxzfSBmcm9tICcuL3V0aWxpdGllcy9sb2NhbFN0b3JhZ2VVdGlscyc7XG5pbXBvcnQge0xvZ2luVXRpbHN9IGZyb20gJy4vdXRpbGl0aWVzL2xvZ2luVXRpbHMnO1xuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi91dGlsaXRpZXMvb2JqZWN0VXRpbHMnO1xuaW1wb3J0IHtSb3V0ZXJVdGlsc30gZnJvbSAnLi91dGlsaXRpZXMvcm91dGVyVXRpbHMnO1xuaW1wb3J0IHtTZXNzaW9uVXRpbHN9IGZyb20gJy4vdXRpbGl0aWVzL3Nlc3Npb25VdGlscyc7XG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tICcuL3V0aWxpdGllcy9zdHJpbmdVdGlscyc7XG5pbXBvcnQge1RyYW5zbGF0ZVV0aWxzfSBmcm9tICcuL3V0aWxpdGllcy90cmFuc2xhdGVVdGlscyc7XG5pbXBvcnQge0ljZVV0aWxpdGllc0RhdGF9IGZyb20gJy4vaW50ZXJmYWNlcy9JY2VVdGlsaXRpZXNEYXRhJztcbmltcG9ydCB7QnJlYWRDcnVtYlV0aWxzfSBmcm9tICcuL3V0aWxpdGllcy9icmVhZENydW1iVXRpbHMnO1xuaW1wb3J0IHtEb21FbGVtZW50VXRpbHN9IGZyb20gJy4vdXRpbGl0aWVzL2RvbUVsZW1lbnRVdGlscyc7XG5pbXBvcnQge0VuY3J5cHRVdGlsc30gZnJvbSAnLi91dGlsaXRpZXMvZW5jcnlwdFV0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEljZVV0aWxpdGllcyB7XG4gIHN0YXRpYyBhcnJheXMgICAgICAgPSBBcnJheVV0aWxzO1xuICBzdGF0aWMgYnJlYWRDcnVtYnMgID0gQnJlYWRDcnVtYlV0aWxzO1xuICBzdGF0aWMgZG9tRWxlbWVudHMgID0gRG9tRWxlbWVudFV0aWxzO1xuICBzdGF0aWMgZGF0ZXMgICAgICAgID0gRmVjaGFzVXRpbHM7XG4gIHN0YXRpYyBnbG9iYWxzICAgICAgPSBHbG9iYWxVdGlscztcbiAgc3RhdGljIGxvY2FsU3RvcmFnZSA9IExvY2FsU3RvcmFnZVV0aWxzO1xuICBzdGF0aWMgbG9naW4gICAgICAgID0gTG9naW5VdGlscztcbiAgc3RhdGljIG9iamVjdHMgICAgICA9IE9iamVjdFV0aWxzO1xuICBzdGF0aWMgcm91dGVyICAgICAgID0gUm91dGVyVXRpbHM7XG4gIHN0YXRpYyBzZXNzaW9uICAgICAgPSBTZXNzaW9uVXRpbHM7XG4gIHN0YXRpYyBzdHJpbmdzICAgICAgPSBTdHJpbmdVdGlscztcbiAgc3RhdGljIHRyYW5zbGF0ZSAgICA9IFRyYW5zbGF0ZVV0aWxzO1xuICBzdGF0aWMgZW5jcnlwdGlvbiAgID0gRW5jcnlwdFV0aWxzO1xuICBzdGF0aWMgaW5pSWNlVXRpbGl0aWVzKGRhdGE6IEljZVV0aWxpdGllc0RhdGEpIHtcbiAgICB0aGlzLmdsb2JhbHMuc2V0UmVzcG9uc2l2ZVdpZHRoKGRhdGEucmVzcG9uc2l2ZVdpZHRoKTtcbiAgICB0aGlzLmdsb2JhbHMuc2V0VGltZVNob3coZGF0YS50aW1lc2hvdyk7XG4gICAgdGhpcy5yb3V0ZXIuc2V0Um91dGVySW5zdGFuY2UoZGF0YS5yb3V0ZXIpO1xuICAgIHRoaXMucm91dGVyLnNldER5bmFtaWNEaXIoZGF0YS5keW5hbWljRGlyKTtcbiAgICB0aGlzLnJvdXRlci5zZXRTdGF0aWNEaXIoZGF0YS5zdGF0aWNEaXIpO1xuICAgIHRoaXMucm91dGVyLnNldE5vdEFsbG93ZWREaXIoZGF0YS5ub3RBbGxvd2VkKTtcbiAgICB0aGlzLnJvdXRlci5zZXRMaXN0RGlyKGRhdGEubGlzdERpcik7XG4gICAgdGhpcy5zdHJpbmdzLnNldFNhbml0aXplckluc3RhbmNlKGRhdGEuc2FuaXRpemVyKTtcbiAgICB0aGlzLnRyYW5zbGF0ZS5zZXRUcmFubGF0ZUluc3RhbmNlKGRhdGEudHJhbnNsYXRlU2VydmljZSk7XG4gICAgdGhpcy5lbmNyeXB0aW9uLnNldEtleShkYXRhLmVuY3J5cHRpb25LZXkpO1xuICB9XG59XG4iLCJpbXBvcnQge0luamVjdG9yfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBJbmplY3RvclV0aWxzKHByb3ZpZGVyOiBhbnkpOiBhbnkge1xyXG4gIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtwcm92aWRlcnM6IFt7cHJvdmlkZTogcHJvdmlkZXIsIGRlcHM6IFtdfV19KTtcclxuICByZXR1cm4gaW5qZWN0b3IuZ2V0KHByb3ZpZGVyKTtcclxufVxyXG4iLCJpbXBvcnQge2FuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwga2V5ZnJhbWVzLCBxdWVyeSwgc3RhZ2dlciwgQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlclRyYW5zaXRpb24oKTogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIHtcbiAgICByZXR1cm4gc2xpZGVUb0xlZnQoKTsgLy8gc2xpZGVUb1RvcFxufVxuXG5leHBvcnQgZnVuY3Rpb24gTG9naW5Sb3V0ZXJUcmFuc2l0aW9uKCk6IEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSB7XG4gICAgcmV0dXJuIHNsaWRlVG9Ub3AoKTsgLy8gc2xpZGVUb1RvcFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lkZWJhckFuaW0obmFtZSk6IHZvaWQge1xuICAgIHRyaWdnZXIoJ3NsaWRlSW5PdXQnLCBbXG4gICAgc3RhdGUoJ2luJywgc3R5bGUoe1xuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMjAlLCAwLCAwKSdcbiAgICB9KSksXG4gICAgc3RhdGUoJ291dCcsIHN0eWxlKHtcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJ1xuICAgIH0pKSxcbiAgICB0cmFuc2l0aW9uKCdpbiA9PiBvdXQnLCBhbmltYXRlKCc0MDBtcyBlYXNlLWluLW91dCcpKSxcbiAgICB0cmFuc2l0aW9uKCdvdXQgPT4gaW4nLCBhbmltYXRlKCc0MDBtcyBlYXNlLWluLW91dCcpKVxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWRlVG9SaWdodCgpOiBBbmltYXRpb25UcmlnZ2VyTWV0YWRhdGEge1xuICAgIHJldHVybiB0cmlnZ2VyKCdyb3V0ZXJUcmFuc2l0aW9uJywgW1xuICAgICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHt9KSksXG4gICAgICAgIHN0YXRlKCcqJywgc3R5bGUoe30pKSxcbiAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKScgfSksXG4gICAgICAgICAgICBhbmltYXRlKCcwLjVzIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDAlKScgfSkpXG4gICAgICAgIF0pLFxuICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG4gICAgICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJyB9KSxcbiAgICAgICAgICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknIH0pKVxuICAgICAgICBdKVxuICAgIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpZGVUb0xlZnQoKTogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIHtcbiAgICByZXR1cm4gdHJpZ2dlcigncm91dGVyVHJhbnNpdGlvbicsIFtcbiAgICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7fSkpLFxuICAgICAgICBzdGF0ZSgnKicsIHN0eWxlKHt9KSksXG4gICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScgfSksXG4gICAgICAgICAgICBhbmltYXRlKCcwLjVzIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDAlKScgfSkpXG4gICAgICAgIF0pLFxuICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG4gICAgICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJyB9KSxcbiAgICAgICAgICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJyB9KSlcbiAgICAgICAgXSlcbiAgICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWRlVG9Cb3R0b20oKTogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIHtcbiAgICByZXR1cm4gdHJpZ2dlcigncm91dGVyVHJhbnNpdGlvbicsIFtcbiAgICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7fSkpLFxuICAgICAgICBzdGF0ZSgnKicsIHN0eWxlKHt9KSksXG4gICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknIH0pLFxuICAgICAgICAgICAgYW5pbWF0ZSgnMC41cyBlYXNlLWluLW91dCcsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwJSknIH0pKVxuICAgICAgICBdKSxcbiAgICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScgfSksXG4gICAgICAgICAgICBhbmltYXRlKCcwLjVzIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDEwMCUpJyB9KSlcbiAgICAgICAgXSlcbiAgICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWRlVG9Ub3AoKTogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIHtcbiAgICByZXR1cm4gdHJpZ2dlcigncm91dGVyVHJhbnNpdGlvbicsIFtcbiAgICAgICAgc3RhdGUoJ3ZvaWQnLCBzdHlsZSh7fSkpLFxuICAgICAgICBzdGF0ZSgnKicsIHN0eWxlKHt9KSksXG4gICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgxMDAlKScgfSksXG4gICAgICAgICAgICBhbmltYXRlKCcwLjVzIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScgfSkpXG4gICAgICAgIF0pLFxuICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG4gICAgICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJyB9KSxcbiAgICAgICAgICAgIGFuaW1hdGUoJzAuNXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTEwMCUpJyB9KSlcbiAgICAgICAgXSlcbiAgICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uICBzbGlkZUluT3V0QW5pbWF0aW9uU2lkZUJhciAoKTogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIHtcbiAgcmV0dXJuIHRyaWdnZXIoJ3NsaWRlSW5PdXRBbmltYXRpb25TaWRlQmFyJywgW1xuXG4gICAgLy8gZW5kIHN0YXRlIHN0eWxlcyBmb3Igcm91dGUgY29udGFpbmVyIChob3N0KVxuICAgIHN0YXRlKCdpbicsIHN0eWxlKHtcbiAgICAgIC8vIHRoZSB2aWV3IGNvdmVycyB0aGUgd2hvbGUgc2NyZWVuIHdpdGggYSBzZW1pIHRyYW5wYXJlbnQgYmFja2dyb3VuZFxuICAgICAgbGVmdDogNjAsXG4gICAgICB3aWR0aDogNjAsXG4gICAgICBtYXJnaW5MZWZ0OiAtNjAsXG4gICAgfSkpLFxuICAgIHN0YXRlKCdvdXQnLCBzdHlsZSh7XG4gICAgICAvLyB0aGUgdmlldyBjb3ZlcnMgdGhlIHdob2xlIHNjcmVlbiB3aXRoIGEgc2VtaSB0cmFucGFyZW50IGJhY2tncm91bmRcbiAgICAgIGxlZnQ6IDIzNSxcbiAgICAgIHdpZHRoOiAyMzUsXG4gICAgICBtYXJnaW5MZWZ0OiAtMjM1LFxuICAgIH0pKSxcbiAgICB0cmFuc2l0aW9uKCdpbiA9PiBvdXQnLCBhbmltYXRlKCc0MDBtcyBlYXNlLWluLW91dCcpKSxcbiAgICB0cmFuc2l0aW9uKCdvdXQgPT4gaW4nLCBhbmltYXRlKCc0MDBtcyBlYXNlLWluLW91dCcpKVxuICBdKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNsaWRlSW5PdXRBbmltYXRpb25Db250ZW50ID1cbiAgdHJpZ2dlcignc2xpZGVJbk91dEFuaW1hdGlvbkNvbnRlbnQnLCBbXG5cbiAgICAvLyBlbmQgc3RhdGUgc3R5bGVzIGZvciByb3V0ZSBjb250YWluZXIgKGhvc3QpXG4gICAgc3RhdGUoJ2luJywgc3R5bGUoe1xuICAgICAgLy8gdGhlIHZpZXcgY292ZXJzIHRoZSB3aG9sZSBzY3JlZW4gd2l0aCBhIHNlbWkgdHJhbnBhcmVudCBiYWNrZ3JvdW5kXG4gICAgICBsZWZ0OiA2MCxcbiAgICAgIHdpZHRoOiA2MCxcbiAgICAgIG1hcmdpbkxlZnQ6IC02MCxcbiAgICB9KSksXG4gICAgc3RhdGUoJ291dCcsIHN0eWxlKHtcbiAgICAgIC8vIHRoZSB2aWV3IGNvdmVycyB0aGUgd2hvbGUgc2NyZWVuIHdpdGggYSBzZW1pIHRyYW5wYXJlbnQgYmFja2dyb3VuZFxuICAgICAgbGVmdDogMjM1LFxuICAgICAgd2lkdGg6IDIzNSxcbiAgICAgIG1hcmdpbkxlZnQ6IC0yMzUsXG4gICAgfSkpLFxuICAgIHRyYW5zaXRpb24oJ2luID0+IG91dCcsIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JykpLFxuICAgIHRyYW5zaXRpb24oJ291dCA9PiBpbicsIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JykpXG4gIF0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZmlkZUluRmFkZU91dCgpOiBBbmltYXRpb25UcmlnZ2VyTWV0YWRhdGEge1xuICByZXR1cm4gdHJpZ2dlcignc2ltcGxlRmFkZUFuaW1hdGlvbicsIFtcblxuICAgIC8vIHRoZSBcImluXCIgc3R5bGUgZGV0ZXJtaW5lcyB0aGUgXCJyZXN0aW5nXCIgc3RhdGUgb2YgdGhlIGVsZW1lbnQgd2hlbiBpdCBpcyB2aXNpYmxlLlxuICAgIHN0YXRlKCdpbicsIHN0eWxlKHtvcGFjaXR5OiAxfSkpLFxuXG4gICAgLy8gZmFkZSBpbiB3aGVuIGNyZWF0ZWQuIHRoaXMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicpXG4gICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgc3R5bGUoe29wYWNpdHk6IDB9KSxcbiAgICAgIGFuaW1hdGUoNjAwIClcbiAgICBdKSxcblxuICAgIC8vIGZhZGUgb3V0IHdoZW4gZGVzdHJveWVkLiB0aGlzIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhcyB0cmFuc2l0aW9uKCd2b2lkID0+IConKVxuICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsXG4gICAgICBhbmltYXRlKDYwMCwgc3R5bGUoe29wYWNpdHk6IDB9KSkpXG4gIF0pO1xufVxuXG5cbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fdmFsdWVzIiwicm91dGVyIiwiUFJJTUFSWV9PVVRMRVQiLCJJbmplY3RvciIsInRyaWdnZXIiLCJzdGF0ZSIsInN0eWxlIiwidHJhbnNpdGlvbiIsImFuaW1hdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLElBZU8sSUFBSSxRQUFRLEdBQUc7UUFDbEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxRQUFRLENBQUMsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUFFLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRjtZQUNELE9BQU8sQ0FBQyxDQUFDO1NBQ1osQ0FBQTtRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFBO0FBRUQsYUFrRWdCLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE9BQU87WUFDSCxJQUFJLEVBQUU7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNO29CQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDM0M7U0FDSixDQUFDO0lBQ04sQ0FBQztBQUVELGFBQWdCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUk7WUFDQSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJO2dCQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlFO1FBQ0QsT0FBTyxLQUFLLEVBQUU7WUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FBRTtnQkFDL0I7WUFDSixJQUFJO2dCQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEQ7b0JBQ087Z0JBQUUsSUFBSSxDQUFDO29CQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUFFO1NBQ3BDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBRUQsYUFBZ0IsUUFBUTtRQUNwQixLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUM5QyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7Ozs7Ozs7Ozs7SUN6SUQ7Ozs7OztRQUFBO1NBNkJDOzs7OztRQTVCUSxvQkFBUTs7OztZQUFmLFVBQWdCLEdBQVE7Z0JBQ3RCLFFBQVEsT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO2FBQ2xDOzs7OztRQUNNLG1CQUFPOzs7O1lBQWQsVUFBZ0IsR0FBUTtnQkFDdEIsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO2FBQzdFOzs7OztRQUNNLDJCQUFlOzs7O1lBQXRCLFVBQXdCLEdBQVE7O29CQUMxQixPQUFPLEdBQUcsSUFBSTtnQkFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO29CQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFDO2lCQUNqQixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxPQUFPLENBQUM7YUFDaEI7Ozs7O1FBQ00sNEJBQWdCOzs7O1lBQXZCLFVBQXlCLFFBQWdCO2dCQUN2QyxvQkFBWSxRQUFRLEVBQUU7YUFDdkI7Ozs7O1FBQ00sc0JBQVU7Ozs7WUFBakIsVUFBbUIsUUFBZ0I7Z0JBQ2pDLE9BQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3pDOzs7OztRQUNNLHVCQUFXOzs7O1lBQWxCLFVBQW9CLEdBQVE7O29CQUNwQixNQUFNLEdBQVEsRUFBRTtnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO29CQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzNCLENBQUMsQ0FBQzthQUNKOzs7Ozs7UUFDTSxpQkFBSzs7Ozs7WUFBWixVQUFhLElBQVMsRUFBRSxJQUFTO2dCQUFwQixxQkFBQTtvQkFBQSxTQUFTOztnQkFBRSxxQkFBQTtvQkFBQSxTQUFTOztnQkFDL0Isb0JBQVcsSUFBSSxFQUFLLElBQUksRUFBRTthQUMzQjtRQUNILGtCQUFDO0lBQUQsQ0FBQyxJQUFBOzs7Ozs7QUM5QkQ7Ozs7SUFFQTs7Ozs7O1FBQUE7U0FpQ0M7Ozs7O1FBOUJRLG1CQUFNOzs7O1lBQWIsVUFBYyxHQUFXO2dCQUN2QixJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2xEO2FBQ0Y7Ozs7UUFDTSwwQkFBYTs7O1lBQXBCO2dCQUNFLFFBQVEsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTthQUNsRTs7Ozs7UUFDTSxvQkFBTzs7OztZQUFkLFVBQWUsSUFBUztnQkFDdEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQ2pELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3pDO3FCQUFNO29CQUNMLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2FBQ0Y7Ozs7O1FBQ00sb0JBQU87Ozs7WUFBZCxVQUFlLFFBQWdCO2dCQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7d0JBQzVFLEdBQUcsR0FBUSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ25ELElBQUk7d0JBQ0YsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3ZCO29CQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7b0JBQ2QsT0FBTyxHQUFHLENBQUM7aUJBQ1o7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjs7OztRQUNNLHdCQUFXOzs7WUFBbEI7Z0JBQ0UsT0FBTyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdEM7UUFDSCxtQkFBQztJQUFELENBQUMsSUFBQTs7Ozs7O0FDbkNEOzs7O0lBR0E7Ozs7OztRQUFBO1NBbUNDOzs7Ozs7UUFsQ2dCLG9CQUFPOzs7OztZQUF0QixVQUF1QixHQUFXO2dCQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUNoQzs7Ozs7O1FBQ00sdUJBQVU7Ozs7O1lBQWpCLFVBQWtCLEdBQVcsRUFBRSxLQUFVO2dCQUN2QyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDaEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDeEU7cUJBQU07O3dCQUNELEdBQUcsU0FBSztvQkFDWixJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQy9CLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUM3Qjt5QkFBTTt3QkFDTCxHQUFHLEdBQUcsS0FBSyxDQUFDO3FCQUNiO29CQUNELGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUNsQzthQUNGOzs7OztRQUNNLDBCQUFhOzs7O1lBQXBCLFVBQXFCLEdBQVc7Z0JBQzlCLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFO29CQUNoQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDOUM7cUJBQU07b0JBQ0wsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDaEM7YUFDRjs7Ozs7UUFDTSx1QkFBVTs7OztZQUFqQixVQUFrQixHQUFXO2dCQUMzQixJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRTtvQkFDaEMsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hFO3FCQUFNOzt3QkFDRCxHQUFHLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7b0JBQ3JDLElBQUk7d0JBQ0YsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3ZCO29CQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7b0JBQ2QsT0FBTyxHQUFHLENBQUM7aUJBQ1o7YUFDRjtRQUNILG1CQUFDO0lBQUQsQ0FBQyxJQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUM1QkQ7UUFLRTtZQUNFLElBQUksQ0FBQyxPQUFPLEdBQUcsbUVBQW1FLENBQUM7U0FDcEY7Ozs7Ozs7UUFHRCx1QkFBTTs7Ozs7O1lBQU4sVUFBUSxLQUFLOztvQkFDUCxNQUFNLEdBQUcsRUFBRTs7b0JBQ1gsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQ3hDLENBQUMsR0FBRyxDQUFDO2dCQUVULEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVqQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUV2QixJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3QixJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM3QixJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUU3QixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFFakIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2YsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7cUJBQ2xCO3lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO3FCQUNYO29CQUVELE1BQU0sR0FBRyxNQUFNO3dCQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBRXpEO2dCQUVELE9BQU8sTUFBTSxDQUFDO2FBQ2Y7Ozs7Ozs7UUFHRCx1QkFBTTs7Ozs7O1lBQU4sVUFBUSxLQUFLOztvQkFDUCxNQUFNLEdBQUcsRUFBRTs7b0JBQ1gsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQUUsSUFBSTs7b0JBQ2hCLElBQUk7O29CQUFFLElBQUk7O29CQUFFLElBQUk7O29CQUFFLElBQUk7O29CQUN0QixDQUFDLEdBQUcsQ0FBQztnQkFFVCxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFakQsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFFdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUUvQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDakMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO29CQUVoQyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRTVDLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTt3QkFDZixNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzdDO29CQUNELElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTt3QkFDZixNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzdDO2lCQUVGO2dCQUVELE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztnQkFHbkMsT0FBTyxNQUFNLENBQUM7YUFFZjs7Ozs7OztRQUdELDZCQUFZOzs7Ozs7WUFBWixVQUFjLE1BQU07Z0JBQ2xCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzs7b0JBQ25DLE9BQU8sR0FBRyxFQUFFO2dCQUVoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBRWhDLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFFOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO3dCQUNYLE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuQzt5QkFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUU7d0JBQ2xDLE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDL0MsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO3FCQUNoRDt5QkFBTTt3QkFDTCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7d0JBQ2hELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDdEQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO3FCQUNoRDtpQkFFRjtnQkFFRCxPQUFPLE9BQU8sQ0FBQzthQUNoQjs7Ozs7OztRQUdELDZCQUFZOzs7Ozs7WUFBWixVQUFjLE9BQU87O29CQUNmLE1BQU0sR0FBRyxFQUFFOztvQkFDWCxDQUFDLEdBQUcsQ0FBQzs7b0JBQ0wsRUFBRTs7b0JBQUUsRUFBRTs7b0JBQUUsRUFBRTs7b0JBQ1YsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztnQkFFbkIsT0FBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRztvQkFFM0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRTFCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTt3QkFDWCxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDakMsQ0FBQyxFQUFFLENBQUM7cUJBQ0w7eUJBQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFO3dCQUNqQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQy9CLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDM0QsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDUjt5QkFBTTt3QkFDTCxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQy9CLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDL0UsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDUjtpQkFFRjtnQkFFRCxPQUFPLE1BQU0sQ0FBQzthQUNmO1FBRUgsYUFBQztJQUFELENBQUMsSUFBQTs7Ozs7Ozs7QUNoSkQsUUFBVyxHQUFHLEdBQUcsVUFBQyxNQUFNOzs7Ozs7UUFFdEIsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVU7WUFDcEMsT0FBTyxDQUFDLE1BQU0sSUFBSSxVQUFVLEtBQUssTUFBTSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ2hFOzs7Ozs7UUFFRCxTQUFTLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRTs7Z0JBQ3JCLEdBQUc7O2dCQUFFLEdBQUc7O2dCQUFFLEdBQUc7O2dCQUFFLEdBQUc7O2dCQUFFLE9BQU87WUFDL0IsR0FBRyxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUN4QixHQUFHLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDeEIsR0FBRyxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUN4QixPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsVUFBVSxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUNoRCxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUU7Z0JBQ2IsUUFBUSxPQUFPLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUU7YUFDM0M7WUFDRCxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxPQUFPLEdBQUcsVUFBVSxFQUFFO29CQUN4QixRQUFRLE9BQU8sR0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRTtpQkFDM0M7cUJBQU07b0JBQ0wsUUFBUSxPQUFPLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUU7aUJBQzNDO2FBQ0Y7aUJBQU07Z0JBQ0wsUUFBUSxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRTthQUM5QjtTQUNGOzs7Ozs7O1FBRUQsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDN0I7Ozs7Ozs7UUFFRCxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3Qjs7Ozs7OztRQUVELFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNoQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1NBQ3BCOzs7Ozs7O1FBRUQsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDekI7Ozs7Ozs7Ozs7O1FBRUQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN6Qzs7Ozs7Ozs7Ozs7UUFFRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3pDOzs7Ozs7Ozs7OztRQUVELFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUIsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDekM7Ozs7Ozs7Ozs7O1FBRUQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN6Qzs7Ozs7UUFFRCxTQUFTLGtCQUFrQixDQUFDLE1BQU07O2dCQUM1QixVQUFVOztnQkFDVixjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU07O2dCQUM5QixvQkFBb0IsR0FBRyxjQUFjLEdBQUcsQ0FBQzs7Z0JBQ3pDLG9CQUFvQixHQUFHLENBQUMsb0JBQW9CLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRTs7Z0JBQ2hGLGNBQWMsR0FBRyxDQUFDLG9CQUFvQixHQUFHLENBQUMsSUFBSSxFQUFFOztnQkFDaEQsVUFBVSxHQUFHLEtBQUssQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDOztnQkFDdEMsYUFBYSxHQUFHLENBQUM7O2dCQUNqQixVQUFVLEdBQUcsQ0FBQztZQUNsQixPQUFPLFVBQVUsR0FBRyxjQUFjLEVBQUU7Z0JBQ2xDLFVBQVUsR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxhQUFhLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JHLFVBQVUsRUFBRSxDQUFDO2FBQ2Q7WUFDRCxVQUFVLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxhQUFhLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSSxhQUFhLENBQUMsQ0FBQztZQUMxRSxVQUFVLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxDQUFDLENBQUM7WUFDckQsVUFBVSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLEtBQUssRUFBRSxDQUFDO1lBQ3ZELE9BQU8sVUFBVSxDQUFDO1NBQ25COzs7OztRQUVELFNBQVMsU0FBUyxDQUFDLE1BQU07O2dCQUNuQixjQUFjLEdBQUcsRUFBRTs7Z0JBQ3JCLG1CQUFtQixHQUFHLEVBQUU7O2dCQUN4QixLQUFLOztnQkFBRSxNQUFNO1lBQ2YsS0FBSyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3RDLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUN4QyxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0MsY0FBYyxHQUFHLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNqRztZQUNELE9BQU8sY0FBYyxDQUFDO1NBQ3ZCOzs7OztRQUVELFNBQVMsVUFBVSxDQUFDLE1BQU07WUFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFDbkMsT0FBTyxHQUFHLEVBQUU7WUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUVsQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBRTVCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtvQkFDWCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkM7cUJBQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFO29CQUNsQyxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQy9DLE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDaEQ7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO29CQUNoRCxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ3RELE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDaEQ7YUFFRjtZQUVELE9BQU8sT0FBTyxDQUFDO1NBQ2hCOztZQUVHLENBQUMsR0FBRyxLQUFLLEVBQUU7O1lBQ1gsQ0FBQzs7WUFBRSxFQUFFOztZQUFFLEVBQUU7O1lBQUUsRUFBRTs7WUFBRSxFQUFFOztZQUFFLENBQUM7O1lBQUUsQ0FBQzs7WUFBRSxDQUFDOztZQUFFLENBQUM7O1lBQzdCLEdBQUcsR0FBRyxDQUFDOztZQUNULEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFOztZQUNOLEdBQUcsR0FBRyxDQUFDOztZQUNULEdBQUcsR0FBRyxDQUFDOztZQUNQLEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFOztZQUNOLEdBQUcsR0FBRyxDQUFDOztZQUNULEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFOztZQUNOLEdBQUcsR0FBRyxDQUFDOztZQUNULEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFOztZQUNSLEdBQUcsR0FBRyxFQUFFO1FBRVYsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU1QixDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0IsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNmLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDZixDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ2YsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUVmLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDUCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1AsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNQLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDUCxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM3QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5QyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFH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