UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

4,921 lines 415 kB
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/animations'), require('@angular/cdk/coercion'), require('@angular/platform-browser/animations'), require('@angular/cdk/overlay'), require('rxjs'), require('@angular/cdk/platform')) :
    typeof define === 'function' && define.amd ? define('ng-zorro-antd/core', ['exports', '@angular/core', '@angular/common', '@angular/animations', '@angular/cdk/coercion', '@angular/platform-browser/animations', '@angular/cdk/overlay', 'rxjs', '@angular/cdk/platform'], factory) :
    (factory((global['ng-zorro-antd'] = global['ng-zorro-antd'] || {}, global['ng-zorro-antd'].core = {}),global.ng.core,global.ng.common,global.ng.animations,global.ng.cdk.coercion,global.ng.platformBrowser.animations,global.ng.cdk.overlay,global.rxjs,global.ng.cdk.platform));
}(this, (function (exports,i0,i1,animations,coercion,animations$1,overlay,rxjs,platform) { 'use strict';

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzClassListAddDirective = /** @class */ (function () {
        function NzClassListAddDirective(elementRef, renderer) {
            this.elementRef = elementRef;
            this.renderer = renderer;
            this.classList = [];
        }
        Object.defineProperty(NzClassListAddDirective.prototype, "nzClassListAdd", {
            set: /**
             * @param {?} list
             * @return {?}
             */ function (list) {
                var _this = this;
                this.classList.forEach(( /**
                 * @param {?} name
                 * @return {?}
                 */function (name) {
                    _this.renderer.removeClass(_this.elementRef.nativeElement, name);
                }));
                list.forEach(( /**
                 * @param {?} name
                 * @return {?}
                 */function (name) {
                    _this.renderer.addClass(_this.elementRef.nativeElement, name);
                }));
                this.classList = list;
            },
            enumerable: true,
            configurable: true
        });
        NzClassListAddDirective.decorators = [
            { type: i0.Directive, args: [{
                        selector: '[nzClassListAdd]',
                        exportAs: 'nzClassListAdd'
                    },] }
        ];
        /** @nocollapse */
        NzClassListAddDirective.ctorParameters = function () {
            return [
                { type: i0.ElementRef },
                { type: i0.Renderer2 }
            ];
        };
        NzClassListAddDirective.propDecorators = {
            nzClassListAdd: [{ type: i0.Input }]
        };
        return NzClassListAddDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzStringTemplateOutletDirective = /** @class */ (function () {
        function NzStringTemplateOutletDirective(viewContainer, defaultTemplate) {
            this.viewContainer = viewContainer;
            this.defaultTemplate = defaultTemplate;
            this.inputTemplate = null;
            this.inputViewRef = null;
            this.defaultViewRef = null;
        }
        Object.defineProperty(NzStringTemplateOutletDirective.prototype, "nzStringTemplateOutlet", {
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                if (value instanceof i0.TemplateRef) {
                    this.isTemplate = true;
                    this.inputTemplate = value;
                }
                else {
                    this.isTemplate = false;
                }
                this.updateView();
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @return {?}
         */
        NzStringTemplateOutletDirective.prototype.updateView = /**
         * @return {?}
         */
            function () {
                if (!this.isTemplate) {
                    /** use default template when input is string **/
                    if (!this.defaultViewRef) {
                        this.viewContainer.clear();
                        this.inputViewRef = null;
                        if (this.defaultTemplate) {
                            this.defaultViewRef = this.viewContainer.createEmbeddedView(this.defaultTemplate);
                        }
                    }
                }
                else {
                    /** use input template when input is templateRef **/
                    if (!this.inputViewRef) {
                        this.viewContainer.clear();
                        this.defaultViewRef = null;
                        if (this.inputTemplate) {
                            this.inputViewRef = this.viewContainer.createEmbeddedView(this.inputTemplate);
                        }
                    }
                }
            };
        NzStringTemplateOutletDirective.decorators = [
            { type: i0.Directive, args: [{
                        selector: '[nzStringTemplateOutlet]',
                        exportAs: 'nzStringTemplateOutlet'
                    },] }
        ];
        /** @nocollapse */
        NzStringTemplateOutletDirective.ctorParameters = function () {
            return [
                { type: i0.ViewContainerRef },
                { type: i0.TemplateRef }
            ];
        };
        NzStringTemplateOutletDirective.propDecorators = {
            nzStringTemplateOutlet: [{ type: i0.Input }]
        };
        return NzStringTemplateOutletDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzAddOnModule = /** @class */ (function () {
        function NzAddOnModule() {
        }
        NzAddOnModule.decorators = [
            { type: i0.NgModule, args: [{
                        imports: [i1.CommonModule],
                        exports: [NzStringTemplateOutletDirective, NzClassListAddDirective],
                        declarations: [NzStringTemplateOutletDirective, NzClassListAddDirective]
                    },] }
        ];
        return NzAddOnModule;
    }());

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    var AnimationDuration = /** @class */ (function () {
        function AnimationDuration() {
        }
        AnimationDuration.SLOW = '0.3s'; // Modal
        // Modal
        AnimationDuration.BASE = '0.2s';
        AnimationDuration.FAST = '0.1s'; // Tooltip
        return AnimationDuration;
    }());
    var AnimationCurves = /** @class */ (function () {
        function AnimationCurves() {
        }
        AnimationCurves.EASE_BASE_OUT = 'cubic-bezier(0.7, 0.3, 0.1, 1)';
        AnimationCurves.EASE_BASE_IN = 'cubic-bezier(0.9, 0, 0.3, 0.7)';
        AnimationCurves.EASE_OUT = 'cubic-bezier(0.215, 0.61, 0.355, 1)';
        AnimationCurves.EASE_IN = 'cubic-bezier(0.55, 0.055, 0.675, 0.19)';
        AnimationCurves.EASE_IN_OUT = 'cubic-bezier(0.645, 0.045, 0.355, 1)';
        AnimationCurves.EASE_OUT_BACK = 'cubic-bezier(0.12, 0.4, 0.29, 1.46)';
        AnimationCurves.EASE_IN_BACK = 'cubic-bezier(0.71, -0.46, 0.88, 0.6)';
        AnimationCurves.EASE_IN_OUT_BACK = 'cubic-bezier(0.71, -0.46, 0.29, 1.46)';
        AnimationCurves.EASE_OUT_CIRC = 'cubic-bezier(0.08, 0.82, 0.17, 1)';
        AnimationCurves.EASE_IN_CIRC = 'cubic-bezier(0.6, 0.04, 0.98, 0.34)';
        AnimationCurves.EASE_IN_OUT_CIRC = 'cubic-bezier(0.78, 0.14, 0.15, 0.86)';
        AnimationCurves.EASE_OUT_QUINT = 'cubic-bezier(0.23, 1, 0.32, 1)';
        AnimationCurves.EASE_IN_QUINT = 'cubic-bezier(0.755, 0.05, 0.855, 0.06)';
        AnimationCurves.EASE_IN_OUT_QUINT = 'cubic-bezier(0.86, 0, 0.07, 1)';
        return AnimationCurves;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var collapseMotion = animations.trigger('collapseMotion', [
        animations.state('expanded', animations.style({ height: '*' })),
        animations.state('collapsed', animations.style({ height: 0, overflow: 'hidden' })),
        animations.state('hidden', animations.style({ height: 0, display: 'none' })),
        animations.transition('expanded => collapsed', animations.animate("150ms " + AnimationCurves.EASE_IN_OUT)),
        animations.transition('expanded => hidden', animations.animate("150ms " + AnimationCurves.EASE_IN_OUT)),
        animations.transition('collapsed => expanded', animations.animate("150ms " + AnimationCurves.EASE_IN_OUT)),
        animations.transition('hidden => expanded', animations.animate("150ms " + AnimationCurves.EASE_IN_OUT))
    ]);

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var fadeMotion = animations.trigger('fadeMotion', [
        animations.transition(':enter', [animations.style({ opacity: 0 }), animations.animate("" + AnimationDuration.BASE, animations.style({ opacity: 1 }))]),
        animations.transition(':leave', [animations.style({ opacity: 1 }), animations.animate("" + AnimationDuration.BASE, animations.style({ opacity: 0 }))])
    ]);

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var helpMotion = animations.trigger('helpMotion', [
        animations.transition(':enter', [
            animations.style({
                opacity: 0,
                transform: 'translateY(-5px)'
            }),
            animations.animate(AnimationDuration.SLOW + " " + AnimationCurves.EASE_IN_OUT, animations.style({
                opacity: 1,
                transform: 'translateY(0)'
            }))
        ]),
        animations.transition(':leave', [
            animations.style({
                opacity: 1,
                transform: 'translateY(0)'
            }),
            animations.animate(AnimationDuration.SLOW + " " + AnimationCurves.EASE_IN_OUT, animations.style({
                opacity: 0,
                transform: 'translateY(-5px)'
            }))
        ])
    ]);

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var moveUpMotion = animations.trigger('moveUpMotion', [
        animations.transition('* => enter', [
            animations.style({
                transformOrigin: '0 0',
                transform: 'translateY(-100%)',
                opacity: 0
            }),
            animations.animate("" + AnimationDuration.BASE, animations.style({
                transformOrigin: '0 0',
                transform: 'translateY(0%)',
                opacity: 1
            }))
        ]),
        animations.transition('* => leave', [
            animations.style({
                transformOrigin: '0 0',
                transform: 'translateY(0%)',
                opacity: 1
            }),
            animations.animate("" + AnimationDuration.BASE, animations.style({
                transformOrigin: '0 0',
                transform: 'translateY(-100%)',
                opacity: 0
            }))
        ])
    ]);

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var notificationMotion = animations.trigger('notificationMotion', [
        animations.state('enterRight', animations.style({ opacity: 1, transform: 'translateX(0)' })),
        animations.transition('* => enterRight', [animations.style({ opacity: 0, transform: 'translateX(5%)' }), animations.animate('100ms linear')]),
        animations.state('enterLeft', animations.style({ opacity: 1, transform: 'translateX(0)' })),
        animations.transition('* => enterLeft', [animations.style({ opacity: 0, transform: 'translateX(-5%)' }), animations.animate('100ms linear')]),
        animations.state('leave', animations.style({
            opacity: 0,
            transform: 'scaleY(0.8)',
            transformOrigin: '0% 0%'
        })),
        animations.transition('* => leave', [
            animations.style({
                opacity: 1,
                transform: 'scaleY(1)',
                transformOrigin: '0% 0%'
            }),
            animations.animate('100ms linear')
        ])
    ]);

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var ANIMATION_TRANSITION_IN = AnimationDuration.BASE + " " + AnimationCurves.EASE_OUT_QUINT;
    /** @type {?} */
    var ANIMATION_TRANSITION_OUT = AnimationDuration.BASE + " " + AnimationCurves.EASE_IN_QUINT;
    /** @type {?} */
    var slideMotion = animations.trigger('slideMotion', [
        animations.state('bottom', animations.style({
            opacity: 1,
            transform: 'scaleY(1)',
            transformOrigin: '0% 0%'
        })),
        animations.state('top', animations.style({
            opacity: 1,
            transform: 'scaleY(1)',
            transformOrigin: '0% 100%'
        })),
        animations.transition('void => bottom', [
            animations.style({
                opacity: 0,
                transform: 'scaleY(0.8)',
                transformOrigin: '0% 0%'
            }),
            animations.animate(ANIMATION_TRANSITION_IN)
        ]),
        animations.transition('bottom => void', [
            animations.animate(ANIMATION_TRANSITION_OUT, animations.style({
                opacity: 0,
                transform: 'scaleY(0.8)',
                transformOrigin: '0% 0%'
            }))
        ]),
        animations.transition('void => top', [
            animations.style({
                opacity: 0,
                transform: 'scaleY(0.8)',
                transformOrigin: '0% 100%'
            }),
            animations.animate(ANIMATION_TRANSITION_IN)
        ]),
        animations.transition('top => void', [
            animations.animate(ANIMATION_TRANSITION_OUT, animations.style({
                opacity: 0,
                transform: 'scaleY(0.8)',
                transformOrigin: '0% 100%'
            }))
        ])
    ]);
    /** @type {?} */
    var slideAlertMotion = animations.trigger('slideAlertMotion', [
        animations.transition(':leave', [
            animations.style({ opacity: 1, transform: 'scaleY(1)', transformOrigin: '0% 0%' }),
            animations.animate(AnimationDuration.SLOW + " " + AnimationCurves.EASE_IN_OUT_CIRC, animations.style({
                opacity: 0,
                transform: 'scaleY(0)',
                transformOrigin: '0% 0%'
            }))
        ])
    ]);

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var zoomMotion = animations.trigger('zoomMotion', [
        animations.transition(':enter', [
            animations.style({ opacity: 0, transform: 'scale(0.2)' }),
            animations.animate(AnimationDuration.BASE + " " + AnimationCurves.EASE_OUT_CIRC, animations.style({
                opacity: 1,
                transform: 'scale(1)'
            }))
        ]),
        animations.transition(':leave', [
            animations.style({ opacity: 1, transform: 'scale(1)' }),
            animations.animate(AnimationDuration.BASE + " " + AnimationCurves.EASE_IN_OUT_CIRC, animations.style({
                opacity: 0,
                transform: 'scale(0.2)'
            }))
        ])
    ]);
    /** @type {?} */
    var zoomBigMotion = animations.trigger('zoomBigMotion', [
        animations.transition('void => active', [
            animations.style({ opacity: 0, transform: 'scale(0.8)' }),
            animations.animate(AnimationDuration.BASE + " " + AnimationCurves.EASE_OUT_CIRC, animations.style({
                opacity: 1,
                transform: 'scale(1)'
            }))
        ]),
        animations.transition('active => void', [
            animations.style({ opacity: 1, transform: 'scale(1)' }),
            animations.animate(AnimationDuration.BASE + " " + AnimationCurves.EASE_IN_OUT_CIRC, animations.style({
                opacity: 0,
                transform: 'scale(0.8)'
            }))
        ])
    ]);
    /** @type {?} */
    var zoomBadgeMotion = animations.trigger('zoomBadgeMotion', [
        animations.transition(':enter', [
            animations.style({ opacity: 0, transform: 'scale(0) translate(50%, -50%)' }),
            animations.animate(AnimationDuration.SLOW + " " + AnimationCurves.EASE_OUT_BACK, animations.style({
                opacity: 1,
                transform: 'scale(1) translate(50%, -50%)'
            }))
        ]),
        animations.transition(':leave', [
            animations.style({ opacity: 1, transform: 'scale(1) translate(50%, -50%)' }),
            animations.animate(AnimationDuration.SLOW + " " + AnimationCurves.EASE_IN_BACK, animations.style({
                opacity: 0,
                transform: 'scale(0) translate(50%, -50%)'
            }))
        ])
    ]);

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

    /*! *****************************************************************************
    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.
    ***************************************************************************** */
    /* global Reflect, Promise */
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b)
                if (b.hasOwnProperty(p))
                    d[p] = b[p]; };
        return extendStatics(d, b);
    };
    function __extends(d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    }
    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 __decorate(decorators, target, key, desc) {
        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
        if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
            r = Reflect.decorate(decorators, target, key, desc);
        else
            for (var i = decorators.length - 1; i >= 0; i--)
                if (d = decorators[i])
                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
        return c > 3 && r && Object.defineProperty(target, key, r), r;
    }
    function __metadata(metadataKey, metadataValue) {
        if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
            return Reflect.metadata(metadataKey, metadataValue);
    }
    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,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @param {?} value
     * @return {?}
     */
    function toBoolean(value) {
        return coercion.coerceBooleanProperty(value);
    }
    /**
     * @param {?} value
     * @param {?=} fallbackValue
     * @return {?}
     */
    function toNumber(value, fallbackValue) {
        if (fallbackValue === void 0) {
            fallbackValue = 0;
        }
        return coercion._isNumberValue(value) ? Number(value) : fallbackValue;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    function toCssPixel(value) {
        return coercion.coerceCssPixelValue(value);
    }
    /**
     * Get the function-property type's value
     * @template T
     * @param {?} prop
     * @param {...?} args
     * @return {?}
     */
    // tslint:disable-next-line: no-any
    function valueFunctionProp(prop) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        return typeof prop === 'function' ? prop.apply(void 0, __spread(args)) : prop;
    }
    // tslint:disable-next-line: no-any
    /**
     * @template T, D
     * @param {?} name
     * @param {?} fallback
     * @return {?}
     */
    function propDecoratorFactory(name, fallback) {
        // tslint:disable-next-line: no-any
        /**
         * @param {?} target
         * @param {?} propName
         * @return {?}
         */
        function propDecorator(target, propName) {
            /** @type {?} */
            var privatePropName = "$$__" + propName;
            if (Object.prototype.hasOwnProperty.call(target, privatePropName)) {
                console.warn("The prop \"" + privatePropName + "\" is already exist, it will be overrided by " + name + " decorator.");
            }
            Object.defineProperty(target, privatePropName, {
                configurable: true,
                writable: true
            });
            Object.defineProperty(target, propName, {
                get: /**
                 * @return {?}
                 */ function () {
                    return this[privatePropName]; // tslint:disable-line:no-invalid-this
                },
                set: /**
                 * @param {?} value
                 * @return {?}
                 */ function (value) {
                    this[privatePropName] = fallback(value); // tslint:disable-line:no-invalid-this
                }
            });
        }
        return propDecorator;
    }
    /**
     * Input decorator that handle a prop to do get/set automatically with toBoolean
     *
     * Why not using \@InputBoolean alone without \@Input? AOT needs \@Input to be visible
     *
     * \@howToUse
     * ```
     * \@Input() \@InputBoolean() visible: boolean = false;
     *
     * // Act as below:
     * // \@Input()
     * // get visible() { return this.__visible; }
     * // set visible(value) { this.__visible = value; }
     * // __visible = false;
     * ```
     * @return {?}
     */
    // tslint:disable-next-line: no-any
    function InputBoolean() {
        return propDecoratorFactory('InputBoolean', toBoolean);
    }
    // tslint:disable-next-line: no-any
    /**
     * @return {?}
     */
    function InputCssPixel() {
        return propDecoratorFactory('InputCssPixel', toCssPixel);
    }
    // tslint:disable-next-line: no-any
    /**
     * @return {?}
     */
    function InputNumber() {
        // tslint:disable-line: no-any
        return propDecoratorFactory('InputNumber', toNumber);
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var DISABLED_CLASSNAME = 'nz-animate-disabled';
    var NzNoAnimationDirective = /** @class */ (function () {
        function NzNoAnimationDirective(element, renderer, animationType) {
            this.element = element;
            this.renderer = renderer;
            this.animationType = animationType;
            this.nzNoAnimation = false;
        }
        /**
         * @return {?}
         */
        NzNoAnimationDirective.prototype.ngOnChanges = /**
         * @return {?}
         */
            function () {
                this.updateClass();
            };
        /**
         * @return {?}
         */
        NzNoAnimationDirective.prototype.ngAfterViewInit = /**
         * @return {?}
         */
            function () {
                this.updateClass();
            };
        /**
         * @private
         * @return {?}
         */
        NzNoAnimationDirective.prototype.updateClass = /**
         * @private
         * @return {?}
         */
            function () {
                /** @type {?} */
                var element = coercion.coerceElement(this.element);
                if (!element) {
                    return;
                }
                if (this.nzNoAnimation || this.animationType === 'NoopAnimations') {
                    this.renderer.addClass(element, DISABLED_CLASSNAME);
                }
                else {
                    this.renderer.removeClass(element, DISABLED_CLASSNAME);
                }
            };
        NzNoAnimationDirective.decorators = [
            { type: i0.Directive, args: [{
                        selector: '[nzNoAnimation]',
                        exportAs: 'nzNoAnimation',
                        host: {
                            '[@.disabled]': 'nzNoAnimation'
                        }
                    },] }
        ];
        /** @nocollapse */
        NzNoAnimationDirective.ctorParameters = function () {
            return [
                { type: i0.ElementRef },
                { type: i0.Renderer2 },
                { type: String, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [animations$1.ANIMATION_MODULE_TYPE,] }] }
            ];
        };
        NzNoAnimationDirective.propDecorators = {
            nzNoAnimation: [{ type: i0.Input }]
        };
        __decorate([
            InputBoolean(),
            __metadata("design:type", Boolean)
        ], NzNoAnimationDirective.prototype, "nzNoAnimation", void 0);
        return NzNoAnimationDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzNoAnimationModule = /** @class */ (function () {
        function NzNoAnimationModule() {
        }
        NzNoAnimationModule.decorators = [
            { type: i0.NgModule, args: [{
                        declarations: [NzNoAnimationDirective],
                        exports: [NzNoAnimationDirective],
                        imports: [i1.CommonModule]
                    },] }
        ];
        return NzNoAnimationModule;
    }());

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzConnectedOverlayDirective = /** @class */ (function () {
        function NzConnectedOverlayDirective(cdkConnectedOverlay) {
            this.cdkConnectedOverlay = cdkConnectedOverlay;
            this.cdkConnectedOverlay.backdropClass = 'nz-overlay-transparent-backdrop';
        }
        NzConnectedOverlayDirective.decorators = [
            { type: i0.Directive, args: [{
                        selector: '[cdkConnectedOverlay][nzConnectedOverlay]',
                        exportAs: 'nzConnectedOverlay'
                    },] }
        ];
        /** @nocollapse */
        NzConnectedOverlayDirective.ctorParameters = function () {
            return [
                { type: overlay.CdkConnectedOverlay }
            ];
        };
        return NzConnectedOverlayDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzOverlayModule = /** @class */ (function () {
        function NzOverlayModule() {
        }
        NzOverlayModule.decorators = [
            { type: i0.NgModule, args: [{
                        declarations: [NzConnectedOverlayDirective],
                        exports: [NzConnectedOverlayDirective]
                    },] }
        ];
        return NzOverlayModule;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var POSITION_MAP = {
        top: new overlay.ConnectionPositionPair({ originX: 'center', originY: 'top' }, {
            overlayX: 'center',
            overlayY: 'bottom'
        }),
        topCenter: new overlay.ConnectionPositionPair({ originX: 'center', originY: 'top' }, { overlayX: 'center', overlayY: 'bottom' }),
        topLeft: new overlay.ConnectionPositionPair({ originX: 'start', originY: 'top' }, {
            overlayX: 'start',
            overlayY: 'bottom'
        }),
        topRight: new overlay.ConnectionPositionPair({ originX: 'end', originY: 'top' }, { overlayX: 'end', overlayY: 'bottom' }),
        right: new overlay.ConnectionPositionPair({ originX: 'end', originY: 'center' }, {
            overlayX: 'start',
            overlayY: 'center'
        }),
        rightTop: new overlay.ConnectionPositionPair({ originX: 'end', originY: 'top' }, { overlayX: 'start', overlayY: 'top' }),
        rightBottom: new overlay.ConnectionPositionPair({ originX: 'end', originY: 'bottom' }, { overlayX: 'start', overlayY: 'bottom' }),
        bottom: new overlay.ConnectionPositionPair({ originX: 'center', originY: 'bottom' }, {
            overlayX: 'center',
            overlayY: 'top'
        }),
        bottomCenter: new overlay.ConnectionPositionPair({ originX: 'center', originY: 'bottom' }, { overlayX: 'center', overlayY: 'top' }),
        bottomLeft: new overlay.ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),
        bottomRight: new overlay.ConnectionPositionPair({ originX: 'end', originY: 'bottom' }, { overlayX: 'end', overlayY: 'top' }),
        left: new overlay.ConnectionPositionPair({ originX: 'start', originY: 'center' }, {
            overlayX: 'end',
            overlayY: 'center'
        }),
        leftTop: new overlay.ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'top' }),
        leftBottom: new overlay.ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'end', overlayY: 'bottom' })
    };
    /** @type {?} */
    var DEFAULT_TOOLTIP_POSITIONS = [POSITION_MAP.top, POSITION_MAP.right, POSITION_MAP.bottom, POSITION_MAP.left];
    /** @type {?} */
    var DEFAULT_DROPDOWN_POSITIONS = [
        POSITION_MAP.bottomLeft,
        POSITION_MAP.bottomRight,
        POSITION_MAP.topLeft,
        POSITION_MAP.topRight
    ];
    /** @type {?} */
    var DEFAULT_SUBMENU_POSITIONS = [POSITION_MAP.rightTop, POSITION_MAP.leftTop];
    /** @type {?} */
    var DEFAULT_CASCADER_POSITIONS = [
        POSITION_MAP.bottomLeft,
        POSITION_MAP.bottomRight,
        POSITION_MAP.topLeft,
        POSITION_MAP.topRight
    ];
    /** @type {?} */
    var DEFAULT_MENTION_POSITIONS = [
        POSITION_MAP.bottomLeft,
        new overlay.ConnectionPositionPair({
            originX: 'start',
            originY: 'bottom'
        }, { overlayX: 'start', overlayY: 'bottom' })
    ];
    /**
     * @param {?} position
     * @return {?}
     */
    function getPlacementName(position) {
        /** @type {?} */
        var keyList = ['originX', 'originY', 'overlayX', 'overlayY'];
        var _loop_1 = function (placement) {
            // @ts-ignore
            if (keyList.every(( /**
             * @param {?} key
             * @return {?}
             */function (key) { return position.connectionPair[key] === POSITION_MAP[placement][key]; }))) {
                return { value: placement };
            }
        };
        for (var placement in POSITION_MAP) {
            var state_1 = _loop_1(placement);
            if (typeof state_1 === "object")
                return state_1.value;
        }
    }

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    // tslint:disable:no-any typedef no-invalid-this
    /** @type {?} */
    var availablePrefixes = ['moz', 'ms', 'webkit'];
    /**
     * @return {?}
     */
    function requestAnimationFramePolyfill() {
        /** @type {?} */
        var lastTime = 0;
        return ( /**
         * @param {?} callback
         * @return {?}
         */function (callback) {
            /** @type {?} */
            var currTime = new Date().getTime();
            /** @type {?} */
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            /** @type {?} */
            var id = setTimeout(( /**
             * @return {?}
             */function () {
                callback(currTime + timeToCall);
            }), timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        });
    }
    /**
     * @return {?}
     */
    function getRequestAnimationFrame() {
        if (typeof window === 'undefined') {
            return ( /**
             * @return {?}
             */function () { return 0; });
        }
        if (window.requestAnimationFrame) {
            // https://github.com/vuejs/vue/issues/4465
            return window.requestAnimationFrame.bind(window);
        }
        /** @type {?} */
        var prefix = availablePrefixes.filter(( /**
         * @param {?} key
         * @return {?}
         */function (key) { return key + "RequestAnimationFrame" in window; }))[0];
        return prefix ? (( /** @type {?} */(window)))[prefix + "RequestAnimationFrame"] : requestAnimationFramePolyfill();
    }
    /**
     * @param {?} id
     * @return {?}
     */
    function cancelRequestAnimationFrame(id) {
        if (typeof window === 'undefined') {
            return null;
        }
        if (window.cancelAnimationFrame) {
            return window.cancelAnimationFrame(id);
        }
        /** @type {?} */
        var prefix = availablePrefixes.filter(( /**
         * @param {?} key
         * @return {?}
         */function (key) { return key + "CancelAnimationFrame" in window || key + "CancelRequestAnimationFrame" in window; }))[0];
        return prefix
            ? ((( /** @type {?} */(window)))[prefix + "CancelAnimationFrame"] || (( /** @type {?} */(window)))[prefix + "CancelRequestAnimationFrame"])
                // @ts-ignore
                .call(this, id)
            : clearTimeout(id);
    }
    /** @type {?} */
    var reqAnimFrame = getRequestAnimationFrame();

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @param {?} t
     * @param {?} b
     * @param {?} c
     * @param {?} d
     * @return {?}
     */
    function easeInOutCubic(t, b, c, d) {
        /** @type {?} */
        var cc = c - b;
        /** @type {?} */
        var tt = t / (d / 2);
        if (tt < 1) {
            return (cc / 2) * tt * tt * tt + b;
        }
        else {
            return (cc / 2) * ((tt -= 2) * tt * tt + 2) + b;
        }
    }
    var NzScrollService = /** @class */ (function () {
        /* tslint:disable-next-line:no-any */
        function NzScrollService(doc) {
            this.doc = doc;
        }
        /** 设置 `el` 滚动条位置 */
        /**
         * 设置 `el` 滚动条位置
         * @param {?} el
         * @param {?=} topValue
         * @return {?}
         */
        NzScrollService.prototype.setScrollTop = /**
         * 设置 `el` 滚动条位置
         * @param {?} el
         * @param {?=} topValue
         * @return {?}
         */
            function (el, topValue) {
                if (topValue === void 0) {
                    topValue = 0;
                }
                if (el === window) {
                    this.doc.body.scrollTop = topValue;
                    ( /** @type {?} */(this.doc.documentElement)).scrollTop = topValue;
                }
                else {
                    (( /** @type {?} */(el))).scrollTop = topValue;
                }
            };
        /** 获取 `el` 相对于视窗距离 */
        /**
         * 获取 `el` 相对于视窗距离
         * @param {?} el
         * @return {?}
         */
        NzScrollService.prototype.getOffset = /**
         * 获取 `el` 相对于视窗距离
         * @param {?} el
         * @return {?}
         */
            function (el) {
                /** @type {?} */
                var ret = {
                    top: 0,
                    left: 0
                };
                if (!el || !el.getClientRects().length) {
                    return ret;
                }
                /** @type {?} */
                var rect = el.getBoundingClientRect();
                if (rect.width || rect.height) {
                    /** @type {?} */
                    var doc = ( /** @type {?} */(el.ownerDocument)).documentElement;
                    ret.top = rect.top - ( /** @type {?} */(doc)).clientTop;
                    ret.left = rect.left - ( /** @type {?} */(doc)).clientLeft;
                }
                else {
                    ret.top = rect.top;
                    ret.left = rect.left;
                }
                return ret;
            };
        /** 获取 `el` 滚动条位置 */
        // TODO: remove '| Window' as the fallback already happens here
        /**
         * 获取 `el` 滚动条位置
         * @param {?=} el
         * @param {?=} top
         * @return {?}
         */
        // TODO: remove '| Window' as the fallback already happens here
        NzScrollService.prototype.getScroll = /**
         * 获取 `el` 滚动条位置
         * @param {?=} el
         * @param {?=} top
         * @return {?}
         */
            // TODO: remove '| Window' as the fallback already happens here
            function (el, top) {
                if (top === void 0) {
                    top = true;
                }
                /** @type {?} */
                var target = el ? el : window;
                /** @type {?} */
                var prop = top ? 'pageYOffset' : 'pageXOffset';
                /** @type {?} */
                var method = top ? 'scrollTop' : 'scrollLeft';
                /** @type {?} */
                var isWindow = target === window;
                // @ts-ignore
                /** @type {?} */
                var ret = isWindow ? target[prop] : target[method];
                if (isWindow && typeof ret !== 'number') {
                    ret = ( /** @type {?} */(this.doc.documentElement))[method];
                }
                return ret;
            };
        /**
         * 使用动画形式将 `el` 滚动至某位置
         *
         * @param containerEl 容器,默认 `window`
         * @param targetTopValue 滚动至目标 `top` 值,默认:0,相当于顶部
         * @param easing 动作算法,默认:`easeInOutCubic`
         * @param callback 动画结束后回调
         */
        /**
         * 使用动画形式将 `el` 滚动至某位置
         *
         * @param {?} containerEl 容器,默认 `window`
         * @param {?=} targetTopValue 滚动至目标 `top` 值,默认:0,相当于顶部
         * @param {?=} easing 动作算法,默认:`easeInOutCubic`
         * @param {?=} callback 动画结束后回调
         * @return {?}
         */
        NzScrollService.prototype.scrollTo = /**
         * 使用动画形式将 `el` 滚动至某位置
         *
         * @param {?} containerEl 容器,默认 `window`
         * @param {?=} targetTopValue 滚动至目标 `top` 值,默认:0,相当于顶部
         * @param {?=} easing 动作算法,默认:`easeInOutCubic`
         * @param {?=} callback 动画结束后回调
         * @return {?}
         */
            function (containerEl, targetTopValue, easing, callback) {
                var _this = this;
                if (targetTopValue === void 0) {
                    targetTopValue = 0;
                }
                /** @type {?} */
                var target = containerEl ? containerEl : window;
                /** @type {?} */
                var scrollTop = this.getScroll(target);
                /** @type {?} */
                var startTime = Date.now();
                /** @type {?} */
                var frameFunc = ( /**
                 * @return {?}
                 */function () {
                    /** @type {?} */
                    var timestamp = Date.now();
                    /** @type {?} */
                    var time = timestamp - startTime;
                    _this.setScrollTop(target, (easing || easeInOutCubic)(time, scrollTop, targetTopValue, 450));
                    if (time < 450) {
                        reqAnimFrame(frameFunc);
                    }
                    else {
                        if (callback) {
                            callback();
                        }
                    }
                });
                reqAnimFrame(frameFunc);
            };
        NzScrollService.decorators = [
            { type: i0.Injectable }
        ];
        /** @nocollapse */
        NzScrollService.ctorParameters = function () {
            return [
                { type: undefined, decorators: [{ type: i0.Inject, args: [i1.DOCUMENT,] }] }
            ];
        };
        return NzScrollService;
    }());
    /**
     * @param {?} doc
     * @param {?} scrollService
     * @return {?}
     */
    function SCROLL_SERVICE_PROVIDER_FACTORY(doc, scrollService) {
        return scrollService || new NzScrollService(doc);
    }
    /** @type {?} */
    var SCROLL_SERVICE_PROVIDER = {
        provide: NzScrollService,
        useFactory: SCROLL_SERVICE_PROVIDER_FACTORY,
        deps: [i1.DOCUMENT, [new i0.Optional(), new i0.SkipSelf(), NzScrollService]]
    };

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    // tslint:disable-next-line:no-any
    /**
     * @param {?} value
     * @return {?}
     */
    function isNotNil(value) {
        return typeof value !== 'undefined' && value !== null;
    }
    // tslint:disable-next-line:no-any
    /**
     * @param {?} value
     * @return {?}
     */
    function isNil(value) {
        return typeof value === 'undefined' || value === null;
    }
    /**
     * Examine if two objects are shallowly equaled.
     * @param {?=} objA
     * @param {?=} objB
     * @return {?}
     */
    function shallowEqual(objA, objB) {
        if (objA === objB) {
            return true;
        }
        if (typeof objA !== 'object' || !objA || typeof objB !== 'object' || !objB) {
            return false;
        }
        /** @type {?} */
        var keysA = Object.keys(objA);
        /** @type {?} */
        var keysB = Object.keys(objB);
        if (keysA.length !== keysB.length) {
            return false;
        }
        /** @type {?} */
        var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
        // tslint:disable-next-line:prefer-for-of
        for (var idx = 0; idx < keysA.length; idx++) {
            /** @type {?} */
            var key = keysA[idx];
            if (!bHasOwnProperty(key)) {
                return false;
            }
            if (objA[key] !== objB[key]) {
                return false;
            }
        }
        return true;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    function isInteger(value) {
        return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
    }
    /**
     * @param {?} element
     * @return {?}
     */
    function isEmpty(element) {
        /** @type {?} */
        var nodes = element.childNodes;
        for (var i = 0; i < nodes.length; i++) {
            if (filterNotEmptyNode(nodes.item(i))) {
                return false;
            }
        }
        return true;
    }
    /**
     * @param {?} node
     * @return {?}
     */
    function filterNotEmptyNode(node) {
        if (node) {
            if (node.nodeType === 1 && (( /** @type {?} */(node))).outerHTML.toString().trim().length !== 0) {
                // ELEMENT_NODE
                return node;
            }
            else if (node.nodeType === 3 && ( /** @type {?} */(node.textContent)).toString().trim().length !== 0) {
                // TEXT_NODE
                return node;
            }
            return null;
        }
        return null;
    }
    // tslint:disable-next-line:no-any
    /**
     * @param {?} value
     * @return {?}
     */
    function isNonEmptyString(value) {
        return typeof value === 'string' && value !== '';
    }
    // tslint:disable-next-line:no-any
    /**
     * @param {?} value
     * @return {?}
     */
    function isTemplateRef(value) {
        return value instanceof i0.TemplateRef;
    }
    // tslint:disable-next-line:no-any
    /**
     * @param {?} value
     * @return {?}
     */
    function isComponent(value) {
        return value instanceof i0.Type;
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzMeasureScrollbarService = /** @class */ (function () {
        // tslint:disable-next-line:no-any
        function NzMeasureScrollbarService(document) {
            this.document = document;
            this.scrollbarMeasure = {
                position: 'absolute',
                top: '-9999px',
                width: '50px',
                height: '50px',
                overflow: 'scroll'
            };
            this.initScrollBarWidth();
        }
        Object.defineProperty(NzMeasureScrollbarService.prototype, "scrollBarWidth", {
            get: /**
             * @return {?}
             */ function () {
                if (isNotNil(this._scrollbarWidth)) {
                    return this._scrollbarWidth;
                }
                this.initScrollBarWidth();
                return this._scrollbarWidth;
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @return {?}
         */
        NzMeasureScrollbarService.prototype.initScrollBarWidth = /**
         * @return {?}
         */
            function () {
                /** @type {?} */
                var scrollDiv = this.document.createElement('div');
                for (var scrollProp in this.scrollbarMeasure) {
                    if (this.scrollbarMeasure.hasOwnProperty(scrollProp)) {
                        scrollDiv.style[scrollProp] = this.scrollbarMeasure[scrollProp];
                    }
                }
                this.document.body.appendChild(scrollDiv);
                /** @type {?} */
                var width = scrollDiv.offsetWidth - scrollDiv.clientWidth;
                this.document.body.removeChild(scrollDiv);
                this._scrollbarWidth = width;
            };
        NzMeasureScrollbarService.decorators = [
            { type: i0.Injectable, args: [{
                        providedIn: 'root'
                    },] }
        ];
        /** @nocollapse */
        NzMeasureScrollbarService.ctorParameters = function () {
            return [
                { type: undefined, decorators: [{ type: i0.Inject, args: [i1.DOCUMENT,] }] }
            ];
        };
        /** @nocollapse */ NzMeasureScrollbarService.ngInjectableDef = i0.defineInjectable({ factory: function NzMeasureScrollbarService_Factory() { return new NzMeasureScrollbarService(i0.inject(i1.DOCUMENT)); }, token: NzMeasureScrollbarService, providedIn: "root" });
        return NzMeasureScrollbarService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzUpdateHostClassService = /** @class */ (function () {
        function NzUpdateHostClassService(rendererFactory2) {
            this.classMap = {};
            this.renderer = rendererFactory2.createRenderer(null, null);
        }
        /**
         * @param {?} el
         * @param {?} classMap
         * @return {?}
         */
        NzUpdateHostClassService.prototype.updateHostClass = /**
         * @param {?} el
         * @param {?} classMap
         * @return {?}
         */
            function (el, classMap) {
                this.removeClass(el, this.classMap, this.renderer);
                this.classMap = __assign({}, classMap);
                this.addClass(el, this.classMap, this.renderer);
            };
        /**
         * @private
         * @param {?} el
         * @param {?} classMap
         * @param {?} renderer
         * @return {?}
         */
        NzUpdateHostClassService.prototype.removeClass = /**
         * @private
         * @param {?} el
         * @param {?} classMap
         * @param {?} renderer
         * @return {?}
         */
            function (el, classMap, renderer) {
                for (var i in classMap) {
                    if (classMap.hasOwnProperty(i)) {
                        renderer.removeClass(el, i);
                    }
                }
            };
        /**
         * @private
         * @param {?} el
         * @param {?} classMap
         * @param {?} renderer
         * @return {?}
         */
        NzUpdateHostClassService.prototype.addClass = /**
         * @private
         * @param {?} el
         * @param {?} classMap
         * @param {?} renderer
         * @return {?}
         */
            function (el, classMap, renderer) {
                for (var i in classMap) {
                    if (classMap.hasOwnProperty(i) && classMap[i]) {
                        renderer.addClass(el, i);
                    }
                }
            };
        NzUpdateHostClassService.decorators = [
            { type: i0.Injectable }
        ];
        /** @nocollapse */
        NzUpdateHostClassService.ctorParameters = function () {
            return [
                { type: i0.RendererFactory2 }
            ];
        };
        return NzUpdateHostClassService;
    }());

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * Creates a browser MouseEvent with the specified options.
     * @param {?} type
     * @param {?=} x
     * @param {?=} y
     * @return {?}
     */
    function createMouseEvent(type, x, y) {
        if (x === void 0) {
            x = 0;
        }
        if (y === void 0) {
            y = 0;
        }
        /** @type {?} */
        var event = document.createEvent('MouseEvent');
        event.initMouseEvent(type, false /* canBubble */, false /* cancelable */, window /* view */, 0 /* detail */, x /* screenX */, y /* screenY */, x /* clientX */, y /* clientY */, false /* ctrlKey */, false /* altKey */, false /* shiftKey */, false /* metaKey */, 0 /* button */, null /* relatedTarget */);
        return event;
    }
    /**
     * Creates a browser TouchEvent with the specified pointer coordinates.
     * @param {?} type
     * @param {?=} pageX
     * @param {?=} pageY
     * @return {?}
     */
    function createTouchEvent(type, pageX, pageY) {
        if (pageX === void 0) {
            pageX = 0;
        }
        if (pageY === void 0) {
            pageY = 0;
        }
        // In favor of creating events that work for most of the browsers, the event is created
        // as a basic UI Event. The necessary details for the event will be set manually.
        /** @type {?} */
        var event = document.createEvent('UIEvent');
        /** @type {?} */
        var touchDetails = { pageX: pageX, pageY: pageY };
        event.initUIEvent(type, true, true, window, 0);
        // Most of the browsers don't have a "initTouchEvent" method that can be used to define
        // the touch details.
        Object.defineProperties(event, {
            touches: { value: [touchDetails] }
        });
        return ( /** @type {?} */(event));
    }
    /**
     * Dispatches a keydown event from an element.
     * @param {?} type
     * @param {?} keyCode
     * @param {?=} target
     * @param {?=} key
     * @return {?}
     */
    function createKeyboardEvent(type, keyCode, target, key) {
        /** @type {?} */
        var event = ( /** @type {?} */(document.createEvent('KeyboardEvent')));
        // Firefox does not support `initKeyboardEvent`, but supports `initKeyEvent`.
        /** @type {?} */
        var initEventFn = (event.initKeyEvent || event.initKeyboardEvent).bind(event);
        /** @type {?} */
        var originalPreventDefault = event.preventDefault;
        initEventFn(type, true, true, window, 0, 0, 0, 0, 0, keyCode);
        // Webkit Browsers don't set the keyCode when calling the init function.
        // See related bug https://bugs.webkit.org/show_bug.cgi?id=16735
        Object.defineProperties(event, {
            keyCode: { get: ( /**
                     * @return {?}
                     */function () { return keyCode; }) },
            key: { get: ( /**
                     * @return {?}
                     */function () { return key; }) },
            target: { get: ( /**
                     * @return {?}
                     */function () { return target; }) }
        });
        // IE won't set `defaultPrevented` on synthetic events so we need to do it manually.
        event.preventDefault = ( /**
         * @return {?}
         */function () {
            Object.defineProperty(event, 'defaultPrevented', { get: ( /**
                     * @return {?}
                     */function () { return true; }) });
            return originalPreventDefault.apply(this, arguments);
        });
        return event;
    }
    /**
     * Creates a fake event object with any desired event type.
     * @param {?} type
     * @param {?=} canBubble
     * @param {?=} cancelable
     * @return {?}
     */
    function createFakeEvent(type, canBubble, cancelable) {
        if (canBubble === void 0) {
            canBubble = true;
        }
        if (cancelable === void 0) {
            cancelable = true;
        }
        /** @type {?} */
        var event = document.createEvent('Event');
        event.initEvent(type, canBubble, cancelable);
        return event;
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * Utility to dispatch any event on a Node.
     * @param {?} node
     * @param {?} event
     * @return {?}
     */
    function dispatchEvent(node, event) {
        node.dispatchEvent(event);
        return event;
    }
    /**
     * Shorthand to dispatch a fake event on a specified node.
     * @param {?} node
     * @param {?} type
     * @param {?=} canBubble
     * @return {?}
     */
    function dispatchFakeEvent(node, type, canBubble) {
        return dispatchEvent(node, createFakeEvent(type, canBubble));
    }
    /**
     * Shorthand to dispatch a keyboard event with a specified key code.
     * @param {?} node
     * @param {?} type
     * @param {?} keyCode
     * @param {?=} target
     * @return {?}
     */
    function dispatchKeyboardEvent(node, type, keyCode, target) {
        return ( /** @type {?} */(dispatchEvent(node, createKeyboardEvent(type, keyCode, target))));
    }
    /**
     * Shorthand to dispatch a mouse event on the specified coordinates.
     * @param {?} node
     * @param {?} type
     * @param {?=} x
     * @param {?=} y
     * @param {?=} event
     * @return {?}
     */
    function dispatchMouseEvent(node, type, x, y, event) {
        if (x === void 0) {
            x = 0;
        }
        if (y === void 0) {
            y = 0;
        }
        if (event === void 0) {
            event = createMouseEvent(type, x, y);
        }
        return ( /** @type {?} */(dispatchEvent(node, event)));
    }
    /**
     * Shorthand to dispatch a touch event on the specified coordinates.
     * @param {?} node
     * @param {?} type
     * @param {?=} x
     * @param {?=} y
     * @return {?}
     */
    function dispatchTouchEvent(node, type, x, y) {
        if (x === void 0) {
            x = 0;
        }
        if (y === void 0) {
            y = 0;
        }
        return ( /** @type {?} */(dispatchEvent(node, createTouchEvent(type, x, y))));
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * Focuses an input, sets its value and dispatches
     * the `input` event, simulating the user typing.
     * @param {?} value Value to be set on the input.
     * @param {?} element Element onto which to set the value.
     * @return {?}
     */
    function typeInElement(value, element) {
        element.focus();
        element.value = value;
        dispatchFakeEvent(element, 'input');
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * Gets a RegExp used to detect an angular wrapped error message.
     * See https://github.com/angular/angular/issues/8348
     * @param {?} e
     * @return {?}
     */
    function wrappedErrorMessage(e) {
        /** @type {?} */
        var escapedMessage = e.message.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
        return new RegExp(escapedMessage);
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Google LLC All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://angular.io/license
     */
    /**
     * \@docs-private
     */
    var /**
     * \@docs-private
     */ FakeViewportRuler = /** @class */ (function () {
        function FakeViewportRuler() {
        }
        /**
         * @return {?}
         */
        FakeViewportRuler.prototype.getViewportRect = /**
         * @return {?}
         */
            function () {
                return {
                    left: 0,
                    top: 0,
                    width: 1014,
                    height: 686,
                    bottom: 686,
                    right: 1014
                };
            };
        /**
         * @return {?}
         */
        FakeViewportRuler.prototype.getViewportSize = /**
         * @return {?}
         */
            function () {
                return { width: 1014, height: 686 };
            };
        /**
         * @return {?}
         */
        FakeViewportRuler.prototype.getViewportScrollPosition = /**
         * @return {?}
         */
            function () {
                return { top: 0, left: 0 };
            };
        return FakeViewportRuler;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * Mock synchronous NgZone implementation that can be used
     * to flush out `onStable` subscriptions in tests.
     *
     * via: https://github.com/angular/angular/blob/master/packages/core/testing/src/ng_zone_mock.ts
     * \@docs-private
     */
    var MockNgZone = /** @class */ (function (_super) {
        __extends(MockNgZone, _super);
        function MockNgZone() {
            var _this = _super.call(this, { enableLongStackTrace: false }) || this;
            _this.onStable = new i0.EventEmitter(false);
            return _this;
        }
        /**
         * @param {?} fn
         * @return {?}
         */
        MockNgZone.prototype.run = /**
         * @param {?} fn
         * @return {?}
         */
            function (fn) {
                return fn();
            };
        /**
         * @param {?} fn
         * @return {?}
         */
        MockNgZone.prototype.runOutsideAngular = /**
         * @param {?} fn
         * @return {?}
         */
            function (fn) {
                return fn();
            };
        /**
         * @return {?}
         */
        MockNgZone.prototype.simulateZoneExit = /**
         * @return {?}
         */
            function () {
                this.onStable.emit(null);
            };
        MockNgZone.decorators = [
            { type: i0.Injectable }
        ];
        /** @nocollapse */
        MockNgZone.ctorParameters = function () { return []; };
        return MockNgZone;
    }(i0.NgZone));

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzTreeNode = /** @class */ (function () {
        function NzTreeNode(option, parent, service) {
            if (parent === void 0) {
                parent = null;
            }
            if (service === void 0) {
                service = null;
            }
            var _this = this;
            this.level = 0;
            if (option instanceof NzTreeNode) {
                return option;
            }
            this.service = service || null;
            this.origin = option;
            this.key = option.key;
            this.parentNode = parent;
            this._title = option.title || '---';
            this._icon = option.icon || '';
            this._isLeaf = option.isLeaf || false;
            this._children = [];
            // option params
            this._isChecked = option.checked || false;
            this._isSelectable = option.disabled || option.selectable !== false;
            this._isDisabled = option.disabled || false;
            this._isDisableCheckbox = option.disableCheckbox || false;
            this._isExpanded = option.isLeaf ? false : option.expanded || false;
            this._isHalfChecked = false;
            this._isSelected = (!option.disabled && option.selected) || false;
            this._isLoading = false;
            this.isMatched = false;
            /**
             * parent's checked status will affect children while initializing
             */
            if (parent) {
                this.level = parent.level + 1;
            }
            else {
                this.level = 0;
            }
            if (typeof option.children !== 'undefined' && option.children !== null) {
                option.children.forEach(( /**
                 * @param {?} nodeOptions
                 * @return {?}
                 */function (nodeOptions) {
                    /** @type {?} */
                    var s = _this.treeService;
                    if (s &&
                        !s.isCheckStrictly &&
                        option.checked &&
                        !option.disabled &&
                        !nodeOptions.disabled &&
                        !nodeOptions.disableCheckbox) {
                        nodeOptions.checked = option.checked;
                    }
                    _this._children.push(new NzTreeNode(nodeOptions, _this));
                }));
            }
        }
        Object.defineProperty(NzTreeNode.prototype, "treeService", {
            get: /**
             * @return {?}
             */ function () {
                return this.service || (this.parentNode && this.parentNode.treeService);
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "title", {
            /**
             * auto generate
             * get
             * set
             */
            get: /**
             * auto generate
             * get
             * set
             * @return {?}
             */ function () {
                return this._title;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._title = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "icon", {
            get: /**
             * @return {?}
             */ function () {
                return this._icon;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._icon = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "children", {
            get: /**
             * @return {?}
             */ function () {
                return this._children;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._children = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isLeaf", {
            get: /**
             * @return {?}
             */ function () {
                return this._isLeaf;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isLeaf = value;
                // this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isChecked", {
            get: /**
             * @return {?}
             */ function () {
                return this._isChecked;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isChecked = value;
                this._isAllChecked = value;
                this.origin.checked = value;
                this.afterValueChange('isChecked');
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isAllChecked", {
            get: /**
             * @return {?}
             */ function () {
                return this._isAllChecked;
            },
            /**
             * @deprecated Maybe removed in next major version, use isChecked instead
             */
            set: /**
             * @deprecated Maybe removed in next major version, use isChecked instead
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isAllChecked = value;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isHalfChecked", {
            get: /**
             * @return {?}
             */ function () {
                return this._isHalfChecked;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isHalfChecked = value;
                this.afterValueChange('isHalfChecked');
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isSelectable", {
            get: /**
             * @return {?}
             */ function () {
                return this._isSelectable;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isSelectable = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isDisabled", {
            get: /**
             * @return {?}
             */ function () {
                return this._isDisabled;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isDisabled = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isDisableCheckbox", {
            get: /**
             * @return {?}
             */ function () {
                return this._isDisableCheckbox;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isDisableCheckbox = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isExpanded", {
            get: /**
             * @return {?}
             */ function () {
                return this._isExpanded;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isExpanded = value;
                this.origin.expanded = value;
                this.afterValueChange('isExpanded');
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isSelected", {
            get: /**
             * @return {?}
             */ function () {
                return this._isSelected;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isSelected = value;
                this.origin.selected = value;
                this.afterValueChange('isSelected');
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(NzTreeNode.prototype, "isLoading", {
            get: /**
             * @return {?}
             */ function () {
                return this._isLoading;
            },
            set: /**
             * @param {?} value
             * @return {?}
             */ function (value) {
                this._isLoading = value;
                this.update();
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @param {?=} checked
         * @param {?=} halfChecked
         * @return {?}
         */
        NzTreeNode.prototype.setSyncChecked = /**
         * @param {?=} checked
         * @param {?=} halfChecked
         * @return {?}
         */
            function (checked, halfChecked) {
                if (checked === void 0) {
                    checked = false;
                }
                if (halfChecked === void 0) {
                    halfChecked = false;
                }
                this.setChecked(checked, halfChecked);
                if (this.treeService && !this.treeService.isCheckStrictly) {
                    this.treeService.conduct(this);
                }
            };
        /**
         * @deprecated Maybe removed in next major version, use isChecked instead
         */
        /**
         * @deprecated Maybe removed in next major version, use isChecked instead
         * @param {?=} checked
         * @param {?=} halfChecked
         * @return {?}
         */
        NzTreeNode.prototype.setChecked = /**
         * @deprecated Maybe removed in next major version, use isChecked instead
         * @param {?=} checked
         * @param {?=} halfChecked
         * @return {?}
         */
            function (checked, halfChecked) {
                if (checked === void 0) {
                    checked = false;
                }
                if (halfChecked === void 0) {
                    halfChecked = false;
                }
                this.origin.checked = checked;
                this.isChecked = checked;
                this.isAllChecked = checked;
                this.isHalfChecked = halfChecked;
            };
        /**
         * @deprecated Maybe removed in next major version, use isExpanded instead
         */
        /**
         * @deprecated Maybe removed in next major version, use isExpanded instead
         * @param {?} value
         * @return {?}
         */
        NzTreeNode.prototype.setExpanded = /**
         * @deprecated Maybe removed in next major version, use isExpanded instead
         * @param {?} value
         * @return {?}
         */
            function (value) {
                this.isExpanded = value;
            };
        /**
         * @deprecated Maybe removed in next major version, use isSelected instead
         */
        /**
         * @deprecated Maybe removed in next major version, use isSelected instead
         * @param {?} value
         * @return {?}
         */
        NzTreeNode.prototype.setSelected = /**
         * @deprecated Maybe removed in next major version, use isSelected instead
         * @param {?} value
         * @return {?}
         */
            function (value) {
                if (this.isDisabled) {
                    return;
                }
                this.isSelected = value;
            };
        /**
         * @return {?}
         */
        NzTreeNode.prototype.getParentNode = /**
         * @return {?}
         */
            function () {
                return this.parentNode;
            };
        /**
         * @return {?}
         */
        NzTreeNode.prototype.getChildren = /**
         * @return {?}
         */
            function () {
                return this.children;
            };
        /**
         * 支持按索引位置插入,叶子节点不可添加
         */
        // tslint:disable-next-line:no-any
        /**
         * 支持按索引位置插入,叶子节点不可添加
         * @param {?} children
         * @param {?=} childPos
         * @return {?}
         */
        // tslint:disable-next-line:no-any
        NzTreeNode.prototype.addChildren = /**
         * 支持按索引位置插入,叶子节点不可添加
         * @param {?} children
         * @param {?=} childPos
         * @return {?}
         */
            // tslint:disable-next-line:no-any
            function (children, childPos) {
                var _this = this;
                if (childPos === void 0) {
                    childPos = -1;
                }
                if (!this.isLeaf) {
                    children.forEach(( /**
                     * @param {?} node
                     * @return {?}
                     */function (node) {
                        /** @type {?} */
                        var refreshLevel = ( /**
                         * @param {?} n
                         * @return {?}
                         */function (n) {
                            n.getChildren().forEach(( /**
                             * @param {?} c
                             * @return {?}
                             */function (c) {
                                c.level = ( /** @type {?} */(c.getParentNode())).level + 1;
                                // flush origin
                                c.origin.level = c.level;
                                refreshLevel(c);
                            }));
                        });
                        /** @type {?} */
                        var child = node;
                        if (child instanceof NzTreeNode) {
                            child.parentNode = _this;
                        }
                        else {
                            child = new NzTreeNode(node, _this);
                        }
                        child.level = _this.level + 1;
                        child.origin.level = child.level;
                        refreshLevel(child);
                        try {
                            childPos === -1 ? _this.children.push(child) : _this.children.splice(childPos, 0, child);
                            // flush origin
                        }
                        catch (e) { }
                    }));
                    this.origin.children = this.getChildren().map(( /**
                     * @param {?} v
                     * @return {?}
                     */function (v) { return v.origin; }));
                    // remove loading state
                    this.isLoading = false;
                }
            };
        /**
         * @return {?}
         */
        NzTreeNode.prototype.clearChildren = /**
         * @return {?}
         */
            function () {
                // refresh checked state
                this.afterValueChange('clearChildren');
                this.children = [];
                this.origin.children = [];
            };
        /**
         * @return {?}
         */
        NzTreeNode.prototype.remove = /**
         * @return {?}
         */
            function () {
                var _this = this;
                /** @type {?} */
                var parentNode = this.getParentNode();
                if (parentNode) {
                    parentNode.children = parentNode.getChildren().filter(( /**
                     * @param {?} v
                     * @return {?}
                     */function (v) { return v.key !== _this.key; }));
                    parentNode.origin.children = ( /** @type {?} */(parentNode.origin.children)).filter(( /**
                     * @param {?} v
                     * @return {?}
                     */function (v) { return v.key !== _this.key; }));
                    this.afterValueChange('remove');
                }
            };
        /**
         * @param {?} key
         * @return {?}
         */
        NzTreeNode.prototype.afterValueChange = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                if (this.treeService) {
                    switch (key) {
                        case 'isChecked':
                            this.treeService.setCheckedNodeList(this);
                            break;
                        case 'isHalfChecked':
                            this.treeService.setHalfCheckedNodeList(this);
                            break;
                        case 'isExpanded':
                            this.treeService.setExpandedNodeList(this);
                            break;
                        case 'isSelected':
                            this.treeService.setNodeActive(this);
                            break;
                        case 'clearChildren':
                            this.treeService.afterRemove(this.getChildren());
                            break;
                        case 'remove':
                            this.treeService.afterRemove([this]);
                            break;
                    }
                }
                this.update();
            };
        /**
         * @return {?}
         */
        NzTreeNode.prototype.update = /**
         * @return {?}
         */
            function () {
                if (this.component) {
                    this.component.setClassMap();
                    this.component.markForCheck();
                }
            };
        return NzTreeNode;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /**
     * @template T
     * @param {?} value
     * @return {?}
     */
    function toArray(value) {
        /** @type {?} */
        var ret;
        if (value == null) {
            ret = [];
        }
        else if (!Array.isArray(value)) {
            ret = [value];
        }
        else {
            ret = value;
        }
        return ret;
    }
    /**
     * @template T
     * @param {?} array1
     * @param {?} array2
     * @return {?}
     */
    function arraysEqual(array1, array2) {
        if (!array1 || !array2 || array1.length !== array2.length) {
            return false;
        }
        /** @type {?} */
        var len = array1.length;
        for (var i = 0; i < len; i++) {
            if (array1[i] !== array2[i]) {
                return false;
            }
        }
        return true;
    }
    /**
     * @template T
     * @param {?} source
     * @return {?}
     */
    function shallowCopyArray(source) {
        return source.slice();
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * Silent an event by stopping and preventing it.
     * @param {?} e
     * @return {?}
     */
    function silentEvent(e) {
        e.stopPropagation();
        e.preventDefault();
    }
    /**
     * @param {?} elem
     * @return {?}
     */
    function getElementOffset(elem) {
        if (!elem.getClientRects().length) {
            return { top: 0, left: 0 };
        }
        /** @type {?} */
        var rect = elem.getBoundingClientRect();
        /** @type {?} */
        var win = ( /** @type {?} */(elem.ownerDocument)).defaultView;
        return {
            top: rect.top + ( /** @type {?} */(win)).pageYOffset,
            left: rect.left + ( /** @type {?} */(win)).pageXOffset
        };
    }
    /**
     * @param {?} element
     * @return {?}
     */
    function findFirstNotEmptyNode(element) {
        /** @type {?} */
        var children = element.childNodes;
        for (var i = 0; i < children.length; i++) {
            /** @type {?} */
            var node = children.item(i);
            if (filterNotEmptyNode(node)) {
                return node;
            }
        }
        return null;
    }
    /**
     * @param {?} element
     * @return {?}
     */
    function findLastNotEmptyNode(element) {
        /** @type {?} */
        var children = element.childNodes;
        for (var i = children.length - 1; i >= 0; i--) {
            /** @type {?} */
            var node = children.item(i);
            if (filterNotEmptyNode(node)) {
                return node;
            }
        }
        return null;
    }
    /**
     * @param {?} parent
     * @return {?}
     */
    function reverseChildNodes(parent) {
        /** @type {?} */
        var children = parent.childNodes;
        /** @type {?} */
        var length = children.length;
        if (length) {
            /** @type {?} */
            var nodes_1 = [];
            children.forEach(( /**
             * @param {?} node
             * @param {?} i
             * @return {?}
             */function (node, i) { return (nodes_1[i] = node); }));
            while (length--) {
                parent.appendChild(nodes_1[length]);
            }
        }
    }
    /**
     * Investigate if an event is a `TouchEvent`.
     * @param {?} event
     * @return {?}
     */
    function isTouchEvent(event) {
        return event.type.startsWith('touch');
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /**
     * @param {?} prefix
     * @return {?}
     */
    function getRegExp(prefix) {
        /** @type {?} */
        var prefixArray = Array.isArray(prefix) ? prefix : [prefix];
        /** @type {?} */
        var prefixToken = prefixArray.join('').replace(/(\$|\^)/g, '\\$1');
        if (prefixArray.length > 1) {
            prefixToken = "[" + prefixToken + "]";
        }
        return new RegExp("(\\s|^)(" + prefixToken + ")[^\\s]*", 'g');
    }
    /**
     * @param {?} value
     * @param {?=} prefix
     * @return {?}
     */
    function getMentions(value, prefix) {
        if (prefix === void 0) {
            prefix = '@';
        }
        if (typeof value !== 'string') {
            return [];
        }
        /** @type {?} */
        var regex = getRegExp(prefix);
        /** @type {?} */
        var mentions = value.match(regex);
        return mentions !== null ? mentions.map(( /**
         * @param {?} e
         * @return {?}
         */function (e) { return e.trim(); })) : [];
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /**
     * Much like lodash.
     * @param {?} toPad
     * @param {?} length
     * @param {?} element
     * @return {?}
     */
    function padStart(toPad, length, element) {
        if (toPad.length > length) {
            return toPad;
        }
        /** @type {?} */
        var joined = "" + getRepeatedElement(length, element) + toPad;
        return joined.slice(joined.length - length, joined.length);
    }
    /**
     * @param {?} toPad
     * @param {?} length
     * @param {?} element
     * @return {?}
     */
    function padEnd(toPad, length, element) {
        /** @type {?} */
        var joined = "" + toPad + getRepeatedElement(length, element);
        return joined.slice(0, length);
    }
    /**
     * @param {?} length
     * @param {?} element
     * @return {?}
     */
    function getRepeatedElement(length, element) {
        return Array(length)
            .fill(element)
            .join('');
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    // tslint:disable-next-line:no-any
    /**
     * @param {?} obj
     * @return {?}
     */
    function isPromise(obj) {
        return !!obj && typeof obj.then === 'function' && typeof obj.catch === 'function';
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /**
     * @param {?} min
     * @param {?} max
     * @param {?} value
     * @return {?}
     */
    function getPercent(min, max, value) {
        return ((value - min) / (max - min)) * 100;
    }
    /**
     * @param {?} num
     * @return {?}
     */
    function getPrecision(num) {
        /** @type {?} */
        var numStr = num.toString();
        /** @type {?} */
        var dotIndex = numStr.indexOf('.');
        return dotIndex >= 0 ? numStr.length - dotIndex - 1 : 0;
    }
    /**
     * @param {?} num
     * @param {?} min
     * @param {?} max
     * @return {?}
     */
    function ensureNumberInRange(num, min, max) {
        if (isNaN(num) || num < min) {
            return min;
        }
        else if (num > max) {
            return max;
        }
        else {
            return num;
        }
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /**
     * @param {?} node
     * @return {?}
     */
    function scrollIntoView(node) {
        /** @type {?} */
        var nodeAsAny = ( /** @type {?} */(node));
        if (nodeAsAny.scrollIntoViewIfNeeded) {
            /* tslint:disable-next-line:no-string-literal */
            nodeAsAny.scrollIntoViewIfNeeded(false);
            return;
        }
        if (node.scrollIntoView) {
            node.scrollIntoView(false);
            return;
        }
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    // from https://github.com/component/textarea-caret-position
    // We'll copy the properties below into the mirror div.
    // Note that some browsers, such as Firefox, do not concatenate properties
    // into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),
    // so we have to list every single property explicitly.
    /** @type {?} */
    var properties = [
        'direction',
        'boxSizing',
        'width',
        'height',
        'overflowX',
        'overflowY',
        'borderTopWidth',
        'borderRightWidth',
        'borderBottomWidth',
        'borderLeftWidth',
        'borderStyle',
        'paddingTop',
        'paddingRight',
        'paddingBottom',
        'paddingLeft',
        // https://developer.mozilla.org/en-US/docs/Web/CSS/font
        'fontStyle',
        'fontVariant',
        'fontWeight',
        'fontStretch',
        'fontSize',
        'fontSizeAdjust',
        'lineHeight',
        'fontFamily',
        'textAlign',
        'textTransform',
        'textIndent',
        'textDecoration',
        'letterSpacing',
        'wordSpacing',
        'tabSize',
        'MozTabSize'
    ];
    /** @type {?} */
    var isBrowser = typeof window !== 'undefined';
    // tslint:disable-next-line:no-any
    /** @type {?} */
    var isFirefox = isBrowser && (( /** @type {?} */(window))).mozInnerScreenX != null;
    /** @type {?} */
    var _parseInt = ( /**
     * @param {?} str
     * @return {?}
     */function (str) { return parseInt(str, 10); });
    /**
     * @param {?} element
     * @param {?} position
     * @param {?=} options
     * @return {?}
     */
    function getCaretCoordinates(element, position, options) {
        if (!isBrowser) {
            throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');
        }
        /** @type {?} */
        var debug = (options && options.debug) || false;
        if (debug) {
            /** @type {?} */
            var el = document.querySelector('#input-textarea-caret-position-mirror-div');
            if (el) {
                ( /** @type {?} */(el.parentNode)).removeChild(el);
            }
        }
        // The mirror div will replicate the textarea's style
        /** @type {?} */
        var div = document.createElement('div');
        div.id = 'input-textarea-caret-position-mirror-div';
        document.body.appendChild(div);
        /** @type {?} */
        var style = div.style;
        // tslint:disable-next-line:no-any
        /** @type {?} */
        var computed = window.getComputedStyle ? window.getComputedStyle(element) : (( /** @type {?} */(element))).currentStyle;
        // currentStyle for IE < 9
        /** @type {?} */
        var isInput = element.nodeName === 'INPUT';
        // Default textarea styles
        style.whiteSpace = 'pre-wrap';
        if (!isInput) {
            style.wordWrap = 'break-word'; // only for textarea-s
        }
        // Position off-screen
        style.position = 'absolute'; // required to return coordinates properly
        if (!debug) {
            style.visibility = 'hidden';
        } // not 'display: none' because we want rendering
        // Transfer the element's properties to the div
        properties.forEach(( /**
         * @param {?} prop
         * @return {?}
         */function (prop) {
            if (isInput && prop === 'lineHeight') {
                // Special case for <input>s because text is rendered centered and line height may be != height
                style.lineHeight = computed.height;
            }
            else {
                // @ts-ignore
                style[prop] = computed[prop];
            }
        }));
        if (isFirefox) {
            // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275
            if (element.scrollHeight > _parseInt(computed.height)) {
                style.overflowY = 'scroll';
            }
        }
        else {
            style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'
        }
        div.textContent = element.value.substring(0, position);
        // The second special handling for input type="text" vs textarea:
        // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037
        if (isInput) {
            div.textContent = div.textContent.replace(/\s/g, '\u00a0');
        }
        /** @type {?} */
        var span = document.createElement('span');
        // Wrapping must be replicated *exactly*, including when a long word gets
        // onto the next line, with whitespace at the end of the line before (#7).
        // The  *only* reliable way to do that is to copy the *entire* rest of the
        // textarea's content into the <span> created at the caret position.
        // For inputs, just '.' would be enough, but no need to bother.
        span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all
        div.appendChild(span);
        /** @type {?} */
        var coordinates = {
            top: span.offsetTop + _parseInt(computed.borderTopWidth),
            left: span.offsetLeft + _parseInt(computed.borderLeftWidth),
            height: _parseInt(computed.lineHeight)
        };
        if (debug) {
            span.style.backgroundColor = '#eee';
            createDebugEle(element, coordinates);
        }
        else {
            document.body.removeChild(div);
        }
        return coordinates;
    }
    /**
     * @param {?} element
     * @param {?} coordinates
     * @return {?}
     */
    function createDebugEle(element, coordinates) {
        /** @type {?} */
        var fontSize = getComputedStyle(element).getPropertyValue('font-size');
        /** @type {?} */
        var rect = (( /** @type {?} */(document.querySelector('#DEBUG')))) || document.createElement('div');
        document.body.appendChild(rect);
        rect.id = 'DEBUG';
        rect.style.position = 'absolute';
        rect.style.backgroundColor = 'red';
        rect.style.height = fontSize;
        rect.style.width = '1px';
        rect.style.top = element.getBoundingClientRect().top -
            element.scrollTop +
            window.pageYOffset +
            coordinates.top + "px";
        rect.style.left = element.getBoundingClientRect().left -
            element.scrollLeft +
            window.pageXOffset +
            coordinates.left + "px";
        console.log(rect.style.top);
        console.log(rect.style.left);
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @param {?} fn
     * @return {?}
     */
    function throttleByAnimationFrame(fn) {
        /** @type {?} */
        var requestId;
        /** @type {?} */
        var later = ( /**
         * @param {?} args
         * @return {?}
         */function (args) {
            return ( /**
             * @return {?}
             */function () {
                requestId = null;
                fn.apply(void 0, __spread(args));
            });
        });
        /** @type {?} */
        var throttled = ( /**
         * @param {...?} args
         * @return {?}
         */function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            if (requestId == null) {
                requestId = reqAnimFrame(later(args));
            }
        });
        // tslint:disable-next-line:no-non-null-assertion
        (( /** @type {?} */(throttled))).cancel = ( /**
         * @return {?}
         */function () { return cancelRequestAnimationFrame(( /** @type {?} */(requestId))); });
        return throttled;
    }
    /**
     * @return {?}
     */
    function throttleByAnimationFrameDecorator() {
        return ( /**
         * @param {?} target
         * @param {?} key
         * @param {?} descriptor
         * @return {?}
         */function (target, key, descriptor) {
            /** @type {?} */
            var fn = descriptor.value;
            /** @type {?} */
            var definingProperty = false;
            return {
                configurable: true,
                get: /**
                 * @return {?}
                 */ function () {
                    if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) {
                        return fn;
                    }
                    /** @type {?} */
                    var boundFn = throttleByAnimationFrame(fn.bind(this));
                    definingProperty = true;
                    Object.defineProperty(this, key, {
                        value: boundFn,
                        configurable: true,
                        writable: true
                    });
                    definingProperty = false;
                    return boundFn;
                }
            };
        });
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /** @type {?} */
    var timeUnits = [
        ['Y', 1000 * 60 * 60 * 24 * 365],
        ['M', 1000 * 60 * 60 * 24 * 30],
        ['D', 1000 * 60 * 60 * 24],
        ['H', 1000 * 60 * 60],
        ['m', 1000 * 60],
        ['s', 1000],
        ['S', 1] // million seconds
    ];

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

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /**
     * @license
     * Copyright Alibaba.com All Rights Reserved.
     *
     * Use of this source code is governed by an MIT-style license that can be
     * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
     */
    /**
     * @param {?} node
     * @return {?}
     */
    function isCheckDisabled(node) {
        var isDisabled = node.isDisabled, isDisableCheckbox = node.isDisableCheckbox;
        return !!(isDisabled || isDisableCheckbox);
    }
    // tslint:disable-next-line:no-any
    /**
     * @param {?} needle
     * @param {?} haystack
     * @return {?}
     */
    function isInArray(needle, haystack) {
        return haystack.length > 0 && haystack.indexOf(needle) > -1;
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzTreeBaseService = /** @class */ (function () {
        function NzTreeBaseService() {
            this.DRAG_SIDE_RANGE = 0.25;
            this.DRAG_MIN_GAP = 2;
            this.isCheckStrictly = false;
            this.isMultiple = false;
            this.rootNodes = [];
            this.selectedNodeList = [];
            this.expandedNodeList = [];
            this.checkedNodeList = [];
            this.halfCheckedNodeList = [];
            this.matchedNodeList = [];
            this.triggerEventChange$ = new rxjs.Subject();
        }
        /**
         * trigger event
         */
        /**
         * trigger event
         * @return {?}
         */
        NzTreeBaseService.prototype.eventTriggerChanged = /**
         * trigger event
         * @return {?}
         */
            function () {
                return this.triggerEventChange$.asObservable();
            };
        /**
         * reset tree nodes will clear default node list
         */
        /**
         * reset tree nodes will clear default node list
         * @param {?} nzNodes
         * @return {?}
         */
        NzTreeBaseService.prototype.initTree = /**
         * reset tree nodes will clear default node list
         * @param {?} nzNodes
         * @return {?}
         */
            function (nzNodes) {
                var _this = this;
                this.rootNodes = nzNodes;
                this.expandedNodeList = [];
                this.selectedNodeList = [];
                this.halfCheckedNodeList = [];
                this.checkedNodeList = [];
                this.matchedNodeList = [];
                // refresh node checked state
                setTimeout(( /**
                 * @return {?}
                 */function () {
                    _this.refreshCheckState(_this.isCheckStrictly);
                }));
            };
        /**
         * @return {?}
         */
        NzTreeBaseService.prototype.getSelectedNode = /**
         * @return {?}
         */
            function () {
                return this.selectedNode;
            };
        /**
         * get some list
         */
        /**
         * get some list
         * @return {?}
         */
        NzTreeBaseService.prototype.getSelectedNodeList = /**
         * get some list
         * @return {?}
         */
            function () {
                return this.conductNodeState('select');
            };
        /**
         * return checked nodes
         */
        /**
         * return checked nodes
         * @return {?}
         */
        NzTreeBaseService.prototype.getCheckedNodeList = /**
         * return checked nodes
         * @return {?}
         */
            function () {
                return this.conductNodeState('check');
            };
        /**
         * @return {?}
         */
        NzTreeBaseService.prototype.getHalfCheckedNodeList = /**
         * @return {?}
         */
            function () {
                return this.conductNodeState('halfCheck');
            };
        /**
         * return expanded nodes
         */
        /**
         * return expanded nodes
         * @return {?}
         */
        NzTreeBaseService.prototype.getExpandedNodeList = /**
         * return expanded nodes
         * @return {?}
         */
            function () {
                return this.conductNodeState('expand');
            };
        /**
         * return search matched nodes
         */
        /**
         * return search matched nodes
         * @return {?}
         */
        NzTreeBaseService.prototype.getMatchedNodeList = /**
         * return search matched nodes
         * @return {?}
         */
            function () {
                return this.conductNodeState('match');
            };
        // tslint:disable-next-line:no-any
        // tslint:disable-next-line:no-any
        /**
         * @param {?} value
         * @return {?}
         */
        NzTreeBaseService.prototype.isArrayOfNzTreeNode =
            // tslint:disable-next-line:no-any
            /**
             * @param {?} value
             * @return {?}
             */
            function (value) {
                return value.every(( /**
                 * @param {?} item
                 * @return {?}
                 */function (item) { return item instanceof NzTreeNode; }));
            };
        /**
         * reset selectedNodeList
         */
        /**
         * reset selectedNodeList
         * @param {?} selectedKeys
         * @param {?} nzNodes
         * @param {?=} isMulti
         * @return {?}
         */
        NzTreeBaseService.prototype.calcSelectedKeys = /**
         * reset selectedNodeList
         * @param {?} selectedKeys
         * @param {?} nzNodes
         * @param {?=} isMulti
         * @return {?}
         */
            function (selectedKeys, nzNodes, isMulti) {
                if (isMulti === void 0) {
                    isMulti = false;
                }
                /** @type {?} */
                var calc = ( /**
                 * @param {?} nodes
                 * @return {?}
                 */function (nodes) {
                    return nodes.every(( /**
                     * @param {?} node
                     * @return {?}
                     */function (node) {
                        if (isInArray(node.key, selectedKeys)) {
                            node.isSelected = true;
                            if (!isMulti) {
                                // if not support multi select
                                return false;
                            }
                        }
                        else {
                            node.isSelected = false;
                        }
                        if (node.children.length > 0) {
                            // Recursion
                            return calc(node.children);
                        }
                        return true;
                    }));
                });
                calc(nzNodes);
            };
        /**
         * reset expandedNodeList
         */
        /**
         * reset expandedNodeList
         * @param {?} expandedKeys
         * @param {?} nzNodes
         * @return {?}
         */
        NzTreeBaseService.prototype.calcExpandedKeys = /**
         * reset expandedNodeList
         * @param {?} expandedKeys
         * @param {?} nzNodes
         * @return {?}
         */
            function (expandedKeys, nzNodes) {
                this.expandedNodeList = [];
                /** @type {?} */
                var calc = ( /**
                 * @param {?} nodes
                 * @return {?}
                 */function (nodes) {
                    nodes.forEach(( /**
                     * @param {?} node
                     * @return {?}
                     */function (node) {
                        node.isExpanded = isInArray(node.key, expandedKeys);
                        if (node.children.length > 0) {
                            calc(node.children);
                        }
                    }));
                });
                calc(nzNodes);
            };
        /**
         * reset checkedNodeList
         */
        /**
         * reset checkedNodeList
         * @param {?} checkedKeys
         * @param {?} nzNodes
         * @param {?=} isCheckStrictly
         * @return {?}
         */
        NzTreeBaseService.prototype.calcCheckedKeys = /**
         * reset checkedNodeList
         * @param {?} checkedKeys
         * @param {?} nzNodes
         * @param {?=} isCheckStrictly
         * @return {?}
         */
            function (checkedKeys, nzNodes, isCheckStrictly) {
                if (isCheckStrictly === void 0) {
                    isCheckStrictly = false;
                }
                this.checkedNodeList = [];
                this.halfCheckedNodeList = [];
                /** @type {?} */
                var calc = ( /**
                 * @param {?} nodes
                 * @return {?}
                 */function (nodes) {
                    nodes.forEach(( /**
                     * @param {?} node
                     * @return {?}
                     */function (node) {
                        if (isInArray(node.key, checkedKeys)) {
                            node.isChecked = true;
                            node.isHalfChecked = false;
                        }
                        else {
                            node.isChecked = false;
                            node.isHalfChecked = false;
                        }
                        if (node.children.length > 0) {
                            calc(node.children);
                        }
                    }));
                });
                calc(nzNodes);
                // controlled state
                this.refreshCheckState(isCheckStrictly);
            };
        /**
         * set drag node
         */
        /**
         * set drag node
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.setSelectedNode = /**
         * set drag node
         * @param {?} node
         * @return {?}
         */
            function (node) {
                this.selectedNode = node;
            };
        /**
         * set node selected status
         */
        /**
         * set node selected status
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.setNodeActive = /**
         * set node selected status
         * @param {?} node
         * @return {?}
         */
            function (node) {
                if (!this.isMultiple && node.isSelected) {
                    this.selectedNodeList.forEach(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) {
                        if (node.key !== n.key) {
                            // reset other nodes
                            n.isSelected = false;
                        }
                    }));
                    // single mode: remove pre node
                    this.selectedNodeList = [];
                }
                this.setSelectedNodeList(node, this.isMultiple);
            };
        /**
         * add or remove node to selectedNodeList
         */
        /**
         * add or remove node to selectedNodeList
         * @param {?} node
         * @param {?=} isMultiple
         * @return {?}
         */
        NzTreeBaseService.prototype.setSelectedNodeList = /**
         * add or remove node to selectedNodeList
         * @param {?} node
         * @param {?=} isMultiple
         * @return {?}
         */
            function (node, isMultiple) {
                if (isMultiple === void 0) {
                    isMultiple = false;
                }
                /** @type {?} */
                var index = this.selectedNodeList.findIndex(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) { return node.key === n.key; }));
                if (isMultiple) {
                    if (node.isSelected && index === -1) {
                        this.selectedNodeList.push(node);
                    }
                }
                else {
                    if (node.isSelected && index === -1) {
                        this.selectedNodeList = [node];
                    }
                }
                if (!node.isSelected) {
                    this.selectedNodeList = this.selectedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return n.key !== node.key; }));
                }
            };
        /**
         * merge checked nodes
         */
        /**
         * merge checked nodes
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.setHalfCheckedNodeList = /**
         * merge checked nodes
         * @param {?} node
         * @return {?}
         */
            function (node) {
                /** @type {?} */
                var index = this.halfCheckedNodeList.findIndex(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) { return node.key === n.key; }));
                if (node.isHalfChecked && index === -1) {
                    this.halfCheckedNodeList.push(node);
                }
                else if (!node.isHalfChecked && index > -1) {
                    this.halfCheckedNodeList = this.halfCheckedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return node.key !== n.key; }));
                }
            };
        /**
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.setCheckedNodeList = /**
         * @param {?} node
         * @return {?}
         */
            function (node) {
                /** @type {?} */
                var index = this.checkedNodeList.findIndex(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) { return node.key === n.key; }));
                if (node.isChecked && index === -1) {
                    this.checkedNodeList.push(node);
                }
                else if (!node.isChecked && index > -1) {
                    this.checkedNodeList = this.checkedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return node.key !== n.key; }));
                }
            };
        /**
         * conduct checked/selected/expanded keys
         */
        /**
         * conduct checked/selected/expanded keys
         * @param {?=} type
         * @return {?}
         */
        NzTreeBaseService.prototype.conductNodeState = /**
         * conduct checked/selected/expanded keys
         * @param {?=} type
         * @return {?}
         */
            function (type) {
                var _this = this;
                if (type === void 0) {
                    type = 'check';
                }
                /** @type {?} */
                var resultNodesList = [];
                switch (type) {
                    case 'select':
                        resultNodesList = this.selectedNodeList;
                        break;
                    case 'expand':
                        resultNodesList = this.expandedNodeList;
                        break;
                    case 'match':
                        resultNodesList = this.matchedNodeList;
                        break;
                    case 'check':
                        resultNodesList = this.checkedNodeList;
                        /** @type {?} */
                        var isIgnore_1 = ( /**
                         * @param {?} node
                         * @return {?}
                         */function (node) {
                            /** @type {?} */
                            var parentNode = node.getParentNode();
                            if (parentNode) {
                                if (_this.checkedNodeList.findIndex(( /**
                                 * @param {?} n
                                 * @return {?}
                                 */function (n) { return n.key === parentNode.key; })) > -1) {
                                    return true;
                                }
                                else {
                                    return isIgnore_1(parentNode);
                                }
                            }
                            return false;
                        });
                        // merge checked
                        if (!this.isCheckStrictly) {
                            resultNodesList = this.checkedNodeList.filter(( /**
                             * @param {?} n
                             * @return {?}
                             */function (n) { return !isIgnore_1(n); }));
                        }
                        break;
                    case 'halfCheck':
                        if (!this.isCheckStrictly) {
                            resultNodesList = this.halfCheckedNodeList;
                        }
                        break;
                }
                return resultNodesList;
            };
        /**
         * set expanded nodes
         */
        /**
         * set expanded nodes
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.setExpandedNodeList = /**
         * set expanded nodes
         * @param {?} node
         * @return {?}
         */
            function (node) {
                if (node.isLeaf) {
                    return;
                }
                /** @type {?} */
                var index = this.expandedNodeList.findIndex(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) { return node.key === n.key; }));
                if (node.isExpanded && index === -1) {
                    this.expandedNodeList.push(node);
                }
                else if (!node.isExpanded && index > -1) {
                    this.expandedNodeList = this.expandedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return node.key !== n.key; }));
                }
            };
        /**
         * check state
         * @param isCheckStrictly
         */
        /**
         * check state
         * @param {?=} isCheckStrictly
         * @return {?}
         */
        NzTreeBaseService.prototype.refreshCheckState = /**
         * check state
         * @param {?=} isCheckStrictly
         * @return {?}
         */
            function (isCheckStrictly) {
                var _this = this;
                if (isCheckStrictly === void 0) {
                    isCheckStrictly = false;
                }
                if (isCheckStrictly) {
                    return;
                }
                this.checkedNodeList.forEach(( /**
                 * @param {?} node
                 * @return {?}
                 */function (node) {
                    _this.conduct(node);
                }));
            };
        // reset other node checked state based current node
        // reset other node checked state based current node
        /**
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.conduct =
            // reset other node checked state based current node
            /**
             * @param {?} node
             * @return {?}
             */
            function (node) {
                /** @type {?} */
                var isChecked = node.isChecked;
                if (node) {
                    this.conductUp(node);
                    this.conductDown(node, isChecked);
                }
            };
        /**
         * 1、children half checked
         * 2、children all checked, parent checked
         * 3、no children checked
         */
        /**
         * 1、children half checked
         * 2、children all checked, parent checked
         * 3、no children checked
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.conductUp = /**
         * 1、children half checked
         * 2、children all checked, parent checked
         * 3、no children checked
         * @param {?} node
         * @return {?}
         */
            function (node) {
                /** @type {?} */
                var parentNode = node.getParentNode();
                // 全禁用节点不选中
                if (parentNode) {
                    if (!isCheckDisabled(parentNode)) {
                        if (parentNode.children.every(( /**
                         * @param {?} child
                         * @return {?}
                         */function (child) { return isCheckDisabled(child) || (!child.isHalfChecked && child.isChecked); }))) {
                            parentNode.isChecked = true;
                            parentNode.isHalfChecked = false;
                        }
                        else if (parentNode.children.some(( /**
                         * @param {?} child
                         * @return {?}
                         */function (child) { return child.isHalfChecked || child.isChecked; }))) {
                            parentNode.isChecked = false;
                            parentNode.isHalfChecked = true;
                        }
                        else {
                            parentNode.isChecked = false;
                            parentNode.isHalfChecked = false;
                        }
                    }
                    this.setCheckedNodeList(parentNode);
                    this.setHalfCheckedNodeList(parentNode);
                    this.conductUp(parentNode);
                }
            };
        /**
         * reset child check state
         */
        /**
         * reset child check state
         * @param {?} node
         * @param {?} value
         * @return {?}
         */
        NzTreeBaseService.prototype.conductDown = /**
         * reset child check state
         * @param {?} node
         * @param {?} value
         * @return {?}
         */
            function (node, value) {
                var _this = this;
                if (!isCheckDisabled(node)) {
                    node.isChecked = value;
                    node.isHalfChecked = false;
                    this.setCheckedNodeList(node);
                    this.setHalfCheckedNodeList(node);
                    node.children.forEach(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) {
                        _this.conductDown(n, value);
                    }));
                }
            };
        /**
         * search value & expand node
         * should add expandlist
         */
        /**
         * search value & expand node
         * should add expandlist
         * @param {?} value
         * @return {?}
         */
        NzTreeBaseService.prototype.searchExpand = /**
         * search value & expand node
         * should add expandlist
         * @param {?} value
         * @return {?}
         */
            function (value) {
                var _this = this;
                this.matchedNodeList = [];
                /** @type {?} */
                var expandedKeys = [];
                if (!isNotNil(value)) {
                    return;
                }
                // to reset expandedNodeList
                /** @type {?} */
                var expandParent = ( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) {
                    // expand parent node
                    /** @type {?} */
                    var parentNode = n.getParentNode();
                    if (parentNode) {
                        expandedKeys.push(parentNode.key);
                        expandParent(parentNode);
                    }
                });
                /** @type {?} */
                var searchChild = ( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) {
                    if (value && n.title.includes(value)) {
                        // match the node
                        n.isMatched = true;
                        _this.matchedNodeList.push(n);
                        // expand parentNode
                        expandParent(n);
                    }
                    else {
                        n.isMatched = false;
                    }
                    n.children.forEach(( /**
                     * @param {?} child
                     * @return {?}
                     */function (child) {
                        searchChild(child);
                    }));
                });
                this.rootNodes.forEach(( /**
                 * @param {?} child
                 * @return {?}
                 */function (child) {
                    searchChild(child);
                }));
                // expand matched keys
                this.calcExpandedKeys(expandedKeys, this.rootNodes);
            };
        /**
         * flush after delete node
         */
        /**
         * flush after delete node
         * @param {?} nodes
         * @return {?}
         */
        NzTreeBaseService.prototype.afterRemove = /**
         * flush after delete node
         * @param {?} nodes
         * @return {?}
         */
            function (nodes) {
                var _this = this;
                // to reset selectedNodeList & expandedNodeList
                /** @type {?} */
                var loopNode = ( /**
                 * @param {?} node
                 * @return {?}
                 */function (node) {
                    // remove selected node
                    _this.selectedNodeList = _this.selectedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return n.key !== node.key; }));
                    // remove expanded node
                    _this.expandedNodeList = _this.expandedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return n.key !== node.key; }));
                    // remove checked node
                    _this.checkedNodeList = _this.checkedNodeList.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return n.key !== node.key; }));
                    if (node.children) {
                        node.children.forEach(( /**
                         * @param {?} child
                         * @return {?}
                         */function (child) {
                            loopNode(child);
                        }));
                    }
                });
                nodes.forEach(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) {
                    loopNode(n);
                }));
                this.refreshCheckState(this.isCheckStrictly);
            };
        /**
         * drag event
         */
        /**
         * drag event
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.refreshDragNode = /**
         * drag event
         * @param {?} node
         * @return {?}
         */
            function (node) {
                var _this = this;
                if (node.children.length === 0) {
                    // until root
                    this.conductUp(node);
                }
                else {
                    node.children.forEach(( /**
                     * @param {?} child
                     * @return {?}
                     */function (child) {
                        _this.refreshDragNode(child);
                    }));
                }
            };
        // reset node level
        // reset node level
        /**
         * @param {?} node
         * @return {?}
         */
        NzTreeBaseService.prototype.resetNodeLevel =
            // reset node level
            /**
             * @param {?} node
             * @return {?}
             */
            function (node) {
                var e_1, _a;
                /** @type {?} */
                var parentNode = node.getParentNode();
                if (parentNode) {
                    node.level = parentNode.level + 1;
                }
                else {
                    node.level = 0;
                }
                try {
                    for (var _b = __values(node.children), _c = _b.next(); !_c.done; _c = _b.next()) {
                        var child = _c.value;
                        this.resetNodeLevel(child);
                    }
                }
                catch (e_1_1) {
                    e_1 = { error: e_1_1 };
                }
                finally {
                    try {
                        if (_c && !_c.done && (_a = _b.return))
                            _a.call(_b);
                    }
                    finally {
                        if (e_1)
                            throw e_1.error;
                    }
                }
            };
        /**
         * @param {?} event
         * @return {?}
         */
        NzTreeBaseService.prototype.calcDropPosition = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                var clientY = event.clientY;
                // to fix firefox undefined
                var _a = event.srcElement
                    ? event.srcElement.getBoundingClientRect()
                    : (( /** @type {?} */(event.target))).getBoundingClientRect(), top = _a.top, bottom = _a.bottom, height = _a.height;
                /** @type {?} */
                var des = Math.max(height * this.DRAG_SIDE_RANGE, this.DRAG_MIN_GAP);
                if (clientY <= top + des) {
                    return -1;
                }
                else if (clientY >= bottom - des) {
                    return 1;
                }
                return 0;
            };
        /**
         * drop
         * 0: inner -1: pre 1: next
         */
        /**
         * drop
         * 0: inner -1: pre 1: next
         * @param {?} targetNode
         * @param {?=} dragPos
         * @return {?}
         */
        NzTreeBaseService.prototype.dropAndApply = /**
         * drop
         * 0: inner -1: pre 1: next
         * @param {?} targetNode
         * @param {?=} dragPos
         * @return {?}
         */
            function (targetNode, dragPos) {
                var _this = this;
                if (dragPos === void 0) {
                    dragPos = -1;
                }
                if (!targetNode || dragPos > 1) {
                    return;
                }
                /** @type {?} */
                var treeService = targetNode.treeService;
                /** @type {?} */
                var targetParent = targetNode.getParentNode();
                /** @type {?} */
                var isSelectedRootNode = this.selectedNode.getParentNode();
                // remove the dragNode
                if (isSelectedRootNode) {
                    isSelectedRootNode.children = isSelectedRootNode.children.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return n.key !== _this.selectedNode.key; }));
                }
                else {
                    this.rootNodes = this.rootNodes.filter(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) { return n.key !== _this.selectedNode.key; }));
                }
                switch (dragPos) {
                    case 0:
                        targetNode.addChildren([this.selectedNode]);
                        this.resetNodeLevel(targetNode);
                        break;
                    case -1:
                    case 1:
                        /** @type {?} */
                        var tIndex = dragPos === 1 ? 1 : 0;
                        if (targetParent) {
                            targetParent.addChildren([this.selectedNode], targetParent.children.indexOf(targetNode) + tIndex);
                            /** @type {?} */
                            var parentNode = this.selectedNode.getParentNode();
                            if (parentNode) {
                                this.resetNodeLevel(parentNode);
                            }
                        }
                        else {
                            /** @type {?} */
                            var targetIndex = this.rootNodes.indexOf(targetNode) + tIndex;
                            // 根节点插入
                            this.rootNodes.splice(targetIndex, 0, this.selectedNode);
                            this.rootNodes[targetIndex].parentNode = null;
                            this.rootNodes[targetIndex].level = 0;
                        }
                        break;
                }
                // flush all nodes
                this.rootNodes.forEach(( /**
                 * @param {?} child
                 * @return {?}
                 */function (child) {
                    if (!child.treeService) {
                        child.service = treeService;
                    }
                    _this.refreshDragNode(child);
                }));
            };
        /**
         * emit Structure
         * eventName
         * node
         * event: MouseEvent / DragEvent
         * dragNode
         */
        /**
         * emit Structure
         * eventName
         * node
         * event: MouseEvent / DragEvent
         * dragNode
         * @param {?} eventName
         * @param {?} node
         * @param {?} event
         * @return {?}
         */
        NzTreeBaseService.prototype.formatEvent = /**
         * emit Structure
         * eventName
         * node
         * event: MouseEvent / DragEvent
         * dragNode
         * @param {?} eventName
         * @param {?} node
         * @param {?} event
         * @return {?}
         */
            function (eventName, node, event) {
                /** @type {?} */
                var emitStructure = {
                    eventName: eventName,
                    node: node,
                    event: event
                };
                switch (eventName) {
                    case 'dragstart':
                    case 'dragenter':
                    case 'dragover':
                    case 'dragleave':
                    case 'drop':
                    case 'dragend':
                        Object.assign(emitStructure, { dragNode: this.getSelectedNode() });
                        break;
                    case 'click':
                    case 'dblclick':
                        Object.assign(emitStructure, { selectedKeys: this.selectedNodeList });
                        Object.assign(emitStructure, { nodes: this.selectedNodeList });
                        Object.assign(emitStructure, { keys: this.selectedNodeList.map(( /**
                                 * @param {?} n
                                 * @return {?}
                                 */function (n) { return n.key; })) });
                        break;
                    case 'check':
                        /** @type {?} */
                        var checkedNodeList = this.getCheckedNodeList();
                        Object.assign(emitStructure, { checkedKeys: checkedNodeList });
                        Object.assign(emitStructure, { nodes: checkedNodeList });
                        Object.assign(emitStructure, { keys: checkedNodeList.map(( /**
                                 * @param {?} n
                                 * @return {?}
                                 */function (n) { return n.key; })) });
                        break;
                    case 'search':
                        Object.assign(emitStructure, { matchedKeys: this.getMatchedNodeList() });
                        Object.assign(emitStructure, { nodes: this.getMatchedNodeList() });
                        Object.assign(emitStructure, { keys: this.getMatchedNodeList().map(( /**
                                 * @param {?} n
                                 * @return {?}
                                 */function (n) { return n.key; })) });
                        break;
                    case 'expand':
                        Object.assign(emitStructure, { nodes: this.expandedNodeList });
                        Object.assign(emitStructure, { keys: this.expandedNodeList.map(( /**
                                 * @param {?} n
                                 * @return {?}
                                 */function (n) { return n.key; })) });
                        break;
                }
                return emitStructure;
            };
        /**
         * @return {?}
         */
        NzTreeBaseService.prototype.ngOnDestroy = /**
         * @return {?}
         */
            function () {
                this.triggerEventChange$.complete();
            };
        NzTreeBaseService.decorators = [
            { type: i0.Injectable }
        ];
        return NzTreeBaseService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var NzTreeHigherOrderServiceToken = new i0.InjectionToken('NzTreeHigherOrder');

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzTreeBase = /** @class */ (function () {
        function NzTreeBase(nzTreeService) {
            this.nzTreeService = nzTreeService;
        }
        /**
         * Coerces a value({@link any[]}) to a TreeNodes({@link NzTreeNode[]})
         */
        /**
         * Coerces a value({\@link any[]}) to a TreeNodes({\@link NzTreeNode[]})
         * @param {?} value
         * @return {?}
         */
        NzTreeBase.prototype.coerceTreeNodes = /**
         * Coerces a value({\@link any[]}) to a TreeNodes({\@link NzTreeNode[]})
         * @param {?} value
         * @return {?}
         */
            function (
            // tslint:disable-next-line:no-any
            value) {
                var _this = this;
                /** @type {?} */
                var nodes = [];
                if (!this.nzTreeService.isArrayOfNzTreeNode(value)) {
                    // has not been new NzTreeNode
                    nodes = value.map(( /**
                     * @param {?} item
                     * @return {?}
                     */function (item) { return new NzTreeNode(item, null, _this.nzTreeService); }));
                }
                else {
                    nodes = value.map(( /**
                     * @param {?} item
                     * @return {?}
                     */function (item) {
                        item.service = _this.nzTreeService;
                        return item;
                    }));
                }
                return nodes;
            };
        /**
         * Get all nodes({@link NzTreeNode})
         */
        /**
         * Get all nodes({\@link NzTreeNode})
         * @return {?}
         */
        NzTreeBase.prototype.getTreeNodes = /**
         * Get all nodes({\@link NzTreeNode})
         * @return {?}
         */
            function () {
                return this.nzTreeService.rootNodes;
            };
        /**
         * Get {@link NzTreeNode} with key
         */
        /**
         * Get {\@link NzTreeNode} with key
         * @param {?} key
         * @return {?}
         */
        NzTreeBase.prototype.getTreeNodeByKey = /**
         * Get {\@link NzTreeNode} with key
         * @param {?} key
         * @return {?}
         */
            function (key) {
                // flat tree nodes
                /** @type {?} */
                var nodes = [];
                /** @type {?} */
                var getNode = ( /**
                 * @param {?} node
                 * @return {?}
                 */function (node) {
                    nodes.push(node);
                    node.getChildren().forEach(( /**
                     * @param {?} n
                     * @return {?}
                     */function (n) {
                        getNode(n);
                    }));
                });
                this.getTreeNodes().forEach(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) {
                    getNode(n);
                }));
                return nodes.find(( /**
                 * @param {?} n
                 * @return {?}
                 */function (n) { return n.key === key; })) || null;
            };
        /**
         * Get checked nodes(merged)
         */
        /**
         * Get checked nodes(merged)
         * @return {?}
         */
        NzTreeBase.prototype.getCheckedNodeList = /**
         * Get checked nodes(merged)
         * @return {?}
         */
            function () {
                return this.nzTreeService.getCheckedNodeList();
            };
        /**
         * Get selected nodes
         */
        /**
         * Get selected nodes
         * @return {?}
         */
        NzTreeBase.prototype.getSelectedNodeList = /**
         * Get selected nodes
         * @return {?}
         */
            function () {
                return this.nzTreeService.getSelectedNodeList();
            };
        /**
         * Get half checked nodes
         */
        /**
         * Get half checked nodes
         * @return {?}
         */
        NzTreeBase.prototype.getHalfCheckedNodeList = /**
         * Get half checked nodes
         * @return {?}
         */
            function () {
                return this.nzTreeService.getHalfCheckedNodeList();
            };
        /**
         * Get expanded nodes
         */
        /**
         * Get expanded nodes
         * @return {?}
         */
        NzTreeBase.prototype.getExpandedNodeList = /**
         * Get expanded nodes
         * @return {?}
         */
            function () {
                return this.nzTreeService.getExpandedNodeList();
            };
        /**
         * Get matched nodes(if nzSearchValue is not null)
         */
        /**
         * Get matched nodes(if nzSearchValue is not null)
         * @return {?}
         */
        NzTreeBase.prototype.getMatchedNodeList = /**
         * Get matched nodes(if nzSearchValue is not null)
         * @return {?}
         */
            function () {
                return this.nzTreeService.getMatchedNodeList();
            };
        return NzTreeBase;
    }());

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzWaveRenderer = /** @class */ (function () {
        function NzWaveRenderer(triggerElement, ngZone, insertExtraNode) {
            var _this = this;
            this.triggerElement = triggerElement;
            this.ngZone = ngZone;
            this.insertExtraNode = insertExtraNode;
            this.waveTransitionDuration = 400;
            this.lastTime = 0;
            this.onClick = ( /**
             * @param {?} event
             * @return {?}
             */function (event) {
                if (!_this.triggerElement ||
                    !_this.triggerElement.getAttribute ||
                    _this.triggerElement.getAttribute('disabled') ||
                    (( /** @type {?} */(event.target))).tagName === 'INPUT' ||
                    _this.triggerElement.className.indexOf('disabled') >= 0) {
                    return;
                }
                _this.fadeOutWave();
            });
            /** @type {?} */
            var platform$$1 = new platform.Platform();
            if (platform$$1.isBrowser) {
                this.bindTriggerEvent();
            }
        }
        Object.defineProperty(NzWaveRenderer.prototype, "waveAttributeName", {
            get: /**
             * @return {?}
             */ function () {
                return this.insertExtraNode ? 'ant-click-animating' : 'ant-click-animating-without-extra-node';
            },
            enumerable: true,
            configurable: true
        });
        /**
         * @return {?}
         */
        NzWaveRenderer.prototype.bindTriggerEvent = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.ngZone.runOutsideAngular(( /**
                 * @return {?}
                 */function () {
                    if (_this.triggerElement) {
                        _this.triggerElement.addEventListener('click', _this.onClick, true);
                    }
                }));
            };
        /**
         * @return {?}
         */
        NzWaveRenderer.prototype.removeTriggerEvent = /**
         * @return {?}
         */
            function () {
                if (this.triggerElement) {
                    this.triggerElement.removeEventListener('click', this.onClick, true);
                }
            };
        /**
         * @return {?}
         */
        NzWaveRenderer.prototype.removeStyleAndExtraNode = /**
         * @return {?}
         */
            function () {
                if (this.styleForPseudo && document.body.contains(this.styleForPseudo)) {
                    document.body.removeChild(this.styleForPseudo);
                    this.styleForPseudo = null;
                }
                if (this.insertExtraNode && this.triggerElement.contains(this.extraNode)) {
                    this.triggerElement.removeChild(( /** @type {?} */(this.extraNode)));
                }
            };
        /**
         * @return {?}
         */
        NzWaveRenderer.prototype.destroy = /**
         * @return {?}
         */
            function () {
                this.removeTriggerEvent();
                this.removeStyleAndExtraNode();
            };
        /**
         * @private
         * @return {?}
         */
        NzWaveRenderer.prototype.fadeOutWave = /**
         * @private
         * @return {?}
         */
            function () {
                var _this = this;
                /** @type {?} */
                var node = this.triggerElement;
                /** @type {?} */
                var waveColor = this.getWaveColor(node);
                node.setAttribute(this.waveAttributeName, 'true');
                if (Date.now() < this.lastTime + this.waveTransitionDuration) {
                    return;
                }
                if (this.isValidColor(waveColor)) {
                    if (!this.styleForPseudo) {
                        this.styleForPseudo = document.createElement('style');
                    }
                    this.styleForPseudo.innerHTML = "[ant-click-animating-without-extra-node]:after { border-color: " + waveColor + "; }";
                    document.body.appendChild(this.styleForPseudo);
                }
                if (this.insertExtraNode) {
                    if (!this.extraNode) {
                        this.extraNode = document.createElement('div');
                    }
                    this.extraNode.className = 'ant-click-animating-node';
                    node.appendChild(this.extraNode);
                }
                this.lastTime = Date.now();
                this.runTimeoutOutsideZone(( /**
                 * @return {?}
                 */function () {
                    node.removeAttribute(_this.waveAttributeName);
                    _this.removeStyleAndExtraNode();
                }), this.waveTransitionDuration);
            };
        /**
         * @private
         * @param {?} color
         * @return {?}
         */
        NzWaveRenderer.prototype.isValidColor = /**
         * @private
         * @param {?} color
         * @return {?}
         */
            function (color) {
                return (!!color &&
                    color !== '#ffffff' &&
                    color !== 'rgb(255, 255, 255)' &&
                    this.isNotGrey(color) &&
                    !/rgba\(\d*, \d*, \d*, 0\)/.test(color) &&
                    color !== 'transparent');
            };
        /**
         * @private
         * @param {?} color
         * @return {?}
         */
        NzWaveRenderer.prototype.isNotGrey = /**
         * @private
         * @param {?} color
         * @return {?}
         */
            function (color) {
                /** @type {?} */
                var match = color.match(/rgba?\((\d*), (\d*), (\d*)(, [\.\d]*)?\)/);
                if (match && match[1] && match[2] && match[3]) {
                    return !(match[1] === match[2] && match[2] === match[3]);
                }
                return true;
            };
        /**
         * @private
         * @param {?} node
         * @return {?}
         */
        NzWaveRenderer.prototype.getWaveColor = /**
         * @private
         * @param {?} node
         * @return {?}
         */
            function (node) {
                /** @type {?} */
                var nodeStyle = getComputedStyle(node);
                return (nodeStyle.getPropertyValue('border-top-color') || // Firefox Compatible
                    nodeStyle.getPropertyValue('border-color') ||
                    nodeStyle.getPropertyValue('background-color'));
            };
        /**
         * @private
         * @param {?} fn
         * @param {?} delay
         * @return {?}
         */
        NzWaveRenderer.prototype.runTimeoutOutsideZone = /**
         * @private
         * @param {?} fn
         * @param {?} delay
         * @return {?}
         */
            function (fn, delay) {
                this.ngZone.runOutsideAngular(( /**
                 * @return {?}
                 */function () { return setTimeout(fn, delay); }));
            };
        return NzWaveRenderer;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var NZ_WAVE_GLOBAL_DEFAULT_CONFIG = {
        disabled: false
    };
    /** @type {?} */
    var NZ_WAVE_GLOBAL_CONFIG = new i0.InjectionToken('nz-wave-global-options', {
        providedIn: 'root',
        factory: NZ_WAVE_GLOBAL_CONFIG_FACTORY
    });
    /**
     * @return {?}
     */
    function NZ_WAVE_GLOBAL_CONFIG_FACTORY() {
        return NZ_WAVE_GLOBAL_DEFAULT_CONFIG;
    }
    var NzWaveDirective = /** @class */ (function () {
        function NzWaveDirective(ngZone, elementRef, config, animationType) {
            this.ngZone = ngZone;
            this.elementRef = elementRef;
            this.animationType = animationType;
            this.nzWaveExtraNode = false;
            this.waveDisabled = false;
            if (config && typeof config.disabled === 'boolean') {
                this.waveDisabled = config.disabled;
            }
            if (this.animationType === 'NoopAnimations') {
                this.waveDisabled = true;
            }
        }
        /**
         * @return {?}
         */
        NzWaveDirective.prototype.ngOnDestroy = /**
         * @return {?}
         */
            function () {
                if (this.waveRenderer) {
                    this.waveRenderer.destroy();
                }
            };
        /**
         * @return {?}
         */
        NzWaveDirective.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.renderWaveIfEnabled();
            };
        /**
         * @return {?}
         */
        NzWaveDirective.prototype.renderWaveIfEnabled = /**
         * @return {?}
         */
            function () {
                if (!this.waveDisabled && this.elementRef.nativeElement) {
                    this.waveRenderer = new NzWaveRenderer(this.elementRef.nativeElement, this.ngZone, this.nzWaveExtraNode);
                }
            };
        NzWaveDirective.decorators = [
            { type: i0.Directive, args: [{
                        selector: '[nz-wave]',
                        exportAs: 'nzWave'
                    },] }
        ];
        /** @nocollapse */
        NzWaveDirective.ctorParameters = function () {
            return [
                { type: i0.NgZone },
                { type: i0.ElementRef },
                { type: undefined, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [NZ_WAVE_GLOBAL_CONFIG,] }] },
                { type: String, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [animations$1.ANIMATION_MODULE_TYPE,] }] }
            ];
        };
        NzWaveDirective.propDecorators = {
            nzWaveExtraNode: [{ type: i0.Input }]
        };
        return NzWaveDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzWaveModule = /** @class */ (function () {
        function NzWaveModule() {
        }
        NzWaveModule.decorators = [
            { type: i0.NgModule, args: [{
                        imports: [platform.PlatformModule],
                        exports: [NzWaveDirective],
                        declarations: [NzWaveDirective]
                    },] }
        ];
        return NzWaveModule;
    }());

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var NzMenuBaseService = /** @class */ (function () {
        function NzMenuBaseService() {
            this.menuItemClick$ = new rxjs.Subject(); // tslint:disable-line no-any
            // tslint:disable-line no-any
            this.theme$ = new rxjs.Subject();
            this.mode$ = new rxjs.BehaviorSubject('vertical');
            this.inlineIndent$ = new rxjs.BehaviorSubject(24);
            this.check$ = rxjs.merge(this.theme$, this.mode$, this.inlineIndent$);
            this.theme = 'light';
            this.mode = 'vertical';
            this.inlineIndent = 24;
            this.menuOpen$ = new rxjs.BehaviorSubject(false);
        }
        // tslint:disable-next-line no-any
        // tslint:disable-next-line no-any
        /**
         * @param {?} menu
         * @return {?}
         */
        NzMenuBaseService.prototype.onMenuItemClick =
            // tslint:disable-next-line no-any
            /**
             * @param {?} menu
             * @return {?}
             */
            function (menu) {
                this.menuItemClick$.next(menu);
            };
        /**
         * @param {?} mode
         * @return {?}
         */
        NzMenuBaseService.prototype.setMode = /**
         * @param {?} mode
         * @return {?}
         */
            function (mode) {
                this.mode = mode;
                this.mode$.next(mode);
            };
        /**
         * @param {?} theme
         * @return {?}
         */
        NzMenuBaseService.prototype.setTheme = /**
         * @param {?} theme
         * @return {?}
         */
            function (theme) {
                this.theme = theme;
                this.theme$.next(theme);
            };
        /**
         * @param {?} indent
         * @return {?}
         */
        NzMenuBaseService.prototype.setInlineIndent = /**
         * @param {?} indent
         * @return {?}
         */
            function (indent) {
                this.inlineIndent = indent;
                this.inlineIndent$.next(indent);
            };
        NzMenuBaseService.decorators = [
            { type: i0.Injectable }
        ];
        return NzMenuBaseService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var NzDropdownHigherOrderServiceToken = new i0.InjectionToken('NzTreeHigherOrder');

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

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    /** @type {?} */
    var NZ_LOGGER_STATE = new i0.InjectionToken('nz-logger-state');
    // Whether print the log
    var LoggerService = /** @class */ (function () {
        function LoggerService(_loggerState) {
            this._loggerState = _loggerState;
        }
        // tslint:disable-next-line:no-any
        // tslint:disable-next-line:no-any
        /**
         * @param {...?} args
         * @return {?}
         */
        LoggerService.prototype.log =
            // tslint:disable-next-line:no-any
            /**
             * @param {...?} args
             * @return {?}
             */
            function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (this._loggerState) {
                    console.log.apply(console, __spread(args));
                }
            };
        // tslint:disable-next-line:no-any
        // tslint:disable-next-line:no-any
        /**
         * @param {...?} args
         * @return {?}
         */
        LoggerService.prototype.warn =
            // tslint:disable-next-line:no-any
            /**
             * @param {...?} args
             * @return {?}
             */
            function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (this._loggerState) {
                    console.warn.apply(console, __spread(args));
                }
            };
        // tslint:disable-next-line:no-any
        // tslint:disable-next-line:no-any
        /**
         * @param {...?} args
         * @return {?}
         */
        LoggerService.prototype.error =
            // tslint:disable-next-line:no-any
            /**
             * @param {...?} args
             * @return {?}
             */
            function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (this._loggerState) {
                    console.error.apply(console, __spread(args));
                }
            };
        // tslint:disable-next-line:no-any
        // tslint:disable-next-line:no-any
        /**
         * @param {...?} args
         * @return {?}
         */
        LoggerService.prototype.info =
            // tslint:disable-next-line:no-any
            /**
             * @param {...?} args
             * @return {?}
             */
            function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (this._loggerState) {
                    console.log.apply(console, __spread(args));
                }
            };
        // tslint:disable-next-line:no-any
        // tslint:disable-next-line:no-any
        /**
         * @param {...?} args
         * @return {?}
         */
        LoggerService.prototype.debug =
            // tslint:disable-next-line:no-any
            /**
             * @param {...?} args
             * @return {?}
             */
            function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (this._loggerState) {
                    console.log.apply(console, __spread(['[NG-ZORRO-DEBUG]'], args));
                }
            };
        LoggerService.decorators = [
            { type: i0.Injectable }
        ];
        /** @nocollapse */
        LoggerService.ctorParameters = function () {
            return [
                { type: Boolean, decorators: [{ type: i0.Inject, args: [NZ_LOGGER_STATE,] }] }
            ];
        };
        return LoggerService;
    }());
    /**
     * @param {?} exist
     * @param {?} loggerState
     * @return {?}
     */
    function LOGGER_SERVICE_PROVIDER_FACTORY(exist, loggerState) {
        return exist || new LoggerService(loggerState);
    }
    /** @type {?} */
    var LOGGER_SERVICE_PROVIDER = {
        provide: LoggerService,
        useFactory: LOGGER_SERVICE_PROVIDER_FACTORY,
        deps: [[new i0.Optional(), new i0.SkipSelf(), LoggerService], NZ_LOGGER_STATE]
    };

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
     */
    var LoggerModule = /** @class */ (function () {
        function LoggerModule() {
        }
        LoggerModule.decorators = [
            { type: i0.NgModule, args: [{
                        providers: [{ provide: NZ_LOGGER_STATE, useValue: false }, LOGGER_SERVICE_PROVIDER]
                    },] }
        ];
        return LoggerModule;
    }());

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

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

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

    exports.NzAddOnModule = NzAddOnModule;
    exports.NzClassListAddDirective = NzClassListAddDirective;
    exports.NzStringTemplateOutletDirective = NzStringTemplateOutletDirective;
    exports.AnimationDuration = AnimationDuration;
    exports.AnimationCurves = AnimationCurves;
    exports.collapseMotion = collapseMotion;
    exports.fadeMotion = fadeMotion;
    exports.helpMotion = helpMotion;
    exports.moveUpMotion = moveUpMotion;
    exports.notificationMotion = notificationMotion;
    exports.slideMotion = slideMotion;
    exports.slideAlertMotion = slideAlertMotion;
    exports.zoomMotion = zoomMotion;
    exports.zoomBigMotion = zoomBigMotion;
    exports.zoomBadgeMotion = zoomBadgeMotion;
    exports.NzNoAnimationModule = NzNoAnimationModule;
    exports.NzNoAnimationDirective = NzNoAnimationDirective;
    exports.NzConnectedOverlayDirective = NzConnectedOverlayDirective;
    exports.NzOverlayModule = NzOverlayModule;
    exports.getPlacementName = getPlacementName;
    exports.POSITION_MAP = POSITION_MAP;
    exports.DEFAULT_TOOLTIP_POSITIONS = DEFAULT_TOOLTIP_POSITIONS;
    exports.DEFAULT_DROPDOWN_POSITIONS = DEFAULT_DROPDOWN_POSITIONS;
    exports.DEFAULT_SUBMENU_POSITIONS = DEFAULT_SUBMENU_POSITIONS;
    exports.DEFAULT_CASCADER_POSITIONS = DEFAULT_CASCADER_POSITIONS;
    exports.DEFAULT_MENTION_POSITIONS = DEFAULT_MENTION_POSITIONS;
    exports.cancelRequestAnimationFrame = cancelRequestAnimationFrame;
    exports.reqAnimFrame = reqAnimFrame;
    exports.SCROLL_SERVICE_PROVIDER_FACTORY = SCROLL_SERVICE_PROVIDER_FACTORY;
    exports.NzScrollService = NzScrollService;
    exports.SCROLL_SERVICE_PROVIDER = SCROLL_SERVICE_PROVIDER;
    exports.NzMeasureScrollbarService = NzMeasureScrollbarService;
    exports.NzUpdateHostClassService = NzUpdateHostClassService;
    exports.dispatchEvent = dispatchEvent;
    exports.dispatchFakeEvent = dispatchFakeEvent;
    exports.dispatchKeyboardEvent = dispatchKeyboardEvent;
    exports.dispatchMouseEvent = dispatchMouseEvent;
    exports.dispatchTouchEvent = dispatchTouchEvent;
    exports.createMouseEvent = createMouseEvent;
    exports.createTouchEvent = createTouchEvent;
    exports.createKeyboardEvent = createKeyboardEvent;
    exports.createFakeEvent = createFakeEvent;
    exports.typeInElement = typeInElement;
    exports.wrappedErrorMessage = wrappedErrorMessage;
    exports.FakeViewportRuler = FakeViewportRuler;
    exports.MockNgZone = MockNgZone;
    exports.NzTreeNode = NzTreeNode;
    exports.NzTreeBaseService = NzTreeBaseService;
    exports.NzTreeHigherOrderServiceToken = NzTreeHigherOrderServiceToken;
    exports.NzTreeBase = NzTreeBase;
    exports.toArray = toArray;
    exports.arraysEqual = arraysEqual;
    exports.shallowCopyArray = shallowCopyArray;
    exports.isNotNil = isNotNil;
    exports.isNil = isNil;
    exports.shallowEqual = shallowEqual;
    exports.isInteger = isInteger;
    exports.isEmpty = isEmpty;
    exports.filterNotEmptyNode = filterNotEmptyNode;
    exports.isNonEmptyString = isNonEmptyString;
    exports.isTemplateRef = isTemplateRef;
    exports.isComponent = isComponent;
    exports.toBoolean = toBoolean;
    exports.toNumber = toNumber;
    exports.toCssPixel = toCssPixel;
    exports.valueFunctionProp = valueFunctionProp;
    exports.InputBoolean = InputBoolean;
    exports.InputCssPixel = InputCssPixel;
    exports.InputNumber = InputNumber;
    exports.silentEvent = silentEvent;
    exports.getElementOffset = getElementOffset;
    exports.findFirstNotEmptyNode = findFirstNotEmptyNode;
    exports.findLastNotEmptyNode = findLastNotEmptyNode;
    exports.reverseChildNodes = reverseChildNodes;
    exports.isTouchEvent = isTouchEvent;
    exports.getRegExp = getRegExp;
    exports.getMentions = getMentions;
    exports.padStart = padStart;
    exports.padEnd = padEnd;
    exports.getRepeatedElement = getRepeatedElement;
    exports.isPromise = isPromise;
    exports.getPercent = getPercent;
    exports.getPrecision = getPrecision;
    exports.ensureNumberInRange = ensureNumberInRange;
    exports.scrollIntoView = scrollIntoView;
    exports.getCaretCoordinates = getCaretCoordinates;
    exports.createDebugEle = createDebugEle;
    exports.properties = properties;
    exports.throttleByAnimationFrameDecorator = throttleByAnimationFrameDecorator;
    exports.timeUnits = timeUnits;
    exports.NzWaveRenderer = NzWaveRenderer;
    exports.NZ_WAVE_GLOBAL_CONFIG_FACTORY = NZ_WAVE_GLOBAL_CONFIG_FACTORY;
    exports.NZ_WAVE_GLOBAL_DEFAULT_CONFIG = NZ_WAVE_GLOBAL_DEFAULT_CONFIG;
    exports.NZ_WAVE_GLOBAL_CONFIG = NZ_WAVE_GLOBAL_CONFIG;
    exports.NzWaveDirective = NzWaveDirective;
    exports.NzWaveModule = NzWaveModule;
    exports.NzMenuBaseService = NzMenuBaseService;
    exports.NzDropdownHigherOrderServiceToken = NzDropdownHigherOrderServiceToken;
    exports.LoggerModule = LoggerModule;
    exports.LoggerService = LoggerService;
    exports.NZ_LOGGER_STATE = NZ_LOGGER_STATE;
    exports.LOGGER_SERVICE_PROVIDER = LOGGER_SERVICE_PROVIDER;
    exports.LOGGER_SERVICE_PROVIDER_FACTORY = LOGGER_SERVICE_PROVIDER_FACTORY;

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

})));

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctem9ycm8tYW50ZC1jb3JlLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL2FkZG9uL2NsYXNzbGlzdF9hZGQudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9hZGRvbi9zdHJpbmdfdGVtcGxhdGVfb3V0bGV0LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvYWRkb24vYWRkb24ubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvYW5pbWF0aW9uL2FuaW1hdGlvbi1jb25zdHMudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9hbmltYXRpb24vY29sbGFwc2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9hbmltYXRpb24vZmFkZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL2FuaW1hdGlvbi9oZWxwLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvYW5pbWF0aW9uL21vdmUudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9hbmltYXRpb24vbm90aWZpY2F0aW9uLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvYW5pbWF0aW9uL3NsaWRlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvYW5pbWF0aW9uL3pvb20udHMiLCJub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdXRpbC9jb252ZXJ0LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvbm8tYW5pbWF0aW9uL256LW5vLWFuaW1hdGlvbi5kaXJlY3RpdmUudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24vbnotbm8tYW5pbWF0aW9uLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL292ZXJsYXkvbnotY29ubmVjdGVkLW92ZXJsYXkudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9vdmVybGF5L256LW92ZXJsYXkubW9kdWxlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvb3ZlcmxheS9vdmVybGF5LXBvc2l0aW9uLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvcG9seWZpbGwvcmVxdWVzdC1hbmltYXRpb24udHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS9zY3JvbGwvbnotc2Nyb2xsLnNlcnZpY2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL2NoZWNrLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvc2VydmljZXMvbnotbWVhc3VyZS1zY3JvbGxiYXIuc2VydmljZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL3NlcnZpY2VzL3VwZGF0ZS1ob3N0LWNsYXNzLnNlcnZpY2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS90ZXN0aW5nL2V2ZW50LW9iamVjdHMudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS90ZXN0aW5nL2Rpc3BhdGNoLWV2ZW50cy50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL3Rlc3RpbmcvdHlwZS1pbi1lbGVtZW50LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdGVzdGluZy93cmFwcGVkLWVycm9yLW1lc3NhZ2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS90ZXN0aW5nL2Zha2Utdmlld3BvcnQtcnVsZXIudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS90ZXN0aW5nL21vY2stbmctem9uZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL3RyZWUvbnotdHJlZS1iYXNlLW5vZGUudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL2FycmF5LnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdXRpbC9kb20udHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL2dldE1lbnRpb25zLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdXRpbC9zdHJpbmcudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL2lzLXByb21pc2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL251bWJlci50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL3V0aWwvc2Nyb2xsLWludG8tdmlldy1pZi1uZWVkZWQudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL3RleHRhcmVhLWNhcmV0LXBvc2l0aW9uLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdXRpbC90aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWUudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS91dGlsL3RpbWUudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS90cmVlL256LXRyZWUtYmFzZS11dGlsLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdHJlZS9uei10cmVlLWJhc2Uuc2VydmljZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL3RyZWUvbnotdHJlZS1zZXJ2aWNlLnJlc29sdmVyLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvdHJlZS9uei10cmVlLWJhc2UudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS93YXZlL256LXdhdmUtcmVuZGVyZXIudHMiLCJuZzovL25nLXpvcnJvLWFudGQvY29yZS93YXZlL256LXdhdmUuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvd2F2ZS9uei13YXZlLm1vZHVsZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL2Ryb3Bkb3duL256LW1lbnUtYmFzZS5zZXJ2aWNlLnRzIiwibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvZHJvcGRvd24vbnotZHJvcGRvd24tc2VydmljZS5yZXNvbHZlci50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL2xvZ2dlci9sb2dnZXIuc2VydmljZS50cyIsIm5nOi8vbmctem9ycm8tYW50ZC9jb3JlL2xvZ2dlci9sb2dnZXIubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW256Q2xhc3NMaXN0QWRkXScsXG4gIGV4cG9ydEFzOiAnbnpDbGFzc0xpc3RBZGQnXG59KVxuZXhwb3J0IGNsYXNzIE56Q2xhc3NMaXN0QWRkRGlyZWN0aXZlIHtcbiAgY2xhc3NMaXN0OiBzdHJpbmdbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBuekNsYXNzTGlzdEFkZChsaXN0OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LmZvckVhY2gobmFtZSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBuYW1lKTtcbiAgICB9KTtcbiAgICBsaXN0LmZvckVhY2gobmFtZSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBuYW1lKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsYXNzTGlzdCA9IGxpc3Q7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVtYmVkZGVkVmlld1JlZiwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuelN0cmluZ1RlbXBsYXRlT3V0bGV0XScsXG4gIGV4cG9ydEFzOiAnbnpTdHJpbmdUZW1wbGF0ZU91dGxldCdcbn0pXG5leHBvcnQgY2xhc3MgTnpTdHJpbmdUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgaXNUZW1wbGF0ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBpbnB1dFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlucHV0Vmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVmYXVsdFZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBkZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+KSB7fVxuXG4gIEBJbnB1dCgpXG4gIHNldCBuelN0cmluZ1RlbXBsYXRlT3V0bGV0KHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPikge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLmlzVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgdGhpcy5pbnB1dFRlbXBsYXRlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNUZW1wbGF0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgfVxuXG4gIHVwZGF0ZVZpZXcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzVGVtcGxhdGUpIHtcbiAgICAgIC8qKiB1c2UgZGVmYXVsdCB0ZW1wbGF0ZSB3aGVuIGlucHV0IGlzIHN0cmluZyAqKi9cbiAgICAgIGlmICghdGhpcy5kZWZhdWx0Vmlld1JlZikge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5pbnB1dFZpZXdSZWYgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVtcGxhdGUpIHtcbiAgICAgICAgICB0aGlzLmRlZmF1bHRWaWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmRlZmF1bHRUZW1wbGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyoqIHVzZSBpbnB1dCB0ZW1wbGF0ZSB3aGVuIGlucHV0IGlzIHRlbXBsYXRlUmVmICoqL1xuICAgICAgaWYgKCF0aGlzLmlucHV0Vmlld1JlZikge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Vmlld1JlZiA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VGVtcGxhdGUpIHtcbiAgICAgICAgICB0aGlzLmlucHV0Vmlld1JlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5pbnB1dFRlbXBsYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpDbGFzc0xpc3RBZGREaXJlY3RpdmUgfSBmcm9tICcuL2NsYXNzbGlzdF9hZGQnO1xuaW1wb3J0IHsgTnpTdHJpbmdUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4vc3RyaW5nX3RlbXBsYXRlX291dGxldCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbTnpTdHJpbmdUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSwgTnpDbGFzc0xpc3RBZGREaXJlY3RpdmVdLFxuICBkZWNsYXJhdGlvbnM6IFtOelN0cmluZ1RlbXBsYXRlT3V0bGV0RGlyZWN0aXZlLCBOekNsYXNzTGlzdEFkZERpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgTnpBZGRPbk1vZHVsZSB7fVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25EdXJhdGlvbiB7XG4gIHN0YXRpYyBTTE9XID0gJzAuM3MnOyAvLyBNb2RhbFxuICBzdGF0aWMgQkFTRSA9ICcwLjJzJztcbiAgc3RhdGljIEZBU1QgPSAnMC4xcyc7IC8vIFRvb2x0aXBcbn1cblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvbkN1cnZlcyB7XG4gIHN0YXRpYyBFQVNFX0JBU0VfT1VUID0gJ2N1YmljLWJlemllcigwLjcsIDAuMywgMC4xLCAxKSc7XG4gIHN0YXRpYyBFQVNFX0JBU0VfSU4gPSAnY3ViaWMtYmV6aWVyKDAuOSwgMCwgMC4zLCAwLjcpJztcbiAgc3RhdGljIEVBU0VfT1VUID0gJ2N1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpJztcbiAgc3RhdGljIEVBU0VfSU4gPSAnY3ViaWMtYmV6aWVyKDAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOSknO1xuICBzdGF0aWMgRUFTRV9JTl9PVVQgPSAnY3ViaWMtYmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpJztcbiAgc3RhdGljIEVBU0VfT1VUX0JBQ0sgPSAnY3ViaWMtYmV6aWVyKDAuMTIsIDAuNCwgMC4yOSwgMS40NiknO1xuICBzdGF0aWMgRUFTRV9JTl9CQUNLID0gJ2N1YmljLWJlemllcigwLjcxLCAtMC40NiwgMC44OCwgMC42KSc7XG4gIHN0YXRpYyBFQVNFX0lOX09VVF9CQUNLID0gJ2N1YmljLWJlemllcigwLjcxLCAtMC40NiwgMC4yOSwgMS40NiknO1xuICBzdGF0aWMgRUFTRV9PVVRfQ0lSQyA9ICdjdWJpYy1iZXppZXIoMC4wOCwgMC44MiwgMC4xNywgMSknO1xuICBzdGF0aWMgRUFTRV9JTl9DSVJDID0gJ2N1YmljLWJlemllcigwLjYsIDAuMDQsIDAuOTgsIDAuMzQpJztcbiAgc3RhdGljIEVBU0VfSU5fT1VUX0NJUkMgPSAnY3ViaWMtYmV6aWVyKDAuNzgsIDAuMTQsIDAuMTUsIDAuODYpJztcbiAgc3RhdGljIEVBU0VfT1VUX1FVSU5UID0gJ2N1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKSc7XG4gIHN0YXRpYyBFQVNFX0lOX1FVSU5UID0gJ2N1YmljLWJlemllcigwLjc1NSwgMC4wNSwgMC44NTUsIDAuMDYpJztcbiAgc3RhdGljIEVBU0VfSU5fT1VUX1FVSU5UID0gJ2N1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKSc7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyLCBBbmltYXRpb25UcmlnZ2VyTWV0YWRhdGEgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IEFuaW1hdGlvbkN1cnZlcyB9IGZyb20gJy4vYW5pbWF0aW9uLWNvbnN0cyc7XG5cbmV4cG9ydCBjb25zdCBjb2xsYXBzZU1vdGlvbjogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhID0gdHJpZ2dlcignY29sbGFwc2VNb3Rpb24nLCBbXG4gIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6IDAsIG92ZXJmbG93OiAnaGlkZGVuJyB9KSksXG4gIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IGhlaWdodDogMCwgZGlzcGxheTogJ25vbmUnIH0pKSxcbiAgdHJhbnNpdGlvbignZXhwYW5kZWQgPT4gY29sbGFwc2VkJywgYW5pbWF0ZShgMTUwbXMgJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9JTl9PVVR9YCkpLFxuICB0cmFuc2l0aW9uKCdleHBhbmRlZCA9PiBoaWRkZW4nLCBhbmltYXRlKGAxNTBtcyAke0FuaW1hdGlvbkN1cnZlcy5FQVNFX0lOX09VVH1gKSksXG4gIHRyYW5zaXRpb24oJ2NvbGxhcHNlZCA9PiBleHBhbmRlZCcsIGFuaW1hdGUoYDE1MG1zICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU5fT1VUfWApKSxcbiAgdHJhbnNpdGlvbignaGlkZGVuID0+IGV4cGFuZGVkJywgYW5pbWF0ZShgMTUwbXMgJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9JTl9PVVR9YCkpXG5dKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwgQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJy4vYW5pbWF0aW9uLWNvbnN0cyc7XG5cbmV4cG9ydCBjb25zdCBmYWRlTW90aW9uOiBBbmltYXRpb25UcmlnZ2VyTWV0YWRhdGEgPSB0cmlnZ2VyKCdmYWRlTW90aW9uJywgW1xuICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoeyBvcGFjaXR5OiAwIH0pLCBhbmltYXRlKGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9YCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKV0pLFxuICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbc3R5bGUoeyBvcGFjaXR5OiAxIH0pLCBhbmltYXRlKGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9YCwgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKV0pXG5dKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwgQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBBbmltYXRpb25DdXJ2ZXMsIEFuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi9hbmltYXRpb24tY29uc3RzJztcblxuZXhwb3J0IGNvbnN0IGhlbHBNb3Rpb246IEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSA9IHRyaWdnZXIoJ2hlbHBNb3Rpb24nLCBbXG4gIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICBzdHlsZSh7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNXB4KSdcbiAgICB9KSxcbiAgICBhbmltYXRlKFxuICAgICAgYCR7QW5pbWF0aW9uRHVyYXRpb24uU0xPV30gJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9JTl9PVVR9YCxcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSdcbiAgICAgIH0pXG4gICAgKVxuICBdKSxcbiAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgIHN0eWxlKHtcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJ1xuICAgIH0pLFxuICAgIGFuaW1hdGUoXG4gICAgICBgJHtBbmltYXRpb25EdXJhdGlvbi5TTE9XfSAke0FuaW1hdGlvbkN1cnZlcy5FQVNFX0lOX09VVH1gLFxuICAgICAgc3R5bGUoe1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01cHgpJ1xuICAgICAgfSlcbiAgICApXG4gIF0pXG5dKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwgQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJy4vYW5pbWF0aW9uLWNvbnN0cyc7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVXBNb3Rpb246IEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSA9IHRyaWdnZXIoJ21vdmVVcE1vdGlvbicsIFtcbiAgdHJhbnNpdGlvbignKiA9PiBlbnRlcicsIFtcbiAgICBzdHlsZSh7XG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknLFxuICAgICAgb3BhY2l0eTogMFxuICAgIH0pLFxuICAgIGFuaW1hdGUoXG4gICAgICBgJHtBbmltYXRpb25EdXJhdGlvbi5CQVNFfWAsXG4gICAgICBzdHlsZSh7XG4gICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJyxcbiAgICAgICAgb3BhY2l0eTogMVxuICAgICAgfSlcbiAgICApXG4gIF0pLFxuICB0cmFuc2l0aW9uKCcqID0+IGxlYXZlJywgW1xuICAgIHN0eWxlKHtcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScsXG4gICAgICBvcGFjaXR5OiAxXG4gICAgfSksXG4gICAgYW5pbWF0ZShcbiAgICAgIGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9YCxcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknLFxuICAgICAgICBvcGFjaXR5OiAwXG4gICAgICB9KVxuICAgIClcbiAgXSlcbl0pO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwgQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBub3RpZmljYXRpb25Nb3Rpb246IEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSA9IHRyaWdnZXIoJ25vdGlmaWNhdGlvbk1vdGlvbicsIFtcbiAgc3RhdGUoJ2VudGVyUmlnaHQnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknIH0pKSxcbiAgdHJhbnNpdGlvbignKiA9PiBlbnRlclJpZ2h0JywgW3N0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCg1JSknIH0pLCBhbmltYXRlKCcxMDBtcyBsaW5lYXInKV0pLFxuICBzdGF0ZSgnZW50ZXJMZWZ0Jywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJyB9KSksXG4gIHRyYW5zaXRpb24oJyogPT4gZW50ZXJMZWZ0JywgW3N0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNSUpJyB9KSwgYW5pbWF0ZSgnMTAwbXMgbGluZWFyJyldKSxcbiAgc3RhdGUoXG4gICAgJ2xlYXZlJyxcbiAgICBzdHlsZSh7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnXG4gICAgfSlcbiAgKSxcbiAgdHJhbnNpdGlvbignKiA9PiBsZWF2ZScsIFtcbiAgICBzdHlsZSh7XG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ1xuICAgIH0pLFxuICAgIGFuaW1hdGUoJzEwMG1zIGxpbmVhcicpXG4gIF0pXG5dKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIsIEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ3VydmVzLCBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJy4vYW5pbWF0aW9uLWNvbnN0cyc7XG5cbmNvbnN0IEFOSU1BVElPTl9UUkFOU0lUSU9OX0lOID0gYCR7QW5pbWF0aW9uRHVyYXRpb24uQkFTRX0gJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9PVVRfUVVJTlR9YDtcbmNvbnN0IEFOSU1BVElPTl9UUkFOU0lUSU9OX09VVCA9IGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9ICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU5fUVVJTlR9YDtcblxuZXhwb3J0IGNvbnN0IHNsaWRlTW90aW9uOiBBbmltYXRpb25UcmlnZ2VyTWV0YWRhdGEgPSB0cmlnZ2VyKCdzbGlkZU1vdGlvbicsIFtcbiAgc3RhdGUoXG4gICAgJ2JvdHRvbScsXG4gICAgc3R5bGUoe1xuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJSdcbiAgICB9KVxuICApLFxuICBzdGF0ZShcbiAgICAndG9wJyxcbiAgICBzdHlsZSh7XG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDEwMCUnXG4gICAgfSlcbiAgKSxcbiAgdHJhbnNpdGlvbigndm9pZCA9PiBib3R0b20nLCBbXG4gICAgc3R5bGUoe1xuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ1xuICAgIH0pLFxuICAgIGFuaW1hdGUoQU5JTUFUSU9OX1RSQU5TSVRJT05fSU4pXG4gIF0pLFxuICB0cmFuc2l0aW9uKCdib3R0b20gPT4gdm9pZCcsIFtcbiAgICBhbmltYXRlKFxuICAgICAgQU5JTUFUSU9OX1RSQU5TSVRJT05fT1VULFxuICAgICAgc3R5bGUoe1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ1xuICAgICAgfSlcbiAgICApXG4gIF0pLFxuICB0cmFuc2l0aW9uKCd2b2lkID0+IHRvcCcsIFtcbiAgICBzdHlsZSh7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSdcbiAgICB9KSxcbiAgICBhbmltYXRlKEFOSU1BVElPTl9UUkFOU0lUSU9OX0lOKVxuICBdKSxcbiAgdHJhbnNpdGlvbigndG9wID0+IHZvaWQnLCBbXG4gICAgYW5pbWF0ZShcbiAgICAgIEFOSU1BVElPTl9UUkFOU0lUSU9OX09VVCxcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJ1xuICAgICAgfSlcbiAgICApXG4gIF0pXG5dKTtcblxuZXhwb3J0IGNvbnN0IHNsaWRlQWxlcnRNb3Rpb246IEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSA9IHRyaWdnZXIoJ3NsaWRlQWxlcnRNb3Rpb24nLCBbXG4gIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyB9KSxcbiAgICBhbmltYXRlKFxuICAgICAgYCR7QW5pbWF0aW9uRHVyYXRpb24uU0xPV30gJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9JTl9PVVRfQ0lSQ31gLFxuICAgICAgc3R5bGUoe1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMCknLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJSdcbiAgICAgIH0pXG4gICAgKVxuICBdKVxuXSk7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIsIEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uQ3VydmVzLCBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJy4vYW5pbWF0aW9uLWNvbnN0cyc7XG5cbmV4cG9ydCBjb25zdCB6b29tTW90aW9uOiBBbmltYXRpb25UcmlnZ2VyTWV0YWRhdGEgPSB0cmlnZ2VyKCd6b29tTW90aW9uJywgW1xuICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXG4gICAgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjIpJyB9KSxcbiAgICBhbmltYXRlKFxuICAgICAgYCR7QW5pbWF0aW9uRHVyYXRpb24uQkFTRX0gJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9PVVRfQ0lSQ31gLFxuICAgICAgc3R5bGUoe1xuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgICAgIH0pXG4gICAgKVxuICBdKSxcbiAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pLFxuICAgIGFuaW1hdGUoXG4gICAgICBgJHtBbmltYXRpb25EdXJhdGlvbi5CQVNFfSAke0FuaW1hdGlvbkN1cnZlcy5FQVNFX0lOX09VVF9DSVJDfWAsXG4gICAgICBzdHlsZSh7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMiknXG4gICAgICB9KVxuICAgIClcbiAgXSlcbl0pO1xuZXhwb3J0IGNvbnN0IHpvb21CaWdNb3Rpb246IEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YSA9IHRyaWdnZXIoJ3pvb21CaWdNb3Rpb24nLCBbXG4gIHRyYW5zaXRpb24oJ3ZvaWQgPT4gYWN0aXZlJywgW1xuICAgIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScgfSksXG4gICAgYW5pbWF0ZShcbiAgICAgIGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9ICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfT1VUX0NJUkN9YCxcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gICAgICB9KVxuICAgIClcbiAgXSksXG4gIHRyYW5zaXRpb24oJ2FjdGl2ZSA9PiB2b2lkJywgW1xuICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pLFxuICAgIGFuaW1hdGUoXG4gICAgICBgJHtBbmltYXRpb25EdXJhdGlvbi5CQVNFfSAke0FuaW1hdGlvbkN1cnZlcy5FQVNFX0lOX09VVF9DSVJDfWAsXG4gICAgICBzdHlsZSh7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknXG4gICAgICB9KVxuICAgIClcbiAgXSlcbl0pO1xuZXhwb3J0IGNvbnN0IHpvb21CYWRnZU1vdGlvbjogQW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhID0gdHJpZ2dlcignem9vbUJhZGdlTW90aW9uJywgW1xuICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXG4gICAgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwKSB0cmFuc2xhdGUoNTAlLCAtNTAlKScgfSksXG4gICAgYW5pbWF0ZShcbiAgICAgIGAke0FuaW1hdGlvbkR1cmF0aW9uLlNMT1d9ICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfT1VUX0JBQ0t9YCxcbiAgICAgIHN0eWxlKHtcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKDUwJSwgLTUwJSknXG4gICAgICB9KVxuICAgIClcbiAgXSksXG4gIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpIHRyYW5zbGF0ZSg1MCUsIC01MCUpJyB9KSxcbiAgICBhbmltYXRlKFxuICAgICAgYCR7QW5pbWF0aW9uRHVyYXRpb24uU0xPV30gJHtBbmltYXRpb25DdXJ2ZXMuRUFTRV9JTl9CQUNLfWAsXG4gICAgICBzdHlsZSh7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApIHRyYW5zbGF0ZSg1MCUsIC01MCUpJ1xuICAgICAgfSlcbiAgICApXG4gIF0pXG5dKTtcbiIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlQ3NzUGl4ZWxWYWx1ZSwgX2lzTnVtYmVyVmFsdWUgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuXG5pbXBvcnQgeyBGdW5jdGlvblByb3AgfSBmcm9tICcuLi90eXBlcy9jb21tb24td3JhcCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyO1xuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyPEQ+KHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZhbGxiYWNrOiBEKTogbnVtYmVyIHwgRDtcbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBmYWxsYmFja1ZhbHVlOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgcmV0dXJuIF9pc051bWJlclZhbHVlKHZhbHVlKSA/IE51bWJlcih2YWx1ZSkgOiBmYWxsYmFja1ZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Dc3NQaXhlbCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvZXJjZUNzc1BpeGVsVmFsdWUodmFsdWUpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZnVuY3Rpb24tcHJvcGVydHkgdHlwZSdzIHZhbHVlXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5leHBvcnQgZnVuY3Rpb24gdmFsdWVGdW5jdGlvblByb3A8VD4ocHJvcDogRnVuY3Rpb25Qcm9wPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICByZXR1cm4gdHlwZW9mIHByb3AgPT09ICdmdW5jdGlvbicgPyBwcm9wKC4uLmFyZ3MpIDogcHJvcDtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbmZ1bmN0aW9uIHByb3BEZWNvcmF0b3JGYWN0b3J5PFQsIEQ+KG5hbWU6IHN0cmluZywgZmFsbGJhY2s6ICh2OiBUKSA9PiBEKTogKHRhcmdldDogYW55LCBwcm9wTmFtZTogc3RyaW5nKSA9PiB2b2lkIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgZnVuY3Rpb24gcHJvcERlY29yYXRvcih0YXJnZXQ6IGFueSwgcHJvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHByaXZhdGVQcm9wTmFtZSA9IGAkJF9fJHtwcm9wTmFtZX1gO1xuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHByaXZhdGVQcm9wTmFtZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVGhlIHByb3AgXCIke3ByaXZhdGVQcm9wTmFtZX1cIiBpcyBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIG92ZXJyaWRlZCBieSAke25hbWV9IGRlY29yYXRvci5gKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcml2YXRlUHJvcE5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wTmFtZSwge1xuICAgICAgZ2V0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzW3ByaXZhdGVQcm9wTmFtZV07IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8taW52YWxpZC10aGlzXG4gICAgICB9LFxuICAgICAgc2V0KHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXNbcHJpdmF0ZVByb3BOYW1lXSA9IGZhbGxiYWNrKHZhbHVlKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwcm9wRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIElucHV0IGRlY29yYXRvciB0aGF0IGhhbmRsZSBhIHByb3AgdG8gZG8gZ2V0L3NldCBhdXRvbWF0aWNhbGx5IHdpdGggdG9Cb29sZWFuXG4gKlxuICogV2h5IG5vdCB1c2luZyBASW5wdXRCb29sZWFuIGFsb25lIHdpdGhvdXQgQElucHV0PyBBT1QgbmVlZHMgQElucHV0IHRvIGJlIHZpc2libGVcbiAqXG4gKiBAaG93VG9Vc2VcbiAqIGBgYFxuICogQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAqXG4gKiAvLyBBY3QgYXMgYmVsb3c6XG4gKiAvLyBASW5wdXQoKVxuICogLy8gZ2V0IHZpc2libGUoKSB7IHJldHVybiB0aGlzLl9fdmlzaWJsZTsgfVxuICogLy8gc2V0IHZpc2libGUodmFsdWUpIHsgdGhpcy5fX3Zpc2libGUgPSB2YWx1ZTsgfVxuICogLy8gX192aXNpYmxlID0gZmFsc2U7XG4gKiBgYGBcbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBJbnB1dEJvb2xlYW4oKTogYW55IHtcbiAgcmV0dXJuIHByb3BEZWNvcmF0b3JGYWN0b3J5KCdJbnB1dEJvb2xlYW4nLCB0b0Jvb2xlYW4pO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIElucHV0Q3NzUGl4ZWwoKTogYW55IHtcbiAgcmV0dXJuIHByb3BEZWNvcmF0b3JGYWN0b3J5KCdJbnB1dENzc1BpeGVsJywgdG9Dc3NQaXhlbCk7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5leHBvcnQgZnVuY3Rpb24gSW5wdXROdW1iZXIoKTogYW55IHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbGluZTogbm8tYW55XG4gIHJldHVybiBwcm9wRGVjb3JhdG9yRmFjdG9yeSgnSW5wdXROdW1iZXInLCB0b051bWJlcik7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgY29lcmNlRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQU5JTUFUSU9OX01PRFVMRV9UWVBFIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zJztcblxuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnLi4vdXRpbC9jb252ZXJ0JztcblxuY29uc3QgRElTQUJMRURfQ0xBU1NOQU1FID0gJ256LWFuaW1hdGUtZGlzYWJsZWQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnpOb0FuaW1hdGlvbl0nLFxuICBleHBvcnRBczogJ256Tm9BbmltYXRpb24nLFxuICBob3N0OiB7XG4gICAgJ1tALmRpc2FibGVkXSc6ICduek5vQW5pbWF0aW9uJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56Tm9BbmltYXRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpOb0FuaW1hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIHByaXZhdGUgYW5pbWF0aW9uVHlwZTogc3RyaW5nXG4gICkge31cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNsYXNzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDbGFzcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDbGFzcygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gY29lcmNlRWxlbWVudCh0aGlzLmVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5uek5vQW5pbWF0aW9uIHx8IHRoaXMuYW5pbWF0aW9uVHlwZSA9PT0gJ05vb3BBbmltYXRpb25zJykge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCBESVNBQkxFRF9DTEFTU05BTUUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQsIERJU0FCTEVEX0NMQVNTTkFNRSk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE56Tm9BbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuL256LW5vLWFuaW1hdGlvbi5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtOek5vQW5pbWF0aW9uRGlyZWN0aXZlXSxcbiAgZXhwb3J0czogW056Tm9BbmltYXRpb25EaXJlY3RpdmVdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBOek5vQW5pbWF0aW9uTW9kdWxlIHt9XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2RrQ29ubmVjdGVkT3ZlcmxheV1bbnpDb25uZWN0ZWRPdmVybGF5XScsXG4gIGV4cG9ydEFzOiAnbnpDb25uZWN0ZWRPdmVybGF5J1xufSlcbmV4cG9ydCBjbGFzcyBOekNvbm5lY3RlZE92ZXJsYXlEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNka0Nvbm5lY3RlZE92ZXJsYXk6IENka0Nvbm5lY3RlZE92ZXJsYXkpIHtcbiAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXkuYmFja2Ryb3BDbGFzcyA9ICduei1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJztcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOekNvbm5lY3RlZE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICcuL256LWNvbm5lY3RlZC1vdmVybGF5JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbTnpDb25uZWN0ZWRPdmVybGF5RGlyZWN0aXZlXSxcbiAgZXhwb3J0czogW056Q29ubmVjdGVkT3ZlcmxheURpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgTnpPdmVybGF5TW9kdWxlIHt9XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLCBDb25uZWN0aW9uUG9zaXRpb25QYWlyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuXG5leHBvcnQgY29uc3QgUE9TSVRJT05fTUFQOiB7IFtrZXk6IHN0cmluZ106IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIgfSA9IHtcbiAgdG9wOiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgIHtcbiAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgIG92ZXJsYXlZOiAnYm90dG9tJ1xuICAgIH1cbiAgKSxcbiAgdG9wQ2VudGVyOiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgIHsgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICApLFxuICB0b3BMZWZ0OiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnIH0sXG4gICAge1xuICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICBvdmVybGF5WTogJ2JvdHRvbSdcbiAgICB9XG4gICksXG4gIHRvcFJpZ2h0OiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcih7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAndG9wJyB9LCB7IG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdib3R0b20nIH0pLFxuICByaWdodDogbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoXG4gICAgeyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicgfSxcbiAgICB7XG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAnY2VudGVyJ1xuICAgIH1cbiAgKSxcbiAgcmlnaHRUb3A6IG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICd0b3AnIH0sIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9KSxcbiAgcmlnaHRCb3R0b206IG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKFxuICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdib3R0b20nIH0sXG4gICAgeyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nIH1cbiAgKSxcbiAgYm90dG9tOiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAnYm90dG9tJyB9LFxuICAgIHtcbiAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgIH1cbiAgKSxcbiAgYm90dG9tQ2VudGVyOiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAnYm90dG9tJyB9LFxuICAgIHsgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ3RvcCcgfVxuICApLFxuICBib3R0b21MZWZ0OiBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nIH0sXG4gICAgeyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnIH1cbiAgKSxcbiAgYm90dG9tUmlnaHQ6IG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdib3R0b20nIH0sIHsgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ3RvcCcgfSksXG4gIGxlZnQ6IG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKFxuICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicgfSxcbiAgICB7XG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2NlbnRlcidcbiAgICB9XG4gICksXG4gIGxlZnRUb3A6IG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSwgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJyB9KSxcbiAgbGVmdEJvdHRvbTogbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoXG4gICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJyB9LFxuICAgIHsgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICApXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MVElQX1BPU0lUSU9OUyA9IFtQT1NJVElPTl9NQVAudG9wLCBQT1NJVElPTl9NQVAucmlnaHQsIFBPU0lUSU9OX01BUC5ib3R0b20sIFBPU0lUSU9OX01BUC5sZWZ0XTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0RST1BET1dOX1BPU0lUSU9OUyA9IFtcbiAgUE9TSVRJT05fTUFQLmJvdHRvbUxlZnQsXG4gIFBPU0lUSU9OX01BUC5ib3R0b21SaWdodCxcbiAgUE9TSVRJT05fTUFQLnRvcExlZnQsXG4gIFBPU0lUSU9OX01BUC50b3BSaWdodFxuXTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NVQk1FTlVfUE9TSVRJT05TID0gW1BPU0lUSU9OX01BUC5yaWdodFRvcCwgUE9TSVRJT05fTUFQLmxlZnRUb3BdO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0FTQ0FERVJfUE9TSVRJT05TID0gW1xuICBQT1NJVElPTl9NQVAuYm90dG9tTGVmdCxcbiAgUE9TSVRJT05fTUFQLmJvdHRvbVJpZ2h0LFxuICBQT1NJVElPTl9NQVAudG9wTGVmdCxcbiAgUE9TSVRJT05fTUFQLnRvcFJpZ2h0XG5dO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUVOVElPTl9QT1NJVElPTlMgPSBbXG4gIFBPU0lUSU9OX01BUC5ib3R0b21MZWZ0LFxuICBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ2JvdHRvbSdcbiAgICB9LFxuICAgIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9XG4gIClcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGFjZW1lbnROYW1lKHBvc2l0aW9uOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlMaXN0ID0gWydvcmlnaW5YJywgJ29yaWdpblknLCAnb3ZlcmxheVgnLCAnb3ZlcmxheVknXTtcbiAgZm9yIChjb25zdCBwbGFjZW1lbnQgaW4gUE9TSVRJT05fTUFQKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChrZXlMaXN0LmV2ZXJ5KGtleSA9PiBwb3NpdGlvbi5jb25uZWN0aW9uUGFpcltrZXldID09PSBQT1NJVElPTl9NQVBbcGxhY2VtZW50XVtrZXldKSkge1xuICAgICAgcmV0dXJuIHBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgdHlwZWRlZiBuby1pbnZhbGlkLXRoaXNcbmNvbnN0IGF2YWlsYWJsZVByZWZpeGVzID0gWydtb3onLCAnbXMnLCAnd2Via2l0J107XG5cbmZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKCk6IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUge1xuICBsZXQgbGFzdFRpbWUgPSAwO1xuICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSk7XG4gICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNhbGxiYWNrKGN1cnJUaW1lICsgdGltZVRvQ2FsbCk7XG4gICAgfSwgdGltZVRvQ2FsbCk7XG4gICAgbGFzdFRpbWUgPSBjdXJyVGltZSArIHRpbWVUb0NhbGw7XG4gICAgcmV0dXJuIGlkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTogdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAoKSA9PiAwO1xuICB9XG4gIGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9pc3N1ZXMvNDQ2NVxuICAgIHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeCA9IGF2YWlsYWJsZVByZWZpeGVzLmZpbHRlcihrZXkgPT4gYCR7a2V5fVJlcXVlc3RBbmltYXRpb25GcmFtZWAgaW4gd2luZG93KVswXTtcblxuICByZXR1cm4gcHJlZml4ID8gKHdpbmRvdyBhcyBhbnkpW2Ake3ByZWZpeH1SZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXSA6IHJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGlkOiBudW1iZXIpOiBhbnkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XG4gIH1cbiAgY29uc3QgcHJlZml4ID0gYXZhaWxhYmxlUHJlZml4ZXMuZmlsdGVyKFxuICAgIGtleSA9PiBgJHtrZXl9Q2FuY2VsQW5pbWF0aW9uRnJhbWVgIGluIHdpbmRvdyB8fCBgJHtrZXl9Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBpbiB3aW5kb3dcbiAgKVswXTtcblxuICByZXR1cm4gcHJlZml4XG4gICAgPyAoKHdpbmRvdyBhcyBhbnkpW2Ake3ByZWZpeH1DYW5jZWxBbmltYXRpb25GcmFtZWBdIHx8ICh3aW5kb3cgYXMgYW55KVtgJHtwcmVmaXh9Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lYF0pXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLmNhbGwodGhpcywgaWQpXG4gICAgOiBjbGVhclRpbWVvdXQoaWQpO1xufVxuXG5leHBvcnQgY29uc3QgcmVxQW5pbUZyYW1lID0gZ2V0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKCk7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgUHJvdmlkZXIsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IHJlcUFuaW1GcmFtZSB9IGZyb20gJy4uL3BvbHlmaWxsL3JlcXVlc3QtYW5pbWF0aW9uJztcblxuZXhwb3J0IHR5cGUgRWFzeWluZ0ZuID0gKHQ6IG51bWJlciwgYjogbnVtYmVyLCBjOiBudW1iZXIsIGQ6IG51bWJlcikgPT4gbnVtYmVyO1xuXG5mdW5jdGlvbiBlYXNlSW5PdXRDdWJpYyh0OiBudW1iZXIsIGI6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjYyA9IGMgLSBiO1xuICBsZXQgdHQgPSB0IC8gKGQgLyAyKTtcbiAgaWYgKHR0IDwgMSkge1xuICAgIHJldHVybiAoY2MgLyAyKSAqIHR0ICogdHQgKiB0dCArIGI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChjYyAvIDIpICogKCh0dCAtPSAyKSAqIHR0ICogdHQgKyAyKSArIGI7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE56U2Nyb2xsU2VydmljZSB7XG4gIHByaXZhdGUgZG9jOiBEb2N1bWVudDtcblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIGRvYzogYW55KSB7XG4gICAgdGhpcy5kb2MgPSBkb2M7XG4gIH1cblxuICAvKiogw6jCrsK+w6fCvcKuIGBlbGAgw6bCu8Kaw6XCisKow6bCncKhw6TCvcKNw6fCvcKuICovXG4gIHNldFNjcm9sbFRvcChlbDogRWxlbWVudCB8IFdpbmRvdywgdG9wVmFsdWU6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoZWwgPT09IHdpbmRvdykge1xuICAgICAgdGhpcy5kb2MuYm9keS5zY3JvbGxUb3AgPSB0b3BWYWx1ZTtcbiAgICAgIHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudCEuc2Nyb2xsVG9wID0gdG9wVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIChlbCBhcyBFbGVtZW50KS5zY3JvbGxUb3AgPSB0b3BWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogw6jCjsK3w6XCj8KWIGBlbGAgw6fCm8K4w6XCr8K5w6TCusKOw6jCp8KGw6fCqsKXw6jCt8Kdw6fCpsK7ICovXG4gIGdldE9mZnNldChlbDogRWxlbWVudCk6IHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9IHtcbiAgICBjb25zdCByZXQgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwXG4gICAgfTtcbiAgICBpZiAoIWVsIHx8ICFlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IGRvYyA9IGVsLm93bmVyRG9jdW1lbnQhLmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHJldC50b3AgPSByZWN0LnRvcCAtIGRvYyEuY2xpZW50VG9wO1xuICAgICAgcmV0LmxlZnQgPSByZWN0LmxlZnQgLSBkb2MhLmNsaWVudExlZnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldC50b3AgPSByZWN0LnRvcDtcbiAgICAgIHJldC5sZWZ0ID0gcmVjdC5sZWZ0O1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKiogw6jCjsK3w6XCj8KWIGBlbGAgw6bCu8Kaw6XCisKow6bCncKhw6TCvcKNw6fCvcKuICovXG4gIC8vIFRPRE86IHJlbW92ZSAnfCBXaW5kb3cnIGFzIHRoZSBmYWxsYmFjayBhbHJlYWR5IGhhcHBlbnMgaGVyZVxuICBnZXRTY3JvbGwoZWw/OiBFbGVtZW50IHwgV2luZG93LCB0b3A6IGJvb2xlYW4gPSB0cnVlKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlbCA/IGVsIDogd2luZG93O1xuICAgIGNvbnN0IHByb3AgPSB0b3AgPyAncGFnZVlPZmZzZXQnIDogJ3BhZ2VYT2Zmc2V0JztcbiAgICBjb25zdCBtZXRob2QgPSB0b3AgPyAnc2Nyb2xsVG9wJyA6ICdzY3JvbGxMZWZ0JztcbiAgICBjb25zdCBpc1dpbmRvdyA9IHRhcmdldCA9PT0gd2luZG93O1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsZXQgcmV0ID0gaXNXaW5kb3cgPyB0YXJnZXRbcHJvcF0gOiB0YXJnZXRbbWV0aG9kXTtcbiAgICBpZiAoaXNXaW5kb3cgJiYgdHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldCA9IHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudCFbbWV0aG9kXTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiDDpMK9wr/Dp8KUwqjDpcKKwqjDp8KUwrvDpcK9wqLDpcK8wo/DpcKwwoYgYGVsYCDDpsK7wprDpcKKwqjDqMKHwrPDpsKfwpDDpMK9wo3Dp8K9wq5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIMOlwq7CucOlwpnCqMOvwrzCjMOpwrvCmMOowq7CpCBgd2luZG93YFxuICAgKiBAcGFyYW0gdGFyZ2V0VG9wVmFsdWUgw6bCu8Kaw6XCisKow6jCh8Kzw6fCm8Kuw6bCoMKHIGB0b3BgIMOlwoDCvMOvwrzCjMOpwrvCmMOowq7CpMOvwrzCmjDDr8K8wozDp8KbwrjDpcK9wpPDpMK6wo7DqcKhwrbDqcKDwqhcbiAgICogQHBhcmFtIGVhc2luZyDDpcKKwqjDpMK9wpzDp8KuwpfDpsKzwpXDr8K8wozDqcK7wpjDqMKuwqTDr8K8wppgZWFzZUluT3V0Q3ViaWNgXG4gICAqIEBwYXJhbSBjYWxsYmFjayDDpcKKwqjDp8KUwrvDp8K7wpPDpsKdwp/DpcKQwo7DpcKbwp7DqMKwwoNcbiAgICovXG4gIHNjcm9sbFRvKGNvbnRhaW5lckVsOiBFbGVtZW50IHwgV2luZG93LCB0YXJnZXRUb3BWYWx1ZTogbnVtYmVyID0gMCwgZWFzaW5nPzogRWFzeWluZ0ZuLCBjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBjb250YWluZXJFbCA/IGNvbnRhaW5lckVsIDogd2luZG93O1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuZ2V0U2Nyb2xsKHRhcmdldCk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBmcmFtZUZ1bmMgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZSA9IHRpbWVzdGFtcCAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMuc2V0U2Nyb2xsVG9wKHRhcmdldCwgKGVhc2luZyB8fCBlYXNlSW5PdXRDdWJpYykodGltZSwgc2Nyb2xsVG9wLCB0YXJnZXRUb3BWYWx1ZSwgNDUwKSk7XG4gICAgICBpZiAodGltZSA8IDQ1MCkge1xuICAgICAgICByZXFBbmltRnJhbWUoZnJhbWVGdW5jKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcUFuaW1GcmFtZShmcmFtZUZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTQ1JPTExfU0VSVklDRV9QUk9WSURFUl9GQUNUT1JZKGRvYzogRG9jdW1lbnQsIHNjcm9sbFNlcnZpY2U6IE56U2Nyb2xsU2VydmljZSk6IE56U2Nyb2xsU2VydmljZSB7XG4gIHJldHVybiBzY3JvbGxTZXJ2aWNlIHx8IG5ldyBOelNjcm9sbFNlcnZpY2UoZG9jKTtcbn1cblxuZXhwb3J0IGNvbnN0IFNDUk9MTF9TRVJWSUNFX1BST1ZJREVSOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTnpTY3JvbGxTZXJ2aWNlLFxuICB1c2VGYWN0b3J5OiBTQ1JPTExfU0VSVklDRV9QUk9WSURFUl9GQUNUT1JZLFxuICBkZXBzOiBbRE9DVU1FTlQsIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE56U2Nyb2xsU2VydmljZV1dXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IFRlbXBsYXRlUmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEluZGV4YWJsZU9iamVjdCB9IGZyb20gJy4uL3R5cGVzL2luZGV4YWJsZSc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbDtcbn1cblxuLyoqXG4gKiBFeGFtaW5lIGlmIHR3byBvYmplY3RzIGFyZSBzaGFsbG93bHkgZXF1YWxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBPzogSW5kZXhhYmxlT2JqZWN0LCBvYmpCPzogSW5kZXhhYmxlT2JqZWN0KTogYm9vbGVhbiB7XG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYkhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzQVtpZHhdO1xuICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG9iakFba2V5XSAhPT0gb2JqQltrZXldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBub2RlcyA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmaWx0ZXJOb3RFbXB0eU5vZGUobm9kZXMuaXRlbShpKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJOb3RFbXB0eU5vZGUobm9kZTogTm9kZSk6IE5vZGUgfCBudWxsIHtcbiAgaWYgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkub3V0ZXJIVE1MLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gRUxFTUVOVF9OT0RFXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgbm9kZS50ZXh0Q29udGVudCEudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBURVhUX05PREVcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJyc7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBsYXRlUmVmKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFR5cGU7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmRleGFibGVPYmplY3QgfSBmcm9tICcuLi90eXBlcy9pbmRleGFibGUnO1xuaW1wb3J0IHsgaXNOb3ROaWwgfSBmcm9tICcuLi91dGlsL2NoZWNrJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTnpNZWFzdXJlU2Nyb2xsYmFyU2VydmljZSB7XG4gIHByaXZhdGUgX3Njcm9sbGJhcldpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgc2Nyb2xsYmFyTWVhc3VyZTogSW5kZXhhYmxlT2JqZWN0ID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogJy05OTk5cHgnLFxuICAgIHdpZHRoOiAnNTBweCcsXG4gICAgaGVpZ2h0OiAnNTBweCcsXG4gICAgb3ZlcmZsb3c6ICdzY3JvbGwnXG4gIH07XG5cbiAgZ2V0IHNjcm9sbEJhcldpZHRoKCk6IG51bWJlciB7XG4gICAgaWYgKGlzTm90TmlsKHRoaXMuX3Njcm9sbGJhcldpZHRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbGJhcldpZHRoO1xuICAgIH1cbiAgICB0aGlzLmluaXRTY3JvbGxCYXJXaWR0aCgpO1xuICAgIHJldHVybiB0aGlzLl9zY3JvbGxiYXJXaWR0aDtcbiAgfVxuXG4gIGluaXRTY3JvbGxCYXJXaWR0aCgpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JvbGxEaXYgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZvciAoY29uc3Qgc2Nyb2xsUHJvcCBpbiB0aGlzLnNjcm9sbGJhck1lYXN1cmUpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGJhck1lYXN1cmUuaGFzT3duUHJvcGVydHkoc2Nyb2xsUHJvcCkpIHtcbiAgICAgICAgc2Nyb2xsRGl2LnN0eWxlW3Njcm9sbFByb3BdID0gdGhpcy5zY3JvbGxiYXJNZWFzdXJlW3Njcm9sbFByb3BdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICBjb25zdCB3aWR0aCA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICB0aGlzLmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IHdpZHRoO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnkpIHtcbiAgICB0aGlzLmluaXRTY3JvbGxCYXJXaWR0aCgpO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5nQ2xhc3NJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcy9uZy1jbGFzcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOelVwZGF0ZUhvc3RDbGFzc1NlcnZpY2Uge1xuICBwcml2YXRlIGNsYXNzTWFwID0ge307XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcblxuICB1cGRhdGVIb3N0Q2xhc3MoZWw6IEhUTUxFbGVtZW50LCBjbGFzc01hcDogb2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcyhlbCwgdGhpcy5jbGFzc01hcCwgdGhpcy5yZW5kZXJlcik7XG4gICAgdGhpcy5jbGFzc01hcCA9IHsgLi4uY2xhc3NNYXAgfTtcbiAgICB0aGlzLmFkZENsYXNzKGVsLCB0aGlzLmNsYXNzTWFwLCB0aGlzLnJlbmRlcmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ2xhc3MoZWw6IEhUTUxFbGVtZW50LCBjbGFzc01hcDogTmdDbGFzc0ludGVyZmFjZSwgcmVuZGVyZXI6IFJlbmRlcmVyMik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaSBpbiBjbGFzc01hcCkge1xuICAgICAgaWYgKGNsYXNzTWFwLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENsYXNzKGVsOiBIVE1MRWxlbWVudCwgY2xhc3NNYXA6IE5nQ2xhc3NJbnRlcmZhY2UsIHJlbmRlcmVyOiBSZW5kZXJlcjIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gY2xhc3NNYXApIHtcbiAgICAgIGlmIChjbGFzc01hcC5oYXNPd25Qcm9wZXJ0eShpKSAmJiBjbGFzc01hcFtpXSkge1xuICAgICAgICByZW5kZXJlci5hZGRDbGFzcyhlbCwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocmVuZGVyZXJGYWN0b3J5MjogUmVuZGVyZXJGYWN0b3J5Mikge1xuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkyLmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqIENyZWF0ZXMgYSBicm93c2VyIE1vdXNlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW91c2VFdmVudCh0eXBlOiBzdHJpbmcsIHggPSAwLCB5ID0gMCk6IE1vdXNlRXZlbnQge1xuICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XG5cbiAgZXZlbnQuaW5pdE1vdXNlRXZlbnQoXG4gICAgdHlwZSxcbiAgICBmYWxzZSAvKiBjYW5CdWJibGUgKi8sXG4gICAgZmFsc2UgLyogY2FuY2VsYWJsZSAqLyxcbiAgICB3aW5kb3cgLyogdmlldyAqLyxcbiAgICAwIC8qIGRldGFpbCAqLyxcbiAgICB4IC8qIHNjcmVlblggKi8sXG4gICAgeSAvKiBzY3JlZW5ZICovLFxuICAgIHggLyogY2xpZW50WCAqLyxcbiAgICB5IC8qIGNsaWVudFkgKi8sXG4gICAgZmFsc2UgLyogY3RybEtleSAqLyxcbiAgICBmYWxzZSAvKiBhbHRLZXkgKi8sXG4gICAgZmFsc2UgLyogc2hpZnRLZXkgKi8sXG4gICAgZmFsc2UgLyogbWV0YUtleSAqLyxcbiAgICAwIC8qIGJ1dHRvbiAqLyxcbiAgICBudWxsIC8qIHJlbGF0ZWRUYXJnZXQgKi9cbiAgKTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKiBDcmVhdGVzIGEgYnJvd3NlciBUb3VjaEV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwb2ludGVyIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRvdWNoRXZlbnQodHlwZTogc3RyaW5nLCBwYWdlWDogbnVtYmVyID0gMCwgcGFnZVk6IG51bWJlciA9IDApOiBVSUV2ZW50IHtcbiAgLy8gSW4gZmF2b3Igb2YgY3JlYXRpbmcgZXZlbnRzIHRoYXQgd29yayBmb3IgbW9zdCBvZiB0aGUgYnJvd3NlcnMsIHRoZSBldmVudCBpcyBjcmVhdGVkXG4gIC8vIGFzIGEgYmFzaWMgVUkgRXZlbnQuIFRoZSBuZWNlc3NhcnkgZGV0YWlscyBmb3IgdGhlIGV2ZW50IHdpbGwgYmUgc2V0IG1hbnVhbGx5LlxuICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdVSUV2ZW50Jyk7XG4gIGNvbnN0IHRvdWNoRGV0YWlscyA9IHsgcGFnZVgsIHBhZ2VZIH07XG5cbiAgZXZlbnQuaW5pdFVJRXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwKTtcblxuICAvLyBNb3N0IG9mIHRoZSBicm93c2VycyBkb24ndCBoYXZlIGEgXCJpbml0VG91Y2hFdmVudFwiIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZVxuICAvLyB0aGUgdG91Y2ggZGV0YWlscy5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXZlbnQsIHtcbiAgICB0b3VjaGVzOiB7IHZhbHVlOiBbdG91Y2hEZXRhaWxzXSB9XG4gIH0pO1xuXG4gIHJldHVybiBldmVudCBhcyBVSUV2ZW50O1xufVxuXG4vKiogRGlzcGF0Y2hlcyBhIGtleWRvd24gZXZlbnQgZnJvbSBhbiBlbGVtZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUtleWJvYXJkRXZlbnQodHlwZTogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIHRhcmdldD86IEVsZW1lbnQsIGtleT86IHN0cmluZyk6IEtleWJvYXJkRXZlbnQge1xuICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdLZXlib2FyZEV2ZW50JykgYXMgYW55O1xuICAvLyBGaXJlZm94IGRvZXMgbm90IHN1cHBvcnQgYGluaXRLZXlib2FyZEV2ZW50YCwgYnV0IHN1cHBvcnRzIGBpbml0S2V5RXZlbnRgLlxuICBjb25zdCBpbml0RXZlbnRGbiA9IChldmVudC5pbml0S2V5RXZlbnQgfHwgZXZlbnQuaW5pdEtleWJvYXJkRXZlbnQpLmJpbmQoZXZlbnQpO1xuICBjb25zdCBvcmlnaW5hbFByZXZlbnREZWZhdWx0ID0gZXZlbnQucHJldmVudERlZmF1bHQ7XG5cbiAgaW5pdEV2ZW50Rm4odHlwZSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCAwLCAwLCBrZXlDb2RlKTtcblxuICAvLyBXZWJraXQgQnJvd3NlcnMgZG9uJ3Qgc2V0IHRoZSBrZXlDb2RlIHdoZW4gY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi5cbiAgLy8gU2VlIHJlbGF0ZWQgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjczNVxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhldmVudCwge1xuICAgIGtleUNvZGU6IHsgZ2V0OiAoKSA9PiBrZXlDb2RlIH0sXG4gICAga2V5OiB7IGdldDogKCkgPT4ga2V5IH0sXG4gICAgdGFyZ2V0OiB7IGdldDogKCkgPT4gdGFyZ2V0IH1cbiAgfSk7XG5cbiAgLy8gSUUgd29uJ3Qgc2V0IGBkZWZhdWx0UHJldmVudGVkYCBvbiBzeW50aGV0aWMgZXZlbnRzIHNvIHdlIG5lZWQgdG8gZG8gaXQgbWFudWFsbHkuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnZGVmYXVsdFByZXZlbnRlZCcsIHsgZ2V0OiAoKSA9PiB0cnVlIH0pO1xuICAgIHJldHVybiBvcmlnaW5hbFByZXZlbnREZWZhdWx0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKiogQ3JlYXRlcyBhIGZha2UgZXZlbnQgb2JqZWN0IHdpdGggYW55IGRlc2lyZWQgZXZlbnQgdHlwZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGYWtlRXZlbnQodHlwZTogc3RyaW5nLCBjYW5CdWJibGU6IGJvb2xlYW4gPSB0cnVlLCBjYW5jZWxhYmxlOiBib29sZWFuID0gdHJ1ZSk6IEV2ZW50IHtcbiAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGNhbkJ1YmJsZSwgY2FuY2VsYWJsZSk7XG4gIHJldHVybiBldmVudDtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVGYWtlRXZlbnQsIGNyZWF0ZUtleWJvYXJkRXZlbnQsIGNyZWF0ZU1vdXNlRXZlbnQsIGNyZWF0ZVRvdWNoRXZlbnQgfSBmcm9tICcuL2V2ZW50LW9iamVjdHMnO1xuXG4vKiogVXRpbGl0eSB0byBkaXNwYXRjaCBhbnkgZXZlbnQgb24gYSBOb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZTogTm9kZSB8IFdpbmRvdywgZXZlbnQ6IEV2ZW50KTogRXZlbnQge1xuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKiBTaG9ydGhhbmQgdG8gZGlzcGF0Y2ggYSBmYWtlIGV2ZW50IG9uIGEgc3BlY2lmaWVkIG5vZGUuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hGYWtlRXZlbnQobm9kZTogTm9kZSB8IFdpbmRvdywgdHlwZTogc3RyaW5nLCBjYW5CdWJibGU/OiBib29sZWFuKTogRXZlbnQge1xuICByZXR1cm4gZGlzcGF0Y2hFdmVudChub2RlLCBjcmVhdGVGYWtlRXZlbnQodHlwZSwgY2FuQnViYmxlKSk7XG59XG5cbi8qKiBTaG9ydGhhbmQgdG8gZGlzcGF0Y2ggYSBrZXlib2FyZCBldmVudCB3aXRoIGEgc3BlY2lmaWVkIGtleSBjb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoS2V5Ym9hcmRFdmVudChub2RlOiBOb2RlLCB0eXBlOiBzdHJpbmcsIGtleUNvZGU6IG51bWJlciwgdGFyZ2V0PzogRWxlbWVudCk6IEtleWJvYXJkRXZlbnQge1xuICByZXR1cm4gZGlzcGF0Y2hFdmVudChub2RlLCBjcmVhdGVLZXlib2FyZEV2ZW50KHR5cGUsIGtleUNvZGUsIHRhcmdldCkpIGFzIEtleWJvYXJkRXZlbnQ7XG59XG5cbi8qKiBTaG9ydGhhbmQgdG8gZGlzcGF0Y2ggYSBtb3VzZSBldmVudCBvbiB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoTW91c2VFdmVudChcbiAgbm9kZTogTm9kZSxcbiAgdHlwZTogc3RyaW5nLFxuICB4OiBudW1iZXIgPSAwLFxuICB5OiBudW1iZXIgPSAwLFxuICBldmVudDogTW91c2VFdmVudCA9IGNyZWF0ZU1vdXNlRXZlbnQodHlwZSwgeCwgeSlcbik6IE1vdXNlRXZlbnQge1xuICByZXR1cm4gZGlzcGF0Y2hFdmVudChub2RlLCBldmVudCkgYXMgTW91c2VFdmVudDtcbn1cblxuLyoqIFNob3J0aGFuZCB0byBkaXNwYXRjaCBhIHRvdWNoIGV2ZW50IG9uIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hUb3VjaEV2ZW50KG5vZGU6IE5vZGUsIHR5cGU6IHN0cmluZywgeDogbnVtYmVyID0gMCwgeTogbnVtYmVyID0gMCk6IFRvdWNoRXZlbnQge1xuICByZXR1cm4gZGlzcGF0Y2hFdmVudChub2RlLCBjcmVhdGVUb3VjaEV2ZW50KHR5cGUsIHgsIHkpKSBhcyBUb3VjaEV2ZW50O1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IGRpc3BhdGNoRmFrZUV2ZW50IH0gZnJvbSAnLi9kaXNwYXRjaC1ldmVudHMnO1xuXG4vKipcbiAqIEZvY3VzZXMgYW4gaW5wdXQsIHNldHMgaXRzIHZhbHVlIGFuZCBkaXNwYXRjaGVzXG4gKiB0aGUgYGlucHV0YCBldmVudCwgc2ltdWxhdGluZyB0aGUgdXNlciB0eXBpbmcuXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgc2V0IG9uIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgb250byB3aGljaCB0byBzZXQgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZUluRWxlbWVudCh2YWx1ZTogc3RyaW5nLCBlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCk6IHZvaWQge1xuICBlbGVtZW50LmZvY3VzKCk7XG4gIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgZGlzcGF0Y2hGYWtlRXZlbnQoZWxlbWVudCwgJ2lucHV0Jyk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBHZXRzIGEgUmVnRXhwIHVzZWQgdG8gZGV0ZWN0IGFuIGFuZ3VsYXIgd3JhcHBlZCBlcnJvciBtZXNzYWdlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzgzNDhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBwZWRFcnJvck1lc3NhZ2UoZTogRXJyb3IpIHtcbiAgY29uc3QgZXNjYXBlZE1lc3NhZ2UgPSBlLm1lc3NhZ2UucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csICdcXFxcJCYnKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoZXNjYXBlZE1lc3NhZ2UpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgY2xhc3MgRmFrZVZpZXdwb3J0UnVsZXIge1xuICBnZXRWaWV3cG9ydFJlY3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICB3aWR0aDogMTAxNCxcbiAgICAgIGhlaWdodDogNjg2LFxuICAgICAgYm90dG9tOiA2ODYsXG4gICAgICByaWdodDogMTAxNFxuICAgIH07XG4gIH1cblxuICBnZXRWaWV3cG9ydFNpemUoKSB7XG4gICAgcmV0dXJuIHsgd2lkdGg6IDEwMTQsIGhlaWdodDogNjg2IH07XG4gIH1cblxuICBnZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCkge1xuICAgIHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBNb2NrIHN5bmNocm9ub3VzIE5nWm9uZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBiZSB1c2VkXG4gKiB0byBmbHVzaCBvdXQgYG9uU3RhYmxlYCBzdWJzY3JpcHRpb25zIGluIHRlc3RzLlxuICpcbiAqIHZpYTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9wYWNrYWdlcy9jb3JlL3Rlc3Rpbmcvc3JjL25nX3pvbmVfbW9jay50c1xuICogQGRvY3MtcHJpdmF0ZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9ja05nWm9uZSBleHRlbmRzIE5nWm9uZSB7XG4gIG9uU3RhYmxlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgZW5hYmxlTG9uZ1N0YWNrVHJhY2U6IGZhbHNlIH0pO1xuICB9XG5cbiAgcnVuKGZuOiBGdW5jdGlvbik6IGFueSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBydW5PdXRzaWRlQW5ndWxhcihmbjogRnVuY3Rpb24pOiBhbnkge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgc2ltdWxhdGVab25lRXhpdCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uU3RhYmxlLmVtaXQobnVsbCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBOelRyZWVOb2RlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vbnotdHJlZS1iYXNlLmRlZmluaXRpb25zJztcbmltcG9ydCB7IE56VHJlZUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9uei10cmVlLWJhc2Uuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnpUcmVlTm9kZU9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgaXNMZWFmPzogYm9vbGVhbjtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG4gIHNlbGVjdGVkPzogYm9vbGVhbjtcbiAgc2VsZWN0YWJsZT86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgZGlzYWJsZUNoZWNrYm94PzogYm9vbGVhbjtcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xuICBjaGlsZHJlbj86IE56VHJlZU5vZGVPcHRpb25zW107XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBOelRyZWVOb2RlIHtcbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG4gIGxldmVsOiBudW1iZXIgPSAwO1xuICBvcmlnaW46IE56VHJlZU5vZGVPcHRpb25zO1xuICAvLyBQYXJlbnQgTm9kZVxuICBwYXJlbnROb2RlOiBOelRyZWVOb2RlIHwgbnVsbDtcbiAgcHJpdmF0ZSBfaWNvbjogc3RyaW5nO1xuICBwcml2YXRlIF9jaGlsZHJlbjogTnpUcmVlTm9kZVtdO1xuICBwcml2YXRlIF9pc0xlYWY6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzQ2hlY2tlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIE1heWJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLCB1c2UgaXNDaGVja2VkIGluc3RlYWRcbiAgICovXG4gIHByaXZhdGUgX2lzQWxsQ2hlY2tlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNTZWxlY3RhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIF9pc0Rpc2FibGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9pc0Rpc2FibGVDaGVja2JveDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNFeHBhbmRlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNIYWxmQ2hlY2tlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNMb2FkaW5nOiBib29sZWFuO1xuICBpc01hdGNoZWQ6IGJvb2xlYW47XG5cbiAgc2VydmljZTogTnpUcmVlQmFzZVNlcnZpY2UgfCBudWxsO1xuICBjb21wb25lbnQ6IE56VHJlZU5vZGVCYXNlQ29tcG9uZW50O1xuXG4gIGdldCB0cmVlU2VydmljZSgpOiBOelRyZWVCYXNlU2VydmljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UgfHwgKHRoaXMucGFyZW50Tm9kZSAmJiB0aGlzLnBhcmVudE5vZGUudHJlZVNlcnZpY2UpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uOiBOelRyZWVOb2RlT3B0aW9ucyB8IE56VHJlZU5vZGUsXG4gICAgcGFyZW50OiBOelRyZWVOb2RlIHwgbnVsbCA9IG51bGwsXG4gICAgc2VydmljZTogTnpUcmVlQmFzZVNlcnZpY2UgfCBudWxsID0gbnVsbFxuICApIHtcbiAgICBpZiAob3B0aW9uIGluc3RhbmNlb2YgTnpUcmVlTm9kZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG4gICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZSB8fCBudWxsO1xuICAgIHRoaXMub3JpZ2luID0gb3B0aW9uO1xuICAgIHRoaXMua2V5ID0gb3B0aW9uLmtleTtcbiAgICB0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnQ7XG4gICAgdGhpcy5fdGl0bGUgPSBvcHRpb24udGl0bGUgfHwgJy0tLSc7XG4gICAgdGhpcy5faWNvbiA9IG9wdGlvbi5pY29uIHx8ICcnO1xuICAgIHRoaXMuX2lzTGVhZiA9IG9wdGlvbi5pc0xlYWYgfHwgZmFsc2U7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSBbXTtcbiAgICAvLyBvcHRpb24gcGFyYW1zXG4gICAgdGhpcy5faXNDaGVja2VkID0gb3B0aW9uLmNoZWNrZWQgfHwgZmFsc2U7XG4gICAgdGhpcy5faXNTZWxlY3RhYmxlID0gb3B0aW9uLmRpc2FibGVkIHx8IG9wdGlvbi5zZWxlY3RhYmxlICE9PSBmYWxzZTtcbiAgICB0aGlzLl9pc0Rpc2FibGVkID0gb3B0aW9uLmRpc2FibGVkIHx8IGZhbHNlO1xuICAgIHRoaXMuX2lzRGlzYWJsZUNoZWNrYm94ID0gb3B0aW9uLmRpc2FibGVDaGVja2JveCB8fCBmYWxzZTtcbiAgICB0aGlzLl9pc0V4cGFuZGVkID0gb3B0aW9uLmlzTGVhZiA/IGZhbHNlIDogb3B0aW9uLmV4cGFuZGVkIHx8IGZhbHNlO1xuICAgIHRoaXMuX2lzSGFsZkNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9pc1NlbGVjdGVkID0gKCFvcHRpb24uZGlzYWJsZWQgJiYgb3B0aW9uLnNlbGVjdGVkKSB8fCBmYWxzZTtcbiAgICB0aGlzLl9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzTWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogcGFyZW50J3MgY2hlY2tlZCBzdGF0dXMgd2lsbCBhZmZlY3QgY2hpbGRyZW4gd2hpbGUgaW5pdGlhbGl6aW5nXG4gICAgICovXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgdGhpcy5sZXZlbCA9IHBhcmVudC5sZXZlbCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGV2ZWwgPSAwO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbi5jaGlsZHJlbiAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0aW9uLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICBvcHRpb24uY2hpbGRyZW4uZm9yRWFjaChub2RlT3B0aW9ucyA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnRyZWVTZXJ2aWNlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcyAmJlxuICAgICAgICAgICFzLmlzQ2hlY2tTdHJpY3RseSAmJlxuICAgICAgICAgIG9wdGlvbi5jaGVja2VkICYmXG4gICAgICAgICAgIW9wdGlvbi5kaXNhYmxlZCAmJlxuICAgICAgICAgICFub2RlT3B0aW9ucy5kaXNhYmxlZCAmJlxuICAgICAgICAgICFub2RlT3B0aW9ucy5kaXNhYmxlQ2hlY2tib3hcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZU9wdGlvbnMuY2hlY2tlZCA9IG9wdGlvbi5jaGVja2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2gobmV3IE56VHJlZU5vZGUobm9kZU9wdGlvbnMsIHRoaXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhdXRvIGdlbmVyYXRlXG4gICAqIGdldFxuICAgKiBzZXRcbiAgICovXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuXG4gIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgZ2V0IGljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWNvbjtcbiAgfVxuXG4gIHNldCBpY29uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pY29uID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIGdldCBjaGlsZHJlbigpOiBOelRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcbiAgfVxuXG4gIHNldCBjaGlsZHJlbih2YWx1ZTogTnpUcmVlTm9kZVtdKSB7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgZ2V0IGlzTGVhZigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNMZWFmO1xuICB9XG5cbiAgc2V0IGlzTGVhZih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTGVhZiA9IHZhbHVlO1xuICAgIC8vIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBnZXQgaXNDaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0NoZWNrZWQ7XG4gIH1cblxuICBzZXQgaXNDaGVja2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNDaGVja2VkID0gdmFsdWU7XG4gICAgdGhpcy5faXNBbGxDaGVja2VkID0gdmFsdWU7XG4gICAgdGhpcy5vcmlnaW4uY2hlY2tlZCA9IHZhbHVlO1xuICAgIHRoaXMuYWZ0ZXJWYWx1ZUNoYW5nZSgnaXNDaGVja2VkJyk7XG4gIH1cblxuICBnZXQgaXNBbGxDaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FsbENoZWNrZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgTWF5YmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24sIHVzZSBpc0NoZWNrZWQgaW5zdGVhZFxuICAgKi9cbiAgc2V0IGlzQWxsQ2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQWxsQ2hlY2tlZCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGlzSGFsZkNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSGFsZkNoZWNrZWQ7XG4gIH1cblxuICBzZXQgaXNIYWxmQ2hlY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzSGFsZkNoZWNrZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmFmdGVyVmFsdWVDaGFuZ2UoJ2lzSGFsZkNoZWNrZWQnKTtcbiAgfVxuXG4gIGdldCBpc1NlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2VsZWN0YWJsZTtcbiAgfVxuXG4gIHNldCBpc1NlbGVjdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc1NlbGVjdGFibGUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzYWJsZWQ7XG4gIH1cblxuICBzZXQgaXNEaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgZ2V0IGlzRGlzYWJsZUNoZWNrYm94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc2FibGVDaGVja2JveDtcbiAgfVxuXG4gIHNldCBpc0Rpc2FibGVDaGVja2JveCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGlzYWJsZUNoZWNrYm94ID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIGdldCBpc0V4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0V4cGFuZGVkO1xuICB9XG5cbiAgc2V0IGlzRXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0V4cGFuZGVkID0gdmFsdWU7XG4gICAgdGhpcy5vcmlnaW4uZXhwYW5kZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmFmdGVyVmFsdWVDaGFuZ2UoJ2lzRXhwYW5kZWQnKTtcbiAgfVxuXG4gIGdldCBpc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1NlbGVjdGVkO1xuICB9XG5cbiAgc2V0IGlzU2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc1NlbGVjdGVkID0gdmFsdWU7XG4gICAgdGhpcy5vcmlnaW4uc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmFmdGVyVmFsdWVDaGFuZ2UoJ2lzU2VsZWN0ZWQnKTtcbiAgfVxuXG4gIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTG9hZGluZztcbiAgfVxuXG4gIHNldCBpc0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldFN5bmNDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZSwgaGFsZkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0Q2hlY2tlZChjaGVja2VkLCBoYWxmQ2hlY2tlZCk7XG4gICAgaWYgKHRoaXMudHJlZVNlcnZpY2UgJiYgIXRoaXMudHJlZVNlcnZpY2UuaXNDaGVja1N0cmljdGx5KSB7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbmR1Y3QodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIE1heWJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLCB1c2UgaXNDaGVja2VkIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzZXRDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZSwgaGFsZkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMub3JpZ2luLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgIHRoaXMuaXNDaGVja2VkID0gY2hlY2tlZDtcbiAgICB0aGlzLmlzQWxsQ2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgdGhpcy5pc0hhbGZDaGVja2VkID0gaGFsZkNoZWNrZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgTWF5YmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHZlcnNpb24sIHVzZSBpc0V4cGFuZGVkIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzZXRFeHBhbmRlZCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNFeHBhbmRlZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIE1heWJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLCB1c2UgaXNTZWxlY3RlZCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNTZWxlY3RlZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmVudE5vZGUoKTogTnpUcmVlTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2hpbGRyZW4oKTogTnpUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiDDpsKUwq/DpsKMwoHDpsKMwonDp8K0wqLDpcK8wpXDpMK9wo3Dp8K9wq7DpsKPwpLDpcKFwqUsw6XCj8K2w6XCrcKQw6jCisKCw6fCgsK5w6TCuMKNw6XCj8Kvw6bCt8K7w6XCisKgXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBhZGRDaGlsZHJlbihjaGlsZHJlbjogYW55W10sIGNoaWxkUG9zOiBudW1iZXIgPSAtMSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xlYWYpIHtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hMZXZlbCA9IChuOiBOelRyZWVOb2RlKSA9PiB7XG4gICAgICAgICAgbi5nZXRDaGlsZHJlbigpLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICBjLmxldmVsID0gYy5nZXRQYXJlbnROb2RlKCkhLmxldmVsICsgMTtcbiAgICAgICAgICAgIC8vIGZsdXNoIG9yaWdpblxuICAgICAgICAgICAgYy5vcmlnaW4ubGV2ZWwgPSBjLmxldmVsO1xuICAgICAgICAgICAgcmVmcmVzaExldmVsKGMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlO1xuICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBOelRyZWVOb2RlKSB7XG4gICAgICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGQgPSBuZXcgTnpUcmVlTm9kZShub2RlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZC5sZXZlbCA9IHRoaXMubGV2ZWwgKyAxO1xuICAgICAgICBjaGlsZC5vcmlnaW4ubGV2ZWwgPSBjaGlsZC5sZXZlbDtcbiAgICAgICAgcmVmcmVzaExldmVsKGNoaWxkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjaGlsZFBvcyA9PT0gLTEgPyB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpIDogdGhpcy5jaGlsZHJlbi5zcGxpY2UoY2hpbGRQb3MsIDAsIGNoaWxkKTtcbiAgICAgICAgICAvLyBmbHVzaCBvcmlnaW5cbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcmlnaW4uY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCkubWFwKHYgPT4gdi5vcmlnaW4pO1xuICAgICAgLy8gcmVtb3ZlIGxvYWRpbmcgc3RhdGVcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyQ2hpbGRyZW4oKTogdm9pZCB7XG4gICAgLy8gcmVmcmVzaCBjaGVja2VkIHN0YXRlXG4gICAgdGhpcy5hZnRlclZhbHVlQ2hhbmdlKCdjbGVhckNoaWxkcmVuJyk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMub3JpZ2luLmNoaWxkcmVuID0gW107XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmdldFBhcmVudE5vZGUoKTtcbiAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbiA9IHBhcmVudE5vZGUuZ2V0Q2hpbGRyZW4oKS5maWx0ZXIodiA9PiB2LmtleSAhPT0gdGhpcy5rZXkpO1xuICAgICAgcGFyZW50Tm9kZS5vcmlnaW4uY2hpbGRyZW4gPSBwYXJlbnROb2RlLm9yaWdpbi5jaGlsZHJlbiEuZmlsdGVyKHYgPT4gdi5rZXkgIT09IHRoaXMua2V5KTtcbiAgICAgIHRoaXMuYWZ0ZXJWYWx1ZUNoYW5nZSgncmVtb3ZlJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFmdGVyVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmVlU2VydmljZSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnaXNDaGVja2VkJzpcbiAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnNldENoZWNrZWROb2RlTGlzdCh0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaXNIYWxmQ2hlY2tlZCc6XG4gICAgICAgICAgdGhpcy50cmVlU2VydmljZS5zZXRIYWxmQ2hlY2tlZE5vZGVMaXN0KHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpc0V4cGFuZGVkJzpcbiAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnNldEV4cGFuZGVkTm9kZUxpc3QodGhpcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2lzU2VsZWN0ZWQnOlxuICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2Uuc2V0Tm9kZUFjdGl2ZSh0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2xlYXJDaGlsZHJlbic6XG4gICAgICAgICAgdGhpcy50cmVlU2VydmljZS5hZnRlclJlbW92ZSh0aGlzLmdldENoaWxkcmVuKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZW1vdmUnOlxuICAgICAgICAgIHRoaXMudHJlZVNlcnZpY2UuYWZ0ZXJSZW1vdmUoW3RoaXNdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5zZXRDbGFzc01hcCgpO1xuICAgICAgdGhpcy5jb21wb25lbnQubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXk8VD4odmFsdWU6IFQgfCBUW10pOiBUW10ge1xuICBsZXQgcmV0OiBUW107XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0ID0gW107XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0ID0gW3ZhbHVlXTtcbiAgfSBlbHNlIHtcbiAgICByZXQgPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzRXF1YWw8VD4oYXJyYXkxOiBUW10sIGFycmF5MjogVFtdKTogYm9vbGVhbiB7XG4gIGlmICghYXJyYXkxIHx8ICFhcnJheTIgfHwgYXJyYXkxLmxlbmd0aCAhPT0gYXJyYXkyLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGxlbiA9IGFycmF5MS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29weUFycmF5PFQ+KHNvdXJjZTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZS5zbGljZSgpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gcXVlcnkgRE9NIGluZm9ybWF0aW9uIG9yXG4gKiBzZXQgcHJvcGVydGllcy5cbiAqL1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGZpbHRlck5vdEVtcHR5Tm9kZSB9IGZyb20gJy4vY2hlY2snO1xuXG4vKipcbiAqIFNpbGVudCBhbiBldmVudCBieSBzdG9wcGluZyBhbmQgcHJldmVudGluZyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbGVudEV2ZW50KGU6IEV2ZW50KTogdm9pZCB7XG4gIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRPZmZzZXQoZWxlbTogSFRNTEVsZW1lbnQpOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSB7XG4gIGlmICghZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkge1xuICAgIHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHdpbiA9IGVsZW0ub3duZXJEb2N1bWVudCEuZGVmYXVsdFZpZXc7XG4gIHJldHVybiB7XG4gICAgdG9wOiByZWN0LnRvcCArIHdpbiEucGFnZVlPZmZzZXQsXG4gICAgbGVmdDogcmVjdC5sZWZ0ICsgd2luIS5wYWdlWE9mZnNldFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEZpcnN0Tm90RW1wdHlOb2RlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogTm9kZSB8IG51bGwge1xuICBjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpO1xuICAgIGlmIChmaWx0ZXJOb3RFbXB0eU5vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0Tm90RW1wdHlOb2RlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogTm9kZSB8IG51bGwge1xuICBjb25zdCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgZm9yIChsZXQgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qgbm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7XG4gICAgaWYgKGZpbHRlck5vdEVtcHR5Tm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZUNoaWxkTm9kZXMocGFyZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVzO1xuICBsZXQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICBpZiAobGVuZ3RoKSB7XG4gICAgY29uc3Qgbm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKG5vZGUsIGkpID0+IChub2Rlc1tpXSA9IG5vZGUpKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2Rlc1tsZW5ndGhdKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZlc3RpZ2F0ZSBpZiBhbiBldmVudCBpcyBhIGBUb3VjaEV2ZW50YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVG91Y2hFdmVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBldmVudCBpcyBUb3VjaEV2ZW50IHtcbiAgcmV0dXJuIGV2ZW50LnR5cGUuc3RhcnRzV2l0aCgndG91Y2gnKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3VzZVRvdWNoT2JzZXJ2ZXJDb25maWcge1xuICBlbmQ6IHN0cmluZztcbiAgbW92ZTogc3RyaW5nO1xuICBwbHVja0tleTogc3RyaW5nW107XG4gIHN0YXJ0OiBzdHJpbmc7XG5cbiAgZW5kJD86IE9ic2VydmFibGU8RXZlbnQ+O1xuICBtb3ZlUmVzb2x2ZWQkPzogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBzdGFydFBsdWNrZWQkPzogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGZpbHRlcj8oZTogRXZlbnQpOiBib29sZWFuO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdFeHAocHJlZml4OiBzdHJpbmcgfCBzdHJpbmdbXSk6IFJlZ0V4cCB7XG4gIGNvbnN0IHByZWZpeEFycmF5ID0gQXJyYXkuaXNBcnJheShwcmVmaXgpID8gcHJlZml4IDogW3ByZWZpeF07XG4gIGxldCBwcmVmaXhUb2tlbiA9IHByZWZpeEFycmF5LmpvaW4oJycpLnJlcGxhY2UoLyhcXCR8XFxeKS9nLCAnXFxcXCQxJyk7XG5cbiAgaWYgKHByZWZpeEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICBwcmVmaXhUb2tlbiA9IGBbJHtwcmVmaXhUb2tlbn1dYDtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKGAoXFxcXHN8XikoJHtwcmVmaXhUb2tlbn0pW15cXFxcc10qYCwgJ2cnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbnRpb25zKHZhbHVlOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nIHwgc3RyaW5nW10gPSAnQCcpOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJlZ2V4ID0gZ2V0UmVnRXhwKHByZWZpeCk7XG4gIGNvbnN0IG1lbnRpb25zID0gdmFsdWUubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWVudGlvbnMgIT09IG51bGwgPyBtZW50aW9ucy5tYXAoZSA9PiBlLnRyaW0oKSkgOiBbXTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG4vKipcbiAqIE11Y2ggbGlrZSBsb2Rhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWRTdGFydCh0b1BhZDogc3RyaW5nLCBsZW5ndGg6IG51bWJlciwgZWxlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvUGFkLmxlbmd0aCA+IGxlbmd0aCkge1xuICAgIHJldHVybiB0b1BhZDtcbiAgfVxuXG4gIGNvbnN0IGpvaW5lZCA9IGAke2dldFJlcGVhdGVkRWxlbWVudChsZW5ndGgsIGVsZW1lbnQpfSR7dG9QYWR9YDtcbiAgcmV0dXJuIGpvaW5lZC5zbGljZShqb2luZWQubGVuZ3RoIC0gbGVuZ3RoLCBqb2luZWQubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhZEVuZCh0b1BhZDogc3RyaW5nLCBsZW5ndGg6IG51bWJlciwgZWxlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gYCR7dG9QYWR9JHtnZXRSZXBlYXRlZEVsZW1lbnQobGVuZ3RoLCBlbGVtZW50KX1gO1xuICByZXR1cm4gam9pbmVkLnNsaWNlKDAsIGxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBlYXRlZEVsZW1lbnQobGVuZ3RoOiBudW1iZXIsIGVsZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBBcnJheShsZW5ndGgpXG4gICAgLmZpbGwoZWxlbWVudClcbiAgICAuam9pbignJyk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZShvYmo6IGFueSk6IG9iaiBpcyBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouY2F0Y2ggPT09ICdmdW5jdGlvbic7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcmNlbnQobWluOiBudW1iZXIsIG1heDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuICgodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbikpICogMTAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJlY2lzaW9uKG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbnVtU3RyID0gbnVtLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGRvdEluZGV4ID0gbnVtU3RyLmluZGV4T2YoJy4nKTtcbiAgcmV0dXJuIGRvdEluZGV4ID49IDAgPyBudW1TdHIubGVuZ3RoIC0gZG90SW5kZXggLSAxIDogMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZU51bWJlckluUmFuZ2UobnVtOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpc05hTihudW0pIHx8IG51bSA8IG1pbikge1xuICAgIHJldHVybiBtaW47XG4gIH0gZWxzZSBpZiAobnVtID4gbWF4KSB7XG4gICAgcmV0dXJuIG1heDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KG5vZGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGNvbnN0IG5vZGVBc0FueSA9IG5vZGUgYXMgYW55OyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWFueVxuICBpZiAobm9kZUFzQW55LnNjcm9sbEludG9WaWV3SWZOZWVkZWQpIHtcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWwgKi9cbiAgICBub2RlQXNBbnkuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZChmYWxzZSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChub2RlLnNjcm9sbEludG9WaWV3KSB7XG4gICAgbm9kZS5zY3JvbGxJbnRvVmlldyhmYWxzZSk7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vY29tcG9uZW50L3RleHRhcmVhLWNhcmV0LXBvc2l0aW9uXG5cbi8vIFdlJ2xsIGNvcHkgdGhlIHByb3BlcnRpZXMgYmVsb3cgaW50byB0aGUgbWlycm9yIGRpdi5cbi8vIE5vdGUgdGhhdCBzb21lIGJyb3dzZXJzLCBzdWNoIGFzIEZpcmVmb3gsIGRvIG5vdCBjb25jYXRlbmF0ZSBwcm9wZXJ0aWVzXG4vLyBpbnRvIHRoZWlyIHNob3J0aGFuZCAoZS5nLiBwYWRkaW5nLXRvcCwgcGFkZGluZy1ib3R0b20gZXRjLiAtPiBwYWRkaW5nKSxcbi8vIHNvIHdlIGhhdmUgdG8gbGlzdCBldmVyeSBzaW5nbGUgcHJvcGVydHkgZXhwbGljaXRseS5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0aWVzID0gW1xuICAnZGlyZWN0aW9uJywgLy8gUlRMIHN1cHBvcnRcbiAgJ2JveFNpemluZycsXG4gICd3aWR0aCcsIC8vIG9uIENocm9tZSBhbmQgSUUsIGV4Y2x1ZGUgdGhlIHNjcm9sbGJhciwgc28gdGhlIG1pcnJvciBkaXYgd3JhcHMgZXhhY3RseSBhcyB0aGUgdGV4dGFyZWEgZG9lc1xuICAnaGVpZ2h0JyxcbiAgJ292ZXJmbG93WCcsXG4gICdvdmVyZmxvd1knLCAvLyBjb3B5IHRoZSBzY3JvbGxiYXIgZm9yIElFXG5cbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclN0eWxlJyxcblxuICAncGFkZGluZ1RvcCcsXG4gICdwYWRkaW5nUmlnaHQnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdwYWRkaW5nTGVmdCcsXG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnRcbiAgJ2ZvbnRTdHlsZScsXG4gICdmb250VmFyaWFudCcsXG4gICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnRTaXplJyxcbiAgJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2xpbmVIZWlnaHQnLFxuICAnZm9udEZhbWlseScsXG5cbiAgJ3RleHRBbGlnbicsXG4gICd0ZXh0VHJhbnNmb3JtJyxcbiAgJ3RleHRJbmRlbnQnLFxuICAndGV4dERlY29yYXRpb24nLCAvLyBtaWdodCBub3QgbWFrZSBhIGRpZmZlcmVuY2UsIGJ1dCBiZXR0ZXIgYmUgc2FmZVxuXG4gICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ3dvcmRTcGFjaW5nJyxcblxuICAndGFiU2l6ZScsXG4gICdNb3pUYWJTaXplJ1xuXTtcblxuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmNvbnN0IGlzRmlyZWZveCA9IGlzQnJvd3NlciAmJiAod2luZG93IGFzIGFueSkubW96SW5uZXJTY3JlZW5YICE9IG51bGw7XG5cbmNvbnN0IF9wYXJzZUludCA9IChzdHI6IHN0cmluZykgPT4gcGFyc2VJbnQoc3RyLCAxMCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29vcmRpbmF0ZXMge1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhcmV0Q29vcmRpbmF0ZXMoXG4gIGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICBwb3NpdGlvbjogbnVtYmVyLFxuICBvcHRpb25zPzogeyBkZWJ1Zz86IGJvb2xlYW4gfVxuKTogQ29vcmRpbmF0ZXMge1xuICBpZiAoIWlzQnJvd3Nlcikge1xuICAgIHRocm93IG5ldyBFcnJvcigndGV4dGFyZWEtY2FyZXQtcG9zaXRpb24jZ2V0Q2FyZXRDb29yZGluYXRlcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gYSBicm93c2VyJyk7XG4gIH1cblxuICBjb25zdCBkZWJ1ZyA9IChvcHRpb25zICYmIG9wdGlvbnMuZGVidWcpIHx8IGZhbHNlO1xuICBpZiAoZGVidWcpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpbnB1dC10ZXh0YXJlYS1jYXJldC1wb3NpdGlvbi1taXJyb3ItZGl2Jyk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZChlbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIG1pcnJvciBkaXYgd2lsbCByZXBsaWNhdGUgdGhlIHRleHRhcmVhJ3Mgc3R5bGVcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5pZCA9ICdpbnB1dC10ZXh0YXJlYS1jYXJldC1wb3NpdGlvbi1taXJyb3ItZGl2JztcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuXG4gIGNvbnN0IHN0eWxlID0gZGl2LnN0eWxlO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgY29uc3QgY29tcHV0ZWQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIDogKGVsZW1lbnQgYXMgYW55KS5jdXJyZW50U3R5bGU7IC8vIGN1cnJlbnRTdHlsZSBmb3IgSUUgPCA5XG4gIGNvbnN0IGlzSW5wdXQgPSBlbGVtZW50Lm5vZGVOYW1lID09PSAnSU5QVVQnO1xuXG4gIC8vIERlZmF1bHQgdGV4dGFyZWEgc3R5bGVzXG4gIHN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnO1xuICBpZiAoIWlzSW5wdXQpIHtcbiAgICBzdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJzsgLy8gb25seSBmb3IgdGV4dGFyZWEtc1xuICB9XG5cbiAgLy8gUG9zaXRpb24gb2ZmLXNjcmVlblxuICBzdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7IC8vIHJlcXVpcmVkIHRvIHJldHVybiBjb29yZGluYXRlcyBwcm9wZXJseVxuICBpZiAoIWRlYnVnKSB7XG4gICAgc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICB9IC8vIG5vdCAnZGlzcGxheTogbm9uZScgYmVjYXVzZSB3ZSB3YW50IHJlbmRlcmluZ1xuXG4gIC8vIFRyYW5zZmVyIHRoZSBlbGVtZW50J3MgcHJvcGVydGllcyB0byB0aGUgZGl2XG4gIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGlzSW5wdXQgJiYgcHJvcCA9PT0gJ2xpbmVIZWlnaHQnKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIDxpbnB1dD5zIGJlY2F1c2UgdGV4dCBpcyByZW5kZXJlZCBjZW50ZXJlZCBhbmQgbGluZSBoZWlnaHQgbWF5IGJlICE9IGhlaWdodFxuICAgICAgc3R5bGUubGluZUhlaWdodCA9IGNvbXB1dGVkLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgc3R5bGVbcHJvcF0gPSBjb21wdXRlZFtwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChpc0ZpcmVmb3gpIHtcbiAgICAvLyBGaXJlZm94IGxpZXMgYWJvdXQgdGhlIG92ZXJmbG93IHByb3BlcnR5IGZvciB0ZXh0YXJlYXM6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk4NDI3NVxuICAgIGlmIChlbGVtZW50LnNjcm9sbEhlaWdodCA+IF9wYXJzZUludChjb21wdXRlZC5oZWlnaHQpKSB7XG4gICAgICBzdHlsZS5vdmVyZmxvd1kgPSAnc2Nyb2xsJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsgLy8gZm9yIENocm9tZSB0byBub3QgcmVuZGVyIGEgc2Nyb2xsYmFyOyBJRSBrZWVwcyBvdmVyZmxvd1kgPSAnc2Nyb2xsJ1xuICB9XG5cbiAgZGl2LnRleHRDb250ZW50ID0gZWxlbWVudC52YWx1ZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24pO1xuICAvLyBUaGUgc2Vjb25kIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGlucHV0IHR5cGU9XCJ0ZXh0XCIgdnMgdGV4dGFyZWE6XG4gIC8vIHNwYWNlcyBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggbm9uLWJyZWFraW5nIHNwYWNlcyAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEzNDAyMDM1LzEyNjkwMzdcbiAgaWYgKGlzSW5wdXQpIHtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBkaXYudGV4dENvbnRlbnQucmVwbGFjZSgvXFxzL2csICdcXHUwMGEwJyk7XG4gIH1cblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAvLyBXcmFwcGluZyBtdXN0IGJlIHJlcGxpY2F0ZWQgKmV4YWN0bHkqLCBpbmNsdWRpbmcgd2hlbiBhIGxvbmcgd29yZCBnZXRzXG4gIC8vIG9udG8gdGhlIG5leHQgbGluZSwgd2l0aCB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYmVmb3JlICgjNykuXG4gIC8vIFRoZSAgKm9ubHkqIHJlbGlhYmxlIHdheSB0byBkbyB0aGF0IGlzIHRvIGNvcHkgdGhlICplbnRpcmUqIHJlc3Qgb2YgdGhlXG4gIC8vIHRleHRhcmVhJ3MgY29udGVudCBpbnRvIHRoZSA8c3Bhbj4gY3JlYXRlZCBhdCB0aGUgY2FyZXQgcG9zaXRpb24uXG4gIC8vIEZvciBpbnB1dHMsIGp1c3QgJy4nIHdvdWxkIGJlIGVub3VnaCwgYnV0IG5vIG5lZWQgdG8gYm90aGVyLlxuICBzcGFuLnRleHRDb250ZW50ID0gZWxlbWVudC52YWx1ZS5zdWJzdHJpbmcocG9zaXRpb24pIHx8ICcuJzsgLy8gfHwgYmVjYXVzZSBhIGNvbXBsZXRlbHkgZW1wdHkgZmF1eCBzcGFuIGRvZXNuJ3QgcmVuZGVyIGF0IGFsbFxuICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgY29uc3QgY29vcmRpbmF0ZXMgPSB7XG4gICAgdG9wOiBzcGFuLm9mZnNldFRvcCArIF9wYXJzZUludChjb21wdXRlZC5ib3JkZXJUb3BXaWR0aCksXG4gICAgbGVmdDogc3Bhbi5vZmZzZXRMZWZ0ICsgX3BhcnNlSW50KGNvbXB1dGVkLmJvcmRlckxlZnRXaWR0aCksXG4gICAgaGVpZ2h0OiBfcGFyc2VJbnQoY29tcHV0ZWQubGluZUhlaWdodClcbiAgfTtcblxuICBpZiAoZGVidWcpIHtcbiAgICBzcGFuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZWVlJztcbiAgICBjcmVhdGVEZWJ1Z0VsZShlbGVtZW50LCBjb29yZGluYXRlcyk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICB9XG5cbiAgcmV0dXJuIGNvb3JkaW5hdGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVidWdFbGUoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQsIGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcyk6IHZvaWQge1xuICBjb25zdCBmb250U2l6ZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJyk7XG4gIGNvbnN0IHJlY3Q6IEhUTUxTcGFuRWxlbWVudCA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjREVCVUcnKSBhcyBIVE1MU3BhbkVsZW1lbnQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJlY3QpO1xuICByZWN0LmlkID0gJ0RFQlVHJztcbiAgcmVjdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIHJlY3Quc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JlZCc7XG4gIHJlY3Quc3R5bGUuaGVpZ2h0ID0gZm9udFNpemU7XG4gIHJlY3Quc3R5bGUud2lkdGggPSAnMXB4JztcbiAgcmVjdC5zdHlsZS50b3AgPSBgJHtlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtXG4gICAgZWxlbWVudC5zY3JvbGxUb3AgK1xuICAgIHdpbmRvdy5wYWdlWU9mZnNldCArXG4gICAgY29vcmRpbmF0ZXMudG9wfXB4YDtcbiAgcmVjdC5zdHlsZS5sZWZ0ID0gYCR7ZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cbiAgICBlbGVtZW50LnNjcm9sbExlZnQgK1xuICAgIHdpbmRvdy5wYWdlWE9mZnNldCArXG4gICAgY29vcmRpbmF0ZXMubGVmdH1weGA7XG4gIGNvbnNvbGUubG9nKHJlY3Quc3R5bGUudG9wKTtcbiAgY29uc29sZS5sb2cocmVjdC5zdHlsZS5sZWZ0KTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgdHlwZWRlZiBuby1pbnZhbGlkLXRoaXNcbmltcG9ydCB7IGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSwgcmVxQW5pbUZyYW1lIH0gZnJvbSAnLi4vcG9seWZpbGwvcmVxdWVzdC1hbmltYXRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWUoZm46IGFueSkge1xuICBsZXQgcmVxdWVzdElkOiBudW1iZXIgfCBudWxsO1xuXG4gIGNvbnN0IGxhdGVyID0gKGFyZ3M6IGFueVtdKSA9PiAoKSA9PiB7XG4gICAgcmVxdWVzdElkID0gbnVsbDtcbiAgICBmbiguLi5hcmdzKTtcbiAgfTtcblxuICBjb25zdCB0aHJvdHRsZWQgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICBpZiAocmVxdWVzdElkID09IG51bGwpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHJlcUFuaW1GcmFtZShsYXRlcihhcmdzKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgKHRocm90dGxlZCBhcyBhbnkpLmNhbmNlbCA9ICgpID0+IGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZShyZXF1ZXN0SWQhKTtcblxuICByZXR1cm4gdGhyb3R0bGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGVCeUFuaW1hdGlvbkZyYW1lRGVjb3JhdG9yKCkge1xuICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBhbnkpIHtcbiAgICBjb25zdCBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgbGV0IGRlZmluaW5nUHJvcGVydHkgPSBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KCkge1xuICAgICAgICBpZiAoZGVmaW5pbmdQcm9wZXJ0eSB8fCB0aGlzID09PSB0YXJnZXQucHJvdG90eXBlIHx8IHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBmbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdW5kRm4gPSB0aHJvdHRsZUJ5QW5pbWF0aW9uRnJhbWUoZm4uYmluZCh0aGlzKSk7XG4gICAgICAgIGRlZmluaW5nUHJvcGVydHkgPSB0cnVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgICAgdmFsdWU6IGJvdW5kRm4sXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBkZWZpbmluZ1Byb3BlcnR5ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBib3VuZEZuO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGNvbnN0IHRpbWVVbml0czogQXJyYXk8W3N0cmluZywgbnVtYmVyXT4gPSBbXG4gIFsnWScsIDEwMDAgKiA2MCAqIDYwICogMjQgKiAzNjVdLCAvLyB5ZWFyc1xuICBbJ00nLCAxMDAwICogNjAgKiA2MCAqIDI0ICogMzBdLCAvLyBtb250aHNcbiAgWydEJywgMTAwMCAqIDYwICogNjAgKiAyNF0sIC8vIGRheXNcbiAgWydIJywgMTAwMCAqIDYwICogNjBdLCAvLyBob3Vyc1xuICBbJ20nLCAxMDAwICogNjBdLCAvLyBtaW51dGVzXG4gIFsncycsIDEwMDBdLCAvLyBzZWNvbmRzXG4gIFsnUycsIDFdIC8vIG1pbGxpb24gc2Vjb25kc1xuXTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBOelRyZWVOb2RlIH0gZnJvbSAnLi9uei10cmVlLWJhc2Utbm9kZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NoZWNrRGlzYWJsZWQobm9kZTogTnpUcmVlTm9kZSk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGlzRGlzYWJsZWQsIGlzRGlzYWJsZUNoZWNrYm94IH0gPSBub2RlO1xuICByZXR1cm4gISEoaXNEaXNhYmxlZCB8fCBpc0Rpc2FibGVDaGVja2JveCk7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc0luQXJyYXkobmVlZGxlOiBhbnksIGhheXN0YWNrOiBhbnlbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGF5c3RhY2subGVuZ3RoID4gMCAmJiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPiAtMTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgaXNOb3ROaWwgfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHsgTnpUcmVlTm9kZSB9IGZyb20gJy4vbnotdHJlZS1iYXNlLW5vZGUnO1xuaW1wb3J0IHsgaXNDaGVja0Rpc2FibGVkLCBpc0luQXJyYXkgfSBmcm9tICcuL256LXRyZWUtYmFzZS11dGlsJztcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50IH0gZnJvbSAnLi9uei10cmVlLWJhc2UuZGVmaW5pdGlvbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTnpUcmVlQmFzZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBEUkFHX1NJREVfUkFOR0UgPSAwLjI1O1xuICBEUkFHX01JTl9HQVAgPSAyO1xuXG4gIGlzQ2hlY2tTdHJpY3RseTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc011bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkTm9kZTogTnpUcmVlTm9kZTtcbiAgcm9vdE5vZGVzOiBOelRyZWVOb2RlW10gPSBbXTtcbiAgc2VsZWN0ZWROb2RlTGlzdDogTnpUcmVlTm9kZVtdID0gW107XG4gIGV4cGFuZGVkTm9kZUxpc3Q6IE56VHJlZU5vZGVbXSA9IFtdO1xuICBjaGVja2VkTm9kZUxpc3Q6IE56VHJlZU5vZGVbXSA9IFtdO1xuICBoYWxmQ2hlY2tlZE5vZGVMaXN0OiBOelRyZWVOb2RlW10gPSBbXTtcbiAgbWF0Y2hlZE5vZGVMaXN0OiBOelRyZWVOb2RlW10gPSBbXTtcbiAgdHJpZ2dlckV2ZW50Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGV2ZW50XG4gICAqL1xuICBldmVudFRyaWdnZXJDaGFuZ2VkKCk6IE9ic2VydmFibGU8TnpGb3JtYXRFbWl0RXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyRXZlbnRDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlc2V0IHRyZWUgbm9kZXMgd2lsbCBjbGVhciBkZWZhdWx0IG5vZGUgbGlzdFxuICAgKi9cbiAgaW5pdFRyZWUobnpOb2RlczogTnpUcmVlTm9kZVtdKTogdm9pZCB7XG4gICAgdGhpcy5yb290Tm9kZXMgPSBuek5vZGVzO1xuICAgIHRoaXMuZXhwYW5kZWROb2RlTGlzdCA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWROb2RlTGlzdCA9IFtdO1xuICAgIHRoaXMuaGFsZkNoZWNrZWROb2RlTGlzdCA9IFtdO1xuICAgIHRoaXMuY2hlY2tlZE5vZGVMaXN0ID0gW107XG4gICAgdGhpcy5tYXRjaGVkTm9kZUxpc3QgPSBbXTtcbiAgICAvLyByZWZyZXNoIG5vZGUgY2hlY2tlZCBzdGF0ZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoQ2hlY2tTdGF0ZSh0aGlzLmlzQ2hlY2tTdHJpY3RseSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTZWxlY3RlZE5vZGUoKTogTnpUcmVlTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgc29tZSBsaXN0XG4gICAqL1xuICBnZXRTZWxlY3RlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZHVjdE5vZGVTdGF0ZSgnc2VsZWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGNoZWNrZWQgbm9kZXNcbiAgICovXG4gIGdldENoZWNrZWROb2RlTGlzdCgpOiBOelRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmR1Y3ROb2RlU3RhdGUoJ2NoZWNrJyk7XG4gIH1cblxuICBnZXRIYWxmQ2hlY2tlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZHVjdE5vZGVTdGF0ZSgnaGFsZkNoZWNrJyk7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGV4cGFuZGVkIG5vZGVzXG4gICAqL1xuICBnZXRFeHBhbmRlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZHVjdE5vZGVTdGF0ZSgnZXhwYW5kJyk7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHNlYXJjaCBtYXRjaGVkIG5vZGVzXG4gICAqL1xuICBnZXRNYXRjaGVkTm9kZUxpc3QoKTogTnpUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25kdWN0Tm9kZVN0YXRlKCdtYXRjaCcpO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBpc0FycmF5T2ZOelRyZWVOb2RlKHZhbHVlOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZS5ldmVyeShpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBOelRyZWVOb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXNldCBzZWxlY3RlZE5vZGVMaXN0XG4gICAqL1xuICBjYWxjU2VsZWN0ZWRLZXlzKHNlbGVjdGVkS2V5czogc3RyaW5nW10sIG56Tm9kZXM6IE56VHJlZU5vZGVbXSwgaXNNdWx0aTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgY2FsYyA9IChub2RlczogTnpUcmVlTm9kZVtdKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gbm9kZXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgIGlmIChpc0luQXJyYXkobm9kZS5rZXksIHNlbGVjdGVkS2V5cykpIHtcbiAgICAgICAgICBub2RlLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICghaXNNdWx0aSkge1xuICAgICAgICAgICAgLy8gaWYgbm90IHN1cHBvcnQgbXVsdGkgc2VsZWN0XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBSZWN1cnNpb25cbiAgICAgICAgICByZXR1cm4gY2FsYyhub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY2FsYyhuek5vZGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXNldCBleHBhbmRlZE5vZGVMaXN0XG4gICAqL1xuICBjYWxjRXhwYW5kZWRLZXlzKGV4cGFuZGVkS2V5czogc3RyaW5nW10sIG56Tm9kZXM6IE56VHJlZU5vZGVbXSk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWROb2RlTGlzdCA9IFtdO1xuICAgIGNvbnN0IGNhbGMgPSAobm9kZXM6IE56VHJlZU5vZGVbXSkgPT4ge1xuICAgICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgbm9kZS5pc0V4cGFuZGVkID0gaXNJbkFycmF5KG5vZGUua2V5LCBleHBhbmRlZEtleXMpO1xuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2FsYyhub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBjYWxjKG56Tm9kZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlc2V0IGNoZWNrZWROb2RlTGlzdFxuICAgKi9cbiAgY2FsY0NoZWNrZWRLZXlzKGNoZWNrZWRLZXlzOiBzdHJpbmdbXSwgbnpOb2RlczogTnpUcmVlTm9kZVtdLCBpc0NoZWNrU3RyaWN0bHk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tlZE5vZGVMaXN0ID0gW107XG4gICAgdGhpcy5oYWxmQ2hlY2tlZE5vZGVMaXN0ID0gW107XG4gICAgY29uc3QgY2FsYyA9IChub2RlczogTnpUcmVlTm9kZVtdKSA9PiB7XG4gICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBpZiAoaXNJbkFycmF5KG5vZGUua2V5LCBjaGVja2VkS2V5cykpIHtcbiAgICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgbm9kZS5pc0hhbGZDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICBub2RlLmlzSGFsZkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2FsYyhub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBjYWxjKG56Tm9kZXMpO1xuICAgIC8vIGNvbnRyb2xsZWQgc3RhdGVcbiAgICB0aGlzLnJlZnJlc2hDaGVja1N0YXRlKGlzQ2hlY2tTdHJpY3RseSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGRyYWcgbm9kZVxuICAgKi9cbiAgc2V0U2VsZWN0ZWROb2RlKG5vZGU6IE56VHJlZU5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGU7XG4gIH1cblxuICAvKipcbiAgICogc2V0IG5vZGUgc2VsZWN0ZWQgc3RhdHVzXG4gICAqL1xuICBzZXROb2RlQWN0aXZlKG5vZGU6IE56VHJlZU5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdWx0aXBsZSAmJiBub2RlLmlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlTGlzdC5mb3JFYWNoKG4gPT4ge1xuICAgICAgICBpZiAobm9kZS5rZXkgIT09IG4ua2V5KSB7XG4gICAgICAgICAgLy8gcmVzZXQgb3RoZXIgbm9kZXNcbiAgICAgICAgICBuLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBzaW5nbGUgbW9kZTogcmVtb3ZlIHByZSBub2RlXG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZUxpc3QgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5zZXRTZWxlY3RlZE5vZGVMaXN0KG5vZGUsIHRoaXMuaXNNdWx0aXBsZSk7XG4gIH1cblxuICAvKipcbiAgICogYWRkIG9yIHJlbW92ZSBub2RlIHRvIHNlbGVjdGVkTm9kZUxpc3RcbiAgICovXG4gIHNldFNlbGVjdGVkTm9kZUxpc3Qobm9kZTogTnpUcmVlTm9kZSwgaXNNdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkTm9kZUxpc3QuZmluZEluZGV4KG4gPT4gbm9kZS5rZXkgPT09IG4ua2V5KTtcbiAgICBpZiAoaXNNdWx0aXBsZSkge1xuICAgICAgaWYgKG5vZGUuaXNTZWxlY3RlZCAmJiBpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChub2RlLmlzU2VsZWN0ZWQgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlTGlzdCA9IFtub2RlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFub2RlLmlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlTGlzdCA9IHRoaXMuc2VsZWN0ZWROb2RlTGlzdC5maWx0ZXIobiA9PiBuLmtleSAhPT0gbm9kZS5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZSBjaGVja2VkIG5vZGVzXG4gICAqL1xuICBzZXRIYWxmQ2hlY2tlZE5vZGVMaXN0KG5vZGU6IE56VHJlZU5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaGFsZkNoZWNrZWROb2RlTGlzdC5maW5kSW5kZXgobiA9PiBub2RlLmtleSA9PT0gbi5rZXkpO1xuICAgIGlmIChub2RlLmlzSGFsZkNoZWNrZWQgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmhhbGZDaGVja2VkTm9kZUxpc3QucHVzaChub2RlKTtcbiAgICB9IGVsc2UgaWYgKCFub2RlLmlzSGFsZkNoZWNrZWQgJiYgaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5oYWxmQ2hlY2tlZE5vZGVMaXN0ID0gdGhpcy5oYWxmQ2hlY2tlZE5vZGVMaXN0LmZpbHRlcihuID0+IG5vZGUua2V5ICE9PSBuLmtleSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q2hlY2tlZE5vZGVMaXN0KG5vZGU6IE56VHJlZU5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY2hlY2tlZE5vZGVMaXN0LmZpbmRJbmRleChuID0+IG5vZGUua2V5ID09PSBuLmtleSk7XG4gICAgaWYgKG5vZGUuaXNDaGVja2VkICYmIGluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jaGVja2VkTm9kZUxpc3QucHVzaChub2RlKTtcbiAgICB9IGVsc2UgaWYgKCFub2RlLmlzQ2hlY2tlZCAmJiBpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmNoZWNrZWROb2RlTGlzdCA9IHRoaXMuY2hlY2tlZE5vZGVMaXN0LmZpbHRlcihuID0+IG5vZGUua2V5ICE9PSBuLmtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNvbmR1Y3QgY2hlY2tlZC9zZWxlY3RlZC9leHBhbmRlZCBrZXlzXG4gICAqL1xuICBjb25kdWN0Tm9kZVN0YXRlKHR5cGU6IHN0cmluZyA9ICdjaGVjaycpOiBOelRyZWVOb2RlW10ge1xuICAgIGxldCByZXN1bHROb2Rlc0xpc3Q6IE56VHJlZU5vZGVbXSA9IFtdO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmVzdWx0Tm9kZXNMaXN0ID0gdGhpcy5zZWxlY3RlZE5vZGVMaXN0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V4cGFuZCc6XG4gICAgICAgIHJlc3VsdE5vZGVzTGlzdCA9IHRoaXMuZXhwYW5kZWROb2RlTGlzdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtYXRjaCc6XG4gICAgICAgIHJlc3VsdE5vZGVzTGlzdCA9IHRoaXMubWF0Y2hlZE5vZGVMaXN0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NoZWNrJzpcbiAgICAgICAgcmVzdWx0Tm9kZXNMaXN0ID0gdGhpcy5jaGVja2VkTm9kZUxpc3Q7XG4gICAgICAgIGNvbnN0IGlzSWdub3JlID0gKG5vZGU6IE56VHJlZU5vZGUpOiBib29sZWFuID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrZWROb2RlTGlzdC5maW5kSW5kZXgobiA9PiBuLmtleSA9PT0gcGFyZW50Tm9kZS5rZXkpID4gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaXNJZ25vcmUocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gbWVyZ2UgY2hlY2tlZFxuICAgICAgICBpZiAoIXRoaXMuaXNDaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgcmVzdWx0Tm9kZXNMaXN0ID0gdGhpcy5jaGVja2VkTm9kZUxpc3QuZmlsdGVyKG4gPT4gIWlzSWdub3JlKG4pKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hhbGZDaGVjayc6XG4gICAgICAgIGlmICghdGhpcy5pc0NoZWNrU3RyaWN0bHkpIHtcbiAgICAgICAgICByZXN1bHROb2Rlc0xpc3QgPSB0aGlzLmhhbGZDaGVja2VkTm9kZUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHROb2Rlc0xpc3Q7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGV4cGFuZGVkIG5vZGVzXG4gICAqL1xuICBzZXRFeHBhbmRlZE5vZGVMaXN0KG5vZGU6IE56VHJlZU5vZGUpOiB2b2lkIHtcbiAgICBpZiAobm9kZS5pc0xlYWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmV4cGFuZGVkTm9kZUxpc3QuZmluZEluZGV4KG4gPT4gbm9kZS5rZXkgPT09IG4ua2V5KTtcbiAgICBpZiAobm9kZS5pc0V4cGFuZGVkICYmIGluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5leHBhbmRlZE5vZGVMaXN0LnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIGlmICghbm9kZS5pc0V4cGFuZGVkICYmIGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWROb2RlTGlzdCA9IHRoaXMuZXhwYW5kZWROb2RlTGlzdC5maWx0ZXIobiA9PiBub2RlLmtleSAhPT0gbi5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVjayBzdGF0ZVxuICAgKiBAcGFyYW0gaXNDaGVja1N0cmljdGx5XG4gICAqL1xuICByZWZyZXNoQ2hlY2tTdGF0ZShpc0NoZWNrU3RyaWN0bHk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmIChpc0NoZWNrU3RyaWN0bHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGVja2VkTm9kZUxpc3QuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIHRoaXMuY29uZHVjdChub2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJlc2V0IG90aGVyIG5vZGUgY2hlY2tlZCBzdGF0ZSBiYXNlZCBjdXJyZW50IG5vZGVcbiAgY29uZHVjdChub2RlOiBOelRyZWVOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgaXNDaGVja2VkID0gbm9kZS5pc0NoZWNrZWQ7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMuY29uZHVjdFVwKG5vZGUpO1xuICAgICAgdGhpcy5jb25kdWN0RG93bihub2RlLCBpc0NoZWNrZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAxw6PCgMKBY2hpbGRyZW4gaGFsZiBjaGVja2VkXG4gICAqIDLDo8KAwoFjaGlsZHJlbiBhbGwgY2hlY2tlZCwgcGFyZW50IGNoZWNrZWRcbiAgICogM8OjwoDCgW5vIGNoaWxkcmVuIGNoZWNrZWRcbiAgICovXG4gIGNvbmR1Y3RVcChub2RlOiBOelRyZWVOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpO1xuICAgIC8vIMOlwoXCqMOnwqbCgcOnwpTCqMOoworCgsOnwoLCucOkwrjCjcOpwoDCicOkwrjCrVxuICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICBpZiAoIWlzQ2hlY2tEaXNhYmxlZChwYXJlbnROb2RlKSkge1xuICAgICAgICBpZiAocGFyZW50Tm9kZS5jaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBpc0NoZWNrRGlzYWJsZWQoY2hpbGQpIHx8ICghY2hpbGQuaXNIYWxmQ2hlY2tlZCAmJiBjaGlsZC5pc0NoZWNrZWQpKSkge1xuICAgICAgICAgIHBhcmVudE5vZGUuaXNDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICBwYXJlbnROb2RlLmlzSGFsZkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnROb2RlLmNoaWxkcmVuLnNvbWUoY2hpbGQgPT4gY2hpbGQuaXNIYWxmQ2hlY2tlZCB8fCBjaGlsZC5pc0NoZWNrZWQpKSB7XG4gICAgICAgICAgcGFyZW50Tm9kZS5pc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICBwYXJlbnROb2RlLmlzSGFsZkNoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudE5vZGUuaXNDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgcGFyZW50Tm9kZS5pc0hhbGZDaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Q2hlY2tlZE5vZGVMaXN0KHBhcmVudE5vZGUpO1xuICAgICAgdGhpcy5zZXRIYWxmQ2hlY2tlZE5vZGVMaXN0KHBhcmVudE5vZGUpO1xuICAgICAgdGhpcy5jb25kdWN0VXAocGFyZW50Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlc2V0IGNoaWxkIGNoZWNrIHN0YXRlXG4gICAqL1xuICBjb25kdWN0RG93bihub2RlOiBOelRyZWVOb2RlLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghaXNDaGVja0Rpc2FibGVkKG5vZGUpKSB7XG4gICAgICBub2RlLmlzQ2hlY2tlZCA9IHZhbHVlO1xuICAgICAgbm9kZS5pc0hhbGZDaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldENoZWNrZWROb2RlTGlzdChub2RlKTtcbiAgICAgIHRoaXMuc2V0SGFsZkNoZWNrZWROb2RlTGlzdChub2RlKTtcbiAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChuID0+IHtcbiAgICAgICAgdGhpcy5jb25kdWN0RG93bihuLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2VhcmNoIHZhbHVlICYgZXhwYW5kIG5vZGVcbiAgICogc2hvdWxkIGFkZCBleHBhbmRsaXN0XG4gICAqL1xuICBzZWFyY2hFeHBhbmQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWF0Y2hlZE5vZGVMaXN0ID0gW107XG4gICAgY29uc3QgZXhwYW5kZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghaXNOb3ROaWwodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHRvIHJlc2V0IGV4cGFuZGVkTm9kZUxpc3RcbiAgICBjb25zdCBleHBhbmRQYXJlbnQgPSAobjogTnpUcmVlTm9kZSkgPT4ge1xuICAgICAgLy8gZXhwYW5kIHBhcmVudCBub2RlXG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gbi5nZXRQYXJlbnROb2RlKCk7XG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBleHBhbmRlZEtleXMucHVzaChwYXJlbnROb2RlLmtleSk7XG4gICAgICAgIGV4cGFuZFBhcmVudChwYXJlbnROb2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHNlYXJjaENoaWxkID0gKG46IE56VHJlZU5vZGUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSAmJiBuLnRpdGxlLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAvLyBtYXRjaCB0aGUgbm9kZVxuICAgICAgICBuLmlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubWF0Y2hlZE5vZGVMaXN0LnB1c2gobik7XG4gICAgICAgIC8vIGV4cGFuZCBwYXJlbnROb2RlXG4gICAgICAgIGV4cGFuZFBhcmVudChuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4uaXNNYXRjaGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBuLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBzZWFyY2hDaGlsZChjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucm9vdE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgc2VhcmNoQ2hpbGQoY2hpbGQpO1xuICAgIH0pO1xuICAgIC8vIGV4cGFuZCBtYXRjaGVkIGtleXNcbiAgICB0aGlzLmNhbGNFeHBhbmRlZEtleXMoZXhwYW5kZWRLZXlzLCB0aGlzLnJvb3ROb2Rlcyk7XG4gIH1cblxuICAvKipcbiAgICogZmx1c2ggYWZ0ZXIgZGVsZXRlIG5vZGVcbiAgICovXG4gIGFmdGVyUmVtb3ZlKG5vZGVzOiBOelRyZWVOb2RlW10pOiB2b2lkIHtcbiAgICAvLyB0byByZXNldCBzZWxlY3RlZE5vZGVMaXN0ICYgZXhwYW5kZWROb2RlTGlzdFxuICAgIGNvbnN0IGxvb3BOb2RlID0gKG5vZGU6IE56VHJlZU5vZGUpID0+IHtcbiAgICAgIC8vIHJlbW92ZSBzZWxlY3RlZCBub2RlXG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZUxpc3QgPSB0aGlzLnNlbGVjdGVkTm9kZUxpc3QuZmlsdGVyKG4gPT4gbi5rZXkgIT09IG5vZGUua2V5KTtcbiAgICAgIC8vIHJlbW92ZSBleHBhbmRlZCBub2RlXG4gICAgICB0aGlzLmV4cGFuZGVkTm9kZUxpc3QgPSB0aGlzLmV4cGFuZGVkTm9kZUxpc3QuZmlsdGVyKG4gPT4gbi5rZXkgIT09IG5vZGUua2V5KTtcbiAgICAgIC8vIHJlbW92ZSBjaGVja2VkIG5vZGVcbiAgICAgIHRoaXMuY2hlY2tlZE5vZGVMaXN0ID0gdGhpcy5jaGVja2VkTm9kZUxpc3QuZmlsdGVyKG4gPT4gbi5rZXkgIT09IG5vZGUua2V5KTtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgbG9vcE5vZGUoY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICBsb29wTm9kZShuKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hDaGVja1N0YXRlKHRoaXMuaXNDaGVja1N0cmljdGx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkcmFnIGV2ZW50XG4gICAqL1xuICByZWZyZXNoRHJhZ05vZGUobm9kZTogTnpUcmVlTm9kZSk6IHZvaWQge1xuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gdW50aWwgcm9vdFxuICAgICAgdGhpcy5jb25kdWN0VXAobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIHRoaXMucmVmcmVzaERyYWdOb2RlKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc2V0IG5vZGUgbGV2ZWxcbiAgcmVzZXROb2RlTGV2ZWwobm9kZTogTnpUcmVlTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTtcbiAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgbm9kZS5sZXZlbCA9IHBhcmVudE5vZGUubGV2ZWwgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmxldmVsID0gMDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLnJlc2V0Tm9kZUxldmVsKGNoaWxkKTtcbiAgICB9XG4gIH1cblxuICBjYWxjRHJvcFBvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IHsgY2xpZW50WSB9ID0gZXZlbnQ7XG4gICAgLy8gdG8gZml4IGZpcmVmb3ggdW5kZWZpbmVkXG4gICAgY29uc3QgeyB0b3AsIGJvdHRvbSwgaGVpZ2h0IH0gPSBldmVudC5zcmNFbGVtZW50XG4gICAgICA/IGV2ZW50LnNyY0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIDogKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBkZXMgPSBNYXRoLm1heChoZWlnaHQgKiB0aGlzLkRSQUdfU0lERV9SQU5HRSwgdGhpcy5EUkFHX01JTl9HQVApO1xuXG4gICAgaWYgKGNsaWVudFkgPD0gdG9wICsgZGVzKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChjbGllbnRZID49IGJvdHRvbSAtIGRlcykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogZHJvcFxuICAgKiAwOiBpbm5lciAtMTogcHJlIDE6IG5leHRcbiAgICovXG4gIGRyb3BBbmRBcHBseSh0YXJnZXROb2RlOiBOelRyZWVOb2RlLCBkcmFnUG9zOiBudW1iZXIgPSAtMSk6IHZvaWQge1xuICAgIGlmICghdGFyZ2V0Tm9kZSB8fCBkcmFnUG9zID4gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0cmVlU2VydmljZSA9IHRhcmdldE5vZGUudHJlZVNlcnZpY2U7XG4gICAgY29uc3QgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7XG4gICAgY29uc3QgaXNTZWxlY3RlZFJvb3ROb2RlID0gdGhpcy5zZWxlY3RlZE5vZGUuZ2V0UGFyZW50Tm9kZSgpO1xuICAgIC8vIHJlbW92ZSB0aGUgZHJhZ05vZGVcbiAgICBpZiAoaXNTZWxlY3RlZFJvb3ROb2RlKSB7XG4gICAgICBpc1NlbGVjdGVkUm9vdE5vZGUuY2hpbGRyZW4gPSBpc1NlbGVjdGVkUm9vdE5vZGUuY2hpbGRyZW4uZmlsdGVyKG4gPT4gbi5rZXkgIT09IHRoaXMuc2VsZWN0ZWROb2RlLmtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE5vZGVzID0gdGhpcy5yb290Tm9kZXMuZmlsdGVyKG4gPT4gbi5rZXkgIT09IHRoaXMuc2VsZWN0ZWROb2RlLmtleSk7XG4gICAgfVxuICAgIHN3aXRjaCAoZHJhZ1Bvcykge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0YXJnZXROb2RlLmFkZENoaWxkcmVuKFt0aGlzLnNlbGVjdGVkTm9kZV0pO1xuICAgICAgICB0aGlzLnJlc2V0Tm9kZUxldmVsKHRhcmdldE5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgLTE6XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGNvbnN0IHRJbmRleCA9IGRyYWdQb3MgPT09IDEgPyAxIDogMDtcbiAgICAgICAgaWYgKHRhcmdldFBhcmVudCkge1xuICAgICAgICAgIHRhcmdldFBhcmVudC5hZGRDaGlsZHJlbihbdGhpcy5zZWxlY3RlZE5vZGVdLCB0YXJnZXRQYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXROb2RlKSArIHRJbmRleCk7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlLmdldFBhcmVudE5vZGUoKTtcbiAgICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldE5vZGVMZXZlbChwYXJlbnROb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLnJvb3ROb2Rlcy5pbmRleE9mKHRhcmdldE5vZGUpICsgdEluZGV4O1xuICAgICAgICAgIC8vIMOmwqDCucOoworCgsOnwoLCucOmwo/CksOlwoXCpVxuICAgICAgICAgIHRoaXMucm9vdE5vZGVzLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgdGhpcy5zZWxlY3RlZE5vZGUpO1xuICAgICAgICAgIHRoaXMucm9vdE5vZGVzW3RhcmdldEluZGV4XS5wYXJlbnROb2RlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJvb3ROb2Rlc1t0YXJnZXRJbmRleF0ubGV2ZWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBmbHVzaCBhbGwgbm9kZXNcbiAgICB0aGlzLnJvb3ROb2Rlcy5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmICghY2hpbGQudHJlZVNlcnZpY2UpIHtcbiAgICAgICAgY2hpbGQuc2VydmljZSA9IHRyZWVTZXJ2aWNlO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoRHJhZ05vZGUoY2hpbGQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGVtaXQgU3RydWN0dXJlXG4gICAqIGV2ZW50TmFtZVxuICAgKiBub2RlXG4gICAqIGV2ZW50OiBNb3VzZUV2ZW50IC8gRHJhZ0V2ZW50XG4gICAqIGRyYWdOb2RlXG4gICAqL1xuICBmb3JtYXRFdmVudChldmVudE5hbWU6IHN0cmluZywgbm9kZTogTnpUcmVlTm9kZSB8IG51bGwsIGV2ZW50OiBNb3VzZUV2ZW50IHwgRHJhZ0V2ZW50IHwgbnVsbCk6IE56Rm9ybWF0RW1pdEV2ZW50IHtcbiAgICBjb25zdCBlbWl0U3RydWN0dXJlOiBOekZvcm1hdEVtaXRFdmVudCA9IHtcbiAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLFxuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGV2ZW50OiBldmVudFxuICAgIH07XG4gICAgc3dpdGNoIChldmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW1pdFN0cnVjdHVyZSwgeyBkcmFnTm9kZTogdGhpcy5nZXRTZWxlY3RlZE5vZGUoKSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbGljayc6XG4gICAgICBjYXNlICdkYmxjbGljayc6XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW1pdFN0cnVjdHVyZSwgeyBzZWxlY3RlZEtleXM6IHRoaXMuc2VsZWN0ZWROb2RlTGlzdCB9KTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbWl0U3RydWN0dXJlLCB7IG5vZGVzOiB0aGlzLnNlbGVjdGVkTm9kZUxpc3QgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW1pdFN0cnVjdHVyZSwgeyBrZXlzOiB0aGlzLnNlbGVjdGVkTm9kZUxpc3QubWFwKG4gPT4gbi5rZXkpIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NoZWNrJzpcbiAgICAgICAgY29uc3QgY2hlY2tlZE5vZGVMaXN0ID0gdGhpcy5nZXRDaGVja2VkTm9kZUxpc3QoKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVtaXRTdHJ1Y3R1cmUsIHsgY2hlY2tlZEtleXM6IGNoZWNrZWROb2RlTGlzdCB9KTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbWl0U3RydWN0dXJlLCB7IG5vZGVzOiBjaGVja2VkTm9kZUxpc3QgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW1pdFN0cnVjdHVyZSwgeyBrZXlzOiBjaGVja2VkTm9kZUxpc3QubWFwKG4gPT4gbi5rZXkpIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW1pdFN0cnVjdHVyZSwgeyBtYXRjaGVkS2V5czogdGhpcy5nZXRNYXRjaGVkTm9kZUxpc3QoKSB9KTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbWl0U3RydWN0dXJlLCB7IG5vZGVzOiB0aGlzLmdldE1hdGNoZWROb2RlTGlzdCgpIH0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKGVtaXRTdHJ1Y3R1cmUsIHsga2V5czogdGhpcy5nZXRNYXRjaGVkTm9kZUxpc3QoKS5tYXAobiA9PiBuLmtleSkgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXhwYW5kJzpcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbWl0U3RydWN0dXJlLCB7IG5vZGVzOiB0aGlzLmV4cGFuZGVkTm9kZUxpc3QgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZW1pdFN0cnVjdHVyZSwgeyBrZXlzOiB0aGlzLmV4cGFuZGVkTm9kZUxpc3QubWFwKG4gPT4gbi5rZXkpIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGVtaXRTdHJ1Y3R1cmU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudENoYW5nZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE56VHJlZUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9uei10cmVlLWJhc2Uuc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBOelRyZWVIaWdoZXJPcmRlclNlcnZpY2VUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOelRyZWVCYXNlU2VydmljZT4oJ056VHJlZUhpZ2hlck9yZGVyJyk7XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgTnpUcmVlTm9kZSB9IGZyb20gJy4vbnotdHJlZS1iYXNlLW5vZGUnO1xuaW1wb3J0IHsgTnpUcmVlQmFzZVNlcnZpY2UgfSBmcm9tICcuL256LXRyZWUtYmFzZS5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIE56VHJlZUJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbnpUcmVlU2VydmljZTogTnpUcmVlQmFzZVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIENvZXJjZXMgYSB2YWx1ZSh7QGxpbmsgYW55W119KSB0byBhIFRyZWVOb2Rlcyh7QGxpbmsgTnpUcmVlTm9kZVtdfSlcbiAgICovXG4gIGNvZXJjZVRyZWVOb2RlcyhcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgdmFsdWU6IGFueVtdXG4gICk6IE56VHJlZU5vZGVbXSB7XG4gICAgbGV0IG5vZGVzOiBOelRyZWVOb2RlW10gPSBbXTtcbiAgICBpZiAoIXRoaXMubnpUcmVlU2VydmljZS5pc0FycmF5T2ZOelRyZWVOb2RlKHZhbHVlKSkge1xuICAgICAgLy8gaGFzIG5vdCBiZWVuIG5ldyBOelRyZWVOb2RlXG4gICAgICBub2RlcyA9IHZhbHVlLm1hcChpdGVtID0+IG5ldyBOelRyZWVOb2RlKGl0ZW0sIG51bGwsIHRoaXMubnpUcmVlU2VydmljZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlcyA9IHZhbHVlLm1hcCgoaXRlbTogTnpUcmVlTm9kZSkgPT4ge1xuICAgICAgICBpdGVtLnNlcnZpY2UgPSB0aGlzLm56VHJlZVNlcnZpY2U7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIG5vZGVzKHtAbGluayBOelRyZWVOb2RlfSlcbiAgICovXG4gIGdldFRyZWVOb2RlcygpOiBOelRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm56VHJlZVNlcnZpY2Uucm9vdE5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB7QGxpbmsgTnpUcmVlTm9kZX0gd2l0aCBrZXlcbiAgICovXG4gIGdldFRyZWVOb2RlQnlLZXkoa2V5OiBzdHJpbmcpOiBOelRyZWVOb2RlIHwgbnVsbCB7XG4gICAgLy8gZmxhdCB0cmVlIG5vZGVzXG4gICAgY29uc3Qgbm9kZXM6IE56VHJlZU5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IGdldE5vZGUgPSAobm9kZTogTnpUcmVlTm9kZSk6IHZvaWQgPT4ge1xuICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgIG5vZGUuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG4gPT4ge1xuICAgICAgICBnZXROb2RlKG4pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLmdldFRyZWVOb2RlcygpLmZvckVhY2gobiA9PiB7XG4gICAgICBnZXROb2RlKG4pO1xuICAgIH0pO1xuICAgIHJldHVybiBub2Rlcy5maW5kKG4gPT4gbi5rZXkgPT09IGtleSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hlY2tlZCBub2RlcyhtZXJnZWQpXG4gICAqL1xuICBnZXRDaGVja2VkTm9kZUxpc3QoKTogTnpUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5uelRyZWVTZXJ2aWNlLmdldENoZWNrZWROb2RlTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBub2Rlc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWROb2RlTGlzdCgpOiBOelRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm56VHJlZVNlcnZpY2UuZ2V0U2VsZWN0ZWROb2RlTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBoYWxmIGNoZWNrZWQgbm9kZXNcbiAgICovXG4gIGdldEhhbGZDaGVja2VkTm9kZUxpc3QoKTogTnpUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5uelRyZWVTZXJ2aWNlLmdldEhhbGZDaGVja2VkTm9kZUxpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhwYW5kZWQgbm9kZXNcbiAgICovXG4gIGdldEV4cGFuZGVkTm9kZUxpc3QoKTogTnpUcmVlTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5uelRyZWVTZXJ2aWNlLmdldEV4cGFuZGVkTm9kZUxpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWF0Y2hlZCBub2RlcyhpZiBuelNlYXJjaFZhbHVlIGlzIG5vdCBudWxsKVxuICAgKi9cbiAgZ2V0TWF0Y2hlZE5vZGVMaXN0KCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubnpUcmVlU2VydmljZS5nZXRNYXRjaGVkTm9kZUxpc3QoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgTnpXYXZlUmVuZGVyZXIge1xuICBwcml2YXRlIHdhdmVUcmFuc2l0aW9uRHVyYXRpb24gPSA0MDA7XG4gIHByaXZhdGUgc3R5bGVGb3JQc2V1ZG86IEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIGV4dHJhTm9kZTogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBwcml2YXRlIGxhc3RUaW1lID0gMDtcblxuICBnZXQgd2F2ZUF0dHJpYnV0ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRFeHRyYU5vZGUgPyAnYW50LWNsaWNrLWFuaW1hdGluZycgOiAnYW50LWNsaWNrLWFuaW1hdGluZy13aXRob3V0LWV4dHJhLW5vZGUnO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsIHByaXZhdGUgaW5zZXJ0RXh0cmFOb2RlOiBib29sZWFuKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBuZXcgUGxhdGZvcm0oKTtcbiAgICBpZiAocGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLmJpbmRUcmlnZ2VyRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICBvbkNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMudHJpZ2dlckVsZW1lbnQgfHxcbiAgICAgICF0aGlzLnRyaWdnZXJFbGVtZW50LmdldEF0dHJpYnV0ZSB8fFxuICAgICAgdGhpcy50cmlnZ2VyRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHxcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUgPT09ICdJTlBVVCcgfHxcbiAgICAgIHRoaXMudHJpZ2dlckVsZW1lbnQuY2xhc3NOYW1lLmluZGV4T2YoJ2Rpc2FibGVkJykgPj0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZhZGVPdXRXYXZlKCk7XG4gIH07XG5cbiAgYmluZFRyaWdnZXJFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy50cmlnZ2VyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZVRyaWdnZXJFdmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmlnZ2VyRWxlbWVudCkge1xuICAgICAgdGhpcy50cmlnZ2VyRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGljaywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlU3R5bGVBbmRFeHRyYU5vZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3R5bGVGb3JQc2V1ZG8gJiYgZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLnN0eWxlRm9yUHNldWRvKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLnN0eWxlRm9yUHNldWRvKTtcbiAgICAgIHRoaXMuc3R5bGVGb3JQc2V1ZG8gPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnNlcnRFeHRyYU5vZGUgJiYgdGhpcy50cmlnZ2VyRWxlbWVudC5jb250YWlucyh0aGlzLmV4dHJhTm9kZSkpIHtcbiAgICAgIHRoaXMudHJpZ2dlckVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5leHRyYU5vZGUgYXMgTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVRyaWdnZXJFdmVudCgpO1xuICAgIHRoaXMucmVtb3ZlU3R5bGVBbmRFeHRyYU5vZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmFkZU91dFdhdmUoKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMudHJpZ2dlckVsZW1lbnQ7XG4gICAgY29uc3Qgd2F2ZUNvbG9yID0gdGhpcy5nZXRXYXZlQ29sb3Iobm9kZSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUodGhpcy53YXZlQXR0cmlidXRlTmFtZSwgJ3RydWUnKTtcbiAgICBpZiAoRGF0ZS5ub3coKSA8IHRoaXMubGFzdFRpbWUgKyB0aGlzLndhdmVUcmFuc2l0aW9uRHVyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1ZhbGlkQ29sb3Iod2F2ZUNvbG9yKSkge1xuICAgICAgaWYgKCF0aGlzLnN0eWxlRm9yUHNldWRvKSB7XG4gICAgICAgIHRoaXMuc3R5bGVGb3JQc2V1ZG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0eWxlRm9yUHNldWRvLmlubmVySFRNTCA9IGBbYW50LWNsaWNrLWFuaW1hdGluZy13aXRob3V0LWV4dHJhLW5vZGVdOmFmdGVyIHsgYm9yZGVyLWNvbG9yOiAke3dhdmVDb2xvcn07IH1gO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRm9yUHNldWRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbnNlcnRFeHRyYU5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5leHRyYU5vZGUpIHtcbiAgICAgICAgdGhpcy5leHRyYU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXh0cmFOb2RlLmNsYXNzTmFtZSA9ICdhbnQtY2xpY2stYW5pbWF0aW5nLW5vZGUnO1xuICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmV4dHJhTm9kZSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICB0aGlzLnJ1blRpbWVvdXRPdXRzaWRlWm9uZSgoKSA9PiB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLndhdmVBdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHRoaXMucmVtb3ZlU3R5bGVBbmRFeHRyYU5vZGUoKTtcbiAgICB9LCB0aGlzLndhdmVUcmFuc2l0aW9uRHVyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQ29sb3IoY29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNvbG9yICYmXG4gICAgICBjb2xvciAhPT0gJyNmZmZmZmYnICYmXG4gICAgICBjb2xvciAhPT0gJ3JnYigyNTUsIDI1NSwgMjU1KScgJiZcbiAgICAgIHRoaXMuaXNOb3RHcmV5KGNvbG9yKSAmJlxuICAgICAgIS9yZ2JhXFwoXFxkKiwgXFxkKiwgXFxkKiwgMFxcKS8udGVzdChjb2xvcikgJiZcbiAgICAgIGNvbG9yICE9PSAndHJhbnNwYXJlbnQnXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNOb3RHcmV5KGNvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBtYXRjaCA9IGNvbG9yLm1hdGNoKC9yZ2JhP1xcKChcXGQqKSwgKFxcZCopLCAoXFxkKikoLCBbXFwuXFxkXSopP1xcKS8pO1xuICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSAmJiBtYXRjaFsyXSAmJiBtYXRjaFszXSkge1xuICAgICAgcmV0dXJuICEobWF0Y2hbMV0gPT09IG1hdGNoWzJdICYmIG1hdGNoWzJdID09PSBtYXRjaFszXSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYXZlQ29sb3Iobm9kZTogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGVTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIG5vZGVTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLWNvbG9yJykgfHwgLy8gRmlyZWZveCBDb21wYXRpYmxlXG4gICAgICBub2RlU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLWNvbG9yJykgfHxcbiAgICAgIG5vZGVTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBydW5UaW1lb3V0T3V0c2lkZVpvbmUoZm46ICgpID0+IHZvaWQsIGRlbGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KGZuLCBkZWxheSkpO1xuICB9XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBTklNQVRJT05fTU9EVUxFX1RZUEUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgTnpXYXZlUmVuZGVyZXIgfSBmcm9tICcuL256LXdhdmUtcmVuZGVyZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIE56V2F2ZUNvbmZpZyB7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IE5aX1dBVkVfR0xPQkFMX0RFRkFVTFRfQ09ORklHOiBOeldhdmVDb25maWcgPSB7XG4gIGRpc2FibGVkOiBmYWxzZVxufTtcblxuZXhwb3J0IGNvbnN0IE5aX1dBVkVfR0xPQkFMX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOeldhdmVDb25maWc+KCduei13YXZlLWdsb2JhbC1vcHRpb25zJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6IE5aX1dBVkVfR0xPQkFMX0NPTkZJR19GQUNUT1JZXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5aX1dBVkVfR0xPQkFMX0NPTkZJR19GQUNUT1JZKCk6IE56V2F2ZUNvbmZpZyB7XG4gIHJldHVybiBOWl9XQVZFX0dMT0JBTF9ERUZBVUxUX0NPTkZJRztcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW256LXdhdmVdJyxcbiAgZXhwb3J0QXM6ICdueldhdmUnXG59KVxuZXhwb3J0IGNsYXNzIE56V2F2ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgbnpXYXZlRXh0cmFOb2RlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSB3YXZlUmVuZGVyZXI6IE56V2F2ZVJlbmRlcmVyO1xuICBwcml2YXRlIHdhdmVEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTlpfV0FWRV9HTE9CQUxfQ09ORklHKSBjb25maWc6IE56V2F2ZUNvbmZpZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSkgcHJpdmF0ZSBhbmltYXRpb25UeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnLmRpc2FibGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMud2F2ZURpc2FibGVkID0gY29uZmlnLmRpc2FibGVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbmltYXRpb25UeXBlID09PSAnTm9vcEFuaW1hdGlvbnMnKSB7XG4gICAgICB0aGlzLndhdmVEaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2F2ZVJlbmRlcmVyKSB7XG4gICAgICB0aGlzLndhdmVSZW5kZXJlci5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJXYXZlSWZFbmFibGVkKCk7XG4gIH1cblxuICByZW5kZXJXYXZlSWZFbmFibGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy53YXZlRGlzYWJsZWQgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMud2F2ZVJlbmRlcmVyID0gbmV3IE56V2F2ZVJlbmRlcmVyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLm5nWm9uZSwgdGhpcy5ueldhdmVFeHRyYU5vZGUpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IFBsYXRmb3JtTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOeldhdmVEaXJlY3RpdmUgfSBmcm9tICcuL256LXdhdmUuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1BsYXRmb3JtTW9kdWxlXSxcbiAgZXhwb3J0czogW056V2F2ZURpcmVjdGl2ZV0sXG4gIGRlY2xhcmF0aW9uczogW056V2F2ZURpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgTnpXYXZlTW9kdWxlIHt9XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWVyZ2UsIEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBOekRpcmVjdGlvblZISVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOek1lbnVCYXNlU2VydmljZSB7XG4gIGlzSW5Ecm9wRG93bjogYm9vbGVhbjtcbiAgbWVudUl0ZW1DbGljayQgPSBuZXcgU3ViamVjdDxhbnk+KCk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmUgbm8tYW55XG4gIHRoZW1lJCA9IG5ldyBTdWJqZWN0KCk7XG4gIG1vZGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOekRpcmVjdGlvblZISVR5cGU+KCd2ZXJ0aWNhbCcpO1xuICBpbmxpbmVJbmRlbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDI0KTtcbiAgY2hlY2skID0gbWVyZ2UodGhpcy50aGVtZSQsIHRoaXMubW9kZSQsIHRoaXMuaW5saW5lSW5kZW50JCk7XG4gIHRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnID0gJ2xpZ2h0JztcbiAgbW9kZTogTnpEaXJlY3Rpb25WSElUeXBlID0gJ3ZlcnRpY2FsJztcbiAgaW5saW5lSW5kZW50ID0gMjQ7XG4gIG1lbnVPcGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgb25NZW51SXRlbUNsaWNrKG1lbnU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubWVudUl0ZW1DbGljayQubmV4dChtZW51KTtcbiAgfVxuXG4gIHNldE1vZGUobW9kZTogTnpEaXJlY3Rpb25WSElUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLm1vZGUkLm5leHQobW9kZSk7XG4gIH1cblxuICBzZXRUaGVtZSh0aGVtZTogJ2xpZ2h0JyB8ICdkYXJrJyk6IHZvaWQge1xuICAgIHRoaXMudGhlbWUgPSB0aGVtZTtcbiAgICB0aGlzLnRoZW1lJC5uZXh0KHRoZW1lKTtcbiAgfVxuXG4gIHNldElubGluZUluZGVudChpbmRlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaW5saW5lSW5kZW50ID0gaW5kZW50O1xuICAgIHRoaXMuaW5saW5lSW5kZW50JC5uZXh0KGluZGVudCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOek1lbnVCYXNlU2VydmljZSB9IGZyb20gJy4vbnotbWVudS1iYXNlLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgTnpEcm9wZG93bkhpZ2hlck9yZGVyU2VydmljZVRva2VuID0gbmV3IEluamVjdGlvblRva2VuPE56TWVudUJhc2VTZXJ2aWNlPignTnpUcmVlSGlnaGVyT3JkZXInKTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCwgUHJvdmlkZXIsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBOWl9MT0dHRVJfU1RBVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW48Ym9vbGVhbj4oJ256LWxvZ2dlci1zdGF0ZScpOyAvLyBXaGV0aGVyIHByaW50IHRoZSBsb2dcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5aX0xPR0dFUl9TVEFURSkgcHJpdmF0ZSBfbG9nZ2VyU3RhdGU6IGJvb2xlYW4pIHt9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBsb2coLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nZ2VyU3RhdGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgd2FybiguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dnZXJTdGF0ZSkge1xuICAgICAgY29uc29sZS53YXJuKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgZXJyb3IoLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9nZ2VyU3RhdGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBpbmZvKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ2dlclN0YXRlKSB7XG4gICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGRlYnVnKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ2dlclN0YXRlKSB7XG4gICAgICBjb25zb2xlLmxvZygnW05HLVpPUlJPLURFQlVHXScsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTE9HR0VSX1NFUlZJQ0VfUFJPVklERVJfRkFDVE9SWShleGlzdDogTG9nZ2VyU2VydmljZSwgbG9nZ2VyU3RhdGU6IGJvb2xlYW4pOiBMb2dnZXJTZXJ2aWNlIHtcbiAgcmV0dXJuIGV4aXN0IHx8IG5ldyBMb2dnZXJTZXJ2aWNlKGxvZ2dlclN0YXRlKTtcbn1cblxuZXhwb3J0IGNvbnN0IExPR0dFUl9TRVJWSUNFX1BST1ZJREVSOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTG9nZ2VyU2VydmljZSxcbiAgdXNlRmFjdG9yeTogTE9HR0VSX1NFUlZJQ0VfUFJPVklERVJfRkFDVE9SWSxcbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIExvZ2dlclNlcnZpY2VdLCBOWl9MT0dHRVJfU1RBVEVdXG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IExPR0dFUl9TRVJWSUNFX1BST1ZJREVSLCBOWl9MT0dHRVJfU1RBVEUgfSBmcm9tICcuL2xvZ2dlci5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOWl9MT0dHRVJfU1RBVEUsIHVzZVZhbHVlOiBmYWxzZSB9LCBMT0dHRVJfU0VSVklDRV9QUk9WSURFUl1cbn0pXG5leHBvcnQgY2xhc3MgTG9nZ2VyTW9kdWxlIHt9XG4iXSwibmFtZXMiOlsiRGlyZWN0aXZlIiwiRWxlbWVudFJlZiIsIlJlbmRlcmVyMiIsIklucHV0IiwiVGVtcGxhdGVSZWYiLCJWaWV3Q29udGFpbmVyUmVmIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiLCJ0cmlnZ2VyIiwic3RhdGUiLCJzdHlsZSIsInRyYW5zaXRpb24iLCJhbmltYXRlIiwiY29lcmNlQm9vbGVhblByb3BlcnR5IiwiX2lzTnVtYmVyVmFsdWUiLCJjb2VyY2VDc3NQaXhlbFZhbHVlIiwiY29lcmNlRWxlbWVudCIsIk9wdGlvbmFsIiwiSW5qZWN0IiwiQU5JTUFUSU9OX01PRFVMRV9UWVBFIiwidHNsaWJfMS5fX2RlY29yYXRlIiwiQ2RrQ29ubmVjdGVkT3ZlcmxheSIsIkNvbm5lY3Rpb25Qb3NpdGlvblBhaXIiLCJJbmplY3RhYmxlIiwiRE9DVU1FTlQiLCJTa2lwU2VsZiIsIlR5cGUiLCJSZW5kZXJlckZhY3RvcnkyIiwidHNsaWJfMS5fX2V4dGVuZHMiLCJFdmVudEVtaXR0ZXIiLCJOZ1pvbmUiLCJTdWJqZWN0IiwidHNsaWJfMS5fX3ZhbHVlcyIsIkluamVjdGlvblRva2VuIiwicGxhdGZvcm0iLCJQbGF0Zm9ybSIsIlBsYXRmb3JtTW9kdWxlIiwiQmVoYXZpb3JTdWJqZWN0IiwibWVyZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBNEJFLGlDQUFvQixVQUFzQixFQUFVLFFBQW1CO1lBQW5ELGVBQVUsR0FBVixVQUFVLENBQVk7WUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1lBYnZFLGNBQVMsR0FBYSxFQUFFLENBQUM7U0Fha0Q7UUFYM0Usc0JBQ0ksbURBQWM7Ozs7Z0JBRGxCLFVBQ21CLElBQWM7Z0JBRGpDLGlCQVNDO2dCQVBDLElBQUksQ0FBQyxT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LHlCQUFjOztnQkFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyQixPQUFPLENBQUMsS0FBSyxPQUFiLE9BQU8sV0FBVSxJQUFJLEdBQUU7aUJBQ3hCO2FBQ0Y7Ozs7Ozs7UUFHRCw0QkFBSTs7Ozs7O1lBQUo7Z0JBQUssY0FBYztxQkFBZCxVQUFjLEVBQWQscUJBQWMsRUFBZCxJQUFjO29CQUFkLHlCQUFjOztnQkFDakIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyQixPQUFPLENBQUMsR0FBRyxPQUFYLE9BQU8sV0FBUSxJQUFJLEdBQUU7aUJBQ3RCO2FBQ0Y7Ozs7Ozs7UUFHRCw2QkFBSzs7Ozs7O1lBQUw7Z0JBQU0sY0FBYztxQkFBZCxVQUFjLEVBQWQscUJBQWMsRUFBZCxJQUFjO29CQUFkLHlCQUFjOztnQkFDbEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyQixPQUFPLENBQUMsR0FBRyxPQUFYLE9BQU8sWUFBSyxrQkFBa0IsR0FBSyxJQUFJLEdBQUU7aUJBQzFDO2FBQ0Y7O29CQXJDRlYsYUFBVTs7Ozs7c0RBRUlMLFNBQU0sU0FBQyxlQUFlOzs7UUFvQ3JDLG9CQUFDO0tBdENELElBc0NDOzs7Ozs7QUFFRCxhQUFnQiwrQkFBK0IsQ0FBQyxLQUFvQixFQUFFLFdBQW9CO1FBQ3hGLE9BQU8sS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7O0FBRUQsUUFBYSx1QkFBdUIsR0FBYTtRQUMvQyxPQUFPLEVBQUUsYUFBYTtRQUN0QixVQUFVLEVBQUUsK0JBQStCO1FBQzNDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSUQsV0FBUSxFQUFFLEVBQUUsSUFBSVEsV0FBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUUsZUFBZSxDQUFDO0tBQ3pFOzs7Ozs7O1FDaEREO1NBRzRCOztvQkFIM0JuQixXQUFRLFNBQUM7d0JBQ1IsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQztxQkFDcEY7O1FBQzBCLG1CQUFDO0tBSDVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0=